@form-eng/react-aria 1.5.3 → 1.6.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.
package/dist/index.js CHANGED
@@ -29,19 +29,35 @@ 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,
39
+ DocumentLinksStrings: () => import_adapter_utils.DocumentLinksStrings,
34
40
  Dropdown: () => Dropdown_default,
35
41
  DynamicFragment: () => DynamicFragment_default,
42
+ FileUpload: () => FileUpload_default,
36
43
  FormLoading: () => FormLoading,
37
44
  GetFieldDataTestId: () => import_adapter_utils.GetFieldDataTestId,
38
45
  MultiSelect: () => MultiSelect_default,
46
+ MultiSelectSearch: () => MultiSelectSearch_default,
39
47
  Number: () => Number_default,
48
+ PhoneInput: () => PhoneInput_default,
40
49
  RadioGroup: () => RadioGroup_default,
50
+ Rating: () => Rating_default,
41
51
  ReadOnly: () => ReadOnly_default,
52
+ ReadOnlyArray: () => ReadOnlyArray_default,
53
+ ReadOnlyCumulativeNumber: () => ReadOnlyCumulativeNumber_default,
54
+ ReadOnlyDateTime: () => ReadOnlyDateTime_default,
55
+ ReadOnlyRichText: () => ReadOnlyRichText_default,
42
56
  ReadOnlyText: () => ReadOnlyText,
57
+ ReadOnlyWithButton: () => ReadOnlyWithButton_default,
43
58
  SimpleDropdown: () => SimpleDropdown_default,
44
59
  Slider: () => Slider_default,
60
+ StatusDropdown: () => StatusDropdown_default,
45
61
  StatusMessage: () => StatusMessage,
46
62
  Textarea: () => Textarea_default,
47
63
  Textbox: () => Textbox_default,
@@ -648,71 +664,567 @@ var CheckboxGroup = (props) => {
648
664
  };
649
665
  var CheckboxGroup_default = CheckboxGroup;
650
666
 
651
- // src/fields/readonly/ReadOnly.tsx
667
+ // src/fields/Rating.tsx
652
668
  var import_jsx_runtime15 = require("react/jsx-runtime");
669
+ var Rating = (props) => {
670
+ const { fieldName, programName, entityType, entityId, value, readOnly, error, required, config, setFieldValue } = props;
671
+ const max = config?.max ?? 5;
672
+ const rating = value ?? 0;
673
+ if (readOnly) {
674
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(ReadOnlyText, { fieldName, value: String(rating) });
675
+ }
676
+ const stars = Array.from({ length: max }, (_, i) => i + 1);
677
+ return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
678
+ "div",
679
+ {
680
+ className: "df-rating",
681
+ role: "radiogroup",
682
+ "aria-label": `Rating, ${rating} of ${max}`,
683
+ "aria-invalid": !!error,
684
+ "aria-required": required,
685
+ "data-field-type": "Rating",
686
+ "data-field-state": (0, import_adapter_utils.getFieldState)({ error, required, readOnly }),
687
+ "data-testid": (0, import_adapter_utils.GetFieldDataTestId)(fieldName, programName, entityType, entityId),
688
+ children: stars.map((star) => /* @__PURE__ */ (0, import_jsx_runtime15.jsxs)("label", { className: "df-rating__star-label", children: [
689
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(
690
+ "input",
691
+ {
692
+ type: "radio",
693
+ className: "df-rating__input",
694
+ name: fieldName,
695
+ value: String(star),
696
+ checked: rating === star,
697
+ onChange: () => setFieldValue(fieldName, star),
698
+ "aria-label": `${star} star${star !== 1 ? "s" : ""}`
699
+ }
700
+ ),
701
+ /* @__PURE__ */ (0, import_jsx_runtime15.jsx)("span", { className: `df-rating__star${star <= rating ? " df-rating__star--filled" : ""}`, "aria-hidden": "true", children: star <= rating ? "\u2605" : "\u2606" })
702
+ ] }, star))
703
+ }
704
+ );
705
+ };
706
+ var Rating_default = Rating;
707
+
708
+ // src/fields/Autocomplete.tsx
709
+ var import_react_aria_components10 = require("react-aria-components");
710
+ var import_jsx_runtime16 = require("react/jsx-runtime");
711
+ var Autocomplete = (props) => {
712
+ const { fieldName, programName, entityType, entityId, value, readOnly, error, required, placeholder, options, setFieldValue } = props;
713
+ const selectedLabel = options?.find((o) => String(o.value) === String(value))?.label ?? value ?? "";
714
+ if (readOnly) {
715
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(ReadOnlyText, { fieldName, value: selectedLabel });
716
+ }
717
+ return /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
718
+ import_react_aria_components10.ComboBox,
719
+ {
720
+ className: "df-autocomplete",
721
+ "aria-label": fieldName,
722
+ defaultInputValue: selectedLabel,
723
+ onSelectionChange: (key) => {
724
+ if (key !== null) setFieldValue(fieldName, String(key));
725
+ },
726
+ onInputChange: (text) => {
727
+ const match = options?.find((o) => o.label.toLowerCase() === text.toLowerCase());
728
+ setFieldValue(fieldName, match ? String(match.value) : text);
729
+ },
730
+ "data-testid": (0, import_adapter_utils.GetFieldDataTestId)(fieldName, programName, entityType, entityId),
731
+ isRequired: required,
732
+ isInvalid: !!error,
733
+ children: [
734
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_react_aria_components10.Input, { className: "df-autocomplete__input", placeholder }),
735
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_react_aria_components10.Button, { className: "df-autocomplete__button", children: "\u25BC" }),
736
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_react_aria_components10.Popover, { children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_react_aria_components10.ListBox, { className: "df-autocomplete__listbox", children: options?.map((option) => /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(import_react_aria_components10.ListBoxItem, { id: String(option.value), children: option.label }, String(option.value))) }) })
737
+ ]
738
+ }
739
+ );
740
+ };
741
+ var Autocomplete_default = Autocomplete;
742
+
743
+ // src/fields/DateTime.tsx
744
+ var import_core4 = require("@form-eng/core");
745
+ var import_jsx_runtime17 = require("react/jsx-runtime");
746
+ var DateTime = (props) => {
747
+ const { fieldName, programName, entityType, entityId, value, readOnly, error, required, config, setFieldValue } = props;
748
+ const minDateTime = config?.minDateTime;
749
+ const maxDateTime = config?.maxDateTime;
750
+ if (readOnly) {
751
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(ReadOnlyText, { fieldName, value: (0, import_core4.formatDateTimeValue)(value) });
752
+ }
753
+ const onChange = (event) => {
754
+ setFieldValue(fieldName, event.target.value || null);
755
+ };
756
+ return /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
757
+ "input",
758
+ {
759
+ type: "datetime-local",
760
+ className: "df-date-time",
761
+ "data-field-type": "DateTime",
762
+ "data-field-state": (0, import_adapter_utils.getFieldState)({ error, required, readOnly }),
763
+ value: value ?? "",
764
+ min: minDateTime,
765
+ max: maxDateTime,
766
+ onChange,
767
+ "aria-invalid": !!error,
768
+ "aria-required": required,
769
+ "data-testid": (0, import_adapter_utils.GetFieldDataTestId)(fieldName, programName, entityType, entityId)
770
+ }
771
+ );
772
+ };
773
+ var DateTime_default = DateTime;
774
+
775
+ // src/fields/DateRange.tsx
776
+ var import_core5 = require("@form-eng/core");
777
+ var import_jsx_runtime18 = require("react/jsx-runtime");
778
+ var DateRange = (props) => {
779
+ const { fieldName, programName, entityType, entityId, value, readOnly, error, required, config, setFieldValue } = props;
780
+ const rangeValue = value ?? { start: "", end: "" };
781
+ const minDate = config?.minDate;
782
+ const maxDate = config?.maxDate;
783
+ const rangeError = rangeValue.start && rangeValue.end && rangeValue.start > rangeValue.end ? "Start date must be on or before end date." : void 0;
784
+ if (readOnly) {
785
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(ReadOnlyText, { fieldName, value: (0, import_core5.formatDateRange)(value) });
786
+ }
787
+ const onStartChange = (event) => {
788
+ setFieldValue(fieldName, { ...rangeValue, start: event.target.value });
789
+ };
790
+ const onEndChange = (event) => {
791
+ setFieldValue(fieldName, { ...rangeValue, end: event.target.value });
792
+ };
793
+ return /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)(
794
+ "div",
795
+ {
796
+ className: "fe-date-range",
797
+ "data-field-type": "DateRange",
798
+ "data-field-state": (0, import_adapter_utils.getFieldState)({ error, required, readOnly }),
799
+ "data-testid": (0, import_adapter_utils.GetFieldDataTestId)(fieldName, programName, entityType, entityId),
800
+ children: [
801
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "fe-date-range__inputs", children: [
802
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "fe-date-range__from", children: [
803
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("label", { htmlFor: `${fieldName}-start`, className: "fe-date-range__label", children: "From" }),
804
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
805
+ "input",
806
+ {
807
+ id: `${fieldName}-start`,
808
+ type: "date",
809
+ className: "fe-date-range__input fe-date-range__input--start",
810
+ value: rangeValue.start,
811
+ min: minDate,
812
+ max: rangeValue.end || maxDate,
813
+ onChange: onStartChange,
814
+ "aria-invalid": !!error,
815
+ "aria-required": required,
816
+ "aria-label": "Start date"
817
+ }
818
+ )
819
+ ] }),
820
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsxs)("div", { className: "fe-date-range__to", children: [
821
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("label", { htmlFor: `${fieldName}-end`, className: "fe-date-range__label", children: "To" }),
822
+ /* @__PURE__ */ (0, import_jsx_runtime18.jsx)(
823
+ "input",
824
+ {
825
+ id: `${fieldName}-end`,
826
+ type: "date",
827
+ className: "fe-date-range__input fe-date-range__input--end",
828
+ value: rangeValue.end,
829
+ min: rangeValue.start || minDate,
830
+ max: maxDate,
831
+ onChange: onEndChange,
832
+ "aria-label": "End date"
833
+ }
834
+ )
835
+ ] })
836
+ ] }),
837
+ rangeError && /* @__PURE__ */ (0, import_jsx_runtime18.jsx)("span", { className: "fe-date-range__range-error", role: "alert", children: rangeError })
838
+ ]
839
+ }
840
+ );
841
+ };
842
+ var DateRange_default = DateRange;
843
+
844
+ // src/fields/PhoneInput.tsx
845
+ var import_core6 = require("@form-eng/core");
846
+ var import_jsx_runtime19 = require("react/jsx-runtime");
847
+ var PhoneInput = (props) => {
848
+ const { fieldName, programName, entityType, entityId, value, readOnly, error, required, config, setFieldValue } = props;
849
+ const format = config?.format ?? "us";
850
+ if (readOnly) {
851
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(ReadOnlyText, { fieldName, value: value ?? "" });
852
+ }
853
+ const onChange = (event) => {
854
+ const digits = (0, import_core6.extractDigits)(event.target.value);
855
+ const formatted = (0, import_core6.formatPhone)(digits, format);
856
+ setFieldValue(fieldName, formatted);
857
+ };
858
+ return /* @__PURE__ */ (0, import_jsx_runtime19.jsx)(
859
+ "input",
860
+ {
861
+ type: "tel",
862
+ className: "fe-phone-input",
863
+ "data-field-type": "PhoneInput",
864
+ "data-field-state": (0, import_adapter_utils.getFieldState)({ error, required, readOnly }),
865
+ value: value ?? "",
866
+ onChange,
867
+ "aria-invalid": !!error,
868
+ "aria-required": required,
869
+ "data-testid": (0, import_adapter_utils.GetFieldDataTestId)(fieldName, programName, entityType, entityId)
870
+ }
871
+ );
872
+ };
873
+ var PhoneInput_default = PhoneInput;
874
+
875
+ // src/fields/FileUpload.tsx
876
+ var import_core7 = require("@form-eng/core");
877
+ var import_react3 = __toESM(require("react"));
878
+ var import_jsx_runtime20 = require("react/jsx-runtime");
879
+ var FileUpload = (props) => {
880
+ const { fieldName, programName, entityType, entityId, value, readOnly, error, required, config, setFieldValue } = props;
881
+ const inputRef = (0, import_react3.useRef)(null);
882
+ const multiple = config?.multiple ?? false;
883
+ const accept = config?.accept;
884
+ const maxSizeMb = config?.maxSizeMb ?? import_core7.MAX_FILE_SIZE_MB_DEFAULT;
885
+ const maxSizeBytes = maxSizeMb * 1024 * 1024;
886
+ const [sizeError, setSizeError] = import_react3.default.useState(void 0);
887
+ if (readOnly) {
888
+ return /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(ReadOnlyText, { fieldName, value: (0, import_core7.getFileNames)(value) });
889
+ }
890
+ const onChange = (event) => {
891
+ const files = event.target.files;
892
+ if (!files || files.length === 0) {
893
+ setFieldValue(fieldName, null);
894
+ setSizeError(void 0);
895
+ return;
896
+ }
897
+ const oversized = Array.from(files).find((f) => f.size > maxSizeBytes);
898
+ if (oversized) {
899
+ setSizeError(`"${oversized.name}" exceeds the ${maxSizeMb} MB size limit.`);
900
+ event.target.value = "";
901
+ setFieldValue(fieldName, null);
902
+ return;
903
+ }
904
+ setSizeError(void 0);
905
+ setFieldValue(fieldName, multiple ? Array.from(files) : files[0]);
906
+ };
907
+ const fileNames = (0, import_core7.getFileNames)(value);
908
+ return /* @__PURE__ */ (0, import_jsx_runtime20.jsxs)(
909
+ "div",
910
+ {
911
+ className: "fe-file-upload",
912
+ "data-field-type": "FileUpload",
913
+ "data-field-state": (0, import_adapter_utils.getFieldState)({ error, required, readOnly }),
914
+ "data-testid": (0, import_adapter_utils.GetFieldDataTestId)(fieldName, programName, entityType, entityId),
915
+ children: [
916
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
917
+ "input",
918
+ {
919
+ ref: inputRef,
920
+ type: "file",
921
+ className: "fe-file-upload__input",
922
+ multiple,
923
+ accept,
924
+ onChange,
925
+ "aria-invalid": !!error,
926
+ "aria-required": required,
927
+ style: { display: "none" },
928
+ "aria-hidden": "true"
929
+ }
930
+ ),
931
+ /* @__PURE__ */ (0, import_jsx_runtime20.jsx)(
932
+ "button",
933
+ {
934
+ type: "button",
935
+ className: "fe-file-upload__button",
936
+ onClick: () => inputRef.current?.click(),
937
+ children: fileNames ? "Change file" : "Choose file"
938
+ }
939
+ ),
940
+ fileNames && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("span", { className: "fe-file-upload__filenames", children: fileNames }),
941
+ sizeError && /* @__PURE__ */ (0, import_jsx_runtime20.jsx)("span", { className: "fe-file-upload__size-error", role: "alert", children: sizeError })
942
+ ]
943
+ }
944
+ );
945
+ };
946
+ var FileUpload_default = FileUpload;
947
+
948
+ // src/fields/ColorPicker.tsx
949
+ var import_jsx_runtime21 = require("react/jsx-runtime");
950
+ var ColorPicker = (props) => {
951
+ const { fieldName, programName, entityType, entityId, value, readOnly, error, required, setFieldValue } = props;
952
+ const color = value ?? "#000000";
953
+ const onChange = (event) => {
954
+ setFieldValue(fieldName, event.target.value);
955
+ };
956
+ if (readOnly) {
957
+ return /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(ReadOnlyText, { fieldName, value: color });
958
+ }
959
+ return /* @__PURE__ */ (0, import_jsx_runtime21.jsxs)("div", { className: "fe-color-picker", "data-field-type": "ColorPicker", "data-field-state": (0, import_adapter_utils.getFieldState)({ error, required, readOnly }), style: { display: "flex", alignItems: "center", gap: "8px" }, children: [
960
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("input", { type: "color", className: "fe-color-picker__input", value: color, onChange, "aria-invalid": !!error, "aria-required": required, "data-testid": (0, import_adapter_utils.GetFieldDataTestId)(fieldName, programName, entityType, entityId) }),
961
+ /* @__PURE__ */ (0, import_jsx_runtime21.jsx)("span", { className: "fe-color-picker__value", children: color })
962
+ ] });
963
+ };
964
+ var ColorPicker_default = ColorPicker;
965
+
966
+ // src/fields/MultiSelectSearch.tsx
967
+ var import_react4 = require("react");
968
+ var import_jsx_runtime22 = require("react/jsx-runtime");
969
+ var MultiSelectSearch = (props) => {
970
+ const { fieldName, programName, entityType, entityId, value, readOnly, error, required, options, setFieldValue } = props;
971
+ const [searchTerm, setSearchTerm] = (0, import_react4.useState)("");
972
+ const selectedValues = value ?? [];
973
+ const filteredOptions = (0, import_react4.useMemo)(() => {
974
+ if (!searchTerm) return options ?? [];
975
+ const lower = searchTerm.toLowerCase();
976
+ return (options ?? []).filter((o) => o.label.toLowerCase().includes(lower));
977
+ }, [options, searchTerm]);
978
+ const onCheckChange = (optionValue, checked) => {
979
+ const updated = checked ? [...selectedValues, optionValue] : selectedValues.filter((v) => v !== optionValue);
980
+ setFieldValue(fieldName, updated, false, 3e3);
981
+ };
982
+ if (readOnly) {
983
+ return selectedValues.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime22.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_runtime22.jsx)("li", { children: v }, i)) }) : /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("span", { className: "fe-read-only-text", children: "-" });
984
+ }
985
+ return /* @__PURE__ */ (0, import_jsx_runtime22.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: [
986
+ /* @__PURE__ */ (0, import_jsx_runtime22.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}` }),
987
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("fieldset", { className: "fe-multi-select-search__options", "aria-invalid": !!error, "aria-required": required, children: [
988
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("legend", { className: "fe-sr-only", children: "Options" }),
989
+ filteredOptions.map((option) => {
990
+ const optVal = String(option.value);
991
+ const isChecked = selectedValues.includes(optVal);
992
+ return /* @__PURE__ */ (0, import_jsx_runtime22.jsxs)("label", { className: "fe-multi-select-search__option", children: [
993
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("input", { type: "checkbox", checked: isChecked, disabled: option.disabled, onChange: (e) => onCheckChange(optVal, e.target.checked) }),
994
+ /* @__PURE__ */ (0, import_jsx_runtime22.jsx)("span", { children: option.label })
995
+ ] }, optVal);
996
+ })
997
+ ] })
998
+ ] });
999
+ };
1000
+ var MultiSelectSearch_default = MultiSelectSearch;
1001
+
1002
+ // src/fields/StatusDropdown.tsx
1003
+ var import_jsx_runtime23 = require("react/jsx-runtime");
1004
+ var StatusDropdown = (props) => {
1005
+ const { fieldName, programName, entityType, entityId, value, readOnly, error, required, config, options, placeholder, setFieldValue } = props;
1006
+ const onChange = (event) => {
1007
+ setFieldValue(fieldName, event.target.value);
1008
+ };
1009
+ const statusColor = config?.statusColors?.[value];
1010
+ if (readOnly) {
1011
+ return /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "fe-status-dropdown fe-status-dropdown--readonly", "data-field-type": "StatusDropdown", "data-field-state": "readonly", children: [
1012
+ statusColor && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("span", { className: "fe-status-dropdown__indicator", style: { backgroundColor: statusColor }, "aria-hidden": "true" }),
1013
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)(ReadOnlyText, { fieldName, value })
1014
+ ] });
1015
+ }
1016
+ return /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("div", { className: "fe-status-dropdown", "data-field-type": "StatusDropdown", "data-field-state": (0, import_adapter_utils.getFieldState)({ error, required, readOnly }), children: [
1017
+ statusColor && /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("span", { className: "fe-status-dropdown__indicator", style: { backgroundColor: statusColor }, "aria-hidden": "true" }),
1018
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsxs)("select", { className: "fe-status-dropdown__select", value: value ?? "", onChange, "aria-invalid": !!error, "aria-required": required, "data-testid": (0, import_adapter_utils.GetFieldDataTestId)(fieldName, programName, entityType, entityId), children: [
1019
+ /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("option", { value: "", children: placeholder ?? config?.placeHolder ?? "" }),
1020
+ options?.map((option) => /* @__PURE__ */ (0, import_jsx_runtime23.jsx)("option", { value: String(option.value), disabled: option.disabled, children: option.label }, String(option.value)))
1021
+ ] })
1022
+ ] });
1023
+ };
1024
+ var StatusDropdown_default = StatusDropdown;
1025
+
1026
+ // src/fields/DocumentLinks.tsx
1027
+ var import_react5 = require("react");
1028
+ var import_react_hook_form = require("react-hook-form");
1029
+ var import_jsx_runtime24 = require("react/jsx-runtime");
1030
+ var DocumentLinks = (props) => {
1031
+ const { fieldName, programName, entityType, entityId, value, readOnly, error, required, setFieldValue } = props;
1032
+ const { watch } = (0, import_react_hook_form.useFormContext)();
1033
+ const documentLinks = watch(`${fieldName}`) ?? [];
1034
+ const [newUrl, setNewUrl] = (0, import_react5.useState)("");
1035
+ const [newText, setNewText] = (0, import_react5.useState)("");
1036
+ const onAddLink = () => {
1037
+ if (!newUrl) return;
1038
+ const link = { url: newUrl, title: newText || newUrl };
1039
+ setFieldValue(fieldName, [...documentLinks, link]);
1040
+ setNewUrl("");
1041
+ setNewText("");
1042
+ };
1043
+ const onDeleteLink = (index) => {
1044
+ const updated = [...documentLinks];
1045
+ updated.splice(index, 1);
1046
+ setFieldValue(fieldName, updated);
1047
+ };
1048
+ if (readOnly) {
1049
+ return /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("ul", { className: "fe-document-links fe-document-links--readonly", "data-field-type": "DocumentLinks", "data-field-state": "readonly", children: value?.map((link, i) => /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("li", { className: "fe-document-links__item", children: /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("a", { href: link.url, target: "_blank", rel: "noopener noreferrer", children: link.title || link.url }) }, i)) });
1050
+ }
1051
+ return /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "fe-document-links", "data-field-type": "DocumentLinks", "data-field-state": (0, import_adapter_utils.getFieldState)({ error, required, readOnly }), "data-testid": (0, import_adapter_utils.GetFieldDataTestId)(fieldName, programName, entityType, entityId), children: [
1052
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("ul", { className: "fe-document-links__list", children: documentLinks.map((link, i) => /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("li", { className: "fe-document-links__item", children: [
1053
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("a", { href: link.url, target: "_blank", rel: "noopener noreferrer", children: link.title || link.url }),
1054
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("button", { type: "button", className: "fe-document-links__delete", onClick: () => onDeleteLink(i), "aria-label": `${import_adapter_utils.DocumentLinksStrings.deleteLink}: ${link.title || link.url}`, children: "\xD7" })
1055
+ ] }, i)) }),
1056
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsxs)("div", { className: "fe-document-links__add", children: [
1057
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("input", { type: "url", className: "fe-document-links__url-input", placeholder: "URL", value: newUrl, onChange: (e) => setNewUrl(e.target.value), "aria-label": import_adapter_utils.DocumentLinksStrings.link }),
1058
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("input", { type: "text", className: "fe-document-links__text-input", placeholder: "Label (optional)", value: newText, onChange: (e) => setNewText(e.target.value), "aria-label": "Link label" }),
1059
+ /* @__PURE__ */ (0, import_jsx_runtime24.jsx)("button", { type: "button", className: "fe-btn fe-btn--secondary", onClick: onAddLink, disabled: !newUrl, children: documentLinks.length > 0 ? import_adapter_utils.DocumentLinksStrings.addAnotherLink : import_adapter_utils.DocumentLinksStrings.addLink })
1060
+ ] })
1061
+ ] });
1062
+ };
1063
+ var DocumentLinks_default = DocumentLinks;
1064
+
1065
+ // src/fields/readonly/ReadOnly.tsx
1066
+ var import_jsx_runtime25 = require("react/jsx-runtime");
653
1067
  var ReadOnly = (props) => {
654
1068
  const { fieldName, value, config } = props;
655
- return /* @__PURE__ */ (0, import_jsx_runtime15.jsx)(ReadOnlyText, { fieldName, value, ...config });
1069
+ return /* @__PURE__ */ (0, import_jsx_runtime25.jsx)(ReadOnlyText, { fieldName, value, ...config });
656
1070
  };
657
1071
  var ReadOnly_default = ReadOnly;
658
1072
 
1073
+ // src/fields/readonly/ReadOnlyArray.tsx
1074
+ var import_jsx_runtime26 = require("react/jsx-runtime");
1075
+ var ReadOnlyArray = (props) => {
1076
+ const { fieldName, value } = props;
1077
+ const items = value ?? [];
1078
+ if (items.length === 0) {
1079
+ return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("span", { className: "fe-read-only-text", "data-field-type": "ReadOnlyArray", children: "-" });
1080
+ }
1081
+ return /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("ul", { className: "fe-read-only-array", "data-field-type": "ReadOnlyArray", "data-field-state": "readonly", id: `${fieldName}-read-only`, children: items.map((v, i) => /* @__PURE__ */ (0, import_jsx_runtime26.jsx)("li", { children: v }, i)) });
1082
+ };
1083
+ var ReadOnlyArray_default = ReadOnlyArray;
1084
+
1085
+ // src/fields/readonly/ReadOnlyDateTime.tsx
1086
+ var import_jsx_runtime27 = require("react/jsx-runtime");
1087
+ var ReadOnlyDateTime = (props) => {
1088
+ const { config, value } = props;
1089
+ if (!value) {
1090
+ return /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("span", { className: "fe-read-only-text", "data-field-type": "ReadOnlyDateTime", children: "-" });
1091
+ }
1092
+ return /* @__PURE__ */ (0, import_jsx_runtime27.jsx)("time", { className: "fe-read-only-date-time", dateTime: value, "data-field-type": "ReadOnlyDateTime", "data-field-state": "readonly", children: (0, import_adapter_utils.formatDateTime)(value, { hideTimestamp: config?.hidetimeStamp }) });
1093
+ };
1094
+ var ReadOnlyDateTime_default = ReadOnlyDateTime;
1095
+
1096
+ // src/fields/readonly/ReadOnlyCumulativeNumber.tsx
1097
+ var import_core8 = require("@form-eng/core");
1098
+ var import_react6 = __toESM(require("react"));
1099
+ var import_react_hook_form2 = require("react-hook-form");
1100
+ var import_jsx_runtime28 = require("react/jsx-runtime");
1101
+ var ReadOnlyCumulativeNumber = (props) => {
1102
+ const { fieldName, config } = props;
1103
+ const { formState, getValues } = (0, import_react_hook_form2.useFormContext)();
1104
+ const [value, setValue] = import_react6.default.useState();
1105
+ const { dependencyFields } = config || {};
1106
+ import_react6.default.useEffect(() => {
1107
+ const formValues = getValues();
1108
+ if (!(0, import_core8.isEmpty)(dependencyFields)) {
1109
+ let totalCount = 0;
1110
+ dependencyFields.map((fn) => {
1111
+ totalCount += Number(formValues[fn]) || 0;
1112
+ });
1113
+ setValue(totalCount);
1114
+ }
1115
+ }, [formState]);
1116
+ if (!fieldName) return null;
1117
+ return /* @__PURE__ */ (0, import_jsx_runtime28.jsx)("span", { "data-field-type": "ReadOnlyCumulativeNumber", "data-field-state": "readonly", children: /* @__PURE__ */ (0, import_jsx_runtime28.jsx)(ReadOnlyText, { fieldName, value: String(value), ...config }) });
1118
+ };
1119
+ var ReadOnlyCumulativeNumber_default = ReadOnlyCumulativeNumber;
1120
+
1121
+ // src/fields/readonly/ReadOnlyRichText.tsx
1122
+ var import_jsx_runtime29 = require("react/jsx-runtime");
1123
+ var ReadOnlyRichText = (props) => {
1124
+ const { value } = props;
1125
+ return /* @__PURE__ */ (0, import_jsx_runtime29.jsx)("div", { className: "fe-read-only-rich-text", "data-field-type": "ReadOnlyRichText", "data-field-state": "readonly", dangerouslySetInnerHTML: { __html: value || "" } });
1126
+ };
1127
+ var ReadOnlyRichText_default = ReadOnlyRichText;
1128
+
1129
+ // src/fields/readonly/ReadOnlyWithButton.tsx
1130
+ var import_jsx_runtime30 = require("react/jsx-runtime");
1131
+ var ReadOnlyWithButton = (props) => {
1132
+ const { fieldName, value, config } = props;
1133
+ return /* @__PURE__ */ (0, import_jsx_runtime30.jsxs)("div", { className: `fe-read-only-with-button ${config?.containerClassName ?? ""}`, "data-field-type": "ReadOnlyWithButton", "data-field-state": "readonly", children: [
1134
+ /* @__PURE__ */ (0, import_jsx_runtime30.jsx)(ReadOnlyText, { fieldName, value: `${value}` }),
1135
+ config?.buttonText && /* @__PURE__ */ (0, import_jsx_runtime30.jsx)("button", { type: "button", className: "fe-btn fe-btn--secondary", onClick: config.onButtonClick, children: config.buttonText })
1136
+ ] });
1137
+ };
1138
+ var ReadOnlyWithButton_default = ReadOnlyWithButton;
1139
+
659
1140
  // src/components/FormLoading.tsx
660
- var import_core4 = require("@form-eng/core");
661
- var import_jsx_runtime16 = require("react/jsx-runtime");
1141
+ var import_core9 = require("@form-eng/core");
1142
+ var import_jsx_runtime31 = require("react/jsx-runtime");
662
1143
  var FormLoading = (props) => {
663
1144
  const { loadingShimmerCount, loadingFieldShimmerHeight, inPanel, hideTitleShimmer } = props;
664
- const count = loadingShimmerCount || import_core4.FormConstants.loadingShimmerCount;
665
- const height = loadingFieldShimmerHeight || import_core4.FormConstants.loadingFieldShimmerHeight;
666
- return /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
1145
+ const count = loadingShimmerCount || import_core9.FormConstants.loadingShimmerCount;
1146
+ const height = loadingFieldShimmerHeight || import_core9.FormConstants.loadingFieldShimmerHeight;
1147
+ return /* @__PURE__ */ (0, import_jsx_runtime31.jsx)(
667
1148
  "div",
668
1149
  {
669
1150
  className: `df-form-loading ${inPanel ? "df-form-loading--panel" : ""}`,
670
1151
  "data-field-type": "FormLoading",
671
1152
  role: "status",
672
1153
  "aria-label": "Loading form",
673
- children: [...Array(count)].map((_, i) => /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { className: "df-form-loading__field", children: [
674
- !hideTitleShimmer && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("div", { className: "df-skeleton df-skeleton--label", style: { width: "33%" } }),
675
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)("div", { className: "df-skeleton df-skeleton--input", style: { height: `${height}px` } })
1154
+ children: [...Array(count)].map((_, i) => /* @__PURE__ */ (0, import_jsx_runtime31.jsxs)("div", { className: "df-form-loading__field", children: [
1155
+ !hideTitleShimmer && /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("div", { className: "df-skeleton df-skeleton--label", style: { width: "33%" } }),
1156
+ /* @__PURE__ */ (0, import_jsx_runtime31.jsx)("div", { className: "df-skeleton df-skeleton--input", style: { height: `${height}px` } })
676
1157
  ] }, `df-loading-${i}`))
677
1158
  }
678
1159
  );
679
1160
  };
680
1161
 
681
1162
  // src/registry.ts
682
- var import_core5 = require("@form-eng/core");
683
- var import_react3 = __toESM(require("react"));
1163
+ var import_core10 = require("@form-eng/core");
1164
+ var import_react7 = __toESM(require("react"));
684
1165
  function createReactAriaFieldRegistry() {
685
1166
  return {
686
- [import_core5.ComponentTypes.Textbox]: import_react3.default.createElement(Textbox_default),
687
- [import_core5.ComponentTypes.Number]: import_react3.default.createElement(Number_default),
688
- [import_core5.ComponentTypes.Toggle]: import_react3.default.createElement(Toggle_default),
689
- [import_core5.ComponentTypes.Dropdown]: import_react3.default.createElement(Dropdown_default),
690
- [import_core5.ComponentTypes.MultiSelect]: import_react3.default.createElement(MultiSelect_default),
691
- [import_core5.ComponentTypes.DateControl]: import_react3.default.createElement(DateControl_default),
692
- [import_core5.ComponentTypes.Slider]: import_react3.default.createElement(Slider_default),
693
- [import_core5.ComponentTypes.Fragment]: import_react3.default.createElement(DynamicFragment_default),
694
- [import_core5.ComponentTypes.SimpleDropdown]: import_react3.default.createElement(SimpleDropdown_default),
695
- [import_core5.ComponentTypes.Textarea]: import_react3.default.createElement(Textarea_default),
696
- [import_core5.ComponentTypes.RadioGroup]: import_react3.default.createElement(RadioGroup_default),
697
- [import_core5.ComponentTypes.CheckboxGroup]: import_react3.default.createElement(CheckboxGroup_default),
698
- [import_core5.ComponentTypes.ReadOnly]: import_react3.default.createElement(ReadOnly_default)
1167
+ [import_core10.ComponentTypes.Textbox]: import_react7.default.createElement(Textbox_default),
1168
+ [import_core10.ComponentTypes.Number]: import_react7.default.createElement(Number_default),
1169
+ [import_core10.ComponentTypes.Toggle]: import_react7.default.createElement(Toggle_default),
1170
+ [import_core10.ComponentTypes.Dropdown]: import_react7.default.createElement(Dropdown_default),
1171
+ [import_core10.ComponentTypes.MultiSelect]: import_react7.default.createElement(MultiSelect_default),
1172
+ [import_core10.ComponentTypes.DateControl]: import_react7.default.createElement(DateControl_default),
1173
+ [import_core10.ComponentTypes.Slider]: import_react7.default.createElement(Slider_default),
1174
+ [import_core10.ComponentTypes.Fragment]: import_react7.default.createElement(DynamicFragment_default),
1175
+ [import_core10.ComponentTypes.SimpleDropdown]: import_react7.default.createElement(SimpleDropdown_default),
1176
+ [import_core10.ComponentTypes.Textarea]: import_react7.default.createElement(Textarea_default),
1177
+ [import_core10.ComponentTypes.RadioGroup]: import_react7.default.createElement(RadioGroup_default),
1178
+ [import_core10.ComponentTypes.CheckboxGroup]: import_react7.default.createElement(CheckboxGroup_default),
1179
+ [import_core10.ComponentTypes.Rating]: import_react7.default.createElement(Rating_default),
1180
+ [import_core10.ComponentTypes.Autocomplete]: import_react7.default.createElement(Autocomplete_default),
1181
+ [import_core10.ComponentTypes.DateTime]: import_react7.default.createElement(DateTime_default),
1182
+ [import_core10.ComponentTypes.DateRange]: import_react7.default.createElement(DateRange_default),
1183
+ [import_core10.ComponentTypes.PhoneInput]: import_react7.default.createElement(PhoneInput_default),
1184
+ [import_core10.ComponentTypes.FileUpload]: import_react7.default.createElement(FileUpload_default),
1185
+ [import_core10.ComponentTypes.ReadOnly]: import_react7.default.createElement(ReadOnly_default),
1186
+ [import_core10.ComponentTypes.ColorPicker]: import_react7.default.createElement(ColorPicker_default),
1187
+ [import_core10.ComponentTypes.MultiSelectSearch]: import_react7.default.createElement(MultiSelectSearch_default),
1188
+ [import_core10.ComponentTypes.StatusDropdown]: import_react7.default.createElement(StatusDropdown_default),
1189
+ [import_core10.ComponentTypes.DocumentLinks]: import_react7.default.createElement(DocumentLinks_default),
1190
+ [import_core10.ComponentTypes.ReadOnlyArray]: import_react7.default.createElement(ReadOnlyArray_default),
1191
+ [import_core10.ComponentTypes.ReadOnlyDateTime]: import_react7.default.createElement(ReadOnlyDateTime_default),
1192
+ [import_core10.ComponentTypes.ReadOnlyCumulativeNumber]: import_react7.default.createElement(ReadOnlyCumulativeNumber_default),
1193
+ [import_core10.ComponentTypes.ReadOnlyRichText]: import_react7.default.createElement(ReadOnlyRichText_default),
1194
+ [import_core10.ComponentTypes.ReadOnlyWithButton]: import_react7.default.createElement(ReadOnlyWithButton_default)
699
1195
  };
700
1196
  }
701
1197
  // Annotate the CommonJS export names for ESM import in node:
702
1198
  0 && (module.exports = {
1199
+ Autocomplete,
703
1200
  CheckboxGroup,
1201
+ ColorPicker,
704
1202
  DateControl,
1203
+ DateRange,
1204
+ DateTime,
1205
+ DocumentLinks,
1206
+ DocumentLinksStrings,
705
1207
  Dropdown,
706
1208
  DynamicFragment,
1209
+ FileUpload,
707
1210
  FormLoading,
708
1211
  GetFieldDataTestId,
709
1212
  MultiSelect,
1213
+ MultiSelectSearch,
710
1214
  Number,
1215
+ PhoneInput,
711
1216
  RadioGroup,
1217
+ Rating,
712
1218
  ReadOnly,
1219
+ ReadOnlyArray,
1220
+ ReadOnlyCumulativeNumber,
1221
+ ReadOnlyDateTime,
1222
+ ReadOnlyRichText,
713
1223
  ReadOnlyText,
1224
+ ReadOnlyWithButton,
714
1225
  SimpleDropdown,
715
1226
  Slider,
1227
+ StatusDropdown,
716
1228
  StatusMessage,
717
1229
  Textarea,
718
1230
  Textbox,