linear-react-components-ui 2.0.0 → 2.0.1-beta.1

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.
@@ -2,7 +2,7 @@ import { jsx } from "react/jsx-runtime";
2
2
  import { useRef, useEffect } from "react";
3
3
  import _ from "../../_virtual/lodash.js";
4
4
  import { useIMask } from "react-imask";
5
- import { numberToEnUS, numberToPtBR } from "./format_number.js";
5
+ import { numberToPtBR } from "./format_number.js";
6
6
  import InputTextBase from "../base/InputTextBase.js";
7
7
  import { mergeRefs } from "../../form2/helpers.js";
8
8
  const CurrencyField = (props) => {
@@ -22,11 +22,12 @@ const CurrencyField = (props) => {
22
22
  displayCurrencySymbol = true
23
23
  } = props;
24
24
  const currencyNumberInputRef = useRef(null);
25
- const isResetting = useRef(false);
26
25
  const leftElements = displayCurrencySymbol ? /* @__PURE__ */ jsx("span", { className: "currency-symbol", children: currencySymbol }) : [];
27
26
  const {
27
+ maskRef: maskRef_0,
28
28
  value: maskedValue,
29
- setValue: setMaskedValue
29
+ setValue: setMaskedValue,
30
+ typedValue
30
31
  } = useIMask({
31
32
  mask: Number,
32
33
  unmask,
@@ -40,26 +41,22 @@ const CurrencyField = (props) => {
40
41
  thousandsSeparator: "."
41
42
  }, {
42
43
  ref: currencyNumberInputRef,
43
- onAccept: (__, options, event) => {
44
- if (isResetting.current) {
45
- isResetting.current = false;
46
- return;
47
- }
48
- const parsedValue = numberToEnUS(options.unmaskedValue);
44
+ onAccept: (__, maskRef, event) => {
45
+ if (!event) return;
49
46
  props?.onChange?.({
50
47
  ...event,
51
48
  target: {
52
49
  ...event?.target,
53
50
  name: props?.name,
54
- value: parsedValue
51
+ value: maskRef.typedValue
55
52
  }
56
53
  });
57
54
  }
58
55
  });
59
56
  const handleBlur = (event_0) => {
57
+ const currentValue = maskRef_0.current?.typedValue ?? typedValue;
60
58
  if (!_.isNil(min)) {
61
- const currentValue = numberToEnUS(maskedValue);
62
- if (_.isNaN(currentValue) || currentValue < min) {
59
+ if (_.isNil(currentValue) || _.isNaN(currentValue) || currentValue < min) {
63
60
  setMaskedValue(numberToPtBR(min) ?? _.toString(min));
64
61
  props?.onChange?.({
65
62
  ...event_0,
@@ -71,19 +68,24 @@ const CurrencyField = (props) => {
71
68
  });
72
69
  }
73
70
  }
74
- props?.onBlur?.(event_0);
71
+ props?.onBlur?.({
72
+ ...event_0,
73
+ target: {
74
+ ...event_0?.target,
75
+ value: currentValue
76
+ }
77
+ });
75
78
  };
76
79
  useEffect(() => {
77
80
  if (_.isNil(props?.value)) {
78
81
  if (maskedValue !== "") {
79
- isResetting.current = true;
80
82
  setMaskedValue("");
81
83
  }
82
84
  return;
83
85
  }
84
- const valueToPtBR = numberToPtBR(props?.value) ?? "";
85
- if (!_.isEqual(parseFloat(_.toString(props?.value)), numberToEnUS(maskedValue))) {
86
- setMaskedValue(valueToPtBR);
86
+ const numericValue = typeof props.value === "string" ? parseFloat(props.value) : props.value;
87
+ if (!_.isEqual(typedValue, numericValue)) {
88
+ setMaskedValue(numberToPtBR(props?.value) ?? "");
87
89
  }
88
90
  }, [props?.value]);
89
91
  return /* @__PURE__ */ jsx(InputTextBase, { ...props, inputRef: mergeRefs(currencyNumberInputRef, inputRef), type: "text", onChange: () => {
@@ -1 +1 @@
1
- {"version":3,"file":"Currency.js","sources":["../../../src/lib/inputs/number/Currency.tsx"],"sourcesContent":["import React, { useEffect, useRef } from 'react';\nimport _ from 'lodash';\nimport { useIMask } from 'react-imask';\nimport { ICurrencyProps } from './types';\nimport { numberToEnUS, numberToPtBR } from './format_number';\nimport InputTextBase from '../base/InputTextBase';\nimport { mergeRefs } from '../../form2/helpers';\nimport type { CustomInputEvent } from '../base/types';\n\nconst CurrencyField = (props: ICurrencyProps) => {\n const {\n inputRef = undefined, textAlign = 'left', themePopover = 'light', popoverAlign = 'left',\n min = undefined, max = undefined, allowNegative = false, scale = 2, normalizeZeros = true,\n padFractionalZeros = true, unmask = true, currencySymbol = 'R$', displayCurrencySymbol = true,\n } = props;\n const currencyNumberInputRef = useRef<HTMLInputElement | null>(null);\n const isResetting = useRef(false);\n const leftElements = displayCurrencySymbol ?\n <span className=\"currency-symbol\">{currencySymbol}</span>\n : [];\n\n const { value: maskedValue, setValue: setMaskedValue } = useIMask({\n mask: Number,\n unmask,\n scale,\n normalizeZeros,\n padFractionalZeros,\n max,\n min: !_.isNil(min) ? min : (allowNegative ? undefined : 0),\n radix: ',',\n mapToRadix: ['.'],\n thousandsSeparator: '.',\n }, {\n ref: currencyNumberInputRef,\n onAccept: (__, options, event) => {\n if (isResetting.current) {\n isResetting.current = false;\n return;\n }\n const parsedValue = numberToEnUS(options.unmaskedValue);\n props?.onChange?.({\n ...event,\n target: {\n ...event?.target,\n name: props?.name,\n value: parsedValue as any,\n },\n } as React.ChangeEvent<HTMLInputElement>);\n },\n });\n\n /**\n * Função sobrescrevendo o evento onBlur para tratar o valor mínimo ao sair do campo, \n * garantindo que o valor não seja menor que o mínimo definido.\n */\n const handleBlur = (event: CustomInputEvent) => {\n if (!_.isNil(min)) {\n const currentValue = numberToEnUS(maskedValue) as number;\n if (_.isNaN(currentValue) || currentValue < min) {\n setMaskedValue(numberToPtBR(min) ?? _.toString(min));\n props?.onChange?.({\n ...event,\n target: {\n ...event?.target,\n name: props?.name,\n value: min as any,\n },\n } as CustomInputEvent);\n }\n }\n props?.onBlur?.(event);\n };\n\n useEffect(() => {\n if (_.isNil(props?.value)) {\n if (maskedValue !== '') {\n isResetting.current = true;\n setMaskedValue('');\n }\n return;\n }\n const valueToPtBR = numberToPtBR(props?.value) ?? '';\n if (!_.isEqual(\n parseFloat(_.toString(props?.value)), numberToEnUS(maskedValue),\n )) {\n setMaskedValue(valueToPtBR);\n }\n }, [props?.value]);\n\n return (\n <InputTextBase\n {...props}\n inputRef={mergeRefs(currencyNumberInputRef, inputRef) as any}\n type=\"text\"\n onChange={() => { }}\n leftElements={leftElements}\n onBlur={handleBlur}\n value={maskedValue}\n textAlign={textAlign}\n themePopover={themePopover}\n popoverAlign={popoverAlign} />\n );\n};\n\nexport default CurrencyField;\n"],"names":["CurrencyField","props","inputRef","undefined","textAlign","themePopover","popoverAlign","min","max","allowNegative","scale","normalizeZeros","padFractionalZeros","unmask","currencySymbol","displayCurrencySymbol","currencyNumberInputRef","useRef","isResetting","leftElements","value","maskedValue","setValue","setMaskedValue","useIMask","mask","Number","_","isNil","radix","mapToRadix","thousandsSeparator","ref","onAccept","__","options","event","current","parsedValue","numberToEnUS","unmaskedValue","onChange","target","name","handleBlur","currentValue","isNaN","numberToPtBR","toString","onBlur","useEffect","valueToPtBR","isEqual","parseFloat","mergeRefs"],"mappings":";;;;;;;AASA,MAAMA,gBAAgBA,CAACC,UAA0B;AAC/C,QAAM;AAAA,IACJC,WAAWC;AAAAA,IAAWC,YAAY;AAAA,IAAQC,eAAe;AAAA,IAASC,eAAe;AAAA,IACjFC,MAAMJ;AAAAA,IAAWK,MAAML;AAAAA,IAAWM,gBAAgB;AAAA,IAAOC,QAAQ;AAAA,IAAGC,iBAAiB;AAAA,IACrFC,qBAAqB;AAAA,IAAMC,SAAS;AAAA,IAAMC,iBAAiB;AAAA,IAAMC,wBAAwB;AAAA,EAAA,IACvFd;AACJ,QAAMe,yBAAyBC,OAAgC,IAAI;AACnE,QAAMC,cAAcD,OAAO,KAAK;AAChC,QAAME,eAAeJ,wBACnB,oBAAC,QAAA,EAAK,WAAU,mBAAmBD,UAAAA,eAAAA,CAAe,IAChD,CAAA;AAEJ,QAAM;AAAA,IAAEM,OAAOC;AAAAA,IAAaC,UAAUC;AAAAA,EAAAA,IAAmBC,SAAS;AAAA,IAChEC,MAAMC;AAAAA,IACNb;AAAAA,IACAH;AAAAA,IACAC;AAAAA,IACAC;AAAAA,IACAJ;AAAAA,IACAD,KAAK,CAACoB,EAAEC,MAAMrB,GAAG,IAAIA,MAAOE,gBAAgBN,SAAY;AAAA,IACxD0B,OAAO;AAAA,IACPC,YAAY,CAAC,GAAG;AAAA,IAChBC,oBAAoB;AAAA,EAAA,GACnB;AAAA,IACDC,KAAKhB;AAAAA,IACLiB,UAAUA,CAACC,IAAIC,SAASC,UAAU;AAChC,UAAIlB,YAAYmB,SAAS;AACvBnB,oBAAYmB,UAAU;AACtB;AAAA,MACF;AACA,YAAMC,cAAcC,aAAaJ,QAAQK,aAAa;AACtDvC,aAAOwC,WAAW;AAAA,QAChB,GAAGL;AAAAA,QACHM,QAAQ;AAAA,UACN,GAAGN,OAAOM;AAAAA,UACVC,MAAM1C,OAAO0C;AAAAA,UACbvB,OAAOkB;AAAAA,QAAAA;AAAAA,MACT,CACsC;AAAA,IAC1C;AAAA,EAAA,CACD;AAMD,QAAMM,aAAaA,CAACR,YAA4B;AAC9C,QAAI,CAACT,EAAEC,MAAMrB,GAAG,GAAG;AACjB,YAAMsC,eAAeN,aAAalB,WAAW;AAC7C,UAAIM,EAAEmB,MAAMD,YAAY,KAAKA,eAAetC,KAAK;AAC/CgB,uBAAewB,aAAaxC,GAAG,KAAKoB,EAAEqB,SAASzC,GAAG,CAAC;AACnDN,eAAOwC,WAAW;AAAA,UAChB,GAAGL;AAAAA,UACHM,QAAQ;AAAA,YACN,GAAGN,SAAOM;AAAAA,YACVC,MAAM1C,OAAO0C;AAAAA,YACbvB,OAAOb;AAAAA,UAAAA;AAAAA,QACT,CACmB;AAAA,MACvB;AAAA,IACF;AACAN,WAAOgD,SAASb,OAAK;AAAA,EACvB;AAEAc,YAAU,MAAM;AACd,QAAIvB,EAAEC,MAAM3B,OAAOmB,KAAK,GAAG;AACzB,UAAIC,gBAAgB,IAAI;AACtBH,oBAAYmB,UAAU;AACtBd,uBAAe,EAAE;AAAA,MACnB;AACA;AAAA,IACF;AACA,UAAM4B,cAAcJ,aAAa9C,OAAOmB,KAAK,KAAK;AAClD,QAAI,CAACO,EAAEyB,QACLC,WAAW1B,EAAEqB,SAAS/C,OAAOmB,KAAK,CAAC,GAAGmB,aAAalB,WAAW,CAChE,GAAG;AACDE,qBAAe4B,WAAW;AAAA,IAC5B;AAAA,EACF,GAAG,CAAClD,OAAOmB,KAAK,CAAC;AAEjB,SACE,oBAAC,eAAA,EACC,GAAInB,OACJ,UAAUqD,UAAUtC,wBAAwBd,QAAQ,GACpD,MAAK,QACL,UAAU,MAAM;AAAA,EAAE,GAClB,cACA,QAAQ0C,YACR,OAAOvB,aACP,WACA,cACA,cAA2B;AAEjC;"}
1
+ {"version":3,"file":"Currency.js","sources":["../../../src/lib/inputs/number/Currency.tsx"],"sourcesContent":["import { useEffect, useRef } from 'react';\nimport _ from 'lodash';\nimport { useIMask } from 'react-imask';\nimport { ICurrencyProps } from './types';\nimport { numberToPtBR } from './format_number';\nimport InputTextBase from '../base/InputTextBase';\nimport { mergeRefs } from '../../form2/helpers';\nimport type { CustomInputEvent } from '../base/types';\n\nconst CurrencyField = (props: ICurrencyProps) => {\n const {\n inputRef = undefined, textAlign = 'left', themePopover = 'light', popoverAlign = 'left',\n min = undefined, max = undefined, allowNegative = false, scale = 2, normalizeZeros = true,\n padFractionalZeros = true, unmask = true, currencySymbol = 'R$', displayCurrencySymbol = true,\n } = props;\n const currencyNumberInputRef = useRef<HTMLInputElement | null>(null);\n const leftElements = displayCurrencySymbol ?\n <span className=\"currency-symbol\">{currencySymbol}</span>\n : [];\n\n const { maskRef, value: maskedValue, setValue: setMaskedValue, typedValue } = useIMask({\n mask: Number,\n unmask,\n scale,\n normalizeZeros,\n padFractionalZeros,\n max,\n min: !_.isNil(min) ? min : (allowNegative ? undefined : 0),\n radix: ',',\n mapToRadix: ['.'],\n thousandsSeparator: '.',\n }, {\n ref: currencyNumberInputRef,\n onAccept: (__, maskRef, event) => {\n if (!event) return;\n props?.onChange?.({\n ...event,\n target: {\n ...event?.target,\n name: props?.name,\n value: maskRef.typedValue as any,\n },\n } as CustomInputEvent);\n },\n });\n\n /**\n * Função sobrescrevendo o evento onBlur para tratar o valor mínimo ao sair do campo, \n * garantindo que o valor não seja menor que o mínimo definido.\n */\n const handleBlur = (event: CustomInputEvent) => {\n const currentValue = (maskRef.current?.typedValue ?? typedValue) as number;\n if (!_.isNil(min)) {\n if (_.isNil(currentValue) || _.isNaN(currentValue) || currentValue < min) {\n setMaskedValue(numberToPtBR(min) ?? _.toString(min));\n props?.onChange?.({\n ...event,\n target: {\n ...event?.target,\n name: props?.name,\n value: min as any,\n },\n } as CustomInputEvent);\n }\n }\n props?.onBlur?.({ \n ...event, \n target: { \n ...event?.target, \n value: currentValue as any, \n }, \n });\n };\n\n useEffect(() => {\n if (_.isNil(props?.value)) {\n if (maskedValue !== '') {\n setMaskedValue('');\n }\n return;\n }\n const numericValue = typeof props.value === 'string' ? parseFloat(props.value) : props.value;\n if (!_.isEqual(typedValue, numericValue)) {\n setMaskedValue(numberToPtBR(props?.value) ?? '');\n }\n }, [props?.value]);\n\n return (\n <InputTextBase\n {...props}\n inputRef={mergeRefs(currencyNumberInputRef, inputRef) as any}\n type=\"text\"\n onChange={() => { }}\n leftElements={leftElements}\n onBlur={handleBlur}\n value={maskedValue}\n textAlign={textAlign}\n themePopover={themePopover}\n popoverAlign={popoverAlign} />\n );\n};\n\nexport default CurrencyField;\n"],"names":["CurrencyField","props","inputRef","undefined","textAlign","themePopover","popoverAlign","min","max","allowNegative","scale","normalizeZeros","padFractionalZeros","unmask","currencySymbol","displayCurrencySymbol","currencyNumberInputRef","useRef","leftElements","maskRef","value","maskedValue","setValue","setMaskedValue","typedValue","useIMask","mask","Number","_","isNil","radix","mapToRadix","thousandsSeparator","ref","onAccept","__","event","onChange","target","name","handleBlur","currentValue","current","isNaN","numberToPtBR","toString","onBlur","useEffect","numericValue","parseFloat","isEqual","mergeRefs"],"mappings":"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"}
@@ -2,7 +2,7 @@ import { jsx } from "react/jsx-runtime";
2
2
  import _ from "../../_virtual/lodash.js";
3
3
  import { useRef, useEffect } from "react";
4
4
  import { useIMask } from "react-imask";
5
- import { numberToEnUS, numberToPtBR } from "./format_number.js";
5
+ import { numberToPtBR } from "./format_number.js";
6
6
  import InputTextBase from "../base/InputTextBase.js";
7
7
  import { mergeRefs } from "../../form2/helpers.js";
8
8
  const DecimalField = (props) => {
@@ -20,10 +20,11 @@ const DecimalField = (props) => {
20
20
  inputRef = void 0
21
21
  } = props;
22
22
  const decimalNumberInputRef = useRef(null);
23
- const isResetting = useRef(false);
24
23
  const {
24
+ maskRef: maskRef_0,
25
25
  value: maskedValue,
26
- setValue: setMaskedValue
26
+ setValue: setMaskedValue,
27
+ typedValue
27
28
  } = useIMask({
28
29
  mask: Number,
29
30
  unmask,
@@ -37,26 +38,22 @@ const DecimalField = (props) => {
37
38
  thousandsSeparator: "."
38
39
  }, {
39
40
  ref: decimalNumberInputRef,
40
- onAccept: (__, options, event) => {
41
- if (isResetting.current) {
42
- isResetting.current = false;
43
- return;
44
- }
45
- const parsedValue = numberToEnUS(options.unmaskedValue);
41
+ onAccept: (__, maskRef, event) => {
42
+ if (!event) return;
46
43
  props?.onChange?.({
47
44
  ...event,
48
45
  target: {
49
46
  ...event?.target,
50
47
  name: props?.name,
51
- value: parsedValue
48
+ value: maskRef.typedValue
52
49
  }
53
50
  });
54
51
  }
55
52
  });
56
53
  const handleBlur = (event_0) => {
54
+ const currentValue = maskRef_0.current?.typedValue ?? typedValue;
57
55
  if (!_.isNil(min)) {
58
- const currentValue = numberToEnUS(maskedValue);
59
- if (_.isNaN(currentValue) || currentValue < min) {
56
+ if (_.isNil(currentValue) || _.isNaN(currentValue) || currentValue < min) {
60
57
  setMaskedValue(numberToPtBR(min) ?? _.toString(min));
61
58
  props?.onChange?.({
62
59
  ...event_0,
@@ -68,19 +65,24 @@ const DecimalField = (props) => {
68
65
  });
69
66
  }
70
67
  }
71
- props?.onBlur?.(event_0);
68
+ props?.onBlur?.({
69
+ ...event_0,
70
+ target: {
71
+ ...event_0?.target,
72
+ value: currentValue
73
+ }
74
+ });
72
75
  };
73
76
  useEffect(() => {
74
77
  if (_.isNil(props?.value)) {
75
78
  if (maskedValue !== "") {
76
- isResetting.current = true;
77
79
  setMaskedValue("");
78
80
  }
79
81
  return;
80
82
  }
81
- const valueToPtBR = numberToPtBR(props?.value) ?? "";
82
- if (!_.isEqual(parseFloat(_.toString(props?.value)), numberToEnUS(maskedValue))) {
83
- setMaskedValue(valueToPtBR);
83
+ const numericValue = typeof props.value === "string" ? parseFloat(props.value) : props.value;
84
+ if (!_.isEqual(typedValue, numericValue)) {
85
+ setMaskedValue(numberToPtBR(props?.value) ?? "");
84
86
  }
85
87
  }, [props?.value]);
86
88
  return /* @__PURE__ */ jsx(InputTextBase, { ...props, inputRef: mergeRefs(decimalNumberInputRef, inputRef), type: "text", onChange: () => {
@@ -1 +1 @@
1
- {"version":3,"file":"Decimal.js","sources":["../../../src/lib/inputs/number/Decimal.tsx"],"sourcesContent":["import _ from 'lodash';\nimport React, { useEffect, useRef } from 'react';\nimport { useIMask } from 'react-imask';\nimport { IDecimalProps } from './types';\nimport { numberToEnUS, numberToPtBR } from './format_number';\nimport InputTextBase from '../base/InputTextBase';\nimport type { CustomInputEvent } from '../base/types';\nimport { mergeRefs } from '../../form2/helpers';\n\nconst DecimalField = (props: IDecimalProps) => {\n const {\n textAlign = 'left', themePopover = 'light', popoverAlign = 'left', min = undefined,\n max = undefined, allowNegative = false, scale = 2, normalizeZeros = true,\n padFractionalZeros = true, unmask = true, inputRef = undefined,\n } = props;\n const decimalNumberInputRef = useRef<HTMLInputElement | null>(null);\n const isResetting = useRef(false);\n\n const { value: maskedValue, setValue: setMaskedValue } = useIMask({\n mask: Number,\n unmask,\n scale,\n normalizeZeros,\n padFractionalZeros,\n max,\n min: !_.isNil(min) ? min : (allowNegative ? undefined : 0),\n radix: ',',\n mapToRadix: ['.'],\n thousandsSeparator: '.',\n }, {\n ref: decimalNumberInputRef,\n onAccept: (__, options, event) => {\n if (isResetting.current) {\n isResetting.current = false;\n return;\n }\n const parsedValue = numberToEnUS(options.unmaskedValue);\n props?.onChange?.({\n ...event,\n target: {\n ...event?.target,\n name: props?.name,\n value: parsedValue as any,\n },\n } as React.ChangeEvent<HTMLInputElement>);\n },\n });\n\n /**\n * Função sobrescrevendo o evento onBlur para tratar o valor mínimo ao sair do campo, \n * garantindo que o valor não seja menor que o mínimo definido.\n */\n const handleBlur = (event: CustomInputEvent) => {\n if (!_.isNil(min)) {\n const currentValue = numberToEnUS(maskedValue) as number;\n if (_.isNaN(currentValue) || currentValue < min) {\n setMaskedValue(numberToPtBR(min) ?? _.toString(min));\n props?.onChange?.({\n ...event,\n target: {\n ...event?.target,\n name: props?.name,\n value: min as any,\n },\n } as CustomInputEvent);\n }\n }\n props?.onBlur?.(event);\n };\n\n useEffect(() => {\n if (_.isNil(props?.value)) {\n if (maskedValue !== '') {\n isResetting.current = true;\n setMaskedValue('');\n }\n return;\n }\n const valueToPtBR = numberToPtBR(props?.value) ?? '';\n if (!_.isEqual(\n parseFloat(_.toString(props?.value)), numberToEnUS(maskedValue),\n )) {\n setMaskedValue(valueToPtBR);\n }\n }, [props?.value]);\n\n return (\n <InputTextBase\n {...props}\n inputRef={mergeRefs(decimalNumberInputRef, inputRef) as any}\n type=\"text\"\n onChange={() => { }}\n onBlur={handleBlur}\n value={maskedValue}\n textAlign={textAlign}\n themePopover={themePopover}\n popoverAlign={popoverAlign} />\n );\n};\n\nexport default DecimalField;\n"],"names":["DecimalField","props","textAlign","themePopover","popoverAlign","min","undefined","max","allowNegative","scale","normalizeZeros","padFractionalZeros","unmask","inputRef","decimalNumberInputRef","useRef","isResetting","value","maskedValue","setValue","setMaskedValue","useIMask","mask","Number","_","isNil","radix","mapToRadix","thousandsSeparator","ref","onAccept","__","options","event","current","parsedValue","numberToEnUS","unmaskedValue","onChange","target","name","handleBlur","currentValue","isNaN","numberToPtBR","toString","onBlur","useEffect","valueToPtBR","isEqual","parseFloat","mergeRefs"],"mappings":";;;;;;;AASA,MAAMA,eAAeA,CAACC,UAAyB;AAC7C,QAAM;AAAA,IACJC,YAAY;AAAA,IAAQC,eAAe;AAAA,IAASC,eAAe;AAAA,IAAQC,MAAMC;AAAAA,IACzEC,MAAMD;AAAAA,IAAWE,gBAAgB;AAAA,IAAOC,QAAQ;AAAA,IAAGC,iBAAiB;AAAA,IACpEC,qBAAqB;AAAA,IAAMC,SAAS;AAAA,IAAMC,WAAWP;AAAAA,EAAAA,IACnDL;AACJ,QAAMa,wBAAwBC,OAAgC,IAAI;AAClE,QAAMC,cAAcD,OAAO,KAAK;AAEhC,QAAM;AAAA,IAAEE,OAAOC;AAAAA,IAAaC,UAAUC;AAAAA,EAAAA,IAAmBC,SAAS;AAAA,IAChEC,MAAMC;AAAAA,IACNX;AAAAA,IACAH;AAAAA,IACAC;AAAAA,IACAC;AAAAA,IACAJ;AAAAA,IACAF,KAAK,CAACmB,EAAEC,MAAMpB,GAAG,IAAIA,MAAOG,gBAAgBF,SAAY;AAAA,IACxDoB,OAAO;AAAA,IACPC,YAAY,CAAC,GAAG;AAAA,IAChBC,oBAAoB;AAAA,EAAA,GACnB;AAAA,IACDC,KAAKf;AAAAA,IACLgB,UAAUA,CAACC,IAAIC,SAASC,UAAU;AAChC,UAAIjB,YAAYkB,SAAS;AACvBlB,oBAAYkB,UAAU;AACtB;AAAA,MACF;AACA,YAAMC,cAAcC,aAAaJ,QAAQK,aAAa;AACtDpC,aAAOqC,WAAW;AAAA,QAChB,GAAGL;AAAAA,QACHM,QAAQ;AAAA,UACN,GAAGN,OAAOM;AAAAA,UACVC,MAAMvC,OAAOuC;AAAAA,UACbvB,OAAOkB;AAAAA,QAAAA;AAAAA,MACT,CACsC;AAAA,IAC1C;AAAA,EAAA,CACD;AAMD,QAAMM,aAAaA,CAACR,YAA4B;AAC9C,QAAI,CAACT,EAAEC,MAAMpB,GAAG,GAAG;AACjB,YAAMqC,eAAeN,aAAalB,WAAW;AAC7C,UAAIM,EAAEmB,MAAMD,YAAY,KAAKA,eAAerC,KAAK;AAC/Ce,uBAAewB,aAAavC,GAAG,KAAKmB,EAAEqB,SAASxC,GAAG,CAAC;AACnDJ,eAAOqC,WAAW;AAAA,UAChB,GAAGL;AAAAA,UACHM,QAAQ;AAAA,YACN,GAAGN,SAAOM;AAAAA,YACVC,MAAMvC,OAAOuC;AAAAA,YACbvB,OAAOZ;AAAAA,UAAAA;AAAAA,QACT,CACmB;AAAA,MACvB;AAAA,IACF;AACAJ,WAAO6C,SAASb,OAAK;AAAA,EACvB;AAEAc,YAAU,MAAM;AACd,QAAIvB,EAAEC,MAAMxB,OAAOgB,KAAK,GAAG;AACzB,UAAIC,gBAAgB,IAAI;AACtBF,oBAAYkB,UAAU;AACtBd,uBAAe,EAAE;AAAA,MACnB;AACA;AAAA,IACF;AACA,UAAM4B,cAAcJ,aAAa3C,OAAOgB,KAAK,KAAK;AAClD,QAAI,CAACO,EAAEyB,QACLC,WAAW1B,EAAEqB,SAAS5C,OAAOgB,KAAK,CAAC,GAAGmB,aAAalB,WAAW,CAChE,GAAG;AACDE,qBAAe4B,WAAW;AAAA,IAC5B;AAAA,EACF,GAAG,CAAC/C,OAAOgB,KAAK,CAAC;AAEjB,SACE,oBAAC,eAAA,EACC,GAAIhB,OACJ,UAAUkD,UAAUrC,uBAAuBD,QAAQ,GACnD,MAAK,QACL,UAAU,MAAM;AAAA,EAAE,GAClB,QAAQ4B,YACR,OAAOvB,aACP,WACA,cACA,cAA2B;AAEjC;"}
1
+ {"version":3,"file":"Decimal.js","sources":["../../../src/lib/inputs/number/Decimal.tsx"],"sourcesContent":["import _ from 'lodash';\nimport { useEffect, useRef } from 'react';\nimport { useIMask } from 'react-imask';\nimport { IDecimalProps } from './types';\nimport { numberToPtBR } from './format_number';\nimport InputTextBase from '../base/InputTextBase';\nimport type { CustomInputEvent } from '../base/types';\nimport { mergeRefs } from '../../form2/helpers';\n\nconst DecimalField = (props: IDecimalProps) => {\n const {\n textAlign = 'left', themePopover = 'light', popoverAlign = 'left', min = undefined,\n max = undefined, allowNegative = false, scale = 2, normalizeZeros = true,\n padFractionalZeros = true, unmask = true, inputRef = undefined,\n } = props;\n const decimalNumberInputRef = useRef<HTMLInputElement | null>(null);\n\n const { maskRef, value: maskedValue, setValue: setMaskedValue, typedValue } = useIMask({\n mask: Number,\n unmask,\n scale,\n normalizeZeros,\n padFractionalZeros,\n max,\n min: !_.isNil(min) ? min : (allowNegative ? undefined : 0),\n radix: ',',\n mapToRadix: ['.'],\n thousandsSeparator: '.',\n }, {\n ref: decimalNumberInputRef,\n onAccept: (__, maskRef, event) => {\n if (!event) return;\n props?.onChange?.({\n ...event,\n target: {\n ...event?.target,\n name: props?.name,\n value: maskRef.typedValue as any,\n },\n } as CustomInputEvent);\n },\n });\n\n /**\n * Função sobrescrevendo o evento onBlur para tratar o valor mínimo ao sair do campo, \n * garantindo que o valor não seja menor que o mínimo definido.\n */\n const handleBlur = (event: CustomInputEvent) => {\n const currentValue = (maskRef.current?.typedValue ?? typedValue) as number;\n if (!_.isNil(min)) {\n if (_.isNil(currentValue) || _.isNaN(currentValue) || currentValue < min) {\n setMaskedValue(numberToPtBR(min) ?? _.toString(min));\n props?.onChange?.({\n ...event,\n target: {\n ...event?.target,\n name: props?.name,\n value: min as any,\n },\n } as CustomInputEvent);\n }\n }\n props?.onBlur?.({ \n ...event, \n target: { \n ...event?.target, \n value: currentValue as any, \n }, \n });\n };\n\n useEffect(() => {\n if (_.isNil(props?.value)) {\n if (maskedValue !== '') {\n setMaskedValue('');\n }\n return;\n }\n const numericValue = typeof props.value === 'string' ? parseFloat(props.value) : props.value;\n if (!_.isEqual(typedValue, numericValue)) {\n setMaskedValue(numberToPtBR(props?.value) ?? '');\n }\n }, [props?.value]);\n\n return (\n <InputTextBase\n {...props}\n inputRef={mergeRefs(decimalNumberInputRef, inputRef) as any}\n type=\"text\"\n onChange={() => { }}\n onBlur={handleBlur}\n value={maskedValue}\n textAlign={textAlign}\n themePopover={themePopover}\n popoverAlign={popoverAlign} />\n );\n};\n\nexport default DecimalField;\n"],"names":["DecimalField","props","textAlign","themePopover","popoverAlign","min","undefined","max","allowNegative","scale","normalizeZeros","padFractionalZeros","unmask","inputRef","decimalNumberInputRef","useRef","maskRef","value","maskedValue","setValue","setMaskedValue","typedValue","useIMask","mask","Number","_","isNil","radix","mapToRadix","thousandsSeparator","ref","onAccept","__","event","onChange","target","name","handleBlur","currentValue","current","isNaN","numberToPtBR","toString","onBlur","useEffect","numericValue","parseFloat","isEqual","mergeRefs"],"mappings":";;;;;;;AASA,MAAMA,eAAeA,CAACC,UAAyB;AAC7C,QAAM;AAAA,IACJC,YAAY;AAAA,IAAQC,eAAe;AAAA,IAASC,eAAe;AAAA,IAAQC,MAAMC;AAAAA,IACzEC,MAAMD;AAAAA,IAAWE,gBAAgB;AAAA,IAAOC,QAAQ;AAAA,IAAGC,iBAAiB;AAAA,IACpEC,qBAAqB;AAAA,IAAMC,SAAS;AAAA,IAAMC,WAAWP;AAAAA,EAAAA,IACnDL;AACJ,QAAMa,wBAAwBC,OAAgC,IAAI;AAElE,QAAM;AAAA,IAAEC,SAAAA;AAAAA,IAASC,OAAOC;AAAAA,IAAaC,UAAUC;AAAAA,IAAgBC;AAAAA,EAAAA,IAAeC,SAAS;AAAA,IACrFC,MAAMC;AAAAA,IACNZ;AAAAA,IACAH;AAAAA,IACAC;AAAAA,IACAC;AAAAA,IACAJ;AAAAA,IACAF,KAAK,CAACoB,EAAEC,MAAMrB,GAAG,IAAIA,MAAOG,gBAAgBF,SAAY;AAAA,IACxDqB,OAAO;AAAA,IACPC,YAAY,CAAC,GAAG;AAAA,IAChBC,oBAAoB;AAAA,EAAA,GACnB;AAAA,IACDC,KAAKhB;AAAAA,IACLiB,UAAUA,CAACC,IAAIhB,SAASiB,UAAU;AAChC,UAAI,CAACA,MAAO;AACZhC,aAAOiC,WAAW;AAAA,QAChB,GAAGD;AAAAA,QACHE,QAAQ;AAAA,UACN,GAAGF,OAAOE;AAAAA,UACVC,MAAMnC,OAAOmC;AAAAA,UACbnB,OAAOD,QAAQK;AAAAA,QAAAA;AAAAA,MACjB,CACmB;AAAA,IACvB;AAAA,EAAA,CACD;AAMD,QAAMgB,aAAaA,CAACJ,YAA4B;AAC9C,UAAMK,eAAgBtB,UAAQuB,SAASlB,cAAcA;AACrD,QAAI,CAACI,EAAEC,MAAMrB,GAAG,GAAG;AACjB,UAAIoB,EAAEC,MAAMY,YAAY,KAAKb,EAAEe,MAAMF,YAAY,KAAKA,eAAejC,KAAK;AACxEe,uBAAeqB,aAAapC,GAAG,KAAKoB,EAAEiB,SAASrC,GAAG,CAAC;AACnDJ,eAAOiC,WAAW;AAAA,UAChB,GAAGD;AAAAA,UACHE,QAAQ;AAAA,YACN,GAAGF,SAAOE;AAAAA,YACVC,MAAMnC,OAAOmC;AAAAA,YACbnB,OAAOZ;AAAAA,UAAAA;AAAAA,QACT,CACmB;AAAA,MACvB;AAAA,IACF;AACAJ,WAAO0C,SAAS;AAAA,MACd,GAAGV;AAAAA,MACHE,QAAQ;AAAA,QACN,GAAGF,SAAOE;AAAAA,QACVlB,OAAOqB;AAAAA,MAAAA;AAAAA,IACT,CACD;AAAA,EACH;AAEAM,YAAU,MAAM;AACd,QAAInB,EAAEC,MAAMzB,OAAOgB,KAAK,GAAG;AACzB,UAAIC,gBAAgB,IAAI;AACtBE,uBAAe,EAAE;AAAA,MACnB;AACA;AAAA,IACF;AACA,UAAMyB,eAAe,OAAO5C,MAAMgB,UAAU,WAAW6B,WAAW7C,MAAMgB,KAAK,IAAIhB,MAAMgB;AACvF,QAAI,CAACQ,EAAEsB,QAAQ1B,YAAYwB,YAAY,GAAG;AACxCzB,qBAAeqB,aAAaxC,OAAOgB,KAAK,KAAK,EAAE;AAAA,IACjD;AAAA,EACF,GAAG,CAAChB,OAAOgB,KAAK,CAAC;AAEjB,SACE,oBAAC,eAAA,EACC,GAAIhB,OACJ,UAAU+C,UAAUlC,uBAAuBD,QAAQ,GACnD,MAAK,QACL,UAAU,MAAM;AAAA,EAAE,GAClB,QAAQwB,YACR,OAAOnB,aACP,WACA,cACA,cAA2B;AAEjC;"}
@@ -0,0 +1,13 @@
1
+ import { INumberFieldProps } from '../types';
2
+ /**
3
+ * NumberFieldBeta - Versao alternativa do NumberField que utiliza a API imperativa
4
+ * do IMask diretamente, sem o hook useIMask do react-imask.
5
+ *
6
+ * Vantagens:
7
+ * - Controle total do ciclo de vida da mascara
8
+ * - onChange/onBlur disparam SOMENTE por interacao do usuario
9
+ * - Sem disparos espurios na inicializacao ou sincronizacao programatica
10
+ * - Sem problemas de closure stale (leitura direta do maskRef)
11
+ */
12
+ declare const NumberFieldBeta: (props: INumberFieldProps) => import("react/jsx-runtime").JSX.Element;
13
+ export default NumberFieldBeta;
@@ -17,10 +17,11 @@ const NumberField = (props) => {
17
17
  inputRef = void 0
18
18
  } = props;
19
19
  const numberInputRef = useRef(null);
20
- const isResetting = useRef(false);
21
20
  const {
21
+ maskRef: maskRef_0,
22
22
  value: maskedValue,
23
- setValue: setMaskedValue
23
+ setValue: setMaskedValue,
24
+ typedValue
24
25
  } = useIMask({
25
26
  mask: Number,
26
27
  max,
@@ -33,26 +34,22 @@ const NumberField = (props) => {
33
34
  padFractionalZeros: false
34
35
  }, {
35
36
  ref: numberInputRef,
36
- onAccept: (value, __, event) => {
37
- if (isResetting.current) {
38
- isResetting.current = false;
39
- return;
40
- }
41
- const parsedValue = parseInt(value, 10);
37
+ onAccept: (__, maskRef, event) => {
38
+ if (!event) return;
42
39
  props?.onChange?.({
43
40
  ...event,
44
41
  target: {
45
42
  ...event?.target,
46
43
  name: props?.name,
47
- value: parsedValue
44
+ value: maskRef.typedValue
48
45
  }
49
46
  });
50
47
  }
51
48
  });
52
49
  const handleBlur = (event_0) => {
50
+ const currentValue = maskRef_0.current?.typedValue ?? typedValue;
53
51
  if (!_.isNil(min)) {
54
- const currentValue = parseInt(maskedValue, 10);
55
- if (_.isNaN(currentValue) || currentValue < min) {
52
+ if (_.isNil(currentValue) || _.isNaN(currentValue) || currentValue < min) {
56
53
  setMaskedValue(_.toString(min));
57
54
  props?.onChange?.({
58
55
  ...event_0,
@@ -64,18 +61,23 @@ const NumberField = (props) => {
64
61
  });
65
62
  }
66
63
  }
67
- props?.onBlur?.(event_0);
64
+ props?.onBlur?.({
65
+ ...event_0,
66
+ target: {
67
+ ...event_0?.target,
68
+ value: currentValue
69
+ }
70
+ });
68
71
  };
69
72
  useEffect(() => {
70
73
  if (_.isNil(props?.value)) {
71
74
  if (maskedValue !== "") {
72
- isResetting.current = true;
73
75
  setMaskedValue("");
74
76
  }
75
77
  return;
76
78
  }
77
- const floatMaskedValue = Number(maskedValue || "0");
78
- if (!_.isEqual(props?.value, floatMaskedValue) || _.isEqual(props?.value, 0)) {
79
+ const numericValue = typeof props.value === "string" ? Number(props.value) : props.value;
80
+ if (!_.isEqual(typedValue, numericValue)) {
79
81
  setMaskedValue(_.toString(props?.value));
80
82
  }
81
83
  }, [props?.value]);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../../src/lib/inputs/number/index.tsx"],"sourcesContent":["import '../../assets/styles/numbers.scss';\n\nimport React, { useEffect, useRef } from 'react';\nimport _ from 'lodash';\nimport { useIMask } from 'react-imask';\nimport DecimalField from './Decimal';\nimport CurrencyField from './Currency';\nimport { INumberFieldProps } from './types';\nimport InputTextBase from '../base/InputTextBase';\nimport { CustomInputEvent } from '../base/types';\nimport { mergeRefs } from '../../form2/helpers';\n\nconst NumberField = (props: INumberFieldProps) => {\n const {\n textAlign = 'left', themePopover = 'light', popoverAlign = 'left', min = undefined, \n max = undefined, inputRef = undefined,\n } = props;\n const numberInputRef = useRef<HTMLInputElement | null>(null);\n const isResetting = useRef(false);\n\n const { value: maskedValue, setValue: setMaskedValue } = useIMask({\n mask: Number,\n max,\n min,\n scale: 0,\n enum: undefined,\n to: undefined,\n from: undefined,\n normalizeZeros: true,\n padFractionalZeros: false,\n }, {\n ref: numberInputRef,\n onAccept: (value, __, event) => {\n if (isResetting.current) {\n isResetting.current = false;\n return;\n }\n const parsedValue = parseInt(value, 10);\n props?.onChange?.({\n ...event,\n target: {\n ...event?.target,\n name: props?.name,\n value: parsedValue as any,\n },\n } as CustomInputEvent);\n },\n });\n\n /**\n * Função sobrescrevendo o evento onBlur para tratar o valor mínimo ao sair do campo, \n * garantindo que o valor não seja menor que o mínimo definido.\n */\n const handleBlur = (event: CustomInputEvent) => {\n if (!_.isNil(min)) {\n const currentValue = parseInt(maskedValue, 10) as number;\n if (_.isNaN(currentValue) || currentValue < min) {\n setMaskedValue(_.toString(min));\n props?.onChange?.({\n ...event,\n target: {\n ...event?.target,\n name: props?.name,\n value: min as any,\n },\n } as CustomInputEvent);\n }\n }\n props?.onBlur?.(event);\n };\n\n useEffect(() => {\n if (_.isNil(props?.value)) {\n if (maskedValue !== '') {\n isResetting.current = true;\n setMaskedValue('');\n }\n return;\n }\n const floatMaskedValue = Number(maskedValue || '0');\n if (!_.isEqual(props?.value, floatMaskedValue) || _.isEqual(props?.value, 0)) {\n setMaskedValue(_.toString(props?.value));\n }\n }, [props?.value]);\n\n return (\n <InputTextBase\n {...props}\n inputRef={mergeRefs(numberInputRef, inputRef) as any}\n type=\"number\"\n onChange={() => {}}\n onBlur={handleBlur}\n value={maskedValue}\n textAlign={textAlign}\n themePopover={themePopover}\n popoverAlign={popoverAlign} />\n );\n};\n\nexport default NumberField;\nexport {\n CurrencyField,\n DecimalField,\n};\n"],"names":["NumberField","props","textAlign","themePopover","popoverAlign","min","undefined","max","inputRef","numberInputRef","useRef","isResetting","value","maskedValue","setValue","setMaskedValue","useIMask","mask","Number","scale","enum","to","from","normalizeZeros","padFractionalZeros","ref","onAccept","__","event","current","parsedValue","parseInt","onChange","target","name","handleBlur","_","isNil","currentValue","isNaN","toString","onBlur","useEffect","floatMaskedValue","isEqual","mergeRefs"],"mappings":";;;;;;;;;AAYA,MAAMA,cAAcA,CAACC,UAA6B;AAChD,QAAM;AAAA,IACJC,YAAY;AAAA,IAAQC,eAAe;AAAA,IAASC,eAAe;AAAA,IAAQC,MAAMC;AAAAA,IACzEC,MAAMD;AAAAA,IAAWE,WAAWF;AAAAA,EAAAA,IAC1BL;AACJ,QAAMQ,iBAAiBC,OAAgC,IAAI;AAC3D,QAAMC,cAAcD,OAAO,KAAK;AAEhC,QAAM;AAAA,IAAEE,OAAOC;AAAAA,IAAaC,UAAUC;AAAAA,EAAAA,IAAmBC,SAAS;AAAA,IAChEC,MAAMC;AAAAA,IACNX;AAAAA,IACAF;AAAAA,IACAc,OAAO;AAAA,IACPC,MAAMd;AAAAA,IACNe,IAAIf;AAAAA,IACJgB,MAAMhB;AAAAA,IACNiB,gBAAgB;AAAA,IAChBC,oBAAoB;AAAA,EAAA,GACnB;AAAA,IACDC,KAAKhB;AAAAA,IACLiB,UAAUA,CAACd,OAAOe,IAAIC,UAAU;AAC9B,UAAIjB,YAAYkB,SAAS;AACvBlB,oBAAYkB,UAAU;AACtB;AAAA,MACF;AACA,YAAMC,cAAcC,SAASnB,OAAO,EAAE;AACtCX,aAAO+B,WAAW;AAAA,QAChB,GAAGJ;AAAAA,QACHK,QAAQ;AAAA,UACN,GAAGL,OAAOK;AAAAA,UACVC,MAAMjC,OAAOiC;AAAAA,UACbtB,OAAOkB;AAAAA,QAAAA;AAAAA,MACT,CACmB;AAAA,IACvB;AAAA,EAAA,CACD;AAMD,QAAMK,aAAaA,CAACP,YAA4B;AAC9C,QAAI,CAACQ,EAAEC,MAAMhC,GAAG,GAAG;AACjB,YAAMiC,eAAeP,SAASlB,aAAa,EAAE;AAC7C,UAAIuB,EAAEG,MAAMD,YAAY,KAAKA,eAAejC,KAAK;AAC/CU,uBAAeqB,EAAEI,SAASnC,GAAG,CAAC;AAC9BJ,eAAO+B,WAAW;AAAA,UAChB,GAAGJ;AAAAA,UACHK,QAAQ;AAAA,YACN,GAAGL,SAAOK;AAAAA,YACVC,MAAMjC,OAAOiC;AAAAA,YACbtB,OAAOP;AAAAA,UAAAA;AAAAA,QACT,CACmB;AAAA,MACvB;AAAA,IACF;AACAJ,WAAOwC,SAASb,OAAK;AAAA,EACvB;AAEAc,YAAU,MAAM;AACd,QAAIN,EAAEC,MAAMpC,OAAOW,KAAK,GAAG;AACzB,UAAIC,gBAAgB,IAAI;AACtBF,oBAAYkB,UAAU;AACtBd,uBAAe,EAAE;AAAA,MACnB;AACA;AAAA,IACF;AACA,UAAM4B,mBAAmBzB,OAAOL,eAAe,GAAG;AAClD,QAAI,CAACuB,EAAEQ,QAAQ3C,OAAOW,OAAO+B,gBAAgB,KAAKP,EAAEQ,QAAQ3C,OAAOW,OAAO,CAAC,GAAG;AAC5EG,qBAAeqB,EAAEI,SAASvC,OAAOW,KAAK,CAAC;AAAA,IACzC;AAAA,EACF,GAAG,CAACX,OAAOW,KAAK,CAAC;AAEjB,SACE,oBAAC,eAAA,EACC,GAAIX,OACJ,UAAU4C,UAAUpC,gBAAgBD,QAAQ,GAC5C,MAAK,UACL,UAAU,MAAM;AAAA,EAAC,GACjB,QAAQ2B,YACR,OAAOtB,aACP,WACA,cACA,cAA2B;AAEjC;"}
1
+ {"version":3,"file":"index.js","sources":["../../../src/lib/inputs/number/index.tsx"],"sourcesContent":["import '../../assets/styles/numbers.scss';\n\nimport { useEffect, useRef } from 'react';\nimport _ from 'lodash';\nimport { useIMask } from 'react-imask';\nimport DecimalField from './Decimal';\nimport CurrencyField from './Currency';\nimport { INumberFieldProps } from './types';\nimport InputTextBase from '../base/InputTextBase';\nimport { CustomInputEvent } from '../base/types';\nimport { mergeRefs } from '../../form2/helpers';\n\nconst NumberField = (props: INumberFieldProps) => {\n const {\n textAlign = 'left', themePopover = 'light', popoverAlign = 'left', min = undefined, \n max = undefined, inputRef = undefined,\n } = props;\n const numberInputRef = useRef<HTMLInputElement | null>(null);\n\n const { maskRef, value: maskedValue, setValue: setMaskedValue, typedValue } = useIMask({\n mask: Number,\n max,\n min,\n scale: 0,\n enum: undefined,\n to: undefined,\n from: undefined,\n normalizeZeros: true,\n padFractionalZeros: false,\n }, {\n ref: numberInputRef,\n onAccept: (__, maskRef, event) => {\n if (!event) return;\n props?.onChange?.({\n ...event,\n target: {\n ...event?.target,\n name: props?.name,\n value: maskRef.typedValue as any,\n },\n } as CustomInputEvent);\n },\n });\n\n /**\n * Função sobrescrevendo o evento onBlur para tratar o valor mínimo ao sair do campo, \n * garantindo que o valor não seja menor que o mínimo definido.\n */\n const handleBlur = (event: CustomInputEvent) => {\n const currentValue = (maskRef.current?.typedValue ?? typedValue) as number;\n if (!_.isNil(min)) {\n if (_.isNil(currentValue) || _.isNaN(currentValue) || currentValue < min) {\n setMaskedValue(_.toString(min));\n props?.onChange?.({\n ...event,\n target: {\n ...event?.target,\n name: props?.name,\n value: min as any,\n },\n } as CustomInputEvent);\n }\n }\n props?.onBlur?.({ \n ...event, \n target: { \n ...event?.target, \n value: currentValue as any, \n }, \n });\n };\n\n useEffect(() => {\n if (_.isNil(props?.value)) {\n if (maskedValue !== '') {\n setMaskedValue('');\n }\n return;\n }\n const numericValue = typeof props.value === 'string' ? Number(props.value) : props.value;\n if (!_.isEqual(typedValue, numericValue)) {\n setMaskedValue(_.toString(props?.value));\n }\n }, [props?.value]);\n\n return (\n <InputTextBase\n {...props}\n inputRef={mergeRefs(numberInputRef, inputRef) as any}\n type=\"number\"\n onChange={() => {}}\n onBlur={handleBlur}\n value={maskedValue}\n textAlign={textAlign}\n themePopover={themePopover}\n popoverAlign={popoverAlign} />\n );\n};\n\nexport default NumberField;\nexport {\n CurrencyField,\n DecimalField,\n};\n"],"names":["NumberField","props","textAlign","themePopover","popoverAlign","min","undefined","max","inputRef","numberInputRef","useRef","maskRef","value","maskedValue","setValue","setMaskedValue","typedValue","useIMask","mask","Number","scale","enum","to","from","normalizeZeros","padFractionalZeros","ref","onAccept","__","event","onChange","target","name","handleBlur","currentValue","current","_","isNil","isNaN","toString","onBlur","useEffect","numericValue","isEqual","mergeRefs"],"mappings":";;;;;;;;;AAYA,MAAMA,cAAcA,CAACC,UAA6B;AAChD,QAAM;AAAA,IACJC,YAAY;AAAA,IAAQC,eAAe;AAAA,IAASC,eAAe;AAAA,IAAQC,MAAMC;AAAAA,IACzEC,MAAMD;AAAAA,IAAWE,WAAWF;AAAAA,EAAAA,IAC1BL;AACJ,QAAMQ,iBAAiBC,OAAgC,IAAI;AAE3D,QAAM;AAAA,IAAEC,SAAAA;AAAAA,IAASC,OAAOC;AAAAA,IAAaC,UAAUC;AAAAA,IAAgBC;AAAAA,EAAAA,IAAeC,SAAS;AAAA,IACrFC,MAAMC;AAAAA,IACNZ;AAAAA,IACAF;AAAAA,IACAe,OAAO;AAAA,IACPC,MAAMf;AAAAA,IACNgB,IAAIhB;AAAAA,IACJiB,MAAMjB;AAAAA,IACNkB,gBAAgB;AAAA,IAChBC,oBAAoB;AAAA,EAAA,GACnB;AAAA,IACDC,KAAKjB;AAAAA,IACLkB,UAAUA,CAACC,IAAIjB,SAASkB,UAAU;AAChC,UAAI,CAACA,MAAO;AACZ5B,aAAO6B,WAAW;AAAA,QAChB,GAAGD;AAAAA,QACHE,QAAQ;AAAA,UACN,GAAGF,OAAOE;AAAAA,UACVC,MAAM/B,OAAO+B;AAAAA,UACbpB,OAAOD,QAAQK;AAAAA,QAAAA;AAAAA,MACjB,CACmB;AAAA,IACvB;AAAA,EAAA,CACD;AAMD,QAAMiB,aAAaA,CAACJ,YAA4B;AAC9C,UAAMK,eAAgBvB,UAAQwB,SAASnB,cAAcA;AACrD,QAAI,CAACoB,EAAEC,MAAMhC,GAAG,GAAG;AACjB,UAAI+B,EAAEC,MAAMH,YAAY,KAAKE,EAAEE,MAAMJ,YAAY,KAAKA,eAAe7B,KAAK;AACxEU,uBAAeqB,EAAEG,SAASlC,GAAG,CAAC;AAC9BJ,eAAO6B,WAAW;AAAA,UAChB,GAAGD;AAAAA,UACHE,QAAQ;AAAA,YACN,GAAGF,SAAOE;AAAAA,YACVC,MAAM/B,OAAO+B;AAAAA,YACbpB,OAAOP;AAAAA,UAAAA;AAAAA,QACT,CACmB;AAAA,MACvB;AAAA,IACF;AACAJ,WAAOuC,SAAS;AAAA,MACd,GAAGX;AAAAA,MACHE,QAAQ;AAAA,QACN,GAAGF,SAAOE;AAAAA,QACVnB,OAAOsB;AAAAA,MAAAA;AAAAA,IACT,CACD;AAAA,EACH;AAEAO,YAAU,MAAM;AACd,QAAIL,EAAEC,MAAMpC,OAAOW,KAAK,GAAG;AACzB,UAAIC,gBAAgB,IAAI;AACtBE,uBAAe,EAAE;AAAA,MACnB;AACA;AAAA,IACF;AACA,UAAM2B,eAAe,OAAOzC,MAAMW,UAAU,WAAWO,OAAOlB,MAAMW,KAAK,IAAIX,MAAMW;AACnF,QAAI,CAACwB,EAAEO,QAAQ3B,YAAY0B,YAAY,GAAG;AACxC3B,qBAAeqB,EAAEG,SAAStC,OAAOW,KAAK,CAAC;AAAA,IACzC;AAAA,EACF,GAAG,CAACX,OAAOW,KAAK,CAAC;AAEjB,SACE,oBAAC,eAAA,EACC,GAAIX,OACJ,UAAU2C,UAAUnC,gBAAgBD,QAAQ,GAC5C,MAAK,UACL,UAAU,MAAM;AAAA,EAAC,GACjB,QAAQyB,YACR,OAAOpB,aACP,WACA,cACA,cAA2B;AAEjC;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "linear-react-components-ui",
3
- "version": "2.0.0",
3
+ "version": "2.0.1-beta.1",
4
4
  "description": "Linear Sistemas ReactJs Components",
5
5
  "type": "module",
6
6
  "main": "./lib/index.js",