From 266edfd6e68d99e8bf20bb4a79c679a1a7976511 Mon Sep 17 00:00:00 2001 From: Spythere Date: Sun, 4 Jun 2023 00:33:43 +0200 Subject: [PATCH] =?UTF-8?q?reorder=20typ=C3=B3w=20danych?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/JournalView/JournalOptions.vue | 2 +- src/components/TrainsView/TrainOptions.vue | 2 +- .../Journal/JournalTimetablesConsts.ts | 2 +- src/constants/Trains/TrainOptionsConsts.ts | 2 +- .../constants/stores}/initFilterStates.ts | 98 +-- .../interfaces/Trains/TrainFilter.ts} | 2 +- .../interfaces/api/TimetablesQueryParams.ts | 2 +- src/scripts/managers/trainFilterManager.ts | 2 +- .../types}/JournalDispatcherTypes.ts | 0 .../types}/JournalTimetablesTypes.ts | 2 +- src/{store => scripts}/utils/filterUtils.ts | 312 +++++----- src/store/journalFiltersStore.ts | 6 + src/store/stationFiltersStore.ts | 198 +++--- src/views/JournalDispatchers.vue | 580 +++++++++--------- src/views/JournalTimetables.vue | 4 +- src/views/TrainsView.vue | 2 +- 16 files changed, 611 insertions(+), 605 deletions(-) rename src/{store/constants => scripts/constants/stores}/initFilterStates.ts (90%) rename src/{types/Trains/TrainOptionsTypes.ts => scripts/interfaces/Trains/TrainFilter.ts} (52%) rename src/{types/Journal => scripts/types}/JournalDispatcherTypes.ts (100%) rename src/{types/Journal => scripts/types}/JournalTimetablesTypes.ts (80%) rename src/{store => scripts}/utils/filterUtils.ts (94%) create mode 100644 src/store/journalFiltersStore.ts diff --git a/src/components/JournalView/JournalOptions.vue b/src/components/JournalView/JournalOptions.vue index aa7988e..817354a 100644 --- a/src/components/JournalView/JournalOptions.vue +++ b/src/components/JournalView/JournalOptions.vue @@ -100,7 +100,7 @@ import { DataStatus } from '../../scripts/enums/DataStatus'; import { DriverStatsAPIData } from '../../scripts/interfaces/api/DriverStatsAPIData'; import { URLs } from '../../scripts/utils/apiURLs'; import { useStore } from '../../store/store'; -import { JournalTimetableFilter } from '../../types/Journal/JournalTimetablesTypes'; +import { JournalTimetableFilter } from '../../scripts/types/JournalTimetablesTypes'; import ActionButton from '../Global/ActionButton.vue'; import SelectBox from '../Global/SelectBox.vue'; import { JournalFilterSection } from '../../scripts/enums/JournalFilterType'; diff --git a/src/components/TrainsView/TrainOptions.vue b/src/components/TrainsView/TrainOptions.vue index a30693e..3c0feda 100644 --- a/src/components/TrainsView/TrainOptions.vue +++ b/src/components/TrainsView/TrainOptions.vue @@ -82,10 +82,10 @@ import { defineComponent, inject, PropType } from 'vue'; import imageMixin from '../../mixins/imageMixin'; import keyMixin from '../../mixins/keyMixin'; -import { TrainFilter } from '../../types/Trains/TrainOptionsTypes'; import ActionButton from '../Global/ActionButton.vue'; import SelectBox from '../Global/SelectBox.vue'; import { TrainFilterSection } from '../../scripts/enums/TrainFilterType'; +import { TrainFilter } from '../../scripts/interfaces/Trains/TrainFilter'; export default defineComponent({ components: { SelectBox, ActionButton }, diff --git a/src/constants/Journal/JournalTimetablesConsts.ts b/src/constants/Journal/JournalTimetablesConsts.ts index 45dea71..08a4a16 100644 --- a/src/constants/Journal/JournalTimetablesConsts.ts +++ b/src/constants/Journal/JournalTimetablesConsts.ts @@ -1,5 +1,5 @@ import { JournalFilterSection, JournalFilterType } from '../../scripts/enums/JournalFilterType'; -import { JournalTimetableFilter } from '../../types/Journal/JournalTimetablesTypes'; +import { JournalTimetableFilter } from '../../scripts/types/JournalTimetablesTypes'; export const journalTimetableFilters: JournalTimetableFilter[] = [ { diff --git a/src/constants/Trains/TrainOptionsConsts.ts b/src/constants/Trains/TrainOptionsConsts.ts index 6f5dc14..8c57deb 100644 --- a/src/constants/Trains/TrainOptionsConsts.ts +++ b/src/constants/Trains/TrainOptionsConsts.ts @@ -1,5 +1,5 @@ import { TrainFilterSection, TrainFilterType } from '../../scripts/enums/TrainFilterType'; -import { TrainFilter } from '../../types/Trains/TrainOptionsTypes'; +import { TrainFilter } from '../../scripts/interfaces/Trains/TrainFilter'; export const trainFilters: TrainFilter[] = [ { diff --git a/src/store/constants/initFilterStates.ts b/src/scripts/constants/stores/initFilterStates.ts similarity index 90% rename from src/store/constants/initFilterStates.ts rename to src/scripts/constants/stores/initFilterStates.ts index 9e2aa83..2ce2e27 100644 --- a/src/store/constants/initFilterStates.ts +++ b/src/scripts/constants/stores/initFilterStates.ts @@ -1,49 +1,49 @@ -import Filter from "../../scripts/interfaces/Filter"; - -export const filterInitStates: Filter = { - default: false, - notDefault: false, - real: false, - fictional: false, - SPK: false, - SCS: false, - SPE: false, - SUP: false, - noSUP: false, - ręczne: false, - 'ręczne+SPK': false, - 'ręczne+SCS': false, - mechaniczne: false, - 'mechaniczne+SPK': false, - 'mechaniczne+SCS': false, - współczesna: false, - kształtowa: false, - historyczna: false, - mieszana: false, - SBL: false, - PBL: 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, -}; +import Filter from "../../interfaces/Filter"; + +export const filterInitStates: Filter = { + default: false, + notDefault: false, + real: false, + fictional: false, + SPK: false, + SCS: false, + SPE: false, + SUP: false, + noSUP: false, + ręczne: false, + 'ręczne+SPK': false, + 'ręczne+SCS': false, + mechaniczne: false, + 'mechaniczne+SPK': false, + 'mechaniczne+SCS': false, + współczesna: false, + kształtowa: false, + historyczna: false, + mieszana: false, + SBL: false, + PBL: 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, +}; diff --git a/src/types/Trains/TrainOptionsTypes.ts b/src/scripts/interfaces/Trains/TrainFilter.ts similarity index 52% rename from src/types/Trains/TrainOptionsTypes.ts rename to src/scripts/interfaces/Trains/TrainFilter.ts index 1c28fcb..f27b380 100644 --- a/src/types/Trains/TrainOptionsTypes.ts +++ b/src/scripts/interfaces/Trains/TrainFilter.ts @@ -1,4 +1,4 @@ -import { TrainFilterSection, TrainFilterType } from '../../scripts/enums/TrainFilterType'; +import { TrainFilterSection, TrainFilterType } from '../../enums/TrainFilterType' export interface TrainFilter { id: TrainFilterType; diff --git a/src/scripts/interfaces/api/TimetablesQueryParams.ts b/src/scripts/interfaces/api/TimetablesQueryParams.ts index 131e865..125ab49 100644 --- a/src/scripts/interfaces/api/TimetablesQueryParams.ts +++ b/src/scripts/interfaces/api/TimetablesQueryParams.ts @@ -1,4 +1,4 @@ -import { JournalTimetableSorter } from '../../../types/Journal/JournalTimetablesTypes'; +import { JournalTimetableSorter } from '../../types/JournalTimetablesTypes'; export interface TimetablesQueryParams { driverName?: string; diff --git a/src/scripts/managers/trainFilterManager.ts b/src/scripts/managers/trainFilterManager.ts index 05c10f9..efde499 100644 --- a/src/scripts/managers/trainFilterManager.ts +++ b/src/scripts/managers/trainFilterManager.ts @@ -1,4 +1,4 @@ -import { TrainFilter } from '../../types/Trains/TrainOptionsTypes'; +import { TrainFilter } from '../interfaces/Trains/TrainFilter'; import { TrainFilterType } from '../enums/TrainFilterType'; import Train from '../interfaces/Train'; import TrainStop from '../interfaces/TrainStop'; diff --git a/src/types/Journal/JournalDispatcherTypes.ts b/src/scripts/types/JournalDispatcherTypes.ts similarity index 100% rename from src/types/Journal/JournalDispatcherTypes.ts rename to src/scripts/types/JournalDispatcherTypes.ts diff --git a/src/types/Journal/JournalTimetablesTypes.ts b/src/scripts/types/JournalTimetablesTypes.ts similarity index 80% rename from src/types/Journal/JournalTimetablesTypes.ts rename to src/scripts/types/JournalTimetablesTypes.ts index bc08c9f..94007ab 100644 --- a/src/types/Journal/JournalTimetablesTypes.ts +++ b/src/scripts/types/JournalTimetablesTypes.ts @@ -1,4 +1,4 @@ -import { JournalFilterSection, JournalFilterType } from '../../scripts/enums/JournalFilterType'; +import { JournalFilterSection, JournalFilterType } from '../enums/JournalFilterType'; export type JournalTimetableSearchKey = | 'search-driver' diff --git a/src/store/utils/filterUtils.ts b/src/scripts/utils/filterUtils.ts similarity index 94% rename from src/store/utils/filterUtils.ts rename to src/scripts/utils/filterUtils.ts index 7b5311c..9ffde9b 100644 --- a/src/store/utils/filterUtils.ts +++ b/src/scripts/utils/filterUtils.ts @@ -1,156 +1,156 @@ -import { HeadIdsTypes } from '../../scripts/data/stationHeaderNames'; -import Filter from '../../scripts/interfaces/Filter'; -import Station from '../../scripts/interfaces/Station'; - -export const sortStations = (a: Station, b: Station, sorter: { headerName: HeadIdsTypes; dir: number }) => { - let diff = 0; - - switch (sorter.headerName) { - case 'station': - return sorter.dir == 1 ? a.name.localeCompare(b.name) : b.name.localeCompare(a.name); - - case 'min-lvl': - diff = (a.generalInfo?.reqLevel || 0) - (b.generalInfo?.reqLevel || 0); - break; - - case 'status': - diff = (a.onlineInfo?.statusTimestamp || 0) - (b.onlineInfo?.statusTimestamp || 0); - break; - - case 'dispatcher': - 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 'dispatcher-lvl': - diff = (a.onlineInfo?.dispatcherExp || 0) - (b.onlineInfo?.dispatcherExp || 0); - break; - - case 'user': - diff = (b.onlineInfo ? b.onlineInfo.currentUsers : -1) - (a.onlineInfo ? a.onlineInfo.currentUsers : -1); - break; - - case 'spawn': - diff = (a.onlineInfo ? a.onlineInfo.spawns.length : -1) - (b.onlineInfo ? b.onlineInfo.spawns.length : -1); - break; - - case 'timetableConfirmed': - diff = - (a.onlineInfo?.scheduledTrains - ? a.onlineInfo.scheduledTrains.filter((train) => train.stopInfo.confirmed).length - : -1) - - (b.onlineInfo?.scheduledTrains - ? b.onlineInfo.scheduledTrains.filter((train) => train.stopInfo.confirmed).length - : -1); - break; - - case 'timetableUnconfirmed': - diff = - (a.onlineInfo?.scheduledTrains - ? a.onlineInfo.scheduledTrains.filter((train) => !train.stopInfo.confirmed).length - : -1) - - (b.onlineInfo?.scheduledTrains - ? b.onlineInfo.scheduledTrains.filter((train) => !train.stopInfo.confirmed).length - : -1); - break; - - case 'timetableAll': - diff = - (a.onlineInfo?.scheduledTrains ? a.onlineInfo.scheduledTrains.length : -1) - - (b.onlineInfo?.scheduledTrains ? b.onlineInfo.scheduledTrains.length : -1); - break; - - default: - break; - } - - if (diff != 0) return Math.sign(diff) * sorter.dir; - return a.name.localeCompare(b.name); -}; - -export const filterStations = (station: Station, filters: Filter) => { - if (!station.onlineInfo && filters['free']) return false; - - if (station.onlineInfo) { - const { statusID, statusTimestamp } = station.onlineInfo; - - const isEnding = statusID == 'ending' && filters['endingStatus']; - const isNotSigned = (statusID == 'not-signed' || statusID == 'unavailable') && filters['unavailableStatus']; - const isAFK = statusID == 'brb' && filters['afkStatus']; - const isNoSpace = statusID == 'no-space' && filters['noSpaceStatus']; - const isOccupied = station.onlineInfo && filters['occupied']; - - const isOnlineInBounds = - (filters['onlineFromHours'] < 8 && - statusTimestamp > 0 && - statusTimestamp <= Date.now() + filters['onlineFromHours'] * 3600000) || - (filters['onlineFromHours'] > 0 && statusTimestamp <= 0) || - (filters['onlineFromHours'] == 8 && statusID != 'no-limit'); - - if (isEnding || isOnlineInBounds || isNotSigned || isAFK || isNoSpace || isOccupied) return false; - } - - if ((station.generalInfo?.availability == 'nonPublic' || !station.generalInfo) && filters['nonPublic']) return false; - - if (station.generalInfo) { - const { routes, availability, controlType, lines, reqLevel, signalType, SUP, authors } = station.generalInfo; - - if (availability == 'unavailable' && filters['unavailable'] && !station.onlineInfo) return false; - if (availability == 'abandoned' && filters['abandoned'] && !station.onlineInfo) return false; - if (availability == 'default' && filters['default']) return false; - - if ( - availability != 'default' && - filters['notDefault'] && - !(availability == 'abandoned' || availability == 'unavailable') - ) - return false; - - if (filters['real'] && lines) return false; - if (filters['fictional'] && !lines) return false; - - const otherAvailability = - availability == 'nonPublic' || availability == 'unavailable' || availability == 'abandoned'; - - if (reqLevel + (otherAvailability ? 1 : 0) < filters['minLevel']) return false; - - if (reqLevel + (otherAvailability ? 1 : 0) > filters['maxLevel']) return false; - - if ( - filters['no-1track'] && - (routes.oneWayCatenaryRouteNames.length != 0 || routes.oneWayNoCatenaryRouteNames.length != 0) - ) - return false; - - if ( - filters['no-2track'] && - (routes.twoWayCatenaryRouteNames.length != 0 || routes.twoWayNoCatenaryRouteNames.length != 0) - ) - return false; - - if (routes.oneWayCatenaryRouteNames.length < filters['minOneWayCatenary']) return false; - if (routes.oneWayNoCatenaryRouteNames.length < filters['minOneWay']) return false; - - if (routes.twoWayCatenaryRouteNames.length < filters['minTwoWayCatenary']) return false; - if (routes.twoWayNoCatenaryRouteNames.length < filters['minTwoWay']) return false; - - if (filters[controlType]) return false; - if (filters[signalType]) return false; - - if (filters['SUP'] && SUP) return false; - if (filters['noSUP'] && !SUP) return false; - - if (filters['SBL'] && routes.sblRouteNames.length > 0) return false; - if (filters['PBL'] && routes.sblRouteNames.length == 0) return false; - - if ( - filters['authors'].length > 3 && - !authors?.map((a) => a.toLocaleLowerCase()).includes(filters['authors'].toLocaleLowerCase()) - ) - return false; - } - - return true; -}; +import { HeadIdsTypes } from '../data/stationHeaderNames'; +import Filter from '../interfaces/Filter'; +import Station from '../interfaces/Station'; + +export const sortStations = (a: Station, b: Station, sorter: { headerName: HeadIdsTypes; dir: number }) => { + let diff = 0; + + switch (sorter.headerName) { + case 'station': + return sorter.dir == 1 ? a.name.localeCompare(b.name) : b.name.localeCompare(a.name); + + case 'min-lvl': + diff = (a.generalInfo?.reqLevel || 0) - (b.generalInfo?.reqLevel || 0); + break; + + case 'status': + diff = (a.onlineInfo?.statusTimestamp || 0) - (b.onlineInfo?.statusTimestamp || 0); + break; + + case 'dispatcher': + 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 'dispatcher-lvl': + diff = (a.onlineInfo?.dispatcherExp || 0) - (b.onlineInfo?.dispatcherExp || 0); + break; + + case 'user': + diff = (b.onlineInfo ? b.onlineInfo.currentUsers : -1) - (a.onlineInfo ? a.onlineInfo.currentUsers : -1); + break; + + case 'spawn': + diff = (a.onlineInfo ? a.onlineInfo.spawns.length : -1) - (b.onlineInfo ? b.onlineInfo.spawns.length : -1); + break; + + case 'timetableConfirmed': + diff = + (a.onlineInfo?.scheduledTrains + ? a.onlineInfo.scheduledTrains.filter((train) => train.stopInfo.confirmed).length + : -1) - + (b.onlineInfo?.scheduledTrains + ? b.onlineInfo.scheduledTrains.filter((train) => train.stopInfo.confirmed).length + : -1); + break; + + case 'timetableUnconfirmed': + diff = + (a.onlineInfo?.scheduledTrains + ? a.onlineInfo.scheduledTrains.filter((train) => !train.stopInfo.confirmed).length + : -1) - + (b.onlineInfo?.scheduledTrains + ? b.onlineInfo.scheduledTrains.filter((train) => !train.stopInfo.confirmed).length + : -1); + break; + + case 'timetableAll': + diff = + (a.onlineInfo?.scheduledTrains ? a.onlineInfo.scheduledTrains.length : -1) - + (b.onlineInfo?.scheduledTrains ? b.onlineInfo.scheduledTrains.length : -1); + break; + + default: + break; + } + + if (diff != 0) return Math.sign(diff) * sorter.dir; + return a.name.localeCompare(b.name); +}; + +export const filterStations = (station: Station, filters: Filter) => { + if (!station.onlineInfo && filters['free']) return false; + + if (station.onlineInfo) { + const { statusID, statusTimestamp } = station.onlineInfo; + + const isEnding = statusID == 'ending' && filters['endingStatus']; + const isNotSigned = (statusID == 'not-signed' || statusID == 'unavailable') && filters['unavailableStatus']; + const isAFK = statusID == 'brb' && filters['afkStatus']; + const isNoSpace = statusID == 'no-space' && filters['noSpaceStatus']; + const isOccupied = station.onlineInfo && filters['occupied']; + + const isOnlineInBounds = + (filters['onlineFromHours'] < 8 && + statusTimestamp > 0 && + statusTimestamp <= Date.now() + filters['onlineFromHours'] * 3600000) || + (filters['onlineFromHours'] > 0 && statusTimestamp <= 0) || + (filters['onlineFromHours'] == 8 && statusID != 'no-limit'); + + if (isEnding || isOnlineInBounds || isNotSigned || isAFK || isNoSpace || isOccupied) return false; + } + + if ((station.generalInfo?.availability == 'nonPublic' || !station.generalInfo) && filters['nonPublic']) return false; + + if (station.generalInfo) { + const { routes, availability, controlType, lines, reqLevel, signalType, SUP, authors } = station.generalInfo; + + if (availability == 'unavailable' && filters['unavailable'] && !station.onlineInfo) return false; + if (availability == 'abandoned' && filters['abandoned'] && !station.onlineInfo) return false; + if (availability == 'default' && filters['default']) return false; + + if ( + availability != 'default' && + filters['notDefault'] && + !(availability == 'abandoned' || availability == 'unavailable') + ) + return false; + + if (filters['real'] && lines) return false; + if (filters['fictional'] && !lines) return false; + + const otherAvailability = + availability == 'nonPublic' || availability == 'unavailable' || availability == 'abandoned'; + + if (reqLevel + (otherAvailability ? 1 : 0) < filters['minLevel']) return false; + + if (reqLevel + (otherAvailability ? 1 : 0) > filters['maxLevel']) return false; + + if ( + filters['no-1track'] && + (routes.oneWayCatenaryRouteNames.length != 0 || routes.oneWayNoCatenaryRouteNames.length != 0) + ) + return false; + + if ( + filters['no-2track'] && + (routes.twoWayCatenaryRouteNames.length != 0 || routes.twoWayNoCatenaryRouteNames.length != 0) + ) + return false; + + if (routes.oneWayCatenaryRouteNames.length < filters['minOneWayCatenary']) return false; + if (routes.oneWayNoCatenaryRouteNames.length < filters['minOneWay']) return false; + + if (routes.twoWayCatenaryRouteNames.length < filters['minTwoWayCatenary']) return false; + if (routes.twoWayNoCatenaryRouteNames.length < filters['minTwoWay']) return false; + + if (filters[controlType]) return false; + if (filters[signalType]) return false; + + if (filters['SUP'] && SUP) return false; + if (filters['noSUP'] && !SUP) return false; + + if (filters['SBL'] && routes.sblRouteNames.length > 0) return false; + if (filters['PBL'] && routes.sblRouteNames.length == 0) return false; + + if ( + filters['authors'].length > 3 && + !authors?.map((a) => a.toLocaleLowerCase()).includes(filters['authors'].toLocaleLowerCase()) + ) + return false; + } + + return true; +}; diff --git a/src/store/journalFiltersStore.ts b/src/store/journalFiltersStore.ts new file mode 100644 index 0000000..892f528 --- /dev/null +++ b/src/store/journalFiltersStore.ts @@ -0,0 +1,6 @@ +import { defineStore } from 'pinia'; + +export const useJournalFiltersStore = defineStore('journalFiltersStore', { + state: () => ({}), + +}); diff --git a/src/store/stationFiltersStore.ts b/src/store/stationFiltersStore.ts index 9deda5c..ad8d812 100644 --- a/src/store/stationFiltersStore.ts +++ b/src/store/stationFiltersStore.ts @@ -1,99 +1,99 @@ -import { defineStore } from 'pinia'; -import inputData from '../data/options.json'; -import Station from '../scripts/interfaces/Station'; -import StorageManager from '../scripts/managers/storageManager'; -import { useStore } from './store'; -import { filterInitStates } from './constants/initFilterStates'; -import { filterStations, sortStations } from './utils/filterUtils'; -import { HeadIdsTypes } from '../scripts/data/stationHeaderNames'; - -export const useStationFiltersStore = defineStore('stationFiltersStore', { - state() { - return { - inputs: inputData, - filters: { ...filterInitStates }, - sorterActive: { headerName: 'station' as HeadIdsTypes, dir: 1 }, - store: useStore(), - lastClickedFilterId: '', - }; - }, - - getters: { - areFiltersAtDefault(state) { - return Object.keys(state.filters).every((f) => state.filters[f] === filterInitStates[f]); - }, - }, - - 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.name)) return; - const savedValue = StorageManager.getBooleanValue(option.name); - - this.filters[option.name] = 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); - }); - }, - - resetSectionOptions(section: string) { - this.inputs.options.forEach((option) => { - if (option.section != section) return; - - option.value = option.defaultValue; - this.filters[option.id] = !option.defaultValue; - - StorageManager.setBooleanValue(option.name, !option.defaultValue); - }); - }, - - changeSorter(headerName: HeadIdsTypes) { - if (headerName == this.sorterActive.headerName) this.sorterActive.dir = -1 * this.sorterActive.dir; - else this.sorterActive.dir = 1; - - this.sorterActive.headerName = headerName; - }, - }, -}); +import { defineStore } from 'pinia'; +import inputData from '../data/options.json'; +import Station from '../scripts/interfaces/Station'; +import StorageManager from '../scripts/managers/storageManager'; +import { useStore } from './store'; +import { filterInitStates } from '../scripts/constants/stores/initFilterStates'; +import { filterStations, sortStations } from '../scripts/utils/filterUtils'; +import { HeadIdsTypes } from '../scripts/data/stationHeaderNames'; + +export const useStationFiltersStore = defineStore('stationFiltersStore', { + state() { + return { + inputs: inputData, + filters: { ...filterInitStates }, + sorterActive: { headerName: 'station' as HeadIdsTypes, dir: 1 }, + store: useStore(), + lastClickedFilterId: '', + }; + }, + + getters: { + areFiltersAtDefault(state) { + return Object.keys(state.filters).every((f) => state.filters[f] === filterInitStates[f]); + }, + }, + + 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.name)) return; + const savedValue = StorageManager.getBooleanValue(option.name); + + this.filters[option.name] = 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); + }); + }, + + resetSectionOptions(section: string) { + this.inputs.options.forEach((option) => { + if (option.section != section) return; + + option.value = option.defaultValue; + this.filters[option.id] = !option.defaultValue; + + StorageManager.setBooleanValue(option.name, !option.defaultValue); + }); + }, + + changeSorter(headerName: HeadIdsTypes) { + if (headerName == this.sorterActive.headerName) this.sorterActive.dir = -1 * this.sorterActive.dir; + else this.sorterActive.dir = 1; + + this.sorterActive.headerName = headerName; + }, + }, +}); diff --git a/src/views/JournalDispatchers.vue b/src/views/JournalDispatchers.vue index 8c76336..6daed6b 100644 --- a/src/views/JournalDispatchers.vue +++ b/src/views/JournalDispatchers.vue @@ -1,290 +1,290 @@ - - - - - - + + + + + + diff --git a/src/views/JournalTimetables.vue b/src/views/JournalTimetables.vue index 12da0b5..d6efb12 100644 --- a/src/views/JournalTimetables.vue +++ b/src/views/JournalTimetables.vue @@ -70,12 +70,12 @@ import JournalHeader from '../components/JournalView/JournalHeader.vue'; import JournalTimetablesList from '../components/JournalView/JournalTimetablesList.vue'; import Loading from '../components/Global/Loading.vue'; -import { JournalTimetableSorter } from '../types/Journal/JournalTimetablesTypes'; +import { JournalTimetableSorter } from '../scripts/types/JournalTimetablesTypes'; import { DataStatus } from '../scripts/enums/DataStatus'; import { TimetableHistory } from '../scripts/interfaces/api/TimetablesAPIData'; import { URLs } from '../scripts/utils/apiURLs'; import { useStore } from '../store/store'; -import { JournalTimetableSearchType } from '../types/Journal/JournalTimetablesTypes'; +import { JournalTimetableSearchType } from '../scripts/types/JournalTimetablesTypes'; import { journalTimetableFilters } from '../constants/Journal/JournalTimetablesConsts'; import { LocationQuery } from 'vue-router'; diff --git a/src/views/TrainsView.vue b/src/views/TrainsView.vue index dfac6ba..e7a41b8 100644 --- a/src/views/TrainsView.vue +++ b/src/views/TrainsView.vue @@ -21,7 +21,7 @@ import modalTrainMixin from '../mixins/modalTrainMixin'; import Train from '../scripts/interfaces/Train'; import { filteredTrainList } from '../scripts/managers/trainFilterManager'; import { useStore } from '../store/store'; -import { TrainFilter } from '../types/Trains/TrainOptionsTypes'; +import { TrainFilter } from '../scripts/interfaces/Trains/TrainFilter'; export default defineComponent({ components: {