@stigmer/react 3.2.3 → 3.3.0
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/agent/steps/ReviewStep.d.ts.map +1 -1
- package/agent/steps/ReviewStep.js +2 -3
- package/agent/steps/ReviewStep.js.map +1 -1
- package/billing/BaselineEditor.d.ts +9 -0
- package/billing/BaselineEditor.d.ts.map +1 -0
- package/billing/BaselineEditor.js +253 -0
- package/billing/BaselineEditor.js.map +1 -0
- package/billing/ModelCatalogPanel.d.ts +28 -0
- package/billing/ModelCatalogPanel.d.ts.map +1 -0
- package/billing/ModelCatalogPanel.js +102 -0
- package/billing/ModelCatalogPanel.js.map +1 -0
- package/billing/ModelGovernanceDetail.d.ts +8 -0
- package/billing/ModelGovernanceDetail.d.ts.map +1 -0
- package/billing/ModelGovernanceDetail.js +64 -0
- package/billing/ModelGovernanceDetail.js.map +1 -0
- package/billing/OperatorAccessNotice.d.ts +12 -0
- package/billing/OperatorAccessNotice.d.ts.map +1 -0
- package/billing/OperatorAccessNotice.js +15 -0
- package/billing/OperatorAccessNotice.js.map +1 -0
- package/billing/PricingGovernanceConsole.d.ts +57 -0
- package/billing/PricingGovernanceConsole.d.ts.map +1 -0
- package/billing/PricingGovernanceConsole.js +164 -0
- package/billing/PricingGovernanceConsole.js.map +1 -0
- package/billing/PricingGovernancePanel.d.ts +26 -0
- package/billing/PricingGovernancePanel.d.ts.map +1 -0
- package/billing/PricingGovernancePanel.js +64 -0
- package/billing/PricingGovernancePanel.js.map +1 -0
- package/billing/RetireConfirm.d.ts +9 -0
- package/billing/RetireConfirm.d.ts.map +1 -0
- package/billing/RetireConfirm.js +19 -0
- package/billing/RetireConfirm.js.map +1 -0
- package/billing/form-primitives.d.ts +18 -0
- package/billing/form-primitives.d.ts.map +1 -0
- package/billing/form-primitives.js +19 -0
- package/billing/form-primitives.js.map +1 -0
- package/billing/governance-primitives.d.ts +33 -0
- package/billing/governance-primitives.d.ts.map +1 -0
- package/billing/governance-primitives.js +43 -0
- package/billing/governance-primitives.js.map +1 -0
- package/billing/index.d.ts +18 -0
- package/billing/index.d.ts.map +1 -1
- package/billing/index.js +9 -0
- package/billing/index.js.map +1 -1
- package/billing/pricing-format.d.ts +12 -0
- package/billing/pricing-format.d.ts.map +1 -0
- package/billing/pricing-format.js +50 -0
- package/billing/pricing-format.js.map +1 -0
- package/billing/useDecidePricingOverride.d.ts +46 -0
- package/billing/useDecidePricingOverride.d.ts.map +1 -0
- package/billing/useDecidePricingOverride.js +44 -0
- package/billing/useDecidePricingOverride.js.map +1 -0
- package/billing/useModelGovernanceView.d.ts +103 -0
- package/billing/useModelGovernanceView.d.ts.map +1 -0
- package/billing/useModelGovernanceView.js +144 -0
- package/billing/useModelGovernanceView.js.map +1 -0
- package/billing/useModelPricingBaselines.d.ts +40 -0
- package/billing/useModelPricingBaselines.d.ts.map +1 -0
- package/billing/useModelPricingBaselines.js +32 -0
- package/billing/useModelPricingBaselines.js.map +1 -0
- package/billing/usePricingGovernance.d.ts +39 -0
- package/billing/usePricingGovernance.d.ts.map +1 -0
- package/billing/usePricingGovernance.js +31 -0
- package/billing/usePricingGovernance.js.map +1 -0
- package/billing/useRetireModelPricingBaseline.d.ts +31 -0
- package/billing/useRetireModelPricingBaseline.d.ts.map +1 -0
- package/billing/useRetireModelPricingBaseline.js +36 -0
- package/billing/useRetireModelPricingBaseline.js.map +1 -0
- package/billing/useUpsertModelPricingBaseline.d.ts +38 -0
- package/billing/useUpsertModelPricingBaseline.d.ts.map +1 -0
- package/billing/useUpsertModelPricingBaseline.js +37 -0
- package/billing/useUpsertModelPricingBaseline.js.map +1 -0
- package/channel/AgentChannelsPanel.d.ts.map +1 -1
- package/channel/AgentChannelsPanel.js +11 -5
- package/channel/AgentChannelsPanel.js.map +1 -1
- package/composer/SessionComposer.d.ts +1 -1
- package/cursor-accounts/CursorAccountEditor.d.ts +28 -0
- package/cursor-accounts/CursorAccountEditor.d.ts.map +1 -0
- package/cursor-accounts/CursorAccountEditor.js +51 -0
- package/cursor-accounts/CursorAccountEditor.js.map +1 -0
- package/cursor-accounts/CursorAccountsAccessNotice.d.ts +11 -0
- package/cursor-accounts/CursorAccountsAccessNotice.d.ts.map +1 -0
- package/cursor-accounts/CursorAccountsAccessNotice.js +14 -0
- package/cursor-accounts/CursorAccountsAccessNotice.js.map +1 -0
- package/cursor-accounts/CursorAccountsConsole.d.ts +28 -0
- package/cursor-accounts/CursorAccountsConsole.d.ts.map +1 -0
- package/cursor-accounts/CursorAccountsConsole.js +275 -0
- package/cursor-accounts/CursorAccountsConsole.js.map +1 -0
- package/cursor-accounts/cursor-account-format.d.ts +10 -0
- package/cursor-accounts/cursor-account-format.d.ts.map +1 -0
- package/cursor-accounts/cursor-account-format.js +26 -0
- package/cursor-accounts/cursor-account-format.js.map +1 -0
- package/cursor-accounts/index.d.ts +18 -0
- package/cursor-accounts/index.d.ts.map +1 -0
- package/cursor-accounts/index.js +13 -0
- package/cursor-accounts/index.js.map +1 -0
- package/cursor-accounts/useCursorAccountView.d.ts +30 -0
- package/cursor-accounts/useCursorAccountView.d.ts.map +1 -0
- package/cursor-accounts/useCursorAccountView.js +25 -0
- package/cursor-accounts/useCursorAccountView.js.map +1 -0
- package/cursor-accounts/useCursorAccounts.d.ts +33 -0
- package/cursor-accounts/useCursorAccounts.d.ts.map +1 -0
- package/cursor-accounts/useCursorAccounts.js +25 -0
- package/cursor-accounts/useCursorAccounts.js.map +1 -0
- package/cursor-accounts/useCursorMemberKeyActions.d.ts +49 -0
- package/cursor-accounts/useCursorMemberKeyActions.d.ts.map +1 -0
- package/cursor-accounts/useCursorMemberKeyActions.js +38 -0
- package/cursor-accounts/useCursorMemberKeyActions.js.map +1 -0
- package/cursor-accounts/useDeleteCursorAccount.d.ts +30 -0
- package/cursor-accounts/useDeleteCursorAccount.d.ts.map +1 -0
- package/cursor-accounts/useDeleteCursorAccount.js +32 -0
- package/cursor-accounts/useDeleteCursorAccount.js.map +1 -0
- package/cursor-accounts/useSyncCursorAccount.d.ts +23 -0
- package/cursor-accounts/useSyncCursorAccount.d.ts.map +1 -0
- package/cursor-accounts/useSyncCursorAccount.js +31 -0
- package/cursor-accounts/useSyncCursorAccount.js.map +1 -0
- package/cursor-accounts/useUpsertCursorAccount.d.ts +26 -0
- package/cursor-accounts/useUpsertCursorAccount.d.ts.map +1 -0
- package/cursor-accounts/useUpsertCursorAccount.js +34 -0
- package/cursor-accounts/useUpsertCursorAccount.js.map +1 -0
- package/datastore/CollectionRecordsBrowser.d.ts +34 -0
- package/datastore/CollectionRecordsBrowser.d.ts.map +1 -0
- package/datastore/CollectionRecordsBrowser.js +209 -0
- package/datastore/CollectionRecordsBrowser.js.map +1 -0
- package/datastore/CollectionSchemaView.d.ts +29 -0
- package/datastore/CollectionSchemaView.d.ts.map +1 -0
- package/datastore/CollectionSchemaView.js +93 -0
- package/datastore/CollectionSchemaView.js.map +1 -0
- package/datastore/DatastoreDetailView.d.ts +44 -0
- package/datastore/DatastoreDetailView.d.ts.map +1 -0
- package/datastore/DatastoreDetailView.js +76 -0
- package/datastore/DatastoreDetailView.js.map +1 -0
- package/datastore/DatastoreSyncReport.d.ts +19 -0
- package/datastore/DatastoreSyncReport.d.ts.map +1 -0
- package/datastore/DatastoreSyncReport.js +45 -0
- package/datastore/DatastoreSyncReport.js.map +1 -0
- package/datastore/DeleteDatastoreDialog.d.ts +35 -0
- package/datastore/DeleteDatastoreDialog.d.ts.map +1 -0
- package/datastore/DeleteDatastoreDialog.js +90 -0
- package/datastore/DeleteDatastoreDialog.js.map +1 -0
- package/datastore/FieldValueControl.d.ts +55 -0
- package/datastore/FieldValueControl.d.ts.map +1 -0
- package/datastore/FieldValueControl.js +138 -0
- package/datastore/FieldValueControl.js.map +1 -0
- package/datastore/RecordFilterBuilder.d.ts +30 -0
- package/datastore/RecordFilterBuilder.d.ts.map +1 -0
- package/datastore/RecordFilterBuilder.js +122 -0
- package/datastore/RecordFilterBuilder.js.map +1 -0
- package/datastore/RecordFormPanel.d.ts +45 -0
- package/datastore/RecordFormPanel.d.ts.map +1 -0
- package/datastore/RecordFormPanel.js +215 -0
- package/datastore/RecordFormPanel.js.map +1 -0
- package/datastore/index.d.ts +43 -0
- package/datastore/index.d.ts.map +1 -0
- package/datastore/index.js +22 -0
- package/datastore/index.js.map +1 -0
- package/datastore/recordFilter.d.ts +54 -0
- package/datastore/recordFilter.d.ts.map +1 -0
- package/datastore/recordFilter.js +93 -0
- package/datastore/recordFilter.js.map +1 -0
- package/datastore/recordValues.d.ts +85 -0
- package/datastore/recordValues.d.ts.map +1 -0
- package/datastore/recordValues.js +282 -0
- package/datastore/recordValues.js.map +1 -0
- package/datastore/useDatastore.d.ts +39 -0
- package/datastore/useDatastore.d.ts.map +1 -0
- package/datastore/useDatastore.js +44 -0
- package/datastore/useDatastore.js.map +1 -0
- package/datastore/useDatastoreCount.d.ts +48 -0
- package/datastore/useDatastoreCount.d.ts.map +1 -0
- package/datastore/useDatastoreCount.js +27 -0
- package/datastore/useDatastoreCount.js.map +1 -0
- package/datastore/useDatastoreDescription.d.ts +54 -0
- package/datastore/useDatastoreDescription.d.ts.map +1 -0
- package/datastore/useDatastoreDescription.js +50 -0
- package/datastore/useDatastoreDescription.js.map +1 -0
- package/datastore/useDatastoreList.d.ts +57 -0
- package/datastore/useDatastoreList.d.ts.map +1 -0
- package/datastore/useDatastoreList.js +29 -0
- package/datastore/useDatastoreList.js.map +1 -0
- package/datastore/useDatastoreSearch.d.ts +19 -0
- package/datastore/useDatastoreSearch.d.ts.map +1 -0
- package/datastore/useDatastoreSearch.js +22 -0
- package/datastore/useDatastoreSearch.js.map +1 -0
- package/datastore/useDeleteDatastore.d.ts +53 -0
- package/datastore/useDeleteDatastore.d.ts.map +1 -0
- package/datastore/useDeleteDatastore.js +40 -0
- package/datastore/useDeleteDatastore.js.map +1 -0
- package/datastore/useDeleteRecord.d.ts +34 -0
- package/datastore/useDeleteRecord.d.ts.map +1 -0
- package/datastore/useDeleteRecord.js +43 -0
- package/datastore/useDeleteRecord.js.map +1 -0
- package/datastore/useInsertRecord.d.ts +50 -0
- package/datastore/useInsertRecord.d.ts.map +1 -0
- package/datastore/useInsertRecord.js +55 -0
- package/datastore/useInsertRecord.js.map +1 -0
- package/datastore/useRecordCollection.d.ts +104 -0
- package/datastore/useRecordCollection.d.ts.map +1 -0
- package/datastore/useRecordCollection.js +136 -0
- package/datastore/useRecordCollection.js.map +1 -0
- package/datastore/useRecordList.d.ts +66 -0
- package/datastore/useRecordList.d.ts.map +1 -0
- package/datastore/useRecordList.js +58 -0
- package/datastore/useRecordList.js.map +1 -0
- package/datastore/useUpdateRecord.d.ts +52 -0
- package/datastore/useUpdateRecord.d.ts.map +1 -0
- package/datastore/useUpdateRecord.js +55 -0
- package/datastore/useUpdateRecord.js.map +1 -0
- package/environment/EnvironmentListPanel.d.ts.map +1 -1
- package/environment/EnvironmentListPanel.js +12 -7
- package/environment/EnvironmentListPanel.js.map +1 -1
- package/iam-policy/index.d.ts +1 -1
- package/iam-policy/index.d.ts.map +1 -1
- package/iam-policy/index.js.map +1 -1
- package/iam-policy/useCheckPermission.d.ts +32 -11
- package/iam-policy/useCheckPermission.d.ts.map +1 -1
- package/iam-policy/useCheckPermission.js +24 -19
- package/iam-policy/useCheckPermission.js.map +1 -1
- package/index.d.ts +12 -6
- package/index.d.ts.map +1 -1
- package/index.js +14 -3
- package/index.js.map +1 -1
- package/library/index.d.ts +0 -7
- package/library/index.d.ts.map +1 -1
- package/library/index.js +0 -4
- package/library/index.js.map +1 -1
- package/library/useApplyResource.d.ts +12 -12
- package/library/useApplyResource.d.ts.map +1 -1
- package/library/useApplyResource.js +16 -25
- package/library/useApplyResource.js.map +1 -1
- package/library/useExportResource.d.ts +13 -9
- package/library/useExportResource.d.ts.map +1 -1
- package/library/useExportResource.js +18 -36
- package/library/useExportResource.js.map +1 -1
- package/manifest/ApplyManifestDialog.d.ts +48 -0
- package/manifest/ApplyManifestDialog.d.ts.map +1 -0
- package/manifest/ApplyManifestDialog.js +135 -0
- package/manifest/ApplyManifestDialog.js.map +1 -0
- package/manifest/EditResourceYamlDialog.d.ts +51 -0
- package/manifest/EditResourceYamlDialog.d.ts.map +1 -0
- package/manifest/EditResourceYamlDialog.js +104 -0
- package/manifest/EditResourceYamlDialog.js.map +1 -0
- package/manifest/RedactedSecretsNotice.d.ts +14 -0
- package/manifest/RedactedSecretsNotice.d.ts.map +1 -0
- package/manifest/RedactedSecretsNotice.js +14 -0
- package/manifest/RedactedSecretsNotice.js.map +1 -0
- package/manifest/YamlEditor.d.ts +44 -0
- package/manifest/YamlEditor.d.ts.map +1 -0
- package/manifest/YamlEditor.js +216 -0
- package/manifest/YamlEditor.js.map +1 -0
- package/manifest/index.d.ts +13 -0
- package/manifest/index.d.ts.map +1 -0
- package/manifest/index.js +13 -0
- package/manifest/index.js.map +1 -0
- package/manifest/useApplyManifest.d.ts +82 -0
- package/manifest/useApplyManifest.d.ts.map +1 -0
- package/manifest/useApplyManifest.js +180 -0
- package/manifest/useApplyManifest.js.map +1 -0
- package/manifest/useEditResourceYaml.d.ts +106 -0
- package/manifest/useEditResourceYaml.d.ts.map +1 -0
- package/manifest/useEditResourceYaml.js +168 -0
- package/manifest/useEditResourceYaml.js.map +1 -0
- package/mcp-server/steps/ReviewStep.d.ts.map +1 -1
- package/mcp-server/steps/ReviewStep.js +2 -3
- package/mcp-server/steps/ReviewStep.js.map +1 -1
- package/package.json +4 -4
- package/resource-creation/templates/workflow-templates.js +4 -4
- package/session/useEditSessionPrep.js +3 -3
- package/session/useEditSessionPrep.js.map +1 -1
- package/settings/index.d.ts +2 -1
- package/settings/index.d.ts.map +1 -1
- package/settings/index.js +2 -1
- package/settings/index.js.map +1 -1
- package/settings/settings-nav.d.ts +22 -0
- package/settings/settings-nav.d.ts.map +1 -1
- package/settings/settings-nav.js +32 -1
- package/settings/settings-nav.js.map +1 -1
- package/settings/useSettingsNavGroups.d.ts +29 -0
- package/settings/useSettingsNavGroups.d.ts.map +1 -0
- package/settings/useSettingsNavGroups.js +61 -0
- package/settings/useSettingsNavGroups.js.map +1 -0
- package/src/agent/steps/ReviewStep.tsx +2 -3
- package/src/billing/BaselineEditor.tsx +619 -0
- package/src/billing/ModelCatalogPanel.tsx +283 -0
- package/src/billing/ModelGovernanceDetail.tsx +289 -0
- package/src/billing/OperatorAccessNotice.tsx +32 -0
- package/src/billing/PricingGovernanceConsole.tsx +465 -0
- package/src/billing/PricingGovernancePanel.tsx +166 -0
- package/src/billing/RetireConfirm.tsx +82 -0
- package/src/billing/__tests__/ModelCatalogPanel.test.tsx +253 -0
- package/src/billing/__tests__/PricingGovernanceConsole.test.tsx +410 -0
- package/src/billing/__tests__/useModelGovernanceView.test.tsx +308 -0
- package/src/billing/form-primitives.tsx +68 -0
- package/src/billing/governance-primitives.tsx +133 -0
- package/src/billing/index.ts +37 -0
- package/src/billing/pricing-format.ts +53 -0
- package/src/billing/useDecidePricingOverride.ts +78 -0
- package/src/billing/useModelGovernanceView.ts +290 -0
- package/src/billing/useModelPricingBaselines.ts +69 -0
- package/src/billing/usePricingGovernance.ts +57 -0
- package/src/billing/useRetireModelPricingBaseline.ts +65 -0
- package/src/billing/useUpsertModelPricingBaseline.ts +72 -0
- package/src/channel/AgentChannelsPanel.tsx +27 -1
- package/src/composer/SessionComposer.tsx +1 -1
- package/src/cursor-accounts/CursorAccountEditor.tsx +181 -0
- package/src/cursor-accounts/CursorAccountsAccessNotice.tsx +36 -0
- package/src/cursor-accounts/CursorAccountsConsole.tsx +810 -0
- package/src/cursor-accounts/__tests__/CursorAccountsConsole.test.tsx +384 -0
- package/src/cursor-accounts/cursor-account-format.ts +29 -0
- package/src/cursor-accounts/index.ts +29 -0
- package/src/cursor-accounts/useCursorAccountView.ts +49 -0
- package/src/cursor-accounts/useCursorAccounts.ts +49 -0
- package/src/cursor-accounts/useCursorMemberKeyActions.ts +106 -0
- package/src/cursor-accounts/useDeleteCursorAccount.ts +62 -0
- package/src/cursor-accounts/useSyncCursorAccount.ts +54 -0
- package/src/cursor-accounts/useUpsertCursorAccount.ts +57 -0
- package/src/datastore/CollectionRecordsBrowser.tsx +544 -0
- package/src/datastore/CollectionSchemaView.tsx +247 -0
- package/src/datastore/DatastoreDetailView.tsx +201 -0
- package/src/datastore/DatastoreSyncReport.tsx +105 -0
- package/src/datastore/DeleteDatastoreDialog.tsx +202 -0
- package/src/datastore/FieldValueControl.tsx +289 -0
- package/src/datastore/RecordFilterBuilder.tsx +411 -0
- package/src/datastore/RecordFormPanel.tsx +432 -0
- package/src/datastore/__tests__/CollectionRecordsBrowser.test.tsx +207 -0
- package/src/datastore/__tests__/DeleteDatastoreDialog.test.tsx +133 -0
- package/src/datastore/__tests__/FieldValueControl.test.tsx +160 -0
- package/src/datastore/__tests__/RecordFilterBuilder.test.tsx +141 -0
- package/src/datastore/__tests__/RecordFormPanel.test.tsx +227 -0
- package/src/datastore/__tests__/recordFilter.test.ts +156 -0
- package/src/datastore/__tests__/recordMutations.test.tsx +195 -0
- package/src/datastore/__tests__/recordValues.test.ts +359 -0
- package/src/datastore/__tests__/schemaAndSyncViews.test.tsx +142 -0
- package/src/datastore/__tests__/useDatastoreDescription.test.tsx +143 -0
- package/src/datastore/__tests__/useRecordCollection.test.tsx +250 -0
- package/src/datastore/__tests__/useRecordList.test.tsx +85 -0
- package/src/datastore/index.ts +111 -0
- package/src/datastore/recordFilter.ts +140 -0
- package/src/datastore/recordValues.ts +327 -0
- package/src/datastore/useDatastore.ts +67 -0
- package/src/datastore/useDatastoreCount.ts +67 -0
- package/src/datastore/useDatastoreDescription.ts +90 -0
- package/src/datastore/useDatastoreList.ts +79 -0
- package/src/datastore/useDatastoreSearch.ts +39 -0
- package/src/datastore/useDeleteDatastore.ts +87 -0
- package/src/datastore/useDeleteRecord.ts +77 -0
- package/src/datastore/useInsertRecord.ts +92 -0
- package/src/datastore/useRecordCollection.ts +256 -0
- package/src/datastore/useRecordList.ts +131 -0
- package/src/datastore/useUpdateRecord.ts +95 -0
- package/src/environment/EnvironmentListPanel.tsx +24 -0
- package/src/execution/__tests__/useArtifactInspection.test.tsx +12 -2
- package/src/iam-policy/__tests__/useCheckPermission.test.tsx +221 -0
- package/src/iam-policy/index.ts +1 -0
- package/src/iam-policy/useCheckPermission.ts +45 -19
- package/src/index.ts +163 -13
- package/src/library/index.ts +0 -20
- package/src/library/useApplyResource.ts +27 -34
- package/src/library/useExportResource.ts +21 -40
- package/src/manifest/ApplyManifestDialog.tsx +315 -0
- package/src/manifest/EditResourceYamlDialog.tsx +265 -0
- package/src/manifest/RedactedSecretsNotice.tsx +30 -0
- package/src/manifest/YamlEditor.tsx +272 -0
- package/src/manifest/__tests__/EditResourceYamlDialog.test.tsx +118 -0
- package/src/manifest/__tests__/useApplyManifest.test.tsx +237 -0
- package/src/manifest/__tests__/useEditResourceYaml.test.tsx +252 -0
- package/src/manifest/index.ts +33 -0
- package/src/manifest/useApplyManifest.ts +270 -0
- package/src/manifest/useEditResourceYaml.ts +273 -0
- package/src/mcp-server/steps/ReviewStep.tsx +2 -3
- package/src/resource-creation/templates/workflow-templates.ts +4 -4
- package/src/session/useEditSessionPrep.ts +3 -3
- package/src/settings/__tests__/useSettingsNavGroups.test.tsx +138 -0
- package/src/settings/index.ts +5 -1
- package/src/settings/settings-nav.ts +43 -0
- package/src/settings/useSettingsNavGroups.ts +81 -0
- package/src/workflow/WorkflowYamlEditor.tsx +6 -270
- package/styles.css +1 -1
- package/workflow/CanvasTransitionEdge.d.ts +1 -1
- package/workflow/WorkflowYamlEditor.d.ts +2 -42
- package/workflow/WorkflowYamlEditor.d.ts.map +1 -1
- package/workflow/WorkflowYamlEditor.js +5 -214
- package/workflow/WorkflowYamlEditor.js.map +1 -1
- package/library/ImportResourceDialog.d.ts +0 -43
- package/library/ImportResourceDialog.d.ts.map +0 -1
- package/library/ImportResourceDialog.js +0 -90
- package/library/ImportResourceDialog.js.map +0 -1
- package/library/parse-resource-yaml.d.ts +0 -63
- package/library/parse-resource-yaml.d.ts.map +0 -1
- package/library/parse-resource-yaml.js +0 -407
- package/library/parse-resource-yaml.js.map +0 -1
- package/library/serialize-resource-yaml.d.ts +0 -103
- package/library/serialize-resource-yaml.d.ts.map +0 -1
- package/library/serialize-resource-yaml.js +0 -565
- package/library/serialize-resource-yaml.js.map +0 -1
- package/library/useImportResource.d.ts +0 -84
- package/library/useImportResource.d.ts.map +0 -1
- package/library/useImportResource.js +0 -188
- package/library/useImportResource.js.map +0 -1
- package/src/library/ImportResourceDialog.tsx +0 -227
- package/src/library/parse-resource-yaml.ts +0 -630
- package/src/library/serialize-resource-yaml.ts +0 -756
- package/src/library/useImportResource.ts +0 -253
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useCallback, useState } from "react";
|
|
4
|
+
import { cn } from "@stigmer/theme";
|
|
5
|
+
import { FieldType, } from "@stigmer/protos/ai/stigmer/agentic/datastore/v1/spec_pb";
|
|
6
|
+
/**
|
|
7
|
+
* Standard input styling for datastore value controls — the
|
|
8
|
+
* token-compliant idiom (semantic Tailwind classes over `--stgm-*`
|
|
9
|
+
* tokens; no pixel font sizes, no hex fallbacks).
|
|
10
|
+
*/
|
|
11
|
+
export const FIELD_INPUT_CLASSES = cn("w-full rounded-md border border-input bg-background px-2.5 py-1.5 text-xs text-foreground", "placeholder:text-muted-foreground", "focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring", "disabled:pointer-events-none disabled:opacity-50");
|
|
12
|
+
/**
|
|
13
|
+
* The typed value control for a declared datastore field — one
|
|
14
|
+
* controlled input per `FieldType`, emitting canonical encodings
|
|
15
|
+
* (DD-004). Shared by `RecordFormPanel` (field editing) and
|
|
16
|
+
* `RecordFilterBuilder` (condition values), so a field always offers
|
|
17
|
+
* the same input affordance everywhere.
|
|
18
|
+
*
|
|
19
|
+
* Type dispatch:
|
|
20
|
+
* - `string` — text input; enum-select when `enum_values` declared
|
|
21
|
+
* - `integer` / `number` — numeric input (step 1 / any)
|
|
22
|
+
* - `bool` — select with true/false (a checkbox conflates
|
|
23
|
+
* "false" with "unset", which the tri-state
|
|
24
|
+
* write model must not do)
|
|
25
|
+
* - `date` — native date picker (emits `YYYY-MM-DD`)
|
|
26
|
+
* - `time` — native time picker (emits zero-padded `HH:MM[:SS]`)
|
|
27
|
+
* - `timestamp` — native datetime-local picker in the operator's
|
|
28
|
+
* zone, converted to RFC 3339 UTC
|
|
29
|
+
* - `json` — mono textarea with local parse state; only
|
|
30
|
+
* valid JSON is emitted
|
|
31
|
+
*/
|
|
32
|
+
export function FieldValueControl(props) {
|
|
33
|
+
const { field } = props;
|
|
34
|
+
switch (field.type) {
|
|
35
|
+
case FieldType.string:
|
|
36
|
+
return field.enumValues.length > 0 ? _jsx(EnumControl, { ...props }) : _jsx(StringControl, { ...props });
|
|
37
|
+
case FieldType.integer:
|
|
38
|
+
case FieldType.number:
|
|
39
|
+
return _jsx(NumberControl, { ...props });
|
|
40
|
+
case FieldType.bool:
|
|
41
|
+
return _jsx(BoolControl, { ...props });
|
|
42
|
+
case FieldType.date:
|
|
43
|
+
return _jsx(DateControl, { ...props });
|
|
44
|
+
case FieldType.time:
|
|
45
|
+
return _jsx(TimeControl, { ...props });
|
|
46
|
+
case FieldType.timestamp:
|
|
47
|
+
return _jsx(TimestampControl, { ...props });
|
|
48
|
+
case FieldType.json:
|
|
49
|
+
default:
|
|
50
|
+
return _jsx(JsonControl, { ...props });
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
// ---------------------------------------------------------------------------
|
|
54
|
+
// Per-type controls
|
|
55
|
+
// ---------------------------------------------------------------------------
|
|
56
|
+
function StringControl({ value, onChange, disabled, id, "aria-label": ariaLabel }) {
|
|
57
|
+
return (_jsx("input", { id: id, type: "text", className: FIELD_INPUT_CLASSES, value: typeof value === "string" ? value : "", onChange: (e) => onChange(e.target.value === "" ? undefined : e.target.value), disabled: disabled, "aria-label": ariaLabel }));
|
|
58
|
+
}
|
|
59
|
+
function EnumControl({ field, value, onChange, disabled, id, "aria-label": ariaLabel }) {
|
|
60
|
+
return (_jsxs("select", { id: id, className: FIELD_INPUT_CLASSES, value: typeof value === "string" ? value : "", onChange: (e) => onChange(e.target.value === "" ? undefined : e.target.value), disabled: disabled, "aria-label": ariaLabel, children: [_jsx("option", { value: "", children: "\u2014 Select \u2014" }), field.enumValues.map((v) => (_jsx("option", { value: v, children: v }, v)))] }));
|
|
61
|
+
}
|
|
62
|
+
function NumberControl({ field, value, onChange, disabled, id, "aria-label": ariaLabel }) {
|
|
63
|
+
const isInteger = field.type === FieldType.integer;
|
|
64
|
+
return (_jsx("input", { id: id, type: "number", step: isInteger ? 1 : "any", className: FIELD_INPUT_CLASSES, value: typeof value === "number" ? value : "", onChange: (e) => {
|
|
65
|
+
const raw = e.target.value;
|
|
66
|
+
if (raw === "") {
|
|
67
|
+
onChange(undefined);
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
const parsed = isInteger ? Number.parseInt(raw, 10) : Number.parseFloat(raw);
|
|
71
|
+
if (!Number.isNaN(parsed))
|
|
72
|
+
onChange(parsed);
|
|
73
|
+
}, disabled: disabled, "aria-label": ariaLabel }));
|
|
74
|
+
}
|
|
75
|
+
function BoolControl({ value, onChange, disabled, id, "aria-label": ariaLabel }) {
|
|
76
|
+
return (_jsxs("select", { id: id, className: FIELD_INPUT_CLASSES, value: value === true ? "true" : value === false ? "false" : "", onChange: (e) => {
|
|
77
|
+
const v = e.target.value;
|
|
78
|
+
onChange(v === "" ? undefined : v === "true");
|
|
79
|
+
}, disabled: disabled, "aria-label": ariaLabel, children: [_jsx("option", { value: "", children: "\u2014 Select \u2014" }), _jsx("option", { value: "true", children: "true" }), _jsx("option", { value: "false", children: "false" })] }));
|
|
80
|
+
}
|
|
81
|
+
function DateControl({ value, onChange, disabled, id, "aria-label": ariaLabel }) {
|
|
82
|
+
return (_jsx("input", { id: id, type: "date", className: FIELD_INPUT_CLASSES, value: typeof value === "string" ? value : "", onChange: (e) => onChange(e.target.value === "" ? undefined : e.target.value), disabled: disabled, "aria-label": ariaLabel }));
|
|
83
|
+
}
|
|
84
|
+
function TimeControl({ value, onChange, disabled, id, "aria-label": ariaLabel }) {
|
|
85
|
+
return (_jsx("input", { id: id, type: "time", step: 1, className: FIELD_INPUT_CLASSES, value: typeof value === "string" ? value : "", onChange: (e) => onChange(e.target.value === "" ? undefined : e.target.value), disabled: disabled, "aria-label": ariaLabel }));
|
|
86
|
+
}
|
|
87
|
+
function TimestampControl({ value, onChange, disabled, id, "aria-label": ariaLabel }) {
|
|
88
|
+
return (_jsx("input", { id: id, type: "datetime-local", step: 1, className: FIELD_INPUT_CLASSES, value: typeof value === "string" ? utcToLocalInput(value) : "", onChange: (e) => {
|
|
89
|
+
const raw = e.target.value;
|
|
90
|
+
onChange(raw === "" ? undefined : localInputToUtc(raw));
|
|
91
|
+
}, disabled: disabled, "aria-label": ariaLabel }));
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Canonical RFC 3339 UTC → the datetime-local widget's value (the
|
|
95
|
+
* operator's local zone, no zone suffix). Unparseable input renders
|
|
96
|
+
* empty rather than throwing — the value may be mid-edit.
|
|
97
|
+
*/
|
|
98
|
+
function utcToLocalInput(canonical) {
|
|
99
|
+
const ms = Date.parse(canonical);
|
|
100
|
+
if (Number.isNaN(ms))
|
|
101
|
+
return "";
|
|
102
|
+
const d = new Date(ms);
|
|
103
|
+
const pad = (n) => String(n).padStart(2, "0");
|
|
104
|
+
return (`${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}` +
|
|
105
|
+
`T${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}`);
|
|
106
|
+
}
|
|
107
|
+
/** The widget's local value → canonical RFC 3339 UTC. */
|
|
108
|
+
function localInputToUtc(local) {
|
|
109
|
+
const ms = Date.parse(local); // no zone suffix — parsed as local time
|
|
110
|
+
if (Number.isNaN(ms))
|
|
111
|
+
return local; // let coercion report it on submit
|
|
112
|
+
return new Date(ms).toISOString().replace(/\.000Z$/, "Z");
|
|
113
|
+
}
|
|
114
|
+
function JsonControl({ value, onChange, disabled, id, "aria-label": ariaLabel }) {
|
|
115
|
+
const initial = value !== undefined ? JSON.stringify(value, null, 2) : "";
|
|
116
|
+
const [raw, setRaw] = useState(initial);
|
|
117
|
+
const [parseError, setParseError] = useState(null);
|
|
118
|
+
const handleChange = useCallback((e) => {
|
|
119
|
+
const text = e.target.value;
|
|
120
|
+
setRaw(text);
|
|
121
|
+
if (text.trim() === "") {
|
|
122
|
+
setParseError(null);
|
|
123
|
+
onChange(undefined);
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
try {
|
|
127
|
+
const parsed = JSON.parse(text);
|
|
128
|
+
setParseError(null);
|
|
129
|
+
onChange(parsed);
|
|
130
|
+
}
|
|
131
|
+
catch {
|
|
132
|
+
// Invalid JSON stays local — never emitted.
|
|
133
|
+
setParseError("Invalid JSON");
|
|
134
|
+
}
|
|
135
|
+
}, [onChange]);
|
|
136
|
+
return (_jsxs("div", { className: "flex flex-col gap-1", children: [_jsx("textarea", { id: id, rows: 4, className: cn(FIELD_INPUT_CLASSES, "resize-y font-mono"), value: raw, onChange: handleChange, placeholder: "{}", disabled: disabled, "aria-label": ariaLabel, "aria-invalid": parseError !== null }), parseError && (_jsx("span", { role: "alert", className: "text-xs text-destructive", children: parseError }))] }));
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=FieldValueControl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FieldValueControl.js","sourceRoot":"","sources":["../../src/datastore/FieldValueControl.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { type CollectionDeclaration } from "@stigmer/protos/ai/stigmer/agentic/datastore/v1/spec_pb";
|
|
2
|
+
import { type RecordConditionDraft } from "./recordFilter.js";
|
|
3
|
+
/** Props for {@link RecordFilterBuilder}. */
|
|
4
|
+
export interface RecordFilterBuilderProps {
|
|
5
|
+
/** The collection whose declared schema drives fields and operators. */
|
|
6
|
+
readonly collection: CollectionDeclaration;
|
|
7
|
+
/** Active conditions (AND-combined, per the DD-005 grammar). */
|
|
8
|
+
readonly conditions: readonly RecordConditionDraft[];
|
|
9
|
+
/** Called with the full condition set on add/remove/clear. */
|
|
10
|
+
readonly onChange: (conditions: readonly RecordConditionDraft[]) => void;
|
|
11
|
+
/** Additional CSS classes for the root container. */
|
|
12
|
+
readonly className?: string;
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Schema-aware filter builder for the records browser (DD-008 SD-3):
|
|
16
|
+
* active conditions render as removable chips; the "Add filter" popover
|
|
17
|
+
* is draft-then-apply — a condition takes effect only on Apply, so
|
|
18
|
+
* half-built drafts never fire queries.
|
|
19
|
+
*
|
|
20
|
+
* The builder can express nothing `findRecords` cannot serve (DD-008
|
|
21
|
+
* invariant 2): fields come from the declarations plus the filterable
|
|
22
|
+
* system fields, operators from the per-type matrix (an unservable
|
|
23
|
+
* operator is structurally unofferable), and values from the same typed
|
|
24
|
+
* controls the record form uses.
|
|
25
|
+
*
|
|
26
|
+
* All visual properties flow through `--stgm-*` design tokens.
|
|
27
|
+
* Zero Console dependencies — safe for platform builder embedding.
|
|
28
|
+
*/
|
|
29
|
+
export declare function RecordFilterBuilder({ collection, conditions, onChange, className, }: RecordFilterBuilderProps): import("react/jsx-runtime").JSX.Element;
|
|
30
|
+
//# sourceMappingURL=RecordFilterBuilder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RecordFilterBuilder.d.ts","sourceRoot":"","sources":["../../src/datastore/RecordFilterBuilder.tsx"],"names":[],"mappings":"AAOA,OAAO,EAEL,KAAK,qBAAqB,EAE3B,MAAM,yDAAyD,CAAC;AAGjE,OAAO,EAKL,KAAK,oBAAoB,EAC1B,MAAM,mBAAmB,CAAC;AAO3B,6CAA6C;AAC7C,MAAM,WAAW,wBAAwB;IACvC,wEAAwE;IACxE,QAAQ,CAAC,UAAU,EAAE,qBAAqB,CAAC;IAC3C,gEAAgE;IAChE,QAAQ,CAAC,UAAU,EAAE,SAAS,oBAAoB,EAAE,CAAC;IACrD,8DAA8D;IAC9D,QAAQ,CAAC,QAAQ,EAAE,CAAC,UAAU,EAAE,SAAS,oBAAoB,EAAE,KAAK,IAAI,CAAC;IACzE,qDAAqD;IACrD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,mBAAmB,CAAC,EAClC,UAAU,EACV,UAAU,EACV,QAAQ,EACR,SAAS,GACV,EAAE,wBAAwB,2CAwD1B"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useCallback, useMemo, useState } from "react";
|
|
4
|
+
import { cn } from "@stigmer/theme";
|
|
5
|
+
import { Popover } from "@base-ui/react/popover";
|
|
6
|
+
import { create } from "@bufbuild/protobuf";
|
|
7
|
+
import { RecordConditionOp } from "@stigmer/protos/ai/stigmer/agentic/datastore/v1/record_io_pb";
|
|
8
|
+
import { FieldDeclarationSchema, } from "@stigmer/protos/ai/stigmer/agentic/datastore/v1/spec_pb";
|
|
9
|
+
import { useStigmerPortalContainer } from "../portal-container.js";
|
|
10
|
+
import { FIELD_INPUT_CLASSES, FieldValueControl } from "./FieldValueControl.js";
|
|
11
|
+
import { filterableFields, formatConditionChip, isConditionComplete, } from "./recordFilter.js";
|
|
12
|
+
import { isListOperator, isValuelessOperator, OPERATOR_LABELS, } from "./recordValues.js";
|
|
13
|
+
/**
|
|
14
|
+
* Schema-aware filter builder for the records browser (DD-008 SD-3):
|
|
15
|
+
* active conditions render as removable chips; the "Add filter" popover
|
|
16
|
+
* is draft-then-apply — a condition takes effect only on Apply, so
|
|
17
|
+
* half-built drafts never fire queries.
|
|
18
|
+
*
|
|
19
|
+
* The builder can express nothing `findRecords` cannot serve (DD-008
|
|
20
|
+
* invariant 2): fields come from the declarations plus the filterable
|
|
21
|
+
* system fields, operators from the per-type matrix (an unservable
|
|
22
|
+
* operator is structurally unofferable), and values from the same typed
|
|
23
|
+
* controls the record form uses.
|
|
24
|
+
*
|
|
25
|
+
* All visual properties flow through `--stgm-*` design tokens.
|
|
26
|
+
* Zero Console dependencies — safe for platform builder embedding.
|
|
27
|
+
*/
|
|
28
|
+
export function RecordFilterBuilder({ collection, conditions, onChange, className, }) {
|
|
29
|
+
const fields = useMemo(() => filterableFields(collection), [collection]);
|
|
30
|
+
const removeCondition = useCallback((index) => onChange(conditions.filter((_, i) => i !== index)), [conditions, onChange]);
|
|
31
|
+
const addCondition = useCallback((draft) => onChange([...conditions, draft]), [conditions, onChange]);
|
|
32
|
+
return (_jsxs("div", { role: "toolbar", "aria-label": "Record filters", className: cn("flex flex-wrap items-center gap-1.5", className), children: [conditions.map((condition, index) => (_jsxs("span", { className: "inline-flex items-center gap-1 rounded-full border border-border bg-muted px-2 py-0.5 text-xs text-foreground", children: [formatConditionChip(condition), _jsx("button", { type: "button", onClick: () => removeCondition(index), "aria-label": `Remove filter ${formatConditionChip(condition)}`, className: cn("inline-flex size-3.5 items-center justify-center rounded-full text-muted-foreground", "hover:bg-accent hover:text-foreground", "focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring"), children: _jsx(CrossIcon, { className: "size-2.5" }) })] }, `${condition.field}:${index}`))), _jsx(AddFilterPopover, { fields: fields, onApply: addCondition }), conditions.length > 1 && (_jsx("button", { type: "button", onClick: () => onChange([]), className: cn("text-xs text-muted-foreground underline-offset-2 hover:text-foreground hover:underline", "focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring"), children: "Clear all" }))] }));
|
|
33
|
+
}
|
|
34
|
+
// ---------------------------------------------------------------------------
|
|
35
|
+
// The draft-then-apply popover
|
|
36
|
+
// ---------------------------------------------------------------------------
|
|
37
|
+
function AddFilterPopover({ fields, onApply, }) {
|
|
38
|
+
const portalContainer = useStigmerPortalContainer();
|
|
39
|
+
const [open, setOpen] = useState(false);
|
|
40
|
+
const [fieldName, setFieldName] = useState("");
|
|
41
|
+
const [op, setOp] = useState(RecordConditionOp.record_condition_op_unspecified);
|
|
42
|
+
const [value, setValue] = useState(undefined);
|
|
43
|
+
const [values, setValues] = useState([]);
|
|
44
|
+
const selected = fields.find((f) => f.name === fieldName);
|
|
45
|
+
const reset = useCallback(() => {
|
|
46
|
+
setFieldName("");
|
|
47
|
+
setOp(RecordConditionOp.record_condition_op_unspecified);
|
|
48
|
+
setValue(undefined);
|
|
49
|
+
setValues([]);
|
|
50
|
+
}, []);
|
|
51
|
+
const handleOpenChange = useCallback((next) => {
|
|
52
|
+
setOpen(next);
|
|
53
|
+
if (!next)
|
|
54
|
+
reset();
|
|
55
|
+
}, [reset]);
|
|
56
|
+
const selectField = useCallback((name) => {
|
|
57
|
+
setFieldName(name);
|
|
58
|
+
setOp(RecordConditionOp.record_condition_op_unspecified);
|
|
59
|
+
setValue(undefined);
|
|
60
|
+
setValues([]);
|
|
61
|
+
}, []);
|
|
62
|
+
const draft = {
|
|
63
|
+
field: fieldName,
|
|
64
|
+
op,
|
|
65
|
+
value: isListOperator(op) || isValuelessOperator(op) ? undefined : value,
|
|
66
|
+
values: isListOperator(op) ? values : undefined,
|
|
67
|
+
};
|
|
68
|
+
const canApply = fieldName !== "" && isConditionComplete(draft);
|
|
69
|
+
const apply = useCallback(() => {
|
|
70
|
+
// Rebuild from state rather than closing over the render's draft.
|
|
71
|
+
const applied = {
|
|
72
|
+
field: fieldName,
|
|
73
|
+
op,
|
|
74
|
+
value: isListOperator(op) || isValuelessOperator(op) ? undefined : value,
|
|
75
|
+
values: isListOperator(op) ? values : undefined,
|
|
76
|
+
};
|
|
77
|
+
onApply(applied);
|
|
78
|
+
handleOpenChange(false);
|
|
79
|
+
}, [onApply, handleOpenChange, fieldName, op, value, values]);
|
|
80
|
+
return (_jsxs(Popover.Root, { open: open, onOpenChange: handleOpenChange, children: [_jsxs(Popover.Trigger, { className: cn("inline-flex items-center gap-1 rounded-full border border-dashed border-input px-2 py-0.5 text-xs text-muted-foreground", "hover:border-ring hover:text-foreground", "focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring"), children: [_jsx(PlusIcon, { className: "size-3" }), "Add filter"] }), _jsx(Popover.Portal, { container: portalContainer, children: _jsx(Popover.Positioner, { sideOffset: 8, align: "start", children: _jsxs(Popover.Popup, { className: cn("z-popover w-72 rounded-lg border border-border bg-popover p-3 text-popover-foreground shadow-md", "flex flex-col gap-2"), children: [_jsxs("label", { className: "flex flex-col gap-1 text-xs font-medium text-muted-foreground", children: ["Field", _jsxs("select", { className: FIELD_INPUT_CLASSES, value: fieldName, onChange: (e) => selectField(e.target.value), children: [_jsx("option", { value: "", children: "\u2014 Select \u2014" }), fields.map((f) => (_jsx("option", { value: f.name, children: f.name }, f.name)))] })] }), selected && (_jsxs("label", { className: "flex flex-col gap-1 text-xs font-medium text-muted-foreground", children: ["Operator", _jsxs("select", { className: FIELD_INPUT_CLASSES, value: op === RecordConditionOp.record_condition_op_unspecified ? "" : String(op), onChange: (e) => {
|
|
81
|
+
setOp(e.target.value === ""
|
|
82
|
+
? RecordConditionOp.record_condition_op_unspecified
|
|
83
|
+
: Number(e.target.value));
|
|
84
|
+
setValue(undefined);
|
|
85
|
+
setValues([]);
|
|
86
|
+
}, children: [_jsx("option", { value: "", children: "\u2014 Select \u2014" }), selected.operators.map((o) => (_jsx("option", { value: o, children: OPERATOR_LABELS.get(o) }, o)))] })] })), selected &&
|
|
87
|
+
op !== RecordConditionOp.record_condition_op_unspecified &&
|
|
88
|
+
!isValuelessOperator(op) &&
|
|
89
|
+
(isListOperator(op) ? (_jsx(ListValueEditor, { field: selected, values: values, onChange: setValues })) : (_jsxs("div", { className: "flex flex-col gap-1 text-xs font-medium text-muted-foreground", children: ["Value", _jsx(FieldValueControl, { field: controlDeclaration(selected), value: value, onChange: setValue, "aria-label": `Filter value for ${selected.name}` })] }))), _jsxs("div", { className: "mt-1 flex justify-end gap-2", children: [_jsx("button", { type: "button", onClick: () => handleOpenChange(false), className: cn("rounded-md border border-input bg-background px-2.5 py-1 text-xs font-medium text-foreground", "hover:bg-accent hover:text-accent-foreground", "focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring"), children: "Cancel" }), _jsx("button", { type: "button", onClick: apply, disabled: !canApply, className: cn("rounded-md bg-primary px-2.5 py-1 text-xs font-medium text-primary-foreground", "hover:bg-primary-hover", "focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring", "disabled:pointer-events-none disabled:opacity-50"), children: "Apply" })] })] }) }) })] }));
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* The declaration handed to the value control: the declared field
|
|
93
|
+
* itself, or a synthetic declaration for system fields (`id` as string,
|
|
94
|
+
* audit timestamps as timestamp).
|
|
95
|
+
*/
|
|
96
|
+
function controlDeclaration(field) {
|
|
97
|
+
return (field.declaration ??
|
|
98
|
+
create(FieldDeclarationSchema, { name: field.name, type: field.type }));
|
|
99
|
+
}
|
|
100
|
+
// ---------------------------------------------------------------------------
|
|
101
|
+
// List-value entry for in / not_in
|
|
102
|
+
// ---------------------------------------------------------------------------
|
|
103
|
+
function ListValueEditor({ field, values, onChange, }) {
|
|
104
|
+
const [pending, setPending] = useState(undefined);
|
|
105
|
+
const add = useCallback(() => {
|
|
106
|
+
if (pending === undefined)
|
|
107
|
+
return;
|
|
108
|
+
onChange([...values, pending]);
|
|
109
|
+
setPending(undefined);
|
|
110
|
+
}, [pending, values, onChange]);
|
|
111
|
+
return (_jsxs("div", { className: "flex flex-col gap-1 text-xs font-medium text-muted-foreground", children: ["Values", values.length > 0 && (_jsx("div", { className: "flex flex-wrap gap-1", children: values.map((v, i) => (_jsxs("span", { className: "inline-flex items-center gap-1 rounded-full bg-muted px-2 py-0.5 text-xs font-normal text-foreground", children: [typeof v === "string" ? v : JSON.stringify(v), _jsx("button", { type: "button", onClick: () => onChange(values.filter((_, j) => j !== i)), "aria-label": `Remove value ${typeof v === "string" ? v : JSON.stringify(v)}`, className: "inline-flex size-3 items-center justify-center rounded-full text-muted-foreground hover:text-foreground", children: _jsx(CrossIcon, { className: "size-2" }) })] }, i))) })), _jsxs("div", { className: "flex items-center gap-1.5", children: [_jsx(FieldValueControl, { field: controlDeclaration(field), value: pending, onChange: setPending, "aria-label": `Add filter value for ${field.name}` }), _jsx("button", { type: "button", onClick: add, disabled: pending === undefined, className: cn("shrink-0 rounded-md border border-input bg-background px-2 py-1 text-xs font-medium text-foreground", "hover:bg-accent hover:text-accent-foreground", "focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring", "disabled:pointer-events-none disabled:opacity-50"), children: "Add" })] })] }));
|
|
112
|
+
}
|
|
113
|
+
// ---------------------------------------------------------------------------
|
|
114
|
+
// Icons (inline SVG — no icon-library dependency)
|
|
115
|
+
// ---------------------------------------------------------------------------
|
|
116
|
+
function PlusIcon({ className }) {
|
|
117
|
+
return (_jsx("svg", { className: className, viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", "aria-hidden": "true", children: _jsx("path", { d: "M8 3v10M3 8h10" }) }));
|
|
118
|
+
}
|
|
119
|
+
function CrossIcon({ className }) {
|
|
120
|
+
return (_jsx("svg", { className: className, viewBox: "0 0 16 16", fill: "none", stroke: "currentColor", strokeWidth: "1.5", strokeLinecap: "round", "aria-hidden": "true", children: _jsx("path", { d: "M4 4l8 8M12 4l-8 8" }) }));
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=RecordFilterBuilder.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RecordFilterBuilder.js","sourceRoot":"","sources":["../../src/datastore/RecordFilterBuilder.tsx"],"names":[],"mappings":"AAAA,YAAY,CAAC;;AAEb,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACvD,OAAO,EAAE,EAAE,EAAE,MAAM,gBAAgB,CAAC;AACpC,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,OAAO,EAAE,MAAM,EAAkB,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,iBAAiB,EAAE,MAAM,8DAA8D,CAAC;AACjG,OAAO,EACL,sBAAsB,GAGvB,MAAM,yDAAyD,CAAC;AACjE,OAAO,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AACnE,OAAO,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAChF,OAAO,EACL,gBAAgB,EAChB,mBAAmB,EACnB,mBAAmB,GAGpB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EACL,cAAc,EACd,mBAAmB,EACnB,eAAe,GAChB,MAAM,mBAAmB,CAAC;AAc3B;;;;;;;;;;;;;;GAcG;AACH,MAAM,UAAU,mBAAmB,CAAC,EAClC,UAAU,EACV,UAAU,EACV,QAAQ,EACR,SAAS,GACgB;IACzB,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC,gBAAgB,CAAC,UAAU,CAAC,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IAEzE,MAAM,eAAe,GAAG,WAAW,CACjC,CAAC,KAAa,EAAE,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,EACrE,CAAC,UAAU,EAAE,QAAQ,CAAC,CACvB,CAAC;IAEF,MAAM,YAAY,GAAG,WAAW,CAC9B,CAAC,KAA2B,EAAE,EAAE,CAAC,QAAQ,CAAC,CAAC,GAAG,UAAU,EAAE,KAAK,CAAC,CAAC,EACjE,CAAC,UAAU,EAAE,QAAQ,CAAC,CACvB,CAAC;IAEF,OAAO,CACL,eACE,IAAI,EAAC,SAAS,gBACH,gBAAgB,EAC3B,SAAS,EAAE,EAAE,CAAC,qCAAqC,EAAE,SAAS,CAAC,aAE9D,UAAU,CAAC,GAAG,CAAC,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE,CAAC,CACpC,gBAEE,SAAS,EAAC,+GAA+G,aAExH,mBAAmB,CAAC,SAAS,CAAC,EAC/B,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC,gBACzB,iBAAiB,mBAAmB,CAAC,SAAS,CAAC,EAAE,EAC7D,SAAS,EAAE,EAAE,CACX,qFAAqF,EACrF,uCAAuC,EACvC,yEAAyE,CAC1E,YAED,KAAC,SAAS,IAAC,SAAS,EAAC,UAAU,GAAG,GAC3B,KAfJ,GAAG,SAAS,CAAC,KAAK,IAAI,KAAK,EAAE,CAgB7B,CACR,CAAC,EAEF,KAAC,gBAAgB,IAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY,GAAI,EAE1D,UAAU,CAAC,MAAM,GAAG,CAAC,IAAI,CACxB,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,EAC3B,SAAS,EAAE,EAAE,CACX,wFAAwF,EACxF,yEAAyE,CAC1E,0BAGM,CACV,IACG,CACP,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,+BAA+B;AAC/B,8EAA8E;AAE9E,SAAS,gBAAgB,CAAC,EACxB,MAAM,EACN,OAAO,GAIR;IACC,MAAM,eAAe,GAAG,yBAAyB,EAAE,CAAC;IACpD,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAExC,MAAM,CAAC,SAAS,EAAE,YAAY,CAAC,GAAG,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC/C,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,GAAG,QAAQ,CAAoB,iBAAiB,CAAC,+BAA+B,CAAC,CAAC;IACnG,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAwB,SAAS,CAAC,CAAC;IACrE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,QAAQ,CAAuB,EAAE,CAAC,CAAC;IAE/D,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC;IAE1D,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;QAC7B,YAAY,CAAC,EAAE,CAAC,CAAC;QACjB,KAAK,CAAC,iBAAiB,CAAC,+BAA+B,CAAC,CAAC;QACzD,QAAQ,CAAC,SAAS,CAAC,CAAC;QACpB,SAAS,CAAC,EAAE,CAAC,CAAC;IAChB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,gBAAgB,GAAG,WAAW,CAClC,CAAC,IAAa,EAAE,EAAE;QAChB,OAAO,CAAC,IAAI,CAAC,CAAC;QACd,IAAI,CAAC,IAAI;YAAE,KAAK,EAAE,CAAC;IACrB,CAAC,EACD,CAAC,KAAK,CAAC,CACR,CAAC;IAEF,MAAM,WAAW,GAAG,WAAW,CAC7B,CAAC,IAAY,EAAE,EAAE;QACf,YAAY,CAAC,IAAI,CAAC,CAAC;QACnB,KAAK,CAAC,iBAAiB,CAAC,+BAA+B,CAAC,CAAC;QACzD,QAAQ,CAAC,SAAS,CAAC,CAAC;QACpB,SAAS,CAAC,EAAE,CAAC,CAAC;IAChB,CAAC,EACD,EAAE,CACH,CAAC;IAEF,MAAM,KAAK,GAAyB;QAClC,KAAK,EAAE,SAAS;QAChB,EAAE;QACF,KAAK,EAAE,cAAc,CAAC,EAAE,CAAC,IAAI,mBAAmB,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK;QACxE,MAAM,EAAE,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;KAChD,CAAC;IACF,MAAM,QAAQ,GAAG,SAAS,KAAK,EAAE,IAAI,mBAAmB,CAAC,KAAK,CAAC,CAAC;IAEhE,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,EAAE;QAC7B,kEAAkE;QAClE,MAAM,OAAO,GAAyB;YACpC,KAAK,EAAE,SAAS;YAChB,EAAE;YACF,KAAK,EAAE,cAAc,CAAC,EAAE,CAAC,IAAI,mBAAmB,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK;YACxE,MAAM,EAAE,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;SAChD,CAAC;QACF,OAAO,CAAC,OAAO,CAAC,CAAC;QACjB,gBAAgB,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC,EAAE,CAAC,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC;IAE9D,OAAO,CACL,MAAC,OAAO,CAAC,IAAI,IAAC,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,gBAAgB,aACtD,MAAC,OAAO,CAAC,OAAO,IACd,SAAS,EAAE,EAAE,CACX,yHAAyH,EACzH,yCAAyC,EACzC,yEAAyE,CAC1E,aAED,KAAC,QAAQ,IAAC,SAAS,EAAC,QAAQ,GAAG,kBAEf,EAClB,KAAC,OAAO,CAAC,MAAM,IAAC,SAAS,EAAE,eAAe,YACxC,KAAC,OAAO,CAAC,UAAU,IAAC,UAAU,EAAE,CAAC,EAAE,KAAK,EAAC,OAAO,YAC9C,MAAC,OAAO,CAAC,KAAK,IACZ,SAAS,EAAE,EAAE,CACX,iGAAiG,EACjG,qBAAqB,CACtB,aAED,iBAAO,SAAS,EAAC,+DAA+D,sBAE9E,kBACE,SAAS,EAAE,mBAAmB,EAC9B,KAAK,EAAE,SAAS,EAChB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,aAE5C,iBAAQ,KAAK,EAAC,EAAE,qCAAoB,EACnC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CACjB,iBAAqB,KAAK,EAAE,CAAC,CAAC,IAAI,YAC/B,CAAC,CAAC,IAAI,IADI,CAAC,CAAC,IAAI,CAEV,CACV,CAAC,IACK,IACH,EAEP,QAAQ,IAAI,CACX,iBAAO,SAAS,EAAC,+DAA+D,yBAE9E,kBACE,SAAS,EAAE,mBAAmB,EAC9B,KAAK,EAAE,EAAE,KAAK,iBAAiB,CAAC,+BAA+B,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,EACjF,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;4CACd,KAAK,CACH,CAAC,CAAC,MAAM,CAAC,KAAK,KAAK,EAAE;gDACnB,CAAC,CAAC,iBAAiB,CAAC,+BAA+B;gDACnD,CAAC,CAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAuB,CAClD,CAAC;4CACF,QAAQ,CAAC,SAAS,CAAC,CAAC;4CACpB,SAAS,CAAC,EAAE,CAAC,CAAC;wCAChB,CAAC,aAED,iBAAQ,KAAK,EAAC,EAAE,qCAAoB,EACnC,QAAQ,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAC7B,iBAAgB,KAAK,EAAE,CAAC,YACrB,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC,IADZ,CAAC,CAEL,CACV,CAAC,IACK,IACH,CACT,EAEA,QAAQ;gCACP,EAAE,KAAK,iBAAiB,CAAC,+BAA+B;gCACxD,CAAC,mBAAmB,CAAC,EAAE,CAAC;gCACxB,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CACpB,KAAC,eAAe,IAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,GAAI,CAC1E,CAAC,CAAC,CAAC,CACF,eAAK,SAAS,EAAC,+DAA+D,sBAE5E,KAAC,iBAAiB,IAChB,KAAK,EAAE,kBAAkB,CAAC,QAAQ,CAAC,EACnC,KAAK,EAAE,KAAK,EACZ,QAAQ,EAAE,QAAQ,gBACN,oBAAoB,QAAQ,CAAC,IAAI,EAAE,GAC/C,IACE,CACP,CAAC,EAEJ,eAAK,SAAS,EAAC,6BAA6B,aAC1C,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,KAAK,CAAC,EACtC,SAAS,EAAE,EAAE,CACX,8FAA8F,EAC9F,8CAA8C,EAC9C,yEAAyE,CAC1E,uBAGM,EACT,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,KAAK,EACd,QAAQ,EAAE,CAAC,QAAQ,EACnB,SAAS,EAAE,EAAE,CACX,+EAA+E,EAC/E,wBAAwB,EACxB,yEAAyE,EACzE,kDAAkD,CACnD,sBAGM,IACL,IACQ,GACG,GACN,IACJ,CAChB,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,SAAS,kBAAkB,CAAC,KAAsB;IAChD,OAAO,CACL,KAAK,CAAC,WAAW;QACjB,MAAM,CAAC,sBAAsB,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CACvE,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,mCAAmC;AACnC,8EAA8E;AAE9E,SAAS,eAAe,CAAC,EACvB,KAAK,EACL,MAAM,EACN,QAAQ,GAKT;IACC,MAAM,CAAC,OAAO,EAAE,UAAU,CAAC,GAAG,QAAQ,CAAwB,SAAS,CAAC,CAAC;IAEzE,MAAM,GAAG,GAAG,WAAW,CAAC,GAAG,EAAE;QAC3B,IAAI,OAAO,KAAK,SAAS;YAAE,OAAO;QAClC,QAAQ,CAAC,CAAC,GAAG,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;QAC/B,UAAU,CAAC,SAAS,CAAC,CAAC;IACxB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,CAAC;IAEhC,OAAO,CACL,eAAK,SAAS,EAAC,+DAA+D,uBAE3E,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CACpB,cAAK,SAAS,EAAC,sBAAsB,YAClC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CACpB,gBAEE,SAAS,EAAC,sGAAsG,aAE/G,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAC9C,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,gBAC7C,gBAAgB,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,EAC3E,SAAS,EAAC,yGAAyG,YAEnH,KAAC,SAAS,IAAC,SAAS,EAAC,QAAQ,GAAG,GACzB,KAXJ,CAAC,CAYD,CACR,CAAC,GACE,CACP,EACD,eAAK,SAAS,EAAC,2BAA2B,aACxC,KAAC,iBAAiB,IAChB,KAAK,EAAE,kBAAkB,CAAC,KAAK,CAAC,EAChC,KAAK,EAAE,OAAO,EACd,QAAQ,EAAE,UAAU,gBACR,wBAAwB,KAAK,CAAC,IAAI,EAAE,GAChD,EACF,iBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EACZ,QAAQ,EAAE,OAAO,KAAK,SAAS,EAC/B,SAAS,EAAE,EAAE,CACX,qGAAqG,EACrG,8CAA8C,EAC9C,yEAAyE,EACzE,kDAAkD,CACnD,oBAGM,IACL,IACF,CACP,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,kDAAkD;AAClD,8EAA8E;AAE9E,SAAS,QAAQ,CAAC,EAAE,SAAS,EAAmC;IAC9D,OAAO,CACL,cACE,SAAS,EAAE,SAAS,EACpB,OAAO,EAAC,WAAW,EACnB,IAAI,EAAC,MAAM,EACX,MAAM,EAAC,cAAc,EACrB,WAAW,EAAC,KAAK,EACjB,aAAa,EAAC,OAAO,iBACT,MAAM,YAElB,eAAM,CAAC,EAAC,gBAAgB,GAAG,GACvB,CACP,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,EAAE,SAAS,EAAmC;IAC/D,OAAO,CACL,cACE,SAAS,EAAE,SAAS,EACpB,OAAO,EAAC,WAAW,EACnB,IAAI,EAAC,MAAM,EACX,MAAM,EAAC,cAAc,EACrB,WAAW,EAAC,KAAK,EACjB,aAAa,EAAC,OAAO,iBACT,MAAM,YAElB,eAAM,CAAC,EAAC,oBAAoB,GAAG,GAC3B,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { CollectionDeclaration } from "@stigmer/protos/ai/stigmer/agentic/datastore/v1/spec_pb";
|
|
2
|
+
import type { RecordEnvelope } from "@stigmer/protos/ai/stigmer/agentic/datastore/v1/record_io_pb";
|
|
3
|
+
import type { RecordScope } from "./useRecordList.js";
|
|
4
|
+
/** Props for {@link RecordFormPanel}. */
|
|
5
|
+
export interface RecordFormPanelProps {
|
|
6
|
+
/** Whether the panel is open. */
|
|
7
|
+
readonly open: boolean;
|
|
8
|
+
/** Called when the panel requests to close (Escape, Cancel, or save). */
|
|
9
|
+
readonly onOpenChange: (open: boolean) => void;
|
|
10
|
+
/** Record addressing: org, datastore, collection, partition. */
|
|
11
|
+
readonly scope: RecordScope;
|
|
12
|
+
/** The collection declaration driving the form's typed controls. */
|
|
13
|
+
readonly collection: CollectionDeclaration;
|
|
14
|
+
/**
|
|
15
|
+
* The record to edit, or `null`/`undefined` to insert a new one.
|
|
16
|
+
* Edit submits a partial merge of dirty fields only.
|
|
17
|
+
*/
|
|
18
|
+
readonly record?: RecordEnvelope | null;
|
|
19
|
+
/** Called with the server-stamped envelope after a successful save. */
|
|
20
|
+
readonly onSaved?: (envelope: RecordEnvelope) => void;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* The record write surface (DD-008 SD-4): one schema-generated panel
|
|
24
|
+
* form serving insert and edit, with typed controls dispatched from
|
|
25
|
+
* `FieldDeclaration`.
|
|
26
|
+
*
|
|
27
|
+
* - **Insert** submits every field the operator set; required fields
|
|
28
|
+
* gate the submit (error prevention — the server remains the
|
|
29
|
+
* enforcer).
|
|
30
|
+
* - **Edit** submits a **partial merge**: only dirty fields travel, and
|
|
31
|
+
* the per-field clear affordance sends an explicit `null` — the form
|
|
32
|
+
* is honest about the RPC's tri-state. System fields render read-only
|
|
33
|
+
* and never travel.
|
|
34
|
+
* - **Errors replay the DD-002/DD-005 contract for humans**: a
|
|
35
|
+
* constraint violation renders the declared message **verbatim** —
|
|
36
|
+
* field-adjacent when the `ErrorInfo` constraint name maps through
|
|
37
|
+
* the spec to declared fields (unique constraints), as a form-level
|
|
38
|
+
* banner otherwise. The console operator and the WhatsApp patient
|
|
39
|
+
* read the same bytes.
|
|
40
|
+
*
|
|
41
|
+
* All visual properties flow through `--stgm-*` design tokens.
|
|
42
|
+
* Zero Console dependencies — safe for platform builder embedding.
|
|
43
|
+
*/
|
|
44
|
+
export declare function RecordFormPanel({ open, onOpenChange, scope, collection, record, onSaved, }: RecordFormPanelProps): import("react/jsx-runtime").JSX.Element | null;
|
|
45
|
+
//# sourceMappingURL=RecordFormPanel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RecordFormPanel.d.ts","sourceRoot":"","sources":["../../src/datastore/RecordFormPanel.tsx"],"names":[],"mappings":"AAOA,OAAO,KAAK,EACV,qBAAqB,EAEtB,MAAM,yDAAyD,CAAC;AACjE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8DAA8D,CAAC;AAUnG,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD,yCAAyC;AACzC,MAAM,WAAW,oBAAoB;IACnC,iCAAiC;IACjC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IACvB,yEAAyE;IACzE,QAAQ,CAAC,YAAY,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IAC/C,gEAAgE;IAChE,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;IAC5B,oEAAoE;IACpE,QAAQ,CAAC,UAAU,EAAE,qBAAqB,CAAC;IAC3C;;;OAGG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;IACxC,uEAAuE;IACvE,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,cAAc,KAAK,IAAI,CAAC;CACvD;AAWD;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,eAAe,CAAC,EAC9B,IAAI,EACJ,YAAY,EACZ,KAAK,EACL,UAAU,EACV,MAAM,EACN,OAAO,GACR,EAAE,oBAAoB,kDAqOtB"}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
3
|
+
import { useCallback, useEffect, useId, useMemo, useRef, useState } from "react";
|
|
4
|
+
import { cn } from "@stigmer/theme";
|
|
5
|
+
import { timestampDate } from "@bufbuild/protobuf/wkt";
|
|
6
|
+
import { getRecordConstraint, getUserMessage } from "@stigmer/sdk";
|
|
7
|
+
import { FieldValueControl } from "./FieldValueControl.js";
|
|
8
|
+
import { buildUpdateFields, coerceFieldValue, formatSystemTimestamp, } from "./recordValues.js";
|
|
9
|
+
import { formatSubject } from "./CollectionSchemaView.js";
|
|
10
|
+
import { useInsertRecord } from "./useInsertRecord.js";
|
|
11
|
+
import { useUpdateRecord } from "./useUpdateRecord.js";
|
|
12
|
+
/**
|
|
13
|
+
* The record write surface (DD-008 SD-4): one schema-generated panel
|
|
14
|
+
* form serving insert and edit, with typed controls dispatched from
|
|
15
|
+
* `FieldDeclaration`.
|
|
16
|
+
*
|
|
17
|
+
* - **Insert** submits every field the operator set; required fields
|
|
18
|
+
* gate the submit (error prevention — the server remains the
|
|
19
|
+
* enforcer).
|
|
20
|
+
* - **Edit** submits a **partial merge**: only dirty fields travel, and
|
|
21
|
+
* the per-field clear affordance sends an explicit `null` — the form
|
|
22
|
+
* is honest about the RPC's tri-state. System fields render read-only
|
|
23
|
+
* and never travel.
|
|
24
|
+
* - **Errors replay the DD-002/DD-005 contract for humans**: a
|
|
25
|
+
* constraint violation renders the declared message **verbatim** —
|
|
26
|
+
* field-adjacent when the `ErrorInfo` constraint name maps through
|
|
27
|
+
* the spec to declared fields (unique constraints), as a form-level
|
|
28
|
+
* banner otherwise. The console operator and the WhatsApp patient
|
|
29
|
+
* read the same bytes.
|
|
30
|
+
*
|
|
31
|
+
* All visual properties flow through `--stgm-*` design tokens.
|
|
32
|
+
* Zero Console dependencies — safe for platform builder embedding.
|
|
33
|
+
*/
|
|
34
|
+
export function RecordFormPanel({ open, onOpenChange, scope, collection, record, onSaved, }) {
|
|
35
|
+
const dialogRef = useRef(null);
|
|
36
|
+
const isEdit = record != null;
|
|
37
|
+
const insert = useInsertRecord();
|
|
38
|
+
const update = useUpdateRecord();
|
|
39
|
+
const isSaving = insert.isInserting || update.isUpdating;
|
|
40
|
+
const [edits, setEdits] = useState(new Map());
|
|
41
|
+
const [fieldErrors, setFieldErrors] = useState(new Map());
|
|
42
|
+
const [bannerError, setBannerError] = useState(null);
|
|
43
|
+
// Reset form state whenever the panel opens (fresh draft per open).
|
|
44
|
+
// Deps narrowed to the stable clearError callbacks (DD-010).
|
|
45
|
+
const clearInsertError = insert.clearError;
|
|
46
|
+
const clearUpdateError = update.clearError;
|
|
47
|
+
useEffect(() => {
|
|
48
|
+
if (open) {
|
|
49
|
+
setEdits(new Map());
|
|
50
|
+
setFieldErrors(new Map());
|
|
51
|
+
setBannerError(null);
|
|
52
|
+
clearInsertError();
|
|
53
|
+
clearUpdateError();
|
|
54
|
+
}
|
|
55
|
+
}, [open, record?.id, clearInsertError, clearUpdateError]);
|
|
56
|
+
// Native <dialog> open/close sync (the ConfirmDialog pattern).
|
|
57
|
+
useEffect(() => {
|
|
58
|
+
const dialog = dialogRef.current;
|
|
59
|
+
if (!dialog)
|
|
60
|
+
return;
|
|
61
|
+
if (open && !dialog.open)
|
|
62
|
+
dialog.showModal();
|
|
63
|
+
else if (!open && dialog.open)
|
|
64
|
+
dialog.close();
|
|
65
|
+
}, [open]);
|
|
66
|
+
const handleDialogCancel = useCallback((e) => {
|
|
67
|
+
e.preventDefault();
|
|
68
|
+
onOpenChange(false);
|
|
69
|
+
}, [onOpenChange]);
|
|
70
|
+
/** The effective value a field's control shows: edit > stored > empty. */
|
|
71
|
+
const effectiveValue = useCallback((field) => {
|
|
72
|
+
const edit = edits.get(field.name);
|
|
73
|
+
if (edit)
|
|
74
|
+
return edit.kind === "cleared" ? undefined : edit.value;
|
|
75
|
+
if (isEdit) {
|
|
76
|
+
const stored = record?.fields?.[field.name];
|
|
77
|
+
return stored === null ? undefined : stored;
|
|
78
|
+
}
|
|
79
|
+
return undefined;
|
|
80
|
+
}, [edits, isEdit, record]);
|
|
81
|
+
const setFieldValue = useCallback((name, value) => {
|
|
82
|
+
setEdits((prev) => {
|
|
83
|
+
const next = new Map(prev);
|
|
84
|
+
if (value === undefined) {
|
|
85
|
+
// Emptying the control: in insert mode the field simply won't
|
|
86
|
+
// travel; in edit mode an emptied control is an explicit clear.
|
|
87
|
+
next.set(name, { kind: "cleared" });
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
next.set(name, { kind: "value", value });
|
|
91
|
+
}
|
|
92
|
+
return next;
|
|
93
|
+
});
|
|
94
|
+
setFieldErrors((prev) => {
|
|
95
|
+
if (!prev.has(name))
|
|
96
|
+
return prev;
|
|
97
|
+
const next = new Map(prev);
|
|
98
|
+
next.delete(name);
|
|
99
|
+
return next;
|
|
100
|
+
});
|
|
101
|
+
}, []);
|
|
102
|
+
const clearField = useCallback((name) => {
|
|
103
|
+
setEdits((prev) => new Map(prev).set(name, { kind: "cleared" }));
|
|
104
|
+
}, []);
|
|
105
|
+
// Required fields gate the submit in insert mode (error prevention).
|
|
106
|
+
const missingRequired = useMemo(() => {
|
|
107
|
+
if (isEdit)
|
|
108
|
+
return [];
|
|
109
|
+
return collection.fields
|
|
110
|
+
.filter((f) => f.required && f.default === undefined)
|
|
111
|
+
.filter((f) => {
|
|
112
|
+
const edit = edits.get(f.name);
|
|
113
|
+
return !edit || edit.kind === "cleared";
|
|
114
|
+
})
|
|
115
|
+
.map((f) => f.name);
|
|
116
|
+
}, [collection, edits, isEdit]);
|
|
117
|
+
const handleSubmit = useCallback(async () => {
|
|
118
|
+
setBannerError(null);
|
|
119
|
+
// Client-side coercion (a projection of the server contract): fail
|
|
120
|
+
// fast with field-adjacent messages; the server stays the enforcer.
|
|
121
|
+
const coerced = new Map();
|
|
122
|
+
const errors = new Map();
|
|
123
|
+
for (const field of collection.fields) {
|
|
124
|
+
const edit = edits.get(field.name);
|
|
125
|
+
if (!edit)
|
|
126
|
+
continue;
|
|
127
|
+
if (edit.kind === "cleared") {
|
|
128
|
+
if (isEdit)
|
|
129
|
+
coerced.set(field.name, null);
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
const result = coerceFieldValue(field, edit.value);
|
|
133
|
+
if (result.ok) {
|
|
134
|
+
coerced.set(field.name, result.value);
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
errors.set(field.name, result.error);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
if (errors.size > 0) {
|
|
141
|
+
setFieldErrors(errors);
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
try {
|
|
145
|
+
let saved;
|
|
146
|
+
if (isEdit) {
|
|
147
|
+
if (coerced.size === 0) {
|
|
148
|
+
onOpenChange(false); // nothing dirty — an honest no-op
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
saved = await update.updateRecord({
|
|
152
|
+
...scope,
|
|
153
|
+
id: record.id,
|
|
154
|
+
fields: buildUpdateFields(coerced),
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
const payload = {};
|
|
159
|
+
for (const [name, value] of coerced) {
|
|
160
|
+
if (value !== null)
|
|
161
|
+
payload[name] = value;
|
|
162
|
+
}
|
|
163
|
+
saved = await insert.insertRecord({ ...scope, record: payload });
|
|
164
|
+
}
|
|
165
|
+
onSaved?.(saved);
|
|
166
|
+
onOpenChange(false);
|
|
167
|
+
}
|
|
168
|
+
catch (err) {
|
|
169
|
+
placeServerError(err, collection, setFieldErrors, setBannerError);
|
|
170
|
+
}
|
|
171
|
+
}, [collection, edits, isEdit, record, scope, insert, update, onSaved, onOpenChange]);
|
|
172
|
+
if (!open)
|
|
173
|
+
return null;
|
|
174
|
+
return (_jsx("dialog", { ref: dialogRef, onCancel: handleDialogCancel, "aria-label": isEdit
|
|
175
|
+
? `Edit record in ${collection.name}`
|
|
176
|
+
: `Insert record into ${collection.name}`, className: cn("fixed inset-0 z-50 m-auto w-full max-w-md rounded-lg border border-border bg-popover p-0 text-popover-foreground shadow-lg", "backdrop:bg-black/50", "open:animate-in open:fade-in-0 open:zoom-in-95"), children: _jsxs("div", { className: "flex max-h-[80vh] flex-col gap-4 overflow-y-auto p-6", children: [_jsxs("h3", { className: "text-base font-semibold text-foreground", children: [isEdit ? "Edit record" : "Insert record", _jsx("span", { className: "ml-2 font-mono text-xs font-normal text-muted-foreground", children: collection.name })] }), bannerError && (_jsx("div", { role: "alert", className: "rounded-md border border-destructive bg-card px-3 py-2 text-sm text-destructive", children: bannerError })), isEdit && record && _jsx(SystemFieldsSummary, { record: record }), _jsx("div", { className: "flex flex-col gap-3", children: collection.fields.map((field) => (_jsx(FieldRow, { field: field, value: effectiveValue(field), error: fieldErrors.get(field.name), isEdit: isEdit, cleared: edits.get(field.name)?.kind === "cleared", onChange: (v) => setFieldValue(field.name, v), onClear: () => clearField(field.name) }, field.name))) }), _jsxs("div", { className: "flex items-center justify-end gap-2", children: [missingRequired.length > 0 && (_jsxs("span", { className: "mr-auto text-xs text-muted-foreground", children: ["Required: ", missingRequired.join(", ")] })), _jsx("button", { type: "button", onClick: () => onOpenChange(false), className: cn("rounded-md border border-input bg-background px-3 py-1.5 text-sm font-medium text-foreground", "hover:bg-accent hover:text-accent-foreground", "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"), children: "Cancel" }), _jsx("button", { type: "button", onClick: handleSubmit, disabled: isSaving || missingRequired.length > 0, className: cn("rounded-md bg-primary px-3 py-1.5 text-sm font-medium text-primary-foreground", "hover:bg-primary-hover", "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring", "disabled:pointer-events-none disabled:opacity-50"), children: isSaving ? "Saving…" : isEdit ? "Save changes" : "Insert" })] })] }) }));
|
|
177
|
+
}
|
|
178
|
+
// ---------------------------------------------------------------------------
|
|
179
|
+
// Server-error placement (DD-008 SD-4)
|
|
180
|
+
// ---------------------------------------------------------------------------
|
|
181
|
+
/**
|
|
182
|
+
* Place a record-write error: field-adjacent when the ErrorInfo
|
|
183
|
+
* constraint name maps to a unique constraint's declared fields, a
|
|
184
|
+
* form-level banner otherwise. Either way the message is the server's
|
|
185
|
+
* bytes, verbatim.
|
|
186
|
+
*/
|
|
187
|
+
function placeServerError(err, collection, setFieldErrors, setBannerError) {
|
|
188
|
+
const message = getUserMessage(err);
|
|
189
|
+
const constraintName = getRecordConstraint(err);
|
|
190
|
+
if (constraintName) {
|
|
191
|
+
const unique = collection.uniques.find((u) => u.name === constraintName);
|
|
192
|
+
if (unique && unique.fields.length > 0) {
|
|
193
|
+
setFieldErrors(new Map(unique.fields.map((f) => [f, message])));
|
|
194
|
+
return;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
setBannerError(message);
|
|
198
|
+
}
|
|
199
|
+
// ---------------------------------------------------------------------------
|
|
200
|
+
// Rows
|
|
201
|
+
// ---------------------------------------------------------------------------
|
|
202
|
+
function FieldRow({ field, value, error, isEdit, cleared, onChange, onClear, }) {
|
|
203
|
+
const controlId = useId();
|
|
204
|
+
const showClear = isEdit && !field.required && !cleared && value !== undefined;
|
|
205
|
+
return (_jsxs("div", { className: "flex flex-col gap-1", children: [_jsxs("div", { className: "flex items-baseline gap-1", children: [_jsxs("label", { htmlFor: controlId, className: "text-xs font-medium text-muted-foreground", children: [field.name, field.required && (_jsxs("span", { className: "text-destructive", "aria-label": "required", children: [" ", "*"] }))] }), showClear && (_jsx("button", { type: "button", onClick: onClear, "aria-label": `Clear ${field.name}`, className: cn("ml-auto text-xs text-muted-foreground underline-offset-2 hover:text-foreground hover:underline", "focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring"), children: "Clear" })), cleared && (_jsx("span", { className: "ml-auto text-xs italic text-muted-foreground", children: "will be cleared" }))] }), field.description && (_jsx("p", { className: "text-xs leading-tight text-muted-foreground", children: field.description })), _jsx(FieldValueControl, { id: controlId, field: field, value: value, onChange: onChange }), error && (_jsx("span", { role: "alert", className: "text-xs text-destructive", children: error }))] }));
|
|
206
|
+
}
|
|
207
|
+
/** Read-only envelope columns shown in edit mode; never editable, never submitted. */
|
|
208
|
+
function SystemFieldsSummary({ record }) {
|
|
209
|
+
return (_jsxs("dl", { className: "grid grid-cols-[auto_1fr] gap-x-3 gap-y-1 rounded-md bg-muted p-3 text-xs", children: [_jsx("dt", { className: "font-medium text-muted-foreground", children: "id" }), _jsx("dd", { className: "truncate font-mono text-foreground", children: record.id }), _jsx("dt", { className: "font-medium text-muted-foreground", children: "created_at" }), _jsx("dd", { className: "font-mono text-foreground", children: record.createdAt
|
|
210
|
+
? formatSystemTimestamp(timestampDate(record.createdAt).toISOString())
|
|
211
|
+
: "" }), _jsx("dt", { className: "font-medium text-muted-foreground", children: "updated_at" }), _jsx("dd", { className: "font-mono text-foreground", children: record.updatedAt
|
|
212
|
+
? formatSystemTimestamp(timestampDate(record.updatedAt).toISOString())
|
|
213
|
+
: "" }), _jsx("dt", { className: "font-medium text-muted-foreground", children: "created_by" }), _jsx("dd", { className: "truncate font-mono text-foreground", children: formatSubject(record.createdBy) })] }));
|
|
214
|
+
}
|
|
215
|
+
//# sourceMappingURL=RecordFormPanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RecordFormPanel.js","sourceRoot":"","sources":["../../src/datastore/RecordFormPanel.tsx"],"names":[],"mappings":"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"}
|