@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.
@@ -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":"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"}
@@ -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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"}
package/dist/index.js DELETED
@@ -1,8 +0,0 @@
1
-
2
- 'use strict'
3
-
4
- if (process.env.NODE_ENV === 'production') {
5
- module.exports = require('./field-editor-checkbox.cjs.production.min.js')
6
- } else {
7
- module.exports = require('./field-editor-checkbox.cjs.development.js')
8
- }