diff --git a/src/assets/car-cargo-unknown.png b/src/assets/icon-car-cargo.png similarity index 100% rename from src/assets/car-cargo-unknown.png rename to src/assets/icon-car-cargo.png diff --git a/src/assets/car-passenger-unknown.png b/src/assets/icon-car-passenger.png similarity index 100% rename from src/assets/car-passenger-unknown.png rename to src/assets/icon-car-passenger.png diff --git a/src/assets/loco-e-unknown.png b/src/assets/icon-loco-e.png similarity index 100% rename from src/assets/loco-e-unknown.png rename to src/assets/icon-loco-e.png diff --git a/src/assets/loco-ezt-unknown.png b/src/assets/icon-loco-ezt.png similarity index 100% rename from src/assets/loco-ezt-unknown.png rename to src/assets/icon-loco-ezt.png diff --git a/src/assets/loco-s-unknown.png b/src/assets/icon-loco-s.png similarity index 100% rename from src/assets/loco-s-unknown.png rename to src/assets/icon-loco-s.png diff --git a/src/assets/icon-unknown.png b/src/assets/icon-unknown.png new file mode 100644 index 0000000..0a930b9 Binary files /dev/null and b/src/assets/icon-unknown.png differ diff --git a/src/components/Global/TrainThumbnail.vue b/src/components/Global/TrainThumbnail.vue new file mode 100644 index 0000000..86a9540 --- /dev/null +++ b/src/components/Global/TrainThumbnail.vue @@ -0,0 +1,61 @@ + + + + + diff --git a/src/components/JournalView/JournalTimetables/TimetableExtra.vue b/src/components/JournalView/JournalTimetables/TimetableExtra.vue index b59fac7..0e74000 100644 --- a/src/components/JournalView/JournalTimetables/TimetableExtra.vue +++ b/src/components/JournalView/JournalTimetables/TimetableExtra.vue @@ -60,11 +60,7 @@ ).split(';')" :key="i" > - +
{{ car.replace(/_/g, ' ').split(':')[0] }}
@@ -75,28 +71,25 @@ import { PropType, defineComponent } from 'vue'; import { TimetableHistory } from '../../../scripts/interfaces/api/TimetablesAPIData'; import imageMixin from '../../../mixins/imageMixin'; +import TrainThumbnail from '../../Global/TrainThumbnail.vue'; export default defineComponent({ mixins: [imageMixin], - props: { showExtraInfo: { type: Boolean, required: true, }, - timetable: { type: Object as PropType, required: true, }, }, - data() { return { currentHistoryIndex: 0, }; }, - computed: { stockHistory() { return this.timetable.stockHistory @@ -116,13 +109,13 @@ export default defineComponent({ }); }, }, - methods: { onImageError(e: Event) { const imageEl = e.target as HTMLImageElement; imageEl.src = this.getImage('unknown.png'); }, }, + components: { TrainThumbnail }, }); diff --git a/src/components/TrainsView/TrainInfo.vue b/src/components/TrainsView/TrainInfo.vue index 829c87f..ce6ce64 100644 --- a/src/components/TrainsView/TrainInfo.vue +++ b/src/components/TrainsView/TrainInfo.vue @@ -62,15 +62,13 @@
-
- Loco image not found -
+
{{ train.locoType }} - +  • {{ $t('trains.cars') }}: - {{ train.cars.length }} + {{ train.stockList.length }}
@@ -91,6 +89,7 @@ import styleMixin from '../../mixins/styleMixin'; import trainInfoMixin from '../../mixins/trainInfoMixin'; import Train from '../../scripts/interfaces/Train'; import ProgressBar from '../Global/ProgressBar.vue'; +import TrainThumbnail from '../Global/TrainThumbnail.vue'; export default defineComponent({ props: { @@ -104,7 +103,7 @@ export default defineComponent({ }, }, mixins: [trainInfoMixin, imageMixin, styleMixin], - components: { ProgressBar }, + components: { ProgressBar, TrainThumbnail }, }); @@ -127,7 +126,7 @@ export default defineComponent({ text-align: center; img { - margin: 0.5em 0; + margin: 0.5em auto; width: 12em; } } diff --git a/src/components/TrainsView/TrainSchedule.vue b/src/components/TrainsView/TrainSchedule.vue index a47a719..babb222 100644 --- a/src/components/TrainsView/TrainSchedule.vue +++ b/src/components/TrainsView/TrainSchedule.vue @@ -2,12 +2,12 @@
    -
  • + -
  • + -
  • - + -
    {{ car.replace(/_/g, ' ').split(':')[0] }}
    + +
    {{ stockName.replace(/_/g, ' ').split(':')[0] }}
@@ -91,9 +92,10 @@ import Train from '../../scripts/interfaces/Train'; import TrainStop from '../../scripts/interfaces/TrainStop'; import { useStore } from '../../store/store'; import StopDate from '../Global/StopDate.vue'; +import TrainThumbnail from '../Global/TrainThumbnail.vue'; export default defineComponent({ - components: { StopDate }, + components: { StopDate, TrainThumbnail }, props: { train: { type: Object as PropType, @@ -426,4 +428,3 @@ ul.stop_list > li.stop { } } - diff --git a/src/scripts/interfaces/Train.ts b/src/scripts/interfaces/Train.ts index b4e4dfb..f1a08f0 100644 --- a/src/scripts/interfaces/Train.ts +++ b/src/scripts/interfaces/Train.ts @@ -15,12 +15,11 @@ export default interface Train { driverLevel: number; currentStationName: string; currentStationHash: string; - locoURL: string; locoType: string; online: boolean; lastSeen: number; region: string; - cars: string[]; + stockList: string[]; isTimeout: boolean; isSupporter: boolean; diff --git a/src/scripts/interfaces/api/StationAPIData.ts b/src/scripts/interfaces/api/StationAPIData.ts index 464eebf..6ddabe9 100644 --- a/src/scripts/interfaces/api/StationAPIData.ts +++ b/src/scripts/interfaces/api/StationAPIData.ts @@ -11,7 +11,7 @@ export default interface StationAPIData { lastSeen: number; dispatcherExp: number; nameFromHeader: string; - spawnString: string; + spawnString: string | null; networkConnectionString: string; isOnline: number; dispatcherRate: number; diff --git a/src/scripts/interfaces/github_api/StockInfoGithubData.ts b/src/scripts/interfaces/github_api/StockInfoGithubData.ts new file mode 100644 index 0000000..f30602f --- /dev/null +++ b/src/scripts/interfaces/github_api/StockInfoGithubData.ts @@ -0,0 +1,13 @@ +export interface RollingStockGithubData { + usage: Record; + info: RollingStockInfo; +} + +export interface RollingStockInfo { + 'loco-e': [string, string, string, string, boolean][]; + 'loco-s': [string, string, string, string, boolean][]; + 'loco-szt': [string, string, string, string, boolean][]; + 'loco-ezt': [string, string, string, string, boolean][]; + 'car-passenger': [string, string, boolean, boolean, string][]; + 'car-cargo': [string, string, boolean, boolean, string][]; +} diff --git a/src/scripts/interfaces/store/storeTypes.ts b/src/scripts/interfaces/store/storeTypes.ts index 4a49ed4..61cbe85 100644 --- a/src/scripts/interfaces/store/storeTypes.ts +++ b/src/scripts/interfaces/store/storeTypes.ts @@ -6,7 +6,7 @@ import Station from '../Station'; import Train from '../Train'; import { DispatcherStatsAPIData } from '../api/DispatcherStatsAPIData'; import { DriverStatsAPIData } from '../api/DriverStatsAPIData'; -import { Ref } from 'vue'; +import { RollingStockGithubData } from '../github_api/StockInfoGithubData'; export type Availability = 'default' | 'unavailable' | 'nonPublic' | 'abandoned' | 'nonDefault'; @@ -14,6 +14,7 @@ export interface StoreState { stationList: Station[]; trainList: Train[]; apiData: APIData; + rollingStockData?: RollingStockGithubData; lastDispatcherStatuses: { hash: string; statusTimestamp: number; statusID: string }[]; diff --git a/src/scripts/utils/apiURLs.ts b/src/scripts/utils/apiURLs.ts index 1211a68..35d88c9 100644 --- a/src/scripts/utils/apiURLs.ts +++ b/src/scripts/utils/apiURLs.ts @@ -1,6 +1,6 @@ export const URLs = { stacjownikAPI: - import.meta.env.VITE_APP_API_DEV == 1 && !import.meta.env.PROD + import.meta.env.VITE_APP_API_DEV === "1" && !import.meta.env.PROD ? 'http://localhost:3001' : 'https://stacjownik.spythere.pl', stacjownikAPIDev: 'localhost:3000', diff --git a/src/store/journalFiltersStore.ts b/src/store/journalFiltersStore.ts deleted file mode 100644 index 0a7e033..0000000 --- a/src/store/journalFiltersStore.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { defineStore } from 'pinia'; - -export const useJournalFiltersStore = defineStore('journalFiltersStore', { - state: () => ({ - timetableFilters: { - - }, - }), -}); diff --git a/src/store/store.ts b/src/store/store.ts index e723ccb..a67375b 100644 --- a/src/store/store.ts +++ b/src/store/store.ts @@ -8,14 +8,16 @@ import Station from '../scripts/interfaces/Station'; import StationRoutes from '../scripts/interfaces/StationRoutes'; import Train from '../scripts/interfaces/Train'; import { URLs } from '../scripts/utils/apiURLs'; -import { getLocoURL, getStatusTimestamp, getStatusID, getScheduledTrain, parseSpawns } from '../scripts/utils/storeUtils'; +import { getStatusTimestamp, getStatusID, getScheduledTrain, parseSpawns } from '../scripts/utils/storeUtils'; import { APIData, StationJSONData, StoreState } from '../scripts/interfaces/store/storeTypes'; import packageInfo from '../../package.json'; +import { RollingStockInfo, RollingStockGithubData } from '../scripts/interfaces/github_api/StockInfoGithubData'; export const useStore = defineStore('store', { state: () => ({ apiData: {} as unknown, + rollingStockData: undefined, stationList: [], trainList: [], @@ -351,6 +353,7 @@ export const useStore = defineStore('store', { async connectToAPI() { await this.fetchStationsGeneralInfo(); + await this.fetchStockInfoData(); this.connectToWebsocket(); }, @@ -361,6 +364,14 @@ export const useStore = defineStore('store', { await this.setOnlineData(); }, + async fetchStockInfoData() { + try { + this.rollingStockData = (await axios.get('https://raw.githubusercontent.com/Spythere/api/main/td2/data/stockInfo.json')).data; + } catch (error) { + console.error('Ups! Wystąpił błąd podczas pobierania informacji o taborze z API:', error); + } + }, + async setOnlineData() { if (!this.apiData.stations) { this.dataStatuses.sceneries = DataStatus.Error; diff --git a/src/vite-env.d.ts b/src/vite-env.d.ts index 6966ac5..150bac4 100644 --- a/src/vite-env.d.ts +++ b/src/vite-env.d.ts @@ -1,19 +1,15 @@ /// declare module '*.vue' { - import type { DefineComponent } from 'vue' - const component: DefineComponent<{}, {}, any> - export default component - + import type { DefineComponent } from 'vue'; + const component: DefineComponent<{}, {}, any>; + export default component; } interface ImportMetaEnv { - readonly VITE_APP_API_DEV: number; - readonly VITE_APP_WS_DEV: number; + readonly VITE_APP_API_DEV: string; + readonly VITE_APP_WS_DEV: string; } interface ImportMeta { readonly env: ImportMetaEnv; } - - -