@addsign/moje-agenda-shared-lib 0.0.29 → 0.0.32

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.
Files changed (44) hide show
  1. package/dist/assets/tailwind.css +1484 -1
  2. package/dist/components/Button.js +23 -20
  3. package/dist/components/Button.js.map +1 -0
  4. package/dist/components/Calendar.d.ts +1 -1
  5. package/dist/components/Calendar.js +91 -57
  6. package/dist/components/Calendar.js.map +1 -0
  7. package/dist/components/ConfirmationModalDialog.js +52 -47
  8. package/dist/components/ConfirmationModalDialog.js.map +1 -0
  9. package/dist/components/DataTable.js +211 -145
  10. package/dist/components/DataTable.js.map +1 -0
  11. package/dist/components/Spinner.js +9 -8
  12. package/dist/components/Spinner.js.map +1 -0
  13. package/dist/components/form/AutocompleteSearchBar.js +323 -239
  14. package/dist/components/form/AutocompleteSearchBar.js.map +1 -0
  15. package/dist/components/form/FormField.js +171 -142
  16. package/dist/components/form/FormField.js.map +1 -0
  17. package/dist/components/form/PositionsSelectorSingle.js +143 -113
  18. package/dist/components/form/PositionsSelectorSingle.js.map +1 -0
  19. package/dist/components/layout/PageTitle.js +9 -8
  20. package/dist/components/layout/PageTitle.js.map +1 -0
  21. package/dist/components/layout/SectionTitle.js +9 -8
  22. package/dist/components/layout/SectionTitle.js.map +1 -0
  23. package/dist/contexts/FederationContext.js +12 -8
  24. package/dist/contexts/FederationContext.js.map +1 -0
  25. package/dist/contexts/useFederationContext.js +5 -4
  26. package/dist/contexts/useFederationContext.js.map +1 -0
  27. package/dist/iconBase-BY_L6Cb_.js +144 -0
  28. package/dist/iconBase-BY_L6Cb_.js.map +1 -0
  29. package/dist/index-C0yNf1cc.js +48 -0
  30. package/dist/index-C0yNf1cc.js.map +1 -0
  31. package/dist/main.d.ts +1 -0
  32. package/dist/main.js +31 -28
  33. package/dist/main.js.map +1 -0
  34. package/dist/types.d.ts +31 -0
  35. package/dist/types.js +1 -0
  36. package/dist/types.js.map +1 -0
  37. package/dist/utils/getFullName.js +9 -3
  38. package/dist/utils/getFullName.js.map +1 -0
  39. package/dist/utils/getIntersectingDays.d.ts +4 -0
  40. package/dist/utils/getIntersectingDays.js +22 -0
  41. package/dist/utils/getIntersectingDays.js.map +1 -0
  42. package/package.json +1 -1
  43. package/dist/iconBase-DkR9t2l_.js +0 -117
  44. package/dist/index-CO5g84CR.js +0 -47
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AutocompleteSearchBar.js","sources":["../../../node_modules/react-use/esm/misc/util.js","../../../node_modules/react-use/esm/useClickAway.js","../../../lib/components/form/AutocompleteSearchBar.tsx"],"sourcesContent":["export var noop = function () { };\nexport function on(obj) {\n var args = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n args[_i - 1] = arguments[_i];\n }\n if (obj && obj.addEventListener) {\n obj.addEventListener.apply(obj, args);\n }\n}\nexport function off(obj) {\n var args = [];\n for (var _i = 1; _i < arguments.length; _i++) {\n args[_i - 1] = arguments[_i];\n }\n if (obj && obj.removeEventListener) {\n obj.removeEventListener.apply(obj, args);\n }\n}\nexport var isBrowser = typeof window !== 'undefined';\nexport var isNavigator = typeof navigator !== 'undefined';\n","import { useEffect, useRef } from 'react';\nimport { off, on } from './misc/util';\nvar defaultEvents = ['mousedown', 'touchstart'];\nvar useClickAway = function (ref, onClickAway, events) {\n if (events === void 0) { events = defaultEvents; }\n var savedCallback = useRef(onClickAway);\n useEffect(function () {\n savedCallback.current = onClickAway;\n }, [onClickAway]);\n useEffect(function () {\n var handler = function (event) {\n var el = ref.current;\n el && !el.contains(event.target) && savedCallback.current(event);\n };\n for (var _i = 0, events_1 = events; _i < events_1.length; _i++) {\n var eventName = events_1[_i];\n on(document, eventName, handler);\n }\n return function () {\n for (var _i = 0, events_2 = events; _i < events_2.length; _i++) {\n var eventName = events_2[_i];\n off(document, eventName, handler);\n }\n };\n }, [events, ref]);\n};\nexport default useClickAway;\n","import { useState, useEffect, useRef } from \"react\";\r\nimport { useClickAway } from \"react-use\";\r\nimport { IOptionItem, useFederationContext } from \"../../main\";\r\nimport { MdClose, MdExpandLess, MdExpandMore } from \"react-icons/md\";\r\n\r\ninterface OptionListProps {\r\n options: IOptionItem[];\r\n selectedOptionIndex: number;\r\n handleOptionClick: (option: IOptionItem) => void;\r\n}\r\n\r\ninterface SearchInputProps {\r\n value: string;\r\n onChange: (event: React.ChangeEvent<HTMLInputElement>) => void;\r\n onKeyDown: (event: React.KeyboardEvent<HTMLInputElement>) => void;\r\n onFocus: () => void;\r\n clearQuery: () => void;\r\n inputRef: React.RefObject<HTMLInputElement>;\r\n placeholder?: string;\r\n isFocused?: boolean;\r\n onBlur: () => void;\r\n isLoading?: boolean;\r\n}\r\n\r\nconst AutocompleteSearchBar: React.FC<{\r\n label: string;\r\n name: string;\r\n required?: boolean;\r\n disabled?: boolean;\r\n description?: string;\r\n fetchUrl?: string;\r\n valueKey: string;\r\n labelKey: string;\r\n onChange: (value: any) => void;\r\n onFocus: () => void;\r\n onBlur: () => void;\r\n placeholder?: string;\r\n serverSearch?: boolean;\r\n value?: string;\r\n initOptions?: IOptionItem[];\r\n showId?: boolean;\r\n}> = ({\r\n label,\r\n name,\r\n required,\r\n disabled,\r\n description,\r\n fetchUrl,\r\n valueKey,\r\n labelKey,\r\n onChange,\r\n onFocus,\r\n onBlur,\r\n placeholder,\r\n serverSearch = false,\r\n value,\r\n initOptions,\r\n showId,\r\n}) => {\r\n const [query, setQuery] = useState(\"\");\r\n const [loading, setLoading] = useState(false);\r\n const [options, setOptions] = useState<IOptionItem[]>([]);\r\n const [selectedOptionIndex, setSelectedOptionIndex] = useState(-1);\r\n const [selectedOption, setSelectedOption] = useState<IOptionItem | null>(\r\n null\r\n );\r\n const [searchResults, setSearchResults] = useState<IOptionItem[]>([]);\r\n const inputRef = useRef<HTMLInputElement>(null);\r\n const ref = useRef(null);\r\n const federationContext = useFederationContext();\r\n\r\n const [isFocused, setIsFocused] = useState(false);\r\n\r\n const [errors] = useState<any>({});\r\n\r\n useEffect(() => {\r\n const fetchOptions = async () => {\r\n setLoading(true);\r\n console.log(\r\n \"%csrcsharedAutocompleteSearchBar.tsx:77 fetchUrl, value\",\r\n \"color: #007acc;\",\r\n fetchUrl\r\n );\r\n const { data } = await federationContext.apiClient.get(fetchUrl || \"\");\r\n // osetreni obou variant navratu z BE\r\n const tmpData = data.content || data;\r\n\r\n setOptions(\r\n tmpData.map((item: any) => ({\r\n value: item[valueKey],\r\n label: item[labelKey] + (showId ? \" (\" + item[valueKey] + \")\" : \"\"),\r\n }))\r\n ); // Adjust map according to actual API response\r\n setLoading(false);\r\n };\r\n\r\n if (fetchUrl) fetchOptions();\r\n }, [fetchUrl]);\r\n\r\n useEffect(() => {\r\n if (initOptions) setOptions(initOptions);\r\n }, [initOptions]);\r\n\r\n useEffect(() => {\r\n if (value && options) {\r\n const initOption = options.find((it) => it.value == value);\r\n\r\n if (initOption) {\r\n setQuery(initOption.label);\r\n setSelectedOption(initOption);\r\n }\r\n }\r\n }, [value, options]);\r\n\r\n useEffect(() => {\r\n const fetchOptions = async () => {\r\n setLoading(true);\r\n const { data } = await federationContext.apiClient.get(fetchUrl + query);\r\n setOptions(\r\n data.map((item: any) => ({\r\n value: item[valueKey],\r\n label: item[labelKey] + (showId ? \" (\" + item[valueKey] + \")\" : \"\"),\r\n }))\r\n ); // Adjust map according to actual API response\r\n setSearchResults(\r\n data.map((item: any) => ({\r\n value: item[valueKey],\r\n label: item[labelKey] + (showId ? \" (\" + item[valueKey] + \")\" : \"\"),\r\n }))\r\n ); // Adjust map according to actual API response\r\n\r\n setLoading(false);\r\n };\r\n\r\n if (serverSearch) fetchOptions();\r\n }, [\r\n query,\r\n serverSearch,\r\n valueKey,\r\n labelKey,\r\n fetchUrl,\r\n federationContext.apiClient,\r\n showId,\r\n ]);\r\n\r\n useClickAway(ref, () => {\r\n setSearchResults([]);\r\n if (!selectedOption) {\r\n setQuery(\"\");\r\n onChange(null);\r\n }\r\n\r\n handleBlur();\r\n });\r\n\r\n const handleQueryChange = (event: React.ChangeEvent<HTMLInputElement>) => {\r\n setQuery(event.target.value);\r\n setSelectedOption(null);\r\n setSelectedOptionIndex(-1);\r\n setSearchResults(\r\n options.filter((option) =>\r\n option?.label\r\n ?.toLowerCase()\r\n .includes(event.target?.value?.toLowerCase())\r\n )\r\n );\r\n };\r\n const handleFocus = () => {\r\n console.log(\"handleFocus query\", query);\r\n setIsFocused(true);\r\n onFocus();\r\n setSearchResults(\r\n options /*.filter((option) =>\r\n option.label.toLowerCase().includes(query.toLowerCase()),\r\n ),*/\r\n );\r\n };\r\n\r\n const handleClearQuery = () => {\r\n console.log(\r\n \"%csrcsharedAutocompleteSearchBar.tsx:95 handleClearQuery\",\r\n \"color: #007acc;\"\r\n );\r\n setQuery(\"\");\r\n onChange(null);\r\n setSelectedOption(null);\r\n setTimeout(() => {\r\n setSelectedOptionIndex(-1);\r\n setSearchResults(options);\r\n }, 1000);\r\n };\r\n\r\n const handleKeyDown = (event: React.KeyboardEvent<HTMLInputElement>) => {\r\n if (event.key === \"ArrowUp\" && searchResults.length > 0) {\r\n setSelectedOptionIndex((prevIndex) =>\r\n prevIndex > 0 ? prevIndex - 1 : searchResults.length - 1\r\n );\r\n } else if (event.key === \"ArrowDown\" && searchResults.length > 0) {\r\n setSelectedOptionIndex((prevIndex) =>\r\n prevIndex < searchResults.length - 1 ? prevIndex + 1 : 0\r\n );\r\n } else if (event.key === \"Enter\" && selectedOptionIndex !== -1) {\r\n handleOptionClick(searchResults[selectedOptionIndex]);\r\n } else if (event.key === \"Escape\" && selectedOptionIndex !== -1) {\r\n handleBlur();\r\n }\r\n };\r\n\r\n const handleOptionClick = (option: IOptionItem) => {\r\n setQuery(option.label);\r\n setSelectedOption(option);\r\n setSelectedOptionIndex(-1);\r\n\r\n onChange(option.value);\r\n\r\n handleBlur();\r\n };\r\n const handleBlur = () => {\r\n setSearchResults([]);\r\n onBlur();\r\n setIsFocused(false);\r\n };\r\n\r\n return (\r\n <div className=\"w-full min-h-20 flex-col justify-start items-start gap-1.5 inline-flex\">\r\n <div\r\n className=\"self-stretch min-h-14 flex-col justify-start items-start gap-1.5 flex relative\"\r\n ref={ref}\r\n >\r\n <label\r\n className=\"text-slate-700 text-sm leading-tight font-medium\"\r\n htmlFor={name}\r\n >\r\n {label} {required ? \"*\" : \"\"}\r\n </label>\r\n <div\r\n className={`self-stretch px-3 py-1.5 rounded-lg justify-start items-center gap-2 inline-flex outline-none border \r\n ${\r\n isFocused\r\n ? \"outline-4 outline-indigo-200 outline-offset-0 border-indigo-300\"\r\n : \"\"\r\n } \r\n ${\r\n isFocused && errors[name]?.message\r\n ? \"outline-4 outline-red-200 outline-offset-0 border-none\"\r\n : \"\"\r\n } \r\n ${!isFocused && errors[name]?.message ? \"border-red-200\" : \"\"} \r\n ${disabled ? \"bg-gray-100\" : \"bg-transparent\"}`}\r\n >\r\n <div className=\"Content grow shrink basis-0 min-h-5 xl:min-h-8 justify-start items-start gap-2 flex relative flex-col w-full mx-auto\">\r\n <SearchInput\r\n value={query}\r\n onChange={handleQueryChange}\r\n onKeyDown={handleKeyDown}\r\n onFocus={handleFocus} // Pass the onFocus handler\r\n clearQuery={handleClearQuery} // Pass the onFocus handler\r\n inputRef={inputRef}\r\n placeholder={placeholder}\r\n isFocused={isFocused}\r\n onBlur={handleBlur}\r\n isLoading={loading}\r\n />\r\n </div>\r\n </div>\r\n {searchResults.length > 0 && (\r\n <OptionList\r\n options={searchResults}\r\n selectedOptionIndex={selectedOptionIndex}\r\n handleOptionClick={handleOptionClick}\r\n />\r\n )}\r\n </div>\r\n {description && (\r\n <div className=\"HintText self-stretch text-slate-600 text-sm font-normal leading-tight\">\r\n {description}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nconst OptionList: React.FC<OptionListProps> = ({\r\n options,\r\n selectedOptionIndex,\r\n handleOptionClick,\r\n}) => {\r\n const containerRef = useRef<HTMLDivElement>(null);\r\n\r\n useEffect(() => {\r\n // Ensure the selected option is scrolled into view\r\n if (selectedOptionIndex >= 0 && selectedOptionIndex < options.length) {\r\n const selectedElement = containerRef.current?.children[\r\n selectedOptionIndex\r\n ] as HTMLDivElement;\r\n selectedElement?.scrollIntoView({\r\n behavior: \"instant\",\r\n block: \"nearest\",\r\n });\r\n }\r\n }, [selectedOptionIndex, options.length]);\r\n\r\n return (\r\n <div\r\n ref={containerRef}\r\n className=\"overflow-y-auto resultOptionContainer w-full max-h-96 absolute outline-4 bg-white border border-gray-200 drop-shadow-xl rounded-xl z-50 top-[73px]\"\r\n >\r\n {options?.map((option, index) => (\r\n <div\r\n key={option.value as string}\r\n className={`py-2 px-4 flex items-center justify-between gap-8 hover:bg-gray-200 cursor-pointer ${\r\n selectedOptionIndex === index ? \"bg-gray-200\" : \"\"\r\n }`}\r\n onClick={() => handleOptionClick(option)}\r\n >\r\n <p className=\"font-normal\">{option.label}</p>\r\n </div>\r\n ))}\r\n </div>\r\n );\r\n};\r\n\r\nconst SearchInput: React.FC<SearchInputProps> = ({\r\n value,\r\n onChange,\r\n onKeyDown,\r\n onFocus,\r\n onBlur,\r\n inputRef,\r\n placeholder,\r\n clearQuery,\r\n isFocused,\r\n isLoading,\r\n}) => {\r\n const handleExpandMoreClick = () => {\r\n inputRef.current?.focus();\r\n onFocus();\r\n };\r\n\r\n const handleClearQuery = () => {\r\n clearQuery();\r\n };\r\n\r\n return (\r\n <div className=\"relative flex items-center w-full sharedResource\">\r\n <input\r\n type=\"text\"\r\n className={`pl-1 py-1 border-gray-800 w-full ${\r\n isLoading ? \"pr-10\" : \"pr-20\"\r\n }`}\r\n value={value}\r\n onChange={onChange}\r\n onKeyDown={onKeyDown}\r\n onFocus={onFocus}\r\n ref={inputRef}\r\n placeholder={placeholder}\r\n disabled={isLoading}\r\n />\r\n {isLoading && (\r\n <div className=\"loader absolute right-0 text-gray-500\">\r\n {/* You can replace this div with an SVG or another icon of your choice */}\r\n <svg\r\n className=\"animate-spin h-5 w-5\"\r\n xmlns=\"http://www.w3.org/2000/svg\"\r\n fill=\"none\"\r\n viewBox=\"0 0 24 24\"\r\n >\r\n <circle\r\n className=\"opacity-25\"\r\n cx=\"12\"\r\n cy=\"12\"\r\n r=\"10\"\r\n stroke=\"currentColor\"\r\n strokeWidth=\"4\"\r\n />\r\n <path\r\n className=\"opacity-75\"\r\n fill=\"currentColor\"\r\n d=\"M4 12a8 8 0 018-8v4a4 4 0 00-4 4H4z\"\r\n />\r\n </svg>\r\n </div>\r\n )}\r\n {isFocused && !isLoading && (\r\n <MdExpandLess\r\n className=\"material-icons absolute right-0 cursor-pointer text-gray-500\"\r\n onClick={onBlur}\r\n />\r\n )}\r\n {!isFocused && !isLoading && (\r\n <MdExpandMore\r\n className=\"material-icons absolute right-0 cursor-pointer text-gray-500\"\r\n onClick={handleExpandMoreClick}\r\n />\r\n )}\r\n {value && !isLoading && (\r\n <MdClose\r\n className=\"material-icons absolute right-10 cursor-pointer text-gray-500\"\r\n onClick={handleClearQuery}\r\n />\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nexport default AutocompleteSearchBar;\r\n"],"names":["_i","eventName","_b","_a"],"mappings":"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","x_google_ignoreList":[0,1]}
@@ -1,250 +1,279 @@
1
- import { jsxs as o, jsx as t, Fragment as x } from "react/jsx-runtime";
2
- import { useState as T, useRef as Y, useEffect as Z } from "react";
3
- import { c as _ } from "../../index-CO5g84CR.js";
1
+ import { jsxs, jsx, Fragment } from "react/jsx-runtime";
2
+ import { useState, useRef, useEffect } from "react";
3
+ import { c as MdClose } from "../../index-C0yNf1cc.js";
4
4
  import '../../assets/tailwind.css';/* empty css */
5
5
  import "../../contexts/FederationContext.js";
6
- import { useFederationContext as K } from "../../contexts/useFederationContext.js";
7
- const ae = ({
8
- label: b,
9
- name: r,
10
- type: F,
11
- register: y,
12
- disabled: n,
13
- errors: u = {},
14
- required: E,
15
- clearable: G,
16
- value: l,
17
- description: w,
18
- onInputChange: i,
19
- options: s,
20
- placeholder: v,
21
- children: C,
22
- fetchUrl: N,
23
- valueKey: B,
24
- labelKey: O,
25
- maxLength: q
6
+ import { useFederationContext } from "../../contexts/useFederationContext.js";
7
+ const FormField = ({
8
+ label,
9
+ name,
10
+ type,
11
+ register,
12
+ disabled,
13
+ errors = {},
14
+ required,
15
+ clearable,
16
+ value,
17
+ description,
18
+ onInputChange,
19
+ options,
20
+ placeholder,
21
+ children,
22
+ fetchUrl,
23
+ valueKey,
24
+ labelKey,
25
+ maxLength
26
26
  }) => {
27
- var $, L, R, H, M;
28
- const [k, a] = T(!1), [p, j] = T(s), A = Y(null), {
29
- ref: z = A,
30
- onBlur: d = () => {
27
+ var _a, _b, _c, _d, _e;
28
+ const [isFocused, setIsFocused] = useState(false);
29
+ const [localOptions, setLocalOptions] = useState(options);
30
+ const fallbackRef = useRef(null);
31
+ const {
32
+ ref: registeredRef = fallbackRef,
33
+ onBlur: formOnBlur = () => {
31
34
  },
32
- ...f
33
- } = y ? y(r) : {}, S = ($ = K()) == null ? void 0 : $.apiClient, c = z || A, D = () => {
34
- c.current && c.current.focus();
35
- }, J = (e) => {
36
- const m = Array.from(
37
- e.target.selectedOptions,
38
- (g) => g.value
35
+ ...rest
36
+ } = register ? register(name) : {};
37
+ const apiClient = (_a = useFederationContext()) == null ? void 0 : _a.apiClient;
38
+ const ref = registeredRef || fallbackRef;
39
+ const focusInput = () => {
40
+ if (ref.current) {
41
+ ref.current.focus();
42
+ }
43
+ };
44
+ const handleMultiSelectChange = (event) => {
45
+ const selectedOptions = Array.from(
46
+ event.target.selectedOptions,
47
+ (option) => option.value
39
48
  );
40
- i({
41
- ...e,
49
+ onInputChange({
50
+ ...event,
42
51
  target: {
43
- value: m,
44
- name: e.target.name
52
+ value: selectedOptions,
53
+ name: event.target.name
45
54
  }
46
55
  });
47
- }, P = (e) => {
48
- i({
49
- ...e,
56
+ };
57
+ const handleCheckBoxChange = (event) => {
58
+ onInputChange({
59
+ ...event,
50
60
  target: {
51
- value: e.target.value == "on",
52
- name: e.target.name
61
+ value: event.target.value == "on" ? true : false,
62
+ name: event.target.name
53
63
  }
54
64
  });
55
- }, Q = (e) => {
56
- i({
65
+ };
66
+ const handleClear = (e) => {
67
+ onInputChange({
57
68
  ...e,
58
69
  target: {
59
70
  value: "",
60
- name: r
71
+ name
61
72
  }
62
73
  });
63
74
  };
64
- Z(() => {
65
- N && (async (m) => {
66
- const { data: g } = await S.get(m), W = typeof g[0] == "number", X = g.map((h) => W ? { value: h, label: h.toString() } : {
67
- value: h[B || "id"],
68
- label: h[O || "name"]
75
+ useEffect(() => {
76
+ const fetchOptions = async (fetchUrl2) => {
77
+ const { data } = await apiClient.get(fetchUrl2);
78
+ const isArrayOfNumbers = typeof data[0] === "number";
79
+ const transformedOptions = data.map((item) => {
80
+ if (isArrayOfNumbers) {
81
+ return { value: item, label: item.toString() };
82
+ } else {
83
+ return {
84
+ value: item[valueKey || "id"],
85
+ label: item[labelKey || "name"]
86
+ };
87
+ }
69
88
  });
70
- j([
89
+ setLocalOptions([
71
90
  { value: null, label: " " },
72
91
  // Add an empty option as the first item
73
- ...X
92
+ ...transformedOptions
74
93
  ]);
75
- })(N), s && j(s);
76
- }, [N, s, S, B, O]);
77
- const V = () => {
78
- switch (F) {
94
+ };
95
+ if (fetchUrl)
96
+ fetchOptions(fetchUrl);
97
+ if (options)
98
+ setLocalOptions(options);
99
+ }, [fetchUrl, options, apiClient, valueKey, labelKey]);
100
+ const renderInput = () => {
101
+ switch (type) {
79
102
  case "select":
80
- return /* @__PURE__ */ t(x, { children: /* @__PURE__ */ o(
103
+ return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsxs(
81
104
  "select",
82
105
  {
83
- id: r,
106
+ id: name,
84
107
  className: "grow shrink basis-0 text-gray-900 text-sm font-normal leading-tight focus:border-none bg-transparent",
85
- disabled: n,
86
- value: l,
87
- ...f,
88
- ref: c,
89
- onChange: i,
90
- onFocus: () => a(!0),
108
+ disabled,
109
+ value,
110
+ ...rest,
111
+ ref,
112
+ onChange: onInputChange,
113
+ onFocus: () => setIsFocused(true),
91
114
  onBlur: (e) => {
92
- d(e), a(!1);
115
+ formOnBlur(e);
116
+ setIsFocused(false);
93
117
  },
94
118
  children: [
95
- v && /* @__PURE__ */ t("option", { label: v }),
96
- p == null ? void 0 : p.map((e) => /* @__PURE__ */ t(
119
+ placeholder && /* @__PURE__ */ jsx("option", { label: placeholder }),
120
+ localOptions == null ? void 0 : localOptions.map((option) => /* @__PURE__ */ jsx(
97
121
  "option",
98
122
  {
99
- value: e.value ? e.value : void 0,
100
- children: e.label
123
+ value: option.value ? option.value : void 0,
124
+ children: option.label
101
125
  },
102
- e.value
126
+ option.value
103
127
  ))
104
128
  ]
105
129
  }
106
130
  ) });
107
131
  case "multiSelect":
108
- return /* @__PURE__ */ t(x, { children: /* @__PURE__ */ t(
132
+ return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx(
109
133
  "select",
110
134
  {
111
- id: r,
112
- multiple: !0,
135
+ id: name,
136
+ multiple: true,
113
137
  className: "grow shrink basis-0 text-gray-900 text-sm font-normal leading-tight focus:border-none bg-transparent",
114
- disabled: n,
115
- value: Array.isArray(l) ? l : [],
116
- ...f,
117
- ref: c,
118
- onChange: J,
119
- onFocus: () => a(!0),
138
+ disabled,
139
+ value: Array.isArray(value) ? value : [],
140
+ ...rest,
141
+ ref,
142
+ onChange: handleMultiSelectChange,
143
+ onFocus: () => setIsFocused(true),
120
144
  onBlur: (e) => {
121
- d(e), a(!1);
145
+ formOnBlur(e);
146
+ setIsFocused(false);
122
147
  },
123
- children: s == null ? void 0 : s.map((e) => /* @__PURE__ */ t(
148
+ children: options == null ? void 0 : options.map((option) => /* @__PURE__ */ jsx(
124
149
  "option",
125
150
  {
126
- value: e.value ? e.value : void 0,
127
- children: e.label
151
+ value: option.value ? option.value : void 0,
152
+ children: option.label
128
153
  },
129
- e.value
154
+ option.value
130
155
  ))
131
156
  }
132
157
  ) });
133
158
  case "radioGroup":
134
- return /* @__PURE__ */ t("div", { className: "flex flex-col", children: s == null ? void 0 : s.map((e, m) => /* @__PURE__ */ o(
159
+ return /* @__PURE__ */ jsx("div", { className: "flex flex-col", children: options == null ? void 0 : options.map((option, index) => /* @__PURE__ */ jsxs(
135
160
  "label",
136
161
  {
137
162
  className: "inline-flex items-center space-x-2 my-2",
138
163
  children: [
139
- /* @__PURE__ */ t(
164
+ /* @__PURE__ */ jsx(
140
165
  "input",
141
166
  {
142
167
  type: "radio",
143
- name: r,
144
- value: e.value,
145
- checked: l === e.value,
146
- disabled: n,
147
- ...y(r),
148
- onChange: i,
168
+ name,
169
+ value: option.value,
170
+ checked: value === option.value,
171
+ disabled,
172
+ ...register(name),
173
+ onChange: onInputChange,
149
174
  className: "text-indigo-600 border-gray-300 focus:ring-indigo-500 mr-2"
150
175
  }
151
176
  ),
152
- /* @__PURE__ */ t("span", { className: "text-gray-900 text-sm font-normal leading-tight", children: e.label })
177
+ /* @__PURE__ */ jsx("span", { className: "text-gray-900 text-sm font-normal leading-tight", children: option.label })
153
178
  ]
154
179
  },
155
- m
180
+ index
156
181
  )) });
157
182
  case "textarea":
158
- return /* @__PURE__ */ t(
183
+ return /* @__PURE__ */ jsx(
159
184
  "textarea",
160
185
  {
161
- id: r,
186
+ id: name,
162
187
  className: "grow shrink basis-0 text-gray-900 text-sm font-normal leading-tight focus:border-none ",
163
- disabled: n,
164
- value: l,
188
+ disabled,
189
+ value,
165
190
  rows: 3,
166
- ...f,
167
- ref: c,
168
- onChange: i,
169
- onFocus: () => a(!0),
170
- maxLength: q || 4e3,
191
+ ...rest,
192
+ ref,
193
+ onChange: onInputChange,
194
+ onFocus: () => setIsFocused(true),
195
+ maxLength: maxLength || 4e3,
171
196
  onBlur: (e) => {
172
- d(e), a(!1);
197
+ formOnBlur(e);
198
+ setIsFocused(false);
173
199
  }
174
200
  }
175
201
  );
176
202
  case "checkbox":
177
- return /* @__PURE__ */ o(x, { children: [
178
- /* @__PURE__ */ t(
203
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
204
+ /* @__PURE__ */ jsx(
179
205
  "input",
180
206
  {
181
207
  type: "checkbox",
182
- id: r,
208
+ id: name,
183
209
  className: "shrink basis-0 text-gray-900 text-sm font-normal leading-tight focus:border-none",
184
- checked: l,
185
- disabled: n,
186
- ...f,
187
- ref: c,
188
- onChange: P,
189
- onFocus: () => a(!0),
210
+ checked: value,
211
+ disabled,
212
+ ...rest,
213
+ ref,
214
+ onChange: handleCheckBoxChange,
215
+ onFocus: () => setIsFocused(true),
190
216
  onBlur: (e) => {
191
- d(e), a(!1);
217
+ formOnBlur(e);
218
+ setIsFocused(false);
192
219
  }
193
220
  }
194
221
  ),
195
- /* @__PURE__ */ t("label", { htmlFor: r, children: b })
222
+ /* @__PURE__ */ jsx("label", { htmlFor: name, children: label })
196
223
  ] });
197
224
  default:
198
- return /* @__PURE__ */ t(x, { children: /* @__PURE__ */ t(
225
+ return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx(
199
226
  "input",
200
227
  {
201
228
  className: "grow shrink basis-0 text-gray-900 text-sm font-normal leading-tight focus:border-none bg-transparent",
202
- id: r,
203
- readOnly: n,
204
- value: l,
205
- type: F,
206
- ...f,
207
- ref: c,
208
- placeholder: v,
209
- onChange: i,
210
- onFocus: () => a(!0),
229
+ id: name,
230
+ readOnly: disabled,
231
+ value,
232
+ type,
233
+ ...rest,
234
+ ref,
235
+ placeholder,
236
+ onChange: onInputChange,
237
+ onFocus: () => setIsFocused(true),
211
238
  onBlur: (e) => {
212
- d(e), a(!1);
239
+ formOnBlur(e);
240
+ setIsFocused(false);
213
241
  }
214
242
  }
215
243
  ) });
216
244
  }
217
245
  };
218
- return /* @__PURE__ */ o("div", { className: "w-full min-h-30 flex-col justify-start items-start gap-1.5 inline-flex sharedLibrary", children: [
219
- /* @__PURE__ */ o("div", { className: "self-stretch flex-col justify-start items-start gap-1.5 flex", children: [
220
- b && /* @__PURE__ */ o(
246
+ return /* @__PURE__ */ jsxs("div", { className: "w-full min-h-30 flex-col justify-start items-start gap-1.5 inline-flex sharedLibrary", children: [
247
+ /* @__PURE__ */ jsxs("div", { className: "self-stretch flex-col justify-start items-start gap-1.5 flex", children: [
248
+ label && /* @__PURE__ */ jsxs(
221
249
  "label",
222
250
  {
223
251
  className: "text-slate-700 text-sm leading-tight font-medium",
224
- htmlFor: r,
252
+ htmlFor: name,
225
253
  children: [
226
- b,
254
+ label,
227
255
  " ",
228
- E ? "*" : ""
256
+ required ? "*" : ""
229
257
  ]
230
258
  }
231
259
  ),
232
- /* @__PURE__ */ t(
260
+ /* @__PURE__ */ jsx(
233
261
  "div",
234
262
  {
235
- className: `self-stretch px-3 py-2 rounded-lg justify-start items-center gap-2 inline-flex outline-none border ${k && !((L = u[r]) != null && L.message) ? "outline-4 outline-indigo-200 outline-offset-0 border-indigo-300" : ""} ${k && ((R = u[r]) != null && R.message) ? "outline-4 outline-red-200 outline-offset-0 border-none" : ""} ${!k && ((H = u[r]) != null && H.message) ? "border-red-200" : ""} ${n ? "bg-gray-100" : "bg-transparent"}`,
236
- children: /* @__PURE__ */ o("div", { className: "flex relative grow shrink basis-0 min-h-5 xl:min-h-[32px] justify-start items-stretch gap-2 max-w-full", children: [
237
- V(),
238
- C && /* @__PURE__ */ t("div", { onClick: D, children: C }),
239
- G && l && /* @__PURE__ */ t(_, { onClick: Q })
263
+ className: `self-stretch px-3 py-2 rounded-lg justify-start items-center gap-2 inline-flex outline-none border ${isFocused && !((_b = errors[name]) == null ? void 0 : _b.message) ? "outline-4 outline-indigo-200 outline-offset-0 border-indigo-300" : ""} ${isFocused && ((_c = errors[name]) == null ? void 0 : _c.message) ? "outline-4 outline-red-200 outline-offset-0 border-none" : ""} ${!isFocused && ((_d = errors[name]) == null ? void 0 : _d.message) ? "border-red-200" : ""} ${disabled ? "bg-gray-100" : "bg-transparent"}`,
264
+ children: /* @__PURE__ */ jsxs("div", { className: "flex relative grow shrink basis-0 min-h-5 xl:min-h-[32px] justify-start items-stretch gap-2 max-w-full", children: [
265
+ renderInput(),
266
+ children && /* @__PURE__ */ jsx("div", { onClick: focusInput, children }),
267
+ clearable && value && /* @__PURE__ */ jsx(MdClose, { onClick: handleClear })
240
268
  ] })
241
269
  }
242
270
  )
243
271
  ] }),
244
- w && /* @__PURE__ */ t("div", { className: "HintText self-stretch text-slate-600 text-sm font-normal leading-tight", children: w }),
245
- u[r] && /* @__PURE__ */ t("div", { className: "HintText self-stretch text-red-600 text-sm font-normal leading-tight", children: (M = u[r]) == null ? void 0 : M.message })
272
+ description && /* @__PURE__ */ jsx("div", { className: "HintText self-stretch text-slate-600 text-sm font-normal leading-tight", children: description }),
273
+ errors[name] && /* @__PURE__ */ jsx("div", { className: "HintText self-stretch text-red-600 text-sm font-normal leading-tight", children: (_e = errors[name]) == null ? void 0 : _e.message })
246
274
  ] });
247
275
  };
248
276
  export {
249
- ae as default
277
+ FormField as default
250
278
  };
279
+ //# sourceMappingURL=FormField.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"FormField.js","sources":["../../../lib/components/form/FormField.tsx"],"sourcesContent":["import React, { useEffect, useRef, useState } from \"react\";\r\n\r\nimport { MdClose } from \"react-icons/md\";\r\nimport { IOptionItem, useFederationContext } from \"../../main\";\r\n\r\nexport interface FormFieldProps {\r\n label?: string;\r\n description?: string;\r\n name: string;\r\n type: string;\r\n value?: any;\r\n register?: any;\r\n\r\n errors?: any;\r\n disabled?: boolean;\r\n required?: boolean;\r\n clearable?: boolean;\r\n placeholder?: string;\r\n options?: IOptionItem[];\r\n children?: React.ReactNode;\r\n fetchUrl?: string;\r\n maxLength?: number;\r\n\r\n valueKey?: string;\r\n labelKey?: string;\r\n onInputChange: (\r\n e: React.ChangeEvent<\r\n HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement | any\r\n >\r\n ) => void;\r\n}\r\n\r\nconst FormField: React.FC<FormFieldProps> = ({\r\n label,\r\n name,\r\n type,\r\n register,\r\n disabled,\r\n errors = {},\r\n required,\r\n clearable,\r\n value,\r\n description,\r\n onInputChange,\r\n options,\r\n placeholder,\r\n children,\r\n fetchUrl,\r\n valueKey,\r\n labelKey,\r\n maxLength,\r\n}) => {\r\n const [isFocused, setIsFocused] = useState(false);\r\n\r\n const [localOptions, setLocalOptions] = useState(options);\r\n const fallbackRef = useRef(null); // Create a fallback ref\r\n const {\r\n ref: registeredRef = fallbackRef,\r\n onBlur: formOnBlur = () => {} /* default function */,\r\n ...rest\r\n } = register ? register(name) : {};\r\n\r\n const apiClient = useFederationContext()?.apiClient;\r\n const ref = registeredRef || fallbackRef;\r\n const focusInput = () => {\r\n if (ref.current) {\r\n ref.current.focus();\r\n }\r\n };\r\n const handleMultiSelectChange = (\r\n event: React.ChangeEvent<HTMLSelectElement>\r\n ) => {\r\n const selectedOptions = Array.from(\r\n event.target.selectedOptions,\r\n (option) => option.value\r\n );\r\n\r\n onInputChange({\r\n ...event,\r\n target: {\r\n value: selectedOptions,\r\n name: event.target.name,\r\n },\r\n });\r\n };\r\n\r\n const handleCheckBoxChange = (\r\n event: React.ChangeEvent<HTMLSelectElement>\r\n ) => {\r\n onInputChange({\r\n ...event,\r\n target: {\r\n value: event.target.value == \"on\" ? true : false,\r\n name: event.target.name,\r\n },\r\n });\r\n };\r\n\r\n const handleClear = (e: any) => {\r\n value;\r\n onInputChange({\r\n ...e,\r\n target: {\r\n value: \"\",\r\n name: name,\r\n },\r\n });\r\n };\r\n useEffect(() => {\r\n const fetchOptions = async (fetchUrl: string) => {\r\n const { data } = await apiClient.get(fetchUrl);\r\n\r\n // Check if the first item in the data array is a number to determine the data type\r\n const isArrayOfNumbers = typeof data[0] === \"number\";\r\n\r\n // Transform data based on its type\r\n const transformedOptions = data.map((item: any) => {\r\n if (isArrayOfNumbers) {\r\n // If it's a number, use the number for both value and label\r\n return { value: item, label: item.toString() };\r\n } else {\r\n // Otherwise, extract using predefined keys or defaults\r\n return {\r\n value: item[valueKey || \"id\"],\r\n label: item[labelKey || \"name\"],\r\n };\r\n }\r\n });\r\n\r\n setLocalOptions([\r\n { value: null, label: \" \" }, // Add an empty option as the first item\r\n ...transformedOptions,\r\n ]);\r\n };\r\n\r\n if (fetchUrl) fetchOptions(fetchUrl);\r\n if (options) setLocalOptions(options);\r\n }, [fetchUrl, options, apiClient, valueKey, labelKey]); // ensure valueKey and labelKey are also in the dependency array if they are dynamic\r\n\r\n const renderInput = () => {\r\n switch (type) {\r\n case \"select\":\r\n return (\r\n <>\r\n <select\r\n id={name}\r\n className=\"grow shrink basis-0 text-gray-900 text-sm font-normal leading-tight focus:border-none bg-transparent\"\r\n disabled={disabled}\r\n value={value}\r\n {...rest} // Spread the rest of register's return value\r\n ref={ref}\r\n onChange={onInputChange}\r\n onFocus={() => setIsFocused(true)}\r\n // Combine custom onBlur with form's onBlur\r\n onBlur={(e) => {\r\n formOnBlur(e); // Call React Hook Form's onBlur\r\n setIsFocused(false); // Then call your custom onBlur logic\r\n }}\r\n >\r\n {placeholder && <option label={placeholder}></option>}\r\n {localOptions?.map((option) => (\r\n <option\r\n key={option.value}\r\n value={option.value ? option.value : undefined}\r\n >\r\n {option.label}\r\n </option>\r\n ))}\r\n </select>\r\n </>\r\n );\r\n case \"multiSelect\":\r\n return (\r\n <>\r\n <select\r\n id={name}\r\n multiple\r\n className=\"grow shrink basis-0 text-gray-900 text-sm font-normal leading-tight focus:border-none bg-transparent\"\r\n disabled={disabled}\r\n value={Array.isArray(value) ? value : []} // Ensure value is always an array\r\n {...rest}\r\n ref={ref}\r\n onChange={handleMultiSelectChange} // Use the custom multi-select handler\r\n onFocus={() => setIsFocused(true)}\r\n onBlur={(e) => {\r\n formOnBlur(e);\r\n setIsFocused(false);\r\n }}\r\n >\r\n {options?.map((option) => (\r\n <option\r\n key={option.value}\r\n value={option.value ? option.value : undefined}\r\n >\r\n {option.label}\r\n </option>\r\n ))}\r\n </select>\r\n </>\r\n );\r\n case \"radioGroup\":\r\n return (\r\n <div className=\"flex flex-col\">\r\n {options?.map((option, index) => (\r\n <label\r\n key={index}\r\n className=\"inline-flex items-center space-x-2 my-2\"\r\n >\r\n <input\r\n type=\"radio\"\r\n name={name}\r\n value={option.value}\r\n checked={value === option.value}\r\n disabled={disabled}\r\n {...register(name)} // Spread the rest of register's return value\r\n onChange={onInputChange}\r\n className=\"text-indigo-600 border-gray-300 focus:ring-indigo-500 mr-2\"\r\n />\r\n <span className=\"text-gray-900 text-sm font-normal leading-tight\">\r\n {option.label}\r\n </span>\r\n </label>\r\n ))}\r\n </div>\r\n );\r\n case \"textarea\":\r\n return (\r\n <textarea\r\n id={name}\r\n className=\"grow shrink basis-0 text-gray-900 text-sm font-normal leading-tight focus:border-none \"\r\n disabled={disabled}\r\n value={value}\r\n rows={3}\r\n {...rest} // Spread the rest of register's return value\r\n ref={ref}\r\n onChange={onInputChange}\r\n onFocus={() => setIsFocused(true)}\r\n maxLength={maxLength || 4000}\r\n // Combine custom onBlur with form's onBlur\r\n onBlur={(e) => {\r\n formOnBlur(e); // Call React Hook Form's onBlur\r\n setIsFocused(false); // Then call your custom onBlur logic\r\n }}\r\n />\r\n );\r\n case \"checkbox\":\r\n return (\r\n <>\r\n <input\r\n type=\"checkbox\"\r\n id={name}\r\n className=\"shrink basis-0 text-gray-900 text-sm font-normal leading-tight focus:border-none\"\r\n checked={value}\r\n disabled={disabled}\r\n {...rest} // Spread the rest of register's return value\r\n ref={ref}\r\n onChange={handleCheckBoxChange}\r\n onFocus={() => setIsFocused(true)}\r\n // Combine custom onBlur with form's onBlur\r\n onBlur={(e) => {\r\n formOnBlur(e); // Call React Hook Form's onBlur\r\n setIsFocused(false); // Then call your custom onBlur logic\r\n }}\r\n />\r\n <label htmlFor={name}>{label}</label>\r\n </>\r\n );\r\n default:\r\n return (\r\n <>\r\n <input\r\n className=\"grow shrink basis-0 text-gray-900 text-sm font-normal leading-tight focus:border-none bg-transparent\"\r\n id={name}\r\n readOnly={disabled}\r\n value={value}\r\n type={type}\r\n {...rest} // Spread the rest of register's return value\r\n ref={ref}\r\n placeholder={placeholder}\r\n onChange={onInputChange}\r\n onFocus={() => setIsFocused(true)}\r\n // Combine custom onBlur with form's onBlur\r\n onBlur={(e) => {\r\n formOnBlur(e); // Call React Hook Form's onBlur\r\n setIsFocused(false); // Then call your custom onBlur logic\r\n }}\r\n />\r\n </>\r\n );\r\n }\r\n };\r\n\r\n return (\r\n <div className=\"w-full min-h-30 flex-col justify-start items-start gap-1.5 inline-flex sharedLibrary\">\r\n <div className=\"self-stretch flex-col justify-start items-start gap-1.5 flex\">\r\n {label && (\r\n <label\r\n className=\"text-slate-700 text-sm leading-tight font-medium\"\r\n htmlFor={name}\r\n >\r\n {label} {required ? \"*\" : \"\"}\r\n </label>\r\n )}\r\n <div\r\n className={\r\n `self-stretch px-3 py-2 rounded-lg justify-start items-center gap-2 inline-flex outline-none border` +\r\n ` ${\r\n isFocused && !errors[name]?.message\r\n ? \"outline-4 outline-indigo-200 outline-offset-0 border-indigo-300\"\r\n : \"\"\r\n }` +\r\n ` ${\r\n isFocused && errors[name]?.message\r\n ? \"outline-4 outline-red-200 outline-offset-0 border-none\"\r\n : \"\"\r\n } ` +\r\n ` ${!isFocused && errors[name]?.message ? \"border-red-200\" : \"\"} ` +\r\n ` ${disabled ? \"bg-gray-100\" : \"bg-transparent\"}`\r\n }\r\n >\r\n <div className=\"flex relative grow shrink basis-0 min-h-5 xl:min-h-[32px] justify-start items-stretch gap-2 max-w-full\">\r\n {renderInput()}\r\n {children && <div onClick={focusInput}>{children}</div>}\r\n {clearable && value && <MdClose onClick={handleClear}></MdClose>}\r\n </div>\r\n </div>\r\n </div>\r\n {description && (\r\n <div className=\"HintText self-stretch text-slate-600 text-sm font-normal leading-tight\">\r\n {description}\r\n </div>\r\n )}\r\n {errors[name] && (\r\n <div className=\"HintText self-stretch text-red-600 text-sm font-normal leading-tight\">\r\n {errors[name]?.message}\r\n </div>\r\n )}\r\n </div>\r\n );\r\n};\r\n\r\nexport default FormField;\r\n"],"names":["fetchUrl"],"mappings":"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"}