sanity-plugin-internationalized-array 1.0.0 → 1.1.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.
@@ -1 +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":"../../"}
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} 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 // 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) {\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 () =>\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,19 +1,12 @@
1
- import { Rule, FieldDefinition } from "sanity";
1
+ import { Schema } from "sanity";
2
2
  type Language = {
3
3
  id: string;
4
4
  title: string;
5
5
  };
6
- type AllowedType = 'string' | 'number' | 'boolean' | 'text';
7
- type ArrayConfig = {
8
- name: string;
9
- type: AllowedType;
6
+ type PluginConfig = {
10
7
  languages: Language[];
11
- title?: string;
12
- group?: string;
13
- hidden?: boolean | (() => boolean);
14
- readOnly?: boolean | (() => boolean);
15
- validation?: Rule | Rule[];
8
+ fieldTypes: (string | Schema.FieldDefinition)[];
16
9
  };
17
- export function internationalizedArray(config?: ArrayConfig): FieldDefinition;
10
+ export const internationalizedArray: import("sanity").Plugin<PluginConfig>;
18
11
 
19
12
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"mappings":";AAEA,gBAAuB;IACrB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAED,mBAA0B,QAAQ,GAAG,QAAQ,GAAG,SAAS,GAAG,MAAM,CAAA;AAElE,mBAA0B;IACxB,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,WAAW,CAAA;IACjB,SAAS,EAAE,QAAQ,EAAE,CAAA;IACrB,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,MAAM,CAAC,EAAE,OAAO,GAAG,CAAC,MAAM,OAAO,CAAC,CAAA;IAClC,QAAQ,CAAC,EAAE,OAAO,GAAG,CAAC,MAAM,OAAO,CAAC,CAAA;IACpC,UAAU,CAAC,EAAE,IAAI,GAAG,IAAI,EAAE,CAAA;CAC3B,CAAA;AKJD,uCAAuC,MAAM,GAAE,WAA4B,GAAG,eAAe,CAgG5F","sources":["src/src/types.ts","src/src/components/Table.tsx","src/src/components/Feedback.tsx","src/src/components/getToneFromValidation.ts","src/src/components/InternationalizedArrayInput.tsx","src/src/internationalizedArray.ts","src/src/index.tsx","src/index.tsx"],"sourcesContent":[null,null,null,null,null,null,null,"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"],"names":[],"version":3,"file":"index.d.ts.map","sourceRoot":"../../"}
1
+ {"mappings":";AAEA,gBAAuB;IACrB,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;CACd,CAAA;AAqBD,oBAA2B;IACzB,SAAS,EAAE,QAAQ,EAAE,CAAA;IACrB,UAAU,EAAE,CAAC,MAAM,GAAG,OAAO,eAAe,CAAC,EAAE,CAAA;CAChD,CAAA;AQnBD,OAAO,MAAM,6DAYX,CAAA","sources":["src/src/types.ts","src/src/components/createFieldName.ts","src/src/components/Table.tsx","src/src/components/Feedback.tsx","src/src/components/getToneFromValidation.ts","src/src/components/InternationalizedArrayInput.tsx","src/src/schema/array.ts","src/src/schema/object.ts","src/src/plugin.tsx","src/src/index.ts","src/index.ts"],"sourcesContent":[null,null,null,null,null,null,null,null,null,null,"export {internationalizedArray} from './plugin'\n"],"names":[],"version":3,"file":"index.d.ts.map","sourceRoot":"../../"}
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "sanity-plugin-internationalized-array",
3
- "version": "1.0.0",
4
- "description": "Store localised fields in an array to save on attributes",
3
+ "version": "1.1.0",
4
+ "description": "Store localized fields in an array to save on attributes",
5
5
  "author": "Simeon Griggs <simeon@sanity.io>",
6
6
  "license": "MIT",
7
- "source": "./src/index.tsx",
7
+ "source": "./src/index.ts",
8
8
  "main": "./lib/cjs/index.js",
9
9
  "module": "./lib/esm/index.js",
10
10
  "types": "./lib/types/index.d.ts",
@@ -40,15 +40,16 @@
40
40
  "@sanity/icons": "^1.3.1",
41
41
  "@sanity/incompatible-plugin": "^0.0.1-studio-v3.1",
42
42
  "@sanity/ui": "^0.37.12",
43
+ "sanity-plugin-utils": "^0.0.1",
43
44
  "styled-components": "^5.3.5"
44
45
  },
45
46
  "devDependencies": {
46
47
  "@parcel/packager-ts": "^2.6.2",
47
48
  "@parcel/transformer-typescript-types": "^2.6.2",
48
49
  "@sanity/plugin-kit": "^0.1.0-v3-studio.1",
50
+ "@types/styled-components": "^5.1.25",
49
51
  "@typescript-eslint/eslint-plugin": "^5.30.7",
50
52
  "@typescript-eslint/parser": "^5.30.7",
51
- "@types/styled-components": "^5.1.25",
52
53
  "eslint": "^8.20.0",
53
54
  "eslint-config-prettier": "^8.5.0",
54
55
  "eslint-config-sanity": "^6.0.0",
@@ -60,7 +61,7 @@
60
61
  "react": "^17.0.0 || ^18.0.0",
61
62
  "rimraf": "^3.0.2",
62
63
  "sanity": "2.29.5-purple-unicorn.856",
63
- "typescript": "^4.7.4"
64
+ "typescript": "4.7.4"
64
65
  },
65
66
  "peerDependencies": {
66
67
  "react": "^17.0.0 || ^18.0.0",
@@ -1,6 +1,5 @@
1
1
  import React, {useCallback, useMemo} from 'react'
2
2
  import {
3
- PatchEvent,
4
3
  ArrayOfObjectsInputProps,
5
4
  MemberItem,
6
5
  unset,
@@ -54,6 +53,7 @@ export default function InternationalizedArrayInput(props: InternationalizedArra
54
53
 
55
54
  // So what is the index in the current value array of the next language in the language array?
56
55
  const nextLanguageIndex = languagesInUse.findIndex((l) =>
56
+ // eslint-disable-next-line max-nested-callbacks
57
57
  remainingLanguages.find((r) => r.id === l._key)
58
58
  )
59
59
 
@@ -77,7 +77,7 @@ export default function InternationalizedArrayInput(props: InternationalizedArra
77
77
  )
78
78
 
79
79
  const handleUnsetByKey = useCallback(
80
- (_key) => {
80
+ (_key: string) => {
81
81
  onChange(unset([{_key}]))
82
82
  },
83
83
  [onChange]
@@ -124,7 +124,8 @@ export default function InternationalizedArrayInput(props: InternationalizedArra
124
124
  }, [value, languages])
125
125
 
126
126
  const languagesAreValid = useMemo(
127
- () => languages?.length && languages.every((item) => item.id && item.title),
127
+ () =>
128
+ !languages?.length || (languages?.length && languages.every((item) => item.id && item.title)),
128
129
  [languages]
129
130
  )
130
131
 
@@ -154,12 +155,13 @@ export default function InternationalizedArrayInput(props: InternationalizedArra
154
155
  </Box>
155
156
  </TableCell>
156
157
  <TableCell paddingRight={2} style={{width: `100%`}}>
158
+ {/* This renders the entire field default with title */}
157
159
  <MemberItem {...props} member={member} />
158
160
  </TableCell>
159
161
  <TableCell style={{verticalAlign: 'bottom'}}>
160
162
  <Flex align="center" justify="flex-end" gap={3}>
161
163
  {/* Possibly unncessary, validation shows up in <MemberItem /> */}
162
- {member.item.validation.length > 0 ? (
164
+ {member?.item?.validation?.length > 0 ? (
163
165
  <Box paddingLeft={2}>
164
166
  <FormFieldValidationStatus validation={member.item.validation} />
165
167
  </Box>
@@ -188,7 +190,7 @@ export default function InternationalizedArrayInput(props: InternationalizedArra
188
190
  />
189
191
  ) : null}
190
192
 
191
- {value && value.length < languages.length ? (
193
+ {languages?.length > 0 ? (
192
194
  <Stack space={2}>
193
195
  {/* No more than 5 columns */}
194
196
  <Grid columns={Math.min(languages.length, 5)} gap={2}>
@@ -0,0 +1,20 @@
1
+ export function camelCase(string: string) {
2
+ return string.replace(/-([a-z])/g, (g) => g[1].toUpperCase())
3
+ }
4
+
5
+ export function titleCase(string: string) {
6
+ return string
7
+ .split(` `)
8
+ .map((word) => word.charAt(0).toUpperCase() + word.slice(1))
9
+ .join(` `)
10
+ }
11
+
12
+ export function pascalCase(string: string) {
13
+ return titleCase(camelCase(string))
14
+ }
15
+
16
+ export function createFieldName(name: string, addValue = false): string {
17
+ return addValue
18
+ ? [`internationalizedArray`, pascalCase(name), `Value`].join(``)
19
+ : [`internationalizedArray`, pascalCase(name)].join(``)
20
+ }
package/src/index.ts ADDED
@@ -0,0 +1 @@
1
+ export {internationalizedArray} from './plugin'
package/src/plugin.tsx ADDED
@@ -0,0 +1,23 @@
1
+ import {createPlugin} from 'sanity'
2
+ import {PluginConfig} from './types'
3
+ import array from './schema/array'
4
+ import object from './schema/object'
5
+
6
+ const CONFIG_DEFAULT = {
7
+ languages: [],
8
+ fieldTypes: [],
9
+ }
10
+
11
+ export const internationalizedArray = createPlugin<PluginConfig>((config = CONFIG_DEFAULT) => {
12
+ const {languages, fieldTypes} = {...CONFIG_DEFAULT, ...config}
13
+
14
+ return {
15
+ name: 'sanity-plugin-internationalized-array',
16
+ schema: {
17
+ types: [
18
+ ...fieldTypes.map((type) => array({type, languages})),
19
+ ...fieldTypes.map((type) => object({type})),
20
+ ],
21
+ },
22
+ }
23
+ })
@@ -0,0 +1,69 @@
1
+ import {defineField, Rule, Schema} from 'sanity'
2
+
3
+ import {createFieldName} from '../components/createFieldName'
4
+ import InternationalizedArrayInput from '../components/InternationalizedArrayInput'
5
+ import {Language, Value} from '../types'
6
+
7
+ type ArrayFactoryConfig = {
8
+ languages: Language[]
9
+ type: string | Schema.FieldDefinition
10
+ }
11
+
12
+ export default (config: ArrayFactoryConfig): Schema.FieldDefinition<'array'> => {
13
+ const {languages, type} = config
14
+ const typeName = typeof type === `string` ? type : type.name
15
+ const arrayName = createFieldName(typeName)
16
+ const objectName = createFieldName(typeName, true)
17
+
18
+ return defineField({
19
+ name: arrayName,
20
+ title: 'Internationalized array',
21
+ type: 'array',
22
+ components: {input: InternationalizedArrayInput},
23
+ options: {languages},
24
+ of: [defineField({name: objectName, type: objectName})],
25
+ validation: (rule: Rule) =>
26
+ rule.max(languages?.length).custom<Value[]>((value, context) => {
27
+ const {languages: contextLanguages}: {languages: Language[]} = context?.type?.options ?? {}
28
+ const nonLanguageKeys = value?.length
29
+ ? value.filter((item) => !contextLanguages.find((language) => item._key === language.id))
30
+ : []
31
+ if (nonLanguageKeys.length) {
32
+ return {
33
+ message: `Array item keys must be valid languages registered to the field type`,
34
+ paths: nonLanguageKeys.map((item) => [{_key: item._key}]),
35
+ }
36
+ }
37
+
38
+ // Ensure there's no duplicate `language` fields
39
+ type KeyedValues = {
40
+ [key: string]: Value[]
41
+ }
42
+
43
+ const valuesByLanguage = value?.length
44
+ ? value
45
+ .filter((item) => Boolean(item?._key))
46
+ .reduce((acc, cur) => {
47
+ if (acc[cur._key]) {
48
+ return {...acc, [cur._key]: [...acc[cur._key], cur]}
49
+ }
50
+ return {
51
+ ...acc,
52
+ [cur._key]: [cur],
53
+ }
54
+ }, {} as KeyedValues)
55
+ : {}
56
+ const duplicateValues = Object.values(valuesByLanguage)
57
+ .filter((item) => item?.length > 1)
58
+ .flat()
59
+ if (duplicateValues.length) {
60
+ return {
61
+ message: 'There can only be one field per language',
62
+ paths: duplicateValues.map((item) => [{_key: item._key}]),
63
+ }
64
+ }
65
+
66
+ return true
67
+ }),
68
+ })
69
+ }
@@ -0,0 +1,29 @@
1
+ import {defineField, Schema} from 'sanity'
2
+
3
+ import {createFieldName} from '../components/createFieldName'
4
+
5
+ type ObjectFactoryConfig = {
6
+ type: string | Schema.FieldDefinition
7
+ }
8
+
9
+ export default (config: ObjectFactoryConfig): Schema.FieldDefinition<'object'> => {
10
+ const {type} = config
11
+ const typeName = typeof type === `string` ? type : type.name
12
+ const objectName = createFieldName(typeName, true)
13
+
14
+ return defineField({
15
+ name: objectName,
16
+ title: `Internationalized array ${type}`,
17
+ type: 'object',
18
+ fields: [
19
+ typeof type === `string`
20
+ ? // Define a basic field if all we have is the string name
21
+ defineField({
22
+ name: 'value',
23
+ type,
24
+ })
25
+ : // Pass in the configured options, but overwrite the name
26
+ {...type, name: 'value'},
27
+ ],
28
+ })
29
+ }
package/src/types.ts CHANGED
@@ -1,11 +1,11 @@
1
- import {Rule, ArraySchemaType} from 'sanity'
1
+ import {Rule, ArraySchemaType, Schema} from 'sanity'
2
2
 
3
3
  export type Language = {
4
4
  id: string
5
5
  title: string
6
6
  }
7
7
 
8
- export type AllowedType = 'string' | 'number' | 'boolean' | 'text'
8
+ export type AllowedType = 'string' | 'number' | 'boolean' | 'text' | 'reference'
9
9
 
10
10
  export type ArrayConfig = {
11
11
  name: string
@@ -16,6 +16,7 @@ export type ArrayConfig = {
16
16
  hidden?: boolean | (() => boolean)
17
17
  readOnly?: boolean | (() => boolean)
18
18
  validation?: Rule | Rule[]
19
+ field?: {[key: string]: any; options: {[key: string]: any}}
19
20
  }
20
21
 
21
22
  export type Value = {
@@ -25,6 +26,7 @@ export type Value = {
25
26
 
26
27
  export type PluginConfig = {
27
28
  languages: Language[]
29
+ fieldTypes: (string | Schema.FieldDefinition)[]
28
30
  }
29
31
 
30
32
  export type ArraySchemaWithLanguageOptions = ArraySchemaType & {
package/src/index.tsx DELETED
@@ -1,51 +0,0 @@
1
- export * from './internationalizedArray'
2
-
3
- /**
4
- * Because of the complexity of the field, there's no utility currently to using the plugin framework
5
- * We need to register:
6
- * - an array field which
7
- * - only has a single object field with
8
- * - a single inner field and
9
- * - an array of languages
10
- * ...this is easier with a helper function
11
- */
12
-
13
- // import React from 'react'
14
- // import {createPlugin} from 'sanity'
15
-
16
- // import InternationalizedArrayInput from './components/InternationalizedArrayInput'
17
- // import {PluginConfig} from './types'
18
-
19
- // const CONFIG_DEFAULT = {languages: []}
20
-
21
- // export const internationalizedArray = createPlugin<PluginConfig>((config = CONFIG_DEFAULT) => {
22
- // return {
23
- // name: 'sanity-plugin-internationalized-array',
24
- // form: {
25
- // renderInput: (inputProps: unknown, next: unknown) => {
26
- // if (
27
- // config.languages.length &&
28
- // inputProps?.schemaType?.jsonType === 'array' &&
29
- // inputProps?.schemaType?.options.i18n === true
30
- // ) {
31
- // if (inputProps.schemaType.of.length > 1) {
32
- // return <div>Cannot have more than one field type in the array</div>
33
- // }
34
-
35
- // if (inputProps.schemaType.of[0].jsonType !== 'object') {
36
- // return <div>Single Field in the Array must be an object</div>
37
- // }
38
-
39
- // if (inputProps.schemaType.of[0].fields[0].name !== 'value') {
40
- // return <div>Single Field in the Object must be named `value`</div>
41
- // }
42
-
43
- // console.log({inputProps})
44
- // return <InternationalizedArrayInput inputProps={inputProps} {...config} />
45
- // }
46
-
47
- // return null
48
- // },
49
- // },
50
- // }
51
- // })
@@ -1,111 +0,0 @@
1
- import {
2
- CustomValidatorResult,
3
- defineField,
4
- FieldDefinition,
5
- Rule,
6
- SchemaType,
7
- ValidationError,
8
- } from 'sanity'
9
-
10
- import InternationalizedArrayInput from './components/InternationalizedArrayInput'
11
- import {AllowedType, ArrayConfig, Language, Value} from './types'
12
-
13
- const CONFIG_DEFAULT = {name: `title`, type: `string` as AllowedType, languages: []}
14
-
15
- export function internationalizedArray(config: ArrayConfig = CONFIG_DEFAULT): FieldDefinition {
16
- const {name, type, languages} = config
17
-
18
- const configValidation = Array.isArray(config?.validation)
19
- ? config.validation
20
- : [config?.validation]
21
-
22
- return defineField({
23
- name,
24
- title: config?.title ?? undefined,
25
- group: config?.group ?? undefined,
26
- hidden: config?.hidden ?? undefined,
27
- readOnly: config?.readOnly ?? undefined,
28
- type: 'array',
29
- components: {input: InternationalizedArrayInput},
30
- options: {languages},
31
- of: [
32
- {
33
- type: 'object',
34
- fields: [
35
- {
36
- name: 'value',
37
- type,
38
- },
39
- ],
40
- preview: {
41
- select: {title: 'value', key: '_key'},
42
- prepare(select) {
43
- const {title, key} = select as Record<string, string>
44
-
45
- return {
46
- title,
47
- subtitle: key.toUpperCase(),
48
- }
49
- },
50
- },
51
- },
52
- ],
53
- // @ts-ignore
54
- validation: (rule: Rule) => {
55
- const rules = [] as Rule[]
56
-
57
- rules.push(
58
- rule.custom<Value[]>((value, context) => {
59
- const {languages: contextLanguages}: {languages: Language[]} =
60
- context?.type?.options ?? {}
61
- const nonLanguageKeys = value?.length
62
- ? value.filter(
63
- (item) => !contextLanguages.find((language) => item._key === language.id)
64
- )
65
- : []
66
- if (nonLanguageKeys.length) {
67
- return {
68
- message: `Array item keys must be valid languages registered to the field type`,
69
- paths: nonLanguageKeys.map((item) => [{_key: item._key}]),
70
- }
71
- }
72
-
73
- // Ensure there's no duplicate `language` fields
74
- type KeyedValues = {
75
- [key: string]: Value[]
76
- }
77
-
78
- const valuesByLanguage = value?.length
79
- ? value
80
- .filter((item) => Boolean(item?._key))
81
- .reduce((acc, cur) => {
82
- if (acc[cur._key]) {
83
- return {...acc, [cur._key]: [...acc[cur._key], cur]}
84
- }
85
- return {
86
- ...acc,
87
- [cur._key]: [cur],
88
- }
89
- }, {} as KeyedValues)
90
- : {}
91
- const duplicateValues = Object.values(valuesByLanguage)
92
- .filter((item) => item?.length > 1)
93
- .flat()
94
- if (duplicateValues.length) {
95
- return {
96
- message: 'There can only be one field per language',
97
- paths: duplicateValues.map((item) => [{_key: item._key}]),
98
- }
99
- }
100
- return true
101
- })
102
- )
103
-
104
- if (languages?.length) {
105
- rules.push(rule.max(languages.length))
106
- }
107
-
108
- return [...rules, ...configValidation].filter(Boolean)
109
- },
110
- })
111
- }