Fix Banking and Profiles
All checks were successful
Build and Push Docker Images / build-backend (push) Successful in 14s
Build and Push Docker Images / build-frontend (push) Successful in 59s

This commit is contained in:
2026-03-23 08:29:54 +01:00
parent e0e99ba6f5
commit 4db753d34a
2 changed files with 54 additions and 21 deletions

View File

@@ -582,20 +582,20 @@ setup()
<div class="flex gap-1"> <div class="flex gap-1">
<USelectMenu <USelectMenu
class="w-full" class="w-full"
:options="accounts" :items="accounts"
value-attribute="id" value-key="id"
option-attribute="label" label-key="label"
v-model="accountToSave" v-model="accountToSave"
searchable :search-input="{ placeholder: 'Konto suchen...' }"
:search-attributes="['number','label']" :filter-fields="['number','label']"
placeholder="Konto suchen..." placeholder="Konto suchen..."
> >
<template #label> <template #default>
<span v-if="accountToSave" <span v-if="accountToSave"
class="truncate">{{ accounts.find(i => i.id === accountToSave).number }} - {{ accounts.find(i => i.id === accountToSave).label }}</span> class="truncate">{{ accounts.find(i => i.id === accountToSave).number }} - {{ accounts.find(i => i.id === accountToSave).label }}</span>
<span v-else>Direkt verbuchen...</span> <span v-else>Direkt verbuchen...</span>
</template> </template>
<template #option="{option}"> <template #item-label="{ item: option }">
<span class="font-mono text-xs text-gray-500 mr-2">{{ option.number }}</span> {{ option.label }} <span class="font-mono text-xs text-gray-500 mr-2">{{ option.number }}</span> {{ option.label }}
</template> </template>
</USelectMenu> </USelectMenu>
@@ -620,21 +620,21 @@ setup()
<div v-if="showMoreWithoutRecipe" <div v-if="showMoreWithoutRecipe"
class="mt-4 p-3 bg-gray-50 dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 grid grid-cols-1 md:grid-cols-3 gap-3"> class="mt-4 p-3 bg-gray-50 dark:bg-gray-800 rounded-lg border border-gray-200 dark:border-gray-700 grid grid-cols-1 md:grid-cols-3 gap-3">
<USelectMenu :options="ownaccounts" value-attribute="id" option-attribute="name" v-model="ownAccountToSave" <USelectMenu :items="ownaccounts" value-key="id" label-key="name" v-model="ownAccountToSave"
searchable placeholder="Eigenes Konto"> :search-input="{ placeholder: 'Eigenes Konto' }" :filter-fields="['number','name']" placeholder="Eigenes Konto">
<template #label> <template #default>
{{ ownAccountToSave ? ownaccounts.find(i => i.id === ownAccountToSave).name : 'Eigenes Konto' }} {{ ownAccountToSave ? ownaccounts.find(i => i.id === ownAccountToSave).name : 'Eigenes Konto' }}
</template> </template>
</USelectMenu> </USelectMenu>
<USelectMenu :options="customers" value-attribute="id" option-attribute="name" <USelectMenu :items="customers" value-key="id" label-key="name"
v-model="customerAccountToSave" searchable placeholder="Kunde (Guthaben)"> v-model="customerAccountToSave" :search-input="{ placeholder: 'Kunde (Guthaben)' }" :filter-fields="['name','customerNumber']" placeholder="Kunde (Guthaben)">
<template #label> <template #default>
{{ customerAccountToSave ? customers.find(i => i.id === customerAccountToSave).name : 'Kunde' }} {{ customerAccountToSave ? customers.find(i => i.id === customerAccountToSave).name : 'Kunde' }}
</template> </template>
</USelectMenu> </USelectMenu>
<USelectMenu :options="vendors" value-attribute="id" option-attribute="name" v-model="vendorAccountToSave" <USelectMenu :items="vendors" value-key="id" label-key="name" v-model="vendorAccountToSave"
searchable placeholder="Lieferant (Guthaben)"> :search-input="{ placeholder: 'Lieferant (Guthaben)' }" :filter-fields="['name','vendorNumber']" placeholder="Lieferant (Guthaben)">
<template #label> <template #default>
{{ vendorAccountToSave ? vendors.find(i => i.id === vendorAccountToSave).name : 'Lieferant' }} {{ vendorAccountToSave ? vendors.find(i => i.id === vendorAccountToSave).name : 'Lieferant' }}
</template> </template>
</USelectMenu> </USelectMenu>

View File

@@ -1,11 +1,39 @@
<script setup> <script setup>
const router = useRouter() const router = useRouter()
const toast = useToast()
const items = ref([]) const items = ref([])
const pending = ref(true)
const mapProfileRow = (user) => {
const profile = user?.profile || {}
return {
id: profile?.id || null,
employee_number: profile?.employee_number || '',
full_name: profile?.full_name || user?.full_name || user?.email || 'Ohne Profil',
email: user?.email || profile?.email || ''
}
}
const setupPage = async () => { const setupPage = async () => {
items.value = (await useNuxtApp().$api("/api/tenant/users")).users pending.value = true
items.value = items.value.map(i => i.profile)
try {
const response = await useNuxtApp().$api("/api/tenant/users")
items.value = (response?.users || [])
.map(mapProfileRow)
.filter((item) => !!item.id)
} catch (err) {
console.error('[staff/profiles/index]', err)
items.value = []
toast.add({
title: 'Profile konnten nicht geladen werden',
color: 'error'
})
} finally {
pending.value = false
}
} }
setupPage() setupPage()
@@ -31,7 +59,7 @@
<UDashboardNavbar title="Benutzer Einstellungen"> <UDashboardNavbar title="Benutzer Einstellungen">
<template #right> <template #right>
<UButton <UButton
@click="router.push(`/profiles/create`)" @click="router.push(`/staff/profiles/create`)"
disabled disabled
> >
+ Mitarbeiter + Mitarbeiter
@@ -41,9 +69,14 @@
<UTable <UTable
:data="items" :data="items"
:columns="normalizeTableColumns(columns)" :columns="normalizeTableColumns(columns)"
:on-select="(i) => navigateTo(`/staff/profiles/${i.id}`)" :loading="pending"
:on-select="(row) => navigateTo(`/staff/profiles/${row.original?.id || row.id}`)"
> >
<template #empty>
<div class="py-10 text-center text-sm text-gray-500">
Keine Mitarbeiterprofile gefunden.
</div>
</template>
</UTable> </UTable>
</template> </template>