From 0434702d3b25d081bfd59bca8c1b1b62929014b8 Mon Sep 17 00:00:00 2001 From: Spythere Date: Thu, 9 Mar 2023 13:41:59 +0100 Subject: [PATCH 01/17] update: URL api --- src/scripts/utils/apiURLs.ts | 4 +++- vite.config.ts | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/scripts/utils/apiURLs.ts b/src/scripts/utils/apiURLs.ts index 5c10567..3edf3bb 100644 --- a/src/scripts/utils/apiURLs.ts +++ b/src/scripts/utils/apiURLs.ts @@ -1,5 +1,7 @@ export const URLs = { stacjownikAPI: - import.meta.env.VITE_APP_API_DEV == 1 && !import.meta.env.PROD ? 'http://localhost:3000' : 'https://spythere.pl', + import.meta.env.VITE_APP_API_DEV == 1 && !import.meta.env.PROD + ? 'http://localhost:3000' + : 'https://stacjownik.spythere.pl', stacjownikAPIDev: 'localhost:3000', }; diff --git a/vite.config.ts b/vite.config.ts index d76787a..d59c8e3 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -15,7 +15,7 @@ export default defineConfig({ globPatterns: ['**/*.{js,css,html,png,svg,jpg}'], runtimeCaching: [ { - urlPattern: new RegExp('^https://spythere.pl/api/getSceneries', 'i'), + urlPattern: new RegExp('^https://stacjownik.spythere.pl/api/getSceneries', 'i'), handler: 'NetworkFirst', options: { cacheName: 'sceneries-cache', @@ -52,3 +52,4 @@ export default defineConfig({ }); + From c64112c86a394acee2ae0fdc7d6ed6e95dc65d6a Mon Sep 17 00:00:00 2001 From: Spythere Date: Thu, 9 Mar 2023 14:28:16 +0100 Subject: [PATCH 02/17] dziennik RJ: dodatkowe informacje --- .../JournalView/JournalTimetablesList.vue | 33 ++++++++++++------- src/locales/en.json | 2 +- src/locales/pl.json | 2 +- .../interfaces/api/TimetablesAPIData.ts | 2 ++ 4 files changed, 26 insertions(+), 13 deletions(-) diff --git a/src/components/JournalView/JournalTimetablesList.vue b/src/components/JournalView/JournalTimetablesList.vue index 078543c..cfd0869 100644 --- a/src/components/JournalView/JournalTimetablesList.vue +++ b/src/components/JournalView/JournalTimetablesList.vue @@ -53,12 +53,21 @@ +
{{ timetable.route.replace('|', ' - ') }}
+
+
- + > {{ scenery.name }} @@ -67,6 +76,7 @@
+
@@ -88,24 +98,30 @@
+
{{ $t('journal.dispatcher-name') }}  {{ timetable.authorName }} + + ({{ + new Date(timetable.createdAt).toLocaleString($i18n.locale, { timeStyle: 'short', dateStyle: 'full' }) + }}) +
-
+

@@ -160,7 +176,7 @@ export default defineComponent({ return this.timetableHistory.map((timetable) => ({ timetable, sceneryList: this.getSceneryList(timetable), - showStock: ref(false), + showExtra: ref(false), })); }, }, @@ -190,12 +206,7 @@ export default defineComponent({ this.$i18n.locale )})`; - const abandonedDateHTML = ` (porz. ${this.localeTime( - timetable.fulfilled ? timetable.scheduledEndDate : timetable.endDate, - this.$i18n.locale - )})`; - - return { name, confirmed: i < timetable.confirmedStopsCount, beginDateHTML, endDateHTML, abandonedDateHTML }; + return { name, confirmed: i < timetable.confirmedStopsCount, beginDateHTML, endDateHTML }; }); }, diff --git a/src/locales/en.json b/src/locales/en.json index 26f5f84..43f0ef0 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -254,7 +254,7 @@ "minutes": "{minutes} mins", "hours": "{hours}h {minutes} mins", - "stock-info": "STOCK INFO", + "stock-info": "EXTRA INFO", "stock-length": "Length", "stock-mass": "Mass", "stock-max-speed": "Maximum registered speed", diff --git a/src/locales/pl.json b/src/locales/pl.json index c3cd4cc..e54f01b 100644 --- a/src/locales/pl.json +++ b/src/locales/pl.json @@ -258,7 +258,7 @@ "timetable-fulfilled": "WYPEŁNIONY", "timetable-abandoned": "PORZUCONY", - "stock-info": "INFORMACJE O SKŁADZIE", + "stock-info": "DODATKOWE INFORMACJE", "stock-length": "Długość", "stock-mass": "Masa", "stock-max-speed": "Maks. zarejestrowana prędkość", diff --git a/src/scripts/interfaces/api/TimetablesAPIData.ts b/src/scripts/interfaces/api/TimetablesAPIData.ts index da13061..42b0fc8 100644 --- a/src/scripts/interfaces/api/TimetablesAPIData.ts +++ b/src/scripts/interfaces/api/TimetablesAPIData.ts @@ -1,5 +1,7 @@ export interface TimetableHistory { id: number; + createdAt: string; + updatedAt: string; timetableId: number; trainNo: number; From 6af67ec7414573740a7a57dbe0c3c6408f389f8d Mon Sep 17 00:00:00 2001 From: Spythere Date: Thu, 9 Mar 2023 14:35:03 +0100 Subject: [PATCH 03/17] =?UTF-8?q?fix:=20t=C5=82umaczenia=20filtr=C3=B3w?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/JournalView/JournalOptions.vue | 7 ++++++- src/locales/en.json | 3 ++- src/locales/pl.json | 5 +++-- src/views/JournalDispatchers.vue | 1 + src/views/JournalTimetables.vue | 1 + 5 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/components/JournalView/JournalOptions.vue b/src/components/JournalView/JournalOptions.vue index a9766ed..ce8ca05 100644 --- a/src/components/JournalView/JournalOptions.vue +++ b/src/components/JournalView/JournalOptions.vue @@ -29,7 +29,7 @@

{{ $t('options.search-title') }}

@@ -121,6 +128,7 @@ import { useStore } from '../../store/store'; import ActionButton from '../Global/ActionButton.vue'; import FilterOption from './FilterOption.vue'; +import { filterInitStates } from '../../store/constants/initFilterStates'; export default defineComponent({ components: { ActionButton, FilterOption }, @@ -304,7 +312,7 @@ export default defineComponent({ } &_content { - padding: 0.5em; + padding: 1em 0.5em; display: flex; flex-direction: column; @@ -392,7 +400,7 @@ export default defineComponent({ &_actions { width: 100%; - padding: 0.25em; + padding: 0.5em; .filter-option { max-width: 50%; @@ -412,8 +420,7 @@ export default defineComponent({ padding: 0.5em; &[data-selected='true'] { - background-color: lightgreen; - color: black; + background-color: forestgreen; } } } diff --git a/src/locales/en.json b/src/locales/en.json index 264301a..5b5dac2 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -129,7 +129,7 @@ "filter-active": "ACTIVE" }, "filters": { - "desc": " • Left mouse click: select / unselect chosen filter
• Double left click: unselect all filters but chosen from group
RESET: reset all filters from group", + "desc": " • Left mouse click: select / unselect chosen filter
• Double left click: unselect all filters but chosen from a group
RESET: reset all filters from a group", "sections": { "reality": "SCENERY REALITY", @@ -138,7 +138,7 @@ "control": "CONTROLS", "signals": "SIGNALLING", "addons": "ADDITIONAL PROGRAMS", - "blockades": "BLOCKADE TYPE", + "blockades": "BLOCK SIGNALLING", "status": "ONLINE STATUS" }, @@ -170,8 +170,8 @@ "SUP": "SUP (RASP-UZK)", "noSUP": "NO SUP", - "SBL": "ABS (SBL)", - "PBL": "NO ABS (PBL)", + "SBL": "AUTOMATIC (SBL)", + "PBL": "SEMIAUTOMATIC (PBL)", "modern": "MODERN", "semaphores": "SEMAPHORES", diff --git a/src/locales/pl.json b/src/locales/pl.json index ebd2977..455c7e9 100644 --- a/src/locales/pl.json +++ b/src/locales/pl.json @@ -171,8 +171,8 @@ "SUP": "SUP (RASP-UZK)", "noSUP": "BEZ SUP", - "SBL": "SBL", - "PBL": "PBL", + "SBL": "SAMOCZYNNA", + "PBL": "PÓŁSAMOCZYNNA", "mechanical": "MECHANICZNE", "modern": "WSPÓŁCZESNA", diff --git a/src/main.ts b/src/main.ts index 0382cfc..b29c074 100644 --- a/src/main.ts +++ b/src/main.ts @@ -12,6 +12,7 @@ import { registerSW } from 'virtual:pwa-register'; const i18n = createI18n({ locale: 'pl', legacy: false, + warnHtmlMessage: false, fallbackLocale: 'pl', messages: { en: enLang, diff --git a/src/store/constants/initFilterStates.ts b/src/store/constants/initFilterStates.ts new file mode 100644 index 0000000..9e2aa83 --- /dev/null +++ b/src/store/constants/initFilterStates.ts @@ -0,0 +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, +}; diff --git a/src/store/stationFiltersStore.ts b/src/store/stationFiltersStore.ts index 8d9f95b..ca48eb9 100644 --- a/src/store/stationFiltersStore.ts +++ b/src/store/stationFiltersStore.ts @@ -4,221 +4,8 @@ import Filter from '../scripts/interfaces/Filter'; import Station from '../scripts/interfaces/Station'; import StorageManager from '../scripts/managers/storageManager'; import { useStore } from './store'; - -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, isOffline = false) => { - 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, availability, controlType, lines, reqLevel, signalType, SUP, authors } = station.generalInfo; - - if (availability == 'abandoned' && filters['abandoned'] && !station.onlineInfo) return returnMode; - - if (availability == 'default' && filters['default']) return returnMode; - - if ( - availability != 'default' && - filters['notDefault'] && - !(availability == 'abandoned' || availability == 'unavailable') - ) - return returnMode; - - if (filters['real'] && lines) return returnMode; - if (filters['fictional'] && !lines) return returnMode; - - if ( - reqLevel + (availability == 'nonPublic' || availability == 'unavailable' || availability == 'abandoned' ? 1 : 0) < - filters['minLevel'] - ) - return returnMode; - - if ( - 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[controlType]) return returnMode; - if (filters[signalType]) return returnMode; - - if (filters['SPK'] && controlType === 'SPK') return returnMode; - if (filters['SCS'] && controlType === 'SCS') return returnMode; - if (filters['SPE'] && controlType === 'SPE') return returnMode; - if (filters['SUP'] && SUP) return returnMode; - if (filters['noSUP'] && !SUP) return returnMode; - - // if (filters['SCS'] && filters['SPK'] && (controlType.includes('SPK') || controlType.includes('SCS'))) - // return returnMode; - - if (filters['mechaniczne'] && controlType == 'mechaniczne') return returnMode; - if (filters['mechaniczne+SPK'] && controlType == 'mechaniczne+SPK') return returnMode; - if (filters['mechaniczne+SCS'] && controlType == 'mechaniczne+SCS') return returnMode; - - if (filters['ręczne'] && controlType == 'ręczne') return returnMode; - if (filters['ręczne+SPK'] && controlType == 'ręczne+SPK') return returnMode; - if (filters['ręczne+SCS'] && controlType == 'ręczne+SCS') return returnMode; - - if (filters['SBL'] && routes.sblRouteNames.length > 0) return returnMode; - if (filters['PBL'] && routes.sblRouteNames.length == 0) return returnMode; - - if ( - filters['authors'].length > 3 && - !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, - 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 { filterInitStates } from './constants/initFilterStates'; +import { filterStations, sortStations } from './utils/filterUtils'; export const useStationFiltersStore = defineStore('stationFiltersStore', { state() { @@ -231,6 +18,12 @@ export const useStationFiltersStore = defineStore('stationFiltersStore', { }; }, + getters: { + areFiltersAtDefault(state) { + return Object.keys(state.filters).every((f) => state.filters[f] === filterInitStates[f]); + }, + }, + actions: { getFilteredStationList(stationList: Station[], region: string): Station[] { return stationList @@ -241,7 +34,7 @@ export const useStationFiltersStore = defineStore('stationFiltersStore', { return station; }) - .filter((station) => filterStations(station, this.filters, this.store.isOffline)) + .filter((station) => filterStations(station, this.filters)) .sort((a, b) => sortStations(a, b, this.sorterActive)); }, @@ -249,10 +42,10 @@ export const useStationFiltersStore = defineStore('stationFiltersStore', { if (!StorageManager.isRegistered('options_saved')) return; this.inputs.options.forEach((option) => { - if (!StorageManager.isRegistered(option.id)) return; - const savedValue = StorageManager.getBooleanValue(option.id); + if (!StorageManager.isRegistered(option.name)) return; + const savedValue = StorageManager.getBooleanValue(option.name); - this.filters[option.id] = savedValue; + this.filters[option.name] = savedValue; option.value = !savedValue; }); diff --git a/src/store/utils/filterUtils.ts b/src/store/utils/filterUtils.ts index 1c19a31..02a3c7b 100644 --- a/src/store/utils/filterUtils.ts +++ b/src/store/utils/filterUtils.ts @@ -1,3 +1,4 @@ +import Filter from '../../scripts/interfaces/Filter'; import Station from '../../scripts/interfaces/Station'; export const sortStations = (a: Station, b: Station, sorter: { index: number; dir: number }) => { @@ -54,131 +55,86 @@ export const sortStations = (a: Station, b: Station, sorter: { index: number; di return a.name.localeCompare(b.name); }; -export const filterStations = (station: Station, filters: { [key: string]: any }, isOffline = false) => { - const returnMode = false; +export const filterStations = (station: Station, filters: Filter) => { + if (!station.onlineInfo && filters['free']) return false; - if ((station.generalInfo?.availability == 'nonPublic' || !station.generalInfo) && filters['nonPublic']) - return returnMode; + if (station.onlineInfo) { + const { statusID, statusTimestamp } = station.onlineInfo; - if (station.onlineInfo?.statusID == 'ending' && filters['ending']) return returnMode; + 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']; - if ( - station.onlineInfo && - station.onlineInfo.statusTimestamp > 0 && - filters['onlineFromHours'] < 8 && - station.onlineInfo.statusTimestamp <= Date.now() + filters['onlineFromHours'] * 3600000 - ) - return returnMode; + 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 (filters['onlineFromHours'] > 0 && station.onlineInfo && station.onlineInfo.statusTimestamp <= 0) - return returnMode; - if (filters['onlineFromHours'] == 8 && station.onlineInfo?.statusID != 'no-limit') return returnMode; + if (isEnding || isOnlineInBounds || isNotSigned || isAFK || isNoSpace || isOccupied) return false; + } - 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?.availability == 'nonPublic' || !station.generalInfo) && filters['nonPublic']) return false; if (station.generalInfo) { - const routes = station.generalInfo.routes; - const availability = station.generalInfo.availability; + const { routes, availability, controlType, lines, reqLevel, signalType, SUP, authors } = station.generalInfo; - if (filters['abandoned'] && availability == 'abandoned' && !station.onlineInfo) return returnMode; + 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['default']) return returnMode; if ( availability != 'default' && filters['notDefault'] && !(availability == 'abandoned' || availability == 'unavailable') ) - return returnMode; + return false; - if (filters['real'] && station.generalInfo.lines != '') return returnMode; - if ( - filters['fictional'] && - station.generalInfo.lines == '' && - availability != 'abandoned' && - availability != 'unavailable' - ) - return returnMode; + if (filters['real'] && lines) return false; + if (filters['fictional'] && !lines) return false; - 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; + 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 returnMode; + return false; + if ( filters['no-2track'] && (routes.twoWayCatenaryRouteNames.length != 0 || routes.twoWayNoCatenaryRouteNames.length != 0) ) - return returnMode; + return false; - if (routes.oneWayCatenaryRouteNames.length < filters['minOneWayCatenary']) return returnMode; - if (routes.oneWayNoCatenaryRouteNames.length < filters['minOneWay']) return returnMode; + if (routes.oneWayCatenaryRouteNames.length < filters['minOneWayCatenary']) return false; + if (routes.oneWayNoCatenaryRouteNames.length < filters['minOneWay']) return false; - if (routes.twoWayCatenaryRouteNames.length < filters['minTwoWayCatenary']) return returnMode; - if (routes.twoWayNoCatenaryRouteNames.length < filters['minTwoWay']) return returnMode; + if (routes.twoWayCatenaryRouteNames.length < filters['minTwoWayCatenary']) return false; + if (routes.twoWayNoCatenaryRouteNames.length < filters['minTwoWay']) return false; - if (filters[station.generalInfo.controlType]) return returnMode; - if (filters[station.generalInfo.signalType]) return returnMode; + if (filters[controlType]) return false; + if (filters[signalType]) return false; - 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['SUP'] && SUP) return false; + if (filters['noSUP'] && !SUP) return false; - 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['SBL'] && routes.sblRouteNames.length > 0) return false; + if (filters['PBL'] && routes.sblRouteNames.length == 0) return false; if ( filters['authors'].length > 3 && - !station.generalInfo.authors?.map((a) => a.toLocaleLowerCase()).includes(filters['authors'].toLocaleLowerCase()) + !authors?.map((a) => a.toLocaleLowerCase()).includes(filters['authors'].toLocaleLowerCase()) ) - return returnMode; + return false; } return true; diff --git a/src/styles/card.scss b/src/styles/card.scss index 0906d22..9739d44 100644 --- a/src/styles/card.scss +++ b/src/styles/card.scss @@ -24,7 +24,8 @@ overflow: hidden; background: #202020e8; - box-shadow: 0 0 15px 5px #303030; + box-shadow: 0 0 15px 0 black; + border: 1px solid #202020e8; width: 95%; max-width: 700px; @@ -44,3 +45,9 @@ cursor: pointer; } } + +@include smallScreen { + .card { + max-height: 85vh; + } +} From 021474cfb0c416f6dcae2e5183801f1c1dfb7e71 Mon Sep 17 00:00:00 2001 From: Spythere Date: Tue, 14 Mar 2023 23:13:37 +0100 Subject: [PATCH 12/17] =?UTF-8?q?fix:=20t=C5=82umaczenia;=20hotfixy?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../SceneryView/SceneryTimetable.vue | 38 ++++++++++--------- src/locales/en.json | 11 ++++-- src/locales/pl.json | 11 ++++-- 3 files changed, 35 insertions(+), 25 deletions(-) diff --git a/src/components/SceneryView/SceneryTimetable.vue b/src/components/SceneryView/SceneryTimetable.vue index ecebc6f..d4179e0 100644 --- a/src/components/SceneryView/SceneryTimetable.vue +++ b/src/components/SceneryView/SceneryTimetable.vue @@ -2,19 +2,22 @@

- icon-timetable  + icon-timetable {{ $t('scenery.timetables') }} -   - {{ station.onlineInfo?.scheduledTrains?.length || '0' }} -  /  - - {{ station.onlineInfo?.scheduledTrains?.filter((train) => train.stopInfo.confirmed).length || '0' }} + + + {{ station.onlineInfo?.scheduledTrains?.length || '0' }} + / + + {{ station.onlineInfo?.scheduledTrains?.filter((train) => train.stopInfo.confirmed).length || '0' }} + + icon-pragotron @@ -22,14 +25,14 @@ icon-tablice

-
+
{{ (i > 0 && '•') || '' }} @@ -297,26 +300,26 @@ export default defineComponent({ } .timetable-header { - display: flex; - align-items: center; - justify-content: center; - flex-direction: column; - margin-top: 0.5em; - position: sticky; top: 0; z-index: 99; background-color: #181818; + padding: 0.5em; + img { - width: 30px; + width: 25px; vertical-align: middle; } h3 { display: flex; + justify-content: center; + flex-wrap: wrap; align-items: center; + + gap: 0.5em; font-size: 1.3em; } } @@ -383,7 +386,8 @@ export default defineComponent({ flex-wrap: wrap; font-size: 1.1em; - padding: 0.75em 0; + + margin-top: 0.5em; button.checkpoint_item { color: #aaa; diff --git a/src/locales/en.json b/src/locales/en.json index 5b5dac2..2d6e1c8 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -168,7 +168,7 @@ "mechanical": "MECHANICAL", "SUP": "SUP (RASP-UZK)", - "noSUP": "NO SUP", + "noSUP": "WITHOUT SUP", "SBL": "AUTOMATIC (SBL)", "PBL": "SEMIAUTOMATIC (PBL)", @@ -331,8 +331,8 @@ "two-way-routes": "Two way routes", "option-active-timetables": "Active timetables", - "option-timetables-history": "Scenery timetables history", - "option-dispatchers-history": "Scenery dispatchers history", + "option-timetables-history": "Timetables history", + "option-dispatchers-history": "Dispatchers history", "timetable-author-title": "Issued by", "timetable-author-unknown": "Author unknown", @@ -347,7 +347,10 @@ "req-level": "all dispatcher levels | dispatcher level {lvl} required | dispatcher level {lvl} required", "history-list-empty": "No recorded scenery history!", - "forum-topic": "Official {name} forum topic" + "forum-topic": "Official {name} forum topic", + + "pragotron-link": "Pragotron view (beta)", + "tablice-link": "Departures board view (by Thundo)" }, "availability": { "title": "Availability", diff --git a/src/locales/pl.json b/src/locales/pl.json index 455c7e9..6d3247c 100644 --- a/src/locales/pl.json +++ b/src/locales/pl.json @@ -329,7 +329,7 @@ "no-scenery": "Ups! Ta sceneria nie istnieje!", "return-btn": "Wróć na stronę główną", "history-btn": "Przejdź do widoku historii dyżurnych ruchu", - "info-btn": "Wróc do widoku scenerii", + "info-btn": "Wróć do widoku scenerii", "authors-title": "Autor scenerii | Autorzy scenerii", "lines-title": "Rzeczywiste linie", "project-title": "Projekt", @@ -337,8 +337,8 @@ "two-way-routes": "Szlaki dwutorowe", "option-active-timetables": "Aktywne rozkłady jazdy", - "option-timetables-history": "Historia rozkładów scenerii", - "option-dispatchers-history": "Historia dyżurów scenerii", + "option-timetables-history": "Historia rozkładów", + "option-dispatchers-history": "Historia dyżurów", "timetable-author-title": "Wydany przez", "timetable-author-unknown": "Autor nieznany", @@ -353,7 +353,10 @@ "req-level": "ogólnodostępna | minimum {lvl} poziom dyżurnego | minimum {lvl} poziom dyżurnego", "history-list-empty": "Brak historii dla tej scenerii!", - "forum-topic": "Oficjalny wątek scenerii {name}" + "forum-topic": "Oficjalny wątek scenerii {name}", + + "pragotron-link": "Otwórz w widoku pragotronu (beta)", + "tablice-link": "Otwórz w widoku tablic stacyjnych (autorstwa Thundo)" }, "availability": { "title": "Dostępność", From 9e1df1fb6143c12d77a0749c0f18bdf9b83fb8b2 Mon Sep 17 00:00:00 2001 From: Spythere Date: Wed, 15 Mar 2023 15:19:50 +0100 Subject: [PATCH 13/17] =?UTF-8?q?filtry=20poci=C4=85g=C3=B3w?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/TrainsView/TrainOptions.vue | 39 ++++++++++++++-------- src/components/TrainsView/TrainTable.vue | 15 +-------- src/constants/Trains/TrainOptionsConsts.ts | 24 +++++++++++-- src/locales/en.json | 10 +++--- src/locales/pl.json | 6 ++-- src/scripts/enums/TrainFilterType.ts | 26 ++++++++++----- src/scripts/managers/trainFilterManager.ts | 27 +++++++++------ src/types/Trains/TrainOptionsTypes.ts | 5 +-- 8 files changed, 96 insertions(+), 56 deletions(-) diff --git a/src/components/TrainsView/TrainOptions.vue b/src/components/TrainsView/TrainOptions.vue index a3be8b1..9552e9f 100644 --- a/src/components/TrainsView/TrainOptions.vue +++ b/src/components/TrainsView/TrainOptions.vue @@ -55,17 +55,23 @@

{{ $t('options.filter-title') }}

+
-
-
+
-
- - -
+
+
+
@@ -80,6 +86,7 @@ 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'; export default defineComponent({ components: { SelectBox, ActionButton }, @@ -101,6 +108,7 @@ export default defineComponent({ return { showOptions: false, lastSelectedFilter: null as TrainFilter | null, + TrainFilterSection, }; }, @@ -183,14 +191,17 @@ export default defineComponent({ margin: 0 auto; } -.filter-option { - button { - color: white; - font-weight: bold; +.options_filters div { + display: flex; + width: 100%; - &[data-disabled='true'] { - color: #888; - } + gap: 0.25em; + margin-bottom: 0.5em; + + button { + width: 100%; + color: $accentCol; + font-weight: bold; } } @@ -201,7 +212,7 @@ export default defineComponent({ margin-top: 1em; - button { + > * { width: 100%; } } diff --git a/src/components/TrainsView/TrainTable.vue b/src/components/TrainsView/TrainTable.vue index 738e9ec..e927e42 100644 --- a/src/components/TrainsView/TrainTable.vue +++ b/src/components/TrainsView/TrainTable.vue @@ -12,10 +12,6 @@ {{ $t('trains.no-trains') }}
-
  • props.trains.findIndex(({ timetableData }) => timetableData && timetableData.routeDistance > 200) != -1 - ), }; }, - computed: { - trainNumbersWithTimeouts() { - return this.store.trainList.filter((train) => train.isTimeout).map((train) => train.trainNo); - }, - }, - activated() { const query = this.$route.query; if (query.trainNo && query.driverName) { @@ -159,7 +146,7 @@ img.train-image { .train { &-list { position: relative; - + @include smallScreen() { width: 100%; } diff --git a/src/constants/Trains/TrainOptionsConsts.ts b/src/constants/Trains/TrainOptionsConsts.ts index fff4f34..0a2f5c9 100644 --- a/src/constants/Trains/TrainOptionsConsts.ts +++ b/src/constants/Trains/TrainOptionsConsts.ts @@ -1,33 +1,53 @@ -import { TrainFilterType } from '../../scripts/enums/TrainFilterType'; +import { TrainFilterSection, TrainFilterType } from '../../scripts/enums/TrainFilterType'; import { TrainFilter } from '../../types/Trains/TrainOptionsTypes'; export const trainFilters: TrainFilter[] = [ { id: TrainFilterType.twr, + section: TrainFilterSection.TRAIN_TYPE, isActive: true, }, { id: TrainFilterType.skr, + section: TrainFilterSection.TRAIN_TYPE, isActive: true, }, + { id: TrainFilterType.passenger, + section: TrainFilterSection.TIMETABLE_TYPE, isActive: true, }, { id: TrainFilterType.freight, + section: TrainFilterSection.TIMETABLE_TYPE, isActive: true, }, { id: TrainFilterType.other, + section: TrainFilterSection.TIMETABLE_TYPE, + isActive: true, + }, + + { + id: TrainFilterType.withComments, + section: TrainFilterSection.COMMENTS, isActive: true, }, { - id: TrainFilterType.comments, + id: TrainFilterType.noComments, + section: TrainFilterSection.COMMENTS, + isActive: true, + }, + + { + id: TrainFilterType.withTimetable, + section: TrainFilterSection.TIMETABLE, isActive: true, }, { id: TrainFilterType.noTimetable, + section: TrainFilterSection.TIMETABLE, isActive: true, }, ]; diff --git a/src/locales/en.json b/src/locales/en.json index 2d6e1c8..cd22c61 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -112,13 +112,15 @@ "sort-timestampFrom": "date", "sort-duration": "duration", - "filter-comments": "COMMENTS", - "filter-twr": "TWR", - "filter-skr": "SKR", + "filter-noComments": "NO COMMENTS", + "filter-withComments": "COMMENTS", + "filter-twr": "HIGH RISK CARGO", + "filter-skr": "EXCEEDED GAUGE", "filter-passenger": "PASSENGER", "filter-freight": "FREIGHT", "filter-other": "OTHER", "filter-noTimetable": "NO TIMETABLE", + "filter-withTimetable": "TIMETABLE", "filter-reset": "RESET FILTERS", "filter-clear": "CLEAR FILTERS", @@ -211,7 +213,7 @@ "no-stations": "No stations to show here!", "scenery-search": "Search for scenery..." }, - "trains": { + "trains": { "no-trains": "No trains to show here!", "loading": "Loading train data...", "offline": "Offline ride", diff --git a/src/locales/pl.json b/src/locales/pl.json index 6d3247c..e26d307 100644 --- a/src/locales/pl.json +++ b/src/locales/pl.json @@ -115,13 +115,15 @@ "sort-delay": "opóźnienie", "sort-comments": "uwagi ekspl.", - "filter-comments": "UWAGI EKSPLOATACYJNE", - "filter-twr": "TWR", + "filter-withComments": "UWAGI EKSPLOATACYJNE", + "filter-noComments": "BEZ UWAG", + "filter-twr": "WYSOKIEGO RYZYKA", "filter-skr": "PRZEKR. SKRAJNIA", "filter-passenger": "PASAŻERSKIE", "filter-freight": "TOWAROWE", "filter-other": "INNE", "filter-noTimetable": "BEZ RJ", + "filter-withTimetable": "ROZKŁAD JAZDY", "filter-reset": "ZRESETUJ FILTRY", "filter-clear": "WYŁĄCZ FILTRY", diff --git a/src/scripts/enums/TrainFilterType.ts b/src/scripts/enums/TrainFilterType.ts index 4ce8b04..dc19774 100644 --- a/src/scripts/enums/TrainFilterType.ts +++ b/src/scripts/enums/TrainFilterType.ts @@ -1,9 +1,19 @@ -export const enum TrainFilterType { - comments = "comments", - twr = "twr", - skr = "skr", - passenger = "passenger", - freight = "freight", - other = "other", - noTimetable = "noTimetable" +export enum TrainFilterSection { + TRAIN_TYPE = 'TRAIN_TYPE', + TIMETABLE_TYPE = 'TIMETABLE_TYPE', + COMMENTS = 'COMMENTS', + TIMETABLE = 'TIMETABLE', +} + +export const enum TrainFilterType { + noComments = 'noComments', + withComments = 'withComments', + + twr = 'twr', + skr = 'skr', + passenger = 'passenger', + freight = 'freight', + other = 'other', + noTimetable = 'noTimetable', + withTimetable = 'withTimetable', } diff --git a/src/scripts/managers/trainFilterManager.ts b/src/scripts/managers/trainFilterManager.ts index 674ab58..758043e 100644 --- a/src/scripts/managers/trainFilterManager.ts +++ b/src/scripts/managers/trainFilterManager.ts @@ -24,26 +24,33 @@ function filterTrainList(trainList: Train[], searchedTrain: string, searchedDriv const isFiltered = filters.every((f) => { if (f.isActive) return true; - if (!train.timetableData) return filters.find((filter) => filter.id == TrainFilterType.noTimetable)!.isActive; - switch (f.id) { - case TrainFilterType.comments: - return !train.timetableData.followingStops.some((stop) => stop.comments); + case TrainFilterType.noTimetable: + return train.timetableData; + + case TrainFilterType.withTimetable: + return !train.timetableData; + + case TrainFilterType.noComments: + return train.timetableData?.followingStops.some((stop) => stop.comments) || false; + + case TrainFilterType.withComments: + return train.timetableData?.followingStops.every((stop) => stop.comments) || true; case TrainFilterType.twr: - return !train.timetableData.TWR; + return !train.timetableData?.TWR || true; case TrainFilterType.skr: - return !train.timetableData.SKR; + return !train.timetableData?.SKR || true; case TrainFilterType.passenger: - return !/^[AMRE]\D{2}$/.test(train.timetableData.category); + return !/^[AMRE]\D{2}$/.test(train.timetableData?.category || ''); case TrainFilterType.freight: - return !train.timetableData.category.startsWith('T'); + return !train.timetableData?.category.startsWith('T'); case TrainFilterType.other: - return !/^[PXZL]\D{2}$/.test(train.timetableData.category); + return !/^[PXZL]\D{2}$/.test(train.timetableData?.category || ''); default: return true; @@ -53,7 +60,7 @@ function filterTrainList(trainList: Train[], searchedTrain: string, searchedDriv return ( (searchedTrain.length > 0 ? train.trainNo.toString().startsWith(searchedTrain) : true) && (searchedDriver.length > 0 ? train.driverName.toLowerCase().startsWith(searchedDriver.toLowerCase()) : true) && - (!train.timetableData ? !train.online : true) && + (!train.timetableData ? train.online : train.timetableData) && isFiltered ); }); diff --git a/src/types/Trains/TrainOptionsTypes.ts b/src/types/Trains/TrainOptionsTypes.ts index b9db0a3..1c28fcb 100644 --- a/src/types/Trains/TrainOptionsTypes.ts +++ b/src/types/Trains/TrainOptionsTypes.ts @@ -1,6 +1,7 @@ -import { TrainFilterType } from "../../scripts/enums/TrainFilterType"; +import { TrainFilterSection, TrainFilterType } from '../../scripts/enums/TrainFilterType'; export interface TrainFilter { id: TrainFilterType; + section: TrainFilterSection; isActive: boolean; -} \ No newline at end of file +} From 4843043c29a4f0da94287644f0948af9426cd4dc Mon Sep 17 00:00:00 2001 From: Spythere Date: Wed, 15 Mar 2023 15:20:28 +0100 Subject: [PATCH 14/17] bump wersji: 1.13.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index a0b2ec1..1a322ec 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "stacjownik", - "version": "1.12.2", + "version": "1.13.0", "private": true, "scripts": { "dev": "vite", From 0a78761928bbf7f62f804034b2ac58c649467f10 Mon Sep 17 00:00:00 2001 From: Spythere Date: Wed, 15 Mar 2023 15:34:36 +0100 Subject: [PATCH 15/17] =?UTF-8?q?hotfix=20t=C5=82umacze=C5=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/locales/en.json | 4 ++-- src/locales/pl.json | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/locales/en.json b/src/locales/en.json index cd22c61..7d57733 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -351,8 +351,8 @@ "forum-topic": "Official {name} forum topic", - "pragotron-link": "Pragotron view (beta)", - "tablice-link": "Departures board view (by Thundo)" + "pragotron-link": "Timetable pallet board (beta)", + "tablice-link": "Timetable summary board (by Thundo)" }, "availability": { "title": "Availability", diff --git a/src/locales/pl.json b/src/locales/pl.json index e26d307..d7d496b 100644 --- a/src/locales/pl.json +++ b/src/locales/pl.json @@ -357,8 +357,8 @@ "forum-topic": "Oficjalny wątek scenerii {name}", - "pragotron-link": "Otwórz w widoku pragotronu (beta)", - "tablice-link": "Otwórz w widoku tablic stacyjnych (autorstwa Thundo)" + "pragotron-link": "Paletowa tablica informacyjna (beta)", + "tablice-link": "Tablica informacyjna zbiorcza (autorstwa Thundo)" }, "availability": { "title": "Dostępność", From e4c5f6a3226a0a6ed50bbabe510da4ec22a3b07b Mon Sep 17 00:00:00 2001 From: Spythere Date: Wed, 15 Mar 2023 17:56:27 +0100 Subject: [PATCH 16/17] =?UTF-8?q?filtry=20poci=C4=85g=C3=B3w?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/TrainsView/TrainOptions.vue | 8 ++++++-- src/constants/Trains/TrainOptionsConsts.ts | 5 +++++ src/locales/en.json | 1 + src/locales/pl.json | 5 +++-- src/scripts/enums/TrainFilterType.ts | 2 ++ src/scripts/managers/trainFilterManager.ts | 15 +++++++++------ src/styles/filters_options.scss | 2 +- src/styles/global.scss | 4 ---- 8 files changed, 27 insertions(+), 15 deletions(-) diff --git a/src/components/TrainsView/TrainOptions.vue b/src/components/TrainsView/TrainOptions.vue index 9552e9f..ea18d4e 100644 --- a/src/components/TrainsView/TrainOptions.vue +++ b/src/components/TrainsView/TrainOptions.vue @@ -195,13 +195,17 @@ export default defineComponent({ display: flex; width: 100%; - gap: 0.25em; + gap: 0.5em; margin-bottom: 0.5em; button { width: 100%; - color: $accentCol; + color: springgreen; font-weight: bold; + + &[data-inactive=true] { + color: #aaa; + } } } diff --git a/src/constants/Trains/TrainOptionsConsts.ts b/src/constants/Trains/TrainOptionsConsts.ts index 0a2f5c9..6f5dc14 100644 --- a/src/constants/Trains/TrainOptionsConsts.ts +++ b/src/constants/Trains/TrainOptionsConsts.ts @@ -12,6 +12,11 @@ export const trainFilters: TrainFilter[] = [ section: TrainFilterSection.TRAIN_TYPE, isActive: true, }, + { + id: TrainFilterType.common, + section: TrainFilterSection.TRAIN_TYPE, + isActive: true, + }, { id: TrainFilterType.passenger, diff --git a/src/locales/en.json b/src/locales/en.json index 7d57733..34e4e54 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -116,6 +116,7 @@ "filter-withComments": "COMMENTS", "filter-twr": "HIGH RISK CARGO", "filter-skr": "EXCEEDED GAUGE", + "filter-common": "NO WARNINGS", "filter-passenger": "PASSENGER", "filter-freight": "FREIGHT", "filter-other": "OTHER", diff --git a/src/locales/pl.json b/src/locales/pl.json index d7d496b..dc321d4 100644 --- a/src/locales/pl.json +++ b/src/locales/pl.json @@ -117,8 +117,9 @@ "filter-withComments": "UWAGI EKSPLOATACYJNE", "filter-noComments": "BEZ UWAG", - "filter-twr": "WYSOKIEGO RYZYKA", - "filter-skr": "PRZEKR. SKRAJNIA", + "filter-twr": "WYS. RYZYKA", + "filter-skr": "SKRAJNIA", + "filter-common": "ZWYKŁE", "filter-passenger": "PASAŻERSKIE", "filter-freight": "TOWAROWE", "filter-other": "INNE", diff --git a/src/scripts/enums/TrainFilterType.ts b/src/scripts/enums/TrainFilterType.ts index dc19774..efb2494 100644 --- a/src/scripts/enums/TrainFilterType.ts +++ b/src/scripts/enums/TrainFilterType.ts @@ -11,6 +11,8 @@ export const enum TrainFilterType { twr = 'twr', skr = 'skr', + common = 'common', + passenger = 'passenger', freight = 'freight', other = 'other', diff --git a/src/scripts/managers/trainFilterManager.ts b/src/scripts/managers/trainFilterManager.ts index 758043e..05c10f9 100644 --- a/src/scripts/managers/trainFilterManager.ts +++ b/src/scripts/managers/trainFilterManager.ts @@ -31,17 +31,20 @@ function filterTrainList(trainList: Train[], searchedTrain: string, searchedDriv case TrainFilterType.withTimetable: return !train.timetableData; - case TrainFilterType.noComments: - return train.timetableData?.followingStops.some((stop) => stop.comments) || false; - case TrainFilterType.withComments: - return train.timetableData?.followingStops.every((stop) => stop.comments) || true; + return !train.timetableData?.followingStops.some((stop) => stop.comments); + + case TrainFilterType.noComments: + return train.timetableData?.followingStops.some((stop) => stop.comments); case TrainFilterType.twr: - return !train.timetableData?.TWR || true; + return !train.timetableData?.TWR; case TrainFilterType.skr: - return !train.timetableData?.SKR || true; + return !train.timetableData?.SKR; + + case TrainFilterType.common: + return train.timetableData?.SKR || train.timetableData?.TWR; case TrainFilterType.passenger: return !/^[AMRE]\D{2}$/.test(train.timetableData?.category || ''); diff --git a/src/styles/filters_options.scss b/src/styles/filters_options.scss index 2daba67..22e2060 100644 --- a/src/styles/filters_options.scss +++ b/src/styles/filters_options.scss @@ -67,7 +67,7 @@ h1.option-title { box-shadow: 0 5px 10px 2px #0f0f0f; width: 97%; - max-width: 500px; + max-width: 550px; padding: 1em; z-index: 100; diff --git a/src/styles/global.scss b/src/styles/global.scss index 5d8daa0..3e4efc6 100644 --- a/src/styles/global.scss +++ b/src/styles/global.scss @@ -202,10 +202,6 @@ button { pointer-events: none; opacity: 0.85; } - - &[data-inactive='true'] { - opacity: 0.55; - } } button.btn--filled { From ff78eba927bde23363b3dccc22728be6d3e0d8c6 Mon Sep 17 00:00:00 2001 From: Spythere Date: Wed, 15 Mar 2023 18:15:01 +0100 Subject: [PATCH 17/17] =?UTF-8?q?hotfixy=20filtr=C3=B3w?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/TrainsView/TrainOptions.vue | 27 ++++++++++++---------- src/styles/filters_options.scss | 6 +++-- 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/src/components/TrainsView/TrainOptions.vue b/src/components/TrainsView/TrainOptions.vue index ea18d4e..a30693e 100644 --- a/src/components/TrainsView/TrainOptions.vue +++ b/src/components/TrainsView/TrainOptions.vue @@ -43,15 +43,14 @@

    {{ $t('options.sort-title') }}

    -
    - -
    +

    {{ $t('options.filter-title') }}

    @@ -191,19 +190,23 @@ export default defineComponent({ margin: 0 auto; } -.options_filters div { +.options_sorters { + display: flex; + grid-template-columns: repeat(3, 1fr); +} + +.options_filters > div { display: flex; width: 100%; gap: 0.5em; - margin-bottom: 0.5em; button { width: 100%; color: springgreen; font-weight: bold; - &[data-inactive=true] { + &[data-inactive='true'] { color: #aaa; } } diff --git a/src/styles/filters_options.scss b/src/styles/filters_options.scss index 22e2060..dc28240 100644 --- a/src/styles/filters_options.scss +++ b/src/styles/filters_options.scss @@ -77,6 +77,7 @@ h1.option-title { display: flex; align-items: center; flex-wrap: wrap; + gap: 0.5em; padding: 0.25em 0.25em 0 0; } @@ -84,17 +85,18 @@ h1.option-title { .options_filters { display: flex; flex-wrap: wrap; + + gap: 0.5em; margin: 0.5em 0 0 0; } .sort-option, .filter-option { - margin: 0.25em 0.25em 0.25em 0; + padding: 0.25em 0.5em; } .sort-option[data-selected='true'] { color: $accentCol; - font-weight: bold; } .filter-option {