bump to 1.7.4; added new categories to number gen & showing rules

This commit is contained in:
2024-02-03 16:15:22 +01:00
parent 2158145ae8
commit 5ff6c0504e
7 changed files with 276 additions and 158 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "pojazdownik", "name": "pojazdownik",
"version": "1.7.3", "version": "1.7.4",
"private": true, "private": true,
"scripts": { "scripts": {
"dev": "vite", "dev": "vite",
+147 -87
View File
@@ -1,77 +1,102 @@
<template> <template>
<div class="number-generator tab"> <div class="number-generator tab">
<div class="tab_header"> <div class="tab_header">
<h2>{{ $t("numgen.title") }}</h2> <h2>{{ $t('numgen.title') }}</h2>
<h3>{{ $t('numgen.subtitle') }}</h3>
</div> </div>
<div class="tab_content"> <div class="tab_content">
<div class="options"> <div class="category-select">
<select v-model="chosenCategory" @change="randomizeTrainNumber()"> <label for="category"> {{ $t('numgen.train-category') }}</label>
<select id="category" v-model="chosenCategory" @change="randomizeTrainNumber()">
<option :value="null" disabled> <option :value="null" disabled>
{{ $t("numgen.train-category") }} {{ $t('numgen.train-category') }}
</option> </option>
<option <option v-for="(_, category) in genData.categoriesRules" :key="category" :value="category">
v-for="(_, category) in genData.categories"
:key="category"
:value="category"
>
{{ $t(`numgen.categories.${category}`) }} {{ $t(`numgen.categories.${category}`) }}
</option> </option>
</select> </select>
</div>
<select v-model="beginRegionName" @change="randomizeTrainNumber()"> <div class="regions-select">
<div>
<label for="begin-region"> {{ $t('numgen.start-region') }}</label>
<select id="begin-region" v-model="beginRegionName" @change="randomizeTrainNumber()">
<option :value="null" disabled> <option :value="null" disabled>
{{ $t("numgen.start-region") }} {{ $t('numgen.start-region') }}
</option> </option>
<option <option v-for="(_, name) in genData.regionNumbers" :key="name" :value="name">
v-for="(_, name) in genData.regionNumbers"
:key="name"
:value="name"
>
{{ name }} {{ name }}
</option> </option>
</select> </select>
</div>
<select v-model="endRegionName" @change="randomizeTrainNumber()"> <div>
<option :value="null" disabled>{{ $t("numgen.end-region") }}</option> <label for="end-region"> {{ $t('numgen.end-region') }}</label>
<option <select id="end-region" v-model="endRegionName" @change="randomizeTrainNumber()">
v-for="(_, name) in genData.regionNumbers" <option :value="null" disabled>{{ $t('numgen.end-region') }}</option>
:key="name" <option v-for="(_, name) in genData.regionNumbers" :key="name" :value="name">
:value="name"
>
{{ name }} {{ name }}
</option> </option>
</select> </select>
</div> </div>
</div>
<div class="generated-number" @click="copyNumber"> <div class="generated-number" @click="copyNumber">
<span v-if="trainNumber"> <span v-if="trainNumber">
{{ $t("numgen.number-info") }} {{ $t('numgen.number-info') }}
<b class="text--accent">{{ trainNumber }}</b> <b class="text--accent">{{ trainNumber }}</b>
</span> </span>
<span v-else>{{ $t("numgen.warning") }}</span> <span v-else>{{ $t('numgen.warning') }}</span>
</div> </div>
<!-- <div v-if="chosenCategory"> <div class="category-rules" v-if="chosenCategory && categoryRules && trainNumber">
Current numbering rules: {{ $t(`numgen.rules.${chosenCategory}`) }}; <!-- First & second digit (the same regions) -->
<div v-if="beginRegionName && endRegionName && beginRegionName == endRegionName">
<b>Dwie pierwsze cyfry:</b> z puli
<b class="text--accent">{{ genData.sameRegions[beginRegionName].join(', ') }}</b>
dla obszaru {{ beginRegionName }}
</div>
<span v-if="beginRegionName && endRegionName"> <!-- First & second digit (different regions) -->
<span v-if="beginRegionName == endRegionName"> <div v-else>
pierwsze dwie cyfry: <div>
{{ genData.sameRegions[beginRegionName].join(', ') }} <b>
(numer w obrębie obszaru {{ beginRegionName }}) Pierwsza cyfra: <span class="text--accent">{{ trainNumber[0] }}</span>
</span> </b>
<span v-if="beginRegionName"> dla początkowego obszaru konstrukcyjnego {{ beginRegionName }}</span>
<span v-else>wybierz początkowy obszar konstrukcyjny</span>
</div>
<span v-else> <div>
pierwsza cyfra: {{ genData.regionNumbers[beginRegionName] }}; druga cyfra: <b>
{{ genData.regionNumbers[endRegionName] }} Druga cyfra: <span class="text--accent">{{ trainNumber[1] }}</span>
</span> </b>
</span> <span v-if="endRegionName"> dla końcowego obszaru konstrukcyjnego {{ endRegionName }}</span>
</div> --> <span v-else>wybierz początkowy obszar konstrukcyjny</span>
</div>
</div>
<!-- Third digit (non-passenger only) -->
<div v-if="categoryRules[0] != null">
<b>
Trzecia cyfra: <span class="text--accent">{{ categoryRules[0] }}</span>
</b>
dla kategorii {{ chosenCategory }}
</div>
<div>
<b> {{ categoryRules[1]?.length == 3 ? 'Trzy' : 'Dwie' }} ostatnie cyfry:</b>
z przedziału
<b class="text--accent">{{ categoryRules[1] }}-{{ categoryRules[2] }}</b>
</div>
</div>
<hr />
<div class="tab_links"> <div class="tab_links">
<a :href="$t('numgen.td2-wiki-link')" target="_blank"> <a :href="$t('numgen.td2-wiki-link')" target="_blank">
{{ $t("numgen.td2-wiki") }} {{ $t('numgen.td2-wiki') }}
</a> </a>
</div> </div>
@@ -79,10 +104,13 @@
<div class="tab_actions"> <div class="tab_actions">
<button class="btn" @click="randomizeTrainNumber(true)"> <button class="btn" @click="randomizeTrainNumber(true)">
{{ $t("numgen.action-random-region") }} {{ $t('numgen.action-random-region') }}
</button> </button>
<button class="btn" @click="randomizeTrainNumber(true)">LOSUJ KATEGORIĘ</button>
<button class="btn" @click="randomizeTrainNumber(false)"> <button class="btn" @click="randomizeTrainNumber(false)">
{{ $t("numgen.action-random-number") }} {{ $t('numgen.action-random-number') }}
</button> </button>
</div> </div>
</div> </div>
@@ -90,14 +118,15 @@
</template> </template>
<script setup lang="ts"> <script setup lang="ts">
import { Ref, ref } from "vue"; import { Ref, ref } from 'vue';
import { useI18n } from "vue-i18n"; import { useI18n } from 'vue-i18n';
import genData from "../../constants/numberGeneratorData.json"; import genData from '../../constants/numberGeneratorData.json';
import { computed } from 'vue';
const i18n = useI18n(); const i18n = useI18n();
type RegionName = keyof typeof genData.regionNumbers; type RegionName = keyof typeof genData.regionNumbers;
type Category = keyof typeof genData.categories; type Category = keyof typeof genData.categoriesRules;
const beginRegionName = ref(null) as Ref<RegionName | null>; const beginRegionName = ref(null) as Ref<RegionName | null>;
const endRegionName = ref(null) as Ref<RegionName | null>; const endRegionName = ref(null) as Ref<RegionName | null>;
@@ -108,31 +137,31 @@ const trainNumber = ref(null) as Ref<string | null>;
const copyNumber = () => { const copyNumber = () => {
if (trainNumber.value) { if (trainNumber.value) {
navigator.clipboard.writeText(trainNumber.value); navigator.clipboard.writeText(trainNumber.value);
alert(i18n.t("numgen.alert")); alert(i18n.t('numgen.alert'));
} }
}; };
const categoryRules = computed(() => {
if (!chosenCategory.value) return null;
return genData.categoriesRules[chosenCategory.value];
});
const randomizeTrainNumber = (randomizeRegions = false) => { const randomizeTrainNumber = (randomizeRegions = false) => {
// if (categoryRules.value == null) return; // if (categoryRules.value == null) return;
const regionKeys = Object.keys(genData.regionNumbers); const regionKeys = Object.keys(genData.regionNumbers);
if (beginRegionName.value == null || randomizeRegions) if (beginRegionName.value == null || randomizeRegions) beginRegionName.value = regionKeys[(regionKeys.length * Math.random()) << 0] as RegionName;
beginRegionName.value = regionKeys[
(regionKeys.length * Math.random()) << 0
] as RegionName;
if (endRegionName.value == null || randomizeRegions) if (endRegionName.value == null || randomizeRegions) endRegionName.value = regionKeys[(regionKeys.length * Math.random()) << 0] as RegionName;
endRegionName.value = regionKeys[
(regionKeys.length * Math.random()) << 0
] as RegionName;
let number = ""; let number = '';
// Two first numbers (begin & end regions)
if (beginRegionName.value == endRegionName.value) { if (beginRegionName.value == endRegionName.value) {
const sameRegionsNumbers = genData.sameRegions[beginRegionName.value!]; const sameRegionsNumbers = genData.sameRegions[beginRegionName.value!];
const randRegionNumber = const randRegionNumber = sameRegionsNumbers[Math.floor(Math.random() * sameRegionsNumbers.length)];
sameRegionsNumbers[Math.floor(Math.random() * sameRegionsNumbers.length)];
number += randRegionNumber.toString(); number += randRegionNumber.toString();
} else { } else {
const beginRegionNumber = genData.regionNumbers[beginRegionName.value!]; const beginRegionNumber = genData.regionNumbers[beginRegionName.value!];
@@ -147,49 +176,63 @@ const randomizeTrainNumber = (randomizeRegions = false) => {
return; return;
} }
if (chosenCategory.value == null) chosenCategory.value = "EI"; // Choose default category if it's not chosen
if (chosenCategory.value == null) chosenCategory.value = 'EI';
const rulesArray = genData.categories[chosenCategory.value] // Get category rules
.split(";") const [thirdNumber, minRange, maxRange] = categoryRules.value!;
.map((r) => ({
index: r.split(":")[0],
rule: r.split(":")[1],
nums: Number(r.split(":")[2] || "1"),
}));
rulesArray.forEach((r) => { // Third number
const range = r.rule.split("-"); number += thirdNumber ?? '';
if (range.length == 1) number += r.rule; // Remaining numbers
else { const rangeNums = minRange!.length;
const [minRange, maxRange] = range; const randRange = Math.floor(Math.random() * (Number(maxRange) - Number(minRange)) + Number(minRange)).toString();
const randRange = Math.floor( const leadingZeros = new Array(Math.abs(randRange.length - rangeNums)).fill('0').join('');
Math.random() * (Number(maxRange) - Number(minRange)) +
Number(minRange),
).toString();
number += number += `${leadingZeros}${randRange}`;
new Array(Math.abs(randRange.length - r.nums)).fill("0").join("") +
randRange;
}
});
trainNumber.value = number; trainNumber.value = number;
}; };
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
@import "../../styles/tab.scss"; @import '../../styles/tab.scss';
@import "../../styles/global.scss"; @import '../../styles/global.scss';
.options { label {
display: grid; display: block;
grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); font-weight: bold;
margin-bottom: 0.5em;
}
.category-select {
select {
width: auto;
min-width: 50%;
}
margin-bottom: 1em;
}
.regions-select {
display: flex;
align-items: center;
justify-content: center;
gap: 0.5em; gap: 0.5em;
div {
width: 100%;
}
select { select {
width: 100%; width: 100%;
} }
label {
display: block;
margin-bottom: 0.5em;
}
} }
.generated-number { .generated-number {
@@ -204,14 +247,19 @@ const randomizeTrainNumber = (randomizeRegions = false) => {
background-color: $secondaryColor; background-color: $secondaryColor;
} }
.category-rules {
margin-bottom: 0.5em;
}
.tab_actions { .tab_actions {
grid-template-columns: 1fr 1fr; grid-template-columns: repeat(3, 1fr);
margin: 0.5em 0; margin: 0.5em 0;
} }
.tab_links { .tab_links {
display: flex; display: flex;
justify-content: flex-end; justify-content: flex-end;
margin: 0.25em 0;
} }
@media screen and (max-width: $breakpointMd) { @media screen and (max-width: $breakpointMd) {
@@ -221,8 +269,20 @@ const randomizeTrainNumber = (randomizeRegions = false) => {
} }
@media screen and (max-width: $breakpointSm) { @media screen and (max-width: $breakpointSm) {
.options select { .regions-select {
flex-wrap: wrap;
}
.regions-select select {
width: 100%; width: 100%;
} }
.category-select select {
min-width: 100%;
}
.category-rules {
text-align: center;
}
} }
</style> </style>
+1 -1
View File
@@ -470,7 +470,7 @@ export default defineComponent({
ul { ul {
position: relative; position: relative;
overflow: auto; overflow: auto;
height: 550px; max-height: 500px;
} }
ul > li { ul > li {
+50 -28
View File
@@ -1,37 +1,59 @@
{ {
"regionNumbers": { "regionNumbers": {
"Warszawa": 1, "Warszawa (1)": 1,
"Lublin": 2, "Lublin (2)": 2,
"Kraków": 3, "Kraków (3)": 3,
"Sosnowiec": 4, "Sosnowiec (4)": 4,
"Gdańsk": 5, "Gdańsk (5)": 5,
"Wrocław": 6, "Wrocław (6)": 6,
"Poznań": 7, "Poznań (7)": 7,
"Szczecin": 8, "Szczecin (8)": 8,
"Rezerwa": 9 "Rezerwa (9)": 9
}, },
"sameRegions": { "sameRegions": {
"Losowy": [ "Losowy": [
10, 11, 19, 91, 93, 97, 99, 20, 22, 29, 30, 33, 39, 40, 44, 49, 94, 50, 10, 11, 19, 91, 93, 97, 99, 20, 22, 29, 30, 33, 39, 40, 44, 49, 94, 50, 55, 59, 90, 95, 96, 66, 60, 69, 77, 70, 79, 88, 80, 89, 92, 98
55, 59, 90, 95, 96, 66, 60, 69, 77, 70, 79, 88, 80, 89, 92, 98
], ],
"Warszawa": [10, 11, 19, 91, 93, 97, 99], "Warszawa (1)": [10, 11, 19, 91, 93, 97, 99],
"Lublin": [20, 22, 29], "Lublin (2)": [20, 22, 29],
"Kraków": [30, 33, 39], "Kraków (3)": [30, 33, 39],
"Sosnowiec": [40, 44, 49, 94], "Sosnowiec (4)": [40, 44, 49, 94],
"Gdańsk": [50, 55, 59, 90, 95, 96], "Gdańsk (5)": [50, 55, 59, 90, 95, 96],
"Wrocław": [66, 60, 69], "Wrocław (6)": [66, 60, 69],
"Poznań": [77, 70, 79], "Poznań (7)": [77, 70, 79],
"Szczecin": [88, 80], "Szczecin (8)": [88, 80],
"Rezerwa": [89, 92, 98] "Rezerwa (9)": [89, 92, 98]
}, },
"categories": { "categoriesRules": {
"EI": "2:00-99:2", "EI": [null, "00", "99"],
"MP/RP": "2:050-169:3", "EC": [null, "001", "049"],
"RO": "2:200-999:3", "EN": [null, "001", "049"],
"PW": "2:6;3:0-899:3",
"TM": "2:4;3:0-899:3", "RO": [null, "200", "999"],
"TK": "2:3;3:0-899:3", "RP": [null, "050", "169"],
"LT": "2:5;3:0-899:3" "RM": [null, "200", "999"],
"RA": [null, "200", "999"],
"MO": [null, "200", "999"],
"MP": [null, "050", "169"],
"MM": [null, "001", "049"],
"MH": [null, "170", "199"],
"PW": ["6", "000", "899"],
"PX": ["6", "000", "899"],
"TC": ["0", "000", "899"],
"TG": ["1", "000", "899"],
"TR": ["1", "000", "899"],
"TD": ["2", "000", "899"],
"TK": ["3", "000", "899"],
"TN": ["3", "000", "899"],
"TM": ["4", "000", "899"],
"TS": ["5", "000", "999"],
"LT": ["5", "000", "899"],
"LP": ["6", "000", "899"],
"ZN": ["9", "000", "899"]
} }
} }
+31 -16
View File
@@ -92,6 +92,7 @@
}, },
"numgen": { "numgen": {
"title": "TRAIN NUMBER GENERATOR", "title": "TRAIN NUMBER GENERATOR",
"subtitle": "Generates real train number based on Polish railway instruction Ir-11",
"alert": "The number has been copied to your clipboard!", "alert": "The number has been copied to your clipboard!",
"start-region": "Beginning construction region", "start-region": "Beginning construction region",
"end-region": "Terminating construction region", "end-region": "Terminating construction region",
@@ -103,22 +104,36 @@
"action-random-region": "DRAW REGIONS", "action-random-region": "DRAW REGIONS",
"action-random-number": "DRAW A NUMBER", "action-random-number": "DRAW A NUMBER",
"categories": { "categories": {
"EI": "domestic express (EI)", "EI": "EI - domestic express",
"MP/RP": "(inter)voivodeship bullet (MP/RP)", "EC": "EC - international express",
"RO": "regional passenger (RO)", "EN": "EN - domestic night express",
"PW": "empty passenger (PW)",
"TM": "mass transport freight (TM)", "MP": "MP - intervoivodeship bullet",
"TK": "non-mass transport freight (TK)", "RP": "RP - voivodeship bullet",
"LT": "locomotive alone (LT)" "MO": "MO - intervoivodeship regio",
}, "RO": "RO - voivodeship regio",
"rules": {
"EI": "4 digits - ends within the range of 00-99", "MM": "MM - international bullet",
"MP/RP": "5 digits - ends within the range of 050-169", "MH": "MH - intervoivodeship bullet (night / )",
"RO": "5 digits - ends within the range of 200-999", "RM": "RM - voivodeship osobowy international",
"PW": "6 digits - '6' on the 3rd place; ends within the range of 000-899", "RA": "RA - voivodeship osobowy algomeracyjny",
"TM": "6 digits - '4' on the 3rd place; ends within the range of 000-899",
"TK": "6 digits - '3' on the 3rd place; ends within the range of 000-899", "PW": "PW - empty passenger",
"LT": "6 digits - '5' on the 3rd place; ends within the range of 000-899" "PX": "PX - empty test drive",
"TC": "TC - international freight (intermodal)",
"TG": "TG - international freight (cargo)",
"TR": "TR - international freight (no cargo)",
"TD": "TD - domestic freight (intermodal)",
"TM": "TM - domestic freight (cargo)",
"TN": "TN - domestic freight (no cargo)",
"TK": "TK - freight (stations & sidings service)",
"TS": "TS - empty freight test drive",
"LT": "LT - freight locomotive only",
"LP": "LP - passenger locomotive only",
"ZN": "ZN - inspection / diagnostic"
} }
}, },
"wiki": { "wiki": {
+31 -16
View File
@@ -92,6 +92,7 @@
}, },
"numgen": { "numgen": {
"title": "GENERATOR NUMERU POCIĄGU", "title": "GENERATOR NUMERU POCIĄGU",
"subtitle": "Generuje realny numer pociągu na podstawie instrukcji Ir-11",
"alert": "Numer został skopiowany do twojego schowka!", "alert": "Numer został skopiowany do twojego schowka!",
"start-region": "Początkowy obszar konstrukcyjny", "start-region": "Początkowy obszar konstrukcyjny",
"end-region": "Końcowy obszar konstrukcyjny", "end-region": "Końcowy obszar konstrukcyjny",
@@ -103,22 +104,36 @@
"action-random-region": "LOSUJ OBSZARY", "action-random-region": "LOSUJ OBSZARY",
"action-random-number": "LOSUJ NUMER", "action-random-number": "LOSUJ NUMER",
"categories": { "categories": {
"EI": "ekspres krajowy (EI)", "EI": "EI - ekspres krajowy",
"MP/RP": "(między)wojewódzki pośpieszny (MP/RP)", "EC": "EC - ekspres międzynarodowy",
"RO": "wojewódzki osobowy (RO)", "EN": "EN - ekspres krajowy nocny",
"PW": "próżny \"służbowy\" (PW)",
"TM": "towarowy do przewozów masowych (TM)", "MP": "MP - międzywojewódzki pośpieszny",
"TK": "towarowy do obsługi stacji (TK)", "RP": "RP - wojewódzki pośpieszny",
"LT": "lokomotywa luzem (LT)" "MO": "MO - międzywojewódzki osobowy",
}, "RO": "RO - wojewódzki osobowy",
"rules": {
"EI": "4 cyfry - końcówka z przedziału 00-99", "MM": "MM - międzynarodowy pośpieszny",
"MP/RP": "5 cyfr - końcówka z przedziału 050-169", "MH": "MH - międzywoj. pośpieszny nocny / hotelowy",
"RO": "5 cyfr - końcówka z przedziału 200-999", "RM": "RM - wojewódzki osobowy międzynarodowy",
"PW": "6 cyfr - '6' na 3. miejscu; końcówka z przedziału 000-899", "RA": "RA - wojewódzki osobowy algomeracyjny",
"TM": "6 cyfr - '4' na 3. miejscu; końcówka z przedziału 000-899",
"TK": "6 cyfr - '3' na 3. miejscu; końcówka z przedziału 000-899", "PW": "PW - próżny \"służbowy\"",
"LT": "6 cyfr - '5' na 3. miejscu; końcówka z przedziału 000-899" "PX": "PX - próżny próbny",
"TC": "TC - towarowy międzynarodowy intermodalny",
"TG": "TG - towarowy międzynarodowy masowy",
"TR": "TR - towarowy międzynarodowy niemasowy",
"TD": "TD - towarowy krajowy intermodalny",
"TM": "TM - towarowy krajowy masowy",
"TN": "TN - towarowy krajowy niemasowy",
"TK": "TK - towarowy do obsługi stacji i bocznic",
"TS": "TS - próżny próbny skład towarowy",
"LT": "LT - lokomotywa towarowa luzem",
"LP": "LP -lokomotywa pasażerska luzem",
"ZN": "ZN - inspekcyjny / diagnostyczny"
} }
}, },
"wiki": { "wiki": {
+7 -1
View File
@@ -8,12 +8,18 @@
padding: 0.5em 1em; padding: 0.5em 1em;
background-color: $secondaryColor; background-color: $secondaryColor;
text-align: center;
h2 { h2 {
margin: 0; margin: 0;
color: white; color: white;
font-size: 1.35em; font-size: 1.35em;
text-align: center; }
h3 {
margin: 0.5em 0 0 0;
font-size: 1.15em;
color: #aaa;
} }
button { button {