+
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 @@