@xiwebdesign/xicms-core 6.4.5 → 6.4.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -135,13 +135,13 @@ function JsonField({
|
|
|
135
135
|
}) {
|
|
136
136
|
const [text, setText] = useState(() => JSON.stringify(value ?? null, null, 2));
|
|
137
137
|
const [error, setError] = useState(null);
|
|
138
|
-
const commit = () => {
|
|
138
|
+
const commit = (raw, opts) => {
|
|
139
139
|
try {
|
|
140
|
-
const parsed = JSON.parse(
|
|
140
|
+
const parsed = JSON.parse(raw);
|
|
141
141
|
if (schema) {
|
|
142
142
|
const res = schema.safeParse(parsed);
|
|
143
143
|
if (!res.success) {
|
|
144
|
-
setError("Voldoet niet aan het verwachte formaat van dit veld.");
|
|
144
|
+
if (!opts.silent) setError("Voldoet niet aan het verwachte formaat van dit veld.");
|
|
145
145
|
return;
|
|
146
146
|
}
|
|
147
147
|
setError(null);
|
|
@@ -151,11 +151,24 @@ function JsonField({
|
|
|
151
151
|
setError(null);
|
|
152
152
|
onCommit(parsed);
|
|
153
153
|
} catch {
|
|
154
|
-
setError("Geen geldige JSON.");
|
|
154
|
+
if (!opts.silent) setError("Geen geldige JSON.");
|
|
155
155
|
}
|
|
156
156
|
};
|
|
157
157
|
return /* @__PURE__ */ jsxs(FieldRow, { label: `${label} (JSON)`, hint: "Geavanceerd veld \u2014 wordt gecontroleerd v\xF3\xF3r opslaan.", children: [
|
|
158
|
-
/* @__PURE__ */ jsx(
|
|
158
|
+
/* @__PURE__ */ jsx(
|
|
159
|
+
Textarea,
|
|
160
|
+
{
|
|
161
|
+
rows: 6,
|
|
162
|
+
value: text,
|
|
163
|
+
onChange: (e) => {
|
|
164
|
+
setText(e.target.value);
|
|
165
|
+
commit(e.target.value, { silent: true });
|
|
166
|
+
},
|
|
167
|
+
onBlur: () => commit(text, { silent: false }),
|
|
168
|
+
spellCheck: false,
|
|
169
|
+
className: "font-mono text-xs"
|
|
170
|
+
}
|
|
171
|
+
),
|
|
159
172
|
error && /* @__PURE__ */ jsx("p", { className: "text-xs text-red-600", children: error })
|
|
160
173
|
] });
|
|
161
174
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/admin/blockEditors/GenericEditor.tsx"],"sourcesContent":["\"use client\";\n\n/**\n * GenericEditor 2.0 (5.0) — het automatisch gegenereerde formulier voor blokken zonder eigen\n * editor, aangedreven door de Field-IR (schema/fields.ts, primo-port):\n *\n * - **repeaters** en **groepen** zijn echte UI (ArrayEditor met toevoegen/verwijderen/↑↓ en een\n * omkaderde subgroep) i.p.v. een JSON-textarea;\n * - **showIf** verbergt velden conditioneel;\n * - date/slider/link/icoon/pagina-verwijzing hebben eigen widgets;\n * - de JSON-textarea bestaat alleen nog als laatste redmiddel (records/scalar-arrays), met\n * schema-validatie vóór commit.\n *\n * `FieldsForm` is los herbruikbaar: custom blocks (Fase B) renderen er hun opgeslagen Field-IR mee.\n */\nimport { useEffect, useMemo, useState } from \"react\";\nimport type { ZodTypeAny } from \"zod\";\nimport { Field as FieldRow, Input, Textarea } from \"../ui/primitives\";\nimport { Select } from \"../ui/select\";\nimport { Switch } from \"../ui/switch\";\nimport { ArrayEditor } from \"../ui/ArrayEditor\";\nimport { RichTextEditor } from \"../editors/RichTextEditor\";\nimport { MediaPickerButton } from \"../media/MediaPicker\";\nimport { useRegistry } from \"../../blocks/context\";\nimport { subscribePages, type DraftPage } from \"../lib/pagesClient\";\nimport { introspectToFields, introspectObjectSchema } from \"../lib/zodFields\";\nimport { fieldsDefaults, isFieldVisible, type Field } from \"../../schema/fields\";\n\nexport interface GenericEditorProps {\n block: Record<string, unknown>;\n siteId: string;\n onChange: (next: Record<string, unknown>) => void;\n}\n\n/** Formulier voor een Field-IR over een waarden-object. Recursief (groepen/repeaters). */\nexport function FieldsForm({\n fields,\n values,\n onChange,\n siteId,\n jsonSchemas,\n}: {\n fields: Field[];\n values: Record<string, unknown>;\n onChange: (patch: Record<string, unknown>) => void;\n siteId: string;\n /** Optioneel: sub-schema per json-veldsleutel voor validatie vóór commit. */\n jsonSchemas?: Record<string, ZodTypeAny>;\n}) {\n return (\n <div className=\"grid gap-3\">\n {fields.filter((f) => isFieldVisible(f, values)).map((f) => (\n <FieldWidget key={f.key} f={f} values={values} onChange={onChange} siteId={siteId} jsonSchema={jsonSchemas?.[f.key]} />\n ))}\n </div>\n );\n}\n\nfunction FieldWidget({\n f,\n values,\n onChange,\n siteId,\n jsonSchema,\n}: {\n f: Field;\n values: Record<string, unknown>;\n onChange: (patch: Record<string, unknown>) => void;\n siteId: string;\n jsonSchema?: ZodTypeAny;\n}) {\n const v = values[f.key];\n const set = (val: unknown) => onChange({ [f.key]: val });\n\n switch (f.type) {\n case \"switch\":\n return (\n <label className=\"flex items-center gap-2 text-sm\">\n <Switch checked={Boolean(v)} onCheckedChange={set} />\n {f.label}\n </label>\n );\n case \"select\":\n return <SelectField f={f} v={v} set={set} />;\n case \"number\":\n return (\n <FieldRow label={f.label} hint={f.hint}>\n <Input\n type=\"number\"\n min={f.min}\n max={f.max}\n step={f.step}\n value={v == null ? \"\" : String(v)}\n onChange={(e) => set(e.target.value === \"\" ? undefined : Number(e.target.value))}\n />\n </FieldRow>\n );\n case \"slider\": {\n const val = typeof v === \"number\" ? v : f.min;\n return (\n <FieldRow label={`${f.label} (${val})`} hint={f.hint}>\n <input\n type=\"range\"\n min={f.min}\n max={f.max}\n step={f.step ?? 1}\n value={val}\n onChange={(e) => set(Number(e.target.value))}\n className=\"w-full\"\n />\n </FieldRow>\n );\n }\n case \"date\":\n return (\n <FieldRow label={f.label} hint={f.hint}>\n <Input type=\"date\" value={String(v ?? \"\")} onChange={(e) => set(e.target.value)} />\n </FieldRow>\n );\n case \"richtext\":\n return (\n <FieldRow label={f.label} hint={f.hint}>\n <RichTextEditor siteId={siteId} value={String(v ?? \"\")} onChange={set} />\n </FieldRow>\n );\n case \"image\":\n return (\n <FieldRow label={f.label} hint={f.hint}>\n <div className=\"flex items-center gap-2\">\n <Input value={String(v ?? \"\")} onChange={(e) => set(e.target.value)} placeholder=\"URL of kies →\" />\n <MediaPickerButton siteId={siteId} onSelect={(m) => set(m.url)} />\n </div>\n </FieldRow>\n );\n case \"url\":\n return (\n <FieldRow label={f.label} hint={f.hint}>\n <Input value={String(v ?? \"\")} onChange={(e) => set(e.target.value)} placeholder=\"https://… of /pagina\" />\n </FieldRow>\n );\n case \"icon\":\n return (\n <FieldRow label={f.label} hint={f.hint ?? \"Emoji, bv. ✂️\"}>\n <Input value={String(v ?? \"\")} maxLength={16} onChange={(e) => set(e.target.value)} className=\"w-24\" />\n </FieldRow>\n );\n case \"link\": {\n const link = (v as { label?: string; href?: string } | undefined) ?? {};\n return (\n <FieldRow label={f.label} hint={f.hint}>\n <div className=\"grid grid-cols-2 gap-2\">\n <Input value={link.label ?? \"\"} placeholder=\"Tekst\" onChange={(e) => set({ ...link, label: e.target.value })} />\n <Input value={link.href ?? \"\"} placeholder=\"/pagina of https://…\" onChange={(e) => set({ ...link, href: e.target.value })} />\n </div>\n </FieldRow>\n );\n }\n case \"group\": {\n const group = (v as Record<string, unknown> | undefined) ?? {};\n return (\n <fieldset className=\"grid gap-2 rounded-lg border border-slate-200 p-3\">\n <legend className=\"px-1 text-xs font-semibold text-slate-500\">{f.label}</legend>\n <FieldsForm fields={f.fields} values={group} onChange={(p) => set({ ...group, ...p })} siteId={siteId} />\n </fieldset>\n );\n }\n case \"repeater\": {\n const items = (Array.isArray(v) ? v : []) as Record<string, unknown>[];\n return (\n <FieldRow label={f.label} hint={f.hint}>\n <ArrayEditor<Record<string, unknown>>\n items={items}\n onChange={set}\n newItem={() => fieldsDefaults(f.fields)}\n addLabel={`+ ${f.itemLabel ?? \"Item\"}`}\n renderRow={(item, update) => (\n <FieldsForm fields={f.fields} values={item} onChange={(p) => update(p)} siteId={siteId} />\n )}\n />\n </FieldRow>\n );\n }\n case \"pageRef\":\n return (\n <FieldRow label={f.label} hint={f.hint}>\n <PageRefPicker siteId={siteId} value={String(v ?? \"\")} onChange={set} />\n </FieldRow>\n );\n case \"info\":\n return <p className=\"text-xs text-slate-500\">{f.text}</p>;\n case \"textarea\":\n return (\n <FieldRow label={f.label} hint={f.hint}>\n <Textarea rows={f.rows ?? 4} value={String(v ?? \"\")} onChange={(e) => set(e.target.value)} />\n </FieldRow>\n );\n case \"json\":\n return <JsonField label={f.label} value={v} onCommit={set} schema={jsonSchema} />;\n case \"text\":\n default:\n return (\n <FieldRow label={f.label} hint={f.hint}>\n <Input value={String(v ?? \"\")} placeholder={f.type === \"text\" ? f.placeholder : undefined} onChange={(e) => set(e.target.value)} />\n </FieldRow>\n );\n }\n}\n\n/** Pagina-verwijzing: kies uit de bestaande pagina's van de site (live lijst). */\nfunction PageRefPicker({ siteId, value, onChange }: { siteId: string; value: string; onChange: (v: string) => void }) {\n const [pages, setPages] = useState<DraftPage[]>([]);\n useEffect(() => subscribePages(siteId, setPages), [siteId]);\n const options = useMemo(() => {\n const opts = pages\n .slice()\n .sort((a, b) => (a.path < b.path ? -1 : 1))\n .map((p) => ({ value: p.path, label: `${p.title || p.path} (${p.path})` }));\n // Bewaar een waarde die (nog) niet in de lijst staat, zodat niets stilletjes wegvalt.\n if (value && !opts.some((o) => o.value === value)) opts.unshift({ value, label: value });\n return [{ value: \"\", label: \"— geen —\" }, ...opts];\n }, [pages, value]);\n return <Select value={value} onValueChange={onChange} options={options} />;\n}\n\n/** Laatste redmiddel voor complexe velden: JSON met schema-validatie vóór commit. */\nfunction JsonField({\n label,\n value,\n onCommit,\n schema,\n}: {\n label: string;\n value: unknown;\n onCommit: (v: unknown) => void;\n schema?: ZodTypeAny;\n}) {\n const [text, setText] = useState(() => JSON.stringify(value ?? null, null, 2));\n const [error, setError] = useState<string | null>(null);\n const commit = () => {\n try {\n const parsed = JSON.parse(text) as unknown;\n if (schema) {\n const res = schema.safeParse(parsed);\n if (!res.success) {\n setError(\"Voldoet niet aan het verwachte formaat van dit veld.\");\n return;\n }\n setError(null);\n onCommit(res.data);\n return;\n }\n setError(null);\n onCommit(parsed);\n } catch {\n setError(\"Geen geldige JSON.\");\n }\n };\n return (\n <FieldRow label={`${label} (JSON)`} hint=\"Geavanceerd veld — wordt gecontroleerd vóór opslaan.\">\n <Textarea rows={6} value={text} onChange={(e) => setText(e.target.value)} onBlur={commit} spellCheck={false} className=\"font-mono text-xs\" />\n {error && <p className=\"text-xs text-red-600\">{error}</p>}\n </FieldRow>\n );\n}\n\n/**\n * De blok-editor-fallback: leidt de Field-IR af uit het Zod-schema van het blok (+ optionele\n * `fields`-hints van `defineBlock`) en rendert het formulier. Zo is een blok zonder maatwerk-\n * editor nooit een doodlopend pad voor de klant.\n */\nexport function GenericEditor({ block, siteId, onChange }: GenericEditorProps) {\n const registry = useRegistry();\n const def = registry.get(String(block._type ?? \"\"));\n const fields = useMemo(() => {\n if (!def) return [];\n // Custom blocks (5.0) dragen hun opgeslagen Field-IR mee — rijker dan introspectie\n // (showIf/date/slider-metadata gaat door fieldsToZod heen verloren).\n const custom = (def as { customFields?: Field[] }).customFields;\n return custom ?? introspectToFields(def.schema, def.fields);\n }, [def]);\n // Sub-schema's voor json-velden (validatie vóór commit), uit de platte introspectie.\n const jsonSchemas = useMemo(() => {\n if (!def) return {};\n const out: Record<string, ZodTypeAny> = {};\n for (const f of introspectObjectSchema(def.schema)) if (f.kind === \"json\") out[f.key] = f.schema;\n return out;\n }, [def]);\n if (fields.length === 0) {\n return <p className=\"text-sm text-slate-500\">Voor dit bloktype is geen editor beschikbaar.</p>;\n }\n return (\n <FieldsForm\n fields={fields}\n values={block}\n onChange={(p) => onChange({ ...block, ...p })}\n siteId={siteId}\n jsonSchemas={jsonSchemas}\n />\n );\n}\n\n/**\n * Select als eigen component: commit de default-optie bij mount wanneer er nog geen waarde is.\n * De dropdown TOONDE optie 1 maar sloeg 'm niet op (weergave ≠ opslag) — een verplichte enum kon\n * zo leeg gepubliceerd worden tenzij het Zod-schema toevallig een default had.\n */\nfunction SelectField({\n f,\n v,\n set,\n}: {\n f: Extract<Field, { type: \"select\" }>;\n v: unknown;\n set: (val: unknown) => void;\n}) {\n useEffect(() => {\n if (v == null && f.options[0] !== undefined) set(f.options[0].value);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n return (\n <FieldRow label={f.label} hint={f.hint}>\n <Select\n value={String(v ?? f.options[0]?.value ?? \"\")}\n onValueChange={set}\n options={f.options.map((o) => ({ value: o.value, label: o.label || o.value }))}\n />\n </FieldRow>\n );\n}\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../src/admin/blockEditors/GenericEditor.tsx"],"sourcesContent":["\"use client\";\n\n/**\n * GenericEditor 2.0 (5.0) — het automatisch gegenereerde formulier voor blokken zonder eigen\n * editor, aangedreven door de Field-IR (schema/fields.ts, primo-port):\n *\n * - **repeaters** en **groepen** zijn echte UI (ArrayEditor met toevoegen/verwijderen/↑↓ en een\n * omkaderde subgroep) i.p.v. een JSON-textarea;\n * - **showIf** verbergt velden conditioneel;\n * - date/slider/link/icoon/pagina-verwijzing hebben eigen widgets;\n * - de JSON-textarea bestaat alleen nog als laatste redmiddel (records/scalar-arrays), met\n * schema-validatie vóór commit.\n *\n * `FieldsForm` is los herbruikbaar: custom blocks (Fase B) renderen er hun opgeslagen Field-IR mee.\n */\nimport { useEffect, useMemo, useState } from \"react\";\nimport type { ZodTypeAny } from \"zod\";\nimport { Field as FieldRow, Input, Textarea } from \"../ui/primitives\";\nimport { Select } from \"../ui/select\";\nimport { Switch } from \"../ui/switch\";\nimport { ArrayEditor } from \"../ui/ArrayEditor\";\nimport { RichTextEditor } from \"../editors/RichTextEditor\";\nimport { MediaPickerButton } from \"../media/MediaPicker\";\nimport { useRegistry } from \"../../blocks/context\";\nimport { subscribePages, type DraftPage } from \"../lib/pagesClient\";\nimport { introspectToFields, introspectObjectSchema } from \"../lib/zodFields\";\nimport { fieldsDefaults, isFieldVisible, type Field } from \"../../schema/fields\";\n\nexport interface GenericEditorProps {\n block: Record<string, unknown>;\n siteId: string;\n onChange: (next: Record<string, unknown>) => void;\n}\n\n/** Formulier voor een Field-IR over een waarden-object. Recursief (groepen/repeaters). */\nexport function FieldsForm({\n fields,\n values,\n onChange,\n siteId,\n jsonSchemas,\n}: {\n fields: Field[];\n values: Record<string, unknown>;\n onChange: (patch: Record<string, unknown>) => void;\n siteId: string;\n /** Optioneel: sub-schema per json-veldsleutel voor validatie vóór commit. */\n jsonSchemas?: Record<string, ZodTypeAny>;\n}) {\n return (\n <div className=\"grid gap-3\">\n {fields.filter((f) => isFieldVisible(f, values)).map((f) => (\n <FieldWidget key={f.key} f={f} values={values} onChange={onChange} siteId={siteId} jsonSchema={jsonSchemas?.[f.key]} />\n ))}\n </div>\n );\n}\n\nfunction FieldWidget({\n f,\n values,\n onChange,\n siteId,\n jsonSchema,\n}: {\n f: Field;\n values: Record<string, unknown>;\n onChange: (patch: Record<string, unknown>) => void;\n siteId: string;\n jsonSchema?: ZodTypeAny;\n}) {\n const v = values[f.key];\n const set = (val: unknown) => onChange({ [f.key]: val });\n\n switch (f.type) {\n case \"switch\":\n return (\n <label className=\"flex items-center gap-2 text-sm\">\n <Switch checked={Boolean(v)} onCheckedChange={set} />\n {f.label}\n </label>\n );\n case \"select\":\n return <SelectField f={f} v={v} set={set} />;\n case \"number\":\n return (\n <FieldRow label={f.label} hint={f.hint}>\n <Input\n type=\"number\"\n min={f.min}\n max={f.max}\n step={f.step}\n value={v == null ? \"\" : String(v)}\n onChange={(e) => set(e.target.value === \"\" ? undefined : Number(e.target.value))}\n />\n </FieldRow>\n );\n case \"slider\": {\n const val = typeof v === \"number\" ? v : f.min;\n return (\n <FieldRow label={`${f.label} (${val})`} hint={f.hint}>\n <input\n type=\"range\"\n min={f.min}\n max={f.max}\n step={f.step ?? 1}\n value={val}\n onChange={(e) => set(Number(e.target.value))}\n className=\"w-full\"\n />\n </FieldRow>\n );\n }\n case \"date\":\n return (\n <FieldRow label={f.label} hint={f.hint}>\n <Input type=\"date\" value={String(v ?? \"\")} onChange={(e) => set(e.target.value)} />\n </FieldRow>\n );\n case \"richtext\":\n return (\n <FieldRow label={f.label} hint={f.hint}>\n <RichTextEditor siteId={siteId} value={String(v ?? \"\")} onChange={set} />\n </FieldRow>\n );\n case \"image\":\n return (\n <FieldRow label={f.label} hint={f.hint}>\n <div className=\"flex items-center gap-2\">\n <Input value={String(v ?? \"\")} onChange={(e) => set(e.target.value)} placeholder=\"URL of kies →\" />\n <MediaPickerButton siteId={siteId} onSelect={(m) => set(m.url)} />\n </div>\n </FieldRow>\n );\n case \"url\":\n return (\n <FieldRow label={f.label} hint={f.hint}>\n <Input value={String(v ?? \"\")} onChange={(e) => set(e.target.value)} placeholder=\"https://… of /pagina\" />\n </FieldRow>\n );\n case \"icon\":\n return (\n <FieldRow label={f.label} hint={f.hint ?? \"Emoji, bv. ✂️\"}>\n <Input value={String(v ?? \"\")} maxLength={16} onChange={(e) => set(e.target.value)} className=\"w-24\" />\n </FieldRow>\n );\n case \"link\": {\n const link = (v as { label?: string; href?: string } | undefined) ?? {};\n return (\n <FieldRow label={f.label} hint={f.hint}>\n <div className=\"grid grid-cols-2 gap-2\">\n <Input value={link.label ?? \"\"} placeholder=\"Tekst\" onChange={(e) => set({ ...link, label: e.target.value })} />\n <Input value={link.href ?? \"\"} placeholder=\"/pagina of https://…\" onChange={(e) => set({ ...link, href: e.target.value })} />\n </div>\n </FieldRow>\n );\n }\n case \"group\": {\n const group = (v as Record<string, unknown> | undefined) ?? {};\n return (\n <fieldset className=\"grid gap-2 rounded-lg border border-slate-200 p-3\">\n <legend className=\"px-1 text-xs font-semibold text-slate-500\">{f.label}</legend>\n <FieldsForm fields={f.fields} values={group} onChange={(p) => set({ ...group, ...p })} siteId={siteId} />\n </fieldset>\n );\n }\n case \"repeater\": {\n const items = (Array.isArray(v) ? v : []) as Record<string, unknown>[];\n return (\n <FieldRow label={f.label} hint={f.hint}>\n <ArrayEditor<Record<string, unknown>>\n items={items}\n onChange={set}\n newItem={() => fieldsDefaults(f.fields)}\n addLabel={`+ ${f.itemLabel ?? \"Item\"}`}\n renderRow={(item, update) => (\n <FieldsForm fields={f.fields} values={item} onChange={(p) => update(p)} siteId={siteId} />\n )}\n />\n </FieldRow>\n );\n }\n case \"pageRef\":\n return (\n <FieldRow label={f.label} hint={f.hint}>\n <PageRefPicker siteId={siteId} value={String(v ?? \"\")} onChange={set} />\n </FieldRow>\n );\n case \"info\":\n return <p className=\"text-xs text-slate-500\">{f.text}</p>;\n case \"textarea\":\n return (\n <FieldRow label={f.label} hint={f.hint}>\n <Textarea rows={f.rows ?? 4} value={String(v ?? \"\")} onChange={(e) => set(e.target.value)} />\n </FieldRow>\n );\n case \"json\":\n return <JsonField label={f.label} value={v} onCommit={set} schema={jsonSchema} />;\n case \"text\":\n default:\n return (\n <FieldRow label={f.label} hint={f.hint}>\n <Input value={String(v ?? \"\")} placeholder={f.type === \"text\" ? f.placeholder : undefined} onChange={(e) => set(e.target.value)} />\n </FieldRow>\n );\n }\n}\n\n/** Pagina-verwijzing: kies uit de bestaande pagina's van de site (live lijst). */\nfunction PageRefPicker({ siteId, value, onChange }: { siteId: string; value: string; onChange: (v: string) => void }) {\n const [pages, setPages] = useState<DraftPage[]>([]);\n useEffect(() => subscribePages(siteId, setPages), [siteId]);\n const options = useMemo(() => {\n const opts = pages\n .slice()\n .sort((a, b) => (a.path < b.path ? -1 : 1))\n .map((p) => ({ value: p.path, label: `${p.title || p.path} (${p.path})` }));\n // Bewaar een waarde die (nog) niet in de lijst staat, zodat niets stilletjes wegvalt.\n if (value && !opts.some((o) => o.value === value)) opts.unshift({ value, label: value });\n return [{ value: \"\", label: \"— geen —\" }, ...opts];\n }, [pages, value]);\n return <Select value={value} onValueChange={onChange} options={options} />;\n}\n\n/** Laatste redmiddel voor complexe velden: JSON met schema-validatie vóór commit. */\nfunction JsonField({\n label,\n value,\n onCommit,\n schema,\n}: {\n label: string;\n value: unknown;\n onCommit: (v: unknown) => void;\n schema?: ZodTypeAny;\n}) {\n const [text, setText] = useState(() => JSON.stringify(value ?? null, null, 2));\n const [error, setError] = useState<string | null>(null);\n // Committeert de gegeven tekst (niet de state — die is bij een net getypte toets nog niet\n // bijgewerkt). `silent`: tijdens het typen geen foutmelding tonen voor onvolledige JSON (bv.\n // een net geopende `[` of `{`) — pas bij blur laten we die zien. VEILIGHEIDSNET: committeert bij\n // élke wijziging i.p.v. uitsluitend op blur, want blur bleek op mobiel Safari niet altijd te\n // vuren vóór een externe \"Opslaan\"-klik (race), waardoor een bewerking hier stil verloren ging.\n const commit = (raw: string, opts: { silent: boolean }) => {\n try {\n const parsed = JSON.parse(raw) as unknown;\n if (schema) {\n const res = schema.safeParse(parsed);\n if (!res.success) {\n if (!opts.silent) setError(\"Voldoet niet aan het verwachte formaat van dit veld.\");\n return;\n }\n setError(null);\n onCommit(res.data);\n return;\n }\n setError(null);\n onCommit(parsed);\n } catch {\n if (!opts.silent) setError(\"Geen geldige JSON.\");\n }\n };\n return (\n <FieldRow label={`${label} (JSON)`} hint=\"Geavanceerd veld — wordt gecontroleerd vóór opslaan.\">\n <Textarea\n rows={6}\n value={text}\n onChange={(e) => {\n setText(e.target.value);\n commit(e.target.value, { silent: true });\n }}\n onBlur={() => commit(text, { silent: false })}\n spellCheck={false}\n className=\"font-mono text-xs\"\n />\n {error && <p className=\"text-xs text-red-600\">{error}</p>}\n </FieldRow>\n );\n}\n\n/**\n * De blok-editor-fallback: leidt de Field-IR af uit het Zod-schema van het blok (+ optionele\n * `fields`-hints van `defineBlock`) en rendert het formulier. Zo is een blok zonder maatwerk-\n * editor nooit een doodlopend pad voor de klant.\n */\nexport function GenericEditor({ block, siteId, onChange }: GenericEditorProps) {\n const registry = useRegistry();\n const def = registry.get(String(block._type ?? \"\"));\n const fields = useMemo(() => {\n if (!def) return [];\n // Custom blocks (5.0) dragen hun opgeslagen Field-IR mee — rijker dan introspectie\n // (showIf/date/slider-metadata gaat door fieldsToZod heen verloren).\n const custom = (def as { customFields?: Field[] }).customFields;\n return custom ?? introspectToFields(def.schema, def.fields);\n }, [def]);\n // Sub-schema's voor json-velden (validatie vóór commit), uit de platte introspectie.\n const jsonSchemas = useMemo(() => {\n if (!def) return {};\n const out: Record<string, ZodTypeAny> = {};\n for (const f of introspectObjectSchema(def.schema)) if (f.kind === \"json\") out[f.key] = f.schema;\n return out;\n }, [def]);\n if (fields.length === 0) {\n return <p className=\"text-sm text-slate-500\">Voor dit bloktype is geen editor beschikbaar.</p>;\n }\n return (\n <FieldsForm\n fields={fields}\n values={block}\n onChange={(p) => onChange({ ...block, ...p })}\n siteId={siteId}\n jsonSchemas={jsonSchemas}\n />\n );\n}\n\n/**\n * Select als eigen component: commit de default-optie bij mount wanneer er nog geen waarde is.\n * De dropdown TOONDE optie 1 maar sloeg 'm niet op (weergave ≠ opslag) — een verplichte enum kon\n * zo leeg gepubliceerd worden tenzij het Zod-schema toevallig een default had.\n */\nfunction SelectField({\n f,\n v,\n set,\n}: {\n f: Extract<Field, { type: \"select\" }>;\n v: unknown;\n set: (val: unknown) => void;\n}) {\n useEffect(() => {\n if (v == null && f.options[0] !== undefined) set(f.options[0].value);\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n return (\n <FieldRow label={f.label} hint={f.hint}>\n <Select\n value={String(v ?? f.options[0]?.value ?? \"\")}\n onValueChange={set}\n options={f.options.map((o) => ({ value: o.value, label: o.label || o.value }))}\n />\n </FieldRow>\n );\n}\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xiwebdesign/xicms-core",
|
|
3
|
-
"version": "6.4.
|
|
3
|
+
"version": "6.4.6",
|
|
4
4
|
"description": "XiCMS engine: gestructureerde content, pagina's, draft/publish, admin (TipTap+Radix), SEO en beveiliging voor klantsites.",
|
|
5
5
|
"license": "UNLICENSED",
|
|
6
6
|
"repository": {
|