mirror of
https://github.com/Spythere/stacjownik.git
synced 2026-05-03 13:28:11 +00:00
refactor typów danych
This commit is contained in:
+5
-8
@@ -39,12 +39,12 @@ import Clock from './components/App/Clock.vue';
|
||||
import packageInfo from '.././package.json';
|
||||
import { regions } from './data/options.json';
|
||||
|
||||
import { useStore } from './store/store';
|
||||
import { useStore } from './store/mainStore';
|
||||
import StatusIndicator from './components/App/StatusIndicator.vue';
|
||||
import TrainModal from './components/Global/TrainModal.vue';
|
||||
import StorageManager from './scripts/managers/storageManager';
|
||||
import AppHeader from './components/App/AppHeader.vue';
|
||||
import axios from 'axios';
|
||||
import StorageManager from './managers/storageManager';
|
||||
|
||||
export default defineComponent({
|
||||
components: {
|
||||
@@ -72,12 +72,9 @@ export default defineComponent({
|
||||
window.addEventListener('offline', () => {
|
||||
this.store.isOffline = true;
|
||||
|
||||
this.store.apiData = {
|
||||
stations: [],
|
||||
dispatchers: [],
|
||||
trains: [],
|
||||
connectedSocketCount: 0
|
||||
};
|
||||
this.store.activeData.sceneries = [];
|
||||
this.store.activeData.trains = [];
|
||||
this.store.activeData.connectedSocketCount = 0;
|
||||
|
||||
this.store.setStatuses();
|
||||
});
|
||||
|
||||
@@ -68,7 +68,7 @@
|
||||
</template>
|
||||
<script lang="ts">
|
||||
import { defineComponent } from 'vue';
|
||||
import { useStore } from '../../store/store';
|
||||
import { useStore } from '../../store/mainStore';
|
||||
import StatusIndicator from './StatusIndicator.vue';
|
||||
import Clock from './Clock.vue';
|
||||
import RegionDropdown from '../Global/RegionDropdown.vue';
|
||||
|
||||
@@ -194,9 +194,9 @@
|
||||
|
||||
<script lang="ts">
|
||||
import { defineComponent } from 'vue';
|
||||
import { DataStatus } from '../../scripts/enums/DataStatus';
|
||||
import { useStore } from '../../store/store';
|
||||
import { StoreState } from '../../scripts/interfaces/store/storeTypes';
|
||||
import { StoreState } from '../../store/typings';
|
||||
import { useStore } from '../../store/mainStore';
|
||||
import { Status } from '../../typings/common';
|
||||
|
||||
export default defineComponent({
|
||||
data() {
|
||||
@@ -204,7 +204,7 @@ export default defineComponent({
|
||||
tooltipActive: false,
|
||||
indicator: {
|
||||
offline: false,
|
||||
status: DataStatus.Loading,
|
||||
status: Status.Data.Loading,
|
||||
message: 'data-status.S3'
|
||||
},
|
||||
|
||||
@@ -217,7 +217,7 @@ export default defineComponent({
|
||||
},
|
||||
|
||||
mounted() {
|
||||
this.setSignalStatus(DataStatus.Loading);
|
||||
this.setSignalStatus(Status.Data.Loading);
|
||||
},
|
||||
|
||||
setup() {
|
||||
@@ -240,44 +240,44 @@ export default defineComponent({
|
||||
const dispatcherDataStatus = statuses.dispatchers;
|
||||
|
||||
if (this.store.isOffline) {
|
||||
this.setSignalStatus(DataStatus.Initialized);
|
||||
this.indicator.status = DataStatus.Initialized;
|
||||
this.setSignalStatus(Status.Data.Initialized);
|
||||
this.indicator.status = Status.Data.Initialized;
|
||||
this.indicator.message = 'data-status.S1-offline';
|
||||
return;
|
||||
}
|
||||
|
||||
if (connectionStatus == DataStatus.Error) {
|
||||
if (connectionStatus == Status.Data.Error) {
|
||||
this.setSignalStatus(connectionStatus);
|
||||
this.indicator.status = connectionStatus;
|
||||
this.indicator.message = 'data-status.S1a-connection';
|
||||
return;
|
||||
}
|
||||
|
||||
if (sceneryDataStatus == DataStatus.Error) {
|
||||
if (sceneryDataStatus == Status.Data.Error) {
|
||||
this.setSignalStatus(sceneryDataStatus);
|
||||
this.indicator.status = sceneryDataStatus;
|
||||
this.indicator.message = 'data-status.S1a-sceneries';
|
||||
return;
|
||||
}
|
||||
|
||||
if (trainsDataStatus == DataStatus.Warning) {
|
||||
if (trainsDataStatus == Status.Data.Warning) {
|
||||
this.setSignalStatus(trainsDataStatus);
|
||||
this.indicator.status = trainsDataStatus;
|
||||
this.indicator.message = 'data-status.S5-trains';
|
||||
return;
|
||||
}
|
||||
|
||||
if (dispatcherDataStatus == DataStatus.Warning) {
|
||||
if (dispatcherDataStatus == Status.Data.Warning) {
|
||||
this.setSignalStatus(dispatcherDataStatus);
|
||||
this.indicator.status = dispatcherDataStatus;
|
||||
this.indicator.message = 'data-status.S5-dispatchers';
|
||||
return;
|
||||
}
|
||||
|
||||
if (sceneryDataStatus == DataStatus.Loaded) {
|
||||
this.setSignalStatus(DataStatus.Loaded);
|
||||
if (sceneryDataStatus == Status.Data.Loaded) {
|
||||
this.setSignalStatus(Status.Data.Loaded);
|
||||
|
||||
this.indicator.status = DataStatus.Loaded;
|
||||
this.indicator.status = Status.Data.Loaded;
|
||||
this.indicator.message = 'data-status.S2';
|
||||
}
|
||||
}
|
||||
@@ -285,31 +285,31 @@ export default defineComponent({
|
||||
},
|
||||
|
||||
methods: {
|
||||
setSignalStatus(status: DataStatus) {
|
||||
setSignalStatus(status: Status.Data) {
|
||||
this.greenLight = false;
|
||||
this.greenBlinkLight = false;
|
||||
this.redTopLight = false;
|
||||
this.orangeLight = false;
|
||||
this.redBottomLight = false;
|
||||
|
||||
if (status == DataStatus.Initialized) {
|
||||
if (status == Status.Data.Initialized) {
|
||||
this.redTopLight = true;
|
||||
}
|
||||
|
||||
if (status == DataStatus.Loaded) {
|
||||
if (status == Status.Data.Loaded) {
|
||||
this.greenLight = true;
|
||||
}
|
||||
|
||||
if (status == DataStatus.Warning) {
|
||||
if (status == Status.Data.Warning) {
|
||||
this.orangeLight = true;
|
||||
}
|
||||
|
||||
if (status == DataStatus.Error) {
|
||||
if (status == Status.Data.Error) {
|
||||
this.redTopLight = true;
|
||||
this.redBottomLight = true;
|
||||
}
|
||||
|
||||
if (status == DataStatus.Loading) {
|
||||
if (status == Status.Data.Loading) {
|
||||
this.greenBlinkLight = true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29,8 +29,8 @@
|
||||
|
||||
<script lang="ts">
|
||||
import { defineComponent, Ref, ref } from 'vue';
|
||||
import { useStore } from '../../store/store';
|
||||
import { regions as regionsJSON } from '../../data/options.json';
|
||||
import { useStore } from '../../store/mainStore';
|
||||
|
||||
interface Item {
|
||||
id: string;
|
||||
|
||||
@@ -16,12 +16,12 @@
|
||||
<script lang="ts">
|
||||
import { PropType, defineComponent } from 'vue';
|
||||
import dateMixin from '../../mixins/dateMixin';
|
||||
import { DispatcherStatus } from '../../scripts/enums/DispatcherStatus';
|
||||
import { Status } from '../../typings/common';
|
||||
|
||||
export default defineComponent({
|
||||
props: {
|
||||
dispatcherStatus: {
|
||||
type: Number as PropType<DispatcherStatus | number>
|
||||
type: Number as PropType<Status.ActiveDispatcher | number>
|
||||
},
|
||||
isOnline: {
|
||||
type: Boolean
|
||||
@@ -34,25 +34,25 @@ export default defineComponent({
|
||||
if (!this.dispatcherStatus) return 'free';
|
||||
|
||||
switch (this.dispatcherStatus) {
|
||||
case DispatcherStatus.AFK:
|
||||
case Status.ActiveDispatcher.AFK:
|
||||
return 'afk';
|
||||
|
||||
case DispatcherStatus.ENDING:
|
||||
case Status.ActiveDispatcher.ENDING:
|
||||
return 'ending';
|
||||
|
||||
case DispatcherStatus.INVALID:
|
||||
case Status.ActiveDispatcher.INVALID:
|
||||
return 'invalid';
|
||||
|
||||
case DispatcherStatus.NOT_LOGGED_IN:
|
||||
case Status.ActiveDispatcher.NOT_LOGGED_IN:
|
||||
return 'not-signed';
|
||||
|
||||
case DispatcherStatus.NO_SPACE:
|
||||
case Status.ActiveDispatcher.NO_SPACE:
|
||||
return 'no-space';
|
||||
|
||||
case DispatcherStatus.UNAVAILABLE:
|
||||
case Status.ActiveDispatcher.UNAVAILABLE:
|
||||
return 'unavailable';
|
||||
|
||||
case DispatcherStatus.UNKNOWN:
|
||||
case Status.ActiveDispatcher.UNKNOWN:
|
||||
return 'unknown';
|
||||
|
||||
default:
|
||||
|
||||
@@ -50,8 +50,8 @@
|
||||
|
||||
<script lang="ts">
|
||||
import { PropType, defineComponent } from 'vue';
|
||||
import { useStore } from '../../store/store';
|
||||
import { RollingStockInfo } from '../../scripts/interfaces/github_api/StockInfoGithubData';
|
||||
import { useStore } from '../../store/mainStore';
|
||||
import { API } from '../../typings/api';
|
||||
|
||||
export default defineComponent({
|
||||
props: {
|
||||
@@ -71,7 +71,7 @@ export default defineComponent({
|
||||
onImageError(event: Event, stockName: string) {
|
||||
const fallbackName =
|
||||
Object.keys(this.store.rollingStockData!.info).find((type) => {
|
||||
return this.store.rollingStockData!.info[type as keyof RollingStockInfo].find(
|
||||
return this.store.rollingStockData!.info[type as keyof API.RollingStock.Info].find(
|
||||
(v) => v[0] === stockName.split(':')[0]
|
||||
);
|
||||
}) || 'vehicle-unknown';
|
||||
|
||||
@@ -51,16 +51,16 @@
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { defineComponent } from 'vue';
|
||||
import { PropType, defineComponent } from 'vue';
|
||||
import dateMixin from '../../mixins/dateMixin';
|
||||
import TrainStop from '../../scripts/interfaces/TrainStop';
|
||||
import { TrainStop } from '../../store/typings';
|
||||
|
||||
export default defineComponent({
|
||||
mixins: [dateMixin],
|
||||
|
||||
props: {
|
||||
stop: {
|
||||
type: Object as () => TrainStop,
|
||||
type: Object as PropType<TrainStop>,
|
||||
required: true
|
||||
}
|
||||
},
|
||||
|
||||
@@ -16,7 +16,6 @@
|
||||
import { defineComponent } from 'vue';
|
||||
import modalTrainMixin from '../../mixins/modalTrainMixin';
|
||||
import trainInfoMixin from '../../mixins/trainInfoMixin';
|
||||
import { useStore } from '../../store/store';
|
||||
import TrainInfo from '../TrainsView/TrainInfo.vue';
|
||||
import TrainSchedule from '../TrainsView/TrainSchedule.vue';
|
||||
|
||||
@@ -30,14 +29,6 @@ export default defineComponent({
|
||||
};
|
||||
},
|
||||
|
||||
setup() {
|
||||
const store = useStore();
|
||||
|
||||
return {
|
||||
store
|
||||
};
|
||||
},
|
||||
|
||||
activated() {
|
||||
const contentEl = this.$refs['content'] as HTMLElement;
|
||||
|
||||
|
||||
@@ -16,8 +16,8 @@
|
||||
|
||||
<script lang="ts">
|
||||
import { defineComponent } from 'vue';
|
||||
import { useStore } from '../../store/store';
|
||||
import { RollingStockInfo } from '../../scripts/interfaces/github_api/StockInfoGithubData';
|
||||
import { useStore } from '../../store/mainStore';
|
||||
import { API } from '../../typings/api';
|
||||
|
||||
export default defineComponent({
|
||||
props: {
|
||||
@@ -54,7 +54,7 @@ export default defineComponent({
|
||||
|
||||
return (
|
||||
Object.keys(this.store.rollingStockData.info).find((type) => {
|
||||
return this.store.rollingStockData?.info[type as keyof RollingStockInfo].find(
|
||||
return this.store.rollingStockData?.info[type as keyof API.RollingStock.Info].find(
|
||||
(v) => v[0] === this.name.split(':')[0]
|
||||
);
|
||||
}) || 'vehicle-unknown'
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<template>
|
||||
<section class="daily-stats">
|
||||
<span :data-active="statsStatus">
|
||||
<b v-if="statsStatus == DataStatus.Loading">
|
||||
<b v-if="statsStatus == Status.Data.Loading">
|
||||
{{ $t('app.loading') }}
|
||||
</b>
|
||||
|
||||
@@ -32,24 +32,26 @@
|
||||
</i18n-t>
|
||||
</div>
|
||||
|
||||
<div v-if="stats.timetableId">
|
||||
<div v-if="stats.maxTimetable">
|
||||
•
|
||||
<i18n-t keypath="journal.timetable-stats-longest">
|
||||
<template #id>
|
||||
<router-link :to="`/journal/timetables?timetableId=${stats.timetableId}`">
|
||||
<b>{{ stats.timetableId }}</b>
|
||||
<router-link :to="`/journal/timetables?timetableId=${stats.maxTimetable.id}`">
|
||||
<b>{{ stats.maxTimetable.id }}</b>
|
||||
</router-link>
|
||||
</template>
|
||||
<template #author>
|
||||
<router-link :to="`/journal/dispatchers?dispatcherName=${stats.timetableAuthor}`">
|
||||
<b>{{ stats.timetableAuthor }}</b>
|
||||
<router-link
|
||||
:to="`/journal/dispatchers?dispatcherName=${stats.maxTimetable.authorName}`"
|
||||
>
|
||||
<b>{{ stats.maxTimetable.authorName }}</b>
|
||||
</router-link>
|
||||
</template>
|
||||
<template #driver>
|
||||
<b class="text--primary">{{ stats.timetableDriver }}</b>
|
||||
<b class="text--primary">{{ stats.maxTimetable.driverName }}</b>
|
||||
</template>
|
||||
<template #distance>
|
||||
<b class="text--primary">{{ stats.timetableRouteDistance }} km</b>
|
||||
<b class="text--primary">{{ stats.maxTimetable.routeDistance }} km</b>
|
||||
</template>
|
||||
</i18n-t>
|
||||
</div>
|
||||
@@ -134,12 +136,10 @@
|
||||
import axios from 'axios';
|
||||
import { defineComponent } from 'vue';
|
||||
import dateMixin from '../../mixins/dateMixin';
|
||||
import { DataStatus } from '../../scripts/enums/DataStatus';
|
||||
import {
|
||||
ITimetablesDailyStats,
|
||||
ITimetablesDailyStatsResponse
|
||||
} from '../../scripts/interfaces/api/StatsAPIData';
|
||||
|
||||
import { URLs } from '../../scripts/utils/apiURLs';
|
||||
import { API } from '../../typings/api';
|
||||
import { Status } from '../../typings/common';
|
||||
|
||||
export default defineComponent({
|
||||
mixins: [dateMixin],
|
||||
@@ -147,22 +147,11 @@ export default defineComponent({
|
||||
|
||||
data() {
|
||||
return {
|
||||
DataStatus,
|
||||
statsStatus: DataStatus.Loading,
|
||||
Status,
|
||||
statsStatus: Status.Data.Loading,
|
||||
intervalId: -1,
|
||||
|
||||
stats: {
|
||||
totalTimetables: 0,
|
||||
distanceSum: 0,
|
||||
distanceAvg: 0,
|
||||
timetableAuthor: '',
|
||||
timetableDriver: '',
|
||||
timetableId: 0,
|
||||
timetableRouteDistance: 0,
|
||||
longestDuties: [],
|
||||
mostActiveDrivers: [],
|
||||
mostActiveDispatchers: []
|
||||
} as ITimetablesDailyStats
|
||||
stats: {} as API.DailyStats.Response
|
||||
};
|
||||
},
|
||||
|
||||
@@ -187,28 +176,30 @@ export default defineComponent({
|
||||
methods: {
|
||||
async fetchDailyTimetableStats() {
|
||||
try {
|
||||
const res: ITimetablesDailyStatsResponse = await (
|
||||
const res: API.DailyStats.Response = await (
|
||||
await axios.get(`${URLs.stacjownikAPI}/api/getDailyTimetableStats`)
|
||||
).data;
|
||||
|
||||
this.stats = {
|
||||
totalTimetables: res.totalTimetables,
|
||||
distanceSum: res.distanceSum,
|
||||
distanceAvg: res.distanceAvg,
|
||||
timetableAuthor: res.maxTimetable?.authorName || '',
|
||||
timetableDriver: res.maxTimetable?.driverName || '',
|
||||
timetableId: res.maxTimetable?.id || 0,
|
||||
timetableRouteDistance: res.maxTimetable?.routeDistance || 0,
|
||||
// this.stats = {
|
||||
// totalTimetables: res.totalTimetables,
|
||||
// distanceSum: res.distanceSum,
|
||||
// distanceAvg: res.distanceAvg,
|
||||
// // timetableAuthor: res.maxTimetable?.authorName || '',
|
||||
// // timetableDriver: res.maxTimetable?.driverName || '',
|
||||
// // timetableId: res.maxTimetable?.id || 0,
|
||||
// // timetableRouteDistance: res.maxTimetable?.routeDistance || 0,
|
||||
|
||||
mostActiveDispatchers: res.mostActiveDispatchers,
|
||||
mostActiveDrivers: res.mostActiveDrivers,
|
||||
longestDuties: res.longestDuties
|
||||
};
|
||||
// mostActiveDispatchers: res.mostActiveDispatchers,
|
||||
// mostActiveDrivers: res.mostActiveDrivers,
|
||||
// longestDuties: res.longestDuties
|
||||
// };
|
||||
|
||||
this.statsStatus = DataStatus.Loaded;
|
||||
this.stats = res;
|
||||
|
||||
this.statsStatus = Status.Data.Loaded;
|
||||
} catch (error) {
|
||||
console.error('Ups! Wystąpił błąd podczas pobierania statystyk rozkładów jazdy...');
|
||||
this.statsStatus = DataStatus.Error;
|
||||
this.statsStatus = Status.Data.Error;
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
@@ -52,11 +52,10 @@
|
||||
<script lang="ts">
|
||||
import axios from 'axios';
|
||||
import { defineComponent } from 'vue';
|
||||
import { DispatcherStatsAPIData } from '../../scripts/interfaces/api/DispatcherStatsAPIData';
|
||||
import { TimetableHistory } from '../../scripts/interfaces/api/TimetablesAPIData';
|
||||
import { URLs } from '../../scripts/utils/apiURLs';
|
||||
import { useStore } from '../../store/store';
|
||||
import { useStore } from '../../store/mainStore';
|
||||
import Loading from '../Global/Loading.vue';
|
||||
import { API } from '../../typings/api';
|
||||
|
||||
export default defineComponent({
|
||||
components: { Loading },
|
||||
@@ -73,7 +72,7 @@ export default defineComponent({
|
||||
return {
|
||||
cardVisible: false,
|
||||
lastDispatcherName: '',
|
||||
timetables: [] as TimetableHistory[]
|
||||
timetables: [] as API.TimetableHistory.Response
|
||||
};
|
||||
},
|
||||
|
||||
@@ -90,13 +89,13 @@ export default defineComponent({
|
||||
this.store.dispatcherStatsData = undefined;
|
||||
}
|
||||
|
||||
const statsData: DispatcherStatsAPIData = await (
|
||||
const statsData: API.DispatcherStats.Response = await (
|
||||
await axios.get(
|
||||
`${URLs.stacjownikAPI}/api/getDispatcherInfo?name=${this.store.dispatcherStatsName}`
|
||||
)
|
||||
).data;
|
||||
|
||||
const timetables: TimetableHistory[] = await (
|
||||
const timetables: API.TimetableHistory.Response = await (
|
||||
await axios.get(
|
||||
`${URLs.stacjownikAPI}/api/getTimetables?authorName=${this.store.dispatcherStatsName}`
|
||||
)
|
||||
|
||||
@@ -6,9 +6,9 @@
|
||||
{{ $t('app.offline') }}
|
||||
</div>
|
||||
|
||||
<Loading v-else-if="dataStatus == DataStatus.Loading" />
|
||||
<Loading v-else-if="dataStatus == Status.Data.Loading" />
|
||||
|
||||
<div v-else-if="dataStatus == DataStatus.Error" class="journal_warning error">
|
||||
<div v-else-if="dataStatus == Status.Data.Error" class="journal_warning error">
|
||||
{{ $t('app.error') }}
|
||||
</div>
|
||||
|
||||
@@ -114,13 +114,13 @@
|
||||
<script lang="ts">
|
||||
import { defineComponent, PropType } from 'vue';
|
||||
import dateMixin from '../../mixins/dateMixin';
|
||||
import { DispatcherHistory } from '../../scripts/interfaces/api/DispatchersAPIData';
|
||||
import styleMixin from '../../mixins/styleMixin';
|
||||
import { DataStatus } from '../../scripts/enums/DataStatus';
|
||||
import { useStore } from '../../store/store';
|
||||
import { useStore } from '../../store/mainStore';
|
||||
import Loading from '../Global/Loading.vue';
|
||||
import { regions } from '../../data/options.json';
|
||||
import AddDataButton from '../Global/AddDataButton.vue';
|
||||
import { API } from '../../typings/api';
|
||||
import { Status } from '../../typings/common';
|
||||
|
||||
export default defineComponent({
|
||||
components: { Loading, AddDataButton },
|
||||
@@ -129,7 +129,7 @@ export default defineComponent({
|
||||
|
||||
props: {
|
||||
dispatcherHistory: {
|
||||
type: Array as PropType<DispatcherHistory[]>,
|
||||
type: Array as PropType<API.DispatcherHistory.Response>,
|
||||
required: true
|
||||
},
|
||||
scrollNoMoreData: {
|
||||
@@ -142,13 +142,13 @@ export default defineComponent({
|
||||
type: Function as PropType<() => void>
|
||||
},
|
||||
dataStatus: {
|
||||
type: Number as PropType<DataStatus>
|
||||
type: Number as PropType<Status.Data>
|
||||
}
|
||||
},
|
||||
|
||||
data() {
|
||||
return {
|
||||
DataStatus,
|
||||
Status,
|
||||
store: useStore(),
|
||||
regions
|
||||
};
|
||||
@@ -166,7 +166,7 @@ export default defineComponent({
|
||||
|
||||
return acc;
|
||||
},
|
||||
[] as (DispatcherHistory | string)[]
|
||||
[] as (API.DispatcherHistory.Data | string)[]
|
||||
);
|
||||
}
|
||||
},
|
||||
|
||||
@@ -43,10 +43,10 @@
|
||||
</div>
|
||||
</span>
|
||||
|
||||
<b v-else-if="store.driverStatsStatus == DataStatus.Loading">{{
|
||||
<b v-else-if="store.driverStatsStatus == Status.Data.Loading">{{
|
||||
$t('journal.stats-loading')
|
||||
}}</b>
|
||||
<b v-else-if="store.driverStatsStatus == DataStatus.Error">
|
||||
<b v-else-if="store.driverStatsStatus == Status.Data.Error">
|
||||
{{ $t('journal.stats-error ') }}
|
||||
</b>
|
||||
<b v-else>{{ $t('journal.driver-stats-info') }}</b>
|
||||
@@ -55,14 +55,14 @@
|
||||
|
||||
<script lang="ts">
|
||||
import { defineComponent } from 'vue';
|
||||
import { DataStatus } from '../../scripts/enums/DataStatus';
|
||||
import { useStore } from '../../store/store';
|
||||
import { useStore } from '../../store/mainStore';
|
||||
import { Status } from '../../typings/common';
|
||||
|
||||
export default defineComponent({
|
||||
data() {
|
||||
return {
|
||||
store: useStore(),
|
||||
DataStatus
|
||||
Status: Status
|
||||
};
|
||||
}
|
||||
});
|
||||
|
||||
@@ -113,12 +113,11 @@
|
||||
import axios from 'axios';
|
||||
import { defineComponent, inject, PropType } from 'vue';
|
||||
import keyMixin from '../../mixins/keyMixin';
|
||||
import { DataStatus } from '../../scripts/enums/DataStatus';
|
||||
import { DriverStatsAPIData } from '../../scripts/interfaces/api/DriverStatsAPIData';
|
||||
import { URLs } from '../../scripts/utils/apiURLs';
|
||||
import { useStore } from '../../store/store';
|
||||
import { JournalFilterSection } from '../../scripts/enums/JournalFilterType';
|
||||
import { JournalFilter } from '../../scripts/types/JournalTimetablesTypes';
|
||||
import { useStore } from '../../store/mainStore';
|
||||
import { Journal } from './typings';
|
||||
import { API } from '../../typings/api';
|
||||
import { Status } from '../../typings/common';
|
||||
|
||||
export default defineComponent({
|
||||
emits: ['onSearchConfirm', 'onOptionsReset', 'onRefreshData'],
|
||||
@@ -131,13 +130,13 @@ export default defineComponent({
|
||||
},
|
||||
|
||||
filters: {
|
||||
type: Array as PropType<JournalFilter[]>,
|
||||
type: Array as PropType<Journal.TimetableFilter[]>,
|
||||
default: () => []
|
||||
},
|
||||
|
||||
dataStatus: {
|
||||
type: Number as PropType<DataStatus>,
|
||||
default: DataStatus.Initialized
|
||||
type: Number as PropType<Status.Data>,
|
||||
default: -1
|
||||
},
|
||||
|
||||
currentOptionsActive: {
|
||||
@@ -154,7 +153,6 @@ export default defineComponent({
|
||||
data() {
|
||||
return {
|
||||
showOptions: false,
|
||||
JournalFilterSection,
|
||||
|
||||
driverSuggestions: [] as string[],
|
||||
dispatcherSuggestions: [] as string[],
|
||||
@@ -162,7 +160,7 @@ export default defineComponent({
|
||||
searchTimeout: 0,
|
||||
store: useStore(),
|
||||
|
||||
DataStatus
|
||||
JournalFilterSection: Journal.FilterSection
|
||||
};
|
||||
},
|
||||
|
||||
@@ -170,7 +168,7 @@ export default defineComponent({
|
||||
return {
|
||||
searchersValues: inject('searchersValues') as { [key: string]: string },
|
||||
sorterActive: inject('sorterActive') as { id: string | number; dir: number },
|
||||
filterList: inject('filterList') as JournalFilter[] | undefined
|
||||
filterList: inject('filterList') as Journal.TimetableFilter[] | undefined
|
||||
};
|
||||
},
|
||||
|
||||
@@ -212,23 +210,23 @@ export default defineComponent({
|
||||
this.store.driverStatsData = undefined;
|
||||
|
||||
if (!this.store.driverStatsName) {
|
||||
this.store.driverStatsStatus = DataStatus.Initialized;
|
||||
this.store.driverStatsStatus = Status.Data.Initialized;
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
this.store.driverStatsStatus = DataStatus.Loading;
|
||||
this.store.driverStatsStatus = Status.Data.Loading;
|
||||
|
||||
const statsData: DriverStatsAPIData = await (
|
||||
const statsData: API.DriverStats.Response = await (
|
||||
await axios.get(
|
||||
`${URLs.stacjownikAPI}/api/getDriverInfo?name=${this.store.driverStatsName}`
|
||||
)
|
||||
).data;
|
||||
|
||||
this.store.driverStatsData = statsData;
|
||||
this.store.driverStatsStatus = DataStatus.Loaded;
|
||||
this.store.driverStatsStatus = Status.Data.Loaded;
|
||||
} catch (error) {
|
||||
this.store.driverStatsStatus = DataStatus.Error;
|
||||
this.store.driverStatsStatus = Status.Data.Error;
|
||||
console.error('Ups! Wystąpił błąd przy próbie pobrania statystyk maszynisty! :/');
|
||||
}
|
||||
},
|
||||
@@ -270,7 +268,7 @@ export default defineComponent({
|
||||
this.$emit('onSearchConfirm');
|
||||
},
|
||||
|
||||
onFilterChange(filter: JournalFilter) {
|
||||
onFilterChange(filter: Journal.TimetableFilter) {
|
||||
// this.journalFilterActive = filter;
|
||||
this.filterList
|
||||
?.filter((f) => f.filterSection === filter.filterSection)
|
||||
|
||||
@@ -29,10 +29,10 @@
|
||||
|
||||
<script setup lang="ts">
|
||||
import { computed, onMounted, reactive, Ref, ref, watch } from 'vue';
|
||||
import { useStore } from '../../store/store';
|
||||
import { useStore } from '../../store/mainStore';
|
||||
import JournalDailyStats from './DailyStats.vue';
|
||||
import JournalDriverStats from './JournalDriverStats.vue';
|
||||
import StorageManager from '../../scripts/managers/storageManager';
|
||||
import StorageManager from '../../managers/storageManager';
|
||||
|
||||
// Types
|
||||
type TStatTab = 'daily' | 'driver';
|
||||
@@ -60,7 +60,8 @@ let data = reactive({
|
||||
|
||||
// Methods
|
||||
function onTabButtonClick(tab: TStatTab) {
|
||||
if (lastClickedTab.value == tab || !lastClickedTab.value || !areStatsOpen.value) areStatsOpen.value = !areStatsOpen.value;
|
||||
if (lastClickedTab.value == tab || !lastClickedTab.value || !areStatsOpen.value)
|
||||
areStatsOpen.value = !areStatsOpen.value;
|
||||
|
||||
if (tab == 'daily') {
|
||||
StorageManager.setBooleanValue('dailyStatsOpen', areStatsOpen.value);
|
||||
|
||||
@@ -6,9 +6,9 @@
|
||||
{{ $t('app.offline') }}
|
||||
</div>
|
||||
|
||||
<Loading v-else-if="dataStatus == DataStatus.Loading" />
|
||||
<Loading v-else-if="dataStatus == Status.Data.Loading" />
|
||||
|
||||
<div v-else-if="dataStatus == DataStatus.Error" class="journal_warning error">
|
||||
<div v-else-if="dataStatus == Status.Data.Error" class="journal_warning error">
|
||||
{{ $t('app.error') }}
|
||||
</div>
|
||||
|
||||
@@ -38,20 +38,20 @@
|
||||
|
||||
<script lang="ts">
|
||||
import { defineComponent, PropType } from 'vue';
|
||||
import { DataStatus } from '../../../scripts/enums/DataStatus';
|
||||
import { TimetableHistory } from '../../../scripts/interfaces/api/TimetablesAPIData';
|
||||
import { useStore } from '../../../store/store';
|
||||
|
||||
import Loading from '../../Global/Loading.vue';
|
||||
import AddDataButton from '../../Global/AddDataButton.vue';
|
||||
import TimetableHistoryList from './TimetableHistoryList.vue';
|
||||
import { useStore } from '../../../store/mainStore';
|
||||
import { Status } from '../../../typings/common';
|
||||
import { API } from '../../../typings/api';
|
||||
|
||||
export default defineComponent({
|
||||
components: { Loading, AddDataButton, TimetableHistoryList },
|
||||
|
||||
props: {
|
||||
timetableHistory: {
|
||||
type: Array as PropType<TimetableHistory[]>,
|
||||
type: Array as PropType<API.TimetableHistory.Response>,
|
||||
required: true
|
||||
},
|
||||
scrollNoMoreData: {
|
||||
@@ -64,13 +64,13 @@ export default defineComponent({
|
||||
type: Function as PropType<() => void>
|
||||
},
|
||||
dataStatus: {
|
||||
type: Number as PropType<DataStatus>
|
||||
type: Number as PropType<Status.Data>
|
||||
}
|
||||
},
|
||||
|
||||
data() {
|
||||
return {
|
||||
DataStatus,
|
||||
Status,
|
||||
store: useStore()
|
||||
};
|
||||
}
|
||||
|
||||
@@ -77,8 +77,8 @@
|
||||
|
||||
<script lang="ts">
|
||||
import { PropType, defineComponent } from 'vue';
|
||||
import { TimetableHistory } from '../../../scripts/interfaces/api/TimetablesAPIData';
|
||||
import StockList from '../../Global/StockList.vue';
|
||||
import { API } from '../../../typings/api';
|
||||
|
||||
export default defineComponent({
|
||||
components: { StockList },
|
||||
@@ -88,7 +88,7 @@ export default defineComponent({
|
||||
required: true
|
||||
},
|
||||
timetable: {
|
||||
type: Object as PropType<TimetableHistory>,
|
||||
type: Object as PropType<API.TimetableHistory.Data>,
|
||||
required: true
|
||||
}
|
||||
},
|
||||
|
||||
@@ -62,24 +62,24 @@
|
||||
|
||||
<script lang="ts">
|
||||
import { PropType, defineComponent } from 'vue';
|
||||
import { TimetableHistory } from '../../../scripts/interfaces/api/TimetablesAPIData';
|
||||
|
||||
import dateMixin from '../../../mixins/dateMixin';
|
||||
import modalTrainMixin from '../../../mixins/modalTrainMixin';
|
||||
import styleMixin from '../../../mixins/styleMixin';
|
||||
import { API } from '../../../typings/api';
|
||||
|
||||
export default defineComponent({
|
||||
mixins: [dateMixin, modalTrainMixin, styleMixin],
|
||||
|
||||
props: {
|
||||
timetable: {
|
||||
type: Object as PropType<TimetableHistory>,
|
||||
type: Object as PropType<API.TimetableHistory.Data>,
|
||||
required: true
|
||||
}
|
||||
},
|
||||
|
||||
methods: {
|
||||
showTimetable(timetable: TimetableHistory, target: EventTarget | null) {
|
||||
showTimetable(timetable: API.TimetableHistory.Data, target: EventTarget | null) {
|
||||
if (timetable?.terminated) return;
|
||||
|
||||
this.selectModalTrain(timetable.driverName + timetable.trainNo.toString(), target);
|
||||
|
||||
@@ -38,17 +38,17 @@
|
||||
|
||||
<script lang="ts">
|
||||
import { PropType, defineComponent, ref } from 'vue';
|
||||
import { TimetableHistory } from '../../../scripts/interfaces/api/TimetablesAPIData';
|
||||
|
||||
import TimetableGeneral from './TimetableGeneral.vue';
|
||||
import TimetableStops from './TimetableStops.vue';
|
||||
import TimetableStatus from './TimetableStatus.vue';
|
||||
import TimetableExtra from './TimetableExtra.vue';
|
||||
import { API } from '../../../typings/api';
|
||||
|
||||
export default defineComponent({
|
||||
props: {
|
||||
timetableHistory: {
|
||||
type: Array as PropType<TimetableHistory[]>,
|
||||
type: Array as PropType<API.TimetableHistory.Response>,
|
||||
required: true
|
||||
}
|
||||
},
|
||||
|
||||
@@ -44,14 +44,14 @@
|
||||
|
||||
<script lang="ts">
|
||||
import { PropType, defineComponent } from 'vue';
|
||||
import { TimetableHistory } from '../../../scripts/interfaces/api/TimetablesAPIData';
|
||||
import ProgressBar from '../../Global/ProgressBar.vue';
|
||||
import { API } from '../../../typings/api';
|
||||
|
||||
export default defineComponent({
|
||||
components: { ProgressBar },
|
||||
props: {
|
||||
timetable: {
|
||||
type: Object as PropType<TimetableHistory>,
|
||||
type: Object as PropType<API.TimetableHistory.Data>,
|
||||
required: true
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,8 +24,7 @@
|
||||
<script lang="ts">
|
||||
import { PropType, defineComponent } from 'vue';
|
||||
import dateMixin from '../../../mixins/dateMixin';
|
||||
|
||||
import { TimetableHistory } from '../../../scripts/interfaces/api/TimetablesAPIData';
|
||||
import { API } from '../../../typings/api';
|
||||
|
||||
export default defineComponent({
|
||||
mixins: [dateMixin],
|
||||
@@ -37,7 +36,7 @@ export default defineComponent({
|
||||
},
|
||||
|
||||
timetable: {
|
||||
type: Object as PropType<TimetableHistory>,
|
||||
type: Object as PropType<API.TimetableHistory.Data>,
|
||||
required: true
|
||||
}
|
||||
},
|
||||
|
||||
@@ -0,0 +1,49 @@
|
||||
export namespace Journal {
|
||||
export type DispatcherSearcher = {
|
||||
[key in 'search-dispatcher' | 'search-station' | 'search-date']: string;
|
||||
};
|
||||
|
||||
export interface DispatcherSorter {
|
||||
id: 'timestampFrom' | 'duration';
|
||||
dir: -1 | 1;
|
||||
}
|
||||
|
||||
export type TimetableSearchKey =
|
||||
| 'search-driver'
|
||||
| 'search-train'
|
||||
| 'search-date'
|
||||
| 'search-dispatcher'
|
||||
| 'search-issuedFrom';
|
||||
|
||||
export type TimetableSearchType = {
|
||||
[key in TimetableSearchKey]: string;
|
||||
};
|
||||
|
||||
export const enum TimetableFilterId {
|
||||
ACTIVE = 'active',
|
||||
FULFILLED = 'fulfilled',
|
||||
ABANDONED = 'abandoned',
|
||||
ALL = 'all',
|
||||
TWR = 'twr',
|
||||
SKR = 'skr',
|
||||
TWR_SKR = 'twr-skr'
|
||||
}
|
||||
|
||||
export enum FilterSection {
|
||||
TIMETABLE_STATUS = 'timetable-status',
|
||||
TWRSKR = 'twrskr'
|
||||
}
|
||||
|
||||
export interface TimetableFilter {
|
||||
id: TimetableFilterId;
|
||||
filterSection: string;
|
||||
isActive: boolean;
|
||||
}
|
||||
|
||||
export type TimetableSorterKey = 'timetableId' | 'beginDate' | 'distance' | 'total-stops';
|
||||
|
||||
export interface TimetableSorter {
|
||||
id: TimetableSorterKey;
|
||||
dir: 'asc' | 'desc';
|
||||
}
|
||||
}
|
||||
@@ -69,14 +69,14 @@
|
||||
import axios from 'axios';
|
||||
import { defineComponent, PropType } from 'vue';
|
||||
import dateMixin from '../../mixins/dateMixin';
|
||||
import { DataStatus } from '../../scripts/enums/DataStatus';
|
||||
import { DispatcherHistory } from '../../scripts/interfaces/api/DispatchersAPIData';
|
||||
import Station from '../../scripts/interfaces/Station';
|
||||
import { URLs } from '../../scripts/utils/apiURLs';
|
||||
import Loading from '../Global/Loading.vue';
|
||||
import styleMixin from '../../mixins/styleMixin';
|
||||
import listObserverMixin from '../../mixins/listObserverMixin';
|
||||
import { OnlineScenery } from '../../scripts/interfaces/store/storeTypes';
|
||||
import { OnlineScenery } from '../../store/typings';
|
||||
import { API } from '../../typings/api';
|
||||
import { Status } from '../../typings/common';
|
||||
|
||||
export default defineComponent({
|
||||
name: 'SceneryDispatchersHistory',
|
||||
@@ -95,9 +95,9 @@ export default defineComponent({
|
||||
|
||||
data() {
|
||||
return {
|
||||
historyList: [] as DispatcherHistory[],
|
||||
dataStatus: DataStatus.Loading,
|
||||
DataStatus
|
||||
historyList: [] as API.DispatcherHistory.Response,
|
||||
dataStatus: Status.Data.Loading,
|
||||
DataStatus: Status.Data
|
||||
};
|
||||
},
|
||||
|
||||
@@ -109,17 +109,22 @@ export default defineComponent({
|
||||
},
|
||||
|
||||
methods: {
|
||||
async fetchAPIData(countFrom = 0, countLimit = 30): Promise<DispatcherHistory[] | null> {
|
||||
async fetchAPIData(
|
||||
countFrom = 0,
|
||||
countLimit = 30
|
||||
): Promise<API.DispatcherHistory.Response | null> {
|
||||
try {
|
||||
this.dataStatus = DataStatus.Loading;
|
||||
this.dataStatus = Status.Data.Loading;
|
||||
|
||||
const requestString = `${URLs.stacjownikAPI}/api/getDispatchers?stationName=${this.station.name}&countFrom=${countFrom}&countLimit=${countLimit}`;
|
||||
const historyAPIData: DispatcherHistory[] = await (await axios.get(requestString)).data;
|
||||
const historyAPIData: API.DispatcherHistory.Response = await (
|
||||
await axios.get(requestString)
|
||||
).data;
|
||||
|
||||
this.dataStatus = DataStatus.Loaded;
|
||||
this.dataStatus = Status.Data.Loaded;
|
||||
return historyAPIData;
|
||||
} catch (error) {
|
||||
this.dataStatus = DataStatus.Error;
|
||||
this.dataStatus = Status.Data.Error;
|
||||
console.error(error);
|
||||
return null;
|
||||
}
|
||||
@@ -153,3 +158,4 @@ export default defineComponent({
|
||||
}
|
||||
}
|
||||
</style>
|
||||
../../store/storeTypes
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
<script lang="ts">
|
||||
import { PropType, defineComponent } from 'vue';
|
||||
import Station from '../../scripts/interfaces/Station';
|
||||
import { OnlineScenery } from '../../scripts/interfaces/store/storeTypes';
|
||||
import { OnlineScenery } from '../../store/typings';
|
||||
|
||||
export default defineComponent({
|
||||
props: {
|
||||
@@ -58,3 +58,4 @@ export default defineComponent({
|
||||
font-size: 1.2em;
|
||||
}
|
||||
</style>
|
||||
../../store/storeTypes
|
||||
|
||||
@@ -90,7 +90,7 @@ import SceneryInfoUserList from './SceneryInfo/SceneryInfoUserList.vue';
|
||||
import SceneryInfoSpawnList from './SceneryInfo/SceneryInfoSpawnList.vue';
|
||||
import SceneryInfoRoutes from './SceneryInfo/SceneryInfoRoutes.vue';
|
||||
import Station from '../../scripts/interfaces/Station';
|
||||
import { OnlineScenery } from '../../scripts/interfaces/store/storeTypes';
|
||||
import { OnlineScenery } from '../../store/typings';
|
||||
|
||||
export default defineComponent({
|
||||
components: {
|
||||
@@ -110,7 +110,7 @@ export default defineComponent({
|
||||
type: Object as PropType<OnlineScenery>,
|
||||
required: false
|
||||
}
|
||||
},
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
|
||||
@@ -34,7 +34,7 @@ import dateMixin from '../../../mixins/dateMixin';
|
||||
import routerMixin from '../../../mixins/routerMixin';
|
||||
import styleMixin from '../../../mixins/styleMixin';
|
||||
import StationStatusBadge from '../../Global/StationStatusBadge.vue';
|
||||
import { OnlineScenery } from '../../../scripts/interfaces/store/storeTypes';
|
||||
import { OnlineScenery } from '../../../store/typings';
|
||||
|
||||
export default defineComponent({
|
||||
mixins: [styleMixin, dateMixin, routerMixin],
|
||||
|
||||
@@ -7,7 +7,11 @@
|
||||
</h3>
|
||||
|
||||
<transition-group name="spawns-anim" tag="ul">
|
||||
<li class="badge spawn badge-none" v-if="!onlineScenery || onlineScenery.spawns.length == 0" key="no-spawns">
|
||||
<li
|
||||
class="badge spawn badge-none"
|
||||
v-if="!onlineScenery || onlineScenery.spawns.length == 0"
|
||||
key="no-spawns"
|
||||
>
|
||||
{{ $t('scenery.no-spawns') }}
|
||||
</li>
|
||||
|
||||
@@ -26,7 +30,7 @@
|
||||
|
||||
<script lang="ts">
|
||||
import { PropType, defineComponent } from 'vue';
|
||||
import { OnlineScenery } from '../../../scripts/interfaces/store/storeTypes';
|
||||
import { OnlineScenery } from '../../../store/typings';
|
||||
|
||||
export default defineComponent({
|
||||
props: {
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
import { PropType, defineComponent } from 'vue';
|
||||
import modalTrainMixin from '../../../mixins/modalTrainMixin';
|
||||
import routerMixin from '../../../mixins/routerMixin';
|
||||
import { OnlineScenery } from '../../../scripts/interfaces/store/storeTypes';
|
||||
import { OnlineScenery } from '../../../store/typings';
|
||||
|
||||
export default defineComponent({
|
||||
mixins: [routerMixin, modalTrainMixin],
|
||||
|
||||
@@ -185,10 +185,10 @@ import Loading from '../Global/Loading.vue';
|
||||
import dateMixin from '../../mixins/dateMixin';
|
||||
import routerMixin from '../../mixins/routerMixin';
|
||||
import Station from '../../scripts/interfaces/Station';
|
||||
import { useStore } from '../../store/store';
|
||||
import { useStore } from '../../store/mainStore';
|
||||
import modalTrainMixin from '../../mixins/modalTrainMixin';
|
||||
import ScheduledTrainStatus from './ScheduledTrainStatus.vue';
|
||||
import { OnlineScenery } from '../../scripts/interfaces/store/storeTypes';
|
||||
import { OnlineScenery } from '../../store/typings';
|
||||
|
||||
export default defineComponent({
|
||||
name: 'SceneryTimetable',
|
||||
|
||||
@@ -56,16 +56,14 @@
|
||||
import axios from 'axios';
|
||||
import { defineComponent, PropType } from 'vue';
|
||||
import dateMixin from '../../mixins/dateMixin';
|
||||
import { DataStatus } from '../../scripts/enums/DataStatus';
|
||||
import {
|
||||
TimetableHistory,
|
||||
SceneryTimetableHistory
|
||||
} from '../../scripts/interfaces/api/TimetablesAPIData';
|
||||
|
||||
import Station from '../../scripts/interfaces/Station';
|
||||
import { URLs } from '../../scripts/utils/apiURLs';
|
||||
import Loading from '../Global/Loading.vue';
|
||||
import listObserverMixin from '../../mixins/listObserverMixin';
|
||||
import { OnlineScenery } from '../../scripts/interfaces/store/storeTypes';
|
||||
import { OnlineScenery } from '../../store/typings';
|
||||
import { API } from '../../typings/api';
|
||||
import { Status } from '../../typings/common';
|
||||
|
||||
export default defineComponent({
|
||||
name: 'SceneryTimetablesHistory',
|
||||
@@ -83,28 +81,28 @@ export default defineComponent({
|
||||
|
||||
data() {
|
||||
return {
|
||||
historyList: [] as TimetableHistory[],
|
||||
dataStatus: DataStatus.Loading,
|
||||
DataStatus
|
||||
historyList: [] as API.TimetableHistory.Response,
|
||||
dataStatus: Status.Data.Loading,
|
||||
DataStatus: Status.Data
|
||||
};
|
||||
},
|
||||
|
||||
async activated() {
|
||||
const fetchedHistory = await this.fetchAPIData();
|
||||
if (fetchedHistory) this.historyList = fetchedHistory.timetables;
|
||||
this.fetchAPIData();
|
||||
},
|
||||
|
||||
methods: {
|
||||
async fetchAPIData(countFrom = 0, countLimit = 15): Promise<SceneryTimetableHistory | null> {
|
||||
async fetchAPIData(countFrom = 0, countLimit = 15) {
|
||||
try {
|
||||
const requestString = `${URLs.stacjownikAPI}/api/getIssuedTimetables?name=${this.station.name}&countFrom=${countFrom}&countLimit=${countLimit}`;
|
||||
const historyAPIData: SceneryTimetableHistory = await (await axios.get(requestString)).data;
|
||||
const requestString = `${URLs.stacjownikAPI}/api/getTimetables?issuedFrom=${this.station.name}&countFrom=${countFrom}&countLimit=${countLimit}`;
|
||||
|
||||
this.dataStatus = DataStatus.Loaded;
|
||||
return historyAPIData;
|
||||
const response: API.TimetableHistory.Response = await (await axios.get(requestString)).data;
|
||||
|
||||
this.historyList = response;
|
||||
|
||||
this.dataStatus = Status.Data.Loaded;
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
return null;
|
||||
}
|
||||
},
|
||||
|
||||
@@ -120,3 +118,4 @@ export default defineComponent({
|
||||
@import '../../styles/responsive.scss';
|
||||
@import '../../styles/sceneryViewTables.scss';
|
||||
</style>
|
||||
../../store/storeTypes
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
|
||||
<script lang="ts">
|
||||
import { defineComponent, PropType } from 'vue';
|
||||
import { ScheduledTrain, StopStatus } from '../../scripts/interfaces/ScheduledTrain';
|
||||
import { ScheduledTrain, StopStatus } from '../../store/typings';
|
||||
|
||||
interface ScheduledTrainComp extends ScheduledTrain {
|
||||
stopStatusIndicator: string;
|
||||
@@ -42,7 +42,7 @@ export default defineComponent({
|
||||
stopStatusIndicator = '';
|
||||
|
||||
switch (stopStatus) {
|
||||
case StopStatus.arriving:
|
||||
case StopStatus.ARRIVING:
|
||||
stopStatusIndicator = `${this.$t('timetables.from')}: ${prevDepartureIndicator}`;
|
||||
stopStatusDescription = this.$t('timetables.desc-arriving', {
|
||||
prevStationName,
|
||||
@@ -50,8 +50,8 @@ export default defineComponent({
|
||||
});
|
||||
break;
|
||||
|
||||
case StopStatus.online:
|
||||
case StopStatus.stopped:
|
||||
case StopStatus.ONLINE:
|
||||
case StopStatus.STOPPED:
|
||||
stopStatusIndicator = nextArrivalLine
|
||||
? `${this.$t('timetables.to')}: ${nextArrivalIndicator}`
|
||||
: `${this.$t('timetables.desc-end')}`;
|
||||
@@ -60,7 +60,7 @@ export default defineComponent({
|
||||
: '';
|
||||
break;
|
||||
|
||||
case StopStatus.departed:
|
||||
case StopStatus.DEPARTED:
|
||||
stopStatusIndicator = `${this.$t('timetables.to')}: ${nextArrivalIndicator}`;
|
||||
stopStatusDescription = this.$t('timetables.desc-departed', {
|
||||
nextStationName,
|
||||
@@ -68,7 +68,7 @@ export default defineComponent({
|
||||
});
|
||||
break;
|
||||
|
||||
case StopStatus['departed-away']:
|
||||
case StopStatus.DEPARTED_AWAY:
|
||||
stopStatusIndicator = `${this.$t('timetables.to')}: ${nextArrivalIndicator}`;
|
||||
stopStatusDescription = this.$t('timetables.desc-departed-away', {
|
||||
nextStationName,
|
||||
@@ -76,7 +76,7 @@ export default defineComponent({
|
||||
});
|
||||
break;
|
||||
|
||||
case StopStatus.terminated:
|
||||
case StopStatus.TERMINATED:
|
||||
stopStatusIndicator = `X ${this.$t('timetables.desc-terminated')}`;
|
||||
stopStatusDescription = this.$t('timetables.desc-terminated');
|
||||
break;
|
||||
|
||||
@@ -138,11 +138,11 @@
|
||||
import { defineComponent, inject } from 'vue';
|
||||
import keyMixin from '../../mixins/keyMixin';
|
||||
import routerMixin from '../../mixins/routerMixin';
|
||||
import StorageManager from '../../scripts/managers/storageManager';
|
||||
import { useStationFiltersStore } from '../../store/stationFiltersStore';
|
||||
import { useStore } from '../../store/store';
|
||||
import { useStore } from '../../store/mainStore';
|
||||
|
||||
import FilterOption from './FilterOption.vue';
|
||||
import StorageManager from '../../managers/storageManager';
|
||||
|
||||
export default defineComponent({
|
||||
components: { FilterOption },
|
||||
|
||||
@@ -279,13 +279,13 @@ import { defineComponent, computed, PropType } from 'vue';
|
||||
import dateMixin from '../../mixins/dateMixin';
|
||||
import stationInfoMixin from '../../mixins/stationInfoMixin';
|
||||
import styleMixin from '../../mixins/styleMixin';
|
||||
import { DataStatus } from '../../scripts/enums/DataStatus';
|
||||
import Station from '../../scripts/interfaces/Station';
|
||||
import { useStationFiltersStore } from '../../store/stationFiltersStore';
|
||||
import { useStore } from '../../store/store';
|
||||
import { useStore } from '../../store/mainStore';
|
||||
import Loading from '../Global/Loading.vue';
|
||||
import { HeadIdsTypes, headIconsIds, headIds } from '../../scripts/data/stationHeaderNames';
|
||||
import StationStatusBadge from '../Global/StationStatusBadge.vue';
|
||||
import { Status } from '../../typings/common';
|
||||
|
||||
export default defineComponent({
|
||||
props: {
|
||||
@@ -315,8 +315,9 @@ export default defineComponent({
|
||||
const stationFiltersStore = useStationFiltersStore();
|
||||
|
||||
const isDataLoaded = computed(() => {
|
||||
return store.dataStatuses.sceneries != DataStatus.Loading;
|
||||
return store.dataStatuses.sceneries != Status.Data.Loading;
|
||||
});
|
||||
|
||||
return {
|
||||
isDataLoaded,
|
||||
stationFiltersStore
|
||||
|
||||
@@ -1,4 +1,11 @@
|
||||
export default interface Filter {
|
||||
export interface FilterOption {
|
||||
id: string;
|
||||
name: string;
|
||||
value: boolean;
|
||||
defaultValue: boolean;
|
||||
}
|
||||
|
||||
export interface Filter {
|
||||
[key: string]: boolean | number | string;
|
||||
default: boolean;
|
||||
notDefault: boolean;
|
||||
@@ -23,7 +23,11 @@
|
||||
v-model="searchedTrain"
|
||||
/>
|
||||
<button class="search-exit">
|
||||
<img src="/images/icon-exit.svg" alt="Trains search clear icon" @click="onInputClear('train')" />
|
||||
<img
|
||||
src="/images/icon-exit.svg"
|
||||
alt="Trains search clear icon"
|
||||
@click="onInputClear('train')"
|
||||
/>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
@@ -36,7 +40,11 @@
|
||||
v-model="searchedDriver"
|
||||
/>
|
||||
<button class="search-exit">
|
||||
<img src="/images/icon-exit.svg" alt="Driver search clear icon" @click="onInputClear('driver')" />
|
||||
<img
|
||||
src="/images/icon-exit.svg"
|
||||
alt="Driver search clear icon"
|
||||
@click="onInputClear('driver')"
|
||||
/>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
@@ -87,8 +95,7 @@
|
||||
<script lang="ts">
|
||||
import { defineComponent, inject, PropType } from 'vue';
|
||||
import keyMixin from '../../mixins/keyMixin';
|
||||
import { TrainFilterSection } from '../../scripts/enums/TrainFilterType';
|
||||
import { TrainFilter } from '../../scripts/interfaces/Trains/TrainFilter';
|
||||
import { TrainFilter, TrainFilterSection } from './typings';
|
||||
|
||||
export default defineComponent({
|
||||
mixins: [keyMixin],
|
||||
|
||||
@@ -72,10 +72,10 @@
|
||||
import { computed, defineComponent, PropType } from 'vue';
|
||||
import dateMixin from '../../mixins/dateMixin';
|
||||
import Train from '../../scripts/interfaces/Train';
|
||||
import TrainStop from '../../scripts/interfaces/TrainStop';
|
||||
import { useStore } from '../../store/store';
|
||||
import { useStore } from '../../store/mainStore';
|
||||
import StopDate from '../Global/StopDate.vue';
|
||||
import StockList from '../Global/StockList.vue';
|
||||
import { TrainStop } from '../../store/typings';
|
||||
|
||||
export default defineComponent({
|
||||
components: { StopDate, StockList },
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
import { computed, defineComponent, inject, PropType, Ref } from 'vue';
|
||||
import modalTrainMixin from '../../mixins/modalTrainMixin';
|
||||
import Train from '../../scripts/interfaces/Train';
|
||||
import { useStore } from '../../store/store';
|
||||
import { useStore } from '../../store/mainStore';
|
||||
import Loading from '../Global/Loading.vue';
|
||||
import TrainInfo from './TrainInfo.vue';
|
||||
|
||||
|
||||
@@ -1,63 +1,93 @@
|
||||
import { TrainFilterSection, TrainFilterType } from '../../scripts/enums/TrainFilterType';
|
||||
import { TrainFilter } from '../../scripts/interfaces/Trains/TrainFilter';
|
||||
export enum TrainFilterSection {
|
||||
TRAIN_TYPE = 'TRAIN_TYPE',
|
||||
TIMETABLE_TYPE = 'TIMETABLE_TYPE',
|
||||
COMMENTS = 'COMMENTS',
|
||||
TIMETABLE = 'TIMETABLE'
|
||||
}
|
||||
|
||||
export const enum TrainFilterId {
|
||||
noComments = 'noComments',
|
||||
withComments = 'withComments',
|
||||
|
||||
twr = 'twr',
|
||||
skr = 'skr',
|
||||
common = 'common',
|
||||
|
||||
passenger = 'passenger',
|
||||
freight = 'freight',
|
||||
other = 'other',
|
||||
noTimetable = 'noTimetable',
|
||||
withTimetable = 'withTimetable'
|
||||
}
|
||||
|
||||
export interface TrainFilter {
|
||||
id: TrainFilterId;
|
||||
section: TrainFilterSection;
|
||||
isActive: boolean;
|
||||
}
|
||||
|
||||
export interface TrainSorter {
|
||||
id: string;
|
||||
value: string;
|
||||
}
|
||||
|
||||
export const trainFilters: TrainFilter[] = [
|
||||
{
|
||||
id: TrainFilterType.twr,
|
||||
id: TrainFilterId.twr,
|
||||
section: TrainFilterSection.TRAIN_TYPE,
|
||||
isActive: true
|
||||
},
|
||||
{
|
||||
id: TrainFilterType.skr,
|
||||
id: TrainFilterId.skr,
|
||||
section: TrainFilterSection.TRAIN_TYPE,
|
||||
isActive: true
|
||||
},
|
||||
{
|
||||
id: TrainFilterType.common,
|
||||
id: TrainFilterId.common,
|
||||
section: TrainFilterSection.TRAIN_TYPE,
|
||||
isActive: true
|
||||
},
|
||||
|
||||
{
|
||||
id: TrainFilterType.passenger,
|
||||
id: TrainFilterId.passenger,
|
||||
section: TrainFilterSection.TIMETABLE_TYPE,
|
||||
isActive: true
|
||||
},
|
||||
{
|
||||
id: TrainFilterType.freight,
|
||||
id: TrainFilterId.freight,
|
||||
section: TrainFilterSection.TIMETABLE_TYPE,
|
||||
isActive: true
|
||||
},
|
||||
{
|
||||
id: TrainFilterType.other,
|
||||
id: TrainFilterId.other,
|
||||
section: TrainFilterSection.TIMETABLE_TYPE,
|
||||
isActive: true
|
||||
},
|
||||
|
||||
{
|
||||
id: TrainFilterType.withComments,
|
||||
id: TrainFilterId.withComments,
|
||||
section: TrainFilterSection.COMMENTS,
|
||||
isActive: true
|
||||
},
|
||||
{
|
||||
id: TrainFilterType.noComments,
|
||||
id: TrainFilterId.noComments,
|
||||
section: TrainFilterSection.COMMENTS,
|
||||
isActive: true
|
||||
},
|
||||
|
||||
{
|
||||
id: TrainFilterType.withTimetable,
|
||||
id: TrainFilterId.withTimetable,
|
||||
section: TrainFilterSection.TIMETABLE,
|
||||
isActive: true
|
||||
},
|
||||
{
|
||||
id: TrainFilterType.noTimetable,
|
||||
id: TrainFilterId.noTimetable,
|
||||
section: TrainFilterSection.TIMETABLE,
|
||||
isActive: true
|
||||
}
|
||||
];
|
||||
|
||||
export const sorterOptions = [
|
||||
export const sorterOptions: TrainSorter[] = [
|
||||
{
|
||||
id: 'distance',
|
||||
value: 'kilometraż'
|
||||
@@ -1,46 +0,0 @@
|
||||
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
|
||||
}
|
||||
];
|
||||
@@ -1,23 +0,0 @@
|
||||
[
|
||||
"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"
|
||||
]
|
||||
@@ -1,7 +1,6 @@
|
||||
import { TrainFilter } from '../interfaces/Trains/TrainFilter';
|
||||
import { TrainFilterType } from '../enums/TrainFilterType';
|
||||
import Train from '../interfaces/Train';
|
||||
import TrainStop from '../interfaces/TrainStop';
|
||||
import { TrainFilter, TrainFilterId } from '../components/TrainsView/typings';
|
||||
import Train from '../scripts/interfaces/Train';
|
||||
import { TrainStop } from '../store/typings';
|
||||
|
||||
function confirmedPercentage(stops: TrainStop[] | undefined) {
|
||||
if (!stops) return -1;
|
||||
@@ -32,34 +31,34 @@ function filterTrainList(
|
||||
if (f.isActive) return true;
|
||||
|
||||
switch (f.id) {
|
||||
case TrainFilterType.noTimetable:
|
||||
case TrainFilterId.noTimetable:
|
||||
return train.timetableData;
|
||||
|
||||
case TrainFilterType.withTimetable:
|
||||
case TrainFilterId.withTimetable:
|
||||
return !train.timetableData;
|
||||
|
||||
case TrainFilterType.withComments:
|
||||
case TrainFilterId.withComments:
|
||||
return !train.timetableData?.followingStops.some((stop) => stop.comments);
|
||||
|
||||
case TrainFilterType.noComments:
|
||||
case TrainFilterId.noComments:
|
||||
return train.timetableData?.followingStops.some((stop) => stop.comments);
|
||||
|
||||
case TrainFilterType.twr:
|
||||
case TrainFilterId.twr:
|
||||
return !train.timetableData?.TWR;
|
||||
|
||||
case TrainFilterType.skr:
|
||||
case TrainFilterId.skr:
|
||||
return !train.timetableData?.SKR;
|
||||
|
||||
case TrainFilterType.common:
|
||||
case TrainFilterId.common:
|
||||
return train.timetableData?.SKR || train.timetableData?.TWR;
|
||||
|
||||
case TrainFilterType.passenger:
|
||||
case TrainFilterId.passenger:
|
||||
return !/^[AMRE]\D{2}$/.test(train.timetableData?.category || '');
|
||||
|
||||
case TrainFilterType.freight:
|
||||
case TrainFilterId.freight:
|
||||
return !train.timetableData?.category.startsWith('T');
|
||||
|
||||
case TrainFilterType.other:
|
||||
case TrainFilterId.other:
|
||||
return !/^[PXZL]\D{2}$/.test(train.timetableData?.category || '');
|
||||
|
||||
default:
|
||||
@@ -1,5 +1,5 @@
|
||||
import { defineComponent } from 'vue';
|
||||
import { useStore } from '../store/store';
|
||||
import { useStore } from '../store/mainStore';
|
||||
|
||||
export default defineComponent({
|
||||
data() {
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { defineComponent } from 'vue';
|
||||
import Train from '../scripts/interfaces/Train';
|
||||
import TrainStop from '../scripts/interfaces/TrainStop';
|
||||
import { TrainStop } from '../store/typings';
|
||||
|
||||
export default defineComponent({
|
||||
data: () => ({
|
||||
|
||||
@@ -1,49 +0,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
|
||||
};
|
||||
@@ -1,7 +0,0 @@
|
||||
export enum DataStatus {
|
||||
Initialized = -1,
|
||||
Loading = 0,
|
||||
Error = 1,
|
||||
Loaded = 2,
|
||||
Warning = 3
|
||||
}
|
||||
@@ -1,9 +0,0 @@
|
||||
export enum DispatcherStatus {
|
||||
INVALID = -2,
|
||||
UNKNOWN = -1,
|
||||
AFK = 1,
|
||||
ENDING = 2,
|
||||
NO_SPACE = 3,
|
||||
UNAVAILABLE = 4,
|
||||
NOT_LOGGED_IN = 5
|
||||
}
|
||||
@@ -1,14 +0,0 @@
|
||||
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'
|
||||
}
|
||||
@@ -1,21 +0,0 @@
|
||||
export enum TrainFilterSection {
|
||||
TRAIN_TYPE = 'TRAIN_TYPE',
|
||||
TIMETABLE_TYPE = 'TIMETABLE_TYPE',
|
||||
COMMENTS = 'COMMENTS',
|
||||
TIMETABLE = 'TIMETABLE'
|
||||
}
|
||||
|
||||
export const enum TrainFilterType {
|
||||
noComments = 'noComments',
|
||||
withComments = 'withComments',
|
||||
|
||||
twr = 'twr',
|
||||
skr = 'skr',
|
||||
common = 'common',
|
||||
|
||||
passenger = 'passenger',
|
||||
freight = 'freight',
|
||||
other = 'other',
|
||||
noTimetable = 'noTimetable',
|
||||
withTimetable = 'withTimetable'
|
||||
}
|
||||
@@ -1,6 +0,0 @@
|
||||
export default interface FilterOption {
|
||||
id: string;
|
||||
name: string;
|
||||
value: boolean;
|
||||
defaultValue: boolean;
|
||||
}
|
||||
@@ -1,38 +0,0 @@
|
||||
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;
|
||||
@@ -1,43 +0,0 @@
|
||||
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;
|
||||
}
|
||||
@@ -1,5 +1,4 @@
|
||||
import { Availability, OnlineScenery } from './store/storeTypes';
|
||||
import { ScheduledTrain } from './ScheduledTrain';
|
||||
import { Availability, OnlineScenery, ScheduledTrain } from '../../store/typings';
|
||||
import StationRoutes from './StationRoutes';
|
||||
|
||||
export default interface Station {
|
||||
|
||||
@@ -1,13 +0,0 @@
|
||||
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;
|
||||
}
|
||||
@@ -1,23 +0,0 @@
|
||||
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[];
|
||||
};
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
import TrainStop from './TrainStop';
|
||||
import { TrainStop } from '../../store/typings';
|
||||
|
||||
export default interface Train {
|
||||
trainId: string;
|
||||
|
||||
@@ -1,30 +0,0 @@
|
||||
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;
|
||||
}
|
||||
@@ -1,7 +0,0 @@
|
||||
import { TrainFilterSection, TrainFilterType } from '../../enums/TrainFilterType';
|
||||
|
||||
export interface TrainFilter {
|
||||
id: TrainFilterType;
|
||||
section: TrainFilterSection;
|
||||
isActive: boolean;
|
||||
}
|
||||
@@ -1,27 +0,0 @@
|
||||
export interface Sum {
|
||||
routeDistance: number;
|
||||
}
|
||||
|
||||
export interface Max {
|
||||
routeDistance: number;
|
||||
}
|
||||
|
||||
export interface Min {
|
||||
routeDistance: number;
|
||||
}
|
||||
|
||||
export interface Avg {
|
||||
routeDistance: number;
|
||||
}
|
||||
|
||||
export interface Count {
|
||||
_all: number;
|
||||
}
|
||||
|
||||
export interface DispatcherStatsAPIData {
|
||||
_sum: Sum;
|
||||
_max: Max;
|
||||
_min: Min;
|
||||
_avg: Avg;
|
||||
_count: Count;
|
||||
}
|
||||
@@ -1,18 +0,0 @@
|
||||
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;
|
||||
}
|
||||
@@ -1,27 +0,0 @@
|
||||
export interface Sum {
|
||||
routeDistance: number;
|
||||
confirmedStopsCount: number;
|
||||
allStopsCount: number;
|
||||
currentDistance: number;
|
||||
}
|
||||
|
||||
export interface Count {
|
||||
fulfilled: number;
|
||||
terminated: number;
|
||||
_all: number;
|
||||
}
|
||||
|
||||
export interface Max {
|
||||
routeDistance: number;
|
||||
}
|
||||
|
||||
export interface Avg {
|
||||
routeDistance: number;
|
||||
}
|
||||
|
||||
export interface DriverStatsAPIData {
|
||||
_sum: Sum;
|
||||
_count: Count;
|
||||
_max: Max;
|
||||
_avg: Avg;
|
||||
}
|
||||
@@ -1,21 +0,0 @@
|
||||
import { DispatcherStatus } from '../../enums/DispatcherStatus';
|
||||
|
||||
export default interface ActiveSceneryAPIData {
|
||||
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;
|
||||
dispatcherStatus: DispatcherStatus | number;
|
||||
}
|
||||
@@ -1,18 +0,0 @@
|
||||
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;
|
||||
}
|
||||
@@ -1,51 +0,0 @@
|
||||
import { TimetableHistory } from './TimetablesAPIData';
|
||||
|
||||
export interface ITimetablesDailyStats {
|
||||
totalTimetables: number;
|
||||
distanceSum: number;
|
||||
distanceAvg: number;
|
||||
|
||||
timetableId: number;
|
||||
timetableAuthor: string;
|
||||
timetableDriver: string;
|
||||
timetableRouteDistance: number;
|
||||
|
||||
mostActiveDispatchers: {
|
||||
name: string;
|
||||
count: number;
|
||||
}[];
|
||||
|
||||
mostActiveDrivers: {
|
||||
name: string;
|
||||
distance: number;
|
||||
}[];
|
||||
|
||||
longestDuties: {
|
||||
name: string;
|
||||
duration: number;
|
||||
station: string;
|
||||
}[];
|
||||
}
|
||||
|
||||
export interface ITimetablesDailyStatsResponse {
|
||||
totalTimetables: number;
|
||||
distanceSum: number;
|
||||
distanceAvg: number;
|
||||
maxTimetable: TimetableHistory | null;
|
||||
|
||||
mostActiveDispatchers: {
|
||||
name: string;
|
||||
count: number;
|
||||
}[];
|
||||
|
||||
mostActiveDrivers: {
|
||||
name: string;
|
||||
distance: number;
|
||||
}[];
|
||||
|
||||
longestDuties: {
|
||||
name: string;
|
||||
duration: number;
|
||||
station: string;
|
||||
}[];
|
||||
}
|
||||
@@ -1,67 +0,0 @@
|
||||
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;
|
||||
}
|
||||
@@ -1,23 +0,0 @@
|
||||
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'];
|
||||
}
|
||||
@@ -1,68 +0,0 @@
|
||||
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;
|
||||
}
|
||||
@@ -1,41 +0,0 @@
|
||||
export interface Author {
|
||||
login: string;
|
||||
id: number;
|
||||
node_id: string;
|
||||
avatar_url: string;
|
||||
gravatar_id: string;
|
||||
url: string;
|
||||
html_url: string;
|
||||
followers_url: string;
|
||||
following_url: string;
|
||||
gists_url: string;
|
||||
starred_url: string;
|
||||
subscriptions_url: string;
|
||||
organizations_url: string;
|
||||
repos_url: string;
|
||||
events_url: string;
|
||||
received_events_url: string;
|
||||
type: string;
|
||||
site_admin: boolean;
|
||||
}
|
||||
|
||||
export interface ReleaseAPIData {
|
||||
url: string;
|
||||
assets_url: string;
|
||||
upload_url: string;
|
||||
html_url: string;
|
||||
id: number;
|
||||
author: Author;
|
||||
node_id: string;
|
||||
tag_name: string;
|
||||
target_commitish: string;
|
||||
name: string;
|
||||
draft: boolean;
|
||||
prerelease: boolean;
|
||||
created_at: Date;
|
||||
published_at: Date;
|
||||
assets: any[];
|
||||
tarball_url: string;
|
||||
zipball_url: string;
|
||||
body: string;
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
export interface RollingStockGithubData {
|
||||
usage: Record<string, string>;
|
||||
info: RollingStockInfo;
|
||||
}
|
||||
|
||||
export interface RollingStockInfo {
|
||||
'loco-e': [string, string, string, string, boolean][];
|
||||
'loco-s': [string, string, string, string, boolean][];
|
||||
'loco-szt': [string, string, string, string, boolean][];
|
||||
'loco-ezt': [string, string, string, string, boolean][];
|
||||
'car-passenger': [string, string, boolean, boolean, string][];
|
||||
'car-cargo': [string, string, boolean, boolean, string][];
|
||||
}
|
||||
@@ -1,8 +0,0 @@
|
||||
export type JournalDispatcherSearcher = {
|
||||
[key in 'search-dispatcher' | 'search-station' | 'search-date']: string;
|
||||
};
|
||||
|
||||
export interface JournalDispatcherSorter {
|
||||
id: 'timestampFrom' | 'duration';
|
||||
dir: -1 | 1;
|
||||
}
|
||||
@@ -1,25 +0,0 @@
|
||||
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';
|
||||
}
|
||||
@@ -1,6 +1,6 @@
|
||||
import { Filter } from '../../components/StationsView/typings';
|
||||
import { Status } from '../../typings/common';
|
||||
import { HeadIdsTypes } from '../data/stationHeaderNames';
|
||||
import { DispatcherStatus } from '../enums/DispatcherStatus';
|
||||
import Filter from '../interfaces/Filter';
|
||||
import Station from '../interfaces/Station';
|
||||
|
||||
export const sortStations = (
|
||||
@@ -83,16 +83,17 @@ export const filterStations = (station: Station, filters: Filter) => {
|
||||
if (station.onlineInfo) {
|
||||
const { dispatcherStatus } = station.onlineInfo;
|
||||
|
||||
const isEnding = dispatcherStatus == DispatcherStatus.ENDING && filters['endingStatus'];
|
||||
const isEnding = dispatcherStatus == Status.ActiveDispatcher.ENDING && filters['endingStatus'];
|
||||
|
||||
const isNotSigned =
|
||||
(dispatcherStatus == DispatcherStatus.NOT_LOGGED_IN ||
|
||||
dispatcherStatus == DispatcherStatus.UNAVAILABLE) &&
|
||||
(dispatcherStatus == Status.ActiveDispatcher.NOT_LOGGED_IN ||
|
||||
dispatcherStatus == Status.ActiveDispatcher.UNAVAILABLE) &&
|
||||
filters['unavailableStatus'];
|
||||
|
||||
const isAFK = dispatcherStatus == DispatcherStatus.AFK && filters['afkStatus'];
|
||||
const isAFK = dispatcherStatus == Status.ActiveDispatcher.AFK && filters['afkStatus'];
|
||||
|
||||
const isNoSpace = dispatcherStatus == DispatcherStatus.NO_SPACE && filters['noSpaceStatus'];
|
||||
const isNoSpace =
|
||||
dispatcherStatus == Status.ActiveDispatcher.NO_SPACE && filters['noSpaceStatus'];
|
||||
|
||||
const isOccupied = station.onlineInfo && filters['occupied'];
|
||||
|
||||
|
||||
@@ -1,28 +1,21 @@
|
||||
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 { parseSpawns, getScheduledTrains, getStationTrains } from '../scripts/utils/storeUtils';
|
||||
import { parseSpawns, getScheduledTrains, getStationTrains } from './utils';
|
||||
|
||||
import {
|
||||
APIData,
|
||||
OnlineScenery,
|
||||
StationJSONData,
|
||||
StoreState
|
||||
} from '../scripts/interfaces/store/storeTypes';
|
||||
import { OnlineScenery, ScheduledTrain, StationJSONData, StoreState } from './typings';
|
||||
|
||||
import packageInfo from '../../package.json';
|
||||
import { RollingStockGithubData } from '../scripts/interfaces/github_api/StockInfoGithubData';
|
||||
import { ScheduledTrain } from '../scripts/interfaces/ScheduledTrain';
|
||||
import { DispatcherStatus } from '../scripts/enums/DispatcherStatus';
|
||||
import { Websocket, API } from '../typings/api';
|
||||
import { Status } from '../typings/common';
|
||||
|
||||
export const useStore = defineStore('store', {
|
||||
state: () =>
|
||||
({
|
||||
apiData: {} as unknown,
|
||||
activeData: {} as unknown,
|
||||
rollingStockData: undefined,
|
||||
|
||||
stationList: [],
|
||||
@@ -46,16 +39,16 @@ export const useStore = defineStore('store', {
|
||||
|
||||
driverStatsName: '',
|
||||
driverStatsData: undefined,
|
||||
driverStatsStatus: DataStatus.Initialized,
|
||||
driverStatsStatus: Status.Data.Initialized,
|
||||
|
||||
chosenModalTrainId: undefined,
|
||||
|
||||
dataStatuses: {
|
||||
connection: DataStatus.Loading,
|
||||
sceneries: DataStatus.Loading,
|
||||
timetables: DataStatus.Loading,
|
||||
dispatchers: DataStatus.Loading,
|
||||
trains: DataStatus.Loading
|
||||
connection: Status.Data.Loading,
|
||||
sceneries: Status.Data.Loading,
|
||||
timetables: Status.Data.Loading,
|
||||
dispatchers: Status.Data.Loading,
|
||||
trains: Status.Data.Loading
|
||||
},
|
||||
|
||||
currentStatsTab: null,
|
||||
@@ -67,7 +60,7 @@ export const useStore = defineStore('store', {
|
||||
|
||||
getters: {
|
||||
trainList(): Train[] {
|
||||
return (this.apiData?.trains ?? [])
|
||||
return (this.activeData?.trains ?? [])
|
||||
.filter((train) => train.online || train.timetable || train.lastSeen > Date.now() - 180000)
|
||||
.map((train) => {
|
||||
const stock = train.stockString.split(';');
|
||||
@@ -119,11 +112,11 @@ export const useStore = defineStore('store', {
|
||||
|
||||
onlineSceneryList(state): OnlineScenery[] {
|
||||
if (state.isOffline) return [];
|
||||
if (!state.apiData?.activeSceneries) return [];
|
||||
if (!state.activeData?.activeSceneries) return [];
|
||||
|
||||
return state.apiData?.activeSceneries.reduce((list, scenery) => {
|
||||
return state.activeData?.activeSceneries.reduce((list, scenery) => {
|
||||
if (scenery.isOnline !== 1 && Date.now() - scenery.lastSeen > 1000 * 60 * 2) return list;
|
||||
if (scenery.dispatcherStatus == DispatcherStatus.UNKNOWN) return list;
|
||||
if (scenery.dispatcherStatus == Status.ActiveDispatcher.UNKNOWN) return list;
|
||||
|
||||
const station = this.stationList.find((s) => s.name === scenery.stationName);
|
||||
|
||||
@@ -181,7 +174,7 @@ export const useStore = defineStore('store', {
|
||||
).data;
|
||||
|
||||
if (!sceneryData) {
|
||||
this.dataStatuses.sceneries = DataStatus.Error;
|
||||
this.dataStatuses.sceneries = Status.Data.Error;
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -239,8 +232,8 @@ export const useStore = defineStore('store', {
|
||||
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.dataStatuses.connection = Status.Data.Loaded;
|
||||
this.activeData = mockWebsocketData as any;
|
||||
this.setStatuses();
|
||||
|
||||
console.warn('Stacjownik działa w trybie mockowania danych z WS');
|
||||
@@ -257,19 +250,19 @@ export const useStore = defineStore('store', {
|
||||
socket.emit('CONNECTION', { version: packageInfo.version });
|
||||
|
||||
socket.on('connect_error', () => {
|
||||
this.dataStatuses.connection = DataStatus.Error;
|
||||
this.dataStatuses.connection = Status.Data.Error;
|
||||
});
|
||||
|
||||
socket.on('UPDATE', (data: APIData) => {
|
||||
this.apiData = data;
|
||||
this.dataStatuses.connection = DataStatus.Loaded;
|
||||
socket.on('UPDATE', (data: Websocket.ActiveData) => {
|
||||
this.activeData = data;
|
||||
this.dataStatuses.connection = Status.Data.Loaded;
|
||||
|
||||
this.setStatuses();
|
||||
});
|
||||
|
||||
socket.emit('FETCH_DATA', { version: packageInfo.version }, (data: APIData) => {
|
||||
this.dataStatuses.connection = DataStatus.Loaded;
|
||||
this.apiData = data;
|
||||
socket.emit('FETCH_DATA', { version: packageInfo.version }, (data: Websocket.ActiveData) => {
|
||||
this.dataStatuses.connection = Status.Data.Loaded;
|
||||
this.activeData = data;
|
||||
this.setStatuses();
|
||||
});
|
||||
|
||||
@@ -289,7 +282,7 @@ export const useStore = defineStore('store', {
|
||||
async fetchStockInfoData() {
|
||||
try {
|
||||
this.rollingStockData = (
|
||||
await axios.get<RollingStockGithubData>(
|
||||
await axios.get<API.RollingStock.Response>(
|
||||
'https://raw.githubusercontent.com/Spythere/api/main/td2/data/stockInfo.json'
|
||||
)
|
||||
).data;
|
||||
@@ -299,19 +292,17 @@ export const useStore = defineStore('store', {
|
||||
},
|
||||
|
||||
async setStatuses() {
|
||||
if (!this.apiData.stations) {
|
||||
this.dataStatuses.sceneries = DataStatus.Error;
|
||||
this.dataStatuses.trains = DataStatus.Error;
|
||||
this.dataStatuses.dispatchers = DataStatus.Error;
|
||||
if (!this.activeData.activeSceneries) {
|
||||
this.dataStatuses.sceneries = Status.Data.Error;
|
||||
this.dataStatuses.trains = Status.Data.Error;
|
||||
this.dataStatuses.dispatchers = Status.Data.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.dataStatuses.sceneries = Status.Data.Loaded;
|
||||
this.dataStatuses.trains = !this.activeData.trains ? Status.Data.Warning : Status.Data.Loaded;
|
||||
this.dataStatuses.dispatchers = Status.Data.Loaded;
|
||||
|
||||
// if (this.apiData.dispatchers != null) this.lastDispatcherStatuses = prevDispatcherStatuses;
|
||||
}
|
||||
@@ -1,10 +1,58 @@
|
||||
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 { useStore } from './mainStore';
|
||||
import { filterStations, sortStations } from '../scripts/utils/filterUtils';
|
||||
import { HeadIdsTypes } from '../scripts/data/stationHeaderNames';
|
||||
import StorageManager from '../managers/storageManager';
|
||||
import { Filter } from '../components/StationsView/typings';
|
||||
|
||||
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
|
||||
};
|
||||
|
||||
export const useStationFiltersStore = defineStore('stationFiltersStore', {
|
||||
state() {
|
||||
|
||||
@@ -1,14 +1,7 @@
|
||||
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 { DispatcherStatus } from '../../enums/DispatcherStatus';
|
||||
import ActiveSceneryAPIData from '../api/SceneryAPIData';
|
||||
import Station from '../scripts/interfaces/Station';
|
||||
import { API, Websocket } from '../typings/api';
|
||||
import { Status } from '../typings/common';
|
||||
|
||||
export type Availability = 'default' | 'unavailable' | 'nonPublic' | 'abandoned' | 'nonDefault';
|
||||
|
||||
@@ -20,12 +13,16 @@ export interface RegionCounters {
|
||||
|
||||
export interface StoreState {
|
||||
stationList: Station[];
|
||||
apiData: APIData;
|
||||
rollingStockData?: RollingStockGithubData;
|
||||
activeData: Websocket.ActiveData;
|
||||
rollingStockData?: API.RollingStock.Response;
|
||||
|
||||
regionOnlineCounters: RegionCounters[];
|
||||
|
||||
lastDispatcherStatuses: { hash: string; statusTimestamp: number; statusID: DispatcherStatus }[];
|
||||
lastDispatcherStatuses: {
|
||||
hash: string;
|
||||
statusTimestamp: number;
|
||||
statusID: Status.ActiveDispatcher;
|
||||
}[];
|
||||
|
||||
sceneryData: any[][];
|
||||
|
||||
@@ -37,22 +34,22 @@ export interface StoreState {
|
||||
isOffline: boolean;
|
||||
|
||||
dispatcherStatsName: string;
|
||||
dispatcherStatsData?: DispatcherStatsAPIData;
|
||||
dispatcherStatsData?: API.DispatcherStats.Response;
|
||||
|
||||
driverStatsName: string;
|
||||
driverStatsData?: DriverStatsAPIData;
|
||||
driverStatsStatus: DataStatus;
|
||||
driverStatsData?: API.DriverStats.Response;
|
||||
driverStatsStatus: Status.Data;
|
||||
|
||||
chosenModalTrainId?: string;
|
||||
|
||||
currentStatsTab: 'daily' | 'driver' | null;
|
||||
|
||||
dataStatuses: {
|
||||
connection: DataStatus;
|
||||
sceneries: DataStatus;
|
||||
timetables: DataStatus;
|
||||
dispatchers: DataStatus;
|
||||
trains: DataStatus;
|
||||
connection: Status.Data;
|
||||
sceneries: Status.Data;
|
||||
timetables: Status.Data;
|
||||
dispatchers: Status.Data;
|
||||
trains: Status.Data;
|
||||
};
|
||||
|
||||
listenerLaunched: boolean;
|
||||
@@ -60,15 +57,6 @@ export interface StoreState {
|
||||
modalLastClickedTarget: EventTarget | null;
|
||||
}
|
||||
|
||||
export interface APIData {
|
||||
stations?: StationAPIData[];
|
||||
dispatchers?: string[][];
|
||||
trains?: TrainAPIData[];
|
||||
activeSceneries?: ActiveSceneryAPIData[];
|
||||
|
||||
connectedSocketCount: number;
|
||||
}
|
||||
|
||||
export interface StationRoutesInfo {
|
||||
routeName: string;
|
||||
isElectric: boolean;
|
||||
@@ -103,14 +91,6 @@ export interface StationJSONData {
|
||||
availability: Availability;
|
||||
}
|
||||
|
||||
export interface StationTrain {
|
||||
driverName: string;
|
||||
driverId: number;
|
||||
trainNo: number;
|
||||
trainId: string;
|
||||
stopStatus: string;
|
||||
}
|
||||
|
||||
export interface OnlineScenery {
|
||||
name: string;
|
||||
hash: string;
|
||||
@@ -124,7 +104,7 @@ export interface OnlineScenery {
|
||||
dispatcherExp: number;
|
||||
dispatcherIsSupporter: boolean;
|
||||
|
||||
dispatcherStatus: DispatcherStatus | number;
|
||||
dispatcherStatus: Status.ActiveDispatcher | number;
|
||||
|
||||
isOnline: boolean;
|
||||
|
||||
@@ -137,3 +117,80 @@ export interface OnlineScenery {
|
||||
unconfirmed: number;
|
||||
};
|
||||
}
|
||||
|
||||
export interface StationTrain {
|
||||
driverName: string;
|
||||
driverId: number;
|
||||
trainNo: number;
|
||||
trainId: string;
|
||||
stopStatus: string;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
export enum StopStatus {
|
||||
ARRIVING = 'arriving',
|
||||
DEPARTED = 'departed',
|
||||
DEPARTED_AWAY = 'departed-away',
|
||||
ONLINE = 'online',
|
||||
STOPPED = 'stopped',
|
||||
TERMINATED = 'terminated'
|
||||
}
|
||||
|
||||
export interface TrainStop {
|
||||
stopName: string;
|
||||
stopNameRAW: string;
|
||||
stopType: string;
|
||||
stopDistance: number;
|
||||
mainStop: boolean;
|
||||
|
||||
arrivalLine: string | null;
|
||||
arrivalTimestamp: number;
|
||||
arrivalRealTimestamp: number;
|
||||
arrivalDelay: number;
|
||||
|
||||
departureLine: string | null;
|
||||
departureTimestamp: number;
|
||||
departureRealTimestamp: number;
|
||||
departureDelay: number;
|
||||
pointId: number;
|
||||
|
||||
comments?: any;
|
||||
|
||||
beginsHere: boolean;
|
||||
terminatesHere: boolean;
|
||||
confirmed: boolean;
|
||||
stopped: boolean;
|
||||
stopTime: number | null;
|
||||
}
|
||||
@@ -1,16 +1,15 @@
|
||||
import { ScheduledTrain, StopStatus } from '../interfaces/ScheduledTrain';
|
||||
import Station from '../interfaces/Station';
|
||||
import Train from '../interfaces/Train';
|
||||
import TrainStop from '../interfaces/TrainStop';
|
||||
import ActiveSceneryAPIData from '../interfaces/api/SceneryAPIData';
|
||||
import { StationTrain } from '../interfaces/store/storeTypes';
|
||||
import Station from '../scripts/interfaces/Station';
|
||||
import Train from '../scripts/interfaces/Train';
|
||||
import { API } from '../typings/api';
|
||||
import { ScheduledTrain, StationTrain, StopStatus, TrainStop } from './typings';
|
||||
|
||||
export const getLocoURL = (locoType: string): string =>
|
||||
`https://rj.td2.info.pl/dist/img/thumbnails/${
|
||||
export function getLocoURL(locoType: string): string {
|
||||
return `https://rj.td2.info.pl/dist/img/thumbnails/${
|
||||
locoType.includes('EN') ? locoType + 'rb' : locoType
|
||||
}.png`;
|
||||
}
|
||||
|
||||
export const getStatusTimestamp = (stationStatus: any): number => {
|
||||
export function getStatusTimestamp(stationStatus: any): number {
|
||||
if (!stationStatus) return -2;
|
||||
|
||||
const statusCode = stationStatus[2];
|
||||
@@ -31,9 +30,9 @@ export const getStatusTimestamp = (stationStatus: any): number => {
|
||||
}
|
||||
|
||||
return -1;
|
||||
};
|
||||
}
|
||||
|
||||
export const parseSpawns = (spawnString: string | null) => {
|
||||
export function parseSpawns(spawnString: string | null) {
|
||||
if (!spawnString) return [];
|
||||
if (spawnString === 'NO_SPAWN') return [];
|
||||
|
||||
@@ -45,47 +44,49 @@ export const parseSpawns = (spawnString: string | null) => {
|
||||
|
||||
return { spawnName, spawnLength, isElectrified };
|
||||
});
|
||||
};
|
||||
}
|
||||
|
||||
export const getTimestamp = (date: string | null): number => (date ? new Date(date).getTime() : 0);
|
||||
export function getTimestamp(date: string | null): number {
|
||||
return date ? new Date(date).getTime() : 0;
|
||||
}
|
||||
|
||||
export const getTrainStopStatus = (
|
||||
export function getTrainStopStatus(
|
||||
stopInfo: TrainStop,
|
||||
currentStationName: string,
|
||||
sceneryName: string
|
||||
) => {
|
||||
let stopStatus = StopStatus['arriving'],
|
||||
) {
|
||||
let stopStatus = StopStatus.ARRIVING,
|
||||
stopLabel = '',
|
||||
stopStatusID = -1;
|
||||
|
||||
if (stopInfo.terminatesHere && stopInfo.confirmed) {
|
||||
stopStatus = StopStatus['terminated'];
|
||||
stopStatus = StopStatus.TERMINATED;
|
||||
stopLabel = 'Skończył bieg';
|
||||
stopStatusID = 5;
|
||||
} else if (!stopInfo.terminatesHere && stopInfo.confirmed && currentStationName == sceneryName) {
|
||||
stopStatus = StopStatus['departed'];
|
||||
stopStatus = StopStatus.DEPARTED;
|
||||
stopLabel = 'Odprawiony';
|
||||
stopStatusID = 2;
|
||||
} else if (!stopInfo.terminatesHere && stopInfo.confirmed && currentStationName != sceneryName) {
|
||||
stopStatus = StopStatus['departed-away'];
|
||||
stopStatus = StopStatus.DEPARTED_AWAY;
|
||||
stopLabel = 'Odjechał';
|
||||
stopStatusID = 4;
|
||||
} else if (currentStationName == sceneryName && !stopInfo.stopped) {
|
||||
stopStatus = StopStatus['online'];
|
||||
stopStatus = StopStatus.ONLINE;
|
||||
stopLabel = 'Na stacji';
|
||||
stopStatusID = 0;
|
||||
} else if (currentStationName == sceneryName && stopInfo.stopped) {
|
||||
stopStatus = StopStatus['stopped'];
|
||||
stopStatus = StopStatus.STOPPED;
|
||||
stopLabel = 'Postój';
|
||||
stopStatusID = 1;
|
||||
} else if (currentStationName != sceneryName) {
|
||||
stopStatus = StopStatus['arriving'];
|
||||
stopStatus = StopStatus.ARRIVING;
|
||||
stopLabel = 'W drodze';
|
||||
stopStatusID = 3;
|
||||
}
|
||||
|
||||
return { stopStatus, stopLabel, stopStatusID };
|
||||
};
|
||||
}
|
||||
|
||||
export function getCheckpointTrain(
|
||||
train: Train,
|
||||
@@ -184,7 +185,7 @@ export function getCheckpointTrain(
|
||||
|
||||
export function getScheduledTrains(
|
||||
trainList: Train[],
|
||||
sceneryData: ActiveSceneryAPIData,
|
||||
sceneryData: API.ActiveSceneries.Data,
|
||||
stationGeneralInfo: Station['generalInfo']
|
||||
): ScheduledTrain[] {
|
||||
const stationName = sceneryData.stationName.toLocaleLowerCase();
|
||||
@@ -246,12 +247,14 @@ export function getStationTrains(
|
||||
trainList: Train[],
|
||||
scheduledTrainList: ScheduledTrain[],
|
||||
region: string,
|
||||
scenery: ActiveSceneryAPIData
|
||||
sceneryData: API.ActiveSceneries.Data
|
||||
): StationTrain[] {
|
||||
return trainList
|
||||
.filter(
|
||||
(train) =>
|
||||
train?.region === region && train.online && train.currentStationName === scenery.stationName
|
||||
train?.region === region &&
|
||||
train.online &&
|
||||
train.currentStationName === sceneryData.stationName
|
||||
)
|
||||
.map((train) => ({
|
||||
driverName: train.driverName,
|
||||
@@ -0,0 +1,331 @@
|
||||
import { Status } from './common';
|
||||
|
||||
export namespace API {
|
||||
export namespace DispatcherHistory {
|
||||
export type Response = Data[];
|
||||
|
||||
export interface Data {
|
||||
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 namespace DispatcherStats {
|
||||
export interface DistanceStat {
|
||||
routeDistance: number;
|
||||
}
|
||||
|
||||
export interface Count {
|
||||
_all: number;
|
||||
}
|
||||
|
||||
export interface Response {
|
||||
_sum: DistanceStat;
|
||||
_max: DistanceStat;
|
||||
_min: DistanceStat;
|
||||
_avg: DistanceStat;
|
||||
_count: Count;
|
||||
}
|
||||
}
|
||||
|
||||
export namespace DriverStats {
|
||||
export interface SumStats {
|
||||
routeDistance: number;
|
||||
confirmedStopsCount: number;
|
||||
allStopsCount: number;
|
||||
currentDistance: number;
|
||||
}
|
||||
|
||||
export interface CountStats {
|
||||
fulfilled: number;
|
||||
terminated: number;
|
||||
_all: number;
|
||||
}
|
||||
|
||||
export interface MaxStats {
|
||||
routeDistance: number;
|
||||
}
|
||||
|
||||
export interface AvdStats {
|
||||
routeDistance: number;
|
||||
}
|
||||
|
||||
export interface Response {
|
||||
_sum: SumStats;
|
||||
_count: CountStats;
|
||||
_max: MaxStats;
|
||||
_avg: AvdStats;
|
||||
}
|
||||
}
|
||||
|
||||
export namespace ActiveSceneries {
|
||||
export interface Data {
|
||||
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;
|
||||
dispatcherStatus: Status.ActiveDispatcher | number;
|
||||
}
|
||||
|
||||
export type Response = Data[];
|
||||
}
|
||||
|
||||
export namespace ActiveTrains {
|
||||
export type Response = Data[];
|
||||
|
||||
export interface Data {
|
||||
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?: Timetable;
|
||||
}
|
||||
|
||||
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 Timetable {
|
||||
timetableId: number;
|
||||
category: string;
|
||||
route: string;
|
||||
|
||||
stopList: TimetableStop[];
|
||||
|
||||
TWR: boolean;
|
||||
SKR: boolean;
|
||||
sceneries: string[];
|
||||
}
|
||||
}
|
||||
|
||||
export namespace TimetableHistory {
|
||||
export interface Data {
|
||||
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 type Response = Data[];
|
||||
}
|
||||
|
||||
export namespace RollingStock {
|
||||
export interface Response {
|
||||
usage: Record<string, string>;
|
||||
info: Info;
|
||||
}
|
||||
|
||||
export interface Info {
|
||||
'loco-e': [string, string, string, string, boolean][];
|
||||
'loco-s': [string, string, string, string, boolean][];
|
||||
'loco-szt': [string, string, string, string, boolean][];
|
||||
'loco-ezt': [string, string, string, string, boolean][];
|
||||
'car-passenger': [string, string, boolean, boolean, string][];
|
||||
'car-cargo': [string, string, boolean, boolean, string][];
|
||||
}
|
||||
}
|
||||
|
||||
export namespace DailyStats {
|
||||
export interface Response {
|
||||
totalTimetables: number;
|
||||
distanceSum: number;
|
||||
distanceAvg: number;
|
||||
maxTimetable: API.TimetableHistory.Data | null;
|
||||
|
||||
mostActiveDispatchers: {
|
||||
name: string;
|
||||
count: number;
|
||||
}[];
|
||||
|
||||
mostActiveDrivers: {
|
||||
name: string;
|
||||
distance: number;
|
||||
}[];
|
||||
|
||||
longestDuties: {
|
||||
name: string;
|
||||
duration: number;
|
||||
station: string;
|
||||
}[];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export namespace Websocket {
|
||||
export interface ActiveData {
|
||||
activeSceneries?: API.ActiveSceneries.Response;
|
||||
trains?: API.ActiveTrains.Response;
|
||||
connectedSocketCount: number;
|
||||
}
|
||||
}
|
||||
|
||||
export namespace GithubAPI {
|
||||
export namespace Release {
|
||||
export interface Author {
|
||||
login: string;
|
||||
id: number;
|
||||
node_id: string;
|
||||
avatar_url: string;
|
||||
gravatar_id: string;
|
||||
url: string;
|
||||
html_url: string;
|
||||
followers_url: string;
|
||||
following_url: string;
|
||||
gists_url: string;
|
||||
starred_url: string;
|
||||
subscriptions_url: string;
|
||||
organizations_url: string;
|
||||
repos_url: string;
|
||||
events_url: string;
|
||||
received_events_url: string;
|
||||
type: string;
|
||||
site_admin: boolean;
|
||||
}
|
||||
|
||||
export interface Response {
|
||||
url: string;
|
||||
assets_url: string;
|
||||
upload_url: string;
|
||||
html_url: string;
|
||||
id: number;
|
||||
author: Author;
|
||||
node_id: string;
|
||||
tag_name: string;
|
||||
target_commitish: string;
|
||||
name: string;
|
||||
draft: boolean;
|
||||
prerelease: boolean;
|
||||
created_at: Date;
|
||||
published_at: Date;
|
||||
assets: any[];
|
||||
tarball_url: string;
|
||||
zipball_url: string;
|
||||
body: string;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
export namespace Status {
|
||||
export enum ActiveDispatcher {
|
||||
INVALID = -2,
|
||||
UNKNOWN = -1,
|
||||
AFK = 1,
|
||||
ENDING = 2,
|
||||
NO_SPACE = 3,
|
||||
UNAVAILABLE = 4,
|
||||
NOT_LOGGED_IN = 5
|
||||
}
|
||||
|
||||
export enum Data {
|
||||
Initialized = -1,
|
||||
Loading = 0,
|
||||
Error = 1,
|
||||
Loaded = 2,
|
||||
Warning = 3
|
||||
}
|
||||
}
|
||||
@@ -36,16 +36,14 @@ import axios from 'axios';
|
||||
|
||||
import JournalOptions from '../components/JournalView/JournalOptions.vue';
|
||||
import { URLs } from '../scripts/utils/apiURLs';
|
||||
import { DataStatus } from '../scripts/enums/DataStatus';
|
||||
import { useStore } from '../store/store';
|
||||
import { useStore } from '../store/mainStore';
|
||||
import JournalDispatchersList from '../components/JournalView/JournalDispatchersList.vue';
|
||||
import {
|
||||
JournalDispatcherSearcher,
|
||||
JournalDispatcherSorter
|
||||
} from '../scripts/types/JournalDispatcherTypes';
|
||||
import { DispatcherHistory } from '../scripts/interfaces/api/DispatchersAPIData';
|
||||
|
||||
import JournalHeader from '../components/JournalView/JournalHeader.vue';
|
||||
import { LocationQuery } from 'vue-router';
|
||||
import { Journal } from '../components/JournalView/typings';
|
||||
import { API } from '../typings/api';
|
||||
import { Status } from '../typings/common';
|
||||
|
||||
const DISPATCHERS_API_URL = `${URLs.stacjownikAPI}/api/getDispatchers`;
|
||||
|
||||
@@ -81,21 +79,20 @@ export default defineComponent({
|
||||
statsCardOpen: false,
|
||||
currentOptionsActive: false,
|
||||
|
||||
dataStatus: DataStatus.Loading,
|
||||
DataStatus,
|
||||
dataStatus: Status.Data.Loading,
|
||||
|
||||
historyList: [] as DispatcherHistory[]
|
||||
historyList: [] as API.DispatcherHistory.Response
|
||||
}),
|
||||
|
||||
setup() {
|
||||
const sorterActive: JournalDispatcherSorter = reactive({ id: 'timestampFrom', dir: -1 });
|
||||
const sorterActive: Journal.DispatcherSorter = reactive({ id: 'timestampFrom', dir: -1 });
|
||||
const journalFilterActive = ref({});
|
||||
|
||||
const searchersValues = reactive({
|
||||
'search-dispatcher': '',
|
||||
'search-station': '',
|
||||
'search-date': ''
|
||||
} as JournalDispatcherSearcher);
|
||||
} as Journal.DispatcherSearcher);
|
||||
|
||||
const countFromIndex = ref(0);
|
||||
const countLimit = 15;
|
||||
@@ -153,7 +150,7 @@ export default defineComponent({
|
||||
const scrollTop = listElement.scrollTop;
|
||||
const elementHeight = listElement.scrollHeight - listElement.offsetHeight;
|
||||
|
||||
if (!this.scrollDataLoaded || this.scrollNoMoreData || this.dataStatus != DataStatus.Loaded)
|
||||
if (!this.scrollDataLoaded || this.scrollNoMoreData || this.dataStatus != Status.Data.Loaded)
|
||||
return;
|
||||
|
||||
if (scrollTop > elementHeight * 0.85) this.addHistoryData();
|
||||
@@ -185,7 +182,7 @@ export default defineComponent({
|
||||
|
||||
this.countFromIndex = this.historyList.length;
|
||||
|
||||
const responseData: DispatcherHistory[] = await (
|
||||
const responseData: API.DispatcherHistory.Response = await (
|
||||
await axios.get(
|
||||
`${DISPATCHERS_API_URL}?${this.currentQuery}&countFrom=${this.countFromIndex}`
|
||||
)
|
||||
@@ -226,20 +223,20 @@ export default defineComponent({
|
||||
|
||||
queries.push('countLimit=30');
|
||||
|
||||
if (this.currentQuery != queries.join('&')) this.dataStatus = DataStatus.Loading;
|
||||
if (this.currentQuery != queries.join('&')) this.dataStatus = Status.Data.Loading;
|
||||
|
||||
this.currentQuery = queries.join('&');
|
||||
this.currentQueryArray = queries;
|
||||
|
||||
try {
|
||||
if (reset) this.dataStatus = DataStatus.Loading;
|
||||
if (reset) this.dataStatus = Status.Data.Loading;
|
||||
|
||||
const responseData: DispatcherHistory[] = await (
|
||||
const responseData: API.DispatcherHistory.Response = await (
|
||||
await axios.get(`${DISPATCHERS_API_URL}?${this.currentQuery}`)
|
||||
).data;
|
||||
|
||||
if (!responseData) {
|
||||
this.dataStatus = DataStatus.Error;
|
||||
this.dataStatus = Status.Data.Error;
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -255,9 +252,9 @@ export default defineComponent({
|
||||
: '';
|
||||
|
||||
this.dataRefreshedAt = new Date();
|
||||
this.dataStatus = DataStatus.Loaded;
|
||||
this.dataStatus = Status.Data.Loaded;
|
||||
} catch (error) {
|
||||
this.dataStatus = DataStatus.Error;
|
||||
this.dataStatus = Status.Data.Error;
|
||||
}
|
||||
|
||||
this.scrollNoMoreData = false;
|
||||
|
||||
@@ -45,24 +45,84 @@ import JournalOptions from '../components/JournalView/JournalOptions.vue';
|
||||
import JournalStats from '../components/JournalView/JournalStats.vue';
|
||||
import JournalHeader from '../components/JournalView/JournalHeader.vue';
|
||||
|
||||
import { DataStatus } from '../scripts/enums/DataStatus';
|
||||
import { TimetableHistory } from '../scripts/interfaces/api/TimetablesAPIData';
|
||||
import { URLs } from '../scripts/utils/apiURLs';
|
||||
import { useStore } from '../store/store';
|
||||
import { useStore } from '../store/mainStore';
|
||||
|
||||
import { LocationQuery } from 'vue-router';
|
||||
import { TimetablesQueryParams } from '../scripts/interfaces/api/TimetablesQueryParams';
|
||||
import { JournalFilterType } from '../scripts/enums/JournalFilterType';
|
||||
import {
|
||||
JournalFilter,
|
||||
JournalTimetableSearchType,
|
||||
JournalTimetableSorter
|
||||
} from '../scripts/types/JournalTimetablesTypes';
|
||||
import { journalTimetableFilters } from '../constants/Journal/JournalTimetablesConsts';
|
||||
|
||||
import JournalTimetablesList from '../components/JournalView/JournalTimetables/JournalTimetablesList.vue';
|
||||
import { Journal } from '../components/JournalView/typings';
|
||||
import { Status } from '../typings/common';
|
||||
import { API } from '../typings/api';
|
||||
|
||||
const TIMETABLES_API_URL = `${URLs.stacjownikAPI}/api/getTimetables`;
|
||||
|
||||
export const journalTimetableFilters: Journal.TimetableFilter[] = [
|
||||
{
|
||||
id: Journal.TimetableFilterId.ALL,
|
||||
filterSection: Journal.FilterSection.TIMETABLE_STATUS,
|
||||
isActive: true
|
||||
},
|
||||
|
||||
{
|
||||
id: Journal.TimetableFilterId.ACTIVE,
|
||||
filterSection: Journal.FilterSection.TIMETABLE_STATUS,
|
||||
isActive: false
|
||||
},
|
||||
|
||||
{
|
||||
id: Journal.TimetableFilterId.FULFILLED,
|
||||
filterSection: Journal.FilterSection.TIMETABLE_STATUS,
|
||||
isActive: false
|
||||
},
|
||||
|
||||
{
|
||||
id: Journal.TimetableFilterId.ABANDONED,
|
||||
filterSection: Journal.FilterSection.TIMETABLE_STATUS,
|
||||
isActive: false
|
||||
},
|
||||
|
||||
{
|
||||
id: Journal.TimetableFilterId.TWR_SKR,
|
||||
filterSection: Journal.FilterSection.TWRSKR,
|
||||
isActive: true
|
||||
},
|
||||
|
||||
{
|
||||
id: Journal.TimetableFilterId.TWR,
|
||||
filterSection: Journal.FilterSection.TWRSKR,
|
||||
isActive: false
|
||||
},
|
||||
|
||||
{
|
||||
id: Journal.TimetableFilterId.SKR,
|
||||
filterSection: Journal.FilterSection.TWRSKR,
|
||||
isActive: false
|
||||
}
|
||||
];
|
||||
|
||||
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?: Journal.TimetableSorter['id'];
|
||||
}
|
||||
|
||||
export default defineComponent({
|
||||
components: {
|
||||
JournalOptions,
|
||||
@@ -91,22 +151,20 @@ export default defineComponent({
|
||||
statsCardOpen: false,
|
||||
currentOptionsActive: false,
|
||||
|
||||
timetableHistory: [] as TimetableHistory[],
|
||||
timetableHistory: [] as API.TimetableHistory.Response,
|
||||
journalTimetableFilters,
|
||||
|
||||
dataStatus: DataStatus.Loading,
|
||||
dataErrorMessage: '',
|
||||
|
||||
DataStatus
|
||||
dataStatus: Status.Data.Loading,
|
||||
dataErrorMessage: ''
|
||||
}),
|
||||
|
||||
setup() {
|
||||
const sorterActive: JournalTimetableSorter = reactive({ id: 'timetableId', dir: 'desc' });
|
||||
const sorterActive: Journal.TimetableSorter = reactive({ id: 'timetableId', dir: 'desc' });
|
||||
// const journalFilterActive = ref(journalTimetableFilters[0]);
|
||||
const initFilters: readonly JournalFilter[] = JSON.parse(
|
||||
const initFilters: readonly Journal.TimetableFilter[] = JSON.parse(
|
||||
JSON.stringify(journalTimetableFilters)
|
||||
);
|
||||
const filterList: JournalFilter[] = reactive(JSON.parse(JSON.stringify(initFilters)));
|
||||
const filterList: Journal.TimetableFilter[] = reactive(JSON.parse(JSON.stringify(initFilters)));
|
||||
|
||||
const searchersValues = reactive({
|
||||
'search-train': '',
|
||||
@@ -114,7 +172,7 @@ export default defineComponent({
|
||||
'search-dispatcher': '',
|
||||
'search-issuedFrom': '',
|
||||
'search-date': ''
|
||||
} as JournalTimetableSearchType);
|
||||
} as Journal.TimetableSearchType);
|
||||
|
||||
const countFromIndex = ref(0);
|
||||
const countLimit = 15;
|
||||
@@ -163,7 +221,7 @@ export default defineComponent({
|
||||
const scrollTop = listElement.scrollTop;
|
||||
const elementHeight = listElement.scrollHeight - listElement.offsetHeight;
|
||||
|
||||
if (!this.scrollDataLoaded || this.scrollNoMoreData || this.dataStatus != DataStatus.Loaded)
|
||||
if (!this.scrollDataLoaded || this.scrollNoMoreData || this.dataStatus != Status.Data.Loaded)
|
||||
return;
|
||||
|
||||
if (scrollTop > elementHeight * 0.85) this.addHistoryData();
|
||||
@@ -213,7 +271,7 @@ export default defineComponent({
|
||||
|
||||
this.currentQueryParams['countFrom'] = this.timetableHistory.length;
|
||||
|
||||
const responseData: TimetableHistory[] = await (
|
||||
const responseData: API.TimetableHistory.Response = await (
|
||||
await axios.get(`${TIMETABLES_API_URL}`, {
|
||||
params: { ...this.currentQueryParams }
|
||||
})
|
||||
@@ -248,37 +306,37 @@ export default defineComponent({
|
||||
.filter((f) => f.isActive)
|
||||
.forEach((f) => {
|
||||
switch (f.id) {
|
||||
case JournalFilterType.ABANDONED:
|
||||
case Journal.TimetableFilterId.ABANDONED:
|
||||
queryParams['fulfilled'] = 0;
|
||||
queryParams['terminated'] = 1;
|
||||
break;
|
||||
|
||||
case JournalFilterType.ACTIVE:
|
||||
case Journal.TimetableFilterId.ACTIVE:
|
||||
queryParams['fulfilled'] = undefined;
|
||||
queryParams['terminated'] = 0;
|
||||
break;
|
||||
|
||||
case JournalFilterType.FULFILLED:
|
||||
case Journal.TimetableFilterId.FULFILLED:
|
||||
queryParams['terminated'] = undefined;
|
||||
queryParams['fulfilled'] = 1;
|
||||
break;
|
||||
|
||||
case JournalFilterType.ALL:
|
||||
case Journal.TimetableFilterId.ALL:
|
||||
queryParams['terminated'] = undefined;
|
||||
queryParams['fulfilled'] = undefined;
|
||||
break;
|
||||
|
||||
case JournalFilterType.TWR_SKR:
|
||||
case Journal.TimetableFilterId.TWR_SKR:
|
||||
queryParams['twr'] = undefined;
|
||||
queryParams['skr'] = undefined;
|
||||
break;
|
||||
|
||||
case JournalFilterType.TWR:
|
||||
case Journal.TimetableFilterId.TWR:
|
||||
queryParams['twr'] = 1;
|
||||
queryParams['skr'] = undefined;
|
||||
break;
|
||||
|
||||
case JournalFilterType.SKR:
|
||||
case Journal.TimetableFilterId.SKR:
|
||||
queryParams['twr'] = undefined;
|
||||
queryParams['skr'] = 1;
|
||||
break;
|
||||
@@ -301,19 +359,19 @@ export default defineComponent({
|
||||
this.sorterActive.id != 'timetableId' ? this.sorterActive.id : undefined;
|
||||
|
||||
if (JSON.stringify(this.currentQueryParams) != JSON.stringify(queryParams))
|
||||
this.dataStatus = DataStatus.Loading;
|
||||
this.dataStatus = Status.Data.Loading;
|
||||
|
||||
this.currentQueryParams = queryParams;
|
||||
|
||||
try {
|
||||
const responseData: TimetableHistory[] = await (
|
||||
const responseData: API.TimetableHistory.Response = await (
|
||||
await axios.get(`${TIMETABLES_API_URL}`, {
|
||||
params: this.currentQueryParams
|
||||
})
|
||||
).data;
|
||||
|
||||
if (!responseData) {
|
||||
this.dataStatus = DataStatus.Error;
|
||||
this.dataStatus = Status.Data.Error;
|
||||
this.dataErrorMessage = 'Brak danych!';
|
||||
return;
|
||||
}
|
||||
@@ -329,10 +387,10 @@ export default defineComponent({
|
||||
? this.timetableHistory[0].driverName
|
||||
: '';
|
||||
|
||||
this.dataStatus = DataStatus.Loaded;
|
||||
this.dataStatus = Status.Data.Loaded;
|
||||
this.dataRefreshedAt = new Date();
|
||||
} catch (error) {
|
||||
this.dataStatus = DataStatus.Error;
|
||||
this.dataStatus = Status.Data.Error;
|
||||
this.dataErrorMessage = 'Ups! Coś poszło nie tak!';
|
||||
}
|
||||
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
import { computed, defineComponent } from 'vue';
|
||||
import { useRoute } from 'vue-router';
|
||||
import routerMixin from '../mixins/routerMixin';
|
||||
import { useStore } from '../store/store';
|
||||
import { useStore } from '../store/mainStore';
|
||||
|
||||
import SceneryInfo from '../components/SceneryView/SceneryInfo.vue';
|
||||
import SceneryHeader from '../components/SceneryView/SceneryHeader.vue';
|
||||
|
||||
@@ -21,7 +21,7 @@ import { defineComponent } from 'vue';
|
||||
import StationTable from '../components/StationsView/StationTable.vue';
|
||||
import StationFilterCard from '../components/StationsView/StationFilterCard.vue';
|
||||
import { useStationFiltersStore } from '../store/stationFiltersStore';
|
||||
import { useStore } from '../store/store';
|
||||
import { useStore } from '../store/mainStore';
|
||||
|
||||
export default defineComponent({
|
||||
components: {
|
||||
@@ -38,7 +38,6 @@ export default defineComponent({
|
||||
store: useStore()
|
||||
}),
|
||||
|
||||
|
||||
computed: {
|
||||
computedStationList() {
|
||||
return this.filterStore.filteredStationList;
|
||||
|
||||
@@ -15,12 +15,11 @@
|
||||
import { computed, ComputedRef, defineComponent, provide, reactive, ref, watch } from 'vue';
|
||||
import TrainOptions from '../components/TrainsView/TrainOptions.vue';
|
||||
import TrainTable from '../components/TrainsView/TrainTable.vue';
|
||||
import { trainFilters } from '../constants/Trains/TrainOptionsConsts';
|
||||
import modalTrainMixin from '../mixins/modalTrainMixin';
|
||||
import Train from '../scripts/interfaces/Train';
|
||||
import { filteredTrainList } from '../scripts/managers/trainFilterManager';
|
||||
import { useStore } from '../store/store';
|
||||
import { TrainFilter } from '../scripts/interfaces/Trains/TrainFilter';
|
||||
import { useStore } from '../store/mainStore';
|
||||
import { TrainFilter, trainFilters } from '../components/TrainsView/typings';
|
||||
import { filteredTrainList } from '../managers/trainFilterManager';
|
||||
|
||||
export default defineComponent({
|
||||
components: {
|
||||
|
||||
Reference in New Issue
Block a user