mirror of
https://github.com/Spythere/stacjownik.git
synced 2026-05-03 05:18:11 +00:00
refactor(stats): moved fetching daily stats data to store
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<section class="daily-stats">
|
||||
<span :data-active="statsStatus">
|
||||
<span :data-active="apiStore.dataStatuses.dailyStatsData">
|
||||
<h3>
|
||||
{{ $t('journal.daily-stats.title') }}
|
||||
<b class="text--primary">{{ new Date().toLocaleDateString($i18n.locale) }}</b>
|
||||
@@ -8,11 +8,11 @@
|
||||
|
||||
<hr class="header-separator" />
|
||||
|
||||
<b v-if="statsStatus == Status.Data.Loading">
|
||||
<b v-if="apiStore.dataStatuses.dailyStatsData == Status.Data.Loading">
|
||||
{{ $t('app.loading') }}
|
||||
</b>
|
||||
|
||||
<b class="text--error" v-else-if="statsStatus == Status.Data.Error">
|
||||
<b class="text--error" v-else-if="apiStore.dataStatuses.dailyStatsData == Status.Data.Error">
|
||||
{{ $t('journal.stats-error') }}
|
||||
</b>
|
||||
|
||||
@@ -20,42 +20,48 @@
|
||||
{{ $t('journal.daily-stats.info') }}
|
||||
</b>
|
||||
|
||||
<div v-else>
|
||||
<div v-else-if="apiStore.dailyStatsData">
|
||||
<ul class="stats-list">
|
||||
<li v-if="stats.totalTimetables">
|
||||
<li v-if="apiStore.dailyStatsData.totalTimetables">
|
||||
<i18n-t keypath="journal.daily-stats.total">
|
||||
<template #count>
|
||||
<b class="text--primary">
|
||||
{{ stats.totalTimetables }}
|
||||
{{ $t('journal.daily-stats.count', stats.totalTimetables) }}
|
||||
{{ apiStore.dailyStatsData.totalTimetables }}
|
||||
{{ $t('journal.daily-stats.count', apiStore.dailyStatsData.totalTimetables) }}
|
||||
</b>
|
||||
</template>
|
||||
|
||||
<template #distance>
|
||||
<b class="text--primary"> {{ stats.distanceSum?.toFixed(2) }} km</b>
|
||||
<b class="text--primary">
|
||||
{{ apiStore.dailyStatsData.distanceSum?.toFixed(2) }} km</b
|
||||
>
|
||||
</template>
|
||||
</i18n-t>
|
||||
</li>
|
||||
|
||||
<li v-if="stats.maxTimetable">
|
||||
<li v-if="apiStore.dailyStatsData.maxTimetable">
|
||||
<i18n-t keypath="journal.daily-stats.longest">
|
||||
<template #id>
|
||||
<router-link :to="`/journal/timetables?search-train=%23${stats.maxTimetable.id}`">
|
||||
<b>{{ stats.maxTimetable.id }}</b>
|
||||
<router-link
|
||||
:to="`/journal/timetables?search-train=%23${apiStore.dailyStatsData.maxTimetable.id}`"
|
||||
>
|
||||
<b>{{ apiStore.dailyStatsData.maxTimetable.id }}</b>
|
||||
</router-link>
|
||||
</template>
|
||||
<template #author>
|
||||
<router-link
|
||||
:to="`/journal/timetables?search-dispatcher=${stats.maxTimetable.authorName}`"
|
||||
:to="`/journal/timetables?search-dispatcher=${apiStore.dailyStatsData.maxTimetable.authorName}`"
|
||||
>
|
||||
<b>{{ stats.maxTimetable.authorName }}</b>
|
||||
<b>{{ apiStore.dailyStatsData.maxTimetable.authorName }}</b>
|
||||
</router-link>
|
||||
</template>
|
||||
<template #driver>
|
||||
<b class="text--primary">{{ stats.maxTimetable.driverName }}</b>
|
||||
<b class="text--primary">{{ apiStore.dailyStatsData.maxTimetable.driverName }}</b>
|
||||
</template>
|
||||
<template #distance>
|
||||
<b class="text--primary">{{ stats.maxTimetable.routeDistance }} km</b>
|
||||
<b class="text--primary"
|
||||
>{{ apiStore.dailyStatsData.maxTimetable.routeDistance }} km</b
|
||||
>
|
||||
</template>
|
||||
</i18n-t>
|
||||
</li>
|
||||
@@ -101,35 +107,37 @@
|
||||
</i18n-t>
|
||||
</li>
|
||||
|
||||
<li v-if="stats.longestDuties.length > 0">
|
||||
<li v-if="apiStore.dailyStatsData.longestDuties.length > 0">
|
||||
<i18n-t keypath="journal.daily-stats.longest-duties">
|
||||
<template #dispatcher>
|
||||
<router-link
|
||||
:to="`/journal/dispatchers?search-dispatcher=${stats.longestDuties[0].name}`"
|
||||
:to="`/journal/dispatchers?search-dispatcher=${apiStore.dailyStatsData.longestDuties[0].name}`"
|
||||
>
|
||||
<b>{{ stats.longestDuties[0].name }}</b>
|
||||
<b>{{ apiStore.dailyStatsData.longestDuties[0].name }}</b>
|
||||
</router-link>
|
||||
</template>
|
||||
|
||||
<template #station>{{ stats.longestDuties[0].station }}</template>
|
||||
<template #station>{{ apiStore.dailyStatsData.longestDuties[0].station }}</template>
|
||||
|
||||
<template #duration>
|
||||
{{ calculateDuration(stats.longestDuties[0].duration) }}
|
||||
{{ humanizeDuration(apiStore.dailyStatsData.longestDuties[0].duration) }}
|
||||
</template>
|
||||
</i18n-t>
|
||||
</li>
|
||||
|
||||
<li v-if="stats.mostActiveDrivers.length > 0">
|
||||
<li v-if="apiStore.dailyStatsData.mostActiveDrivers.length > 0">
|
||||
<i18n-t keypath="journal.daily-stats.most-active-driver">
|
||||
<template #driver>
|
||||
<router-link
|
||||
:to="`/journal/timetables?search-driver=${stats.mostActiveDrivers[0].name}`"
|
||||
:to="`/journal/timetables?search-driver=${apiStore.dailyStatsData.mostActiveDrivers[0].name}`"
|
||||
>
|
||||
<b>{{ stats.mostActiveDrivers[0].name }}</b>
|
||||
<b>{{ apiStore.dailyStatsData.mostActiveDrivers[0].name }}</b>
|
||||
</router-link>
|
||||
</template>
|
||||
<template #distance>
|
||||
<b class="text--primary">{{ stats.mostActiveDrivers[0].distance.toFixed(2) }} km</b>
|
||||
<b class="text--primary"
|
||||
>{{ apiStore.dailyStatsData.mostActiveDrivers[0].distance.toFixed(2) }} km</b
|
||||
>
|
||||
</template>
|
||||
</i18n-t>
|
||||
</li>
|
||||
@@ -151,7 +159,11 @@
|
||||
>
|
||||
<span>{{ $t(`journal.daily-stats.${key}`) }}</span>
|
||||
<span>
|
||||
{{ Object.entries(stats.globalDiff).find(([k, v]) => k == key)?.[1] || '--' }}
|
||||
{{
|
||||
Object.entries(apiStore.dailyStatsData.globalDiff).find(
|
||||
([k, v]) => k == key
|
||||
)?.[1] || '--'
|
||||
}}
|
||||
</span>
|
||||
</span>
|
||||
</div>
|
||||
@@ -160,76 +172,25 @@
|
||||
</section>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { defineComponent } from 'vue';
|
||||
import dateMixin from '../../mixins/dateMixin';
|
||||
|
||||
import { API } from '../../typings/api';
|
||||
import { Status } from '../../typings/common';
|
||||
<script lang="ts" setup>
|
||||
import { computed, onMounted } from 'vue';
|
||||
import { useApiStore } from '../../store/apiStore';
|
||||
import { Status } from '../../typings/common';
|
||||
import { humanizeDuration } from '../../composables/time';
|
||||
|
||||
export default defineComponent({
|
||||
name: 'journal-daily-stats',
|
||||
onMounted(() => {
|
||||
apiStore.fetchDailyStats();
|
||||
});
|
||||
|
||||
mixins: [dateMixin],
|
||||
const apiStore = useApiStore();
|
||||
|
||||
data() {
|
||||
return {
|
||||
Status,
|
||||
statsStatus: Status.Data.Loading,
|
||||
intervalId: -1,
|
||||
const topDispatchers = computed(() => {
|
||||
if (!apiStore.dailyStatsData || apiStore.dailyStatsData.mostActiveDispatchers.length == 0)
|
||||
return [];
|
||||
|
||||
stats: {} as API.DailyStats.Response,
|
||||
apiStore: useApiStore()
|
||||
};
|
||||
},
|
||||
const maxCount = apiStore.dailyStatsData.mostActiveDispatchers[0].count;
|
||||
|
||||
activated() {
|
||||
this.startFetchingDailyStats();
|
||||
},
|
||||
|
||||
deactivated() {
|
||||
this.stopFetchingDailyStats();
|
||||
},
|
||||
|
||||
computed: {
|
||||
topDispatchers() {
|
||||
if (this.stats.mostActiveDispatchers.length == 0) return [];
|
||||
const maxCount = this.stats.mostActiveDispatchers[0].count;
|
||||
|
||||
return this.stats.mostActiveDispatchers.filter((disp) => disp.count === maxCount);
|
||||
}
|
||||
},
|
||||
|
||||
methods: {
|
||||
async fetchDailyTimetableStats() {
|
||||
try {
|
||||
const res: API.DailyStats.Response = await (
|
||||
await this.apiStore.client!.get('api/getDailyStats')
|
||||
).data;
|
||||
|
||||
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 = Status.Data.Error;
|
||||
}
|
||||
},
|
||||
|
||||
startFetchingDailyStats() {
|
||||
this.fetchDailyTimetableStats();
|
||||
|
||||
if (this.intervalId != -1) return;
|
||||
|
||||
this.intervalId = window.setInterval(this.fetchDailyTimetableStats, 60000);
|
||||
},
|
||||
|
||||
stopFetchingDailyStats() {
|
||||
clearInterval(this.intervalId);
|
||||
this.intervalId = -1;
|
||||
}
|
||||
}
|
||||
return apiStore.dailyStatsData.mostActiveDispatchers.filter((disp) => disp.count === maxCount);
|
||||
});
|
||||
</script>
|
||||
|
||||
@@ -265,7 +226,7 @@ ul.stats-list {
|
||||
gap: 0.5em;
|
||||
}
|
||||
|
||||
@include responsive.smallScreen{
|
||||
@include responsive.smallScreen {
|
||||
h3 {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
+19
-1
@@ -9,7 +9,8 @@ export const useApiStore = defineStore('apiStore', {
|
||||
dataStatuses: {
|
||||
connection: Status.Data.Loading,
|
||||
sceneries: Status.Data.Loading,
|
||||
vehicles: Status.Data.Loading
|
||||
vehicles: Status.Data.Loading,
|
||||
dailyStatsData: Status.Data.Loading
|
||||
},
|
||||
|
||||
activeData: undefined as API.ActiveData.Response | undefined,
|
||||
@@ -18,6 +19,8 @@ export const useApiStore = defineStore('apiStore', {
|
||||
donatorsData: [] as API.Donators.Response,
|
||||
sceneryData: [] as StationJSONData[],
|
||||
|
||||
dailyStatsData: null as API.DailyStats.Response | null,
|
||||
|
||||
nextUpdateTime: 0,
|
||||
nextDataCheckTime: 0,
|
||||
|
||||
@@ -119,6 +122,21 @@ export const useApiStore = defineStore('apiStore', {
|
||||
this.dataStatuses.vehicles = Status.Data.Error;
|
||||
console.error('Ups! Wystąpił błąd podczas pobierania informacji o pojazdach:', error);
|
||||
}
|
||||
},
|
||||
|
||||
async fetchDailyStats() {
|
||||
try {
|
||||
const res: API.DailyStats.Response = await (
|
||||
await this.client!.get('api/getDailyStats')
|
||||
).data;
|
||||
|
||||
this.dailyStatsData = res;
|
||||
|
||||
this.dataStatuses.dailyStatsData = Status.Data.Loaded;
|
||||
} catch (error) {
|
||||
console.error('Ups! Wystąpił błąd podczas pobierania statystyk rozkładów jazdy...');
|
||||
this.dataStatuses.dailyStatsData = Status.Data.Error;
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user