matsuri-ui 16.4.1-alpha-1730523981168-c515c28.0 → 16.4.1-alpha-1731062187882-f223060.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/NumberField/NumberField.js +25 -3
- package/NumberField/NumberField.js.map +1 -1
- package/cjs/NumberField/NumberField.js +24 -2
- package/cjs/NumberField/NumberField.js.map +1 -1
- package/esm/NumberField/NumberField.js +25 -3
- package/esm/NumberField/NumberField.js.map +1 -1
- package/package.json +4 -4
|
@@ -12,11 +12,30 @@ import { useFieldGroup } from "../FieldGroup";
|
|
|
12
12
|
import { useInputValue } from "../hooks/useInputValue";
|
|
13
13
|
import { useMergeRefs } from "../hooks/useMergeRefs";
|
|
14
14
|
import { useValidation } from "../FieldBase/useValidation";
|
|
15
|
-
import React, { forwardRef, useCallback, useContext, useId, useRef, useState } from "react";
|
|
15
|
+
import React, { forwardRef, useCallback, useContext, useId, useMemo, useRef, useState } from "react";
|
|
16
16
|
import { jsx as ___EmotionJSX } from "@emotion/react";
|
|
17
17
|
var toLocaleValue = (value, locale, options) => {
|
|
18
18
|
return value === undefined ? "" : value.toLocaleString(locale, options);
|
|
19
19
|
};
|
|
20
|
+
var equalNumber = (a, b) => {
|
|
21
|
+
if (a === b) {
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
24
|
+
// NaNとNaNはtrueにならないが等しいとみなす
|
|
25
|
+
if (Number.isNaN(a) && Number.isNaN(b)) {
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
return false;
|
|
29
|
+
};
|
|
30
|
+
var additionalValidations = [value => {
|
|
31
|
+
if (Number.isNaN(value)) {
|
|
32
|
+
if (navigator && /^ja\b/.test(navigator.language)) {
|
|
33
|
+
return "不正でない数値を入力してください";
|
|
34
|
+
}
|
|
35
|
+
return "Enter a valid number";
|
|
36
|
+
}
|
|
37
|
+
return;
|
|
38
|
+
}];
|
|
20
39
|
export var NumberField = /*#__PURE__*/forwardRef((props, rootRef) => {
|
|
21
40
|
var {
|
|
22
41
|
validationMessages,
|
|
@@ -56,10 +75,13 @@ export var NumberField = /*#__PURE__*/forwardRef((props, rootRef) => {
|
|
|
56
75
|
}
|
|
57
76
|
}
|
|
58
77
|
});
|
|
78
|
+
var mergedCustomValidations = useMemo(() => {
|
|
79
|
+
return customValidations ? [...customValidations, ...additionalValidations] : additionalValidations;
|
|
80
|
+
}, [customValidations]);
|
|
59
81
|
var validation = useValidation({
|
|
60
82
|
ref,
|
|
61
83
|
validationMessages,
|
|
62
|
-
customValidations,
|
|
84
|
+
customValidations: mergedCustomValidations,
|
|
63
85
|
value
|
|
64
86
|
});
|
|
65
87
|
|
|
@@ -68,7 +90,7 @@ export var NumberField = /*#__PURE__*/forwardRef((props, rootRef) => {
|
|
|
68
90
|
|
|
69
91
|
// 制御コンポーネントとして扱われる場合、外部からの値の変更を検知してinput要素の値を更新する。
|
|
70
92
|
var prevPropsValue = useRef(props.value);
|
|
71
|
-
if (isControlled &&
|
|
93
|
+
if (isControlled && !equalNumber(value, prevPropsValue.current)) {
|
|
72
94
|
prevPropsValue.current = props.value;
|
|
73
95
|
setInputValue(value === undefined ? "" : "" + value);
|
|
74
96
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NumberField.js","names":["FormControl","FormHelperText","InputBase","InputLabel","LocaleContext","NumberFieldInputWrapper","NumberFieldInputWrapperContext","useDitectInputTouched","useFieldGroup","useInputValue","useMergeRefs","useValidation","React","forwardRef","useCallback","useContext","useId","useRef","useState","jsx","___EmotionJSX","toLocaleValue","value","locale","options","undefined","toLocaleString","NumberField","props","rootRef","validationMessages","customValidations","style","className","label","onChange","onFocus","defaultValue","disabled","readOnly","propsReadOnly","loading","propsLoading","helperText","invalid","max","Number","MAX_SAFE_INTEGER","min","MIN_SAFE_INTEGER","step","id","inputRef","others","_objectWithoutPropertiesLoose","_excluded","ref","refs","setValue","isControlled","onLoaded","validation","inputValue","setInputValue","prevPropsValue","current","handleBlur","touched","touchedProps","handleChange","event","currentTarget","next","handleWheel","blur","internalInputId","inputId","required","htmlFor","Provider","type","_extends","renderInputWrapper","onBlur","onWheel","valid","message"],"sources":["../../../src/NumberField/NumberField.tsx"],"sourcesContent":["import { FieldProps } from \"../FieldBase\";\nimport { FormControl } from \"../FormControl\";\nimport { FormHelperText } from \"../FieldBase/FormHelperText\";\nimport { InputBase, InputBaseProps } from \"../InputBase\";\nimport { InputLabel } from \"../InputLabel\";\nimport { LocaleContext } from \"../LocaleProvider\";\nimport {\n NumberFieldInputWrapper,\n NumberFieldInputWrapperContext,\n} from \"./NumberFieldInputWrapper\";\nimport { NumberFormatOptions } from \"./NumberFormatOptions\";\nimport { useDitectInputTouched } from \"../FieldBase/useDitectInputTouched\";\nimport { useFieldGroup } from \"../FieldGroup\";\nimport { useInputValue } from \"../hooks/useInputValue\";\nimport { useMergeRefs } from \"../hooks/useMergeRefs\";\nimport { useValidation } from \"../FieldBase/useValidation\";\nimport React, {\n forwardRef,\n useCallback,\n useContext,\n useId,\n useRef,\n useState,\n} from \"react\";\n\ninterface CommonNumberFieldProps\n extends Omit<InputBaseProps, \"defaultValue\" | \"value\" | \"onChange\"> {\n /**\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NumberFormat\n */\n options?: NumberFormatOptions;\n type?: never;\n children?: never;\n /**\n * 入力が受け付ける最大値を指定します。\n *\n * @default Number.MAX_SAFE_INTEGER\n */\n max?: number;\n /**\n * 入力が受け付ける最小値を指定します。\n *\n * @default Number.MIN_SAFE_INTEGER\n */\n min?: number;\n}\n\nexport interface NumberFieldProps\n extends FieldProps<number | undefined>,\n CommonNumberFieldProps {}\n\nconst toLocaleValue = (\n value?: number,\n locale?: string,\n options?: NumberFormatOptions,\n): string | undefined => {\n return value === undefined ? \"\" : value.toLocaleString(locale, options);\n};\n\nexport const NumberField = forwardRef<\n HTMLDivElement,\n Readonly<NumberFieldProps>\n>((props, rootRef) => {\n const {\n validationMessages,\n customValidations,\n style,\n className,\n label,\n options,\n onChange,\n onFocus,\n defaultValue,\n disabled,\n\n value: _propsValue,\n readOnly: propsReadOnly,\n loading: propsLoading,\n helperText,\n invalid,\n max = Number.MAX_SAFE_INTEGER,\n min = Number.MIN_SAFE_INTEGER,\n step = 1,\n id,\n inputRef,\n ...others\n } = props;\n const locale = useContext(LocaleContext);\n const ref = useRef<HTMLInputElement>(null);\n const refs = useMergeRefs(inputRef, ref);\n\n const [value, setValue, isControlled] = useInputValue(props);\n const { loading, readOnly } = useFieldGroup({\n loading: propsLoading,\n readOnly: propsReadOnly,\n onLoaded: () => {\n if (isControlled === false) {\n setValue(defaultValue);\n }\n },\n });\n\n const validation = useValidation({\n ref,\n validationMessages,\n customValidations,\n value,\n });\n\n // input要素の実際の値を管理している。これにより、`.0`や`.20`など入力途中の表示を維持できる。\n const [inputValue, setInputValue] = useState(\n value === undefined ? \"\" : `${value}`,\n );\n\n // 制御コンポーネントとして扱われる場合、外部からの値の変更を検知してinput要素の値を更新する。\n const prevPropsValue = useRef(props.value);\n if (isControlled && props.value !== prevPropsValue.current) {\n prevPropsValue.current = props.value;\n setInputValue(value === undefined ? \"\" : `${value}`);\n }\n\n // フォーカスが外れた場合、入力途中の値を破棄するためにinputValueを更新する\n const handleBlur = useCallback(() => {\n setInputValue(value === undefined ? \"\" : `${value}`);\n }, [value]);\n\n const [touched, touchedProps] = useDitectInputTouched(onFocus);\n\n const handleChange = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n const { value } = event.currentTarget;\n\n const next = value === \"\" ? undefined : Number(value);\n setInputValue(value);\n setValue(next);\n if (onChange) {\n onChange(next, event);\n }\n },\n [onChange, setValue],\n );\n\n const handleWheel: React.WheelEventHandler<HTMLInputElement> = useCallback(\n (event) => {\n event.currentTarget.blur();\n },\n [],\n );\n\n const internalInputId = useId();\n const inputId = id ?? internalInputId;\n\n return (\n <FormControl style={style} className={className} ref={rootRef}>\n <InputLabel\n aria-disabled={disabled}\n required={props.required}\n loading={loading}\n htmlFor={inputId}\n >\n {label}\n </InputLabel>\n <NumberFieldInputWrapperContext.Provider\n value={\n validation.type === \"badInput\"\n ? \"Invalid number\"\n : toLocaleValue(value, locale, options)\n }\n >\n <InputBase\n loading={loading}\n disabled={disabled}\n id={inputId}\n ref={refs}\n type=\"number\"\n renderInputWrapper={NumberFieldInputWrapper}\n value={inputValue}\n onChange={handleChange}\n onBlur={handleBlur}\n onWheel={handleWheel}\n readOnly={readOnly}\n data-invalid={!validation.valid}\n max={max}\n min={min}\n step={step}\n {...others}\n {...touchedProps}\n />\n </NumberFieldInputWrapperContext.Provider>\n\n <FormHelperText\n invalid={!validation.valid || invalid}\n loading={loading}\n touched={touched}\n value={value}\n >\n {\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n validation.message || helperText\n }\n </FormHelperText>\n </FormControl>\n );\n});\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"NumberField.js","names":["FormControl","FormHelperText","InputBase","InputLabel","LocaleContext","NumberFieldInputWrapper","NumberFieldInputWrapperContext","useDitectInputTouched","useFieldGroup","useInputValue","useMergeRefs","useValidation","React","forwardRef","useCallback","useContext","useId","useMemo","useRef","useState","jsx","___EmotionJSX","toLocaleValue","value","locale","options","undefined","toLocaleString","equalNumber","a","b","Number","isNaN","additionalValidations","navigator","test","language","NumberField","props","rootRef","validationMessages","customValidations","style","className","label","onChange","onFocus","defaultValue","disabled","readOnly","propsReadOnly","loading","propsLoading","helperText","invalid","max","MAX_SAFE_INTEGER","min","MIN_SAFE_INTEGER","step","id","inputRef","others","_objectWithoutPropertiesLoose","_excluded","ref","refs","setValue","isControlled","onLoaded","mergedCustomValidations","validation","inputValue","setInputValue","prevPropsValue","current","handleBlur","touched","touchedProps","handleChange","event","currentTarget","next","handleWheel","blur","internalInputId","inputId","required","htmlFor","Provider","type","_extends","renderInputWrapper","onBlur","onWheel","valid","message"],"sources":["../../../src/NumberField/NumberField.tsx"],"sourcesContent":["import { FieldProps } from \"../FieldBase\";\nimport { FormControl } from \"../FormControl\";\nimport { FormHelperText } from \"../FieldBase/FormHelperText\";\nimport { InputBase, InputBaseProps } from \"../InputBase\";\nimport { InputLabel } from \"../InputLabel\";\nimport { LocaleContext } from \"../LocaleProvider\";\nimport {\n NumberFieldInputWrapper,\n NumberFieldInputWrapperContext,\n} from \"./NumberFieldInputWrapper\";\nimport { NumberFormatOptions } from \"./NumberFormatOptions\";\nimport { useDitectInputTouched } from \"../FieldBase/useDitectInputTouched\";\nimport { useFieldGroup } from \"../FieldGroup\";\nimport { useInputValue } from \"../hooks/useInputValue\";\nimport { useMergeRefs } from \"../hooks/useMergeRefs\";\nimport { useValidation } from \"../FieldBase/useValidation\";\nimport React, {\n forwardRef,\n useCallback,\n useContext,\n useId,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\ninterface CommonNumberFieldProps\n extends Omit<InputBaseProps, \"defaultValue\" | \"value\" | \"onChange\"> {\n /**\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NumberFormat\n */\n options?: NumberFormatOptions;\n type?: never;\n children?: never;\n /**\n * 入力が受け付ける最大値を指定します。\n *\n * @default Number.MAX_SAFE_INTEGER\n */\n max?: number;\n /**\n * 入力が受け付ける最小値を指定します。\n *\n * @default Number.MIN_SAFE_INTEGER\n */\n min?: number;\n}\n\nexport interface NumberFieldProps\n extends FieldProps<number | undefined>,\n CommonNumberFieldProps {}\n\nconst toLocaleValue = (\n value?: number,\n locale?: string,\n options?: NumberFormatOptions,\n): string | undefined => {\n return value === undefined ? \"\" : value.toLocaleString(locale, options);\n};\n\nconst equalNumber = (a: number | undefined, b: number | undefined): boolean => {\n if (a === b) {\n return true;\n }\n // NaNとNaNはtrueにならないが等しいとみなす\n if (Number.isNaN(a) && Number.isNaN(b)) {\n return true;\n }\n return false;\n};\n\nconst additionalValidations = [\n (value?: number) => {\n if (Number.isNaN(value)) {\n if (navigator && /^ja\\b/.test(navigator.language)) {\n return \"不正でない数値を入力してください\";\n }\n return \"Enter a valid number\";\n }\n return;\n },\n] satisfies NumberFieldProps[\"customValidations\"];\n\nexport const NumberField = forwardRef<\n HTMLDivElement,\n Readonly<NumberFieldProps>\n>((props, rootRef) => {\n const {\n validationMessages,\n customValidations,\n style,\n className,\n label,\n options,\n onChange,\n onFocus,\n defaultValue,\n disabled,\n\n value: _propsValue,\n readOnly: propsReadOnly,\n loading: propsLoading,\n helperText,\n invalid,\n max = Number.MAX_SAFE_INTEGER,\n min = Number.MIN_SAFE_INTEGER,\n step = 1,\n id,\n inputRef,\n ...others\n } = props;\n const locale = useContext(LocaleContext);\n const ref = useRef<HTMLInputElement>(null);\n const refs = useMergeRefs(inputRef, ref);\n\n const [value, setValue, isControlled] = useInputValue(props);\n const { loading, readOnly } = useFieldGroup({\n loading: propsLoading,\n readOnly: propsReadOnly,\n onLoaded: () => {\n if (isControlled === false) {\n setValue(defaultValue);\n }\n },\n });\n\n const mergedCustomValidations = useMemo(() => {\n return customValidations\n ? [...customValidations, ...additionalValidations]\n : additionalValidations;\n }, [customValidations]);\n\n const validation = useValidation({\n ref,\n validationMessages,\n customValidations: mergedCustomValidations,\n value,\n });\n\n // input要素の実際の値を管理している。これにより、`.0`や`.20`など入力途中の表示を維持できる。\n const [inputValue, setInputValue] = useState(\n value === undefined ? \"\" : `${value}`,\n );\n\n // 制御コンポーネントとして扱われる場合、外部からの値の変更を検知してinput要素の値を更新する。\n const prevPropsValue = useRef(props.value);\n\n if (isControlled && !equalNumber(value, prevPropsValue.current)) {\n prevPropsValue.current = props.value;\n setInputValue(value === undefined ? \"\" : `${value}`);\n }\n\n // フォーカスが外れた場合、入力途中の値を破棄するためにinputValueを更新する\n const handleBlur = useCallback(() => {\n setInputValue(value === undefined ? \"\" : `${value}`);\n }, [value]);\n\n const [touched, touchedProps] = useDitectInputTouched(onFocus);\n\n const handleChange = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n const { value } = event.currentTarget;\n\n const next = value === \"\" ? undefined : Number(value);\n setInputValue(value);\n setValue(next);\n if (onChange) {\n onChange(next, event);\n }\n },\n [onChange, setValue],\n );\n\n const handleWheel: React.WheelEventHandler<HTMLInputElement> = useCallback(\n (event) => {\n event.currentTarget.blur();\n },\n [],\n );\n\n const internalInputId = useId();\n const inputId = id ?? internalInputId;\n\n return (\n <FormControl style={style} className={className} ref={rootRef}>\n <InputLabel\n aria-disabled={disabled}\n required={props.required}\n loading={loading}\n htmlFor={inputId}\n >\n {label}\n </InputLabel>\n <NumberFieldInputWrapperContext.Provider\n value={\n validation.type === \"badInput\"\n ? \"Invalid number\"\n : toLocaleValue(value, locale, options)\n }\n >\n <InputBase\n loading={loading}\n disabled={disabled}\n id={inputId}\n ref={refs}\n type=\"number\"\n renderInputWrapper={NumberFieldInputWrapper}\n value={inputValue}\n onChange={handleChange}\n onBlur={handleBlur}\n onWheel={handleWheel}\n readOnly={readOnly}\n data-invalid={!validation.valid}\n max={max}\n min={min}\n step={step}\n {...others}\n {...touchedProps}\n />\n </NumberFieldInputWrapperContext.Provider>\n\n <FormHelperText\n invalid={!validation.valid || invalid}\n loading={loading}\n touched={touched}\n value={value}\n >\n {\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n validation.message || helperText\n }\n </FormHelperText>\n </FormControl>\n );\n});\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -21,6 +21,25 @@ function _extends() { return _extends = Object.assign ? Object.assign.bind() : f
|
|
|
21
21
|
const toLocaleValue = (value, locale, options) => {
|
|
22
22
|
return value === undefined ? "" : value.toLocaleString(locale, options);
|
|
23
23
|
};
|
|
24
|
+
const equalNumber = (a, b) => {
|
|
25
|
+
if (a === b) {
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
// NaNとNaNはtrueにならないが等しいとみなす
|
|
29
|
+
if (Number.isNaN(a) && Number.isNaN(b)) {
|
|
30
|
+
return true;
|
|
31
|
+
}
|
|
32
|
+
return false;
|
|
33
|
+
};
|
|
34
|
+
const additionalValidations = [value => {
|
|
35
|
+
if (Number.isNaN(value)) {
|
|
36
|
+
if (navigator && /^ja\b/.test(navigator.language)) {
|
|
37
|
+
return "不正でない数値を入力してください";
|
|
38
|
+
}
|
|
39
|
+
return "Enter a valid number";
|
|
40
|
+
}
|
|
41
|
+
return;
|
|
42
|
+
}];
|
|
24
43
|
const NumberField = exports.NumberField = /*#__PURE__*/(0, _react.forwardRef)((props, rootRef) => {
|
|
25
44
|
const {
|
|
26
45
|
validationMessages,
|
|
@@ -61,10 +80,13 @@ const NumberField = exports.NumberField = /*#__PURE__*/(0, _react.forwardRef)((p
|
|
|
61
80
|
}
|
|
62
81
|
}
|
|
63
82
|
});
|
|
83
|
+
const mergedCustomValidations = (0, _react.useMemo)(() => {
|
|
84
|
+
return customValidations ? [...customValidations, ...additionalValidations] : additionalValidations;
|
|
85
|
+
}, [customValidations]);
|
|
64
86
|
const validation = (0, _useValidation.useValidation)({
|
|
65
87
|
ref,
|
|
66
88
|
validationMessages,
|
|
67
|
-
customValidations,
|
|
89
|
+
customValidations: mergedCustomValidations,
|
|
68
90
|
value
|
|
69
91
|
});
|
|
70
92
|
|
|
@@ -73,7 +95,7 @@ const NumberField = exports.NumberField = /*#__PURE__*/(0, _react.forwardRef)((p
|
|
|
73
95
|
|
|
74
96
|
// 制御コンポーネントとして扱われる場合、外部からの値の変更を検知してinput要素の値を更新する。
|
|
75
97
|
const prevPropsValue = (0, _react.useRef)(props.value);
|
|
76
|
-
if (isControlled &&
|
|
98
|
+
if (isControlled && !equalNumber(value, prevPropsValue.current)) {
|
|
77
99
|
prevPropsValue.current = props.value;
|
|
78
100
|
setInputValue(value === undefined ? "" : `${value}`);
|
|
79
101
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NumberField.js","names":["_FormControl","require","_FormHelperText","_InputBase","_InputLabel","_LocaleProvider","_NumberFieldInputWrapper","_useDitectInputTouched","_FieldGroup","_useInputValue","_useMergeRefs","_useValidation","_react","_interopRequireWildcard","_react2","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","_extends","assign","bind","arguments","length","apply","toLocaleValue","value","locale","options","undefined","toLocaleString","NumberField","exports","forwardRef","props","rootRef","validationMessages","customValidations","style","className","label","onChange","onFocus","defaultValue","disabled","_propsValue","readOnly","propsReadOnly","loading","propsLoading","helperText","invalid","max","Number","MAX_SAFE_INTEGER","min","MIN_SAFE_INTEGER","step","id","inputRef","others","useContext","LocaleContext","ref","useRef","refs","useMergeRefs","setValue","isControlled","useInputValue","useFieldGroup","onLoaded","validation","useValidation","inputValue","setInputValue","useState","prevPropsValue","current","handleBlur","useCallback","touched","touchedProps","useDitectInputTouched","handleChange","event","currentTarget","next","handleWheel","blur","internalInputId","useId","inputId","jsx","FormControl","InputLabel","required","htmlFor","NumberFieldInputWrapperContext","Provider","type","InputBase","renderInputWrapper","NumberFieldInputWrapper","onBlur","onWheel","valid","FormHelperText","message"],"sources":["../../../src/NumberField/NumberField.tsx"],"sourcesContent":["import { FieldProps } from \"../FieldBase\";\nimport { FormControl } from \"../FormControl\";\nimport { FormHelperText } from \"../FieldBase/FormHelperText\";\nimport { InputBase, InputBaseProps } from \"../InputBase\";\nimport { InputLabel } from \"../InputLabel\";\nimport { LocaleContext } from \"../LocaleProvider\";\nimport {\n NumberFieldInputWrapper,\n NumberFieldInputWrapperContext,\n} from \"./NumberFieldInputWrapper\";\nimport { NumberFormatOptions } from \"./NumberFormatOptions\";\nimport { useDitectInputTouched } from \"../FieldBase/useDitectInputTouched\";\nimport { useFieldGroup } from \"../FieldGroup\";\nimport { useInputValue } from \"../hooks/useInputValue\";\nimport { useMergeRefs } from \"../hooks/useMergeRefs\";\nimport { useValidation } from \"../FieldBase/useValidation\";\nimport React, {\n forwardRef,\n useCallback,\n useContext,\n useId,\n useRef,\n useState,\n} from \"react\";\n\ninterface CommonNumberFieldProps\n extends Omit<InputBaseProps, \"defaultValue\" | \"value\" | \"onChange\"> {\n /**\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NumberFormat\n */\n options?: NumberFormatOptions;\n type?: never;\n children?: never;\n /**\n * 入力が受け付ける最大値を指定します。\n *\n * @default Number.MAX_SAFE_INTEGER\n */\n max?: number;\n /**\n * 入力が受け付ける最小値を指定します。\n *\n * @default Number.MIN_SAFE_INTEGER\n */\n min?: number;\n}\n\nexport interface NumberFieldProps\n extends FieldProps<number | undefined>,\n CommonNumberFieldProps {}\n\nconst toLocaleValue = (\n value?: number,\n locale?: string,\n options?: NumberFormatOptions,\n): string | undefined => {\n return value === undefined ? \"\" : value.toLocaleString(locale, options);\n};\n\nexport const NumberField = forwardRef<\n HTMLDivElement,\n Readonly<NumberFieldProps>\n>((props, rootRef) => {\n const {\n validationMessages,\n customValidations,\n style,\n className,\n label,\n options,\n onChange,\n onFocus,\n defaultValue,\n disabled,\n\n value: _propsValue,\n readOnly: propsReadOnly,\n loading: propsLoading,\n helperText,\n invalid,\n max = Number.MAX_SAFE_INTEGER,\n min = Number.MIN_SAFE_INTEGER,\n step = 1,\n id,\n inputRef,\n ...others\n } = props;\n const locale = useContext(LocaleContext);\n const ref = useRef<HTMLInputElement>(null);\n const refs = useMergeRefs(inputRef, ref);\n\n const [value, setValue, isControlled] = useInputValue(props);\n const { loading, readOnly } = useFieldGroup({\n loading: propsLoading,\n readOnly: propsReadOnly,\n onLoaded: () => {\n if (isControlled === false) {\n setValue(defaultValue);\n }\n },\n });\n\n const validation = useValidation({\n ref,\n validationMessages,\n customValidations,\n value,\n });\n\n // input要素の実際の値を管理している。これにより、`.0`や`.20`など入力途中の表示を維持できる。\n const [inputValue, setInputValue] = useState(\n value === undefined ? \"\" : `${value}`,\n );\n\n // 制御コンポーネントとして扱われる場合、外部からの値の変更を検知してinput要素の値を更新する。\n const prevPropsValue = useRef(props.value);\n if (isControlled && props.value !== prevPropsValue.current) {\n prevPropsValue.current = props.value;\n setInputValue(value === undefined ? \"\" : `${value}`);\n }\n\n // フォーカスが外れた場合、入力途中の値を破棄するためにinputValueを更新する\n const handleBlur = useCallback(() => {\n setInputValue(value === undefined ? \"\" : `${value}`);\n }, [value]);\n\n const [touched, touchedProps] = useDitectInputTouched(onFocus);\n\n const handleChange = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n const { value } = event.currentTarget;\n\n const next = value === \"\" ? undefined : Number(value);\n setInputValue(value);\n setValue(next);\n if (onChange) {\n onChange(next, event);\n }\n },\n [onChange, setValue],\n );\n\n const handleWheel: React.WheelEventHandler<HTMLInputElement> = useCallback(\n (event) => {\n event.currentTarget.blur();\n },\n [],\n );\n\n const internalInputId = useId();\n const inputId = id ?? internalInputId;\n\n return (\n <FormControl style={style} className={className} ref={rootRef}>\n <InputLabel\n aria-disabled={disabled}\n required={props.required}\n loading={loading}\n htmlFor={inputId}\n >\n {label}\n </InputLabel>\n <NumberFieldInputWrapperContext.Provider\n value={\n validation.type === \"badInput\"\n ? \"Invalid number\"\n : toLocaleValue(value, locale, options)\n }\n >\n <InputBase\n loading={loading}\n disabled={disabled}\n id={inputId}\n ref={refs}\n type=\"number\"\n renderInputWrapper={NumberFieldInputWrapper}\n value={inputValue}\n onChange={handleChange}\n onBlur={handleBlur}\n onWheel={handleWheel}\n readOnly={readOnly}\n data-invalid={!validation.valid}\n max={max}\n min={min}\n step={step}\n {...others}\n {...touchedProps}\n />\n </NumberFieldInputWrapperContext.Provider>\n\n <FormHelperText\n invalid={!validation.valid || invalid}\n loading={loading}\n touched={touched}\n value={value}\n >\n {\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n validation.message || helperText\n }\n </FormHelperText>\n </FormControl>\n );\n});\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"NumberField.js","names":["_FormControl","require","_FormHelperText","_InputBase","_InputLabel","_LocaleProvider","_NumberFieldInputWrapper","_useDitectInputTouched","_FieldGroup","_useInputValue","_useMergeRefs","_useValidation","_react","_interopRequireWildcard","_react2","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","_extends","assign","bind","arguments","length","apply","toLocaleValue","value","locale","options","undefined","toLocaleString","equalNumber","b","Number","isNaN","additionalValidations","navigator","test","language","NumberField","exports","forwardRef","props","rootRef","validationMessages","customValidations","style","className","label","onChange","onFocus","defaultValue","disabled","_propsValue","readOnly","propsReadOnly","loading","propsLoading","helperText","invalid","max","MAX_SAFE_INTEGER","min","MIN_SAFE_INTEGER","step","id","inputRef","others","useContext","LocaleContext","ref","useRef","refs","useMergeRefs","setValue","isControlled","useInputValue","useFieldGroup","onLoaded","mergedCustomValidations","useMemo","validation","useValidation","inputValue","setInputValue","useState","prevPropsValue","current","handleBlur","useCallback","touched","touchedProps","useDitectInputTouched","handleChange","event","currentTarget","next","handleWheel","blur","internalInputId","useId","inputId","jsx","FormControl","InputLabel","required","htmlFor","NumberFieldInputWrapperContext","Provider","type","InputBase","renderInputWrapper","NumberFieldInputWrapper","onBlur","onWheel","valid","FormHelperText","message"],"sources":["../../../src/NumberField/NumberField.tsx"],"sourcesContent":["import { FieldProps } from \"../FieldBase\";\nimport { FormControl } from \"../FormControl\";\nimport { FormHelperText } from \"../FieldBase/FormHelperText\";\nimport { InputBase, InputBaseProps } from \"../InputBase\";\nimport { InputLabel } from \"../InputLabel\";\nimport { LocaleContext } from \"../LocaleProvider\";\nimport {\n NumberFieldInputWrapper,\n NumberFieldInputWrapperContext,\n} from \"./NumberFieldInputWrapper\";\nimport { NumberFormatOptions } from \"./NumberFormatOptions\";\nimport { useDitectInputTouched } from \"../FieldBase/useDitectInputTouched\";\nimport { useFieldGroup } from \"../FieldGroup\";\nimport { useInputValue } from \"../hooks/useInputValue\";\nimport { useMergeRefs } from \"../hooks/useMergeRefs\";\nimport { useValidation } from \"../FieldBase/useValidation\";\nimport React, {\n forwardRef,\n useCallback,\n useContext,\n useId,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\ninterface CommonNumberFieldProps\n extends Omit<InputBaseProps, \"defaultValue\" | \"value\" | \"onChange\"> {\n /**\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NumberFormat\n */\n options?: NumberFormatOptions;\n type?: never;\n children?: never;\n /**\n * 入力が受け付ける最大値を指定します。\n *\n * @default Number.MAX_SAFE_INTEGER\n */\n max?: number;\n /**\n * 入力が受け付ける最小値を指定します。\n *\n * @default Number.MIN_SAFE_INTEGER\n */\n min?: number;\n}\n\nexport interface NumberFieldProps\n extends FieldProps<number | undefined>,\n CommonNumberFieldProps {}\n\nconst toLocaleValue = (\n value?: number,\n locale?: string,\n options?: NumberFormatOptions,\n): string | undefined => {\n return value === undefined ? \"\" : value.toLocaleString(locale, options);\n};\n\nconst equalNumber = (a: number | undefined, b: number | undefined): boolean => {\n if (a === b) {\n return true;\n }\n // NaNとNaNはtrueにならないが等しいとみなす\n if (Number.isNaN(a) && Number.isNaN(b)) {\n return true;\n }\n return false;\n};\n\nconst additionalValidations = [\n (value?: number) => {\n if (Number.isNaN(value)) {\n if (navigator && /^ja\\b/.test(navigator.language)) {\n return \"不正でない数値を入力してください\";\n }\n return \"Enter a valid number\";\n }\n return;\n },\n] satisfies NumberFieldProps[\"customValidations\"];\n\nexport const NumberField = forwardRef<\n HTMLDivElement,\n Readonly<NumberFieldProps>\n>((props, rootRef) => {\n const {\n validationMessages,\n customValidations,\n style,\n className,\n label,\n options,\n onChange,\n onFocus,\n defaultValue,\n disabled,\n\n value: _propsValue,\n readOnly: propsReadOnly,\n loading: propsLoading,\n helperText,\n invalid,\n max = Number.MAX_SAFE_INTEGER,\n min = Number.MIN_SAFE_INTEGER,\n step = 1,\n id,\n inputRef,\n ...others\n } = props;\n const locale = useContext(LocaleContext);\n const ref = useRef<HTMLInputElement>(null);\n const refs = useMergeRefs(inputRef, ref);\n\n const [value, setValue, isControlled] = useInputValue(props);\n const { loading, readOnly } = useFieldGroup({\n loading: propsLoading,\n readOnly: propsReadOnly,\n onLoaded: () => {\n if (isControlled === false) {\n setValue(defaultValue);\n }\n },\n });\n\n const mergedCustomValidations = useMemo(() => {\n return customValidations\n ? [...customValidations, ...additionalValidations]\n : additionalValidations;\n }, [customValidations]);\n\n const validation = useValidation({\n ref,\n validationMessages,\n customValidations: mergedCustomValidations,\n value,\n });\n\n // input要素の実際の値を管理している。これにより、`.0`や`.20`など入力途中の表示を維持できる。\n const [inputValue, setInputValue] = useState(\n value === undefined ? \"\" : `${value}`,\n );\n\n // 制御コンポーネントとして扱われる場合、外部からの値の変更を検知してinput要素の値を更新する。\n const prevPropsValue = useRef(props.value);\n\n if (isControlled && !equalNumber(value, prevPropsValue.current)) {\n prevPropsValue.current = props.value;\n setInputValue(value === undefined ? \"\" : `${value}`);\n }\n\n // フォーカスが外れた場合、入力途中の値を破棄するためにinputValueを更新する\n const handleBlur = useCallback(() => {\n setInputValue(value === undefined ? \"\" : `${value}`);\n }, [value]);\n\n const [touched, touchedProps] = useDitectInputTouched(onFocus);\n\n const handleChange = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n const { value } = event.currentTarget;\n\n const next = value === \"\" ? undefined : Number(value);\n setInputValue(value);\n setValue(next);\n if (onChange) {\n onChange(next, event);\n }\n },\n [onChange, setValue],\n );\n\n const handleWheel: React.WheelEventHandler<HTMLInputElement> = useCallback(\n (event) => {\n event.currentTarget.blur();\n },\n [],\n );\n\n const internalInputId = useId();\n const inputId = id ?? internalInputId;\n\n return (\n <FormControl style={style} className={className} ref={rootRef}>\n <InputLabel\n aria-disabled={disabled}\n required={props.required}\n loading={loading}\n htmlFor={inputId}\n >\n {label}\n </InputLabel>\n <NumberFieldInputWrapperContext.Provider\n value={\n validation.type === \"badInput\"\n ? \"Invalid number\"\n : toLocaleValue(value, locale, options)\n }\n >\n <InputBase\n loading={loading}\n disabled={disabled}\n id={inputId}\n ref={refs}\n type=\"number\"\n renderInputWrapper={NumberFieldInputWrapper}\n value={inputValue}\n onChange={handleChange}\n onBlur={handleBlur}\n onWheel={handleWheel}\n readOnly={readOnly}\n data-invalid={!validation.valid}\n max={max}\n min={min}\n step={step}\n {...others}\n {...touchedProps}\n />\n </NumberFieldInputWrapperContext.Provider>\n\n <FormHelperText\n invalid={!validation.valid || invalid}\n loading={loading}\n touched={touched}\n value={value}\n >\n {\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n validation.message || helperText\n }\n </FormHelperText>\n </FormControl>\n );\n});\n"],"mappings":";;;;AACA,IAAAA,YAAA,GAAAC,OAAA;AACA,IAAAC,eAAA,GAAAD,OAAA;AACA,IAAAE,UAAA,GAAAF,OAAA;AACA,IAAAG,WAAA,GAAAH,OAAA;AACA,IAAAI,eAAA,GAAAJ,OAAA;AACA,IAAAK,wBAAA,GAAAL,OAAA;AAKA,IAAAM,sBAAA,GAAAN,OAAA;AACA,IAAAO,WAAA,GAAAP,OAAA;AACA,IAAAQ,cAAA,GAAAR,OAAA;AACA,IAAAS,aAAA,GAAAT,OAAA;AACA,IAAAU,cAAA,GAAAV,OAAA;AACA,IAAAW,MAAA,GAAAC,uBAAA,CAAAZ,OAAA;AAQe,IAAAa,OAAA,GAAAb,OAAA;AAAA,SAAAc,yBAAAC,CAAA,6BAAAC,OAAA,mBAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAF,wBAAA,YAAAA,CAAAC,CAAA,WAAAA,CAAA,GAAAG,CAAA,GAAAD,CAAA,KAAAF,CAAA;AAAA,SAAAH,wBAAAG,CAAA,EAAAE,CAAA,SAAAA,CAAA,IAAAF,CAAA,IAAAA,CAAA,CAAAI,UAAA,SAAAJ,CAAA,eAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,WAAAK,OAAA,EAAAL,CAAA,QAAAG,CAAA,GAAAJ,wBAAA,CAAAG,CAAA,OAAAC,CAAA,IAAAA,CAAA,CAAAG,GAAA,CAAAN,CAAA,UAAAG,CAAA,CAAAI,GAAA,CAAAP,CAAA,OAAAQ,CAAA,KAAAC,SAAA,UAAAC,CAAA,GAAAC,MAAA,CAAAC,cAAA,IAAAD,MAAA,CAAAE,wBAAA,WAAAC,CAAA,IAAAd,CAAA,oBAAAc,CAAA,OAAAC,cAAA,CAAAC,IAAA,CAAAhB,CAAA,EAAAc,CAAA,SAAAG,CAAA,GAAAP,CAAA,GAAAC,MAAA,CAAAE,wBAAA,CAAAb,CAAA,EAAAc,CAAA,UAAAG,CAAA,KAAAA,CAAA,CAAAV,GAAA,IAAAU,CAAA,CAAAC,GAAA,IAAAP,MAAA,CAAAC,cAAA,CAAAJ,CAAA,EAAAM,CAAA,EAAAG,CAAA,IAAAT,CAAA,CAAAM,CAAA,IAAAd,CAAA,CAAAc,CAAA,YAAAN,CAAA,CAAAH,OAAA,GAAAL,CAAA,EAAAG,CAAA,IAAAA,CAAA,CAAAe,GAAA,CAAAlB,CAAA,EAAAQ,CAAA,GAAAA,CAAA;AAAA,SAAAW,SAAA,WAAAA,QAAA,GAAAR,MAAA,CAAAS,MAAA,GAAAT,MAAA,CAAAS,MAAA,CAAAC,IAAA,eAAAb,CAAA,aAAAR,CAAA,MAAAA,CAAA,GAAAsB,SAAA,CAAAC,MAAA,EAAAvB,CAAA,UAAAG,CAAA,GAAAmB,SAAA,CAAAtB,CAAA,YAAAE,CAAA,IAAAC,CAAA,OAAAY,cAAA,CAAAC,IAAA,CAAAb,CAAA,EAAAD,CAAA,MAAAM,CAAA,CAAAN,CAAA,IAAAC,CAAA,CAAAD,CAAA,aAAAM,CAAA,KAAAW,QAAA,CAAAK,KAAA,OAAAF,SAAA;AA4Bf,MAAMG,aAAa,GAAGA,CACpBC,KAAc,EACdC,MAAe,EACfC,OAA6B,KACN;EACvB,OAAOF,KAAK,KAAKG,SAAS,GAAG,EAAE,GAAGH,KAAK,CAACI,cAAc,CAACH,MAAM,EAAEC,OAAO,CAAC;AACzE,CAAC;AAED,MAAMG,WAAW,GAAGA,CAACrB,CAAqB,EAAEsB,CAAqB,KAAc;EAC7E,IAAItB,CAAC,KAAKsB,CAAC,EAAE;IACX,OAAO,IAAI;EACb;EACA;EACA,IAAIC,MAAM,CAACC,KAAK,CAACxB,CAAC,CAAC,IAAIuB,MAAM,CAACC,KAAK,CAACF,CAAC,CAAC,EAAE;IACtC,OAAO,IAAI;EACb;EACA,OAAO,KAAK;AACd,CAAC;AAED,MAAMG,qBAAqB,GAAG,CAC3BT,KAAc,IAAK;EAClB,IAAIO,MAAM,CAACC,KAAK,CAACR,KAAK,CAAC,EAAE;IACvB,IAAIU,SAAS,IAAI,OAAO,CAACC,IAAI,CAACD,SAAS,CAACE,QAAQ,CAAC,EAAE;MACjD,OAAO,kBAAkB;IAC3B;IACA,OAAO,sBAAsB;EAC/B;EACA;AACF,CAAC,CAC8C;AAE1C,MAAMC,WAAW,GAAAC,OAAA,CAAAD,WAAA,gBAAG,IAAAE,iBAAU,EAGnC,CAACC,KAAK,EAAEC,OAAO,KAAK;EACpB,MAAM;IACJC,kBAAkB;IAClBC,iBAAiB;IACjBC,KAAK;IACLC,SAAS;IACTC,KAAK;IACLpB,OAAO;IACPqB,QAAQ;IACRC,OAAO;IACPC,YAAY;IACZC,QAAQ;IAER1B,KAAK,EAAE2B,WAAW;IAClBC,QAAQ,EAAEC,aAAa;IACvBC,OAAO,EAAEC,YAAY;IACrBC,UAAU;IACVC,OAAO;IACPC,GAAG,GAAG3B,MAAM,CAAC4B,gBAAgB;IAC7BC,GAAG,GAAG7B,MAAM,CAAC8B,gBAAgB;IAC7BC,IAAI,GAAG,CAAC;IACRC,EAAE;IACFC,QAAQ;IACR,GAAGC;EACL,CAAC,GAAGzB,KAAK;EACT,MAAMf,MAAM,GAAG,IAAAyC,iBAAU,EAACC,6BAAa,CAAC;EACxC,MAAMC,GAAG,GAAG,IAAAC,aAAM,EAAmB,IAAI,CAAC;EAC1C,MAAMC,IAAI,GAAG,IAAAC,0BAAY,EAACP,QAAQ,EAAEI,GAAG,CAAC;EAExC,MAAM,CAAC5C,KAAK,EAAEgD,QAAQ,EAAEC,YAAY,CAAC,GAAG,IAAAC,4BAAa,EAAClC,KAAK,CAAC;EAC5D,MAAM;IAAEc,OAAO;IAAEF;EAAS,CAAC,GAAG,IAAAuB,yBAAa,EAAC;IAC1CrB,OAAO,EAAEC,YAAY;IACrBH,QAAQ,EAAEC,aAAa;IACvBuB,QAAQ,EAAEA,CAAA,KAAM;MACd,IAAIH,YAAY,KAAK,KAAK,EAAE;QAC1BD,QAAQ,CAACvB,YAAY,CAAC;MACxB;IACF;EACF,CAAC,CAAC;EAEF,MAAM4B,uBAAuB,GAAG,IAAAC,cAAO,EAAC,MAAM;IAC5C,OAAOnC,iBAAiB,GACpB,CAAC,GAAGA,iBAAiB,EAAE,GAAGV,qBAAqB,CAAC,GAChDA,qBAAqB;EAC3B,CAAC,EAAE,CAACU,iBAAiB,CAAC,CAAC;EAEvB,MAAMoC,UAAU,GAAG,IAAAC,4BAAa,EAAC;IAC/BZ,GAAG;IACH1B,kBAAkB;IAClBC,iBAAiB,EAAEkC,uBAAuB;IAC1CrD;EACF,CAAC,CAAC;;EAEF;EACA,MAAM,CAACyD,UAAU,EAAEC,aAAa,CAAC,GAAG,IAAAC,eAAQ,EAC1C3D,KAAK,KAAKG,SAAS,GAAG,EAAE,GAAG,GAAGH,KAAK,EACrC,CAAC;;EAED;EACA,MAAM4D,cAAc,GAAG,IAAAf,aAAM,EAAC7B,KAAK,CAAChB,KAAK,CAAC;EAE1C,IAAIiD,YAAY,IAAI,CAAC5C,WAAW,CAACL,KAAK,EAAE4D,cAAc,CAACC,OAAO,CAAC,EAAE;IAC/DD,cAAc,CAACC,OAAO,GAAG7C,KAAK,CAAChB,KAAK;IACpC0D,aAAa,CAAC1D,KAAK,KAAKG,SAAS,GAAG,EAAE,GAAG,GAAGH,KAAK,EAAE,CAAC;EACtD;;EAEA;EACA,MAAM8D,UAAU,GAAG,IAAAC,kBAAW,EAAC,MAAM;IACnCL,aAAa,CAAC1D,KAAK,KAAKG,SAAS,GAAG,EAAE,GAAG,GAAGH,KAAK,EAAE,CAAC;EACtD,CAAC,EAAE,CAACA,KAAK,CAAC,CAAC;EAEX,MAAM,CAACgE,OAAO,EAAEC,YAAY,CAAC,GAAG,IAAAC,4CAAqB,EAAC1C,OAAO,CAAC;EAE9D,MAAM2C,YAAY,GAAG,IAAAJ,kBAAW,EAC7BK,KAA0C,IAAK;IAC9C,MAAM;MAAEpE;IAAM,CAAC,GAAGoE,KAAK,CAACC,aAAa;IAErC,MAAMC,IAAI,GAAGtE,KAAK,KAAK,EAAE,GAAGG,SAAS,GAAGI,MAAM,CAACP,KAAK,CAAC;IACrD0D,aAAa,CAAC1D,KAAK,CAAC;IACpBgD,QAAQ,CAACsB,IAAI,CAAC;IACd,IAAI/C,QAAQ,EAAE;MACZA,QAAQ,CAAC+C,IAAI,EAAEF,KAAK,CAAC;IACvB;EACF,CAAC,EACD,CAAC7C,QAAQ,EAAEyB,QAAQ,CACrB,CAAC;EAED,MAAMuB,WAAsD,GAAG,IAAAR,kBAAW,EACvEK,KAAK,IAAK;IACTA,KAAK,CAACC,aAAa,CAACG,IAAI,CAAC,CAAC;EAC5B,CAAC,EACD,EACF,CAAC;EAED,MAAMC,eAAe,GAAG,IAAAC,YAAK,EAAC,CAAC;EAC/B,MAAMC,OAAO,GAAGpC,EAAE,IAAIkC,eAAe;EAErC,OACE,IAAArG,OAAA,CAAAwG,GAAA,EAACtH,YAAA,CAAAuH,WAAW;IAACzD,KAAK,EAAEA,KAAM;IAACC,SAAS,EAAEA,SAAU;IAACuB,GAAG,EAAE3B;EAAQ,GAC5D,IAAA7C,OAAA,CAAAwG,GAAA,EAAClH,WAAA,CAAAoH,UAAU;IACT,iBAAepD,QAAS;IACxBqD,QAAQ,EAAE/D,KAAK,CAAC+D,QAAS;IACzBjD,OAAO,EAAEA,OAAQ;IACjBkD,OAAO,EAAEL;EAAQ,GAEhBrD,KACS,CAAC,EACb,IAAAlD,OAAA,CAAAwG,GAAA,EAAChH,wBAAA,CAAAqH,8BAA8B,CAACC,QAAQ;IACtClF,KAAK,EACHuD,UAAU,CAAC4B,IAAI,KAAK,UAAU,GAC1B,gBAAgB,GAChBpF,aAAa,CAACC,KAAK,EAAEC,MAAM,EAAEC,OAAO;EACzC,GAED,IAAA9B,OAAA,CAAAwG,GAAA,EAACnH,UAAA,CAAA2H,SAAS,EAAA3F,QAAA;IACRqC,OAAO,EAAEA,OAAQ;IACjBJ,QAAQ,EAAEA,QAAS;IACnBa,EAAE,EAAEoC,OAAQ;IACZ/B,GAAG,EAAEE,IAAK;IACVqC,IAAI,EAAC,QAAQ;IACbE,kBAAkB,EAAEC,gDAAwB;IAC5CtF,KAAK,EAAEyD,UAAW;IAClBlC,QAAQ,EAAE4C,YAAa;IACvBoB,MAAM,EAAEzB,UAAW;IACnB0B,OAAO,EAAEjB,WAAY;IACrB3C,QAAQ,EAAEA,QAAS;IACnB,gBAAc,CAAC2B,UAAU,CAACkC,KAAM;IAChCvD,GAAG,EAAEA,GAAI;IACTE,GAAG,EAAEA,GAAI;IACTE,IAAI,EAAEA;EAAK,GACPG,MAAM,EACNwB,YAAY,CACjB,CACsC,CAAC,EAE1C,IAAA7F,OAAA,CAAAwG,GAAA,EAACpH,eAAA,CAAAkI,cAAc;IACbzD,OAAO,EAAE,CAACsB,UAAU,CAACkC,KAAK,IAAIxD,OAAQ;IACtCH,OAAO,EAAEA,OAAQ;IACjBkC,OAAO,EAAEA,OAAQ;IACjBhE,KAAK,EAAEA;EAAM;EAGX;EACAuD,UAAU,CAACoC,OAAO,IAAI3D,UAEV,CACL,CAAC;AAElB,CAAC,CAAC","ignoreList":[]}
|
|
@@ -12,11 +12,30 @@ import { useFieldGroup } from "../FieldGroup";
|
|
|
12
12
|
import { useInputValue } from "../hooks/useInputValue";
|
|
13
13
|
import { useMergeRefs } from "../hooks/useMergeRefs";
|
|
14
14
|
import { useValidation } from "../FieldBase/useValidation";
|
|
15
|
-
import React, { forwardRef, useCallback, useContext, useId, useRef, useState } from "react";
|
|
15
|
+
import React, { forwardRef, useCallback, useContext, useId, useMemo, useRef, useState } from "react";
|
|
16
16
|
import { jsx as ___EmotionJSX } from "@emotion/react";
|
|
17
17
|
var toLocaleValue = (value, locale, options) => {
|
|
18
18
|
return value === undefined ? "" : value.toLocaleString(locale, options);
|
|
19
19
|
};
|
|
20
|
+
var equalNumber = (a, b) => {
|
|
21
|
+
if (a === b) {
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
24
|
+
// NaNとNaNはtrueにならないが等しいとみなす
|
|
25
|
+
if (Number.isNaN(a) && Number.isNaN(b)) {
|
|
26
|
+
return true;
|
|
27
|
+
}
|
|
28
|
+
return false;
|
|
29
|
+
};
|
|
30
|
+
var additionalValidations = [value => {
|
|
31
|
+
if (Number.isNaN(value)) {
|
|
32
|
+
if (navigator && /^ja\b/.test(navigator.language)) {
|
|
33
|
+
return "不正でない数値を入力してください";
|
|
34
|
+
}
|
|
35
|
+
return "Enter a valid number";
|
|
36
|
+
}
|
|
37
|
+
return;
|
|
38
|
+
}];
|
|
20
39
|
export var NumberField = /*#__PURE__*/forwardRef((props, rootRef) => {
|
|
21
40
|
var {
|
|
22
41
|
validationMessages,
|
|
@@ -56,10 +75,13 @@ export var NumberField = /*#__PURE__*/forwardRef((props, rootRef) => {
|
|
|
56
75
|
}
|
|
57
76
|
}
|
|
58
77
|
});
|
|
78
|
+
var mergedCustomValidations = useMemo(() => {
|
|
79
|
+
return customValidations ? [...customValidations, ...additionalValidations] : additionalValidations;
|
|
80
|
+
}, [customValidations]);
|
|
59
81
|
var validation = useValidation({
|
|
60
82
|
ref,
|
|
61
83
|
validationMessages,
|
|
62
|
-
customValidations,
|
|
84
|
+
customValidations: mergedCustomValidations,
|
|
63
85
|
value
|
|
64
86
|
});
|
|
65
87
|
|
|
@@ -68,7 +90,7 @@ export var NumberField = /*#__PURE__*/forwardRef((props, rootRef) => {
|
|
|
68
90
|
|
|
69
91
|
// 制御コンポーネントとして扱われる場合、外部からの値の変更を検知してinput要素の値を更新する。
|
|
70
92
|
var prevPropsValue = useRef(props.value);
|
|
71
|
-
if (isControlled &&
|
|
93
|
+
if (isControlled && !equalNumber(value, prevPropsValue.current)) {
|
|
72
94
|
prevPropsValue.current = props.value;
|
|
73
95
|
setInputValue(value === undefined ? "" : "" + value);
|
|
74
96
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"NumberField.js","names":["FormControl","FormHelperText","InputBase","InputLabel","LocaleContext","NumberFieldInputWrapper","NumberFieldInputWrapperContext","useDitectInputTouched","useFieldGroup","useInputValue","useMergeRefs","useValidation","React","forwardRef","useCallback","useContext","useId","useRef","useState","jsx","___EmotionJSX","toLocaleValue","value","locale","options","undefined","toLocaleString","NumberField","props","rootRef","validationMessages","customValidations","style","className","label","onChange","onFocus","defaultValue","disabled","readOnly","propsReadOnly","loading","propsLoading","helperText","invalid","max","Number","MAX_SAFE_INTEGER","min","MIN_SAFE_INTEGER","step","id","inputRef","others","_objectWithoutPropertiesLoose","_excluded","ref","refs","setValue","isControlled","onLoaded","validation","inputValue","setInputValue","prevPropsValue","current","handleBlur","touched","touchedProps","handleChange","event","currentTarget","next","handleWheel","blur","internalInputId","inputId","required","htmlFor","Provider","type","_extends","renderInputWrapper","onBlur","onWheel","valid","message"],"sources":["../../../src/NumberField/NumberField.tsx"],"sourcesContent":["import { FieldProps } from \"../FieldBase\";\nimport { FormControl } from \"../FormControl\";\nimport { FormHelperText } from \"../FieldBase/FormHelperText\";\nimport { InputBase, InputBaseProps } from \"../InputBase\";\nimport { InputLabel } from \"../InputLabel\";\nimport { LocaleContext } from \"../LocaleProvider\";\nimport {\n NumberFieldInputWrapper,\n NumberFieldInputWrapperContext,\n} from \"./NumberFieldInputWrapper\";\nimport { NumberFormatOptions } from \"./NumberFormatOptions\";\nimport { useDitectInputTouched } from \"../FieldBase/useDitectInputTouched\";\nimport { useFieldGroup } from \"../FieldGroup\";\nimport { useInputValue } from \"../hooks/useInputValue\";\nimport { useMergeRefs } from \"../hooks/useMergeRefs\";\nimport { useValidation } from \"../FieldBase/useValidation\";\nimport React, {\n forwardRef,\n useCallback,\n useContext,\n useId,\n useRef,\n useState,\n} from \"react\";\n\ninterface CommonNumberFieldProps\n extends Omit<InputBaseProps, \"defaultValue\" | \"value\" | \"onChange\"> {\n /**\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NumberFormat\n */\n options?: NumberFormatOptions;\n type?: never;\n children?: never;\n /**\n * 入力が受け付ける最大値を指定します。\n *\n * @default Number.MAX_SAFE_INTEGER\n */\n max?: number;\n /**\n * 入力が受け付ける最小値を指定します。\n *\n * @default Number.MIN_SAFE_INTEGER\n */\n min?: number;\n}\n\nexport interface NumberFieldProps\n extends FieldProps<number | undefined>,\n CommonNumberFieldProps {}\n\nconst toLocaleValue = (\n value?: number,\n locale?: string,\n options?: NumberFormatOptions,\n): string | undefined => {\n return value === undefined ? \"\" : value.toLocaleString(locale, options);\n};\n\nexport const NumberField = forwardRef<\n HTMLDivElement,\n Readonly<NumberFieldProps>\n>((props, rootRef) => {\n const {\n validationMessages,\n customValidations,\n style,\n className,\n label,\n options,\n onChange,\n onFocus,\n defaultValue,\n disabled,\n\n value: _propsValue,\n readOnly: propsReadOnly,\n loading: propsLoading,\n helperText,\n invalid,\n max = Number.MAX_SAFE_INTEGER,\n min = Number.MIN_SAFE_INTEGER,\n step = 1,\n id,\n inputRef,\n ...others\n } = props;\n const locale = useContext(LocaleContext);\n const ref = useRef<HTMLInputElement>(null);\n const refs = useMergeRefs(inputRef, ref);\n\n const [value, setValue, isControlled] = useInputValue(props);\n const { loading, readOnly } = useFieldGroup({\n loading: propsLoading,\n readOnly: propsReadOnly,\n onLoaded: () => {\n if (isControlled === false) {\n setValue(defaultValue);\n }\n },\n });\n\n const validation = useValidation({\n ref,\n validationMessages,\n customValidations,\n value,\n });\n\n // input要素の実際の値を管理している。これにより、`.0`や`.20`など入力途中の表示を維持できる。\n const [inputValue, setInputValue] = useState(\n value === undefined ? \"\" : `${value}`,\n );\n\n // 制御コンポーネントとして扱われる場合、外部からの値の変更を検知してinput要素の値を更新する。\n const prevPropsValue = useRef(props.value);\n if (isControlled && props.value !== prevPropsValue.current) {\n prevPropsValue.current = props.value;\n setInputValue(value === undefined ? \"\" : `${value}`);\n }\n\n // フォーカスが外れた場合、入力途中の値を破棄するためにinputValueを更新する\n const handleBlur = useCallback(() => {\n setInputValue(value === undefined ? \"\" : `${value}`);\n }, [value]);\n\n const [touched, touchedProps] = useDitectInputTouched(onFocus);\n\n const handleChange = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n const { value } = event.currentTarget;\n\n const next = value === \"\" ? undefined : Number(value);\n setInputValue(value);\n setValue(next);\n if (onChange) {\n onChange(next, event);\n }\n },\n [onChange, setValue],\n );\n\n const handleWheel: React.WheelEventHandler<HTMLInputElement> = useCallback(\n (event) => {\n event.currentTarget.blur();\n },\n [],\n );\n\n const internalInputId = useId();\n const inputId = id ?? internalInputId;\n\n return (\n <FormControl style={style} className={className} ref={rootRef}>\n <InputLabel\n aria-disabled={disabled}\n required={props.required}\n loading={loading}\n htmlFor={inputId}\n >\n {label}\n </InputLabel>\n <NumberFieldInputWrapperContext.Provider\n value={\n validation.type === \"badInput\"\n ? \"Invalid number\"\n : toLocaleValue(value, locale, options)\n }\n >\n <InputBase\n loading={loading}\n disabled={disabled}\n id={inputId}\n ref={refs}\n type=\"number\"\n renderInputWrapper={NumberFieldInputWrapper}\n value={inputValue}\n onChange={handleChange}\n onBlur={handleBlur}\n onWheel={handleWheel}\n readOnly={readOnly}\n data-invalid={!validation.valid}\n max={max}\n min={min}\n step={step}\n {...others}\n {...touchedProps}\n />\n </NumberFieldInputWrapperContext.Provider>\n\n <FormHelperText\n invalid={!validation.valid || invalid}\n loading={loading}\n touched={touched}\n value={value}\n >\n {\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n validation.message || helperText\n }\n </FormHelperText>\n </FormControl>\n );\n});\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"NumberField.js","names":["FormControl","FormHelperText","InputBase","InputLabel","LocaleContext","NumberFieldInputWrapper","NumberFieldInputWrapperContext","useDitectInputTouched","useFieldGroup","useInputValue","useMergeRefs","useValidation","React","forwardRef","useCallback","useContext","useId","useMemo","useRef","useState","jsx","___EmotionJSX","toLocaleValue","value","locale","options","undefined","toLocaleString","equalNumber","a","b","Number","isNaN","additionalValidations","navigator","test","language","NumberField","props","rootRef","validationMessages","customValidations","style","className","label","onChange","onFocus","defaultValue","disabled","readOnly","propsReadOnly","loading","propsLoading","helperText","invalid","max","MAX_SAFE_INTEGER","min","MIN_SAFE_INTEGER","step","id","inputRef","others","_objectWithoutPropertiesLoose","_excluded","ref","refs","setValue","isControlled","onLoaded","mergedCustomValidations","validation","inputValue","setInputValue","prevPropsValue","current","handleBlur","touched","touchedProps","handleChange","event","currentTarget","next","handleWheel","blur","internalInputId","inputId","required","htmlFor","Provider","type","_extends","renderInputWrapper","onBlur","onWheel","valid","message"],"sources":["../../../src/NumberField/NumberField.tsx"],"sourcesContent":["import { FieldProps } from \"../FieldBase\";\nimport { FormControl } from \"../FormControl\";\nimport { FormHelperText } from \"../FieldBase/FormHelperText\";\nimport { InputBase, InputBaseProps } from \"../InputBase\";\nimport { InputLabel } from \"../InputLabel\";\nimport { LocaleContext } from \"../LocaleProvider\";\nimport {\n NumberFieldInputWrapper,\n NumberFieldInputWrapperContext,\n} from \"./NumberFieldInputWrapper\";\nimport { NumberFormatOptions } from \"./NumberFormatOptions\";\nimport { useDitectInputTouched } from \"../FieldBase/useDitectInputTouched\";\nimport { useFieldGroup } from \"../FieldGroup\";\nimport { useInputValue } from \"../hooks/useInputValue\";\nimport { useMergeRefs } from \"../hooks/useMergeRefs\";\nimport { useValidation } from \"../FieldBase/useValidation\";\nimport React, {\n forwardRef,\n useCallback,\n useContext,\n useId,\n useMemo,\n useRef,\n useState,\n} from \"react\";\n\ninterface CommonNumberFieldProps\n extends Omit<InputBaseProps, \"defaultValue\" | \"value\" | \"onChange\"> {\n /**\n * @see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NumberFormat\n */\n options?: NumberFormatOptions;\n type?: never;\n children?: never;\n /**\n * 入力が受け付ける最大値を指定します。\n *\n * @default Number.MAX_SAFE_INTEGER\n */\n max?: number;\n /**\n * 入力が受け付ける最小値を指定します。\n *\n * @default Number.MIN_SAFE_INTEGER\n */\n min?: number;\n}\n\nexport interface NumberFieldProps\n extends FieldProps<number | undefined>,\n CommonNumberFieldProps {}\n\nconst toLocaleValue = (\n value?: number,\n locale?: string,\n options?: NumberFormatOptions,\n): string | undefined => {\n return value === undefined ? \"\" : value.toLocaleString(locale, options);\n};\n\nconst equalNumber = (a: number | undefined, b: number | undefined): boolean => {\n if (a === b) {\n return true;\n }\n // NaNとNaNはtrueにならないが等しいとみなす\n if (Number.isNaN(a) && Number.isNaN(b)) {\n return true;\n }\n return false;\n};\n\nconst additionalValidations = [\n (value?: number) => {\n if (Number.isNaN(value)) {\n if (navigator && /^ja\\b/.test(navigator.language)) {\n return \"不正でない数値を入力してください\";\n }\n return \"Enter a valid number\";\n }\n return;\n },\n] satisfies NumberFieldProps[\"customValidations\"];\n\nexport const NumberField = forwardRef<\n HTMLDivElement,\n Readonly<NumberFieldProps>\n>((props, rootRef) => {\n const {\n validationMessages,\n customValidations,\n style,\n className,\n label,\n options,\n onChange,\n onFocus,\n defaultValue,\n disabled,\n\n value: _propsValue,\n readOnly: propsReadOnly,\n loading: propsLoading,\n helperText,\n invalid,\n max = Number.MAX_SAFE_INTEGER,\n min = Number.MIN_SAFE_INTEGER,\n step = 1,\n id,\n inputRef,\n ...others\n } = props;\n const locale = useContext(LocaleContext);\n const ref = useRef<HTMLInputElement>(null);\n const refs = useMergeRefs(inputRef, ref);\n\n const [value, setValue, isControlled] = useInputValue(props);\n const { loading, readOnly } = useFieldGroup({\n loading: propsLoading,\n readOnly: propsReadOnly,\n onLoaded: () => {\n if (isControlled === false) {\n setValue(defaultValue);\n }\n },\n });\n\n const mergedCustomValidations = useMemo(() => {\n return customValidations\n ? [...customValidations, ...additionalValidations]\n : additionalValidations;\n }, [customValidations]);\n\n const validation = useValidation({\n ref,\n validationMessages,\n customValidations: mergedCustomValidations,\n value,\n });\n\n // input要素の実際の値を管理している。これにより、`.0`や`.20`など入力途中の表示を維持できる。\n const [inputValue, setInputValue] = useState(\n value === undefined ? \"\" : `${value}`,\n );\n\n // 制御コンポーネントとして扱われる場合、外部からの値の変更を検知してinput要素の値を更新する。\n const prevPropsValue = useRef(props.value);\n\n if (isControlled && !equalNumber(value, prevPropsValue.current)) {\n prevPropsValue.current = props.value;\n setInputValue(value === undefined ? \"\" : `${value}`);\n }\n\n // フォーカスが外れた場合、入力途中の値を破棄するためにinputValueを更新する\n const handleBlur = useCallback(() => {\n setInputValue(value === undefined ? \"\" : `${value}`);\n }, [value]);\n\n const [touched, touchedProps] = useDitectInputTouched(onFocus);\n\n const handleChange = useCallback(\n (event: React.ChangeEvent<HTMLInputElement>) => {\n const { value } = event.currentTarget;\n\n const next = value === \"\" ? undefined : Number(value);\n setInputValue(value);\n setValue(next);\n if (onChange) {\n onChange(next, event);\n }\n },\n [onChange, setValue],\n );\n\n const handleWheel: React.WheelEventHandler<HTMLInputElement> = useCallback(\n (event) => {\n event.currentTarget.blur();\n },\n [],\n );\n\n const internalInputId = useId();\n const inputId = id ?? internalInputId;\n\n return (\n <FormControl style={style} className={className} ref={rootRef}>\n <InputLabel\n aria-disabled={disabled}\n required={props.required}\n loading={loading}\n htmlFor={inputId}\n >\n {label}\n </InputLabel>\n <NumberFieldInputWrapperContext.Provider\n value={\n validation.type === \"badInput\"\n ? \"Invalid number\"\n : toLocaleValue(value, locale, options)\n }\n >\n <InputBase\n loading={loading}\n disabled={disabled}\n id={inputId}\n ref={refs}\n type=\"number\"\n renderInputWrapper={NumberFieldInputWrapper}\n value={inputValue}\n onChange={handleChange}\n onBlur={handleBlur}\n onWheel={handleWheel}\n readOnly={readOnly}\n data-invalid={!validation.valid}\n max={max}\n min={min}\n step={step}\n {...others}\n {...touchedProps}\n />\n </NumberFieldInputWrapperContext.Provider>\n\n <FormHelperText\n invalid={!validation.valid || invalid}\n loading={loading}\n touched={touched}\n value={value}\n >\n {\n // eslint-disable-next-line @typescript-eslint/prefer-nullish-coalescing\n validation.message || helperText\n }\n </FormHelperText>\n </FormControl>\n );\n});\n"],"mappings":"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","ignoreList":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "matsuri-ui",
|
|
3
|
-
"version": "16.4.1-alpha-
|
|
3
|
+
"version": "16.4.1-alpha-1731062187882-f223060.0",
|
|
4
4
|
"repository": {
|
|
5
5
|
"type": "git",
|
|
6
6
|
"url": "git+https://github.com/matsuri-tech/matsuri-ui.git"
|
|
@@ -59,10 +59,10 @@
|
|
|
59
59
|
},
|
|
60
60
|
"devDependencies": {
|
|
61
61
|
"@babel/cli": "7.25.9",
|
|
62
|
-
"@babel/core": "7.
|
|
63
|
-
"@babel/preset-env": "7.
|
|
62
|
+
"@babel/core": "7.26.0",
|
|
63
|
+
"@babel/preset-env": "7.26.0",
|
|
64
64
|
"@babel/preset-react": "7.25.9",
|
|
65
|
-
"@babel/preset-typescript": "7.
|
|
65
|
+
"@babel/preset-typescript": "7.26.0",
|
|
66
66
|
"@emotion/babel-preset-css-prop": "11.12.0",
|
|
67
67
|
"@emotion/react": "11.13.3",
|
|
68
68
|
"@emotion/styled": "11.13.0",
|