Dictionary controller updates (#939)
* Check if element exists * Add delete function * Add support for deleting via popup menu * Update how count visibility is updated * Update dictionary deletion progress updates * Update storage stats after dictionary deletion
This commit is contained in:
parent
3e3c080a43
commit
8bf42fa69e
@ -49,6 +49,7 @@ class DictionaryEntry {
|
|||||||
const allowSecondarySearchesCheckbox = node.querySelector('.dictionary-allow-secondary-searches');
|
const allowSecondarySearchesCheckbox = node.querySelector('.dictionary-allow-secondary-searches');
|
||||||
const priorityInput = node.querySelector('.dictionary-priority');
|
const priorityInput = node.querySelector('.dictionary-priority');
|
||||||
const deleteButton = node.querySelector('.dictionary-delete-button');
|
const deleteButton = node.querySelector('.dictionary-delete-button');
|
||||||
|
const menuButton = node.querySelector('.dictionary-menu-button');
|
||||||
const detailsTable = node.querySelector('.dictionary-details-table');
|
const detailsTable = node.querySelector('.dictionary-details-table');
|
||||||
const detailsToggleLink = node.querySelector('.dictionary-details-toggle-link');
|
const detailsToggleLink = node.querySelector('.dictionary-details-toggle-link');
|
||||||
const outdatedContainer = node.querySelector('.dictionary-outdated-notification');
|
const outdatedContainer = node.querySelector('.dictionary-outdated-notification');
|
||||||
@ -69,8 +70,15 @@ class DictionaryEntry {
|
|||||||
allowSecondarySearchesCheckbox.dataset.setting = ObjectPropertyAccessor.getPathString(['dictionaries', title, 'allowSecondarySearches']);
|
allowSecondarySearchesCheckbox.dataset.setting = ObjectPropertyAccessor.getPathString(['dictionaries', title, 'allowSecondarySearches']);
|
||||||
priorityInput.dataset.setting = ObjectPropertyAccessor.getPathString(['dictionaries', title, 'priority']);
|
priorityInput.dataset.setting = ObjectPropertyAccessor.getPathString(['dictionaries', title, 'priority']);
|
||||||
|
|
||||||
|
if (deleteButton !== null) {
|
||||||
this._eventListeners.addEventListener(deleteButton, 'click', this._onDeleteButtonClicked.bind(this), false);
|
this._eventListeners.addEventListener(deleteButton, 'click', this._onDeleteButtonClicked.bind(this), false);
|
||||||
|
}
|
||||||
|
if (menuButton !== null) {
|
||||||
|
this._eventListeners.addEventListener(menuButton, 'menuClosed', this._onMenuClosed.bind(this), false);
|
||||||
|
}
|
||||||
|
if (this._detailsContainer !== null) {
|
||||||
this._eventListeners.addEventListener(detailsToggleLink, 'click', this._onDetailsToggleLinkClicked.bind(this), false);
|
this._eventListeners.addEventListener(detailsToggleLink, 'click', this._onDetailsToggleLinkClicked.bind(this), false);
|
||||||
|
}
|
||||||
this._eventListeners.addEventListener(priorityInput, 'settingChanged', this._onPriorityChanged.bind(this), false);
|
this._eventListeners.addEventListener(priorityInput, 'settingChanged', this._onPriorityChanged.bind(this), false);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -86,13 +94,25 @@ class DictionaryEntry {
|
|||||||
const node = this._node.querySelector('.dictionary-counts');
|
const node = this._node.querySelector('.dictionary-counts');
|
||||||
node.textContent = JSON.stringify({info: this._dictionaryInfo, counts}, null, 4);
|
node.textContent = JSON.stringify({info: this._dictionaryInfo, counts}, null, 4);
|
||||||
node.hidden = false;
|
node.hidden = false;
|
||||||
|
|
||||||
|
const show = this._node.querySelector('.dictionary-details-toggle-link');
|
||||||
|
if (show !== null) { show.hidden = false; }
|
||||||
}
|
}
|
||||||
|
|
||||||
// Private
|
// Private
|
||||||
|
|
||||||
_onDeleteButtonClicked(e) {
|
_onDeleteButtonClicked(e) {
|
||||||
e.preventDefault();
|
e.preventDefault();
|
||||||
this._dictionaryController.deleteDictionary(this.dictionaryTitle);
|
this._delete();
|
||||||
|
}
|
||||||
|
|
||||||
|
_onMenuClosed(e) {
|
||||||
|
const {detail: {action}} = e;
|
||||||
|
switch (action) {
|
||||||
|
case 'remove':
|
||||||
|
this._delete();
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_onDetailsToggleLinkClicked(e) {
|
_onDetailsToggleLinkClicked(e) {
|
||||||
@ -132,12 +152,18 @@ class DictionaryEntry {
|
|||||||
detailsTable.appendChild(fragment);
|
detailsTable.appendChild(fragment);
|
||||||
return any;
|
return any;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_delete() {
|
||||||
|
this._dictionaryController.deleteDictionary(this.dictionaryTitle);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class DictionaryController {
|
class DictionaryController {
|
||||||
constructor(settingsController, modalController) {
|
constructor(settingsController, modalController, storageController, statusFooter=null) {
|
||||||
this._settingsController = settingsController;
|
this._settingsController = settingsController;
|
||||||
this._modalController = modalController;
|
this._modalController = modalController;
|
||||||
|
this._storageController = storageController;
|
||||||
|
this._statusFooter = statusFooter;
|
||||||
this._dictionaries = null;
|
this._dictionaries = null;
|
||||||
this._dictionaryEntries = [];
|
this._dictionaryEntries = [];
|
||||||
this._databaseStateToken = null;
|
this._databaseStateToken = null;
|
||||||
@ -327,33 +353,53 @@ class DictionaryController {
|
|||||||
const index = this._dictionaryEntries.findIndex((entry) => entry.dictionaryTitle === dictionaryTitle);
|
const index = this._dictionaryEntries.findIndex((entry) => entry.dictionaryTitle === dictionaryTitle);
|
||||||
if (index < 0) { return; }
|
if (index < 0) { return; }
|
||||||
|
|
||||||
const entry = this._dictionaryEntries[index];
|
const storageController = this._storageController;
|
||||||
const node = entry.node;
|
const statusFooter = this._statusFooter;
|
||||||
const progress = node.querySelector('.progress-container');
|
const {node} = this._dictionaryEntries[index];
|
||||||
const progressBar = node.querySelector('.progress-bar');
|
const progressSelector = '.dictionary-delete-progress';
|
||||||
|
const progressContainers = [
|
||||||
|
...node.querySelectorAll('.progress-container'),
|
||||||
|
...document.querySelectorAll(`#dictionaries ${progressSelector}`)
|
||||||
|
];
|
||||||
|
const progressBars = [
|
||||||
|
...node.querySelectorAll('.progress-bar'),
|
||||||
|
...document.querySelectorAll(`${progressSelector} .progress-bar`)
|
||||||
|
];
|
||||||
|
const infoLabels = document.querySelectorAll(`${progressSelector} .progress-info`);
|
||||||
|
const statusLabels = document.querySelectorAll(`${progressSelector} .progress-status`);
|
||||||
const prevention = this._settingsController.preventPageExit();
|
const prevention = this._settingsController.preventPageExit();
|
||||||
try {
|
try {
|
||||||
this._isDeleting = true;
|
this._isDeleting = true;
|
||||||
this._setButtonsEnabled(false);
|
this._setButtonsEnabled(false);
|
||||||
|
|
||||||
progress.hidden = false;
|
|
||||||
|
|
||||||
const onProgress = ({processed, count, storeCount, storesProcesed}) => {
|
const onProgress = ({processed, count, storeCount, storesProcesed}) => {
|
||||||
let percent = 0.0;
|
const percent = (
|
||||||
if (count > 0 && storesProcesed > 0) {
|
(count > 0 && storesProcesed > 0) ?
|
||||||
percent = (processed / count) * (storesProcesed / storeCount) * 100.0;
|
(processed / count) * (storesProcesed / storeCount) * 100.0 :
|
||||||
}
|
0.0
|
||||||
progressBar.style.width = `${percent}%`;
|
);
|
||||||
|
const cssString = `${percent}%`;
|
||||||
|
const statusString = `${percent.toFixed(0)}%`;
|
||||||
|
for (const progressBar of progressBars) { progressBar.style.width = cssString; }
|
||||||
|
for (const label of statusLabels) { label.textContent = statusString; }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
onProgress({processed: 0, count: 1, storeCount: 1, storesProcesed: 0});
|
||||||
|
|
||||||
|
for (const progress of progressContainers) { progress.hidden = false; }
|
||||||
|
for (const label of infoLabels) { label.textContent = 'Deleting dictionary...'; }
|
||||||
|
if (statusFooter !== null) { statusFooter.setTaskActive(progressSelector, true); }
|
||||||
|
|
||||||
await this._deleteDictionaryInternal(dictionaryTitle, onProgress);
|
await this._deleteDictionaryInternal(dictionaryTitle, onProgress);
|
||||||
await this._deleteDictionarySettings(dictionaryTitle);
|
await this._deleteDictionarySettings(dictionaryTitle);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
yomichan.logError(e);
|
yomichan.logError(e);
|
||||||
} finally {
|
} finally {
|
||||||
prevention.end();
|
prevention.end();
|
||||||
progress.hidden = true;
|
for (const progress of progressContainers) { progress.hidden = true; }
|
||||||
|
if (statusFooter !== null) { statusFooter.setTaskActive(progressSelector, false); }
|
||||||
this._setButtonsEnabled(true);
|
this._setButtonsEnabled(true);
|
||||||
|
storageController.updateStats();
|
||||||
this._isDeleting = false;
|
this._isDeleting = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -83,7 +83,7 @@ async function setupEnvironmentInfo() {
|
|||||||
const profileController = new ProfileController(settingsController, modalController);
|
const profileController = new ProfileController(settingsController, modalController);
|
||||||
profileController.prepare();
|
profileController.prepare();
|
||||||
|
|
||||||
const dictionaryController = new DictionaryController(settingsController, modalController);
|
const dictionaryController = new DictionaryController(settingsController, modalController, storageController);
|
||||||
dictionaryController.prepare();
|
dictionaryController.prepare();
|
||||||
|
|
||||||
const dictionaryImportController = new DictionaryImportController(settingsController, modalController, storageController);
|
const dictionaryImportController = new DictionaryImportController(settingsController, modalController, storageController);
|
||||||
|
Loading…
Reference in New Issue
Block a user