From 414fd5d5b9b576d909203b8dc0c53f08419822ca Mon Sep 17 00:00:00 2001 From: Spythere Date: Thu, 14 Apr 2022 00:21:22 +0200 Subject: [PATCH] =?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/TrainFilters.vue | 67 ------------------- src/components/TrainsView/TrainOptions.vue | 75 ++++++++++++++++++++-- src/locales/en.json | 23 +++++-- src/locales/pl.json | 20 ++++-- src/scripts/enums/TrainFilterType.ts | 9 +++ src/scripts/managers/trainFilterManager.ts | 70 ++++++++++---------- src/views/TrainsView.vue | 41 ++++++++++-- src/vuex.d.ts | 3 +- 8 files changed, 184 insertions(+), 124 deletions(-) delete mode 100644 src/components/TrainsView/TrainFilters.vue create mode 100644 src/scripts/enums/TrainFilterType.ts diff --git a/src/components/TrainsView/TrainFilters.vue b/src/components/TrainsView/TrainFilters.vue deleted file mode 100644 index 96a1488..0000000 --- a/src/components/TrainsView/TrainFilters.vue +++ /dev/null @@ -1,67 +0,0 @@ - - - - - diff --git a/src/components/TrainsView/TrainOptions.vue b/src/components/TrainsView/TrainOptions.vue index 400b917..db4b2f6 100644 --- a/src/components/TrainsView/TrainOptions.vue +++ b/src/components/TrainsView/TrainOptions.vue @@ -26,11 +26,37 @@ + +
+ + {{ $t(`trains.filter-${filter.id}`) }} + + + + {{ $t('trains.filter-reset') }} + +
@@ -108,6 +145,7 @@ export default defineComponent({ width: 100%; } } + .options { &_wrapper { display: flex; @@ -178,4 +216,31 @@ export default defineComponent({ width: 1em; } } + +.filters { + display: flex; + flex-wrap: wrap; + + @include smallScreen() { + justify-content: center; + } +} + +.filter { + background: #333; + padding: 0.2em 0.25em; + margin: 0.25em 0.25em 0 0; + font-weight: bold; + + cursor: pointer; + color: gray; + + &.active { + color: gold; + } + + &.reset-btn { + color: salmon; + } +} diff --git a/src/locales/en.json b/src/locales/en.json index 3c8e238..2bf4c0e 100644 --- a/src/locales/en.json +++ b/src/locales/en.json @@ -8,7 +8,7 @@ "error": "An error occured while loading data!", "no-result": "No results for current search!" }, - "data-status": { + "data-status": { "S1a-connection": "S1a signal
Cannot connect with SWDR API service!", "S1a-sceneries": "S1a signal
Cannot load online stations data!", "S2": "S2 signal
All data loaded successfully!", @@ -66,7 +66,7 @@ "filters": { "endingStatus": "ENDS SOON", "afkStatus": "AFK", - "noSpaceStatus":"NO SPACE", + "noSpaceStatus": "NO SPACE", "unavailableStatus": "UNAVAILABLE", "title": "STATION FILTER", @@ -145,6 +145,15 @@ "option-delay": "current delay", "option-comments": "comments", + "filter-comments": "comments", + "filter-twr": "TWR", + "filter-skr": "SKR", + "filter-passenger": "passenger", + "filter-freight": "freight", + "filter-other": "other", + "filter-noTimetable": "no timetable", + "filter-reset": "X RESET", + "sorter-prefix": "Sort: ", "search-train": "Train no.", "search-driver": "Driver name", @@ -166,7 +175,7 @@ "loco-diesel": "Diesel locomotive", "timetable-comments": "Exploitation comments available for this train", "comment": "Exploitation comments for: ", - "table-limit": "For performance reasons there's a limit of 10 trains shown at the same time." + "table-limit": "For performance reasons there's a limit of 10 trains shown at the same time." }, "journal": { "title": "DISPATCHER HISTORY", @@ -175,8 +184,8 @@ "search-train": "Train no.", "search-driver": "Driver name", - - "sort-prefix": "Sort: ", + + "sort-prefix": "Sort: ", "option-distance": "distance", "option-total-stops": "total stops", @@ -206,7 +215,7 @@ "begins": "BEGINS HERE", "terminates": "TERMINATES\nHERE" }, - "history": { + "history": { "title": "TIMETABLE JOURNAL", "search": "Search", "search-train": "Train no.", @@ -219,4 +228,4 @@ "timetable-fulfilled": "FULFILLED", "timetable-abandoned": "ABANDONED" } -} \ No newline at end of file +} diff --git a/src/locales/pl.json b/src/locales/pl.json index 102db25..e604d1a 100644 --- a/src/locales/pl.json +++ b/src/locales/pl.json @@ -9,7 +9,7 @@ "no-result": "Brak wyników o podanych kryteriach!" }, - "data-status": { + "data-status": { "S1a-connection": "Sygnał S1a
Błąd podczas próby połączenia się z serwisem SWDR!", "S1a-sceneries": "Sygnał S1a
Błąd podczas pobierania danych o sceneriach online!", "S2": "Sygnał S2
Pomyślnie załadowano dane!", @@ -67,7 +67,7 @@ "filters": { "endingStatus": "KOŃCZY", "afkStatus": "Z/W", - "noSpaceStatus":"BRAK MIEJSCA", + "noSpaceStatus": "BRAK MIEJSCA", "unavailableStatus": "NIEDOSTĘPNY", "title": "FILTRUJ STACJE", @@ -146,6 +146,16 @@ "option-delay": "opóźnienie", "option-comments": "uwagi ekspl.", + "filter-comments": "uwagi ekspl.", + "filter-twr": "TWR", + "filter-skr": "SKR", + "filter-passenger": "pasażerskie", + "filter-freight": "towarowe", + "filter-other": "inne", + "filter-noTimetable": "bez RJ", + "filter-reset": "X RESETUJ", + + "sorter-prefix": "Sortuj: ", "search-train": "Numer pociągu", "search-driver": "Nick maszynisty", @@ -167,7 +177,7 @@ "loco-diesel": "Spalinowóz", "timetable-comments": "Pociąg z uwagami eksploatacyjnymi", "comment": "Uwagi eksploatacyjne dla: ", - "table-limit": "Dla płynności działania strony pokazanych jest tylko 10 pociągów zgodnie z wybranymi filtrami." + "table-limit": "Dla płynności działania strony pokazanych jest tylko 10 pociągów zgodnie z wybranymi filtrami." }, "journal": { "title": "HISTORIA DYŻURÓW", @@ -177,7 +187,7 @@ "search-train": "Numer pociągu", "search-driver": "Nick maszynisty", - "sort-prefix": "Sortuj: ", + "sort-prefix": "Sortuj: ", "option-distance": "kilometraż", "option-total-stops": "stacje", @@ -220,4 +230,4 @@ "timetable-fulfilled": "WYPEŁNIONY", "timetable-abandoned": "PORZUCONY" } -} \ No newline at end of file +} diff --git a/src/scripts/enums/TrainFilterType.ts b/src/scripts/enums/TrainFilterType.ts new file mode 100644 index 0000000..4ce8b04 --- /dev/null +++ b/src/scripts/enums/TrainFilterType.ts @@ -0,0 +1,9 @@ +export const enum TrainFilterType { + comments = "comments", + twr = "twr", + skr = "skr", + passenger = "passenger", + freight = "freight", + other = "other", + noTimetable = "noTimetable" +} diff --git a/src/scripts/managers/trainFilterManager.ts b/src/scripts/managers/trainFilterManager.ts index b9afeba..69c2eee 100644 --- a/src/scripts/managers/trainFilterManager.ts +++ b/src/scripts/managers/trainFilterManager.ts @@ -1,4 +1,5 @@ import { TrainFilter } from "vue"; +import { TrainFilterType } from "../enums/TrainFilterType"; import Train from "../interfaces/Train"; import TrainStop from "../interfaces/TrainStop"; @@ -19,11 +20,41 @@ function currentDelay(stops: TrainStop[] | undefined) { }; function filterTrainList(trainList: Train[], searchedTrain: string, searchedDriver: string, filters: TrainFilter[]) { - return trainList.filter( - (train) => - (searchedTrain.length > 0 ? train.trainNo.toString().startsWith(searchedTrain) : true) && - (searchedDriver.length > 0 ? train.driverName.toLowerCase().startsWith(searchedDriver.toLowerCase()) : true) + (train) => { + 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.twr: + return !train.timetableData.TWR; + + case TrainFilterType.skr: + return !train.timetableData.SKR; + + case TrainFilterType.passenger: + return !/^[AMRE]\D{2}$/.test(train.timetableData.category); + + case TrainFilterType.freight: + return !train.timetableData.category.startsWith('T'); + + case TrainFilterType.other: + return !/^[PXZ]\D{2}$/.test(train.timetableData.category); + + default: + return true; + } + }) + + return (searchedTrain.length > 0 ? train.trainNo.toString().startsWith(searchedTrain) : true) && + (searchedDriver.length > 0 ? train.driverName.toLowerCase().startsWith(searchedDriver.toLowerCase()) : true) && isFiltered + } + ); } @@ -78,34 +109,7 @@ export function filteredTrainList( sorterActive: { id: string; dir: number }, filters: TrainFilter[] ) { - let finalTrainList: Train[] = []; - const filtered = filterTrainList(trainList, searchedTrain, searchedDriver, filters); - - switch (sorterActive.id) { - case 'comments': - const trainsSortedByComments = filtered - .sort((a, b) => { - const commentsA = a.timetableData?.followingStops.some((s) => s.comments) ? 1 : 0; - const commentsB = b.timetableData?.followingStops.some((s) => s.comments) ? 1 : 0; - - return commentsB - commentsA; - }); - - const trainsWithComments = trainsSortedByComments.filter((train) => - train.timetableData?.followingStops.some((s) => s.comments) - ); - - const trainsWithoutComments = trainsSortedByComments.slice(trainsWithComments.length); - - finalTrainList.push(...trainsWithComments); - finalTrainList.push(...sortTrainList(trainsWithoutComments, sorterActive)); - break; - - default: - finalTrainList.push(...sortTrainList(filtered, sorterActive)); - break; - } - - return finalTrainList; + const filtered = filterTrainList(trainList, searchedTrain, searchedDriver, filters); + return [...sortTrainList(filtered, sorterActive)]; }; \ No newline at end of file diff --git a/src/views/TrainsView.vue b/src/views/TrainsView.vue index 03a951d..4b9b78e 100644 --- a/src/views/TrainsView.vue +++ b/src/views/TrainsView.vue @@ -14,7 +14,7 @@