@ttoss/forms 0.19.0 → 0.21.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -42,9 +42,12 @@ __export(src_exports, {
42
42
  Form: () => Form,
43
43
  FormField: () => FormField,
44
44
  FormFieldCheckbox: () => FormFieldCheckbox,
45
+ FormFieldCreditCardNumber: () => FormFieldCreditCardNumber,
46
+ FormFieldCurrencyInput: () => FormFieldCurrencyInput,
45
47
  FormFieldInput: () => FormFieldInput,
46
48
  FormFieldNumericFormat: () => FormFieldNumericFormat,
47
49
  FormFieldPassword: () => FormFieldPassword,
50
+ FormFieldPatternFormat: () => FormFieldPatternFormat,
48
51
  FormFieldRadio: () => FormFieldRadio,
49
52
  FormFieldSelect: () => FormFieldSelect,
50
53
  FormFieldTextarea: () => FormFieldTextarea,
@@ -178,9 +181,12 @@ var FormField = ({
178
181
  id: idProp,
179
182
  name,
180
183
  defaultValue,
184
+ disabled,
185
+ tooltip,
186
+ onTooltipClick,
181
187
  sx,
182
- render,
183
- ...formFieldProps
188
+ css,
189
+ render
184
190
  }) => {
185
191
  const controllerReturn = (0, import_react_hook_form3.useController)({
186
192
  name,
@@ -191,10 +197,10 @@ var FormField = ({
191
197
  return React2.Children.map(render(controllerReturn), child => {
192
198
  return /* @__PURE__ */(0, import_jsx_runtime3.jsxs)(import_jsx_runtime3.Fragment, {
193
199
  children: [label && /* @__PURE__ */(0, import_jsx_runtime3.jsx)(import_ui3.Label, {
194
- "aria-disabled": formFieldProps.disabled,
200
+ "aria-disabled": disabled,
195
201
  htmlFor: id,
196
- tooltip: formFieldProps.tooltip,
197
- onTooltipClick: formFieldProps.onTooltipClick,
202
+ tooltip,
203
+ onTooltipClick,
198
204
  children: label
199
205
  }), React2.createElement(child.type, {
200
206
  id,
@@ -202,7 +208,7 @@ var FormField = ({
202
208
  })]
203
209
  });
204
210
  });
205
- }, [controllerReturn, formFieldProps.disabled, formFieldProps.onTooltipClick, formFieldProps.tooltip, id, label, render]);
211
+ }, [controllerReturn, disabled, onTooltipClick, tooltip, id, label, render]);
206
212
  return /* @__PURE__ */(0, import_jsx_runtime3.jsxs)(import_ui3.Flex, {
207
213
  sx: {
208
214
  flexDirection: "column",
@@ -210,6 +216,7 @@ var FormField = ({
210
216
  gap: "md",
211
217
  ...sx
212
218
  },
219
+ css,
213
220
  children: [memoizedRender, /* @__PURE__ */(0, import_jsx_runtime3.jsx)(ErrorMessage, {
214
221
  name
215
222
  })]
@@ -272,38 +279,109 @@ var FormFieldCheckbox = ({
272
279
  });
273
280
  };
274
281
 
275
- // src/FormFieldNumericFormat.tsx
282
+ // src/FormFieldPatternFormat.tsx
276
283
  var import_ui5 = require("@ttoss/ui");
277
284
  var import_react_number_format = require("react-number-format");
278
285
  var import_jsx_runtime5 = require("react/jsx-runtime");
286
+ var FormFieldPatternFormat = ({
287
+ label,
288
+ name,
289
+ ...patternFormatProps
290
+ }) => {
291
+ return /* @__PURE__ */(0, import_jsx_runtime5.jsx)(FormField, {
292
+ name,
293
+ label,
294
+ render: ({
295
+ field,
296
+ fieldState
297
+ }) => {
298
+ return /* @__PURE__ */(0, import_jsx_runtime5.jsx)(import_react_number_format.PatternFormat, {
299
+ name: field.name,
300
+ value: field.value,
301
+ onBlur: field.onBlur,
302
+ onValueChange: values => {
303
+ field.onChange(values.value);
304
+ },
305
+ customInput: import_ui5.Input,
306
+ "aria-invalid": Boolean(fieldState.error).valueOf(),
307
+ ...patternFormatProps
308
+ });
309
+ }
310
+ });
311
+ };
312
+
313
+ // src/FormFieldCreditCardNumber.tsx
314
+ var import_jsx_runtime6 = require("react/jsx-runtime");
315
+ var FormFieldCreditCardNumber = ({
316
+ label,
317
+ name,
318
+ ...formFieldPatternFormatProps
319
+ }) => {
320
+ return /* @__PURE__ */(0, import_jsx_runtime6.jsx)(FormFieldPatternFormat, {
321
+ name,
322
+ label,
323
+ format: "#### #### #### ####",
324
+ placeholder: "1234 1234 1234 1234",
325
+ ...formFieldPatternFormatProps
326
+ });
327
+ };
328
+
329
+ // src/FormFieldNumericFormat.tsx
330
+ var import_ui6 = require("@ttoss/ui");
331
+ var import_react_number_format2 = require("react-number-format");
332
+ var import_jsx_runtime7 = require("react/jsx-runtime");
279
333
  var FormFieldNumericFormat = ({
280
334
  label,
281
335
  name,
282
336
  ...numericFormatProps
283
337
  }) => {
284
- return /* @__PURE__ */(0, import_jsx_runtime5.jsx)(FormField, {
338
+ return /* @__PURE__ */(0, import_jsx_runtime7.jsx)(FormField, {
285
339
  label,
286
340
  name,
287
341
  render: ({
288
342
  field
289
343
  }) => {
290
- return /* @__PURE__ */(0, import_jsx_runtime5.jsx)(import_react_number_format.NumericFormat, {
344
+ return /* @__PURE__ */(0, import_jsx_runtime7.jsx)(import_react_number_format2.NumericFormat, {
291
345
  name: field.name,
292
346
  value: field.value,
293
347
  onBlur: field.onBlur,
294
348
  onValueChange: values => {
295
349
  field.onChange(values.floatValue);
296
350
  },
297
- customInput: import_ui5.Input,
351
+ customInput: import_ui6.Input,
298
352
  ...numericFormatProps
299
353
  });
300
354
  }
301
355
  });
302
356
  };
303
357
 
358
+ // src/FormFieldCurrencyInput.tsx
359
+ var import_jsx_runtime8 = require("react/jsx-runtime");
360
+ var FormFieldCurrencyInput = ({
361
+ label,
362
+ name,
363
+ prefix,
364
+ decimalSeparator,
365
+ thousandSeparator,
366
+ ...formFieldNumericFormatProps
367
+ }) => {
368
+ return /* @__PURE__ */(0, import_jsx_runtime8.jsx)(FormFieldNumericFormat, {
369
+ name,
370
+ label,
371
+ fixedDecimalScale: true,
372
+ decimalScale: 2,
373
+ prefix,
374
+ decimalSeparator,
375
+ thousandSeparator,
376
+ placeholder: `${prefix} 0${decimalSeparator}00`,
377
+ allowNegative: false,
378
+ ...formFieldNumericFormatProps
379
+ });
380
+ };
381
+
304
382
  // src/FormFieldInput.tsx
305
- var import_ui6 = require("@ttoss/ui");
306
- var import_jsx_runtime6 = require("react/jsx-runtime");
383
+ var import_ui7 = require("@ttoss/ui");
384
+ var import_jsx_runtime9 = require("react/jsx-runtime");
307
385
  var FormFieldInput = ({
308
386
  label,
309
387
  name,
@@ -313,7 +391,7 @@ var FormFieldInput = ({
313
391
  defaultValue = "",
314
392
  ...inputProps
315
393
  }) => {
316
- return /* @__PURE__ */(0, import_jsx_runtime6.jsx)(FormField, {
394
+ return /* @__PURE__ */(0, import_jsx_runtime9.jsx)(FormField, {
317
395
  name,
318
396
  label,
319
397
  disabled: inputProps.disabled,
@@ -325,7 +403,7 @@ var FormFieldInput = ({
325
403
  field,
326
404
  fieldState
327
405
  }) => {
328
- return /* @__PURE__ */(0, import_jsx_runtime6.jsx)(import_ui6.Input, {
406
+ return /* @__PURE__ */(0, import_jsx_runtime9.jsx)(import_ui7.Input, {
329
407
  ...inputProps,
330
408
  ...field,
331
409
  "aria-invalid": fieldState.error ? "true" : void 0
@@ -335,8 +413,8 @@ var FormFieldInput = ({
335
413
  };
336
414
 
337
415
  // src/FormFieldPassword.tsx
338
- var import_ui7 = require("@ttoss/ui");
339
- var import_jsx_runtime7 = require("react/jsx-runtime");
416
+ var import_ui8 = require("@ttoss/ui");
417
+ var import_jsx_runtime10 = require("react/jsx-runtime");
340
418
  var FormFieldPassword = ({
341
419
  label,
342
420
  name,
@@ -346,7 +424,7 @@ var FormFieldPassword = ({
346
424
  defaultValue = "",
347
425
  ...inputProps
348
426
  }) => {
349
- return /* @__PURE__ */(0, import_jsx_runtime7.jsx)(FormField, {
427
+ return /* @__PURE__ */(0, import_jsx_runtime10.jsx)(FormField, {
350
428
  name,
351
429
  label,
352
430
  disabled: inputProps.disabled,
@@ -358,7 +436,7 @@ var FormFieldPassword = ({
358
436
  field,
359
437
  fieldState
360
438
  }) => {
361
- return /* @__PURE__ */(0, import_jsx_runtime7.jsx)(import_ui7.InputPassword, {
439
+ return /* @__PURE__ */(0, import_jsx_runtime10.jsx)(import_ui8.InputPassword, {
362
440
  ...inputProps,
363
441
  ...field,
364
442
  "aria-invalid": fieldState.error ? "true" : void 0
@@ -368,9 +446,9 @@ var FormFieldPassword = ({
368
446
  };
369
447
 
370
448
  // src/FormFieldRadio.tsx
371
- var import_ui8 = require("@ttoss/ui");
449
+ var import_ui9 = require("@ttoss/ui");
372
450
  var import_react_hook_form5 = require("react-hook-form");
373
- var import_jsx_runtime8 = require("react/jsx-runtime");
451
+ var import_jsx_runtime11 = require("react/jsx-runtime");
374
452
  var FormFieldRadio = ({
375
453
  label,
376
454
  name,
@@ -389,23 +467,23 @@ var FormFieldRadio = ({
389
467
  name,
390
468
  defaultValue: ""
391
469
  });
392
- return /* @__PURE__ */(0, import_jsx_runtime8.jsxs)(import_ui8.Flex, {
470
+ return /* @__PURE__ */(0, import_jsx_runtime11.jsxs)(import_ui9.Flex, {
393
471
  sx: {
394
472
  flexDirection: "column",
395
473
  width: "100%",
396
474
  ...sx
397
475
  },
398
- children: [label && /* @__PURE__ */(0, import_jsx_runtime8.jsx)(import_ui8.Label, {
476
+ children: [label && /* @__PURE__ */(0, import_jsx_runtime11.jsx)(import_ui9.Label, {
399
477
  sx: {
400
478
  marginBottom: "md"
401
479
  },
402
480
  children: label
403
- }), /* @__PURE__ */(0, import_jsx_runtime8.jsx)(import_ui8.Box, {
481
+ }), /* @__PURE__ */(0, import_jsx_runtime11.jsx)(import_ui9.Box, {
404
482
  children: options.map(option => {
405
483
  const id = `form-field-radio-${name}-${option.value}`;
406
- return /* @__PURE__ */(0, import_jsx_runtime8.jsxs)(import_ui8.Label, {
484
+ return /* @__PURE__ */(0, import_jsx_runtime11.jsxs)(import_ui9.Label, {
407
485
  htmlFor: id,
408
- children: [/* @__PURE__ */(0, import_jsx_runtime8.jsx)(import_ui8.Radio, {
486
+ children: [/* @__PURE__ */(0, import_jsx_runtime11.jsx)(import_ui9.Radio, {
409
487
  ref,
410
488
  onChange,
411
489
  onBlur,
@@ -417,91 +495,64 @@ var FormFieldRadio = ({
417
495
  }), option.label]
418
496
  }, id);
419
497
  })
420
- }), /* @__PURE__ */(0, import_jsx_runtime8.jsx)(ErrorMessage, {
498
+ }), /* @__PURE__ */(0, import_jsx_runtime11.jsx)(ErrorMessage, {
421
499
  name
422
500
  })]
423
501
  });
424
502
  };
425
503
 
426
504
  // src/FormFieldSelect.tsx
427
- var import_ui9 = require("@ttoss/ui");
428
- var import_jsx_runtime9 = require("react/jsx-runtime");
429
- var checkDefaultValue = ({
430
- options,
431
- defaultValue,
432
- placeholder
433
- }) => {
434
- if (defaultValue) {
435
- return defaultValue;
436
- }
437
- const hasEmptyValue = options.some(opt => {
438
- return opt.value === "" || opt.value === 0;
439
- });
440
- const EMPTY_VALUE = "";
441
- if (placeholder && hasEmptyValue) {
442
- return EMPTY_VALUE;
443
- }
444
- if (placeholder && !hasEmptyValue) {
445
- options.unshift({
446
- label: placeholder,
447
- value: ""
448
- });
449
- return EMPTY_VALUE;
450
- }
451
- if (!placeholder && defaultValue) return EMPTY_VALUE;
452
- if (options.length === 0) return EMPTY_VALUE;
453
- return options?.[0]?.value;
454
- };
505
+ var import_ui10 = require("@ttoss/ui");
506
+ var import_jsx_runtime12 = require("react/jsx-runtime");
455
507
  var FormFieldSelect = ({
456
508
  label,
457
509
  name,
458
- options,
510
+ id,
511
+ defaultValue,
459
512
  sx,
513
+ css,
514
+ disabled,
515
+ tooltip,
516
+ onTooltipClick,
460
517
  ...selectProps
461
518
  }) => {
462
- const {
463
- defaultValue,
464
- placeholder
465
- } = selectProps;
466
- const checkedDefaultValue = checkDefaultValue({
467
- options,
468
- defaultValue,
469
- placeholder
470
- });
471
- return /* @__PURE__ */(0, import_jsx_runtime9.jsx)(FormField, {
519
+ return /* @__PURE__ */(0, import_jsx_runtime12.jsx)(FormField, {
472
520
  name,
473
521
  label,
474
- disabled: selectProps.disabled,
475
- tooltip: selectProps.tooltip,
476
- onTooltipClick: selectProps.onTooltipClick,
522
+ id,
523
+ defaultValue,
524
+ disabled,
525
+ tooltip,
526
+ onTooltipClick,
477
527
  sx,
478
- defaultValue: checkedDefaultValue,
528
+ css,
479
529
  render: ({
480
530
  field,
481
531
  fieldState
482
532
  }) => {
483
- return /* @__PURE__ */(0, import_jsx_runtime9.jsx)(import_ui9.Select, {
533
+ const value = selectProps.options?.find(option => {
534
+ if ("value" in option) {
535
+ return option.value === field.value;
536
+ }
537
+ return false;
538
+ });
539
+ return /* @__PURE__ */(0, import_jsx_runtime12.jsx)(import_ui10.Select, {
484
540
  ...selectProps,
485
541
  ...field,
486
- ...{
487
- ...selectProps,
488
- defaultValue: void 0
542
+ defaultValue: value,
543
+ value,
544
+ onChange: value2 => {
545
+ field.onChange(value2?.value);
489
546
  },
490
- "aria-invalid": fieldState.error ? "true" : void 0,
491
- children: options.map(option => {
492
- return /* @__PURE__ */(0, import_jsx_runtime9.jsx)("option", {
493
- value: option.value,
494
- children: option.label
495
- }, option.label);
496
- })
547
+ "aria-invalid": fieldState.error ? "true" : void 0
497
548
  });
498
549
  }
499
550
  });
500
551
  };
501
552
 
502
553
  // src/FormFieldTextarea.tsx
503
- var import_ui10 = require("@ttoss/ui");
504
- var import_jsx_runtime10 = require("react/jsx-runtime");
554
+ var import_ui11 = require("@ttoss/ui");
555
+ var import_jsx_runtime13 = require("react/jsx-runtime");
505
556
  var FormFieldTextarea = ({
506
557
  label,
507
558
  name,
@@ -509,7 +560,7 @@ var FormFieldTextarea = ({
509
560
  ...textareaProps
510
561
  }) => {
511
562
  const id = `form-field-textarea-${name}`;
512
- return /* @__PURE__ */(0, import_jsx_runtime10.jsx)(FormField, {
563
+ return /* @__PURE__ */(0, import_jsx_runtime13.jsx)(FormField, {
513
564
  label,
514
565
  name,
515
566
  id,
@@ -518,7 +569,7 @@ var FormFieldTextarea = ({
518
569
  field,
519
570
  fieldState
520
571
  }) => {
521
- return /* @__PURE__ */(0, import_jsx_runtime10.jsx)(import_ui10.Textarea, {
572
+ return /* @__PURE__ */(0, import_jsx_runtime13.jsx)(import_ui11.Textarea, {
522
573
  ...field,
523
574
  ...textareaProps,
524
575
  "aria-invalid": fieldState.error ? "true" : void 0
@@ -529,8 +580,8 @@ var FormFieldTextarea = ({
529
580
 
530
581
  // src/FormGroup.tsx
531
582
  var React3 = __toESM(require("react"));
532
- var import_ui11 = require("@ttoss/ui");
533
- var import_jsx_runtime11 = require("react/jsx-runtime");
583
+ var import_ui12 = require("@ttoss/ui");
584
+ var import_jsx_runtime14 = require("react/jsx-runtime");
534
585
  var FormGroupLevelsManagerContext = React3.createContext({
535
586
  levelsLength: 1,
536
587
  registerChild: () => {
@@ -546,7 +597,7 @@ var FormGroupLevelsManager = ({
546
597
  setLevelsLength(level + 1);
547
598
  }
548
599
  }, [levelsLength]);
549
- return /* @__PURE__ */(0, import_jsx_runtime11.jsx)(FormGroupLevelsManagerContext.Provider, {
600
+ return /* @__PURE__ */(0, import_jsx_runtime14.jsx)(FormGroupLevelsManagerContext.Provider, {
550
601
  value: {
551
602
  levelsLength,
552
603
  registerChild
@@ -589,7 +640,7 @@ var FormGroupWrapper = ({
589
640
  gap: "md",
590
641
  width: "100%"
591
642
  };
592
- return /* @__PURE__ */(0, import_jsx_runtime11.jsxs)(import_ui11.Box, {
643
+ return /* @__PURE__ */(0, import_jsx_runtime14.jsxs)(import_ui12.Box, {
593
644
  "aria-level": level,
594
645
  ...boxProps,
595
646
  sx: {
@@ -597,18 +648,18 @@ var FormGroupWrapper = ({
597
648
  marginBottom: "lg",
598
649
  ...boxProps.sx
599
650
  },
600
- children: [title && /* @__PURE__ */(0, import_jsx_runtime11.jsx)(import_ui11.Box, {
651
+ children: [title && /* @__PURE__ */(0, import_jsx_runtime14.jsx)(import_ui12.Box, {
601
652
  sx: {
602
653
  marginBottom: "md"
603
654
  },
604
- children: /* @__PURE__ */(0, import_jsx_runtime11.jsx)(import_ui11.Text, {
655
+ children: /* @__PURE__ */(0, import_jsx_runtime14.jsx)(import_ui12.Text, {
605
656
  sx: {
606
657
  fontSize: "2xl",
607
658
  fontWeight: "bold"
608
659
  },
609
660
  children: title
610
661
  })
611
- }), /* @__PURE__ */(0, import_jsx_runtime11.jsx)(import_ui11.Flex, {
662
+ }), /* @__PURE__ */(0, import_jsx_runtime14.jsx)(import_ui12.Flex, {
612
663
  sx: childrenContainerSx,
613
664
  children
614
665
  })]
@@ -619,15 +670,15 @@ var FormGroup = props => {
619
670
  level
620
671
  } = useFormGroup();
621
672
  const currentLevel = level === void 0 ? 0 : level + 1;
622
- return /* @__PURE__ */(0, import_jsx_runtime11.jsx)(FormGroupContext.Provider, {
673
+ return /* @__PURE__ */(0, import_jsx_runtime14.jsx)(FormGroupContext.Provider, {
623
674
  value: {
624
675
  parentLevel: currentLevel
625
676
  },
626
- children: currentLevel === 0 ? /* @__PURE__ */(0, import_jsx_runtime11.jsx)(FormGroupLevelsManager, {
627
- children: /* @__PURE__ */(0, import_jsx_runtime11.jsx)(FormGroupWrapper, {
677
+ children: currentLevel === 0 ? /* @__PURE__ */(0, import_jsx_runtime14.jsx)(FormGroupLevelsManager, {
678
+ children: /* @__PURE__ */(0, import_jsx_runtime14.jsx)(FormGroupWrapper, {
628
679
  ...props
629
680
  })
630
- }) : /* @__PURE__ */(0, import_jsx_runtime11.jsx)(FormGroupWrapper, {
681
+ }) : /* @__PURE__ */(0, import_jsx_runtime14.jsx)(FormGroupWrapper, {
631
682
  ...props
632
683
  })
633
684
  });
@@ -637,9 +688,12 @@ var FormGroup = props => {
637
688
  Form,
638
689
  FormField,
639
690
  FormFieldCheckbox,
691
+ FormFieldCreditCardNumber,
692
+ FormFieldCurrencyInput,
640
693
  FormFieldInput,
641
694
  FormFieldNumericFormat,
642
695
  FormFieldPassword,
696
+ FormFieldPatternFormat,
643
697
  FormFieldRadio,
644
698
  FormFieldSelect,
645
699
  FormFieldTextarea,
package/package.json CHANGED
@@ -1,7 +1,6 @@
1
1
  {
2
2
  "name": "@ttoss/forms",
3
- "version": "0.19.0",
4
- "license": "UNLICENSED",
3
+ "version": "0.21.0",
5
4
  "author": "ttoss",
6
5
  "contributors": [
7
6
  "Pedro Arantes <pedro@arantespp.com> (https://arantespp.com/contact)"
@@ -21,31 +20,31 @@
21
20
  "typings": "dist/index.d.ts",
22
21
  "dependencies": {
23
22
  "@hookform/error-message": "^2.0.1",
24
- "@hookform/resolvers": "^3.1.0",
25
- "react-hook-form": "^7.44.3",
23
+ "@hookform/resolvers": "^3.3.2",
24
+ "react-hook-form": "^7.48.2",
26
25
  "react-number-format": "^5.3.1",
27
- "yup": "^1.2.0"
26
+ "yup": "^1.3.2"
28
27
  },
29
28
  "peerDependencies": {
30
29
  "react": ">=16.8.0",
31
30
  "@ttoss/react-i18n": "^1.25.1",
32
- "@ttoss/ui": "^3.1.7"
31
+ "@ttoss/ui": "^4.0.0"
33
32
  },
34
33
  "devDependencies": {
35
34
  "@types/jest": "^29.5.5",
36
35
  "@types/react": "^18.2.29",
37
36
  "jest": "^29.7.0",
38
37
  "react": "^18.2.0",
39
- "react-error-boundary": "^4.0.9",
40
- "react-hook-form": "^7.44.3",
38
+ "react-error-boundary": "^4.0.11",
39
+ "react-hook-form": "^7.48.2",
41
40
  "theme-ui": "^0.16.1",
42
41
  "tsup": "^7.2.0",
43
- "yup": "^1.2.0",
42
+ "yup": "^1.3.2",
44
43
  "@ttoss/config": "^1.31.0",
45
44
  "@ttoss/i18n-cli": "^0.7.0",
46
45
  "@ttoss/react-i18n": "^1.25.1",
47
46
  "@ttoss/test-utils": "^1.24.1",
48
- "@ttoss/ui": "^3.1.7"
47
+ "@ttoss/ui": "^4.0.0"
49
48
  },
50
49
  "publishConfig": {
51
50
  "access": "public",
package/src/FormField.tsx CHANGED
@@ -7,39 +7,44 @@ import {
7
7
  UseControllerReturn,
8
8
  useController,
9
9
  } from 'react-hook-form';
10
- import { Flex, type FlexProps, Label } from '@ttoss/ui';
10
+ import { Flex, Label, type SxProp } from '@ttoss/ui';
11
11
 
12
- export type FormFieldProps = {
13
- sx?: FlexProps['sx'];
12
+ export type FormFieldProps<
13
+ TFieldValues extends FieldValues = FieldValues,
14
+ TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
15
+ > = {
16
+ label?: string;
17
+ id?: string;
18
+ name: TName;
19
+ defaultValue?: FieldPathValue<TFieldValues, TName>;
14
20
  disabled?: boolean;
15
21
  tooltip?: boolean;
16
22
  onTooltipClick?: () => void;
17
- };
23
+ } & SxProp;
18
24
 
19
25
  type FormFieldCompleteProps<
20
26
  TFieldValues extends FieldValues = FieldValues,
21
- TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>
27
+ TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
22
28
  > = {
23
- label?: string;
24
- id?: string;
25
- name: TName;
26
- defaultValue?: FieldPathValue<TFieldValues, TName>;
27
29
  render: (
28
30
  props: UseControllerReturn<TFieldValues, TName>
29
31
  ) => React.ReactElement;
30
- } & FormFieldProps;
32
+ } & FormFieldProps<TFieldValues, TName>;
31
33
 
32
34
  export const FormField = <
33
35
  TFieldValues extends FieldValues = FieldValues,
34
- TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>
36
+ TName extends FieldPath<TFieldValues> = FieldPath<TFieldValues>,
35
37
  >({
36
38
  label,
37
39
  id: idProp,
38
40
  name,
39
41
  defaultValue,
42
+ disabled,
43
+ tooltip,
44
+ onTooltipClick,
40
45
  sx,
46
+ css,
41
47
  render,
42
- ...formFieldProps
43
48
  }: FormFieldCompleteProps<TFieldValues, TName>) => {
44
49
  const controllerReturn = useController<TFieldValues, TName>({
45
50
  name,
@@ -54,10 +59,10 @@ export const FormField = <
54
59
  <>
55
60
  {label && (
56
61
  <Label
57
- aria-disabled={formFieldProps.disabled}
62
+ aria-disabled={disabled}
58
63
  htmlFor={id}
59
- tooltip={formFieldProps.tooltip}
60
- onTooltipClick={formFieldProps.onTooltipClick}
64
+ tooltip={tooltip}
65
+ onTooltipClick={onTooltipClick}
61
66
  >
62
67
  {label}
63
68
  </Label>
@@ -67,18 +72,13 @@ export const FormField = <
67
72
  </>
68
73
  );
69
74
  });
70
- }, [
71
- controllerReturn,
72
- formFieldProps.disabled,
73
- formFieldProps.onTooltipClick,
74
- formFieldProps.tooltip,
75
- id,
76
- label,
77
- render,
78
- ]);
75
+ }, [controllerReturn, disabled, onTooltipClick, tooltip, id, label, render]);
79
76
 
80
77
  return (
81
- <Flex sx={{ flexDirection: 'column', width: '100%', gap: 'md', ...sx }}>
78
+ <Flex
79
+ sx={{ flexDirection: 'column', width: '100%', gap: 'md', ...sx }}
80
+ css={css}
81
+ >
82
82
  {memoizedRender}
83
83
  <ErrorMessage name={name} />
84
84
  </Flex>
@@ -0,0 +1,25 @@
1
+ import {
2
+ FormFieldPatternFormat,
3
+ FormFieldPatternFormatProps,
4
+ } from './FormFieldPatternFormat';
5
+
6
+ export type FormFieldCreditCardNumberProps = {
7
+ label: string;
8
+ name: string;
9
+ } & Partial<FormFieldPatternFormatProps>;
10
+
11
+ export const FormFieldCreditCardNumber = ({
12
+ label,
13
+ name,
14
+ ...formFieldPatternFormatProps
15
+ }: FormFieldCreditCardNumberProps) => {
16
+ return (
17
+ <FormFieldPatternFormat
18
+ name={name}
19
+ label={label}
20
+ format="#### #### #### ####"
21
+ placeholder="1234 1234 1234 1234"
22
+ {...formFieldPatternFormatProps}
23
+ />
24
+ );
25
+ };
@@ -0,0 +1,36 @@
1
+ import {
2
+ FormFieldNumericFormat,
3
+ FormFieldNumericFormatProps,
4
+ } from './FormFieldNumericFormat';
5
+
6
+ export type FormFieldCurrencyInputProps = {
7
+ label?: string;
8
+ name: string;
9
+ prefix: string;
10
+ decimalSeparator: string;
11
+ thousandSeparator: string;
12
+ } & FormFieldNumericFormatProps;
13
+
14
+ export const FormFieldCurrencyInput = ({
15
+ label,
16
+ name,
17
+ prefix,
18
+ decimalSeparator,
19
+ thousandSeparator,
20
+ ...formFieldNumericFormatProps
21
+ }: FormFieldCurrencyInputProps) => {
22
+ return (
23
+ <FormFieldNumericFormat
24
+ name={name}
25
+ label={label}
26
+ fixedDecimalScale
27
+ decimalScale={2}
28
+ prefix={prefix}
29
+ decimalSeparator={decimalSeparator}
30
+ thousandSeparator={thousandSeparator}
31
+ placeholder={`${prefix} 0${decimalSeparator}00`}
32
+ allowNegative={false}
33
+ {...formFieldNumericFormatProps}
34
+ />
35
+ );
36
+ };