Files
stacjownik/src/components/SceneryView/SceneryInfo/SceneryInfoRoutes.vue
T

161 lines
3.5 KiB
Vue

<template>
<section class="info-routes" v-if="station.generalInfo">
<div class="routes one-way" v-if="oneWayRoutes.length > 0">
<b>{{ $t('scenery.one-way-routes') }}</b>
<ul class="routes-list">
<li
v-for="route in oneWayRoutes"
:key="route.routeName"
@click="setActiveShowLength(route.routeName)"
>
<span :class="{ 'no-catenary': !route.isElectric, internal: route.isInternal }">
{{ route.routeName }}</span
>
<span v-if="route.routeSpeed" class="speed">
{{
activeShowLength.includes(route.routeName)
? route.routeLength + 'm'
: route.routeSpeed
}}
</span>
<span v-if="route.isRouteSBL" class="sbl">SBL</span>
</li>
</ul>
</div>
<div class="routes two-way" v-if="twoWayRoutes.length > 0">
<b>{{ $t('scenery.two-way-routes') }}</b>
<ul class="routes-list">
<li
v-for="route in twoWayRoutes"
:key="route.routeName"
@click="setActiveShowLength(route.routeName)"
>
<span :class="{ 'no-catenary': !route.isElectric, internal: route.isInternal }">{{
route.routeName
}}</span>
<span v-if="route.routeSpeed" class="speed">
{{
activeShowLength.includes(route.routeName)
? route.routeLength + 'm'
: route.routeSpeed
}}
</span>
<span v-if="route.isRouteSBL" class="sbl">SBL</span>
</li>
</ul>
</div>
</section>
</template>
<script lang="ts">
import { PropType, defineComponent } from 'vue';
import { Station } from '../../../typings/common';
export default defineComponent({
props: {
station: {
type: Object as PropType<Station>,
required: true
}
},
methods: {
setActiveShowLength(name: string) {
if (this.activeShowLength.includes(name))
this.activeShowLength.splice(this.activeShowLength.indexOf(name), 1);
else this.activeShowLength.push(name);
}
},
data() {
return {
activeShowLength: [] as string[]
};
},
computed: {
oneWayRoutes() {
return this.station.generalInfo?.routes.single ?? [];
},
twoWayRoutes() {
return this.station.generalInfo?.routes.double ?? [];
}
}
});
</script>
<style lang="scss" scoped>
.info-routes {
display: flex;
justify-content: center;
flex-wrap: wrap;
margin: 1em 0;
}
.routes {
display: flex;
justify-content: center;
align-items: center;
flex-wrap: wrap;
padding: 0.25em;
}
ul.routes-list {
margin: 0.45em 0.25em;
display: flex;
justify-content: center;
flex-wrap: wrap;
li {
margin: 0.5em 0.25em;
cursor: pointer;
user-select: none;
-moz-user-select: none;
-webkit-user-select: none;
span {
padding: 0.2em 0.25em;
background-color: #007599;
font-weight: bold;
&.no-catenary {
background-color: #686868;
}
&.internal {
text-decoration: underline;
}
&.speed {
background-color: #404040;
color: #cfcfcf;
}
&.sbl {
color: var(--clr-primary);
background-color: #404040;
}
&:last-child {
border-radius: 0 0.5em 0.5em 0;
}
&:first-child {
border-radius: 0.5em 0 0 0.5em;
}
&:only-child {
border-radius: 0.5em;
}
}
}
}
</style>