@flanksource/clicky-ui 0.3.40 → 0.3.41
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/README.md +24 -0
- package/dist/ai.cjs +10 -0
- package/dist/ai.cjs.map +1 -1
- package/dist/ai.js +10 -0
- package/dist/ai.js.map +1 -1
- package/dist/components/AccordionList.cjs +5 -1
- package/dist/components/AccordionList.cjs.map +1 -1
- package/dist/components/AccordionList.d.ts +3 -1
- package/dist/components/AccordionList.d.ts.map +1 -1
- package/dist/components/AccordionList.js +5 -1
- package/dist/components/AccordionList.js.map +1 -1
- package/dist/components/JsonSchemaForm.cjs +9 -4
- package/dist/components/JsonSchemaForm.cjs.map +1 -1
- package/dist/components/JsonSchemaForm.d.ts +1 -1
- package/dist/components/JsonSchemaForm.d.ts.map +1 -1
- package/dist/components/JsonSchemaForm.js +8 -3
- package/dist/components/JsonSchemaForm.js.map +1 -1
- package/dist/components/json-schema-form-accordion-array.cjs +3 -1
- package/dist/components/json-schema-form-accordion-array.cjs.map +1 -1
- package/dist/components/json-schema-form-accordion-array.d.ts +4 -1
- package/dist/components/json-schema-form-accordion-array.d.ts.map +1 -1
- package/dist/components/json-schema-form-accordion-array.js +3 -1
- package/dist/components/json-schema-form-accordion-array.js.map +1 -1
- package/dist/components/json-schema-form-array-view.cjs +63 -0
- package/dist/components/json-schema-form-array-view.cjs.map +1 -0
- package/dist/components/json-schema-form-array-view.d.ts +21 -0
- package/dist/components/json-schema-form-array-view.d.ts.map +1 -0
- package/dist/components/json-schema-form-array-view.js +63 -0
- package/dist/components/json-schema-form-array-view.js.map +1 -0
- package/dist/components/json-schema-form-array.cjs +3 -7
- package/dist/components/json-schema-form-array.cjs.map +1 -1
- package/dist/components/json-schema-form-array.d.ts.map +1 -1
- package/dist/components/json-schema-form-array.js +3 -7
- package/dist/components/json-schema-form-array.js.map +1 -1
- package/dist/components/json-schema-form-conditionals.cjs +67 -0
- package/dist/components/json-schema-form-conditionals.cjs.map +1 -0
- package/dist/components/json-schema-form-conditionals.d.ts +9 -0
- package/dist/components/json-schema-form-conditionals.d.ts.map +1 -0
- package/dist/components/json-schema-form-conditionals.js +67 -0
- package/dist/components/json-schema-form-conditionals.js.map +1 -0
- package/dist/components/json-schema-form-defaults.cjs +68 -0
- package/dist/components/json-schema-form-defaults.cjs.map +1 -0
- package/dist/components/json-schema-form-defaults.d.ts +4 -0
- package/dist/components/json-schema-form-defaults.d.ts.map +1 -0
- package/dist/components/json-schema-form-defaults.js +68 -0
- package/dist/components/json-schema-form-defaults.js.map +1 -0
- package/dist/components/json-schema-form-errors.cjs +49 -31
- package/dist/components/json-schema-form-errors.cjs.map +1 -1
- package/dist/components/json-schema-form-errors.d.ts +4 -2
- package/dist/components/json-schema-form-errors.d.ts.map +1 -1
- package/dist/components/json-schema-form-errors.js +51 -33
- package/dist/components/json-schema-form-errors.js.map +1 -1
- package/dist/components/json-schema-form-filter.cjs +2 -1
- package/dist/components/json-schema-form-filter.cjs.map +1 -1
- package/dist/components/json-schema-form-filter.js +2 -1
- package/dist/components/json-schema-form-filter.js.map +1 -1
- package/dist/components/json-schema-form-item-summary.cjs +6 -2
- package/dist/components/json-schema-form-item-summary.cjs.map +1 -1
- package/dist/components/json-schema-form-item-summary.d.ts.map +1 -1
- package/dist/components/json-schema-form-item-summary.js +6 -2
- package/dist/components/json-schema-form-item-summary.js.map +1 -1
- package/dist/components/json-schema-form-layout.cjs +28 -19
- package/dist/components/json-schema-form-layout.cjs.map +1 -1
- package/dist/components/json-schema-form-layout.d.ts +8 -6
- package/dist/components/json-schema-form-layout.d.ts.map +1 -1
- package/dist/components/json-schema-form-layout.js +29 -20
- package/dist/components/json-schema-form-layout.js.map +1 -1
- package/dist/components/json-schema-form-listener-paths.cjs +52 -0
- package/dist/components/json-schema-form-listener-paths.cjs.map +1 -0
- package/dist/components/json-schema-form-listener-paths.d.ts +10 -0
- package/dist/components/json-schema-form-listener-paths.d.ts.map +1 -0
- package/dist/components/json-schema-form-listener-paths.js +52 -0
- package/dist/components/json-schema-form-listener-paths.js.map +1 -0
- package/dist/components/json-schema-form-listener-types.d.ts +22 -0
- package/dist/components/json-schema-form-listener-types.d.ts.map +1 -0
- package/dist/components/json-schema-form-listeners.cjs +250 -0
- package/dist/components/json-schema-form-listeners.cjs.map +1 -0
- package/dist/components/json-schema-form-listeners.d.ts +13 -0
- package/dist/components/json-schema-form-listeners.d.ts.map +1 -0
- package/dist/components/json-schema-form-listeners.js +250 -0
- package/dist/components/json-schema-form-listeners.js.map +1 -0
- package/dist/components/json-schema-form-object-array-view.cjs +62 -0
- package/dist/components/json-schema-form-object-array-view.cjs.map +1 -0
- package/dist/components/json-schema-form-object-array-view.d.ts +14 -0
- package/dist/components/json-schema-form-object-array-view.d.ts.map +1 -0
- package/dist/components/json-schema-form-object-array-view.js +62 -0
- package/dist/components/json-schema-form-object-array-view.js.map +1 -0
- package/dist/components/json-schema-form-object.cjs +3 -0
- package/dist/components/json-schema-form-object.cjs.map +1 -1
- package/dist/components/json-schema-form-object.d.ts.map +1 -1
- package/dist/components/json-schema-form-object.js +3 -0
- package/dist/components/json-schema-form-object.js.map +1 -1
- package/dist/components/json-schema-form-render.cjs +17 -9
- package/dist/components/json-schema-form-render.cjs.map +1 -1
- package/dist/components/json-schema-form-render.d.ts.map +1 -1
- package/dist/components/json-schema-form-render.js +19 -11
- package/dist/components/json-schema-form-render.js.map +1 -1
- package/dist/components/json-schema-form-resolve.cjs +6 -99
- package/dist/components/json-schema-form-resolve.cjs.map +1 -1
- package/dist/components/json-schema-form-resolve.d.ts +1 -8
- package/dist/components/json-schema-form-resolve.d.ts.map +1 -1
- package/dist/components/json-schema-form-resolve.js +5 -98
- package/dist/components/json-schema-form-resolve.js.map +1 -1
- package/dist/components/json-schema-form-runtime-types.d.ts +15 -0
- package/dist/components/json-schema-form-runtime-types.d.ts.map +1 -1
- package/dist/components/json-schema-form-table-array.cjs +67 -16
- package/dist/components/json-schema-form-table-array.cjs.map +1 -1
- package/dist/components/json-schema-form-table-array.d.ts +4 -1
- package/dist/components/json-schema-form-table-array.d.ts.map +1 -1
- package/dist/components/json-schema-form-table-array.js +70 -19
- package/dist/components/json-schema-form-table-array.js.map +1 -1
- package/dist/components/json-schema-form-types.d.ts +16 -0
- package/dist/components/json-schema-form-types.d.ts.map +1 -1
- package/dist/components/json-schema-form-utils.cjs +7 -1
- package/dist/components/json-schema-form-utils.cjs.map +1 -1
- package/dist/components/json-schema-form-utils.d.ts +2 -1
- package/dist/components/json-schema-form-utils.d.ts.map +1 -1
- package/dist/components/json-schema-form-utils.js +7 -1
- package/dist/components/json-schema-form-utils.js.map +1 -1
- package/dist/components.cjs +3 -2
- package/dist/components.cjs.map +1 -1
- package/dist/components.d.ts +3 -2
- package/dist/components.d.ts.map +1 -1
- package/dist/components.js +2 -1
- package/dist/components.js.map +1 -1
- package/dist/data/DataTable.cjs +9 -3
- package/dist/data/DataTable.cjs.map +1 -1
- package/dist/data/DataTable.d.ts +6 -0
- package/dist/data/DataTable.d.ts.map +1 -1
- package/dist/data/DataTable.js +9 -3
- package/dist/data/DataTable.js.map +1 -1
- package/dist/data/FixtureEditor/FixtureEditor.cjs +43 -24
- package/dist/data/FixtureEditor/FixtureEditor.cjs.map +1 -1
- package/dist/data/FixtureEditor/FixtureEditor.d.ts.map +1 -1
- package/dist/data/FixtureEditor/FixtureEditor.js +43 -24
- package/dist/data/FixtureEditor/FixtureEditor.js.map +1 -1
- package/dist/data/Tree.cjs +10 -2
- package/dist/data/Tree.cjs.map +1 -1
- package/dist/data/Tree.d.ts +6 -1
- package/dist/data/Tree.d.ts.map +1 -1
- package/dist/data/Tree.js +10 -2
- package/dist/data/Tree.js.map +1 -1
- package/dist/data/ai/SessionInspector.cjs +143 -167
- package/dist/data/ai/SessionInspector.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.collection-types.d.ts +5 -0
- package/dist/data/ai/SessionInspector.collection-types.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.collection.cjs +18 -5
- package/dist/data/ai/SessionInspector.collection.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.collection.d.ts +2 -0
- package/dist/data/ai/SessionInspector.collection.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.collection.fixtures.d.ts +6 -0
- package/dist/data/ai/SessionInspector.collection.fixtures.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.collection.js +18 -5
- package/dist/data/ai/SessionInspector.collection.js.map +1 -1
- package/dist/data/ai/SessionInspector.d.ts +24 -2
- package/dist/data/ai/SessionInspector.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.hierarchy-state.cjs +105 -7
- package/dist/data/ai/SessionInspector.hierarchy-state.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.hierarchy-state.d.ts +12 -1
- package/dist/data/ai/SessionInspector.hierarchy-state.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.hierarchy-state.js +107 -9
- package/dist/data/ai/SessionInspector.hierarchy-state.js.map +1 -1
- package/dist/data/ai/SessionInspector.hierarchy.cjs +1 -1
- package/dist/data/ai/SessionInspector.hierarchy.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.hierarchy.js +1 -1
- package/dist/data/ai/SessionInspector.hierarchy.js.map +1 -1
- package/dist/data/ai/SessionInspector.js +144 -168
- package/dist/data/ai/SessionInspector.js.map +1 -1
- package/dist/data/ai/SessionInspector.legacy.cjs +116 -0
- package/dist/data/ai/SessionInspector.legacy.cjs.map +1 -0
- package/dist/data/ai/SessionInspector.legacy.d.ts +19 -0
- package/dist/data/ai/SessionInspector.legacy.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.legacy.js +116 -0
- package/dist/data/ai/SessionInspector.legacy.js.map +1 -0
- package/dist/data/ai/SessionInspector.panels.cjs +3 -0
- package/dist/data/ai/SessionInspector.panels.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.panels.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.panels.js +3 -0
- package/dist/data/ai/SessionInspector.panels.js.map +1 -1
- package/dist/data/ai/SessionInspector.plan.cjs +29 -12
- package/dist/data/ai/SessionInspector.plan.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.plan.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.plan.js +30 -13
- package/dist/data/ai/SessionInspector.plan.js.map +1 -1
- package/dist/data/ai/SessionInspector.remote-view.cjs +44 -0
- package/dist/data/ai/SessionInspector.remote-view.cjs.map +1 -0
- package/dist/data/ai/SessionInspector.remote-view.d.ts +11 -0
- package/dist/data/ai/SessionInspector.remote-view.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.remote-view.js +44 -0
- package/dist/data/ai/SessionInspector.remote-view.js.map +1 -0
- package/dist/data/ai/SessionInspector.remote.cjs +275 -0
- package/dist/data/ai/SessionInspector.remote.cjs.map +1 -0
- package/dist/data/ai/SessionInspector.remote.d.ts +57 -0
- package/dist/data/ai/SessionInspector.remote.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.remote.js +275 -0
- package/dist/data/ai/SessionInspector.remote.js.map +1 -0
- package/dist/data/ai/SessionInspector.summary.cjs +0 -156
- package/dist/data/ai/SessionInspector.summary.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.summary.d.ts +0 -3
- package/dist/data/ai/SessionInspector.summary.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.summary.js +2 -158
- package/dist/data/ai/SessionInspector.summary.js.map +1 -1
- package/dist/data/ai/SessionInspector.tab-state.cjs +15 -0
- package/dist/data/ai/SessionInspector.tab-state.cjs.map +1 -0
- package/dist/data/ai/SessionInspector.tab-state.d.ts +3 -0
- package/dist/data/ai/SessionInspector.tab-state.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.tab-state.js +15 -0
- package/dist/data/ai/SessionInspector.tab-state.js.map +1 -0
- package/dist/data/ai/SessionInspector.tabs.model.cjs +31 -18
- package/dist/data/ai/SessionInspector.tabs.model.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.tabs.model.d.ts +3 -1
- package/dist/data/ai/SessionInspector.tabs.model.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.tabs.model.js +32 -19
- package/dist/data/ai/SessionInspector.tabs.model.js.map +1 -1
- package/dist/data/ai/SessionInspector.verification.cjs +53 -0
- package/dist/data/ai/SessionInspector.verification.cjs.map +1 -0
- package/dist/data/ai/SessionInspector.verification.d.ts +7 -0
- package/dist/data/ai/SessionInspector.verification.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.verification.js +53 -0
- package/dist/data/ai/SessionInspector.verification.js.map +1 -0
- package/dist/data/ai/SessionViewer.model.cjs +7 -1
- package/dist/data/ai/SessionViewer.model.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.model.d.ts +21 -3
- package/dist/data/ai/SessionViewer.model.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.model.js +7 -1
- package/dist/data/ai/SessionViewer.model.js.map +1 -1
- package/dist/data/ai/SessionViewer.unified.d.ts +13 -0
- package/dist/data/ai/SessionViewer.unified.d.ts.map +1 -1
- package/dist/data/ai/index.d.ts +3 -1
- package/dist/data/ai/index.d.ts.map +1 -1
- package/dist/data/version-info.cjs +3 -3
- package/dist/data/version-info.js +3 -3
- package/dist/devtools/useDebugStream.cjs +5 -1
- package/dist/devtools/useDebugStream.cjs.map +1 -1
- package/dist/devtools/useDebugStream.d.ts.map +1 -1
- package/dist/devtools/useDebugStream.js +6 -2
- package/dist/devtools/useDebugStream.js.map +1 -1
- package/dist/hooks/event-source-provider.cjs +9 -0
- package/dist/hooks/event-source-provider.cjs.map +1 -0
- package/dist/hooks/event-source-provider.d.ts +15 -0
- package/dist/hooks/event-source-provider.d.ts.map +1 -0
- package/dist/hooks/event-source-provider.js +9 -0
- package/dist/hooks/event-source-provider.js.map +1 -0
- package/dist/hooks/event-source.cjs +11 -0
- package/dist/hooks/event-source.cjs.map +1 -0
- package/dist/hooks/event-source.d.ts +22 -0
- package/dist/hooks/event-source.d.ts.map +1 -0
- package/dist/hooks/event-source.js +11 -0
- package/dist/hooks/event-source.js.map +1 -0
- package/dist/hooks/use-log-tail.cjs +5 -1
- package/dist/hooks/use-log-tail.cjs.map +1 -1
- package/dist/hooks/use-log-tail.d.ts.map +1 -1
- package/dist/hooks/use-log-tail.js +5 -1
- package/dist/hooks/use-log-tail.js.map +1 -1
- package/dist/hooks/use-prompts.cjs +5 -1
- package/dist/hooks/use-prompts.cjs.map +1 -1
- package/dist/hooks/use-prompts.d.ts.map +1 -1
- package/dist/hooks/use-prompts.js +6 -2
- package/dist/hooks/use-prompts.js.map +1 -1
- package/dist/hooks/use-task-run.cjs +9 -2
- package/dist/hooks/use-task-run.cjs.map +1 -1
- package/dist/hooks/use-task-run.d.ts.map +1 -1
- package/dist/hooks/use-task-run.js +10 -3
- package/dist/hooks/use-task-run.js.map +1 -1
- package/dist/hooks.cjs +4 -0
- package/dist/hooks.cjs.map +1 -1
- package/dist/hooks.d.ts +2 -0
- package/dist/hooks.d.ts.map +1 -1
- package/dist/hooks.js +4 -0
- package/dist/hooks.js.map +1 -1
- package/dist/icons/programmingCatalog.cjs +34 -34
- package/dist/icons/programmingCatalog.cjs.map +1 -1
- package/dist/icons/programmingCatalog.js +34 -34
- package/dist/icons/programmingCatalog.js.map +1 -1
- package/dist/index.cjs +9 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +8 -1
- package/dist/index.js.map +1 -1
- package/dist/monaco/MonacoEditor.cjs +4 -1
- package/dist/monaco/MonacoEditor.cjs.map +1 -1
- package/dist/monaco/MonacoEditor.d.ts +1 -1
- package/dist/monaco/MonacoEditor.d.ts.map +1 -1
- package/dist/monaco/MonacoEditor.js +4 -1
- package/dist/monaco/MonacoEditor.js.map +1 -1
- package/dist/monaco/types.d.ts +2 -1
- package/dist/monaco/types.d.ts.map +1 -1
- package/dist/overlay/CommandPalette.cjs +14 -4
- package/dist/overlay/CommandPalette.cjs.map +1 -1
- package/dist/overlay/CommandPalette.d.ts +5 -1
- package/dist/overlay/CommandPalette.d.ts.map +1 -1
- package/dist/overlay/CommandPalette.js +14 -4
- package/dist/overlay/CommandPalette.js.map +1 -1
- package/dist/overlay/CommandPaletteList.cjs +5 -0
- package/dist/overlay/CommandPaletteList.cjs.map +1 -1
- package/dist/overlay/CommandPaletteList.d.ts +4 -2
- package/dist/overlay/CommandPaletteList.d.ts.map +1 -1
- package/dist/overlay/CommandPaletteList.js +5 -0
- package/dist/overlay/CommandPaletteList.js.map +1 -1
- package/dist/overlay/DropdownMenu.cjs +1 -0
- package/dist/overlay/DropdownMenu.cjs.map +1 -1
- package/dist/overlay/DropdownMenu.js +1 -0
- package/dist/overlay/DropdownMenu.js.map +1 -1
- package/dist/rpc/OperationCatalog.cjs +29 -26
- package/dist/rpc/OperationCatalog.cjs.map +1 -1
- package/dist/rpc/OperationCatalog.d.ts +9 -1
- package/dist/rpc/OperationCatalog.d.ts.map +1 -1
- package/dist/rpc/OperationCatalog.js +29 -26
- package/dist/rpc/OperationCatalog.js.map +1 -1
- package/dist/rpc/OperationEntityContextPicker.cjs +62 -256
- package/dist/rpc/OperationEntityContextPicker.cjs.map +1 -1
- package/dist/rpc/OperationEntityContextPicker.d.ts.map +1 -1
- package/dist/rpc/OperationEntityContextPicker.js +64 -258
- package/dist/rpc/OperationEntityContextPicker.js.map +1 -1
- package/dist/rpc/OperationEntityPicker.cjs +185 -0
- package/dist/rpc/OperationEntityPicker.cjs.map +1 -0
- package/dist/rpc/OperationEntityPicker.d.ts +51 -0
- package/dist/rpc/OperationEntityPicker.d.ts.map +1 -0
- package/dist/rpc/OperationEntityPicker.js +185 -0
- package/dist/rpc/OperationEntityPicker.js.map +1 -0
- package/dist/rpc/OperationEntityPicker.model.cjs +39 -0
- package/dist/rpc/OperationEntityPicker.model.cjs.map +1 -0
- package/dist/rpc/OperationEntityPicker.model.d.ts +27 -0
- package/dist/rpc/OperationEntityPicker.model.d.ts.map +1 -0
- package/dist/rpc/OperationEntityPicker.model.js +39 -0
- package/dist/rpc/OperationEntityPicker.model.js.map +1 -0
- package/dist/rpc/operationCatalogRowSelection.cjs +85 -0
- package/dist/rpc/operationCatalogRowSelection.cjs.map +1 -0
- package/dist/rpc/operationCatalogRowSelection.d.ts +57 -0
- package/dist/rpc/operationCatalogRowSelection.d.ts.map +1 -0
- package/dist/rpc/operationCatalogRowSelection.js +85 -0
- package/dist/rpc/operationCatalogRowSelection.js.map +1 -0
- package/dist/rpc/operationEntityPicker.fixtures.d.ts +13 -0
- package/dist/rpc/operationEntityPicker.fixtures.d.ts.map +1 -0
- package/dist/rpc.cjs +2 -0
- package/dist/rpc.cjs.map +1 -1
- package/dist/rpc.d.ts +2 -0
- package/dist/rpc.d.ts.map +1 -1
- package/dist/rpc.js +2 -0
- package/dist/rpc.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +4 -1
- package/schemas/json-schema-form.schema.json +566 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json-schema-form-resolve.js","sources":["../../src/components/json-schema-form-resolve.ts"],"sourcesContent":["import { createElement, type ReactNode } from \"react\";\nimport type {\n ArrayDisplay,\n EnumDisplay,\n FieldControl,\n FieldOption,\n HelpDisplay,\n JsonSchemaObject,\n JsonSchemaProperty,\n LookupDescriptor,\n ScalarItemType,\n} from \"./json-schema-form-types\";\nimport { isPlainObject } from \"../lib/collections\";\nimport { LabelIcon } from \"../data/Icon\";\nimport { resolveItemSpec } from \"./json-schema-form-item-summary\";\nimport { isFieldTone } from \"./json-schema-form-tone\";\n\n// isOpenStringMap reports whether a property is an object whose entries are\n// described by a sub-schema in `additionalProperties` (a typed key/value map) or\n// by `patternProperties` (a per-key-pattern value map). Either makes it an\n// editable key/value control rather than a fixed-property sub-form.\nexport function isOpenStringMap(prop: JsonSchemaProperty): boolean {\n if (!schemaRendersAsObject(prop)) return false;\n if (\n typeof prop.additionalProperties === \"object\" &&\n prop.additionalProperties !== null\n ) {\n return true;\n }\n return (\n !!prop.patternProperties && Object.keys(prop.patternProperties).length > 0\n );\n}\n\n// patternSchemasOf compiles a schema's `patternProperties` into the ordered\n// {pattern, schema} list the string-map control matches keys against.\nfunction patternSchemasOf(\n prop: JsonSchemaProperty,\n): { pattern: string; schema: JsonSchemaProperty }[] | undefined {\n const pp = prop.patternProperties;\n if (!pp || Object.keys(pp).length === 0) return undefined;\n return Object.entries(pp).map(([pattern, schema]) => ({ pattern, schema }));\n}\n\nfunction schemaHasType(prop: JsonSchemaProperty, type: string): boolean {\n if (Array.isArray(prop.type)) return prop.type.includes(type as never);\n return prop.type === type;\n}\n\n// schemaRendersAsObject accepts schemas that omit `type` but use object-only\n// keywords, including composed schemas whose local refs were rehydrated into\n// unconditional allOf members. An explicit incompatible type always wins.\nexport function schemaRendersAsObject(prop: JsonSchemaProperty): boolean {\n if (schemaHasType(prop, \"object\")) return true;\n if (prop.type !== undefined) return false;\n if (\n prop.properties !== undefined ||\n prop.required !== undefined ||\n prop.additionalProperties !== undefined ||\n prop.patternProperties !== undefined ||\n prop.propertyNames !== undefined ||\n prop.unevaluatedProperties !== undefined\n ) {\n return true;\n }\n return (\n prop.allOf?.some(\n (clause) =>\n clause.if === undefined &&\n clause.then === undefined &&\n schemaRendersAsObject(clause as JsonSchemaProperty),\n ) ?? false\n );\n}\n\nfunction enumOptions(prop: JsonSchemaProperty): FieldOption[] {\n const labels = prop[\"x-enum-labels\"];\n const icons = prop[\"x-enum-icons\"];\n const descriptions = prop[\"x-enum-descriptions\"];\n const tones = prop[\"x-enum-tones\"];\n return (prop.enum ?? []).map((v) => {\n const value = String(v);\n const desc = labels?.[value];\n const icon = icons?.[value];\n const description = descriptions?.[value];\n const tone = tones?.[value];\n return {\n value,\n label:\n typeof desc === \"string\" && desc && desc !== value\n ? `${desc} (${value})`\n : value,\n ...(typeof icon === \"string\" && icon ? { icon } : {}),\n ...(typeof description === \"string\" && description\n ? { description }\n : {}),\n ...(isFieldTone(tone) ? { tone } : {}),\n };\n });\n}\n\n// enumDisplay resolves how an enum should render: an explicit `x-enum-display`\n// wins; otherwise an enum carrying `x-enum-icons` defaults to the icon grid.\n// Returns undefined to keep the combobox default.\nfunction enumDisplay(prop: JsonSchemaProperty): EnumDisplay | undefined {\n const d = prop[\"x-enum-display\"];\n if (d === \"combobox\" || d === \"radio\" || d === \"grid\" || d === \"segmented\")\n return d;\n const icons = prop[\"x-enum-icons\"];\n if (icons && Object.keys(icons).length > 0) return \"grid\";\n return undefined;\n}\n\nfunction arrayDisplay(prop: JsonSchemaProperty): ArrayDisplay | undefined {\n const d = prop[\"x-array-display\"];\n return d === \"filter-pills\" ||\n d === \"accordion\" ||\n d === \"cards\" ||\n d === \"stacked\" ||\n d === \"list\"\n ? d\n : undefined;\n}\n\n// helpDisplay reads the per-field `x-help-display` override. Returns undefined\n// to defer to the form-level FormLayout.help.\nfunction helpDisplay(prop: JsonSchemaProperty): HelpDisplay | undefined {\n const d = prop[\"x-help-display\"];\n return d === \"inline\" || d === \"hover\" ? d : undefined;\n}\n\nexport function schemaHelper(prop: JsonSchemaProperty): string | undefined {\n const description =\n typeof prop.description === \"string\" ? prop.description.trim() : \"\";\n const help = prop[\"x-help\"];\n const helpBody =\n isPlainObject(help) && typeof help.body === \"string\"\n ? help.body.trim()\n : \"\";\n\n if (description && helpBody && helpBody !== description) {\n return `${description} ${helpBody}`;\n }\n return description || helpBody || undefined;\n}\n\n// adornmentNode builds a prefix/suffix node from the x-input-*[-icon] extensions:\n// a runtime icon name wins, else static text. Returns undefined when neither set.\nfunction adornmentNode(iconName: unknown, text: unknown): ReactNode {\n if (typeof iconName === \"string\" && iconName) {\n // Match the library's InputField field-icon convention (16px, muted/70) so a\n // schema-driven field lines up with a hand-built one.\n return createElement(LabelIcon, {\n icon: iconName,\n className: \"size-4 text-muted-foreground/70\",\n });\n }\n if (typeof text === \"string\" && text) {\n return createElement(\n \"span\",\n { className: \"text-sm text-muted-foreground\" },\n text,\n );\n }\n return undefined;\n}\n\n// enumBranch returns the first anyOf/oneOf member carrying a non-empty `enum`,\n// for a union of \"an enum value OR a free-form string\" (e.g. a value-or-token\n// field). It lets such a union render as a dropdown. Returns undefined when no\n// branch enumerates values.\nexport function enumBranch(\n prop: JsonSchemaProperty,\n): JsonSchemaProperty | undefined {\n for (const branch of [...(prop.anyOf ?? []), ...(prop.oneOf ?? [])]) {\n if (Array.isArray(branch.enum) && branch.enum.length > 0) return branch;\n }\n return undefined;\n}\n\n// lookupDescriptor reads the `x-clicky-lookup` extension into a LookupDescriptor,\n// returning undefined when the keyword is absent or lacks its required url/filter.\nfunction lookupDescriptor(\n prop: JsonSchemaProperty,\n): LookupDescriptor | undefined {\n const raw = prop[\"x-clicky-lookup\"];\n if (!raw || typeof raw !== \"object\") return undefined;\n const d = raw as Record<string, unknown>;\n if (typeof d.url !== \"string\" || typeof d.filter !== \"string\")\n return undefined;\n return raw as LookupDescriptor;\n}\n\nexport interface ResolveControlArgs {\n key: string;\n prop: JsonSchemaProperty;\n required: boolean;\n value: unknown;\n onChange: (next: unknown) => void;\n}\n\n// resolveControl infers a base, render-ready FieldControl from a property\n// schema. It keys off schema keywords only — never the field name: ascode/token\n// heuristics are layered on by consumer pre-extensions. The one exception is the\n// standard `format: date`/`date-time` keyword, which is a schema-declared signal\n// (not a name guess) and so drives a date control directly. First match wins.\nexport function resolveControl(args: ResolveControlArgs): FieldControl {\n const { key, prop, required, value, onChange } = args;\n const labelIcon = prop[\"x-icon\"];\n const xLayout = prop[\"x-layout\"];\n const explicitLayout =\n xLayout === \"inline\" || xLayout === \"stack\" || xLayout === \"table\"\n ? xLayout\n : undefined;\n // `x-label-position` is a friendlier alias over the same per-field layout knob:\n // \"top\" stacks the label above the value; \"left\" forces inline. `x-layout` wins.\n const labelPosition = prop[\"x-label-position\"];\n const layout =\n explicitLayout ??\n (labelPosition === \"top\"\n ? \"stack\"\n : labelPosition === \"left\"\n ? \"inline\"\n : undefined);\n const prefix = adornmentNode(\n prop[\"x-input-prefix-icon\"],\n prop[\"x-input-prefix\"],\n );\n const suffix = adornmentNode(\n prop[\"x-input-suffix-icon\"],\n prop[\"x-input-suffix\"],\n );\n const labelClassName =\n typeof prop[\"x-label-classes\"] === \"string\"\n ? prop[\"x-label-classes\"]\n : undefined;\n const inputClassName =\n typeof prop[\"x-input-classes\"] === \"string\"\n ? prop[\"x-input-classes\"]\n : undefined;\n const colSpan =\n prop[\"x-col-span\"] === \"full\"\n ? (\"full\" as const)\n : typeof prop[\"x-col-span\"] === \"number\" &&\n Number.isFinite(prop[\"x-col-span\"])\n ? prop[\"x-col-span\"]\n : undefined;\n const keyOptions = keyOptionsFor(prop);\n const helper = schemaHelper(prop);\n const helpMode = helpDisplay(prop);\n const base: FieldControl = {\n key,\n kind: \"string\",\n // An explicit empty title is a field saying it needs no label of its own —\n // its host already named it. Only a MISSING title falls back to the key.\n label: typeof prop.title === \"string\" ? prop.title : key,\n required,\n schema: prop,\n value,\n onChange,\n ...(prop.readOnly === true ? { readOnly: true } : {}),\n ...(typeof prop.description === \"string\"\n ? { description: prop.description }\n : {}),\n ...(helper ? { helper } : {}),\n ...(helpMode ? { helpDisplay: helpMode } : {}),\n ...(labelIcon != null && labelIcon !== \"\"\n ? { labelIcon: labelIcon as FieldControl[\"labelIcon\"] }\n : {}),\n ...(layout ? { layout } : {}),\n ...(prefix ? { prefix } : {}),\n ...(suffix ? { suffix } : {}),\n ...(labelClassName ? { labelClassName } : {}),\n ...(inputClassName ? { inputClassName } : {}),\n ...(colSpan != null ? { colSpan } : {}),\n };\n\n // An `x-clicky-lookup` field is an async entity-reference picker: options load\n // lazily from another entity's list endpoint. Single-select also allows\n // free-form entry so a typed value outside the option set still commits.\n const lookup = lookupDescriptor(prop);\n if (lookup) {\n return {\n ...base,\n kind: \"lookup\",\n lookup,\n options: [],\n allowCustomValue: lookup.multi !== true,\n };\n }\n if (Array.isArray(prop.enum) && prop.enum.length > 0) {\n const display = enumDisplay(prop);\n return {\n ...base,\n kind: \"enum\",\n options: enumOptions(prop),\n ...(display ? { display } : {}),\n };\n }\n // A value-or-template union: the enum lives in an anyOf/oneOf branch alongside\n // free-form branches. Render it as a dropdown using that branch's enum; the\n // free-form branches are honoured via a consumer's allowCustomValue pre-ext.\n const branch = enumBranch(prop);\n if (branch) {\n return { ...base, kind: \"enum\", options: enumOptions(branch) };\n }\n const templateBranch = prop.anyOf?.find((part) => part.type === \"string\" && typeof part.pattern === \"string\");\n if (prop.anyOf?.length === 2 && templateBranch) {\n const nativeBranch = prop.anyOf.find((part) => part !== templateBranch);\n if (nativeBranch && (nativeBranch.type === \"number\" || nativeBranch.type === \"integer\" || nativeBranch.type === \"boolean\" || nativeBranch.format === \"date\" || nativeBranch.format === \"date-time\")) {\n const nativeSchema = { ...prop, ...nativeBranch };\n delete nativeSchema.anyOf;\n return resolveControl({ ...args, prop: nativeSchema });\n }\n }\n // A schema-declared date/date-time string renders as a date control.\n if (prop.format === \"date\" || prop.format === \"date-time\") {\n return { ...base, kind: \"date\", dateFormat: prop.format };\n }\n // A long-form string declares `format: textarea` to render a multi-line box.\n if (prop.format === \"textarea\" && schemaHasType(prop, \"string\")) {\n return { ...base, kind: \"textarea\" };\n }\n // A markdown string declares `format: md` to render the MDXEditor-backed\n // editor. Plugin toggles live under `x-md-editor` so schema authors can keep\n // the format signal standard-sized and the editor behavior explicit.\n if (prop.format === \"md\" && schemaHasType(prop, \"string\")) {\n const markdownOptions = prop[\"x-md-editor\"];\n return {\n ...base,\n kind: \"markdown\",\n ...(isPlainObject(markdownOptions) ? { markdownOptions } : {}),\n };\n }\n if (schemaHasType(prop, \"boolean\")) {\n return { ...base, kind: \"boolean\" };\n }\n if (schemaHasType(prop, \"integer\") || schemaHasType(prop, \"number\")) {\n return {\n ...base,\n kind: \"number\",\n coerceNumber: true,\n // A percent number carries a static \"%\" unit shown inside the input.\n ...(prop.format === \"percent\" ? { unit: \"%\" } : {}),\n ...(typeof prop.minimum === \"number\" ? { minimum: prop.minimum } : {}),\n };\n }\n if (schemaHasType(prop, \"array\")) {\n const display = arrayDisplay(prop);\n const itemSchema = prop.items;\n return {\n ...base,\n kind: \"array\",\n ...(itemSchema ? { itemSchema } : {}),\n ...(typeof prop.minItems === \"number\" ? { minItems: prop.minItems } : {}),\n ...(typeof prop.maxItems === \"number\" ? { maxItems: prop.maxItems } : {}),\n ...(display ? { arrayDisplay: display } : {}),\n ...(display === \"accordion\" ? { itemSpec: resolveItemSpec(prop, itemSchema) } : {}),\n // An accordion reuses the array's description as the zero-item copy in its\n // add row, so a paragraph of the same sentence directly above would be a\n // literal duplicate. The schema can still say otherwise.\n ...(display === \"accordion\" && !helpMode ? { helpDisplay: \"hover\" as const } : {}),\n // An enum item schema makes the whole array a list of choices, whichever\n // display renders it (tags by default, filter pills on request), so the\n // options — labels, icons, tones and all — always resolve.\n ...(itemSchema && Array.isArray(itemSchema.enum)\n ? { options: enumOptions(itemSchema) }\n : {}),\n ...(layout ? { layout } : {}),\n };\n }\n // An open map: object whose entries are described by an additionalProperties\n // sub-schema and/or per-key patternProperties. Renders as editable key/value\n // rows (+ any known properties), with the value form resolved per key.\n if (isOpenStringMap(prop)) {\n const addl =\n typeof prop.additionalProperties === \"object\" &&\n prop.additionalProperties !== null\n ? (prop.additionalProperties as JsonSchemaProperty)\n : undefined;\n const patterns = patternSchemasOf(prop);\n // A constrained picker (propertyNames enum) or patternProperties still lets\n // the author ADD keys — the additions are limited to the allowed set, not\n // free-form — so `additionalProperties: false` doesn't disable \"Add field\"\n // in that case. It only closes a plain open map with no key constraints.\n const allowExtraKeys =\n keyOptions || patterns ? true : prop.additionalProperties !== false;\n return {\n ...base,\n kind: \"string-map\",\n ...(addl ? { valueSchema: addl } : {}),\n ...(patterns ? { valuePatternSchemas: patterns } : {}),\n ...(prop.properties ? { knownProperties: prop.properties } : {}),\n allowExtraKeys,\n ...(keyOptions ? { keyOptions } : {}),\n ...(layout ? { layout } : {}),\n };\n }\n // A structured object: fixed `properties`, not an open map. Renders as a\n // nested sub-form (labels, required, if/then) — recursed into by the renderer.\n if (schemaRendersAsObject(prop)) {\n const valueObject = isPlainObject(value) ? value : {};\n const objectFields = effectiveProperties(\n prop as JsonSchemaObject,\n valueObject,\n );\n if (Object.keys(objectFields.properties).length > 0 || prop.properties) {\n return {\n ...base,\n kind: \"object\",\n objectProperties: objectFields.properties,\n ...(objectFields.required.length > 0\n ? { objectRequired: objectFields.required }\n : {}),\n ...(layout ? { layout } : {}),\n };\n }\n }\n // A bare object with neither properties nor an additionalProperties schema:\n // treat as an open string map unless explicitly closed.\n if (schemaRendersAsObject(prop)) {\n return {\n ...base,\n kind: \"string-map\",\n allowExtraKeys: prop.additionalProperties !== false,\n ...(keyOptions ? { keyOptions } : {}),\n ...(layout ? { layout } : {}),\n };\n }\n return base;\n}\n\n// keyOptionsFor resolves the strict map-key picker options from a map schema's\n// `propertyNames.enum` (e.g. an AsCode-constrained key set). Returns undefined\n// when the keys are unconstrained, so the key stays free-text.\nfunction keyOptionsFor(prop: JsonSchemaProperty): FieldOption[] | undefined {\n const pn = prop.propertyNames as JsonSchemaProperty | undefined;\n if (!pn || !Array.isArray(pn.enum) || pn.enum.length === 0) return undefined;\n return enumOptions(pn);\n}\n\n// scalarItemsType returns the scalar type an array's items hold — the case the\n// array renders as ONE tag list rather than a control per item — or undefined\n// when the items need a real per-item control. Anything carrying an\n// enum/const/properties/items/additionalProperties/allOf has a richer shape (an\n// enum array is a list of choices, and takes the option-backed branch instead).\nexport function scalarItemsType(\n items: JsonSchemaProperty | undefined,\n): ScalarItemType | undefined {\n if (!items) return \"string\"; // untyped items default to string tags\n if (\n items.enum !== undefined ||\n items.const !== undefined ||\n items.properties !== undefined ||\n items.items !== undefined ||\n items.additionalProperties !== undefined ||\n items.allOf !== undefined\n ) {\n return undefined;\n }\n if (items.type === undefined || schemaHasType(items, \"string\")) return \"string\";\n if (schemaHasType(items, \"integer\")) return \"integer\";\n if (schemaHasType(items, \"number\")) return \"number\";\n return undefined;\n}\n\n// matchesIf reports whether the `if` sub-schema holds for the current value:\n// every `if.required` key is present AND every `if.properties[k].const` equals\n// value[k].\nexport function matchesIf(\n ifSchema: JsonSchemaProperty | undefined,\n value: Record<string, unknown>,\n): boolean {\n if (!ifSchema) return false;\n for (const k of ifSchema.required ?? []) {\n if (!(k in value)) return false;\n }\n for (const [k, sub] of Object.entries(ifSchema.properties ?? {})) {\n if (\"const\" in sub && value[k] !== sub.const) return false;\n }\n return true;\n}\n\nexport interface EffectiveProperties {\n properties: Record<string, JsonSchemaProperty>;\n required: string[];\n}\n\n// applySchemaDefaults fills missing values from JSON Schema `default` keywords.\n// It walks fixed object properties recursively and re-evaluates `if`/`then`\n// branches after each pass, so a defaulted discriminator can activate defaults\n// in its selected branch. Existing values, including null and empty strings, are\n// never replaced. The original value is returned when no defaults apply.\nexport function applySchemaDefaults(\n schema: JsonSchemaObject,\n value: Record<string, unknown>,\n): Record<string, unknown> {\n return applyObjectDefaults(schema, value, new Set());\n}\n\nfunction applyObjectDefaults(\n schema: JsonSchemaObject,\n value: Record<string, unknown>,\n ancestors: Set<JsonSchemaObject>,\n): Record<string, unknown> {\n // Recursive schemas may point back to an ancestor after refs are hydrated.\n if (ancestors.has(schema)) return value;\n const nextAncestors = new Set(ancestors).add(schema);\n let next = value;\n\n // A default can select another conditional branch, so allow enough passes for\n // a chain of discriminator defaults while keeping malformed schemas bounded.\n const maxPasses = Math.min(\n 100,\n Object.keys(schema.properties ?? {}).length +\n (schema.allOf?.length ?? 0) +\n 2,\n );\n for (let pass = 0; pass < maxPasses; pass += 1) {\n const { properties } = effectiveProperties(schema, next);\n let passChanged = false;\n let passValue = next;\n\n for (const [key, propertySchema] of Object.entries(properties)) {\n const existing = passValue[key];\n let fieldValue = existing;\n let fieldChanged = false;\n\n if (existing === undefined && propertySchema.default !== undefined) {\n fieldValue = cloneSchemaDefault(propertySchema.default);\n fieldChanged = true;\n }\n\n const structuredObject = schemaRendersAsObject(propertySchema);\n if (structuredObject && !isOpenStringMap(propertySchema)) {\n const objectValue = isPlainObject(fieldValue)\n ? (fieldValue as Record<string, unknown>)\n : {};\n const defaultedObject = applyObjectDefaults(\n propertySchema as JsonSchemaObject,\n objectValue,\n nextAncestors,\n );\n if (defaultedObject !== objectValue) {\n fieldValue = defaultedObject;\n fieldChanged = true;\n }\n }\n\n if (fieldChanged) {\n if (!passChanged) passValue = { ...next };\n passValue[key] = fieldValue;\n passChanged = true;\n }\n }\n\n if (!passChanged) break;\n next = passValue;\n }\n return next;\n}\n\nfunction cloneSchemaDefault(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(cloneSchemaDefault);\n if (isPlainObject(value)) {\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>).map(([key, entry]) => [\n key,\n cloneSchemaDefault(entry),\n ]),\n );\n }\n return value;\n}\n\n// effectiveProperties merges the schema's base `properties` with each `allOf`\n// member's contribution. An `if`/`then` member contributes `then.properties`\n// only when its `if` matches the current value; an unconditional member (e.g.\n// an inlined `$ref` composition, which carries its own `properties` and no\n// `if`) always contributes. Later members win on key collision; required is the\n// union. Pure and idempotent.\nexport function effectiveProperties(\n schema: JsonSchemaObject,\n value: Record<string, unknown>,\n): EffectiveProperties {\n const properties: Record<string, JsonSchemaProperty> = {\n ...schema.properties,\n };\n const required = new Set(schema.required ?? []);\n for (const clause of schema.allOf ?? []) {\n // Unconditional composition member: merge its own properties/required.\n if (clause.if === undefined && clause.then === undefined) {\n for (const [k, sub] of Object.entries(clause.properties ?? {})) {\n properties[k] = sub;\n }\n for (const k of clause.required ?? []) required.add(k);\n continue;\n }\n if (!matchesIf(clause.if, value)) continue;\n const then = clause.then ?? {};\n for (const [k, sub] of Object.entries(then.properties ?? {})) {\n properties[k] = sub;\n }\n for (const k of then.required ?? []) required.add(k);\n }\n return { properties, required: [...required] };\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"json-schema-form-resolve.js","sources":["../../src/components/json-schema-form-resolve.ts"],"sourcesContent":["import { createElement, type ReactNode } from \"react\";\nimport type {\n ArrayDisplay,\n EnumDisplay,\n FieldControl,\n FieldOption,\n HelpDisplay,\n JsonSchemaObject,\n JsonSchemaProperty,\n LookupDescriptor,\n ScalarItemType,\n} from \"./json-schema-form-types\";\nimport { isPlainObject } from \"../lib/collections\";\nimport { effectiveProperties } from \"./json-schema-form-conditionals\";\nimport { LabelIcon } from \"../data/Icon\";\nimport { resolveItemSpec } from \"./json-schema-form-item-summary\";\nimport { isFieldTone } from \"./json-schema-form-tone\";\n\n// isOpenStringMap reports whether a property is an object whose entries are\n// described by a sub-schema in `additionalProperties` (a typed key/value map) or\n// by `patternProperties` (a per-key-pattern value map). Either makes it an\n// editable key/value control rather than a fixed-property sub-form.\nexport function isOpenStringMap(prop: JsonSchemaProperty): boolean {\n if (!schemaRendersAsObject(prop)) return false;\n if (\n typeof prop.additionalProperties === \"object\" &&\n prop.additionalProperties !== null\n ) {\n return true;\n }\n return (\n !!prop.patternProperties && Object.keys(prop.patternProperties).length > 0\n );\n}\n\n// patternSchemasOf compiles a schema's `patternProperties` into the ordered\n// {pattern, schema} list the string-map control matches keys against.\nfunction patternSchemasOf(\n prop: JsonSchemaProperty,\n): { pattern: string; schema: JsonSchemaProperty }[] | undefined {\n const pp = prop.patternProperties;\n if (!pp || Object.keys(pp).length === 0) return undefined;\n return Object.entries(pp).map(([pattern, schema]) => ({ pattern, schema }));\n}\n\nfunction schemaHasType(prop: JsonSchemaProperty, type: string): boolean {\n if (Array.isArray(prop.type)) return prop.type.includes(type as never);\n return prop.type === type;\n}\n\n// schemaRendersAsObject accepts schemas that omit `type` but use object-only\n// keywords, including composed schemas whose local refs were rehydrated into\n// unconditional allOf members. An explicit incompatible type always wins.\nexport function schemaRendersAsObject(prop: JsonSchemaProperty): boolean {\n if (schemaHasType(prop, \"object\")) return true;\n if (prop.type !== undefined) return false;\n if (\n prop.properties !== undefined ||\n prop.required !== undefined ||\n prop.additionalProperties !== undefined ||\n prop.patternProperties !== undefined ||\n prop.propertyNames !== undefined ||\n prop.unevaluatedProperties !== undefined\n ) {\n return true;\n }\n return (\n prop.allOf?.some(\n (clause) =>\n clause.if === undefined &&\n clause.then === undefined &&\n schemaRendersAsObject(clause as JsonSchemaProperty),\n ) ?? false\n );\n}\n\nfunction enumOptions(prop: JsonSchemaProperty): FieldOption[] {\n const labels = prop[\"x-enum-labels\"];\n const icons = prop[\"x-enum-icons\"];\n const descriptions = prop[\"x-enum-descriptions\"];\n const tones = prop[\"x-enum-tones\"];\n return (prop.enum ?? []).map((v) => {\n const value = String(v);\n const desc = labels?.[value];\n const icon = icons?.[value];\n const description = descriptions?.[value];\n const tone = tones?.[value];\n return {\n value,\n label:\n typeof desc === \"string\" && desc && desc !== value\n ? `${desc} (${value})`\n : value,\n ...(typeof icon === \"string\" && icon ? { icon } : {}),\n ...(typeof description === \"string\" && description\n ? { description }\n : {}),\n ...(isFieldTone(tone) ? { tone } : {}),\n };\n });\n}\n\n// enumDisplay resolves how an enum should render: an explicit `x-enum-display`\n// wins; otherwise an enum carrying `x-enum-icons` defaults to the icon grid.\n// Returns undefined to keep the combobox default.\nfunction enumDisplay(prop: JsonSchemaProperty): EnumDisplay | undefined {\n const d = prop[\"x-enum-display\"];\n if (d === \"combobox\" || d === \"radio\" || d === \"grid\" || d === \"segmented\")\n return d;\n const icons = prop[\"x-enum-icons\"];\n if (icons && Object.keys(icons).length > 0) return \"grid\";\n return undefined;\n}\n\nfunction arrayDisplay(prop: JsonSchemaProperty): ArrayDisplay | undefined {\n const d = prop[\"x-array-display\"];\n return d === \"filter-pills\" ||\n d === \"accordion\" ||\n d === \"cards\" ||\n d === \"stacked\" ||\n d === \"list\"\n ? d\n : undefined;\n}\n\n// helpDisplay reads the per-field `x-help-display` override. Returns undefined\n// to defer to the form-level FormLayout.help.\nfunction helpDisplay(prop: JsonSchemaProperty): HelpDisplay | undefined {\n const d = prop[\"x-help-display\"];\n return d === \"inline\" || d === \"hover\" ? d : undefined;\n}\n\nexport function schemaHelper(prop: JsonSchemaProperty): string | undefined {\n const description =\n typeof prop.description === \"string\" ? prop.description.trim() : \"\";\n const help = prop[\"x-help\"];\n const helpBody =\n isPlainObject(help) && typeof help.body === \"string\"\n ? help.body.trim()\n : \"\";\n\n if (description && helpBody && helpBody !== description) {\n return `${description} ${helpBody}`;\n }\n return description || helpBody || undefined;\n}\n\n// adornmentNode builds a prefix/suffix node from the x-input-*[-icon] extensions:\n// a runtime icon name wins, else static text. Returns undefined when neither set.\nfunction adornmentNode(iconName: unknown, text: unknown): ReactNode {\n if (typeof iconName === \"string\" && iconName) {\n // Match the library's InputField field-icon convention (16px, muted/70) so a\n // schema-driven field lines up with a hand-built one.\n return createElement(LabelIcon, {\n icon: iconName,\n className: \"size-4 text-muted-foreground/70\",\n });\n }\n if (typeof text === \"string\" && text) {\n return createElement(\n \"span\",\n { className: \"text-sm text-muted-foreground\" },\n text,\n );\n }\n return undefined;\n}\n\n// enumBranch returns the first anyOf/oneOf member carrying a non-empty `enum`,\n// for a union of \"an enum value OR a free-form string\" (e.g. a value-or-token\n// field). It lets such a union render as a dropdown. Returns undefined when no\n// branch enumerates values.\nexport function enumBranch(\n prop: JsonSchemaProperty,\n): JsonSchemaProperty | undefined {\n for (const branch of [...(prop.anyOf ?? []), ...(prop.oneOf ?? [])]) {\n if (Array.isArray(branch.enum) && branch.enum.length > 0) return branch;\n }\n return undefined;\n}\n\n// lookupDescriptor reads the `x-clicky-lookup` extension into a LookupDescriptor,\n// returning undefined when the keyword is absent or lacks its required url/filter.\nfunction lookupDescriptor(\n prop: JsonSchemaProperty,\n): LookupDescriptor | undefined {\n const raw: unknown = prop[\"x-clicky-lookup\"];\n if (!isPlainObject(raw)) return undefined;\n if (typeof raw.url !== \"string\" || typeof raw.filter !== \"string\")\n return undefined;\n return raw as unknown as LookupDescriptor;\n}\n\nexport interface ResolveControlArgs {\n key: string;\n prop: JsonSchemaProperty;\n required: boolean;\n value: unknown;\n onChange: (next: unknown) => void;\n}\n\n// resolveControl infers a base, render-ready FieldControl from a property\n// schema. It keys off schema keywords only — never the field name: ascode/token\n// heuristics are layered on by consumer pre-extensions. The one exception is the\n// standard `format: date`/`date-time` keyword, which is a schema-declared signal\n// (not a name guess) and so drives a date control directly. First match wins.\nexport function resolveControl(args: ResolveControlArgs): FieldControl {\n const { key, prop, required, value, onChange } = args;\n const labelIcon = prop[\"x-icon\"];\n const xLayout = prop[\"x-layout\"];\n const explicitLayout =\n xLayout === \"inline\" || xLayout === \"stack\" || xLayout === \"table\"\n ? xLayout\n : undefined;\n // `x-label-position` is a friendlier alias over the same per-field layout knob:\n // \"top\" stacks the label above the value; \"left\" forces inline. `x-layout` wins.\n const labelPosition = prop[\"x-label-position\"];\n const layout =\n explicitLayout ??\n (labelPosition === \"top\"\n ? \"stack\"\n : labelPosition === \"left\"\n ? \"inline\"\n : undefined);\n const prefix = adornmentNode(\n prop[\"x-input-prefix-icon\"],\n prop[\"x-input-prefix\"],\n );\n const suffix = adornmentNode(\n prop[\"x-input-suffix-icon\"],\n prop[\"x-input-suffix\"],\n );\n const labelClassName =\n typeof prop[\"x-label-classes\"] === \"string\"\n ? prop[\"x-label-classes\"]\n : undefined;\n const inputClassName =\n typeof prop[\"x-input-classes\"] === \"string\"\n ? prop[\"x-input-classes\"]\n : undefined;\n const colSpan =\n prop[\"x-col-span\"] === \"full\"\n ? (\"full\" as const)\n : typeof prop[\"x-col-span\"] === \"number\" &&\n Number.isFinite(prop[\"x-col-span\"])\n ? prop[\"x-col-span\"]\n : undefined;\n const keyOptions = keyOptionsFor(prop);\n const helper = schemaHelper(prop);\n const helpMode = helpDisplay(prop);\n const base: FieldControl = {\n key,\n kind: \"string\",\n // An explicit empty title is a field saying it needs no label of its own —\n // its host already named it. Only a MISSING title falls back to the key.\n label: typeof prop.title === \"string\" ? prop.title : key,\n required,\n schema: prop,\n value,\n onChange,\n ...(prop.readOnly === true ? { readOnly: true } : {}),\n ...(prop.writeOnly === true ? { writeOnly: true } : {}),\n ...(prop[\"x-disabled\"] === true ? { disabled: true } : {}),\n ...(typeof prop.description === \"string\"\n ? { description: prop.description }\n : {}),\n ...(helper ? { helper } : {}),\n ...(helpMode ? { helpDisplay: helpMode } : {}),\n ...(labelIcon != null && labelIcon !== \"\"\n ? { labelIcon: labelIcon as FieldControl[\"labelIcon\"] }\n : {}),\n ...(layout ? { layout } : {}),\n ...(prefix ? { prefix } : {}),\n ...(suffix ? { suffix } : {}),\n ...(labelClassName ? { labelClassName } : {}),\n ...(inputClassName ? { inputClassName } : {}),\n ...(colSpan != null ? { colSpan } : {}),\n };\n\n // An `x-clicky-lookup` field is an async entity-reference picker: options load\n // lazily from another entity's list endpoint. Single-select also allows\n // free-form entry so a typed value outside the option set still commits.\n const lookup = lookupDescriptor(prop);\n if (lookup) {\n return {\n ...base,\n kind: \"lookup\",\n lookup,\n options: [],\n allowCustomValue: lookup.multi !== true,\n };\n }\n if (Array.isArray(prop.enum) && prop.enum.length > 0) {\n const display = enumDisplay(prop);\n return {\n ...base,\n kind: \"enum\",\n options: enumOptions(prop),\n ...(display ? { display } : {}),\n };\n }\n // A value-or-template union: the enum lives in an anyOf/oneOf branch alongside\n // free-form branches. Render it as a dropdown using that branch's enum; the\n // free-form branches are honoured via a consumer's allowCustomValue pre-ext.\n const branch = enumBranch(prop);\n if (branch) {\n return { ...base, kind: \"enum\", options: enumOptions(branch) };\n }\n const templateBranch = prop.anyOf?.find((part) => part.type === \"string\" && typeof part.pattern === \"string\");\n if (prop.anyOf?.length === 2 && templateBranch) {\n const nativeBranch = prop.anyOf.find((part) => part !== templateBranch);\n if (nativeBranch && (nativeBranch.type === \"number\" || nativeBranch.type === \"integer\" || nativeBranch.type === \"boolean\" || nativeBranch.format === \"date\" || nativeBranch.format === \"date-time\")) {\n const nativeSchema = { ...prop, ...nativeBranch };\n delete nativeSchema.anyOf;\n return resolveControl({ ...args, prop: nativeSchema });\n }\n }\n // A schema-declared date/date-time string renders as a date control.\n if (prop.format === \"date\" || prop.format === \"date-time\") {\n return { ...base, kind: \"date\", dateFormat: prop.format };\n }\n // A long-form string declares `format: textarea` to render a multi-line box.\n if (prop.format === \"textarea\" && schemaHasType(prop, \"string\")) {\n return { ...base, kind: \"textarea\" };\n }\n // A markdown string declares `format: md` to render the MDXEditor-backed\n // editor. Plugin toggles live under `x-md-editor` so schema authors can keep\n // the format signal standard-sized and the editor behavior explicit.\n if (prop.format === \"md\" && schemaHasType(prop, \"string\")) {\n const markdownOptions = prop[\"x-md-editor\"];\n return {\n ...base,\n kind: \"markdown\",\n ...(isPlainObject(markdownOptions) ? { markdownOptions } : {}),\n };\n }\n if (schemaHasType(prop, \"boolean\")) {\n return { ...base, kind: \"boolean\" };\n }\n if (schemaHasType(prop, \"integer\") || schemaHasType(prop, \"number\")) {\n return {\n ...base,\n kind: \"number\",\n coerceNumber: true,\n // A percent number carries a static \"%\" unit shown inside the input.\n ...(prop.format === \"percent\" ? { unit: \"%\" } : {}),\n ...(typeof prop.minimum === \"number\" ? { minimum: prop.minimum } : {}),\n };\n }\n if (schemaHasType(prop, \"array\")) {\n const display = arrayDisplay(prop);\n const itemSchema = prop.items;\n return {\n ...base,\n kind: \"array\",\n ...(itemSchema ? { itemSchema } : {}),\n ...(typeof prop.minItems === \"number\" ? { minItems: prop.minItems } : {}),\n ...(typeof prop.maxItems === \"number\" ? { maxItems: prop.maxItems } : {}),\n ...(display ? { arrayDisplay: display } : {}),\n ...(display === \"accordion\" ? { itemSpec: resolveItemSpec(prop, itemSchema) } : {}),\n // An accordion reuses the array's description as the zero-item copy in its\n // add row, so a paragraph of the same sentence directly above would be a\n // literal duplicate. The schema can still say otherwise.\n ...(display === \"accordion\" && !helpMode ? { helpDisplay: \"hover\" as const } : {}),\n // An enum item schema makes the whole array a list of choices, whichever\n // display renders it (tags by default, filter pills on request), so the\n // options — labels, icons, tones and all — always resolve.\n ...(itemSchema && Array.isArray(itemSchema.enum)\n ? { options: enumOptions(itemSchema) }\n : {}),\n ...(layout ? { layout } : {}),\n };\n }\n // An open map: object whose entries are described by an additionalProperties\n // sub-schema and/or per-key patternProperties. Renders as editable key/value\n // rows (+ any known properties), with the value form resolved per key.\n if (isOpenStringMap(prop)) {\n const addl =\n typeof prop.additionalProperties === \"object\" &&\n prop.additionalProperties !== null\n ? (prop.additionalProperties as JsonSchemaProperty)\n : undefined;\n const patterns = patternSchemasOf(prop);\n // A constrained picker (propertyNames enum) or patternProperties still lets\n // the author ADD keys — the additions are limited to the allowed set, not\n // free-form — so `additionalProperties: false` doesn't disable \"Add field\"\n // in that case. It only closes a plain open map with no key constraints.\n const allowExtraKeys =\n keyOptions || patterns ? true : prop.additionalProperties !== false;\n return {\n ...base,\n kind: \"string-map\",\n ...(addl ? { valueSchema: addl } : {}),\n ...(patterns ? { valuePatternSchemas: patterns } : {}),\n ...(prop.properties ? { knownProperties: prop.properties } : {}),\n allowExtraKeys,\n ...(keyOptions ? { keyOptions } : {}),\n ...(layout ? { layout } : {}),\n };\n }\n // A structured object: fixed `properties`, not an open map. Renders as a\n // nested sub-form (labels, required, if/then) — recursed into by the renderer.\n if (schemaRendersAsObject(prop)) {\n const valueObject = isPlainObject(value) ? value : {};\n const objectFields = effectiveProperties(\n prop as JsonSchemaObject,\n valueObject,\n );\n if (Object.keys(objectFields.properties).length > 0 || prop.properties) {\n return {\n ...base,\n kind: \"object\",\n objectProperties: objectFields.properties,\n ...(objectFields.required.length > 0\n ? { objectRequired: objectFields.required }\n : {}),\n ...(layout ? { layout } : {}),\n };\n }\n }\n // A bare object with neither properties nor an additionalProperties schema:\n // treat as an open string map unless explicitly closed.\n if (schemaRendersAsObject(prop)) {\n return {\n ...base,\n kind: \"string-map\",\n allowExtraKeys: prop.additionalProperties !== false,\n ...(keyOptions ? { keyOptions } : {}),\n ...(layout ? { layout } : {}),\n };\n }\n return base;\n}\n\n// keyOptionsFor resolves the strict map-key picker options from a map schema's\n// `propertyNames.enum` (e.g. an AsCode-constrained key set). Returns undefined\n// when the keys are unconstrained, so the key stays free-text.\nfunction keyOptionsFor(prop: JsonSchemaProperty): FieldOption[] | undefined {\n const pn = prop.propertyNames as JsonSchemaProperty | undefined;\n if (!pn || !Array.isArray(pn.enum) || pn.enum.length === 0) return undefined;\n return enumOptions(pn);\n}\n\n// scalarItemsType returns the scalar type an array's items hold — the case the\n// array renders as ONE tag list rather than a control per item — or undefined\n// when the items need a real per-item control. Anything carrying an\n// enum/const/properties/items/additionalProperties/allOf has a richer shape (an\n// enum array is a list of choices, and takes the option-backed branch instead).\nexport function scalarItemsType(\n items: JsonSchemaProperty | undefined,\n): ScalarItemType | undefined {\n if (!items) return \"string\"; // untyped items default to string tags\n if (\n items.enum !== undefined ||\n items.const !== undefined ||\n items.properties !== undefined ||\n items.items !== undefined ||\n items.additionalProperties !== undefined ||\n items.allOf !== undefined\n ) {\n return undefined;\n }\n if (items.type === undefined || schemaHasType(items, \"string\")) return \"string\";\n if (schemaHasType(items, \"integer\")) return \"integer\";\n if (schemaHasType(items, \"number\")) return \"number\";\n return undefined;\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -25,6 +25,13 @@ export type LookupFetcher = (args: {
|
|
|
25
25
|
query: string;
|
|
26
26
|
rootValue?: Record<string, unknown>;
|
|
27
27
|
}) => Promise<FieldOption[]>;
|
|
28
|
+
export type ExpressionEvaluator = (args: {
|
|
29
|
+
expr: string;
|
|
30
|
+
key: string;
|
|
31
|
+
value: unknown;
|
|
32
|
+
self: Record<string, unknown>;
|
|
33
|
+
root: Record<string, unknown>;
|
|
34
|
+
}) => boolean;
|
|
28
35
|
export interface PreExtensionContext {
|
|
29
36
|
key: string;
|
|
30
37
|
prop: JsonSchemaProperty;
|
|
@@ -74,6 +81,7 @@ export interface RenderApi {
|
|
|
74
81
|
}
|
|
75
82
|
export interface RenderContext extends FormErrorContext {
|
|
76
83
|
readOnly: boolean;
|
|
84
|
+
viewOnly: boolean;
|
|
77
85
|
/** Render value content only, including descendants of a properties preview. */
|
|
78
86
|
presentation?: boolean;
|
|
79
87
|
hideReadOnlyFields: boolean;
|
|
@@ -88,6 +96,7 @@ export interface RenderContext extends FormErrorContext {
|
|
|
88
96
|
post: PostExtension[];
|
|
89
97
|
rootValue?: Record<string, unknown>;
|
|
90
98
|
onRootChange?: (next: Record<string, unknown>) => void;
|
|
99
|
+
expressionEvaluator?: ExpressionEvaluator;
|
|
91
100
|
depth: number;
|
|
92
101
|
render: RenderApi;
|
|
93
102
|
}
|
|
@@ -198,6 +207,12 @@ export interface JsonSchemaFormProps extends FormErrorProps {
|
|
|
198
207
|
* Hosts typically build it from the operations api client's lookup endpoint.
|
|
199
208
|
*/
|
|
200
209
|
lookupFetcher?: LookupFetcher;
|
|
210
|
+
/**
|
|
211
|
+
* Evaluates the `when.expr` of `x-on-change` listeners. The form has no
|
|
212
|
+
* built-in expression language; a schema that uses `expr` without this prop
|
|
213
|
+
* fails loudly instead of guessing.
|
|
214
|
+
*/
|
|
215
|
+
expressionEvaluator?: ExpressionEvaluator;
|
|
201
216
|
/**
|
|
202
217
|
* Show the top-right three-dot display-options menu (size, layout, and sort).
|
|
203
218
|
* Defaults to true. The menu controls only this form's appearance — never
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json-schema-form-runtime-types.d.ts","sourceRoot":"","sources":["../../src/components/json-schema-form-runtime-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EACV,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EACf,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,KAAK,EACV,YAAY,EACZ,WAAW,EACX,kBAAkB,EAClB,gBAAgB,EAChB,WAAW,EACZ,MAAM,0BAA0B,CAAC;AAMlC,MAAM,WAAW,gBAAgB;IAE/B,GAAG,EAAE,MAAM,CAAC;IAGZ,MAAM,EAAE,MAAM,CAAC;IAGf,WAAW,CAAC,EAAE,MAAM,CAAC;IAGrB,KAAK,CAAC,EAAE,OAAO,CAAC;IAGhB,KAAK,CAAC,EAAE,WAAW,CAAC;IAKpB,SAAS,CAAC,EAAE,eAAe,CAAC;CAC7B;AAID,MAAM,WAAW,eAAe;IAG9B,UAAU,EAAE,MAAM,CAAC;CACpB;AAID,MAAM,WAAW,WAAW;IAE1B,KAAK,EAAE,MAAM,CAAC;IAEd,IAAI,EAAE,MAAM,CAAC;IAGb,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAE/B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAMD,MAAM,MAAM,aAAa,GAAG,CAAC,IAAI,EAAE;IACjC,UAAU,EAAE,gBAAgB,CAAC;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrC,KAAK,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"json-schema-form-runtime-types.d.ts","sourceRoot":"","sources":["../../src/components/json-schema-form-runtime-types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EACV,iBAAiB,EACjB,gBAAgB,EAChB,cAAc,EACf,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACxD,OAAO,KAAK,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,KAAK,EACV,YAAY,EACZ,WAAW,EACX,kBAAkB,EAClB,gBAAgB,EAChB,WAAW,EACZ,MAAM,0BAA0B,CAAC;AAMlC,MAAM,WAAW,gBAAgB;IAE/B,GAAG,EAAE,MAAM,CAAC;IAGZ,MAAM,EAAE,MAAM,CAAC;IAGf,WAAW,CAAC,EAAE,MAAM,CAAC;IAGrB,KAAK,CAAC,EAAE,OAAO,CAAC;IAGhB,KAAK,CAAC,EAAE,WAAW,CAAC;IAKpB,SAAS,CAAC,EAAE,eAAe,CAAC;CAC7B;AAID,MAAM,WAAW,eAAe;IAG9B,UAAU,EAAE,MAAM,CAAC;CACpB;AAID,MAAM,WAAW,WAAW;IAE1B,KAAK,EAAE,MAAM,CAAC;IAEd,IAAI,EAAE,MAAM,CAAC;IAGb,GAAG,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAE/B,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAMD,MAAM,MAAM,aAAa,GAAG,CAAC,IAAI,EAAE;IACjC,UAAU,EAAE,gBAAgB,CAAC;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrC,KAAK,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;AAO7B,MAAM,MAAM,mBAAmB,GAAG,CAAC,IAAI,EAAE;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAC/B,KAAK,OAAO,CAAC;AAMd,MAAM,WAAW,mBAAmB;IAClC,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,kBAAkB,CAAC;IACzB,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;CACxD;AAED,MAAM,MAAM,YAAY,GAAG,CACzB,KAAK,EAAE,YAAY,EACnB,GAAG,EAAE,mBAAmB,KACrB,YAAY,GAAG,IAAI,CAAC;AAMzB,MAAM,WAAW,oBAAoB;IACnC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IACvD;;;;;;;OAOG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,MAAM,aAAa,GAAG,CAC1B,KAAK,EAAE,YAAY,EACnB,KAAK,EAAE;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,SAAS,CAAA;CAAE,EAC7C,GAAG,CAAC,EAAE,oBAAoB,KACvB;IAAE,KAAK,EAAE,SAAS,CAAC;IAAC,KAAK,EAAE,SAAS,CAAA;CAAE,CAAC;AAI5C,MAAM,WAAW,SAAU,SAAQ,iBAAiB;IAClD,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,kBAAkB,CAAC;IACzB,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,OAAO,CAAC;IACf,QAAQ,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;CACnC;AAOD,MAAM,WAAW,SAAS;IACxB,gBAAgB,CACd,IAAI,EAAE,SAAS,EACf,GAAG,EAAE,aAAa,GACjB;QAAE,KAAK,EAAE,SAAS,CAAC;QAAC,KAAK,EAAE,SAAS,CAAA;KAAE,GAAG,IAAI,CAAC;IACjD,cAAc,CACZ,IAAI,EAAE,SAAS,EACf,GAAG,EAAE,aAAa,EAClB,IAAI,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,MAAM,CAAA;KAAE,GAChC,SAAS,GAAG,IAAI,CAAC;IACpB,kBAAkB,CAChB,MAAM,EAAE,gBAAgB,EACxB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC9B,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,EACjD,GAAG,EAAE,aAAa,EAClB,IAAI,CAAC,EAAE;QAAE,UAAU,CAAC,EAAE,MAAM,EAAE,CAAA;KAAE,GAC/B,SAAS,EAAE,CAAC;CAChB;AAMD,MAAM,WAAW,aAAc,SAAQ,gBAAgB;IACrD,QAAQ,EAAE,OAAO,CAAC;IAMlB,QAAQ,EAAE,OAAO,CAAC;IAClB,gFAAgF;IAChF,YAAY,CAAC,EAAE,OAAO,CAAC;IAGvB,kBAAkB,EAAE,OAAO,CAAC;IAE5B,SAAS,EAAE,OAAO,CAAC;IAGnB,QAAQ,EAAE,OAAO,CAAC;IAElB,MAAM,EAAE,UAAU,CAAC;IAEnB,IAAI,EAAE,QAAQ,CAAC;IAGf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAIlB,QAAQ,EAAE,QAAQ,CAAC;IAKnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,EAAE,YAAY,EAAE,CAAC;IACpB,IAAI,EAAE,aAAa,EAAE,CAAC;IAGtB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAGpC,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IAEvD,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;IAC1C,KAAK,EAAE,MAAM,CAAC;IAEd,MAAM,EAAE,SAAS,CAAC;CACnB;AAKD,MAAM,WAAW,UAAU;IACzB,iGAAiG;IACjG,IAAI,EAAE,UAAU,CAAC;IACjB;;;OAGG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;;OAKG;IACH,IAAI,CAAC,EAAE,WAAW,CAAC;CACpB;AACD,MAAM,WAAW,mBAAoB,SAAQ,cAAc;IACzD,MAAM,EAAE,gBAAgB,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IAClD,6EAA6E;IAC7E,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,8EAA8E;IAC9E,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IACvD,+EAA+E;IAC/E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;OAGG;IACH,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB;;;;;;;OAOG;IACH,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB;;;OAGG;IACH,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB;;;;OAIG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;OAGG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B;;;;;;;;;;;;OAYG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,4CAA4C;IAC5C,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IACtB;;;;OAIG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,YAAY,EAAE,CAAC;IACrB,IAAI,CAAC,EAAE,aAAa,EAAE,CAAC;IACvB;;;;OAIG;IACH,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B;;;;OAIG;IACH,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;IAC1C;;;;;OAKG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B;;;;;OAKG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B;;;;OAIG;IACH,qBAAqB,CAAC,EAAE,MAAM,CAAC;IAC/B;;;;;;;;;;OAUG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB"}
|
|
@@ -9,39 +9,63 @@ const HoverCard = require("../overlay/HoverCard.cjs");
|
|
|
9
9
|
const button = require("./button.cjs");
|
|
10
10
|
const jsonSchemaFormSize = require("./json-schema-form-size.cjs");
|
|
11
11
|
const jsonSchemaFormResolve = require("./json-schema-form-resolve.cjs");
|
|
12
|
+
const jsonSchemaFormExtensions = require("./json-schema-form-extensions.cjs");
|
|
12
13
|
const jsonSchemaFormErrors = require("./json-schema-form-errors.cjs");
|
|
14
|
+
const jsonSchemaFormListeners = require("./json-schema-form-listeners.cjs");
|
|
15
|
+
const jsonSchemaFormArrayView = require("./json-schema-form-array-view.cjs");
|
|
16
|
+
const jsonSchemaFormItemSummary = require("./json-schema-form-item-summary.cjs");
|
|
13
17
|
const jsonSchemaFormUtils = require("./json-schema-form-utils.cjs");
|
|
14
18
|
const UiTrash = require("../icons/components/UiTrash.cjs");
|
|
15
19
|
const UiAdd = require("../icons/components/UiAdd.cjs");
|
|
16
20
|
function TableArray({
|
|
17
21
|
field,
|
|
18
22
|
ctx,
|
|
19
|
-
readOnly
|
|
23
|
+
readOnly,
|
|
24
|
+
toolbar
|
|
20
25
|
}) {
|
|
21
26
|
const items = Array.isArray(field.value) ? field.value : [];
|
|
22
27
|
const itemSchema = field.itemSchema ?? { type: "object" };
|
|
23
|
-
const
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
+
const options = jsonSchemaFormArrayView.tableColumnOptions(field, ctx);
|
|
29
|
+
const valueCells = options.valueCells;
|
|
30
|
+
const { columns, rows } = jsonSchemaFormArrayView.tableLayout(itemSchema, items, options);
|
|
31
|
+
const childCtx = {
|
|
32
|
+
...ctx,
|
|
33
|
+
readOnly,
|
|
34
|
+
depth: ctx.depth + 1,
|
|
35
|
+
...valueCells ? { hideReadOnlyFields: false } : {}
|
|
36
|
+
};
|
|
28
37
|
const removable = !readOnly && jsonSchemaFormUtils.canRemoveItem(field, items.length);
|
|
29
|
-
function cell(item, rowIndex, col
|
|
38
|
+
function cell(item, rowIndex, col) {
|
|
39
|
+
var _a;
|
|
30
40
|
const obj = collections.isPlainObject(item) ? item : {};
|
|
31
|
-
const
|
|
41
|
+
const prop = (_a = rows[rowIndex]) == null ? void 0 : _a[col];
|
|
42
|
+
const nodes = prop ? ctx.render.renderFieldNodes(
|
|
32
43
|
{
|
|
33
44
|
key: `${field.key}[${rowIndex}].${col}`,
|
|
34
|
-
prop,
|
|
45
|
+
prop: valueCells ? { ...prop, readOnly: true } : prop,
|
|
35
46
|
required: false,
|
|
36
47
|
value: obj[col],
|
|
37
|
-
onChange: (next) => field.onChange(
|
|
48
|
+
onChange: (next) => field.onChange(
|
|
49
|
+
collections.setIndex(
|
|
50
|
+
items,
|
|
51
|
+
rowIndex,
|
|
52
|
+
jsonSchemaFormListeners.applyChangeEffects(itemSchema, {
|
|
53
|
+
root: options.rootValue ?? obj,
|
|
54
|
+
...options.evaluate ? { evaluate: options.evaluate } : {},
|
|
55
|
+
value: obj,
|
|
56
|
+
key: col,
|
|
57
|
+
next
|
|
58
|
+
})
|
|
59
|
+
)
|
|
60
|
+
),
|
|
38
61
|
instancePath: jsonSchemaFormErrors.appendInstancePath(
|
|
39
62
|
jsonSchemaFormErrors.appendInstancePath(ctx.instancePath, rowIndex),
|
|
40
63
|
col
|
|
41
64
|
)
|
|
42
65
|
},
|
|
43
66
|
childCtx
|
|
44
|
-
);
|
|
67
|
+
) : null;
|
|
68
|
+
if (!nodes) return /* @__PURE__ */ jsxRuntime.jsx("span", { "data-jsf-cell-placeholder": true, "aria-hidden": "true", className: utils.cn("block", jsonSchemaFormSize.controlMinHeightClass[ctx.size]) });
|
|
45
69
|
return ctx.presentation ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
46
70
|
"div",
|
|
47
71
|
{
|
|
@@ -49,11 +73,25 @@ function TableArray({
|
|
|
49
73
|
"flex min-w-0 items-center [overflow-wrap:anywhere] [&_span[data-jsf-readonly]]:h-auto [&_span[data-jsf-readonly]]:min-w-0",
|
|
50
74
|
jsonSchemaFormSize.controlMinHeightClass[ctx.size]
|
|
51
75
|
),
|
|
52
|
-
children: nodes
|
|
76
|
+
children: nodes.value
|
|
53
77
|
}
|
|
54
|
-
) :
|
|
78
|
+
) : nodes.value;
|
|
79
|
+
}
|
|
80
|
+
function columnHeader(col, prop, header) {
|
|
81
|
+
const roots = {
|
|
82
|
+
...ctx.rootValue ? { rootValue: ctx.rootValue } : {},
|
|
83
|
+
...ctx.onRootChange ? { onRootChange: ctx.onRootChange } : {}
|
|
84
|
+
};
|
|
85
|
+
let column = jsonSchemaFormResolve.resolveControl({ key: col, prop, required: false, value: void 0, onChange: () => {
|
|
86
|
+
} });
|
|
87
|
+
for (const ext of ctx.pre) {
|
|
88
|
+
if (!column) break;
|
|
89
|
+
column = ext(column, { key: col, prop, value: void 0, ...roots });
|
|
90
|
+
}
|
|
91
|
+
if (!column) return header;
|
|
92
|
+
return jsonSchemaFormExtensions.applyPostExtensions(column, { label: header, value: null }, ctx.post, roots).label;
|
|
55
93
|
}
|
|
56
|
-
|
|
94
|
+
const table = /* @__PURE__ */ jsxRuntime.jsxs(
|
|
57
95
|
"div",
|
|
58
96
|
{
|
|
59
97
|
className: utils.cn(
|
|
@@ -74,7 +112,11 @@ function TableArray({
|
|
|
74
112
|
"th",
|
|
75
113
|
{
|
|
76
114
|
className: "px-2 py-1 text-xs font-medium text-muted-foreground [overflow-wrap:anywhere]",
|
|
77
|
-
children:
|
|
115
|
+
children: columnHeader(
|
|
116
|
+
col,
|
|
117
|
+
prop,
|
|
118
|
+
ctx.presentation ? prop.title || col : /* @__PURE__ */ jsxRuntime.jsx(TableColumnHeader, { name: col, schema: prop })
|
|
119
|
+
)
|
|
78
120
|
},
|
|
79
121
|
col
|
|
80
122
|
)),
|
|
@@ -90,7 +132,7 @@ function TableArray({
|
|
|
90
132
|
ctx.presentation ? "border-border" : "border-input"
|
|
91
133
|
),
|
|
92
134
|
children: [
|
|
93
|
-
columns.map(([col
|
|
135
|
+
columns.map(([col]) => /* @__PURE__ */ jsxRuntime.jsx("td", { className: utils.cn("px-2 py-1", !ctx.presentation && !readOnly && "min-w-40"), children: cell(item, i, col) }, col)),
|
|
94
136
|
removable && /* @__PURE__ */ jsxRuntime.jsx("td", { className: "px-2 py-1", children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
95
137
|
"button",
|
|
96
138
|
{
|
|
@@ -125,6 +167,15 @@ function TableArray({
|
|
|
125
167
|
]
|
|
126
168
|
}
|
|
127
169
|
);
|
|
170
|
+
if (toolbar === void 0) return table;
|
|
171
|
+
const spec = field.itemSpec ?? jsonSchemaFormItemSummary.resolveItemSpec(field.schema, itemSchema);
|
|
172
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-2", children: [
|
|
173
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { "data-jsf-array-summary": true, className: "flex items-center justify-between gap-2", children: [
|
|
174
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: utils.cn("text-muted-foreground", jsonSchemaFormSize.labelSizeClass[ctx.size]), children: items.length === 0 ? jsonSchemaFormItemSummary.noItemsLabel(spec) : jsonSchemaFormItemSummary.itemCountLabel(spec, items.length) }),
|
|
175
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex shrink-0 items-center", children: toolbar })
|
|
176
|
+
] }),
|
|
177
|
+
table
|
|
178
|
+
] });
|
|
128
179
|
}
|
|
129
180
|
function TableColumnHeader({
|
|
130
181
|
name,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json-schema-form-table-array.cjs","sources":["../../src/components/json-schema-form-table-array.tsx"],"sourcesContent":["import { type ReactNode } from \"react\";\nimport { isPlainObject, removeIndex, setIndex } from \"../lib/collections\";\nimport { cn } from \"../lib/utils\";\nimport { Icon } from \"../data/Icon\";\nimport { UiAdd, UiTrash } from \"../icons\";\nimport { HoverCard } from \"../overlay/HoverCard\";\nimport { Button } from \"./button\";\nimport {\n controlHeightClass,\n controlMinHeightClass,\n inputSizeClass,\n} from \"./json-schema-form-size\";\nimport { schemaHelper } from \"./json-schema-form-resolve\";\nimport { appendInstancePath } from \"./json-schema-form-errors\";\nimport {\n canAddItem,\n canRemoveItem,\n orderByClickyOrder,\n orderByXOrder,\n seedFromSchema,\n} from \"./json-schema-form-utils\";\nimport type {\n FieldControl,\n JsonSchemaProperty,\n RenderContext,\n} from \"./json-schema-form-types\";\n\n// TableArray renders an object-item array as a table: a header row of the item's\n// property names and one row per item with value-only controls, plus per-row\n// remove and an add button. Driven by `x-layout: table`.\nexport function TableArray({\n field,\n ctx,\n readOnly,\n}: {\n field: FieldControl;\n ctx: RenderContext;\n readOnly: boolean;\n}) {\n const items = Array.isArray(field.value) ? field.value : [];\n const itemSchema = field.itemSchema ?? { type: \"object\" };\n // The item schema's explicit `x-order` is the authority for the keys it names:\n // per-property `x-clicky-order` sorts first (so it still orders everything\n // `x-order` leaves out, and composes across merged sources), then `x-order`\n // pulls its listed columns to the front in its own sequence.\n const columns = orderByXOrder(\n orderByClickyOrder(Object.entries(itemSchema.properties ?? {})),\n itemSchema[\"x-order\"],\n );\n const childCtx: RenderContext = { ...ctx, readOnly, depth: ctx.depth + 1 };\n // The trash column disappears with the buttons that would have filled it, so\n // an array of a fixed length reads as a table rather than one with a blank\n // gutter down the side.\n const removable = !readOnly && canRemoveItem(field, items.length);\n\n function cell(\n item: unknown,\n rowIndex: number,\n col: string,\n prop: JsonSchemaProperty,\n ): ReactNode {\n const obj = isPlainObject(item) ? item : {};\n const nodes = ctx.render.renderFieldNodes(\n {\n key: `${field.key}[${rowIndex}].${col}`,\n prop,\n required: false,\n value: obj[col],\n onChange: (next) =>\n field.onChange(setIndex(items, rowIndex, { ...obj, [col]: next })),\n instancePath: appendInstancePath(\n appendInstancePath(ctx.instancePath, rowIndex),\n col,\n ),\n },\n childCtx,\n );\n return ctx.presentation ? (\n <div\n className={cn(\n \"flex min-w-0 items-center [overflow-wrap:anywhere] [&_span[data-jsf-readonly]]:h-auto [&_span[data-jsf-readonly]]:min-w-0\",\n controlMinHeightClass[ctx.size],\n )}\n >\n {nodes?.value}\n </div>\n ) : (\n (nodes?.value ?? null)\n );\n }\n\n return (\n <div\n className={cn(\n \"overflow-x-auto\",\n !ctx.presentation && \"rounded-md border border-input\",\n )}\n >\n <table className=\"w-full text-sm\">\n <thead>\n <tr\n className={cn(\n \"border-b bg-muted/40 text-left\",\n ctx.presentation ? \"border-border\" : \"border-input\",\n )}\n >\n {columns.map(([col, prop]) => (\n <th\n key={col}\n className=\"px-2 py-1 text-xs font-medium text-muted-foreground [overflow-wrap:anywhere]\"\n >\n {ctx.presentation ? (\n prop.title || col\n ) : (\n <TableColumnHeader name={col} schema={prop} />\n )}\n </th>\n ))}\n {removable && <th className=\"w-10 px-2 py-1\" />}\n </tr>\n </thead>\n <tbody>\n {items.map((item, i) => (\n <tr\n key={i}\n className={cn(\n \"border-b last:border-b-0 align-top\",\n ctx.presentation ? \"border-border\" : \"border-input\",\n )}\n >\n {columns.map(([col, prop]) => (\n <td key={col} className={cn(\"px-2 py-1\", !ctx.presentation && !readOnly && \"min-w-40\")}>\n {cell(item, i, col, prop)}\n </td>\n ))}\n {removable && (\n <td className=\"px-2 py-1\">\n <button\n type=\"button\"\n aria-label={`Remove item ${i + 1}`}\n className={cn(\n \"inline-flex aspect-square items-center justify-center rounded text-muted-foreground hover:bg-accent hover:text-foreground\",\n controlHeightClass[ctx.size],\n )}\n onClick={() => field.onChange(removeIndex(items, i))}\n >\n <Icon icon={UiTrash} className=\"text-sm\" />\n </button>\n </td>\n )}\n </tr>\n ))}\n </tbody>\n </table>\n {!readOnly && canAddItem(field, items.length) && (\n <div className=\"p-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n className={cn(\"gap-1.5\", inputSizeClass[ctx.size])}\n onClick={() =>\n field.onChange([...items, seedFromSchema(itemSchema)])\n }\n >\n <Icon icon={UiAdd} className=\"text-sm\" />\n Add item\n </Button>\n </div>\n )}\n </div>\n );\n}\n\nfunction TableColumnHeader({\n name,\n schema,\n}: {\n name: string;\n schema: JsonSchemaProperty;\n}) {\n const label =\n typeof schema.title === \"string\" && schema.title ? schema.title : name;\n const helper = schemaHelper(schema);\n if (!helper) return label;\n\n return (\n <HoverCard\n placement=\"bottom\"\n trigger={\n <button\n type=\"button\"\n aria-label={`${label} help`}\n className=\"cursor-help border-b border-dotted border-current text-left focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n {label}\n </button>\n }\n cardClassName=\"max-w-xs whitespace-normal text-left font-normal text-foreground\"\n >\n {helper}\n </HoverCard>\n );\n}\n"],"names":["orderByXOrder","orderByClickyOrder","canRemoveItem","isPlainObject","setIndex","appendInstancePath","jsx","cn","controlMinHeightClass","jsxs","controlHeightClass","removeIndex","Icon","UiTrash","canAddItem","Button","inputSizeClass","seedFromSchema","UiAdd","schemaHelper","HoverCard"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"json-schema-form-table-array.cjs","sources":["../../src/components/json-schema-form-table-array.tsx"],"sourcesContent":["import { type ReactNode } from \"react\";\nimport { isPlainObject, removeIndex, setIndex } from \"../lib/collections\";\nimport { cn } from \"../lib/utils\";\nimport { Icon } from \"../data/Icon\";\nimport { UiAdd, UiTrash } from \"../icons\";\nimport { HoverCard } from \"../overlay/HoverCard\";\nimport { Button } from \"./button\";\nimport {\n controlHeightClass,\n controlMinHeightClass,\n inputSizeClass,\n} from \"./json-schema-form-size\";\nimport { resolveControl, schemaHelper } from \"./json-schema-form-resolve\";\nimport { applyPostExtensions } from \"./json-schema-form-extensions\";\nimport { appendInstancePath } from \"./json-schema-form-errors\";\nimport { applyChangeEffects } from \"./json-schema-form-listeners\";\nimport { tableColumnOptions, tableLayout } from \"./json-schema-form-array-view\";\nimport { itemCountLabel, noItemsLabel, resolveItemSpec } from \"./json-schema-form-item-summary\";\nimport { labelSizeClass } from \"./json-schema-form-size\";\nimport {\n canAddItem,\n canRemoveItem,\n seedFromSchema,\n} from \"./json-schema-form-utils\";\nimport type {\n FieldControl,\n JsonSchemaObject,\n JsonSchemaProperty,\n RenderContext,\n} from \"./json-schema-form-types\";\n\n// TableArray renders an object-item array as a table: a header row of the item's\n// property names and one row per item with value-only controls, plus per-row\n// remove and an add button. The grid view of an object array; see ObjectArrayView.\nexport function TableArray({\n field,\n ctx,\n readOnly,\n toolbar,\n}: {\n field: FieldControl;\n ctx: RenderContext;\n readOnly: boolean;\n /** List-level actions, right-aligned on a slim line above the table beside the row count. */\n toolbar?: ReactNode;\n}) {\n const items = Array.isArray(field.value) ? field.value : [];\n const itemSchema = field.itemSchema ?? { type: \"object\" };\n // A table read-only as a whole — a view (the form's `readOnly` prop or a\n // readOnly ancestor; see RenderContext.viewOnly) or the array's own\n // `readOnly` — renders every cell as its value, exactly as a column the\n // schema (or a listener patch) marks readOnly does: a readOnly field is value\n // text wherever it sits, and in a table the grid itself is the structure a\n // disabled control would otherwise keep visible. `x-disabled`, which only\n // reaches ctx.readOnly, keeps real controls, disabled.\n const options = tableColumnOptions(field, ctx);\n const valueCells = options.valueCells;\n // Columns are the union across rows of each row's effective item properties\n // under its own listener state — `allOf` members included, so a listener\n // path that patches one cell (appended as an allOf member) reaches it —\n // minus the cells no row would render: `x-hidden`, a readOnly cell under\n // hideReadOnlyFields, and a writeOnly cell in a read-only view. A cell its\n // own row hides renders as an empty placeholder in a column another row\n // shows. The item schema's explicit `x-order` is the authority for the keys\n // it names: per-property `x-clicky-order` sorts first, then `x-order` pulls\n // its listed columns to the front in its own sequence.\n const { columns, rows } = tableLayout(itemSchema, items, options);\n // hideReadOnlyFields already dropped the declared-readOnly columns; the\n // cells a read-only table marks readOnly itself must still render.\n const childCtx: RenderContext = {\n ...ctx,\n readOnly,\n depth: ctx.depth + 1,\n ...(valueCells ? { hideReadOnlyFields: false } : {}),\n };\n // The trash column disappears with the buttons that would have filled it, so\n // an array of a fixed length reads as a table rather than one with a blank\n // gutter down the side.\n const removable = !readOnly && canRemoveItem(field, items.length);\n\n // A cell renders its OWN row's property, so a listener's readOnly, enable or\n // patch reaches that row alone, and commits through the row's value\n // listeners exactly as an item of the list views does.\n function cell(item: unknown, rowIndex: number, col: string): ReactNode {\n const obj = isPlainObject(item) ? item : {};\n const prop = rows[rowIndex]?.[col];\n const nodes = prop\n ? ctx.render.renderFieldNodes(\n {\n key: `${field.key}[${rowIndex}].${col}`,\n prop: valueCells ? { ...prop, readOnly: true } : prop,\n required: false,\n value: obj[col],\n onChange: (next) =>\n field.onChange(\n setIndex(\n items,\n rowIndex,\n applyChangeEffects(itemSchema as JsonSchemaObject, {\n root: options.rootValue ?? obj,\n ...(options.evaluate ? { evaluate: options.evaluate } : {}),\n value: obj,\n key: col,\n next,\n }),\n ),\n ),\n instancePath: appendInstancePath(\n appendInstancePath(ctx.instancePath, rowIndex),\n col,\n ),\n },\n childCtx,\n )\n : null;\n if (!nodes) return <span data-jsf-cell-placeholder aria-hidden=\"true\" className={cn(\"block\", controlMinHeightClass[ctx.size])} />;\n return ctx.presentation ? (\n <div\n className={cn(\n \"flex min-w-0 items-center [overflow-wrap:anywhere] [&_span[data-jsf-readonly]]:h-auto [&_span[data-jsf-readonly]]:min-w-0\",\n controlMinHeightClass[ctx.size],\n )}\n >\n {nodes.value}\n </div>\n ) : (\n nodes.value\n );\n }\n\n // A column header is its column's label, so post extensions decorate it as\n // they decorate every field label, on the column's field (keyed by the\n // property name, after the pre-extensions). Only the returned label is used:\n // a header holds no value, and value adornments belong in the cells. A\n // column names no single value, so the context carries no instancePath.\n function columnHeader(col: string, prop: JsonSchemaProperty, header: ReactNode): ReactNode {\n const roots = {\n ...(ctx.rootValue ? { rootValue: ctx.rootValue } : {}),\n ...(ctx.onRootChange ? { onRootChange: ctx.onRootChange } : {}),\n };\n let column: FieldControl | null = resolveControl({ key: col, prop, required: false, value: undefined, onChange: () => {} });\n for (const ext of ctx.pre) {\n if (!column) break;\n column = ext(column, { key: col, prop, value: undefined, ...roots });\n }\n if (!column) return header;\n return applyPostExtensions(column, { label: header, value: null }, ctx.post, roots).label;\n }\n\n const table = (\n <div\n className={cn(\n \"overflow-x-auto\",\n !ctx.presentation && \"rounded-md border border-input\",\n )}\n >\n <table className=\"w-full text-sm\">\n <thead>\n <tr\n className={cn(\n \"border-b bg-muted/40 text-left\",\n ctx.presentation ? \"border-border\" : \"border-input\",\n )}\n >\n {columns.map(([col, prop]) => (\n <th\n key={col}\n className=\"px-2 py-1 text-xs font-medium text-muted-foreground [overflow-wrap:anywhere]\"\n >\n {columnHeader(\n col,\n prop,\n ctx.presentation ? prop.title || col : <TableColumnHeader name={col} schema={prop} />,\n )}\n </th>\n ))}\n {removable && <th className=\"w-10 px-2 py-1\" />}\n </tr>\n </thead>\n <tbody>\n {items.map((item, i) => (\n <tr\n key={i}\n className={cn(\n \"border-b last:border-b-0 align-top\",\n ctx.presentation ? \"border-border\" : \"border-input\",\n )}\n >\n {columns.map(([col]) => (\n <td key={col} className={cn(\"px-2 py-1\", !ctx.presentation && !readOnly && \"min-w-40\")}>\n {cell(item, i, col)}\n </td>\n ))}\n {removable && (\n <td className=\"px-2 py-1\">\n <button\n type=\"button\"\n aria-label={`Remove item ${i + 1}`}\n className={cn(\n \"inline-flex aspect-square items-center justify-center rounded text-muted-foreground hover:bg-accent hover:text-foreground\",\n controlHeightClass[ctx.size],\n )}\n onClick={() => field.onChange(removeIndex(items, i))}\n >\n <Icon icon={UiTrash} className=\"text-sm\" />\n </button>\n </td>\n )}\n </tr>\n ))}\n </tbody>\n </table>\n {!readOnly && canAddItem(field, items.length) && (\n <div className=\"p-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n className={cn(\"gap-1.5\", inputSizeClass[ctx.size])}\n onClick={() =>\n field.onChange([...items, seedFromSchema(itemSchema)])\n }\n >\n <Icon icon={UiAdd} className=\"text-sm\" />\n Add item\n </Button>\n </div>\n )}\n </div>\n );\n if (toolbar === undefined) return table;\n // The same summary line the item list shows, so switching views keeps the\n // count and the toolbar where they were.\n const spec = field.itemSpec ?? resolveItemSpec(field.schema, itemSchema);\n return (\n <div className=\"flex flex-col gap-2\">\n <div data-jsf-array-summary className=\"flex items-center justify-between gap-2\">\n <p className={cn(\"text-muted-foreground\", labelSizeClass[ctx.size])}>\n {items.length === 0 ? noItemsLabel(spec) : itemCountLabel(spec, items.length)}\n </p>\n <div className=\"flex shrink-0 items-center\">{toolbar}</div>\n </div>\n {table}\n </div>\n );\n}\n\nfunction TableColumnHeader({\n name,\n schema,\n}: {\n name: string;\n schema: JsonSchemaProperty;\n}) {\n const label =\n typeof schema.title === \"string\" && schema.title ? schema.title : name;\n const helper = schemaHelper(schema);\n if (!helper) return label;\n\n return (\n <HoverCard\n placement=\"bottom\"\n trigger={\n <button\n type=\"button\"\n aria-label={`${label} help`}\n className=\"cursor-help border-b border-dotted border-current text-left focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring\"\n >\n {label}\n </button>\n }\n cardClassName=\"max-w-xs whitespace-normal text-left font-normal text-foreground\"\n >\n {helper}\n </HoverCard>\n );\n}\n"],"names":["tableColumnOptions","tableLayout","canRemoveItem","isPlainObject","setIndex","applyChangeEffects","appendInstancePath","jsx","cn","controlMinHeightClass","resolveControl","applyPostExtensions","jsxs","controlHeightClass","removeIndex","Icon","UiTrash","canAddItem","Button","inputSizeClass","seedFromSchema","UiAdd","resolveItemSpec","labelSizeClass","noItemsLabel","itemCountLabel","schemaHelper","HoverCard"],"mappings":"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"}
|
|
@@ -1,7 +1,10 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
1
2
|
import { FieldControl, RenderContext } from './json-schema-form-types.js';
|
|
2
|
-
export declare function TableArray({ field, ctx, readOnly, }: {
|
|
3
|
+
export declare function TableArray({ field, ctx, readOnly, toolbar, }: {
|
|
3
4
|
field: FieldControl;
|
|
4
5
|
ctx: RenderContext;
|
|
5
6
|
readOnly: boolean;
|
|
7
|
+
/** List-level actions, right-aligned on a slim line above the table beside the row count. */
|
|
8
|
+
toolbar?: ReactNode;
|
|
6
9
|
}): import("react").JSX.Element;
|
|
7
10
|
//# sourceMappingURL=json-schema-form-table-array.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json-schema-form-table-array.d.ts","sourceRoot":"","sources":["../../src/components/json-schema-form-table-array.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"json-schema-form-table-array.d.ts","sourceRoot":"","sources":["../../src/components/json-schema-form-table-array.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAwBvC,OAAO,KAAK,EACV,YAAY,EAGZ,aAAa,EACd,MAAM,0BAA0B,CAAC;AAKlC,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,GAAG,EACH,QAAQ,EACR,OAAO,GACR,EAAE;IACD,KAAK,EAAE,YAAY,CAAC;IACpB,GAAG,EAAE,aAAa,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;IAClB,6FAA6F;IAC7F,OAAO,CAAC,EAAE,SAAS,CAAC;CACrB,+BAuMA"}
|
|
@@ -5,41 +5,65 @@ import { cn } from "../lib/utils.js";
|
|
|
5
5
|
import { Icon } from "../data/Icon.js";
|
|
6
6
|
import { HoverCard } from "../overlay/HoverCard.js";
|
|
7
7
|
import { Button } from "./button.js";
|
|
8
|
-
import { controlHeightClass, inputSizeClass, controlMinHeightClass } from "./json-schema-form-size.js";
|
|
9
|
-
import { schemaHelper } from "./json-schema-form-resolve.js";
|
|
8
|
+
import { controlHeightClass, inputSizeClass, labelSizeClass, controlMinHeightClass } from "./json-schema-form-size.js";
|
|
9
|
+
import { resolveControl, schemaHelper } from "./json-schema-form-resolve.js";
|
|
10
|
+
import { applyPostExtensions } from "./json-schema-form-extensions.js";
|
|
10
11
|
import { appendInstancePath } from "./json-schema-form-errors.js";
|
|
11
|
-
import {
|
|
12
|
+
import { applyChangeEffects } from "./json-schema-form-listeners.js";
|
|
13
|
+
import { tableColumnOptions, tableLayout } from "./json-schema-form-array-view.js";
|
|
14
|
+
import { resolveItemSpec, noItemsLabel, itemCountLabel } from "./json-schema-form-item-summary.js";
|
|
15
|
+
import { canRemoveItem, canAddItem, seedFromSchema } from "./json-schema-form-utils.js";
|
|
12
16
|
import { UiTrash } from "../icons/components/UiTrash.js";
|
|
13
17
|
import { UiAdd } from "../icons/components/UiAdd.js";
|
|
14
18
|
function TableArray({
|
|
15
19
|
field,
|
|
16
20
|
ctx,
|
|
17
|
-
readOnly
|
|
21
|
+
readOnly,
|
|
22
|
+
toolbar
|
|
18
23
|
}) {
|
|
19
24
|
const items = Array.isArray(field.value) ? field.value : [];
|
|
20
25
|
const itemSchema = field.itemSchema ?? { type: "object" };
|
|
21
|
-
const
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
+
const options = tableColumnOptions(field, ctx);
|
|
27
|
+
const valueCells = options.valueCells;
|
|
28
|
+
const { columns, rows } = tableLayout(itemSchema, items, options);
|
|
29
|
+
const childCtx = {
|
|
30
|
+
...ctx,
|
|
31
|
+
readOnly,
|
|
32
|
+
depth: ctx.depth + 1,
|
|
33
|
+
...valueCells ? { hideReadOnlyFields: false } : {}
|
|
34
|
+
};
|
|
26
35
|
const removable = !readOnly && canRemoveItem(field, items.length);
|
|
27
|
-
function cell(item, rowIndex, col
|
|
36
|
+
function cell(item, rowIndex, col) {
|
|
37
|
+
var _a;
|
|
28
38
|
const obj = isPlainObject(item) ? item : {};
|
|
29
|
-
const
|
|
39
|
+
const prop = (_a = rows[rowIndex]) == null ? void 0 : _a[col];
|
|
40
|
+
const nodes = prop ? ctx.render.renderFieldNodes(
|
|
30
41
|
{
|
|
31
42
|
key: `${field.key}[${rowIndex}].${col}`,
|
|
32
|
-
prop,
|
|
43
|
+
prop: valueCells ? { ...prop, readOnly: true } : prop,
|
|
33
44
|
required: false,
|
|
34
45
|
value: obj[col],
|
|
35
|
-
onChange: (next) => field.onChange(
|
|
46
|
+
onChange: (next) => field.onChange(
|
|
47
|
+
setIndex(
|
|
48
|
+
items,
|
|
49
|
+
rowIndex,
|
|
50
|
+
applyChangeEffects(itemSchema, {
|
|
51
|
+
root: options.rootValue ?? obj,
|
|
52
|
+
...options.evaluate ? { evaluate: options.evaluate } : {},
|
|
53
|
+
value: obj,
|
|
54
|
+
key: col,
|
|
55
|
+
next
|
|
56
|
+
})
|
|
57
|
+
)
|
|
58
|
+
),
|
|
36
59
|
instancePath: appendInstancePath(
|
|
37
60
|
appendInstancePath(ctx.instancePath, rowIndex),
|
|
38
61
|
col
|
|
39
62
|
)
|
|
40
63
|
},
|
|
41
64
|
childCtx
|
|
42
|
-
);
|
|
65
|
+
) : null;
|
|
66
|
+
if (!nodes) return /* @__PURE__ */ jsx("span", { "data-jsf-cell-placeholder": true, "aria-hidden": "true", className: cn("block", controlMinHeightClass[ctx.size]) });
|
|
43
67
|
return ctx.presentation ? /* @__PURE__ */ jsx(
|
|
44
68
|
"div",
|
|
45
69
|
{
|
|
@@ -47,11 +71,25 @@ function TableArray({
|
|
|
47
71
|
"flex min-w-0 items-center [overflow-wrap:anywhere] [&_span[data-jsf-readonly]]:h-auto [&_span[data-jsf-readonly]]:min-w-0",
|
|
48
72
|
controlMinHeightClass[ctx.size]
|
|
49
73
|
),
|
|
50
|
-
children: nodes
|
|
74
|
+
children: nodes.value
|
|
51
75
|
}
|
|
52
|
-
) :
|
|
76
|
+
) : nodes.value;
|
|
77
|
+
}
|
|
78
|
+
function columnHeader(col, prop, header) {
|
|
79
|
+
const roots = {
|
|
80
|
+
...ctx.rootValue ? { rootValue: ctx.rootValue } : {},
|
|
81
|
+
...ctx.onRootChange ? { onRootChange: ctx.onRootChange } : {}
|
|
82
|
+
};
|
|
83
|
+
let column = resolveControl({ key: col, prop, required: false, value: void 0, onChange: () => {
|
|
84
|
+
} });
|
|
85
|
+
for (const ext of ctx.pre) {
|
|
86
|
+
if (!column) break;
|
|
87
|
+
column = ext(column, { key: col, prop, value: void 0, ...roots });
|
|
88
|
+
}
|
|
89
|
+
if (!column) return header;
|
|
90
|
+
return applyPostExtensions(column, { label: header, value: null }, ctx.post, roots).label;
|
|
53
91
|
}
|
|
54
|
-
|
|
92
|
+
const table = /* @__PURE__ */ jsxs(
|
|
55
93
|
"div",
|
|
56
94
|
{
|
|
57
95
|
className: cn(
|
|
@@ -72,7 +110,11 @@ function TableArray({
|
|
|
72
110
|
"th",
|
|
73
111
|
{
|
|
74
112
|
className: "px-2 py-1 text-xs font-medium text-muted-foreground [overflow-wrap:anywhere]",
|
|
75
|
-
children:
|
|
113
|
+
children: columnHeader(
|
|
114
|
+
col,
|
|
115
|
+
prop,
|
|
116
|
+
ctx.presentation ? prop.title || col : /* @__PURE__ */ jsx(TableColumnHeader, { name: col, schema: prop })
|
|
117
|
+
)
|
|
76
118
|
},
|
|
77
119
|
col
|
|
78
120
|
)),
|
|
@@ -88,7 +130,7 @@ function TableArray({
|
|
|
88
130
|
ctx.presentation ? "border-border" : "border-input"
|
|
89
131
|
),
|
|
90
132
|
children: [
|
|
91
|
-
columns.map(([col
|
|
133
|
+
columns.map(([col]) => /* @__PURE__ */ jsx("td", { className: cn("px-2 py-1", !ctx.presentation && !readOnly && "min-w-40"), children: cell(item, i, col) }, col)),
|
|
92
134
|
removable && /* @__PURE__ */ jsx("td", { className: "px-2 py-1", children: /* @__PURE__ */ jsx(
|
|
93
135
|
"button",
|
|
94
136
|
{
|
|
@@ -123,6 +165,15 @@ function TableArray({
|
|
|
123
165
|
]
|
|
124
166
|
}
|
|
125
167
|
);
|
|
168
|
+
if (toolbar === void 0) return table;
|
|
169
|
+
const spec = field.itemSpec ?? resolveItemSpec(field.schema, itemSchema);
|
|
170
|
+
return /* @__PURE__ */ jsxs("div", { className: "flex flex-col gap-2", children: [
|
|
171
|
+
/* @__PURE__ */ jsxs("div", { "data-jsf-array-summary": true, className: "flex items-center justify-between gap-2", children: [
|
|
172
|
+
/* @__PURE__ */ jsx("p", { className: cn("text-muted-foreground", labelSizeClass[ctx.size]), children: items.length === 0 ? noItemsLabel(spec) : itemCountLabel(spec, items.length) }),
|
|
173
|
+
/* @__PURE__ */ jsx("div", { className: "flex shrink-0 items-center", children: toolbar })
|
|
174
|
+
] }),
|
|
175
|
+
table
|
|
176
|
+
] });
|
|
126
177
|
}
|
|
127
178
|
function TableColumnHeader({
|
|
128
179
|
name,
|