@flanksource/clicky-ui 0.3.34 → 0.3.35
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 +4 -0
- package/dist/ai.cjs +3 -0
- package/dist/ai.cjs.map +1 -1
- package/dist/ai.js +3 -0
- package/dist/ai.js.map +1 -1
- package/dist/comments/CommentCard.d.ts +1 -1
- package/dist/comments/CommentProvider.d.ts +1 -1
- package/dist/comments/CommentThread.d.ts +1 -1
- package/dist/comments/CommentThreadList.d.ts +1 -1
- package/dist/comments/MentionTextarea.d.ts +1 -1
- package/dist/comments/comment-context.d.ts +4 -4
- package/dist/comments/comment-fixtures.d.ts +1 -1
- package/dist/comments/comment-types.d.ts +1 -1
- package/dist/components/AccordionList.d.ts +1 -1
- package/dist/components/ComboboxControl.d.ts +1 -1
- package/dist/components/ComboboxMenu.d.ts +2 -2
- package/dist/components/ComboboxTags.cjs +41 -11
- package/dist/components/ComboboxTags.cjs.map +1 -1
- package/dist/components/ComboboxTags.d.ts +6 -0
- package/dist/components/ComboboxTags.d.ts.map +1 -1
- package/dist/components/ComboboxTags.js +41 -11
- package/dist/components/ComboboxTags.js.map +1 -1
- package/dist/components/DateField.d.ts +3 -3
- package/dist/components/DatePicker.d.ts +3 -3
- package/dist/components/DateTimePicker.d.ts +3 -3
- package/dist/components/ErrorWrapper.d.ts +2 -2
- package/dist/components/Field.d.ts +1 -1
- package/dist/components/FilterBar.d.ts +1 -1
- package/dist/components/FormLookupProvider.d.ts +1 -1
- package/dist/components/FormatOptionsDropdown.d.ts +1 -1
- package/dist/components/IconButton.d.ts +3 -3
- package/dist/components/InputField.d.ts +2 -2
- package/dist/components/ItemActions.d.ts +1 -1
- package/dist/components/JsonSchemaForm.cjs +17 -36
- 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 +17 -36
- package/dist/components/JsonSchemaForm.js.map +1 -1
- package/dist/components/ListMenu.d.ts +1 -1
- package/dist/components/MultiSelect.d.ts +1 -1
- package/dist/components/SearchInput.d.ts +1 -1
- package/dist/components/SegmentedControl.d.ts +1 -1
- package/dist/components/SplitButton.d.ts +1 -1
- package/dist/components/Switch.d.ts +1 -1
- package/dist/components/TreePickerField.cjs +11 -2
- package/dist/components/TreePickerField.cjs.map +1 -1
- package/dist/components/TreePickerField.d.ts +13 -4
- package/dist/components/TreePickerField.d.ts.map +1 -1
- package/dist/components/TreePickerField.js +11 -2
- package/dist/components/TreePickerField.js.map +1 -1
- package/dist/components/UnitStepControls.d.ts +1 -1
- package/dist/components/button.d.ts +3 -3
- package/dist/components/combobox-types.d.ts +1 -1
- package/dist/components/density-switcher.d.ts +1 -1
- package/dist/components/filter-bar-context.d.ts +1 -1
- package/dist/components/filter-bar-field-utils.d.ts +2 -2
- package/dist/components/form-lookup-context.d.ts +1 -1
- package/dist/components/icon-menu-picker.d.ts +1 -1
- package/dist/components/json-schema-form-accordion-array.cjs +44 -21
- package/dist/components/json-schema-form-accordion-array.cjs.map +1 -1
- package/dist/components/json-schema-form-accordion-array.d.ts.map +1 -1
- package/dist/components/json-schema-form-accordion-array.js +47 -24
- package/dist/components/json-schema-form-accordion-array.js.map +1 -1
- package/dist/components/json-schema-form-array.cjs +53 -30
- 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 +54 -31
- package/dist/components/json-schema-form-array.js.map +1 -1
- package/dist/components/json-schema-form-cards-array.cjs +32 -22
- package/dist/components/json-schema-form-cards-array.cjs.map +1 -1
- package/dist/components/json-schema-form-cards-array.d.ts.map +1 -1
- package/dist/components/json-schema-form-cards-array.js +33 -23
- package/dist/components/json-schema-form-cards-array.js.map +1 -1
- package/dist/components/json-schema-form-collection-layouts.fixtures.d.ts +44 -0
- package/dist/components/json-schema-form-collection-layouts.fixtures.d.ts.map +1 -0
- package/dist/components/json-schema-form-discriminator.d.ts +1 -1
- package/dist/components/json-schema-form-errors.cjs +5 -1
- package/dist/components/json-schema-form-errors.cjs.map +1 -1
- package/dist/components/json-schema-form-errors.d.ts +2 -1
- package/dist/components/json-schema-form-errors.d.ts.map +1 -1
- package/dist/components/json-schema-form-errors.js +6 -2
- package/dist/components/json-schema-form-errors.js.map +1 -1
- package/dist/components/json-schema-form-extensions.d.ts +1 -1
- package/dist/components/json-schema-form-filter-input.cjs +50 -0
- package/dist/components/json-schema-form-filter-input.cjs.map +1 -0
- package/dist/components/json-schema-form-filter-input.d.ts +5 -0
- package/dist/components/json-schema-form-filter-input.d.ts.map +1 -0
- package/dist/components/json-schema-form-filter-input.js +50 -0
- package/dist/components/json-schema-form-filter-input.js.map +1 -0
- package/dist/components/json-schema-form-filter.cjs +49 -0
- package/dist/components/json-schema-form-filter.cjs.map +1 -0
- package/dist/components/json-schema-form-filter.d.ts +8 -0
- package/dist/components/json-schema-form-filter.d.ts.map +1 -0
- package/dist/components/json-schema-form-filter.js +49 -0
- package/dist/components/json-schema-form-filter.js.map +1 -0
- package/dist/components/json-schema-form-layout.cjs +84 -17
- package/dist/components/json-schema-form-layout.cjs.map +1 -1
- package/dist/components/json-schema-form-layout.d.ts +1 -1
- package/dist/components/json-schema-form-layout.d.ts.map +1 -1
- package/dist/components/json-schema-form-layout.js +84 -17
- package/dist/components/json-schema-form-layout.js.map +1 -1
- package/dist/components/json-schema-form-list-array.cjs +16 -5
- package/dist/components/json-schema-form-list-array.cjs.map +1 -1
- package/dist/components/json-schema-form-list-array.d.ts +2 -1
- package/dist/components/json-schema-form-list-array.d.ts.map +1 -1
- package/dist/components/json-schema-form-list-array.js +16 -5
- package/dist/components/json-schema-form-list-array.js.map +1 -1
- package/dist/components/json-schema-form-object.cjs +239 -85
- package/dist/components/json-schema-form-object.cjs.map +1 -1
- package/dist/components/json-schema-form-object.d.ts +2 -2
- package/dist/components/json-schema-form-object.d.ts.map +1 -1
- package/dist/components/json-schema-form-object.js +241 -87
- package/dist/components/json-schema-form-object.js.map +1 -1
- package/dist/components/json-schema-form-preferences.cjs +1 -1
- package/dist/components/json-schema-form-preferences.cjs.map +1 -1
- package/dist/components/json-schema-form-preferences.d.ts +1 -1
- package/dist/components/json-schema-form-preferences.d.ts.map +1 -1
- package/dist/components/json-schema-form-preferences.js +1 -1
- package/dist/components/json-schema-form-preferences.js.map +1 -1
- package/dist/components/json-schema-form-properties-errors.fixtures.d.ts +14 -0
- package/dist/components/json-schema-form-properties-errors.fixtures.d.ts.map +1 -0
- package/dist/components/json-schema-form-properties-size.cjs +19 -0
- package/dist/components/json-schema-form-properties-size.cjs.map +1 -0
- package/dist/components/json-schema-form-properties-size.d.ts +4 -0
- package/dist/components/json-schema-form-properties-size.d.ts.map +1 -0
- package/dist/components/json-schema-form-properties-size.js +19 -0
- package/dist/components/json-schema-form-properties-size.js.map +1 -0
- package/dist/components/json-schema-form-properties.cjs +305 -0
- package/dist/components/json-schema-form-properties.cjs.map +1 -0
- package/dist/components/json-schema-form-properties.d.ts +20 -0
- package/dist/components/json-schema-form-properties.d.ts.map +1 -0
- package/dist/components/json-schema-form-properties.fixtures.d.ts +157 -0
- package/dist/components/json-schema-form-properties.fixtures.d.ts.map +1 -0
- package/dist/components/json-schema-form-properties.js +305 -0
- package/dist/components/json-schema-form-properties.js.map +1 -0
- package/dist/components/json-schema-form-property-actions-context.cjs +6 -0
- package/dist/components/json-schema-form-property-actions-context.cjs.map +1 -0
- package/dist/components/json-schema-form-property-actions-context.d.ts +2 -0
- package/dist/components/json-schema-form-property-actions-context.d.ts.map +1 -0
- package/dist/components/json-schema-form-property-actions-context.js +6 -0
- package/dist/components/json-schema-form-property-actions-context.js.map +1 -0
- package/dist/components/json-schema-form-property-collection.cjs +31 -0
- package/dist/components/json-schema-form-property-collection.cjs.map +1 -0
- package/dist/components/json-schema-form-property-collection.d.ts +6 -0
- package/dist/components/json-schema-form-property-collection.d.ts.map +1 -0
- package/dist/components/json-schema-form-property-collection.js +31 -0
- package/dist/components/json-schema-form-property-collection.js.map +1 -0
- package/dist/components/json-schema-form-property-draft.cjs +45 -0
- package/dist/components/json-schema-form-property-draft.cjs.map +1 -0
- package/dist/components/json-schema-form-property-draft.d.ts +8 -0
- package/dist/components/json-schema-form-property-draft.d.ts.map +1 -0
- package/dist/components/json-schema-form-property-draft.js +45 -0
- package/dist/components/json-schema-form-property-draft.js.map +1 -0
- package/dist/components/json-schema-form-property-preview.cjs +68 -0
- package/dist/components/json-schema-form-property-preview.cjs.map +1 -0
- package/dist/components/json-schema-form-property-preview.d.ts +7 -0
- package/dist/components/json-schema-form-property-preview.d.ts.map +1 -0
- package/dist/components/json-schema-form-property-preview.js +68 -0
- package/dist/components/json-schema-form-property-preview.js.map +1 -0
- package/dist/components/json-schema-form-property-selection.cjs +89 -0
- package/dist/components/json-schema-form-property-selection.cjs.map +1 -0
- package/dist/components/json-schema-form-property-selection.d.ts +6 -0
- package/dist/components/json-schema-form-property-selection.d.ts.map +1 -0
- package/dist/components/json-schema-form-property-selection.js +89 -0
- package/dist/components/json-schema-form-property-selection.js.map +1 -0
- package/dist/components/json-schema-form-render.cjs +41 -4
- package/dist/components/json-schema-form-render.cjs.map +1 -1
- package/dist/components/json-schema-form-render.d.ts +1 -1
- package/dist/components/json-schema-form-render.d.ts.map +1 -1
- package/dist/components/json-schema-form-render.js +42 -5
- package/dist/components/json-schema-form-render.js.map +1 -1
- package/dist/components/json-schema-form-resolve.cjs +2 -0
- package/dist/components/json-schema-form-resolve.cjs.map +1 -1
- package/dist/components/json-schema-form-resolve.d.ts.map +1 -1
- package/dist/components/json-schema-form-resolve.js +2 -0
- package/dist/components/json-schema-form-resolve.js.map +1 -1
- package/dist/components/json-schema-form-runtime-types.d.ts +222 -0
- package/dist/components/json-schema-form-runtime-types.d.ts.map +1 -0
- package/dist/components/json-schema-form-table-array.cjs +82 -51
- package/dist/components/json-schema-form-table-array.cjs.map +1 -1
- package/dist/components/json-schema-form-table-array.d.ts.map +1 -1
- package/dist/components/json-schema-form-table-array.js +84 -53
- package/dist/components/json-schema-form-table-array.js.map +1 -1
- package/dist/components/json-schema-form-template-menu.d.ts +1 -1
- package/dist/components/json-schema-form-template.d.ts +1 -1
- package/dist/components/json-schema-form-types.d.ts +7 -179
- package/dist/components/json-schema-form-types.d.ts.map +1 -1
- package/dist/components/json-schema-form-utils.cjs +10 -9
- package/dist/components/json-schema-form-utils.cjs.map +1 -1
- package/dist/components/json-schema-form-utils.d.ts +11 -1
- package/dist/components/json-schema-form-utils.d.ts.map +1 -1
- package/dist/components/json-schema-form-utils.js +10 -9
- package/dist/components/json-schema-form-utils.js.map +1 -1
- package/dist/components/loading.d.ts +4 -4
- package/dist/components/mdx-editor-callout.d.ts +1 -1
- package/dist/components/mdx-editor-options.d.ts +1 -1
- package/dist/components/select.d.ts +3 -3
- package/dist/components/theme-switcher.d.ts +1 -1
- package/dist/components/use-list-menu-selection.d.ts +1 -1
- package/dist/components/useComboboxLayout.d.ts +1 -1
- package/dist/components/workload-picker-utils.d.ts +1 -1
- package/dist/data/Avatar.d.ts +1 -1
- package/dist/data/AvatarBadge.d.ts +1 -1
- package/dist/data/Badge.d.ts +1 -1
- package/dist/data/Callout.d.ts +1 -1
- package/dist/data/DataTable.cjs +575 -435
- package/dist/data/DataTable.cjs.map +1 -1
- package/dist/data/DataTable.d.ts +21 -13
- package/dist/data/DataTable.d.ts.map +1 -1
- package/dist/data/DataTable.grouping.d.ts +1 -1
- package/dist/data/DataTable.js +575 -435
- package/dist/data/DataTable.js.map +1 -1
- package/dist/data/ExecutionTree.d.ts +1 -1
- package/dist/data/FilterPill.d.ts +1 -1
- package/dist/data/FixtureEditor/RawFenceEditor.d.ts +1 -1
- package/dist/data/FixtureEditor/types.d.ts +1 -1
- package/dist/data/Gauge.d.ts +1 -1
- package/dist/data/GaugeHoverCard.d.ts +1 -1
- package/dist/data/Icon.d.ts +1 -1
- package/dist/data/KeyValueList.d.ts +1 -1
- package/dist/data/MarkdownEditor.d.ts +1 -1
- package/dist/data/MatrixTable.d.ts +1 -1
- package/dist/data/ObjectGraph.d.ts +1 -1
- package/dist/data/ProgressBars.d.ts +1 -1
- package/dist/data/Properties.cjs +86 -35
- package/dist/data/Properties.cjs.map +1 -1
- package/dist/data/Properties.d.ts +2 -2
- package/dist/data/Properties.d.ts.map +1 -1
- package/dist/data/Properties.js +87 -36
- package/dist/data/Properties.js.map +1 -1
- package/dist/data/RadialGauge.d.ts +1 -1
- package/dist/data/SchemaViewer.d.ts +1 -1
- package/dist/data/SortableHeader.d.ts +1 -1
- package/dist/data/StatStrip.d.ts +1 -1
- package/dist/data/StatusBreakdown.d.ts +1 -1
- package/dist/data/TabButton.d.ts +1 -1
- package/dist/data/TaskManager.cjs +9 -17
- package/dist/data/TaskManager.cjs.map +1 -1
- package/dist/data/TaskManager.d.ts.map +1 -1
- package/dist/data/TaskManager.js +9 -17
- package/dist/data/TaskManager.js.map +1 -1
- package/dist/data/TaskManagerButton.cjs +17 -34
- package/dist/data/TaskManagerButton.cjs.map +1 -1
- package/dist/data/TaskManagerButton.d.ts.map +1 -1
- package/dist/data/TaskManagerButton.js +18 -35
- package/dist/data/TaskManagerButton.js.map +1 -1
- package/dist/data/TaskProcessDetails.cjs +5 -26
- package/dist/data/TaskProcessDetails.cjs.map +1 -1
- package/dist/data/TaskProcessDetails.d.ts +2 -1
- package/dist/data/TaskProcessDetails.d.ts.map +1 -1
- package/dist/data/TaskProcessDetails.js +5 -26
- package/dist/data/TaskProcessDetails.js.map +1 -1
- package/dist/data/TaskProgress.cjs +24 -15
- package/dist/data/TaskProgress.cjs.map +1 -1
- package/dist/data/TaskProgress.d.ts +2 -1
- package/dist/data/TaskProgress.d.ts.map +1 -1
- package/dist/data/TaskProgress.js +24 -15
- package/dist/data/TaskProgress.js.map +1 -1
- package/dist/data/TaskResourceReadings.cjs +42 -0
- package/dist/data/TaskResourceReadings.cjs.map +1 -0
- package/dist/data/TaskResourceReadings.d.ts +6 -0
- package/dist/data/TaskResourceReadings.d.ts.map +1 -0
- package/dist/data/TaskResourceReadings.js +42 -0
- package/dist/data/TaskResourceReadings.js.map +1 -0
- package/dist/data/TaskSnapshot.cjs.map +1 -1
- package/dist/data/TaskSnapshot.d.ts +14 -1
- package/dist/data/TaskSnapshot.d.ts.map +1 -1
- package/dist/data/TaskSnapshot.js.map +1 -1
- package/dist/data/Timeline.d.ts +1 -1
- package/dist/data/Tree.d.ts +1 -1
- package/dist/data/TreeGroupHeader.d.ts +1 -1
- package/dist/data/TreeNode.d.ts +1 -1
- package/dist/data/Version.d.ts +3 -3
- package/dist/data/ai/ChatWindow.cjs +22 -12
- package/dist/data/ai/ChatWindow.cjs.map +1 -1
- package/dist/data/ai/ChatWindow.d.ts.map +1 -1
- package/dist/data/ai/ChatWindow.js +22 -12
- package/dist/data/ai/ChatWindow.js.map +1 -1
- package/dist/data/ai/ChatWindow.test-utils.d.ts +4 -2
- package/dist/data/ai/ChatWindow.test-utils.d.ts.map +1 -1
- package/dist/data/ai/ChatWindow.types.d.ts +1 -1
- package/dist/data/ai/ChatWindowManager.cjs +2 -0
- package/dist/data/ai/ChatWindowManager.cjs.map +1 -1
- package/dist/data/ai/ChatWindowManager.d.ts +1 -1
- package/dist/data/ai/ChatWindowManager.d.ts.map +1 -1
- package/dist/data/ai/ChatWindowManager.js +2 -0
- package/dist/data/ai/ChatWindowManager.js.map +1 -1
- package/dist/data/ai/PolicyTree.d.ts +1 -1
- package/dist/data/ai/PromptCatalog/PromptPageHeader.d.ts +1 -1
- package/dist/data/ai/PromptCatalog/types.d.ts +1 -1
- package/dist/data/ai/PromptRunEditor/index.cjs +4 -0
- package/dist/data/ai/PromptRunEditor/index.cjs.map +1 -1
- package/dist/data/ai/PromptRunEditor/index.d.ts +5 -2
- package/dist/data/ai/PromptRunEditor/index.d.ts.map +1 -1
- package/dist/data/ai/PromptRunEditor/index.js +4 -0
- package/dist/data/ai/PromptRunEditor/index.js.map +1 -1
- package/dist/data/ai/SessionChatComposer.d.ts +1 -1
- package/dist/data/ai/SessionInspector.approvals.cjs +147 -0
- package/dist/data/ai/SessionInspector.approvals.cjs.map +1 -0
- package/dist/data/ai/SessionInspector.approvals.d.ts +21 -0
- package/dist/data/ai/SessionInspector.approvals.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.approvals.js +147 -0
- package/dist/data/ai/SessionInspector.approvals.js.map +1 -0
- package/dist/data/ai/SessionInspector.cjs +21 -8
- package/dist/data/ai/SessionInspector.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.d.ts +6 -2
- package/dist/data/ai/SessionInspector.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.hierarchy.d.ts +1 -1
- package/dist/data/ai/SessionInspector.js +21 -8
- package/dist/data/ai/SessionInspector.js.map +1 -1
- package/dist/data/ai/SessionInspector.panel-parts.cjs +47 -0
- package/dist/data/ai/SessionInspector.panel-parts.cjs.map +1 -0
- package/dist/data/ai/SessionInspector.panel-parts.d.ts +20 -0
- package/dist/data/ai/SessionInspector.panel-parts.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.panel-parts.js +47 -0
- package/dist/data/ai/SessionInspector.panel-parts.js.map +1 -0
- package/dist/data/ai/SessionInspector.panels.cjs +40 -99
- package/dist/data/ai/SessionInspector.panels.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.panels.d.ts +3 -1
- package/dist/data/ai/SessionInspector.panels.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.panels.js +12 -71
- package/dist/data/ai/SessionInspector.panels.js.map +1 -1
- package/dist/data/ai/SessionViewer.d.ts +1 -1
- package/dist/data/ai/SessionViewer.rows.d.ts +1 -1
- package/dist/data/ai/SessionViewer.tool-details.d.ts +1 -1
- package/dist/data/ai/SessionViewer.unified.d.ts +23 -0
- package/dist/data/ai/SessionViewer.unified.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/Footer.d.ts +1 -1
- package/dist/data/ai/SpecRuntimeEditor/Rail.d.ts +1 -1
- package/dist/data/ai/SpecRuntimeEditor/SectionCard.d.ts +1 -1
- package/dist/data/ai/SpecRuntimeEditor/VerifySection.cjs +3 -1
- package/dist/data/ai/SpecRuntimeEditor/VerifySection.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/VerifySection.d.ts +3 -1
- package/dist/data/ai/SpecRuntimeEditor/VerifySection.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/VerifySection.js +3 -1
- package/dist/data/ai/SpecRuntimeEditor/VerifySection.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/fields.d.ts +1 -1
- package/dist/data/ai/SpecRuntimeEditor/index.cjs +3 -1
- package/dist/data/ai/SpecRuntimeEditor/index.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/index.d.ts +5 -2
- package/dist/data/ai/SpecRuntimeEditor/index.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/index.js +3 -1
- package/dist/data/ai/SpecRuntimeEditor/index.js.map +1 -1
- package/dist/data/ai/chat-window-context.cjs +1 -0
- package/dist/data/ai/chat-window-context.cjs.map +1 -1
- package/dist/data/ai/chat-window-context.d.ts +13 -5
- package/dist/data/ai/chat-window-context.d.ts.map +1 -1
- package/dist/data/ai/chat-window-context.js +1 -0
- package/dist/data/ai/chat-window-context.js.map +1 -1
- package/dist/data/ai/index.d.ts +2 -1
- package/dist/data/ai/index.d.ts.map +1 -1
- package/dist/data/ai/use-session-scroll.d.ts +1 -1
- package/dist/data/cache-browser/adapter.d.ts +1 -1
- package/dist/data/cells/CellFilterActions.d.ts +1 -1
- package/dist/data/cells/EntityCell.d.ts +1 -1
- package/dist/data/cells/tag-utils.d.ts +1 -1
- package/dist/data/chat/Chat.cjs +42 -46
- package/dist/data/chat/Chat.cjs.map +1 -1
- package/dist/data/chat/Chat.d.ts +16 -5
- package/dist/data/chat/Chat.d.ts.map +1 -1
- package/dist/data/chat/Chat.js +43 -47
- package/dist/data/chat/Chat.js.map +1 -1
- package/dist/data/chat/ModelSelector.d.ts +1 -1
- package/dist/data/chat/PromptInput.cjs +13 -0
- package/dist/data/chat/PromptInput.cjs.map +1 -1
- package/dist/data/chat/PromptInput.d.ts +8 -2
- package/dist/data/chat/PromptInput.d.ts.map +1 -1
- package/dist/data/chat/PromptInput.js +14 -1
- package/dist/data/chat/PromptInput.js.map +1 -1
- package/dist/data/chat/tool-render/ToolArgs.d.ts +1 -1
- package/dist/data/chat/tool-render/ToolParams.d.ts +1 -1
- package/dist/data/chat/tool-render/ToolValue.d.ts +1 -1
- package/dist/data/chat/tool-render/adapter.d.ts +1 -1
- package/dist/data/chat/tool-render/context.d.ts +1 -1
- package/dist/data/chat/tool-render/defaults.d.ts +1 -1
- package/dist/data/chat/tool-render/known-tool-views.d.ts +1 -1
- package/dist/data/chat/tool-render/summary.d.ts +1 -1
- package/dist/data/chat/types.d.ts +1 -1
- package/dist/data/clicky-export/useClickyExport.d.ts +1 -1
- package/dist/data/data-table-server-filters.d.ts +1 -1
- package/dist/data/diagnostics/DiagnosticsDetailPanel.d.ts +1 -1
- package/dist/data/diagnostics/ErrorDetails.d.ts +1 -1
- package/dist/data/diagnostics/StackFrameRow.d.ts +1 -1
- package/dist/data/git/GitChangeList.d.ts +1 -1
- package/dist/data/icon-fallback.d.ts +1 -1
- package/dist/data/properties-context.cjs +6 -0
- package/dist/data/properties-context.cjs.map +1 -0
- package/dist/data/properties-context.d.ts +7 -0
- package/dist/data/properties-context.d.ts.map +1 -0
- package/dist/data/properties-context.js +6 -0
- package/dist/data/properties-context.js.map +1 -0
- package/dist/data/query-browser/QueryBrowser.types.d.ts +1 -1
- package/dist/data/runtime/RuntimeBar.cjs +7 -3
- package/dist/data/runtime/RuntimeBar.cjs.map +1 -1
- package/dist/data/runtime/RuntimeBar.d.ts.map +1 -1
- package/dist/data/runtime/RuntimeBar.js +7 -3
- package/dist/data/runtime/RuntimeBar.js.map +1 -1
- package/dist/data/task-copy.cjs +1 -1
- package/dist/data/task-copy.cjs.map +1 -1
- package/dist/data/task-copy.js +1 -1
- package/dist/data/task-copy.js.map +1 -1
- package/dist/data/task-resource-summary.cjs +30 -0
- package/dist/data/task-resource-summary.cjs.map +1 -0
- package/dist/data/task-resource-summary.d.ts +15 -0
- package/dist/data/task-resource-summary.d.ts.map +1 -0
- package/dist/data/task-resource-summary.js +30 -0
- package/dist/data/task-resource-summary.js.map +1 -0
- package/dist/data/task-status.cjs +8 -2
- package/dist/data/task-status.cjs.map +1 -1
- package/dist/data/task-status.d.ts +3 -0
- package/dist/data/task-status.d.ts.map +1 -1
- package/dist/data/task-status.js +8 -2
- package/dist/data/task-status.js.map +1 -1
- package/dist/data/task-work-progress.cjs +24 -0
- package/dist/data/task-work-progress.cjs.map +1 -0
- package/dist/data/task-work-progress.d.ts +21 -0
- package/dist/data/task-work-progress.d.ts.map +1 -0
- package/dist/data/task-work-progress.js +24 -0
- package/dist/data/task-work-progress.js.map +1 -0
- package/dist/data/test-runner/TestRunner.d.ts +1 -1
- package/dist/data/test-runner/adapter.d.ts +1 -1
- package/dist/data/test-runner/context.d.ts +1 -1
- package/dist/data/use-data-table-virtual.cjs +73 -0
- package/dist/data/use-data-table-virtual.cjs.map +1 -0
- package/dist/data/use-data-table-virtual.d.ts +40 -0
- package/dist/data/use-data-table-virtual.d.ts.map +1 -0
- package/dist/data/use-data-table-virtual.js +73 -0
- package/dist/data/use-data-table-virtual.js.map +1 -0
- package/dist/data/verification/VerificationResults.d.ts +1 -1
- package/dist/data/version-info.cjs +3 -3
- package/dist/data/version-info.js +3 -3
- package/dist/expressions/lang/attributes.cjs +56 -0
- package/dist/expressions/lang/attributes.cjs.map +1 -0
- package/dist/expressions/lang/attributes.d.ts +22 -0
- package/dist/expressions/lang/attributes.d.ts.map +1 -0
- package/dist/expressions/lang/attributes.js +56 -0
- package/dist/expressions/lang/attributes.js.map +1 -0
- package/dist/expressions/lang/completion.cjs +164 -0
- package/dist/expressions/lang/completion.cjs.map +1 -0
- package/dist/expressions/lang/completion.d.ts +29 -0
- package/dist/expressions/lang/completion.d.ts.map +1 -0
- package/dist/expressions/lang/completion.js +164 -0
- package/dist/expressions/lang/completion.js.map +1 -0
- package/dist/expressions/lang/environment.cjs +115 -0
- package/dist/expressions/lang/environment.cjs.map +1 -0
- package/dist/expressions/lang/environment.d.ts +54 -0
- package/dist/expressions/lang/environment.d.ts.map +1 -0
- package/dist/expressions/lang/environment.js +115 -0
- package/dist/expressions/lang/environment.js.map +1 -0
- package/dist/expressions/lang/generated/conformance.json.d.ts +4962 -0
- package/dist/expressions/lang/generated/index.cjs +18 -0
- package/dist/expressions/lang/generated/index.cjs.map +1 -0
- package/dist/expressions/lang/generated/index.d.ts +9 -0
- package/dist/expressions/lang/generated/index.d.ts.map +1 -0
- package/dist/expressions/lang/generated/index.js +18 -0
- package/dist/expressions/lang/generated/index.js.map +1 -0
- package/dist/expressions/lang/generated/languages.json.cjs +18 -0
- package/dist/expressions/lang/generated/languages.json.cjs.map +1 -0
- package/dist/expressions/lang/generated/languages.json.d.ts +2305 -0
- package/dist/expressions/lang/generated/languages.json.js +18 -0
- package/dist/expressions/lang/generated/languages.json.js.map +1 -0
- package/dist/expressions/lang/generated/spec.json.cjs +12 -0
- package/dist/expressions/lang/generated/spec.json.cjs.map +1 -0
- package/dist/expressions/lang/generated/spec.json.d.ts +6260 -0
- package/dist/expressions/lang/generated/spec.json.js +12 -0
- package/dist/expressions/lang/generated/spec.json.js.map +1 -0
- package/dist/expressions/lang/hover.cjs +106 -0
- package/dist/expressions/lang/hover.cjs.map +1 -0
- package/dist/expressions/lang/hover.d.ts +54 -0
- package/dist/expressions/lang/hover.d.ts.map +1 -0
- package/dist/expressions/lang/hover.js +106 -0
- package/dist/expressions/lang/hover.js.map +1 -0
- package/dist/expressions/lang/index.cjs +87 -0
- package/dist/expressions/lang/index.cjs.map +1 -0
- package/dist/expressions/lang/index.d.ts +65 -0
- package/dist/expressions/lang/index.d.ts.map +1 -0
- package/dist/expressions/lang/index.js +90 -0
- package/dist/expressions/lang/index.js.map +1 -0
- package/dist/expressions/lang/merge.cjs +52 -0
- package/dist/expressions/lang/merge.cjs.map +1 -0
- package/dist/expressions/lang/merge.d.ts +12 -0
- package/dist/expressions/lang/merge.d.ts.map +1 -0
- package/dist/expressions/lang/merge.js +52 -0
- package/dist/expressions/lang/merge.js.map +1 -0
- package/dist/expressions/lang/prefix.cjs +91 -0
- package/dist/expressions/lang/prefix.cjs.map +1 -0
- package/dist/expressions/lang/prefix.d.ts +36 -0
- package/dist/expressions/lang/prefix.d.ts.map +1 -0
- package/dist/expressions/lang/prefix.js +91 -0
- package/dist/expressions/lang/prefix.js.map +1 -0
- package/dist/expressions/lang/spec.d.ts +13 -0
- package/dist/expressions/lang/spec.d.ts.map +1 -0
- package/dist/expressions/lang/theme.cjs +97 -0
- package/dist/expressions/lang/theme.cjs.map +1 -0
- package/dist/expressions/lang/theme.d.ts +6 -0
- package/dist/expressions/lang/theme.d.ts.map +1 -0
- package/dist/expressions/lang/theme.js +97 -0
- package/dist/expressions/lang/theme.js.map +1 -0
- package/dist/expressions/lang/types.d.ts +81 -0
- package/dist/expressions/lang/types.d.ts.map +1 -0
- package/dist/expressions/playground/ExpressionPlayground.cjs +308 -0
- package/dist/expressions/playground/ExpressionPlayground.cjs.map +1 -0
- package/dist/expressions/playground/ExpressionPlayground.d.ts +42 -0
- package/dist/expressions/playground/ExpressionPlayground.d.ts.map +1 -0
- package/dist/expressions/playground/ExpressionPlayground.js +291 -0
- package/dist/expressions/playground/ExpressionPlayground.js.map +1 -0
- package/dist/expressions/playground/RunControls.cjs +51 -0
- package/dist/expressions/playground/RunControls.cjs.map +1 -0
- package/dist/expressions/playground/RunControls.d.ts +7 -0
- package/dist/expressions/playground/RunControls.d.ts.map +1 -0
- package/dist/expressions/playground/RunControls.js +51 -0
- package/dist/expressions/playground/RunControls.js.map +1 -0
- package/dist/expressions/playground/VerticalSplit.cjs +109 -0
- package/dist/expressions/playground/VerticalSplit.cjs.map +1 -0
- package/dist/expressions/playground/VerticalSplit.d.ts +23 -0
- package/dist/expressions/playground/VerticalSplit.d.ts.map +1 -0
- package/dist/expressions/playground/VerticalSplit.js +109 -0
- package/dist/expressions/playground/VerticalSplit.js.map +1 -0
- package/dist/expressions/playground/api.cjs +49 -0
- package/dist/expressions/playground/api.cjs.map +1 -0
- package/dist/expressions/playground/api.d.ts +53 -0
- package/dist/expressions/playground/api.d.ts.map +1 -0
- package/dist/expressions/playground/api.js +49 -0
- package/dist/expressions/playground/api.js.map +1 -0
- package/dist/expressions/playground/languages.cjs +88 -0
- package/dist/expressions/playground/languages.cjs.map +1 -0
- package/dist/expressions/playground/languages.d.ts +43 -0
- package/dist/expressions/playground/languages.d.ts.map +1 -0
- package/dist/expressions/playground/languages.js +88 -0
- package/dist/expressions/playground/languages.js.map +1 -0
- package/dist/expressions/playground/panels/GraphPanel.cjs +72 -0
- package/dist/expressions/playground/panels/GraphPanel.cjs.map +1 -0
- package/dist/expressions/playground/panels/GraphPanel.d.ts +19 -0
- package/dist/expressions/playground/panels/GraphPanel.d.ts.map +1 -0
- package/dist/expressions/playground/panels/GraphPanel.js +72 -0
- package/dist/expressions/playground/panels/GraphPanel.js.map +1 -0
- package/dist/expressions/playground/panels/ResultPanel.cjs +82 -0
- package/dist/expressions/playground/panels/ResultPanel.cjs.map +1 -0
- package/dist/expressions/playground/panels/ResultPanel.d.ts +11 -0
- package/dist/expressions/playground/panels/ResultPanel.d.ts.map +1 -0
- package/dist/expressions/playground/panels/ResultPanel.js +82 -0
- package/dist/expressions/playground/panels/ResultPanel.js.map +1 -0
- package/dist/expressions/playground/panels/SpecPanel.cjs +76 -0
- package/dist/expressions/playground/panels/SpecPanel.cjs.map +1 -0
- package/dist/expressions/playground/panels/SpecPanel.d.ts +18 -0
- package/dist/expressions/playground/panels/SpecPanel.d.ts.map +1 -0
- package/dist/expressions/playground/panels/SpecPanel.js +76 -0
- package/dist/expressions/playground/panels/SpecPanel.js.map +1 -0
- package/dist/expressions/playground/panels/TokensPanel.cjs +89 -0
- package/dist/expressions/playground/panels/TokensPanel.cjs.map +1 -0
- package/dist/expressions/playground/panels/TokensPanel.d.ts +15 -0
- package/dist/expressions/playground/panels/TokensPanel.d.ts.map +1 -0
- package/dist/expressions/playground/panels/TokensPanel.js +72 -0
- package/dist/expressions/playground/panels/TokensPanel.js.map +1 -0
- package/dist/expressions/playground/panels/graphNodes.cjs +35 -0
- package/dist/expressions/playground/panels/graphNodes.cjs.map +1 -0
- package/dist/expressions/playground/panels/graphNodes.d.ts +19 -0
- package/dist/expressions/playground/panels/graphNodes.d.ts.map +1 -0
- package/dist/expressions/playground/panels/graphNodes.js +35 -0
- package/dist/expressions/playground/panels/graphNodes.js.map +1 -0
- package/dist/expressions/playground/runAction.cjs +12 -0
- package/dist/expressions/playground/runAction.cjs.map +1 -0
- package/dist/expressions/playground/runAction.d.ts +15 -0
- package/dist/expressions/playground/runAction.d.ts.map +1 -0
- package/dist/expressions/playground/runAction.js +12 -0
- package/dist/expressions/playground/runAction.js.map +1 -0
- package/dist/expressions/playground/runShortcut.cjs +9 -0
- package/dist/expressions/playground/runShortcut.cjs.map +1 -0
- package/dist/expressions/playground/runShortcut.d.ts +2 -0
- package/dist/expressions/playground/runShortcut.d.ts.map +1 -0
- package/dist/expressions/playground/runShortcut.js +9 -0
- package/dist/expressions/playground/runShortcut.js.map +1 -0
- package/dist/expressions/playground/useEditorTheme.cjs +40 -0
- package/dist/expressions/playground/useEditorTheme.cjs.map +1 -0
- package/dist/expressions/playground/useEditorTheme.d.ts +16 -0
- package/dist/expressions/playground/useEditorTheme.d.ts.map +1 -0
- package/dist/expressions/playground/useEditorTheme.js +23 -0
- package/dist/expressions/playground/useEditorTheme.js.map +1 -0
- package/dist/expressions/playground/useEvaluator.cjs +72 -0
- package/dist/expressions/playground/useEvaluator.cjs.map +1 -0
- package/dist/expressions/playground/useEvaluator.d.ts +25 -0
- package/dist/expressions/playground/useEvaluator.d.ts.map +1 -0
- package/dist/expressions/playground/useEvaluator.js +72 -0
- package/dist/expressions/playground/useEvaluator.js.map +1 -0
- package/dist/expressions/playground/useParsedInput.cjs +22 -0
- package/dist/expressions/playground/useParsedInput.cjs.map +1 -0
- package/dist/expressions/playground/useParsedInput.d.ts +20 -0
- package/dist/expressions/playground/useParsedInput.d.ts.map +1 -0
- package/dist/expressions/playground/useParsedInput.js +22 -0
- package/dist/expressions/playground/useParsedInput.js.map +1 -0
- package/dist/expressions/playground/verticalSplitModel.cjs +11 -0
- package/dist/expressions/playground/verticalSplitModel.cjs.map +1 -0
- package/dist/expressions/playground/verticalSplitModel.d.ts +3 -0
- package/dist/expressions/playground/verticalSplitModel.d.ts.map +1 -0
- package/dist/expressions/playground/verticalSplitModel.js +11 -0
- package/dist/expressions/playground/verticalSplitModel.js.map +1 -0
- package/dist/expressions/playground.cjs +18 -0
- package/dist/expressions/playground.cjs.map +1 -0
- package/dist/expressions/playground.d.ts +18 -0
- package/dist/expressions/playground.d.ts.map +1 -0
- package/dist/expressions/playground.js +18 -0
- package/dist/expressions/playground.js.map +1 -0
- package/dist/expressions.cjs +28 -0
- package/dist/expressions.cjs.map +1 -0
- package/dist/expressions.d.ts +10 -0
- package/dist/expressions.d.ts.map +1 -0
- package/dist/expressions.js +28 -0
- package/dist/expressions.js.map +1 -0
- package/dist/hooks/density-provider.d.ts +1 -1
- package/dist/hooks/theme-provider.d.ts +1 -1
- package/dist/hooks/use-density.d.ts +1 -1
- package/dist/hooks/use-resource-clock.cjs +14 -0
- package/dist/hooks/use-resource-clock.cjs.map +1 -0
- package/dist/hooks/use-resource-clock.d.ts +2 -0
- package/dist/hooks/use-resource-clock.d.ts.map +1 -0
- package/dist/hooks/use-resource-clock.js +14 -0
- package/dist/hooks/use-resource-clock.js.map +1 -0
- package/dist/hooks/use-task-run.cjs +12 -3
- 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 +12 -3
- package/dist/hooks/use-task-run.js.map +1 -1
- package/dist/hooks/use-theme.d.ts +1 -1
- package/dist/icons/registry.d.ts +1 -1
- package/dist/icons/types.d.ts +1 -1
- package/dist/layout/AppShell.d.ts +1 -1
- package/dist/layout/AppShell.nav.drag.d.ts +1 -1
- package/dist/layout/AppSidebar.d.ts +1 -1
- package/dist/layout/Panel.d.ts +1 -1
- package/dist/layout/PanelFrame.d.ts +1 -1
- package/dist/layout/Section.d.ts +1 -1
- package/dist/layout/SplitPane.d.ts +1 -1
- package/dist/layout/Tabs.d.ts +1 -1
- package/dist/layout/Workspace.d.ts +1 -1
- package/dist/layout/Workspace.model.d.ts +1 -1
- package/dist/lib/combobox-values.d.ts +1 -1
- package/dist/monaco/MonacoEditor.cjs +3 -3
- package/dist/monaco/MonacoEditor.cjs.map +1 -1
- package/dist/monaco/MonacoEditor.js +2 -2
- package/dist/monaco/MonacoEditor.js.map +1 -1
- package/dist/monaco/types.d.ts +1 -1
- package/dist/monaco/use-monaco-worker.d.ts +1 -1
- package/dist/overlay/CellActions.d.ts +1 -1
- package/dist/overlay/CommandPalette.d.ts +2 -2
- package/dist/overlay/CommandPalette.model.d.ts +1 -1
- package/dist/overlay/CommandPaletteList.d.ts +1 -1
- package/dist/overlay/DropdownMenu.d.ts +1 -1
- package/dist/overlay/HoverCard.d.ts +1 -1
- package/dist/overlay/Modal.d.ts +2 -2
- package/dist/overlay/Toast.d.ts +1 -1
- package/dist/overlay/TourCard.d.ts +1 -1
- package/dist/overlay/TourProvider.d.ts +1 -1
- package/dist/overlay/dropdownMenuContext.d.ts +1 -1
- package/dist/overlay/toast-context.d.ts +2 -2
- package/dist/overlay/tour-context.d.ts +1 -1
- package/dist/overlay/tour-types.d.ts +1 -1
- package/dist/profiles/connections/connectionBrowserModel.d.ts +1 -1
- package/dist/profiles/connections/connectionQueryWorkspace.d.ts +1 -1
- package/dist/profiles/editor/profileBuilder.d.ts +1 -1
- package/dist/profiles/elasticsearch/esParamOperandExtension.d.ts +1 -1
- package/dist/profiles/fields/profileFieldControls.d.ts +1 -1
- package/dist/profiles/fields/profileFieldIcons.d.ts +1 -1
- package/dist/profiles/fields/profileFieldState.d.ts +1 -1
- package/dist/profiles/query/jsonPathSample.d.ts +1 -1
- package/dist/profiles/query/jsonPathSampleRow.d.ts +1 -1
- package/dist/profiles/query/prometheusResults.d.ts +2 -2
- package/dist/rpc/EndpointList.d.ts +1 -1
- package/dist/rpc/EntityExplorerApp.d.ts +1 -1
- package/dist/rpc/OperationCatalog.d.ts +1 -1
- package/dist/rpc/OperationEntityContextPicker.d.ts +1 -1
- package/dist/rpc/OperationEntityPage.d.ts +1 -1
- package/dist/rpc/OperationResultView.d.ts +1 -1
- package/dist/rpc/RouterProvider.d.ts +1 -1
- package/dist/rpc/SchemaActionForm.d.ts +1 -1
- package/dist/rpc/formMetadata.d.ts +1 -1
- package/dist/rpc/router.d.ts +1 -1
- package/dist/rpc/rpc-story.fixtures.d.ts +1 -1
- package/dist/styles.css +1 -1
- package/package.json +21 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json-schema-form-accordion-array.js","sources":["../../src/components/json-schema-form-accordion-array.tsx"],"sourcesContent":["import { AccordionList } from \"./AccordionList\";\nimport {
|
|
1
|
+
{"version":3,"file":"json-schema-form-accordion-array.js","sources":["../../src/components/json-schema-form-accordion-array.tsx"],"sourcesContent":["import { AccordionList } from \"./AccordionList\";\nimport {\n appendInstancePath,\n errorCountUnderInstancePath,\n} from \"./json-schema-form-errors\";\nimport {\n ItemBadge,\n ItemErrorMark,\n ItemGlyph,\n RequiredMark,\n} from \"./json-schema-form-item-row\";\nimport {\n addItemLabel,\n emptyItemsCopy,\n itemActionsAllow,\n itemCountLabel,\n itemSummaryFor,\n noItemsLabel,\n resolveItemSpec,\n} from \"./json-schema-form-item-summary\";\nimport {\n canAddItem,\n canRemoveItem,\n fieldInputId,\n seedFromSchema,\n} from \"./json-schema-form-utils\";\nimport { cn } from \"../lib/utils\";\nimport { controlMinHeightClass } from \"./json-schema-form-size\";\nimport type { FieldControl, RenderContext } from \"./json-schema-form-types\";\n\n// AccordionArray is the JsonSchemaForm adapter over AccordionList: it turns\n// `x-item` into row content and the schema's item into a recursive sub-form, and\n// owns nothing structural. Everything about the interaction — one row open at a\n// time, roving focus, the add row that doubles as the empty state — lives in\n// AccordionList, which knows nothing about JSON Schema.\nexport function AccordionArray({\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 const spec = field.itemSpec ?? resolveItemSpec(field.schema, itemSchema);\n const emptyCopy = emptyItemsCopy(spec, field.schema);\n // The array's help mode governs its whole subtree. Without this the fields\n // inside an expanded row keep the form-level default, so an accordion that\n // resolved to \"hover\" would still stack a two-line paragraph under every\n // control — the exact height the summary rows exist to reclaim.\n const childCtx: RenderContext = {\n ...ctx,\n readOnly,\n depth: ctx.depth + 1,\n ...(field.helpDisplay\n ? { layout: { ...ctx.layout, help: field.helpDisplay } }\n : {}),\n };\n\n function summaryFor(item: unknown, index: number) {\n return (\n field.itemSummary?.({ item, index }) ??\n itemSummaryFor({ item, index, spec, itemSchema })\n );\n }\n\n function renderSummary({\n item,\n index,\n open,\n }: {\n item: unknown;\n index: number;\n open: boolean;\n }) {\n const summary = summaryFor(item, index);\n return (\n <>\n <ItemGlyph glyph={summary.glyph} />\n <span className=\"shrink-0 text-sm font-medium\">{summary.title}</span>\n <ItemBadge badge={summary.badge} />\n {summary.flagged && <RequiredMark />}\n {summary.summary && (\n <code className=\"truncate font-mono text-xs text-muted-foreground\">\n {summary.summary}\n </code>\n )}\n {!open && (\n <ItemErrorMark\n count={errorCountUnderInstancePath(\n ctx.errors,\n appendInstancePath(ctx.instancePath, index),\n )}\n />\n )}\n </>\n );\n }\n\n if (ctx.presentation)\n return (\n <div className=\"min-w-0 space-y-1\">\n <div className=\"text-xs text-muted-foreground\">\n {items.length === 0\n ? noItemsLabel(spec)\n : itemCountLabel(spec, items.length)}\n </div>\n {items.map((item, index) => (\n <div\n key={index}\n className={cn(\n \"flex min-w-0 flex-wrap items-center gap-2 rounded px-2 py-1 even:bg-muted/40\",\n controlMinHeightClass[ctx.size],\n )}\n >\n {renderSummary({ item, index, open: false })}\n </div>\n ))}\n {items.length === 0 && emptyCopy && (\n <p className=\"text-xs text-muted-foreground\">{emptyCopy}</p>\n )}\n </div>\n );\n\n return (\n <AccordionList<unknown>\n items={items}\n onChange={(next) => field.onChange(next)}\n summary={\n items.length === 0\n ? noItemsLabel(spec)\n : itemCountLabel(spec, items.length)\n }\n size={ctx.size}\n readOnly={readOnly}\n itemId={(index) =>\n fieldInputId(appendInstancePath(ctx.instancePath, index), ctx.idPrefix)\n }\n // The panel's controls are the form's own inputs; anything else focusable\n // inside an item (a help disclosure, a remove button on a nested array)\n // would otherwise win the caret on add.\n focusSelector=\"[data-jsf-input]\"\n itemLabel={({ item, index }) => summaryFor(item, index).title}\n allowReorder={itemActionsAllow(spec, \"reorder\")}\n allowDuplicate={itemActionsAllow(spec, \"duplicate\")}\n allowRemove={itemActionsAllow(spec, \"remove\") && canRemoveItem(field, items.length)}\n // AccordionList shows its add row only when it is given something to\n // create, so withholding onCreate at maxItems is how the bound reaches it.\n {...(canAddItem(field, items.length)\n ? { onCreate: () => seedFromSchema(itemSchema) }\n : {})}\n addLabel={addItemLabel(spec)}\n {...(emptyCopy ? { addDescription: emptyCopy } : {})}\n renderHeader={renderSummary}\n renderBody={({ item, index, onChange }) =>\n // Recurse through the shared pipeline so consumer pre/post extensions\n // still apply to the item and its properties.\n ctx.render.renderFieldNodes(\n {\n key: `${field.key}[${index}]`,\n prop: itemSchema,\n required: false,\n value: item,\n onChange,\n instancePath: appendInstancePath(ctx.instancePath, index),\n },\n childCtx,\n )?.value ?? null\n }\n />\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -29,14 +29,17 @@ function ArrayControl({
|
|
|
29
29
|
const scalarType = jsonSchemaFormResolve.scalarItemsType(field.itemSchema);
|
|
30
30
|
if (field.arrayDisplay === "list") {
|
|
31
31
|
if (scalarType !== "string") {
|
|
32
|
-
throw new Error(
|
|
32
|
+
throw new Error(
|
|
33
|
+
`${field.key} uses x-array-display list without string items`
|
|
34
|
+
);
|
|
33
35
|
}
|
|
34
36
|
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
35
37
|
jsonSchemaFormListArray.CompactListArray,
|
|
36
38
|
{
|
|
37
39
|
field,
|
|
38
40
|
fieldId,
|
|
39
|
-
readOnly
|
|
41
|
+
readOnly,
|
|
42
|
+
presentation: ctx.presentation === true
|
|
40
43
|
}
|
|
41
44
|
);
|
|
42
45
|
}
|
|
@@ -95,37 +98,57 @@ function ArrayControl({
|
|
|
95
98
|
"div",
|
|
96
99
|
{
|
|
97
100
|
className: utils.cn(
|
|
98
|
-
"flex flex-col
|
|
101
|
+
"flex flex-col",
|
|
102
|
+
!ctx.presentation && "rounded-md border border-input p-2",
|
|
99
103
|
jsonSchemaFormSize.fieldInnerGapClass[ctx.size]
|
|
100
104
|
),
|
|
101
105
|
children: [
|
|
102
|
-
items.map((item, i) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
106
|
+
items.map((item, i) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
107
|
+
"div",
|
|
108
|
+
{
|
|
109
|
+
className: utils.cn(
|
|
110
|
+
"grid items-start gap-2",
|
|
111
|
+
readOnly ? "grid-cols-1" : "grid-cols-[1fr_auto]"
|
|
112
|
+
),
|
|
113
|
+
children: [
|
|
114
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
115
|
+
jsonSchemaFormLayout.FieldsGrid,
|
|
116
|
+
{
|
|
117
|
+
layout: ctx.layout,
|
|
118
|
+
size: ctx.size,
|
|
119
|
+
columns: 1,
|
|
120
|
+
className: "min-w-0",
|
|
121
|
+
children: ctx.render.renderFieldRow(
|
|
122
|
+
{
|
|
123
|
+
key: `${field.key}[${i}]`,
|
|
124
|
+
prop: itemSchema,
|
|
125
|
+
required: false,
|
|
126
|
+
value: item,
|
|
127
|
+
onChange: (next) => field.onChange(collections.setIndex(items, i, next)),
|
|
128
|
+
instancePath: jsonSchemaFormErrors.appendInstancePath(ctx.instancePath, i)
|
|
129
|
+
},
|
|
130
|
+
childCtx,
|
|
131
|
+
{ labelOverride: `Item ${i + 1}` }
|
|
132
|
+
)
|
|
133
|
+
}
|
|
134
|
+
),
|
|
135
|
+
!readOnly && /* @__PURE__ */ jsxRuntime.jsx(
|
|
136
|
+
ItemActions.ItemActions,
|
|
137
|
+
{
|
|
138
|
+
label: `item ${i + 1}`,
|
|
139
|
+
index: i,
|
|
140
|
+
count: items.length,
|
|
141
|
+
size: ctx.size,
|
|
142
|
+
reveal: false,
|
|
143
|
+
onMove: (to) => field.onChange(collections.moveItem(items, i, to)),
|
|
144
|
+
...jsonSchemaFormUtils.canRemoveItem(field, items.length) ? { onRemove: () => field.onChange(collections.removeIndex(items, i)) } : {}
|
|
145
|
+
}
|
|
146
|
+
)
|
|
147
|
+
]
|
|
148
|
+
},
|
|
149
|
+
i
|
|
150
|
+
)),
|
|
151
|
+
!readOnly && jsonSchemaFormUtils.canAddItem(field, items.length) && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
129
152
|
button.Button,
|
|
130
153
|
{
|
|
131
154
|
type: "button",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json-schema-form-array.cjs","sources":["../../src/components/json-schema-form-array.tsx"],"sourcesContent":["import { moveItem, removeIndex, setIndex } from \"../lib/collections\";\nimport { cn } from \"../lib/utils\";\nimport { Icon } from \"../data/Icon\";\nimport { FilterPill } from \"../data/FilterPill\";\nimport { UiAdd } from \"../icons\";\nimport { Button } from \"./button\";\nimport { ItemActions } from \"./ItemActions\";\nimport {\n controlMinHeightClass,\n fieldInnerGapClass,\n inputSizeClass,\n type FormSize,\n} from \"./json-schema-form-size\";\nimport { AccordionArray } from \"./json-schema-form-accordion-array\";\nimport { CardsArray } from \"./json-schema-form-cards-array\";\nimport { FieldsGrid } from \"./json-schema-form-layout\";\nimport { scalarItemsType } from \"./json-schema-form-resolve\";\nimport { appendInstancePath } from \"./json-schema-form-errors\";\nimport { TableArray } from \"./json-schema-form-table-array\";\nimport { TagsComboboxControl } from \"./json-schema-form-tags-combobox\";\nimport { CompactListArray } from \"./json-schema-form-list-array\";\nimport {\n hasObjectItemProperties,\n seedFromSchema,\n toStringArray,\n} from \"./json-schema-form-utils\";\nimport type {\n FieldControl,\n FieldOption,\n RenderContext,\n} from \"./json-schema-form-types\";\n\n// A comma is the second commit key in every tag list, and what a pasted list is\n// split on. Newlines split too — see splitOnComboboxSeparators.\nconst TAG_SEPARATORS = [\",\"];\n\n// ArrayControl routes an array to the control its items call for: a flat list of\n// values (choices, scalars) is ONE tag combobox; object items are summary rows,\n// cards or a table; anything else renders a control per item with add / remove /\n// reorder. Recursion goes through ctx.render so this module never imports the\n// renderer (no import cycle).\nexport function ArrayControl({\n field,\n fieldId,\n ctx,\n}: {\n field: FieldControl;\n fieldId: string;\n ctx: RenderContext;\n}) {\n // A read-only array marks its whole subtree non-editable: no add/remove/reorder\n // and item inputs disabled (a child the schema marks readOnly still renders as\n // a value span).\n const readOnly = ctx.readOnly || field.readOnly === true;\n const choices = enumItemOptions(field);\n const scalarType = scalarItemsType(field.itemSchema);\n if (field.arrayDisplay === \"list\") {\n if (scalarType !== \"string\") {\n throw new Error(`${field.key} uses x-array-display list without string items`);\n }\n return (\n <CompactListArray\n field={field}\n fieldId={fieldId}\n readOnly={readOnly}\n />\n );\n }\n if (field.arrayDisplay === \"filter-pills\" && choices.length > 0) {\n return (\n <FilterPillArray\n field={field}\n fieldId={fieldId}\n readOnly={readOnly}\n size={ctx.size}\n />\n );\n }\n // A list of choices is ONE control, not a stack of them: the enum item schema\n // makes the whole array a multi-select whose committed values are pills, so\n // the option set is discoverable in one dropdown instead of repeated per item.\n // `x-array-display: \"stacked\"` opts back into a combobox per item.\n if (field.arrayDisplay !== \"stacked\" && choices.length > 0) {\n return (\n <TagsComboboxControl\n field={field}\n fieldId={fieldId}\n readOnly={readOnly}\n size={ctx.size}\n options={choices}\n />\n );\n }\n // A flat list of scalars is the same gesture as the enum list above — type a\n // value, get a pill — so it takes the same control, with no options to pick\n // from and a comma as a second commit key. Numeric items commit numbers.\n if (field.arrayDisplay !== \"stacked\" && scalarType) {\n return (\n <TagsComboboxControl\n field={field}\n fieldId={fieldId}\n readOnly={readOnly}\n size={ctx.size}\n options={[]}\n itemType={scalarType}\n separators={TAG_SEPARATORS}\n />\n );\n }\n if (hasObjectItemProperties(field.itemSchema)) {\n if (field.arrayDisplay === \"cards\") {\n return <CardsArray field={field} ctx={ctx} readOnly={readOnly} />;\n }\n // The accordion is the DEFAULT for object items: stacked in full, a\n // ten-property item costs ~700px of screen each and a list of them says\n // nothing about which item is which. `x-array-display: \"stacked\"` opts back\n // into the per-item sub-form below; `x-layout: \"table\"` into the row grid.\n // An explicit accordion outranks the table, since it names the renderer.\n if (\n field.arrayDisplay === \"accordion\" ||\n (field.arrayDisplay !== \"stacked\" && field.layout !== \"table\")\n ) {\n return <AccordionArray field={field} ctx={ctx} readOnly={readOnly} />;\n }\n // `x-layout: table` renders object-item arrays as compact rows with one\n // column per item property — denser still than the summary rows.\n if (field.layout === \"table\") {\n return <TableArray field={field} ctx={ctx} readOnly={readOnly} />;\n }\n }\n const items = Array.isArray(field.value) ? field.value : [];\n const itemSchema = field.itemSchema ?? { type: \"string\" };\n const childCtx: RenderContext = { ...ctx, readOnly, depth: ctx.depth + 1 };\n\n return (\n <div\n className={cn(\n \"flex flex-col rounded-md border border-input p-2\",\n fieldInnerGapClass[ctx.size],\n )}\n >\n {items.map((item, i) => (\n <div key={i} className=\"grid grid-cols-[1fr_auto] items-start gap-2\">\n {/* The item's row is a FieldWrapper (or a full-width ObjectSection),\n both of which are grid children of a FieldsGrid — inline mode's\n `grid-cols-subgrid` resolves to `none` without one, collapsing\n every item into a stacked column while the rest of the form stays\n aligned. Fixed at one column: an item is a single row, and any\n multi-column layout belongs to the item's own object body. */}\n <FieldsGrid layout={ctx.layout} size={ctx.size} columns={1} className=\"min-w-0\">\n {ctx.render.renderFieldRow(\n {\n key: `${field.key}[${i}]`,\n prop: itemSchema,\n required: false,\n value: item,\n onChange: (next) => field.onChange(setIndex(items, i, next)),\n instancePath: appendInstancePath(ctx.instancePath, i),\n },\n childCtx,\n { labelOverride: `Item ${i + 1}` },\n )}\n </FieldsGrid>\n {!readOnly && (\n <ItemActions\n label={`item ${i + 1}`}\n index={i}\n count={items.length}\n size={ctx.size}\n reveal={false}\n onMove={(to) => field.onChange(moveItem(items, i, to))}\n onRemove={() => field.onChange(removeIndex(items, i))}\n />\n )}\n </div>\n ))}\n {!readOnly && (\n <Button\n type=\"button\"\n variant=\"outline\"\n className={cn(\"gap-1.5\", inputSizeClass[ctx.size])}\n onClick={() => field.onChange([...items, seedFromSchema(itemSchema)])}\n >\n <Icon icon={UiAdd} className=\"text-sm\" />\n Add item\n </Button>\n )}\n </div>\n );\n}\n\n// The choices an array of enum items offers, deduped by value. Prefers the\n// resolved `options` (they carry the schema's labels, icons and tones) and falls\n// back to the raw item `enum` for a field a pre-extension built by hand.\nfunction enumItemOptions(field: FieldControl): FieldOption[] {\n const rawOptions =\n field.options ??\n (Array.isArray(field.itemSchema?.enum)\n ? field.itemSchema.enum.map((value) => ({\n value: String(value),\n label: String(value),\n }))\n : []);\n const seen = new Set<string>();\n return rawOptions.filter((option) => {\n if (seen.has(option.value)) return false;\n seen.add(option.value);\n return true;\n });\n}\n\nfunction FilterPillArray({\n field,\n fieldId,\n readOnly,\n size,\n}: {\n field: FieldControl;\n fieldId: string;\n readOnly: boolean;\n size: FormSize;\n}) {\n const options = enumItemOptions(field);\n const validValues = new Set(options.map((option) => option.value));\n const explicitValues = toStringArray(field.value).filter((value) =>\n validValues.has(value),\n );\n const implicitAll = explicitValues.length === 0;\n const selected = new Set(\n implicitAll ? options.map((option) => option.value) : explicitValues,\n );\n\n function commit(nextSelected: Set<string>) {\n const next = options\n .map((option) => option.value)\n .filter((value) => nextSelected.has(value));\n field.onChange(next.length === options.length ? [] : next);\n }\n\n function toggle(value: string) {\n if (readOnly) return;\n const next = new Set(selected);\n if (next.has(value)) {\n next.delete(value);\n } else {\n next.add(value);\n }\n commit(next);\n }\n\n return (\n <div\n id={fieldId}\n data-jsf-input\n role=\"group\"\n aria-label={field.label}\n className={cn(\n \"flex flex-wrap items-center gap-1.5 rounded-md border border-input bg-transparent px-2 py-1 shadow-sm\",\n controlMinHeightClass[size],\n )}\n >\n {options.map((option) => (\n <FilterPill\n key={option.value}\n label={option.label}\n mode={selected.has(option.value) ? \"active\" : \"neutral\"}\n title={\n implicitAll ? `${option.label} enabled by default` : option.label\n }\n {...(!readOnly ? { onClick: () => toggle(option.value) } : {})}\n className=\"max-w-full\"\n />\n ))}\n </div>\n );\n}\n"],"names":["scalarItemsType","jsx","CompactListArray","TagsComboboxControl","hasObjectItemProperties","CardsArray","AccordionArray","TableArray","jsxs","cn","fieldInnerGapClass","FieldsGrid","setIndex","appendInstancePath","ItemActions","moveItem","removeIndex","Button","inputSizeClass","seedFromSchema","Icon","UiAdd","toStringArray","controlMinHeightClass","FilterPill"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"json-schema-form-array.cjs","sources":["../../src/components/json-schema-form-array.tsx"],"sourcesContent":["import { moveItem, removeIndex, setIndex } from \"../lib/collections\";\nimport { cn } from \"../lib/utils\";\nimport { Icon } from \"../data/Icon\";\nimport { FilterPill } from \"../data/FilterPill\";\nimport { UiAdd } from \"../icons\";\nimport { Button } from \"./button\";\nimport { ItemActions } from \"./ItemActions\";\nimport {\n controlMinHeightClass,\n fieldInnerGapClass,\n inputSizeClass,\n type FormSize,\n} from \"./json-schema-form-size\";\nimport { AccordionArray } from \"./json-schema-form-accordion-array\";\nimport { CardsArray } from \"./json-schema-form-cards-array\";\nimport { FieldsGrid } from \"./json-schema-form-layout\";\nimport { scalarItemsType } from \"./json-schema-form-resolve\";\nimport { appendInstancePath } from \"./json-schema-form-errors\";\nimport { TableArray } from \"./json-schema-form-table-array\";\nimport { TagsComboboxControl } from \"./json-schema-form-tags-combobox\";\nimport { CompactListArray } from \"./json-schema-form-list-array\";\nimport {\n canAddItem,\n canRemoveItem,\n hasObjectItemProperties,\n seedFromSchema,\n toStringArray,\n} from \"./json-schema-form-utils\";\nimport type {\n FieldControl,\n FieldOption,\n RenderContext,\n} from \"./json-schema-form-types\";\n\n// A comma is the second commit key in every tag list, and what a pasted list is\n// split on. Newlines split too — see splitOnComboboxSeparators.\nconst TAG_SEPARATORS = [\",\"];\n\n// ArrayControl routes an array to the control its items call for: a flat list of\n// values (choices, scalars) is ONE tag combobox; object items are summary rows,\n// cards or a table; anything else renders a control per item with add / remove /\n// reorder. Recursion goes through ctx.render so this module never imports the\n// renderer (no import cycle).\nexport function ArrayControl({\n field,\n fieldId,\n ctx,\n}: {\n field: FieldControl;\n fieldId: string;\n ctx: RenderContext;\n}) {\n // A read-only array marks its whole subtree non-editable: no add/remove/reorder\n // and item inputs disabled (a child the schema marks readOnly still renders as\n // a value span).\n const readOnly = ctx.readOnly || field.readOnly === true;\n const choices = enumItemOptions(field);\n const scalarType = scalarItemsType(field.itemSchema);\n if (field.arrayDisplay === \"list\") {\n if (scalarType !== \"string\") {\n throw new Error(\n `${field.key} uses x-array-display list without string items`,\n );\n }\n return (\n <CompactListArray\n field={field}\n fieldId={fieldId}\n readOnly={readOnly}\n presentation={ctx.presentation === true}\n />\n );\n }\n if (field.arrayDisplay === \"filter-pills\" && choices.length > 0) {\n return (\n <FilterPillArray\n field={field}\n fieldId={fieldId}\n readOnly={readOnly}\n size={ctx.size}\n />\n );\n }\n // A list of choices is ONE control, not a stack of them: the enum item schema\n // makes the whole array a multi-select whose committed values are pills, so\n // the option set is discoverable in one dropdown instead of repeated per item.\n // `x-array-display: \"stacked\"` opts back into a combobox per item.\n if (field.arrayDisplay !== \"stacked\" && choices.length > 0) {\n return (\n <TagsComboboxControl\n field={field}\n fieldId={fieldId}\n readOnly={readOnly}\n size={ctx.size}\n options={choices}\n />\n );\n }\n // A flat list of scalars is the same gesture as the enum list above — type a\n // value, get a pill — so it takes the same control, with no options to pick\n // from and a comma as a second commit key. Numeric items commit numbers.\n if (field.arrayDisplay !== \"stacked\" && scalarType) {\n return (\n <TagsComboboxControl\n field={field}\n fieldId={fieldId}\n readOnly={readOnly}\n size={ctx.size}\n options={[]}\n itemType={scalarType}\n separators={TAG_SEPARATORS}\n />\n );\n }\n if (hasObjectItemProperties(field.itemSchema)) {\n if (field.arrayDisplay === \"cards\") {\n return <CardsArray field={field} ctx={ctx} readOnly={readOnly} />;\n }\n // The accordion is the DEFAULT for object items: stacked in full, a\n // ten-property item costs ~700px of screen each and a list of them says\n // nothing about which item is which. `x-array-display: \"stacked\"` opts back\n // into the per-item sub-form below; `x-layout: \"table\"` into the row grid.\n // An explicit accordion outranks the table, since it names the renderer.\n if (\n field.arrayDisplay === \"accordion\" ||\n (field.arrayDisplay !== \"stacked\" && field.layout !== \"table\")\n ) {\n return <AccordionArray field={field} ctx={ctx} readOnly={readOnly} />;\n }\n // `x-layout: table` renders object-item arrays as compact rows with one\n // column per item property — denser still than the summary rows.\n if (field.layout === \"table\") {\n return <TableArray field={field} ctx={ctx} readOnly={readOnly} />;\n }\n }\n const items = Array.isArray(field.value) ? field.value : [];\n const itemSchema = field.itemSchema ?? { type: \"string\" };\n const childCtx: RenderContext = { ...ctx, readOnly, depth: ctx.depth + 1 };\n\n return (\n <div\n className={cn(\n \"flex flex-col\",\n !ctx.presentation && \"rounded-md border border-input p-2\",\n fieldInnerGapClass[ctx.size],\n )}\n >\n {items.map((item, i) => (\n <div\n key={i}\n className={cn(\n \"grid items-start gap-2\",\n readOnly ? \"grid-cols-1\" : \"grid-cols-[1fr_auto]\",\n )}\n >\n {/* The item's row is a FieldWrapper (or a full-width ObjectSection),\n both of which are grid children of a FieldsGrid — inline mode's\n `grid-cols-subgrid` resolves to `none` without one, collapsing\n every item into a stacked column while the rest of the form stays\n aligned. Fixed at one column: an item is a single row, and any\n multi-column layout belongs to the item's own object body. */}\n <FieldsGrid\n layout={ctx.layout}\n size={ctx.size}\n columns={1}\n className=\"min-w-0\"\n >\n {ctx.render.renderFieldRow(\n {\n key: `${field.key}[${i}]`,\n prop: itemSchema,\n required: false,\n value: item,\n onChange: (next) => field.onChange(setIndex(items, i, next)),\n instancePath: appendInstancePath(ctx.instancePath, i),\n },\n childCtx,\n { labelOverride: `Item ${i + 1}` },\n )}\n </FieldsGrid>\n {!readOnly && (\n <ItemActions\n label={`item ${i + 1}`}\n index={i}\n count={items.length}\n size={ctx.size}\n reveal={false}\n onMove={(to) => field.onChange(moveItem(items, i, to))}\n {...(canRemoveItem(field, items.length)\n ? { onRemove: () => field.onChange(removeIndex(items, i)) }\n : {})}\n />\n )}\n </div>\n ))}\n {!readOnly && canAddItem(field, items.length) && (\n <Button\n type=\"button\"\n variant=\"outline\"\n className={cn(\"gap-1.5\", inputSizeClass[ctx.size])}\n onClick={() => field.onChange([...items, seedFromSchema(itemSchema)])}\n >\n <Icon icon={UiAdd} className=\"text-sm\" />\n Add item\n </Button>\n )}\n </div>\n );\n}\n\n// The choices an array of enum items offers, deduped by value. Prefers the\n// resolved `options` (they carry the schema's labels, icons and tones) and falls\n// back to the raw item `enum` for a field a pre-extension built by hand.\nfunction enumItemOptions(field: FieldControl): FieldOption[] {\n const rawOptions =\n field.options ??\n (Array.isArray(field.itemSchema?.enum)\n ? field.itemSchema.enum.map((value) => ({\n value: String(value),\n label: String(value),\n }))\n : []);\n const seen = new Set<string>();\n return rawOptions.filter((option) => {\n if (seen.has(option.value)) return false;\n seen.add(option.value);\n return true;\n });\n}\n\nfunction FilterPillArray({\n field,\n fieldId,\n readOnly,\n size,\n}: {\n field: FieldControl;\n fieldId: string;\n readOnly: boolean;\n size: FormSize;\n}) {\n const options = enumItemOptions(field);\n const validValues = new Set(options.map((option) => option.value));\n const explicitValues = toStringArray(field.value).filter((value) =>\n validValues.has(value),\n );\n const implicitAll = explicitValues.length === 0;\n const selected = new Set(\n implicitAll ? options.map((option) => option.value) : explicitValues,\n );\n\n function commit(nextSelected: Set<string>) {\n const next = options\n .map((option) => option.value)\n .filter((value) => nextSelected.has(value));\n field.onChange(next.length === options.length ? [] : next);\n }\n\n function toggle(value: string) {\n if (readOnly) return;\n const next = new Set(selected);\n if (next.has(value)) {\n next.delete(value);\n } else {\n next.add(value);\n }\n commit(next);\n }\n\n return (\n <div\n id={fieldId}\n data-jsf-input\n role=\"group\"\n aria-label={field.label}\n className={cn(\n \"flex flex-wrap items-center gap-1.5 rounded-md border border-input bg-transparent px-2 py-1 shadow-sm\",\n controlMinHeightClass[size],\n )}\n >\n {options.map((option) => (\n <FilterPill\n key={option.value}\n label={option.label}\n mode={selected.has(option.value) ? \"active\" : \"neutral\"}\n title={\n implicitAll ? `${option.label} enabled by default` : option.label\n }\n {...(!readOnly ? { onClick: () => toggle(option.value) } : {})}\n className=\"max-w-full\"\n />\n ))}\n </div>\n );\n}\n"],"names":["scalarItemsType","jsx","CompactListArray","TagsComboboxControl","hasObjectItemProperties","CardsArray","AccordionArray","TableArray","jsxs","cn","fieldInnerGapClass","FieldsGrid","setIndex","appendInstancePath","ItemActions","moveItem","canRemoveItem","removeIndex","canAddItem","Button","inputSizeClass","seedFromSchema","Icon","UiAdd","toStringArray","controlMinHeightClass","FilterPill"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json-schema-form-array.d.ts","sourceRoot":"","sources":["../../src/components/json-schema-form-array.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"json-schema-form-array.d.ts","sourceRoot":"","sources":["../../src/components/json-schema-form-array.tsx"],"names":[],"mappings":"AA4BA,OAAO,KAAK,EACV,YAAY,EAEZ,aAAa,EACd,MAAM,0BAA0B,CAAC;AAWlC,wBAAgB,YAAY,CAAC,EAC3B,KAAK,EACL,OAAO,EACP,GAAG,GACJ,EAAE;IACD,KAAK,EAAE,YAAY,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,aAAa,CAAC;CACpB,+BA6JA"}
|
|
@@ -14,7 +14,7 @@ import { appendInstancePath } from "./json-schema-form-errors.js";
|
|
|
14
14
|
import { TableArray } from "./json-schema-form-table-array.js";
|
|
15
15
|
import { TagsComboboxControl } from "./json-schema-form-tags-combobox.js";
|
|
16
16
|
import { CompactListArray } from "./json-schema-form-list-array.js";
|
|
17
|
-
import { hasObjectItemProperties, seedFromSchema, toStringArray } from "./json-schema-form-utils.js";
|
|
17
|
+
import { hasObjectItemProperties, canRemoveItem, canAddItem, seedFromSchema, toStringArray } from "./json-schema-form-utils.js";
|
|
18
18
|
import { UiAdd } from "../icons/components/UiAdd.js";
|
|
19
19
|
const TAG_SEPARATORS = [","];
|
|
20
20
|
function ArrayControl({
|
|
@@ -27,14 +27,17 @@ function ArrayControl({
|
|
|
27
27
|
const scalarType = scalarItemsType(field.itemSchema);
|
|
28
28
|
if (field.arrayDisplay === "list") {
|
|
29
29
|
if (scalarType !== "string") {
|
|
30
|
-
throw new Error(
|
|
30
|
+
throw new Error(
|
|
31
|
+
`${field.key} uses x-array-display list without string items`
|
|
32
|
+
);
|
|
31
33
|
}
|
|
32
34
|
return /* @__PURE__ */ jsx(
|
|
33
35
|
CompactListArray,
|
|
34
36
|
{
|
|
35
37
|
field,
|
|
36
38
|
fieldId,
|
|
37
|
-
readOnly
|
|
39
|
+
readOnly,
|
|
40
|
+
presentation: ctx.presentation === true
|
|
38
41
|
}
|
|
39
42
|
);
|
|
40
43
|
}
|
|
@@ -93,37 +96,57 @@ function ArrayControl({
|
|
|
93
96
|
"div",
|
|
94
97
|
{
|
|
95
98
|
className: cn(
|
|
96
|
-
"flex flex-col
|
|
99
|
+
"flex flex-col",
|
|
100
|
+
!ctx.presentation && "rounded-md border border-input p-2",
|
|
97
101
|
fieldInnerGapClass[ctx.size]
|
|
98
102
|
),
|
|
99
103
|
children: [
|
|
100
|
-
items.map((item, i) => /* @__PURE__ */ jsxs(
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
104
|
+
items.map((item, i) => /* @__PURE__ */ jsxs(
|
|
105
|
+
"div",
|
|
106
|
+
{
|
|
107
|
+
className: cn(
|
|
108
|
+
"grid items-start gap-2",
|
|
109
|
+
readOnly ? "grid-cols-1" : "grid-cols-[1fr_auto]"
|
|
110
|
+
),
|
|
111
|
+
children: [
|
|
112
|
+
/* @__PURE__ */ jsx(
|
|
113
|
+
FieldsGrid,
|
|
114
|
+
{
|
|
115
|
+
layout: ctx.layout,
|
|
116
|
+
size: ctx.size,
|
|
117
|
+
columns: 1,
|
|
118
|
+
className: "min-w-0",
|
|
119
|
+
children: ctx.render.renderFieldRow(
|
|
120
|
+
{
|
|
121
|
+
key: `${field.key}[${i}]`,
|
|
122
|
+
prop: itemSchema,
|
|
123
|
+
required: false,
|
|
124
|
+
value: item,
|
|
125
|
+
onChange: (next) => field.onChange(setIndex(items, i, next)),
|
|
126
|
+
instancePath: appendInstancePath(ctx.instancePath, i)
|
|
127
|
+
},
|
|
128
|
+
childCtx,
|
|
129
|
+
{ labelOverride: `Item ${i + 1}` }
|
|
130
|
+
)
|
|
131
|
+
}
|
|
132
|
+
),
|
|
133
|
+
!readOnly && /* @__PURE__ */ jsx(
|
|
134
|
+
ItemActions,
|
|
135
|
+
{
|
|
136
|
+
label: `item ${i + 1}`,
|
|
137
|
+
index: i,
|
|
138
|
+
count: items.length,
|
|
139
|
+
size: ctx.size,
|
|
140
|
+
reveal: false,
|
|
141
|
+
onMove: (to) => field.onChange(moveItem(items, i, to)),
|
|
142
|
+
...canRemoveItem(field, items.length) ? { onRemove: () => field.onChange(removeIndex(items, i)) } : {}
|
|
143
|
+
}
|
|
144
|
+
)
|
|
145
|
+
]
|
|
146
|
+
},
|
|
147
|
+
i
|
|
148
|
+
)),
|
|
149
|
+
!readOnly && canAddItem(field, items.length) && /* @__PURE__ */ jsxs(
|
|
127
150
|
Button,
|
|
128
151
|
{
|
|
129
152
|
type: "button",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json-schema-form-array.js","sources":["../../src/components/json-schema-form-array.tsx"],"sourcesContent":["import { moveItem, removeIndex, setIndex } from \"../lib/collections\";\nimport { cn } from \"../lib/utils\";\nimport { Icon } from \"../data/Icon\";\nimport { FilterPill } from \"../data/FilterPill\";\nimport { UiAdd } from \"../icons\";\nimport { Button } from \"./button\";\nimport { ItemActions } from \"./ItemActions\";\nimport {\n controlMinHeightClass,\n fieldInnerGapClass,\n inputSizeClass,\n type FormSize,\n} from \"./json-schema-form-size\";\nimport { AccordionArray } from \"./json-schema-form-accordion-array\";\nimport { CardsArray } from \"./json-schema-form-cards-array\";\nimport { FieldsGrid } from \"./json-schema-form-layout\";\nimport { scalarItemsType } from \"./json-schema-form-resolve\";\nimport { appendInstancePath } from \"./json-schema-form-errors\";\nimport { TableArray } from \"./json-schema-form-table-array\";\nimport { TagsComboboxControl } from \"./json-schema-form-tags-combobox\";\nimport { CompactListArray } from \"./json-schema-form-list-array\";\nimport {\n hasObjectItemProperties,\n seedFromSchema,\n toStringArray,\n} from \"./json-schema-form-utils\";\nimport type {\n FieldControl,\n FieldOption,\n RenderContext,\n} from \"./json-schema-form-types\";\n\n// A comma is the second commit key in every tag list, and what a pasted list is\n// split on. Newlines split too — see splitOnComboboxSeparators.\nconst TAG_SEPARATORS = [\",\"];\n\n// ArrayControl routes an array to the control its items call for: a flat list of\n// values (choices, scalars) is ONE tag combobox; object items are summary rows,\n// cards or a table; anything else renders a control per item with add / remove /\n// reorder. Recursion goes through ctx.render so this module never imports the\n// renderer (no import cycle).\nexport function ArrayControl({\n field,\n fieldId,\n ctx,\n}: {\n field: FieldControl;\n fieldId: string;\n ctx: RenderContext;\n}) {\n // A read-only array marks its whole subtree non-editable: no add/remove/reorder\n // and item inputs disabled (a child the schema marks readOnly still renders as\n // a value span).\n const readOnly = ctx.readOnly || field.readOnly === true;\n const choices = enumItemOptions(field);\n const scalarType = scalarItemsType(field.itemSchema);\n if (field.arrayDisplay === \"list\") {\n if (scalarType !== \"string\") {\n throw new Error(`${field.key} uses x-array-display list without string items`);\n }\n return (\n <CompactListArray\n field={field}\n fieldId={fieldId}\n readOnly={readOnly}\n />\n );\n }\n if (field.arrayDisplay === \"filter-pills\" && choices.length > 0) {\n return (\n <FilterPillArray\n field={field}\n fieldId={fieldId}\n readOnly={readOnly}\n size={ctx.size}\n />\n );\n }\n // A list of choices is ONE control, not a stack of them: the enum item schema\n // makes the whole array a multi-select whose committed values are pills, so\n // the option set is discoverable in one dropdown instead of repeated per item.\n // `x-array-display: \"stacked\"` opts back into a combobox per item.\n if (field.arrayDisplay !== \"stacked\" && choices.length > 0) {\n return (\n <TagsComboboxControl\n field={field}\n fieldId={fieldId}\n readOnly={readOnly}\n size={ctx.size}\n options={choices}\n />\n );\n }\n // A flat list of scalars is the same gesture as the enum list above — type a\n // value, get a pill — so it takes the same control, with no options to pick\n // from and a comma as a second commit key. Numeric items commit numbers.\n if (field.arrayDisplay !== \"stacked\" && scalarType) {\n return (\n <TagsComboboxControl\n field={field}\n fieldId={fieldId}\n readOnly={readOnly}\n size={ctx.size}\n options={[]}\n itemType={scalarType}\n separators={TAG_SEPARATORS}\n />\n );\n }\n if (hasObjectItemProperties(field.itemSchema)) {\n if (field.arrayDisplay === \"cards\") {\n return <CardsArray field={field} ctx={ctx} readOnly={readOnly} />;\n }\n // The accordion is the DEFAULT for object items: stacked in full, a\n // ten-property item costs ~700px of screen each and a list of them says\n // nothing about which item is which. `x-array-display: \"stacked\"` opts back\n // into the per-item sub-form below; `x-layout: \"table\"` into the row grid.\n // An explicit accordion outranks the table, since it names the renderer.\n if (\n field.arrayDisplay === \"accordion\" ||\n (field.arrayDisplay !== \"stacked\" && field.layout !== \"table\")\n ) {\n return <AccordionArray field={field} ctx={ctx} readOnly={readOnly} />;\n }\n // `x-layout: table` renders object-item arrays as compact rows with one\n // column per item property — denser still than the summary rows.\n if (field.layout === \"table\") {\n return <TableArray field={field} ctx={ctx} readOnly={readOnly} />;\n }\n }\n const items = Array.isArray(field.value) ? field.value : [];\n const itemSchema = field.itemSchema ?? { type: \"string\" };\n const childCtx: RenderContext = { ...ctx, readOnly, depth: ctx.depth + 1 };\n\n return (\n <div\n className={cn(\n \"flex flex-col rounded-md border border-input p-2\",\n fieldInnerGapClass[ctx.size],\n )}\n >\n {items.map((item, i) => (\n <div key={i} className=\"grid grid-cols-[1fr_auto] items-start gap-2\">\n {/* The item's row is a FieldWrapper (or a full-width ObjectSection),\n both of which are grid children of a FieldsGrid — inline mode's\n `grid-cols-subgrid` resolves to `none` without one, collapsing\n every item into a stacked column while the rest of the form stays\n aligned. Fixed at one column: an item is a single row, and any\n multi-column layout belongs to the item's own object body. */}\n <FieldsGrid layout={ctx.layout} size={ctx.size} columns={1} className=\"min-w-0\">\n {ctx.render.renderFieldRow(\n {\n key: `${field.key}[${i}]`,\n prop: itemSchema,\n required: false,\n value: item,\n onChange: (next) => field.onChange(setIndex(items, i, next)),\n instancePath: appendInstancePath(ctx.instancePath, i),\n },\n childCtx,\n { labelOverride: `Item ${i + 1}` },\n )}\n </FieldsGrid>\n {!readOnly && (\n <ItemActions\n label={`item ${i + 1}`}\n index={i}\n count={items.length}\n size={ctx.size}\n reveal={false}\n onMove={(to) => field.onChange(moveItem(items, i, to))}\n onRemove={() => field.onChange(removeIndex(items, i))}\n />\n )}\n </div>\n ))}\n {!readOnly && (\n <Button\n type=\"button\"\n variant=\"outline\"\n className={cn(\"gap-1.5\", inputSizeClass[ctx.size])}\n onClick={() => field.onChange([...items, seedFromSchema(itemSchema)])}\n >\n <Icon icon={UiAdd} className=\"text-sm\" />\n Add item\n </Button>\n )}\n </div>\n );\n}\n\n// The choices an array of enum items offers, deduped by value. Prefers the\n// resolved `options` (they carry the schema's labels, icons and tones) and falls\n// back to the raw item `enum` for a field a pre-extension built by hand.\nfunction enumItemOptions(field: FieldControl): FieldOption[] {\n const rawOptions =\n field.options ??\n (Array.isArray(field.itemSchema?.enum)\n ? field.itemSchema.enum.map((value) => ({\n value: String(value),\n label: String(value),\n }))\n : []);\n const seen = new Set<string>();\n return rawOptions.filter((option) => {\n if (seen.has(option.value)) return false;\n seen.add(option.value);\n return true;\n });\n}\n\nfunction FilterPillArray({\n field,\n fieldId,\n readOnly,\n size,\n}: {\n field: FieldControl;\n fieldId: string;\n readOnly: boolean;\n size: FormSize;\n}) {\n const options = enumItemOptions(field);\n const validValues = new Set(options.map((option) => option.value));\n const explicitValues = toStringArray(field.value).filter((value) =>\n validValues.has(value),\n );\n const implicitAll = explicitValues.length === 0;\n const selected = new Set(\n implicitAll ? options.map((option) => option.value) : explicitValues,\n );\n\n function commit(nextSelected: Set<string>) {\n const next = options\n .map((option) => option.value)\n .filter((value) => nextSelected.has(value));\n field.onChange(next.length === options.length ? [] : next);\n }\n\n function toggle(value: string) {\n if (readOnly) return;\n const next = new Set(selected);\n if (next.has(value)) {\n next.delete(value);\n } else {\n next.add(value);\n }\n commit(next);\n }\n\n return (\n <div\n id={fieldId}\n data-jsf-input\n role=\"group\"\n aria-label={field.label}\n className={cn(\n \"flex flex-wrap items-center gap-1.5 rounded-md border border-input bg-transparent px-2 py-1 shadow-sm\",\n controlMinHeightClass[size],\n )}\n >\n {options.map((option) => (\n <FilterPill\n key={option.value}\n label={option.label}\n mode={selected.has(option.value) ? \"active\" : \"neutral\"}\n title={\n implicitAll ? `${option.label} enabled by default` : option.label\n }\n {...(!readOnly ? { onClick: () => toggle(option.value) } : {})}\n className=\"max-w-full\"\n />\n ))}\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"json-schema-form-array.js","sources":["../../src/components/json-schema-form-array.tsx"],"sourcesContent":["import { moveItem, removeIndex, setIndex } from \"../lib/collections\";\nimport { cn } from \"../lib/utils\";\nimport { Icon } from \"../data/Icon\";\nimport { FilterPill } from \"../data/FilterPill\";\nimport { UiAdd } from \"../icons\";\nimport { Button } from \"./button\";\nimport { ItemActions } from \"./ItemActions\";\nimport {\n controlMinHeightClass,\n fieldInnerGapClass,\n inputSizeClass,\n type FormSize,\n} from \"./json-schema-form-size\";\nimport { AccordionArray } from \"./json-schema-form-accordion-array\";\nimport { CardsArray } from \"./json-schema-form-cards-array\";\nimport { FieldsGrid } from \"./json-schema-form-layout\";\nimport { scalarItemsType } from \"./json-schema-form-resolve\";\nimport { appendInstancePath } from \"./json-schema-form-errors\";\nimport { TableArray } from \"./json-schema-form-table-array\";\nimport { TagsComboboxControl } from \"./json-schema-form-tags-combobox\";\nimport { CompactListArray } from \"./json-schema-form-list-array\";\nimport {\n canAddItem,\n canRemoveItem,\n hasObjectItemProperties,\n seedFromSchema,\n toStringArray,\n} from \"./json-schema-form-utils\";\nimport type {\n FieldControl,\n FieldOption,\n RenderContext,\n} from \"./json-schema-form-types\";\n\n// A comma is the second commit key in every tag list, and what a pasted list is\n// split on. Newlines split too — see splitOnComboboxSeparators.\nconst TAG_SEPARATORS = [\",\"];\n\n// ArrayControl routes an array to the control its items call for: a flat list of\n// values (choices, scalars) is ONE tag combobox; object items are summary rows,\n// cards or a table; anything else renders a control per item with add / remove /\n// reorder. Recursion goes through ctx.render so this module never imports the\n// renderer (no import cycle).\nexport function ArrayControl({\n field,\n fieldId,\n ctx,\n}: {\n field: FieldControl;\n fieldId: string;\n ctx: RenderContext;\n}) {\n // A read-only array marks its whole subtree non-editable: no add/remove/reorder\n // and item inputs disabled (a child the schema marks readOnly still renders as\n // a value span).\n const readOnly = ctx.readOnly || field.readOnly === true;\n const choices = enumItemOptions(field);\n const scalarType = scalarItemsType(field.itemSchema);\n if (field.arrayDisplay === \"list\") {\n if (scalarType !== \"string\") {\n throw new Error(\n `${field.key} uses x-array-display list without string items`,\n );\n }\n return (\n <CompactListArray\n field={field}\n fieldId={fieldId}\n readOnly={readOnly}\n presentation={ctx.presentation === true}\n />\n );\n }\n if (field.arrayDisplay === \"filter-pills\" && choices.length > 0) {\n return (\n <FilterPillArray\n field={field}\n fieldId={fieldId}\n readOnly={readOnly}\n size={ctx.size}\n />\n );\n }\n // A list of choices is ONE control, not a stack of them: the enum item schema\n // makes the whole array a multi-select whose committed values are pills, so\n // the option set is discoverable in one dropdown instead of repeated per item.\n // `x-array-display: \"stacked\"` opts back into a combobox per item.\n if (field.arrayDisplay !== \"stacked\" && choices.length > 0) {\n return (\n <TagsComboboxControl\n field={field}\n fieldId={fieldId}\n readOnly={readOnly}\n size={ctx.size}\n options={choices}\n />\n );\n }\n // A flat list of scalars is the same gesture as the enum list above — type a\n // value, get a pill — so it takes the same control, with no options to pick\n // from and a comma as a second commit key. Numeric items commit numbers.\n if (field.arrayDisplay !== \"stacked\" && scalarType) {\n return (\n <TagsComboboxControl\n field={field}\n fieldId={fieldId}\n readOnly={readOnly}\n size={ctx.size}\n options={[]}\n itemType={scalarType}\n separators={TAG_SEPARATORS}\n />\n );\n }\n if (hasObjectItemProperties(field.itemSchema)) {\n if (field.arrayDisplay === \"cards\") {\n return <CardsArray field={field} ctx={ctx} readOnly={readOnly} />;\n }\n // The accordion is the DEFAULT for object items: stacked in full, a\n // ten-property item costs ~700px of screen each and a list of them says\n // nothing about which item is which. `x-array-display: \"stacked\"` opts back\n // into the per-item sub-form below; `x-layout: \"table\"` into the row grid.\n // An explicit accordion outranks the table, since it names the renderer.\n if (\n field.arrayDisplay === \"accordion\" ||\n (field.arrayDisplay !== \"stacked\" && field.layout !== \"table\")\n ) {\n return <AccordionArray field={field} ctx={ctx} readOnly={readOnly} />;\n }\n // `x-layout: table` renders object-item arrays as compact rows with one\n // column per item property — denser still than the summary rows.\n if (field.layout === \"table\") {\n return <TableArray field={field} ctx={ctx} readOnly={readOnly} />;\n }\n }\n const items = Array.isArray(field.value) ? field.value : [];\n const itemSchema = field.itemSchema ?? { type: \"string\" };\n const childCtx: RenderContext = { ...ctx, readOnly, depth: ctx.depth + 1 };\n\n return (\n <div\n className={cn(\n \"flex flex-col\",\n !ctx.presentation && \"rounded-md border border-input p-2\",\n fieldInnerGapClass[ctx.size],\n )}\n >\n {items.map((item, i) => (\n <div\n key={i}\n className={cn(\n \"grid items-start gap-2\",\n readOnly ? \"grid-cols-1\" : \"grid-cols-[1fr_auto]\",\n )}\n >\n {/* The item's row is a FieldWrapper (or a full-width ObjectSection),\n both of which are grid children of a FieldsGrid — inline mode's\n `grid-cols-subgrid` resolves to `none` without one, collapsing\n every item into a stacked column while the rest of the form stays\n aligned. Fixed at one column: an item is a single row, and any\n multi-column layout belongs to the item's own object body. */}\n <FieldsGrid\n layout={ctx.layout}\n size={ctx.size}\n columns={1}\n className=\"min-w-0\"\n >\n {ctx.render.renderFieldRow(\n {\n key: `${field.key}[${i}]`,\n prop: itemSchema,\n required: false,\n value: item,\n onChange: (next) => field.onChange(setIndex(items, i, next)),\n instancePath: appendInstancePath(ctx.instancePath, i),\n },\n childCtx,\n { labelOverride: `Item ${i + 1}` },\n )}\n </FieldsGrid>\n {!readOnly && (\n <ItemActions\n label={`item ${i + 1}`}\n index={i}\n count={items.length}\n size={ctx.size}\n reveal={false}\n onMove={(to) => field.onChange(moveItem(items, i, to))}\n {...(canRemoveItem(field, items.length)\n ? { onRemove: () => field.onChange(removeIndex(items, i)) }\n : {})}\n />\n )}\n </div>\n ))}\n {!readOnly && canAddItem(field, items.length) && (\n <Button\n type=\"button\"\n variant=\"outline\"\n className={cn(\"gap-1.5\", inputSizeClass[ctx.size])}\n onClick={() => field.onChange([...items, seedFromSchema(itemSchema)])}\n >\n <Icon icon={UiAdd} className=\"text-sm\" />\n Add item\n </Button>\n )}\n </div>\n );\n}\n\n// The choices an array of enum items offers, deduped by value. Prefers the\n// resolved `options` (they carry the schema's labels, icons and tones) and falls\n// back to the raw item `enum` for a field a pre-extension built by hand.\nfunction enumItemOptions(field: FieldControl): FieldOption[] {\n const rawOptions =\n field.options ??\n (Array.isArray(field.itemSchema?.enum)\n ? field.itemSchema.enum.map((value) => ({\n value: String(value),\n label: String(value),\n }))\n : []);\n const seen = new Set<string>();\n return rawOptions.filter((option) => {\n if (seen.has(option.value)) return false;\n seen.add(option.value);\n return true;\n });\n}\n\nfunction FilterPillArray({\n field,\n fieldId,\n readOnly,\n size,\n}: {\n field: FieldControl;\n fieldId: string;\n readOnly: boolean;\n size: FormSize;\n}) {\n const options = enumItemOptions(field);\n const validValues = new Set(options.map((option) => option.value));\n const explicitValues = toStringArray(field.value).filter((value) =>\n validValues.has(value),\n );\n const implicitAll = explicitValues.length === 0;\n const selected = new Set(\n implicitAll ? options.map((option) => option.value) : explicitValues,\n );\n\n function commit(nextSelected: Set<string>) {\n const next = options\n .map((option) => option.value)\n .filter((value) => nextSelected.has(value));\n field.onChange(next.length === options.length ? [] : next);\n }\n\n function toggle(value: string) {\n if (readOnly) return;\n const next = new Set(selected);\n if (next.has(value)) {\n next.delete(value);\n } else {\n next.add(value);\n }\n commit(next);\n }\n\n return (\n <div\n id={fieldId}\n data-jsf-input\n role=\"group\"\n aria-label={field.label}\n className={cn(\n \"flex flex-wrap items-center gap-1.5 rounded-md border border-input bg-transparent px-2 py-1 shadow-sm\",\n controlMinHeightClass[size],\n )}\n >\n {options.map((option) => (\n <FilterPill\n key={option.value}\n label={option.label}\n mode={selected.has(option.value) ? \"active\" : \"neutral\"}\n title={\n implicitAll ? `${option.label} enabled by default` : option.label\n }\n {...(!readOnly ? { onClick: () => toggle(option.value) } : {})}\n className=\"max-w-full\"\n />\n ))}\n </div>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -39,30 +39,40 @@ function CardsArray({
|
|
|
39
39
|
"article",
|
|
40
40
|
{
|
|
41
41
|
className: utils.cn(
|
|
42
|
-
"group rounded-lg border
|
|
42
|
+
"group rounded-lg border-l-4 border-border",
|
|
43
|
+
ctx.presentation ? "bg-muted/20" : "border shadow-sm",
|
|
43
44
|
summary.glyph ? jsonSchemaFormTone.TONE_EDGE_CLASS[summary.glyph.tone] : void 0
|
|
44
45
|
),
|
|
45
46
|
children: [
|
|
46
|
-
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
47
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
48
|
+
"header",
|
|
49
|
+
{
|
|
50
|
+
className: utils.cn(
|
|
51
|
+
"flex flex-wrap items-center gap-2 rounded-tr-md border-b border-border bg-muted/40",
|
|
52
|
+
ctx.presentation ? "px-2 py-1" : "px-3 py-2"
|
|
53
|
+
),
|
|
54
|
+
children: [
|
|
55
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "w-5 shrink-0 text-center font-mono text-xs text-muted-foreground", children: i + 1 }),
|
|
56
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "shrink-0 text-sm font-semibold", children: summary.title }),
|
|
57
|
+
/* @__PURE__ */ jsxRuntime.jsx(jsonSchemaFormItemRow.ItemBadge, { badge: summary.badge }),
|
|
58
|
+
summary.flagged && /* @__PURE__ */ jsxRuntime.jsx(jsonSchemaFormItemRow.RequiredMark, {}),
|
|
59
|
+
summary.summary && /* @__PURE__ */ jsxRuntime.jsx("code", { className: "truncate font-mono text-xs text-muted-foreground", children: summary.summary }),
|
|
60
|
+
!readOnly && /* @__PURE__ */ jsxRuntime.jsx(
|
|
61
|
+
ItemActions.ItemActions,
|
|
62
|
+
{
|
|
63
|
+
label: summary.title,
|
|
64
|
+
index: i,
|
|
65
|
+
count: items.length,
|
|
66
|
+
size: ctx.size,
|
|
67
|
+
...jsonSchemaFormItemSummary.itemActionsAllow(spec, "reorder") ? { onMove: (to) => commit(collections.moveItem(items, i, to)) } : {},
|
|
68
|
+
...jsonSchemaFormItemSummary.itemActionsAllow(spec, "duplicate") ? { onDuplicate: () => commit(collections.duplicateIndex(items, i)) } : {},
|
|
69
|
+
...jsonSchemaFormItemSummary.itemActionsAllow(spec, "remove") && jsonSchemaFormUtils.canRemoveItem(field, items.length) ? { onRemove: () => commit(collections.removeIndex(items, i)) } : {}
|
|
70
|
+
}
|
|
71
|
+
)
|
|
72
|
+
]
|
|
73
|
+
}
|
|
74
|
+
),
|
|
75
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: ctx.presentation ? "p-2" : "p-3", children: ((_b = ctx.render.renderFieldNodes(
|
|
66
76
|
{
|
|
67
77
|
key: `${field.key}[${i}]`,
|
|
68
78
|
prop: itemSchema,
|
|
@@ -79,7 +89,7 @@ function CardsArray({
|
|
|
79
89
|
);
|
|
80
90
|
}),
|
|
81
91
|
items.length === 0 && emptyCopy && /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-xs leading-snug text-muted-foreground", children: emptyCopy }),
|
|
82
|
-
!readOnly && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
92
|
+
!readOnly && jsonSchemaFormUtils.canAddItem(field, items.length) && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
83
93
|
button.Button,
|
|
84
94
|
{
|
|
85
95
|
type: "button",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json-schema-form-cards-array.cjs","sources":["../../src/components/json-schema-form-cards-array.tsx"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"file":"json-schema-form-cards-array.cjs","sources":["../../src/components/json-schema-form-cards-array.tsx"],"sourcesContent":["import {\n duplicateIndex,\n moveItem,\n removeIndex,\n setIndex,\n} from \"../lib/collections\";\nimport { cn } from \"../lib/utils\";\nimport { Icon } from \"../data/Icon\";\nimport { UiAdd } from \"../icons\";\nimport { Button } from \"./button\";\nimport { ItemActions } from \"./ItemActions\";\nimport { appendInstancePath } from \"./json-schema-form-errors\";\nimport {\n addItemLabel,\n emptyItemsCopy,\n itemActionsAllow,\n itemSummaryFor,\n resolveItemSpec,\n} from \"./json-schema-form-item-summary\";\nimport { ItemBadge, RequiredMark } from \"./json-schema-form-item-row\";\nimport { inputSizeClass } from \"./json-schema-form-size\";\nimport { TONE_EDGE_CLASS } from \"./json-schema-form-tone\";\nimport {\n canAddItem,\n canRemoveItem,\n seedFromSchema,\n} from \"./json-schema-form-utils\";\nimport type { FieldControl, RenderContext } from \"./json-schema-form-types\";\n\n// CardsArray renders an object-item array as a stack of titled cards: every\n// item stays open, but each one is headed by what it actually is rather than\n// \"Item 3\", and carries the item type's hue on its left edge so a long stack is\n// scannable at a glance.\n//\n// It is the everything-visible counterpart to AccordionArray. Both read the\n// same `x-item` summary, so a consumer switches between them by changing\n// `x-array-display` alone — no second vocabulary to learn.\nexport function CardsArray({\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 const spec = field.itemSpec ?? resolveItemSpec(field.schema, itemSchema);\n const emptyCopy = emptyItemsCopy(spec, field.schema);\n // The array's help mode governs its whole subtree, exactly as it does for the\n // accordion: a card whose fields each carry a permanent two-line paragraph is\n // back to the height the card layout exists to reclaim.\n const childCtx: RenderContext = {\n ...ctx,\n readOnly,\n depth: ctx.depth + 1,\n ...(field.helpDisplay\n ? { layout: { ...ctx.layout, help: field.helpDisplay } }\n : {}),\n };\n\n function commit(next: unknown[]) {\n field.onChange(next);\n }\n\n return (\n <div className=\"flex flex-col gap-2\">\n {items.map((item, i) => {\n const summary =\n field.itemSummary?.({ item, index: i }) ??\n itemSummaryFor({ item, index: i, spec, itemSchema });\n return (\n <article\n key={i}\n className={cn(\n \"group rounded-lg border-l-4 border-border\",\n ctx.presentation ? \"bg-muted/20\" : \"border shadow-sm\",\n summary.glyph ? TONE_EDGE_CLASS[summary.glyph.tone] : undefined,\n )}\n >\n <header\n className={cn(\n \"flex flex-wrap items-center gap-2 rounded-tr-md border-b border-border bg-muted/40\",\n ctx.presentation ? \"px-2 py-1\" : \"px-3 py-2\",\n )}\n >\n <span className=\"w-5 shrink-0 text-center font-mono text-xs text-muted-foreground\">\n {i + 1}\n </span>\n <span className=\"shrink-0 text-sm font-semibold\">\n {summary.title}\n </span>\n <ItemBadge badge={summary.badge} />\n {summary.flagged && <RequiredMark />}\n {summary.summary && (\n <code className=\"truncate font-mono text-xs text-muted-foreground\">\n {summary.summary}\n </code>\n )}\n {!readOnly && (\n <ItemActions\n label={summary.title}\n index={i}\n count={items.length}\n size={ctx.size}\n {...(itemActionsAllow(spec, \"reorder\")\n ? { onMove: (to: number) => commit(moveItem(items, i, to)) }\n : {})}\n {...(itemActionsAllow(spec, \"duplicate\")\n ? { onDuplicate: () => commit(duplicateIndex(items, i)) }\n : {})}\n {...(itemActionsAllow(spec, \"remove\") &&\n canRemoveItem(field, items.length)\n ? { onRemove: () => commit(removeIndex(items, i)) }\n : {})}\n />\n )}\n </header>\n <div className={ctx.presentation ? \"p-2\" : \"p-3\"}>\n {/* Recurse through the shared pipeline so consumer pre/post\n extensions still apply to the item and its properties — and so\n the item's own x-columns reaches its ObjectControl. */}\n {ctx.render.renderFieldNodes(\n {\n key: `${field.key}[${i}]`,\n prop: itemSchema,\n required: false,\n value: item,\n onChange: (next) => commit(setIndex(items, i, next)),\n instancePath: appendInstancePath(ctx.instancePath, i),\n },\n childCtx,\n )?.value ?? null}\n </div>\n </article>\n );\n })}\n {items.length === 0 && emptyCopy && (\n <p className=\"text-xs leading-snug text-muted-foreground\">\n {emptyCopy}\n </p>\n )}\n {!readOnly && canAddItem(field, items.length) && (\n <Button\n type=\"button\"\n variant=\"outline\"\n className={cn(\"gap-1.5 self-start\", inputSizeClass[ctx.size])}\n onClick={() => commit([...items, seedFromSchema(itemSchema)])}\n >\n <Icon icon={UiAdd} className=\"text-sm\" />\n {addItemLabel(spec)}\n </Button>\n )}\n </div>\n );\n}\n"],"names":["resolveItemSpec","emptyItemsCopy","jsxs","itemSummaryFor","cn","TONE_EDGE_CLASS","jsx","ItemBadge","RequiredMark","ItemActions","itemActionsAllow","moveItem","duplicateIndex","canRemoveItem","removeIndex","setIndex","appendInstancePath","canAddItem","Button","inputSizeClass","seedFromSchema","Icon","UiAdd","addItemLabel"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json-schema-form-cards-array.d.ts","sourceRoot":"","sources":["../../src/components/json-schema-form-cards-array.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"json-schema-form-cards-array.d.ts","sourceRoot":"","sources":["../../src/components/json-schema-form-cards-array.tsx"],"names":[],"mappings":"AA2BA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAU5E,wBAAgB,UAAU,CAAC,EACzB,KAAK,EACL,GAAG,EACH,QAAQ,GACT,EAAE;IACD,KAAK,EAAE,YAAY,CAAC;IACpB,GAAG,EAAE,aAAa,CAAC;IACnB,QAAQ,EAAE,OAAO,CAAC;CACnB,+BA+GA"}
|