Feat(Gotenberg): Opt-in alternative pdf generation for modern CSS (#184)

* WIP(gotenberg): add pdf generation abstraction and UI

* feat(pdf): settings validate(clien+server) & save

* fix(gotenberg): Use correct default papersize
chore(gotengberg): Remove unused GOTENBERG_MARGINS env from .env

* style(gotenberg): fix linter/styling issues

* fix(pdf): use pdf config policy

* fix: revert accidental capitalization in mail config vue

* Update composer, remove whitespace typo

* Fix small typos

* fix cookie/env issue

* Add gotenberg to .dev, move admin menu item up
This commit is contained in:
Tim van Osch
2025-05-04 02:10:15 +02:00
committed by GitHub
parent 8a9392e400
commit bf40f792c2
27 changed files with 1512 additions and 597 deletions

View File

@@ -0,0 +1,72 @@
<template>
<BaseSettingCard
:title="$t('settings.pdf.pdf_configuration')"
:description="$t('settings.pdf.section_description')"
>
<div v-if="pdfDriverStore && pdfDriverStore.pdfDriverConfig" class="mt-14">
<component
:is="pdfDriver"
:config-data="pdfDriverStore.pdfDriverConfig"
:is-saving="isSaving"
:drivers="pdfDriverStore.pdf_drivers"
:is-fetching-initial-data="isFetchingInitialData"
@on-change-driver="(val) => changeDriver(val)"
@submit-data="saveConfig"
>
</component>
</div>
</BaseSettingCard>
</template>
<script setup>
import GotenbergDriver from '@/scripts/admin/views/settings/pdf-driver/GotenbergDriver.vue';
import DomPDFDriver from '@/scripts/admin/views/settings/pdf-driver/DomPDFDriver.vue';
import { ref, computed } from 'vue'
import { useI18n } from 'vue-i18n'
import { usePDFDriverStore } from '@/scripts/admin/stores/pdf-driver'
const emit = defineEmits(['submit-data', 'on-change-driver'])
let isFetchingInitialData = ref(false)
let isSaving = ref(false)
const pdfDriverStore = usePDFDriverStore();
const { t } = useI18n();
function changeDriver(value) {
pdfDriverStore.pdf_driver = value
pdfDriverStore.pdfDriverConfig.pdf_driver = value
}
async function loadData() {
isFetchingInitialData.value = true
await Promise.all([
pdfDriverStore.fetchDrivers(),
pdfDriverStore.fetchConfig(),
])
isFetchingInitialData.value = false
}
loadData();
async function saveConfig(value) {
try {
isSaving.value = true
await pdfDriverStore.updateConfig(value)
} catch (e) {
console.error(e)
} finally {
isSaving.value = false
return false
}
}
const pdfDriver = computed(() => {
switch (pdfDriverStore.pdf_driver) {
case 'dompdf':
return DomPDFDriver
case 'gotenberg':
return GotenbergDriver
default:
return DomPDFDriver
}
})
</script>