@burdenoff/microfe-admin 2026.511.1

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 (370) hide show
  1. package/README.md +74 -0
  2. package/dist/admin/AdminRoot.d.ts +31 -0
  3. package/dist/admin/AdminRoot.d.ts.map +1 -0
  4. package/dist/admin/AdminRoot.js +175 -0
  5. package/dist/admin/AdminRoot.js.map +1 -0
  6. package/dist/admin/AdminRoutes.d.ts +29 -0
  7. package/dist/admin/AdminRoutes.d.ts.map +1 -0
  8. package/dist/admin/AdminRoutes.js +143 -0
  9. package/dist/admin/AdminRoutes.js.map +1 -0
  10. package/dist/admin/components/AccessDenied.d.ts +8 -0
  11. package/dist/admin/components/AccessDenied.d.ts.map +1 -0
  12. package/dist/admin/components/AccessDenied.js +28 -0
  13. package/dist/admin/components/AccessDenied.js.map +1 -0
  14. package/dist/admin/components/ActivityFeed.d.ts +20 -0
  15. package/dist/admin/components/ActivityFeed.d.ts.map +1 -0
  16. package/dist/admin/components/ActivityFeed.js +91 -0
  17. package/dist/admin/components/ActivityFeed.js.map +1 -0
  18. package/dist/admin/components/Charts.d.ts +33 -0
  19. package/dist/admin/components/Charts.d.ts.map +1 -0
  20. package/dist/admin/components/Charts.js +37 -0
  21. package/dist/admin/components/Charts.js.map +1 -0
  22. package/dist/admin/components/ConfirmDialog.d.ts +45 -0
  23. package/dist/admin/components/ConfirmDialog.d.ts.map +1 -0
  24. package/dist/admin/components/ConfirmDialog.js +4 -0
  25. package/dist/admin/components/DataTable.d.ts +64 -0
  26. package/dist/admin/components/DataTable.d.ts.map +1 -0
  27. package/dist/admin/components/DataTable.js +127 -0
  28. package/dist/admin/components/DataTable.js.map +1 -0
  29. package/dist/admin/components/FormSheet.d.ts +79 -0
  30. package/dist/admin/components/FormSheet.d.ts.map +1 -0
  31. package/dist/admin/components/FormSheet.js +111 -0
  32. package/dist/admin/components/FormSheet.js.map +1 -0
  33. package/dist/admin/components/MetricCard.d.ts +40 -0
  34. package/dist/admin/components/MetricCard.d.ts.map +1 -0
  35. package/dist/admin/components/MetricCard.js +57 -0
  36. package/dist/admin/components/MetricCard.js.map +1 -0
  37. package/dist/admin/components/PageLayout.d.ts +34 -0
  38. package/dist/admin/components/PageLayout.d.ts.map +1 -0
  39. package/dist/admin/components/PageLayout.js +31 -0
  40. package/dist/admin/components/PageLayout.js.map +1 -0
  41. package/dist/admin/components/PermissionGuard.d.ts +12 -0
  42. package/dist/admin/components/PermissionGuard.d.ts.map +1 -0
  43. package/dist/admin/components/PermissionGuard.js +18 -0
  44. package/dist/admin/components/PermissionGuard.js.map +1 -0
  45. package/dist/admin/components/RowActions.d.ts +41 -0
  46. package/dist/admin/components/RowActions.d.ts.map +1 -0
  47. package/dist/admin/components/RowActions.js +93 -0
  48. package/dist/admin/components/RowActions.js.map +1 -0
  49. package/dist/admin/components/StatusBadge.d.ts +35 -0
  50. package/dist/admin/components/StatusBadge.d.ts.map +1 -0
  51. package/dist/admin/components/StatusBadge.js +41 -0
  52. package/dist/admin/components/StatusBadge.js.map +1 -0
  53. package/dist/admin/components/Toast.d.ts +26 -0
  54. package/dist/admin/components/Toast.d.ts.map +1 -0
  55. package/dist/admin/components/Toast.js +133 -0
  56. package/dist/admin/components/Toast.js.map +1 -0
  57. package/dist/admin/components/forms/SubscriptionForm.d.ts +57 -0
  58. package/dist/admin/components/forms/SubscriptionForm.d.ts.map +1 -0
  59. package/dist/admin/components/forms/SubscriptionForm.js +299 -0
  60. package/dist/admin/components/forms/SubscriptionForm.js.map +1 -0
  61. package/dist/admin/components/forms/TenantForm.d.ts +68 -0
  62. package/dist/admin/components/forms/TenantForm.d.ts.map +1 -0
  63. package/dist/admin/components/forms/TenantForm.js +346 -0
  64. package/dist/admin/components/forms/TenantForm.js.map +1 -0
  65. package/dist/admin/components/forms/TicketForm.d.ts +67 -0
  66. package/dist/admin/components/forms/TicketForm.d.ts.map +1 -0
  67. package/dist/admin/components/forms/TicketForm.js +55 -0
  68. package/dist/admin/components/forms/TicketForm.js.map +1 -0
  69. package/dist/admin/components/forms/UserForm.d.ts +57 -0
  70. package/dist/admin/components/forms/UserForm.d.ts.map +1 -0
  71. package/dist/admin/components/forms/UserForm.js +253 -0
  72. package/dist/admin/components/forms/UserForm.js.map +1 -0
  73. package/dist/admin/components/forms/index.d.ts +5 -0
  74. package/dist/admin/components/forms/index.d.ts.map +1 -0
  75. package/dist/admin/components/forms/index.js +4 -0
  76. package/dist/admin/components/index.d.ts +15 -0
  77. package/dist/admin/components/index.d.ts.map +1 -0
  78. package/dist/admin/components/index.js +17 -0
  79. package/dist/admin/components/ui.d.ts +52 -0
  80. package/dist/admin/components/ui.d.ts.map +1 -0
  81. package/dist/admin/components/ui.js +140 -0
  82. package/dist/admin/components/ui.js.map +1 -0
  83. package/dist/admin/constants/index.d.ts +75 -0
  84. package/dist/admin/constants/index.d.ts.map +1 -0
  85. package/dist/admin/constants/index.js +90 -0
  86. package/dist/admin/constants/index.js.map +1 -0
  87. package/dist/admin/constants/permissions.d.ts +27 -0
  88. package/dist/admin/constants/permissions.d.ts.map +1 -0
  89. package/dist/admin/constants/permissions.js +23 -0
  90. package/dist/admin/constants/permissions.js.map +1 -0
  91. package/dist/admin/hooks/useAdminPermissions.d.ts +30 -0
  92. package/dist/admin/hooks/useAdminPermissions.d.ts.map +1 -0
  93. package/dist/admin/hooks/useAdminPermissions.js +56 -0
  94. package/dist/admin/hooks/useAdminPermissions.js.map +1 -0
  95. package/dist/admin/index.d.ts +31 -0
  96. package/dist/admin/index.d.ts.map +1 -0
  97. package/dist/admin/index.js +9 -0
  98. package/dist/admin/pages/AuditLogsPage.d.ts +5 -0
  99. package/dist/admin/pages/AuditLogsPage.d.ts.map +1 -0
  100. package/dist/admin/pages/AuditLogsPage.js +209 -0
  101. package/dist/admin/pages/AuditLogsPage.js.map +1 -0
  102. package/dist/admin/pages/BillingPage.d.ts +2 -0
  103. package/dist/admin/pages/BillingPage.d.ts.map +1 -0
  104. package/dist/admin/pages/BillingPage.js +164 -0
  105. package/dist/admin/pages/BillingPage.js.map +1 -0
  106. package/dist/admin/pages/CommunicationsPage.d.ts +2 -0
  107. package/dist/admin/pages/CommunicationsPage.d.ts.map +1 -0
  108. package/dist/admin/pages/CommunicationsPage.js +118 -0
  109. package/dist/admin/pages/CommunicationsPage.js.map +1 -0
  110. package/dist/admin/pages/DashboardPage.d.ts +5 -0
  111. package/dist/admin/pages/DashboardPage.d.ts.map +1 -0
  112. package/dist/admin/pages/DashboardPage.js +121 -0
  113. package/dist/admin/pages/DashboardPage.js.map +1 -0
  114. package/dist/admin/pages/FeatureFlagsPage.d.ts +2 -0
  115. package/dist/admin/pages/FeatureFlagsPage.d.ts.map +1 -0
  116. package/dist/admin/pages/FeatureFlagsPage.js +116 -0
  117. package/dist/admin/pages/FeatureFlagsPage.js.map +1 -0
  118. package/dist/admin/pages/OrganizationsListPage.d.ts +2 -0
  119. package/dist/admin/pages/OrganizationsListPage.d.ts.map +1 -0
  120. package/dist/admin/pages/OrganizationsListPage.js +112 -0
  121. package/dist/admin/pages/OrganizationsListPage.js.map +1 -0
  122. package/dist/admin/pages/ProductsPage.d.ts +5 -0
  123. package/dist/admin/pages/ProductsPage.d.ts.map +1 -0
  124. package/dist/admin/pages/ProductsPage.js +392 -0
  125. package/dist/admin/pages/ProductsPage.js.map +1 -0
  126. package/dist/admin/pages/ReferralsPage.d.ts +2 -0
  127. package/dist/admin/pages/ReferralsPage.d.ts.map +1 -0
  128. package/dist/admin/pages/ReferralsPage.js +272 -0
  129. package/dist/admin/pages/ReferralsPage.js.map +1 -0
  130. package/dist/admin/pages/RolesPermissionsPage.d.ts +2 -0
  131. package/dist/admin/pages/RolesPermissionsPage.d.ts.map +1 -0
  132. package/dist/admin/pages/RolesPermissionsPage.js +145 -0
  133. package/dist/admin/pages/RolesPermissionsPage.js.map +1 -0
  134. package/dist/admin/pages/SREPage.d.ts +5 -0
  135. package/dist/admin/pages/SREPage.d.ts.map +1 -0
  136. package/dist/admin/pages/SREPage.js +405 -0
  137. package/dist/admin/pages/SREPage.js.map +1 -0
  138. package/dist/admin/pages/SandboxSettingsPage.d.ts +7 -0
  139. package/dist/admin/pages/SandboxSettingsPage.d.ts.map +1 -0
  140. package/dist/admin/pages/SandboxSettingsPage.js +497 -0
  141. package/dist/admin/pages/SandboxSettingsPage.js.map +1 -0
  142. package/dist/admin/pages/SettingsPage.d.ts +5 -0
  143. package/dist/admin/pages/SettingsPage.d.ts.map +1 -0
  144. package/dist/admin/pages/SettingsPage.js +279 -0
  145. package/dist/admin/pages/SettingsPage.js.map +1 -0
  146. package/dist/admin/pages/TenantDetailPage.d.ts +5 -0
  147. package/dist/admin/pages/TenantDetailPage.d.ts.map +1 -0
  148. package/dist/admin/pages/TenantDetailPage.js +274 -0
  149. package/dist/admin/pages/TenantDetailPage.js.map +1 -0
  150. package/dist/admin/pages/TenantFormRoutePage.d.ts +6 -0
  151. package/dist/admin/pages/TenantFormRoutePage.d.ts.map +1 -0
  152. package/dist/admin/pages/TenantFormRoutePage.js +136 -0
  153. package/dist/admin/pages/TenantFormRoutePage.js.map +1 -0
  154. package/dist/admin/pages/TenantsListPage.d.ts +5 -0
  155. package/dist/admin/pages/TenantsListPage.d.ts.map +1 -0
  156. package/dist/admin/pages/TenantsListPage.js +339 -0
  157. package/dist/admin/pages/TenantsListPage.js.map +1 -0
  158. package/dist/admin/pages/UsersListPage.d.ts +5 -0
  159. package/dist/admin/pages/UsersListPage.d.ts.map +1 -0
  160. package/dist/admin/pages/UsersListPage.js +250 -0
  161. package/dist/admin/pages/UsersListPage.js.map +1 -0
  162. package/dist/admin/pages/WaitlistPage.d.ts +2 -0
  163. package/dist/admin/pages/WaitlistPage.d.ts.map +1 -0
  164. package/dist/admin/pages/WaitlistPage.js +241 -0
  165. package/dist/admin/pages/WaitlistPage.js.map +1 -0
  166. package/dist/admin/pages/WorkflowsPage.d.ts +2 -0
  167. package/dist/admin/pages/WorkflowsPage.d.ts.map +1 -0
  168. package/dist/admin/pages/WorkflowsPage.js +126 -0
  169. package/dist/admin/pages/WorkflowsPage.js.map +1 -0
  170. package/dist/admin/pages/WorkspacesListPage.d.ts +2 -0
  171. package/dist/admin/pages/WorkspacesListPage.d.ts.map +1 -0
  172. package/dist/admin/pages/WorkspacesListPage.js +100 -0
  173. package/dist/admin/pages/WorkspacesListPage.js.map +1 -0
  174. package/dist/admin/pages/index.d.ts +20 -0
  175. package/dist/admin/pages/index.d.ts.map +1 -0
  176. package/dist/admin/pages/index.js +19 -0
  177. package/dist/admin/providers/AdminProvider.d.ts +13 -0
  178. package/dist/admin/providers/AdminProvider.d.ts.map +1 -0
  179. package/dist/admin/providers/AdminProvider.js +43 -0
  180. package/dist/admin/providers/AdminProvider.js.map +1 -0
  181. package/dist/admin/schemas/index.d.ts +409 -0
  182. package/dist/admin/schemas/index.d.ts.map +1 -0
  183. package/dist/admin/schemas/index.js +111 -0
  184. package/dist/admin/schemas/index.js.map +1 -0
  185. package/dist/admin/store/adminStore.d.ts +28 -0
  186. package/dist/admin/store/adminStore.d.ts.map +1 -0
  187. package/dist/admin/store/adminStore.js +48 -0
  188. package/dist/admin/store/adminStore.js.map +1 -0
  189. package/dist/admin/types/index.d.ts +325 -0
  190. package/dist/admin/types/index.d.ts.map +1 -0
  191. package/dist/admin/utils/cn.d.ts +7 -0
  192. package/dist/admin/utils/cn.d.ts.map +1 -0
  193. package/dist/admin/utils/cn.js +10 -0
  194. package/dist/admin/utils/cn.js.map +1 -0
  195. package/dist/admin/utils/directActivityGraphql.d.ts +11 -0
  196. package/dist/admin/utils/directActivityGraphql.d.ts.map +1 -0
  197. package/dist/admin/utils/directActivityGraphql.js +25 -0
  198. package/dist/admin/utils/directActivityGraphql.js.map +1 -0
  199. package/dist/admin/utils/formatters.d.ts +33 -0
  200. package/dist/admin/utils/formatters.d.ts.map +1 -0
  201. package/dist/admin/utils/formatters.js +54 -0
  202. package/dist/admin/utils/formatters.js.map +1 -0
  203. package/dist/admin/utils/gatewayGraphql.d.ts +9 -0
  204. package/dist/admin/utils/gatewayGraphql.d.ts.map +1 -0
  205. package/dist/admin/utils/i18n.d.ts +6 -0
  206. package/dist/admin/utils/i18n.d.ts.map +1 -0
  207. package/dist/admin/utils/i18n.js +15 -0
  208. package/dist/admin/utils/i18n.js.map +1 -0
  209. package/dist/admin/utils/mappers.d.ts +15 -0
  210. package/dist/admin/utils/mappers.d.ts.map +1 -0
  211. package/dist/admin/utils/mappers.js +73 -0
  212. package/dist/admin/utils/mappers.js.map +1 -0
  213. package/dist/admin/utils/navigation.d.ts +9 -0
  214. package/dist/admin/utils/navigation.d.ts.map +1 -0
  215. package/dist/admin/utils/navigation.js +8 -0
  216. package/dist/admin/utils/navigation.js.map +1 -0
  217. package/dist/admin/utils/tenantEvents.d.ts +11 -0
  218. package/dist/admin/utils/tenantEvents.d.ts.map +1 -0
  219. package/dist/admin/utils/tenantEvents.js +8 -0
  220. package/dist/admin/utils/tenantEvents.js.map +1 -0
  221. package/dist/dev/main.d.ts +2 -0
  222. package/dist/dev/main.d.ts.map +1 -0
  223. package/dist/generated/global-operations.d.ts +2749 -0
  224. package/dist/generated/global-operations.d.ts.map +1 -0
  225. package/dist/generated/global-operations.js +907 -0
  226. package/dist/generated/global-operations.js.map +1 -0
  227. package/dist/generated/global-types.d.ts +20773 -0
  228. package/dist/generated/global-types.d.ts.map +1 -0
  229. package/dist/generated/global-types.js +12 -0
  230. package/dist/generated/global-types.js.map +1 -0
  231. package/dist/generated/wspace-operations.d.ts +132 -0
  232. package/dist/generated/wspace-operations.d.ts.map +1 -0
  233. package/dist/generated/wspace-operations.js +65 -0
  234. package/dist/generated/wspace-operations.js.map +1 -0
  235. package/dist/generated/wspace-types.d.ts +53363 -0
  236. package/dist/generated/wspace-types.d.ts.map +1 -0
  237. package/dist/index.d.ts +6 -0
  238. package/dist/index.d.ts.map +1 -0
  239. package/dist/index.js +10 -0
  240. package/dist/node_modules/@hookform/resolvers/dist/resolvers.js +34 -0
  241. package/dist/node_modules/@hookform/resolvers/dist/resolvers.js.map +1 -0
  242. package/dist/node_modules/@hookform/resolvers/zod/dist/zod.js +118 -0
  243. package/dist/node_modules/@hookform/resolvers/zod/dist/zod.js.map +1 -0
  244. package/dist/node_modules/clsx/dist/clsx.js +18 -0
  245. package/dist/node_modules/clsx/dist/clsx.js.map +1 -0
  246. package/dist/node_modules/date-fns/_lib/addLeadingZeros.js +8 -0
  247. package/dist/node_modules/date-fns/_lib/addLeadingZeros.js.map +1 -0
  248. package/dist/node_modules/date-fns/_lib/defaultOptions.js +9 -0
  249. package/dist/node_modules/date-fns/_lib/defaultOptions.js.map +1 -0
  250. package/dist/node_modules/date-fns/_lib/format/formatters.js +384 -0
  251. package/dist/node_modules/date-fns/_lib/format/formatters.js.map +1 -0
  252. package/dist/node_modules/date-fns/_lib/format/lightFormatters.js +45 -0
  253. package/dist/node_modules/date-fns/_lib/format/lightFormatters.js.map +1 -0
  254. package/dist/node_modules/date-fns/_lib/format/longFormatters.js +42 -0
  255. package/dist/node_modules/date-fns/_lib/format/longFormatters.js.map +1 -0
  256. package/dist/node_modules/date-fns/_lib/getRoundingMethod.js +11 -0
  257. package/dist/node_modules/date-fns/_lib/getRoundingMethod.js.map +1 -0
  258. package/dist/node_modules/date-fns/_lib/getTimezoneOffsetInMilliseconds.js +10 -0
  259. package/dist/node_modules/date-fns/_lib/getTimezoneOffsetInMilliseconds.js.map +1 -0
  260. package/dist/node_modules/date-fns/_lib/normalizeDates.js +10 -0
  261. package/dist/node_modules/date-fns/_lib/normalizeDates.js.map +1 -0
  262. package/dist/node_modules/date-fns/_lib/protectedTokens.js +25 -0
  263. package/dist/node_modules/date-fns/_lib/protectedTokens.js.map +1 -0
  264. package/dist/node_modules/date-fns/compareAsc.js +10 -0
  265. package/dist/node_modules/date-fns/compareAsc.js.map +1 -0
  266. package/dist/node_modules/date-fns/constants.js +8 -0
  267. package/dist/node_modules/date-fns/constants.js.map +1 -0
  268. package/dist/node_modules/date-fns/constructFrom.js +9 -0
  269. package/dist/node_modules/date-fns/constructFrom.js.map +1 -0
  270. package/dist/node_modules/date-fns/constructNow.js +9 -0
  271. package/dist/node_modules/date-fns/constructNow.js.map +1 -0
  272. package/dist/node_modules/date-fns/differenceInCalendarDays.js +13 -0
  273. package/dist/node_modules/date-fns/differenceInCalendarDays.js.map +1 -0
  274. package/dist/node_modules/date-fns/differenceInCalendarMonths.js +10 -0
  275. package/dist/node_modules/date-fns/differenceInCalendarMonths.js.map +1 -0
  276. package/dist/node_modules/date-fns/differenceInMilliseconds.js +9 -0
  277. package/dist/node_modules/date-fns/differenceInMilliseconds.js.map +1 -0
  278. package/dist/node_modules/date-fns/differenceInMonths.js +18 -0
  279. package/dist/node_modules/date-fns/differenceInMonths.js.map +1 -0
  280. package/dist/node_modules/date-fns/differenceInSeconds.js +11 -0
  281. package/dist/node_modules/date-fns/differenceInSeconds.js.map +1 -0
  282. package/dist/node_modules/date-fns/endOfDay.js +10 -0
  283. package/dist/node_modules/date-fns/endOfDay.js.map +1 -0
  284. package/dist/node_modules/date-fns/endOfMonth.js +10 -0
  285. package/dist/node_modules/date-fns/endOfMonth.js.map +1 -0
  286. package/dist/node_modules/date-fns/format.js +61 -0
  287. package/dist/node_modules/date-fns/format.js.map +1 -0
  288. package/dist/node_modules/date-fns/formatDistance.js +39 -0
  289. package/dist/node_modules/date-fns/formatDistance.js.map +1 -0
  290. package/dist/node_modules/date-fns/formatDistanceToNow.js +10 -0
  291. package/dist/node_modules/date-fns/formatDistanceToNow.js.map +1 -0
  292. package/dist/node_modules/date-fns/getDayOfYear.js +12 -0
  293. package/dist/node_modules/date-fns/getDayOfYear.js.map +1 -0
  294. package/dist/node_modules/date-fns/getISOWeek.js +13 -0
  295. package/dist/node_modules/date-fns/getISOWeek.js.map +1 -0
  296. package/dist/node_modules/date-fns/getISOWeekYear.js +16 -0
  297. package/dist/node_modules/date-fns/getISOWeekYear.js.map +1 -0
  298. package/dist/node_modules/date-fns/getWeek.js +13 -0
  299. package/dist/node_modules/date-fns/getWeek.js.map +1 -0
  300. package/dist/node_modules/date-fns/getWeekYear.js +17 -0
  301. package/dist/node_modules/date-fns/getWeekYear.js.map +1 -0
  302. package/dist/node_modules/date-fns/isDate.js +8 -0
  303. package/dist/node_modules/date-fns/isDate.js.map +1 -0
  304. package/dist/node_modules/date-fns/isLastDayOfMonth.js +12 -0
  305. package/dist/node_modules/date-fns/isLastDayOfMonth.js.map +1 -0
  306. package/dist/node_modules/date-fns/isValid.js +10 -0
  307. package/dist/node_modules/date-fns/isValid.js.map +1 -0
  308. package/dist/node_modules/date-fns/locale/_lib/buildFormatLongFn.js +11 -0
  309. package/dist/node_modules/date-fns/locale/_lib/buildFormatLongFn.js.map +1 -0
  310. package/dist/node_modules/date-fns/locale/_lib/buildLocalizeFn.js +19 -0
  311. package/dist/node_modules/date-fns/locale/_lib/buildLocalizeFn.js.map +1 -0
  312. package/dist/node_modules/date-fns/locale/_lib/buildMatchFn.js +24 -0
  313. package/dist/node_modules/date-fns/locale/_lib/buildMatchFn.js.map +1 -0
  314. package/dist/node_modules/date-fns/locale/_lib/buildMatchPatternFn.js +20 -0
  315. package/dist/node_modules/date-fns/locale/_lib/buildMatchPatternFn.js.map +1 -0
  316. package/dist/node_modules/date-fns/locale/en-US/_lib/formatDistance.js +71 -0
  317. package/dist/node_modules/date-fns/locale/en-US/_lib/formatDistance.js.map +1 -0
  318. package/dist/node_modules/date-fns/locale/en-US/_lib/formatLong.js +34 -0
  319. package/dist/node_modules/date-fns/locale/en-US/_lib/formatLong.js.map +1 -0
  320. package/dist/node_modules/date-fns/locale/en-US/_lib/formatRelative.js +13 -0
  321. package/dist/node_modules/date-fns/locale/en-US/_lib/formatRelative.js.map +1 -0
  322. package/dist/node_modules/date-fns/locale/en-US/_lib/localize.js +204 -0
  323. package/dist/node_modules/date-fns/locale/en-US/_lib/localize.js.map +1 -0
  324. package/dist/node_modules/date-fns/locale/en-US/_lib/match.js +126 -0
  325. package/dist/node_modules/date-fns/locale/en-US/_lib/match.js.map +1 -0
  326. package/dist/node_modules/date-fns/locale/en-US.js +22 -0
  327. package/dist/node_modules/date-fns/locale/en-US.js.map +1 -0
  328. package/dist/node_modules/date-fns/parseISO.js +119 -0
  329. package/dist/node_modules/date-fns/parseISO.js.map +1 -0
  330. package/dist/node_modules/date-fns/startOfDay.js +10 -0
  331. package/dist/node_modules/date-fns/startOfDay.js.map +1 -0
  332. package/dist/node_modules/date-fns/startOfISOWeek.js +12 -0
  333. package/dist/node_modules/date-fns/startOfISOWeek.js.map +1 -0
  334. package/dist/node_modules/date-fns/startOfISOWeekYear.js +12 -0
  335. package/dist/node_modules/date-fns/startOfISOWeekYear.js.map +1 -0
  336. package/dist/node_modules/date-fns/startOfWeek.js +11 -0
  337. package/dist/node_modules/date-fns/startOfWeek.js.map +1 -0
  338. package/dist/node_modules/date-fns/startOfWeekYear.js +13 -0
  339. package/dist/node_modules/date-fns/startOfWeekYear.js.map +1 -0
  340. package/dist/node_modules/date-fns/startOfYear.js +10 -0
  341. package/dist/node_modules/date-fns/startOfYear.js.map +1 -0
  342. package/dist/node_modules/date-fns/toDate.js +9 -0
  343. package/dist/node_modules/date-fns/toDate.js.map +1 -0
  344. package/dist/node_modules/react-hook-form/dist/index.esm.js +1210 -0
  345. package/dist/node_modules/react-hook-form/dist/index.esm.js.map +1 -0
  346. package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js +1716 -0
  347. package/dist/node_modules/tailwind-merge/dist/bundle-mjs.js.map +1 -0
  348. package/dist/node_modules/zod/v3/ZodError.js +82 -0
  349. package/dist/node_modules/zod/v3/ZodError.js.map +1 -0
  350. package/dist/node_modules/zod/v3/errors.js +10 -0
  351. package/dist/node_modules/zod/v3/errors.js.map +1 -0
  352. package/dist/node_modules/zod/v3/helpers/errorUtil.js +9 -0
  353. package/dist/node_modules/zod/v3/helpers/errorUtil.js.map +1 -0
  354. package/dist/node_modules/zod/v3/helpers/parseUtil.js +93 -0
  355. package/dist/node_modules/zod/v3/helpers/parseUtil.js.map +1 -0
  356. package/dist/node_modules/zod/v3/helpers/util.js +76 -0
  357. package/dist/node_modules/zod/v3/helpers/util.js.map +1 -0
  358. package/dist/node_modules/zod/v3/locales/en.js +62 -0
  359. package/dist/node_modules/zod/v3/locales/en.js.map +1 -0
  360. package/dist/node_modules/zod/v3/types.js +2459 -0
  361. package/dist/node_modules/zod/v3/types.js.map +1 -0
  362. package/dist/node_modules/zod/v4/core/core.js +35 -0
  363. package/dist/node_modules/zod/v4/core/core.js.map +1 -0
  364. package/dist/node_modules/zod/v4/core/errors.js +24 -0
  365. package/dist/node_modules/zod/v4/core/errors.js.map +1 -0
  366. package/dist/node_modules/zod/v4/core/parse.js +29 -0
  367. package/dist/node_modules/zod/v4/core/parse.js.map +1 -0
  368. package/dist/node_modules/zod/v4/core/util.js +20 -0
  369. package/dist/node_modules/zod/v4/core/util.js.map +1 -0
  370. package/package.json +111 -0
@@ -0,0 +1,346 @@
1
+ import { cn as e } from "../../utils/cn.js";
2
+ import { Input as t } from "../ui.js";
3
+ import { FormRow as n, FormSection as r, FormSheet as i, FormSheetFooter as a } from "../FormSheet.js";
4
+ import { Controller as o, useForm as s } from "../../../node_modules/react-hook-form/dist/index.esm.js";
5
+ import { a as c } from "../../../node_modules/@hookform/resolvers/zod/dist/zod.js";
6
+ import { booleanType as l, coerce as u, literalType as d, objectType as f, stringType as p } from "../../../node_modules/zod/v3/types.js";
7
+ import { tWithFallback as m } from "../../utils/i18n.js";
8
+ import * as h from "react";
9
+ import { jsx as g, jsxs as _ } from "react/jsx-runtime";
10
+ import { useI18n as v } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
11
+ //#region src/admin/components/forms/TenantForm.tsx
12
+ function y({ label: e, error: t, required: n, children: r, description: i }) {
13
+ return /* @__PURE__ */ _("div", {
14
+ className: "space-y-1.5",
15
+ children: [
16
+ /* @__PURE__ */ _("label", {
17
+ className: "text-sm font-medium text-foreground",
18
+ children: [e, n && /* @__PURE__ */ g("span", {
19
+ className: "text-destructive ml-0.5",
20
+ children: "*"
21
+ })]
22
+ }),
23
+ r,
24
+ i && !t && /* @__PURE__ */ g("p", {
25
+ className: "text-xs text-muted-foreground",
26
+ children: i
27
+ }),
28
+ t && /* @__PURE__ */ g("p", {
29
+ className: "text-xs text-destructive",
30
+ children: t
31
+ })
32
+ ]
33
+ });
34
+ }
35
+ var b = h.forwardRef(({ className: t, options: n, placeholder: r, ...i }, a) => /* @__PURE__ */ _("select", {
36
+ ref: a,
37
+ className: e("flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm transition-colors", "focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring", "disabled:cursor-not-allowed disabled:opacity-50", t),
38
+ ...i,
39
+ children: [r && /* @__PURE__ */ g("option", {
40
+ value: "",
41
+ disabled: !0,
42
+ children: r
43
+ }), n.map((e) => /* @__PURE__ */ g("option", {
44
+ value: e.value,
45
+ children: e.label
46
+ }, e.value))]
47
+ }));
48
+ b.displayName = "SelectField";
49
+ function x({ label: t, checked: n, onChange: r, description: i, disabled: a }) {
50
+ return /* @__PURE__ */ _("label", {
51
+ className: "flex items-start gap-3 cursor-pointer",
52
+ children: [/* @__PURE__ */ g("input", {
53
+ type: "checkbox",
54
+ checked: n,
55
+ onChange: (e) => r(e.target.checked),
56
+ disabled: a,
57
+ className: e("mt-0.5 h-4 w-4 rounded border border-input shadow-sm", "focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring", "disabled:cursor-not-allowed disabled:opacity-50", "checked:bg-primary checked:border-primary")
58
+ }), /* @__PURE__ */ _("div", {
59
+ className: "space-y-0.5",
60
+ children: [/* @__PURE__ */ g("span", {
61
+ className: "text-sm font-medium text-foreground",
62
+ children: t
63
+ }), i && /* @__PURE__ */ g("p", {
64
+ className: "text-xs text-muted-foreground",
65
+ children: i
66
+ })]
67
+ })]
68
+ });
69
+ }
70
+ var S = [
71
+ "Free",
72
+ "Starter",
73
+ "Professional",
74
+ "Enterprise",
75
+ "Custom"
76
+ ], C = [
77
+ "active",
78
+ "suspended",
79
+ "pending",
80
+ "churned"
81
+ ];
82
+ function w(e) {
83
+ return f({
84
+ name: p().min(2, e("admin.tenants.form.errors.nameMin", "Name must be at least 2 characters")).max(100, e("admin.tenants.form.errors.nameMax", "Name must be less than 100 characters")),
85
+ slug: p().min(2, e("admin.tenants.form.errors.slugMin", "Slug must be at least 2 characters")).max(50, e("admin.tenants.form.errors.slugMax", "Slug must be less than 50 characters")).regex(/^[a-z0-9-]+$/, e("admin.tenants.form.errors.slugPattern", "Slug can only contain lowercase letters, numbers, and hyphens")),
86
+ domain: p().optional(),
87
+ ownerEmail: p().email(e("admin.tenants.form.errors.emailInvalid", "Invalid email address")),
88
+ billingEmail: p().email(e("admin.tenants.form.errors.emailInvalid", "Invalid email address")).optional().or(d("")),
89
+ plan: p().min(1),
90
+ status: p().optional(),
91
+ settings: f({
92
+ allowSignup: l(),
93
+ ssoEnabled: l(),
94
+ mfaRequired: l(),
95
+ dataRetentionDays: u.number().int().min(30).max(3650)
96
+ }).optional()
97
+ });
98
+ }
99
+ function T({ open: e, onClose: l, tenant: u, onSave: d }) {
100
+ let f = !!u, p = "tenant-form", { t: T } = v(), E = h.useCallback((e, t, n) => m(T, e, t, n), [T]), D = h.useMemo(() => w(E), [E]), O = h.useMemo(() => {
101
+ let e = [
102
+ {
103
+ value: "Free",
104
+ label: E("admin.tenants.form.plans.free", "Free")
105
+ },
106
+ {
107
+ value: "Starter",
108
+ label: E("admin.tenants.form.plans.starter", "Starter")
109
+ },
110
+ {
111
+ value: "Professional",
112
+ label: E("admin.tenants.form.plans.professional", "Professional")
113
+ },
114
+ {
115
+ value: "Enterprise",
116
+ label: E("admin.tenants.form.plans.enterprise", "Enterprise")
117
+ },
118
+ {
119
+ value: "Custom",
120
+ label: E("admin.tenants.form.plans.custom", "Custom")
121
+ }
122
+ ];
123
+ return u?.plan && !S.includes(u.plan) && e.push({
124
+ value: u.plan,
125
+ label: E("admin.tenants.form.plans.legacy", "{{plan}} (legacy)", { plan: u.plan })
126
+ }), e;
127
+ }, [E, u?.plan]), k = h.useMemo(() => {
128
+ let e = [
129
+ {
130
+ value: "active",
131
+ label: E("admin.tenants.form.statuses.active", "Active")
132
+ },
133
+ {
134
+ value: "suspended",
135
+ label: E("admin.tenants.form.statuses.suspended", "Suspended")
136
+ },
137
+ {
138
+ value: "pending",
139
+ label: E("admin.tenants.form.statuses.pending", "Pending")
140
+ },
141
+ {
142
+ value: "churned",
143
+ label: E("admin.tenants.form.statuses.churned", "Churned")
144
+ }
145
+ ];
146
+ return u?.status && !C.includes(u.status) && e.push({
147
+ value: u.status,
148
+ label: E("admin.tenants.form.statuses.other", "{{status}} (read-only)", { status: u.status })
149
+ }), e;
150
+ }, [E, u?.status]), A = h.useMemo(() => ({
151
+ name: u?.name ?? "",
152
+ slug: u?.slug ?? "",
153
+ domain: u?.domain ?? "",
154
+ ownerEmail: u?.ownerEmail ?? "",
155
+ billingEmail: u?.billingEmail ?? "",
156
+ plan: u?.plan ?? "Free",
157
+ status: u?.status,
158
+ settings: {
159
+ allowSignup: u?.settings?.allowSignup ?? !0,
160
+ ssoEnabled: u?.settings?.ssoEnabled ?? !1,
161
+ mfaRequired: u?.settings?.mfaRequired ?? !1,
162
+ dataRetentionDays: u?.settings?.dataRetentionDays ?? 365
163
+ }
164
+ }), [u]), { register: j, handleSubmit: M, control: N, formState: { errors: P, isSubmitting: F }, reset: I, watch: L, setValue: R } = s({
165
+ resolver: c(D),
166
+ defaultValues: A
167
+ }), z = h.useRef(null);
168
+ h.useEffect(() => {
169
+ if (!e) {
170
+ z.current = null;
171
+ return;
172
+ }
173
+ let t = u?.id ?? "__create__";
174
+ z.current !== t && (I(A), z.current = t);
175
+ }, [
176
+ e,
177
+ u?.id,
178
+ I,
179
+ A
180
+ ]);
181
+ let B = async (e) => {
182
+ try {
183
+ await d({
184
+ ...e,
185
+ id: u?.id
186
+ }), l();
187
+ } catch (e) {
188
+ console.error("Failed to save tenant:", e);
189
+ }
190
+ }, V = L("name"), H = L("slug");
191
+ h.useEffect(() => {
192
+ !f && V && !H && R("slug", V.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, ""));
193
+ }, [
194
+ V,
195
+ f,
196
+ R,
197
+ H
198
+ ]);
199
+ let U = E("admin.tenants.form.titleEdit", "Edit Tenant"), W = E("admin.tenants.form.titleCreate", "Create Tenant"), G = E("admin.tenants.form.submitEdit", "Save Changes"), K = E("admin.tenants.form.submitCreate", "Create Tenant");
200
+ return /* @__PURE__ */ g(i, {
201
+ open: e,
202
+ onClose: l,
203
+ title: f ? U : W,
204
+ description: f ? E("admin.tenants.form.descriptionEdit", "Editing {{name}}", { name: u?.name ?? "" }) : E("admin.tenants.form.descriptionCreate", "Add a new tenant to the platform"),
205
+ width: "lg",
206
+ footer: /* @__PURE__ */ g(a, {
207
+ formId: p,
208
+ submitLabel: f ? G : K,
209
+ onCancel: l,
210
+ isSubmitting: F
211
+ }),
212
+ children: /* @__PURE__ */ _("form", {
213
+ id: p,
214
+ onSubmit: M(B),
215
+ className: "space-y-6",
216
+ children: [
217
+ /* @__PURE__ */ _(r, {
218
+ title: E("admin.tenants.form.sections.basic", "Basic Information"),
219
+ children: [/* @__PURE__ */ g(y, {
220
+ label: E("admin.tenants.form.fields.name", "Tenant Name"),
221
+ required: !0,
222
+ error: P.name?.message,
223
+ children: /* @__PURE__ */ g(t, {
224
+ ...j("name"),
225
+ placeholder: E("admin.tenants.form.placeholders.name", "Acme Corporation"),
226
+ "aria-invalid": !!P.name
227
+ })
228
+ }), /* @__PURE__ */ _(n, { children: [/* @__PURE__ */ g(y, {
229
+ label: E("admin.tenants.form.fields.slug", "Slug"),
230
+ required: !0,
231
+ error: P.slug?.message,
232
+ description: f ? E("admin.tenants.form.descriptions.slugImmutable", "Slug is set at creation and cannot be changed.") : E("admin.tenants.form.descriptions.slug", "URL-friendly identifier"),
233
+ children: /* @__PURE__ */ g(t, {
234
+ ...j("slug"),
235
+ placeholder: E("admin.tenants.form.placeholders.slug", "acme-corp"),
236
+ "aria-invalid": !!P.slug,
237
+ disabled: f,
238
+ readOnly: f
239
+ })
240
+ }), /* @__PURE__ */ g(y, {
241
+ label: E("admin.tenants.form.fields.domain", "Domain"),
242
+ error: P.domain?.message,
243
+ children: /* @__PURE__ */ g(t, {
244
+ ...j("domain"),
245
+ placeholder: E("admin.tenants.form.placeholders.domain", "acme.com"),
246
+ "aria-invalid": !!P.domain
247
+ })
248
+ })] })]
249
+ }),
250
+ /* @__PURE__ */ g(r, {
251
+ title: E("admin.tenants.form.sections.contact", "Contact Information"),
252
+ children: /* @__PURE__ */ _(n, { children: [/* @__PURE__ */ g(y, {
253
+ label: E("admin.tenants.form.fields.ownerEmail", "Owner Email"),
254
+ required: !0,
255
+ error: P.ownerEmail?.message,
256
+ children: /* @__PURE__ */ g(t, {
257
+ type: "email",
258
+ ...j("ownerEmail"),
259
+ placeholder: E("admin.tenants.form.placeholders.ownerEmail", "admin@acme.com"),
260
+ "aria-invalid": !!P.ownerEmail
261
+ })
262
+ }), /* @__PURE__ */ g(y, {
263
+ label: E("admin.tenants.form.fields.billingEmail", "Billing Email"),
264
+ error: P.billingEmail?.message,
265
+ children: /* @__PURE__ */ g(t, {
266
+ type: "email",
267
+ ...j("billingEmail"),
268
+ placeholder: E("admin.tenants.form.placeholders.billingEmail", "billing@acme.com"),
269
+ "aria-invalid": !!P.billingEmail
270
+ })
271
+ })] })
272
+ }),
273
+ /* @__PURE__ */ g(r, {
274
+ title: E("admin.tenants.form.sections.planStatus", "Plan & Status"),
275
+ children: /* @__PURE__ */ _(n, { children: [/* @__PURE__ */ g(y, {
276
+ label: E("admin.tenants.form.fields.plan", "Plan"),
277
+ required: !0,
278
+ children: /* @__PURE__ */ g(b, {
279
+ ...j("plan"),
280
+ options: O
281
+ })
282
+ }), f && /* @__PURE__ */ g(y, {
283
+ label: E("admin.tenants.form.fields.status", "Status"),
284
+ children: /* @__PURE__ */ g(b, {
285
+ ...j("status"),
286
+ options: k
287
+ })
288
+ })] })
289
+ }),
290
+ /* @__PURE__ */ _(r, {
291
+ title: E("admin.tenants.form.sections.settings", "Settings"),
292
+ description: E("admin.tenants.form.descriptions.settings", "Configure tenant security and access settings"),
293
+ children: [/* @__PURE__ */ _("div", {
294
+ className: "space-y-3",
295
+ children: [
296
+ /* @__PURE__ */ g(o, {
297
+ name: "settings.allowSignup",
298
+ control: N,
299
+ render: ({ field: e }) => /* @__PURE__ */ g(x, {
300
+ label: E("admin.tenants.form.settings.allowSignupLabel", "Allow Self-Signup"),
301
+ checked: e.value ?? !0,
302
+ onChange: e.onChange,
303
+ description: E("admin.tenants.form.settings.allowSignupDescription", "Allow users to sign up for this tenant")
304
+ })
305
+ }),
306
+ /* @__PURE__ */ g(o, {
307
+ name: "settings.ssoEnabled",
308
+ control: N,
309
+ render: ({ field: e }) => /* @__PURE__ */ g(x, {
310
+ label: E("admin.tenants.form.settings.ssoEnabledLabel", "Enable SSO"),
311
+ checked: e.value ?? !1,
312
+ onChange: e.onChange,
313
+ description: E("admin.tenants.form.settings.ssoEnabledDescription", "Enable Single Sign-On authentication")
314
+ })
315
+ }),
316
+ /* @__PURE__ */ g(o, {
317
+ name: "settings.mfaRequired",
318
+ control: N,
319
+ render: ({ field: e }) => /* @__PURE__ */ g(x, {
320
+ label: E("admin.tenants.form.settings.mfaRequiredLabel", "Require MFA"),
321
+ checked: e.value ?? !1,
322
+ onChange: e.onChange,
323
+ description: E("admin.tenants.form.settings.mfaRequiredDescription", "Require multi-factor authentication for all users")
324
+ })
325
+ })
326
+ ]
327
+ }), /* @__PURE__ */ g(y, {
328
+ label: E("admin.tenants.form.fields.dataRetentionDays", "Data Retention (days)"),
329
+ error: P.settings?.dataRetentionDays?.message,
330
+ children: /* @__PURE__ */ g(t, {
331
+ type: "number",
332
+ ...j("settings.dataRetentionDays"),
333
+ placeholder: "365",
334
+ min: 30,
335
+ max: 3650
336
+ })
337
+ })]
338
+ })
339
+ ]
340
+ })
341
+ });
342
+ }
343
+ //#endregion
344
+ export { T as TenantForm };
345
+
346
+ //# sourceMappingURL=TenantForm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TenantForm.js","names":[],"sources":["../../../../src/admin/components/forms/TenantForm.tsx"],"sourcesContent":["import * as React from 'react';\nimport { useForm, Controller, type ControllerRenderProps } from 'react-hook-form';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { z } from 'zod';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { FormSheet, FormSheetFooter, FormSection, FormRow } from '../FormSheet';\nimport { Input } from '../ui';\nimport { cn } from '../../utils/cn';\nimport { tWithFallback } from '../../utils/i18n';\nimport type { Tenant } from '../../types';\n\ninterface FormFieldProps {\n label: string;\n error?: string;\n required?: boolean;\n children: React.ReactNode;\n description?: string;\n}\n\nfunction FormField({ label, error, required, children, description }: FormFieldProps) {\n return (\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-medium text-foreground\">\n {label}\n {required && <span className=\"text-destructive ml-0.5\">*</span>}\n </label>\n {children}\n {description && !error && <p className=\"text-xs text-muted-foreground\">{description}</p>}\n {error && <p className=\"text-xs text-destructive\">{error}</p>}\n </div>\n );\n}\n\ninterface SelectFieldProps extends React.SelectHTMLAttributes<HTMLSelectElement> {\n options: { value: string; label: string }[];\n placeholder?: string;\n}\n\nconst SelectField = React.forwardRef<HTMLSelectElement, SelectFieldProps>(\n ({ className, options, placeholder, ...props }, ref) => (\n <select\n ref={ref}\n className={cn(\n 'flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm transition-colors',\n 'focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n className\n )}\n {...props}\n >\n {placeholder && (\n <option value=\"\" disabled>\n {placeholder}\n </option>\n )}\n {options.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n )\n);\nSelectField.displayName = 'SelectField';\n\ninterface CheckboxFieldProps {\n label: string;\n checked: boolean;\n onChange: (checked: boolean) => void;\n description?: string;\n disabled?: boolean;\n}\n\nfunction CheckboxField({ label, checked, onChange, description, disabled }: CheckboxFieldProps) {\n return (\n <label className=\"flex items-start gap-3 cursor-pointer\">\n <input\n type=\"checkbox\"\n checked={checked}\n onChange={(e) => onChange(e.target.checked)}\n disabled={disabled}\n className={cn(\n 'mt-0.5 h-4 w-4 rounded border border-input shadow-sm',\n 'focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n 'checked:bg-primary checked:border-primary'\n )}\n />\n <div className=\"space-y-0.5\">\n <span className=\"text-sm font-medium text-foreground\">{label}</span>\n {description && <p className=\"text-xs text-muted-foreground\">{description}</p>}\n </div>\n </label>\n );\n}\n\nconst PLAN_VALUES = ['Free', 'Starter', 'Professional', 'Enterprise', 'Custom'] as const;\nconst STATUS_VALUES = ['active', 'suspended', 'pending', 'churned'] as const;\n\nfunction buildTenantFormSchema(tr: (key: string, fallback: string) => string) {\n return z.object({\n name: z\n .string()\n .min(2, tr('admin.tenants.form.errors.nameMin', 'Name must be at least 2 characters'))\n .max(100, tr('admin.tenants.form.errors.nameMax', 'Name must be less than 100 characters')),\n slug: z\n .string()\n .min(2, tr('admin.tenants.form.errors.slugMin', 'Slug must be at least 2 characters'))\n .max(50, tr('admin.tenants.form.errors.slugMax', 'Slug must be less than 50 characters'))\n .regex(\n /^[a-z0-9-]+$/,\n tr(\n 'admin.tenants.form.errors.slugPattern',\n 'Slug can only contain lowercase letters, numbers, and hyphens'\n )\n ),\n domain: z.string().optional(),\n ownerEmail: z\n .string()\n .email(tr('admin.tenants.form.errors.emailInvalid', 'Invalid email address')),\n billingEmail: z\n .string()\n .email(tr('admin.tenants.form.errors.emailInvalid', 'Invalid email address'))\n .optional()\n .or(z.literal('')),\n // plan/status accept any string so that an existing tenant with a legacy\n // or backend-only enum value can be edited without the form silently\n // rewriting it to a known value. The <select> options below restrict\n // user-chosen values; preserving the original keeps \"edit unrelated\n // field, save\" from downgrading the plan/status.\n plan: z.string().min(1),\n status: z.string().optional(),\n settings: z\n .object({\n allowSignup: z.boolean(),\n ssoEnabled: z.boolean(),\n mfaRequired: z.boolean(),\n dataRetentionDays: z.coerce.number().int().min(30).max(3650),\n })\n .optional(),\n });\n}\n\ntype TenantFormData = z.infer<ReturnType<typeof buildTenantFormSchema>>;\n\nexport interface TenantFormProps {\n open: boolean;\n onClose: () => void;\n tenant?: Tenant;\n onSave: (data: TenantFormData & { id?: string }) => Promise<void>;\n}\n\nexport function TenantForm({ open, onClose, tenant, onSave }: TenantFormProps) {\n const isEditing = !!tenant;\n const formId = 'tenant-form';\n const { t } = useI18n();\n const tr = React.useCallback(\n (key: string, fallback: string, params?: Record<string, string | number>): string =>\n tWithFallback(t, key, fallback, params),\n [t]\n );\n\n const tenantFormSchema = React.useMemo(() => buildTenantFormSchema(tr), [tr]);\n\n const planOptions = React.useMemo(() => {\n const base = [\n { value: 'Free', label: tr('admin.tenants.form.plans.free', 'Free') },\n { value: 'Starter', label: tr('admin.tenants.form.plans.starter', 'Starter') },\n {\n value: 'Professional',\n label: tr('admin.tenants.form.plans.professional', 'Professional'),\n },\n { value: 'Enterprise', label: tr('admin.tenants.form.plans.enterprise', 'Enterprise') },\n { value: 'Custom', label: tr('admin.tenants.form.plans.custom', 'Custom') },\n ];\n // If the current tenant carries a plan outside PLAN_VALUES (legacy data\n // or a backend-introduced tier the UI doesn't know yet), surface it as\n // a synthetic option so the user can see what's persisted and either\n // keep it or pick a known plan. Without this the <select> would render\n // blank for an out-of-range value.\n if (tenant?.plan && !(PLAN_VALUES as readonly string[]).includes(tenant.plan)) {\n base.push({\n value: tenant.plan,\n label: tr('admin.tenants.form.plans.legacy', '{{plan}} (legacy)', { plan: tenant.plan }),\n });\n }\n return base;\n }, [tr, tenant?.plan]);\n\n const statusOptions = React.useMemo(() => {\n const base = [\n { value: 'active', label: tr('admin.tenants.form.statuses.active', 'Active') },\n { value: 'suspended', label: tr('admin.tenants.form.statuses.suspended', 'Suspended') },\n { value: 'pending', label: tr('admin.tenants.form.statuses.pending', 'Pending') },\n { value: 'churned', label: tr('admin.tenants.form.statuses.churned', 'Churned') },\n ];\n // Same logic as plan — Tenant['status'] includes 'deleted', 'trial',\n // 'provisioning' (see mappers.ts) which STATUS_VALUES doesn't list.\n // Surface unknown values as a synthetic option so editing an unrelated\n // field doesn't reset status to a wrong value on submit.\n if (tenant?.status && !(STATUS_VALUES as readonly string[]).includes(tenant.status)) {\n base.push({\n value: tenant.status,\n label: tr('admin.tenants.form.statuses.other', '{{status}} (read-only)', {\n status: tenant.status,\n }),\n });\n }\n return base;\n }, [tr, tenant?.status]);\n\n const defaultValues = React.useMemo<TenantFormData>(\n () => ({\n name: tenant?.name ?? '',\n slug: tenant?.slug ?? '',\n domain: tenant?.domain ?? '',\n ownerEmail: tenant?.ownerEmail ?? '',\n billingEmail: tenant?.billingEmail ?? '',\n // Preserve the original plan/status verbatim — even if the backend\n // value is outside the known set. planOptions/statusOptions surface\n // a synthetic \"legacy\" entry so the select can render the current\n // value, and the user can choose to keep it (save preserves) or pick\n // a known value. Coercing to a default here would silently downgrade\n // the tenant on any unrelated edit.\n plan: tenant?.plan ?? 'Free',\n status: tenant?.status,\n settings: {\n allowSignup: tenant?.settings?.allowSignup ?? true,\n ssoEnabled: tenant?.settings?.ssoEnabled ?? false,\n mfaRequired: tenant?.settings?.mfaRequired ?? false,\n dataRetentionDays: tenant?.settings?.dataRetentionDays ?? 365,\n },\n }),\n [tenant]\n );\n\n const {\n register,\n handleSubmit,\n control,\n formState: { errors, isSubmitting },\n reset,\n watch,\n setValue,\n } = useForm<TenantFormData>({\n resolver: zodResolver(tenantFormSchema),\n defaultValues,\n });\n\n // Reset only when the form transitions from closed→open or the entity id\n // changes. Avoids wiping in-progress edits when `cache-and-network` Apollo\n // refetches re-render the parent with a new `tenant` object identity but\n // the user has already typed into the form. Using `defaultValues` in the\n // dep array would re-fire on every refetch and discard those edits.\n const lastResetKey = React.useRef<string | null>(null);\n React.useEffect(() => {\n if (!open) {\n lastResetKey.current = null;\n return;\n }\n const key = tenant?.id ?? '__create__';\n if (lastResetKey.current !== key) {\n reset(defaultValues);\n lastResetKey.current = key;\n }\n }, [open, tenant?.id, reset, defaultValues]);\n\n const onSubmit = async (data: TenantFormData) => {\n try {\n await onSave({ ...data, id: tenant?.id });\n onClose();\n } catch (error) {\n console.error('Failed to save tenant:', error);\n }\n };\n\n const name = watch('name');\n const currentSlug = watch('slug');\n React.useEffect(() => {\n if (!isEditing && name && !currentSlug) {\n const slug = name\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '-')\n .replace(/^-|-$/g, '');\n setValue('slug', slug);\n }\n }, [name, isEditing, setValue, currentSlug]);\n\n const titleEdit = tr('admin.tenants.form.titleEdit', 'Edit Tenant');\n const titleCreate = tr('admin.tenants.form.titleCreate', 'Create Tenant');\n const submitEdit = tr('admin.tenants.form.submitEdit', 'Save Changes');\n const submitCreate = tr('admin.tenants.form.submitCreate', 'Create Tenant');\n\n return (\n <FormSheet\n open={open}\n onClose={onClose}\n title={isEditing ? titleEdit : titleCreate}\n description={\n isEditing\n ? tr('admin.tenants.form.descriptionEdit', 'Editing {{name}}', {\n name: tenant?.name ?? '',\n })\n : tr('admin.tenants.form.descriptionCreate', 'Add a new tenant to the platform')\n }\n width=\"lg\"\n footer={\n <FormSheetFooter\n formId={formId}\n submitLabel={isEditing ? submitEdit : submitCreate}\n onCancel={onClose}\n isSubmitting={isSubmitting}\n />\n }\n >\n <form id={formId} onSubmit={handleSubmit(onSubmit)} className=\"space-y-6\">\n <FormSection title={tr('admin.tenants.form.sections.basic', 'Basic Information')}>\n <FormField\n label={tr('admin.tenants.form.fields.name', 'Tenant Name')}\n required\n error={errors.name?.message}\n >\n <Input\n {...register('name')}\n placeholder={tr('admin.tenants.form.placeholders.name', 'Acme Corporation')}\n aria-invalid={!!errors.name}\n />\n </FormField>\n\n <FormRow>\n <FormField\n label={tr('admin.tenants.form.fields.slug', 'Slug')}\n required\n error={errors.slug?.message}\n description={\n isEditing\n ? tr(\n 'admin.tenants.form.descriptions.slugImmutable',\n 'Slug is set at creation and cannot be changed.'\n )\n : tr('admin.tenants.form.descriptions.slug', 'URL-friendly identifier')\n }\n >\n <Input\n {...register('slug')}\n placeholder={tr('admin.tenants.form.placeholders.slug', 'acme-corp')}\n aria-invalid={!!errors.slug}\n // Slug is part of CreateTenantInput only — UpdateTenantInput\n // has no slug field. Disabling on edit prevents the user from\n // editing a value that would be silently discarded on save.\n disabled={isEditing}\n readOnly={isEditing}\n />\n </FormField>\n\n <FormField\n label={tr('admin.tenants.form.fields.domain', 'Domain')}\n error={errors.domain?.message}\n >\n <Input\n {...register('domain')}\n placeholder={tr('admin.tenants.form.placeholders.domain', 'acme.com')}\n aria-invalid={!!errors.domain}\n />\n </FormField>\n </FormRow>\n </FormSection>\n\n <FormSection title={tr('admin.tenants.form.sections.contact', 'Contact Information')}>\n <FormRow>\n <FormField\n label={tr('admin.tenants.form.fields.ownerEmail', 'Owner Email')}\n required\n error={errors.ownerEmail?.message}\n >\n <Input\n type=\"email\"\n {...register('ownerEmail')}\n placeholder={tr('admin.tenants.form.placeholders.ownerEmail', 'admin@acme.com')}\n aria-invalid={!!errors.ownerEmail}\n />\n </FormField>\n\n <FormField\n label={tr('admin.tenants.form.fields.billingEmail', 'Billing Email')}\n error={errors.billingEmail?.message}\n >\n <Input\n type=\"email\"\n {...register('billingEmail')}\n placeholder={tr('admin.tenants.form.placeholders.billingEmail', 'billing@acme.com')}\n aria-invalid={!!errors.billingEmail}\n />\n </FormField>\n </FormRow>\n </FormSection>\n\n <FormSection title={tr('admin.tenants.form.sections.planStatus', 'Plan & Status')}>\n <FormRow>\n <FormField label={tr('admin.tenants.form.fields.plan', 'Plan')} required>\n <SelectField {...register('plan')} options={planOptions} />\n </FormField>\n\n {isEditing && (\n <FormField label={tr('admin.tenants.form.fields.status', 'Status')}>\n <SelectField {...register('status')} options={statusOptions} />\n </FormField>\n )}\n </FormRow>\n </FormSection>\n\n <FormSection\n title={tr('admin.tenants.form.sections.settings', 'Settings')}\n description={tr(\n 'admin.tenants.form.descriptions.settings',\n 'Configure tenant security and access settings'\n )}\n >\n <div className=\"space-y-3\">\n <Controller\n name=\"settings.allowSignup\"\n control={control}\n render={({\n field,\n }: {\n field: ControllerRenderProps<TenantFormData, 'settings.allowSignup'>;\n }) => (\n <CheckboxField\n label={tr('admin.tenants.form.settings.allowSignupLabel', 'Allow Self-Signup')}\n checked={field.value ?? true}\n onChange={field.onChange}\n description={tr(\n 'admin.tenants.form.settings.allowSignupDescription',\n 'Allow users to sign up for this tenant'\n )}\n />\n )}\n />\n\n <Controller\n name=\"settings.ssoEnabled\"\n control={control}\n render={({\n field,\n }: {\n field: ControllerRenderProps<TenantFormData, 'settings.ssoEnabled'>;\n }) => (\n <CheckboxField\n label={tr('admin.tenants.form.settings.ssoEnabledLabel', 'Enable SSO')}\n checked={field.value ?? false}\n onChange={field.onChange}\n description={tr(\n 'admin.tenants.form.settings.ssoEnabledDescription',\n 'Enable Single Sign-On authentication'\n )}\n />\n )}\n />\n\n <Controller\n name=\"settings.mfaRequired\"\n control={control}\n render={({\n field,\n }: {\n field: ControllerRenderProps<TenantFormData, 'settings.mfaRequired'>;\n }) => (\n <CheckboxField\n label={tr('admin.tenants.form.settings.mfaRequiredLabel', 'Require MFA')}\n checked={field.value ?? false}\n onChange={field.onChange}\n description={tr(\n 'admin.tenants.form.settings.mfaRequiredDescription',\n 'Require multi-factor authentication for all users'\n )}\n />\n )}\n />\n </div>\n\n <FormField\n label={tr('admin.tenants.form.fields.dataRetentionDays', 'Data Retention (days)')}\n error={errors.settings?.dataRetentionDays?.message}\n >\n <Input\n type=\"number\"\n {...register('settings.dataRetentionDays')}\n placeholder=\"365\"\n min={30}\n max={3650}\n />\n </FormField>\n </FormSection>\n </form>\n </FormSheet>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,67 @@
1
+ import { z } from 'zod';
2
+ import { SupportTicket } from '../../types';
3
+
4
+ declare const ticketFormSchema: z.ZodObject<{
5
+ subject: z.ZodString;
6
+ description: z.ZodString;
7
+ category: z.ZodEnum<["billing", "technical", "account", "feature_request", "other"]>;
8
+ priority: z.ZodEnum<["low", "medium", "high", "urgent"]>;
9
+ status: z.ZodOptional<z.ZodEnum<["open", "in_progress", "waiting", "resolved", "closed"]>>;
10
+ tenantId: z.ZodOptional<z.ZodString>;
11
+ userId: z.ZodOptional<z.ZodString>;
12
+ assigneeId: z.ZodOptional<z.ZodString>;
13
+ }, "strip", z.ZodTypeAny, {
14
+ description: string;
15
+ priority: "low" | "medium" | "high" | "urgent";
16
+ category: "billing" | "technical" | "account" | "feature_request" | "other";
17
+ subject: string;
18
+ status?: "open" | "in_progress" | "resolved" | "closed" | "waiting" | undefined;
19
+ tenantId?: string | undefined;
20
+ userId?: string | undefined;
21
+ assigneeId?: string | undefined;
22
+ }, {
23
+ description: string;
24
+ priority: "low" | "medium" | "high" | "urgent";
25
+ category: "billing" | "technical" | "account" | "feature_request" | "other";
26
+ subject: string;
27
+ status?: "open" | "in_progress" | "resolved" | "closed" | "waiting" | undefined;
28
+ tenantId?: string | undefined;
29
+ userId?: string | undefined;
30
+ assigneeId?: string | undefined;
31
+ }>;
32
+ type TicketFormData = z.infer<typeof ticketFormSchema>;
33
+ /**
34
+ * TicketForm props
35
+ */
36
+ export interface TicketFormProps {
37
+ /** Whether the form is open */
38
+ open: boolean;
39
+ /** Callback when the form should close */
40
+ onClose: () => void;
41
+ /** Existing ticket data for editing (undefined for create) */
42
+ ticket?: SupportTicket;
43
+ /** Pre-selected tenant ID */
44
+ tenantId?: string;
45
+ /** Pre-selected user ID */
46
+ userId?: string;
47
+ /** List of available tenants for selection */
48
+ tenants?: {
49
+ id: string;
50
+ name: string;
51
+ }[];
52
+ /** List of available assignees */
53
+ assignees?: {
54
+ id: string;
55
+ name: string;
56
+ }[];
57
+ /** Callback on successful save */
58
+ onSave: (data: TicketFormData & {
59
+ id?: string;
60
+ }) => Promise<void>;
61
+ }
62
+ /**
63
+ * TicketForm - Create/Edit support ticket form in a slide-over panel
64
+ */
65
+ export declare function TicketForm({ open, onClose, ticket, tenantId, userId, tenants, assignees, onSave, }: TicketFormProps): import("react/jsx-runtime").JSX.Element;
66
+ export {};
67
+ //# sourceMappingURL=TicketForm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TicketForm.d.ts","sourceRoot":"","sources":["../../../../src/admin/components/forms/TicketForm.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAkFjD,QAAA,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;EAepB,CAAC;AAEH,KAAK,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAEvD;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,+BAA+B;IAC/B,IAAI,EAAE,OAAO,CAAC;IACd,0CAA0C;IAC1C,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,8DAA8D;IAC9D,MAAM,CAAC,EAAE,aAAa,CAAC;IACvB,6BAA6B;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,2BAA2B;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,8CAA8C;IAC9C,OAAO,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACzC,kCAAkC;IAClC,SAAS,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC3C,kCAAkC;IAClC,MAAM,EAAE,CAAC,IAAI,EAAE,cAAc,GAAG;QAAE,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACnE;AAyBD;;GAEG;AACH,wBAAgB,UAAU,CAAC,EACzB,IAAI,EACJ,OAAO,EACP,MAAM,EACN,QAAQ,EACR,MAAM,EACN,OAAY,EACZ,SAAc,EACd,MAAM,GACP,EAAE,eAAe,2CA8IjB"}
@@ -0,0 +1,55 @@
1
+ import { cn as e } from "../../utils/cn.js";
2
+ import "../ui.js";
3
+ import "../FormSheet.js";
4
+ import { enumType as t, objectType as n, stringType as r } from "../../../node_modules/zod/v3/types.js";
5
+ import * as i from "react";
6
+ import { jsx as a, jsxs as o } from "react/jsx-runtime";
7
+ //#region src/admin/components/forms/TicketForm.tsx
8
+ var s = i.forwardRef(({ className: t, options: n, placeholder: r, ...i }, s) => /* @__PURE__ */ o("select", {
9
+ ref: s,
10
+ className: e("flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm transition-colors", "focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring", "disabled:cursor-not-allowed disabled:opacity-50", t),
11
+ ...i,
12
+ children: [r && /* @__PURE__ */ a("option", {
13
+ value: "",
14
+ children: r
15
+ }), n.map((e) => /* @__PURE__ */ a("option", {
16
+ value: e.value,
17
+ children: e.label
18
+ }, e.value))]
19
+ }));
20
+ s.displayName = "SelectField";
21
+ var c = i.forwardRef(({ className: t, ...n }, r) => /* @__PURE__ */ a("textarea", {
22
+ ref: r,
23
+ className: e("flex min-h-[120px] w-full rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-sm transition-colors", "placeholder:text-muted-foreground", "focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring", "disabled:cursor-not-allowed disabled:opacity-50", "resize-none", t),
24
+ ...n
25
+ }));
26
+ c.displayName = "TextareaField", n({
27
+ subject: r().min(5, "Subject must be at least 5 characters").max(200, "Subject must be less than 200 characters"),
28
+ description: r().min(10, "Description must be at least 10 characters").max(5e3, "Description must be less than 5000 characters"),
29
+ category: t([
30
+ "billing",
31
+ "technical",
32
+ "account",
33
+ "feature_request",
34
+ "other"
35
+ ]),
36
+ priority: t([
37
+ "low",
38
+ "medium",
39
+ "high",
40
+ "urgent"
41
+ ]),
42
+ status: t([
43
+ "open",
44
+ "in_progress",
45
+ "waiting",
46
+ "resolved",
47
+ "closed"
48
+ ]).optional(),
49
+ tenantId: r().optional(),
50
+ userId: r().optional(),
51
+ assigneeId: r().optional()
52
+ });
53
+ //#endregion
54
+
55
+ //# sourceMappingURL=TicketForm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"TicketForm.js","names":[],"sources":["../../../../src/admin/components/forms/TicketForm.tsx"],"sourcesContent":["import * as React from 'react';\nimport { useForm } from 'react-hook-form';\nimport { zodResolver } from '@hookform/resolvers/zod';\nimport { z } from 'zod';\nimport { FormSheet, FormSheetFooter, FormSection, FormRow } from '../FormSheet';\nimport { Input } from '../ui';\nimport { cn } from '../../utils/cn';\nimport type { SupportTicket } from '../../types';\n\n/**\n * Form field wrapper with label and error\n */\ninterface FormFieldProps {\n label: string;\n error?: string;\n required?: boolean;\n children: React.ReactNode;\n description?: string;\n}\n\nfunction FormField({ label, error, required, children, description }: FormFieldProps) {\n return (\n <div className=\"space-y-1.5\">\n <label className=\"text-sm font-medium text-foreground\">\n {label}\n {required && <span className=\"text-destructive ml-0.5\">*</span>}\n </label>\n {children}\n {description && !error && <p className=\"text-xs text-muted-foreground\">{description}</p>}\n {error && <p className=\"text-xs text-destructive\">{error}</p>}\n </div>\n );\n}\n\n/**\n * Select wrapper styled like Input\n */\ninterface SelectFieldProps extends React.SelectHTMLAttributes<HTMLSelectElement> {\n options: { value: string; label: string }[];\n placeholder?: string;\n}\n\nconst SelectField = React.forwardRef<HTMLSelectElement, SelectFieldProps>(\n ({ className, options, placeholder, ...props }, ref) => (\n <select\n ref={ref}\n className={cn(\n 'flex h-9 w-full rounded-md border border-input bg-transparent px-3 py-1 text-sm shadow-sm transition-colors',\n 'focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n className\n )}\n {...props}\n >\n {placeholder && <option value=\"\">{placeholder}</option>}\n {options.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n )\n);\nSelectField.displayName = 'SelectField';\n\n/**\n * Textarea wrapper styled like Input\n */\ntype TextareaFieldProps = React.TextareaHTMLAttributes<HTMLTextAreaElement>;\n\nconst TextareaField = React.forwardRef<HTMLTextAreaElement, TextareaFieldProps>(\n ({ className, ...props }, ref) => (\n <textarea\n ref={ref}\n className={cn(\n 'flex min-h-[120px] w-full rounded-md border border-input bg-transparent px-3 py-2 text-sm shadow-sm transition-colors',\n 'placeholder:text-muted-foreground',\n 'focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n 'resize-none',\n className\n )}\n {...props}\n />\n )\n);\nTextareaField.displayName = 'TextareaField';\n\n// Unified form schema\nconst ticketFormSchema = z.object({\n subject: z\n .string()\n .min(5, 'Subject must be at least 5 characters')\n .max(200, 'Subject must be less than 200 characters'),\n description: z\n .string()\n .min(10, 'Description must be at least 10 characters')\n .max(5000, 'Description must be less than 5000 characters'),\n category: z.enum(['billing', 'technical', 'account', 'feature_request', 'other']),\n priority: z.enum(['low', 'medium', 'high', 'urgent']),\n status: z.enum(['open', 'in_progress', 'waiting', 'resolved', 'closed']).optional(),\n tenantId: z.string().optional(),\n userId: z.string().optional(),\n assigneeId: z.string().optional(),\n});\n\ntype TicketFormData = z.infer<typeof ticketFormSchema>;\n\n/**\n * TicketForm props\n */\nexport interface TicketFormProps {\n /** Whether the form is open */\n open: boolean;\n /** Callback when the form should close */\n onClose: () => void;\n /** Existing ticket data for editing (undefined for create) */\n ticket?: SupportTicket;\n /** Pre-selected tenant ID */\n tenantId?: string;\n /** Pre-selected user ID */\n userId?: string;\n /** List of available tenants for selection */\n tenants?: { id: string; name: string }[];\n /** List of available assignees */\n assignees?: { id: string; name: string }[];\n /** Callback on successful save */\n onSave: (data: TicketFormData & { id?: string }) => Promise<void>;\n}\n\nconst categoryOptions = [\n { value: 'billing', label: 'Billing' },\n { value: 'technical', label: 'Technical' },\n { value: 'account', label: 'Account' },\n { value: 'feature_request', label: 'Feature Request' },\n { value: 'other', label: 'Other' },\n];\n\nconst priorityOptions = [\n { value: 'low', label: 'Low' },\n { value: 'medium', label: 'Medium' },\n { value: 'high', label: 'High' },\n { value: 'urgent', label: 'Urgent' },\n];\n\nconst statusOptions = [\n { value: 'open', label: 'Open' },\n { value: 'in_progress', label: 'In Progress' },\n { value: 'waiting', label: 'Waiting on Customer' },\n { value: 'resolved', label: 'Resolved' },\n { value: 'closed', label: 'Closed' },\n];\n\n/**\n * TicketForm - Create/Edit support ticket form in a slide-over panel\n */\nexport function TicketForm({\n open,\n onClose,\n ticket,\n tenantId,\n userId,\n tenants = [],\n assignees = [],\n onSave,\n}: TicketFormProps) {\n const isEditing = !!ticket;\n const formId = 'ticket-form';\n\n const defaultValues: TicketFormData = {\n subject: ticket?.subject ?? '',\n description: ticket?.description ?? '',\n category: (ticket?.category ?? 'other') as TicketFormData['category'],\n priority: (ticket?.priority ?? 'medium') as TicketFormData['priority'],\n status: ticket?.status as TicketFormData['status'],\n tenantId: ticket?.tenantId ?? tenantId ?? '',\n userId: ticket?.userId ?? userId ?? '',\n assigneeId: ticket?.assigneeId ?? '',\n };\n\n const {\n register,\n handleSubmit,\n formState: { errors, isSubmitting },\n reset,\n } = useForm<TicketFormData>({\n resolver: zodResolver(ticketFormSchema),\n defaultValues,\n });\n\n // Reset form when ticket changes\n React.useEffect(() => {\n if (open) {\n reset(defaultValues);\n }\n }, [open, ticket?.id, tenantId, userId]);\n\n const onSubmit = async (data: TicketFormData) => {\n try {\n await onSave({ ...data, id: ticket?.id });\n onClose();\n } catch (error) {\n console.error('Failed to save ticket:', error);\n }\n };\n\n return (\n <FormSheet\n open={open}\n onClose={onClose}\n title={isEditing ? 'Edit Ticket' : 'Create Support Ticket'}\n description={\n isEditing ? `Editing ticket #${ticket.id.slice(0, 8)}` : 'Create a new support ticket'\n }\n width=\"lg\"\n footer={\n <FormSheetFooter\n formId={formId}\n submitLabel={isEditing ? 'Save Changes' : 'Create Ticket'}\n onCancel={onClose}\n isSubmitting={isSubmitting}\n />\n }\n >\n <form id={formId} onSubmit={handleSubmit(onSubmit)} className=\"space-y-6\">\n {/* Subject */}\n <FormSection>\n <FormField\n label=\"Subject\"\n required\n error={errors.subject?.message}\n description=\"Brief summary of the issue\"\n >\n <Input\n {...register('subject')}\n placeholder=\"e.g., Unable to access billing page\"\n aria-invalid={!!errors.subject}\n />\n </FormField>\n </FormSection>\n\n {/* Category & Priority */}\n <FormSection title=\"Classification\">\n <FormRow>\n <FormField label=\"Category\" required>\n <SelectField {...register('category')} options={categoryOptions} />\n </FormField>\n\n <FormField label=\"Priority\" required>\n <SelectField {...register('priority')} options={priorityOptions} />\n </FormField>\n </FormRow>\n\n {isEditing && (\n <FormRow>\n <FormField label=\"Status\">\n <SelectField {...register('status')} options={statusOptions} />\n </FormField>\n\n {assignees.length > 0 && (\n <FormField label=\"Assignee\">\n <SelectField\n {...register('assigneeId')}\n options={assignees.map((a) => ({ value: a.id, label: a.name }))}\n placeholder=\"Unassigned\"\n />\n </FormField>\n )}\n </FormRow>\n )}\n </FormSection>\n\n {/* Description */}\n <FormSection title=\"Details\">\n <FormField\n label=\"Description\"\n required\n error={errors.description?.message}\n description=\"Provide as much detail as possible\"\n >\n <TextareaField\n {...register('description')}\n placeholder=\"Describe the issue in detail. Include steps to reproduce if applicable...\"\n aria-invalid={!!errors.description}\n rows={6}\n />\n </FormField>\n </FormSection>\n\n {/* Context (Tenant/User) */}\n {tenants.length > 0 && (\n <FormSection title=\"Context\">\n <FormField\n label=\"Related Tenant\"\n description=\"Associate this ticket with a specific tenant\"\n >\n <SelectField\n {...register('tenantId')}\n options={tenants.map((t) => ({ value: t.id, label: t.name }))}\n placeholder=\"Select a tenant (optional)\"\n />\n </FormField>\n </FormSection>\n )}\n </form>\n </FormSheet>\n );\n}\n"],"mappings":";;;;;;;AA0CA,IAAM,IAAc,EAAM,YACvB,EAAE,cAAW,YAAS,gBAAa,GAAG,KAAS,MAC9C,kBAAC,UAAD;CACO;CACL,WAAW,EACT,+GACA,2EACA,mDACA,EACD;CACD,GAAI;WARN,CAUG,KAAe,kBAAC,UAAD;EAAQ,OAAM;YAAI;EAAqB,CAAA,EACtD,EAAQ,KAAK,MACZ,kBAAC,UAAD;EAAwB,OAAO,EAAI;YAChC,EAAI;EACE,EAFI,EAAI,MAER,CACT,CACK;GAEZ;AACD,EAAY,cAAc;AAO1B,IAAM,IAAgB,EAAM,YACzB,EAAE,cAAW,GAAG,KAAS,MACxB,kBAAC,YAAD;CACO;CACL,WAAW,EACT,yHACA,qCACA,2EACA,mDACA,eACA,EACD;CACD,GAAI;CACJ,CAAA,CAEL;AACD,EAAc,cAAc,iBAGH,EAAS;CAChC,SAAS,GACE,CACR,IAAI,GAAG,wCAAwC,CAC/C,IAAI,KAAK,2CAA2C;CACvD,aAAa,GACF,CACR,IAAI,IAAI,6CAA6C,CACrD,IAAI,KAAM,gDAAgD;CAC7D,UAAU,EAAO;EAAC;EAAW;EAAa;EAAW;EAAmB;EAAQ,CAAC;CACjF,UAAU,EAAO;EAAC;EAAO;EAAU;EAAQ;EAAS,CAAC;CACrD,QAAQ,EAAO;EAAC;EAAQ;EAAe;EAAW;EAAY;EAAS,CAAC,CAAC,UAAU;CACnF,UAAU,GAAU,CAAC,UAAU;CAC/B,QAAQ,GAAU,CAAC,UAAU;CAC7B,YAAY,GAAU,CAAC,UAAU;CAClC,CAAC"}
@@ -0,0 +1,57 @@
1
+ import { z } from 'zod';
2
+ import { User } from '../../types';
3
+
4
+ declare const userFormSchema: z.ZodObject<{
5
+ email: z.ZodString;
6
+ firstName: z.ZodString;
7
+ lastName: z.ZodString;
8
+ role: z.ZodEnum<["admin", "member", "viewer", "owner"]>;
9
+ status: z.ZodOptional<z.ZodEnum<["active", "inactive", "pending", "suspended"]>>;
10
+ tenantId: z.ZodOptional<z.ZodString>;
11
+ sendInvite: z.ZodBoolean;
12
+ }, "strip", z.ZodTypeAny, {
13
+ email: string;
14
+ role: "admin" | "member" | "viewer" | "owner";
15
+ firstName: string;
16
+ lastName: string;
17
+ sendInvite: boolean;
18
+ status?: "active" | "suspended" | "pending" | "inactive" | undefined;
19
+ tenantId?: string | undefined;
20
+ }, {
21
+ email: string;
22
+ role: "admin" | "member" | "viewer" | "owner";
23
+ firstName: string;
24
+ lastName: string;
25
+ sendInvite: boolean;
26
+ status?: "active" | "suspended" | "pending" | "inactive" | undefined;
27
+ tenantId?: string | undefined;
28
+ }>;
29
+ type UserFormData = z.infer<typeof userFormSchema>;
30
+ /**
31
+ * UserForm props
32
+ */
33
+ export interface UserFormProps {
34
+ /** Whether the form is open */
35
+ open: boolean;
36
+ /** Callback when the form should close */
37
+ onClose: () => void;
38
+ /** Existing user data for editing (undefined for create) */
39
+ user?: User;
40
+ /** Pre-selected tenant ID */
41
+ tenantId?: string;
42
+ /** List of available tenants for selection */
43
+ tenants?: {
44
+ id: string;
45
+ name: string;
46
+ }[];
47
+ /** Callback on successful save */
48
+ onSave: (data: UserFormData & {
49
+ id?: string;
50
+ }) => Promise<void>;
51
+ }
52
+ /**
53
+ * UserForm - Create/Edit user form in a slide-over panel
54
+ */
55
+ export declare function UserForm({ open, onClose, user, tenantId, tenants, onSave }: UserFormProps): import("react/jsx-runtime").JSX.Element;
56
+ export {};
57
+ //# sourceMappingURL=UserForm.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"UserForm.d.ts","sourceRoot":"","sources":["../../../../src/admin/components/forms/UserForm.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAIxB,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAiGxC,QAAA,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;EAclB,CAAC;AAEH,KAAK,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC;AAEnD;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,+BAA+B;IAC/B,IAAI,EAAE,OAAO,CAAC;IACd,0CAA0C;IAC1C,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,4DAA4D;IAC5D,IAAI,CAAC,EAAE,IAAI,CAAC;IACZ,6BAA6B;IAC7B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8CAA8C;IAC9C,OAAO,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACzC,kCAAkC;IAClC,MAAM,EAAE,CAAC,IAAI,EAAE,YAAY,GAAG;QAAE,EAAE,CAAC,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACjE;AAgBD;;GAEG;AACH,wBAAgB,QAAQ,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAY,EAAE,MAAM,EAAE,EAAE,aAAa,2CA0I9F"}