Modularise dom.js

This commit is contained in:
Oliver Hamlet
2016-01-06 18:27:04 +00:00
parent 485490b057
commit 392b68eea4
3 changed files with 107 additions and 99 deletions
+84 -77
View File
@@ -1,85 +1,92 @@
'use strict';
function showElement(element) {
if (element !== null) {
element.classList.toggle('hidden', false);
(function exportModule(root, factory) {
if (typeof define === 'function' && define.amd) {
// AMD. Register as an anonymous module.
define([], factory);
} else {
// Browser globals
root.loot = root.loot || {};
root.loot.dom = factory();
}
}
function getElementInTableRowTemplate(rowTemplateId, elementClass) {
const select = document.querySelector('link[rel="import"][href$="editable-table.html"]');
if (select) {
return select.import.querySelector('#' + rowTemplateId).content.querySelector('.' + elementClass);
}
return document.querySelector('#' + rowTemplateId).content.querySelector('.' + elementClass);
}
function hideElement(element) {
if (element !== null) {
element.classList.toggle('hidden', true);
}
}
/* Call whenever game is changed or game menu / game table are rewritten. */
function updateSelectedGame(gameFolder) {
document.getElementById('gameMenu').value = gameFolder;
/* Also disable deletion of the game's row in the settings dialog. */
const table = document.getElementById('gameTable');
for (let i = 0; i < table.tBodies[0].rows.length; ++i) {
if (table.tBodies[0].rows[i].getElementsByClassName('folder').length > 0) {
if (table.tBodies[0].rows[i].getElementsByClassName('folder')[0].value === gameFolder) {
table.setReadOnly(table.tBodies[0].rows[i], ['delete']);
} else {
table.setReadOnly(table.tBodies[0].rows[i], ['delete'], false);
}(this, () => {
return {
getElementInTableRowTemplate(rowTemplateId, elementClass) {
const select = document.querySelector('link[rel="import"][href$="editable-table.html"]');
if (select) {
return select.import.querySelector('#' + rowTemplateId).content.querySelector('.' + elementClass);
}
}
}
}
/* Call whenever installedGames is changed or game menu is rewritten. */
function updateEnabledGames(installedGames) {
/* Update the disabled games in the game menu. */
const gameMenuItems = document.getElementById('gameMenu').children;
for (let i = 0; i < gameMenuItems.length; ++i) {
if (installedGames.indexOf(gameMenuItems[i].getAttribute('value')) === -1) {
gameMenuItems[i].setAttribute('disabled', true);
gameMenuItems[i].removeEventListener('click', onChangeGame);
} else {
gameMenuItems[i].removeAttribute('disabled');
gameMenuItems[i].addEventListener('click', onChangeGame);
}
}
}
/* Call whenever settings are changed. */
function updateSettingsDialog(settings, installedGames, gameFolder) {
const gameSelect = document.getElementById('defaultGameSelect');
const gameMenu = document.getElementById('gameMenu');
const gameTable = document.getElementById('gameTable');
return document.querySelector('#' + rowTemplateId).content.querySelector('.' + elementClass);
},
/* First make sure game listing elements don't have any existing entries. */
while (gameSelect.children.length > 1) {
gameSelect.removeChild(gameSelect.lastElementChild);
}
while (gameMenu.firstElementChild) {
gameMenu.firstElementChild.removeEventListener('click', onChangeGame);
gameMenu.removeChild(gameMenu.firstElementChild);
}
gameTable.clear();
show(elementId) {
document.getElementById(elementId).classList.toggle('hidden', false);
},
/* Now fill with new values. */
settings.games.forEach((game) => {
const menuItem = document.createElement('paper-item');
menuItem.setAttribute('value', game.folder);
menuItem.setAttribute('noink', '');
menuItem.textContent = game.name;
gameMenu.appendChild(menuItem);
gameSelect.appendChild(menuItem.cloneNode(true));
hide(elementId) {
document.getElementById(elementId).classList.toggle('hidden', true);
},
const row = gameTable.addRow(game);
gameTable.setReadOnly(row, ['name', 'folder', 'type']);
});
updateSelectedGame(gameFolder) {
document.getElementById('gameMenu').value = gameFolder;
gameSelect.value = settings.game;
document.getElementById('languageSelect').value = settings.language;
document.getElementById('enableDebugLogging').checked = settings.enableDebugLogging;
document.getElementById('updateMasterlist').checked = settings.updateMasterlist;
/* Also disable deletion of the game's row in the settings dialog. */
const table = document.getElementById('gameTable');
for (let i = 0; i < table.tBodies[0].rows.length; ++i) {
const folderElements = table.tBodies[0].rows[i].getElementsByClassName('folder');
if (folderElements.length === 1) {
table.setReadOnly(table.tBodies[0].rows[i], ['delete'], folderElements[0].value === gameFolder);
}
}
},
updateEnabledGames(installedGames);
updateSelectedGame(gameFolder);
}
updateEnabledGames(installedGames) {
const gameMenuItems = document.getElementById('gameMenu').children;
for (let i = 0; i < gameMenuItems.length; ++i) {
if (installedGames.indexOf(gameMenuItems[i].getAttribute('value')) === -1) {
gameMenuItems[i].setAttribute('disabled', true);
gameMenuItems[i].removeEventListener('click', onChangeGame);
} else {
gameMenuItems[i].removeAttribute('disabled');
gameMenuItems[i].addEventListener('click', onChangeGame);
}
}
},
updateSettingsDialog(settings, installedGames, gameFolder) {
const gameSelect = document.getElementById('defaultGameSelect');
const gameMenu = document.getElementById('gameMenu');
const gameTable = document.getElementById('gameTable');
/* First make sure game listing elements don't have any existing entries. */
while (gameSelect.children.length > 1) {
gameSelect.removeChild(gameSelect.lastElementChild);
}
while (gameMenu.firstElementChild) {
gameMenu.firstElementChild.removeEventListener('click', onChangeGame);
gameMenu.removeChild(gameMenu.firstElementChild);
}
gameTable.clear();
/* Now fill with new values. */
settings.games.forEach((game) => {
const menuItem = document.createElement('paper-item');
menuItem.setAttribute('value', game.folder);
menuItem.setAttribute('noink', '');
menuItem.textContent = game.name;
gameMenu.appendChild(menuItem);
gameSelect.appendChild(menuItem.cloneNode(true));
const row = gameTable.addRow(game);
gameTable.setReadOnly(row, ['name', 'folder', 'type']);
});
gameSelect.value = settings.game;
document.getElementById('languageSelect').value = settings.language;
document.getElementById('enableDebugLogging').checked = settings.enableDebugLogging;
document.getElementById('updateMasterlist').checked = settings.updateMasterlist;
this.updateEnabledGames(installedGames);
this.updateSelectedGame(gameFolder);
},
};
}));
+16 -16
View File
@@ -47,7 +47,7 @@ function onGameMasterlistChange(evt) {
document.getElementById('masterlistDate').textContent = evt.detail.date;
}
function onGameFolderChange(evt) {
updateSelectedGame(evt.detail.folder);
loot.dom.updateSelectedGame(evt.detail.folder);
/* Enable/disable the redate plugins option. */
let index = undefined;
if (loot.settings && loot.settings.games) {
@@ -239,10 +239,10 @@ function onSortPlugins() {
/* Now hide the masterlist update buttons, and display the accept and
cancel sort buttons. */
hideElement(document.getElementById('updateMasterlistButton'));
hideElement(document.getElementById('sortButton'));
showElement(document.getElementById('applySortButton'));
showElement(document.getElementById('cancelSortButton'));
loot.dom.hide('updateMasterlistButton');
loot.dom.hide('sortButton');
loot.dom.show('applySortButton');
loot.dom.show('cancelSortButton');
/* Disable changing game. */
document.getElementById('gameMenu').setAttribute('disabled', '');
@@ -261,10 +261,10 @@ function onApplySort() {
/* Now show the masterlist update buttons, and hide the accept and
cancel sort buttons. */
showElement(document.getElementById('updateMasterlistButton'));
showElement(document.getElementById('sortButton'));
hideElement(document.getElementById('applySortButton'));
hideElement(document.getElementById('cancelSortButton'));
loot.dom.show('updateMasterlistButton');
loot.dom.show('sortButton');
loot.dom.hide('applySortButton');
loot.dom.hide('cancelSortButton');
/* Enable changing game. */
document.getElementById('gameMenu').removeAttribute('disabled');
@@ -280,10 +280,10 @@ function onCancelSort(evt) {
/* Now show the masterlist update buttons, and hide the accept and
cancel sort buttons. */
showElement(document.getElementById('updateMasterlistButton'));
showElement(document.getElementById('sortButton'));
hideElement(document.getElementById('applySortButton'));
hideElement(document.getElementById('cancelSortButton'));
loot.dom.show('updateMasterlistButton');
loot.dom.show('sortButton');
loot.dom.hide('applySortButton');
loot.dom.hide('cancelSortButton');
/* Enable changing game. */
document.getElementById('gameMenu').removeAttribute('disabled');
@@ -434,14 +434,14 @@ function onCloseSettingsDialog(evt) {
/* Send the settings back to the C++ side. */
loot.query('closeSettings', settings).then(JSON.parse).then((installedGames) => {
loot.installedGames = installedGames;
updateEnabledGames(installedGames);
loot.dom.updateEnabledGames(installedGames);
}).catch(handlePromiseError).then(() => {
loot.settings = settings;
updateSettingsDialog(loot.settings, loot.installedGames, loot.game.folder);
loot.dom.updateSettingsDialog(loot.settings, loot.installedGames, loot.game.folder);
}).catch(handlePromiseError);
} else {
/* Re-apply the existing settings to the settings dialog elements. */
updateSettingsDialog(loot.settings, loot.installedGames, loot.game.folder);
loot.dom.updateSettingsDialog(loot.settings, loot.installedGames, loot.game.folder);
}
evt.target.parentElement.close();
}
+7 -6
View File
@@ -30,6 +30,7 @@
// Browser globals
root.loot = root.loot || {};
root.loot.initialise = factory(root.loot.Dialog,
root.loot.dom,
root.loot.Filters,
root.loot.Game,
root.loot.translateStaticText,
@@ -37,7 +38,7 @@
root.loot.query,
root.loot.Translator);
}
}(this, (Dialog, Filters, Game, translateStaticText, Plugin, query, Translator) => {
}(this, (Dialog, dom, Filters, Game, translateStaticText, Plugin, query, Translator) => {
function setupEventHandlers() {
/* Set up handlers for filters. */
document.getElementById('hideVersionNumbers').addEventListener('change', onToggleDisplayCSS);
@@ -152,7 +153,7 @@
return query('getLanguages').then(JSON.parse).then((result) => {
/* Now fill in language options. */
const settingsLangSelect = document.getElementById('languageSelect');
const messageLangSelect = getElementInTableRowTemplate('messageRow', 'language');
const messageLangSelect = dom.getElementInTableRowTemplate('messageRow', 'language');
result.forEach((language) => {
const settingsItem = document.createElement('paper-item');
@@ -193,7 +194,7 @@
function setGameTypes() {
return query('getGameTypes').then(JSON.parse).then((result) => {
/* Fill in game row template's game type options. */
const select = getElementInTableRowTemplate('gameRow', 'type');
const select = dom.getElementInTableRowTemplate('gameRow', 'type');
result.forEach((gameType) => {
const item = document.createElement('paper-item');
item.setAttribute('value', gameType);
@@ -208,14 +209,14 @@
function setInstalledGames(appData) {
return query('getInstalledGames').then(JSON.parse).then((installedGames) => {
appData.installedGames = installedGames;
updateEnabledGames(installedGames);
dom.updateEnabledGames(installedGames);
});
}
function setSettings(appData) {
return query('getSettings').then(JSON.parse).then((result) => {
appData.settings = result;
updateSettingsDialog(appData.settings, appData.installedGames, appData.game.folder);
dom.updateSettingsDialog(appData.settings, appData.installedGames, appData.game.folder);
});
}
@@ -263,7 +264,7 @@
loot.filters = new Filters(loot.l10n);
translateStaticText(loot.l10n);
/* Also need to update the settings UI. */
updateSettingsDialog(loot.settings, loot.installedGames, loot.game.folder);
dom.updateSettingsDialog(loot.settings, loot.installedGames, loot.game.folder);
}).then(() => {
return displayInitErrors();
}).then((result) => {