@contentful/field-editor-checkbox 1.2.0 → 1.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/CheckboxEditor.js +164 -0
- package/dist/cjs/CheckboxEditor.spec.js +219 -0
- package/dist/cjs/index.js +11 -0
- package/dist/cjs/styles.js +44 -0
- package/dist/esm/CheckboxEditor.js +112 -0
- package/dist/esm/CheckboxEditor.spec.js +176 -0
- package/dist/esm/index.js +1 -0
- package/dist/esm/styles.js +15 -0
- package/dist/{CheckboxEditor.d.ts → types/CheckboxEditor.d.ts} +22 -22
- package/dist/types/CheckboxEditor.spec.d.ts +1 -0
- package/dist/{index.d.ts → types/index.d.ts} +1 -1
- package/dist/{styles.d.ts → types/styles.d.ts} +4 -4
- package/package.json +26 -13
- package/CHANGELOG.md +0 -204
- package/dist/field-editor-checkbox.cjs.development.js +0 -130
- package/dist/field-editor-checkbox.cjs.development.js.map +0 -1
- package/dist/field-editor-checkbox.cjs.production.min.js +0 -2
- package/dist/field-editor-checkbox.cjs.production.min.js.map +0 -1
- package/dist/field-editor-checkbox.esm.js +0 -124
- package/dist/field-editor-checkbox.esm.js.map +0 -1
- package/dist/index.js +0 -8
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"field-editor-checkbox.cjs.development.js","sources":["../src/styles.ts","../src/CheckboxEditor.tsx"],"sourcesContent":["import tokens from '@contentful/f36-tokens';\nimport { css } from 'emotion';\n\nexport const form = css({\n marginTop: tokens.spacingS,\n});\n\nexport const rightToLeft = css({\n direction: 'rtl',\n});\n\nexport const invalidText = css({\n color: tokens.red500,\n marginLeft: tokens.spacing2Xs,\n});\n\nexport const removeBtn = css({\n marginLeft: tokens.spacingL,\n});\n","import * as React from 'react';\nimport { useState } from 'react';\n\nimport { Checkbox, Box } from '@contentful/f36-components';\nimport { TextLink, Form } from '@contentful/f36-components';\nimport {\n FieldAPI,\n FieldConnector,\n LocalesAPI,\n PredefinedValuesError,\n} from '@contentful/field-editor-shared';\nimport { cx } from 'emotion';\nimport get from 'lodash/get';\nimport { nanoid } from 'nanoid';\n\nimport * as styles from './styles';\n\n\nexport interface CheckboxEditorProps {\n /**\n * is the field disabled initially\n */\n isInitiallyDisabled: boolean;\n /**\n * sdk.field\n */\n field: FieldAPI;\n /**\n * sdk.locales\n */\n locales: LocalesAPI;\n}\n\ntype ListValue = string[];\n\ntype CheckboxOption = { id: string; value: string; label: string; invalid?: boolean };\n\nfunction isEmptyListValue(value: ListValue | null) {\n return value === null || value.length === 0;\n}\n\nfunction getOptions(field: FieldAPI, id: string): CheckboxOption[] {\n // Get first object that has a 'in' property\n const validations = get(field, ['items', 'validations'], []) as Record<\n string,\n { in?: string[] }\n >[];\n\n const predefinedValues = validations\n .filter((validation) => validation.in)\n .map((validation) => validation.in);\n\n const firstPredefinedValues = (\n predefinedValues.length > 0 ? predefinedValues[0] : []\n ) as string[];\n\n return firstPredefinedValues.map((value: string, index) => ({\n // Append a random id to distinguish between checkboxes opened in two editors (e.g. slide-in)\n id: ['entity', field.id, field.locale, index, id].join('.'),\n value,\n label: value,\n }));\n}\n\nconst getInvalidValues = (\n field: FieldAPI,\n values: string[],\n options: CheckboxOption[]\n): CheckboxOption[] => {\n const getValueFromOptions = (options as CheckboxOption[]).map((item) => item.value);\n const invalidValues = values\n .filter((value) => !getValueFromOptions.includes(value))\n .map((value, index) => ({\n id: ['entity', field.id, field.locale, index, 'invalid'].join('.'),\n label: value,\n invalid: true,\n value,\n }));\n\n return invalidValues;\n};\n\nexport function CheckboxEditor(props: CheckboxEditorProps) {\n const [id] = useState(() => nanoid(6));\n const { field, locales } = props;\n\n const options = getOptions(field, id);\n const misconfigured = options.length === 0;\n\n if (misconfigured) {\n return <PredefinedValuesError />;\n }\n\n const direction = locales.direction[field.locale] || 'ltr';\n\n return (\n <FieldConnector<ListValue>\n throttle={0}\n isEmptyValue={isEmptyListValue}\n field={field}\n isInitiallyDisabled={props.isInitiallyDisabled}>\n {({ disabled, value, setValue }) => {\n const values = value || [];\n\n const addValue = (value: string) => {\n const newValues = [...values.filter((item) => item !== value), value];\n setValue(newValues);\n };\n\n const removeValue = (value: string) => {\n const newValues = values.filter((item) => item !== value);\n setValue(newValues);\n };\n\n const invalidValues = getInvalidValues(field, values, options);\n const mergedOptions = [...options, ...invalidValues];\n\n return (\n <Form\n testId=\"checkbox-editor\"\n className={cx(styles.form, direction === 'rtl' ? styles.rightToLeft : '')}>\n {mergedOptions.map((item) => (\n <Box key={item.id} marginBottom=\"spacingS\">\n <Checkbox\n key={item.id}\n id={item.id}\n isChecked={values.includes(item.value)}\n isDisabled={disabled}\n value={item.value}\n name={`${field.id}.${field.locale}`}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => {\n if (e.target.checked) {\n addValue(item.value);\n } else {\n removeValue(item.value);\n }\n }}>\n {item.label}\n </Checkbox>\n {item.invalid && (\n <>\n <span data-test-id=\"invalid-text\" className={styles.invalidText}>\n (invalid)\n </span>\n <TextLink\n as=\"button\"\n className={styles.removeBtn}\n onClick={() => removeValue(item.value)}>\n Remove\n </TextLink>\n </>\n )}\n </Box>\n ))}\n </Form>\n );\n }}\n </FieldConnector>\n );\n}\n\nCheckboxEditor.defaultProps = {\n isInitiallyDisabled: true,\n};\n"],"names":["form","css","marginTop","tokens","spacingS","rightToLeft","direction","invalidText","color","red500","marginLeft","spacing2Xs","removeBtn","spacingL","isEmptyListValue","value","length","getOptions","field","id","validations","get","predefinedValues","filter","validation","in","map","firstPredefinedValues","index","locale","join","label","getInvalidValues","values","options","getValueFromOptions","item","invalidValues","includes","invalid","CheckboxEditor","props","useState","nanoid","locales","misconfigured","React","PredefinedValuesError","FieldConnector","throttle","isEmptyValue","isInitiallyDisabled","disabled","setValue","addValue","newValues","removeValue","mergedOptions","Form","testId","className","cx","styles","Box","key","marginBottom","Checkbox","isChecked","isDisabled","name","onChange","e","target","checked","TextLink","as","onClick","defaultProps"],"mappings":";;;;;;;;;;;;;;AAGO,MAAMA,IAAI,gBAAGC,WAAG,CAAC;AACtBC,EAAAA,SAAS,EAAEC,MAAM,CAACC;AADI,CAAD,CAAhB;AAIA,MAAMC,WAAW,gBAAGJ,WAAG,CAAC;AAC7BK,EAAAA,SAAS,EAAE;AADkB,CAAD,CAAvB;AAIA,MAAMC,WAAW,gBAAGN,WAAG,CAAC;AAC7BO,EAAAA,KAAK,EAAEL,MAAM,CAACM,MADe;AAE7BC,EAAAA,UAAU,EAAEP,MAAM,CAACQ;AAFU,CAAD,CAAvB;AAKA,MAAMC,SAAS,gBAAGX,WAAG,CAAC;AAC3BS,EAAAA,UAAU,EAAEP,MAAM,CAACU;AADQ,CAAD,CAArB;;ACqBP,SAASC,gBAAT,CAA0BC,KAA1B;AACE,SAAOA,KAAK,KAAK,IAAV,IAAkBA,KAAK,CAACC,MAAN,KAAiB,CAA1C;AACD;;AAED,SAASC,UAAT,CAAoBC,KAApB,EAAqCC,EAArC;AACE;AACA,QAAMC,WAAW,GAAGC,GAAG,CAACH,KAAD,EAAQ,CAAC,OAAD,EAAU,aAAV,CAAR,EAAkC,EAAlC,CAAvB;AAKA,QAAMI,gBAAgB,GAAGF,WAAW,CACjCG,MADsB,CACdC,UAAD,IAAgBA,UAAU,CAACC,EADZ,EAEtBC,GAFsB,CAEjBF,UAAD,IAAgBA,UAAU,CAACC,EAFT,CAAzB;AAIA,QAAME,qBAAqB,GACzBL,gBAAgB,CAACN,MAAjB,GAA0B,CAA1B,GAA8BM,gBAAgB,CAAC,CAAD,CAA9C,GAAoD,EADtD;AAIA,SAAOK,qBAAqB,CAACD,GAAtB,CAA0B,CAACX,KAAD,EAAgBa,KAAhB,MAA2B;AAC1D;AACAT,IAAAA,EAAE,EAAE,CAAC,QAAD,EAAWD,KAAK,CAACC,EAAjB,EAAqBD,KAAK,CAACW,MAA3B,EAAmCD,KAAnC,EAA0CT,EAA1C,EAA8CW,IAA9C,CAAmD,GAAnD,CAFsD;AAG1Df,IAAAA,KAH0D;AAI1DgB,IAAAA,KAAK,EAAEhB;AAJmD,GAA3B,CAA1B,CAAP;AAMD;;AAED,MAAMiB,gBAAgB,GAAG,CACvBd,KADuB,EAEvBe,MAFuB,EAGvBC,OAHuB;AAKvB,QAAMC,mBAAmB,GAAID,OAA4B,CAACR,GAA7B,CAAkCU,IAAD,IAAUA,IAAI,CAACrB,KAAhD,CAA7B;AACA,QAAMsB,aAAa,GAAGJ,MAAM,CACzBV,MADmB,CACXR,KAAD,IAAW,CAACoB,mBAAmB,CAACG,QAApB,CAA6BvB,KAA7B,CADA,EAEnBW,GAFmB,CAEf,CAACX,KAAD,EAAQa,KAAR,MAAmB;AACtBT,IAAAA,EAAE,EAAE,CAAC,QAAD,EAAWD,KAAK,CAACC,EAAjB,EAAqBD,KAAK,CAACW,MAA3B,EAAmCD,KAAnC,EAA0C,SAA1C,EAAqDE,IAArD,CAA0D,GAA1D,CADkB;AAEtBC,IAAAA,KAAK,EAAEhB,KAFe;AAGtBwB,IAAAA,OAAO,EAAE,IAHa;AAItBxB,IAAAA;AAJsB,GAAnB,CAFe,CAAtB;AASA,SAAOsB,aAAP;AACD,CAhBD;;AAkBA,SAAgBG,eAAeC;AAC7B,QAAM,CAACtB,EAAD,IAAOuB,cAAQ,CAAC,MAAMC,aAAM,CAAC,CAAD,CAAb,CAArB;AACA,QAAM;AAAEzB,IAAAA,KAAF;AAAS0B,IAAAA;AAAT,MAAqBH,KAA3B;AAEA,QAAMP,OAAO,GAAGjB,UAAU,CAACC,KAAD,EAAQC,EAAR,CAA1B;AACA,QAAM0B,aAAa,GAAGX,OAAO,CAAClB,MAAR,KAAmB,CAAzC;;AAEA,MAAI6B,aAAJ,EAAmB;AACjB,WAAOC,mBAAA,CAACC,uCAAD,MAAA,CAAP;AACD;;AAED,QAAMzC,SAAS,GAAGsC,OAAO,CAACtC,SAAR,CAAkBY,KAAK,CAACW,MAAxB,KAAmC,KAArD;AAEA,SACEiB,mBAAA,CAACE,gCAAD;AACEC,IAAAA,QAAQ,EAAE;AACVC,IAAAA,YAAY,EAAEpC;AACdI,IAAAA,KAAK,EAAEA;AACPiC,IAAAA,mBAAmB,EAAEV,KAAK,CAACU;GAJ7B,EAKG,CAAC;AAAEC,IAAAA,QAAF;AAAYrC,IAAAA,KAAZ;AAAmBsC,IAAAA;AAAnB,GAAD;AACC,UAAMpB,MAAM,GAAGlB,KAAK,IAAI,EAAxB;;AAEA,UAAMuC,QAAQ,GAAIvC,KAAD;AACf,YAAMwC,SAAS,GAAG,CAAC,GAAGtB,MAAM,CAACV,MAAP,CAAea,IAAD,IAAUA,IAAI,KAAKrB,KAAjC,CAAJ,EAA6CA,KAA7C,CAAlB;AACAsC,MAAAA,QAAQ,CAACE,SAAD,CAAR;AACD,KAHD;;AAKA,UAAMC,WAAW,GAAIzC,KAAD;AAClB,YAAMwC,SAAS,GAAGtB,MAAM,CAACV,MAAP,CAAea,IAAD,IAAUA,IAAI,KAAKrB,KAAjC,CAAlB;AACAsC,MAAAA,QAAQ,CAACE,SAAD,CAAR;AACD,KAHD;;AAKA,UAAMlB,aAAa,GAAGL,gBAAgB,CAACd,KAAD,EAAQe,MAAR,EAAgBC,OAAhB,CAAtC;AACA,UAAMuB,aAAa,GAAG,CAAC,GAAGvB,OAAJ,EAAa,GAAGG,aAAhB,CAAtB;AAEA,WACES,mBAAA,CAACY,kBAAD;AACEC,MAAAA,MAAM,EAAC;AACPC,MAAAA,SAAS,EAAEC,UAAE,CAACC,IAAD,EAAcxD,SAAS,KAAK,KAAd,GAAsBwD,WAAtB,GAA2C,EAAzD;KAFf,EAGGL,aAAa,CAAC/B,GAAd,CAAmBU,IAAD,IACjBU,mBAAA,CAACiB,iBAAD;AAAKC,MAAAA,GAAG,EAAE5B,IAAI,CAACjB;AAAI8C,MAAAA,YAAY,EAAC;KAAhC,EACEnB,mBAAA,CAACoB,sBAAD;AACEF,MAAAA,GAAG,EAAE5B,IAAI,CAACjB;AACVA,MAAAA,EAAE,EAAEiB,IAAI,CAACjB;AACTgD,MAAAA,SAAS,EAAElC,MAAM,CAACK,QAAP,CAAgBF,IAAI,CAACrB,KAArB;AACXqD,MAAAA,UAAU,EAAEhB;AACZrC,MAAAA,KAAK,EAAEqB,IAAI,CAACrB;AACZsD,MAAAA,IAAI,KAAKnD,KAAK,CAACC,MAAMD,KAAK,CAACW;AAC3ByC,MAAAA,QAAQ,EAAGC,CAAD;AACR,YAAIA,CAAC,CAACC,MAAF,CAASC,OAAb,EAAsB;AACpBnB,UAAAA,QAAQ,CAAClB,IAAI,CAACrB,KAAN,CAAR;AACD,SAFD,MAEO;AACLyC,UAAAA,WAAW,CAACpB,IAAI,CAACrB,KAAN,CAAX;AACD;AACF;KAbH,EAcGqB,IAAI,CAACL,KAdR,CADF,EAiBGK,IAAI,CAACG,OAAL,IACCO,mBAAA,eAAA,MAAA,EACEA,mBAAA,OAAA;sBAAmB;AAAec,MAAAA,SAAS,EAAEE;KAA7C,aAAA,CADF,EAIEhB,mBAAA,CAAC4B,sBAAD;AACEC,MAAAA,EAAE,EAAC;AACHf,MAAAA,SAAS,EAAEE;AACXc,MAAAA,OAAO,EAAE,MAAMpB,WAAW,CAACpB,IAAI,CAACrB,KAAN;KAH5B,UAAA,CAJF,CAlBJ,CADD,CAHH,CADF;AAuCD,GA5DH,CADF;AAgED;AAEDyB,cAAc,CAACqC,YAAf,GAA8B;AAC5B1B,EAAAA,mBAAmB,EAAE;AADO,CAA9B;;;;"}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
"use strict";function e(e){return e&&"object"==typeof e&&"default"in e?e.default:e}Object.defineProperty(exports,"__esModule",{value:!0});var t=require("react"),i=require("@contentful/f36-components"),l=require("@contentful/field-editor-shared"),n=require("emotion"),a=e(require("lodash/get")),r=require("nanoid"),o=e(require("@contentful/f36-tokens"));const s=n.css({marginTop:o.spacingS}),c=n.css({direction:"rtl"}),d=n.css({color:o.red500,marginLeft:o.spacing2Xs}),u=n.css({marginLeft:o.spacingL});function m(e){return null===e||0===e.length}function f(e){const[o]=t.useState(()=>r.nanoid(6)),{field:f,locales:v}=e,p=function(e,t){const i=a(e,["items","validations"],[]).filter(e=>e.in).map(e=>e.in);return(i.length>0?i[0]:[]).map((i,l)=>({id:["entity",e.id,e.locale,l,t].join("."),value:i,label:i}))}(f,o);if(0===p.length)return t.createElement(l.PredefinedValuesError,null);const g=v.direction[f.locale]||"ltr";return t.createElement(l.FieldConnector,{throttle:0,isEmptyValue:m,field:f,isInitiallyDisabled:e.isInitiallyDisabled},({disabled:e,value:l,setValue:a})=>{const r=l||[],o=e=>{const t=r.filter(t=>t!==e);a(t)},m=((e,t,i)=>{const l=i.map(e=>e.value);return t.filter(e=>!l.includes(e)).map((t,i)=>({id:["entity",e.id,e.locale,i,"invalid"].join("."),label:t,invalid:!0,value:t}))})(f,r,p),v=[...p,...m];return t.createElement(i.Form,{testId:"checkbox-editor",className:n.cx(s,"rtl"===g?c:"")},v.map(l=>t.createElement(i.Box,{key:l.id,marginBottom:"spacingS"},t.createElement(i.Checkbox,{key:l.id,id:l.id,isChecked:r.includes(l.value),isDisabled:e,value:l.value,name:`${f.id}.${f.locale}`,onChange:e=>{e.target.checked?(e=>{const t=[...r.filter(t=>t!==e),e];a(t)})(l.value):o(l.value)}},l.label),l.invalid&&t.createElement(t.Fragment,null,t.createElement("span",{"data-test-id":"invalid-text",className:d},"(invalid)"),t.createElement(i.TextLink,{as:"button",className:u,onClick:()=>o(l.value)},"Remove")))))})}f.defaultProps={isInitiallyDisabled:!0},exports.CheckboxEditor=f;
|
|
2
|
-
//# sourceMappingURL=field-editor-checkbox.cjs.production.min.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"field-editor-checkbox.cjs.production.min.js","sources":["../src/styles.ts","../src/CheckboxEditor.tsx"],"sourcesContent":["import tokens from '@contentful/f36-tokens';\nimport { css } from 'emotion';\n\nexport const form = css({\n marginTop: tokens.spacingS,\n});\n\nexport const rightToLeft = css({\n direction: 'rtl',\n});\n\nexport const invalidText = css({\n color: tokens.red500,\n marginLeft: tokens.spacing2Xs,\n});\n\nexport const removeBtn = css({\n marginLeft: tokens.spacingL,\n});\n","import * as React from 'react';\nimport { useState } from 'react';\n\nimport { Checkbox, Box } from '@contentful/f36-components';\nimport { TextLink, Form } from '@contentful/f36-components';\nimport {\n FieldAPI,\n FieldConnector,\n LocalesAPI,\n PredefinedValuesError,\n} from '@contentful/field-editor-shared';\nimport { cx } from 'emotion';\nimport get from 'lodash/get';\nimport { nanoid } from 'nanoid';\n\nimport * as styles from './styles';\n\n\nexport interface CheckboxEditorProps {\n /**\n * is the field disabled initially\n */\n isInitiallyDisabled: boolean;\n /**\n * sdk.field\n */\n field: FieldAPI;\n /**\n * sdk.locales\n */\n locales: LocalesAPI;\n}\n\ntype ListValue = string[];\n\ntype CheckboxOption = { id: string; value: string; label: string; invalid?: boolean };\n\nfunction isEmptyListValue(value: ListValue | null) {\n return value === null || value.length === 0;\n}\n\nfunction getOptions(field: FieldAPI, id: string): CheckboxOption[] {\n // Get first object that has a 'in' property\n const validations = get(field, ['items', 'validations'], []) as Record<\n string,\n { in?: string[] }\n >[];\n\n const predefinedValues = validations\n .filter((validation) => validation.in)\n .map((validation) => validation.in);\n\n const firstPredefinedValues = (\n predefinedValues.length > 0 ? predefinedValues[0] : []\n ) as string[];\n\n return firstPredefinedValues.map((value: string, index) => ({\n // Append a random id to distinguish between checkboxes opened in two editors (e.g. slide-in)\n id: ['entity', field.id, field.locale, index, id].join('.'),\n value,\n label: value,\n }));\n}\n\nconst getInvalidValues = (\n field: FieldAPI,\n values: string[],\n options: CheckboxOption[]\n): CheckboxOption[] => {\n const getValueFromOptions = (options as CheckboxOption[]).map((item) => item.value);\n const invalidValues = values\n .filter((value) => !getValueFromOptions.includes(value))\n .map((value, index) => ({\n id: ['entity', field.id, field.locale, index, 'invalid'].join('.'),\n label: value,\n invalid: true,\n value,\n }));\n\n return invalidValues;\n};\n\nexport function CheckboxEditor(props: CheckboxEditorProps) {\n const [id] = useState(() => nanoid(6));\n const { field, locales } = props;\n\n const options = getOptions(field, id);\n const misconfigured = options.length === 0;\n\n if (misconfigured) {\n return <PredefinedValuesError />;\n }\n\n const direction = locales.direction[field.locale] || 'ltr';\n\n return (\n <FieldConnector<ListValue>\n throttle={0}\n isEmptyValue={isEmptyListValue}\n field={field}\n isInitiallyDisabled={props.isInitiallyDisabled}>\n {({ disabled, value, setValue }) => {\n const values = value || [];\n\n const addValue = (value: string) => {\n const newValues = [...values.filter((item) => item !== value), value];\n setValue(newValues);\n };\n\n const removeValue = (value: string) => {\n const newValues = values.filter((item) => item !== value);\n setValue(newValues);\n };\n\n const invalidValues = getInvalidValues(field, values, options);\n const mergedOptions = [...options, ...invalidValues];\n\n return (\n <Form\n testId=\"checkbox-editor\"\n className={cx(styles.form, direction === 'rtl' ? styles.rightToLeft : '')}>\n {mergedOptions.map((item) => (\n <Box key={item.id} marginBottom=\"spacingS\">\n <Checkbox\n key={item.id}\n id={item.id}\n isChecked={values.includes(item.value)}\n isDisabled={disabled}\n value={item.value}\n name={`${field.id}.${field.locale}`}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => {\n if (e.target.checked) {\n addValue(item.value);\n } else {\n removeValue(item.value);\n }\n }}>\n {item.label}\n </Checkbox>\n {item.invalid && (\n <>\n <span data-test-id=\"invalid-text\" className={styles.invalidText}>\n (invalid)\n </span>\n <TextLink\n as=\"button\"\n className={styles.removeBtn}\n onClick={() => removeValue(item.value)}>\n Remove\n </TextLink>\n </>\n )}\n </Box>\n ))}\n </Form>\n );\n }}\n </FieldConnector>\n );\n}\n\nCheckboxEditor.defaultProps = {\n isInitiallyDisabled: true,\n};\n"],"names":["form","css","marginTop","tokens","spacingS","rightToLeft","direction","invalidText","color","red500","marginLeft","spacing2Xs","removeBtn","spacingL","isEmptyListValue","value","length","CheckboxEditor","props","id","useState","nanoid","field","locales","options","predefinedValues","get","filter","validation","in","map","index","locale","join","label","getOptions","React","PredefinedValuesError","FieldConnector","throttle","isEmptyValue","isInitiallyDisabled","disabled","setValue","values","removeValue","newValues","item","invalidValues","getValueFromOptions","includes","invalid","getInvalidValues","mergedOptions","Form","testId","className","cx","styles","Box","key","marginBottom","Checkbox","isChecked","isDisabled","name","onChange","e","target","checked","addValue","TextLink","as","onClick","defaultProps"],"mappings":"iWAGO,MAAMA,EAAOC,MAAI,CACtBC,UAAWC,EAAOC,WAGPC,EAAcJ,MAAI,CAC7BK,UAAW,QAGAC,EAAcN,MAAI,CAC7BO,MAAOL,EAAOM,OACdC,WAAYP,EAAOQ,aAGRC,EAAYX,MAAI,CAC3BS,WAAYP,EAAOU,WCoBrB,SAASC,EAAiBC,UACP,OAAVA,GAAmC,IAAjBA,EAAMC,gBA4CjBC,EAAeC,SACtBC,GAAMC,WAAS,IAAMC,SAAO,KAC7BC,MAAEA,EAAFC,QAASA,GAAYL,EAErBM,EA7CR,SAAoBF,EAAiBH,SAO7BM,EALcC,EAAIJ,EAAO,CAAC,QAAS,eAAgB,IAMtDK,OAAQC,GAAeA,EAAWC,IAClCC,IAAKF,GAAeA,EAAWC,WAGhCJ,EAAiBT,OAAS,EAAIS,EAAiB,GAAK,IAGzBK,IAAI,CAACf,EAAegB,MAE/CZ,GAAI,CAAC,SAAUG,EAAMH,GAAIG,EAAMU,OAAQD,EAAOZ,GAAIc,KAAK,KACvDlB,MAAAA,EACAmB,MAAOnB,KA0BOoB,CAAWb,EAAOH,MACO,IAAnBK,EAAQR,cAGrBoB,gBAACC,oCAGJ/B,EAAYiB,EAAQjB,UAAUgB,EAAMU,SAAW,aAGnDI,gBAACE,kBACCC,SAAU,EACVC,aAAc1B,EACdQ,MAAOA,EACPmB,oBAAqBvB,EAAMuB,qBAC1B,EAAGC,SAAAA,EAAU3B,MAAAA,EAAO4B,SAAAA,YACbC,EAAS7B,GAAS,GAOlB8B,EAAe9B,UACb+B,EAAYF,EAAOjB,OAAQoB,GAASA,IAAShC,GACnD4B,EAASG,IAGLE,EAlDW,EACvB1B,EACAsB,EACApB,WAEMyB,EAAuBzB,EAA6BM,IAAKiB,GAASA,EAAKhC,cACvD6B,EACnBjB,OAAQZ,IAAWkC,EAAoBC,SAASnC,IAChDe,IAAI,CAACf,EAAOgB,MACXZ,GAAI,CAAC,SAAUG,EAAMH,GAAIG,EAAMU,OAAQD,EAAO,WAAWE,KAAK,KAC9DC,MAAOnB,EACPoC,SAAS,EACTpC,MAAAA,MAsCwBqC,CAAiB9B,EAAOsB,EAAQpB,GAChD6B,EAAgB,IAAI7B,KAAYwB,UAGpCZ,gBAACkB,QACCC,OAAO,kBACPC,UAAWC,KAAGC,EAA2B,QAAdpD,EAAsBoD,EAAqB,KACrEL,EAAcvB,IAAKiB,GAClBX,gBAACuB,OAAIC,IAAKb,EAAK5B,GAAI0C,aAAa,YAC9BzB,gBAAC0B,YACCF,IAAKb,EAAK5B,GACVA,GAAI4B,EAAK5B,GACT4C,UAAWnB,EAAOM,SAASH,EAAKhC,OAChCiD,WAAYtB,EACZ3B,MAAOgC,EAAKhC,MACZkD,QAAS3C,EAAMH,MAAMG,EAAMU,SAC3BkC,SAAWC,IACLA,EAAEC,OAAOC,QA3BPtD,CAAAA,UACV+B,EAAY,IAAIF,EAAOjB,OAAQoB,GAASA,IAAShC,GAAQA,GAC/D4B,EAASG,IA0BGwB,CAASvB,EAAKhC,OAEd8B,EAAYE,EAAKhC,SAGpBgC,EAAKb,OAEPa,EAAKI,SACJf,gCACEA,uCAAmB,eAAeoB,UAAWE,gBAG7CtB,gBAACmC,YACCC,GAAG,SACHhB,UAAWE,EACXe,QAAS,IAAM5B,EAAYE,EAAKhC,wBActDE,EAAeyD,aAAe,CAC5BjC,qBAAqB"}
|
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
import { useState, createElement, Fragment } from 'react';
|
|
2
|
-
import { Form, Box, Checkbox, TextLink } from '@contentful/f36-components';
|
|
3
|
-
import { PredefinedValuesError, FieldConnector } from '@contentful/field-editor-shared';
|
|
4
|
-
import { css, cx } from 'emotion';
|
|
5
|
-
import get from 'lodash-es/get';
|
|
6
|
-
import { nanoid } from 'nanoid';
|
|
7
|
-
import tokens from '@contentful/f36-tokens';
|
|
8
|
-
|
|
9
|
-
const form = /*#__PURE__*/css({
|
|
10
|
-
marginTop: tokens.spacingS
|
|
11
|
-
});
|
|
12
|
-
const rightToLeft = /*#__PURE__*/css({
|
|
13
|
-
direction: 'rtl'
|
|
14
|
-
});
|
|
15
|
-
const invalidText = /*#__PURE__*/css({
|
|
16
|
-
color: tokens.red500,
|
|
17
|
-
marginLeft: tokens.spacing2Xs
|
|
18
|
-
});
|
|
19
|
-
const removeBtn = /*#__PURE__*/css({
|
|
20
|
-
marginLeft: tokens.spacingL
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
function isEmptyListValue(value) {
|
|
24
|
-
return value === null || value.length === 0;
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
function getOptions(field, id) {
|
|
28
|
-
// Get first object that has a 'in' property
|
|
29
|
-
const validations = get(field, ['items', 'validations'], []);
|
|
30
|
-
const predefinedValues = validations.filter(validation => validation.in).map(validation => validation.in);
|
|
31
|
-
const firstPredefinedValues = predefinedValues.length > 0 ? predefinedValues[0] : [];
|
|
32
|
-
return firstPredefinedValues.map((value, index) => ({
|
|
33
|
-
// Append a random id to distinguish between checkboxes opened in two editors (e.g. slide-in)
|
|
34
|
-
id: ['entity', field.id, field.locale, index, id].join('.'),
|
|
35
|
-
value,
|
|
36
|
-
label: value
|
|
37
|
-
}));
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
const getInvalidValues = (field, values, options) => {
|
|
41
|
-
const getValueFromOptions = options.map(item => item.value);
|
|
42
|
-
const invalidValues = values.filter(value => !getValueFromOptions.includes(value)).map((value, index) => ({
|
|
43
|
-
id: ['entity', field.id, field.locale, index, 'invalid'].join('.'),
|
|
44
|
-
label: value,
|
|
45
|
-
invalid: true,
|
|
46
|
-
value
|
|
47
|
-
}));
|
|
48
|
-
return invalidValues;
|
|
49
|
-
};
|
|
50
|
-
|
|
51
|
-
function CheckboxEditor(props) {
|
|
52
|
-
const [id] = useState(() => nanoid(6));
|
|
53
|
-
const {
|
|
54
|
-
field,
|
|
55
|
-
locales
|
|
56
|
-
} = props;
|
|
57
|
-
const options = getOptions(field, id);
|
|
58
|
-
const misconfigured = options.length === 0;
|
|
59
|
-
|
|
60
|
-
if (misconfigured) {
|
|
61
|
-
return createElement(PredefinedValuesError, null);
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
const direction = locales.direction[field.locale] || 'ltr';
|
|
65
|
-
return createElement(FieldConnector, {
|
|
66
|
-
throttle: 0,
|
|
67
|
-
isEmptyValue: isEmptyListValue,
|
|
68
|
-
field: field,
|
|
69
|
-
isInitiallyDisabled: props.isInitiallyDisabled
|
|
70
|
-
}, ({
|
|
71
|
-
disabled,
|
|
72
|
-
value,
|
|
73
|
-
setValue
|
|
74
|
-
}) => {
|
|
75
|
-
const values = value || [];
|
|
76
|
-
|
|
77
|
-
const addValue = value => {
|
|
78
|
-
const newValues = [...values.filter(item => item !== value), value];
|
|
79
|
-
setValue(newValues);
|
|
80
|
-
};
|
|
81
|
-
|
|
82
|
-
const removeValue = value => {
|
|
83
|
-
const newValues = values.filter(item => item !== value);
|
|
84
|
-
setValue(newValues);
|
|
85
|
-
};
|
|
86
|
-
|
|
87
|
-
const invalidValues = getInvalidValues(field, values, options);
|
|
88
|
-
const mergedOptions = [...options, ...invalidValues];
|
|
89
|
-
return createElement(Form, {
|
|
90
|
-
testId: "checkbox-editor",
|
|
91
|
-
className: cx(form, direction === 'rtl' ? rightToLeft : '')
|
|
92
|
-
}, mergedOptions.map(item => createElement(Box, {
|
|
93
|
-
key: item.id,
|
|
94
|
-
marginBottom: "spacingS"
|
|
95
|
-
}, createElement(Checkbox, {
|
|
96
|
-
key: item.id,
|
|
97
|
-
id: item.id,
|
|
98
|
-
isChecked: values.includes(item.value),
|
|
99
|
-
isDisabled: disabled,
|
|
100
|
-
value: item.value,
|
|
101
|
-
name: `${field.id}.${field.locale}`,
|
|
102
|
-
onChange: e => {
|
|
103
|
-
if (e.target.checked) {
|
|
104
|
-
addValue(item.value);
|
|
105
|
-
} else {
|
|
106
|
-
removeValue(item.value);
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
}, item.label), item.invalid && createElement(Fragment, null, createElement("span", {
|
|
110
|
-
"data-test-id": "invalid-text",
|
|
111
|
-
className: invalidText
|
|
112
|
-
}, "(invalid)"), createElement(TextLink, {
|
|
113
|
-
as: "button",
|
|
114
|
-
className: removeBtn,
|
|
115
|
-
onClick: () => removeValue(item.value)
|
|
116
|
-
}, "Remove")))));
|
|
117
|
-
});
|
|
118
|
-
}
|
|
119
|
-
CheckboxEditor.defaultProps = {
|
|
120
|
-
isInitiallyDisabled: true
|
|
121
|
-
};
|
|
122
|
-
|
|
123
|
-
export { CheckboxEditor };
|
|
124
|
-
//# sourceMappingURL=field-editor-checkbox.esm.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"field-editor-checkbox.esm.js","sources":["../src/styles.ts","../src/CheckboxEditor.tsx"],"sourcesContent":["import tokens from '@contentful/f36-tokens';\nimport { css } from 'emotion';\n\nexport const form = css({\n marginTop: tokens.spacingS,\n});\n\nexport const rightToLeft = css({\n direction: 'rtl',\n});\n\nexport const invalidText = css({\n color: tokens.red500,\n marginLeft: tokens.spacing2Xs,\n});\n\nexport const removeBtn = css({\n marginLeft: tokens.spacingL,\n});\n","import * as React from 'react';\nimport { useState } from 'react';\n\nimport { Checkbox, Box } from '@contentful/f36-components';\nimport { TextLink, Form } from '@contentful/f36-components';\nimport {\n FieldAPI,\n FieldConnector,\n LocalesAPI,\n PredefinedValuesError,\n} from '@contentful/field-editor-shared';\nimport { cx } from 'emotion';\nimport get from 'lodash/get';\nimport { nanoid } from 'nanoid';\n\nimport * as styles from './styles';\n\n\nexport interface CheckboxEditorProps {\n /**\n * is the field disabled initially\n */\n isInitiallyDisabled: boolean;\n /**\n * sdk.field\n */\n field: FieldAPI;\n /**\n * sdk.locales\n */\n locales: LocalesAPI;\n}\n\ntype ListValue = string[];\n\ntype CheckboxOption = { id: string; value: string; label: string; invalid?: boolean };\n\nfunction isEmptyListValue(value: ListValue | null) {\n return value === null || value.length === 0;\n}\n\nfunction getOptions(field: FieldAPI, id: string): CheckboxOption[] {\n // Get first object that has a 'in' property\n const validations = get(field, ['items', 'validations'], []) as Record<\n string,\n { in?: string[] }\n >[];\n\n const predefinedValues = validations\n .filter((validation) => validation.in)\n .map((validation) => validation.in);\n\n const firstPredefinedValues = (\n predefinedValues.length > 0 ? predefinedValues[0] : []\n ) as string[];\n\n return firstPredefinedValues.map((value: string, index) => ({\n // Append a random id to distinguish between checkboxes opened in two editors (e.g. slide-in)\n id: ['entity', field.id, field.locale, index, id].join('.'),\n value,\n label: value,\n }));\n}\n\nconst getInvalidValues = (\n field: FieldAPI,\n values: string[],\n options: CheckboxOption[]\n): CheckboxOption[] => {\n const getValueFromOptions = (options as CheckboxOption[]).map((item) => item.value);\n const invalidValues = values\n .filter((value) => !getValueFromOptions.includes(value))\n .map((value, index) => ({\n id: ['entity', field.id, field.locale, index, 'invalid'].join('.'),\n label: value,\n invalid: true,\n value,\n }));\n\n return invalidValues;\n};\n\nexport function CheckboxEditor(props: CheckboxEditorProps) {\n const [id] = useState(() => nanoid(6));\n const { field, locales } = props;\n\n const options = getOptions(field, id);\n const misconfigured = options.length === 0;\n\n if (misconfigured) {\n return <PredefinedValuesError />;\n }\n\n const direction = locales.direction[field.locale] || 'ltr';\n\n return (\n <FieldConnector<ListValue>\n throttle={0}\n isEmptyValue={isEmptyListValue}\n field={field}\n isInitiallyDisabled={props.isInitiallyDisabled}>\n {({ disabled, value, setValue }) => {\n const values = value || [];\n\n const addValue = (value: string) => {\n const newValues = [...values.filter((item) => item !== value), value];\n setValue(newValues);\n };\n\n const removeValue = (value: string) => {\n const newValues = values.filter((item) => item !== value);\n setValue(newValues);\n };\n\n const invalidValues = getInvalidValues(field, values, options);\n const mergedOptions = [...options, ...invalidValues];\n\n return (\n <Form\n testId=\"checkbox-editor\"\n className={cx(styles.form, direction === 'rtl' ? styles.rightToLeft : '')}>\n {mergedOptions.map((item) => (\n <Box key={item.id} marginBottom=\"spacingS\">\n <Checkbox\n key={item.id}\n id={item.id}\n isChecked={values.includes(item.value)}\n isDisabled={disabled}\n value={item.value}\n name={`${field.id}.${field.locale}`}\n onChange={(e: React.ChangeEvent<HTMLInputElement>) => {\n if (e.target.checked) {\n addValue(item.value);\n } else {\n removeValue(item.value);\n }\n }}>\n {item.label}\n </Checkbox>\n {item.invalid && (\n <>\n <span data-test-id=\"invalid-text\" className={styles.invalidText}>\n (invalid)\n </span>\n <TextLink\n as=\"button\"\n className={styles.removeBtn}\n onClick={() => removeValue(item.value)}>\n Remove\n </TextLink>\n </>\n )}\n </Box>\n ))}\n </Form>\n );\n }}\n </FieldConnector>\n );\n}\n\nCheckboxEditor.defaultProps = {\n isInitiallyDisabled: true,\n};\n"],"names":["form","css","marginTop","tokens","spacingS","rightToLeft","direction","invalidText","color","red500","marginLeft","spacing2Xs","removeBtn","spacingL","isEmptyListValue","value","length","getOptions","field","id","validations","get","predefinedValues","filter","validation","in","map","firstPredefinedValues","index","locale","join","label","getInvalidValues","values","options","getValueFromOptions","item","invalidValues","includes","invalid","CheckboxEditor","props","useState","nanoid","locales","misconfigured","React","PredefinedValuesError","FieldConnector","throttle","isEmptyValue","isInitiallyDisabled","disabled","setValue","addValue","newValues","removeValue","mergedOptions","Form","testId","className","cx","styles","Box","key","marginBottom","Checkbox","isChecked","isDisabled","name","onChange","e","target","checked","TextLink","as","onClick","defaultProps"],"mappings":"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"}
|