@contentful/field-editor-checkbox 1.1.12 → 1.2.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/CHANGELOG.md +6 -0
- package/dist/field-editor-checkbox.cjs.development.js +68 -89
- package/dist/field-editor-checkbox.cjs.development.js.map +1 -1
- package/dist/field-editor-checkbox.cjs.production.min.js +1 -1
- package/dist/field-editor-checkbox.cjs.production.min.js.map +1 -1
- package/dist/field-editor-checkbox.esm.js +68 -89
- package/dist/field-editor-checkbox.esm.js.map +1 -1
- package/package.json +4 -4
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,12 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
# [1.2.0](https://github.com/contentful/field-editors/compare/@contentful/field-editor-checkbox@1.1.12...@contentful/field-editor-checkbox@1.2.0) (2023-04-19)
|
|
7
|
+
|
|
8
|
+
### Features
|
|
9
|
+
|
|
10
|
+
- upgrade cypress [TOL-1036] ([#1391](https://github.com/contentful/field-editors/issues/1391)) ([9c1aec9](https://github.com/contentful/field-editors/commit/9c1aec98aabbe464cdc3f1236c3bb1cc29b8208d))
|
|
11
|
+
|
|
6
12
|
## [1.1.12](https://github.com/contentful/field-editors/compare/@contentful/field-editor-checkbox@1.1.11...@contentful/field-editor-checkbox@1.1.12) (2023-03-14)
|
|
7
13
|
|
|
8
14
|
**Note:** Version bump only for package @contentful/field-editor-checkbox
|
|
@@ -5,24 +5,24 @@ Object.defineProperty(exports, '__esModule', { value: true });
|
|
|
5
5
|
function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
|
|
6
6
|
|
|
7
7
|
var React = require('react');
|
|
8
|
+
var f36Components = require('@contentful/f36-components');
|
|
9
|
+
var fieldEditorShared = require('@contentful/field-editor-shared');
|
|
8
10
|
var emotion = require('emotion');
|
|
9
11
|
var get = _interopDefault(require('lodash/get'));
|
|
10
|
-
var fieldEditorShared = require('@contentful/field-editor-shared');
|
|
11
|
-
var f36Components = require('@contentful/f36-components');
|
|
12
|
-
var tokens = _interopDefault(require('@contentful/f36-tokens'));
|
|
13
12
|
var nanoid = require('nanoid');
|
|
13
|
+
var tokens = _interopDefault(require('@contentful/f36-tokens'));
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
const form = /*#__PURE__*/emotion.css({
|
|
16
16
|
marginTop: tokens.spacingS
|
|
17
17
|
});
|
|
18
|
-
|
|
18
|
+
const rightToLeft = /*#__PURE__*/emotion.css({
|
|
19
19
|
direction: 'rtl'
|
|
20
20
|
});
|
|
21
|
-
|
|
21
|
+
const invalidText = /*#__PURE__*/emotion.css({
|
|
22
22
|
color: tokens.red500,
|
|
23
23
|
marginLeft: tokens.spacing2Xs
|
|
24
24
|
});
|
|
25
|
-
|
|
25
|
+
const removeBtn = /*#__PURE__*/emotion.css({
|
|
26
26
|
marginLeft: tokens.spacingL
|
|
27
27
|
});
|
|
28
28
|
|
|
@@ -32,115 +32,94 @@ function isEmptyListValue(value) {
|
|
|
32
32
|
|
|
33
33
|
function getOptions(field, id) {
|
|
34
34
|
// Get first object that has a 'in' property
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
// Append a random id to distinguish between checkboxes opened in two editors (e.g. slide-in)
|
|
45
|
-
id: ['entity', field.id, field.locale, index, id].join('.'),
|
|
46
|
-
value: value,
|
|
47
|
-
label: value
|
|
48
|
-
};
|
|
49
|
-
});
|
|
35
|
+
const validations = get(field, ['items', 'validations'], []);
|
|
36
|
+
const predefinedValues = validations.filter(validation => validation.in).map(validation => validation.in);
|
|
37
|
+
const firstPredefinedValues = predefinedValues.length > 0 ? predefinedValues[0] : [];
|
|
38
|
+
return firstPredefinedValues.map((value, index) => ({
|
|
39
|
+
// Append a random id to distinguish between checkboxes opened in two editors (e.g. slide-in)
|
|
40
|
+
id: ['entity', field.id, field.locale, index, id].join('.'),
|
|
41
|
+
value,
|
|
42
|
+
label: value
|
|
43
|
+
}));
|
|
50
44
|
}
|
|
51
45
|
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
id: ['entity', field.id, field.locale, index, 'invalid'].join('.'),
|
|
61
|
-
label: value,
|
|
62
|
-
invalid: true,
|
|
63
|
-
value: value
|
|
64
|
-
};
|
|
65
|
-
});
|
|
46
|
+
const getInvalidValues = (field, values, options) => {
|
|
47
|
+
const getValueFromOptions = options.map(item => item.value);
|
|
48
|
+
const invalidValues = values.filter(value => !getValueFromOptions.includes(value)).map((value, index) => ({
|
|
49
|
+
id: ['entity', field.id, field.locale, index, 'invalid'].join('.'),
|
|
50
|
+
label: value,
|
|
51
|
+
invalid: true,
|
|
52
|
+
value
|
|
53
|
+
}));
|
|
66
54
|
return invalidValues;
|
|
67
55
|
};
|
|
68
56
|
|
|
69
57
|
function CheckboxEditor(props) {
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
var options = getOptions(field, id);
|
|
78
|
-
var misconfigured = options.length === 0;
|
|
58
|
+
const [id] = React.useState(() => nanoid.nanoid(6));
|
|
59
|
+
const {
|
|
60
|
+
field,
|
|
61
|
+
locales
|
|
62
|
+
} = props;
|
|
63
|
+
const options = getOptions(field, id);
|
|
64
|
+
const misconfigured = options.length === 0;
|
|
79
65
|
|
|
80
66
|
if (misconfigured) {
|
|
81
67
|
return React.createElement(fieldEditorShared.PredefinedValuesError, null);
|
|
82
68
|
}
|
|
83
69
|
|
|
84
|
-
|
|
70
|
+
const direction = locales.direction[field.locale] || 'ltr';
|
|
85
71
|
return React.createElement(fieldEditorShared.FieldConnector, {
|
|
86
72
|
throttle: 0,
|
|
87
73
|
isEmptyValue: isEmptyListValue,
|
|
88
74
|
field: field,
|
|
89
75
|
isInitiallyDisabled: props.isInitiallyDisabled
|
|
90
|
-
},
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
76
|
+
}, ({
|
|
77
|
+
disabled,
|
|
78
|
+
value,
|
|
79
|
+
setValue
|
|
80
|
+
}) => {
|
|
81
|
+
const values = value || [];
|
|
95
82
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
return item !== value;
|
|
99
|
-
}), [value]);
|
|
83
|
+
const addValue = value => {
|
|
84
|
+
const newValues = [...values.filter(item => item !== value), value];
|
|
100
85
|
setValue(newValues);
|
|
101
86
|
};
|
|
102
87
|
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
return item !== value;
|
|
106
|
-
});
|
|
88
|
+
const removeValue = value => {
|
|
89
|
+
const newValues = values.filter(item => item !== value);
|
|
107
90
|
setValue(newValues);
|
|
108
91
|
};
|
|
109
92
|
|
|
110
|
-
|
|
111
|
-
|
|
93
|
+
const invalidValues = getInvalidValues(field, values, options);
|
|
94
|
+
const mergedOptions = [...options, ...invalidValues];
|
|
112
95
|
return React.createElement(f36Components.Form, {
|
|
113
96
|
testId: "checkbox-editor",
|
|
114
97
|
className: emotion.cx(form, direction === 'rtl' ? rightToLeft : '')
|
|
115
|
-
}, mergedOptions.map(
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
removeValue(item.value);
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
}, item.label), item.invalid && React.createElement(React.Fragment, null, React.createElement("span", {
|
|
134
|
-
"data-test-id": "invalid-text",
|
|
135
|
-
className: invalidText
|
|
136
|
-
}, "(invalid)"), React.createElement(f36Components.TextLink, {
|
|
137
|
-
as: "button",
|
|
138
|
-
className: removeBtn,
|
|
139
|
-
onClick: function onClick() {
|
|
140
|
-
return removeValue(item.value);
|
|
98
|
+
}, mergedOptions.map(item => React.createElement(f36Components.Box, {
|
|
99
|
+
key: item.id,
|
|
100
|
+
marginBottom: "spacingS"
|
|
101
|
+
}, React.createElement(f36Components.Checkbox, {
|
|
102
|
+
key: item.id,
|
|
103
|
+
id: item.id,
|
|
104
|
+
isChecked: values.includes(item.value),
|
|
105
|
+
isDisabled: disabled,
|
|
106
|
+
value: item.value,
|
|
107
|
+
name: `${field.id}.${field.locale}`,
|
|
108
|
+
onChange: e => {
|
|
109
|
+
if (e.target.checked) {
|
|
110
|
+
addValue(item.value);
|
|
111
|
+
} else {
|
|
112
|
+
removeValue(item.value);
|
|
141
113
|
}
|
|
142
|
-
}
|
|
143
|
-
})
|
|
114
|
+
}
|
|
115
|
+
}, item.label), item.invalid && React.createElement(React.Fragment, null, React.createElement("span", {
|
|
116
|
+
"data-test-id": "invalid-text",
|
|
117
|
+
className: invalidText
|
|
118
|
+
}, "(invalid)"), React.createElement(f36Components.TextLink, {
|
|
119
|
+
as: "button",
|
|
120
|
+
className: removeBtn,
|
|
121
|
+
onClick: () => removeValue(item.value)
|
|
122
|
+
}, "Remove")))));
|
|
144
123
|
});
|
|
145
124
|
}
|
|
146
125
|
CheckboxEditor.defaultProps = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"field-editor-checkbox.cjs.development.js","sources":["../src/styles.ts","../src/CheckboxEditor.tsx"],"sourcesContent":["import { css } from 'emotion';\nimport tokens from '@contentful/f36-tokens';\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';\nimport { cx } from 'emotion';\nimport get from 'lodash/get';\nimport {\n FieldAPI,\n FieldConnector,\n LocalesAPI,\n PredefinedValuesError,\n} from '@contentful/field-editor-shared';\nimport { Checkbox, Box } from '@contentful/f36-components';\nimport * as styles from './styles';\nimport { nanoid } from 'nanoid';\n\nimport { TextLink, Form } from '@contentful/f36-components';\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","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
|
+
{"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 +1,2 @@
|
|
|
1
|
-
"use strict";function e(e){return e&&"object"==typeof e&&"default"in e?e.default:e}Object.defineProperty(exports,"__esModule",{value:!0});var
|
|
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
2
|
//# sourceMappingURL=field-editor-checkbox.cjs.production.min.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"field-editor-checkbox.cjs.production.min.js","sources":["../src/styles.ts","../src/CheckboxEditor.tsx"],"sourcesContent":["import
|
|
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,22 +1,22 @@
|
|
|
1
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';
|
|
2
4
|
import { css, cx } from 'emotion';
|
|
3
5
|
import get from 'lodash-es/get';
|
|
4
|
-
import { PredefinedValuesError, FieldConnector } from '@contentful/field-editor-shared';
|
|
5
|
-
import { Form, Box, Checkbox, TextLink } from '@contentful/f36-components';
|
|
6
|
-
import tokens from '@contentful/f36-tokens';
|
|
7
6
|
import { nanoid } from 'nanoid';
|
|
7
|
+
import tokens from '@contentful/f36-tokens';
|
|
8
8
|
|
|
9
|
-
|
|
9
|
+
const form = /*#__PURE__*/css({
|
|
10
10
|
marginTop: tokens.spacingS
|
|
11
11
|
});
|
|
12
|
-
|
|
12
|
+
const rightToLeft = /*#__PURE__*/css({
|
|
13
13
|
direction: 'rtl'
|
|
14
14
|
});
|
|
15
|
-
|
|
15
|
+
const invalidText = /*#__PURE__*/css({
|
|
16
16
|
color: tokens.red500,
|
|
17
17
|
marginLeft: tokens.spacing2Xs
|
|
18
18
|
});
|
|
19
|
-
|
|
19
|
+
const removeBtn = /*#__PURE__*/css({
|
|
20
20
|
marginLeft: tokens.spacingL
|
|
21
21
|
});
|
|
22
22
|
|
|
@@ -26,115 +26,94 @@ function isEmptyListValue(value) {
|
|
|
26
26
|
|
|
27
27
|
function getOptions(field, id) {
|
|
28
28
|
// Get first object that has a 'in' property
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
// Append a random id to distinguish between checkboxes opened in two editors (e.g. slide-in)
|
|
39
|
-
id: ['entity', field.id, field.locale, index, id].join('.'),
|
|
40
|
-
value: value,
|
|
41
|
-
label: value
|
|
42
|
-
};
|
|
43
|
-
});
|
|
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
|
+
}));
|
|
44
38
|
}
|
|
45
39
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
id: ['entity', field.id, field.locale, index, 'invalid'].join('.'),
|
|
55
|
-
label: value,
|
|
56
|
-
invalid: true,
|
|
57
|
-
value: value
|
|
58
|
-
};
|
|
59
|
-
});
|
|
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
|
+
}));
|
|
60
48
|
return invalidValues;
|
|
61
49
|
};
|
|
62
50
|
|
|
63
51
|
function CheckboxEditor(props) {
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
var options = getOptions(field, id);
|
|
72
|
-
var misconfigured = options.length === 0;
|
|
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;
|
|
73
59
|
|
|
74
60
|
if (misconfigured) {
|
|
75
61
|
return createElement(PredefinedValuesError, null);
|
|
76
62
|
}
|
|
77
63
|
|
|
78
|
-
|
|
64
|
+
const direction = locales.direction[field.locale] || 'ltr';
|
|
79
65
|
return createElement(FieldConnector, {
|
|
80
66
|
throttle: 0,
|
|
81
67
|
isEmptyValue: isEmptyListValue,
|
|
82
68
|
field: field,
|
|
83
69
|
isInitiallyDisabled: props.isInitiallyDisabled
|
|
84
|
-
},
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
70
|
+
}, ({
|
|
71
|
+
disabled,
|
|
72
|
+
value,
|
|
73
|
+
setValue
|
|
74
|
+
}) => {
|
|
75
|
+
const values = value || [];
|
|
89
76
|
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
return item !== value;
|
|
93
|
-
}), [value]);
|
|
77
|
+
const addValue = value => {
|
|
78
|
+
const newValues = [...values.filter(item => item !== value), value];
|
|
94
79
|
setValue(newValues);
|
|
95
80
|
};
|
|
96
81
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
return item !== value;
|
|
100
|
-
});
|
|
82
|
+
const removeValue = value => {
|
|
83
|
+
const newValues = values.filter(item => item !== value);
|
|
101
84
|
setValue(newValues);
|
|
102
85
|
};
|
|
103
86
|
|
|
104
|
-
|
|
105
|
-
|
|
87
|
+
const invalidValues = getInvalidValues(field, values, options);
|
|
88
|
+
const mergedOptions = [...options, ...invalidValues];
|
|
106
89
|
return createElement(Form, {
|
|
107
90
|
testId: "checkbox-editor",
|
|
108
91
|
className: cx(form, direction === 'rtl' ? rightToLeft : '')
|
|
109
|
-
}, mergedOptions.map(
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
removeValue(item.value);
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
}, item.label), item.invalid && createElement(Fragment, null, createElement("span", {
|
|
128
|
-
"data-test-id": "invalid-text",
|
|
129
|
-
className: invalidText
|
|
130
|
-
}, "(invalid)"), createElement(TextLink, {
|
|
131
|
-
as: "button",
|
|
132
|
-
className: removeBtn,
|
|
133
|
-
onClick: function onClick() {
|
|
134
|
-
return removeValue(item.value);
|
|
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);
|
|
135
107
|
}
|
|
136
|
-
}
|
|
137
|
-
})
|
|
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")))));
|
|
138
117
|
});
|
|
139
118
|
}
|
|
140
119
|
CheckboxEditor.defaultProps = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"field-editor-checkbox.esm.js","sources":["../src/styles.ts","../src/CheckboxEditor.tsx"],"sourcesContent":["import { css } from 'emotion';\nimport tokens from '@contentful/f36-tokens';\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';\nimport { cx } from 'emotion';\nimport get from 'lodash/get';\nimport {\n FieldAPI,\n FieldConnector,\n LocalesAPI,\n PredefinedValuesError,\n} from '@contentful/field-editor-shared';\nimport { Checkbox, Box } from '@contentful/f36-components';\nimport * as styles from './styles';\nimport { nanoid } from 'nanoid';\n\nimport { TextLink, Form } from '@contentful/f36-components';\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","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
|
+
{"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/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@contentful/field-editor-checkbox",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"main": "dist/index.js",
|
|
5
5
|
"module": "dist/field-editor-checkbox.esm.js",
|
|
6
6
|
"typings": "dist/index.d.ts",
|
|
@@ -23,16 +23,16 @@
|
|
|
23
23
|
"dependencies": {
|
|
24
24
|
"@contentful/f36-components": "^4.3.23",
|
|
25
25
|
"@contentful/f36-tokens": "^4.0.0",
|
|
26
|
-
"@contentful/field-editor-shared": "^1.
|
|
26
|
+
"@contentful/field-editor-shared": "^1.2.0",
|
|
27
27
|
"emotion": "^10.0.17",
|
|
28
28
|
"lodash": "^4.17.15",
|
|
29
29
|
"lodash-es": "^4.17.15"
|
|
30
30
|
},
|
|
31
31
|
"devDependencies": {
|
|
32
|
-
"@contentful/field-editor-test-utils": "^1.
|
|
32
|
+
"@contentful/field-editor-test-utils": "^1.3.0"
|
|
33
33
|
},
|
|
34
34
|
"peerDependencies": {
|
|
35
35
|
"react": ">=16.8.0"
|
|
36
36
|
},
|
|
37
|
-
"gitHead": "
|
|
37
|
+
"gitHead": "de7e74e3485dd69c240cfe9c545e6e50e41fb295"
|
|
38
38
|
}
|