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

160 lines
3.7 KiB
Vue

<template>
<section class="info-user-list">
<h3 class="user-header section-header">
<img src="/images/icon-user.svg" alt="Users icon" />
&nbsp;{{ $t('scenery.users') }} &nbsp;
<span class="text--primary">{{ onlineScenery?.stationTrains?.length || 0 }}</span
>&nbsp;/&nbsp;<span class="text--primary">{{ onlineScenery?.maxUsers || 0 }}</span>
</h3>
<transition-group name="users-anim" tag="ul">
<li class="badge user badge-none" v-if="!onlineScenery?.stationTrains?.length" key="no-users">
{{ $t('scenery.no-users') }}
</li>
<li
v-for="{ train, status } in stationTrains"
class="badge user"
tabindex="0"
:key="train.id"
:data-status="status"
@click.prevent="selectModalTrain(train, $event.currentTarget)"
@keydown.enter="selectModalTrain(train, $event.currentTarget)"
>
<span class="user_train">{{ train.trainNo }}</span>
<span class="user_name">{{ train.driverName }}</span>
</li>
</transition-group>
</section>
</template>
<script lang="ts">
import { PropType, defineComponent } from 'vue';
import modalTrainMixin from '../../../mixins/modalTrainMixin';
import routerMixin from '../../../mixins/routerMixin';
import { ActiveScenery, Station, StopStatus } from '../../../typings/common';
import { getTrainStopStatus } from '../utils';
import { useMainStore } from '../../../store/mainStore';
export default defineComponent({
mixins: [routerMixin, modalTrainMixin],
props: {
onlineScenery: {
type: Object as PropType<ActiveScenery>,
required: false
},
station: {
type: Object as PropType<Station>
}
},
data() {
return {
mainStore: useMainStore()
};
},
computed: {
stationTrains() {
if (!this.onlineScenery) return;
const name = this.station?.generalInfo?.checkpoints[0] ?? this.onlineScenery.name;
return this.onlineScenery.stationTrains.map((train) => {
const stop = train.timetableData?.followingStops.find(
(stop) =>
stop.stopNameRAW.toLowerCase() == name.toLowerCase() ||
this.station?.generalInfo?.checkpoints.includes(stop.stopNameRAW)
);
const status = stop
? getTrainStopStatus(stop, train.currentStationName, this.onlineScenery!.name)
: 'no-timetable';
return {
train,
status
};
});
}
}
});
</script>
<style lang="scss" scoped>
$no-timetable: #aaa;
$departed: springgreen;
$stopped: #ffa600;
$online: gold;
$terminated: salmon;
$disconnected: slategray;
.info-user-list {
width: 100%;
}
ul {
position: relative;
}
.user {
cursor: pointer;
&_train {
color: black;
background-color: $no-timetable;
transition: background-color 200ms;
-ms-transition: background-color 200ms;
-webkit-transition: background-color 200ms;
}
&[data-status='no-timetable'] .user_train {
background-color: $no-timetable;
}
&[data-status='departed'] > &_train {
background-color: $departed;
}
&[data-status='stopped'] > &_train {
background-color: $stopped;
}
&[data-status='online'] > &_train {
background-color: $online;
}
&[data-status='terminated'] > &_train {
background-color: $terminated;
}
&[data-status='disconnected'] > &_train {
background-color: $disconnected;
}
&[data-status='offline'] {
background: firebrick;
pointer-events: none;
}
}
.users-anim {
&-move,
&-enter-active,
&-leave-active {
transition: all 250ms ease;
}
&-enter-from,
&-leave-to {
opacity: 0;
transform: translateX(5px);
}
&-leave-active {
position: absolute;
}
}
</style>