@activecollab/components 2.0.92 → 2.0.93
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/hooks/useInputNumber.js +1 -1
- package/dist/cjs/hooks/useInputNumber.js.map +1 -1
- package/dist/cjs/utils/currencyUtils.js +50 -8
- package/dist/cjs/utils/currencyUtils.js.map +1 -1
- package/dist/cjs/utils/currencyUtils.test.js +272 -19
- package/dist/cjs/utils/currencyUtils.test.js.map +1 -1
- package/dist/cjs/utils/index.js +8 -1
- package/dist/cjs/utils/index.js.map +1 -1
- package/dist/cjs/utils/types.js.map +1 -1
- package/dist/esm/hooks/useInputNumber.d.ts +1 -1
- package/dist/esm/hooks/useInputNumber.d.ts.map +1 -1
- package/dist/esm/hooks/useInputNumber.js +1 -1
- package/dist/esm/hooks/useInputNumber.js.map +1 -1
- package/dist/esm/utils/currencyUtils.d.ts +4 -3
- package/dist/esm/utils/currencyUtils.d.ts.map +1 -1
- package/dist/esm/utils/currencyUtils.js +65 -7
- package/dist/esm/utils/currencyUtils.js.map +1 -1
- package/dist/esm/utils/currencyUtils.test.js +277 -20
- package/dist/esm/utils/currencyUtils.test.js.map +1 -1
- package/dist/esm/utils/index.d.ts +1 -1
- package/dist/esm/utils/index.d.ts.map +1 -1
- package/dist/esm/utils/index.js +1 -1
- package/dist/esm/utils/index.js.map +1 -1
- package/dist/esm/utils/types.d.ts +8 -0
- package/dist/esm/utils/types.d.ts.map +1 -1
- package/dist/esm/utils/types.js.map +1 -1
- package/dist/index.js +51 -8
- package/dist/index.js.map +1 -1
- package/dist/index.min.js +1 -1
- package/dist/index.min.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["_layers","require","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get","_colors","_validation","_useForkRef","_interopRequireDefault","_useResizeObserver","_timeUtils","_currencyUtils","obj","__esModule","default"],"sources":["../../../src/utils/index.ts"],"sourcesContent":["export * from \"./layers\";\nexport * from \"./colors\";\nexport * from \"./validation\";\nexport { default as useForkRef } from \"./useForkRef\";\nexport { default as useResizeObserver } from \"./useResizeObserver\";\nexport { decimalToHours } from \"./timeUtils\";\nexport {
|
|
1
|
+
{"version":3,"file":"index.js","names":["_layers","require","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get","_colors","_validation","_useForkRef","_interopRequireDefault","_useResizeObserver","_timeUtils","_currencyUtils","obj","__esModule","default"],"sources":["../../../src/utils/index.ts"],"sourcesContent":["export * from \"./layers\";\nexport * from \"./colors\";\nexport * from \"./validation\";\nexport { default as useForkRef } from \"./useForkRef\";\nexport { default as useResizeObserver } from \"./useResizeObserver\";\nexport { decimalToHours } from \"./timeUtils\";\nexport {\n formatNumber,\n numberWithSeparator,\n getNumberFromString,\n} from \"./currencyUtils\";\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,IAAAA,OAAA,GAAAC,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAH,OAAA,EAAAI,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAC,YAAA,EAAAJ,GAAA;EAAA,IAAAA,GAAA,IAAAK,OAAA,IAAAA,OAAA,CAAAL,GAAA,MAAAL,OAAA,CAAAK,GAAA;EAAAH,MAAA,CAAAS,cAAA,CAAAD,OAAA,EAAAL,GAAA;IAAAO,UAAA;IAAAC,GAAA,WAAAA,IAAA;MAAA,OAAAb,OAAA,CAAAK,GAAA;IAAA;EAAA;AAAA;AACA,IAAAS,OAAA,GAAAb,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAW,OAAA,EAAAV,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAC,YAAA,EAAAJ,GAAA;EAAA,IAAAA,GAAA,IAAAK,OAAA,IAAAA,OAAA,CAAAL,GAAA,MAAAS,OAAA,CAAAT,GAAA;EAAAH,MAAA,CAAAS,cAAA,CAAAD,OAAA,EAAAL,GAAA;IAAAO,UAAA;IAAAC,GAAA,WAAAA,IAAA;MAAA,OAAAC,OAAA,CAAAT,GAAA;IAAA;EAAA;AAAA;AACA,IAAAU,WAAA,GAAAd,OAAA;AAAAC,MAAA,CAAAC,IAAA,CAAAY,WAAA,EAAAX,OAAA,WAAAC,GAAA;EAAA,IAAAA,GAAA,kBAAAA,GAAA;EAAA,IAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAC,YAAA,EAAAJ,GAAA;EAAA,IAAAA,GAAA,IAAAK,OAAA,IAAAA,OAAA,CAAAL,GAAA,MAAAU,WAAA,CAAAV,GAAA;EAAAH,MAAA,CAAAS,cAAA,CAAAD,OAAA,EAAAL,GAAA;IAAAO,UAAA;IAAAC,GAAA,WAAAA,IAAA;MAAA,OAAAE,WAAA,CAAAV,GAAA;IAAA;EAAA;AAAA;AACA,IAAAW,WAAA,GAAAC,sBAAA,CAAAhB,OAAA;AACA,IAAAiB,kBAAA,GAAAD,sBAAA,CAAAhB,OAAA;AACA,IAAAkB,UAAA,GAAAlB,OAAA;AACA,IAAAmB,cAAA,GAAAnB,OAAA;AAIyB,SAAAgB,uBAAAI,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","names":[],"sources":["../../../src/utils/types.ts"],"sourcesContent":["import React from \"react\";\n\n// Source: https://github.com/emotion-js/emotion/blob/master/packages/styled-base/types/helper.d.ts\n// A more precise version of just React.ComponentPropsWithoutRef on its own\nexport type PropsOf<\n C extends keyof JSX.IntrinsicElements | React.JSXElementConstructor<unknown>\n> = JSX.LibraryManagedAttributes<C, React.ComponentPropsWithoutRef<C>>;\n\ntype AsProp<C extends React.ElementType> = {\n /**\n * An override of the default HTML tag.\n * Can also be another React component.\n */\n as?: C;\n};\n\n/**\n * Allows for extending a set of props (`ExtendedProps`) by an overriding set of props\n * (`OverrideProps`), ensuring that any duplicates are overridden by the overriding\n * set of props.\n */\nexport type ExtendableProps<\n ExtendedProps = Record<string, unknown>,\n OverrideProps = Record<string, unknown>\n> = OverrideProps & Omit<ExtendedProps, keyof OverrideProps>;\n\n/**\n * Allows for inheriting the props from the specified element type so that\n * props like children, className & style work, as well as element-specific\n * attributes like aria roles. The component (`C`) must be passed in.\n */\nexport type InheritableElementProps<\n C extends React.ElementType,\n Props = Record<string, unknown>\n> = ExtendableProps<PropsOf<C>, Props>;\n\n/**\n * A more sophisticated version of `InheritableElementProps` where\n * the passed in `as` prop will determine which props can be included\n */\nexport type PolymorphicComponentProps<\n C extends React.ElementType,\n Props = Record<string, unknown>\n> = InheritableElementProps<C, Props & AsProp<C>>;\n\n/**\n * Utility type to extract the `ref` prop from a polymorphic component\n */\nexport type PolymorphicRef<C extends React.ElementType> =\n React.ComponentPropsWithRef<C>[\"ref\"];\n/**\n * A wrapper of `PolymorphicComponentProps` that also includes the `ref`\n * prop for the polymorphic component\n */\nexport type PolymorphicComponentPropsWithRef<\n C extends React.ElementType,\n Props = Record<string, unknown>\n> = PolymorphicComponentProps<C, Props> & { ref?: PolymorphicRef<C> };\n"],"mappings":""}
|
|
1
|
+
{"version":3,"file":"types.js","names":[],"sources":["../../../src/utils/types.ts"],"sourcesContent":["import React from \"react\";\n\n// Source: https://github.com/emotion-js/emotion/blob/master/packages/styled-base/types/helper.d.ts\n// A more precise version of just React.ComponentPropsWithoutRef on its own\nexport type PropsOf<\n C extends keyof JSX.IntrinsicElements | React.JSXElementConstructor<unknown>\n> = JSX.LibraryManagedAttributes<C, React.ComponentPropsWithoutRef<C>>;\n\ntype AsProp<C extends React.ElementType> = {\n /**\n * An override of the default HTML tag.\n * Can also be another React component.\n */\n as?: C;\n};\n\n/**\n * Allows for extending a set of props (`ExtendedProps`) by an overriding set of props\n * (`OverrideProps`), ensuring that any duplicates are overridden by the overriding\n * set of props.\n */\nexport type ExtendableProps<\n ExtendedProps = Record<string, unknown>,\n OverrideProps = Record<string, unknown>\n> = OverrideProps & Omit<ExtendedProps, keyof OverrideProps>;\n\n/**\n * Allows for inheriting the props from the specified element type so that\n * props like children, className & style work, as well as element-specific\n * attributes like aria roles. The component (`C`) must be passed in.\n */\nexport type InheritableElementProps<\n C extends React.ElementType,\n Props = Record<string, unknown>\n> = ExtendableProps<PropsOf<C>, Props>;\n\n/**\n * A more sophisticated version of `InheritableElementProps` where\n * the passed in `as` prop will determine which props can be included\n */\nexport type PolymorphicComponentProps<\n C extends React.ElementType,\n Props = Record<string, unknown>\n> = InheritableElementProps<C, Props & AsProp<C>>;\n\n/**\n * Utility type to extract the `ref` prop from a polymorphic component\n */\nexport type PolymorphicRef<C extends React.ElementType> =\n React.ComponentPropsWithRef<C>[\"ref\"];\n/**\n * A wrapper of `PolymorphicComponentProps` that also includes the `ref`\n * prop for the polymorphic component\n */\nexport type PolymorphicComponentPropsWithRef<\n C extends React.ElementType,\n Props = Record<string, unknown>\n> = PolymorphicComponentProps<C, Props> & { ref?: PolymorphicRef<C> };\n\nexport interface FormatNumberArgs {\n value: string | number;\n thousandSeparator?: \",\" | \".\" | \" \";\n decimalSeparator?: \",\" | \".\";\n trimDecimals?: boolean;\n decimalSpaces?: number;\n format?: \"long\" | \"short\";\n}\n"],"mappings":""}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useInputNumber.d.ts","sourceRoot":"","sources":["../../../src/hooks/useInputNumber.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEL,UAAU,EAGV,SAAS,EAGV,MAAM,OAAO,CAAC;AASf,MAAM,MAAM,UAAU,GAAG,GAAG,GAAG,GAAG,CAAC;
|
|
1
|
+
{"version":3,"file":"useInputNumber.d.ts","sourceRoot":"","sources":["../../../src/hooks/useInputNumber.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEL,UAAU,EAGV,SAAS,EAGV,MAAM,OAAO,CAAC;AASf,MAAM,MAAM,UAAU,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAEzC,MAAM,WAAW,YAAY;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,CAAC,EAAE,UAAU,CAAC;IAC9B,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,iBAAiB,CAAC,EAAE,UAAU,CAAC;IAC/B,MAAM,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC;IAC5B,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACxC,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,UAAU,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAAC;IACxD,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,CAAC;IAC9B,UAAU,CAAC,EAAE,CACX,KAAK,EAAE,MAAM,EACb,aAAa,EAAE,OAAO,EACtB,gBAAgB,EAAE,MAAM,EACxB,aAAa,EAAE,MAAM,EACrB,KAAK,CAAC,EAAE,MAAM,KACX,OAAO,CAAC;CACd;AAED,eAAO,MAAM,cAAc,uMAiBtB,YAAY,YACL,UAAU,gBAAgB,GAAG,IAAI,CAAC;;;;;;;;;;;;;;CAsQ7C,CAAC"}
|
|
@@ -81,7 +81,7 @@ export const useInputNumber = (_ref, inputRef) => {
|
|
|
81
81
|
if (value.includes(decimalSeparator)) {
|
|
82
82
|
increasedValue = parseFloat(increasedValue.toFixed(decimalLength));
|
|
83
83
|
}
|
|
84
|
-
const joinedValue = numberWithSeparator(increasedValue, thousandSeparator, value.includes(thousandSeparator));
|
|
84
|
+
const joinedValue = numberWithSeparator(increasedValue, thousandSeparator, decimalSeparator, value.includes(thousandSeparator));
|
|
85
85
|
setUnformattedValue(decimalPart ? joinedValue + decimalPart : joinedValue);
|
|
86
86
|
setCurrentValue(decimalPart ? joinedValue + decimalPart : joinedValue);
|
|
87
87
|
}, [decimalLength, decimalSeparator, step, thousandSeparator, unformattedValue]);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useInputNumber.js","names":["useState","useRef","useCallback","useMemo","useEffect","validateNumberInput","currencyMultiplier","formatNumber","numberWithSeparator","useInputNumber","_ref","inputRef","decimalSeparator","thousandSeparator","disableAbbreviation","disableMacros","decimalLength","value","onChange","onSave","onEnterKeyPress","onClick","onCancel","allowEmptyValue","step","limit","validation","currentValue","setCurrentValue","prevValue","setPrevValue","unformattedValue","setUnformattedValue","focused","setFocused","escapeRef","handleBlur","e","current","target","trim","length","_value","updateValue","type","String","decimalPart","increasedValue","nonDecimalPart","replaceAll","includes","slice","indexOf","parseFloat","toFixed","joinedValue","handleKeyDown","key","blur","preventDefault","metaKey","ctrlKey","_inputRef$current","select","input","start","selectionStart","end","selectionEnd","newValue","substring","Boolean","handleChange","inputValue","numericInput","replace","_","num","unit","toLowerCase","toString","handleClick","handleFocus","handleDoubleClick","_inputRef$current2","inputProps","onBlur","onKeyDown","onDoubleClick","onFocus"],"sources":["../../../src/hooks/useInputNumber.tsx"],"sourcesContent":["import {\n useState,\n MouseEvent,\n useRef,\n useCallback,\n RefObject,\n useMemo,\n useEffect,\n} from \"react\";\n\nimport { validateNumberInput } from \"../utils\";\nimport {\n currencyMultiplier,\n formatNumber,\n numberWithSeparator,\n} from \"../utils/currencyUtils\";\n\nexport type Separators = \".\" | \",\";\n\nexport interface IInputNumber {\n decimalLength?: number;\n decimalSeparator?: Separators;\n disableAbbreviation?: boolean;\n disableMacros?: boolean;\n thousandSeparator?: Separators;\n onSave?: (e: Event) => void;\n value?: string | number;\n step?: number;\n limit?: number;\n onEnterKeyPress?: (val: string) => void;\n onChange?: (val: string) => void;\n onClick?: (event: MouseEvent<HTMLInputElement>) => void;\n allowEmptyValue?: boolean;\n onCancel?: (e: Event) => void;\n validation?: (\n value: string,\n disableMacros: boolean,\n decimalSeparator: string,\n decimalLength: number,\n limit?: number\n ) => boolean;\n}\n\nexport const useInputNumber = (\n {\n decimalSeparator = \".\",\n thousandSeparator = \",\",\n disableAbbreviation,\n disableMacros,\n decimalLength,\n value = \"\",\n onChange,\n onSave,\n onEnterKeyPress,\n onClick,\n onCancel,\n allowEmptyValue,\n step = 1,\n limit,\n validation = validateNumberInput,\n }: IInputNumber,\n inputRef: RefObject<HTMLInputElement | null>\n) => {\n const [currentValue, setCurrentValue] = useState(() =>\n disableAbbreviation\n ? value\n : formatNumber(value as string, thousandSeparator)\n );\n const [prevValue, setPrevValue] = useState(() =>\n disableAbbreviation\n ? value\n : formatNumber(value as string, thousandSeparator)\n );\n const [unformattedValue, setUnformattedValue] = useState(() => value);\n\n useEffect(() => {\n if (value !== prevValue) {\n setCurrentValue(\n disableAbbreviation\n ? value\n : formatNumber(value as string, thousandSeparator)\n );\n setPrevValue(\n disableAbbreviation\n ? value\n : formatNumber(value as string, thousandSeparator)\n );\n setUnformattedValue(value);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [disableAbbreviation, thousandSeparator, value]);\n\n const [focused, setFocused] = useState(false);\n\n const escapeRef = useRef(false);\n\n const handleBlur = useCallback(\n (e) => {\n if (escapeRef.current) {\n setCurrentValue(prevValue);\n setUnformattedValue(prevValue);\n } else {\n if (e.target.value.trim().length > 0 && prevValue !== e.target.value) {\n const _value = disableAbbreviation\n ? currentValue\n : formatNumber(currentValue as string, thousandSeparator);\n setPrevValue(_value);\n setUnformattedValue(currentValue);\n setCurrentValue(_value);\n typeof onSave === \"function\" && onSave(e);\n } else {\n if (!allowEmptyValue) {\n setCurrentValue(prevValue);\n setUnformattedValue(prevValue);\n typeof onCancel === \"function\" && onCancel(e);\n } else {\n if (typeof onSave === \"function\" && prevValue !== e.target.value) {\n onSave(e);\n } else {\n typeof onCancel === \"function\" && onCancel(e);\n }\n }\n }\n }\n setFocused(false);\n },\n [\n allowEmptyValue,\n disableAbbreviation,\n onCancel,\n onSave,\n prevValue,\n thousandSeparator,\n currentValue,\n ]\n );\n\n const updateValue = useCallback(\n (type: \"increment\" | \"decrement\") => {\n const value = String(unformattedValue);\n\n let decimalPart = \"\";\n let increasedValue = 0;\n let nonDecimalPart = value.replaceAll(thousandSeparator, \"\");\n\n if (!value) {\n return;\n }\n\n if (value.includes(decimalSeparator)) {\n nonDecimalPart = value\n .slice(0, value.indexOf(decimalSeparator))\n .replaceAll(thousandSeparator, \"\");\n }\n\n if (value.includes(decimalSeparator)) {\n decimalPart = value.slice(value.indexOf(decimalSeparator));\n }\n\n if (type === \"increment\") {\n increasedValue = parseFloat(nonDecimalPart) + step;\n } else {\n increasedValue = parseFloat(nonDecimalPart) - step;\n }\n\n if (value.includes(decimalSeparator)) {\n increasedValue = parseFloat(increasedValue.toFixed(decimalLength));\n }\n\n const joinedValue = numberWithSeparator(\n increasedValue,\n thousandSeparator,\n value.includes(thousandSeparator)\n );\n\n setUnformattedValue(\n decimalPart ? joinedValue + decimalPart : joinedValue\n );\n setCurrentValue(decimalPart ? joinedValue + decimalPart : joinedValue);\n },\n [decimalLength, decimalSeparator, step, thousandSeparator, unformattedValue]\n );\n\n const handleKeyDown = useCallback(\n (e) => {\n if (e.key === \"Enter\") {\n e.target.blur();\n if (typeof onEnterKeyPress === \"function\")\n onEnterKeyPress(e.target.value);\n }\n if (e.key === \"ArrowLeft\") {\n return;\n }\n if (e.key === \"ArrowRight\") {\n return;\n }\n if (e.key === \"ArrowUp\") {\n e.preventDefault();\n updateValue(\"increment\");\n }\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n updateValue(\"decrement\");\n }\n if (e.key === \"Escape\") {\n escapeRef.current = true;\n e.target.blur();\n typeof onCancel === \"function\" && onCancel(e);\n escapeRef.current = false;\n }\n if (e.key === \"Backspace\") {\n return;\n }\n if ((e.metaKey || e.ctrlKey) && e.key === \"a\") {\n inputRef.current?.select();\n return;\n }\n if (e.key === \"Tab\") {\n return;\n }\n if ((e.metaKey || e.ctrlKey) && e.key === \"v\") {\n e.preventDefault();\n return;\n }\n const input = e.target;\n const currentValue = input.value;\n const start = input.selectionStart;\n const end = input.selectionEnd;\n const newValue =\n currentValue.substring(0, start) + e.key + currentValue.substring(end);\n if (\n !validation(\n newValue,\n Boolean(disableMacros),\n decimalSeparator,\n decimalLength ?? 0,\n limit\n )\n ) {\n e.preventDefault();\n return;\n }\n },\n [\n decimalLength,\n decimalSeparator,\n disableMacros,\n inputRef,\n limit,\n onCancel,\n onEnterKeyPress,\n updateValue,\n validation,\n ]\n );\n\n const handleChange = useCallback(\n (e) => {\n const inputValue = e.target.value;\n const numericInput = disableMacros\n ? inputValue\n : inputValue.replace(/([0-9.]+)([kmbtKMBT])/, (_, num, unit) => {\n return (\n parseFloat(num) * currencyMultiplier[unit.toLowerCase()]\n ).toString();\n });\n setCurrentValue(numericInput);\n setUnformattedValue(numericInput);\n if (onChange) onChange(numericInput);\n },\n [disableMacros, onChange]\n );\n\n const handleClick = useCallback(\n (e) => {\n if (typeof onClick === \"function\") {\n onClick(e);\n }\n },\n [onClick]\n );\n\n const handleFocus = useCallback(() => {\n setCurrentValue(unformattedValue);\n setFocused(true);\n }, [unformattedValue]);\n\n const handleDoubleClick = useCallback(() => {\n if (inputRef.current) {\n inputRef.current?.select();\n }\n }, [inputRef]);\n\n const inputProps = useMemo(() => {\n return {\n value: currentValue,\n onBlur: handleBlur,\n onKeyDown: handleKeyDown,\n onChange: handleChange,\n onClick: handleClick,\n onDoubleClick: handleDoubleClick,\n onFocus: handleFocus,\n focused,\n unformattedValue,\n };\n }, [\n currentValue,\n handleBlur,\n handleKeyDown,\n handleChange,\n handleClick,\n handleDoubleClick,\n handleFocus,\n focused,\n unformattedValue,\n ]);\n\n return {\n inputProps,\n setCurrentValue,\n setPrevValue,\n };\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useInputNumber.js","names":["useState","useRef","useCallback","useMemo","useEffect","validateNumberInput","currencyMultiplier","formatNumber","numberWithSeparator","useInputNumber","_ref","inputRef","decimalSeparator","thousandSeparator","disableAbbreviation","disableMacros","decimalLength","value","onChange","onSave","onEnterKeyPress","onClick","onCancel","allowEmptyValue","step","limit","validation","currentValue","setCurrentValue","prevValue","setPrevValue","unformattedValue","setUnformattedValue","focused","setFocused","escapeRef","handleBlur","e","current","target","trim","length","_value","updateValue","type","String","decimalPart","increasedValue","nonDecimalPart","replaceAll","includes","slice","indexOf","parseFloat","toFixed","joinedValue","handleKeyDown","key","blur","preventDefault","metaKey","ctrlKey","_inputRef$current","select","input","start","selectionStart","end","selectionEnd","newValue","substring","Boolean","handleChange","inputValue","numericInput","replace","_","num","unit","toLowerCase","toString","handleClick","handleFocus","handleDoubleClick","_inputRef$current2","inputProps","onBlur","onKeyDown","onDoubleClick","onFocus"],"sources":["../../../src/hooks/useInputNumber.tsx"],"sourcesContent":["import {\n useState,\n MouseEvent,\n useRef,\n useCallback,\n RefObject,\n useMemo,\n useEffect,\n} from \"react\";\n\nimport { validateNumberInput } from \"../utils\";\nimport {\n currencyMultiplier,\n formatNumber,\n numberWithSeparator,\n} from \"../utils/currencyUtils\";\n\nexport type Separators = \".\" | \",\" | \" \";\n\nexport interface IInputNumber {\n decimalLength?: number;\n decimalSeparator?: Separators;\n disableAbbreviation?: boolean;\n disableMacros?: boolean;\n thousandSeparator?: Separators;\n onSave?: (e: Event) => void;\n value?: string | number;\n step?: number;\n limit?: number;\n onEnterKeyPress?: (val: string) => void;\n onChange?: (val: string) => void;\n onClick?: (event: MouseEvent<HTMLInputElement>) => void;\n allowEmptyValue?: boolean;\n onCancel?: (e: Event) => void;\n validation?: (\n value: string,\n disableMacros: boolean,\n decimalSeparator: string,\n decimalLength: number,\n limit?: number\n ) => boolean;\n}\n\nexport const useInputNumber = (\n {\n decimalSeparator = \".\",\n thousandSeparator = \",\",\n disableAbbreviation,\n disableMacros,\n decimalLength,\n value = \"\",\n onChange,\n onSave,\n onEnterKeyPress,\n onClick,\n onCancel,\n allowEmptyValue,\n step = 1,\n limit,\n validation = validateNumberInput,\n }: IInputNumber,\n inputRef: RefObject<HTMLInputElement | null>\n) => {\n const [currentValue, setCurrentValue] = useState(() =>\n disableAbbreviation\n ? value\n : formatNumber(value as string, thousandSeparator)\n );\n const [prevValue, setPrevValue] = useState(() =>\n disableAbbreviation\n ? value\n : formatNumber(value as string, thousandSeparator)\n );\n const [unformattedValue, setUnformattedValue] = useState(() => value);\n\n useEffect(() => {\n if (value !== prevValue) {\n setCurrentValue(\n disableAbbreviation\n ? value\n : formatNumber(value as string, thousandSeparator)\n );\n setPrevValue(\n disableAbbreviation\n ? value\n : formatNumber(value as string, thousandSeparator)\n );\n setUnformattedValue(value);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [disableAbbreviation, thousandSeparator, value]);\n\n const [focused, setFocused] = useState(false);\n\n const escapeRef = useRef(false);\n\n const handleBlur = useCallback(\n (e) => {\n if (escapeRef.current) {\n setCurrentValue(prevValue);\n setUnformattedValue(prevValue);\n } else {\n if (e.target.value.trim().length > 0 && prevValue !== e.target.value) {\n const _value = disableAbbreviation\n ? currentValue\n : formatNumber(currentValue as string, thousandSeparator);\n setPrevValue(_value);\n setUnformattedValue(currentValue);\n setCurrentValue(_value);\n typeof onSave === \"function\" && onSave(e);\n } else {\n if (!allowEmptyValue) {\n setCurrentValue(prevValue);\n setUnformattedValue(prevValue);\n typeof onCancel === \"function\" && onCancel(e);\n } else {\n if (typeof onSave === \"function\" && prevValue !== e.target.value) {\n onSave(e);\n } else {\n typeof onCancel === \"function\" && onCancel(e);\n }\n }\n }\n }\n setFocused(false);\n },\n [\n allowEmptyValue,\n disableAbbreviation,\n onCancel,\n onSave,\n prevValue,\n thousandSeparator,\n currentValue,\n ]\n );\n\n const updateValue = useCallback(\n (type: \"increment\" | \"decrement\") => {\n const value = String(unformattedValue);\n\n let decimalPart = \"\";\n let increasedValue = 0;\n let nonDecimalPart = value.replaceAll(thousandSeparator, \"\");\n\n if (!value) {\n return;\n }\n\n if (value.includes(decimalSeparator)) {\n nonDecimalPart = value\n .slice(0, value.indexOf(decimalSeparator))\n .replaceAll(thousandSeparator, \"\");\n }\n\n if (value.includes(decimalSeparator)) {\n decimalPart = value.slice(value.indexOf(decimalSeparator));\n }\n\n if (type === \"increment\") {\n increasedValue = parseFloat(nonDecimalPart) + step;\n } else {\n increasedValue = parseFloat(nonDecimalPart) - step;\n }\n\n if (value.includes(decimalSeparator)) {\n increasedValue = parseFloat(increasedValue.toFixed(decimalLength));\n }\n\n const joinedValue = numberWithSeparator(\n increasedValue,\n thousandSeparator,\n decimalSeparator,\n value.includes(thousandSeparator)\n );\n\n setUnformattedValue(\n decimalPart ? joinedValue + decimalPart : joinedValue\n );\n setCurrentValue(decimalPart ? joinedValue + decimalPart : joinedValue);\n },\n [decimalLength, decimalSeparator, step, thousandSeparator, unformattedValue]\n );\n\n const handleKeyDown = useCallback(\n (e) => {\n if (e.key === \"Enter\") {\n e.target.blur();\n if (typeof onEnterKeyPress === \"function\")\n onEnterKeyPress(e.target.value);\n }\n if (e.key === \"ArrowLeft\") {\n return;\n }\n if (e.key === \"ArrowRight\") {\n return;\n }\n if (e.key === \"ArrowUp\") {\n e.preventDefault();\n updateValue(\"increment\");\n }\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n updateValue(\"decrement\");\n }\n if (e.key === \"Escape\") {\n escapeRef.current = true;\n e.target.blur();\n typeof onCancel === \"function\" && onCancel(e);\n escapeRef.current = false;\n }\n if (e.key === \"Backspace\") {\n return;\n }\n if ((e.metaKey || e.ctrlKey) && e.key === \"a\") {\n inputRef.current?.select();\n return;\n }\n if (e.key === \"Tab\") {\n return;\n }\n if ((e.metaKey || e.ctrlKey) && e.key === \"v\") {\n e.preventDefault();\n return;\n }\n const input = e.target;\n const currentValue = input.value;\n const start = input.selectionStart;\n const end = input.selectionEnd;\n const newValue =\n currentValue.substring(0, start) + e.key + currentValue.substring(end);\n if (\n !validation(\n newValue,\n Boolean(disableMacros),\n decimalSeparator,\n decimalLength ?? 0,\n limit\n )\n ) {\n e.preventDefault();\n return;\n }\n },\n [\n decimalLength,\n decimalSeparator,\n disableMacros,\n inputRef,\n limit,\n onCancel,\n onEnterKeyPress,\n updateValue,\n validation,\n ]\n );\n\n const handleChange = useCallback(\n (e) => {\n const inputValue = e.target.value;\n const numericInput = disableMacros\n ? inputValue\n : inputValue.replace(/([0-9.]+)([kmbtKMBT])/, (_, num, unit) => {\n return (\n parseFloat(num) * currencyMultiplier[unit.toLowerCase()]\n ).toString();\n });\n setCurrentValue(numericInput);\n setUnformattedValue(numericInput);\n if (onChange) onChange(numericInput);\n },\n [disableMacros, onChange]\n );\n\n const handleClick = useCallback(\n (e) => {\n if (typeof onClick === \"function\") {\n onClick(e);\n }\n },\n [onClick]\n );\n\n const handleFocus = useCallback(() => {\n setCurrentValue(unformattedValue);\n setFocused(true);\n }, [unformattedValue]);\n\n const handleDoubleClick = useCallback(() => {\n if (inputRef.current) {\n inputRef.current?.select();\n }\n }, [inputRef]);\n\n const inputProps = useMemo(() => {\n return {\n value: currentValue,\n onBlur: handleBlur,\n onKeyDown: handleKeyDown,\n onChange: handleChange,\n onClick: handleClick,\n onDoubleClick: handleDoubleClick,\n onFocus: handleFocus,\n focused,\n unformattedValue,\n };\n }, [\n currentValue,\n handleBlur,\n handleKeyDown,\n handleChange,\n handleClick,\n handleDoubleClick,\n handleFocus,\n focused,\n unformattedValue,\n ]);\n\n return {\n inputProps,\n setCurrentValue,\n setPrevValue,\n };\n};\n"],"mappings":"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"}
|
|
@@ -1,10 +1,11 @@
|
|
|
1
|
-
import { Separators } from "../hooks";
|
|
2
1
|
export declare const currencyMultiplier: {
|
|
3
2
|
k: number;
|
|
4
3
|
m: number;
|
|
5
4
|
b: number;
|
|
6
5
|
t: number;
|
|
7
6
|
};
|
|
8
|
-
export declare const
|
|
9
|
-
export declare const
|
|
7
|
+
export declare const fixedDecimalSpaces: (num: number, fixed: number) => number;
|
|
8
|
+
export declare const getNumberFromString: (number: string | number, thousandSeparator?: string, decimalSeparator?: string) => number;
|
|
9
|
+
export declare const formatNumber: (n: string | number, thousandSeparator?: string, decimalSeperator?: string, trimDecimals?: boolean, decimalSpaces?: number, format?: string) => string;
|
|
10
|
+
export declare const numberWithSeparator: (x: number | string, thousandSeparator?: string, decimalSeparator?: string, format?: boolean) => string | number;
|
|
10
11
|
//# sourceMappingURL=currencyUtils.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"currencyUtils.d.ts","sourceRoot":"","sources":["../../../src/utils/currencyUtils.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"currencyUtils.d.ts","sourceRoot":"","sources":["../../../src/utils/currencyUtils.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,kBAAkB;;;;;CAK9B,CAAC;AAEF,eAAO,MAAM,kBAAkB,QAAS,MAAM,SAAS,MAAM,WAQ5D,CAAC;AAEF,eAAO,MAAM,mBAAmB,WACtB,MAAM,GAAG,MAAM,kEAmCxB,CAAC;AAEF,eAAO,MAAM,YAAY,MACpB,MAAM,GAAG,MAAM,mIA0CnB,CAAC;AAEF,eAAO,MAAM,mBAAmB,MAC3B,MAAM,GAAG,MAAM,6FAYnB,CAAC"}
|
|
@@ -4,11 +4,63 @@ export const currencyMultiplier = {
|
|
|
4
4
|
b: 1000000000,
|
|
5
5
|
t: 1000000000000
|
|
6
6
|
};
|
|
7
|
-
export const
|
|
7
|
+
export const fixedDecimalSpaces = (num, fixed) => {
|
|
8
|
+
fixed = fixed || 0;
|
|
9
|
+
fixed = Math.pow(10, fixed);
|
|
10
|
+
const parts = num.toString().split(".");
|
|
11
|
+
if (parts.length > 1 && parseInt(parts[1]) > fixed) {
|
|
12
|
+
return Math.floor(num * fixed) / fixed;
|
|
13
|
+
}
|
|
14
|
+
return Math.round(num * fixed) / fixed;
|
|
15
|
+
};
|
|
16
|
+
export const getNumberFromString = function (number, thousandSeparator, decimalSeparator) {
|
|
17
|
+
if (thousandSeparator === void 0) {
|
|
18
|
+
thousandSeparator = ",";
|
|
19
|
+
}
|
|
20
|
+
if (decimalSeparator === void 0) {
|
|
21
|
+
decimalSeparator = ".";
|
|
22
|
+
}
|
|
23
|
+
if (typeof number === "number") {
|
|
24
|
+
return number;
|
|
25
|
+
}
|
|
26
|
+
if (decimalSeparator === ",") {
|
|
27
|
+
const parts = number.split(decimalSeparator);
|
|
28
|
+
let result = 0;
|
|
29
|
+
if (parts.length === 2) {
|
|
30
|
+
result = parts[0] ? parseFloat(String(parts[0]).replaceAll(thousandSeparator, "")) : 0;
|
|
31
|
+
if (result < 0) {
|
|
32
|
+
result -= parts[1] ? parseFloat(String(parts[1])) / Math.pow(10, parts[1].length) : 0;
|
|
33
|
+
} else {
|
|
34
|
+
result += parts[1] ? parseFloat(String(parts[1])) / Math.pow(10, parts[1].length) : 0;
|
|
35
|
+
}
|
|
36
|
+
return result;
|
|
37
|
+
}
|
|
38
|
+
if (parts.length === 1) {
|
|
39
|
+
result = parseFloat(String(parts[0]).replaceAll(thousandSeparator, ""));
|
|
40
|
+
return result;
|
|
41
|
+
}
|
|
42
|
+
return 0;
|
|
43
|
+
} else {
|
|
44
|
+
return parseFloat(String(number).replaceAll(thousandSeparator, ""));
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
export const formatNumber = function (n, thousandSeparator, decimalSeperator, trimDecimals, decimalSpaces, format) {
|
|
8
48
|
if (thousandSeparator === void 0) {
|
|
9
49
|
thousandSeparator = ",";
|
|
10
50
|
}
|
|
11
|
-
|
|
51
|
+
if (decimalSeperator === void 0) {
|
|
52
|
+
decimalSeperator = ".";
|
|
53
|
+
}
|
|
54
|
+
if (trimDecimals === void 0) {
|
|
55
|
+
trimDecimals = true;
|
|
56
|
+
}
|
|
57
|
+
if (decimalSpaces === void 0) {
|
|
58
|
+
decimalSpaces = 2;
|
|
59
|
+
}
|
|
60
|
+
if (format === void 0) {
|
|
61
|
+
format = "short";
|
|
62
|
+
}
|
|
63
|
+
const number = getNumberFromString(n, thousandSeparator, decimalSeperator);
|
|
12
64
|
if (isNaN(number)) {
|
|
13
65
|
return "";
|
|
14
66
|
}
|
|
@@ -16,15 +68,21 @@ export const formatNumber = function (n, thousandSeparator) {
|
|
|
16
68
|
let absoluteNumber = Math.abs(number);
|
|
17
69
|
const suffixes = ["", "K", "M", "B", "T"];
|
|
18
70
|
let scale = 0;
|
|
19
|
-
while (absoluteNumber >= 1000 && scale < suffixes.length - 1) {
|
|
71
|
+
while (absoluteNumber >= 1000 && scale < suffixes.length - 1 && format === "short") {
|
|
20
72
|
absoluteNumber /= 1000;
|
|
21
73
|
scale++;
|
|
22
74
|
}
|
|
23
|
-
const formattedNum = scale === 0 ? absoluteNumber
|
|
24
|
-
const result =
|
|
75
|
+
const formattedNum = scale === 0 ? fixedDecimalSpaces(absoluteNumber, decimalSpaces) : parseFloat(absoluteNumber.toFixed(1));
|
|
76
|
+
const result = numberWithSeparator(trimDecimals ? formattedNum : formattedNum.toFixed(decimalSpaces), thousandSeparator, decimalSeperator);
|
|
25
77
|
return isNegative ? "-" + result + suffixes[scale] : "" + result + suffixes[scale];
|
|
26
78
|
};
|
|
27
|
-
export const numberWithSeparator = function (x, thousandSeparator, format) {
|
|
79
|
+
export const numberWithSeparator = function (x, thousandSeparator, decimalSeparator, format) {
|
|
80
|
+
if (thousandSeparator === void 0) {
|
|
81
|
+
thousandSeparator = ",";
|
|
82
|
+
}
|
|
83
|
+
if (decimalSeparator === void 0) {
|
|
84
|
+
decimalSeparator = ".";
|
|
85
|
+
}
|
|
28
86
|
if (format === void 0) {
|
|
29
87
|
format = true;
|
|
30
88
|
}
|
|
@@ -33,6 +91,6 @@ export const numberWithSeparator = function (x, thousandSeparator, format) {
|
|
|
33
91
|
}
|
|
34
92
|
const parts = x.toString().split(".");
|
|
35
93
|
parts[0] = parts[0].replace(/\B(?=(\d{3})+(?!\d))/g, thousandSeparator);
|
|
36
|
-
return parts.join(
|
|
94
|
+
return parts.join(decimalSeparator);
|
|
37
95
|
};
|
|
38
96
|
//# sourceMappingURL=currencyUtils.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"currencyUtils.js","names":["currencyMultiplier","k","m","b","t","
|
|
1
|
+
{"version":3,"file":"currencyUtils.js","names":["currencyMultiplier","k","m","b","t","fixedDecimalSpaces","num","fixed","Math","pow","parts","toString","split","length","parseInt","floor","round","getNumberFromString","number","thousandSeparator","decimalSeparator","result","parseFloat","String","replaceAll","formatNumber","n","decimalSeperator","trimDecimals","decimalSpaces","format","isNaN","isNegative","absoluteNumber","abs","suffixes","scale","formattedNum","toFixed","numberWithSeparator","x","replace","join"],"sources":["../../../src/utils/currencyUtils.ts"],"sourcesContent":["export const currencyMultiplier = {\n k: 1_000,\n m: 1_000_000,\n b: 1_000_000_000,\n t: 1_000_000_000_000,\n};\n\nexport const fixedDecimalSpaces = (num: number, fixed: number) => {\n fixed = fixed || 0;\n fixed = Math.pow(10, fixed);\n const parts = num.toString().split(\".\");\n if (parts.length > 1 && parseInt(parts[1]) > fixed) {\n return Math.floor(num * fixed) / fixed;\n }\n return Math.round(num * fixed) / fixed;\n};\n\nexport const getNumberFromString = (\n number: string | number,\n thousandSeparator = \",\",\n decimalSeparator = \".\"\n) => {\n if (typeof number === \"number\") {\n return number;\n }\n if (decimalSeparator === \",\") {\n const parts = number.split(decimalSeparator);\n\n let result = 0;\n if (parts.length === 2) {\n result = parts[0]\n ? parseFloat(String(parts[0]).replaceAll(thousandSeparator, \"\"))\n : 0;\n if (result < 0) {\n result -= parts[1]\n ? parseFloat(String(parts[1])) / Math.pow(10, parts[1].length)\n : 0;\n } else {\n result += parts[1]\n ? parseFloat(String(parts[1])) / Math.pow(10, parts[1].length)\n : 0;\n }\n return result;\n }\n if (parts.length === 1) {\n result = parseFloat(String(parts[0]).replaceAll(thousandSeparator, \"\"));\n\n return result;\n }\n return 0;\n } else {\n return parseFloat(String(number).replaceAll(thousandSeparator, \"\"));\n }\n};\n\nexport const formatNumber = (\n n: string | number,\n thousandSeparator = \",\",\n decimalSeperator = \".\",\n trimDecimals = true,\n decimalSpaces = 2,\n format = \"short\"\n) => {\n const number = getNumberFromString(n, thousandSeparator, decimalSeperator);\n\n if (isNaN(number)) {\n return \"\";\n }\n\n const isNegative = number < 0;\n let absoluteNumber = Math.abs(number);\n\n const suffixes = [\"\", \"K\", \"M\", \"B\", \"T\"];\n let scale = 0;\n\n while (\n absoluteNumber >= 1000 &&\n scale < suffixes.length - 1 &&\n format === \"short\"\n ) {\n absoluteNumber /= 1000;\n scale++;\n }\n\n const formattedNum =\n scale === 0\n ? fixedDecimalSpaces(absoluteNumber, decimalSpaces)\n : parseFloat(absoluteNumber.toFixed(1));\n\n const result = numberWithSeparator(\n trimDecimals ? formattedNum : formattedNum.toFixed(decimalSpaces),\n thousandSeparator,\n decimalSeperator\n );\n\n return isNegative\n ? `-${result}${suffixes[scale]}`\n : `${result}${suffixes[scale]}`;\n};\n\nexport const numberWithSeparator = (\n x: number | string,\n thousandSeparator = \",\",\n decimalSeparator = \".\",\n format = true\n) => {\n if (!format) {\n return x;\n }\n const parts = x.toString().split(\".\");\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, thousandSeparator);\n\n return parts.join(decimalSeparator);\n};\n"],"mappings":"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"}
|
|
@@ -1,42 +1,299 @@
|
|
|
1
|
-
import { formatNumber, numberWithSeparator } from "./currencyUtils";
|
|
1
|
+
import { formatNumber, getNumberFromString, numberWithSeparator, fixedDecimalSpaces } from "./currencyUtils";
|
|
2
2
|
describe("format currency with thousandseparator set to ',' and decimalSeparator to '.'", () => {
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
// please try to leave unformatted - ignore works for this block only
|
|
4
|
+
// prettier-ignore
|
|
5
|
+
it.each([[{
|
|
6
|
+
value: ""
|
|
7
|
+
}, ""], [{
|
|
8
|
+
value: "10"
|
|
9
|
+
}, "10"], [{
|
|
10
|
+
value: "1000"
|
|
11
|
+
}, "1K"], [{
|
|
12
|
+
value: "1000.00"
|
|
13
|
+
}, "1K"], [{
|
|
14
|
+
value: "1200.50"
|
|
15
|
+
}, "1.2K"], [{
|
|
16
|
+
value: "1,200.00"
|
|
17
|
+
}, "1.2K"], [{
|
|
18
|
+
value: "2,240.00"
|
|
19
|
+
}, "2.2K"], [{
|
|
20
|
+
value: "22,240.00"
|
|
21
|
+
}, "22.2K"], [{
|
|
22
|
+
value: "50,000,000.00"
|
|
23
|
+
}, "50M"], [{
|
|
24
|
+
value: "-50,000.00"
|
|
25
|
+
}, "-50K"], [{
|
|
26
|
+
value: "-1,200"
|
|
27
|
+
}, "-1.2K"], [{
|
|
28
|
+
value: "-90,000,000.00"
|
|
29
|
+
}, "-90M"], [{
|
|
30
|
+
value: "900.25"
|
|
31
|
+
}, "900.25"], [{
|
|
32
|
+
value: 900.25,
|
|
33
|
+
thousandSeparator: ".",
|
|
34
|
+
decimalSeparator: ","
|
|
35
|
+
}, "900,25"], [{
|
|
36
|
+
value: "900,25",
|
|
37
|
+
thousandSeparator: ".",
|
|
38
|
+
decimalSeparator: ","
|
|
39
|
+
}, "900,25"], [{
|
|
40
|
+
value: 900.255556,
|
|
41
|
+
thousandSeparator: ".",
|
|
42
|
+
decimalSeparator: ","
|
|
43
|
+
}, "900,25"], [{
|
|
44
|
+
value: "900,255556",
|
|
45
|
+
thousandSeparator: ".",
|
|
46
|
+
decimalSeparator: ","
|
|
47
|
+
}, "900,25"], [{
|
|
48
|
+
value: 900.255556,
|
|
49
|
+
thousandSeparator: ".",
|
|
50
|
+
decimalSeparator: ",",
|
|
51
|
+
trimDecimals: false,
|
|
52
|
+
decimalSpaces: 6
|
|
53
|
+
}, "900,255556"], [{
|
|
54
|
+
value: "900,255556",
|
|
55
|
+
thousandSeparator: ".",
|
|
56
|
+
decimalSeparator: ",",
|
|
57
|
+
trimDecimals: false
|
|
58
|
+
}, "900,25"], [{
|
|
59
|
+
value: 900.25,
|
|
60
|
+
thousandSeparator: ".",
|
|
61
|
+
decimalSeparator: ",",
|
|
62
|
+
trimDecimals: false,
|
|
63
|
+
decimalSpaces: 3
|
|
64
|
+
}, "900,250"], [{
|
|
65
|
+
value: 900.25,
|
|
66
|
+
thousandSeparator: ".",
|
|
67
|
+
decimalSeparator: ",",
|
|
68
|
+
trimDecimals: false,
|
|
69
|
+
decimalSpaces: 3,
|
|
70
|
+
format: "long"
|
|
71
|
+
}, "900,250"], [{
|
|
72
|
+
value: 1150.6666667,
|
|
73
|
+
thousandSeparator: ",",
|
|
74
|
+
decimalSeparator: ".",
|
|
75
|
+
trimDecimals: true,
|
|
76
|
+
decimalSpaces: 2,
|
|
77
|
+
format: "long"
|
|
78
|
+
}, "1,150.66"], [{
|
|
79
|
+
value: "1150.6666667",
|
|
80
|
+
thousandSeparator: ",",
|
|
81
|
+
decimalSeparator: ".",
|
|
82
|
+
trimDecimals: true,
|
|
83
|
+
decimalSpaces: 2,
|
|
84
|
+
format: "long"
|
|
85
|
+
}, "1,150.66"], [{
|
|
86
|
+
value: 1150.6666667,
|
|
87
|
+
thousandSeparator: ",",
|
|
88
|
+
decimalSeparator: ".",
|
|
89
|
+
trimDecimals: true,
|
|
90
|
+
decimalSpaces: 2,
|
|
91
|
+
format: "short"
|
|
92
|
+
}, "1.2K"], [{
|
|
93
|
+
value: "1150.6666667",
|
|
94
|
+
thousandSeparator: ",",
|
|
95
|
+
decimalSeparator: ".",
|
|
96
|
+
trimDecimals: true,
|
|
97
|
+
decimalSpaces: 2,
|
|
98
|
+
format: "short"
|
|
99
|
+
}, "1.2K"], [{
|
|
100
|
+
value: 1150.0,
|
|
101
|
+
thousandSeparator: ",",
|
|
102
|
+
decimalSeparator: ".",
|
|
103
|
+
trimDecimals: true,
|
|
104
|
+
decimalSpaces: 2,
|
|
105
|
+
format: "short"
|
|
106
|
+
}, "1.1K"], [{
|
|
107
|
+
value: "1150.00000",
|
|
108
|
+
thousandSeparator: ",",
|
|
109
|
+
decimalSeparator: ".",
|
|
110
|
+
trimDecimals: true,
|
|
111
|
+
decimalSpaces: 2,
|
|
112
|
+
format: "short"
|
|
113
|
+
}, "1.1K"], [{
|
|
114
|
+
value: 1150.6,
|
|
115
|
+
thousandSeparator: ",",
|
|
116
|
+
decimalSeparator: ".",
|
|
117
|
+
trimDecimals: true,
|
|
118
|
+
decimalSpaces: 2,
|
|
119
|
+
format: "long"
|
|
120
|
+
}, "1,150.6"], [{
|
|
121
|
+
value: "1150.60",
|
|
122
|
+
thousandSeparator: ",",
|
|
123
|
+
decimalSeparator: ".",
|
|
124
|
+
trimDecimals: true,
|
|
125
|
+
decimalSpaces: 2,
|
|
126
|
+
format: "long"
|
|
127
|
+
}, "1,150.6"], [{
|
|
128
|
+
value: 1150.0,
|
|
129
|
+
thousandSeparator: ",",
|
|
130
|
+
decimalSeparator: ".",
|
|
131
|
+
trimDecimals: true,
|
|
132
|
+
decimalSpaces: 2,
|
|
133
|
+
format: "long"
|
|
134
|
+
}, "1,150"], [{
|
|
135
|
+
value: "1150.00",
|
|
136
|
+
thousandSeparator: ",",
|
|
137
|
+
decimalSeparator: ".",
|
|
138
|
+
trimDecimals: true,
|
|
139
|
+
decimalSpaces: 2,
|
|
140
|
+
format: "long"
|
|
141
|
+
}, "1,150"], [{
|
|
142
|
+
value: 110.155557,
|
|
143
|
+
thousandSeparator: ",",
|
|
144
|
+
decimalSeparator: ".",
|
|
145
|
+
trimDecimals: true,
|
|
146
|
+
decimalSpaces: 2,
|
|
147
|
+
format: "long"
|
|
148
|
+
}, "110.15"], [{
|
|
149
|
+
value: "110.155557",
|
|
150
|
+
thousandSeparator: ",",
|
|
151
|
+
decimalSeparator: ".",
|
|
152
|
+
trimDecimals: true,
|
|
153
|
+
decimalSpaces: 2,
|
|
154
|
+
format: "long"
|
|
155
|
+
}, "110.15"], [{
|
|
156
|
+
value: 110.155557,
|
|
157
|
+
thousandSeparator: ",",
|
|
158
|
+
decimalSeparator: ".",
|
|
159
|
+
trimDecimals: true,
|
|
160
|
+
decimalSpaces: 2,
|
|
161
|
+
format: "short"
|
|
162
|
+
}, "110.15"], [{
|
|
163
|
+
value: "110.155557",
|
|
164
|
+
thousandSeparator: ",",
|
|
165
|
+
decimalSeparator: ".",
|
|
166
|
+
trimDecimals: true,
|
|
167
|
+
decimalSpaces: 2,
|
|
168
|
+
format: "short"
|
|
169
|
+
}, "110.15"], [{
|
|
170
|
+
value: 1501000.155557,
|
|
171
|
+
thousandSeparator: ",",
|
|
172
|
+
decimalSeparator: ".",
|
|
173
|
+
trimDecimals: true,
|
|
174
|
+
decimalSpaces: 2,
|
|
175
|
+
format: "long"
|
|
176
|
+
}, "1,501,000.15"], [{
|
|
177
|
+
value: "1501000.155557",
|
|
178
|
+
thousandSeparator: ",",
|
|
179
|
+
decimalSeparator: ".",
|
|
180
|
+
trimDecimals: true,
|
|
181
|
+
decimalSpaces: 2,
|
|
182
|
+
format: "long"
|
|
183
|
+
}, "1,501,000.15"], [{
|
|
184
|
+
value: 1501000.155557,
|
|
185
|
+
thousandSeparator: ",",
|
|
186
|
+
decimalSeparator: ".",
|
|
187
|
+
trimDecimals: true,
|
|
188
|
+
decimalSpaces: 2,
|
|
189
|
+
format: "short"
|
|
190
|
+
}, "1.5M"], [{
|
|
191
|
+
value: "1501000.155557",
|
|
192
|
+
thousandSeparator: ",",
|
|
193
|
+
decimalSeparator: ".",
|
|
194
|
+
trimDecimals: true,
|
|
195
|
+
decimalSpaces: 2,
|
|
196
|
+
format: "short"
|
|
197
|
+
}, "1.5M"]])("should format currency advanced", (params, expected) => {
|
|
198
|
+
const {
|
|
199
|
+
value,
|
|
200
|
+
thousandSeparator,
|
|
201
|
+
decimalSeparator,
|
|
202
|
+
trimDecimals,
|
|
203
|
+
decimalSpaces,
|
|
204
|
+
format
|
|
205
|
+
} = params;
|
|
206
|
+
expect(formatNumber(value, thousandSeparator, decimalSeparator, trimDecimals, decimalSpaces, format)).toEqual(expected);
|
|
5
207
|
});
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
it.each([[
|
|
9
|
-
|
|
208
|
+
|
|
209
|
+
//fixedDecimalSpaces
|
|
210
|
+
it.each([[{
|
|
211
|
+
number: 123.456789,
|
|
212
|
+
decimalSpaces: 3
|
|
213
|
+
}, 123.456], [{
|
|
214
|
+
number: 123.3,
|
|
215
|
+
decimalSpaces: 2
|
|
216
|
+
}, 123.3], [{
|
|
217
|
+
number: 123.3,
|
|
218
|
+
decimalSpaces: 0
|
|
219
|
+
}, 123]])("should handle fixedDecimalSpaces", (params, expected) => {
|
|
220
|
+
expect(fixedDecimalSpaces(params.number, params.decimalSpaces)).toBe(expected);
|
|
10
221
|
});
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
const result = numberWithSeparator(1000, ",");
|
|
15
|
-
expect(result).toBe("1,000");
|
|
222
|
+
|
|
223
|
+
//numberWithSeparator
|
|
224
|
+
it("should format number with thousand separator", () => {
|
|
225
|
+
const result = numberWithSeparator(1000.0.toFixed(3), ",", ".");
|
|
226
|
+
expect(result).toBe("1,000.000");
|
|
16
227
|
});
|
|
17
|
-
|
|
228
|
+
it("should format string number with thousand separator", () => {
|
|
18
229
|
const result = numberWithSeparator("1000", ",");
|
|
19
230
|
expect(result).toBe("1,000");
|
|
20
231
|
});
|
|
21
|
-
|
|
232
|
+
it("should format decimal number with thousand separator and keep decimal part", () => {
|
|
22
233
|
const result = numberWithSeparator(12345.67, ",");
|
|
23
234
|
expect(result).toBe("12,345.67");
|
|
24
235
|
});
|
|
25
|
-
|
|
26
|
-
const result = numberWithSeparator(1000, ",", false);
|
|
236
|
+
it("should not format when format is set to false", () => {
|
|
237
|
+
const result = numberWithSeparator(1000, ",", ".", false);
|
|
27
238
|
expect(result).toBe(1000);
|
|
28
239
|
});
|
|
29
|
-
|
|
240
|
+
it("should handle zero with thousand separator", () => {
|
|
30
241
|
const result = numberWithSeparator(0, ",");
|
|
31
242
|
expect(result).toBe("0");
|
|
32
243
|
});
|
|
33
|
-
|
|
244
|
+
it("should handle negative number with thousand separator", () => {
|
|
34
245
|
const result = numberWithSeparator(-123456789, ",");
|
|
35
246
|
expect(result).toBe("-123,456,789");
|
|
36
247
|
});
|
|
37
|
-
|
|
38
|
-
const result = numberWithSeparator(123456789, ",", false);
|
|
248
|
+
it("should not format", () => {
|
|
249
|
+
const result = numberWithSeparator(123456789, ",", ".", false);
|
|
39
250
|
expect(result).toBe(123456789);
|
|
40
251
|
});
|
|
252
|
+
|
|
253
|
+
//getNumberFromString
|
|
254
|
+
it.each([[{
|
|
255
|
+
number: "1.000.000,256",
|
|
256
|
+
thousandSeparator: ".",
|
|
257
|
+
decimalSeparator: ","
|
|
258
|
+
}, 1000000.256], [{
|
|
259
|
+
number: 1000000.256,
|
|
260
|
+
thousandSeparator: ".",
|
|
261
|
+
decimalSeparator: ","
|
|
262
|
+
}, 1000000.256], [{
|
|
263
|
+
number: "1,000,000.256",
|
|
264
|
+
thousandSeparator: ",",
|
|
265
|
+
decimalSeparator: "."
|
|
266
|
+
}, 1000000.256], [{
|
|
267
|
+
number: ",256",
|
|
268
|
+
thousandSeparator: ".",
|
|
269
|
+
decimalSeparator: ","
|
|
270
|
+
}, 0.256], [{
|
|
271
|
+
number: "1562",
|
|
272
|
+
thousandSeparator: ".",
|
|
273
|
+
decimalSeparator: ","
|
|
274
|
+
}, 1562], [{
|
|
275
|
+
number: "1,2,3.4",
|
|
276
|
+
thousandSeparator: ".",
|
|
277
|
+
decimalSeparator: ","
|
|
278
|
+
}, 0], [{
|
|
279
|
+
number: "1562",
|
|
280
|
+
thousandSeparator: ",",
|
|
281
|
+
decimalSeparator: "."
|
|
282
|
+
}, 1562], [{
|
|
283
|
+
number: "-1.562,25",
|
|
284
|
+
thousandSeparator: ".",
|
|
285
|
+
decimalSeparator: ","
|
|
286
|
+
}, -1562.25], [{
|
|
287
|
+
number: "-1 562.25",
|
|
288
|
+
thousandSeparator: " ",
|
|
289
|
+
decimalSeparator: "."
|
|
290
|
+
}, -1562.25]])("should handle getNumberFromString", (params, expected) => {
|
|
291
|
+
const {
|
|
292
|
+
number,
|
|
293
|
+
thousandSeparator,
|
|
294
|
+
decimalSeparator
|
|
295
|
+
} = params;
|
|
296
|
+
expect(getNumberFromString(number, thousandSeparator, decimalSeparator)).toBe(expected);
|
|
297
|
+
});
|
|
41
298
|
});
|
|
42
299
|
//# sourceMappingURL=currencyUtils.test.js.map
|