@burdenoff/microfe-admin 2026.624.1 → 2026.626.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.
- package/dist/admin/components/AccessDenied.js +2 -2
- package/dist/admin/components/AccessDenied.js.map +1 -1
- package/dist/admin/components/ActivityFeed.js +4 -4
- package/dist/admin/components/ActivityFeed.js.map +1 -1
- package/dist/admin/components/Charts.js.map +1 -1
- package/dist/admin/components/ConfirmDialog.js +1 -1
- package/dist/admin/components/ConfirmDialog.js.map +1 -1
- package/dist/admin/components/DataTable.js +5 -5
- package/dist/admin/components/DataTable.js.map +1 -1
- package/dist/admin/components/FormSheet.js +1 -1
- package/dist/admin/components/FormSheet.js.map +1 -1
- package/dist/admin/components/MetricCard.js +40 -37
- package/dist/admin/components/MetricCard.js.map +1 -1
- package/dist/admin/components/PageLayout.js +28 -22
- package/dist/admin/components/PageLayout.js.map +1 -1
- package/dist/admin/components/TenantSsoPanel.js +1 -1
- package/dist/admin/components/TenantSsoPanel.js.map +1 -1
- package/dist/admin/components/Toast.js +11 -11
- package/dist/admin/components/Toast.js.map +1 -1
- package/dist/admin/components/forms/SubscriptionForm.js +2 -2
- package/dist/admin/components/forms/SubscriptionForm.js.map +1 -1
- package/dist/admin/components/forms/TenantForm.js +1 -1
- package/dist/admin/components/forms/UserForm.js +1 -1
- package/dist/admin/components/ui.js +48 -41
- package/dist/admin/components/ui.js.map +1 -1
- package/dist/admin/constants/index.js +33 -24
- package/dist/admin/constants/index.js.map +1 -1
- package/dist/admin/pages/AuditLogsPage.js +94 -77
- package/dist/admin/pages/AuditLogsPage.js.map +1 -1
- package/dist/admin/pages/BillingPage.js +70 -18
- package/dist/admin/pages/BillingPage.js.map +1 -1
- package/dist/admin/pages/CommunicationsPage.js +98 -90
- package/dist/admin/pages/CommunicationsPage.js.map +1 -1
- package/dist/admin/pages/ContentPagesPage.js +276 -259
- package/dist/admin/pages/ContentPagesPage.js.map +1 -1
- package/dist/admin/pages/DashboardPage.js +114 -82
- package/dist/admin/pages/DashboardPage.js.map +1 -1
- package/dist/admin/pages/FeatureFlagsPage.js +94 -74
- package/dist/admin/pages/FeatureFlagsPage.js.map +1 -1
- package/dist/admin/pages/OrganizationsListPage.js +106 -86
- package/dist/admin/pages/OrganizationsListPage.js.map +1 -1
- package/dist/admin/pages/ProductsPage.js +139 -128
- package/dist/admin/pages/ProductsPage.js.map +1 -1
- package/dist/admin/pages/ReferralsPage.js +74 -52
- package/dist/admin/pages/ReferralsPage.js.map +1 -1
- package/dist/admin/pages/RolesPermissionsPage.js +137 -116
- package/dist/admin/pages/RolesPermissionsPage.js.map +1 -1
- package/dist/admin/pages/SREPage.js +38 -32
- package/dist/admin/pages/SREPage.js.map +1 -1
- package/dist/admin/pages/SandboxSettingsPage.js +361 -322
- package/dist/admin/pages/SandboxSettingsPage.js.map +1 -1
- package/dist/admin/pages/SettingsPage.js +145 -130
- package/dist/admin/pages/SettingsPage.js.map +1 -1
- package/dist/admin/pages/SyncFailuresPage.js +123 -118
- package/dist/admin/pages/SyncFailuresPage.js.map +1 -1
- package/dist/admin/pages/TenantDetailPage.js +261 -218
- package/dist/admin/pages/TenantDetailPage.js.map +1 -1
- package/dist/admin/pages/TenantFormRoutePage.js +65 -61
- package/dist/admin/pages/TenantFormRoutePage.js.map +1 -1
- package/dist/admin/pages/TenantsListPage.js +88 -71
- package/dist/admin/pages/TenantsListPage.js.map +1 -1
- package/dist/admin/pages/UsersListPage.js +129 -112
- package/dist/admin/pages/UsersListPage.js.map +1 -1
- package/dist/admin/pages/WaitlistPage.js +80 -63
- package/dist/admin/pages/WaitlistPage.js.map +1 -1
- package/dist/admin/pages/WorkflowsPage.js +108 -100
- package/dist/admin/pages/WorkflowsPage.js.map +1 -1
- package/dist/admin/pages/WorkspacesListPage.js +62 -49
- package/dist/admin/pages/WorkspacesListPage.js.map +1 -1
- package/dist/node_modules/@hookform/resolvers/dist/resolvers.js +2 -2
- package/dist/node_modules/@hookform/resolvers/dist/resolvers.js.map +1 -1
- package/dist/node_modules/@hookform/resolvers/zod/dist/zod.js +35 -26
- package/dist/node_modules/@hookform/resolvers/zod/dist/zod.js.map +1 -1
- package/dist/node_modules/react-hook-form/dist/index.esm.js +609 -516
- package/dist/node_modules/react-hook-form/dist/index.esm.js.map +1 -1
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SettingsPage.js","names":[],"sources":["../../../src/admin/pages/SettingsPage.tsx"],"sourcesContent":["import { Settings, Shield, Key, Bell, Globe, Database } from 'lucide-react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport {\n PageLayout,\n Card,\n CardHeader,\n CardTitle,\n CardContent,\n CardDescription,\n Button,\n Input,\n Separator,\n PermissionGuard,\n} from '../components';\nimport { useAdminPermissions } from '../hooks/useAdminPermissions';\nimport { tWithFallback } from '../utils/i18n';\n\n/**\n * Settings page\n */\nexport function SettingsPage() {\n const { canManageSettings, isLoading: permissionsLoading } = useAdminPermissions();\n const { t } = useI18n();\n const tr = (key: string, fallback: string, params?: Record<string, string | number>): string =>\n tWithFallback(t, key, fallback, params);\n\n const notificationSettings = [\n {\n key: 'newTenantSignups',\n label: tr('admin.settings.notifications.items.newTenantSignups.label', 'New tenant signups'),\n description: tr(\n 'admin.settings.notifications.items.newTenantSignups.description',\n 'Get notified when new tenants register'\n ),\n },\n {\n key: 'paymentFailures',\n label: tr('admin.settings.notifications.items.paymentFailures.label', 'Payment failures'),\n description: tr(\n 'admin.settings.notifications.items.paymentFailures.description',\n 'Alert when payments fail'\n ),\n },\n {\n key: 'criticalTickets',\n label: tr('admin.settings.notifications.items.criticalTickets.label', 'Critical tickets'),\n description: tr(\n 'admin.settings.notifications.items.criticalTickets.description',\n 'Notify on critical support tickets'\n ),\n },\n {\n key: 'systemAlerts',\n label: tr('admin.settings.notifications.items.systemAlerts.label', 'System alerts'),\n description: tr(\n 'admin.settings.notifications.items.systemAlerts.description',\n 'Infrastructure and health alerts'\n ),\n },\n ];\n\n return (\n <PermissionGuard\n allowed={canManageSettings}\n isLoading={permissionsLoading}\n pageTitle={tr('admin.settings.title', 'Settings')}\n denyMessage={tr(\n 'admin.settings.denyMessage',\n \"You don't have permission to manage platform settings.\"\n )}\n >\n <PageLayout\n title={tr('admin.settings.title', 'Settings')}\n description={tr(\n 'admin.settings.description',\n 'Configure platform settings and preferences'\n )}\n >\n <div className=\"grid gap-6 lg:grid-cols-3\">\n {/* Main settings */}\n <div className=\"space-y-6 lg:col-span-2\">\n {/* General */}\n <Card>\n <CardHeader>\n <div className=\"flex items-center gap-2\">\n <Settings className=\"h-5 w-5 text-text-secondary\" />\n <CardTitle className=\"text-lg\">\n {tr('admin.settings.general.title', 'General')}\n </CardTitle>\n </div>\n <CardDescription>\n {tr('admin.settings.general.description', 'Basic platform configuration')}\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">\n {tr('admin.settings.general.platformName', 'Platform Name')}\n </label>\n <Input defaultValue=\"Burdenoff Admin\" />\n </div>\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">\n {tr('admin.settings.general.supportEmail', 'Support Email')}\n </label>\n <Input defaultValue=\"support@burdenoff.com\" type=\"email\" />\n </div>\n </div>\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">\n {tr('admin.settings.general.defaultTimezone', 'Default Timezone')}\n </label>\n <select className=\"h-10 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm\">\n <option value=\"UTC\">UTC</option>\n <option value=\"America/New_York\">\n {tr('admin.settings.general.timezones.eastern', 'Eastern Time (ET)')}\n </option>\n <option value=\"America/Los_Angeles\">\n {tr('admin.settings.general.timezones.pacific', 'Pacific Time (PT)')}\n </option>\n <option value=\"Europe/London\">\n {tr('admin.settings.general.timezones.london', 'London (GMT)')}\n </option>\n <option value=\"Asia/Kolkata\">\n {tr('admin.settings.general.timezones.india', 'India (IST)')}\n </option>\n </select>\n </div>\n <div className=\"flex justify-end\">\n <Button>{tr('admin.settings.general.saveChanges', 'Save Changes')}</Button>\n </div>\n </CardContent>\n </Card>\n\n {/* Security */}\n <Card>\n <CardHeader>\n <div className=\"flex items-center gap-2\">\n <Shield className=\"h-5 w-5 text-text-secondary\" />\n <CardTitle className=\"text-lg\">\n {tr('admin.settings.security.title', 'Security')}\n </CardTitle>\n </div>\n <CardDescription>\n {tr(\n 'admin.settings.security.description',\n 'Security and authentication settings'\n )}\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"flex items-center justify-between rounded-lg border border-border-subtle p-4\">\n <div>\n <div className=\"font-medium\">\n {tr('admin.settings.security.twoFactor.title', 'Two-Factor Authentication')}\n </div>\n <div className=\"text-sm text-text-secondary\">\n {tr(\n 'admin.settings.security.twoFactor.description',\n 'Require 2FA for all admin accounts'\n )}\n </div>\n </div>\n <Button variant=\"outline\">\n {tr('admin.settings.security.twoFactor.configure', 'Configure')}\n </Button>\n </div>\n <div className=\"flex items-center justify-between rounded-lg border border-border-subtle p-4\">\n <div>\n <div className=\"font-medium\">\n {tr('admin.settings.security.sessionTimeout.title', 'Session Timeout')}\n </div>\n <div className=\"text-sm text-text-secondary\">\n {tr(\n 'admin.settings.security.sessionTimeout.description',\n 'Auto-logout after inactivity'\n )}\n </div>\n </div>\n <select className=\"h-9 rounded-md border border-border-default bg-bg-surface px-3 text-sm\">\n <option value=\"15\">\n {tr('admin.settings.security.sessionTimeout.options.15m', '15 minutes')}\n </option>\n <option value=\"30\">\n {tr('admin.settings.security.sessionTimeout.options.30m', '30 minutes')}\n </option>\n <option value=\"60\">\n {tr('admin.settings.security.sessionTimeout.options.1h', '1 hour')}\n </option>\n <option value=\"480\">\n {tr('admin.settings.security.sessionTimeout.options.8h', '8 hours')}\n </option>\n </select>\n </div>\n <div className=\"flex items-center justify-between rounded-lg border border-border-subtle p-4\">\n <div>\n <div className=\"font-medium\">\n {tr('admin.settings.security.ipAllowlist.title', 'IP Allowlist')}\n </div>\n <div className=\"text-sm text-text-secondary\">\n {tr(\n 'admin.settings.security.ipAllowlist.description',\n 'Restrict access to specific IPs'\n )}\n </div>\n </div>\n <Button variant=\"outline\">\n {tr('admin.settings.security.ipAllowlist.manage', 'Manage')}\n </Button>\n </div>\n </CardContent>\n </Card>\n\n {/* Notifications */}\n <Card>\n <CardHeader>\n <div className=\"flex items-center gap-2\">\n <Bell className=\"h-5 w-5 text-text-secondary\" />\n <CardTitle className=\"text-lg\">\n {tr('admin.settings.notifications.title', 'Notifications')}\n </CardTitle>\n </div>\n <CardDescription>\n {tr(\n 'admin.settings.notifications.description',\n 'Configure notification preferences'\n )}\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n {notificationSettings.map((item) => (\n <div\n key={item.key}\n className=\"flex items-center justify-between rounded-lg border border-border-subtle p-4\"\n >\n <div>\n <div className=\"font-medium\">{item.label}</div>\n <div className=\"text-sm text-text-secondary\">{item.description}</div>\n </div>\n <label className=\"relative inline-flex cursor-pointer items-center\">\n <input type=\"checkbox\" defaultChecked className=\"peer sr-only\" />\n <div className=\"peer h-6 w-11 rounded-full bg-bg-sunken after:absolute after:left-[2px] after:top-0.5 after:h-5 after:w-5 after:rounded-full after:bg-bg-surface after:transition-all peer-checked:bg-action-primary-bg peer-checked:after:translate-x-full peer-focus:ring-2 peer-focus:ring-[var(--color-focus-ring)]\" />\n </label>\n </div>\n ))}\n </CardContent>\n </Card>\n </div>\n\n {/* Sidebar */}\n <div className=\"space-y-6\">\n {/* API Keys */}\n <Card>\n <CardHeader>\n <div className=\"flex items-center gap-2\">\n <Key className=\"h-5 w-5 text-text-secondary\" />\n <CardTitle className=\"text-lg\">\n {tr('admin.settings.apiKeys.title', 'API Keys')}\n </CardTitle>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n <p className=\"text-sm text-text-secondary\">\n {tr(\n 'admin.settings.apiKeys.description',\n 'Manage API keys for programmatic access to the admin API.'\n )}\n </p>\n <Button variant=\"outline\" className=\"w-full\">\n {tr('admin.settings.apiKeys.manage', 'Manage API Keys')}\n </Button>\n </CardContent>\n </Card>\n\n {/* Integrations */}\n <Card>\n <CardHeader>\n <div className=\"flex items-center gap-2\">\n <Globe className=\"h-5 w-5 text-text-secondary\" />\n <CardTitle className=\"text-lg\">\n {tr('admin.settings.integrations.title', 'Integrations')}\n </CardTitle>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n <p className=\"text-sm text-text-secondary\">\n {tr(\n 'admin.settings.integrations.description',\n 'Connect third-party services and tools.'\n )}\n </p>\n <Button variant=\"outline\" className=\"w-full\">\n {tr('admin.settings.integrations.view', 'View Integrations')}\n </Button>\n </CardContent>\n </Card>\n\n {/* Data Management */}\n <Card>\n <CardHeader>\n <div className=\"flex items-center gap-2\">\n <Database className=\"h-5 w-5 text-text-secondary\" />\n <CardTitle className=\"text-lg\">\n {tr('admin.settings.data.title', 'Data')}\n </CardTitle>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n <Button variant=\"outline\" className=\"w-full justify-start\">\n {tr('admin.settings.data.export', 'Export Data')}\n </Button>\n <Button variant=\"outline\" className=\"w-full justify-start\">\n {tr('admin.settings.data.auditLogs', 'Audit Logs')}\n </Button>\n <Separator />\n <Button variant=\"outline\" className=\"w-full justify-start text-status-error-text\">\n {tr('admin.settings.data.dangerZone', 'Danger Zone')}\n </Button>\n </CardContent>\n </Card>\n </div>\n </div>\n </PageLayout>\n </PermissionGuard>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SettingsPage.js","names":[],"sources":["../../../src/admin/pages/SettingsPage.tsx"],"sourcesContent":["import { Settings, Shield, Key, Bell, Globe, Database } from 'lucide-react';\nimport { useI18n } from '@burdenoff/fe-libs/shared/providers/shell/I18nProvider';\nimport { EmphasisPanel, ShowMore, PagePurpose } from '@burdenoff/fe-libs/ui';\nimport {\n PageLayout,\n Card,\n CardHeader,\n CardTitle,\n CardContent,\n CardDescription,\n Button,\n Input,\n Separator,\n PermissionGuard,\n} from '../components';\nimport { useAdminPermissions } from '../hooks/useAdminPermissions';\nimport { tWithFallback } from '../utils/i18n';\n\n/**\n * Settings page\n */\nexport function SettingsPage() {\n const { canManageSettings, isLoading: permissionsLoading } = useAdminPermissions();\n const { t } = useI18n();\n const tr = (key: string, fallback: string, params?: Record<string, string | number>): string =>\n tWithFallback(t, key, fallback, params);\n\n const notificationSettings = [\n {\n key: 'newTenantSignups',\n label: tr('admin.settings.notifications.items.newTenantSignups.label', 'New tenant signups'),\n description: tr(\n 'admin.settings.notifications.items.newTenantSignups.description',\n 'Get notified when new tenants register'\n ),\n },\n {\n key: 'paymentFailures',\n label: tr('admin.settings.notifications.items.paymentFailures.label', 'Payment failures'),\n description: tr(\n 'admin.settings.notifications.items.paymentFailures.description',\n 'Alert when payments fail'\n ),\n },\n {\n key: 'criticalTickets',\n label: tr('admin.settings.notifications.items.criticalTickets.label', 'Critical tickets'),\n description: tr(\n 'admin.settings.notifications.items.criticalTickets.description',\n 'Notify on critical support tickets'\n ),\n },\n {\n key: 'systemAlerts',\n label: tr('admin.settings.notifications.items.systemAlerts.label', 'System alerts'),\n description: tr(\n 'admin.settings.notifications.items.systemAlerts.description',\n 'Infrastructure and health alerts'\n ),\n },\n ];\n\n return (\n <PermissionGuard\n allowed={canManageSettings}\n isLoading={permissionsLoading}\n pageTitle={tr('admin.settings.title', 'Settings')}\n denyMessage={tr(\n 'admin.settings.denyMessage',\n \"You don't have permission to manage platform settings.\"\n )}\n >\n <PageLayout\n title={tr('admin.settings.title', 'Settings')}\n gradientWord={tr('admin.settings.title', 'Settings')}\n description={tr(\n 'admin.settings.description',\n 'Configure platform settings and preferences'\n )}\n >\n <PagePurpose className=\"mb-6\">\n {tr(\n 'admin.settings.purpose',\n 'Platform-wide configuration in one place — the general details every product inherits, security defaults, API access, and which events page you. Change these to set the baseline behaviour for the whole platform, not a single tenant.'\n )}\n </PagePurpose>\n\n <div className=\"grid gap-6 lg:grid-cols-3\">\n {/* Main settings */}\n <div className=\"space-y-6 lg:col-span-2\">\n {/* General — primary settings zone (emphasis) */}\n <EmphasisPanel className=\"p-0\">\n <Card className=\"border-0 bg-transparent shadow-none hover:border-0\">\n <CardHeader>\n <div className=\"flex items-center gap-2\">\n <Settings className=\"h-5 w-5 text-text-secondary\" />\n <CardTitle className=\"text-lg\">\n {tr('admin.settings.general.title', 'General')}\n </CardTitle>\n </div>\n <CardDescription>\n {tr('admin.settings.general.description', 'Basic platform configuration')}\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">\n {tr('admin.settings.general.platformName', 'Platform Name')}\n </label>\n <Input defaultValue=\"Burdenoff Admin\" />\n </div>\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">\n {tr('admin.settings.general.supportEmail', 'Support Email')}\n </label>\n <Input defaultValue=\"support@burdenoff.com\" type=\"email\" />\n </div>\n </div>\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium\">\n {tr('admin.settings.general.defaultTimezone', 'Default Timezone')}\n </label>\n <select className=\"h-10 w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm\">\n <option value=\"UTC\">UTC</option>\n <option value=\"America/New_York\">\n {tr('admin.settings.general.timezones.eastern', 'Eastern Time (ET)')}\n </option>\n <option value=\"America/Los_Angeles\">\n {tr('admin.settings.general.timezones.pacific', 'Pacific Time (PT)')}\n </option>\n <option value=\"Europe/London\">\n {tr('admin.settings.general.timezones.london', 'London (GMT)')}\n </option>\n <option value=\"Asia/Kolkata\">\n {tr('admin.settings.general.timezones.india', 'India (IST)')}\n </option>\n </select>\n </div>\n <div className=\"flex justify-end\">\n <Button>{tr('admin.settings.general.saveChanges', 'Save Changes')}</Button>\n </div>\n </CardContent>\n </Card>\n </EmphasisPanel>\n\n {/* Security */}\n <Card>\n <CardHeader>\n <div className=\"flex items-center gap-2\">\n <Shield className=\"h-5 w-5 text-text-secondary\" />\n <CardTitle className=\"text-lg\">\n {tr('admin.settings.security.title', 'Security')}\n </CardTitle>\n </div>\n <CardDescription>\n {tr(\n 'admin.settings.security.description',\n 'Security and authentication settings'\n )}\n </CardDescription>\n </CardHeader>\n <CardContent className=\"space-y-4\">\n <div className=\"flex items-center justify-between rounded-lg border border-border-subtle p-4\">\n <div>\n <div className=\"font-medium\">\n {tr('admin.settings.security.twoFactor.title', 'Two-Factor Authentication')}\n </div>\n <div className=\"text-sm text-text-secondary\">\n {tr(\n 'admin.settings.security.twoFactor.description',\n 'Require 2FA for all admin accounts'\n )}\n </div>\n </div>\n <Button variant=\"outline\">\n {tr('admin.settings.security.twoFactor.configure', 'Configure')}\n </Button>\n </div>\n <div className=\"flex items-center justify-between rounded-lg border border-border-subtle p-4\">\n <div>\n <div className=\"font-medium\">\n {tr('admin.settings.security.sessionTimeout.title', 'Session Timeout')}\n </div>\n <div className=\"text-sm text-text-secondary\">\n {tr(\n 'admin.settings.security.sessionTimeout.description',\n 'Auto-logout after inactivity'\n )}\n </div>\n </div>\n <select className=\"h-9 rounded-md border border-border-default bg-bg-surface px-3 text-sm\">\n <option value=\"15\">\n {tr('admin.settings.security.sessionTimeout.options.15m', '15 minutes')}\n </option>\n <option value=\"30\">\n {tr('admin.settings.security.sessionTimeout.options.30m', '30 minutes')}\n </option>\n <option value=\"60\">\n {tr('admin.settings.security.sessionTimeout.options.1h', '1 hour')}\n </option>\n <option value=\"480\">\n {tr('admin.settings.security.sessionTimeout.options.8h', '8 hours')}\n </option>\n </select>\n </div>\n <div className=\"flex items-center justify-between rounded-lg border border-border-subtle p-4\">\n <div>\n <div className=\"font-medium\">\n {tr('admin.settings.security.ipAllowlist.title', 'IP Allowlist')}\n </div>\n <div className=\"text-sm text-text-secondary\">\n {tr(\n 'admin.settings.security.ipAllowlist.description',\n 'Restrict access to specific IPs'\n )}\n </div>\n </div>\n <Button variant=\"outline\">\n {tr('admin.settings.security.ipAllowlist.manage', 'Manage')}\n </Button>\n </div>\n </CardContent>\n </Card>\n\n {/* Notifications */}\n <Card>\n <CardHeader>\n <div className=\"flex items-center gap-2\">\n <Bell className=\"h-5 w-5 text-text-secondary\" />\n <CardTitle className=\"text-lg\">\n {tr('admin.settings.notifications.title', 'Notifications')}\n </CardTitle>\n </div>\n <CardDescription>\n {tr(\n 'admin.settings.notifications.description',\n 'Configure notification preferences'\n )}\n </CardDescription>\n </CardHeader>\n <CardContent>\n <ShowMore collapsedHeight={180} label=\"More notification settings\">\n <div className=\"space-y-4\">\n {notificationSettings.map((item) => (\n <div\n key={item.key}\n className=\"flex items-center justify-between rounded-lg border border-border-seam p-4\"\n >\n <div>\n <div className=\"font-medium\">{item.label}</div>\n <div className=\"text-sm text-text-secondary\">{item.description}</div>\n </div>\n <label className=\"relative inline-flex cursor-pointer items-center\">\n <input type=\"checkbox\" defaultChecked className=\"peer sr-only\" />\n <div className=\"peer h-6 w-11 rounded-full bg-bg-sunken after:absolute after:left-[2px] after:top-0.5 after:h-5 after:w-5 after:rounded-full after:bg-bg-surface after:transition-all peer-checked:bg-action-primary-bg peer-checked:after:translate-x-full peer-focus:ring-2 peer-focus:ring-[var(--color-focus-ring)]\" />\n </label>\n </div>\n ))}\n </div>\n </ShowMore>\n </CardContent>\n </Card>\n </div>\n\n {/* Sidebar */}\n <div className=\"space-y-6\">\n {/* API Keys */}\n <Card>\n <CardHeader>\n <div className=\"flex items-center gap-2\">\n <Key className=\"h-5 w-5 text-text-secondary\" />\n <CardTitle className=\"text-lg\">\n {tr('admin.settings.apiKeys.title', 'API Keys')}\n </CardTitle>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n <p className=\"text-sm text-text-secondary\">\n {tr(\n 'admin.settings.apiKeys.description',\n 'Manage API keys for programmatic access to the admin API.'\n )}\n </p>\n <Button variant=\"outline\" className=\"w-full\">\n {tr('admin.settings.apiKeys.manage', 'Manage API Keys')}\n </Button>\n </CardContent>\n </Card>\n\n {/* Integrations */}\n <Card>\n <CardHeader>\n <div className=\"flex items-center gap-2\">\n <Globe className=\"h-5 w-5 text-text-secondary\" />\n <CardTitle className=\"text-lg\">\n {tr('admin.settings.integrations.title', 'Integrations')}\n </CardTitle>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n <p className=\"text-sm text-text-secondary\">\n {tr(\n 'admin.settings.integrations.description',\n 'Connect third-party services and tools.'\n )}\n </p>\n <Button variant=\"outline\" className=\"w-full\">\n {tr('admin.settings.integrations.view', 'View Integrations')}\n </Button>\n </CardContent>\n </Card>\n\n {/* Data Management */}\n <Card>\n <CardHeader>\n <div className=\"flex items-center gap-2\">\n <Database className=\"h-5 w-5 text-text-secondary\" />\n <CardTitle className=\"text-lg\">\n {tr('admin.settings.data.title', 'Data')}\n </CardTitle>\n </div>\n </CardHeader>\n <CardContent className=\"space-y-3\">\n <Button variant=\"outline\" className=\"w-full justify-start\">\n {tr('admin.settings.data.export', 'Export Data')}\n </Button>\n <Button variant=\"outline\" className=\"w-full justify-start\">\n {tr('admin.settings.data.auditLogs', 'Audit Logs')}\n </Button>\n <Separator />\n <Button variant=\"outline\" className=\"w-full justify-start text-status-error-text\">\n {tr('admin.settings.data.dangerZone', 'Danger Zone')}\n </Button>\n </CardContent>\n </Card>\n </div>\n </div>\n </PageLayout>\n </PermissionGuard>\n );\n}\n"],"mappings":"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"}
|
|
@@ -4,86 +4,87 @@ import { Badge as n, Button as r, Card as i, CardContent as a, EmptyState as o }
|
|
|
4
4
|
import { PageLayout as s } from "../components/PageLayout.js";
|
|
5
5
|
import { formatDateTime as c, formatRelativeTime as l } from "../utils/formatters.js";
|
|
6
6
|
import { MetricCard as u, MetricsGrid as d } from "../components/MetricCard.js";
|
|
7
|
-
import { DataTable as
|
|
8
|
-
import { ConfirmDialog as
|
|
9
|
-
import { PermissionGuard as
|
|
7
|
+
import { DataTable as ee, Pagination as te } from "../components/DataTable.js";
|
|
8
|
+
import { ConfirmDialog as ne } from "../components/ConfirmDialog.js";
|
|
9
|
+
import { PermissionGuard as re } from "../components/PermissionGuard.js";
|
|
10
10
|
import "../components/index.js";
|
|
11
|
-
import { useListSyncOutboxEntriesQuery as
|
|
12
|
-
import { SyncOutboxStatus as
|
|
13
|
-
import { useCallback as
|
|
14
|
-
import { AlertOctagon as
|
|
15
|
-
import { Fragment as
|
|
11
|
+
import { useListSyncOutboxEntriesQuery as f, useRetrySyncOutboxEntryMutation as p, useSyncOutboxStatsQuery as ie } from "../../generated/global-operations.js";
|
|
12
|
+
import { SyncOutboxStatus as m } from "../../generated/global-types.js";
|
|
13
|
+
import { useCallback as h, useMemo as g, useState as _ } from "react";
|
|
14
|
+
import { AlertOctagon as v, CheckCircle2 as y, Clock as b, RefreshCw as x, RotateCw as S } from "lucide-react";
|
|
15
|
+
import { Fragment as ae, jsx as C, jsxs as w } from "react/jsx-runtime";
|
|
16
|
+
import { PagePurpose as T } from "@burdenoff/fe-libs/ui";
|
|
16
17
|
//#region src/admin/pages/SyncFailuresPage.tsx
|
|
17
|
-
var
|
|
18
|
+
var E = 25, D = [
|
|
18
19
|
"PENDING",
|
|
19
20
|
"RETRYING",
|
|
20
21
|
"SUCCESS",
|
|
21
22
|
"PERMANENTLY_FAILED"
|
|
22
|
-
],
|
|
23
|
-
PENDING:
|
|
24
|
-
RETRYING:
|
|
25
|
-
SUCCESS:
|
|
26
|
-
PERMANENTLY_FAILED:
|
|
23
|
+
], O = {
|
|
24
|
+
PENDING: m.Pending,
|
|
25
|
+
RETRYING: m.Retrying,
|
|
26
|
+
SUCCESS: m.Success,
|
|
27
|
+
PERMANENTLY_FAILED: m.PermanentlyFailed
|
|
27
28
|
};
|
|
28
|
-
function
|
|
29
|
+
function k(e) {
|
|
29
30
|
let t = String(e);
|
|
30
|
-
return
|
|
31
|
+
return D.includes(t) ? t : "PERMANENTLY_FAILED";
|
|
31
32
|
}
|
|
32
|
-
var
|
|
33
|
-
PENDING: "bg-warning
|
|
34
|
-
RETRYING: "bg-warning
|
|
35
|
-
SUCCESS: "bg-success
|
|
36
|
-
PERMANENTLY_FAILED: "bg-status-error-bg
|
|
37
|
-
},
|
|
33
|
+
var A = {
|
|
34
|
+
PENDING: "bg-status-warning-bg text-status-warning-text border-status-warning-border",
|
|
35
|
+
RETRYING: "bg-status-warning-bg text-status-warning-text border-status-warning-border",
|
|
36
|
+
SUCCESS: "bg-status-success-bg text-status-success-text border-status-success-border",
|
|
37
|
+
PERMANENTLY_FAILED: "bg-status-error-bg text-status-error-text border-status-error-border"
|
|
38
|
+
}, j = {
|
|
38
39
|
PENDING: "Pending",
|
|
39
40
|
RETRYING: "Retrying",
|
|
40
41
|
SUCCESS: "Success",
|
|
41
42
|
PERMANENTLY_FAILED: "Permanently failed"
|
|
42
43
|
};
|
|
43
|
-
function
|
|
44
|
-
let t =
|
|
45
|
-
return /* @__PURE__ */
|
|
44
|
+
function oe({ status: e }) {
|
|
45
|
+
let t = k(e);
|
|
46
|
+
return /* @__PURE__ */ C(n, {
|
|
46
47
|
variant: "outline",
|
|
47
|
-
className:
|
|
48
|
-
children:
|
|
48
|
+
className: A[t],
|
|
49
|
+
children: j[t]
|
|
49
50
|
});
|
|
50
51
|
}
|
|
51
|
-
function
|
|
52
|
-
let { canViewSyncFailures: n, canManageSyncFailures:
|
|
53
|
-
if (
|
|
54
|
-
}, [
|
|
52
|
+
function M() {
|
|
53
|
+
let { canViewSyncFailures: n, canManageSyncFailures: m, isLoading: D } = t(), A = e(), [j, M] = _(1), [N, P] = _("PERMANENTLY_FAILED"), [F, I] = _(null), [L, R] = _(null), z = g(() => {
|
|
54
|
+
if (N !== "all") return { statuses: [O[N]] };
|
|
55
|
+
}, [N]), B = D || !n, { data: V, loading: H, error: U, refetch: W } = f({
|
|
55
56
|
variables: {
|
|
56
|
-
filter:
|
|
57
|
-
limit:
|
|
58
|
-
offset: (
|
|
57
|
+
filter: z,
|
|
58
|
+
limit: E,
|
|
59
|
+
offset: (j - 1) * E
|
|
59
60
|
},
|
|
60
61
|
fetchPolicy: "cache-and-network",
|
|
61
|
-
skip:
|
|
62
|
-
}), { data:
|
|
62
|
+
skip: B
|
|
63
|
+
}), { data: G, loading: K, refetch: q } = ie({
|
|
63
64
|
fetchPolicy: "cache-and-network",
|
|
64
|
-
skip:
|
|
65
|
-
}), [
|
|
65
|
+
skip: B
|
|
66
|
+
}), [J, { loading: Y }] = p({
|
|
66
67
|
onCompleted: (e) => {
|
|
67
68
|
let t = e.retrySyncOutboxEntry;
|
|
68
|
-
t.success ? (
|
|
69
|
+
t.success ? (A.success("Requeued for retry", t.message ?? "The reconciler will pick it up on the next tick."), W(), q()) : A.error("Retry failed", t.message ?? "Could not requeue this entry.");
|
|
69
70
|
},
|
|
70
71
|
onError: (e) => {
|
|
71
|
-
|
|
72
|
+
A.error("Retry failed", e.message);
|
|
72
73
|
}
|
|
73
|
-
}),
|
|
74
|
-
|
|
75
|
-
}, [
|
|
76
|
-
if (
|
|
77
|
-
await
|
|
74
|
+
}), X = h(() => {
|
|
75
|
+
W(), q();
|
|
76
|
+
}, [W, q]), se = h(async () => {
|
|
77
|
+
if (F) try {
|
|
78
|
+
await J({ variables: { id: F } });
|
|
78
79
|
} finally {
|
|
79
|
-
|
|
80
|
+
I(null);
|
|
80
81
|
}
|
|
81
|
-
}, [
|
|
82
|
+
}, [F, J]), Z = V?.listSyncOutboxEntries.items ?? [], Q = V?.listSyncOutboxEntries.total ?? 0, ce = Math.max(1, Math.ceil(Q / E)), $ = G?.syncOutboxStats, le = g(() => [
|
|
82
83
|
{
|
|
83
84
|
key: "operation",
|
|
84
85
|
header: "Operation",
|
|
85
86
|
width: "180px",
|
|
86
|
-
render: (e) => /* @__PURE__ */
|
|
87
|
+
render: (e) => /* @__PURE__ */ C("code", {
|
|
87
88
|
className: "text-xs bg-bg-sunken px-1.5 py-0.5 rounded",
|
|
88
89
|
children: e.operation
|
|
89
90
|
})
|
|
@@ -91,7 +92,7 @@ function N() {
|
|
|
91
92
|
{
|
|
92
93
|
key: "workspaceId",
|
|
93
94
|
header: "Workspace",
|
|
94
|
-
render: (e) => /* @__PURE__ */
|
|
95
|
+
render: (e) => /* @__PURE__ */ C("span", {
|
|
95
96
|
className: "font-mono text-xs text-text-secondary",
|
|
96
97
|
children: e.workspaceId
|
|
97
98
|
})
|
|
@@ -100,16 +101,16 @@ function N() {
|
|
|
100
101
|
key: "status",
|
|
101
102
|
header: "Status",
|
|
102
103
|
width: "170px",
|
|
103
|
-
render: (e) => /* @__PURE__ */
|
|
104
|
+
render: (e) => /* @__PURE__ */ C(oe, { status: e.status })
|
|
104
105
|
},
|
|
105
106
|
{
|
|
106
107
|
key: "attempts",
|
|
107
108
|
header: "Attempts",
|
|
108
109
|
width: "100px",
|
|
109
110
|
align: "right",
|
|
110
|
-
render: (e) => /* @__PURE__ */
|
|
111
|
+
render: (e) => /* @__PURE__ */ w("span", {
|
|
111
112
|
className: "text-sm",
|
|
112
|
-
children: [e.attempts, /* @__PURE__ */
|
|
113
|
+
children: [e.attempts, /* @__PURE__ */ w("span", {
|
|
113
114
|
className: "text-text-secondary",
|
|
114
115
|
children: ["/", e.maxAttempts]
|
|
115
116
|
})]
|
|
@@ -119,10 +120,10 @@ function N() {
|
|
|
119
120
|
key: "nextRetryAt",
|
|
120
121
|
header: "Next retry",
|
|
121
122
|
width: "160px",
|
|
122
|
-
render: (e) => e.nextRetryAt ? /* @__PURE__ */
|
|
123
|
+
render: (e) => e.nextRetryAt ? /* @__PURE__ */ C("span", {
|
|
123
124
|
className: "text-sm text-text-secondary",
|
|
124
125
|
children: l(e.nextRetryAt)
|
|
125
|
-
}) : /* @__PURE__ */
|
|
126
|
+
}) : /* @__PURE__ */ C("span", {
|
|
126
127
|
className: "text-xs text-text-secondary",
|
|
127
128
|
children: "—"
|
|
128
129
|
})
|
|
@@ -131,7 +132,7 @@ function N() {
|
|
|
131
132
|
key: "createdAt",
|
|
132
133
|
header: "Created",
|
|
133
134
|
width: "160px",
|
|
134
|
-
render: (e) => /* @__PURE__ */
|
|
135
|
+
render: (e) => /* @__PURE__ */ C("span", {
|
|
135
136
|
className: "text-sm text-text-secondary",
|
|
136
137
|
children: l(e.createdAt)
|
|
137
138
|
})
|
|
@@ -142,68 +143,71 @@ function N() {
|
|
|
142
143
|
width: "120px",
|
|
143
144
|
align: "right",
|
|
144
145
|
render: (e) => {
|
|
145
|
-
let t =
|
|
146
|
-
return !
|
|
146
|
+
let t = k(e.status) === "PERMANENTLY_FAILED";
|
|
147
|
+
return !m || !t ? null : /* @__PURE__ */ w(r, {
|
|
147
148
|
variant: "outline",
|
|
148
149
|
size: "sm",
|
|
149
150
|
onClick: (t) => {
|
|
150
|
-
t.stopPropagation(),
|
|
151
|
+
t.stopPropagation(), I(e.id);
|
|
151
152
|
},
|
|
152
|
-
disabled:
|
|
153
|
-
children: [/* @__PURE__ */
|
|
153
|
+
disabled: Y,
|
|
154
|
+
children: [/* @__PURE__ */ C(S, { className: "mr-1.5 h-3.5 w-3.5" }), "Retry"]
|
|
154
155
|
});
|
|
155
156
|
}
|
|
156
157
|
}
|
|
157
|
-
], [
|
|
158
|
-
return /* @__PURE__ */
|
|
158
|
+
], [m, Y]);
|
|
159
|
+
return /* @__PURE__ */ C(re, {
|
|
159
160
|
allowed: n,
|
|
160
|
-
isLoading:
|
|
161
|
+
isLoading: D,
|
|
161
162
|
pageTitle: "Sync Failures",
|
|
162
163
|
denyMessage: "Only super-admins can view cross-layer sync failures.",
|
|
163
|
-
children: /* @__PURE__ */
|
|
164
|
+
children: /* @__PURE__ */ w(s, {
|
|
164
165
|
title: "Sync Failures",
|
|
166
|
+
gradientWord: "Failures",
|
|
165
167
|
description: "Cross-layer sync operations (global → workspace) that did not complete. Automatic retries run in the background; use the manual retry once the underlying issue is fixed.",
|
|
166
|
-
actions: /* @__PURE__ */
|
|
168
|
+
actions: /* @__PURE__ */ w(r, {
|
|
167
169
|
variant: "outline",
|
|
168
|
-
onClick:
|
|
169
|
-
disabled:
|
|
170
|
-
children: [/* @__PURE__ */
|
|
170
|
+
onClick: X,
|
|
171
|
+
disabled: H || K,
|
|
172
|
+
children: [/* @__PURE__ */ C(x, { className: `mr-2 h-4 w-4 ${H ? "animate-spin" : ""}` }), "Refresh"]
|
|
171
173
|
}),
|
|
172
|
-
children: [/* @__PURE__ */
|
|
174
|
+
children: [/* @__PURE__ */ w("div", {
|
|
173
175
|
className: "space-y-6",
|
|
174
176
|
children: [
|
|
175
|
-
/* @__PURE__ */
|
|
176
|
-
|
|
177
|
+
/* @__PURE__ */ C(T, { children: "When the platform can't deliver an event to a downstream system, it lands in this sync outbox. Use this page to see what failed, retry an entry once the issue is fixed, and clear out events that are stuck — keeping integrations in sync across services." }),
|
|
178
|
+
/* @__PURE__ */ w(d, { children: [
|
|
179
|
+
/* @__PURE__ */ C(u, {
|
|
177
180
|
title: "Pending",
|
|
181
|
+
hero: !0,
|
|
178
182
|
value: $?.pending ?? 0,
|
|
179
|
-
icon: /* @__PURE__ */
|
|
183
|
+
icon: /* @__PURE__ */ C(b, { className: "h-5 w-5" }),
|
|
180
184
|
subtitle: "Waiting for first retry",
|
|
181
|
-
loading:
|
|
185
|
+
loading: K
|
|
182
186
|
}),
|
|
183
|
-
/* @__PURE__ */
|
|
187
|
+
/* @__PURE__ */ C(u, {
|
|
184
188
|
title: "Retrying",
|
|
185
189
|
value: $?.retrying ?? 0,
|
|
186
|
-
icon: /* @__PURE__ */
|
|
190
|
+
icon: /* @__PURE__ */ C(S, { className: "h-5 w-5" }),
|
|
187
191
|
subtitle: "Automatic backoff in progress",
|
|
188
|
-
loading:
|
|
192
|
+
loading: K
|
|
189
193
|
}),
|
|
190
|
-
/* @__PURE__ */
|
|
194
|
+
/* @__PURE__ */ C(u, {
|
|
191
195
|
title: "Permanently failed",
|
|
192
196
|
value: $?.permanentlyFailed ?? 0,
|
|
193
|
-
icon: /* @__PURE__ */
|
|
197
|
+
icon: /* @__PURE__ */ C(v, { className: "h-5 w-5" }),
|
|
194
198
|
subtitle: "Exhausted automatic retries",
|
|
195
199
|
priority: $?.permanentlyFailed ? "critical" : "normal",
|
|
196
|
-
loading:
|
|
200
|
+
loading: K
|
|
197
201
|
}),
|
|
198
|
-
/* @__PURE__ */
|
|
202
|
+
/* @__PURE__ */ C(u, {
|
|
199
203
|
title: "Successful",
|
|
200
204
|
value: $?.successful ?? 0,
|
|
201
|
-
icon: /* @__PURE__ */
|
|
205
|
+
icon: /* @__PURE__ */ C(y, { className: "h-5 w-5" }),
|
|
202
206
|
subtitle: "Synced (auto-purged after 7 days)",
|
|
203
|
-
loading:
|
|
207
|
+
loading: K
|
|
204
208
|
})
|
|
205
209
|
] }),
|
|
206
|
-
/* @__PURE__ */
|
|
210
|
+
/* @__PURE__ */ C("div", {
|
|
207
211
|
className: "flex flex-wrap items-center gap-2",
|
|
208
212
|
children: [
|
|
209
213
|
["PERMANENTLY_FAILED", "Permanently failed"],
|
|
@@ -211,87 +215,88 @@ function N() {
|
|
|
211
215
|
["PENDING", "Pending"],
|
|
212
216
|
["SUCCESS", "Successful"],
|
|
213
217
|
["all", "All"]
|
|
214
|
-
].map(([e, t]) => /* @__PURE__ */
|
|
215
|
-
variant:
|
|
218
|
+
].map(([e, t]) => /* @__PURE__ */ C(r, {
|
|
219
|
+
variant: N === e ? "default" : "outline",
|
|
216
220
|
size: "sm",
|
|
217
221
|
onClick: () => {
|
|
218
|
-
|
|
222
|
+
P(e), M(1), R(null);
|
|
219
223
|
},
|
|
220
224
|
children: t
|
|
221
225
|
}, e))
|
|
222
226
|
}),
|
|
223
|
-
|
|
227
|
+
U && /* @__PURE__ */ C(i, { children: /* @__PURE__ */ w(a, {
|
|
224
228
|
className: "py-4 text-sm text-status-error-text",
|
|
225
|
-
children: ["Failed to load sync outbox entries: ",
|
|
229
|
+
children: ["Failed to load sync outbox entries: ", U.message]
|
|
226
230
|
}) }),
|
|
227
|
-
/* @__PURE__ */
|
|
228
|
-
columns:
|
|
231
|
+
/* @__PURE__ */ C(ee, {
|
|
232
|
+
columns: le,
|
|
229
233
|
data: Z,
|
|
230
234
|
keyExtractor: (e) => e.id,
|
|
231
|
-
loading:
|
|
232
|
-
onRowClick: (e) =>
|
|
233
|
-
emptyState: /* @__PURE__ */
|
|
234
|
-
|
|
235
|
+
loading: H,
|
|
236
|
+
onRowClick: (e) => R((t) => t === e.id ? null : e.id),
|
|
237
|
+
emptyState: /* @__PURE__ */ C(o, {
|
|
238
|
+
illustration: "empty-data",
|
|
239
|
+
icon: /* @__PURE__ */ C(y, { className: "h-8 w-8" }),
|
|
235
240
|
title: "No sync failures",
|
|
236
|
-
description:
|
|
241
|
+
description: N === "PERMANENTLY_FAILED" ? "Nothing has exhausted automatic retries." : "No outbox entries match the current filter."
|
|
237
242
|
})
|
|
238
243
|
}),
|
|
239
|
-
|
|
244
|
+
L && Z.filter((e) => e.id === L).map((e) => /* @__PURE__ */ C(i, { children: /* @__PURE__ */ w(a, {
|
|
240
245
|
className: "space-y-2 py-4 text-sm",
|
|
241
246
|
children: [
|
|
242
|
-
/* @__PURE__ */
|
|
247
|
+
/* @__PURE__ */ w("div", {
|
|
243
248
|
className: "flex items-center justify-between",
|
|
244
|
-
children: [/* @__PURE__ */
|
|
249
|
+
children: [/* @__PURE__ */ C("span", {
|
|
245
250
|
className: "font-medium",
|
|
246
251
|
children: "Last error"
|
|
247
|
-
}), /* @__PURE__ */
|
|
252
|
+
}), /* @__PURE__ */ C("span", {
|
|
248
253
|
className: "text-xs text-text-secondary",
|
|
249
254
|
children: e.lastAttemptAt ? `Last attempt: ${c(e.lastAttemptAt)}` : "Never attempted"
|
|
250
255
|
})]
|
|
251
256
|
}),
|
|
252
|
-
/* @__PURE__ */
|
|
257
|
+
/* @__PURE__ */ C("pre", {
|
|
253
258
|
className: "whitespace-pre-wrap break-words rounded bg-bg-sunken px-3 py-2 text-xs text-text-secondary",
|
|
254
259
|
children: e.lastError ?? "No error recorded"
|
|
255
260
|
}),
|
|
256
|
-
/* @__PURE__ */
|
|
261
|
+
/* @__PURE__ */ w("div", {
|
|
257
262
|
className: "text-xs text-text-secondary",
|
|
258
|
-
children: ["Entry id: ", /* @__PURE__ */
|
|
263
|
+
children: ["Entry id: ", /* @__PURE__ */ C("code", {
|
|
259
264
|
className: "font-mono",
|
|
260
265
|
children: e.id
|
|
261
266
|
})]
|
|
262
267
|
})
|
|
263
268
|
]
|
|
264
269
|
}) }, e.id)),
|
|
265
|
-
Q >
|
|
266
|
-
page:
|
|
267
|
-
totalPages:
|
|
270
|
+
Q > E && /* @__PURE__ */ C(te, {
|
|
271
|
+
page: j,
|
|
272
|
+
totalPages: ce,
|
|
268
273
|
totalItems: Q,
|
|
269
|
-
pageSize:
|
|
274
|
+
pageSize: E,
|
|
270
275
|
onPageChange: (e) => {
|
|
271
|
-
|
|
276
|
+
M(e), R(null);
|
|
272
277
|
}
|
|
273
278
|
})
|
|
274
279
|
]
|
|
275
|
-
}), /* @__PURE__ */
|
|
276
|
-
open: !!
|
|
277
|
-
onClose: () =>
|
|
278
|
-
onConfirm:
|
|
280
|
+
}), /* @__PURE__ */ C(ne, {
|
|
281
|
+
open: !!F,
|
|
282
|
+
onClose: () => I(null),
|
|
283
|
+
onConfirm: se,
|
|
279
284
|
title: "Retry this sync?",
|
|
280
|
-
description: /* @__PURE__ */
|
|
285
|
+
description: /* @__PURE__ */ w(ae, { children: [
|
|
281
286
|
"The entry will be flipped to ",
|
|
282
|
-
/* @__PURE__ */
|
|
287
|
+
/* @__PURE__ */ C("strong", { children: "RETRYING" }),
|
|
283
288
|
" and the background reconciler will pick it up on its next tick. Attempts will reset to 0 so the entry gets a fresh retry budget.",
|
|
284
|
-
/* @__PURE__ */
|
|
285
|
-
/* @__PURE__ */
|
|
289
|
+
/* @__PURE__ */ C("br", {}),
|
|
290
|
+
/* @__PURE__ */ C("br", {}),
|
|
286
291
|
"Make sure the underlying issue (e.g. a downstream service that was down) is actually resolved — otherwise it will fail again."
|
|
287
292
|
] }),
|
|
288
|
-
confirmLabel:
|
|
289
|
-
loading:
|
|
293
|
+
confirmLabel: Y ? "Requeueing…" : "Retry",
|
|
294
|
+
loading: Y
|
|
290
295
|
})]
|
|
291
296
|
})
|
|
292
297
|
});
|
|
293
298
|
}
|
|
294
299
|
//#endregion
|
|
295
|
-
export {
|
|
300
|
+
export { M as SyncFailuresPage };
|
|
296
301
|
|
|
297
302
|
//# sourceMappingURL=SyncFailuresPage.js.map
|