fix(web): LabelEditor preserves other-language labels on edit (#55)
Editing a term/authority/field that already had labels in other languages silently replaced the whole multilingual set with one default-language entry. onChange now keeps non-default-language entries; the editor shows only the default-language label (no longer falling back to an other-language one, which made the clear/edit path write the wrong language) and surfaces a hint when other-language labels exist on the record. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -7,9 +7,10 @@ import { Label } from "@/components/ui/label";
|
||||
|
||||
type LabelInput = components["schemas"]["LabelInput"];
|
||||
|
||||
/** Single-language label editor. Authors one label at the instance default language;
|
||||
* emits a one-entry LabelInput[] (empty array when blank). The multilingual data model
|
||||
* is unchanged — this only simplifies authoring. */
|
||||
/** Single-language label editor. Authors one label at the instance default language.
|
||||
* Editing only touches the default-language entry — labels in other languages on the
|
||||
* same record are preserved (not collapsed), so editing a term/authority that already
|
||||
* has e.g. an English label keeps it. */
|
||||
export function LabelEditor({
|
||||
value,
|
||||
onChange,
|
||||
@@ -20,16 +21,22 @@ export function LabelEditor({
|
||||
const { t } = useTranslation();
|
||||
const { default_language } = useConfig();
|
||||
|
||||
const current =
|
||||
value.find((l) => l.lang === default_language)?.label ?? value[0]?.label ?? "";
|
||||
const current = value.find((l) => l.lang === default_language)?.label ?? "";
|
||||
const hasOtherLanguages = value.some((l) => l.lang !== default_language);
|
||||
|
||||
const set = (label: string) =>
|
||||
onChange(label.trim() ? [{ lang: default_language, label }] : []);
|
||||
onChange([
|
||||
...value.filter((l) => l.lang !== default_language),
|
||||
...(label.trim() ? [{ lang: default_language, label }] : []),
|
||||
]);
|
||||
|
||||
return (
|
||||
<div className="space-y-1">
|
||||
<Label htmlFor="label">{t("labels.label")}</Label>
|
||||
<Input id="label" value={current} onChange={(e) => set(e.target.value)} />
|
||||
{hasOtherLanguages && (
|
||||
<p className="text-xs text-muted-foreground">{t("labels.otherLanguages")}</p>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user