@intlayer/design-system 9.0.0-canary.6 → 9.0.0-canary.8
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.
- package/dist/esm/components/DictionaryFieldEditor/ContentEditor.mjs +39 -67
- package/dist/esm/components/DictionaryFieldEditor/ContentEditor.mjs.map +1 -1
- package/dist/esm/components/DictionaryFieldEditor/DictionaryCreationForm/DictionaryCreationForm.mjs +46 -72
- package/dist/esm/components/DictionaryFieldEditor/DictionaryCreationForm/DictionaryCreationForm.mjs.map +1 -1
- package/dist/esm/components/DictionaryFieldEditor/DictionaryCreationForm/dictionaryCreationForm.content.mjs +0 -62
- package/dist/esm/components/DictionaryFieldEditor/DictionaryCreationForm/dictionaryCreationForm.content.mjs.map +1 -1
- package/dist/esm/components/DictionaryFieldEditor/DictionaryCreationForm/useDictionaryFormSchema.mjs +2 -4
- package/dist/esm/components/DictionaryFieldEditor/DictionaryCreationForm/useDictionaryFormSchema.mjs.map +1 -1
- package/dist/esm/components/DictionaryFieldEditor/DictionaryDetails/DictionaryDetailsForm.mjs +64 -145
- package/dist/esm/components/DictionaryFieldEditor/DictionaryDetails/DictionaryDetailsForm.mjs.map +1 -1
- package/dist/esm/components/DictionaryFieldEditor/DictionaryDetails/dictionaryDetails.content.mjs +1 -1
- package/dist/esm/components/DictionaryFieldEditor/DictionaryDetails/dictionaryDetails.content.mjs.map +1 -1
- package/dist/esm/components/MarkDownRender/MarkDownRender.mjs +1 -1
- package/dist/esm/components/MarkDownRender/MarkDownRender.mjs.map +1 -1
- package/dist/esm/components/SwitchSelector/useSwitchSelector.mjs +0 -1
- package/dist/esm/components/SwitchSelector/useSwitchSelector.mjs.map +1 -1
- package/dist/types/api/useIntlayerAPI.d.ts +2 -2
- package/dist/types/components/Badge/index.d.ts +2 -2
- package/dist/types/components/Breadcrumb/index.d.ts +1 -1
- package/dist/types/components/Button/Button.d.ts +4 -4
- package/dist/types/components/CollapsibleTable/CollapsibleTable.d.ts +2 -2
- package/dist/types/components/Command/index.d.ts +2 -2
- package/dist/types/components/Container/index.d.ts +3 -3
- package/dist/types/components/DictionaryFieldEditor/ContentEditor.d.ts.map +1 -1
- package/dist/types/components/DictionaryFieldEditor/DictionaryCreationForm/DictionaryCreationForm.d.ts.map +1 -1
- package/dist/types/components/DictionaryFieldEditor/DictionaryCreationForm/dictionaryCreationForm.content.d.ts +0 -62
- package/dist/types/components/DictionaryFieldEditor/DictionaryCreationForm/dictionaryCreationForm.content.d.ts.map +1 -1
- package/dist/types/components/DictionaryFieldEditor/DictionaryCreationForm/useDictionaryFormSchema.d.ts +3 -5
- package/dist/types/components/DictionaryFieldEditor/DictionaryCreationForm/useDictionaryFormSchema.d.ts.map +1 -1
- package/dist/types/components/DictionaryFieldEditor/DictionaryDetails/DictionaryDetailsForm.d.ts.map +1 -1
- package/dist/types/components/DictionaryFieldEditor/DictionaryDetails/dictionaryDetails.content.d.ts +1 -1
- package/dist/types/components/Input/Checkbox.d.ts +2 -2
- package/dist/types/components/Input/Radio.d.ts +2 -2
- package/dist/types/components/Link/Link.d.ts +3 -3
- package/dist/types/components/Pagination/Pagination.d.ts +1 -1
- package/dist/types/components/SwitchSelector/SwitchSelector.d.ts +2 -2
- package/dist/types/components/SwitchSelector/VerticalSwitchSelector.d.ts +1 -1
- package/dist/types/components/Tab/Tab.d.ts +1 -1
- package/dist/types/components/TabSelector/TabSelector.d.ts +1 -1
- package/dist/types/components/Tag/index.d.ts +2 -2
- package/dist/types/components/Toaster/Toast.d.ts +1 -1
- package/package.json +15 -15
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useDictionaryFormSchema.mjs","names":[],"sources":["../../../../../src/components/DictionaryFieldEditor/DictionaryCreationForm/useDictionaryFormSchema.ts"],"sourcesContent":["import { useIntlayer } from 'react-intlayer';\nimport { z } from 'zod/v4';\n\nexport const QUALIFIER_TYPES = ['none', 'item', 'variant'
|
|
1
|
+
{"version":3,"file":"useDictionaryFormSchema.mjs","names":[],"sources":["../../../../../src/components/DictionaryFieldEditor/DictionaryCreationForm/useDictionaryFormSchema.ts"],"sourcesContent":["import { useIntlayer } from 'react-intlayer';\nimport { z } from 'zod/v4';\n\nexport const QUALIFIER_TYPES = ['none', 'item', 'variant'] as const;\nexport type QualifierType = (typeof QUALIFIER_TYPES)[number];\n\nexport const useDictionarySchema = (projectId: string) => {\n const {\n requiredErrorName,\n invalidTypeErrorName,\n requiredErrorProjectId,\n invalidTypeErrorProjectId,\n } = useIntlayer('dictionary-form-schema');\n\n return z.object({\n key: z\n .string({\n error: (issue) =>\n issue.input === undefined\n ? requiredErrorName.value\n : invalidTypeErrorName.value,\n })\n .min(1, { error: invalidTypeErrorName.value })\n .default(''),\n projectIds: z\n .array(\n z.string({\n error: (issue) =>\n issue.input === undefined\n ? requiredErrorProjectId.value\n : invalidTypeErrorProjectId.value,\n })\n )\n .default([projectId]),\n qualifierType: z.enum(QUALIFIER_TYPES).default('none'),\n item: z.coerce.number().int().positive().optional(),\n variant: z.string().optional(),\n });\n};\n\nexport type DictionaryFormData = z.infer<\n ReturnType<typeof useDictionarySchema>\n>;\n"],"mappings":";;;;AAGA,MAAa,kBAAkB;CAAC;CAAQ;CAAQ;CAAU;AAG1D,MAAa,uBAAuB,cAAsB;CACxD,MAAM,EACJ,mBACA,sBACA,wBACA,8BACE,YAAY,yBAAyB;AAEzC,QAAO,EAAE,OAAO;EACd,KAAK,EACF,OAAO,EACN,QAAQ,UACN,MAAM,UAAU,SACZ,kBAAkB,QAClB,qBAAqB,OAC5B,CAAC,CACD,IAAI,GAAG,EAAE,OAAO,qBAAqB,OAAO,CAAC,CAC7C,QAAQ,GAAG;EACd,YAAY,EACT,MACC,EAAE,OAAO,EACP,QAAQ,UACN,MAAM,UAAU,SACZ,uBAAuB,QACvB,0BAA0B,OACjC,CAAC,CACH,CACA,QAAQ,CAAC,UAAU,CAAC;EACvB,eAAe,EAAE,KAAK,gBAAgB,CAAC,QAAQ,OAAO;EACtD,MAAM,EAAE,OAAO,QAAQ,CAAC,KAAK,CAAC,UAAU,CAAC,UAAU;EACnD,SAAS,EAAE,QAAQ,CAAC,UAAU;EAC/B,CAAC"}
|
package/dist/esm/components/DictionaryFieldEditor/DictionaryDetails/DictionaryDetailsForm.mjs
CHANGED
|
@@ -26,7 +26,6 @@ import { MultiSelectElement } from "../../Form/elements/MultiselectElement.mjs";
|
|
|
26
26
|
import { SelectElement } from "../../Form/elements/SelectElement.mjs";
|
|
27
27
|
import { useForm as useForm$1 } from "../../Form/FormBase.mjs";
|
|
28
28
|
import { Form } from "../../Form/Form.mjs";
|
|
29
|
-
import { MonacoCode } from "../../IDE/MonacoCode.mjs";
|
|
30
29
|
import { useDictionaryDetailsSchema } from "./useDictionaryDetailsSchema.mjs";
|
|
31
30
|
import { useEffect, useMemo, useState } from "react";
|
|
32
31
|
import { WandSparkles } from "lucide-react";
|
|
@@ -37,20 +36,38 @@ import { useWatch } from "react-hook-form";
|
|
|
37
36
|
import { AnimatePresence, motion } from "framer-motion";
|
|
38
37
|
|
|
39
38
|
//#region src/components/DictionaryFieldEditor/DictionaryDetails/DictionaryDetailsForm.tsx
|
|
40
|
-
const QUALIFIER_TYPES = [
|
|
41
|
-
"collection",
|
|
42
|
-
"variant",
|
|
43
|
-
"meta"
|
|
44
|
-
];
|
|
39
|
+
const QUALIFIER_TYPES = ["collection", "variant"];
|
|
45
40
|
/** Derive active qualifier types from dictionary qualifier fields. */
|
|
46
41
|
const deriveQualifierTypes = (dict) => {
|
|
47
42
|
const types = [];
|
|
48
43
|
if (dict.item !== void 0) types.push("collection");
|
|
49
44
|
if (dict.variant !== void 0) types.push("variant");
|
|
50
|
-
if (dict.meta !== void 0) types.push("meta");
|
|
51
45
|
return types;
|
|
52
46
|
};
|
|
53
|
-
|
|
47
|
+
/**
|
|
48
|
+
* A variant can be a named string or a structured object. The CMS edits it as
|
|
49
|
+
* text: a value starting with `{` is parsed as JSON (object variant), anything
|
|
50
|
+
* else is kept as a named-variant string.
|
|
51
|
+
*/
|
|
52
|
+
const formatVariant = (variant) => variant !== null && typeof variant === "object" ? JSON.stringify(variant) : variant ?? "";
|
|
53
|
+
const parseVariantInput = (raw) => {
|
|
54
|
+
if (raw.trim().startsWith("{")) try {
|
|
55
|
+
return {
|
|
56
|
+
variant: JSON.parse(raw),
|
|
57
|
+
error: false
|
|
58
|
+
};
|
|
59
|
+
} catch {
|
|
60
|
+
return {
|
|
61
|
+
variant: raw,
|
|
62
|
+
error: true
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
return {
|
|
66
|
+
variant: raw,
|
|
67
|
+
error: false
|
|
68
|
+
};
|
|
69
|
+
};
|
|
70
|
+
const DictionaryDetailsForm = ({ dictionary, mode, onSelectSibling }) => {
|
|
54
71
|
const { session } = useSession();
|
|
55
72
|
const { project } = session ?? {};
|
|
56
73
|
const { data: projectsData, isLoading: isLoadingProjects } = useGetProjects();
|
|
@@ -70,7 +87,6 @@ const DictionaryDetailsForm = ({ dictionary, mode, onSelectSibling, isDarkMode }
|
|
|
70
87
|
const siblings = useMemo(() => (siblingsData?.data ?? []).filter((d) => d.localId !== dictionary.localId), [siblingsData, dictionary.localId]);
|
|
71
88
|
const itemSiblings = useMemo(() => siblings.filter((d) => d.item !== void 0).sort((a, b) => (a.item ?? 0) - (b.item ?? 0)), [siblings]);
|
|
72
89
|
const variantSiblings = useMemo(() => siblings.filter((d) => d.variant !== void 0), [siblings]);
|
|
73
|
-
const metaSiblings = useMemo(() => siblings.filter((d) => d.meta !== void 0), [siblings]);
|
|
74
90
|
const allItemDicts = useMemo(() => {
|
|
75
91
|
if (dictionary.item !== void 0) return [dictionary, ...itemSiblings].sort((a, b) => (a.item ?? 0) - (b.item ?? 0));
|
|
76
92
|
return itemSiblings;
|
|
@@ -79,10 +95,6 @@ const DictionaryDetailsForm = ({ dictionary, mode, onSelectSibling, isDarkMode }
|
|
|
79
95
|
if (dictionary.variant !== void 0) return [dictionary, ...variantSiblings];
|
|
80
96
|
return variantSiblings;
|
|
81
97
|
}, [dictionary, variantSiblings]);
|
|
82
|
-
const allMetaDicts = useMemo(() => {
|
|
83
|
-
if (dictionary.meta !== void 0) return [dictionary, ...metaSiblings];
|
|
84
|
-
return metaSiblings;
|
|
85
|
-
}, [dictionary, metaSiblings]);
|
|
86
98
|
useEffect(() => {
|
|
87
99
|
form.reset({
|
|
88
100
|
...dictionary,
|
|
@@ -91,9 +103,8 @@ const DictionaryDetailsForm = ({ dictionary, mode, onSelectSibling, isDarkMode }
|
|
|
91
103
|
});
|
|
92
104
|
setSelectedTypes(deriveQualifierTypes(dictionary));
|
|
93
105
|
setItemValue(dictionary.item ?? 1);
|
|
94
|
-
setVariantValue(dictionary.variant
|
|
95
|
-
|
|
96
|
-
setMetaJsonError(false);
|
|
106
|
+
setVariantValue(formatVariant(dictionary.variant));
|
|
107
|
+
setVariantJsonError(false);
|
|
97
108
|
setShowSiblingPicker(false);
|
|
98
109
|
}, [dictionary, form?.reset]);
|
|
99
110
|
useEffect(() => {
|
|
@@ -128,19 +139,10 @@ const DictionaryDetailsForm = ({ dictionary, mode, onSelectSibling, isDarkMode }
|
|
|
128
139
|
const hasSiblings = siblings.length > 0;
|
|
129
140
|
const [selectedTypes, setSelectedTypes] = useState(() => deriveQualifierTypes(dictionary));
|
|
130
141
|
const [itemValue, setItemValue] = useState(dictionary.item ?? 1);
|
|
131
|
-
const [variantValue, setVariantValue] = useState(dictionary.variant
|
|
132
|
-
const [
|
|
133
|
-
const [metaJsonError, setMetaJsonError] = useState(false);
|
|
142
|
+
const [variantValue, setVariantValue] = useState(formatVariant(dictionary.variant));
|
|
143
|
+
const [variantJsonError, setVariantJsonError] = useState(false);
|
|
134
144
|
const [showSiblingPicker, setShowSiblingPicker] = useState(false);
|
|
135
|
-
const allQualifiedSiblings = useMemo(() => [
|
|
136
|
-
...itemSiblings,
|
|
137
|
-
...variantSiblings,
|
|
138
|
-
...metaSiblings
|
|
139
|
-
], [
|
|
140
|
-
itemSiblings,
|
|
141
|
-
variantSiblings,
|
|
142
|
-
metaSiblings
|
|
143
|
-
]);
|
|
145
|
+
const allQualifiedSiblings = useMemo(() => [...itemSiblings, ...variantSiblings], [itemSiblings, variantSiblings]);
|
|
144
146
|
const handleTypesChange = (newTypes) => {
|
|
145
147
|
const nextTypes = [newTypes].flat();
|
|
146
148
|
const added = nextTypes.filter((t) => !selectedTypes.includes(t));
|
|
@@ -158,10 +160,6 @@ const DictionaryDetailsForm = ({ dictionary, mode, onSelectSibling, isDarkMode }
|
|
|
158
160
|
...base,
|
|
159
161
|
variant: void 0
|
|
160
162
|
};
|
|
161
|
-
if (qualifier === "meta") base = {
|
|
162
|
-
...base,
|
|
163
|
-
meta: void 0
|
|
164
|
-
};
|
|
165
163
|
}
|
|
166
164
|
for (const qualifier of added) if (qualifier === "collection") {
|
|
167
165
|
const nextItem = allItemDicts.length > 0 ? Math.max(...allItemDicts.map((d) => d.item ?? 0)) + 1 : 1;
|
|
@@ -175,19 +173,12 @@ const DictionaryDetailsForm = ({ dictionary, mode, onSelectSibling, isDarkMode }
|
|
|
175
173
|
setVariantValue(newVariant);
|
|
176
174
|
base = {
|
|
177
175
|
...base,
|
|
178
|
-
variant: newVariant
|
|
179
|
-
};
|
|
180
|
-
} else if (qualifier === "meta") {
|
|
181
|
-
const initialMeta = { id: "" };
|
|
182
|
-
setMetaJsonValue(JSON.stringify(initialMeta, null, 2));
|
|
183
|
-
base = {
|
|
184
|
-
...base,
|
|
185
|
-
meta: initialMeta
|
|
176
|
+
variant: parseVariantInput(newVariant).variant
|
|
186
177
|
};
|
|
187
178
|
}
|
|
188
179
|
setSelectedTypes(nextTypes);
|
|
189
180
|
setEditedDictionary(base);
|
|
190
|
-
|
|
181
|
+
setVariantJsonError(false);
|
|
191
182
|
if (nextTypes.length === 0 && allQualifiedSiblings.length > 0) setShowSiblingPicker(true);
|
|
192
183
|
else setShowSiblingPicker(false);
|
|
193
184
|
};
|
|
@@ -448,7 +439,6 @@ const DictionaryDetailsForm = ({ dictionary, mode, onSelectSibling, isDarkMode }
|
|
|
448
439
|
getBadgeValue: (val) => {
|
|
449
440
|
if (val === "collection") return String(typeSwitch.collection);
|
|
450
441
|
if (val === "variant") return String(typeSwitch.variant);
|
|
451
|
-
if (val === "meta") return String(typeSwitch.meta);
|
|
452
442
|
return val;
|
|
453
443
|
},
|
|
454
444
|
children: /* @__PURE__ */ jsx(MultiSelect.Input, { placeholder: typeSwitch.label.value })
|
|
@@ -499,43 +489,6 @@ const DictionaryDetailsForm = ({ dictionary, mode, onSelectSibling, isDarkMode }
|
|
|
499
489
|
})
|
|
500
490
|
}, "item-input"),
|
|
501
491
|
selectedTypes.includes("variant") && /* @__PURE__ */ jsx(motion.div, {
|
|
502
|
-
initial: {
|
|
503
|
-
opacity: 0,
|
|
504
|
-
height: 0
|
|
505
|
-
},
|
|
506
|
-
animate: {
|
|
507
|
-
opacity: 1,
|
|
508
|
-
height: "auto"
|
|
509
|
-
},
|
|
510
|
-
exit: {
|
|
511
|
-
opacity: 0,
|
|
512
|
-
height: 0
|
|
513
|
-
},
|
|
514
|
-
transition: { duration: .2 },
|
|
515
|
-
children: /* @__PURE__ */ jsxs("div", {
|
|
516
|
-
className: "flex flex-col gap-2 px-1",
|
|
517
|
-
children: [/* @__PURE__ */ jsx("label", {
|
|
518
|
-
htmlFor: "qualifier-variant-value",
|
|
519
|
-
className: "ml-1 font-medium text-sm",
|
|
520
|
-
children: typeSwitch.variantValueLabel
|
|
521
|
-
}), /* @__PURE__ */ jsx(Input, {
|
|
522
|
-
id: "qualifier-variant-value",
|
|
523
|
-
type: "text",
|
|
524
|
-
value: variantValue,
|
|
525
|
-
placeholder: typeSwitch.variantValuePlaceholder.value,
|
|
526
|
-
onChange: (e) => {
|
|
527
|
-
const value = e.target.value;
|
|
528
|
-
setVariantValue(value);
|
|
529
|
-
setEditedDictionary({
|
|
530
|
-
...dictionary,
|
|
531
|
-
...updatedDictionary ?? {},
|
|
532
|
-
variant: value
|
|
533
|
-
});
|
|
534
|
-
}
|
|
535
|
-
})]
|
|
536
|
-
})
|
|
537
|
-
}, "variant-input"),
|
|
538
|
-
selectedTypes.includes("meta") && /* @__PURE__ */ jsx(motion.div, {
|
|
539
492
|
initial: {
|
|
540
493
|
opacity: 0,
|
|
541
494
|
height: 0
|
|
@@ -553,43 +506,34 @@ const DictionaryDetailsForm = ({ dictionary, mode, onSelectSibling, isDarkMode }
|
|
|
553
506
|
className: "flex flex-col gap-2 px-1",
|
|
554
507
|
children: [
|
|
555
508
|
/* @__PURE__ */ jsx("label", {
|
|
556
|
-
htmlFor: "qualifier-
|
|
509
|
+
htmlFor: "qualifier-variant-value",
|
|
557
510
|
className: "ml-1 font-medium text-sm",
|
|
558
|
-
children: typeSwitch.
|
|
511
|
+
children: typeSwitch.variantValueLabel
|
|
559
512
|
}),
|
|
560
|
-
/* @__PURE__ */ jsx(
|
|
561
|
-
id: "qualifier-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
...updatedDictionary ?? {},
|
|
577
|
-
meta: parsed
|
|
578
|
-
});
|
|
579
|
-
} catch {
|
|
580
|
-
setMetaJsonError(true);
|
|
581
|
-
}
|
|
582
|
-
},
|
|
583
|
-
children: metaJsonValue
|
|
584
|
-
})
|
|
513
|
+
/* @__PURE__ */ jsx(Input, {
|
|
514
|
+
id: "qualifier-variant-value",
|
|
515
|
+
type: "text",
|
|
516
|
+
value: variantValue,
|
|
517
|
+
placeholder: typeSwitch.variantValuePlaceholder.value,
|
|
518
|
+
onChange: (e) => {
|
|
519
|
+
const value = e.target.value;
|
|
520
|
+
setVariantValue(value);
|
|
521
|
+
const { variant, error } = parseVariantInput(value);
|
|
522
|
+
setVariantJsonError(error);
|
|
523
|
+
if (!error) setEditedDictionary({
|
|
524
|
+
...dictionary,
|
|
525
|
+
...updatedDictionary ?? {},
|
|
526
|
+
variant
|
|
527
|
+
});
|
|
528
|
+
}
|
|
585
529
|
}),
|
|
586
|
-
|
|
530
|
+
variantJsonError && /* @__PURE__ */ jsx("p", {
|
|
587
531
|
className: "ml-1 text-destructive text-xs",
|
|
588
|
-
children: typeSwitch.
|
|
532
|
+
children: typeSwitch.variantJsonError
|
|
589
533
|
})
|
|
590
534
|
]
|
|
591
535
|
})
|
|
592
|
-
}, "
|
|
536
|
+
}, "variant-input"),
|
|
593
537
|
selectedTypes.length === 0 && showSiblingPicker && /* @__PURE__ */ jsx(motion.div, {
|
|
594
538
|
initial: {
|
|
595
539
|
opacity: 0,
|
|
@@ -629,23 +573,16 @@ const DictionaryDetailsForm = ({ dictionary, mode, onSelectSibling, isDarkMode }
|
|
|
629
573
|
setShowSiblingPicker(false);
|
|
630
574
|
},
|
|
631
575
|
className: "cursor-pointer rounded-lg border border-border px-3 py-1 text-xs transition-colors hover:bg-text/10",
|
|
632
|
-
children: [
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
] }),
|
|
643
|
-
sibling.meta !== void 0 && /* @__PURE__ */ jsxs("span", { children: [
|
|
644
|
-
qualifierSection.meta,
|
|
645
|
-
": ",
|
|
646
|
-
String(sibling.meta.id)
|
|
647
|
-
] })
|
|
648
|
-
]
|
|
576
|
+
children: [sibling.variant !== void 0 && /* @__PURE__ */ jsxs("span", { children: [
|
|
577
|
+
qualifierSection.variant,
|
|
578
|
+
":",
|
|
579
|
+
" ",
|
|
580
|
+
formatVariant(sibling.variant)
|
|
581
|
+
] }), sibling.item !== void 0 && /* @__PURE__ */ jsxs("span", { children: [
|
|
582
|
+
qualifierSection.item,
|
|
583
|
+
": ",
|
|
584
|
+
sibling.item
|
|
585
|
+
] })]
|
|
649
586
|
}, sibling.localId))
|
|
650
587
|
})
|
|
651
588
|
]
|
|
@@ -718,25 +655,7 @@ const DictionaryDetailsForm = ({ dictionary, mode, onSelectSibling, isDarkMode }
|
|
|
718
655
|
type: "button",
|
|
719
656
|
onClick: () => !isActive && onSelectSibling?.(sibling),
|
|
720
657
|
className: cn("rounded-lg px-3 py-1 text-xs transition-colors", isActive ? "bg-text font-semibold text-text-opposite" : "cursor-pointer border border-border hover:bg-text/10"),
|
|
721
|
-
children: sibling.variant
|
|
722
|
-
}, sibling.localId);
|
|
723
|
-
})
|
|
724
|
-
})]
|
|
725
|
-
}),
|
|
726
|
-
allMetaDicts.length > 0 && /* @__PURE__ */ jsxs("div", {
|
|
727
|
-
className: "flex flex-col gap-2",
|
|
728
|
-
children: [/* @__PURE__ */ jsx("p", {
|
|
729
|
-
className: "font-medium text-muted text-xs uppercase tracking-wide",
|
|
730
|
-
children: siblingContent.metaRecords
|
|
731
|
-
}), /* @__PURE__ */ jsx("div", {
|
|
732
|
-
className: "flex flex-wrap gap-2",
|
|
733
|
-
children: allMetaDicts.map((sibling) => {
|
|
734
|
-
const isActive = sibling.localId === dictionary.localId;
|
|
735
|
-
return /* @__PURE__ */ jsx("button", {
|
|
736
|
-
type: "button",
|
|
737
|
-
onClick: () => !isActive && onSelectSibling?.(sibling),
|
|
738
|
-
className: cn("rounded-lg px-3 py-1 text-xs transition-colors", isActive ? "bg-text font-semibold text-text-opposite" : "cursor-pointer border border-border hover:bg-text/10"),
|
|
739
|
-
children: sibling.meta?.id
|
|
658
|
+
children: formatVariant(sibling.variant)
|
|
740
659
|
}, sibling.localId);
|
|
741
660
|
})
|
|
742
661
|
})]
|
package/dist/esm/components/DictionaryFieldEditor/DictionaryDetails/DictionaryDetailsForm.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DictionaryDetailsForm.mjs","names":["useForm","FormEditableFieldInput","FormEditableFieldTextArea","FormLabel","FormInput","FormSelect","FormMultiSelect","FormButton"],"sources":["../../../../../src/components/DictionaryFieldEditor/DictionaryDetails/DictionaryDetailsForm.tsx"],"sourcesContent":["'use client';\n\nimport {\n useAuditContentDeclarationMetadata,\n useGetDictionaries,\n useGetProjects,\n useGetTags,\n} from '@api/index';\nimport { useSession } from '@api/useAuth';\n\nimport { Container } from '@components/Container';\nimport {\n Form,\n FormButton,\n FormDescription,\n FormEditableFieldInput,\n FormEditableFieldTextArea,\n FormField,\n FormInput,\n FormItem,\n FormLabel,\n FormMessage,\n FormMultiSelect,\n FormSelect,\n useForm,\n} from '@components/Form';\nimport { Checkbox, Input } from '@components/Input';\nimport { Loader } from '@components/Loader';\nimport { Pagination } from '@components/Pagination';\nimport { MultiSelect, Select } from '@components/Select';\nimport { useEditedContent } from '@intlayer/editor-react';\nimport type {\n Dictionary,\n DictionaryMeta,\n LocalDictionaryId,\n} from '@intlayer/types/dictionary';\nimport { cn } from '@utils/cn';\nimport { AnimatePresence, motion } from 'framer-motion';\nimport { WandSparkles } from 'lucide-react';\nimport { type FC, useEffect, useMemo, useState } from 'react';\nimport { useWatch } from 'react-hook-form';\nimport { useIntlayer } from 'react-intlayer';\nimport { MonacoCode } from '../../IDE/MonacoCode';\nimport { useDictionaryDetailsSchema } from './useDictionaryDetailsSchema';\n\ntype DictionaryDetailsProps = {\n dictionary: Dictionary;\n mode: ('local' | 'remote')[];\n onSelectSibling?: (dictionary: Dictionary) => void;\n isDarkMode?: boolean;\n};\n\ntype QualifierType = 'collection' | 'variant' | 'meta';\n\nconst QUALIFIER_TYPES: QualifierType[] = ['collection', 'variant', 'meta'];\n\n/** Derive active qualifier types from dictionary qualifier fields. */\nconst deriveQualifierTypes = (dict: Dictionary): QualifierType[] => {\n const types: QualifierType[] = [];\n if (dict.item !== undefined) types.push('collection');\n if (dict.variant !== undefined) types.push('variant');\n if (dict.meta !== undefined) types.push('meta');\n return types;\n};\n\nexport const DictionaryDetailsForm: FC<DictionaryDetailsProps> = ({\n dictionary,\n mode,\n onSelectSibling,\n isDarkMode,\n}) => {\n const { session } = useSession();\n const { project } = session ?? {};\n const { data: projectsData, isLoading: isLoadingProjects } =\n useGetProjects() as any;\n const { data: tagsData } = useGetTags() as any;\n\n const projects = (projectsData?.data ?? []) as any[];\n const allTags = (tagsData?.data ?? []) as any[];\n\n const DictionaryDetailsSchema = useDictionaryDetailsSchema(\n String(project?.id)\n );\n const { form, isSubmitting } = useForm(DictionaryDetailsSchema, {\n defaultValues: {\n ...dictionary,\n location: dictionary.location ?? 'remote',\n },\n });\n const { editedContent, setEditedDictionary } = useEditedContent();\n const {\n titleInput,\n keyInput,\n descriptionInput,\n projectInput,\n tagsSelect,\n locationSelect,\n importModeSelect,\n filePathInput,\n auditButton,\n qualifierSection,\n siblingDictionaries: siblingContent,\n typeSwitch,\n } = useIntlayer('dictionary-details');\n const { mutate: auditContentDeclaration, isPending: isAuditing } =\n useAuditContentDeclarationMetadata();\n const updatedDictionary =\n editedContent?.[dictionary.localId as LocalDictionaryId];\n\n const { data: siblingsData, isLoading: isLoadingSiblings } =\n useGetDictionaries(\n { keys: [dictionary.key] },\n { enabled: !!dictionary.key }\n );\n\n const siblings = useMemo<Dictionary[]>(\n () =>\n ((siblingsData?.data ?? []) as unknown as Dictionary[]).filter(\n (d: Dictionary) => d.localId !== dictionary.localId\n ),\n [siblingsData, dictionary.localId]\n );\n\n const itemSiblings = useMemo(\n () =>\n siblings\n .filter((d) => d.item !== undefined)\n .sort((a, b) => (a.item ?? 0) - (b.item ?? 0)),\n [siblings]\n );\n\n const variantSiblings = useMemo(\n () => siblings.filter((d) => d.variant !== undefined),\n [siblings]\n );\n\n const metaSiblings = useMemo(\n () => siblings.filter((d) => d.meta !== undefined),\n [siblings]\n );\n\n const allItemDicts = useMemo<Dictionary[]>(() => {\n if (dictionary.item !== undefined) {\n const combined = [dictionary, ...itemSiblings].sort(\n (a, b) => (a.item ?? 0) - (b.item ?? 0)\n );\n return combined;\n }\n return itemSiblings;\n }, [dictionary, itemSiblings]);\n\n const allVariantDicts = useMemo<Dictionary[]>(() => {\n if (dictionary.variant !== undefined) {\n return [dictionary, ...variantSiblings];\n }\n return variantSiblings;\n }, [dictionary, variantSiblings]);\n\n const allMetaDicts = useMemo<Dictionary[]>(() => {\n if (dictionary.meta !== undefined) {\n return [dictionary, ...metaSiblings];\n }\n return metaSiblings;\n }, [dictionary, metaSiblings]);\n\n useEffect(() => {\n form.reset({\n ...dictionary,\n tags: dictionary.tags ?? [],\n location: dictionary.location ?? 'remote',\n });\n setSelectedTypes(deriveQualifierTypes(dictionary));\n setItemValue(dictionary.item ?? 1);\n setVariantValue(dictionary.variant ?? '');\n setMetaJsonValue(\n dictionary.meta ? JSON.stringify(dictionary.meta, null, 2) : ''\n );\n setMetaJsonError(false);\n setShowSiblingPicker(false);\n }, [dictionary, form?.reset]);\n\n useEffect(() => {\n if (typeof updatedDictionary === 'undefined') {\n form.reset({\n ...dictionary,\n tags: dictionary.tags ?? [],\n location: dictionary.location ?? 'remote',\n });\n }\n }, [updatedDictionary]);\n\n const handleOnAuditFile = () => {\n const dictionaryToAudit = {\n ...dictionary,\n ...updatedDictionary,\n };\n\n auditContentDeclaration(\n {\n fileContent: JSON.stringify(dictionaryToAudit),\n },\n {\n onSuccess: (response) => {\n if (!response?.data) return;\n\n const auditedDictionary = response.data.fileContent;\n\n const merged = {\n ...dictionaryToAudit,\n ...auditedDictionary,\n tags: auditedDictionary.tags ?? dictionaryToAudit.tags ?? [],\n };\n\n setEditedDictionary(merged as Dictionary);\n form.reset(merged);\n },\n }\n );\n };\n\n const watchedLocation = useWatch({\n control: form.control,\n name: 'location',\n });\n const isLocalChecked =\n watchedLocation === 'local' || watchedLocation === 'hybrid';\n\n const hasSiblings = siblings.length > 0;\n\n const [selectedTypes, setSelectedTypes] = useState<QualifierType[]>(() =>\n deriveQualifierTypes(dictionary)\n );\n const [itemValue, setItemValue] = useState<number>(dictionary.item ?? 1);\n const [variantValue, setVariantValue] = useState<string>(\n dictionary.variant ?? ''\n );\n const [metaJsonValue, setMetaJsonValue] = useState<string>(\n dictionary.meta ? JSON.stringify(dictionary.meta, null, 2) : ''\n );\n const [metaJsonError, setMetaJsonError] = useState(false);\n const [showSiblingPicker, setShowSiblingPicker] = useState(false);\n\n const allQualifiedSiblings = useMemo<Dictionary[]>(\n () => [...itemSiblings, ...variantSiblings, ...metaSiblings],\n [itemSiblings, variantSiblings, metaSiblings]\n );\n\n const handleTypesChange = (newTypes: string | string[]) => {\n const nextTypes = [newTypes].flat() as QualifierType[];\n const added = nextTypes.filter((t) => !selectedTypes.includes(t));\n const removed = selectedTypes.filter((t) => !nextTypes.includes(t));\n\n let base = { ...dictionary, ...(updatedDictionary ?? {}) };\n\n for (const qualifier of removed) {\n if (qualifier === 'collection') base = { ...base, item: undefined };\n if (qualifier === 'variant') base = { ...base, variant: undefined };\n if (qualifier === 'meta') base = { ...base, meta: undefined };\n }\n\n for (const qualifier of added) {\n if (qualifier === 'collection') {\n const nextItem =\n allItemDicts.length > 0\n ? Math.max(...allItemDicts.map((d) => d.item ?? 0)) + 1\n : 1;\n setItemValue(nextItem);\n base = { ...base, item: nextItem };\n } else if (qualifier === 'variant') {\n const newVariant = variantValue || 'default';\n setVariantValue(newVariant);\n base = { ...base, variant: newVariant };\n } else if (qualifier === 'meta') {\n const initialMeta: DictionaryMeta = { id: '' };\n setMetaJsonValue(JSON.stringify(initialMeta, null, 2));\n base = { ...base, meta: initialMeta };\n }\n }\n\n setSelectedTypes(nextTypes);\n setEditedDictionary(base);\n setMetaJsonError(false);\n\n if (nextTypes.length === 0 && allQualifiedSiblings.length > 0) {\n setShowSiblingPicker(true);\n } else {\n setShowSiblingPicker(false);\n }\n };\n\n return (\n <Form\n className=\"flex w-full flex-col gap-8\"\n {...form}\n schema={DictionaryDetailsSchema}\n >\n <div className=\"grid grid-cols-2 gap-8 max-md:grid-cols-1\">\n <FormEditableFieldInput\n name=\"key\"\n label={keyInput.label}\n placeholder={keyInput.label.value}\n description={keyInput.description}\n disabled={isSubmitting}\n isRequired\n onSave={(value) => {\n form.setValue('key', value, { shouldDirty: true });\n setEditedDictionary({\n ...dictionary,\n ...(updatedDictionary ?? {}),\n key: value,\n });\n }}\n />\n <FormEditableFieldInput\n name=\"title\"\n label={titleInput.label}\n placeholder={titleInput.placeholder.value}\n description={titleInput.description}\n disabled={isSubmitting}\n onSave={(value) => {\n form.setValue('title', value, { shouldDirty: true });\n setEditedDictionary({\n ...dictionary,\n ...(updatedDictionary ?? {}),\n title: value,\n });\n }}\n />\n </div>\n <FormEditableFieldTextArea\n name=\"description\"\n label={descriptionInput.label}\n placeholder={descriptionInput.placeholder.value}\n description={descriptionInput.description}\n disabled={isSubmitting}\n onSave={(value) => {\n form.setValue('description', value, { shouldDirty: true });\n setEditedDictionary({\n ...dictionary,\n ...(updatedDictionary ?? {}),\n description: value,\n });\n }}\n />\n <div className=\"grid grid-cols-2 gap-8 px-1 max-md:grid-cols-1\">\n <FormField\n control={form.control}\n name=\"location\"\n render={({ field }) => {\n const value = field.value;\n const isLocal = value === 'local' || value === 'hybrid';\n const isRemote = value === 'remote' || value === 'hybrid';\n\n const handleLocalToggle = (isChecked: boolean) => {\n if (!isChecked && !isRemote) return;\n\n const newValue: Dictionary['location'] = isChecked\n ? isRemote\n ? 'hybrid'\n : 'local'\n : 'remote';\n\n field.onChange(newValue);\n\n const newFilePath = isChecked\n ? (form.getValues('filePath') ?? dictionary.filePath)\n : undefined;\n\n if (!isChecked) {\n form.setValue('filePath', undefined);\n }\n\n setEditedDictionary({\n ...dictionary,\n ...(updatedDictionary ?? {}),\n location: newValue,\n filePath: newFilePath,\n });\n };\n\n const handleRemoteToggle = (isChecked: boolean) => {\n if (!isChecked && !isLocal) return;\n\n const newValue: Dictionary['location'] = isChecked\n ? isLocal\n ? 'hybrid'\n : 'remote'\n : 'local';\n\n field.onChange(newValue);\n\n setEditedDictionary({\n ...dictionary,\n ...(updatedDictionary ?? {}),\n location: newValue,\n });\n };\n\n return (\n <FormItem className=\"flex flex-col gap-2 px-1\">\n <FormLabel className=\"ml-1\">{locationSelect.label}</FormLabel>\n <div className=\"ml-2 flex items-center gap-4 py-2\">\n <Checkbox\n id=\"location-local\"\n name=\"location-local\"\n label={locationSelect.local.value}\n color=\"text\"\n checked={isLocal}\n disabled={\n !mode.includes('local') && !mode.includes('remote')\n }\n onChange={(e) => handleLocalToggle(e.target.checked)}\n />\n <Checkbox\n id=\"location-remote\"\n name=\"location-remote\"\n label={locationSelect.remote.value}\n color=\"text\"\n checked={isRemote}\n disabled={\n !mode.includes('remote') &&\n dictionary.location !== 'remote' &&\n dictionary.location !== 'hybrid'\n }\n onChange={(e) => handleRemoteToggle(e.target.checked)}\n />\n </div>\n <FormDescription>\n {locationSelect.testDescription}\n </FormDescription>\n <FormMessage />\n </FormItem>\n );\n }}\n />\n\n <AnimatePresence mode=\"wait\">\n {isLocalChecked && (\n <motion.div\n key=\"filePath-input\"\n initial={{ opacity: 0, height: 0 }}\n animate={{ opacity: 1, height: 'auto' }}\n exit={{ opacity: 0, height: 0 }}\n transition={{ duration: 0.3 }}\n >\n <FormInput\n name=\"filePath\"\n label={filePathInput.label.value}\n placeholder={filePathInput.placeholder.value}\n description={filePathInput.description.value}\n disabled={isSubmitting || !isLocalChecked}\n onChange={(e) => {\n const value = e.target.value;\n setEditedDictionary({\n ...dictionary,\n ...(updatedDictionary ?? {}),\n filePath: value,\n });\n }}\n />\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n <div className=\"grid grid-cols-2 gap-8 max-md:grid-cols-1\">\n <FormSelect\n name=\"importMode\"\n label={importModeSelect.label.value}\n description={importModeSelect.description.value}\n onValueChange={(value) => {\n form.setValue('importMode', value as any, { shouldDirty: true });\n setEditedDictionary({\n ...dictionary,\n ...(updatedDictionary ?? {}),\n importMode: value as any,\n });\n }}\n >\n <Select.Trigger>\n <Select.Value placeholder={importModeSelect.label.value} />\n </Select.Trigger>\n <Select.Content>\n <Select.Item value=\"static\">\n {importModeSelect.static.value}\n </Select.Item>\n <Select.Item value=\"dynamic\">\n {importModeSelect.dynamic.value}\n </Select.Item>\n <Select.Item value=\"live\">\n {importModeSelect.live.value}\n </Select.Item>\n </Select.Content>\n </FormSelect>\n </div>\n <div className=\"grid grid-cols-2 gap-8 max-md:grid-cols-1\">\n <FormMultiSelect\n name=\"projectIds\"\n label={projectInput.label.value}\n description={projectInput.description}\n onValueChange={(value) => {\n const valueArray = [value].flat();\n form.setValue('projectIds', valueArray, { shouldDirty: true });\n setEditedDictionary({\n ...dictionary,\n ...(updatedDictionary ?? {}),\n projectIds: valueArray,\n });\n }}\n >\n <MultiSelect.Trigger\n getBadgeValue={(value) =>\n projects?.find((project: any) => String(project.id) === value)\n ?.name ?? value\n }\n >\n <MultiSelect.Input placeholder={projectInput.placeholder.value} />\n </MultiSelect.Trigger>\n <MultiSelect.Content>\n <Loader isLoading={isLoadingProjects}>\n <MultiSelect.List>\n {projects?.map((project: any) => (\n <MultiSelect.Item\n key={String(project.id)}\n value={String(project.id)}\n >\n {project.name}\n </MultiSelect.Item>\n ))}\n </MultiSelect.List>\n </Loader>\n </MultiSelect.Content>\n </FormMultiSelect>\n\n <FormMultiSelect\n name=\"tags\"\n label={tagsSelect.label.value}\n description={tagsSelect.description}\n onValueChange={(value) => {\n const valueArray = [value].flat();\n form.setValue('tags', valueArray, { shouldDirty: true });\n setEditedDictionary({\n ...dictionary,\n ...(updatedDictionary ?? {}),\n tags: valueArray,\n });\n }}\n >\n <MultiSelect.Trigger\n getBadgeValue={(value) =>\n allTags?.find((tag: any) => String(tag.key) === value)?.name ??\n value\n }\n >\n <MultiSelect.Input placeholder={tagsSelect.placeholder.value} />\n </MultiSelect.Trigger>\n <MultiSelect.Content>\n <Loader isLoading={isLoadingProjects}>\n <MultiSelect.List>\n {allTags?.map((tag: any) => (\n <MultiSelect.Item\n key={String(tag.key)}\n value={String(tag.key)}\n >\n {tag.name ?? tag.key}\n </MultiSelect.Item>\n ))}\n </MultiSelect.List>\n </Loader>\n </MultiSelect.Content>\n </FormMultiSelect>\n </div>\n\n {/* Type switcher */}\n <Container\n className=\"gap-4\"\n padding=\"md\"\n roundedSize=\"2xl\"\n background=\"none\"\n border\n borderColor=\"card\"\n >\n <div className=\"flex flex-col gap-1\">\n <p className=\"ml-1 font-semibold text-sm\">{typeSwitch.label}</p>\n <p className=\"ml-1 text-muted text-xs\">{typeSwitch.description}</p>\n </div>\n <MultiSelect\n values={selectedTypes}\n onValueChange={handleTypesChange}\n className=\"max-w-xs\"\n >\n <MultiSelect.Trigger\n getBadgeValue={(val) => {\n if (val === 'collection') return String(typeSwitch.collection);\n if (val === 'variant') return String(typeSwitch.variant);\n if (val === 'meta') return String(typeSwitch.meta);\n return val;\n }}\n >\n <MultiSelect.Input placeholder={typeSwitch.label.value} />\n </MultiSelect.Trigger>\n <MultiSelect.Content>\n <MultiSelect.List>\n {QUALIFIER_TYPES.map((qualifier) => (\n <MultiSelect.Item key={qualifier} value={qualifier}>\n {typeSwitch[qualifier].value}\n </MultiSelect.Item>\n ))}\n </MultiSelect.List>\n </MultiSelect.Content>\n </MultiSelect>\n <AnimatePresence>\n {selectedTypes.includes('collection') && (\n <motion.div\n key=\"item-input\"\n initial={{ opacity: 0, height: 0 }}\n animate={{ opacity: 1, height: 'auto' }}\n exit={{ opacity: 0, height: 0 }}\n transition={{ duration: 0.2 }}\n >\n <div className=\"flex flex-col gap-2 px-1\">\n <label\n htmlFor=\"qualifier-item-value\"\n className=\"ml-1 font-medium text-sm\"\n >\n {typeSwitch.itemValueLabel}\n </label>\n <Input\n id=\"qualifier-item-value\"\n type=\"number\"\n min={1}\n value={itemValue}\n placeholder={typeSwitch.itemValuePlaceholder.value}\n onChange={(e) => {\n const value = parseInt(e.target.value, 10);\n if (!Number.isNaN(value) && value >= 1) {\n setItemValue(value);\n setEditedDictionary({\n ...dictionary,\n ...(updatedDictionary ?? {}),\n item: value,\n });\n }\n }}\n />\n </div>\n </motion.div>\n )}\n\n {selectedTypes.includes('variant') && (\n <motion.div\n key=\"variant-input\"\n initial={{ opacity: 0, height: 0 }}\n animate={{ opacity: 1, height: 'auto' }}\n exit={{ opacity: 0, height: 0 }}\n transition={{ duration: 0.2 }}\n >\n <div className=\"flex flex-col gap-2 px-1\">\n <label\n htmlFor=\"qualifier-variant-value\"\n className=\"ml-1 font-medium text-sm\"\n >\n {typeSwitch.variantValueLabel}\n </label>\n <Input\n id=\"qualifier-variant-value\"\n type=\"text\"\n value={variantValue}\n placeholder={typeSwitch.variantValuePlaceholder.value}\n onChange={(e) => {\n const value = e.target.value;\n setVariantValue(value);\n setEditedDictionary({\n ...dictionary,\n ...(updatedDictionary ?? {}),\n variant: value,\n });\n }}\n />\n </div>\n </motion.div>\n )}\n\n {selectedTypes.includes('meta') && (\n <motion.div\n key=\"meta-input\"\n initial={{ opacity: 0, height: 0 }}\n animate={{ opacity: 1, height: 'auto' }}\n exit={{ opacity: 0, height: 0 }}\n transition={{ duration: 0.2 }}\n >\n <div className=\"flex flex-col gap-2 px-1\">\n <label\n htmlFor=\"qualifier-meta-value\"\n className=\"ml-1 font-medium text-sm\"\n >\n {typeSwitch.metaValueLabel}\n </label>\n <div\n id=\"qualifier-meta-value\"\n className=\"overflow-hidden rounded-xl border border-input bg-background\"\n >\n <MonacoCode\n language=\"json\"\n showCopyButton={false}\n showLineNumbers={false}\n isDarkMode={isDarkMode}\n onChange={(value) => {\n const raw = value ?? '';\n setMetaJsonValue(raw);\n try {\n const parsed = JSON.parse(raw) as DictionaryMeta;\n setMetaJsonError(false);\n setEditedDictionary({\n ...dictionary,\n ...(updatedDictionary ?? {}),\n meta: parsed,\n });\n } catch {\n setMetaJsonError(true);\n }\n }}\n >\n {metaJsonValue}\n </MonacoCode>\n </div>\n {metaJsonError && (\n <p className=\"ml-1 text-destructive text-xs\">\n {typeSwitch.metaJsonError}\n </p>\n )}\n </div>\n </motion.div>\n )}\n\n {selectedTypes.length === 0 && showSiblingPicker && (\n <motion.div\n key=\"sibling-picker\"\n initial={{ opacity: 0, height: 0 }}\n animate={{ opacity: 1, height: 'auto' }}\n exit={{ opacity: 0, height: 0 }}\n transition={{ duration: 0.2 }}\n >\n <Container\n background=\"none\"\n border\n borderColor=\"neutral\"\n roundedSize=\"xl\"\n padding=\"md\"\n className=\"gap-3\"\n >\n <p className=\"font-medium text-sm\">\n {typeSwitch.disablePickerTitle}\n </p>\n <p className=\"text-muted text-xs\">\n {typeSwitch.disablePickerDescription}\n </p>\n <div className=\"flex flex-wrap gap-2\">\n {allQualifiedSiblings.map((sibling) => (\n <button\n key={sibling.localId}\n type=\"button\"\n onClick={() => {\n onSelectSibling?.(sibling);\n setShowSiblingPicker(false);\n }}\n className=\"cursor-pointer rounded-lg border border-border px-3 py-1 text-xs transition-colors hover:bg-text/10\"\n >\n {sibling.variant !== undefined && (\n <span>\n {qualifierSection.variant}: {sibling.variant}\n </span>\n )}\n {sibling.item !== undefined && (\n <span>\n {qualifierSection.item}: {sibling.item}\n </span>\n )}\n {sibling.meta !== undefined && (\n <span>\n {qualifierSection.meta}: {String(sibling.meta.id)}\n </span>\n )}\n </button>\n ))}\n </div>\n </Container>\n </motion.div>\n )}\n </AnimatePresence>\n </Container>\n\n {/* Sibling dictionaries panel */}\n <Container\n className=\"gap-4\"\n padding=\"md\"\n roundedSize=\"2xl\"\n background=\"none\"\n border\n borderColor=\"neutral\"\n >\n <p className=\"font-semibold text-sm\">{siblingContent.title}</p>\n <Loader isLoading={isLoadingSiblings}>\n {!hasSiblings && (\n <p className=\"text-muted text-sm\">{siblingContent.noSiblings}</p>\n )}\n\n {allItemDicts.length > 0 && (\n <div className=\"flex flex-col gap-2\">\n <p className=\"font-medium text-muted text-xs uppercase tracking-wide\">\n {siblingContent.collectionItems}\n </p>\n <Pagination\n currentPage={\n allItemDicts.findIndex(\n (dictionaryEl) =>\n dictionaryEl.localId === dictionary.localId\n ) + 1 || 1\n }\n totalPages={allItemDicts.length}\n onPageChange={(page) => {\n const target = allItemDicts[page - 1];\n if (target && onSelectSibling) {\n onSelectSibling(target);\n }\n }}\n showPrevNext\n />\n <div className=\"mt-1 flex flex-wrap gap-2\">\n {allItemDicts.map((sibling) => {\n const isActive = sibling.localId === dictionary.localId;\n return (\n <button\n key={sibling.localId}\n type=\"button\"\n onClick={() => !isActive && onSelectSibling?.(sibling)}\n className={cn(\n 'rounded-lg px-3 py-1 text-xs transition-colors',\n isActive\n ? 'bg-text font-semibold text-text-opposite'\n : 'cursor-pointer border border-border hover:bg-text/10'\n )}\n >\n {siblingContent.itemIndex} {sibling.item}\n </button>\n );\n })}\n </div>\n </div>\n )}\n\n {allVariantDicts.length > 0 && (\n <div className=\"flex flex-col gap-2\">\n <p className=\"font-medium text-muted text-xs uppercase tracking-wide\">\n {siblingContent.variants}\n </p>\n <div className=\"flex flex-wrap gap-2\">\n {allVariantDicts.map((sibling) => {\n const isActive = sibling.localId === dictionary.localId;\n return (\n <button\n key={sibling.localId}\n type=\"button\"\n onClick={() => !isActive && onSelectSibling?.(sibling)}\n className={cn(\n 'rounded-lg px-3 py-1 text-xs transition-colors',\n isActive\n ? 'bg-text font-semibold text-text-opposite'\n : 'cursor-pointer border border-border hover:bg-text/10'\n )}\n >\n {sibling.variant}\n </button>\n );\n })}\n </div>\n </div>\n )}\n\n {allMetaDicts.length > 0 && (\n <div className=\"flex flex-col gap-2\">\n <p className=\"font-medium text-muted text-xs uppercase tracking-wide\">\n {siblingContent.metaRecords}\n </p>\n <div className=\"flex flex-wrap gap-2\">\n {allMetaDicts.map((sibling) => {\n const isActive = sibling.localId === dictionary.localId;\n return (\n <button\n key={sibling.localId}\n type=\"button\"\n onClick={() => !isActive && onSelectSibling?.(sibling)}\n className={cn(\n 'rounded-lg px-3 py-1 text-xs transition-colors',\n isActive\n ? 'bg-text font-semibold text-text-opposite'\n : 'cursor-pointer border border-border hover:bg-text/10'\n )}\n >\n {sibling.meta?.id}\n </button>\n );\n })}\n </div>\n </div>\n )}\n </Loader>\n </Container>\n\n <div className=\"flex flex-wrap items-center justify-end gap-2 max-md:flex-col\">\n <FormButton\n type=\"button\"\n size=\"icon-md\"\n label={auditButton.label.value}\n Icon={WandSparkles}\n variant=\"outline\"\n color=\"text\"\n className=\"max-md:w-full\"\n onClick={handleOnAuditFile}\n disabled={isSubmitting || isAuditing}\n isLoading={isAuditing}\n />\n </div>\n </Form>\n );\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DictionaryDetailsForm.mjs","names":["useForm","FormEditableFieldInput","FormEditableFieldTextArea","FormLabel","FormInput","FormSelect","FormMultiSelect","FormButton"],"sources":["../../../../../src/components/DictionaryFieldEditor/DictionaryDetails/DictionaryDetailsForm.tsx"],"sourcesContent":["'use client';\n\nimport {\n useAuditContentDeclarationMetadata,\n useGetDictionaries,\n useGetProjects,\n useGetTags,\n} from '@api/index';\nimport { useSession } from '@api/useAuth';\n\nimport { Container } from '@components/Container';\nimport {\n Form,\n FormButton,\n FormDescription,\n FormEditableFieldInput,\n FormEditableFieldTextArea,\n FormField,\n FormInput,\n FormItem,\n FormLabel,\n FormMessage,\n FormMultiSelect,\n FormSelect,\n useForm,\n} from '@components/Form';\nimport { Checkbox, Input } from '@components/Input';\nimport { Loader } from '@components/Loader';\nimport { Pagination } from '@components/Pagination';\nimport { MultiSelect, Select } from '@components/Select';\nimport { useEditedContent } from '@intlayer/editor-react';\nimport type { Dictionary, LocalDictionaryId } from '@intlayer/types/dictionary';\nimport { cn } from '@utils/cn';\nimport { AnimatePresence, motion } from 'framer-motion';\nimport { WandSparkles } from 'lucide-react';\nimport { type FC, useEffect, useMemo, useState } from 'react';\nimport { useWatch } from 'react-hook-form';\nimport { useIntlayer } from 'react-intlayer';\nimport { useDictionaryDetailsSchema } from './useDictionaryDetailsSchema';\n\ntype DictionaryDetailsProps = {\n dictionary: Dictionary;\n mode: ('local' | 'remote')[];\n onSelectSibling?: (dictionary: Dictionary) => void;\n isDarkMode?: boolean;\n};\n\ntype QualifierType = 'collection' | 'variant';\n\nconst QUALIFIER_TYPES: QualifierType[] = ['collection', 'variant'];\n\n/** Derive active qualifier types from dictionary qualifier fields. */\nconst deriveQualifierTypes = (dict: Dictionary): QualifierType[] => {\n const types: QualifierType[] = [];\n if (dict.item !== undefined) types.push('collection');\n if (dict.variant !== undefined) types.push('variant');\n return types;\n};\n\n/**\n * A variant can be a named string or a structured object. The CMS edits it as\n * text: a value starting with `{` is parsed as JSON (object variant), anything\n * else is kept as a named-variant string.\n */\nconst formatVariant = (\n variant: string | Record<string, string | number> | undefined\n): string =>\n variant !== null && typeof variant === 'object'\n ? JSON.stringify(variant)\n : (variant ?? '');\n\nconst parseVariantInput = (\n raw: string\n): { variant: string | Record<string, string | number>; error: boolean } => {\n if (raw.trim().startsWith('{')) {\n try {\n return {\n variant: JSON.parse(raw) as Record<string, string | number>,\n error: false,\n };\n } catch {\n return { variant: raw, error: true };\n }\n }\n return { variant: raw, error: false };\n};\n\nexport const DictionaryDetailsForm: FC<DictionaryDetailsProps> = ({\n dictionary,\n mode,\n onSelectSibling,\n}) => {\n const { session } = useSession();\n const { project } = session ?? {};\n const { data: projectsData, isLoading: isLoadingProjects } =\n useGetProjects() as any;\n const { data: tagsData } = useGetTags() as any;\n\n const projects = (projectsData?.data ?? []) as any[];\n const allTags = (tagsData?.data ?? []) as any[];\n\n const DictionaryDetailsSchema = useDictionaryDetailsSchema(\n String(project?.id)\n );\n const { form, isSubmitting } = useForm(DictionaryDetailsSchema, {\n defaultValues: {\n ...dictionary,\n location: dictionary.location ?? 'remote',\n },\n });\n const { editedContent, setEditedDictionary } = useEditedContent();\n const {\n titleInput,\n keyInput,\n descriptionInput,\n projectInput,\n tagsSelect,\n locationSelect,\n importModeSelect,\n filePathInput,\n auditButton,\n qualifierSection,\n siblingDictionaries: siblingContent,\n typeSwitch,\n } = useIntlayer('dictionary-details');\n const { mutate: auditContentDeclaration, isPending: isAuditing } =\n useAuditContentDeclarationMetadata();\n const updatedDictionary =\n editedContent?.[dictionary.localId as LocalDictionaryId];\n\n const { data: siblingsData, isLoading: isLoadingSiblings } =\n useGetDictionaries(\n { keys: [dictionary.key] },\n { enabled: !!dictionary.key }\n );\n\n const siblings = useMemo<Dictionary[]>(\n () =>\n ((siblingsData?.data ?? []) as unknown as Dictionary[]).filter(\n (d: Dictionary) => d.localId !== dictionary.localId\n ),\n [siblingsData, dictionary.localId]\n );\n\n const itemSiblings = useMemo(\n () =>\n siblings\n .filter((d) => d.item !== undefined)\n .sort((a, b) => (a.item ?? 0) - (b.item ?? 0)),\n [siblings]\n );\n\n const variantSiblings = useMemo(\n () => siblings.filter((d) => d.variant !== undefined),\n [siblings]\n );\n\n const allItemDicts = useMemo<Dictionary[]>(() => {\n if (dictionary.item !== undefined) {\n const combined = [dictionary, ...itemSiblings].sort(\n (a, b) => (a.item ?? 0) - (b.item ?? 0)\n );\n return combined;\n }\n return itemSiblings;\n }, [dictionary, itemSiblings]);\n\n const allVariantDicts = useMemo<Dictionary[]>(() => {\n if (dictionary.variant !== undefined) {\n return [dictionary, ...variantSiblings];\n }\n return variantSiblings;\n }, [dictionary, variantSiblings]);\n\n useEffect(() => {\n form.reset({\n ...dictionary,\n tags: dictionary.tags ?? [],\n location: dictionary.location ?? 'remote',\n });\n setSelectedTypes(deriveQualifierTypes(dictionary));\n setItemValue(dictionary.item ?? 1);\n setVariantValue(formatVariant(dictionary.variant));\n setVariantJsonError(false);\n setShowSiblingPicker(false);\n }, [dictionary, form?.reset]);\n\n useEffect(() => {\n if (typeof updatedDictionary === 'undefined') {\n form.reset({\n ...dictionary,\n tags: dictionary.tags ?? [],\n location: dictionary.location ?? 'remote',\n });\n }\n }, [updatedDictionary]);\n\n const handleOnAuditFile = () => {\n const dictionaryToAudit = {\n ...dictionary,\n ...updatedDictionary,\n };\n\n auditContentDeclaration(\n {\n fileContent: JSON.stringify(dictionaryToAudit),\n },\n {\n onSuccess: (response) => {\n if (!response?.data) return;\n\n const auditedDictionary = response.data.fileContent;\n\n const merged = {\n ...dictionaryToAudit,\n ...auditedDictionary,\n tags: auditedDictionary.tags ?? dictionaryToAudit.tags ?? [],\n };\n\n setEditedDictionary(merged as Dictionary);\n form.reset(merged);\n },\n }\n );\n };\n\n const watchedLocation = useWatch({\n control: form.control,\n name: 'location',\n });\n const isLocalChecked =\n watchedLocation === 'local' || watchedLocation === 'hybrid';\n\n const hasSiblings = siblings.length > 0;\n\n const [selectedTypes, setSelectedTypes] = useState<QualifierType[]>(() =>\n deriveQualifierTypes(dictionary)\n );\n const [itemValue, setItemValue] = useState<number>(dictionary.item ?? 1);\n const [variantValue, setVariantValue] = useState<string>(\n formatVariant(dictionary.variant)\n );\n const [variantJsonError, setVariantJsonError] = useState(false);\n const [showSiblingPicker, setShowSiblingPicker] = useState(false);\n\n const allQualifiedSiblings = useMemo<Dictionary[]>(\n () => [...itemSiblings, ...variantSiblings],\n [itemSiblings, variantSiblings]\n );\n\n const handleTypesChange = (newTypes: string | string[]) => {\n const nextTypes = [newTypes].flat() as QualifierType[];\n const added = nextTypes.filter((t) => !selectedTypes.includes(t));\n const removed = selectedTypes.filter((t) => !nextTypes.includes(t));\n\n let base = { ...dictionary, ...(updatedDictionary ?? {}) };\n\n for (const qualifier of removed) {\n if (qualifier === 'collection') base = { ...base, item: undefined };\n if (qualifier === 'variant') base = { ...base, variant: undefined };\n }\n\n for (const qualifier of added) {\n if (qualifier === 'collection') {\n const nextItem =\n allItemDicts.length > 0\n ? Math.max(...allItemDicts.map((d) => d.item ?? 0)) + 1\n : 1;\n setItemValue(nextItem);\n base = { ...base, item: nextItem };\n } else if (qualifier === 'variant') {\n const newVariant = variantValue || 'default';\n setVariantValue(newVariant);\n base = { ...base, variant: parseVariantInput(newVariant).variant };\n }\n }\n\n setSelectedTypes(nextTypes);\n setEditedDictionary(base);\n setVariantJsonError(false);\n\n if (nextTypes.length === 0 && allQualifiedSiblings.length > 0) {\n setShowSiblingPicker(true);\n } else {\n setShowSiblingPicker(false);\n }\n };\n\n return (\n <Form\n className=\"flex w-full flex-col gap-8\"\n {...form}\n schema={DictionaryDetailsSchema}\n >\n <div className=\"grid grid-cols-2 gap-8 max-md:grid-cols-1\">\n <FormEditableFieldInput\n name=\"key\"\n label={keyInput.label}\n placeholder={keyInput.label.value}\n description={keyInput.description}\n disabled={isSubmitting}\n isRequired\n onSave={(value) => {\n form.setValue('key', value, { shouldDirty: true });\n setEditedDictionary({\n ...dictionary,\n ...(updatedDictionary ?? {}),\n key: value,\n });\n }}\n />\n <FormEditableFieldInput\n name=\"title\"\n label={titleInput.label}\n placeholder={titleInput.placeholder.value}\n description={titleInput.description}\n disabled={isSubmitting}\n onSave={(value) => {\n form.setValue('title', value, { shouldDirty: true });\n setEditedDictionary({\n ...dictionary,\n ...(updatedDictionary ?? {}),\n title: value,\n });\n }}\n />\n </div>\n <FormEditableFieldTextArea\n name=\"description\"\n label={descriptionInput.label}\n placeholder={descriptionInput.placeholder.value}\n description={descriptionInput.description}\n disabled={isSubmitting}\n onSave={(value) => {\n form.setValue('description', value, { shouldDirty: true });\n setEditedDictionary({\n ...dictionary,\n ...(updatedDictionary ?? {}),\n description: value,\n });\n }}\n />\n <div className=\"grid grid-cols-2 gap-8 px-1 max-md:grid-cols-1\">\n <FormField\n control={form.control}\n name=\"location\"\n render={({ field }) => {\n const value = field.value;\n const isLocal = value === 'local' || value === 'hybrid';\n const isRemote = value === 'remote' || value === 'hybrid';\n\n const handleLocalToggle = (isChecked: boolean) => {\n if (!isChecked && !isRemote) return;\n\n const newValue: Dictionary['location'] = isChecked\n ? isRemote\n ? 'hybrid'\n : 'local'\n : 'remote';\n\n field.onChange(newValue);\n\n const newFilePath = isChecked\n ? (form.getValues('filePath') ?? dictionary.filePath)\n : undefined;\n\n if (!isChecked) {\n form.setValue('filePath', undefined);\n }\n\n setEditedDictionary({\n ...dictionary,\n ...(updatedDictionary ?? {}),\n location: newValue,\n filePath: newFilePath,\n });\n };\n\n const handleRemoteToggle = (isChecked: boolean) => {\n if (!isChecked && !isLocal) return;\n\n const newValue: Dictionary['location'] = isChecked\n ? isLocal\n ? 'hybrid'\n : 'remote'\n : 'local';\n\n field.onChange(newValue);\n\n setEditedDictionary({\n ...dictionary,\n ...(updatedDictionary ?? {}),\n location: newValue,\n });\n };\n\n return (\n <FormItem className=\"flex flex-col gap-2 px-1\">\n <FormLabel className=\"ml-1\">{locationSelect.label}</FormLabel>\n <div className=\"ml-2 flex items-center gap-4 py-2\">\n <Checkbox\n id=\"location-local\"\n name=\"location-local\"\n label={locationSelect.local.value}\n color=\"text\"\n checked={isLocal}\n disabled={\n !mode.includes('local') && !mode.includes('remote')\n }\n onChange={(e) => handleLocalToggle(e.target.checked)}\n />\n <Checkbox\n id=\"location-remote\"\n name=\"location-remote\"\n label={locationSelect.remote.value}\n color=\"text\"\n checked={isRemote}\n disabled={\n !mode.includes('remote') &&\n dictionary.location !== 'remote' &&\n dictionary.location !== 'hybrid'\n }\n onChange={(e) => handleRemoteToggle(e.target.checked)}\n />\n </div>\n <FormDescription>\n {locationSelect.testDescription}\n </FormDescription>\n <FormMessage />\n </FormItem>\n );\n }}\n />\n\n <AnimatePresence mode=\"wait\">\n {isLocalChecked && (\n <motion.div\n key=\"filePath-input\"\n initial={{ opacity: 0, height: 0 }}\n animate={{ opacity: 1, height: 'auto' }}\n exit={{ opacity: 0, height: 0 }}\n transition={{ duration: 0.3 }}\n >\n <FormInput\n name=\"filePath\"\n label={filePathInput.label.value}\n placeholder={filePathInput.placeholder.value}\n description={filePathInput.description.value}\n disabled={isSubmitting || !isLocalChecked}\n onChange={(e) => {\n const value = e.target.value;\n setEditedDictionary({\n ...dictionary,\n ...(updatedDictionary ?? {}),\n filePath: value,\n });\n }}\n />\n </motion.div>\n )}\n </AnimatePresence>\n </div>\n <div className=\"grid grid-cols-2 gap-8 max-md:grid-cols-1\">\n <FormSelect\n name=\"importMode\"\n label={importModeSelect.label.value}\n description={importModeSelect.description.value}\n onValueChange={(value) => {\n form.setValue('importMode', value as any, { shouldDirty: true });\n setEditedDictionary({\n ...dictionary,\n ...(updatedDictionary ?? {}),\n importMode: value as any,\n });\n }}\n >\n <Select.Trigger>\n <Select.Value placeholder={importModeSelect.label.value} />\n </Select.Trigger>\n <Select.Content>\n <Select.Item value=\"static\">\n {importModeSelect.static.value}\n </Select.Item>\n <Select.Item value=\"dynamic\">\n {importModeSelect.dynamic.value}\n </Select.Item>\n <Select.Item value=\"live\">\n {importModeSelect.live.value}\n </Select.Item>\n </Select.Content>\n </FormSelect>\n </div>\n <div className=\"grid grid-cols-2 gap-8 max-md:grid-cols-1\">\n <FormMultiSelect\n name=\"projectIds\"\n label={projectInput.label.value}\n description={projectInput.description}\n onValueChange={(value) => {\n const valueArray = [value].flat();\n form.setValue('projectIds', valueArray, { shouldDirty: true });\n setEditedDictionary({\n ...dictionary,\n ...(updatedDictionary ?? {}),\n projectIds: valueArray,\n });\n }}\n >\n <MultiSelect.Trigger\n getBadgeValue={(value) =>\n projects?.find((project: any) => String(project.id) === value)\n ?.name ?? value\n }\n >\n <MultiSelect.Input placeholder={projectInput.placeholder.value} />\n </MultiSelect.Trigger>\n <MultiSelect.Content>\n <Loader isLoading={isLoadingProjects}>\n <MultiSelect.List>\n {projects?.map((project: any) => (\n <MultiSelect.Item\n key={String(project.id)}\n value={String(project.id)}\n >\n {project.name}\n </MultiSelect.Item>\n ))}\n </MultiSelect.List>\n </Loader>\n </MultiSelect.Content>\n </FormMultiSelect>\n\n <FormMultiSelect\n name=\"tags\"\n label={tagsSelect.label.value}\n description={tagsSelect.description}\n onValueChange={(value) => {\n const valueArray = [value].flat();\n form.setValue('tags', valueArray, { shouldDirty: true });\n setEditedDictionary({\n ...dictionary,\n ...(updatedDictionary ?? {}),\n tags: valueArray,\n });\n }}\n >\n <MultiSelect.Trigger\n getBadgeValue={(value) =>\n allTags?.find((tag: any) => String(tag.key) === value)?.name ??\n value\n }\n >\n <MultiSelect.Input placeholder={tagsSelect.placeholder.value} />\n </MultiSelect.Trigger>\n <MultiSelect.Content>\n <Loader isLoading={isLoadingProjects}>\n <MultiSelect.List>\n {allTags?.map((tag: any) => (\n <MultiSelect.Item\n key={String(tag.key)}\n value={String(tag.key)}\n >\n {tag.name ?? tag.key}\n </MultiSelect.Item>\n ))}\n </MultiSelect.List>\n </Loader>\n </MultiSelect.Content>\n </FormMultiSelect>\n </div>\n\n {/* Type switcher */}\n <Container\n className=\"gap-4\"\n padding=\"md\"\n roundedSize=\"2xl\"\n background=\"none\"\n border\n borderColor=\"card\"\n >\n <div className=\"flex flex-col gap-1\">\n <p className=\"ml-1 font-semibold text-sm\">{typeSwitch.label}</p>\n <p className=\"ml-1 text-muted text-xs\">{typeSwitch.description}</p>\n </div>\n <MultiSelect\n values={selectedTypes}\n onValueChange={handleTypesChange}\n className=\"max-w-xs\"\n >\n <MultiSelect.Trigger\n getBadgeValue={(val) => {\n if (val === 'collection') return String(typeSwitch.collection);\n if (val === 'variant') return String(typeSwitch.variant);\n return val;\n }}\n >\n <MultiSelect.Input placeholder={typeSwitch.label.value} />\n </MultiSelect.Trigger>\n <MultiSelect.Content>\n <MultiSelect.List>\n {QUALIFIER_TYPES.map((qualifier) => (\n <MultiSelect.Item key={qualifier} value={qualifier}>\n {typeSwitch[qualifier].value}\n </MultiSelect.Item>\n ))}\n </MultiSelect.List>\n </MultiSelect.Content>\n </MultiSelect>\n <AnimatePresence>\n {selectedTypes.includes('collection') && (\n <motion.div\n key=\"item-input\"\n initial={{ opacity: 0, height: 0 }}\n animate={{ opacity: 1, height: 'auto' }}\n exit={{ opacity: 0, height: 0 }}\n transition={{ duration: 0.2 }}\n >\n <div className=\"flex flex-col gap-2 px-1\">\n <label\n htmlFor=\"qualifier-item-value\"\n className=\"ml-1 font-medium text-sm\"\n >\n {typeSwitch.itemValueLabel}\n </label>\n <Input\n id=\"qualifier-item-value\"\n type=\"number\"\n min={1}\n value={itemValue}\n placeholder={typeSwitch.itemValuePlaceholder.value}\n onChange={(e) => {\n const value = parseInt(e.target.value, 10);\n if (!Number.isNaN(value) && value >= 1) {\n setItemValue(value);\n setEditedDictionary({\n ...dictionary,\n ...(updatedDictionary ?? {}),\n item: value,\n });\n }\n }}\n />\n </div>\n </motion.div>\n )}\n\n {selectedTypes.includes('variant') && (\n <motion.div\n key=\"variant-input\"\n initial={{ opacity: 0, height: 0 }}\n animate={{ opacity: 1, height: 'auto' }}\n exit={{ opacity: 0, height: 0 }}\n transition={{ duration: 0.2 }}\n >\n <div className=\"flex flex-col gap-2 px-1\">\n <label\n htmlFor=\"qualifier-variant-value\"\n className=\"ml-1 font-medium text-sm\"\n >\n {typeSwitch.variantValueLabel}\n </label>\n <Input\n id=\"qualifier-variant-value\"\n type=\"text\"\n value={variantValue}\n placeholder={typeSwitch.variantValuePlaceholder.value}\n onChange={(e) => {\n const value = e.target.value;\n setVariantValue(value);\n const { variant, error } = parseVariantInput(value);\n setVariantJsonError(error);\n if (!error) {\n setEditedDictionary({\n ...dictionary,\n ...(updatedDictionary ?? {}),\n variant,\n });\n }\n }}\n />\n {variantJsonError && (\n <p className=\"ml-1 text-destructive text-xs\">\n {typeSwitch.variantJsonError}\n </p>\n )}\n </div>\n </motion.div>\n )}\n\n {selectedTypes.length === 0 && showSiblingPicker && (\n <motion.div\n key=\"sibling-picker\"\n initial={{ opacity: 0, height: 0 }}\n animate={{ opacity: 1, height: 'auto' }}\n exit={{ opacity: 0, height: 0 }}\n transition={{ duration: 0.2 }}\n >\n <Container\n background=\"none\"\n border\n borderColor=\"neutral\"\n roundedSize=\"xl\"\n padding=\"md\"\n className=\"gap-3\"\n >\n <p className=\"font-medium text-sm\">\n {typeSwitch.disablePickerTitle}\n </p>\n <p className=\"text-muted text-xs\">\n {typeSwitch.disablePickerDescription}\n </p>\n <div className=\"flex flex-wrap gap-2\">\n {allQualifiedSiblings.map((sibling) => (\n <button\n key={sibling.localId}\n type=\"button\"\n onClick={() => {\n onSelectSibling?.(sibling);\n setShowSiblingPicker(false);\n }}\n className=\"cursor-pointer rounded-lg border border-border px-3 py-1 text-xs transition-colors hover:bg-text/10\"\n >\n {sibling.variant !== undefined && (\n <span>\n {qualifierSection.variant}:{' '}\n {formatVariant(sibling.variant)}\n </span>\n )}\n {sibling.item !== undefined && (\n <span>\n {qualifierSection.item}: {sibling.item}\n </span>\n )}\n </button>\n ))}\n </div>\n </Container>\n </motion.div>\n )}\n </AnimatePresence>\n </Container>\n\n {/* Sibling dictionaries panel */}\n <Container\n className=\"gap-4\"\n padding=\"md\"\n roundedSize=\"2xl\"\n background=\"none\"\n border\n borderColor=\"neutral\"\n >\n <p className=\"font-semibold text-sm\">{siblingContent.title}</p>\n <Loader isLoading={isLoadingSiblings}>\n {!hasSiblings && (\n <p className=\"text-muted text-sm\">{siblingContent.noSiblings}</p>\n )}\n\n {allItemDicts.length > 0 && (\n <div className=\"flex flex-col gap-2\">\n <p className=\"font-medium text-muted text-xs uppercase tracking-wide\">\n {siblingContent.collectionItems}\n </p>\n <Pagination\n currentPage={\n allItemDicts.findIndex(\n (dictionaryEl) =>\n dictionaryEl.localId === dictionary.localId\n ) + 1 || 1\n }\n totalPages={allItemDicts.length}\n onPageChange={(page) => {\n const target = allItemDicts[page - 1];\n if (target && onSelectSibling) {\n onSelectSibling(target);\n }\n }}\n showPrevNext\n />\n <div className=\"mt-1 flex flex-wrap gap-2\">\n {allItemDicts.map((sibling) => {\n const isActive = sibling.localId === dictionary.localId;\n return (\n <button\n key={sibling.localId}\n type=\"button\"\n onClick={() => !isActive && onSelectSibling?.(sibling)}\n className={cn(\n 'rounded-lg px-3 py-1 text-xs transition-colors',\n isActive\n ? 'bg-text font-semibold text-text-opposite'\n : 'cursor-pointer border border-border hover:bg-text/10'\n )}\n >\n {siblingContent.itemIndex} {sibling.item}\n </button>\n );\n })}\n </div>\n </div>\n )}\n\n {allVariantDicts.length > 0 && (\n <div className=\"flex flex-col gap-2\">\n <p className=\"font-medium text-muted text-xs uppercase tracking-wide\">\n {siblingContent.variants}\n </p>\n <div className=\"flex flex-wrap gap-2\">\n {allVariantDicts.map((sibling) => {\n const isActive = sibling.localId === dictionary.localId;\n return (\n <button\n key={sibling.localId}\n type=\"button\"\n onClick={() => !isActive && onSelectSibling?.(sibling)}\n className={cn(\n 'rounded-lg px-3 py-1 text-xs transition-colors',\n isActive\n ? 'bg-text font-semibold text-text-opposite'\n : 'cursor-pointer border border-border hover:bg-text/10'\n )}\n >\n {formatVariant(sibling.variant)}\n </button>\n );\n })}\n </div>\n </div>\n )}\n </Loader>\n </Container>\n\n <div className=\"flex flex-wrap items-center justify-end gap-2 max-md:flex-col\">\n <FormButton\n type=\"button\"\n size=\"icon-md\"\n label={auditButton.label.value}\n Icon={WandSparkles}\n variant=\"outline\"\n color=\"text\"\n className=\"max-md:w-full\"\n onClick={handleOnAuditFile}\n disabled={isSubmitting || isAuditing}\n isLoading={isAuditing}\n />\n </div>\n </Form>\n );\n};\n"],"mappings":"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"}
|
package/dist/esm/components/DictionaryFieldEditor/DictionaryDetails/dictionaryDetails.content.mjs
CHANGED
|
@@ -986,7 +986,7 @@ const dictionaryDetailsContent = {
|
|
|
986
986
|
vi: "{ \"id\": \"my-record\" }",
|
|
987
987
|
uk: "{ \"id\": \"my-record\" }"
|
|
988
988
|
}),
|
|
989
|
-
|
|
989
|
+
variantJsonError: t({
|
|
990
990
|
en: "Invalid JSON. Please fix before saving.",
|
|
991
991
|
"en-GB": "Invalid JSON. Please fix before saving.",
|
|
992
992
|
fr: "JSON invalide. Veuillez corriger avant de sauvegarder.",
|