@activecollab/components 2.0.106 → 2.0.107

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":"EditableCurrency.js","names":["React","useMemo","useRef","useInputNumber","numberWithSeparator","useForkRef","EditableContent","Tooltip","EditableCurrency","forwardRef","_ref","ref","decimalLength","decimalSeparator","disableAbbreviation","disabled","disableMacros","step","thousandSeparator","value","defaultValue","onSave","onCancel","className","allowEmptyValue","onEnterKeyPress","externalEnterKeyPress","onClick","externalOnClick","onChange","externalOnChange","trimDecimals","rest","inputRef","handleRef","inputProps","onBlur","onKeyDown","onDoubleClick","onFocus","focused","unformattedValue","formattedValue","createElement","title","disable","displayName"],"sources":["../../../../src/components/EditableCurrency/EditableCurrency.tsx"],"sourcesContent":["import React, { useMemo, useRef } from \"react\";\n\nimport { IInputNumber, useInputNumber } from \"../../hooks\";\nimport { numberWithSeparator, useForkRef } from \"../../utils\";\nimport { EditableContent, EditableContentInterface } from \"../EditableContent\";\nimport { Tooltip } from \"../Tooltip\";\n\nexport interface EditableCurrencyProps\n extends EditableContentInterface,\n Omit<IInputNumber, \"limit\"> {\n className?: string;\n}\n\nexport const EditableCurrency = React.forwardRef<\n HTMLDivElement,\n EditableCurrencyProps\n>(\n (\n {\n decimalLength = 2,\n decimalSeparator = \".\",\n disableAbbreviation = false,\n disabled,\n disableMacros = false,\n step = 1,\n thousandSeparator = \",\",\n value: defaultValue,\n onSave,\n onCancel,\n className,\n allowEmptyValue,\n onEnterKeyPress: externalEnterKeyPress,\n onClick: externalOnClick,\n onChange: externalOnChange,\n trimDecimals = true,\n ...rest\n },\n ref\n ) => {\n const inputRef = useRef<HTMLInputElement>(null);\n const handleRef = useForkRef(ref, inputRef);\n\n const { inputProps } = useInputNumber(\n {\n decimalLength,\n decimalSeparator,\n disableAbbreviation,\n disableMacros,\n step,\n thousandSeparator,\n value: defaultValue,\n onSave,\n allowEmptyValue,\n onCancel,\n onChange: externalOnChange,\n onEnterKeyPress: externalEnterKeyPress,\n onClick: externalOnClick,\n trimDecimals,\n },\n inputRef\n );\n\n const {\n value,\n onBlur,\n onKeyDown,\n onChange,\n onClick,\n onDoubleClick,\n onFocus,\n focused,\n unformattedValue,\n } = inputProps;\n\n const formattedValue = useMemo(() => {\n return focused\n ? value\n : numberWithSeparator(value ?? \"\", thousandSeparator, decimalSeparator);\n }, [focused, value, thousandSeparator, decimalSeparator]);\n\n return (\n <Tooltip\n title={\n numberWithSeparator(\n unformattedValue ?? \"\",\n thousandSeparator,\n decimalSeparator\n ) as string\n }\n disable={focused}\n >\n <EditableContent\n disabled={disabled}\n ref={handleRef}\n className={className}\n inputProps={{\n value: formattedValue,\n onBlur: onBlur,\n onChange: onChange,\n onKeyDown: onKeyDown,\n onClick: onClick,\n onFocus: onFocus,\n onDoubleClick: onDoubleClick,\n ...rest,\n }}\n />\n </Tooltip>\n );\n }\n);\n\nEditableCurrency.displayName = \"EditableCurrency\";\n"],"mappings":"AAAA,OAAOA,KAAK,IAAIC,OAAO,EAAEC,MAAM,QAAQ,OAAO;AAE9C,SAAuBC,cAAc,QAAQ,aAAa;AAC1D,SAASC,mBAAmB,EAAEC,UAAU,QAAQ,aAAa;AAC7D,SAASC,eAAe,QAAkC,oBAAoB;AAC9E,SAASC,OAAO,QAAQ,YAAY;AAQpC,OAAO,MAAMC,gBAAgB,gBAAGR,KAAK,CAACS,UAAU,CAI9C,CAAAC,IAAA,EAoBEC,GAAG,KACA;EAAA,IApBH;IACEC,aAAa,GAAG,CAAC;IACjBC,gBAAgB,GAAG,GAAG;IACtBC,mBAAmB,GAAG,KAAK;IAC3BC,QAAQ;IACRC,aAAa,GAAG,KAAK;IACrBC,IAAI,GAAG,CAAC;IACRC,iBAAiB,GAAG,GAAG;IACvBC,KAAK,EAAEC,YAAY;IACnBC,MAAM;IACNC,QAAQ;IACRC,SAAS;IACTC,eAAe;IACfC,eAAe,EAAEC,qBAAqB;IACtCC,OAAO,EAAEC,eAAe;IACxBC,QAAQ,EAAEC,gBAAgB;IAC1BC,YAAY,GAAG,IAAI;IACnB,GAAGC;EACL,CAAC,GAAAtB,IAAA;EAGD,MAAMuB,QAAQ,GAAG/B,MAAM,CAAmB,IAAI,CAAC;EAC/C,MAAMgC,SAAS,GAAG7B,UAAU,CAACM,GAAG,EAAEsB,QAAQ,CAAC;EAE3C,MAAM;IAAEE;EAAW,CAAC,GAAGhC,cAAc,CACnC;IACES,aAAa;IACbC,gBAAgB;IAChBC,mBAAmB;IACnBE,aAAa;IACbC,IAAI;IACJC,iBAAiB;IACjBC,KAAK,EAAEC,YAAY;IACnBC,MAAM;IACNG,eAAe;IACfF,QAAQ;IACRO,QAAQ,EAAEC,gBAAgB;IAC1BL,eAAe,EAAEC,qBAAqB;IACtCC,OAAO,EAAEC,eAAe;IACxBG;EACF,CAAC,EACDE,QACF,CAAC;EAED,MAAM;IACJd,KAAK;IACLiB,MAAM;IACNC,SAAS;IACTR,QAAQ;IACRF,OAAO;IACPW,aAAa;IACbC,OAAO;IACPC,OAAO;IACPC;EACF,CAAC,GAAGN,UAAU;EAEd,MAAMO,cAAc,GAAGzC,OAAO,CAAC,MAAM;IACnC,OAAOuC,OAAO,GACVrB,KAAK,GACLf,mBAAmB,CAACe,KAAK,WAALA,KAAK,GAAI,EAAE,EAAED,iBAAiB,EAAEL,gBAAgB,CAAC;EAC3E,CAAC,EAAE,CAAC2B,OAAO,EAAErB,KAAK,EAAED,iBAAiB,EAAEL,gBAAgB,CAAC,CAAC;EAEzD,oBACEb,KAAA,CAAA2C,aAAA,CAACpC,OAAO;IACNqC,KAAK,EACHxC,mBAAmB,CACjBqC,gBAAgB,WAAhBA,gBAAgB,GAAI,EAAE,EACtBvB,iBAAiB,EACjBL,gBACF,CACD;IACDgC,OAAO,EAAEL;EAAQ,gBAEjBxC,KAAA,CAAA2C,aAAA,CAACrC,eAAe;IACdS,QAAQ,EAAEA,QAAS;IACnBJ,GAAG,EAAEuB,SAAU;IACfX,SAAS,EAAEA,SAAU;IACrBY,UAAU,EAAE;MACVhB,KAAK,EAAEuB,cAAc;MACrBN,MAAM,EAAEA,MAAM;MACdP,QAAQ,EAAEA,QAAQ;MAClBQ,SAAS,EAAEA,SAAS;MACpBV,OAAO,EAAEA,OAAO;MAChBY,OAAO,EAAEA,OAAO;MAChBD,aAAa,EAAEA,aAAa;MAC5B,GAAGN;IACL;EAAE,CACH,CACM,CAAC;AAEd,CACF,CAAC;AAEDxB,gBAAgB,CAACsC,WAAW,GAAG,kBAAkB"}
1
+ {"version":3,"file":"EditableCurrency.js","names":["React","useMemo","useRef","useInputNumber","numberWithSeparator","useForkRef","EditableContent","Tooltip","EditableCurrency","forwardRef","_ref","ref","decimalLength","decimalSeparator","disableAbbreviation","disabled","disableMacros","step","thousandSeparator","value","defaultValue","onSave","onCancel","className","allowEmptyValue","onEnterKeyPress","externalEnterKeyPress","onClick","externalOnClick","onChange","externalOnChange","trimDecimals","min","max","rest","inputRef","handleRef","onBlur","onKeyDown","onDoubleClick","onFocus","focused","unformattedValue","formattedValue","createElement","title","disable","inputProps","displayName"],"sources":["../../../../src/components/EditableCurrency/EditableCurrency.tsx"],"sourcesContent":["import React, { useMemo, useRef } from \"react\";\n\nimport { IInputNumber, useInputNumber } from \"../../hooks\";\nimport { numberWithSeparator, useForkRef } from \"../../utils\";\nimport { EditableContent, EditableContentInterface } from \"../EditableContent\";\nimport { Tooltip } from \"../Tooltip\";\n\nexport interface EditableCurrencyProps\n extends EditableContentInterface,\n Omit<IInputNumber, \"limit\"> {\n className?: string;\n}\n\nexport const EditableCurrency = React.forwardRef<\n HTMLDivElement,\n EditableCurrencyProps\n>(\n (\n {\n decimalLength = 2,\n decimalSeparator = \".\",\n disableAbbreviation = false,\n disabled,\n disableMacros = false,\n step = 1,\n thousandSeparator = \",\",\n value: defaultValue,\n onSave,\n onCancel,\n className,\n allowEmptyValue,\n onEnterKeyPress: externalEnterKeyPress,\n onClick: externalOnClick,\n onChange: externalOnChange,\n trimDecimals = true,\n min,\n max,\n ...rest\n },\n ref\n ) => {\n const inputRef = useRef<HTMLInputElement>(null);\n const handleRef = useForkRef(ref, inputRef);\n\n const {\n value,\n onBlur,\n onKeyDown,\n onChange,\n onClick,\n onDoubleClick,\n onFocus,\n focused,\n unformattedValue,\n } = useInputNumber(\n {\n decimalLength,\n decimalSeparator,\n disableAbbreviation,\n disableMacros,\n step,\n thousandSeparator,\n value: defaultValue,\n onSave,\n allowEmptyValue,\n onCancel,\n onChange: externalOnChange,\n onEnterKeyPress: externalEnterKeyPress,\n onClick: externalOnClick,\n trimDecimals,\n min,\n max,\n },\n inputRef\n );\n\n const formattedValue = useMemo(() => {\n return focused\n ? value\n : numberWithSeparator(value ?? \"\", thousandSeparator, decimalSeparator);\n }, [focused, value, thousandSeparator, decimalSeparator]);\n\n return (\n <Tooltip\n title={\n numberWithSeparator(\n unformattedValue ?? \"\",\n thousandSeparator,\n decimalSeparator\n ) as string\n }\n disable={focused}\n >\n <EditableContent\n disabled={disabled}\n ref={handleRef}\n className={className}\n inputProps={{\n value: formattedValue,\n onBlur: onBlur,\n onChange: onChange,\n onKeyDown: onKeyDown,\n onClick: onClick,\n onFocus: onFocus,\n onDoubleClick: onDoubleClick,\n ...rest,\n }}\n />\n </Tooltip>\n );\n }\n);\n\nEditableCurrency.displayName = \"EditableCurrency\";\n"],"mappings":"AAAA,OAAOA,KAAK,IAAIC,OAAO,EAAEC,MAAM,QAAQ,OAAO;AAE9C,SAAuBC,cAAc,QAAQ,aAAa;AAC1D,SAASC,mBAAmB,EAAEC,UAAU,QAAQ,aAAa;AAC7D,SAASC,eAAe,QAAkC,oBAAoB;AAC9E,SAASC,OAAO,QAAQ,YAAY;AAQpC,OAAO,MAAMC,gBAAgB,gBAAGR,KAAK,CAACS,UAAU,CAI9C,CAAAC,IAAA,EAsBEC,GAAG,KACA;EAAA,IAtBH;IACEC,aAAa,GAAG,CAAC;IACjBC,gBAAgB,GAAG,GAAG;IACtBC,mBAAmB,GAAG,KAAK;IAC3BC,QAAQ;IACRC,aAAa,GAAG,KAAK;IACrBC,IAAI,GAAG,CAAC;IACRC,iBAAiB,GAAG,GAAG;IACvBC,KAAK,EAAEC,YAAY;IACnBC,MAAM;IACNC,QAAQ;IACRC,SAAS;IACTC,eAAe;IACfC,eAAe,EAAEC,qBAAqB;IACtCC,OAAO,EAAEC,eAAe;IACxBC,QAAQ,EAAEC,gBAAgB;IAC1BC,YAAY,GAAG,IAAI;IACnBC,GAAG;IACHC,GAAG;IACH,GAAGC;EACL,CAAC,GAAAxB,IAAA;EAGD,MAAMyB,QAAQ,GAAGjC,MAAM,CAAmB,IAAI,CAAC;EAC/C,MAAMkC,SAAS,GAAG/B,UAAU,CAACM,GAAG,EAAEwB,QAAQ,CAAC;EAE3C,MAAM;IACJhB,KAAK;IACLkB,MAAM;IACNC,SAAS;IACTT,QAAQ;IACRF,OAAO;IACPY,aAAa;IACbC,OAAO;IACPC,OAAO;IACPC;EACF,CAAC,GAAGvC,cAAc,CAChB;IACES,aAAa;IACbC,gBAAgB;IAChBC,mBAAmB;IACnBE,aAAa;IACbC,IAAI;IACJC,iBAAiB;IACjBC,KAAK,EAAEC,YAAY;IACnBC,MAAM;IACNG,eAAe;IACfF,QAAQ;IACRO,QAAQ,EAAEC,gBAAgB;IAC1BL,eAAe,EAAEC,qBAAqB;IACtCC,OAAO,EAAEC,eAAe;IACxBG,YAAY;IACZC,GAAG;IACHC;EACF,CAAC,EACDE,QACF,CAAC;EAED,MAAMQ,cAAc,GAAG1C,OAAO,CAAC,MAAM;IACnC,OAAOwC,OAAO,GACVtB,KAAK,GACLf,mBAAmB,CAACe,KAAK,WAALA,KAAK,GAAI,EAAE,EAAED,iBAAiB,EAAEL,gBAAgB,CAAC;EAC3E,CAAC,EAAE,CAAC4B,OAAO,EAAEtB,KAAK,EAAED,iBAAiB,EAAEL,gBAAgB,CAAC,CAAC;EAEzD,oBACEb,KAAA,CAAA4C,aAAA,CAACrC,OAAO;IACNsC,KAAK,EACHzC,mBAAmB,CACjBsC,gBAAgB,WAAhBA,gBAAgB,GAAI,EAAE,EACtBxB,iBAAiB,EACjBL,gBACF,CACD;IACDiC,OAAO,EAAEL;EAAQ,gBAEjBzC,KAAA,CAAA4C,aAAA,CAACtC,eAAe;IACdS,QAAQ,EAAEA,QAAS;IACnBJ,GAAG,EAAEyB,SAAU;IACfb,SAAS,EAAEA,SAAU;IACrBwB,UAAU,EAAE;MACV5B,KAAK,EAAEwB,cAAc;MACrBN,MAAM,EAAEA,MAAM;MACdR,QAAQ,EAAEA,QAAQ;MAClBS,SAAS,EAAEA,SAAS;MACpBX,OAAO,EAAEA,OAAO;MAChBa,OAAO,EAAEA,OAAO;MAChBD,aAAa,EAAEA,aAAa;MAC5B,GAAGL;IACL;EAAE,CACH,CACM,CAAC;AAEd,CACF,CAAC;AAED1B,gBAAgB,CAACwC,WAAW,GAAG,kBAAkB"}
@@ -1 +1 @@
1
- {"version":3,"file":"InputNumber.d.ts","sourceRoot":"","sources":["../../../../src/components/Input/InputNumber.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA6B,MAAM,OAAO,CAAC;AAElD,OAAO,EAAS,UAAU,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAkB,MAAM,aAAa,CAAC;AAG3D,MAAM,WAAW,gBACf,SAAQ,IAAI,CAAC,UAAU,EAAE,OAAO,GAAG,UAAU,GAAG,MAAM,CAAC,EACrD,YAAY;CAAG;AAEnB,eAAO,MAAM,WAAW,2FA+EvB,CAAC"}
1
+ {"version":3,"file":"InputNumber.d.ts","sourceRoot":"","sources":["../../../../src/components/Input/InputNumber.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA6B,MAAM,OAAO,CAAC;AAElD,OAAO,EAAS,UAAU,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAkB,MAAM,aAAa,CAAC;AAG3D,MAAM,WAAW,gBACf,SAAQ,IAAI,CAAC,UAAU,EAAE,OAAO,GAAG,UAAU,GAAG,MAAM,CAAC,EACrD,YAAY;CAAG;AAEnB,eAAO,MAAM,WAAW,2FAkFvB,CAAC"}
@@ -23,12 +23,20 @@ export const InputNumber = /*#__PURE__*/forwardRef((_ref, ref) => {
23
23
  limit,
24
24
  placeholder,
25
25
  trimDecimals = true,
26
+ min,
27
+ max,
26
28
  ...rest
27
29
  } = _ref;
28
30
  const inputRef = useRef(null);
29
31
  const handleRef = useForkRef(ref, inputRef);
30
32
  const {
31
- inputProps
33
+ value,
34
+ onBlur,
35
+ onKeyDown,
36
+ onChange,
37
+ onClick,
38
+ onFocus,
39
+ onDoubleClick
32
40
  } = useInputNumber({
33
41
  decimalLength,
34
42
  decimalSeparator,
@@ -44,17 +52,10 @@ export const InputNumber = /*#__PURE__*/forwardRef((_ref, ref) => {
44
52
  onSave,
45
53
  allowEmptyValue,
46
54
  limit,
47
- trimDecimals
55
+ trimDecimals,
56
+ min,
57
+ max
48
58
  }, inputRef);
49
- const {
50
- value,
51
- onBlur,
52
- onKeyDown,
53
- onChange,
54
- onClick,
55
- onDoubleClick,
56
- onFocus
57
- } = inputProps;
58
59
  return /*#__PURE__*/React.createElement(Input, _extends({}, rest, {
59
60
  ref: handleRef,
60
61
  placeholder: placeholder,
@@ -1 +1 @@
1
- {"version":3,"file":"InputNumber.js","names":["React","forwardRef","useRef","Input","useInputNumber","useForkRef","InputNumber","_ref","ref","decimalLength","decimalSeparator","disableAbbreviation","disabled","disableMacros","invalid","step","thousandSeparator","value","defaultValue","onCancel","onSave","onEnterKeyPress","externalEnterKeyPress","allowEmptyValue","onChange","externalOnChange","onClick","externalOnClick","limit","placeholder","trimDecimals","rest","inputRef","handleRef","inputProps","onBlur","onKeyDown","onDoubleClick","onFocus","createElement","_extends","type","displayName"],"sources":["../../../../src/components/Input/InputNumber.tsx"],"sourcesContent":["import React, { forwardRef, useRef } from \"react\";\n\nimport { Input, InputProps } from \"./Input\";\nimport { IInputNumber, useInputNumber } from \"../../hooks\";\nimport { useForkRef } from \"../../utils\";\n\nexport interface InputNumberProps\n extends Omit<InputProps, \"value\" | \"onChange\" | \"step\">,\n IInputNumber {}\n\nexport const InputNumber = forwardRef<HTMLInputElement, InputNumberProps>(\n (\n {\n decimalLength = 2,\n decimalSeparator = \".\",\n disableAbbreviation = false,\n disabled,\n disableMacros = false,\n invalid,\n step = 1,\n thousandSeparator = \",\",\n value: defaultValue,\n onCancel,\n onSave,\n onEnterKeyPress: externalEnterKeyPress,\n allowEmptyValue,\n onChange: externalOnChange,\n onClick: externalOnClick,\n limit,\n placeholder,\n trimDecimals = true,\n ...rest\n },\n ref\n ) => {\n const inputRef = useRef<HTMLInputElement | null>(null);\n const handleRef = useForkRef(ref, inputRef);\n\n const { inputProps } = useInputNumber(\n {\n decimalLength,\n decimalSeparator,\n disableAbbreviation,\n disableMacros,\n step,\n thousandSeparator,\n onEnterKeyPress: externalEnterKeyPress,\n onChange: externalOnChange,\n onClick: externalOnClick,\n value: defaultValue,\n onCancel,\n onSave,\n allowEmptyValue,\n limit,\n trimDecimals,\n },\n inputRef\n );\n const {\n value,\n onBlur,\n onKeyDown,\n onChange,\n onClick,\n onDoubleClick,\n onFocus,\n } = inputProps;\n\n return (\n <Input\n {...rest}\n ref={handleRef}\n placeholder={placeholder}\n value={value}\n type=\"text\"\n disabled={disabled}\n invalid={invalid}\n onChange={onChange}\n onBlur={onBlur}\n onKeyDown={onKeyDown}\n onClick={onClick}\n onDoubleClick={onDoubleClick}\n onFocus={onFocus}\n aria-placeholder={placeholder}\n aria-disabled={disabled}\n aria-invalid={invalid}\n />\n );\n }\n);\n\nInputNumber.displayName = \"InputNumber\";\n"],"mappings":";AAAA,OAAOA,KAAK,IAAIC,UAAU,EAAEC,MAAM,QAAQ,OAAO;AAEjD,SAASC,KAAK,QAAoB,SAAS;AAC3C,SAAuBC,cAAc,QAAQ,aAAa;AAC1D,SAASC,UAAU,QAAQ,aAAa;AAMxC,OAAO,MAAMC,WAAW,gBAAGL,UAAU,CACnC,CAAAM,IAAA,EAsBEC,GAAG,KACA;EAAA,IAtBH;IACEC,aAAa,GAAG,CAAC;IACjBC,gBAAgB,GAAG,GAAG;IACtBC,mBAAmB,GAAG,KAAK;IAC3BC,QAAQ;IACRC,aAAa,GAAG,KAAK;IACrBC,OAAO;IACPC,IAAI,GAAG,CAAC;IACRC,iBAAiB,GAAG,GAAG;IACvBC,KAAK,EAAEC,YAAY;IACnBC,QAAQ;IACRC,MAAM;IACNC,eAAe,EAAEC,qBAAqB;IACtCC,eAAe;IACfC,QAAQ,EAAEC,gBAAgB;IAC1BC,OAAO,EAAEC,eAAe;IACxBC,KAAK;IACLC,WAAW;IACXC,YAAY,GAAG,IAAI;IACnB,GAAGC;EACL,CAAC,GAAAxB,IAAA;EAGD,MAAMyB,QAAQ,GAAG9B,MAAM,CAA0B,IAAI,CAAC;EACtD,MAAM+B,SAAS,GAAG5B,UAAU,CAACG,GAAG,EAAEwB,QAAQ,CAAC;EAE3C,MAAM;IAAEE;EAAW,CAAC,GAAG9B,cAAc,CACnC;IACEK,aAAa;IACbC,gBAAgB;IAChBC,mBAAmB;IACnBE,aAAa;IACbE,IAAI;IACJC,iBAAiB;IACjBK,eAAe,EAAEC,qBAAqB;IACtCE,QAAQ,EAAEC,gBAAgB;IAC1BC,OAAO,EAAEC,eAAe;IACxBV,KAAK,EAAEC,YAAY;IACnBC,QAAQ;IACRC,MAAM;IACNG,eAAe;IACfK,KAAK;IACLE;EACF,CAAC,EACDE,QACF,CAAC;EACD,MAAM;IACJf,KAAK;IACLkB,MAAM;IACNC,SAAS;IACTZ,QAAQ;IACRE,OAAO;IACPW,aAAa;IACbC;EACF,CAAC,GAAGJ,UAAU;EAEd,oBACElC,KAAA,CAAAuC,aAAA,CAACpC,KAAK,EAAAqC,QAAA,KACAT,IAAI;IACRvB,GAAG,EAAEyB,SAAU;IACfJ,WAAW,EAAEA,WAAY;IACzBZ,KAAK,EAAEA,KAAM;IACbwB,IAAI,EAAC,MAAM;IACX7B,QAAQ,EAAEA,QAAS;IACnBE,OAAO,EAAEA,OAAQ;IACjBU,QAAQ,EAAEA,QAAS;IACnBW,MAAM,EAAEA,MAAO;IACfC,SAAS,EAAEA,SAAU;IACrBV,OAAO,EAAEA,OAAQ;IACjBW,aAAa,EAAEA,aAAc;IAC7BC,OAAO,EAAEA,OAAQ;IACjB,oBAAkBT,WAAY;IAC9B,iBAAejB,QAAS;IACxB,gBAAcE;EAAQ,EACvB,CAAC;AAEN,CACF,CAAC;AAEDR,WAAW,CAACoC,WAAW,GAAG,aAAa"}
1
+ {"version":3,"file":"InputNumber.js","names":["React","forwardRef","useRef","Input","useInputNumber","useForkRef","InputNumber","_ref","ref","decimalLength","decimalSeparator","disableAbbreviation","disabled","disableMacros","invalid","step","thousandSeparator","value","defaultValue","onCancel","onSave","onEnterKeyPress","externalEnterKeyPress","allowEmptyValue","onChange","externalOnChange","onClick","externalOnClick","limit","placeholder","trimDecimals","min","max","rest","inputRef","handleRef","onBlur","onKeyDown","onFocus","onDoubleClick","createElement","_extends","type","displayName"],"sources":["../../../../src/components/Input/InputNumber.tsx"],"sourcesContent":["import React, { forwardRef, useRef } from \"react\";\n\nimport { Input, InputProps } from \"./Input\";\nimport { IInputNumber, useInputNumber } from \"../../hooks\";\nimport { useForkRef } from \"../../utils\";\n\nexport interface InputNumberProps\n extends Omit<InputProps, \"value\" | \"onChange\" | \"step\">,\n IInputNumber {}\n\nexport const InputNumber = forwardRef<HTMLInputElement, InputNumberProps>(\n (\n {\n decimalLength = 2,\n decimalSeparator = \".\",\n disableAbbreviation = false,\n disabled,\n disableMacros = false,\n invalid,\n step = 1,\n thousandSeparator = \",\",\n value: defaultValue,\n onCancel,\n onSave,\n onEnterKeyPress: externalEnterKeyPress,\n allowEmptyValue,\n onChange: externalOnChange,\n onClick: externalOnClick,\n limit,\n placeholder,\n trimDecimals = true,\n min,\n max,\n ...rest\n },\n ref\n ) => {\n const inputRef = useRef<HTMLInputElement | null>(null);\n const handleRef = useForkRef(ref, inputRef);\n\n const {\n value,\n onBlur,\n onKeyDown,\n onChange,\n onClick,\n onFocus,\n onDoubleClick,\n } = useInputNumber(\n {\n decimalLength,\n decimalSeparator,\n disableAbbreviation,\n disableMacros,\n step,\n thousandSeparator,\n onEnterKeyPress: externalEnterKeyPress,\n onChange: externalOnChange,\n onClick: externalOnClick,\n value: defaultValue,\n onCancel,\n onSave,\n allowEmptyValue,\n limit,\n trimDecimals,\n min,\n max,\n },\n inputRef\n );\n\n return (\n <Input\n {...rest}\n ref={handleRef}\n placeholder={placeholder}\n value={value}\n type=\"text\"\n disabled={disabled}\n invalid={invalid}\n onChange={onChange}\n onBlur={onBlur}\n onKeyDown={onKeyDown}\n onClick={onClick}\n onDoubleClick={onDoubleClick}\n onFocus={onFocus}\n aria-placeholder={placeholder}\n aria-disabled={disabled}\n aria-invalid={invalid}\n />\n );\n }\n);\n\nInputNumber.displayName = \"InputNumber\";\n"],"mappings":";AAAA,OAAOA,KAAK,IAAIC,UAAU,EAAEC,MAAM,QAAQ,OAAO;AAEjD,SAASC,KAAK,QAAoB,SAAS;AAC3C,SAAuBC,cAAc,QAAQ,aAAa;AAC1D,SAASC,UAAU,QAAQ,aAAa;AAMxC,OAAO,MAAMC,WAAW,gBAAGL,UAAU,CACnC,CAAAM,IAAA,EAwBEC,GAAG,KACA;EAAA,IAxBH;IACEC,aAAa,GAAG,CAAC;IACjBC,gBAAgB,GAAG,GAAG;IACtBC,mBAAmB,GAAG,KAAK;IAC3BC,QAAQ;IACRC,aAAa,GAAG,KAAK;IACrBC,OAAO;IACPC,IAAI,GAAG,CAAC;IACRC,iBAAiB,GAAG,GAAG;IACvBC,KAAK,EAAEC,YAAY;IACnBC,QAAQ;IACRC,MAAM;IACNC,eAAe,EAAEC,qBAAqB;IACtCC,eAAe;IACfC,QAAQ,EAAEC,gBAAgB;IAC1BC,OAAO,EAAEC,eAAe;IACxBC,KAAK;IACLC,WAAW;IACXC,YAAY,GAAG,IAAI;IACnBC,GAAG;IACHC,GAAG;IACH,GAAGC;EACL,CAAC,GAAA1B,IAAA;EAGD,MAAM2B,QAAQ,GAAGhC,MAAM,CAA0B,IAAI,CAAC;EACtD,MAAMiC,SAAS,GAAG9B,UAAU,CAACG,GAAG,EAAE0B,QAAQ,CAAC;EAE3C,MAAM;IACJjB,KAAK;IACLmB,MAAM;IACNC,SAAS;IACTb,QAAQ;IACRE,OAAO;IACPY,OAAO;IACPC;EACF,CAAC,GAAGnC,cAAc,CAChB;IACEK,aAAa;IACbC,gBAAgB;IAChBC,mBAAmB;IACnBE,aAAa;IACbE,IAAI;IACJC,iBAAiB;IACjBK,eAAe,EAAEC,qBAAqB;IACtCE,QAAQ,EAAEC,gBAAgB;IAC1BC,OAAO,EAAEC,eAAe;IACxBV,KAAK,EAAEC,YAAY;IACnBC,QAAQ;IACRC,MAAM;IACNG,eAAe;IACfK,KAAK;IACLE,YAAY;IACZC,GAAG;IACHC;EACF,CAAC,EACDE,QACF,CAAC;EAED,oBACElC,KAAA,CAAAwC,aAAA,CAACrC,KAAK,EAAAsC,QAAA,KACAR,IAAI;IACRzB,GAAG,EAAE2B,SAAU;IACfN,WAAW,EAAEA,WAAY;IACzBZ,KAAK,EAAEA,KAAM;IACbyB,IAAI,EAAC,MAAM;IACX9B,QAAQ,EAAEA,QAAS;IACnBE,OAAO,EAAEA,OAAQ;IACjBU,QAAQ,EAAEA,QAAS;IACnBY,MAAM,EAAEA,MAAO;IACfC,SAAS,EAAEA,SAAU;IACrBX,OAAO,EAAEA,OAAQ;IACjBa,aAAa,EAAEA,aAAc;IAC7BD,OAAO,EAAEA,OAAQ;IACjB,oBAAkBT,WAAY;IAC9B,iBAAejB,QAAS;IACxB,gBAAcE;EAAQ,EACvB,CAAC;AAEN,CACF,CAAC;AAEDR,WAAW,CAACqC,WAAW,GAAG,aAAa"}
@@ -17,20 +17,18 @@ export interface IInputNumber {
17
17
  allowEmptyValue?: boolean;
18
18
  onCancel?: (e: Event) => void;
19
19
  validation?: (value: string, disableMacros: boolean, decimalSeparator: string, decimalLength: number, limit?: number) => boolean;
20
+ min?: string | number;
21
+ max?: string | number;
20
22
  }
21
- export declare const useInputNumber: ({ decimalSeparator, thousandSeparator, disableAbbreviation, disableMacros, decimalLength, value, onChange, onSave, onEnterKeyPress, onClick, onCancel, allowEmptyValue, step, trimDecimals, limit, validation, }: IInputNumber, inputRef: RefObject<HTMLInputElement | null>) => {
22
- inputProps: {
23
- value: string | number;
24
- onBlur: (e: any) => void;
25
- onKeyDown: (e: any) => void;
26
- onChange: (e: any) => void;
27
- onClick: (e: any) => void;
28
- onDoubleClick: () => void;
29
- onFocus: () => void;
30
- focused: boolean;
31
- unformattedValue: string | number;
32
- };
33
- setCurrentValue: import("react").Dispatch<import("react").SetStateAction<string | number>>;
34
- setPrevValue: import("react").Dispatch<import("react").SetStateAction<string | number>>;
23
+ export declare const useInputNumber: ({ decimalSeparator, thousandSeparator, disableAbbreviation, disableMacros, decimalLength, value, onChange, onSave, onEnterKeyPress, onClick, onCancel, allowEmptyValue, step, trimDecimals, limit, validation, min, max, }: IInputNumber, inputRef: RefObject<HTMLInputElement | null>) => {
24
+ value: string | number;
25
+ onBlur: (e: any) => void;
26
+ onKeyDown: (e: any) => void;
27
+ onChange: (e: any) => void;
28
+ onClick: (e: any) => void;
29
+ onDoubleClick: () => void;
30
+ onFocus: () => void;
31
+ focused: boolean;
32
+ unformattedValue: string | number;
35
33
  };
36
34
  //# sourceMappingURL=useInputNumber.d.ts.map
@@ -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,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,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,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,qNAkBtB,YAAY,YACL,UAAU,gBAAgB,GAAG,IAAI,CAAC;;;;;;;;;;;;;;CA8S7C,CAAC"}
1
+ {"version":3,"file":"useInputNumber.d.ts","sourceRoot":"","sources":["../../../src/hooks/useInputNumber.tsx"],"names":[],"mappings":"AAAA,OAAO,EAEL,UAAU,EAGV,SAAS,EAEV,MAAM,OAAO,CAAC;AAKf,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,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,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;IACb,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACvB;AAED,eAAO,MAAM,cAAc,+NAoBtB,YAAY,YACL,UAAU,gBAAgB,GAAG,IAAI,CAAC;;;;;;;;;;CAiT7C,CAAC"}
@@ -1,6 +1,6 @@
1
- import { useState, useRef, useCallback, useMemo, useEffect } from "react";
1
+ import { useState, useRef, useCallback, useEffect } from "react";
2
2
  import { validateNumberInput } from "../utils";
3
- import { currencyMultiplier, formatNumber, numberWithSeparator } from "../utils/currencyUtils";
3
+ import { currencyMultiplier, formatNumber } from "../utils/currencyUtils";
4
4
  export const useInputNumber = (_ref, inputRef) => {
5
5
  let {
6
6
  decimalSeparator = ".",
@@ -18,16 +18,24 @@ export const useInputNumber = (_ref, inputRef) => {
18
18
  step = 1,
19
19
  trimDecimals = true,
20
20
  limit,
21
- validation = validateNumberInput
21
+ validation = validateNumberInput,
22
+ min,
23
+ max
22
24
  } = _ref;
25
+ const isMaxValid = max === undefined || min === undefined || Number(max) >= Number(min);
26
+ if (!isMaxValid) {
27
+ console.warn("Warning: The maximum value is set to be lower than the minimum value. The maximum value will be ignored.");
28
+ }
23
29
  const [currentValue, setCurrentValue] = useState(() => disableAbbreviation ? value : formatNumber(value, thousandSeparator, decimalSeparator, trimDecimals, decimalLength));
24
30
  const [prevValue, setPrevValue] = useState(() => disableAbbreviation ? value : formatNumber(value, thousandSeparator, decimalSeparator, trimDecimals, decimalLength));
25
31
  const [unformattedValue, setUnformattedValue] = useState(() => value);
32
+ const [unformattedPrevValue, setUnformattedPrevValue] = useState(() => value);
26
33
  useEffect(() => {
27
34
  if (value !== prevValue) {
28
35
  setCurrentValue(disableAbbreviation ? value : formatNumber(value, thousandSeparator, decimalSeparator, trimDecimals, decimalLength));
29
36
  setPrevValue(disableAbbreviation ? value : formatNumber(value, thousandSeparator, decimalSeparator, trimDecimals, decimalLength));
30
37
  setUnformattedValue(value);
38
+ setUnformattedPrevValue(value);
31
39
  }
32
40
  // eslint-disable-next-line react-hooks/exhaustive-deps
33
41
  }, [disableAbbreviation, thousandSeparator, decimalSeparator, decimalLength, trimDecimals, value]);
@@ -36,18 +44,20 @@ export const useInputNumber = (_ref, inputRef) => {
36
44
  const handleBlur = useCallback(e => {
37
45
  if (escapeRef.current) {
38
46
  setCurrentValue(prevValue);
39
- setUnformattedValue(prevValue);
47
+ setUnformattedValue(unformattedPrevValue);
48
+ if (onChange) onChange(String(unformattedPrevValue));
40
49
  } else {
41
50
  if (e.target.value.trim().length > 0 && prevValue !== e.target.value) {
42
51
  const _value = disableAbbreviation ? currentValue : formatNumber(currentValue, thousandSeparator, decimalSeparator, trimDecimals, decimalLength);
43
52
  setPrevValue(_value);
53
+ setUnformattedPrevValue(currentValue);
44
54
  setUnformattedValue(currentValue);
45
55
  setCurrentValue(_value);
46
56
  typeof onSave === "function" && onSave(e);
47
57
  } else {
48
58
  if (!allowEmptyValue) {
49
59
  setCurrentValue(prevValue);
50
- setUnformattedValue(prevValue);
60
+ setUnformattedValue(unformattedPrevValue);
51
61
  typeof onCancel === "function" && onCancel(e);
52
62
  } else {
53
63
  if (typeof onSave === "function" && prevValue !== e.target.value) {
@@ -59,33 +69,34 @@ export const useInputNumber = (_ref, inputRef) => {
59
69
  }
60
70
  }
61
71
  setFocused(false);
62
- }, [prevValue, disableAbbreviation, currentValue, thousandSeparator, decimalSeparator, decimalLength, trimDecimals, onSave, allowEmptyValue, onCancel]);
72
+ }, [prevValue, unformattedPrevValue, onChange, disableAbbreviation, currentValue, thousandSeparator, decimalSeparator, trimDecimals, decimalLength, onSave, allowEmptyValue, onCancel]);
63
73
  const updateValue = useCallback(type => {
64
- const value = String(unformattedValue);
65
- let decimalPart = "";
66
- let increasedValue = 0;
67
- let nonDecimalPart = value.replaceAll(thousandSeparator, "");
68
- if (!value) {
69
- return;
74
+ const numericValue = parseFloat(String(unformattedValue));
75
+ if (isNaN(numericValue)) return;
76
+ let newValue = numericValue;
77
+ if (type === "increment") {
78
+ newValue += step;
79
+ } else if (type === "decrement") {
80
+ newValue -= step;
70
81
  }
71
- if (value.includes(decimalSeparator)) {
72
- nonDecimalPart = value.slice(0, value.indexOf(decimalSeparator)).replaceAll(thousandSeparator, "");
82
+ if (decimalLength !== undefined) {
83
+ newValue = parseFloat(newValue.toFixed(decimalLength));
84
+ } else {
85
+ newValue = parseFloat(newValue.toFixed(2));
73
86
  }
74
- if (value.includes(decimalSeparator)) {
75
- decimalPart = value.slice(value.indexOf(decimalSeparator));
87
+ if (min !== undefined && newValue < Number(min)) {
88
+ newValue = Number(min);
76
89
  }
77
- if (type === "increment") {
78
- increasedValue = parseFloat(nonDecimalPart) + step;
79
- } else {
80
- increasedValue = parseFloat(nonDecimalPart) - step;
90
+ if (max !== undefined && newValue > Number(max) && isMaxValid) {
91
+ newValue = Number(max);
81
92
  }
82
- if (value.includes(decimalSeparator)) {
83
- increasedValue = parseFloat(increasedValue.toFixed(decimalLength));
93
+ if (decimalLength !== undefined && decimalLength === 0) {
94
+ newValue = Math.round(newValue);
84
95
  }
85
- const joinedValue = numberWithSeparator(increasedValue, thousandSeparator, decimalSeparator, value.includes(thousandSeparator));
86
- setUnformattedValue(decimalPart ? joinedValue + decimalPart : joinedValue);
87
- setCurrentValue(decimalPart ? joinedValue + decimalPart : joinedValue);
88
- }, [decimalLength, decimalSeparator, step, thousandSeparator, unformattedValue]);
96
+ setUnformattedValue(newValue);
97
+ setCurrentValue(newValue);
98
+ if (onChange) onChange(String(newValue));
99
+ }, [unformattedValue, decimalLength, min, max, isMaxValid, onChange, step]);
89
100
  const handleKeyDown = useCallback(e => {
90
101
  if (e.key === "Enter") {
91
102
  e.target.blur();
@@ -126,6 +137,18 @@ export const useInputNumber = (_ref, inputRef) => {
126
137
  e.preventDefault();
127
138
  return;
128
139
  }
140
+
141
+ // Disallow "-" if min is 0 or greater
142
+ if (e.key === "-" && (min === undefined || Number(min) >= 0)) {
143
+ e.preventDefault();
144
+ return;
145
+ }
146
+
147
+ // Disallow decimal separator if decimalLength is 0
148
+ if (e.key === decimalSeparator && decimalLength === 0) {
149
+ e.preventDefault();
150
+ return;
151
+ }
129
152
  const input = e.target;
130
153
  const currentValue = input.value;
131
154
  const start = input.selectionStart;
@@ -135,7 +158,7 @@ export const useInputNumber = (_ref, inputRef) => {
135
158
  e.preventDefault();
136
159
  return;
137
160
  }
138
- }, [decimalLength, decimalSeparator, disableMacros, inputRef, limit, onCancel, onEnterKeyPress, updateValue, validation]);
161
+ }, [decimalLength, decimalSeparator, disableMacros, inputRef, limit, min, onCancel, onEnterKeyPress, updateValue, validation]);
139
162
  const handleChange = useCallback(e => {
140
163
  const inputValue = e.target.value;
141
164
  const numericInput = disableMacros ? inputValue : inputValue.replace(/([0-9.]+)([kmbtKMBT])/, (_, num, unit) => {
@@ -160,23 +183,16 @@ export const useInputNumber = (_ref, inputRef) => {
160
183
  (_inputRef$current2 = inputRef.current) == null || _inputRef$current2.select();
161
184
  }
162
185
  }, [inputRef]);
163
- const inputProps = useMemo(() => {
164
- return {
165
- value: currentValue,
166
- onBlur: handleBlur,
167
- onKeyDown: handleKeyDown,
168
- onChange: handleChange,
169
- onClick: handleClick,
170
- onDoubleClick: handleDoubleClick,
171
- onFocus: handleFocus,
172
- focused,
173
- unformattedValue
174
- };
175
- }, [currentValue, handleBlur, handleKeyDown, handleChange, handleClick, handleDoubleClick, handleFocus, focused, unformattedValue]);
176
186
  return {
177
- inputProps,
178
- setCurrentValue,
179
- setPrevValue
187
+ value: currentValue,
188
+ onBlur: handleBlur,
189
+ onKeyDown: handleKeyDown,
190
+ onChange: handleChange,
191
+ onClick: handleClick,
192
+ onDoubleClick: handleDoubleClick,
193
+ onFocus: handleFocus,
194
+ focused,
195
+ unformattedValue
180
196
  };
181
197
  };
182
198
  //# sourceMappingURL=useInputNumber.js.map
@@ -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","trimDecimals","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 trimDecimals?: boolean;\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 trimDecimals = true,\n limit,\n validation = validateNumberInput,\n }: IInputNumber,\n inputRef: RefObject<HTMLInputElement | null>\n) => {\n const [currentValue, setCurrentValue] = useState(() =>\n disableAbbreviation\n ? value\n : formatNumber(\n value as string,\n thousandSeparator,\n decimalSeparator,\n trimDecimals,\n decimalLength\n )\n );\n const [prevValue, setPrevValue] = useState(() =>\n disableAbbreviation\n ? value\n : formatNumber(\n value as string,\n thousandSeparator,\n decimalSeparator,\n trimDecimals,\n decimalLength\n )\n );\n const [unformattedValue, setUnformattedValue] = useState(() => value);\n\n useEffect(() => {\n if (value !== prevValue) {\n setCurrentValue(\n disableAbbreviation\n ? value\n : formatNumber(\n value as string,\n thousandSeparator,\n decimalSeparator,\n trimDecimals,\n decimalLength\n )\n );\n setPrevValue(\n disableAbbreviation\n ? value\n : formatNumber(\n value as string,\n thousandSeparator,\n decimalSeparator,\n trimDecimals,\n decimalLength\n )\n );\n setUnformattedValue(value);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n disableAbbreviation,\n thousandSeparator,\n decimalSeparator,\n decimalLength,\n trimDecimals,\n value,\n ]);\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(\n currentValue as string,\n thousandSeparator,\n decimalSeparator,\n trimDecimals,\n decimalLength\n );\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 prevValue,\n disableAbbreviation,\n currentValue,\n thousandSeparator,\n decimalSeparator,\n decimalLength,\n trimDecimals,\n onSave,\n allowEmptyValue,\n onCancel,\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
+ {"version":3,"file":"useInputNumber.js","names":["useState","useRef","useCallback","useEffect","validateNumberInput","currencyMultiplier","formatNumber","useInputNumber","_ref","inputRef","decimalSeparator","thousandSeparator","disableAbbreviation","disableMacros","decimalLength","value","onChange","onSave","onEnterKeyPress","onClick","onCancel","allowEmptyValue","step","trimDecimals","limit","validation","min","max","isMaxValid","undefined","Number","console","warn","currentValue","setCurrentValue","prevValue","setPrevValue","unformattedValue","setUnformattedValue","unformattedPrevValue","setUnformattedPrevValue","focused","setFocused","escapeRef","handleBlur","e","current","String","target","trim","length","_value","updateValue","type","numericValue","parseFloat","isNaN","newValue","toFixed","Math","round","handleKeyDown","key","blur","preventDefault","metaKey","ctrlKey","_inputRef$current","select","input","start","selectionStart","end","selectionEnd","substring","Boolean","handleChange","inputValue","numericInput","replace","_","num","unit","toLowerCase","toString","handleClick","handleFocus","handleDoubleClick","_inputRef$current2","onBlur","onKeyDown","onDoubleClick","onFocus"],"sources":["../../../src/hooks/useInputNumber.tsx"],"sourcesContent":["import {\n useState,\n MouseEvent,\n useRef,\n useCallback,\n RefObject,\n useEffect,\n} from \"react\";\n\nimport { validateNumberInput } from \"../utils\";\nimport { currencyMultiplier, formatNumber } 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 trimDecimals?: boolean;\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 min?: string | number;\n max?: string | number;\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 trimDecimals = true,\n limit,\n validation = validateNumberInput,\n min,\n max,\n }: IInputNumber,\n inputRef: RefObject<HTMLInputElement | null>\n) => {\n const isMaxValid =\n max === undefined || min === undefined || Number(max) >= Number(min);\n\n if (!isMaxValid) {\n console.warn(\n \"Warning: The maximum value is set to be lower than the minimum value. The maximum value will be ignored.\"\n );\n }\n\n const [currentValue, setCurrentValue] = useState(() =>\n disableAbbreviation\n ? value\n : formatNumber(\n value as string,\n thousandSeparator,\n decimalSeparator,\n trimDecimals,\n decimalLength\n )\n );\n const [prevValue, setPrevValue] = useState(() =>\n disableAbbreviation\n ? value\n : formatNumber(\n value as string,\n thousandSeparator,\n decimalSeparator,\n trimDecimals,\n decimalLength\n )\n );\n const [unformattedValue, setUnformattedValue] = useState(() => value);\n const [unformattedPrevValue, setUnformattedPrevValue] = useState(() => value);\n\n useEffect(() => {\n if (value !== prevValue) {\n setCurrentValue(\n disableAbbreviation\n ? value\n : formatNumber(\n value as string,\n thousandSeparator,\n decimalSeparator,\n trimDecimals,\n decimalLength\n )\n );\n setPrevValue(\n disableAbbreviation\n ? value\n : formatNumber(\n value as string,\n thousandSeparator,\n decimalSeparator,\n trimDecimals,\n decimalLength\n )\n );\n setUnformattedValue(value);\n setUnformattedPrevValue(value);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [\n disableAbbreviation,\n thousandSeparator,\n decimalSeparator,\n decimalLength,\n trimDecimals,\n value,\n ]);\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(unformattedPrevValue);\n if (onChange) onChange(String(unformattedPrevValue));\n } else {\n if (e.target.value.trim().length > 0 && prevValue !== e.target.value) {\n const _value = disableAbbreviation\n ? currentValue\n : formatNumber(\n currentValue as string,\n thousandSeparator,\n decimalSeparator,\n trimDecimals,\n decimalLength\n );\n setPrevValue(_value);\n setUnformattedPrevValue(currentValue);\n setUnformattedValue(currentValue);\n setCurrentValue(_value);\n typeof onSave === \"function\" && onSave(e);\n } else {\n if (!allowEmptyValue) {\n setCurrentValue(prevValue);\n setUnformattedValue(unformattedPrevValue);\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 prevValue,\n unformattedPrevValue,\n onChange,\n disableAbbreviation,\n currentValue,\n thousandSeparator,\n decimalSeparator,\n trimDecimals,\n decimalLength,\n onSave,\n allowEmptyValue,\n onCancel,\n ]\n );\n\n const updateValue = useCallback(\n (type: \"increment\" | \"decrement\") => {\n const numericValue = parseFloat(String(unformattedValue));\n\n if (isNaN(numericValue)) return;\n\n let newValue = numericValue;\n\n if (type === \"increment\") {\n newValue += step;\n } else if (type === \"decrement\") {\n newValue -= step;\n }\n\n if (decimalLength !== undefined) {\n newValue = parseFloat(newValue.toFixed(decimalLength));\n } else {\n newValue = parseFloat(newValue.toFixed(2));\n }\n\n if (min !== undefined && newValue < Number(min)) {\n newValue = Number(min);\n }\n\n if (max !== undefined && newValue > Number(max) && isMaxValid) {\n newValue = Number(max);\n }\n\n if (decimalLength !== undefined && decimalLength === 0) {\n newValue = Math.round(newValue);\n }\n\n setUnformattedValue(newValue);\n setCurrentValue(newValue);\n if (onChange) onChange(String(newValue));\n },\n [unformattedValue, decimalLength, min, max, isMaxValid, onChange, step]\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\n // Disallow \"-\" if min is 0 or greater\n if (e.key === \"-\" && (min === undefined || Number(min) >= 0)) {\n e.preventDefault();\n return;\n }\n\n // Disallow decimal separator if decimalLength is 0\n if (e.key === decimalSeparator && decimalLength === 0) {\n e.preventDefault();\n return;\n }\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 min,\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 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"],"mappings":"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"}
@@ -1 +1 @@
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"}
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,mIA+CnB,CAAC;AAEF,eAAO,MAAM,mBAAmB,MAC3B,MAAM,GAAG,MAAM,6FAYnB,CAAC"}
@@ -72,7 +72,11 @@ export const formatNumber = function (n, thousandSeparator, decimalSeperator, tr
72
72
  absoluteNumber /= 1000;
73
73
  scale++;
74
74
  }
75
- const formattedNum = scale === 0 ? fixedDecimalSpaces(absoluteNumber, decimalSpaces) : parseFloat(absoluteNumber.toFixed(1));
75
+ let formattedNum = scale === 0 ? fixedDecimalSpaces(absoluteNumber, decimalSpaces) : parseFloat(absoluteNumber.toFixed(1));
76
+ if (formattedNum === 1000 && scale > 0 && scale < 4) {
77
+ formattedNum = 1;
78
+ scale++;
79
+ }
76
80
  const result = numberWithSeparator(trimDecimals ? formattedNum : formattedNum.toFixed(decimalSpaces), thousandSeparator, decimalSeperator);
77
81
  return isNegative ? "-" + result + suffixes[scale] : "" + result + suffixes[scale];
78
82
  };
@@ -1 +1 @@
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
+ {"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 let formattedNum =\n scale === 0\n ? fixedDecimalSpaces(absoluteNumber, decimalSpaces)\n : parseFloat(absoluteNumber.toFixed(1));\n\n if (formattedNum === 1000 && scale > 0 && scale < 4) {\n formattedNum = 1;\n scale++;\n }\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,IAAIC,YAAY,GACdD,KAAK,KAAK,CAAC,GACP/B,kBAAkB,CAAC4B,cAAc,EAAEJ,aAAa,CAAC,GACjDP,UAAU,CAACW,cAAc,CAACK,OAAO,CAAC,CAAC,CAAC,CAAC;EAE3C,IAAID,YAAY,KAAK,IAAI,IAAID,KAAK,GAAG,CAAC,IAAIA,KAAK,GAAG,CAAC,EAAE;IACnDC,YAAY,GAAG,CAAC;IAChBD,KAAK,EAAE;EACT;EAEA,MAAMf,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"}