sanity-plugin-internationalized-array 0.0.7 → 1.0.0

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.
Files changed (37) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +19 -15
  3. package/lib/cjs/index.js +468 -0
  4. package/lib/cjs/index.js.map +1 -0
  5. package/lib/esm/index.js +449 -0
  6. package/lib/esm/index.js.map +1 -0
  7. package/lib/types/index.d.ts +19 -0
  8. package/lib/types/index.d.ts.map +1 -0
  9. package/package.json +47 -34
  10. package/sanity.json +7 -6
  11. package/src/components/Feedback.tsx +27 -0
  12. package/src/components/InternationalizedArrayInput.tsx +220 -0
  13. package/src/{LanguageArray → components}/Table.tsx +0 -0
  14. package/src/components/getToneFromValidation.ts +18 -0
  15. package/src/index.tsx +51 -0
  16. package/src/internationalizedArray.ts +80 -53
  17. package/src/types.ts +17 -9
  18. package/v2-incompatible.js +11 -0
  19. package/lib/LanguageArray/Table.js +0 -88
  20. package/lib/LanguageArray/Table.js.map +0 -1
  21. package/lib/LanguageArray/ValueInput.js +0 -17
  22. package/lib/LanguageArray/ValueInput.js.map +0 -1
  23. package/lib/LanguageArray/index.js +0 -253
  24. package/lib/LanguageArray/index.js.map +0 -1
  25. package/lib/hooks/useUnsetInputComponent.js +0 -32
  26. package/lib/hooks/useUnsetInputComponent.js.map +0 -1
  27. package/lib/index.js +0 -13
  28. package/lib/index.js.map +0 -1
  29. package/lib/internationalizedArray.js +0 -105
  30. package/lib/internationalizedArray.js.map +0 -1
  31. package/lib/types.js +0 -2
  32. package/lib/types.js.map +0 -1
  33. package/migrations/transformObjectToArray.js +0 -94
  34. package/src/LanguageArray/ValueInput.tsx +0 -6
  35. package/src/LanguageArray/index.tsx +0 -311
  36. package/src/hooks/useUnsetInputComponent.tsx +0 -17
  37. package/src/index.ts +0 -3
package/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2021 Simeon Griggs
3
+ Copyright (c) 2022 Simeon Griggs
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/README.md CHANGED
@@ -1,45 +1,51 @@
1
1
  # sanity-plugin-internationalized-array
2
2
 
3
+ > NOTE This is for the Studio v3 version of the plugin
4
+
3
5
  A helper function that renders a custom input component for writing localised fields of content into an array.
4
6
 
5
7
  **This an early proof-of-concept and should not yet be used without thorough testing.**
6
8
 
7
- ![2022-07-13 12 53 29](https://user-images.githubusercontent.com/9684022/178729823-cbb1059f-4ae0-4ab0-900d-4f22b030c1d1.gif)
9
+ ![2022-07-27 12 26 25](https://user-images.githubusercontent.com/9684022/181235876-45a6a4c5-e6d3-48a2-a6a0-523ee7196184.gif)
8
10
 
9
11
  ## Installation
10
12
 
11
13
  ```
12
- sanity install internationalized-array
14
+ npm install --save sanity-plugin-internationalized-array@studio-v3
15
+ ```
16
+
17
+ or
18
+
19
+ ```
20
+ yarn add sanity-plugin-internationalized-array-v3@studio-v3
13
21
  ```
14
22
 
15
23
  Add an array to your schema by importing the helper function.
16
24
 
17
25
  ```js
18
- import { internationalizedArray } from "sanity-plugin-internationalized-array";
26
+ import {internationalizedArray} from 'sanity-plugin-internationalized-array'
19
27
 
20
28
  // ./src/schema/person.js
21
29
  export default {
22
- name: "person",
23
- title: "Person",
24
- type: "document",
30
+ name: 'person',
31
+ title: 'Person',
32
+ type: 'document',
25
33
  fields: [
26
34
  // ...all your other fields
27
35
  internationalizedArray({
28
36
  // Required, the `name` of the outer array
29
- name: "greeting",
37
+ name: 'greeting',
30
38
  // Required, the `type` of the inner field
31
39
  // One of: string | text | number | boolean
32
- type: "string",
40
+ type: 'string',
33
41
  // Required, must be an array of objects
34
42
  languages: [
35
- { id: "en", title: "English" },
36
- { id: "fr", title: "French" },
43
+ {id: 'en', title: 'English'},
44
+ {id: 'fr', title: 'French'},
37
45
  ],
38
- // Optional: just for debugging
39
- showNativeInput: false,
40
46
  }),
41
47
  ],
42
- };
48
+ }
43
49
  ```
44
50
 
45
51
  This will create an Array field where `string` fields can be added with the name `title`. The custom input contains buttons which will add new array items with the language as the `_key` value. Data returned from this array will look like this:
@@ -105,7 +111,5 @@ greeting[].value
105
111
 
106
112
  By using this plugin you can safely extend the number of languages without adding any additional query paths.
107
113
 
108
- ## License
109
-
110
114
  MIT © Simeon Griggs
111
115
  See LICENSE
@@ -0,0 +1,468 @@
1
+ var $dyHF6$sanity = require("sanity");
2
+ var $dyHF6$reactjsxruntime = require("react/jsx-runtime");
3
+ var $dyHF6$react = require("react");
4
+ var $dyHF6$sanityform = require("sanity/form");
5
+ var $dyHF6$sanityui = require("@sanity/ui");
6
+ var $dyHF6$sanityicons = require("@sanity/icons");
7
+ var $dyHF6$styledcomponents = require("styled-components");
8
+
9
+ function $parcel$exportWildcard(dest, source) {
10
+ Object.keys(source).forEach(function(key) {
11
+ if (key === 'default' || key === '__esModule' || dest.hasOwnProperty(key)) {
12
+ return;
13
+ }
14
+
15
+ Object.defineProperty(dest, key, {
16
+ enumerable: true,
17
+ get: function get() {
18
+ return source[key];
19
+ }
20
+ });
21
+ });
22
+
23
+ return dest;
24
+ }
25
+ function $parcel$export(e, n, v, s) {
26
+ Object.defineProperty(e, n, {get: v, set: s, enumerable: true, configurable: true});
27
+ }
28
+ function $parcel$interopDefault(a) {
29
+ return a && a.__esModule ? a.default : a;
30
+ }
31
+ var $7594066088192472$exports = {};
32
+
33
+ $parcel$export($7594066088192472$exports, "internationalizedArray", () => $7594066088192472$export$bec7eb13daf35f0e);
34
+
35
+
36
+
37
+
38
+
39
+
40
+
41
+
42
+
43
+ // Wrappers required because of bug with passing down "as" prop
44
+ // https://github.com/styled-components/styled-components/issues/2449
45
+ // Table
46
+ const $acfbfc6ee2363807$var$TableWrapper = (props = {})=>{
47
+ return /*#__PURE__*/ (0, $dyHF6$reactjsxruntime.jsx)((0, $dyHF6$sanityui.Box), {
48
+ as: "table",
49
+ ...props
50
+ });
51
+ };
52
+ const $acfbfc6ee2363807$var$StyledTable = (0, ($parcel$interopDefault($dyHF6$styledcomponents)))($acfbfc6ee2363807$var$TableWrapper)(()=>(0, $dyHF6$styledcomponents.css)`
53
+ display: table;
54
+ width: 100%;
55
+
56
+ &:not([hidden]) {
57
+ display: table;
58
+ }
59
+ `);
60
+ function $acfbfc6ee2363807$export$54ec01a60f47d33d(props) {
61
+ const { children: children , ...rest } = props;
62
+ return /*#__PURE__*/ (0, $dyHF6$reactjsxruntime.jsx)($acfbfc6ee2363807$var$StyledTable, {
63
+ ...rest,
64
+ children: children
65
+ });
66
+ }
67
+ // Row
68
+ const $acfbfc6ee2363807$var$RowWrapper = (props = {})=>{
69
+ return /*#__PURE__*/ (0, $dyHF6$reactjsxruntime.jsx)((0, $dyHF6$sanityui.Card), {
70
+ as: "tr",
71
+ ...props
72
+ });
73
+ };
74
+ const $acfbfc6ee2363807$var$StyledRow = (0, ($parcel$interopDefault($dyHF6$styledcomponents)))($acfbfc6ee2363807$var$RowWrapper)(()=>(0, $dyHF6$styledcomponents.css)`
75
+ display: table-row;
76
+
77
+ &:not([hidden]) {
78
+ display: table-row;
79
+ }
80
+ `);
81
+ function $acfbfc6ee2363807$export$b05581f4e764e162(props) {
82
+ const { children: children , ...rest } = props;
83
+ return /*#__PURE__*/ (0, $dyHF6$reactjsxruntime.jsx)($acfbfc6ee2363807$var$StyledRow, {
84
+ ...rest,
85
+ children: children
86
+ });
87
+ }
88
+ // Cell
89
+ const $acfbfc6ee2363807$var$CellWrapper = (props = {})=>{
90
+ return /*#__PURE__*/ (0, $dyHF6$reactjsxruntime.jsx)((0, $dyHF6$sanityui.Box), {
91
+ as: "td",
92
+ ...props
93
+ });
94
+ };
95
+ const $acfbfc6ee2363807$var$StyledCell = (0, ($parcel$interopDefault($dyHF6$styledcomponents)))($acfbfc6ee2363807$var$CellWrapper)(()=>(0, $dyHF6$styledcomponents.css)`
96
+ display: table-cell;
97
+
98
+ &:not([hidden]) {
99
+ display: table-cell;
100
+ }
101
+ `);
102
+ function $acfbfc6ee2363807$export$1e4baea7053fc0e3(props) {
103
+ const { children: children , ...rest } = props;
104
+ return /*#__PURE__*/ (0, $dyHF6$reactjsxruntime.jsx)($acfbfc6ee2363807$var$StyledCell, {
105
+ ...rest,
106
+ children: children
107
+ });
108
+ }
109
+
110
+
111
+
112
+
113
+
114
+
115
+ const $aaf4d804384afd00$var$schemaExample = {
116
+ languages: [
117
+ {
118
+ id: "en",
119
+ title: "English"
120
+ },
121
+ {
122
+ id: "no",
123
+ title: "Norsk"
124
+ },
125
+ ]
126
+ };
127
+ function $aaf4d804384afd00$export$2e2bcd8739ae039() {
128
+ return /*#__PURE__*/ (0, $dyHF6$reactjsxruntime.jsx)((0, $dyHF6$sanityui.Card), {
129
+ tone: "caution",
130
+ border: true,
131
+ radius: 2,
132
+ padding: 3,
133
+ children: /*#__PURE__*/ (0, $dyHF6$reactjsxruntime.jsxs)((0, $dyHF6$sanityui.Stack), {
134
+ space: 4,
135
+ children: [
136
+ /*#__PURE__*/ (0, $dyHF6$reactjsxruntime.jsxs)((0, $dyHF6$sanityui.Text), {
137
+ children: [
138
+ "An array of language objects must be passed into the ",
139
+ /*#__PURE__*/ (0, $dyHF6$reactjsxruntime.jsx)("code", {
140
+ children: "internationalizedArray"
141
+ }),
142
+ " ",
143
+ "helper function, each with an ",
144
+ /*#__PURE__*/ (0, $dyHF6$reactjsxruntime.jsx)("code", {
145
+ children: "id"
146
+ }),
147
+ " and ",
148
+ /*#__PURE__*/ (0, $dyHF6$reactjsxruntime.jsx)("code", {
149
+ children: "title"
150
+ }),
151
+ " field. Example:"
152
+ ]
153
+ }),
154
+ /*#__PURE__*/ (0, $dyHF6$reactjsxruntime.jsx)((0, $dyHF6$sanityui.Card), {
155
+ padding: 2,
156
+ border: true,
157
+ radius: 2,
158
+ children: /*#__PURE__*/ (0, $dyHF6$reactjsxruntime.jsx)((0, $dyHF6$sanityui.Code), {
159
+ size: 1,
160
+ language: "javascript",
161
+ children: JSON.stringify($aaf4d804384afd00$var$schemaExample, null, 2)
162
+ })
163
+ })
164
+ ]
165
+ })
166
+ });
167
+ }
168
+
169
+
170
+ function $6a9b28384eb7074d$export$16423358d6ebe294(validations) {
171
+ if (!validations.length) return `default`;
172
+ const validationLevels = validations.map((v)=>v.level);
173
+ if (validationLevels.includes("error")) return `critical`;
174
+ else if (validationLevels.includes("warning")) return `caution`;
175
+ return `default`;
176
+ }
177
+
178
+
179
+ function $7e790a73eaf2b445$export$2e2bcd8739ae039(props) {
180
+ const { members: members , value: value , schemaType: schemaType , onChange: onChange } = props;
181
+ const readOnly = typeof schemaType.readOnly === "boolean" ? schemaType.readOnly : false;
182
+ const { options: options } = schemaType;
183
+ const languages = (0, $dyHF6$react.useMemo)(()=>options?.languages ?? [], [
184
+ options
185
+ ]);
186
+ const handleAddLanguage = (0, $dyHF6$react.useCallback)((languageId)=>{
187
+ // Create new items
188
+ const newItems = languageId ? [
189
+ {
190
+ _key: languageId
191
+ }
192
+ ] : languages.filter((language)=>value?.length ? !value.find((v)=>v._key === language.id) : true).map((language)=>({
193
+ _key: language.id
194
+ }));
195
+ // Insert new items in the correct order
196
+ const languagesInUse = value?.length ? value.map((v)=>v) : [];
197
+ const insertions = newItems.map((item)=>{
198
+ // What's the original index of this language?
199
+ const languageIndex = languages.findIndex((l)=>item._key === l.id);
200
+ // What languages are there beyond that index?
201
+ const remainingLanguages = languages.slice(languageIndex + 1);
202
+ // So what is the index in the current value array of the next language in the language array?
203
+ const nextLanguageIndex = languagesInUse.findIndex((l)=>remainingLanguages.find((r)=>r.id === l._key));
204
+ // Keep local state up to date incase multiple insertions are being made
205
+ if (nextLanguageIndex < 0) languagesInUse.push(item);
206
+ else languagesInUse.splice(nextLanguageIndex, 0, item);
207
+ return nextLanguageIndex < 0 ? (0, $dyHF6$sanityform.insert)([
208
+ item
209
+ ], "after", [
210
+ nextLanguageIndex
211
+ ]) : (0, $dyHF6$sanityform.insert)([
212
+ item
213
+ ], "before", [
214
+ nextLanguageIndex
215
+ ]);
216
+ });
217
+ onChange([
218
+ (0, $dyHF6$sanityform.setIfMissing)([]),
219
+ ...insertions
220
+ ]);
221
+ }, [
222
+ languages,
223
+ onChange,
224
+ value
225
+ ]);
226
+ const handleUnsetByKey = (0, $dyHF6$react.useCallback)((_key)=>{
227
+ onChange((0, $dyHF6$sanityform.unset)([
228
+ {
229
+ _key: _key
230
+ }
231
+ ]));
232
+ }, [
233
+ onChange
234
+ ]);
235
+ // TODO: This is lazy, reordering and re-setting the whole array – it could be surgical
236
+ const handleRestoreOrder = (0, $dyHF6$react.useCallback)(()=>{
237
+ if (!value?.length) return;
238
+ // Create a new value array in the correct order
239
+ // This would also strip out values that don't have a language as the key
240
+ const updatedValue = value.reduce((acc, v)=>{
241
+ const newIndex = languages.findIndex((l)=>l.id === v?._key);
242
+ if (newIndex) acc[newIndex] = v;
243
+ return acc;
244
+ }, []).filter(Boolean);
245
+ onChange((0, $dyHF6$sanityform.set)(updatedValue));
246
+ }, [
247
+ languages,
248
+ onChange,
249
+ value
250
+ ]);
251
+ const allKeysAreLanguages = (0, $dyHF6$react.useMemo)(()=>{
252
+ return value?.every((v)=>languages.find((l)=>l?.id === v?._key));
253
+ }, [
254
+ value,
255
+ languages
256
+ ]);
257
+ // Check languages are in the correct order
258
+ const languagesOutOfOrder = (0, $dyHF6$react.useMemo)(()=>{
259
+ if (!value?.length) return [];
260
+ const languagesInUse = languages.filter((l)=>value.find((v)=>v._key === l.id));
261
+ return value.map((v, vIndex)=>vIndex === languagesInUse.findIndex((l)=>l.id === v._key) ? null : v).filter(Boolean);
262
+ }, [
263
+ value,
264
+ languages
265
+ ]);
266
+ const languagesAreValid = (0, $dyHF6$react.useMemo)(()=>languages?.length && languages.every((item)=>item.id && item.title), [
267
+ languages
268
+ ]);
269
+ if (!languagesAreValid) return /*#__PURE__*/ (0, $dyHF6$reactjsxruntime.jsx)((0, $aaf4d804384afd00$export$2e2bcd8739ae039), {});
270
+ return /*#__PURE__*/ (0, $dyHF6$reactjsxruntime.jsxs)((0, $dyHF6$sanityui.Stack), {
271
+ space: 2,
272
+ children: [
273
+ members?.length > 0 ? /*#__PURE__*/ (0, $dyHF6$reactjsxruntime.jsx)((0, $acfbfc6ee2363807$export$54ec01a60f47d33d), {
274
+ children: /*#__PURE__*/ (0, $dyHF6$reactjsxruntime.jsx)("tbody", {
275
+ children: members.map((member)=>/*#__PURE__*/ (0, $dyHF6$reactjsxruntime.jsxs)((0, $acfbfc6ee2363807$export$b05581f4e764e162), {
276
+ tone: member?.item?.validation?.length > 0 ? (0, $6a9b28384eb7074d$export$16423358d6ebe294)(member.item.validation) : undefined,
277
+ children: [
278
+ /*#__PURE__*/ (0, $dyHF6$reactjsxruntime.jsx)((0, $acfbfc6ee2363807$export$1e4baea7053fc0e3), {
279
+ style: {
280
+ verticalAlign: "bottom"
281
+ },
282
+ children: /*#__PURE__*/ (0, $dyHF6$reactjsxruntime.jsx)((0, $dyHF6$sanityui.Box), {
283
+ paddingY: 3,
284
+ paddingRight: 2,
285
+ children: /*#__PURE__*/ (0, $dyHF6$reactjsxruntime.jsx)((0, $dyHF6$sanityui.Label), {
286
+ muted: true,
287
+ size: 1,
288
+ children: member.key
289
+ })
290
+ })
291
+ }),
292
+ /*#__PURE__*/ (0, $dyHF6$reactjsxruntime.jsx)((0, $acfbfc6ee2363807$export$1e4baea7053fc0e3), {
293
+ paddingRight: 2,
294
+ style: {
295
+ width: `100%`
296
+ },
297
+ children: /*#__PURE__*/ (0, $dyHF6$reactjsxruntime.jsx)((0, $dyHF6$sanityform.MemberItem), {
298
+ ...props,
299
+ member: member
300
+ })
301
+ }),
302
+ /*#__PURE__*/ (0, $dyHF6$reactjsxruntime.jsx)((0, $acfbfc6ee2363807$export$1e4baea7053fc0e3), {
303
+ style: {
304
+ verticalAlign: "bottom"
305
+ },
306
+ children: /*#__PURE__*/ (0, $dyHF6$reactjsxruntime.jsxs)((0, $dyHF6$sanityui.Flex), {
307
+ align: "center",
308
+ justify: "flex-end",
309
+ gap: 3,
310
+ children: [
311
+ member.item.validation.length > 0 ? /*#__PURE__*/ (0, $dyHF6$reactjsxruntime.jsx)((0, $dyHF6$sanityui.Box), {
312
+ paddingLeft: 2,
313
+ children: /*#__PURE__*/ (0, $dyHF6$reactjsxruntime.jsx)((0, $dyHF6$sanityform.FormFieldValidationStatus), {
314
+ validation: member.item.validation
315
+ })
316
+ }) : null,
317
+ /*#__PURE__*/ (0, $dyHF6$reactjsxruntime.jsx)((0, $dyHF6$sanityui.Button), {
318
+ mode: "ghost",
319
+ icon: (0, $dyHF6$sanityicons.RemoveIcon),
320
+ tone: "critical",
321
+ disabled: typeof readOnly === "boolean" ? readOnly : false,
322
+ onClick: ()=>handleUnsetByKey(member.key)
323
+ })
324
+ ]
325
+ })
326
+ })
327
+ ]
328
+ }, member.key))
329
+ })
330
+ }) : null,
331
+ languagesOutOfOrder.length > 0 && allKeysAreLanguages ? /*#__PURE__*/ (0, $dyHF6$reactjsxruntime.jsx)((0, $dyHF6$sanityui.Button), {
332
+ tone: "caution",
333
+ icon: (0, $dyHF6$sanityicons.RestoreIcon),
334
+ onClick: ()=>handleRestoreOrder(),
335
+ text: "Restore order of languages"
336
+ }) : null,
337
+ value && value.length < languages.length ? /*#__PURE__*/ (0, $dyHF6$reactjsxruntime.jsxs)((0, $dyHF6$sanityui.Stack), {
338
+ space: 2,
339
+ children: [
340
+ /*#__PURE__*/ (0, $dyHF6$reactjsxruntime.jsx)((0, $dyHF6$sanityui.Grid), {
341
+ columns: Math.min(languages.length, 5),
342
+ gap: 2,
343
+ children: languages.map((language)=>/*#__PURE__*/ (0, $dyHF6$reactjsxruntime.jsx)((0, $dyHF6$sanityui.Button), {
344
+ tone: "primary",
345
+ mode: "ghost",
346
+ fontSize: 1,
347
+ disabled: readOnly || Boolean(value?.find((item)=>item._key === language.id)),
348
+ text: language.id.toUpperCase(),
349
+ icon: (0, $dyHF6$sanityicons.AddIcon),
350
+ onClick: ()=>handleAddLanguage(language.id)
351
+ }, language.id))
352
+ }),
353
+ /*#__PURE__*/ (0, $dyHF6$reactjsxruntime.jsx)((0, $dyHF6$sanityui.Button), {
354
+ tone: "primary",
355
+ mode: "ghost",
356
+ disabled: readOnly || value && value?.length >= languages?.length,
357
+ icon: (0, $dyHF6$sanityicons.AddIcon),
358
+ text: value?.length ? `Add missing languages` : `Add all languages`,
359
+ onClick: ()=>handleAddLanguage()
360
+ })
361
+ ]
362
+ }) : null
363
+ ]
364
+ });
365
+ }
366
+
367
+
368
+ const $7594066088192472$var$CONFIG_DEFAULT = {
369
+ name: `title`,
370
+ type: `string`,
371
+ languages: []
372
+ };
373
+ function $7594066088192472$export$bec7eb13daf35f0e(config = $7594066088192472$var$CONFIG_DEFAULT) {
374
+ const { name: name , type: type , languages: languages } = config;
375
+ const configValidation = Array.isArray(config?.validation) ? config.validation : [
376
+ config?.validation
377
+ ];
378
+ return (0, $dyHF6$sanity.defineField)({
379
+ name: name,
380
+ title: config?.title ?? undefined,
381
+ group: config?.group ?? undefined,
382
+ hidden: config?.hidden ?? undefined,
383
+ readOnly: config?.readOnly ?? undefined,
384
+ type: "array",
385
+ components: {
386
+ input: (0, $7e790a73eaf2b445$export$2e2bcd8739ae039)
387
+ },
388
+ options: {
389
+ languages: languages
390
+ },
391
+ of: [
392
+ {
393
+ type: "object",
394
+ fields: [
395
+ {
396
+ name: "value",
397
+ type: type
398
+ },
399
+ ],
400
+ preview: {
401
+ select: {
402
+ title: "value",
403
+ key: "_key"
404
+ },
405
+ prepare (select) {
406
+ const { title: title , key: key } = select;
407
+ return {
408
+ title: title,
409
+ subtitle: key.toUpperCase()
410
+ };
411
+ }
412
+ }
413
+ },
414
+ ],
415
+ // @ts-ignore
416
+ validation: (rule)=>{
417
+ const rules = [];
418
+ rules.push(rule.custom((value, context)=>{
419
+ const { languages: contextLanguages } = context?.type?.options ?? {};
420
+ const nonLanguageKeys = value?.length ? value.filter((item)=>!contextLanguages.find((language)=>item._key === language.id)) : [];
421
+ if (nonLanguageKeys.length) return {
422
+ message: `Array item keys must be valid languages registered to the field type`,
423
+ paths: nonLanguageKeys.map((item)=>[
424
+ {
425
+ _key: item._key
426
+ }
427
+ ])
428
+ };
429
+ const valuesByLanguage = value?.length ? value.filter((item)=>Boolean(item?._key)).reduce((acc, cur)=>{
430
+ if (acc[cur._key]) return {
431
+ ...acc,
432
+ [cur._key]: [
433
+ ...acc[cur._key],
434
+ cur
435
+ ]
436
+ };
437
+ return {
438
+ ...acc,
439
+ [cur._key]: [
440
+ cur
441
+ ]
442
+ };
443
+ }, {}) : {};
444
+ const duplicateValues = Object.values(valuesByLanguage).filter((item)=>item?.length > 1).flat();
445
+ if (duplicateValues.length) return {
446
+ message: "There can only be one field per language",
447
+ paths: duplicateValues.map((item)=>[
448
+ {
449
+ _key: item._key
450
+ }
451
+ ])
452
+ };
453
+ return true;
454
+ }));
455
+ if (languages?.length) rules.push(rule.max(languages.length));
456
+ return [
457
+ ...rules,
458
+ ...configValidation
459
+ ].filter(Boolean);
460
+ }
461
+ });
462
+ }
463
+
464
+
465
+ $parcel$exportWildcard(module.exports, $7594066088192472$exports);
466
+
467
+
468
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"mappings":"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","sources":["src/index.tsx","src/internationalizedArray.ts","src/components/InternationalizedArrayInput.tsx","src/components/Table.tsx","src/components/Feedback.tsx","src/components/getToneFromValidation.ts"],"sourcesContent":["export * from './internationalizedArray'\n\n/**\n * Because of the complexity of the field, there's no utility currently to using the plugin framework\n * We need to register:\n * - an array field which\n * - only has a single object field with\n * - a single inner field and\n * - an array of languages\n * ...this is easier with a helper function\n */\n\n// import React from 'react'\n// import {createPlugin} from 'sanity'\n\n// import InternationalizedArrayInput from './components/InternationalizedArrayInput'\n// import {PluginConfig} from './types'\n\n// const CONFIG_DEFAULT = {languages: []}\n\n// export const internationalizedArray = createPlugin<PluginConfig>((config = CONFIG_DEFAULT) => {\n// return {\n// name: 'sanity-plugin-internationalized-array',\n// form: {\n// renderInput: (inputProps: unknown, next: unknown) => {\n// if (\n// config.languages.length &&\n// inputProps?.schemaType?.jsonType === 'array' &&\n// inputProps?.schemaType?.options.i18n === true\n// ) {\n// if (inputProps.schemaType.of.length > 1) {\n// return <div>Cannot have more than one field type in the array</div>\n// }\n\n// if (inputProps.schemaType.of[0].jsonType !== 'object') {\n// return <div>Single Field in the Array must be an object</div>\n// }\n\n// if (inputProps.schemaType.of[0].fields[0].name !== 'value') {\n// return <div>Single Field in the Object must be named `value`</div>\n// }\n\n// console.log({inputProps})\n// return <InternationalizedArrayInput inputProps={inputProps} {...config} />\n// }\n\n// return null\n// },\n// },\n// }\n// })\n","import {\n CustomValidatorResult,\n defineField,\n FieldDefinition,\n Rule,\n SchemaType,\n ValidationError,\n} from 'sanity'\n\nimport InternationalizedArrayInput from './components/InternationalizedArrayInput'\nimport {AllowedType, ArrayConfig, Language, Value} from './types'\n\nconst CONFIG_DEFAULT = {name: `title`, type: `string` as AllowedType, languages: []}\n\nexport function internationalizedArray(config: ArrayConfig = CONFIG_DEFAULT): FieldDefinition {\n const {name, type, languages} = config\n\n const configValidation = Array.isArray(config?.validation)\n ? config.validation\n : [config?.validation]\n\n return defineField({\n name,\n title: config?.title ?? undefined,\n group: config?.group ?? undefined,\n hidden: config?.hidden ?? undefined,\n readOnly: config?.readOnly ?? undefined,\n type: 'array',\n components: {input: InternationalizedArrayInput},\n options: {languages},\n of: [\n {\n type: 'object',\n fields: [\n {\n name: 'value',\n type,\n },\n ],\n preview: {\n select: {title: 'value', key: '_key'},\n prepare(select) {\n const {title, key} = select as Record<string, string>\n\n return {\n title,\n subtitle: key.toUpperCase(),\n }\n },\n },\n },\n ],\n // @ts-ignore\n validation: (rule: Rule) => {\n const rules = [] as Rule[]\n\n rules.push(\n rule.custom<Value[]>((value, context) => {\n const {languages: contextLanguages}: {languages: Language[]} =\n context?.type?.options ?? {}\n const nonLanguageKeys = value?.length\n ? value.filter(\n (item) => !contextLanguages.find((language) => item._key === language.id)\n )\n : []\n if (nonLanguageKeys.length) {\n return {\n message: `Array item keys must be valid languages registered to the field type`,\n paths: nonLanguageKeys.map((item) => [{_key: item._key}]),\n }\n }\n\n // Ensure there's no duplicate `language` fields\n type KeyedValues = {\n [key: string]: Value[]\n }\n\n const valuesByLanguage = value?.length\n ? value\n .filter((item) => Boolean(item?._key))\n .reduce((acc, cur) => {\n if (acc[cur._key]) {\n return {...acc, [cur._key]: [...acc[cur._key], cur]}\n }\n return {\n ...acc,\n [cur._key]: [cur],\n }\n }, {} as KeyedValues)\n : {}\n const duplicateValues = Object.values(valuesByLanguage)\n .filter((item) => item?.length > 1)\n .flat()\n if (duplicateValues.length) {\n return {\n message: 'There can only be one field per language',\n paths: duplicateValues.map((item) => [{_key: item._key}]),\n }\n }\n return true\n })\n )\n\n if (languages?.length) {\n rules.push(rule.max(languages.length))\n }\n\n return [...rules, ...configValidation].filter(Boolean)\n },\n })\n}\n","import React, {useCallback, useMemo} from 'react'\nimport {\n PatchEvent,\n ArrayOfObjectsInputProps,\n MemberItem,\n unset,\n insert,\n set,\n setIfMissing,\n FormFieldValidationStatus,\n} from 'sanity/form'\nimport {Box, Button, Flex, Grid, Label, Stack} from '@sanity/ui'\n\nimport {Language, Value, ArraySchemaWithLanguageOptions} from '../types'\nimport {Table, TableCell, TableRow} from './Table'\nimport {AddIcon, RemoveIcon, RestoreIcon} from '@sanity/icons'\nimport Feedback from './Feedback'\nimport {getToneFromValidation} from './getToneFromValidation'\n\nexport type InternationalizedArrayInputProps = ArrayOfObjectsInputProps<\n Value,\n ArraySchemaWithLanguageOptions\n>\n\nexport default function InternationalizedArrayInput(props: InternationalizedArrayInputProps) {\n const {members, value, schemaType, onChange} = props\n const readOnly = typeof schemaType.readOnly === 'boolean' ? schemaType.readOnly : false\n const {options} = schemaType\n\n const languages: Language[] = useMemo(() => options?.languages ?? [], [options])\n\n const handleAddLanguage = useCallback(\n (languageId?: string) => {\n // Create new items\n const newItems = languageId\n ? // Just one for this language\n [{_key: languageId}]\n : // Or one for every missing language\n languages\n .filter((language) =>\n value?.length ? !value.find((v) => v._key === language.id) : true\n )\n .map((language) => ({_key: language.id}))\n\n // Insert new items in the correct order\n const languagesInUse = value?.length ? value.map((v) => v) : []\n\n const insertions = newItems.map((item) => {\n // What's the original index of this language?\n const languageIndex = languages.findIndex((l) => item._key === l.id)\n\n // What languages are there beyond that index?\n const remainingLanguages = languages.slice(languageIndex + 1)\n\n // So what is the index in the current value array of the next language in the language array?\n const nextLanguageIndex = languagesInUse.findIndex((l) =>\n remainingLanguages.find((r) => r.id === l._key)\n )\n\n // Keep local state up to date incase multiple insertions are being made\n if (nextLanguageIndex < 0) {\n languagesInUse.push(item)\n } else {\n languagesInUse.splice(nextLanguageIndex, 0, item)\n }\n\n return nextLanguageIndex < 0\n ? // No next language (-1), add to end of array\n insert([item], 'after', [nextLanguageIndex])\n : // Next language found, insert before that\n insert([item], 'before', [nextLanguageIndex])\n })\n\n onChange([setIfMissing([]), ...insertions])\n },\n [languages, onChange, value]\n )\n\n const handleUnsetByKey = useCallback(\n (_key) => {\n onChange(unset([{_key}]))\n },\n [onChange]\n )\n\n // TODO: This is lazy, reordering and re-setting the whole array – it could be surgical\n const handleRestoreOrder = useCallback(() => {\n if (!value?.length) {\n return\n }\n\n // Create a new value array in the correct order\n // This would also strip out values that don't have a language as the key\n const updatedValue = value\n .reduce((acc, v) => {\n const newIndex = languages.findIndex((l) => l.id === v?._key)\n\n if (newIndex) {\n acc[newIndex] = v\n }\n\n return acc\n }, [] as Value[])\n .filter(Boolean)\n\n onChange(set(updatedValue))\n }, [languages, onChange, value])\n\n const allKeysAreLanguages = useMemo(() => {\n return value?.every((v) => languages.find((l) => l?.id === v?._key))\n }, [value, languages])\n\n // Check languages are in the correct order\n const languagesOutOfOrder = useMemo(() => {\n if (!value?.length) {\n return []\n }\n\n const languagesInUse = languages.filter((l) => value.find((v) => v._key === l.id))\n\n return value\n .map((v, vIndex) => (vIndex === languagesInUse.findIndex((l) => l.id === v._key) ? null : v))\n .filter(Boolean)\n }, [value, languages])\n\n const languagesAreValid = useMemo(\n () => languages?.length && languages.every((item) => item.id && item.title),\n [languages]\n )\n\n if (!languagesAreValid) {\n return <Feedback />\n }\n\n return (\n <Stack space={2}>\n {members?.length > 0 ? (\n <Table>\n <tbody>\n {members.map((member) => (\n <TableRow\n key={member.key}\n tone={\n member?.item?.validation?.length > 0\n ? getToneFromValidation(member.item.validation)\n : undefined\n }\n >\n <TableCell style={{verticalAlign: 'bottom'}}>\n <Box paddingY={3} paddingRight={2}>\n <Label muted size={1}>\n {member.key}\n </Label>\n </Box>\n </TableCell>\n <TableCell paddingRight={2} style={{width: `100%`}}>\n <MemberItem {...props} member={member} />\n </TableCell>\n <TableCell style={{verticalAlign: 'bottom'}}>\n <Flex align=\"center\" justify=\"flex-end\" gap={3}>\n {/* Possibly unncessary, validation shows up in <MemberItem /> */}\n {member.item.validation.length > 0 ? (\n <Box paddingLeft={2}>\n <FormFieldValidationStatus validation={member.item.validation} />\n </Box>\n ) : null}\n <Button\n mode=\"ghost\"\n icon={RemoveIcon}\n tone=\"critical\"\n disabled={typeof readOnly === 'boolean' ? readOnly : false}\n onClick={() => handleUnsetByKey(member.key)}\n />\n </Flex>\n </TableCell>\n </TableRow>\n ))}\n </tbody>\n </Table>\n ) : null}\n\n {languagesOutOfOrder.length > 0 && allKeysAreLanguages ? (\n <Button\n tone=\"caution\"\n icon={RestoreIcon}\n onClick={() => handleRestoreOrder()}\n text=\"Restore order of languages\"\n />\n ) : null}\n\n {value && value.length < languages.length ? (\n <Stack space={2}>\n {/* No more than 5 columns */}\n <Grid columns={Math.min(languages.length, 5)} gap={2}>\n {languages.map((language) => (\n <Button\n key={language.id}\n tone=\"primary\"\n mode=\"ghost\"\n fontSize={1}\n disabled={readOnly || Boolean(value?.find((item) => item._key === language.id))}\n text={language.id.toUpperCase()}\n icon={AddIcon}\n onClick={() => handleAddLanguage(language.id)}\n />\n ))}\n </Grid>\n <Button\n tone=\"primary\"\n mode=\"ghost\"\n disabled={readOnly || (value && value?.length >= languages?.length)}\n icon={AddIcon}\n text={value?.length ? `Add missing languages` : `Add all languages`}\n onClick={() => handleAddLanguage()}\n />\n </Stack>\n ) : null}\n </Stack>\n )\n}\n","import React from 'react'\nimport styled, {css} from 'styled-components'\nimport {Box, BoxProps, Card, CardProps} from '@sanity/ui'\n\n// Wrappers required because of bug with passing down \"as\" prop\n// https://github.com/styled-components/styled-components/issues/2449\n\n// Table\nconst TableWrapper = (props = {}) => {\n return <Box as=\"table\" {...props} />\n}\n\nconst StyledTable = styled(TableWrapper)(\n () =>\n css`\n display: table;\n width: 100%;\n\n &:not([hidden]) {\n display: table;\n }\n `\n)\n\ntype TableProps = BoxProps & {\n children: React.ReactNode\n style?: React.CSSProperties\n}\n\nexport function Table(props: TableProps) {\n const {children, ...rest} = props\n\n return <StyledTable {...rest}>{children}</StyledTable>\n}\n\n// Row\nconst RowWrapper = (props = {}) => {\n return <Card as=\"tr\" {...props} />\n}\n\nconst StyledRow = styled(RowWrapper)(\n () =>\n css`\n display: table-row;\n\n &:not([hidden]) {\n display: table-row;\n }\n `\n)\n\ntype TableRowProps = CardProps & {\n children: React.ReactNode\n style?: React.CSSProperties\n}\n\nexport function TableRow(props: TableRowProps) {\n const {children, ...rest} = props\n\n return <StyledRow {...rest}>{children}</StyledRow>\n}\n\n// Cell\nconst CellWrapper = (props = {}) => {\n return <Box as=\"td\" {...props} />\n}\n\nconst StyledCell = styled(CellWrapper)(\n () =>\n css`\n display: table-cell;\n\n &:not([hidden]) {\n display: table-cell;\n }\n `\n)\n\ntype TableCellProps = BoxProps & {\n children: React.ReactNode\n style?: React.CSSProperties\n}\n\nexport function TableCell(props: TableCellProps) {\n const {children, ...rest} = props\n\n return <StyledCell {...rest}>{children}</StyledCell>\n}\n","import {Text, Card, Stack, Code} from '@sanity/ui'\nimport React from 'react'\n\nconst schemaExample = {\n languages: [\n {id: 'en', title: 'English'},\n {id: 'no', title: 'Norsk'},\n ],\n}\n\nexport default function Feedback() {\n return (\n <Card tone=\"caution\" border radius={2} padding={3}>\n <Stack space={4}>\n <Text>\n An array of language objects must be passed into the <code>internationalizedArray</code>{' '}\n helper function, each with an <code>id</code> and <code>title</code> field. Example:\n </Text>\n <Card padding={2} border radius={2}>\n <Code size={1} language=\"javascript\">\n {JSON.stringify(schemaExample, null, 2)}\n </Code>\n </Card>\n </Stack>\n </Card>\n )\n}\n","import {NodeValidation} from 'sanity/form'\nimport {CardTone} from '@sanity/ui'\n\nexport function getToneFromValidation(validations: NodeValidation[]): CardTone {\n if (!validations.length) {\n return `default`\n }\n\n const validationLevels = validations.map((v) => v.level)\n\n if (validationLevels.includes('error')) {\n return `critical`\n } else if (validationLevels.includes('warning')) {\n return `caution`\n }\n\n return `default`\n}\n"],"names":[],"version":3,"file":"index.js.map","sourceRoot":"../../"}