wcz-layout 6.7.2 → 9.4.2

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 (271) hide show
  1. package/dist/Approval-Co6D1BNq.mjs +194 -0
  2. package/dist/Approval-Co6D1BNq.mjs.map +1 -0
  3. package/dist/DialogsContext-DLqA8RJ_.mjs +7 -0
  4. package/dist/DialogsContext-DLqA8RJ_.mjs.map +1 -0
  5. package/dist/Email-BzQQkbe9.mjs +20 -0
  6. package/dist/Email-BzQQkbe9.mjs.map +1 -0
  7. package/dist/FileMeta-DDqUju1Y.mjs +19 -0
  8. package/dist/FileMeta-DDqUju1Y.mjs.map +1 -0
  9. package/dist/FileMeta-ILLTOjaM.d.mts +20 -0
  10. package/dist/NotificationContext-CgwUOeW0.mjs +7 -0
  11. package/dist/NotificationContext-CgwUOeW0.mjs.map +1 -0
  12. package/dist/QueryClientParam-CzaM3akD.d.mts +11 -0
  13. package/dist/RouterListItemButton-owZVvuC_.mjs +78 -0
  14. package/dist/RouterListItemButton-owZVvuC_.mjs.map +1 -0
  15. package/dist/User-1gKoYJvW.d.mts +12 -0
  16. package/dist/auth.d.mts +25 -0
  17. package/dist/auth.mjs +88 -0
  18. package/dist/auth.mjs.map +1 -0
  19. package/dist/authMiddleware--HdlhhZO.mjs +78 -0
  20. package/dist/authMiddleware--HdlhhZO.mjs.map +1 -0
  21. package/dist/components.d.mts +107 -0
  22. package/dist/components.mjs +1500 -0
  23. package/dist/components.mjs.map +1 -0
  24. package/dist/data/client.d.mts +3217 -0
  25. package/dist/data/client.mjs +187 -0
  26. package/dist/data/client.mjs.map +1 -0
  27. package/dist/data/server.d.mts +19 -0
  28. package/dist/data/server.mjs +16 -0
  29. package/dist/data/server.mjs.map +1 -0
  30. package/dist/entra-s4ZjHq5o.mjs +101 -0
  31. package/dist/entra-s4ZjHq5o.mjs.map +1 -0
  32. package/dist/env-CoveIivr.mjs +30 -0
  33. package/dist/env-CoveIivr.mjs.map +1 -0
  34. package/dist/file-C5-a_6W6.mjs +148 -0
  35. package/dist/file-C5-a_6W6.mjs.map +1 -0
  36. package/dist/file-DM1x40eJ.mjs +179 -0
  37. package/dist/file-DM1x40eJ.mjs.map +1 -0
  38. package/dist/hooks.d.mts +226 -0
  39. package/dist/hooks.mjs +1087 -0
  40. package/dist/hooks.mjs.map +1 -0
  41. package/dist/index.d.mts +48 -0
  42. package/dist/index.mjs +1944 -0
  43. package/dist/index.mjs.map +1 -0
  44. package/dist/middleware.d.mts +46 -0
  45. package/dist/middleware.mjs +27 -0
  46. package/dist/middleware.mjs.map +1 -0
  47. package/dist/models.d.mts +598 -0
  48. package/dist/models.mjs +74 -0
  49. package/dist/models.mjs.map +1 -0
  50. package/dist/msalServer-CkNOOjjH.mjs +44 -0
  51. package/dist/msalServer-CkNOOjjH.mjs.map +1 -0
  52. package/dist/peoplesoft-DIe8H1Nu.mjs +240 -0
  53. package/dist/peoplesoft-DIe8H1Nu.mjs.map +1 -0
  54. package/dist/peoplesoft-gKd-Jh5L.d.mts +1219 -0
  55. package/dist/useDialogs-BUzVrTSP.mjs +248 -0
  56. package/dist/useDialogs-BUzVrTSP.mjs.map +1 -0
  57. package/dist/user-Cen43mlr.d.mts +19 -0
  58. package/dist/utils-2XiozDlV.mjs +156 -0
  59. package/dist/utils-2XiozDlV.mjs.map +1 -0
  60. package/dist/utils-BuWEQOuy.d.mts +65 -0
  61. package/dist/utils.d.mts +5 -0
  62. package/dist/utils.mjs +5 -0
  63. package/dist/vite.d.mts +7 -0
  64. package/dist/vite.mjs +182 -0
  65. package/dist/vite.mjs.map +1 -0
  66. package/package.json +129 -62
  67. package/skills/client-db/SKILL.md +93 -0
  68. package/skills/data-grid/SKILL.md +142 -0
  69. package/skills/db-schema/SKILL.md +71 -0
  70. package/skills/dialogs/SKILL.md +79 -0
  71. package/skills/forms/SKILL.md +82 -0
  72. package/skills/general/SKILL.md +17 -0
  73. package/skills/notifications/SKILL.md +43 -0
  74. package/skills/routing/SKILL.md +128 -0
  75. package/skills/server-functions/SKILL.md +113 -0
  76. package/skills/services/SKILL.md +30 -0
  77. package/skills/services/docs/approval.md +257 -0
  78. package/skills/services/docs/email.md +32 -0
  79. package/skills/services/docs/file.md +81 -0
  80. package/skills/services/docs/peoplesoft.md +110 -0
  81. package/skills/start/SKILL.md +46 -0
  82. package/skills/start/steps/01-git-setup.md +11 -0
  83. package/skills/start/steps/02-project-name-setup.md +14 -0
  84. package/skills/start/steps/03-apm-setup.md +208 -0
  85. package/skills/start/steps/04-database-setup.md +39 -0
  86. package/skills/start/steps/05-entra-setup.md +59 -0
  87. package/skills/start/steps/06-vault-setup.md +70 -0
  88. package/skills/start/steps/07-generate-favicon.md +10 -0
  89. package/skills/start/steps/08-commit.md +15 -0
  90. package/dist/src/components/Layout.d.ts +0 -16
  91. package/dist/src/components/Layout.js +0 -122
  92. package/dist/src/components/Layout.js.map +0 -1
  93. package/dist/src/components/dataGrid/ChipInputCell.d.ts +0 -9
  94. package/dist/src/components/dataGrid/ChipInputCell.js +0 -17
  95. package/dist/src/components/dataGrid/ChipInputCell.js.map +0 -1
  96. package/dist/src/components/dataGrid/EditableColumnHeader.d.ts +0 -2
  97. package/dist/src/components/dataGrid/EditableColumnHeader.js +0 -7
  98. package/dist/src/components/dataGrid/EditableColumnHeader.js.map +0 -1
  99. package/dist/src/components/dataGrid/GridToolbar.d.ts +0 -8
  100. package/dist/src/components/dataGrid/GridToolbar.js +0 -40
  101. package/dist/src/components/dataGrid/GridToolbar.js.map +0 -1
  102. package/dist/src/components/dataGrid/TableContainer.d.ts +0 -3
  103. package/dist/src/components/dataGrid/TableContainer.js +0 -32
  104. package/dist/src/components/dataGrid/TableContainer.js.map +0 -1
  105. package/dist/src/components/form/FormAutocomplete.d.ts +0 -7
  106. package/dist/src/components/form/FormAutocomplete.js +0 -10
  107. package/dist/src/components/form/FormAutocomplete.js.map +0 -1
  108. package/dist/src/components/form/FormCheckbox.d.ts +0 -7
  109. package/dist/src/components/form/FormCheckbox.js +0 -11
  110. package/dist/src/components/form/FormCheckbox.js.map +0 -1
  111. package/dist/src/components/form/FormDatePicker.d.ts +0 -9
  112. package/dist/src/components/form/FormDatePicker.js +0 -19
  113. package/dist/src/components/form/FormDatePicker.js.map +0 -1
  114. package/dist/src/components/form/FormDateTimePicker.d.ts +0 -9
  115. package/dist/src/components/form/FormDateTimePicker.js +0 -19
  116. package/dist/src/components/form/FormDateTimePicker.js.map +0 -1
  117. package/dist/src/components/form/FormNumberField.d.ts +0 -12
  118. package/dist/src/components/form/FormNumberField.js +0 -12
  119. package/dist/src/components/form/FormNumberField.js.map +0 -1
  120. package/dist/src/components/form/FormRadioGroup.d.ts +0 -13
  121. package/dist/src/components/form/FormRadioGroup.js +0 -11
  122. package/dist/src/components/form/FormRadioGroup.js.map +0 -1
  123. package/dist/src/components/form/FormSlider.d.ts +0 -7
  124. package/dist/src/components/form/FormSlider.js +0 -11
  125. package/dist/src/components/form/FormSlider.js.map +0 -1
  126. package/dist/src/components/form/FormSubmitButton.d.ts +0 -5
  127. package/dist/src/components/form/FormSubmitButton.js +0 -13
  128. package/dist/src/components/form/FormSubmitButton.js.map +0 -1
  129. package/dist/src/components/form/FormSwitch.d.ts +0 -7
  130. package/dist/src/components/form/FormSwitch.js +0 -11
  131. package/dist/src/components/form/FormSwitch.js.map +0 -1
  132. package/dist/src/components/form/FormTextField.d.ts +0 -7
  133. package/dist/src/components/form/FormTextField.js +0 -11
  134. package/dist/src/components/form/FormTextField.js.map +0 -1
  135. package/dist/src/components/layout/AccountMenu.d.ts +0 -9
  136. package/dist/src/components/layout/AccountMenu.js +0 -44
  137. package/dist/src/components/layout/AccountMenu.js.map +0 -1
  138. package/dist/src/components/layout/DevelopmentBanner.d.ts +0 -7
  139. package/dist/src/components/layout/DevelopmentBanner.js +0 -29
  140. package/dist/src/components/layout/DevelopmentBanner.js.map +0 -1
  141. package/dist/src/components/layout/ErrorPage.d.ts +0 -2
  142. package/dist/src/components/layout/ErrorPage.js +0 -25
  143. package/dist/src/components/layout/ErrorPage.js.map +0 -1
  144. package/dist/src/components/layout/LayoutDialog.d.ts +0 -12
  145. package/dist/src/components/layout/LayoutDialog.js +0 -12
  146. package/dist/src/components/layout/LayoutDialog.js.map +0 -1
  147. package/dist/src/components/layout/LayoutSnackbar.d.ts +0 -8
  148. package/dist/src/components/layout/LayoutSnackbar.js +0 -25
  149. package/dist/src/components/layout/LayoutSnackbar.js.map +0 -1
  150. package/dist/src/components/layout/NavigationDrawer.d.ts +0 -11
  151. package/dist/src/components/layout/NavigationDrawer.js +0 -70
  152. package/dist/src/components/layout/NavigationDrawer.js.map +0 -1
  153. package/dist/src/components/layout/NotificationMenu.d.ts +0 -8
  154. package/dist/src/components/layout/NotificationMenu.js +0 -26
  155. package/dist/src/components/layout/NotificationMenu.js.map +0 -1
  156. package/dist/src/components/layout/TypographyWithIcon.d.ts +0 -7
  157. package/dist/src/components/layout/TypographyWithIcon.js +0 -22
  158. package/dist/src/components/layout/TypographyWithIcon.js.map +0 -1
  159. package/dist/src/components/layout/Unauthorized.d.ts +0 -2
  160. package/dist/src/components/layout/Unauthorized.js +0 -26
  161. package/dist/src/components/layout/Unauthorized.js.map +0 -1
  162. package/dist/src/contexts/LayoutContext.d.ts +0 -40
  163. package/dist/src/contexts/LayoutContext.js +0 -60
  164. package/dist/src/contexts/LayoutContext.js.map +0 -1
  165. package/dist/src/contexts/UserContext.d.ts +0 -24
  166. package/dist/src/contexts/UserContext.js +0 -55
  167. package/dist/src/contexts/UserContext.js.map +0 -1
  168. package/dist/src/hooks/FormHooks.d.ts +0 -46
  169. package/dist/src/hooks/FormHooks.js +0 -31
  170. package/dist/src/hooks/FormHooks.js.map +0 -1
  171. package/dist/src/hooks/UseSnackbar.d.ts +0 -10
  172. package/dist/src/hooks/UseSnackbar.js +0 -23
  173. package/dist/src/hooks/UseSnackbar.js.map +0 -1
  174. package/dist/src/hooks/UseUser.d.ts +0 -10
  175. package/dist/src/hooks/UseUser.js +0 -25
  176. package/dist/src/hooks/UseUser.js.map +0 -1
  177. package/dist/src/index.d.ts +0 -20
  178. package/dist/src/index.js +0 -15
  179. package/dist/src/index.js.map +0 -1
  180. package/dist/src/models/Error.d.ts +0 -6
  181. package/dist/src/models/Error.js +0 -2
  182. package/dist/src/models/Error.js.map +0 -1
  183. package/dist/src/models/KeycloakSettings.d.ts +0 -8
  184. package/dist/src/models/KeycloakSettings.js +0 -2
  185. package/dist/src/models/KeycloakSettings.js.map +0 -1
  186. package/dist/src/models/LayoutPaletteColorOptions.d.ts +0 -6
  187. package/dist/src/models/LayoutPaletteColorOptions.js +0 -2
  188. package/dist/src/models/LayoutPaletteColorOptions.js.map +0 -1
  189. package/dist/src/models/LayoutRoute.d.ts +0 -14
  190. package/dist/src/models/LayoutRoute.js +0 -2
  191. package/dist/src/models/LayoutRoute.js.map +0 -1
  192. package/dist/src/models/Notification.d.ts +0 -9
  193. package/dist/src/models/Notification.js +0 -2
  194. package/dist/src/models/Notification.js.map +0 -1
  195. package/dist/src/models/PeoplesoftDepartment.d.ts +0 -14
  196. package/dist/src/models/PeoplesoftDepartment.js +0 -2
  197. package/dist/src/models/PeoplesoftDepartment.js.map +0 -1
  198. package/dist/src/models/PeoplesoftEmployee.d.ts +0 -34
  199. package/dist/src/models/PeoplesoftEmployee.js +0 -2
  200. package/dist/src/models/PeoplesoftEmployee.js.map +0 -1
  201. package/dist/src/models/Snackbar.d.ts +0 -15
  202. package/dist/src/models/Snackbar.js +0 -2
  203. package/dist/src/models/Snackbar.js.map +0 -1
  204. package/dist/src/models/User.d.ts +0 -27
  205. package/dist/src/models/User.js +0 -11
  206. package/dist/src/models/User.js.map +0 -1
  207. package/dist/src/models/types/EmployeeCategoryGroup.d.ts +0 -1
  208. package/dist/src/models/types/EmployeeCategoryGroup.js +0 -2
  209. package/dist/src/models/types/EmployeeCategoryGroup.js.map +0 -1
  210. package/dist/src/models/types/EmployeeStatus.d.ts +0 -1
  211. package/dist/src/models/types/EmployeeStatus.js +0 -2
  212. package/dist/src/models/types/EmployeeStatus.js.map +0 -1
  213. package/dist/src/utils/Auth.d.ts +0 -12
  214. package/dist/src/utils/Auth.js +0 -49
  215. package/dist/src/utils/Auth.js.map +0 -1
  216. package/dist/src/utils/Fetches.d.ts +0 -5
  217. package/dist/src/utils/Fetches.js +0 -66
  218. package/dist/src/utils/Fetches.js.map +0 -1
  219. package/dist/src/utils/FormUtils.d.ts +0 -7
  220. package/dist/src/utils/FormUtils.js +0 -9
  221. package/dist/src/utils/FormUtils.js.map +0 -1
  222. package/dist/src/utils/Helpers.d.ts +0 -11
  223. package/dist/src/utils/Helpers.js +0 -26
  224. package/dist/src/utils/Helpers.js.map +0 -1
  225. package/dist/tsconfig.tsbuildinfo +0 -1
  226. package/src/components/Layout.tsx +0 -183
  227. package/src/components/dataGrid/ChipInputCell.tsx +0 -31
  228. package/src/components/dataGrid/EditableColumnHeader.tsx +0 -7
  229. package/src/components/dataGrid/GridToolbar.tsx +0 -63
  230. package/src/components/dataGrid/TableContainer.tsx +0 -39
  231. package/src/components/form/FormAutocomplete.tsx +0 -34
  232. package/src/components/form/FormCheckbox.tsx +0 -32
  233. package/src/components/form/FormDatePicker.tsx +0 -34
  234. package/src/components/form/FormDateTimePicker.tsx +0 -34
  235. package/src/components/form/FormNumberField.tsx +0 -33
  236. package/src/components/form/FormRadioGroup.tsx +0 -43
  237. package/src/components/form/FormSlider.tsx +0 -28
  238. package/src/components/form/FormSubmitButton.tsx +0 -29
  239. package/src/components/form/FormSwitch.tsx +0 -32
  240. package/src/components/form/FormTextField.tsx +0 -26
  241. package/src/components/layout/AccountMenu.tsx +0 -160
  242. package/src/components/layout/DevelopmentBanner.tsx +0 -54
  243. package/src/components/layout/ErrorPage.tsx +0 -34
  244. package/src/components/layout/LayoutDialog.tsx +0 -50
  245. package/src/components/layout/LayoutSnackbar.tsx +0 -44
  246. package/src/components/layout/NavigationDrawer.tsx +0 -131
  247. package/src/components/layout/NotificationMenu.tsx +0 -76
  248. package/src/components/layout/TypographyWithIcon.tsx +0 -35
  249. package/src/components/layout/Unauthorized.tsx +0 -37
  250. package/src/contexts/LayoutContext.tsx +0 -127
  251. package/src/contexts/UserContext.tsx +0 -88
  252. package/src/hooks/FormHooks.ts +0 -33
  253. package/src/hooks/UseSnackbar.tsx +0 -28
  254. package/src/hooks/UseUser.tsx +0 -29
  255. package/src/index.ts +0 -27
  256. package/src/models/Error.tsx +0 -6
  257. package/src/models/KeycloakSettings.ts +0 -8
  258. package/src/models/LayoutPaletteColorOptions.tsx +0 -7
  259. package/src/models/LayoutRoute.ts +0 -15
  260. package/src/models/Notification.ts +0 -10
  261. package/src/models/PeoplesoftDepartment.ts +0 -15
  262. package/src/models/PeoplesoftEmployee.ts +0 -35
  263. package/src/models/Snackbar.ts +0 -16
  264. package/src/models/User.ts +0 -13
  265. package/src/models/types/EmployeeCategoryGroup.ts +0 -1
  266. package/src/models/types/EmployeeStatus.ts +0 -1
  267. package/src/utils/Auth.ts +0 -58
  268. package/src/utils/Fetches.ts +0 -83
  269. package/src/utils/FormUtils.ts +0 -22
  270. package/src/utils/Helpers.ts +0 -27
  271. package/tsconfig.json +0 -29
@@ -0,0 +1,248 @@
1
+ import { t as DialogsContext } from "./DialogsContext-DLqA8RJ_.mjs";
2
+ import { c } from "react/compiler-runtime";
3
+ import { Button, Dialog, DialogActions, DialogContent, DialogTitle, useEventCallback } from "@mui/material";
4
+ import { useContext } from "react";
5
+ import { useTranslation } from "react-i18next";
6
+ import { jsx, jsxs } from "react/jsx-runtime";
7
+ //#region src/hooks/useDialogs.tsx
8
+ function AlertDialog(t0) {
9
+ const $ = c(23);
10
+ if ($[0] !== "40306a49a490b7e6c84c5f6c47439f8c7b6ee1f8cf1389e00101b53c362d1875") {
11
+ for (let $i = 0; $i < 23; $i += 1) $[$i] = Symbol.for("react.memo_cache_sentinel");
12
+ $[0] = "40306a49a490b7e6c84c5f6c47439f8c7b6ee1f8cf1389e00101b53c362d1875";
13
+ }
14
+ const { open, payload, onClose } = t0;
15
+ const { t } = useTranslation();
16
+ let t1;
17
+ if ($[1] !== onClose) {
18
+ t1 = () => onClose();
19
+ $[1] = onClose;
20
+ $[2] = t1;
21
+ } else t1 = $[2];
22
+ let t2;
23
+ if ($[3] !== payload.title || $[4] !== t) {
24
+ t2 = payload.title ?? t("Layout.Dialog.Alert");
25
+ $[3] = payload.title;
26
+ $[4] = t;
27
+ $[5] = t2;
28
+ } else t2 = $[5];
29
+ let t3;
30
+ if ($[6] !== t2) {
31
+ t3 = /* @__PURE__ */ jsx(DialogTitle, { children: t2 });
32
+ $[6] = t2;
33
+ $[7] = t3;
34
+ } else t3 = $[7];
35
+ let t4;
36
+ if ($[8] !== payload.message) {
37
+ t4 = /* @__PURE__ */ jsx(DialogContent, { children: payload.message });
38
+ $[8] = payload.message;
39
+ $[9] = t4;
40
+ } else t4 = $[9];
41
+ let t5;
42
+ if ($[10] !== onClose) {
43
+ t5 = () => onClose();
44
+ $[10] = onClose;
45
+ $[11] = t5;
46
+ } else t5 = $[11];
47
+ let t6;
48
+ if ($[12] !== t) {
49
+ t6 = t("Layout.Dialog.Confirm");
50
+ $[12] = t;
51
+ $[13] = t6;
52
+ } else t6 = $[13];
53
+ let t7;
54
+ if ($[14] !== t5 || $[15] !== t6) {
55
+ t7 = /* @__PURE__ */ jsx(DialogActions, { children: /* @__PURE__ */ jsx(Button, {
56
+ onClick: t5,
57
+ autoFocus: true,
58
+ children: t6
59
+ }) });
60
+ $[14] = t5;
61
+ $[15] = t6;
62
+ $[16] = t7;
63
+ } else t7 = $[16];
64
+ let t8;
65
+ if ($[17] !== open || $[18] !== t1 || $[19] !== t3 || $[20] !== t4 || $[21] !== t7) {
66
+ t8 = /* @__PURE__ */ jsxs(Dialog, {
67
+ maxWidth: "xs",
68
+ fullWidth: true,
69
+ open,
70
+ onClose: t1,
71
+ disableRestoreFocus: true,
72
+ children: [
73
+ t3,
74
+ t4,
75
+ t7
76
+ ]
77
+ });
78
+ $[17] = open;
79
+ $[18] = t1;
80
+ $[19] = t3;
81
+ $[20] = t4;
82
+ $[21] = t7;
83
+ $[22] = t8;
84
+ } else t8 = $[22];
85
+ return t8;
86
+ }
87
+ function ConfirmDialog(t0) {
88
+ const $ = c(34);
89
+ if ($[0] !== "40306a49a490b7e6c84c5f6c47439f8c7b6ee1f8cf1389e00101b53c362d1875") {
90
+ for (let $i = 0; $i < 34; $i += 1) $[$i] = Symbol.for("react.memo_cache_sentinel");
91
+ $[0] = "40306a49a490b7e6c84c5f6c47439f8c7b6ee1f8cf1389e00101b53c362d1875";
92
+ }
93
+ const { open, payload, onClose } = t0;
94
+ const { t } = useTranslation();
95
+ let t1;
96
+ if ($[1] !== onClose) {
97
+ t1 = () => onClose(false);
98
+ $[1] = onClose;
99
+ $[2] = t1;
100
+ } else t1 = $[2];
101
+ let t2;
102
+ if ($[3] !== payload.title || $[4] !== t) {
103
+ t2 = payload.title ?? t("Layout.Dialog.Confirm");
104
+ $[3] = payload.title;
105
+ $[4] = t;
106
+ $[5] = t2;
107
+ } else t2 = $[5];
108
+ let t3;
109
+ if ($[6] !== t2) {
110
+ t3 = /* @__PURE__ */ jsx(DialogTitle, { children: t2 });
111
+ $[6] = t2;
112
+ $[7] = t3;
113
+ } else t3 = $[7];
114
+ let t4;
115
+ if ($[8] !== payload.message) {
116
+ t4 = /* @__PURE__ */ jsx(DialogContent, { children: payload.message });
117
+ $[8] = payload.message;
118
+ $[9] = t4;
119
+ } else t4 = $[9];
120
+ let t5;
121
+ if ($[10] !== onClose) {
122
+ t5 = () => onClose(false);
123
+ $[10] = onClose;
124
+ $[11] = t5;
125
+ } else t5 = $[11];
126
+ let t6;
127
+ if ($[12] !== payload.cancelText || $[13] !== t) {
128
+ t6 = payload.cancelText ?? t("Layout.Dialog.Cancel");
129
+ $[12] = payload.cancelText;
130
+ $[13] = t;
131
+ $[14] = t6;
132
+ } else t6 = $[14];
133
+ let t7;
134
+ if ($[15] !== t5 || $[16] !== t6) {
135
+ t7 = /* @__PURE__ */ jsx(Button, {
136
+ onClick: t5,
137
+ children: t6
138
+ });
139
+ $[15] = t5;
140
+ $[16] = t6;
141
+ $[17] = t7;
142
+ } else t7 = $[17];
143
+ let t8;
144
+ if ($[18] !== onClose) {
145
+ t8 = () => onClose(true);
146
+ $[18] = onClose;
147
+ $[19] = t8;
148
+ } else t8 = $[19];
149
+ let t9;
150
+ if ($[20] !== t) {
151
+ t9 = t("Layout.Dialog.Confirm");
152
+ $[20] = t;
153
+ $[21] = t9;
154
+ } else t9 = $[21];
155
+ let t10;
156
+ if ($[22] !== t8 || $[23] !== t9) {
157
+ t10 = /* @__PURE__ */ jsx(Button, {
158
+ onClick: t8,
159
+ autoFocus: true,
160
+ children: t9
161
+ });
162
+ $[22] = t8;
163
+ $[23] = t9;
164
+ $[24] = t10;
165
+ } else t10 = $[24];
166
+ let t11;
167
+ if ($[25] !== t10 || $[26] !== t7) {
168
+ t11 = /* @__PURE__ */ jsxs(DialogActions, { children: [t7, t10] });
169
+ $[25] = t10;
170
+ $[26] = t7;
171
+ $[27] = t11;
172
+ } else t11 = $[27];
173
+ let t12;
174
+ if ($[28] !== open || $[29] !== t1 || $[30] !== t11 || $[31] !== t3 || $[32] !== t4) {
175
+ t12 = /* @__PURE__ */ jsxs(Dialog, {
176
+ maxWidth: "xs",
177
+ fullWidth: true,
178
+ open,
179
+ onClose: t1,
180
+ disableRestoreFocus: true,
181
+ children: [
182
+ t3,
183
+ t4,
184
+ t11
185
+ ]
186
+ });
187
+ $[28] = open;
188
+ $[29] = t1;
189
+ $[30] = t11;
190
+ $[31] = t3;
191
+ $[32] = t4;
192
+ $[33] = t12;
193
+ } else t12 = $[33];
194
+ return t12;
195
+ }
196
+ function useDialogs() {
197
+ const $ = c(10);
198
+ if ($[0] !== "40306a49a490b7e6c84c5f6c47439f8c7b6ee1f8cf1389e00101b53c362d1875") {
199
+ for (let $i = 0; $i < 10; $i += 1) $[$i] = Symbol.for("react.memo_cache_sentinel");
200
+ $[0] = "40306a49a490b7e6c84c5f6c47439f8c7b6ee1f8cf1389e00101b53c362d1875";
201
+ }
202
+ const { open, close } = useContext(DialogsContext);
203
+ let t0;
204
+ if ($[1] !== open) {
205
+ t0 = (message, t1) => {
206
+ const { ...options } = t1 === void 0 ? {} : t1;
207
+ return open(AlertDialog, {
208
+ ...options,
209
+ message
210
+ });
211
+ };
212
+ $[1] = open;
213
+ $[2] = t0;
214
+ } else t0 = $[2];
215
+ const alert = useEventCallback(t0);
216
+ let t1;
217
+ if ($[3] !== open) {
218
+ t1 = (message_0, t2) => {
219
+ const { ...options_0 } = t2 === void 0 ? {} : t2;
220
+ return open(ConfirmDialog, {
221
+ ...options_0,
222
+ message: message_0
223
+ });
224
+ };
225
+ $[3] = open;
226
+ $[4] = t1;
227
+ } else t1 = $[4];
228
+ const confirm = useEventCallback(t1);
229
+ let t2;
230
+ if ($[5] !== alert || $[6] !== close || $[7] !== confirm || $[8] !== open) {
231
+ t2 = {
232
+ alert,
233
+ confirm,
234
+ open,
235
+ close
236
+ };
237
+ $[5] = alert;
238
+ $[6] = close;
239
+ $[7] = confirm;
240
+ $[8] = open;
241
+ $[9] = t2;
242
+ } else t2 = $[9];
243
+ return t2;
244
+ }
245
+ //#endregion
246
+ export { useDialogs as t };
247
+
248
+ //# sourceMappingURL=useDialogs-BUzVrTSP.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useDialogs-BUzVrTSP.mjs","names":["Button","Dialog","DialogActions","DialogContent","DialogTitle","useEventCallback","useContext","useTranslation","DialogsContext","ReactNode","OpenDialogOptions","onClose","result","TResult","Promise","AlertOptions","title","ConfirmOptions","cancelText","DialogProps","payload","TPayload","open","OpenAlertDialog","message","options","OpenConfirmDialog","DialogComponent","React","ComponentType","OpenDialog","Component","CloseDialog","dialog","AlertDialogPayload","AlertDialogProps","AlertDialog","t0","$","_c","$i","Symbol","for","t","t1","t2","t3","t4","t5","t6","t7","t8","ConfirmDialogPayload","ConfirmDialogProps","ConfirmDialog","t9","t10","t11","t12","DialogHook","alert","confirm","close","useDialogs","undefined","message_0","options_0"],"sources":["../src/hooks/useDialogs.tsx"],"sourcesContent":["import {\n Button,\n Dialog,\n DialogActions,\n DialogContent,\n DialogTitle,\n useEventCallback,\n} from \"@mui/material\";\nimport { useContext } from \"react\";\nimport { useTranslation } from \"react-i18next\";\nimport { DialogsContext } from \"../contexts/DialogsContext\";\nimport type { ReactNode } from \"react\";\n\nexport interface OpenDialogOptions<TResult> {\n onClose?: (result: TResult) => Promise<void>;\n}\n\nexport interface AlertOptions {\n title?: ReactNode;\n}\n\nexport interface ConfirmOptions {\n title?: ReactNode;\n cancelText?: ReactNode;\n}\n\nexport interface DialogProps<TPayload = undefined, TResult = void> {\n payload: TPayload;\n open: boolean;\n onClose: (result: TResult) => Promise<void>;\n}\n\nexport type OpenAlertDialog = (message: ReactNode, options?: AlertOptions) => Promise<void>;\n\nexport type OpenConfirmDialog = (message: ReactNode, options?: ConfirmOptions) => Promise<boolean>;\n\nexport type DialogComponent<TPayload, TResult> = React.ComponentType<\n DialogProps<TPayload, TResult>\n>;\n\nexport interface OpenDialog {\n <TPayload extends undefined, TResult>(\n Component: DialogComponent<TPayload, TResult>,\n payload?: TPayload,\n options?: OpenDialogOptions<TResult>,\n ): Promise<TResult>;\n <TPayload, TResult>(\n Component: DialogComponent<TPayload, TResult>,\n payload: TPayload,\n options?: OpenDialogOptions<TResult>,\n ): Promise<TResult>;\n}\n\nexport type CloseDialog = <TResult>(dialog: Promise<TResult>, result: TResult) => Promise<TResult>;\n\nexport interface AlertDialogPayload extends AlertOptions {\n message: ReactNode;\n}\n\nexport type AlertDialogProps = DialogProps<AlertDialogPayload, void>;\n\nexport function AlertDialog({ open, payload, onClose }: Readonly<AlertDialogProps>) {\n const { t } = useTranslation();\n\n return (\n <Dialog maxWidth=\"xs\" fullWidth open={open} onClose={() => onClose()} disableRestoreFocus>\n <DialogTitle>{payload.title ?? t(\"Layout.Dialog.Alert\")}</DialogTitle>\n <DialogContent>{payload.message}</DialogContent>\n <DialogActions>\n <Button onClick={() => onClose()} autoFocus>\n {t(\"Layout.Dialog.Confirm\")}\n </Button>\n </DialogActions>\n </Dialog>\n );\n}\n\nexport interface ConfirmDialogPayload extends ConfirmOptions {\n message: ReactNode;\n}\n\nexport type ConfirmDialogProps = DialogProps<ConfirmDialogPayload, boolean>;\n\nexport function ConfirmDialog({ open, payload, onClose }: Readonly<ConfirmDialogProps>) {\n const { t } = useTranslation();\n\n return (\n <Dialog maxWidth=\"xs\" fullWidth open={open} onClose={() => onClose(false)} disableRestoreFocus>\n <DialogTitle>{payload.title ?? t(\"Layout.Dialog.Confirm\")}</DialogTitle>\n <DialogContent>{payload.message}</DialogContent>\n <DialogActions>\n <Button onClick={() => onClose(false)}>\n {payload.cancelText ?? t(\"Layout.Dialog.Cancel\")}\n </Button>\n <Button onClick={() => onClose(true)} autoFocus>\n {t(\"Layout.Dialog.Confirm\")}\n </Button>\n </DialogActions>\n </Dialog>\n );\n}\n\ninterface DialogHook {\n alert: OpenAlertDialog;\n confirm: OpenConfirmDialog;\n open: OpenDialog;\n close: CloseDialog;\n}\n\nexport function useDialogs(): DialogHook {\n const { open, close } = useContext(DialogsContext);\n\n const alert = useEventCallback<OpenAlertDialog>((message, { ...options } = {}) =>\n open(AlertDialog, { ...options, message }),\n );\n\n const confirm = useEventCallback<OpenConfirmDialog>((message, { ...options } = {}) =>\n open(ConfirmDialog, { ...options, message }),\n );\n\n return { alert, confirm, open, close };\n}\n"],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { t as QueryClientParam } from "./QueryClientParam-CzaM3akD.mjs";
2
+ import { t as User } from "./User-1gKoYJvW.mjs";
3
+ import { scopes } from "virtual:wcz-layout";
4
+
5
+ //#region src/lib/auth/user.d.ts
6
+ declare const getUser: ({
7
+ queryClient
8
+ }: QueryClientParam) => Promise<User | null>;
9
+ /**
10
+ * Server-only token acquisition: a delegated access token for the given API
11
+ * scope, minted from the user's session refresh token. Entra rotates the refresh
12
+ * token on each use, so the rotated token is persisted back to the session. Use
13
+ * inside server functions and middleware — it is stripped from the client bundle
14
+ * and throws if called there.
15
+ */
16
+ declare const getAccessToken: (scopeKey: keyof typeof scopes) => Promise<string>;
17
+ //#endregion
18
+ export { getUser as n, getAccessToken as t };
19
+ //# sourceMappingURL=user-Cen43mlr.d.mts.map
@@ -0,0 +1,156 @@
1
+ import { t as serverEnv$1 } from "./env-CoveIivr.mjs";
2
+ import { manifest, permissions, scopes } from "virtual:wcz-layout";
3
+ import { redirect } from "@tanstack/react-router";
4
+ import { createServerFn, createServerOnlyFn } from "@tanstack/react-start";
5
+ //#region src/lib/auth/session.ts
6
+ const getAppSession = async () => {
7
+ const { useSession: getSession } = await import("@tanstack/react-start/server");
8
+ return getSession({
9
+ name: "wcz-auth",
10
+ password: serverEnv$1.SESSION_SECRET,
11
+ cookie: {
12
+ httpOnly: true,
13
+ sameSite: "lax",
14
+ secure: true,
15
+ path: "/"
16
+ }
17
+ });
18
+ };
19
+ //#endregion
20
+ //#region src/lib/auth/user.ts
21
+ /**
22
+ * Reads the signed-in user from the session cookie, or null. As a server function
23
+ * it runs in-process when called on the server (SSR, middleware) and as an RPC
24
+ * when called from the client — so it doubles as the client `queryFn`.
25
+ */
26
+ const getSessionUser = createServerFn({ method: "GET" }).handler(async () => {
27
+ return (await getAppSession()).data.user ?? null;
28
+ });
29
+ const getUser = ({ queryClient }) => {
30
+ if (import.meta.env.SSR) return getSessionUser();
31
+ return queryClient.ensureQueryData({
32
+ queryKey: ["auth", "user"],
33
+ queryFn: () => getSessionUser(),
34
+ staleTime: Infinity
35
+ });
36
+ };
37
+ /**
38
+ * Server-only token acquisition: a delegated access token for the given API
39
+ * scope, minted from the user's session refresh token. Entra rotates the refresh
40
+ * token on each use, so the rotated token is persisted back to the session. Use
41
+ * inside server functions and middleware — it is stripped from the client bundle
42
+ * and throws if called there.
43
+ */
44
+ const getAccessToken = createServerOnlyFn(async (scopeKey) => {
45
+ const session = await getAppSession();
46
+ if (!session.data.refreshToken) throw new Error("No active session. User not signed in.");
47
+ const { acquireDelegatedToken } = await import("./entra-s4ZjHq5o.mjs");
48
+ const { accessToken, refreshToken } = await acquireDelegatedToken({
49
+ refreshToken: session.data.refreshToken,
50
+ scopes: scopes[scopeKey]
51
+ });
52
+ if (refreshToken !== session.data.refreshToken) await session.update({ refreshToken });
53
+ return accessToken;
54
+ });
55
+ //#endregion
56
+ //#region src/lib/utils.ts
57
+ const WISTRON_PRIMARY_COLOR = "#00506E";
58
+ const WISTRON_SECONDARY_COLOR = "#64DC00";
59
+ var Platform = class {
60
+ static get isAndroid() {
61
+ return /android/i.test(this.userAgent);
62
+ }
63
+ static get isIOS() {
64
+ return /iPad|iPhone|iPod/.test(this.userAgent);
65
+ }
66
+ static get isWindows() {
67
+ return /windows/i.test(this.userAgent);
68
+ }
69
+ static get isMacOS() {
70
+ return /Macintosh|MacIntel|MacPPC|Mac68K/.test(this.userAgent);
71
+ }
72
+ static get userAgent() {
73
+ return typeof navigator === "undefined" ? "" : navigator.userAgent;
74
+ }
75
+ };
76
+ const rootRouteHead = (options) => ({
77
+ meta: [
78
+ { charSet: "utf-8" },
79
+ {
80
+ name: "viewport",
81
+ content: "width=device-width, initial-scale=1"
82
+ },
83
+ { title: manifest.name },
84
+ {
85
+ name: "og:type",
86
+ content: "website"
87
+ },
88
+ {
89
+ name: "og:title",
90
+ content: manifest.name
91
+ },
92
+ {
93
+ name: "og:image",
94
+ content: "/favicon-32x32.png"
95
+ }
96
+ ],
97
+ links: [
98
+ {
99
+ rel: "apple-touch-icon",
100
+ sizes: "180x180",
101
+ href: "/apple-touch-icon.png"
102
+ },
103
+ {
104
+ rel: "icon",
105
+ type: "image/png",
106
+ sizes: "32x32",
107
+ href: "/favicon-32x32.png"
108
+ },
109
+ {
110
+ rel: "icon",
111
+ type: "image/png",
112
+ sizes: "16x16",
113
+ href: "/favicon-16x16.png"
114
+ },
115
+ {
116
+ rel: "manifest",
117
+ href: options?.manifest || "/manifest.json"
118
+ },
119
+ {
120
+ rel: "icon",
121
+ href: "/favicon.ico"
122
+ }
123
+ ]
124
+ });
125
+ const requirePermission = (permissionKey) => {
126
+ return async ({ location, context }) => {
127
+ const user = await getUser({ queryClient: context.queryClient });
128
+ if (!user) throw redirect({
129
+ href: `/auth/login?returnTo=${encodeURIComponent(location.href)}`,
130
+ reloadDocument: true
131
+ });
132
+ if (!hasPermission(user, permissionKey)) throw new Error("You do not have permission to access this page.");
133
+ return { user };
134
+ };
135
+ };
136
+ const getFieldStatus = (field) => {
137
+ const { meta } = field.state;
138
+ return {
139
+ isTouched: meta.isTouched,
140
+ hasError: !!meta.errors.length,
141
+ helperText: meta.errors[0]?.message
142
+ };
143
+ };
144
+ const buildUser = (payload) => ({
145
+ name: payload.name?.split("/")[0],
146
+ email: payload.preferred_username?.toLowerCase(),
147
+ department: payload.department?.toUpperCase() || "",
148
+ employeeId: payload.employeeId?.toUpperCase() || "",
149
+ companyName: payload.companyName || "",
150
+ groups: payload.groups ?? []
151
+ });
152
+ const hasPermission = (user, key) => user ? permissions[key].some((group) => user.groups.includes(group)) : false;
153
+ //#endregion
154
+ export { getFieldStatus as a, rootRouteHead as c, getUser as d, getAppSession as f, buildUser as i, getAccessToken as l, WISTRON_PRIMARY_COLOR as n, hasPermission as o, WISTRON_SECONDARY_COLOR as r, requirePermission as s, Platform as t, getSessionUser as u };
155
+
156
+ //# sourceMappingURL=utils-2XiozDlV.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils-2XiozDlV.mjs","names":["serverEnv","getAppSession","useSession","getSession","name","password","SESSION_SECRET","cookie","httpOnly","sameSite","secure","path","createServerFn","createServerOnlyFn","scopes","definedScopes","QueryClientParam","User","getAppSession","getSessionUser","method","handler","Promise","session","data","user","getUser","queryClient","import","meta","env","SSR","ensureQueryData","queryKey","queryFn","staleTime","Infinity","getAccessToken","scopeKey","refreshToken","Error","acquireDelegatedToken","accessToken","update","AnyFieldApi","ParsedLocation","redirect","manifest","permissions","QueryClientParam","TokenPayload","User","getUser","WISTRON_PRIMARY_COLOR","WISTRON_SECONDARY_COLOR","Platform","isAndroid","test","userAgent","isIOS","isWindows","isMacOS","navigator","RootRouteHeadOptions","rootRouteHead","options","meta","charSet","name","content","title","links","rel","sizes","href","type","requirePermission","permissionKey","location","context","user","queryClient","encodeURIComponent","reloadDocument","hasPermission","Error","FormOmittedProps","getFieldStatus","field","state","isTouched","hasError","errors","length","helperText","message","toKebabCase","str","replaceAll","toLowerCase","buildUser","payload","split","email","preferred_username","department","toUpperCase","employeeId","companyName","groups","key","some","group","includes"],"sources":["../src/lib/auth/session.ts","../src/lib/auth/user.ts","../src/lib/utils.ts"],"sourcesContent":["import { serverEnv } from \"~/env\";\n\nexport const getAppSession = async () => {\n // Dynamic import: `@tanstack/react-start/server` is the server entry and drags\n // in the SSR renderer (`react-dom/server`). Keep it out of the client graph —\n // this helper is only ever called server-side, and all callers already await it.\n // Aliased off the `use*` name so it isn't mistaken for a React hook (it's a\n // server session helper, not a hook).\n const { useSession: getSession } = await import(\"@tanstack/react-start/server\");\n\n return getSession({\n name: \"wcz-auth\",\n password: serverEnv.SESSION_SECRET,\n cookie: {\n httpOnly: true,\n sameSite: \"lax\",\n secure: true,\n path: \"/\",\n },\n });\n};\n","import { createServerFn, createServerOnlyFn } from \"@tanstack/react-start\";\nimport { scopes as definedScopes } from \"virtual:wcz-layout\";\nimport { QueryClientParam } from \"~/models/QueryClientParam\";\nimport type { User } from \"~/models/User\";\nimport { getAppSession } from \"./session\";\n\n/**\n * Reads the signed-in user from the session cookie, or null. As a server function\n * it runs in-process when called on the server (SSR, middleware) and as an RPC\n * when called from the client — so it doubles as the client `queryFn`.\n */\nexport const getSessionUser = createServerFn({ method: \"GET\" }).handler(\n async (): Promise<User | null> => {\n const session = await getAppSession();\n return session.data.user ?? null;\n },\n);\n\nexport const getUser = ({ queryClient }: QueryClientParam): Promise<User | null> => {\n if (import.meta.env.SSR) return getSessionUser();\n\n return queryClient.ensureQueryData({\n queryKey: [\"auth\", \"user\"],\n queryFn: () => getSessionUser(),\n staleTime: Infinity,\n });\n};\n\n/**\n * Server-only token acquisition: a delegated access token for the given API\n * scope, minted from the user's session refresh token. Entra rotates the refresh\n * token on each use, so the rotated token is persisted back to the session. Use\n * inside server functions and middleware — it is stripped from the client bundle\n * and throws if called there.\n */\nexport const getAccessToken = createServerOnlyFn(\n async (scopeKey: keyof typeof definedScopes): Promise<string> => {\n const session = await getAppSession();\n if (!session.data.refreshToken) throw new Error(\"No active session. User not signed in.\");\n\n // Dynamic import so `entra` (and its `@azure/msal-node` dependency) stays out\n // of the client graph — this module also exports the isomorphic `getUser`.\n const { acquireDelegatedToken } = await import(\"./entra\");\n const { accessToken, refreshToken } = await acquireDelegatedToken({\n refreshToken: session.data.refreshToken,\n scopes: definedScopes[scopeKey],\n });\n\n if (refreshToken !== session.data.refreshToken) await session.update({ refreshToken });\n return accessToken;\n },\n);\n","import type { AnyFieldApi } from \"@tanstack/react-form\";\nimport { ParsedLocation, redirect } from \"@tanstack/react-router\";\nimport { manifest, permissions } from \"virtual:wcz-layout\";\nimport type { QueryClientParam } from \"~/models/QueryClientParam\";\nimport type { TokenPayload } from \"~/models/TokenPayload\";\nimport type { User } from \"~/models/User\";\nimport { getUser } from \"./auth/user\";\n\nexport const WISTRON_PRIMARY_COLOR = \"#00506E\";\nexport const WISTRON_SECONDARY_COLOR = \"#64DC00\";\n\nexport class Platform {\n static get isAndroid() {\n return /android/i.test(this.userAgent);\n }\n static get isIOS() {\n return /iPad|iPhone|iPod/.test(this.userAgent);\n }\n static get isWindows() {\n return /windows/i.test(this.userAgent);\n }\n static get isMacOS() {\n return /Macintosh|MacIntel|MacPPC|Mac68K/.test(this.userAgent);\n }\n\n private static get userAgent() {\n return typeof navigator === \"undefined\" ? \"\" : navigator.userAgent;\n }\n}\n\ninterface RootRouteHeadOptions {\n manifest?: string;\n}\n\nexport const rootRouteHead = (options?: RootRouteHeadOptions) => ({\n meta: [\n { charSet: \"utf-8\" },\n { name: \"viewport\", content: \"width=device-width, initial-scale=1\" },\n { title: manifest.name },\n { name: \"og:type\", content: \"website\" },\n { name: \"og:title\", content: manifest.name },\n { name: \"og:image\", content: \"/favicon-32x32.png\" },\n ],\n links: [\n { rel: \"apple-touch-icon\", sizes: \"180x180\", href: \"/apple-touch-icon.png\" },\n { rel: \"icon\", type: \"image/png\", sizes: \"32x32\", href: \"/favicon-32x32.png\" },\n { rel: \"icon\", type: \"image/png\", sizes: \"16x16\", href: \"/favicon-16x16.png\" },\n { rel: \"manifest\", href: options?.manifest || \"/manifest.json\" },\n { rel: \"icon\", href: \"/favicon.ico\" },\n ],\n});\n\nexport const requirePermission = (permissionKey: keyof typeof permissions) => {\n return async ({ location, context }: { location: ParsedLocation; context: QueryClientParam }) => {\n const user = await getUser({ queryClient: context.queryClient });\n\n if (!user)\n throw redirect({\n href: `/auth/login?returnTo=${encodeURIComponent(location.href)}`,\n reloadDocument: true,\n });\n\n if (!hasPermission(user, permissionKey))\n throw new Error(\"You do not have permission to access this page.\");\n\n return { user };\n };\n};\n\n/* Internal Utils */\nexport type FormOmittedProps =\n | \"name\"\n | \"value\"\n | \"onChange\"\n | \"onBlur\"\n | \"error\"\n | \"helperText\"\n | \"renderInput\"\n | \"type\"\n | \"aria-label\";\n\nexport const getFieldStatus = (field: AnyFieldApi) => {\n const { meta } = field.state;\n\n const isTouched = meta.isTouched;\n const hasError = !!meta.errors.length;\n const helperText = meta.errors[0]?.message;\n\n return { isTouched, hasError, helperText };\n};\n\nexport const toKebabCase = (str: string): string => {\n return str\n .replaceAll(/([a-z])([A-Z])/g, \"$1-$2\")\n .replaceAll(/[\\s_]+/g, \"-\")\n .replaceAll(/[^a-zA-Z0-9-]/g, \"\")\n .toLowerCase()\n .replaceAll(/-+/g, \"-\")\n .replaceAll(/(^-|-$)/g, \"\");\n};\n\nexport const buildUser = (payload: TokenPayload): User => ({\n name: payload.name?.split(\"/\")[0],\n email: payload.preferred_username?.toLowerCase(),\n department: payload.department?.toUpperCase() || \"\",\n employeeId: payload.employeeId?.toUpperCase() || \"\",\n companyName: payload.companyName || \"\",\n groups: payload.groups ?? [],\n});\n\nexport const hasPermission = (user: User | null, key: keyof typeof permissions): boolean =>\n user ? permissions[key].some((group) => user.groups.includes(group)) : false;\n"],"mappings":"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"}
@@ -0,0 +1,65 @@
1
+ import { t as QueryClientParam } from "./QueryClientParam-CzaM3akD.mjs";
2
+ import { t as User } from "./User-1gKoYJvW.mjs";
3
+ import { permissions } from "virtual:wcz-layout";
4
+ import { ParsedLocation } from "@tanstack/react-router";
5
+ //#region src/lib/utils.d.ts
6
+ declare const WISTRON_PRIMARY_COLOR = "#00506E";
7
+ declare const WISTRON_SECONDARY_COLOR = "#64DC00";
8
+ declare class Platform {
9
+ static get isAndroid(): boolean;
10
+ static get isIOS(): boolean;
11
+ static get isWindows(): boolean;
12
+ static get isMacOS(): boolean;
13
+ private static get userAgent();
14
+ }
15
+ interface RootRouteHeadOptions {
16
+ manifest?: string;
17
+ }
18
+ declare const rootRouteHead: (options?: RootRouteHeadOptions) => {
19
+ meta: ({
20
+ charSet: string;
21
+ title?: undefined;
22
+ name?: undefined;
23
+ content?: undefined;
24
+ } | {
25
+ title: any;
26
+ charSet?: undefined;
27
+ name?: undefined;
28
+ content?: undefined;
29
+ } | {
30
+ name: string;
31
+ content: any;
32
+ charSet?: undefined;
33
+ title?: undefined;
34
+ })[];
35
+ links: ({
36
+ rel: string;
37
+ sizes: string;
38
+ href: string;
39
+ type?: undefined;
40
+ } | {
41
+ rel: string;
42
+ type: string;
43
+ sizes: string;
44
+ href: string;
45
+ } | {
46
+ rel: string;
47
+ href: string;
48
+ sizes?: undefined;
49
+ type?: undefined;
50
+ })[];
51
+ };
52
+ declare const requirePermission: (permissionKey: keyof typeof permissions) => ({
53
+ location,
54
+ context
55
+ }: {
56
+ location: ParsedLocation;
57
+ context: QueryClientParam;
58
+ }) => Promise<{
59
+ user: User;
60
+ }>;
61
+ type FormOmittedProps = "name" | "value" | "onChange" | "onBlur" | "error" | "helperText" | "renderInput" | "type" | "aria-label";
62
+ declare const hasPermission: (user: User | null, key: keyof typeof permissions) => boolean;
63
+ //#endregion
64
+ export { hasPermission as a, WISTRON_SECONDARY_COLOR as i, Platform as n, requirePermission as o, WISTRON_PRIMARY_COLOR as r, rootRouteHead as s, FormOmittedProps as t };
65
+ //# sourceMappingURL=utils-BuWEQOuy.d.mts.map
@@ -0,0 +1,5 @@
1
+ import { a as hasPermission, n as Platform, o as requirePermission } from "./utils-BuWEQOuy.mjs";
2
+ import i18next, { t } from "i18next";
3
+ import { createEnv } from "@t3-oss/env-core";
4
+ import { uuidv7 } from "uuidv7";
5
+ export { Platform, createEnv, hasPermission, i18next, requirePermission, t, uuidv7 };
package/dist/utils.mjs ADDED
@@ -0,0 +1,5 @@
1
+ import { o as hasPermission, s as requirePermission, t as Platform } from "./utils-2XiozDlV.mjs";
2
+ import i18next, { t } from "i18next";
3
+ import { createEnv } from "@t3-oss/env-core";
4
+ import { uuidv7 } from "uuidv7";
5
+ export { Platform, createEnv, hasPermission, i18next, requirePermission, t, uuidv7 };
@@ -0,0 +1,7 @@
1
+ import { Plugin } from "vite";
2
+
3
+ //#region src/lib/vite-plugin.d.ts
4
+ declare function viteWczLayout(): Plugin;
5
+ //#endregion
6
+ export { viteWczLayout };
7
+ //# sourceMappingURL=vite.d.mts.map