@allbluecn/admin-app 0.3.2 → 0.3.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (198) hide show
  1. package/package.json +19 -17
  2. package/src/components/admin/admin-user-menu.tsx +4 -4
  3. package/src/components/admin/developer-log.tsx +16 -32
  4. package/src/components/ai-memory/memory-facts-panel.tsx +30 -70
  5. package/src/components/ai-prompts/preview-panel.tsx +1 -1
  6. package/src/components/ai-prompts/prompt-editor.tsx +8 -9
  7. package/src/components/ai-prompts/prompt-table.tsx +6 -6
  8. package/src/components/ai-prompts/section-editor.tsx +3 -3
  9. package/src/components/ai-prompts/variable-panel.tsx +2 -2
  10. package/src/components/ai-prompts/version-history.tsx +21 -41
  11. package/src/components/ai-provider/model-list-editor.tsx +2 -3
  12. package/src/components/ai-provider/provider-form.tsx +7 -7
  13. package/src/components/ai-provider/provider-table.tsx +17 -40
  14. package/src/components/auth/admin-login-form.tsx +7 -7
  15. package/src/components/auth/icon-input.tsx +2 -2
  16. package/src/components/auth/password-input.tsx +2 -2
  17. package/src/components/component/component-form-dialog.tsx +10 -18
  18. package/src/components/component/component-import-dialog.tsx +6 -6
  19. package/src/components/component/component-preview.tsx +311 -0
  20. package/src/components/component/component-table.tsx +3 -3
  21. package/src/components/dependency/changelog-dialog.tsx +2 -2
  22. package/src/components/dependency/columns.tsx +3 -3
  23. package/src/components/dependency/dependency-table.tsx +7 -7
  24. package/src/components/dependency/edit-dialog.tsx +8 -8
  25. package/src/components/invitations/invitations-page.tsx +26 -49
  26. package/src/components/knowledge-public/bookmark-form-dialog.tsx +6 -6
  27. package/src/components/knowledge-public/compliance-form-dialog.tsx +6 -6
  28. package/src/components/knowledge-public/legal-form-dialog.tsx +7 -7
  29. package/src/components/layout/sidebar-02/app-sidebar.tsx +1 -2
  30. package/src/components/layout/sidebar-02/index.tsx +1 -1
  31. package/src/components/layout/sidebar-02/nav-main.tsx +2 -3
  32. package/src/components/layout/sidebar-02/nav-notifications.tsx +3 -3
  33. package/src/components/market/columns.tsx +4 -4
  34. package/src/components/market/market-app-form.tsx +6 -7
  35. package/src/components/market/market-app-list.tsx +14 -29
  36. package/src/components/monitoring/error-list.tsx +2 -2
  37. package/src/components/monitoring/metrics-stats.tsx +1 -1
  38. package/src/components/monitoring/request-log-table.tsx +2 -2
  39. package/src/components/oauth-providers/provider-page.tsx +20 -38
  40. package/src/components/permissions/assign-dialog.tsx +135 -0
  41. package/src/components/permissions/create-role-dialog.tsx +135 -0
  42. package/src/components/permissions/types.ts +49 -0
  43. package/src/components/user/columns.tsx +6 -6
  44. package/src/components/user/settings-activity-log.tsx +7 -7
  45. package/src/components/user/settings-profile/avatar-uploader.tsx +118 -0
  46. package/src/components/user/settings-profile/social-links.tsx +63 -0
  47. package/src/components/user/settings-profile.tsx +26 -125
  48. package/src/components/user/user-create-dialog.tsx +6 -6
  49. package/src/components/user/user-detail/error-boundary.tsx +19 -0
  50. package/src/components/user/user-detail/user-detail-dialogs.tsx +203 -0
  51. package/src/components/user/user-filters.tsx +4 -4
  52. package/src/lib/auth/page-gate.ts +28 -0
  53. package/src/lib/auth.config.ts +25 -9
  54. package/src/lib/i18n/detect.ts +1 -1
  55. package/src/lib/loader-serial.ts +14 -0
  56. package/src/providers/index.tsx +1 -1
  57. package/src/routeTree.gen.ts +67 -78
  58. package/src/routes/__root.tsx +4 -4
  59. package/src/routes/_nav/audit/route.lazy.tsx +1 -2
  60. package/src/routes/_nav/compliance/route.lazy.tsx +5 -3
  61. package/src/routes/_nav/components/route.lazy.tsx +14 -34
  62. package/src/routes/_nav/knowledge-public/bookmarks/route.lazy.tsx +18 -38
  63. package/src/routes/_nav/knowledge-public/compliance/route.lazy.tsx +18 -38
  64. package/src/routes/_nav/knowledge-public/legal/route.lazy.tsx +6 -6
  65. package/src/routes/_nav/licenses/$licenseId/route.lazy.tsx +3 -3
  66. package/src/routes/_nav/licenses/new/route.lazy.tsx +5 -5
  67. package/src/routes/_nav/licenses/route.lazy.tsx +1 -1
  68. package/src/routes/_nav/monitoring/ai-usage/route.lazy.tsx +2 -2
  69. package/src/routes/_nav/monitoring/errors/route.lazy.tsx +10 -10
  70. package/src/routes/_nav/monitoring/errors/route.tsx +7 -0
  71. package/src/routes/_nav/monitoring/health/route.lazy.tsx +13 -15
  72. package/src/routes/_nav/monitoring/health/route.tsx +14 -0
  73. package/src/routes/_nav/monitoring/logs/route.lazy.tsx +24 -9
  74. package/src/routes/_nav/monitoring/logs/route.tsx +13 -0
  75. package/src/routes/_nav/monitoring/metrics/route.lazy.tsx +12 -14
  76. package/src/routes/_nav/monitoring/metrics/route.tsx +7 -0
  77. package/src/routes/_nav/monitoring/overview/route.lazy.tsx +14 -13
  78. package/src/routes/_nav/monitoring/overview/route.tsx +17 -0
  79. package/src/routes/_nav/monitoring/route.lazy.tsx +6 -6
  80. package/src/routes/_nav/monitoring/sentry/route.lazy.tsx +2 -2
  81. package/src/routes/_nav/permissions/route.lazy.tsx +21 -311
  82. package/src/routes/_nav/permissions/route.tsx +1 -1
  83. package/src/routes/_nav/route.tsx +5 -13
  84. package/src/routes/_nav/sso/route.lazy.tsx +2 -3
  85. package/src/routes/_nav/users/$userId/route.lazy.tsx +91 -156
  86. package/src/routes/_nav/users/-components/users-table.tsx +1 -1
  87. package/src/routes/_nav/users/route.lazy.tsx +1 -1
  88. package/src/routes/login/route.lazy.tsx +1 -1
  89. package/src/routes/setup/route.lazy.tsx +2 -2
  90. package/src/server/__tests__/admin-billing.test.ts +191 -16
  91. package/src/server/__tests__/compliance.test.ts +44 -7
  92. package/src/server/__tests__/permissions.test.ts +10 -5
  93. package/src/server/__tests__/prompt-defaults.test.ts +3 -3
  94. package/src/server/admin-ai-alerts.ts +2 -1
  95. package/src/server/admin-ai-usage.ts +2 -1
  96. package/src/server/ai-memory/store.ts +6 -2
  97. package/src/server/{serverFns/ai-prompts → ai-prompts}/prompt-defaults.ts +5 -3
  98. package/src/server/{serverFns/dependency → dependency}/helpers.ts +4 -3
  99. package/src/server/knowledge-public/github-sync.ts +2 -1
  100. package/src/server/license-issue.ts +2 -1
  101. package/src/server/middlewares/auth-rate-limit.ts +117 -0
  102. package/src/server/observability/health-check.ts +4 -1
  103. package/src/server/observability/metrics.ts +17 -15
  104. package/src/server/observability/request-middleware.ts +2 -1
  105. package/src/server/observability/timing.ts +14 -16
  106. package/src/server/serverFns/admin-billing.ts +107 -12
  107. package/src/server/serverFns/ai-memory/list-users.ts +2 -1
  108. package/src/server/serverFns/ai-prompts/activate.ts +2 -1
  109. package/src/server/serverFns/ai-prompts/get.ts +3 -2
  110. package/src/server/serverFns/ai-prompts/list.ts +3 -2
  111. package/src/server/serverFns/ai-prompts/rollback.ts +3 -1
  112. package/src/server/serverFns/ai-prompts/save.ts +5 -3
  113. package/src/server/serverFns/ai-provider/create.ts +4 -1
  114. package/src/server/serverFns/ai-provider/delete.ts +4 -1
  115. package/src/server/serverFns/ai-provider/get.ts +4 -1
  116. package/src/server/serverFns/ai-provider/list.ts +28 -1
  117. package/src/server/serverFns/ai-provider/seed-from-seed.ts +2 -1
  118. package/src/server/serverFns/ai-provider/update.ts +4 -1
  119. package/src/server/serverFns/anyhub/market.ts +8 -1
  120. package/src/server/serverFns/audit.ts +14 -1
  121. package/src/server/serverFns/auth/setup.ts +3 -1
  122. package/src/server/serverFns/compliance.ts +32 -3
  123. package/src/server/serverFns/components/import.ts +69 -14
  124. package/src/server/serverFns/components/list.ts +4 -1
  125. package/src/server/serverFns/components/mutations.ts +9 -1
  126. package/src/server/serverFns/dependency/list.ts +28 -5
  127. package/src/server/serverFns/dependency/sync.ts +7 -2
  128. package/src/server/serverFns/dependency/update.ts +4 -1
  129. package/src/server/serverFns/developer-log-auto-generate.ts +63 -32
  130. package/src/server/serverFns/developer-logs.ts +5 -1
  131. package/src/server/serverFns/invitations.ts +7 -1
  132. package/src/server/serverFns/knowledge-public/bookmarks/create.ts +2 -1
  133. package/src/server/serverFns/knowledge-public/bookmarks/delete.ts +2 -1
  134. package/src/server/serverFns/knowledge-public/bookmarks/detail.ts +2 -1
  135. package/src/server/serverFns/knowledge-public/bookmarks/list.ts +2 -1
  136. package/src/server/serverFns/knowledge-public/bookmarks/sync-all-github.ts +2 -1
  137. package/src/server/serverFns/knowledge-public/bookmarks/update.ts +2 -1
  138. package/src/server/serverFns/knowledge-public/compliance/create.ts +2 -1
  139. package/src/server/serverFns/knowledge-public/compliance/delete.ts +2 -1
  140. package/src/server/serverFns/knowledge-public/compliance/detail.ts +2 -1
  141. package/src/server/serverFns/knowledge-public/compliance/list.ts +2 -1
  142. package/src/server/serverFns/knowledge-public/compliance/update.ts +2 -1
  143. package/src/server/serverFns/knowledge-public/legal/create.ts +2 -1
  144. package/src/server/serverFns/knowledge-public/legal/delete.ts +2 -1
  145. package/src/server/serverFns/knowledge-public/legal/detail.ts +2 -1
  146. package/src/server/serverFns/knowledge-public/legal/list.ts +2 -1
  147. package/src/server/serverFns/knowledge-public/legal/update.ts +2 -1
  148. package/src/server/serverFns/licenses.ts +8 -2
  149. package/src/server/serverFns/monitoring/get-errors.ts +2 -1
  150. package/src/server/serverFns/monitoring/get-health.ts +2 -1
  151. package/src/server/serverFns/monitoring/get-metrics.ts +2 -1
  152. package/src/server/serverFns/monitoring/get-request-logs.ts +2 -1
  153. package/src/server/serverFns/monitoring/report-error.ts +2 -1
  154. package/src/server/serverFns/monitoring/reset.ts +2 -1
  155. package/src/server/serverFns/oauth-providers.ts +4 -1
  156. package/src/server/serverFns/permissions.ts +18 -11
  157. package/src/server/serverFns/sentry/config.ts +11 -8
  158. package/src/server/serverFns/sso-config.ts +17 -2
  159. package/src/server/serverFns/user/create.ts +6 -1
  160. package/src/server/serverFns/user/delete.ts +6 -1
  161. package/src/server/serverFns/user/detail.ts +5 -2
  162. package/src/server/serverFns/user/list.ts +19 -4
  163. package/src/server/serverFns/user/reset-password.ts +10 -2
  164. package/src/server/serverFns/user/update-role.ts +10 -2
  165. package/src/server/serverFns/user/update-status.ts +10 -2
  166. package/src/styles/globals.css +4 -0
  167. package/src/components/data-table/data-table-pagination.tsx +0 -112
  168. package/src/components/data-table/data-table.tsx +0 -218
  169. package/src/components/data-table/table-detail-layout.tsx +0 -98
  170. package/src/components/ui/alert-dialog.tsx +0 -187
  171. package/src/components/ui/alert.tsx +0 -75
  172. package/src/components/ui/avatar.tsx +0 -106
  173. package/src/components/ui/badge.tsx +0 -51
  174. package/src/components/ui/button.tsx +0 -57
  175. package/src/components/ui/card.tsx +0 -102
  176. package/src/components/ui/checkbox.tsx +0 -28
  177. package/src/components/ui/collapsible.tsx +0 -19
  178. package/src/components/ui/dialog.tsx +0 -155
  179. package/src/components/ui/dropdown-menu.tsx +0 -267
  180. package/src/components/ui/field.tsx +0 -236
  181. package/src/components/ui/input-group.tsx +0 -158
  182. package/src/components/ui/input.tsx +0 -19
  183. package/src/components/ui/label.tsx +0 -17
  184. package/src/components/ui/pagination.tsx +0 -130
  185. package/src/components/ui/select.tsx +0 -234
  186. package/src/components/ui/separator.tsx +0 -22
  187. package/src/components/ui/sheet.tsx +0 -135
  188. package/src/components/ui/sidebar.tsx +0 -721
  189. package/src/components/ui/skeleton.tsx +0 -13
  190. package/src/components/ui/switch.tsx +0 -29
  191. package/src/components/ui/table.tsx +0 -115
  192. package/src/components/ui/textarea.tsx +0 -17
  193. package/src/components/ui/toast.tsx +0 -282
  194. package/src/components/ui/tooltip.tsx +0 -63
  195. package/src/hooks/use-mobile.ts +0 -19
  196. package/src/lib/avatar.ts +0 -41
  197. /package/src/routes/{api.auth.$.ts → api/auth/$.ts} +0 -0
  198. /package/src/routes/{api.sentry-test.ts → api/sentry-test.ts} +0 -0
@@ -37,7 +37,7 @@ import { Route as NavPermissionsRouteRouteImport } from './routes/_nav/permissio
37
37
  import { Route as NavSettingsRouteRouteImport } from './routes/_nav/settings/route'
38
38
  import { Route as NavSsoRouteRouteImport } from './routes/_nav/sso/route'
39
39
  import { Route as NavUsersRouteRouteImport } from './routes/_nav/users/route'
40
- import { Route as ApiSentryTestRouteImport } from './routes/api.sentry-test'
40
+ import { Route as ApiSentryTestRouteImport } from './routes/api/sentry-test'
41
41
  import { Route as NavAiPromptsKeyRouteRouteImport } from './routes/_nav/ai-prompts/$key/route'
42
42
  import { Route as NavAiProvidersNewRouteRouteImport } from './routes/_nav/ai-providers/new/route'
43
43
  import { Route as NavBillingInvoicesRouteRouteImport } from './routes/_nav/billing/invoices/route'
@@ -47,9 +47,14 @@ import { Route as NavKnowledgePublicComplianceRouteRouteImport } from './routes/
47
47
  import { Route as NavKnowledgePublicLegalRouteRouteImport } from './routes/_nav/knowledge-public/legal/route'
48
48
  import { Route as NavLicensesLicenseIdRouteRouteImport } from './routes/_nav/licenses/$licenseId/route'
49
49
  import { Route as NavMonitoringAiUsageRouteRouteImport } from './routes/_nav/monitoring/ai-usage/route'
50
+ import { Route as NavMonitoringErrorsRouteRouteImport } from './routes/_nav/monitoring/errors/route'
51
+ import { Route as NavMonitoringHealthRouteRouteImport } from './routes/_nav/monitoring/health/route'
52
+ import { Route as NavMonitoringLogsRouteRouteImport } from './routes/_nav/monitoring/logs/route'
53
+ import { Route as NavMonitoringMetricsRouteRouteImport } from './routes/_nav/monitoring/metrics/route'
54
+ import { Route as NavMonitoringOverviewRouteRouteImport } from './routes/_nav/monitoring/overview/route'
50
55
  import { Route as NavMonitoringSentryRouteRouteImport } from './routes/_nav/monitoring/sentry/route'
51
56
  import { Route as NavUsersUserIdRouteRouteImport } from './routes/_nav/users/$userId/route'
52
- import { Route as ApiAuthSplatRouteImport } from './routes/api.auth.$'
57
+ import { Route as ApiAuthSplatRouteImport } from './routes/api/auth/$'
53
58
  import { Route as ApiComplianceDownloadJobIdRouteImport } from './routes/api/compliance-download/$jobId'
54
59
  import { Route as ApiObservabilityErrorsRouteImport } from './routes/api/observability/errors'
55
60
  import { Route as ApiObservabilityHealthRouteImport } from './routes/api/observability/health'
@@ -63,21 +68,6 @@ const NavAiProvidersIndexRouteLazyRouteImport = createFileRoute(
63
68
  )()
64
69
  const NavLicensesNewRouteLazyRouteImport =
65
70
  createFileRoute('/_nav/licenses/new')()
66
- const NavMonitoringErrorsRouteLazyRouteImport = createFileRoute(
67
- '/_nav/monitoring/errors',
68
- )()
69
- const NavMonitoringHealthRouteLazyRouteImport = createFileRoute(
70
- '/_nav/monitoring/health',
71
- )()
72
- const NavMonitoringLogsRouteLazyRouteImport = createFileRoute(
73
- '/_nav/monitoring/logs',
74
- )()
75
- const NavMonitoringMetricsRouteLazyRouteImport = createFileRoute(
76
- '/_nav/monitoring/metrics',
77
- )()
78
- const NavMonitoringOverviewRouteLazyRouteImport = createFileRoute(
79
- '/_nav/monitoring/overview',
80
- )()
81
71
 
82
72
  const IndexRouteRoute = IndexRouteRouteImport.update({
83
73
  id: '/',
@@ -355,40 +345,39 @@ const NavMonitoringAiUsageRouteRoute =
355
345
  } as any).lazy(() =>
356
346
  import('./routes/_nav/monitoring/ai-usage/route.lazy').then((d) => d.Route),
357
347
  )
358
- const NavMonitoringErrorsRouteLazyRoute =
359
- NavMonitoringErrorsRouteLazyRouteImport.update({
348
+ const NavMonitoringErrorsRouteRoute =
349
+ NavMonitoringErrorsRouteRouteImport.update({
360
350
  id: '/errors',
361
351
  path: '/errors',
362
352
  getParentRoute: () => NavMonitoringRouteRoute,
363
353
  } as any).lazy(() =>
364
354
  import('./routes/_nav/monitoring/errors/route.lazy').then((d) => d.Route),
365
355
  )
366
- const NavMonitoringHealthRouteLazyRoute =
367
- NavMonitoringHealthRouteLazyRouteImport.update({
356
+ const NavMonitoringHealthRouteRoute =
357
+ NavMonitoringHealthRouteRouteImport.update({
368
358
  id: '/health',
369
359
  path: '/health',
370
360
  getParentRoute: () => NavMonitoringRouteRoute,
371
361
  } as any).lazy(() =>
372
362
  import('./routes/_nav/monitoring/health/route.lazy').then((d) => d.Route),
373
363
  )
374
- const NavMonitoringLogsRouteLazyRoute =
375
- NavMonitoringLogsRouteLazyRouteImport.update({
376
- id: '/logs',
377
- path: '/logs',
378
- getParentRoute: () => NavMonitoringRouteRoute,
379
- } as any).lazy(() =>
380
- import('./routes/_nav/monitoring/logs/route.lazy').then((d) => d.Route),
381
- )
382
- const NavMonitoringMetricsRouteLazyRoute =
383
- NavMonitoringMetricsRouteLazyRouteImport.update({
364
+ const NavMonitoringLogsRouteRoute = NavMonitoringLogsRouteRouteImport.update({
365
+ id: '/logs',
366
+ path: '/logs',
367
+ getParentRoute: () => NavMonitoringRouteRoute,
368
+ } as any).lazy(() =>
369
+ import('./routes/_nav/monitoring/logs/route.lazy').then((d) => d.Route),
370
+ )
371
+ const NavMonitoringMetricsRouteRoute =
372
+ NavMonitoringMetricsRouteRouteImport.update({
384
373
  id: '/metrics',
385
374
  path: '/metrics',
386
375
  getParentRoute: () => NavMonitoringRouteRoute,
387
376
  } as any).lazy(() =>
388
377
  import('./routes/_nav/monitoring/metrics/route.lazy').then((d) => d.Route),
389
378
  )
390
- const NavMonitoringOverviewRouteLazyRoute =
391
- NavMonitoringOverviewRouteLazyRouteImport.update({
379
+ const NavMonitoringOverviewRouteRoute =
380
+ NavMonitoringOverviewRouteRouteImport.update({
392
381
  id: '/overview',
393
382
  path: '/overview',
394
383
  getParentRoute: () => NavMonitoringRouteRoute,
@@ -488,6 +477,11 @@ export interface FileRoutesByFullPath {
488
477
  '/knowledge-public/legal': typeof NavKnowledgePublicLegalRouteRoute
489
478
  '/licenses/$licenseId': typeof NavLicensesLicenseIdRouteRoute
490
479
  '/monitoring/ai-usage': typeof NavMonitoringAiUsageRouteRoute
480
+ '/monitoring/errors': typeof NavMonitoringErrorsRouteRoute
481
+ '/monitoring/health': typeof NavMonitoringHealthRouteRoute
482
+ '/monitoring/logs': typeof NavMonitoringLogsRouteRoute
483
+ '/monitoring/metrics': typeof NavMonitoringMetricsRouteRoute
484
+ '/monitoring/overview': typeof NavMonitoringOverviewRouteRoute
491
485
  '/monitoring/sentry': typeof NavMonitoringSentryRouteRoute
492
486
  '/users/$userId': typeof NavUsersUserIdRouteRoute
493
487
  '/api/auth/$': typeof ApiAuthSplatRoute
@@ -497,11 +491,6 @@ export interface FileRoutesByFullPath {
497
491
  '/ai-prompts/': typeof NavAiPromptsIndexRouteLazyRoute
498
492
  '/ai-providers/': typeof NavAiProvidersIndexRouteLazyRoute
499
493
  '/licenses/new': typeof NavLicensesNewRouteLazyRoute
500
- '/monitoring/errors': typeof NavMonitoringErrorsRouteLazyRoute
501
- '/monitoring/health': typeof NavMonitoringHealthRouteLazyRoute
502
- '/monitoring/logs': typeof NavMonitoringLogsRouteLazyRoute
503
- '/monitoring/metrics': typeof NavMonitoringMetricsRouteLazyRoute
504
- '/monitoring/overview': typeof NavMonitoringOverviewRouteLazyRoute
505
494
  '/ai-providers/$id/edit': typeof NavAiProvidersIdEditRouteRoute
506
495
  '/billing/subscriptions/$subscriptionId': typeof NavBillingSubscriptionsSubscriptionIdRouteRoute
507
496
  }
@@ -539,6 +528,11 @@ export interface FileRoutesByTo {
539
528
  '/knowledge-public/legal': typeof NavKnowledgePublicLegalRouteRoute
540
529
  '/licenses/$licenseId': typeof NavLicensesLicenseIdRouteRoute
541
530
  '/monitoring/ai-usage': typeof NavMonitoringAiUsageRouteRoute
531
+ '/monitoring/errors': typeof NavMonitoringErrorsRouteRoute
532
+ '/monitoring/health': typeof NavMonitoringHealthRouteRoute
533
+ '/monitoring/logs': typeof NavMonitoringLogsRouteRoute
534
+ '/monitoring/metrics': typeof NavMonitoringMetricsRouteRoute
535
+ '/monitoring/overview': typeof NavMonitoringOverviewRouteRoute
542
536
  '/monitoring/sentry': typeof NavMonitoringSentryRouteRoute
543
537
  '/users/$userId': typeof NavUsersUserIdRouteRoute
544
538
  '/api/auth/$': typeof ApiAuthSplatRoute
@@ -548,11 +542,6 @@ export interface FileRoutesByTo {
548
542
  '/ai-prompts': typeof NavAiPromptsIndexRouteLazyRoute
549
543
  '/ai-providers': typeof NavAiProvidersIndexRouteLazyRoute
550
544
  '/licenses/new': typeof NavLicensesNewRouteLazyRoute
551
- '/monitoring/errors': typeof NavMonitoringErrorsRouteLazyRoute
552
- '/monitoring/health': typeof NavMonitoringHealthRouteLazyRoute
553
- '/monitoring/logs': typeof NavMonitoringLogsRouteLazyRoute
554
- '/monitoring/metrics': typeof NavMonitoringMetricsRouteLazyRoute
555
- '/monitoring/overview': typeof NavMonitoringOverviewRouteLazyRoute
556
545
  '/ai-providers/$id/edit': typeof NavAiProvidersIdEditRouteRoute
557
546
  '/billing/subscriptions/$subscriptionId': typeof NavBillingSubscriptionsSubscriptionIdRouteRoute
558
547
  }
@@ -594,6 +583,11 @@ export interface FileRoutesById {
594
583
  '/_nav/knowledge-public/legal': typeof NavKnowledgePublicLegalRouteRoute
595
584
  '/_nav/licenses/$licenseId': typeof NavLicensesLicenseIdRouteRoute
596
585
  '/_nav/monitoring/ai-usage': typeof NavMonitoringAiUsageRouteRoute
586
+ '/_nav/monitoring/errors': typeof NavMonitoringErrorsRouteRoute
587
+ '/_nav/monitoring/health': typeof NavMonitoringHealthRouteRoute
588
+ '/_nav/monitoring/logs': typeof NavMonitoringLogsRouteRoute
589
+ '/_nav/monitoring/metrics': typeof NavMonitoringMetricsRouteRoute
590
+ '/_nav/monitoring/overview': typeof NavMonitoringOverviewRouteRoute
597
591
  '/_nav/monitoring/sentry': typeof NavMonitoringSentryRouteRoute
598
592
  '/_nav/users/$userId': typeof NavUsersUserIdRouteRoute
599
593
  '/api/auth/$': typeof ApiAuthSplatRoute
@@ -603,11 +597,6 @@ export interface FileRoutesById {
603
597
  '/_nav/ai-prompts/': typeof NavAiPromptsIndexRouteLazyRoute
604
598
  '/_nav/ai-providers/': typeof NavAiProvidersIndexRouteLazyRoute
605
599
  '/_nav/licenses/new': typeof NavLicensesNewRouteLazyRoute
606
- '/_nav/monitoring/errors': typeof NavMonitoringErrorsRouteLazyRoute
607
- '/_nav/monitoring/health': typeof NavMonitoringHealthRouteLazyRoute
608
- '/_nav/monitoring/logs': typeof NavMonitoringLogsRouteLazyRoute
609
- '/_nav/monitoring/metrics': typeof NavMonitoringMetricsRouteLazyRoute
610
- '/_nav/monitoring/overview': typeof NavMonitoringOverviewRouteLazyRoute
611
600
  '/_nav/ai-providers/$id/edit': typeof NavAiProvidersIdEditRouteRoute
612
601
  '/_nav/billing/subscriptions/$subscriptionId': typeof NavBillingSubscriptionsSubscriptionIdRouteRoute
613
602
  }
@@ -649,6 +638,11 @@ export interface FileRouteTypes {
649
638
  | '/knowledge-public/legal'
650
639
  | '/licenses/$licenseId'
651
640
  | '/monitoring/ai-usage'
641
+ | '/monitoring/errors'
642
+ | '/monitoring/health'
643
+ | '/monitoring/logs'
644
+ | '/monitoring/metrics'
645
+ | '/monitoring/overview'
652
646
  | '/monitoring/sentry'
653
647
  | '/users/$userId'
654
648
  | '/api/auth/$'
@@ -658,11 +652,6 @@ export interface FileRouteTypes {
658
652
  | '/ai-prompts/'
659
653
  | '/ai-providers/'
660
654
  | '/licenses/new'
661
- | '/monitoring/errors'
662
- | '/monitoring/health'
663
- | '/monitoring/logs'
664
- | '/monitoring/metrics'
665
- | '/monitoring/overview'
666
655
  | '/ai-providers/$id/edit'
667
656
  | '/billing/subscriptions/$subscriptionId'
668
657
  fileRoutesByTo: FileRoutesByTo
@@ -700,6 +689,11 @@ export interface FileRouteTypes {
700
689
  | '/knowledge-public/legal'
701
690
  | '/licenses/$licenseId'
702
691
  | '/monitoring/ai-usage'
692
+ | '/monitoring/errors'
693
+ | '/monitoring/health'
694
+ | '/monitoring/logs'
695
+ | '/monitoring/metrics'
696
+ | '/monitoring/overview'
703
697
  | '/monitoring/sentry'
704
698
  | '/users/$userId'
705
699
  | '/api/auth/$'
@@ -709,11 +703,6 @@ export interface FileRouteTypes {
709
703
  | '/ai-prompts'
710
704
  | '/ai-providers'
711
705
  | '/licenses/new'
712
- | '/monitoring/errors'
713
- | '/monitoring/health'
714
- | '/monitoring/logs'
715
- | '/monitoring/metrics'
716
- | '/monitoring/overview'
717
706
  | '/ai-providers/$id/edit'
718
707
  | '/billing/subscriptions/$subscriptionId'
719
708
  id:
@@ -754,6 +743,11 @@ export interface FileRouteTypes {
754
743
  | '/_nav/knowledge-public/legal'
755
744
  | '/_nav/licenses/$licenseId'
756
745
  | '/_nav/monitoring/ai-usage'
746
+ | '/_nav/monitoring/errors'
747
+ | '/_nav/monitoring/health'
748
+ | '/_nav/monitoring/logs'
749
+ | '/_nav/monitoring/metrics'
750
+ | '/_nav/monitoring/overview'
757
751
  | '/_nav/monitoring/sentry'
758
752
  | '/_nav/users/$userId'
759
753
  | '/api/auth/$'
@@ -763,11 +757,6 @@ export interface FileRouteTypes {
763
757
  | '/_nav/ai-prompts/'
764
758
  | '/_nav/ai-providers/'
765
759
  | '/_nav/licenses/new'
766
- | '/_nav/monitoring/errors'
767
- | '/_nav/monitoring/health'
768
- | '/_nav/monitoring/logs'
769
- | '/_nav/monitoring/metrics'
770
- | '/_nav/monitoring/overview'
771
760
  | '/_nav/ai-providers/$id/edit'
772
761
  | '/_nav/billing/subscriptions/$subscriptionId'
773
762
  fileRoutesById: FileRoutesById
@@ -1064,35 +1053,35 @@ declare module '@tanstack/react-router' {
1064
1053
  id: '/_nav/monitoring/errors'
1065
1054
  path: '/errors'
1066
1055
  fullPath: '/monitoring/errors'
1067
- preLoaderRoute: typeof NavMonitoringErrorsRouteLazyRouteImport
1056
+ preLoaderRoute: typeof NavMonitoringErrorsRouteRouteImport
1068
1057
  parentRoute: typeof NavMonitoringRouteRoute
1069
1058
  }
1070
1059
  '/_nav/monitoring/health': {
1071
1060
  id: '/_nav/monitoring/health'
1072
1061
  path: '/health'
1073
1062
  fullPath: '/monitoring/health'
1074
- preLoaderRoute: typeof NavMonitoringHealthRouteLazyRouteImport
1063
+ preLoaderRoute: typeof NavMonitoringHealthRouteRouteImport
1075
1064
  parentRoute: typeof NavMonitoringRouteRoute
1076
1065
  }
1077
1066
  '/_nav/monitoring/logs': {
1078
1067
  id: '/_nav/monitoring/logs'
1079
1068
  path: '/logs'
1080
1069
  fullPath: '/monitoring/logs'
1081
- preLoaderRoute: typeof NavMonitoringLogsRouteLazyRouteImport
1070
+ preLoaderRoute: typeof NavMonitoringLogsRouteRouteImport
1082
1071
  parentRoute: typeof NavMonitoringRouteRoute
1083
1072
  }
1084
1073
  '/_nav/monitoring/metrics': {
1085
1074
  id: '/_nav/monitoring/metrics'
1086
1075
  path: '/metrics'
1087
1076
  fullPath: '/monitoring/metrics'
1088
- preLoaderRoute: typeof NavMonitoringMetricsRouteLazyRouteImport
1077
+ preLoaderRoute: typeof NavMonitoringMetricsRouteRouteImport
1089
1078
  parentRoute: typeof NavMonitoringRouteRoute
1090
1079
  }
1091
1080
  '/_nav/monitoring/overview': {
1092
1081
  id: '/_nav/monitoring/overview'
1093
1082
  path: '/overview'
1094
1083
  fullPath: '/monitoring/overview'
1095
- preLoaderRoute: typeof NavMonitoringOverviewRouteLazyRouteImport
1084
+ preLoaderRoute: typeof NavMonitoringOverviewRouteRouteImport
1096
1085
  parentRoute: typeof NavMonitoringRouteRoute
1097
1086
  }
1098
1087
  '/_nav/monitoring/sentry': {
@@ -1227,22 +1216,22 @@ const NavLicensesRouteRouteWithChildren =
1227
1216
 
1228
1217
  interface NavMonitoringRouteRouteChildren {
1229
1218
  NavMonitoringAiUsageRouteRoute: typeof NavMonitoringAiUsageRouteRoute
1219
+ NavMonitoringErrorsRouteRoute: typeof NavMonitoringErrorsRouteRoute
1220
+ NavMonitoringHealthRouteRoute: typeof NavMonitoringHealthRouteRoute
1221
+ NavMonitoringLogsRouteRoute: typeof NavMonitoringLogsRouteRoute
1222
+ NavMonitoringMetricsRouteRoute: typeof NavMonitoringMetricsRouteRoute
1223
+ NavMonitoringOverviewRouteRoute: typeof NavMonitoringOverviewRouteRoute
1230
1224
  NavMonitoringSentryRouteRoute: typeof NavMonitoringSentryRouteRoute
1231
- NavMonitoringErrorsRouteLazyRoute: typeof NavMonitoringErrorsRouteLazyRoute
1232
- NavMonitoringHealthRouteLazyRoute: typeof NavMonitoringHealthRouteLazyRoute
1233
- NavMonitoringLogsRouteLazyRoute: typeof NavMonitoringLogsRouteLazyRoute
1234
- NavMonitoringMetricsRouteLazyRoute: typeof NavMonitoringMetricsRouteLazyRoute
1235
- NavMonitoringOverviewRouteLazyRoute: typeof NavMonitoringOverviewRouteLazyRoute
1236
1225
  }
1237
1226
 
1238
1227
  const NavMonitoringRouteRouteChildren: NavMonitoringRouteRouteChildren = {
1239
1228
  NavMonitoringAiUsageRouteRoute: NavMonitoringAiUsageRouteRoute,
1229
+ NavMonitoringErrorsRouteRoute: NavMonitoringErrorsRouteRoute,
1230
+ NavMonitoringHealthRouteRoute: NavMonitoringHealthRouteRoute,
1231
+ NavMonitoringLogsRouteRoute: NavMonitoringLogsRouteRoute,
1232
+ NavMonitoringMetricsRouteRoute: NavMonitoringMetricsRouteRoute,
1233
+ NavMonitoringOverviewRouteRoute: NavMonitoringOverviewRouteRoute,
1240
1234
  NavMonitoringSentryRouteRoute: NavMonitoringSentryRouteRoute,
1241
- NavMonitoringErrorsRouteLazyRoute: NavMonitoringErrorsRouteLazyRoute,
1242
- NavMonitoringHealthRouteLazyRoute: NavMonitoringHealthRouteLazyRoute,
1243
- NavMonitoringLogsRouteLazyRoute: NavMonitoringLogsRouteLazyRoute,
1244
- NavMonitoringMetricsRouteLazyRoute: NavMonitoringMetricsRouteLazyRoute,
1245
- NavMonitoringOverviewRouteLazyRoute: NavMonitoringOverviewRouteLazyRoute,
1246
1235
  }
1247
1236
 
1248
1237
  const NavMonitoringRouteRouteWithChildren =
@@ -21,7 +21,7 @@ import globalsCss from '../styles/globals.css?url'
21
21
  import type { RouterContext } from '@/lib/router-context'
22
22
  import type { AppLocale } from '@/lib/i18n/config'
23
23
  import { Providers } from '@/providers'
24
- import { Toaster } from '@/components/ui/toast'
24
+ import { Toaster } from '@allbluecn/ui/toast'
25
25
  import { getSessionFn } from '@/server/serverFns/auth/session'
26
26
  import { getLocaleFn } from '@/server/serverFns/locale'
27
27
  import { reportClientError } from '@/server/serverFns/monitoring/report-error'
@@ -103,7 +103,7 @@ function RootComponent() {
103
103
  <body className="w-full h-full min-h-screen antialiased">
104
104
  <Providers>
105
105
  <Outlet />
106
- <Toaster />
106
+ <Toaster position="bottom-right" />
107
107
  </Providers>
108
108
  <Scripts />
109
109
  </body>
@@ -127,8 +127,8 @@ function NotFoundPageInner() {
127
127
  )
128
128
  }
129
129
 
130
- function ErrorBoundary({ error }: { error: Error }) {
131
- return <ErrorBoundaryInner error={error} />
130
+ function ErrorBoundary({ error }: { error: unknown }) {
131
+ return <ErrorBoundaryInner error={error instanceof Error ? error : new Error(String(error))} />
132
132
  }
133
133
 
134
134
  function ErrorBoundaryInner({ error }: { error: Error }) {
@@ -18,7 +18,7 @@
18
18
  import { createLazyFileRoute } from '@tanstack/react-router'
19
19
  import { m } from '@/paraglide/messages.js'
20
20
  import type React from 'react'
21
- import { Badge } from '@/components/ui/badge'
21
+ import { Badge } from '@allbluecn/ui/badge'
22
22
 
23
23
  export const Route = createLazyFileRoute('/_nav/audit')({
24
24
  pendingComponent: () => (
@@ -38,7 +38,6 @@ function AuditLogPage(): React.ReactElement {
38
38
  resourceId: string | null
39
39
  userId: string | null
40
40
  workspaceId: string | null
41
- metadata: Record<string, unknown>
42
41
  ip: string | null
43
42
  userAgent: string | null
44
43
  createdAt: string
@@ -19,11 +19,11 @@ import { createLazyFileRoute } from '@tanstack/react-router'
19
19
  import { m } from '@/paraglide/messages.js'
20
20
  import { useQuery, useQueryClient } from '@tanstack/react-query'
21
21
  import { useServerFn } from '@tanstack/react-start'
22
- import { toast } from '@/components/ui/toast'
22
+ import { toast } from '@allbluecn/ui/toast'
23
23
  import type React from 'react'
24
24
  import { listComplianceExportsFn, executeComplianceJobFn } from '@/server/serverFns/compliance'
25
- import { Badge } from '@/components/ui/badge'
26
- import { Button } from '@/components/ui/button'
25
+ import { Badge } from '@allbluecn/ui/badge'
26
+ import { Button } from '@allbluecn/ui/button'
27
27
  import { Loader2 } from 'lucide-react'
28
28
 
29
29
  export const Route = createLazyFileRoute('/_nav/compliance')({
@@ -156,6 +156,8 @@ function CompliancePage(): React.ReactElement {
156
156
  </span>
157
157
  )}
158
158
  {item.status === 'completed' && !isExpired(item) && (
159
+ // 豁免原生 <a>:文件下载语义(download 属性触发浏览器下载而非路由导航),
160
+ // TanStack <Link> 不支持 download,替换会丢失下载行为
159
161
  <a
160
162
  href={`/api/compliance-download/${item.id}`}
161
163
  download={`allblue-export-${item.id}.json`}
@@ -15,28 +15,18 @@
15
15
  // You should have received a copy of the GNU Affero General Public License
16
16
  // along with this program. If not, see <https://www.gnu.org/licenses/>.
17
17
 
18
- import { useState, useEffect } from 'react'
18
+ import { useState } from 'react'
19
19
  import { createLazyFileRoute, useNavigate, useRouter } from '@tanstack/react-router'
20
- import { BUILTIN_COMPONENTS, registerComponents, unregisterComponent } from '@allbluecn/web-app/prototype'
21
20
  import { Plus, Search, Download } from 'lucide-react'
22
- import { Button } from '@/components/ui/button'
23
- import { Input } from '@/components/ui/input'
24
- import {
25
- AlertDialog,
26
- AlertDialogAction,
27
- AlertDialogCancel,
28
- AlertDialogContent,
29
- AlertDialogDescription,
30
- AlertDialogFooter,
31
- AlertDialogHeader,
32
- AlertDialogTitle,
33
- } from '@/components/ui/alert-dialog'
21
+ import { Button } from '@allbluecn/ui/button'
22
+ import { Input } from '@allbluecn/ui/input'
23
+ import { ConfirmDialog } from '@allbluecn/ui/components/confirm-dialog'
34
24
  import { cn } from '@/lib/utils'
35
25
  import { ComponentTable, type ComponentItem } from '@/components/component/component-table'
36
26
  import { ComponentFormDialog } from '@/components/component/component-form-dialog'
37
27
  import { ComponentImportDialog } from '@/components/component/component-import-dialog'
38
28
  import { deleteComponentFn } from '@/server/serverFns/components/mutations'
39
- import { toast } from '@/components/ui/toast'
29
+ import { toast } from '@allbluecn/ui/toast'
40
30
 
41
31
  const CATEGORY_TABS = [
42
32
  { key: 'all', label: '全部' },
@@ -60,11 +50,6 @@ function ComponentsPage() {
60
50
  const navigate = useNavigate({ from: '/components' })
61
51
  const router = useRouter()
62
52
 
63
- useEffect(() => {
64
- registerComponents(BUILTIN_COMPONENTS)
65
- return () => { BUILTIN_COMPONENTS.forEach((c) => unregisterComponent(c.type)) }
66
- }, [])
67
-
68
53
  const [searchInput, setSearchInput] = useState(urlSearch ?? '')
69
54
  const [createOpen, setCreateOpen] = useState(false)
70
55
  const [editing, setEditing] = useState<ComponentItem | null>(null)
@@ -165,20 +150,15 @@ function ComponentsPage() {
165
150
  onSuccess={() => router.invalidate()}
166
151
  />
167
152
 
168
- <AlertDialog open={!!deleting} onOpenChange={(o: boolean) => !o && setDeleting(null)}>
169
- <AlertDialogContent>
170
- <AlertDialogHeader>
171
- <AlertDialogTitle>删除组件「{deleting?.name}」?</AlertDialogTitle>
172
- <AlertDialogDescription>
173
- 组件将被标记为已删除(软删除),不影响已使用该组件的原型页面。可在数据库中恢复。
174
- </AlertDialogDescription>
175
- </AlertDialogHeader>
176
- <AlertDialogFooter>
177
- <AlertDialogCancel>取消</AlertDialogCancel>
178
- <AlertDialogAction onClick={handleDelete}>删除</AlertDialogAction>
179
- </AlertDialogFooter>
180
- </AlertDialogContent>
181
- </AlertDialog>
153
+ <ConfirmDialog
154
+ open={!!deleting}
155
+ onOpenChange={(o: boolean) => !o && setDeleting(null)}
156
+ title={<>删除组件「{deleting?.name}」?</>}
157
+ description="组件将被标记为已删除(软删除),不影响已使用该组件的原型页面。可在数据库中恢复。"
158
+ cancelLabel="取消"
159
+ confirmLabel="删除"
160
+ onConfirm={handleDelete}
161
+ />
182
162
  </div>
183
163
  )
184
164
  }
@@ -37,21 +37,12 @@ import {
37
37
  const categoryIconMap: Record<string, LucideIcon> = {
38
38
  Folder, Globe, Code, Book, BookOpen,
39
39
  }
40
- import { DataTable, type AdminColumnDef } from '@/components/data-table/data-table'
41
- import { Button } from '@/components/ui/button'
42
- import { Input } from '@/components/ui/input'
43
- import { Badge } from '@/components/ui/badge'
44
- import {
45
- AlertDialog,
46
- AlertDialogAction,
47
- AlertDialogCancel,
48
- AlertDialogContent,
49
- AlertDialogDescription,
50
- AlertDialogFooter,
51
- AlertDialogHeader,
52
- AlertDialogTitle,
53
- } from '@/components/ui/alert-dialog'
54
- import { toast } from '@/components/ui/toast'
40
+ import { DataTable, type AdminColumnDef } from '@allbluecn/ui/data-table'
41
+ import { Button } from '@allbluecn/ui/button'
42
+ import { Input } from '@allbluecn/ui/input'
43
+ import { Badge } from '@allbluecn/ui/badge'
44
+ import { ConfirmDialog } from '@allbluecn/ui/components/confirm-dialog'
45
+ import { toast } from '@allbluecn/ui/toast'
55
46
  import {
56
47
  BookmarkFormDialog,
57
48
  type BookmarkRow,
@@ -326,29 +317,18 @@ function BookmarksPage() {
326
317
  onSuccess={refresh}
327
318
  />
328
319
 
329
- <AlertDialog open={!!deleting} onOpenChange={(o: boolean) => !o && setDeleting(null)}>
330
- <AlertDialogContent>
331
- <AlertDialogHeader>
332
- <AlertDialogTitle>{m.common_knowledgePublic_bookmarks_deleteConfirmTitle()}</AlertDialogTitle>
333
- <AlertDialogDescription>
334
- {m.common_knowledgePublic_bookmarks_deleteConfirmDesc({ title: deleting?.title ?? '' })}
335
- </AlertDialogDescription>
336
- </AlertDialogHeader>
337
- <AlertDialogFooter>
338
- <AlertDialogCancel disabled={deletePending}>{m.common_common_cancel()}</AlertDialogCancel>
339
- <AlertDialogAction
340
- onClick={(e: React.MouseEvent) => {
341
- e.preventDefault()
342
- confirmDelete()
343
- }}
344
- disabled={deletePending}
345
- className="bg-destructive text-destructive-foreground hover:bg-destructive/90"
346
- >
347
- {deletePending ? m.common_common_deleting() : m.common_common_delete()}
348
- </AlertDialogAction>
349
- </AlertDialogFooter>
350
- </AlertDialogContent>
351
- </AlertDialog>
320
+ <ConfirmDialog
321
+ open={!!deleting}
322
+ onOpenChange={(o: boolean) => !o && setDeleting(null)}
323
+ title={m.common_knowledgePublic_bookmarks_deleteConfirmTitle()}
324
+ description={m.common_knowledgePublic_bookmarks_deleteConfirmDesc({ title: deleting?.title ?? '' })}
325
+ cancelLabel={m.common_common_cancel()}
326
+ confirmLabel={deletePending ? m.common_common_deleting() : m.common_common_delete()}
327
+ confirmClassName="bg-destructive text-destructive-foreground hover:bg-destructive/90"
328
+ confirmDisabled={deletePending}
329
+ cancelDisabled={deletePending}
330
+ onConfirm={confirmDelete}
331
+ />
352
332
  </div>
353
333
  )
354
334
  }
@@ -19,21 +19,12 @@ import { createLazyFileRoute, useNavigate, useRouter } from '@tanstack/react-rou
19
19
  import { m } from '@/paraglide/messages.js'
20
20
  import { useState, useTransition } from 'react'
21
21
  import { PlusIcon, PencilIcon, Trash2Icon, SearchIcon } from 'lucide-react'
22
- import { DataTable, type AdminColumnDef } from '@/components/data-table/data-table'
23
- import { Button } from '@/components/ui/button'
24
- import { Input } from '@/components/ui/input'
25
- import { Badge } from '@/components/ui/badge'
26
- import {
27
- AlertDialog,
28
- AlertDialogAction,
29
- AlertDialogCancel,
30
- AlertDialogContent,
31
- AlertDialogDescription,
32
- AlertDialogFooter,
33
- AlertDialogHeader,
34
- AlertDialogTitle,
35
- } from '@/components/ui/alert-dialog'
36
- import { toast } from '@/components/ui/toast'
22
+ import { DataTable, type AdminColumnDef } from '@allbluecn/ui/data-table'
23
+ import { Button } from '@allbluecn/ui/button'
24
+ import { Input } from '@allbluecn/ui/input'
25
+ import { Badge } from '@allbluecn/ui/badge'
26
+ import { ConfirmDialog } from '@allbluecn/ui/components/confirm-dialog'
27
+ import { toast } from '@allbluecn/ui/toast'
37
28
  import {
38
29
  ComplianceFormDialog,
39
30
  type ComplianceRow,
@@ -216,29 +207,18 @@ function CompliancePage() {
216
207
  onSuccess={refresh}
217
208
  />
218
209
 
219
- <AlertDialog open={!!deleting} onOpenChange={(o: boolean) => !o && setDeleting(null)}>
220
- <AlertDialogContent>
221
- <AlertDialogHeader>
222
- <AlertDialogTitle>{m.common_knowledgePublic_compliance_deleteConfirmTitle()}</AlertDialogTitle>
223
- <AlertDialogDescription>
224
- {m.common_knowledgePublic_compliance_deleteConfirmDesc({ title: deleting?.title ?? '' })}
225
- </AlertDialogDescription>
226
- </AlertDialogHeader>
227
- <AlertDialogFooter>
228
- <AlertDialogCancel disabled={deletePending}>{m.common_common_cancel()}</AlertDialogCancel>
229
- <AlertDialogAction
230
- onClick={(e: React.MouseEvent) => {
231
- e.preventDefault()
232
- confirmDelete()
233
- }}
234
- disabled={deletePending}
235
- className="bg-destructive text-destructive-foreground hover:bg-destructive/90"
236
- >
237
- {deletePending ? m.common_common_deleting() : m.common_common_delete()}
238
- </AlertDialogAction>
239
- </AlertDialogFooter>
240
- </AlertDialogContent>
241
- </AlertDialog>
210
+ <ConfirmDialog
211
+ open={!!deleting}
212
+ onOpenChange={(o: boolean) => !o && setDeleting(null)}
213
+ title={m.common_knowledgePublic_compliance_deleteConfirmTitle()}
214
+ description={m.common_knowledgePublic_compliance_deleteConfirmDesc({ title: deleting?.title ?? '' })}
215
+ cancelLabel={m.common_common_cancel()}
216
+ confirmLabel={deletePending ? m.common_common_deleting() : m.common_common_delete()}
217
+ confirmClassName="bg-destructive text-destructive-foreground hover:bg-destructive/90"
218
+ confirmDisabled={deletePending}
219
+ cancelDisabled={deletePending}
220
+ onConfirm={confirmDelete}
221
+ />
242
222
  </div>
243
223
  )
244
224
  }
@@ -19,10 +19,10 @@ import { createLazyFileRoute, useNavigate, useRouter } from '@tanstack/react-rou
19
19
  import { m } from '@/paraglide/messages.js'
20
20
  import { useState, useTransition } from 'react'
21
21
  import { PlusIcon, PencilIcon, Trash2Icon, SearchIcon } from 'lucide-react'
22
- import { DataTable, type AdminColumnDef } from '@/components/data-table/data-table'
23
- import { Button } from '@/components/ui/button'
24
- import { Input } from '@/components/ui/input'
25
- import { Badge } from '@/components/ui/badge'
22
+ import { DataTable, type AdminColumnDef } from '@allbluecn/ui/data-table'
23
+ import { Button } from '@allbluecn/ui/button'
24
+ import { Input } from '@allbluecn/ui/input'
25
+ import { Badge } from '@allbluecn/ui/badge'
26
26
  import {
27
27
  AlertDialog,
28
28
  AlertDialogAction,
@@ -32,8 +32,8 @@ import {
32
32
  AlertDialogFooter,
33
33
  AlertDialogHeader,
34
34
  AlertDialogTitle,
35
- } from '@/components/ui/alert-dialog'
36
- import { toast } from '@/components/ui/toast'
35
+ } from '@allbluecn/ui/alert-dialog'
36
+ import { toast } from '@allbluecn/ui/toast'
37
37
  import { LegalFormDialog, type LegalRow } from '@/components/knowledge-public/legal-form-dialog'
38
38
  import { adminDeleteLegalFn } from '@/server/serverFns/knowledge-public/legal/delete'
39
39
 
@@ -18,10 +18,10 @@
18
18
  import { createLazyFileRoute, Link, useNavigate } from '@tanstack/react-router'
19
19
  import { m } from '@/paraglide/messages.js'
20
20
  import { useServerFn } from '@tanstack/react-start'
21
- import { toast } from '@/components/ui/toast'
21
+ import { toast } from '@allbluecn/ui/toast'
22
22
  import type React from 'react'
23
- import { Button } from '@/components/ui/button'
24
- import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'
23
+ import { Button } from '@allbluecn/ui/button'
24
+ import { Card, CardContent, CardHeader, CardTitle } from '@allbluecn/ui/card'
25
25
  import { revokeLicenseFn } from '@/server/serverFns/licenses'
26
26
 
27
27
  export const Route = createLazyFileRoute('/_nav/licenses/$licenseId')({