diff --git a/paperless-backend/src/database/entities/user-settings.entity.ts b/paperless-backend/src/database/entities/user-settings.entity.ts index 4ae84e3..3259e3f 100644 --- a/paperless-backend/src/database/entities/user-settings.entity.ts +++ b/paperless-backend/src/database/entities/user-settings.entity.ts @@ -28,4 +28,7 @@ export class UserSettings { @Column({ type: 'text', nullable: true }) MailSignatureHtml!: string | null; + + @Column({ type: 'int', nullable: true }) + DefaultLabelTemplateId!: number | null; } diff --git a/paperless-backend/src/user-settings/user-settings.service.ts b/paperless-backend/src/user-settings/user-settings.service.ts index 928efab..b271e80 100644 --- a/paperless-backend/src/user-settings/user-settings.service.ts +++ b/paperless-backend/src/user-settings/user-settings.service.ts @@ -17,6 +17,7 @@ export interface UserSettingsDto { smtpFrom: string | null; smtpFromName: string | null; mailSignatureHtml: string | null; + defaultLabelTemplateId: number | null; } @Injectable() @@ -78,6 +79,7 @@ export class UserSettingsService { smtpFrom?: string | null; smtpFromName?: string | null; mailSignatureHtml?: string | null; + defaultLabelTemplateId?: number | null; }, ): Promise { let entity = await this.repo.findOne({ where: { UserId: userId } }); @@ -95,6 +97,7 @@ export class UserSettingsService { if (data.smtpFrom !== undefined) entity.SmtpFrom = data.smtpFrom; if (data.smtpFromName !== undefined) entity.SmtpFromName = data.smtpFromName; if (data.mailSignatureHtml !== undefined) entity.MailSignatureHtml = data.mailSignatureHtml; + if (data.defaultLabelTemplateId !== undefined) entity.DefaultLabelTemplateId = data.defaultLabelTemplateId; await this.repo.save(entity); return this.toDto(entity); @@ -164,6 +167,7 @@ export class UserSettingsService { smtpFrom: entity?.SmtpFrom ?? null, smtpFromName: entity?.SmtpFromName ?? null, mailSignatureHtml: entity?.MailSignatureHtml ?? null, + defaultLabelTemplateId: entity?.DefaultLabelTemplateId ?? null, }; } } diff --git a/paperless-frontend/src/api/userSettings.ts b/paperless-frontend/src/api/userSettings.ts index c128b7f..6b39dae 100644 --- a/paperless-frontend/src/api/userSettings.ts +++ b/paperless-frontend/src/api/userSettings.ts @@ -9,6 +9,7 @@ export interface UserSettingsData { smtpFrom: string | null; smtpFromName: string | null; mailSignatureHtml: string | null; + defaultLabelTemplateId: number | null; } export interface SenderOption { diff --git a/paperless-frontend/src/pages/InboxPage.tsx b/paperless-frontend/src/pages/InboxPage.tsx index 5648aee..4d45893 100644 --- a/paperless-frontend/src/pages/InboxPage.tsx +++ b/paperless-frontend/src/pages/InboxPage.tsx @@ -36,6 +36,7 @@ import type { ColumnsType } from 'antd/es/table'; import { inboxApi, type InboxBarcode, type InboxFile } from '../api/inbox'; import { barcodeTemplatesApi, type BarcodeTemplate } from '../api/barcode-templates'; import { labelPrintAgentApi } from '../api/labelPrintAgent'; +import { userSettingsApi } from '../api/userSettings'; const { Title } = Typography; @@ -150,14 +151,22 @@ export default function InboxPage() { const openPrintDialog = async () => { try { - const all = await barcodeTemplatesApi.list(); - setLabelTemplates(all.filter((t) => t.LabelEnabled)); + const [all, settings] = await Promise.all([ + barcodeTemplatesApi.list(), + userSettingsApi.get(), + ]); + const enabled = all.filter((t) => t.LabelEnabled); + setLabelTemplates(enabled); + const defaultId = settings.defaultLabelTemplateId; + const defaultTemplate = defaultId != null + ? (enabled.find((t) => t.Id === defaultId) ?? null) + : null; + setSelectedTemplate(defaultTemplate); + setFieldValues(buildInitialFieldValues(defaultTemplate)); } catch { message.error('Vorlagen konnten nicht geladen werden'); return; } - setSelectedTemplate(null); - setFieldValues({}); setLabelCount(1); setPrintDialogOpen(true); }; diff --git a/paperless-frontend/src/pages/UserSettingsPage.tsx b/paperless-frontend/src/pages/UserSettingsPage.tsx index f56fa0a..6ef89a5 100644 --- a/paperless-frontend/src/pages/UserSettingsPage.tsx +++ b/paperless-frontend/src/pages/UserSettingsPage.tsx @@ -1,11 +1,66 @@ import { useEffect, useRef, useState } from 'react'; -import { Button, Card, Form, Input, InputNumber, Space, Switch, Tabs, Typography, message } from 'antd'; +import { Button, Card, Form, Input, InputNumber, Select, Space, Switch, Tabs, Typography, message } from 'antd'; import { CheckCircleOutlined, CloseCircleOutlined, LoadingOutlined } from '@ant-design/icons'; import { WysiwygEditor, type WysiwygEditorHandle } from '../components/WysiwygEditor'; import { userSettingsApi } from '../api/userSettings'; +import { barcodeTemplatesApi, type BarcodeTemplate } from '../api/barcode-templates'; const { Title } = Typography; +function LabelSettingsTab() { + const [templates, setTemplates] = useState([]); + const [selectedId, setSelectedId] = useState(null); + const [loading, setLoading] = useState(true); + const [saving, setSaving] = useState(false); + + useEffect(() => { + Promise.all([userSettingsApi.get(), barcodeTemplatesApi.list()]) + .then(([settings, all]) => { + setTemplates(all.filter((t) => t.LabelEnabled)); + setSelectedId(settings.defaultLabelTemplateId); + }) + .catch(() => message.error('Einstellungen konnten nicht geladen werden')) + .finally(() => setLoading(false)); + }, []); + + const handleSave = async () => { + setSaving(true); + try { + await userSettingsApi.update({ defaultLabelTemplateId: selectedId }); + message.success('Einstellungen gespeichert'); + } catch { + message.error('Speichern fehlgeschlagen'); + } finally { + setSaving(false); + } + }; + + if (loading) return null; + + return ( +
+ +