feat: offline mode; PWA

This commit is contained in:
2025-04-28 00:10:44 +02:00
parent f4aa0b28a1
commit 4e8aabe05e
18 changed files with 6111 additions and 54 deletions
+24
View File
@@ -0,0 +1,24 @@
<template>
<div class="fixed z-50 bottom-0 right-0">
<button @click="onUpdateClick" class="p-3 m-3 bg-cyan-600 rounded-md text-xl" ref="updateBtnEl">
<div>{{ $t('update-prompt.line1') }}</div>
<u>{{ $t('update-prompt.line2') }}</u>
</button>
</div>
</template>
<script setup lang="ts">
import { onMounted } from 'vue';
import { ref } from 'vue';
const emit = defineEmits(['onUpdateClick']);
const updateBtnEl = ref<HTMLElement | null>(null);
function onUpdateClick() {
emit('onUpdateClick');
}
onMounted(() => {
updateBtnEl.value?.focus();
});
</script>
+7 -2
View File
@@ -99,9 +99,14 @@
<input
type="text"
v-else-if="globalStore.viewMode == 'journal'"
v-model="globalStore.journalTimetableSearch"
@change="fetchJournalTimetables"
class="bg-zinc-800 p-1 rounded-md print:hidden w-full"
v-model="globalStore.journalTimetableSearch"
:class="`bg-zinc-800 p-1 rounded-md print:hidden w-full ${
apiStore.connectionMode == 'offline' ? 'opacity-35' : ''
}`"
:disabled="
apiStore.journalDataStatus == DataStatus.LOADING || apiStore.connectionMode == 'offline'
"
:placeholder="$t('journal-search-placeholder')"
/>
</div>
+2 -1
View File
@@ -18,7 +18,8 @@
<div class="overflow-auto text-center font-bold text-zinc-400 p-1 min-h-full" v-else>
<div v-if="globalStore.viewMode == 'active'">
<div>{{ $t('train-select-info') }}</div>
<div v-if="apiStore.connectionMode == 'online'">{{ $t('train-select-info') }}</div>
<div v-else class="bg-red-500 text-white p-2">{{ $t('data-offline-mode') }}</div>
</div>
<LocalStorageView v-else-if="globalStore.viewMode == 'storage'" />
@@ -4,7 +4,11 @@
{{ $t('journal-preview-title') }}
</h2>
<div v-if="apiStore.journalDataStatus == DataStatus.LOADING" class="bg-zinc-900 p-2">
<div v-if="apiStore.connectionMode == 'offline'" class="bg-red-500 p-2">
{{ $t('data-offline-mode') }}
</div>
<div v-else-if="apiStore.journalDataStatus == DataStatus.LOADING" class="bg-zinc-900 p-2">
{{ $t('data-loading-text') }}
</div>