@alepha/ui 0.18.2 → 0.18.3

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 (231) hide show
  1. package/dist/admin/{AdminApiKeys-BJhIwfD6.js → AdminApiKeys-Dy_k-4Vd.js} +2 -2
  2. package/dist/admin/{AdminApiKeys-BJhIwfD6.js.map → AdminApiKeys-Dy_k-4Vd.js.map} +1 -1
  3. package/dist/admin/{AdminAudits-DzD_4cDt.js → AdminAudits-CKiFMSSU.js} +2 -2
  4. package/dist/admin/{AdminAudits-DzD_4cDt.js.map → AdminAudits-CKiFMSSU.js.map} +1 -1
  5. package/dist/admin/{AdminDashboard-C92tIc6x.js → AdminDashboard-PhC_dZqo.js} +2 -2
  6. package/dist/admin/{AdminDashboard-C92tIc6x.js.map → AdminDashboard-PhC_dZqo.js.map} +1 -1
  7. package/dist/admin/{AdminFiles-DLpfhBkf.js → AdminFiles-DFTjijGp.js} +2 -2
  8. package/dist/admin/{AdminFiles-DLpfhBkf.js.map → AdminFiles-DFTjijGp.js.map} +1 -1
  9. package/dist/admin/{AdminJobDashboard-KIOkeMgE.js → AdminJobDashboard-BL8gGPDp.js} +2 -2
  10. package/dist/admin/{AdminJobDashboard-KIOkeMgE.js.map → AdminJobDashboard-BL8gGPDp.js.map} +1 -1
  11. package/dist/admin/{AdminJobExecutions-D0Yo_PU0.js → AdminJobExecutions-D9E-CS-U.js} +2 -2
  12. package/dist/admin/{AdminJobExecutions-D0Yo_PU0.js.map → AdminJobExecutions-D9E-CS-U.js.map} +1 -1
  13. package/dist/admin/{AdminJobRegistry-PFajqaGK.js → AdminJobRegistry-Ci9ue1zC.js} +2 -2
  14. package/dist/admin/{AdminJobRegistry-PFajqaGK.js.map → AdminJobRegistry-Ci9ue1zC.js.map} +1 -1
  15. package/dist/admin/{AdminLayout-B1DXZHDn.js → AdminLayout-I6TlUMPc.js} +2 -2
  16. package/dist/admin/{AdminLayout-B1DXZHDn.js.map → AdminLayout-I6TlUMPc.js.map} +1 -1
  17. package/dist/admin/AdminNotifications-ZPHCYrv7.js +542 -0
  18. package/dist/admin/AdminNotifications-ZPHCYrv7.js.map +1 -0
  19. package/dist/admin/{AdminParameters-BspPeqp_.js → AdminParameters-CqgvhRsb.js} +120 -105
  20. package/dist/admin/AdminParameters-CqgvhRsb.js.map +1 -0
  21. package/dist/admin/{AdminSessions-BnH5CZQl.js → AdminSessions-Bz5NRuoW.js} +2 -2
  22. package/dist/admin/{AdminSessions-BnH5CZQl.js.map → AdminSessions-Bz5NRuoW.js.map} +1 -1
  23. package/dist/admin/{AdminUserLayout-DUbC6-BI.js → AdminUserLayout-lXT6I0Qq.js} +14 -8
  24. package/dist/admin/AdminUserLayout-lXT6I0Qq.js.map +1 -0
  25. package/dist/admin/{AdminUserProfile-DuTUnjdG.js → AdminUserProfile-vFBLoJ3h.js} +3 -3
  26. package/dist/admin/{AdminUserProfile-DuTUnjdG.js.map → AdminUserProfile-vFBLoJ3h.js.map} +1 -1
  27. package/dist/admin/{AdminUserSessions-DvZdAGpL.js → AdminUserSessions-CT_YDim0.js} +2 -2
  28. package/dist/admin/{AdminUserSessions-DvZdAGpL.js.map → AdminUserSessions-CT_YDim0.js.map} +1 -1
  29. package/dist/admin/{AdminUsers-CR9z0g_5.js → AdminUsers-D1UfGya9.js} +2 -2
  30. package/dist/admin/{AdminUsers-CR9z0g_5.js.map → AdminUsers-D1UfGya9.js.map} +1 -1
  31. package/dist/admin/{AuthLayout-DsUfp9RG.js → AuthLayout-_frhdgOO.js} +2 -2
  32. package/dist/admin/{AuthLayout-DsUfp9RG.js.map → AuthLayout-_frhdgOO.js.map} +1 -1
  33. package/dist/admin/Login-xtNmQtGh.js +275 -0
  34. package/dist/admin/Login-xtNmQtGh.js.map +1 -0
  35. package/dist/admin/{Profile-B2EcIDB9.js → Profile-_AtPUwAP.js} +31 -27
  36. package/dist/admin/Profile-_AtPUwAP.js.map +1 -0
  37. package/dist/admin/{Register-Z3fxRbUF.js → Register-JcCjHUUn.js} +198 -142
  38. package/dist/admin/Register-JcCjHUUn.js.map +1 -0
  39. package/dist/admin/{ResetPassword-_Y1qTTKh.js → ResetPassword-CwGBPLJO.js} +7 -7
  40. package/dist/admin/ResetPassword-CwGBPLJO.js.map +1 -0
  41. package/dist/admin/{VerifyEmail-Bg22bwcC.js → VerifyEmail-hNxWejWf.js} +23 -8
  42. package/dist/admin/VerifyEmail-hNxWejWf.js.map +1 -0
  43. package/dist/admin/{core-BVO_TQxb.js → core-CYaRQ8O-.js} +709 -556
  44. package/dist/admin/core-CYaRQ8O-.js.map +1 -0
  45. package/dist/admin/index.d.ts +83 -44
  46. package/dist/admin/index.d.ts.map +1 -1
  47. package/dist/admin/index.js +58 -39
  48. package/dist/admin/index.js.map +1 -1
  49. package/dist/auth/{AuthLayout-C161NeF6.js → AuthLayout-AvLlcLjS.js} +2 -2
  50. package/dist/auth/{AuthLayout-C161NeF6.js.map → AuthLayout-AvLlcLjS.js.map} +1 -1
  51. package/dist/auth/Login-BA1E8IZl.js +275 -0
  52. package/dist/auth/Login-BA1E8IZl.js.map +1 -0
  53. package/dist/auth/{Profile-BMpXJ0oi.js → Profile-YcWdeuFz.js} +31 -27
  54. package/dist/auth/Profile-YcWdeuFz.js.map +1 -0
  55. package/dist/auth/{Register-2gx8qll-.js → Register-CPhEO5MG.js} +198 -142
  56. package/dist/auth/Register-CPhEO5MG.js.map +1 -0
  57. package/dist/{demo/ResetPassword-CAPj8MO3.js → auth/ResetPassword-DCtGcneA.js} +7 -7
  58. package/dist/auth/ResetPassword-DCtGcneA.js.map +1 -0
  59. package/dist/{demo/VerifyEmail-DFmdCdYs.js → auth/VerifyEmail-DkH7NBfn.js} +23 -8
  60. package/dist/auth/VerifyEmail-DkH7NBfn.js.map +1 -0
  61. package/dist/auth/{core-DyfeVr5c.js → core-D5jIAVF2.js} +386 -294
  62. package/dist/auth/core-D5jIAVF2.js.map +1 -0
  63. package/dist/auth/index.d.ts +93 -48
  64. package/dist/auth/index.d.ts.map +1 -1
  65. package/dist/auth/index.js +28 -24
  66. package/dist/auth/index.js.map +1 -1
  67. package/dist/core/index.d.ts +116 -61
  68. package/dist/core/index.d.ts.map +1 -1
  69. package/dist/core/index.js +873 -701
  70. package/dist/core/index.js.map +1 -1
  71. package/dist/demo/{AuthLayout-DN-ClJQk.js → AuthLayout-Brri4A-L.js} +2 -2
  72. package/dist/demo/{AuthLayout-DN-ClJQk.js.map → AuthLayout-Brri4A-L.js.map} +1 -1
  73. package/dist/demo/DemoButton-wiCxZZ_L.js +182 -0
  74. package/dist/demo/DemoButton-wiCxZZ_L.js.map +1 -0
  75. package/dist/demo/DemoControlSelect-D7ILObVg.js +305 -0
  76. package/dist/demo/DemoControlSelect-D7ILObVg.js.map +1 -0
  77. package/dist/demo/DemoDataTable-DZ5Y8pFX.js +362 -0
  78. package/dist/demo/DemoDataTable-DZ5Y8pFX.js.map +1 -0
  79. package/dist/demo/{DemoDialog-DW8QEvD1.js → DemoDialog-CUWdLHim.js} +2 -2
  80. package/dist/demo/{DemoDialog-DW8QEvD1.js.map → DemoDialog-CUWdLHim.js.map} +1 -1
  81. package/dist/demo/{DemoFlex-CAhLUanT.js → DemoFlex-a8OhMMvq.js} +3 -3
  82. package/dist/demo/{DemoFlex-CAhLUanT.js.map → DemoFlex-a8OhMMvq.js.map} +1 -1
  83. package/dist/demo/{DemoHeading-yIFmNjHB.js → DemoHeading-C13OVDfS.js} +3 -3
  84. package/dist/demo/{DemoHeading-yIFmNjHB.js.map → DemoHeading-C13OVDfS.js.map} +1 -1
  85. package/dist/demo/{DemoHome-BSGuBHus.js → DemoHome-D_De3UiT.js} +2 -2
  86. package/dist/demo/{DemoHome-BSGuBHus.js.map → DemoHome-D_De3UiT.js.map} +1 -1
  87. package/dist/demo/{DemoJsonViewer-DsA2IpgV.js → DemoJsonViewer-B50s9aGM.js} +3 -3
  88. package/dist/demo/{DemoJsonViewer-DsA2IpgV.js.map → DemoJsonViewer-B50s9aGM.js.map} +1 -1
  89. package/dist/demo/{DemoLayout-Cy6xjn6P.js → DemoLayout-CHU8WTwO.js} +14 -5
  90. package/dist/demo/DemoLayout-CHU8WTwO.js.map +1 -0
  91. package/dist/demo/{DemoLogin-vqxgTu4P.js → DemoLogin-BBlrWpml.js} +49 -32
  92. package/dist/demo/DemoLogin-BBlrWpml.js.map +1 -0
  93. package/dist/demo/{DemoRegister-YHPvPg77.js → DemoRegister-BuNE3_-f.js} +49 -50
  94. package/dist/demo/DemoRegister-BuNE3_-f.js.map +1 -0
  95. package/dist/demo/{DemoResetPassword-mOW18Zlm.js → DemoResetPassword-D_IjjjOJ.js} +12 -16
  96. package/dist/demo/DemoResetPassword-D_IjjjOJ.js.map +1 -0
  97. package/dist/demo/{DemoSidebar-od7aLjP_.js → DemoSidebar-Giy2HRBD.js} +3 -3
  98. package/dist/demo/{DemoSidebar-od7aLjP_.js.map → DemoSidebar-Giy2HRBD.js.map} +1 -1
  99. package/dist/demo/{DemoText-DU3JeRS0.js → DemoText-ubcw-vog.js} +3 -3
  100. package/dist/demo/{DemoText-DU3JeRS0.js.map → DemoText-ubcw-vog.js.map} +1 -1
  101. package/dist/demo/{DemoToast-CUJEiPRa.js → DemoToast-9die_dYT.js} +2 -2
  102. package/dist/demo/{DemoToast-CUJEiPRa.js.map → DemoToast-9die_dYT.js.map} +1 -1
  103. package/dist/demo/{DemoTypeForm-C1dNkahD.js → DemoTypeForm-D_d6OVKL.js} +8 -4
  104. package/dist/demo/DemoTypeForm-D_d6OVKL.js.map +1 -0
  105. package/dist/demo/DemoVerifyEmail-B43KlF4F.js +34 -0
  106. package/dist/demo/DemoVerifyEmail-B43KlF4F.js.map +1 -0
  107. package/dist/demo/Login-C12N4oGs.js +275 -0
  108. package/dist/demo/Login-C12N4oGs.js.map +1 -0
  109. package/dist/demo/{Profile-BE_Y3co2.js → Profile-DS5q4vOh.js} +31 -27
  110. package/dist/demo/Profile-DS5q4vOh.js.map +1 -0
  111. package/dist/demo/{Register-fXHmBpr3.js → Register-B4hLBeEv.js} +198 -142
  112. package/dist/demo/Register-B4hLBeEv.js.map +1 -0
  113. package/dist/{auth/ResetPassword-DBxt9hKk.js → demo/ResetPassword-D8g9ha1N.js} +7 -7
  114. package/dist/demo/ResetPassword-D8g9ha1N.js.map +1 -0
  115. package/dist/demo/{Showcase-BtEU0pY9.js → Showcase-D6Fxt4X4.js} +64 -65
  116. package/dist/demo/Showcase-D6Fxt4X4.js.map +1 -0
  117. package/dist/{auth/VerifyEmail-Z80Ubajk.js → demo/VerifyEmail-BjDo0cZA.js} +23 -8
  118. package/dist/demo/VerifyEmail-BjDo0cZA.js.map +1 -0
  119. package/dist/demo/{auth-Djd7SKiw.js → auth-ByVTreDl.js} +8 -8
  120. package/dist/demo/{auth-Djd7SKiw.js.map → auth-ByVTreDl.js.map} +1 -1
  121. package/dist/demo/{core-B7LNjM78.js → core-DFgB3yU4.js} +741 -573
  122. package/dist/demo/core-DFgB3yU4.js.map +1 -0
  123. package/dist/demo/index.d.ts +1 -0
  124. package/dist/demo/index.d.ts.map +1 -1
  125. package/dist/demo/index.js +24 -18
  126. package/dist/demo/index.js.map +1 -1
  127. package/package.json +7 -7
  128. package/src/admin/AdminRouter.tsx +24 -1
  129. package/src/admin/components/notifications/AdminNotifications.tsx +519 -0
  130. package/src/admin/components/parameters/ParameterDetails.tsx +12 -270
  131. package/src/admin/components/parameters/ParameterDetailsConfigForm.tsx +238 -0
  132. package/src/admin/components/parameters/ParameterDetailsLoading.tsx +24 -0
  133. package/src/admin/components/parameters/ParameterHistory.tsx +10 -11
  134. package/src/admin/components/parameters/ParameterTree.tsx +28 -184
  135. package/src/admin/components/parameters/ParameterTreeNode.tsx +151 -0
  136. package/src/admin/components/shared/AdminResourceHeader.tsx +2 -25
  137. package/src/admin/components/shared/AdminResourceHeaderMenuItem.tsx +37 -0
  138. package/src/admin/components/shared/AdminResourceTabs.tsx +2 -26
  139. package/src/admin/components/shared/AdminResourceTabsItem.tsx +36 -0
  140. package/src/auth/components/Login.tsx +188 -121
  141. package/src/auth/components/Profile.tsx +1 -22
  142. package/src/auth/components/ProfileField.tsx +39 -0
  143. package/src/auth/components/Register.tsx +215 -158
  144. package/src/auth/components/ResetPassword.tsx +7 -11
  145. package/src/auth/components/VerifyEmail.tsx +35 -10
  146. package/src/auth/components/buttons/UserButton.tsx +19 -21
  147. package/src/auth/index.ts +1 -0
  148. package/src/core/components/Flex.tsx +10 -0
  149. package/src/core/components/buttons/ActionButton.tsx +104 -78
  150. package/src/core/components/data/DetailDrawer.tsx +102 -96
  151. package/src/core/components/data/DetailList.tsx +2 -1
  152. package/src/core/components/layout/Breadcrumb.tsx +3 -6
  153. package/src/core/components/layout/DashboardShell.tsx +18 -4
  154. package/src/core/components/layout/Sidebar.tsx +16 -241
  155. package/src/core/components/layout/SidebarCollapsedItem.tsx +91 -0
  156. package/src/core/components/layout/SidebarItem.tsx +146 -0
  157. package/src/core/components/layout/index.ts +3 -1
  158. package/src/core/form/components/Control.tsx +31 -29
  159. package/src/core/form/components/ControlArray.tsx +13 -39
  160. package/src/core/form/components/ControlDate.tsx +10 -21
  161. package/src/core/form/components/ControlNumber.tsx +4 -33
  162. package/src/core/form/components/ControlQueryBuilder.tsx +12 -175
  163. package/src/core/form/components/ControlQueryBuilderHelp.tsx +165 -0
  164. package/src/core/form/components/ControlSelect.browser.spec.tsx +343 -0
  165. package/src/core/form/components/ControlSelect.tsx +294 -92
  166. package/src/core/form/components/TypeForm.browser.spec.tsx +3 -3
  167. package/src/core/form/components/TypeForm.tsx +5 -2
  168. package/src/core/form/index.ts +8 -1
  169. package/src/core/form/utils/parseInput.ts +7 -3
  170. package/src/core/index.ts +3 -1
  171. package/src/core/json/components/JsonViewer.tsx +103 -319
  172. package/src/core/json/components/JsonViewerCopyButton.tsx +46 -0
  173. package/src/core/json/components/JsonViewerRowNode.tsx +120 -0
  174. package/src/core/json/components/JsonViewerShared.ts +76 -0
  175. package/src/core/styles.css +12 -2
  176. package/src/core/table/components/ColumnPicker.tsx +3 -3
  177. package/src/core/table/components/DataTable.tsx +89 -29
  178. package/src/core/table/components/DataTableFilters.tsx +6 -11
  179. package/src/core/table/components/DataTablePagination.tsx +9 -3
  180. package/src/core/table/components/DataTableToolbar.tsx +7 -3
  181. package/src/core/table/components/FilterPicker.tsx +3 -3
  182. package/src/core/table/interfaces/types.ts +29 -0
  183. package/src/core/utils/icons.tsx +2 -2
  184. package/src/demo/DemoRouter.ts +8 -1
  185. package/src/demo/components/DemoLayout.tsx +12 -2
  186. package/src/demo/components/auth/DemoLogin.tsx +35 -28
  187. package/src/demo/components/auth/DemoRegister.tsx +35 -49
  188. package/src/demo/components/auth/DemoResetPassword.tsx +5 -9
  189. package/src/demo/components/auth/DemoVerifyEmail.tsx +7 -6
  190. package/src/demo/components/core/DemoButton.tsx +123 -103
  191. package/src/demo/components/core/DemoControlSelect.tsx +325 -0
  192. package/src/demo/components/core/DemoDataTable.tsx +255 -237
  193. package/src/demo/components/core/DemoTypeForm.tsx +7 -2
  194. package/src/demo/components/shared/MacWindow.tsx +5 -11
  195. package/src/demo/components/shared/Showcase.tsx +28 -42
  196. package/dist/admin/AdminParameters-BspPeqp_.js.map +0 -1
  197. package/dist/admin/AdminUserLayout-DUbC6-BI.js.map +0 -1
  198. package/dist/admin/Login-DHbYJKwg.js +0 -219
  199. package/dist/admin/Login-DHbYJKwg.js.map +0 -1
  200. package/dist/admin/Profile-B2EcIDB9.js.map +0 -1
  201. package/dist/admin/Register-Z3fxRbUF.js.map +0 -1
  202. package/dist/admin/ResetPassword-_Y1qTTKh.js.map +0 -1
  203. package/dist/admin/VerifyEmail-Bg22bwcC.js.map +0 -1
  204. package/dist/admin/core-BVO_TQxb.js.map +0 -1
  205. package/dist/auth/Login-C7jIqf00.js +0 -219
  206. package/dist/auth/Login-C7jIqf00.js.map +0 -1
  207. package/dist/auth/Profile-BMpXJ0oi.js.map +0 -1
  208. package/dist/auth/Register-2gx8qll-.js.map +0 -1
  209. package/dist/auth/ResetPassword-DBxt9hKk.js.map +0 -1
  210. package/dist/auth/VerifyEmail-Z80Ubajk.js.map +0 -1
  211. package/dist/auth/core-DyfeVr5c.js.map +0 -1
  212. package/dist/demo/DemoButton-CGUyR9eM.js +0 -178
  213. package/dist/demo/DemoButton-CGUyR9eM.js.map +0 -1
  214. package/dist/demo/DemoDataTable-QFG-xXSx.js +0 -358
  215. package/dist/demo/DemoDataTable-QFG-xXSx.js.map +0 -1
  216. package/dist/demo/DemoLayout-Cy6xjn6P.js.map +0 -1
  217. package/dist/demo/DemoLogin-vqxgTu4P.js.map +0 -1
  218. package/dist/demo/DemoRegister-YHPvPg77.js.map +0 -1
  219. package/dist/demo/DemoResetPassword-mOW18Zlm.js.map +0 -1
  220. package/dist/demo/DemoTypeForm-C1dNkahD.js.map +0 -1
  221. package/dist/demo/DemoVerifyEmail-D9EcXZ38.js +0 -30
  222. package/dist/demo/DemoVerifyEmail-D9EcXZ38.js.map +0 -1
  223. package/dist/demo/Login-CoYf_P_F.js +0 -219
  224. package/dist/demo/Login-CoYf_P_F.js.map +0 -1
  225. package/dist/demo/Profile-BE_Y3co2.js.map +0 -1
  226. package/dist/demo/Register-fXHmBpr3.js.map +0 -1
  227. package/dist/demo/ResetPassword-CAPj8MO3.js.map +0 -1
  228. package/dist/demo/Showcase-BtEU0pY9.js.map +0 -1
  229. package/dist/demo/VerifyEmail-DFmdCdYs.js.map +0 -1
  230. package/dist/demo/core-B7LNjM78.js.map +0 -1
  231. package/src/demo/styles.css +0 -0
@@ -1,4 +1,4 @@
1
- import { DataTable, Text } from "@alepha/ui";
1
+ import { DataTable, Text, useDialog } from "@alepha/ui";
2
2
  import { Badge, Code, Flex, Paper } from "@mantine/core";
3
3
  import {
4
4
  IconDownload,
@@ -117,6 +117,259 @@ const showcaseSchema = t.object({
117
117
  }),
118
118
  });
119
119
 
120
+ interface DataTablePreviewProps {
121
+ withCheckbox: boolean;
122
+ withExport: boolean;
123
+ withPanel: boolean;
124
+ withDrawer: boolean;
125
+ defaultSize: number;
126
+ }
127
+
128
+ const DataTablePreview = (props: DataTablePreviewProps) => {
129
+ const dialog = useDialog();
130
+
131
+ return (
132
+ <DataTable<User, typeof filters>
133
+ key={JSON.stringify(props)}
134
+ filters={filters}
135
+ defaultFilters={["search", "role"]}
136
+ submitOnInit
137
+ defaultSize={props.defaultSize}
138
+ withCheckbox={props.withCheckbox}
139
+ withExport={props.withExport}
140
+ getItemKey={(u) => String(u.id)}
141
+ onFilterChange={(key, _value, form) => {
142
+ if (key === "role" || key === "status") {
143
+ return form.submit();
144
+ }
145
+ }}
146
+ typeFormProps={{
147
+ skipSubmitButton: true,
148
+ columns: 3,
149
+ }}
150
+ items={async (params) => {
151
+ let filtered = [...sampleUsers];
152
+ if (params.search) {
153
+ const s = params.search.toLowerCase();
154
+ filtered = filtered.filter(
155
+ (u) =>
156
+ u.name.toLowerCase().includes(s) ||
157
+ u.email.toLowerCase().includes(s),
158
+ );
159
+ }
160
+ if (params.role) {
161
+ filtered = filtered.filter((u) => u.role === params.role);
162
+ }
163
+ if (params.status) {
164
+ filtered = filtered.filter((u) => u.status === params.status);
165
+ }
166
+ const start = params.page * params.size;
167
+ const content = filtered.slice(start, start + params.size);
168
+ return {
169
+ content,
170
+ page: {
171
+ totalElements: filtered.length,
172
+ totalPages: Math.ceil(filtered.length / params.size),
173
+ },
174
+ };
175
+ }}
176
+ actions={[
177
+ {
178
+ tooltip: "Add User",
179
+ icon: IconPlus,
180
+ variant: "light",
181
+ size: "xs",
182
+ onClick: () => dialog.alert({ message: "Add user clicked" }),
183
+ },
184
+ ]}
185
+ checkboxActions={[
186
+ {
187
+ label: "Export Selected",
188
+ icon: <IconDownload size={14} />,
189
+ intent: "primary",
190
+ onClick: ({ selectedItems, clearSelection }) => {
191
+ dialog.alert({
192
+ message: `Exporting ${selectedItems.length} users`,
193
+ });
194
+ clearSelection();
195
+ },
196
+ },
197
+ {
198
+ label: "Delete Selected",
199
+ icon: <IconTrash size={14} />,
200
+ intent: "danger",
201
+ onClick: ({ selectedItems, clearSelection }) => {
202
+ dialog.alert({
203
+ message: `Deleting ${selectedItems.length} users`,
204
+ });
205
+ clearSelection();
206
+ },
207
+ },
208
+ ]}
209
+ columns={{
210
+ id: {
211
+ label: "ID",
212
+ value: (u) => <Text size="sm">{u.id}</Text>,
213
+ sortable: true,
214
+ fit: true,
215
+ },
216
+ name: {
217
+ label: "Name",
218
+ value: (u) => (
219
+ <Text size="sm" fw={500}>
220
+ {u.name}
221
+ </Text>
222
+ ),
223
+ sortable: true,
224
+ },
225
+ email: {
226
+ label: "Email",
227
+ value: (u) => (
228
+ <Text size="sm" c="dimmed">
229
+ {u.email}
230
+ </Text>
231
+ ),
232
+ },
233
+ role: {
234
+ label: "Role",
235
+ value: (u) => (
236
+ <Badge
237
+ size="sm"
238
+ color={
239
+ u.role === "admin"
240
+ ? "blue"
241
+ : u.role === "user"
242
+ ? "green"
243
+ : "gray"
244
+ }
245
+ >
246
+ {u.role}
247
+ </Badge>
248
+ ),
249
+ },
250
+ status: {
251
+ label: "Status",
252
+ value: (u) => (
253
+ <Badge
254
+ size="sm"
255
+ color={u.status === "active" ? "green" : "red"}
256
+ variant="light"
257
+ >
258
+ {u.status}
259
+ </Badge>
260
+ ),
261
+ },
262
+ notes: {
263
+ label: "Notes",
264
+ defaultHidden: true,
265
+ value: (u) => (
266
+ <Text size="xs" c="dimmed" lineClamp={1}>
267
+ {u.notes ?? "—"}
268
+ </Text>
269
+ ),
270
+ },
271
+ }}
272
+ rowActions={(u) => [
273
+ {
274
+ label: "Edit",
275
+ icon: IconEdit,
276
+ color: "blue",
277
+ onClick: () => dialog.alert({ message: `Edit ${u.name}` }),
278
+ },
279
+ {
280
+ label: "Delete",
281
+ icon: IconTrash,
282
+ color: "red",
283
+ onClick: () => dialog.alert({ message: `Delete ${u.name}` }),
284
+ visible: u.role !== "admin",
285
+ },
286
+ ]}
287
+ panel={
288
+ props.withPanel
289
+ ? {
290
+ can: (u) => Boolean(u.notes),
291
+ render: (u) => (
292
+ <Flex direction="column" gap="xs" p="sm">
293
+ <Text size="xs" c="dimmed" tt="uppercase" fw={600}>
294
+ Notes
295
+ </Text>
296
+ <Text size="sm">{u.notes}</Text>
297
+ </Flex>
298
+ ),
299
+ }
300
+ : undefined
301
+ }
302
+ drawer={
303
+ props.withDrawer
304
+ ? (u) => (
305
+ <Flex direction="column" gap="md">
306
+ <Text size="lg" fw={600}>
307
+ {u.name}
308
+ </Text>
309
+ <Paper p="sm" radius="md" withBorder>
310
+ <Flex direction="column" gap="xs">
311
+ <Flex gap="xs">
312
+ <Text size="sm" c="dimmed" w={60}>
313
+ Email
314
+ </Text>
315
+ <Text size="sm">{u.email}</Text>
316
+ </Flex>
317
+ <Flex gap="xs">
318
+ <Text size="sm" c="dimmed" w={60}>
319
+ Role
320
+ </Text>
321
+ <Badge
322
+ size="sm"
323
+ color={
324
+ u.role === "admin"
325
+ ? "blue"
326
+ : u.role === "user"
327
+ ? "green"
328
+ : "gray"
329
+ }
330
+ >
331
+ {u.role}
332
+ </Badge>
333
+ </Flex>
334
+ <Flex gap="xs">
335
+ <Text size="sm" c="dimmed" w={60}>
336
+ Status
337
+ </Text>
338
+ <Badge
339
+ size="sm"
340
+ color={u.status === "active" ? "green" : "red"}
341
+ variant="light"
342
+ >
343
+ {u.status}
344
+ </Badge>
345
+ </Flex>
346
+ </Flex>
347
+ </Paper>
348
+ {u.notes && (
349
+ <Paper p="sm" radius="md" withBorder>
350
+ <Text size="sm" fw={600} mb="xs">
351
+ Notes
352
+ </Text>
353
+ <Text size="sm">{u.notes}</Text>
354
+ </Paper>
355
+ )}
356
+ <Paper p="sm" radius="md" withBorder>
357
+ <Text size="sm" fw={600} mb="xs">
358
+ Raw Data
359
+ </Text>
360
+ <Code block>{JSON.stringify(u, null, 2)}</Code>
361
+ </Paper>
362
+ </Flex>
363
+ )
364
+ : undefined
365
+ }
366
+ tableProps={{
367
+ highlightOnHover: true,
368
+ }}
369
+ />
370
+ );
371
+ };
372
+
120
373
  const DemoDataTable = () => {
121
374
  return (
122
375
  <Showcase
@@ -131,242 +384,7 @@ const DemoDataTable = () => {
131
384
  }}
132
385
  columns={1}
133
386
  >
134
- {(props) => (
135
- <DataTable<User, typeof filters>
136
- key={JSON.stringify(props)}
137
- filters={filters}
138
- defaultFilters={["search", "role"]}
139
- submitOnInit
140
- defaultSize={props.defaultSize}
141
- withCheckbox={props.withCheckbox}
142
- withExport={props.withExport}
143
- getItemKey={(u) => String(u.id)}
144
- onFilterChange={(key, _value, form) => {
145
- if (key === "role" || key === "status") {
146
- return form.submit();
147
- }
148
- }}
149
- typeFormProps={{
150
- skipSubmitButton: true,
151
- columns: 3,
152
- }}
153
- items={async (params) => {
154
- let filtered = [...sampleUsers];
155
- if (params.search) {
156
- const s = params.search.toLowerCase();
157
- filtered = filtered.filter(
158
- (u) =>
159
- u.name.toLowerCase().includes(s) ||
160
- u.email.toLowerCase().includes(s),
161
- );
162
- }
163
- if (params.role) {
164
- filtered = filtered.filter((u) => u.role === params.role);
165
- }
166
- if (params.status) {
167
- filtered = filtered.filter((u) => u.status === params.status);
168
- }
169
- const start = params.page * params.size;
170
- const content = filtered.slice(start, start + params.size);
171
- return {
172
- content,
173
- page: {
174
- totalElements: filtered.length,
175
- totalPages: Math.ceil(filtered.length / params.size),
176
- },
177
- };
178
- }}
179
- actions={[
180
- {
181
- tooltip: "Add User",
182
- icon: IconPlus,
183
- variant: "light",
184
- size: "xs",
185
- onClick: () => alert("Add user clicked"),
186
- },
187
- ]}
188
- checkboxActions={[
189
- {
190
- label: "Export Selected",
191
- icon: <IconDownload size={14} />,
192
- intent: "primary",
193
- onClick: ({ selectedItems, clearSelection }) => {
194
- alert(`Exporting ${selectedItems.length} users`);
195
- clearSelection();
196
- },
197
- },
198
- {
199
- label: "Delete Selected",
200
- icon: <IconTrash size={14} />,
201
- intent: "danger",
202
- onClick: ({ selectedItems, clearSelection }) => {
203
- alert(`Deleting ${selectedItems.length} users`);
204
- clearSelection();
205
- },
206
- },
207
- ]}
208
- columns={{
209
- id: {
210
- label: "ID",
211
- value: (u) => <Text size="sm">{u.id}</Text>,
212
- sortable: true,
213
- fit: true,
214
- },
215
- name: {
216
- label: "Name",
217
- value: (u) => (
218
- <Text size="sm" fw={500}>
219
- {u.name}
220
- </Text>
221
- ),
222
- sortable: true,
223
- },
224
- email: {
225
- label: "Email",
226
- value: (u) => (
227
- <Text size="sm" c="dimmed">
228
- {u.email}
229
- </Text>
230
- ),
231
- },
232
- role: {
233
- label: "Role",
234
- value: (u) => (
235
- <Badge
236
- size="sm"
237
- color={
238
- u.role === "admin"
239
- ? "blue"
240
- : u.role === "user"
241
- ? "green"
242
- : "gray"
243
- }
244
- >
245
- {u.role}
246
- </Badge>
247
- ),
248
- },
249
- status: {
250
- label: "Status",
251
- value: (u) => (
252
- <Badge
253
- size="sm"
254
- color={u.status === "active" ? "green" : "red"}
255
- variant="light"
256
- >
257
- {u.status}
258
- </Badge>
259
- ),
260
- },
261
- notes: {
262
- label: "Notes",
263
- defaultHidden: true,
264
- value: (u) => (
265
- <Text size="xs" c="dimmed" lineClamp={1}>
266
- {u.notes ?? "—"}
267
- </Text>
268
- ),
269
- },
270
- }}
271
- rowActions={(u) => [
272
- {
273
- label: "Edit",
274
- icon: IconEdit,
275
- color: "blue",
276
- onClick: () => alert(`Edit ${u.name}`),
277
- },
278
- {
279
- label: "Delete",
280
- icon: IconTrash,
281
- color: "red",
282
- onClick: () => alert(`Delete ${u.name}`),
283
- visible: u.role !== "admin",
284
- },
285
- ]}
286
- panel={
287
- props.withPanel
288
- ? {
289
- can: (u) => Boolean(u.notes),
290
- render: (u) => (
291
- <Flex direction="column" gap="xs" p="sm">
292
- <Text size="xs" c="dimmed" tt="uppercase" fw={600}>
293
- Notes
294
- </Text>
295
- <Text size="sm">{u.notes}</Text>
296
- </Flex>
297
- ),
298
- }
299
- : undefined
300
- }
301
- drawer={
302
- props.withDrawer
303
- ? (u) => (
304
- <Flex direction="column" gap="md">
305
- <Text size="lg" fw={600}>
306
- {u.name}
307
- </Text>
308
- <Paper p="sm" radius="md" withBorder>
309
- <Flex direction="column" gap="xs">
310
- <Flex gap="xs">
311
- <Text size="sm" c="dimmed" w={60}>
312
- Email
313
- </Text>
314
- <Text size="sm">{u.email}</Text>
315
- </Flex>
316
- <Flex gap="xs">
317
- <Text size="sm" c="dimmed" w={60}>
318
- Role
319
- </Text>
320
- <Badge
321
- size="sm"
322
- color={
323
- u.role === "admin"
324
- ? "blue"
325
- : u.role === "user"
326
- ? "green"
327
- : "gray"
328
- }
329
- >
330
- {u.role}
331
- </Badge>
332
- </Flex>
333
- <Flex gap="xs">
334
- <Text size="sm" c="dimmed" w={60}>
335
- Status
336
- </Text>
337
- <Badge
338
- size="sm"
339
- color={u.status === "active" ? "green" : "red"}
340
- variant="light"
341
- >
342
- {u.status}
343
- </Badge>
344
- </Flex>
345
- </Flex>
346
- </Paper>
347
- {u.notes && (
348
- <Paper p="sm" radius="md" withBorder>
349
- <Text size="sm" fw={600} mb="xs">
350
- Notes
351
- </Text>
352
- <Text size="sm">{u.notes}</Text>
353
- </Paper>
354
- )}
355
- <Paper p="sm" radius="md" withBorder>
356
- <Text size="sm" fw={600} mb="xs">
357
- Raw Data
358
- </Text>
359
- <Code block>{JSON.stringify(u, null, 2)}</Code>
360
- </Paper>
361
- </Flex>
362
- )
363
- : undefined
364
- }
365
- tableProps={{
366
- highlightOnHover: true,
367
- }}
368
- />
369
- )}
387
+ {(props) => <DataTablePreview {...(props as DataTablePreviewProps)} />}
370
388
  </Showcase>
371
389
  );
372
390
  };
@@ -1,4 +1,4 @@
1
- import { TypeForm } from "@alepha/ui";
1
+ import { TypeForm, useDialog } from "@alepha/ui";
2
2
  import { t } from "alepha";
3
3
  import { useForm } from "alepha/react/form";
4
4
  import Showcase from "../shared/Showcase.tsx";
@@ -32,11 +32,16 @@ const showcaseSchema = t.object({
32
32
  });
33
33
 
34
34
  const DemoTypeForm = () => {
35
+ const dialog = useDialog();
36
+
35
37
  const form = useForm(
36
38
  {
37
39
  schema: formSchema,
38
40
  handler: (values) => {
39
- alert(JSON.stringify(values, null, 2));
41
+ dialog.alert({
42
+ title: "Submitted",
43
+ message: JSON.stringify(values, null, 2),
44
+ });
40
45
  },
41
46
  },
42
47
  [],
@@ -1,5 +1,5 @@
1
+ import { Flex } from "@alepha/ui";
1
2
  import {
2
- Flex,
3
3
  type FlexProps,
4
4
  Portal,
5
5
  SegmentedControl,
@@ -12,7 +12,6 @@ import {
12
12
  IconDeviceTablet,
13
13
  } from "@tabler/icons-react";
14
14
  import { type ReactNode, useState } from "react";
15
-
16
15
  export interface MacWindowProps {
17
16
  children: ReactNode;
18
17
  title?: string;
@@ -127,13 +126,7 @@ const MacWindow = ({ children, title, containerProps }: MacWindowProps) => {
127
126
  );
128
127
 
129
128
  const body = (
130
- <Flex
131
- direction={"column"}
132
- flex={1}
133
- p="md"
134
- style={{ overflow: "auto" }}
135
- {...containerProps}
136
- >
129
+ <Flex overflow direction={"column"} flex={1} p="md" {...containerProps}>
137
130
  {children}
138
131
  </Flex>
139
132
  );
@@ -159,14 +152,15 @@ const MacWindow = ({ children, title, containerProps }: MacWindowProps) => {
159
152
 
160
153
  return (
161
154
  <Flex
162
- direction="column"
155
+ col
156
+ overflow
157
+ h={"100%"}
163
158
  bdrs={"md"}
164
159
  style={{
165
160
  width: DEVICE_WIDTHS[device],
166
161
  maxWidth: "100%",
167
162
  border: "1px solid var(--mantine-color-default-border)",
168
163
  overflow: "hidden",
169
- background: "var(--mantine-color-body)",
170
164
  boxShadow: "0 4px 12px rgba(0, 0, 0, 0.15)",
171
165
  transition: "width 0.3s ease",
172
166
  }}
@@ -1,5 +1,4 @@
1
- import { TypeForm, ui } from "@alepha/ui";
2
- import { Card, Flex, Text } from "@mantine/core";
1
+ import { Flex, Text, TypeForm } from "@alepha/ui";
3
2
  import type { Static, TObject } from "alepha";
4
3
  import { useForm } from "alepha/react/form";
5
4
  import { type ReactNode, useState } from "react";
@@ -36,14 +35,16 @@ export interface ShowcaseProps<T extends TObject> {
36
35
  * Showcase component for demonstrating UI components with interactive props configuration.
37
36
  * Uses TypeForm to render a form based on the props schema and displays the component preview.
38
37
  */
39
- const Showcase = <T extends TObject>({
40
- title,
41
- schema,
42
- initialValues,
43
- columns = 3,
44
- children,
45
- windowProps,
46
- }: ShowcaseProps<T>) => {
38
+ const Showcase = <T extends TObject>(props: ShowcaseProps<T>) => {
39
+ const {
40
+ title,
41
+ schema,
42
+ initialValues,
43
+ columns = 3,
44
+ children,
45
+ windowProps,
46
+ } = props;
47
+
47
48
  const [values, setValues] = useState<Record<string, any>>(
48
49
  initialValues ?? {},
49
50
  );
@@ -63,43 +64,28 @@ const Showcase = <T extends TObject>({
63
64
  );
64
65
 
65
66
  return (
66
- <Flex flex={1} px={"md"} gap={"md"}>
67
- <Flex
68
- flex={1}
69
- bg={ui.colors.background}
70
- h={"100%"}
71
- justify="center"
72
- align="flex-start"
73
- style={{ flex: 1, minWidth: 0, overflow: "auto" }}
74
- >
67
+ <Flex fill p={"md"} pt={0} gap={"md"} overflow>
68
+ <Flex fill overflow ground h={"100%"} justify="center" align="flex-start">
75
69
  <MacWindow title={title} {...windowProps}>
76
70
  {children(values as Static<T>)}
77
71
  </MacWindow>
78
72
  </Flex>
79
73
 
80
- <Flex
81
- h={"100%"}
82
- style={{
83
- flex: "0 0 300px",
84
- overflow: "auto",
85
- }}
86
- >
87
- <Card shadow="sm" radius="md">
88
- <Card.Section withBorder py={"xs"} inheritPadding>
89
- <Text size={"xs"} fw={500}>
90
- {title} Props
91
- </Text>
92
- </Card.Section>
93
-
94
- <Card.Section p={"sm"}>
95
- <TypeForm
96
- form={form}
97
- columns={{ base: 1, xs: 1, sm: 1, md: 1, lg: 1, xl: 1 }}
98
- skipSubmitButton
99
- skipFormElement
100
- />
101
- </Card.Section>
102
- </Card>
74
+ <Flex h={"100%"} col surface bordered rounded shadowed w={300}>
75
+ <Flex p={"xs"} borderedBottom>
76
+ <Text size={"xs"} fw={500}>
77
+ {title} Props
78
+ </Text>
79
+ </Flex>
80
+ <Flex px={"md"} py={"xs"}>
81
+ <TypeForm
82
+ fill
83
+ form={form}
84
+ columns={{ base: 1, xs: 1, sm: 1, md: 1, lg: 1, xl: 1 }}
85
+ skipSubmitButton
86
+ skipFormElement
87
+ />
88
+ </Flex>
103
89
  </Flex>
104
90
  </Flex>
105
91
  );