merge: 'dominik-korsa-links' into development

This commit is contained in:
2024-08-22 02:27:53 +02:00
11 changed files with 73 additions and 81 deletions
@@ -6,14 +6,14 @@
<img :src="`/images/icon-arrow-${showExtraInfo ? 'asc' : 'desc'}.svg`" alt="Arrow icon" /> <img :src="`/images/icon-arrow-${showExtraInfo ? 'asc' : 'desc'}.svg`" alt="Arrow icon" />
</button> </button>
<button <router-link
v-if="timetable.terminated == false" v-if="driverRouteLocation !== null"
class="btn--action btn-timetable" class="a-button btn--action btn-timetable"
@click.stop="showTimetable(timetable, $event.currentTarget)" :to="driverRouteLocation"
> >
<img src="/images/icon-train.svg" alt="train icon" /> <img src="/images/icon-train.svg" alt="train icon" />
<b>{{ $t('journal.timetable-online-button') }}</b> <b>{{ $t('journal.timetable-online-button') }}</b>
</button> </router-link>
</div> </div>
<div class="details-body" v-if="timetable.stockString && timetable.stockMass && showExtraInfo"> <div class="details-body" v-if="timetable.stockString && timetable.stockMass && showExtraInfo">
@@ -86,13 +86,11 @@
import { PropType, defineComponent } from 'vue'; import { PropType, defineComponent } from 'vue';
import StockList from '../../Global/StockList.vue'; import StockList from '../../Global/StockList.vue';
import { API } from '../../../typings/api'; import { API } from '../../../typings/api';
import driverViewMixin from '../../../mixins/driverViewMixin'; import { RouteLocationRaw } from 'vue-router';
export default defineComponent({ export default defineComponent({
components: { StockList }, components: { StockList },
mixins: [driverViewMixin],
emits: ['toggleExtraInfo'], emits: ['toggleExtraInfo'],
props: { props: {
@@ -127,6 +125,15 @@ export default defineComponent({
stockLength: Number(historyData[3]) || undefined stockLength: Number(historyData[3]) || undefined
}; };
}); });
},
driverRouteLocation(): RouteLocationRaw | null {
if (this.timetable.terminated) return null;
return {
name: 'DriverView',
query: {
trainId: `${this.timetable.driverId}|${this.timetable.trainNo}|eu`
}
}
} }
}, },
methods: { methods: {
@@ -135,12 +142,6 @@ export default defineComponent({
imageEl.src = '/images/icon-unknown.png'; imageEl.src = '/images/icon-unknown.png';
}, },
showTimetable(timetable: API.TimetableHistory.Data, target: EventTarget | null) {
if (timetable?.terminated) return;
this.driverMixin_showDriverView(`${timetable.driverId}|${timetable.trainNo}|eu`);
},
toggleExtraInfo() { toggleExtraInfo() {
this.$emit('toggleExtraInfo', this.timetable.id); this.$emit('toggleExtraInfo', this.timetable.id);
} }
@@ -18,11 +18,11 @@
tabindex="0" tabindex="0"
:key="train.id" :key="train.id"
:data-status="status" :data-status="status"
@click.prevent="driverMixin_showDriverView(train.id)"
@keydown.enter="driverMixin_showDriverView(train.id)"
> >
<span class="user_train">{{ train.trainNo }}</span> <router-link :to="train.driverRouteLocation" class="a-block">
<span class="user_name">{{ train.driverName }}</span> <span class="user_train">{{ train.trainNo }}</span>
<span class="user_name">{{ train.driverName }}</span>
</router-link>
</li> </li>
</transition-group> </transition-group>
</section> </section>
@@ -31,13 +31,12 @@
<script lang="ts"> <script lang="ts">
import { PropType, defineComponent } from 'vue'; import { PropType, defineComponent } from 'vue';
import routerMixin from '../../../mixins/routerMixin'; import routerMixin from '../../../mixins/routerMixin';
import { ActiveScenery, Station, StopStatus } from '../../../typings/common'; import { ActiveScenery, Station } from '../../../typings/common';
import { getTrainStopStatus } from '../utils'; import { getTrainStopStatus } from '../utils';
import { useMainStore } from '../../../store/mainStore'; import { useMainStore } from '../../../store/mainStore';
import driverViewMixin from '../../../mixins/driverViewMixin';
export default defineComponent({ export default defineComponent({
mixins: [routerMixin, driverViewMixin], mixins: [routerMixin],
props: { props: {
onlineScenery: { onlineScenery: {
@@ -63,14 +63,13 @@
{{ $t('scenery.no-timetables') }} {{ $t('scenery.no-timetables') }}
</div> </div>
<div <router-link
class="timetable-item" class="timetable-item a-block"
v-else v-else
v-for="(row, i) in sceneryTimetables" v-for="(row, i) in sceneryTimetables"
:key="row.train.id + i" :key="row.train.id + i"
tabindex="0" tabindex="0"
@click.prevent.stop="driverMixin_showDriverView(row.train.id)" :to="row.train.driverRouteLocation"
@keydown.enter.prevent="driverMixin_showDriverView(row.train.id)"
> >
<span class="timetable-general"> <span class="timetable-general">
<span class="general-info"> <span class="general-info">
@@ -169,21 +168,20 @@
</span> </span>
</span> </span>
</span> </span>
</div> </router-link>
</transition-group> </transition-group>
</div> </div>
</section> </section>
</template> </template>
<script lang="ts"> <script lang="ts">
import { computed, defineComponent, PropType, ref, watch } from 'vue'; import { computed, defineComponent, PropType, ref } from 'vue';
import { useRoute } from 'vue-router'; import { useRoute } from 'vue-router';
import Loading from '../Global/Loading.vue'; import Loading from '../Global/Loading.vue';
import dateMixin from '../../mixins/dateMixin'; import dateMixin from '../../mixins/dateMixin';
import routerMixin from '../../mixins/routerMixin'; import routerMixin from '../../mixins/routerMixin';
import trainCategoryMixin from '../../mixins/trainCategoryMixin'; import trainCategoryMixin from '../../mixins/trainCategoryMixin';
import driverViewMixin from '../../mixins/driverViewMixin';
import { useMainStore } from '../../store/mainStore'; import { useMainStore } from '../../store/mainStore';
import { useApiStore } from '../../store/apiStore'; import { useApiStore } from '../../store/apiStore';
import ScheduledTrainStatus from './ScheduledTrainStatus.vue'; import ScheduledTrainStatus from './ScheduledTrainStatus.vue';
@@ -196,7 +194,7 @@ export default defineComponent({
components: { Loading, ScheduledTrainStatus }, components: { Loading, ScheduledTrainStatus },
mixins: [dateMixin, routerMixin, trainCategoryMixin, driverViewMixin], mixins: [dateMixin, routerMixin, trainCategoryMixin],
props: { props: {
station: { station: {
@@ -391,7 +389,6 @@ export default defineComponent({
background: #353535; background: #353535;
cursor: pointer;
z-index: 10; z-index: 10;
&.empty { &.empty {
+12 -16
View File
@@ -52,15 +52,15 @@
</thead> </thead>
<tbody> <tbody>
<tr <router-link
v-for="station in filteredStationList" v-for="station in filteredStationList"
:class="{ 'last-selected': lastSelectedStationName == station.name }" class="a-row"
role="row"
:key="station.name" :key="station.name"
@click.left="setScenery(station.name)" @click.right.prevent="openForumSite($event, station.generalInfo?.url)"
@click.right="openForumSite($event, station.generalInfo?.url)" @keydown.space.prevent="openForumSite($event, station.generalInfo?.url)"
@keydown.enter="setScenery(station.name)"
@keydown.space="openForumSite($event, station.generalInfo?.url)"
tabindex="0" tabindex="0"
:to="getSceneryRoute(station.name)"
> >
<td class="station-name" :class="station.generalInfo?.availability"> <td class="station-name" :class="station.generalInfo?.availability">
<b v-if="station.generalInfo?.project" style="color: salmon">{{ <b v-if="station.generalInfo?.project" style="color: salmon">{{
@@ -294,7 +294,7 @@
> >
{{ station.onlineInfo?.scheduledTrainCount.confirmed ?? '-' }} {{ station.onlineInfo?.scheduledTrainCount.confirmed ?? '-' }}
</td> </td>
</tr> </router-link>
</tbody> </tbody>
</table> </table>
@@ -334,7 +334,6 @@ export default defineComponent({
data: () => ({ data: () => ({
headIconsIds, headIconsIds,
headIds, headIds,
lastSelectedStationName: '',
getChangedFilters getChangedFilters
}), }),
@@ -364,21 +363,18 @@ export default defineComponent({
}, },
methods: { methods: {
setScenery(name: string) { getSceneryRoute(name: string) {
const station = this.filteredStationList.find((station) => station.name === name); const station = this.filteredStationList.find((station) => station.name === name);
if (!station) return; // TODO: Hide tooltips when navigating away
this.lastSelectedStationName = station.name; return {
this.tooltipStore.hide();
this.$router.push({
name: 'SceneryView', name: 'SceneryView',
query: { query: {
station: station.name, station: station.name,
region: this.$route.query.region || undefined region: this.$route.query.region || undefined
} }
}); };
}, },
openDonationCard(e: Event) { openDonationCard(e: Event) {
@@ -503,7 +499,7 @@ table {
} }
} }
tr { tr, .a-row {
background-color: $rowCol; background-color: $rowCol;
&:nth-child(even) { &:nth-child(even) {
+4 -7
View File
@@ -192,17 +192,14 @@ export default defineComponent({
return Math.min(vehicleSpeed, acc); return Math.min(vehicleSpeed, acc);
}, 300); }, 300);
} },
}, journalRouteLocation() {
return {
methods: {
navigateToJournal() {
this.$router.push({
path: '/journal/timetables', path: '/journal/timetables',
query: { query: {
'search-driver': this.train.driverName 'search-driver': this.train.driverName
} }
}); }
} }
} }
}); });
+3 -9
View File
@@ -17,11 +17,10 @@
class="train-row" class="train-row"
v-for="train in trains" v-for="train in trains"
:key="train.id" :key="train.id"
tabindex="0"
@click.stop="driverMixin_showDriverView(train.id)"
@keydown.enter="driverMixin_showDriverView(train.id)"
> >
<TrainInfo :train="train" :extended="false" /> <router-link class="a-block" :to="train.driverRouteLocation">
<TrainInfo :train="train" :extended="false" />
</router-link>
</li> </li>
</transition-group> </transition-group>
</div> </div>
@@ -35,13 +34,10 @@ import Loading from '../Global/Loading.vue';
import TrainInfo from './TrainInfo.vue'; import TrainInfo from './TrainInfo.vue';
import { Status, Train } from '../../typings/common'; import { Status, Train } from '../../typings/common';
import { useApiStore } from '../../store/apiStore'; import { useApiStore } from '../../store/apiStore';
import driverViewMixin from '../../mixins/driverViewMixin';
export default defineComponent({ export default defineComponent({
components: { Loading, TrainInfo }, components: { Loading, TrainInfo },
mixins: [driverViewMixin],
props: { props: {
trains: { trains: {
type: Array as PropType<Train[]>, type: Array as PropType<Train[]>,
@@ -107,7 +103,5 @@ li.train-row {
background-color: var(--clr-secondary); background-color: var(--clr-secondary);
margin-bottom: 1em; margin-bottom: 1em;
width: 100%; width: 100%;
cursor: pointer;
} }
</style> </style>
-14
View File
@@ -1,14 +0,0 @@
import { defineComponent } from 'vue';
export default defineComponent({
methods: {
driverMixin_showDriverView(id: string) {
this.$router.push({
name: 'DriverView',
query: {
trainId: id
}
});
}
}
});
+2 -2
View File
@@ -7,7 +7,7 @@ const routes: Array<RouteRecordRaw> = [
component: () => import('../views/StationsView.vue'), component: () => import('../views/StationsView.vue'),
props: (route) => ({ props: (route) => ({
region: route.query.region region: route.query.region
}) }),
}, },
{ {
path: '/trains', path: '/trains',
@@ -55,7 +55,7 @@ const routes: Array<RouteRecordRaw> = [
component: () => import('../views/JournalDispatchers.vue'), component: () => import('../views/JournalDispatchers.vue'),
props: (route) => ({ props: (route) => ({
region: route.query.region region: route.query.region
}) }),
}, },
{ {
path: '/:catchAll(.*)', path: '/:catchAll(.*)',
+7
View File
@@ -86,6 +86,13 @@ export const useMainStore = defineStore('mainStore', {
isSupporter: train.driverIsSupporter, isSupporter: train.driverIsSupporter,
driverLevel: train.driverLevel, driverLevel: train.driverLevel,
driverRouteLocation: {
name: 'DriverView',
query: {
trainId: train.id
}
},
timetableData: timetable timetableData: timetable
? { ? {
timetableId: timetable.timetableId, timetableId: timetable.timetableId,
+14 -3
View File
@@ -124,10 +124,12 @@ input {
} }
a { a {
display: inline-block;
color: white;
text-decoration: none; text-decoration: none;
color: inherit;
}
a:not(.a-block):not(.a-button):not(.a-row) {
display: inline-block;
transition: color 0.3s; transition: color 0.3s;
@@ -138,6 +140,14 @@ a {
} }
} }
a.a-block {
display: block;
}
a.a-row {
display: table-row;
}
ul { ul {
padding: 0; padding: 0;
list-style: none; list-style: none;
@@ -184,6 +194,7 @@ a.a-button {
color: white; color: white;
background: none; background: none;
border-radius: 0.25em; border-radius: 0.25em;
text-decoration: none;
display: flex; display: flex;
align-items: center; align-items: center;
+4
View File
@@ -1,3 +1,5 @@
import { RouteLocationRaw } from 'vue-router';
export type Availability = 'default' | 'unavailable' | 'nonPublic' | 'abandoned' | 'nonDefault'; export type Availability = 'default' | 'unavailable' | 'nonPublic' | 'abandoned' | 'nonDefault';
export type ScenerySpawnType = 'passenger' | 'freight' | 'loco' | 'all'; export type ScenerySpawnType = 'passenger' | 'freight' | 'loco' | 'all';
@@ -70,6 +72,8 @@ export interface Train {
isTimeout: boolean; isTimeout: boolean;
isSupporter: boolean; isSupporter: boolean;
driverRouteLocation: RouteLocationRaw,
timetableData?: { timetableData?: {
timetableId: number; timetableId: number;
category: string; category: string;