From 87aaa28d92c14e202acb437bdc22d6eb127f175e Mon Sep 17 00:00:00 2001 From: florianfederspiel Date: Mon, 10 Nov 2025 11:07:11 +0100 Subject: [PATCH 1/7] Redone Submit/approve Process --- composables/useStaffTime.ts | 16 ++++++++- pages/staff/time/index.vue | 72 ++++++++++++++++++++++++++++++------- 2 files changed, 75 insertions(+), 13 deletions(-) diff --git a/composables/useStaffTime.ts b/composables/useStaffTime.ts index 749166a..e495d6a 100644 --- a/composables/useStaffTime.ts +++ b/composables/useStaffTime.ts @@ -38,6 +38,20 @@ export function useStaffTime() { }) } + async function submit(id: string) { + return await $api(`/api/staff/time/${id}`, { + method: 'PUT', + body: { state: 'submitted' }, + }) + } + + async function approve(id: string) { + return await $api(`/api/staff/time/${id}`, { + method: 'PUT', + body: { state: 'approved' }, + }) + } + async function get(id: string) { return await $api(`/api/staff/time/${id}`, { method: 'GET' }) } @@ -50,5 +64,5 @@ export function useStaffTime() { return await $api(`/api/staff/time/${id}`, { method: 'PUT', body: data }) } - return { list, start, stop, get, create, update } + return { list, start, stop,submit,approve, get, create, update } } diff --git a/pages/staff/time/index.vue b/pages/staff/time/index.vue index 2ac58f1..ab119da 100644 --- a/pages/staff/time/index.vue +++ b/pages/staff/time/index.vue @@ -2,7 +2,7 @@ import { useStaffTime } from '~/composables/useStaffTime' import { useAuthStore } from '~/stores/auth' -const { list, start, stop } = useStaffTime() +const { list, start, stop, submit,approve } = useStaffTime() const auth = useAuthStore() const router = useRouter() @@ -51,6 +51,16 @@ function handleEdit(entry: any) { showModal.value = true } +async function handleSubmit(entry: any) { + await submit(entry.id) + await load() +} + +async function handleApprove(entry: any) { + await approve(entry.id) + await load() +} + onMounted(async () => { await loadUsers() await load() @@ -115,14 +125,19 @@ onMounted(async () => { /> - + + + + @@ -131,15 +146,15 @@ onMounted(async () => { From de32d72edad92dbdeb52e88559099e0c1761c752 Mon Sep 17 00:00:00 2001 From: florianfederspiel Date: Mon, 10 Nov 2025 11:42:20 +0100 Subject: [PATCH 2/7] Allowed Filters to stay Persistent, Introduced Extra Column for ActivePhase --- pages/standardEntity/[type]/index.vue | 24 ++++++++++++++++-------- stores/auth.ts | 7 ++++--- stores/data.js | 4 ++-- stores/temp.js | 8 ++++++-- 4 files changed, 28 insertions(+), 15 deletions(-) diff --git a/pages/standardEntity/[type]/index.vue b/pages/standardEntity/[type]/index.vue index bc0f445..24bb5fb 100644 --- a/pages/standardEntity/[type]/index.vue +++ b/pages/standardEntity/[type]/index.vue @@ -86,9 +86,7 @@ const changePage = (number) => { setupPage() } -const resetColum = (column) => { - columnsToFilter.value[column] = itemsMeta.value.distinctValues[column] -} + const changeSort = (column) => { if(sort.value.column === column) { @@ -131,7 +129,11 @@ const setupPage = async () => { items.value = data itemsMeta.value = meta if(!initialSetupDone.value){ - Object.keys(itemsMeta.value.distinctValues).forEach(distinctValue => { + Object.keys(tempStore.filters[type]).forEach((column) => { + columnsToFilter.value[column] = tempStore.filters[type][column] + }) + + Object.keys(itemsMeta.value.distinctValues).filter(i => !Object.keys(tempStore.filters[type]).includes(i)).forEach(distinctValue => { columnsToFilter.value[distinctValue] = itemsMeta.value.distinctValues[distinctValue] }) } @@ -144,8 +146,14 @@ const setupPage = async () => { setupPage() - - +const handleFilterChange = async (action,column) => { + if(action === 'reset') { + columnsToFilter.value[column] = itemsMeta.value.distinctValues[column] + } else if(action === 'change') { + tempStore.modifyFilter(type,column,columnsToFilter.value[column]) + } + setupPage() +} @@ -328,7 +336,7 @@ setupPage() :options="itemsMeta?.distinctValues?.[column.key]" v-model="columnsToFilter[column.key]" multiple - @change="setupPage" + @change="handleFilterChange('change', column.key)" searchable searchable-placeholder="Suche..." :search-attributes="[column.key]" @@ -367,7 +375,7 @@ setupPage() v-if="columnsToFilter[column.key]?.length !== itemsMeta.distinctValues?.[column.key]?.length && column.distinct" > diff --git a/stores/auth.ts b/stores/auth.ts index 052a66d..29f43dc 100644 --- a/stores/auth.ts +++ b/stores/auth.ts @@ -35,9 +35,6 @@ export const useAuthStore = defineStore("auth", { console.log("Auth initStore") await this.fetchMe() - const tempStore = useTempStore() - - if(this.profile.temp_config) tempStore.setStoredTempConfig(this.profile.temp_config) if(this.activeTenant > 0) { this.loading = false if(useCapacitor().getIsNative()) { @@ -99,6 +96,8 @@ export const useAuthStore = defineStore("auth", { async fetchMe(jwt= null) { console.log("Auth fetchMe") + const tempStore = useTempStore() + try { const me = await useNuxtApp().$api("/api/me", { headers: { Authorization: `Bearer ${jwt}`, @@ -117,6 +116,8 @@ export const useAuthStore = defineStore("auth", { this.profile = me.profile + if(this.profile.temp_config) tempStore.setStoredTempConfig(this.profile.temp_config) + if(me.activeTenant > 0) { this.activeTenant = me.activeTenant this.activeTenantData = me.tenants.find(i => i.id === me.activeTenant) diff --git a/stores/data.js b/stores/data.js index 5133bd1..0c65749 100644 --- a/stores/data.js +++ b/stores/data.js @@ -1088,9 +1088,9 @@ export const useDataStore = defineStore('data', () => { }, sortable: true },{ - key: "phase", + key: "active_phase", label: "Phase", - component: phase + distinct:true },{ key: "name", label: "Name", diff --git a/stores/temp.js b/stores/temp.js index 25c58f5..30a29b1 100644 --- a/stores/temp.js +++ b/stores/temp.js @@ -17,6 +17,7 @@ export const useTempStore = defineStore('temp', () => { columns: columns.value, pages: pages.value, settings: settings.value, + filters: filters.value } await useNuxtApp().$api(`/api/profiles/${auth.profile.id}`,{ @@ -30,6 +31,7 @@ export const useTempStore = defineStore('temp', () => { columns.value = config.columns pages.value = config.pages settings.value = config.settings + filters.value = config.filters } function modifySearchString(type,input) { @@ -42,8 +44,10 @@ export const useTempStore = defineStore('temp', () => { storeTempConfig() } - function modifyFilter(type,input) { - filters.value[type] = input + function modifyFilter(domain,type,input) { + if(!filters.value[domain]) filters.value[domain] = {} + + filters.value[domain][type] = input storeTempConfig() } From 1beb0dbaf32e4ed9c6350da9756cc078eed7aa56 Mon Sep 17 00:00:00 2001 From: florianfederspiel Date: Mon, 10 Nov 2025 11:44:27 +0100 Subject: [PATCH 3/7] Tidying --- stores/data.js | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/stores/data.js b/stores/data.js index 0c65749..f492d97 100644 --- a/stores/data.js +++ b/stores/data.js @@ -47,10 +47,7 @@ import sepaDate from "~/components/columnRenderings/sepaDate.vue"; // @ts-ignore export const useDataStore = defineStore('data', () => { - const profileStore = useProfileStore() - const toast = useToast() - const router = useRouter() - const modal = useModal() + const dataTypes = { tasks: { From d6dd0a160213d2f130351560040be394849f54f3 Mon Sep 17 00:00:00 2001 From: florianfederspiel Date: Mon, 10 Nov 2025 12:06:34 +0100 Subject: [PATCH 4/7] Fixed loading --- pages/standardEntity/[type]/index.vue | 9 +++++---- stores/temp.js | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/pages/standardEntity/[type]/index.vue b/pages/standardEntity/[type]/index.vue index 24bb5fb..5ef29a8 100644 --- a/pages/standardEntity/[type]/index.vue +++ b/pages/standardEntity/[type]/index.vue @@ -129,11 +129,11 @@ const setupPage = async () => { items.value = data itemsMeta.value = meta if(!initialSetupDone.value){ - Object.keys(tempStore.filters[type]).forEach((column) => { + Object.keys(tempStore.filters[type] || {}).forEach((column) => { columnsToFilter.value[column] = tempStore.filters[type][column] }) - Object.keys(itemsMeta.value.distinctValues).filter(i => !Object.keys(tempStore.filters[type]).includes(i)).forEach(distinctValue => { + Object.keys(itemsMeta.value.distinctValues).filter(i => !Object.keys(tempStore.filters[type] || {}).includes(i)).forEach(distinctValue => { columnsToFilter.value[distinctValue] = itemsMeta.value.distinctValues[distinctValue] }) } @@ -305,7 +305,7 @@ const handleFilterChange = async (action,column) => { sort-mode="manual" v-model:sort="sort" @update:sort="setupPage" - v-if="dataType && columns && items.length > 0" + v-if="dataType && columns && items.length > 0 && !loading" :rows="items" :columns="columns" class="w-full" @@ -436,7 +436,7 @@ const handleFilterChange = async (action,column) => {
{ +