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 @@
-
-
-
- {{ category }}
-
-
-
-
-
-
-
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 @@
+
+
+ {
+ e.preventDefault();
+ return false;
+ }
+ "
+ @click.left="toggleFilter(filter)"
+ @keydown.enter="toggleFilter(filter)"
+ @click.right="setFilterOnly(filter)"
+ @keydown.space="setFilterOnly(filter)"
+ >
+ {{ $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 @@