fix: handle object-format select_options from Paperless for Freigabe field
Build and Push Multi-Platform Images / build-and-push (push) Successful in 36s
Build and Push Multi-Platform Images / build-and-push (push) Successful in 36s
Paperless may return extra_data.select_options as an array of objects
{id, label} instead of plain strings. This caused React error #31
when Ant Design tried to render an object as a child in the Select and
Table components.
- Backend: coerce option items to {id: string, label: string} regardless
of whether Paperless returns strings or objects
- Frontend: normalize cf.value to a plain string before rendering or
storing in state, guarding against object-typed values
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -98,9 +98,19 @@ export class FreigabeService {
|
|||||||
const field = (fields as any[]).find((f: any) => f.id === FREIGABE_FIELD_ID);
|
const field = (fields as any[]).find((f: any) => f.id === FREIGABE_FIELD_ID);
|
||||||
if (!field) return [];
|
if (!field) return [];
|
||||||
|
|
||||||
const options: string[] = field.extra_data?.select_options ?? [];
|
const rawOptions: any[] = field.extra_data?.select_options ?? [];
|
||||||
return options
|
return rawOptions
|
||||||
.filter((o) => o !== null && o !== undefined && o !== '')
|
.filter((o) => o !== null && o !== undefined && o !== '')
|
||||||
.map((o) => ({ id: o, label: o }));
|
.map((o) => {
|
||||||
|
if (typeof o === 'object') {
|
||||||
|
// Paperless kann select_options als Objekte liefern
|
||||||
|
return {
|
||||||
|
id: String(o.id ?? o.value ?? o.label ?? ''),
|
||||||
|
label: String(o.label ?? o.name ?? o.id ?? ''),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
return { id: String(o), label: String(o) };
|
||||||
|
})
|
||||||
|
.filter((o) => o.id !== '');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -67,19 +67,24 @@ export default function FreigabePage() {
|
|||||||
return correspondents.find((c) => c.id === id)?.name ?? String(id);
|
return correspondents.find((c) => c.id === id)?.name ?? String(id);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const toCfString = (value: any): string | null => {
|
||||||
|
if (value === null || value === undefined || value === '') return null;
|
||||||
|
if (typeof value === 'object') return String(value?.id ?? value?.value ?? value?.label ?? '') || null;
|
||||||
|
return String(value);
|
||||||
|
};
|
||||||
|
|
||||||
const getFreigabeValue = (doc: FreigabeDocument) => {
|
const getFreigabeValue = (doc: FreigabeDocument) => {
|
||||||
const cf = doc.custom_fields?.find((f) => f.field === FREIGABE_FIELD_ID);
|
const cf = doc.custom_fields?.find((f) => f.field === FREIGABE_FIELD_ID);
|
||||||
if (!cf || cf.value === null || cf.value === '' || cf.value === undefined) {
|
const cfStr = toCfString(cf?.value);
|
||||||
return <Tag color="warning">Nicht gesetzt</Tag>;
|
if (!cfStr) return <Tag color="warning">Nicht gesetzt</Tag>;
|
||||||
}
|
const opt = freigabeOptions.find((o) => o.id === cfStr);
|
||||||
const opt = freigabeOptions.find((o) => String(o.id) === String(cf.value));
|
return <Tag color="success">{opt?.label ?? cfStr}</Tag>;
|
||||||
return <Tag color="success">{opt?.label ?? String(cf.value)}</Tag>;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const openModal = (doc: FreigabeDocument) => {
|
const openModal = (doc: FreigabeDocument) => {
|
||||||
const cf = doc.custom_fields?.find((f) => f.field === FREIGABE_FIELD_ID);
|
const cf = doc.custom_fields?.find((f) => f.field === FREIGABE_FIELD_ID);
|
||||||
setSelectedDoc(doc);
|
setSelectedDoc(doc);
|
||||||
setSelectedValue(cf?.value ?? null);
|
setSelectedValue(toCfString(cf?.value));
|
||||||
setModalOpen(true);
|
setModalOpen(true);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user