@contentful/field-editor-number 1.2.6 → 1.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,251 +0,0 @@
1
- 'use strict';
2
-
3
- Object.defineProperty(exports, '__esModule', { value: true });
4
-
5
- function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
6
-
7
- var React = require('react');
8
- var f36Components = require('@contentful/f36-components');
9
- var f36Icons = require('@contentful/f36-icons');
10
- var fieldEditorShared = require('@contentful/field-editor-shared');
11
- var tokens = _interopDefault(require('@contentful/f36-tokens'));
12
- var emotion = require('emotion');
13
-
14
- const styles = {
15
- container: /*#__PURE__*/emotion.css({
16
- position: 'relative'
17
- }),
18
- controlsWrapper: /*#__PURE__*/emotion.css({
19
- position: 'absolute',
20
- top: '1px',
21
- right: '1px',
22
- width: tokens.spacingL,
23
- height: 'calc(100% - 2px)',
24
- display: 'flex',
25
- flexDirection: 'column'
26
- }),
27
- control: /*#__PURE__*/emotion.css({
28
- display: 'flex',
29
- alignItems: 'center',
30
- justifyContent: 'center',
31
- minHeight: 0,
32
- cursor: 'pointer',
33
- padding: 0,
34
- margin: 0,
35
- outline: 'none',
36
- border: `0 solid ${tokens.gray300}`,
37
- background: 'none',
38
- borderLeftWidth: '1px',
39
- '&:first-of-type': {
40
- borderTopRightRadius: tokens.borderRadiusMedium
41
- },
42
- '&:last-of-type': {
43
- borderTopWidth: '1px',
44
- borderBottomRightRadius: tokens.borderRadiusMedium
45
- },
46
- svg: {
47
- fill: tokens.gray600
48
- },
49
- '&:hover': {
50
- backgroundColor: tokens.gray200
51
- },
52
- '&:active': {
53
- backgroundColor: tokens.gray300
54
- }
55
- }),
56
- input: /*#__PURE__*/emotion.css({
57
- paddingRight: tokens.spacingXl
58
- })
59
- };
60
-
61
- function parseNumber(value, type) {
62
- if (Number.isNaN(+value)) {
63
- return;
64
- }
65
-
66
- return type === 'Integer' ? parseInt(value, 10) : parseFloat(value);
67
- }
68
- const FLOAT_REGEX = /^[+-]?([0-9]+([.][0-9]*)?|[.][0-9]*)?$/;
69
- const INT_REGEX = /^[+-]?([0-9]*)$/;
70
- function isNumberInputValueValid(value, type) {
71
- const regex = type === 'Integer' ? INT_REGEX : FLOAT_REGEX;
72
- return regex.test(value);
73
- }
74
-
75
- const getRangeFromField = field => {
76
- const validations = field.validations || [];
77
- const result = validations.find(validation => validation.range);
78
- return result ? result.range : {};
79
- };
80
- const valueToString = value => {
81
- return value === undefined ? '' : String(value);
82
- };
83
- const countDecimals = number => {
84
- var _number$toString$spli;
85
-
86
- return ((_number$toString$spli = number.toString().split('.')[1]) == null ? void 0 : _number$toString$spli.length) ?? 0;
87
- };
88
-
89
- var StepChangeType;
90
-
91
- (function (StepChangeType) {
92
- StepChangeType["Increment"] = "increment";
93
- StepChangeType["Decrement"] = "decrement";
94
- })(StepChangeType || (StepChangeType = {}));
95
-
96
- const NUMBER_STEP = 1;
97
-
98
- function InnerNumberEditor({
99
- disabled,
100
- errors,
101
- field,
102
- setValue,
103
- value: sdkValue
104
- }) {
105
- const [inputValue, setInputValue] = React.useState(valueToString(sdkValue));
106
- const range = getRangeFromField(field);
107
- const inputRef = React.useRef(null);
108
- React.useEffect(() => {
109
- const stringSdkValue = valueToString(sdkValue); // Update the input value if the SDK value (numeric) changes
110
-
111
- if (stringSdkValue !== inputValue) {
112
- setInputValue(stringSdkValue);
113
- } // eslint-disable-next-line react-hooks/exhaustive-deps -- we want to trigger it only when sdkValue has changed
114
-
115
- }, [sdkValue]);
116
-
117
- const updateExternalValue = value => {
118
- if (sdkValue !== value) {
119
- setValue(value);
120
- }
121
- };
122
-
123
- const changeValueByStep = type => {
124
- const currentValue = Number.isNaN(+inputValue) ? 0 : +inputValue;
125
- let nextValue = type === StepChangeType.Increment ? currentValue + NUMBER_STEP : currentValue - NUMBER_STEP; // Floating point numbers cannot represent all decimals precisely in binary.
126
- // This can lead to unexpected results, such as 0.1 + 0.2 = 0.30000000000000004.
127
- // See more details: https://floating-point-gui.de/
128
-
129
- nextValue = +nextValue.toFixed(countDecimals(currentValue));
130
- setInputValue(valueToString(nextValue));
131
- setValue(nextValue);
132
- }; // Keeps focus on the input
133
-
134
-
135
- const handleControlPointerDown = event => {
136
- var _inputRef$current;
137
-
138
- event.preventDefault();
139
- (_inputRef$current = inputRef.current) == null ? void 0 : _inputRef$current.focus();
140
- };
141
-
142
- const handleKeyDown = event => {
143
- const keyToFnMap = {
144
- ArrowUp: () => changeValueByStep(StepChangeType.Increment),
145
- ArrowDown: () => changeValueByStep(StepChangeType.Decrement)
146
- };
147
- const fn = keyToFnMap[event.key];
148
-
149
- if (fn) {
150
- event.preventDefault();
151
- fn();
152
- }
153
- };
154
-
155
- const handleInputChange = e => {
156
- const value = e.target.value;
157
-
158
- if (!value) {
159
- setInputValue(value);
160
- updateExternalValue(undefined);
161
- return;
162
- }
163
-
164
- if (!isNumberInputValueValid(value, field.type)) {
165
- return;
166
- }
167
-
168
- setInputValue(value);
169
- const parsedNumber = parseNumber(value, field.type);
170
- field.setInvalid(parsedNumber === undefined);
171
-
172
- if (parsedNumber !== undefined) {
173
- updateExternalValue(parsedNumber);
174
- }
175
- };
176
-
177
- return React.createElement("div", {
178
- "data-test-id": "number-editor",
179
- className: styles.container
180
- }, React.createElement(f36Components.TextInput // With type="number" react doesn't call onChange for certain inputs, for example if you type `e`
181
- // so we use "text" instead and fully rely on our own validation.
182
- // See more details: https://github.com/facebook/react/issues/6556
183
- , {
184
- // With type="number" react doesn't call onChange for certain inputs, for example if you type `e`
185
- // so we use "text" instead and fully rely on our own validation.
186
- // See more details: https://github.com/facebook/react/issues/6556
187
- type: "text",
188
- testId: "number-editor-input",
189
- className: styles.input,
190
- min: range.min,
191
- max: range.max,
192
- isRequired: field.required,
193
- isInvalid: errors.length > 0,
194
- isDisabled: disabled,
195
- value: inputValue,
196
- ref: inputRef,
197
- onChange: handleInputChange,
198
- onKeyDown: handleKeyDown,
199
- // The same role that input type="number" has
200
- // See more details: https://www.digitala11y.com/spinbutton-role/
201
- role: "spinbutton",
202
- "aria-valuenow": sdkValue ?? 0,
203
- "aria-valuetext": inputValue,
204
- "aria-valuemin": range.min,
205
- "aria-valuemax": range.max
206
- }), !disabled && React.createElement("div", {
207
- className: styles.controlsWrapper,
208
- "aria-hidden": "true"
209
- }, React.createElement("button", {
210
- tabIndex: -1,
211
- className: styles.control,
212
- onClick: () => changeValueByStep(StepChangeType.Increment),
213
- onPointerDown: handleControlPointerDown
214
- }, React.createElement(f36Icons.ArrowUpTrimmedIcon, {
215
- size: "medium"
216
- })), React.createElement("button", {
217
- tabIndex: -1,
218
- className: styles.control,
219
- onClick: () => changeValueByStep(StepChangeType.Decrement),
220
- onPointerDown: handleControlPointerDown
221
- }, React.createElement(f36Icons.ArrowDownTrimmedIcon, {
222
- size: "medium"
223
- }))));
224
- }
225
-
226
- function NumberEditor(props) {
227
- const {
228
- field
229
- } = props;
230
- return React.createElement(fieldEditorShared.FieldConnector, {
231
- field: field,
232
- isInitiallyDisabled: props.isInitiallyDisabled
233
- }, ({
234
- value,
235
- errors,
236
- disabled,
237
- setValue
238
- }) => React.createElement(InnerNumberEditor, {
239
- disabled: disabled,
240
- errors: errors,
241
- field: field,
242
- setValue: setValue,
243
- value: value
244
- }));
245
- }
246
- NumberEditor.defaultProps = {
247
- isInitiallyDisabled: true
248
- };
249
-
250
- exports.NumberEditor = NumberEditor;
251
- //# sourceMappingURL=field-editor-number.cjs.development.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"field-editor-number.cjs.development.js","sources":["../src/NumberEditor.styles.ts","../src/parseNumber.ts","../src/utils.ts","../src/NumberEditor.tsx"],"sourcesContent":["import tokens from '@contentful/f36-tokens';\nimport { css } from 'emotion';\n\nexport const styles = {\n container: css({\n position: 'relative',\n }),\n controlsWrapper: css({\n position: 'absolute',\n top: '1px',\n right: '1px',\n width: tokens.spacingL,\n height: 'calc(100% - 2px)',\n display: 'flex',\n flexDirection: 'column',\n }),\n control: css({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: 0,\n cursor: 'pointer',\n padding: 0,\n margin: 0,\n outline: 'none',\n border: `0 solid ${tokens.gray300}`,\n background: 'none',\n borderLeftWidth: '1px',\n\n '&:first-of-type': {\n borderTopRightRadius: tokens.borderRadiusMedium,\n },\n\n '&:last-of-type': {\n borderTopWidth: '1px',\n borderBottomRightRadius: tokens.borderRadiusMedium,\n },\n\n svg: {\n fill: tokens.gray600,\n },\n\n '&:hover': {\n backgroundColor: tokens.gray200,\n },\n\n '&:active': {\n backgroundColor: tokens.gray300,\n },\n }),\n input: css({\n paddingRight: tokens.spacingXl,\n }),\n};\n","export function parseNumber(value: string, type: string) {\n if (Number.isNaN(+value)) {\n return;\n }\n\n return type === 'Integer' ? parseInt(value, 10) : parseFloat(value);\n}\n\nconst FLOAT_REGEX = /^[+-]?([0-9]+([.][0-9]*)?|[.][0-9]*)?$/;\nconst INT_REGEX = /^[+-]?([0-9]*)$/;\n\nexport function isNumberInputValueValid(value: string, type: string) {\n const regex = type === 'Integer' ? INT_REGEX : FLOAT_REGEX;\n\n return regex.test(value);\n}\n","import { FieldAPI } from '@contentful/field-editor-shared';\n\ntype RangeValidation = { min?: number; max?: number };\n\nexport const getRangeFromField = (field: FieldAPI): RangeValidation => {\n const validations = field.validations || [];\n const result = validations.find((validation) => (validation as any).range) as\n | { range: RangeValidation }\n | undefined;\n return result ? result.range : {};\n};\n\nexport const valueToString = (value: number | null | undefined) => {\n return value === undefined ? '' : String(value);\n};\n\nexport const countDecimals = (number: number) => {\n return number.toString().split('.')[1]?.length ?? 0;\n};\n","import * as React from 'react';\n\nimport { TextInput } from '@contentful/f36-components';\nimport { ArrowUpTrimmedIcon, ArrowDownTrimmedIcon } from '@contentful/f36-icons';\nimport {\n FieldAPI,\n FieldConnector,\n FieldConnectorChildProps,\n} from '@contentful/field-editor-shared';\n\nimport { styles } from './NumberEditor.styles';\nimport { isNumberInputValueValid, parseNumber } from './parseNumber';\nimport { getRangeFromField, valueToString, countDecimals } from './utils';\n\nexport interface NumberEditorProps {\n /**\n * is the field disabled initially\n */\n isInitiallyDisabled: boolean;\n\n /**\n * sdk.field\n */\n field: FieldAPI;\n}\n\ntype InnerNumberEditorProps = Pick<\n FieldConnectorChildProps<number>,\n 'disabled' | 'errors' | 'setValue' | 'value'\n> & {\n field: NumberEditorProps['field'];\n};\n\nenum StepChangeType {\n Increment = 'increment',\n Decrement = 'decrement',\n}\n\nconst NUMBER_STEP = 1;\n\nfunction InnerNumberEditor({\n disabled,\n errors,\n field,\n setValue,\n value: sdkValue,\n}: InnerNumberEditorProps) {\n const [inputValue, setInputValue] = React.useState(valueToString(sdkValue));\n const range = getRangeFromField(field);\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n React.useEffect(() => {\n const stringSdkValue = valueToString(sdkValue);\n // Update the input value if the SDK value (numeric) changes\n if (stringSdkValue !== inputValue) {\n setInputValue(stringSdkValue);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps -- we want to trigger it only when sdkValue has changed\n }, [sdkValue]);\n\n const updateExternalValue = (value: number | undefined) => {\n if (sdkValue !== value) {\n setValue(value);\n }\n };\n\n const changeValueByStep = (type: StepChangeType) => {\n const currentValue = Number.isNaN(+inputValue) ? 0 : +inputValue;\n let nextValue =\n type === StepChangeType.Increment ? currentValue + NUMBER_STEP : currentValue - NUMBER_STEP;\n // Floating point numbers cannot represent all decimals precisely in binary.\n // This can lead to unexpected results, such as 0.1 + 0.2 = 0.30000000000000004.\n // See more details: https://floating-point-gui.de/\n nextValue = +nextValue.toFixed(countDecimals(currentValue));\n\n setInputValue(valueToString(nextValue));\n setValue(nextValue);\n };\n\n // Keeps focus on the input\n const handleControlPointerDown: React.PointerEventHandler<HTMLButtonElement> = (event) => {\n event.preventDefault();\n inputRef.current?.focus();\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<any>) => {\n const keyToFnMap: {\n [key: string]: () => void;\n } = {\n ArrowUp: () => changeValueByStep(StepChangeType.Increment),\n ArrowDown: () => changeValueByStep(StepChangeType.Decrement),\n };\n\n const fn = keyToFnMap[event.key];\n if (fn) {\n event.preventDefault();\n fn();\n }\n };\n\n const handleInputChange: React.ChangeEventHandler<HTMLInputElement> = (e) => {\n const value = e.target.value;\n if (!value) {\n setInputValue(value);\n updateExternalValue(undefined);\n return;\n }\n\n if (!isNumberInputValueValid(value, field.type)) {\n return;\n }\n\n setInputValue(value);\n\n const parsedNumber = parseNumber(value, field.type);\n field.setInvalid(parsedNumber === undefined);\n if (parsedNumber !== undefined) {\n updateExternalValue(parsedNumber);\n }\n };\n\n return (\n <div data-test-id=\"number-editor\" className={styles.container}>\n <TextInput\n // With type=\"number\" react doesn't call onChange for certain inputs, for example if you type `e`\n // so we use \"text\" instead and fully rely on our own validation.\n // See more details: https://github.com/facebook/react/issues/6556\n type=\"text\"\n testId=\"number-editor-input\"\n className={styles.input}\n min={range.min}\n max={range.max}\n isRequired={field.required}\n isInvalid={errors.length > 0}\n isDisabled={disabled}\n value={inputValue}\n ref={inputRef}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n // The same role that input type=\"number\" has\n // See more details: https://www.digitala11y.com/spinbutton-role/\n role=\"spinbutton\"\n aria-valuenow={sdkValue ?? 0}\n aria-valuetext={inputValue}\n aria-valuemin={range.min}\n aria-valuemax={range.max}\n />\n {/**\n * We hide this controls from screen readers and keyboard focus.\n * For those purposes we have a keyboard handler. The same way native input number works.\n */}\n {!disabled && (\n <div className={styles.controlsWrapper} aria-hidden=\"true\">\n <button\n tabIndex={-1}\n className={styles.control}\n onClick={() => changeValueByStep(StepChangeType.Increment)}\n onPointerDown={handleControlPointerDown}>\n <ArrowUpTrimmedIcon size=\"medium\" />\n </button>\n <button\n tabIndex={-1}\n className={styles.control}\n onClick={() => changeValueByStep(StepChangeType.Decrement)}\n onPointerDown={handleControlPointerDown}>\n <ArrowDownTrimmedIcon size=\"medium\" />\n </button>\n </div>\n )}\n </div>\n );\n}\n\nexport function NumberEditor(props: NumberEditorProps) {\n const { field } = props;\n\n return (\n <FieldConnector<number> field={field} isInitiallyDisabled={props.isInitiallyDisabled}>\n {({\n value,\n errors,\n disabled,\n setValue,\n }: Pick<FieldConnectorChildProps<number>, 'disabled' | 'errors' | 'setValue' | 'value'>) => (\n <InnerNumberEditor\n disabled={disabled}\n errors={errors}\n field={field}\n setValue={setValue}\n value={value}\n />\n )}\n </FieldConnector>\n );\n}\n\nNumberEditor.defaultProps = {\n isInitiallyDisabled: true,\n};\n"],"names":["styles","container","css","position","controlsWrapper","top","right","width","tokens","spacingL","height","display","flexDirection","control","alignItems","justifyContent","minHeight","cursor","padding","margin","outline","border","gray300","background","borderLeftWidth","borderTopRightRadius","borderRadiusMedium","borderTopWidth","borderBottomRightRadius","svg","fill","gray600","backgroundColor","gray200","input","paddingRight","spacingXl","parseNumber","value","type","Number","isNaN","parseInt","parseFloat","FLOAT_REGEX","INT_REGEX","isNumberInputValueValid","regex","test","getRangeFromField","field","validations","result","find","validation","range","valueToString","undefined","String","countDecimals","number","toString","split","length","StepChangeType","NUMBER_STEP","InnerNumberEditor","disabled","errors","setValue","sdkValue","inputValue","setInputValue","React","inputRef","stringSdkValue","updateExternalValue","changeValueByStep","currentValue","nextValue","Increment","toFixed","handleControlPointerDown","event","preventDefault","current","focus","handleKeyDown","keyToFnMap","ArrowUp","ArrowDown","Decrement","fn","key","handleInputChange","e","target","parsedNumber","setInvalid","className","TextInput","testId","min","max","isRequired","required","isInvalid","isDisabled","ref","onChange","onKeyDown","role","tabIndex","onClick","onPointerDown","ArrowUpTrimmedIcon","size","ArrowDownTrimmedIcon","NumberEditor","props","FieldConnector","isInitiallyDisabled","defaultProps"],"mappings":"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"}
@@ -1,2 +0,0 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e,t=require("react"),n=require("@contentful/f36-components"),r=require("@contentful/f36-icons"),i=require("@contentful/field-editor-shared"),o=(e=require("@contentful/f36-tokens"))&&"object"==typeof e&&"default"in e?e.default:e,a=require("emotion");const l={container:a.css({position:"relative"}),controlsWrapper:a.css({position:"absolute",top:"1px",right:"1px",width:o.spacingL,height:"calc(100% - 2px)",display:"flex",flexDirection:"column"}),control:a.css({display:"flex",alignItems:"center",justifyContent:"center",minHeight:0,cursor:"pointer",padding:0,margin:0,outline:"none",border:"0 solid "+o.gray300,background:"none",borderLeftWidth:"1px","&:first-of-type":{borderTopRightRadius:o.borderRadiusMedium},"&:last-of-type":{borderTopWidth:"1px",borderBottomRightRadius:o.borderRadiusMedium},svg:{fill:o.gray600},"&:hover":{backgroundColor:o.gray200},"&:active":{backgroundColor:o.gray300}}),input:a.css({paddingRight:o.spacingXl})},s=/^[+-]?([0-9]+([.][0-9]*)?|[.][0-9]*)?$/,u=/^[+-]?([0-9]*)$/,c=e=>void 0===e?"":String(e);var d;function m({disabled:e,errors:i,field:o,setValue:a,value:m}){const[p,f]=t.useState(c(m)),v=(e=>{const t=(e.validations||[]).find(e=>e.range);return t?t.range:{}})(o),b=t.useRef(null);t.useEffect(()=>{const e=c(m);e!==p&&f(e)},[m]);const g=e=>{m!==e&&a(e)},x=e=>{const t=Number.isNaN(+p)?0:+p;let n=e===d.Increment?t+1:t-1;var r,i;n=+n.toFixed((r=t,(null==(i=r.toString().split(".")[1])?void 0:i.length)??0)),f(c(n)),a(n)},y=e=>{var t;e.preventDefault(),null==(t=b.current)||t.focus()};return t.createElement("div",{"data-test-id":"number-editor",className:l.container},t.createElement(n.TextInput,{type:"text",testId:"number-editor-input",className:l.input,min:v.min,max:v.max,isRequired:o.required,isInvalid:i.length>0,isDisabled:e,value:p,ref:b,onChange:e=>{const t=e.target.value;if(!t)return f(t),void g(void 0);if(!function(e,t){return("Integer"===t?u:s).test(e)}(t,o.type))return;f(t);const n=function(e,t){if(!Number.isNaN(+e))return"Integer"===t?parseInt(e,10):parseFloat(e)}(t,o.type);o.setInvalid(void 0===n),void 0!==n&&g(n)},onKeyDown:e=>{const t={ArrowUp:()=>x(d.Increment),ArrowDown:()=>x(d.Decrement)}[e.key];t&&(e.preventDefault(),t())},role:"spinbutton","aria-valuenow":m??0,"aria-valuetext":p,"aria-valuemin":v.min,"aria-valuemax":v.max}),!e&&t.createElement("div",{className:l.controlsWrapper,"aria-hidden":"true"},t.createElement("button",{tabIndex:-1,className:l.control,onClick:()=>x(d.Increment),onPointerDown:y},t.createElement(r.ArrowUpTrimmedIcon,{size:"medium"})),t.createElement("button",{tabIndex:-1,className:l.control,onClick:()=>x(d.Decrement),onPointerDown:y},t.createElement(r.ArrowDownTrimmedIcon,{size:"medium"}))))}function p(e){const{field:n}=e;return t.createElement(i.FieldConnector,{field:n,isInitiallyDisabled:e.isInitiallyDisabled},({value:e,errors:r,disabled:i,setValue:o})=>t.createElement(m,{disabled:i,errors:r,field:n,setValue:o,value:e}))}!function(e){e.Increment="increment",e.Decrement="decrement"}(d||(d={})),p.defaultProps={isInitiallyDisabled:!0},exports.NumberEditor=p;
2
- //# sourceMappingURL=field-editor-number.cjs.production.min.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"field-editor-number.cjs.production.min.js","sources":["../src/NumberEditor.styles.ts","../src/parseNumber.ts","../src/utils.ts","../src/NumberEditor.tsx"],"sourcesContent":["import tokens from '@contentful/f36-tokens';\nimport { css } from 'emotion';\n\nexport const styles = {\n container: css({\n position: 'relative',\n }),\n controlsWrapper: css({\n position: 'absolute',\n top: '1px',\n right: '1px',\n width: tokens.spacingL,\n height: 'calc(100% - 2px)',\n display: 'flex',\n flexDirection: 'column',\n }),\n control: css({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: 0,\n cursor: 'pointer',\n padding: 0,\n margin: 0,\n outline: 'none',\n border: `0 solid ${tokens.gray300}`,\n background: 'none',\n borderLeftWidth: '1px',\n\n '&:first-of-type': {\n borderTopRightRadius: tokens.borderRadiusMedium,\n },\n\n '&:last-of-type': {\n borderTopWidth: '1px',\n borderBottomRightRadius: tokens.borderRadiusMedium,\n },\n\n svg: {\n fill: tokens.gray600,\n },\n\n '&:hover': {\n backgroundColor: tokens.gray200,\n },\n\n '&:active': {\n backgroundColor: tokens.gray300,\n },\n }),\n input: css({\n paddingRight: tokens.spacingXl,\n }),\n};\n","export function parseNumber(value: string, type: string) {\n if (Number.isNaN(+value)) {\n return;\n }\n\n return type === 'Integer' ? parseInt(value, 10) : parseFloat(value);\n}\n\nconst FLOAT_REGEX = /^[+-]?([0-9]+([.][0-9]*)?|[.][0-9]*)?$/;\nconst INT_REGEX = /^[+-]?([0-9]*)$/;\n\nexport function isNumberInputValueValid(value: string, type: string) {\n const regex = type === 'Integer' ? INT_REGEX : FLOAT_REGEX;\n\n return regex.test(value);\n}\n","import { FieldAPI } from '@contentful/field-editor-shared';\n\ntype RangeValidation = { min?: number; max?: number };\n\nexport const getRangeFromField = (field: FieldAPI): RangeValidation => {\n const validations = field.validations || [];\n const result = validations.find((validation) => (validation as any).range) as\n | { range: RangeValidation }\n | undefined;\n return result ? result.range : {};\n};\n\nexport const valueToString = (value: number | null | undefined) => {\n return value === undefined ? '' : String(value);\n};\n\nexport const countDecimals = (number: number) => {\n return number.toString().split('.')[1]?.length ?? 0;\n};\n","import * as React from 'react';\n\nimport { TextInput } from '@contentful/f36-components';\nimport { ArrowUpTrimmedIcon, ArrowDownTrimmedIcon } from '@contentful/f36-icons';\nimport {\n FieldAPI,\n FieldConnector,\n FieldConnectorChildProps,\n} from '@contentful/field-editor-shared';\n\nimport { styles } from './NumberEditor.styles';\nimport { isNumberInputValueValid, parseNumber } from './parseNumber';\nimport { getRangeFromField, valueToString, countDecimals } from './utils';\n\nexport interface NumberEditorProps {\n /**\n * is the field disabled initially\n */\n isInitiallyDisabled: boolean;\n\n /**\n * sdk.field\n */\n field: FieldAPI;\n}\n\ntype InnerNumberEditorProps = Pick<\n FieldConnectorChildProps<number>,\n 'disabled' | 'errors' | 'setValue' | 'value'\n> & {\n field: NumberEditorProps['field'];\n};\n\nenum StepChangeType {\n Increment = 'increment',\n Decrement = 'decrement',\n}\n\nconst NUMBER_STEP = 1;\n\nfunction InnerNumberEditor({\n disabled,\n errors,\n field,\n setValue,\n value: sdkValue,\n}: InnerNumberEditorProps) {\n const [inputValue, setInputValue] = React.useState(valueToString(sdkValue));\n const range = getRangeFromField(field);\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n React.useEffect(() => {\n const stringSdkValue = valueToString(sdkValue);\n // Update the input value if the SDK value (numeric) changes\n if (stringSdkValue !== inputValue) {\n setInputValue(stringSdkValue);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps -- we want to trigger it only when sdkValue has changed\n }, [sdkValue]);\n\n const updateExternalValue = (value: number | undefined) => {\n if (sdkValue !== value) {\n setValue(value);\n }\n };\n\n const changeValueByStep = (type: StepChangeType) => {\n const currentValue = Number.isNaN(+inputValue) ? 0 : +inputValue;\n let nextValue =\n type === StepChangeType.Increment ? currentValue + NUMBER_STEP : currentValue - NUMBER_STEP;\n // Floating point numbers cannot represent all decimals precisely in binary.\n // This can lead to unexpected results, such as 0.1 + 0.2 = 0.30000000000000004.\n // See more details: https://floating-point-gui.de/\n nextValue = +nextValue.toFixed(countDecimals(currentValue));\n\n setInputValue(valueToString(nextValue));\n setValue(nextValue);\n };\n\n // Keeps focus on the input\n const handleControlPointerDown: React.PointerEventHandler<HTMLButtonElement> = (event) => {\n event.preventDefault();\n inputRef.current?.focus();\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<any>) => {\n const keyToFnMap: {\n [key: string]: () => void;\n } = {\n ArrowUp: () => changeValueByStep(StepChangeType.Increment),\n ArrowDown: () => changeValueByStep(StepChangeType.Decrement),\n };\n\n const fn = keyToFnMap[event.key];\n if (fn) {\n event.preventDefault();\n fn();\n }\n };\n\n const handleInputChange: React.ChangeEventHandler<HTMLInputElement> = (e) => {\n const value = e.target.value;\n if (!value) {\n setInputValue(value);\n updateExternalValue(undefined);\n return;\n }\n\n if (!isNumberInputValueValid(value, field.type)) {\n return;\n }\n\n setInputValue(value);\n\n const parsedNumber = parseNumber(value, field.type);\n field.setInvalid(parsedNumber === undefined);\n if (parsedNumber !== undefined) {\n updateExternalValue(parsedNumber);\n }\n };\n\n return (\n <div data-test-id=\"number-editor\" className={styles.container}>\n <TextInput\n // With type=\"number\" react doesn't call onChange for certain inputs, for example if you type `e`\n // so we use \"text\" instead and fully rely on our own validation.\n // See more details: https://github.com/facebook/react/issues/6556\n type=\"text\"\n testId=\"number-editor-input\"\n className={styles.input}\n min={range.min}\n max={range.max}\n isRequired={field.required}\n isInvalid={errors.length > 0}\n isDisabled={disabled}\n value={inputValue}\n ref={inputRef}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n // The same role that input type=\"number\" has\n // See more details: https://www.digitala11y.com/spinbutton-role/\n role=\"spinbutton\"\n aria-valuenow={sdkValue ?? 0}\n aria-valuetext={inputValue}\n aria-valuemin={range.min}\n aria-valuemax={range.max}\n />\n {/**\n * We hide this controls from screen readers and keyboard focus.\n * For those purposes we have a keyboard handler. The same way native input number works.\n */}\n {!disabled && (\n <div className={styles.controlsWrapper} aria-hidden=\"true\">\n <button\n tabIndex={-1}\n className={styles.control}\n onClick={() => changeValueByStep(StepChangeType.Increment)}\n onPointerDown={handleControlPointerDown}>\n <ArrowUpTrimmedIcon size=\"medium\" />\n </button>\n <button\n tabIndex={-1}\n className={styles.control}\n onClick={() => changeValueByStep(StepChangeType.Decrement)}\n onPointerDown={handleControlPointerDown}>\n <ArrowDownTrimmedIcon size=\"medium\" />\n </button>\n </div>\n )}\n </div>\n );\n}\n\nexport function NumberEditor(props: NumberEditorProps) {\n const { field } = props;\n\n return (\n <FieldConnector<number> field={field} isInitiallyDisabled={props.isInitiallyDisabled}>\n {({\n value,\n errors,\n disabled,\n setValue,\n }: Pick<FieldConnectorChildProps<number>, 'disabled' | 'errors' | 'setValue' | 'value'>) => (\n <InnerNumberEditor\n disabled={disabled}\n errors={errors}\n field={field}\n setValue={setValue}\n value={value}\n />\n )}\n </FieldConnector>\n );\n}\n\nNumberEditor.defaultProps = {\n isInitiallyDisabled: true,\n};\n"],"names":["styles","container","css","position","controlsWrapper","top","right","width","tokens","spacingL","height","display","flexDirection","control","alignItems","justifyContent","minHeight","cursor","padding","margin","outline","border","gray300","background","borderLeftWidth","borderTopRightRadius","borderRadiusMedium","borderTopWidth","borderBottomRightRadius","svg","fill","gray600","backgroundColor","gray200","input","paddingRight","spacingXl","FLOAT_REGEX","INT_REGEX","valueToString","value","undefined","String","StepChangeType","InnerNumberEditor","disabled","errors","field","setValue","sdkValue","inputValue","setInputValue","React","range","result","validations","find","validation","getRangeFromField","inputRef","stringSdkValue","updateExternalValue","changeValueByStep","type","currentValue","Number","isNaN","nextValue","Increment","number","toFixed","toString","split","length","handleControlPointerDown","event","preventDefault","current","focus","className","TextInput","testId","min","max","isRequired","required","isInvalid","isDisabled","ref","onChange","e","target","test","isNumberInputValueValid","parsedNumber","parseInt","parseFloat","parseNumber","setInvalid","onKeyDown","fn","ArrowUp","ArrowDown","Decrement","key","role","tabIndex","onClick","onPointerDown","ArrowUpTrimmedIcon","size","ArrowDownTrimmedIcon","NumberEditor","props","FieldConnector","isInitiallyDisabled","defaultProps"],"mappings":"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"}
@@ -1,245 +0,0 @@
1
- import { createElement, useState, useRef, useEffect } from 'react';
2
- import { TextInput } from '@contentful/f36-components';
3
- import { ArrowUpTrimmedIcon, ArrowDownTrimmedIcon } from '@contentful/f36-icons';
4
- import { FieldConnector } from '@contentful/field-editor-shared';
5
- import tokens from '@contentful/f36-tokens';
6
- import { css } from 'emotion';
7
-
8
- const styles = {
9
- container: /*#__PURE__*/css({
10
- position: 'relative'
11
- }),
12
- controlsWrapper: /*#__PURE__*/css({
13
- position: 'absolute',
14
- top: '1px',
15
- right: '1px',
16
- width: tokens.spacingL,
17
- height: 'calc(100% - 2px)',
18
- display: 'flex',
19
- flexDirection: 'column'
20
- }),
21
- control: /*#__PURE__*/css({
22
- display: 'flex',
23
- alignItems: 'center',
24
- justifyContent: 'center',
25
- minHeight: 0,
26
- cursor: 'pointer',
27
- padding: 0,
28
- margin: 0,
29
- outline: 'none',
30
- border: `0 solid ${tokens.gray300}`,
31
- background: 'none',
32
- borderLeftWidth: '1px',
33
- '&:first-of-type': {
34
- borderTopRightRadius: tokens.borderRadiusMedium
35
- },
36
- '&:last-of-type': {
37
- borderTopWidth: '1px',
38
- borderBottomRightRadius: tokens.borderRadiusMedium
39
- },
40
- svg: {
41
- fill: tokens.gray600
42
- },
43
- '&:hover': {
44
- backgroundColor: tokens.gray200
45
- },
46
- '&:active': {
47
- backgroundColor: tokens.gray300
48
- }
49
- }),
50
- input: /*#__PURE__*/css({
51
- paddingRight: tokens.spacingXl
52
- })
53
- };
54
-
55
- function parseNumber(value, type) {
56
- if (Number.isNaN(+value)) {
57
- return;
58
- }
59
-
60
- return type === 'Integer' ? parseInt(value, 10) : parseFloat(value);
61
- }
62
- const FLOAT_REGEX = /^[+-]?([0-9]+([.][0-9]*)?|[.][0-9]*)?$/;
63
- const INT_REGEX = /^[+-]?([0-9]*)$/;
64
- function isNumberInputValueValid(value, type) {
65
- const regex = type === 'Integer' ? INT_REGEX : FLOAT_REGEX;
66
- return regex.test(value);
67
- }
68
-
69
- const getRangeFromField = field => {
70
- const validations = field.validations || [];
71
- const result = validations.find(validation => validation.range);
72
- return result ? result.range : {};
73
- };
74
- const valueToString = value => {
75
- return value === undefined ? '' : String(value);
76
- };
77
- const countDecimals = number => {
78
- var _number$toString$spli;
79
-
80
- return ((_number$toString$spli = number.toString().split('.')[1]) == null ? void 0 : _number$toString$spli.length) ?? 0;
81
- };
82
-
83
- var StepChangeType;
84
-
85
- (function (StepChangeType) {
86
- StepChangeType["Increment"] = "increment";
87
- StepChangeType["Decrement"] = "decrement";
88
- })(StepChangeType || (StepChangeType = {}));
89
-
90
- const NUMBER_STEP = 1;
91
-
92
- function InnerNumberEditor({
93
- disabled,
94
- errors,
95
- field,
96
- setValue,
97
- value: sdkValue
98
- }) {
99
- const [inputValue, setInputValue] = useState(valueToString(sdkValue));
100
- const range = getRangeFromField(field);
101
- const inputRef = useRef(null);
102
- useEffect(() => {
103
- const stringSdkValue = valueToString(sdkValue); // Update the input value if the SDK value (numeric) changes
104
-
105
- if (stringSdkValue !== inputValue) {
106
- setInputValue(stringSdkValue);
107
- } // eslint-disable-next-line react-hooks/exhaustive-deps -- we want to trigger it only when sdkValue has changed
108
-
109
- }, [sdkValue]);
110
-
111
- const updateExternalValue = value => {
112
- if (sdkValue !== value) {
113
- setValue(value);
114
- }
115
- };
116
-
117
- const changeValueByStep = type => {
118
- const currentValue = Number.isNaN(+inputValue) ? 0 : +inputValue;
119
- let nextValue = type === StepChangeType.Increment ? currentValue + NUMBER_STEP : currentValue - NUMBER_STEP; // Floating point numbers cannot represent all decimals precisely in binary.
120
- // This can lead to unexpected results, such as 0.1 + 0.2 = 0.30000000000000004.
121
- // See more details: https://floating-point-gui.de/
122
-
123
- nextValue = +nextValue.toFixed(countDecimals(currentValue));
124
- setInputValue(valueToString(nextValue));
125
- setValue(nextValue);
126
- }; // Keeps focus on the input
127
-
128
-
129
- const handleControlPointerDown = event => {
130
- var _inputRef$current;
131
-
132
- event.preventDefault();
133
- (_inputRef$current = inputRef.current) == null ? void 0 : _inputRef$current.focus();
134
- };
135
-
136
- const handleKeyDown = event => {
137
- const keyToFnMap = {
138
- ArrowUp: () => changeValueByStep(StepChangeType.Increment),
139
- ArrowDown: () => changeValueByStep(StepChangeType.Decrement)
140
- };
141
- const fn = keyToFnMap[event.key];
142
-
143
- if (fn) {
144
- event.preventDefault();
145
- fn();
146
- }
147
- };
148
-
149
- const handleInputChange = e => {
150
- const value = e.target.value;
151
-
152
- if (!value) {
153
- setInputValue(value);
154
- updateExternalValue(undefined);
155
- return;
156
- }
157
-
158
- if (!isNumberInputValueValid(value, field.type)) {
159
- return;
160
- }
161
-
162
- setInputValue(value);
163
- const parsedNumber = parseNumber(value, field.type);
164
- field.setInvalid(parsedNumber === undefined);
165
-
166
- if (parsedNumber !== undefined) {
167
- updateExternalValue(parsedNumber);
168
- }
169
- };
170
-
171
- return createElement("div", {
172
- "data-test-id": "number-editor",
173
- className: styles.container
174
- }, createElement(TextInput // With type="number" react doesn't call onChange for certain inputs, for example if you type `e`
175
- // so we use "text" instead and fully rely on our own validation.
176
- // See more details: https://github.com/facebook/react/issues/6556
177
- , {
178
- // With type="number" react doesn't call onChange for certain inputs, for example if you type `e`
179
- // so we use "text" instead and fully rely on our own validation.
180
- // See more details: https://github.com/facebook/react/issues/6556
181
- type: "text",
182
- testId: "number-editor-input",
183
- className: styles.input,
184
- min: range.min,
185
- max: range.max,
186
- isRequired: field.required,
187
- isInvalid: errors.length > 0,
188
- isDisabled: disabled,
189
- value: inputValue,
190
- ref: inputRef,
191
- onChange: handleInputChange,
192
- onKeyDown: handleKeyDown,
193
- // The same role that input type="number" has
194
- // See more details: https://www.digitala11y.com/spinbutton-role/
195
- role: "spinbutton",
196
- "aria-valuenow": sdkValue ?? 0,
197
- "aria-valuetext": inputValue,
198
- "aria-valuemin": range.min,
199
- "aria-valuemax": range.max
200
- }), !disabled && createElement("div", {
201
- className: styles.controlsWrapper,
202
- "aria-hidden": "true"
203
- }, createElement("button", {
204
- tabIndex: -1,
205
- className: styles.control,
206
- onClick: () => changeValueByStep(StepChangeType.Increment),
207
- onPointerDown: handleControlPointerDown
208
- }, createElement(ArrowUpTrimmedIcon, {
209
- size: "medium"
210
- })), createElement("button", {
211
- tabIndex: -1,
212
- className: styles.control,
213
- onClick: () => changeValueByStep(StepChangeType.Decrement),
214
- onPointerDown: handleControlPointerDown
215
- }, createElement(ArrowDownTrimmedIcon, {
216
- size: "medium"
217
- }))));
218
- }
219
-
220
- function NumberEditor(props) {
221
- const {
222
- field
223
- } = props;
224
- return createElement(FieldConnector, {
225
- field: field,
226
- isInitiallyDisabled: props.isInitiallyDisabled
227
- }, ({
228
- value,
229
- errors,
230
- disabled,
231
- setValue
232
- }) => createElement(InnerNumberEditor, {
233
- disabled: disabled,
234
- errors: errors,
235
- field: field,
236
- setValue: setValue,
237
- value: value
238
- }));
239
- }
240
- NumberEditor.defaultProps = {
241
- isInitiallyDisabled: true
242
- };
243
-
244
- export { NumberEditor };
245
- //# sourceMappingURL=field-editor-number.esm.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"field-editor-number.esm.js","sources":["../src/NumberEditor.styles.ts","../src/parseNumber.ts","../src/utils.ts","../src/NumberEditor.tsx"],"sourcesContent":["import tokens from '@contentful/f36-tokens';\nimport { css } from 'emotion';\n\nexport const styles = {\n container: css({\n position: 'relative',\n }),\n controlsWrapper: css({\n position: 'absolute',\n top: '1px',\n right: '1px',\n width: tokens.spacingL,\n height: 'calc(100% - 2px)',\n display: 'flex',\n flexDirection: 'column',\n }),\n control: css({\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n minHeight: 0,\n cursor: 'pointer',\n padding: 0,\n margin: 0,\n outline: 'none',\n border: `0 solid ${tokens.gray300}`,\n background: 'none',\n borderLeftWidth: '1px',\n\n '&:first-of-type': {\n borderTopRightRadius: tokens.borderRadiusMedium,\n },\n\n '&:last-of-type': {\n borderTopWidth: '1px',\n borderBottomRightRadius: tokens.borderRadiusMedium,\n },\n\n svg: {\n fill: tokens.gray600,\n },\n\n '&:hover': {\n backgroundColor: tokens.gray200,\n },\n\n '&:active': {\n backgroundColor: tokens.gray300,\n },\n }),\n input: css({\n paddingRight: tokens.spacingXl,\n }),\n};\n","export function parseNumber(value: string, type: string) {\n if (Number.isNaN(+value)) {\n return;\n }\n\n return type === 'Integer' ? parseInt(value, 10) : parseFloat(value);\n}\n\nconst FLOAT_REGEX = /^[+-]?([0-9]+([.][0-9]*)?|[.][0-9]*)?$/;\nconst INT_REGEX = /^[+-]?([0-9]*)$/;\n\nexport function isNumberInputValueValid(value: string, type: string) {\n const regex = type === 'Integer' ? INT_REGEX : FLOAT_REGEX;\n\n return regex.test(value);\n}\n","import { FieldAPI } from '@contentful/field-editor-shared';\n\ntype RangeValidation = { min?: number; max?: number };\n\nexport const getRangeFromField = (field: FieldAPI): RangeValidation => {\n const validations = field.validations || [];\n const result = validations.find((validation) => (validation as any).range) as\n | { range: RangeValidation }\n | undefined;\n return result ? result.range : {};\n};\n\nexport const valueToString = (value: number | null | undefined) => {\n return value === undefined ? '' : String(value);\n};\n\nexport const countDecimals = (number: number) => {\n return number.toString().split('.')[1]?.length ?? 0;\n};\n","import * as React from 'react';\n\nimport { TextInput } from '@contentful/f36-components';\nimport { ArrowUpTrimmedIcon, ArrowDownTrimmedIcon } from '@contentful/f36-icons';\nimport {\n FieldAPI,\n FieldConnector,\n FieldConnectorChildProps,\n} from '@contentful/field-editor-shared';\n\nimport { styles } from './NumberEditor.styles';\nimport { isNumberInputValueValid, parseNumber } from './parseNumber';\nimport { getRangeFromField, valueToString, countDecimals } from './utils';\n\nexport interface NumberEditorProps {\n /**\n * is the field disabled initially\n */\n isInitiallyDisabled: boolean;\n\n /**\n * sdk.field\n */\n field: FieldAPI;\n}\n\ntype InnerNumberEditorProps = Pick<\n FieldConnectorChildProps<number>,\n 'disabled' | 'errors' | 'setValue' | 'value'\n> & {\n field: NumberEditorProps['field'];\n};\n\nenum StepChangeType {\n Increment = 'increment',\n Decrement = 'decrement',\n}\n\nconst NUMBER_STEP = 1;\n\nfunction InnerNumberEditor({\n disabled,\n errors,\n field,\n setValue,\n value: sdkValue,\n}: InnerNumberEditorProps) {\n const [inputValue, setInputValue] = React.useState(valueToString(sdkValue));\n const range = getRangeFromField(field);\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n React.useEffect(() => {\n const stringSdkValue = valueToString(sdkValue);\n // Update the input value if the SDK value (numeric) changes\n if (stringSdkValue !== inputValue) {\n setInputValue(stringSdkValue);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps -- we want to trigger it only when sdkValue has changed\n }, [sdkValue]);\n\n const updateExternalValue = (value: number | undefined) => {\n if (sdkValue !== value) {\n setValue(value);\n }\n };\n\n const changeValueByStep = (type: StepChangeType) => {\n const currentValue = Number.isNaN(+inputValue) ? 0 : +inputValue;\n let nextValue =\n type === StepChangeType.Increment ? currentValue + NUMBER_STEP : currentValue - NUMBER_STEP;\n // Floating point numbers cannot represent all decimals precisely in binary.\n // This can lead to unexpected results, such as 0.1 + 0.2 = 0.30000000000000004.\n // See more details: https://floating-point-gui.de/\n nextValue = +nextValue.toFixed(countDecimals(currentValue));\n\n setInputValue(valueToString(nextValue));\n setValue(nextValue);\n };\n\n // Keeps focus on the input\n const handleControlPointerDown: React.PointerEventHandler<HTMLButtonElement> = (event) => {\n event.preventDefault();\n inputRef.current?.focus();\n };\n\n const handleKeyDown = (event: React.KeyboardEvent<any>) => {\n const keyToFnMap: {\n [key: string]: () => void;\n } = {\n ArrowUp: () => changeValueByStep(StepChangeType.Increment),\n ArrowDown: () => changeValueByStep(StepChangeType.Decrement),\n };\n\n const fn = keyToFnMap[event.key];\n if (fn) {\n event.preventDefault();\n fn();\n }\n };\n\n const handleInputChange: React.ChangeEventHandler<HTMLInputElement> = (e) => {\n const value = e.target.value;\n if (!value) {\n setInputValue(value);\n updateExternalValue(undefined);\n return;\n }\n\n if (!isNumberInputValueValid(value, field.type)) {\n return;\n }\n\n setInputValue(value);\n\n const parsedNumber = parseNumber(value, field.type);\n field.setInvalid(parsedNumber === undefined);\n if (parsedNumber !== undefined) {\n updateExternalValue(parsedNumber);\n }\n };\n\n return (\n <div data-test-id=\"number-editor\" className={styles.container}>\n <TextInput\n // With type=\"number\" react doesn't call onChange for certain inputs, for example if you type `e`\n // so we use \"text\" instead and fully rely on our own validation.\n // See more details: https://github.com/facebook/react/issues/6556\n type=\"text\"\n testId=\"number-editor-input\"\n className={styles.input}\n min={range.min}\n max={range.max}\n isRequired={field.required}\n isInvalid={errors.length > 0}\n isDisabled={disabled}\n value={inputValue}\n ref={inputRef}\n onChange={handleInputChange}\n onKeyDown={handleKeyDown}\n // The same role that input type=\"number\" has\n // See more details: https://www.digitala11y.com/spinbutton-role/\n role=\"spinbutton\"\n aria-valuenow={sdkValue ?? 0}\n aria-valuetext={inputValue}\n aria-valuemin={range.min}\n aria-valuemax={range.max}\n />\n {/**\n * We hide this controls from screen readers and keyboard focus.\n * For those purposes we have a keyboard handler. The same way native input number works.\n */}\n {!disabled && (\n <div className={styles.controlsWrapper} aria-hidden=\"true\">\n <button\n tabIndex={-1}\n className={styles.control}\n onClick={() => changeValueByStep(StepChangeType.Increment)}\n onPointerDown={handleControlPointerDown}>\n <ArrowUpTrimmedIcon size=\"medium\" />\n </button>\n <button\n tabIndex={-1}\n className={styles.control}\n onClick={() => changeValueByStep(StepChangeType.Decrement)}\n onPointerDown={handleControlPointerDown}>\n <ArrowDownTrimmedIcon size=\"medium\" />\n </button>\n </div>\n )}\n </div>\n );\n}\n\nexport function NumberEditor(props: NumberEditorProps) {\n const { field } = props;\n\n return (\n <FieldConnector<number> field={field} isInitiallyDisabled={props.isInitiallyDisabled}>\n {({\n value,\n errors,\n disabled,\n setValue,\n }: Pick<FieldConnectorChildProps<number>, 'disabled' | 'errors' | 'setValue' | 'value'>) => (\n <InnerNumberEditor\n disabled={disabled}\n errors={errors}\n field={field}\n setValue={setValue}\n value={value}\n />\n )}\n </FieldConnector>\n );\n}\n\nNumberEditor.defaultProps = {\n isInitiallyDisabled: true,\n};\n"],"names":["styles","container","css","position","controlsWrapper","top","right","width","tokens","spacingL","height","display","flexDirection","control","alignItems","justifyContent","minHeight","cursor","padding","margin","outline","border","gray300","background","borderLeftWidth","borderTopRightRadius","borderRadiusMedium","borderTopWidth","borderBottomRightRadius","svg","fill","gray600","backgroundColor","gray200","input","paddingRight","spacingXl","parseNumber","value","type","Number","isNaN","parseInt","parseFloat","FLOAT_REGEX","INT_REGEX","isNumberInputValueValid","regex","test","getRangeFromField","field","validations","result","find","validation","range","valueToString","undefined","String","countDecimals","number","toString","split","length","StepChangeType","NUMBER_STEP","InnerNumberEditor","disabled","errors","setValue","sdkValue","inputValue","setInputValue","React","inputRef","stringSdkValue","updateExternalValue","changeValueByStep","currentValue","nextValue","Increment","toFixed","handleControlPointerDown","event","preventDefault","current","focus","handleKeyDown","keyToFnMap","ArrowUp","ArrowDown","Decrement","fn","key","handleInputChange","e","target","parsedNumber","setInvalid","className","TextInput","testId","min","max","isRequired","required","isInvalid","isDisabled","ref","onChange","onKeyDown","role","tabIndex","onClick","onPointerDown","ArrowUpTrimmedIcon","size","ArrowDownTrimmedIcon","NumberEditor","props","FieldConnector","isInitiallyDisabled","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-number.cjs.production.min.js')
6
- } else {
7
- module.exports = require('./field-editor-number.cjs.development.js')
8
- }