This commit is contained in:
2026-01-13 20:44:15 +01:00
commit 8659d58a57
29 changed files with 13509 additions and 0 deletions
@@ -0,0 +1,47 @@
<script setup lang="ts">
import {useLabelEditorStore} from "~/store/labelEditorStore";
let store = useLabelEditorStore();
</script>
<template>
<div class="notificationContainer">
<v-slide-y-reverse-transition
:group="true"
>
<div
v-for="notificationMessage in store.notificationQueue"
:key="notificationMessage.id"
>
<v-alert
v-if="notificationMessage.error"
:closable="true"
type="error"
>
{{ notificationMessage.message }}
</v-alert>
<v-alert
v-else
:closable="true"
type="success"
>
{{ notificationMessage.message }}
</v-alert>
</div>
</v-slide-y-reverse-transition>
</div>
</template>
<style scoped>
.notificationContainer {
position: fixed;
bottom: 75px;
right: 10px;
display: grid;
grid-gap: 0.5em;
width: 300px;
z-index: 99;
}
</style>
@@ -0,0 +1,140 @@
<script setup lang="ts">
import type {Ref} from "vue";
import {useLabelEditorStore} from "~/store/labelEditorStore";
import type {NotificationMessage} from "~/types/notificationMessage";
let store = useLabelEditorStore();
let dialog: Ref<boolean> = ref<boolean>(false);
let pageCount: Ref<number> = ref<number>(1);
let page: Ref<number> = ref<number>(1);
let notifications: Ref<NotificationMessage[]> = ref<NotificationMessage[]>([]);
let notificationPages: Ref<NotificationMessage[][]> = ref<NotificationMessage[][]>([]);
const pageItemCount = 25;
watch(dialog, async (oldDialog) => {
loadNotifications();
})
function loadNotifications() {
notifications.value = store.getNotifications();
const length = notifications.value.length;
pageCount.value = Math.ceil(length / pageItemCount);
for (let i = 0; i < pageCount.value; i++) {
notificationPages.value[i] = notifications.value.slice((i * pageItemCount), ((i + 1) * pageItemCount));
}
}
function clear() {
store.clearNotifications();
loadNotifications();
}
</script>
<template>
<v-dialog
v-model="dialog"
:scrollable="true"
width="800"
max-height="750"
>
<template v-slot:activator="{ props }">
<v-btn
:flat="true"
v-bind="props"
>
<v-icon>mdi-bell</v-icon>
<v-tooltip
activator="parent"
location="bottom"
>
Benachrichtigungen
</v-tooltip>
</v-btn>
</template>
<v-card>
<v-card-title>
<v-icon size="small">
mdi-bell
</v-icon>
Benachrichtigungen
</v-card-title>
<v-divider/>
<v-card-text>
<div
v-for="notification in notificationPages[page - 1]"
:key="notification.id"
>
<v-row no-gutters>
<v-col cols="2">
<v-sheet>
<v-icon v-if="notification.error" color="red">mdi-alert-circle-outline</v-icon>
<v-icon v-else color="green">mdi-check</v-icon>
{{ notification.error ? 'Fehler' : 'Okay' }}
</v-sheet>
</v-col>
<v-col cols="3">
<v-sheet>
{{ notification.dateTime }}
</v-sheet>
</v-col>
<v-col>
<v-sheet>
{{ notification.message }}
</v-sheet>
</v-col>
</v-row>
</div>
</v-card-text>
<v-divider/>
<v-pagination
v-model="page"
:length="pageCount"
></v-pagination>
<v-divider/>
<v-card-actions>
<v-btn
variant="text"
@click="clear();"
>
<v-icon>mdi-delete</v-icon>
<v-tooltip
activator="parent"
location="right"
>
Benachrichtigungen löschen
</v-tooltip>
</v-btn>
<v-spacer/>
<v-divider :vertical="true"/>
<v-btn
variant="text"
@click="dialog = false"
>
Schließen
</v-btn>
</v-card-actions>
</v-card>
</v-dialog>
</template>
<style scoped>
</style>