@alepha/ui 0.12.0 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (164) hide show
  1. package/README.md +2 -30
  2. package/dist/admin/AdminFiles-BM6_7_5A.cjs +4 -0
  3. package/dist/admin/AdminFiles-BaCIMeNt.js +4 -0
  4. package/dist/admin/AdminFiles-CllAxb1B.js +117 -0
  5. package/dist/admin/AdminFiles-CllAxb1B.js.map +1 -0
  6. package/dist/admin/AdminFiles-DC3T8uWZ.cjs +122 -0
  7. package/dist/admin/AdminFiles-DC3T8uWZ.cjs.map +1 -0
  8. package/dist/admin/AdminJobs-BXkFtlVo.js +125 -0
  9. package/dist/admin/AdminJobs-BXkFtlVo.js.map +1 -0
  10. package/dist/admin/AdminJobs-C428qrNQ.cjs +130 -0
  11. package/dist/admin/AdminJobs-C428qrNQ.cjs.map +1 -0
  12. package/dist/admin/AdminJobs-DCPPaJ4i.cjs +4 -0
  13. package/dist/admin/AdminJobs-yC6DarGO.js +4 -0
  14. package/dist/admin/AdminLayout-Bqo4cd33.cjs +4 -0
  15. package/dist/admin/AdminLayout-CQpxfko6.js +4 -0
  16. package/dist/admin/AdminLayout-CiLlywAQ.cjs +93 -0
  17. package/dist/admin/AdminLayout-CiLlywAQ.cjs.map +1 -0
  18. package/dist/admin/AdminLayout-CtkVYk-u.js +88 -0
  19. package/dist/admin/AdminLayout-CtkVYk-u.js.map +1 -0
  20. package/dist/admin/AdminNotifications-DNUeJ-PW.cjs +44 -0
  21. package/dist/admin/AdminNotifications-DNUeJ-PW.cjs.map +1 -0
  22. package/dist/admin/AdminNotifications-DaMu1AQ4.js +4 -0
  23. package/dist/admin/AdminNotifications-DnnulNNV.js +40 -0
  24. package/dist/admin/AdminNotifications-DnnulNNV.js.map +1 -0
  25. package/dist/admin/AdminNotifications-ihgbKVCx.cjs +4 -0
  26. package/dist/admin/AdminParameters-B3hvpLpu.js +40 -0
  27. package/dist/admin/AdminParameters-B3hvpLpu.js.map +1 -0
  28. package/dist/admin/AdminParameters-U4lU1rUF.cjs +4 -0
  29. package/dist/admin/AdminParameters-gdf7036N.cjs +44 -0
  30. package/dist/admin/AdminParameters-gdf7036N.cjs.map +1 -0
  31. package/dist/admin/AdminParameters-prMcCgxf.js +4 -0
  32. package/dist/admin/AdminSessions-BF_P4lHs.cjs +128 -0
  33. package/dist/admin/AdminSessions-BF_P4lHs.cjs.map +1 -0
  34. package/dist/admin/AdminSessions-CATIU61I.cjs +4 -0
  35. package/dist/admin/AdminSessions-DqOXOpYR.js +4 -0
  36. package/dist/admin/AdminSessions-Pjdz-iZx.js +123 -0
  37. package/dist/admin/AdminSessions-Pjdz-iZx.js.map +1 -0
  38. package/dist/admin/AdminUsers-BgTL-zSY.js +4 -0
  39. package/dist/admin/AdminUsers-C1HsrRxn.js +104 -0
  40. package/dist/admin/AdminUsers-C1HsrRxn.js.map +1 -0
  41. package/dist/admin/AdminUsers-HqvxwNGZ.cjs +4 -0
  42. package/dist/admin/AdminUsers-M2uEQbp5.cjs +109 -0
  43. package/dist/admin/AdminUsers-M2uEQbp5.cjs.map +1 -0
  44. package/dist/admin/AdminVerifications-BVssbtfU.cjs +44 -0
  45. package/dist/admin/AdminVerifications-BVssbtfU.cjs.map +1 -0
  46. package/dist/admin/AdminVerifications-Df6DRgNo.js +4 -0
  47. package/dist/admin/AdminVerifications-DxAtcYUR.cjs +4 -0
  48. package/dist/admin/AdminVerifications-VMpm30mS.js +40 -0
  49. package/dist/admin/AdminVerifications-VMpm30mS.js.map +1 -0
  50. package/dist/admin/core-CzO6aavT.js +2507 -0
  51. package/dist/admin/core-CzO6aavT.js.map +1 -0
  52. package/dist/{index.cjs → admin/core-aFtK4l9I.cjs} +287 -204
  53. package/dist/admin/core-aFtK4l9I.cjs.map +1 -0
  54. package/dist/admin/index.cjs +87 -0
  55. package/dist/admin/index.cjs.map +1 -0
  56. package/dist/admin/index.d.cts +1739 -0
  57. package/dist/admin/index.d.ts +1745 -0
  58. package/dist/admin/index.js +78 -0
  59. package/dist/admin/index.js.map +1 -0
  60. package/dist/auth/IconGoogle-B17BTQyD.cjs +69 -0
  61. package/dist/auth/IconGoogle-B17BTQyD.cjs.map +1 -0
  62. package/dist/auth/IconGoogle-Bfmuv9Rv.js +58 -0
  63. package/dist/auth/IconGoogle-Bfmuv9Rv.js.map +1 -0
  64. package/dist/auth/Login-BTBmbnWl.cjs +181 -0
  65. package/dist/auth/Login-BTBmbnWl.cjs.map +1 -0
  66. package/dist/auth/Login-BcQOtG3v.js +5 -0
  67. package/dist/auth/Login-Btmd70Um.cjs +5 -0
  68. package/dist/auth/Login-JeXFsUf5.js +176 -0
  69. package/dist/auth/Login-JeXFsUf5.js.map +1 -0
  70. package/dist/auth/Register-CPQnvXCZ.js +318 -0
  71. package/dist/auth/Register-CPQnvXCZ.js.map +1 -0
  72. package/dist/auth/Register-CbesZal3.cjs +5 -0
  73. package/dist/auth/Register-DpI_JdyO.js +5 -0
  74. package/dist/auth/Register-HP3rP71B.cjs +323 -0
  75. package/dist/auth/Register-HP3rP71B.cjs.map +1 -0
  76. package/dist/auth/ResetPassword-B-tkzV7g.cjs +248 -0
  77. package/dist/auth/ResetPassword-B-tkzV7g.cjs.map +1 -0
  78. package/dist/auth/ResetPassword-BlK3xEpU.js +4 -0
  79. package/dist/auth/ResetPassword-BzUjGG_-.js +243 -0
  80. package/dist/auth/ResetPassword-BzUjGG_-.js.map +1 -0
  81. package/dist/auth/ResetPassword-W3xjOnWy.cjs +4 -0
  82. package/dist/auth/chunk-DhGyd7sr.js +28 -0
  83. package/dist/auth/core-D1MHij1j.js +1795 -0
  84. package/dist/auth/core-D1MHij1j.js.map +1 -0
  85. package/dist/auth/core-rDZ9d92K.cjs +1824 -0
  86. package/dist/auth/core-rDZ9d92K.cjs.map +1 -0
  87. package/dist/auth/index.cjs +211 -0
  88. package/dist/auth/index.cjs.map +1 -0
  89. package/dist/auth/index.d.cts +6265 -0
  90. package/dist/auth/index.d.ts +6274 -0
  91. package/dist/auth/index.js +206 -0
  92. package/dist/auth/index.js.map +1 -0
  93. package/dist/core/index.cjs +2620 -0
  94. package/dist/core/index.cjs.map +1 -0
  95. package/dist/core/index.d.cts +2737 -0
  96. package/dist/core/index.d.ts +2743 -0
  97. package/dist/{index.js → core/index.js} +298 -126
  98. package/dist/core/index.js.map +1 -0
  99. package/package.json +32 -14
  100. package/src/admin/AdminRouter.ts +58 -0
  101. package/src/admin/components/AdminFiles.tsx +117 -0
  102. package/src/admin/components/AdminJobs.tsx +158 -0
  103. package/src/admin/components/AdminLayout.tsx +114 -0
  104. package/src/admin/components/AdminNotifications.tsx +20 -0
  105. package/src/admin/components/AdminParameters.tsx +24 -0
  106. package/src/admin/components/AdminSessions.tsx +159 -0
  107. package/src/admin/components/AdminUsers.tsx +137 -0
  108. package/src/admin/components/AdminVerifications.tsx +25 -0
  109. package/src/admin/index.ts +29 -0
  110. package/src/auth/AuthI18n.ts +118 -0
  111. package/src/auth/AuthRouter.ts +53 -0
  112. package/src/auth/components/Login.tsx +193 -0
  113. package/src/auth/components/Register.tsx +421 -0
  114. package/src/auth/components/ResetPassword.tsx +259 -0
  115. package/src/auth/components/buttons/UserButton.tsx +118 -0
  116. package/src/auth/components/icons/IconGithub.tsx +21 -0
  117. package/src/auth/components/icons/IconGoogle.tsx +30 -0
  118. package/src/auth/index.ts +27 -0
  119. package/src/{RootRouter.ts → core/RootRouter.ts} +2 -1
  120. package/src/{components → core/components}/buttons/ActionButton.tsx +49 -6
  121. package/src/core/components/buttons/ClipboardButton.tsx +56 -0
  122. package/src/{components → core/components}/buttons/DarkModeButton.tsx +7 -8
  123. package/src/{components → core/components}/buttons/LanguageButton.tsx +2 -2
  124. package/src/{components → core/components}/buttons/OmnibarButton.tsx +1 -1
  125. package/src/{components → core/components}/dialogs/AlertDialog.tsx +1 -1
  126. package/src/{components → core/components}/dialogs/ConfirmDialog.tsx +1 -1
  127. package/src/{components → core/components}/dialogs/PromptDialog.tsx +1 -1
  128. package/src/{components → core/components}/form/Control.tsx +1 -0
  129. package/src/{components → core/components}/layout/AdminShell.tsx +38 -7
  130. package/src/{components → core/components}/layout/AlephaMantineProvider.tsx +12 -8
  131. package/src/{components → core/components}/layout/AppBar.tsx +1 -1
  132. package/src/{components → core/components}/layout/Omnibar.tsx +1 -1
  133. package/src/{components → core/components}/layout/Sidebar.tsx +29 -26
  134. package/src/{components → core/components}/table/DataTable.tsx +1 -1
  135. package/src/{constants → core/constants}/ui.ts +9 -0
  136. package/src/{index.ts → core/index.ts} +3 -0
  137. package/src/{services → core/services}/DialogService.tsx +3 -3
  138. package/src/{services → core/services}/ToastService.tsx +3 -1
  139. package/src/{utils → core/utils}/extractSchemaFields.ts +2 -8
  140. package/src/{utils → core/utils}/icons.tsx +5 -15
  141. package/src/{utils → core/utils}/parseInput.ts +34 -26
  142. package/dist/AlephaMantineProvider-CGpgWDt8.cjs +0 -3
  143. package/dist/AlephaMantineProvider-D8cHYAge.js +0 -152
  144. package/dist/AlephaMantineProvider-D8cHYAge.js.map +0 -1
  145. package/dist/AlephaMantineProvider-DuvZFAuk.cjs +0 -175
  146. package/dist/AlephaMantineProvider-DuvZFAuk.cjs.map +0 -1
  147. package/dist/AlephaMantineProvider-twBqV4IO.js +0 -3
  148. package/dist/index.cjs.map +0 -1
  149. package/dist/index.d.cts +0 -821
  150. package/dist/index.d.cts.map +0 -1
  151. package/dist/index.d.ts +0 -821
  152. package/dist/index.d.ts.map +0 -1
  153. package/dist/index.js.map +0 -1
  154. /package/src/{components → core/components}/buttons/BurgerButton.tsx +0 -0
  155. /package/src/{components → core/components}/buttons/ToggleSidebarButton.tsx +0 -0
  156. /package/src/{components → core/components}/data/JsonViewer.tsx +0 -0
  157. /package/src/{components → core/components}/form/ControlDate.tsx +0 -0
  158. /package/src/{components → core/components}/form/ControlNumber.tsx +0 -0
  159. /package/src/{components → core/components}/form/ControlQueryBuilder.tsx +0 -0
  160. /package/src/{components → core/components}/form/ControlSelect.tsx +0 -0
  161. /package/src/{components → core/components}/form/TypeForm.tsx +0 -0
  162. /package/src/{hooks → core/hooks}/useDialog.ts +0 -0
  163. /package/src/{hooks → core/hooks}/useToast.ts +0 -0
  164. /package/src/{utils → core/utils}/string.ts +0 -0
package/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # Alepha Ui
2
2
 
3
+ UI components and themes for Alepha framework based on Mantine UI library.
4
+
3
5
  ## Installation
4
6
 
5
7
  This package is part of the Alepha framework and can be installed via the all-in-one package:
@@ -8,33 +10,3 @@ This package is part of the Alepha framework and can be installed via the all-in
8
10
  npm install alepha
9
11
  ```
10
12
 
11
- ## Module
12
-
13
- Mantine
14
-
15
- ## API Reference
16
-
17
- ### Hooks
18
-
19
- Hooks provide a way to tap into various lifecycle events and extend functionality. They follow the convention of starting with `use` and return configured hook instances.
20
-
21
- #### useDialog()
22
-
23
- Use this hook to access the Dialog Service for showing various dialog types.
24
-
25
- ```tsx
26
- const dialog = useDialog();
27
- await dialog.alert({ title: "Alert", message: "This is an alert message" });
28
- const confirmed = await dialog.confirm({ title: "Confirm", message: "Are you sure?" });
29
- const input = await dialog.prompt({ title: "Input", message: "Enter your name:" });
30
- ```
31
-
32
- #### useToast()
33
-
34
- Use this hook to access the Toast Service for showing notifications.
35
-
36
- ```tsx
37
- const toast = useToast();
38
- toast.success({ message: "Operation completed successfully!" });
39
- toast.error({ title: "Error", message: "Something went wrong" });
40
- ```
@@ -0,0 +1,4 @@
1
+ require('./core-aFtK4l9I.cjs');
2
+ const require_AdminFiles = require('./AdminFiles-DC3T8uWZ.cjs');
3
+
4
+ exports.default = require_AdminFiles.AdminFiles_default;
@@ -0,0 +1,4 @@
1
+ import "./core-CzO6aavT.js";
2
+ import { t as AdminFiles_default } from "./AdminFiles-CllAxb1B.js";
3
+
4
+ export { AdminFiles_default as default };
@@ -0,0 +1,117 @@
1
+ import { i as DataTable_default, n as Flex$1, r as Text$1 } from "./core-CzO6aavT.js";
2
+ import { useI18n } from "@alepha/react/i18n";
3
+ import { t } from "alepha";
4
+ import { useClient } from "@alepha/react";
5
+ import { Badge } from "@mantine/core";
6
+ import { jsx } from "react/jsx-runtime";
7
+ import { files } from "alepha/api/files";
8
+
9
+ //#region src/admin/components/AdminFiles.tsx
10
+ const AdminFiles = () => {
11
+ const client = useClient();
12
+ const { l } = useI18n();
13
+ const filters = t.object({
14
+ bucket: t.optional(t.string()),
15
+ name: t.optional(t.string({ $control: { query: t.pick(files.schema, [
16
+ "name",
17
+ "bucket",
18
+ "mimeType"
19
+ ]) } }))
20
+ });
21
+ const formatFileSize = (bytes) => {
22
+ if (bytes === 0) return "0 B";
23
+ const k = 1024;
24
+ const sizes = [
25
+ "B",
26
+ "KB",
27
+ "MB",
28
+ "GB"
29
+ ];
30
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
31
+ return `${Number.parseFloat((bytes / k ** i).toFixed(1))} ${sizes[i]}`;
32
+ };
33
+ return /* @__PURE__ */ jsx(Flex$1, {
34
+ flex: 1,
35
+ children: /* @__PURE__ */ jsx(DataTable_default, {
36
+ submitOnInit: true,
37
+ defaultSize: 10,
38
+ typeFormProps: {
39
+ skipSubmitButton: true,
40
+ columns: 3
41
+ },
42
+ tableProps: {
43
+ horizontalSpacing: "xs",
44
+ verticalSpacing: "xs"
45
+ },
46
+ onFilterChange: (key, _value, form) => {
47
+ if (key === "name" || key === "bucket") return form.submit();
48
+ },
49
+ filters,
50
+ items: async (filters$1) => {
51
+ return await client.findFiles({ query: filters$1 });
52
+ },
53
+ columns: {
54
+ name: {
55
+ label: "Name",
56
+ value: (item) => /* @__PURE__ */ jsx(Text$1, {
57
+ size: "sm",
58
+ fw: 500,
59
+ lineClamp: 1,
60
+ children: item.name
61
+ })
62
+ },
63
+ bucket: {
64
+ label: "Bucket",
65
+ fit: true,
66
+ value: (item) => /* @__PURE__ */ jsx(Badge, {
67
+ size: "sm",
68
+ variant: "light",
69
+ color: "blue",
70
+ children: item.bucket
71
+ })
72
+ },
73
+ mimeType: {
74
+ label: "Type",
75
+ fit: true,
76
+ value: (item) => /* @__PURE__ */ jsx(Text$1, {
77
+ size: "xs",
78
+ c: "dimmed",
79
+ children: item.mimeType
80
+ })
81
+ },
82
+ size: {
83
+ label: "Size",
84
+ fit: true,
85
+ value: (item) => /* @__PURE__ */ jsx(Text$1, {
86
+ size: "xs",
87
+ c: "dimmed",
88
+ children: formatFileSize(item.size)
89
+ })
90
+ },
91
+ creatorName: {
92
+ label: "Creator",
93
+ fit: true,
94
+ value: (item) => /* @__PURE__ */ jsx(Text$1, {
95
+ size: "xs",
96
+ c: "dimmed",
97
+ children: item.creatorName || "-"
98
+ })
99
+ },
100
+ createdAt: {
101
+ label: "Created",
102
+ fit: true,
103
+ value: (item) => /* @__PURE__ */ jsx(Text$1, {
104
+ size: "xs",
105
+ c: "dimmed",
106
+ children: l(item.createdAt, { date: "fromNow" })
107
+ })
108
+ }
109
+ }
110
+ })
111
+ });
112
+ };
113
+ var AdminFiles_default = AdminFiles;
114
+
115
+ //#endregion
116
+ export { AdminFiles_default as t };
117
+ //# sourceMappingURL=AdminFiles-CllAxb1B.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdminFiles-CllAxb1B.js","names":["Flex","DataTable","filters","Text"],"sources":["../../src/admin/components/AdminFiles.tsx"],"sourcesContent":["import { useClient } from \"@alepha/react\";\nimport { useI18n } from \"@alepha/react/i18n\";\nimport { DataTable, Flex, Text } from \"@alepha/ui\";\nimport { Badge } from \"@mantine/core\";\nimport { type Page, t } from \"alepha\";\nimport { type FileController, type FileEntity, files } from \"alepha/api/files\";\n\nconst AdminFiles = () => {\n const client = useClient<FileController>();\n const { l } = useI18n();\n\n const filters = t.object({\n bucket: t.optional(t.string()),\n name: t.optional(\n t.string({\n $control: {\n query: t.pick(files.schema, [\"name\", \"bucket\", \"mimeType\"]),\n },\n }),\n ),\n });\n\n const formatFileSize = (bytes: number) => {\n if (bytes === 0) return \"0 B\";\n const k = 1024;\n const sizes = [\"B\", \"KB\", \"MB\", \"GB\"];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return `${Number.parseFloat((bytes / k ** i).toFixed(1))} ${sizes[i]}`;\n };\n\n return (\n <Flex flex={1}>\n <DataTable<FileEntity, typeof filters>\n submitOnInit\n defaultSize={10}\n typeFormProps={{\n skipSubmitButton: true,\n columns: 3,\n }}\n tableProps={{\n horizontalSpacing: \"xs\",\n verticalSpacing: \"xs\",\n }}\n onFilterChange={(key, _value, form) => {\n if (key === \"name\" || key === \"bucket\") {\n return form.submit();\n }\n }}\n filters={filters}\n items={async (filters) => {\n const response = await client.findFiles({\n query: filters,\n });\n\n return response as Page<FileEntity>;\n }}\n columns={{\n name: {\n label: \"Name\",\n value: (item) => (\n <Text size=\"sm\" fw={500} lineClamp={1}>\n {item.name}\n </Text>\n ),\n },\n bucket: {\n label: \"Bucket\",\n fit: true,\n value: (item) => (\n <Badge size=\"sm\" variant=\"light\" color=\"blue\">\n {item.bucket}\n </Badge>\n ),\n },\n mimeType: {\n label: \"Type\",\n fit: true,\n value: (item) => (\n <Text size=\"xs\" c=\"dimmed\">\n {item.mimeType}\n </Text>\n ),\n },\n size: {\n label: \"Size\",\n fit: true,\n value: (item) => (\n <Text size=\"xs\" c=\"dimmed\">\n {formatFileSize(item.size)}\n </Text>\n ),\n },\n creatorName: {\n label: \"Creator\",\n fit: true,\n value: (item) => (\n <Text size=\"xs\" c=\"dimmed\">\n {item.creatorName || \"-\"}\n </Text>\n ),\n },\n createdAt: {\n label: \"Created\",\n fit: true,\n value: (item) => (\n <Text size=\"xs\" c=\"dimmed\">\n {l(item.createdAt, { date: \"fromNow\" })}\n </Text>\n ),\n },\n }}\n />\n </Flex>\n );\n};\n\nexport default AdminFiles;\n"],"mappings":";;;;;;;;;AAOA,MAAM,mBAAmB;CACvB,MAAM,SAAS,WAA2B;CAC1C,MAAM,EAAE,MAAM,SAAS;CAEvB,MAAM,UAAU,EAAE,OAAO;EACvB,QAAQ,EAAE,SAAS,EAAE,QAAQ,CAAC;EAC9B,MAAM,EAAE,SACN,EAAE,OAAO,EACP,UAAU,EACR,OAAO,EAAE,KAAK,MAAM,QAAQ;GAAC;GAAQ;GAAU;GAAW,CAAC,EAC5D,EACF,CAAC,CACH;EACF,CAAC;CAEF,MAAM,kBAAkB,UAAkB;AACxC,MAAI,UAAU,EAAG,QAAO;EACxB,MAAM,IAAI;EACV,MAAM,QAAQ;GAAC;GAAK;GAAM;GAAM;GAAK;EACrC,MAAM,IAAI,KAAK,MAAM,KAAK,IAAI,MAAM,GAAG,KAAK,IAAI,EAAE,CAAC;AACnD,SAAO,GAAG,OAAO,YAAY,QAAQ,KAAK,GAAG,QAAQ,EAAE,CAAC,CAAC,GAAG,MAAM;;AAGpE,QACE,oBAACA;EAAK,MAAM;YACV,oBAACC;GACC;GACA,aAAa;GACb,eAAe;IACb,kBAAkB;IAClB,SAAS;IACV;GACD,YAAY;IACV,mBAAmB;IACnB,iBAAiB;IAClB;GACD,iBAAiB,KAAK,QAAQ,SAAS;AACrC,QAAI,QAAQ,UAAU,QAAQ,SAC5B,QAAO,KAAK,QAAQ;;GAGf;GACT,OAAO,OAAO,cAAY;AAKxB,WAJiB,MAAM,OAAO,UAAU,EACtC,OAAOC,WACR,CAAC;;GAIJ,SAAS;IACP,MAAM;KACJ,OAAO;KACP,QAAQ,SACN,oBAACC;MAAK,MAAK;MAAK,IAAI;MAAK,WAAW;gBACjC,KAAK;OACD;KAEV;IACD,QAAQ;KACN,OAAO;KACP,KAAK;KACL,QAAQ,SACN,oBAAC;MAAM,MAAK;MAAK,SAAQ;MAAQ,OAAM;gBACpC,KAAK;OACA;KAEX;IACD,UAAU;KACR,OAAO;KACP,KAAK;KACL,QAAQ,SACN,oBAACA;MAAK,MAAK;MAAK,GAAE;gBACf,KAAK;OACD;KAEV;IACD,MAAM;KACJ,OAAO;KACP,KAAK;KACL,QAAQ,SACN,oBAACA;MAAK,MAAK;MAAK,GAAE;gBACf,eAAe,KAAK,KAAK;OACrB;KAEV;IACD,aAAa;KACX,OAAO;KACP,KAAK;KACL,QAAQ,SACN,oBAACA;MAAK,MAAK;MAAK,GAAE;gBACf,KAAK,eAAe;OAChB;KAEV;IACD,WAAW;KACT,OAAO;KACP,KAAK;KACL,QAAQ,SACN,oBAACA;MAAK,MAAK;MAAK,GAAE;gBACf,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;OAClC;KAEV;IACF;IACD;GACG;;AAIX,yBAAe"}
@@ -0,0 +1,122 @@
1
+ const require_core = require('./core-aFtK4l9I.cjs');
2
+ let __alepha_react_i18n = require("@alepha/react/i18n");
3
+ let alepha = require("alepha");
4
+ let __alepha_react = require("@alepha/react");
5
+ let __mantine_core = require("@mantine/core");
6
+ let react_jsx_runtime = require("react/jsx-runtime");
7
+ let alepha_api_files = require("alepha/api/files");
8
+
9
+ //#region src/admin/components/AdminFiles.tsx
10
+ const AdminFiles = () => {
11
+ const client = (0, __alepha_react.useClient)();
12
+ const { l } = (0, __alepha_react_i18n.useI18n)();
13
+ const filters = alepha.t.object({
14
+ bucket: alepha.t.optional(alepha.t.string()),
15
+ name: alepha.t.optional(alepha.t.string({ $control: { query: alepha.t.pick(alepha_api_files.files.schema, [
16
+ "name",
17
+ "bucket",
18
+ "mimeType"
19
+ ]) } }))
20
+ });
21
+ const formatFileSize = (bytes) => {
22
+ if (bytes === 0) return "0 B";
23
+ const k = 1024;
24
+ const sizes = [
25
+ "B",
26
+ "KB",
27
+ "MB",
28
+ "GB"
29
+ ];
30
+ const i = Math.floor(Math.log(bytes) / Math.log(k));
31
+ return `${Number.parseFloat((bytes / k ** i).toFixed(1))} ${sizes[i]}`;
32
+ };
33
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(__mantine_core.Flex, {
34
+ flex: 1,
35
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_core.DataTable_default, {
36
+ submitOnInit: true,
37
+ defaultSize: 10,
38
+ typeFormProps: {
39
+ skipSubmitButton: true,
40
+ columns: 3
41
+ },
42
+ tableProps: {
43
+ horizontalSpacing: "xs",
44
+ verticalSpacing: "xs"
45
+ },
46
+ onFilterChange: (key, _value, form) => {
47
+ if (key === "name" || key === "bucket") return form.submit();
48
+ },
49
+ filters,
50
+ items: async (filters$1) => {
51
+ return await client.findFiles({ query: filters$1 });
52
+ },
53
+ columns: {
54
+ name: {
55
+ label: "Name",
56
+ value: (item) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(__mantine_core.Text, {
57
+ size: "sm",
58
+ fw: 500,
59
+ lineClamp: 1,
60
+ children: item.name
61
+ })
62
+ },
63
+ bucket: {
64
+ label: "Bucket",
65
+ fit: true,
66
+ value: (item) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(__mantine_core.Badge, {
67
+ size: "sm",
68
+ variant: "light",
69
+ color: "blue",
70
+ children: item.bucket
71
+ })
72
+ },
73
+ mimeType: {
74
+ label: "Type",
75
+ fit: true,
76
+ value: (item) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(__mantine_core.Text, {
77
+ size: "xs",
78
+ c: "dimmed",
79
+ children: item.mimeType
80
+ })
81
+ },
82
+ size: {
83
+ label: "Size",
84
+ fit: true,
85
+ value: (item) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(__mantine_core.Text, {
86
+ size: "xs",
87
+ c: "dimmed",
88
+ children: formatFileSize(item.size)
89
+ })
90
+ },
91
+ creatorName: {
92
+ label: "Creator",
93
+ fit: true,
94
+ value: (item) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(__mantine_core.Text, {
95
+ size: "xs",
96
+ c: "dimmed",
97
+ children: item.creatorName || "-"
98
+ })
99
+ },
100
+ createdAt: {
101
+ label: "Created",
102
+ fit: true,
103
+ value: (item) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(__mantine_core.Text, {
104
+ size: "xs",
105
+ c: "dimmed",
106
+ children: l(item.createdAt, { date: "fromNow" })
107
+ })
108
+ }
109
+ }
110
+ })
111
+ });
112
+ };
113
+ var AdminFiles_default = AdminFiles;
114
+
115
+ //#endregion
116
+ Object.defineProperty(exports, 'AdminFiles_default', {
117
+ enumerable: true,
118
+ get: function () {
119
+ return AdminFiles_default;
120
+ }
121
+ });
122
+ //# sourceMappingURL=AdminFiles-DC3T8uWZ.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdminFiles-DC3T8uWZ.cjs","names":["t","files","Flex","DataTable","filters","Text","Badge"],"sources":["../../src/admin/components/AdminFiles.tsx"],"sourcesContent":["import { useClient } from \"@alepha/react\";\nimport { useI18n } from \"@alepha/react/i18n\";\nimport { DataTable, Flex, Text } from \"@alepha/ui\";\nimport { Badge } from \"@mantine/core\";\nimport { type Page, t } from \"alepha\";\nimport { type FileController, type FileEntity, files } from \"alepha/api/files\";\n\nconst AdminFiles = () => {\n const client = useClient<FileController>();\n const { l } = useI18n();\n\n const filters = t.object({\n bucket: t.optional(t.string()),\n name: t.optional(\n t.string({\n $control: {\n query: t.pick(files.schema, [\"name\", \"bucket\", \"mimeType\"]),\n },\n }),\n ),\n });\n\n const formatFileSize = (bytes: number) => {\n if (bytes === 0) return \"0 B\";\n const k = 1024;\n const sizes = [\"B\", \"KB\", \"MB\", \"GB\"];\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n return `${Number.parseFloat((bytes / k ** i).toFixed(1))} ${sizes[i]}`;\n };\n\n return (\n <Flex flex={1}>\n <DataTable<FileEntity, typeof filters>\n submitOnInit\n defaultSize={10}\n typeFormProps={{\n skipSubmitButton: true,\n columns: 3,\n }}\n tableProps={{\n horizontalSpacing: \"xs\",\n verticalSpacing: \"xs\",\n }}\n onFilterChange={(key, _value, form) => {\n if (key === \"name\" || key === \"bucket\") {\n return form.submit();\n }\n }}\n filters={filters}\n items={async (filters) => {\n const response = await client.findFiles({\n query: filters,\n });\n\n return response as Page<FileEntity>;\n }}\n columns={{\n name: {\n label: \"Name\",\n value: (item) => (\n <Text size=\"sm\" fw={500} lineClamp={1}>\n {item.name}\n </Text>\n ),\n },\n bucket: {\n label: \"Bucket\",\n fit: true,\n value: (item) => (\n <Badge size=\"sm\" variant=\"light\" color=\"blue\">\n {item.bucket}\n </Badge>\n ),\n },\n mimeType: {\n label: \"Type\",\n fit: true,\n value: (item) => (\n <Text size=\"xs\" c=\"dimmed\">\n {item.mimeType}\n </Text>\n ),\n },\n size: {\n label: \"Size\",\n fit: true,\n value: (item) => (\n <Text size=\"xs\" c=\"dimmed\">\n {formatFileSize(item.size)}\n </Text>\n ),\n },\n creatorName: {\n label: \"Creator\",\n fit: true,\n value: (item) => (\n <Text size=\"xs\" c=\"dimmed\">\n {item.creatorName || \"-\"}\n </Text>\n ),\n },\n createdAt: {\n label: \"Created\",\n fit: true,\n value: (item) => (\n <Text size=\"xs\" c=\"dimmed\">\n {l(item.createdAt, { date: \"fromNow\" })}\n </Text>\n ),\n },\n }}\n />\n </Flex>\n );\n};\n\nexport default AdminFiles;\n"],"mappings":";;;;;;;;;AAOA,MAAM,mBAAmB;CACvB,MAAM,wCAAoC;CAC1C,MAAM,EAAE,wCAAe;CAEvB,MAAM,UAAUA,SAAE,OAAO;EACvB,QAAQA,SAAE,SAASA,SAAE,QAAQ,CAAC;EAC9B,MAAMA,SAAE,SACNA,SAAE,OAAO,EACP,UAAU,EACR,OAAOA,SAAE,KAAKC,uBAAM,QAAQ;GAAC;GAAQ;GAAU;GAAW,CAAC,EAC5D,EACF,CAAC,CACH;EACF,CAAC;CAEF,MAAM,kBAAkB,UAAkB;AACxC,MAAI,UAAU,EAAG,QAAO;EACxB,MAAM,IAAI;EACV,MAAM,QAAQ;GAAC;GAAK;GAAM;GAAM;GAAK;EACrC,MAAM,IAAI,KAAK,MAAM,KAAK,IAAI,MAAM,GAAG,KAAK,IAAI,EAAE,CAAC;AACnD,SAAO,GAAG,OAAO,YAAY,QAAQ,KAAK,GAAG,QAAQ,EAAE,CAAC,CAAC,GAAG,MAAM;;AAGpE,QACE,2CAACC;EAAK,MAAM;YACV,2CAACC;GACC;GACA,aAAa;GACb,eAAe;IACb,kBAAkB;IAClB,SAAS;IACV;GACD,YAAY;IACV,mBAAmB;IACnB,iBAAiB;IAClB;GACD,iBAAiB,KAAK,QAAQ,SAAS;AACrC,QAAI,QAAQ,UAAU,QAAQ,SAC5B,QAAO,KAAK,QAAQ;;GAGf;GACT,OAAO,OAAO,cAAY;AAKxB,WAJiB,MAAM,OAAO,UAAU,EACtC,OAAOC,WACR,CAAC;;GAIJ,SAAS;IACP,MAAM;KACJ,OAAO;KACP,QAAQ,SACN,2CAACC;MAAK,MAAK;MAAK,IAAI;MAAK,WAAW;gBACjC,KAAK;OACD;KAEV;IACD,QAAQ;KACN,OAAO;KACP,KAAK;KACL,QAAQ,SACN,2CAACC;MAAM,MAAK;MAAK,SAAQ;MAAQ,OAAM;gBACpC,KAAK;OACA;KAEX;IACD,UAAU;KACR,OAAO;KACP,KAAK;KACL,QAAQ,SACN,2CAACD;MAAK,MAAK;MAAK,GAAE;gBACf,KAAK;OACD;KAEV;IACD,MAAM;KACJ,OAAO;KACP,KAAK;KACL,QAAQ,SACN,2CAACA;MAAK,MAAK;MAAK,GAAE;gBACf,eAAe,KAAK,KAAK;OACrB;KAEV;IACD,aAAa;KACX,OAAO;KACP,KAAK;KACL,QAAQ,SACN,2CAACA;MAAK,MAAK;MAAK,GAAE;gBACf,KAAK,eAAe;OAChB;KAEV;IACD,WAAW;KACT,OAAO;KACP,KAAK;KACL,QAAQ,SACN,2CAACA;MAAK,MAAK;MAAK,GAAE;gBACf,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;OAClC;KAEV;IACF;IACD;GACG;;AAIX,yBAAe"}
@@ -0,0 +1,125 @@
1
+ import { i as DataTable_default, n as Flex$1, r as Text$1 } from "./core-CzO6aavT.js";
2
+ import { useI18n } from "@alepha/react/i18n";
3
+ import { t } from "alepha";
4
+ import { useClient } from "@alepha/react";
5
+ import { Badge } from "@mantine/core";
6
+ import { IconCheck, IconClock, IconPlayerPlay, IconX } from "@tabler/icons-react";
7
+ import { jsx } from "react/jsx-runtime";
8
+ import { jobExecutions } from "alepha/api/jobs";
9
+
10
+ //#region src/admin/components/AdminJobs.tsx
11
+ const AdminJobs = () => {
12
+ const client = useClient();
13
+ const { l } = useI18n();
14
+ const filters = t.object({
15
+ job: t.optional(t.string({ $control: { query: t.pick(jobExecutions.schema, ["job"]) } })),
16
+ status: t.optional(t.enum([
17
+ "STARTED",
18
+ "FAILED",
19
+ "COMPLETED"
20
+ ]))
21
+ });
22
+ const getStatusColor = (status) => {
23
+ switch (status) {
24
+ case "COMPLETED": return "green";
25
+ case "FAILED": return "red";
26
+ case "STARTED": return "blue";
27
+ default: return "gray";
28
+ }
29
+ };
30
+ const getStatusIcon = (status) => {
31
+ switch (status) {
32
+ case "COMPLETED": return /* @__PURE__ */ jsx(IconCheck, { size: 12 });
33
+ case "FAILED": return /* @__PURE__ */ jsx(IconX, { size: 12 });
34
+ case "STARTED": return /* @__PURE__ */ jsx(IconPlayerPlay, { size: 12 });
35
+ default: return /* @__PURE__ */ jsx(IconClock, { size: 12 });
36
+ }
37
+ };
38
+ const formatDuration = (start, end) => {
39
+ const startTime = new Date(start).getTime();
40
+ const duration = (end ? new Date(end).getTime() : Date.now()) - startTime;
41
+ if (duration < 1e3) return `${duration}ms`;
42
+ if (duration < 6e4) return `${(duration / 1e3).toFixed(1)}s`;
43
+ return `${Math.floor(duration / 6e4)}m ${Math.floor(duration % 6e4 / 1e3)}s`;
44
+ };
45
+ return /* @__PURE__ */ jsx(Flex$1, {
46
+ flex: 1,
47
+ children: /* @__PURE__ */ jsx(DataTable_default, {
48
+ submitOnInit: true,
49
+ defaultSize: 10,
50
+ typeFormProps: {
51
+ skipSubmitButton: true,
52
+ columns: 3
53
+ },
54
+ tableProps: {
55
+ horizontalSpacing: "xs",
56
+ verticalSpacing: "xs"
57
+ },
58
+ onFilterChange: (key, _value, form) => {
59
+ if (key === "job" || key === "status") return form.submit();
60
+ },
61
+ filters,
62
+ items: async (filters$1) => {
63
+ return await client.getJobExecutions({ query: filters$1 });
64
+ },
65
+ columns: {
66
+ job: {
67
+ label: "Job",
68
+ value: (item) => /* @__PURE__ */ jsx(Text$1, {
69
+ size: "sm",
70
+ fw: 500,
71
+ children: item.job
72
+ })
73
+ },
74
+ status: {
75
+ label: "Status",
76
+ fit: true,
77
+ value: (item) => /* @__PURE__ */ jsx(Badge, {
78
+ size: "sm",
79
+ variant: "light",
80
+ color: getStatusColor(item.status),
81
+ leftSection: getStatusIcon(item.status),
82
+ children: item.status
83
+ })
84
+ },
85
+ duration: {
86
+ label: "Duration",
87
+ fit: true,
88
+ value: (item) => /* @__PURE__ */ jsx(Text$1, {
89
+ size: "xs",
90
+ c: "dimmed",
91
+ ff: "monospace",
92
+ children: formatDuration(item.createdAt, item.finishedAt)
93
+ })
94
+ },
95
+ error: {
96
+ label: "Error",
97
+ value: (item) => item.error ? /* @__PURE__ */ jsx(Text$1, {
98
+ size: "xs",
99
+ c: "red",
100
+ lineClamp: 1,
101
+ children: item.error
102
+ }) : /* @__PURE__ */ jsx(Text$1, {
103
+ size: "xs",
104
+ c: "dimmed",
105
+ children: "-"
106
+ })
107
+ },
108
+ createdAt: {
109
+ label: "Started",
110
+ fit: true,
111
+ value: (item) => /* @__PURE__ */ jsx(Text$1, {
112
+ size: "xs",
113
+ c: "dimmed",
114
+ children: l(item.createdAt, { date: "fromNow" })
115
+ })
116
+ }
117
+ }
118
+ })
119
+ });
120
+ };
121
+ var AdminJobs_default = AdminJobs;
122
+
123
+ //#endregion
124
+ export { AdminJobs_default as t };
125
+ //# sourceMappingURL=AdminJobs-BXkFtlVo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdminJobs-BXkFtlVo.js","names":["Flex","DataTable","filters","Text"],"sources":["../../src/admin/components/AdminJobs.tsx"],"sourcesContent":["import { useClient } from \"@alepha/react\";\nimport { useI18n } from \"@alepha/react/i18n\";\nimport { DataTable, Flex, Text } from \"@alepha/ui\";\nimport { Badge } from \"@mantine/core\";\nimport {\n IconCheck,\n IconClock,\n IconPlayerPlay,\n IconX,\n} from \"@tabler/icons-react\";\nimport { type Page, t } from \"alepha\";\nimport {\n type JobController,\n type JobExecutionEntity,\n jobExecutions,\n} from \"alepha/api/jobs\";\n\nconst AdminJobs = () => {\n const client = useClient<JobController>();\n const { l } = useI18n();\n\n const filters = t.object({\n job: t.optional(\n t.string({\n $control: {\n query: t.pick(jobExecutions.schema, [\"job\"]),\n },\n }),\n ),\n status: t.optional(t.enum([\"STARTED\", \"FAILED\", \"COMPLETED\"])),\n });\n\n const getStatusColor = (status: string) => {\n switch (status) {\n case \"COMPLETED\":\n return \"green\";\n case \"FAILED\":\n return \"red\";\n case \"STARTED\":\n return \"blue\";\n default:\n return \"gray\";\n }\n };\n\n const getStatusIcon = (status: string) => {\n switch (status) {\n case \"COMPLETED\":\n return <IconCheck size={12} />;\n case \"FAILED\":\n return <IconX size={12} />;\n case \"STARTED\":\n return <IconPlayerPlay size={12} />;\n default:\n return <IconClock size={12} />;\n }\n };\n\n const formatDuration = (\n start: Date | string,\n end?: Date | string | null,\n ): string => {\n const startTime = new Date(start).getTime();\n const endTime = end ? new Date(end).getTime() : Date.now();\n const duration = endTime - startTime;\n\n if (duration < 1000) return `${duration}ms`;\n if (duration < 60000) return `${(duration / 1000).toFixed(1)}s`;\n return `${Math.floor(duration / 60000)}m ${Math.floor((duration % 60000) / 1000)}s`;\n };\n\n return (\n <Flex flex={1}>\n <DataTable<JobExecutionEntity, typeof filters>\n submitOnInit\n defaultSize={10}\n typeFormProps={{\n skipSubmitButton: true,\n columns: 3,\n }}\n tableProps={{\n horizontalSpacing: \"xs\",\n verticalSpacing: \"xs\",\n }}\n onFilterChange={(key, _value, form) => {\n if (key === \"job\" || key === \"status\") {\n return form.submit();\n }\n }}\n filters={filters}\n items={async (filters) => {\n const response = await client.getJobExecutions({\n query: filters,\n });\n\n return response as Page<JobExecutionEntity>;\n }}\n columns={{\n job: {\n label: \"Job\",\n value: (item) => (\n <Text size=\"sm\" fw={500}>\n {item.job}\n </Text>\n ),\n },\n status: {\n label: \"Status\",\n fit: true,\n value: (item) => (\n <Badge\n size=\"sm\"\n variant=\"light\"\n color={getStatusColor(item.status)}\n leftSection={getStatusIcon(item.status)}\n >\n {item.status}\n </Badge>\n ),\n },\n duration: {\n label: \"Duration\",\n fit: true,\n value: (item) => (\n <Text size=\"xs\" c=\"dimmed\" ff=\"monospace\">\n {formatDuration(item.createdAt, item.finishedAt)}\n </Text>\n ),\n },\n error: {\n label: \"Error\",\n value: (item) =>\n item.error ? (\n <Text size=\"xs\" c=\"red\" lineClamp={1}>\n {item.error}\n </Text>\n ) : (\n <Text size=\"xs\" c=\"dimmed\">\n -\n </Text>\n ),\n },\n createdAt: {\n label: \"Started\",\n fit: true,\n value: (item) => (\n <Text size=\"xs\" c=\"dimmed\">\n {l(item.createdAt, { date: \"fromNow\" })}\n </Text>\n ),\n },\n }}\n />\n </Flex>\n );\n};\n\nexport default AdminJobs;\n"],"mappings":";;;;;;;;;;AAiBA,MAAM,kBAAkB;CACtB,MAAM,SAAS,WAA0B;CACzC,MAAM,EAAE,MAAM,SAAS;CAEvB,MAAM,UAAU,EAAE,OAAO;EACvB,KAAK,EAAE,SACL,EAAE,OAAO,EACP,UAAU,EACR,OAAO,EAAE,KAAK,cAAc,QAAQ,CAAC,MAAM,CAAC,EAC7C,EACF,CAAC,CACH;EACD,QAAQ,EAAE,SAAS,EAAE,KAAK;GAAC;GAAW;GAAU;GAAY,CAAC,CAAC;EAC/D,CAAC;CAEF,MAAM,kBAAkB,WAAmB;AACzC,UAAQ,QAAR;GACE,KAAK,YACH,QAAO;GACT,KAAK,SACH,QAAO;GACT,KAAK,UACH,QAAO;GACT,QACE,QAAO;;;CAIb,MAAM,iBAAiB,WAAmB;AACxC,UAAQ,QAAR;GACE,KAAK,YACH,QAAO,oBAAC,aAAU,MAAM,KAAM;GAChC,KAAK,SACH,QAAO,oBAAC,SAAM,MAAM,KAAM;GAC5B,KAAK,UACH,QAAO,oBAAC,kBAAe,MAAM,KAAM;GACrC,QACE,QAAO,oBAAC,aAAU,MAAM,KAAM;;;CAIpC,MAAM,kBACJ,OACA,QACW;EACX,MAAM,YAAY,IAAI,KAAK,MAAM,CAAC,SAAS;EAE3C,MAAM,YADU,MAAM,IAAI,KAAK,IAAI,CAAC,SAAS,GAAG,KAAK,KAAK,IAC/B;AAE3B,MAAI,WAAW,IAAM,QAAO,GAAG,SAAS;AACxC,MAAI,WAAW,IAAO,QAAO,IAAI,WAAW,KAAM,QAAQ,EAAE,CAAC;AAC7D,SAAO,GAAG,KAAK,MAAM,WAAW,IAAM,CAAC,IAAI,KAAK,MAAO,WAAW,MAAS,IAAK,CAAC;;AAGnF,QACE,oBAACA;EAAK,MAAM;YACV,oBAACC;GACC;GACA,aAAa;GACb,eAAe;IACb,kBAAkB;IAClB,SAAS;IACV;GACD,YAAY;IACV,mBAAmB;IACnB,iBAAiB;IAClB;GACD,iBAAiB,KAAK,QAAQ,SAAS;AACrC,QAAI,QAAQ,SAAS,QAAQ,SAC3B,QAAO,KAAK,QAAQ;;GAGf;GACT,OAAO,OAAO,cAAY;AAKxB,WAJiB,MAAM,OAAO,iBAAiB,EAC7C,OAAOC,WACR,CAAC;;GAIJ,SAAS;IACP,KAAK;KACH,OAAO;KACP,QAAQ,SACN,oBAACC;MAAK,MAAK;MAAK,IAAI;gBACjB,KAAK;OACD;KAEV;IACD,QAAQ;KACN,OAAO;KACP,KAAK;KACL,QAAQ,SACN,oBAAC;MACC,MAAK;MACL,SAAQ;MACR,OAAO,eAAe,KAAK,OAAO;MAClC,aAAa,cAAc,KAAK,OAAO;gBAEtC,KAAK;OACA;KAEX;IACD,UAAU;KACR,OAAO;KACP,KAAK;KACL,QAAQ,SACN,oBAACA;MAAK,MAAK;MAAK,GAAE;MAAS,IAAG;gBAC3B,eAAe,KAAK,WAAW,KAAK,WAAW;OAC3C;KAEV;IACD,OAAO;KACL,OAAO;KACP,QAAQ,SACN,KAAK,QACH,oBAACA;MAAK,MAAK;MAAK,GAAE;MAAM,WAAW;gBAChC,KAAK;OACD,GAEP,oBAACA;MAAK,MAAK;MAAK,GAAE;gBAAS;OAEpB;KAEZ;IACD,WAAW;KACT,OAAO;KACP,KAAK;KACL,QAAQ,SACN,oBAACA;MAAK,MAAK;MAAK,GAAE;gBACf,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;OAClC;KAEV;IACF;IACD;GACG;;AAIX,wBAAe"}
@@ -0,0 +1,130 @@
1
+ const require_core = require('./core-aFtK4l9I.cjs');
2
+ let __alepha_react_i18n = require("@alepha/react/i18n");
3
+ let alepha = require("alepha");
4
+ let __alepha_react = require("@alepha/react");
5
+ let __mantine_core = require("@mantine/core");
6
+ let __tabler_icons_react = require("@tabler/icons-react");
7
+ let react_jsx_runtime = require("react/jsx-runtime");
8
+ let alepha_api_jobs = require("alepha/api/jobs");
9
+
10
+ //#region src/admin/components/AdminJobs.tsx
11
+ const AdminJobs = () => {
12
+ const client = (0, __alepha_react.useClient)();
13
+ const { l } = (0, __alepha_react_i18n.useI18n)();
14
+ const filters = alepha.t.object({
15
+ job: alepha.t.optional(alepha.t.string({ $control: { query: alepha.t.pick(alepha_api_jobs.jobExecutions.schema, ["job"]) } })),
16
+ status: alepha.t.optional(alepha.t.enum([
17
+ "STARTED",
18
+ "FAILED",
19
+ "COMPLETED"
20
+ ]))
21
+ });
22
+ const getStatusColor = (status) => {
23
+ switch (status) {
24
+ case "COMPLETED": return "green";
25
+ case "FAILED": return "red";
26
+ case "STARTED": return "blue";
27
+ default: return "gray";
28
+ }
29
+ };
30
+ const getStatusIcon = (status) => {
31
+ switch (status) {
32
+ case "COMPLETED": return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(__tabler_icons_react.IconCheck, { size: 12 });
33
+ case "FAILED": return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(__tabler_icons_react.IconX, { size: 12 });
34
+ case "STARTED": return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(__tabler_icons_react.IconPlayerPlay, { size: 12 });
35
+ default: return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(__tabler_icons_react.IconClock, { size: 12 });
36
+ }
37
+ };
38
+ const formatDuration = (start, end) => {
39
+ const startTime = new Date(start).getTime();
40
+ const duration = (end ? new Date(end).getTime() : Date.now()) - startTime;
41
+ if (duration < 1e3) return `${duration}ms`;
42
+ if (duration < 6e4) return `${(duration / 1e3).toFixed(1)}s`;
43
+ return `${Math.floor(duration / 6e4)}m ${Math.floor(duration % 6e4 / 1e3)}s`;
44
+ };
45
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(__mantine_core.Flex, {
46
+ flex: 1,
47
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_core.DataTable_default, {
48
+ submitOnInit: true,
49
+ defaultSize: 10,
50
+ typeFormProps: {
51
+ skipSubmitButton: true,
52
+ columns: 3
53
+ },
54
+ tableProps: {
55
+ horizontalSpacing: "xs",
56
+ verticalSpacing: "xs"
57
+ },
58
+ onFilterChange: (key, _value, form) => {
59
+ if (key === "job" || key === "status") return form.submit();
60
+ },
61
+ filters,
62
+ items: async (filters$1) => {
63
+ return await client.getJobExecutions({ query: filters$1 });
64
+ },
65
+ columns: {
66
+ job: {
67
+ label: "Job",
68
+ value: (item) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(__mantine_core.Text, {
69
+ size: "sm",
70
+ fw: 500,
71
+ children: item.job
72
+ })
73
+ },
74
+ status: {
75
+ label: "Status",
76
+ fit: true,
77
+ value: (item) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(__mantine_core.Badge, {
78
+ size: "sm",
79
+ variant: "light",
80
+ color: getStatusColor(item.status),
81
+ leftSection: getStatusIcon(item.status),
82
+ children: item.status
83
+ })
84
+ },
85
+ duration: {
86
+ label: "Duration",
87
+ fit: true,
88
+ value: (item) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(__mantine_core.Text, {
89
+ size: "xs",
90
+ c: "dimmed",
91
+ ff: "monospace",
92
+ children: formatDuration(item.createdAt, item.finishedAt)
93
+ })
94
+ },
95
+ error: {
96
+ label: "Error",
97
+ value: (item) => item.error ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(__mantine_core.Text, {
98
+ size: "xs",
99
+ c: "red",
100
+ lineClamp: 1,
101
+ children: item.error
102
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(__mantine_core.Text, {
103
+ size: "xs",
104
+ c: "dimmed",
105
+ children: "-"
106
+ })
107
+ },
108
+ createdAt: {
109
+ label: "Started",
110
+ fit: true,
111
+ value: (item) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(__mantine_core.Text, {
112
+ size: "xs",
113
+ c: "dimmed",
114
+ children: l(item.createdAt, { date: "fromNow" })
115
+ })
116
+ }
117
+ }
118
+ })
119
+ });
120
+ };
121
+ var AdminJobs_default = AdminJobs;
122
+
123
+ //#endregion
124
+ Object.defineProperty(exports, 'AdminJobs_default', {
125
+ enumerable: true,
126
+ get: function () {
127
+ return AdminJobs_default;
128
+ }
129
+ });
130
+ //# sourceMappingURL=AdminJobs-C428qrNQ.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AdminJobs-C428qrNQ.cjs","names":["t","jobExecutions","IconCheck","IconX","IconPlayerPlay","IconClock","Flex","DataTable","filters","Text","Badge"],"sources":["../../src/admin/components/AdminJobs.tsx"],"sourcesContent":["import { useClient } from \"@alepha/react\";\nimport { useI18n } from \"@alepha/react/i18n\";\nimport { DataTable, Flex, Text } from \"@alepha/ui\";\nimport { Badge } from \"@mantine/core\";\nimport {\n IconCheck,\n IconClock,\n IconPlayerPlay,\n IconX,\n} from \"@tabler/icons-react\";\nimport { type Page, t } from \"alepha\";\nimport {\n type JobController,\n type JobExecutionEntity,\n jobExecutions,\n} from \"alepha/api/jobs\";\n\nconst AdminJobs = () => {\n const client = useClient<JobController>();\n const { l } = useI18n();\n\n const filters = t.object({\n job: t.optional(\n t.string({\n $control: {\n query: t.pick(jobExecutions.schema, [\"job\"]),\n },\n }),\n ),\n status: t.optional(t.enum([\"STARTED\", \"FAILED\", \"COMPLETED\"])),\n });\n\n const getStatusColor = (status: string) => {\n switch (status) {\n case \"COMPLETED\":\n return \"green\";\n case \"FAILED\":\n return \"red\";\n case \"STARTED\":\n return \"blue\";\n default:\n return \"gray\";\n }\n };\n\n const getStatusIcon = (status: string) => {\n switch (status) {\n case \"COMPLETED\":\n return <IconCheck size={12} />;\n case \"FAILED\":\n return <IconX size={12} />;\n case \"STARTED\":\n return <IconPlayerPlay size={12} />;\n default:\n return <IconClock size={12} />;\n }\n };\n\n const formatDuration = (\n start: Date | string,\n end?: Date | string | null,\n ): string => {\n const startTime = new Date(start).getTime();\n const endTime = end ? new Date(end).getTime() : Date.now();\n const duration = endTime - startTime;\n\n if (duration < 1000) return `${duration}ms`;\n if (duration < 60000) return `${(duration / 1000).toFixed(1)}s`;\n return `${Math.floor(duration / 60000)}m ${Math.floor((duration % 60000) / 1000)}s`;\n };\n\n return (\n <Flex flex={1}>\n <DataTable<JobExecutionEntity, typeof filters>\n submitOnInit\n defaultSize={10}\n typeFormProps={{\n skipSubmitButton: true,\n columns: 3,\n }}\n tableProps={{\n horizontalSpacing: \"xs\",\n verticalSpacing: \"xs\",\n }}\n onFilterChange={(key, _value, form) => {\n if (key === \"job\" || key === \"status\") {\n return form.submit();\n }\n }}\n filters={filters}\n items={async (filters) => {\n const response = await client.getJobExecutions({\n query: filters,\n });\n\n return response as Page<JobExecutionEntity>;\n }}\n columns={{\n job: {\n label: \"Job\",\n value: (item) => (\n <Text size=\"sm\" fw={500}>\n {item.job}\n </Text>\n ),\n },\n status: {\n label: \"Status\",\n fit: true,\n value: (item) => (\n <Badge\n size=\"sm\"\n variant=\"light\"\n color={getStatusColor(item.status)}\n leftSection={getStatusIcon(item.status)}\n >\n {item.status}\n </Badge>\n ),\n },\n duration: {\n label: \"Duration\",\n fit: true,\n value: (item) => (\n <Text size=\"xs\" c=\"dimmed\" ff=\"monospace\">\n {formatDuration(item.createdAt, item.finishedAt)}\n </Text>\n ),\n },\n error: {\n label: \"Error\",\n value: (item) =>\n item.error ? (\n <Text size=\"xs\" c=\"red\" lineClamp={1}>\n {item.error}\n </Text>\n ) : (\n <Text size=\"xs\" c=\"dimmed\">\n -\n </Text>\n ),\n },\n createdAt: {\n label: \"Started\",\n fit: true,\n value: (item) => (\n <Text size=\"xs\" c=\"dimmed\">\n {l(item.createdAt, { date: \"fromNow\" })}\n </Text>\n ),\n },\n }}\n />\n </Flex>\n );\n};\n\nexport default AdminJobs;\n"],"mappings":";;;;;;;;;;AAiBA,MAAM,kBAAkB;CACtB,MAAM,wCAAmC;CACzC,MAAM,EAAE,wCAAe;CAEvB,MAAM,UAAUA,SAAE,OAAO;EACvB,KAAKA,SAAE,SACLA,SAAE,OAAO,EACP,UAAU,EACR,OAAOA,SAAE,KAAKC,8BAAc,QAAQ,CAAC,MAAM,CAAC,EAC7C,EACF,CAAC,CACH;EACD,QAAQD,SAAE,SAASA,SAAE,KAAK;GAAC;GAAW;GAAU;GAAY,CAAC,CAAC;EAC/D,CAAC;CAEF,MAAM,kBAAkB,WAAmB;AACzC,UAAQ,QAAR;GACE,KAAK,YACH,QAAO;GACT,KAAK,SACH,QAAO;GACT,KAAK,UACH,QAAO;GACT,QACE,QAAO;;;CAIb,MAAM,iBAAiB,WAAmB;AACxC,UAAQ,QAAR;GACE,KAAK,YACH,QAAO,2CAACE,kCAAU,MAAM,KAAM;GAChC,KAAK,SACH,QAAO,2CAACC,8BAAM,MAAM,KAAM;GAC5B,KAAK,UACH,QAAO,2CAACC,uCAAe,MAAM,KAAM;GACrC,QACE,QAAO,2CAACC,kCAAU,MAAM,KAAM;;;CAIpC,MAAM,kBACJ,OACA,QACW;EACX,MAAM,YAAY,IAAI,KAAK,MAAM,CAAC,SAAS;EAE3C,MAAM,YADU,MAAM,IAAI,KAAK,IAAI,CAAC,SAAS,GAAG,KAAK,KAAK,IAC/B;AAE3B,MAAI,WAAW,IAAM,QAAO,GAAG,SAAS;AACxC,MAAI,WAAW,IAAO,QAAO,IAAI,WAAW,KAAM,QAAQ,EAAE,CAAC;AAC7D,SAAO,GAAG,KAAK,MAAM,WAAW,IAAM,CAAC,IAAI,KAAK,MAAO,WAAW,MAAS,IAAK,CAAC;;AAGnF,QACE,2CAACC;EAAK,MAAM;YACV,2CAACC;GACC;GACA,aAAa;GACb,eAAe;IACb,kBAAkB;IAClB,SAAS;IACV;GACD,YAAY;IACV,mBAAmB;IACnB,iBAAiB;IAClB;GACD,iBAAiB,KAAK,QAAQ,SAAS;AACrC,QAAI,QAAQ,SAAS,QAAQ,SAC3B,QAAO,KAAK,QAAQ;;GAGf;GACT,OAAO,OAAO,cAAY;AAKxB,WAJiB,MAAM,OAAO,iBAAiB,EAC7C,OAAOC,WACR,CAAC;;GAIJ,SAAS;IACP,KAAK;KACH,OAAO;KACP,QAAQ,SACN,2CAACC;MAAK,MAAK;MAAK,IAAI;gBACjB,KAAK;OACD;KAEV;IACD,QAAQ;KACN,OAAO;KACP,KAAK;KACL,QAAQ,SACN,2CAACC;MACC,MAAK;MACL,SAAQ;MACR,OAAO,eAAe,KAAK,OAAO;MAClC,aAAa,cAAc,KAAK,OAAO;gBAEtC,KAAK;OACA;KAEX;IACD,UAAU;KACR,OAAO;KACP,KAAK;KACL,QAAQ,SACN,2CAACD;MAAK,MAAK;MAAK,GAAE;MAAS,IAAG;gBAC3B,eAAe,KAAK,WAAW,KAAK,WAAW;OAC3C;KAEV;IACD,OAAO;KACL,OAAO;KACP,QAAQ,SACN,KAAK,QACH,2CAACA;MAAK,MAAK;MAAK,GAAE;MAAM,WAAW;gBAChC,KAAK;OACD,GAEP,2CAACA;MAAK,MAAK;MAAK,GAAE;gBAAS;OAEpB;KAEZ;IACD,WAAW;KACT,OAAO;KACP,KAAK;KACL,QAAQ,SACN,2CAACA;MAAK,MAAK;MAAK,GAAE;gBACf,EAAE,KAAK,WAAW,EAAE,MAAM,WAAW,CAAC;OAClC;KAEV;IACF;IACD;GACG;;AAIX,wBAAe"}
@@ -0,0 +1,4 @@
1
+ require('./core-aFtK4l9I.cjs');
2
+ const require_AdminJobs = require('./AdminJobs-C428qrNQ.cjs');
3
+
4
+ exports.default = require_AdminJobs.AdminJobs_default;
@@ -0,0 +1,4 @@
1
+ import "./core-CzO6aavT.js";
2
+ import { t as AdminJobs_default } from "./AdminJobs-BXkFtlVo.js";
3
+
4
+ export { AdminJobs_default as default };
@@ -0,0 +1,4 @@
1
+ require('./core-aFtK4l9I.cjs');
2
+ const require_AdminLayout = require('./AdminLayout-CiLlywAQ.cjs');
3
+
4
+ exports.default = require_AdminLayout.AdminLayout_default;
@@ -0,0 +1,4 @@
1
+ import "./core-CzO6aavT.js";
2
+ import { t as AdminLayout_default } from "./AdminLayout-CtkVYk-u.js";
3
+
4
+ export { AdminLayout_default as default };