spine-framework 0.3.125 → 0.3.127
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/.framework/cli/commands/agents.ts +35 -37
- package/.framework/cli/commands/auth.ts +35 -34
- package/.framework/cli/commands/create-app.ts +104 -40
- package/.framework/cli/commands/dev.ts +104 -69
- package/.framework/cli/commands/doctor.ts +169 -97
- package/.framework/cli/commands/generate.ts +82 -161
- package/.framework/cli/commands/init.ts +72 -34
- package/.framework/cli/commands/install-app.ts +260 -125
- package/.framework/cli/commands/items.ts +33 -44
- package/.framework/cli/commands/migrate.ts +122 -40
- package/.framework/cli/commands/migrations.ts +33 -40
- package/.framework/cli/commands/pipelines.ts +31 -39
- package/.framework/cli/commands/status.ts +47 -23
- package/.framework/cli/commands/system.ts +47 -37
- package/.framework/cli/commands/test.ts +112 -68
- package/.framework/cli/commands/validate-app.ts +215 -121
- package/.framework/cli/context.ts +112 -130
- package/.framework/cli/env-loader.ts +47 -18
- package/.framework/cli/index.ts +81 -42
- package/.framework/docs/runtime-types.md +1024 -0
- package/.framework/functions/_shared/agent-runner.ts +1296 -961
- package/.framework/functions/_shared/app-manifest.ts +82 -68
- package/.framework/functions/_shared/audit.ts +135 -83
- package/.framework/functions/_shared/{cil-state.ts → cil.ts} +147 -54
- package/.framework/functions/_shared/db.ts +80 -126
- package/.framework/functions/_shared/hash-api-key.ts +63 -0
- package/.framework/functions/_shared/index.ts +222 -347
- package/.framework/functions/_shared/kb.ts +319 -0
- package/.framework/functions/_shared/llm.ts +92 -0
- package/.framework/functions/_shared/logging.ts +288 -0
- package/.framework/functions/_shared/middleware.ts +329 -365
- package/.framework/functions/_shared/outcomes.ts +36 -0
- package/.framework/functions/_shared/permissions.ts +359 -643
- package/.framework/functions/_shared/pipeline-runner.ts +243 -316
- package/.framework/functions/_shared/principal.ts +376 -468
- package/.framework/functions/_shared/resolve-credentials.ts +102 -0
- package/.framework/functions/_shared/resolve-ids.ts +162 -14
- package/.framework/functions/_shared/retry-deliveries.ts +104 -0
- package/.framework/functions/_shared/schema-utils.ts +611 -373
- package/.framework/functions/_shared/testing.ts +207 -137
- package/.framework/functions/_shared/tracing.ts +276 -0
- package/.framework/functions/_shared/trigger-engine.ts +159 -211
- package/.framework/functions/_shared/webhook-registration.ts +95 -81
- package/.framework/functions/_shared/webhook-registry.ts +153 -75
- package/.framework/functions/account-nodes.ts +31 -53
- package/.framework/functions/adapters/generic-webhook-inbound.ts +56 -0
- package/.framework/functions/adapters/generic-webhook-outbound.ts +43 -0
- package/.framework/functions/adapters/openai-outbound.ts +40 -0
- package/.framework/functions/admin-data.ts +687 -533
- package/.framework/functions/admin-funnel.ts +31 -20
- package/.framework/functions/admin-install-funnel.ts +47 -28
- package/.framework/functions/admin-signals.ts +47 -29
- package/.framework/functions/ai-agents.ts +122 -147
- package/.framework/functions/ai-interactions.ts +180 -90
- package/.framework/functions/api-keys.ts +250 -192
- package/.framework/functions/apps.ts +203 -197
- package/.framework/functions/auth.ts +98 -91
- package/.framework/functions/cil-agent-ingest.ts +773 -0
- package/.framework/functions/cil-agent.ts +592 -0
- package/.framework/functions/cil-callmap.ts +1227 -0
- package/.framework/functions/cil-config.ts +583 -0
- package/.framework/functions/cil-context.ts +445 -0
- package/.framework/functions/cil-doc.ts +1752 -0
- package/.framework/functions/cil-embeddings.ts +1202 -0
- package/.framework/functions/cil-graph.ts +585 -0
- package/.framework/functions/cil-ingest.ts +2416 -0
- package/.framework/functions/cil-pipeline.ts +318 -0
- package/.framework/functions/cil-project.ts +499 -0
- package/.framework/functions/cil-validate.ts +469 -0
- package/.framework/functions/debug-auth.ts +73 -53
- package/.framework/functions/deliveries.ts +117 -0
- package/.framework/functions/embeddings.ts +528 -516
- package/.framework/functions/eval-harness.ts +158 -106
- package/.framework/functions/integration-outbound.ts +311 -0
- package/.framework/functions/integration-routes.ts +240 -466
- package/.framework/functions/integrations.ts +132 -140
- package/.framework/functions/invites.ts +401 -201
- package/.framework/functions/item-progress.ts +113 -53
- package/.framework/functions/kb.ts +28 -0
- package/.framework/functions/logs.ts +239 -222
- package/.framework/functions/observability.ts +308 -259
- package/.framework/functions/pipeline-executions.ts +179 -235
- package/.framework/functions/pipelines.ts +163 -205
- package/.framework/functions/prompt-configs.ts +109 -156
- package/.framework/functions/roles.ts +97 -147
- package/.framework/functions/system-cron.ts +132 -218
- package/.framework/functions/system.ts +112 -52
- package/.framework/functions/tests.ts +32 -28
- package/.framework/functions/timers.ts +162 -210
- package/.framework/functions/triggers.ts +282 -346
- package/.framework/functions/types.ts +283 -400
- package/.framework/migrations/001_core_schema.sql +630 -0
- package/.framework/migrations/002_core_rls_and_functions.sql +532 -0
- package/.framework/migrations/{003_system_data.sql → 003_core_system_data.sql} +26 -153
- package/.framework/migrations/004_core_rpc_and_broker.sql +421 -0
- package/.framework/migrations/005_core_observability.sql +598 -0
- package/.framework/migrations/006_security_hardening_rls.sql +97 -0
- package/.framework/migrations/007_kb_article_list.sql +237 -0
- package/.framework/migrations/008_items_target.sql +8 -0
- package/.framework/migrations/009_roles_slug_unique.sql +11 -0
- package/.framework/public/spine.config.json +91 -0
- package/.framework/scripts/app-install-cli.ts +112 -98
- package/.framework/src/App.tsx +67 -20
- package/.framework/src/apps/admin/index.tsx +97 -27
- package/.framework/src/components/AppWrapper.tsx +50 -11
- package/.framework/src/components/CustomAppLoader.tsx +131 -22
- package/.framework/src/components/admin/AdminListPage.tsx +75 -8
- package/.framework/src/components/admin/AdminSidebar.tsx +148 -36
- package/.framework/src/components/admin/AdminStatsCard.tsx +48 -29
- package/.framework/src/components/admin/PageInstructions.tsx +49 -0
- package/.framework/src/components/admin/SortableTableHeader.tsx +49 -2
- package/.framework/src/components/app-shell/GenericAppShell.tsx +69 -11
- package/.framework/src/components/app-shell/GenericDetailPage.tsx +55 -10
- package/.framework/src/components/app-shell/GenericListPage.tsx +76 -9
- package/.framework/src/components/app-sidebar.tsx +50 -3
- package/.framework/src/components/auth/ProtectedRoute.tsx +53 -45
- package/.framework/src/components/kb/KBArticleEditor.tsx +409 -0
- package/.framework/src/components/kb/KBArticleList.tsx +557 -0
- package/.framework/src/components/layout/AppShell.tsx +54 -16
- package/.framework/src/components/layout/Header.tsx +50 -38
- package/.framework/src/components/layout/Layout.tsx +48 -32
- package/.framework/src/components/layout/Sidebar.tsx +167 -16
- package/.framework/src/components/runtime/DataDetailHeader.tsx +33 -1
- package/.framework/src/components/runtime/DataDetailPage.tsx +289 -4
- package/.framework/src/components/runtime/DataFilters.tsx +78 -1
- package/.framework/src/components/runtime/DataHeader.tsx +32 -29
- package/.framework/src/components/runtime/DataListPage.tsx +161 -2
- package/.framework/src/components/runtime/DataStats.tsx +48 -1
- package/.framework/src/components/runtime/DataTable.tsx +153 -1
- package/.framework/src/components/runtime/SchemaDetailForm.tsx +77 -46
- package/.framework/src/components/runtime/index.ts +16 -9
- package/.framework/src/components/search-form.tsx +33 -1
- package/.framework/src/components/shared/AgentView.tsx +48 -51
- package/.framework/src/components/shared/FieldRenderer.tsx +84 -67
- package/.framework/src/components/shared/InviteManager.tsx +113 -52
- package/.framework/src/components/shared/MemberList.tsx +182 -0
- package/.framework/src/components/shared/SchemaFields.tsx +96 -78
- package/.framework/src/components/ui/DataTable.tsx +86 -56
- package/.framework/src/components/ui/Form.tsx +188 -109
- package/.framework/src/components/ui/ItemCard.tsx +86 -58
- package/.framework/src/components/ui/ItemListView.tsx +88 -61
- package/.framework/src/components/ui/LoadingSpinner.tsx +52 -27
- package/.framework/src/components/ui/Modal.tsx +81 -4
- package/.framework/src/components/ui/RichTextEditor.tsx +101 -9
- package/.framework/src/components/ui/accordion.tsx +97 -5
- package/.framework/src/components/ui/alert-dialog.tsx +225 -13
- package/.framework/src/components/ui/alert.tsx +113 -6
- package/.framework/src/components/ui/aspect-ratio.tsx +49 -2
- package/.framework/src/components/ui/avatar.tsx +129 -7
- package/.framework/src/components/ui/badge.tsx +65 -3
- package/.framework/src/components/ui/breadcrumb.tsx +145 -8
- package/.framework/src/components/ui/button-group.tsx +81 -4
- package/.framework/src/components/ui/button.tsx +49 -2
- package/.framework/src/components/ui/calendar.tsx +65 -3
- package/.framework/src/components/ui/card.tsx +145 -8
- package/.framework/src/components/ui/carousel.tsx +129 -7
- package/.framework/src/components/ui/chart.tsx +161 -10
- package/.framework/src/components/ui/checkbox.tsx +49 -2
- package/.framework/src/components/ui/collapsible.tsx +81 -5
- package/.framework/src/components/ui/combobox.tsx +305 -20
- package/.framework/src/components/ui/command.tsx +177 -11
- package/.framework/src/components/ui/context-menu.tsx +273 -17
- package/.framework/src/components/ui/dialog.tsx +209 -27
- package/.framework/src/components/ui/direction.tsx +64 -4
- package/.framework/src/components/ui/drawer.tsx +193 -12
- package/.framework/src/components/ui/dropdown-menu.tsx +273 -18
- package/.framework/src/components/ui/empty.tsx +145 -9
- package/.framework/src/components/ui/field.tsx +209 -14
- package/.framework/src/components/ui/hover-card.tsx +81 -4
- package/.framework/src/components/ui/input-group.tsx +162 -10
- package/.framework/src/components/ui/input-otp.tsx +98 -5
- package/.framework/src/components/ui/input.tsx +49 -2
- package/.framework/src/components/ui/item.tsx +225 -13
- package/.framework/src/components/ui/kbd.tsx +65 -3
- package/.framework/src/components/ui/label.tsx +49 -2
- package/.framework/src/components/ui/menubar.tsx +289 -17
- package/.framework/src/components/ui/native-select.tsx +97 -5
- package/.framework/src/components/ui/navigation-menu.tsx +177 -10
- package/.framework/src/components/ui/pagination.tsx +161 -9
- package/.framework/src/components/ui/popover.tsx +145 -8
- package/.framework/src/components/ui/progress.tsx +49 -2
- package/.framework/src/components/ui/radio-group.tsx +65 -3
- package/.framework/src/components/ui/resizable.tsx +82 -4
- package/.framework/src/components/ui/scroll-area.tsx +65 -3
- package/.framework/src/components/ui/select.tsx +193 -11
- package/.framework/src/components/ui/separator.tsx +49 -2
- package/.framework/src/components/ui/sheet.tsx +193 -11
- package/.framework/src/components/ui/sidebar.tsx +481 -38
- package/.framework/src/components/ui/skeleton.tsx +49 -2
- package/.framework/src/components/ui/slider.tsx +49 -2
- package/.framework/src/components/ui/sonner.tsx +49 -2
- package/.framework/src/components/ui/spinner.tsx +49 -2
- package/.framework/src/components/ui/switch.tsx +49 -2
- package/.framework/src/components/ui/table-primitives.tsx +160 -33
- package/.framework/src/components/ui/table.tsx +161 -9
- package/.framework/src/components/ui/tabs.tsx +113 -6
- package/.framework/src/components/ui/textarea.tsx +49 -2
- package/.framework/src/components/ui/toggle-group.tsx +81 -4
- package/.framework/src/components/ui/toggle.tsx +65 -3
- package/.framework/src/components/ui/tooltip.tsx +97 -5
- package/.framework/src/contexts/AppContext.tsx +129 -45
- package/.framework/src/contexts/AuthContext.tsx +173 -145
- package/.framework/src/hooks/use-mobile.ts +48 -2
- package/.framework/src/hooks/useApi.ts +208 -159
- package/.framework/src/hooks/useAppPath.ts +32 -23
- package/.framework/src/hooks/useApps.ts +51 -20
- package/.framework/src/hooks/useEntityList.ts +32 -78
- package/.framework/src/hooks/useEntityRecord.ts +35 -96
- package/.framework/src/hooks/useForm.ts +32 -92
- package/.framework/src/hooks/useListSchema.ts +49 -78
- package/.framework/src/hooks/useSchemaRecord.ts +114 -105
- package/.framework/src/lib/api.ts +192 -115
- package/.framework/src/lib/supabase.ts +98 -64
- package/.framework/src/lib/utils.ts +287 -151
- package/.framework/src/main.tsx +49 -3
- package/.framework/src/pages/DashboardPage.tsx +52 -29
- package/.framework/src/pages/NotFoundPage.tsx +32 -10
- package/.framework/src/pages/SetupPage.tsx +32 -12
- package/.framework/src/pages/admin/AIAgentDetailPage.tsx +119 -10
- package/.framework/src/pages/admin/AIAgentsPage.tsx +48 -19
- package/.framework/src/pages/admin/APIKeyDetailPage.tsx +187 -17
- package/.framework/src/pages/admin/APIKeysPage.tsx +98 -22
- package/.framework/src/pages/admin/AlertsConfigPage.tsx +113 -26
- package/.framework/src/pages/admin/AppDetailPage.tsx +125 -8
- package/.framework/src/pages/admin/AppsPage.tsx +49 -2
- package/.framework/src/pages/admin/DeliveriesPage.tsx +196 -0
- package/.framework/src/pages/admin/DesignedPage.tsx +32 -18
- package/.framework/src/pages/admin/EmbeddingDetailPage.tsx +215 -484
- package/.framework/src/pages/admin/EmbeddingsPage.tsx +116 -319
- package/.framework/src/pages/admin/ExtendedShadcnTestPage.tsx +34 -9
- package/.framework/src/pages/admin/IncrementalShadcnTestPage.tsx +34 -9
- package/.framework/src/pages/admin/IntegratedDashboard.tsx +32 -16
- package/.framework/src/pages/admin/IntegrationDetailPage.tsx +183 -26
- package/.framework/src/pages/admin/IntegrationsPage.tsx +48 -19
- package/.framework/src/pages/admin/InvitesPage.tsx +48 -14
- package/.framework/src/pages/admin/LogsPage.tsx +422 -75
- package/.framework/src/pages/admin/MinimalShadcnTestPage.tsx +34 -9
- package/.framework/src/pages/admin/ObservabilityDashboard.tsx +113 -24
- package/.framework/src/pages/admin/PipelineDetailPage.tsx +206 -34
- package/.framework/src/pages/admin/PipelineExecutionsPage.tsx +50 -17
- package/.framework/src/pages/admin/PipelinesPage.tsx +160 -21
- package/.framework/src/pages/admin/PromptConfigDetailPage.tsx +378 -88
- package/.framework/src/pages/admin/PromptConfigsPage.tsx +125 -16
- package/.framework/src/pages/admin/ProperlyDesignedPage.tsx +49 -10
- package/.framework/src/pages/admin/RoleDetailPage.tsx +130 -10
- package/.framework/src/pages/admin/RolesPage.tsx +171 -18
- package/.framework/src/pages/admin/SelectTestPage.tsx +34 -9
- package/.framework/src/pages/admin/ShadcnTestPage.tsx +49 -11
- package/.framework/src/pages/admin/SimpleDashboard.tsx +49 -10
- package/.framework/src/pages/admin/TestRunDetailPage.tsx +49 -4
- package/.framework/src/pages/admin/TestingDashboard.tsx +98 -28
- package/.framework/src/pages/admin/TimerDetailPage.tsx +143 -33
- package/.framework/src/pages/admin/TimersPage.tsx +48 -20
- package/.framework/src/pages/admin/TriggerDetailPage.tsx +118 -30
- package/.framework/src/pages/admin/TriggersPage.tsx +64 -19
- package/.framework/src/pages/admin/TypeDetailPage.tsx +138 -15
- package/.framework/src/pages/admin/TypesPage.tsx +48 -20
- package/.framework/src/pages/admin/cil/CILAgentPage.tsx +465 -0
- package/.framework/src/pages/admin/cil/CILChunkDetailPage.tsx +787 -0
- package/.framework/src/pages/admin/cil/CILDashboardPage.tsx +699 -0
- package/.framework/src/pages/admin/cil/CILFileListPage.tsx +647 -0
- package/.framework/src/pages/admin/cil/CILGraphPage.tsx +616 -0
- package/.framework/src/pages/admin/cil/CILIngestionPage.tsx +1402 -0
- package/.framework/src/pages/admin/cil/CILProjectsPage.tsx +614 -0
- package/.framework/src/pages/admin/cil/CILSearchPage.tsx +571 -0
- package/.framework/src/pages/admin/cil/FlexiblePipelinePage.tsx +731 -0
- package/.framework/src/pages/admin/kb/KBAdminPage.tsx +64 -0
- package/.framework/src/pages/auth/AuthConfirmPage.tsx +52 -51
- package/.framework/src/pages/auth/ForgotPasswordPage.tsx +31 -22
- package/.framework/src/pages/auth/LoginPage.tsx +50 -23
- package/.framework/src/pages/auth/PendingApprovalPage.tsx +31 -15
- package/.framework/src/pages/auth/RegisterPage.tsx +281 -317
- package/.framework/src/pages/spine-framework/APIPage.tsx +33 -0
- package/.framework/src/pages/spine-framework/CLIPage.tsx +33 -0
- package/.framework/src/types/auth.ts +128 -71
- package/.framework/src/types/types.ts +373 -157
- package/custom/.devin/skills/spine-workbench-discovery/SKILL.md +39 -0
- package/custom/.devin/skills/spine-workbench-idea/SKILL.md +36 -0
- package/custom/.devin/skills/spine-workbench-implement/SKILL.md +46 -0
- package/custom/.devin/skills/spine-workbench-initiative/SKILL.md +28 -0
- package/custom/.devin/skills/spine-workbench-plan/SKILL.md +38 -0
- package/docs/README.md +9 -130
- package/netlify.toml +3 -3
- package/package.json +13 -25
- package/scripts/kb-ingest-docs.ts +203 -0
- package/spine.config.json +65 -4
- package/.framework/migrations/001_schema.sql +0 -425
- package/.framework/migrations/002_rls_and_functions.sql +0 -763
- package/.framework/migrations/004_enhancements.sql +0 -43
- package/.framework/migrations/005_auth_user_trigger.sql +0 -105
- package/.framework/migrations/006_fix_current_actor_id.sql +0 -21
- package/.framework/migrations/016_invites.sql +0 -27
- package/.framework/migrations/017_fix_get_account_apps.sql +0 -78
- package/.framework/migrations/018_apps_required_roles.sql +0 -17
- package/.framework/migrations/019_triggers_unique_constraint.sql +0 -13
- package/.framework/migrations/020_get_account_apps_role_filter.sql +0 -117
- package/.framework/migrations/021_app_domains.sql +0 -112
- package/.framework/migrations/022_route_prefix_domain_unique.sql +0 -21
- package/.framework/migrations/023_match_embeddings_rpc.sql +0 -78
- package/.framework/migrations/024_messages_account_id.sql +0 -9
- package/.framework/migrations/025_retype_threads_messages.sql +0 -240
- package/.framework/migrations/026_fix_rls_policies.sql +0 -47
- package/.framework/migrations/027_embedding_lifecycle.sql +0 -176
- package/.framework/migrations/028_fix_message_data_permissions.sql +0 -49
- package/.framework/migrations/029_tighten_support_triage_prompt.sql +0 -41
- package/.framework/migrations/030_messages_updated_by.sql +0 -6
- package/.framework/migrations/031_seed_upsert_constraints.sql +0 -35
- package/docs/APPS.md +0 -232
- package/docs/ARCHITECTURE.md +0 -246
- package/docs/INSTALL.md +0 -155
- package/docs/design-schema-spec.md +0 -1837
- package/docs/dev-guides/01-create-an-app.md +0 -183
- package/docs/dev-guides/02-create-a-function.md +0 -178
- package/docs/dev-guides/03-create-a-component.md +0 -178
- package/docs/dev-guides/04-webhook-handlers.md +0 -129
- package/docs/dev-guides/05-testing.md +0 -168
- package/docs/dev-guides/README.md +0 -40
- package/docs/npm-packages-plan.md +0 -288
- package/docs/spine-core--api-reference.md +0 -822
|
@@ -1,9 +1,43 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
// CIL[BEGIN chunk_id="genericappshell_module_header_1783930597" type="module_header" identity="imports" parent="none"]
|
|
7
|
+
// CIL[DOC-MACRO purpose="Import React hooks and routing components for app shell"]
|
|
8
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Provide state management and routing dependencies"]
|
|
9
|
+
// CIL[DOC-CONTEXT module="generic-app-shell" layer="frontend-component" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/migrations/015_simplify_apps_table.sql\",\".framework/src/components/ui/dialog.tsx\",\"\\\"]"]
|
|
10
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="Imported modules" errors="none" side_effects="none"]
|
|
11
|
+
// CIL[DOC-MICRO logic_summary="Imports React hooks, routing components, and app-specific pages" notable_decisions="[]"]
|
|
12
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
13
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
14
|
+
// CIL[DOC-AUDIENCE audience="developer"]
|
|
15
|
+
// CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/migrations/015_simplify_apps_table.sql, .framework/src/components/ui/dialog.tsx, \."]
|
|
16
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
17
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
18
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
19
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
20
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
1
21
|
import { useState } from 'react'
|
|
2
22
|
import { Routes, Route, Navigate, useNavigate, useLocation } from 'react-router-dom'
|
|
3
23
|
import { AppRecord } from '../../hooks/useApps'
|
|
4
24
|
import { GenericListPage } from './GenericListPage'
|
|
5
25
|
import { GenericDetailPage } from './GenericDetailPage'
|
|
6
|
-
|
|
26
|
+
// CIL[END chunk_id="genericappshell_module_header_1783930597"]
|
|
27
|
+
// CIL[BEGIN chunk_id="genericappshell_navitem_1783930597" type="interface" identity="NavItem" parent="none"]
|
|
28
|
+
// CIL[DOC-MACRO purpose="Define navigation item structure for app shell"]
|
|
29
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Specify navigation properties and routing metadata"]
|
|
30
|
+
// CIL[DOC-CONTEXT module="generic-app-shell" layer="frontend-component" related_files="[\".framework/migrations/015_simplify_apps_table.sql\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\"\\\"]"]
|
|
31
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="Type definition" errors="none" side_effects="none"]
|
|
32
|
+
// CIL[DOC-MICRO logic_summary="Interface with id, label, path, and optional type/view metadata" notable_decisions="[]"]
|
|
33
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
34
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
35
|
+
// CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 0. Direct calls: 0. Related files: .framework/migrations/015_simplify_apps_table.sql, .framework/src/pages/admin/IntegrationsPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, custom/apps/portal/pages/ContentPage.tsx, \."]
|
|
36
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
37
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
38
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
39
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
40
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
7
41
|
interface NavItem {
|
|
8
42
|
id: string
|
|
9
43
|
label: string
|
|
@@ -13,16 +47,39 @@ interface NavItem {
|
|
|
13
47
|
view?: string
|
|
14
48
|
min_role?: string
|
|
15
49
|
}
|
|
16
|
-
|
|
50
|
+
// CIL[END chunk_id="genericappshell_navitem_1783930597"]
|
|
51
|
+
// CIL[BEGIN chunk_id="genericappshell_genericappshellprops_1783930597" type="interface" identity="GenericAppShellProps" parent="none"]
|
|
52
|
+
// CIL[DOC-MACRO purpose="Define props interface for generic app shell component"]
|
|
53
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Specify app configuration input for shell"]
|
|
54
|
+
// CIL[DOC-CONTEXT module="generic-app-shell" layer="frontend-component" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/migrations/015_simplify_apps_table.sql\",\".framework/functions/_shared/schema-utils.ts\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"\\\"]"]
|
|
55
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="Type definition" errors="none" side_effects="none"]
|
|
56
|
+
// CIL[DOC-MICRO logic_summary="Simple interface requiring app record with navigation configuration" notable_decisions="[]"]
|
|
57
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
58
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
59
|
+
// CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, .framework/migrations/015_simplify_apps_table.sql, .framework/functions/_shared/schema-utils.ts, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, \."]
|
|
60
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
61
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
62
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
63
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
64
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
17
65
|
interface GenericAppShellProps {
|
|
18
66
|
app: AppRecord
|
|
19
67
|
}
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
68
|
+
// CIL[END chunk_id="genericappshell_genericappshellprops_1783930597"]
|
|
69
|
+
// CIL[BEGIN chunk_id="genericappshell_genericappshell_1783930597" type="function" identity="GenericAppShell" parent="none"]
|
|
70
|
+
// CIL[DOC-MACRO purpose="Data-driven app shell with sidebar navigation and routing"]
|
|
71
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Create complete app layout from app configuration"]
|
|
72
|
+
// CIL[DOC-CONTEXT module="generic-app-shell" layer="frontend-component" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/migrations/015_simplify_apps_table.sql\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"custom/apps/cortex/functions/custom_cil-embeddings.ts\",\"\\\"]"]
|
|
73
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="JSX app shell with routes" errors="none" side_effects="Renders navigation, handles routing, manages sidebar state"]
|
|
74
|
+
// CIL[DOC-MICRO logic_summary="Builds sidebar from nav_items, generates routes for list/detail pages, handles mobile responsiveness" notable_decisions="[]"]
|
|
75
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
76
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
77
|
+
// CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, .framework/migrations/015_simplify_apps_table.sql, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, custom/apps/cortex/functions/custom_cil-embeddings.ts, \."]
|
|
78
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
79
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
80
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
81
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
82
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
26
83
|
export function GenericAppShell({ app }: GenericAppShellProps) {
|
|
27
84
|
const navigate = useNavigate()
|
|
28
85
|
const location = useLocation()
|
|
@@ -30,10 +87,10 @@ export function GenericAppShell({ app }: GenericAppShellProps) {
|
|
|
30
87
|
|
|
31
88
|
const navItems: NavItem[] = (app.nav_items || []) as NavItem[]
|
|
32
89
|
|
|
33
|
-
|
|
90
|
+
|
|
34
91
|
const prefix = app.route_prefix || `/${app.slug}`
|
|
35
92
|
|
|
36
|
-
|
|
93
|
+
|
|
37
94
|
const isActive = (item: NavItem) => {
|
|
38
95
|
const fullPath = item.path.startsWith('/') ? item.path : `${prefix}/${item.path}`
|
|
39
96
|
return location.pathname.startsWith(fullPath)
|
|
@@ -120,7 +177,7 @@ export function GenericAppShell({ app }: GenericAppShellProps) {
|
|
|
120
177
|
|
|
121
178
|
{/* Generate list + detail routes for each nav item with type_slug */}
|
|
122
179
|
{navItems.filter(item => item.type_slug).map(item => {
|
|
123
|
-
|
|
180
|
+
|
|
124
181
|
const relativePath = item.path.startsWith(prefix)
|
|
125
182
|
? item.path.slice(prefix.length).replace(/^\//, '')
|
|
126
183
|
: item.path.replace(/^\//, '')
|
|
@@ -179,3 +236,4 @@ export function GenericAppShell({ app }: GenericAppShellProps) {
|
|
|
179
236
|
</div>
|
|
180
237
|
)
|
|
181
238
|
}
|
|
239
|
+
// CIL[END chunk_id="genericappshell_genericappshell_1783930597"]
|
|
@@ -1,20 +1,64 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
// CIL[BEGIN chunk_id="genericdetailpage_module_header_1783930597" type="module_header" identity="imports" parent="none"]
|
|
6
|
+
// CIL[DOC-MACRO purpose="Import React hooks and routing components for detail page"]
|
|
7
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Provide state management and navigation dependencies"]
|
|
8
|
+
// CIL[DOC-CONTEXT module="generic-detail-page" layer="frontend-component" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\".framework/src/components/ui/dialog.tsx\",\"\\\"]"]
|
|
9
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="Imported modules" errors="none" side_effects="none"]
|
|
10
|
+
// CIL[DOC-MICRO logic_summary="Imports React hooks, routing components, and entity record hook" notable_decisions="[]"]
|
|
11
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
12
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
13
|
+
// CIL[DOC-AUDIENCE audience="developer"]
|
|
14
|
+
// CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/src/pages/admin/RolesPage.tsx, .framework/src/components/ui/dialog.tsx, \."]
|
|
15
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
16
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
17
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
18
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
19
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
1
20
|
import { useState, useEffect } from 'react'
|
|
2
21
|
import { useParams, useSearchParams, useNavigate } from 'react-router-dom'
|
|
3
22
|
import { useEntityRecord } from '../../hooks/useEntityRecord'
|
|
4
23
|
import { DataDetailHeader } from '../runtime/DataDetailHeader'
|
|
5
24
|
import { SchemaDetailForm } from '../runtime/SchemaDetailForm'
|
|
6
|
-
|
|
25
|
+
// CIL[END chunk_id="genericdetailpage_module_header_1783930597"]
|
|
26
|
+
// CIL[BEGIN chunk_id="genericdetailpage_genericdetailpageprops_1783930597" type="interface" identity="GenericDetailPageProps" parent="none"]
|
|
27
|
+
// CIL[DOC-MACRO purpose="Define props interface for generic detail page component"]
|
|
28
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Specify configuration for schema-driven detail display"]
|
|
29
|
+
// CIL[DOC-CONTEXT module="generic-detail-page" layer="frontend-component" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/functions/_shared/schema-utils.ts\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\"\\\"]"]
|
|
30
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="Type definition" errors="none" side_effects="none"]
|
|
31
|
+
// CIL[DOC-MICRO logic_summary="Interface with type slug, optional view, and creation mode flag" notable_decisions="[]"]
|
|
32
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
33
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
34
|
+
// CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/functions/_shared/schema-utils.ts, .framework/src/pages/admin/IntegrationsPage.tsx, \."]
|
|
35
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
36
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
37
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
38
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
39
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
7
40
|
interface GenericDetailPageProps {
|
|
8
41
|
typeSlug: string
|
|
9
42
|
viewSlug?: string
|
|
10
43
|
isCreating?: boolean
|
|
11
44
|
}
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
45
|
+
// CIL[END chunk_id="genericdetailpage_genericdetailpageprops_1783930597"]
|
|
46
|
+
// CIL[BEGIN chunk_id="genericdetailpage_genericdetailpage_1783930597" type="function" identity="GenericDetailPage" parent="none"]
|
|
47
|
+
// CIL[DOC-LEARNING topic="runtime-type:generic/detail_view" content="GenericDetailPage renders record.design_schema.views.default_detail.sections. Each section has a title and a fields map. field.system=true means the value is read from the record row; otherwise from record.data. FieldRenderer uses field.data_type and the view's display_type to choose the widget."]
|
|
48
|
+
// CIL[DOC-NOTE type="design_schema_caveat" content="Without views.default_detail or fields missing from the schema, the detail page will be blank. The page falls back to useSchemaRecord defaults only for new records."]
|
|
49
|
+
// CIL[DOC-MACRO purpose="Schema-driven detail page with form for create/edit/view"]
|
|
50
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Handle CRUD operations and form state for entity records"]
|
|
51
|
+
// CIL[DOC-CONTEXT module="generic-detail-page" layer="frontend-component" related_files="[\".framework/src/pages/admin/TypeDetailPage.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\"\\\"]"]
|
|
52
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="JSX detail page with form" errors="Loading/saving errors" side_effects="Data fetching, form state management, navigation"]
|
|
53
|
+
// CIL[DOC-MICRO logic_summary="Manages record CRUD, form state, edit modes, renders runtime components" notable_decisions="[]"]
|
|
54
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
55
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
56
|
+
// CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/TypeDetailPage.tsx, custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/pages/admin/IntegrationsPage.tsx, .framework/src/pages/admin/RolesPage.tsx, \."]
|
|
57
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
58
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
59
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
60
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
61
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
18
62
|
export function GenericDetailPage({ typeSlug, viewSlug, isCreating: forceCreate }: GenericDetailPageProps) {
|
|
19
63
|
const { id } = useParams<{ id: string }>()
|
|
20
64
|
const navigate = useNavigate()
|
|
@@ -48,21 +92,21 @@ export function GenericDetailPage({ typeSlug, viewSlug, isCreating: forceCreate
|
|
|
48
92
|
deleting
|
|
49
93
|
} = useEntityRecord('items', id, config)
|
|
50
94
|
|
|
51
|
-
|
|
95
|
+
|
|
52
96
|
const schema = record?.design_schema || null
|
|
53
97
|
const resolvedDetailView = viewSlug
|
|
54
98
|
? schema?.views?.[viewSlug] || schema?.views?.default_detail
|
|
55
99
|
: schema?.views?.default_detail
|
|
56
100
|
const view = resolvedDetailView || null
|
|
57
101
|
|
|
58
|
-
|
|
102
|
+
|
|
59
103
|
const displayField = schema?.display_field || config.displayField
|
|
60
104
|
const FALLBACK_FIELDS = ['full_name', 'display_name', 'name', 'title', 'slug', 'email']
|
|
61
105
|
const recordTitle = record?.[displayField]
|
|
62
106
|
?? FALLBACK_FIELDS.map(f => record?.[f]).find(v => v != null)
|
|
63
107
|
?? 'Untitled'
|
|
64
108
|
|
|
65
|
-
|
|
109
|
+
|
|
66
110
|
const [formData, setFormData] = useState<Record<string, any>>({})
|
|
67
111
|
|
|
68
112
|
useEffect(() => {
|
|
@@ -198,3 +242,4 @@ export function GenericDetailPage({ typeSlug, viewSlug, isCreating: forceCreate
|
|
|
198
242
|
</div>
|
|
199
243
|
)
|
|
200
244
|
}
|
|
245
|
+
// CIL[END chunk_id="genericdetailpage_genericdetailpage_1783930597"]
|
|
@@ -1,32 +1,77 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
// CIL[BEGIN chunk_id="genericlistpage_module_header_1783930597" type="module_header" identity="imports" parent="none"]
|
|
6
|
+
// CIL[DOC-MACRO purpose="Import hooks and runtime components for generic list page"]
|
|
7
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Provide data fetching and UI rendering dependencies"]
|
|
8
|
+
// CIL[DOC-CONTEXT module="generic-list-page" layer="frontend-component" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\".framework/src/components/ui/dialog.tsx\",\"\\\"]"]
|
|
9
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="Imported modules" errors="none" side_effects="none"]
|
|
10
|
+
// CIL[DOC-MICRO logic_summary="Imports schema hook, entity list hook, and runtime UI components" notable_decisions="[]"]
|
|
11
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
12
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
13
|
+
// CIL[DOC-AUDIENCE audience="developer"]
|
|
14
|
+
// CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/src/pages/admin/RolesPage.tsx, .framework/src/components/ui/dialog.tsx, \."]
|
|
15
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
16
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
17
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
18
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
19
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
1
20
|
import { useListSchema } from '../../hooks/useListSchema'
|
|
2
21
|
import { useEntityList } from '../../hooks/useEntityList'
|
|
3
22
|
import { DataHeader } from '../runtime/DataHeader'
|
|
4
23
|
import { DataStats } from '../runtime/DataStats'
|
|
5
24
|
import { DataFilters } from '../runtime/DataFilters'
|
|
6
25
|
import { DataTable } from '../runtime/DataTable'
|
|
7
|
-
|
|
26
|
+
import { PageInstructions } from '../admin/PageInstructions'
|
|
27
|
+
// CIL[END chunk_id="genericlistpage_module_header_1783930597"]
|
|
28
|
+
// CIL[BEGIN chunk_id="genericlistpage_genericlistpageprops_1783930597" type="interface" identity="GenericListPageProps" parent="none"]
|
|
29
|
+
// CIL[DOC-MACRO purpose="Define props interface for generic list page component"]
|
|
30
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Specify configuration for schema-driven list display"]
|
|
31
|
+
// CIL[DOC-CONTEXT module="generic-list-page" layer="frontend-component" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/functions/_shared/schema-utils.ts\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\"\\\"]"]
|
|
32
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="Type definition" errors="none" side_effects="none"]
|
|
33
|
+
// CIL[DOC-MICRO logic_summary="Interface with type slug, view configuration, and routing paths" notable_decisions="[]"]
|
|
34
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
35
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
36
|
+
// CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/functions/_shared/schema-utils.ts, .framework/src/pages/admin/IntegrationsPage.tsx, \."]
|
|
37
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
38
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
39
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
40
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
41
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
8
42
|
interface GenericListPageProps {
|
|
9
43
|
typeSlug: string
|
|
10
44
|
viewSlug?: string
|
|
11
45
|
appPrefix: string
|
|
12
46
|
detailPath: string
|
|
13
47
|
}
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
48
|
+
// CIL[END chunk_id="genericlistpage_genericlistpageprops_1783930597"]
|
|
49
|
+
// CIL[BEGIN chunk_id="genericlistpage_genericlistpage_1783930597" type="function" identity="GenericListPage" parent="none"]
|
|
50
|
+
// CIL[DOC-LEARNING topic="runtime-type:generic/list_view" content="GenericListPage uses record.design_schema.views.default_list with type list and display table/card/board. It reads fields map for display_type, sortable, and searchable. It also uses default_sort, stats, filters, and group_by when present."]
|
|
51
|
+
// CIL[DOC-NOTE type="design_schema_caveat" content="A missing default_list view causes the list to render no columns unless useListSchema falls back to the types table. display_type must be one FieldRenderer recognizes or the cell falls back to text."]
|
|
52
|
+
// CIL[DOC-MACRO purpose="Schema-driven list page with data table and filters"]
|
|
53
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Render list view based on type schema and view configuration"]
|
|
54
|
+
// CIL[DOC-CONTEXT module="generic-list-page" layer="frontend-component" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\".framework/migrations/015_simplify_apps_table.sql\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"\\\"]"]
|
|
55
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="JSX list page with data table" errors="Schema loading errors" side_effects="Data fetching, renders UI components"]
|
|
56
|
+
// CIL[DOC-MICRO logic_summary="Resolves schema and view, builds config, fetches data, renders runtime components" notable_decisions="[]"]
|
|
57
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
58
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
59
|
+
// CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/pages/admin/IntegrationsPage.tsx, .framework/migrations/015_simplify_apps_table.sql, .framework/src/pages/admin/TypeDetailPage.tsx, \."]
|
|
60
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
61
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
62
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
63
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
64
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
20
65
|
export function GenericListPage({ typeSlug, viewSlug, appPrefix, detailPath }: GenericListPageProps) {
|
|
21
66
|
const resolvedViewSlug = viewSlug || 'default_list'
|
|
22
67
|
|
|
23
|
-
|
|
68
|
+
|
|
24
69
|
const { schema, view, loading: schemaLoading, error: schemaError } = useListSchema({
|
|
25
70
|
entity: 'items',
|
|
26
71
|
viewSlug: resolvedViewSlug
|
|
27
72
|
})
|
|
28
73
|
|
|
29
|
-
|
|
74
|
+
|
|
30
75
|
const config = view && schema ? {
|
|
31
76
|
entity: 'items',
|
|
32
77
|
typeSlug,
|
|
@@ -86,6 +131,27 @@ export function GenericListPage({ typeSlug, viewSlug, appPrefix, detailPath }: G
|
|
|
86
131
|
newButtonHref={`${appPrefix}/${detailPath}/new`}
|
|
87
132
|
/>
|
|
88
133
|
|
|
134
|
+
<PageInstructions
|
|
135
|
+
sections={[
|
|
136
|
+
{
|
|
137
|
+
title: 'What this page is for',
|
|
138
|
+
content: `This page lists all ${typeSlug} records for this app. It displays the stored records, their field values, and current status based on the app type schema.`,
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
title: 'How to find records',
|
|
142
|
+
content: `Use the filters above the table to narrow results. Click any column header to sort ascending or descending. The available columns and filters are defined by the type's design schema.`,
|
|
143
|
+
},
|
|
144
|
+
{
|
|
145
|
+
title: 'How to create, view, and edit records',
|
|
146
|
+
content: `Click the New button in the top-right to create a new ${typeSlug}. Click any row to open its detail view. From the detail view you can edit field values or delete the record. Permissions may restrict which actions are available to your role.`,
|
|
147
|
+
},
|
|
148
|
+
{
|
|
149
|
+
title: 'Understanding the stats',
|
|
150
|
+
content: `The cards above the table show summary counts and key metrics for this record type. Use them to quickly assess volume and status before drilling into the list.`,
|
|
151
|
+
},
|
|
152
|
+
]}
|
|
153
|
+
/>
|
|
154
|
+
|
|
89
155
|
<DataStats
|
|
90
156
|
stats={config.list.stats}
|
|
91
157
|
data={data}
|
|
@@ -114,3 +180,4 @@ export function GenericListPage({ typeSlug, viewSlug, appPrefix, detailPath }: G
|
|
|
114
180
|
</div>
|
|
115
181
|
)
|
|
116
182
|
}
|
|
183
|
+
// CIL[END chunk_id="genericlistpage_genericlistpage_1783930597"]
|
|
@@ -1,3 +1,22 @@
|
|
|
1
|
+
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
// CIL[BEGIN chunk_id="app-sidebar_module_header_1783930597" type="module_header" identity="imports" parent="none"]
|
|
6
|
+
// CIL[DOC-MACRO purpose="Import React and UI components for sidebar navigation"]
|
|
7
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Provide all external dependencies for the sidebar component"]
|
|
8
|
+
// CIL[DOC-CONTEXT module="app-sidebar" layer="frontend-component" related_files="[\".framework/src/components/layout/Sidebar.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/src/components/ui/dialog.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"\\\"]"]
|
|
9
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="Imported modules" errors="none" side_effects="none"]
|
|
10
|
+
// CIL[DOC-MICRO logic_summary="Imports React, UI components, and icons needed for sidebar" notable_decisions="[]"]
|
|
11
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
12
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
13
|
+
// CIL[DOC-AUDIENCE audience="developer"]
|
|
14
|
+
// CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 0. Direct calls: 0. Related files: .framework/src/components/layout/Sidebar.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, custom/apps/portal/pages/ContentPage.tsx, .framework/src/components/ui/dialog.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, \."]
|
|
15
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
16
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
17
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
18
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
19
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
1
20
|
import * as React from "react"
|
|
2
21
|
|
|
3
22
|
import { SearchForm } from "./search-form"
|
|
@@ -20,8 +39,21 @@ import {
|
|
|
20
39
|
SidebarRail,
|
|
21
40
|
} from "./ui/sidebar"
|
|
22
41
|
import { GalleryVerticalEndIcon, PlusIcon, MinusIcon } from "lucide-react"
|
|
23
|
-
|
|
24
|
-
//
|
|
42
|
+
// CIL[END chunk_id="app-sidebar_module_header_1783930597"]
|
|
43
|
+
// CIL[BEGIN chunk_id="app-sidebar_data_1783930597" type="constant" identity="data" parent="none"]
|
|
44
|
+
// CIL[DOC-MACRO purpose="Define navigation structure for documentation sidebar"]
|
|
45
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Provide hierarchical navigation data with sections and items"]
|
|
46
|
+
// CIL[DOC-CONTEXT module="app-sidebar" layer="frontend-component" related_files="[\".framework/src/components/layout/Sidebar.tsx\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\".framework/functions/_shared/principal.ts\",\".framework/functions/_shared/schema-utils.ts\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"\\\"]"]
|
|
47
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="Navigation data object" errors="none" side_effects="none"]
|
|
48
|
+
// CIL[DOC-MICRO logic_summary="Static navigation tree with Getting Started, Build Your Application, API Reference, Architecture, and Community sections" notable_decisions="[]"]
|
|
49
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
50
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
51
|
+
// CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 0. Direct calls: 0. Related files: .framework/src/components/layout/Sidebar.tsx, .framework/src/pages/admin/IntegrationsPage.tsx, .framework/functions/_shared/principal.ts, .framework/functions/_shared/schema-utils.ts, .framework/src/pages/admin/TypeDetailPage.tsx, \."]
|
|
52
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
53
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
54
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
55
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
56
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
25
57
|
const data = {
|
|
26
58
|
navMain: [
|
|
27
59
|
{
|
|
@@ -161,7 +193,21 @@ const data = {
|
|
|
161
193
|
},
|
|
162
194
|
],
|
|
163
195
|
}
|
|
164
|
-
|
|
196
|
+
// CIL[END chunk_id="app-sidebar_data_1783930597"]
|
|
197
|
+
// CIL[BEGIN chunk_id="app-sidebar_appsidebar_1783930597" type="function" identity="AppSidebar" parent="none"]
|
|
198
|
+
// CIL[DOC-MACRO purpose="Render main navigation sidebar with collapsible sections"]
|
|
199
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Create sidebar UI with header, navigation items, and search"]
|
|
200
|
+
// CIL[DOC-CONTEXT module="app-sidebar" layer="frontend-component" related_files="[\".framework/src/components/layout/Sidebar.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/functions/_shared/schema-utils.ts\",\".framework/src/pages/admin/RolesPage.tsx\",\".framework/src/components/ui/dialog.tsx\",\"\\\"]"]
|
|
201
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="JSX sidebar component" errors="none" side_effects="Renders navigation UI"]
|
|
202
|
+
// CIL[DOC-MICRO logic_summary="Maps navigation data to collapsible sidebar sections with icons and active states" notable_decisions="[]"]
|
|
203
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
204
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
205
|
+
// CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 0. Direct calls: 0. Related files: .framework/src/components/layout/Sidebar.tsx, custom/apps/portal/pages/ContentPage.tsx, .framework/functions/_shared/schema-utils.ts, .framework/src/pages/admin/RolesPage.tsx, .framework/src/components/ui/dialog.tsx, \."]
|
|
206
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
207
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
208
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
209
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
210
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
165
211
|
export function AppSidebar({ ...props }: React.ComponentProps<typeof Sidebar>) {
|
|
166
212
|
return (
|
|
167
213
|
<Sidebar {...props}>
|
|
@@ -226,3 +272,4 @@ export function AppSidebar({ ...props }: React.ComponentProps<typeof Sidebar>) {
|
|
|
226
272
|
</Sidebar>
|
|
227
273
|
)
|
|
228
274
|
}
|
|
275
|
+
// CIL[END chunk_id="app-sidebar_appsidebar_1783930597"]
|
|
@@ -1,55 +1,62 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @module src/components/auth/ProtectedRoute
|
|
3
|
-
* @audience installer
|
|
4
|
-
* @layer frontend-component
|
|
5
|
-
* @stability stable
|
|
6
|
-
*
|
|
7
|
-
* React Router route guard that enforces authentication and optional
|
|
8
|
-
* system-admin role checks. Wrap any `<Route>` element that requires
|
|
9
|
-
* a logged-in user.
|
|
10
|
-
*
|
|
11
|
-
* **Auth check:** If `AuthContext.user` is null (not yet logged in or
|
|
12
|
-
* session expired), redirects to `/login` using `<Navigate replace>`.
|
|
13
|
-
*
|
|
14
|
-
* **System-admin check:** When `requireSystemAdmin=true`, verifies that
|
|
15
|
-
* `user.roles` includes `'system_admin'`. On failure it renders an
|
|
16
|
-
* access-denied screen rather than redirecting, to avoid redirect loops.
|
|
17
|
-
*
|
|
18
|
-
* @example
|
|
19
|
-
* ```tsx
|
|
20
|
-
* <Route path="/admin" element={
|
|
21
|
-
* <ProtectedRoute requireSystemAdmin>
|
|
22
|
-
* <AdminLayout />
|
|
23
|
-
* </ProtectedRoute>
|
|
24
|
-
* } />
|
|
25
|
-
* ```
|
|
26
|
-
*
|
|
27
|
-
* @seeAlso src/contexts/AuthContext.tsx
|
|
28
|
-
*/
|
|
29
1
|
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
// CIL[BEGIN chunk_id="protectedroute_module_header_1783930597" type="module_header" identity="imports" parent="none"]
|
|
9
|
+
// CIL[DOC-MACRO purpose="Import React and routing components for authentication"]
|
|
10
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Provide core dependencies for route protection"]
|
|
11
|
+
// CIL[DOC-CONTEXT module="protected-route" layer="frontend-component" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/components/ui/dialog.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/functions/_shared/principal.ts\",\"\\\"]"]
|
|
12
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="Imported modules" errors="none" side_effects="none"]
|
|
13
|
+
// CIL[DOC-MICRO logic_summary="Imports React, Navigate for routing, and useAuth hook" notable_decisions="[]"]
|
|
14
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
15
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
16
|
+
// CIL[DOC-AUDIENCE audience="developer"]
|
|
17
|
+
// CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/components/ui/dialog.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/functions/_shared/principal.ts, \."]
|
|
18
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
19
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
20
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
21
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
22
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
30
23
|
import React from 'react'
|
|
31
24
|
import { Navigate } from 'react-router-dom'
|
|
32
25
|
import { useAuth } from '../../contexts/AuthContext'
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
26
|
+
// CIL[END chunk_id="protectedroute_module_header_1783930597"]
|
|
27
|
+
// CIL[BEGIN chunk_id="protectedroute_protectedrouteprops_1783930597" type="interface" identity="ProtectedRouteProps" parent="none"]
|
|
28
|
+
// CIL[DOC-MACRO purpose="Define props interface for route protection component"]
|
|
29
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Specify configurable options for protected routes"]
|
|
30
|
+
// CIL[DOC-CONTEXT module="protected-route" layer="frontend-component" related_files="[\".framework/functions/_shared/schema-utils.ts\",\".framework/src/components/ui/dialog.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/functions/_shared/principal.ts\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"\\\"]"]
|
|
31
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="Type definition" errors="none" side_effects="none"]
|
|
32
|
+
// CIL[DOC-MICRO logic_summary="Interface with optional system admin requirement flag" notable_decisions="[]"]
|
|
33
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
34
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
35
|
+
// CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 0. Direct calls: 0. Related files: .framework/functions/_shared/schema-utils.ts, .framework/src/components/ui/dialog.tsx, custom/apps/portal/pages/ContentPage.tsx, .framework/functions/_shared/principal.ts, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, \."]
|
|
36
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
37
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
38
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
39
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
40
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
40
41
|
interface ProtectedRouteProps {
|
|
41
42
|
children: React.ReactNode
|
|
42
43
|
requireSystemAdmin?: boolean
|
|
43
44
|
}
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
45
|
+
// CIL[END chunk_id="protectedroute_protectedrouteprops_1783930597"]
|
|
46
|
+
// CIL[BEGIN chunk_id="protectedroute_protectedroute_1783930597" type="function" identity="ProtectedRoute" parent="none"]
|
|
47
|
+
// CIL[DOC-MACRO purpose="Route guard component enforcing authentication and role checks"]
|
|
48
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Protect routes from unauthorized access with optional admin validation"]
|
|
49
|
+
// CIL[DOC-CONTEXT module="protected-route" layer="frontend-component" related_files="[\".framework/src/pages/admin/RolesPage.tsx\",\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/src/components/ui/dialog.tsx\",\"\\\"]"]
|
|
50
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="Protected content or redirect/denial UI" errors="none" side_effects="Navigation redirects, renders access denied UI"]
|
|
51
|
+
// CIL[DOC-MICRO logic_summary="Checks user auth state and optional system_admin role, redirects to login or shows access denied" notable_decisions="[]"]
|
|
52
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
53
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
54
|
+
// CIL[DOC-VECTOR type="context" content="Layer: frontend-component. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/RolesPage.tsx, custom/apps/portal/pages/ContentPage.tsx, .framework/src/components/ui/dialog.tsx, \."]
|
|
55
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
56
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
57
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
58
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
59
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
53
60
|
export function ProtectedRoute({ children, requireSystemAdmin = false }: ProtectedRouteProps) {
|
|
54
61
|
const { user } = useAuth()
|
|
55
62
|
|
|
@@ -58,7 +65,7 @@ export function ProtectedRoute({ children, requireSystemAdmin = false }: Protect
|
|
|
58
65
|
}
|
|
59
66
|
|
|
60
67
|
if (requireSystemAdmin && !user.roles?.includes('system_admin')) {
|
|
61
|
-
|
|
68
|
+
|
|
62
69
|
return (
|
|
63
70
|
<div className="min-h-screen flex items-center justify-center bg-slate-50">
|
|
64
71
|
<div className="text-center p-8">
|
|
@@ -86,3 +93,4 @@ export function ProtectedRoute({ children, requireSystemAdmin = false }: Protect
|
|
|
86
93
|
|
|
87
94
|
return <>{children}</>
|
|
88
95
|
}
|
|
96
|
+
// CIL[END chunk_id="protectedroute_protectedroute_1783930597"]
|