@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
@@ -0,0 +1,325 @@
1
+ import {
2
+ Control,
3
+ Flex,
4
+ type SelectValueLabel,
5
+ Text,
6
+ TypeForm,
7
+ useDialog,
8
+ } from "@alepha/ui";
9
+ import { t } from "alepha";
10
+ import { useForm } from "alepha/react/form";
11
+ import Showcase from "../shared/Showcase.tsx";
12
+
13
+ // region schemas
14
+
15
+ const selectSchema = t.object({
16
+ status: t.enum(["active", "inactive", "pending"], {
17
+ title: "Status",
18
+ default: "active",
19
+ }),
20
+ priority: t.enum(["low", "medium", "high", "critical"], {
21
+ title: "Priority",
22
+ }),
23
+ });
24
+
25
+ const multiSelectSchema = t.object({
26
+ roles: t.array(t.enum(["admin", "editor", "viewer", "moderator"]), {
27
+ title: "Roles",
28
+ default: ["editor"],
29
+ }),
30
+ });
31
+
32
+ const autocompleteSchema = t.object({
33
+ city: t.enum(["Paris", "London", "Tokyo", "New York", "Berlin", "Sydney"], {
34
+ title: "City",
35
+ default: "Paris",
36
+ }),
37
+ });
38
+
39
+ const tagsSchema = t.object({
40
+ tags: t.array(t.text(), {
41
+ title: "Tags",
42
+ default: ["typescript", "react"],
43
+ }),
44
+ });
45
+
46
+ const segmentedSchema = t.object({
47
+ theme: t.enum(["light", "dark", "auto"], {
48
+ title: "Theme",
49
+ default: "auto",
50
+ }),
51
+ });
52
+
53
+ const booleanSchema = t.object({
54
+ enabled: t.boolean({
55
+ title: "Enabled",
56
+ default: true,
57
+ }),
58
+ });
59
+
60
+ const numericSchema = t.object({
61
+ rating: t.integer({
62
+ title: "Rating",
63
+ enum: [1, 2, 3, 4, 5] as any,
64
+ }),
65
+ });
66
+
67
+ // endregion
68
+
69
+ // region async loader
70
+
71
+ const allCities = Array.from({ length: 200 }, (_, i) => ({
72
+ value: `city-${i}`,
73
+ label: `City ${i} - ${["Alpha", "Beta", "Gamma", "Delta", "Epsilon"][i % 5]}`,
74
+ }));
75
+
76
+ const cityLoader = async (
77
+ search: string,
78
+ resolve?: string[],
79
+ ): Promise<SelectValueLabel[]> => {
80
+ await new Promise((r) => setTimeout(r, 300));
81
+
82
+ if (resolve) {
83
+ return allCities.filter((c) => resolve.includes(c.value));
84
+ }
85
+
86
+ if (!search) return allCities;
87
+ return allCities.filter((c) =>
88
+ c.label.toLowerCase().includes(search.toLowerCase()),
89
+ );
90
+ };
91
+
92
+ const shortCities = allCities.slice(0, 20);
93
+ const shortCityLoader = async (): Promise<SelectValueLabel[]> => {
94
+ await new Promise((r) => setTimeout(r, 300));
95
+ return shortCities;
96
+ };
97
+
98
+ // endregion
99
+
100
+ // region shared hook
101
+
102
+ const useAlertValues = () => {
103
+ const dialog = useDialog();
104
+ return (values: any) => {
105
+ dialog.alert({
106
+ title: "Submitted",
107
+ message: JSON.stringify(values, null, 2),
108
+ });
109
+ };
110
+ };
111
+
112
+ // endregion
113
+
114
+ // region variant components
115
+
116
+ const SelectVariant = () => {
117
+ const handler = useAlertValues();
118
+ const form = useForm({ schema: selectSchema, handler }, []);
119
+ return (
120
+ <TypeForm fill form={form} submitButtonProps={{ children: "Submit" }} />
121
+ );
122
+ };
123
+
124
+ const MultiSelectVariant = () => {
125
+ const handler = useAlertValues();
126
+ const form = useForm({ schema: multiSelectSchema, handler }, []);
127
+ return (
128
+ <TypeForm fill form={form} submitButtonProps={{ children: "Submit" }} />
129
+ );
130
+ };
131
+
132
+ const AutocompleteVariant = () => {
133
+ const handler = useAlertValues();
134
+ const form = useForm({ schema: autocompleteSchema, handler }, []);
135
+ return (
136
+ <TypeForm
137
+ fill
138
+ form={form}
139
+ fieldControlProps={{ city: { select: { creatable: true } } }}
140
+ submitButtonProps={{ children: "Submit" }}
141
+ />
142
+ );
143
+ };
144
+
145
+ const TagsVariant = () => {
146
+ const handler = useAlertValues();
147
+ const form = useForm({ schema: tagsSchema, handler }, []);
148
+ return (
149
+ <TypeForm
150
+ fill
151
+ form={form}
152
+ fieldControlProps={{ tags: { select: { creatable: true } } }}
153
+ submitButtonProps={{ children: "Submit" }}
154
+ />
155
+ );
156
+ };
157
+
158
+ const SegmentedVariant = () => {
159
+ const handler = useAlertValues();
160
+ const form = useForm({ schema: segmentedSchema, handler }, []);
161
+ return (
162
+ <TypeForm
163
+ fill
164
+ form={form}
165
+ fieldControlProps={{ theme: { segmented: true } }}
166
+ submitButtonProps={{ children: "Submit" }}
167
+ />
168
+ );
169
+ };
170
+
171
+ const BooleanVariant = () => {
172
+ const handler = useAlertValues();
173
+ const form = useForm({ schema: booleanSchema, handler }, []);
174
+ return (
175
+ <TypeForm fill form={form} submitButtonProps={{ children: "Submit" }} />
176
+ );
177
+ };
178
+
179
+ const NumericVariant = () => {
180
+ const handler = useAlertValues();
181
+ const form = useForm({ schema: numericSchema, handler }, []);
182
+ return (
183
+ <TypeForm
184
+ fill
185
+ form={form}
186
+ fieldControlProps={{
187
+ rating: {
188
+ select: {
189
+ selectProps: {
190
+ data: [
191
+ { value: "1", label: "1 - Poor" },
192
+ { value: "2", label: "2 - Fair" },
193
+ { value: "3", label: "3 - Good" },
194
+ { value: "4", label: "4 - Great" },
195
+ { value: "5", label: "5 - Excellent" },
196
+ ],
197
+ },
198
+ },
199
+ },
200
+ }}
201
+ submitButtonProps={{ children: "Submit" }}
202
+ />
203
+ );
204
+ };
205
+
206
+ const AsyncShortVariant = () => {
207
+ const handler = useAlertValues();
208
+ const asyncSchema = t.object({ city: t.text({ title: "City" }) });
209
+ const form = useForm({ schema: asyncSchema, handler }, []);
210
+ return (
211
+ <Control
212
+ input={form.input.city}
213
+ select={{
214
+ loader: shortCityLoader,
215
+ }}
216
+ />
217
+ );
218
+ };
219
+
220
+ const AsyncLongVariant = () => {
221
+ const handler = useAlertValues();
222
+ const asyncSchema = t.object({ city: t.text({ title: "City" }) });
223
+ const form = useForm({ schema: asyncSchema, handler }, []);
224
+ return (
225
+ <Control
226
+ input={form.input.city}
227
+ select={{
228
+ loader: cityLoader,
229
+ selectProps: { defaultValue: "city-42" },
230
+ }}
231
+ />
232
+ );
233
+ };
234
+
235
+ // endregion
236
+
237
+ const variants: {
238
+ title: string;
239
+ description: string;
240
+ component: () => React.ReactNode;
241
+ }[] = [
242
+ {
243
+ title: "Select",
244
+ description: "Single enum value with dropdown",
245
+ component: SelectVariant,
246
+ },
247
+ {
248
+ title: "Multi Select",
249
+ description: "Array of enum values with multi-select dropdown",
250
+ component: MultiSelectVariant,
251
+ },
252
+ {
253
+ title: "Autocomplete",
254
+ description:
255
+ "Single value with freeform text input — type any value or pick from suggestions",
256
+ component: AutocompleteVariant,
257
+ },
258
+ {
259
+ title: "Tags",
260
+ description: "Array of freeform values — type and press Enter to add tags",
261
+ component: TagsVariant,
262
+ },
263
+ {
264
+ title: "Segmented",
265
+ description: "Enum rendered as segmented toggle buttons",
266
+ component: SegmentedVariant,
267
+ },
268
+ {
269
+ title: "Boolean",
270
+ description:
271
+ "Boolean value — select value is coerced to true/false on submit",
272
+ component: BooleanVariant,
273
+ },
274
+ {
275
+ title: "Numeric",
276
+ description: "Integer enum — select value is coerced to number on submit",
277
+ component: NumericVariant,
278
+ },
279
+ {
280
+ title: "Async (Short)",
281
+ description:
282
+ "Loader returns <= 100 items — client-side filtering, single network call",
283
+ component: AsyncShortVariant,
284
+ },
285
+ {
286
+ title: "Async (Long)",
287
+ description:
288
+ "Loader returns > 100 items — server-side filtering with debounced search",
289
+ component: AsyncLongVariant,
290
+ },
291
+ ];
292
+
293
+ const showcaseSchema = t.object({});
294
+
295
+ const DemoControlSelect = () => {
296
+ return (
297
+ <Showcase title="ControlSelect" schema={showcaseSchema}>
298
+ {() => (
299
+ <Flex direction="column" gap="xl">
300
+ {variants.map((variant) => (
301
+ <Flex
302
+ rounded
303
+ shadowed={"sm"}
304
+ bordered
305
+ key={variant.title}
306
+ direction="column"
307
+ >
308
+ <Flex elevated rounded col borderedBottom p={"sm"}>
309
+ <Text fw={600}>{variant.title}</Text>
310
+ <Text size="sm" c="dimmed">
311
+ {variant.description}
312
+ </Text>
313
+ </Flex>
314
+ <Flex rounded surface p={"xs"}>
315
+ <variant.component />
316
+ </Flex>
317
+ </Flex>
318
+ ))}
319
+ </Flex>
320
+ )}
321
+ </Showcase>
322
+ );
323
+ };
324
+
325
+ export default DemoControlSelect;