diff --git a/src/config.ts b/src/config.ts index fcc1400..8b5e04b 100644 --- a/src/config.ts +++ b/src/config.ts @@ -261,6 +261,11 @@ const store = { }) }; +export const defaultStoreData = { + maxPageSleep: browser.maxSleep, + minPageSleep: browser.minSleep +}; + export const config = { browser, docker, diff --git a/src/store/model/index.ts b/src/store/model/index.ts index f24653f..db503b9 100644 --- a/src/store/model/index.ts +++ b/src/store/model/index.ts @@ -1,3 +1,4 @@ +import {config, defaultStoreData} from '../../config'; import {Adorama} from './adorama'; import {Alternate} from './alternate'; import {AlternateNL} from './alternate-nl'; @@ -44,6 +45,7 @@ import {Saturn} from './saturn'; import {Scan} from './scan'; import {Very} from './very'; import {Zotac} from './zotac'; +import {logger} from '../../logger'; export const storeList = new Map([ [Adorama.name, Adorama], @@ -97,12 +99,31 @@ export const storeList = new Map([ const brands = new Set(); const series = new Set(); const models = new Set(); + +for (const storeData of config.store.stores) { + const store = storeList.get(storeData.name); + if (store) { + store.minPageSleep = storeData.minPageSleep; + store.maxPageSleep = storeData.maxPageSleep; + } else { + logger.warn(`No store named ${storeData.name}, skipping.`); + } +} + for (const store of storeList.values()) { for (const link of store.links) { brands.add(link.brand); series.add(link.series); models.add(link.model); } + + if (store.minPageSleep === undefined) { + store.minPageSleep = defaultStoreData.minPageSleep; + } + + if (store.maxPageSleep === undefined) { + store.maxPageSleep = defaultStoreData.maxPageSleep; + } } export function getAllBrands() { @@ -117,4 +138,22 @@ export function getAllModels() { return Array.from(models); } +if (config.store.stores.length > 0) { + logger.info(`ℹ selected stores: ${config.store.stores.map(store => store.name).join(', ')}`); +} + +if (config.store.showOnlyBrands.length > 0) { + logger.info(`ℹ selected brands: ${config.store.showOnlyBrands.join(', ')}`); +} + +if (config.store.showOnlyModels.length > 0) { + logger.info(`ℹ selected models: ${config.store.showOnlyModels.map(entry => { + return entry.series ? entry.name + ' (' + entry.series + ')' : entry.name; + }).join(', ')}`); +} + +if (config.store.showOnlySeries.length > 0) { + logger.info(`ℹ selected series: ${config.store.showOnlySeries.join(', ')}`); +} + export * from './store'; diff --git a/web/index.html b/web/index.html index d40f94d..4ba1b5b 100644 --- a/web/index.html +++ b/web/index.html @@ -9,6 +9,29 @@ let series; let models; + function renderListSubfield(id, elements, selectionArray, subfield) { + const list = document.getElementById(id); + list.innerHTML = ''; + for (const element of elements) { + const name = `${id}_${element}`; + const htmlElement = document.createElement('input'); + htmlElement.type = 'checkbox'; + htmlElement.value = element; + htmlElement.innerHTML = element; + htmlElement.name = name; + htmlElement.id = name; + if (selectionArray.length === 0 || selectionArray.find(obj => element === obj[subfield])) { + htmlElement.checked = true; + } + list.appendChild(htmlElement); + const htmlLabelElement = document.createElement('label'); + htmlLabelElement.for = name; + htmlLabelElement.innerText = element; + list.appendChild(htmlLabelElement); + list.appendChild(document.createElement('br')); + } + } + function renderList(id, elements, selectionArray) { const list = document.getElementById(id); list.innerHTML = ''; @@ -50,13 +73,33 @@ return resArray; } + function listToArraySubfield(id, selectionArray, subfield) { + const list = document.getElementById(id); + const resArray = []; + let allSelected = true; + for (const htmlElement of list.childNodes) { + if (htmlElement.checked) { + const obj = {}; + obj[subfield] = htmlElement.value; + resArray.push(obj); + } else { + allSelected = false; + } + } + + if (allSelected) { + return []; + } + return resArray; + } + async function onReceiveConfig(resp) { config = await resp.json(); - renderList('storeList', stores, config.store.stores); + renderListSubfield('storeList', stores, config.store.stores, 'name'); renderList('brandList', brands, config.store.showOnlyBrands); renderList('seriesList', series, config.store.showOnlySeries); - renderList('modelList', models, config.store.showOnlyModels); + renderListSubfield('modelList', models, config.store.showOnlyModels, 'name'); } async function setConfig() { @@ -64,10 +107,10 @@ throw new Error('Config not loaded yet'); } - config.store.stores = listToArray('storeList'); + config.store.stores = listToArraySubfield('storeList', 'name'); config.store.showOnlyBrands = listToArray('brandList'); config.store.showOnlySeries = listToArray('seriesList'); - config.store.showOnlyModels = listToArray('modelList'); + config.store.showOnlyModels = listToArraySubfield('modelList', 'name'); const resp = await fetch('/api/config', { method: 'PUT',