mirror of
https://github.com/Spythere/stacjownik.git
synced 2026-05-03 05:18:11 +00:00
fix: filtrowanie pociągów offline
This commit is contained in:
@@ -2,26 +2,24 @@
|
|||||||
<div class="train-info" tabindex="0">
|
<div class="train-info" tabindex="0">
|
||||||
<section class="train-route">
|
<section class="train-route">
|
||||||
<div class="train_general">
|
<div class="train_general">
|
||||||
<span>
|
<b class="warning-timeout" v-if="train.isTimeout" :title="$t('trains.timeout')">?</b>
|
||||||
<span class="timetable-id" v-if="train.timetableData">#{{ train.timetableData.timetableId }}</span>
|
<span class="timetable-id" v-if="train.timetableData">#{{ train.timetableData.timetableId }}</span>
|
||||||
|
|
||||||
<span class="timetable_warnings">
|
<span class="timetable_warnings" v-if="train.timetableData?.TWR || train.timetableData?.SKR">
|
||||||
<span class="train-badge twr" v-if="train.timetableData?.TWR">TWR</span>
|
<span class="train-badge twr" v-if="train.timetableData?.TWR">TWR</span>
|
||||||
<span class="train-badge skr" v-if="train.timetableData?.SKR">SKR</span>
|
<span class="train-badge skr" v-if="train.timetableData?.SKR">SKR</span>
|
||||||
</span>
|
|
||||||
<strong class="timetable-category" v-if="train.timetableData">
|
|
||||||
{{ train.timetableData.category }}
|
|
||||||
</strong>
|
|
||||||
<strong class="train-number"> {{ train.trainNo }}</strong>
|
|
||||||
|
|
|
||||||
<!-- <span class="train-driver" :class="{ supporter: train.isSupporter }">{{ train.driverName }}</span> -->
|
|
||||||
{{ train.driverName }} |
|
|
||||||
<b :style="calculateTextExpStyle(train.driverLevel)">
|
|
||||||
{{ train.driverLevel < 2 ? 'L' : `${train.driverLevel} lvl` }}
|
|
||||||
</b>
|
|
||||||
|
|
||||||
<b class="warning-timeout" v-if="train.isTimeout" :title="$t('trains.timeout')">?</b>
|
|
||||||
</span>
|
</span>
|
||||||
|
|
||||||
|
<strong>
|
||||||
|
<span v-if="train.timetableData">{{ train.timetableData.category }} </span>
|
||||||
|
<span class="train-number">{{ train.trainNo }}</span>
|
||||||
|
</strong>
|
||||||
|
<span>|</span>
|
||||||
|
<span>{{ train.driverName }}</span>
|
||||||
|
<span>|</span>
|
||||||
|
<b :style="calculateTextExpStyle(train.driverLevel, train.isSupporter)">
|
||||||
|
{{ train.driverLevel < 2 ? 'L' : `${train.driverLevel} lvl` }}
|
||||||
|
</b>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="timetable_route" v-if="train.timetableData">
|
<div class="timetable_route" v-if="train.timetableData">
|
||||||
@@ -44,9 +42,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="timetable_progress" style="margin-top: 0.5em" v-if="train.timetableData">
|
<div class="timetable_progress" style="margin-top: 0.5em" v-if="train.timetableData">
|
||||||
<!-- <span> </span> -->
|
|
||||||
<span class="timetable_progress-bar">
|
<span class="timetable_progress-bar">
|
||||||
<!-- {{ confirmedPercentage(train.timetableData.followingStops) }}% -->
|
|
||||||
<span class="bar-bg"></span>
|
<span class="bar-bg"></span>
|
||||||
<span
|
<span
|
||||||
class="bar-fg"
|
class="bar-fg"
|
||||||
@@ -154,7 +150,6 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
|
|
||||||
.timetable-id {
|
.timetable-id {
|
||||||
margin-right: 0.3em;
|
|
||||||
color: #d2d2d2;
|
color: #d2d2d2;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -164,11 +159,7 @@ export default defineComponent({
|
|||||||
display: inline-block;
|
display: inline-block;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
|
|
||||||
width: 1.25em;
|
padding: 0 0.25em;
|
||||||
height: 1.25em;
|
|
||||||
border-radius: 50%;
|
|
||||||
|
|
||||||
margin-left: 0.25em;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.timetable_stops {
|
.timetable_stops {
|
||||||
@@ -179,16 +170,19 @@ export default defineComponent({
|
|||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
flex-wrap: wrap;
|
flex-wrap: wrap;
|
||||||
|
|
||||||
|
gap: 0.25em;
|
||||||
}
|
}
|
||||||
.train-status-badges {
|
.train-status-badges {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-wrap: wrap;
|
flex-wrap: wrap;
|
||||||
|
|
||||||
|
gap: 0.25em;
|
||||||
}
|
}
|
||||||
|
|
||||||
.train-badge {
|
.train-badge {
|
||||||
padding: 0.15em 0.35em;
|
padding: 0.1em 0.2em;
|
||||||
margin-right: 0.3em;
|
border-radius: 0.2em;
|
||||||
|
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
|
|
||||||
font-size: 0.9em;
|
font-size: 0.9em;
|
||||||
@@ -202,7 +196,7 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
|
|
||||||
&.offline {
|
&.offline {
|
||||||
background-color: #b83b2d;
|
background-color: #9c362b;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -221,6 +215,9 @@ export default defineComponent({
|
|||||||
}
|
}
|
||||||
|
|
||||||
.timetable_warnings {
|
.timetable_warnings {
|
||||||
|
display: flex;
|
||||||
|
gap: 0.2em;
|
||||||
|
|
||||||
color: black;
|
color: black;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -37,6 +37,10 @@ export const sorterOptions = [
|
|||||||
id: 'distance',
|
id: 'distance',
|
||||||
value: 'kilometraż',
|
value: 'kilometraż',
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
id: 'id',
|
||||||
|
value: 'id rozkładu',
|
||||||
|
},
|
||||||
{
|
{
|
||||||
id: 'progress',
|
id: 'progress',
|
||||||
value: 'przebyta trasa',
|
value: 'przebyta trasa',
|
||||||
|
|||||||
@@ -103,6 +103,7 @@
|
|||||||
"sort-timetable": "train no.",
|
"sort-timetable": "train no.",
|
||||||
"sort-progress": "route progress",
|
"sort-progress": "route progress",
|
||||||
"sort-delay": "current delay",
|
"sort-delay": "current delay",
|
||||||
|
"sort-id": "timetable id",
|
||||||
|
|
||||||
"sort-total-stops": "total stops",
|
"sort-total-stops": "total stops",
|
||||||
"sort-beginDate": "date",
|
"sort-beginDate": "date",
|
||||||
|
|||||||
@@ -104,6 +104,7 @@
|
|||||||
"sort-timetableId": "ID rozkładu",
|
"sort-timetableId": "ID rozkładu",
|
||||||
"sort-timestampFrom": "data",
|
"sort-timestampFrom": "data",
|
||||||
"sort-duration": "czas dyżuru",
|
"sort-duration": "czas dyżuru",
|
||||||
|
"sort-id": "id rozkładu",
|
||||||
|
|
||||||
"sort-mass": "masa",
|
"sort-mass": "masa",
|
||||||
"sort-speed": "prędkość",
|
"sort-speed": "prędkość",
|
||||||
|
|||||||
@@ -11,10 +11,10 @@ export default defineComponent({
|
|||||||
return `background-color: ${bgColor}; color: ${fontColor}; ${boxShadow};`;
|
return `background-color: ${bgColor}; color: ${fontColor}; ${boxShadow};`;
|
||||||
},
|
},
|
||||||
|
|
||||||
calculateTextExpStyle(exp: number): string {
|
calculateTextExpStyle(exp: number, isSupporter = false): string {
|
||||||
const textColor = exp > -1 ? (exp < 2 ? '#26B0D9' : `hsl(${-exp * 5 + 100}, 75%, 50%)`) : '#666';
|
const textColor = exp > -1 ? (exp < 2 ? '#26B0D9' : `hsl(${-exp * 5 + 100}, 75%, 50%)`) : '#666';
|
||||||
|
|
||||||
return `color: ${textColor};`;
|
return `color: ${textColor}; ${isSupporter ? 'text-shadow: 0 0 10px ' + textColor : ''};`;
|
||||||
},
|
},
|
||||||
|
|
||||||
statusClasses(occupiedTo: string) {
|
statusClasses(occupiedTo: string) {
|
||||||
|
|||||||
@@ -1,115 +1,120 @@
|
|||||||
import { TrainFilter } from "../../types/Trains/TrainOptionsTypes";
|
import { TrainFilter } from '../../types/Trains/TrainOptionsTypes';
|
||||||
import { TrainFilterType } from "../enums/TrainFilterType";
|
import { TrainFilterType } from '../enums/TrainFilterType';
|
||||||
import Train from "../interfaces/Train";
|
import Train from '../interfaces/Train';
|
||||||
import TrainStop from "../interfaces/TrainStop";
|
import TrainStop from '../interfaces/TrainStop';
|
||||||
|
|
||||||
function confirmedPercentage(stops: TrainStop[] | undefined) {
|
function confirmedPercentage(stops: TrainStop[] | undefined) {
|
||||||
if (!stops) return -1;
|
if (!stops) return -1;
|
||||||
|
|
||||||
return Number(((stops.filter((stop) => stop.confirmed).length / stops.length) * 100).toFixed(0));
|
return Number(((stops.filter((stop) => stop.confirmed).length / stops.length) * 100).toFixed(0));
|
||||||
};
|
}
|
||||||
|
|
||||||
function currentDelay(stops: TrainStop[] | undefined) {
|
function currentDelay(stops: TrainStop[] | undefined) {
|
||||||
if (!stops) return -Infinity;
|
if (!stops) return -Infinity;
|
||||||
|
|
||||||
const delay =
|
const delay =
|
||||||
stops.find((stop, i) => (i == 0 && !stop.confirmed) || (i > 0 && stops[i - 1].confirmed && !stop.confirmed))
|
stops.find((stop, i) => (i == 0 && !stop.confirmed) || (i > 0 && stops[i - 1].confirmed && !stop.confirmed))
|
||||||
?.departureDelay || 0;
|
?.departureDelay || 0;
|
||||||
|
|
||||||
return delay;
|
return delay;
|
||||||
};
|
}
|
||||||
|
|
||||||
function filterTrainList(trainList: Train[], searchedTrain: string, searchedDriver: string, filters: TrainFilter[]) {
|
function filterTrainList(trainList: Train[], searchedTrain: string, searchedDriver: string, filters: TrainFilter[]) {
|
||||||
return trainList.filter(
|
return trainList.filter((train) => {
|
||||||
(train) => {
|
const isFiltered = filters.every((f) => {
|
||||||
const isFiltered = filters.every(f => {
|
if (f.isActive) return true;
|
||||||
if (f.isActive) return true;
|
|
||||||
|
|
||||||
if (!train.timetableData) return filters.find(filter => filter.id == TrainFilterType.noTimetable)!.isActive;
|
if (!train.timetableData) return filters.find((filter) => filter.id == TrainFilterType.noTimetable)!.isActive;
|
||||||
|
|
||||||
switch (f.id) {
|
switch (f.id) {
|
||||||
case TrainFilterType.comments:
|
case TrainFilterType.comments:
|
||||||
return !train.timetableData.followingStops.some(stop => stop.comments);
|
return !train.timetableData.followingStops.some((stop) => stop.comments);
|
||||||
|
|
||||||
case TrainFilterType.twr:
|
case TrainFilterType.twr:
|
||||||
return !train.timetableData.TWR;
|
return !train.timetableData.TWR;
|
||||||
|
|
||||||
case TrainFilterType.skr:
|
case TrainFilterType.skr:
|
||||||
return !train.timetableData.SKR;
|
return !train.timetableData.SKR;
|
||||||
|
|
||||||
case TrainFilterType.passenger:
|
case TrainFilterType.passenger:
|
||||||
return !/^[AMRE]\D{2}$/.test(train.timetableData.category);
|
return !/^[AMRE]\D{2}$/.test(train.timetableData.category);
|
||||||
|
|
||||||
case TrainFilterType.freight:
|
case TrainFilterType.freight:
|
||||||
return !train.timetableData.category.startsWith('T');
|
return !train.timetableData.category.startsWith('T');
|
||||||
|
|
||||||
case TrainFilterType.other:
|
case TrainFilterType.other:
|
||||||
return !/^[PXZL]\D{2}$/.test(train.timetableData.category);
|
return !/^[PXZL]\D{2}$/.test(train.timetableData.category);
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
})
|
});
|
||||||
|
|
||||||
return (searchedTrain.length > 0 ? train.trainNo.toString().startsWith(searchedTrain) : true) &&
|
|
||||||
(searchedDriver.length > 0 ? train.driverName.toLowerCase().startsWith(searchedDriver.toLowerCase()) : true) && isFiltered
|
|
||||||
}
|
|
||||||
|
|
||||||
|
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) &&
|
||||||
|
isFiltered
|
||||||
);
|
);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function sortTrainList(trainList: Train[], sorterActive: { id: string; dir: number }) {
|
function sortTrainList(trainList: Train[], sorterActive: { id: string; dir: number }) {
|
||||||
return trainList.sort((a: Train, b: Train) => {
|
return trainList.sort((a: Train, b: Train) => {
|
||||||
switch (sorterActive.id) {
|
switch (sorterActive.id) {
|
||||||
case 'mass':
|
case 'id':
|
||||||
if (a.mass > b.mass) return sorterActive.dir;
|
if ((a.timetableData?.timetableId || -1) > (b.timetableData?.timetableId || -1)) return sorterActive.dir;
|
||||||
return -sorterActive.dir;
|
|
||||||
|
|
||||||
case 'distance':
|
return -sorterActive.dir;
|
||||||
if ((a.timetableData?.routeDistance || -1) > (b.timetableData?.routeDistance || -1)) return sorterActive.dir;
|
|
||||||
|
|
||||||
return -sorterActive.dir;
|
case 'mass':
|
||||||
|
if (a.mass > b.mass) return sorterActive.dir;
|
||||||
|
return -sorterActive.dir;
|
||||||
|
|
||||||
case 'progress':
|
case 'distance':
|
||||||
if (confirmedPercentage(a.timetableData?.followingStops) > confirmedPercentage(b.timetableData?.followingStops))
|
if ((a.timetableData?.routeDistance || -1) > (b.timetableData?.routeDistance || -1)) return sorterActive.dir;
|
||||||
return sorterActive.dir;
|
|
||||||
|
|
||||||
return -sorterActive.dir;
|
return -sorterActive.dir;
|
||||||
|
|
||||||
case 'delay':
|
case 'progress':
|
||||||
if (currentDelay(a.timetableData?.followingStops) > currentDelay(b.timetableData?.followingStops))
|
if (confirmedPercentage(a.timetableData?.followingStops) > confirmedPercentage(b.timetableData?.followingStops))
|
||||||
return sorterActive.dir;
|
return sorterActive.dir;
|
||||||
|
|
||||||
return -sorterActive.dir;
|
return -sorterActive.dir;
|
||||||
|
|
||||||
case 'speed':
|
case 'delay':
|
||||||
if (a.speed > b.speed) return sorterActive.dir;
|
if (currentDelay(a.timetableData?.followingStops) > currentDelay(b.timetableData?.followingStops))
|
||||||
return -sorterActive.dir;
|
return sorterActive.dir;
|
||||||
|
|
||||||
case 'timetable':
|
return -sorterActive.dir;
|
||||||
if (a.trainNo > b.trainNo) return sorterActive.dir;
|
|
||||||
return -sorterActive.dir;
|
|
||||||
|
|
||||||
case 'length':
|
case 'speed':
|
||||||
if (a.length > b.length) return sorterActive.dir;
|
if (a.speed > b.speed) return sorterActive.dir;
|
||||||
return -sorterActive.dir;
|
return -sorterActive.dir;
|
||||||
|
|
||||||
default:
|
case 'timetable':
|
||||||
break;
|
if (a.trainNo > b.trainNo) return sorterActive.dir;
|
||||||
}
|
return -sorterActive.dir;
|
||||||
|
|
||||||
return 0;
|
case 'length':
|
||||||
});
|
if (a.length > b.length) return sorterActive.dir;
|
||||||
|
return -sorterActive.dir;
|
||||||
|
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
export function filteredTrainList(
|
export function filteredTrainList(
|
||||||
trainList: Train[],
|
trainList: Train[],
|
||||||
searchedTrain: string,
|
searchedTrain: string,
|
||||||
searchedDriver: string,
|
searchedDriver: string,
|
||||||
sorterActive: { id: string; dir: number },
|
sorterActive: { id: string; dir: number },
|
||||||
filters: TrainFilter[]
|
filters: TrainFilter[]
|
||||||
) {
|
) {
|
||||||
|
const filtered = filterTrainList(trainList, searchedTrain, searchedDriver, filters);
|
||||||
const filtered = filterTrainList(trainList, searchedTrain, searchedDriver, filters);
|
return [...sortTrainList(filtered, sorterActive)];
|
||||||
return [...sortTrainList(filtered, sorterActive)];
|
}
|
||||||
};
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
<section class="trains-view">
|
<section class="trains-view">
|
||||||
<div class="trains_wrapper">
|
<div class="trains_wrapper">
|
||||||
<TrainOptions
|
<TrainOptions
|
||||||
:sorter-option-ids="['distance', 'progress', 'delay', 'mass', 'speed', 'length']"
|
:sorter-option-ids="['distance', 'id', 'progress', 'delay', 'mass', 'speed', 'length']"
|
||||||
:current-options-active="currentOptionsActive"
|
:current-options-active="currentOptionsActive"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user