The dodavatele modal is now an exact mirror of the customers modal (minus the PDF field-order picker): Nazev+ARES, Ulice, Mesto+PSC, Zeme, ICO+ARES, DIC, and the same "Vlastni pole" editor (maxWidth md). Two migrations on sklad_suppliers: - structured street/city/postal_code/country replace the free-text address blob (best-effort split: street / PSC regex / city) - custom_fields LONGTEXT replaces contact_person/email/phone/notes; existing values are preserved as labeled custom fields The encode/decode of the custom_fields blob is shared with customers via the new utils/custom-fields.ts. The PO PDF supplier block renders the structured address + custom-field lines like the customer block; the supplier picker/detail selects and types follow. Legacy clients sending the dropped keys are silently stripped (tested). Suppliers list shows Ulice/Mesto instead of the dropped contact columns; search covers name/ico/city. BREAKING CHANGE: sklad_suppliers.address, contact_person, email, phone, notes columns dropped (data migrated); deploy must run prisma migrate deploy + generate. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
49 lines
1.6 KiB
TypeScript
49 lines
1.6 KiB
TypeScript
/**
|
|
* Shared encode/decode for the custom_fields JSON blob carried by customers
|
|
* AND warehouse suppliers (one column, PHP-compatible format:
|
|
* `{ "fields": [{name, value, showLabel}], "field_order": [...] }`).
|
|
* Lifted from routes/admin/customers.ts when suppliers gained the same
|
|
* "Vlastní pole" model (2026-06).
|
|
*/
|
|
|
|
/** Encode custom_fields + field_order into a single JSON blob (matching PHP format). */
|
|
export function encodeCustomFields(
|
|
fields: unknown,
|
|
fieldOrder: unknown,
|
|
): string | null {
|
|
const f = Array.isArray(fields) ? fields : [];
|
|
const o = Array.isArray(fieldOrder) ? fieldOrder : [];
|
|
if (f.length === 0 && o.length === 0) return null;
|
|
return JSON.stringify({ fields: f, field_order: o });
|
|
}
|
|
|
|
/** Decode the custom_fields JSON blob into separate fields + field_order for the frontend. */
|
|
export function decodeCustomFields(raw: string | null): {
|
|
custom_fields: unknown[];
|
|
field_order: string[];
|
|
} {
|
|
if (!raw) return { custom_fields: [], field_order: [] };
|
|
try {
|
|
const parsed = JSON.parse(raw);
|
|
// PHP format: { fields: [...], field_order: [...] }
|
|
if (
|
|
parsed &&
|
|
typeof parsed === "object" &&
|
|
!Array.isArray(parsed) &&
|
|
"fields" in parsed
|
|
) {
|
|
return {
|
|
custom_fields: parsed.fields || [],
|
|
field_order: parsed.field_order || [],
|
|
};
|
|
}
|
|
// Legacy TS format: raw array
|
|
if (Array.isArray(parsed)) {
|
|
return { custom_fields: parsed, field_order: [] };
|
|
}
|
|
return { custom_fields: [], field_order: [] };
|
|
} catch {
|
|
return { custom_fields: [], field_order: [] };
|
|
}
|
|
}
|