@activecollab/components 2.0.91 → 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.
@@ -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 { formatNumber, numberWithSeparator } 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;AAAoE,SAAAgB,uBAAAI,GAAA,WAAAA,GAAA,IAAAA,GAAA,CAAAC,UAAA,GAAAD,GAAA,KAAAE,OAAA,EAAAF,GAAA"}
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,5 +1,5 @@
1
1
  import { MouseEvent, RefObject } from "react";
2
- export type Separators = "." | ",";
2
+ export type Separators = "." | "," | " ";
3
3
  export interface IInputNumber {
4
4
  decimalLength?: number;
5
5
  decimalSeparator?: Separators;
@@ -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;AAEnC,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;;;;;;;;;;;;;;CAqQ7C,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 formatNumber: (n: string, thousandSeparator?: string) => string;
9
- export declare const numberWithSeparator: (x: number | string, thousandSeparator: Separators, format?: boolean) => string | number;
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,OAAO,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAEtC,eAAO,MAAM,kBAAkB;;;;;CAK9B,CAAC;AAEF,eAAO,MAAM,YAAY,MAAO,MAAM,uCA2BrC,CAAC;AAEF,eAAO,MAAM,mBAAmB,MAC3B,MAAM,GAAG,MAAM,qBACC,UAAU,sCAW9B,CAAC"}
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 formatNumber = function (n, thousandSeparator) {
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
- const number = parseFloat(String(n).replaceAll(thousandSeparator, ""));
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.toFixed(0) : absoluteNumber.toFixed(1);
24
- const result = formattedNum.endsWith(".0") ? formattedNum.slice(0, -2) : formattedNum;
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","formatNumber","n","thousandSeparator","number","parseFloat","String","replaceAll","isNaN","isNegative","absoluteNumber","Math","abs","suffixes","scale","length","formattedNum","toFixed","result","endsWith","slice","numberWithSeparator","x","format","parts","toString","split","replace","join"],"sources":["../../../src/utils/currencyUtils.ts"],"sourcesContent":["import { Separators } from \"../hooks\";\n\nexport 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 formatNumber = (n: string, thousandSeparator = \",\") => {\n const number = parseFloat(String(n).replaceAll(thousandSeparator, \"\"));\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 (absoluteNumber >= 1000 && scale < suffixes.length - 1) {\n absoluteNumber /= 1000;\n scale++;\n }\n\n const formattedNum =\n scale === 0 ? absoluteNumber.toFixed(0) : absoluteNumber.toFixed(1);\n const result = formattedNum.endsWith(\".0\")\n ? formattedNum.slice(0, -2)\n : formattedNum;\n\n return isNegative\n ? `-${result}${suffixes[scale]}`\n : `${result}${suffixes[scale]}`;\n};\n\nexport const numberWithSeparator = (\n x: number | string,\n thousandSeparator: Separators,\n format = true\n) => {\n if (!format) {\n return x;\n }\n\n const parts = x.toString().split(\".\");\n parts[0] = parts[0].replace(/\\B(?=(\\d{3})+(?!\\d))/g, thousandSeparator);\n\n return parts.join(\".\");\n};\n"],"mappings":"AAEA,OAAO,MAAMA,kBAAkB,GAAG;EAChCC,CAAC,EAAE,IAAK;EACRC,CAAC,EAAE,OAAS;EACZC,CAAC,EAAE,UAAa;EAChBC,CAAC,EAAE;AACL,CAAC;AAED,OAAO,MAAMC,YAAY,GAAG,SAAAA,CAACC,CAAS,EAAEC,iBAAiB,EAAW;EAAA,IAA5BA,iBAAiB;IAAjBA,iBAAiB,GAAG,GAAG;EAAA;EAC7D,MAAMC,MAAM,GAAGC,UAAU,CAACC,MAAM,CAACJ,CAAC,CAAC,CAACK,UAAU,CAACJ,iBAAiB,EAAE,EAAE,CAAC,CAAC;EAEtE,IAAIK,KAAK,CAACJ,MAAM,CAAC,EAAE;IACjB,OAAO,EAAE;EACX;EAEA,MAAMK,UAAU,GAAGL,MAAM,GAAG,CAAC;EAC7B,IAAIM,cAAc,GAAGC,IAAI,CAACC,GAAG,CAACR,MAAM,CAAC;EAErC,MAAMS,QAAQ,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;EACzC,IAAIC,KAAK,GAAG,CAAC;EAEb,OAAOJ,cAAc,IAAI,IAAI,IAAII,KAAK,GAAGD,QAAQ,CAACE,MAAM,GAAG,CAAC,EAAE;IAC5DL,cAAc,IAAI,IAAI;IACtBI,KAAK,EAAE;EACT;EAEA,MAAME,YAAY,GAChBF,KAAK,KAAK,CAAC,GAAGJ,cAAc,CAACO,OAAO,CAAC,CAAC,CAAC,GAAGP,cAAc,CAACO,OAAO,CAAC,CAAC,CAAC;EACrE,MAAMC,MAAM,GAAGF,YAAY,CAACG,QAAQ,CAAC,IAAI,CAAC,GACtCH,YAAY,CAACI,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GACzBJ,YAAY;EAEhB,OAAOP,UAAU,SACTS,MAAM,GAAGL,QAAQ,CAACC,KAAK,CAAC,QACzBI,MAAM,GAAGL,QAAQ,CAACC,KAAK,CAAG;AACnC,CAAC;AAED,OAAO,MAAMO,mBAAmB,GAAG,SAAAA,CACjCC,CAAkB,EAClBnB,iBAA6B,EAC7BoB,MAAM,EACH;EAAA,IADHA,MAAM;IAANA,MAAM,GAAG,IAAI;EAAA;EAEb,IAAI,CAACA,MAAM,EAAE;IACX,OAAOD,CAAC;EACV;EAEA,MAAME,KAAK,GAAGF,CAAC,CAACG,QAAQ,CAAC,CAAC,CAACC,KAAK,CAAC,GAAG,CAAC;EACrCF,KAAK,CAAC,CAAC,CAAC,GAAGA,KAAK,CAAC,CAAC,CAAC,CAACG,OAAO,CAAC,uBAAuB,EAAExB,iBAAiB,CAAC;EAEvE,OAAOqB,KAAK,CAACI,IAAI,CAAC,GAAG,CAAC;AACxB,CAAC"}
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":"AAAA,OAAO,MAAMA,kBAAkB,GAAG;EAChCC,CAAC,EAAE,IAAK;EACRC,CAAC,EAAE,OAAS;EACZC,CAAC,EAAE,UAAa;EAChBC,CAAC,EAAE;AACL,CAAC;AAED,OAAO,MAAMC,kBAAkB,GAAGA,CAACC,GAAW,EAAEC,KAAa,KAAK;EAChEA,KAAK,GAAGA,KAAK,IAAI,CAAC;EAClBA,KAAK,GAAGC,IAAI,CAACC,GAAG,CAAC,EAAE,EAAEF,KAAK,CAAC;EAC3B,MAAMG,KAAK,GAAGJ,GAAG,CAACK,QAAQ,CAAC,CAAC,CAACC,KAAK,CAAC,GAAG,CAAC;EACvC,IAAIF,KAAK,CAACG,MAAM,GAAG,CAAC,IAAIC,QAAQ,CAACJ,KAAK,CAAC,CAAC,CAAC,CAAC,GAAGH,KAAK,EAAE;IAClD,OAAOC,IAAI,CAACO,KAAK,CAACT,GAAG,GAAGC,KAAK,CAAC,GAAGA,KAAK;EACxC;EACA,OAAOC,IAAI,CAACQ,KAAK,CAACV,GAAG,GAAGC,KAAK,CAAC,GAAGA,KAAK;AACxC,CAAC;AAED,OAAO,MAAMU,mBAAmB,GAAG,SAAAA,CACjCC,MAAuB,EACvBC,iBAAiB,EACjBC,gBAAgB,EACb;EAAA,IAFHD,iBAAiB;IAAjBA,iBAAiB,GAAG,GAAG;EAAA;EAAA,IACvBC,gBAAgB;IAAhBA,gBAAgB,GAAG,GAAG;EAAA;EAEtB,IAAI,OAAOF,MAAM,KAAK,QAAQ,EAAE;IAC9B,OAAOA,MAAM;EACf;EACA,IAAIE,gBAAgB,KAAK,GAAG,EAAE;IAC5B,MAAMV,KAAK,GAAGQ,MAAM,CAACN,KAAK,CAACQ,gBAAgB,CAAC;IAE5C,IAAIC,MAAM,GAAG,CAAC;IACd,IAAIX,KAAK,CAACG,MAAM,KAAK,CAAC,EAAE;MACtBQ,MAAM,GAAGX,KAAK,CAAC,CAAC,CAAC,GACbY,UAAU,CAACC,MAAM,CAACb,KAAK,CAAC,CAAC,CAAC,CAAC,CAACc,UAAU,CAACL,iBAAiB,EAAE,EAAE,CAAC,CAAC,GAC9D,CAAC;MACL,IAAIE,MAAM,GAAG,CAAC,EAAE;QACdA,MAAM,IAAIX,KAAK,CAAC,CAAC,CAAC,GACdY,UAAU,CAACC,MAAM,CAACb,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAGF,IAAI,CAACC,GAAG,CAAC,EAAE,EAAEC,KAAK,CAAC,CAAC,CAAC,CAACG,MAAM,CAAC,GAC5D,CAAC;MACP,CAAC,MAAM;QACLQ,MAAM,IAAIX,KAAK,CAAC,CAAC,CAAC,GACdY,UAAU,CAACC,MAAM,CAACb,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAGF,IAAI,CAACC,GAAG,CAAC,EAAE,EAAEC,KAAK,CAAC,CAAC,CAAC,CAACG,MAAM,CAAC,GAC5D,CAAC;MACP;MACA,OAAOQ,MAAM;IACf;IACA,IAAIX,KAAK,CAACG,MAAM,KAAK,CAAC,EAAE;MACtBQ,MAAM,GAAGC,UAAU,CAACC,MAAM,CAACb,KAAK,CAAC,CAAC,CAAC,CAAC,CAACc,UAAU,CAACL,iBAAiB,EAAE,EAAE,CAAC,CAAC;MAEvE,OAAOE,MAAM;IACf;IACA,OAAO,CAAC;EACV,CAAC,MAAM;IACL,OAAOC,UAAU,CAACC,MAAM,CAACL,MAAM,CAAC,CAACM,UAAU,CAACL,iBAAiB,EAAE,EAAE,CAAC,CAAC;EACrE;AACF,CAAC;AAED,OAAO,MAAMM,YAAY,GAAG,SAAAA,CAC1BC,CAAkB,EAClBP,iBAAiB,EACjBQ,gBAAgB,EAChBC,YAAY,EACZC,aAAa,EACbC,MAAM,EACH;EAAA,IALHX,iBAAiB;IAAjBA,iBAAiB,GAAG,GAAG;EAAA;EAAA,IACvBQ,gBAAgB;IAAhBA,gBAAgB,GAAG,GAAG;EAAA;EAAA,IACtBC,YAAY;IAAZA,YAAY,GAAG,IAAI;EAAA;EAAA,IACnBC,aAAa;IAAbA,aAAa,GAAG,CAAC;EAAA;EAAA,IACjBC,MAAM;IAANA,MAAM,GAAG,OAAO;EAAA;EAEhB,MAAMZ,MAAM,GAAGD,mBAAmB,CAACS,CAAC,EAAEP,iBAAiB,EAAEQ,gBAAgB,CAAC;EAE1E,IAAII,KAAK,CAACb,MAAM,CAAC,EAAE;IACjB,OAAO,EAAE;EACX;EAEA,MAAMc,UAAU,GAAGd,MAAM,GAAG,CAAC;EAC7B,IAAIe,cAAc,GAAGzB,IAAI,CAAC0B,GAAG,CAAChB,MAAM,CAAC;EAErC,MAAMiB,QAAQ,GAAG,CAAC,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;EACzC,IAAIC,KAAK,GAAG,CAAC;EAEb,OACEH,cAAc,IAAI,IAAI,IACtBG,KAAK,GAAGD,QAAQ,CAACtB,MAAM,GAAG,CAAC,IAC3BiB,MAAM,KAAK,OAAO,EAClB;IACAG,cAAc,IAAI,IAAI;IACtBG,KAAK,EAAE;EACT;EAEA,MAAMC,YAAY,GAChBD,KAAK,KAAK,CAAC,GACP/B,kBAAkB,CAAC4B,cAAc,EAAEJ,aAAa,CAAC,GACjDP,UAAU,CAACW,cAAc,CAACK,OAAO,CAAC,CAAC,CAAC,CAAC;EAE3C,MAAMjB,MAAM,GAAGkB,mBAAmB,CAChCX,YAAY,GAAGS,YAAY,GAAGA,YAAY,CAACC,OAAO,CAACT,aAAa,CAAC,EACjEV,iBAAiB,EACjBQ,gBACF,CAAC;EAED,OAAOK,UAAU,SACTX,MAAM,GAAGc,QAAQ,CAACC,KAAK,CAAC,QACzBf,MAAM,GAAGc,QAAQ,CAACC,KAAK,CAAG;AACnC,CAAC;AAED,OAAO,MAAMG,mBAAmB,GAAG,SAAAA,CACjCC,CAAkB,EAClBrB,iBAAiB,EACjBC,gBAAgB,EAChBU,MAAM,EACH;EAAA,IAHHX,iBAAiB;IAAjBA,iBAAiB,GAAG,GAAG;EAAA;EAAA,IACvBC,gBAAgB;IAAhBA,gBAAgB,GAAG,GAAG;EAAA;EAAA,IACtBU,MAAM;IAANA,MAAM,GAAG,IAAI;EAAA;EAEb,IAAI,CAACA,MAAM,EAAE;IACX,OAAOU,CAAC;EACV;EACA,MAAM9B,KAAK,GAAG8B,CAAC,CAAC7B,QAAQ,CAAC,CAAC,CAACC,KAAK,CAAC,GAAG,CAAC;EACrCF,KAAK,CAAC,CAAC,CAAC,GAAGA,KAAK,CAAC,CAAC,CAAC,CAAC+B,OAAO,CAAC,uBAAuB,EAAEtB,iBAAiB,CAAC;EAEvE,OAAOT,KAAK,CAACgC,IAAI,CAACtB,gBAAgB,CAAC;AACrC,CAAC"}
@@ -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
- it.each([["", ""], ["10", "10"], ["1000", "1K"], ["1000.00", "1K"], ["1200.50", "1.2K"], ["1,200.00", "1.2K"], ["2,240.00", "2.2K"], ["22,240.00", "22.2K"], ["50,000,000.00", "50M"], ["-50,000.00", "-50K"], ["-1,200", "-1.2K"], ["-90,000,000.00", "-90M"]])("should format currency", (value, expected) => {
4
- expect(formatNumber(value, ",")).toEqual(expected);
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
- describe("format currency with thousandseparator set to '.' and decimalSeparator to ','", () => {
8
- it.each([["", ""], ["10", "10"], ["1000", "1K"], ["1000,00", "1K"], ["1200,50", "1.2K"], ["1.200,00", "1.2K"], ["2.240,00", "2.2K"], ["22.240,00", "22.2K"], ["50.000.000,00", "50M"], ["-50.000,00", "-50K"], ["-1.200", "-1.2K"], ["-90.000.000,00", "-90M"]])("should format currency", (value, expected) => {
9
- expect(formatNumber(value, ".")).toEqual(expected);
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
- describe("numberWithSeparator", () => {
13
- test("should format number with thousand separator", () => {
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
- test("should format string number with thousand separator", () => {
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
- test("should format decimal number with thousand separator and keep decimal part", () => {
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
- test("should not format when format is set to false", () => {
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
- test("should handle zero with thousand separator", () => {
240
+ it("should handle zero with thousand separator", () => {
30
241
  const result = numberWithSeparator(0, ",");
31
242
  expect(result).toBe("0");
32
243
  });
33
- test("should handle negative number with thousand separator", () => {
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
- test("should not format", () => {
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