sanity-plugin-internationalized-array 1.1.1 → 1.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/lib/cjs/index.js CHANGED
@@ -45,6 +45,7 @@ function $a0eca5cb1c058e2c$export$ab1ce2a474f41f52(name, addValue = false) {
45
45
 
46
46
 
47
47
 
48
+
48
49
  // Wrappers required because of bug with passing down "as" prop
49
50
  // https://github.com/styled-components/styled-components/issues/2449
50
51
  // Table
@@ -116,7 +117,6 @@ function $acfbfc6ee2363807$export$1e4baea7053fc0e3(props) {
116
117
 
117
118
 
118
119
 
119
-
120
120
  const $aaf4d804384afd00$var$schemaExample = {
121
121
  languages: [
122
122
  {
@@ -189,6 +189,10 @@ function $7e790a73eaf2b445$export$2e2bcd8739ae039(props) {
189
189
  const languages = (0, $k7rGe$react.useMemo)(()=>options?.languages ?? [], [
190
190
  options
191
191
  ]);
192
+ const valueLanguageKeys = (0, $k7rGe$react.useMemo)(()=>value?.map((v)=>v._key).filter((key)=>languages.find((l)=>l.id === key)) ?? [], [
193
+ languages,
194
+ value
195
+ ]);
192
196
  const handleAddLanguage = (0, $k7rGe$react.useCallback)((languageId)=>{
193
197
  // Create new items
194
198
  const newItems = languageId ? [
@@ -242,7 +246,6 @@ function $7e790a73eaf2b445$export$2e2bcd8739ae039(props) {
242
246
  // TODO: This is lazy, reordering and re-setting the whole array – it could be surgical
243
247
  const handleRestoreOrder = (0, $k7rGe$react.useCallback)(()=>{
244
248
  if (!value?.length) return;
245
- console.log(value);
246
249
  // Create a new value array in the correct order
247
250
  // This would also strip out values that don't have a language as the key
248
251
  const updatedValue = value.reduce((acc, v)=>{
@@ -276,6 +279,31 @@ function $7e790a73eaf2b445$export$2e2bcd8739ae039(props) {
276
279
  value,
277
280
  languages
278
281
  ]);
282
+ const handleKeyChange = (0, $k7rGe$react.useCallback)((config)=>{
283
+ if (!value) return;
284
+ const { from: from , to: to , index: index } = config;
285
+ const currentValue = value.find((v)=>v._key === from);
286
+ const newValue = {
287
+ ...currentValue,
288
+ _key: to
289
+ };
290
+ // TODO: Make sure this gets the correct language index, currently replaces-in-place
291
+ onChange([
292
+ (0, $k7rGe$sanityform.insert)([
293
+ newValue
294
+ ], "after", [
295
+ index
296
+ ]),
297
+ (0, $k7rGe$sanityform.unset)([
298
+ {
299
+ _key: from
300
+ }
301
+ ])
302
+ ]);
303
+ }, [
304
+ onChange,
305
+ value
306
+ ]);
279
307
  const languagesAreValid = (0, $k7rGe$react.useMemo)(()=>!languages?.length || languages?.length && languages.every((item)=>item.id && item.title), [
280
308
  languages
281
309
  ]);
@@ -285,7 +313,7 @@ function $7e790a73eaf2b445$export$2e2bcd8739ae039(props) {
285
313
  children: [
286
314
  members?.length > 0 ? /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $acfbfc6ee2363807$export$54ec01a60f47d33d), {
287
315
  children: /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)("tbody", {
288
- children: members.map((member)=>/*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsxs)((0, $acfbfc6ee2363807$export$b05581f4e764e162), {
316
+ children: members.map((member, memberIndex)=>member.kind === "item" ? /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsxs)((0, $acfbfc6ee2363807$export$b05581f4e764e162), {
289
317
  tone: member?.item?.validation?.length > 0 ? (0, $6a9b28384eb7074d$export$16423358d6ebe294)(member.item.validation) : undefined,
290
318
  children: [
291
319
  /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $acfbfc6ee2363807$export$1e4baea7053fc0e3), {
@@ -295,10 +323,32 @@ function $7e790a73eaf2b445$export$2e2bcd8739ae039(props) {
295
323
  children: /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityui.Box), {
296
324
  paddingY: 3,
297
325
  paddingRight: 2,
298
- children: /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityui.Label), {
326
+ children: valueLanguageKeys.includes(member.key) ? /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityui.Label), {
299
327
  muted: true,
300
328
  size: 1,
301
329
  children: member.key
330
+ }) : /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityui.MenuButton), {
331
+ button: /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityui.Button), {
332
+ fontSize: 1,
333
+ text: `Change "${member.key}"`
334
+ }),
335
+ id: `${member.key}-change-key`,
336
+ menu: /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityui.Menu), {
337
+ children: languages.map((language)=>/*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityui.MenuItem), {
338
+ disabled: valueLanguageKeys.includes(language.id),
339
+ fontSize: 1,
340
+ text: language.id.toLocaleUpperCase(),
341
+ onClick: ()=>handleKeyChange({
342
+ from: member.key,
343
+ to: language.id,
344
+ index: memberIndex
345
+ })
346
+ }, language.id))
347
+ }),
348
+ placement: "right",
349
+ popover: {
350
+ portal: true
351
+ }
302
352
  })
303
353
  })
304
354
  }),
@@ -307,7 +357,7 @@ function $7e790a73eaf2b445$export$2e2bcd8739ae039(props) {
307
357
  style: {
308
358
  width: `100%`
309
359
  },
310
- children: /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityform.MemberItem), {
360
+ children: /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityform.ArrayOfObjectsItem), {
311
361
  ...props,
312
362
  member: member
313
363
  })
@@ -316,29 +366,23 @@ function $7e790a73eaf2b445$export$2e2bcd8739ae039(props) {
316
366
  style: {
317
367
  verticalAlign: "bottom"
318
368
  },
319
- children: /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsxs)((0, $k7rGe$sanityui.Flex), {
369
+ children: /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityui.Flex), {
320
370
  align: "center",
321
371
  justify: "flex-end",
322
372
  gap: 3,
323
- children: [
324
- member?.item?.validation?.length > 0 ? /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityui.Box), {
325
- paddingLeft: 2,
326
- children: /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityform.FormFieldValidationStatus), {
327
- validation: member.item.validation
328
- })
329
- }) : null,
330
- /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityui.Button), {
331
- mode: "ghost",
332
- icon: (0, $k7rGe$sanityicons.RemoveIcon),
333
- tone: "critical",
334
- disabled: typeof readOnly === "boolean" ? readOnly : false,
335
- onClick: ()=>handleUnsetByKey(member.key)
336
- })
337
- ]
373
+ children: /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityui.Button), {
374
+ mode: "ghost",
375
+ icon: (0, $k7rGe$sanityicons.RemoveIcon),
376
+ tone: "critical",
377
+ disabled: typeof readOnly === "boolean" ? readOnly : false,
378
+ onClick: ()=>handleUnsetByKey(member.key)
379
+ })
338
380
  })
339
381
  })
340
382
  ]
341
- }, member.key))
383
+ }, member.key) : /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityui.Text), {
384
+ children: "Error"
385
+ }))
342
386
  })
343
387
  }) : null,
344
388
  languagesOutOfOrder.length > 0 && allKeysAreLanguages ? /*#__PURE__*/ (0, $k7rGe$reactjsxruntime.jsx)((0, $k7rGe$sanityui.Button), {
@@ -393,6 +437,8 @@ var $0437df2e2e149362$export$2e2bcd8739ae039 = (config)=>{
393
437
  options: {
394
438
  languages: languages
395
439
  },
440
+ // TODO: Address this typing issue with the inner object
441
+ // @ts-ignore
396
442
  of: [
397
443
  (0, $k7rGe$sanity.defineField)({
398
444
  name: objectName,
@@ -450,6 +496,8 @@ var $f727fb16d5d00f8f$export$2e2bcd8739ae039 = (config)=>{
450
496
  name: objectName,
451
497
  title: `Internationalized array ${type}`,
452
498
  type: "object",
499
+ // TODO: Address this typing issue with the inner object
500
+ // @ts-ignore
453
501
  fields: [
454
502
  typeof type === `string` ? (0, $k7rGe$sanity.defineField)({
455
503
  name: "value",
@@ -1 +1 @@
1
- {"mappings":"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","sources":["src/index.ts","src/plugin.tsx","src/schema/array.ts","src/components/createFieldName.ts","src/components/InternationalizedArrayInput.tsx","src/components/Table.tsx","src/components/Feedback.tsx","src/components/getToneFromValidation.ts","src/schema/object.ts"],"sourcesContent":["export {internationalizedArray} from './plugin'\n","import {createPlugin} from 'sanity'\nimport {PluginConfig} from './types'\nimport array from './schema/array'\nimport object from './schema/object'\n\nconst CONFIG_DEFAULT = {\n languages: [],\n fieldTypes: [],\n}\n\nexport const internationalizedArray = createPlugin<PluginConfig>((config = CONFIG_DEFAULT) => {\n const {languages, fieldTypes} = {...CONFIG_DEFAULT, ...config}\n\n return {\n name: 'sanity-plugin-internationalized-array',\n schema: {\n types: [\n ...fieldTypes.map((type) => array({type, languages})),\n ...fieldTypes.map((type) => object({type})),\n ],\n },\n }\n})\n","import {defineField, Rule, Schema} from 'sanity'\n\nimport {createFieldName} from '../components/createFieldName'\nimport InternationalizedArrayInput from '../components/InternationalizedArrayInput'\nimport {Language, Value} from '../types'\n\ntype ArrayFactoryConfig = {\n languages: Language[]\n type: string | Schema.FieldDefinition\n}\n\nexport default (config: ArrayFactoryConfig): Schema.FieldDefinition<'array'> => {\n const {languages, type} = config\n const typeName = typeof type === `string` ? type : type.name\n const arrayName = createFieldName(typeName)\n const objectName = createFieldName(typeName, true)\n\n return defineField({\n name: arrayName,\n title: 'Internationalized array',\n type: 'array',\n components: {input: InternationalizedArrayInput},\n options: {languages},\n of: [defineField({name: objectName, type: objectName})],\n validation: (rule: Rule) =>\n rule.max(languages?.length).custom<Value[]>((value, context) => {\n const {languages: contextLanguages}: {languages: Language[]} = context?.type?.options ?? {}\n const nonLanguageKeys = value?.length\n ? value.filter((item) => !contextLanguages.find((language) => item._key === language.id))\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\n return true\n }),\n })\n}\n","export function camelCase(string: string) {\n return string.replace(/-([a-z])/g, (g) => g[1].toUpperCase())\n}\n\nexport function titleCase(string: string) {\n return string\n .split(` `)\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(` `)\n}\n\nexport function pascalCase(string: string) {\n return titleCase(camelCase(string))\n}\n\nexport function createFieldName(name: string, addValue = false): string {\n return addValue\n ? [`internationalizedArray`, pascalCase(name), `Value`].join(``)\n : [`internationalizedArray`, pascalCase(name)].join(``)\n}\n","import React, {useCallback, useMemo} from 'react'\nimport {\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, useToast} 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 const toast = useToast()\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 // eslint-disable-next-line max-nested-callbacks\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: string) => {\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 console.log(value)\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 > -1) {\n acc[newIndex] = v\n }\n\n return acc\n }, [] as Value[])\n .filter(Boolean)\n\n if (value.length !== updatedValue.length) {\n toast.push({\n title: 'There was an error reordering languages',\n status: 'warning',\n })\n }\n\n onChange(set(updatedValue))\n }, [toast, 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 () =>\n !languages?.length || (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 {/* This renders the entire field default with title */}\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 {languages?.length > 0 ? (\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","import {defineField, Schema} from 'sanity'\n\nimport {createFieldName} from '../components/createFieldName'\n\ntype ObjectFactoryConfig = {\n type: string | Schema.FieldDefinition\n}\n\nexport default (config: ObjectFactoryConfig): Schema.FieldDefinition<'object'> => {\n const {type} = config\n const typeName = typeof type === `string` ? type : type.name\n const objectName = createFieldName(typeName, true)\n\n return defineField({\n name: objectName,\n title: `Internationalized array ${type}`,\n type: 'object',\n fields: [\n typeof type === `string`\n ? // Define a basic field if all we have is the string name\n defineField({\n name: 'value',\n type,\n })\n : // Pass in the configured options, but overwrite the name\n {...type, name: 'value'},\n ],\n })\n}\n"],"names":[],"version":3,"file":"index.js.map","sourceRoot":"../../"}
1
+ {"mappings":"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","sources":["src/index.ts","src/plugin.tsx","src/schema/array.ts","src/components/createFieldName.ts","src/components/InternationalizedArrayInput.tsx","src/components/Table.tsx","src/components/Feedback.tsx","src/components/getToneFromValidation.ts","src/schema/object.ts"],"sourcesContent":["export {internationalizedArray} from './plugin'\n","import {createPlugin} from 'sanity'\nimport {PluginConfig} from './types'\nimport array from './schema/array'\nimport object from './schema/object'\n\nconst CONFIG_DEFAULT = {\n languages: [],\n fieldTypes: [],\n}\n\nexport const internationalizedArray = createPlugin<PluginConfig>((config = CONFIG_DEFAULT) => {\n const {languages, fieldTypes} = {...CONFIG_DEFAULT, ...config}\n\n return {\n name: 'sanity-plugin-internationalized-array',\n schema: {\n types: [\n ...fieldTypes.map((type) => array({type, languages})),\n ...fieldTypes.map((type) => object({type})),\n ],\n },\n }\n})\n","import {defineField, Rule, Schema} from 'sanity'\n\nimport {createFieldName} from '../components/createFieldName'\nimport InternationalizedArrayInput from '../components/InternationalizedArrayInput'\nimport {Language, Value} from '../types'\n\ntype ArrayFactoryConfig = {\n languages: Language[]\n type: string | Schema.FieldDefinition\n}\n\nexport default (config: ArrayFactoryConfig): Schema.FieldDefinition<'array'> => {\n const {languages, type} = config\n const typeName = typeof type === `string` ? type : type.name\n const arrayName = createFieldName(typeName)\n const objectName = createFieldName(typeName, true)\n\n return defineField({\n name: arrayName,\n title: 'Internationalized array',\n type: 'array',\n components: {input: InternationalizedArrayInput},\n options: {languages},\n // TODO: Address this typing issue with the inner object\n // @ts-ignore\n of: [defineField({name: objectName, type: objectName})],\n validation: (rule: Rule) =>\n rule.max(languages?.length).custom<Value[]>((value, context) => {\n const {languages: contextLanguages}: {languages: Language[]} = context?.type?.options ?? {}\n const nonLanguageKeys = value?.length\n ? value.filter((item) => !contextLanguages.find((language) => item._key === language.id))\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\n return true\n }),\n })\n}\n","export function camelCase(string: string): string {\n return string.replace(/-([a-z])/g, (g) => g[1].toUpperCase())\n}\n\nexport function titleCase(string: string): string {\n return string\n .split(` `)\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(` `)\n}\n\nexport function pascalCase(string: string): string {\n return titleCase(camelCase(string))\n}\n\nexport function createFieldName(name: string, addValue = false): string {\n return addValue\n ? [`internationalizedArray`, pascalCase(name), `Value`].join(``)\n : [`internationalizedArray`, pascalCase(name)].join(``)\n}\n","import React, {useCallback, useMemo} from 'react'\nimport {\n ArrayOfObjectsInputProps,\n ArrayOfObjectsItem,\n unset,\n insert,\n set,\n setIfMissing,\n} from 'sanity/form'\nimport {\n Text,\n Box,\n Button,\n Flex,\n Grid,\n Label,\n MenuButton,\n Stack,\n useToast,\n Menu,\n MenuItem,\n} from '@sanity/ui'\nimport {AddIcon, RemoveIcon, RestoreIcon} from '@sanity/icons'\n\nimport {Language, Value, ArraySchemaWithLanguageOptions} from '../types'\nimport {Table, TableCell, TableRow} from './Table'\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 const toast = useToast()\n\n const languages: Language[] = useMemo(() => options?.languages ?? [], [options])\n const valueLanguageKeys = useMemo(\n () => value?.map((v) => v._key).filter((key) => languages.find((l) => l.id === key)) ?? [],\n [languages, value]\n )\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 // eslint-disable-next-line max-nested-callbacks\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: string) => {\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 > -1) {\n acc[newIndex] = v\n }\n\n return acc\n }, [] as Value[])\n .filter(Boolean)\n\n if (value.length !== updatedValue.length) {\n toast.push({\n title: 'There was an error reordering languages',\n status: 'warning',\n })\n }\n\n onChange(set(updatedValue))\n }, [toast, 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 handleKeyChange = useCallback(\n (config: {from: string; to: string; index: number}) => {\n if (!value) {\n return\n }\n\n const {from, to, index} = config\n const currentValue = value.find((v) => v._key === from)\n const newValue = {...currentValue, _key: to}\n\n // TODO: Make sure this gets the correct language index, currently replaces-in-place\n onChange([insert([newValue], 'after', [index]), unset([{_key: from}])])\n },\n [onChange, value]\n )\n\n const languagesAreValid = useMemo(\n () =>\n !languages?.length || (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, memberIndex) =>\n member.kind === 'item' ? (\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 {valueLanguageKeys.includes(member.key) ? (\n <Label muted size={1}>\n {member.key}\n </Label>\n ) : (\n <MenuButton\n button={<Button fontSize={1} text={`Change \"${member.key}\"`} />}\n id={`${member.key}-change-key`}\n menu={\n <Menu>\n {languages.map((language) => (\n <MenuItem\n disabled={valueLanguageKeys.includes(language.id)}\n fontSize={1}\n key={language.id}\n text={language.id.toLocaleUpperCase()}\n onClick={() =>\n handleKeyChange({\n from: member.key,\n to: language.id,\n index: memberIndex,\n })\n }\n />\n ))}\n </Menu>\n }\n placement=\"right\"\n popover={{portal: true}}\n />\n )}\n </Box>\n </TableCell>\n <TableCell paddingRight={2} style={{width: `100%`}}>\n {/* This renders the entire field default with title */}\n <ArrayOfObjectsItem {...props} member={member} />\n </TableCell>\n <TableCell style={{verticalAlign: 'bottom'}}>\n <Flex align=\"center\" justify=\"flex-end\" gap={3}>\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 <Text>Error</Text>\n )\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 {languages?.length > 0 ? (\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","import {defineField, Schema} from 'sanity'\n\nimport {createFieldName} from '../components/createFieldName'\n\ntype ObjectFactoryConfig = {\n type: string | Schema.FieldDefinition\n}\n\nexport default (config: ObjectFactoryConfig): Schema.FieldDefinition<'object'> => {\n const {type} = config\n const typeName = typeof type === `string` ? type : type.name\n const objectName = createFieldName(typeName, true)\n\n return defineField({\n name: objectName,\n title: `Internationalized array ${type}`,\n type: 'object',\n // TODO: Address this typing issue with the inner object\n // @ts-ignore\n fields: [\n typeof type === `string`\n ? // Define a basic field if all we have is the string name\n defineField({\n name: 'value',\n type,\n })\n : // Pass in the configured options, but overwrite the name\n {...type, name: 'value'},\n ],\n })\n}\n"],"names":[],"version":3,"file":"index.js.map","sourceRoot":"../../"}
package/lib/esm/index.js CHANGED
@@ -1,8 +1,8 @@
1
1
  import {createPlugin as $gGrEF$createPlugin, defineField as $gGrEF$defineField} from "sanity";
2
2
  import {jsx as $gGrEF$jsx, jsxs as $gGrEF$jsxs} from "react/jsx-runtime";
3
3
  import {useMemo as $gGrEF$useMemo, useCallback as $gGrEF$useCallback} from "react";
4
- import {insert as $gGrEF$insert, setIfMissing as $gGrEF$setIfMissing, unset as $gGrEF$unset, set as $gGrEF$set, MemberItem as $gGrEF$MemberItem, FormFieldValidationStatus as $gGrEF$FormFieldValidationStatus} from "sanity/form";
5
- import {useToast as $gGrEF$useToast, Stack as $gGrEF$Stack, Box as $gGrEF$Box, Label as $gGrEF$Label, Flex as $gGrEF$Flex, Button as $gGrEF$Button, Grid as $gGrEF$Grid, Card as $gGrEF$Card, Text as $gGrEF$Text, Code as $gGrEF$Code} from "@sanity/ui";
4
+ import {insert as $gGrEF$insert, setIfMissing as $gGrEF$setIfMissing, unset as $gGrEF$unset, set as $gGrEF$set, ArrayOfObjectsItem as $gGrEF$ArrayOfObjectsItem} from "sanity/form";
5
+ import {useToast as $gGrEF$useToast, Stack as $gGrEF$Stack, Box as $gGrEF$Box, Label as $gGrEF$Label, MenuButton as $gGrEF$MenuButton, Button as $gGrEF$Button, Menu as $gGrEF$Menu, MenuItem as $gGrEF$MenuItem, Flex as $gGrEF$Flex, Text as $gGrEF$Text, Grid as $gGrEF$Grid, Card as $gGrEF$Card, Code as $gGrEF$Code} from "@sanity/ui";
6
6
  import {RemoveIcon as $gGrEF$RemoveIcon, RestoreIcon as $gGrEF$RestoreIcon, AddIcon as $gGrEF$AddIcon} from "@sanity/icons";
7
7
  import $gGrEF$styledcomponents, {css as $gGrEF$css} from "styled-components";
8
8
 
@@ -37,6 +37,7 @@ function $5c51df8bc000fd76$export$ab1ce2a474f41f52(name, addValue = false) {
37
37
 
38
38
 
39
39
 
40
+
40
41
  // Wrappers required because of bug with passing down "as" prop
41
42
  // https://github.com/styled-components/styled-components/issues/2449
42
43
  // Table
@@ -108,7 +109,6 @@ function $32ee6db03f46d8dd$export$1e4baea7053fc0e3(props) {
108
109
 
109
110
 
110
111
 
111
-
112
112
  const $e183d660634d2ba0$var$schemaExample = {
113
113
  languages: [
114
114
  {
@@ -181,6 +181,10 @@ function $e3540aa1271cf9b1$export$2e2bcd8739ae039(props) {
181
181
  const languages = (0, $gGrEF$useMemo)(()=>options?.languages ?? [], [
182
182
  options
183
183
  ]);
184
+ const valueLanguageKeys = (0, $gGrEF$useMemo)(()=>value?.map((v)=>v._key).filter((key)=>languages.find((l)=>l.id === key)) ?? [], [
185
+ languages,
186
+ value
187
+ ]);
184
188
  const handleAddLanguage = (0, $gGrEF$useCallback)((languageId)=>{
185
189
  // Create new items
186
190
  const newItems = languageId ? [
@@ -234,7 +238,6 @@ function $e3540aa1271cf9b1$export$2e2bcd8739ae039(props) {
234
238
  // TODO: This is lazy, reordering and re-setting the whole array – it could be surgical
235
239
  const handleRestoreOrder = (0, $gGrEF$useCallback)(()=>{
236
240
  if (!value?.length) return;
237
- console.log(value);
238
241
  // Create a new value array in the correct order
239
242
  // This would also strip out values that don't have a language as the key
240
243
  const updatedValue = value.reduce((acc, v)=>{
@@ -268,6 +271,31 @@ function $e3540aa1271cf9b1$export$2e2bcd8739ae039(props) {
268
271
  value,
269
272
  languages
270
273
  ]);
274
+ const handleKeyChange = (0, $gGrEF$useCallback)((config)=>{
275
+ if (!value) return;
276
+ const { from: from , to: to , index: index } = config;
277
+ const currentValue = value.find((v)=>v._key === from);
278
+ const newValue = {
279
+ ...currentValue,
280
+ _key: to
281
+ };
282
+ // TODO: Make sure this gets the correct language index, currently replaces-in-place
283
+ onChange([
284
+ (0, $gGrEF$insert)([
285
+ newValue
286
+ ], "after", [
287
+ index
288
+ ]),
289
+ (0, $gGrEF$unset)([
290
+ {
291
+ _key: from
292
+ }
293
+ ])
294
+ ]);
295
+ }, [
296
+ onChange,
297
+ value
298
+ ]);
271
299
  const languagesAreValid = (0, $gGrEF$useMemo)(()=>!languages?.length || languages?.length && languages.every((item)=>item.id && item.title), [
272
300
  languages
273
301
  ]);
@@ -277,7 +305,7 @@ function $e3540aa1271cf9b1$export$2e2bcd8739ae039(props) {
277
305
  children: [
278
306
  members?.length > 0 ? /*#__PURE__*/ (0, $gGrEF$jsx)((0, $32ee6db03f46d8dd$export$54ec01a60f47d33d), {
279
307
  children: /*#__PURE__*/ (0, $gGrEF$jsx)("tbody", {
280
- children: members.map((member)=>/*#__PURE__*/ (0, $gGrEF$jsxs)((0, $32ee6db03f46d8dd$export$b05581f4e764e162), {
308
+ children: members.map((member, memberIndex)=>member.kind === "item" ? /*#__PURE__*/ (0, $gGrEF$jsxs)((0, $32ee6db03f46d8dd$export$b05581f4e764e162), {
281
309
  tone: member?.item?.validation?.length > 0 ? (0, $85e3448f0a0a82fa$export$16423358d6ebe294)(member.item.validation) : undefined,
282
310
  children: [
283
311
  /*#__PURE__*/ (0, $gGrEF$jsx)((0, $32ee6db03f46d8dd$export$1e4baea7053fc0e3), {
@@ -287,10 +315,32 @@ function $e3540aa1271cf9b1$export$2e2bcd8739ae039(props) {
287
315
  children: /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Box), {
288
316
  paddingY: 3,
289
317
  paddingRight: 2,
290
- children: /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Label), {
318
+ children: valueLanguageKeys.includes(member.key) ? /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Label), {
291
319
  muted: true,
292
320
  size: 1,
293
321
  children: member.key
322
+ }) : /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$MenuButton), {
323
+ button: /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Button), {
324
+ fontSize: 1,
325
+ text: `Change "${member.key}"`
326
+ }),
327
+ id: `${member.key}-change-key`,
328
+ menu: /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Menu), {
329
+ children: languages.map((language)=>/*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$MenuItem), {
330
+ disabled: valueLanguageKeys.includes(language.id),
331
+ fontSize: 1,
332
+ text: language.id.toLocaleUpperCase(),
333
+ onClick: ()=>handleKeyChange({
334
+ from: member.key,
335
+ to: language.id,
336
+ index: memberIndex
337
+ })
338
+ }, language.id))
339
+ }),
340
+ placement: "right",
341
+ popover: {
342
+ portal: true
343
+ }
294
344
  })
295
345
  })
296
346
  }),
@@ -299,7 +349,7 @@ function $e3540aa1271cf9b1$export$2e2bcd8739ae039(props) {
299
349
  style: {
300
350
  width: `100%`
301
351
  },
302
- children: /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$MemberItem), {
352
+ children: /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$ArrayOfObjectsItem), {
303
353
  ...props,
304
354
  member: member
305
355
  })
@@ -308,29 +358,23 @@ function $e3540aa1271cf9b1$export$2e2bcd8739ae039(props) {
308
358
  style: {
309
359
  verticalAlign: "bottom"
310
360
  },
311
- children: /*#__PURE__*/ (0, $gGrEF$jsxs)((0, $gGrEF$Flex), {
361
+ children: /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Flex), {
312
362
  align: "center",
313
363
  justify: "flex-end",
314
364
  gap: 3,
315
- children: [
316
- member?.item?.validation?.length > 0 ? /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Box), {
317
- paddingLeft: 2,
318
- children: /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$FormFieldValidationStatus), {
319
- validation: member.item.validation
320
- })
321
- }) : null,
322
- /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Button), {
323
- mode: "ghost",
324
- icon: (0, $gGrEF$RemoveIcon),
325
- tone: "critical",
326
- disabled: typeof readOnly === "boolean" ? readOnly : false,
327
- onClick: ()=>handleUnsetByKey(member.key)
328
- })
329
- ]
365
+ children: /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Button), {
366
+ mode: "ghost",
367
+ icon: (0, $gGrEF$RemoveIcon),
368
+ tone: "critical",
369
+ disabled: typeof readOnly === "boolean" ? readOnly : false,
370
+ onClick: ()=>handleUnsetByKey(member.key)
371
+ })
330
372
  })
331
373
  })
332
374
  ]
333
- }, member.key))
375
+ }, member.key) : /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Text), {
376
+ children: "Error"
377
+ }))
334
378
  })
335
379
  }) : null,
336
380
  languagesOutOfOrder.length > 0 && allKeysAreLanguages ? /*#__PURE__*/ (0, $gGrEF$jsx)((0, $gGrEF$Button), {
@@ -385,6 +429,8 @@ var $581a585556642695$export$2e2bcd8739ae039 = (config)=>{
385
429
  options: {
386
430
  languages: languages
387
431
  },
432
+ // TODO: Address this typing issue with the inner object
433
+ // @ts-ignore
388
434
  of: [
389
435
  (0, $gGrEF$defineField)({
390
436
  name: objectName,
@@ -442,6 +488,8 @@ var $3d48ee33fe42e7bc$export$2e2bcd8739ae039 = (config)=>{
442
488
  name: objectName,
443
489
  title: `Internationalized array ${type}`,
444
490
  type: "object",
491
+ // TODO: Address this typing issue with the inner object
492
+ // @ts-ignore
445
493
  fields: [
446
494
  typeof type === `string` ? (0, $gGrEF$defineField)({
447
495
  name: "value",
@@ -1 +1 @@
1
- {"mappings":"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","sources":["src/index.ts","src/plugin.tsx","src/schema/array.ts","src/components/createFieldName.ts","src/components/InternationalizedArrayInput.tsx","src/components/Table.tsx","src/components/Feedback.tsx","src/components/getToneFromValidation.ts","src/schema/object.ts"],"sourcesContent":["export {internationalizedArray} from './plugin'\n","import {createPlugin} from 'sanity'\nimport {PluginConfig} from './types'\nimport array from './schema/array'\nimport object from './schema/object'\n\nconst CONFIG_DEFAULT = {\n languages: [],\n fieldTypes: [],\n}\n\nexport const internationalizedArray = createPlugin<PluginConfig>((config = CONFIG_DEFAULT) => {\n const {languages, fieldTypes} = {...CONFIG_DEFAULT, ...config}\n\n return {\n name: 'sanity-plugin-internationalized-array',\n schema: {\n types: [\n ...fieldTypes.map((type) => array({type, languages})),\n ...fieldTypes.map((type) => object({type})),\n ],\n },\n }\n})\n","import {defineField, Rule, Schema} from 'sanity'\n\nimport {createFieldName} from '../components/createFieldName'\nimport InternationalizedArrayInput from '../components/InternationalizedArrayInput'\nimport {Language, Value} from '../types'\n\ntype ArrayFactoryConfig = {\n languages: Language[]\n type: string | Schema.FieldDefinition\n}\n\nexport default (config: ArrayFactoryConfig): Schema.FieldDefinition<'array'> => {\n const {languages, type} = config\n const typeName = typeof type === `string` ? type : type.name\n const arrayName = createFieldName(typeName)\n const objectName = createFieldName(typeName, true)\n\n return defineField({\n name: arrayName,\n title: 'Internationalized array',\n type: 'array',\n components: {input: InternationalizedArrayInput},\n options: {languages},\n of: [defineField({name: objectName, type: objectName})],\n validation: (rule: Rule) =>\n rule.max(languages?.length).custom<Value[]>((value, context) => {\n const {languages: contextLanguages}: {languages: Language[]} = context?.type?.options ?? {}\n const nonLanguageKeys = value?.length\n ? value.filter((item) => !contextLanguages.find((language) => item._key === language.id))\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\n return true\n }),\n })\n}\n","export function camelCase(string: string) {\n return string.replace(/-([a-z])/g, (g) => g[1].toUpperCase())\n}\n\nexport function titleCase(string: string) {\n return string\n .split(` `)\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(` `)\n}\n\nexport function pascalCase(string: string) {\n return titleCase(camelCase(string))\n}\n\nexport function createFieldName(name: string, addValue = false): string {\n return addValue\n ? [`internationalizedArray`, pascalCase(name), `Value`].join(``)\n : [`internationalizedArray`, pascalCase(name)].join(``)\n}\n","import React, {useCallback, useMemo} from 'react'\nimport {\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, useToast} 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 const toast = useToast()\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 // eslint-disable-next-line max-nested-callbacks\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: string) => {\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 console.log(value)\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 > -1) {\n acc[newIndex] = v\n }\n\n return acc\n }, [] as Value[])\n .filter(Boolean)\n\n if (value.length !== updatedValue.length) {\n toast.push({\n title: 'There was an error reordering languages',\n status: 'warning',\n })\n }\n\n onChange(set(updatedValue))\n }, [toast, 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 () =>\n !languages?.length || (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 {/* This renders the entire field default with title */}\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 {languages?.length > 0 ? (\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","import {defineField, Schema} from 'sanity'\n\nimport {createFieldName} from '../components/createFieldName'\n\ntype ObjectFactoryConfig = {\n type: string | Schema.FieldDefinition\n}\n\nexport default (config: ObjectFactoryConfig): Schema.FieldDefinition<'object'> => {\n const {type} = config\n const typeName = typeof type === `string` ? type : type.name\n const objectName = createFieldName(typeName, true)\n\n return defineField({\n name: objectName,\n title: `Internationalized array ${type}`,\n type: 'object',\n fields: [\n typeof type === `string`\n ? // Define a basic field if all we have is the string name\n defineField({\n name: 'value',\n type,\n })\n : // Pass in the configured options, but overwrite the name\n {...type, name: 'value'},\n ],\n })\n}\n"],"names":[],"version":3,"file":"index.js.map","sourceRoot":"../../"}
1
+ {"mappings":"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","sources":["src/index.ts","src/plugin.tsx","src/schema/array.ts","src/components/createFieldName.ts","src/components/InternationalizedArrayInput.tsx","src/components/Table.tsx","src/components/Feedback.tsx","src/components/getToneFromValidation.ts","src/schema/object.ts"],"sourcesContent":["export {internationalizedArray} from './plugin'\n","import {createPlugin} from 'sanity'\nimport {PluginConfig} from './types'\nimport array from './schema/array'\nimport object from './schema/object'\n\nconst CONFIG_DEFAULT = {\n languages: [],\n fieldTypes: [],\n}\n\nexport const internationalizedArray = createPlugin<PluginConfig>((config = CONFIG_DEFAULT) => {\n const {languages, fieldTypes} = {...CONFIG_DEFAULT, ...config}\n\n return {\n name: 'sanity-plugin-internationalized-array',\n schema: {\n types: [\n ...fieldTypes.map((type) => array({type, languages})),\n ...fieldTypes.map((type) => object({type})),\n ],\n },\n }\n})\n","import {defineField, Rule, Schema} from 'sanity'\n\nimport {createFieldName} from '../components/createFieldName'\nimport InternationalizedArrayInput from '../components/InternationalizedArrayInput'\nimport {Language, Value} from '../types'\n\ntype ArrayFactoryConfig = {\n languages: Language[]\n type: string | Schema.FieldDefinition\n}\n\nexport default (config: ArrayFactoryConfig): Schema.FieldDefinition<'array'> => {\n const {languages, type} = config\n const typeName = typeof type === `string` ? type : type.name\n const arrayName = createFieldName(typeName)\n const objectName = createFieldName(typeName, true)\n\n return defineField({\n name: arrayName,\n title: 'Internationalized array',\n type: 'array',\n components: {input: InternationalizedArrayInput},\n options: {languages},\n // TODO: Address this typing issue with the inner object\n // @ts-ignore\n of: [defineField({name: objectName, type: objectName})],\n validation: (rule: Rule) =>\n rule.max(languages?.length).custom<Value[]>((value, context) => {\n const {languages: contextLanguages}: {languages: Language[]} = context?.type?.options ?? {}\n const nonLanguageKeys = value?.length\n ? value.filter((item) => !contextLanguages.find((language) => item._key === language.id))\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\n return true\n }),\n })\n}\n","export function camelCase(string: string): string {\n return string.replace(/-([a-z])/g, (g) => g[1].toUpperCase())\n}\n\nexport function titleCase(string: string): string {\n return string\n .split(` `)\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(` `)\n}\n\nexport function pascalCase(string: string): string {\n return titleCase(camelCase(string))\n}\n\nexport function createFieldName(name: string, addValue = false): string {\n return addValue\n ? [`internationalizedArray`, pascalCase(name), `Value`].join(``)\n : [`internationalizedArray`, pascalCase(name)].join(``)\n}\n","import React, {useCallback, useMemo} from 'react'\nimport {\n ArrayOfObjectsInputProps,\n ArrayOfObjectsItem,\n unset,\n insert,\n set,\n setIfMissing,\n} from 'sanity/form'\nimport {\n Text,\n Box,\n Button,\n Flex,\n Grid,\n Label,\n MenuButton,\n Stack,\n useToast,\n Menu,\n MenuItem,\n} from '@sanity/ui'\nimport {AddIcon, RemoveIcon, RestoreIcon} from '@sanity/icons'\n\nimport {Language, Value, ArraySchemaWithLanguageOptions} from '../types'\nimport {Table, TableCell, TableRow} from './Table'\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 const toast = useToast()\n\n const languages: Language[] = useMemo(() => options?.languages ?? [], [options])\n const valueLanguageKeys = useMemo(\n () => value?.map((v) => v._key).filter((key) => languages.find((l) => l.id === key)) ?? [],\n [languages, value]\n )\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 // eslint-disable-next-line max-nested-callbacks\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: string) => {\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 > -1) {\n acc[newIndex] = v\n }\n\n return acc\n }, [] as Value[])\n .filter(Boolean)\n\n if (value.length !== updatedValue.length) {\n toast.push({\n title: 'There was an error reordering languages',\n status: 'warning',\n })\n }\n\n onChange(set(updatedValue))\n }, [toast, 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 handleKeyChange = useCallback(\n (config: {from: string; to: string; index: number}) => {\n if (!value) {\n return\n }\n\n const {from, to, index} = config\n const currentValue = value.find((v) => v._key === from)\n const newValue = {...currentValue, _key: to}\n\n // TODO: Make sure this gets the correct language index, currently replaces-in-place\n onChange([insert([newValue], 'after', [index]), unset([{_key: from}])])\n },\n [onChange, value]\n )\n\n const languagesAreValid = useMemo(\n () =>\n !languages?.length || (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, memberIndex) =>\n member.kind === 'item' ? (\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 {valueLanguageKeys.includes(member.key) ? (\n <Label muted size={1}>\n {member.key}\n </Label>\n ) : (\n <MenuButton\n button={<Button fontSize={1} text={`Change \"${member.key}\"`} />}\n id={`${member.key}-change-key`}\n menu={\n <Menu>\n {languages.map((language) => (\n <MenuItem\n disabled={valueLanguageKeys.includes(language.id)}\n fontSize={1}\n key={language.id}\n text={language.id.toLocaleUpperCase()}\n onClick={() =>\n handleKeyChange({\n from: member.key,\n to: language.id,\n index: memberIndex,\n })\n }\n />\n ))}\n </Menu>\n }\n placement=\"right\"\n popover={{portal: true}}\n />\n )}\n </Box>\n </TableCell>\n <TableCell paddingRight={2} style={{width: `100%`}}>\n {/* This renders the entire field default with title */}\n <ArrayOfObjectsItem {...props} member={member} />\n </TableCell>\n <TableCell style={{verticalAlign: 'bottom'}}>\n <Flex align=\"center\" justify=\"flex-end\" gap={3}>\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 <Text>Error</Text>\n )\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 {languages?.length > 0 ? (\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","import {defineField, Schema} from 'sanity'\n\nimport {createFieldName} from '../components/createFieldName'\n\ntype ObjectFactoryConfig = {\n type: string | Schema.FieldDefinition\n}\n\nexport default (config: ObjectFactoryConfig): Schema.FieldDefinition<'object'> => {\n const {type} = config\n const typeName = typeof type === `string` ? type : type.name\n const objectName = createFieldName(typeName, true)\n\n return defineField({\n name: objectName,\n title: `Internationalized array ${type}`,\n type: 'object',\n // TODO: Address this typing issue with the inner object\n // @ts-ignore\n fields: [\n typeof type === `string`\n ? // Define a basic field if all we have is the string name\n defineField({\n name: 'value',\n type,\n })\n : // Pass in the configured options, but overwrite the name\n {...type, name: 'value'},\n ],\n })\n}\n"],"names":[],"version":3,"file":"index.js.map","sourceRoot":"../../"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sanity-plugin-internationalized-array",
3
- "version": "1.1.1",
3
+ "version": "1.1.2",
4
4
  "description": "Store localized fields in an array to save on attributes",
5
5
  "author": "Simeon Griggs <simeon@sanity.io>",
6
6
  "license": "MIT",
@@ -60,7 +60,7 @@
60
60
  "prettier": "^2.7.1",
61
61
  "react": "^17.0.0 || ^18.0.0",
62
62
  "rimraf": "^3.0.2",
63
- "sanity": "2.29.5-purple-unicorn.856",
63
+ "sanity": "3.0.0-dev-preview.17",
64
64
  "typescript": "4.7.4"
65
65
  },
66
66
  "peerDependencies": {
@@ -1,18 +1,29 @@
1
1
  import React, {useCallback, useMemo} from 'react'
2
2
  import {
3
3
  ArrayOfObjectsInputProps,
4
- MemberItem,
4
+ ArrayOfObjectsItem,
5
5
  unset,
6
6
  insert,
7
7
  set,
8
8
  setIfMissing,
9
- FormFieldValidationStatus,
10
9
  } from 'sanity/form'
11
- import {Box, Button, Flex, Grid, Label, Stack, useToast} from '@sanity/ui'
10
+ import {
11
+ Text,
12
+ Box,
13
+ Button,
14
+ Flex,
15
+ Grid,
16
+ Label,
17
+ MenuButton,
18
+ Stack,
19
+ useToast,
20
+ Menu,
21
+ MenuItem,
22
+ } from '@sanity/ui'
23
+ import {AddIcon, RemoveIcon, RestoreIcon} from '@sanity/icons'
12
24
 
13
25
  import {Language, Value, ArraySchemaWithLanguageOptions} from '../types'
14
26
  import {Table, TableCell, TableRow} from './Table'
15
- import {AddIcon, RemoveIcon, RestoreIcon} from '@sanity/icons'
16
27
  import Feedback from './Feedback'
17
28
  import {getToneFromValidation} from './getToneFromValidation'
18
29
 
@@ -28,6 +39,10 @@ export default function InternationalizedArrayInput(props: InternationalizedArra
28
39
  const toast = useToast()
29
40
 
30
41
  const languages: Language[] = useMemo(() => options?.languages ?? [], [options])
42
+ const valueLanguageKeys = useMemo(
43
+ () => value?.map((v) => v._key).filter((key) => languages.find((l) => l.id === key)) ?? [],
44
+ [languages, value]
45
+ )
31
46
 
32
47
  const handleAddLanguage = useCallback(
33
48
  (languageId?: string) => {
@@ -90,8 +105,6 @@ export default function InternationalizedArrayInput(props: InternationalizedArra
90
105
  return
91
106
  }
92
107
 
93
- console.log(value)
94
-
95
108
  // Create a new value array in the correct order
96
109
  // This would also strip out values that don't have a language as the key
97
110
  const updatedValue = value
@@ -133,6 +146,22 @@ export default function InternationalizedArrayInput(props: InternationalizedArra
133
146
  .filter(Boolean)
134
147
  }, [value, languages])
135
148
 
149
+ const handleKeyChange = useCallback(
150
+ (config: {from: string; to: string; index: number}) => {
151
+ if (!value) {
152
+ return
153
+ }
154
+
155
+ const {from, to, index} = config
156
+ const currentValue = value.find((v) => v._key === from)
157
+ const newValue = {...currentValue, _key: to}
158
+
159
+ // TODO: Make sure this gets the correct language index, currently replaces-in-place
160
+ onChange([insert([newValue], 'after', [index]), unset([{_key: from}])])
161
+ },
162
+ [onChange, value]
163
+ )
164
+
136
165
  const languagesAreValid = useMemo(
137
166
  () =>
138
167
  !languages?.length || (languages?.length && languages.every((item) => item.id && item.title)),
@@ -148,45 +177,71 @@ export default function InternationalizedArrayInput(props: InternationalizedArra
148
177
  {members?.length > 0 ? (
149
178
  <Table>
150
179
  <tbody>
151
- {members.map((member) => (
152
- <TableRow
153
- key={member.key}
154
- tone={
155
- member?.item?.validation?.length > 0
156
- ? getToneFromValidation(member.item.validation)
157
- : undefined
158
- }
159
- >
160
- <TableCell style={{verticalAlign: 'bottom'}}>
161
- <Box paddingY={3} paddingRight={2}>
162
- <Label muted size={1}>
163
- {member.key}
164
- </Label>
165
- </Box>
166
- </TableCell>
167
- <TableCell paddingRight={2} style={{width: `100%`}}>
168
- {/* This renders the entire field default with title */}
169
- <MemberItem {...props} member={member} />
170
- </TableCell>
171
- <TableCell style={{verticalAlign: 'bottom'}}>
172
- <Flex align="center" justify="flex-end" gap={3}>
173
- {/* Possibly unncessary, validation shows up in <MemberItem /> */}
174
- {member?.item?.validation?.length > 0 ? (
175
- <Box paddingLeft={2}>
176
- <FormFieldValidationStatus validation={member.item.validation} />
177
- </Box>
178
- ) : null}
179
- <Button
180
- mode="ghost"
181
- icon={RemoveIcon}
182
- tone="critical"
183
- disabled={typeof readOnly === 'boolean' ? readOnly : false}
184
- onClick={() => handleUnsetByKey(member.key)}
185
- />
186
- </Flex>
187
- </TableCell>
188
- </TableRow>
189
- ))}
180
+ {members.map((member, memberIndex) =>
181
+ member.kind === 'item' ? (
182
+ <TableRow
183
+ key={member.key}
184
+ tone={
185
+ member?.item?.validation?.length > 0
186
+ ? getToneFromValidation(member.item.validation)
187
+ : undefined
188
+ }
189
+ >
190
+ <TableCell style={{verticalAlign: 'bottom'}}>
191
+ <Box paddingY={3} paddingRight={2}>
192
+ {valueLanguageKeys.includes(member.key) ? (
193
+ <Label muted size={1}>
194
+ {member.key}
195
+ </Label>
196
+ ) : (
197
+ <MenuButton
198
+ button={<Button fontSize={1} text={`Change "${member.key}"`} />}
199
+ id={`${member.key}-change-key`}
200
+ menu={
201
+ <Menu>
202
+ {languages.map((language) => (
203
+ <MenuItem
204
+ disabled={valueLanguageKeys.includes(language.id)}
205
+ fontSize={1}
206
+ key={language.id}
207
+ text={language.id.toLocaleUpperCase()}
208
+ onClick={() =>
209
+ handleKeyChange({
210
+ from: member.key,
211
+ to: language.id,
212
+ index: memberIndex,
213
+ })
214
+ }
215
+ />
216
+ ))}
217
+ </Menu>
218
+ }
219
+ placement="right"
220
+ popover={{portal: true}}
221
+ />
222
+ )}
223
+ </Box>
224
+ </TableCell>
225
+ <TableCell paddingRight={2} style={{width: `100%`}}>
226
+ {/* This renders the entire field default with title */}
227
+ <ArrayOfObjectsItem {...props} member={member} />
228
+ </TableCell>
229
+ <TableCell style={{verticalAlign: 'bottom'}}>
230
+ <Flex align="center" justify="flex-end" gap={3}>
231
+ <Button
232
+ mode="ghost"
233
+ icon={RemoveIcon}
234
+ tone="critical"
235
+ disabled={typeof readOnly === 'boolean' ? readOnly : false}
236
+ onClick={() => handleUnsetByKey(member.key)}
237
+ />
238
+ </Flex>
239
+ </TableCell>
240
+ </TableRow>
241
+ ) : (
242
+ <Text>Error</Text>
243
+ )
244
+ )}
190
245
  </tbody>
191
246
  </Table>
192
247
  ) : null}
@@ -1,15 +1,15 @@
1
- export function camelCase(string: string) {
1
+ export function camelCase(string: string): string {
2
2
  return string.replace(/-([a-z])/g, (g) => g[1].toUpperCase())
3
3
  }
4
4
 
5
- export function titleCase(string: string) {
5
+ export function titleCase(string: string): string {
6
6
  return string
7
7
  .split(` `)
8
8
  .map((word) => word.charAt(0).toUpperCase() + word.slice(1))
9
9
  .join(` `)
10
10
  }
11
11
 
12
- export function pascalCase(string: string) {
12
+ export function pascalCase(string: string): string {
13
13
  return titleCase(camelCase(string))
14
14
  }
15
15
 
@@ -21,6 +21,8 @@ export default (config: ArrayFactoryConfig): Schema.FieldDefinition<'array'> =>
21
21
  type: 'array',
22
22
  components: {input: InternationalizedArrayInput},
23
23
  options: {languages},
24
+ // TODO: Address this typing issue with the inner object
25
+ // @ts-ignore
24
26
  of: [defineField({name: objectName, type: objectName})],
25
27
  validation: (rule: Rule) =>
26
28
  rule.max(languages?.length).custom<Value[]>((value, context) => {
@@ -15,6 +15,8 @@ export default (config: ObjectFactoryConfig): Schema.FieldDefinition<'object'> =
15
15
  name: objectName,
16
16
  title: `Internationalized array ${type}`,
17
17
  type: 'object',
18
+ // TODO: Address this typing issue with the inner object
19
+ // @ts-ignore
18
20
  fields: [
19
21
  typeof type === `string`
20
22
  ? // Define a basic field if all we have is the string name