chore: displaying warning notes in driver view & journal timetables

This commit is contained in:
2024-09-07 17:28:05 +02:00
parent b8f135a454
commit 4177c6e5f4
11 changed files with 176 additions and 65 deletions
-1
View File
@@ -180,7 +180,6 @@ export default defineComponent({
align-items: flex-end; align-items: flex-end;
overflow: auto; overflow: auto;
margin: 0 auto; margin: 0 auto;
padding: 1em 0;
} }
ul > li > span { ul > li > span {
@@ -17,23 +17,24 @@
</div> </div>
<div class="details-body" v-if="showExtraInfo"> <div class="details-body" v-if="showExtraInfo">
<hr /> <div class="g-separator"></div>
<EntryStops :timetable="timetable" /> <EntryStops :timetable="timetable" />
<div class="stock-specs" v-if="timetable.authorName"> <div class="g-separator"></div>
<span class="badge">
<div class="stock-specs">
<span class="badge" v-if="timetable.authorName">
<span>{{ $t('journal.dispatcher-name') }}</span> <span>{{ $t('journal.dispatcher-name') }}</span>
<span>{{ timetable.authorName }}</span> <span>{{ timetable.authorName }}</span>
</span> </span>
</div>
<div class="stock-specs" v-if="timetable.stockMass && timetable.stockHistory.length > 0"> <span class="badge" v-if="timetable.maxSpeed">
<span class="badge">
<span>{{ $t('journal.stock-max-speed') }}</span> <span>{{ $t('journal.stock-max-speed') }}</span>
<span>{{ timetable.maxSpeed }}km/h</span> <span>{{ timetable.maxSpeed }}km/h</span>
</span> </span>
<span class="badge"> <span class="badge" v-if="timetable.stockLength">
<span>{{ $t('journal.stock-length') }}</span> <span>{{ $t('journal.stock-length') }}</span>
<span> <span>
{{ {{
@@ -44,13 +45,13 @@
</span> </span>
</span> </span>
<span class="badge"> <span class="badge" v-if="timetable.stockMass">
<span>{{ $t('journal.stock-mass') }}</span> <span>{{ $t('journal.stock-mass') }}</span>
<span> <span>
{{ {{
Math.floor( Math.floor(
(currentHistoryIndex == 0 (currentHistoryIndex == 0
? timetable.stockMass! ? timetable.stockMass
: stockHistory[currentHistoryIndex].stockMass || timetable.stockMass) / 1000 : stockHistory[currentHistoryIndex].stockMass || timetable.stockMass) / 1000
) )
}}t }}t
@@ -58,32 +59,56 @@
</span> </span>
</div> </div>
<!-- Historia zmian w składzie --> <div class="stock-dangers" v-if="timetable.twr || timetable.skr">
<div class="stock-history" v-if="stockHistory.length > 1"> <div class="g-separator"></div>
<button
v-for="(sh, i) in stockHistory" <b>{{ $t('journal.stock-dangers') }}:</b>
:key="i"
class="btn--action" <ul>
:data-checked="i == currentHistoryIndex" <li v-if="timetable.twr">
@click.stop="currentHistoryIndex = i" <b class="text--primary">{{ $t('general.TWR') }} (TWR)</b>
> <span v-if="timetable.warningNotes">
{{ sh.updatedAt }} | <i>{{ timetable.warningNotes }}</i>
</button> </span>
</li>
<li v-if="timetable.skr">
<b class="text--primary">{{ $t('general.SKR') }}</b>
<span v-if="timetable.warningNotes">
| Komentarze: <i>{{ timetable.warningNotes }}</i>
</span>
</li>
</ul>
</div> </div>
<div v-if="timetable.stockString"> <!-- Historia zmian w składzie -->
<StockList <div v-if="timetable.stockString || stockHistory.length != 0">
:trainStockList=" <div class="g-separator"></div>
(currentHistoryIndex == 0 <b>{{ $t('journal.stock-preview') }}:</b>
? timetable.stockString <div class="stock-history" v-if="stockHistory.length > 1">
: stockHistory[currentHistoryIndex].stockString <button
).split(';') v-for="(sh, i) in stockHistory"
" :key="i"
/> class="btn--action"
:data-checked="i == currentHistoryIndex"
@click.stop="currentHistoryIndex = i"
>
{{ sh.updatedAt }}
</button>
</div>
<div v-if="timetable.stockString">
<StockList
:trainStockList="
(currentHistoryIndex == 0
? timetable.stockString
: stockHistory[currentHistoryIndex].stockString
).split(';')
"
/>
</div>
</div> </div>
</div> </div>
<div v-if="timetable.twr">TWR: {{ timetable.warningNotes }}</div>
</div> </div>
</template> </template>
@@ -189,7 +214,6 @@ export default defineComponent({
display: flex; display: flex;
flex-wrap: wrap; flex-wrap: wrap;
gap: 0.5em; gap: 0.5em;
margin-top: 0.5em;
.badge { .badge {
margin: 0; margin: 0;
@@ -201,6 +225,16 @@ export default defineComponent({
} }
} }
hr {
margin: 0.5em 0;
}
.stock-dangers ul {
list-style: disc;
padding-left: 1em;
padding-top: 0.5em;
}
ul.stock-list { ul.stock-list {
display: flex; display: flex;
align-items: flex-end; align-items: flex-end;
@@ -70,23 +70,20 @@
</li> </li>
</ul> </ul>
<div class="g-separator" /> <ul class="timetable-path-list" v-if="timetablePathDetails">
<li
<div class="entry-path-details" v-if="timetablePathDetails">
<span
v-for="(pathData, i) in timetablePathDetails" v-for="(pathData, i) in timetablePathDetails"
:data-visited="pathData.isVisited" :data-visited="pathData.isVisited"
:data-next-visited=" :data-next-visited="
i < timetablePathDetails.length - 1 && timetablePathDetails[i + 1].isVisited i < timetablePathDetails.length - 1 && timetablePathDetails[i + 1].isVisited
" "
> >
<span class="path-arrival" v-if="pathData.arrival"> / {{ pathData.arrival }} &gt; </span> <span v-if="i > 0" class="path-arrow">&gt;</span>
<span class="path-arrival" v-if="pathData.arrival">{{ pathData.arrival }}</span>
<b class="path-scenery">{{ pathData.sceneryName }}</b> <b class="path-scenery">{{ pathData.sceneryName }}</b>
<span class="path-departure" v-if="pathData.departure"> <span class="path-departure" v-if="pathData.departure">{{ pathData.departure }}</span>
&gt; {{ pathData.departure }}&nbsp; </li>
</span> </ul>
</span>
</div>
</div> </div>
</template> </template>
@@ -193,7 +190,6 @@ export default defineComponent({
word-wrap: break-word; word-wrap: break-word;
gap: 0.25em; gap: 0.25em;
font-size: 0.95em; font-size: 0.95em;
color: #adadad;
} }
.stop-list { .stop-list {
@@ -251,13 +247,45 @@ export default defineComponent({
} }
} }
.entry-path-details { .timetable-path-list {
display: flex;
flex-wrap: wrap;
gap: 0.5em 0;
padding: 0.5em 0; padding: 0.5em 0;
color: #ccc;
li > .path-scenery:first-child,
li > .path-arrival:nth-child(2) {
border-radius: 0.5em 0 0 0.5em;
}
li > :last-child {
border-radius: 0 0.5em 0.5em 0;
}
} }
.entry-path-details > span[data-visited='true'] { .path-scenery {
padding: 0.25em 0.5em;
background-color: #303030;
}
.path-arrival,
.path-departure {
padding: 0.25em;
display: inline-block;
background-color: #4e4e4e;
min-width: 25px;
text-align: center;
}
.path-arrow {
padding: 0 0.5em;
}
.timetable-path-list > li[data-visited='true'] {
.path-arrival, .path-arrival,
.path-scenery { .path-scenery,
.path-arrow {
color: lightgreen; color: lightgreen;
} }
@@ -5,9 +5,9 @@
<div @click="toggleExtraInfo" style="cursor: pointer"> <div @click="toggleExtraInfo" style="cursor: pointer">
<!-- Route --> <!-- Route -->
<span class="entry-route"> <div class="entry-route">
<b>{{ timetableEntry.route.replace('|', ' - ') }}</b> <b>{{ timetableEntry.route.replace('|', ' - ') }}</b>
</span> </div>
<hr /> <hr />
@@ -134,8 +134,16 @@ export default defineComponent({
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import '../../../styles/responsive.scss';
.timetable-history-entry { .timetable-history-entry {
background-color: #1a1a1a; background-color: #1a1a1a;
padding: 1em; padding: 1em;
} }
@include smallScreen {
.entry-route {
text-align: center;
}
}
</style> </style>
+31 -3
View File
@@ -8,11 +8,21 @@
#{{ train.timetableData.timetableId }} #{{ train.timetableData.timetableId }}
</span> </span>
<span class="train-badge twr" v-if="train.timetableData?.TWR" :title="$t('general.TWR')"> <span
class="train-badge twr"
v-if="train.timetableData?.TWR"
data-tooltip-type="BaseTooltip"
:data-tooltip-content="$t('general.TWR') + `:\n${train.timetableData.warningNotes}`"
>
TWR TWR
</span> </span>
<span class="train-badge skr" v-if="train.timetableData?.SKR" :title="$t('general.SKR')"> <span
class="train-badge skr"
v-if="train.timetableData?.SKR"
data-tooltip-type="BaseTooltip"
:data-tooltip-content="$t('general.SKR')"
>
SKR SKR
</span> </span>
@@ -129,6 +139,20 @@
<div class="text--grayed" style="margin-top: 0.25em"> <div class="text--grayed" style="margin-top: 0.25em">
{{ displayTrainPosition(train) }} {{ displayTrainPosition(train) }}
</div> </div>
<div
class="train-dangers"
v-if="extended && (train.timetableData?.TWR || train.timetableData?.SKR)"
>
<div v-if="train.timetableData.TWR">
<b style="color: var(--clr-twr)">TWR</b> - {{ $t('general.TWR') }}
<i>({{ train.timetableData?.warningNotes }})</i>
</div>
<div v-if="train.timetableData.SKR">
<b style="color: var(--clr-skr)">SKR</b> - {{ $t('general.SKR') }}
</div>
</div>
</section> </section>
<section class="train-stats" v-if="!extended"> <section class="train-stats" v-if="!extended">
@@ -199,7 +223,7 @@ export default defineComponent({
query: { query: {
'search-driver': this.train.driverName 'search-driver': this.train.driverName
} }
} };
} }
} }
}); });
@@ -226,6 +250,10 @@ export default defineComponent({
line-height: 1.5em; line-height: 1.5em;
} }
.train-dangers {
margin-top: 0.5em;
}
.train-info { .train-info {
display: grid; display: grid;
grid-template-columns: 2fr 1fr; grid-template-columns: 2fr 1fr;
+5
View File
@@ -442,6 +442,7 @@
"no-further-data": "No further data for current parameters", "no-further-data": "No further data for current parameters",
"loading-further-data": "Loading...", "loading-further-data": "Loading...",
"route-length": "Route length:", "route-length": "Route length:",
"station-count": "Stations:", "station-count": "Stations:",
"dispatcher-name": "Author", "dispatcher-name": "Author",
@@ -460,10 +461,14 @@
"entry-details": "DETAILS", "entry-details": "DETAILS",
"no-entry-details": "NO DETAILS AVAILABLE", "no-entry-details": "NO DETAILS AVAILABLE",
"stock-length": "Length", "stock-length": "Length",
"stock-mass": "Mass", "stock-mass": "Mass",
"stock-max-speed": "Max. speed", "stock-max-speed": "Max. speed",
"stock-dangers": "ADDITIONAL NOTES",
"stock-preview": "STOCK PREVIEW",
"load-data": "Load further data...", "load-data": "Load further data...",
"last-seen-at": "Last seen at", "last-seen-at": "Last seen at",
+3
View File
@@ -450,6 +450,9 @@
"stock-mass": "Masa", "stock-mass": "Masa",
"stock-max-speed": "Prędkość maks.", "stock-max-speed": "Prędkość maks.",
"stock-dangers": "DODATKOWE UWAGI",
"stock-preview": "PODGLĄD SKŁADU",
"load-data": "Pobierz dalszą historię...", "load-data": "Pobierz dalszą historię...",
"last-seen-at": "Ostatnio widziany na: ", "last-seen-at": "Ostatnio widziany na: ",
+2 -1
View File
@@ -94,7 +94,8 @@ export const useMainStore = defineStore('mainStore', {
followingStops: timetable.stopList, followingStops: timetable.stopList,
routeDistance: timetable.stopList[timetable.stopList.length - 1].stopDistance, routeDistance: timetable.stopList[timetable.stopList.length - 1].stopDistance,
sceneries: timetable.sceneries, sceneries: timetable.sceneries,
// sceneryNames: sceneryNames.reverse(), warningNotes: timetable.warningNotes,
timetablePath: timetable.path.split(';').map((pathElementString) => { timetablePath: timetable.path.split(';').map((pathElementString) => {
const [arrival, station, departure] = pathElementString.split(','); const [arrival, station, departure] = pathElementString.split(',');
+1
View File
@@ -355,4 +355,5 @@ a.a-button {
width: 100%; width: 100%;
height: 2px; height: 2px;
background-color: #aaa; background-color: #aaa;
margin: 0.5em 0;
} }
+1
View File
@@ -204,6 +204,7 @@ export namespace API {
sceneries: string[]; sceneries: string[];
path: string; path: string;
warningNotes: string | null;
} }
} }
+15 -12
View File
@@ -72,19 +72,22 @@ export interface Train {
isTimeout: boolean; isTimeout: boolean;
isSupporter: boolean; isSupporter: boolean;
driverRouteLocation: RouteLocationRaw, driverRouteLocation: RouteLocationRaw;
timetableData?: { timetableData?: TrainTimetableData;
timetableId: number; }
category: string;
route: string; export interface TrainTimetableData {
followingStops: TrainStop[]; timetableId: number;
TWR: boolean; category: string;
SKR: boolean; route: string;
routeDistance: number; followingStops: TrainStop[];
sceneries: string[]; TWR: boolean;
timetablePath: TimetablePathElement[]; SKR: boolean;
}; routeDistance: number;
sceneries: string[];
timetablePath: TimetablePathElement[];
warningNotes: string | null;
} }
export interface Station { export interface Station {