sanity-plugin-internationalized-array 1.1.2 → 1.3.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.
- package/README.md +34 -9
- package/lib/index.esm.js +2 -0
- package/lib/index.esm.js.map +1 -0
- package/lib/index.js +2 -0
- package/lib/index.js.map +1 -0
- package/lib/src/index.d.ts +16 -0
- package/package.json +56 -42
- package/src/components/{InternationalizedArrayInput.tsx → InternationalizedArray.tsx} +41 -125
- package/src/components/InternationalizedInput.tsx +108 -0
- package/src/components/getToneFromValidation.ts +5 -5
- package/src/plugin.tsx +2 -2
- package/src/schema/array.ts +16 -7
- package/src/schema/object.ts +18 -3
- package/src/types.ts +2 -2
- package/lib/cjs/index.js +0 -542
- package/lib/cjs/index.js.map +0 -1
- package/lib/esm/index.js +0 -535
- package/lib/esm/index.js.map +0 -1
- package/lib/types/index.d.ts +0 -12
- package/lib/types/index.d.ts.map +0 -1
package/README.md
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
|
|
1
|
+
> This is the **Sanity Studio v3 version** of sanity-plugin-internationalized-array.
|
|
2
|
+
>
|
|
3
|
+
> For the v2 version, please refer to the [v2-branch](https://github.com/SimeonGriggs/sanity-plugin-internationalized-array/tree/studio-v2).
|
|
2
4
|
|
|
3
|
-
|
|
5
|
+
# sanity-plugin-internationalized-array
|
|
4
6
|
|
|
5
7
|
A helper function that renders a custom input component for writing localized fields of content into an array.
|
|
6
8
|
|
|
@@ -9,13 +11,13 @@ A helper function that renders a custom input component for writing localized fi
|
|
|
9
11
|
## Installation
|
|
10
12
|
|
|
11
13
|
```
|
|
12
|
-
npm install --save sanity-plugin-internationalized-array
|
|
14
|
+
npm install --save sanity-plugin-internationalized-array
|
|
13
15
|
```
|
|
14
16
|
|
|
15
17
|
or
|
|
16
18
|
|
|
17
19
|
```
|
|
18
|
-
yarn add sanity-plugin-internationalized-array
|
|
20
|
+
yarn add sanity-plugin-internationalized-array
|
|
19
21
|
```
|
|
20
22
|
|
|
21
23
|
## Usage (simple)
|
|
@@ -23,10 +25,10 @@ yarn add sanity-plugin-internationalized-array-v3@studio-v3
|
|
|
23
25
|
Add it as a plugin in sanity.config.ts (or .js):
|
|
24
26
|
|
|
25
27
|
```ts
|
|
26
|
-
import {
|
|
28
|
+
import {defineConfig} from 'sanity'
|
|
27
29
|
import {internationalizedArray} from 'sanity-plugin-internationalized-array'
|
|
28
30
|
|
|
29
|
-
export const
|
|
31
|
+
export const defineConfig({
|
|
30
32
|
// ...
|
|
31
33
|
plugins: [
|
|
32
34
|
internationalizedArray({
|
|
@@ -45,7 +47,7 @@ This will register two new fields to the schema, based on the settings passed in
|
|
|
45
47
|
- `internationalizedArrayString` an array field of:
|
|
46
48
|
- `internationalizedArrayStringValue` an object field, with a single `string` field inside called `value`
|
|
47
49
|
|
|
48
|
-
You can pass in more registered schema
|
|
50
|
+
You can pass in more registered schema-type names to generate more internationalized arrays. Use them in your schema like this:
|
|
49
51
|
|
|
50
52
|
```ts
|
|
51
53
|
defineField({
|
|
@@ -59,10 +61,10 @@ defineField({
|
|
|
59
61
|
For more control over the `value` field, you can pass a schema definition into the `fieldTypes` array.
|
|
60
62
|
|
|
61
63
|
```ts
|
|
62
|
-
import {
|
|
64
|
+
import {defineConfig} from 'sanity'
|
|
63
65
|
import {internationalizedArray} from 'sanity-plugin-internationalized-array'
|
|
64
66
|
|
|
65
|
-
export const
|
|
67
|
+
export const defineConfig({
|
|
66
68
|
// ...
|
|
67
69
|
plugins: [
|
|
68
70
|
internationalizedArray({
|
|
@@ -159,3 +161,26 @@ By using this plugin you can safely extend the number of languages without addin
|
|
|
159
161
|
|
|
160
162
|
MIT © Simeon Griggs
|
|
161
163
|
See LICENSE
|
|
164
|
+
|
|
165
|
+
## License
|
|
166
|
+
|
|
167
|
+
MIT-licensed. See LICENSE.
|
|
168
|
+
|
|
169
|
+
## Develop & test
|
|
170
|
+
|
|
171
|
+
This plugin uses [@sanity/plugin-kit](https://github.com/sanity-io/plugin-kit)
|
|
172
|
+
with default configuration for build & watch scripts.
|
|
173
|
+
|
|
174
|
+
See [Testing a plugin in Sanity Studio](https://github.com/sanity-io/plugin-kit#testing-a-plugin-in-sanity-studio)
|
|
175
|
+
on how to run this plugin with hotreload in the studio.
|
|
176
|
+
|
|
177
|
+
### Release new version
|
|
178
|
+
|
|
179
|
+
Run ["CI & Release" workflow](https://github.com/SimeonGriggs/sanity-plugin-internationalized-array/actions/workflows/main.yml).
|
|
180
|
+
Make sure to select the main branch and check "Release new version".
|
|
181
|
+
|
|
182
|
+
Semantic release will only release on configured branches, so it is safe to run release on any branch.
|
|
183
|
+
|
|
184
|
+
## License
|
|
185
|
+
|
|
186
|
+
[MIT](LICENSE) © Simeon Griggs
|
package/lib/index.esm.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function e(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);n&&(i=i.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,i)}return t}function n(n){for(var i=1;i<arguments.length;i++){var l=null!=arguments[i]?arguments[i]:{};i%2?e(Object(l),!0).forEach((function(e){t(n,e,l[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(n,Object.getOwnPropertyDescriptors(l)):e(Object(l)).forEach((function(e){Object.defineProperty(n,e,Object.getOwnPropertyDescriptor(l,e))}))}return n}function t(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}import{insert as i,setIfMissing as l,set as r,ArrayOfObjectsItem as o,defineField as a,useFormValue as d,unset as u,definePlugin as c}from"sanity";import{jsx as s,jsxs as p,Fragment as g}from"react/jsx-runtime";import{useMemo as y,useCallback as h}from"react";import{Card as f,Stack as m,Text as v,Code as k,useToast as b,Button as _,Grid as O,Flex as j,Box as x,Label as P,MenuButton as w,Menu as z,MenuItem as C}from"@sanity/ui";import{RestoreIcon as I,AddIcon as A,RemoveIcon as S}from"@sanity/icons";function T(e){return function(e){return e.split(" ").map((e=>e.charAt(0).toUpperCase()+e.slice(1))).join(" ")}(function(e){return e.replace(/-([a-z])/g,(e=>e[1].toUpperCase()))}(e))}function B(e){let n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return n?["internationalizedArray",T(e),"Value"].join(""):["internationalizedArray",T(e)].join("")}const D={languages:[{id:"en",title:"English"},{id:"no",title:"Norsk"}]};function E(){return s(f,{tone:"caution",border:!0,radius:2,padding:3,children:p(m,{space:4,children:[p(v,{children:["An array of language objects must be passed into the ",s("code",{children:"internationalizedArray"})," ","helper function, each with an ",s("code",{children:"id"})," and ",s("code",{children:"title"})," field. Example:"]}),s(f,{padding:2,border:!0,radius:2,children:s(k,{size:1,language:"javascript",children:JSON.stringify(D,null,2)})})]})})}function U(e){const{members:t,value:a,schemaType:d,onChange:u}=e,c="boolean"==typeof d.readOnly&&d.readOnly,{options:f}=d,v=b(),k=y((()=>{var e;return null!=(e=null==f?void 0:f.languages)?e:[]}),[f]),j=h((e=>{const t={_type:"".concat(d.name,"Value")},r=e?[n(n({},t),{},{_key:e})]:k.filter((e=>!(null==a?void 0:a.length)||!a.find((n=>n._key===e.id)))).map((e=>n(n({},t),{},{_key:e.id}))),o=(null==a?void 0:a.length)?a.map((e=>e)):[],c=r.map((e=>{const n=k.findIndex((n=>e._key===n.id)),t=k.slice(n+1),l=o.findIndex((e=>t.find((n=>n.id===e._key))));return l<0?o.push(e):o.splice(l,0,e),i([e],l<0?"after":"before",[l])}));u([l([]),...c])}),[k,u,a]),x=h((()=>{if(!(null==a?void 0:a.length))return;const e=a.reduce(((e,n)=>{const t=k.findIndex((e=>e.id===(null==n?void 0:n._key)));return t>-1&&(e[t]=n),e}),[]).filter(Boolean);(null==a?void 0:a.length)!==e.length&&v.push({title:"There was an error reordering languages",status:"warning"}),u(r(e))}),[v,k,u,a]),P=y((()=>null==a?void 0:a.every((e=>k.find((n=>(null==n?void 0:n.id)===(null==e?void 0:e._key)))))),[a,k]),w=k.filter((e=>null==a?void 0:a.find((n=>n._key===e.id)))),z=y((()=>(null==a?void 0:a.length)?a.map(((e,n)=>n===w.findIndex((n=>n.id===e._key))?null:e)).filter(Boolean):[]),[a,w]);return y((()=>!(null==k?void 0:k.length)||(null==k?void 0:k.length)&&k.every((e=>e.id&&e.title))),[k])?p(m,{space:2,children:[(null==t?void 0:t.length)>0?s(g,{children:t.map((n=>"item"===n.kind?s(o,{member:n,renderItem:e.renderItem,renderField:e.renderField,renderInput:e.renderInput,renderPreview:e.renderPreview},n.key):null))}):null,z.length>0&&P?s(_,{tone:"caution",icon:I,onClick:()=>x(),text:"Restore order of languages"}):null,(null==k?void 0:k.length)>0&&w.length<k.length?p(m,{space:2,children:[s(O,{columns:Math.min(k.length,5),gap:2,children:k.map((e=>s(_,{tone:"primary",mode:"ghost",fontSize:1,disabled:c||Boolean(null==a?void 0:a.find((n=>n._key===e.id))),text:e.id.toUpperCase(),icon:A,onClick:()=>j(e.id)},e.id)))}),s(_,{tone:"primary",mode:"ghost",disabled:c||a&&(null==a?void 0:a.length)>=(null==k?void 0:k.length),icon:A,text:(null==a?void 0:a.length)?"Add missing ".concat(k.length-a.length==1?"language":"languages"):"Add all languages",onClick:()=>j()})]}):null]}):s(E,{})}var R=e=>{const{languages:t,type:i}=e,l="string"==typeof i?i:i.name,r=B(l),o=B(l,!0);return a({name:r,title:"Internationalized array",type:"array",components:{input:U},options:{languages:t},of:[a({name:o,type:o})],validation:e=>e.max(null==t?void 0:t.length).custom(((e,t)=>{var i,l;const{languages:r}=null!=(l=null==(i=null==t?void 0:t.type)?void 0:i.options)?l:{},o=(null==e?void 0:e.length)?e.filter((e=>!r.find((n=>e._key===n.id)))):[];if(o.length)return{message:"Array item keys must be valid languages registered to the field type",paths:o.map((e=>[{_key:e._key}]))};const a=(null==e?void 0:e.length)?e.filter((e=>Boolean(null==e?void 0:e._key))).reduce(((e,t)=>e[t._key]?n(n({},e),{},{[t._key]:[...e[t._key],t]}):n(n({},e),{},{[t._key]:[t]})),{}):{},d=Object.values(a).filter((e=>(null==e?void 0:e.length)>1)).flat();return!d.length||{message:"There can only be one field per language",paths:d.map((e=>[{_key:e._key}]))}}))})};function F(e){if(!(null==e?void 0:e.length))return;const n=e.map((e=>e.level));return n.includes("error")?"critical":n.includes("warning")?"caution":void 0}function N(e){var t,i;const l=d(e.path.slice(0,-1)),o=n(n({},e.inputProps),{},{members:e.inputProps.members.filter((e=>"field"===e.kind&&"value"===e.name)),value:e.value}),{validation:a,value:c,onChange:g,readOnly:m}=o,v=y((()=>{var n,t,i;return null!=(i=null==(t=null==(n=null==e?void 0:e.parentSchemaType)?void 0:n.options)?void 0:t.languages)?i:[]}),[null==(i=null==(t=null==e?void 0:e.parentSchemaType)?void 0:t.options)?void 0:i.languages]),k=y((()=>{var e;return null!=(e=null==l?void 0:l.map((e=>e._key)))?e:[]}),[l]),b=v.find((e=>e.id===c._key)),O=h((e=>{c&&v.find((n=>n.id===e))&&g([r(e,["_key"])])}),[g,c,v]),I=h((()=>{g(u())}),[g]);return s(f,{tone:F(a),children:p(j,{align:"flex-end",gap:1,children:[s(f,{tone:"inherit",children:s(x,{paddingY:3,paddingRight:2,children:b?s(P,{muted:!0,size:1,children:c._key}):s(w,{button:s(_,{fontSize:1,text:'Change "'.concat(c._key,'"')}),id:"".concat(c._key,"-change-key"),menu:s(z,{children:v.map((e=>s(C,{disabled:k.includes(e.id),fontSize:1,text:e.id.toLocaleUpperCase(),onClick:()=>O(e.id)},e.id)))}),placement:"right",popover:{portal:!0}})})}),s(f,{paddingRight:2,flex:1,tone:"inherit",children:e.inputProps.renderInput(e.inputProps)}),s(f,{tone:"inherit",children:s(_,{mode:"ghost",icon:S,tone:"critical",disabled:m,onClick:I})})]})})}var V=e=>{const{type:t}=e,i=B("string"==typeof t?t:t.name,!0);return a({name:i,title:"Internationalized array ".concat(t),type:"object",components:{item:N},fields:["string"==typeof t?a({name:"value",type:t}):n(n({},t),{},{name:"value"})],preview:{select:{title:"value",subtitle:"_key"}}})};const J={languages:[],fieldTypes:[]},L=c((function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:J;const{languages:t,fieldTypes:i}=n(n({},J),e);return{name:"sanity-plugin-internationalized-array",schema:{types:[...i.map((e=>R({type:e,languages:t}))),...i.map((e=>V({type:e})))]}}}));export{L as internationalizedArray};
|
|
2
|
+
//# sourceMappingURL=index.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.esm.js","sources":["../src/components/createFieldName.ts","../src/components/Feedback.tsx","../src/components/InternationalizedArray.tsx","../src/schema/array.ts","../src/components/getToneFromValidation.ts","../src/components/InternationalizedInput.tsx","../src/schema/object.ts","../src/plugin.tsx"],"sourcesContent":["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 {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 React, {useCallback, useMemo} from 'react'\nimport {\n insert,\n set,\n setIfMissing,\n ArrayOfObjectsItemMember,\n ArrayOfObjectsItem,\n ArrayOfObjectsInputProps,\n} from 'sanity'\nimport {Button, Grid, Stack, useToast} from '@sanity/ui'\nimport {AddIcon, RestoreIcon} from '@sanity/icons'\n\nimport {Language, Value, ArraySchemaWithLanguageOptions} from '../types'\nimport Feedback from './Feedback'\n\nexport type InternationalizedArrayProps = ArrayOfObjectsInputProps<\n Value,\n ArraySchemaWithLanguageOptions\n>\n\nexport default function InternationalizedArray(props: InternationalizedArrayProps) {\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 const itemBase = {_type: `${schemaType.name}Value`}\n\n // Create new items\n const newItems = languageId\n ? // Just one for this language\n [{...itemBase, _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) => ({...itemBase, _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 // 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 languagesInUse = languages.filter((l) => value?.find((v) => v._key === l.id))\n const languagesOutOfOrder = useMemo(() => {\n if (!value?.length) {\n return []\n }\n\n return value\n .map((v, vIndex) => (vIndex === languagesInUse.findIndex((l) => l.id === v._key) ? null : v))\n .filter(Boolean)\n }, [value, languagesInUse])\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 <>\n {/* TODO: Resolve type for ArrayOfObjectsItemMember */}\n {/* @ts-ignore */}\n {members.map((member: ArrayOfObjectsItemMember) => {\n if (member.kind === 'item') {\n return (\n <ArrayOfObjectsItem\n key={member.key}\n member={member}\n renderItem={props.renderItem}\n renderField={props.renderField}\n renderInput={props.renderInput}\n renderPreview={props.renderPreview}\n />\n )\n }\n\n return null\n })}\n </>\n ) : null}\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 {/* Show buttons if languages are configured */}\n {/* Hide them once languages have values */}\n {languages?.length > 0 && languagesInUse.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={\n value?.length\n ? `Add missing ${languages.length - value.length === 1 ? `language` : `languages`}`\n : `Add all languages`\n }\n onClick={() => handleAddLanguage()}\n />\n </Stack>\n ) : null}\n </Stack>\n )\n}\n","import {defineField, FieldDefinition, Rule} from 'sanity'\n\nimport {createFieldName} from '../components/createFieldName'\nimport InternationalizedArray from '../components/InternationalizedArray'\nimport {Language, Value} from '../types'\n\ntype ArrayFactoryConfig = {\n languages: Language[]\n type: string | FieldDefinition\n}\n\nexport default (config: ArrayFactoryConfig): 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 // TODO: Resolve this typing issue with the outer component\n // @ts-ignore\n components: {\n input: InternationalizedArray,\n },\n options: {languages},\n // TODO: Resolve this typing issue with the inner object\n // @ts-ignore\n of: [\n defineField({\n name: objectName,\n type: objectName,\n }),\n ],\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","import {CardTone} from '@sanity/ui'\nimport {FormNodeValidation} from 'sanity'\n\nexport function getToneFromValidation(validations: FormNodeValidation[]): CardTone | undefined {\n if (!validations?.length) {\n return undefined\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 undefined\n}\n","import {ObjectItemProps, useFormValue} from 'sanity'\nimport React, {useCallback, useMemo} from 'react'\nimport {unset, set} from 'sanity'\nimport {Box, Button, Flex, Label, MenuButton, Menu, MenuItem, Card} from '@sanity/ui'\nimport {RemoveIcon} from '@sanity/icons'\n\nimport {Language} from '../types'\nimport {getToneFromValidation} from './getToneFromValidation'\n\ntype InternationalizedValue = {\n _type: string\n _key: string\n value: string\n}\n\nexport default function InternationalizedInput(props: ObjectItemProps<InternationalizedValue>) {\n const parentValue = useFormValue(props.path.slice(0, -1)) as InternationalizedValue[]\n\n const inlineProps = {\n ...props.inputProps,\n // This is the magic that makes inline editing work\n members: props.inputProps.members.filter((m) => m.kind === 'field' && m.name === 'value'),\n // This just overrides the type\n // TODO: Remove this as it shouldn't be necessary\n value: props.value as InternationalizedValue,\n }\n\n const {validation, value, onChange, readOnly} = inlineProps\n\n // The parent array contains the languages from the plugin config\n // TODO: fix TS support for overloading options\n const languages: Language[] = useMemo(\n // @ts-ignore\n () => props?.parentSchemaType?.options?.languages ?? [],\n // @ts-ignore\n [props?.parentSchemaType?.options?.languages]\n )\n const languageKeysInUse = useMemo(() => parentValue?.map((v) => v._key) ?? [], [parentValue])\n const keyIsValid = languages.find((l) => l.id === value._key)\n\n // Changes the key of this item, ideally to a valid language\n const handleKeyChange = useCallback(\n (languageId: string) => {\n if (!value || !languages.find((l) => l.id === languageId)) {\n return\n }\n\n onChange([set(languageId, ['_key'])])\n },\n [onChange, value, languages]\n )\n\n // Removes this item from the array\n const handleUnset = useCallback(() => {\n onChange(unset())\n }, [onChange])\n\n return (\n <Card tone={getToneFromValidation(validation)}>\n <Flex align=\"flex-end\" gap={1}>\n <Card tone=\"inherit\">\n <Box paddingY={3} paddingRight={2}>\n {keyIsValid ? (\n <Label muted size={1}>\n {value._key}\n </Label>\n ) : (\n <MenuButton\n button={<Button fontSize={1} text={`Change \"${value._key}\"`} />}\n id={`${value._key}-change-key`}\n menu={\n <Menu>\n {languages.map((language) => (\n <MenuItem\n // TODO: Prevent changing to a key that already exists in the array\n disabled={languageKeysInUse.includes(language.id)}\n fontSize={1}\n key={language.id}\n text={language.id.toLocaleUpperCase()}\n onClick={() => handleKeyChange(language.id)}\n />\n ))}\n </Menu>\n }\n placement=\"right\"\n popover={{portal: true}}\n />\n )}\n </Box>\n </Card>\n\n <Card paddingRight={2} flex={1} tone=\"inherit\">\n {props.inputProps.renderInput(props.inputProps)}\n </Card>\n\n <Card tone=\"inherit\">\n <Button\n mode=\"ghost\"\n icon={RemoveIcon}\n tone=\"critical\"\n disabled={readOnly}\n onClick={handleUnset}\n />\n </Card>\n </Flex>\n </Card>\n )\n}\n","import {defineField, FieldDefinition} from 'sanity'\n\nimport {createFieldName} from '../components/createFieldName'\nimport InternationalizedInput from '../components/InternationalizedInput'\n\ntype ObjectFactoryConfig = {\n type: string | FieldDefinition\n}\n\nexport default (config: ObjectFactoryConfig): 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: Resolve this typing issue with the return type\n // @ts-ignore\n components: {\n // item: InternationalizedInputWrapper,\n // TODO: Resolve this typing issue with the outer component\n // @ts-ignore\n item: InternationalizedInput,\n },\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 preview: {\n select: {\n title: 'value',\n subtitle: '_key',\n },\n },\n })\n}\n","import {definePlugin} 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 = definePlugin<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"],"names":["pascalCase","string","split","map","word","charAt","toUpperCase","slice","join","titleCase","replace","g","camelCase","createFieldName","name","addValue","schemaExample","languages","id","title","Feedback","jsx","Card","tone","border","radius","padding","children","jsxs","Stack","space","Text","Code","size","language","JSON","stringify","InternationalizedArray","props","members","value","schemaType","onChange","readOnly","options","toast","useToast","useMemo","_a","handleAddLanguage","useCallback","languageId","itemBase","_type","concat","newItems","_key","filter","length","find","v","languagesInUse","insertions","item","languageIndex","findIndex","l","remainingLanguages","nextLanguageIndex","r","push","splice","insert","setIfMissing","handleRestoreOrder","updatedValue","reduce","acc","newIndex","Boolean","status","set","allKeysAreLanguages","every","languagesOutOfOrder","vIndex","Fragment","member","kind","ArrayOfObjectsItem","renderItem","renderField","renderInput","renderPreview","key","Button","icon","RestoreIcon","onClick","text","Grid","columns","Math","min","gap","mode","fontSize","disabled","AddIcon","array","config","type","typeName","arrayName","objectName","defineField","components","input","of","validation","rule","max","custom","context","_b","contextLanguages","nonLanguageKeys","message","paths","valuesByLanguage","cur","_objectSpread","duplicateValues","Object","values","flat","getToneFromValidation","validations","validationLevels","level","includes","InternationalizedInput","parentValue","useFormValue","path","inlineProps","inputProps","m","_c","parentSchemaType","languageKeysInUse","keyIsValid","handleKeyChange","handleUnset","unset","Flex","align","Box","paddingY","paddingRight","Label","muted","MenuButton","button","menu","Menu","MenuItem","toLocaleUpperCase","placement","popover","portal","flex","RemoveIcon","object","fields","preview","select","subtitle","CONFIG_DEFAULT","fieldTypes","internationalizedArray","definePlugin","schema","types"],"mappings":"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"}
|
package/lib/index.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";function e(e,n){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);n&&(i=i.filter((function(n){return Object.getOwnPropertyDescriptor(e,n).enumerable}))),t.push.apply(t,i)}return t}function n(n){for(var i=1;i<arguments.length;i++){var l=null!=arguments[i]?arguments[i]:{};i%2?e(Object(l),!0).forEach((function(e){t(n,e,l[e])})):Object.getOwnPropertyDescriptors?Object.defineProperties(n,Object.getOwnPropertyDescriptors(l)):e(Object(l)).forEach((function(e){Object.defineProperty(n,e,Object.getOwnPropertyDescriptor(l,e))}))}return n}function t(e,n,t){return n in e?Object.defineProperty(e,n,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[n]=t,e}Object.defineProperty(exports,"__esModule",{value:!0});var i=require("sanity"),l=require("react/jsx-runtime"),r=require("react"),a=require("@sanity/ui"),o=require("@sanity/icons");function d(e){return function(e){return e.split(" ").map((e=>e.charAt(0).toUpperCase()+e.slice(1))).join(" ")}(function(e){return e.replace(/-([a-z])/g,(e=>e[1].toUpperCase()))}(e))}function s(e){let n=arguments.length>1&&void 0!==arguments[1]&&arguments[1];return n?["internationalizedArray",d(e),"Value"].join(""):["internationalizedArray",d(e)].join("")}const u={languages:[{id:"en",title:"English"},{id:"no",title:"Norsk"}]};function c(){return l.jsx(a.Card,{tone:"caution",border:!0,radius:2,padding:3,children:l.jsxs(a.Stack,{space:4,children:[l.jsxs(a.Text,{children:["An array of language objects must be passed into the ",l.jsx("code",{children:"internationalizedArray"})," ","helper function, each with an ",l.jsx("code",{children:"id"})," and ",l.jsx("code",{children:"title"})," field. Example:"]}),l.jsx(a.Card,{padding:2,border:!0,radius:2,children:l.jsx(a.Code,{size:1,language:"javascript",children:JSON.stringify(u,null,2)})})]})})}function p(e){const{members:t,value:d,schemaType:s,onChange:u}=e,p="boolean"==typeof s.readOnly&&s.readOnly,{options:g}=s,y=a.useToast(),h=r.useMemo((()=>{var e;return null!=(e=null==g?void 0:g.languages)?e:[]}),[g]),f=r.useCallback((e=>{const t={_type:"".concat(s.name,"Value")},l=e?[n(n({},t),{},{_key:e})]:h.filter((e=>!(null==d?void 0:d.length)||!d.find((n=>n._key===e.id)))).map((e=>n(n({},t),{},{_key:e.id}))),r=(null==d?void 0:d.length)?d.map((e=>e)):[],a=l.map((e=>{const n=h.findIndex((n=>e._key===n.id)),t=h.slice(n+1),l=r.findIndex((e=>t.find((n=>n.id===e._key))));return l<0?r.push(e):r.splice(l,0,e),l<0?i.insert([e],"after",[l]):i.insert([e],"before",[l])}));u([i.setIfMissing([]),...a])}),[h,u,d]),m=r.useCallback((()=>{if(!(null==d?void 0:d.length))return;const e=d.reduce(((e,n)=>{const t=h.findIndex((e=>e.id===(null==n?void 0:n._key)));return t>-1&&(e[t]=n),e}),[]).filter(Boolean);(null==d?void 0:d.length)!==e.length&&y.push({title:"There was an error reordering languages",status:"warning"}),u(i.set(e))}),[y,h,u,d]),v=r.useMemo((()=>null==d?void 0:d.every((e=>h.find((n=>(null==n?void 0:n.id)===(null==e?void 0:e._key)))))),[d,h]),j=h.filter((e=>null==d?void 0:d.find((n=>n._key===e.id)))),x=r.useMemo((()=>(null==d?void 0:d.length)?d.map(((e,n)=>n===j.findIndex((n=>n.id===e._key))?null:e)).filter(Boolean):[]),[d,j]);return r.useMemo((()=>!(null==h?void 0:h.length)||(null==h?void 0:h.length)&&h.every((e=>e.id&&e.title))),[h])?l.jsxs(a.Stack,{space:2,children:[(null==t?void 0:t.length)>0?l.jsx(l.Fragment,{children:t.map((n=>"item"===n.kind?l.jsx(i.ArrayOfObjectsItem,{member:n,renderItem:e.renderItem,renderField:e.renderField,renderInput:e.renderInput,renderPreview:e.renderPreview},n.key):null))}):null,x.length>0&&v?l.jsx(a.Button,{tone:"caution",icon:o.RestoreIcon,onClick:()=>m(),text:"Restore order of languages"}):null,(null==h?void 0:h.length)>0&&j.length<h.length?l.jsxs(a.Stack,{space:2,children:[l.jsx(a.Grid,{columns:Math.min(h.length,5),gap:2,children:h.map((e=>l.jsx(a.Button,{tone:"primary",mode:"ghost",fontSize:1,disabled:p||Boolean(null==d?void 0:d.find((n=>n._key===e.id))),text:e.id.toUpperCase(),icon:o.AddIcon,onClick:()=>f(e.id)},e.id)))}),l.jsx(a.Button,{tone:"primary",mode:"ghost",disabled:p||d&&(null==d?void 0:d.length)>=(null==h?void 0:h.length),icon:o.AddIcon,text:(null==d?void 0:d.length)?"Add missing ".concat(h.length-d.length==1?"language":"languages"):"Add all languages",onClick:()=>f()})]}):null]}):l.jsx(c,{})}var g=e=>{const{languages:t,type:l}=e,r="string"==typeof l?l:l.name,a=s(r),o=s(r,!0);return i.defineField({name:a,title:"Internationalized array",type:"array",components:{input:p},options:{languages:t},of:[i.defineField({name:o,type:o})],validation:e=>e.max(null==t?void 0:t.length).custom(((e,t)=>{var i,l;const{languages:r}=null!=(l=null==(i=null==t?void 0:t.type)?void 0:i.options)?l:{},a=(null==e?void 0:e.length)?e.filter((e=>!r.find((n=>e._key===n.id)))):[];if(a.length)return{message:"Array item keys must be valid languages registered to the field type",paths:a.map((e=>[{_key:e._key}]))};const o=(null==e?void 0:e.length)?e.filter((e=>Boolean(null==e?void 0:e._key))).reduce(((e,t)=>e[t._key]?n(n({},e),{},{[t._key]:[...e[t._key],t]}):n(n({},e),{},{[t._key]:[t]})),{}):{},d=Object.values(o).filter((e=>(null==e?void 0:e.length)>1)).flat();return!d.length||{message:"There can only be one field per language",paths:d.map((e=>[{_key:e._key}]))}}))})};function y(e){if(!(null==e?void 0:e.length))return;const n=e.map((e=>e.level));return n.includes("error")?"critical":n.includes("warning")?"caution":void 0}function h(e){var t,d;const s=i.useFormValue(e.path.slice(0,-1)),u=n(n({},e.inputProps),{},{members:e.inputProps.members.filter((e=>"field"===e.kind&&"value"===e.name)),value:e.value}),{validation:c,value:p,onChange:g,readOnly:h}=u,f=r.useMemo((()=>{var n,t,i;return null!=(i=null==(t=null==(n=null==e?void 0:e.parentSchemaType)?void 0:n.options)?void 0:t.languages)?i:[]}),[null==(d=null==(t=null==e?void 0:e.parentSchemaType)?void 0:t.options)?void 0:d.languages]),m=r.useMemo((()=>{var e;return null!=(e=null==s?void 0:s.map((e=>e._key)))?e:[]}),[s]),v=f.find((e=>e.id===p._key)),j=r.useCallback((e=>{p&&f.find((n=>n.id===e))&&g([i.set(e,["_key"])])}),[g,p,f]),x=r.useCallback((()=>{g(i.unset())}),[g]);return l.jsx(a.Card,{tone:y(c),children:l.jsxs(a.Flex,{align:"flex-end",gap:1,children:[l.jsx(a.Card,{tone:"inherit",children:l.jsx(a.Box,{paddingY:3,paddingRight:2,children:v?l.jsx(a.Label,{muted:!0,size:1,children:p._key}):l.jsx(a.MenuButton,{button:l.jsx(a.Button,{fontSize:1,text:'Change "'.concat(p._key,'"')}),id:"".concat(p._key,"-change-key"),menu:l.jsx(a.Menu,{children:f.map((e=>l.jsx(a.MenuItem,{disabled:m.includes(e.id),fontSize:1,text:e.id.toLocaleUpperCase(),onClick:()=>j(e.id)},e.id)))}),placement:"right",popover:{portal:!0}})})}),l.jsx(a.Card,{paddingRight:2,flex:1,tone:"inherit",children:e.inputProps.renderInput(e.inputProps)}),l.jsx(a.Card,{tone:"inherit",children:l.jsx(a.Button,{mode:"ghost",icon:o.RemoveIcon,tone:"critical",disabled:h,onClick:x})})]})})}var f=e=>{const{type:t}=e,l=s("string"==typeof t?t:t.name,!0);return i.defineField({name:l,title:"Internationalized array ".concat(t),type:"object",components:{item:h},fields:["string"==typeof t?i.defineField({name:"value",type:t}):n(n({},t),{},{name:"value"})],preview:{select:{title:"value",subtitle:"_key"}}})};const m={languages:[],fieldTypes:[]},v=i.definePlugin((function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:m;const{languages:t,fieldTypes:i}=n(n({},m),e);return{name:"sanity-plugin-internationalized-array",schema:{types:[...i.map((e=>g({type:e,languages:t}))),...i.map((e=>f({type:e})))]}}}));exports.internationalizedArray=v;
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
package/lib/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../src/components/createFieldName.ts","../src/components/Feedback.tsx","../src/components/InternationalizedArray.tsx","../src/schema/array.ts","../src/components/getToneFromValidation.ts","../src/components/InternationalizedInput.tsx","../src/schema/object.ts","../src/plugin.tsx"],"sourcesContent":["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 {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 React, {useCallback, useMemo} from 'react'\nimport {\n insert,\n set,\n setIfMissing,\n ArrayOfObjectsItemMember,\n ArrayOfObjectsItem,\n ArrayOfObjectsInputProps,\n} from 'sanity'\nimport {Button, Grid, Stack, useToast} from '@sanity/ui'\nimport {AddIcon, RestoreIcon} from '@sanity/icons'\n\nimport {Language, Value, ArraySchemaWithLanguageOptions} from '../types'\nimport Feedback from './Feedback'\n\nexport type InternationalizedArrayProps = ArrayOfObjectsInputProps<\n Value,\n ArraySchemaWithLanguageOptions\n>\n\nexport default function InternationalizedArray(props: InternationalizedArrayProps) {\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 const itemBase = {_type: `${schemaType.name}Value`}\n\n // Create new items\n const newItems = languageId\n ? // Just one for this language\n [{...itemBase, _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) => ({...itemBase, _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 // 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 languagesInUse = languages.filter((l) => value?.find((v) => v._key === l.id))\n const languagesOutOfOrder = useMemo(() => {\n if (!value?.length) {\n return []\n }\n\n return value\n .map((v, vIndex) => (vIndex === languagesInUse.findIndex((l) => l.id === v._key) ? null : v))\n .filter(Boolean)\n }, [value, languagesInUse])\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 <>\n {/* TODO: Resolve type for ArrayOfObjectsItemMember */}\n {/* @ts-ignore */}\n {members.map((member: ArrayOfObjectsItemMember) => {\n if (member.kind === 'item') {\n return (\n <ArrayOfObjectsItem\n key={member.key}\n member={member}\n renderItem={props.renderItem}\n renderField={props.renderField}\n renderInput={props.renderInput}\n renderPreview={props.renderPreview}\n />\n )\n }\n\n return null\n })}\n </>\n ) : null}\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 {/* Show buttons if languages are configured */}\n {/* Hide them once languages have values */}\n {languages?.length > 0 && languagesInUse.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={\n value?.length\n ? `Add missing ${languages.length - value.length === 1 ? `language` : `languages`}`\n : `Add all languages`\n }\n onClick={() => handleAddLanguage()}\n />\n </Stack>\n ) : null}\n </Stack>\n )\n}\n","import {defineField, FieldDefinition, Rule} from 'sanity'\n\nimport {createFieldName} from '../components/createFieldName'\nimport InternationalizedArray from '../components/InternationalizedArray'\nimport {Language, Value} from '../types'\n\ntype ArrayFactoryConfig = {\n languages: Language[]\n type: string | FieldDefinition\n}\n\nexport default (config: ArrayFactoryConfig): 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 // TODO: Resolve this typing issue with the outer component\n // @ts-ignore\n components: {\n input: InternationalizedArray,\n },\n options: {languages},\n // TODO: Resolve this typing issue with the inner object\n // @ts-ignore\n of: [\n defineField({\n name: objectName,\n type: objectName,\n }),\n ],\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","import {CardTone} from '@sanity/ui'\nimport {FormNodeValidation} from 'sanity'\n\nexport function getToneFromValidation(validations: FormNodeValidation[]): CardTone | undefined {\n if (!validations?.length) {\n return undefined\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 undefined\n}\n","import {ObjectItemProps, useFormValue} from 'sanity'\nimport React, {useCallback, useMemo} from 'react'\nimport {unset, set} from 'sanity'\nimport {Box, Button, Flex, Label, MenuButton, Menu, MenuItem, Card} from '@sanity/ui'\nimport {RemoveIcon} from '@sanity/icons'\n\nimport {Language} from '../types'\nimport {getToneFromValidation} from './getToneFromValidation'\n\ntype InternationalizedValue = {\n _type: string\n _key: string\n value: string\n}\n\nexport default function InternationalizedInput(props: ObjectItemProps<InternationalizedValue>) {\n const parentValue = useFormValue(props.path.slice(0, -1)) as InternationalizedValue[]\n\n const inlineProps = {\n ...props.inputProps,\n // This is the magic that makes inline editing work\n members: props.inputProps.members.filter((m) => m.kind === 'field' && m.name === 'value'),\n // This just overrides the type\n // TODO: Remove this as it shouldn't be necessary\n value: props.value as InternationalizedValue,\n }\n\n const {validation, value, onChange, readOnly} = inlineProps\n\n // The parent array contains the languages from the plugin config\n // TODO: fix TS support for overloading options\n const languages: Language[] = useMemo(\n // @ts-ignore\n () => props?.parentSchemaType?.options?.languages ?? [],\n // @ts-ignore\n [props?.parentSchemaType?.options?.languages]\n )\n const languageKeysInUse = useMemo(() => parentValue?.map((v) => v._key) ?? [], [parentValue])\n const keyIsValid = languages.find((l) => l.id === value._key)\n\n // Changes the key of this item, ideally to a valid language\n const handleKeyChange = useCallback(\n (languageId: string) => {\n if (!value || !languages.find((l) => l.id === languageId)) {\n return\n }\n\n onChange([set(languageId, ['_key'])])\n },\n [onChange, value, languages]\n )\n\n // Removes this item from the array\n const handleUnset = useCallback(() => {\n onChange(unset())\n }, [onChange])\n\n return (\n <Card tone={getToneFromValidation(validation)}>\n <Flex align=\"flex-end\" gap={1}>\n <Card tone=\"inherit\">\n <Box paddingY={3} paddingRight={2}>\n {keyIsValid ? (\n <Label muted size={1}>\n {value._key}\n </Label>\n ) : (\n <MenuButton\n button={<Button fontSize={1} text={`Change \"${value._key}\"`} />}\n id={`${value._key}-change-key`}\n menu={\n <Menu>\n {languages.map((language) => (\n <MenuItem\n // TODO: Prevent changing to a key that already exists in the array\n disabled={languageKeysInUse.includes(language.id)}\n fontSize={1}\n key={language.id}\n text={language.id.toLocaleUpperCase()}\n onClick={() => handleKeyChange(language.id)}\n />\n ))}\n </Menu>\n }\n placement=\"right\"\n popover={{portal: true}}\n />\n )}\n </Box>\n </Card>\n\n <Card paddingRight={2} flex={1} tone=\"inherit\">\n {props.inputProps.renderInput(props.inputProps)}\n </Card>\n\n <Card tone=\"inherit\">\n <Button\n mode=\"ghost\"\n icon={RemoveIcon}\n tone=\"critical\"\n disabled={readOnly}\n onClick={handleUnset}\n />\n </Card>\n </Flex>\n </Card>\n )\n}\n","import {defineField, FieldDefinition} from 'sanity'\n\nimport {createFieldName} from '../components/createFieldName'\nimport InternationalizedInput from '../components/InternationalizedInput'\n\ntype ObjectFactoryConfig = {\n type: string | FieldDefinition\n}\n\nexport default (config: ObjectFactoryConfig): 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: Resolve this typing issue with the return type\n // @ts-ignore\n components: {\n // item: InternationalizedInputWrapper,\n // TODO: Resolve this typing issue with the outer component\n // @ts-ignore\n item: InternationalizedInput,\n },\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 preview: {\n select: {\n title: 'value',\n subtitle: '_key',\n },\n },\n })\n}\n","import {definePlugin} 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 = definePlugin<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"],"names":["pascalCase","string","split","map","word","charAt","toUpperCase","slice","join","titleCase","replace","g","camelCase","createFieldName","name","addValue","schemaExample","languages","id","title","Feedback","jsx","Card","tone","border","radius","padding","children","jsxs","Stack","space","Text","Code","size","language","JSON","stringify","InternationalizedArray","props","members","value","schemaType","onChange","readOnly","options","toast","useToast","useMemo","_a","handleAddLanguage","useCallback","languageId","itemBase","_type","concat","newItems","_key","filter","length","find","v","languagesInUse","insertions","item","languageIndex","findIndex","l","remainingLanguages","nextLanguageIndex","r","push","splice","insert","setIfMissing","handleRestoreOrder","updatedValue","reduce","acc","newIndex","Boolean","status","set","allKeysAreLanguages","every","languagesOutOfOrder","vIndex","Fragment","member","kind","ArrayOfObjectsItem","renderItem","renderField","renderInput","renderPreview","key","Button","icon","RestoreIcon","onClick","text","Grid","columns","Math","min","gap","mode","fontSize","disabled","AddIcon","array","config","type","typeName","arrayName","objectName","defineField","components","input","of","validation","rule","max","custom","context","_b","contextLanguages","nonLanguageKeys","message","paths","valuesByLanguage","cur","_objectSpread","duplicateValues","Object","values","flat","getToneFromValidation","validations","validationLevels","level","includes","InternationalizedInput","parentValue","useFormValue","path","inlineProps","inputProps","m","_c","parentSchemaType","languageKeysInUse","keyIsValid","handleKeyChange","handleUnset","unset","Flex","align","Box","paddingY","paddingRight","Label","muted","MenuButton","button","menu","Menu","MenuItem","toLocaleUpperCase","placement","popover","portal","flex","RemoveIcon","object","fields","preview","select","subtitle","CONFIG_DEFAULT","fieldTypes","internationalizedArray","definePlugin","schema","types"],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import {Plugin as Plugin_2} from 'sanity'
|
|
2
|
+
import {RuleTypeConstraint} from 'sanity'
|
|
3
|
+
|
|
4
|
+
export declare const internationalizedArray: Plugin_2<PluginConfig>
|
|
5
|
+
|
|
6
|
+
declare type Language = {
|
|
7
|
+
id: string
|
|
8
|
+
title: string
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
declare type PluginConfig = {
|
|
12
|
+
languages: Language[]
|
|
13
|
+
fieldTypes: (string | RuleTypeConstraint)[]
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export {}
|
package/package.json
CHANGED
|
@@ -1,19 +1,35 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sanity-plugin-internationalized-array",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.3.0",
|
|
4
4
|
"description": "Store localized fields in an array to save on attributes",
|
|
5
|
-
"
|
|
5
|
+
"keywords": [
|
|
6
|
+
"sanity",
|
|
7
|
+
"sanity-plugin"
|
|
8
|
+
],
|
|
9
|
+
"homepage": "https://github.com/SimeonGriggs/sanity-plugin-internationalized-array#readme",
|
|
10
|
+
"bugs": {
|
|
11
|
+
"url": "https://github.com/SimeonGriggs/sanity-plugin-internationalized-array/issues"
|
|
12
|
+
},
|
|
13
|
+
"repository": {
|
|
14
|
+
"type": "git",
|
|
15
|
+
"url": "git@github.com:SimeonGriggs/sanity-plugin-internationalized-array.git"
|
|
16
|
+
},
|
|
6
17
|
"license": "MIT",
|
|
7
|
-
"
|
|
8
|
-
"main": "./lib/cjs/index.js",
|
|
9
|
-
"module": "./lib/esm/index.js",
|
|
10
|
-
"types": "./lib/types/index.d.ts",
|
|
18
|
+
"author": "Simeon Griggs <simeon@sanity.io>",
|
|
11
19
|
"exports": {
|
|
12
20
|
".": {
|
|
13
|
-
"
|
|
14
|
-
"
|
|
15
|
-
|
|
21
|
+
"types": "./lib/src/index.d.ts",
|
|
22
|
+
"source": "./src/index.ts",
|
|
23
|
+
"import": "./lib/index.esm.js",
|
|
24
|
+
"require": "./lib/index.js",
|
|
25
|
+
"default": "./lib/index.esm.js"
|
|
26
|
+
},
|
|
27
|
+
"./package.json": "./package.json"
|
|
16
28
|
},
|
|
29
|
+
"main": "./lib/index.js",
|
|
30
|
+
"module": "./lib/index.esm.js",
|
|
31
|
+
"source": "./src/index.ts",
|
|
32
|
+
"types": "./lib/src/index.d.ts",
|
|
17
33
|
"files": [
|
|
18
34
|
"src",
|
|
19
35
|
"lib",
|
|
@@ -21,54 +37,52 @@
|
|
|
21
37
|
"sanity.json"
|
|
22
38
|
],
|
|
23
39
|
"scripts": {
|
|
40
|
+
"prebuild": "npm run clean && plugin-kit verify-package --silent && pkg-utils",
|
|
41
|
+
"build": "pkg-utils build",
|
|
24
42
|
"clean": "rimraf lib",
|
|
25
|
-
"lint": "eslint .",
|
|
26
|
-
"prebuild": "npm run clean && plugin-kit verify-package --silent",
|
|
27
|
-
"build": "parcel build --no-cache",
|
|
28
|
-
"watch": "parcel watch",
|
|
29
43
|
"link-watch": "plugin-kit link-watch",
|
|
30
|
-
"
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
"
|
|
34
|
-
"url": "git+ssh://git@github.com/SimeonGriggs/sanity-plugin-internationalized-array.git"
|
|
35
|
-
},
|
|
36
|
-
"engines": {
|
|
37
|
-
"node": ">=14.0.0"
|
|
44
|
+
"lint": "eslint .",
|
|
45
|
+
"prepare": "husky install",
|
|
46
|
+
"prepublishOnly": "npm run build",
|
|
47
|
+
"watch": "pkg-utils watch"
|
|
38
48
|
},
|
|
39
49
|
"dependencies": {
|
|
40
50
|
"@sanity/icons": "^1.3.1",
|
|
41
|
-
"@sanity/incompatible-plugin": "^
|
|
42
|
-
"
|
|
43
|
-
"sanity-plugin-utils": "^0.0.1",
|
|
51
|
+
"@sanity/incompatible-plugin": "^1.0.4",
|
|
52
|
+
"sanity-plugin-utils": "^1.0.0",
|
|
44
53
|
"styled-components": "^5.3.5"
|
|
45
54
|
},
|
|
46
55
|
"devDependencies": {
|
|
47
|
-
"@
|
|
48
|
-
"@
|
|
49
|
-
"@sanity/
|
|
50
|
-
"@
|
|
51
|
-
"@
|
|
52
|
-
"@
|
|
53
|
-
"
|
|
56
|
+
"@commitlint/cli": "^17.2.0",
|
|
57
|
+
"@commitlint/config-conventional": "^17.2.0",
|
|
58
|
+
"@sanity/pkg-utils": "^1.18.0",
|
|
59
|
+
"@sanity/plugin-kit": "^2.1.16",
|
|
60
|
+
"@sanity/semantic-release-preset": "^2.0.2",
|
|
61
|
+
"@sanity/ui": "1.0.0-beta.32",
|
|
62
|
+
"@types/styled-components": "^5.1.26",
|
|
63
|
+
"@typescript-eslint/eslint-plugin": "^5.43.0",
|
|
64
|
+
"@typescript-eslint/parser": "^5.43.0",
|
|
65
|
+
"eslint": "^8.27.0",
|
|
54
66
|
"eslint-config-prettier": "^8.5.0",
|
|
55
67
|
"eslint-config-sanity": "^6.0.0",
|
|
56
68
|
"eslint-plugin-prettier": "^4.2.1",
|
|
57
|
-
"eslint-plugin-react": "^7.
|
|
69
|
+
"eslint-plugin-react": "^7.31.10",
|
|
58
70
|
"eslint-plugin-react-hooks": "^4.6.0",
|
|
59
|
-
"
|
|
71
|
+
"husky": "^8.0.2",
|
|
72
|
+
"lint-staged": "^13.0.3",
|
|
60
73
|
"prettier": "^2.7.1",
|
|
61
|
-
"
|
|
74
|
+
"prettier-plugin-packagejson": "^2.3.0",
|
|
75
|
+
"react": "^18",
|
|
62
76
|
"rimraf": "^3.0.2",
|
|
63
|
-
"sanity": "3.0.0-
|
|
64
|
-
"typescript": "4.
|
|
77
|
+
"sanity": "3.0.0-rc.2",
|
|
78
|
+
"typescript": "^4.9.3"
|
|
65
79
|
},
|
|
66
80
|
"peerDependencies": {
|
|
67
|
-
"
|
|
68
|
-
"
|
|
81
|
+
"@sanity/ui": "1.0.0-beta.32",
|
|
82
|
+
"react": "^18",
|
|
83
|
+
"sanity": "dev-preview || 3.0.0-rc.2"
|
|
69
84
|
},
|
|
70
|
-
"
|
|
71
|
-
"
|
|
72
|
-
}
|
|
73
|
-
"homepage": "https://github.com/SimeonGriggs/sanity-plugin-internationalized-array#readme"
|
|
85
|
+
"engines": {
|
|
86
|
+
"node": ">=14"
|
|
87
|
+
}
|
|
74
88
|
}
|