Merge pull request #125 from Spythere/development

v1.29.1
This commit is contained in:
Spythere
2025-03-24 14:58:12 +01:00
committed by GitHub
12 changed files with 308 additions and 172 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
{
"name": "stacjownik",
"version": "1.29.0",
"version": "1.29.1",
"private": true,
"type": "module",
"scripts": {
+10 -77
View File
@@ -1,69 +1,11 @@
<template>
<div class="scenery-info">
<section>
<div class="scenery-info-general">
<SceneryInfoIcons :station="station" />
<SceneryInfoIcons :station="station" />
<SceneryInfoGeneral :station="station" />
<SceneryInfoRoutes v-if="station" :station="station" />
<SceneryInfoAuthors :station="station" />
<div class="scenery-general-list" v-if="station?.generalInfo">
<span>
<b>{{ $t('availability.title') }}:</b>
{{ $t(`availability.${station.generalInfo.availability}`) }}
<span v-if="station.generalInfo.reqLevel > -1">
-
{{
$t(
'scenery.req-level',
{ lvl: station.generalInfo.reqLevel },
station.generalInfo.reqLevel
)
}}
</span>
</span>
<span>
&bull; <b>{{ $t('controls.title') }}:</b>
{{ $t(`controls.${station.generalInfo.controlType}`) }}
</span>
<span>
&bull; <b>{{ $t('signals.title') }}:</b>
{{ $t(`signals.${station.generalInfo.signalType}`) }}
</span>
<span v-if="station.generalInfo.lines">
&bull; <b>{{ $t('scenery.lines-title') }}:</b> {{ station.generalInfo.lines }}
</span>
<span v-if="station.generalInfo.project">
&bull; <b>{{ $t('scenery.project-title') }}: </b>
<a
style="color: salmon; text-decoration: underline; font-weight: bold"
:href="station.generalInfo.projectUrl"
target="_blank"
>
{{ station.generalInfo.project }}
</a>
</span>
</div>
<SceneryInfoRoutes v-if="station" :station="station" />
<div
class="scenery-authors"
v-if="station?.generalInfo?.authors && station.generalInfo.authors.length > 0"
>
<b>
{{
$t(
'scenery.authors-title',
{ authors: station.generalInfo.authors.length },
station.generalInfo.authors.length
)
}}:
</b>
{{ station.generalInfo.authors.join(', ') }}
</div>
</div>
<div style="margin: 2em 0; height: 2px; background-color: white"></div>
@@ -89,15 +31,20 @@ import SceneryInfoIcons from './SceneryInfo/SceneryInfoIcons.vue';
import SceneryInfoUserList from './SceneryInfo/SceneryInfoUserList.vue';
import SceneryInfoSpawnList from './SceneryInfo/SceneryInfoSpawnList.vue';
import SceneryInfoRoutes from './SceneryInfo/SceneryInfoRoutes.vue';
import SceneryInfoGeneral from './SceneryInfo/SceneryInfoGeneral.vue';
import SceneryInfoAuthors from "./SceneryInfo/SceneryInfoAuthors.vue";
import { ActiveScenery, Station } from '../../typings/common';
export default defineComponent({
components: {
SceneryInfoDispatcher,
SceneryInfoGeneral,
SceneryInfoIcons,
SceneryInfoAuthors,
SceneryInfoUserList,
SceneryInfoSpawnList,
SceneryInfoRoutes
SceneryInfoRoutes,
},
props: {
station: {
@@ -134,20 +81,6 @@ h3.section-header {
margin-top: 1em;
}
.scenery-info-general {
margin-top: 1em;
}
.scenery-general-list {
display: flex;
justify-content: center;
flex-wrap: wrap;
span {
margin: 0 0.15em;
}
}
.scenery-topic a {
font-weight: bold;
}
@@ -0,0 +1,32 @@
<template>
<section
class="scenery-authors"
v-if="station?.generalInfo?.authors && station.generalInfo.authors.length > 0"
>
<b>
{{
$t(
'scenery.authors-title',
{ authors: station.generalInfo.authors.length },
station.generalInfo.authors.length
)
}}:
</b>
{{ station.generalInfo.authors.join(', ') }}
</section>
</template>
<script lang="ts">
import { defineComponent, PropType } from 'vue';
import { Station } from '../../../typings/common';
export default defineComponent({
props: {
station: {
type: Object as PropType<Station>
}
}
});
</script>
<style scoped></style>
@@ -0,0 +1,92 @@
<template>
<section class="info-general">
<div v-if="station?.generalInfo === undefined">
<b>{{ $t('scenery.no-data') }}</b>
</div>
<div v-else>
<span>
<b>{{ $t('availability.title') }}:</b>
{{ $t(`availability.${station.generalInfo.availability}`) }}
<span v-if="station.generalInfo.reqLevel > -1">
-
{{
$t(
'scenery.req-level',
{ lvl: station.generalInfo.reqLevel },
station.generalInfo.reqLevel
)
}}
</span>
</span>
<span>
&bull; <b>{{ $t('controls.title') }}:</b>
{{ $t(`controls.${station.generalInfo.controlType}`) }}
</span>
<span>
&bull; <b>{{ $t('signals.title') }}:</b>
{{ $t(`signals.${station.generalInfo.signalType}`) }}
</span>
<span v-if="station.generalInfo.lines">
&bull; <b>{{ $t('scenery.lines-title') }}:</b> {{ station.generalInfo.lines }}
</span>
<span v-if="station.generalInfo.project">
&bull; <b>{{ $t('scenery.project-title') }}: </b>
<a
style="color: salmon; text-decoration: underline; font-weight: bold"
:href="station.generalInfo.projectUrl"
target="_blank"
>
{{ station.generalInfo.project }}
</a>
</span>
<span v-if="additionalTools.length != 0">
&bull; <b>{{ $t('scenery.additional-tools-title') }}: </b>
{{ additionalTools.join(', ') }}
</span>
</div>
</section>
</template>
<script lang="ts">
import { defineComponent, PropType } from 'vue';
import { Station } from '../../../typings/common';
export default defineComponent({
props: {
station: {
type: Object as PropType<Station>
}
},
computed: {
additionalTools() {
if (this.$props.station?.generalInfo === undefined) return [];
let tools = [];
if (this.$props.station.generalInfo.SUP) tools.push('SUP');
if (this.$props.station.generalInfo.ASDEK) tools.push('ASDEK');
return tools;
}
}
});
</script>
<style lang="scss" scoped>
.info-general {
display: flex;
justify-content: center;
flex-wrap: wrap;
div {
margin: 0 0.15em;
}
}
</style>
@@ -17,25 +17,6 @@
{{ station?.generalInfo.reqLevel >= 2 ? station?.generalInfo.reqLevel : 'L' }}
</span>
<span
v-if="station?.generalInfo"
class="scenery-icon icon-info"
:class="station?.generalInfo.controlType.replace('+', '-')"
:title="
$t('sceneries.info.control-type') + $t(`controls.${station?.generalInfo.controlType}`)
"
>
{{ $t(`controls.abbrevs.${station.generalInfo.controlType}`) }}
</span>
<img
v-if="station?.generalInfo?.signalType"
class="icon-info"
:src="`/images/icon-${station.generalInfo.signalType}.svg`"
:alt="station.generalInfo.signalType"
:title="$t('sceneries.info.signals-type') + $t(`signals.${station.generalInfo.signalType}`)"
/>
<img
v-if="station?.generalInfo?.availability == 'nonPublic'"
class="icon-info"
@@ -60,6 +41,33 @@
:title="$t('sceneries.info.abandoned')"
/>
<span
v-if="station?.generalInfo"
class="scenery-icon icon-info"
:class="station?.generalInfo.controlType.replace('+', '-')"
:title="
$t('sceneries.info.control-type') + $t(`controls.${station?.generalInfo.controlType}`)
"
>
{{ $t(`controls.abbrevs.${station.generalInfo.controlType}`) }}
</span>
<img
v-if="station?.generalInfo?.signalType"
class="icon-info"
:src="`/images/icon-${station.generalInfo.signalType}.svg`"
:alt="station.generalInfo.signalType"
:title="$t('sceneries.info.signals-type') + $t(`signals.${station.generalInfo.signalType}`)"
/>
<img
v-if="station?.generalInfo?.lines"
class="icon-info"
src="/images/icon-real.svg"
alt="real scenery"
:title="`${$t('sceneries.info.real')} ${station.generalInfo.lines}`"
/>
<img
v-if="station?.generalInfo?.SUP"
class="icon-info"
@@ -75,14 +83,6 @@
alt="dSAT ASDEK"
:title="$t('sceneries.info.ASDEK')"
/>
<img
v-if="station?.generalInfo?.lines"
class="icon-info"
src="/images/icon-real.svg"
alt="real scenery"
:title="`${$t('sceneries.info.real')} ${station.generalInfo.lines}`"
/>
</section>
</template>
@@ -1,23 +1,26 @@
<template>
<section class="info-routes" v-if="station.generalInfo">
<div class="routes one-way" v-if="oneWayRoutes.length > 0">
<b>{{ $t('scenery.one-way-routes') }}</b>
<button
class="routes-btn"
@click="toggleRoutesVisibility('single')"
data-tooltip-type="BaseTooltip"
:data-tooltip-content="`${showInternalSingleRoutes ? $t('scenery.btn-hide-internal-routes') : $t('scenery.btn-show-internal-routes')}`"
>
<b>{{ $t('scenery.one-way-routes') }}</b>
<i class="fa-solid" :class="`${showInternalSingleRoutes ? 'fa-eye' : 'fa-eye-slash'}`"></i>
</button>
<ul class="routes-list">
<li
v-for="route in oneWayRoutes"
:key="route.routeName"
@click="setActiveShowLength(route.routeName)"
>
<li v-for="route in oneWayRoutes" :key="route.routeName">
<span :class="{ 'no-catenary': !route.isElectric, internal: route.isInternal }">
{{ route.routeName }}</span
>
<span v-if="route.routeSpeed" class="speed">
{{
activeShowLength.includes(route.routeName)
? route.routeLength + 'm'
: route.routeSpeed
}}
{{ route.routeSpeed }}
</span>
<span v-if="route.routeLength" class="length">
{{ (route.routeLength / 1000).toFixed(1) + 'km' }}
</span>
<span v-if="route.isRouteSBL" class="sbl">SBL</span>
</li>
@@ -25,23 +28,24 @@
</div>
<div class="routes two-way" v-if="twoWayRoutes.length > 0">
<b>{{ $t('scenery.two-way-routes') }}</b>
<button
class="routes-btn"
@click="toggleRoutesVisibility('double')"
data-tooltip-type="BaseTooltip"
:data-tooltip-content="`${showInternalDoubleRoutes ? $t('scenery.btn-hide-internal-routes') : $t('scenery.btn-show-internal-routes')}`"
>
<b>{{ $t('scenery.two-way-routes') }}</b>
<i class="fa-solid" :class="`${showInternalDoubleRoutes ? 'fa-eye' : 'fa-eye-slash'}`"></i>
</button>
<ul class="routes-list">
<li
v-for="route in twoWayRoutes"
:key="route.routeName"
@click="setActiveShowLength(route.routeName)"
>
<span :class="{ 'no-catenary': !route.isElectric, internal: route.isInternal }">{{
route.routeName
}}</span>
<span v-if="route.routeSpeed" class="speed">
{{
activeShowLength.includes(route.routeName)
? route.routeLength + 'm'
: route.routeSpeed
}}
<li v-for="route in twoWayRoutes" :key="route.routeName">
<span :class="{ 'no-catenary': !route.isElectric, internal: route.isInternal }">
{{ route.routeName }}
</span>
<span v-if="route.routeSpeed" class="speed">{{ route.routeSpeed }}</span>
<span v-if="route.routeLength" class="length">
{{ (route.routeLength / 1000).toFixed(1) + 'km' }}
</span>
<span v-if="route.isRouteSBL" class="sbl">SBL</span>
</li>
@@ -53,6 +57,7 @@
<script lang="ts">
import { PropType, defineComponent } from 'vue';
import { Station } from '../../../typings/common';
import StorageManager from '../../../managers/storageManager';
export default defineComponent({
props: {
@@ -62,27 +67,50 @@ export default defineComponent({
}
},
methods: {
setActiveShowLength(name: string) {
if (this.activeShowLength.includes(name))
this.activeShowLength.splice(this.activeShowLength.indexOf(name), 1);
else this.activeShowLength.push(name);
data() {
return {
showInternalSingleRoutes: false,
showInternalDoubleRoutes: false
};
},
mounted() {
if (StorageManager.getBooleanValue('showInternalDoubleRoutes')) {
this.showInternalDoubleRoutes = StorageManager.getBooleanValue('showInternalDoubleRoutes');
}
if (StorageManager.getBooleanValue('showInternalSingleRoutes')) {
this.showInternalSingleRoutes = StorageManager.getBooleanValue('showInternalSingleRoutes');
}
},
data() {
return {
activeShowLength: [] as string[]
};
methods: {
toggleRoutesVisibility(type: 'single' | 'double') {
if (type == 'double') {
this.showInternalDoubleRoutes = !this.showInternalDoubleRoutes;
StorageManager.setBooleanValue('showInternalDoubleRoutes', this.showInternalDoubleRoutes);
} else {
this.showInternalSingleRoutes = !this.showInternalSingleRoutes;
StorageManager.setBooleanValue('showInternalSingleRoutes', this.showInternalSingleRoutes);
}
}
},
computed: {
oneWayRoutes() {
return this.station.generalInfo?.routes.single ?? [];
return (
this.station.generalInfo?.routes.single
.filter((r) => !r.isInternal || r.isInternal == this.showInternalSingleRoutes)
.sort((r1, r2) => r1.routeName.localeCompare(r2.routeName)) ?? []
);
},
twoWayRoutes() {
return this.station.generalInfo?.routes.double ?? [];
return (
this.station.generalInfo?.routes.double
.filter((r) => !r.isInternal || r.isInternal == this.showInternalDoubleRoutes)
.sort((r1, r2) => r1.routeName.localeCompare(r2.routeName)) ?? []
);
}
}
});
@@ -92,20 +120,26 @@ export default defineComponent({
.info-routes {
display: flex;
justify-content: center;
flex-wrap: wrap;
flex-direction: column;
margin: 1em 0;
}
.routes {
display: flex;
justify-content: center;
align-items: center;
flex-wrap: wrap;
padding: 0.25em;
}
.routes > button.routes-btn {
margin: 0 auto;
display: inline-block;
i {
margin-left: 0.5em;
width: 1.25em;
height: 1.25em;
}
}
ul.routes-list {
margin: 0.45em 0.25em;
display: flex;
@@ -121,7 +155,7 @@ ul.routes-list {
-webkit-user-select: none;
span {
padding: 0.2em 0.25em;
padding: 0.2em;
background-color: #007599;
font-weight: bold;
@@ -138,6 +172,10 @@ ul.routes-list {
color: #cfcfcf;
}
&.length {
background-color: #303030;
color: #cfcfcf;
}
&.sbl {
color: var(--clr-primary);
background-color: #404040;
@@ -121,7 +121,7 @@
</section>
<section class="card_sliders">
<div class="slider" v-for="(slider, i) in initSliders" :key="i">
<div class="slider" v-for="(slider, i) in sliderStates" :key="i">
<input
class="slider-input"
type="range"
@@ -130,7 +130,7 @@
:min="slider.minRange"
:max="slider.maxRange"
:step="slider.step"
v-model="filters[slider.id]"
v-model.number="filters[slider.id]"
/>
<span class="slider-value">{{ filters[slider.id] }}</span>
<div class="slider-content">
@@ -178,7 +178,7 @@ import StorageManager from '../../managers/storageManager';
import {
filtersSections,
initSliders,
sliderStates,
initFilters,
getChangedFilters
} from '../../managers/stationFilterManager';
@@ -197,7 +197,7 @@ export default defineComponent({
saveOptions: false,
filtersSections,
initSliders,
sliderStates,
minimumHours: 0,
authors: '',
@@ -567,7 +567,8 @@ h3.section-header {
}
.slider {
display: flex;
display: grid;
grid-template-columns: 1fr 50px 1fr;
align-items: center;
gap: 0.25em;
@@ -576,6 +577,7 @@ h3.section-header {
&-value {
color: $accentCol;
padding: 0.1em 0.2em;
text-align: center;
}
&-input {
@@ -602,7 +604,8 @@ h3.section-header {
border-radius: 50%;
background: white;
border: 4px solid $accentCol;
border: 3px solid $accentCol;
background-color: #333;
@include smallScreen() {
width: 15px;
@@ -658,12 +661,17 @@ h3.section-header {
@include smallScreen {
.slider {
display: flex;
flex-wrap: wrap;
justify-content: center;
&-input {
width: 90%;
}
&-content {
text-align: center;
}
}
}
</style>
+5 -3
View File
@@ -429,14 +429,16 @@ table {
min-width: 1250px;
white-space: wrap;
thead {
position: sticky;
top: 0;
}
thead tr {
background-color: $bgCol;
}
thead th {
position: sticky;
top: 0;
&.station {
width: 12em;
}
+10 -2
View File
@@ -120,6 +120,8 @@ function filterSliderValues(filters: Record<string, any>, generalInfo: StationGe
const otherAvailability =
availability == 'nonPublic' || availability == 'unavailable' || availability == 'abandoned';
const internalRoutes = routes.all.filter((r) => r.isInternal && !r.isRouteSBL && !r.hidden);
return (
filters['minLevel'] > reqLevel + (otherAvailability ? 1 : 0) ||
filters['maxLevel'] < reqLevel + (otherAvailability ? 1 : 0) ||
@@ -130,7 +132,13 @@ function filterSliderValues(filters: Record<string, any>, generalInfo: StationGe
filters['minOneWayCatenary'] > routes.singleElectrifiedNames.length ||
filters['minOneWay'] > routes.singleOtherNames.length ||
filters['minTwoWayCatenary'] > routes.doubleElectrifiedNames.length ||
filters['minTwoWay'] > routes.doubleOtherNames.length
// filters['minTwoWay'] > routes.doubleOtherNames.length ||
filters['minOneWayCatenaryInt'] >
internalRoutes.filter((r) => r.routeTracks == 1 && r.isElectric == true).length ||
filters['minOneWayInt'] >
internalRoutes.filter((r) => r.routeTracks == 1 && r.isElectric == false).length ||
filters['minTwoWayCatenaryInt'] >
internalRoutes.filter((r) => r.routeTracks == 2 && r.isElectric == true).length
);
}
@@ -235,7 +243,7 @@ export const sortStations = (a: Station, b: Station, sorter: ActiveSorter) => {
return a.name.localeCompare(b.name);
};
export const filterStations = (station: Station, filters: Record<string, any>) => {
export const filterStations = (station: Station, filters: Record<string, any>) => {
if (filters['free'] && (!station.onlineInfo || station.onlineInfo.dispatcherId == -1))
return false;
+12 -4
View File
@@ -271,7 +271,11 @@
"minOneWayCatenary": "MIN. CATENARY SINGLE TRACK ROUTES",
"minOneWay": "MIN. OTHER SINGLE TRACK ROUTES",
"minTwoWayCatenary": "MIN. CATENARY DOUBLE TRACK ROUTES",
"minTwoWay": "MIN. OTHER DOUBLE TRACK ROUTES"
"minTwoWay": "MIN. OTHER DOUBLE TRACK ROUTES",
"minOneWayCatenaryInt": "MIN. INTERNAL CATENARY SINGLE TRACK ROUTES",
"minOneWayInt": "MIN. INTERNAL OTHER SINGLE TRACK ROUTES",
"minTwoWayCatenaryInt": "MIN. INTERNAL CATENARY DOUBLE TRACK ROUTES",
"minTwoWayInt": "MIN. INTERNAL OTHER DOUBLE TRACK ROUTES"
},
"sceneries-search": "SCENERY SEARCH:",
"sceneries-placeholder": "Enter scenery name...",
@@ -507,8 +511,10 @@
"abbrev": "Station symbol:",
"lines-title": "Real lines",
"project-title": "Project name",
"one-way-routes": "One way routes",
"two-way-routes": "Two way routes",
"additional-tools-title": "Additional tools",
"one-way-routes": "Signle track routes",
"two-way-routes": "Double track routes",
"no-data": "No available data about this scenery",
"option-active-timetables": "Active timetables",
"option-timetables-history": "Timetables history PL1",
"option-dispatchers-history": "Dispatchers history PL1",
@@ -525,7 +531,9 @@
"forum-topic": "Official {name} forum topic",
"pragotron-link": "Timetable pallet board",
"tablice-link": "Timetable summary board (by Thundo)",
"bottom-info": "Show full history in the Journal tab"
"bottom-info": "Show full history in the Journal tab",
"btn-show-internal-routes": "Show internal routes",
"btn-hide-internal-routes": "Hide internal routes"
},
"availability": {
"title": "Availability",
+10 -2
View File
@@ -269,7 +269,11 @@
"minOneWayCatenary": "SZLAKI JEDNOTOROWE ZELEKTR. (MINIMUM)",
"minOneWay": "SZLAKI JEDNOTOROWE NIEZELEKTR. (MINIMUM)",
"minTwoWayCatenary": "SZLAKI DWUTOROWE ZELEKTR. (MINIMUM)",
"minTwoWay": "SZLAKI DWUTOROWE NIEZELEKTR. (MINIMUM)"
"minTwoWay": "SZLAKI DWUTOROWE NIEZELEKTR. (MINIMUM)",
"minOneWayCatenaryInt": "SZLAKI JEDNOTOROWE ZELEKTR. WEWNĘTRZNE (MINIMUM)",
"minOneWayInt": "SZLAKI JEDNOTOROWE NIEZELEKTR. WEWNĘTRZNE (MINIMUM)",
"minTwoWayCatenaryInt": "SZLAKI DWUTOROWE ZELEKTR. WEWNĘTRZNE (MINIMUM)",
"minTwoWayInt": "SZLAKI DWUTOROWE NIEZELEKTR. WEWNĘTRZNE (MINIMUM)"
},
"sceneries-search": "WYSZUKAJ SCENERIĘ:",
"sceneries-placeholder": "Wpisz nazwę scenerii...",
@@ -493,8 +497,10 @@
"abbrev": "Skrót posterunku:",
"lines-title": "Rzeczywiste linie",
"project-title": "Projekt",
"additional-tools-title": "Dodatkowe narzędzia",
"one-way-routes": "Szlaki jednotorowe",
"two-way-routes": "Szlaki dwutorowe",
"no-data": "Brak informacji o tej scenerii",
"option-active-timetables": "Aktywne rozkłady jazdy",
"option-timetables-history": "Historia rozkładów PL1",
"option-dispatchers-history": "Historia dyżurów PL1",
@@ -511,7 +517,9 @@
"forum-topic": "Oficjalny wątek scenerii {name}",
"pragotron-link": "Paletowa tablica informacyjna",
"tablice-link": "Tablica informacyjna zbiorcza (autorstwa Thundo)",
"bottom-info": "Pokaż pełną historię w zakładce Dziennika"
"bottom-info": "Pokaż pełną historię w zakładce Dziennika",
"btn-show-internal-routes": "Pokazuj szlaki wewnętrzne",
"btn-hide-internal-routes": "Ukrywaj szlaki wewnętrzne"
},
"availability": {
"title": "Dostępność",
+13 -6
View File
@@ -59,22 +59,29 @@ export const initFilters = {
onlineFromHours: 0,
minLevel: 0,
maxLevel: 20,
minOneWayCatenary: 0,
minOneWay: 0,
minOneWayCatenary: 0,
minTwoWayCatenary: 0,
minTwoWay: 0,
minOneWayInt: 0,
minOneWayCatenaryInt: 0,
minTwoWayCatenaryInt: 0,
// minTwoWay: 0,
authors: ''
};
export const initSliders = [
export const sliderStates = [
{ id: 'maxVmax', minRange: 0, maxRange: 200, step: 10 },
{ id: 'minVmax', minRange: 0, maxRange: 200, step: 10 },
{ id: 'minLevel', minRange: 0, maxRange: 20, step: 1 },
{ id: 'maxLevel', minRange: 0, maxRange: 20, step: 1 },
{ id: 'minOneWayCatenary', minRange: 0, maxRange: 5, step: 1 },
{ id: 'minOneWay', minRange: 0, maxRange: 5, step: 1 },
{ id: 'minOneWayCatenary', minRange: 0, maxRange: 5, step: 1 },
{ id: 'minTwoWayCatenary', minRange: 0, maxRange: 5, step: 1 },
{ id: 'minTwoWay', minRange: 0, maxRange: 5, step: 1 }
{ id: 'minOneWayInt', minRange: 0, maxRange: 5, step: 1 },
{ id: 'minOneWayCatenaryInt', minRange: 0, maxRange: 5, step: 1 },
{ id: 'minTwoWayCatenaryInt', minRange: 0, maxRange: 5, step: 1 },
// { id: 'minTwoWay', minRange: 0, maxRange: 5, step: 1 },
// { id: 'minTwoWayInt', minRange: 0, maxRange: 5, step: 1 }
];
export type StationFilter = keyof typeof initFilters;
@@ -109,7 +116,7 @@ export function setupFilters(currentFilters: Record<string, any>) {
});
}
export function getChangedFilters(currentFilters: Record<string, any>): string[] {
export function getChangedFilters(currentFilters: Record<string, any>): string[] {
return (
Object.keys(currentFilters).filter(
(filterKey) =>