feat: Dashboard-Enhancements – Filter, Checkboxen, Animationen
- IrisPanel: Task-Zahlen aus OperationsStore, Suggestions als Array, Chat via console.log - OperationsFeed: Filter-Pills filtern Feed-Items, TransitionGroup-Animationen - AgendaPanel: Checkboxen mit localStorage-Persistenz (nexus-agenda-done) - ActiveInitiatives: Cards hover-scale, Klick-Handler, Progress-Bars animiert - RecentlyFinished: Chips klickbar + a11y (role, tabindex, keyup) - DashboardView: fade-in Animation, Custom-Scrollbar - VERSION: 0.1.0 initial - Deploy-Workflow: Version-Bump-Semantik (major=x.0.0, minor=1.x.0, patch=1.0.x)
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
<script setup lang="ts">
|
||||
import { ref } from 'vue'
|
||||
import { ref, onMounted } from 'vue'
|
||||
import { CheckCircle2, Circle, AlertTriangle } from '@lucide/vue'
|
||||
|
||||
interface AgendaItem {
|
||||
@@ -9,6 +9,8 @@ interface AgendaItem {
|
||||
overdue?: boolean
|
||||
}
|
||||
|
||||
const STORAGE_KEY = 'nexus-agenda-done'
|
||||
|
||||
const agendaToday = ref<AgendaItem[]>([
|
||||
{ text: 'Teammeeting', time: '14:00' },
|
||||
{ text: 'Deutsch lernen', time: '18:00' },
|
||||
@@ -25,9 +27,48 @@ const agendaOverdue = ref<AgendaItem[]>([
|
||||
{ text: 'Hangfire konfigurieren', overdue: true },
|
||||
])
|
||||
|
||||
function loadDoneStates() {
|
||||
try {
|
||||
const raw = localStorage.getItem(STORAGE_KEY)
|
||||
if (!raw) return
|
||||
const keys: string[] = JSON.parse(raw)
|
||||
const set = new Set(keys)
|
||||
const sections = [
|
||||
{ items: agendaToday.value, prefix: 'today' },
|
||||
{ items: agendaTomorrow.value, prefix: 'tomorrow' },
|
||||
{ items: agendaOverdue.value, prefix: 'overdue' },
|
||||
]
|
||||
for (const { items, prefix } of sections) {
|
||||
items.forEach((item, i) => {
|
||||
if (set.has(`${prefix}-${i}`)) item.done = true
|
||||
})
|
||||
}
|
||||
} catch { /* ignore malformed storage */ }
|
||||
}
|
||||
|
||||
function saveDoneStates() {
|
||||
const keys: string[] = []
|
||||
const sections = [
|
||||
{ items: agendaToday.value, prefix: 'today' },
|
||||
{ items: agendaTomorrow.value, prefix: 'tomorrow' },
|
||||
{ items: agendaOverdue.value, prefix: 'overdue' },
|
||||
]
|
||||
for (const { items, prefix } of sections) {
|
||||
items.forEach((item, i) => {
|
||||
if (item.done) keys.push(`${prefix}-${i}`)
|
||||
})
|
||||
}
|
||||
localStorage.setItem(STORAGE_KEY, JSON.stringify(keys))
|
||||
}
|
||||
|
||||
function toggleAgendaItem(item: AgendaItem) {
|
||||
item.done = !item.done
|
||||
saveDoneStates()
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
loadDoneStates()
|
||||
})
|
||||
</script>
|
||||
|
||||
<template>
|
||||
|
||||
Reference in New Issue
Block a user