spine-framework 0.3.124 → 0.3.126
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 +179 -69
- package/.framework/cli/commands/generate.ts +83 -143
- 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} +158 -56
- package/.framework/functions/_shared/db.ts +80 -126
- package/.framework/functions/_shared/hash-api-key.ts +63 -0
- package/.framework/functions/_shared/index.ts +224 -335
- 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 +188 -16
- 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 +685 -537
- 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 +187 -144
- 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 +195 -116
- 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 +5 -2
- 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,31 +1,23 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @module src/hooks/useForm
|
|
3
|
-
* @audience installer
|
|
4
|
-
* @layer frontend-hook
|
|
5
|
-
* @stability stable
|
|
6
|
-
*
|
|
7
|
-
* Schema-aware form state hook. Manages field values, touched state,
|
|
8
|
-
* per-field validation (required, email, url, number range, text
|
|
9
|
-
* length/pattern), and form submission with async support.
|
|
10
|
-
*
|
|
11
|
-
* Designed to work directly with `FieldDefinition[]` arrays produced
|
|
12
|
-
* by `useSchemaRecord` or static field arrays in admin forms.
|
|
13
|
-
*
|
|
14
|
-
* **Validation order per field:**
|
|
15
|
-
* 1. Required check
|
|
16
|
-
* 2. Type-specific rule (email regex, URL parse, number range, text length/pattern)
|
|
17
|
-
* 3. Custom `validate` function (whole-form)
|
|
18
|
-
*
|
|
19
|
-
* @seeAlso src/types/types.ts (FieldDefinition — field schema shape)
|
|
20
|
-
* @seeAlso src/hooks/useSchemaRecord.ts (produces FieldDefinition[] for this hook)
|
|
21
|
-
* @seeAlso src/components/shared/SchemaFields.tsx (renders fields from FieldDefinition[])
|
|
22
|
-
*/
|
|
23
1
|
|
|
2
|
+
|
|
3
|
+
// CIL[BEGIN chunk_id="useform_module_header_1783719596" type="module_header" identity="module_header" parent="none"]
|
|
4
|
+
// CIL[DOC-MACRO purpose="Define form hook types and interfaces"]
|
|
5
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Type definitions for form management"]
|
|
6
|
+
// CIL[DOC-CONTEXT module="useForm" layer="frontend-hook" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\".framework/functions/_shared/principal.ts\",\".framework/functions/_shared/schema-utils.ts\",\"\\\"]"]
|
|
7
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="UseFormOptions and UseFormReturn interfaces" errors="none" side_effects="Type declarations"]
|
|
8
|
+
// CIL[DOC-MICRO logic_summary="Exports interfaces for form options, return values, and field definitions" notable_decisions="[]"]
|
|
9
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
10
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
11
|
+
// CIL[DOC-AUDIENCE audience="developer"]
|
|
12
|
+
// CIL[DOC-VECTOR type="context" content="Layer: frontend-hook. 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/functions/_shared/principal.ts, .framework/functions/_shared/schema-utils.ts, \."]
|
|
13
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
14
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
15
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
16
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
17
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
24
18
|
import { useState, useCallback, useEffect } from 'react'
|
|
25
19
|
import { FieldDefinition, FormState, ValidationError } from '../types/types'
|
|
26
20
|
|
|
27
|
-
// ─── TYPES ───────────────────────────────────────────────────────────────────
|
|
28
|
-
|
|
29
21
|
interface UseFormOptions {
|
|
30
22
|
initialValues: Record<string, any>
|
|
31
23
|
fields: FieldDefinition[]
|
|
@@ -34,23 +26,6 @@ interface UseFormOptions {
|
|
|
34
26
|
onChange?: (values: Record<string, any>) => void
|
|
35
27
|
}
|
|
36
28
|
|
|
37
|
-
/**
|
|
38
|
-
* Return value of `useForm`.
|
|
39
|
-
*
|
|
40
|
-
* @prop data - Current field values keyed by field name
|
|
41
|
-
* @prop errors - Per-field error messages (empty string = cleared, absent = untouched)
|
|
42
|
-
* @prop touched - Fields the user has interacted with
|
|
43
|
-
* @prop isSubmitting - True while `onSubmit` promise is pending
|
|
44
|
-
* @prop isValid - True when `errors` is empty
|
|
45
|
-
* @prop isDirty - True when any touched field differs from `initialValues`
|
|
46
|
-
* @prop handleChange - Update a field value (clears error, marks touched)
|
|
47
|
-
* @prop handleBlur - Mark a field touched and run field-level validation
|
|
48
|
-
* @prop handleSubmit - Validate all fields, then call `onSubmit` if valid
|
|
49
|
-
* @prop resetForm - Restore all state to `initialValues`
|
|
50
|
-
* @prop setFieldValue - Programmatic field update (same as handleChange)
|
|
51
|
-
* @prop setFieldError - Inject a server-side error for a field
|
|
52
|
-
* @prop clearErrors - Clear all errors (e.g. after navigation)
|
|
53
|
-
*/
|
|
54
29
|
interface UseFormReturn {
|
|
55
30
|
data: Record<string, any>
|
|
56
31
|
errors: Record<string, string>
|
|
@@ -66,36 +41,21 @@ interface UseFormReturn {
|
|
|
66
41
|
setFieldError: (field: string, error: string) => void
|
|
67
42
|
clearErrors: () => void
|
|
68
43
|
}
|
|
69
|
-
|
|
70
|
-
//
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
* @inputSpec fields[].data_type: 'email'|'url'|'number'|'text'|'textarea'
|
|
85
|
-
* drives built-in validation rules
|
|
86
|
-
* @inputSpec fields[].validation.minLength/maxLength/pattern: text constraints
|
|
87
|
-
* @sideEffects React state mutations only
|
|
88
|
-
* @calledBy SchemaDetailForm.tsx, all admin detail pages
|
|
89
|
-
*
|
|
90
|
-
* @example
|
|
91
|
-
* ```tsx
|
|
92
|
-
* const form = useForm({
|
|
93
|
-
* initialValues: { name: '', email: '' },
|
|
94
|
-
* fields: [{ name: 'email', data_type: 'email', required: true, label: 'Email' }],
|
|
95
|
-
* onSubmit: async (values) => await save(values)
|
|
96
|
-
* })
|
|
97
|
-
* ```
|
|
98
|
-
*/
|
|
44
|
+
// CIL[END chunk_id="useform_module_header_1783719596"]
|
|
45
|
+
// CIL[BEGIN chunk_id="useform_useform_1783719596" type="function" identity="useForm" parent="none"]
|
|
46
|
+
// CIL[DOC-MACRO purpose="Schema-driven form state and validation management"]
|
|
47
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Form validation, state management, submission handling"]
|
|
48
|
+
// CIL[DOC-CONTEXT module="useForm" layer="frontend-hook" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/functions/_shared/schema-utils.ts\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\"\\\"]"]
|
|
49
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="UseFormReturn with form state and handlers" errors="Validation errors, submission errors" side_effects="React state updates, API calls via onSubmit"]
|
|
50
|
+
// CIL[DOC-MICRO logic_summary="Implements field-level validation, form submission, error handling, and state management for schema-driven forms" notable_decisions="[]"]
|
|
51
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
52
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
53
|
+
// CIL[DOC-VECTOR type="context" content="Layer: frontend-hook. Direct callers: 0. Direct calls: 0. Related files: custom/apps/portal/pages/ContentPage.tsx, .framework/functions/_shared/schema-utils.ts, .framework/src/pages/admin/TypeDetailPage.tsx, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/pages/admin/RolesPage.tsx, \."]
|
|
54
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
55
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
56
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
57
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
58
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
99
59
|
export function useForm({
|
|
100
60
|
initialValues,
|
|
101
61
|
fields,
|
|
@@ -109,22 +69,18 @@ export function useForm({
|
|
|
109
69
|
const [isSubmitting, setIsSubmitting] = useState(false)
|
|
110
70
|
const [submitCount, setSubmitCount] = useState(0)
|
|
111
71
|
|
|
112
|
-
// Validate a single field
|
|
113
72
|
const validateField = useCallback((field: string, value: any): string | null => {
|
|
114
73
|
const fieldDef = fields.find(f => f.name === field)
|
|
115
74
|
if (!fieldDef) return null
|
|
116
75
|
|
|
117
|
-
// Required validation
|
|
118
76
|
if (fieldDef.required && (!value || value === '')) {
|
|
119
77
|
return `${fieldDef.label || field} is required`
|
|
120
78
|
}
|
|
121
79
|
|
|
122
|
-
// Skip validation for empty optional fields
|
|
123
80
|
if (!fieldDef.required && (!value || value === '')) {
|
|
124
81
|
return null
|
|
125
82
|
}
|
|
126
83
|
|
|
127
|
-
// Type-specific validation
|
|
128
84
|
switch (fieldDef.data_type) {
|
|
129
85
|
case 'email':
|
|
130
86
|
const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/
|
|
@@ -171,11 +127,9 @@ export function useForm({
|
|
|
171
127
|
return null
|
|
172
128
|
}, [fields])
|
|
173
129
|
|
|
174
|
-
// Validate all fields
|
|
175
130
|
const validateForm = useCallback((values: Record<string, any>): Record<string, string> => {
|
|
176
131
|
const newErrors: Record<string, string> = {}
|
|
177
132
|
|
|
178
|
-
// Run field-level validation
|
|
179
133
|
fields.forEach(field => {
|
|
180
134
|
if (!field.name) return
|
|
181
135
|
const fieldErr = validateField(field.name, values[field.name])
|
|
@@ -184,7 +138,6 @@ export function useForm({
|
|
|
184
138
|
}
|
|
185
139
|
})
|
|
186
140
|
|
|
187
|
-
// Run custom validation
|
|
188
141
|
if (validate) {
|
|
189
142
|
const customErrors = validate(values)
|
|
190
143
|
Object.assign(newErrors, customErrors)
|
|
@@ -193,12 +146,10 @@ export function useForm({
|
|
|
193
146
|
return newErrors
|
|
194
147
|
}, [fields, validate, validateField])
|
|
195
148
|
|
|
196
|
-
// Handle field change
|
|
197
149
|
const handleChange = useCallback((field: string, value: any) => {
|
|
198
150
|
const newData = { ...data, [field]: value }
|
|
199
151
|
setData(newData)
|
|
200
152
|
|
|
201
|
-
// Clear error for this field when user starts typing
|
|
202
153
|
if (errors[field]) {
|
|
203
154
|
setErrors(prev => {
|
|
204
155
|
const newErrors = { ...prev }
|
|
@@ -207,18 +158,14 @@ export function useForm({
|
|
|
207
158
|
})
|
|
208
159
|
}
|
|
209
160
|
|
|
210
|
-
// Mark field as touched
|
|
211
161
|
setTouched(prev => ({ ...prev, [field]: true }))
|
|
212
162
|
|
|
213
|
-
// Call onChange callback
|
|
214
163
|
onChange?.(newData)
|
|
215
164
|
}, [data, errors, onChange])
|
|
216
165
|
|
|
217
|
-
// Handle field blur
|
|
218
166
|
const handleBlur = useCallback((field: string) => {
|
|
219
167
|
setTouched(prev => ({ ...prev, [field]: true }))
|
|
220
168
|
|
|
221
|
-
// Validate field on blur
|
|
222
169
|
const error = validateField(field, data[field])
|
|
223
170
|
setErrors(prev => ({
|
|
224
171
|
...prev,
|
|
@@ -226,18 +173,15 @@ export function useForm({
|
|
|
226
173
|
}))
|
|
227
174
|
}, [data, validateField])
|
|
228
175
|
|
|
229
|
-
// Handle form submission
|
|
230
176
|
const handleSubmit = useCallback(async (e?: React.FormEvent) => {
|
|
231
177
|
e?.preventDefault()
|
|
232
178
|
|
|
233
|
-
// Mark all fields as touched
|
|
234
179
|
const allTouched = fields.reduce((acc, field) => {
|
|
235
180
|
if (field.name) acc[field.name] = true
|
|
236
181
|
return acc
|
|
237
182
|
}, {} as Record<string, boolean>)
|
|
238
183
|
setTouched(allTouched)
|
|
239
184
|
|
|
240
|
-
// Validate form
|
|
241
185
|
const newErrors = validateForm(data)
|
|
242
186
|
setErrors(newErrors)
|
|
243
187
|
|
|
@@ -258,7 +202,6 @@ export function useForm({
|
|
|
258
202
|
}
|
|
259
203
|
}, [data, fields, validateForm, onSubmit])
|
|
260
204
|
|
|
261
|
-
// Reset form
|
|
262
205
|
const resetForm = useCallback(() => {
|
|
263
206
|
setData(initialValues)
|
|
264
207
|
setErrors({})
|
|
@@ -267,12 +210,10 @@ export function useForm({
|
|
|
267
210
|
setSubmitCount(0)
|
|
268
211
|
}, [initialValues])
|
|
269
212
|
|
|
270
|
-
// Set field value
|
|
271
213
|
const setFieldValue = useCallback((field: string, value: any) => {
|
|
272
214
|
handleChange(field, value)
|
|
273
215
|
}, [handleChange])
|
|
274
216
|
|
|
275
|
-
// Set field error
|
|
276
217
|
const setFieldError = useCallback((field: string, error: string) => {
|
|
277
218
|
setErrors(prev => ({
|
|
278
219
|
...prev,
|
|
@@ -280,12 +221,10 @@ export function useForm({
|
|
|
280
221
|
}))
|
|
281
222
|
}, [])
|
|
282
223
|
|
|
283
|
-
// Clear all errors
|
|
284
224
|
const clearErrors = useCallback(() => {
|
|
285
225
|
setErrors({})
|
|
286
226
|
}, [])
|
|
287
227
|
|
|
288
|
-
// Calculate derived state
|
|
289
228
|
const isValid = Object.keys(errors).length === 0
|
|
290
229
|
const isDirty = Object.keys(touched).some(field => data[field] !== initialValues[field])
|
|
291
230
|
|
|
@@ -305,3 +244,4 @@ export function useForm({
|
|
|
305
244
|
clearErrors
|
|
306
245
|
}
|
|
307
246
|
}
|
|
247
|
+
// CIL[END chunk_id="useform_useform_1783719596"]
|
|
@@ -1,58 +1,43 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* @module src/hooks/useListSchema
|
|
3
|
-
* @audience installer
|
|
4
|
-
* @layer frontend-hook
|
|
5
|
-
* @stability stable
|
|
6
|
-
*
|
|
7
|
-
* Resolves the `DesignSchema` and target `View` for a list page. Because
|
|
8
|
-
* the `design_schema` is stamp-copied onto records, this hook uses a
|
|
9
|
-
* two-stage resolution strategy to handle stale or missing stamps:
|
|
10
|
-
*
|
|
11
|
-
* **Resolution order:**
|
|
12
|
-
* 1. Fetch one sample record via `admin-data?action=list&limit=1`
|
|
13
|
-
* 2. If the sample record's `design_schema` has the requested view, use it
|
|
14
|
-
* 3. Otherwise, fall back to the canonical `types` table entry for the entity kind
|
|
15
|
-
* 4. If no records exist, return a minimal fallback schema so the page renders
|
|
16
|
-
*
|
|
17
|
-
* **Auth retry:** Auth errors (JWT not ready) trigger a 300 ms retry instead
|
|
18
|
-
* of silently falling back to an empty schema (which would render a blank list).
|
|
19
|
-
*
|
|
20
|
-
* **Entity → kind mapping** (used for the types fallback):
|
|
21
|
-
* `accounts→account`, `people→person`, `items→item`, `threads→thread`,
|
|
22
|
-
* `messages→message`, `links→link`, `attachments→attachment`, `watchers→watcher`
|
|
23
|
-
*
|
|
24
|
-
* @seeAlso src/lib/api.ts (apiFetch)
|
|
25
|
-
* @seeAlso src/types/types.ts (DesignSchema, View)
|
|
26
|
-
* @seeAlso src/components/runtime/DataListPage.tsx (primary consumer)
|
|
27
|
-
* @seeAlso functions/admin-data.ts (list action endpoint)
|
|
28
|
-
*/
|
|
29
|
-
|
|
30
1
|
import { useState, useEffect } from 'react'
|
|
31
2
|
import { apiFetch } from '../lib/api'
|
|
32
3
|
import { DesignSchema, View } from '../types/types'
|
|
33
4
|
|
|
34
|
-
// ─── TYPES ───────────────────────────────────────────────────────────────────
|
|
35
5
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
6
|
+
|
|
7
|
+
// CIL[BEGIN chunk_id="uselistschema_module_header_1783718716" type="module_header" identity="module_header" parent="none"]
|
|
8
|
+
// CIL[DOC-MACRO purpose="Define options interface for useListSchema hook"]
|
|
9
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Own the UseListSchemaOptions interface definition"]
|
|
10
|
+
// CIL[DOC-CONTEXT module="useListSchema" layer="frontend-hook" related_files="[\".framework/functions/_shared/schema-utils.ts\",\".framework/functions/_shared/principal.ts\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\"\\\"]"]
|
|
11
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="interface definition" errors="none" side_effects="none"]
|
|
12
|
+
// CIL[DOC-MICRO logic_summary="Simple interface with entity and optional viewSlug" notable_decisions="[]"]
|
|
13
|
+
// CIL[DOC-CONFIDENCE pass="second" score="0.95" flags="none"]
|
|
14
|
+
// CIL[DOC-STABILITY stability="stable"]
|
|
15
|
+
// CIL[DOC-AUDIENCE audience="developer"]
|
|
16
|
+
// CIL[DOC-VECTOR type="context" content="Layer: frontend-hook. Direct callers: 0. Direct calls: 0. Related files: .framework/functions/_shared/schema-utils.ts, .framework/functions/_shared/principal.ts, custom/apps/cortex/pages/operations/OperationsDashboard.tsx, .framework/src/pages/admin/TypeDetailPage.tsx, .framework/src/pages/admin/IntegrationsPage.tsx, \."]
|
|
17
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 0. Total affected: 0."]
|
|
18
|
+
// CIL[DOC-VECTOR type="configuration" content="No configuration dependencies."]
|
|
19
|
+
// CIL[DOC-VECTOR type="constraint" content="No test paths identified."]
|
|
20
|
+
// CIL[DOC-VECTOR type="implementation_pattern" content="" status="pending_human_input"]
|
|
21
|
+
// CIL[DOC-VECTOR type="user_journey" content="" status="pending_human_input"]
|
|
42
22
|
interface UseListSchemaOptions {
|
|
43
23
|
entity: string
|
|
44
24
|
viewSlug?: string
|
|
45
25
|
}
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
26
|
+
// CIL[END chunk_id="uselistschema_module_header_1783718716"]
|
|
27
|
+
// CIL[BEGIN chunk_id="uselistschema_useresult_1783718716" type="interface" identity="UseListSchemaResult" parent="none"]
|
|
28
|
+
// CIL[DOC-MACRO purpose="Define return type for useListSchema hook"]
|
|
29
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Own the UseListSchemaResult interface definition"]
|
|
30
|
+
// CIL[DOC-CONTEXT module="useListSchema" layer="frontend-hook" related_files="[\".framework/src/pages/admin/TypeDetailPage.tsx\",\".framework/functions/_shared/schema-utils.ts\",\".framework/functions/_shared/principal.ts\",\".framework/functions/_shared/db.ts\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\"\\\"]"]
|
|
31
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="interface definition" errors="none" side_effects="none"]
|
|
32
|
+
// CIL[DOC-MICRO logic_summary="Interface with schema, view, loading, error, and refetch fields" 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-hook. Direct callers: 0. Direct calls: 0. Related files: .framework/src/pages/admin/TypeDetailPage.tsx, .framework/functions/_shared/schema-utils.ts, .framework/functions/_shared/principal.ts, .framework/functions/_shared/db.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"]
|
|
56
41
|
interface UseListSchemaResult {
|
|
57
42
|
schema: DesignSchema | null
|
|
58
43
|
view: View | null
|
|
@@ -60,29 +45,23 @@ interface UseListSchemaResult {
|
|
|
60
45
|
error: string | null
|
|
61
46
|
refetch: () => void
|
|
62
47
|
}
|
|
63
|
-
|
|
64
|
-
//
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
*
|
|
81
|
-
* @example
|
|
82
|
-
* ```tsx
|
|
83
|
-
* const { schema, view, loading } = useListSchema({ entity: 'accounts' })
|
|
84
|
-
* ```
|
|
85
|
-
*/
|
|
48
|
+
// CIL[END chunk_id="uselistschema_useresult_1783718716"]
|
|
49
|
+
// CIL[BEGIN chunk_id="uselistschema_usefunction_1783718716" type="function" identity="useListSchema" parent="none"]
|
|
50
|
+
// CIL[DOC-LEARNING topic="runtime-type:generic/list_schema" content="useListSchema first tries to use a sample record's stamped design_schema and views.default_list. If the sample lacks a schema, it falls back to the types table for the current entity's type."]
|
|
51
|
+
// CIL[DOC-NOTE type="design_schema_caveat" content="Falling back to the types table only works when a single type is selected. Multiple types in a list require every type to define a compatible default_list view."]
|
|
52
|
+
// CIL[DOC-MACRO purpose="Resolve DesignSchema and View for list pages with fallback strategy"]
|
|
53
|
+
// CIL[DOC-RESPONSIBILITY responsibility="Fetch schema with two-stage fallback and manage React state"]
|
|
54
|
+
// CIL[DOC-CONTEXT module="useListSchema" layer="frontend-hook" related_files="[\"custom/apps/portal/pages/ContentPage.tsx\",\".framework/src/pages/admin/TypeDetailPage.tsx\",\"custom/apps/cortex/pages/operations/OperationsDashboard.tsx\",\".framework/src/pages/admin/IntegrationsPage.tsx\",\".framework/src/pages/admin/RolesPage.tsx\",\"\\\"]"]
|
|
55
|
+
// CIL[DOC-CONTRACT inputs="none" outputs="resolved schema and view" errors="network errors, auth errors" side_effects="React state mutations, network requests, setTimeout"]
|
|
56
|
+
// CIL[DOC-MICRO logic_summary="Fetch sample record, use stamped schema or fallback to types table, handle auth retry with 300ms delay" notable_decisions="['auth_retry_delay', 'fallback_schema_for_empty_data']"]
|
|
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-hook. Direct callers: 3. 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/src/pages/admin/IntegrationsPage.tsx, .framework/src/pages/admin/RolesPage.tsx, \."]
|
|
60
|
+
// CIL[DOC-VECTOR type="blast_radius" content="Direct callers: 3. Total affected: 5."]
|
|
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"]
|
|
86
65
|
export function useListSchema(options: UseListSchemaOptions): UseListSchemaResult {
|
|
87
66
|
const { entity, viewSlug = 'default_list' } = options
|
|
88
67
|
|
|
@@ -98,7 +77,6 @@ export function useListSchema(options: UseListSchemaOptions): UseListSchemaResul
|
|
|
98
77
|
setLoading(true)
|
|
99
78
|
setError(null)
|
|
100
79
|
|
|
101
|
-
// Fetch a sample record to get its design_schema
|
|
102
80
|
const response = await apiFetch(`/api/admin-data?action=list&entity=${entity}&limit=1`)
|
|
103
81
|
|
|
104
82
|
if (!response.ok) {
|
|
@@ -108,9 +86,6 @@ export function useListSchema(options: UseListSchemaOptions): UseListSchemaResul
|
|
|
108
86
|
const data = await response.json()
|
|
109
87
|
|
|
110
88
|
if (data.error) {
|
|
111
|
-
// Auth errors (session not yet ready) should not silently fall back to
|
|
112
|
-
// an empty schema — that causes the list to render with no columns.
|
|
113
|
-
// Retry once after a short delay to allow the session to hydrate.
|
|
114
89
|
if (
|
|
115
90
|
data.error.includes('Invalid authentication') ||
|
|
116
91
|
data.error.includes('Unauthorized') ||
|
|
@@ -124,7 +99,6 @@ export function useListSchema(options: UseListSchemaOptions): UseListSchemaResul
|
|
|
124
99
|
throw new Error(data.error || 'Failed to fetch records')
|
|
125
100
|
}
|
|
126
101
|
|
|
127
|
-
// No records yet — use a minimal fallback schema so the list page still renders
|
|
128
102
|
if (!data.data || data.data.length === 0) {
|
|
129
103
|
if (cancelled) return
|
|
130
104
|
const fallback: DesignSchema = {
|
|
@@ -151,7 +125,6 @@ export function useListSchema(options: UseListSchemaOptions): UseListSchemaResul
|
|
|
151
125
|
|
|
152
126
|
const sampleRecord = data.data[0]
|
|
153
127
|
|
|
154
|
-
// If the sample record has a design_schema with the requested view, use it directly
|
|
155
128
|
const stampedSchema = sampleRecord.design_schema as DesignSchema | undefined
|
|
156
129
|
const stampedView = stampedSchema?.views?.[viewSlug]
|
|
157
130
|
|
|
@@ -160,7 +133,6 @@ export function useListSchema(options: UseListSchemaOptions): UseListSchemaResul
|
|
|
160
133
|
setSchema(stampedSchema)
|
|
161
134
|
setView(stampedView)
|
|
162
135
|
} else {
|
|
163
|
-
// Schema missing or stale — fetch current design_schema from the types table
|
|
164
136
|
const kindMap: Record<string, string> = { accounts: 'account', people: 'person', items: 'item', threads: 'thread', messages: 'message', links: 'link', attachments: 'attachment', watchers: 'watcher', item_progress: 'progress' }
|
|
165
137
|
const kind = kindMap[entity]
|
|
166
138
|
let resolvedSchema: DesignSchema | null = null
|
|
@@ -183,7 +155,6 @@ export function useListSchema(options: UseListSchemaOptions): UseListSchemaResul
|
|
|
183
155
|
setSchema(resolvedSchema)
|
|
184
156
|
setView(resolvedView)
|
|
185
157
|
} else {
|
|
186
|
-
// Schema found but view key missing — use minimal fallback
|
|
187
158
|
const fallback: DesignSchema = {
|
|
188
159
|
fields: {},
|
|
189
160
|
record_permissions: {},
|
|
@@ -205,7 +176,6 @@ export function useListSchema(options: UseListSchemaOptions): UseListSchemaResul
|
|
|
205
176
|
setView(fallback.views![viewSlug]!)
|
|
206
177
|
}
|
|
207
178
|
} else {
|
|
208
|
-
// No type found in registry — use minimal fallback
|
|
209
179
|
const fallback: DesignSchema = {
|
|
210
180
|
fields: {},
|
|
211
181
|
record_permissions: {},
|
|
@@ -262,3 +232,4 @@ export function useListSchema(options: UseListSchemaOptions): UseListSchemaResul
|
|
|
262
232
|
refetch: fetchSchema
|
|
263
233
|
}
|
|
264
234
|
}
|
|
235
|
+
// CIL[END chunk_id="uselistschema_usefunction_1783718716"]
|