mirror of
https://github.com/InvoiceShelf/InvoiceShelf.git
synced 2026-04-15 17:24:10 +00:00
customers, items, invoices, estimates, shared document form 77 files, 14451 lines. Typed layouts (CompanyLayout, AuthLayout, header, sidebar, company switcher), auth views (login, register, forgot/reset password), admin feature (dashboard, companies, users, settings with typed store), company features (dashboard with chart/ stats, customers CRUD, items CRUD, invoices CRUD with full store, estimates CRUD with full store), and shared document form components (items table, item row, totals, notes, tax popup, template select, exchange rate converter, calculation composable). Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
72 lines
2.0 KiB
Vue
72 lines
2.0 KiB
Vue
<template>
|
|
<div>
|
|
<label class="flex text-heading font-medium text-sm mb-2">
|
|
{{ $t('general.select_template') }}
|
|
<span class="text-sm text-red-500"> *</span>
|
|
</label>
|
|
<BaseButton
|
|
type="button"
|
|
class="flex justify-center w-full text-sm lg:w-auto hover:bg-surface-muted"
|
|
variant="gray"
|
|
@click="openTemplateModal"
|
|
>
|
|
<template #right="slotProps">
|
|
<BaseIcon name="PencilIcon" :class="slotProps.class" />
|
|
</template>
|
|
{{ templateName }}
|
|
</BaseButton>
|
|
</div>
|
|
</template>
|
|
|
|
<script setup lang="ts">
|
|
import { computed } from 'vue'
|
|
import { useI18n } from 'vue-i18n'
|
|
import type { DocumentFormData } from './use-document-calculations'
|
|
|
|
interface Props {
|
|
store: Record<string, unknown> & {
|
|
templates: Array<{ name: string; path?: string }>
|
|
}
|
|
storeProp: string
|
|
isMarkAsDefault?: boolean
|
|
}
|
|
|
|
const props = withDefaults(defineProps<Props>(), {
|
|
isMarkAsDefault: false,
|
|
})
|
|
|
|
const { t } = useI18n()
|
|
|
|
const formData = computed<DocumentFormData>(() => {
|
|
return props.store[props.storeProp] as DocumentFormData
|
|
})
|
|
|
|
const templateName = computed<string>(() => {
|
|
return formData.value.template_name ?? ''
|
|
})
|
|
|
|
function openTemplateModal(): void {
|
|
let markAsDefaultDescription = ''
|
|
if (props.storeProp === 'newEstimate') {
|
|
markAsDefaultDescription = t('estimates.mark_as_default_estimate_template_description')
|
|
} else if (props.storeProp === 'newInvoice') {
|
|
markAsDefaultDescription = t('invoices.mark_as_default_invoice_template_description')
|
|
}
|
|
|
|
const modalStore = (window as Record<string, unknown>).__modalStore as
|
|
| { openModal: (opts: Record<string, unknown>) => void }
|
|
| undefined
|
|
modalStore?.openModal({
|
|
title: t('general.choose_template'),
|
|
componentName: 'SelectTemplate',
|
|
data: {
|
|
templates: props.store.templates,
|
|
store: props.store,
|
|
storeProp: props.storeProp,
|
|
isMarkAsDefault: props.isMarkAsDefault,
|
|
markAsDefaultDescription,
|
|
},
|
|
})
|
|
}
|
|
</script>
|