animacje statusów listy scenerii; fixy tłumaczeń

This commit is contained in:
2024-03-04 18:06:47 +01:00
parent b4a9d4ca3b
commit 032f82acd2
3 changed files with 288 additions and 284 deletions
+284 -279
View File
@@ -1,294 +1,298 @@
<template> <template>
<section class="station_table"> <section class="station_table">
<div class="table_wrapper"> <transition name="status-anim">
<table> <div class="table_wrapper" :key="apiStore.dataStatuses.connection">
<thead> <table>
<tr> <thead>
<th <tr>
v-for="headerName in headIds" <th
:key="headerName" v-for="headerName in headIds"
@click="changeSorter(headerName)" :key="headerName"
class="header-text" @click="changeSorter(headerName)"
:class="headerName" class="header-text"
:class="headerName"
>
<span class="header_wrapper">
<div v-html="$t(`sceneries.headers.${headerName}`)"></div>
<img
class="sort-icon"
v-if="sorterActive.headerName == headerName"
:src="`/images/icon-arrow-${sorterActive.dir == 1 ? 'asc' : 'desc'}.svg`"
alt="sort icon"
/>
</span>
</th>
<th
v-for="headerName in headIconsIds"
:key="headerName"
@click="changeSorter(headerName)"
class="header-image"
:class="headerName"
>
<span class="header_wrapper">
<img
:src="`/images/icon-${headerName}.svg`"
:alt="headerName"
:title="$t(`sceneries.headers.${headerName}`)"
/>
<img
class="sort-icon"
v-if="sorterActive.headerName == headerName"
:src="`/images/icon-arrow-${sorterActive.dir == 1 ? 'asc' : 'desc'}.svg`"
alt="sort icon"
/>
</span>
</th>
</tr>
</thead>
<tbody>
<tr
v-for="station in stations"
:class="{ 'last-selected': lastSelectedStationName == station.name }"
:key="station.name"
@click.left="setScenery(station.name)"
@click.right="openForumSite($event, station.generalInfo?.url)"
@keydown.enter="setScenery(station.name)"
@keydown.space="openForumSite($event, station.generalInfo?.url)"
tabindex="0"
> >
<span class="header_wrapper"> <td class="station-name" :class="station.generalInfo?.availability">
<div v-html="$t(`sceneries.headers.${headerName}`)"></div> <b v-if="station.generalInfo?.project" style="color: salmon">{{
station.generalInfo.project
}}</b>
{{ station.name }}
</td>
<img <td class="station-level">
class="sort-icon" <span v-if="station.generalInfo">
v-if="sorterActive.headerName == headerName" <span
:src="`/images/icon-arrow-${sorterActive.dir == 1 ? 'asc' : 'desc'}.svg`" v-if="
alt="sort icon" station.generalInfo.reqLevel > -1 &&
station.generalInfo.availability != 'nonPublic' &&
station.generalInfo.availability != 'unavailable'
"
:style="calculateExpStyle(station.generalInfo.reqLevel)"
>
{{ station.generalInfo.reqLevel >= 2 ? station.generalInfo.reqLevel : 'L' }}
</span>
<span v-else-if="station.generalInfo.availability == 'abandoned'">
<img
src="/images/icon-abandoned.svg"
alt="non-public"
:title="$t('sceneries.info.abandoned')"
/>
</span>
<span v-else-if="station.generalInfo.availability == 'nonPublic'">
<img
src="/images/icon-lock.svg"
alt="non-public"
:title="$t('sceneries.info.non-public')"
/>
</span>
<span v-else>
<img
src="/images/icon-unavailable.svg"
alt="unavailable"
:title="$t('sceneries.info.unavailable')"
/>
</span>
</span>
<span v-else> ? </span>
</td>
<td class="station-status">
<StationStatusBadge
:isOnline="station.onlineInfo ? true : false"
:dispatcherStatus="station.onlineInfo?.dispatcherStatus"
/> />
</span> </td>
</th>
<th <td class="station-dispatcher-name">
v-for="headerName in headIconsIds" <span v-if="station.onlineInfo?.dispatcherName">
:key="headerName" <b
@click="changeSorter(headerName)" v-if="apiStore.donatorsData.includes(station.onlineInfo.dispatcherName)"
class="header-image" :title="$t('donations.dispatcher-message')"
:class="headerName" @click.stop="openDonationModal"
> >
<span class="header_wrapper"> <img src="/images/icon-diamond.svg" alt="" />
<img {{ station.onlineInfo.dispatcherName }}
:src="`/images/icon-${headerName}.svg`" </b>
:alt="headerName"
:title="$t(`sceneries.headers.${headerName}`)"
/>
<img <div v-else>
class="sort-icon" {{ station.onlineInfo.dispatcherName }}
v-if="sorterActive.headerName == headerName" </div>
:src="`/images/icon-arrow-${sorterActive.dir == 1 ? 'asc' : 'desc'}.svg`" </span>
alt="sort icon" </td>
/>
</span>
</th>
</tr>
</thead>
<tbody> <td class="station-dispatcher-exp">
<tr
v-for="station in stations"
:class="{ 'last-selected': lastSelectedStationName == station.name }"
:key="station.name"
@click.left="setScenery(station.name)"
@click.right="openForumSite($event, station.generalInfo?.url)"
@keydown.enter="setScenery(station.name)"
@keydown.space="openForumSite($event, station.generalInfo?.url)"
tabindex="0"
>
<td class="station-name" :class="station.generalInfo?.availability">
<b v-if="station.generalInfo?.project" style="color: salmon">{{
station.generalInfo.project
}}</b>
{{ station.name }}
</td>
<td class="station-level">
<span v-if="station.generalInfo">
<span <span
v-if=" v-if="station.onlineInfo && station.onlineInfo?.dispatcherExp != -1"
station.generalInfo.reqLevel > -1 && :style="
station.generalInfo.availability != 'nonPublic' && calculateExpStyle(
station.generalInfo.availability != 'unavailable' station.onlineInfo.dispatcherExp,
station.onlineInfo.dispatcherIsSupporter
)
" "
:style="calculateExpStyle(station.generalInfo.reqLevel)"
> >
{{ station.generalInfo.reqLevel >= 2 ? station.generalInfo.reqLevel : 'L' }} {{
station.onlineInfo.dispatcherExp < 2 ? 'L' : station.onlineInfo.dispatcherExp
}}
</span> </span>
</td>
<span v-else-if="station.generalInfo.availability == 'abandoned'"> <td class="station-tracks">
<img <div v-if="station.generalInfo">
src="/images/icon-abandoned.svg" <span
alt="non-public" v-if="station.generalInfo.routes.singleElectrifiedNames.length != 0"
:title="$t('sceneries.info.abandoned')" class="track catenary"
/> :title="`${$t('sceneries.info.single-track-routes-catenary')}${
</span> station.generalInfo.routes.singleElectrifiedNames.length
}`"
>
{{ station.generalInfo.routes.singleElectrifiedNames.length }}
</span>
<span v-else-if="station.generalInfo.availability == 'nonPublic'"> <span
<img v-if="station.generalInfo.routes.singleOtherNames.length != 0"
src="/images/icon-lock.svg" class="track no-catenary"
alt="non-public" :title="`${$t('sceneries.info.single-track-routes-other')}${
:title="$t('sceneries.info.non-public')" station.generalInfo.routes.singleOtherNames.length
/> }`"
</span> >
{{ station.generalInfo.routes.singleOtherNames.length }}
<span v-else> </span>
<img
src="/images/icon-unavailable.svg"
alt="unavailable"
:title="$t('sceneries.info.unavailable')"
/>
</span>
</span>
<span v-else> ? </span>
</td>
<td class="station-status">
<StationStatusBadge
:isOnline="station.onlineInfo ? true : false"
:dispatcherStatus="station.onlineInfo?.dispatcherStatus"
/>
</td>
<td class="station-dispatcher-name">
<span v-if="station.onlineInfo?.dispatcherName">
<b
v-if="apiStore.donatorsData.includes(station.onlineInfo.dispatcherName)"
:title="$t('donations.dispatcher-message')"
@click.stop="openDonationModal"
>
<img src="/images/icon-diamond.svg" alt="" />
{{ station.onlineInfo.dispatcherName }}
</b>
<div v-else>
{{ station.onlineInfo.dispatcherName }}
</div> </div>
</span> </td>
</td>
<td class="station-dispatcher-exp"> <td class="station-tracks">
<span <div v-if="station.generalInfo">
v-if="station.onlineInfo && station.onlineInfo?.dispatcherExp != -1" <span
:style=" v-if="station.generalInfo.routes.doubleElectrifiedNames.length != 0"
calculateExpStyle( class="track catenary"
station.onlineInfo.dispatcherExp, :title="`${$t('sceneries.info.double-track-routes-catenary')}${
station.onlineInfo.dispatcherIsSupporter station.generalInfo.routes.doubleElectrifiedNames.length
) }`"
" >
{{ station.generalInfo.routes.doubleElectrifiedNames.length }}
</span>
<span
v-if="station.generalInfo.routes.doubleOtherNames.length != 0"
class="track no-catenary"
:title="`${$t('sceneries.info.double-track-routes-other')}${
station.generalInfo.routes.doubleOtherNames.length
}`"
>
{{ station.generalInfo.routes.doubleOtherNames.length }}
</span>
</div>
</td>
<td class="station-info" v-if="station.generalInfo">
<span
class="scenery-icon icon-info"
:class="station.generalInfo.controlType.replace('+', '-')"
:title="
$t('sceneries.info.control-type') +
$t(`controls.${station.generalInfo.controlType}`)
"
v-html="getControlTypeAbbrev(station.generalInfo.controlType)"
>
</span>
<img
class="icon-info"
v-if="station.generalInfo.signalType"
:src="`/images/icon-${station.generalInfo.signalType}.svg`"
:alt="station.generalInfo.signalType"
:title="
$t('sceneries.info.signals-type') +
$t(`signals.${station.generalInfo.signalType}`)
"
/>
<img
class="icon-info"
v-if="station.generalInfo.SUP"
src="/images/icon-SUP.svg"
alt="SUP (RASP-UZK)"
:title="$t('sceneries.info.SUP')"
/>
<img
class="icon-info"
v-if="station.generalInfo.ASDEK"
src="/images/icon-ASDEK.svg"
alt="dSAT ASDEK"
:title="$t('sceneries.info.ASDEK')"
/>
</td>
<td class="station-info" v-else>
<img
class="icon-info"
src="/images/icon-unknown.svg"
alt="icon-unknown"
:title="$t('sceneries.info.unknown')"
/>
</td>
<td class="station-users" :class="{ inactive: !station.onlineInfo }">
<span class="text--primary">{{ station.onlineInfo?.currentUsers || 0 }}</span>
/
<span class="text--primary">{{ station.onlineInfo?.maxUsers || 0 }}</span>
</td>
<td class="station-likes">
<span>{{ station.onlineInfo?.dispatcherRate ?? 0 }}</span>
</td>
<td class="station-spawns" :class="{ inactive: !station.onlineInfo }">
<span>{{ station.onlineInfo?.spawns.length ?? 0 }}</span>
</td>
<td
class="station-schedules all"
style="width: 30px"
:class="{ inactive: !station.onlineInfo }"
> >
{{ station.onlineInfo.dispatcherExp < 2 ? 'L' : station.onlineInfo.dispatcherExp }} {{ station.onlineInfo?.scheduledTrainCount.all }}
</span> </td>
</td>
<td class="station-tracks"> <td
<div v-if="station.generalInfo"> class="station-schedules unconfirmed"
<span style="width: 30px"
v-if="station.generalInfo.routes.singleElectrifiedNames.length != 0" :class="{ inactive: !station.onlineInfo }"
class="track catenary"
:title="`${$t('sceneries.info.single-track-routes-catenary')}${
station.generalInfo.routes.singleElectrifiedNames.length
}`"
>
{{ station.generalInfo.routes.singleElectrifiedNames.length }}
</span>
<span
v-if="station.generalInfo.routes.singleOtherNames.length != 0"
class="track no-catenary"
:title="`${$t('sceneries.info.single-track-routes-other')}${
station.generalInfo.routes.singleOtherNames.length
}`"
>
{{ station.generalInfo.routes.singleOtherNames.length }}
</span>
</div>
</td>
<td class="station-tracks">
<div v-if="station.generalInfo">
<span
v-if="station.generalInfo.routes.doubleElectrifiedNames.length != 0"
class="track catenary"
:title="`${$t('sceneries.info.double-track-routes-catenary')}${
station.generalInfo.routes.doubleElectrifiedNames.length
}`"
>
{{ station.generalInfo.routes.doubleElectrifiedNames.length }}
</span>
<span
v-if="station.generalInfo.routes.doubleOtherNames.length != 0"
class="track no-catenary"
:title="`${$t('sceneries.info.double-track-routes-other')}${
station.generalInfo.routes.doubleOtherNames.length
}`"
>
{{ station.generalInfo.routes.doubleOtherNames.length }}
</span>
</div>
</td>
<td class="station-info" v-if="station.generalInfo">
<span
class="scenery-icon icon-info"
:class="station.generalInfo.controlType.replace('+', '-')"
:title="
$t('sceneries.info.control-type') +
$t(`controls.${station.generalInfo.controlType}`)
"
v-html="getControlTypeAbbrev(station.generalInfo.controlType)"
> >
</span> {{ station.onlineInfo?.scheduledTrainCount.unconfirmed }}
</td>
<img <td
class="icon-info" class="station-schedules confirmed"
v-if="station.generalInfo.signalType" style="width: 30px"
:src="`/images/icon-${station.generalInfo.signalType}.svg`" :class="{ inactive: !station.onlineInfo }"
:alt="station.generalInfo.signalType" >
:title=" {{ station.onlineInfo?.scheduledTrainCount.confirmed }}
$t('sceneries.info.signals-type') + </td>
$t(`signals.${station.generalInfo.signalType}`) </tr>
" </tbody>
/> </table>
<img <Loading v-if="apiStore.dataStatuses.connection == Status.Loading" />
class="icon-info"
v-if="station.generalInfo.SUP"
src="/images/icon-SUP.svg"
alt="SUP (RASP-UZK)"
:title="$t('sceneries.info.SUP')"
/>
<img <div class="no-stations" v-else-if="stations.length == 0">
class="icon-info" {{ $t('sceneries.no-stations') }}
v-if="station.generalInfo.ASDEK" </div>
src="/images/icon-ASDEK.svg" </div>
alt="dSAT ASDEK" </transition>
:title="$t('sceneries.info.ASDEK')"
/>
</td>
<td class="station-info" v-else>
<img
class="icon-info"
src="/images/icon-unknown.svg"
alt="icon-unknown"
:title="$t('sceneries.info.unknown')"
/>
</td>
<td class="station-users" :class="{ inactive: !station.onlineInfo }">
<span class="text--primary">{{ station.onlineInfo?.currentUsers || 0 }}</span>
/
<span class="text--primary">{{ station.onlineInfo?.maxUsers || 0 }}</span>
</td>
<td class="station-likes">
<span>{{ station.onlineInfo?.dispatcherRate ?? 0 }}</span>
</td>
<td class="station-spawns" :class="{ inactive: !station.onlineInfo }">
<span>{{ station.onlineInfo?.spawns.length ?? 0 }}</span>
</td>
<td
class="station-schedules all"
style="width: 30px"
:class="{ inactive: !station.onlineInfo }"
>
{{ station.onlineInfo?.scheduledTrainCount.all }}
</td>
<td
class="station-schedules unconfirmed"
style="width: 30px"
:class="{ inactive: !station.onlineInfo }"
>
{{ station.onlineInfo?.scheduledTrainCount.unconfirmed }}
</td>
<td
class="station-schedules confirmed"
style="width: 30px"
:class="{ inactive: !station.onlineInfo }"
>
{{ station.onlineInfo?.scheduledTrainCount.confirmed }}
</td>
</tr>
</tbody>
</table>
</div>
<Loading v-if="apiStore.dataStatuses.connection == Status.Loading" />
<div class="no-stations" v-else-if="stations.length == 0">
{{ $t('sceneries.no-stations') }}
</div>
</section> </section>
</template> </template>
@@ -400,8 +404,9 @@ $rowCol: #424242;
.table_wrapper { .table_wrapper {
overflow: auto; overflow: auto;
overflow-y: hidden;
font-weight: 500; font-weight: 500;
height: 90vh;
min-height: 550px;
} }
.no-stations { .no-stations {
@@ -430,39 +435,39 @@ table {
top: 0; top: 0;
&.station { &.station {
width: 200px; width: 12em;
} }
&.min-lvl { &.min-lvl {
width: 120px; width: 4em;
} }
&.status { &.status {
width: 140px; width: 10em;
} }
&.dispatcher { &.dispatcher {
width: 230px; width: 12em;
} }
&.dispatcher-lvl { &.dispatcher-lvl {
width: 100px; width: 6em;
} }
&.routes-double, &.routes-double,
&.routes-single { &.routes-single {
width: 80px; width: 7em;
} }
&.general { &.general {
width: 160px; width: 10em;
} }
&.header-image { &.header-image {
width: 60px; width: 3.5em;
&.user { &.user {
width: 75px; width: 5em;
} }
} }
+2 -2
View File
@@ -234,8 +234,8 @@
}, },
"sceneries": { "sceneries": {
"headers": { "headers": {
"station": "Station", "station": "Scenery",
"min-lvl": "Station\nlevel", "min-lvl": "Scenery\nlevel",
"status": "Status", "status": "Status",
"dispatcher": "Dispatcher", "dispatcher": "Dispatcher",
"dispatcher-lvl": "Dispatcher\nlevel", "dispatcher-lvl": "Dispatcher\nlevel",
+2 -3
View File
@@ -225,9 +225,8 @@
}, },
"sceneries": { "sceneries": {
"headers": { "headers": {
"station": "Stacja", "station": "Sceneria",
"abbr": "Skrót\nposterunku", "min-lvl": "Poziom\nscenerii",
"min-lvl": "Poziom\nstacji",
"status": "Status", "status": "Status",
"dispatcher": "Dyżurny", "dispatcher": "Dyżurny",
"dispatcher-lvl": "Poziom\ndyżurnego", "dispatcher-lvl": "Poziom\ndyżurnego",