Phase 4a: Feature modules — layouts, auth, admin, dashboard,

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>
This commit is contained in:
Darko Gjorgjijoski
2026-04-04 06:30:00 +02:00
parent e43e515614
commit 774b2614f0
77 changed files with 14451 additions and 0 deletions

View File

@@ -0,0 +1,52 @@
<template>
<div class="mb-6">
<div class="z-20 text-sm font-semibold leading-5 text-primary-400 float-right">
<NoteSelectPopup :type="type" @select="onSelectNote" />
</div>
<label class="text-heading font-medium mb-4 text-sm">
{{ $t('invoices.notes') }}
</label>
<BaseCustomInput
v-model="notes"
:content-loading="contentLoading"
:fields="fields"
class="mt-1"
/>
</div>
</template>
<script setup lang="ts">
import { computed } from 'vue'
import NoteSelectPopup from './NoteSelectPopup.vue'
import type { DocumentFormData } from './use-document-calculations'
import type { NoteType } from '../../../types/domain/note'
interface Props {
store: Record<string, unknown>
storeProp: string
fields: Record<string, unknown> | null
type: NoteType | string | null
contentLoading?: boolean
}
const props = withDefaults(defineProps<Props>(), {
fields: null,
type: null,
contentLoading: false,
})
const formData = computed<DocumentFormData>(() => {
return props.store[props.storeProp] as DocumentFormData
})
const notes = computed<string | null>({
get: () => formData.value.notes,
set: (value: string | null) => {
formData.value.notes = value
},
})
function onSelectNote(data: { notes: string }): void {
formData.value.notes = String(data.notes)
}
</script>