From 2292e4ff9e49454f15e48bdffbc91e2d49821170 Mon Sep 17 00:00:00 2001 From: Your Name Date: Fri, 20 Feb 2026 15:07:18 +0200 Subject: [PATCH] feat: entry templates pinia store --- src/stores/entryTemplates.ts | 53 ++++++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 src/stores/entryTemplates.ts diff --git a/src/stores/entryTemplates.ts b/src/stores/entryTemplates.ts new file mode 100644 index 0000000..c78c564 --- /dev/null +++ b/src/stores/entryTemplates.ts @@ -0,0 +1,53 @@ +import { defineStore } from 'pinia' +import { ref } from 'vue' +import { invoke } from '@tauri-apps/api/core' +import { handleInvokeError } from '../utils/errorHandler' + +export interface EntryTemplate { + id?: number + name: string + project_id: number + task_id?: number + description?: string + duration: number + billable: number + created_at?: string +} + +export const useEntryTemplatesStore = defineStore('entryTemplates', () => { + const templates = ref([]) + const loading = ref(false) + + async function fetchTemplates() { + loading.value = true + try { + templates.value = await invoke('get_entry_templates') + } catch (error) { + handleInvokeError(error, 'Failed to fetch entry templates', () => fetchTemplates()) + } finally { + loading.value = false + } + } + + async function createTemplate(template: Omit): Promise { + try { + const id = await invoke('create_entry_template', { template }) + templates.value.push({ ...template, id: Number(id) }) + return Number(id) + } catch (error) { + handleInvokeError(error, 'Failed to create template') + return null + } + } + + async function deleteTemplate(id: number) { + try { + await invoke('delete_entry_template', { id }) + templates.value = templates.value.filter(t => t.id !== id) + } catch (error) { + handleInvokeError(error, 'Failed to delete template') + } + } + + return { templates, loading, fetchTemplates, createTemplate, deleteTemplate } +})