@cardinali-studio/adminkit 2.1.0-rc.0 → 2.1.0-rc.2

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.
@@ -233,12 +233,11 @@ export function PageEditor({ page, onChange, onRefresh, pristine, pickMedia, pic
233
233
  });
234
234
  return () => { alive = false; };
235
235
  }, [page.slug, showBody, pristine, loadedFor, translationActive]);
236
- if (translationActive && translationState === "loading" && !translation) {
237
- return _jsx("p", { className: "pane-empty ak-hint", children: "Carico la traduzione\u2026" });
238
- }
239
- if (translationActive && translationState === "error" && !translation) {
240
- return _jsx("p", { className: "pe-load-error", children: "Non sono riuscito a caricare la traduzione. Riprova o torna alla lingua predefinita." });
241
- }
236
+ /* La lingua secondaria nasce ereditando la pagina predefinita. Non sostituire mai
237
+ l'editor con una schermata vuota mentre si legge la sibling: oltre a sembrare una
238
+ perdita di contenuto, in caso di errore non lasciava nulla da cui ripartire. */
239
+ const translationLoading = translationActive && translationState === "loading" && !translation;
240
+ const translationFailed = translationActive && translationState === "error" && !translation;
242
241
  const shownPage = translationActive && translation
243
242
  ? { ...page, ...translation.page, ...(showBody ? { body: translation.body ?? "" } : {}) }
244
243
  : page;
@@ -262,10 +261,15 @@ export function PageEditor({ page, onChange, onRefresh, pristine, pickMedia, pic
262
261
  },
263
262
  });
264
263
  };
264
+ /* Nella lingua predefinita il titolo vive nella testata, insieme a slug e visibilità. In una
265
+ traduzione quei controlli sono correttamente bloccati perché appartengono alla pagina base,
266
+ ma `title` può essere stato marcato traducibile nello schema: allora deve riapparire nel
267
+ form, altrimenti sarebbe dichiarabile ma impossibile da modificare. */
265
268
  const commonOmissions = useMemo(() => [
266
- "title", "published", "inMenu",
269
+ ...(translationActive ? [] : ["title"]),
270
+ "published", "inMenu",
267
271
  "seoTitle", "seoDescription", "ogTitle", "ogDescription", "ogImage",
268
- ], []);
272
+ ], [translationActive]);
269
273
  /* Come la gallery: una pagina portfolio È la sua selezione di lavori, quindi la schermata
270
274
  mostra quella e basta. Il `SchemaForm` generico qui elencava anche «Foto», «Edizioni»,
271
275
  «Ritratto» e «Riconoscimenti» — campi di altri tipi di pagina, che compaiono perché il
@@ -297,5 +301,5 @@ export function PageEditor({ page, onChange, onRefresh, pristine, pickMedia, pic
297
301
  }
298
302
  return (_jsxs("div", { className: "ed", children: [translationActive && (_jsx("p", { className: "pe-translation-note", children: page.translations?.[activeLanguage]?.exists || page._translations?.[activeLanguage]
299
303
  ? `Stai modificando ${activeLanguage.toUpperCase()}. I campi non traducibili restano visibili e vengono copiati dalla lingua predefinita al salvataggio.`
300
- : `${activeLanguage.toUpperCase()} è uguale all’italiano finché non modifichi e salvi una traduzione.` })), _jsx(SchemaForm, { shape: definition?.shape ?? {}, value: shownPage, omit: commonOmissions, onChange: (next) => changeShown({ ...next, slug: page.slug }), pickMedia: pickMedia, pickMediaFiles: pickMediaFiles, translationReadOnly: translationActive }), showBody && (_jsxs("fieldset", { className: "ak-group", children: [_jsx("legend", { className: "ak-legend", children: "testo della pagina" }), bodyState === "loading" && _jsx("p", { className: "ak-hint", children: "Carico\u2026" }), bodyState === "error" && _jsx("p", { className: "ak-error", children: "Non sono riuscito a caricare il testo." }), _jsx("textarea", { className: "ak-input ak-textarea", rows: 12, value: typeof shownPage.body === "string" ? shownPage.body : "", onChange: (event) => changeShown({ ...shownPage, body: event.target.value }) })] }))] }));
304
+ : `${activeLanguage.toUpperCase()} è uguale all’italiano finché non modifichi e salvi una traduzione.` })), translationLoading && (_jsx("p", { className: "ak-hint", children: "Carico la traduzione: i contenuti italiani restano visibili nel frattempo." })), translationFailed && (_jsx("p", { className: "pe-load-error", children: "Non sono riuscito a caricare la traduzione. I contenuti italiani restano visibili: torna a IT e riprova EN." })), _jsx(SchemaForm, { shape: definition?.shape ?? {}, value: shownPage, omit: commonOmissions, onChange: (next) => changeShown({ ...next, slug: page.slug }), pickMedia: pickMedia, pickMediaFiles: pickMediaFiles, translationReadOnly: translationActive }), showBody && (_jsxs("fieldset", { className: "ak-group", children: [_jsx("legend", { className: "ak-legend", children: "testo della pagina" }), bodyState === "loading" && _jsx("p", { className: "ak-hint", children: "Carico\u2026" }), bodyState === "error" && _jsx("p", { className: "ak-error", children: "Non sono riuscito a caricare il testo." }), _jsx("textarea", { className: "ak-input ak-textarea", rows: 12, value: typeof shownPage.body === "string" ? shownPage.body : "", onChange: (event) => changeShown({ ...shownPage, body: event.target.value }) })] }))] }));
301
305
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@cardinali-studio/adminkit",
3
- "version": "2.1.0-rc.0",
3
+ "version": "2.1.0-rc.2",
4
4
  "type": "module",
5
5
  "description": "Motore riusabile di un pannello di amministrazione per siti Hugo su Cloudflare Pages: codec del front matter guidato dallo schema, form React, libreria media su R2. NIENTE di specifico di un sito qui dentro.",
6
6
  "license": "UNLICENSED",