format & lint; poprawki do nowego API

This commit is contained in:
2023-12-09 20:14:22 +01:00
parent 8aa2233d41
commit af2af08fbc
34 changed files with 10211 additions and 5157 deletions
+17
View File
@@ -0,0 +1,17 @@
/* eslint-env node */
module.exports = {
root: true,
extends: [
'plugin:vue/vue3-essential',
'eslint:recommended',
'@vue/eslint-config-typescript',
'@vue/eslint-config-prettier/skip-formatting'
],
rules: {
'vue/multi-word-component-names': 'off'
},
parserOptions: {
ecmaVersion: 'latest'
}
};
+7
View File
@@ -0,0 +1,7 @@
{
"$schema": "https://json.schemastore.org/prettierrc",
"tabWidth": 2,
"singleQuote": true,
"printWidth": 100,
"trailingComma": "none"
}
-5
View File
@@ -1,5 +0,0 @@
module.exports = {
presets: [
'@vue/cli-plugin-babel/preset'
]
}
+7542 -3603
View File
File diff suppressed because it is too large Load Diff
+8 -1
View File
@@ -7,7 +7,9 @@
"dev": "vite --port 8080", "dev": "vite --port 8080",
"deploy": "yarn build && firebase deploy --only hosting", "deploy": "yarn build && firebase deploy --only hosting",
"build": "vue-tsc --noEmit && vite build", "build": "vue-tsc --noEmit && vite build",
"preview": "vite preview" "preview": "vite preview",
"lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs,.ts,.tsx,.cts,.mts --fix --ignore-path .gitignore",
"format": "prettier --write src/"
}, },
"dependencies": { "dependencies": {
"axios": "^1.6.2", "axios": "^1.6.2",
@@ -19,6 +21,11 @@
}, },
"devDependencies": { "devDependencies": {
"@vitejs/plugin-vue": "^4.5.2", "@vitejs/plugin-vue": "^4.5.2",
"@vue/eslint-config-prettier": "^8.0.0",
"@vue/eslint-config-typescript": "^12.0.0",
"eslint": "^8.49.0",
"eslint-plugin-vue": "^9.17.0",
"prettier": "^3.0.3",
"sass": "^1.69.5", "sass": "^1.69.5",
"typescript": "^5.3.3", "typescript": "^5.3.3",
"vite": "^5.0.7", "vite": "^5.0.7",
+10 -10
View File
@@ -3,13 +3,15 @@
<router-view /> <router-view />
<transition name="slide-anim"> <transition name="slide-anim">
<div v-if="needRefresh" class="update-prompt" @click="updateServiceWorker(true)">Nowa wersja GeneraTORa dostępna! <u>Kliknij, aby odświeżyć aplikację!</u></div> <div v-if="needRefresh" class="update-prompt" @click="updateServiceWorker(true)">
Nowa wersja GeneraTORa dostępna!
<u>Kliknij, aby odświeżyć aplikację!</u>
</div>
</transition> </transition>
<footer> <footer>
&copy; <a href="https://td2.info.pl/profile/?u=20777">Spythere</a> {{ new Date().getUTCFullYear() }} | v.{{ &copy; <a href="https://td2.info.pl/profile/?u=20777">Spythere</a>
appVersion {{ new Date().getUTCFullYear() }} | v.{{ appVersion }}
}}
</footer> </footer>
</div> </div>
</template> </template>
@@ -22,19 +24,19 @@ import packageInfo from '../package.json';
export default defineComponent({ export default defineComponent({
setup() { setup() {
const { offlineReady, needRefresh, updateServiceWorker } = useRegisterSW({ const { offlineReady, needRefresh, updateServiceWorker } = useRegisterSW({
immediate: true, immediate: true
}); });
return { return {
offlineReady, offlineReady,
needRefresh, needRefresh,
updateServiceWorker, updateServiceWorker
}; };
}, },
data() { data() {
return { return {
appVersion: packageInfo.version, appVersion: packageInfo.version,
needRefreshTest: false, needRefreshTest: false
}; };
}, },
@@ -44,7 +46,7 @@ export default defineComponent({
setTimeout(() => { setTimeout(() => {
this.needRefreshTest = true; this.needRefreshTest = true;
}, 500); }, 500);
}, }
}); });
</script> </script>
@@ -52,7 +54,6 @@ export default defineComponent({
@import './styles/global.scss'; @import './styles/global.scss';
@import './styles/anims.scss'; @import './styles/anims.scss';
#app { #app {
color: white; color: white;
@@ -86,4 +87,3 @@ footer {
} }
} }
</style> </style>
+4 -5
View File
@@ -22,7 +22,7 @@ import OrderOVue from './OrderO.vue';
const orderComponents = { const orderComponents = {
orderN: OrderNVue, orderN: OrderNVue,
orderS: OrderSVue, orderS: OrderSVue,
orderO: OrderOVue, orderO: OrderOVue
}; };
export default defineComponent({ export default defineComponent({
@@ -32,15 +32,15 @@ export default defineComponent({
const store = useStore(); const store = useStore();
return { return {
store, store
}; };
}, },
computed: { computed: {
chosenOrderComponent() { chosenOrderComponent() {
return orderComponents[this.store.chosenOrderType]; return orderComponents[this.store.chosenOrderType];
}, }
}, }
}); });
</script> </script>
@@ -187,4 +187,3 @@ select {
} }
} }
</style> </style>
+9 -5
View File
@@ -36,7 +36,11 @@
</td> </td>
<td colspan="5"> <td colspan="5">
<input type="text" v-model="footerInfo.secondaryDispatcherName" placeholder="dyżurny (wypełnić jedno)" /> <input
type="text"
v-model="footerInfo.secondaryDispatcherName"
placeholder="dyżurny (wypełnić jedno)"
/>
<br /> <br />
z polecenia dyżurnego ruchu z polecenia dyżurnego ruchu
</td> </td>
@@ -59,7 +63,7 @@ export default defineComponent({
return { return {
store, store,
footerInfo: store.orderFooter, footerInfo: store.orderFooter
}; };
}, },
@@ -68,9 +72,9 @@ export default defineComponent({
deep: true, deep: true,
handler() { handler() {
this.generateFooter(); this.generateFooter();
}, }
}, }
}, }
}); });
</script> </script>
+11 -8
View File
@@ -11,11 +11,14 @@
<li> <li>
<b>Przetaczanie (manewr) taboru poza wskaźnik W 5 (granicy przetaczania)</b> <b>Przetaczanie (manewr) taboru poza wskaźnik W 5 (granicy przetaczania)</b>
<p> <p>
Rozkazu <u>nie stosujemy</u> w przypadku wyjazdu taboru na szlak dwutorowy, na którym odbywa się ruch w Rozkazu <u>nie stosujemy</u> w przypadku wyjazdu taboru na szlak dwutorowy, na którym
kierunku zasadniczym, tj. "prawostronnym". Dla wszystkich szlaków jednotorowych lub dwutorowych w sytuacji innej niż wymieniona odbywa się ruch w kierunku zasadniczym, tj. "prawostronnym". Dla wszystkich szlaków
wykorzystujemy działkę 4. rozkazu pisemnego "S". jednotorowych lub dwutorowych w sytuacji innej niż wymieniona wykorzystujemy działkę 4.
<br><br> rozkazu pisemnego "S". <br /><br />
<i>Szczegółowe informacje: instrukcja Ir-1 (R-1) § 12 pkt 4 "Manewry na torach głównych"</i> <i
>Szczegółowe informacje: instrukcja Ir-1 (R-1) § 12 pkt 4 "Manewry na torach
głównych"</i
>
</p> </p>
<button class="g-button action">Wygeneruj treść rozkazu</button> <button class="g-button action">Wygeneruj treść rozkazu</button>
</li> </li>
@@ -33,14 +36,14 @@ export default defineComponent({
setup() { setup() {
return { return {
store: useStore(), store: useStore(),
orderHelperData, orderHelperData
}; };
}, }
}); });
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import "../styles/global.scss"; @import '../styles/global.scss';
.content { .content {
width: 100%; width: 100%;
+18 -10
View File
@@ -3,12 +3,19 @@
<h3>Zapisane rozkazy pisemne ({{ localOrderList.length }})</h3> <h3>Zapisane rozkazy pisemne ({{ localOrderList.length }})</h3>
<transition-group name="list" tag="ul"> <transition-group name="list" tag="ul">
<li class="no-orders-warning" v-if="sortedOrderList.length == 0" :key="-1">Brak zapisanych rozkazów!</li> <li class="no-orders-warning" v-if="sortedOrderList.length == 0" :key="-1">
Brak zapisanych rozkazów!
</li>
<li v-for="order in sortedOrderList" :selected="order.id == store.chosenLocalOrderId" :key="order.id"> <li
v-for="order in sortedOrderList"
:selected="order.id == store.chosenLocalOrderId"
:key="order.id"
>
<b class="text--accent">#{{ order.id.split('-')[1] }}&nbsp;</b> <b class="text--accent">#{{ order.id.split('-')[1] }}&nbsp;</b>
<b> <b>
{{ getOrderName(order.orderType) }} nr {{ order.orderBody['header']['orderNo'] }} dla pociągu nr {{ getOrderName(order.orderType) }} nr {{ order.orderBody['header']['orderNo'] }} dla
pociągu nr
{{ order.orderBody['header']['trainNo'] }} {{ order.orderBody['header']['trainNo'] }}
</b> </b>
<br /> <br />
@@ -34,14 +41,14 @@ export default defineComponent({
data() { data() {
return { return {
localOrderList: [] as LocalStorageOrder[], localOrderList: [] as LocalStorageOrder[]
}; };
}, },
setup() { setup() {
return { return {
store: useStore(), store: useStore(),
localStorage: window.localStorage, localStorage: window.localStorage
}; };
}, },
@@ -57,13 +64,15 @@ export default defineComponent({
this.localOrderList = this.localOrderList.filter((o) => o.id != order.id); this.localOrderList = this.localOrderList.filter((o) => o.id != order.id);
if (this.localOrderList.length == 0) this.saveOrderSetting('orderCount', 0); if (this.localOrderList.length == 0) this.saveOrderSetting('orderCount', 0);
}, }
}, },
computed: { computed: {
sortedOrderList() { sortedOrderList() {
return this.localOrderList.sort((a, b) => (b.createdAt || b.updatedAt!) - (a.createdAt || a.updatedAt!)); return this.localOrderList
}, .slice()
.sort((a, b) => (b.createdAt || b.updatedAt!) - (a.createdAt || a.updatedAt!));
}
}, },
activated() { activated() {
@@ -80,7 +89,7 @@ export default defineComponent({
} }
this.localOrderList = orderList; this.localOrderList = orderList;
}, }
}); });
</script> </script>
@@ -149,4 +158,3 @@ li {
} }
} }
</style> </style>
+37 -15
View File
@@ -4,13 +4,18 @@
<div class="message_body" v-html="fullOrderMessage"></div> <div class="message_body" v-html="fullOrderMessage"></div>
<p class="message_info"> <p class="message_info">
Po wygenerowaniu rozkazu skopiuj jego treść lub zapisz w pamięci przeglądarki za pomocą przycisków poniżej Po wygenerowaniu rozkazu skopiuj jego treść lub zapisz w pamięci przeglądarki za pomocą
przycisków poniżej
</p> </p>
<div class="message_actions"> <div class="message_actions">
<button class="g-button action" @click="saveOrder">Zapisz nowy rozkaz</button> <button class="g-button action" @click="saveOrder">Zapisz nowy rozkaz</button>
<button class="g-button action" @click="copyMessage">Kopiuj treść rozkazu</button> <button class="g-button action" @click="copyMessage">Kopiuj treść rozkazu</button>
<button class="g-button action" :data-disabled="!store.chosenLocalOrderId" @click="updateOrder"> <button
class="g-button action"
:data-disabled="!store.chosenLocalOrderId"
@click="updateOrder"
>
Zaktualizuj rozkaz Zaktualizuj rozkaz
<span class="text--accent" <span class="text--accent"
>{{ store.chosenLocalOrderId && `#${store.chosenLocalOrderId.split('-')[1]}` }} >{{ store.chosenLocalOrderId && `#${store.chosenLocalOrderId.split('-')[1]}` }}
@@ -40,7 +45,13 @@
<span>Aktualizuj numer rozkazu po zapisaniu</span> <span>Aktualizuj numer rozkazu po zapisaniu</span>
</label> </label>
<label for="update-date" class="g-checkbox"> <label for="update-date" class="g-checkbox">
<input type="checkbox" name="update-date" id="update-date" v-model="updateDate" @change="onCheckboxChange" /> <input
type="checkbox"
name="update-date"
id="update-date"
v-model="updateDate"
@change="onCheckboxChange"
/>
<span>Aktualizuj godziny przy edycji</span> <span>Aktualizuj godziny przy edycji</span>
</label> </label>
</div> </div>
@@ -73,13 +84,13 @@ export default defineComponent({
incrementOnSave: true, incrementOnSave: true,
incrementOnCopy: true, incrementOnCopy: true,
updateDate: true, updateDate: true
}; };
}, },
setup() { setup() {
return { return {
store: useStore(), store: useStore()
}; };
}, },
@@ -90,14 +101,18 @@ export default defineComponent({
}, },
computed: { computed: {
fullOrderMessage() {
return this.store.orderMessage + this.store.footerMessage;
}
},
watch: {
fullOrderMessage() { fullOrderMessage() {
if (this.updateDate) { if (this.updateDate) {
this.store.orderFooter['hour'] = currentFormattedHours(); this.store.orderFooter['hour'] = currentFormattedHours();
this.store.orderFooter['minutes'] = currentFormattedMinutes(); this.store.orderFooter['minutes'] = currentFormattedMinutes();
} }
}
return this.store.orderMessage + this.store.footerMessage;
},
}, },
methods: { methods: {
@@ -181,10 +196,14 @@ export default defineComponent({
); );
break; break;
case 0: case 0:
this.showActionMonit('<span class="text--warn">Ostatni zapisany rozkaz jest identyczny z obecnym!</span>'); this.showActionMonit(
'<span class="text--warn">Ostatni zapisany rozkaz jest identyczny z obecnym!</span>'
);
break; break;
case 1: case 1:
this.showActionMonit('Zapisano treść <b class="text--accent">rozkazu</b> w pamięci przeglądarki!'); this.showActionMonit(
'Zapisano treść <b class="text--accent">rozkazu</b> w pamięci przeglądarki!'
);
if (this.incrementOnSave) this.incrementOrderNo(); if (this.incrementOnSave) this.incrementOrderNo();
break; break;
@@ -199,19 +218,23 @@ export default defineComponent({
switch (updatedOrderStatus) { switch (updatedOrderStatus) {
case -1: case -1:
this.showActionMonit('<span class="text--warn">Wystąpił błąd podczas aktualizowania tego rozkazu! :/</span>'); this.showActionMonit(
'<span class="text--warn">Wystąpił błąd podczas aktualizowania tego rozkazu! :/</span>'
);
break; break;
case 0: case 0:
this.showActionMonit('<span class="text--warn">Nie wybrałeś żadnego zapisanego rozkazu!</span>'); this.showActionMonit(
'<span class="text--warn">Nie wybrałeś żadnego zapisanego rozkazu!</span>'
);
break; break;
case 1: case 1:
this.showActionMonit('Zaktualizowano treść <b class="text--accent">rozkazu</b>!'); this.showActionMonit('Zaktualizowano treść <b class="text--accent">rozkazu</b>!');
break; break;
} }
}, }
}, }
}); });
</script> </script>
@@ -288,4 +311,3 @@ export default defineComponent({
} }
} }
</style> </style>
+69 -43
View File
@@ -6,7 +6,9 @@
<input type="number" v-model="order.header.orderNo" placeholder="nr rozkazu" min="1" /> <input type="number" v-model="order.header.orderNo" placeholder="nr rozkazu" min="1" />
</h2> </h2>
<div class="flex-row"> <div class="flex-row">
dla pociągu nr <input type="text" v-model="order.header.trainNo" placeholder="nr pociągu" /> dnia dla pociągu nr
<input type="text" v-model="order.header.trainNo" placeholder="nr pociągu" />
dnia
<input type="text" v-model="order.header.date" placeholder="data" /> <input type="text" v-model="order.header.date" placeholder="data" />
</div> </div>
</section> </section>
@@ -21,10 +23,13 @@
</div> </div>
</td> </td>
<td ref="row-1"> <td ref="row-1">
Od <input type="text" v-model="order.rows[0].from" holder="stacja / post." /> do Od
<input type="text" v-model="order.rows[0].to" holder="stacja / post." /> tor nr <input type="text" v-model="order.rows[0].from" holder="stacja / post." />
<input type="text" v-model="order.rows[0].trackNo" holder="nr toru" /> jest zamknięty, ruch jednotorowy do
dwukierunkowy wprowadzono po torze nr <input type="text" v-model="order.rows[0].to" holder="stacja / post." />
tor nr
<input type="text" v-model="order.rows[0].trackNo" holder="nr toru" />
jest zamknięty, ruch jednotorowy dwukierunkowy wprowadzono po torze nr
<input type="text" v-model="order.rows[0].trackNo2" holder="nr toru" /> <input type="text" v-model="order.rows[0].trackNo2" holder="nr toru" />
</td> </td>
</tr> </tr>
@@ -69,7 +74,8 @@
v-model="order.rows[1].signal1" v-model="order.rows[1].signal1"
holder="nazwa sem." holder="nazwa sem."
:radio-checked=" :radio-checked="
order.rows[1].checkbox == 'checkbox-2a' && order.rows[1].signalType == 'wyjazdowego' order.rows[1].checkbox == 'checkbox-2a' &&
order.rows[1].signalType == 'wyjazdowego'
" "
/> />
</label> </label>
@@ -89,7 +95,8 @@
v-model="order.rows[1].signal2" v-model="order.rows[1].signal2"
holder="nazwa sem." holder="nazwa sem."
:radio-checked=" :radio-checked="
order.rows[1].checkbox == 'checkbox-2a' && order.rows[1].signalType == 'drogowskazowego' order.rows[1].checkbox == 'checkbox-2a' &&
order.rows[1].signalType == 'drogowskazowego'
" "
/> />
(odnoszącego się do wyjazdu pociągu) (odnoszącego się do wyjazdu pociągu)
@@ -110,7 +117,8 @@
v-model="order.rows[1].signal3" v-model="order.rows[1].signal3"
holder="nazwa sem." holder="nazwa sem."
:radio-checked=" :radio-checked="
order.rows[1].checkbox == 'checkbox-2a' && order.rows[1].signalType == 'wjazdowego' order.rows[1].checkbox == 'checkbox-2a' &&
order.rows[1].signalType == 'wjazdowego'
" "
/> />
na post. odg. bez sem. wyjazdowego na post. odg. bez sem. wyjazdowego
@@ -191,15 +199,19 @@
<option value="Popychanie">Popychanie</option> <option value="Popychanie">Popychanie</option>
</select> </select>
pociągu odbędzie się w kierunku: pociągu odbędzie się w kierunku:
<input type="text" v-model="order.rows[2].direction" holder="stacja / post." /> do km <input type="text" v-model="order.rows[2].direction" holder="stacja / post." />
<input type="text" v-model="order.rows[2].toKilometer" holder="kilometry" /> skąd do km
<input type="text" v-model="order.rows[2].toKilometer" holder="kilometry" />
skąd
<select v-model="order.rows[2].option2"> <select v-model="order.rows[2].option2">
<option value="pociąg">pociąg</option> <option value="pociąg">pociąg</option>
<option value="popychacz">popychacz</option> <option value="popychacz">popychacz</option>
</select> </select>
ma wrócić po torze lewym nr ma wrócić po torze lewym nr
<input type="text" v-model="order.rows[2].trackNo" holder="nr toru" /> najpóźniej o godz. <input type="text" v-model="order.rows[2].trackNo" holder="nr toru" />
<input type="text" v-model="order.rows[2].untilHour" holder="godzina" /> min. najpóźniej o godz.
<input type="text" v-model="order.rows[2].untilHour" holder="godzina" />
min.
<input type="text" v-model="order.rows[2].untilMin" holder="minuta" /> <input type="text" v-model="order.rows[2].untilMin" holder="minuta" />
</td> </td>
</tr> </tr>
@@ -212,13 +224,14 @@
</td> </td>
<td ref="row-4"> <td ref="row-4">
<strong>WJAZD</strong> z toru szlakowego nr <strong>WJAZD</strong> z toru szlakowego nr
<input type="text" v-model="order.rows[3].trackNo" holder="nr toru" /> na <input type="text" v-model="order.rows[3].trackNo" holder="nr toru" />
na
<select v-model="order.rows[3].optionStation"> <select v-model="order.rows[3].optionStation">
<option value="stację">stację</option> <option value="stację">stację</option>
<option value="posterunek odgałęźny">posterunek odgałęźny</option> <option value="posterunek odgałęźny">posterunek odgałęźny</option>
</select> </select>
<input type="text" v-model="order.rows[3].stationName" holder="stacja / post." /> odbędzie się po <input type="text" v-model="order.rows[3].stationName" holder="stacja / post." />
otrzymaniu: odbędzie się po otrzymaniu:
<div style="margin-top: 0.5rem"> <div style="margin-top: 0.5rem">
<input <input
type="radio" type="radio"
@@ -259,8 +272,10 @@
</td> </td>
<td ref="row-5"> <td ref="row-5">
<strong>ZEZWALAM</strong> wjechać z toru szlakowego nr <strong>ZEZWALAM</strong> wjechać z toru szlakowego nr
<input type="text" v-model="order.rows[4].trackNo" holder="nr toru" /> z kierunku <input type="text" v-model="order.rows[4].trackNo" holder="nr toru" />
<input type="text" v-model="order.rows[4].direction" holder="stacja / post." /> na z kierunku
<input type="text" v-model="order.rows[4].direction" holder="stacja / post." />
na
<select v-model="order.rows[4].stationType"> <select v-model="order.rows[4].stationType">
<option value="stację">stację</option> <option value="stację">stację</option>
<option value="posterunek odgałęźny">posterunek odgałęźny</option> <option value="posterunek odgałęźny">posterunek odgałęźny</option>
@@ -306,7 +321,9 @@ export default defineComponent({
const message = `Od ${row.from || '_'} do ${row.to || '_'} tor nr ${ const message = `Od ${row.from || '_'} do ${row.to || '_'} tor nr ${
row.trackNo || '_' row.trackNo || '_'
} jest zamknięty, ruch jednotorowy dwukierunkowy wprowadzono po torze nr ${row.trackNo2 || '_'}`; } jest zamknięty, ruch jednotorowy dwukierunkowy wprowadzono po torze nr ${
row.trackNo2 || '_'
}`;
return message; return message;
}, },
@@ -317,20 +334,25 @@ export default defineComponent({
let message = `ZEZWALAM po otrzymaniu ${row.option1 || '_'}`; let message = `ZEZWALAM po otrzymaniu ${row.option1 || '_'}`;
if (row.checkbox == 'checkbox-2a') { if (row.checkbox == 'checkbox-2a') {
message += ` przejechać obok wskazującego sygnał "Stój" semafora ${row.signalType || '_'} `; message += ` przejechać obok wskazującego sygnał "Stój" semafora ${
row.signalType || '_'
} `;
if (row.signalType == 'wyjazdowego') message += row.signal1 || '_'; if (row.signalType == 'wyjazdowego') message += row.signal1 || '_';
if (row.signalType == 'drogowskazowego') if (row.signalType == 'drogowskazowego')
message += `${row.signal2 || '_'} (odnoszącego się do wyjazdu pociągu)`; message += `${row.signal2 || '_'} (odnoszącego się do wyjazdu pociągu)`;
if (row.signalType == 'wjazdowego') message += `${row.signal3 || '_'} na post. odg. bez sem. wyjazdowego`; if (row.signalType == 'wjazdowego')
message += `${row.signal3 || '_'} na post. odg. bez sem. wyjazdowego`;
message += ` i wyjechać w kierunku ${row.direction1 || '_'} na tor szlakowy ${row.option2 || '_'} nr ${ message += ` i wyjechać w kierunku ${row.direction1 || '_'} na tor szlakowy ${
row.trackNoTo1 || '_' row.option2 || '_'
}`; } nr ${row.trackNoTo1 || '_'}`;
} }
if (row.checkbox == 'checkbox-2b') { if (row.checkbox == 'checkbox-2b') {
message += ` z toru nr ${row.trackNoFrom || '_'} nie posiadającego semafora wyjazdowego wyjechać w kierunku ${ message += ` z toru nr ${
row.trackNoFrom || '_'
} nie posiadającego semafora wyjazdowego wyjechać w kierunku ${
row.direction2 || '_' row.direction2 || '_'
} na tor szlakowy ${row.option3 || '_'} nr ${row.trackNoTo2 || '_'}`; } na tor szlakowy ${row.option3 || '_'} nr ${row.trackNoTo2 || '_'}`;
} }
@@ -341,11 +363,11 @@ export default defineComponent({
() => { () => {
const row = order.rows[2]; const row = order.rows[2];
let message = `${row.option1 || '_'} pociągu odbędzie się w kierunku: ${row.direction || '_'} do km ${ let message = `${row.option1 || '_'} pociągu odbędzie się w kierunku: ${
row.toKilometer || '_' row.direction || '_'
} skąd ${row.option2 || '_'} ma wrócić po torze lewym nr ${row.trackNo || '_'} najpóźniej o godz. ${ } do km ${row.toKilometer || '_'} skąd ${row.option2 || '_'} ma wrócić po torze lewym nr ${
row.untilHour || '_' row.trackNo || '_'
} min. ${row.untilMin || '_'}`; } najpóźniej o godz. ${row.untilHour || '_'} min. ${row.untilMin || '_'}`;
return message; return message;
}, },
@@ -353,15 +375,18 @@ export default defineComponent({
() => { () => {
const row = order.rows[3]; const row = order.rows[3];
let message = `WJAZD z toru szlakowego nr ${row.trackNo || '_'} na ${row.optionStation || '_'} ${ let message = `WJAZD z toru szlakowego nr ${row.trackNo || '_'} na ${
row.stationName || '_' row.optionStation || '_'
} odbędzie się po otrzymaniu: `; } ${row.stationName || '_'} odbędzie się po otrzymaniu: `;
if (row.checkbox == 'checkbox-4a') if (row.checkbox == 'checkbox-4a')
message += `sygnału zastępczego "Sz" na osobnym urządzeniu ustawionym z ${row.side || '_'} strony toru`; message += `sygnału zastępczego "Sz" na osobnym urządzeniu ustawionym z ${
row.side || '_'
} strony toru`;
if (row.checkbox == 'checkbox-4b') if (row.checkbox == 'checkbox-4b')
message += 'rozkazu pisemnego "N" (doręczonego lub przekazanego przez urządzenia łączności)'; message +=
'rozkazu pisemnego "N" (doręczonego lub przekazanego przez urządzenia łączności)';
return message; return message;
}, },
@@ -371,16 +396,18 @@ export default defineComponent({
const message = `ZEZWALAM wjechać z toru szlakowego nr ${row.trackNo || '_'} z kierunku ${ const message = `ZEZWALAM wjechać z toru szlakowego nr ${row.trackNo || '_'} z kierunku ${
row.direction || '_' row.direction || '_'
} na ${row.stationType || '_'} ${row.stationName || '_'} i przejechać obok sygnału "Stój" na ${row.on || '_'} `; } na ${row.stationType || '_'} ${
row.stationName || '_'
} i przejechać obok sygnału "Stój" na ${row.on || '_'} `;
return message; return message;
}, }
]; ];
return { return {
store, store,
order, order,
rowMethods, rowMethods
}; };
}, },
@@ -389,14 +416,14 @@ export default defineComponent({
deep: true, deep: true,
handler() { handler() {
this.generateMessage(); this.generateMessage();
}, }
}, },
'order.rows': { 'order.rows': {
deep: true, deep: true,
handler() { handler() {
this.updatePlaceholders(); this.updatePlaceholders();
}, }
}, }
}, },
mounted() { mounted() {
@@ -433,8 +460,7 @@ export default defineComponent({
} }
this.store.orderMessage = message; this.store.orderMessage = message;
}, }
}, }
}); });
</script> </script>
+14 -13
View File
@@ -7,7 +7,9 @@
</h2> </h2>
<div class="flex-row" style="padding: 0 0.5em"> <div class="flex-row" style="padding: 0 0.5em">
dla pociągu nr <input type="text" v-model="order.header.trainNo" placeholder="nr pociągu" /> dnia dla pociągu nr
<input type="text" v-model="order.header.trainNo" placeholder="nr pociągu" />
dnia
<input type="text" v-model="order.header.date" /> <input type="text" v-model="order.header.date" />
</div> </div>
@@ -41,7 +43,7 @@
<td colspan="2">kilometra</td> <td colspan="2">kilometra</td>
</tr> </tr>
<tr v-for="row in order.orderList" class="tr-data"> <tr v-for="row in order.orderList" :key="row.name" class="tr-data">
<td> <td>
<textarea v-model="row.name"></textarea> <textarea v-model="row.name"></textarea>
</td> </td>
@@ -88,16 +90,16 @@ export default defineComponent({
() => { () => {
const { header } = order; const { header } = order;
return `<i>Rozkaz pisemny "O" nr ${header.orderNo || '_'} dla pociągu nr ${header.trainNo || '_'} dnia ${ return `<i>Rozkaz pisemny "O" nr ${header.orderNo || '_'} dla pociągu nr ${
header.date || '_' header.trainNo || '_'
}</i>`; } dnia ${header.date || '_'}</i>`;
}, }
]; ];
return { return {
store, store,
order, order,
rowMethods, rowMethods
}; };
}, },
@@ -110,8 +112,8 @@ export default defineComponent({
deep: true, deep: true,
handler() { handler() {
this.generateMessage(); this.generateMessage();
}, }
}, }
}, },
methods: { methods: {
@@ -137,13 +139,13 @@ export default defineComponent({
rowsMessageList.push(rowMessage); rowsMessageList.push(rowMessage);
} }
message += rowsMessageList.join("; "); message += rowsMessageList.join('; ');
if (this.order.other) message += ` <b> [ 2 ] </b> Inne: ${this.order.other}`; if (this.order.other) message += ` <b> [ 2 ] </b> Inne: ${this.order.other}`;
this.store.orderMessage = message; this.store.orderMessage = message;
}, }
}, }
}); });
</script> </script>
@@ -212,4 +214,3 @@ th {
} }
} }
</style> </style>
+67 -31
View File
@@ -11,7 +11,9 @@
<option value="pociągu">pociągu</option> <option value="pociągu">pociągu</option>
<option value="manewru">manewru</option> <option value="manewru">manewru</option>
</select> </select>
nr <input type="text" v-model="order.header.trainNo" :placeholder="`nr ${order.header.for}`" /> dnia nr
<input type="text" v-model="order.header.trainNo" :placeholder="`nr ${order.header.for}`" />
dnia
<input type="text" v-model="order.header.date" placeholder="data" /> <input type="text" v-model="order.header.date" placeholder="data" />
</div> </div>
</section> </section>
@@ -184,13 +186,19 @@
</div> </div>
</td> </td>
<td ref="row-3"> <td ref="row-3">
Od <input type="text" v-model="order.rows[2].from" holder="stacja / post." /> do Od
<input type="text" v-model="order.rows[2].to" holder="stacja / post." /> po torze nr <input type="text" v-model="order.rows[2].from" holder="stacja / post." />
<input type="text" v-model="order.rows[2].trackNo" holder="nr toru" /> ruch pociągów prowadzony jest w do
odstępie posterunków następczych. Wskazania semaforów sbl nieważne. Zachować ostrożność od ostatniego <input type="text" v-model="order.rows[2].to" holder="stacja / post." />
semafora ze wskaźnikiem "W18". Szlak wolny, ostatni pociąg nr po torze nr
<input type="text" v-model="order.rows[2].trainNo" holder="nr pociągu" /> przybył do <input type="text" v-model="order.rows[2].trackNo" holder="nr toru" />
<input type="text" v-model="order.rows[2].arrivedTo" holder="stacja / post." /> o godzinie ruch pociągów prowadzony jest w odstępie posterunków następczych. Wskazania semaforów
sbl nieważne. Zachować ostrożność od ostatniego semafora ze wskaźnikiem "W18".
Szlak wolny, ostatni pociąg nr
<input type="text" v-model="order.rows[2].trainNo" holder="nr pociągu" />
przybył do
<input type="text" v-model="order.rows[2].arrivedTo" holder="stacja / post." />
o godzinie
<input type="text" v-model="order.rows[2].hour" holder="godzina" /> <input type="text" v-model="order.rows[2].hour" holder="godzina" />
</td> </td>
</tr> </tr>
@@ -207,8 +215,14 @@
</div> </div>
</td> </td>
<td ref="row-4"> <td ref="row-4">
<button class="g-button text" @click="order.rows[3].w5.enabled = !order.rows[3].w5.enabled"> <button
&gt; <span v-if="!order.rows[3].w5.enabled">Wygeneruj treść na pominięcie wskaźnika W5</span> class="g-button text"
@click="order.rows[3].w5.enabled = !order.rows[3].w5.enabled"
>
&gt;
<span v-if="!order.rows[3].w5.enabled"
>Wygeneruj treść na pominięcie wskaźnika W5</span
>
<span v-else>Wpisz treść własnoręcznie</span> <span v-else>Wpisz treść własnoręcznie</span>
</button> </button>
@@ -220,14 +234,26 @@
<option value="granicę przetaczania">granicę przetaczania</option> <option value="granicę przetaczania">granicę przetaczania</option>
</select> </select>
po torze szlakowym nr po torze szlakowym nr
<input type="text" v-model="order.rows[3].w5.trackNo" holder="nr szlaku" /> do kilometra <input type="text" v-model="order.rows[3].w5.trackNo" holder="nr szlaku" />
<input type="text" v-model="order.rows[3].w5.maxKm" holder="km szlaku" />. Powrót odbędzie się na do kilometra
<select id="select-returnWay" v-model="order.rows[3].w5.returnWay" style="width: 250px"> <input type="text" v-model="order.rows[3].w5.maxKm" holder="km szlaku" />. Powrót
<option :value='`sygnał ręczny "Do mnie"`'>sygnał ręczny "Do mnie"</option> odbędzie się na
<option :value='`sygnał "Do mnie" przekazany przez urządzenia radiołączności`'> <select
id="select-returnWay"
v-model="order.rows[3].w5.returnWay"
style="width: 250px"
>
<option :value="`sygnał ręczny &quot;Do mnie&quot;`">
sygnał ręczny "Do mnie"
</option>
<option
:value="`sygnał &quot;Do mnie&quot; przekazany przez urządzenia radiołączności`"
>
sygnał "Do mnie" przekazany przez urządzenia radiołączności sygnał "Do mnie" przekazany przez urządzenia radiołączności
</option> </option>
<option value="sygnał Ms2 podany na tarczy manewrowej">sygnał Ms2 podany na tarczy manewrowej</option> <option value="sygnał Ms2 podany na tarczy manewrowej">
sygnał Ms2 podany na tarczy manewrowej
</option>
</select> </select>
<input <input
type="text" type="text"
@@ -235,7 +261,8 @@
holder="nazwa tarczy" holder="nazwa tarczy"
v-if="order.rows[3].w5.returnWay.includes('tarczy')" v-if="order.rows[3].w5.returnWay.includes('tarczy')"
/> />
do godziny <input type="text" v-model="order.rows[3].w5.maxHour" holder="godzina" /> do godziny
<input type="text" v-model="order.rows[3].w5.maxHour" holder="godzina" />
</div> </div>
<textarea id="" cols="30" rows="10" v-model="order.rows[3].content" v-else></textarea> <textarea id="" cols="30" rows="10" v-model="order.rows[3].content" v-else></textarea>
@@ -276,10 +303,13 @@ export default defineComponent({
let message = `zezwalam po otrzymaniu ${row.option1 || '_'}`; let message = `zezwalam po otrzymaniu ${row.option1 || '_'}`;
if (row.radio1 == 'radio-1a-1') if (row.radio1 == 'radio-1a-1')
message += ` przejechać obok wskazującego sygnał "Stój" semafora ${row.optionSignal || '_'} ${ message += ` przejechać obok wskazującego sygnał "Stój" semafora ${
row.signal1 || '_' row.optionSignal || '_'
}`; } ${row.signal1 || '_'}`;
else message += ` wyjechać z toru nr ${row.trackNo || '_'} nie posiadającego semafora wyjazdowego`; else
message += ` wyjechać z toru nr ${
row.trackNo || '_'
} nie posiadającego semafora wyjazdowego`;
return message; return message;
}, },
@@ -300,7 +330,9 @@ export default defineComponent({
message += `odstępowego ${row.signal3 || '_'}`; message += `odstępowego ${row.signal3 || '_'}`;
break; break;
case 'toru': case 'toru':
message += `wjechać z zamkniętego toru nr ${row.trackNo || '_'} nie posiadającego semafora wjazdowego`; message += `wjechać z zamkniętego toru nr ${
row.trackNo || '_'
} nie posiadającego semafora wjazdowego`;
break; break;
default: default:
@@ -326,7 +358,12 @@ export default defineComponent({
const { borderType, trackNo, maxHour, maxKm, returnWay, tmName } = row.w5; const { borderType, trackNo, maxHour, maxKm, returnWay, tmName } = row.w5;
const textArray = []; const textArray = [];
textArray.push('Inne: zezwalam na wyjazd poza', borderType || '_', 'po torze szlakowym nr', trackNo || '_'); textArray.push(
'Inne: zezwalam na wyjazd poza',
borderType || '_',
'po torze szlakowym nr',
trackNo || '_'
);
if (maxKm) textArray.push(`do kilometra ${maxKm}`); if (maxKm) textArray.push(`do kilometra ${maxKm}`);
textArray.push('.'); textArray.push('.');
textArray.push('Powrót odbędzie się na', returnWay || '_'); textArray.push('Powrót odbędzie się na', returnWay || '_');
@@ -337,13 +374,13 @@ export default defineComponent({
} }
return `Inne: ${row.content}`; return `Inne: ${row.content}`;
}, }
]; ];
return { return {
store, store,
order, order,
rowMethods, rowMethods
}; };
}, },
@@ -360,15 +397,15 @@ export default defineComponent({
deep: true, deep: true,
handler() { handler() {
this.generateMessage(); this.generateMessage();
}, }
}, },
'order.rows': { 'order.rows': {
deep: true, deep: true,
handler() { handler() {
this.updatePlaceholders(); this.updatePlaceholders();
}, }
}, }
}, },
methods: { methods: {
@@ -397,8 +434,8 @@ export default defineComponent({
this.$nextTick(() => { this.$nextTick(() => {
handleOrderPlaceholders(isRowEnabled, rowRef); handleOrderPlaceholders(isRowEnabled, rowRef);
}); });
}, }
}, }
}); });
</script> </script>
@@ -409,4 +446,3 @@ textarea {
resize: none; resize: none;
} }
</style> </style>
+82 -63
View File
@@ -4,7 +4,11 @@
<label for="dispatcher-select"> <label for="dispatcher-select">
<select name="dispatcher-select" id="dispatcher-select" v-model="selectedDispatcherName"> <select name="dispatcher-select" id="dispatcher-select" v-model="selectedDispatcherName">
<option :value="null" disabled>Nick dyżurnego</option> <option :value="null" disabled>Nick dyżurnego</option>
<option v-for="dispatcherName in dispatcherNameList" :value="dispatcherName"> <option
v-for="dispatcherName in dispatcherNameList"
:value="dispatcherName"
:key="dispatcherName"
>
{{ dispatcherName }} {{ dispatcherName }}
</option> </option>
</select> </select>
@@ -15,10 +19,10 @@
name="scenery-select" name="scenery-select"
id="scenery-select" id="scenery-select"
v-model="selectedSceneryName" v-model="selectedSceneryName"
:disabled="sceneryNameList.length == 0" :disabled="!sceneryNameList || sceneryNameList.length == 0"
> >
<option :value="null" disabled>Sceneria</option> <option :value="null" disabled>Sceneria</option>
<option :value="sceneryName" v-for="sceneryName in sceneryNameList"> <option :value="sceneryName" v-for="sceneryName in sceneryNameList" :key="sceneryName">
{{ sceneryName }} {{ sceneryName }}
</option> </option>
</select> </select>
@@ -29,43 +33,62 @@
name="checkpoint-select" name="checkpoint-select"
id="checkpoint-select" id="checkpoint-select"
v-model="selectedCheckpointName" v-model="selectedCheckpointName"
:disabled="sceneryNameList.length == 0" :disabled="!sceneryNameList || sceneryNameList.length == 0"
> >
<option :value="null" disabled>Posterunek</option> <option :value="null" disabled>Posterunek</option>
<option :value="cp" v-for="cp in checkpointNameList"> <option :value="cp" v-for="cp in checkpointNameList" :key="cp">
{{ cp }} {{ cp }}
</option> </option>
</select> </select>
</label> </label>
<label for="fill-checkpoint" class="g-checkbox"> <label for="fill-checkpoint" class="g-checkbox">
<input type="checkbox" name="fill-checkpoint" id="fill-checkpoint" v-model="fillCheckpointName" /> <input
type="checkbox"
name="fill-checkpoint"
id="fill-checkpoint"
v-model="fillCheckpointName"
/>
<span> Uzupełniaj skrót post.</span> <span> Uzupełniaj skrót post.</span>
</label> </label>
</div> </div>
<div class="content"> <div class="content">
<b v-if="!selectedSceneryName" class="text--accent"> Wybierz dyżurnego oraz scenerię, aby zobaczyć pociągi </b> <b v-if="!selectedSceneryName" class="text--accent">
Wybierz dyżurnego oraz scenerię, aby zobaczyć pociągi
</b>
<div v-else> <div v-else>
<b class="text--accent">Kliknij na gracza, aby wypełnić obecny rozkaz jego danymi</b> <b class="text--accent">Kliknij na gracza, aby wypełnić obecny rozkaz jego danymi</b>
<p>Gracze online bez RJ</p> <p>Gracze online bez RJ</p>
<ul class="train-list"> <ul class="train-list">
<li v-for="train in sceneryTrains" @click="fillOrder(train.trainNo)"> <li
v-for="train in sceneryTrains"
:key="train.trainNo + train.driverName"
@click="fillOrder(train.trainNo)"
>
<b>{{ train.trainNo }} | {{ train.driverName }}</b> <b>{{ train.trainNo }} | {{ train.driverName }}</b>
</li> </li>
<li class="no-trains" v-if="sceneryTrains.length == 0 && selectedSceneryName">Brak graczy</li> <li class="no-trains" v-if="sceneryTrains?.length == 0 && selectedSceneryName">
Brak graczy
</li>
</ul> </ul>
<p>Aktywne rozkłady jazdy</p> <p>Aktywne rozkłady jazdy</p>
<ul class="train-list"> <ul class="train-list">
<li v-for="train in sceneryScheduledTrains" @click="fillOrder(train.trainNo)"> <li
v-for="train in sceneryScheduledTrains"
:key="train.trainNo + train.driverName"
@click="fillOrder(train.trainNo)"
>
<b>{{ train.trainNo }} | {{ train.driverName }}</b> <b>{{ train.trainNo }} | {{ train.driverName }}</b>
</li> </li>
<li class="no-trains" v-if="sceneryScheduledTrains.length == 0">Brak aktywnych rozkładów</li> <li class="no-trains" v-if="sceneryScheduledTrains?.length == 0">
Brak aktywnych rozkładów
</li>
</ul> </ul>
</div> </div>
</div> </div>
@@ -74,20 +97,23 @@
<script lang="ts"> <script lang="ts">
import { defineComponent } from 'vue'; import { defineComponent } from 'vue';
import axios from 'axios';
import { ApiSWDR, ApiStacjownik } from '../types/apiTypes';
import { useStore } from '../store/store'; import { useStore } from '../store/store';
import { currentFormattedDate, currentFormattedHours, currentFormattedMinutes } from '../utils/dateUtils'; import {
import { ISceneryOnline, ISceneryData } from '../types/dataTypes'; currentFormattedDate,
currentFormattedHours,
currentFormattedMinutes
} from '../utils/dateUtils';
import http from '../http';
import { ISceneryData } from '../types/dataTypes';
import { API } from '../types/apiTypes';
export default defineComponent({ export default defineComponent({
name: 'order-train-picker', name: 'order-train-picker',
data() { data() {
return { return {
sceneriesData: [] as ISceneryData[], sceneriesData: undefined as ISceneryData[] | undefined,
sceneriesOnline: [] as ISceneryOnline[], activeData: undefined as API.ActiveData.Response | undefined,
trainsOnline: [] as ApiStacjownik.IActiveTrain[],
selectedSceneryName: null as string | null, selectedSceneryName: null as string | null,
selectedDispatcherName: null as string | null, selectedDispatcherName: null as string | null,
@@ -96,7 +122,7 @@ export default defineComponent({
fillCheckpointName: false, fillCheckpointName: false,
refreshInterval: -1, refreshInterval: -1,
store: useStore(), store: useStore()
}; };
}, },
@@ -107,10 +133,10 @@ export default defineComponent({
}, },
activated() { activated() {
this.fetchOnlineData(); this.fetchActiveData();
this.refreshInterval = window.setInterval(() => { this.refreshInterval = window.setInterval(() => {
this.fetchOnlineData(); this.fetchActiveData();
}, 35 * 1000); }, 35 * 1000);
}, },
@@ -120,34 +146,41 @@ export default defineComponent({
watch: { watch: {
selectedDispatcherName() { selectedDispatcherName() {
if (!this.sceneryNameList) return null;
this.selectedSceneryName = this.sceneryNameList.length == 0 ? null : this.sceneryNameList[0]; this.selectedSceneryName = this.sceneryNameList.length == 0 ? null : this.sceneryNameList[0];
}, },
selectedSceneryName() { selectedSceneryName() {
this.selectedCheckpointName = this.checkpointNameList.length == 0 ? null : this.checkpointNameList[0]; this.selectedCheckpointName =
this.checkpointNameList.length == 0 ? null : this.checkpointNameList[0];
}, },
fillCheckpointName(val: boolean) { fillCheckpointName(val: boolean) {
window.localStorage.setItem('fill-checkpoint', `${val}`); window.localStorage.setItem('fill-checkpoint', `${val}`);
}, }
}, },
computed: { computed: {
selectedSceneryHash() { selectedSceneryHash() {
return this.sceneriesOnline.find((s) => this.selectedSceneryName == s.stationName)?.stationHash; return this.activeData?.activeSceneries?.find(
(s) => this.selectedSceneryName == s.stationName
)?.stationHash;
}, },
sceneriesOnlinePL1() { sceneriesOnlinePL1() {
return this.sceneriesOnline.filter((s) => s.region == 'eu' && s.isOnline); return this.activeData?.activeSceneries?.filter((s) => s.region == 'eu' && s.isOnline);
}, },
dispatcherNameList() { dispatcherNameList() {
return [...new Set(this.sceneriesOnlinePL1.map((s) => s.dispatcherName))].sort((a, b) => return [...new Set(this.sceneriesOnlinePL1?.map((s) => s.dispatcherName))].sort((a, b) =>
a.toLocaleLowerCase() < b.toLocaleLowerCase() ? -1 : 1 a.toLocaleLowerCase() < b.toLocaleLowerCase() ? -1 : 1
); );
}, },
sceneryNameList() { sceneryNameList() {
if (!this.sceneriesOnlinePL1) return [];
return this.sceneriesOnlinePL1 return this.sceneriesOnlinePL1
.filter((s) => s.dispatcherName == this.selectedDispatcherName) .filter((s) => s.dispatcherName == this.selectedDispatcherName)
.map((s) => s.stationName) .map((s) => s.stationName)
@@ -158,7 +191,7 @@ export default defineComponent({
if (!this.selectedSceneryName) return []; if (!this.selectedSceneryName) return [];
const name = this.selectedSceneryName; const name = this.selectedSceneryName;
const checkpoints = this.sceneriesData.find( const checkpoints = this.sceneriesData?.find(
(s) => s.name.toLocaleLowerCase() == name.toLocaleLowerCase() (s) => s.name.toLocaleLowerCase() == name.toLocaleLowerCase()
)?.checkpoints; )?.checkpoints;
@@ -168,8 +201,12 @@ export default defineComponent({
}, },
sceneryTrains() { sceneryTrains() {
return this.trainsOnline.filter( return this.activeData?.trains?.filter(
(t) => t.online && t.currentStationName == this.selectedSceneryName && this.selectedSceneryName && !t.timetable (t) =>
t.online &&
t.currentStationName == this.selectedSceneryName &&
this.selectedSceneryName &&
!t.timetable
); );
}, },
@@ -177,44 +214,23 @@ export default defineComponent({
if (!this.selectedSceneryHash) return []; if (!this.selectedSceneryHash) return [];
const hash = this.selectedSceneryHash; const hash = this.selectedSceneryHash;
return this.trainsOnline return this.activeData?.trains
.filter((t) => t.timetable?.sceneries.includes(hash)) ?.filter((t) => t.timetable?.sceneries.includes(hash))
.sort((t1, t2) => t1.trainNo - t2.trainNo); .sort((t1, t2) => t1.trainNo - t2.trainNo);
}, }
}, },
methods: { methods: {
async fetchSceneriesData() { async fetchSceneriesData() {
const data: ISceneryData[] = await (await axios.get(`${import.meta.env['VITE_APP_API_URL']}/getSceneries`)).data; const data: ISceneryData[] = (await http.get<ISceneryData[]>('api/getSceneries')).data;
if (!data) return;
this.sceneriesData = data; this.sceneriesData = data;
}, },
async fetchOnlineData() { async fetchActiveData() {
this.fetchSceneriesOnline(); const data: API.ActiveData.Response = await (await http.get('api/getActiveData')).data;
this.fetchTrainsOnline();
},
async fetchSceneriesOnline() { this.activeData = data;
const data: ApiSWDR.IStationsOnline = await (
await axios.get(`${import.meta.env['VITE_APP_SWDR_URL']}/?method=getStationsOnline`)
).data;
if (!data.success) return;
this.sceneriesOnline = data.message;
},
async fetchTrainsOnline() {
const data: ApiStacjownik.IActiveTrain[] = await (
await axios.get(`${import.meta.env['VITE_APP_API_URL']}/getActiveTrainList`)
).data;
if (!data) return;
this.trainsOnline = data;
}, },
fillOrder(trainNo: number) { fillOrder(trainNo: number) {
@@ -225,18 +241,22 @@ export default defineComponent({
chosenOrder.header.date = currentFormattedDate(); chosenOrder.header.date = currentFormattedDate();
this.store.orderFooter.dispatcherName = this.selectedDispatcherName; this.store.orderFooter.dispatcherName = this.selectedDispatcherName;
this.store.orderFooter.stationName = this.selectedCheckpointName?.split(',')[0] || this.selectedSceneryName; this.store.orderFooter.stationName =
this.selectedCheckpointName?.split(',')[0] || this.selectedSceneryName;
this.store.orderFooter.hour = currentFormattedHours(); this.store.orderFooter.hour = currentFormattedHours();
this.store.orderFooter.minutes = currentFormattedMinutes(); this.store.orderFooter.minutes = currentFormattedMinutes();
if (this.fillCheckpointName) { if (this.fillCheckpointName) {
const sceneryAbbrev = this.sceneriesData.find(({ name }) => name === this.selectedSceneryName)?.abbr; const sceneryAbbrev = this.sceneriesData?.find(
this.store.orderFooter.checkpointName = sceneryAbbrev || this.store.orderFooter.stationName.slice(0, 2); ({ name }) => name === this.selectedSceneryName
)?.abbr;
this.store.orderFooter.checkpointName =
sceneryAbbrev || this.store.orderFooter.stationName.slice(0, 2);
} }
this.store.orderMode = 'OrderMessage'; this.store.orderMode = 'OrderMessage';
}, }
}, }
}); });
</script> </script>
@@ -314,4 +334,3 @@ ul.train-list {
} }
} }
</style> </style>
+8 -9
View File
@@ -31,22 +31,22 @@ export default defineComponent({
orderTypeList: [ orderTypeList: [
{ {
id: 'orderN', id: 'orderN',
name: 'N', name: 'N'
}, },
{ {
id: 'orderS', id: 'orderS',
name: 'S', name: 'S'
}, },
{ {
id: 'orderO', id: 'orderO',
name: 'O', name: 'O'
}, }
], ]
}; };
}, },
setup() { setup() {
return { return {
store: useStore(), store: useStore()
}; };
}, },
@@ -55,8 +55,8 @@ export default defineComponent({
if (type != this.store.chosenOrderType) this.store.chosenLocalOrderId = ''; if (type != this.store.chosenOrderType) this.store.chosenLocalOrderId = '';
this.store.chosenOrderType = type; this.store.chosenOrderType = type;
}, }
}, }
}); });
</script> </script>
@@ -143,4 +143,3 @@ button.option-save {
} }
} }
</style> </style>
+1 -3
View File
@@ -1,5 +1,3 @@
{ {
"orderS": [ "orderS": ["D"]
"D"
]
} }
+4 -2
View File
@@ -13,8 +13,10 @@ export const handleOrderPlaceholders = (isRowEnabled: boolean, rowRef: HTMLTable
if (!node.getAttribute('holder')) return; if (!node.getAttribute('holder')) return;
const radioCheckedAttr = node.getAttribute('radio-checked'); const radioCheckedAttr = node.getAttribute('radio-checked');
if (radioCheckedAttr == null) return node.setAttribute('placeholder', node.getAttribute('holder')!); if (radioCheckedAttr == null)
if (radioCheckedAttr == 'true') return node.setAttribute('placeholder', node.getAttribute('holder')!); return node.setAttribute('placeholder', node.getAttribute('holder')!);
if (radioCheckedAttr == 'true')
return node.setAttribute('placeholder', node.getAttribute('holder')!);
if (node.getAttribute('placeholder') == null) return; if (node.getAttribute('placeholder') == null) return;
node.setAttribute('holder', node.getAttribute('placeholder')!); node.setAttribute('holder', node.getAttribute('placeholder')!);
+7
View File
@@ -0,0 +1,7 @@
import axios from 'axios';
const http = axios.create({
baseURL: 'https://stacjownik.spythere.eu'
});
export default http;
-1
View File
@@ -4,4 +4,3 @@ import router from './router';
import { createPinia } from 'pinia'; import { createPinia } from 'pinia';
createApp(App).use(router).use(createPinia()).mount('#app'); createApp(App).use(router).use(createPinia()).mount('#app');
+3 -4
View File
@@ -4,7 +4,7 @@ import { useStore } from '../store/store';
export default defineComponent({ export default defineComponent({
setup() { setup() {
return { return {
store: useStore(), store: useStore()
}; };
}, },
@@ -25,7 +25,6 @@ export default defineComponent({
this.store.footerMessage = ` <b>|</b> ${messageArray.join( this.store.footerMessage = ` <b>|</b> ${messageArray.join(
', ' ', '
)} <b>|</b> Rozkaz otrzymałem, maszynista: (potwierdzić otrzymanie rozkazu)`; )} <b>|</b> Rozkaz otrzymałem, maszynista: (potwierdzić otrzymanie rozkazu)`;
}, }
}, }
}); });
+11 -12
View File
@@ -5,7 +5,7 @@ import { LocalStorageOrder } from '../types/orderTypes';
export default defineComponent({ export default defineComponent({
setup() { setup() {
return { return {
store: useStore(), store: useStore()
}; };
}, },
@@ -23,12 +23,12 @@ export default defineComponent({
}, },
saveLocalOrder() { saveLocalOrder() {
let orderObj: LocalStorageOrder = { const orderObj: LocalStorageOrder = {
id: '', id: '',
orderType: this.store.chosenOrderType, orderType: this.store.chosenOrderType,
orderBody: this.store[this.store.chosenOrderType], orderBody: this.store[this.store.chosenOrderType],
orderFooter: this.store.orderFooter, orderFooter: this.store.orderFooter,
createdAt: Date.now(), createdAt: Date.now()
}; };
const headerInfo = orderObj['orderBody']['header']; const headerInfo = orderObj['orderBody']['header'];
@@ -64,12 +64,12 @@ export default defineComponent({
if (!localOrder) return -1; if (!localOrder) return -1;
let orderObj: LocalStorageOrder = { const orderObj: LocalStorageOrder = {
id: this.store.chosenLocalOrderId, id: this.store.chosenLocalOrderId,
orderType: this.store.chosenOrderType, orderType: this.store.chosenOrderType,
orderBody: this.store[this.store.chosenOrderType], orderBody: this.store[this.store.chosenOrderType],
orderFooter: this.store.orderFooter, orderFooter: this.store.orderFooter,
updatedAt: Date.now(), updatedAt: Date.now()
}; };
window.localStorage.setItem(this.store.chosenLocalOrderId, JSON.stringify(orderObj)); window.localStorage.setItem(this.store.chosenLocalOrderId, JSON.stringify(orderObj));
@@ -98,8 +98,8 @@ export default defineComponent({
case 'orderN': case 'orderN':
case 'orderS': case 'orderS':
storeOrderObj = this.store[order.orderType]; storeOrderObj = this.store[order.orderType];
for (let orderKey in storeOrderObj) { for (const orderKey in storeOrderObj) {
for (let propKey in (storeOrderObj as any)[orderKey]) { for (const propKey in (storeOrderObj as any)[orderKey]) {
(storeOrderObj as any)[orderKey][propKey] = localOrderBody[orderKey][propKey]; (storeOrderObj as any)[orderKey][propKey] = localOrderBody[orderKey][propKey];
} }
} }
@@ -116,7 +116,7 @@ export default defineComponent({
for (let i = 0; i < storeOrderObj['orderList'].length; i++) { for (let i = 0; i < storeOrderObj['orderList'].length; i++) {
const orderItem = storeOrderObj['orderList'][i]; const orderItem = storeOrderObj['orderList'][i];
for (let prop in orderItem) { for (const prop in orderItem) {
(storeOrderObj['orderList'][i] as any)[prop] = localOrderBody['orderList'][i][prop]; (storeOrderObj['orderList'][i] as any)[prop] = localOrderBody['orderList'][i][prop];
} }
} }
@@ -124,12 +124,11 @@ export default defineComponent({
break; break;
} }
for (let key in this.store.orderFooter) { for (const key in this.store.orderFooter) {
(this.store.orderFooter as any)[key] = localOrderFooter[key]; (this.store.orderFooter as any)[key] = localOrderFooter[key];
} }
this.store.orderMode = 'OrderMessage'; this.store.orderMode = 'OrderMessage';
}, }
}, }
}); });
+3 -6
View File
@@ -4,7 +4,7 @@ import { useStore } from '../store/store';
export default defineComponent({ export default defineComponent({
setup() { setup() {
return { return {
store: useStore(), store: useStore()
}; };
}, },
@@ -27,9 +27,6 @@ export default defineComponent({
fieldsToCorrect.push('dyżurny ruchu (lub z polecenia dyżurnego ruchu)'); fieldsToCorrect.push('dyżurny ruchu (lub z polecenia dyżurnego ruchu)');
return fieldsToCorrect; return fieldsToCorrect;
}, }
}, }
}); });
+6 -6
View File
@@ -1,17 +1,17 @@
import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router' import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router';
import Home from '../views/Home.vue' import Home from '../views/Home.vue';
const routes: Array<RouteRecordRaw> = [ const routes: Array<RouteRecordRaw> = [
{ {
path: '/', path: '/',
name: 'Home', name: 'Home',
component: Home component: Home
}, }
] ];
const router = createRouter({ const router = createRouter({
history: createWebHistory(), history: createWebHistory(),
routes routes
}) });
export default router export default router;
+32 -31
View File
@@ -1,6 +1,10 @@
import { defineStore } from 'pinia'; import { defineStore } from 'pinia';
import { IOrderN, IOrderO, IOrderS, TOrder } from '../types/orderTypes'; import { IOrderN, IOrderO, IOrderS, TOrder } from '../types/orderTypes';
import { currentFormattedDate, currentFormattedHours, currentFormattedMinutes } from '../utils/dateUtils'; import {
currentFormattedDate,
currentFormattedHours,
currentFormattedMinutes
} from '../utils/dateUtils';
export const useStore = defineStore('store', { export const useStore = defineStore('store', {
state: () => { state: () => {
@@ -18,7 +22,7 @@ export const useStore = defineStore('store', {
hour: currentFormattedHours(), hour: currentFormattedHours(),
minutes: currentFormattedMinutes(), minutes: currentFormattedMinutes(),
dispatcherName: '', dispatcherName: '',
secondaryDispatcherName: '', secondaryDispatcherName: ''
}, },
orderMessage: '', orderMessage: '',
@@ -28,7 +32,7 @@ export const useStore = defineStore('store', {
header: { header: {
orderNo: '1', orderNo: '1',
trainNo: '', trainNo: '',
date: currentFormattedDate(), date: currentFormattedDate()
}, },
orderList: [ orderList: [
@@ -38,7 +42,7 @@ export const useStore = defineStore('store', {
to: '', to: '',
vmax: '', vmax: '',
jo: false, jo: false,
reason: '', reason: ''
}, },
{ {
name: '', name: '',
@@ -46,7 +50,7 @@ export const useStore = defineStore('store', {
to: '', to: '',
vmax: '', vmax: '',
jo: false, jo: false,
reason: '', reason: ''
}, },
{ {
name: '', name: '',
@@ -54,7 +58,7 @@ export const useStore = defineStore('store', {
to: '', to: '',
vmax: '', vmax: '',
jo: false, jo: false,
reason: '', reason: ''
}, },
{ {
name: '', name: '',
@@ -62,7 +66,7 @@ export const useStore = defineStore('store', {
to: '', to: '',
vmax: '', vmax: '',
jo: false, jo: false,
reason: '', reason: ''
}, },
{ {
name: '', name: '',
@@ -70,17 +74,17 @@ export const useStore = defineStore('store', {
to: '', to: '',
vmax: '', vmax: '',
jo: false, jo: false,
reason: '', reason: ''
}, }
], ],
other: '', other: ''
} as IOrderO, } as IOrderO,
orderN: { orderN: {
header: { header: {
orderNo: '1', orderNo: '1',
trainNo: '', trainNo: '',
date: currentFormattedDate(), date: currentFormattedDate()
}, },
rows: [ rows: [
@@ -89,7 +93,7 @@ export const useStore = defineStore('store', {
from: '', from: '',
to: '', to: '',
trackNo: '', trackNo: '',
trackNo2: '', trackNo2: ''
}, },
{ {
enabled: false, enabled: false,
@@ -105,7 +109,7 @@ export const useStore = defineStore('store', {
direction2: '', direction2: '',
trackNoFrom: '', trackNoFrom: '',
trackNoTo1: '', trackNoTo1: '',
trackNoTo2: '', trackNoTo2: ''
}, },
{ {
enabled: false, enabled: false,
@@ -116,7 +120,7 @@ export const useStore = defineStore('store', {
toKilometer: '', toKilometer: '',
trackNo: '', trackNo: '',
untilHour: '', untilHour: '',
untilMin: '', untilMin: ''
}, },
{ {
enabled: false, enabled: false,
@@ -124,7 +128,7 @@ export const useStore = defineStore('store', {
optionStation: 'stację', optionStation: 'stację',
stationName: '', stationName: '',
checkbox: 'checkbox-4a', checkbox: 'checkbox-4a',
side: 'lewej', side: 'lewej'
}, },
{ {
enabled: false, enabled: false,
@@ -132,9 +136,9 @@ export const useStore = defineStore('store', {
direction: '', direction: '',
stationType: 'stację', stationType: 'stację',
stationName: '', stationName: '',
on: '', on: ''
}, }
], ]
} as IOrderN, } as IOrderN,
orderS: { orderS: {
@@ -142,7 +146,7 @@ export const useStore = defineStore('store', {
orderNo: '1', orderNo: '1',
trainNo: '', trainNo: '',
for: 'pociągu', for: 'pociągu',
date: currentFormattedDate(), date: currentFormattedDate()
}, },
rows: [ rows: [
@@ -152,7 +156,7 @@ export const useStore = defineStore('store', {
optionSignal: 'wyjazdowego', optionSignal: 'wyjazdowego',
radio1: 'radio-1a-1', radio1: 'radio-1a-1',
signal1: '', signal1: '',
trackNo: '', trackNo: ''
}, },
{ {
@@ -161,7 +165,7 @@ export const useStore = defineStore('store', {
signal1: '', signal1: '',
signal2: '', signal2: '',
signal3: '', signal3: '',
trackNo: '', trackNo: ''
}, },
{ {
@@ -171,7 +175,7 @@ export const useStore = defineStore('store', {
trackNo: '', trackNo: '',
trainNo: '', trainNo: '',
arrivedTo: '', arrivedTo: '',
hour: '', hour: ''
}, },
{ {
@@ -184,14 +188,11 @@ export const useStore = defineStore('store', {
tmName: '', tmName: '',
maxKm: '', maxKm: '',
returnWay: 'sygnał ręczny "Do mnie"', returnWay: 'sygnał ręczny "Do mnie"',
trackNo: '', trackNo: ''
}, }
}, }
], ]
} as IOrderS, } as IOrderS
}; };
}, }
}); });
-1
View File
@@ -10,4 +10,3 @@
transform: translateY(100%); transform: translateY(100%);
} }
} }
-1
View File
@@ -195,4 +195,3 @@ label.g-checkbox {
} }
} }
} }
+41 -53
View File
@@ -1,11 +1,13 @@
export declare module ApiSWDR { export declare module API {
export interface IStationsOnline { export namespace ActiveData {
success: boolean; export interface Response {
respCode: number; activeSceneries?: API.ActiveSceneries.Response;
message: IStationsOnlineMessage[]; trains?: API.ActiveTrains.Response;
}
} }
export interface IStationsOnlineMessage { export namespace ActiveSceneries {
export interface Data {
dispatcherId: number; dispatcherId: number;
dispatcherName: string; dispatcherName: string;
dispatcherIsSupporter: boolean; dispatcherIsSupporter: boolean;
@@ -15,93 +17,66 @@ export declare module ApiSWDR {
maxUsers: number; maxUsers: number;
currentUsers: number; currentUsers: number;
spawn: number; spawn: number;
lastSeen: any; lastSeen: number;
dispatcherExp: number; dispatcherExp: number;
nameFromHeader: string; nameFromHeader: string;
spawnString: string; spawnString: string | null;
networkConnectionString: string; networkConnectionString: string;
isOnline: number; isOnline: number;
dispatcherRate: number; dispatcherRate: number;
dispatcherStatus: number;
} }
// export interface ITrainsOnline { export type Response = Data[];
// success: boolean;
// respCode: number;
// message: ITrainsOnlineMessage[];
// }
// export interface ITrainsOnlineMessage {
// trainNo: number;
// driverId: number;
// driverName: string;
// driverIsSupporter: boolean;
// dataSignal: string;
// dataSceneryConnection: string;
// dataDistance: number;
// dataCon: string;
// dataSpeed: number;
// dataMass: number;
// dataLength: number;
// region: string;
// isOnline: number;
// lastSeen: number;
// station?: ISceneryData;
// }
} }
export declare module ApiStacjownik { export namespace ActiveTrains {
export interface IActiveTrain { export type Response = Data[];
export interface Data {
trainNo: number; trainNo: number;
mass: number; mass: number;
length: number; length: number;
speed: number; speed: number;
stockString: string;
signal: string; signal: string;
distance: number; distance: number;
connectedTrack: string; connectedTrack: string;
stockString: string;
driverName: string; driverName: string;
driverId: number; driverId: number;
driverIsSupporter: boolean; driverIsSupporter: boolean;
driverLevel?: number;
currentStationName: string; currentStationName: string;
currentStationHash?: string; currentStationHash?: string;
online: boolean; online: number;
lastSeen: number; lastSeen: number;
region: string; region: string;
timetable?: {
timetableId: number;
category: string;
route: string;
stopList: IActiveTrainStop[];
TWR: boolean;
SKR: boolean;
sceneries: string[];
};
isTimeout: boolean; isTimeout: boolean;
timetable?: Timetable;
} }
export interface IActiveTrainStop { export interface TimetableStop {
stopName: string; stopName: string;
stopNameRAW: string; stopNameRAW: string;
stopType: string; stopType: string;
stopDistance: number; stopDistance: number;
pointId: number; pointId: string;
mainStop: boolean; mainStop: boolean;
arrivalLine: string; arrivalLine: string | null;
arrivalTimestamp: number; arrivalTimestamp: number;
arrivalRealTimestamp: number; arrivalRealTimestamp: number;
arrivalDelay: number; arrivalDelay: number;
departureLine: string; departureLine: string | null;
departureTimestamp: number; departureTimestamp: number;
departureRealTimestamp: number; departureRealTimestamp: number;
departureDelay: number; departureDelay: number;
@@ -110,8 +85,21 @@ export declare module ApiStacjownik {
beginsHere: boolean; beginsHere: boolean;
terminatesHere: boolean; terminatesHere: boolean;
confirmed: boolean; confirmed: number;
stopped: boolean; stopped: number;
stopTime: number; stopTime: number | null;
}
export interface Timetable {
timetableId: number;
category: string;
route: string;
stopList: TimetableStop[];
TWR: boolean;
SKR: boolean;
sceneries: string[];
}
} }
} }
-2
View File
@@ -50,5 +50,3 @@ export interface ISceneryData {
// lastSeen: number; // lastSeen: number;
// station?: ISceneryData; // station?: ISceneryData;
// } // }
-2
View File
@@ -173,5 +173,3 @@ export interface IOrderO {
other: string; other: string;
} }
+7 -2
View File
@@ -1,5 +1,11 @@
export function currentFormattedDate() { export function currentFormattedDate() {
return new Date().toLocaleDateString('pl-PL', { day: 'numeric', month: 'numeric', year: 'numeric' }) + 'r.'; return (
new Date().toLocaleDateString('pl-PL', {
day: 'numeric',
month: 'numeric',
year: 'numeric'
}) + 'r.'
);
} }
export function currentFormattedMinutes() { export function currentFormattedMinutes() {
@@ -10,4 +16,3 @@ export function currentFormattedMinutes() {
export function currentFormattedHours() { export function currentFormattedHours() {
return new Date().toLocaleTimeString('pl-PL', { hour: '2-digit' }); return new Date().toLocaleTimeString('pl-PL', { hour: '2-digit' });
} }
+10 -11
View File
@@ -10,7 +10,7 @@
<div class="message_container"> <div class="message_container">
<div class="message_nav"> <div class="message_nav">
<span v-for="(action, i) in navActions"> <span v-for="(action, i) in navActions" :key="action.mode">
<b v-if="i > 0">&bull;</b> <b v-if="i > 0">&bull;</b>
<button <button
@@ -51,29 +51,29 @@ export default defineComponent({
navActions: [ navActions: [
{ {
mode: 'OrderMessage', mode: 'OrderMessage',
value: 'TREŚĆ ROZKAZU', value: 'TREŚĆ ROZKAZU'
}, },
{ {
mode: 'OrderList', mode: 'OrderList',
value: 'ZAPISANE ROZKAZY', value: 'ZAPISANE ROZKAZY'
}, },
{ {
mode: 'OrderTrainPicker', mode: 'OrderTrainPicker',
value: 'POCIĄGI', value: 'POCIĄGI'
}, }
], ]
}; };
}, },
methods: { methods: {
selectOrderMode(mode: string) { selectOrderMode(mode: string) {
this.store.orderMode = mode; this.store.orderMode = mode;
}, }
}, },
setup() { setup() {
return { return {
store: useStore(), store: useStore()
}; };
}, },
@@ -89,8 +89,8 @@ export default defineComponent({
default: default:
return OrderMessage; return OrderMessage;
} }
}, }
}, }
}); });
</script> </script>
@@ -152,4 +152,3 @@ export default defineComponent({
} }
} }
</style> </style>
+3 -3
View File
@@ -1,7 +1,7 @@
/// <reference types="vite/client" /> /// <reference types="vite/client" />
declare module '*.vue' { declare module '*.vue' {
import type { DefineComponent } from 'vue' import type { DefineComponent } from 'vue';
const component: DefineComponent<{}, {}, any> const component: DefineComponent<{}, {}, any>;
export default component export default component;
} }
+2124 -1140
View File
File diff suppressed because it is too large Load Diff