@addsign/moje-agenda-shared-lib 0.0.55 → 0.0.59

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 (34) hide show
  1. package/dist/assets/tailwind.css +41 -16
  2. package/dist/components/datatable/DataTable.js +2 -1
  3. package/dist/components/datatable/DataTable.js.map +1 -1
  4. package/dist/components/datatable/DataTableServer.js +199 -186
  5. package/dist/components/datatable/DataTableServer.js.map +1 -1
  6. package/dist/components/form/AutocompleteSearchBar.js +4 -3
  7. package/dist/components/form/AutocompleteSearchBar.js.map +1 -1
  8. package/dist/components/form/FileInput.js +2 -1
  9. package/dist/components/form/FileInput.js.map +1 -1
  10. package/dist/components/form/FormField.js +2 -1
  11. package/dist/components/form/FormField.js.map +1 -1
  12. package/dist/components/form/InputField.d.ts +6 -0
  13. package/dist/components/form/InputField.js +144 -0
  14. package/dist/components/form/InputField.js.map +1 -0
  15. package/dist/components/form/PositionsSelectorSingle.js +2 -1
  16. package/dist/components/form/PositionsSelectorSingle.js.map +1 -1
  17. package/dist/components/form/SelectField.d.ts +3 -19
  18. package/dist/components/form/SelectField.js +33 -19
  19. package/dist/components/form/SelectField.js.map +1 -1
  20. package/dist/components/layout/IconInCircle.d.ts +10 -0
  21. package/dist/components/layout/IconInCircle.js +24 -0
  22. package/dist/components/layout/IconInCircle.js.map +1 -0
  23. package/dist/components/profiles/ProfileOverview.d.ts +9 -0
  24. package/dist/components/profiles/ProfileOverview.js +180 -0
  25. package/dist/components/profiles/ProfileOverview.js.map +1 -0
  26. package/dist/{index-qxZYrVct.js → index-ClXm2PIX.js} +18 -14
  27. package/dist/{index-qxZYrVct.js.map → index-ClXm2PIX.js.map} +1 -1
  28. package/dist/main.d.ts +1 -0
  29. package/dist/main.js +6 -0
  30. package/dist/main.js.map +1 -1
  31. package/dist/types.d.ts +84 -1
  32. package/dist/types.js +36 -1
  33. package/dist/types.js.map +1 -1
  34. package/package.json +1 -1
@@ -1,24 +1,8 @@
1
- import { UseFormReturn } from 'react-hook-form';
2
- import { IOptionItem } from '../../types';
3
- import * as React from "react";
4
- export interface IFormFieldGlobalProps {
5
- label?: string;
6
- description?: string;
7
- name: string;
8
- type: string;
9
- value?: any;
10
- methods?: UseFormReturn<any>;
11
- disabled?: boolean;
12
- required?: boolean;
13
- clearable?: boolean;
14
- placeholder?: string;
15
- children?: React.ReactNode;
16
- className?: string;
17
- onInputChange: (e: React.ChangeEvent<HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement | any>) => void;
18
- }
1
+ import { IFormFieldGlobalProps, IOptionItem } from '../../types';
2
+
19
3
  export interface ISelectFieldProps extends IFormFieldGlobalProps {
20
4
  options?: IOptionItem[];
21
5
  valueKey?: string;
22
6
  labelKey?: string;
23
7
  }
24
- export default function SelectField({ label, name, value, description, onInputChange, options, placeholder, }: ISelectFieldProps): import("react/jsx-runtime").JSX.Element;
8
+ export default function SelectField({ label, name, value, description, onInputChange, options, placeholder, className, errors, }: ISelectFieldProps): import("react/jsx-runtime").JSX.Element;
@@ -1,6 +1,6 @@
1
1
  import { jsx, Fragment, jsxs } from "react/jsx-runtime";
2
2
  import * as React from "react";
3
- import { M as MdClose, a as MdExpandLess, b as MdExpandMore, c as MdCheck } from "../../index-qxZYrVct.js";
3
+ import { b as MdClose, M as MdExpandLess, a as MdExpandMore, j as MdCheck } from "../../index-ClXm2PIX.js";
4
4
  import { u as useClickAway } from "../../useClickAway-CH9ykBsx.js";
5
5
  function SelectField({
6
6
  label,
@@ -9,8 +9,11 @@ function SelectField({
9
9
  description,
10
10
  onInputChange,
11
11
  options,
12
- placeholder
12
+ placeholder,
13
+ className,
14
+ errors = {}
13
15
  }) {
16
+ var _a;
14
17
  const [isFocused, setIsFocused] = React.useState(false);
15
18
  const ref = React.useRef(null);
16
19
  const handleClear = (e) => {
@@ -39,7 +42,7 @@ function SelectField({
39
42
  setIsFocused(false);
40
43
  };
41
44
  const currentlySelectedOption = React.useMemo(() => {
42
- if (!value)
45
+ if (value === null || value === void 0 || value === "")
43
46
  return null;
44
47
  return options == null ? void 0 : options.find((option) => option.value === value);
45
48
  }, [options, value]);
@@ -50,20 +53,20 @@ function SelectField({
50
53
  "div",
51
54
  {
52
55
  id: "list",
53
- className: "max-h-[390px] bg-white rounded-lg shadow-xl border border-gray-200 justify-start items-start inline-flex overflow-auto w-full mt-[1px]",
56
+ className: "max-h-[390px] min-w-32 whitespace-nowrap fixed z-[100000] top-auto mt-[4px] bg-white rounded-lg shadow-xl border border-gray-200 justify-start items-start inline-flex overflow-auto ",
54
57
  children: /* @__PURE__ */ jsx("div", { className: "grow shrink basis-0 py-1 flex-col justify-start items-start inline-flex", children: options.map((option, index) => {
55
58
  return /* @__PURE__ */ jsxs(
56
59
  "div",
57
60
  {
58
- className: "group self-stretch px-1.5 py-px justify-start items-center inline-flex hover:bg-gray-50",
61
+ className: "group self-stretch px-1.5 py-px justify-start items-center inline-flex hover:bg-gray-50 ",
59
62
  onClick: () => hangleChange(option),
60
63
  children: [
61
- /* @__PURE__ */ jsx("div", { className: "grow shrink basis-0 pl-2 pr-2.5 py-2.5 rounded-md flex-col justify-start items-start gap-2 inline-flex", children: /* @__PURE__ */ jsxs("div", { className: "self-stretch justify-start items-center gap-2 inline-flex", children: [
62
- /* @__PURE__ */ jsx("div", { className: "text-gray-900 text-base font-medium leading-normal", children: option.label }),
63
- option.description && /* @__PURE__ */ jsx("div", { className: "text-slate-600 text-base font-normal leading-normal", children: option.description })
64
+ /* @__PURE__ */ jsx("div", { className: "grow shrink basis-0 px-1 py-2 rounded-md flex-col justify-start items-start gap-2 inline-flex", children: /* @__PURE__ */ jsxs("div", { className: "self-stretch justify-start items-center gap-2 inline-flex", children: [
65
+ /* @__PURE__ */ jsx("div", { className: "text-gray-900 text-sm font-medium leading-normal", children: option.label }),
66
+ option.description && /* @__PURE__ */ jsx("div", { className: "text-slate-600 sm-base font-normal leading-normal", children: option.description })
64
67
  ] }) }),
65
68
  /* @__PURE__ */ jsxs("div", { className: "w-5 h-5 relative", children: [
66
- option.value === value && /* @__PURE__ */ jsx(MdCheck, { size: 22, className: "text-primary" }),
69
+ option.value === value && value !== "" && /* @__PURE__ */ jsx(MdCheck, { size: 22, className: "text-primary" }),
67
70
  " ",
68
71
  option.value !== value && /* @__PURE__ */ jsx(
69
72
  MdCheck,
@@ -81,34 +84,44 @@ function SelectField({
81
84
  }
82
85
  );
83
86
  };
84
- return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsx("div", { className: "w-[500px] h-[600px] ", id: "parent", children: /* @__PURE__ */ jsxs(
87
+ return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsxs(
85
88
  "div",
86
89
  {
87
- className: " flex-col justify-start items-start gap-2 inline-flex w-full",
90
+ className: "min-h-30 flex-col justify-start items-start gap-1.5 w-full relative " + className,
88
91
  id: "component",
89
92
  ref,
90
93
  children: [
91
- /* @__PURE__ */ jsxs("div", { className: "self-stretch h-16 flex-col justify-start items-start gap-1.5 flex", children: [
94
+ /* @__PURE__ */ jsxs("div", { className: "self-stretch flex-col justify-start items-start gap-1.5 flex", children: [
92
95
  label && /* @__PURE__ */ jsx("div", { className: "text-slate-700 text-sm font-medium leading-tight", children: label }),
93
96
  /* @__PURE__ */ jsxs(
94
97
  "div",
95
98
  {
96
- className: `self-stretch px-3.5 py-2.5 bg-white rounded-lg shadow border justify-start items-center gap-2 inline-flex outline-none
99
+ className: `self-stretch w-full px-3 py-1 bg-white rounded-lg border justify-start items-center gap-0 inline-flex outline-none
97
100
  ${isFocused ? "outline-4 outline-indigo-200 outline-offset-0 border-indigo-300 " : ""}`,
98
101
  onClick: () => handleToggleFocus(),
99
102
  children: [
100
- /* @__PURE__ */ jsxs("div", { className: "grow shrink basis-0 h-6 justify-start items-center gap-2 flex", children: [
101
- /* @__PURE__ */ jsxs("div", { className: "text-gray-900 text-base font-medium leading-normal", children: [
103
+ /* @__PURE__ */ jsxs("div", { className: "grow shrink basis-0 min-h-5 xl:min-h-[32px] justify-start items-center gap-0 flex whitespace-nowrap w-[calc(100%-40px)] ", children: [
104
+ /* @__PURE__ */ jsxs("div", { className: "text-gray-900 text-sm font-medium leading-normal text-ellipsis overflow-hidden w-full", children: [
102
105
  currentlySelectedOption == null ? void 0 : currentlySelectedOption.label,
103
106
  !(currentlySelectedOption == null ? void 0 : currentlySelectedOption.label) && placeholder && /* @__PURE__ */ jsxs("span", { className: "text-slate-400 font-normal", children: [
104
107
  " ",
105
108
  placeholder
106
109
  ] })
107
110
  ] }),
108
- /* @__PURE__ */ jsx("div", { className: "text-slate-600 text-base font-normal leading-normal", children: currentlySelectedOption == null ? void 0 : currentlySelectedOption.description }),
109
- value && /* @__PURE__ */ jsx("div", { className: "pl-1.5", onClick: handleClear, children: /* @__PURE__ */ jsx(MdClose, {}) })
111
+ /* @__PURE__ */ jsx("div", { className: "text-slate-600 text-base font-normal leading-normal", children: currentlySelectedOption == null ? void 0 : currentlySelectedOption.description })
110
112
  ] }),
111
- /* @__PURE__ */ jsx("div", { className: "w-5 h-5 relative", children: /* @__PURE__ */ jsxs("div", { className: "absolute inset-0 flex items-center justify-center", children: [
113
+ value !== "" && value !== null && value !== void 0 && /* @__PURE__ */ jsxs(
114
+ "div",
115
+ {
116
+ className: "w-6 h-6 relative cursor-pointer ",
117
+ onClick: handleClear,
118
+ children: [
119
+ /* @__PURE__ */ jsx("div", { className: "absolute inset-0 flex items-center justify-center hover:bg-gray-100 w-6 rounded-full text-lg", children: /* @__PURE__ */ jsx(MdClose, {}) }),
120
+ " "
121
+ ]
122
+ }
123
+ ),
124
+ /* @__PURE__ */ jsx("div", { className: "w-6 h-6 relative cursor-pointer ", children: /* @__PURE__ */ jsxs("div", { className: "absolute inset-0 flex items-center justify-center hover:bg-gray-100 w-6 rounded-full text-lg", children: [
112
125
  isFocused && /* @__PURE__ */ jsx(MdExpandLess, {}),
113
126
  !isFocused && /* @__PURE__ */ jsx(MdExpandMore, {})
114
127
  ] }) })
@@ -117,10 +130,11 @@ function SelectField({
117
130
  )
118
131
  ] }),
119
132
  description && !isFocused && /* @__PURE__ */ jsx("div", { className: "self-stretch text-slate-600 text-sm font-normal leading-tight", children: description }),
133
+ errors[name] && /* @__PURE__ */ jsx("div", { className: "HintText self-stretch text-red-600 text-sm font-normal leading-tight", children: (_a = errors[name]) == null ? void 0 : _a.message }),
120
134
  isFocused && listOfOptions()
121
135
  ]
122
136
  }
123
- ) }) });
137
+ ) });
124
138
  }
125
139
  export {
126
140
  SelectField as default
@@ -1 +1 @@
1
- {"version":3,"file":"SelectField.js","sources":["../../../lib/components/form/SelectField.tsx"],"sourcesContent":["import * as React from \"react\";\r\nimport { UseFormReturn } from \"react-hook-form\";\r\nimport { IOptionItem } from \"../../types\";\r\nimport { MdCheck, MdClose, MdExpandLess, MdExpandMore } from \"react-icons/md\";\r\nimport { useClickAway } from \"react-use\";\r\n\r\nexport interface IFormFieldGlobalProps {\r\n label?: string;\r\n description?: string;\r\n name: string;\r\n type: string;\r\n value?: any;\r\n\r\n methods?: UseFormReturn<any>;\r\n\r\n disabled?: boolean;\r\n required?: boolean;\r\n clearable?: boolean;\r\n placeholder?: string;\r\n children?: React.ReactNode;\r\n className?: string;\r\n\r\n onInputChange: (\r\n e: React.ChangeEvent<\r\n HTMLInputElement | HTMLSelectElement | HTMLTextAreaElement | any\r\n >\r\n ) => void;\r\n}\r\n\r\nexport interface ISelectFieldProps extends IFormFieldGlobalProps {\r\n options?: IOptionItem[];\r\n valueKey?: string;\r\n labelKey?: string;\r\n}\r\n\r\nexport default function SelectField({\r\n label,\r\n name,\r\n value,\r\n description,\r\n onInputChange,\r\n options,\r\n placeholder,\r\n}: ISelectFieldProps) {\r\n const [isFocused, setIsFocused] = React.useState(false);\r\n const ref = React.useRef(null);\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 const handleToggleFocus = () => {\r\n setIsFocused((prev) => !prev);\r\n };\r\n\r\n useClickAway(ref, () => {\r\n setIsFocused(false);\r\n });\r\n\r\n const hangleChange = (option: IOptionItem) => {\r\n const tmp: any = {\r\n target: {\r\n value: option.value,\r\n name: name,\r\n },\r\n };\r\n\r\n onInputChange(tmp);\r\n setIsFocused(false);\r\n };\r\n const currentlySelectedOption = React.useMemo(() => {\r\n if (!value) return null;\r\n return options?.find((option) => option.value === value);\r\n }, [options, value]);\r\n\r\n const listOfOptions = () => {\r\n if (!options) return [];\r\n return (\r\n <div\r\n id=\"list\"\r\n className=\"max-h-[390px] bg-white rounded-lg shadow-xl border border-gray-200 justify-start items-start inline-flex overflow-auto w-full mt-[1px]\"\r\n >\r\n <div className=\"grow shrink basis-0 py-1 flex-col justify-start items-start inline-flex\">\r\n {options.map((option, index) => {\r\n return (\r\n <div\r\n className=\"group self-stretch px-1.5 py-px justify-start items-center inline-flex hover:bg-gray-50\"\r\n onClick={() => hangleChange(option)}\r\n key={index}\r\n >\r\n <div className=\"grow shrink basis-0 pl-2 pr-2.5 py-2.5 rounded-md flex-col justify-start items-start gap-2 inline-flex\">\r\n <div className=\"self-stretch justify-start items-center gap-2 inline-flex\">\r\n <div className=\"text-gray-900 text-base font-medium leading-normal\">\r\n {option.label}\r\n </div>\r\n {option.description && (\r\n <div className=\"text-slate-600 text-base font-normal leading-normal\">\r\n {option.description}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n <div className=\"w-5 h-5 relative\">\r\n {option.value === value && (\r\n <MdCheck size={22} className=\"text-primary\" />\r\n )}{\" \"}\r\n {option.value !== value && (\r\n <MdCheck\r\n size={22}\r\n className=\"text-transparent group-hover:text-gray-300\"\r\n />\r\n )}\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n );\r\n };\r\n\r\n return (\r\n <>\r\n <div className=\"w-[500px] h-[600px] \" id=\"parent\">\r\n <div\r\n className=\" flex-col justify-start items-start gap-2 inline-flex w-full\"\r\n id=\"component\"\r\n ref={ref}\r\n >\r\n <div className=\"self-stretch h-16 flex-col justify-start items-start gap-1.5 flex\">\r\n {label && (\r\n <div className=\"text-slate-700 text-sm font-medium leading-tight\">\r\n {label}\r\n </div>\r\n )}\r\n <div\r\n className={`self-stretch px-3.5 py-2.5 bg-white rounded-lg shadow border justify-start items-center gap-2 inline-flex outline-none \r\n ${isFocused ? \"outline-4 outline-indigo-200 outline-offset-0 border-indigo-300 \" : \"\"}`}\r\n onClick={() => handleToggleFocus()}\r\n >\r\n <div className=\"grow shrink basis-0 h-6 justify-start items-center gap-2 flex\">\r\n <div className=\"text-gray-900 text-base font-medium leading-normal\">\r\n {currentlySelectedOption?.label}\r\n {!currentlySelectedOption?.label && placeholder && (\r\n <span className=\"text-slate-400 font-normal\">\r\n {\" \"}\r\n {placeholder}\r\n </span>\r\n )}\r\n </div>\r\n <div className=\"text-slate-600 text-base font-normal leading-normal\">\r\n {currentlySelectedOption?.description}\r\n </div>\r\n {value && (\r\n <div className=\"pl-1.5\" onClick={handleClear}>\r\n <MdClose />\r\n </div>\r\n )}\r\n </div>\r\n <div className=\"w-5 h-5 relative\">\r\n <div className=\"absolute inset-0 flex items-center justify-center\">\r\n {isFocused && <MdExpandLess />}\r\n {!isFocused && <MdExpandMore />}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n {description && !isFocused && (\r\n <div className=\"self-stretch text-slate-600 text-sm font-normal leading-tight\">\r\n {description}\r\n </div>\r\n )}\r\n {isFocused && listOfOptions()}\r\n </div>\r\n </div>\r\n </>\r\n );\r\n}\r\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SelectField.js","sources":["../../../lib/components/form/SelectField.tsx"],"sourcesContent":["import * as React from \"react\";\r\nimport { IFormFieldGlobalProps, IOptionItem } from \"../../types\";\r\nimport { MdCheck, MdClose, MdExpandLess, MdExpandMore } from \"react-icons/md\";\r\nimport { useClickAway } from \"react-use\";\r\n\r\nexport interface ISelectFieldProps extends IFormFieldGlobalProps {\r\n options?: IOptionItem[];\r\n valueKey?: string;\r\n labelKey?: string;\r\n}\r\n\r\nexport default function SelectField({\r\n label,\r\n name,\r\n value,\r\n description,\r\n onInputChange,\r\n options,\r\n placeholder,\r\n className,\r\n errors = {},\r\n}: ISelectFieldProps) {\r\n const [isFocused, setIsFocused] = React.useState(false);\r\n const ref = React.useRef(null);\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 const handleToggleFocus = () => {\r\n setIsFocused((prev) => !prev);\r\n };\r\n\r\n useClickAway(ref, () => {\r\n setIsFocused(false);\r\n });\r\n\r\n const hangleChange = (option: IOptionItem) => {\r\n const tmp: any = {\r\n target: {\r\n value: option.value,\r\n name: name,\r\n },\r\n };\r\n\r\n onInputChange(tmp);\r\n setIsFocused(false);\r\n };\r\n const currentlySelectedOption = React.useMemo(() => {\r\n if (value === null || value === undefined || value === \"\") return null;\r\n return options?.find((option) => option.value === value);\r\n }, [options, value]);\r\n\r\n const listOfOptions = () => {\r\n if (!options) return [];\r\n return (\r\n <div\r\n id=\"list\"\r\n className=\"max-h-[390px] min-w-32 whitespace-nowrap fixed z-[100000] top-auto mt-[4px] bg-white rounded-lg shadow-xl border border-gray-200 justify-start items-start inline-flex overflow-auto \"\r\n >\r\n <div className=\"grow shrink basis-0 py-1 flex-col justify-start items-start inline-flex\">\r\n {options.map((option, index) => {\r\n return (\r\n <div\r\n className=\"group self-stretch px-1.5 py-px justify-start items-center inline-flex hover:bg-gray-50 \"\r\n onClick={() => hangleChange(option)}\r\n key={index}\r\n >\r\n <div className=\"grow shrink basis-0 px-1 py-2 rounded-md flex-col justify-start items-start gap-2 inline-flex\">\r\n <div className=\"self-stretch justify-start items-center gap-2 inline-flex\">\r\n <div className=\"text-gray-900 text-sm font-medium leading-normal\">\r\n {option.label}\r\n </div>\r\n {option.description && (\r\n <div className=\"text-slate-600 sm-base font-normal leading-normal\">\r\n {option.description}\r\n </div>\r\n )}\r\n </div>\r\n </div>\r\n <div className=\"w-5 h-5 relative\">\r\n {option.value === value && value !== \"\" && (\r\n <MdCheck size={22} className=\"text-primary\" />\r\n )}{\" \"}\r\n {option.value !== value && (\r\n <MdCheck\r\n size={22}\r\n className=\"text-transparent group-hover:text-gray-300\"\r\n />\r\n )}\r\n </div>\r\n </div>\r\n );\r\n })}\r\n </div>\r\n </div>\r\n );\r\n };\r\n\r\n return (\r\n <>\r\n <div\r\n className={\r\n \"min-h-30 flex-col justify-start items-start gap-1.5 w-full relative \" +\r\n className\r\n }\r\n id=\"component\"\r\n ref={ref}\r\n >\r\n <div className=\"self-stretch flex-col justify-start items-start gap-1.5 flex\">\r\n {label && (\r\n <div className=\"text-slate-700 text-sm font-medium leading-tight\">\r\n {label}\r\n </div>\r\n )}\r\n <div\r\n className={`self-stretch w-full px-3 py-1 bg-white rounded-lg border justify-start items-center gap-0 inline-flex outline-none \r\n ${isFocused ? \"outline-4 outline-indigo-200 outline-offset-0 border-indigo-300 \" : \"\"}`}\r\n onClick={() => handleToggleFocus()}\r\n >\r\n <div className=\"grow shrink basis-0 min-h-5 xl:min-h-[32px] justify-start items-center gap-0 flex whitespace-nowrap w-[calc(100%-40px)] \">\r\n <div className=\"text-gray-900 text-sm font-medium leading-normal text-ellipsis overflow-hidden w-full\">\r\n {currentlySelectedOption?.label}\r\n {!currentlySelectedOption?.label && placeholder && (\r\n <span className=\"text-slate-400 font-normal\">\r\n {\" \"}\r\n {placeholder}\r\n </span>\r\n )}\r\n </div>\r\n <div className=\"text-slate-600 text-base font-normal leading-normal\">\r\n {currentlySelectedOption?.description}\r\n </div>\r\n </div>\r\n {value !== \"\" && value !== null && value !== undefined && (\r\n <div\r\n className=\"w-6 h-6 relative cursor-pointer \"\r\n onClick={handleClear}\r\n >\r\n <div className=\"absolute inset-0 flex items-center justify-center hover:bg-gray-100 w-6 rounded-full text-lg\">\r\n <MdClose />\r\n </div>{\" \"}\r\n </div>\r\n )}\r\n <div className=\"w-6 h-6 relative cursor-pointer \">\r\n <div className=\"absolute inset-0 flex items-center justify-center hover:bg-gray-100 w-6 rounded-full text-lg\">\r\n {isFocused && <MdExpandLess />}\r\n {!isFocused && <MdExpandMore />}\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n {description && !isFocused && (\r\n <div className=\"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 {isFocused && listOfOptions()}\r\n </div>\r\n </>\r\n );\r\n}\r\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { default as React } from 'react';
2
+
3
+ interface IconInCircleProps {
4
+ isComplete: boolean;
5
+ isPending?: boolean;
6
+ size?: number;
7
+ title?: string;
8
+ }
9
+ declare const IconInCircle: React.FC<IconInCircleProps>;
10
+ export default IconInCircle;
@@ -0,0 +1,24 @@
1
+ import { jsx } from "react/jsx-runtime";
2
+ import { k as MdOutlinePending, j as MdCheck } from "../../index-ClXm2PIX.js";
3
+ const IconInCircle = ({
4
+ isComplete,
5
+ size = 20,
6
+ title,
7
+ isPending
8
+ }) => {
9
+ if (!isComplete && !isPending)
10
+ return "";
11
+ return /* @__PURE__ */ jsx(
12
+ "div",
13
+ {
14
+ className: "p-2 rounded-full border text-success flex items-center justify-center text-2xl ",
15
+ style: { width: 2 * size, height: 2 * size },
16
+ title: title || "",
17
+ children: isPending ? /* @__PURE__ */ jsx(MdOutlinePending, { size }) : /* @__PURE__ */ jsx(MdCheck, { size })
18
+ }
19
+ );
20
+ };
21
+ export {
22
+ IconInCircle as default
23
+ };
24
+ //# sourceMappingURL=IconInCircle.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"IconInCircle.js","sources":["../../../lib/components/layout/IconInCircle.tsx"],"sourcesContent":["import React from \"react\";\r\nimport { MdCheck, MdOutlinePending } from \"react-icons/md\";\r\n\r\ninterface IconInCircleProps {\r\n isComplete: boolean;\r\n isPending?: boolean;\r\n size?: number;\r\n title?: string;\r\n}\r\n\r\nconst IconInCircle: React.FC<IconInCircleProps> = ({\r\n isComplete,\r\n size = 20,\r\n title,\r\n isPending,\r\n}) => {\r\n if (!isComplete && !isPending) return \"\";\r\n return (\r\n <div\r\n className=\"p-2 rounded-full border text-success flex items-center justify-center text-2xl \"\r\n style={{ width: 2 * size, height: 2 * size }}\r\n title={title || \"\"}\r\n >\r\n {isPending ? <MdOutlinePending size={size} /> : <MdCheck size={size} />}\r\n </div>\r\n );\r\n};\r\n\r\nexport default IconInCircle;\r\n"],"names":[],"mappings":";;AAUA,MAAM,eAA4C,CAAC;AAAA,EACjD;AAAA,EACA,OAAO;AAAA,EACP;AAAA,EACA;AACF,MAAM;AACA,MAAA,CAAC,cAAc,CAAC;AAAkB,WAAA;AAEpC,SAAA;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,WAAU;AAAA,MACV,OAAO,EAAE,OAAO,IAAI,MAAM,QAAQ,IAAI,KAAK;AAAA,MAC3C,OAAO,SAAS;AAAA,MAEf,sBAAa,oBAAA,kBAAA,EAAiB,MAAY,IAAK,oBAAC,WAAQ,MAAY;AAAA,IAAA;AAAA,EAAA;AAG3E;"}
@@ -0,0 +1,9 @@
1
+ import { IProfileApprover, IStep } from '../../main';
2
+
3
+ interface ProfileOverviewProps {
4
+ employeeId?: number;
5
+ onProfileApproversChange?: (data: IProfileApprover[]) => void;
6
+ steps: IStep[];
7
+ }
8
+ export default function ProfileOverview({ employeeId, onProfileApproversChange, steps, }: ProfileOverviewProps): import("react/jsx-runtime").JSX.Element;
9
+ export {};
@@ -0,0 +1,180 @@
1
+ import { jsxs, Fragment, jsx } from "react/jsx-runtime";
2
+ import { useState, useMemo, useEffect } from "react";
3
+ import SectionTitle from "../layout/SectionTitle.js";
4
+ import '../../assets/tailwind.css';/* empty css */
5
+ import "../../contexts/FederationContext.js";
6
+ import { useFederationContext } from "../../contexts/useFederationContext.js";
7
+ import { getFullName } from "../../utils/getFullName.js";
8
+ import { handleErrors } from "../../utils/handleErrors.js";
9
+ import { EApproverRoles } from "../../types.js";
10
+ import IconInCircle from "../layout/IconInCircle.js";
11
+ const approverRoleGroups = [
12
+ {
13
+ name: "Předschvalovatelé",
14
+ roles: [EApproverRoles.predschvalovatel],
15
+ all: true,
16
+ parallel: true,
17
+ stepType: 1
18
+ },
19
+ {
20
+ name: "Schvalovatelé",
21
+ roles: [
22
+ EApproverRoles.vedouci,
23
+ EApproverRoles.zastupce,
24
+ EApproverRoles.zastupce9,
25
+ EApproverRoles.vyssiSchvalovatel,
26
+ EApproverRoles.vyssiSchvalovatelZastupce,
27
+ EApproverRoles.vyssiSchvalovatelZastupce9
28
+ ],
29
+ all: false,
30
+ parallel: true,
31
+ stepType: 2
32
+ },
33
+ {
34
+ name: "Docházkový vedoucí",
35
+ roles: [EApproverRoles.dochazkovyVedouci],
36
+ all: true,
37
+ parallel: false,
38
+ stepType: 3
39
+ }
40
+ ];
41
+ function ProfileOverview({
42
+ employeeId,
43
+ onProfileApproversChange,
44
+ steps
45
+ }) {
46
+ const [profileApprovers, setProfileApprovers] = useState([]);
47
+ const context = useFederationContext();
48
+ const currentApprovers = useMemo(() => {
49
+ return approverRoleGroups.map((group) => {
50
+ const groupApprovers = profileApprovers.filter(
51
+ (approver) => group.roles.includes(approver.role)
52
+ );
53
+ const groupApprovedSteps = steps.filter(
54
+ (step) => step.type == group.stepType && groupApprovers.some(
55
+ (approver) => {
56
+ var _a;
57
+ return step.employee.employeeId == ((_a = approver == null ? void 0 : approver.approver) == null ? void 0 : _a.employeeId);
58
+ }
59
+ )
60
+ );
61
+ return {
62
+ ...group,
63
+ numberOfApprovers: groupApprovers.length,
64
+ numberOfApprovedSteps: groupApprovedSteps.length,
65
+ isComplete: group.all && groupApprovers.length == groupApprovedSteps.length || !group.all && groupApprovedSteps.length > 0
66
+ };
67
+ });
68
+ }, [approverRoleGroups, profileApprovers]);
69
+ useEffect(() => {
70
+ context.apiClient.get(
71
+ "/timeoff/approve-profile" + (employeeId ? "/" + employeeId : "")
72
+ ).then((response) => {
73
+ setProfileApprovers(response.data);
74
+ }).catch((error) => {
75
+ handleErrors(
76
+ error,
77
+ context.emitter,
78
+ "Nepodařilo se dohledat schvalovací profil pro uživatele " + employeeId
79
+ );
80
+ console.error("Error submitting form:", error);
81
+ });
82
+ }, [employeeId]);
83
+ const decisionsTranslations = (decision) => {
84
+ const translations = {
85
+ approved: "Schváleno",
86
+ rejected: "Zamítnuto",
87
+ cancelled: "Stornováno",
88
+ evided: "Zaevidováno"
89
+ };
90
+ return translations[decision] || null;
91
+ };
92
+ useEffect(() => {
93
+ if (onProfileApproversChange)
94
+ onProfileApproversChange(profileApprovers);
95
+ }, [profileApprovers, onProfileApproversChange]);
96
+ const findStep = (steps2, group, row) => {
97
+ return steps2.find(
98
+ (step) => {
99
+ var _a, _b;
100
+ return step.type == group.stepType && step.employee.employeeId == ((_b = (_a = row.position) == null ? void 0 : _a.employee) == null ? void 0 : _b.employeeId);
101
+ }
102
+ );
103
+ };
104
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
105
+ /* @__PURE__ */ jsx(SectionTitle, { children: "Postup schvalování" }),
106
+ /* @__PURE__ */ jsx("div", { className: "flex gap-4", children: currentApprovers.map((group, index) => /* @__PURE__ */ jsxs(
107
+ "div",
108
+ {
109
+ className: "w-full xl:w-1/3 rounded-lg shadow-xl p-5 border gap-4 flex flex-col ",
110
+ children: [
111
+ /* @__PURE__ */ jsxs("div", { className: "flex justify-between", children: [
112
+ /* @__PURE__ */ jsxs("h3", { className: "text-xl font-bold", children: [
113
+ group.name,
114
+ " - ",
115
+ index
116
+ ] }),
117
+ /* @__PURE__ */ jsx(
118
+ IconInCircle,
119
+ {
120
+ isComplete: group.isComplete,
121
+ title: group.numberOfApprovedSteps + " / " + group.numberOfApprovers,
122
+ isPending: !group.isComplete
123
+ }
124
+ )
125
+ ] }),
126
+ profileApprovers.filter((it) => group.roles.includes(it.role)).map((row, index2) => {
127
+ var _a, _b, _c, _d, _e, _f;
128
+ return /* @__PURE__ */ jsxs(
129
+ "div",
130
+ {
131
+ className: " border rounded-lg p-4 flex justify-between gap-5",
132
+ children: [
133
+ /* @__PURE__ */ jsxs("div", { children: [
134
+ /* @__PURE__ */ jsx("h3", { className: "", children: getFullName((_a = row.position) == null ? void 0 : _a.employee, true) }),
135
+ /* @__PURE__ */ jsx("p", { className: "text-sm ", children: row.roleTxt }),
136
+ findStep(steps, group, row) && /* @__PURE__ */ jsxs(Fragment, { children: [
137
+ /* @__PURE__ */ jsx("p", { className: "text-sm " }),
138
+ " ",
139
+ ((_b = findStep(steps, group, row)) == null ? void 0 : _b.decision) && /* @__PURE__ */ jsxs("p", { className: "text-sm ", children: [
140
+ decisionsTranslations(
141
+ ((_c = findStep(steps, group, row)) == null ? void 0 : _c.decision) || ""
142
+ ),
143
+ " ",
144
+ "(",
145
+ new Date(
146
+ ((_d = findStep(steps, group, row)) == null ? void 0 : _d.date) || 0
147
+ ).toLocaleString(),
148
+ ")"
149
+ ] }),
150
+ ((_e = findStep(steps, group, row)) == null ? void 0 : _e.comment) && /* @__PURE__ */ jsxs("p", { className: "text-sm ", children: [
151
+ /* @__PURE__ */ jsx("b", { children: "Komentář" }),
152
+ ":",
153
+ " ",
154
+ (_f = findStep(steps, group, row)) == null ? void 0 : _f.comment,
155
+ " "
156
+ ] })
157
+ ] })
158
+ ] }),
159
+ /* @__PURE__ */ jsx(
160
+ IconInCircle,
161
+ {
162
+ isComplete: findStep(steps, group, row) != null,
163
+ isPending: !group.isComplete
164
+ }
165
+ )
166
+ ]
167
+ },
168
+ index2
169
+ );
170
+ })
171
+ ]
172
+ },
173
+ group.name
174
+ )) })
175
+ ] });
176
+ }
177
+ export {
178
+ ProfileOverview as default
179
+ };
180
+ //# sourceMappingURL=ProfileOverview.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProfileOverview.js","sources":["../../../lib/components/profiles/ProfileOverview.tsx"],"sourcesContent":["import { useEffect, useMemo, useState } from \"react\";\r\nimport SectionTitle from \"../layout/SectionTitle\";\r\nimport {\r\n EApproverRoles,\r\n IProfileApprover,\r\n IStep,\r\n getFullName,\r\n handleErrors,\r\n useFederationContext,\r\n} from \"../../main\";\r\nimport { AxiosResponse } from \"axios\";\r\nimport IconInCircle from \"../layout/IconInCircle\";\r\n\r\ninterface ProfileOverviewProps {\r\n employeeId?: number;\r\n onProfileApproversChange?: (data: IProfileApprover[]) => void;\r\n steps: IStep[];\r\n}\r\n\r\ninterface IApproverRoleGroup {\r\n name: string;\r\n roles: EApproverRoles[];\r\n all: boolean;\r\n parallel: boolean;\r\n stepType: number;\r\n}\r\n\r\nconst approverRoleGroups: IApproverRoleGroup[] = [\r\n {\r\n name: \"Předschvalovatelé\",\r\n roles: [EApproverRoles.predschvalovatel],\r\n all: true,\r\n parallel: true,\r\n stepType: 1,\r\n },\r\n {\r\n name: \"Schvalovatelé\",\r\n roles: [\r\n EApproverRoles.vedouci,\r\n EApproverRoles.zastupce,\r\n EApproverRoles.zastupce9,\r\n EApproverRoles.vyssiSchvalovatel,\r\n EApproverRoles.vyssiSchvalovatelZastupce,\r\n EApproverRoles.vyssiSchvalovatelZastupce9,\r\n ],\r\n all: false,\r\n parallel: true,\r\n stepType: 2,\r\n },\r\n {\r\n name: \"Docházkový vedoucí\",\r\n roles: [EApproverRoles.dochazkovyVedouci],\r\n all: true,\r\n parallel: false,\r\n stepType: 3,\r\n },\r\n];\r\n\r\nexport default function ProfileOverview({\r\n employeeId,\r\n onProfileApproversChange,\r\n steps,\r\n}: ProfileOverviewProps) {\r\n const [profileApprovers, setProfileApprovers] = useState<\r\n Array<IProfileApprover>\r\n >([]);\r\n const context = useFederationContext();\r\n\r\n const currentApprovers = useMemo(() => {\r\n return approverRoleGroups.map((group) => {\r\n const groupApprovers = profileApprovers.filter((approver) =>\r\n group.roles.includes(approver.role)\r\n );\r\n\r\n const groupApprovedSteps = steps.filter(\r\n (step) =>\r\n step.type == group.stepType &&\r\n groupApprovers.some(\r\n (approver) =>\r\n step.employee.employeeId == approver?.approver?.employeeId\r\n )\r\n );\r\n\r\n return {\r\n ...group,\r\n numberOfApprovers: groupApprovers.length,\r\n numberOfApprovedSteps: groupApprovedSteps.length,\r\n isComplete:\r\n (group.all && groupApprovers.length == groupApprovedSteps.length) ||\r\n (!group.all && groupApprovedSteps.length > 0),\r\n };\r\n });\r\n }, [approverRoleGroups, profileApprovers]);\r\n\r\n useEffect(() => {\r\n context.apiClient\r\n .get<IProfileApprover[]>(\r\n \"/timeoff/approve-profile\" + (employeeId ? \"/\" + employeeId : \"\")\r\n )\r\n .then((response: AxiosResponse) => {\r\n setProfileApprovers(response.data);\r\n })\r\n .catch((error) => {\r\n handleErrors(\r\n error,\r\n context.emitter,\r\n \"Nepodařilo se dohledat schvalovací profil pro uživatele \" +\r\n employeeId\r\n );\r\n console.error(\"Error submitting form:\", error);\r\n });\r\n }, [employeeId]);\r\n\r\n const decisionsTranslations = (decision: string): string | null => {\r\n const translations: { [key: string]: string } = {\r\n approved: \"Schváleno\",\r\n rejected: \"Zamítnuto\",\r\n cancelled: \"Stornováno\",\r\n evided: \"Zaevidováno\",\r\n };\r\n\r\n return translations[decision] || null;\r\n };\r\n // pri nacteni profileApprovers se muze dat vedet parent componente inbfo o aktualnich schvalovatelich\r\n useEffect(() => {\r\n if (onProfileApproversChange) onProfileApproversChange(profileApprovers);\r\n }, [profileApprovers, onProfileApproversChange]);\r\n\r\n const findStep = (\r\n steps: IStep[],\r\n group: IApproverRoleGroup,\r\n row: IProfileApprover\r\n ) => {\r\n return steps.find(\r\n (step) =>\r\n step.type == group.stepType &&\r\n step.employee.employeeId == row.position?.employee?.employeeId\r\n );\r\n };\r\n\r\n return (\r\n <>\r\n <SectionTitle>Postup schvalování</SectionTitle>\r\n <div className=\"flex gap-4\">\r\n {currentApprovers.map((group, index) => (\r\n <div\r\n key={group.name}\r\n className={\r\n \"w-full xl:w-1/3 rounded-lg shadow-xl p-5 border gap-4 flex flex-col \"\r\n }\r\n >\r\n <div className=\"flex justify-between\">\r\n <h3 className=\"text-xl font-bold\">\r\n {group.name} - {index}\r\n </h3>\r\n\r\n <IconInCircle\r\n isComplete={group.isComplete}\r\n title={\r\n group.numberOfApprovedSteps + \" / \" + group.numberOfApprovers\r\n }\r\n isPending={!group.isComplete}\r\n ></IconInCircle>\r\n </div>\r\n {profileApprovers\r\n .filter((it) => group.roles.includes(it.role))\r\n .map((row, index) => (\r\n <div\r\n key={index}\r\n className=\" border rounded-lg p-4 flex justify-between gap-5\"\r\n >\r\n <div>\r\n <h3 className=\"\">\r\n {getFullName(row.position?.employee, true)}\r\n </h3>\r\n <p className=\"text-sm \">{row.roleTxt}</p>\r\n {findStep(steps, group, row) && (\r\n <>\r\n <p className=\"text-sm \"></p>{\" \"}\r\n {findStep(steps, group, row)?.decision && (\r\n <p className=\"text-sm \">\r\n {decisionsTranslations(\r\n findStep(steps, group, row)?.decision || \"\"\r\n )}{\" \"}\r\n (\r\n {new Date(\r\n findStep(steps, group, row)?.date || 0\r\n ).toLocaleString()}\r\n )\r\n </p>\r\n )}\r\n {findStep(steps, group, row)?.comment && (\r\n <p className=\"text-sm \">\r\n <b>Komentář</b>:{\" \"}\r\n {findStep(steps, group, row)?.comment}{\" \"}\r\n </p>\r\n )}\r\n </>\r\n )}\r\n </div>\r\n <IconInCircle\r\n isComplete={findStep(steps, group, row) != null}\r\n isPending={!group.isComplete}\r\n />\r\n </div>\r\n ))}\r\n </div>\r\n ))}\r\n </div>\r\n </>\r\n );\r\n}\r\n"],"names":["steps","index"],"mappings":"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"}
@@ -38,19 +38,23 @@ function MdOutlineFilterAltOff(props) {
38
38
  function MdOutlineFilterAlt(props) {
39
39
  return GenIcon({ "tag": "svg", "attr": { "viewBox": "0 0 24 24" }, "child": [{ "tag": "path", "attr": { "fill": "none", "d": "M0 0h24m0 24H0" }, "child": [] }, { "tag": "path", "attr": { "d": "M7 6h10l-5.01 6.3L7 6zm-2.75-.39C6.27 8.2 10 13 10 13v6c0 .55.45 1 1 1h2c.55 0 1-.45 1-1v-6s3.72-4.8 5.74-7.39A.998.998 0 0 0 18.95 4H5.04c-.83 0-1.3.95-.79 1.61z" }, "child": [] }, { "tag": "path", "attr": { "fill": "none", "d": "M0 0h24v24H0V0z" }, "child": [] }] })(props);
40
40
  }
41
+ function MdOutlinePending(props) {
42
+ return GenIcon({ "tag": "svg", "attr": { "viewBox": "0 0 24 24" }, "child": [{ "tag": "path", "attr": { "fill": "none", "d": "M0 0h24v24H0z" }, "child": [] }, { "tag": "path", "attr": { "d": "M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.42 0-8-3.58-8-8s3.58-8 8-8 8 3.58 8 8-3.58 8-8 8z" }, "child": [] }, { "tag": "circle", "attr": { "cx": "7", "cy": "12", "r": "1.5" }, "child": [] }, { "tag": "circle", "attr": { "cx": "12", "cy": "12", "r": "1.5" }, "child": [] }, { "tag": "circle", "attr": { "cx": "17", "cy": "12", "r": "1.5" }, "child": [] }] })(props);
43
+ }
41
44
  export {
42
- MdClose as M,
43
- MdExpandLess as a,
44
- MdExpandMore as b,
45
- MdCheck as c,
46
- MdOutlineFilterAlt as d,
47
- MdOutlineFilterAltOff as e,
48
- MdSearch as f,
49
- MdArrowBack as g,
50
- MdArrowForward as h,
51
- MdArrowUpward as i,
52
- MdArrowDownward as j,
53
- MdInsertDriveFile as k,
54
- MdDeleteOutline as l
45
+ MdExpandLess as M,
46
+ MdExpandMore as a,
47
+ MdClose as b,
48
+ MdOutlineFilterAlt as c,
49
+ MdOutlineFilterAltOff as d,
50
+ MdSearch as e,
51
+ MdArrowBack as f,
52
+ MdArrowForward as g,
53
+ MdArrowUpward as h,
54
+ MdArrowDownward as i,
55
+ MdCheck as j,
56
+ MdOutlinePending as k,
57
+ MdInsertDriveFile as l,
58
+ MdDeleteOutline as m
55
59
  };
56
- //# sourceMappingURL=index-qxZYrVct.js.map
60
+ //# sourceMappingURL=index-ClXm2PIX.js.map