chore: updated look of station stats; minor layout improvements

This commit is contained in:
2025-04-14 21:37:59 +02:00
parent a47399fe1b
commit 861206a5ab
3 changed files with 126 additions and 71 deletions
+106 -63
View File
@@ -8,58 +8,106 @@
<button class="filter-button btn--filled btn--image" @click="toggleDropdown" ref="button"> <button class="filter-button btn--filled btn--image" @click="toggleDropdown" ref="button">
<img src="/images/icon-stats.svg" alt="Open filters icon" /> <img src="/images/icon-stats.svg" alt="Open filters icon" />
<!-- {{ $t('train-stats.stats-button') }} --> {{ $t('station-stats.stats-button') }}
<span>STATYSTYKI</span>
</button> </button>
<transition name="dropdown-anim"> <transition name="dropdown-anim">
<div class="dropdown_wrapper" v-if="showDropdown"> <div class="dropdown_wrapper" v-if="showDropdown">
<div> <div>
<h1 class="text--primary"> <h1 class="stats-title text--primary">
<img src="/images/icon-stats.svg" alt="Open filters icon" /> <img src="/images/icon-stats.svg" alt="Open filters icon" />
{{ $t('train-stats.title') }} {{ $t('station-stats.title') }}
</h1> </h1>
<hr style="margin: 0.5em 0" /> <hr style="margin: 0.5em 0" />
<ul class="stats-list"> <div v-if="uFactor > -1 || avgTimetableCount > -1 || trackCount.all > 0">
<li> <div class="badges-container">
<span> <div class="badge stat-badge">
{{ $t('station-stats.u-factor') }} <span>
<a {{ $t('station-stats.u-factor') }}
href="https://td2.info.pl/dyskusje/wspolczynnik-ugla-czy-to-ma-sens/msg81011/#msg81011" <a
target="_blank" href="https://td2.info.pl/dyskusje/wspolczynnik-ugla-czy-to-ma-sens/msg81011/#msg81011"
:data-tooltip="$t('station-stats.u-factor-tooltip')" target="_blank"
>(?)</a :data-tooltip="$t('station-stats.u-factor-tooltip')"
>: >(?)</a
</span> >:
<b class="u-factor" :style="calculateFactorStyle()"> </span>
{{ uFactor.toFixed(2) }}
</b> <span>
</li> <b class="u-factor" :style="calculateFactorStyle()">
<li> {{ uFactor >= 0 ? uFactor.toFixed(2) : '---' }}
{{ $t('station-stats.avg-timetable-count') }} </b>
<b>{{ avgTimetableCount.toFixed(2) }}</b> </span>
</li> </div>
<li>
{{ $t('station-stats.single-track-count') }} <div class="badge stat-badge">
<b>{{ trackCount.oneWay }}</b> (<b>{{ trackCount.oneWayElectric }} </b>) <span>{{ $t('station-stats.avg-timetable-count') }}</span>
</li> <span>
<li> <b>{{ avgTimetableCount >= 0 ? avgTimetableCount.toFixed(2) : '---' }}</b>
{{ $t('station-stats.double-track-count') }} </span>
<b>{{ trackCount.twoWay }}</b> </div>
(<b>{{ trackCount.twoWayElectric }} </b>) </div>
</li>
<li> <hr style="margin: 0.5em 0" />
{{ $t('station-stats.cross-sceneries') }}
<b>{{ trackCount.crossTrack }}</b> (<b>{{ trackCount.crossTrackElectric }} </b>) <div class="badges-container">
</li> <div class="badge stat-badge">
<li> <span>{{ $t('station-stats.single-track-count') }}</span>
{{ $t('station-stats.open-spawns') }} <b>{{ spawnCount.passenger }}</b> - PAS / <span>
<b>{{ spawnCount.freight }}</b> - TOW / <b>{{ spawnCount.loco }}</b> - LUZ / <b> {{ trackCount.oneWay }}</b> (<b>{{ trackCount.oneWayElectric }} </b>)
<b>{{ spawnCount.all }}</b> - ALL </span>
</li> </div>
</ul>
<div class="badge stat-badge">
<span>{{ $t('station-stats.double-track-count') }}</span>
<span>
<b>{{ trackCount.twoWay }}</b> (<b>{{ trackCount.twoWayElectric }} </b>)
</span>
</div>
<div class="badge stat-badge">
<span> {{ $t('station-stats.cross-sceneries') }}</span>
<span>
<b>{{ trackCount.crossTrack }}</b> (<b>{{ trackCount.crossTrackElectric }} </b>)
</span>
</div>
</div>
<hr style="margin: 0.5em 0" />
<div class="badges-container">
<div class="badge stat-badge">
<span> {{ $t('station-stats.open-spawns-all') }}</span>
<span>
<b>{{ spawnCount.all }}</b>
</span>
</div>
<div class="badge stat-badge">
<span> {{ $t('station-stats.open-spawns-pas') }}</span>
<span>
<b>{{ spawnCount.passenger }}</b>
</span>
</div>
<div class="badge stat-badge">
<span> {{ $t('station-stats.open-spawns-freight') }}</span>
<span>
<b>{{ spawnCount.freight }}</b>
</span>
</div>
<div class="badge stat-badge">
<span> {{ $t('station-stats.open-spawns-loco') }}</span>
<span>
<b>{{ spawnCount.loco }}</b>
</span>
</div>
</div>
</div>
<div v-else>{{ $t('station-stats.no-stats') }}</div>
</div> </div>
<div tabindex="0" @focus="() => (showDropdown = false)"></div> <div tabindex="0" @focus="() => (showDropdown = false)"></div>
@@ -86,9 +134,9 @@ export default defineComponent({
}, },
calculateFactorStyle() { calculateFactorStyle() {
if (this.uFactor == 0) return ''; if (this.uFactor <= 0) return '';
const norm = this.uFactor == 0 ? 1 : Math.max(Math.min(this.uFactor / 2, 1), 0); const norm = Math.max(Math.min(this.uFactor / 2, 1), 0);
const lerp = 120 * norm; const lerp = 120 * norm;
return `color: hsl(${lerp}, 100%, 60%)`; return `color: hsl(${lerp}, 100%, 60%)`;
@@ -105,7 +153,7 @@ export default defineComponent({
(train) => train.region == this.mainStore.region.id (train) => train.region == this.mainStore.region.id
); );
return activeDispatchers.length != 0 ? activeTrains.length / activeDispatchers.length : 0; return activeDispatchers.length != 0 ? activeTrains.length / activeDispatchers.length : -1;
}, },
avgTimetableCount() { avgTimetableCount() {
@@ -118,7 +166,7 @@ export default defineComponent({
return acc; return acc;
}, 0); }, 0);
if (regionSceneries.length == 0) return 0; if (regionSceneries.length == 0) return -1;
return timetableCountSum / regionSceneries.length; return timetableCountSum / regionSceneries.length;
}, },
@@ -135,6 +183,8 @@ export default defineComponent({
(acc, st) => { (acc, st) => {
const { routes } = st.generalInfo!; const { routes } = st.generalInfo!;
acc.all++;
if ( if (
routes.single.filter((r) => !r.isInternal).length > 0 && routes.single.filter((r) => !r.isInternal).length > 0 &&
routes.double.filter((r) => !r.isInternal).length > 0 routes.double.filter((r) => !r.isInternal).length > 0
@@ -163,7 +213,8 @@ export default defineComponent({
twoWay: 0, twoWay: 0,
twoWayElectric: 0, twoWayElectric: 0,
crossTrack: 0, crossTrack: 0,
crossTrackElectric: 0 crossTrackElectric: 0,
all: 0
} }
); );
}, },
@@ -194,12 +245,14 @@ export default defineComponent({
@use '../../styles/badge'; @use '../../styles/badge';
@use '../../styles/responsive'; @use '../../styles/responsive';
h1 img { h1.stats-title img {
vertical-align: text-bottom; vertical-align: text-bottom;
} }
h3 { .badges-container {
margin: 0.5em 0; display: flex;
flex-wrap: wrap;
gap: 0.5em;
} }
.u-factor { .u-factor {
@@ -220,19 +273,9 @@ h3 {
} }
} }
ul.stats-list { @include responsive.smallScreen {
list-style: disc; h1.stats-title {
padding-left: 1em; text-align: center;
margin-top: 1em;
& > li {
margin: 0.25em 0;
}
}
@include responsive.smallScreen{
.filter-button span {
display: none;
} }
} }
</style> </style>
+10 -4
View File
@@ -331,13 +331,19 @@
"active-filters": "Attention! You got active filters!" "active-filters": "Attention! You got active filters!"
}, },
"station-stats": { "station-stats": {
"title": "ONLINE SCENERIES STATS",
"stats-button": "STATISTICS",
"u-factor": "U-factor", "u-factor": "U-factor",
"u-factor-tooltip": "(?) Current server traffic factor (driver count divided by dispatcher count)", "u-factor-tooltip": "(?) Current server traffic factor (driver count divided by dispatcher count)",
"avg-timetable-count": "Average count of scenery timetables:", "avg-timetable-count": "TT average:",
"single-track-count": "Single track routes:", "single-track-count": "Single track routes:",
"double-track-count": "Double track routes:", "double-track-count": "Double track routes:",
"cross-sceneries": "Cross-track sceneries (1-track <-> 2-track)", "cross-sceneries": "Cross-track sceneries",
"open-spawns": "Open spawns:" "open-spawns-all": "Spawns (ALL):",
"open-spawns-pas": "Spawns (PAS):",
"open-spawns-freight": "Spawns (TOW):",
"open-spawns-loco": "Spawns (LOK):",
"no-stats": "No statistics available for the current region!"
}, },
"trains": { "trains": {
"no-trains": "No trains to show here!", "no-trains": "No trains to show here!",
@@ -393,7 +399,7 @@
}, },
"train-stats": { "train-stats": {
"stats-button": "STATISTICS", "stats-button": "STATISTICS",
"title": "STATISTICS ONLINE", "title": "ONLINE TRAINS STATS",
"timetable-count": "ACTIVE TIMETABLES", "timetable-count": "ACTIVE TIMETABLES",
"avg-speed": "AVG SPEED", "avg-speed": "AVG SPEED",
"avg-timetable": "AVG TIMETABLE", "avg-timetable": "AVG TIMETABLE",
+10 -4
View File
@@ -327,13 +327,19 @@
"active-filters": "Uwaga! Masz obecnie aktywne filtry!" "active-filters": "Uwaga! Masz obecnie aktywne filtry!"
}, },
"station-stats": { "station-stats": {
"title": "STATYSTYKI AKTYWNYCH SCENERII",
"stats-button": "STATYSTYKI",
"u-factor": "Współczynnik Ugla", "u-factor": "Współczynnik Ugla",
"u-factor-tooltip": "(?) Współczynnik ruchu na serwerze (liczba maszynistów online dzielona na liczbę dyżurnych ruchu)", "u-factor-tooltip": "(?) Współczynnik ruchu na serwerze (liczba maszynistów online dzielona na liczbę dyżurnych ruchu)",
"avg-timetable-count": "Średnia liczba rozkładów jazdy na sceneriach:", "avg-timetable-count": "Średnia RJ:",
"single-track-count": "Szlaki jednotorowe:", "single-track-count": "Szlaki jednotorowe:",
"double-track-count": "Szlaki dwutorowe:", "double-track-count": "Szlaki dwutorowe:",
"cross-sceneries": "Scenerie przejściowe (1-tor <-> 2-tor):", "cross-sceneries": "Scenerie przejściowe:",
"open-spawns": "Otwarte spawny:" "open-spawns-all": "Spawny (ALL):",
"open-spawns-pas": "Spawny (PAS):",
"open-spawns-freight": "Spawny (TOW):",
"open-spawns-loco": "Spawny (LOK):",
"no-stats": "Brak statystyk online dla wybranego serwera!"
}, },
"trains": { "trains": {
"no-trains": "Brak pociągów do wyświetlenia!", "no-trains": "Brak pociągów do wyświetlenia!",
@@ -380,7 +386,7 @@
}, },
"train-stats": { "train-stats": {
"stats-button": "STATYSTYKI", "stats-button": "STATYSTYKI",
"title": "STATYSTYKI ONLINE", "title": "STATYSTYKI AKTYWNYCH POCIĄGÓW",
"timetable-count": "AKTYWNE RJ", "timetable-count": "AKTYWNE RJ",
"avg-speed": "ŚREDNIA PRĘDKOŚĆ", "avg-speed": "ŚREDNIA PRĘDKOŚĆ",
"avg-timetable": "ŚREDNI RJ", "avg-timetable": "ŚREDNI RJ",