@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,90 @@
1
+ //#region src/admin/constants/index.ts
2
+ var e = {
3
+ active: {
4
+ label: "Active",
5
+ color: "bg-success/10 text-success border-success/20"
6
+ },
7
+ suspended: {
8
+ label: "Suspended",
9
+ color: "bg-destructive/10 text-destructive border-destructive/20"
10
+ },
11
+ trial: {
12
+ label: "Trial",
13
+ color: "bg-warning/10 text-warning border-warning/20"
14
+ },
15
+ deleted: {
16
+ label: "Deleted",
17
+ color: "bg-muted text-muted-foreground border-muted"
18
+ },
19
+ pending: {
20
+ label: "Pending",
21
+ color: "bg-info/10 text-info border-info/20"
22
+ },
23
+ provisioning: {
24
+ label: "Provisioning",
25
+ color: "bg-amber-100 text-amber-700 border-amber-200"
26
+ }
27
+ }, t = {
28
+ active: {
29
+ label: "Active",
30
+ color: "bg-success/10 text-success border-success/20"
31
+ },
32
+ inactive: {
33
+ label: "Inactive",
34
+ color: "bg-muted text-muted-foreground border-muted"
35
+ },
36
+ blocked: {
37
+ label: "Blocked",
38
+ color: "bg-destructive/10 text-destructive border-destructive/20"
39
+ },
40
+ pending: {
41
+ label: "Pending",
42
+ color: "bg-warning/10 text-warning border-warning/20"
43
+ }
44
+ }, n = {
45
+ healthy: {
46
+ label: "Healthy",
47
+ color: "bg-success/10 text-success border-success/20"
48
+ },
49
+ degraded: {
50
+ label: "Degraded",
51
+ color: "bg-warning/10 text-warning border-warning/20"
52
+ },
53
+ down: {
54
+ label: "Down",
55
+ color: "bg-destructive/10 text-destructive border-destructive/20"
56
+ },
57
+ unknown: {
58
+ label: "Unknown",
59
+ color: "bg-muted text-muted-foreground border-muted"
60
+ }
61
+ }, r = {
62
+ pending: {
63
+ label: "Pending",
64
+ color: "bg-muted text-muted-foreground border-muted"
65
+ },
66
+ running: {
67
+ label: "Running",
68
+ color: "bg-info/10 text-info border-info/20"
69
+ },
70
+ in_progress: {
71
+ label: "In Progress",
72
+ color: "bg-info/10 text-info border-info/20"
73
+ },
74
+ success: {
75
+ label: "Success",
76
+ color: "bg-success/10 text-success border-success/20"
77
+ },
78
+ failed: {
79
+ label: "Failed",
80
+ color: "bg-destructive/10 text-destructive border-destructive/20"
81
+ },
82
+ rolled_back: {
83
+ label: "Rolled Back",
84
+ color: "bg-warning/10 text-warning border-warning/20"
85
+ }
86
+ };
87
+ //#endregion
88
+ export { r as DEPLOYMENT_STATUS_CONFIG, n as HEALTH_STATUS_CONFIG, e as TENANT_STATUS_CONFIG, t as USER_STATUS_CONFIG };
89
+
90
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../src/admin/constants/index.ts"],"sourcesContent":["import type {\n TenantStatus,\n UserStatus,\n SubscriptionStatus,\n TicketStatus,\n TicketPriority,\n HealthStatus,\n DeploymentStatus,\n CloudProvider,\n} from '../types';\n\n/**\n * Tenant status labels and colors\n */\nexport const TENANT_STATUS_CONFIG: Record<TenantStatus, { label: string; color: string }> = {\n active: { label: 'Active', color: 'bg-success/10 text-success border-success/20' },\n suspended: {\n label: 'Suspended',\n color: 'bg-destructive/10 text-destructive border-destructive/20',\n },\n trial: { label: 'Trial', color: 'bg-warning/10 text-warning border-warning/20' },\n deleted: { label: 'Deleted', color: 'bg-muted text-muted-foreground border-muted' },\n pending: { label: 'Pending', color: 'bg-info/10 text-info border-info/20' },\n provisioning: { label: 'Provisioning', color: 'bg-amber-100 text-amber-700 border-amber-200' },\n};\n\n/**\n * User status labels and colors\n */\nexport const USER_STATUS_CONFIG: Record<UserStatus, { label: string; color: string }> = {\n active: { label: 'Active', color: 'bg-success/10 text-success border-success/20' },\n inactive: { label: 'Inactive', color: 'bg-muted text-muted-foreground border-muted' },\n blocked: { label: 'Blocked', color: 'bg-destructive/10 text-destructive border-destructive/20' },\n pending: { label: 'Pending', color: 'bg-warning/10 text-warning border-warning/20' },\n};\n\n/**\n * Subscription status labels and colors\n */\nexport const SUBSCRIPTION_STATUS_CONFIG: Record<\n SubscriptionStatus,\n { label: string; color: string }\n> = {\n active: { label: 'Active', color: 'bg-success/10 text-success border-success/20' },\n canceled: { label: 'Canceled', color: 'bg-muted text-muted-foreground border-muted' },\n past_due: {\n label: 'Past Due',\n color: 'bg-destructive/10 text-destructive border-destructive/20',\n },\n trialing: { label: 'Trialing', color: 'bg-info/10 text-info border-info/20' },\n paused: { label: 'Paused', color: 'bg-warning/10 text-warning border-warning/20' },\n};\n\n/**\n * Ticket status labels and colors\n */\nexport const TICKET_STATUS_CONFIG: Record<TicketStatus, { label: string; color: string }> = {\n open: { label: 'Open', color: 'bg-info/10 text-info border-info/20' },\n in_progress: { label: 'In Progress', color: 'bg-warning/10 text-warning border-warning/20' },\n resolved: { label: 'Resolved', color: 'bg-success/10 text-success border-success/20' },\n closed: { label: 'Closed', color: 'bg-muted text-muted-foreground border-muted' },\n};\n\n/**\n * Ticket priority labels and colors\n */\nexport const TICKET_PRIORITY_CONFIG: Record<TicketPriority, { label: string; color: string }> = {\n low: { label: 'Low', color: 'bg-muted text-muted-foreground border-muted' },\n medium: { label: 'Medium', color: 'bg-info/10 text-info border-info/20' },\n high: { label: 'High', color: 'bg-warning/10 text-warning border-warning/20' },\n critical: {\n label: 'Critical',\n color: 'bg-destructive/10 text-destructive border-destructive/20',\n },\n};\n\n/**\n * Health status labels and colors\n */\nexport const HEALTH_STATUS_CONFIG: Record<HealthStatus, { label: string; color: string }> = {\n healthy: { label: 'Healthy', color: 'bg-success/10 text-success border-success/20' },\n degraded: { label: 'Degraded', color: 'bg-warning/10 text-warning border-warning/20' },\n down: { label: 'Down', color: 'bg-destructive/10 text-destructive border-destructive/20' },\n unknown: { label: 'Unknown', color: 'bg-muted text-muted-foreground border-muted' },\n};\n\n/**\n * Deployment status labels and colors\n */\nexport const DEPLOYMENT_STATUS_CONFIG: Record<DeploymentStatus, { label: string; color: string }> =\n {\n pending: { label: 'Pending', color: 'bg-muted text-muted-foreground border-muted' },\n running: { label: 'Running', color: 'bg-info/10 text-info border-info/20' },\n in_progress: { label: 'In Progress', color: 'bg-info/10 text-info border-info/20' },\n success: { label: 'Success', color: 'bg-success/10 text-success border-success/20' },\n failed: { label: 'Failed', color: 'bg-destructive/10 text-destructive border-destructive/20' },\n rolled_back: { label: 'Rolled Back', color: 'bg-warning/10 text-warning border-warning/20' },\n };\n\n/**\n * Cloud provider labels and colors\n */\nexport const CLOUD_PROVIDER_CONFIG: Record<\n CloudProvider,\n { label: string; color: string; icon: string }\n> = {\n aws: {\n label: 'AWS',\n color: 'bg-orange-500/10 text-orange-500 border-orange-500/20',\n icon: 'aws',\n },\n azure: {\n label: 'Azure',\n color: 'bg-blue-500/10 text-blue-500 border-blue-500/20',\n icon: 'azure',\n },\n gcp: { label: 'GCP', color: 'bg-red-500/10 text-red-500 border-red-500/20', icon: 'gcp' },\n digitalocean: {\n label: 'DigitalOcean',\n color: 'bg-cyan-500/10 text-cyan-500 border-cyan-500/20',\n icon: 'do',\n },\n};\n\n/**\n * Chart colors using semantic tokens\n */\nexport const CHART_COLORS = {\n primary: 'hsl(var(--chart-1))',\n secondary: 'hsl(var(--chart-2))',\n tertiary: 'hsl(var(--chart-3))',\n quaternary: 'hsl(var(--chart-4))',\n quinary: 'hsl(var(--chart-5))',\n};\n\n/**\n * Default pagination\n */\nexport const DEFAULT_PAGE_SIZE = 20;\nexport const PAGE_SIZE_OPTIONS = [10, 20, 50, 100];\n"],"mappings":";AAcA,IAAa,IAA+E;CAC1F,QAAQ;EAAE,OAAO;EAAU,OAAO;EAAgD;CAClF,WAAW;EACT,OAAO;EACP,OAAO;EACR;CACD,OAAO;EAAE,OAAO;EAAS,OAAO;EAAgD;CAChF,SAAS;EAAE,OAAO;EAAW,OAAO;EAA+C;CACnF,SAAS;EAAE,OAAO;EAAW,OAAO;EAAuC;CAC3E,cAAc;EAAE,OAAO;EAAgB,OAAO;EAAgD;CAC/F,EAKY,IAA2E;CACtF,QAAQ;EAAE,OAAO;EAAU,OAAO;EAAgD;CAClF,UAAU;EAAE,OAAO;EAAY,OAAO;EAA+C;CACrF,SAAS;EAAE,OAAO;EAAW,OAAO;EAA4D;CAChG,SAAS;EAAE,OAAO;EAAW,OAAO;EAAgD;CACrF,EA6CY,IAA+E;CAC1F,SAAS;EAAE,OAAO;EAAW,OAAO;EAAgD;CACpF,UAAU;EAAE,OAAO;EAAY,OAAO;EAAgD;CACtF,MAAM;EAAE,OAAO;EAAQ,OAAO;EAA4D;CAC1F,SAAS;EAAE,OAAO;EAAW,OAAO;EAA+C;CACpF,EAKY,IACX;CACE,SAAS;EAAE,OAAO;EAAW,OAAO;EAA+C;CACnF,SAAS;EAAE,OAAO;EAAW,OAAO;EAAuC;CAC3E,aAAa;EAAE,OAAO;EAAe,OAAO;EAAuC;CACnF,SAAS;EAAE,OAAO;EAAW,OAAO;EAAgD;CACpF,QAAQ;EAAE,OAAO;EAAU,OAAO;EAA4D;CAC9F,aAAa;EAAE,OAAO;EAAe,OAAO;EAAgD;CAC7F"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Admin Console Permission Constants
3
+ *
4
+ * Maps to resource types and actions in global-rbac-svc seed.
5
+ * The admin console uses global-layer resources: tenant, user, billing,
6
+ * notification, rbac.
7
+ */
8
+ export declare const ADMIN_PERMISSIONS: {
9
+ readonly TENANT_READ: "tenant:read";
10
+ readonly TENANT_WRITE: "tenant:write";
11
+ readonly TENANT_DELETE: "tenant:delete";
12
+ readonly TENANT_ADMIN: "tenant:admin";
13
+ readonly USER_READ: "user:read";
14
+ readonly USER_UPDATE: "user:update";
15
+ readonly USER_DELETE: "user:delete";
16
+ readonly USER_ADMIN: "user:admin";
17
+ readonly BILLING_READ: "billing:read";
18
+ readonly NOTIFICATION_READ: "notification:read";
19
+ readonly RBAC_AUDIT_READ: "rbac:audit:read";
20
+ readonly WORKSPACE_ADMIN: "workspace:admin";
21
+ readonly PRODUCT_READ: "product:read";
22
+ readonly PRODUCT_WRITE: "product:write";
23
+ readonly WAITLIST_READ: "newsletter-waitlist:read";
24
+ readonly WAITLIST_MANAGE: "newsletter-waitlist:approve";
25
+ };
26
+ export type AdminPermission = (typeof ADMIN_PERMISSIONS)[keyof typeof ADMIN_PERMISSIONS];
27
+ //# sourceMappingURL=permissions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permissions.d.ts","sourceRoot":"","sources":["../../../src/admin/constants/permissions.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;CAgCpB,CAAC;AAEX,MAAM,MAAM,eAAe,GAAG,CAAC,OAAO,iBAAiB,CAAC,CAAC,MAAM,OAAO,iBAAiB,CAAC,CAAC"}
@@ -0,0 +1,23 @@
1
+ //#region src/admin/constants/permissions.ts
2
+ var e = {
3
+ TENANT_READ: "tenant:read",
4
+ TENANT_WRITE: "tenant:write",
5
+ TENANT_DELETE: "tenant:delete",
6
+ TENANT_ADMIN: "tenant:admin",
7
+ USER_READ: "user:read",
8
+ USER_UPDATE: "user:update",
9
+ USER_DELETE: "user:delete",
10
+ USER_ADMIN: "user:admin",
11
+ BILLING_READ: "billing:read",
12
+ NOTIFICATION_READ: "notification:read",
13
+ RBAC_AUDIT_READ: "rbac:audit:read",
14
+ WORKSPACE_ADMIN: "workspace:admin",
15
+ PRODUCT_READ: "product:read",
16
+ PRODUCT_WRITE: "product:write",
17
+ WAITLIST_READ: "newsletter-waitlist:read",
18
+ WAITLIST_MANAGE: "newsletter-waitlist:approve"
19
+ };
20
+ //#endregion
21
+ export { e as ADMIN_PERMISSIONS };
22
+
23
+ //# sourceMappingURL=permissions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"permissions.js","names":[],"sources":["../../../src/admin/constants/permissions.ts"],"sourcesContent":["/**\n * Admin Console Permission Constants\n *\n * Maps to resource types and actions in global-rbac-svc seed.\n * The admin console uses global-layer resources: tenant, user, billing,\n * notification, rbac.\n */\n\nexport const ADMIN_PERMISSIONS = {\n // Tenant management\n TENANT_READ: 'tenant:read',\n TENANT_WRITE: 'tenant:write',\n TENANT_DELETE: 'tenant:delete',\n TENANT_ADMIN: 'tenant:admin',\n\n // User management\n USER_READ: 'user:read',\n USER_UPDATE: 'user:update',\n USER_DELETE: 'user:delete',\n USER_ADMIN: 'user:admin',\n\n // Billing\n BILLING_READ: 'billing:read',\n\n // Notifications / Communications\n NOTIFICATION_READ: 'notification:read',\n\n // Audit logs\n RBAC_AUDIT_READ: 'rbac:audit:read',\n\n // Workspace / Sandbox\n WORKSPACE_ADMIN: 'workspace:admin',\n\n // Product management\n PRODUCT_READ: 'product:read',\n PRODUCT_WRITE: 'product:write',\n\n // Waitlist management\n WAITLIST_READ: 'newsletter-waitlist:read',\n WAITLIST_MANAGE: 'newsletter-waitlist:approve',\n} as const;\n\nexport type AdminPermission = (typeof ADMIN_PERMISSIONS)[keyof typeof ADMIN_PERMISSIONS];\n"],"mappings":";AAQA,IAAa,IAAoB;CAE/B,aAAa;CACb,cAAc;CACd,eAAe;CACf,cAAc;CAGd,WAAW;CACX,aAAa;CACb,aAAa;CACb,YAAY;CAGZ,cAAc;CAGd,mBAAmB;CAGnB,iBAAiB;CAGjB,iBAAiB;CAGjB,cAAc;CACd,eAAe;CAGf,eAAe;CACf,iBAAiB;CAClB"}
@@ -0,0 +1,30 @@
1
+ /**
2
+ * Hook for admin console RBAC permissions.
3
+ *
4
+ * SUPER_ADMIN role / actor type (verified from profile or JWT) bypasses all
5
+ * permission checks.
6
+ * Other users require granular permissions from the global RBAC service.
7
+ */
8
+ export declare function useAdminPermissions(): {
9
+ canViewTenants: boolean;
10
+ canManageTenants: boolean;
11
+ canDeleteTenants: boolean;
12
+ isTenantAdmin: boolean;
13
+ canViewUsers: boolean;
14
+ canUpdateUsers: boolean;
15
+ canDeleteUsers: boolean;
16
+ isUserAdmin: boolean;
17
+ canViewBilling: boolean;
18
+ canViewCommunications: boolean;
19
+ canViewAuditLogs: boolean;
20
+ canManageSettings: boolean;
21
+ canViewSRE: boolean;
22
+ canManageSandbox: boolean;
23
+ canViewProducts: boolean;
24
+ canManageProducts: boolean;
25
+ canViewWaitlist: boolean;
26
+ canManageWaitlist: boolean;
27
+ canViewDashboard: boolean;
28
+ isLoading: boolean;
29
+ };
30
+ //# sourceMappingURL=useAdminPermissions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAdminPermissions.d.ts","sourceRoot":"","sources":["../../../src/admin/hooks/useAdminPermissions.ts"],"names":[],"mappings":"AA+BA;;;;;;GAMG;AACH,wBAAgB,mBAAmB;;;;;;;;;;;;;;;;;;;;;EA8ElC"}
@@ -0,0 +1,56 @@
1
+ import { ADMIN_PERMISSIONS as e } from "../constants/permissions.js";
2
+ import { usePermissions as t } from "@burdenoff/fe-libs/shared/providers/shell";
3
+ import { useAuth as n } from "@burdenoff/fe-libs/shared/providers/shell/AuthProvider";
4
+ //#region src/admin/hooks/useAdminPermissions.ts
5
+ function r(e) {
6
+ if (!e) return {
7
+ role: null,
8
+ actorType: null
9
+ };
10
+ let t = e.split(".");
11
+ if (t.length !== 3) return {
12
+ role: null,
13
+ actorType: null
14
+ };
15
+ try {
16
+ let e = t[1].replace(/-/g, "+").replace(/_/g, "/"), n = e.padEnd(Math.ceil(e.length / 4) * 4, "="), r = JSON.parse(atob(n));
17
+ return {
18
+ role: typeof r.role == "string" ? r.role : null,
19
+ actorType: typeof r.actor_type == "string" ? r.actor_type : typeof r.actorType == "string" ? r.actorType : null
20
+ };
21
+ } catch {
22
+ return {
23
+ role: null,
24
+ actorType: null
25
+ };
26
+ }
27
+ }
28
+ function i() {
29
+ let { hasPermission: i, isLoading: a } = t(), o = n(), s = r(o.tokens?.accessToken), c = typeof o.user?.actorType == "string" ? o.user.actorType : typeof o.user?.actor_type == "string" ? o.user.actor_type : null, l = o.user?.role === "SUPER_ADMIN" || o.user?.role === "super_admin" || c === "super_admin" || s.role === "SUPER_ADMIN" || s.role === "super_admin" || s.actorType === "super_admin", u = (e) => l || i(e), d = l || i(e.TENANT_READ) || i(e.TENANT_ADMIN) || i(e.USER_READ) || i(e.USER_ADMIN) || i(e.BILLING_READ) || i(e.NOTIFICATION_READ) || i(e.RBAC_AUDIT_READ) || i(e.WORKSPACE_ADMIN);
30
+ return {
31
+ canViewTenants: u(e.TENANT_READ),
32
+ canManageTenants: u(e.TENANT_WRITE),
33
+ canDeleteTenants: u(e.TENANT_DELETE),
34
+ isTenantAdmin: u(e.TENANT_ADMIN),
35
+ canViewUsers: u(e.USER_READ),
36
+ canUpdateUsers: u(e.USER_UPDATE),
37
+ canDeleteUsers: u(e.USER_DELETE),
38
+ isUserAdmin: u(e.USER_ADMIN),
39
+ canViewBilling: u(e.BILLING_READ),
40
+ canViewCommunications: u(e.NOTIFICATION_READ),
41
+ canViewAuditLogs: u(e.RBAC_AUDIT_READ),
42
+ canManageSettings: u(e.TENANT_ADMIN),
43
+ canViewSRE: u(e.TENANT_ADMIN),
44
+ canManageSandbox: u(e.WORKSPACE_ADMIN),
45
+ canViewProducts: d,
46
+ canManageProducts: u(e.PRODUCT_WRITE),
47
+ canViewWaitlist: d,
48
+ canManageWaitlist: l || i(e.WAITLIST_MANAGE) || i(e.TENANT_ADMIN),
49
+ canViewDashboard: d,
50
+ isLoading: l ? !1 : a
51
+ };
52
+ }
53
+ //#endregion
54
+ export { i as useAdminPermissions };
55
+
56
+ //# sourceMappingURL=useAdminPermissions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useAdminPermissions.js","names":[],"sources":["../../../src/admin/hooks/useAdminPermissions.ts"],"sourcesContent":["import { usePermissions } from '@burdenoff/fe-libs/shared/providers/shell';\nimport { useAuth } from '@burdenoff/fe-libs/shared/providers/shell/AuthProvider';\nimport { ADMIN_PERMISSIONS } from '../constants/permissions';\n\ninterface JwtAccessClaims {\n role: string | null;\n actorType: string | null;\n}\n\nfunction decodeJwtAccessClaims(token: string | undefined): JwtAccessClaims {\n if (!token) return { role: null, actorType: null };\n const parts = token.split('.');\n if (parts.length !== 3) return { role: null, actorType: null };\n try {\n const base64 = parts[1].replace(/-/g, '+').replace(/_/g, '/');\n const normalized = base64.padEnd(Math.ceil(base64.length / 4) * 4, '=');\n const payload = JSON.parse(atob(normalized)) as Record<string, unknown>;\n return {\n role: typeof payload.role === 'string' ? payload.role : null,\n actorType:\n typeof payload.actor_type === 'string'\n ? payload.actor_type\n : typeof payload.actorType === 'string'\n ? payload.actorType\n : null,\n };\n } catch {\n return { role: null, actorType: null };\n }\n}\n\n/**\n * Hook for admin console RBAC permissions.\n *\n * SUPER_ADMIN role / actor type (verified from profile or JWT) bypasses all\n * permission checks.\n * Other users require granular permissions from the global RBAC service.\n */\nexport function useAdminPermissions() {\n const { hasPermission, isLoading } = usePermissions();\n const auth = useAuth();\n\n const jwtClaims = decodeJwtAccessClaims(auth.tokens?.accessToken);\n const userActorType =\n typeof auth.user?.actorType === 'string'\n ? auth.user.actorType\n : typeof auth.user?.actor_type === 'string'\n ? auth.user.actor_type\n : null;\n const isSuperAdmin =\n auth.user?.role === 'SUPER_ADMIN' ||\n auth.user?.role === 'super_admin' ||\n userActorType === 'super_admin' ||\n jwtClaims.role === 'SUPER_ADMIN' ||\n jwtClaims.role === 'super_admin' ||\n jwtClaims.actorType === 'super_admin';\n\n const check = (permission: string) => isSuperAdmin || hasPermission(permission);\n\n // True if the user holds any admin-level permission (read or admin grants)\n const hasAnyAdminAccess =\n isSuperAdmin ||\n hasPermission(ADMIN_PERMISSIONS.TENANT_READ) ||\n hasPermission(ADMIN_PERMISSIONS.TENANT_ADMIN) ||\n hasPermission(ADMIN_PERMISSIONS.USER_READ) ||\n hasPermission(ADMIN_PERMISSIONS.USER_ADMIN) ||\n hasPermission(ADMIN_PERMISSIONS.BILLING_READ) ||\n hasPermission(ADMIN_PERMISSIONS.NOTIFICATION_READ) ||\n hasPermission(ADMIN_PERMISSIONS.RBAC_AUDIT_READ) ||\n hasPermission(ADMIN_PERMISSIONS.WORKSPACE_ADMIN);\n\n return {\n // Tenant management\n canViewTenants: check(ADMIN_PERMISSIONS.TENANT_READ),\n canManageTenants: check(ADMIN_PERMISSIONS.TENANT_WRITE),\n canDeleteTenants: check(ADMIN_PERMISSIONS.TENANT_DELETE),\n isTenantAdmin: check(ADMIN_PERMISSIONS.TENANT_ADMIN),\n\n // User management\n canViewUsers: check(ADMIN_PERMISSIONS.USER_READ),\n canUpdateUsers: check(ADMIN_PERMISSIONS.USER_UPDATE),\n canDeleteUsers: check(ADMIN_PERMISSIONS.USER_DELETE),\n isUserAdmin: check(ADMIN_PERMISSIONS.USER_ADMIN),\n\n // Billing\n canViewBilling: check(ADMIN_PERMISSIONS.BILLING_READ),\n\n // Communications\n canViewCommunications: check(ADMIN_PERMISSIONS.NOTIFICATION_READ),\n\n // Audit\n canViewAuditLogs: check(ADMIN_PERMISSIONS.RBAC_AUDIT_READ),\n\n // Platform settings / SRE\n canManageSettings: check(ADMIN_PERMISSIONS.TENANT_ADMIN),\n canViewSRE: check(ADMIN_PERMISSIONS.TENANT_ADMIN),\n\n // Workspace / Sandbox\n canManageSandbox: check(ADMIN_PERMISSIONS.WORKSPACE_ADMIN),\n\n // Products\n canViewProducts: hasAnyAdminAccess,\n canManageProducts: check(ADMIN_PERMISSIONS.PRODUCT_WRITE),\n\n // Waitlist\n canViewWaitlist: hasAnyAdminAccess,\n canManageWaitlist:\n isSuperAdmin ||\n hasPermission(ADMIN_PERMISSIONS.WAITLIST_MANAGE) ||\n hasPermission(ADMIN_PERMISSIONS.TENANT_ADMIN),\n\n // General pages — any admin role can access\n canViewDashboard: hasAnyAdminAccess,\n\n isLoading: isSuperAdmin ? false : isLoading,\n };\n}\n"],"mappings":";;;;AASA,SAAS,EAAsB,GAA4C;AACzE,KAAI,CAAC,EAAO,QAAO;EAAE,MAAM;EAAM,WAAW;EAAM;CAClD,IAAM,IAAQ,EAAM,MAAM,IAAI;AAC9B,KAAI,EAAM,WAAW,EAAG,QAAO;EAAE,MAAM;EAAM,WAAW;EAAM;AAC9D,KAAI;EACF,IAAM,IAAS,EAAM,GAAG,QAAQ,MAAM,IAAI,CAAC,QAAQ,MAAM,IAAI,EACvD,IAAa,EAAO,OAAO,KAAK,KAAK,EAAO,SAAS,EAAE,GAAG,GAAG,IAAI,EACjE,IAAU,KAAK,MAAM,KAAK,EAAW,CAAC;AAC5C,SAAO;GACL,MAAM,OAAO,EAAQ,QAAS,WAAW,EAAQ,OAAO;GACxD,WACE,OAAO,EAAQ,cAAe,WAC1B,EAAQ,aACR,OAAO,EAAQ,aAAc,WAC3B,EAAQ,YACR;GACT;SACK;AACN,SAAO;GAAE,MAAM;GAAM,WAAW;GAAM;;;AAW1C,SAAgB,IAAsB;CACpC,IAAM,EAAE,kBAAe,iBAAc,GAAgB,EAC/C,IAAO,GAAS,EAEhB,IAAY,EAAsB,EAAK,QAAQ,YAAY,EAC3D,IACJ,OAAO,EAAK,MAAM,aAAc,WAC5B,EAAK,KAAK,YACV,OAAO,EAAK,MAAM,cAAe,WAC/B,EAAK,KAAK,aACV,MACF,IACJ,EAAK,MAAM,SAAS,iBACpB,EAAK,MAAM,SAAS,iBACpB,MAAkB,iBAClB,EAAU,SAAS,iBACnB,EAAU,SAAS,iBACnB,EAAU,cAAc,eAEpB,KAAS,MAAuB,KAAgB,EAAc,EAAW,EAGzE,IACJ,KACA,EAAc,EAAkB,YAAY,IAC5C,EAAc,EAAkB,aAAa,IAC7C,EAAc,EAAkB,UAAU,IAC1C,EAAc,EAAkB,WAAW,IAC3C,EAAc,EAAkB,aAAa,IAC7C,EAAc,EAAkB,kBAAkB,IAClD,EAAc,EAAkB,gBAAgB,IAChD,EAAc,EAAkB,gBAAgB;AAElD,QAAO;EAEL,gBAAgB,EAAM,EAAkB,YAAY;EACpD,kBAAkB,EAAM,EAAkB,aAAa;EACvD,kBAAkB,EAAM,EAAkB,cAAc;EACxD,eAAe,EAAM,EAAkB,aAAa;EAGpD,cAAc,EAAM,EAAkB,UAAU;EAChD,gBAAgB,EAAM,EAAkB,YAAY;EACpD,gBAAgB,EAAM,EAAkB,YAAY;EACpD,aAAa,EAAM,EAAkB,WAAW;EAGhD,gBAAgB,EAAM,EAAkB,aAAa;EAGrD,uBAAuB,EAAM,EAAkB,kBAAkB;EAGjE,kBAAkB,EAAM,EAAkB,gBAAgB;EAG1D,mBAAmB,EAAM,EAAkB,aAAa;EACxD,YAAY,EAAM,EAAkB,aAAa;EAGjD,kBAAkB,EAAM,EAAkB,gBAAgB;EAG1D,iBAAiB;EACjB,mBAAmB,EAAM,EAAkB,cAAc;EAGzD,iBAAiB;EACjB,mBACE,KACA,EAAc,EAAkB,gBAAgB,IAChD,EAAc,EAAkB,aAAa;EAG/C,kBAAkB;EAElB,WAAW,IAAe,KAAQ;EACnC"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * Admin Console Microfrontend
3
+ *
4
+ * Provides a comprehensive platform administration interface
5
+ * for managing tenants, users, billing, support, and system health.
6
+ *
7
+ * @example
8
+ * ```tsx
9
+ * import { AdminRoot, type AdminRootProps } from '@burdenoff/microfe-admin';
10
+ *
11
+ * function App() {
12
+ * const props: AdminRootProps = {
13
+ * basePath: '/admin',
14
+ * navigate: (path) => router.push(path),
15
+ * currentUser: { id: '1', email: 'admin@example.com', role: 'PLATFORM_SUPERADMIN' },
16
+ * tenantId: 'tenant-123',
17
+ * apiGatewayUrl: 'https://api.example.com',
18
+ * authToken: 'token',
19
+ * };
20
+ *
21
+ * return <AdminRoot {...props} />;
22
+ * }
23
+ * ```
24
+ */
25
+ export { AdminRoot } from './AdminRoot';
26
+ export type { AdminRootProps, AdminUser, AdminRole, AdminView, Tenant, TenantStatus, TenantSettings, User, UserStatus, Subscription, SubscriptionStatus, Invoice, InvoiceStatus, DashboardMetrics, Activity, NavItem, FooterItem, } from './types';
27
+ export { useAdmin } from './providers/AdminProvider';
28
+ export { useAdminStore } from './store/adminStore';
29
+ export { TenantForm, UserForm, SubscriptionForm, FormSheet, FormSheetFooter, FormSection, FormRow, } from './components';
30
+ export * from './schemas';
31
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/admin/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,YAAY,EACV,cAAc,EACd,SAAS,EACT,SAAS,EACT,SAAS,EACT,MAAM,EACN,YAAY,EACZ,cAAc,EACd,IAAI,EACJ,UAAU,EACV,YAAY,EACZ,kBAAkB,EAClB,OAAO,EACP,aAAa,EACb,gBAAgB,EAChB,QAAQ,EACR,OAAO,EACP,UAAU,GACX,MAAM,SAAS,CAAC;AACjB,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAGnD,OAAO,EACL,UAAU,EACV,QAAQ,EACR,gBAAgB,EAChB,SAAS,EACT,eAAe,EACf,WAAW,EACX,OAAO,GACR,MAAM,cAAc,CAAC;AAGtB,cAAc,WAAW,CAAC"}
@@ -0,0 +1,9 @@
1
+ import "./providers/AdminProvider.js";
2
+ import "./components/FormSheet.js";
3
+ import "./components/forms/TenantForm.js";
4
+ import "./components/forms/UserForm.js";
5
+ import "./components/forms/SubscriptionForm.js";
6
+ import "./components/index.js";
7
+ import "./store/adminStore.js";
8
+ import "./AdminRoot.js";
9
+ import "./schemas/index.js";
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Audit logs page — connected to real backend
3
+ */
4
+ export declare function AuditLogsPage(): import("react/jsx-runtime").JSX.Element;
5
+ //# sourceMappingURL=AuditLogsPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuditLogsPage.d.ts","sourceRoot":"","sources":["../../../src/admin/pages/AuditLogsPage.tsx"],"names":[],"mappings":"AA+BA;;GAEG;AACH,wBAAgB,aAAa,4CAmP5B"}
@@ -0,0 +1,209 @@
1
+ import { useAdminPermissions as e } from "../hooks/useAdminPermissions.js";
2
+ import { Button as t, EmptyState as n, Input as r } from "../components/ui.js";
3
+ import { PageLayout as i } from "../components/PageLayout.js";
4
+ import { formatRelativeTime as a } from "../utils/formatters.js";
5
+ import { DataTable as o, Pagination as s } from "../components/DataTable.js";
6
+ import { PermissionGuard as c } from "../components/PermissionGuard.js";
7
+ import "../components/index.js";
8
+ import { useListAuditLogsQuery as l } from "../../generated/global-operations.js";
9
+ import { useCallback as u, useMemo as d, useState as f } from "react";
10
+ import { Database as p, Download as m, FileText as h, Key as g, Search as _, Settings as v, Shield as y, User as b } from "lucide-react";
11
+ import { jsx as x, jsxs as S } from "react/jsx-runtime";
12
+ //#region src/admin/pages/AuditLogsPage.tsx
13
+ var C = 20, w = {
14
+ auth: /* @__PURE__ */ x(b, { className: "h-3 w-3" }),
15
+ user: /* @__PURE__ */ x(b, { className: "h-3 w-3" }),
16
+ settings: /* @__PURE__ */ x(v, { className: "h-3 w-3" }),
17
+ rbac: /* @__PURE__ */ x(y, { className: "h-3 w-3" }),
18
+ data: /* @__PURE__ */ x(p, { className: "h-3 w-3" }),
19
+ api: /* @__PURE__ */ x(g, { className: "h-3 w-3" })
20
+ };
21
+ function T(e) {
22
+ return w[e.split(".")[0]] ?? /* @__PURE__ */ x(h, { className: "h-3 w-3" });
23
+ }
24
+ function E() {
25
+ let { canViewAuditLogs: p, isLoading: g } = e(), [v, y] = f(1), [b, w] = f(""), [E, D] = f(""), O = g || !p, { data: k, loading: A, error: j } = l({
26
+ variables: {
27
+ resource: E || void 0,
28
+ limit: C,
29
+ offset: (v - 1) * C
30
+ },
31
+ fetchPolicy: "cache-and-network",
32
+ skip: O
33
+ }), M = d(() => (k?.auditLogs?.edges ?? []).map((e) => e.node), [k]), N = d(() => {
34
+ if (!b) return M;
35
+ let e = b.toLowerCase();
36
+ return M.filter((t) => t.action.toLowerCase().includes(e) || t.actorId.toLowerCase().includes(e) || t.resource.toLowerCase().includes(e) || t.tenantId.toLowerCase().includes(e));
37
+ }, [M, b]), P = k?.auditLogs?.totalCount ?? 0, F = Math.ceil(P / C), I = u(() => {
38
+ let e = N;
39
+ if (e.length === 0) return;
40
+ let t = [
41
+ "id",
42
+ "action",
43
+ "actorId",
44
+ "actorType",
45
+ "resource",
46
+ "resourceId",
47
+ "tenantId",
48
+ "ipAddress",
49
+ "userAgent",
50
+ "changes",
51
+ "metadata",
52
+ "createdAt"
53
+ ], n = (e) => {
54
+ if (e == null) return "";
55
+ let t = typeof e == "object" ? JSON.stringify(e) : String(e);
56
+ return /[",\n\r]/.test(t) ? `"${t.replace(/"/g, "\"\"")}"` : t;
57
+ }, r = [t.join(","), ...e.map((e) => [
58
+ n(e.id),
59
+ n(e.action),
60
+ n(e.actorId),
61
+ n(e.actorType),
62
+ n(e.resource),
63
+ n(e.resourceId),
64
+ n(e.tenantId),
65
+ n(e.ipAddress),
66
+ n(e.userAgent),
67
+ n(e.changes),
68
+ n(e.metadata),
69
+ n(e.createdAt)
70
+ ].join(","))].join("\n"), i = new Blob([r], { type: "text/csv;charset=utf-8;" }), a = URL.createObjectURL(i), o = document.createElement("a"), s = (/* @__PURE__ */ new Date()).toISOString().replace(/[:.]/g, "-");
71
+ o.href = a, o.setAttribute("download", `audit-logs-${s}.csv`), document.body.appendChild(o), o.click(), document.body.removeChild(o), URL.revokeObjectURL(a);
72
+ }, [N]);
73
+ return /* @__PURE__ */ x(c, {
74
+ allowed: p,
75
+ isLoading: g,
76
+ pageTitle: "Audit Logs",
77
+ denyMessage: "You don't have permission to view audit logs.",
78
+ children: /* @__PURE__ */ x(i, {
79
+ title: "Audit Logs",
80
+ description: `Security and compliance audit trail${P ? ` · ${P} total` : ""}`,
81
+ actions: /* @__PURE__ */ S(t, {
82
+ variant: "outline",
83
+ onClick: I,
84
+ disabled: A || N.length === 0,
85
+ "data-testid": "audit-logs-export-csv",
86
+ children: [/* @__PURE__ */ x(m, { className: "mr-2 h-4 w-4" }), "Export CSV"]
87
+ }),
88
+ children: /* @__PURE__ */ S("div", {
89
+ className: "space-y-4",
90
+ children: [
91
+ /* @__PURE__ */ S("div", {
92
+ className: "flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between",
93
+ children: [/* @__PURE__ */ S("div", {
94
+ className: "relative max-w-sm flex-1",
95
+ children: [/* @__PURE__ */ x(_, { className: "absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground" }), /* @__PURE__ */ x(r, {
96
+ placeholder: "Search by action, actor, or resource...",
97
+ value: b,
98
+ onChange: (e) => w(e.target.value),
99
+ className: "pl-9"
100
+ })]
101
+ }), /* @__PURE__ */ x(r, {
102
+ placeholder: "Filter by resource (e.g. tenant, user)...",
103
+ value: E,
104
+ onChange: (e) => {
105
+ y(1), D(e.target.value);
106
+ },
107
+ className: "max-w-xs"
108
+ })]
109
+ }),
110
+ j && /* @__PURE__ */ S("div", {
111
+ className: "rounded-md border border-destructive/50 bg-destructive/10 p-4 text-sm text-destructive",
112
+ children: ["Failed to load audit logs: ", j.message]
113
+ }),
114
+ /* @__PURE__ */ x(o, {
115
+ columns: [
116
+ {
117
+ key: "action",
118
+ header: "Action",
119
+ render: (e) => /* @__PURE__ */ S("div", {
120
+ className: "flex items-center gap-2",
121
+ children: [/* @__PURE__ */ x("span", {
122
+ className: "text-muted-foreground",
123
+ children: T(e.action)
124
+ }), /* @__PURE__ */ x("span", {
125
+ className: "font-mono text-sm font-medium text-foreground",
126
+ children: e.action
127
+ })]
128
+ })
129
+ },
130
+ {
131
+ key: "actorId",
132
+ header: "Actor",
133
+ width: "180px",
134
+ render: (e) => /* @__PURE__ */ S("div", {
135
+ className: "min-w-0",
136
+ children: [/* @__PURE__ */ x("div", {
137
+ className: "truncate text-sm",
138
+ children: e.actorId
139
+ }), /* @__PURE__ */ x("div", {
140
+ className: "text-xs text-muted-foreground capitalize",
141
+ children: e.actorType
142
+ })]
143
+ })
144
+ },
145
+ {
146
+ key: "resource",
147
+ header: "Resource",
148
+ width: "150px",
149
+ render: (e) => /* @__PURE__ */ S("div", {
150
+ className: "min-w-0",
151
+ children: [/* @__PURE__ */ x("div", {
152
+ className: "truncate text-sm",
153
+ children: e.resource
154
+ }), e.resourceId && /* @__PURE__ */ S("div", {
155
+ className: "truncate text-xs text-muted-foreground",
156
+ children: ["#", String(e.resourceId).slice(-8)]
157
+ })]
158
+ })
159
+ },
160
+ {
161
+ key: "tenantId",
162
+ header: "Tenant",
163
+ width: "130px",
164
+ render: (e) => /* @__PURE__ */ x("span", {
165
+ className: "text-xs text-muted-foreground",
166
+ children: e.tenantId ? `#${e.tenantId.slice(-8)}` : "—"
167
+ })
168
+ },
169
+ {
170
+ key: "ipAddress",
171
+ header: "IP",
172
+ width: "120px",
173
+ render: (e) => /* @__PURE__ */ x("span", {
174
+ className: "font-mono text-xs text-muted-foreground",
175
+ children: e.ipAddress ?? "—"
176
+ })
177
+ },
178
+ {
179
+ key: "createdAt",
180
+ header: "Time",
181
+ width: "110px",
182
+ render: (e) => a(e.createdAt)
183
+ }
184
+ ],
185
+ data: N,
186
+ keyExtractor: (e) => e.id,
187
+ loading: A,
188
+ emptyState: /* @__PURE__ */ x(n, {
189
+ icon: /* @__PURE__ */ x(h, { className: "h-8 w-8" }),
190
+ title: "No audit logs found",
191
+ description: "Audit events will appear here when actions are performed"
192
+ })
193
+ }),
194
+ P > C && /* @__PURE__ */ x(s, {
195
+ page: v,
196
+ totalPages: F,
197
+ totalItems: P,
198
+ pageSize: C,
199
+ onPageChange: y
200
+ })
201
+ ]
202
+ })
203
+ })
204
+ });
205
+ }
206
+ //#endregion
207
+ export { E as AuditLogsPage };
208
+
209
+ //# sourceMappingURL=AuditLogsPage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AuditLogsPage.js","names":[],"sources":["../../../src/admin/pages/AuditLogsPage.tsx"],"sourcesContent":["import { useState, useMemo, useCallback } from 'react';\nimport { FileText, Search, Download, User, Settings, Shield, Database, Key } from 'lucide-react';\nimport {\n PageLayout,\n Input,\n DataTable,\n Pagination,\n EmptyState,\n Button,\n PermissionGuard,\n} from '../components';\nimport { useAdminPermissions } from '../hooks/useAdminPermissions';\nimport { formatRelativeTime } from '../utils/formatters';\nimport { useListAuditLogsQuery } from '../../generated/global-operations';\n\nconst PAGE_SIZE = 20;\n\nconst ACTION_ICONS: Record<string, React.ReactNode> = {\n auth: <User className=\"h-3 w-3\" />,\n user: <User className=\"h-3 w-3\" />,\n settings: <Settings className=\"h-3 w-3\" />,\n rbac: <Shield className=\"h-3 w-3\" />,\n data: <Database className=\"h-3 w-3\" />,\n api: <Key className=\"h-3 w-3\" />,\n};\n\nfunction getActionIcon(action: string) {\n const prefix = action.split('.')[0];\n return ACTION_ICONS[prefix] ?? <FileText className=\"h-3 w-3\" />;\n}\n\n/**\n * Audit logs page — connected to real backend\n */\nexport function AuditLogsPage() {\n const { canViewAuditLogs, isLoading: permissionsLoading } = useAdminPermissions();\n\n const [page, setPage] = useState(1);\n const [search, setSearch] = useState('');\n const [resourceFilter, setResourceFilter] = useState('');\n\n const skipQueries = permissionsLoading || !canViewAuditLogs;\n\n const { data, loading, error } = useListAuditLogsQuery({\n variables: {\n resource: resourceFilter || undefined,\n limit: PAGE_SIZE,\n offset: (page - 1) * PAGE_SIZE,\n },\n fetchPolicy: 'cache-and-network',\n skip: skipQueries,\n });\n\n const auditLogs = useMemo(() => {\n const edges = data?.auditLogs?.edges ?? [];\n return edges.map((e: (typeof edges)[number]) => e.node);\n }, [data]);\n\n type AuditLogNode = (typeof auditLogs)[number];\n\n const filteredLogs = useMemo(() => {\n if (!search) return auditLogs;\n const q = search.toLowerCase();\n return auditLogs.filter(\n (log: AuditLogNode) =>\n log.action.toLowerCase().includes(q) ||\n log.actorId.toLowerCase().includes(q) ||\n log.resource.toLowerCase().includes(q) ||\n log.tenantId.toLowerCase().includes(q)\n );\n }, [auditLogs, search]);\n\n const total = data?.auditLogs?.totalCount ?? 0;\n const totalPages = Math.ceil(total / PAGE_SIZE);\n\n const exportToCsv = useCallback(() => {\n const rows = filteredLogs;\n if (rows.length === 0) return;\n\n const headers = [\n 'id',\n 'action',\n 'actorId',\n 'actorType',\n 'resource',\n 'resourceId',\n 'tenantId',\n 'ipAddress',\n 'userAgent',\n 'changes',\n 'metadata',\n 'createdAt',\n ];\n\n const escape = (value: unknown): string => {\n if (value === null || value === undefined) return '';\n const str = typeof value === 'object' ? JSON.stringify(value) : String(value);\n // RFC 4180: wrap in quotes if it contains quote, comma, or newline; double internal quotes\n if (/[\",\\n\\r]/.test(str)) {\n return `\"${str.replace(/\"/g, '\"\"')}\"`;\n }\n return str;\n };\n\n const csvLines = [\n headers.join(','),\n ...rows.map((log: AuditLogNode) =>\n [\n escape(log.id),\n escape(log.action),\n escape(log.actorId),\n escape(log.actorType),\n escape(log.resource),\n escape(log.resourceId),\n escape(log.tenantId),\n escape(log.ipAddress),\n escape((log as { userAgent?: unknown }).userAgent),\n escape((log as { changes?: unknown }).changes),\n escape((log as { metadata?: unknown }).metadata),\n escape(log.createdAt),\n ].join(',')\n ),\n ];\n\n const csv = csvLines.join('\\n');\n const blob = new Blob([csv], { type: 'text/csv;charset=utf-8;' });\n const url = URL.createObjectURL(blob);\n const link = document.createElement('a');\n const stamp = new Date().toISOString().replace(/[:.]/g, '-');\n link.href = url;\n link.setAttribute('download', `audit-logs-${stamp}.csv`);\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n }, [filteredLogs]);\n\n const columns = [\n {\n key: 'action',\n header: 'Action',\n render: (log: (typeof auditLogs)[number]) => (\n <div className=\"flex items-center gap-2\">\n <span className=\"text-muted-foreground\">{getActionIcon(log.action)}</span>\n <span className=\"font-mono text-sm font-medium text-foreground\">{log.action}</span>\n </div>\n ),\n },\n {\n key: 'actorId',\n header: 'Actor',\n width: '180px',\n render: (log: (typeof auditLogs)[number]) => (\n <div className=\"min-w-0\">\n <div className=\"truncate text-sm\">{log.actorId}</div>\n <div className=\"text-xs text-muted-foreground capitalize\">{log.actorType}</div>\n </div>\n ),\n },\n {\n key: 'resource',\n header: 'Resource',\n width: '150px',\n render: (log: (typeof auditLogs)[number]) => (\n <div className=\"min-w-0\">\n <div className=\"truncate text-sm\">{log.resource}</div>\n {log.resourceId && (\n <div className=\"truncate text-xs text-muted-foreground\">\n #{String(log.resourceId).slice(-8)}\n </div>\n )}\n </div>\n ),\n },\n {\n key: 'tenantId',\n header: 'Tenant',\n width: '130px',\n render: (log: (typeof auditLogs)[number]) => (\n <span className=\"text-xs text-muted-foreground\">\n {log.tenantId ? `#${log.tenantId.slice(-8)}` : '—'}\n </span>\n ),\n },\n {\n key: 'ipAddress',\n header: 'IP',\n width: '120px',\n render: (log: (typeof auditLogs)[number]) => (\n <span className=\"font-mono text-xs text-muted-foreground\">{log.ipAddress ?? '—'}</span>\n ),\n },\n {\n key: 'createdAt',\n header: 'Time',\n width: '110px',\n render: (log: (typeof auditLogs)[number]) => formatRelativeTime(log.createdAt),\n },\n ];\n\n return (\n <PermissionGuard\n allowed={canViewAuditLogs}\n isLoading={permissionsLoading}\n pageTitle=\"Audit Logs\"\n denyMessage=\"You don't have permission to view audit logs.\"\n >\n <PageLayout\n title=\"Audit Logs\"\n description={`Security and compliance audit trail${total ? ` · ${total} total` : ''}`}\n actions={\n <Button\n variant=\"outline\"\n onClick={exportToCsv}\n disabled={loading || filteredLogs.length === 0}\n data-testid=\"audit-logs-export-csv\"\n >\n <Download className=\"mr-2 h-4 w-4\" />\n Export CSV\n </Button>\n }\n >\n <div className=\"space-y-4\">\n <div className=\"flex flex-col gap-4 sm:flex-row sm:items-center sm:justify-between\">\n <div className=\"relative max-w-sm flex-1\">\n <Search className=\"absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-muted-foreground\" />\n <Input\n placeholder=\"Search by action, actor, or resource...\"\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n className=\"pl-9\"\n />\n </div>\n <Input\n placeholder=\"Filter by resource (e.g. tenant, user)...\"\n value={resourceFilter}\n onChange={(e) => {\n setPage(1);\n setResourceFilter(e.target.value);\n }}\n className=\"max-w-xs\"\n />\n </div>\n\n {error && (\n <div className=\"rounded-md border border-destructive/50 bg-destructive/10 p-4 text-sm text-destructive\">\n Failed to load audit logs: {error.message}\n </div>\n )}\n\n <DataTable\n columns={columns}\n data={filteredLogs}\n keyExtractor={(l) => l.id}\n loading={loading}\n emptyState={\n <EmptyState\n icon={<FileText className=\"h-8 w-8\" />}\n title=\"No audit logs found\"\n description=\"Audit events will appear here when actions are performed\"\n />\n }\n />\n\n {total > PAGE_SIZE && (\n <Pagination\n page={page}\n totalPages={totalPages}\n totalItems={total}\n pageSize={PAGE_SIZE}\n onPageChange={setPage}\n />\n )}\n </div>\n </PageLayout>\n </PermissionGuard>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export declare function BillingPage(): import("react/jsx-runtime").JSX.Element;
2
+ //# sourceMappingURL=BillingPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BillingPage.d.ts","sourceRoot":"","sources":["../../../src/admin/pages/BillingPage.tsx"],"names":[],"mappings":"AASA,wBAAgB,WAAW,4CA2J1B"}