@form-eng/mantine 1.5.3 → 1.6.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
@@ -29,27 +29,43 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
29
29
  // src/index.ts
30
30
  var index_exports = {};
31
31
  __export(index_exports, {
32
+ Autocomplete: () => Autocomplete_default,
32
33
  CheckboxGroup: () => CheckboxGroup_default,
34
+ ColorPicker: () => ColorPicker_default,
33
35
  DateControl: () => DateControl_default,
36
+ DateRange: () => DateRange_default,
37
+ DateTime: () => DateTime_default,
38
+ DocumentLinks: () => DocumentLinks_default,
34
39
  DocumentLinksStrings: () => import_adapter_utils.DocumentLinksStrings,
35
40
  Dropdown: () => Dropdown_default,
36
41
  DynamicFragment: () => DynamicFragment_default,
37
42
  FieldClassName: () => import_adapter_utils.FieldClassName,
43
+ FileUpload: () => FileUpload_default,
38
44
  FormLoading: () => FormLoading,
39
45
  GetFieldDataTestId: () => import_adapter_utils.GetFieldDataTestId,
40
46
  MultiSelect: () => MultiSelect_default,
47
+ MultiSelectSearch: () => MultiSelectSearch_default,
41
48
  Number: () => Number_default,
49
+ PhoneInput: () => PhoneInput_default,
42
50
  RadioGroup: () => RadioGroup_default,
51
+ Rating: () => Rating_default,
43
52
  ReadOnly: () => ReadOnly_default,
53
+ ReadOnlyArray: () => ReadOnlyArray_default,
54
+ ReadOnlyCumulativeNumber: () => ReadOnlyCumulativeNumber_default,
55
+ ReadOnlyDateTime: () => ReadOnlyDateTime_default,
56
+ ReadOnlyRichText: () => ReadOnlyRichText_default,
44
57
  ReadOnlyText: () => ReadOnlyText,
58
+ ReadOnlyWithButton: () => ReadOnlyWithButton_default,
45
59
  SimpleDropdown: () => SimpleDropdown_default,
46
60
  Slider: () => Slider_default,
61
+ StatusDropdown: () => StatusDropdown_default,
47
62
  StatusMessage: () => StatusMessage,
48
63
  Textarea: () => Textarea_default,
49
64
  Textbox: () => Textbox_default,
50
65
  Toggle: () => Toggle_default,
51
66
  createMantineFieldRegistry: () => createMantineFieldRegistry,
52
- formatDateTime: () => import_adapter_utils.formatDateTime
67
+ formatDateTime: () => import_adapter_utils.formatDateTime,
68
+ getFieldState: () => import_adapter_utils.getFieldState
53
69
  });
54
70
  module.exports = __toCommonJS(index_exports);
55
71
 
@@ -478,92 +494,688 @@ var DynamicFragment = (props) => {
478
494
  };
479
495
  var DynamicFragment_default = DynamicFragment;
480
496
 
481
- // src/fields/readonly/ReadOnly.tsx
497
+ // src/fields/Rating.tsx
498
+ var import_core12 = require("@mantine/core");
482
499
  var import_jsx_runtime14 = require("react/jsx-runtime");
500
+ var Rating = (props) => {
501
+ const { fieldName, programName, entityType, entityId, value, readOnly, error, required, config, setFieldValue } = props;
502
+ const max = config?.max ?? 5;
503
+ const rating = value ?? 0;
504
+ if (readOnly) {
505
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(ReadOnlyText, { fieldName, value: String(rating) });
506
+ }
507
+ return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(
508
+ import_core12.Rating,
509
+ {
510
+ className: "fe-rating",
511
+ count: max,
512
+ value: rating,
513
+ onChange: (val) => setFieldValue(fieldName, val),
514
+ "data-testid": (0, import_adapter_utils.GetFieldDataTestId)(fieldName, programName, entityType, entityId)
515
+ }
516
+ );
517
+ };
518
+ var Rating_default = Rating;
519
+
520
+ // src/fields/Autocomplete.tsx
521
+ var import_core13 = require("@mantine/core");
522
+ var import_jsx_runtime15 = require("react/jsx-runtime");
523
+ var Autocomplete = (props) => {
524
+ const { fieldName, programName, entityType, entityId, value, readOnly, error, required, placeholder, options, setFieldValue } = props;
525
+ const selectedLabel = options?.find((o) => String(o.value) === String(value))?.label ?? value ?? "";
526
+ if (readOnly) {
527
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(ReadOnlyText, { fieldName, value: selectedLabel });
528
+ }
529
+ const data = options?.map((o) => ({ value: String(o.value), label: o.label })) ?? [];
530
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
531
+ import_core13.Autocomplete,
532
+ {
533
+ className: "fe-autocomplete",
534
+ data,
535
+ defaultValue: selectedLabel,
536
+ onChange: (val) => {
537
+ const match = options?.find((o) => o.label === val);
538
+ setFieldValue(fieldName, match ? String(match.value) : val);
539
+ },
540
+ placeholder,
541
+ error: !!error,
542
+ required,
543
+ "data-testid": (0, import_adapter_utils.GetFieldDataTestId)(fieldName, programName, entityType, entityId)
544
+ }
545
+ );
546
+ };
547
+ var Autocomplete_default = Autocomplete;
548
+
549
+ // src/fields/DateTime.tsx
550
+ var import_core14 = require("@form-eng/core");
551
+ var import_dates = require("@mantine/dates");
552
+ var import_jsx_runtime16 = require("react/jsx-runtime");
553
+ var DateTime = (props) => {
554
+ const { fieldName, programName, entityType, entityId, value, readOnly, error, required, config, setFieldValue } = props;
555
+ if (readOnly) {
556
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(ReadOnlyText, { fieldName, value: (0, import_core14.formatDateTimeValue)(value) });
557
+ }
558
+ const dateValue = value ? new Date(value) : null;
559
+ const onChange = (date) => {
560
+ setFieldValue(fieldName, date ? date.toISOString() : null);
561
+ };
562
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
563
+ import_dates.DateTimePicker,
564
+ {
565
+ className: "fe-date-time",
566
+ value: dateValue,
567
+ onChange,
568
+ error: !!error,
569
+ required,
570
+ "data-testid": (0, import_adapter_utils.GetFieldDataTestId)(fieldName, programName, entityType, entityId)
571
+ }
572
+ );
573
+ };
574
+ var DateTime_default = DateTime;
575
+
576
+ // src/fields/DateRange.tsx
577
+ var import_core15 = require("@form-eng/core");
578
+ var import_jsx_runtime17 = require("react/jsx-runtime");
579
+ var DateRange = (props) => {
580
+ const { fieldName, programName, entityType, entityId, value, readOnly, error, required, config, setFieldValue } = props;
581
+ const rangeValue = value ?? { start: "", end: "" };
582
+ const minDate = config?.minDate;
583
+ const maxDate = config?.maxDate;
584
+ const rangeError = rangeValue.start && rangeValue.end && rangeValue.start > rangeValue.end ? "Start date must be on or before end date." : void 0;
585
+ if (readOnly) {
586
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(ReadOnlyText, { fieldName, value: (0, import_core15.formatDateRange)(value) });
587
+ }
588
+ const onStartChange = (event) => {
589
+ setFieldValue(fieldName, { ...rangeValue, start: event.target.value });
590
+ };
591
+ const onEndChange = (event) => {
592
+ setFieldValue(fieldName, { ...rangeValue, end: event.target.value });
593
+ };
594
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)(
595
+ "div",
596
+ {
597
+ className: "fe-date-range",
598
+ "data-field-type": "DateRange",
599
+ "data-field-state": (0, import_adapter_utils.getFieldState)({ error, required, readOnly }),
600
+ "data-testid": (0, import_adapter_utils.GetFieldDataTestId)(fieldName, programName, entityType, entityId),
601
+ children: [
602
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "fe-date-range__inputs", children: [
603
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "fe-date-range__from", children: [
604
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("label", { htmlFor: `${fieldName}-start`, className: "fe-date-range__label", children: "From" }),
605
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
606
+ "input",
607
+ {
608
+ id: `${fieldName}-start`,
609
+ type: "date",
610
+ className: "fe-date-range__input fe-date-range__input--start",
611
+ value: rangeValue.start,
612
+ min: minDate,
613
+ max: rangeValue.end || maxDate,
614
+ onChange: onStartChange,
615
+ "aria-invalid": !!error,
616
+ "aria-required": required,
617
+ "aria-label": "Start date"
618
+ }
619
+ )
620
+ ] }),
621
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("div", { className: "fe-date-range__to", children: [
622
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("label", { htmlFor: `${fieldName}-end`, className: "fe-date-range__label", children: "To" }),
623
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
624
+ "input",
625
+ {
626
+ id: `${fieldName}-end`,
627
+ type: "date",
628
+ className: "fe-date-range__input fe-date-range__input--end",
629
+ value: rangeValue.end,
630
+ min: rangeValue.start || minDate,
631
+ max: maxDate,
632
+ onChange: onEndChange,
633
+ "aria-label": "End date"
634
+ }
635
+ )
636
+ ] })
637
+ ] }),
638
+ rangeError && /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("span", { className: "fe-date-range__range-error", role: "alert", children: rangeError })
639
+ ]
640
+ }
641
+ );
642
+ };
643
+ var DateRange_default = DateRange;
644
+
645
+ // src/fields/PhoneInput.tsx
646
+ var import_core16 = require("@form-eng/core");
647
+ var import_jsx_runtime18 = require("react/jsx-runtime");
648
+ var PhoneInput = (props) => {
649
+ const { fieldName, programName, entityType, entityId, value, readOnly, error, required, config, setFieldValue } = props;
650
+ const format = config?.format ?? "us";
651
+ if (readOnly) {
652
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(ReadOnlyText, { fieldName, value: value ?? "" });
653
+ }
654
+ const onChange = (event) => {
655
+ const digits = (0, import_core16.extractDigits)(event.target.value);
656
+ const formatted = (0, import_core16.formatPhone)(digits, format);
657
+ setFieldValue(fieldName, formatted);
658
+ };
659
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
660
+ "input",
661
+ {
662
+ type: "tel",
663
+ className: "fe-phone-input",
664
+ "data-field-type": "PhoneInput",
665
+ "data-field-state": (0, import_adapter_utils.getFieldState)({ error, required, readOnly }),
666
+ value: value ?? "",
667
+ onChange,
668
+ "aria-invalid": !!error,
669
+ "aria-required": required,
670
+ "data-testid": (0, import_adapter_utils.GetFieldDataTestId)(fieldName, programName, entityType, entityId)
671
+ }
672
+ );
673
+ };
674
+ var PhoneInput_default = PhoneInput;
675
+
676
+ // src/fields/FileUpload.tsx
677
+ var import_core17 = require("@form-eng/core");
678
+ var import_react2 = __toESM(require("react"));
679
+ var import_core18 = require("@mantine/core");
680
+ var import_jsx_runtime19 = require("react/jsx-runtime");
681
+ var FileUpload = (props) => {
682
+ const { fieldName, programName, entityType, entityId, value, readOnly, error, required, config, setFieldValue } = props;
683
+ const multiple = config?.multiple ?? false;
684
+ const accept = config?.accept;
685
+ const maxSizeMb = config?.maxSizeMb ?? import_core17.MAX_FILE_SIZE_MB_DEFAULT;
686
+ const maxSizeBytes = maxSizeMb * 1024 * 1024;
687
+ const [sizeError, setSizeError] = import_react2.default.useState(void 0);
688
+ if (readOnly) {
689
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(ReadOnlyText, { fieldName, value: (0, import_core17.getFileNames)(value) });
690
+ }
691
+ const onChange = (files) => {
692
+ if (!files || Array.isArray(files) && files.length === 0) {
693
+ setFieldValue(fieldName, null);
694
+ setSizeError(void 0);
695
+ return;
696
+ }
697
+ const fileArray = Array.isArray(files) ? files : [files];
698
+ const oversized = fileArray.find((f) => f.size > maxSizeBytes);
699
+ if (oversized) {
700
+ setSizeError(`"${oversized.name}" exceeds the ${maxSizeMb} MB size limit.`);
701
+ setFieldValue(fieldName, null);
702
+ return;
703
+ }
704
+ setSizeError(void 0);
705
+ setFieldValue(fieldName, multiple ? fileArray : fileArray[0]);
706
+ };
707
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsxs)(
708
+ "div",
709
+ {
710
+ className: "fe-file-upload",
711
+ "data-field-type": "FileUpload",
712
+ "data-field-state": (0, import_adapter_utils.getFieldState)({ error, required, readOnly }),
713
+ "data-testid": (0, import_adapter_utils.GetFieldDataTestId)(fieldName, programName, entityType, entityId),
714
+ children: [
715
+ /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
716
+ import_core18.FileInput,
717
+ {
718
+ accept,
719
+ multiple,
720
+ onChange,
721
+ error: !!error,
722
+ required,
723
+ placeholder: (0, import_core17.getFileNames)(value) || "Choose file"
724
+ }
725
+ ),
726
+ sizeError && /* @__PURE__ */ (0, import_jsx_runtime19.jsx)("span", { className: "fe-file-upload__size-error", role: "alert", children: sizeError })
727
+ ]
728
+ }
729
+ );
730
+ };
731
+ var FileUpload_default = FileUpload;
732
+
733
+ // src/fields/ColorPicker.tsx
734
+ var import_core19 = require("@mantine/core");
735
+ var import_jsx_runtime20 = require("react/jsx-runtime");
736
+ var ColorPicker = (props) => {
737
+ const { fieldName, programName, entityType, entityId, value, readOnly, error, required, setFieldValue } = props;
738
+ const color = value ?? "#000000";
739
+ if (readOnly) {
740
+ return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(ReadOnlyText, { fieldName, value: color });
741
+ }
742
+ return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
743
+ import_core19.ColorInput,
744
+ {
745
+ className: "fe-color-picker",
746
+ value: color,
747
+ onChange: (val) => setFieldValue(fieldName, val),
748
+ error: !!error,
749
+ required,
750
+ "data-field-type": "ColorPicker",
751
+ "data-field-state": (0, import_adapter_utils.getFieldState)({ error, required, readOnly }),
752
+ "data-testid": (0, import_adapter_utils.GetFieldDataTestId)(fieldName, programName, entityType, entityId)
753
+ }
754
+ );
755
+ };
756
+ var ColorPicker_default = ColorPicker;
757
+
758
+ // src/fields/MultiSelectSearch.tsx
759
+ var import_react3 = require("react");
760
+ var import_jsx_runtime21 = require("react/jsx-runtime");
761
+ var MultiSelectSearch = (props) => {
762
+ const { fieldName, programName, entityType, entityId, value, readOnly, error, required, options, setFieldValue } = props;
763
+ const [searchTerm, setSearchTerm] = (0, import_react3.useState)("");
764
+ const selectedValues = value ?? [];
765
+ const filteredOptions = (0, import_react3.useMemo)(() => {
766
+ if (!searchTerm) return options ?? [];
767
+ const lower = searchTerm.toLowerCase();
768
+ return (options ?? []).filter((o) => o.label.toLowerCase().includes(lower));
769
+ }, [options, searchTerm]);
770
+ const onCheckChange = (optionValue, checked) => {
771
+ const updated = checked ? [...selectedValues, optionValue] : selectedValues.filter((v) => v !== optionValue);
772
+ setFieldValue(fieldName, updated, false, 3e3);
773
+ };
774
+ if (readOnly) {
775
+ return selectedValues.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("ul", { className: "fe-multi-select-search-readonly", "data-field-type": "MultiSelectSearch", "data-field-state": "readonly", children: selectedValues.map((v, i) => /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("li", { children: v }, i)) }) : /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("span", { className: "fe-read-only-text", children: "-" });
776
+ }
777
+ return /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { className: "fe-multi-select-search", "data-field-type": "MultiSelectSearch", "data-field-state": (0, import_adapter_utils.getFieldState)({ error, required, readOnly }), "data-testid": (0, import_adapter_utils.GetFieldDataTestId)(fieldName, programName, entityType, entityId), children: [
778
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("input", { type: "search", className: "fe-multi-select-search__input", placeholder: "Search...", value: searchTerm, onChange: (e) => setSearchTerm(e.target.value), "aria-label": `Search options for ${fieldName}` }),
779
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("fieldset", { className: "fe-multi-select-search__options", "aria-invalid": !!error, "aria-required": required, children: [
780
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("legend", { className: "fe-sr-only", children: "Options" }),
781
+ filteredOptions.map((option) => {
782
+ const optVal = String(option.value);
783
+ const isChecked = selectedValues.includes(optVal);
784
+ return /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("label", { className: "fe-multi-select-search__option", children: [
785
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("input", { type: "checkbox", checked: isChecked, disabled: option.disabled, onChange: (e) => onCheckChange(optVal, e.target.checked) }),
786
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("span", { children: option.label })
787
+ ] }, optVal);
788
+ })
789
+ ] })
790
+ ] });
791
+ };
792
+ var MultiSelectSearch_default = MultiSelectSearch;
793
+
794
+ // src/fields/StatusDropdown.tsx
795
+ var import_jsx_runtime22 = require("react/jsx-runtime");
796
+ var StatusDropdown = (props) => {
797
+ const { fieldName, programName, entityType, entityId, value, readOnly, error, required, config, options, placeholder, setFieldValue } = props;
798
+ const onChange = (event) => {
799
+ setFieldValue(fieldName, event.target.value);
800
+ };
801
+ const statusColor = config?.statusColors?.[value];
802
+ if (readOnly) {
803
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(
804
+ "div",
805
+ {
806
+ className: "fe-status-dropdown fe-status-dropdown--readonly",
807
+ "data-field-type": "StatusDropdown",
808
+ "data-field-state": "readonly",
809
+ children: [
810
+ statusColor && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
811
+ "span",
812
+ {
813
+ className: "fe-status-dropdown__indicator",
814
+ style: { backgroundColor: statusColor },
815
+ "aria-hidden": "true"
816
+ }
817
+ ),
818
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(ReadOnlyText, { fieldName, value })
819
+ ]
820
+ }
821
+ );
822
+ }
823
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(
824
+ "div",
825
+ {
826
+ className: "fe-status-dropdown",
827
+ "data-field-type": "StatusDropdown",
828
+ "data-field-state": (0, import_adapter_utils.getFieldState)({ error, required, readOnly }),
829
+ children: [
830
+ statusColor && /* @__PURE__ */ (0, import_jsx_runtime22.jsx)(
831
+ "span",
832
+ {
833
+ className: "fe-status-dropdown__indicator",
834
+ style: { backgroundColor: statusColor },
835
+ "aria-hidden": "true"
836
+ }
837
+ ),
838
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)(
839
+ "select",
840
+ {
841
+ className: "fe-status-dropdown__select",
842
+ value: value ?? "",
843
+ onChange,
844
+ "aria-invalid": !!error,
845
+ "aria-required": required,
846
+ "data-testid": (0, import_adapter_utils.GetFieldDataTestId)(fieldName, programName, entityType, entityId),
847
+ children: [
848
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("option", { value: "", children: placeholder ?? config?.placeHolder ?? "" }),
849
+ options?.map((option) => /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("option", { value: String(option.value), disabled: option.disabled, children: option.label }, String(option.value)))
850
+ ]
851
+ }
852
+ )
853
+ ]
854
+ }
855
+ );
856
+ };
857
+ var StatusDropdown_default = StatusDropdown;
858
+
859
+ // src/fields/DocumentLinks.tsx
860
+ var import_react4 = require("react");
861
+ var import_react_hook_form = require("react-hook-form");
862
+ var import_jsx_runtime23 = require("react/jsx-runtime");
863
+ var DocumentLinks = (props) => {
864
+ const { fieldName, programName, entityType, entityId, value, readOnly, error, required, setFieldValue } = props;
865
+ const { watch } = (0, import_react_hook_form.useFormContext)();
866
+ const documentLinks = watch(`${fieldName}`) ?? [];
867
+ const [newUrl, setNewUrl] = (0, import_react4.useState)("");
868
+ const [newText, setNewText] = (0, import_react4.useState)("");
869
+ const onAddLink = () => {
870
+ if (!newUrl) return;
871
+ const link = { url: newUrl, title: newText || newUrl };
872
+ setFieldValue(fieldName, [...documentLinks, link]);
873
+ setNewUrl("");
874
+ setNewText("");
875
+ };
876
+ const onDeleteLink = (index) => {
877
+ const updated = [...documentLinks];
878
+ updated.splice(index, 1);
879
+ setFieldValue(fieldName, updated);
880
+ };
881
+ if (readOnly) {
882
+ return /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
883
+ "ul",
884
+ {
885
+ className: "fe-document-links fe-document-links--readonly",
886
+ "data-field-type": "DocumentLinks",
887
+ "data-field-state": "readonly",
888
+ children: value?.map((link, i) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("li", { className: "fe-document-links__item", children: /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("a", { href: link.url, target: "_blank", rel: "noopener noreferrer", children: link.title || link.url }) }, i))
889
+ }
890
+ );
891
+ }
892
+ return /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)(
893
+ "div",
894
+ {
895
+ className: "fe-document-links",
896
+ "data-field-type": "DocumentLinks",
897
+ "data-field-state": (0, import_adapter_utils.getFieldState)({ error, required, readOnly }),
898
+ "data-testid": (0, import_adapter_utils.GetFieldDataTestId)(fieldName, programName, entityType, entityId),
899
+ children: [
900
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("ul", { className: "fe-document-links__list", children: documentLinks.map((link, i) => /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("li", { className: "fe-document-links__item", children: [
901
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("a", { href: link.url, target: "_blank", rel: "noopener noreferrer", children: link.title || link.url }),
902
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
903
+ "button",
904
+ {
905
+ type: "button",
906
+ className: "fe-document-links__delete",
907
+ onClick: () => onDeleteLink(i),
908
+ "aria-label": `${import_adapter_utils.DocumentLinksStrings.deleteLink}: ${link.title || link.url}`,
909
+ children: "\xD7"
910
+ }
911
+ )
912
+ ] }, i)) }),
913
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "fe-document-links__add", children: [
914
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
915
+ "input",
916
+ {
917
+ type: "url",
918
+ className: "fe-document-links__url-input",
919
+ placeholder: "URL",
920
+ value: newUrl,
921
+ onChange: (e) => setNewUrl(e.target.value),
922
+ "aria-label": import_adapter_utils.DocumentLinksStrings.link
923
+ }
924
+ ),
925
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
926
+ "input",
927
+ {
928
+ type: "text",
929
+ className: "fe-document-links__text-input",
930
+ placeholder: "Label (optional)",
931
+ value: newText,
932
+ onChange: (e) => setNewText(e.target.value),
933
+ "aria-label": "Link label"
934
+ }
935
+ ),
936
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(
937
+ "button",
938
+ {
939
+ type: "button",
940
+ className: "fe-btn fe-btn--secondary",
941
+ onClick: onAddLink,
942
+ disabled: !newUrl,
943
+ children: documentLinks.length > 0 ? import_adapter_utils.DocumentLinksStrings.addAnotherLink : import_adapter_utils.DocumentLinksStrings.addLink
944
+ }
945
+ )
946
+ ] })
947
+ ]
948
+ }
949
+ );
950
+ };
951
+ var DocumentLinks_default = DocumentLinks;
952
+
953
+ // src/fields/readonly/ReadOnly.tsx
954
+ var import_jsx_runtime24 = require("react/jsx-runtime");
483
955
  var ReadOnly = (props) => {
484
956
  const { fieldName, value, config } = props;
485
- return /* @__PURE__ */ (0, import_jsx_runtime14.jsx)(ReadOnlyText, { fieldName, value, ...config });
957
+ return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)(ReadOnlyText, { fieldName, value, ...config });
486
958
  };
487
959
  var ReadOnly_default = ReadOnly;
488
960
 
961
+ // src/fields/readonly/ReadOnlyArray.tsx
962
+ var import_jsx_runtime25 = require("react/jsx-runtime");
963
+ var ReadOnlyArray = (props) => {
964
+ const { fieldName, value } = props;
965
+ const items = value ?? [];
966
+ if (items.length === 0) {
967
+ return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("span", { className: "fe-read-only-text", "data-field-type": "ReadOnlyArray", children: "-" });
968
+ }
969
+ return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(
970
+ "ul",
971
+ {
972
+ className: "fe-read-only-array",
973
+ "data-field-type": "ReadOnlyArray",
974
+ "data-field-state": "readonly",
975
+ id: `${fieldName}-read-only`,
976
+ children: items.map((v, i) => /* @__PURE__ */ (0, import_jsx_runtime25.jsx)("li", { children: v }, i))
977
+ }
978
+ );
979
+ };
980
+ var ReadOnlyArray_default = ReadOnlyArray;
981
+
982
+ // src/fields/readonly/ReadOnlyDateTime.tsx
983
+ var import_jsx_runtime26 = require("react/jsx-runtime");
984
+ var ReadOnlyDateTime = (props) => {
985
+ const { config, value } = props;
986
+ if (!value) {
987
+ return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("span", { className: "fe-read-only-text", "data-field-type": "ReadOnlyDateTime", children: "-" });
988
+ }
989
+ return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)(
990
+ "time",
991
+ {
992
+ className: "fe-read-only-date-time",
993
+ dateTime: value,
994
+ "data-field-type": "ReadOnlyDateTime",
995
+ "data-field-state": "readonly",
996
+ children: (0, import_adapter_utils.formatDateTime)(value, { hideTimestamp: config?.hidetimeStamp })
997
+ }
998
+ );
999
+ };
1000
+ var ReadOnlyDateTime_default = ReadOnlyDateTime;
1001
+
1002
+ // src/fields/readonly/ReadOnlyCumulativeNumber.tsx
1003
+ var import_core20 = require("@form-eng/core");
1004
+ var import_react5 = __toESM(require("react"));
1005
+ var import_react_hook_form2 = require("react-hook-form");
1006
+ var import_jsx_runtime27 = require("react/jsx-runtime");
1007
+ var ReadOnlyCumulativeNumber = (props) => {
1008
+ const { fieldName, config } = props;
1009
+ const { formState, getValues } = (0, import_react_hook_form2.useFormContext)();
1010
+ const [value, setValue] = import_react5.default.useState();
1011
+ const { dependencyFields } = config || {};
1012
+ import_react5.default.useEffect(() => {
1013
+ const formValues = getValues();
1014
+ if (!(0, import_core20.isEmpty)(dependencyFields)) {
1015
+ let totalCount = 0;
1016
+ dependencyFields.map((fn) => {
1017
+ totalCount += Number(formValues[fn]) || 0;
1018
+ });
1019
+ setValue(totalCount);
1020
+ }
1021
+ }, [formState]);
1022
+ if (!fieldName) return null;
1023
+ return /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("span", { "data-field-type": "ReadOnlyCumulativeNumber", "data-field-state": "readonly", children: /* @__PURE__ */ (0, import_jsx_runtime27.jsx)(ReadOnlyText, { fieldName, value: String(value), ...config }) });
1024
+ };
1025
+ var ReadOnlyCumulativeNumber_default = ReadOnlyCumulativeNumber;
1026
+
1027
+ // src/fields/readonly/ReadOnlyRichText.tsx
1028
+ var import_jsx_runtime28 = require("react/jsx-runtime");
1029
+ var ReadOnlyRichText = (props) => {
1030
+ const { value } = props;
1031
+ return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(
1032
+ "div",
1033
+ {
1034
+ className: "fe-read-only-rich-text",
1035
+ "data-field-type": "ReadOnlyRichText",
1036
+ "data-field-state": "readonly",
1037
+ dangerouslySetInnerHTML: { __html: value || "" }
1038
+ }
1039
+ );
1040
+ };
1041
+ var ReadOnlyRichText_default = ReadOnlyRichText;
1042
+
1043
+ // src/fields/readonly/ReadOnlyWithButton.tsx
1044
+ var import_jsx_runtime29 = require("react/jsx-runtime");
1045
+ var ReadOnlyWithButton = (props) => {
1046
+ const { fieldName, value, config } = props;
1047
+ return /* @__PURE__ */ (0, import_jsx_runtime29.jsxs)(
1048
+ "div",
1049
+ {
1050
+ className: `fe-read-only-with-button ${config?.containerClassName ?? ""}`,
1051
+ "data-field-type": "ReadOnlyWithButton",
1052
+ "data-field-state": "readonly",
1053
+ children: [
1054
+ /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(ReadOnlyText, { fieldName, value: `${value}` }),
1055
+ config?.buttonText && /* @__PURE__ */ (0, import_jsx_runtime29.jsx)(
1056
+ "button",
1057
+ {
1058
+ type: "button",
1059
+ className: "fe-btn fe-btn--secondary",
1060
+ onClick: config.onButtonClick,
1061
+ children: config.buttonText
1062
+ }
1063
+ )
1064
+ ]
1065
+ }
1066
+ );
1067
+ };
1068
+ var ReadOnlyWithButton_default = ReadOnlyWithButton;
1069
+
489
1070
  // src/components/StatusMessage.tsx
490
- var import_core12 = require("@form-eng/core");
491
- var import_jsx_runtime15 = require("react/jsx-runtime");
1071
+ var import_core21 = require("@form-eng/core");
1072
+ var import_jsx_runtime30 = require("react/jsx-runtime");
492
1073
  var StatusMessage = (props) => {
493
1074
  const { id, error, errorCount, savePending, saving } = props;
494
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("div", { className: "fe-status-message", children: error ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { id, role: "alert", style: { color: "var(--mantine-color-red-6, #fa5252)" }, children: error.message || "Error" }) : savePending ? /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("span", { id, role: "alert", style: { color: "var(--mantine-color-orange-6, #fd7e14)" }, children: [
495
- import_core12.FormStrings.autoSavePending,
1075
+ return /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("div", { className: "fe-status-message", children: error ? /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("span", { id, role: "alert", style: { color: "var(--mantine-color-red-6, #fa5252)" }, children: error.message || "Error" }) : savePending ? /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("span", { id, role: "alert", style: { color: "var(--mantine-color-orange-6, #fd7e14)" }, children: [
1076
+ import_core21.FormStrings.autoSavePending,
496
1077
  " (",
497
1078
  errorCount,
498
1079
  " ",
499
- import_core12.FormStrings.remaining,
1080
+ import_core21.FormStrings.remaining,
500
1081
  ")"
501
- ] }) : saving ? /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { id, role: "status", style: { color: "var(--mantine-color-gray-6, #868e96)" }, children: import_core12.FormStrings.saving }) : null });
1082
+ ] }) : saving ? /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("span", { id, role: "status", style: { color: "var(--mantine-color-gray-6, #868e96)" }, children: import_core21.FormStrings.saving }) : null });
502
1083
  };
503
1084
 
504
1085
  // src/components/FormLoading.tsx
505
- var import_core13 = require("@form-eng/core");
506
- var import_jsx_runtime16 = require("react/jsx-runtime");
1086
+ var import_core22 = require("@form-eng/core");
1087
+ var import_jsx_runtime31 = require("react/jsx-runtime");
507
1088
  var FormLoading = (props) => {
508
1089
  const { loadingShimmerCount, loadingFieldShimmerHeight, inPanel, hideTitleShimmer } = props;
509
- const count = loadingShimmerCount || import_core13.FormConstants.loadingShimmerCount;
510
- const height = loadingFieldShimmerHeight || import_core13.FormConstants.loadingFieldShimmerHeight;
511
- return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
1090
+ const count = loadingShimmerCount || import_core22.FormConstants.loadingShimmerCount;
1091
+ const height = loadingFieldShimmerHeight || import_core22.FormConstants.loadingFieldShimmerHeight;
1092
+ return /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
512
1093
  "div",
513
1094
  {
514
1095
  className: `fe-form-loading ${inPanel ? "fe-form-loading--panel" : ""}`,
515
1096
  role: "status",
516
1097
  "aria-label": "Loading form",
517
- children: [...Array(count)].map((_, i) => /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { style: { marginBottom: 16 }, children: [
518
- !hideTitleShimmer && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("div", { className: "fe-skeleton", style: { width: "33%", height: 16, marginBottom: 8, background: "var(--mantine-color-gray-2, #e9ecef)", borderRadius: 4 } }),
519
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("div", { className: "fe-skeleton", style: { width: "100%", height, background: "var(--mantine-color-gray-2, #e9ecef)", borderRadius: 4 } })
1098
+ children: [...Array(count)].map((_, i) => /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("div", { style: { marginBottom: 16 }, children: [
1099
+ !hideTitleShimmer && /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("div", { className: "fe-skeleton", style: { width: "33%", height: 16, marginBottom: 8, background: "var(--mantine-color-gray-2, #e9ecef)", borderRadius: 4 } }),
1100
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("div", { className: "fe-skeleton", style: { width: "100%", height, background: "var(--mantine-color-gray-2, #e9ecef)", borderRadius: 4 } })
520
1101
  ] }, `fe-loading-${i}`))
521
1102
  }
522
1103
  );
523
1104
  };
524
1105
 
525
1106
  // src/registry.ts
526
- var import_core14 = require("@form-eng/core");
527
- var import_react2 = __toESM(require("react"));
1107
+ var import_core23 = require("@form-eng/core");
1108
+ var import_react6 = __toESM(require("react"));
528
1109
  function createMantineFieldRegistry() {
529
1110
  return {
530
- [import_core14.ComponentTypes.Textbox]: import_react2.default.createElement(Textbox_default),
531
- [import_core14.ComponentTypes.Number]: import_react2.default.createElement(Number_default),
532
- [import_core14.ComponentTypes.Toggle]: import_react2.default.createElement(Toggle_default),
533
- [import_core14.ComponentTypes.Dropdown]: import_react2.default.createElement(Dropdown_default),
534
- [import_core14.ComponentTypes.SimpleDropdown]: import_react2.default.createElement(SimpleDropdown_default),
535
- [import_core14.ComponentTypes.MultiSelect]: import_react2.default.createElement(MultiSelect_default),
536
- [import_core14.ComponentTypes.DateControl]: import_react2.default.createElement(DateControl_default),
537
- [import_core14.ComponentTypes.Slider]: import_react2.default.createElement(Slider_default),
538
- [import_core14.ComponentTypes.RadioGroup]: import_react2.default.createElement(RadioGroup_default),
539
- [import_core14.ComponentTypes.CheckboxGroup]: import_react2.default.createElement(CheckboxGroup_default),
540
- [import_core14.ComponentTypes.Textarea]: import_react2.default.createElement(Textarea_default),
541
- [import_core14.ComponentTypes.Fragment]: import_react2.default.createElement(DynamicFragment_default),
542
- [import_core14.ComponentTypes.ReadOnly]: import_react2.default.createElement(ReadOnly_default)
1111
+ [import_core23.ComponentTypes.Textbox]: import_react6.default.createElement(Textbox_default),
1112
+ [import_core23.ComponentTypes.Number]: import_react6.default.createElement(Number_default),
1113
+ [import_core23.ComponentTypes.Toggle]: import_react6.default.createElement(Toggle_default),
1114
+ [import_core23.ComponentTypes.Dropdown]: import_react6.default.createElement(Dropdown_default),
1115
+ [import_core23.ComponentTypes.SimpleDropdown]: import_react6.default.createElement(SimpleDropdown_default),
1116
+ [import_core23.ComponentTypes.MultiSelect]: import_react6.default.createElement(MultiSelect_default),
1117
+ [import_core23.ComponentTypes.DateControl]: import_react6.default.createElement(DateControl_default),
1118
+ [import_core23.ComponentTypes.Slider]: import_react6.default.createElement(Slider_default),
1119
+ [import_core23.ComponentTypes.RadioGroup]: import_react6.default.createElement(RadioGroup_default),
1120
+ [import_core23.ComponentTypes.CheckboxGroup]: import_react6.default.createElement(CheckboxGroup_default),
1121
+ [import_core23.ComponentTypes.Textarea]: import_react6.default.createElement(Textarea_default),
1122
+ [import_core23.ComponentTypes.Fragment]: import_react6.default.createElement(DynamicFragment_default),
1123
+ [import_core23.ComponentTypes.ReadOnly]: import_react6.default.createElement(ReadOnly_default),
1124
+ [import_core23.ComponentTypes.Rating]: import_react6.default.createElement(Rating_default),
1125
+ [import_core23.ComponentTypes.Autocomplete]: import_react6.default.createElement(Autocomplete_default),
1126
+ [import_core23.ComponentTypes.DateTime]: import_react6.default.createElement(DateTime_default),
1127
+ [import_core23.ComponentTypes.DateRange]: import_react6.default.createElement(DateRange_default),
1128
+ [import_core23.ComponentTypes.PhoneInput]: import_react6.default.createElement(PhoneInput_default),
1129
+ [import_core23.ComponentTypes.FileUpload]: import_react6.default.createElement(FileUpload_default),
1130
+ [import_core23.ComponentTypes.ColorPicker]: import_react6.default.createElement(ColorPicker_default),
1131
+ [import_core23.ComponentTypes.MultiSelectSearch]: import_react6.default.createElement(MultiSelectSearch_default),
1132
+ [import_core23.ComponentTypes.StatusDropdown]: import_react6.default.createElement(StatusDropdown_default),
1133
+ [import_core23.ComponentTypes.DocumentLinks]: import_react6.default.createElement(DocumentLinks_default),
1134
+ [import_core23.ComponentTypes.ReadOnlyArray]: import_react6.default.createElement(ReadOnlyArray_default),
1135
+ [import_core23.ComponentTypes.ReadOnlyDateTime]: import_react6.default.createElement(ReadOnlyDateTime_default),
1136
+ [import_core23.ComponentTypes.ReadOnlyCumulativeNumber]: import_react6.default.createElement(ReadOnlyCumulativeNumber_default),
1137
+ [import_core23.ComponentTypes.ReadOnlyRichText]: import_react6.default.createElement(ReadOnlyRichText_default),
1138
+ [import_core23.ComponentTypes.ReadOnlyWithButton]: import_react6.default.createElement(ReadOnlyWithButton_default)
543
1139
  };
544
1140
  }
545
1141
  // Annotate the CommonJS export names for ESM import in node:
546
1142
  0 && (module.exports = {
1143
+ Autocomplete,
547
1144
  CheckboxGroup,
1145
+ ColorPicker,
548
1146
  DateControl,
1147
+ DateRange,
1148
+ DateTime,
1149
+ DocumentLinks,
549
1150
  DocumentLinksStrings,
550
1151
  Dropdown,
551
1152
  DynamicFragment,
552
1153
  FieldClassName,
1154
+ FileUpload,
553
1155
  FormLoading,
554
1156
  GetFieldDataTestId,
555
1157
  MultiSelect,
1158
+ MultiSelectSearch,
556
1159
  Number,
1160
+ PhoneInput,
557
1161
  RadioGroup,
1162
+ Rating,
558
1163
  ReadOnly,
1164
+ ReadOnlyArray,
1165
+ ReadOnlyCumulativeNumber,
1166
+ ReadOnlyDateTime,
1167
+ ReadOnlyRichText,
559
1168
  ReadOnlyText,
1169
+ ReadOnlyWithButton,
560
1170
  SimpleDropdown,
561
1171
  Slider,
1172
+ StatusDropdown,
562
1173
  StatusMessage,
563
1174
  Textarea,
564
1175
  Textbox,
565
1176
  Toggle,
566
1177
  createMantineFieldRegistry,
567
- formatDateTime
1178
+ formatDateTime,
1179
+ getFieldState
568
1180
  });
569
1181
  //# sourceMappingURL=index.js.map