From 17d5574d0c70895134bb20505b1613e0f3cb5044 Mon Sep 17 00:00:00 2001 From: Spythere Date: Fri, 25 Apr 2025 02:14:45 +0200 Subject: [PATCH] feat: journal timetable view mode --- .prettierrc | 7 + nodesource_setup.sh | 113 ++++++++++++ src/components/Timetable/TimetableSelect.vue | 173 ++++++++++++------ .../Timetable/TimetableWarnings.vue | 49 ++++- src/components/Timetable/TrainTimetable.vue | 21 +-- .../TimetableStorage/ApiStorage.vue | 5 - .../TimetableStorage/StorageView.vue | 56 ------ .../TimetableViews/JournalStorageView.vue | 72 ++++++++ .../LocalStorageView.vue} | 59 ++++-- src/locales/en.json | 64 ++++--- src/locales/pl.json | 64 ++++--- src/stores/api.store.ts | 90 ++++++++- src/stores/global.store.ts | 69 +++++-- src/types/api.types.ts | 5 +- src/types/common.types.ts | 5 +- 15 files changed, 628 insertions(+), 224 deletions(-) create mode 100644 .prettierrc create mode 100644 nodesource_setup.sh delete mode 100644 src/components/TimetableStorage/ApiStorage.vue delete mode 100644 src/components/TimetableStorage/StorageView.vue create mode 100644 src/components/TimetableViews/JournalStorageView.vue rename src/components/{TimetableStorage/LocalStorage.vue => TimetableViews/LocalStorageView.vue} (52%) diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..6b858bb --- /dev/null +++ b/.prettierrc @@ -0,0 +1,7 @@ +{ + "$schema": "https://json.schemastore.org/prettierrc", + "tabWidth": 2, + "singleQuote": true, + "printWidth": 100, + "trailingComma": "none" +} diff --git a/nodesource_setup.sh b/nodesource_setup.sh new file mode 100644 index 0000000..4b112d0 --- /dev/null +++ b/nodesource_setup.sh @@ -0,0 +1,113 @@ +#!/bin/bash + +# Logger Function +log() { + local message="$1" + local type="$2" + local timestamp=$(date '+%Y-%m-%d %H:%M:%S') + local color + local endcolor="\033[0m" + + case "$type" in + "info") color="\033[38;5;79m" ;; + "success") color="\033[1;32m" ;; + "error") color="\033[1;31m" ;; + *) color="\033[1;34m" ;; + esac + + echo -e "${color}${timestamp} - ${message}${endcolor}" +} + +# Error handler function +handle_error() { + local exit_code=$1 + local error_message="$2" + log "Error: $error_message (Exit Code: $exit_code)" "error" + exit $exit_code +} + +# Function to check for command availability +command_exists() { + command -v "$1" &> /dev/null +} + +check_os() { + if ! [ -f "/etc/debian_version" ]; then + echo "Error: This script is only supported on Debian-based systems." + exit 1 + fi +} + +# Function to Install the script pre-requisites +install_pre_reqs() { + log "Installing pre-requisites" "info" + + # Run 'apt-get update' + if ! apt-get update -y; then + handle_error "$?" "Failed to run 'apt-get update'" + fi + + # Run 'apt-get install' + if ! apt-get install -y apt-transport-https ca-certificates curl gnupg; then + handle_error "$?" "Failed to install packages" + fi + + if ! mkdir -p /usr/share/keyrings; then + handle_error "$?" "Makes sure the path /usr/share/keyrings exist or run ' mkdir -p /usr/share/keyrings' with sudo" + fi + + rm -f /usr/share/keyrings/nodesource.gpg || true + rm -f /etc/apt/sources.list.d/nodesource.list || true + + # Run 'curl' and 'gpg' to download and import the NodeSource signing key + if ! curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /usr/share/keyrings/nodesource.gpg; then + handle_error "$?" "Failed to download and import the NodeSource signing key" + fi + + # Explicitly set the permissions to ensure the file is readable by all + if ! chmod 644 /usr/share/keyrings/nodesource.gpg; then + handle_error "$?" "Failed to set correct permissions on /usr/share/keyrings/nodesource.gpg" + fi +} + +# Function to configure the Repo +configure_repo() { + local node_version=$1 + + arch=$(dpkg --print-architecture) + if [ "$arch" != "amd64" ] && [ "$arch" != "arm64" ] && [ "$arch" != "armhf" ]; then + handle_error "1" "Unsupported architecture: $arch. Only amd64, arm64, and armhf are supported." + fi + + echo "deb [arch=$arch signed-by=/usr/share/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$node_version nodistro main" | tee /etc/apt/sources.list.d/nodesource.list > /dev/null + + # N|solid Config + echo "Package: nsolid" | tee /etc/apt/preferences.d/nsolid > /dev/null + echo "Pin: origin deb.nodesource.com" | tee -a /etc/apt/preferences.d/nsolid > /dev/null + echo "Pin-Priority: 600" | tee -a /etc/apt/preferences.d/nsolid > /dev/null + + # Nodejs Config + echo "Package: nodejs" | tee /etc/apt/preferences.d/nodejs > /dev/null + echo "Pin: origin deb.nodesource.com" | tee -a /etc/apt/preferences.d/nodejs > /dev/null + echo "Pin-Priority: 600" | tee -a /etc/apt/preferences.d/nodejs > /dev/null + + # Run 'apt-get update' + if ! apt-get update -y; then + handle_error "$?" "Failed to run 'apt-get update'" + else + log "Repository configured successfully." + log "To install Node.js, run: apt-get install nodejs -y" "info" + log "You can use N|solid Runtime as a node.js alternative" "info" + log "To install N|solid Runtime, run: apt-get install nsolid -y \n" "success" + fi +} + +# Define Node.js version +NODE_VERSION="23.x" + +# Check OS +check_os + +# Main execution +install_pre_reqs || handle_error $? "Failed installing pre-requisites" +configure_repo "$NODE_VERSION" || handle_error $? "Failed configuring repository" diff --git a/src/components/Timetable/TimetableSelect.vue b/src/components/Timetable/TimetableSelect.vue index ff289f7..d64e15b 100644 --- a/src/components/Timetable/TimetableSelect.vue +++ b/src/components/Timetable/TimetableSelect.vue @@ -1,16 +1,68 @@ @@ -68,9 +112,17 @@ import { computed } from 'vue'; import { useApiStore } from '../../stores/api.store'; import { DataStatus } from '../../types/api.types'; import { useGlobalStore } from '../../stores/global.store'; -import { PrinterIcon, MoonIcon, SunIcon, ArchiveBoxArrowDownIcon, ArrowDownTrayIcon } from '@heroicons/vue/16/solid'; +import { + PrinterIcon, + MoonIcon, + SunIcon, + ArchiveBoxArrowDownIcon, + ArrowDownTrayIcon, + CloudIcon, + WifiIcon +} from '@heroicons/vue/16/solid'; import { getRegionNameById } from '../../utils/trainUtils'; -import type { TimetableData } from '../../types/common.types'; +import type { TimetableData, ViewMode } from '../../types/common.types'; // Stores const apiStore = useApiStore(); @@ -80,22 +132,26 @@ const globalStore = useGlobalStore(); const isTimetableSaved = computed(() => { if (!globalStore.currentTimetableData) return false; - return Object.keys(globalStore.storageTimetables).includes(`${globalStore.currentTimetableData.timetableId}`); + return Object.keys(globalStore.storageTimetables).includes( + `${globalStore.currentTimetableData.timetableId}` + ); }); // Methods function selectTrain() { if (!apiStore.activeData) return; - globalStore.selectedActiveTrain = globalStore.activeTimetableTrains.find((train) => train.id == globalStore.selectedTrainId) ?? null; + globalStore.selectedActiveTrain = + globalStore.activeTimetableTrains.find((train) => train.id == globalStore.selectedTrainId) ?? + null; if (globalStore.selectedActiveTrain != null) { globalStore.generatedDate = new Date(); } } -function toggleViewMode() { - globalStore.viewMode = globalStore.viewMode == 'active' ? 'storage' : 'active'; +function toggleViewMode(viewMode: ViewMode) { + globalStore.viewMode = viewMode; } function toggleDarkMode() { @@ -109,16 +165,22 @@ function saveToStorage() { try { const savedTimetablesStorage = localStorage.getItem('savedTimetables'); - let savedTimetablesJSON: Record = savedTimetablesStorage ? JSON.parse(savedTimetablesStorage) : {}; + let savedTimetablesJSON: Record = savedTimetablesStorage + ? JSON.parse(savedTimetablesStorage) + : {}; if (savedTimetablesJSON[globalStore.currentTimetableData.timetableId] !== undefined) { - globalStore.selectedStorageTimetable = savedTimetablesJSON[globalStore.currentTimetableData.timetableId]; + globalStore.selectedStorageTimetable = + savedTimetablesJSON[globalStore.currentTimetableData.timetableId]; globalStore.viewMode = 'storage'; return; } - savedTimetablesJSON[globalStore.currentTimetableData.timetableId] = { ...globalStore.currentTimetableData, savedTimestamp: Date.now() }; + savedTimetablesJSON[globalStore.currentTimetableData.timetableId] = { + ...globalStore.currentTimetableData, + savedTimestamp: Date.now() + }; localStorage.setItem('savedTimetables', JSON.stringify(savedTimetablesJSON)); globalStore.storageTimetables = savedTimetablesJSON; @@ -127,21 +189,22 @@ function saveToStorage() { function openPrintingWindow() { if (globalStore.selectedActiveTrain != null) { - const date = `${globalStore.generatedDate!.toLocaleDateString('pl-PL').replace(/\./g, '-')}--${globalStore + const date = `${globalStore + .generatedDate!.toLocaleDateString('pl-PL') + .replace(/\./g, '-')}--${globalStore .generatedDate!.toLocaleTimeString('pl-PL') .replace(/:/g, '-')}`; - document.title = `${globalStore.selectedActiveTrain.driverName} ; ${globalStore.selectedActiveTrain.timetable!.category} ${ - globalStore.selectedActiveTrain.trainNo - } + document.title = `${globalStore.selectedActiveTrain.driverName} ; ${ + globalStore.selectedActiveTrain.timetable!.category + } ${globalStore.selectedActiveTrain.trainNo} ${globalStore.selectedActiveTrain.timetable?.route.replace('|', ' - ')} ; ${date}`; } window.print(); } -// function refreshData() { -// apiStore.fetchActiveData(); -// selectTrain(); -// } +async function fetchJournalTimetables() { + apiStore.fetchJournalTimetables(globalStore.journalTimetableSearch); +} diff --git a/src/components/Timetable/TimetableWarnings.vue b/src/components/Timetable/TimetableWarnings.vue index 0f61262..a8eef39 100644 --- a/src/components/Timetable/TimetableWarnings.vue +++ b/src/components/Timetable/TimetableWarnings.vue @@ -1,4 +1,5 @@