sanity-plugin-internationalized-array 2.0.0 → 2.0.1-canary.1
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/lib/index.d.mts +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/index.esm.js +123 -109
- package/lib/index.esm.js.map +1 -1
- package/lib/index.js +122 -109
- package/lib/index.js.map +1 -1
- package/lib/index.mjs +123 -109
- package/lib/index.mjs.map +1 -1
- package/package.json +25 -31
- package/src/cache.ts +1 -1
- package/src/components/AddButtons.tsx +4 -1
- package/src/components/DocumentAddButtons.tsx +53 -52
- package/src/components/InternationalizedArray.tsx +3 -1
- package/src/components/InternationalizedArrayContext.tsx +10 -19
- package/src/fieldActions/index.ts +8 -2
- package/src/plugin.tsx +6 -4
- package/src/schema/array.ts +7 -1
- package/src/schema/object.ts +1 -1
- package/src/types.ts +1 -1
- package/src/utils/createAddLanguagePatches.ts +18 -10
- package/src/utils/getDocumentsToTranslate.ts +66 -0
package/lib/index.mjs
CHANGED
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import * as suspend from "suspend-react";
|
|
2
2
|
import { suspend as suspend$1 } from "suspend-react";
|
|
3
3
|
import { jsx, jsxs, Fragment } from "react/jsx-runtime";
|
|
4
|
-
import { isSanityDocument, setIfMissing, insert, PatchEvent, useClient, useWorkspace,
|
|
4
|
+
import { isSanityDocument, setIfMissing, insert, PatchEvent, useClient, useWorkspace, defineDocumentFieldAction, useFormValue, set, ArrayOfObjectsItem, MemberItemError, defineField, unset, isDocumentSchemaType, definePlugin, isObjectInputProps } from "sanity";
|
|
5
5
|
import { useLanguageFilterStudioContext } from "@sanity/language-filter";
|
|
6
6
|
import { Grid, Button, useToast, Stack, Box, Text, Card, Code, Label, MenuButton, Menu, MenuItem, Flex, Spinner } from "@sanity/ui";
|
|
7
7
|
import equal from "fast-deep-equal";
|
|
8
|
-
import {
|
|
8
|
+
import { memo, useCallback, createContext, useContext, useDeferredValue, useMemo, useRef, useEffect, createElement } from "react";
|
|
9
9
|
import { useDocumentPane } from "sanity/structure";
|
|
10
10
|
import { AddIcon, TranslateIcon, RemoveCircleIcon } from "@sanity/icons";
|
|
11
11
|
import get from "lodash/get.js";
|
|
12
|
-
const namespace = "sanity-plugin-internationalized-array", version = "
|
|
12
|
+
const namespace = "sanity-plugin-internationalized-array", version = "v1", preload = (fn) => suspend.preload(() => fn(), [version, namespace]), clear = () => suspend.clear([version, namespace]), peek = (selectedValue) => suspend.peek([version, namespace, selectedValue]), MAX_COLUMNS = 7, CONFIG_DEFAULT = {
|
|
13
13
|
languages: [],
|
|
14
14
|
select: {},
|
|
15
15
|
defaultLanguages: [],
|
|
@@ -17,10 +17,35 @@ const namespace = "sanity-plugin-internationalized-array", version = "v0", prelo
|
|
|
17
17
|
apiVersion: "2022-11-27",
|
|
18
18
|
buttonLocations: ["field"],
|
|
19
19
|
buttonAddAll: !0
|
|
20
|
+
}, getDocumentsToTranslate = (value, rootPath = []) => {
|
|
21
|
+
if (Array.isArray(value)) {
|
|
22
|
+
const arrayRootPath = [...rootPath], internationalizedValues = value.filter((item) => {
|
|
23
|
+
if (Array.isArray(item)) return !1;
|
|
24
|
+
if (typeof item == "object") {
|
|
25
|
+
const type = item?._type;
|
|
26
|
+
return type?.startsWith("internationalizedArray") && type?.endsWith("Value");
|
|
27
|
+
}
|
|
28
|
+
return !1;
|
|
29
|
+
});
|
|
30
|
+
return internationalizedValues.length > 0 ? internationalizedValues.map((internationalizedValue) => ({
|
|
31
|
+
...internationalizedValue,
|
|
32
|
+
path: arrayRootPath,
|
|
33
|
+
pathString: arrayRootPath.join(".")
|
|
34
|
+
})) : value.length > 0 ? value.map(
|
|
35
|
+
(item, index) => getDocumentsToTranslate(item, [...arrayRootPath, index])
|
|
36
|
+
).flat() : [];
|
|
37
|
+
}
|
|
38
|
+
if (typeof value == "object" && value) {
|
|
39
|
+
const startsWithUnderscoreRegex = /^_/;
|
|
40
|
+
return Object.keys(value).filter(
|
|
41
|
+
(key) => !key.match(startsWithUnderscoreRegex)
|
|
42
|
+
).map((item) => {
|
|
43
|
+
const selectedValue = value[item], path = [...rootPath, item];
|
|
44
|
+
return getDocumentsToTranslate(selectedValue, path);
|
|
45
|
+
}).flat();
|
|
46
|
+
}
|
|
47
|
+
return [];
|
|
20
48
|
};
|
|
21
|
-
function createValueSchemaTypeName(schemaType) {
|
|
22
|
-
return `${schemaType.name}Value`;
|
|
23
|
-
}
|
|
24
49
|
function AddButtons(props) {
|
|
25
50
|
const { languages, readOnly, value, onClick } = props;
|
|
26
51
|
return languages.length > 0 ? /* @__PURE__ */ jsx(Grid, { columns: Math.min(languages.length, MAX_COLUMNS), gap: 2, children: languages.map((language) => /* @__PURE__ */ jsx(
|
|
@@ -29,7 +54,7 @@ function AddButtons(props) {
|
|
|
29
54
|
tone: "primary",
|
|
30
55
|
mode: "ghost",
|
|
31
56
|
fontSize: 1,
|
|
32
|
-
disabled: readOnly || !!
|
|
57
|
+
disabled: readOnly || !!value?.find((item) => item._key === language.id),
|
|
33
58
|
text: language.id.toUpperCase(),
|
|
34
59
|
icon: languages.length > MAX_COLUMNS ? void 0 : AddIcon,
|
|
35
60
|
value: language.id,
|
|
@@ -38,14 +63,10 @@ function AddButtons(props) {
|
|
|
38
63
|
language.id
|
|
39
64
|
)) }) : null;
|
|
40
65
|
}
|
|
66
|
+
var AddButtons$1 = memo(AddButtons);
|
|
41
67
|
function DocumentAddButtons(props) {
|
|
42
|
-
const { filteredLanguages } = useInternationalizedArrayContext(),
|
|
43
|
-
() =>
|
|
44
|
-
(field) => field.type.name.startsWith("internationalizedArray")
|
|
45
|
-
),
|
|
46
|
-
[fields]
|
|
47
|
-
), handleDocumentButtonClick = useCallback(
|
|
48
|
-
(event) => {
|
|
68
|
+
const { filteredLanguages } = useInternationalizedArrayContext(), value = isSanityDocument(props.value) ? props.value : void 0, toast = useToast(), { onChange } = useDocumentPane(), documentsToTranslation = getDocumentsToTranslate(value, []), handleDocumentButtonClick = useCallback(
|
|
69
|
+
async (event) => {
|
|
49
70
|
const languageId = event.currentTarget.value;
|
|
50
71
|
if (!languageId) {
|
|
51
72
|
toast.push({
|
|
@@ -54,42 +75,43 @@ function DocumentAddButtons(props) {
|
|
|
54
75
|
});
|
|
55
76
|
return;
|
|
56
77
|
}
|
|
57
|
-
|
|
78
|
+
const alreadyTranslated = documentsToTranslation.filter(
|
|
79
|
+
(translation) => translation?._key === languageId
|
|
80
|
+
), removeDuplicates = documentsToTranslation.reduce((filteredTranslations, translation) => alreadyTranslated.filter(
|
|
81
|
+
(alreadyTranslation) => alreadyTranslation.pathString === translation.pathString
|
|
82
|
+
).length > 0 || filteredTranslations.filter(
|
|
83
|
+
(filteredTranslation) => filteredTranslation.path === translation.path
|
|
84
|
+
).length > 0 ? filteredTranslations : [...filteredTranslations, translation], []);
|
|
85
|
+
if (removeDuplicates.length === 0) {
|
|
58
86
|
toast.push({
|
|
59
87
|
status: "error",
|
|
60
88
|
title: "No internationalizedArray fields found in document root"
|
|
61
89
|
});
|
|
62
90
|
return;
|
|
63
91
|
}
|
|
64
|
-
const patches =
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
"after",
|
|
81
|
-
[fieldKey, -1]
|
|
82
|
-
)
|
|
83
|
-
];
|
|
84
|
-
}).flat();
|
|
85
|
-
onChange(PatchEvent.from(patches));
|
|
92
|
+
const patches = [];
|
|
93
|
+
for (const toTranslate of removeDuplicates) {
|
|
94
|
+
const path = toTranslate.path, ifMissing = setIfMissing([], path), insertValue = insert(
|
|
95
|
+
[
|
|
96
|
+
{
|
|
97
|
+
_key: languageId,
|
|
98
|
+
_type: toTranslate._type,
|
|
99
|
+
value: void 0
|
|
100
|
+
}
|
|
101
|
+
],
|
|
102
|
+
"after",
|
|
103
|
+
[...path, -1]
|
|
104
|
+
);
|
|
105
|
+
patches.push(ifMissing), patches.push(insertValue);
|
|
106
|
+
}
|
|
107
|
+
onChange(PatchEvent.from(patches.flat()));
|
|
86
108
|
},
|
|
87
|
-
[
|
|
109
|
+
[documentsToTranslation, onChange, toast]
|
|
88
110
|
);
|
|
89
111
|
return /* @__PURE__ */ jsxs(Stack, { space: 3, children: [
|
|
90
112
|
/* @__PURE__ */ jsx(Box, { children: /* @__PURE__ */ jsx(Text, { size: 1, weight: "semibold", children: "Add translation to internationalized fields" }) }),
|
|
91
113
|
/* @__PURE__ */ jsx(
|
|
92
|
-
AddButtons,
|
|
114
|
+
AddButtons$1,
|
|
93
115
|
{
|
|
94
116
|
languages: filteredLanguages,
|
|
95
117
|
readOnly: !1,
|
|
@@ -106,7 +128,7 @@ const getSelectedValue = (select, document) => {
|
|
|
106
128
|
for (const [key, path] of Object.entries(selection)) {
|
|
107
129
|
let value = get(document, path);
|
|
108
130
|
Array.isArray(value) && (value = value.filter(
|
|
109
|
-
(item) => typeof item == "object" ?
|
|
131
|
+
(item) => typeof item == "object" ? item?._type === "reference" && "_ref" in item : !0
|
|
110
132
|
)), selectedValue[key] = value;
|
|
111
133
|
}
|
|
112
134
|
return selectedValue;
|
|
@@ -119,7 +141,7 @@ function useInternationalizedArrayContext() {
|
|
|
119
141
|
return useContext(InternationalizedArrayContext);
|
|
120
142
|
}
|
|
121
143
|
function InternationalizedArrayProvider(props) {
|
|
122
|
-
const { internationalizedArray: internationalizedArray2 } = props, client = useClient({ apiVersion: internationalizedArray2.apiVersion }), workspace = useWorkspace(), {
|
|
144
|
+
const { internationalizedArray: internationalizedArray2 } = props, client = useClient({ apiVersion: internationalizedArray2.apiVersion }), workspace = useWorkspace(), { formState } = useDocumentPane(), deferredDocument = useDeferredValue(formState?.value), selectedValue = useMemo(
|
|
123
145
|
() => getSelectedValue(internationalizedArray2.select, deferredDocument),
|
|
124
146
|
[internationalizedArray2.select, deferredDocument]
|
|
125
147
|
), languages = Array.isArray(internationalizedArray2.languages) ? internationalizedArray2.languages : suspend$1(
|
|
@@ -132,27 +154,14 @@ function InternationalizedArrayProvider(props) {
|
|
|
132
154
|
return typeof documentType == "string" && languageFilterOptions.documentTypes.includes(documentType) ? languages.filter(
|
|
133
155
|
(language) => selectedLanguageIds.includes(language.id)
|
|
134
156
|
) : languages;
|
|
135
|
-
}, [deferredDocument, languageFilterOptions, languages, selectedLanguageIds]), showDocumentButtons = internationalizedArray2.buttonLocations.includes("document")
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
{
|
|
139
|
-
value: {
|
|
140
|
-
...internationalizedArray2,
|
|
141
|
-
languages,
|
|
142
|
-
filteredLanguages
|
|
143
|
-
},
|
|
144
|
-
children: showDocumentButtons ? /* @__PURE__ */ jsxs(Stack, { space: 5, children: [
|
|
145
|
-
/* @__PURE__ */ jsx(
|
|
146
|
-
DocumentAddButtons,
|
|
147
|
-
{
|
|
148
|
-
schemaType: props.schemaType,
|
|
149
|
-
value: props.value
|
|
150
|
-
}
|
|
151
|
-
),
|
|
152
|
-
props.renderDefault(props)
|
|
153
|
-
] }) : props.renderDefault(props)
|
|
154
|
-
}
|
|
157
|
+
}, [deferredDocument, languageFilterOptions, languages, selectedLanguageIds]), showDocumentButtons = internationalizedArray2.buttonLocations.includes("document"), context = useMemo(
|
|
158
|
+
() => ({ ...internationalizedArray2, languages, filteredLanguages }),
|
|
159
|
+
[filteredLanguages, internationalizedArray2, languages]
|
|
155
160
|
);
|
|
161
|
+
return /* @__PURE__ */ jsx(InternationalizedArrayContext.Provider, { value: context, children: showDocumentButtons ? /* @__PURE__ */ jsxs(Stack, { space: 5, children: [
|
|
162
|
+
/* @__PURE__ */ jsx(DocumentAddButtons, { value: props.value }),
|
|
163
|
+
props.renderDefault(props)
|
|
164
|
+
] }) : props.renderDefault(props) });
|
|
156
165
|
}
|
|
157
166
|
var Preload = memo(function(props) {
|
|
158
167
|
const client = useClient({ apiVersion: props.apiVersion });
|
|
@@ -165,7 +174,10 @@ function checkAllLanguagesArePresent(languages, value) {
|
|
|
165
174
|
return languagesInUseIds.length === filteredLanguageIds.length && languagesInUseIds.every((l) => filteredLanguageIds.includes(l));
|
|
166
175
|
}
|
|
167
176
|
function createAddAllTitle(value, languages) {
|
|
168
|
-
return value
|
|
177
|
+
return value?.length ? `Add missing ${languages.length - value.length === 1 ? "language" : "languages"}` : languages.length === 1 ? `Add ${languages[0].title} Field` : "Add all languages";
|
|
178
|
+
}
|
|
179
|
+
function createValueSchemaTypeName(schemaType) {
|
|
180
|
+
return `${schemaType.name}Value`;
|
|
169
181
|
}
|
|
170
182
|
function createAddLanguagePatches(config) {
|
|
171
183
|
const {
|
|
@@ -175,15 +187,15 @@ function createAddLanguagePatches(config) {
|
|
|
175
187
|
filteredLanguages,
|
|
176
188
|
value,
|
|
177
189
|
path = []
|
|
178
|
-
} = config, itemBase = { _type: createValueSchemaTypeName(schemaType) }, newItems = Array.isArray(addLanguageKeys) && addLanguageKeys.length > 0 ? (
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
) : (
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
), languagesInUse = value
|
|
190
|
+
} = config, itemBase = { _type: createValueSchemaTypeName(schemaType) }, newItems = Array.isArray(addLanguageKeys) && addLanguageKeys.length > 0 ? addLanguageKeys.map((id) => ({
|
|
191
|
+
...itemBase,
|
|
192
|
+
_key: id
|
|
193
|
+
})) : filteredLanguages.filter(
|
|
194
|
+
(language) => value?.length ? !value.find((v) => v._key === language.id) : !0
|
|
195
|
+
).map((language) => ({
|
|
196
|
+
...itemBase,
|
|
197
|
+
_key: language.id
|
|
198
|
+
})), languagesInUse = value?.length ? value.map((v) => v) : [];
|
|
187
199
|
return newItems.map((item) => {
|
|
188
200
|
const languageIndex = languages.findIndex((l) => item._key === l.id), remainingLanguages = languages.slice(languageIndex + 1), nextLanguageIndex = languagesInUse.findIndex(
|
|
189
201
|
(l) => (
|
|
@@ -201,7 +213,7 @@ function createAddLanguagePatches(config) {
|
|
|
201
213
|
});
|
|
202
214
|
}
|
|
203
215
|
const createTranslateFieldActions = (fieldActionProps, { languages, filteredLanguages }) => languages.map((language) => {
|
|
204
|
-
const value = useFormValue(fieldActionProps.path), disabled = value && Array.isArray(value) ? !!
|
|
216
|
+
const value = useFormValue(fieldActionProps.path), disabled = value && Array.isArray(value) ? !!value?.find((item) => item._key === language.id) : !1, hidden = !filteredLanguages.some((f) => f.id === language.id), { onChange } = useDocumentPane(), onAction = useCallback(() => {
|
|
205
217
|
const { schemaType, path } = fieldActionProps, addLanguageKeys = [language.id], patches = createAddLanguagePatches({
|
|
206
218
|
addLanguageKeys,
|
|
207
219
|
schemaType,
|
|
@@ -243,8 +255,7 @@ const createTranslateFieldActions = (fieldActionProps, { languages, filteredLang
|
|
|
243
255
|
}, internationalizedArrayFieldAction = defineDocumentFieldAction({
|
|
244
256
|
name: "internationalizedArray",
|
|
245
257
|
useAction(fieldActionProps) {
|
|
246
|
-
|
|
247
|
-
const isInternationalizedArrayField = (_b = (_a = fieldActionProps == null ? void 0 : fieldActionProps.schemaType) == null ? void 0 : _a.type) == null ? void 0 : _b.name.startsWith(
|
|
258
|
+
const isInternationalizedArrayField = fieldActionProps?.schemaType?.type?.name.startsWith(
|
|
248
259
|
"internationalizedArray"
|
|
249
260
|
), { languages, filteredLanguages } = useInternationalizedArrayContext(), translateFieldActions = createTranslateFieldActions(
|
|
250
261
|
fieldActionProps,
|
|
@@ -320,11 +331,10 @@ function InternationalizedArray(props) {
|
|
|
320
331
|
}) : members,
|
|
321
332
|
[languageFilterEnabled, members, languageFilterOptions, selectedLanguageIds]
|
|
322
333
|
), handleAddLanguage = useCallback(
|
|
323
|
-
(param) => {
|
|
324
|
-
|
|
325
|
-
if (!(filteredLanguages != null && filteredLanguages.length))
|
|
334
|
+
async (param) => {
|
|
335
|
+
if (!filteredLanguages?.length)
|
|
326
336
|
return;
|
|
327
|
-
const addLanguageKeys = Array.isArray(param) ? param : [
|
|
337
|
+
const addLanguageKeys = Array.isArray(param) ? param : [param?.currentTarget?.value].filter(Boolean), patches = createAddLanguagePatches({
|
|
328
338
|
addLanguageKeys,
|
|
329
339
|
schemaType,
|
|
330
340
|
languages,
|
|
@@ -342,23 +352,23 @@ function InternationalizedArray(props) {
|
|
|
342
352
|
};
|
|
343
353
|
}, [defaultLanguages, documentCreatedAt, handleAddLanguage, value]);
|
|
344
354
|
const handleRestoreOrder = useCallback(() => {
|
|
345
|
-
if (!
|
|
355
|
+
if (!value?.length || !languages?.length)
|
|
346
356
|
return;
|
|
347
357
|
const updatedValue = value.reduce((acc, v) => {
|
|
348
|
-
const newIndex = languages.findIndex((l) => l.id ===
|
|
358
|
+
const newIndex = languages.findIndex((l) => l.id === v?._key);
|
|
349
359
|
return newIndex > -1 && (acc[newIndex] = v), acc;
|
|
350
360
|
}, []).filter(Boolean);
|
|
351
|
-
|
|
361
|
+
value?.length !== updatedValue.length && toast.push({
|
|
352
362
|
title: "There was an error reordering languages",
|
|
353
363
|
status: "warning"
|
|
354
364
|
}), onChange(set(updatedValue));
|
|
355
|
-
}, [toast, languages, onChange, value]), allKeysAreLanguages = useMemo(() => !
|
|
356
|
-
() => languages && languages.length > 1 ? languages.filter((l) => value
|
|
365
|
+
}, [toast, languages, onChange, value]), allKeysAreLanguages = useMemo(() => !value?.length || !languages?.length ? !0 : value?.every((v) => languages.find((l) => l?.id === v?._key)), [value, languages]), languagesInUse = useMemo(
|
|
366
|
+
() => languages && languages.length > 1 ? languages.filter((l) => value?.find((v) => v._key === l.id)) : [],
|
|
357
367
|
[languages, value]
|
|
358
|
-
), languagesOutOfOrder = useMemo(() => !
|
|
368
|
+
), languagesOutOfOrder = useMemo(() => !value?.length || !languagesInUse.length ? [] : value.map(
|
|
359
369
|
(v, vIndex) => vIndex === languagesInUse.findIndex((l) => l.id === v._key) ? null : v
|
|
360
370
|
).filter(Boolean), [value, languagesInUse]), languagesAreValid = useMemo(
|
|
361
|
-
() => !
|
|
371
|
+
() => !languages?.length || languages?.length && languages.every((item) => item.id && item.title),
|
|
362
372
|
[languages]
|
|
363
373
|
);
|
|
364
374
|
useEffect(() => {
|
|
@@ -373,9 +383,9 @@ function InternationalizedArray(props) {
|
|
|
373
383
|
const addButtonsAreVisible = (
|
|
374
384
|
// Plugin was configured to display buttons here (default!)
|
|
375
385
|
buttonLocations.includes("field") && // There's at least one language visible
|
|
376
|
-
|
|
386
|
+
filteredLanguages?.length > 0 && // Not every language has a value yet
|
|
377
387
|
!allLanguagesArePresent
|
|
378
|
-
), fieldHasMembers =
|
|
388
|
+
), fieldHasMembers = members?.length > 0;
|
|
379
389
|
return /* @__PURE__ */ jsxs(Stack, { space: 2, children: [
|
|
380
390
|
fieldHasMembers ? /* @__PURE__ */ jsx(Fragment, { children: filteredMembers.map((member) => member.kind === "item" ? /* @__PURE__ */ createElement(
|
|
381
391
|
ArrayOfObjectsItem,
|
|
@@ -388,7 +398,7 @@ function InternationalizedArray(props) {
|
|
|
388
398
|
!addButtonsAreVisible && !fieldHasMembers ? /* @__PURE__ */ jsx(Card, { border: !0, tone: "transparent", padding: 3, radius: 2, children: /* @__PURE__ */ jsx(Text, { size: 1, children: "This internationalized field currently has no translations." }) }) : null,
|
|
389
399
|
addButtonsAreVisible ? /* @__PURE__ */ jsxs(Stack, { space: 2, children: [
|
|
390
400
|
/* @__PURE__ */ jsx(
|
|
391
|
-
AddButtons,
|
|
401
|
+
AddButtons$1,
|
|
392
402
|
{
|
|
393
403
|
languages: filteredLanguages,
|
|
394
404
|
value,
|
|
@@ -411,8 +421,7 @@ function InternationalizedArray(props) {
|
|
|
411
421
|
] });
|
|
412
422
|
}
|
|
413
423
|
function getLanguagesFieldOption(schemaType) {
|
|
414
|
-
|
|
415
|
-
return schemaType ? ((_a = schemaType.options) == null ? void 0 : _a.languages) || getLanguagesFieldOption(schemaType.type) : void 0;
|
|
424
|
+
return schemaType ? schemaType.options?.languages || getLanguagesFieldOption(schemaType.type) : void 0;
|
|
416
425
|
}
|
|
417
426
|
var array = (config) => {
|
|
418
427
|
const { apiVersion, select, languages, type } = config, typeName = typeof type == "string" ? type : type.name, arrayName = createFieldName(typeName), objectName = createFieldName(typeName, !0);
|
|
@@ -424,7 +433,12 @@ var array = (config) => {
|
|
|
424
433
|
input: InternationalizedArray
|
|
425
434
|
},
|
|
426
435
|
// These options are required for validation rules – not the custom input component
|
|
427
|
-
options: {
|
|
436
|
+
options: {
|
|
437
|
+
// @ts-expect-error - find out why it fails
|
|
438
|
+
apiVersion,
|
|
439
|
+
select,
|
|
440
|
+
languages
|
|
441
|
+
},
|
|
428
442
|
of: [
|
|
429
443
|
defineField({
|
|
430
444
|
...typeof type == "string" ? {} : type,
|
|
@@ -432,15 +446,16 @@ var array = (config) => {
|
|
|
432
446
|
type: objectName
|
|
433
447
|
})
|
|
434
448
|
],
|
|
449
|
+
// @ts-expect-error - find out why it fails
|
|
435
450
|
validation: (rule) => rule.custom(async (value, context) => {
|
|
436
451
|
if (!value)
|
|
437
452
|
return !0;
|
|
438
453
|
const selectedValue = getSelectedValue(select, context.document), client = context.getClient({ apiVersion });
|
|
439
454
|
let contextLanguages = [];
|
|
440
|
-
const languagesFieldOption = getLanguagesFieldOption(context
|
|
455
|
+
const languagesFieldOption = getLanguagesFieldOption(context?.type);
|
|
441
456
|
if (Array.isArray(languagesFieldOption) ? contextLanguages = languagesFieldOption : Array.isArray(peek(selectedValue)) ? contextLanguages = peek(selectedValue) || [] : typeof languagesFieldOption == "function" && (contextLanguages = await languagesFieldOption(client, selectedValue)), value && value.length > contextLanguages.length)
|
|
442
457
|
return `Cannot be more than ${contextLanguages.length === 1 ? "1 item" : `${contextLanguages.length} items`}`;
|
|
443
|
-
const nonLanguageKeys = value
|
|
458
|
+
const nonLanguageKeys = value?.length ? value.filter(
|
|
444
459
|
(item) => !contextLanguages.find((language) => item._key === language.id)
|
|
445
460
|
) : [];
|
|
446
461
|
if (nonLanguageKeys.length)
|
|
@@ -448,10 +463,10 @@ var array = (config) => {
|
|
|
448
463
|
message: "Array item keys must be valid languages registered to the field type",
|
|
449
464
|
paths: nonLanguageKeys.map((item) => [{ _key: item._key }])
|
|
450
465
|
};
|
|
451
|
-
const valuesByLanguage = value
|
|
466
|
+
const valuesByLanguage = value?.length ? value.filter((item) => !!item?._key).reduce((acc, cur) => acc[cur._key] ? { ...acc, [cur._key]: [...acc[cur._key], cur] } : {
|
|
452
467
|
...acc,
|
|
453
468
|
[cur._key]: [cur]
|
|
454
|
-
}, {}) : {}, duplicateValues = Object.values(valuesByLanguage).filter((item) =>
|
|
469
|
+
}, {}) : {}, duplicateValues = Object.values(valuesByLanguage).filter((item) => item?.length > 1).flat();
|
|
455
470
|
return duplicateValues.length ? {
|
|
456
471
|
message: "There can only be one field per language",
|
|
457
472
|
paths: duplicateValues.map((item) => [{ _key: item._key }])
|
|
@@ -467,7 +482,7 @@ function InternationalizedField(props) {
|
|
|
467
482
|
}) : props.children;
|
|
468
483
|
}
|
|
469
484
|
function getToneFromValidation(validations) {
|
|
470
|
-
if (!
|
|
485
|
+
if (!validations?.length)
|
|
471
486
|
return;
|
|
472
487
|
const validationLevels = validations.map((v) => v.level);
|
|
473
488
|
if (validationLevels.includes("error"))
|
|
@@ -488,16 +503,12 @@ function InternationalizedInput(props) {
|
|
|
488
503
|
// TODO: Remove this as it shouldn't be necessary?
|
|
489
504
|
value: props.value
|
|
490
505
|
}, { validation, value, onChange, readOnly } = inlineProps, { languages } = useInternationalizedArrayContext(), languageKeysInUse = useMemo(
|
|
491
|
-
() =>
|
|
492
|
-
var _a;
|
|
493
|
-
return (_a = parentValue == null ? void 0 : parentValue.map((v) => v._key)) != null ? _a : [];
|
|
494
|
-
},
|
|
506
|
+
() => parentValue?.map((v) => v._key) ?? [],
|
|
495
507
|
[parentValue]
|
|
496
|
-
), keyIsValid = languages
|
|
508
|
+
), keyIsValid = languages?.length ? languages.find((l) => l.id === value._key) : !1, handleKeyChange = useCallback(
|
|
497
509
|
(event) => {
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
!value || !(languages != null && languages.length) || !languages.find((l) => l.id === languageId) || onChange([set(languageId, ["_key"])]);
|
|
510
|
+
const languageId = event?.currentTarget?.value;
|
|
511
|
+
!value || !languages?.length || !languages.find((l) => l.id === languageId) || onChange([set(languageId, ["_key"])]);
|
|
501
512
|
},
|
|
502
513
|
[onChange, value, languages]
|
|
503
514
|
), handleUnset = useCallback(() => {
|
|
@@ -545,9 +556,9 @@ var object = (config) => {
|
|
|
545
556
|
title: `Internationalized array ${type}`,
|
|
546
557
|
type: "object",
|
|
547
558
|
components: {
|
|
559
|
+
// @ts-expect-error - find out why it fails
|
|
548
560
|
item: InternationalizedInput
|
|
549
561
|
},
|
|
550
|
-
// @ts-expect-error - Address this typing issue with the inner object
|
|
551
562
|
fields: [
|
|
552
563
|
typeof type == "string" ? (
|
|
553
564
|
// Define a simple field if all we have is the name as a string
|
|
@@ -633,10 +644,13 @@ const internationalizedArray = definePlugin((config) => {
|
|
|
633
644
|
(field) => field.type.name
|
|
634
645
|
).some(
|
|
635
646
|
(name) => name.startsWith("internationalizedArray")
|
|
636
|
-
) ? props.renderDefault(props) :
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
647
|
+
) ? props.renderDefault(props) : /* @__PURE__ */ jsx(
|
|
648
|
+
InternationalizedArrayProvider,
|
|
649
|
+
{
|
|
650
|
+
...props,
|
|
651
|
+
internationalizedArray: pluginConfig
|
|
652
|
+
}
|
|
653
|
+
)
|
|
640
654
|
}
|
|
641
655
|
},
|
|
642
656
|
// Register custom schema types for the outer array and the inner object
|