+
- {{ station.onlineInfo.dispatcherExp > 1 ? station.onlineInfo.dispatcherExp : 'L' }}
+ {{ onlineScenery.dispatcherExp > 1 ? onlineScenery.dispatcherExp : 'L' }}
- {{ station.onlineInfo.dispatcherName }}
+ {{ onlineScenery.dispatcherName }}
-
- {{ station.onlineInfo?.dispatcherRate || '0' }}
+
+ {{ onlineScenery?.dispatcherRate || '0' }}
@@ -98,4 +93,3 @@ export default defineComponent({
}
}
-
diff --git a/src/components/SceneryView/SceneryInfo/SceneryInfoIcons.vue b/src/components/SceneryView/SceneryInfo/SceneryInfoIcons.vue
index 9295c65..b3ac504 100644
--- a/src/components/SceneryView/SceneryInfo/SceneryInfoIcons.vue
+++ b/src/components/SceneryView/SceneryInfo/SceneryInfoIcons.vue
@@ -20,7 +20,7 @@

@@ -28,7 +28,7 @@
![]()
@@ -36,7 +36,7 @@

@@ -44,7 +44,7 @@

@@ -52,7 +52,7 @@

@@ -60,7 +60,7 @@

@@ -68,7 +68,7 @@

@@ -76,20 +76,19 @@
@@ -118,4 +117,3 @@ export default defineComponent({
}
}
-
diff --git a/src/components/SceneryView/SceneryInfo/SceneryInfoRoutes.vue b/src/components/SceneryView/SceneryInfo/SceneryInfoRoutes.vue
index bab7fbf..22a43be 100644
--- a/src/components/SceneryView/SceneryInfo/SceneryInfoRoutes.vue
+++ b/src/components/SceneryView/SceneryInfo/SceneryInfoRoutes.vue
@@ -1,129 +1,142 @@
-
-
-
-
{{ $t('scenery.one-way-routes') }}
-
-
- -
- {{ route.name }}
-
- {{ activeShowLength.includes(route.name) ? route.length + 'm' : route.speed }}
-
- SBL
-
-
-
-
-
-
{{ $t('scenery.two-way-routes') }}
-
-
- -
- {{ route.name }}
-
- {{ activeShowLength.includes(route.name) ? route.length + 'm' : route.speed }}
-
- SBL
-
-
-
-
-
-
-
-
-
+
+
+
+
{{ $t('scenery.one-way-routes') }}
+
+
+ -
+
+ {{ route.name }}
+
+ {{ activeShowLength.includes(route.name) ? route.length + 'm' : route.speed }}
+
+ SBL
+
+
+
+
+
+
{{ $t('scenery.two-way-routes') }}
+
+
+ -
+ {{
+ route.name
+ }}
+
+ {{ activeShowLength.includes(route.name) ? route.length + 'm' : route.speed }}
+
+ SBL
+
+
+
+
+
+
+
+
+
diff --git a/src/components/SceneryView/SceneryInfo/SceneryInfoSpawnList.vue b/src/components/SceneryView/SceneryInfo/SceneryInfoSpawnList.vue
index ea416d0..fdbecb3 100644
--- a/src/components/SceneryView/SceneryInfo/SceneryInfoSpawnList.vue
+++ b/src/components/SceneryView/SceneryInfo/SceneryInfoSpawnList.vue
@@ -1,65 +1,88 @@
-
-
-
-
-
-
- {{ spawn.spawnName }}
- {{ spawn.spawnLength }}m
-
-
-
- {{ $t('scenery.no-spawns') }}
-
-
-
-
-
-
-
+
+
+
+
+
+
+ {{ $t('scenery.no-spawns') }}
+
+
+
+ {{ spawn.spawnName }}
+ {{ spawn.spawnLength }}m
+
+
+
+
+
+
+
+
diff --git a/src/components/SceneryView/SceneryInfo/SceneryInfoStats.vue b/src/components/SceneryView/SceneryInfo/SceneryInfoStats.vue
index b52f33d..147cb88 100644
--- a/src/components/SceneryView/SceneryInfo/SceneryInfoStats.vue
+++ b/src/components/SceneryView/SceneryInfo/SceneryInfoStats.vue
@@ -1,29 +1,32 @@
-
+
{{ station.onlineInfo?.dispatcherRate || '0' }}
-
+
{{ station.onlineInfo?.currentUsers || '0' }}
/
{{ station.onlineInfo?.maxUsers || '0' }}
-
+
{{ station.onlineInfo?.spawns.length || '0' }}
-
+
{{ station.onlineInfo?.scheduledTrains?.length || '0' }}
/
{{ station.onlineInfo?.scheduledTrains?.filter((train) => train.stopInfo.confirmed).length || '0' }}
+ >{{
+ station.onlineInfo?.scheduledTrains?.filter((train) => train.stopInfo.confirmed)
+ .length || '0'
+ }}
@@ -31,18 +34,16 @@
diff --git a/src/components/SceneryView/SceneryInfo/SceneryInfoUserList.vue b/src/components/SceneryView/SceneryInfo/SceneryInfoUserList.vue
index a920397..e265079 100644
--- a/src/components/SceneryView/SceneryInfo/SceneryInfoUserList.vue
+++ b/src/components/SceneryView/SceneryInfo/SceneryInfoUserList.vue
@@ -1,131 +1,123 @@
-
-
-
-
-
- {{ train.trainNo }}
- {{ train.driverName }}
-
-
-
- {{ $t('scenery.no-users') }}
-
-
-
-
-
-
-
+
+
+
+
+
+
+ {{ $t('scenery.no-users') }}
+
+
+
+ {{ train.trainNo }}
+ {{ train.driverName }}
+
+
+
+
+
+
+
+
diff --git a/src/components/SceneryView/SceneryTimetable.vue b/src/components/SceneryView/SceneryTimetable.vue
index 2385167..6467354 100644
--- a/src/components/SceneryView/SceneryTimetable.vue
+++ b/src/components/SceneryView/SceneryTimetable.vue
@@ -1,457 +1,466 @@
-
-
-
-
-
-
-
+
+
+
+
+
+
+
diff --git a/src/components/SceneryView/SceneryTimetablesHistory.vue b/src/components/SceneryView/SceneryTimetablesHistory.vue
index 186094d..be45b1d 100644
--- a/src/components/SceneryView/SceneryTimetablesHistory.vue
+++ b/src/components/SceneryView/SceneryTimetablesHistory.vue
@@ -1,110 +1,122 @@
-
-
-
- {{ $t('scenery.history-list-empty') }}
-
-
-
- | {{ $t('scenery.timetables-history-id') }} |
- {{ $t('scenery.timetables-history-number') }} |
- {{ $t('scenery.timetables-history-route') }} |
- {{ $t('scenery.timetables-history-driver') }} |
- {{ $t('scenery.timetables-history-author') }} |
- {{ $t('scenery.timetables-history-date') }} |
-
-
-
-
- |
- #{{ historyItem.id }}
- |
-
- {{ historyItem.trainCategoryCode }}
- {{ historyItem.trainNo }}
- |
- {{ historyItem.route.replace('|', ' -> ') }} |
- {{ historyItem.driverName }} |
-
- {{ historyItem.authorName }}
-
- {{ $t('scenery.timetable-author-unknown') }}
- |
-
- {{ localeDay(historyItem.beginDate, $i18n.locale) }}
- {{ localeTime(historyItem.beginDate, $i18n.locale) }}
- |
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+ {{ $t('scenery.history-list-empty') }}
+
+
+
+
+ | {{ $t('scenery.timetables-history-id') }} |
+ {{ $t('scenery.timetables-history-number') }} |
+ {{ $t('scenery.timetables-history-route') }} |
+ {{ $t('scenery.timetables-history-driver') }} |
+ {{ $t('scenery.timetables-history-author') }} |
+ {{ $t('scenery.timetables-history-date') }} |
+
+
+
+
+ |
+ #{{ historyItem.id }}
+ |
+
+ {{ historyItem.trainCategoryCode }}
+ {{ historyItem.trainNo }}
+ |
+ {{ historyItem.route.replace('|', ' -> ') }} |
+ {{ historyItem.driverName }} |
+
+ {{ historyItem.authorName }}
+
+ {{ $t('scenery.timetable-author-unknown') }}
+ |
+
+ {{ localeDay(historyItem.beginDate, $i18n.locale) }}
+ {{ localeTime(historyItem.beginDate, $i18n.locale) }}
+ |
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/components/SceneryView/ScheduledTrainStatus.vue b/src/components/SceneryView/ScheduledTrainStatus.vue
index 73a8ba3..c376d7a 100644
--- a/src/components/SceneryView/ScheduledTrainStatus.vue
+++ b/src/components/SceneryView/ScheduledTrainStatus.vue
@@ -1,6 +1,9 @@
-
+
{{ computedScheduledTrain.stopStatusIndicator }}
@@ -19,16 +22,21 @@ export default defineComponent({
props: {
scheduledTrain: {
type: Object as PropType,
- required: true,
- },
+ required: true
+ }
},
computed: {
computedScheduledTrain(): ScheduledTrainComp {
- const { prevDepartureLine, prevStationName, stopStatus, nextArrivalLine, nextStationName } = this.scheduledTrain;
+ const { prevDepartureLine, prevStationName, stopStatus, nextArrivalLine, nextStationName } =
+ this.scheduledTrain;
- const prevDepartureIndicator = prevDepartureLine ? `(${prevDepartureLine}) ${prevStationName}` : '---';
- const nextArrivalIndicator = nextArrivalLine ? `(${nextArrivalLine}) ${nextStationName}` : '---';
+ const prevDepartureIndicator = prevDepartureLine
+ ? `(${prevDepartureLine}) ${prevStationName}`
+ : '---';
+ const nextArrivalIndicator = nextArrivalLine
+ ? `(${nextArrivalLine}) ${nextStationName}`
+ : '---';
let stopStatusDescription = '',
stopStatusIndicator = '';
@@ -36,7 +44,10 @@ export default defineComponent({
switch (stopStatus) {
case StopStatus.arriving:
stopStatusIndicator = `${this.$t('timetables.from')}: ${prevDepartureIndicator}`;
- stopStatusDescription = this.$t('timetables.desc-arriving', { prevStationName, prevDepartureLine });
+ stopStatusDescription = this.$t('timetables.desc-arriving', {
+ prevStationName,
+ prevDepartureLine
+ });
break;
case StopStatus.online:
@@ -51,12 +62,18 @@ export default defineComponent({
case StopStatus.departed:
stopStatusIndicator = `${this.$t('timetables.to')}: ${nextArrivalIndicator}`;
- stopStatusDescription = this.$t('timetables.desc-departed', { nextStationName, nextArrivalLine });
+ stopStatusDescription = this.$t('timetables.desc-departed', {
+ nextStationName,
+ nextArrivalLine
+ });
break;
case StopStatus['departed-away']:
stopStatusIndicator = `${this.$t('timetables.to')}: ${nextArrivalIndicator}`;
- stopStatusDescription = this.$t('timetables.desc-departed-away', { nextStationName, nextArrivalLine });
+ stopStatusDescription = this.$t('timetables.desc-departed-away', {
+ nextStationName,
+ nextArrivalLine
+ });
break;
case StopStatus.terminated:
@@ -70,10 +87,10 @@ export default defineComponent({
return {
...this.scheduledTrain,
stopStatusDescription,
- stopStatusIndicator,
+ stopStatusIndicator
};
- },
- },
+ }
+ }
});
@@ -110,4 +127,3 @@ export default defineComponent({
}
}
-
diff --git a/src/components/StationsView/FilterOption.vue b/src/components/StationsView/FilterOption.vue
index c924eb5..5376db0 100644
--- a/src/components/StationsView/FilterOption.vue
+++ b/src/components/StationsView/FilterOption.vue
@@ -1,6 +1,12 @@
diff --git a/src/components/TrainsView/TrainTable.vue b/src/components/TrainsView/TrainTable.vue
index 5b0ea3a..eb69fbf 100644
--- a/src/components/TrainsView/TrainTable.vue
+++ b/src/components/TrainsView/TrainTable.vue
@@ -1,207 +1,209 @@
-
-
-
-
-
- {{ $t('app.offline') }}
-
-
-
-
-
- {{ $t('trains.no-trains') }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+ {{ $t('app.offline') }}
+
+
+
+
+
+ {{ $t('trains.no-trains') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/constants/Journal/JournalTimetablesConsts.ts b/src/constants/Journal/JournalTimetablesConsts.ts
index 86b8182..25241a0 100644
--- a/src/constants/Journal/JournalTimetablesConsts.ts
+++ b/src/constants/Journal/JournalTimetablesConsts.ts
@@ -1,46 +1,46 @@
-import { JournalFilterSection, JournalFilterType } from '../../scripts/enums/JournalFilterType';
-import { JournalFilter } from '../../scripts/types/JournalTimetablesTypes';
-
-export const journalTimetableFilters: JournalFilter[] = [
- {
- id: JournalFilterType.ALL,
- filterSection: JournalFilterSection.TIMETABLE_STATUS,
- isActive: true,
- },
-
- {
- id: JournalFilterType.ACTIVE,
- filterSection: JournalFilterSection.TIMETABLE_STATUS,
- isActive: false,
- },
-
- {
- id: JournalFilterType.FULFILLED,
- filterSection: JournalFilterSection.TIMETABLE_STATUS,
- isActive: false,
- },
-
- {
- id: JournalFilterType.ABANDONED,
- filterSection: JournalFilterSection.TIMETABLE_STATUS,
- isActive: false,
- },
-
- {
- id: JournalFilterType.TWR_SKR,
- filterSection: JournalFilterSection.TWRSKR,
- isActive: true,
- },
-
- {
- id: JournalFilterType.TWR,
- filterSection: JournalFilterSection.TWRSKR,
- isActive: false,
- },
-
- {
- id: JournalFilterType.SKR,
- filterSection: JournalFilterSection.TWRSKR,
- isActive: false,
- },
-];
+import { JournalFilterSection, JournalFilterType } from '../../scripts/enums/JournalFilterType';
+import { JournalFilter } from '../../scripts/types/JournalTimetablesTypes';
+
+export const journalTimetableFilters: JournalFilter[] = [
+ {
+ id: JournalFilterType.ALL,
+ filterSection: JournalFilterSection.TIMETABLE_STATUS,
+ isActive: true
+ },
+
+ {
+ id: JournalFilterType.ACTIVE,
+ filterSection: JournalFilterSection.TIMETABLE_STATUS,
+ isActive: false
+ },
+
+ {
+ id: JournalFilterType.FULFILLED,
+ filterSection: JournalFilterSection.TIMETABLE_STATUS,
+ isActive: false
+ },
+
+ {
+ id: JournalFilterType.ABANDONED,
+ filterSection: JournalFilterSection.TIMETABLE_STATUS,
+ isActive: false
+ },
+
+ {
+ id: JournalFilterType.TWR_SKR,
+ filterSection: JournalFilterSection.TWRSKR,
+ isActive: true
+ },
+
+ {
+ id: JournalFilterType.TWR,
+ filterSection: JournalFilterSection.TWRSKR,
+ isActive: false
+ },
+
+ {
+ id: JournalFilterType.SKR,
+ filterSection: JournalFilterSection.TWRSKR,
+ isActive: false
+ }
+];
diff --git a/src/constants/Trains/TrainOptionsConsts.ts b/src/constants/Trains/TrainOptionsConsts.ts
index 8c57deb..fdea3aa 100644
--- a/src/constants/Trains/TrainOptionsConsts.ts
+++ b/src/constants/Trains/TrainOptionsConsts.ts
@@ -1,89 +1,89 @@
-import { TrainFilterSection, TrainFilterType } from '../../scripts/enums/TrainFilterType';
-import { TrainFilter } from '../../scripts/interfaces/Trains/TrainFilter';
-
-export const trainFilters: TrainFilter[] = [
- {
- id: TrainFilterType.twr,
- section: TrainFilterSection.TRAIN_TYPE,
- isActive: true,
- },
- {
- id: TrainFilterType.skr,
- section: TrainFilterSection.TRAIN_TYPE,
- isActive: true,
- },
- {
- id: TrainFilterType.common,
- 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.noComments,
- section: TrainFilterSection.COMMENTS,
- isActive: true,
- },
-
- {
- id: TrainFilterType.withTimetable,
- section: TrainFilterSection.TIMETABLE,
- isActive: true,
- },
- {
- id: TrainFilterType.noTimetable,
- section: TrainFilterSection.TIMETABLE,
- isActive: true,
- },
-];
-
-export const sorterOptions = [
- {
- id: 'distance',
- value: 'kilometraż',
- },
- {
- id: 'id',
- value: 'id rozkładu',
- },
- {
- id: 'progress',
- value: 'przebyta trasa',
- },
- {
- id: 'delay',
- value: 'opóźnienie',
- },
- {
- id: 'mass',
- value: 'masa',
- },
- {
- id: 'speed',
- value: 'prędkość',
- },
- {
- id: 'length',
- value: 'długość',
- },
-];
+import { TrainFilterSection, TrainFilterType } from '../../scripts/enums/TrainFilterType';
+import { TrainFilter } from '../../scripts/interfaces/Trains/TrainFilter';
+
+export const trainFilters: TrainFilter[] = [
+ {
+ id: TrainFilterType.twr,
+ section: TrainFilterSection.TRAIN_TYPE,
+ isActive: true
+ },
+ {
+ id: TrainFilterType.skr,
+ section: TrainFilterSection.TRAIN_TYPE,
+ isActive: true
+ },
+ {
+ id: TrainFilterType.common,
+ 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.noComments,
+ section: TrainFilterSection.COMMENTS,
+ isActive: true
+ },
+
+ {
+ id: TrainFilterType.withTimetable,
+ section: TrainFilterSection.TIMETABLE,
+ isActive: true
+ },
+ {
+ id: TrainFilterType.noTimetable,
+ section: TrainFilterSection.TIMETABLE,
+ isActive: true
+ }
+];
+
+export const sorterOptions = [
+ {
+ id: 'distance',
+ value: 'kilometraż'
+ },
+ {
+ id: 'id',
+ value: 'id rozkładu'
+ },
+ {
+ id: 'progress',
+ value: 'przebyta trasa'
+ },
+ {
+ id: 'delay',
+ value: 'opóźnienie'
+ },
+ {
+ id: 'mass',
+ value: 'masa'
+ },
+ {
+ id: 'speed',
+ value: 'prędkość'
+ },
+ {
+ id: 'length',
+ value: 'długość'
+ }
+];
diff --git a/src/data/defaultVehicleIcons.json b/src/data/defaultVehicleIcons.json
index 4dc8845..5ccf5ce 100644
--- a/src/data/defaultVehicleIcons.json
+++ b/src/data/defaultVehicleIcons.json
@@ -1 +1,23 @@
-["EP07-356","EP07-356","EP07-356","ET41-074","2EN57-694+716rb","EU07E-083","EN57-716rb","EN57-716rb","EN57-716rb","EN57-038rb","EN57-038rb","SM42-329_PLREG","2EN57-038+1715rb","EN57-1953rb","EN57-1953rb","SM42-1121","SM42-091","SM42-404","SM42-404","EN57-1914rb","EN57-961rb"]
\ No newline at end of file
+[
+ "EP07-356",
+ "EP07-356",
+ "EP07-356",
+ "ET41-074",
+ "2EN57-694+716rb",
+ "EU07E-083",
+ "EN57-716rb",
+ "EN57-716rb",
+ "EN57-716rb",
+ "EN57-038rb",
+ "EN57-038rb",
+ "SM42-329_PLREG",
+ "2EN57-038+1715rb",
+ "EN57-1953rb",
+ "EN57-1953rb",
+ "SM42-1121",
+ "SM42-091",
+ "SM42-404",
+ "SM42-404",
+ "EN57-1914rb",
+ "EN57-961rb"
+]
diff --git a/src/data/mockWebsocketData.json b/src/data/mockWebsocketData.json
index fad7e86..e217e97 100644
--- a/src/data/mockWebsocketData.json
+++ b/src/data/mockWebsocketData.json
@@ -2650,7 +2650,16 @@
],
"route": "DOBRZYNIEC|CZERMIN",
"timetableId": 441366,
- "sceneries": ["2ce4e4b8", "e89b093c", "7fc24616", "9e8e828e", "a08efab9", "32d49e1d", "89fcee89", "beca9dd8"]
+ "sceneries": [
+ "2ce4e4b8",
+ "e89b093c",
+ "7fc24616",
+ "9e8e828e",
+ "a08efab9",
+ "32d49e1d",
+ "89fcee89",
+ "beca9dd8"
+ ]
}
},
{
@@ -4624,7 +4633,18 @@
],
"route": "CZERMIN|Zakopane",
"timetableId": 441329,
- "sceneries": ["2a60af79", "9e8e828e", "89fcee89", "32d49e1d", "e89b093c", "d60a1f02", "4e0599d3", "beca9dd8", "b7fea344", "2ce4e4b8"]
+ "sceneries": [
+ "2a60af79",
+ "9e8e828e",
+ "89fcee89",
+ "32d49e1d",
+ "e89b093c",
+ "d60a1f02",
+ "4e0599d3",
+ "beca9dd8",
+ "b7fea344",
+ "2ce4e4b8"
+ ]
}
},
{
@@ -4940,7 +4960,15 @@
],
"route": "Suszec Kopalnia|Wielichowo Główne gt",
"timetableId": 441331,
- "sceneries": ["a07a1966", "70717e39", "9e8e828e", "d60a1f02", "89fcee89", "beca9dd8", "8ce88788"]
+ "sceneries": [
+ "a07a1966",
+ "70717e39",
+ "9e8e828e",
+ "d60a1f02",
+ "89fcee89",
+ "beca9dd8",
+ "8ce88788"
+ ]
}
},
{
@@ -6620,7 +6648,15 @@
],
"route": "ŁAPANÓW|LISKÓW",
"timetableId": 441339,
- "sceneries": ["e2517545", "8052a490", "1800a035", "f58b0066", "beca9dd8", "a07a1966", "9e8e828e"]
+ "sceneries": [
+ "e2517545",
+ "8052a490",
+ "1800a035",
+ "f58b0066",
+ "beca9dd8",
+ "a07a1966",
+ "9e8e828e"
+ ]
}
},
{
@@ -8902,7 +8938,15 @@
],
"route": "ŁAPANÓW|GRABÓW",
"timetableId": 441348,
- "sceneries": ["e3222787", "2ce4e4b8", "db41867c", "f58b0066", "b7fea344", "073ff753", "9e8e828e"]
+ "sceneries": [
+ "e3222787",
+ "2ce4e4b8",
+ "db41867c",
+ "f58b0066",
+ "b7fea344",
+ "073ff753",
+ "9e8e828e"
+ ]
}
},
{
@@ -9686,7 +9730,16 @@
],
"route": "KRNÓW|ORNIKI",
"timetableId": 441355,
- "sceneries": ["4590c058", "f58b0066", "2ce4e4b8", "b0eecdb9", "5186fd9c", "e3222787", "5d22ada6", "03cd8e91"]
+ "sceneries": [
+ "4590c058",
+ "f58b0066",
+ "2ce4e4b8",
+ "b0eecdb9",
+ "5186fd9c",
+ "e3222787",
+ "5d22ada6",
+ "03cd8e91"
+ ]
}
},
{
diff --git a/src/data/options.json b/src/data/options.json
index d532401..efbf9fc 100644
--- a/src/data/options.json
+++ b/src/data/options.json
@@ -1,312 +1,321 @@
-{
- "optionSections": ["reality", "package-access", "access", "control", "addons", "blockades", "signals", "status"],
-
- "options": [
- {
- "id": "real",
- "name": "real",
- "section": "reality",
- "value": true,
- "defaultValue": true
- },
- {
- "id": "fictional",
- "name": "fictional",
- "section": "reality",
- "value": true,
- "defaultValue": true
- },
- {
- "id": "default",
- "name": "default",
- "section": "package-access",
- "value": true,
- "defaultValue": true
- },
- {
- "id": "not-default",
- "name": "notDefault",
- "section": "package-access",
- "value": true,
- "defaultValue": true
- },
- {
- "id": "non-public",
- "name": "nonPublic",
- "section": "access",
- "value": true,
- "defaultValue": true
- },
- {
- "id": "unavailable",
- "name": "unavailable",
- "section": "access",
- "value": false,
- "defaultValue": false
- },
- {
- "id": "abandoned",
- "name": "abandoned",
- "section": "access",
- "value": false,
- "defaultValue": false
- },
- {
- "id": "SPK",
- "name": "SPK",
- "section": "control",
- "value": true,
- "defaultValue": true
- },
- {
- "id": "SCS",
- "name": "SCS",
- "section": "control",
- "value": true,
- "defaultValue": true
- },
- {
- "id": "SPE",
- "name": "SPE",
- "section": "control",
- "value": true,
- "defaultValue": true
- },
-
- {
- "id": "SPK-M",
- "name": "mechaniczne+SPK",
- "section": "control",
- "value": true,
- "defaultValue": true
- },
- {
- "id": "SCS-M",
- "name": "mechaniczne+SCS",
- "section": "control",
- "value": true,
- "defaultValue": true
- },
- {
- "id": "mechanical",
- "name": "mechaniczne",
- "section": "control",
- "value": true,
- "defaultValue": true
- },
- {
- "id": "SPK-R",
- "name": "ręczne+SPK",
- "section": "control",
- "value": true,
- "defaultValue": true
- },
- {
- "id": "SCS-R",
- "name": "ręczne+SCS",
- "section": "control",
- "value": true,
- "defaultValue": true
- },
- {
- "id": "manual",
- "name": "ręczne",
- "section": "control",
- "value": true,
- "defaultValue": true
- },
- {
- "id": "SUP",
- "name": "SUP",
- "section": "addons",
- "value": true,
- "defaultValue": true
- },
- {
- "id": "noSUP",
- "name": "noSUP",
- "section": "addons",
- "value": true,
- "defaultValue": true
- },
- {
- "id": "SBL",
- "name": "SBL",
- "section": "blockades",
- "value": true,
- "defaultValue": true
- },
- {
- "id": "PBL",
- "name": "PBL",
- "section": "blockades",
- "value": true,
- "defaultValue": true
- },
- {
- "id": "modern",
- "name": "współczesna",
- "section": "signals",
- "value": true,
- "defaultValue": true
- },
- {
- "id": "semaphores",
- "name": "kształtowa",
- "section": "signals",
- "value": true,
- "defaultValue": true
- },
- {
- "id": "mixed",
- "name": "mieszana",
- "section": "signals",
- "value": true,
- "defaultValue": true
- },
- {
- "id": "historical",
- "name": "historyczna",
- "section": "signals",
- "value": true,
- "defaultValue": true
- },
-
- {
- "id": "free",
- "name": "free",
-
- "section": "status",
- "value": false,
- "defaultValue": false
- },
- {
- "id": "occupied",
- "name": "occupied",
-
- "section": "status",
- "value": true,
- "defaultValue": true
- },
- {
- "id": "endingStatus",
- "name": "endingStatus",
-
- "section": "status",
- "value": true,
- "defaultValue": true
- },
- {
- "id": "afkStatus",
- "name": "afkStatus",
-
- "section": "status",
- "value": true,
- "defaultValue": true
- },
- {
- "id": "noSpaceStatus",
- "name": "noSpaceStatus",
-
- "section": "status",
- "value": true,
- "defaultValue": true
- },
- {
- "id": "unavailableStatus",
- "name": "unavailableStatus",
-
- "section": "status",
- "value": true,
- "defaultValue": true
- }
- ],
- "sliders": [
- {
- "id": "min-lvl",
- "name": "minLevel",
- "minRange": 0,
- "maxRange": 20,
- "value": 0,
- "defaultValue": 0
- },
- {
- "id": "max-lvl",
- "name": "maxLevel",
- "minRange": 0,
- "maxRange": 20,
- "value": 20,
- "defaultValue": 20
- },
- {
- "id": "routes-1t-cat",
- "name": "minOneWayCatenary",
- "minRange": 0,
- "maxRange": 5,
- "value": 0,
- "defaultValue": 0
- },
- {
- "id": "routes-1t-other",
- "name": "minOneWay",
- "minRange": 0,
- "maxRange": 5,
- "value": 0,
- "defaultValue": 0
- },
- {
- "id": "routes-2t-cat",
- "name": "minTwoWayCatenary",
- "minRange": 0,
- "maxRange": 5,
- "value": 0,
- "defaultValue": 0
- },
- {
- "id": "routes-2t-other",
- "name": "minTwoWay",
- "minRange": 0,
- "maxRange": 5,
- "value": 0,
- "defaultValue": 0
- }
- ],
- "modes": [
- {
- "id": "include-selected",
- "name": "include-selected",
- "section": "mode",
- "value": true,
- "defaultValue": true
- },
- {
- "id": "save",
- "name": "save",
- "section": "mode",
- "value": true,
- "defaultValue": true
- }
- ],
- "regions": [
- {
- "id": "eu",
- "value": "PL1"
- },
- {
- "id": "cae",
- "value": "PL2"
- },
- {
- "id": "usw",
- "value": "DE"
- },
- {
- "id": "us",
- "value": "CZE"
- },
- {
- "id": "ru",
- "value": "ENG"
- }
- ]
-}
+{
+ "optionSections": [
+ "reality",
+ "package-access",
+ "access",
+ "control",
+ "addons",
+ "blockades",
+ "signals",
+ "status"
+ ],
+
+ "options": [
+ {
+ "id": "real",
+ "name": "real",
+ "section": "reality",
+ "value": true,
+ "defaultValue": true
+ },
+ {
+ "id": "fictional",
+ "name": "fictional",
+ "section": "reality",
+ "value": true,
+ "defaultValue": true
+ },
+ {
+ "id": "default",
+ "name": "default",
+ "section": "package-access",
+ "value": true,
+ "defaultValue": true
+ },
+ {
+ "id": "not-default",
+ "name": "notDefault",
+ "section": "package-access",
+ "value": true,
+ "defaultValue": true
+ },
+ {
+ "id": "non-public",
+ "name": "nonPublic",
+ "section": "access",
+ "value": true,
+ "defaultValue": true
+ },
+ {
+ "id": "unavailable",
+ "name": "unavailable",
+ "section": "access",
+ "value": false,
+ "defaultValue": false
+ },
+ {
+ "id": "abandoned",
+ "name": "abandoned",
+ "section": "access",
+ "value": false,
+ "defaultValue": false
+ },
+ {
+ "id": "SPK",
+ "name": "SPK",
+ "section": "control",
+ "value": true,
+ "defaultValue": true
+ },
+ {
+ "id": "SCS",
+ "name": "SCS",
+ "section": "control",
+ "value": true,
+ "defaultValue": true
+ },
+ {
+ "id": "SPE",
+ "name": "SPE",
+ "section": "control",
+ "value": true,
+ "defaultValue": true
+ },
+
+ {
+ "id": "SPK-M",
+ "name": "mechaniczne+SPK",
+ "section": "control",
+ "value": true,
+ "defaultValue": true
+ },
+ {
+ "id": "SCS-M",
+ "name": "mechaniczne+SCS",
+ "section": "control",
+ "value": true,
+ "defaultValue": true
+ },
+ {
+ "id": "mechanical",
+ "name": "mechaniczne",
+ "section": "control",
+ "value": true,
+ "defaultValue": true
+ },
+ {
+ "id": "SPK-R",
+ "name": "ręczne+SPK",
+ "section": "control",
+ "value": true,
+ "defaultValue": true
+ },
+ {
+ "id": "SCS-R",
+ "name": "ręczne+SCS",
+ "section": "control",
+ "value": true,
+ "defaultValue": true
+ },
+ {
+ "id": "manual",
+ "name": "ręczne",
+ "section": "control",
+ "value": true,
+ "defaultValue": true
+ },
+ {
+ "id": "SUP",
+ "name": "SUP",
+ "section": "addons",
+ "value": true,
+ "defaultValue": true
+ },
+ {
+ "id": "noSUP",
+ "name": "noSUP",
+ "section": "addons",
+ "value": true,
+ "defaultValue": true
+ },
+ {
+ "id": "SBL",
+ "name": "SBL",
+ "section": "blockades",
+ "value": true,
+ "defaultValue": true
+ },
+ {
+ "id": "PBL",
+ "name": "PBL",
+ "section": "blockades",
+ "value": true,
+ "defaultValue": true
+ },
+ {
+ "id": "modern",
+ "name": "współczesna",
+ "section": "signals",
+ "value": true,
+ "defaultValue": true
+ },
+ {
+ "id": "semaphores",
+ "name": "kształtowa",
+ "section": "signals",
+ "value": true,
+ "defaultValue": true
+ },
+ {
+ "id": "mixed",
+ "name": "mieszana",
+ "section": "signals",
+ "value": true,
+ "defaultValue": true
+ },
+ {
+ "id": "historical",
+ "name": "historyczna",
+ "section": "signals",
+ "value": true,
+ "defaultValue": true
+ },
+
+ {
+ "id": "free",
+ "name": "free",
+
+ "section": "status",
+ "value": false,
+ "defaultValue": false
+ },
+ {
+ "id": "occupied",
+ "name": "occupied",
+
+ "section": "status",
+ "value": true,
+ "defaultValue": true
+ },
+ {
+ "id": "endingStatus",
+ "name": "endingStatus",
+
+ "section": "status",
+ "value": true,
+ "defaultValue": true
+ },
+ {
+ "id": "afkStatus",
+ "name": "afkStatus",
+
+ "section": "status",
+ "value": true,
+ "defaultValue": true
+ },
+ {
+ "id": "noSpaceStatus",
+ "name": "noSpaceStatus",
+
+ "section": "status",
+ "value": true,
+ "defaultValue": true
+ },
+ {
+ "id": "unavailableStatus",
+ "name": "unavailableStatus",
+
+ "section": "status",
+ "value": true,
+ "defaultValue": true
+ }
+ ],
+ "sliders": [
+ {
+ "id": "min-lvl",
+ "name": "minLevel",
+ "minRange": 0,
+ "maxRange": 20,
+ "value": 0,
+ "defaultValue": 0
+ },
+ {
+ "id": "max-lvl",
+ "name": "maxLevel",
+ "minRange": 0,
+ "maxRange": 20,
+ "value": 20,
+ "defaultValue": 20
+ },
+ {
+ "id": "routes-1t-cat",
+ "name": "minOneWayCatenary",
+ "minRange": 0,
+ "maxRange": 5,
+ "value": 0,
+ "defaultValue": 0
+ },
+ {
+ "id": "routes-1t-other",
+ "name": "minOneWay",
+ "minRange": 0,
+ "maxRange": 5,
+ "value": 0,
+ "defaultValue": 0
+ },
+ {
+ "id": "routes-2t-cat",
+ "name": "minTwoWayCatenary",
+ "minRange": 0,
+ "maxRange": 5,
+ "value": 0,
+ "defaultValue": 0
+ },
+ {
+ "id": "routes-2t-other",
+ "name": "minTwoWay",
+ "minRange": 0,
+ "maxRange": 5,
+ "value": 0,
+ "defaultValue": 0
+ }
+ ],
+ "modes": [
+ {
+ "id": "include-selected",
+ "name": "include-selected",
+ "section": "mode",
+ "value": true,
+ "defaultValue": true
+ },
+ {
+ "id": "save",
+ "name": "save",
+ "section": "mode",
+ "value": true,
+ "defaultValue": true
+ }
+ ],
+ "regions": [
+ {
+ "id": "eu",
+ "value": "PL1"
+ },
+ {
+ "id": "cae",
+ "value": "PL2"
+ },
+ {
+ "id": "usw",
+ "value": "DE"
+ },
+ {
+ "id": "us",
+ "value": "CZE"
+ },
+ {
+ "id": "ru",
+ "value": "ENG"
+ }
+ ]
+}
diff --git a/src/locales/en.json b/src/locales/en.json
index 4d72ffd..682cf69 100644
--- a/src/locales/en.json
+++ b/src/locales/en.json
@@ -1,433 +1,433 @@
-{
- "general": {
- "and": " and ",
- "refresh": "REFRESH",
- "TWR": "High risk freight train",
- "SKR": "Train with exceeded gauge"
- },
- "app": {
- "sceneries": "SCENERIES",
- "trains": "TRAINS",
- "journal": "JOURNAL",
- "loading": "Loading data...",
- "support": "Support the project",
- "error": "An error occured while loading data!",
- "no-result": "No results for current search!",
- "migration-warning": "Stacjownik services will be unavailable 2/06/2022 between 1-3am (CEST time) due to the migration of API hostings!",
- "migration-confirm": "Roger that!",
- "offline": "App is in the offline mode!"
- },
- "footer": {
- "discord": "Stacjownik Discord server"
- },
- "update": {
- "title": "New version of the app is available!",
- "paragraph1": "Enjoy the application and may the green signal be with you!",
- "release-link": "Click here to browse version changelog (GitHub)",
- "confirm-button": "UPDATE NOW",
- "later-button": "LATER"
- },
- "data-status": {
- "S1-offline": "S1 signal
The app is working in offline mode!",
- "S1a-connection": "S1a signal
Cannot connect with Stacjownik API service!",
- "S1a-sceneries": "S1a signal
Cannot load online stations data!",
- "S2": "S2 signal
All data loaded successfully!",
- "S3": "S3 signal
Loading data...",
- "S5-timetables": "S5 signal
Timetables might be incorrect or missing!",
- "S5-dispatchers": "S5 signal
Cannot load dispatchers status data!",
- "S5-trains": "S5 signal
Cannot load online trains data!"
- },
- "desc": {
- "control-type": "Control type: ",
- "signals-type": "Signals type: ",
- "SBL": "This scenery has automatic block signalling (ABS/SBL) system on following routes: ",
- "SUP": "Requires the SUP application (level crossing remote control simulator)",
- "TWB-all": "This scenery has two-way route blockade on all routes",
- "TWB-routes": "This scenery has two-way route blockade on following routes: ",
- "default": "This scenery is available by default",
- "non-public": "This scenery is not public",
- "unknown": "This scenery isn't recognizable right now",
- "unavailable": "This scenery is unavailable",
- "abandoned": "This scenery is no longer supported by its creators",
- "real": "Scenery with real lines: "
- },
- "signals": {
- "title": "Signal type",
- "współczesna": "modern",
- "mieszana": "mixed",
- "kształtowa": "mechanical",
- "historyczna": "historical"
- },
- "controls": {
- "title": "Control type",
- "SPK": "SPK",
- "SCS": "SCS",
- "SCS-SPK": "SCS/SPK",
- "SPE": "SPE",
- "ręczne": "manual",
- "ręczne+SPK": "manual + SPK",
- "ręczne+SCS": "manual + SCS",
- "mechaniczne": "levers (mechanical)",
- "mechaniczne+SPK": "levers + SPK",
- "mechaniczne+SCS": "levers + SCS"
- },
- "status": {
- "online": "UNTIL ",
- "free": "FREE",
- "ending": "ENDS SOON",
- "not-signed": "NOT SIGNED IN",
- "no-limit": "NO LIMIT",
- "unavailable": "UNAVAILABLE",
- "brb": "AFK",
- "no-space": "NO SPACE",
- "unknown": "UNKNOWN"
- },
- "options": {
- "filters": "FILTERS",
- "donate": "DONATE",
-
- "search-button": "Search",
- "reset-button": "Reset",
-
- "sort-title": "SORT BY:",
- "filter-title": "FILTER BY:",
- "search-title": "SEARCH:",
-
- "search-train-no": "Train no. / #",
- "search-train": "Train no.",
- "search-driver": "Driver name",
- "search-dispatcher": "Dispatcher name",
- "search-station": "Scenery name",
- "search-author": "Timetable author name",
- "search-issuedFrom": "Origin scenery name",
- "search-timetables-date": "Timetable date (UTC+2 / CEST)",
- "search-dispatchers-date": "Service date (UTC+2 / CEST)",
- "search-date": "Date (UTC+2 / CEST)",
-
- "sort-mass": "mass",
- "sort-speed": "speed",
- "sort-length": "length",
- "sort-routeDistance": "route distance",
- "sort-timetable": "train no.",
- "sort-progress": "route progress",
- "sort-delay": "current delay",
- "sort-id": "timetable id",
-
- "sort-allStopsCount": "total stops",
- "sort-beginDate": "date",
- "sort-timetableId": "timetable ID",
- "sort-timestampFrom": "date",
- "sort-duration": "duration",
-
- "filter-noComments": "NO COMMENTS",
- "filter-withComments": "COMMENTS",
- "filter-twr": "HIGH RISK CARGO",
- "filter-skr": "EXCEEDED GAUGE",
- "filter-twr-skr": "ALL TYPES",
- "filter-common": "NO WARNINGS",
- "filter-passenger": "PASSENGER",
- "filter-freight": "FREIGHT",
- "filter-other": "OTHER",
- "filter-noTimetable": "NO TIMETABLE",
- "filter-withTimetable": "TIMETABLE",
-
- "filter-reset": "RESET FILTERS",
- "filter-clear": "CLEAR FILTERS",
-
- "filter-section-timetable-status": "TIMETABLE STATUS",
- "filter-section-twrskr": "WARNINGS",
-
- "filter-all": "ALL ENTRIES",
- "filter-abandoned": "ABANDONED",
- "filter-fulfilled": "FULFILLED",
- "filter-active": "ACTIVE"
- },
- "filters": {
- "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": {
- "quick": "QUICK FILTERS",
- "reality": "SCENERY REALITY",
- "package-access": "IN-GAME AVAILABILITY",
- "access": "GENERAL AVAILABILITY",
- "control": "CONTROLS",
- "signals": "SIGNALLING",
- "addons": "ADDITIONAL PROGRAMS",
- "blockades": "BLOCK SIGNALLING",
- "status": "ONLINE STATUS"
- },
-
- "all-available": "ALL AVAILABLE",
- "all-free": "CURRENTLY FREE",
-
- "endingStatus": "ENDS SOON",
- "afkStatus": "AFK",
- "noSpaceStatus": "NO SPACE",
- "unavailableStatus": "UNAVAILABLE",
-
- "title": "STATION FILTERS",
- "default": "IN-GAME",
- "not-default": "ADDITIONAL",
- "real": "REAL",
- "fictional": "FICTIONAL",
- "unavailable": "UNSUPPORTED",
- "non-public": "NON-PUBLIC",
- "abandoned": "ABANDONED",
-
- "SPK": "SPK",
- "SPK-R": "SPK + MANUAL",
- "SPK-M": "SPK + MECH.",
- "SCS": "SCS",
- "SCS-R": "SCS + MANUAL",
- "SCS-M": "SCS + MECH.",
- "SPE": "SPE",
-
- "manual": "MANUAL",
- "mechanical": "MECHANICAL",
-
- "SUP": "SUP (RASP-UZK)",
- "noSUP": "WITHOUT SUP",
-
- "SBL": "AUTOMATIC (SBL)",
- "PBL": "SEMIAUTOMATIC (PBL)",
-
- "modern": "MODERN",
- "semaphores": "SEMAPHORES",
- "mixed": "MIXED",
- "historical": "HISTORICAL",
- "free": "FREE",
- "occupied": "OCCUPIED",
- "sliders": {
- "min-lvl": "MIN. REQUIRED DISPATCHER LEVEL",
- "max-lvl": "MAX. REQUIRED DISPATCHER LEVEL",
- "routes-1t-cat": "MIN. CATENARY SINGLE TRACK ROUTES",
- "routes-1t-other": "MIN. OTHER SINGLE TRACK ROUTES",
- "routes-2t-cat": "MIN. CATENARY DOUBLE TRACK ROUTES",
- "routes-2t-other": "MIN. OTHER DOUBLE TRACK ROUTES"
- },
- "authors-search": "Search by author (other filters apply)",
- "minimum-hours-title": "SHOW ONLY SCENERIES UNTIL:",
- "now": "NOW",
- "hour": "h",
- "no-limit": "NO LIMIT",
- "include-selected": "INCLUDE SELECTED",
- "save": "REMEMBER FILTERS",
- "reset": "RESET FILTERS",
- "close": "CLOSE FILTERS"
- },
- "sceneries": {
- "station": "Station",
- "min-lvl": "Min. dispatcher\nlevel",
- "status": "Status",
- "dispatcher": "Dispatcher",
- "dispatcher-lvl": "Dispatcher\nlevel",
- "routes": "Routes\ndouble / single",
- "general": "General info",
- "user": "Drivers online",
- "spawn": "Spawns online",
- "timetableAll": "Active timetables",
- "timetableConfirmed": "Confirmed timetables",
- "timetableUnconfirmed": "Unconfirmed timetables",
- "no-stations": "No stations to show here!",
- "scenery-search": "Search for scenery..."
- },
- "trains": {
- "no-trains": "No trains to show here!",
- "loading": "Loading train data...",
- "offline": "Offline ride",
-
- "stats": "TRAFFIC STATISTICS",
- "stats-speed": "TRAINS SPEED (MIN, AVG, MAX) [km/h]",
- "stats-length": "TIMETABLES LENGTH (MIN, AVG, MAX) [km]",
- "stats-categories": "TIMETABLE CATEGORIES",
- "stats-special-twr": "HIGH RISK",
- "stats-special-skr": "EXCEEDED STRUCT. GAUGE",
- "stats-locos": "MOST COMMON UNITS",
-
- "current-scenery": "on scenery",
- "current-signal": "at signal",
- "current-track": "on track",
-
- "delayed": "Delayed: ",
- "preponed": "Ahead of schedule: ",
- "on-time": "On time",
-
- "route-progress": "Progress: ",
-
- "detailed-timetable": "Detailed timetable for train no. ",
- "via-title": "Via: ",
- "no-timetable": "no current timetable",
- "distance-exceeded": "Attention! Due to an internal error, timetables with route distance greater than 200km might be incorrect!",
- "cars": "Car count",
- "EZT": "EMU",
- "SZT": "DMU",
- "loco-electric": "Electric locomotive",
- "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.",
-
- "last-seen-now": "since now",
- "last-seen-min": "since one minute",
- "last-seen-ago": "since {minutes} minutes",
-
- "scenery-offline": "Offline ride",
- "timeout": "An error occured while trying to refresh SWDR timetable data!"
- },
- "journal": {
- "title": "DISPATCHER HISTORY",
- "loading": "Loading dispatcher history data...",
- "no-history": "No dispatcher history found!",
- "data-refreshed-at": "Data refreshed at",
-
- "section-timetables": "TIMETABLES",
- "section-dispatchers": "DISPATCHERS",
-
- "no-further-data": "No further data for current parameters",
- "loading-further-data": "Loading...",
-
- "route-length": "Route length:",
- "station-count": "Stations:",
- "dispatcher-name": "Author",
- "timetable-day": "Timetable created at",
- "timetable-active": "ACTIVE",
- "timetable-fulfilled": "FULFILLED",
- "timetable-abandoned": "ABANDONED",
-
- "online-since": "ONLINE SINCE",
- "duty-lasted": "The duty lasted",
-
- "hours": "{value} hour | {value} hours",
- "minutes": "{value} min | {value} mins",
- "seconds": "{value} s",
-
- "stock-info": "EXTRA INFO",
- "stock-length": "Length",
- "stock-mass": "Mass",
- "stock-max-speed": "Max. speed",
-
- "load-data": "Load further data...",
-
- "last-seen-at": "Last seen at",
- "currently-at": "Currently at",
-
- "stats-title": "DRIVING STATISTICS OF",
-
- "stats-timetables": "TIMETABLES",
- "stats-longest-timetable": "LONGEST TIMETABLE",
- "stats-avg-timetable": "AVERAGE TIMETABLE LENGTH",
- "stats-distance": "DISTANCE",
- "stats-stations": "STATIONS",
-
- "timetable-stats-title": "Daily stats on {date}",
- "timetable-stats-total": "Issued timetables: {count} (total distance: {distance})",
- "timetable-stats-longest": "The longest timetable: #{id} (made by {author} for {driver}, distance: {distance})",
- "timetable-stats-most-active-dr": "The most active dispatcher: {dispatcher} (created {count})",
- "timetable-stats-most-active-dr-many": "The most active dispatchers: {dispatchers} (created {count} each)",
- "timetable-stats-most-active-driver": "The most active driver: {driver} (total driven distance: {distance})",
- "timetable-stats-longest-duties": "The longest service: {dispatcher} at {station} (duration: {duration})",
-
- "timetable-count": "timetable | timetables",
-
- "daily-stats-title": "DAILY STATS",
- "daily-stats-info": "Today's statistics are unavailable yet!",
-
- "driver-stats-title": "DRIVER STATS",
- "driver-stats-info": "Enter a proper nickname into filters [F] to see user's driving statistics!",
-
- "stats-loading": "Fetching statistics...",
- "stats-error": "Oops! An unexpected error occurred while trying to fetch statistics! :/",
-
- "timetable-location-signal": "signal:",
- "timetable-location-route": "route:",
-
- "history-name": "Scenery name",
- "history-hash": "Hash",
- "history-dispatcher": "Dispatcher",
- "history-level": "Level",
- "history-rate": "Rate",
- "history-region": "Region",
- "history-date": "Service date"
- },
- "scenery": {
- "users": "PLAYERS ONLINE",
- "spawns": "OPEN SPAWNS",
- "timetables": "ACTIVE TIMETABLES",
- "no-timetables": "No active timetables!",
- "offline": "Scenery is offline",
- "no-users": "NO ACTIVE PLAYERS",
- "no-spawns": "NO OPEN SPAWNS",
- "no-scenery": "Oops! This scenery doesn't exist!",
- "return-btn": "Return to main site",
- "history-btn": "View the dispatcher history",
- "info-btn": "Return to the scenery view",
- "authors-title": "Scenery author | Scenery authors",
- "abbrev": "Station symbol:",
- "lines-title": "Real lines",
- "project-title": "Project name",
- "one-way-routes": "One way routes",
- "two-way-routes": "Two way routes",
-
- "option-active-timetables": "Active timetables",
- "option-timetables-history": "Timetables history",
- "option-dispatchers-history": "Dispatchers history",
-
- "timetable-author-title": "Issued by",
- "timetable-author-unknown": "Author unknown",
-
- "timetables-history-id": "ID",
- "timetables-history-number": "Number",
- "timetables-history-route": "Route",
- "timetables-history-driver": "Driver",
- "timetables-history-author": "TT author",
- "timetables-history-date": "Date",
-
- "dispatchers-history-hash": "Hash",
- "dispatchers-history-dispatcher": "Dispatcher",
- "dispatchers-history-level": "Level",
- "dispatchers-history-rate": "Rate",
- "dispatchers-history-date": "Service date",
-
- "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",
-
- "pragotron-link": "Timetable pallet board (beta)",
- "tablice-link": "Timetable summary board (by Thundo)",
-
- "bottom-info": "Show full history in the Journal tab"
- },
- "availability": {
- "title": "Availability",
- "default": "in-game",
- "nonDefault": "additional",
- "unavailable": "unavailable",
- "nonPublic": "private",
- "abandoned": "abandoned"
- },
- "timetables": {
- "timetable-only": "Switch to timetable-only view",
- "end": "Timetable terminates here",
- "terminated": "Timetable terminated",
- "begins": "BEGINS HERE",
- "terminates": "TERMINATES\nHERE",
-
- "from": "FROM",
- "to": "TO",
-
- "desc-arriving": "The train is not here yet. It's going to come from: {prevStationName} (szlak {prevDepartureLine})",
- "desc-online": "The train is at the station. It's going to leave to: {nextStationName} (szlak {nextArrivalLine})",
- "desc-stopped": "The train is at the station and is stopped. It's going to leave towards: {nextStationName} (szlak {nextArrivalLine})",
- "desc-next-arrival": "Leaves towards: {nextStationName} (szlak {nextArrivalLine})",
- "desc-departed": "The train is at the station and it's been departed. Leaves towards: {nextStationName} (szlak {nextArrivalLine})",
- "desc-departed-away": "The train has been departed to: {nextStationName} (szlak {nextArrivalLine})",
- "desc-end": "The train terminates here",
- "desc-terminated": "The train has been terminated"
- },
- "history": {
- "title": "TIMETABLE JOURNAL",
- "search-train": "Train no.",
- "search-driver": "Driver name"
- }
-}
+{
+ "general": {
+ "and": " and ",
+ "refresh": "REFRESH",
+ "TWR": "High risk freight train",
+ "SKR": "Train with exceeded gauge"
+ },
+ "app": {
+ "sceneries": "SCENERIES",
+ "trains": "TRAINS",
+ "journal": "JOURNAL",
+ "loading": "Loading data...",
+ "support": "Support the project",
+ "error": "An error occured while loading data!",
+ "no-result": "No results for current search!",
+ "migration-warning": "Stacjownik services will be unavailable 2/06/2022 between 1-3am (CEST time) due to the migration of API hostings!",
+ "migration-confirm": "Roger that!",
+ "offline": "App is in the offline mode!"
+ },
+ "footer": {
+ "discord": "Stacjownik Discord server"
+ },
+ "update": {
+ "title": "New version of the app is available!",
+ "paragraph1": "Enjoy the application and may the green signal be with you!",
+ "release-link": "Click here to browse version changelog (GitHub)",
+ "confirm-button": "UPDATE NOW",
+ "later-button": "LATER"
+ },
+ "data-status": {
+ "S1-offline": "S1 signal
The app is working in offline mode!",
+ "S1a-connection": "S1a signal
Cannot connect with Stacjownik API service!",
+ "S1a-sceneries": "S1a signal
Cannot load online stations data!",
+ "S2": "S2 signal
All data loaded successfully!",
+ "S3": "S3 signal
Loading data...",
+ "S5-timetables": "S5 signal
Timetables might be incorrect or missing!",
+ "S5-dispatchers": "S5 signal
Cannot load dispatchers status data!",
+ "S5-trains": "S5 signal
Cannot load online trains data!"
+ },
+ "desc": {
+ "control-type": "Control type: ",
+ "signals-type": "Signals type: ",
+ "SBL": "This scenery has automatic block signalling (ABS/SBL) system on following routes: ",
+ "SUP": "Requires the SUP application (level crossing remote control simulator)",
+ "TWB-all": "This scenery has two-way route blockade on all routes",
+ "TWB-routes": "This scenery has two-way route blockade on following routes: ",
+ "default": "This scenery is available by default",
+ "non-public": "This scenery is not public",
+ "unknown": "This scenery isn't recognizable right now",
+ "unavailable": "This scenery is unavailable",
+ "abandoned": "This scenery is no longer supported by its creators",
+ "real": "Scenery with real lines: "
+ },
+ "signals": {
+ "title": "Signal type",
+ "współczesna": "modern",
+ "mieszana": "mixed",
+ "kształtowa": "mechanical",
+ "historyczna": "historical"
+ },
+ "controls": {
+ "title": "Control type",
+ "SPK": "SPK",
+ "SCS": "SCS",
+ "SCS-SPK": "SCS/SPK",
+ "SPE": "SPE",
+ "ręczne": "manual",
+ "ręczne+SPK": "manual + SPK",
+ "ręczne+SCS": "manual + SCS",
+ "mechaniczne": "levers (mechanical)",
+ "mechaniczne+SPK": "levers + SPK",
+ "mechaniczne+SCS": "levers + SCS"
+ },
+ "status": {
+ "online": "UNTIL ",
+ "free": "FREE",
+ "ending": "ENDS SOON",
+ "not-signed": "NOT SIGNED IN",
+ "no-limit": "NO LIMIT",
+ "unavailable": "UNAVAILABLE",
+ "brb": "AFK",
+ "no-space": "NO SPACE",
+ "unknown": "UNKNOWN"
+ },
+ "options": {
+ "filters": "FILTERS",
+ "donate": "DONATE",
+
+ "search-button": "Search",
+ "reset-button": "Reset",
+
+ "sort-title": "SORT BY:",
+ "filter-title": "FILTER BY:",
+ "search-title": "SEARCH:",
+
+ "search-train-no": "Train no. / #",
+ "search-train": "Train no.",
+ "search-driver": "Driver name",
+ "search-dispatcher": "Dispatcher name",
+ "search-station": "Scenery name",
+ "search-author": "Timetable author name",
+ "search-issuedFrom": "Origin scenery name",
+ "search-timetables-date": "Timetable date (UTC+2 / CEST)",
+ "search-dispatchers-date": "Service date (UTC+2 / CEST)",
+ "search-date": "Date (UTC+2 / CEST)",
+
+ "sort-mass": "mass",
+ "sort-speed": "speed",
+ "sort-length": "length",
+ "sort-routeDistance": "route distance",
+ "sort-timetable": "train no.",
+ "sort-progress": "route progress",
+ "sort-delay": "current delay",
+ "sort-id": "timetable id",
+
+ "sort-allStopsCount": "total stops",
+ "sort-beginDate": "date",
+ "sort-timetableId": "timetable ID",
+ "sort-timestampFrom": "date",
+ "sort-duration": "duration",
+
+ "filter-noComments": "NO COMMENTS",
+ "filter-withComments": "COMMENTS",
+ "filter-twr": "HIGH RISK CARGO",
+ "filter-skr": "EXCEEDED GAUGE",
+ "filter-twr-skr": "ALL TYPES",
+ "filter-common": "NO WARNINGS",
+ "filter-passenger": "PASSENGER",
+ "filter-freight": "FREIGHT",
+ "filter-other": "OTHER",
+ "filter-noTimetable": "NO TIMETABLE",
+ "filter-withTimetable": "TIMETABLE",
+
+ "filter-reset": "RESET FILTERS",
+ "filter-clear": "CLEAR FILTERS",
+
+ "filter-section-timetable-status": "TIMETABLE STATUS",
+ "filter-section-twrskr": "WARNINGS",
+
+ "filter-all": "ALL ENTRIES",
+ "filter-abandoned": "ABANDONED",
+ "filter-fulfilled": "FULFILLED",
+ "filter-active": "ACTIVE"
+ },
+ "filters": {
+ "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": {
+ "quick": "QUICK FILTERS",
+ "reality": "SCENERY REALITY",
+ "package-access": "IN-GAME AVAILABILITY",
+ "access": "GENERAL AVAILABILITY",
+ "control": "CONTROLS",
+ "signals": "SIGNALLING",
+ "addons": "ADDITIONAL PROGRAMS",
+ "blockades": "BLOCK SIGNALLING",
+ "status": "ONLINE STATUS"
+ },
+
+ "all-available": "ALL AVAILABLE",
+ "all-free": "CURRENTLY FREE",
+
+ "endingStatus": "ENDS SOON",
+ "afkStatus": "AFK",
+ "noSpaceStatus": "NO SPACE",
+ "unavailableStatus": "UNAVAILABLE",
+
+ "title": "STATION FILTERS",
+ "default": "IN-GAME",
+ "not-default": "ADDITIONAL",
+ "real": "REAL",
+ "fictional": "FICTIONAL",
+ "unavailable": "UNSUPPORTED",
+ "non-public": "NON-PUBLIC",
+ "abandoned": "ABANDONED",
+
+ "SPK": "SPK",
+ "SPK-R": "SPK + MANUAL",
+ "SPK-M": "SPK + MECH.",
+ "SCS": "SCS",
+ "SCS-R": "SCS + MANUAL",
+ "SCS-M": "SCS + MECH.",
+ "SPE": "SPE",
+
+ "manual": "MANUAL",
+ "mechanical": "MECHANICAL",
+
+ "SUP": "SUP (RASP-UZK)",
+ "noSUP": "WITHOUT SUP",
+
+ "SBL": "AUTOMATIC (SBL)",
+ "PBL": "SEMIAUTOMATIC (PBL)",
+
+ "modern": "MODERN",
+ "semaphores": "SEMAPHORES",
+ "mixed": "MIXED",
+ "historical": "HISTORICAL",
+ "free": "FREE",
+ "occupied": "OCCUPIED",
+ "sliders": {
+ "min-lvl": "MIN. REQUIRED DISPATCHER LEVEL",
+ "max-lvl": "MAX. REQUIRED DISPATCHER LEVEL",
+ "routes-1t-cat": "MIN. CATENARY SINGLE TRACK ROUTES",
+ "routes-1t-other": "MIN. OTHER SINGLE TRACK ROUTES",
+ "routes-2t-cat": "MIN. CATENARY DOUBLE TRACK ROUTES",
+ "routes-2t-other": "MIN. OTHER DOUBLE TRACK ROUTES"
+ },
+ "authors-search": "Search by author (other filters apply)",
+ "minimum-hours-title": "SHOW ONLY SCENERIES UNTIL:",
+ "now": "NOW",
+ "hour": "h",
+ "no-limit": "NO LIMIT",
+ "include-selected": "INCLUDE SELECTED",
+ "save": "REMEMBER FILTERS",
+ "reset": "RESET FILTERS",
+ "close": "CLOSE FILTERS"
+ },
+ "sceneries": {
+ "station": "Station",
+ "min-lvl": "Min. dispatcher\nlevel",
+ "status": "Status",
+ "dispatcher": "Dispatcher",
+ "dispatcher-lvl": "Dispatcher\nlevel",
+ "routes": "Routes\ndouble / single",
+ "general": "General info",
+ "user": "Drivers online",
+ "spawn": "Spawns online",
+ "timetableAll": "Active timetables",
+ "timetableConfirmed": "Confirmed timetables",
+ "timetableUnconfirmed": "Unconfirmed timetables",
+ "no-stations": "No stations to show here!",
+ "scenery-search": "Search for scenery..."
+ },
+ "trains": {
+ "no-trains": "No trains to show here!",
+ "loading": "Loading train data...",
+ "offline": "Offline ride",
+
+ "stats": "TRAFFIC STATISTICS",
+ "stats-speed": "TRAINS SPEED (MIN, AVG, MAX) [km/h]",
+ "stats-length": "TIMETABLES LENGTH (MIN, AVG, MAX) [km]",
+ "stats-categories": "TIMETABLE CATEGORIES",
+ "stats-special-twr": "HIGH RISK",
+ "stats-special-skr": "EXCEEDED STRUCT. GAUGE",
+ "stats-locos": "MOST COMMON UNITS",
+
+ "current-scenery": "on scenery",
+ "current-signal": "at signal",
+ "current-track": "on track",
+
+ "delayed": "Delayed: ",
+ "preponed": "Ahead of schedule: ",
+ "on-time": "On time",
+
+ "route-progress": "Progress: ",
+
+ "detailed-timetable": "Detailed timetable for train no. ",
+ "via-title": "Via: ",
+ "no-timetable": "no current timetable",
+ "distance-exceeded": "Attention! Due to an internal error, timetables with route distance greater than 200km might be incorrect!",
+ "cars": "Car count",
+ "EZT": "EMU",
+ "SZT": "DMU",
+ "loco-electric": "Electric locomotive",
+ "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.",
+
+ "last-seen-now": "since now",
+ "last-seen-min": "since one minute",
+ "last-seen-ago": "since {minutes} minutes",
+
+ "scenery-offline": "Offline ride",
+ "timeout": "An error occured while trying to refresh SWDR timetable data!"
+ },
+ "journal": {
+ "title": "DISPATCHER HISTORY",
+ "loading": "Loading dispatcher history data...",
+ "no-history": "No dispatcher history found!",
+ "data-refreshed-at": "Data refreshed at",
+
+ "section-timetables": "TIMETABLES",
+ "section-dispatchers": "DISPATCHERS",
+
+ "no-further-data": "No further data for current parameters",
+ "loading-further-data": "Loading...",
+
+ "route-length": "Route length:",
+ "station-count": "Stations:",
+ "dispatcher-name": "Author",
+ "timetable-day": "Timetable created at",
+ "timetable-active": "ACTIVE",
+ "timetable-fulfilled": "FULFILLED",
+ "timetable-abandoned": "ABANDONED",
+
+ "online-since": "ONLINE SINCE",
+ "duty-lasted": "The duty lasted",
+
+ "hours": "{value} hour | {value} hours",
+ "minutes": "{value} min | {value} mins",
+ "seconds": "{value} s",
+
+ "stock-info": "EXTRA INFO",
+ "stock-length": "Length",
+ "stock-mass": "Mass",
+ "stock-max-speed": "Max. speed",
+
+ "load-data": "Load further data...",
+
+ "last-seen-at": "Last seen at",
+ "currently-at": "Currently at",
+
+ "stats-title": "DRIVING STATISTICS OF",
+
+ "stats-timetables": "TIMETABLES",
+ "stats-longest-timetable": "LONGEST TIMETABLE",
+ "stats-avg-timetable": "AVERAGE TIMETABLE LENGTH",
+ "stats-distance": "DISTANCE",
+ "stats-stations": "STATIONS",
+
+ "timetable-stats-title": "Daily stats on {date}",
+ "timetable-stats-total": "Issued timetables: {count} (total distance: {distance})",
+ "timetable-stats-longest": "The longest timetable: #{id} (made by {author} for {driver}, distance: {distance})",
+ "timetable-stats-most-active-dr": "The most active dispatcher: {dispatcher} (created {count})",
+ "timetable-stats-most-active-dr-many": "The most active dispatchers: {dispatchers} (created {count} each)",
+ "timetable-stats-most-active-driver": "The most active driver: {driver} (total driven distance: {distance})",
+ "timetable-stats-longest-duties": "The longest service: {dispatcher} at {station} (duration: {duration})",
+
+ "timetable-count": "timetable | timetables",
+
+ "daily-stats-title": "DAILY STATS",
+ "daily-stats-info": "Today's statistics are unavailable yet!",
+
+ "driver-stats-title": "DRIVER STATS",
+ "driver-stats-info": "Enter a proper nickname into filters [F] to see user's driving statistics!",
+
+ "stats-loading": "Fetching statistics...",
+ "stats-error": "Oops! An unexpected error occurred while trying to fetch statistics! :/",
+
+ "timetable-location-signal": "signal:",
+ "timetable-location-route": "route:",
+
+ "history-name": "Scenery name",
+ "history-hash": "Hash",
+ "history-dispatcher": "Dispatcher",
+ "history-level": "Level",
+ "history-rate": "Rate",
+ "history-region": "Region",
+ "history-date": "Service date"
+ },
+ "scenery": {
+ "users": "PLAYERS ONLINE",
+ "spawns": "OPEN SPAWNS",
+ "timetables": "ACTIVE TIMETABLES",
+ "no-timetables": "No active timetables!",
+ "offline": "Scenery is offline",
+ "no-users": "NO ACTIVE PLAYERS",
+ "no-spawns": "NO OPEN SPAWNS",
+ "no-scenery": "Oops! This scenery doesn't exist!",
+ "return-btn": "Return to main site",
+ "history-btn": "View the dispatcher history",
+ "info-btn": "Return to the scenery view",
+ "authors-title": "Scenery author | Scenery authors",
+ "abbrev": "Station symbol:",
+ "lines-title": "Real lines",
+ "project-title": "Project name",
+ "one-way-routes": "One way routes",
+ "two-way-routes": "Two way routes",
+
+ "option-active-timetables": "Active timetables",
+ "option-timetables-history": "Timetables history",
+ "option-dispatchers-history": "Dispatchers history",
+
+ "timetable-author-title": "Issued by",
+ "timetable-author-unknown": "Author unknown",
+
+ "timetables-history-id": "ID",
+ "timetables-history-number": "Number",
+ "timetables-history-route": "Route",
+ "timetables-history-driver": "Driver",
+ "timetables-history-author": "TT author",
+ "timetables-history-date": "Date",
+
+ "dispatchers-history-hash": "Hash",
+ "dispatchers-history-dispatcher": "Dispatcher",
+ "dispatchers-history-level": "Level",
+ "dispatchers-history-rate": "Rate",
+ "dispatchers-history-date": "Service date",
+
+ "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",
+
+ "pragotron-link": "Timetable pallet board (beta)",
+ "tablice-link": "Timetable summary board (by Thundo)",
+
+ "bottom-info": "Show full history in the Journal tab"
+ },
+ "availability": {
+ "title": "Availability",
+ "default": "in-game",
+ "nonDefault": "additional",
+ "unavailable": "unavailable",
+ "nonPublic": "private",
+ "abandoned": "abandoned"
+ },
+ "timetables": {
+ "timetable-only": "Switch to timetable-only view",
+ "end": "Timetable terminates here",
+ "terminated": "Timetable terminated",
+ "begins": "BEGINS HERE",
+ "terminates": "TERMINATES\nHERE",
+
+ "from": "FROM",
+ "to": "TO",
+
+ "desc-arriving": "The train is not here yet. It's going to come from: {prevStationName} (szlak {prevDepartureLine})",
+ "desc-online": "The train is at the station. It's going to leave to: {nextStationName} (szlak {nextArrivalLine})",
+ "desc-stopped": "The train is at the station and is stopped. It's going to leave towards: {nextStationName} (szlak {nextArrivalLine})",
+ "desc-next-arrival": "Leaves towards: {nextStationName} (szlak {nextArrivalLine})",
+ "desc-departed": "The train is at the station and it's been departed. Leaves towards: {nextStationName} (szlak {nextArrivalLine})",
+ "desc-departed-away": "The train has been departed to: {nextStationName} (szlak {nextArrivalLine})",
+ "desc-end": "The train terminates here",
+ "desc-terminated": "The train has been terminated"
+ },
+ "history": {
+ "title": "TIMETABLE JOURNAL",
+ "search-train": "Train no.",
+ "search-driver": "Driver name"
+ }
+}
diff --git a/src/locales/pl-old.json b/src/locales/pl-old.json
new file mode 100644
index 0000000..42868ac
--- /dev/null
+++ b/src/locales/pl-old.json
@@ -0,0 +1,434 @@
+{
+ "general": {
+ "and": " oraz ",
+ "refresh": "ODŚWIEŻ",
+ "TWR": "Towar niebezpieczny wysokiego ryzyka",
+ "SKR": "Przekroczona skrajnia"
+ },
+ "app": {
+ "sceneries": "SCENERIE",
+ "trains": "POCIĄGI",
+ "journal": "DZIENNIK",
+ "loading": "Pobieranie danych...",
+ "support": "Wspomóż projekt",
+ "error": "Wystąpił problem z załadowaniem danych!",
+ "no-result": "Brak wyników o podanych kryteriach!",
+ "migration-warning": "Usługi Stacjownika będą niedostępne w godzinach 1:00-3:00 2 czerwca 2022r. z powodu migracji hostingów API!",
+ "migration-confirm": "Przyjąłem!",
+ "offline": "Aplikacja w trybie offline!"
+ },
+ "footer": {
+ "discord": "Serwer Discord Stacjownika"
+ },
+ "update": {
+ "title": "Nowa wersja Stacjownika jest dostępna!",
+ "paragraph1": "Miłego korzystania z aplikacji i niech S2 będzie z wami!",
+ "release-link": "Kliknij, aby przejrzeć listę zmian (GitHub)",
+ "confirm-button": "ZAKTUALIZUJ",
+ "later-button": "PÓŹNIEJ"
+ },
+ "data-status": {
+ "S1-offline": "Sygnał S1
Aplikacja działa w trybie offline!",
+ "S1a-connection": "Sygnał S1a
Błąd podczas próby połączenia się z API Stacjownika!",
+ "S1a-sceneries": "Sygnał S1a
Błąd podczas pobierania danych o sceneriach online!",
+ "S2": "Sygnał S2
Pomyślnie załadowano dane!",
+ "S3": "Sygnał S3
Pobieranie danych...",
+ "S5-timetables": "Sygnał S5
Rozkłady jazdy mogą być niekompletne!",
+ "S5-dispatchers": "Sygnał S5
Błąd podczas pobierania danych o statusach dyżurnych ruchu!",
+ "S5-trains": "Sygnał S5
Błąd podczas pobierania danych o pociągach online!"
+ },
+ "desc": {
+ "control-type": "Sterowanie: ",
+ "signals-type": "Sygnalizacja: ",
+ "SBL": "Sceneria posiada SBL na szlakach: ",
+ "SUP": "Wymaga programu SUP do kontroli systemu RASP-UZK",
+ "TWB-all": "Sceneria posiada blokadę dwukierunkową na wszystkich szlakach",
+ "TWB-routes": "Sceneria posiada blokadę dwukierunkową na szlakach: ",
+ "default": "Sceneria dostępna domyślnie w paczce z grą",
+ "non-public": "Sceneria niepubliczna",
+ "unavailable": "Sceneria niedostępna",
+ "unknown": "Nieznana sceneria",
+ "real": "Sceneria z realnymi liniami kolejowymi: ",
+ "abandoned": "Sceneria wycofana z rozgrywki"
+ },
+ "signals": {
+ "title": "Sygnalizacja",
+ "współczesna": "współczesna",
+ "mieszana": "mieszana",
+ "kształtowa": "kształtowa",
+ "historyczna": "historyczna"
+ },
+ "controls": {
+ "title": "Sterowanie",
+ "SPK": "SPK",
+ "SCS": "SCS",
+ "SCS-SPK": "SCS/SPK",
+ "SPE": "SPE",
+ "ręczne": "ręczne",
+ "ręczne+SPK": "ręczne z SPK",
+ "ręczne+SCS": "ręczne z SCS",
+ "mechaniczne": "mechaniczne",
+ "mechaniczne+SPK": "mechaniczne z SPK",
+ "mechaniczne+SCS": "mechaniczne z SCS"
+ },
+ "status": {
+ "online": "DO ",
+ "free": "WOLNA",
+ "ending": "KOŃCZY",
+ "not-signed": "NIEZALOGOWANY",
+ "no-limit": "BEZ LIMITU",
+ "unavailable": "NIEDOSTĘPNY",
+ "brb": "Z/W",
+ "no-space": "BRAK MIEJSCA",
+ "unknown": "NIEZNANY"
+ },
+ "options": {
+ "filters": "FILTRY",
+ "donate": "WESPRZYJ",
+
+ "search-button": "Szukaj",
+ "reset-button": "Zresetuj",
+
+ "sort-title": "SORTUJ WG:",
+ "filter-title": "FILTRUJ WG:",
+ "search-title": "SZUKAJ:",
+
+ "search-train-no": "Nr pociągu",
+ "search-train": "Nr pociągu / #",
+ "search-driver": "Nick maszynisty",
+ "search-dispatcher": "Nick dyżurnego",
+ "search-station": "Nazwa scenerii",
+ "search-author": "Nick autora rozkładu jazdy",
+ "search-issuedFrom": "Sceneria początkowa",
+ "search-timetables-date": "Data rozkładu jazdy (UTC+2 / CEST)",
+ "search-dispatchers-date": "Data służby (UTC+2 / CEST)",
+ "search-date": "Data (UTC+2 / CEST)",
+
+ "sort-routeDistance": "kilometraż",
+ "sort-allStopsCount": "stacje",
+ "sort-beginDate": "data",
+ "sort-timetableId": "ID rozkładu",
+ "sort-timestampFrom": "data",
+ "sort-duration": "czas dyżuru",
+ "sort-id": "id rozkładu",
+
+ "sort-mass": "masa",
+ "sort-speed": "prędkość",
+ "sort-length": "długość",
+ "sort-timetable": "nr pociągu",
+ "sort-progress": "przebyta trasa",
+ "sort-delay": "opóźnienie",
+ "sort-comments": "uwagi ekspl.",
+
+ "filter-withComments": "UWAGI EKSPLOATACYJNE",
+ "filter-noComments": "BEZ UWAG",
+ "filter-twr": "WYS. RYZYKA",
+ "filter-skr": "SKRAJNIA",
+ "filter-twr-skr": "WSZYSTKIE",
+ "filter-common": "ZWYKŁE",
+ "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",
+
+ "filter-section-timetable-status": "STATUS ROZKŁADU JAZDY",
+ "filter-section-twrskr": "UWAGI",
+
+ "filter-all": "WSZYSTKIE",
+ "filter-abandoned": "PORZUCONE",
+ "filter-fulfilled": "WYPEŁNIONE",
+ "filter-active": "AKTYWNE"
+ },
+ "filters": {
+ "desc": " • Kliknięcie: zaznaczenie / odznaczenie filtru
• Podwójne kliknięcie: odznaczenie reszty filtrów z grupy
• RESET: zresetowanie filtrów z grupy",
+
+ "sections": {
+ "quick": "SZYBKIE FILTRY",
+ "reality": "FIKCYJNOŚĆ SCENERII",
+ "package-access": "DOSTĘPNOŚĆ W PACZCE",
+ "access": "DOSTĘPNOŚĆ OGÓLNA",
+ "control": "TYP STEROWANIA",
+ "signals": "TYP SYGNALIZACJI",
+ "addons": "DODATKOWE PROGRAMY",
+ "blockades": "BLOKADY LINIOWE",
+ "status": "STATUS ONLINE"
+ },
+
+ "all-available": "WSZYSTKIE DOSTĘPNE",
+ "all-free": "WSZYSTKIE WOLNE",
+
+ "endingStatus": "KOŃCZY",
+ "afkStatus": "Z/W",
+ "noSpaceStatus": "BRAK MIEJSCA",
+ "unavailableStatus": "NIEDOSTĘPNY",
+
+ "title": "FILTRUJ STACJE",
+ "default": "DOMYŚLNA",
+ "not-default": "POZA PACZKĄ",
+ "real": "REALNA",
+ "fictional": "FIKCYJNA",
+ "unavailable": "NIEDOSTĘPNA",
+ "non-public": "NIEPUBLICZNA",
+ "abandoned": "WYCOFANA",
+
+ "SPK": "SPK",
+ "SPK-R": "SPK + RĘCZNE",
+ "SPK-M": "SPK + MECH.",
+ "SCS": "SCS",
+ "SCS-R": "SCS + RĘCZNE",
+ "SCS-M": "SCS + MECH.",
+ "SPE": "SPE",
+ "manual": "RĘCZNE",
+
+ "SUP": "SUP (RASP-UZK)",
+ "noSUP": "BEZ SUP",
+
+ "SBL": "SAMOCZYNNA",
+ "PBL": "PÓŁSAMOCZYNNA",
+
+ "mechanical": "MECHANICZNE",
+ "modern": "WSPÓŁCZESNA",
+ "semaphores": "KSZTAŁTOWA",
+ "mixed": "MIESZANA",
+ "historical": "HISTORYCZNA",
+
+ "free": "WOLNA",
+ "occupied": "ZAJĘTA",
+
+ "sliders": {
+ "min-lvl": "MIN. WYMAGANY POZIOM DYŻURNEGO",
+ "max-lvl": "MAKS. WYMAGANY POZIOM DYŻURNEGO",
+ "routes-1t-cat": "SZLAKI JEDNOTOROWE ZELEKTR. (MINIMUM)",
+ "routes-1t-other": "SZLAKI JEDNOTOROWE NIEZELEKTR. (MINIMUM)",
+ "routes-2t-cat": "SZLAKI DWUTOROWE ZELEKTR. (MINIMUM)",
+ "routes-2t-other": "SZLAKI DWUTOROWE NIEZELEKTR. (MINIMUM)"
+ },
+
+ "authors-search": "Szukaj autora (uwzględnia inne filtry)",
+ "minimum-hours-title": "POKAŻ TYLKO SCENERIE DOSTĘPNE MINIMUM DO:",
+ "now": "TERAZ",
+ "hour": " godz.",
+ "no-limit": "BEZ LIMITU",
+ "include-selected": "POKAŻ ZAZNACZONE",
+ "save": "ZAPAMIĘTAJ FILTRY",
+ "reset": "RESETUJ FILTRY",
+ "close": "ZAMKNIJ FILTRY"
+ },
+ "sceneries": {
+ "station": "Stacja",
+ "abbr": "Skrót\nposterunku",
+ "min-lvl": "Min. poziom\ndyżurnego",
+ "status": "Status",
+ "dispatcher": "Dyżurny",
+ "dispatcher-lvl": "Poziom\ndyżurnego",
+ "routes": "Szlaki\n2tor / 1tor",
+ "general": "Informacje\nogólne",
+ "user": "Maszyniści online",
+ "spawn": "Otwarte spawny",
+ "timetableAll": "Aktywne rozkłady jazdy",
+ "timetableConfirmed": "Zatwierdzone rozkłady jazdy",
+ "timetableUnconfirmed": "Niezatwierdzone rozkłady jazdy",
+ "no-stations": "Brak stacji do wyświetlenia!",
+ "scenery-search": "Wyszukaj scenerię..."
+ },
+ "trains": {
+ "no-trains": "Brak pociągów do wyświetlenia!",
+ "loading": "Pobieranie danych o pociągach...",
+ "offline": "Przejazd offline",
+
+ "stats": "STATYSTYKI RUCHU",
+ "stats-speed": "PRĘDKOŚCI POCIĄGÓW (MIN, ŚR, MAX) [km/h]",
+ "stats-length": "DŁUGOŚCI ROZKŁADÓW (MIN, ŚR, MAX) [km]",
+ "stats-categories": "KATEGORIE RJ",
+ "stats-special-twr": "WYSOKIEGO RYZYKA",
+ "stats-special-skr": "PRZEKROCZONA SKRAJNIA",
+ "stats-locos": "NAJCZĘSTSZE JEDNOSTKI",
+
+ "current-scenery": "na scenerii",
+ "current-signal": "przy semaforze",
+ "current-track": "na szlaku",
+
+ "delayed": "Opóźniony: ",
+ "preponed": "Przed czasem: ",
+ "on-time": "Planowo",
+
+ "route-progress": "Postęp: ",
+
+ "detailed-timetable": "Szczegółowy rozkład jazdy pociągu ",
+ "via-title": "Przez: ",
+ "no-timetable": "brak rozkładu jazdy",
+ "distance-exceeded": "Uwaga! Z powodu wewnętrznego błędu serwera TD2, rozkłady jazdy o kilometrażu powyżej 200km mogą być niepoprawne!",
+ "cars": "Wagony",
+ "EZT": "EZT",
+ "SZT": "SZT",
+ "loco-electric": "Elektrowóz",
+ "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.",
+
+ "last-seen-now": "od niedawna",
+ "last-seen-min": "od minuty",
+ "last-seen-ago": "od {minutes} minut",
+
+ "scenery-offline": "Przejazd offline",
+
+ "timeout": "Wystąpił problem z aktualizacją rozkładów jazdy z SWDR"
+ },
+ "journal": {
+ "title": "HISTORIA DYŻURÓW",
+ "loading": "Ładowanie historii dyżurów...",
+ "no-history": "Brak historii dyżurów dla tej scenerii!",
+ "data-refreshed-at": "Dane odświeżone o",
+
+ "section-timetables": "ROZKŁADY JAZDY",
+ "section-dispatchers": "DYŻURNI",
+
+ "no-further-data": "Brak dalszych wyników dla podanych parametrów",
+ "loading-further-data": "Ładowanie...",
+
+ "online-since": "ONLINE OD",
+ "duty-lasted": "Dyżur trwał",
+ "hours": "{value} godz.",
+ "minutes": "{value} min.",
+ "seconds": "{value} sek.",
+
+ "route-length": "Kilometraż:",
+ "station-count": "Stacje:",
+ "dispatcher-name": "Autor",
+ "timetable-day": "Rozkład z dnia",
+ "timetable-active": "AKTYWNY",
+ "timetable-fulfilled": "WYPEŁNIONY",
+ "timetable-abandoned": "PORZUCONY",
+
+ "stock-info": "DODATKOWE INFORMACJE",
+ "stock-length": "Długość",
+ "stock-mass": "Masa",
+ "stock-max-speed": "Prędkość maks.",
+
+ "load-data": "Pobierz dalszą historię...",
+
+ "stats-title": "STATYSTYKI MASZYNISTY",
+
+ "last-seen-at": "Ostatnio widziany na: ",
+ "currently-at": "Obecnie na scenerii: ",
+
+ "stats-timetables": "ROZKŁADY JAZDY",
+ "stats-longest-timetable": "NAJDŁUŻSZY RJ",
+ "stats-avg-timetable": "ŚREDNIA DŁUGOŚĆ RJ",
+ "stats-distance": "DYSTANS",
+ "stats-stations": "STACJE",
+
+ "timetable-stats-total": "Stworzone rozkłady jazdy: {count} (łączny dystans: {distance})",
+ "timetable-stats-longest": "Najdłuższy rozkład jazdy: #{id} (stworzony przez dyżurnego {author} dla maszynisty {driver} o dystansie {distance})",
+ "timetable-stats-most-active-dr": "Najaktywniejszy dyżurny: {dispatcher} (stworzył {count})",
+ "timetable-stats-most-active-dr-many": "Najaktywniejsi dyżurni: {dispatchers} (stworzyli po {count})",
+ "timetable-stats-most-active-driver": "Najaktywniejszy maszynista: {driver} (łączny przejechany dystans: {distance})",
+ "timetable-stats-longest-duties": "Najdłuższa służba: {dispatcher} na scenerii {station} (czas trwania: {duration})",
+
+ "timetable-count": "rozkład jazdy | rozkładów jazdy",
+
+ "daily-stats-title": "STATYSTYKI DNIA",
+ "daily-stats-info": "Dzisiejsze statystyki nie są jeszcze dostępne!",
+
+ "driver-stats-title": "STATYSTYKI GRACZA",
+ "driver-stats-info": "Wpisz nazwę użytkownika w filtrach [F], aby zobaczyć jego statystyki maszynisty!",
+
+ "stats-loading": "Pobieranie statystyk...",
+ "stats-error": "Ups! Wystąpił błąd podczas próby pobrania statystyk! :/",
+
+ "timetable-location-signal": "semafor:",
+ "timetable-location-route": "szlak:",
+
+ "history-name": "Sceneria",
+ "history-hash": "Hash",
+ "history-dispatcher": "Dyżurny",
+ "history-level": "Poziom",
+ "history-rate": "Ocena",
+ "history-region": "Region",
+ "history-date": "Data służby"
+ },
+ "scenery": {
+ "users": "GRACZE ONLINE",
+ "spawns": "OTWARTE SPAWNY",
+ "timetables": "AKTYWNE ROZKŁADY JAZDY",
+ "no-timetables": "Brak aktywnych rozkładów!",
+ "offline": "Sceneria jest offline",
+ "no-users": "BRAK AKTYWNYCH GRACZY",
+ "no-spawns": "BRAK OTWARTYCH SPAWNÓW",
+ "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óć do widoku scenerii",
+ "authors-title": "Autor scenerii | Autorzy scenerii",
+ "abbrev": "Skrót posterunku:",
+ "lines-title": "Rzeczywiste linie",
+ "project-title": "Projekt",
+ "one-way-routes": "Szlaki jednotorowe",
+ "two-way-routes": "Szlaki dwutorowe",
+
+ "option-active-timetables": "Aktywne rozkłady jazdy",
+ "option-timetables-history": "Historia rozkładów",
+ "option-dispatchers-history": "Historia dyżurów",
+
+ "timetable-author-title": "Wydany przez",
+ "timetable-author-unknown": "Autor nieznany",
+
+ "timetables-history-id": "ID",
+ "timetables-history-number": "Numer",
+ "timetables-history-route": "Trasa",
+ "timetables-history-driver": "Maszynista",
+ "timetables-history-author": "Autor RJ",
+ "timetables-history-date": "Data",
+
+ "dispatchers-history-hash": "Hash",
+ "dispatchers-history-dispatcher": "Dyżurny",
+ "dispatchers-history-level": "Poziom",
+ "dispatchers-history-rate": "Ocena",
+ "dispatchers-history-date": "Data służby",
+
+ "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}",
+
+ "pragotron-link": "Paletowa tablica informacyjna (beta)",
+ "tablice-link": "Tablica informacyjna zbiorcza (autorstwa Thundo)",
+
+ "bottom-info": "Pokaż pełną historię w zakładce Dziennika"
+ },
+ "availability": {
+ "title": "Dostępność",
+ "default": "w paczce",
+ "nonDefault": "poza paczką",
+ "unavailable": "niedostępna",
+ "nonPublic": "niepubliczna",
+ "abandoned": "wycofana"
+ },
+ "timetables": {
+ "timetable-only": "Wyodrębnij rozkłady jazdy",
+ "end": "Koniec rozkładu jazdy",
+ "terminated": "Rozkład jazdy zakończony",
+ "begins": "ROZPOCZYNA\nBIEG",
+ "terminates": "KOŃCZY BIEG",
+
+ "from": "Z",
+ "to": "DO",
+
+ "desc-arriving": "Pociągu nie ma jeszcze na tej scenerii. Przyjedzie z: {prevStationName} (szlak {prevDepartureLine})",
+ "desc-online": "Pociąg jest na tej scenerii. Odjedzie do: {nextStationName} (szlak {nextArrivalLine})",
+ "desc-stopped": "Pociąg jest na tej scenerii i odbywa postój. Odjedzie do: {nextStationName} (szlak {nextArrivalLine})",
+ "desc-next-arrival": "Odjeżdża do: {nextStationName} (szlak {nextArrivalLine})",
+ "desc-departed": "Pociąg jest na tej scenerii i został odprawiony. Odjeżdża do: {nextStationName} (szlak {nextArrivalLine})",
+ "desc-departed-away": "Pociąg został odprawiony i odjechał do: {nextStationName} (szlak {nextArrivalLine})",
+ "desc-end": "Pociąg kończy bieg",
+ "desc-terminated": "Pociąg skończył bieg"
+ },
+ "history": {
+ "title": "DZIENNIK ROZKŁADÓW JAZDY"
+ }
+}
diff --git a/src/locales/pl.json b/src/locales/pl.json
index 7aaf23b..c9d2e2d 100644
--- a/src/locales/pl.json
+++ b/src/locales/pl.json
@@ -1,434 +1,412 @@
-{
- "general": {
- "and": " oraz ",
- "refresh": "ODŚWIEŻ",
- "TWR": "Towar niebezpieczny wysokiego ryzyka",
- "SKR": "Przekroczona skrajnia"
- },
- "app": {
- "sceneries": "SCENERIE",
- "trains": "POCIĄGI",
- "journal": "DZIENNIK",
- "loading": "Pobieranie danych...",
- "support": "Wspomóż projekt",
- "error": "Wystąpił problem z załadowaniem danych!",
- "no-result": "Brak wyników o podanych kryteriach!",
- "migration-warning": "Usługi Stacjownika będą niedostępne w godzinach 1:00-3:00 2 czerwca 2022r. z powodu migracji hostingów API!",
- "migration-confirm": "Przyjąłem!",
- "offline": "Aplikacja w trybie offline!"
- },
- "footer": {
- "discord": "Serwer Discord Stacjownika"
- },
- "update": {
- "title": "Nowa wersja Stacjownika jest dostępna!",
- "paragraph1": "Miłego korzystania z aplikacji i niech S2 będzie z wami!",
- "release-link": "Kliknij, aby przejrzeć listę zmian (GitHub)",
- "confirm-button": "ZAKTUALIZUJ",
- "later-button": "PÓŹNIEJ"
- },
- "data-status": {
- "S1-offline": "Sygnał S1
Aplikacja działa w trybie offline!",
- "S1a-connection": "Sygnał S1a
Błąd podczas próby połączenia się z API Stacjownika!",
- "S1a-sceneries": "Sygnał S1a
Błąd podczas pobierania danych o sceneriach online!",
- "S2": "Sygnał S2
Pomyślnie załadowano dane!",
- "S3": "Sygnał S3
Pobieranie danych...",
- "S5-timetables": "Sygnał S5
Rozkłady jazdy mogą być niekompletne!",
- "S5-dispatchers": "Sygnał S5
Błąd podczas pobierania danych o statusach dyżurnych ruchu!",
- "S5-trains": "Sygnał S5
Błąd podczas pobierania danych o pociągach online!"
- },
- "desc": {
- "control-type": "Sterowanie: ",
- "signals-type": "Sygnalizacja: ",
- "SBL": "Sceneria posiada SBL na szlakach: ",
- "SUP": "Wymaga programu SUP do kontroli systemu RASP-UZK",
- "TWB-all": "Sceneria posiada blokadę dwukierunkową na wszystkich szlakach",
- "TWB-routes": "Sceneria posiada blokadę dwukierunkową na szlakach: ",
- "default": "Sceneria dostępna domyślnie w paczce z grą",
- "non-public": "Sceneria niepubliczna",
- "unavailable": "Sceneria niedostępna",
- "unknown": "Nieznana sceneria",
- "real": "Sceneria z realnymi liniami kolejowymi: ",
- "abandoned": "Sceneria wycofana z rozgrywki"
- },
- "signals": {
- "title": "Sygnalizacja",
- "współczesna": "współczesna",
- "mieszana": "mieszana",
- "kształtowa": "kształtowa",
- "historyczna": "historyczna"
- },
- "controls": {
- "title": "Sterowanie",
- "SPK": "SPK",
- "SCS": "SCS",
- "SCS-SPK": "SCS/SPK",
- "SPE": "SPE",
- "ręczne": "ręczne",
- "ręczne+SPK": "ręczne z SPK",
- "ręczne+SCS": "ręczne z SCS",
- "mechaniczne": "mechaniczne",
- "mechaniczne+SPK": "mechaniczne z SPK",
- "mechaniczne+SCS": "mechaniczne z SCS"
- },
- "status": {
- "online": "DO ",
- "free": "WOLNA",
- "ending": "KOŃCZY",
- "not-signed": "NIEZALOGOWANY",
- "no-limit": "BEZ LIMITU",
- "unavailable": "NIEDOSTĘPNY",
- "brb": "Z/W",
- "no-space": "BRAK MIEJSCA",
- "unknown": "NIEZNANY"
- },
- "options": {
- "filters": "FILTRY",
- "donate": "WESPRZYJ",
-
- "search-button": "Szukaj",
- "reset-button": "Zresetuj",
-
- "sort-title": "SORTUJ WG:",
- "filter-title": "FILTRUJ WG:",
- "search-title": "SZUKAJ:",
-
- "search-train-no": "Nr pociągu",
- "search-train": "Nr pociągu / #",
- "search-driver": "Nick maszynisty",
- "search-dispatcher": "Nick dyżurnego",
- "search-station": "Nazwa scenerii",
- "search-author": "Nick autora rozkładu jazdy",
- "search-issuedFrom": "Sceneria początkowa",
- "search-timetables-date": "Data rozkładu jazdy (UTC+2 / CEST)",
- "search-dispatchers-date": "Data służby (UTC+2 / CEST)",
- "search-date": "Data (UTC+2 / CEST)",
-
- "sort-routeDistance": "kilometraż",
- "sort-allStopsCount": "stacje",
- "sort-beginDate": "data",
- "sort-timetableId": "ID rozkładu",
- "sort-timestampFrom": "data",
- "sort-duration": "czas dyżuru",
- "sort-id": "id rozkładu",
-
- "sort-mass": "masa",
- "sort-speed": "prędkość",
- "sort-length": "długość",
- "sort-timetable": "nr pociągu",
- "sort-progress": "przebyta trasa",
- "sort-delay": "opóźnienie",
- "sort-comments": "uwagi ekspl.",
-
- "filter-withComments": "UWAGI EKSPLOATACYJNE",
- "filter-noComments": "BEZ UWAG",
- "filter-twr": "WYS. RYZYKA",
- "filter-skr": "SKRAJNIA",
- "filter-twr-skr": "WSZYSTKIE",
- "filter-common": "ZWYKŁE",
- "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",
-
- "filter-section-timetable-status": "STATUS ROZKŁADU JAZDY",
- "filter-section-twrskr": "UWAGI",
-
- "filter-all": "WSZYSTKIE",
- "filter-abandoned": "PORZUCONE",
- "filter-fulfilled": "WYPEŁNIONE",
- "filter-active": "AKTYWNE"
- },
- "filters": {
- "desc": " • Kliknięcie: zaznaczenie / odznaczenie filtru
• Podwójne kliknięcie: odznaczenie reszty filtrów z grupy
• RESET: zresetowanie filtrów z grupy",
-
- "sections": {
- "quick": "SZYBKIE FILTRY",
- "reality": "FIKCYJNOŚĆ SCENERII",
- "package-access": "DOSTĘPNOŚĆ W PACZCE",
- "access": "DOSTĘPNOŚĆ OGÓLNA",
- "control": "TYP STEROWANIA",
- "signals": "TYP SYGNALIZACJI",
- "addons": "DODATKOWE PROGRAMY",
- "blockades": "BLOKADY LINIOWE",
- "status": "STATUS ONLINE"
- },
-
- "all-available": "WSZYSTKIE DOSTĘPNE",
- "all-free": "WSZYSTKIE WOLNE",
-
- "endingStatus": "KOŃCZY",
- "afkStatus": "Z/W",
- "noSpaceStatus": "BRAK MIEJSCA",
- "unavailableStatus": "NIEDOSTĘPNY",
-
- "title": "FILTRUJ STACJE",
- "default": "DOMYŚLNA",
- "not-default": "POZA PACZKĄ",
- "real": "REALNA",
- "fictional": "FIKCYJNA",
- "unavailable": "NIEDOSTĘPNA",
- "non-public": "NIEPUBLICZNA",
- "abandoned": "WYCOFANA",
-
- "SPK": "SPK",
- "SPK-R": "SPK + RĘCZNE",
- "SPK-M": "SPK + MECH.",
- "SCS": "SCS",
- "SCS-R": "SCS + RĘCZNE",
- "SCS-M": "SCS + MECH.",
- "SPE": "SPE",
- "manual": "RĘCZNE",
-
- "SUP": "SUP (RASP-UZK)",
- "noSUP": "BEZ SUP",
-
- "SBL": "SAMOCZYNNA",
- "PBL": "PÓŁSAMOCZYNNA",
-
- "mechanical": "MECHANICZNE",
- "modern": "WSPÓŁCZESNA",
- "semaphores": "KSZTAŁTOWA",
- "mixed": "MIESZANA",
- "historical": "HISTORYCZNA",
-
- "free": "WOLNA",
- "occupied": "ZAJĘTA",
-
- "sliders": {
- "min-lvl": "MIN. WYMAGANY POZIOM DYŻURNEGO",
- "max-lvl": "MAKS. WYMAGANY POZIOM DYŻURNEGO",
- "routes-1t-cat": "SZLAKI JEDNOTOROWE ZELEKTR. (MINIMUM)",
- "routes-1t-other": "SZLAKI JEDNOTOROWE NIEZELEKTR. (MINIMUM)",
- "routes-2t-cat": "SZLAKI DWUTOROWE ZELEKTR. (MINIMUM)",
- "routes-2t-other": "SZLAKI DWUTOROWE NIEZELEKTR. (MINIMUM)"
- },
-
- "authors-search": "Szukaj autora (uwzględnia inne filtry)",
- "minimum-hours-title": "POKAŻ TYLKO SCENERIE DOSTĘPNE MINIMUM DO:",
- "now": "TERAZ",
- "hour": " godz.",
- "no-limit": "BEZ LIMITU",
- "include-selected": "POKAŻ ZAZNACZONE",
- "save": "ZAPAMIĘTAJ FILTRY",
- "reset": "RESETUJ FILTRY",
- "close": "ZAMKNIJ FILTRY"
- },
- "sceneries": {
- "station": "Stacja",
- "abbr": "Skrót\nposterunku",
- "min-lvl": "Min. poziom\ndyżurnego",
- "status": "Status",
- "dispatcher": "Dyżurny",
- "dispatcher-lvl": "Poziom\ndyżurnego",
- "routes": "Szlaki\n2tor / 1tor",
- "general": "Informacje\nogólne",
- "user": "Maszyniści online",
- "spawn": "Otwarte spawny",
- "timetableAll": "Aktywne rozkłady jazdy",
- "timetableConfirmed": "Zatwierdzone rozkłady jazdy",
- "timetableUnconfirmed": "Niezatwierdzone rozkłady jazdy",
- "no-stations": "Brak stacji do wyświetlenia!",
- "scenery-search": "Wyszukaj scenerię..."
- },
- "trains": {
- "no-trains": "Brak pociągów do wyświetlenia!",
- "loading": "Pobieranie danych o pociągach...",
- "offline": "Przejazd offline",
-
- "stats": "STATYSTYKI RUCHU",
- "stats-speed": "PRĘDKOŚCI POCIĄGÓW (MIN, ŚR, MAX) [km/h]",
- "stats-length": "DŁUGOŚCI ROZKŁADÓW (MIN, ŚR, MAX) [km]",
- "stats-categories": "KATEGORIE RJ",
- "stats-special-twr": "WYSOKIEGO RYZYKA",
- "stats-special-skr": "PRZEKROCZONA SKRAJNIA",
- "stats-locos": "NAJCZĘSTSZE JEDNOSTKI",
-
- "current-scenery": "na scenerii",
- "current-signal": "przy semaforze",
- "current-track": "na szlaku",
-
- "delayed": "Opóźniony: ",
- "preponed": "Przed czasem: ",
- "on-time": "Planowo",
-
- "route-progress": "Postęp: ",
-
- "detailed-timetable": "Szczegółowy rozkład jazdy pociągu ",
- "via-title": "Przez: ",
- "no-timetable": "brak rozkładu jazdy",
- "distance-exceeded": "Uwaga! Z powodu wewnętrznego błędu serwera TD2, rozkłady jazdy o kilometrażu powyżej 200km mogą być niepoprawne!",
- "cars": "Wagony",
- "EZT": "EZT",
- "SZT": "SZT",
- "loco-electric": "Elektrowóz",
- "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.",
-
- "last-seen-now": "od niedawna",
- "last-seen-min": "od minuty",
- "last-seen-ago": "od {minutes} minut",
-
- "scenery-offline": "Przejazd offline",
-
- "timeout": "Wystąpił problem z aktualizacją rozkładów jazdy z SWDR"
- },
- "journal": {
- "title": "HISTORIA DYŻURÓW",
- "loading": "Ładowanie historii dyżurów...",
- "no-history": "Brak historii dyżurów dla tej scenerii!",
- "data-refreshed-at": "Dane odświeżone o",
-
- "section-timetables": "ROZKŁADY JAZDY",
- "section-dispatchers": "DYŻURNI",
-
- "no-further-data": "Brak dalszych wyników dla podanych parametrów",
- "loading-further-data": "Ładowanie...",
-
- "online-since": "ONLINE OD",
- "duty-lasted": "Dyżur trwał",
- "hours": "{value} godz.",
- "minutes": "{value} min.",
- "seconds": "{value} sek.",
-
- "route-length": "Kilometraż:",
- "station-count": "Stacje:",
- "dispatcher-name": "Autor",
- "timetable-day": "Rozkład z dnia",
- "timetable-active": "AKTYWNY",
- "timetable-fulfilled": "WYPEŁNIONY",
- "timetable-abandoned": "PORZUCONY",
-
- "stock-info": "DODATKOWE INFORMACJE",
- "stock-length": "Długość",
- "stock-mass": "Masa",
- "stock-max-speed": "Prędkość maks.",
-
- "load-data": "Pobierz dalszą historię...",
-
- "stats-title": "STATYSTYKI MASZYNISTY",
-
- "last-seen-at": "Ostatnio widziany na: ",
- "currently-at": "Obecnie na scenerii: ",
-
- "stats-timetables": "ROZKŁADY JAZDY",
- "stats-longest-timetable": "NAJDŁUŻSZY RJ",
- "stats-avg-timetable": "ŚREDNIA DŁUGOŚĆ RJ",
- "stats-distance": "DYSTANS",
- "stats-stations": "STACJE",
-
- "timetable-stats-total": "Stworzone rozkłady jazdy: {count} (łączny dystans: {distance})",
- "timetable-stats-longest": "Najdłuższy rozkład jazdy: #{id} (stworzony przez dyżurnego {author} dla maszynisty {driver} o dystansie {distance})",
- "timetable-stats-most-active-dr": "Najaktywniejszy dyżurny: {dispatcher} (stworzył {count})",
- "timetable-stats-most-active-dr-many": "Najaktywniejsi dyżurni: {dispatchers} (stworzyli po {count})",
- "timetable-stats-most-active-driver": "Najaktywniejszy maszynista: {driver} (łączny przejechany dystans: {distance})",
- "timetable-stats-longest-duties": "Najdłuższa służba: {dispatcher} na scenerii {station} (czas trwania: {duration})",
-
- "timetable-count": "rozkład jazdy | rozkładów jazdy",
-
- "daily-stats-title": "STATYSTYKI DNIA",
- "daily-stats-info": "Dzisiejsze statystyki nie są jeszcze dostępne!",
-
- "driver-stats-title": "STATYSTYKI GRACZA",
- "driver-stats-info": "Wpisz nazwę użytkownika w filtrach [F], aby zobaczyć jego statystyki maszynisty!",
-
- "stats-loading": "Pobieranie statystyk...",
- "stats-error": "Ups! Wystąpił błąd podczas próby pobrania statystyk! :/",
-
- "timetable-location-signal": "semafor:",
- "timetable-location-route": "szlak:",
-
- "history-name": "Sceneria",
- "history-hash": "Hash",
- "history-dispatcher": "Dyżurny",
- "history-level": "Poziom",
- "history-rate": "Ocena",
- "history-region": "Region",
- "history-date": "Data służby"
- },
- "scenery": {
- "users": "GRACZE ONLINE",
- "spawns": "OTWARTE SPAWNY",
- "timetables": "AKTYWNE ROZKŁADY JAZDY",
- "no-timetables": "Brak aktywnych rozkładów!",
- "offline": "Sceneria jest offline",
- "no-users": "BRAK AKTYWNYCH GRACZY",
- "no-spawns": "BRAK OTWARTYCH SPAWNÓW",
- "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óć do widoku scenerii",
- "authors-title": "Autor scenerii | Autorzy scenerii",
- "abbrev": "Skrót posterunku:",
- "lines-title": "Rzeczywiste linie",
- "project-title": "Projekt",
- "one-way-routes": "Szlaki jednotorowe",
- "two-way-routes": "Szlaki dwutorowe",
-
- "option-active-timetables": "Aktywne rozkłady jazdy",
- "option-timetables-history": "Historia rozkładów",
- "option-dispatchers-history": "Historia dyżurów",
-
- "timetable-author-title": "Wydany przez",
- "timetable-author-unknown": "Autor nieznany",
-
- "timetables-history-id": "ID",
- "timetables-history-number": "Numer",
- "timetables-history-route": "Trasa",
- "timetables-history-driver": "Maszynista",
- "timetables-history-author": "Autor RJ",
- "timetables-history-date": "Data",
-
- "dispatchers-history-hash": "Hash",
- "dispatchers-history-dispatcher": "Dyżurny",
- "dispatchers-history-level": "Poziom",
- "dispatchers-history-rate": "Ocena",
- "dispatchers-history-date": "Data służby",
-
- "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}",
-
- "pragotron-link": "Paletowa tablica informacyjna (beta)",
- "tablice-link": "Tablica informacyjna zbiorcza (autorstwa Thundo)",
-
- "bottom-info": "Pokaż pełną historię w zakładce Dziennika"
- },
- "availability": {
- "title": "Dostępność",
- "default": "w paczce",
- "nonDefault": "poza paczką",
- "unavailable": "niedostępna",
- "nonPublic": "niepubliczna",
- "abandoned": "wycofana"
- },
- "timetables": {
- "timetable-only": "Wyodrębnij rozkłady jazdy",
- "end": "Koniec rozkładu jazdy",
- "terminated": "Rozkład jazdy zakończony",
- "begins": "ROZPOCZYNA\nBIEG",
- "terminates": "KOŃCZY BIEG",
-
- "from": "Z",
- "to": "DO",
-
- "desc-arriving": "Pociągu nie ma jeszcze na tej scenerii. Przyjedzie z: {prevStationName} (szlak {prevDepartureLine})",
- "desc-online": "Pociąg jest na tej scenerii. Odjedzie do: {nextStationName} (szlak {nextArrivalLine})",
- "desc-stopped": "Pociąg jest na tej scenerii i odbywa postój. Odjedzie do: {nextStationName} (szlak {nextArrivalLine})",
- "desc-next-arrival": "Odjeżdża do: {nextStationName} (szlak {nextArrivalLine})",
- "desc-departed": "Pociąg jest na tej scenerii i został odprawiony. Odjeżdża do: {nextStationName} (szlak {nextArrivalLine})",
- "desc-departed-away": "Pociąg został odprawiony i odjechał do: {nextStationName} (szlak {nextArrivalLine})",
- "desc-end": "Pociąg kończy bieg",
- "desc-terminated": "Pociąg skończył bieg"
- },
- "history": {
- "title": "DZIENNIK ROZKŁADÓW JAZDY"
- }
-}
+{
+ "general": {
+ "and": " oraz ",
+ "refresh": "ODŚWIEŻ",
+ "TWR": "Towar niebezpieczny wysokiego ryzyka",
+ "SKR": "Przekroczona skrajnia"
+ },
+ "app": {
+ "sceneries": "SCENERIE",
+ "trains": "POCIĄGI",
+ "journal": "DZIENNIK",
+ "loading": "Pobieranie danych...",
+ "error": "Wystąpił problem z załadowaniem danych!",
+ "no-result": "Brak wyników o podanych kryteriach!",
+ "offline": "Aplikacja w trybie offline!"
+ },
+ "footer": {
+ "discord": "Serwer Discord Stacjownika"
+ },
+ "data-status": {
+ "S1-offline": "Sygnał S1
Aplikacja działa w trybie offline!",
+ "S1a-connection": "Sygnał S1a
Błąd podczas próby połączenia się z API Stacjownika!",
+ "S1a-sceneries": "Sygnał S1a
Błąd podczas pobierania danych o sceneriach online!",
+ "S2": "Sygnał S2
Pomyślnie załadowano dane!",
+ "S3": "Sygnał S3
Pobieranie danych...",
+ "S5-timetables": "Sygnał S5
Rozkłady jazdy mogą być niekompletne!",
+ "S5-dispatchers": "Sygnał S5
Błąd podczas pobierania danych o statusach dyżurnych ruchu!",
+ "S5-trains": "Sygnał S5
Błąd podczas pobierania danych o pociągach online!"
+ },
+ "desc": {
+ "control-type": "Sterowanie:",
+ "signals-type": "Sygnalizacja:",
+ "SBL": "Sceneria posiada SBL na szlakach:",
+ "SUP": "Wymaga programu SUP do kontroli systemu RASP-UZK",
+ "default": "Sceneria dostępna domyślnie w paczce z grą",
+ "non-public": "Sceneria niepubliczna",
+ "unavailable": "Sceneria niedostępna",
+ "unknown": "Nieznana sceneria",
+ "real": "Sceneria z realnymi liniami kolejowymi:",
+ "abandoned": "Sceneria wycofana z rozgrywki"
+ },
+ "signals": {
+ "title": "Sygnalizacja",
+ "współczesna": "współczesna",
+ "mieszana": "mieszana",
+ "kształtowa": "kształtowa",
+ "historyczna": "historyczna"
+ },
+ "controls": {
+ "title": "Sterowanie",
+ "SPK": "SPK",
+ "SCS": "SCS",
+ "SCS-SPK": "SCS/SPK",
+ "SPE": "SPE",
+ "ręczne": "ręczne",
+ "ręczne+SPK": "ręczne z SPK",
+ "ręczne+SCS": "ręczne z SCS",
+ "mechaniczne": "mechaniczne",
+ "mechaniczne+SPK": "mechaniczne z SPK",
+ "mechaniczne+SCS": "mechaniczne z SCS"
+ },
+ "status": {
+ "online": "DO ",
+ "free": "WOLNA",
+ "ending": "KOŃCZY",
+ "not-signed": "NIEZALOGOWANY",
+ "no-limit": "BEZ LIMITU",
+ "unavailable": "NIEDOSTĘPNY",
+ "brb": "Z/W",
+ "no-space": "BRAK MIEJSCA",
+ "unknown": "NIEZNANY"
+ },
+ "options": {
+ "filters": "FILTRY",
+ "donate": "WESPRZYJ",
+
+ "search-button": "Szukaj",
+ "reset-button": "Zresetuj",
+
+ "sort-title": "SORTUJ WG:",
+ "filter-title": "FILTRUJ WG:",
+ "search-title": "SZUKAJ:",
+
+ "search-train-no": "Nr pociągu",
+ "search-train": "Nr pociągu / #",
+ "search-driver": "Nick maszynisty",
+ "search-dispatcher": "Nick dyżurnego",
+ "search-station": "Nazwa scenerii",
+ "search-author": "Nick autora rozkładu jazdy",
+ "search-issuedFrom": "Sceneria początkowa",
+ "search-timetables-date": "Data rozkładu jazdy (UTC+2 / CEST)",
+ "search-dispatchers-date": "Data służby (UTC+2 / CEST)",
+ "search-date": "Data (UTC+2 / CEST)",
+
+ "sort-routeDistance": "kilometraż",
+ "sort-allStopsCount": "stacje",
+ "sort-beginDate": "data",
+ "sort-timetableId": "ID rozkładu",
+ "sort-timestampFrom": "data",
+ "sort-duration": "czas dyżuru",
+ "sort-id": "id rozkładu",
+
+ "sort-mass": "masa",
+ "sort-speed": "prędkość",
+ "sort-length": "długość",
+ "sort-timetable": "nr pociągu",
+ "sort-progress": "przebyta trasa",
+ "sort-delay": "opóźnienie",
+ "sort-comments": "uwagi ekspl.",
+
+ "filter-withComments": "UWAGI EKSPLOATACYJNE",
+ "filter-noComments": "BEZ UWAG",
+ "filter-twr": "WYS. RYZYKA",
+ "filter-skr": "SKRAJNIA",
+ "filter-twr-skr": "WSZYSTKIE",
+ "filter-common": "ZWYKŁE",
+ "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",
+
+ "filter-section-timetable-status": "STATUS ROZKŁADU JAZDY",
+ "filter-section-twrskr": "UWAGI",
+
+ "filter-all": "WSZYSTKIE",
+ "filter-abandoned": "PORZUCONE",
+ "filter-fulfilled": "WYPEŁNIONE",
+ "filter-active": "AKTYWNE"
+ },
+ "filters": {
+ "desc": " • Kliknięcie: zaznaczenie / odznaczenie filtru
• Podwójne kliknięcie: odznaczenie reszty filtrów z grupy
• RESET: zresetowanie filtrów z grupy",
+
+ "sections": {
+ "quick": "SZYBKIE FILTRY",
+ "reality": "FIKCYJNOŚĆ SCENERII",
+ "package-access": "DOSTĘPNOŚĆ W PACZCE",
+ "access": "DOSTĘPNOŚĆ OGÓLNA",
+ "control": "TYP STEROWANIA",
+ "signals": "TYP SYGNALIZACJI",
+ "addons": "DODATKOWE PROGRAMY",
+ "blockades": "BLOKADY LINIOWE",
+ "status": "STATUS ONLINE"
+ },
+
+ "all-available": "WSZYSTKIE DOSTĘPNE",
+ "all-free": "WSZYSTKIE WOLNE",
+
+ "endingStatus": "KOŃCZY",
+ "afkStatus": "Z/W",
+ "noSpaceStatus": "BRAK MIEJSCA",
+ "unavailableStatus": "NIEDOSTĘPNY",
+
+ "title": "FILTRUJ STACJE",
+ "default": "DOMYŚLNA",
+ "not-default": "POZA PACZKĄ",
+ "real": "REALNA",
+ "fictional": "FIKCYJNA",
+ "unavailable": "NIEDOSTĘPNA",
+ "non-public": "NIEPUBLICZNA",
+ "abandoned": "WYCOFANA",
+
+ "SPK": "SPK",
+ "SPK-R": "SPK + RĘCZNE",
+ "SPK-M": "SPK + MECH.",
+ "SCS": "SCS",
+ "SCS-R": "SCS + RĘCZNE",
+ "SCS-M": "SCS + MECH.",
+ "SPE": "SPE",
+ "manual": "RĘCZNE",
+
+ "SUP": "SUP (RASP-UZK)",
+ "noSUP": "BEZ SUP",
+
+ "SBL": "SAMOCZYNNA",
+ "PBL": "PÓŁSAMOCZYNNA",
+
+ "mechanical": "MECHANICZNE",
+ "modern": "WSPÓŁCZESNA",
+ "semaphores": "KSZTAŁTOWA",
+ "mixed": "MIESZANA",
+ "historical": "HISTORYCZNA",
+
+ "free": "WOLNA",
+ "occupied": "ZAJĘTA",
+
+ "sliders": {
+ "min-lvl": "MIN. WYMAGANY POZIOM DYŻURNEGO",
+ "max-lvl": "MAKS. WYMAGANY POZIOM DYŻURNEGO",
+ "routes-1t-cat": "SZLAKI JEDNOTOROWE ZELEKTR. (MINIMUM)",
+ "routes-1t-other": "SZLAKI JEDNOTOROWE NIEZELEKTR. (MINIMUM)",
+ "routes-2t-cat": "SZLAKI DWUTOROWE ZELEKTR. (MINIMUM)",
+ "routes-2t-other": "SZLAKI DWUTOROWE NIEZELEKTR. (MINIMUM)"
+ },
+
+ "authors-search": "Szukaj autora (uwzględnia inne filtry)",
+ "minimum-hours-title": "POKAŻ TYLKO SCENERIE DOSTĘPNE MINIMUM DO:",
+ "now": "TERAZ",
+ "hour": " godz.",
+ "no-limit": "BEZ LIMITU",
+ "include-selected": "POKAŻ ZAZNACZONE",
+ "save": "ZAPAMIĘTAJ FILTRY",
+ "reset": "RESETUJ FILTRY",
+ "close": "ZAMKNIJ FILTRY"
+ },
+ "sceneries": {
+ "station": "Stacja",
+ "abbr": "Skrót\nposterunku",
+ "min-lvl": "Min. poziom\ndyżurnego",
+ "status": "Status",
+ "dispatcher": "Dyżurny",
+ "dispatcher-lvl": "Poziom\ndyżurnego",
+ "routes": "Szlaki\n2tor / 1tor",
+ "general": "Informacje\nogólne",
+ "user": "Maszyniści online",
+ "spawn": "Otwarte spawny",
+ "timetableAll": "Aktywne rozkłady jazdy",
+ "timetableConfirmed": "Zatwierdzone rozkłady jazdy",
+ "timetableUnconfirmed": "Niezatwierdzone rozkłady jazdy",
+ "no-stations": "Brak stacji do wyświetlenia!",
+ "scenery-search": "Wyszukaj scenerię..."
+ },
+ "trains": {
+ "no-trains": "Brak pociągów do wyświetlenia!",
+ "loading": "Pobieranie danych o pociągach...",
+ "offline": "Przejazd offline",
+
+ "current-scenery": "na scenerii",
+ "current-signal": "przy semaforze",
+ "current-track": "na szlaku",
+
+ "delayed": "Opóźniony: ",
+ "preponed": "Przed czasem: ",
+ "on-time": "Planowo",
+
+ "route-progress": "Postęp: ",
+
+ "detailed-timetable": "Szczegółowy rozkład jazdy pociągu ",
+ "via-title": "Przez: ",
+ "no-timetable": "brak rozkładu jazdy",
+ "cars": "Wagony",
+ "EZT": "EZT",
+ "SZT": "SZT",
+ "loco-electric": "Elektrowóz",
+ "loco-diesel": "Spalinowóz",
+ "timetable-comments": "Pociąg z uwagami eksploatacyjnymi",
+ "comment": "Uwagi eksploatacyjne dla: ",
+
+ "last-seen-now": "od niedawna",
+ "last-seen-min": "od minuty",
+ "last-seen-ago": "od {minutes} minut",
+
+ "scenery-offline": "Przejazd offline",
+
+ "timeout": "Wystąpił problem z aktualizacją rozkładów jazdy z SWDR"
+ },
+ "journal": {
+ "title": "HISTORIA DYŻURÓW",
+ "loading": "Ładowanie historii dyżurów...",
+ "no-history": "Brak historii dyżurów dla tej scenerii!",
+ "data-refreshed-at": "Dane odświeżone o",
+
+ "section-timetables": "ROZKŁADY JAZDY",
+ "section-dispatchers": "DYŻURNI",
+
+ "no-further-data": "Brak dalszych wyników dla podanych parametrów",
+ "loading-further-data": "Ładowanie...",
+
+ "online-since": "ONLINE OD",
+ "duty-lasted": "Dyżur trwał",
+ "hours": "{value} godz.",
+ "minutes": "{value} min.",
+ "seconds": "{value} sek.",
+
+ "route-length": "Kilometraż:",
+ "station-count": "Stacje:",
+ "dispatcher-name": "Autor",
+ "timetable-day": "Rozkład z dnia",
+ "timetable-active": "AKTYWNY",
+ "timetable-fulfilled": "WYPEŁNIONY",
+ "timetable-abandoned": "PORZUCONY",
+
+ "stock-info": "DODATKOWE INFORMACJE",
+ "stock-length": "Długość",
+ "stock-mass": "Masa",
+ "stock-max-speed": "Prędkość maks.",
+
+ "load-data": "Pobierz dalszą historię...",
+
+ "stats-title": "STATYSTYKI MASZYNISTY",
+
+ "last-seen-at": "Ostatnio widziany na: ",
+ "currently-at": "Obecnie na scenerii: ",
+
+ "stats-timetables": "ROZKŁADY JAZDY",
+ "stats-longest-timetable": "NAJDŁUŻSZY RJ",
+ "stats-avg-timetable": "ŚREDNIA DŁUGOŚĆ RJ",
+ "stats-distance": "DYSTANS",
+ "stats-stations": "STACJE",
+
+ "timetable-stats-total": "Stworzone rozkłady jazdy: {count} (łączny dystans: {distance})",
+ "timetable-stats-longest": "Najdłuższy rozkład jazdy: #{id} (stworzony przez dyżurnego {author} dla maszynisty {driver} o dystansie {distance})",
+ "timetable-stats-most-active-dr": "Najaktywniejszy dyżurny: {dispatcher} (stworzył {count})",
+ "timetable-stats-most-active-dr-many": "Najaktywniejsi dyżurni: {dispatchers} (stworzyli po {count})",
+ "timetable-stats-most-active-driver": "Najaktywniejszy maszynista: {driver} (łączny przejechany dystans: {distance})",
+ "timetable-stats-longest-duties": "Najdłuższa służba: {dispatcher} na scenerii {station} (czas trwania: {duration})",
+
+ "timetable-count": "rozkład jazdy | rozkładów jazdy",
+
+ "daily-stats-title": "STATYSTYKI DNIA",
+ "daily-stats-info": "Dzisiejsze statystyki nie są jeszcze dostępne!",
+
+ "driver-stats-title": "STATYSTYKI GRACZA",
+ "driver-stats-info": "Wpisz nazwę użytkownika w filtrach [F], aby zobaczyć jego statystyki maszynisty!",
+
+ "stats-loading": "Pobieranie statystyk...",
+ "stats-error": "Ups! Wystąpił błąd podczas próby pobrania statystyk!",
+
+ "timetable-location-signal": "semafor:",
+ "timetable-location-route": "szlak:",
+
+ "history-name": "Sceneria",
+ "history-hash": "Hash",
+ "history-dispatcher": "Dyżurny",
+ "history-level": "Poziom",
+ "history-rate": "Ocena",
+ "history-region": "Region",
+ "history-date": "Data służby"
+ },
+ "scenery": {
+ "users": "GRACZE ONLINE",
+ "spawns": "OTWARTE SPAWNY",
+ "timetables": "AKTYWNE ROZKŁADY JAZDY",
+ "no-timetables": "Brak aktywnych rozkładów!",
+ "offline": "Sceneria jest offline",
+ "no-users": "BRAK AKTYWNYCH GRACZY",
+ "no-spawns": "BRAK OTWARTYCH SPAWNÓW",
+ "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óć do widoku scenerii",
+ "authors-title": "Autor scenerii | Autorzy scenerii",
+ "abbrev": "Skrót posterunku:",
+ "lines-title": "Rzeczywiste linie",
+ "project-title": "Projekt",
+ "one-way-routes": "Szlaki jednotorowe",
+ "two-way-routes": "Szlaki dwutorowe",
+
+ "option-active-timetables": "Aktywne rozkłady jazdy",
+ "option-timetables-history": "Historia rozkładów",
+ "option-dispatchers-history": "Historia dyżurów",
+
+ "timetable-author-title": "Wydany przez",
+ "timetable-author-unknown": "Autor nieznany",
+
+ "timetables-history-id": "ID",
+ "timetables-history-number": "Numer",
+ "timetables-history-route": "Trasa",
+ "timetables-history-driver": "Maszynista",
+ "timetables-history-author": "Autor RJ",
+ "timetables-history-date": "Data",
+
+ "dispatchers-history-hash": "Hash",
+ "dispatchers-history-dispatcher": "Dyżurny",
+ "dispatchers-history-level": "Poziom",
+ "dispatchers-history-rate": "Ocena",
+ "dispatchers-history-date": "Data służby",
+
+ "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}",
+
+ "pragotron-link": "Paletowa tablica informacyjna (beta)",
+ "tablice-link": "Tablica informacyjna zbiorcza (autorstwa Thundo)",
+
+ "bottom-info": "Pokaż pełną historię w zakładce Dziennika"
+ },
+ "availability": {
+ "title": "Dostępność",
+ "default": "w paczce",
+ "nonDefault": "poza paczką",
+ "unavailable": "niedostępna",
+ "nonPublic": "niepubliczna",
+ "abandoned": "wycofana"
+ },
+ "timetables": {
+ "timetable-only": "Wyodrębnij rozkłady jazdy",
+ "end": "Koniec rozkładu jazdy",
+ "terminated": "Rozkład jazdy zakończony",
+ "begins": "ROZPOCZYNA\nBIEG",
+ "terminates": "KOŃCZY BIEG",
+
+ "from": "Z",
+ "to": "DO",
+
+ "desc-arriving": "Pociągu nie ma jeszcze na tej scenerii. Przyjedzie z: {prevStationName} (szlak {prevDepartureLine})",
+ "desc-online": "Pociąg jest na tej scenerii. Odjedzie do: {nextStationName} (szlak {nextArrivalLine})",
+ "desc-stopped": "Pociąg jest na tej scenerii i odbywa postój. Odjedzie do: {nextStationName} (szlak {nextArrivalLine})",
+ "desc-next-arrival": "Odjeżdża do: {nextStationName} (szlak {nextArrivalLine})",
+ "desc-departed": "Pociąg jest na tej scenerii i został odprawiony. Odjeżdża do: {nextStationName} (szlak {nextArrivalLine})",
+ "desc-departed-away": "Pociąg został odprawiony i odjechał do: {nextStationName} (szlak {nextArrivalLine})",
+ "desc-end": "Pociąg kończy bieg",
+ "desc-terminated": "Pociąg skończył bieg"
+ },
+ "history": {
+ "title": "DZIENNIK ROZKŁADÓW JAZDY"
+ }
+}
diff --git a/src/main.ts b/src/main.ts
index ba5aebc..eec3e7f 100644
--- a/src/main.ts
+++ b/src/main.ts
@@ -1,41 +1,45 @@
-import { createApp, Directive, ref } from 'vue';
-import App from './App.vue';
-import router from './router';
-
-import enLang from './locales/en.json';
-import plLang from './locales/pl.json';
-
-import { createI18n } from 'vue-i18n';
-import { createPinia } from 'pinia';
-
-const i18n = createI18n({
- locale: 'pl',
- legacy: false,
- warnHtmlMessage: false,
- fallbackLocale: 'pl',
- messages: {
- en: enLang,
- pl: plLang,
- },
- enableLegacy: false,
-});
-
-const clickOutsideDirective: Directive = {
- mounted(el, binding) {
- el.clickOutsideEvent = (event: Event) => {
- if (!(el == event.target || el.contains(event.target))) {
- binding.value();
- }
- };
-
- document.addEventListener('click', el.clickOutsideEvent);
- },
-};
-
-createApp(App)
- .provide('isFilterCardVisible', ref(false))
- .use(createPinia())
- .use(router)
- .use(i18n)
- .directive('click-outside', clickOutsideDirective)
- .mount('#app');
+import { createApp, Directive, ref } from 'vue';
+import App from './App.vue';
+import router from './router';
+
+import enLang from './locales/en.json';
+import plLang from './locales/pl.json';
+
+import { createI18n } from 'vue-i18n';
+import { createPinia } from 'pinia';
+import useCustomSW from './mixins/useCustomSW';
+
+const i18n = createI18n({
+ locale: 'pl',
+ legacy: false,
+ warnHtmlMessage: false,
+ fallbackLocale: 'pl',
+ messages: {
+ en: enLang,
+ pl: plLang
+ },
+ enableLegacy: false
+});
+
+// SW
+useCustomSW();
+
+const clickOutsideDirective: Directive = {
+ mounted(el, binding) {
+ el.clickOutsideEvent = (event: Event) => {
+ if (!(el == event.target || el.contains(event.target))) {
+ binding.value();
+ }
+ };
+
+ document.addEventListener('click', el.clickOutsideEvent);
+ }
+};
+
+createApp(App)
+ .provide('isFilterCardVisible', ref(false))
+ .use(createPinia())
+ .use(router)
+ .use(i18n)
+ .directive('click-outside', clickOutsideDirective)
+ .mount('#app');
diff --git a/src/mixins/dateMixin.ts b/src/mixins/dateMixin.ts
index 49d6f9b..e9e5390 100644
--- a/src/mixins/dateMixin.ts
+++ b/src/mixins/dateMixin.ts
@@ -1,77 +1,77 @@
-import { defineComponent } from 'vue';
-
-export default defineComponent({
- methods: {
- localeDate(dateString: string, locale: string) {
- return new Date(dateString).toLocaleDateString(locale == 'pl' ? 'pl-PL' : 'en-GB', {
- weekday: 'long',
- day: 'numeric',
- month: '2-digit',
- year: 'numeric',
- hour: '2-digit',
- minute: '2-digit',
- });
- },
-
- localeDay(dateString: string, locale: string) {
- return new Date(dateString).toLocaleDateString(locale == 'pl' ? 'pl-PL' : 'en-GB', {
- day: 'numeric',
- month: '2-digit',
- year: 'numeric',
- });
- },
-
- localeDateTime(dateString: string, locale: string) {
- return new Date(dateString).toLocaleString(locale == 'pl' ? 'pl-PL' : 'en-GB', {
- timeStyle: 'short',
- dateStyle: 'medium'
- });
- },
-
- localeTime(dateString: string, locale: string) {
- return new Date(dateString).toLocaleTimeString(locale == 'pl' ? 'pl-PL' : 'en-GB', {
- hour: '2-digit',
- minute: '2-digit',
- });
- },
-
- stringToDate(dateString?: string) {
- return dateString ? new Date(dateString) : null;
- },
-
- parseDateToTimeString(date: Date | null) {
- return (
- date?.toLocaleTimeString('pl-PL', {
- hour: '2-digit',
- minute: '2-digit',
- }) || ''
- );
- },
-
- timestampToString(timestamp: number | null) {
- return timestamp
- ? new Date(timestamp).toLocaleTimeString('pl-PL', {
- hour: '2-digit',
- minute: '2-digit',
- })
- : '';
- },
-
- calculateDuration(timestampMs: number, showSeconds = false) {
- const secondsTotal = Math.floor(timestampMs / 1000);
- const minsTotal = Math.round(timestampMs / 60000);
- const hoursTotal = Math.floor(minsTotal / 60);
- const minsInHour = minsTotal % 60;
-
- return minsTotal >= 60
- ? `${this.$t('journal.hours', { value: hoursTotal }, hoursTotal)} ${this.$t(
- 'journal.minutes',
- { value: minsInHour },
- minsInHour
- )}`
- : showSeconds && secondsTotal <= 60
- ? this.$t('journal.seconds', { value: secondsTotal }, secondsTotal)
- : this.$t('journal.minutes', { value: minsTotal }, minsTotal);
- },
- },
-});
+import { defineComponent } from 'vue';
+
+export default defineComponent({
+ methods: {
+ localeDate(dateString: string, locale: string) {
+ return new Date(dateString).toLocaleDateString(locale == 'pl' ? 'pl-PL' : 'en-GB', {
+ weekday: 'long',
+ day: 'numeric',
+ month: '2-digit',
+ year: 'numeric',
+ hour: '2-digit',
+ minute: '2-digit'
+ });
+ },
+
+ localeDay(dateString: string, locale: string) {
+ return new Date(dateString).toLocaleDateString(locale == 'pl' ? 'pl-PL' : 'en-GB', {
+ day: 'numeric',
+ month: '2-digit',
+ year: 'numeric'
+ });
+ },
+
+ localeDateTime(dateString: string, locale: string) {
+ return new Date(dateString).toLocaleString(locale == 'pl' ? 'pl-PL' : 'en-GB', {
+ timeStyle: 'short',
+ dateStyle: 'medium'
+ });
+ },
+
+ localeTime(dateString: string, locale: string) {
+ return new Date(dateString).toLocaleTimeString(locale == 'pl' ? 'pl-PL' : 'en-GB', {
+ hour: '2-digit',
+ minute: '2-digit'
+ });
+ },
+
+ stringToDate(dateString?: string) {
+ return dateString ? new Date(dateString) : null;
+ },
+
+ parseDateToTimeString(date: Date | null) {
+ return (
+ date?.toLocaleTimeString('pl-PL', {
+ hour: '2-digit',
+ minute: '2-digit'
+ }) || ''
+ );
+ },
+
+ timestampToString(timestamp: number | null) {
+ return timestamp
+ ? new Date(timestamp).toLocaleTimeString('pl-PL', {
+ hour: '2-digit',
+ minute: '2-digit'
+ })
+ : '';
+ },
+
+ calculateDuration(timestampMs: number, showSeconds = false) {
+ const secondsTotal = Math.floor(timestampMs / 1000);
+ const minsTotal = Math.round(timestampMs / 60000);
+ const hoursTotal = Math.floor(minsTotal / 60);
+ const minsInHour = minsTotal % 60;
+
+ return minsTotal >= 60
+ ? `${this.$t('journal.hours', { value: hoursTotal }, hoursTotal)} ${this.$t(
+ 'journal.minutes',
+ { value: minsInHour },
+ minsInHour
+ )}`
+ : showSeconds && secondsTotal <= 60
+ ? this.$t('journal.seconds', { value: secondsTotal }, secondsTotal)
+ : this.$t('journal.minutes', { value: minsTotal }, minsTotal);
+ }
+ }
+});
diff --git a/src/mixins/imageMixin.ts b/src/mixins/imageMixin.ts
deleted file mode 100644
index ce0605e..0000000
--- a/src/mixins/imageMixin.ts
+++ /dev/null
@@ -1,13 +0,0 @@
-import { defineComponent } from 'vue';
-
-export default defineComponent({
- methods: {
- getIcon(name: string, ext = 'svg') {
- return new URL(`../assets/icon-${name}.${ext}`, import.meta.url).href;
- },
-
- getImage(name: string) {
- return new URL(`../assets/${name}`, import.meta.url).href;
- }
- },
-});
diff --git a/src/mixins/keyMixin.ts b/src/mixins/keyMixin.ts
index ce5922e..0416b3b 100644
--- a/src/mixins/keyMixin.ts
+++ b/src/mixins/keyMixin.ts
@@ -1,26 +1,27 @@
-import { defineComponent } from 'vue';
-
-export default defineComponent({
- data() {
- return {
- preventKeyDown: false,
- };
- },
-
- activated() {
- window.addEventListener('keydown', this.handleKeyDown);
- },
-
- deactivated() {
- window.removeEventListener('keydown', this.handleKeyDown);
- },
-
- methods: {
- onKeyDownFunction() {},
-
- handleKeyDown(e: KeyboardEvent) {
- if (!e.key) return;
- if (e.key.toLowerCase() == 'f' && !this.preventKeyDown && !e.ctrlKey && !e.altKey) this.onKeyDownFunction();
- },
- },
-});
+import { defineComponent } from 'vue';
+
+export default defineComponent({
+ data() {
+ return {
+ preventKeyDown: false
+ };
+ },
+
+ activated() {
+ window.addEventListener('keydown', this.handleKeyDown);
+ },
+
+ deactivated() {
+ window.removeEventListener('keydown', this.handleKeyDown);
+ },
+
+ methods: {
+ onKeyDownFunction() {},
+
+ handleKeyDown(e: KeyboardEvent) {
+ if (!e.key) return;
+ if (e.key.toLowerCase() == 'f' && !this.preventKeyDown && !e.ctrlKey && !e.altKey)
+ this.onKeyDownFunction();
+ }
+ }
+});
diff --git a/src/mixins/listObserverMixin.ts b/src/mixins/listObserverMixin.ts
index 5a0286f..98ae7a8 100644
--- a/src/mixins/listObserverMixin.ts
+++ b/src/mixins/listObserverMixin.ts
@@ -1,26 +1,29 @@
-import { defineComponent } from 'vue';
-
-export default defineComponent({
- data: () => ({
- observer: null as IntersectionObserver | null,
- observerTarget: null as Element | null,
- }),
-
- methods: {
- mountObserver(actionFunction: () => void, target: Element) {
- this.observer = new IntersectionObserver((entries) => {
- console.log(entries);
-
- if (entries[0].intersectionRatio > 0.5) actionFunction();
- }, { threshold: 0.2 });
-
- this.observer.observe(target);
- },
-
- unmountObserver() {
- if (!this.observerTarget) return;
-
- this.observer?.unobserve(this.observerTarget);
- },
- },
-});
+import { defineComponent } from 'vue';
+
+export default defineComponent({
+ data: () => ({
+ observer: null as IntersectionObserver | null,
+ observerTarget: null as Element | null
+ }),
+
+ methods: {
+ mountObserver(actionFunction: () => void, target: Element) {
+ this.observer = new IntersectionObserver(
+ (entries) => {
+ console.log(entries);
+
+ if (entries[0].intersectionRatio > 0.5) actionFunction();
+ },
+ { threshold: 0.2 }
+ );
+
+ this.observer.observe(target);
+ },
+
+ unmountObserver() {
+ if (!this.observerTarget) return;
+
+ this.observer?.unobserve(this.observerTarget);
+ }
+ }
+});
diff --git a/src/mixins/modalTrainMixin.ts b/src/mixins/modalTrainMixin.ts
index 352fbe3..50e4cde 100644
--- a/src/mixins/modalTrainMixin.ts
+++ b/src/mixins/modalTrainMixin.ts
@@ -1,33 +1,33 @@
-import { Ref, defineComponent } from 'vue';
-import { useStore } from '../store/store';
-
-export default defineComponent({
- data() {
- return {
- store: useStore(),
- };
- },
-
- computed: {
- chosenTrain() {
- return this.store.trainList.find((train) => train.trainId == this.store.chosenModalTrainId);
- },
- },
-
- methods: {
- selectModalTrain(trainId: string, target?: EventTarget | null) {
- this.store.chosenModalTrainId = trainId;
- document.body.classList.add('no-scroll');
- if (target) this.store.modalLastClickedTarget = target;
- },
-
- closeModal() {
- this.store.chosenModalTrainId = undefined;
-
- setTimeout(() => {
- (this.store.modalLastClickedTarget as any)?.focus();
- document.body.classList.remove('no-scroll');
- }, 150);
- },
- },
-});
+import { defineComponent } from 'vue';
+import { useStore } from '../store/store';
+
+export default defineComponent({
+ data() {
+ return {
+ store: useStore()
+ };
+ },
+
+ computed: {
+ chosenTrain() {
+ return this.store.trainList.find((train) => train.trainId == this.store.chosenModalTrainId);
+ }
+ },
+
+ methods: {
+ selectModalTrain(trainId: string, target?: EventTarget | null) {
+ this.store.chosenModalTrainId = trainId;
+ document.body.classList.add('no-scroll');
+ if (target) this.store.modalLastClickedTarget = target;
+ },
+
+ closeModal() {
+ this.store.chosenModalTrainId = undefined;
+
+ setTimeout(() => {
+ (this.store.modalLastClickedTarget as any)?.focus();
+ document.body.classList.remove('no-scroll');
+ }, 150);
+ }
+ }
+});
diff --git a/src/mixins/returnBtnMixin.ts b/src/mixins/returnBtnMixin.ts
deleted file mode 100644
index e47f459..0000000
--- a/src/mixins/returnBtnMixin.ts
+++ /dev/null
@@ -1,34 +0,0 @@
-import { defineComponent, h } from 'vue';
-import imageMixin from './imageMixin';
-
-export default defineComponent({
- mixins: [imageMixin],
-
- data() {
- return {
- icons: {
- arrow: this.getIcon('arrow-asc'),
- },
-
- showReturnButton: false,
- };
- },
-
- methods: {
- scrollToTop() {
- window.scrollTo({ top: 0 });
- },
-
- handleScroll() {
- this.showReturnButton = window.scrollY > window.innerHeight * 0.35;
- },
- },
-
- activated() {
- window.addEventListener('wheel', this.handleScroll);
- },
-
- deactivated() {
- window.removeEventListener('wheel', this.handleScroll);
- },
-});
diff --git a/src/mixins/routerMixin.ts b/src/mixins/routerMixin.ts
index 2f383a1..40d6f44 100644
--- a/src/mixins/routerMixin.ts
+++ b/src/mixins/routerMixin.ts
@@ -2,12 +2,11 @@ import { defineComponent } from 'vue';
export default defineComponent({
methods: {
-
navigateTo(path: string, query?: {}) {
this.$router.push({
path,
- query,
+ query
});
- },
- },
+ }
+ }
});
diff --git a/src/mixins/stationInfoMixin.ts b/src/mixins/stationInfoMixin.ts
index 2fa829a..3f20d7b 100644
--- a/src/mixins/stationInfoMixin.ts
+++ b/src/mixins/stationInfoMixin.ts
@@ -1,25 +1,24 @@
import { defineComponent } from 'vue';
export default defineComponent({
- methods: {
- getControlTypeAbbrev(controlType: string) {
- switch (controlType) {
- case 'mechaniczne':
- return 'M';
- case 'SCS-SPK':
- return 'S/S';
- case 'ręczne':
- return 'R';
- case 'mechaniczne+SPK':
- return 'M';
- case 'ręczne+SPK':
- return 'R';
- case 'mechaniczne+SCS':
- return 'M';
- default:
- return controlType;
- }
-
- }
+ methods: {
+ getControlTypeAbbrev(controlType: string) {
+ switch (controlType) {
+ case 'mechaniczne':
+ return 'M';
+ case 'SCS-SPK':
+ return 'S/S';
+ case 'ręczne':
+ return 'R';
+ case 'mechaniczne+SPK':
+ return 'M';
+ case 'ręczne+SPK':
+ return 'R';
+ case 'mechaniczne+SCS':
+ return 'M';
+ default:
+ return controlType;
+ }
}
-})
+ }
+});
diff --git a/src/mixins/styleMixin.ts b/src/mixins/styleMixin.ts
index 0702eab..10a6a84 100644
--- a/src/mixins/styleMixin.ts
+++ b/src/mixins/styleMixin.ts
@@ -1,52 +1,54 @@
-import { defineComponent } from 'vue';
-
-export default defineComponent({
- methods: {
- calculateExpStyle(exp: number, isSupporter = false): string {
- const bgColor = exp > -1 ? (exp < 2 ? '#26B0D9' : `hsl(${-exp * 5 + 100}, 85%, 50%)`) : '#666';
-
- const fontColor = exp > 14 || exp == -1 ? 'white' : 'black';
- const boxShadow = isSupporter ? `box-shadow: 0 0 6px 2px ${bgColor};` : '';
-
- return `background-color: ${bgColor}; color: ${fontColor}; ${boxShadow};`;
- },
-
- calculateTextExpStyle(exp: number, isSupporter = false): string {
- const textColor = exp > -1 ? (exp < 2 ? '#26B0D9' : `hsl(${-exp * 5 + 100}, 75%, 50%)`) : '#666';
-
- return `color: ${textColor}; ${isSupporter ? 'text-shadow: 0 0 6px ' + textColor : ''};`;
- },
-
- statusClasses(occupiedTo: string) {
- let className = '';
-
- switch (occupiedTo) {
- case 'WOLNA':
- className = 'free';
- break;
- case 'KOŃCZY':
- className = 'ending';
- break;
- case 'NIEZALOGOWANY':
- className = 'not-signed';
- break;
- case 'BEZ LIMITU':
- className = 'no-limit';
- break;
- case 'NIEDOSTĘPNY':
- className = 'unavailable';
- break;
- case 'Z/W':
- className = 'brb';
- break;
- case 'BRAK MIEJSCA':
- className = 'no-space';
- break;
- default:
- break;
- }
-
- return className;
- },
- },
-});
+import { defineComponent } from 'vue';
+
+export default defineComponent({
+ methods: {
+ calculateExpStyle(exp: number, isSupporter = false): string {
+ const bgColor =
+ exp > -1 ? (exp < 2 ? '#26B0D9' : `hsl(${-exp * 5 + 100}, 85%, 50%)`) : '#666';
+
+ const fontColor = exp > 14 || exp == -1 ? 'white' : 'black';
+ const boxShadow = isSupporter ? `box-shadow: 0 0 6px 2px ${bgColor};` : '';
+
+ return `background-color: ${bgColor}; color: ${fontColor}; ${boxShadow};`;
+ },
+
+ calculateTextExpStyle(exp: number, isSupporter = false): string {
+ const textColor =
+ exp > -1 ? (exp < 2 ? '#26B0D9' : `hsl(${-exp * 5 + 100}, 75%, 50%)`) : '#666';
+
+ return `color: ${textColor}; ${isSupporter ? 'text-shadow: 0 0 6px ' + textColor : ''};`;
+ },
+
+ statusClasses(occupiedTo: string) {
+ let className = '';
+
+ switch (occupiedTo) {
+ case 'WOLNA':
+ className = 'free';
+ break;
+ case 'KOŃCZY':
+ className = 'ending';
+ break;
+ case 'NIEZALOGOWANY':
+ className = 'not-signed';
+ break;
+ case 'BEZ LIMITU':
+ className = 'no-limit';
+ break;
+ case 'NIEDOSTĘPNY':
+ className = 'unavailable';
+ break;
+ case 'Z/W':
+ className = 'brb';
+ break;
+ case 'BRAK MIEJSCA':
+ className = 'no-space';
+ break;
+ default:
+ break;
+ }
+
+ return className;
+ }
+ }
+});
diff --git a/src/mixins/trainInfoMixin.ts b/src/mixins/trainInfoMixin.ts
index a18e064..b06dda2 100644
--- a/src/mixins/trainInfoMixin.ts
+++ b/src/mixins/trainInfoMixin.ts
@@ -1,49 +1,46 @@
import { defineComponent } from 'vue';
import Train from '../scripts/interfaces/Train';
import TrainStop from '../scripts/interfaces/TrainStop';
-import imageMixin from './imageMixin';
export default defineComponent({
- mixins: [imageMixin],
-
data: () => ({
STATS: {
main: [
{
name: 'speed',
- unit: 'km/h',
+ unit: 'km/h'
},
{
name: 'length',
- unit: 'm',
+ unit: 'm'
},
{
name: 'mass',
unit: 't',
- multiplier: 0.001,
- },
+ multiplier: 0.001
+ }
],
position: [
{
name: 'scenery',
- prop: 'currentStationName',
+ prop: 'currentStationName'
},
{
name: 'route',
- prop: 'connectedTrack',
+ prop: 'connectedTrack'
},
{
name: 'signal',
- prop: 'signal',
+ prop: 'signal'
},
{
name: 'distance',
prop: 'distance',
- unit: 'm',
- },
- ],
- },
+ unit: 'm'
+ }
+ ]
+ }
}),
methods: {
@@ -64,11 +61,15 @@ export default defineComponent({
positionString += this.$t('trains.current-scenery') + ' ';
if (train.currentStationHash) positionString += train.currentStationName + ' ';
- else positionString += train['currentStationName'].replace(/.[a-zA-Z0-9]+.sc/, '') + ' (offline) ';
+ else
+ positionString +=
+ train['currentStationName'].replace(/.[a-zA-Z0-9]+.sc/, '') + ' (offline) ';
- if (train.signal) positionString += this.$t('trains.current-signal') + ' ' + train.signal + ' ';
+ if (train.signal)
+ positionString += this.$t('trains.current-signal') + ' ' + train.signal + ' ';
- if (train.connectedTrack) positionString += this.$t('trains.current-track') + ' ' + train.connectedTrack + ' ';
+ if (train.connectedTrack)
+ positionString += this.$t('trains.current-track') + ' ' + train.connectedTrack + ' ';
if (train.distance) positionString += `(${this.displayDistance(train.distance)})`;
@@ -81,9 +82,17 @@ export default defineComponent({
return stops
.reduce((acc: string[], stop: TrainStop, i: number) => {
if (stop.stopType.includes('ph') && !stop.stopNameRAW.includes('po.'))
- acc.push(`${stop.stopName}`);
+ acc.push(
+ `${
+ stop.stopName
+ }`
+ );
else if (i > 0 && i < stops.length - 1 && !/po\.|sbl/gi.test(stop.stopNameRAW))
- acc.push(`${stop.stopName}`);
+ acc.push(
+ `${
+ stop.stopName
+ }`
+ );
return acc;
}, [])
.join(' > ');
@@ -94,16 +103,22 @@ export default defineComponent({
},
confirmedPercentage(stops: TrainStop[]) {
- 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)
+ );
},
currentDelay(stops: TrainStop[]) {
const delay =
- stops.find((stop, i) => (i == 0 && !stop.confirmed) || (i > 0 && stops[i - 1].confirmed && !stop.confirmed))
- ?.departureDelay || 0;
+ stops.find(
+ (stop, i) =>
+ (i == 0 && !stop.confirmed) || (i > 0 && stops[i - 1].confirmed && !stop.confirmed)
+ )?.departureDelay || 0;
- if (delay > 0) return `${this.$t('trains.delayed')} ${delay} min`;
- else if (delay < 0) return `${this.$t('trains.preponed')} ${delay} min`;
+ if (delay > 0)
+ return `${this.$t('trains.delayed')} ${delay} min`;
+ else if (delay < 0)
+ return `${this.$t('trains.preponed')} ${delay} min`;
else return this.$t('trains.on-time');
},
@@ -118,7 +133,7 @@ export default defineComponent({
getSceneriesWithComments(timetableData: Train['timetableData']) {
const commentList =
- timetableData?.followingStops.reduce((acc, stop, i) => {
+ timetableData?.followingStops.reduce((acc, stop) => {
if (stop.comments) acc.push(stop.stopNameRAW);
return acc;
@@ -137,7 +152,7 @@ export default defineComponent({
onImageError(e: Event) {
const imageEl = e.target as HTMLImageElement;
- imageEl.src = this.getImage('unknown.png');
- },
- },
+ imageEl.src = '/images/icon-unknown.png';
+ }
+ }
});
diff --git a/src/mixins/useCustomSW.ts b/src/mixins/useCustomSW.ts
index 287dd16..a8d03d0 100644
--- a/src/mixins/useCustomSW.ts
+++ b/src/mixins/useCustomSW.ts
@@ -2,12 +2,12 @@ import { useRegisterSW } from 'virtual:pwa-register/vue';
export default () => {
const { needRefresh, updateServiceWorker, offlineReady } = useRegisterSW({
- immediate: true,
+ immediate: true
});
return {
needRefresh,
updateServiceWorker,
- offlineReady,
+ offlineReady
};
};
diff --git a/src/router/index.ts b/src/router/index.ts
index 229f6f9..85573f5 100644
--- a/src/router/index.ts
+++ b/src/router/index.ts
@@ -1,58 +1,74 @@
-import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router';
-import JournalDispatchersVue from '../views/JournalDispatchers.vue';
-import JournalTimetablesVue from '../views/JournalTimetables.vue';
-
-const routes: Array = [
- {
- path: '/',
- name: 'StationsView',
- component: () => import('../views/StationsView.vue'),
- },
- {
- path: '/trains',
- name: 'TrainsView',
- component: () => import('../views/TrainsView.vue'),
- props: (route) => ({ train: route.query.train, driver: route.query.driver, trainId: route.query.trainId }),
- },
- {
- path: '/scenery',
- name: 'SceneryView',
- component: () => import('../views/SceneryView.vue'),
- },
- {
- path: '/journal',
- redirect: '/journal/timetables'
- },
- {
- path: '/journal/timetables',
- name: 'JournalTimetables',
- component: JournalTimetablesVue,
- props: (route) => ({
- trainNo: route.query.trainNo,
- driverName: route.query.driverName,
- timetableId: route.query.timetableId,
- }),
- },
- {
- path: '/journal/dispatchers',
- name: 'JournalDispatchers',
- component: JournalDispatchersVue,
- props: (route) => ({ sceneryName: route.query.sceneryName, dispatcherName: route.query.dispatcherName }),
- },
- {
- path: '/:catchAll(.*)',
- redirect: '/',
- },
-];
-
-const router = createRouter({
- scrollBehavior(to, from) {
- if (to.name == 'SceneryView' && from.name) return { el: `.app_main` };
-
- // if (from.name == 'SceneryView' && to.name == 'StationsView') return { el: `.last-selected`, top: 20 };
- },
- history: createWebHistory(),
- routes,
-});
-
-export default router;
+import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router';
+import JournalDispatchersVue from '../views/JournalDispatchers.vue';
+import JournalTimetablesVue from '../views/JournalTimetables.vue';
+
+const routes: Array = [
+ {
+ path: '/',
+ name: 'StationsView',
+ component: () => import('../views/StationsView.vue'),
+ props: (route) => ({
+ region: route.query.region
+ })
+ },
+ {
+ path: '/trains',
+ name: 'TrainsView',
+ component: () => import('../views/TrainsView.vue'),
+ props: (route) => ({
+ train: route.query.train,
+ driver: route.query.driver,
+ trainId: route.query.trainId
+ })
+ },
+ {
+ path: '/scenery',
+ name: 'SceneryView',
+ component: () => import('../views/SceneryView.vue'),
+ props: (route) => ({
+ region: route.query.region,
+ station: route.query.station
+ })
+ },
+ {
+ path: '/journal',
+ redirect: '/journal/timetables'
+ },
+ {
+ path: '/journal/timetables',
+ name: 'JournalTimetables',
+ component: JournalTimetablesVue,
+ props: (route) => ({
+ trainNo: route.query.trainNo,
+ driverName: route.query.driverName,
+ timetableId: route.query.timetableId
+ })
+ },
+ {
+ path: '/journal/dispatchers',
+ name: 'JournalDispatchers',
+ component: JournalDispatchersVue,
+ props: (route) => ({
+ sceneryName: route.query.sceneryName,
+ dispatcherName: route.query.dispatcherName
+ })
+ },
+ {
+ path: '/:catchAll(.*)',
+ redirect: '/'
+ }
+];
+
+const router = createRouter({
+ scrollBehavior(to, from, savedPosition) {
+ if (to.name == 'SceneryView' && from.name) return { el: `.app_main` };
+
+ if (savedPosition) return savedPosition;
+
+ // if (from.name == 'SceneryView' && to.name == 'StationsView') return { el: `.last-selected`, top: 20 };
+ },
+ history: createWebHistory(),
+ routes
+});
+
+export default router;
diff --git a/src/scripts/constants/stores/initFilterStates.ts b/src/scripts/constants/stores/initFilterStates.ts
index 2ce2e27..50e1db8 100644
--- a/src/scripts/constants/stores/initFilterStates.ts
+++ b/src/scripts/constants/stores/initFilterStates.ts
@@ -1,49 +1,49 @@
-import Filter from "../../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,
-};
+import Filter from '../../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/scripts/data/stationHeaderNames.ts b/src/scripts/data/stationHeaderNames.ts
index 0f954d6..7c018e4 100644
--- a/src/scripts/data/stationHeaderNames.ts
+++ b/src/scripts/data/stationHeaderNames.ts
@@ -1,5 +1,19 @@
-export const headIds = ['station', 'min-lvl', 'status', 'dispatcher', 'dispatcher-lvl', 'routes', 'general'] as const;
+export const headIds = [
+ 'station',
+ 'min-lvl',
+ 'status',
+ 'dispatcher',
+ 'dispatcher-lvl',
+ 'routes',
+ 'general'
+] as const;
-export const headIconsIds = ['user', 'spawn', 'timetableAll', 'timetableUnconfirmed', 'timetableConfirmed'] as const;
+export const headIconsIds = [
+ 'user',
+ 'spawn',
+ 'timetableAll',
+ 'timetableUnconfirmed',
+ 'timetableConfirmed'
+] as const;
-export type HeadIdsTypes = typeof headIds[number] | typeof headIconsIds[number];
+export type HeadIdsTypes = (typeof headIds)[number] | (typeof headIconsIds)[number];
diff --git a/src/scripts/enums/DataStatus.ts b/src/scripts/enums/DataStatus.ts
index 0eabbc2..33fd9a1 100644
--- a/src/scripts/enums/DataStatus.ts
+++ b/src/scripts/enums/DataStatus.ts
@@ -1,7 +1,7 @@
-export enum DataStatus {
- Initialized = -1,
- Loading = 0,
- Error = 1,
- Loaded = 2,
- Warning = 3
-}
+export enum DataStatus {
+ Initialized = -1,
+ Loading = 0,
+ Error = 1,
+ Loaded = 2,
+ Warning = 3
+}
diff --git a/src/scripts/enums/DispatcherStatus.ts b/src/scripts/enums/DispatcherStatus.ts
new file mode 100644
index 0000000..cc533bb
--- /dev/null
+++ b/src/scripts/enums/DispatcherStatus.ts
@@ -0,0 +1,11 @@
+export enum DispatcherStatusID {
+ Unknown = 'unknown',
+ Outdated = 'outdated',
+ Unauthorized = 'not-signed',
+ OnlineNoLimit = 'no-limit',
+ Afk = 'brb',
+ Ending = 'ending',
+ NoSpace = 'no-space',
+ Unavailable = 'unavailable',
+ OnlineWithHours = 'online'
+}
\ No newline at end of file
diff --git a/src/scripts/enums/JournalFilterType.ts b/src/scripts/enums/JournalFilterType.ts
index 95360ba..3628dbc 100644
--- a/src/scripts/enums/JournalFilterType.ts
+++ b/src/scripts/enums/JournalFilterType.ts
@@ -1,14 +1,14 @@
-export const enum JournalFilterType {
- ACTIVE = 'active',
- FULFILLED = 'fulfilled',
- ABANDONED = 'abandoned',
- ALL = 'all',
- TWR = 'twr',
- SKR = 'skr',
- TWR_SKR = 'twr-skr',
-}
-
-export enum JournalFilterSection {
- TIMETABLE_STATUS = 'timetable-status',
- TWRSKR = 'twrskr',
-}
+export const enum JournalFilterType {
+ ACTIVE = 'active',
+ FULFILLED = 'fulfilled',
+ ABANDONED = 'abandoned',
+ ALL = 'all',
+ TWR = 'twr',
+ SKR = 'skr',
+ TWR_SKR = 'twr-skr'
+}
+
+export enum JournalFilterSection {
+ TIMETABLE_STATUS = 'timetable-status',
+ TWRSKR = 'twrskr'
+}
diff --git a/src/scripts/enums/TrainFilterType.ts b/src/scripts/enums/TrainFilterType.ts
index efb2494..e438aea 100644
--- a/src/scripts/enums/TrainFilterType.ts
+++ b/src/scripts/enums/TrainFilterType.ts
@@ -2,7 +2,7 @@ export enum TrainFilterSection {
TRAIN_TYPE = 'TRAIN_TYPE',
TIMETABLE_TYPE = 'TIMETABLE_TYPE',
COMMENTS = 'COMMENTS',
- TIMETABLE = 'TIMETABLE',
+ TIMETABLE = 'TIMETABLE'
}
export const enum TrainFilterType {
@@ -17,5 +17,5 @@ export const enum TrainFilterType {
freight = 'freight',
other = 'other',
noTimetable = 'noTimetable',
- withTimetable = 'withTimetable',
+ withTimetable = 'withTimetable'
}
diff --git a/src/scripts/interfaces/Filter.ts b/src/scripts/interfaces/Filter.ts
index 441b69e..fdf2cc1 100644
--- a/src/scripts/interfaces/Filter.ts
+++ b/src/scripts/interfaces/Filter.ts
@@ -1,48 +1,48 @@
-export default interface Filter {
- [key: string]: boolean | number | string;
- default: boolean;
- notDefault: boolean;
- real: boolean;
- fictional: boolean;
- SPK: boolean;
- SCS: boolean;
- SPE: boolean;
- SUP: boolean;
- noSUP: boolean;
- ręczne: boolean;
- 'ręczne+SPK': boolean;
- 'ręczne+SCS': boolean;
- mechaniczne: boolean;
- 'mechaniczne+SPK': boolean;
- 'mechaniczne+SCS': boolean;
- SBL: boolean;
- PBL: boolean;
- współczesna: boolean;
- kształtowa: boolean;
- historyczna: boolean;
- mieszana: boolean;
- minLevel: number;
- maxLevel: number;
- minOneWayCatenary: number;
- minOneWay: number;
- minTwoWayCatenary: number;
- minTwoWay: number;
- 'no-1track': boolean;
- 'no-2track': boolean;
- 'include-selected': boolean;
- free: boolean;
- occupied: boolean;
- nonPublic: boolean;
- unavailable: boolean;
- abandoned: boolean;
-
- endingStatus: boolean;
- afkStatus: boolean;
- noSpaceStatus: boolean;
- unavailableStatus: boolean;
- unsignedStatus: boolean;
-
- authors: string;
-
- onlineFromHours: number;
-}
+export default interface Filter {
+ [key: string]: boolean | number | string;
+ default: boolean;
+ notDefault: boolean;
+ real: boolean;
+ fictional: boolean;
+ SPK: boolean;
+ SCS: boolean;
+ SPE: boolean;
+ SUP: boolean;
+ noSUP: boolean;
+ ręczne: boolean;
+ 'ręczne+SPK': boolean;
+ 'ręczne+SCS': boolean;
+ mechaniczne: boolean;
+ 'mechaniczne+SPK': boolean;
+ 'mechaniczne+SCS': boolean;
+ SBL: boolean;
+ PBL: boolean;
+ współczesna: boolean;
+ kształtowa: boolean;
+ historyczna: boolean;
+ mieszana: boolean;
+ minLevel: number;
+ maxLevel: number;
+ minOneWayCatenary: number;
+ minOneWay: number;
+ minTwoWayCatenary: number;
+ minTwoWay: number;
+ 'no-1track': boolean;
+ 'no-2track': boolean;
+ 'include-selected': boolean;
+ free: boolean;
+ occupied: boolean;
+ nonPublic: boolean;
+ unavailable: boolean;
+ abandoned: boolean;
+
+ endingStatus: boolean;
+ afkStatus: boolean;
+ noSpaceStatus: boolean;
+ unavailableStatus: boolean;
+ unsignedStatus: boolean;
+
+ authors: string;
+
+ onlineFromHours: number;
+}
diff --git a/src/scripts/interfaces/FilterOption.ts b/src/scripts/interfaces/FilterOption.ts
index 02e8c78..23a9ec8 100644
--- a/src/scripts/interfaces/FilterOption.ts
+++ b/src/scripts/interfaces/FilterOption.ts
@@ -1,6 +1,6 @@
export default interface FilterOption {
- id: string;
- name: string;
- value: boolean;
- defaultValue: boolean;
-}
\ No newline at end of file
+ id: string;
+ name: string;
+ value: boolean;
+ defaultValue: boolean;
+}
diff --git a/src/scripts/interfaces/Scenery.ts b/src/scripts/interfaces/Scenery.ts
index 307cce9..c2d73de 100644
--- a/src/scripts/interfaces/Scenery.ts
+++ b/src/scripts/interfaces/Scenery.ts
@@ -1,33 +1,38 @@
-interface Scenery {
- stationName: string;
- stationURL: string;
- stationLines: string;
- stationProject: string;
-
- reqLevel: string;
- supportersOnly: string;
- signalType: string;
- controlType: string;
- SBL: string;
- twoWayBlock: string;
-
- routesOneWayCatenary: number;
- routesOneWayOther: number;
- routesTwoWayCatenary: number;
- routesToWayOther: number;
-
- default: boolean;
- nonPublic: boolean;
- unavailable: boolean;
- hasData: boolean;
-
- stops: string[];
- checkpoints: string[];
-
- currentDispatcher: string;
- currentDispatcherId: number;
- currentDispatcherFrom: number;
- dispatcherHistory: { dispatcherName: string; dispatcherId: number; dispatcherFrom: number; dispatcherTo: number }[];
-}
-
-export default Scenery;
+interface Scenery {
+ stationName: string;
+ stationURL: string;
+ stationLines: string;
+ stationProject: string;
+
+ reqLevel: string;
+ supportersOnly: string;
+ signalType: string;
+ controlType: string;
+ SBL: string;
+ twoWayBlock: string;
+
+ routesOneWayCatenary: number;
+ routesOneWayOther: number;
+ routesTwoWayCatenary: number;
+ routesToWayOther: number;
+
+ default: boolean;
+ nonPublic: boolean;
+ unavailable: boolean;
+ hasData: boolean;
+
+ stops: string[];
+ checkpoints: string[];
+
+ currentDispatcher: string;
+ currentDispatcherId: number;
+ currentDispatcherFrom: number;
+ dispatcherHistory: {
+ dispatcherName: string;
+ dispatcherId: number;
+ dispatcherFrom: number;
+ dispatcherTo: number;
+ }[];
+}
+
+export default Scenery;
diff --git a/src/scripts/interfaces/ScheduledTrain.ts b/src/scripts/interfaces/ScheduledTrain.ts
index 3c537e8..1637eb4 100644
--- a/src/scripts/interfaces/ScheduledTrain.ts
+++ b/src/scripts/interfaces/ScheduledTrain.ts
@@ -1,41 +1,43 @@
-import TrainStop from './TrainStop';
-
-export enum StopStatus {
- 'arriving' = 'arriving',
- 'departed' = 'departed',
- 'departed-away' = 'departed-away',
- 'online' = 'online',
- 'stopped' = 'stopped',
- 'terminated' = 'terminated',
-}
-
-export interface ScheduledTrain {
- trainId: string;
- trainNo: number;
-
- driverName: string;
- driverId: number;
- currentStationName: string;
- currentStationHash: string;
- category: string;
- stopInfo: TrainStop;
-
- terminatesAt: string;
- beginsAt: string;
-
- prevStationName: string;
- nextStationName: string;
-
- arrivingLine: string | null;
- departureLine: string | null;
-
- prevDepartureLine: string | null;
- nextArrivalLine: string | null;
-
- signal: string;
- connectedTrack: string;
-
- stopLabel: string;
- stopStatus: StopStatus;
- stopStatusID: number;
-}
+import TrainStop from './TrainStop';
+
+export enum StopStatus {
+ 'arriving' = 'arriving',
+ 'departed' = 'departed',
+ 'departed-away' = 'departed-away',
+ 'online' = 'online',
+ 'stopped' = 'stopped',
+ 'terminated' = 'terminated'
+}
+
+export interface ScheduledTrain {
+ checkpointName: string;
+
+ trainId: string;
+ trainNo: number;
+
+ driverName: string;
+ driverId: number;
+ currentStationName: string;
+ currentStationHash: string;
+ category: string;
+ stopInfo: TrainStop;
+
+ terminatesAt: string;
+ beginsAt: string;
+
+ prevStationName: string;
+ nextStationName: string;
+
+ arrivingLine: string | null;
+ departureLine: string | null;
+
+ prevDepartureLine: string | null;
+ nextArrivalLine: string | null;
+
+ signal: string;
+ connectedTrack: string;
+
+ stopLabel: string;
+ stopStatus: StopStatus;
+ stopStatusID: number;
+}
diff --git a/src/scripts/interfaces/Station.ts b/src/scripts/interfaces/Station.ts
index 82e4e8b..8dfa96d 100644
--- a/src/scripts/interfaces/Station.ts
+++ b/src/scripts/interfaces/Station.ts
@@ -1,65 +1,36 @@
-import { Availability } from './store/storeTypes';
-import {ScheduledTrain} from './ScheduledTrain';
-import StationRoutes from './StationRoutes';
-
-export default interface Station {
- name: string;
-
- generalInfo?: {
- name: string;
- url: string;
- abbr: string;
-
- reqLevel: number;
- // supportersOnly: boolean;
-
-
- lines: string;
- project: string;
- projectUrl?: string;
-
- signalType: string;
- controlType: string;
-
- SUP: boolean;
- authors?: string[];
-
- availability: Availability;
- routes: StationRoutes;
-
- checkpoints: {
- checkpointName: string;
- scheduledTrains: ScheduledTrain[];
- }[];
- };
-
- onlineInfo?: {
- hash: string;
- name: string;
- region: string;
-
- maxUsers: number;
- currentUsers: number;
-
- spawns: { spawnName: string; spawnLength: number; isElectrified: boolean }[];
- dispatcherRate: number;
- dispatcherName: string;
- dispatcherExp: number;
- dispatcherId: number;
- dispatcherIsSupporter: boolean;
-
- statusTimestamp: number;
- // statusTimeString: string;
- statusID: string;
-
- stationTrains?: {
- driverName: string;
- driverId: number;
- trainNo: number;
- trainId: string;
- stopStatus?: string;
- }[];
-
- scheduledTrains?: ScheduledTrain[];
- };
-}
+import { Availability, OnlineScenery } from './store/storeTypes';
+import { ScheduledTrain } from './ScheduledTrain';
+import StationRoutes from './StationRoutes';
+
+export default interface Station {
+ name: string;
+
+ generalInfo?: {
+ name: string;
+ url: string;
+ abbr: string;
+
+ reqLevel: number;
+ // supportersOnly: boolean;
+
+ lines: string;
+ project: string;
+ projectUrl?: string;
+
+ signalType: string;
+ controlType: string;
+
+ SUP: boolean;
+ authors?: string[];
+
+ availability: Availability;
+ routes: StationRoutes;
+
+ checkpoints: {
+ checkpointName: string;
+ scheduledTrains: ScheduledTrain[];
+ }[];
+ };
+
+ onlineInfo?: OnlineScenery;
+}
diff --git a/src/scripts/interfaces/StationRoutes.ts b/src/scripts/interfaces/StationRoutes.ts
index b7587ac..2d8fffc 100644
--- a/src/scripts/interfaces/StationRoutes.ts
+++ b/src/scripts/interfaces/StationRoutes.ts
@@ -1,30 +1,30 @@
-export default interface StationRoutes {
- oneWay: {
- name: string;
- catenary: boolean;
- SBL: boolean;
- TWB: boolean;
- isInternal: boolean;
- tracks: number;
- speed: number;
- length: number;
- }[];
-
- twoWay: {
- name: string;
- catenary: boolean;
- SBL: boolean;
- TWB: boolean;
- isInternal: boolean;
- tracks: number;
- speed: number;
- length: number;
- }[];
-
- /* [catenary, noCatenary] */
- oneWayCatenaryRouteNames: string[];
- oneWayNoCatenaryRouteNames: string[];
- twoWayCatenaryRouteNames: string[];
- twoWayNoCatenaryRouteNames: string[];
- sblRouteNames: string[];
-}
+export default interface StationRoutes {
+ oneWay: {
+ name: string;
+ catenary: boolean;
+ SBL: boolean;
+ TWB: boolean;
+ isInternal: boolean;
+ tracks: number;
+ speed: number;
+ length: number;
+ }[];
+
+ twoWay: {
+ name: string;
+ catenary: boolean;
+ SBL: boolean;
+ TWB: boolean;
+ isInternal: boolean;
+ tracks: number;
+ speed: number;
+ length: number;
+ }[];
+
+ /* [catenary, noCatenary] */
+ oneWayCatenaryRouteNames: string[];
+ oneWayNoCatenaryRouteNames: string[];
+ twoWayCatenaryRouteNames: string[];
+ twoWayNoCatenaryRouteNames: string[];
+ sblRouteNames: string[];
+}
diff --git a/src/scripts/interfaces/StoreData.ts b/src/scripts/interfaces/StoreData.ts
index c4f9bd2..77f80cd 100644
--- a/src/scripts/interfaces/StoreData.ts
+++ b/src/scripts/interfaces/StoreData.ts
@@ -1,13 +1,13 @@
-import { DataStatus } from '../enums/DataStatus';
-import Station from './Station';
-import Train from './Train';
-
-export interface StoreData {
- stationList: Station[];
- trainList: Train[];
- dispatcherCount: number;
-
- sceneryDataStatus: DataStatus;
- dispatcherDataStatus: DataStatus;
- trainsDataStatus: DataStatus;
-}
+import { DataStatus } from '../enums/DataStatus';
+import Station from './Station';
+import Train from './Train';
+
+export interface StoreData {
+ stationList: Station[];
+ trainList: Train[];
+ dispatcherCount: number;
+
+ sceneryDataStatus: DataStatus;
+ dispatcherDataStatus: DataStatus;
+ trainsDataStatus: DataStatus;
+}
diff --git a/src/scripts/interfaces/Timetable.ts b/src/scripts/interfaces/Timetable.ts
index e010186..a78931e 100644
--- a/src/scripts/interfaces/Timetable.ts
+++ b/src/scripts/interfaces/Timetable.ts
@@ -1,23 +1,23 @@
-import TrainStop from "./TrainStop";
-
-export default interface Timetable {
- trainNo: number;
-
- success: boolean;
-
- data?: {
- trainNo: number;
- driverName: string;
- driverId: number;
- currentStationName: string;
- currentStationHash: string;
- timetableId: number;
- category: string;
- route: string;
- TWR: boolean;
- SKR: boolean;
- routeDistance: number;
- followingStops: TrainStop[];
- followingSceneries: string[];
- }
-}
+import TrainStop from './TrainStop';
+
+export default interface Timetable {
+ trainNo: number;
+
+ success: boolean;
+
+ data?: {
+ trainNo: number;
+ driverName: string;
+ driverId: number;
+ currentStationName: string;
+ currentStationHash: string;
+ timetableId: number;
+ category: string;
+ route: string;
+ TWR: boolean;
+ SKR: boolean;
+ routeDistance: number;
+ followingStops: TrainStop[];
+ followingSceneries: string[];
+ };
+}
diff --git a/src/scripts/interfaces/Train.ts b/src/scripts/interfaces/Train.ts
index f1a08f0..0aca1f1 100644
--- a/src/scripts/interfaces/Train.ts
+++ b/src/scripts/interfaces/Train.ts
@@ -1,37 +1,37 @@
-import TrainStop from './TrainStop';
-
-export default interface Train {
- trainId: string;
-
- mass: number;
- length: number;
- speed: number;
- signal: string;
- distance: number;
- connectedTrack: string;
- driverId: number;
- trainNo: number;
- driverName: string;
- driverLevel: number;
- currentStationName: string;
- currentStationHash: string;
- locoType: string;
- online: boolean;
- lastSeen: number;
- region: string;
- stockList: string[];
-
- isTimeout: boolean;
- isSupporter: boolean;
-
- timetableData?: {
- timetableId: number;
- category: string;
- route: string;
- followingStops: TrainStop[];
- TWR: boolean;
- SKR: boolean;
- routeDistance: number;
- sceneries: string[];
- };
-}
+import TrainStop from './TrainStop';
+
+export default interface Train {
+ trainId: string;
+
+ mass: number;
+ length: number;
+ speed: number;
+ signal: string;
+ distance: number;
+ connectedTrack: string;
+ driverId: number;
+ trainNo: number;
+ driverName: string;
+ driverLevel: number;
+ currentStationName: string;
+ currentStationHash: string;
+ locoType: string;
+ online: boolean;
+ lastSeen: number;
+ region: string;
+ stockList: string[];
+
+ isTimeout: boolean;
+ isSupporter: boolean;
+
+ timetableData?: {
+ timetableId: number;
+ category: string;
+ route: string;
+ followingStops: TrainStop[];
+ TWR: boolean;
+ SKR: boolean;
+ routeDistance: number;
+ sceneries: string[];
+ };
+}
diff --git a/src/scripts/interfaces/TrainStop.ts b/src/scripts/interfaces/TrainStop.ts
index 3572504..aaec51b 100644
--- a/src/scripts/interfaces/TrainStop.ts
+++ b/src/scripts/interfaces/TrainStop.ts
@@ -1,30 +1,30 @@
-export default interface TrainStop {
- stopName: string;
- stopNameRAW: string;
- stopType: string;
- stopDistance: number;
- mainStop: boolean;
-
- arrivalLine: string | null;
- // arrivalTimeString: string | null;
- arrivalTimestamp: number;
- // arrivalRealTimeString: string | null;
- arrivalRealTimestamp: number;
- arrivalDelay: number;
-
- departureLine: string | null;
- // departureTimeString: string | null;
- departureTimestamp: number;
- // departureRealTimeString: string | null;
- departureRealTimestamp: number;
- departureDelay: number;
- pointId: number;
-
- comments?: any;
-
- beginsHere: boolean;
- terminatesHere: boolean;
- confirmed: boolean;
- stopped: boolean;
- stopTime: number | null;
-}
+export default interface TrainStop {
+ stopName: string;
+ stopNameRAW: string;
+ stopType: string;
+ stopDistance: number;
+ mainStop: boolean;
+
+ arrivalLine: string | null;
+ // arrivalTimeString: string | null;
+ arrivalTimestamp: number;
+ // arrivalRealTimeString: string | null;
+ arrivalRealTimestamp: number;
+ arrivalDelay: number;
+
+ departureLine: string | null;
+ // departureTimeString: string | null;
+ departureTimestamp: number;
+ // departureRealTimeString: string | null;
+ departureRealTimestamp: number;
+ departureDelay: number;
+ pointId: number;
+
+ comments?: any;
+
+ beginsHere: boolean;
+ terminatesHere: boolean;
+ confirmed: boolean;
+ stopped: boolean;
+ stopTime: number | null;
+}
diff --git a/src/scripts/interfaces/Trains/TrainFilter.ts b/src/scripts/interfaces/Trains/TrainFilter.ts
index f27b380..1d68af3 100644
--- a/src/scripts/interfaces/Trains/TrainFilter.ts
+++ b/src/scripts/interfaces/Trains/TrainFilter.ts
@@ -1,7 +1,7 @@
-import { TrainFilterSection, TrainFilterType } from '../../enums/TrainFilterType'
-
-export interface TrainFilter {
- id: TrainFilterType;
- section: TrainFilterSection;
- isActive: boolean;
-}
+import { TrainFilterSection, TrainFilterType } from '../../enums/TrainFilterType';
+
+export interface TrainFilter {
+ id: TrainFilterType;
+ section: TrainFilterSection;
+ isActive: boolean;
+}
diff --git a/src/scripts/interfaces/api/DispatchersAPIData.ts b/src/scripts/interfaces/api/DispatchersAPIData.ts
index 5961188..506957f 100644
--- a/src/scripts/interfaces/api/DispatchersAPIData.ts
+++ b/src/scripts/interfaces/api/DispatchersAPIData.ts
@@ -1,18 +1,18 @@
-export interface DispatcherHistory {
- id: string;
-
- currentDuration: number;
- dispatcherId: number;
- dispatcherName: string;
- dispatcherLevel: number | null;
- dispatcherRate: number;
- dispatcherIsSupporter: boolean;
- dispatcherStatus?: number;
- isOnline: boolean;
- lastOnlineTimestamp: number;
- region: string;
- stationHash: string;
- stationName: string;
- timestampFrom: number;
- timestampTo?: number;
-}
+export interface DispatcherHistory {
+ id: string;
+
+ currentDuration: number;
+ dispatcherId: number;
+ dispatcherName: string;
+ dispatcherLevel: number | null;
+ dispatcherRate: number;
+ dispatcherIsSupporter: boolean;
+ dispatcherStatus?: number;
+ isOnline: boolean;
+ lastOnlineTimestamp: number;
+ region: string;
+ stationHash: string;
+ stationName: string;
+ timestampFrom: number;
+ timestampTo?: number;
+}
diff --git a/src/scripts/interfaces/api/StationAPIData.ts b/src/scripts/interfaces/api/StationAPIData.ts
index 6ddabe9..4de0180 100644
--- a/src/scripts/interfaces/api/StationAPIData.ts
+++ b/src/scripts/interfaces/api/StationAPIData.ts
@@ -1,18 +1,18 @@
-export default interface StationAPIData {
- dispatcherId: number;
- dispatcherName: string;
- dispatcherIsSupporter: boolean;
- stationName: string;
- stationHash: string;
- region: string;
- maxUsers: number;
- currentUsers: number;
- spawn: number;
- lastSeen: number;
- dispatcherExp: number;
- nameFromHeader: string;
- spawnString: string | null;
- networkConnectionString: string;
- isOnline: number;
- dispatcherRate: number;
-}
\ No newline at end of file
+export default interface StationAPIData {
+ dispatcherId: number;
+ dispatcherName: string;
+ dispatcherIsSupporter: boolean;
+ stationName: string;
+ stationHash: string;
+ region: string;
+ maxUsers: number;
+ currentUsers: number;
+ spawn: number;
+ lastSeen: number;
+ dispatcherExp: number;
+ nameFromHeader: string;
+ spawnString: string | null;
+ networkConnectionString: string;
+ isOnline: number;
+ dispatcherRate: number;
+}
diff --git a/src/scripts/interfaces/api/StatsAPIData.ts b/src/scripts/interfaces/api/StatsAPIData.ts
index bcb8596..4fea020 100644
--- a/src/scripts/interfaces/api/StatsAPIData.ts
+++ b/src/scripts/interfaces/api/StatsAPIData.ts
@@ -49,4 +49,3 @@ export interface ITimetablesDailyStatsResponse {
station: string;
}[];
}
-
diff --git a/src/scripts/interfaces/api/TimetablesAPIData.ts b/src/scripts/interfaces/api/TimetablesAPIData.ts
index e64a231..49e9bec 100644
--- a/src/scripts/interfaces/api/TimetablesAPIData.ts
+++ b/src/scripts/interfaces/api/TimetablesAPIData.ts
@@ -1,67 +1,67 @@
-export interface TimetableHistory {
- id: number;
- createdAt: string;
- updatedAt: string;
-
- timetableId: number;
- trainNo: number;
- trainCategoryCode: string;
-
- driverId: number;
- driverName: string;
- driverLevel: number | null;
- driverIsSupporter: boolean;
-
- route: string;
- twr: number;
- skr: number;
- sceneriesString: string;
- currentLocation: string[];
-
- routeDistance: number;
- currentDistance: number;
-
- confirmedStopsCount: number;
- allStopsCount: number;
-
- beginDate: string;
- endDate: string;
-
- scheduledBeginDate: string;
- scheduledEndDate: string;
-
- terminated: boolean;
- fulfilled: boolean;
-
- authorName?: string;
- authorId?: number;
-
- stopsString?: string;
-
- stockString?: string;
- stockHistory: string[];
-
- stockMass?: number;
- stockLength?: number;
- maxSpeed?: number;
-
- hashesString?: string;
- currentSceneryName?: string;
- currentSceneryHash?: string;
-
- routeSceneries?: string;
-
- checkpointArrivals?: string[];
- checkpointDepartures?: string[];
-
- checkpointArrivalsScheduled?: string[];
- checkpointDeparturesScheduled?: string[];
-
- checkpointStopTypes?: string[];
-}
-
-export interface SceneryTimetableHistory {
- timetables: TimetableHistory[];
- // totalCount: number;
- // sceneryName: string;
-}
+export interface TimetableHistory {
+ id: number;
+ createdAt: string;
+ updatedAt: string;
+
+ timetableId: number;
+ trainNo: number;
+ trainCategoryCode: string;
+
+ driverId: number;
+ driverName: string;
+ driverLevel: number | null;
+ driverIsSupporter: boolean;
+
+ route: string;
+ twr: number;
+ skr: number;
+ sceneriesString: string;
+ currentLocation: string[];
+
+ routeDistance: number;
+ currentDistance: number;
+
+ confirmedStopsCount: number;
+ allStopsCount: number;
+
+ beginDate: string;
+ endDate: string;
+
+ scheduledBeginDate: string;
+ scheduledEndDate: string;
+
+ terminated: boolean;
+ fulfilled: boolean;
+
+ authorName?: string;
+ authorId?: number;
+
+ stopsString?: string;
+
+ stockString?: string;
+ stockHistory: string[];
+
+ stockMass?: number;
+ stockLength?: number;
+ maxSpeed?: number;
+
+ hashesString?: string;
+ currentSceneryName?: string;
+ currentSceneryHash?: string;
+
+ routeSceneries?: string;
+
+ checkpointArrivals?: string[];
+ checkpointDepartures?: string[];
+
+ checkpointArrivalsScheduled?: string[];
+ checkpointDeparturesScheduled?: string[];
+
+ checkpointStopTypes?: string[];
+}
+
+export interface SceneryTimetableHistory {
+ timetables: TimetableHistory[];
+ // totalCount: number;
+ // sceneryName: string;
+}
diff --git a/src/scripts/interfaces/api/TimetablesQueryParams.ts b/src/scripts/interfaces/api/TimetablesQueryParams.ts
index 5b67c8f..56bad04 100644
--- a/src/scripts/interfaces/api/TimetablesQueryParams.ts
+++ b/src/scripts/interfaces/api/TimetablesQueryParams.ts
@@ -1,23 +1,23 @@
-import { JournalTimetableSorter } from '../../types/JournalTimetablesTypes';
-
-export interface TimetablesQueryParams {
- driverName?: string;
- trainNo?: string;
- timetableId?: string;
-
- authorName?: string;
- timestampFrom?: number;
- timestampTo?: number;
- issuedFrom?: string;
-
- countFrom?: number;
- countLimit?: number;
-
- fulfilled?: number;
- terminated?: number;
-
- twr?: number;
- skr?: number;
-
- sortBy?: JournalTimetableSorter['id'];
-}
+import { JournalTimetableSorter } from '../../types/JournalTimetablesTypes';
+
+export interface TimetablesQueryParams {
+ driverName?: string;
+ trainNo?: string;
+ timetableId?: string;
+
+ authorName?: string;
+ timestampFrom?: number;
+ timestampTo?: number;
+ issuedFrom?: string;
+
+ countFrom?: number;
+ countLimit?: number;
+
+ fulfilled?: number;
+ terminated?: number;
+
+ twr?: number;
+ skr?: number;
+
+ sortBy?: JournalTimetableSorter['id'];
+}
diff --git a/src/scripts/interfaces/api/TrainAPIData.ts b/src/scripts/interfaces/api/TrainAPIData.ts
index 8e2d97b..c7bbc0d 100644
--- a/src/scripts/interfaces/api/TrainAPIData.ts
+++ b/src/scripts/interfaces/api/TrainAPIData.ts
@@ -1,68 +1,68 @@
-export interface TimetableStop {
- stopName: string;
- stopNameRAW: string;
- stopType: string;
- stopDistance: number;
- pointId: number;
-
- mainStop: boolean;
-
- arrivalLine: string;
- arrivalTimestamp: number;
- arrivalRealTimestamp: number;
- arrivalDelay: number;
-
- departureLine: string;
- departureTimestamp: number;
- departureRealTimestamp: number;
- departureDelay: number;
-
- comments?: any;
-
- beginsHere: boolean;
- terminatesHere: boolean;
- confirmed: boolean;
- stopped: boolean;
- stopTime: number;
-}
-
-export interface TrainTimetable {
- timetableId: number;
- category: string;
- route: string;
-
- stopList: TimetableStop[];
-
- TWR: boolean;
- SKR: boolean;
- sceneries: string[];
-}
-
-export interface TrainAPIData {
- trainNo: number;
-
- mass: number;
- length: number;
- speed: number;
- stockString: string;
-
- signal: string;
- distance: number;
- connectedTrack: string;
-
- driverName: string;
- driverId: number;
- driverIsSupporter: boolean;
- driverLevel?: number;
-
- currentStationName: string;
- currentStationHash: string;
-
- online: boolean;
- lastSeen: number;
-
- region: string;
- isTimeout: boolean;
-
- timetable?: TrainTimetable;
-}
+export interface TimetableStop {
+ stopName: string;
+ stopNameRAW: string;
+ stopType: string;
+ stopDistance: number;
+ pointId: number;
+
+ mainStop: boolean;
+
+ arrivalLine: string;
+ arrivalTimestamp: number;
+ arrivalRealTimestamp: number;
+ arrivalDelay: number;
+
+ departureLine: string;
+ departureTimestamp: number;
+ departureRealTimestamp: number;
+ departureDelay: number;
+
+ comments?: any;
+
+ beginsHere: boolean;
+ terminatesHere: boolean;
+ confirmed: boolean;
+ stopped: boolean;
+ stopTime: number;
+}
+
+export interface TrainTimetable {
+ timetableId: number;
+ category: string;
+ route: string;
+
+ stopList: TimetableStop[];
+
+ TWR: boolean;
+ SKR: boolean;
+ sceneries: string[];
+}
+
+export interface TrainAPIData {
+ trainNo: number;
+
+ mass: number;
+ length: number;
+ speed: number;
+ stockString: string;
+
+ signal: string;
+ distance: number;
+ connectedTrack: string;
+
+ driverName: string;
+ driverId: number;
+ driverIsSupporter: boolean;
+ driverLevel?: number;
+
+ currentStationName: string;
+ currentStationHash: string;
+
+ online: boolean;
+ lastSeen: number;
+
+ region: string;
+ isTimeout: boolean;
+
+ timetable?: TrainTimetable;
+}
diff --git a/src/scripts/interfaces/store/storeTypes.ts b/src/scripts/interfaces/store/storeTypes.ts
index 61cbe85..7b6ea1b 100644
--- a/src/scripts/interfaces/store/storeTypes.ts
+++ b/src/scripts/interfaces/store/storeTypes.ts
@@ -1,93 +1,129 @@
-import { Socket } from 'socket.io-client';
-import { DataStatus } from '../../enums/DataStatus';
-import StationAPIData from '../api/StationAPIData';
-import { TrainAPIData } from '../api/TrainAPIData';
-import Station from '../Station';
-import Train from '../Train';
-import { DispatcherStatsAPIData } from '../api/DispatcherStatsAPIData';
-import { DriverStatsAPIData } from '../api/DriverStatsAPIData';
-import { RollingStockGithubData } from '../github_api/StockInfoGithubData';
-
-export type Availability = 'default' | 'unavailable' | 'nonPublic' | 'abandoned' | 'nonDefault';
-
-export interface StoreState {
- stationList: Station[];
- trainList: Train[];
- apiData: APIData;
- rollingStockData?: RollingStockGithubData;
-
- lastDispatcherStatuses: { hash: string; statusTimestamp: number; statusID: string }[];
-
- sceneryData: any[][];
-
- region: { id: string; value: string };
- trainCount: number;
- stationCount: number;
-
- webSocket?: Socket;
- isOffline: boolean;
-
- dispatcherStatsName: string;
- dispatcherStatsData?: DispatcherStatsAPIData;
-
- driverStatsName: string;
- driverStatsData?: DriverStatsAPIData;
- driverStatsStatus: DataStatus;
-
- chosenModalTrainId?: string;
-
- currentStatsTab: 'daily' | 'driver' | null;
-
- dataStatuses: {
- connection: DataStatus;
- sceneries: DataStatus;
- timetables: DataStatus;
- dispatchers: DataStatus;
- trains: DataStatus;
- };
-
- listenerLaunched: boolean;
- blockScroll: boolean;
- modalLastClickedTarget: EventTarget | null;
-}
-
-export interface APIData {
- stations?: StationAPIData[];
- dispatchers?: string[][];
- trains?: TrainAPIData[];
- connectedSocketCount: number;
-}
-
-export interface StationRoutesInfo {
- routeName: string;
- isElectric: boolean;
- isInternal: boolean;
- isRouteSBL: boolean;
- routeLength: number;
- routeSpeed: number;
- routeTracks: number;
-}
-
-export interface StationJSONData {
- name: string;
- abbr: string;
- url: string;
- lines: string;
- project: string;
- projectUrl: string;
-
- reqLevel: number;
-
- signalType: string;
- controlType: string;
-
- SUP: boolean;
-
- // routes: string;
- routesInfo: StationRoutesInfo[];
-
- checkpoints: string | null;
- authors?: string;
-
- availability: Availability;
-}
+import { Socket } from 'socket.io-client';
+import { DataStatus } from '../../enums/DataStatus';
+import StationAPIData from '../api/StationAPIData';
+import { TrainAPIData } from '../api/TrainAPIData';
+import { DispatcherStatsAPIData } from '../api/DispatcherStatsAPIData';
+import { DriverStatsAPIData } from '../api/DriverStatsAPIData';
+import { RollingStockGithubData } from '../github_api/StockInfoGithubData';
+import Station from '../Station';
+import { ScheduledTrain } from '../ScheduledTrain';
+import { DispatcherStatusID } from '../../enums/DispatcherStatus';
+
+export type Availability = 'default' | 'unavailable' | 'nonPublic' | 'abandoned' | 'nonDefault';
+
+export interface StoreState {
+ stationList: Station[];
+ apiData: APIData;
+ rollingStockData?: RollingStockGithubData;
+
+ lastDispatcherStatuses: { hash: string; statusTimestamp: number; statusID: DispatcherStatusID }[];
+
+ sceneryData: any[][];
+
+ region: { id: string; value: string };
+ trainCount: number;
+ stationCount: number;
+
+ webSocket?: Socket;
+ isOffline: boolean;
+
+ dispatcherStatsName: string;
+ dispatcherStatsData?: DispatcherStatsAPIData;
+
+ driverStatsName: string;
+ driverStatsData?: DriverStatsAPIData;
+ driverStatsStatus: DataStatus;
+
+ chosenModalTrainId?: string;
+
+ currentStatsTab: 'daily' | 'driver' | null;
+
+ dataStatuses: {
+ connection: DataStatus;
+ sceneries: DataStatus;
+ timetables: DataStatus;
+ dispatchers: DataStatus;
+ trains: DataStatus;
+ };
+
+ listenerLaunched: boolean;
+ blockScroll: boolean;
+ modalLastClickedTarget: EventTarget | null;
+}
+
+export interface APIData {
+ stations?: StationAPIData[];
+ dispatchers?: string[][];
+ trains?: TrainAPIData[];
+ connectedSocketCount: number;
+}
+
+export interface StationRoutesInfo {
+ routeName: string;
+ isElectric: boolean;
+ isInternal: boolean;
+ isRouteSBL: boolean;
+ routeLength: number;
+ routeSpeed: number;
+ routeTracks: number;
+}
+
+export interface StationJSONData {
+ name: string;
+ abbr: string;
+ url: string;
+ lines: string;
+ project: string;
+ projectUrl: string;
+
+ reqLevel: number;
+
+ signalType: string;
+ controlType: string;
+
+ SUP: boolean;
+
+ // routes: string;
+ routesInfo: StationRoutesInfo[];
+
+ checkpoints: string | null;
+ authors?: string;
+
+ availability: Availability;
+}
+
+export interface StationTrain {
+ driverName: string;
+ driverId: number;
+ trainNo: number;
+ trainId: string;
+ stopStatus: string;
+}
+
+export interface OnlineScenery {
+ name: string;
+ hash: string;
+ region: string;
+ maxUsers: number;
+ currentUsers: number;
+ spawns: { spawnName: string; spawnLength: number; isElectrified: boolean }[];
+ dispatcherName: string;
+ dispatcherRate: number;
+ dispatcherId: number;
+ dispatcherExp: number;
+ dispatcherIsSupporter: boolean;
+
+ statusTimestamp: number;
+ statusID: DispatcherStatusID;
+
+ isOnline: boolean;
+
+ stationTrains?: StationTrain[];
+ scheduledTrains?: ScheduledTrain[];
+
+ scheduledTrainCount: {
+ all: number;
+ confirmed: number;
+ unconfirmed: number;
+ }
+}
diff --git a/src/scripts/managers/storageManager.ts b/src/scripts/managers/storageManager.ts
index 600193e..38a5071 100644
--- a/src/scripts/managers/storageManager.ts
+++ b/src/scripts/managers/storageManager.ts
@@ -1,49 +1,49 @@
-export default class StorageManager {
- static registerStorage(name: string) {
- window.localStorage.setItem(name, '1');
- }
-
- static unregisterStorage(name: string) {
- window.localStorage.removeItem(name);
- }
-
- static isRegistered(name: string) {
- return window.localStorage.getItem(name) ? true : false;
- }
-
- static setBooleanValue(key: string, val: boolean) {
- window.localStorage.setItem(key, val.toString());
- }
-
- static setNumericValue(key: string, val: number) {
- window.localStorage.setItem(key, val.toString());
- }
-
- static setStringValue(key: string, val: string) {
- window.localStorage.setItem(key, val);
- }
-
- static setValue(key: string, val: any) {
- if (typeof val == 'boolean') this.setBooleanValue(key, val);
- else if (typeof val == 'number') this.setNumericValue(key, val);
- else if (typeof val == 'string') this.setStringValue(key, val);
- else this.setStringValue(key, val);
- }
-
- static removeValue(key: string) {
- window.localStorage.removeItem(key);
- }
-
- static getBooleanValue(key: string): boolean {
- return window.localStorage.getItem(key) === 'true' ? true : false;
- }
-
- static getStringValue(key: string): string {
- return window.localStorage.getItem(key) || '';
- }
-
- static getNumericValue(key: string): number {
- const itemValue = window.localStorage.getItem(key);
- return itemValue ? parseInt(itemValue) : 0;
- }
-}
+export default class StorageManager {
+ static registerStorage(name: string) {
+ window.localStorage.setItem(name, '1');
+ }
+
+ static unregisterStorage(name: string) {
+ window.localStorage.removeItem(name);
+ }
+
+ static isRegistered(name: string) {
+ return window.localStorage.getItem(name) ? true : false;
+ }
+
+ static setBooleanValue(key: string, val: boolean) {
+ window.localStorage.setItem(key, val.toString());
+ }
+
+ static setNumericValue(key: string, val: number) {
+ window.localStorage.setItem(key, val.toString());
+ }
+
+ static setStringValue(key: string, val: string) {
+ window.localStorage.setItem(key, val);
+ }
+
+ static setValue(key: string, val: any) {
+ if (typeof val == 'boolean') this.setBooleanValue(key, val);
+ else if (typeof val == 'number') this.setNumericValue(key, val);
+ else if (typeof val == 'string') this.setStringValue(key, val);
+ else this.setStringValue(key, val);
+ }
+
+ static removeValue(key: string) {
+ window.localStorage.removeItem(key);
+ }
+
+ static getBooleanValue(key: string): boolean {
+ return window.localStorage.getItem(key) === 'true' ? true : false;
+ }
+
+ static getStringValue(key: string): string {
+ return window.localStorage.getItem(key) || '';
+ }
+
+ static getNumericValue(key: string): number {
+ const itemValue = window.localStorage.getItem(key);
+ return itemValue ? parseInt(itemValue) : 0;
+ }
+}
diff --git a/src/scripts/managers/trainFilterManager.ts b/src/scripts/managers/trainFilterManager.ts
index 89ddab6..bb8225c 100644
--- a/src/scripts/managers/trainFilterManager.ts
+++ b/src/scripts/managers/trainFilterManager.ts
@@ -1,130 +1,147 @@
-import { TrainFilter } from '../interfaces/Trains/TrainFilter';
-import { TrainFilterType } from '../enums/TrainFilterType';
-import Train from '../interfaces/Train';
-import TrainStop from '../interfaces/TrainStop';
-
-function confirmedPercentage(stops: TrainStop[] | undefined) {
- if (!stops) return -1;
-
- return Number(((stops.filter((stop) => stop.confirmed).length / stops.length) * 100).toFixed(0));
-}
-
-function currentDelay(stops: TrainStop[] | undefined) {
- if (!stops) return -Infinity;
-
- const delay =
- stops.find((stop, i) => (i == 0 && !stop.confirmed) || (i > 0 && stops[i - 1].confirmed && !stop.confirmed))
- ?.departureDelay || 0;
-
- return delay;
-}
-
-function filterTrainList(trainList: Train[], searchedTrain: string, searchedDriver: string, filters: TrainFilter[]) {
- return trainList.filter((train) => {
- const isFiltered = filters.every((f) => {
- if (f.isActive) return true;
-
- switch (f.id) {
- case TrainFilterType.noTimetable:
- return train.timetableData;
-
- case TrainFilterType.withTimetable:
- return !train.timetableData;
-
- case TrainFilterType.withComments:
- 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;
-
- case TrainFilterType.skr:
- 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 || '');
-
- case TrainFilterType.freight:
- return !train.timetableData?.category.startsWith('T');
-
- case TrainFilterType.other:
- return !/^[PXZL]\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) &&
- (!train.timetableData ? train.online : train.timetableData) &&
- isFiltered
- );
- });
-}
-
-function sortTrainList(trainList: Train[], sorterActive: { id: string; dir: number }) {
- return trainList.sort((a: Train, b: Train) => {
- switch (sorterActive.id) {
- case 'id':
- if ((a.timetableData?.timetableId || -1) > (b.timetableData?.timetableId || -1)) return sorterActive.dir;
-
- return -sorterActive.dir;
-
- case 'mass':
- if (a.mass > b.mass) return sorterActive.dir;
- return -sorterActive.dir;
-
- case 'routeDistance':
- if ((a.timetableData?.routeDistance || -1) > (b.timetableData?.routeDistance || -1)) return sorterActive.dir;
-
- return -sorterActive.dir;
-
- case 'progress':
- if (confirmedPercentage(a.timetableData?.followingStops) > confirmedPercentage(b.timetableData?.followingStops))
- return sorterActive.dir;
-
- return -sorterActive.dir;
-
- case 'delay':
- if (currentDelay(a.timetableData?.followingStops) > currentDelay(b.timetableData?.followingStops))
- return sorterActive.dir;
-
- return -sorterActive.dir;
-
- case 'speed':
- if (a.speed > b.speed) return sorterActive.dir;
- return -sorterActive.dir;
-
- case 'timetable':
- if (a.trainNo > b.trainNo) return sorterActive.dir;
- return -sorterActive.dir;
-
- case 'length':
- if (a.length > b.length) return sorterActive.dir;
- return -sorterActive.dir;
-
- default:
- break;
- }
-
- return 0;
- });
-}
-
-export function filteredTrainList(
- trainList: Train[],
- searchedTrain: string,
- searchedDriver: string,
- sorterActive: { id: string; dir: number },
- filters: TrainFilter[]
-) {
- const filtered = filterTrainList(trainList, searchedTrain, searchedDriver, filters);
- return [...sortTrainList(filtered, sorterActive)];
-}
+import { TrainFilter } from '../interfaces/Trains/TrainFilter';
+import { TrainFilterType } from '../enums/TrainFilterType';
+import Train from '../interfaces/Train';
+import TrainStop from '../interfaces/TrainStop';
+
+function confirmedPercentage(stops: TrainStop[] | undefined) {
+ if (!stops) return -1;
+
+ return Number(((stops.filter((stop) => stop.confirmed).length / stops.length) * 100).toFixed(0));
+}
+
+function currentDelay(stops: TrainStop[] | undefined) {
+ if (!stops) return -Infinity;
+
+ const delay =
+ stops.find(
+ (stop, i) =>
+ (i == 0 && !stop.confirmed) || (i > 0 && stops[i - 1].confirmed && !stop.confirmed)
+ )?.departureDelay || 0;
+
+ return delay;
+}
+
+function filterTrainList(
+ trainList: Train[],
+ searchedTrain: string,
+ searchedDriver: string,
+ filters: TrainFilter[]
+) {
+ return trainList.filter((train) => {
+ const isFiltered = filters.every((f) => {
+ if (f.isActive) return true;
+
+ switch (f.id) {
+ case TrainFilterType.noTimetable:
+ return train.timetableData;
+
+ case TrainFilterType.withTimetable:
+ return !train.timetableData;
+
+ case TrainFilterType.withComments:
+ 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;
+
+ case TrainFilterType.skr:
+ 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 || '');
+
+ case TrainFilterType.freight:
+ return !train.timetableData?.category.startsWith('T');
+
+ case TrainFilterType.other:
+ return !/^[PXZL]\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) &&
+ (!train.timetableData ? train.online : train.timetableData) &&
+ isFiltered
+ );
+ });
+}
+
+function sortTrainList(trainList: Train[], sorterActive: { id: string; dir: number }) {
+ return trainList.sort((a: Train, b: Train) => {
+ switch (sorterActive.id) {
+ case 'id':
+ if ((a.timetableData?.timetableId || -1) > (b.timetableData?.timetableId || -1))
+ return sorterActive.dir;
+
+ return -sorterActive.dir;
+
+ case 'mass':
+ if (a.mass > b.mass) return sorterActive.dir;
+ return -sorterActive.dir;
+
+ case 'routeDistance':
+ if ((a.timetableData?.routeDistance || -1) > (b.timetableData?.routeDistance || -1))
+ return sorterActive.dir;
+
+ return -sorterActive.dir;
+
+ case 'progress':
+ if (
+ confirmedPercentage(a.timetableData?.followingStops) >
+ confirmedPercentage(b.timetableData?.followingStops)
+ )
+ return sorterActive.dir;
+
+ return -sorterActive.dir;
+
+ case 'delay':
+ if (
+ currentDelay(a.timetableData?.followingStops) >
+ currentDelay(b.timetableData?.followingStops)
+ )
+ return sorterActive.dir;
+
+ return -sorterActive.dir;
+
+ case 'speed':
+ if (a.speed > b.speed) return sorterActive.dir;
+ return -sorterActive.dir;
+
+ case 'timetable':
+ if (a.trainNo > b.trainNo) return sorterActive.dir;
+ return -sorterActive.dir;
+
+ case 'length':
+ if (a.length > b.length) return sorterActive.dir;
+ return -sorterActive.dir;
+
+ default:
+ break;
+ }
+
+ return 0;
+ });
+}
+
+export function filteredTrainList(
+ trainList: Train[],
+ searchedTrain: string,
+ searchedDriver: string,
+ sorterActive: { id: string; dir: number },
+ filters: TrainFilter[]
+) {
+ const filtered = filterTrainList(trainList, searchedTrain, searchedDriver, filters);
+ return [...sortTrainList(filtered, sorterActive)];
+}
diff --git a/src/scripts/types/JournalDispatcherTypes.ts b/src/scripts/types/JournalDispatcherTypes.ts
index 2c101e4..d2d67bd 100644
--- a/src/scripts/types/JournalDispatcherTypes.ts
+++ b/src/scripts/types/JournalDispatcherTypes.ts
@@ -1,8 +1,8 @@
-export type JournalDispatcherSearcher = {
- [key in 'search-dispatcher' | 'search-station' | 'search-date']: string;
-};
-
-export interface JournalDispatcherSorter {
- id: 'timestampFrom' | 'duration';
- dir: -1 | 1;
-}
\ No newline at end of file
+export type JournalDispatcherSearcher = {
+ [key in 'search-dispatcher' | 'search-station' | 'search-date']: string;
+};
+
+export interface JournalDispatcherSorter {
+ id: 'timestampFrom' | 'duration';
+ dir: -1 | 1;
+}
diff --git a/src/scripts/types/JournalTimetablesTypes.ts b/src/scripts/types/JournalTimetablesTypes.ts
index be5519b..2a698d4 100644
--- a/src/scripts/types/JournalTimetablesTypes.ts
+++ b/src/scripts/types/JournalTimetablesTypes.ts
@@ -1,25 +1,25 @@
-import { JournalFilterType } from '../../scripts/enums/JournalFilterType';
-
-export type JournalTimetableSearchKey =
- | 'search-driver'
- | 'search-train'
- | 'search-date'
- | 'search-dispatcher'
- | 'search-issuedFrom';
-
-export type JournalTimetableSorterKey = 'timetableId' | 'beginDate' | 'distance' | 'total-stops';
-
-export type JournalTimetableSearchType = {
- [key in JournalTimetableSearchKey]: string;
-};
-
-export interface JournalFilter {
- id: JournalFilterType;
- filterSection: string;
- isActive: boolean;
-}
-
-export interface JournalTimetableSorter {
- id: JournalTimetableSorterKey;
- dir: 'asc' | 'desc';
-}
+import { JournalFilterType } from '../../scripts/enums/JournalFilterType';
+
+export type JournalTimetableSearchKey =
+ | 'search-driver'
+ | 'search-train'
+ | 'search-date'
+ | 'search-dispatcher'
+ | 'search-issuedFrom';
+
+export type JournalTimetableSorterKey = 'timetableId' | 'beginDate' | 'distance' | 'total-stops';
+
+export type JournalTimetableSearchType = {
+ [key in JournalTimetableSearchKey]: string;
+};
+
+export interface JournalFilter {
+ id: JournalFilterType;
+ filterSection: string;
+ isActive: boolean;
+}
+
+export interface JournalTimetableSorter {
+ id: JournalTimetableSorterKey;
+ dir: 'asc' | 'desc';
+}
diff --git a/src/scripts/utils/apiURLs.ts b/src/scripts/utils/apiURLs.ts
index 35d88c9..c8ddcec 100644
--- a/src/scripts/utils/apiURLs.ts
+++ b/src/scripts/utils/apiURLs.ts
@@ -1,7 +1,7 @@
-export const URLs = {
- stacjownikAPI:
- import.meta.env.VITE_APP_API_DEV === "1" && !import.meta.env.PROD
- ? 'http://localhost:3001'
- : 'https://stacjownik.spythere.pl',
- stacjownikAPIDev: 'localhost:3000',
-};
+export const URLs = {
+ stacjownikAPI:
+ import.meta.env.VITE_APP_API_DEV === '1' && !import.meta.env.PROD
+ ? 'http://localhost:3001'
+ : 'https://stacjownik.spythere.pl',
+ stacjownikAPIDev: 'localhost:3000'
+};
diff --git a/src/scripts/utils/filterUtils.ts b/src/scripts/utils/filterUtils.ts
index 9ffde9b..c55c3ae 100644
--- a/src/scripts/utils/filterUtils.ts
+++ b/src/scripts/utils/filterUtils.ts
@@ -1,156 +1,183 @@
-import { HeadIdsTypes } from '../data/stationHeaderNames';
-import Filter from '../interfaces/Filter';
-import Station from '../interfaces/Station';
-
-export const sortStations = (a: Station, b: Station, sorter: { headerName: HeadIdsTypes; dir: number }) => {
- let diff = 0;
-
- switch (sorter.headerName) {
- case 'station':
- return sorter.dir == 1 ? a.name.localeCompare(b.name) : b.name.localeCompare(a.name);
-
- case 'min-lvl':
- diff = (a.generalInfo?.reqLevel || 0) - (b.generalInfo?.reqLevel || 0);
- break;
-
- case 'status':
- diff = (a.onlineInfo?.statusTimestamp || 0) - (b.onlineInfo?.statusTimestamp || 0);
- break;
-
- case 'dispatcher':
- 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 'dispatcher-lvl':
- diff = (a.onlineInfo?.dispatcherExp || 0) - (b.onlineInfo?.dispatcherExp || 0);
- break;
-
- case 'user':
- diff = (b.onlineInfo ? b.onlineInfo.currentUsers : -1) - (a.onlineInfo ? a.onlineInfo.currentUsers : -1);
- break;
-
- case 'spawn':
- diff = (a.onlineInfo ? a.onlineInfo.spawns.length : -1) - (b.onlineInfo ? b.onlineInfo.spawns.length : -1);
- break;
-
- case 'timetableConfirmed':
- diff =
- (a.onlineInfo?.scheduledTrains
- ? a.onlineInfo.scheduledTrains.filter((train) => train.stopInfo.confirmed).length
- : -1) -
- (b.onlineInfo?.scheduledTrains
- ? b.onlineInfo.scheduledTrains.filter((train) => train.stopInfo.confirmed).length
- : -1);
- break;
-
- case 'timetableUnconfirmed':
- diff =
- (a.onlineInfo?.scheduledTrains
- ? a.onlineInfo.scheduledTrains.filter((train) => !train.stopInfo.confirmed).length
- : -1) -
- (b.onlineInfo?.scheduledTrains
- ? b.onlineInfo.scheduledTrains.filter((train) => !train.stopInfo.confirmed).length
- : -1);
- break;
-
- case 'timetableAll':
- diff =
- (a.onlineInfo?.scheduledTrains ? a.onlineInfo.scheduledTrains.length : -1) -
- (b.onlineInfo?.scheduledTrains ? b.onlineInfo.scheduledTrains.length : -1);
- break;
-
- default:
- break;
- }
-
- if (diff != 0) return Math.sign(diff) * sorter.dir;
- return a.name.localeCompare(b.name);
-};
-
-export const filterStations = (station: Station, filters: Filter) => {
- if (!station.onlineInfo && filters['free']) return false;
-
- if (station.onlineInfo) {
- const { statusID, statusTimestamp } = station.onlineInfo;
-
- 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'];
-
- 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 (isEnding || isOnlineInBounds || isNotSigned || isAFK || isNoSpace || isOccupied) return false;
- }
-
- if ((station.generalInfo?.availability == 'nonPublic' || !station.generalInfo) && filters['nonPublic']) return false;
-
- if (station.generalInfo) {
- const { routes, availability, controlType, lines, reqLevel, signalType, SUP, authors } = station.generalInfo;
-
- 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['notDefault'] &&
- !(availability == 'abandoned' || availability == 'unavailable')
- )
- return false;
-
- if (filters['real'] && lines) return false;
- if (filters['fictional'] && !lines) return false;
-
- 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 false;
-
- if (
- filters['no-2track'] &&
- (routes.twoWayCatenaryRouteNames.length != 0 || routes.twoWayNoCatenaryRouteNames.length != 0)
- )
- return false;
-
- if (routes.oneWayCatenaryRouteNames.length < filters['minOneWayCatenary']) return false;
- if (routes.oneWayNoCatenaryRouteNames.length < filters['minOneWay']) return false;
-
- if (routes.twoWayCatenaryRouteNames.length < filters['minTwoWayCatenary']) return false;
- if (routes.twoWayNoCatenaryRouteNames.length < filters['minTwoWay']) return false;
-
- if (filters[controlType]) return false;
- if (filters[signalType]) return false;
-
- if (filters['SUP'] && SUP) return false;
- if (filters['noSUP'] && !SUP) return false;
-
- if (filters['SBL'] && routes.sblRouteNames.length > 0) return false;
- if (filters['PBL'] && routes.sblRouteNames.length == 0) return false;
-
- if (
- filters['authors'].length > 3 &&
- !authors?.map((a) => a.toLocaleLowerCase()).includes(filters['authors'].toLocaleLowerCase())
- )
- return false;
- }
-
- return true;
-};
+import { HeadIdsTypes } from '../data/stationHeaderNames';
+import { DispatcherStatusID } from '../enums/DispatcherStatus';
+import Filter from '../interfaces/Filter';
+import Station from '../interfaces/Station';
+
+export const sortStations = (
+ a: Station,
+ b: Station,
+ sorter: { headerName: HeadIdsTypes; dir: number }
+) => {
+ let diff = 0;
+
+ switch (sorter.headerName) {
+ case 'station':
+ return sorter.dir == 1 ? a.name.localeCompare(b.name) : b.name.localeCompare(a.name);
+
+ case 'min-lvl':
+ diff = (a.generalInfo?.reqLevel || 0) - (b.generalInfo?.reqLevel || 0);
+ break;
+
+ case 'status':
+ diff = (a.onlineInfo?.statusTimestamp || 0) - (b.onlineInfo?.statusTimestamp || 0);
+ break;
+
+ case 'dispatcher':
+ 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 'dispatcher-lvl':
+ diff = (a.onlineInfo?.dispatcherExp || 0) - (b.onlineInfo?.dispatcherExp || 0);
+ break;
+
+ case 'user':
+ diff =
+ (b.onlineInfo ? b.onlineInfo.currentUsers : -1) -
+ (a.onlineInfo ? a.onlineInfo.currentUsers : -1);
+ break;
+
+ case 'spawn':
+ diff =
+ (a.onlineInfo ? a.onlineInfo.spawns.length : -1) -
+ (b.onlineInfo ? b.onlineInfo.spawns.length : -1);
+ break;
+
+ case 'timetableConfirmed':
+ diff =
+ (a.onlineInfo?.scheduledTrains
+ ? a.onlineInfo.scheduledTrains.filter((train) => train.stopInfo.confirmed).length
+ : -1) -
+ (b.onlineInfo?.scheduledTrains
+ ? b.onlineInfo.scheduledTrains.filter((train) => train.stopInfo.confirmed).length
+ : -1);
+ break;
+
+ case 'timetableUnconfirmed':
+ diff =
+ (a.onlineInfo?.scheduledTrains
+ ? a.onlineInfo.scheduledTrains.filter((train) => !train.stopInfo.confirmed).length
+ : -1) -
+ (b.onlineInfo?.scheduledTrains
+ ? b.onlineInfo.scheduledTrains.filter((train) => !train.stopInfo.confirmed).length
+ : -1);
+ break;
+
+ case 'timetableAll':
+ diff =
+ (a.onlineInfo?.scheduledTrains ? a.onlineInfo.scheduledTrains.length : -1) -
+ (b.onlineInfo?.scheduledTrains ? b.onlineInfo.scheduledTrains.length : -1);
+ break;
+
+ default:
+ break;
+ }
+
+ if (diff != 0) return Math.sign(diff) * sorter.dir;
+ return a.name.localeCompare(b.name);
+};
+
+export const filterStations = (station: Station, filters: Filter) => {
+ if (!station.onlineInfo && filters['free']) return false;
+
+ if (station.onlineInfo) {
+ const { statusID, statusTimestamp } = station.onlineInfo;
+
+ const isEnding = statusID == DispatcherStatusID.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'];
+
+ 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 (isEnding || isOnlineInBounds || isNotSigned || isAFK || isNoSpace || isOccupied)
+ return false;
+ }
+
+ if (
+ (station.generalInfo?.availability == 'nonPublic' || !station.generalInfo) &&
+ filters['nonPublic']
+ )
+ return false;
+
+ if (station.generalInfo) {
+ const { routes, availability, controlType, lines, reqLevel, signalType, SUP, authors } =
+ station.generalInfo;
+
+ 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['notDefault'] &&
+ !(availability == 'abandoned' || availability == 'unavailable')
+ )
+ return false;
+
+ if (filters['real'] && lines) return false;
+ if (filters['fictional'] && !lines) return false;
+
+ 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 false;
+
+ if (
+ filters['no-2track'] &&
+ (routes.twoWayCatenaryRouteNames.length != 0 || routes.twoWayNoCatenaryRouteNames.length != 0)
+ )
+ return false;
+
+ if (routes.oneWayCatenaryRouteNames.length < filters['minOneWayCatenary']) return false;
+ if (routes.oneWayNoCatenaryRouteNames.length < filters['minOneWay']) return false;
+
+ if (routes.twoWayCatenaryRouteNames.length < filters['minTwoWayCatenary']) return false;
+ if (routes.twoWayNoCatenaryRouteNames.length < filters['minTwoWay']) return false;
+
+ if (filters[controlType]) return false;
+ if (filters[signalType]) return false;
+
+ if (filters['SUP'] && SUP) return false;
+ if (filters['noSUP'] && !SUP) return false;
+
+ if (filters['SBL'] && routes.sblRouteNames.length > 0) return false;
+ if (filters['PBL'] && routes.sblRouteNames.length == 0) return false;
+
+ if (
+ filters['authors'].length > 3 &&
+ !authors?.map((a) => a.toLocaleLowerCase()).includes(filters['authors'].toLocaleLowerCase())
+ )
+ return false;
+ }
+
+ return true;
+};
diff --git a/src/scripts/utils/storeUtils.ts b/src/scripts/utils/storeUtils.ts
index 4dea77e..38520f7 100644
--- a/src/scripts/utils/storeUtils.ts
+++ b/src/scripts/utils/storeUtils.ts
@@ -1,197 +1,332 @@
-import { ScheduledTrain, StopStatus } from '../interfaces/ScheduledTrain';
-import Train from '../interfaces/Train';
-import TrainStop from '../interfaces/TrainStop';
-
-export const getLocoURL = (locoType: string): string => `https://rj.td2.info.pl/dist/img/thumbnails/${locoType.includes('EN') ? locoType + 'rb' : locoType}.png`;
-
-export const getStatusID = (stationStatus: any): string => {
- if (!stationStatus) return 'unknown';
- if (stationStatus == -1) return 'not-signed';
-
- const statusCode = stationStatus[2];
- const statusTimestamp = stationStatus[3];
-
- switch (statusCode) {
- case 0:
- if (statusTimestamp - Date.now() > 21000000) return 'no-limit';
-
- return 'online';
-
- case 1:
- return 'brb';
-
- case 2:
- if (statusTimestamp == 0) return 'ending';
- break;
-
- case 3:
- return 'no-space';
-
- default:
- break;
- }
-
- return 'unavailable';
-};
-
-export const getStatusTimestamp = (stationStatus: any): number => {
- if (!stationStatus) return -2;
-
- const statusCode = stationStatus[2];
- const statusTimestamp = stationStatus[3];
-
- switch (statusCode) {
- case 0:
- case 1:
- case 3:
- return statusTimestamp;
-
- case 2:
- if (statusTimestamp == 0) return 0;
- break;
-
- default:
- break;
- }
-
- return -1;
-};
-
-export const parseSpawns = (spawnString: string | null) => {
- if (!spawnString) return [];
- if (spawnString === 'NO_SPAWN') return [];
-
- return spawnString.split(';').map((spawn) => {
- const spawnArray = spawn.split(',');
- const spawnName = spawnArray[6] ? spawnArray[6] : spawnArray[0];
- const spawnLength = parseInt(spawnArray[2]);
- const isElectrified = spawnArray[3] == 'True';
-
- return { spawnName, spawnLength, isElectrified };
- });
-};
-
-export const getTimestamp = (date: string | null): number => (date ? new Date(date).getTime() : 0);
-
-export const getTrainStopStatus = (stopInfo: TrainStop, currentStationName: string, stationName: string) => {
- let stopStatus = StopStatus['arriving'],
- stopLabel = '',
- stopStatusID = -1;
-
- if (stopInfo.terminatesHere && stopInfo.confirmed) {
- stopStatus = StopStatus['terminated'];
- stopLabel = 'Skończył bieg';
- stopStatusID = 5;
- } else if (!stopInfo.terminatesHere && stopInfo.confirmed && currentStationName == stationName) {
- stopStatus = StopStatus['departed'];
- stopLabel = 'Odprawiony';
- stopStatusID = 2;
- } else if (!stopInfo.terminatesHere && stopInfo.confirmed && currentStationName != stationName) {
- stopStatus = StopStatus['departed-away'];
- stopLabel = 'Odjechał';
- stopStatusID = 4;
- } else if (currentStationName == stationName && !stopInfo.stopped) {
- stopStatus = StopStatus['online'];
- stopLabel = 'Na stacji';
- stopStatusID = 0;
- } else if (currentStationName == stationName && stopInfo.stopped) {
- stopStatus = StopStatus['stopped'];
- stopLabel = 'Postój';
- stopStatusID = 1;
- } else if (currentStationName != stationName) {
- stopStatus = StopStatus['arriving'];
- stopLabel = 'W drodze';
- stopStatusID = 3;
- }
-
- return { stopStatus, stopLabel, stopStatusID };
-};
-
-export function getScheduledTrain(train: Train, trainStopIndex: number, stationName: string): ScheduledTrain {
- const timetable = train.timetableData!;
- const followingStops = timetable.followingStops;
- const trainStop = followingStops[trainStopIndex];
-
- const trainStopStatus = getTrainStopStatus(trainStop, train.currentStationName, stationName);
-
- let prevStationName = '',
- nextStationName = '';
-
- let prevDepartureLine: string | null = null,
- nextArrivalLine: string | null = null;
-
- for (let i = trainStopIndex - 1; i >= 0; i--) {
- if (/strong|podg/g.test(followingStops[i].stopName)) {
- prevStationName = followingStops[i].stopNameRAW.replace(/,.*/g, '');
-
- break;
- }
- }
-
- for (let i = trainStopIndex + 1; i < followingStops.length; i++) {
- if (/strong|podg/g.test(followingStops[i].stopName)) {
- nextStationName = followingStops[i].stopNameRAW.replace(/,.*/g, '');
-
- break;
- }
- }
-
- let departureLine: string | null = null;
- let arrivingLine: string | null = null;
-
- for (let i = trainStopIndex; i < followingStops.length; i++) {
- const currentStop = followingStops[i];
-
- if (currentStop.departureLine == null) continue;
-
- if (!/-|_|it|sbl/gi.test(currentStop.departureLine)) {
- departureLine = currentStop.departureLine;
- nextArrivalLine = followingStops[i + 1]?.arrivalLine || null;
-
- break;
- }
- }
-
- for (let i = trainStopIndex; i >= 0; i--) {
- const currentStop = followingStops[i];
-
- if (currentStop.arrivalLine == null) continue;
-
- if (!/-|_|it|sbl/gi.test(currentStop.arrivalLine)) {
- arrivingLine = currentStop.arrivalLine;
- prevDepartureLine = followingStops[i - 1]?.departureLine || null;
-
- break;
- }
- }
-
- return {
- trainNo: train.trainNo,
- trainId: train.trainId,
-
- signal: train.signal,
- connectedTrack: train.connectedTrack,
-
- driverName: train.driverName,
- driverId: train.driverId,
- currentStationName: train.currentStationName,
- currentStationHash: train.currentStationHash,
- category: timetable.category,
- beginsAt: timetable.followingStops[0].stopNameRAW,
- terminatesAt: timetable.followingStops[timetable.followingStops.length - 1].stopNameRAW,
-
- nextStationName,
- prevStationName,
-
- stopInfo: trainStop,
- stopLabel: trainStopStatus.stopLabel,
- stopStatus: trainStopStatus.stopStatus,
- stopStatusID: trainStopStatus.stopStatusID,
-
- arrivingLine,
- departureLine,
-
- nextArrivalLine,
- prevDepartureLine,
- };
-}
+import { DispatcherStatusID } from '../enums/DispatcherStatus';
+import { ScheduledTrain, StopStatus } from '../interfaces/ScheduledTrain';
+import Station from '../interfaces/Station';
+import Train from '../interfaces/Train';
+import TrainStop from '../interfaces/TrainStop';
+import StationAPIData from '../interfaces/api/StationAPIData';
+import { StationTrain, StoreState } from '../interfaces/store/storeTypes';
+
+export const getLocoURL = (locoType: string): string =>
+ `https://rj.td2.info.pl/dist/img/thumbnails/${
+ locoType.includes('EN') ? locoType + 'rb' : locoType
+ }.png`;
+
+export const getStatusID = (
+ stationStatus: any[] | undefined,
+ isSWDROnline: boolean
+): DispatcherStatusID => {
+ if (isSWDROnline && !stationStatus) return DispatcherStatusID.Unauthorized;
+ if (!stationStatus) return DispatcherStatusID.Unknown;
+
+ // if (stationStatus == -1) return DispatcherStatusID.Unauthorized;
+
+ const statusCode = stationStatus[2];
+ const statusTimestamp = stationStatus[3];
+
+ switch (statusCode) {
+ case 0:
+ if (statusTimestamp - Date.now() > 21000000) return DispatcherStatusID.OnlineNoLimit;
+
+ return DispatcherStatusID.OnlineWithHours;
+
+ case 1:
+ return DispatcherStatusID.Afk;
+
+ case 2:
+ if (statusTimestamp == 0) return DispatcherStatusID.Ending;
+ break;
+
+ case 3:
+ return DispatcherStatusID.NoSpace;
+
+ default:
+ break;
+ }
+
+ return DispatcherStatusID.Unavailable;
+};
+
+export const getStatusTimestamp = (stationStatus: any): number => {
+ if (!stationStatus) return -2;
+
+ const statusCode = stationStatus[2];
+ const statusTimestamp = stationStatus[3];
+
+ switch (statusCode) {
+ case 0:
+ case 1:
+ case 3:
+ return statusTimestamp;
+
+ case 2:
+ if (statusTimestamp == 0) return 0;
+ break;
+
+ default:
+ break;
+ }
+
+ return -1;
+};
+
+export const parseSpawns = (spawnString: string | null) => {
+ if (!spawnString) return [];
+ if (spawnString === 'NO_SPAWN') return [];
+
+ return spawnString.split(';').map((spawn) => {
+ const spawnArray = spawn.split(',');
+ const spawnName = spawnArray[6] ? spawnArray[6] : spawnArray[0];
+ const spawnLength = parseInt(spawnArray[2]);
+ const isElectrified = spawnArray[3] == 'True';
+
+ return { spawnName, spawnLength, isElectrified };
+ });
+};
+
+export const getTimestamp = (date: string | null): number => (date ? new Date(date).getTime() : 0);
+
+export const getTrainStopStatus = (
+ stopInfo: TrainStop,
+ currentStationName: string,
+ sceneryName: string
+) => {
+ let stopStatus = StopStatus['arriving'],
+ stopLabel = '',
+ stopStatusID = -1;
+
+ if (stopInfo.terminatesHere && stopInfo.confirmed) {
+ stopStatus = StopStatus['terminated'];
+ stopLabel = 'Skończył bieg';
+ stopStatusID = 5;
+ } else if (!stopInfo.terminatesHere && stopInfo.confirmed && currentStationName == sceneryName) {
+ stopStatus = StopStatus['departed'];
+ stopLabel = 'Odprawiony';
+ stopStatusID = 2;
+ } else if (!stopInfo.terminatesHere && stopInfo.confirmed && currentStationName != sceneryName) {
+ stopStatus = StopStatus['departed-away'];
+ stopLabel = 'Odjechał';
+ stopStatusID = 4;
+ } else if (currentStationName == sceneryName && !stopInfo.stopped) {
+ stopStatus = StopStatus['online'];
+ stopLabel = 'Na stacji';
+ stopStatusID = 0;
+ } else if (currentStationName == sceneryName && stopInfo.stopped) {
+ stopStatus = StopStatus['stopped'];
+ stopLabel = 'Postój';
+ stopStatusID = 1;
+ } else if (currentStationName != sceneryName) {
+ stopStatus = StopStatus['arriving'];
+ stopLabel = 'W drodze';
+ stopStatusID = 3;
+ }
+
+ return { stopStatus, stopLabel, stopStatusID };
+};
+
+export function getCheckpointTrain(
+ train: Train,
+ trainStopIndex: number,
+ sceneryName: string
+): ScheduledTrain {
+ const timetable = train.timetableData!;
+ const followingStops = timetable.followingStops;
+ const trainStop = followingStops[trainStopIndex];
+
+ const trainStopStatus = getTrainStopStatus(trainStop, train.currentStationName, sceneryName);
+
+ let prevStationName = '',
+ nextStationName = '';
+
+ let prevDepartureLine: string | null = null,
+ nextArrivalLine: string | null = null;
+
+ for (let i = trainStopIndex - 1; i >= 0; i--) {
+ if (/strong|podg/g.test(followingStops[i].stopName)) {
+ prevStationName = followingStops[i].stopNameRAW.replace(/,.*/g, '');
+
+ break;
+ }
+ }
+
+ for (let i = trainStopIndex + 1; i < followingStops.length; i++) {
+ if (/strong|podg/g.test(followingStops[i].stopName)) {
+ nextStationName = followingStops[i].stopNameRAW.replace(/,.*/g, '');
+
+ break;
+ }
+ }
+
+ let departureLine: string | null = null;
+ let arrivingLine: string | null = null;
+
+ for (let i = trainStopIndex; i < followingStops.length; i++) {
+ const currentStop = followingStops[i];
+
+ if (currentStop.departureLine == null) continue;
+
+ if (!/-|_|it|sbl/gi.test(currentStop.departureLine)) {
+ departureLine = currentStop.departureLine;
+ nextArrivalLine = followingStops[i + 1]?.arrivalLine || null;
+
+ break;
+ }
+ }
+
+ for (let i = trainStopIndex; i >= 0; i--) {
+ const currentStop = followingStops[i];
+
+ if (currentStop.arrivalLine == null) continue;
+
+ if (!/-|_|it|sbl/gi.test(currentStop.arrivalLine)) {
+ arrivingLine = currentStop.arrivalLine;
+ prevDepartureLine = followingStops[i - 1]?.departureLine || null;
+
+ break;
+ }
+ }
+
+ return {
+ checkpointName: trainStop.stopNameRAW,
+
+ trainNo: train.trainNo,
+ trainId: train.trainId,
+
+ signal: train.signal,
+ connectedTrack: train.connectedTrack,
+
+ driverName: train.driverName,
+ driverId: train.driverId,
+ currentStationName: train.currentStationName,
+ currentStationHash: train.currentStationHash,
+ category: timetable.category,
+ beginsAt: timetable.followingStops[0].stopNameRAW,
+ terminatesAt: timetable.followingStops[timetable.followingStops.length - 1].stopNameRAW,
+
+ nextStationName,
+ prevStationName,
+
+ stopInfo: trainStop,
+ stopLabel: trainStopStatus.stopLabel,
+ stopStatus: trainStopStatus.stopStatus,
+ stopStatusID: trainStopStatus.stopStatusID,
+
+ arrivingLine,
+ departureLine,
+
+ nextArrivalLine,
+ prevDepartureLine
+ };
+}
+
+export function getDispatcherStatus(state: StoreState, onlineStationData: StationAPIData) {
+ const { dispatchers } = state.apiData;
+
+ const prevDispatcherStatus = state.lastDispatcherStatuses.find(
+ (dispatcher) => dispatcher.hash === onlineStationData.stationHash
+ );
+
+ const stationStatus = dispatchers?.find(
+ (status: string[]) => status[0] == onlineStationData.stationHash && status[1] == state.region.id
+ );
+
+ const statusTimestamp =
+ prevDispatcherStatus && !dispatchers
+ ? prevDispatcherStatus.statusTimestamp
+ : getStatusTimestamp(stationStatus);
+
+ const statusID =
+ prevDispatcherStatus && !dispatchers
+ ? prevDispatcherStatus.statusID
+ : getStatusID(stationStatus, onlineStationData.isOnline === 1);
+
+ return {
+ hash: onlineStationData.stationHash,
+ statusID,
+ statusTimestamp
+ };
+}
+
+export function getScheduledTrains(
+ trainList: Train[],
+ stationAPIData: StationAPIData,
+ stationGeneralInfo: Station['generalInfo']
+): ScheduledTrain[] {
+ const stationName = stationAPIData.stationName.toLocaleLowerCase();
+
+ stationGeneralInfo?.checkpoints.forEach((cp) => (cp.scheduledTrains.length = 0));
+
+ return trainList.reduce((acc: ScheduledTrain[], train) => {
+ if (!train.timetableData) return acc;
+
+ const timetable = train.timetableData;
+ if (!timetable.sceneries.includes(stationAPIData.stationHash)) return acc;
+
+ const stopInfoIndex = timetable.followingStops.findIndex((stop) => {
+ const stopName = stop.stopNameRAW.toLowerCase();
+
+ return (
+ stationName == stopName ||
+ (!/(po\.|podg\.)/.test(stopName) && stopName.includes(stationName)) ||
+ (!/(po\.|podg\.)/.test(stationName) && stationName.includes(stopName)) ||
+ (stopName.split(', podg.')[0] !== undefined &&
+ stationName.startsWith(stopName.split(', podg.')[0]))
+ );
+ });
+
+ const checkpointScheduledTrains: ScheduledTrain[] = [];
+
+ if (stopInfoIndex != -1) {
+ checkpointScheduledTrains.push(
+ getCheckpointTrain(train, stopInfoIndex, stationAPIData.stationName)
+ );
+ }
+
+ stationGeneralInfo?.checkpoints?.forEach((checkpoint) => {
+ if (checkpoint.checkpointName.toLocaleLowerCase() == stationName) return;
+
+ if (
+ checkpointScheduledTrains.findIndex(
+ (cpTrain) =>
+ cpTrain.checkpointName.toLocaleLowerCase() ==
+ checkpoint.checkpointName.toLocaleLowerCase()
+ ) != -1
+ )
+ return;
+
+ const index = timetable.followingStops.findIndex(
+ (stop) => stop.stopNameRAW.toLowerCase() == checkpoint.checkpointName.toLowerCase()
+ );
+
+ if (index > -1)
+ checkpointScheduledTrains.push(
+ getCheckpointTrain(train, index, stationAPIData.stationName)
+ );
+ });
+
+ acc.push(...checkpointScheduledTrains);
+ return acc;
+ }, []) as ScheduledTrain[];
+}
+
+export function getStationTrains(
+ trainList: Train[],
+ scheduledTrainList: ScheduledTrain[],
+ region: string,
+ apiStation: StationAPIData
+): StationTrain[] {
+ return trainList
+ .filter(
+ (train) =>
+ train?.region === region &&
+ train.online &&
+ train.currentStationName === apiStation.stationName
+ )
+ .map((train) => ({
+ driverName: train.driverName,
+ driverId: train.driverId,
+ trainNo: train.trainNo,
+ trainId: train.trainId,
+ stopStatus:
+ scheduledTrainList.find((st) => st.trainNo === train.trainNo)?.stopStatus || 'no-timetable'
+ }));
+}
diff --git a/src/store/stationFiltersStore.ts b/src/store/stationFiltersStore.ts
index d1a9bf4..e778449 100644
--- a/src/store/stationFiltersStore.ts
+++ b/src/store/stationFiltersStore.ts
@@ -1,116 +1,93 @@
-import { defineStore } from 'pinia';
-import inputData from '../data/options.json';
-import Station from '../scripts/interfaces/Station';
-import StorageManager from '../scripts/managers/storageManager';
-import { useStore } from './store';
-import { filterInitStates } from '../scripts/constants/stores/initFilterStates';
-import { filterStations, sortStations } from '../scripts/utils/filterUtils';
-import { HeadIdsTypes } from '../scripts/data/stationHeaderNames';
-
-export const useStationFiltersStore = defineStore('stationFiltersStore', {
- state() {
- return {
- inputs: inputData,
- filters: { ...filterInitStates },
- sorterActive: { headerName: 'station' as HeadIdsTypes, dir: 1 },
- store: useStore(),
- lastClickedFilterId: '',
- };
- },
-
- getters: {
- areFiltersAtDefault(state) {
- return Object.keys(state.filters).every((f) => state.filters[f] === filterInitStates[f]);
- },
- },
-
- actions: {
- getFilteredStationList(stationList: Station[], region: string): Station[] {
- return stationList
- .map((station) => {
- if (station.onlineInfo && station.onlineInfo.region != region) {
- delete station.onlineInfo;
- }
-
- return station;
- })
- .filter((station) => filterStations(station, this.filters))
- .sort((a, b) => sortStations(a, b, this.sorterActive));
- },
-
- setupFilters() {
- if (!StorageManager.isRegistered('options_saved')) return;
-
- this.inputs.options.forEach((option) => {
- if (!StorageManager.isRegistered(option.name)) return;
- const savedValue = StorageManager.getBooleanValue(option.name);
-
- this.filters[option.name] = savedValue;
- option.value = !savedValue;
- });
-
- this.inputs.sliders.forEach((slider) => {
- if (!StorageManager.isRegistered(slider.name)) return;
- const savedValue = StorageManager.getNumericValue(slider.name);
-
- this.filters[slider.name] = savedValue;
- slider.value = savedValue;
- });
- },
-
- // Quick actions (TODO)
- handleQuickAction(actionName: string) {
- // switch (actionName) {
- // case 'all-available':
- // this.resetFilters();
- // this.inputs.options
- // .filter((option) => /^(free|non-public)/.test(option.id))
- // .forEach((option) => (option.value = !option.defaultValue));
- // break;
- // case 'all-free':
- // this.resetFilters();
- // this.inputs.options
- // .filter((option) => /^(free|occupied)/.test(option.id))
- // .forEach((option) => (option.value = !option.defaultValue));
- // break;
- // default:
- // break;
- // }
- },
-
- changeFilterValue(name: string, value: any) {
- this.filters[name] = value;
- if (StorageManager.isRegistered('options_saved')) StorageManager.setValue(name, value);
- },
-
- resetFilters() {
- this.filters = { ...filterInitStates };
-
- this.inputs.options.forEach((option) => {
- option.value = option.defaultValue;
- StorageManager.setBooleanValue(option.name, !option.defaultValue);
- });
-
- this.inputs.sliders.forEach((slider) => {
- slider.value = slider.defaultValue;
- StorageManager.setNumericValue(slider.name, slider.defaultValue);
- });
- },
-
- resetSectionOptions(section: string) {
- this.inputs.options
- .filter((option) => option.section == section)
- .forEach((option) => {
- option.value = option.defaultValue;
- StorageManager.setBooleanValue(option.name, !option.defaultValue);
- });
- },
-
- changeSorter(headerName: HeadIdsTypes) {
- if (headerName == this.sorterActive.headerName) this.sorterActive.dir = -1 * this.sorterActive.dir;
- else this.sorterActive.dir = 1;
-
- this.sorterActive.headerName = headerName;
- },
- },
-});
+import { defineStore } from 'pinia';
+import inputData from '../data/options.json';
+import StorageManager from '../scripts/managers/storageManager';
+import { useStore } from './store';
+import { filterInitStates } from '../scripts/constants/stores/initFilterStates';
+import { filterStations, sortStations } from '../scripts/utils/filterUtils';
+import { HeadIdsTypes } from '../scripts/data/stationHeaderNames';
+
+export const useStationFiltersStore = defineStore('stationFiltersStore', {
+ state() {
+ return {
+ inputs: inputData,
+ filters: { ...filterInitStates },
+ sorterActive: { headerName: 'station' as HeadIdsTypes, dir: 1 },
+ lastClickedFilterId: ''
+ };
+ },
+
+ getters: {
+ areFiltersAtDefault: (state) => {
+ return Object.keys(state.filters).every((f) => state.filters[f] === filterInitStates[f]);
+ },
+
+ filteredStationList: (state) => {
+ const store = useStore();
+ return store.stationList
+ .map((station) => ({
+ ...station,
+ onlineInfo: store.onlineSceneryList.find((os) => os.name == station.name)
+ }))
+ .filter((station) => filterStations(station, state.filters))
+ .sort((a, b) => sortStations(a, b, state.sorterActive));
+ }
+ },
+
+ actions: {
+ setupFilters() {
+ if (!StorageManager.isRegistered('options_saved')) return;
+
+ this.inputs.options.forEach((option) => {
+ if (!StorageManager.isRegistered(option.name)) return;
+ const savedValue = StorageManager.getBooleanValue(option.name);
+
+ this.filters[option.name] = savedValue;
+ option.value = !savedValue;
+ });
+
+ this.inputs.sliders.forEach((slider) => {
+ if (!StorageManager.isRegistered(slider.name)) return;
+ const savedValue = StorageManager.getNumericValue(slider.name);
+
+ this.filters[slider.name] = savedValue;
+ slider.value = savedValue;
+ });
+ },
+
+ changeFilterValue(name: string, value: any) {
+ this.filters[name] = value;
+ if (StorageManager.isRegistered('options_saved')) StorageManager.setValue(name, value);
+ },
+
+ resetFilters() {
+ this.filters = { ...filterInitStates };
+
+ this.inputs.options.forEach((option) => {
+ option.value = option.defaultValue;
+ StorageManager.setBooleanValue(option.name, !option.defaultValue);
+ });
+
+ this.inputs.sliders.forEach((slider) => {
+ slider.value = slider.defaultValue;
+ StorageManager.setNumericValue(slider.name, slider.defaultValue);
+ });
+ },
+
+ resetSectionOptions(section: string) {
+ this.inputs.options
+ .filter((option) => option.section == section)
+ .forEach((option) => {
+ option.value = option.defaultValue;
+ StorageManager.setBooleanValue(option.name, !option.defaultValue);
+ });
+ },
+
+ changeSorter(headerName: HeadIdsTypes) {
+ if (headerName == this.sorterActive.headerName)
+ this.sorterActive.dir = -1 * this.sorterActive.dir;
+ else this.sorterActive.dir = 1;
+
+ this.sorterActive.headerName = headerName;
+ }
+ }
+});
diff --git a/src/store/store.ts b/src/store/store.ts
index a67375b..cb5434f 100644
--- a/src/store/store.ts
+++ b/src/store/store.ts
@@ -1,392 +1,339 @@
-import axios from 'axios';
-import { defineStore } from 'pinia';
-import { io } from 'socket.io-client';
-import { DataStatus } from '../scripts/enums/DataStatus';
-import StationAPIData from '../scripts/interfaces/api/StationAPIData';
-import { ScheduledTrain } from '../scripts/interfaces/ScheduledTrain';
-import Station from '../scripts/interfaces/Station';
-import StationRoutes from '../scripts/interfaces/StationRoutes';
-import Train from '../scripts/interfaces/Train';
-import { URLs } from '../scripts/utils/apiURLs';
-import { getStatusTimestamp, getStatusID, getScheduledTrain, parseSpawns } from '../scripts/utils/storeUtils';
-import { APIData, StationJSONData, StoreState } from '../scripts/interfaces/store/storeTypes';
-import packageInfo from '../../package.json';
-import { RollingStockInfo, RollingStockGithubData } from '../scripts/interfaces/github_api/StockInfoGithubData';
-
-export const useStore = defineStore('store', {
- state: () =>
- ({
- apiData: {} as unknown,
- rollingStockData: undefined,
-
- stationList: [],
- trainList: [],
- routesList: [],
-
- sceneryData: [],
- lastDispatcherStatuses: [],
-
- region: { id: 'eu', value: 'PL1' },
-
- trainCount: 0,
- stationCount: 0,
-
- webSocket: undefined,
- isOffline: false,
-
- dispatcherStatsName: '',
- dispatcherStatsData: undefined,
-
- driverStatsName: '',
- driverStatsData: undefined,
- driverStatsStatus: DataStatus.Initialized,
-
- chosenModalTrainId: undefined,
-
- dataStatuses: {
- connection: DataStatus.Loading,
- sceneries: DataStatus.Loading,
- timetables: DataStatus.Loading,
- dispatchers: DataStatus.Loading,
- trains: DataStatus.Loading,
- },
-
- currentStatsTab: null,
-
- blockScroll: false,
- listenerLaunched: false,
- modalLastClickedTarget: null,
- } as StoreState),
-
- actions: {
- setTrainsOnlineData() {
- const { trains } = this.apiData;
-
- if (!trains) return [];
-
- this.trainList = trains
- .filter((train) => train.region === this.region.id && (train.online || train.timetable || train.lastSeen > Date.now() - 180000))
- .map((train) => {
- const stock = train.stockString.split(';');
- const locoType = stock ? stock[0] : train.stockString;
-
- const timetable = train.timetable;
-
- return {
- trainId: train.driverName + train.trainNo.toString(),
-
- trainNo: train.trainNo,
- mass: train.mass,
- length: train.length,
- speed: train.speed,
- region: train.region,
-
- distance: train.distance,
- signal: train.signal,
- online: train.online,
- driverId: train.driverId,
- driverName: train.driverName,
- currentStationName: train.currentStationName,
- currentStationHash: train.currentStationHash,
- connectedTrack: train.connectedTrack,
- stockList: stock,
- locoType,
-
- lastSeen: train.lastSeen,
- isTimeout: train.isTimeout,
-
- isSupporter: train.driverIsSupporter,
- driverLevel: train.driverLevel,
-
- timetableData: timetable
- ? {
- timetableId: timetable.timetableId,
- SKR: timetable.SKR,
- TWR: timetable.TWR,
- route: timetable.route,
- category: timetable.category,
- followingStops: timetable.stopList,
- routeDistance: timetable.stopList[timetable.stopList.length - 1].stopDistance,
- sceneries: timetable.sceneries,
- }
- : undefined,
- } as Train;
- });
- },
-
- getDispatcherStatus(onlineStationData: StationAPIData) {
- const { dispatchers } = this.apiData;
-
- const prevDispatcherStatus = this.lastDispatcherStatuses.find((dispatcher) => dispatcher.hash === onlineStationData.stationHash);
-
- const stationStatus = !dispatchers ? undefined : dispatchers.find((status: string[]) => status[0] == onlineStationData.stationHash && status[1] == this.region.id) || -1;
-
- const statusTimestamp = prevDispatcherStatus && !dispatchers ? prevDispatcherStatus.statusTimestamp : getStatusTimestamp(stationStatus);
- const statusID = prevDispatcherStatus && !dispatchers ? prevDispatcherStatus.statusID : getStatusID(stationStatus);
-
- return {
- hash: onlineStationData.stationHash,
- statusID,
- statusTimestamp,
- };
- },
-
- getScheduledTrains(stationGeneralInfo: Station['generalInfo'], stationAPIData: StationAPIData) {
- const stationName = stationAPIData.stationName.toLowerCase();
-
- stationGeneralInfo?.checkpoints.forEach((cp) => (cp.scheduledTrains.length = 0));
-
- return this.trainList.reduce((acc: ScheduledTrain[], train) => {
- if (!train.timetableData) return acc;
-
- const timetable = train.timetableData;
- if (!timetable.sceneries.includes(stationAPIData.stationHash)) return acc;
-
- const stopInfoIndex = timetable.followingStops.findIndex((stop) => {
- const stopName = stop.stopNameRAW.toLowerCase();
-
- if (stationName === stopName) return true;
- if (stopName.includes(stationName) && !stop.stopName.includes('po.') && !stop.stopName.includes('podg.')) return true;
-
- if (stationName.includes(stopName) && !stop.stopName.includes('po.') && !stop.stopName.includes('podg.')) return true;
-
- if (stopName.includes('podg.') && stopName.split(', podg.')[0] && stationName.includes(stopName.split(', podg.')[0])) return true;
-
- if (
- stationGeneralInfo &&
- stationGeneralInfo.checkpoints &&
- stationGeneralInfo.checkpoints.length > 0 &&
- stationGeneralInfo.checkpoints.some((cp) => cp.checkpointName.toLowerCase().includes(stop.stopNameRAW.toLowerCase()))
- )
- return true;
-
- return false;
- });
-
- if (stopInfoIndex == -1) return acc;
-
- const scheduledStopTrain = getScheduledTrain(train, stopInfoIndex, stationAPIData.stationName);
-
- if (stationGeneralInfo?.checkpoints) {
- for (const checkpoint of stationGeneralInfo.checkpoints) {
- const index = timetable.followingStops.findIndex((stop) => stop.stopNameRAW.toLowerCase() == checkpoint.checkpointName.toLowerCase());
-
- if (index == -1) continue;
-
- const scheduledCheckpointTrain = getScheduledTrain(train, index, stationAPIData.stationName);
- checkpoint.scheduledTrains.push(scheduledCheckpointTrain);
- }
- }
-
- acc.push(scheduledStopTrain);
- return acc;
- }, []) as ScheduledTrain[];
- },
-
- getStationTrains(stationAPIData: StationAPIData) {
- return this.trainList
- .filter((train) => train?.region === this.region.id && train.online && train.currentStationName === stationAPIData.stationName)
- .map((train) => ({
- driverName: train.driverName,
- driverId: train.driverId,
- trainNo: train.trainNo,
- trainId: train.trainId,
- }));
- },
-
- setStationsOnlineInfo() {
- const onlineStationNames: string[] = [];
- const prevDispatcherStatuses: StoreState['lastDispatcherStatuses'] = [];
-
- if (this.isOffline) {
- this.stationList.forEach((station) => {
- station.onlineInfo = undefined;
- });
-
- return;
- }
-
- this.apiData.stations?.forEach((stationAPIData) => {
- if (stationAPIData.region !== this.region.id || !stationAPIData.isOnline) return;
- const station = this.stationList.find((s) => s.name === stationAPIData.stationName);
-
- onlineStationNames.push(stationAPIData.stationName);
-
- const dispatcherStatus = this.getDispatcherStatus(stationAPIData);
- prevDispatcherStatuses.push(dispatcherStatus);
-
- const stationTrains = this.getStationTrains(stationAPIData);
- const scheduledTrains = this.getScheduledTrains(station?.generalInfo, stationAPIData);
-
- const onlineInfo = {
- name: stationAPIData.stationName,
- hash: stationAPIData.stationHash,
- region: stationAPIData.region,
- maxUsers: stationAPIData.maxUsers,
- currentUsers: stationAPIData.currentUsers,
- spawns: parseSpawns(stationAPIData.spawnString),
- dispatcherName: stationAPIData.dispatcherName,
- dispatcherRate: stationAPIData.dispatcherRate,
- dispatcherId: stationAPIData.dispatcherId,
- dispatcherExp: stationAPIData.dispatcherExp,
- dispatcherIsSupporter: stationAPIData.dispatcherIsSupporter,
- stationTrains,
- statusTimestamp: dispatcherStatus.statusTimestamp,
- statusID: dispatcherStatus.statusID,
- scheduledTrains,
- };
-
- if (!station) {
- this.stationList.push({
- name: stationAPIData.stationName,
- onlineInfo,
- });
-
- return;
- }
-
- station.onlineInfo = { ...onlineInfo };
-
- this.stationList
- .filter((station) => !onlineStationNames.includes(station.name) && station.onlineInfo)
- .forEach((offlineStation) => {
- offlineStation.onlineInfo = undefined;
- });
- });
-
- if (this.apiData.dispatchers != null) this.lastDispatcherStatuses = prevDispatcherStatuses;
- },
-
- async fetchStationsGeneralInfo() {
- const sceneryData: StationJSONData[] = await (await axios.get(`${URLs.stacjownikAPI}/api/getSceneries`)).data;
-
- if (!sceneryData) {
- this.dataStatuses.sceneries = DataStatus.Error;
- return;
- }
-
- this.stationList = sceneryData.map((scenery) => {
- return {
- name: scenery.name,
-
- generalInfo: {
- ...scenery,
- authors: scenery.authors?.split(',').map((a) => a.trim()),
- routes:
- scenery.routesInfo.reduce(
- (acc, route) => {
- const propName: keyof StationRoutes = `${route.routeTracks == 2 ? 'twoWay' : 'oneWay'}${route.isElectric ? '' : 'No'}CatenaryRouteNames`;
-
- acc[route.routeTracks == 2 ? 'twoWay' : 'oneWay'].push({
- name: route.routeName,
- SBL: route.isRouteSBL,
- TWB: false,
- catenary: route.isElectric,
- isInternal: route.isInternal,
- tracks: route.routeTracks,
- length: route.routeLength,
- speed: route.routeSpeed,
- });
-
- if (!route.isInternal) acc[propName].push(route.routeName);
-
- if (route.isRouteSBL) acc['sblRouteNames'].push(route.routeName);
-
- return acc;
- },
- {
- oneWay: [],
- twoWay: [],
- sblRouteNames: [],
- oneWayCatenaryRouteNames: [],
- oneWayNoCatenaryRouteNames: [],
- twoWayCatenaryRouteNames: [],
- twoWayNoCatenaryRouteNames: [],
- } as StationRoutes
- ) || {},
- checkpoints: scenery.checkpoints ? scenery.checkpoints.split(';').map((sub) => ({ checkpointName: sub, scheduledTrains: [] })) : [],
- },
- };
- });
- },
-
- async connectToWebsocket() {
- if (import.meta.env.VITE_APP_WS_DEV === '1') {
- const mockWebsocketData = await import('../data/mockWebsocketData.json');
- this.dataStatuses.connection = DataStatus.Loaded;
- this.apiData = mockWebsocketData as any;
- this.setOnlineData();
-
- console.warn('Stacjownik działa w trybie mockowania danych z WS');
-
- return;
- }
-
- const socket = io(URLs.stacjownikAPI, {
- // transports: ['websocket', 'polling'],
- rememberUpgrade: true,
- reconnection: true,
- extraHeaders: {
- version: packageInfo.version,
- },
- });
-
- socket.on('connect_error', (err) => {
- this.dataStatuses.connection = DataStatus.Error;
- });
-
- socket.on('UPDATE', (data: APIData) => {
- this.apiData = data;
- this.dataStatuses.connection = DataStatus.Loaded;
- this.setOnlineData();
- });
-
- socket.emit('FETCH_DATA', { version: packageInfo.version }, (data: APIData) => {
- this.dataStatuses.connection = DataStatus.Loaded;
-
- this.apiData = data;
- this.setOnlineData();
- });
-
- this.webSocket = socket;
- },
-
- async connectToAPI() {
- await this.fetchStationsGeneralInfo();
- await this.fetchStockInfoData();
-
- this.connectToWebsocket();
- },
-
- async changeRegion(region: StoreState['region']) {
- this.region = region;
-
- await this.setOnlineData();
- },
-
- async fetchStockInfoData() {
- try {
- this.rollingStockData = (await axios.get('https://raw.githubusercontent.com/Spythere/api/main/td2/data/stockInfo.json')).data;
- } catch (error) {
- console.error('Ups! Wystąpił błąd podczas pobierania informacji o taborze z API:', error);
- }
- },
-
- async setOnlineData() {
- if (!this.apiData.stations) {
- this.dataStatuses.sceneries = DataStatus.Error;
- this.dataStatuses.trains = DataStatus.Error;
- this.dataStatuses.dispatchers = DataStatus.Error;
-
- return;
- }
-
- this.dataStatuses.sceneries = DataStatus.Loaded;
- this.dataStatuses.trains = !this.apiData.trains ? DataStatus.Warning : DataStatus.Loaded;
- this.dataStatuses.dispatchers = !this.apiData.dispatchers ? DataStatus.Warning : DataStatus.Loaded;
-
- this.setTrainsOnlineData();
- this.setStationsOnlineInfo();
- },
- },
-});
+import axios from 'axios';
+import { defineStore } from 'pinia';
+import { io } from 'socket.io-client';
+import { DataStatus } from '../scripts/enums/DataStatus';
+import StationRoutes from '../scripts/interfaces/StationRoutes';
+import Train from '../scripts/interfaces/Train';
+import { URLs } from '../scripts/utils/apiURLs';
+import {
+ getDispatcherStatus,
+ parseSpawns,
+ getScheduledTrains,
+ getStationTrains
+} from '../scripts/utils/storeUtils';
+
+import {
+ APIData,
+ OnlineScenery,
+ StationJSONData,
+ StoreState
+} from '../scripts/interfaces/store/storeTypes';
+
+import packageInfo from '../../package.json';
+import { RollingStockGithubData } from '../scripts/interfaces/github_api/StockInfoGithubData';
+import { ScheduledTrain } from '../scripts/interfaces/ScheduledTrain';
+import { DispatcherStatusID } from '../scripts/enums/DispatcherStatus';
+
+export const useStore = defineStore('store', {
+ state: () =>
+ ({
+ apiData: {} as unknown,
+ rollingStockData: undefined,
+
+ stationList: [],
+
+ routesList: [],
+
+ sceneryData: [],
+ lastDispatcherStatuses: [],
+
+ region: { id: 'eu', value: 'PL1' },
+
+ trainCount: 0,
+ stationCount: 0,
+
+ webSocket: undefined,
+ isOffline: false,
+
+ dispatcherStatsName: '',
+ dispatcherStatsData: undefined,
+
+ driverStatsName: '',
+ driverStatsData: undefined,
+ driverStatsStatus: DataStatus.Initialized,
+
+ chosenModalTrainId: undefined,
+
+ dataStatuses: {
+ connection: DataStatus.Loading,
+ sceneries: DataStatus.Loading,
+ timetables: DataStatus.Loading,
+ dispatchers: DataStatus.Loading,
+ trains: DataStatus.Loading
+ },
+
+ currentStatsTab: null,
+
+ blockScroll: false,
+ listenerLaunched: false,
+ modalLastClickedTarget: null
+ }) as StoreState,
+
+ getters: {
+ trainList(): Train[] {
+ return (this.apiData?.trains ?? [])
+ .filter(
+ (train) =>
+ train.region === this.region.id &&
+ (train.online || train.timetable || train.lastSeen > Date.now() - 180000)
+ )
+ .map((train) => {
+ const stock = train.stockString.split(';');
+ const locoType = stock ? stock[0] : train.stockString;
+
+ const timetable = train.timetable;
+
+ return {
+ trainId: train.driverName + train.trainNo.toString(),
+
+ trainNo: train.trainNo,
+ mass: train.mass,
+ length: train.length,
+ speed: train.speed,
+ region: train.region,
+
+ distance: train.distance,
+ signal: train.signal,
+ online: train.online,
+ driverId: train.driverId,
+ driverName: train.driverName,
+ currentStationName: train.currentStationName,
+ currentStationHash: train.currentStationHash,
+ connectedTrack: train.connectedTrack,
+ stockList: stock,
+ locoType,
+
+ lastSeen: train.lastSeen,
+ isTimeout: train.isTimeout,
+
+ isSupporter: train.driverIsSupporter,
+ driverLevel: train.driverLevel,
+
+ timetableData: timetable
+ ? {
+ timetableId: timetable.timetableId,
+ SKR: timetable.SKR,
+ TWR: timetable.TWR,
+ route: timetable.route,
+ category: timetable.category,
+ followingStops: timetable.stopList,
+ routeDistance: timetable.stopList[timetable.stopList.length - 1].stopDistance,
+ sceneries: timetable.sceneries
+ }
+ : undefined
+ } as Train;
+ });
+ },
+
+ onlineSceneryList(state): OnlineScenery[] {
+ if (state.isOffline) return [];
+ if (!state.apiData?.stations) return [];
+
+ return (
+ state.apiData?.stations
+ // ?.filter((apiStation) => apiStation.region == state.region.id)
+ .reduce((list, apiStation) => {
+ if (apiStation.region != state.region.id) return list;
+
+ const dispatcherStatus = getDispatcherStatus(state as StoreState, apiStation);
+
+ if (dispatcherStatus.statusID == DispatcherStatusID.Unknown) return list;
+
+ const station = this.stationList.find((s) => s.name === apiStation.stationName);
+
+ const scheduledTrains = getScheduledTrains(
+ this.trainList,
+ apiStation,
+ station?.generalInfo
+ );
+
+ const stationTrains = getStationTrains(
+ this.trainList,
+ scheduledTrains,
+ this.region.id,
+ apiStation
+ );
+
+ // Remove checkpoint duplicates
+ const uniqueScheduledTrains = scheduledTrains.reduce(
+ (uniqueList, sTrain) =>
+ uniqueList.find((v) => v.trainId === sTrain.trainId)
+ ? uniqueList
+ : [...uniqueList, sTrain],
+ [] as ScheduledTrain[]
+ );
+
+ list.push({
+ name: apiStation.stationName,
+ hash: apiStation.stationHash,
+ region: apiStation.region,
+ maxUsers: apiStation.maxUsers,
+ currentUsers: apiStation.currentUsers,
+ spawns: parseSpawns(apiStation.spawnString),
+ dispatcherName: apiStation.dispatcherName,
+ dispatcherRate: apiStation.dispatcherRate,
+ dispatcherId: apiStation.dispatcherId,
+ dispatcherExp: apiStation.dispatcherExp,
+ dispatcherIsSupporter: apiStation.dispatcherIsSupporter,
+ scheduledTrains: scheduledTrains,
+ stationTrains: stationTrains,
+ statusTimestamp: dispatcherStatus.statusTimestamp,
+ statusID: dispatcherStatus.statusID,
+
+ isOnline: apiStation.isOnline == 1,
+
+ scheduledTrainCount: {
+ all: uniqueScheduledTrains.length,
+ confirmed: uniqueScheduledTrains.filter((train) => train.stopInfo.confirmed).length,
+ unconfirmed: uniqueScheduledTrains.filter((train) => !train.stopInfo.confirmed).length
+ }
+ });
+
+ return list;
+ }, [] as OnlineScenery[])
+ );
+ }
+ },
+ actions: {
+ async fetchStationsGeneralInfo() {
+ const sceneryData: StationJSONData[] = await (
+ await axios.get(`${URLs.stacjownikAPI}/api/getSceneries`)
+ ).data;
+
+ if (!sceneryData) {
+ this.dataStatuses.sceneries = DataStatus.Error;
+ return;
+ }
+
+ this.stationList = sceneryData.map((scenery) => {
+ return {
+ name: scenery.name,
+
+ generalInfo: {
+ ...scenery,
+ authors: scenery.authors?.split(',').map((a) => a.trim()),
+ routes:
+ scenery.routesInfo.reduce(
+ (acc, route) => {
+ const propName: keyof StationRoutes = `${
+ route.routeTracks == 2 ? 'twoWay' : 'oneWay'
+ }${route.isElectric ? '' : 'No'}CatenaryRouteNames`;
+
+ acc[route.routeTracks == 2 ? 'twoWay' : 'oneWay'].push({
+ name: route.routeName,
+ SBL: route.isRouteSBL,
+ TWB: false,
+ catenary: route.isElectric,
+ isInternal: route.isInternal,
+ tracks: route.routeTracks,
+ length: route.routeLength,
+ speed: route.routeSpeed
+ });
+
+ if (!route.isInternal) acc[propName].push(route.routeName);
+
+ if (route.isRouteSBL) acc['sblRouteNames'].push(route.routeName);
+
+ return acc;
+ },
+ {
+ oneWay: [],
+ twoWay: [],
+ sblRouteNames: [],
+ oneWayCatenaryRouteNames: [],
+ oneWayNoCatenaryRouteNames: [],
+ twoWayCatenaryRouteNames: [],
+ twoWayNoCatenaryRouteNames: []
+ } as StationRoutes
+ ) || {},
+ checkpoints: scenery.checkpoints
+ ? scenery.checkpoints
+ .split(';')
+ .map((sub) => ({ checkpointName: sub, scheduledTrains: [] }))
+ : []
+ }
+ };
+ });
+ },
+
+ async connectToWebsocket() {
+ if (import.meta.env.VITE_APP_WS_DEV === '1') {
+ const mockWebsocketData = await import('../data/mockWebsocketData.json');
+ this.dataStatuses.connection = DataStatus.Loaded;
+ this.apiData = mockWebsocketData as any;
+ this.setStatuses();
+
+ console.warn('Stacjownik działa w trybie mockowania danych z WS');
+
+ return;
+ }
+
+ const socket = io(URLs.stacjownikAPI, {
+ transports: ['websocket', 'polling'],
+ rememberUpgrade: true,
+ reconnection: true,
+ extraHeaders: {
+ version: packageInfo.version
+ }
+ });
+
+ socket.on('connect_error', () => {
+ this.dataStatuses.connection = DataStatus.Error;
+ });
+
+ socket.on('UPDATE', (data: APIData) => {
+ this.apiData = data;
+ this.dataStatuses.connection = DataStatus.Loaded;
+ this.setStatuses();
+ });
+
+ socket.emit('FETCH_DATA', { version: packageInfo.version }, (data: APIData) => {
+ this.dataStatuses.connection = DataStatus.Loaded;
+ this.apiData = data;
+ this.setStatuses();
+ });
+
+ this.webSocket = socket;
+ },
+
+ async connectToAPI() {
+ this.connectToWebsocket();
+ this.fetchStockInfoData();
+ this.fetchStationsGeneralInfo();
+ },
+
+ async changeRegion(region: StoreState['region']) {
+ this.region = region;
+ },
+
+ async fetchStockInfoData() {
+ try {
+ this.rollingStockData = (
+ await axios.get(
+ 'https://raw.githubusercontent.com/Spythere/api/main/td2/data/stockInfo.json'
+ )
+ ).data;
+ } catch (error) {
+ console.error('Ups! Wystąpił błąd podczas pobierania informacji o taborze z API:', error);
+ }
+ },
+
+ async setStatuses() {
+ if (!this.apiData.stations) {
+ this.dataStatuses.sceneries = DataStatus.Error;
+ this.dataStatuses.trains = DataStatus.Error;
+ this.dataStatuses.dispatchers = DataStatus.Error;
+
+ return;
+ }
+
+ this.dataStatuses.sceneries = DataStatus.Loaded;
+ this.dataStatuses.trains = !this.apiData.trains ? DataStatus.Warning : DataStatus.Loaded;
+ this.dataStatuses.dispatchers = !this.apiData.dispatchers
+ ? DataStatus.Warning
+ : DataStatus.Loaded;
+
+ // if (this.apiData.dispatchers != null) this.lastDispatcherStatuses = prevDispatcherStatuses;
+ }
+ }
+});
diff --git a/src/styles/JournalSection.scss b/src/styles/JournalSection.scss
index a4ef81a..eadc5b7 100644
--- a/src/styles/JournalSection.scss
+++ b/src/styles/JournalSection.scss
@@ -1,78 +1,78 @@
-@import 'responsive.scss';
-@import 'animations.scss';
-
-.list_wrapper {
- overflow-y: auto;
- height: 90vh;
- min-height: 550px;
-
- padding-right: 0.2em;
-}
-
-.journal_wrapper {
- max-width: 1350px;
- width: 100%;
-
- margin: 0 auto;
-
- padding: 1em 0;
-}
-
-.journal_refreshed-date {
- background-color: #333;
- color: #ddd;
- text-align: end;
-
- padding: 0.25em;
- margin: 0.5em 0;
-}
-
-.journal_warning {
- text-align: center;
- font-size: 1.3em;
-
- &.error {
- background-color: var(--clr-error);
- }
-}
-
-.journal_item {
- cursor: pointer;
-}
-
-.journal_item,
-.journal_warning {
- background-color: #1a1a1a;
- padding: 1em;
- margin-bottom: 1em;
- cursor: pointer;
-}
-
-.journal_top-bar {
- display: flex;
- justify-content: space-between;
- align-items: center;
- gap: 0.5em;
-
- position: relative;
- margin-bottom: 0.5em;
-}
-
-.btn--load-data {
- padding: 0.5em 1em;
- display: flex;
- margin: 0 auto;
-
- font-size: 1.2em;
-}
-
-@include smallScreen() {
- .journal_top-bar {
- justify-content: center;
- flex-wrap: wrap;
- }
-
- .journal_refreshed-date {
- text-align: center;
- }
-}
+@import 'responsive.scss';
+@import 'animations.scss';
+
+.list_wrapper {
+ overflow-y: auto;
+ height: 90vh;
+ min-height: 550px;
+
+ padding-right: 0.2em;
+}
+
+.journal_wrapper {
+ max-width: 1350px;
+ width: 100%;
+
+ margin: 0 auto;
+
+ padding: 1em 0;
+}
+
+.journal_refreshed-date {
+ background-color: #333;
+ color: #ddd;
+ text-align: end;
+
+ padding: 0.25em;
+ margin: 0.5em 0;
+}
+
+.journal_warning {
+ text-align: center;
+ font-size: 1.3em;
+
+ &.error {
+ background-color: var(--clr-error);
+ }
+}
+
+.journal_item {
+ cursor: pointer;
+}
+
+.journal_item,
+.journal_warning {
+ background-color: #1a1a1a;
+ padding: 1em;
+ margin-bottom: 1em;
+ cursor: pointer;
+}
+
+.journal_top-bar {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ gap: 0.5em;
+
+ position: relative;
+ margin-bottom: 0.5em;
+}
+
+.btn--load-data {
+ padding: 0.5em 1em;
+ display: flex;
+ margin: 0 auto;
+
+ font-size: 1.2em;
+}
+
+@include smallScreen() {
+ .journal_top-bar {
+ justify-content: center;
+ flex-wrap: wrap;
+ }
+
+ .journal_refreshed-date {
+ text-align: center;
+ }
+}
diff --git a/src/styles/JournalStats.scss b/src/styles/JournalStats.scss
index e6c198e..d9752bd 100644
--- a/src/styles/JournalStats.scss
+++ b/src/styles/JournalStats.scss
@@ -47,4 +47,3 @@
justify-content: center;
}
}
-
diff --git a/src/styles/animations.scss b/src/styles/animations.scss
index 27b3d9a..28c0d21 100644
--- a/src/styles/animations.scss
+++ b/src/styles/animations.scss
@@ -28,4 +28,4 @@
&-leave-active {
transition: all 100ms ease-out;
}
-}
\ No newline at end of file
+}
diff --git a/src/styles/badge.scss b/src/styles/badge.scss
index bd260ea..2329d38 100644
--- a/src/styles/badge.scss
+++ b/src/styles/badge.scss
@@ -1,99 +1,99 @@
-.badge {
- font-weight: 600;
-
- display: inline-block;
- padding: 0;
-
- margin: 0.25em;
-
- span {
- display: inline-block;
- background: #585858;
- padding: 0.2em 0.4em;
- }
-
- &-none {
- font-weight: 600;
-
- padding: 0.2em 0.4em;
- background: firebrick;
-
- text-align: center;
-
- @include smallScreen() {
- font-size: 1em;
- }
- }
-}
-
-.level-badge {
- display: flex;
- justify-content: center;
- align-items: center;
-
- &.driver {
- border-radius: 50%;
- width: 1.7em;
- height: 1.7em;
- }
-
- &.dispatcher {
- border-radius: 0.25em;
-
- width: 1.6em;
- height: 1.6em;
- }
-}
-
-.region-badge {
- padding: 0.25em 0.5em;
- border-radius: 0.5em;
- font-weight: bold;
- color: white;
-
- &[aria-describedby='eu'] {
- background-color: forestgreen;
- }
-
- &[aria-describedby='cae'] {
- background-color: lightcoral;
- color: black;
- }
-
- &[aria-describedby='usw'] {
- background-color: lightblue;
- color: black;
- }
-
- &[aria-describedby='us'] {
- background-color: lightblue;
- color: black;
- }
-
- &[aria-describedby='ru'] {
- background-color: lightslategray;
- }
-}
-
-.train-badge {
- padding: 0.1em 0.2em;
- border-radius: 0.2em;
- font-weight: bold;
-
- font-size: 0.9em;
-
- &.twr {
- background-color: var(--clr-twr);
- box-shadow: 0 0 5px 1px var(--clr-twr);
- color: black;
- }
-
- &.skr {
- background-color: var(--clr-skr);
- box-shadow: 0 0 5px 1px var(--clr-skr);
- }
-
- &.offline {
- background-color: #be3728;
- }
-}
+.badge {
+ font-weight: 600;
+
+ display: inline-block;
+ padding: 0;
+
+ margin: 0.25em;
+
+ span {
+ display: inline-block;
+ background: #585858;
+ padding: 0.2em 0.4em;
+ }
+
+ &-none {
+ font-weight: 600;
+
+ padding: 0.2em 0.4em;
+ background: firebrick;
+
+ text-align: center;
+
+ @include smallScreen() {
+ font-size: 1em;
+ }
+ }
+}
+
+.level-badge {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+
+ &.driver {
+ border-radius: 50%;
+ width: 1.7em;
+ height: 1.7em;
+ }
+
+ &.dispatcher {
+ border-radius: 0.25em;
+
+ width: 1.6em;
+ height: 1.6em;
+ }
+}
+
+.region-badge {
+ padding: 0.25em 0.5em;
+ border-radius: 0.5em;
+ font-weight: bold;
+ color: white;
+
+ &[aria-describedby='eu'] {
+ background-color: forestgreen;
+ }
+
+ &[aria-describedby='cae'] {
+ background-color: lightcoral;
+ color: black;
+ }
+
+ &[aria-describedby='usw'] {
+ background-color: lightblue;
+ color: black;
+ }
+
+ &[aria-describedby='us'] {
+ background-color: lightblue;
+ color: black;
+ }
+
+ &[aria-describedby='ru'] {
+ background-color: lightslategray;
+ }
+}
+
+.train-badge {
+ padding: 0.1em 0.2em;
+ border-radius: 0.2em;
+ font-weight: bold;
+
+ font-size: 0.9em;
+
+ &.twr {
+ background-color: var(--clr-twr);
+ box-shadow: 0 0 5px 1px var(--clr-twr);
+ color: black;
+ }
+
+ &.skr {
+ background-color: var(--clr-skr);
+ box-shadow: 0 0 5px 1px var(--clr-skr);
+ }
+
+ &.offline {
+ background-color: #be3728;
+ }
+}
diff --git a/src/styles/card.scss b/src/styles/card.scss
index 9739d44..2302136 100644
--- a/src/styles/card.scss
+++ b/src/styles/card.scss
@@ -1,53 +1,53 @@
-@import './variables.scss';
-@import './responsive.scss';
-
-.card-dimmer {
- position: fixed;
- top: 0;
- left: 0;
- width: 100vw;
- height: 100vh;
-
- z-index: 100;
-
- background: rgba(black, 0.65);
-}
-
-.card {
- position: fixed;
- top: 50%;
- left: 50%;
- z-index: 100;
-
- transform: translate(-50%, -50%);
-
- overflow: hidden;
- background: #202020e8;
-
- box-shadow: 0 0 15px 0 black;
- border: 1px solid #202020e8;
-
- width: 95%;
- max-width: 700px;
-
- max-height: 95vh;
-
- &-exit {
- position: absolute;
- top: 0;
- right: 0;
- margin: 0.5em 0.5em;
-
- img {
- width: 2em;
- }
-
- cursor: pointer;
- }
-}
-
-@include smallScreen {
- .card {
- max-height: 85vh;
- }
-}
+@import './variables.scss';
+@import './responsive.scss';
+
+.card-dimmer {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100vw;
+ height: 100vh;
+
+ z-index: 100;
+
+ background: rgba(black, 0.65);
+}
+
+.card {
+ position: fixed;
+ top: 50%;
+ left: 50%;
+ z-index: 100;
+
+ transform: translate(-50%, -50%);
+
+ overflow: hidden;
+ background: #202020e8;
+
+ box-shadow: 0 0 15px 0 black;
+ border: 1px solid #202020e8;
+
+ width: 95%;
+ max-width: 700px;
+
+ max-height: 95vh;
+
+ &-exit {
+ position: absolute;
+ top: 0;
+ right: 0;
+ margin: 0.5em 0.5em;
+
+ img {
+ width: 2em;
+ }
+
+ cursor: pointer;
+ }
+}
+
+@include smallScreen {
+ .card {
+ max-height: 85vh;
+ }
+}
diff --git a/src/styles/filters_options.scss b/src/styles/filters_options.scss
index 6aa716c..3fd0976 100644
--- a/src/styles/filters_options.scss
+++ b/src/styles/filters_options.scss
@@ -1,161 +1,161 @@
-@import 'responsive.scss';
-@import 'variables.scss';
-@import 'search_box.scss';
-
-.filters-options {
- margin-bottom: 0.5em;
-}
-
-.actions-bar {
- display: flex;
- gap: 0.5em;
-}
-
-h1.option-title {
- position: relative;
- font-size: 1.1em;
- margin: 0.7em 0 0.25em 0;
-
- &::before {
- content: '';
- position: absolute;
- top: -4px;
-
- width: 50%;
- height: 2px;
- background-color: white;
- border-radius: 2px;
- }
-}
-
-.options-anim {
- &-enter-from,
- &-leave-to {
- opacity: 0;
- transform: translateY(10px);
- }
-
- &-enter-active,
- &-leave-active {
- transition: all 150ms ease;
- }
-}
-
-.bg {
- position: fixed;
- top: 0;
- left: 0;
- width: 100vw;
- height: 100vh;
-
- z-index: 10;
-}
-
-.options_wrapper {
- position: absolute;
-
- background-color: $bgCol;
- box-shadow: 0 5px 10px 2px #0f0f0f;
-
- width: 97%;
- max-width: 550px;
-
- padding: 1em;
- z-index: 100;
-}
-
-.options_sorters {
- display: flex;
- align-items: center;
- flex-wrap: wrap;
- gap: 0.5em;
-
- padding: 0.25em 0.25em 0 0;
-}
-
-.options_filter-sections section {
- margin: 0.5em 0;
-}
-
-.options_filters {
- display: flex;
- flex-wrap: wrap;
-
- gap: 0.5em;
- margin: 0.25em 0;
-}
-
-.sort-option,
-.filter-option {
- padding: 0.25em 0.5em;
-}
-
-.sort-option[data-selected='true'] {
- color: $accentCol;
-}
-
-.filter-option {
- abandoned {
- color: salmon;
- }
-
- fulfilled {
- color: lightgreen;
- }
-
- active {
- color: lightblue;
- }
-}
-
-.search_content {
- .search {
- margin: 0.5em auto;
- }
-
- .search-box {
- .search-exit {
- position: absolute;
- transform: translateY(-50%);
- top: 50%;
- right: 0;
- }
- }
-}
-
-.options_actions {
- display: flex;
- gap: 0.5em;
- width: 100%;
- margin-top: 1em;
-
- button {
- width: 100%;
- }
-}
-
-@include smallScreen() {
- h1 {
- text-align: center;
-
- &::before {
- width: 75%;
- left: 50%;
- transform: translateX(-50%);
- }
- }
-
- .options_wrapper {
- font-size: 1.1em;
- max-width: 100%;
- }
-
- .options_filters,
- .options_sorters {
- justify-content: center;
- }
-
- .filter-section {
- text-align: center;
- }
-}
+@import 'responsive.scss';
+@import 'variables.scss';
+@import 'search_box.scss';
+
+.filters-options {
+ margin-bottom: 0.5em;
+}
+
+.actions-bar {
+ display: flex;
+ gap: 0.5em;
+}
+
+h1.option-title {
+ position: relative;
+ font-size: 1.1em;
+ margin: 0.7em 0 0.25em 0;
+
+ &::before {
+ content: '';
+ position: absolute;
+ top: -4px;
+
+ width: 50%;
+ height: 2px;
+ background-color: white;
+ border-radius: 2px;
+ }
+}
+
+.options-anim {
+ &-enter-from,
+ &-leave-to {
+ opacity: 0;
+ transform: translateY(10px);
+ }
+
+ &-enter-active,
+ &-leave-active {
+ transition: all 150ms ease;
+ }
+}
+
+.bg {
+ position: fixed;
+ top: 0;
+ left: 0;
+ width: 100vw;
+ height: 100vh;
+
+ z-index: 10;
+}
+
+.options_wrapper {
+ position: absolute;
+
+ background-color: $bgCol;
+ box-shadow: 0 5px 10px 2px #0f0f0f;
+
+ width: 97%;
+ max-width: 550px;
+
+ padding: 1em;
+ z-index: 100;
+}
+
+.options_sorters {
+ display: flex;
+ align-items: center;
+ flex-wrap: wrap;
+ gap: 0.5em;
+
+ padding: 0.25em 0.25em 0 0;
+}
+
+.options_filter-sections section {
+ margin: 0.5em 0;
+}
+
+.options_filters {
+ display: flex;
+ flex-wrap: wrap;
+
+ gap: 0.5em;
+ margin: 0.25em 0;
+}
+
+.sort-option,
+.filter-option {
+ padding: 0.25em 0.5em;
+}
+
+.sort-option[data-selected='true'] {
+ color: $accentCol;
+}
+
+.filter-option {
+ abandoned {
+ color: salmon;
+ }
+
+ fulfilled {
+ color: lightgreen;
+ }
+
+ active {
+ color: lightblue;
+ }
+}
+
+.search_content {
+ .search {
+ margin: 0.5em auto;
+ }
+
+ .search-box {
+ .search-exit {
+ position: absolute;
+ transform: translateY(-50%);
+ top: 50%;
+ right: 0;
+ }
+ }
+}
+
+.options_actions {
+ display: flex;
+ gap: 0.5em;
+ width: 100%;
+ margin-top: 1em;
+
+ button {
+ width: 100%;
+ }
+}
+
+@include smallScreen() {
+ h1 {
+ text-align: center;
+
+ &::before {
+ width: 75%;
+ left: 50%;
+ transform: translateX(-50%);
+ }
+ }
+
+ .options_wrapper {
+ font-size: 1.1em;
+ max-width: 100%;
+ }
+
+ .options_filters,
+ .options_sorters {
+ justify-content: center;
+ }
+
+ .filter-section {
+ text-align: center;
+ }
+}
diff --git a/src/styles/global.scss b/src/styles/global.scss
index 383c3a0..ec69dd7 100644
--- a/src/styles/global.scss
+++ b/src/styles/global.scss
@@ -1,312 +1,308 @@
-:root {
- --clr-primary: #ffc014;
- --clr-secondary: #2f2f2f;
-
- --clr-bg: #4d4d4d;
- --clr-bg2: #1b1b1b;
-
- --clr-accent: #1085b3;
- --clr-accent2: #ff3d5d;
-
- --clr-skr: #ff5100;
- --clr-twr: #ffbb00;
-
- --clr-error: #df3e3e;
- --clr-warning: #c59429;
-
- font-size: 16px;
-}
-
-::-webkit-scrollbar {
- width: 15px;
- height: 15px;
- background-color: transparent;
-
- &-track {
- background-color: #333;
- }
-
- &-thumb {
- background-color: #666;
- }
-
- &-corner {
- background-color: #333;
- }
-}
-
-html {
- scroll-behavior: smooth;
-}
-
-body {
- background: var(--clr-bg);
-
- margin: 0;
- padding: 0;
- font-family: 'Quicksand', sans-serif;
- font-weight: 500;
- overflow-y: scroll;
-
- &.no-scroll {
- overflow-y: hidden;
- padding-right: 15px;
-
- @include smallScreen() {
- padding: 0;
- }
- }
-}
-
-.g-tooltip {
- position: relative;
-
- display: inline-block;
- vertical-align: middle;
-
- .content {
- position: absolute;
- left: 0;
-
- z-index: 100;
-
- visibility: hidden;
- opacity: 0;
-
- min-width: 250px;
-
- background-color: #202020;
- text-align: center;
-
- border-radius: 0.5em;
-
- transition: opacity 0.3s;
- padding: 0.25em;
- }
-
- &:hover > .content {
- visibility: visible;
- opacity: 1;
- }
-}
-
-button,
-input,
-select {
- border: none;
- font-family: 'Quicksand', sans-serif;
- font-size: 1em;
-}
-
-input {
- background: none;
- color: white;
- font-size: 1em;
-
- background-color: #333;
- padding: 0.15em 0.5em;
-
- outline: none;
-
- &::placeholder {
- color: #cfcfcf;
- }
-}
-
-*,
-*::before,
-*::after {
- box-sizing: border-box;
- padding: 0;
- margin: 0;
-
- -webkit-tap-highlight-color: transparent;
-}
-
-*:focus {
- outline: none;
-}
-
-*:focus-visible {
- outline: 1px solid $accentCol;
-}
-
-.title {
- color: $accentCol;
- font-weight: 600;
-
- padding: 0.35em 0;
-}
-
-.active-indicator {
- width: 7px;
- height: 7px;
- background-color: lightgreen;
- border-radius: 50%;
-
- margin-left: 10px;
-}
-
-a {
- display: inline-block;
-
- color: white;
- text-decoration: none;
-
- transition: color 0.3s;
-
- &:hover,
- &:focus {
- color: $accentCol;
- border: none;
- }
-}
-
-ul {
- padding: 0;
- list-style: none;
-}
-
-.flex {
- display: flex;
- align-items: center;
- justify-content: center;
-
- width: 100%;
-
- &-spaced {
- justify-content: space-between;
- }
-
- &-column {
- flex-direction: column;
- }
-}
-
-.text {
- &--primary {
- color: var(--clr-primary);
- }
-
- &--grayed {
- color: #ccc;
- }
-}
-
-button {
- cursor: pointer;
- color: white;
- background: none;
-
- display: flex;
- align-items: center;
- justify-content: center;
-
- padding: 0.25em 0.5em;
-
- transition: all 100ms ease;
-
- &[data-disabled='true'] {
- user-select: none;
- pointer-events: none;
- opacity: 0.85;
- }
-}
-
-button.btn--filled {
- background-color: #1a1a1a;
- border-radius: 0.25em;
-
- &:hover {
- background-color: #2a2a2a;
- }
-}
-
-button.btn--action {
- background-color: #424242;
- border-radius: 0.25em;
-
- &:hover {
- background-color: #555;
- }
-}
-
-button.btn--option {
- color: white;
- background-color: #333;
-
- &.checked {
- color: var(--clr-primary);
- font-weight: bold;
-
- background-color: #3c3c3c;
- }
-}
-
-button.btn--image {
- font-weight: bold;
- padding: 0.35em 0.75em;
-
- img {
- width: 1.5em;
- margin-right: 0.5em;
- vertical-align: middle;
- }
-}
-
-.return-btn {
- display: none;
- justify-content: center;
- align-items: center;
-
- position: fixed;
- right: 2.5rem;
- bottom: 4rem;
-
- z-index: 100;
-
- width: 3.5rem;
-
- font-size: 3rem;
-
- background-color: #555;
- outline: 3px solid #222;
- color: white;
-
- border-radius: 50%;
- cursor: pointer;
-
- &:hover {
- background-color: #3c3c3c;
- }
-
- img {
- width: 1.3em;
- }
-
- @include smallScreen() {
- bottom: 1em;
- right: 0;
- left: 50%;
-
- width: 1em;
- height: 1em;
-
- transform: translateX(-50%);
- }
-}
-
-@include smallScreen {
- ::-webkit-scrollbar {
- width: 0.5em;
- height: 0.5em;
-
- &-track {
- background-color: #222;
- }
-
- &-thumb {
- background-color: #777;
- }
- }
-}
+:root {
+ --clr-primary: #ffc014;
+ --clr-secondary: #2f2f2f;
+
+ --clr-bg: #4d4d4d;
+ --clr-bg2: #1b1b1b;
+
+ --clr-accent: #1085b3;
+ --clr-accent2: #ff3d5d;
+
+ --clr-skr: #ff5100;
+ --clr-twr: #ffbb00;
+
+ --clr-error: #df3e3e;
+ --clr-warning: #c59429;
+
+ font-size: 16px;
+}
+
+::-webkit-scrollbar {
+ width: 15px;
+ height: 15px;
+ background-color: transparent;
+
+ &-track {
+ background-color: #333;
+ }
+
+ &-thumb {
+ background-color: #666;
+ }
+
+ &-corner {
+ background-color: #333;
+ }
+}
+
+body {
+ background: var(--clr-bg);
+
+ margin: 0;
+ padding: 0;
+ font-family: 'Quicksand', sans-serif;
+ font-weight: 500;
+ overflow-y: scroll;
+
+ &.no-scroll {
+ overflow-y: hidden;
+ padding-right: 15px;
+
+ @include smallScreen() {
+ padding: 0;
+ }
+ }
+}
+
+.g-tooltip {
+ position: relative;
+
+ display: inline-block;
+ vertical-align: middle;
+
+ .content {
+ position: absolute;
+ left: 0;
+
+ z-index: 100;
+
+ visibility: hidden;
+ opacity: 0;
+
+ min-width: 250px;
+
+ background-color: #202020;
+ text-align: center;
+
+ border-radius: 0.5em;
+
+ transition: opacity 0.3s;
+ padding: 0.25em;
+ }
+
+ &:hover > .content {
+ visibility: visible;
+ opacity: 1;
+ }
+}
+
+button,
+input,
+select {
+ border: none;
+ font-family: 'Quicksand', sans-serif;
+ font-size: 1em;
+}
+
+input {
+ background: none;
+ color: white;
+ font-size: 1em;
+
+ background-color: #333;
+ padding: 0.15em 0.5em;
+
+ outline: none;
+
+ &::placeholder {
+ color: #cfcfcf;
+ }
+}
+
+*,
+*::before,
+*::after {
+ box-sizing: border-box;
+ padding: 0;
+ margin: 0;
+
+ -webkit-tap-highlight-color: transparent;
+}
+
+*:focus {
+ outline: none;
+}
+
+*:focus-visible {
+ outline: 1px solid $accentCol;
+}
+
+.title {
+ color: $accentCol;
+ font-weight: 600;
+
+ padding: 0.35em 0;
+}
+
+.active-indicator {
+ width: 7px;
+ height: 7px;
+ background-color: lightgreen;
+ border-radius: 50%;
+
+ margin-left: 10px;
+}
+
+a {
+ display: inline-block;
+
+ color: white;
+ text-decoration: none;
+
+ transition: color 0.3s;
+
+ &:hover,
+ &:focus {
+ color: $accentCol;
+ border: none;
+ }
+}
+
+ul {
+ padding: 0;
+ list-style: none;
+}
+
+.flex {
+ display: flex;
+ align-items: center;
+ justify-content: center;
+
+ width: 100%;
+
+ &-spaced {
+ justify-content: space-between;
+ }
+
+ &-column {
+ flex-direction: column;
+ }
+}
+
+.text {
+ &--primary {
+ color: var(--clr-primary);
+ }
+
+ &--grayed {
+ color: #ccc;
+ }
+}
+
+button {
+ cursor: pointer;
+ color: white;
+ background: none;
+
+ display: flex;
+ align-items: center;
+ justify-content: center;
+
+ padding: 0.25em 0.5em;
+
+ transition: all 100ms ease;
+
+ &[data-disabled='true'] {
+ user-select: none;
+ pointer-events: none;
+ opacity: 0.85;
+ }
+}
+
+button.btn--filled {
+ background-color: #1a1a1a;
+ border-radius: 0.25em;
+
+ &:hover {
+ background-color: #2a2a2a;
+ }
+}
+
+button.btn--action {
+ background-color: #424242;
+ border-radius: 0.25em;
+
+ &:hover {
+ background-color: #555;
+ }
+}
+
+button.btn--option {
+ color: white;
+ background-color: #333;
+
+ &.checked {
+ color: var(--clr-primary);
+ font-weight: bold;
+
+ background-color: #3c3c3c;
+ }
+}
+
+button.btn--image {
+ font-weight: bold;
+ padding: 0.35em 0.75em;
+
+ img {
+ width: 1.5em;
+ margin-right: 0.5em;
+ vertical-align: middle;
+ }
+}
+
+.return-btn {
+ display: none;
+ justify-content: center;
+ align-items: center;
+
+ position: fixed;
+ right: 2.5rem;
+ bottom: 4rem;
+
+ z-index: 100;
+
+ width: 3.5rem;
+
+ font-size: 3rem;
+
+ background-color: #555;
+ outline: 3px solid #222;
+ color: white;
+
+ border-radius: 50%;
+ cursor: pointer;
+
+ &:hover {
+ background-color: #3c3c3c;
+ }
+
+ img {
+ width: 1.3em;
+ }
+
+ @include smallScreen() {
+ bottom: 1em;
+ right: 0;
+ left: 50%;
+
+ width: 1em;
+ height: 1em;
+
+ transform: translateX(-50%);
+ }
+}
+
+@include smallScreen {
+ ::-webkit-scrollbar {
+ width: 0.5em;
+ height: 0.5em;
+
+ &-track {
+ background-color: #222;
+ }
+
+ &-thumb {
+ background-color: #777;
+ }
+ }
+}
diff --git a/src/styles/option.scss b/src/styles/option.scss
index c0de3d5..c9a42f0 100644
--- a/src/styles/option.scss
+++ b/src/styles/option.scss
@@ -1,41 +1,40 @@
+.option {
+ font-size: 1em;
-.option {
- font-size: 1em;
-
- input {
- display: none;
+ input {
+ display: none;
+ }
+
+ span {
+ // user-select: none;
+ // -moz-user-select: none;
+ // -webkit-user-select: none;
+
+ width: 100%;
+ text-align: center;
+
+ cursor: pointer;
+
+ padding: 0.5em 0.55em;
+
+ display: inline-block;
+ position: relative;
+
+ transition: all 0.2s;
+
+ border-radius: 0.5em;
+
+ &:not(.checked) {
+ background-color: #585858;
+
+ &::before {
+ box-shadow: none;
+ }
}
-
- span {
- // user-select: none;
- // -moz-user-select: none;
- // -webkit-user-select: none;
+ }
- width: 100%;
- text-align: center;
-
- cursor: pointer;
-
- padding: 0.5em 0.55em;
-
- display: inline-block;
- position: relative;
-
- transition: all 0.2s;
-
- border-radius: 0.5em;
-
- &:not(.checked) {
- background-color: #585858;
-
- &::before {
- box-shadow: none;
- }
- }
- }
-
- &:focus span {
- // outline: 1px solid white;
- border: none;
- }
+ &:focus span {
+ // outline: 1px solid white;
+ border: none;
+ }
}
diff --git a/src/styles/responsive.scss b/src/styles/responsive.scss
index ee26fa7..f876f43 100644
--- a/src/styles/responsive.scss
+++ b/src/styles/responsive.scss
@@ -1,23 +1,23 @@
-@mixin smallScreen() {
- @media only screen and (max-width: 700px) {
- @content;
- }
-}
-
-@mixin midScreen() {
- @media only screen and (max-width: 1150px) {
- @content;
- }
-}
-
-@mixin screenLandscape() {
- @media only screen and (orientation: landscape) and (max-device-height: 450px) {
- @content;
- }
-}
-
-@mixin bigScreen() {
- @media only screen and (min-width: 2000px) {
- @content;
- }
-}
+@mixin smallScreen() {
+ @media only screen and (max-width: 700px) {
+ @content;
+ }
+}
+
+@mixin midScreen() {
+ @media only screen and (max-width: 1150px) {
+ @content;
+ }
+}
+
+@mixin screenLandscape() {
+ @media only screen and (orientation: landscape) and (max-device-height: 450px) {
+ @content;
+ }
+}
+
+@mixin bigScreen() {
+ @media only screen and (min-width: 2000px) {
+ @content;
+ }
+}
diff --git a/src/styles/sceneryViewTables.scss b/src/styles/sceneryViewTables.scss
index e6c668e..2e3f435 100644
--- a/src/styles/sceneryViewTables.scss
+++ b/src/styles/sceneryViewTables.scss
@@ -1,46 +1,46 @@
-.scenery-table-section {
- position: relative;
- height: 100%;
- overflow-y: scroll;
-}
-
-table.scenery-history-table {
- width: 100%;
- border-collapse: collapse;
-
- thead {
- position: sticky;
- top: 0;
- background-color: #222222;
- }
-
- th {
- padding: 0.5em;
- }
-
- tr {
- background-color: #353535;
- border: none;
- }
-
- td {
- padding: 0.75em;
- border-bottom: solid 5px #111;
- }
-}
-
-.no-history {
- padding: 1em 0.5em;
- background-color: #444;
- font-size: 1.2em;
- color: #ccc;
-}
-
-.bottom-info {
- display: flex;
- justify-content: center;
-
- button {
- padding: 0.5em;
- }
-}
+.scenery-table-section {
+ position: relative;
+ height: 100%;
+ overflow-y: scroll;
+}
+
+table.scenery-history-table {
+ width: 100%;
+ border-collapse: collapse;
+
+ thead {
+ position: sticky;
+ top: 0;
+ background-color: #222222;
+ }
+
+ th {
+ padding: 0.5em;
+ }
+
+ tr {
+ background-color: #353535;
+ border: none;
+ }
+
+ td {
+ padding: 0.75em;
+ border-bottom: solid 5px #111;
+ }
+}
+
+.no-history {
+ padding: 1em 0.5em;
+ background-color: #444;
+ font-size: 1.2em;
+ color: #ccc;
+}
+
+.bottom-info {
+ display: flex;
+ justify-content: center;
+
+ button {
+ padding: 0.5em;
+ }
+}
diff --git a/src/styles/search_box.scss b/src/styles/search_box.scss
index 8254e1a..f391296 100644
--- a/src/styles/search_box.scss
+++ b/src/styles/search_box.scss
@@ -1,52 +1,52 @@
-@import 'responsive.scss';
-
-.search {
- label {
- display: block;
- color: #ccc;
- margin-bottom: 0.25em;
- }
-
- &-box {
- position: relative;
-
- display: flex;
-
- border-radius: 0.5em;
- min-width: 200px;
- margin-right: 0.25em;
- }
-
- &-input {
- border: none;
- background-color: #424242;
-
- padding: 0.35em 0.5em;
- width: 100%;
- }
-
- &-exit {
- background-color: #424242;
-
- img {
- vertical-align: middle;
- height: 1.3em;
- }
- }
-
- &-button {
- width: 80%;
- max-width: 300px;
- }
-
- @include smallScreen {
- &-box,
- &-button {
- margin: 0.5em 0 0 0;
- }
-
- &-box {
- width: 100%;
- }
- }
-}
+@import 'responsive.scss';
+
+.search {
+ label {
+ display: block;
+ color: #ccc;
+ margin-bottom: 0.25em;
+ }
+
+ &-box {
+ position: relative;
+
+ display: flex;
+
+ border-radius: 0.5em;
+ min-width: 200px;
+ margin-right: 0.25em;
+ }
+
+ &-input {
+ border: none;
+ background-color: #424242;
+
+ padding: 0.35em 0.5em;
+ width: 100%;
+ }
+
+ &-exit {
+ background-color: #424242;
+
+ img {
+ vertical-align: middle;
+ height: 1.3em;
+ }
+ }
+
+ &-button {
+ width: 80%;
+ max-width: 300px;
+ }
+
+ @include smallScreen {
+ &-box,
+ &-button {
+ margin: 0.5em 0 0 0;
+ }
+
+ &-box {
+ width: 100%;
+ }
+ }
+}
diff --git a/src/styles/variables.scss b/src/styles/variables.scss
index 8b8884f..5e02d87 100644
--- a/src/styles/variables.scss
+++ b/src/styles/variables.scss
@@ -1,17 +1,17 @@
-$primaryCol: #2c2c2c;
-$secondaryCol: #01e733;
-
-$bgCol: #1d1d1d;
-$bgLigtherCol: #5b5b5b;
-
-$errorCol: #ff1919;
-$warningCol: #ffe15b;
-
-$accentCol: #ffc014;
-$accent2Col: #ff3d5d;
-
-$skr: #ff5100;
-$twr: #ffbb00;
-
-$animDuration: 150ms;
-$animType: ease-in-out;
\ No newline at end of file
+$primaryCol: #2c2c2c;
+$secondaryCol: #01e733;
+
+$bgCol: #1d1d1d;
+$bgLigtherCol: #5b5b5b;
+
+$errorCol: #ff1919;
+$warningCol: #ffe15b;
+
+$accentCol: #ffc014;
+$accent2Col: #ff3d5d;
+
+$skr: #ff5100;
+$twr: #ffbb00;
+
+$animDuration: 150ms;
+$animType: ease-in-out;
diff --git a/src/views/ErrorView.vue b/src/views/ErrorView.vue
deleted file mode 100644
index 05844c1..0000000
--- a/src/views/ErrorView.vue
+++ /dev/null
@@ -1,49 +0,0 @@
-
-
-
-
![error]()
-
Z powodu błędu w zapisywaniu rozkładów jazdy w tej zakładce można do odwołania nacieszyć się animacją sygnału S1a. Jak naprawię to będzie :)
-
-
-
-
-
-
-
diff --git a/src/views/JournalDispatchers.vue b/src/views/JournalDispatchers.vue
index 0f1cf02..4e110e2 100644
--- a/src/views/JournalDispatchers.vue
+++ b/src/views/JournalDispatchers.vue
@@ -1,270 +1,272 @@
-
-
-
-
-
-
-
-
- {{ $t('journal.data-refreshed-at') }}: {{ dataRefreshedAt.toLocaleString($i18n.locale) }}
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+ {{ $t('journal.data-refreshed-at') }}: {{ dataRefreshedAt.toLocaleString($i18n.locale) }}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/JournalTimetables.vue b/src/views/JournalTimetables.vue
index e8e5cab..69a65ca 100644
--- a/src/views/JournalTimetables.vue
+++ b/src/views/JournalTimetables.vue
@@ -1,328 +1,348 @@
-
-
-
-
-
-
-
+
+
+
+
+
+
+
diff --git a/src/views/SceneryView.vue b/src/views/SceneryView.vue
index b1f4284..ef3e1db 100644
--- a/src/views/SceneryView.vue
+++ b/src/views/SceneryView.vue
@@ -1,288 +1,312 @@
-
-
-
-
{{ $t('scenery.no-scenery') }}
-
-
- {{ $t('scenery.return-btn') }}
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
{{ $t('scenery.no-scenery') }}
+
+
+ {{ $t('scenery.return-btn') }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/views/StationsView.vue b/src/views/StationsView.vue
index 6aa73ed..6a0c6c9 100644
--- a/src/views/StationsView.vue
+++ b/src/views/StationsView.vue
@@ -1,106 +1,104 @@
-
-
-
-
-
-
-
+
+
+
+
+
+
+
diff --git a/src/views/TrainsView.vue b/src/views/TrainsView.vue
index 1c7e656..e751771 100644
--- a/src/views/TrainsView.vue
+++ b/src/views/TrainsView.vue
@@ -1,120 +1,126 @@
-
-
-
-
-
-
-
+
+
+
+
+
+
+
diff --git a/vite.config.ts b/vite.config.ts
index fd3e769..c423e9f 100644
--- a/vite.config.ts
+++ b/vite.config.ts
@@ -4,7 +4,7 @@ import { VitePWA } from 'vite-plugin-pwa';
export default defineConfig({
server: {
- port: 5001,
+ port: 5001
},
plugins: [
vue(),
@@ -20,13 +20,25 @@ export default defineConfig({
options: {
cacheName: 'sceneries-cache',
expiration: {
- maxEntries: 1,
- maxAgeSeconds: 60 * 60 * 24 * 7, // <== 7 days
+ maxAgeSeconds: 60 * 60 * 24 * 7 // <== 7 days
},
cacheableResponse: {
- statuses: [0, 200],
+ statuses: [0, 200]
+ }
+ }
+ },
+ {
+ urlPattern: new RegExp('^https://raw.githubusercontent.com/Spythere/api/*', 'i'),
+ handler: 'NetworkFirst',
+ options: {
+ cacheName: 'github-api-cache',
+ expiration: {
+ maxAgeSeconds: 60 * 60 * 24 * 7 // <== 7 days
},
- },
+ cacheableResponse: {
+ statuses: [0, 200]
+ }
+ }
},
{
urlPattern: /^https:\/\/rj.td2.info.pl\/dist\/img\/thumbnails\/.*/i,
@@ -35,21 +47,19 @@ export default defineConfig({
cacheName: 'images-cache',
expiration: {
maxEntries: 100,
- maxAgeSeconds: 60 * 60 * 24 * 60,
+ maxAgeSeconds: 60 * 60 * 24 * 7 // <== 7 days
},
cacheableResponse: {
- statuses: [0, 200, 404],
- },
- },
- },
- ],
+ statuses: [0, 200, 404]
+ }
+ }
+ }
+ ]
},
devOptions: {
enabled: true,
- },
- }),
- ],
+ suppressWarnings: true
+ }
+ })
+ ]
});
-
-
-
diff --git a/yarn.lock b/yarn.lock
index bb5ee0f..8e2e362 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2,6 +2,11 @@
# yarn lockfile v1
+"@aashutoshrathi/word-wrap@^1.2.3":
+ "integrity" "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA=="
+ "resolved" "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz"
+ "version" "1.2.6"
+
"@ampproject/remapping@^2.1.0":
"integrity" "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w=="
"resolved" "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz"
@@ -937,6 +942,38 @@
"resolved" "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.18.20.tgz"
"version" "0.18.20"
+"@eslint-community/eslint-utils@^4.2.0", "@eslint-community/eslint-utils@^4.4.0":
+ "integrity" "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA=="
+ "resolved" "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz"
+ "version" "4.4.0"
+ dependencies:
+ "eslint-visitor-keys" "^3.3.0"
+
+"@eslint-community/regexpp@^4.5.1", "@eslint-community/regexpp@^4.6.1":
+ "integrity" "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA=="
+ "resolved" "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz"
+ "version" "4.10.0"
+
+"@eslint/eslintrc@^2.1.2":
+ "integrity" "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g=="
+ "resolved" "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz"
+ "version" "2.1.2"
+ dependencies:
+ "ajv" "^6.12.4"
+ "debug" "^4.3.2"
+ "espree" "^9.6.0"
+ "globals" "^13.19.0"
+ "ignore" "^5.2.0"
+ "import-fresh" "^3.2.1"
+ "js-yaml" "^4.1.0"
+ "minimatch" "^3.1.2"
+ "strip-json-comments" "^3.1.1"
+
+"@eslint/js@8.52.0":
+ "integrity" "sha512-mjZVbpaeMZludF2fsWLD0Z9gCref1Tk4i9+wddjRvpUNqqcndPkBD09N/Mapey0b3jaXbLm2kICwFv2E64QinA=="
+ "resolved" "https://registry.npmjs.org/@eslint/js/-/js-8.52.0.tgz"
+ "version" "8.52.0"
+
"@firebase/analytics-compat@0.2.6":
"integrity" "sha512-4MqpVLFkGK7NJf/5wPEEP7ePBJatwYpyjgJ+wQHQGHfzaCDgntOnl9rL2vbVGGKCnRqWtZDIWhctB86UWXaX2Q=="
"resolved" "https://registry.npmjs.org/@firebase/analytics-compat/-/analytics-compat-0.2.6.tgz"
@@ -1327,6 +1364,25 @@
"protobufjs" "^7.2.4"
"yargs" "^17.7.2"
+"@humanwhocodes/config-array@^0.11.13":
+ "integrity" "sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ=="
+ "resolved" "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.13.tgz"
+ "version" "0.11.13"
+ dependencies:
+ "@humanwhocodes/object-schema" "^2.0.1"
+ "debug" "^4.1.1"
+ "minimatch" "^3.0.5"
+
+"@humanwhocodes/module-importer@^1.0.1":
+ "integrity" "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA=="
+ "resolved" "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz"
+ "version" "1.0.1"
+
+"@humanwhocodes/object-schema@^2.0.1":
+ "integrity" "sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw=="
+ "resolved" "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.1.tgz"
+ "version" "2.0.1"
+
"@intlify/core-base@9.4.1":
"integrity" "sha512-WIwx+elsZbxSMxRG5+LC+utRohFvmZMoDevfKOfnYMLbpCjCSavqTfHJAtfsY6ruowzqXeKkeLhRHbYbjoJx5g=="
"resolved" "https://registry.npmjs.org/@intlify/core-base/-/core-base-9.4.1.tgz"
@@ -1414,7 +1470,7 @@
"resolved" "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz"
"version" "2.0.5"
-"@nodelib/fs.walk@^1.2.3":
+"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8":
"integrity" "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="
"resolved" "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz"
"version" "1.2.8"
@@ -1422,6 +1478,18 @@
"@nodelib/fs.scandir" "2.1.5"
"fastq" "^1.6.0"
+"@pkgr/utils@^2.3.1":
+ "integrity" "sha512-POgTXhjrTfbTV63DiFXav4lBHiICLKKwDeaKn9Nphwj7WH6m0hMMCaJkMyRWjgtPFyRKRVoMXXjczsTQRDEhYw=="
+ "resolved" "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz"
+ "version" "2.4.2"
+ dependencies:
+ "cross-spawn" "^7.0.3"
+ "fast-glob" "^3.3.0"
+ "is-glob" "^4.0.3"
+ "open" "^9.1.0"
+ "picocolors" "^1.0.0"
+ "tslib" "^2.6.0"
+
"@protobufjs/aspromise@^1.1.1", "@protobufjs/aspromise@^1.1.2":
"integrity" "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ=="
"resolved" "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz"
@@ -1512,6 +1580,11 @@
"estree-walker" "^1.0.1"
"picomatch" "^2.2.2"
+"@rushstack/eslint-patch@^1.3.3":
+ "integrity" "sha512-6i/8UoL0P5y4leBIGzvkZdS85RDMG9y1ihZzmTZQ5LdHUYmZ7pKFoj8X0236s3lusPs1Fa5HTQUpwI+UfTcmeA=="
+ "resolved" "https://registry.npmjs.org/@rushstack/eslint-patch/-/eslint-patch-1.5.1.tgz"
+ "version" "1.5.1"
+
"@socket.io/component-emitter@~3.1.0":
"integrity" "sha512-+9jVqKhRSpsc591z5vX+X5Yyw+he/HCB4iQ/RYxw35CEPaY1gnsNE43nf9n9AaYjAQrTiI/mOwKUKdUs9vf7Xg=="
"resolved" "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.0.tgz"
@@ -1532,6 +1605,11 @@
"resolved" "https://registry.npmjs.org/@types/estree/-/estree-0.0.39.tgz"
"version" "0.0.39"
+"@types/json-schema@^7.0.12":
+ "integrity" "sha512-U3PUjAudAdJBeC2pgN8uTIKgxrb4nlDF3SF0++EldXQvQBGkpFZMSnwQiIoDU77tv45VgNkl/L4ouD+rEomujw=="
+ "resolved" "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.14.tgz"
+ "version" "7.0.14"
+
"@types/node@*":
"integrity" "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA=="
"resolved" "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz"
@@ -1559,11 +1637,106 @@
dependencies:
"@types/node" "*"
+"@types/semver@^7.5.0":
+ "integrity" "sha512-MMzuxN3GdFwskAnb6fz0orFvhfqi752yjaXylr0Rp4oDg5H0Zn1IuyRhDVvYOwAXoJirx2xuS16I3WjxnAIHiQ=="
+ "resolved" "https://registry.npmjs.org/@types/semver/-/semver-7.5.4.tgz"
+ "version" "7.5.4"
+
"@types/trusted-types@^2.0.2":
"integrity" "sha512-F5DIZ36YVLE+PN+Zwws4kJogq47hNgX3Nx6WyDJ3kcplxyke3XIzB8uK5n/Lpm1HBsbGzd6nmGehL8cPekP+Tg=="
"resolved" "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.2.tgz"
"version" "2.0.2"
+"@typescript-eslint/eslint-plugin@^6.7.0":
+ "integrity" "sha512-w0tiiRc9I4S5XSXXrMHOWgHgxbrBn1Ro+PmiYhSg2ZVdxrAJtQgzU5o2m1BfP6UOn7Vxcc6152vFjQfmZR4xEg=="
+ "resolved" "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.9.1.tgz"
+ "version" "6.9.1"
+ dependencies:
+ "@eslint-community/regexpp" "^4.5.1"
+ "@typescript-eslint/scope-manager" "6.9.1"
+ "@typescript-eslint/type-utils" "6.9.1"
+ "@typescript-eslint/utils" "6.9.1"
+ "@typescript-eslint/visitor-keys" "6.9.1"
+ "debug" "^4.3.4"
+ "graphemer" "^1.4.0"
+ "ignore" "^5.2.4"
+ "natural-compare" "^1.4.0"
+ "semver" "^7.5.4"
+ "ts-api-utils" "^1.0.1"
+
+"@typescript-eslint/parser@^6.0.0 || ^6.0.0-alpha", "@typescript-eslint/parser@^6.7.0":
+ "integrity" "sha512-C7AK2wn43GSaCUZ9do6Ksgi2g3mwFkMO3Cis96kzmgudoVaKyt62yNzJOktP0HDLb/iO2O0n2lBOzJgr6Q/cyg=="
+ "resolved" "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.9.1.tgz"
+ "version" "6.9.1"
+ dependencies:
+ "@typescript-eslint/scope-manager" "6.9.1"
+ "@typescript-eslint/types" "6.9.1"
+ "@typescript-eslint/typescript-estree" "6.9.1"
+ "@typescript-eslint/visitor-keys" "6.9.1"
+ "debug" "^4.3.4"
+
+"@typescript-eslint/scope-manager@6.9.1":
+ "integrity" "sha512-38IxvKB6NAne3g/+MyXMs2Cda/Sz+CEpmm+KLGEM8hx/CvnSRuw51i8ukfwB/B/sESdeTGet1NH1Wj7I0YXswg=="
+ "resolved" "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.9.1.tgz"
+ "version" "6.9.1"
+ dependencies:
+ "@typescript-eslint/types" "6.9.1"
+ "@typescript-eslint/visitor-keys" "6.9.1"
+
+"@typescript-eslint/type-utils@6.9.1":
+ "integrity" "sha512-eh2oHaUKCK58qIeYp19F5V5TbpM52680sB4zNSz29VBQPTWIlE/hCj5P5B1AChxECe/fmZlspAWFuRniep1Skg=="
+ "resolved" "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.9.1.tgz"
+ "version" "6.9.1"
+ dependencies:
+ "@typescript-eslint/typescript-estree" "6.9.1"
+ "@typescript-eslint/utils" "6.9.1"
+ "debug" "^4.3.4"
+ "ts-api-utils" "^1.0.1"
+
+"@typescript-eslint/types@6.9.1":
+ "integrity" "sha512-BUGslGOb14zUHOUmDB2FfT6SI1CcZEJYfF3qFwBeUrU6srJfzANonwRYHDpLBuzbq3HaoF2XL2hcr01c8f8OaQ=="
+ "resolved" "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.9.1.tgz"
+ "version" "6.9.1"
+
+"@typescript-eslint/typescript-estree@6.9.1":
+ "integrity" "sha512-U+mUylTHfcqeO7mLWVQ5W/tMLXqVpRv61wm9ZtfE5egz7gtnmqVIw9ryh0mgIlkKk9rZLY3UHygsBSdB9/ftyw=="
+ "resolved" "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.9.1.tgz"
+ "version" "6.9.1"
+ dependencies:
+ "@typescript-eslint/types" "6.9.1"
+ "@typescript-eslint/visitor-keys" "6.9.1"
+ "debug" "^4.3.4"
+ "globby" "^11.1.0"
+ "is-glob" "^4.0.3"
+ "semver" "^7.5.4"
+ "ts-api-utils" "^1.0.1"
+
+"@typescript-eslint/utils@6.9.1":
+ "integrity" "sha512-L1T0A5nFdQrMVunpZgzqPL6y2wVreSyHhKGZryS6jrEN7bD9NplVAyMryUhXsQ4TWLnZmxc2ekar/lSGIlprCA=="
+ "resolved" "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.9.1.tgz"
+ "version" "6.9.1"
+ dependencies:
+ "@eslint-community/eslint-utils" "^4.4.0"
+ "@types/json-schema" "^7.0.12"
+ "@types/semver" "^7.5.0"
+ "@typescript-eslint/scope-manager" "6.9.1"
+ "@typescript-eslint/types" "6.9.1"
+ "@typescript-eslint/typescript-estree" "6.9.1"
+ "semver" "^7.5.4"
+
+"@typescript-eslint/visitor-keys@6.9.1":
+ "integrity" "sha512-MUaPUe/QRLEffARsmNfmpghuQkW436DvESW+h+M52w0coICHRfD6Np9/K6PdACwnrq1HmuLl+cSPZaJmeVPkSw=="
+ "resolved" "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.9.1.tgz"
+ "version" "6.9.1"
+ dependencies:
+ "@typescript-eslint/types" "6.9.1"
+ "eslint-visitor-keys" "^3.4.1"
+
+"@ungap/structured-clone@^1.2.0":
+ "integrity" "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ=="
+ "resolved" "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz"
+ "version" "1.2.0"
+
"@vite-pwa/assets-generator@^0.0.10":
"integrity" "sha512-Ya3iE0EWIV+0g0XFXIjqSU8ZnhpJeLi9/xx+VfbSyXThKjk168GUYqd1z+SOuRO03bSRFDeK8wGixtwWuedjqg=="
"resolved" "https://registry.npmjs.org/@vite-pwa/assets-generator/-/assets-generator-0.0.10.tgz"
@@ -1649,6 +1822,23 @@
"resolved" "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.5.0.tgz"
"version" "6.5.0"
+"@vue/eslint-config-prettier@^8.0.0":
+ "integrity" "sha512-55dPqtC4PM/yBjhAr+yEw6+7KzzdkBuLmnhBrDfp4I48+wy+Giqqj9yUr5T2uD/BkBROjjmqnLZmXRdOx/VtQg=="
+ "resolved" "https://registry.npmjs.org/@vue/eslint-config-prettier/-/eslint-config-prettier-8.0.0.tgz"
+ "version" "8.0.0"
+ dependencies:
+ "eslint-config-prettier" "^8.8.0"
+ "eslint-plugin-prettier" "^5.0.0"
+
+"@vue/eslint-config-typescript@^12.0.0":
+ "integrity" "sha512-StxLFet2Qe97T8+7L8pGlhYBBr8Eg05LPuTDVopQV6il+SK6qqom59BA/rcFipUef2jD8P2X44Vd8tMFytfvlg=="
+ "resolved" "https://registry.npmjs.org/@vue/eslint-config-typescript/-/eslint-config-typescript-12.0.0.tgz"
+ "version" "12.0.0"
+ dependencies:
+ "@typescript-eslint/eslint-plugin" "^6.7.0"
+ "@typescript-eslint/parser" "^6.7.0"
+ "vue-eslint-parser" "^9.3.1"
+
"@vue/language-core@1.8.11":
"integrity" "sha512-+MZOBGqGwfld6hpo0DB47x8eNM0dNqk15ZdfOhj19CpvuYuOWCeVdOEGZunKDyo3QLkTn3kLOSysJzg7FDOQBA=="
"resolved" "https://registry.npmjs.org/@vue/language-core/-/language-core-1.8.11.tgz"
@@ -1711,6 +1901,11 @@
"resolved" "https://registry.npmjs.org/@vue/shared/-/shared-3.3.4.tgz"
"version" "3.3.4"
+"@vue/tsconfig@^0.4.0":
+ "integrity" "sha512-CPuIReonid9+zOG/CGTT05FXrPYATEqoDGNrEaqS4hwcw5BUNM2FguC0mOwJD4Jr16UpRVl9N0pY3P+srIbqmg=="
+ "resolved" "https://registry.npmjs.org/@vue/tsconfig/-/tsconfig-0.4.0.tgz"
+ "version" "0.4.0"
+
"@vue/typescript@1.8.11":
"integrity" "sha512-skUmMDiPUUtu1flPmf2YybF+PX8IzBtMioQOaNn6Ck/RhdrPJGj1AX/7s3Buf9G6ln+/KHR1XQuti/FFxw5XVA=="
"resolved" "https://registry.npmjs.org/@vue/typescript/-/typescript-1.8.11.tgz"
@@ -1719,11 +1914,26 @@
"@volar/typescript" "~1.10.0"
"@vue/language-core" "1.8.11"
-"acorn@^8.10.0", "acorn@^8.5.0":
+"acorn-jsx@^5.3.2":
+ "integrity" "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ=="
+ "resolved" "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz"
+ "version" "5.3.2"
+
+"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", "acorn@^8.10.0", "acorn@^8.5.0", "acorn@^8.9.0":
"integrity" "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw=="
"resolved" "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz"
"version" "8.10.0"
+"ajv@^6.12.4":
+ "integrity" "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g=="
+ "resolved" "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz"
+ "version" "6.12.6"
+ dependencies:
+ "fast-deep-equal" "^3.1.1"
+ "fast-json-stable-stringify" "^2.0.0"
+ "json-schema-traverse" "^0.4.1"
+ "uri-js" "^4.2.2"
+
"ajv@^8.6.0", "ajv@>=8":
"integrity" "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg=="
"resolved" "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz"
@@ -1761,6 +1971,16 @@
"normalize-path" "^3.0.0"
"picomatch" "^2.0.4"
+"argparse@^2.0.1":
+ "integrity" "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
+ "resolved" "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz"
+ "version" "2.0.1"
+
+"array-union@^2.1.0":
+ "integrity" "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw=="
+ "resolved" "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz"
+ "version" "2.1.0"
+
"async@^3.2.3":
"integrity" "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ=="
"resolved" "https://registry.npmjs.org/async/-/async-3.2.4.tgz"
@@ -1824,6 +2044,11 @@
"resolved" "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz"
"version" "1.5.1"
+"big-integer@^1.6.44":
+ "integrity" "sha512-GPEid2Y9QU1Exl1rpO9B2IPJGHPSupF5GnVIP0blYvNOMer2bTvSWs1jGOUg04hTmu67nmLsQ9TBo1puaotBHg=="
+ "resolved" "https://registry.npmjs.org/big-integer/-/big-integer-1.6.51.tgz"
+ "version" "1.6.51"
+
"binary-extensions@^2.0.0":
"integrity" "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA=="
"resolved" "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz"
@@ -1838,6 +2063,18 @@
"inherits" "^2.0.4"
"readable-stream" "^3.4.0"
+"boolbase@^1.0.0":
+ "integrity" "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="
+ "resolved" "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz"
+ "version" "1.0.0"
+
+"bplist-parser@^0.2.0":
+ "integrity" "sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw=="
+ "resolved" "https://registry.npmjs.org/bplist-parser/-/bplist-parser-0.2.0.tgz"
+ "version" "0.2.0"
+ dependencies:
+ "big-integer" "^1.6.44"
+
"brace-expansion@^1.1.7":
"integrity" "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA=="
"resolved" "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz"
@@ -1888,6 +2125,13 @@
"resolved" "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz"
"version" "3.3.0"
+"bundle-name@^3.0.0":
+ "integrity" "sha512-PKA4BeSvBpQKQ8iPOGCSiell+N8P+Tf1DlwqmYhpe2gAhKPHn8EYOxVT+ShuGmhg8lN8XiSlS80yiExKXrURlw=="
+ "resolved" "https://registry.npmjs.org/bundle-name/-/bundle-name-3.0.0.tgz"
+ "version" "3.0.0"
+ dependencies:
+ "run-applescript" "^5.0.0"
+
"cac@^6.7.14":
"integrity" "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ=="
"resolved" "https://registry.npmjs.org/cac/-/cac-6.7.14.tgz"
@@ -1901,6 +2145,11 @@
"function-bind" "^1.1.1"
"get-intrinsic" "^1.0.2"
+"callsites@^3.0.0":
+ "integrity" "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ=="
+ "resolved" "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz"
+ "version" "3.1.0"
+
"caniuse-lite@^1.0.30001400":
"integrity" "sha512-Sf9NiF+wZxPfzv8Z3iS0rXM1Do+iOy2Lxvib38glFX+08TCYYYGR5fRJXk4d77C4AYwhUjgYgMsMudbh2TqCKw=="
"resolved" "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001503.tgz"
@@ -1915,6 +2164,14 @@
"escape-string-regexp" "^1.0.5"
"supports-color" "^5.3.0"
+"chalk@^4.0.0":
+ "integrity" "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="
+ "resolved" "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz"
+ "version" "4.1.2"
+ dependencies:
+ "ansi-styles" "^4.1.0"
+ "supports-color" "^7.1.0"
+
"chalk@^4.0.2":
"integrity" "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA=="
"resolved" "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz"
@@ -2041,11 +2298,25 @@
"resolved" "https://registry.npmjs.org/core-js/-/core-js-3.32.2.tgz"
"version" "3.32.2"
+"cross-spawn@^7.0.2", "cross-spawn@^7.0.3":
+ "integrity" "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w=="
+ "resolved" "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz"
+ "version" "7.0.3"
+ dependencies:
+ "path-key" "^3.1.0"
+ "shebang-command" "^2.0.0"
+ "which" "^2.0.1"
+
"crypto-random-string@^2.0.0":
"integrity" "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA=="
"resolved" "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz"
"version" "2.0.0"
+"cssesc@^3.0.0":
+ "integrity" "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg=="
+ "resolved" "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz"
+ "version" "3.0.0"
+
"csstype@^3.1.1":
"integrity" "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ=="
"resolved" "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz"
@@ -2056,7 +2327,7 @@
"resolved" "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz"
"version" "1.0.2"
-"debug@^4.1.0", "debug@^4.1.1", "debug@^4.3.4", "debug@~4.3.1", "debug@~4.3.2":
+"debug@^4.1.0", "debug@^4.1.1", "debug@^4.3.2", "debug@^4.3.4", "debug@~4.3.1", "debug@~4.3.2":
"integrity" "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ=="
"resolved" "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz"
"version" "4.3.4"
@@ -2092,11 +2363,39 @@
"resolved" "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz"
"version" "0.6.0"
+"deep-is@^0.1.3":
+ "integrity" "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ=="
+ "resolved" "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz"
+ "version" "0.1.4"
+
"deepmerge@^4.2.2":
"integrity" "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg=="
"resolved" "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz"
"version" "4.2.2"
+"default-browser-id@^3.0.0":
+ "integrity" "sha512-OZ1y3y0SqSICtE8DE4S8YOE9UZOJ8wO16fKWVP5J1Qz42kV9jcnMVFrEE/noXb/ss3Q4pZIH79kxofzyNNtUNA=="
+ "resolved" "https://registry.npmjs.org/default-browser-id/-/default-browser-id-3.0.0.tgz"
+ "version" "3.0.0"
+ dependencies:
+ "bplist-parser" "^0.2.0"
+ "untildify" "^4.0.0"
+
+"default-browser@^4.0.0":
+ "integrity" "sha512-wX5pXO1+BrhMkSbROFsyxUm0i/cJEScyNhA4PPxc41ICuv05ZZB/MX28s8aZx6xjmatvebIapF6hLEKEcpneUA=="
+ "resolved" "https://registry.npmjs.org/default-browser/-/default-browser-4.0.0.tgz"
+ "version" "4.0.0"
+ dependencies:
+ "bundle-name" "^3.0.0"
+ "default-browser-id" "^3.0.0"
+ "execa" "^7.1.1"
+ "titleize" "^3.0.0"
+
+"define-lazy-prop@^3.0.0":
+ "integrity" "sha512-N+MeXYoqr3pOgn8xfyRPREN7gHakLYjhsHhWGT3fWAiL4IkAt0iDw14QiiEm2bE30c5XX5q0FtAA3CK5f9/BUg=="
+ "resolved" "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-3.0.0.tgz"
+ "version" "3.0.0"
+
"define-properties@^1.1.3", "define-properties@^1.1.4":
"integrity" "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA=="
"resolved" "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz"
@@ -2120,6 +2419,20 @@
"resolved" "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz"
"version" "2.0.2"
+"dir-glob@^3.0.1":
+ "integrity" "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA=="
+ "resolved" "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz"
+ "version" "3.0.1"
+ dependencies:
+ "path-type" "^4.0.0"
+
+"doctrine@^3.0.0":
+ "integrity" "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w=="
+ "resolved" "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz"
+ "version" "3.0.0"
+ dependencies:
+ "esutils" "^2.0.2"
+
"dotenv@^16.3.1":
"integrity" "sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ=="
"resolved" "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz"
@@ -2243,6 +2556,122 @@
"resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz"
"version" "1.0.5"
+"escape-string-regexp@^4.0.0":
+ "integrity" "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA=="
+ "resolved" "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz"
+ "version" "4.0.0"
+
+"eslint-config-prettier@^8.8.0":
+ "integrity" "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg=="
+ "resolved" "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz"
+ "version" "8.10.0"
+
+"eslint-plugin-prettier@^5.0.0":
+ "integrity" "sha512-m3u5RnR56asrwV/lDC4GHorlW75DsFfmUcjfCYylTUs85dBRnB7VM6xG8eCMJdeDRnppzmxZVf1GEPJvl1JmNg=="
+ "resolved" "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.0.1.tgz"
+ "version" "5.0.1"
+ dependencies:
+ "prettier-linter-helpers" "^1.0.0"
+ "synckit" "^0.8.5"
+
+"eslint-plugin-vue@^9.0.0", "eslint-plugin-vue@^9.17.0":
+ "integrity" "sha512-7hZFlrEgg9NIzuVik2I9xSnJA5RsmOfueYgsUGUokEDLJ1LHtxO0Pl4duje1BriZ/jDWb+44tcIlC3yi0tdlZg=="
+ "resolved" "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.18.1.tgz"
+ "version" "9.18.1"
+ dependencies:
+ "@eslint-community/eslint-utils" "^4.4.0"
+ "natural-compare" "^1.4.0"
+ "nth-check" "^2.1.1"
+ "postcss-selector-parser" "^6.0.13"
+ "semver" "^7.5.4"
+ "vue-eslint-parser" "^9.3.1"
+ "xml-name-validator" "^4.0.0"
+
+"eslint-scope@^7.1.1", "eslint-scope@^7.2.2":
+ "integrity" "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg=="
+ "resolved" "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz"
+ "version" "7.2.2"
+ dependencies:
+ "esrecurse" "^4.3.0"
+ "estraverse" "^5.2.0"
+
+"eslint-visitor-keys@^3.3.0", "eslint-visitor-keys@^3.4.1", "eslint-visitor-keys@^3.4.3":
+ "integrity" "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="
+ "resolved" "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz"
+ "version" "3.4.3"
+
+"eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^6.2.0 || ^7.0.0 || ^8.0.0", "eslint@^7.0.0 || ^8.0.0", "eslint@^8.49.0", "eslint@>= 8.0.0", "eslint@>=6.0.0", "eslint@>=7.0.0", "eslint@>=8.0.0":
+ "integrity" "sha512-zh/JHnaixqHZsolRB/w9/02akBk9EPrOs9JwcTP2ek7yL5bVvXuRariiaAjjoJ5DvuwQ1WAE/HsMz+w17YgBCg=="
+ "resolved" "https://registry.npmjs.org/eslint/-/eslint-8.52.0.tgz"
+ "version" "8.52.0"
+ dependencies:
+ "@eslint-community/eslint-utils" "^4.2.0"
+ "@eslint-community/regexpp" "^4.6.1"
+ "@eslint/eslintrc" "^2.1.2"
+ "@eslint/js" "8.52.0"
+ "@humanwhocodes/config-array" "^0.11.13"
+ "@humanwhocodes/module-importer" "^1.0.1"
+ "@nodelib/fs.walk" "^1.2.8"
+ "@ungap/structured-clone" "^1.2.0"
+ "ajv" "^6.12.4"
+ "chalk" "^4.0.0"
+ "cross-spawn" "^7.0.2"
+ "debug" "^4.3.2"
+ "doctrine" "^3.0.0"
+ "escape-string-regexp" "^4.0.0"
+ "eslint-scope" "^7.2.2"
+ "eslint-visitor-keys" "^3.4.3"
+ "espree" "^9.6.1"
+ "esquery" "^1.4.2"
+ "esutils" "^2.0.2"
+ "fast-deep-equal" "^3.1.3"
+ "file-entry-cache" "^6.0.1"
+ "find-up" "^5.0.0"
+ "glob-parent" "^6.0.2"
+ "globals" "^13.19.0"
+ "graphemer" "^1.4.0"
+ "ignore" "^5.2.0"
+ "imurmurhash" "^0.1.4"
+ "is-glob" "^4.0.0"
+ "is-path-inside" "^3.0.3"
+ "js-yaml" "^4.1.0"
+ "json-stable-stringify-without-jsonify" "^1.0.1"
+ "levn" "^0.4.1"
+ "lodash.merge" "^4.6.2"
+ "minimatch" "^3.1.2"
+ "natural-compare" "^1.4.0"
+ "optionator" "^0.9.3"
+ "strip-ansi" "^6.0.1"
+ "text-table" "^0.2.0"
+
+"espree@^9.3.1", "espree@^9.6.0", "espree@^9.6.1":
+ "integrity" "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ=="
+ "resolved" "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz"
+ "version" "9.6.1"
+ dependencies:
+ "acorn" "^8.9.0"
+ "acorn-jsx" "^5.3.2"
+ "eslint-visitor-keys" "^3.4.1"
+
+"esquery@^1.4.0", "esquery@^1.4.2":
+ "integrity" "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg=="
+ "resolved" "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz"
+ "version" "1.5.0"
+ dependencies:
+ "estraverse" "^5.1.0"
+
+"esrecurse@^4.3.0":
+ "integrity" "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag=="
+ "resolved" "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz"
+ "version" "4.3.0"
+ dependencies:
+ "estraverse" "^5.2.0"
+
+"estraverse@^5.1.0", "estraverse@^5.2.0":
+ "integrity" "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA=="
+ "resolved" "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz"
+ "version" "5.3.0"
+
"estree-walker@^1.0.1":
"integrity" "sha512-1fMXF3YP4pZZVozF8j/ZLfvnR8NSIljt56UhbZ5PeeDmmGHpgpdwQt7ITlGvYaQukCvuBRMLEiKiYC+oeIg4cg=="
"resolved" "https://registry.npmjs.org/estree-walker/-/estree-walker-1.0.1.tgz"
@@ -2258,22 +2687,57 @@
"resolved" "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz"
"version" "2.0.3"
+"execa@^5.0.0":
+ "integrity" "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg=="
+ "resolved" "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz"
+ "version" "5.1.1"
+ dependencies:
+ "cross-spawn" "^7.0.3"
+ "get-stream" "^6.0.0"
+ "human-signals" "^2.1.0"
+ "is-stream" "^2.0.0"
+ "merge-stream" "^2.0.0"
+ "npm-run-path" "^4.0.1"
+ "onetime" "^5.1.2"
+ "signal-exit" "^3.0.3"
+ "strip-final-newline" "^2.0.0"
+
+"execa@^7.1.1":
+ "integrity" "sha512-UduyVP7TLB5IcAQl+OzLyLcS/l32W/GLg+AhHJ+ow40FOk2U3SAllPwR44v4vmdFwIWqpdwxxpQbF1n5ta9seA=="
+ "resolved" "https://registry.npmjs.org/execa/-/execa-7.2.0.tgz"
+ "version" "7.2.0"
+ dependencies:
+ "cross-spawn" "^7.0.3"
+ "get-stream" "^6.0.1"
+ "human-signals" "^4.3.0"
+ "is-stream" "^3.0.0"
+ "merge-stream" "^2.0.0"
+ "npm-run-path" "^5.1.0"
+ "onetime" "^6.0.0"
+ "signal-exit" "^3.0.7"
+ "strip-final-newline" "^3.0.0"
+
"expand-template@^2.0.3":
"integrity" "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg=="
"resolved" "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz"
"version" "2.0.3"
-"fast-deep-equal@^3.1.1":
+"fast-deep-equal@^3.1.1", "fast-deep-equal@^3.1.3":
"integrity" "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
"resolved" "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz"
"version" "3.1.3"
+"fast-diff@^1.1.2":
+ "integrity" "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw=="
+ "resolved" "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz"
+ "version" "1.3.0"
+
"fast-fifo@^1.1.0", "fast-fifo@^1.2.0":
"integrity" "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ=="
"resolved" "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz"
"version" "1.3.2"
-"fast-glob@^3.3.1":
+"fast-glob@^3.2.9", "fast-glob@^3.3.0", "fast-glob@^3.3.1":
"integrity" "sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg=="
"resolved" "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz"
"version" "3.3.1"
@@ -2284,11 +2748,16 @@
"merge2" "^1.3.0"
"micromatch" "^4.0.4"
-"fast-json-stable-stringify@^2.1.0":
+"fast-json-stable-stringify@^2.0.0", "fast-json-stable-stringify@^2.1.0":
"integrity" "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
"resolved" "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz"
"version" "2.1.0"
+"fast-levenshtein@^2.0.6":
+ "integrity" "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw=="
+ "resolved" "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz"
+ "version" "2.0.6"
+
"fastq@^1.6.0":
"integrity" "sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg=="
"resolved" "https://registry.npmjs.org/fastq/-/fastq-1.14.0.tgz"
@@ -2303,6 +2772,13 @@
dependencies:
"websocket-driver" ">=0.5.1"
+"file-entry-cache@^6.0.1":
+ "integrity" "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg=="
+ "resolved" "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz"
+ "version" "6.0.1"
+ dependencies:
+ "flat-cache" "^3.0.4"
+
"filelist@^1.0.1":
"integrity" "sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q=="
"resolved" "https://registry.npmjs.org/filelist/-/filelist-1.0.4.tgz"
@@ -2317,6 +2793,14 @@
dependencies:
"to-regex-range" "^5.0.1"
+"find-up@^5.0.0":
+ "integrity" "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng=="
+ "resolved" "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz"
+ "version" "5.0.0"
+ dependencies:
+ "locate-path" "^6.0.0"
+ "path-exists" "^4.0.0"
+
"firebase@^10.4.0":
"integrity" "sha512-3Z8WsNwA7kbcKGZ+nrTZ/ES518pk0K440ZJYD8nUNKN5hV6ll+unhUw30t1msedN6yIFjhsC/9OwT4Z0ohwO2w=="
"resolved" "https://registry.npmjs.org/firebase/-/firebase-10.4.0.tgz"
@@ -2349,6 +2833,20 @@
"@firebase/storage-compat" "0.3.2"
"@firebase/util" "1.9.3"
+"flat-cache@^3.0.4":
+ "integrity" "sha512-/qM2b3LUIaIgviBQovTLvijfyOQXPtSRnRK26ksj2J7rzPIecePUIpJsZ4T02Qg+xiAEKIs5K8dsHEd+VaKa/Q=="
+ "resolved" "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.1.tgz"
+ "version" "3.1.1"
+ dependencies:
+ "flatted" "^3.2.9"
+ "keyv" "^4.5.3"
+ "rimraf" "^3.0.2"
+
+"flatted@^3.2.9":
+ "integrity" "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ=="
+ "resolved" "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz"
+ "version" "3.2.9"
+
"follow-redirects@^1.15.0":
"integrity" "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA=="
"resolved" "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz"
@@ -2427,6 +2925,11 @@
"resolved" "https://registry.npmjs.org/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz"
"version" "3.0.2"
+"get-stream@^6.0.0", "get-stream@^6.0.1":
+ "integrity" "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg=="
+ "resolved" "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz"
+ "version" "6.0.1"
+
"get-symbol-description@^1.0.0":
"integrity" "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw=="
"resolved" "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz"
@@ -2447,7 +2950,14 @@
dependencies:
"is-glob" "^4.0.1"
-"glob@^7.1.6":
+"glob-parent@^6.0.2":
+ "integrity" "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A=="
+ "resolved" "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz"
+ "version" "6.0.2"
+ dependencies:
+ "is-glob" "^4.0.3"
+
+"glob@^7.1.3", "glob@^7.1.6":
"integrity" "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q=="
"resolved" "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz"
"version" "7.2.3"
@@ -2464,6 +2974,25 @@
"resolved" "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz"
"version" "11.12.0"
+"globals@^13.19.0":
+ "integrity" "sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA=="
+ "resolved" "https://registry.npmjs.org/globals/-/globals-13.23.0.tgz"
+ "version" "13.23.0"
+ dependencies:
+ "type-fest" "^0.20.2"
+
+"globby@^11.1.0":
+ "integrity" "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g=="
+ "resolved" "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz"
+ "version" "11.1.0"
+ dependencies:
+ "array-union" "^2.1.0"
+ "dir-glob" "^3.0.1"
+ "fast-glob" "^3.2.9"
+ "ignore" "^5.2.0"
+ "merge2" "^1.4.1"
+ "slash" "^3.0.0"
+
"gopd@^1.0.1":
"integrity" "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA=="
"resolved" "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz"
@@ -2476,6 +3005,11 @@
"resolved" "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz"
"version" "4.2.10"
+"graphemer@^1.4.0":
+ "integrity" "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag=="
+ "resolved" "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz"
+ "version" "1.4.0"
+
"has-bigints@^1.0.1", "has-bigints@^1.0.2":
"integrity" "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ=="
"resolved" "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz"
@@ -2532,6 +3066,16 @@
"resolved" "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz"
"version" "0.5.8"
+"human-signals@^2.1.0":
+ "integrity" "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw=="
+ "resolved" "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz"
+ "version" "2.1.0"
+
+"human-signals@^4.3.0":
+ "integrity" "sha512-nZXjEF2nbo7lIw3mgYjItAfgQXog3OjJogSbKa2CQIIvSGWcKgeJnQlNXip6NglNzYH45nSRiEVimMvYL8DDqQ=="
+ "resolved" "https://registry.npmjs.org/human-signals/-/human-signals-4.3.1.tgz"
+ "version" "4.3.1"
+
"ico-endec@*":
"integrity" "sha512-ZdLU38ZoED3g1j3iEyzcQj+wAkY2xfWNkymszfJPoxucIUhK7NayQ+/C4Kv0nDFMIsbtbEHldv3V8PU494/ueQ=="
"resolved" "https://registry.npmjs.org/ico-endec/-/ico-endec-0.1.6.tgz"
@@ -2552,11 +3096,29 @@
"resolved" "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz"
"version" "1.2.1"
+"ignore@^5.2.0", "ignore@^5.2.4":
+ "integrity" "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ=="
+ "resolved" "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz"
+ "version" "5.2.4"
+
"immutable@^4.0.0":
"integrity" "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ=="
"resolved" "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz"
"version" "4.1.0"
+"import-fresh@^3.2.1":
+ "integrity" "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw=="
+ "resolved" "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz"
+ "version" "3.3.0"
+ dependencies:
+ "parent-module" "^1.0.0"
+ "resolve-from" "^4.0.0"
+
+"imurmurhash@^0.1.4":
+ "integrity" "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="
+ "resolved" "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz"
+ "version" "0.1.4"
+
"inflight@^1.0.4":
"integrity" "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA=="
"resolved" "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz"
@@ -2630,6 +3192,16 @@
dependencies:
"has-tostringtag" "^1.0.0"
+"is-docker@^2.0.0":
+ "integrity" "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ=="
+ "resolved" "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz"
+ "version" "2.2.1"
+
+"is-docker@^3.0.0":
+ "integrity" "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ=="
+ "resolved" "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz"
+ "version" "3.0.0"
+
"is-extglob@^2.1.1":
"integrity" "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="
"resolved" "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz"
@@ -2640,13 +3212,20 @@
"resolved" "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz"
"version" "3.0.0"
-"is-glob@^4.0.1", "is-glob@~4.0.1":
+"is-glob@^4.0.0", "is-glob@^4.0.1", "is-glob@^4.0.3", "is-glob@~4.0.1":
"integrity" "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="
"resolved" "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz"
"version" "4.0.3"
dependencies:
"is-extglob" "^2.1.1"
+"is-inside-container@^1.0.0":
+ "integrity" "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA=="
+ "resolved" "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz"
+ "version" "1.0.0"
+ dependencies:
+ "is-docker" "^3.0.0"
+
"is-module@^1.0.0":
"integrity" "sha512-51ypPSPCoTEIN9dy5Oy+h4pShgJmPCygKfyRCISBI+JoWT/2oJvK8QPxmwv7b/p239jXrm9M1mlQbyKJ5A152g=="
"resolved" "https://registry.npmjs.org/is-module/-/is-module-1.0.0.tgz"
@@ -2674,6 +3253,11 @@
"resolved" "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz"
"version" "1.0.1"
+"is-path-inside@^3.0.3":
+ "integrity" "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ=="
+ "resolved" "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz"
+ "version" "3.0.3"
+
"is-regex@^1.1.4":
"integrity" "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg=="
"resolved" "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz"
@@ -2699,6 +3283,11 @@
"resolved" "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz"
"version" "2.0.1"
+"is-stream@^3.0.0":
+ "integrity" "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA=="
+ "resolved" "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz"
+ "version" "3.0.0"
+
"is-string@^1.0.5", "is-string@^1.0.7":
"integrity" "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg=="
"resolved" "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz"
@@ -2720,6 +3309,18 @@
dependencies:
"call-bind" "^1.0.2"
+"is-wsl@^2.2.0":
+ "integrity" "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww=="
+ "resolved" "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz"
+ "version" "2.2.0"
+ dependencies:
+ "is-docker" "^2.0.0"
+
+"isexe@^2.0.0":
+ "integrity" "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="
+ "resolved" "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz"
+ "version" "2.0.0"
+
"jake@^10.8.5":
"integrity" "sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw=="
"resolved" "https://registry.npmjs.org/jake/-/jake-10.8.5.tgz"
@@ -2749,6 +3350,13 @@
"resolved" "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz"
"version" "4.0.0"
+"js-yaml@^4.1.0":
+ "integrity" "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA=="
+ "resolved" "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz"
+ "version" "4.1.0"
+ dependencies:
+ "argparse" "^2.0.1"
+
"jsesc@^2.5.1":
"integrity" "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA=="
"resolved" "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz"
@@ -2759,6 +3367,16 @@
"resolved" "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz"
"version" "0.5.0"
+"json-buffer@3.0.1":
+ "integrity" "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ=="
+ "resolved" "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz"
+ "version" "3.0.1"
+
+"json-schema-traverse@^0.4.1":
+ "integrity" "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
+ "resolved" "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz"
+ "version" "0.4.1"
+
"json-schema-traverse@^1.0.0":
"integrity" "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="
"resolved" "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz"
@@ -2769,6 +3387,11 @@
"resolved" "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz"
"version" "0.4.0"
+"json-stable-stringify-without-jsonify@^1.0.1":
+ "integrity" "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw=="
+ "resolved" "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz"
+ "version" "1.0.1"
+
"json5@^2.2.0", "json5@^2.2.1":
"integrity" "sha512-46Tk9JiOL2z7ytNQWFLpj99RZkVgeHf87yGQKsIkaPz1qSH9UczKH1rO7K3wgRselo0tYMUNfecYpm/p1vC7tQ=="
"resolved" "https://registry.npmjs.org/json5/-/json5-2.2.2.tgz"
@@ -2793,11 +3416,33 @@
"resolved" "https://registry.npmjs.org/jsonpointer/-/jsonpointer-5.0.1.tgz"
"version" "5.0.1"
+"keyv@^4.5.3":
+ "integrity" "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw=="
+ "resolved" "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz"
+ "version" "4.5.4"
+ dependencies:
+ "json-buffer" "3.0.1"
+
"leven@^3.1.0":
"integrity" "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A=="
"resolved" "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz"
"version" "3.1.0"
+"levn@^0.4.1":
+ "integrity" "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ=="
+ "resolved" "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz"
+ "version" "0.4.1"
+ dependencies:
+ "prelude-ls" "^1.2.1"
+ "type-check" "~0.4.0"
+
+"locate-path@^6.0.0":
+ "integrity" "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw=="
+ "resolved" "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz"
+ "version" "6.0.0"
+ dependencies:
+ "p-locate" "^5.0.0"
+
"lodash.camelcase@^4.3.0":
"integrity" "sha512-TwuEnCnxbc3rAvhf/LbG7tJUDzhqXyFnv3dtzLOPgCG/hODL7WFnsbwktkD7yUV0RrreP/l1PALq/YSg6VvjlA=="
"resolved" "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz"
@@ -2808,12 +3453,17 @@
"resolved" "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz"
"version" "4.0.8"
+"lodash.merge@^4.6.2":
+ "integrity" "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ=="
+ "resolved" "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz"
+ "version" "4.6.2"
+
"lodash.sortby@^4.7.0":
"integrity" "sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA=="
"resolved" "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz"
"version" "4.7.0"
-"lodash@^4.17.20":
+"lodash@^4.17.20", "lodash@^4.17.21":
"integrity" "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
"resolved" "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz"
"version" "4.17.21"
@@ -2856,7 +3506,7 @@
"resolved" "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz"
"version" "2.0.0"
-"merge2@^1.3.0":
+"merge2@^1.3.0", "merge2@^1.4.1":
"integrity" "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="
"resolved" "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz"
"version" "1.4.1"
@@ -2881,12 +3531,22 @@
dependencies:
"mime-db" "1.52.0"
+"mimic-fn@^2.1.0":
+ "integrity" "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg=="
+ "resolved" "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz"
+ "version" "2.1.0"
+
+"mimic-fn@^4.0.0":
+ "integrity" "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw=="
+ "resolved" "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz"
+ "version" "4.0.0"
+
"mimic-response@^3.1.0":
"integrity" "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ=="
"resolved" "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz"
"version" "3.1.0"
-"minimatch@^3.0.4", "minimatch@^3.1.1":
+"minimatch@^3.0.4", "minimatch@^3.0.5", "minimatch@^3.1.1", "minimatch@^3.1.2":
"integrity" "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw=="
"resolved" "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz"
"version" "3.1.2"
@@ -2952,6 +3612,11 @@
"resolved" "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz"
"version" "1.0.2"
+"natural-compare@^1.4.0":
+ "integrity" "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="
+ "resolved" "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz"
+ "version" "1.4.0"
+
"node-abi@^3.3.0":
"integrity" "sha512-2s6B2CWZM//kPgwnuI0KrYwNjfdByE25zvAaEpq9IH4zcNsarH8Ihu/UuX6XMPEogDAxkuUFeZn60pXNHAqn3A=="
"resolved" "https://registry.npmjs.org/node-abi/-/node-abi-3.47.0.tgz"
@@ -2981,6 +3646,27 @@
"resolved" "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz"
"version" "3.0.0"
+"npm-run-path@^4.0.1":
+ "integrity" "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw=="
+ "resolved" "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz"
+ "version" "4.0.1"
+ dependencies:
+ "path-key" "^3.0.0"
+
+"npm-run-path@^5.1.0":
+ "integrity" "sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q=="
+ "resolved" "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.1.0.tgz"
+ "version" "5.1.0"
+ dependencies:
+ "path-key" "^4.0.0"
+
+"nth-check@^2.1.1":
+ "integrity" "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w=="
+ "resolved" "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz"
+ "version" "2.1.1"
+ dependencies:
+ "boolbase" "^1.0.0"
+
"object-inspect@^1.12.2", "object-inspect@^1.9.0":
"integrity" "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ=="
"resolved" "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz"
@@ -3008,16 +3694,93 @@
dependencies:
"wrappy" "1"
+"onetime@^5.1.2":
+ "integrity" "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg=="
+ "resolved" "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz"
+ "version" "5.1.2"
+ dependencies:
+ "mimic-fn" "^2.1.0"
+
+"onetime@^6.0.0":
+ "integrity" "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ=="
+ "resolved" "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz"
+ "version" "6.0.0"
+ dependencies:
+ "mimic-fn" "^4.0.0"
+
+"open@^9.1.0":
+ "integrity" "sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg=="
+ "resolved" "https://registry.npmjs.org/open/-/open-9.1.0.tgz"
+ "version" "9.1.0"
+ dependencies:
+ "default-browser" "^4.0.0"
+ "define-lazy-prop" "^3.0.0"
+ "is-inside-container" "^1.0.0"
+ "is-wsl" "^2.2.0"
+
+"optionator@^0.9.3":
+ "integrity" "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg=="
+ "resolved" "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz"
+ "version" "0.9.3"
+ dependencies:
+ "@aashutoshrathi/word-wrap" "^1.2.3"
+ "deep-is" "^0.1.3"
+ "fast-levenshtein" "^2.0.6"
+ "levn" "^0.4.1"
+ "prelude-ls" "^1.2.1"
+ "type-check" "^0.4.0"
+
+"p-limit@^3.0.2":
+ "integrity" "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ=="
+ "resolved" "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz"
+ "version" "3.1.0"
+ dependencies:
+ "yocto-queue" "^0.1.0"
+
+"p-locate@^5.0.0":
+ "integrity" "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw=="
+ "resolved" "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz"
+ "version" "5.0.0"
+ dependencies:
+ "p-limit" "^3.0.2"
+
+"parent-module@^1.0.0":
+ "integrity" "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g=="
+ "resolved" "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz"
+ "version" "1.0.1"
+ dependencies:
+ "callsites" "^3.0.0"
+
+"path-exists@^4.0.0":
+ "integrity" "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w=="
+ "resolved" "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz"
+ "version" "4.0.0"
+
"path-is-absolute@^1.0.0":
"integrity" "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg=="
"resolved" "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz"
"version" "1.0.1"
+"path-key@^3.0.0", "path-key@^3.1.0":
+ "integrity" "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q=="
+ "resolved" "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz"
+ "version" "3.1.1"
+
+"path-key@^4.0.0":
+ "integrity" "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ=="
+ "resolved" "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz"
+ "version" "4.0.0"
+
"path-parse@^1.0.7":
"integrity" "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
"resolved" "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz"
"version" "1.0.7"
+"path-type@^4.0.0":
+ "integrity" "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw=="
+ "resolved" "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz"
+ "version" "4.0.0"
+
"pathe@^1.1.0", "pathe@^1.1.1":
"integrity" "sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q=="
"resolved" "https://registry.npmjs.org/pathe/-/pathe-1.1.1.tgz"
@@ -3050,6 +3813,14 @@
"mlly" "^1.2.0"
"pathe" "^1.1.0"
+"postcss-selector-parser@^6.0.13":
+ "integrity" "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ=="
+ "resolved" "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz"
+ "version" "6.0.13"
+ dependencies:
+ "cssesc" "^3.0.0"
+ "util-deprecate" "^1.0.2"
+
"postcss@^8.1.10":
"integrity" "sha512-6Q04AXR1212bXr5fh03u8aAwbLxAQNGQ/Q1LNa0VfOI06ZAlhPHtQvE4OIdpj4kLThXilalPnmDSOD65DcHt+g=="
"resolved" "https://registry.npmjs.org/postcss/-/postcss-8.4.20.tgz"
@@ -3086,6 +3857,23 @@
"tar-fs" "^2.0.0"
"tunnel-agent" "^0.6.0"
+"prelude-ls@^1.2.1":
+ "integrity" "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g=="
+ "resolved" "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz"
+ "version" "1.2.1"
+
+"prettier-linter-helpers@^1.0.0":
+ "integrity" "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w=="
+ "resolved" "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz"
+ "version" "1.0.0"
+ dependencies:
+ "fast-diff" "^1.1.2"
+
+"prettier@^3.0.3", "prettier@>= 3.0.0", "prettier@>=3.0.0":
+ "integrity" "sha512-L/4pUDMxcNa8R/EthV08Zt42WBO4h1rarVtK0K+QJG0X187OLo7l699jWw0GKuwzkPQ//jMFA/8Xm6Fh3J/DAg=="
+ "resolved" "https://registry.npmjs.org/prettier/-/prettier-3.0.3.tgz"
+ "version" "3.0.3"
+
"pretty-bytes@^5.3.0":
"integrity" "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg=="
"resolved" "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz"
@@ -3242,6 +4030,11 @@
"resolved" "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz"
"version" "2.0.2"
+"resolve-from@^4.0.0":
+ "integrity" "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g=="
+ "resolved" "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz"
+ "version" "4.0.0"
+
"resolve@^1.14.2", "resolve@^1.19.0":
"integrity" "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw=="
"resolved" "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz"
@@ -3256,6 +4049,13 @@
"resolved" "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz"
"version" "1.0.4"
+"rimraf@^3.0.2":
+ "integrity" "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA=="
+ "resolved" "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz"
+ "version" "3.0.2"
+ dependencies:
+ "glob" "^7.1.3"
+
"rollup-plugin-terser@^7.0.0":
"integrity" "sha512-w3iIaU4OxcF52UUXiZNsNeuXIMDvFrr+ZXK6bFZ0Q60qyVfq4uLptoS4bbq3paG3x216eQllFZX7zt6TIImguQ=="
"resolved" "https://registry.npmjs.org/rollup-plugin-terser/-/rollup-plugin-terser-7.0.2.tgz"
@@ -3280,6 +4080,13 @@
optionalDependencies:
"fsevents" "~2.3.2"
+"run-applescript@^5.0.0":
+ "integrity" "sha512-XcT5rBksx1QdIhlFOCtgZkB99ZEouFZ1E2Kc2LHqNW13U3/74YGdkQRmThTwxy4QIyookibDKYZOPqX//6BlAg=="
+ "resolved" "https://registry.npmjs.org/run-applescript/-/run-applescript-5.0.0.tgz"
+ "version" "5.0.0"
+ dependencies:
+ "execa" "^5.0.0"
+
"run-parallel@^1.1.9":
"integrity" "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="
"resolved" "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz"
@@ -3327,6 +4134,13 @@
dependencies:
"lru-cache" "^6.0.0"
+"semver@^7.3.6":
+ "integrity" "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA=="
+ "resolved" "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz"
+ "version" "7.5.4"
+ dependencies:
+ "lru-cache" "^6.0.0"
+
"semver@^7.3.8":
"integrity" "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA=="
"resolved" "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz"
@@ -3371,6 +4185,18 @@
"tar-fs" "^3.0.4"
"tunnel-agent" "^0.6.0"
+"shebang-command@^2.0.0":
+ "integrity" "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="
+ "resolved" "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz"
+ "version" "2.0.0"
+ dependencies:
+ "shebang-regex" "^3.0.0"
+
+"shebang-regex@^3.0.0":
+ "integrity" "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A=="
+ "resolved" "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz"
+ "version" "3.0.0"
+
"side-channel@^1.0.4":
"integrity" "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw=="
"resolved" "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz"
@@ -3380,6 +4206,11 @@
"get-intrinsic" "^1.0.2"
"object-inspect" "^1.9.0"
+"signal-exit@^3.0.3", "signal-exit@^3.0.7":
+ "integrity" "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="
+ "resolved" "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz"
+ "version" "3.0.7"
+
"simple-concat@^1.0.0":
"integrity" "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q=="
"resolved" "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz"
@@ -3401,6 +4232,11 @@
dependencies:
"is-arrayish" "^0.3.1"
+"slash@^3.0.0":
+ "integrity" "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q=="
+ "resolved" "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz"
+ "version" "3.0.0"
+
"socket.io-client@^4.7.2":
"integrity" "sha512-vtA0uD4ibrYD793SOIAwlo8cj6haOeMHrGvwPxJsxH7CeIksqJ+3Zc06RvWTIFgiSqx4A3sOnTXpfAEE2Zyz6w=="
"resolved" "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.7.2.tgz"
@@ -3526,6 +4362,21 @@
"resolved" "https://registry.npmjs.org/strip-comments/-/strip-comments-2.0.1.tgz"
"version" "2.0.1"
+"strip-final-newline@^2.0.0":
+ "integrity" "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA=="
+ "resolved" "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz"
+ "version" "2.0.0"
+
+"strip-final-newline@^3.0.0":
+ "integrity" "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw=="
+ "resolved" "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz"
+ "version" "3.0.0"
+
+"strip-json-comments@^3.1.1":
+ "integrity" "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig=="
+ "resolved" "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz"
+ "version" "3.1.1"
+
"strip-json-comments@~2.0.1":
"integrity" "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="
"resolved" "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz"
@@ -3550,6 +4401,14 @@
"resolved" "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz"
"version" "1.0.0"
+"synckit@^0.8.5":
+ "integrity" "sha512-L1dapNV6vu2s/4Sputv8xGsCdAVlb5nRDMFU/E27D44l5U6cw1g0dGd45uLc+OXjNMmF4ntiMdCimzcjFKQI8Q=="
+ "resolved" "https://registry.npmjs.org/synckit/-/synckit-0.8.5.tgz"
+ "version" "0.8.5"
+ dependencies:
+ "@pkgr/utils" "^2.3.1"
+ "tslib" "^2.5.0"
+
"tar-fs@^2.0.0":
"integrity" "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng=="
"resolved" "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz"
@@ -3614,6 +4473,16 @@
"commander" "^2.20.0"
"source-map-support" "~0.5.20"
+"text-table@^0.2.0":
+ "integrity" "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw=="
+ "resolved" "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz"
+ "version" "0.2.0"
+
+"titleize@^3.0.0":
+ "integrity" "sha512-KxVu8EYHDPBdUYdKZdKtU2aj2XfEx9AfjXxE/Aj0vT06w2icA09Vus1rh6eSu1y01akYg6BjIK/hxyLJINoMLQ=="
+ "resolved" "https://registry.npmjs.org/titleize/-/titleize-3.0.0.tgz"
+ "version" "3.0.0"
+
"to-data-view@^1.1.0":
"integrity" "sha512-1eAdufMg6mwgmlojAx3QeMnzB/BTVp7Tbndi3U7ftcT2zCZadjxkkmLmd97zmaxWi+sgGcgWrokmpEoy0Dn0vQ=="
"resolved" "https://registry.npmjs.org/to-data-view/-/to-data-view-1.1.0.tgz"
@@ -3643,10 +4512,15 @@
"resolved" "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz"
"version" "0.0.3"
-"tslib@^2.1.0":
- "integrity" "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ=="
- "resolved" "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz"
- "version" "2.4.0"
+"ts-api-utils@^1.0.1":
+ "integrity" "sha512-wNMeqtMz5NtwpT/UZGY5alT+VoKdSsOOP/kqHFcUW1P/VRhH2wJ48+DN2WwUliNbQ976ETwDL0Ifd2VVvgonvg=="
+ "resolved" "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.0.3.tgz"
+ "version" "1.0.3"
+
+"tslib@^2.1.0", "tslib@^2.5.0", "tslib@^2.6.0":
+ "integrity" "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="
+ "resolved" "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz"
+ "version" "2.6.2"
"tunnel-agent@^0.6.0":
"integrity" "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w=="
@@ -3655,12 +4529,24 @@
dependencies:
"safe-buffer" "^5.0.1"
+"type-check@^0.4.0", "type-check@~0.4.0":
+ "integrity" "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew=="
+ "resolved" "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz"
+ "version" "0.4.0"
+ dependencies:
+ "prelude-ls" "^1.2.1"
+
"type-fest@^0.16.0":
"integrity" "sha512-eaBzG6MxNzEn9kiwvtre90cXaNLkmadMWa1zQMs3XORCXNbsH/OewwbxC5ia9dCxIxnTAsSxXJaa/p5y8DlvJg=="
"resolved" "https://registry.npmjs.org/type-fest/-/type-fest-0.16.0.tgz"
"version" "0.16.0"
-"typescript@*", "typescript@^5.2.2", "typescript@>=4.4.4":
+"type-fest@^0.20.2":
+ "integrity" "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ=="
+ "resolved" "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz"
+ "version" "0.20.2"
+
+"typescript@*", "typescript@^5.2.2", "typescript@>=4.2.0", "typescript@>=4.4.4":
"integrity" "sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w=="
"resolved" "https://registry.npmjs.org/typescript/-/typescript-5.2.2.tgz"
"version" "5.2.2"
@@ -3725,6 +4611,11 @@
"resolved" "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz"
"version" "2.0.0"
+"untildify@^4.0.0":
+ "integrity" "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw=="
+ "resolved" "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz"
+ "version" "4.0.0"
+
"upath@^1.2.0":
"integrity" "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg=="
"resolved" "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz"
@@ -3745,7 +4636,7 @@
dependencies:
"punycode" "^2.1.0"
-"util-deprecate@^1.0.1":
+"util-deprecate@^1.0.1", "util-deprecate@^1.0.2":
"integrity" "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
"resolved" "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz"
"version" "1.0.2"
@@ -3777,6 +4668,19 @@
"resolved" "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.6.tgz"
"version" "0.14.6"
+"vue-eslint-parser@^9.3.1":
+ "integrity" "sha512-q7tWyCVaV9f8iQyIA5Mkj/S6AoJ9KBN8IeUSf3XEmBrOtxOZnfTg5s4KClbZBCK3GtnT/+RyCLZyDHuZwTuBjg=="
+ "resolved" "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.3.2.tgz"
+ "version" "9.3.2"
+ dependencies:
+ "debug" "^4.3.4"
+ "eslint-scope" "^7.1.1"
+ "eslint-visitor-keys" "^3.3.0"
+ "espree" "^9.3.1"
+ "esquery" "^1.4.0"
+ "lodash" "^4.17.21"
+ "semver" "^7.3.6"
+
"vue-i18n@^9.4.1":
"integrity" "sha512-vnQyYE9LBuNOqPpETIcCaGnAyLEqfeIvDcyZ9T+WBCWFTqWw1J8FuF1jfeDwpHBi5JKgAwgXyq1mt8jp/x/GPA=="
"resolved" "https://registry.npmjs.org/vue-i18n/-/vue-i18n-9.4.1.tgz"
@@ -3873,6 +4777,13 @@
"is-string" "^1.0.5"
"is-symbol" "^1.0.3"
+"which@^2.0.1":
+ "integrity" "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="
+ "resolved" "https://registry.npmjs.org/which/-/which-2.0.2.tgz"
+ "version" "2.0.2"
+ dependencies:
+ "isexe" "^2.0.0"
+
"workbox-background-sync@7.0.0":
"integrity" "sha512-S+m1+84gjdueM+jIKZ+I0Lx0BDHkk5Nu6a3kTVxP4fdj3gKouRNmhO8H290ybnJTOPfBDtTMXSQA/QLTvr7PeA=="
"resolved" "https://registry.npmjs.org/workbox-background-sync/-/workbox-background-sync-7.0.0.tgz"
@@ -4050,6 +4961,11 @@
"resolved" "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz"
"version" "8.11.0"
+"xml-name-validator@^4.0.0":
+ "integrity" "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw=="
+ "resolved" "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz"
+ "version" "4.0.0"
+
"xmlhttprequest-ssl@~2.0.0":
"integrity" "sha512-QKxVRxiRACQcVuQEYFsI1hhkrMlrXHPegbbd1yn9UHOmRxY+si12nQYzri3vbzt8VdTTRviqcKxcyllFas5z2A=="
"resolved" "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.0.0.tgz"
@@ -4087,3 +5003,8 @@
"string-width" "^4.2.3"
"y18n" "^5.0.5"
"yargs-parser" "^21.1.1"
+
+"yocto-queue@^0.1.0":
+ "integrity" "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q=="
+ "resolved" "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz"
+ "version" "0.1.0"