mirror of
https://github.com/Spythere/stacjownik.git
synced 2026-05-03 13:28:11 +00:00
Compare commits
28 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 430a05ab38 | |||
| f335ca8fc2 | |||
| 15e599fe3c | |||
| bd25914ed4 | |||
| 01ea259381 | |||
| aea26fa538 | |||
| 28d78cd2bc | |||
| a021deae96 | |||
| 8840576796 | |||
| 5018e21736 | |||
| a7fa1dfb6d | |||
| a3558c0b30 | |||
| ee159fd582 | |||
| 35c9fb7ef1 | |||
| e24097c240 | |||
| 01cbebd019 | |||
| 3a5ef7e025 | |||
| c78a5b4d67 | |||
| 023de9f7b8 | |||
| 1024e44cc0 | |||
| 580d404d4a | |||
| 6d1ef26ac1 | |||
| bf9799e0c3 | |||
| 1d13e31d79 | |||
| 16f272bd7d | |||
| 23ca33264c | |||
| 324ca3de4d | |||
| e0548e593c |
+60
-4
@@ -22,10 +22,64 @@
|
||||
|
||||
<link rel="icon" href="favicon.ico" />
|
||||
|
||||
<link rel="stylesheet" href="fa/css/fontawesome.css" />
|
||||
<link rel="stylesheet" href="fa/css/brands.css" />
|
||||
<link rel="stylesheet" href="fa/css/regular.css" />
|
||||
<link rel="stylesheet" href="fa/css/solid.css" />
|
||||
<link rel="stylesheet" href="/fa/css/fontawesome.css" />
|
||||
<link rel="stylesheet" href="/fa/css/brands.css" />
|
||||
<link rel="stylesheet" href="/fa/css/regular.css" />
|
||||
<link rel="stylesheet" href="/fa/css/solid.css" />
|
||||
|
||||
<!-- Preloads -->
|
||||
<link rel="preload" href="fonts/Quicksand-Bold.woff2" as="font" type="font/woff2" crossorigin />
|
||||
|
||||
<link
|
||||
rel="preload"
|
||||
href="/fonts/Quicksand-Light.woff2"
|
||||
as="font"
|
||||
type="font/woff2"
|
||||
crossorigin
|
||||
/>
|
||||
|
||||
<link
|
||||
rel="preload"
|
||||
href="/fonts/Quicksand-Medium.woff2"
|
||||
as="font"
|
||||
type="font/woff2"
|
||||
crossorigin
|
||||
/>
|
||||
|
||||
<link
|
||||
rel="preload"
|
||||
href="/fonts/Quicksand-Regular.woff2"
|
||||
as="font"
|
||||
type="font/woff2"
|
||||
crossorigin
|
||||
/>
|
||||
|
||||
<link
|
||||
rel="preload"
|
||||
href="/fonts/Quicksand-SemiBold.woff2"
|
||||
as="font"
|
||||
type="font/woff2"
|
||||
crossorigin
|
||||
/>
|
||||
|
||||
<link rel="preload" as="image" href="/images/icon-pl.svg" />
|
||||
<link rel="preload" as="image" href="/images/stacjownik-header-logo.svg" />
|
||||
<link rel="preload" as="image" href="/images/icon-dispatcher.svg" />
|
||||
<link rel="preload" as="image" href="/images/icon-train.svg" />
|
||||
<link rel="preload" as="image" href="/images/icon-arrow-asc.svg" />
|
||||
<link rel="preload" as="image" href="/images/icon-arrow-desc.svg" />
|
||||
<link rel="preload" as="image" href="/images/icon-filter2.svg" />
|
||||
<link rel="preload" as="image" href="/images/icon-stats.svg" />
|
||||
<link rel="preload" as="image" href="/images/icon-gnr.svg" />
|
||||
<link rel="preload" as="image" href="/images/icon-pojazdownik.svg" />
|
||||
<link rel="preload" as="image" href="/images/icon-diamond.svg" />
|
||||
<link rel="preload" as="image" href="/images/icon-user.svg" />
|
||||
<link rel="preload" as="image" href="/images/icon-like.svg" />
|
||||
<link rel="preload" as="image" href="/images/icon-spawn.svg" />
|
||||
<link rel="preload" as="image" href="/images/icon-timetableAll.svg" />
|
||||
<link rel="preload" as="image" href="/images/icon-timetableUnconfirmed.svg" />
|
||||
<link rel="preload" as="image" href="/images/icon-timetableConfirmed.svg" />
|
||||
<link rel="preload" as="image" href="/images/icon-discord.png" />
|
||||
|
||||
<!-- Static OpenGraph meta -->
|
||||
<meta name="description" content="Pomocnik maszynisty i dyżurnego symulatora Train Driver 2" />
|
||||
@@ -36,10 +90,12 @@
|
||||
property="og:description"
|
||||
content="Pomocnik maszynisty i dyżurnego symulatora Train Driver 2"
|
||||
/>
|
||||
|
||||
<meta
|
||||
property="og:image"
|
||||
content="https://raw.githubusercontent.com/Spythere/api/main/thumbnails/stacjownik.jpg"
|
||||
/>
|
||||
|
||||
<meta property="og:image:width" content="1200" />
|
||||
<meta property="og:image:height" content="630" />
|
||||
<meta property="og:site_name" content="Stacjownik" />
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "stacjownik",
|
||||
"version": "1.30.5",
|
||||
"version": "1.30.7",
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-gb" viewBox="0 0 640 480">
|
||||
<path fill="#012169" d="M0 0h640v480H0z"/>
|
||||
<path fill="#FFF" d="m75 0 244 181L562 0h78v62L400 241l240 178v61h-80L320 301 81 480H0v-60l239-178L0 64V0z"/>
|
||||
<path fill="#C8102E" d="m424 281 216 159v40L369 281zm-184 20 6 35L54 480H0zM640 0v3L391 191l2-44L590 0zM0 0l239 176h-60L0 42z"/>
|
||||
<path fill="#FFF" d="M241 0v480h160V0zM0 160v160h640V160z"/>
|
||||
<path fill="#C8102E" d="M0 193v96h640v-96zM273 0v480h96V0z"/>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 504 B |
@@ -1,4 +1,6 @@
|
||||
<svg width="39" height="23" viewBox="0 0 39 23" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<rect width="39" height="23" fill="#FF0F0F"/>
|
||||
<rect width="39" height="11.5" fill="white"/>
|
||||
</svg>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" id="flag-icons-pl" viewBox="0 0 640 480">
|
||||
<g fill-rule="evenodd">
|
||||
<path fill="#fff" d="M640 480H0V0h640z"/>
|
||||
<path fill="#dc143c" d="M640 480H0V240h640z"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
||||
|
Before Width: | Height: | Size: 199 B After Width: | Height: | Size: 219 B |
+4
-11
@@ -9,11 +9,11 @@
|
||||
|
||||
<Tooltip />
|
||||
|
||||
<AppHeader :current-lang="store.currentLocale" @change-lang="changeLang" />
|
||||
<AppHeader />
|
||||
|
||||
<main class="app_main">
|
||||
<router-view v-slot="{ Component }">
|
||||
<keep-alive exclude="SceneryView">
|
||||
<keep-alive>
|
||||
<component :is="Component" :key="$route.name" />
|
||||
</keep-alive>
|
||||
</router-view>
|
||||
@@ -159,18 +159,11 @@ export default defineComponent({
|
||||
this.apiStore.connectToAPI();
|
||||
},
|
||||
|
||||
changeLang(lang: string) {
|
||||
this.$i18n.locale = lang;
|
||||
this.store.currentLocale = lang;
|
||||
|
||||
StorageManager.setStringValue('lang', lang);
|
||||
},
|
||||
|
||||
loadLang() {
|
||||
const storageLang = StorageManager.getStringValue('lang');
|
||||
|
||||
if (storageLang) {
|
||||
this.changeLang(storageLang);
|
||||
this.store.changeLocale(storageLang);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -179,7 +172,7 @@ export default defineComponent({
|
||||
const naviLanguage = window.navigator.language.toString();
|
||||
|
||||
if (!naviLanguage.startsWith('pl')) {
|
||||
this.changeLang('en');
|
||||
this.store.changeLocale('en');
|
||||
return;
|
||||
}
|
||||
},
|
||||
|
||||
@@ -1,18 +1,6 @@
|
||||
<template>
|
||||
<header class="app_header">
|
||||
<div class="header_container">
|
||||
<div class="header_icons">
|
||||
<span class="icons-top">
|
||||
<img
|
||||
src="/images/icon-pl.svg"
|
||||
alt="icon-pl"
|
||||
@click="changeLang('en')"
|
||||
v-if="currentLang == 'pl'"
|
||||
/>
|
||||
<img src="/images/icon-en.jpg" alt="icon-en" @click="changeLang('pl')" v-else />
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<div class="header_body">
|
||||
<StatusIndicator />
|
||||
|
||||
@@ -76,27 +64,12 @@ import RegionDropdown from '../Global/RegionDropdown.vue';
|
||||
export default defineComponent({
|
||||
components: { StatusIndicator, Clock, RegionDropdown },
|
||||
|
||||
emits: ['changeLang'],
|
||||
|
||||
props: {
|
||||
currentLang: {
|
||||
type: String,
|
||||
required: true
|
||||
}
|
||||
},
|
||||
|
||||
setup() {
|
||||
return {
|
||||
store: useMainStore()
|
||||
};
|
||||
},
|
||||
|
||||
methods: {
|
||||
changeLang(lang: string) {
|
||||
this.$emit('changeLang', lang);
|
||||
}
|
||||
},
|
||||
|
||||
computed: {
|
||||
onlineTrainsCount() {
|
||||
return this.store.trainList.filter((train) => train.region == this.store.region.id).length;
|
||||
@@ -141,7 +114,7 @@ export default defineComponent({
|
||||
|
||||
border-radius: 0 0 1em 1em;
|
||||
|
||||
@include responsive.smallScreen{
|
||||
@include responsive.smallScreen {
|
||||
position: relative;
|
||||
margin-top: 0.5em;
|
||||
}
|
||||
@@ -180,20 +153,12 @@ export default defineComponent({
|
||||
|
||||
padding: 0.5em;
|
||||
|
||||
@include responsive.smallScreen{
|
||||
@include responsive.smallScreen {
|
||||
transform: translateX(85%);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ICONS
|
||||
.icons-top {
|
||||
img {
|
||||
width: 2.5em;
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
|
||||
// COUNTER
|
||||
.info_counter {
|
||||
display: flex;
|
||||
|
||||
@@ -4,12 +4,12 @@
|
||||
<h1>{{ $t('welcome.title') }}</h1>
|
||||
|
||||
<div class="language-select">
|
||||
<button :data-active="$i18n.locale == 'pl'" @click="changeLang('pl')">
|
||||
<button :data-active="$i18n.locale == 'pl'" @click="store.changeLocale('pl')">
|
||||
<img src="/images/icon-pl.svg" alt="" width="45" />
|
||||
</button>
|
||||
|
||||
<button :data-active="$i18n.locale == 'en'" @click="changeLang('en')">
|
||||
<img src="/images/icon-en.jpg" alt="" width="45" />
|
||||
<button :data-active="$i18n.locale == 'en'" @click="store.changeLocale('en')">
|
||||
<img src="/images/icon-en.svg" alt="" width="45" />
|
||||
</button>
|
||||
</div>
|
||||
|
||||
@@ -114,12 +114,9 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { useI18n } from 'vue-i18n';
|
||||
import Card from '../Global/Card.vue';
|
||||
import { useMainStore } from '../../store/mainStore';
|
||||
import StorageManager from '../../managers/storageManager';
|
||||
|
||||
const i18n = useI18n();
|
||||
const store = useMainStore();
|
||||
|
||||
const emit = defineEmits(['toggleCard']);
|
||||
@@ -130,13 +127,6 @@ const props = defineProps({
|
||||
function toggleCard(state: boolean) {
|
||||
emit('toggleCard', state);
|
||||
}
|
||||
|
||||
function changeLang(localeName: string) {
|
||||
i18n.locale.value = localeName;
|
||||
store.currentLocale = localeName;
|
||||
|
||||
StorageManager.setStringValue('lang', localeName);
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
<img
|
||||
v-for="(thumbnailImage, imageIndex) in images"
|
||||
:src="`https://stacjownik.spythere.eu/static/thumbnails/${thumbnailImage}.png`"
|
||||
height="60"
|
||||
height="70"
|
||||
loading="lazy"
|
||||
data-tooltip-type="VehiclePreviewTooltip"
|
||||
:data-tooltip-content="vehicleString"
|
||||
@@ -20,7 +20,7 @@
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
<script setup lang="ts">
|
||||
import { computed, PropType, Ref, ref } from 'vue';
|
||||
|
||||
const props = defineProps({
|
||||
@@ -56,16 +56,17 @@ function onImageLoad() {
|
||||
transition: opacity 100ms ease-in-out;
|
||||
|
||||
&[data-load-status='loading'] {
|
||||
min-height: 60px;
|
||||
min-height: 70px;
|
||||
min-width: 200px;
|
||||
}
|
||||
}
|
||||
|
||||
.stock-text {
|
||||
max-width: 90%;
|
||||
text-align: center;
|
||||
color: #aaa;
|
||||
font-size: 0.9em;
|
||||
margin-bottom: 0.25em;
|
||||
font-size: 0.85em;
|
||||
margin: 0 auto;
|
||||
padding: 0.25em 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -96,6 +96,7 @@ export default defineComponent({
|
||||
data() {
|
||||
return {
|
||||
historyList: [] as API.DispatcherHistory.Response,
|
||||
lastStationName: '',
|
||||
dataStatus: Status.Data.Loading,
|
||||
DataStatus: Status.Data,
|
||||
apiStore: useApiStore()
|
||||
@@ -103,10 +104,10 @@ export default defineComponent({
|
||||
},
|
||||
|
||||
async activated() {
|
||||
// if (this.historyList.length == 0) {
|
||||
this.historyList.length = 0;
|
||||
|
||||
const fetchedHistory = await this.fetchAPIData();
|
||||
if (fetchedHistory) this.historyList = fetchedHistory;
|
||||
// }
|
||||
},
|
||||
|
||||
methods: {
|
||||
@@ -194,7 +195,7 @@ export default defineComponent({
|
||||
color: springgreen;
|
||||
}
|
||||
|
||||
@include responsive.smallScreen{
|
||||
@include responsive.smallScreen {
|
||||
.journal-list > div {
|
||||
flex-direction: column;
|
||||
justify-content: center;
|
||||
|
||||
@@ -118,6 +118,7 @@ export default defineComponent({
|
||||
align-items: center;
|
||||
|
||||
width: 3em;
|
||||
height: 3em;
|
||||
margin: 0.25em;
|
||||
|
||||
border: 2px solid #4e4e4e;
|
||||
|
||||
@@ -40,36 +40,28 @@
|
||||
<span>
|
||||
{{ $t('scenery.timetable-issued-date') }}
|
||||
<b>
|
||||
{{
|
||||
localeDateTime(
|
||||
timetableHistory.createdAt > timetableHistory.beginDate
|
||||
? timetableHistory.beginDate
|
||||
: timetableHistory.createdAt,
|
||||
$i18n.locale
|
||||
)
|
||||
}}
|
||||
</b></span
|
||||
>
|
||||
<span v-if="timetableHistory.authorName">
|
||||
{{ $t('scenery.timetable-issued-by') }}
|
||||
<b>
|
||||
<router-link
|
||||
:to="`/journal/timetables?search-dispatcher=${timetableHistory.authorName}`"
|
||||
>
|
||||
{{ timetableHistory.authorName }}
|
||||
</router-link>
|
||||
{{ parseCreatedDate(timetableHistory, $i18n.locale) }}
|
||||
</b>
|
||||
</span>
|
||||
|
||||
<span>
|
||||
{{ $t('scenery.timetable-issued-for') }}
|
||||
<b>
|
||||
<router-link
|
||||
:to="`/journal/timetables?search-driver=${timetableHistory.driverName}`"
|
||||
>
|
||||
{{ timetableHistory.driverName }}
|
||||
</router-link>
|
||||
</b>
|
||||
<router-link
|
||||
class="journal-link"
|
||||
:to="`/journal/timetables?search-driver=${timetableHistory.driverName}`"
|
||||
>
|
||||
{{ timetableHistory.driverName }}
|
||||
</router-link>
|
||||
</span>
|
||||
|
||||
<span v-if="timetableHistory.authorName">
|
||||
{{ $t('scenery.timetable-issued-by') }}
|
||||
<router-link
|
||||
class="journal-link"
|
||||
:to="`/journal/timetables?search-dispatcher=${timetableHistory.authorName}`"
|
||||
>
|
||||
{{ timetableHistory.authorName }}
|
||||
</router-link>
|
||||
</span>
|
||||
</div>
|
||||
</span>
|
||||
@@ -106,7 +98,7 @@ import { useApiStore } from '../../store/apiStore';
|
||||
import routerMixin from '../../mixins/routerMixin';
|
||||
import { useMainStore } from '../../store/mainStore';
|
||||
|
||||
const historyModeList = ['via', 'issuedFrom', 'terminatingAt'] as const;
|
||||
const historyModeList = ['includesScenery', 'issuedFrom', 'via', 'terminatingAt'] as const;
|
||||
type HistoryMode = (typeof historyModeList)[number];
|
||||
|
||||
export default defineComponent({
|
||||
@@ -131,17 +123,19 @@ export default defineComponent({
|
||||
dataStatus: Status.Data.Loading,
|
||||
DataStatus: Status.Data,
|
||||
|
||||
checkedHistoryMode: 'via' as HistoryMode
|
||||
checkedHistoryMode: 'includesScenery' as HistoryMode
|
||||
};
|
||||
},
|
||||
|
||||
async activated() {
|
||||
this.checkedHistoryMode = 'includesScenery';
|
||||
this.fetchAPIData();
|
||||
},
|
||||
|
||||
methods: {
|
||||
async fetchAPIData() {
|
||||
const stationName = this.$route.query['station'];
|
||||
this.dataStatus = Status.Data.Loading;
|
||||
|
||||
if (!stationName) {
|
||||
this.historyList = [];
|
||||
@@ -152,6 +146,7 @@ export default defineComponent({
|
||||
const requestFilters: Record<string, any> = {};
|
||||
requestFilters[this.checkedHistoryMode] = stationName.toString();
|
||||
requestFilters.countLimit = 30;
|
||||
requestFilters['returnType'] = 'short';
|
||||
|
||||
try {
|
||||
const response: API.TimetableHistory.Response = await (
|
||||
@@ -165,12 +160,12 @@ export default defineComponent({
|
||||
this.dataStatus = Status.Data.Loaded;
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
this.dataStatus = Status.Data.Error;
|
||||
}
|
||||
},
|
||||
|
||||
checkHistoryMode(mode: HistoryMode) {
|
||||
this.checkedHistoryMode = mode;
|
||||
this.dataStatus = Status.Data.Loading;
|
||||
this.fetchAPIData();
|
||||
},
|
||||
|
||||
@@ -181,6 +176,18 @@ export default defineComponent({
|
||||
[`search-${this.checkedHistoryMode}`]: this.station?.name || this.onlineScenery?.name
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
parseCreatedDate(timetable: API.TimetableHistory.Data, locale: string) {
|
||||
const createdDate =
|
||||
timetable.createdAt > timetable.beginDate
|
||||
? new Date(timetable.beginDate)
|
||||
: new Date(timetable.createdAt);
|
||||
|
||||
return createdDate.toLocaleString(locale == 'pl' ? 'pl-PL' : 'en-GB', {
|
||||
timeStyle: 'short',
|
||||
dateStyle: 'medium'
|
||||
});
|
||||
}
|
||||
},
|
||||
components: { Loading }
|
||||
@@ -215,7 +222,15 @@ export default defineComponent({
|
||||
|
||||
button {
|
||||
padding: 0.35em;
|
||||
min-width: 120px;
|
||||
}
|
||||
}
|
||||
|
||||
.journal-link {
|
||||
font-weight: bold;
|
||||
color: #eee;
|
||||
|
||||
&:hover {
|
||||
color: var(--clr-primary);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -21,9 +21,7 @@
|
||||
<template v-else>{{ $t('filters.no-changed-filters') }}</template>
|
||||
</div>
|
||||
|
||||
<section class="card_sceneries-search">
|
||||
<h3 class="section-header">{{ $t('filters.sceneries-search') }}</h3>
|
||||
|
||||
<section class="card_input-search">
|
||||
<datalist id="sceneries">
|
||||
<option
|
||||
v-for="scenery in sortedStationList"
|
||||
@@ -32,18 +30,60 @@
|
||||
></option>
|
||||
</datalist>
|
||||
|
||||
<form action="javascript:void(0);" @submit="handleSceneriesInput">
|
||||
<input
|
||||
v-model="chosenSearchScenery"
|
||||
id="scenery-search"
|
||||
list="sceneries"
|
||||
:placeholder="$t('filters.sceneries-placeholder')"
|
||||
@focus="preventKeyDown = true"
|
||||
@blur="preventKeyDown = false"
|
||||
/>
|
||||
<input
|
||||
v-model="chosenSearchScenery"
|
||||
id="scenery-search"
|
||||
list="sceneries"
|
||||
:placeholder="$t('filters.sceneries-placeholder')"
|
||||
@focus="preventKeyDown = true"
|
||||
@blur="preventKeyDown = false"
|
||||
/>
|
||||
|
||||
<button class="btn--action">{{ $t('filters.search-button-title') }}</button>
|
||||
</form>
|
||||
<button class="btn--action" @click="handleSceneriesInput">
|
||||
{{ $t('filters.search-button-title') }}
|
||||
</button>
|
||||
</section>
|
||||
|
||||
<section class="card_input-search authors">
|
||||
<datalist id="authors" name="authors">
|
||||
<option v-for="(author, i) in authorsOptions" :key="i" :value="author"></option>
|
||||
</datalist>
|
||||
|
||||
<input
|
||||
type="text"
|
||||
id="author"
|
||||
list="authors"
|
||||
name="authors"
|
||||
v-model="filters['authors']"
|
||||
:placeholder="$t('filters.authors-placeholder')"
|
||||
@focus="preventKeyDown = true"
|
||||
@blur="preventKeyDown = false"
|
||||
/>
|
||||
|
||||
<button class="btn--action btn--image" @click="resetAuthorsInput">
|
||||
<img src="/images/icon-exit.svg" alt="reset authors search" />
|
||||
</button>
|
||||
</section>
|
||||
|
||||
<section class="card_input-search">
|
||||
<datalist id="projects" name="projects">
|
||||
<option v-for="(project, i) in projectsOptions" :key="i" :value="project"></option>
|
||||
</datalist>
|
||||
|
||||
<input
|
||||
type="text"
|
||||
id="projects"
|
||||
list="projects"
|
||||
name="projects"
|
||||
v-model="filters['projects']"
|
||||
:placeholder="$t('filters.projects-placeholder')"
|
||||
@focus="preventKeyDown = true"
|
||||
@blur="preventKeyDown = false"
|
||||
/>
|
||||
|
||||
<button class="btn--action btn--image" @click="resetProjectsInput">
|
||||
<img src="/images/icon-exit.svg" alt="reset projects search" />
|
||||
</button>
|
||||
</section>
|
||||
|
||||
<section class="card_options">
|
||||
@@ -97,29 +137,6 @@
|
||||
</span>
|
||||
</section>
|
||||
|
||||
<section class="card_authors-search">
|
||||
<h3 class="section-header">{{ $t('filters.authors-search') }}</h3>
|
||||
|
||||
<datalist id="authors" name="authors">
|
||||
<option v-for="(author, i) in authorsHint" :key="i" :value="author"></option>
|
||||
</datalist>
|
||||
|
||||
<form action="javascript:void(0);" @submit="handleAuthorsInput">
|
||||
<input
|
||||
type="text"
|
||||
id="author"
|
||||
list="authors"
|
||||
name="authors"
|
||||
v-model="authors"
|
||||
:placeholder="$t('filters.authors-placeholder')"
|
||||
@focus="preventKeyDown = true"
|
||||
@blur="preventKeyDown = false"
|
||||
/>
|
||||
|
||||
<button class="btn--action">{{ $t('filters.search-button-title') }}</button>
|
||||
</form>
|
||||
</section>
|
||||
|
||||
<section class="card_sliders">
|
||||
<div class="slider" v-for="(slider, i) in sliderStates" :key="i">
|
||||
<input
|
||||
@@ -200,7 +217,8 @@ export default defineComponent({
|
||||
sliderStates,
|
||||
|
||||
minimumHours: 0,
|
||||
authors: '',
|
||||
authorSearchFilter: '',
|
||||
projectSearchFilter: '',
|
||||
|
||||
currentRegion: { id: '', value: '' },
|
||||
|
||||
@@ -255,11 +273,7 @@ export default defineComponent({
|
||||
.sort((s1, s2) => (s1.name > s2.name ? 1 : -1));
|
||||
},
|
||||
|
||||
currentOptionsActive() {
|
||||
return true;
|
||||
},
|
||||
|
||||
authorsHint() {
|
||||
authorsOptions() {
|
||||
return this.store.stationList
|
||||
.reduce((acc, station) => {
|
||||
station.generalInfo?.authors?.forEach((author) => {
|
||||
@@ -270,6 +284,17 @@ export default defineComponent({
|
||||
return acc;
|
||||
}, [] as string[])
|
||||
.sort((a, b) => a.localeCompare(b));
|
||||
},
|
||||
|
||||
projectsOptions() {
|
||||
return this.store.stationList
|
||||
.reduce((acc, station) => {
|
||||
if (!station.generalInfo || !station.generalInfo.project || station.generalInfo.hidden) return acc;
|
||||
if (!acc.includes(station.generalInfo.project.trim())) acc.push(station.generalInfo.project.trim());
|
||||
|
||||
return acc;
|
||||
}, [] as string[])
|
||||
.sort((a, b) => a.localeCompare(b));
|
||||
}
|
||||
},
|
||||
|
||||
@@ -294,8 +319,12 @@ export default defineComponent({
|
||||
this.scrollTop = (e.target as HTMLElement).scrollTop;
|
||||
},
|
||||
|
||||
handleAuthorsInput() {
|
||||
this.filters['authors'] = this.authors;
|
||||
resetAuthorsInput() {
|
||||
this.filters['authors'] = this.authorSearchFilter;
|
||||
},
|
||||
|
||||
resetProjectsInput() {
|
||||
this.filters['projects'] = this.projectSearchFilter;
|
||||
},
|
||||
|
||||
handleSceneriesInput() {
|
||||
@@ -340,7 +369,7 @@ export default defineComponent({
|
||||
|
||||
// Reset local model values
|
||||
this.minimumHours = 0;
|
||||
this.authors = '';
|
||||
this.authorSearchFilter = '';
|
||||
|
||||
// Reset global filters
|
||||
Object.keys(this.filters).forEach((filterKey) => {
|
||||
@@ -456,27 +485,23 @@ h3.section-header {
|
||||
}
|
||||
}
|
||||
|
||||
.card_authors-search,
|
||||
.card_sceneries-search {
|
||||
margin: 1em 0;
|
||||
.card_input-search {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
gap: 0.5em;
|
||||
|
||||
form {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
flex-wrap: wrap;
|
||||
gap: 0.5em;
|
||||
width: 100%;
|
||||
margin-top: 1em;
|
||||
button {
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
input {
|
||||
width: 70%;
|
||||
max-width: 400px;
|
||||
width: 100%;
|
||||
padding: 0.5em;
|
||||
outline: 1px solid white;
|
||||
border: 1px solid #aaa;
|
||||
}
|
||||
|
||||
&.authors {
|
||||
margin-top: 1em;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -14,10 +14,10 @@
|
||||
<transition name="dropdown-anim">
|
||||
<div class="dropdown_wrapper" v-if="showDropdown">
|
||||
<div>
|
||||
<h1 class="stats-title text--primary">
|
||||
<h2 class="stats-title text--primary">
|
||||
<img src="/images/icon-stats.svg" alt="Open filters icon" height="28" />
|
||||
{{ $t('station-stats.title') }}
|
||||
</h1>
|
||||
</h2>
|
||||
|
||||
<hr style="margin: 0.5em 0" />
|
||||
|
||||
@@ -245,7 +245,7 @@ export default defineComponent({
|
||||
@use '../../styles/badge';
|
||||
@use '../../styles/responsive';
|
||||
|
||||
h1.stats-title img {
|
||||
.stats-title img {
|
||||
vertical-align: text-bottom;
|
||||
}
|
||||
|
||||
@@ -279,7 +279,7 @@ h1.stats-title img {
|
||||
}
|
||||
|
||||
@include responsive.smallScreen {
|
||||
h1.stats-title {
|
||||
.stats-title {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
|
||||
@@ -132,22 +132,25 @@ function filterSliderValues(filters: Record<string, any>, generalInfo: StationGe
|
||||
filters['minOneWayCatenary'] > routes.singleElectrifiedNames.length ||
|
||||
filters['minOneWay'] > routes.singleOtherNames.length ||
|
||||
filters['minTwoWayCatenary'] > routes.doubleElectrifiedNames.length ||
|
||||
// filters['minTwoWay'] > routes.doubleOtherNames.length ||
|
||||
filters['minTwoWay'] > routes.doubleOtherNames.length ||
|
||||
filters['minOneWayCatenaryInt'] >
|
||||
internalRoutes.filter((r) => r.routeTracks == 1 && r.isElectric == true).length ||
|
||||
filters['minOneWayInt'] >
|
||||
internalRoutes.filter((r) => r.routeTracks == 1 && r.isElectric == false).length ||
|
||||
filters['minTwoWayCatenaryInt'] >
|
||||
internalRoutes.filter((r) => r.routeTracks == 2 && r.isElectric == true).length
|
||||
internalRoutes.filter((r) => r.routeTracks == 2 && r.isElectric == true).length ||
|
||||
filters['minTwoWayInt'] >
|
||||
internalRoutes.filter((r) => r.routeTracks == 2 && r.isElectric == false).length
|
||||
);
|
||||
}
|
||||
|
||||
function filterInputValues(filters: Record<string, any>, generalInfo: StationGeneralInfo) {
|
||||
return (
|
||||
filters['authors'].length > 3 &&
|
||||
!generalInfo.authors
|
||||
?.map((a) => a.toLocaleLowerCase())
|
||||
.includes(filters['authors'].toLocaleLowerCase())
|
||||
(filters['authors'].length > 3 &&
|
||||
!generalInfo.authors
|
||||
?.map((a) => a.toLocaleLowerCase())
|
||||
.includes(filters['authors'].toLocaleLowerCase())) ||
|
||||
(filters['projects'].length > 0 && generalInfo.project != filters['projects'])
|
||||
);
|
||||
}
|
||||
|
||||
@@ -243,7 +246,7 @@ export const sortStations = (a: Station, b: Station, sorter: ActiveSorter) => {
|
||||
return a.name.localeCompare(b.name);
|
||||
};
|
||||
|
||||
export const filterStations = (station: Station, filters: Record<string, any>) => {
|
||||
export const filterStations = (station: Station, filters: Record<string, any>) => {
|
||||
if (filters['free'] && (!station.onlineInfo || station.onlineInfo.dispatcherId == -1))
|
||||
return false;
|
||||
|
||||
|
||||
@@ -9,6 +9,17 @@
|
||||
<div class="text--primary">
|
||||
<b>{{ trainInfo.stockList[0] }}</b> • {{ trainInfo.length }}m •
|
||||
{{ (trainInfo.mass / 1000).toFixed(2) }}t
|
||||
<span v-if="trainInfo.timetableData">
|
||||
• vRJ:
|
||||
{{
|
||||
trainInfo.timetableData?.trainMaxSpeed ||
|
||||
getStockSpeedLimit(trainInfo.stockList, trainInfo.mass)
|
||||
}}km/h
|
||||
</span>
|
||||
<span v-else class="text--grayed font--italic">
|
||||
• vMax:
|
||||
{{ getStockSpeedLimit(trainInfo.stockList, trainInfo.mass) }}km/h
|
||||
</span>
|
||||
</div>
|
||||
|
||||
<div class="text--grayed">
|
||||
@@ -46,9 +57,7 @@ export default defineComponent({
|
||||
return this.mainStore.trainList.find((t) => t.id === this.tooltipStore.content);
|
||||
},
|
||||
|
||||
lastSceneryStatus() {
|
||||
|
||||
}
|
||||
lastSceneryStatus() {}
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
@@ -135,7 +135,11 @@
|
||||
<img src="/images/icon-speed.svg" alt="speed icon" />
|
||||
{{ train.speed }} km/h
|
||||
|
||||
<span v-if="stockSpeedLimit != Infinity">
|
||||
<span v-if="train.timetableData">
|
||||
• vRJ: {{ train.timetableData.trainMaxSpeed }} km/h
|
||||
</span>
|
||||
|
||||
<span v-else-if="stockSpeedLimit != Infinity">
|
||||
•
|
||||
<em
|
||||
class="text--grayed"
|
||||
@@ -219,57 +223,9 @@ export default defineComponent({
|
||||
|
||||
computed: {
|
||||
stockSpeedLimit() {
|
||||
let isPassenger = true;
|
||||
|
||||
// Check the whole consist speed limit
|
||||
const vehicleMaxSpeed = this.train.stockList.reduce((acc, stockName, i) => {
|
||||
const [vehicleName, vehicleCargo] = stockName.split(':');
|
||||
|
||||
const vehicleData = this.apiStore.vehiclesData?.find((v) => v.name == vehicleName);
|
||||
|
||||
if (!vehicleData) return acc;
|
||||
|
||||
let vehicleSpeed = vehicleData.group.speed;
|
||||
|
||||
if (vehicleData.type == 'wagon-freight') {
|
||||
isPassenger = false;
|
||||
|
||||
if (vehicleCargo !== undefined && vehicleData.group.speedLoaded) {
|
||||
vehicleSpeed = vehicleData.group.speedLoaded;
|
||||
}
|
||||
}
|
||||
|
||||
return Math.min(vehicleSpeed, acc);
|
||||
}, Infinity);
|
||||
|
||||
// Check the head vehicle speed limit
|
||||
const headLocoName = this.train.stockList[0];
|
||||
const headLocoVehicleData = this.apiStore.vehiclesData?.find((v) => v.name == headLocoName);
|
||||
|
||||
// Omit speed check for head vehicle if there's no data for it
|
||||
if (!headLocoName || !headLocoVehicleData || !headLocoVehicleData.group.massSpeeds)
|
||||
return vehicleMaxSpeed;
|
||||
|
||||
const massSpeeds =
|
||||
headLocoVehicleData.group.massSpeeds[
|
||||
this.train.stockList.length == 1 ? 'none' : isPassenger ? 'passenger' : 'cargo'
|
||||
];
|
||||
|
||||
// Omit speed check if there's no data on mass speeds
|
||||
if (!massSpeeds) return vehicleMaxSpeed;
|
||||
|
||||
// Number type for locomotives alone
|
||||
if (typeof massSpeeds === 'number') return massSpeeds;
|
||||
|
||||
// Record type for passenger or cargo, find the closest range
|
||||
const massKey = Object.keys(massSpeeds).findLast(
|
||||
(massKey) => this.train.mass >= Number(massKey)
|
||||
);
|
||||
|
||||
const massMaxSpeed = massKey ? massSpeeds[massKey] : Infinity;
|
||||
|
||||
return Math.min(massMaxSpeed, vehicleMaxSpeed);
|
||||
return this.getStockSpeedLimit(this.train.stockList, this.train.mass);
|
||||
},
|
||||
|
||||
journalRouteLocation() {
|
||||
return {
|
||||
path: '/journal/timetables',
|
||||
|
||||
@@ -13,10 +13,10 @@
|
||||
|
||||
<transition name="dropdown-anim">
|
||||
<div class="dropdown_wrapper" v-if="showOptions">
|
||||
<h1 class="text--primary">
|
||||
<h2 class="stats-title text--primary">
|
||||
<img src="/images/icon-stats.svg" alt="Open filters icon" height="28" />
|
||||
{{ $t('train-stats.title') }}
|
||||
</h1>
|
||||
</h2>
|
||||
|
||||
<hr style="margin: 0.5em 0" />
|
||||
|
||||
@@ -229,7 +229,7 @@ export default defineComponent({
|
||||
@use '../../styles/badge';
|
||||
@use '../../styles/responsive';
|
||||
|
||||
h1 img {
|
||||
.stats-title img {
|
||||
vertical-align: text-bottom;
|
||||
}
|
||||
|
||||
@@ -257,7 +257,7 @@ h3 {
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
h1 {
|
||||
.stats-title {
|
||||
text-align: center;
|
||||
}
|
||||
}
|
||||
|
||||
+10
-8
@@ -76,6 +76,7 @@
|
||||
"tooltip-driver-offline": "Driver is offline",
|
||||
"tooltip-scenery-offline": "Scenery is offline",
|
||||
"pojazdownik-link-content": "POJAZDOWNIK",
|
||||
"language-tooltip-content": "JĘZYK / LANGUAGE",
|
||||
"gnr-link-content": "TRAIN ORDERS <br> GENERATOR"
|
||||
},
|
||||
"footer": {
|
||||
@@ -271,6 +272,7 @@
|
||||
"SCS": "SCS",
|
||||
"SCS-R": "SCS + MANUAL",
|
||||
"SCS-M": "SCS + MECH.",
|
||||
"SCS-SPK": "SCS + SPK",
|
||||
"SPE": "SPE",
|
||||
"manual": "MANUAL",
|
||||
"mechanical": "MECHANICAL",
|
||||
@@ -304,10 +306,9 @@
|
||||
"minTwoWayCatenaryInt": "MIN. INTERNAL CATENARY DOUBLE TRACK ROUTES",
|
||||
"minTwoWayInt": "MIN. INTERNAL OTHER DOUBLE TRACK ROUTES"
|
||||
},
|
||||
"sceneries-search": "SCENERY SEARCH:",
|
||||
"sceneries-placeholder": "Enter scenery name...",
|
||||
"authors-search": "SEARCH BY AUTHOR NAME (other filters apply):",
|
||||
"authors-placeholder": "Enter the author nickname...",
|
||||
"sceneries-placeholder": "Search for scenery",
|
||||
"authors-placeholder": "Scenery author (other filters apply)",
|
||||
"projects-placeholder": "Scenery project (other filters apply)",
|
||||
"search-button-title": "SEARCH",
|
||||
"minimum-hours-title": "SHOW ONLY SCENERIES UNTIL:",
|
||||
"now": "NOW",
|
||||
@@ -559,12 +560,13 @@
|
||||
"option-active-timetables": "Active timetables",
|
||||
"option-timetables-history": "Timetables history PL1",
|
||||
"option-dispatchers-history": "Dispatchers history PL1",
|
||||
"timetable-via": "ALL TIMETABLES",
|
||||
"timetable-includesScenery": "ALL TIMETABLES",
|
||||
"timetable-via": "PASSES THROUGH",
|
||||
"timetable-issuedFrom": "BEGINS HERE",
|
||||
"timetable-terminatingAt": "TERMINATES HERE",
|
||||
"timetable-terminatingAt": "ENDS HERE",
|
||||
"timetable-issued-date": "Issued",
|
||||
"timetable-issued-by": " by:",
|
||||
"timetable-issued-for": " for driver:",
|
||||
"timetable-issued-for": " for:",
|
||||
"dispatcher-rate": "Rate:",
|
||||
"dispatcher-status-changes": "Status changes:",
|
||||
"req-level": "all dispatcher levels | dispatcher level {lvl} required | dispatcher level {lvl} required",
|
||||
@@ -609,4 +611,4 @@
|
||||
"search-train": "Train no.",
|
||||
"search-driver": "Driver name"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+10
-8
@@ -73,6 +73,7 @@
|
||||
"tooltip-driver-offline": "Maszynista offline",
|
||||
"tooltip-scenery-offline": "Sceneria offline",
|
||||
"pojazdownik-link-content": "POJAZDOWNIK",
|
||||
"language-tooltip-content": "JĘZYK / LANGUAGE",
|
||||
"gnr-link-content": "GENERATOR <br> ROZKAZÓW PISEMNYCH"
|
||||
},
|
||||
"footer": {
|
||||
@@ -269,6 +270,7 @@
|
||||
"SCS": "SCS",
|
||||
"SCS-R": "SCS + RĘCZNE",
|
||||
"SCS-M": "SCS + MECH.",
|
||||
"SCS-SPK": "SCS + SPK",
|
||||
"SPE": "SPE",
|
||||
"manual": "RĘCZNE",
|
||||
"SUP": "SUP (RASP-UZK)",
|
||||
@@ -302,10 +304,9 @@
|
||||
"minTwoWayCatenaryInt": "SZLAKI DWUTOROWE ZELEKTR. WEWNĘTRZNE (MINIMUM)",
|
||||
"minTwoWayInt": "SZLAKI DWUTOROWE NIEZELEKTR. WEWNĘTRZNE (MINIMUM)"
|
||||
},
|
||||
"sceneries-search": "WYSZUKAJ SCENERIĘ:",
|
||||
"sceneries-placeholder": "Wpisz nazwę scenerii...",
|
||||
"authors-search": "WYSZUKAJ AUTORA (uwzględnia inne filtry):",
|
||||
"authors-placeholder": "Wpisz nick autora...",
|
||||
"sceneries-placeholder": "Wyszukaj scenerię",
|
||||
"authors-placeholder": "Autor scenerii (uwzględnia inne filtry)",
|
||||
"projects-placeholder": "Projekt scenerii (uwzględnia inne filtry)",
|
||||
"search-button-title": "SZUKAJ",
|
||||
"minimum-hours-title": "POKAŻ TYLKO SCENERIE DOSTĘPNE MINIMUM DO:",
|
||||
"now": "TERAZ",
|
||||
@@ -545,12 +546,13 @@
|
||||
"option-active-timetables": "Aktywne rozkłady jazdy",
|
||||
"option-timetables-history": "Historia rozkładów PL1",
|
||||
"option-dispatchers-history": "Historia dyżurów PL1",
|
||||
"timetable-via": "WSZYSTKIE RJ",
|
||||
"timetable-includesScenery": "WSZYSTKIE RJ",
|
||||
"timetable-via": "PRZEJEŻDŻA",
|
||||
"timetable-issuedFrom": "ROZPOCZYNA BIEG",
|
||||
"timetable-terminatingAt": "KOŃCZY BIEG",
|
||||
"timetable-issued-date": "Wystawiony",
|
||||
"timetable-issued-date": "Wystawiony: ",
|
||||
"timetable-issued-by": " przez:",
|
||||
"timetable-issued-for": " dla maszynisty:",
|
||||
"timetable-issued-for": " dla:",
|
||||
"dispatcher-rate": "Ocena:",
|
||||
"dispatcher-status-changes": "Zmiany statusów:",
|
||||
"req-level": "ogólnodostępna | minimum {lvl} poziom dyżurnego | minimum {lvl} poziom dyżurnego",
|
||||
@@ -593,4 +595,4 @@
|
||||
"history": {
|
||||
"title": "DZIENNIK ROZKŁADÓW JAZDY"
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -31,6 +31,7 @@ export const initFilters = {
|
||||
mechanical: false,
|
||||
'SPK-M': false,
|
||||
'SCS-M': false,
|
||||
'SCS-SPK': false,
|
||||
modern: false,
|
||||
semaphores: false,
|
||||
historical: false,
|
||||
@@ -61,12 +62,14 @@ export const initFilters = {
|
||||
maxLevel: 20,
|
||||
minOneWay: 0,
|
||||
minOneWayCatenary: 0,
|
||||
minTwoWayCatenary: 0,
|
||||
minOneWayInt: 0,
|
||||
minOneWayCatenaryInt: 0,
|
||||
minTwoWay: 0,
|
||||
minTwoWayCatenary: 0,
|
||||
minTwoWayInt: 0,
|
||||
minTwoWayCatenaryInt: 0,
|
||||
// minTwoWay: 0,
|
||||
authors: ''
|
||||
authors: '',
|
||||
projects: ''
|
||||
};
|
||||
|
||||
export const sliderStates = [
|
||||
@@ -76,12 +79,12 @@ export const sliderStates = [
|
||||
{ id: 'maxLevel', minRange: 0, maxRange: 20, step: 1 },
|
||||
{ id: 'minOneWay', minRange: 0, maxRange: 5, step: 1 },
|
||||
{ id: 'minOneWayCatenary', minRange: 0, maxRange: 5, step: 1 },
|
||||
{ id: 'minTwoWayCatenary', minRange: 0, maxRange: 5, step: 1 },
|
||||
{ id: 'minOneWayInt', minRange: 0, maxRange: 5, step: 1 },
|
||||
{ id: 'minOneWayCatenaryInt', minRange: 0, maxRange: 5, step: 1 },
|
||||
{ id: 'minTwoWayCatenaryInt', minRange: 0, maxRange: 5, step: 1 },
|
||||
// { id: 'minTwoWay', minRange: 0, maxRange: 5, step: 1 },
|
||||
// { id: 'minTwoWayInt', minRange: 0, maxRange: 5, step: 1 }
|
||||
{ id: 'minTwoWay', minRange: 0, maxRange: 5, step: 1 },
|
||||
{ id: 'minTwoWayCatenary', minRange: 0, maxRange: 5, step: 1 },
|
||||
{ id: 'minTwoWayInt', minRange: 0, maxRange: 5, step: 1 },
|
||||
{ id: 'minTwoWayCatenaryInt', minRange: 0, maxRange: 5, step: 1 }
|
||||
];
|
||||
|
||||
export type StationFilter = keyof typeof initFilters;
|
||||
@@ -95,7 +98,18 @@ export const filtersSections: Record<StationFilterSection, StationFilter[]> = {
|
||||
stationType: ['junction', 'nonJunction'],
|
||||
access: ['nonPublic', 'unavailable', 'abandoned'],
|
||||
addons: ['SUP', 'ASDEK', 'noSUP', 'noASDEK'],
|
||||
control: ['SPK', 'SCS', 'SPE', 'SPK-M', 'SCS-M', 'mechanical', 'SPK-R', 'SCS-R', 'manual'],
|
||||
control: [
|
||||
'SPK',
|
||||
'SCS',
|
||||
'SPE',
|
||||
'SCS-SPK',
|
||||
'SPK-M',
|
||||
'SCS-M',
|
||||
'mechanical',
|
||||
'SPK-R',
|
||||
'SCS-R',
|
||||
'manual'
|
||||
],
|
||||
blockades: ['SBL', 'PBL'],
|
||||
signals: ['modern', 'semaphores', 'mixed', 'historical']
|
||||
};
|
||||
@@ -116,7 +130,7 @@ export function setupFilters(currentFilters: Record<string, any>) {
|
||||
});
|
||||
}
|
||||
|
||||
export function getChangedFilters(currentFilters: Record<string, any>): string[] {
|
||||
export function getChangedFilters(currentFilters: Record<string, any>): string[] {
|
||||
return (
|
||||
Object.keys(currentFilters).filter(
|
||||
(filterKey) =>
|
||||
|
||||
@@ -1,45 +1,10 @@
|
||||
import { defineComponent } from 'vue';
|
||||
import { Train, TrainStop } from '../typings/common';
|
||||
import { useApiStore } from '../store/apiStore';
|
||||
|
||||
export default defineComponent({
|
||||
data: () => ({
|
||||
STATS: {
|
||||
main: [
|
||||
{
|
||||
name: 'speed',
|
||||
unit: 'km/h'
|
||||
},
|
||||
{
|
||||
name: 'length',
|
||||
unit: 'm'
|
||||
},
|
||||
{
|
||||
name: 'mass',
|
||||
unit: 't',
|
||||
multiplier: 0.001
|
||||
}
|
||||
],
|
||||
|
||||
position: [
|
||||
{
|
||||
name: 'scenery',
|
||||
prop: 'currentStationName'
|
||||
},
|
||||
{
|
||||
name: 'route',
|
||||
prop: 'connectedTrack'
|
||||
},
|
||||
{
|
||||
name: 'signal',
|
||||
prop: 'signal'
|
||||
},
|
||||
{
|
||||
name: 'distance',
|
||||
prop: 'distance',
|
||||
unit: 'm'
|
||||
}
|
||||
]
|
||||
}
|
||||
apiStore: useApiStore()
|
||||
}),
|
||||
|
||||
methods: {
|
||||
@@ -150,6 +115,57 @@ export default defineComponent({
|
||||
if (distance < 1000) return `${distance}m`;
|
||||
|
||||
return `${(distance / 1000).toPrecision(2)}km`;
|
||||
},
|
||||
|
||||
getStockSpeedLimit(stockList: string[], trainMass: number) {
|
||||
let isPassenger = true;
|
||||
|
||||
// Check the whole consist speed limit
|
||||
const vehicleMaxSpeed = stockList.reduce((acc, stockName, i) => {
|
||||
const [vehicleName, vehicleCargo] = stockName.split(':');
|
||||
|
||||
const vehicleData = this.apiStore.vehiclesData?.find((v) => v.name == vehicleName);
|
||||
|
||||
if (!vehicleData) return acc;
|
||||
|
||||
let vehicleSpeed = vehicleData.group.speed;
|
||||
|
||||
if (vehicleData.type == 'wagon-freight') {
|
||||
isPassenger = false;
|
||||
|
||||
if (vehicleCargo !== undefined && vehicleData.group.speedLoaded) {
|
||||
vehicleSpeed = vehicleData.group.speedLoaded;
|
||||
}
|
||||
}
|
||||
|
||||
return Math.min(vehicleSpeed, acc);
|
||||
}, Infinity);
|
||||
|
||||
// Check the head vehicle speed limit
|
||||
const headLocoName = stockList[0];
|
||||
const headLocoVehicleData = this.apiStore.vehiclesData?.find((v) => v.name == headLocoName);
|
||||
|
||||
// Omit speed check for head vehicle if there's no data for it
|
||||
if (!headLocoName || !headLocoVehicleData || !headLocoVehicleData.group.massSpeeds)
|
||||
return vehicleMaxSpeed;
|
||||
|
||||
const massSpeeds =
|
||||
headLocoVehicleData.group.massSpeeds[
|
||||
stockList.length == 1 ? 'none' : isPassenger ? 'passenger' : 'cargo'
|
||||
];
|
||||
|
||||
// Omit speed check if there's no data on mass speeds
|
||||
if (!massSpeeds) return vehicleMaxSpeed;
|
||||
|
||||
// Number type for locomotives alone
|
||||
if (typeof massSpeeds === 'number') return massSpeeds;
|
||||
|
||||
// Record type for passenger or cargo, find the closest range
|
||||
const massKey = Object.keys(massSpeeds).findLast((massKey) => trainMass >= Number(massKey));
|
||||
|
||||
const massMaxSpeed = massKey ? massSpeeds[massKey] : Infinity;
|
||||
|
||||
return Math.min(massMaxSpeed, vehicleMaxSpeed);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
+17
-2
@@ -11,6 +11,8 @@ import {
|
||||
} from '../typings/common';
|
||||
import { useApiStore } from './apiStore';
|
||||
import { MainStoreState } from './typings';
|
||||
import i18n from '../i18n';
|
||||
import StorageManager from '../managers/storageManager';
|
||||
|
||||
const checkpointsTrains: Map<string, CheckpointTrain[]> = new Map();
|
||||
const unknownSceneryCheckpoints: Map<string, Set<string>> = new Map();
|
||||
@@ -37,6 +39,15 @@ export const useMainStore = defineStore('mainStore', {
|
||||
currentLocale: 'pl'
|
||||
}) as MainStoreState,
|
||||
|
||||
actions: {
|
||||
changeLocale(localeName: string) {
|
||||
(i18n.global.locale.value as any) = localeName;
|
||||
this.currentLocale = localeName;
|
||||
|
||||
StorageManager.setStringValue('lang', localeName);
|
||||
}
|
||||
},
|
||||
|
||||
getters: {
|
||||
trainList(): Train[] {
|
||||
const apiStore = useApiStore();
|
||||
@@ -333,8 +344,12 @@ export const useMainStore = defineStore('mainStore', {
|
||||
const missingCheckpointsToAdd = unknownSceneryCheckpoints.get(scenery.name);
|
||||
|
||||
if (missingCheckpointsToAdd) {
|
||||
checkpoints.push(...missingCheckpointsToAdd);
|
||||
scenery.missingCheckpoints.push(...missingCheckpointsToAdd);
|
||||
[...missingCheckpointsToAdd].forEach((cp) => {
|
||||
if (cp.toLowerCase() == scenery.name.toLowerCase()) return;
|
||||
|
||||
checkpoints.push(cp);
|
||||
scenery.missingCheckpoints.push(cp);
|
||||
});
|
||||
}
|
||||
|
||||
const uniqueTrainIds: string[] = [];
|
||||
|
||||
@@ -23,6 +23,7 @@ export interface StationJSONData {
|
||||
project: string;
|
||||
projectUrl: string;
|
||||
hash: string;
|
||||
hidden: boolean;
|
||||
|
||||
reqLevel: number;
|
||||
|
||||
|
||||
@@ -225,6 +225,12 @@ ul {
|
||||
}
|
||||
}
|
||||
|
||||
.font {
|
||||
&--italic {
|
||||
font-style: italic;
|
||||
}
|
||||
}
|
||||
|
||||
button,
|
||||
a.a-button {
|
||||
cursor: pointer;
|
||||
|
||||
@@ -118,6 +118,7 @@ export interface StationGeneralInfo {
|
||||
availability: Availability;
|
||||
routes: StationRoutes;
|
||||
checkpoints: string[];
|
||||
hidden: boolean;
|
||||
}
|
||||
|
||||
export interface StationRoutes {
|
||||
|
||||
@@ -13,6 +13,18 @@
|
||||
</div>
|
||||
|
||||
<div class="topbar-links">
|
||||
<button
|
||||
class="btn--image lang-button"
|
||||
@click="toggleLocales()"
|
||||
data-tooltip-type="HtmlTooltip"
|
||||
:data-tooltip-content="`<b>${$t('app.language-tooltip-content')}</b>`"
|
||||
>
|
||||
<img
|
||||
:src="`/images/icon-${mainStore.currentLocale}.svg`"
|
||||
alt="change language flag icon"
|
||||
/>
|
||||
</button>
|
||||
|
||||
<a
|
||||
class="a-button btn--image gnr-link"
|
||||
href="https://generator-td2.web.app/"
|
||||
@@ -96,6 +108,10 @@ export default defineComponent({
|
||||
methods: {
|
||||
toggleDonationCard(value: boolean) {
|
||||
this.isDonationCardOpen = value;
|
||||
},
|
||||
|
||||
toggleLocales() {
|
||||
this.mainStore.changeLocale(this.mainStore.currentLocale == 'pl' ? 'en' : 'pl');
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -149,6 +165,11 @@ button.donation-button {
|
||||
}
|
||||
}
|
||||
|
||||
button.lang-button {
|
||||
padding: 0 0.5em;
|
||||
background-color: #111;
|
||||
}
|
||||
|
||||
a.pojazdownik-link {
|
||||
background-color: #1f263b;
|
||||
|
||||
|
||||
+2
-2
@@ -1,8 +1,8 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"composite": true,
|
||||
"module": "ESNext",
|
||||
"moduleResolution": "Node",
|
||||
"module": "nodenext",
|
||||
"moduleResolution": "nodenext",
|
||||
"allowSyntheticDefaultImports": true
|
||||
},
|
||||
"include": ["vite.config.ts"]
|
||||
|
||||
+2
-4
@@ -5,7 +5,7 @@ import path from 'path';
|
||||
|
||||
export default defineConfig({
|
||||
server: { port: 5123, open: true },
|
||||
preview: { port: 4001, open: true },
|
||||
preview: { port: 4001, open: false },
|
||||
publicDir: 'public',
|
||||
css: {
|
||||
preprocessorOptions: {
|
||||
@@ -21,11 +21,9 @@ export default defineConfig({
|
||||
vue(),
|
||||
VitePWA({
|
||||
registerType: 'autoUpdate',
|
||||
includeAssets: ['/images/*.{png,svg,jpg}', '/fonts/*.{woff,woff2}'],
|
||||
|
||||
workbox: {
|
||||
disableDevLogs: true,
|
||||
globPatterns: ['**/*.{js,css,html,png,svg,jpg}'],
|
||||
globPatterns: ['**/*.{js,css,html,ico,woff,woff2,ttf}', '**/*.{png,jpg,jpeg,svg,webp,gif}'],
|
||||
cleanupOutdatedCaches: true,
|
||||
runtimeCaching: [
|
||||
{
|
||||
|
||||
@@ -1401,110 +1401,110 @@
|
||||
estree-walker "^2.0.2"
|
||||
picomatch "^4.0.2"
|
||||
|
||||
"@rollup/rollup-android-arm-eabi@4.50.0":
|
||||
version "4.50.0"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.50.0.tgz#939c1be9625d428d8513e4ab60d406fe8db23718"
|
||||
integrity sha512-lVgpeQyy4fWN5QYebtW4buT/4kn4p4IJ+kDNB4uYNT5b8c8DLJDg6titg20NIg7E8RWwdWZORW6vUFfrLyG3KQ==
|
||||
"@rollup/rollup-android-arm-eabi@4.50.1":
|
||||
version "4.50.1"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.50.1.tgz#7d41dc45adcfcb272504ebcea9c8a5b2c659e963"
|
||||
integrity sha512-HJXwzoZN4eYTdD8bVV22DN8gsPCAj3V20NHKOs8ezfXanGpmVPR7kalUHd+Y31IJp9stdB87VKPFbsGY3H/2ag==
|
||||
|
||||
"@rollup/rollup-android-arm64@4.50.0":
|
||||
version "4.50.0"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.50.0.tgz#b74005775903f7a8f4e363d2840c1dcef3776ff3"
|
||||
integrity sha512-2O73dR4Dc9bp+wSYhviP6sDziurB5/HCym7xILKifWdE9UsOe2FtNcM+I4xZjKrfLJnq5UR8k9riB87gauiQtw==
|
||||
"@rollup/rollup-android-arm64@4.50.1":
|
||||
version "4.50.1"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.50.1.tgz#6c708fae2c9755e994c42d56c34a94cb77020650"
|
||||
integrity sha512-PZlsJVcjHfcH53mOImyt3bc97Ep3FJDXRpk9sMdGX0qgLmY0EIWxCag6EigerGhLVuL8lDVYNnSo8qnTElO4xw==
|
||||
|
||||
"@rollup/rollup-darwin-arm64@4.50.0":
|
||||
version "4.50.0"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.50.0.tgz#8c04603cdcf1ec0cd6b27152b3827e49295f2962"
|
||||
integrity sha512-vwSXQN8T4sKf1RHr1F0s98Pf8UPz7pS6P3LG9NSmuw0TVh7EmaE+5Ny7hJOZ0M2yuTctEsHHRTMi2wuHkdS6Hg==
|
||||
"@rollup/rollup-darwin-arm64@4.50.1":
|
||||
version "4.50.1"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.50.1.tgz#85ccf92ab114e434c83037a175923a525635cbb4"
|
||||
integrity sha512-xc6i2AuWh++oGi4ylOFPmzJOEeAa2lJeGUGb4MudOtgfyyjr4UPNK+eEWTPLvmPJIY/pgw6ssFIox23SyrkkJw==
|
||||
|
||||
"@rollup/rollup-darwin-x64@4.50.0":
|
||||
version "4.50.0"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.50.0.tgz#19ec976f1cc663def2692cd7ffb32981f2b0b733"
|
||||
integrity sha512-cQp/WG8HE7BCGyFVuzUg0FNmupxC+EPZEwWu2FCGGw5WDT1o2/YlENbm5e9SMvfDFR6FRhVCBePLqj0o8MN7Vw==
|
||||
"@rollup/rollup-darwin-x64@4.50.1":
|
||||
version "4.50.1"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.50.1.tgz#0af089f3d658d05573208dabb3a392b44d7f4630"
|
||||
integrity sha512-2ofU89lEpDYhdLAbRdeyz/kX3Y2lpYc6ShRnDjY35bZhd2ipuDMDi6ZTQ9NIag94K28nFMofdnKeHR7BT0CATw==
|
||||
|
||||
"@rollup/rollup-freebsd-arm64@4.50.0":
|
||||
version "4.50.0"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.50.0.tgz#a96b4ad8346229f6fcbd9d57f1c53040b037c2da"
|
||||
integrity sha512-UR1uTJFU/p801DvvBbtDD7z9mQL8J80xB0bR7DqW7UGQHRm/OaKzp4is7sQSdbt2pjjSS72eAtRh43hNduTnnQ==
|
||||
"@rollup/rollup-freebsd-arm64@4.50.1":
|
||||
version "4.50.1"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.50.1.tgz#46c22a16d18180e99686647543335567221caa9c"
|
||||
integrity sha512-wOsE6H2u6PxsHY/BeFHA4VGQN3KUJFZp7QJBmDYI983fgxq5Th8FDkVuERb2l9vDMs1D5XhOrhBrnqcEY6l8ZA==
|
||||
|
||||
"@rollup/rollup-freebsd-x64@4.50.0":
|
||||
version "4.50.0"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.50.0.tgz#fa565a282bc57967ee6668607b181678bdd74e4a"
|
||||
integrity sha512-G/DKyS6PK0dD0+VEzH/6n/hWDNPDZSMBmqsElWnCRGrYOb2jC0VSupp7UAHHQ4+QILwkxSMaYIbQ72dktp8pKA==
|
||||
"@rollup/rollup-freebsd-x64@4.50.1":
|
||||
version "4.50.1"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.50.1.tgz#819ffef2f81891c266456952962a13110c8e28b5"
|
||||
integrity sha512-A/xeqaHTlKbQggxCqispFAcNjycpUEHP52mwMQZUNqDUJFFYtPHCXS1VAG29uMlDzIVr+i00tSFWFLivMcoIBQ==
|
||||
|
||||
"@rollup/rollup-linux-arm-gnueabihf@4.50.0":
|
||||
version "4.50.0"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.50.0.tgz#dfc88f7295e1f98d77f25296be787e8a5d6ced75"
|
||||
integrity sha512-u72Mzc6jyJwKjJbZZcIYmd9bumJu7KNmHYdue43vT1rXPm2rITwmPWF0mmPzLm9/vJWxIRbao/jrQmxTO0Sm9w==
|
||||
"@rollup/rollup-linux-arm-gnueabihf@4.50.1":
|
||||
version "4.50.1"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.50.1.tgz#7fe283c14793e607e653a3214b09f8973f08262a"
|
||||
integrity sha512-54v4okehwl5TaSIkpp97rAHGp7t3ghinRd/vyC1iXqXMfjYUTm7TfYmCzXDoHUPTTf36L8pr0E7YsD3CfB3ZDg==
|
||||
|
||||
"@rollup/rollup-linux-arm-musleabihf@4.50.0":
|
||||
version "4.50.0"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.50.0.tgz#32cd70c87455ca031f0361090cf17da5a2ef66d5"
|
||||
integrity sha512-S4UefYdV0tnynDJV1mdkNawp0E5Qm2MtSs330IyHgaccOFrwqsvgigUD29uT+B/70PDY1eQ3t40+xf6wIvXJyg==
|
||||
"@rollup/rollup-linux-arm-musleabihf@4.50.1":
|
||||
version "4.50.1"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.50.1.tgz#066e92eb22ea30560414ec800a6d119ba0b435ac"
|
||||
integrity sha512-p/LaFyajPN/0PUHjv8TNyxLiA7RwmDoVY3flXHPSzqrGcIp/c2FjwPPP5++u87DGHtw+5kSH5bCJz0mvXngYxw==
|
||||
|
||||
"@rollup/rollup-linux-arm64-gnu@4.50.0":
|
||||
version "4.50.0"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.50.0.tgz#0e7e1fe7241e3384f6c6b4ccdbcfa8ad8c78b869"
|
||||
integrity sha512-1EhkSvUQXJsIhk4msxP5nNAUWoB4MFDHhtc4gAYvnqoHlaL9V3F37pNHabndawsfy/Tp7BPiy/aSa6XBYbaD1g==
|
||||
"@rollup/rollup-linux-arm64-gnu@4.50.1":
|
||||
version "4.50.1"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.50.1.tgz#480d518ea99a8d97b2a174c46cd55164f138cc37"
|
||||
integrity sha512-2AbMhFFkTo6Ptna1zO7kAXXDLi7H9fGTbVaIq2AAYO7yzcAsuTNWPHhb2aTA6GPiP+JXh85Y8CiS54iZoj4opw==
|
||||
|
||||
"@rollup/rollup-linux-arm64-musl@4.50.0":
|
||||
version "4.50.0"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.50.0.tgz#5d421f2f3e4a84786c4dfd9ce97e595c9b59e7f4"
|
||||
integrity sha512-EtBDIZuDtVg75xIPIK1l5vCXNNCIRM0OBPUG+tbApDuJAy9mKago6QxX+tfMzbCI6tXEhMuZuN1+CU8iDW+0UQ==
|
||||
"@rollup/rollup-linux-arm64-musl@4.50.1":
|
||||
version "4.50.1"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.50.1.tgz#ed7db3b8999b60dd20009ddf71c95f3af49423c8"
|
||||
integrity sha512-Cgef+5aZwuvesQNw9eX7g19FfKX5/pQRIyhoXLCiBOrWopjo7ycfB292TX9MDcDijiuIJlx1IzJz3IoCPfqs9w==
|
||||
|
||||
"@rollup/rollup-linux-loongarch64-gnu@4.50.0":
|
||||
version "4.50.0"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.50.0.tgz#a0fb5c7d0e88319e18acfd9436f19ee39354b027"
|
||||
integrity sha512-BGYSwJdMP0hT5CCmljuSNx7+k+0upweM2M4YGfFBjnFSZMHOLYR0gEEj/dxyYJ6Zc6AiSeaBY8dWOa11GF/ppQ==
|
||||
"@rollup/rollup-linux-loongarch64-gnu@4.50.1":
|
||||
version "4.50.1"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.50.1.tgz#16a6927a35f5dbc505ff874a4e1459610c0c6f46"
|
||||
integrity sha512-RPhTwWMzpYYrHrJAS7CmpdtHNKtt2Ueo+BlLBjfZEhYBhK00OsEqM08/7f+eohiF6poe0YRDDd8nAvwtE/Y62Q==
|
||||
|
||||
"@rollup/rollup-linux-ppc64-gnu@4.50.0":
|
||||
version "4.50.0"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.50.0.tgz#a65b598af12f25210c3295da551a6e3616ea488d"
|
||||
integrity sha512-I1gSMzkVe1KzAxKAroCJL30hA4DqSi+wGc5gviD0y3IL/VkvcnAqwBf4RHXHyvH66YVHxpKO8ojrgc4SrWAnLg==
|
||||
"@rollup/rollup-linux-ppc64-gnu@4.50.1":
|
||||
version "4.50.1"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.50.1.tgz#a006700469be0041846c45b494c35754e6a04eea"
|
||||
integrity sha512-eSGMVQw9iekut62O7eBdbiccRguuDgiPMsw++BVUg+1K7WjZXHOg/YOT9SWMzPZA+w98G+Fa1VqJgHZOHHnY0Q==
|
||||
|
||||
"@rollup/rollup-linux-riscv64-gnu@4.50.0":
|
||||
version "4.50.0"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.50.0.tgz#10ba776214ae2857c5bf4389690dabb2fbaf7d98"
|
||||
integrity sha512-bSbWlY3jZo7molh4tc5dKfeSxkqnf48UsLqYbUhnkdnfgZjgufLS/NTA8PcP/dnvct5CCdNkABJ56CbclMRYCA==
|
||||
"@rollup/rollup-linux-riscv64-gnu@4.50.1":
|
||||
version "4.50.1"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.50.1.tgz#0fcc45b2ec8a0e54218ca48849ea6d596f53649c"
|
||||
integrity sha512-S208ojx8a4ciIPrLgazF6AgdcNJzQE4+S9rsmOmDJkusvctii+ZvEuIC4v/xFqzbuP8yDjn73oBlNDgF6YGSXQ==
|
||||
|
||||
"@rollup/rollup-linux-riscv64-musl@4.50.0":
|
||||
version "4.50.0"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.50.0.tgz#c2a46cbaa329d5f21e5808f5a66bb9c78cf68aac"
|
||||
integrity sha512-LSXSGumSURzEQLT2e4sFqFOv3LWZsEF8FK7AAv9zHZNDdMnUPYH3t8ZlaeYYZyTXnsob3htwTKeWtBIkPV27iQ==
|
||||
"@rollup/rollup-linux-riscv64-musl@4.50.1":
|
||||
version "4.50.1"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.50.1.tgz#d6e617eec9fe6f5859ee13fad435a16c42b469f2"
|
||||
integrity sha512-3Ag8Ls1ggqkGUvSZWYcdgFwriy2lWo+0QlYgEFra/5JGtAd6C5Hw59oojx1DeqcA2Wds2ayRgvJ4qxVTzCHgzg==
|
||||
|
||||
"@rollup/rollup-linux-s390x-gnu@4.50.0":
|
||||
version "4.50.0"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.50.0.tgz#a07447be069d64462e30c66611be20c4513963ed"
|
||||
integrity sha512-CxRKyakfDrsLXiCyucVfVWVoaPA4oFSpPpDwlMcDFQvrv3XY6KEzMtMZrA+e/goC8xxp2WSOxHQubP8fPmmjOQ==
|
||||
"@rollup/rollup-linux-s390x-gnu@4.50.1":
|
||||
version "4.50.1"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.50.1.tgz#b147760d63c6f35b4b18e6a25a2a760dd3ea0c05"
|
||||
integrity sha512-t9YrKfaxCYe7l7ldFERE1BRg/4TATxIg+YieHQ966jwvo7ddHJxPj9cNFWLAzhkVsbBvNA4qTbPVNsZKBO4NSg==
|
||||
|
||||
"@rollup/rollup-linux-x64-gnu@4.50.0":
|
||||
version "4.50.0"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.50.0.tgz#8887c58bd51242754ae9c56947d6e883332dcc74"
|
||||
integrity sha512-8PrJJA7/VU8ToHVEPu14FzuSAqVKyo5gg/J8xUerMbyNkWkO9j2ExBho/68RnJsMGNJq4zH114iAttgm7BZVkA==
|
||||
"@rollup/rollup-linux-x64-gnu@4.50.1":
|
||||
version "4.50.1"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.50.1.tgz#fc0be1da374f85e7e85dccaf1ff12d7cfc9fbe3d"
|
||||
integrity sha512-MCgtFB2+SVNuQmmjHf+wfI4CMxy3Tk8XjA5Z//A0AKD7QXUYFMQcns91K6dEHBvZPCnhJSyDWLApk40Iq/H3tA==
|
||||
|
||||
"@rollup/rollup-linux-x64-musl@4.50.0":
|
||||
version "4.50.0"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.50.0.tgz#6403fda72a2b3b9fbbeeff93d14f1c45ef9775f3"
|
||||
integrity sha512-SkE6YQp+CzpyOrbw7Oc4MgXFvTw2UIBElvAvLCo230pyxOLmYwRPwZ/L5lBe/VW/qT1ZgND9wJfOsdy0XptRvw==
|
||||
"@rollup/rollup-linux-x64-musl@4.50.1":
|
||||
version "4.50.1"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.50.1.tgz#54c79932e0f9a3c992b034c82325be3bcde0d067"
|
||||
integrity sha512-nEvqG+0jeRmqaUMuwzlfMKwcIVffy/9KGbAGyoa26iu6eSngAYQ512bMXuqqPrlTyfqdlB9FVINs93j534UJrg==
|
||||
|
||||
"@rollup/rollup-openharmony-arm64@4.50.0":
|
||||
version "4.50.0"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.50.0.tgz#52809afccaff47e731b965a0c16e5686be819d5f"
|
||||
integrity sha512-PZkNLPfvXeIOgJWA804zjSFH7fARBBCpCXxgkGDRjjAhRLOR8o0IGS01ykh5GYfod4c2yiiREuDM8iZ+pVsT+Q==
|
||||
"@rollup/rollup-openharmony-arm64@4.50.1":
|
||||
version "4.50.1"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.50.1.tgz#fc48e74d413623ac02c1d521bec3e5e784488fdc"
|
||||
integrity sha512-RDsLm+phmT3MJd9SNxA9MNuEAO/J2fhW8GXk62G/B4G7sLVumNFbRwDL6v5NrESb48k+QMqdGbHgEtfU0LCpbA==
|
||||
|
||||
"@rollup/rollup-win32-arm64-msvc@4.50.0":
|
||||
version "4.50.0"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.50.0.tgz#23fe00ddbb40b27a3889bc1e99e6310d97353ad5"
|
||||
integrity sha512-q7cIIdFvWQoaCbLDUyUc8YfR3Jh2xx3unO8Dn6/TTogKjfwrax9SyfmGGK6cQhKtjePI7jRfd7iRYcxYs93esg==
|
||||
"@rollup/rollup-win32-arm64-msvc@4.50.1":
|
||||
version "4.50.1"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.50.1.tgz#8ce3d1181644406362cf1e62c90e88ab083e02bb"
|
||||
integrity sha512-hpZB/TImk2FlAFAIsoElM3tLzq57uxnGYwplg6WDyAxbYczSi8O2eQ+H2Lx74504rwKtZ3N2g4bCUkiamzS6TQ==
|
||||
|
||||
"@rollup/rollup-win32-ia32-msvc@4.50.0":
|
||||
version "4.50.0"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.50.0.tgz#520b588076b593413d919912d69dfd5728a1f305"
|
||||
integrity sha512-XzNOVg/YnDOmFdDKcxxK410PrcbcqZkBmz+0FicpW5jtjKQxcW1BZJEQOF0NJa6JO7CZhett8GEtRN/wYLYJuw==
|
||||
"@rollup/rollup-win32-ia32-msvc@4.50.1":
|
||||
version "4.50.1"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.50.1.tgz#dd2dfc896eac4b2689d55f01c6d51c249263f805"
|
||||
integrity sha512-SXjv8JlbzKM0fTJidX4eVsH+Wmnp0/WcD8gJxIZyR6Gay5Qcsmdbi9zVtnbkGPG8v2vMR1AD06lGWy5FLMcG7A==
|
||||
|
||||
"@rollup/rollup-win32-x64-msvc@4.50.0":
|
||||
version "4.50.0"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.50.0.tgz#d81efe6a12060c7feddf9805e2a94c3ab0679f48"
|
||||
integrity sha512-xMmiWRR8sp72Zqwjgtf3QbZfF1wdh8X2ABu3EaozvZcyHJeU0r+XAnXdKgs4cCAp6ORoYoCygipYP1mjmbjrsg==
|
||||
"@rollup/rollup-win32-x64-msvc@4.50.1":
|
||||
version "4.50.1"
|
||||
resolved "https://registry.yarnpkg.com/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.50.1.tgz#13f758c97b9fbbac56b6928547a3ff384e7cfb3e"
|
||||
integrity sha512-StxAO/8ts62KZVRAm4JZYq9+NqNsV7RvimNK+YM7ry//zebEH6meuugqW/P5OFUCjyQgui+9fUxT6d5NShvMvA==
|
||||
|
||||
"@surma/rollup-plugin-off-main-thread@^2.2.3":
|
||||
version "2.2.3"
|
||||
@@ -1549,9 +1549,9 @@
|
||||
integrity sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==
|
||||
|
||||
"@vite-pwa/assets-generator@^1.0.0":
|
||||
version "1.0.0"
|
||||
resolved "https://registry.yarnpkg.com/@vite-pwa/assets-generator/-/assets-generator-1.0.0.tgz#d5764f633464ce3a437d79d48f6f2e0680d35226"
|
||||
integrity sha512-tWRF/tsqGkND5+dDVnJz7DzQkIRjtTRRYvA3y6l4FwTwK47OK72p1X7ResSz6T7PimIZMuFd+arsB8NRIG+Sww==
|
||||
version "1.0.1"
|
||||
resolved "https://registry.yarnpkg.com/@vite-pwa/assets-generator/-/assets-generator-1.0.1.tgz#89338aa471f8f2b3761cc21e4ba9c4f71ab7147f"
|
||||
integrity sha512-p2KHvsyuv/njmLSwDjpok0CFYKmAdV5ckWjVSxktNXbKAuHX3+WCTy4X3LuwWl0RGsCWBPerSUVNvE/02D565w==
|
||||
dependencies:
|
||||
cac "^6.7.14"
|
||||
colorette "^2.0.20"
|
||||
@@ -2138,9 +2138,9 @@ ejs@^3.1.6:
|
||||
jake "^10.8.5"
|
||||
|
||||
electron-to-chromium@^1.5.211:
|
||||
version "1.5.214"
|
||||
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.214.tgz#f7bbdc0796124292d4b8a34a49e968c5e6430763"
|
||||
integrity sha512-TpvUNdha+X3ybfU78NoQatKvQEm1oq3lf2QbnmCEdw+Bd9RuIAY+hJTvq1avzHM0f7EJfnH3vbCnbzKzisc/9Q==
|
||||
version "1.5.215"
|
||||
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.215.tgz#200c8d69b1270af6126837b6b1f95077c3a347b1"
|
||||
integrity sha512-TIvGp57UpeNetj/wV/xpFNpWGb0b/ROw372lHPx5Aafx02gjTBtWnEEcaSX3W2dLM3OSdGGyHX/cHl01JQsLaQ==
|
||||
|
||||
entities@^4.5.0:
|
||||
version "4.5.0"
|
||||
@@ -2310,7 +2310,7 @@ fast-uri@^3.0.1:
|
||||
resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.1.0.tgz#66eecff6c764c0df9b762e62ca7edcfb53b4edfa"
|
||||
integrity sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==
|
||||
|
||||
fdir@^6.4.4, fdir@^6.5.0:
|
||||
fdir@^6.5.0:
|
||||
version "6.5.0"
|
||||
resolved "https://registry.yarnpkg.com/fdir/-/fdir-6.5.0.tgz#ed2ab967a331ade62f18d077dae192684d50d350"
|
||||
integrity sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==
|
||||
@@ -2862,9 +2862,9 @@ magic-string@^0.25.0, magic-string@^0.25.7:
|
||||
sourcemap-codec "^1.4.8"
|
||||
|
||||
magic-string@^0.30.18:
|
||||
version "0.30.18"
|
||||
resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.18.tgz#905bfbbc6aa5692703a93db26a9edcaa0007d2bb"
|
||||
integrity sha512-yi8swmWbO17qHhwIBNeeZxTceJMeBvWJaId6dyvTSOwTipqeHhMhOrz6513r1sOKnpvQ7zkhlG8tPrpilwTxHQ==
|
||||
version "0.30.19"
|
||||
resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.30.19.tgz#cebe9f104e565602e5d2098c5f2e79a77cc86da9"
|
||||
integrity sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==
|
||||
dependencies:
|
||||
"@jridgewell/sourcemap-codec" "^1.5.5"
|
||||
|
||||
@@ -3162,33 +3162,33 @@ rollup@^2.43.1:
|
||||
fsevents "~2.3.2"
|
||||
|
||||
rollup@^4.43.0:
|
||||
version "4.50.0"
|
||||
resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.50.0.tgz#6f237f598b7163ede33ce827af8534c929aaa186"
|
||||
integrity sha512-/Zl4D8zPifNmyGzJS+3kVoyXeDeT/GrsJM94sACNg9RtUE0hrHa1bNPtRSrfHTMH5HjRzce6K7rlTh3Khiw+pw==
|
||||
version "4.50.1"
|
||||
resolved "https://registry.yarnpkg.com/rollup/-/rollup-4.50.1.tgz#6f0717c34aacc65cc727eeaaaccc2afc4e4485fd"
|
||||
integrity sha512-78E9voJHwnXQMiQdiqswVLZwJIzdBKJ1GdI5Zx6XwoFKUIk09/sSrr+05QFzvYb8q6Y9pPV45zzDuYa3907TZA==
|
||||
dependencies:
|
||||
"@types/estree" "1.0.8"
|
||||
optionalDependencies:
|
||||
"@rollup/rollup-android-arm-eabi" "4.50.0"
|
||||
"@rollup/rollup-android-arm64" "4.50.0"
|
||||
"@rollup/rollup-darwin-arm64" "4.50.0"
|
||||
"@rollup/rollup-darwin-x64" "4.50.0"
|
||||
"@rollup/rollup-freebsd-arm64" "4.50.0"
|
||||
"@rollup/rollup-freebsd-x64" "4.50.0"
|
||||
"@rollup/rollup-linux-arm-gnueabihf" "4.50.0"
|
||||
"@rollup/rollup-linux-arm-musleabihf" "4.50.0"
|
||||
"@rollup/rollup-linux-arm64-gnu" "4.50.0"
|
||||
"@rollup/rollup-linux-arm64-musl" "4.50.0"
|
||||
"@rollup/rollup-linux-loongarch64-gnu" "4.50.0"
|
||||
"@rollup/rollup-linux-ppc64-gnu" "4.50.0"
|
||||
"@rollup/rollup-linux-riscv64-gnu" "4.50.0"
|
||||
"@rollup/rollup-linux-riscv64-musl" "4.50.0"
|
||||
"@rollup/rollup-linux-s390x-gnu" "4.50.0"
|
||||
"@rollup/rollup-linux-x64-gnu" "4.50.0"
|
||||
"@rollup/rollup-linux-x64-musl" "4.50.0"
|
||||
"@rollup/rollup-openharmony-arm64" "4.50.0"
|
||||
"@rollup/rollup-win32-arm64-msvc" "4.50.0"
|
||||
"@rollup/rollup-win32-ia32-msvc" "4.50.0"
|
||||
"@rollup/rollup-win32-x64-msvc" "4.50.0"
|
||||
"@rollup/rollup-android-arm-eabi" "4.50.1"
|
||||
"@rollup/rollup-android-arm64" "4.50.1"
|
||||
"@rollup/rollup-darwin-arm64" "4.50.1"
|
||||
"@rollup/rollup-darwin-x64" "4.50.1"
|
||||
"@rollup/rollup-freebsd-arm64" "4.50.1"
|
||||
"@rollup/rollup-freebsd-x64" "4.50.1"
|
||||
"@rollup/rollup-linux-arm-gnueabihf" "4.50.1"
|
||||
"@rollup/rollup-linux-arm-musleabihf" "4.50.1"
|
||||
"@rollup/rollup-linux-arm64-gnu" "4.50.1"
|
||||
"@rollup/rollup-linux-arm64-musl" "4.50.1"
|
||||
"@rollup/rollup-linux-loongarch64-gnu" "4.50.1"
|
||||
"@rollup/rollup-linux-ppc64-gnu" "4.50.1"
|
||||
"@rollup/rollup-linux-riscv64-gnu" "4.50.1"
|
||||
"@rollup/rollup-linux-riscv64-musl" "4.50.1"
|
||||
"@rollup/rollup-linux-s390x-gnu" "4.50.1"
|
||||
"@rollup/rollup-linux-x64-gnu" "4.50.1"
|
||||
"@rollup/rollup-linux-x64-musl" "4.50.1"
|
||||
"@rollup/rollup-openharmony-arm64" "4.50.1"
|
||||
"@rollup/rollup-win32-arm64-msvc" "4.50.1"
|
||||
"@rollup/rollup-win32-ia32-msvc" "4.50.1"
|
||||
"@rollup/rollup-win32-x64-msvc" "4.50.1"
|
||||
fsevents "~2.3.2"
|
||||
|
||||
safe-array-concat@^1.1.3:
|
||||
@@ -3557,13 +3557,13 @@ terser@^5.17.4:
|
||||
commander "^2.20.0"
|
||||
source-map-support "~0.5.20"
|
||||
|
||||
tinyglobby@^0.2.10, tinyglobby@^0.2.14:
|
||||
version "0.2.14"
|
||||
resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.14.tgz#5280b0cf3f972b050e74ae88406c0a6a58f4079d"
|
||||
integrity sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==
|
||||
tinyglobby@^0.2.10, tinyglobby@^0.2.15:
|
||||
version "0.2.15"
|
||||
resolved "https://registry.yarnpkg.com/tinyglobby/-/tinyglobby-0.2.15.tgz#e228dd1e638cea993d2fdb4fcd2d4602a79951c2"
|
||||
integrity sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==
|
||||
dependencies:
|
||||
fdir "^6.4.4"
|
||||
picomatch "^4.0.2"
|
||||
fdir "^6.5.0"
|
||||
picomatch "^4.0.3"
|
||||
|
||||
to-data-view@^1.1.0:
|
||||
version "1.1.0"
|
||||
@@ -3683,9 +3683,9 @@ unicode-match-property-ecmascript@^2.0.0:
|
||||
unicode-property-aliases-ecmascript "^2.0.0"
|
||||
|
||||
unicode-match-property-value-ecmascript@^2.1.0:
|
||||
version "2.2.0"
|
||||
resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz#a0401aee72714598f739b68b104e4fe3a0cb3c71"
|
||||
integrity sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==
|
||||
version "2.2.1"
|
||||
resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.1.tgz#65a7adfad8574c219890e219285ce4c64ed67eaa"
|
||||
integrity sha512-JQ84qTuMg4nVkx8ga4A16a1epI9H6uTXAknqxkGF/aFfRLw1xC/Bp24HNLaZhHSkWd3+84t8iXnp1J0kYcZHhg==
|
||||
|
||||
unicode-property-aliases-ecmascript@^2.0.0:
|
||||
version "2.1.0"
|
||||
@@ -3729,16 +3729,16 @@ vite-plugin-pwa@^1.0.0:
|
||||
workbox-window "^7.3.0"
|
||||
|
||||
vite@^7.1.4:
|
||||
version "7.1.4"
|
||||
resolved "https://registry.yarnpkg.com/vite/-/vite-7.1.4.tgz#354944affb55e1aff0157406b74e0d0a3232df9a"
|
||||
integrity sha512-X5QFK4SGynAeeIt+A7ZWnApdUyHYm+pzv/8/A57LqSGcI88U6R6ipOs3uCesdc6yl7nl+zNO0t8LmqAdXcQihw==
|
||||
version "7.1.5"
|
||||
resolved "https://registry.yarnpkg.com/vite/-/vite-7.1.5.tgz#4dbcb48c6313116689be540466fc80faa377be38"
|
||||
integrity sha512-4cKBO9wR75r0BeIWWWId9XK9Lj6La5X846Zw9dFfzMRw38IlTk2iCcUt6hsyiDRcPidc55ZParFYDXi0nXOeLQ==
|
||||
dependencies:
|
||||
esbuild "^0.25.0"
|
||||
fdir "^6.5.0"
|
||||
picomatch "^4.0.3"
|
||||
postcss "^8.5.6"
|
||||
rollup "^4.43.0"
|
||||
tinyglobby "^0.2.14"
|
||||
tinyglobby "^0.2.15"
|
||||
optionalDependencies:
|
||||
fsevents "~2.3.3"
|
||||
|
||||
|
||||
Reference in New Issue
Block a user