Files
InvoiceShelf/resources/scripts/features/company/settings/components/InvoicesTabRetrospective.vue
Darko Gjorgjijoski f3ab0f22fc chore(frontend): fix ESLint, add Pint+ESLint pre-commit hook, centralize v-html
Fix the broken ESLint setup: add vue-eslint-parser and @typescript-eslint/parser
and wire the TS parser into eslint.config.mjs so .ts and <script lang=ts> parse
(was failing outright). Clear the resulting backlog to a clean 0/0 baseline —
fix genuine issues, relax two intentional-pattern rules (multi-word-component-names,
no-required-prop-with-default).

Add a committed .githooks/pre-commit (enabled via core.hooksPath, auto-set by the
prepare script) that runs Pint on staged PHP and ESLint --max-warnings 0 on staged
resources/scripts JS/TS/Vue, blocking on failure. Add composer/npm lint scripts and
document the gate in CLAUDE.md.

Replace every scattered v-html with a single audited BaseSanitizedHtml component
that DOMPurify-sanitizes its input (new utils/markdown.ts sanitizeHtml), so
server/registry-provided HTML is actually sanitized and vue/no-v-html stays enabled
everywhere but one reviewed sink.
2026-06-11 11:11:12 +02:00

60 lines
1.8 KiB
Vue

<script setup lang="ts">
import { reactive, computed } from 'vue'
import { useI18n } from 'vue-i18n'
import { useCompanyStore } from '@/scripts/stores/company.store'
import { useGlobalStore } from '@/scripts/stores/global.store'
const { t } = useI18n()
const companyStore = useCompanyStore()
const globalStore = useGlobalStore()
const settingsForm = reactive<{ retrospective_edits: string | null }>({
retrospective_edits:
companyStore.selectedCompanySettings.retrospective_edits ?? null,
})
const retrospectiveEditOptions = [
{ key: 'settings.customization.invoices.allow', value: 'allow' },
{ key: 'settings.customization.invoices.disable_on_invoice_partial_paid', value: 'disable_on_invoice_partial_paid' },
{ key: 'settings.customization.invoices.disable_on_invoice_paid', value: 'disable_on_invoice_paid' },
{ key: 'settings.customization.invoices.disable_on_invoice_sent', value: 'disable_on_invoice_sent' },
]
async function submitForm(): Promise<void> {
const data = {
settings: {
...settingsForm,
},
}
await companyStore.updateCompanySettings({
data,
message: 'settings.customization.invoices.invoice_settings_updated',
})
}
</script>
<template>
<BaseSettingCard
:title="$t('settings.customization.invoices.retrospective_edits')"
:description="
$t('settings.customization.invoices.retrospective_edits_description')
"
>
<BaseInputGroup required>
<BaseRadio
v-for="option in retrospectiveEditOptions"
:id="option.value"
:key="option.value"
v-model="settingsForm.retrospective_edits"
:label="$t(option.key)"
size="sm"
name="retrospective_edits"
:value="option.value"
class="mt-2"
@update:model-value="submitForm"
/>
</BaseInputGroup>
</BaseSettingCard>
</template>