From 846d4d054799fec756fe67e854c03047f7b4febf Mon Sep 17 00:00:00 2001 From: Spythere Date: Thu, 29 Sep 2022 19:27:54 +0200 Subject: [PATCH] Filtry scenerii --- src/App.vue | 10 - src/components/StationsView/FilterOption.vue | 100 +-- .../StationsView/StationFilterCard.vue | 115 ++-- src/components/StationsView/StationTable.vue | 27 +- src/components/TrainsView/TrainInfo.vue | 2 + src/data/options.json | 9 - src/locales/pl.json | 2 +- src/scripts/interfaces/Train.ts | 3 +- src/scripts/interfaces/api/TrainAPIData.ts | 1 + src/scripts/managers/storageManager.ts | 7 + .../stationFiltersStore.ts} | 600 +++++++++--------- src/store/store.ts | 3 + src/store/storeTypes.ts | 5 +- src/views/StationsView.vue | 91 +-- 14 files changed, 433 insertions(+), 542 deletions(-) rename src/{scripts/managers/stationFilterManager.ts => store/stationFiltersStore.ts} (68%) diff --git a/src/App.vue b/src/App.vue index 3730eb2..f55b499 100644 --- a/src/App.vue +++ b/src/App.vue @@ -83,7 +83,6 @@ export default defineComponent({ }, async mounted() { - this.updateStorage(); this.setReleaseURL(); watch( @@ -113,15 +112,6 @@ export default defineComponent({ this.releaseURL = releaseURL || ''; }, - updateStorage() { - if (!StorageManager.isRegistered('unavailable-status')) { - StorageManager.setBooleanValue('unavailable-status', true); - StorageManager.setBooleanValue('ending-status', true); - StorageManager.setBooleanValue('no-space-status', true); - StorageManager.setBooleanValue('afk-status', true); - } - }, - loadLang() { const storageLang = StorageManager.getStringValue('lang'); diff --git a/src/components/StationsView/FilterOption.vue b/src/components/StationsView/FilterOption.vue index ebaf6f1..ce66ff5 100644 --- a/src/components/StationsView/FilterOption.vue +++ b/src/components/StationsView/FilterOption.vue @@ -1,23 +1,12 @@ diff --git a/src/components/StationsView/StationFilterCard.vue b/src/components/StationsView/StationFilterCard.vue index 6e4c791..c0e3e76 100644 --- a/src/components/StationsView/StationFilterCard.vue +++ b/src/components/StationsView/StationFilterCard.vue @@ -23,13 +23,13 @@ -
+
{{ $t('filters.title') }}
{{ $t('filters.minimum-hours-title') }}
- + {{ minimumHours == 0 ? $t('filters.now') @@ -46,7 +46,7 @@ ? minimumHours + $t('filters.hour') : $t('filters.no-limit') }} - +
@@ -63,7 +63,7 @@
-
+
- -
+ +
@@ -106,11 +99,11 @@ diff --git a/src/components/TrainsView/TrainInfo.vue b/src/components/TrainsView/TrainInfo.vue index 4c8ae49..cf42b59 100644 --- a/src/components/TrainsView/TrainInfo.vue +++ b/src/components/TrainsView/TrainInfo.vue @@ -12,6 +12,8 @@ {{ train.timetableData.category }}  {{ train.trainNo }}  | {{ train.driverName }}  + + {{ train.isTimeout }}
diff --git a/src/data/options.json b/src/data/options.json index ffc8f51..071fd8b 100644 --- a/src/data/options.json +++ b/src/data/options.json @@ -198,15 +198,6 @@ "section": "status", "value": true, "defaultValue": true - }, - { - "id": "troll", - "name": "troll", - "iconName": "", - - "section": "troll", - "value": true, - "defaultValue": true } ], "sliders": [ diff --git a/src/locales/pl.json b/src/locales/pl.json index 3429b4e..a5e9f39 100644 --- a/src/locales/pl.json +++ b/src/locales/pl.json @@ -164,7 +164,7 @@ "hour": " godz.", "no-limit": "BEZ LIMITU", "include-selected": "POKAŻ ZAZNACZONE", - "save": "↵ ZAPISZ FILTRY", + "save": "ZAPISZ FILTRY", "reset": "RESETUJ FILTRY", "close": "ZAMKNIJ FILTRY" }, diff --git a/src/scripts/interfaces/Train.ts b/src/scripts/interfaces/Train.ts index 04ad08c..30ff328 100644 --- a/src/scripts/interfaces/Train.ts +++ b/src/scripts/interfaces/Train.ts @@ -19,9 +19,10 @@ export default interface Train { online: boolean; lastSeen: number; region: string; - cars: string[]; + isTimeout: boolean; + timetableData?: { timetableId: number; category: string; diff --git a/src/scripts/interfaces/api/TrainAPIData.ts b/src/scripts/interfaces/api/TrainAPIData.ts index b75bdc7..f417ca4 100644 --- a/src/scripts/interfaces/api/TrainAPIData.ts +++ b/src/scripts/interfaces/api/TrainAPIData.ts @@ -21,6 +21,7 @@ export default interface TrainAPIData { lastSeen: number; region: string; + isTimeout: boolean; timetable?: { timetableId: number; diff --git a/src/scripts/managers/storageManager.ts b/src/scripts/managers/storageManager.ts index b24ee2c..600193e 100644 --- a/src/scripts/managers/storageManager.ts +++ b/src/scripts/managers/storageManager.ts @@ -23,6 +23,13 @@ export default class StorageManager { window.localStorage.setItem(key, val); } + static setValue(key: string, val: any) { + if (typeof val == 'boolean') this.setBooleanValue(key, val); + else if (typeof val == 'number') this.setNumericValue(key, val); + else if (typeof val == 'string') this.setStringValue(key, val); + else this.setStringValue(key, val); + } + static removeValue(key: string) { window.localStorage.removeItem(key); } diff --git a/src/scripts/managers/stationFilterManager.ts b/src/store/stationFiltersStore.ts similarity index 68% rename from src/scripts/managers/stationFilterManager.ts rename to src/store/stationFiltersStore.ts index b79aa50..7150b43 100644 --- a/src/scripts/managers/stationFilterManager.ts +++ b/src/store/stationFiltersStore.ts @@ -1,295 +1,305 @@ -import Filter from '../interfaces/Filter'; -import Station from '../interfaces/Station'; -import StorageManager from './storageManager'; - -const sortStations = (a: Station, b: Station, sorter: { index: number; dir: number }) => { - switch (sorter.index) { - case 0: - return sorter.dir == 1 ? a.name.localeCompare(b.name) : b.name.localeCompare(a.name); - - case 1: - if ((a.generalInfo?.reqLevel || 0) > (b.generalInfo?.reqLevel || 0)) return sorter.dir; - if ((a.generalInfo?.reqLevel || 0) < (b.generalInfo?.reqLevel || 0)) return -sorter.dir; - break; - - case 2: - if ((a.onlineInfo?.statusTimestamp || 0) > (b.onlineInfo?.statusTimestamp || 0)) return sorter.dir; - if ((a.onlineInfo?.statusTimestamp || 0) < (b.onlineInfo?.statusTimestamp || 0)) return -sorter.dir; - break; - - case 3: - if ((a.onlineInfo?.dispatcherName.toLowerCase() || '') > (b.onlineInfo?.dispatcherName.toLowerCase() || '')) - return sorter.dir; - if ((a.onlineInfo?.dispatcherName.toLowerCase() || '') < (b.onlineInfo?.dispatcherName.toLowerCase() || '')) - return -sorter.dir; - break; - - case 4: - if ((a.onlineInfo?.dispatcherExp || 0) > (b.onlineInfo?.dispatcherExp || 0)) return sorter.dir; - if ((a.onlineInfo?.dispatcherExp || 0) < (b.onlineInfo?.dispatcherExp || 0)) return -sorter.dir; - break; - - case 7: - if ((a.onlineInfo?.currentUsers || 0) > (b.onlineInfo?.currentUsers || 0)) return sorter.dir; - if ((a.onlineInfo?.currentUsers || 0) < (b.onlineInfo?.currentUsers || 0)) return -sorter.dir; - - if ((a.onlineInfo?.maxUsers || 0) > (b.onlineInfo?.maxUsers || 0)) return sorter.dir; - if ((a.onlineInfo?.maxUsers || 0) < (b.onlineInfo?.maxUsers || 0)) return -sorter.dir; - break; - - case 8: - if ((a.onlineInfo?.spawns.length || 0) > (b.onlineInfo?.spawns.length || 0)) return sorter.dir; - if ((a.onlineInfo?.spawns.length || 0) < (b.onlineInfo?.spawns.length || 0)) return -sorter.dir; - - break; - - case 9: - if ((a.onlineInfo?.scheduledTrains?.length || 0) > (b.onlineInfo?.scheduledTrains?.length || 0)) - return sorter.dir; - if ((a.onlineInfo?.scheduledTrains?.length || 0) < (b.onlineInfo?.scheduledTrains?.length || 0)) - return -sorter.dir; - - default: - break; - } - - return a.name.localeCompare(b.name); -}; - -const filterStations = (station: Station, filters: Filter) => { - const returnMode = false; - - if ((station.generalInfo?.availability == 'nonPublic' || !station.generalInfo) && filters['nonPublic']) - return returnMode; - - if (station.onlineInfo?.statusID == 'ending' && filters['ending']) return returnMode; - - if ( - station.onlineInfo && - station.onlineInfo.statusTimestamp > 0 && - filters['onlineFromHours'] < 8 && - station.onlineInfo.statusTimestamp <= Date.now() + filters['onlineFromHours'] * 3600000 - ) - return returnMode; - - if (filters['onlineFromHours'] > 0 && station.onlineInfo && station.onlineInfo.statusTimestamp <= 0) - return returnMode; - if (filters['onlineFromHours'] == 8 && station.onlineInfo?.statusID != 'no-limit') return returnMode; - - if (station.onlineInfo?.statusID == 'ending' && filters['endingStatus']) return returnMode; - if ( - (station.onlineInfo?.statusID == 'not-signed' || station.onlineInfo?.statusID == 'unavailable') && - filters['unavailableStatus'] - ) - return returnMode; - if (station.onlineInfo?.statusID == 'brb' && filters['afkStatus']) return returnMode; - if (station.onlineInfo?.statusID == 'no-space' && filters['noSpaceStatus']) return returnMode; - - if (station.onlineInfo && filters['occupied']) return returnMode; - if (!station.onlineInfo && filters['free']) return returnMode; - if (station.generalInfo?.availability == 'unavailable' && filters['unavailable'] && !station.onlineInfo) - return returnMode; - - if (station.generalInfo) { - const routes = station.generalInfo.routes; - const availability = station.generalInfo.availability; - - if (filters['abandoned'] && availability == 'abandoned') return returnMode; - - if (availability == 'default' && filters['default']) return returnMode; - if ( - availability != 'default' && - filters['notDefault'] && - !(availability == 'abandoned' || availability == 'unavailable') - ) - return returnMode; - - if (filters['real'] && station.generalInfo.lines != '') return returnMode; - if ( - filters['fictional'] && - station.generalInfo.lines == '' && - availability != 'abandoned' && - availability != 'unavailable' - ) - return returnMode; - - if ( - station.generalInfo.reqLevel + - (availability == 'nonPublic' || availability == 'unavailable' || availability == 'abandoned' ? 1 : 0) < - filters['minLevel'] - ) - return returnMode; - if ( - station.generalInfo.reqLevel + - (availability == 'nonPublic' || availability == 'unavailable' || availability == 'abandoned' ? 1 : 0) > - filters['maxLevel'] - ) - return returnMode; - - if ( - filters['no-1track'] && - (routes.oneWayCatenaryRouteNames.length != 0 || routes.oneWayNoCatenaryRouteNames.length != 0) - ) - return returnMode; - if ( - filters['no-2track'] && - (routes.twoWayCatenaryRouteNames.length != 0 || routes.twoWayNoCatenaryRouteNames.length != 0) - ) - return returnMode; - - if (routes.oneWayCatenaryRouteNames.length < filters['minOneWayCatenary']) return returnMode; - if (routes.oneWayNoCatenaryRouteNames.length < filters['minOneWay']) return returnMode; - - if (routes.twoWayCatenaryRouteNames.length < filters['minTwoWayCatenary']) return returnMode; - if (routes.twoWayNoCatenaryRouteNames.length < filters['minTwoWay']) return returnMode; - - if (filters[station.generalInfo.controlType]) return returnMode; - if (filters[station.generalInfo.signalType]) return returnMode; - - if ( - filters['SPK'] && - (station.generalInfo.controlType === 'SPK' || station.generalInfo.controlType.includes('+SPK')) - ) - return returnMode; - if ( - filters['SCS'] && - (station.generalInfo.controlType === 'SCS' || station.generalInfo.controlType.includes('+SCS')) - ) - return returnMode; - if ( - filters['SPE'] && - (station.generalInfo.controlType === 'SPE' || station.generalInfo.controlType.includes('+SPE')) - ) - return returnMode; - if (filters['SUP'] && station.generalInfo.SUP) return returnMode; - - if ( - filters['SCS'] && - filters['SPK'] && - (station.generalInfo.controlType.includes('SPK') || station.generalInfo.controlType.includes('SCS')) - ) - return returnMode; - - if (filters['mechaniczne'] && station.generalInfo.controlType.includes('mechaniczne')) return returnMode; - - if (filters['ręczne'] && station.generalInfo.controlType.includes('ręczne')) return returnMode; - - if (filters['SBL'] && routes.sblRouteNames.length > 0) return returnMode; - - if ( - filters['authors'].length > 3 && - !station.generalInfo.authors?.map((a) => a.toLocaleLowerCase()).includes(filters['authors'].toLocaleLowerCase()) - ) - return returnMode; - } - - return true; -}; - -export default class StationFilterManager { - private filterInitStates: Filter = { - default: false, - notDefault: false, - real: false, - fictional: false, - SPK: false, - SCS: false, - SPE: false, - SUP: false, - ręczne: false, - mechaniczne: false, - współczesna: false, - kształtowa: false, - historyczna: false, - mieszana: false, - SBL: false, - minLevel: 0, - maxLevel: 20, - minOneWayCatenary: 0, - minOneWay: 0, - minTwoWayCatenary: 0, - minTwoWay: 0, - 'include-selected': false, - 'no-1track': false, - 'no-2track': false, - free: true, - occupied: false, - ending: false, - nonPublic: false, - unavailable: true, - abandoned: true, - afkStatus: false, - endingStatus: false, - noSpaceStatus: false, - unavailableStatus: false, - unsignedStatus: false, - - authors: '', - - onlineFromHours: 0, - }; - - private filters: Filter = { ...this.filterInitStates }; - - private sorter: { index: number; dir: number } = { index: 0, dir: 1 }; - - checkFilters() { - if (!StorageManager.isRegistered('options_saved')) return; - - Object.keys(this.filterInitStates).forEach((filterKey) => { - if (StorageManager.isRegistered(filterKey)) return; - - const filterType = typeof this.filterInitStates[filterKey]; - - if (filterType === 'boolean') - StorageManager.setBooleanValue(filterKey, !this.filterInitStates[filterKey] as boolean); - - if (filterType === 'number') - StorageManager.setNumericValue(filterKey, this.filterInitStates[filterKey] as number); - }); - } - - getFilteredStationList(stationList: Station[], region: string): Station[] { - return stationList - .map((station) => { - if (station.onlineInfo && station.onlineInfo.region != region) { - delete station.onlineInfo; - } - - return station; - }) - .filter((station) => filterStations(station, this.filters)) - .sort((a, b) => sortStations(a, b, this.sorter)); - } - - changeFilterValue(filter: { name: string; value: number }) { - this.filters[filter.name] = filter.value; - - // if(filter.name == 'authors') - } - - resetFilters() { - this.filters = { ...this.filterInitStates }; - } - - invertFilters() { - Object.keys(this.filters).forEach((prop) => { - if (typeof this.filters[prop] !== 'boolean') return; - - this.filters[prop] = !this.filters[prop]; - }); - } - - changeSorter(index: number) { - if (index > 4 && index < 7) return; - - if (index == this.sorter.index) this.sorter.dir = -1 * this.sorter.dir; - else this.sorter.dir = 1; - - this.sorter.index = index; - } - - getSorter() { - return this.sorter; - } -} +import { defineStore } from 'pinia'; +import inputData from '../data/options.json'; +import Filter from '../scripts/interfaces/Filter'; +import Station from '../scripts/interfaces/Station'; +import StorageManager from '../scripts/managers/storageManager'; + +const sortStations = (a: Station, b: Station, sorter: { index: number; dir: number }) => { + switch (sorter.index) { + case 0: + return sorter.dir == 1 ? a.name.localeCompare(b.name) : b.name.localeCompare(a.name); + + case 1: + if ((a.generalInfo?.reqLevel || 0) > (b.generalInfo?.reqLevel || 0)) return sorter.dir; + if ((a.generalInfo?.reqLevel || 0) < (b.generalInfo?.reqLevel || 0)) return -sorter.dir; + break; + + case 2: + if ((a.onlineInfo?.statusTimestamp || 0) > (b.onlineInfo?.statusTimestamp || 0)) return sorter.dir; + if ((a.onlineInfo?.statusTimestamp || 0) < (b.onlineInfo?.statusTimestamp || 0)) return -sorter.dir; + break; + + case 3: + if ((a.onlineInfo?.dispatcherName.toLowerCase() || '') > (b.onlineInfo?.dispatcherName.toLowerCase() || '')) + return sorter.dir; + if ((a.onlineInfo?.dispatcherName.toLowerCase() || '') < (b.onlineInfo?.dispatcherName.toLowerCase() || '')) + return -sorter.dir; + break; + + case 4: + if ((a.onlineInfo?.dispatcherExp || 0) > (b.onlineInfo?.dispatcherExp || 0)) return sorter.dir; + if ((a.onlineInfo?.dispatcherExp || 0) < (b.onlineInfo?.dispatcherExp || 0)) return -sorter.dir; + break; + + case 7: + if ((a.onlineInfo?.currentUsers || 0) > (b.onlineInfo?.currentUsers || 0)) return sorter.dir; + if ((a.onlineInfo?.currentUsers || 0) < (b.onlineInfo?.currentUsers || 0)) return -sorter.dir; + + if ((a.onlineInfo?.maxUsers || 0) > (b.onlineInfo?.maxUsers || 0)) return sorter.dir; + if ((a.onlineInfo?.maxUsers || 0) < (b.onlineInfo?.maxUsers || 0)) return -sorter.dir; + break; + + case 8: + if ((a.onlineInfo?.spawns.length || 0) > (b.onlineInfo?.spawns.length || 0)) return sorter.dir; + if ((a.onlineInfo?.spawns.length || 0) < (b.onlineInfo?.spawns.length || 0)) return -sorter.dir; + + break; + + case 9: + if ((a.onlineInfo?.scheduledTrains?.length || 0) > (b.onlineInfo?.scheduledTrains?.length || 0)) + return sorter.dir; + if ((a.onlineInfo?.scheduledTrains?.length || 0) < (b.onlineInfo?.scheduledTrains?.length || 0)) + return -sorter.dir; + + default: + break; + } + + return a.name.localeCompare(b.name); +}; + +const filterStations = (station: Station, filters: Filter) => { + const returnMode = false; + + if ((station.generalInfo?.availability == 'nonPublic' || !station.generalInfo) && filters['nonPublic']) + return returnMode; + + if (station.onlineInfo?.statusID == 'ending' && filters['ending']) return returnMode; + + if ( + station.onlineInfo && + station.onlineInfo.statusTimestamp > 0 && + filters['onlineFromHours'] < 8 && + station.onlineInfo.statusTimestamp <= Date.now() + filters['onlineFromHours'] * 3600000 + ) + return returnMode; + + if (filters['onlineFromHours'] > 0 && station.onlineInfo && station.onlineInfo.statusTimestamp <= 0) + return returnMode; + if (filters['onlineFromHours'] == 8 && station.onlineInfo?.statusID != 'no-limit') return returnMode; + + if (station.onlineInfo?.statusID == 'ending' && filters['endingStatus']) return returnMode; + if ( + (station.onlineInfo?.statusID == 'not-signed' || station.onlineInfo?.statusID == 'unavailable') && + filters['unavailableStatus'] + ) + return returnMode; + if (station.onlineInfo?.statusID == 'brb' && filters['afkStatus']) return returnMode; + if (station.onlineInfo?.statusID == 'no-space' && filters['noSpaceStatus']) return returnMode; + + if (station.onlineInfo && filters['occupied']) return returnMode; + if (!station.onlineInfo && filters['free']) return returnMode; + if (station.generalInfo?.availability == 'unavailable' && filters['unavailable'] && !station.onlineInfo) + return returnMode; + + if (station.generalInfo) { + const routes = station.generalInfo.routes; + const availability = station.generalInfo.availability; + + if (filters['abandoned'] && availability == 'abandoned') return returnMode; + + if (availability == 'default' && filters['default']) return returnMode; + if ( + availability != 'default' && + filters['notDefault'] && + !(availability == 'abandoned' || availability == 'unavailable') + ) + return returnMode; + + if (filters['real'] && station.generalInfo.lines != '') return returnMode; + if ( + filters['fictional'] && + station.generalInfo.lines == '' && + availability != 'abandoned' && + availability != 'unavailable' + ) + return returnMode; + + if ( + station.generalInfo.reqLevel + + (availability == 'nonPublic' || availability == 'unavailable' || availability == 'abandoned' ? 1 : 0) < + filters['minLevel'] + ) + return returnMode; + if ( + station.generalInfo.reqLevel + + (availability == 'nonPublic' || availability == 'unavailable' || availability == 'abandoned' ? 1 : 0) > + filters['maxLevel'] + ) + return returnMode; + + if ( + filters['no-1track'] && + (routes.oneWayCatenaryRouteNames.length != 0 || routes.oneWayNoCatenaryRouteNames.length != 0) + ) + return returnMode; + if ( + filters['no-2track'] && + (routes.twoWayCatenaryRouteNames.length != 0 || routes.twoWayNoCatenaryRouteNames.length != 0) + ) + return returnMode; + + if (routes.oneWayCatenaryRouteNames.length < filters['minOneWayCatenary']) return returnMode; + if (routes.oneWayNoCatenaryRouteNames.length < filters['minOneWay']) return returnMode; + + if (routes.twoWayCatenaryRouteNames.length < filters['minTwoWayCatenary']) return returnMode; + if (routes.twoWayNoCatenaryRouteNames.length < filters['minTwoWay']) return returnMode; + + if (filters[station.generalInfo.controlType]) return returnMode; + if (filters[station.generalInfo.signalType]) return returnMode; + + if ( + filters['SPK'] && + (station.generalInfo.controlType === 'SPK' || station.generalInfo.controlType.includes('+SPK')) + ) + return returnMode; + if ( + filters['SCS'] && + (station.generalInfo.controlType === 'SCS' || station.generalInfo.controlType.includes('+SCS')) + ) + return returnMode; + if ( + filters['SPE'] && + (station.generalInfo.controlType === 'SPE' || station.generalInfo.controlType.includes('+SPE')) + ) + return returnMode; + if (filters['SUP'] && station.generalInfo.SUP) return returnMode; + + if ( + filters['SCS'] && + filters['SPK'] && + (station.generalInfo.controlType.includes('SPK') || station.generalInfo.controlType.includes('SCS')) + ) + return returnMode; + + if (filters['mechaniczne'] && station.generalInfo.controlType.includes('mechaniczne')) return returnMode; + + if (filters['ręczne'] && station.generalInfo.controlType.includes('ręczne')) return returnMode; + + if (filters['SBL'] && routes.sblRouteNames.length > 0) return returnMode; + + if ( + filters['authors'].length > 3 && + !station.generalInfo.authors?.map((a) => a.toLocaleLowerCase()).includes(filters['authors'].toLocaleLowerCase()) + ) + return returnMode; + } + + return true; +}; + +const filterInitStates: Filter = { + default: false, + notDefault: false, + real: false, + fictional: false, + SPK: false, + SCS: false, + SPE: false, + SUP: false, + ręczne: false, + mechaniczne: false, + współczesna: false, + kształtowa: false, + historyczna: false, + mieszana: false, + SBL: false, + minLevel: 0, + maxLevel: 20, + minOneWayCatenary: 0, + minOneWay: 0, + minTwoWayCatenary: 0, + minTwoWay: 0, + 'include-selected': false, + 'no-1track': false, + 'no-2track': false, + free: true, + occupied: false, + ending: false, + nonPublic: false, + unavailable: true, + abandoned: true, + afkStatus: false, + endingStatus: false, + noSpaceStatus: false, + unavailableStatus: false, + unsignedStatus: false, + + authors: '', + + onlineFromHours: 0, +}; + +export const useStationFiltersStore = defineStore('stationFiltersStore', { + state() { + return { + inputs: inputData, + filters: { ...filterInitStates }, + sorterActive: { index: 0, dir: 1 }, + }; + }, + + actions: { + getFilteredStationList(stationList: Station[], region: string): Station[] { + return stationList + .map((station) => { + if (station.onlineInfo && station.onlineInfo.region != region) { + delete station.onlineInfo; + } + + return station; + }) + .filter((station) => filterStations(station, this.filters)) + .sort((a, b) => sortStations(a, b, this.sorterActive)); + }, + + setupFilters() { + if (!StorageManager.isRegistered('options_saved')) return; + + this.inputs.options.forEach((option) => { + if (!StorageManager.isRegistered(option.id)) return; + const savedValue = StorageManager.getBooleanValue(option.id); + + this.filters[option.id] = savedValue; + option.value = !savedValue; + }); + + this.inputs.sliders.forEach((slider) => { + if (!StorageManager.isRegistered(slider.name)) return; + const savedValue = StorageManager.getNumericValue(slider.name); + + this.filters[slider.name] = savedValue; + slider.value = savedValue; + }); + }, + + changeFilterValue(filter: { name: string; value: any }) { + this.filters[filter.name] = filter.value; + + if (StorageManager.isRegistered('options_saved')) StorageManager.setValue(filter.name, filter.value); + }, + + resetFilters() { + this.filters = { ...filterInitStates }; + + this.inputs.options.forEach((option) => { + option.value = option.defaultValue; + StorageManager.setBooleanValue(option.name, !option.defaultValue); + }); + + this.inputs.sliders.forEach((slider) => { + slider.value = slider.defaultValue; + StorageManager.setNumericValue(slider.name, slider.defaultValue); + }); + }, + + changeSorter(index: number) { + if (index > 4 && index < 7) return; + + if (index == this.sorterActive.index) this.sorterActive.dir = -1 * this.sorterActive.dir; + else this.sorterActive.dir = 1; + + this.sorterActive.index = index; + }, + }, +}); diff --git a/src/store/store.ts b/src/store/store.ts index 65c2c27..bd1b0a6 100644 --- a/src/store/store.ts +++ b/src/store/store.ts @@ -17,6 +17,7 @@ import { } from '../scripts/utils/storeUtils'; import { APIData, StationJSONData, StoreState } from './storeTypes'; + export const useStore = defineStore('store', { state: () => ({ @@ -53,6 +54,7 @@ export const useStore = defineStore('store', { blockScroll: false, listenerLaunched: false, + } as StoreState), actions: { @@ -94,6 +96,7 @@ export const useStore = defineStore('store', { cars: stock.slice(1), lastSeen: train.lastSeen, + isTimeout: train.isTimeout, timetableData: timetable ? { diff --git a/src/store/storeTypes.ts b/src/store/storeTypes.ts index 1c9c321..ce11a98 100644 --- a/src/store/storeTypes.ts +++ b/src/store/storeTypes.ts @@ -1,12 +1,11 @@ - import { Socket } from 'socket.io-client'; import { DataStatus } from '../scripts/enums/DataStatus'; -import { DispatcherStatsAPIData } from '../scripts/interfaces/api/DispatcherStatsAPIData'; -import { DriverStatsAPIData } from '../scripts/interfaces/api/DriverStatsAPIData'; import StationAPIData from '../scripts/interfaces/api/StationAPIData'; import TrainAPIData from '../scripts/interfaces/api/TrainAPIData'; import Station from '../scripts/interfaces/Station'; import Train from '../scripts/interfaces/Train'; +import { DispatcherStatsAPIData } from '../scripts/interfaces/api/DispatcherStatsAPIData'; +import { DriverStatsAPIData } from '../scripts/interfaces/api/DriverStatsAPIData'; export type Availability = 'default' | 'unavailable' | 'nonPublic' | 'abandoned' | 'nonDefault'; diff --git a/src/views/StationsView.vue b/src/views/StationsView.vue index 2042752..0a257c0 100644 --- a/src/views/StationsView.vue +++ b/src/views/StationsView.vue @@ -3,37 +3,23 @@
- +
- +