KI-AGENT: Tabellen-Empty-States ohne JSON rendern

Ersetzt ungültige UTable-Empty-Props durch einen gemeinsamen Empty-State-Slot, damit leere Tabellen keine Objekt-/JSON-Ausgabe mehr anzeigen.
This commit is contained in:
2026-05-19 18:36:54 +02:00
parent 81ce9d263d
commit 6dcd8b1863
30 changed files with 130 additions and 40 deletions

View File

@@ -267,7 +267,6 @@ const selectItem = (item) => {
:ui="{ divide: 'divide-gray-200 dark:divide-gray-800' }" :ui="{ divide: 'divide-gray-200 dark:divide-gray-800' }"
:on-select="(row) => selectItem(row.original)" :on-select="(row) => selectItem(row.original)"
style="height: 70vh" style="height: 70vh"
:empty="{ icon: 'i-heroicons-circle-stack-20-solid', label: 'Keine Belege anzuzeigen' }"
> >
<template #type-cell="{ row }"> <template #type-cell="{ row }">
{{ dataStore.documentTypesForCreation[row.original.type].labelSingle }} {{ dataStore.documentTypesForCreation[row.original.type].labelSingle }}
@@ -312,6 +311,9 @@ const selectItem = (item) => {
<template #amount-cell="{ row }"> <template #amount-cell="{ row }">
<span v-if="!deliveryNoteLikeDocumentTypes.includes(row.original.type)">{{ useCurrency(useSum().getCreatedDocumentSum(row.original, createddocuments)) }}</span> <span v-if="!deliveryNoteLikeDocumentTypes.includes(row.original.type)">{{ useCurrency(useSum().getCreatedDocumentSum(row.original, createddocuments)) }}</span>
</template> </template>
<template #empty>
<TableEmptyState label="Keine Belege anzuzeigen" />
</template>
</UTable> </UTable>

View File

@@ -254,7 +254,6 @@ const selectAllocation = (allocationLike) => {
:columns="normalizeTableColumns(columns)" :columns="normalizeTableColumns(columns)"
:on-select="selectAllocation" :on-select="selectAllocation"
class="w-full" class="w-full"
:empty="{ icon: 'i-heroicons-circle-stack-20-solid', label: 'Keine Buchungen im ausgewählten Zeitraum' }"
> >
<template #amount-cell="{ row }"> <template #amount-cell="{ row }">
<span class="text-right text-error" v-if="row.original.amount < 0 || row.original.color === 'red'">{{ useCurrency(row.original.amount) }}</span> <span class="text-right text-error" v-if="row.original.amount < 0 || row.original.color === 'red'">{{ useCurrency(row.original.amount) }}</span>
@@ -275,6 +274,9 @@ const selectAllocation = (allocationLike) => {
<div class="max-w-[22rem] truncate">{{ hasContent(row.original.description) ? row.original.description : '-' }}</div> <div class="max-w-[22rem] truncate">{{ hasContent(row.original.description) ? row.original.description : '-' }}</div>
</UTooltip> </UTooltip>
</template> </template>
<template #empty>
<TableEmptyState label="Keine Buchungen im ausgewählten Zeitraum" />
</template>
</UTable> </UTable>
</div> </div>

View File

@@ -69,7 +69,6 @@ const columns = [
class="mt-3" class="mt-3"
:columns="normalizeTableColumns(columns)" :columns="normalizeTableColumns(columns)"
:data="props.item.times" :data="props.item.times"
:empty="{ icon: 'i-heroicons-circle-stack-20-solid', label: 'Noch keine Einträge' }"
> >
<template #state-cell="{ row }"> <template #state-cell="{ row }">
<span <span
@@ -102,6 +101,9 @@ const columns = [
<template #project-cell="{ row }"> <template #project-cell="{ row }">
{{ row.original.project ? row.original.project.name : "" }} {{ row.original.project ? row.original.project.name : "" }}
</template> </template>
<template #empty>
<TableEmptyState label="Noch keine Einträge" />
</template>
</UTable> </UTable>
</UCard> </UCard>

View File

@@ -110,7 +110,6 @@
class="w-full" class="w-full"
:ui="{ divide: 'divide-gray-200 dark:divide-gray-800' }" :ui="{ divide: 'divide-gray-200 dark:divide-gray-800' }"
:on-select="handleSelect" :on-select="handleSelect"
:empty="`Keine ${dataType.label} anzuzeigen`"
> >
<template #name-cell="{ row }"> <template #name-cell="{ row }">
<span <span
@@ -161,6 +160,9 @@
</span> </span>
</template> </template>
<template #empty>
<TableEmptyState :label="`Keine ${dataType.label} anzuzeigen`" />
</template>
</UTable> </UTable>
</template> </template>

View File

@@ -0,0 +1,19 @@
<script setup>
defineProps({
icon: {
type: String,
default: 'i-heroicons-circle-stack-20-solid'
},
label: {
type: String,
required: true
}
})
</script>
<template>
<div class="flex flex-col items-center justify-center gap-2 py-6 text-center text-muted">
<UIcon :name="icon" class="size-6" />
<span>{{ label }}</span>
</div>
</template>

View File

@@ -224,7 +224,6 @@ setupPage()
v-if="!loading" v-if="!loading"
:data="reportRows" :data="reportRows"
:columns="columns" :columns="columns"
:empty="{ icon: 'i-heroicons-circle-stack-20-solid', label: 'Keine Eingangsbelege mit dieser Kostenstelle oder ihren Unterkostenstellen gefunden' }"
class="w-full" class="w-full"
> >
<template #reference-cell="{ row }"> <template #reference-cell="{ row }">
@@ -264,6 +263,9 @@ setupPage()
<template #amountGross-cell="{ row }"> <template #amountGross-cell="{ row }">
<div class="text-right font-medium tabular-nums">{{ currency(row.original.amountGross) }}</div> <div class="text-right font-medium tabular-nums">{{ currency(row.original.amountGross) }}</div>
</template> </template>
<template #empty>
<TableEmptyState label="Keine Eingangsbelege mit dieser Kostenstelle oder ihren Unterkostenstellen gefunden" />
</template>
</UTable> </UTable>
<UProgress v-else animation="carousel" class="w-3/4 mx-auto" /> <UProgress v-else animation="carousel" class="w-3/4 mx-auto" />

View File

@@ -25,8 +25,11 @@ setupPage()
:data="openTasks" :data="openTasks"
:columns="normalizeTableColumns([{key:'name',label:'Name'},{key:'categorie',label:'Kategorie'}])" :columns="normalizeTableColumns([{key:'name',label:'Name'},{key:'categorie',label:'Kategorie'}])"
:on-select="(i) => router.push(`/tasks/show/${i.id}`)" :on-select="(i) => router.push(`/tasks/show/${i.id}`)"
:empty="{ icon: 'i-heroicons-circle-stack-20-solid', label: 'Keine offenen Aufgaben' }" >
/> <template #empty>
<TableEmptyState label="Keine offenen Aufgaben" />
</template>
</UTable>
</template> </template>
<style scoped> <style scoped>

View File

@@ -585,7 +585,6 @@ onMounted(setupPage)
:columns="normalizeTableColumns(accountColumns)" :columns="normalizeTableColumns(accountColumns)"
:loading="loading" :loading="loading"
:on-select="openAccount" :on-select="openAccount"
:empty="{ icon: 'i-heroicons-circle-stack-20-solid', label: 'Keine Buchungskonten im ausgewählten Zeitraum' }"
> >
<template #label-cell="{ row }"> <template #label-cell="{ row }">
<div class="truncate font-medium">{{ row.original.label }}</div> <div class="truncate font-medium">{{ row.original.label }}</div>
@@ -606,6 +605,9 @@ onMounted(setupPage)
<template #gross-cell="{ row }"> <template #gross-cell="{ row }">
<div class="text-right font-medium tabular-nums">{{ useCurrency(row.original.gross) }}</div> <div class="text-right font-medium tabular-nums">{{ useCurrency(row.original.gross) }}</div>
</template> </template>
<template #empty>
<TableEmptyState label="Keine Buchungskonten im ausgewählten Zeitraum" />
</template>
</UTable> </UTable>
</div> </div>
</UCard> </UCard>
@@ -624,7 +626,6 @@ onMounted(setupPage)
:columns="normalizeTableColumns(ownAccountColumns)" :columns="normalizeTableColumns(ownAccountColumns)"
:loading="loading" :loading="loading"
:on-select="openOwnAccount" :on-select="openOwnAccount"
:empty="{ icon: 'i-heroicons-circle-stack-20-solid', label: 'Keine eigenen Buchungen im ausgewählten Zeitraum' }"
> >
<template #label-cell="{ row }"> <template #label-cell="{ row }">
<div class="truncate font-medium">{{ row.original.label }}</div> <div class="truncate font-medium">{{ row.original.label }}</div>
@@ -647,6 +648,9 @@ onMounted(setupPage)
{{ useCurrency(row.original.balance) }} {{ useCurrency(row.original.balance) }}
</div> </div>
</template> </template>
<template #empty>
<TableEmptyState label="Keine eigenen Buchungen im ausgewählten Zeitraum" />
</template>
</UTable> </UTable>
</div> </div>
</UCard> </UCard>
@@ -664,11 +668,13 @@ onMounted(setupPage)
:data="depreciationRows" :data="depreciationRows"
:columns="normalizeTableColumns(depreciationColumns)" :columns="normalizeTableColumns(depreciationColumns)"
:loading="loading" :loading="loading"
:empty="{ icon: 'i-heroicons-circle-stack-20-solid', label: 'Keine Abschreibungen im ausgewählten Zeitraum' }"
> >
<template #amount-cell="{ row }"> <template #amount-cell="{ row }">
<div class="text-right text-amber-600 dark:text-amber-400 tabular-nums">{{ useCurrency(row.original.amount) }}</div> <div class="text-right text-amber-600 dark:text-amber-400 tabular-nums">{{ useCurrency(row.original.amount) }}</div>
</template> </template>
<template #empty>
<TableEmptyState label="Keine Abschreibungen im ausgewählten Zeitraum" />
</template>
</UTable> </UTable>
</UCard> </UCard>
</UDashboardPanelContent> </UDashboardPanelContent>

View File

@@ -117,7 +117,6 @@ onMounted(loadCashbooks)
class="w-full" class="w-full"
:ui="{ divide: 'divide-gray-200 dark:divide-gray-800' }" :ui="{ divide: 'divide-gray-200 dark:divide-gray-800' }"
:on-select="(row) => router.push(`/accounting/cashbooks/${row.original?.id || row.id}`)" :on-select="(row) => router.push(`/accounting/cashbooks/${row.original?.id || row.id}`)"
:empty="{ icon: 'i-heroicons-banknotes', label: 'Keine Kassenbücher angelegt' }"
> >
<template #datevNumber-cell="{ row }"> <template #datevNumber-cell="{ row }">
<span class="font-mono">{{ row.original.datevNumber }}</span> <span class="font-mono">{{ row.original.datevNumber }}</span>
@@ -128,6 +127,9 @@ onMounted(loadCashbooks)
<template #syncedAt-cell="{ row }"> <template #syncedAt-cell="{ row }">
{{ row.original.createdAt ? new Date(row.original.createdAt).toLocaleDateString("de-DE") : "-" }} {{ row.original.createdAt ? new Date(row.original.createdAt).toLocaleDateString("de-DE") : "-" }}
</template> </template>
<template #empty>
<TableEmptyState label="Keine Kassenbücher angelegt" icon="i-heroicons-banknotes" />
</template>
</UTable> </UTable>
<UModal v-model:open="createCashbookModalOpen"> <UModal v-model:open="createCashbookModalOpen">

View File

@@ -255,7 +255,6 @@ onMounted(loadData)
:columns="normalizeTableColumns(columns)" :columns="normalizeTableColumns(columns)"
:data="periods" :data="periods"
:loading="loading" :loading="loading"
:empty="{ icon: 'i-heroicons-calculator', label: 'Keine Daten für die USt-Auswertung vorhanden' }"
> >
<template #label-cell="{ row }"> <template #label-cell="{ row }">
<div class="flex items-center gap-2"> <div class="flex items-center gap-2">
@@ -281,6 +280,9 @@ onMounted(loadData)
<template #documents-cell="{ row }"> <template #documents-cell="{ row }">
{{ row.original.outputCount }} / {{ row.original.inputCount }} {{ row.original.outputCount }} / {{ row.original.inputCount }}
</template> </template>
<template #empty>
<TableEmptyState label="Keine Daten für die USt-Auswertung vorhanden" icon="i-heroicons-calculator" />
</template>
</UTable> </UTable>
</UCard> </UCard>
</UDashboardPanelContent> </UDashboardPanelContent>

View File

@@ -199,7 +199,6 @@ setupPage()
class="w-full" class="w-full"
:ui="{ divide: 'divide-gray-200 dark:divide-gray-800' }" :ui="{ divide: 'divide-gray-200 dark:divide-gray-800' }"
:on-select="(row) => router.push(`/accounts/show/${row.original.id}`)" :on-select="(row) => router.push(`/accounts/show/${row.original.id}`)"
:empty="{ icon: 'i-heroicons-circle-stack-20-solid', label: 'Keine Buchungen anzuzeigen' }"
> >
<template #allocations-cell="{row}"> <template #allocations-cell="{row}">
<span v-if="dataLoaded">{{row.original.allocations ? row.original.allocations : null}}</span> <span v-if="dataLoaded">{{row.original.allocations ? row.original.allocations : null}}</span>
@@ -210,6 +209,9 @@ setupPage()
<span v-if="dataLoaded">{{row.original.allocations ? useCurrency(row.original.saldo) : null}}</span> <span v-if="dataLoaded">{{row.original.allocations ? useCurrency(row.original.saldo) : null}}</span>
<USkeleton v-else class="h-4 w-[250px]" /> <USkeleton v-else class="h-4 w-[250px]" />
</template> </template>
<template #empty>
<TableEmptyState label="Keine Buchungen anzuzeigen" />
</template>
</UTable> </UTable>

View File

@@ -347,8 +347,11 @@ onMounted(async () => {
])" ])"
:on-select="(row) => router.push(`/administration/users/${row.original?.id || row.id}`)" :on-select="(row) => router.push(`/administration/users/${row.original?.id || row.id}`)"
class="mt-4" class="mt-4"
:empty="{ icon: 'i-heroicons-circle-stack-20-solid', label: 'Keine zugeordneten Benutzer gefunden' }" >
/> <template #empty>
<TableEmptyState label="Keine zugeordneten Benutzer gefunden" />
</template>
</UTable>
</UCard> </UCard>
<USkeleton v-if="loading" class="h-80" /> <USkeleton v-if="loading" class="h-80" />

View File

@@ -179,8 +179,11 @@ onMounted(async () => {
:columns="normalizeTableColumns(templateColumns)" :columns="normalizeTableColumns(templateColumns)"
:loading="loading" :loading="loading"
:on-select="(row) => router.push(`/administration/tenants/${row.original?.id || row.id}`)" :on-select="(row) => router.push(`/administration/tenants/${row.original?.id || row.id}`)"
:empty="{ icon: 'i-heroicons-building-office-2', label: 'Keine Tenants gefunden' }" >
/> <template #empty>
<TableEmptyState label="Keine Tenants gefunden" icon="i-heroicons-building-office-2" />
</template>
</UTable>
<UModal v-model:open="createTenantModalOpen"> <UModal v-model:open="createTenantModalOpen">
<template #content> <template #content>

View File

@@ -136,8 +136,11 @@ onMounted(async () => {
:columns="normalizeTableColumns(templateColumns)" :columns="normalizeTableColumns(templateColumns)"
:loading="loading" :loading="loading"
:on-select="(row) => router.push(`/administration/users/${row.original?.id || row.id}`)" :on-select="(row) => router.push(`/administration/users/${row.original?.id || row.id}`)"
:empty="{ icon: 'i-heroicons-users', label: 'Keine Benutzer gefunden' }" >
/> <template #empty>
<TableEmptyState label="Keine Benutzer gefunden" icon="i-heroicons-users" />
</template>
</UTable>
<UModal v-model:open="createUserModalOpen"> <UModal v-model:open="createUserModalOpen">
<template #content> <template #content>

View File

@@ -60,7 +60,6 @@
<div style="height: 80vh; overflow-y: scroll"> <div style="height: 80vh; overflow-y: scroll">
<UTable <UTable
:columns="normalizeTableColumns(getColumnsForTab(item.key))" :columns="normalizeTableColumns(getColumnsForTab(item.key))"
:empty="{ icon: 'i-heroicons-circle-stack-20-solid', label: 'Keine Belege anzuzeigen' }"
:data="getRowsForTab(item.key)" :data="getRowsForTab(item.key)"
:ui="{ divide: 'divide-gray-200 dark:divide-gray-800' }" :ui="{ divide: 'divide-gray-200 dark:divide-gray-800' }"
class="w-full" class="w-full"
@@ -134,6 +133,9 @@
{{ displayCurrency(useSum().getCreatedDocumentOpenAmount(row.original, items)) }} {{ displayCurrency(useSum().getCreatedDocumentOpenAmount(row.original, items)) }}
</span> </span>
</template> </template>
<template #empty>
<TableEmptyState label="Keine Belege anzuzeigen" />
</template>
</UTable> </UTable>
</div> </div>
</template> </template>

View File

@@ -98,7 +98,6 @@
class="w-full" class="w-full"
:ui="{ divide: 'divide-gray-200 dark:divide-gray-800' }" :ui="{ divide: 'divide-gray-200 dark:divide-gray-800' }"
:on-select="(row) => router.push(`/createDocument/edit/${row.original?.id || row.id}`)" :on-select="(row) => router.push(`/createDocument/edit/${row.original?.id || row.id}`)"
empty="Keine Belege anzuzeigen"
> >
<template #actions-cell="{ row }"> <template #actions-cell="{ row }">
<div @click.stop> <div @click.stop>
@@ -137,6 +136,9 @@
<span v-if="row.original.payment_type === 'transfer'">Überweisung</span> <span v-if="row.original.payment_type === 'transfer'">Überweisung</span>
<span v-else-if="row.original.payment_type === 'direct-debit'">SEPA - Einzug</span> <span v-else-if="row.original.payment_type === 'direct-debit'">SEPA - Einzug</span>
</template> </template>
<template #empty>
<TableEmptyState label="Keine Belege anzuzeigen" />
</template>
</UTable> </UTable>
<UModal v-model:open="showExecutionModal" :ui="{ width: 'sm:max-w-4xl' }"> <UModal v-model:open="showExecutionModal" :ui="{ width: 'sm:max-w-4xl' }">
@@ -211,7 +213,6 @@
:get-row-id="(row) => row.id" :get-row-id="(row) => row.id"
:ui="{ th: { base: 'whitespace-nowrap' } }" :ui="{ th: { base: 'whitespace-nowrap' } }"
:on-select="toggleExecutionRow" :on-select="toggleExecutionRow"
:empty="{ icon: 'i-heroicons-circle-stack-20-solid', label: 'Keine Belege anzuzeigen' }"
> >
<template #select-header="{ table }"> <template #select-header="{ table }">
<div class="flex justify-center" @click.stop> <div class="flex justify-center" @click.stop>
@@ -244,6 +245,9 @@
<template #plant-cell="{row}"> <template #plant-cell="{row}">
{{ row.original.plant?.name || "-" }} {{ row.original.plant?.name || "-" }}
</template> </template>
<template #empty>
<TableEmptyState label="Keine Belege anzuzeigen" />
</template>
</UTable> </UTable>
</div> </div>

View File

@@ -97,7 +97,6 @@ const createExport = async () => {
{ key: 'documentDate', label: 'Belegdatum' }, { key: 'documentDate', label: 'Belegdatum' },
{ key: 'outgoingsepamandate', label: 'SEPA-Mandat' }, { key: 'outgoingsepamandate', label: 'SEPA-Mandat' },
])" ])"
:empty="{ icon: 'i-heroicons-circle-stack-20-solid', label: 'Keine SEPA-Belege anzuzeigen' }"
> >
<template #customer-cell="{ row }"> <template #customer-cell="{ row }">
{{ row.original.customer?.name || "-" }} {{ row.original.customer?.name || "-" }}
@@ -105,6 +104,9 @@ const createExport = async () => {
<template #outgoingsepamandate-cell="{ row }"> <template #outgoingsepamandate-cell="{ row }">
{{ row.original.outgoingsepamandate?.reference || "-" }} {{ row.original.outgoingsepamandate?.reference || "-" }}
</template> </template>
<template #empty>
<TableEmptyState label="Keine SEPA-Belege anzuzeigen" />
</template>
</UTable> </UTable>
</template> </template>

View File

@@ -154,7 +154,6 @@ const createExport = async () => {
{ key: 'type', label: 'Typ' }, { key: 'type', label: 'Typ' },
{ key: 'download', label: 'Download' }, { key: 'download', label: 'Download' },
])" ])"
:empty="{ icon: 'i-heroicons-circle-stack-20-solid', label: 'Keine Exporte anzuzeigen' }"
> >
<template #created_at-cell="{row}"> <template #created_at-cell="{row}">
{{dayjs(row.original.created_at).format("DD.MM.YYYY HH:mm")}} {{dayjs(row.original.created_at).format("DD.MM.YYYY HH:mm")}}
@@ -171,6 +170,9 @@ const createExport = async () => {
<template #download-cell="{row}"> <template #download-cell="{row}">
<UButton @click="downloadFile(row.original)">Download</UButton> <UButton @click="downloadFile(row.original)">Download</UButton>
</template> </template>
<template #empty>
<TableEmptyState label="Keine Exporte anzuzeigen" />
</template>
</UTable> </UTable>
<UModal v-model:open="showCreateExportModal"> <UModal v-model:open="showCreateExportModal">

View File

@@ -278,7 +278,6 @@ const selectIncomingInvoice = (invoiceLike) => {
class="w-full" class="w-full"
:ui="{ divide: 'divide-gray-200 dark:divide-gray-800' }" :ui="{ divide: 'divide-gray-200 dark:divide-gray-800' }"
:on-select="selectIncomingInvoice" :on-select="selectIncomingInvoice"
:empty="{ icon: 'i-heroicons-circle-stack-20-solid', label: 'Keine Belege anzuzeigen' }"
> >
<template #reference-cell="{row}"> <template #reference-cell="{row}">
<span v-if="row.original === filteredRows[selectedItem]" class="text-primary-500 font-bold">{{row.original.reference}}</span> <span v-if="row.original === filteredRows[selectedItem]" class="text-primary-500 font-bold">{{row.original.reference}}</span>
@@ -310,6 +309,9 @@ const selectIncomingInvoice = (invoiceLike) => {
<span v-if="isPaid(row.original)" class="text-primary-500">Bezahlt</span> <span v-if="isPaid(row.original)" class="text-primary-500">Bezahlt</span>
<span v-else class="text-rose-600">Offen</span> <span v-else class="text-rose-600">Offen</span>
</template> </template>
<template #empty>
<TableEmptyState label="Keine Belege anzuzeigen" />
</template>
</UTable> </UTable>
</div> </div>

View File

@@ -92,13 +92,14 @@ const filteredRows = computed(() => {
class="w-full" class="w-full"
:ui="{ divide: 'divide-gray-200 dark:divide-gray-800' }" :ui="{ divide: 'divide-gray-200 dark:divide-gray-800' }"
:on-select="(i) => router.push(`/projecttypes/show/${i.id}`) " :on-select="(i) => router.push(`/projecttypes/show/${i.id}`) "
:empty="{ icon: 'i-heroicons-circle-stack-20-solid', label: 'Keine Projekttypen anzuzeigen' }"
> >
<template #name-cell="{row}"> <template #name-cell="{row}">
<span class="text-primary-500 font-bold" v-if="row.original === filteredRows[selectedItem]">{{ row.original.name }}</span> <span class="text-primary-500 font-bold" v-if="row.original === filteredRows[selectedItem]">{{ row.original.name }}</span>
<span v-else>{{ row.original.name }}</span> <span v-else>{{ row.original.name }}</span>
</template> </template>
<template #empty>
<TableEmptyState label="Keine Projekttypen anzuzeigen" />
</template>
</UTable> </UTable>
</template> </template>

View File

@@ -203,7 +203,6 @@ setupPage()
label: 'Saldo' label: 'Saldo'
}, },
])" ])"
:empty="{ icon: 'i-heroicons-circle-stack-20-solid', label: 'Keine Bankkonten anzuzeigen' }"
> >
<template #expired-cell="{ row }"> <template #expired-cell="{ row }">
<span v-if="row.original.expired" class="text-error-600">Ausgelaufen</span> <span v-if="row.original.expired" class="text-error-600">Ausgelaufen</span>
@@ -221,6 +220,9 @@ setupPage()
<template #iban-cell="{ row }"> <template #iban-cell="{ row }">
{{ row.original.iban.match(/.{1,5}/g).join(" ") }} {{ row.original.iban.match(/.{1,5}/g).join(" ") }}
</template> </template>
<template #empty>
<TableEmptyState label="Keine Bankkonten anzuzeigen" />
</template>
</UTable> </UTable>
</template> </template>

View File

@@ -87,8 +87,10 @@ const columns = computed(() => templateColumns.filter((column) => selectedColumn
class="w-full" class="w-full"
:on-select="(i) => navigateTo(`/settings/emailaccounts/edit/${i.id}`)" :on-select="(i) => navigateTo(`/settings/emailaccounts/edit/${i.id}`)"
:ui="{ divide: 'divide-gray-200 dark:divide-gray-800' }" :ui="{ divide: 'divide-gray-200 dark:divide-gray-800' }"
:empty="{ icon: 'i-heroicons-circle-stack-20-solid', label: 'Keine E-Mail Konten anzuzeigen' }"
> >
<template #empty>
<TableEmptyState label="Keine E-Mail Konten anzuzeigen" />
</template>
</UTable> </UTable>
</template> </template>

View File

@@ -197,7 +197,6 @@ onMounted(refreshData)
{ key: 'path', label: 'Datei' }, { key: 'path', label: 'Datei' },
{ key: 'actions', label: '' } { key: 'actions', label: '' }
])" ])"
:empty="{ icon: 'i-heroicons-document', label: 'Keine Briefpapiere gefunden' }"
> >
<template #name-cell="{ row }"> <template #name-cell="{ row }">
<span class="font-medium text-gray-900 dark:text-white"> <span class="font-medium text-gray-900 dark:text-white">
@@ -260,6 +259,9 @@ onMounted(refreshData)
</ButtonWithConfirm> </ButtonWithConfirm>
</div> </div>
</template> </template>
<template #empty>
<TableEmptyState label="Keine Briefpapiere gefunden" icon="i-heroicons-document" />
</template>
</UTable> </UTable>
</UDashboardPanelContent> </UDashboardPanelContent>

View File

@@ -163,7 +163,6 @@ const getDocLabel = (type) => {
:data="texttemplates" :data="texttemplates"
:loading="loading" :loading="loading"
v-model:expand="expand" v-model:expand="expand"
:empty="{ icon: 'i-heroicons-document-text', label: 'Keine Textvorlagen gefunden' }"
:columns="normalizeTableColumns([ :columns="normalizeTableColumns([
{ key: 'name', label: 'Bezeichnung' }, { key: 'name', label: 'Bezeichnung' },
{ key: 'documentType', label: 'Verwendung' }, { key: 'documentType', label: 'Verwendung' },
@@ -233,6 +232,9 @@ const getDocLabel = (type) => {
</div> </div>
</div> </div>
</template> </template>
<template #empty>
<TableEmptyState label="Keine Textvorlagen gefunden" icon="i-heroicons-document-text" />
</template>
</UTable> </UTable>
</UDashboardPanelContent> </UDashboardPanelContent>

View File

@@ -79,8 +79,11 @@
:columns="normalizeTableColumns(columns)" :columns="normalizeTableColumns(columns)"
:loading="pending" :loading="pending"
:on-select="(row) => navigateTo(`/staff/profiles/${row.original?.id || row.id}`)" :on-select="(row) => navigateTo(`/staff/profiles/${row.original?.id || row.id}`)"
:empty="{ icon: 'i-heroicons-circle-stack-20-solid', label: 'Keine Mitarbeiterprofile gefunden' }" >
/> <template #empty>
<TableEmptyState label="Keine Mitarbeiterprofile gefunden" />
</template>
</UTable>
</template> </template>
<style scoped> <style scoped>

View File

@@ -296,7 +296,6 @@ await setupPage()
<UTable <UTable
v-if="workingTimeInfo" v-if="workingTimeInfo"
:data="workingTimeInfo.spans" :data="workingTimeInfo.spans"
:empty="{ icon: 'i-heroicons-circle-stack-20-solid', label: 'Keine Anwesenheiten' }"
:columns="normalizeTableColumns([ :columns="normalizeTableColumns([
{ key: 'status', label: 'Status' }, { key: 'status', label: 'Status' },
{ key: 'startedAt', label: 'Start' }, { key: 'startedAt', label: 'Start' },
@@ -329,6 +328,9 @@ await setupPage()
<template #type-cell="{ row }"> <template #type-cell="{ row }">
{{ row.original.type.charAt(0).toUpperCase() + row.original.type.slice(1).replace('_', ' ') }} {{ row.original.type.charAt(0).toUpperCase() + row.original.type.slice(1).replace('_', ' ') }}
</template> </template>
<template #empty>
<TableEmptyState label="Keine Anwesenheiten" />
</template>
</UTable> </UTable>
</UDashboardPanel> </UDashboardPanel>
</div> </div>

View File

@@ -241,7 +241,6 @@ onMounted(async () => {
{ key: 'type', label: 'Typ' }, { key: 'type', label: 'Typ' },
{ key: 'description', label: 'Beschreibung' }, { key: 'description', label: 'Beschreibung' },
])" ])"
:empty="{ icon: 'i-heroicons-circle-stack-20-solid', label: 'Keine Zeiten anzuzeigen' }"
> >
<template #state-cell="{ row }"> <template #state-cell="{ row }">
<UBadge v-if="row.original.state === 'approved'" color="green" variant="subtle">Genehmigt</UBadge> <UBadge v-if="row.original.state === 'approved'" color="green" variant="subtle">Genehmigt</UBadge>
@@ -285,6 +284,9 @@ onMounted(async () => {
<span v-else-if="row.original.type === 'sick'">{{ row.original.sick_reason }}</span> <span v-else-if="row.original.type === 'sick'">{{ row.original.sick_reason }}</span>
<span v-else>{{ row.original.description }}</span> <span v-else>{{ row.original.description }}</span>
</template> </template>
<template #empty>
<TableEmptyState label="Keine Zeiten anzuzeigen" />
</template>
</UTable> </UTable>
</UCard> </UCard>

View File

@@ -446,7 +446,6 @@ const isDistinctFilterActive = (columnKey) => {
style="height: 85dvh" style="height: 85dvh"
:ui="{ divide: 'divide-gray-200 dark:divide-gray-800' }" :ui="{ divide: 'divide-gray-200 dark:divide-gray-800' }"
:on-select="(row) => router.push(`/standardEntity/${type}/show/${row.original.id}`)" :on-select="(row) => router.push(`/standardEntity/${type}/show/${row.original.id}`)"
:empty="`Keine ${dataType.label} anzuzeigen`"
> >
<template <template
v-for="column in dataType.templateColumns.filter(i => !i.disabledInTable)" v-for="column in dataType.templateColumns.filter(i => !i.disabledInTable)"
@@ -566,6 +565,9 @@ const isDistinctFilterActive = (columnKey) => {
</span> </span>
</template> </template>
<template #empty>
<TableEmptyState :label="`Keine ${dataType.label} anzuzeigen`" />
</template>
</UTable> </UTable>
<UCard <UCard
class="w-1/3 mx-auto mt-10" class="w-1/3 mx-auto mt-10"

View File

@@ -73,7 +73,6 @@ const filteredRows = computed(() => {
</UDashboardToolbar> </UDashboardToolbar>
<UTable <UTable
:data="filteredRows" :data="filteredRows"
:empty="{ icon: 'i-heroicons-circle-stack-20-solid', label: `Keine Tickets anzuzeigen` }"
:on-select="(i) => router.push(`/support/${i.id}`)" :on-select="(i) => router.push(`/support/${i.id}`)"
:columns="normalizeTableColumns([{key:'created_at',label:'Datum'}, ...profileStore.currentTenant === 5 ? [{key:'tenant',label:'Tenant'}] : [],{key:'status',label:'Status'},{key:'title',label:'Titel'},{key:'created_by',label:'Ersteller'},{key:'ticketmessages',label:'Nachrichten'}])" :columns="normalizeTableColumns([{key:'created_at',label:'Datum'}, ...profileStore.currentTenant === 5 ? [{key:'tenant',label:'Tenant'}] : [],{key:'status',label:'Status'},{key:'title',label:'Titel'},{key:'created_by',label:'Ersteller'},{key:'ticketmessages',label:'Nachrichten'}])"
> >
@@ -93,6 +92,9 @@ const filteredRows = computed(() => {
<template #ticketmessages-cell="{ row }"> <template #ticketmessages-cell="{ row }">
{{row.original.ticketmessages.length}} {{row.original.ticketmessages.length}}
</template> </template>
<template #empty>
<TableEmptyState :label="`Keine Tickets anzuzeigen`" />
</template>
</UTable> </UTable>
</template> </template>

View File

@@ -461,7 +461,6 @@ onMounted(async () => {
:data="filteredTasks" :data="filteredTasks"
:columns="normalizedListColumns" :columns="normalizedListColumns"
:on-select="(task) => openTaskViaRoute(task)" :on-select="(task) => openTaskViaRoute(task)"
:empty="{ icon: 'i-heroicons-circle-stack-20-solid', label: 'Keine Aufgaben anzuzeigen' }"
> >
<template #actions-cell="{ row }"> <template #actions-cell="{ row }">
<UButton <UButton
@@ -490,13 +489,19 @@ onMounted(async () => {
<template #plant-cell="{ row }"> <template #plant-cell="{ row }">
{{ getEntityLabel(plantOptions, row.original.plant?.id || row.original.plant) || "-" }} {{ getEntityLabel(plantOptions, row.original.plant?.id || row.original.plant) || "-" }}
</template> </template>
<template #empty>
<TableEmptyState label="Keine Aufgaben anzuzeigen" />
</template>
</UTable> </UTable>
<UTable <UTable
v-else v-else
:data="[]" :data="[]"
:columns="normalizedListColumns" :columns="normalizedListColumns"
:empty="{ icon: 'i-heroicons-circle-stack-20-solid', label: 'Keine Aufgaben anzuzeigen' }" >
/> <template #empty>
<TableEmptyState label="Keine Aufgaben anzuzeigen" />
</template>
</UTable>
</UDashboardPanelContent> </UDashboardPanelContent>
<UModal v-model:open="isModalOpen" :prevent-close="saving || deleting"> <UModal v-model:open="isModalOpen" :prevent-close="saving || deleting">