@flanksource/clicky-ui 0.3.16 → 0.3.18
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/dist/ai.cjs +12 -6
- package/dist/ai.cjs.map +1 -1
- package/dist/ai.js +10 -4
- package/dist/ai.js.map +1 -1
- package/dist/chat.cjs +36 -0
- package/dist/chat.cjs.map +1 -1
- package/dist/chat.js +37 -1
- package/dist/chat.js.map +1 -1
- package/dist/components/Combobox.cjs +122 -153
- package/dist/components/Combobox.cjs.map +1 -1
- package/dist/components/Combobox.d.ts.map +1 -1
- package/dist/components/Combobox.js +124 -155
- package/dist/components/Combobox.js.map +1 -1
- package/dist/components/ComboboxControl.cjs +145 -0
- package/dist/components/ComboboxControl.cjs.map +1 -0
- package/dist/components/ComboboxControl.d.ts +37 -0
- package/dist/components/ComboboxControl.d.ts.map +1 -0
- package/dist/components/ComboboxControl.js +145 -0
- package/dist/components/ComboboxControl.js.map +1 -0
- package/dist/components/ComboboxMenu.cjs +31 -14
- package/dist/components/ComboboxMenu.cjs.map +1 -1
- package/dist/components/ComboboxMenu.d.ts.map +1 -1
- package/dist/components/ComboboxMenu.js +31 -14
- package/dist/components/ComboboxMenu.js.map +1 -1
- package/dist/components/ComboboxTags.cjs +40 -0
- package/dist/components/ComboboxTags.cjs.map +1 -0
- package/dist/components/ComboboxTags.d.ts +8 -0
- package/dist/components/ComboboxTags.d.ts.map +1 -0
- package/dist/components/ComboboxTags.js +40 -0
- package/dist/components/ComboboxTags.js.map +1 -0
- package/dist/components/ErrorWrapper.cjs +168 -0
- package/dist/components/ErrorWrapper.cjs.map +1 -0
- package/dist/components/ErrorWrapper.d.ts +19 -0
- package/dist/components/ErrorWrapper.d.ts.map +1 -0
- package/dist/components/ErrorWrapper.js +168 -0
- package/dist/components/ErrorWrapper.js.map +1 -0
- package/dist/components/FilterBar.cjs +64 -2
- package/dist/components/FilterBar.cjs.map +1 -1
- package/dist/components/FilterBar.d.ts +18 -1
- package/dist/components/FilterBar.d.ts.map +1 -1
- package/dist/components/FilterBar.js +64 -2
- package/dist/components/FilterBar.js.map +1 -1
- package/dist/components/JSONPathField.cjs +91 -0
- package/dist/components/JSONPathField.cjs.map +1 -0
- package/dist/components/JSONPathField.d.ts +19 -0
- package/dist/components/JSONPathField.d.ts.map +1 -0
- package/dist/components/JSONPathField.js +91 -0
- package/dist/components/JSONPathField.js.map +1 -0
- package/dist/components/JsonSchemaForm.cjs +8 -4
- package/dist/components/JsonSchemaForm.cjs.map +1 -1
- package/dist/components/JsonSchemaForm.d.ts.map +1 -1
- package/dist/components/JsonSchemaForm.js +8 -4
- package/dist/components/JsonSchemaForm.js.map +1 -1
- package/dist/components/TreePickerField.cjs +22 -4
- package/dist/components/TreePickerField.cjs.map +1 -1
- package/dist/components/TreePickerField.d.ts +22 -2
- package/dist/components/TreePickerField.d.ts.map +1 -1
- package/dist/components/TreePickerField.js +22 -4
- package/dist/components/TreePickerField.js.map +1 -1
- package/dist/components/TriStateToggle.cjs +53 -0
- package/dist/components/TriStateToggle.cjs.map +1 -0
- package/dist/components/TriStateToggle.d.ts +27 -0
- package/dist/components/TriStateToggle.d.ts.map +1 -0
- package/dist/components/TriStateToggle.js +53 -0
- package/dist/components/TriStateToggle.js.map +1 -0
- package/dist/components/combobox-types.d.ts +16 -1
- package/dist/components/combobox-types.d.ts.map +1 -1
- package/dist/components/combobox-utils.cjs +26 -0
- package/dist/components/combobox-utils.cjs.map +1 -1
- package/dist/components/combobox-utils.d.ts +10 -0
- package/dist/components/combobox-utils.d.ts.map +1 -1
- package/dist/components/combobox-utils.js +26 -0
- package/dist/components/combobox-utils.js.map +1 -1
- package/dist/components/filter-bar-utils.cjs +5 -0
- package/dist/components/filter-bar-utils.cjs.map +1 -1
- package/dist/components/filter-bar-utils.d.ts.map +1 -1
- package/dist/components/filter-bar-utils.js +5 -0
- package/dist/components/filter-bar-utils.js.map +1 -1
- package/dist/components/json-schema-form-accordion-array.cjs +290 -0
- package/dist/components/json-schema-form-accordion-array.cjs.map +1 -0
- package/dist/components/json-schema-form-accordion-array.d.ts +7 -0
- package/dist/components/json-schema-form-accordion-array.d.ts.map +1 -0
- package/dist/components/json-schema-form-accordion-array.js +290 -0
- package/dist/components/json-schema-form-accordion-array.js.map +1 -0
- package/dist/components/json-schema-form-array.cjs +99 -110
- package/dist/components/json-schema-form-array.cjs.map +1 -1
- package/dist/components/json-schema-form-array.d.ts +1 -1
- package/dist/components/json-schema-form-array.d.ts.map +1 -1
- package/dist/components/json-schema-form-array.js +98 -109
- package/dist/components/json-schema-form-array.js.map +1 -1
- package/dist/components/json-schema-form-error-display.cjs +4 -2
- package/dist/components/json-schema-form-error-display.cjs.map +1 -1
- package/dist/components/json-schema-form-error-display.d.ts +4 -2
- package/dist/components/json-schema-form-error-display.d.ts.map +1 -1
- package/dist/components/json-schema-form-error-display.js +4 -2
- package/dist/components/json-schema-form-error-display.js.map +1 -1
- package/dist/components/json-schema-form-extensions.cjs +10 -0
- package/dist/components/json-schema-form-extensions.cjs.map +1 -0
- package/dist/components/json-schema-form-extensions.d.ts +8 -0
- package/dist/components/json-schema-form-extensions.d.ts.map +1 -0
- package/dist/components/json-schema-form-extensions.js +10 -0
- package/dist/components/json-schema-form-extensions.js.map +1 -0
- package/dist/components/json-schema-form-fields.cjs +25 -101
- package/dist/components/json-schema-form-fields.cjs.map +1 -1
- package/dist/components/json-schema-form-fields.d.ts +1 -32
- package/dist/components/json-schema-form-fields.d.ts.map +1 -1
- package/dist/components/json-schema-form-fields.js +28 -104
- package/dist/components/json-schema-form-fields.js.map +1 -1
- package/dist/components/json-schema-form-item-summary.cjs +131 -0
- package/dist/components/json-schema-form-item-summary.cjs.map +1 -0
- package/dist/components/json-schema-form-item-summary.d.ts +13 -0
- package/dist/components/json-schema-form-item-summary.d.ts.map +1 -0
- package/dist/components/json-schema-form-item-summary.js +131 -0
- package/dist/components/json-schema-form-item-summary.js.map +1 -0
- package/dist/components/json-schema-form-layout.cjs +156 -0
- package/dist/components/json-schema-form-layout.cjs.map +1 -0
- package/dist/components/json-schema-form-layout.d.ts +43 -0
- package/dist/components/json-schema-form-layout.d.ts.map +1 -0
- package/dist/components/json-schema-form-layout.js +156 -0
- package/dist/components/json-schema-form-layout.js.map +1 -0
- package/dist/components/json-schema-form-lookup-tree.cjs +149 -0
- package/dist/components/json-schema-form-lookup-tree.cjs.map +1 -0
- package/dist/components/json-schema-form-lookup-tree.d.ts +22 -0
- package/dist/components/json-schema-form-lookup-tree.d.ts.map +1 -0
- package/dist/components/json-schema-form-lookup-tree.js +149 -0
- package/dist/components/json-schema-form-lookup-tree.js.map +1 -0
- package/dist/components/json-schema-form-object.cjs +11 -4
- package/dist/components/json-schema-form-object.cjs.map +1 -1
- package/dist/components/json-schema-form-object.d.ts.map +1 -1
- package/dist/components/json-schema-form-object.js +11 -4
- package/dist/components/json-schema-form-object.js.map +1 -1
- package/dist/components/json-schema-form-render.cjs +51 -28
- package/dist/components/json-schema-form-render.cjs.map +1 -1
- package/dist/components/json-schema-form-render.d.ts.map +1 -1
- package/dist/components/json-schema-form-render.js +51 -28
- package/dist/components/json-schema-form-render.js.map +1 -1
- package/dist/components/json-schema-form-resolve.cjs +62 -13
- package/dist/components/json-schema-form-resolve.cjs.map +1 -1
- package/dist/components/json-schema-form-resolve.d.ts +1 -0
- package/dist/components/json-schema-form-resolve.d.ts.map +1 -1
- package/dist/components/json-schema-form-resolve.js +62 -13
- package/dist/components/json-schema-form-resolve.js.map +1 -1
- package/dist/components/json-schema-form-table-array.cjs +123 -0
- package/dist/components/json-schema-form-table-array.cjs.map +1 -0
- package/dist/components/json-schema-form-table-array.d.ts +7 -0
- package/dist/components/json-schema-form-table-array.d.ts.map +1 -0
- package/dist/components/json-schema-form-table-array.js +123 -0
- package/dist/components/json-schema-form-table-array.js.map +1 -0
- package/dist/components/json-schema-form-tone.cjs +34 -0
- package/dist/components/json-schema-form-tone.cjs.map +1 -0
- package/dist/components/json-schema-form-tone.d.ts +8 -0
- package/dist/components/json-schema-form-tone.d.ts.map +1 -0
- package/dist/components/json-schema-form-tone.js +34 -0
- package/dist/components/json-schema-form-tone.js.map +1 -0
- package/dist/components/json-schema-form-types.d.ts +79 -10
- package/dist/components/json-schema-form-types.d.ts.map +1 -1
- package/dist/components/json-schema-form-utils.cjs +47 -4
- package/dist/components/json-schema-form-utils.cjs.map +1 -1
- package/dist/components/json-schema-form-utils.d.ts +19 -4
- package/dist/components/json-schema-form-utils.d.ts.map +1 -1
- package/dist/components/json-schema-form-utils.js +47 -4
- package/dist/components/json-schema-form-utils.js.map +1 -1
- package/dist/components/tri-state.cjs +8 -0
- package/dist/components/tri-state.cjs.map +1 -0
- package/dist/components/tri-state.d.ts +5 -0
- package/dist/components/tri-state.d.ts.map +1 -0
- package/dist/components/tri-state.js +8 -0
- package/dist/components/tri-state.js.map +1 -0
- package/dist/components/useComboboxLayout.cjs +59 -0
- package/dist/components/useComboboxLayout.cjs.map +1 -0
- package/dist/components/useComboboxLayout.d.ts +5 -0
- package/dist/components/useComboboxLayout.d.ts.map +1 -0
- package/dist/components/useComboboxLayout.js +59 -0
- package/dist/components/useComboboxLayout.js.map +1 -0
- package/dist/components.cjs +21 -0
- package/dist/components.cjs.map +1 -1
- package/dist/components.d.ts +14 -4
- package/dist/components.d.ts.map +1 -1
- package/dist/components.js +22 -1
- package/dist/components.js.map +1 -1
- package/dist/data/Clicky.cjs +51 -2
- package/dist/data/Clicky.cjs.map +1 -1
- package/dist/data/Clicky.d.ts +10 -1
- package/dist/data/Clicky.d.ts.map +1 -1
- package/dist/data/Clicky.js +51 -2
- package/dist/data/Clicky.js.map +1 -1
- package/dist/data/DataTable.cjs +215 -63
- package/dist/data/DataTable.cjs.map +1 -1
- package/dist/data/DataTable.d.ts +65 -3
- package/dist/data/DataTable.d.ts.map +1 -1
- package/dist/data/DataTable.js +215 -63
- package/dist/data/DataTable.js.map +1 -1
- package/dist/data/LogsTable.cjs +10 -1
- package/dist/data/LogsTable.cjs.map +1 -1
- package/dist/data/LogsTable.d.ts +3 -1
- package/dist/data/LogsTable.d.ts.map +1 -1
- package/dist/data/LogsTable.js +10 -1
- package/dist/data/LogsTable.js.map +1 -1
- package/dist/data/ServerTimingBadge.cjs +64 -0
- package/dist/data/ServerTimingBadge.cjs.map +1 -0
- package/dist/data/ServerTimingBadge.d.ts +9 -0
- package/dist/data/ServerTimingBadge.d.ts.map +1 -0
- package/dist/data/ServerTimingBadge.js +64 -0
- package/dist/data/ServerTimingBadge.js.map +1 -0
- package/dist/data/TaskManager.cjs +99 -14
- package/dist/data/TaskManager.cjs.map +1 -1
- package/dist/data/TaskManager.d.ts.map +1 -1
- package/dist/data/TaskManager.js +100 -15
- package/dist/data/TaskManager.js.map +1 -1
- package/dist/data/TaskProgress.cjs +50 -11
- 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 +50 -11
- package/dist/data/TaskProgress.js.map +1 -1
- package/dist/data/ai/AdvancedChatConfig.cjs +289 -0
- package/dist/data/ai/AdvancedChatConfig.cjs.map +1 -0
- package/dist/data/ai/AdvancedChatConfig.d.ts +21 -0
- package/dist/data/ai/AdvancedChatConfig.d.ts.map +1 -0
- package/dist/data/ai/AdvancedChatConfig.js +289 -0
- package/dist/data/ai/AdvancedChatConfig.js.map +1 -0
- package/dist/data/ai/AdvancedCostsPanel.cjs +120 -0
- package/dist/data/ai/AdvancedCostsPanel.cjs.map +1 -0
- package/dist/data/ai/AdvancedCostsPanel.d.ts +16 -0
- package/dist/data/ai/AdvancedCostsPanel.d.ts.map +1 -0
- package/dist/data/ai/AdvancedCostsPanel.js +120 -0
- package/dist/data/ai/AdvancedCostsPanel.js.map +1 -0
- package/dist/data/ai/ChatWindow.catalogs.cjs +74 -0
- package/dist/data/ai/ChatWindow.catalogs.cjs.map +1 -0
- package/dist/data/ai/ChatWindow.catalogs.d.ts +16 -0
- package/dist/data/ai/ChatWindow.catalogs.d.ts.map +1 -0
- package/dist/data/ai/ChatWindow.catalogs.js +74 -0
- package/dist/data/ai/ChatWindow.catalogs.js.map +1 -0
- package/dist/data/ai/ChatWindow.cjs +86 -100
- package/dist/data/ai/ChatWindow.cjs.map +1 -1
- package/dist/data/ai/ChatWindow.d.ts +1 -1
- package/dist/data/ai/ChatWindow.d.ts.map +1 -1
- package/dist/data/ai/ChatWindow.js +88 -102
- package/dist/data/ai/ChatWindow.js.map +1 -1
- package/dist/data/ai/ChatWindow.preferences.cjs.map +1 -1
- package/dist/data/ai/ChatWindow.preferences.d.ts +2 -4
- package/dist/data/ai/ChatWindow.preferences.d.ts.map +1 -1
- package/dist/data/ai/ChatWindow.preferences.js.map +1 -1
- package/dist/data/ai/ChatWindow.runtime.cjs +120 -0
- package/dist/data/ai/ChatWindow.runtime.cjs.map +1 -0
- package/dist/data/ai/ChatWindow.runtime.d.ts +20 -0
- package/dist/data/ai/ChatWindow.runtime.d.ts.map +1 -0
- package/dist/data/ai/ChatWindow.runtime.js +120 -0
- package/dist/data/ai/ChatWindow.runtime.js.map +1 -0
- package/dist/data/ai/ChatWindow.thread-status.cjs +14 -0
- package/dist/data/ai/ChatWindow.thread-status.cjs.map +1 -0
- package/dist/data/ai/ChatWindow.thread-status.d.ts +5 -0
- package/dist/data/ai/ChatWindow.thread-status.d.ts.map +1 -0
- package/dist/data/ai/ChatWindow.thread-status.js +14 -0
- package/dist/data/ai/ChatWindow.thread-status.js.map +1 -0
- package/dist/data/ai/ChatWindow.thread.cjs +68 -0
- package/dist/data/ai/ChatWindow.thread.cjs.map +1 -0
- package/dist/data/ai/ChatWindow.thread.d.ts +16 -0
- package/dist/data/ai/ChatWindow.thread.d.ts.map +1 -0
- package/dist/data/ai/ChatWindow.thread.js +68 -0
- package/dist/data/ai/ChatWindow.thread.js.map +1 -0
- package/dist/data/ai/ChatWindow.tool-catalog.cjs +20 -0
- package/dist/data/ai/ChatWindow.tool-catalog.cjs.map +1 -1
- package/dist/data/ai/ChatWindow.tool-catalog.d.ts +17 -1
- package/dist/data/ai/ChatWindow.tool-catalog.d.ts.map +1 -1
- package/dist/data/ai/ChatWindow.tool-catalog.js +20 -0
- package/dist/data/ai/ChatWindow.tool-catalog.js.map +1 -1
- package/dist/data/ai/ChatWindow.types.d.ts +13 -5
- package/dist/data/ai/ChatWindow.types.d.ts.map +1 -1
- package/dist/data/ai/ChatWindowManager.cjs +3 -1
- package/dist/data/ai/ChatWindowManager.cjs.map +1 -1
- package/dist/data/ai/ChatWindowManager.d.ts.map +1 -1
- package/dist/data/ai/ChatWindowManager.js +3 -1
- package/dist/data/ai/ChatWindowManager.js.map +1 -1
- package/dist/data/ai/PromptPicker/PromptPicker.cjs +1 -1
- package/dist/data/ai/PromptPicker/PromptPicker.cjs.map +1 -1
- package/dist/data/ai/PromptPicker/PromptPicker.d.ts +1 -1
- package/dist/data/ai/PromptPicker/PromptPicker.d.ts.map +1 -1
- package/dist/data/ai/PromptPicker/PromptPicker.js +1 -1
- package/dist/data/ai/PromptPicker/PromptPicker.js.map +1 -1
- package/dist/data/ai/PromptRunEditor/index.cjs +101 -89
- package/dist/data/ai/PromptRunEditor/index.cjs.map +1 -1
- package/dist/data/ai/PromptRunEditor/index.d.ts +6 -10
- package/dist/data/ai/PromptRunEditor/index.d.ts.map +1 -1
- package/dist/data/ai/PromptRunEditor/index.js +103 -91
- package/dist/data/ai/PromptRunEditor/index.js.map +1 -1
- package/dist/data/ai/PromptRunEditor/model.cjs +47 -0
- package/dist/data/ai/PromptRunEditor/model.cjs.map +1 -0
- package/dist/data/ai/PromptRunEditor/model.d.ts +17 -0
- package/dist/data/ai/PromptRunEditor/model.d.ts.map +1 -0
- package/dist/data/ai/PromptRunEditor/model.js +47 -0
- package/dist/data/ai/PromptRunEditor/model.js.map +1 -0
- package/dist/data/ai/RuntimeModePicker.cjs +1 -1
- package/dist/data/ai/RuntimeModePicker.cjs.map +1 -1
- package/dist/data/ai/RuntimeModePicker.d.ts +1 -1
- package/dist/data/ai/RuntimeModePicker.d.ts.map +1 -1
- package/dist/data/ai/RuntimeModePicker.js +1 -1
- package/dist/data/ai/RuntimeModePicker.js.map +1 -1
- package/dist/data/ai/SessionInspector.files.cjs +26 -43
- package/dist/data/ai/SessionInspector.files.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.files.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.files.js +26 -43
- package/dist/data/ai/SessionInspector.files.js.map +1 -1
- package/dist/data/ai/SessionInspector.hierarchy.cjs +1 -1
- package/dist/data/ai/SessionInspector.hierarchy.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.hierarchy.js +1 -1
- package/dist/data/ai/SessionInspector.hierarchy.js.map +1 -1
- package/dist/data/ai/SessionInspector.model.cjs +1 -1
- package/dist/data/ai/SessionInspector.model.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.model.js +1 -1
- package/dist/data/ai/SessionInspector.model.js.map +1 -1
- package/dist/data/ai/SessionViewer.header.cjs +17 -9
- package/dist/data/ai/SessionViewer.header.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.header.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.header.js +17 -9
- package/dist/data/ai/SessionViewer.header.js.map +1 -1
- package/dist/data/ai/SessionViewer.model.cjs +2 -0
- package/dist/data/ai/SessionViewer.model.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.model.d.ts +4 -0
- package/dist/data/ai/SessionViewer.model.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.model.js +2 -0
- package/dist/data/ai/SessionViewer.model.js.map +1 -1
- package/dist/data/ai/SessionViewer.rows.cjs +4 -16
- package/dist/data/ai/SessionViewer.rows.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.rows.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.rows.js +4 -16
- package/dist/data/ai/SessionViewer.rows.js.map +1 -1
- package/dist/data/ai/SessionViewer.unified.d.ts +1 -0
- package/dist/data/ai/SessionViewer.unified.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/ModelSection.cjs +12 -3
- package/dist/data/ai/SpecRuntimeEditor/ModelSection.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/ModelSection.d.ts +1 -1
- package/dist/data/ai/SpecRuntimeEditor/ModelSection.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/ModelSection.js +12 -3
- package/dist/data/ai/SpecRuntimeEditor/ModelSection.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/VerifySection.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/VerifySection.d.ts +1 -1
- package/dist/data/ai/SpecRuntimeEditor/VerifySection.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/VerifySection.js.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/index.cjs.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/index.d.ts +2 -2
- package/dist/data/ai/SpecRuntimeEditor/index.d.ts.map +1 -1
- package/dist/data/ai/SpecRuntimeEditor/index.js.map +1 -1
- package/dist/data/ai/ThreadPicker.cjs +65 -3
- package/dist/data/ai/ThreadPicker.cjs.map +1 -1
- package/dist/data/ai/ThreadPicker.d.ts +13 -5
- package/dist/data/ai/ThreadPicker.d.ts.map +1 -1
- package/dist/data/ai/ThreadPicker.js +65 -3
- package/dist/data/ai/ThreadPicker.js.map +1 -1
- package/dist/data/ai/ToolPreferences.cjs +65 -685
- package/dist/data/ai/ToolPreferences.cjs.map +1 -1
- package/dist/data/ai/ToolPreferences.d.ts +15 -17
- package/dist/data/ai/ToolPreferences.d.ts.map +1 -1
- package/dist/data/ai/ToolPreferences.js +64 -683
- package/dist/data/ai/ToolPreferences.js.map +1 -1
- package/dist/data/ai/ToolPreferences.model.cjs +148 -0
- package/dist/data/ai/ToolPreferences.model.cjs.map +1 -0
- package/dist/data/ai/ToolPreferences.model.d.ts +31 -0
- package/dist/data/ai/ToolPreferences.model.d.ts.map +1 -0
- package/dist/data/ai/ToolPreferences.model.js +148 -0
- package/dist/data/ai/ToolPreferences.model.js.map +1 -0
- package/dist/data/ai/ToolPreferencesList.cjs +270 -0
- package/dist/data/ai/ToolPreferencesList.cjs.map +1 -0
- package/dist/data/ai/ToolPreferencesList.d.ts +18 -0
- package/dist/data/ai/ToolPreferencesList.d.ts.map +1 -0
- package/dist/data/ai/ToolPreferencesList.js +270 -0
- package/dist/data/ai/ToolPreferencesList.js.map +1 -0
- package/dist/data/ai/agent-action-icons.cjs.map +1 -1
- package/dist/data/ai/agent-action-icons.js.map +1 -1
- package/dist/data/ai/chat-window-context.cjs +4 -1
- package/dist/data/ai/chat-window-context.cjs.map +1 -1
- package/dist/data/ai/chat-window-context.d.ts +7 -0
- package/dist/data/ai/chat-window-context.d.ts.map +1 -1
- package/dist/data/ai/chat-window-context.js +4 -1
- package/dist/data/ai/chat-window-context.js.map +1 -1
- package/dist/data/ai/index.d.ts +7 -3
- package/dist/data/ai/index.d.ts.map +1 -1
- package/dist/data/ai/session-tones.cjs +67 -0
- package/dist/data/ai/session-tones.cjs.map +1 -0
- package/dist/data/ai/session-tones.d.ts +34 -0
- package/dist/data/ai/session-tones.d.ts.map +1 -0
- package/dist/data/ai/session-tones.js +67 -0
- package/dist/data/ai/session-tones.js.map +1 -0
- package/dist/data/ai/thread-costs.cjs +39 -0
- package/dist/data/ai/thread-costs.cjs.map +1 -0
- package/dist/data/ai/thread-costs.d.ts +62 -0
- package/dist/data/ai/thread-costs.d.ts.map +1 -0
- package/dist/data/ai/thread-costs.js +39 -0
- package/dist/data/ai/thread-costs.js.map +1 -0
- package/dist/data/cells/CellFilterActions.cjs +68 -0
- package/dist/data/cells/CellFilterActions.cjs.map +1 -0
- package/dist/data/cells/CellFilterActions.d.ts +15 -0
- package/dist/data/cells/CellFilterActions.d.ts.map +1 -0
- package/dist/data/cells/CellFilterActions.js +68 -0
- package/dist/data/cells/CellFilterActions.js.map +1 -0
- package/dist/data/chat/Chat.cjs +192 -80
- package/dist/data/chat/Chat.cjs.map +1 -1
- package/dist/data/chat/Chat.d.ts +24 -4
- package/dist/data/chat/Chat.d.ts.map +1 -1
- package/dist/data/chat/Chat.fixtures.cjs +48 -3
- package/dist/data/chat/Chat.fixtures.cjs.map +1 -1
- package/dist/data/chat/Chat.fixtures.d.ts +1 -1
- package/dist/data/chat/Chat.fixtures.d.ts.map +1 -1
- package/dist/data/chat/Chat.fixtures.js +48 -3
- package/dist/data/chat/Chat.fixtures.js.map +1 -1
- package/dist/data/chat/Chat.js +195 -83
- package/dist/data/chat/Chat.js.map +1 -1
- package/dist/data/chat/Chat.runtime.cjs +63 -0
- package/dist/data/chat/Chat.runtime.cjs.map +1 -0
- package/dist/data/chat/Chat.runtime.d.ts +16 -0
- package/dist/data/chat/Chat.runtime.d.ts.map +1 -0
- package/dist/data/chat/Chat.runtime.js +63 -0
- package/dist/data/chat/Chat.runtime.js.map +1 -0
- package/dist/data/chat/ChatRuntimeToolbar.cjs +62 -0
- package/dist/data/chat/ChatRuntimeToolbar.cjs.map +1 -0
- package/dist/data/chat/ChatRuntimeToolbar.d.ts +14 -0
- package/dist/data/chat/ChatRuntimeToolbar.d.ts.map +1 -0
- package/dist/data/chat/ChatRuntimeToolbar.js +62 -0
- package/dist/data/chat/ChatRuntimeToolbar.js.map +1 -0
- package/dist/data/chat/ContextMeter.cjs +144 -73
- package/dist/data/chat/ContextMeter.cjs.map +1 -1
- package/dist/data/chat/ContextMeter.d.ts +8 -3
- package/dist/data/chat/ContextMeter.d.ts.map +1 -1
- package/dist/data/chat/ContextMeter.js +144 -73
- package/dist/data/chat/ContextMeter.js.map +1 -1
- package/dist/data/chat/ToolCall.cjs +86 -24
- package/dist/data/chat/ToolCall.cjs.map +1 -1
- package/dist/data/chat/ToolCall.d.ts +12 -5
- package/dist/data/chat/ToolCall.d.ts.map +1 -1
- package/dist/data/chat/ToolCall.js +86 -24
- package/dist/data/chat/ToolCall.js.map +1 -1
- package/dist/data/chat/approval.cjs +64 -0
- package/dist/data/chat/approval.cjs.map +1 -0
- package/dist/data/chat/approval.d.ts +18 -0
- package/dist/data/chat/approval.d.ts.map +1 -0
- package/dist/data/chat/approval.js +64 -0
- package/dist/data/chat/approval.js.map +1 -0
- package/dist/data/chat/index.d.ts +5 -3
- package/dist/data/chat/index.d.ts.map +1 -1
- package/dist/data/chat/tool-render/ToolArgs.cjs +50 -0
- package/dist/data/chat/tool-render/ToolArgs.cjs.map +1 -0
- package/dist/data/chat/tool-render/ToolArgs.d.ts +7 -0
- package/dist/data/chat/tool-render/ToolArgs.d.ts.map +1 -0
- package/dist/data/chat/tool-render/ToolArgs.js +50 -0
- package/dist/data/chat/tool-render/ToolArgs.js.map +1 -0
- package/dist/data/chat/tool-render/ToolParams.cjs +155 -0
- package/dist/data/chat/tool-render/ToolParams.cjs.map +1 -0
- package/dist/data/chat/tool-render/ToolParams.d.ts +20 -0
- package/dist/data/chat/tool-render/ToolParams.d.ts.map +1 -0
- package/dist/data/chat/tool-render/ToolParams.js +155 -0
- package/dist/data/chat/tool-render/ToolParams.js.map +1 -0
- package/dist/data/chat/tool-render/ToolValue.cjs +140 -0
- package/dist/data/chat/tool-render/ToolValue.cjs.map +1 -0
- package/dist/data/chat/tool-render/ToolValue.d.ts +16 -0
- package/dist/data/chat/tool-render/ToolValue.d.ts.map +1 -0
- package/dist/data/chat/tool-render/ToolValue.js +140 -0
- package/dist/data/chat/tool-render/ToolValue.js.map +1 -0
- package/dist/data/chat/tool-render/adapter.cjs +48 -0
- package/dist/data/chat/tool-render/adapter.cjs.map +1 -0
- package/dist/data/chat/tool-render/adapter.d.ts +57 -0
- package/dist/data/chat/tool-render/adapter.d.ts.map +1 -0
- package/dist/data/chat/tool-render/adapter.js +48 -0
- package/dist/data/chat/tool-render/adapter.js.map +1 -0
- package/dist/data/chat/tool-render/context.cjs +16 -0
- package/dist/data/chat/tool-render/context.cjs.map +1 -0
- package/dist/data/chat/tool-render/context.d.ts +6 -0
- package/dist/data/chat/tool-render/context.d.ts.map +1 -0
- package/dist/data/chat/tool-render/context.js +16 -0
- package/dist/data/chat/tool-render/context.js.map +1 -0
- package/dist/data/chat/tool-render/defaults.cjs +45 -0
- package/dist/data/chat/tool-render/defaults.cjs.map +1 -0
- package/dist/data/chat/tool-render/defaults.d.ts +11 -0
- package/dist/data/chat/tool-render/defaults.d.ts.map +1 -0
- package/dist/data/chat/tool-render/defaults.js +45 -0
- package/dist/data/chat/tool-render/defaults.js.map +1 -0
- package/dist/data/chat/tool-render/index.d.ts +13 -0
- package/dist/data/chat/tool-render/index.d.ts.map +1 -0
- package/dist/data/chat/tool-render/known-tool-views.cjs +208 -0
- package/dist/data/chat/tool-render/known-tool-views.cjs.map +1 -0
- package/dist/data/chat/tool-render/known-tool-views.d.ts +10 -0
- package/dist/data/chat/tool-render/known-tool-views.d.ts.map +1 -0
- package/dist/data/chat/tool-render/known-tool-views.js +208 -0
- package/dist/data/chat/tool-render/known-tool-views.js.map +1 -0
- package/dist/data/chat/tool-render/known-tools.cjs +58 -0
- package/dist/data/chat/tool-render/known-tools.cjs.map +1 -0
- package/dist/data/chat/tool-render/known-tools.d.ts +4 -0
- package/dist/data/chat/tool-render/known-tools.d.ts.map +1 -0
- package/dist/data/chat/tool-render/known-tools.js +58 -0
- package/dist/data/chat/tool-render/known-tools.js.map +1 -0
- package/dist/data/chat/tool-render/normalize.cjs +42 -0
- package/dist/data/chat/tool-render/normalize.cjs.map +1 -0
- package/dist/data/chat/tool-render/normalize.d.ts +13 -0
- package/dist/data/chat/tool-render/normalize.d.ts.map +1 -0
- package/dist/data/chat/tool-render/normalize.js +42 -0
- package/dist/data/chat/tool-render/normalize.js.map +1 -0
- package/dist/data/chat/tool-render/registry.cjs +14 -0
- package/dist/data/chat/tool-render/registry.cjs.map +1 -0
- package/dist/data/chat/tool-render/registry.d.ts +7 -0
- package/dist/data/chat/tool-render/registry.d.ts.map +1 -0
- package/dist/data/chat/tool-render/registry.js +14 -0
- package/dist/data/chat/tool-render/registry.js.map +1 -0
- package/dist/data/chat/tool-render/schema.cjs +57 -0
- package/dist/data/chat/tool-render/schema.cjs.map +1 -0
- package/dist/data/chat/tool-render/schema.d.ts +28 -0
- package/dist/data/chat/tool-render/schema.d.ts.map +1 -0
- package/dist/data/chat/tool-render/schema.js +57 -0
- package/dist/data/chat/tool-render/schema.js.map +1 -0
- package/dist/data/chat/tool-render/shape.cjs +94 -0
- package/dist/data/chat/tool-render/shape.cjs.map +1 -0
- package/dist/data/chat/tool-render/shape.d.ts +39 -0
- package/dist/data/chat/tool-render/shape.d.ts.map +1 -0
- package/dist/data/chat/tool-render/shape.js +94 -0
- package/dist/data/chat/tool-render/shape.js.map +1 -0
- package/dist/data/chat/tool-render/summary.cjs +34 -0
- package/dist/data/chat/tool-render/summary.cjs.map +1 -0
- package/dist/data/chat/tool-render/summary.d.ts +8 -0
- package/dist/data/chat/tool-render/summary.d.ts.map +1 -0
- package/dist/data/chat/tool-render/summary.js +34 -0
- package/dist/data/chat/tool-render/summary.js.map +1 -0
- package/dist/data/chat/types.cjs.map +1 -1
- package/dist/data/chat/types.d.ts +19 -0
- package/dist/data/chat/types.d.ts.map +1 -1
- package/dist/data/chat/types.js.map +1 -1
- package/dist/data/chat/usage-snapshot.cjs +17 -0
- package/dist/data/chat/usage-snapshot.cjs.map +1 -0
- package/dist/data/chat/usage-snapshot.d.ts +21 -0
- package/dist/data/chat/usage-snapshot.d.ts.map +1 -0
- package/dist/data/chat/usage-snapshot.js +17 -0
- package/dist/data/chat/usage-snapshot.js.map +1 -0
- package/dist/data/data-table-filter-values.cjs +83 -0
- package/dist/data/data-table-filter-values.cjs.map +1 -0
- package/dist/data/data-table-filter-values.d.ts +18 -0
- package/dist/data/data-table-filter-values.d.ts.map +1 -0
- package/dist/data/data-table-filter-values.js +83 -0
- package/dist/data/data-table-filter-values.js.map +1 -0
- package/dist/data/data-table-server-filters.cjs +171 -0
- package/dist/data/data-table-server-filters.cjs.map +1 -0
- package/dist/data/data-table-server-filters.d.ts +128 -0
- package/dist/data/data-table-server-filters.d.ts.map +1 -0
- package/dist/data/data-table-server-filters.js +171 -0
- package/dist/data/data-table-server-filters.js.map +1 -0
- package/dist/data/query-browser/QueryBrowser.cjs +96 -19
- package/dist/data/query-browser/QueryBrowser.cjs.map +1 -1
- package/dist/data/query-browser/QueryBrowser.d.ts +37 -6
- package/dist/data/query-browser/QueryBrowser.d.ts.map +1 -1
- package/dist/data/query-browser/QueryBrowser.js +96 -19
- package/dist/data/query-browser/QueryBrowser.js.map +1 -1
- package/dist/data/query-browser/index.d.ts +1 -1
- package/dist/data/query-browser/index.d.ts.map +1 -1
- package/dist/data/runtime/ProviderStatusPanel.cjs +187 -0
- package/dist/data/runtime/ProviderStatusPanel.cjs.map +1 -0
- package/dist/data/runtime/ProviderStatusPanel.d.ts +10 -0
- package/dist/data/runtime/ProviderStatusPanel.d.ts.map +1 -0
- package/dist/data/runtime/ProviderStatusPanel.js +187 -0
- package/dist/data/runtime/ProviderStatusPanel.js.map +1 -0
- package/dist/data/runtime/RuntimeBar.cjs +147 -0
- package/dist/data/runtime/RuntimeBar.cjs.map +1 -0
- package/dist/data/runtime/RuntimeBar.d.ts +22 -0
- package/dist/data/runtime/RuntimeBar.d.ts.map +1 -0
- package/dist/data/runtime/RuntimeBar.js +147 -0
- package/dist/data/runtime/RuntimeBar.js.map +1 -0
- package/dist/data/runtime/RuntimeBar.model.cjs +14 -0
- package/dist/data/runtime/RuntimeBar.model.cjs.map +1 -0
- package/dist/data/runtime/RuntimeBar.model.d.ts +10 -0
- package/dist/data/runtime/RuntimeBar.model.d.ts.map +1 -0
- package/dist/data/runtime/RuntimeBar.model.js +14 -0
- package/dist/data/runtime/RuntimeBar.model.js.map +1 -0
- package/dist/data/runtime/RuntimeBarCombo.cjs +354 -0
- package/dist/data/runtime/RuntimeBarCombo.cjs.map +1 -0
- package/dist/data/runtime/RuntimeBarCombo.d.ts +23 -0
- package/dist/data/runtime/RuntimeBarCombo.d.ts.map +1 -0
- package/dist/data/runtime/RuntimeBarCombo.js +354 -0
- package/dist/data/runtime/RuntimeBarCombo.js.map +1 -0
- package/dist/data/{ai/RuntimeBar.cjs → runtime/RuntimeBarSegments.cjs} +93 -87
- package/dist/data/runtime/RuntimeBarSegments.cjs.map +1 -0
- package/dist/data/runtime/RuntimeBarSegments.d.ts +25 -0
- package/dist/data/runtime/RuntimeBarSegments.d.ts.map +1 -0
- package/dist/data/{ai/RuntimeBar.js → runtime/RuntimeBarSegments.js} +96 -90
- package/dist/data/runtime/RuntimeBarSegments.js.map +1 -0
- package/dist/data/runtime/availability.cjs +11 -0
- package/dist/data/runtime/availability.cjs.map +1 -0
- package/dist/data/runtime/availability.d.ts +6 -0
- package/dist/data/runtime/availability.d.ts.map +1 -0
- package/dist/data/runtime/availability.js +11 -0
- package/dist/data/runtime/availability.js.map +1 -0
- package/dist/data/{ai → runtime}/model-capabilities.cjs +12 -1
- package/dist/data/runtime/model-capabilities.cjs.map +1 -0
- package/dist/data/{ai → runtime}/model-capabilities.d.ts +2 -6
- package/dist/data/runtime/model-capabilities.d.ts.map +1 -0
- package/dist/data/{ai → runtime}/model-capabilities.js +12 -1
- package/dist/data/runtime/model-capabilities.js.map +1 -0
- package/dist/data/runtime/provider-status.cjs +106 -0
- package/dist/data/runtime/provider-status.cjs.map +1 -0
- package/dist/data/runtime/provider-status.d.ts +24 -0
- package/dist/data/runtime/provider-status.d.ts.map +1 -0
- package/dist/data/runtime/provider-status.js +106 -0
- package/dist/data/runtime/provider-status.js.map +1 -0
- package/dist/data/{ai → runtime}/runtime-mode.cjs +123 -22
- package/dist/data/runtime/runtime-mode.cjs.map +1 -0
- package/dist/data/{ai → runtime}/runtime-mode.d.ts +8 -1
- package/dist/data/runtime/runtime-mode.d.ts.map +1 -0
- package/dist/data/{ai → runtime}/runtime-mode.js +123 -22
- package/dist/data/runtime/runtime-mode.js.map +1 -0
- package/dist/data/server-timing.cjs +120 -0
- package/dist/data/server-timing.cjs.map +1 -0
- package/dist/data/server-timing.d.ts +11 -0
- package/dist/data/server-timing.d.ts.map +1 -0
- package/dist/data/server-timing.js +120 -0
- package/dist/data/server-timing.js.map +1 -0
- package/dist/data/task-query-keys.cjs +26 -0
- package/dist/data/task-query-keys.cjs.map +1 -0
- package/dist/data/task-query-keys.d.ts +27 -0
- package/dist/data/task-query-keys.d.ts.map +1 -0
- package/dist/data/task-query-keys.js +26 -0
- package/dist/data/task-query-keys.js.map +1 -0
- package/dist/data/version-info.cjs +3 -3
- package/dist/data/version-info.js +3 -3
- package/dist/data.cjs +23 -0
- package/dist/data.cjs.map +1 -1
- package/dist/data.d.ts +8 -2
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +23 -0
- package/dist/data.js.map +1 -1
- package/dist/hooks/use-hotkey.cjs +6 -1
- package/dist/hooks/use-hotkey.cjs.map +1 -1
- package/dist/hooks/use-hotkey.d.ts.map +1 -1
- package/dist/hooks/use-hotkey.js +6 -1
- package/dist/hooks/use-hotkey.js.map +1 -1
- package/dist/hooks/use-task-run.cjs +7 -4
- package/dist/hooks/use-task-run.cjs.map +1 -1
- package/dist/hooks/use-task-run.d.ts +12 -0
- package/dist/hooks/use-task-run.d.ts.map +1 -1
- package/dist/hooks/use-task-run.js +7 -4
- package/dist/hooks/use-task-run.js.map +1 -1
- package/dist/icons/index.d.ts +1 -0
- package/dist/icons/index.d.ts.map +1 -1
- package/dist/icons/registry.cjs +692 -0
- package/dist/icons/registry.cjs.map +1 -0
- package/dist/icons/registry.d.ts +21 -0
- package/dist/icons/registry.d.ts.map +1 -0
- package/dist/icons/registry.js +692 -0
- package/dist/icons/registry.js.map +1 -0
- package/dist/icons.cjs +3 -0
- package/dist/icons.cjs.map +1 -1
- package/dist/icons.js +4 -1
- package/dist/icons.js.map +1 -1
- package/dist/index.cjs +54 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +56 -2
- package/dist/index.js.map +1 -1
- package/dist/layout/AppShell.cjs +93 -57
- package/dist/layout/AppShell.cjs.map +1 -1
- package/dist/layout/AppShell.d.ts +49 -1
- package/dist/layout/AppShell.d.ts.map +1 -1
- package/dist/layout/AppShell.js +93 -57
- package/dist/layout/AppShell.js.map +1 -1
- package/dist/layout/AppShell.nav.cjs +144 -19
- package/dist/layout/AppShell.nav.cjs.map +1 -1
- package/dist/layout/AppShell.nav.d.ts +6 -1
- package/dist/layout/AppShell.nav.d.ts.map +1 -1
- package/dist/layout/AppShell.nav.js +144 -19
- package/dist/layout/AppShell.nav.js.map +1 -1
- package/dist/layout/SplitPane.cjs +23 -7
- package/dist/layout/SplitPane.cjs.map +1 -1
- package/dist/layout/SplitPane.d.ts +3 -1
- package/dist/layout/SplitPane.d.ts.map +1 -1
- package/dist/layout/SplitPane.js +23 -7
- package/dist/layout/SplitPane.js.map +1 -1
- package/dist/lib/format.cjs +86 -4
- package/dist/lib/format.cjs.map +1 -1
- package/dist/lib/format.d.ts +69 -0
- package/dist/lib/format.d.ts.map +1 -1
- package/dist/lib/format.js +86 -4
- package/dist/lib/format.js.map +1 -1
- package/dist/lib/path-tree.cjs +69 -0
- package/dist/lib/path-tree.cjs.map +1 -0
- package/dist/lib/path-tree.d.ts +54 -0
- package/dist/lib/path-tree.d.ts.map +1 -0
- package/dist/lib/path-tree.js +69 -0
- package/dist/lib/path-tree.js.map +1 -0
- package/dist/monaco.d.ts +1 -0
- package/dist/monaco.d.ts.map +1 -1
- package/dist/overlay/DropdownMenuSubmenu.cjs +13 -7
- package/dist/overlay/DropdownMenuSubmenu.cjs.map +1 -1
- package/dist/overlay/DropdownMenuSubmenu.d.ts.map +1 -1
- package/dist/overlay/DropdownMenuSubmenu.js +13 -7
- package/dist/overlay/DropdownMenuSubmenu.js.map +1 -1
- package/dist/overlay/HoverCard.cjs.map +1 -1
- package/dist/overlay/HoverCard.d.ts +2 -2
- package/dist/overlay/HoverCard.d.ts.map +1 -1
- package/dist/overlay/HoverCard.js.map +1 -1
- package/dist/overlay/Tour.cjs +173 -0
- package/dist/overlay/Tour.cjs.map +1 -0
- package/dist/overlay/Tour.d.ts +61 -0
- package/dist/overlay/Tour.d.ts.map +1 -0
- package/dist/overlay/Tour.js +173 -0
- package/dist/overlay/Tour.js.map +1 -0
- package/dist/overlay/TourCard.cjs +108 -0
- package/dist/overlay/TourCard.cjs.map +1 -0
- package/dist/overlay/TourCard.d.ts +23 -0
- package/dist/overlay/TourCard.d.ts.map +1 -0
- package/dist/overlay/TourCard.js +108 -0
- package/dist/overlay/TourCard.js.map +1 -0
- package/dist/overlay/TourProvider.cjs +160 -0
- package/dist/overlay/TourProvider.cjs.map +1 -0
- package/dist/overlay/TourProvider.d.ts +31 -0
- package/dist/overlay/TourProvider.d.ts.map +1 -0
- package/dist/overlay/TourProvider.js +160 -0
- package/dist/overlay/TourProvider.js.map +1 -0
- package/dist/overlay/TourSpotlight.cjs +47 -0
- package/dist/overlay/TourSpotlight.cjs.map +1 -0
- package/dist/overlay/TourSpotlight.d.ts +12 -0
- package/dist/overlay/TourSpotlight.d.ts.map +1 -0
- package/dist/overlay/TourSpotlight.js +47 -0
- package/dist/overlay/TourSpotlight.js.map +1 -0
- package/dist/overlay/modalStack.cjs +18 -4
- package/dist/overlay/modalStack.cjs.map +1 -1
- package/dist/overlay/modalStack.d.ts +10 -2
- package/dist/overlay/modalStack.d.ts.map +1 -1
- package/dist/overlay/modalStack.js +19 -5
- package/dist/overlay/modalStack.js.map +1 -1
- package/dist/overlay/tour-anchor.cjs +114 -0
- package/dist/overlay/tour-anchor.cjs.map +1 -0
- package/dist/overlay/tour-anchor.d.ts +30 -0
- package/dist/overlay/tour-anchor.d.ts.map +1 -0
- package/dist/overlay/tour-anchor.js +114 -0
- package/dist/overlay/tour-anchor.js.map +1 -0
- package/dist/overlay/tour-context.cjs +12 -0
- package/dist/overlay/tour-context.cjs.map +1 -0
- package/dist/overlay/tour-context.d.ts +40 -0
- package/dist/overlay/tour-context.d.ts.map +1 -0
- package/dist/overlay/tour-context.js +12 -0
- package/dist/overlay/tour-context.js.map +1 -0
- package/dist/overlay/tour-geometry.cjs +65 -0
- package/dist/overlay/tour-geometry.cjs.map +1 -0
- package/dist/overlay/tour-geometry.d.ts +47 -0
- package/dist/overlay/tour-geometry.d.ts.map +1 -0
- package/dist/overlay/tour-geometry.js +65 -0
- package/dist/overlay/tour-geometry.js.map +1 -0
- package/dist/overlay/tour-model.cjs +79 -0
- package/dist/overlay/tour-model.cjs.map +1 -0
- package/dist/overlay/tour-model.d.ts +29 -0
- package/dist/overlay/tour-model.d.ts.map +1 -0
- package/dist/overlay/tour-model.js +79 -0
- package/dist/overlay/tour-model.js.map +1 -0
- package/dist/overlay/tour-progress.cjs +54 -0
- package/dist/overlay/tour-progress.cjs.map +1 -0
- package/dist/overlay/tour-progress.d.ts +40 -0
- package/dist/overlay/tour-progress.d.ts.map +1 -0
- package/dist/overlay/tour-progress.js +54 -0
- package/dist/overlay/tour-progress.js.map +1 -0
- package/dist/overlay/tour-types.d.ts +144 -0
- package/dist/overlay/tour-types.d.ts.map +1 -0
- package/dist/overlay/use-tour-anchor.cjs +43 -0
- package/dist/overlay/use-tour-anchor.cjs.map +1 -0
- package/dist/overlay/use-tour-anchor.d.ts +23 -0
- package/dist/overlay/use-tour-anchor.d.ts.map +1 -0
- package/dist/overlay/use-tour-anchor.js +43 -0
- package/dist/overlay/use-tour-anchor.js.map +1 -0
- package/dist/overlay/use-tour-rect.cjs +33 -0
- package/dist/overlay/use-tour-rect.cjs.map +1 -0
- package/dist/overlay/use-tour-rect.d.ts +12 -0
- package/dist/overlay/use-tour-rect.d.ts.map +1 -0
- package/dist/overlay/use-tour-rect.js +33 -0
- package/dist/overlay/use-tour-rect.js.map +1 -0
- package/dist/overlay/use-tour-step.cjs +66 -0
- package/dist/overlay/use-tour-step.cjs.map +1 -0
- package/dist/overlay/use-tour-step.d.ts +45 -0
- package/dist/overlay/use-tour-step.d.ts.map +1 -0
- package/dist/overlay/use-tour-step.js +66 -0
- package/dist/overlay/use-tour-step.js.map +1 -0
- package/dist/overlay/zIndex.cjs +8 -0
- package/dist/overlay/zIndex.cjs.map +1 -1
- package/dist/overlay/zIndex.d.ts +8 -0
- package/dist/overlay/zIndex.d.ts.map +1 -1
- package/dist/overlay/zIndex.js +8 -0
- package/dist/overlay/zIndex.js.map +1 -1
- package/dist/rpc/CommandOutput.cjs +8 -0
- package/dist/rpc/CommandOutput.cjs.map +1 -1
- package/dist/rpc/CommandOutput.d.ts +4 -1
- package/dist/rpc/CommandOutput.d.ts.map +1 -1
- package/dist/rpc/CommandOutput.js +8 -0
- package/dist/rpc/CommandOutput.js.map +1 -1
- package/dist/rpc/EntityExplorerApp.cjs +10 -16
- package/dist/rpc/EntityExplorerApp.cjs.map +1 -1
- package/dist/rpc/EntityExplorerApp.d.ts.map +1 -1
- package/dist/rpc/EntityExplorerApp.js +10 -16
- package/dist/rpc/EntityExplorerApp.js.map +1 -1
- package/dist/rpc/OperationActionBar.cjs +1 -1
- package/dist/rpc/OperationActionBar.cjs.map +1 -1
- package/dist/rpc/OperationActionBar.js +1 -1
- package/dist/rpc/OperationActionBar.js.map +1 -1
- package/dist/rpc/OperationCatalog.cjs +111 -58
- package/dist/rpc/OperationCatalog.cjs.map +1 -1
- package/dist/rpc/OperationCatalog.d.ts +1 -6
- package/dist/rpc/OperationCatalog.d.ts.map +1 -1
- package/dist/rpc/OperationCatalog.js +112 -59
- package/dist/rpc/OperationCatalog.js.map +1 -1
- package/dist/rpc/OperationResultView.cjs +44 -0
- package/dist/rpc/OperationResultView.cjs.map +1 -1
- package/dist/rpc/OperationResultView.d.ts +8 -1
- package/dist/rpc/OperationResultView.d.ts.map +1 -1
- package/dist/rpc/OperationResultView.js +44 -0
- package/dist/rpc/OperationResultView.js.map +1 -1
- package/dist/rpc/SchemaActionForm.cjs +2 -21
- package/dist/rpc/SchemaActionForm.cjs.map +1 -1
- package/dist/rpc/SchemaActionForm.d.ts.map +1 -1
- package/dist/rpc/SchemaActionForm.js +3 -22
- package/dist/rpc/SchemaActionForm.js.map +1 -1
- package/dist/rpc/apiClient.cjs +16 -2
- package/dist/rpc/apiClient.cjs.map +1 -1
- package/dist/rpc/apiClient.d.ts.map +1 -1
- package/dist/rpc/apiClient.js +16 -2
- package/dist/rpc/apiClient.js.map +1 -1
- package/dist/rpc/formMetadata.cjs +89 -49
- package/dist/rpc/formMetadata.cjs.map +1 -1
- package/dist/rpc/formMetadata.d.ts +14 -6
- package/dist/rpc/formMetadata.d.ts.map +1 -1
- package/dist/rpc/formMetadata.js +87 -47
- package/dist/rpc/formMetadata.js.map +1 -1
- package/dist/rpc/operationFilterSearch.cjs +23 -0
- package/dist/rpc/operationFilterSearch.cjs.map +1 -0
- package/dist/rpc/operationFilterSearch.d.ts +22 -0
- package/dist/rpc/operationFilterSearch.d.ts.map +1 -0
- package/dist/rpc/operationFilterSearch.js +23 -0
- package/dist/rpc/operationFilterSearch.js.map +1 -0
- package/dist/rpc/operationLookupFetcher.cjs +28 -0
- package/dist/rpc/operationLookupFetcher.cjs.map +1 -0
- package/dist/rpc/operationLookupFetcher.d.ts +17 -0
- package/dist/rpc/operationLookupFetcher.d.ts.map +1 -0
- package/dist/rpc/operationLookupFetcher.js +28 -0
- package/dist/rpc/operationLookupFetcher.js.map +1 -0
- package/dist/rpc/surfaceNav.cjs +77 -0
- package/dist/rpc/surfaceNav.cjs.map +1 -0
- package/dist/rpc/surfaceNav.d.ts +19 -0
- package/dist/rpc/surfaceNav.d.ts.map +1 -0
- package/dist/rpc/surfaceNav.js +77 -0
- package/dist/rpc/surfaceNav.js.map +1 -0
- package/dist/rpc/types.cjs.map +1 -1
- package/dist/rpc/types.d.ts +12 -1
- package/dist/rpc/types.d.ts.map +1 -1
- package/dist/rpc/types.js.map +1 -1
- package/dist/rpc.cjs +2 -0
- package/dist/rpc.cjs.map +1 -1
- package/dist/rpc.d.ts +1 -0
- package/dist/rpc.d.ts.map +1 -1
- package/dist/rpc.js +2 -0
- package/dist/rpc.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/tailwind-preset.cjs +4 -0
- package/dist/tailwind-preset.cjs.map +1 -1
- package/dist/tailwind-preset.d.ts.map +1 -1
- package/dist/tailwind-preset.js +4 -0
- package/dist/tailwind-preset.js.map +1 -1
- package/dist/utils.cjs +8 -0
- package/dist/utils.cjs.map +1 -1
- package/dist/utils.d.ts +2 -1
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +10 -2
- package/dist/utils.js.map +1 -1
- package/package.json +1 -1
- package/dist/data/ai/RuntimeBar.cjs.map +0 -1
- package/dist/data/ai/RuntimeBar.d.ts +0 -27
- package/dist/data/ai/RuntimeBar.d.ts.map +0 -1
- package/dist/data/ai/RuntimeBar.js.map +0 -1
- package/dist/data/ai/model-capabilities.cjs.map +0 -1
- package/dist/data/ai/model-capabilities.d.ts.map +0 -1
- package/dist/data/ai/model-capabilities.js.map +0 -1
- package/dist/data/ai/runtime-mode.cjs.map +0 -1
- package/dist/data/ai/runtime-mode.d.ts.map +0 -1
- package/dist/data/ai/runtime-mode.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OperationResultView.cjs","sources":["../../src/rpc/OperationResultView.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport type {\n FilterBarFilter,\n FilterBarRangeProps,\n FilterBarSearchProps,\n} from \"../components/FilterBar\";\nimport type
|
|
1
|
+
{"version":3,"file":"OperationResultView.cjs","sources":["../../src/rpc/OperationResultView.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport type {\n FilterBarFilter,\n FilterBarRangeProps,\n FilterBarSearchProps,\n} from \"../components/FilterBar\";\nimport {\n DataTable,\n type DataTableColumn,\n type DataTablePagination,\n} from \"../data/DataTable\";\nimport type {\n ClickyCommandRuntime,\n ClickyDownloadOptions,\n} from \"../data/Clicky\";\nimport type {\n CellFilterChange,\n CellFilterMode,\n} from \"../data/cells/CellFilterActions\";\nimport { cn } from \"../lib/utils\";\nimport { ExecutionResult } from \"./ExecutionResult\";\nimport { useRowDetailNavigation } from \"./rowNavigation\";\nimport type { ExecutionResponse, ResolvedOperation } from \"./types\";\n\n// ResultRenderContext is handed to a host-supplied resultRenderer so it can\n// replace the default result surface for selected entities (e.g. render a\n// LogsTable for trace/log profiles). `defaultView` is the standard\n// OperationResultView element; return it unchanged to keep the default.\nexport type ResultRenderContext = {\n surfaceKey?: string;\n response: ExecutionResponse | null;\n defaultView: ReactNode;\n filterConfig?: OperationResultFilterConfig;\n // The pager and download menu the default view would have rendered. A\n // replacement surface is still a page of a server-paged result, so it is\n // handed the same controls rather than left to present one page as the whole.\n pagination?: DataTablePagination;\n download?: ClickyDownloadOptions;\n};\n\n// ResultRenderer lets the host app swap the result presentation per surface. It\n// receives the current surface key, the raw response, and the default view, and\n// returns whatever node should render in its place.\nexport type ResultRenderer = (ctx: ResultRenderContext) => ReactNode;\n\n// In-table filter inputs for the result table — mirrors what\n// parametersToFormConfig produces, surfaced through the DataTable's own\n// FilterBar so the filter UI renders identically on every result surface.\nexport type OperationResultFilterConfig = {\n filters?: FilterBarFilter[];\n search?: FilterBarSearchProps;\n timeRange?: FilterBarRangeProps;\n cellFilters?: Record<string, Record<string, CellFilterMode>>;\n onCellFilterChange?: (change: CellFilterChange) => void;\n};\n\nexport type OperationResultViewProps = {\n response: ExecutionResponse | null;\n error?: ReactNode;\n loading?: boolean;\n loadingMessage?: string;\n emptyMessage?: string;\n ariaLabel?: string;\n className?: string;\n commandRuntime?: ClickyCommandRuntime;\n // When set, rows navigate to the entity detail page (/<surface>/<id>).\n detailOperation?: ResolvedOperation | undefined;\n filterConfig?: OperationResultFilterConfig;\n pagination?: DataTablePagination;\n download?: ClickyDownloadOptions;\n};\n\ntype ErrorResultRow = {\n error: string;\n};\n\nconst ERROR_RESULT_COLUMNS: DataTableColumn<ErrorResultRow>[] = [\n {\n key: \"error\",\n label: \"Error\",\n grow: true,\n sortable: false,\n resizable: false,\n hideable: false,\n },\n];\n\n// OperationResultView is the single result surface rendered by both the entity\n// list catalog and the operation runner. It renders the clicky result table\n// with its in-table FilterBar, the View/Download menu (automatic via the\n// response's requestUrl), pagination, and row→detail navigation — so the\n// surface looks and behaves identically wherever a result is shown.\nexport function OperationResultView({\n response,\n error,\n loading,\n loadingMessage,\n emptyMessage,\n ariaLabel,\n className,\n commandRuntime,\n detailOperation,\n filterConfig,\n pagination,\n download,\n}: OperationResultViewProps) {\n const rowNav = useRowDetailNavigation(detailOperation);\n const filters = filterConfig?.filters;\n\n if (error != null) {\n return (\n <div\n role={ariaLabel ? \"region\" : undefined}\n aria-label={ariaLabel}\n className={cn(\"mt-3 flex min-h-0 flex-col\", className)}\n >\n <DataTable<ErrorResultRow>\n data={[]}\n columns={ERROR_RESULT_COLUMNS}\n error={error}\n className=\"h-full\"\n showGlobalFilter={false}\n showDensityControl={false}\n hideableColumns={false}\n resizableColumns={false}\n persistColumnWidths={false}\n persistColumnVisibility={false}\n persistDensity={false}\n {...(filters && filters.length > 0\n ? { externalFilters: filters }\n : {})}\n {...(filterConfig?.search\n ? { externalSearch: filterConfig.search }\n : {})}\n {...(filterConfig?.timeRange\n ? { externalTimeRange: filterConfig.timeRange }\n : {})}\n />\n </div>\n );\n }\n\n return (\n <ExecutionResult\n response={response}\n {...(loading !== undefined ? { loading } : {})}\n {...(loadingMessage ? { loadingMessage } : {})}\n {...(emptyMessage ? { emptyMessage } : {})}\n {...(ariaLabel ? { ariaLabel } : {})}\n {...(className ? { className } : {})}\n {...(commandRuntime ? { commandRuntime } : {})}\n {...(detailOperation\n ? {\n getTableRowHref: rowNav.getRowHref,\n onTableRowClick: rowNav.onRowClick,\n isTableRowClickable: rowNav.isRowClickable,\n }\n : {})}\n {...(filters && filters.length > 0 ? { externalFilters: filters } : {})}\n {...(filterConfig?.search ? { search: filterConfig.search } : {})}\n {...(filterConfig?.timeRange\n ? { timeRange: filterConfig.timeRange }\n : {})}\n {...(filterConfig?.cellFilters\n ? { cellFilters: filterConfig.cellFilters }\n : {})}\n {...(filterConfig?.onCellFilterChange\n ? { onCellFilterChange: filterConfig.onCellFilterChange }\n : {})}\n {...(pagination ? { pagination } : {})}\n {...(download ? { download } : {})}\n />\n );\n}\n"],"names":["useRowDetailNavigation","jsx","cn","DataTable","ExecutionResult"],"mappings":";;;;;;;AA4EA,MAAM,uBAA0D;AAAA,EAC9D;AAAA,IACE,KAAK;AAAA,IACL,OAAO;AAAA,IACP,MAAM;AAAA,IACN,UAAU;AAAA,IACV,WAAW;AAAA,IACX,UAAU;AAAA,EAAA;AAEd;AAOO,SAAS,oBAAoB;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA6B;AAC3B,QAAM,SAASA,cAAAA,uBAAuB,eAAe;AACrD,QAAM,UAAU,6CAAc;AAE9B,MAAI,SAAS,MAAM;AACjB,WACEC,2BAAAA;AAAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAM,YAAY,WAAW;AAAA,QAC7B,cAAY;AAAA,QACZ,WAAWC,MAAAA,GAAG,8BAA8B,SAAS;AAAA,QAErD,UAAAD,2BAAAA;AAAAA,UAACE,UAAAA;AAAAA,UAAA;AAAA,YACC,MAAM,CAAA;AAAA,YACN,SAAS;AAAA,YACT;AAAA,YACA,WAAU;AAAA,YACV,kBAAkB;AAAA,YAClB,oBAAoB;AAAA,YACpB,iBAAiB;AAAA,YACjB,kBAAkB;AAAA,YAClB,qBAAqB;AAAA,YACrB,yBAAyB;AAAA,YACzB,gBAAgB;AAAA,YACf,GAAI,WAAW,QAAQ,SAAS,IAC7B,EAAE,iBAAiB,QAAA,IACnB,CAAA;AAAA,YACH,IAAI,6CAAc,UACf,EAAE,gBAAgB,aAAa,OAAA,IAC/B,CAAA;AAAA,YACH,IAAI,6CAAc,aACf,EAAE,mBAAmB,aAAa,UAAA,IAClC,CAAA;AAAA,UAAC;AAAA,QAAA;AAAA,MACP;AAAA,IAAA;AAAA,EAGN;AAEA,SACEF,2BAAAA;AAAAA,IAACG,gBAAAA;AAAAA,IAAA;AAAA,MACC;AAAA,MACC,GAAI,YAAY,SAAY,EAAE,QAAA,IAAY,CAAA;AAAA,MAC1C,GAAI,iBAAiB,EAAE,eAAA,IAAmB,CAAA;AAAA,MAC1C,GAAI,eAAe,EAAE,aAAA,IAAiB,CAAA;AAAA,MACtC,GAAI,YAAY,EAAE,UAAA,IAAc,CAAA;AAAA,MAChC,GAAI,YAAY,EAAE,UAAA,IAAc,CAAA;AAAA,MAChC,GAAI,iBAAiB,EAAE,eAAA,IAAmB,CAAA;AAAA,MAC1C,GAAI,kBACD;AAAA,QACE,iBAAiB,OAAO;AAAA,QACxB,iBAAiB,OAAO;AAAA,QACxB,qBAAqB,OAAO;AAAA,MAAA,IAE9B,CAAA;AAAA,MACH,GAAI,WAAW,QAAQ,SAAS,IAAI,EAAE,iBAAiB,QAAA,IAAY,CAAA;AAAA,MACnE,IAAI,6CAAc,UAAS,EAAE,QAAQ,aAAa,OAAA,IAAW,CAAA;AAAA,MAC7D,IAAI,6CAAc,aACf,EAAE,WAAW,aAAa,UAAA,IAC1B,CAAA;AAAA,MACH,IAAI,6CAAc,eACf,EAAE,aAAa,aAAa,YAAA,IAC5B,CAAA;AAAA,MACH,IAAI,6CAAc,sBACf,EAAE,oBAAoB,aAAa,mBAAA,IACnC,CAAA;AAAA,MACH,GAAI,aAAa,EAAE,WAAA,IAAe,CAAA;AAAA,MAClC,GAAI,WAAW,EAAE,aAAa,CAAA;AAAA,IAAC;AAAA,EAAA;AAGtC;;"}
|
|
@@ -2,20 +2,27 @@ import { ReactNode } from 'react';
|
|
|
2
2
|
import { FilterBarFilter, FilterBarRangeProps, FilterBarSearchProps } from '../components/FilterBar';
|
|
3
3
|
import { DataTablePagination } from '../data/DataTable';
|
|
4
4
|
import { ClickyCommandRuntime, ClickyDownloadOptions } from '../data/Clicky';
|
|
5
|
+
import { CellFilterChange, CellFilterMode } from '../data/cells/CellFilterActions';
|
|
5
6
|
import { ExecutionResponse, ResolvedOperation } from './types';
|
|
6
7
|
export type ResultRenderContext = {
|
|
7
8
|
surfaceKey?: string;
|
|
8
9
|
response: ExecutionResponse | null;
|
|
9
10
|
defaultView: ReactNode;
|
|
11
|
+
filterConfig?: OperationResultFilterConfig;
|
|
12
|
+
pagination?: DataTablePagination;
|
|
13
|
+
download?: ClickyDownloadOptions;
|
|
10
14
|
};
|
|
11
15
|
export type ResultRenderer = (ctx: ResultRenderContext) => ReactNode;
|
|
12
16
|
export type OperationResultFilterConfig = {
|
|
13
17
|
filters?: FilterBarFilter[];
|
|
14
18
|
search?: FilterBarSearchProps;
|
|
15
19
|
timeRange?: FilterBarRangeProps;
|
|
20
|
+
cellFilters?: Record<string, Record<string, CellFilterMode>>;
|
|
21
|
+
onCellFilterChange?: (change: CellFilterChange) => void;
|
|
16
22
|
};
|
|
17
23
|
export type OperationResultViewProps = {
|
|
18
24
|
response: ExecutionResponse | null;
|
|
25
|
+
error?: ReactNode;
|
|
19
26
|
loading?: boolean;
|
|
20
27
|
loadingMessage?: string;
|
|
21
28
|
emptyMessage?: string;
|
|
@@ -27,5 +34,5 @@ export type OperationResultViewProps = {
|
|
|
27
34
|
pagination?: DataTablePagination;
|
|
28
35
|
download?: ClickyDownloadOptions;
|
|
29
36
|
};
|
|
30
|
-
export declare function OperationResultView({ response, loading, loadingMessage, emptyMessage, ariaLabel, className, commandRuntime, detailOperation, filterConfig, pagination, download, }: OperationResultViewProps): import("react/jsx-runtime").JSX.Element;
|
|
37
|
+
export declare function OperationResultView({ response, error, loading, loadingMessage, emptyMessage, ariaLabel, className, commandRuntime, detailOperation, filterConfig, pagination, download, }: OperationResultViewProps): import("react/jsx-runtime").JSX.Element;
|
|
31
38
|
//# sourceMappingURL=OperationResultView.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OperationResultView.d.ts","sourceRoot":"","sources":["../../src/rpc/OperationResultView.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EACV,eAAe,EACf,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"OperationResultView.d.ts","sourceRoot":"","sources":["../../src/rpc/OperationResultView.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,KAAK,EACV,eAAe,EACf,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAGL,KAAK,mBAAmB,EACzB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EACV,oBAAoB,EACpB,qBAAqB,EACtB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EACV,gBAAgB,EAChB,cAAc,EACf,MAAM,iCAAiC,CAAC;AAIzC,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAMpE,MAAM,MAAM,mBAAmB,GAAG;IAChC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACnC,WAAW,EAAE,SAAS,CAAC;IACvB,YAAY,CAAC,EAAE,2BAA2B,CAAC;IAI3C,UAAU,CAAC,EAAE,mBAAmB,CAAC;IACjC,QAAQ,CAAC,EAAE,qBAAqB,CAAC;CAClC,CAAC;AAKF,MAAM,MAAM,cAAc,GAAG,CAAC,GAAG,EAAE,mBAAmB,KAAK,SAAS,CAAC;AAKrE,MAAM,MAAM,2BAA2B,GAAG;IACxC,OAAO,CAAC,EAAE,eAAe,EAAE,CAAC;IAC5B,MAAM,CAAC,EAAE,oBAAoB,CAAC;IAC9B,SAAS,CAAC,EAAE,mBAAmB,CAAC;IAChC,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;IAC7D,kBAAkB,CAAC,EAAE,CAAC,MAAM,EAAE,gBAAgB,KAAK,IAAI,CAAC;CACzD,CAAC;AAEF,MAAM,MAAM,wBAAwB,GAAG;IACrC,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAAC;IACnC,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,cAAc,CAAC,EAAE,oBAAoB,CAAC;IAEtC,eAAe,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC;IAChD,YAAY,CAAC,EAAE,2BAA2B,CAAC;IAC3C,UAAU,CAAC,EAAE,mBAAmB,CAAC;IACjC,QAAQ,CAAC,EAAE,qBAAqB,CAAC;CAClC,CAAC;AAsBF,wBAAgB,mBAAmB,CAAC,EAClC,QAAQ,EACR,KAAK,EACL,OAAO,EACP,cAAc,EACd,YAAY,EACZ,SAAS,EACT,SAAS,EACT,cAAc,EACd,eAAe,EACf,YAAY,EACZ,UAAU,EACV,QAAQ,GACT,EAAE,wBAAwB,2CAoE1B"}
|
|
@@ -1,8 +1,21 @@
|
|
|
1
1
|
import { jsx } from "react/jsx-runtime";
|
|
2
|
+
import { DataTable } from "../data/DataTable.js";
|
|
3
|
+
import { cn } from "../lib/utils.js";
|
|
2
4
|
import { ExecutionResult } from "./ExecutionResult.js";
|
|
3
5
|
import { useRowDetailNavigation } from "./rowNavigation.js";
|
|
6
|
+
const ERROR_RESULT_COLUMNS = [
|
|
7
|
+
{
|
|
8
|
+
key: "error",
|
|
9
|
+
label: "Error",
|
|
10
|
+
grow: true,
|
|
11
|
+
sortable: false,
|
|
12
|
+
resizable: false,
|
|
13
|
+
hideable: false
|
|
14
|
+
}
|
|
15
|
+
];
|
|
4
16
|
function OperationResultView({
|
|
5
17
|
response,
|
|
18
|
+
error,
|
|
6
19
|
loading,
|
|
7
20
|
loadingMessage,
|
|
8
21
|
emptyMessage,
|
|
@@ -16,6 +29,35 @@ function OperationResultView({
|
|
|
16
29
|
}) {
|
|
17
30
|
const rowNav = useRowDetailNavigation(detailOperation);
|
|
18
31
|
const filters = filterConfig == null ? void 0 : filterConfig.filters;
|
|
32
|
+
if (error != null) {
|
|
33
|
+
return /* @__PURE__ */ jsx(
|
|
34
|
+
"div",
|
|
35
|
+
{
|
|
36
|
+
role: ariaLabel ? "region" : void 0,
|
|
37
|
+
"aria-label": ariaLabel,
|
|
38
|
+
className: cn("mt-3 flex min-h-0 flex-col", className),
|
|
39
|
+
children: /* @__PURE__ */ jsx(
|
|
40
|
+
DataTable,
|
|
41
|
+
{
|
|
42
|
+
data: [],
|
|
43
|
+
columns: ERROR_RESULT_COLUMNS,
|
|
44
|
+
error,
|
|
45
|
+
className: "h-full",
|
|
46
|
+
showGlobalFilter: false,
|
|
47
|
+
showDensityControl: false,
|
|
48
|
+
hideableColumns: false,
|
|
49
|
+
resizableColumns: false,
|
|
50
|
+
persistColumnWidths: false,
|
|
51
|
+
persistColumnVisibility: false,
|
|
52
|
+
persistDensity: false,
|
|
53
|
+
...filters && filters.length > 0 ? { externalFilters: filters } : {},
|
|
54
|
+
...(filterConfig == null ? void 0 : filterConfig.search) ? { externalSearch: filterConfig.search } : {},
|
|
55
|
+
...(filterConfig == null ? void 0 : filterConfig.timeRange) ? { externalTimeRange: filterConfig.timeRange } : {}
|
|
56
|
+
}
|
|
57
|
+
)
|
|
58
|
+
}
|
|
59
|
+
);
|
|
60
|
+
}
|
|
19
61
|
return /* @__PURE__ */ jsx(
|
|
20
62
|
ExecutionResult,
|
|
21
63
|
{
|
|
@@ -34,6 +76,8 @@ function OperationResultView({
|
|
|
34
76
|
...filters && filters.length > 0 ? { externalFilters: filters } : {},
|
|
35
77
|
...(filterConfig == null ? void 0 : filterConfig.search) ? { search: filterConfig.search } : {},
|
|
36
78
|
...(filterConfig == null ? void 0 : filterConfig.timeRange) ? { timeRange: filterConfig.timeRange } : {},
|
|
79
|
+
...(filterConfig == null ? void 0 : filterConfig.cellFilters) ? { cellFilters: filterConfig.cellFilters } : {},
|
|
80
|
+
...(filterConfig == null ? void 0 : filterConfig.onCellFilterChange) ? { onCellFilterChange: filterConfig.onCellFilterChange } : {},
|
|
37
81
|
...pagination ? { pagination } : {},
|
|
38
82
|
...download ? { download } : {}
|
|
39
83
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OperationResultView.js","sources":["../../src/rpc/OperationResultView.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport type {\n FilterBarFilter,\n FilterBarRangeProps,\n FilterBarSearchProps,\n} from \"../components/FilterBar\";\nimport type
|
|
1
|
+
{"version":3,"file":"OperationResultView.js","sources":["../../src/rpc/OperationResultView.tsx"],"sourcesContent":["import type { ReactNode } from \"react\";\nimport type {\n FilterBarFilter,\n FilterBarRangeProps,\n FilterBarSearchProps,\n} from \"../components/FilterBar\";\nimport {\n DataTable,\n type DataTableColumn,\n type DataTablePagination,\n} from \"../data/DataTable\";\nimport type {\n ClickyCommandRuntime,\n ClickyDownloadOptions,\n} from \"../data/Clicky\";\nimport type {\n CellFilterChange,\n CellFilterMode,\n} from \"../data/cells/CellFilterActions\";\nimport { cn } from \"../lib/utils\";\nimport { ExecutionResult } from \"./ExecutionResult\";\nimport { useRowDetailNavigation } from \"./rowNavigation\";\nimport type { ExecutionResponse, ResolvedOperation } from \"./types\";\n\n// ResultRenderContext is handed to a host-supplied resultRenderer so it can\n// replace the default result surface for selected entities (e.g. render a\n// LogsTable for trace/log profiles). `defaultView` is the standard\n// OperationResultView element; return it unchanged to keep the default.\nexport type ResultRenderContext = {\n surfaceKey?: string;\n response: ExecutionResponse | null;\n defaultView: ReactNode;\n filterConfig?: OperationResultFilterConfig;\n // The pager and download menu the default view would have rendered. A\n // replacement surface is still a page of a server-paged result, so it is\n // handed the same controls rather than left to present one page as the whole.\n pagination?: DataTablePagination;\n download?: ClickyDownloadOptions;\n};\n\n// ResultRenderer lets the host app swap the result presentation per surface. It\n// receives the current surface key, the raw response, and the default view, and\n// returns whatever node should render in its place.\nexport type ResultRenderer = (ctx: ResultRenderContext) => ReactNode;\n\n// In-table filter inputs for the result table — mirrors what\n// parametersToFormConfig produces, surfaced through the DataTable's own\n// FilterBar so the filter UI renders identically on every result surface.\nexport type OperationResultFilterConfig = {\n filters?: FilterBarFilter[];\n search?: FilterBarSearchProps;\n timeRange?: FilterBarRangeProps;\n cellFilters?: Record<string, Record<string, CellFilterMode>>;\n onCellFilterChange?: (change: CellFilterChange) => void;\n};\n\nexport type OperationResultViewProps = {\n response: ExecutionResponse | null;\n error?: ReactNode;\n loading?: boolean;\n loadingMessage?: string;\n emptyMessage?: string;\n ariaLabel?: string;\n className?: string;\n commandRuntime?: ClickyCommandRuntime;\n // When set, rows navigate to the entity detail page (/<surface>/<id>).\n detailOperation?: ResolvedOperation | undefined;\n filterConfig?: OperationResultFilterConfig;\n pagination?: DataTablePagination;\n download?: ClickyDownloadOptions;\n};\n\ntype ErrorResultRow = {\n error: string;\n};\n\nconst ERROR_RESULT_COLUMNS: DataTableColumn<ErrorResultRow>[] = [\n {\n key: \"error\",\n label: \"Error\",\n grow: true,\n sortable: false,\n resizable: false,\n hideable: false,\n },\n];\n\n// OperationResultView is the single result surface rendered by both the entity\n// list catalog and the operation runner. It renders the clicky result table\n// with its in-table FilterBar, the View/Download menu (automatic via the\n// response's requestUrl), pagination, and row→detail navigation — so the\n// surface looks and behaves identically wherever a result is shown.\nexport function OperationResultView({\n response,\n error,\n loading,\n loadingMessage,\n emptyMessage,\n ariaLabel,\n className,\n commandRuntime,\n detailOperation,\n filterConfig,\n pagination,\n download,\n}: OperationResultViewProps) {\n const rowNav = useRowDetailNavigation(detailOperation);\n const filters = filterConfig?.filters;\n\n if (error != null) {\n return (\n <div\n role={ariaLabel ? \"region\" : undefined}\n aria-label={ariaLabel}\n className={cn(\"mt-3 flex min-h-0 flex-col\", className)}\n >\n <DataTable<ErrorResultRow>\n data={[]}\n columns={ERROR_RESULT_COLUMNS}\n error={error}\n className=\"h-full\"\n showGlobalFilter={false}\n showDensityControl={false}\n hideableColumns={false}\n resizableColumns={false}\n persistColumnWidths={false}\n persistColumnVisibility={false}\n persistDensity={false}\n {...(filters && filters.length > 0\n ? { externalFilters: filters }\n : {})}\n {...(filterConfig?.search\n ? { externalSearch: filterConfig.search }\n : {})}\n {...(filterConfig?.timeRange\n ? { externalTimeRange: filterConfig.timeRange }\n : {})}\n />\n </div>\n );\n }\n\n return (\n <ExecutionResult\n response={response}\n {...(loading !== undefined ? { loading } : {})}\n {...(loadingMessage ? { loadingMessage } : {})}\n {...(emptyMessage ? { emptyMessage } : {})}\n {...(ariaLabel ? { ariaLabel } : {})}\n {...(className ? { className } : {})}\n {...(commandRuntime ? { commandRuntime } : {})}\n {...(detailOperation\n ? {\n getTableRowHref: rowNav.getRowHref,\n onTableRowClick: rowNav.onRowClick,\n isTableRowClickable: rowNav.isRowClickable,\n }\n : {})}\n {...(filters && filters.length > 0 ? { externalFilters: filters } : {})}\n {...(filterConfig?.search ? { search: filterConfig.search } : {})}\n {...(filterConfig?.timeRange\n ? { timeRange: filterConfig.timeRange }\n : {})}\n {...(filterConfig?.cellFilters\n ? { cellFilters: filterConfig.cellFilters }\n : {})}\n {...(filterConfig?.onCellFilterChange\n ? { onCellFilterChange: filterConfig.onCellFilterChange }\n : {})}\n {...(pagination ? { pagination } : {})}\n {...(download ? { download } : {})}\n />\n );\n}\n"],"names":[],"mappings":";;;;;AA4EA,MAAM,uBAA0D;AAAA,EAC9D;AAAA,IACE,KAAK;AAAA,IACL,OAAO;AAAA,IACP,MAAM;AAAA,IACN,UAAU;AAAA,IACV,WAAW;AAAA,IACX,UAAU;AAAA,EAAA;AAEd;AAOO,SAAS,oBAAoB;AAAA,EAClC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAA6B;AAC3B,QAAM,SAAS,uBAAuB,eAAe;AACrD,QAAM,UAAU,6CAAc;AAE9B,MAAI,SAAS,MAAM;AACjB,WACE;AAAA,MAAC;AAAA,MAAA;AAAA,QACC,MAAM,YAAY,WAAW;AAAA,QAC7B,cAAY;AAAA,QACZ,WAAW,GAAG,8BAA8B,SAAS;AAAA,QAErD,UAAA;AAAA,UAAC;AAAA,UAAA;AAAA,YACC,MAAM,CAAA;AAAA,YACN,SAAS;AAAA,YACT;AAAA,YACA,WAAU;AAAA,YACV,kBAAkB;AAAA,YAClB,oBAAoB;AAAA,YACpB,iBAAiB;AAAA,YACjB,kBAAkB;AAAA,YAClB,qBAAqB;AAAA,YACrB,yBAAyB;AAAA,YACzB,gBAAgB;AAAA,YACf,GAAI,WAAW,QAAQ,SAAS,IAC7B,EAAE,iBAAiB,QAAA,IACnB,CAAA;AAAA,YACH,IAAI,6CAAc,UACf,EAAE,gBAAgB,aAAa,OAAA,IAC/B,CAAA;AAAA,YACH,IAAI,6CAAc,aACf,EAAE,mBAAmB,aAAa,UAAA,IAClC,CAAA;AAAA,UAAC;AAAA,QAAA;AAAA,MACP;AAAA,IAAA;AAAA,EAGN;AAEA,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC;AAAA,MACC,GAAI,YAAY,SAAY,EAAE,QAAA,IAAY,CAAA;AAAA,MAC1C,GAAI,iBAAiB,EAAE,eAAA,IAAmB,CAAA;AAAA,MAC1C,GAAI,eAAe,EAAE,aAAA,IAAiB,CAAA;AAAA,MACtC,GAAI,YAAY,EAAE,UAAA,IAAc,CAAA;AAAA,MAChC,GAAI,YAAY,EAAE,UAAA,IAAc,CAAA;AAAA,MAChC,GAAI,iBAAiB,EAAE,eAAA,IAAmB,CAAA;AAAA,MAC1C,GAAI,kBACD;AAAA,QACE,iBAAiB,OAAO;AAAA,QACxB,iBAAiB,OAAO;AAAA,QACxB,qBAAqB,OAAO;AAAA,MAAA,IAE9B,CAAA;AAAA,MACH,GAAI,WAAW,QAAQ,SAAS,IAAI,EAAE,iBAAiB,QAAA,IAAY,CAAA;AAAA,MACnE,IAAI,6CAAc,UAAS,EAAE,QAAQ,aAAa,OAAA,IAAW,CAAA;AAAA,MAC7D,IAAI,6CAAc,aACf,EAAE,WAAW,aAAa,UAAA,IAC1B,CAAA;AAAA,MACH,IAAI,6CAAc,eACf,EAAE,aAAa,aAAa,YAAA,IAC5B,CAAA;AAAA,MACH,IAAI,6CAAc,sBACf,EAAE,oBAAoB,aAAa,mBAAA,IACnC,CAAA;AAAA,MACH,GAAI,aAAa,EAAE,WAAA,IAAe,CAAA;AAAA,MAClC,GAAI,WAAW,EAAE,aAAa,CAAA;AAAA,IAAC;AAAA,EAAA;AAGtC;"}
|
|
@@ -6,9 +6,8 @@ const reactQuery = require("@tanstack/react-query");
|
|
|
6
6
|
const yaml = require("yaml");
|
|
7
7
|
const button = require("../components/button.cjs");
|
|
8
8
|
const JsonSchemaForm = require("../components/JsonSchemaForm.cjs");
|
|
9
|
-
const formLookupContext = require("../components/form-lookup-context.cjs");
|
|
10
9
|
const Tabs = require("../layout/Tabs.cjs");
|
|
11
|
-
const
|
|
10
|
+
const operationLookupFetcher = require("./operationLookupFetcher.cjs");
|
|
12
11
|
const schemaActionPath = require("./schemaActionPath.cjs");
|
|
13
12
|
const LazyMonacoSchemaEditor = react.lazy(
|
|
14
13
|
() => Promise.resolve().then(() => require("../monaco/MonacoSchemaEditor.cjs")).then((module2) => ({
|
|
@@ -34,25 +33,7 @@ function SchemaActionForm({
|
|
|
34
33
|
client.getSchema && client.submitForm && isMutation(method)
|
|
35
34
|
);
|
|
36
35
|
const schemaPath = schemaActionPath.collectionPath(action.path);
|
|
37
|
-
const lookupFetcher =
|
|
38
|
-
const lookup = client.lookupFilterOptions;
|
|
39
|
-
if (!lookup) return void 0;
|
|
40
|
-
return async ({ descriptor, query, rootValue }) => {
|
|
41
|
-
const extra = formLookupContext.resolveLookupScope(descriptor, rootValue);
|
|
42
|
-
const filter = await lookup.call(
|
|
43
|
-
client,
|
|
44
|
-
descriptor.url,
|
|
45
|
-
"GET",
|
|
46
|
-
descriptor.filter,
|
|
47
|
-
query,
|
|
48
|
-
extra
|
|
49
|
-
);
|
|
50
|
-
return formMetadata.lookupOptionsToFieldOptions(filter).map((o) => ({
|
|
51
|
-
value: o.value,
|
|
52
|
-
label: o.label
|
|
53
|
-
}));
|
|
54
|
-
};
|
|
55
|
-
}, [client]);
|
|
36
|
+
const lookupFetcher = operationLookupFetcher.useOperationLookupFetcher(client);
|
|
56
37
|
const schemaQuery = reactQuery.useQuery({
|
|
57
38
|
queryKey: ["entity-schema", schemaPath],
|
|
58
39
|
// react-query forbids undefined query data; normalize "no schema" to null.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SchemaActionForm.cjs","sources":["../../src/rpc/SchemaActionForm.tsx"],"sourcesContent":["import {\n lazy,\n Suspense,\n useCallback,\n useMemo,\n useState,\n type ReactNode,\n} from \"react\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { parse as parseYaml, stringify as stringifyYaml } from \"yaml\";\nimport { Button } from \"../components/button\";\nimport { JsonSchemaForm } from \"../components/JsonSchemaForm\";\nimport { resolveLookupScope } from \"../components/form-lookup-context\";\nimport { Tabs } from \"../layout/Tabs\";\nimport type {\n JsonSchemaObject,\n LookupFetcher,\n PreExtension,\n PostExtension,\n} from \"../components/json-schema-form-types\";\nimport { lookupOptionsToFieldOptions } from \"./formMetadata\";\nimport {\n collectionPath,\n resolveActionPath,\n scalarValues,\n} from \"./schemaActionPath\";\nimport type { ExecutionResponse, ResolvedOperation } from \"./types\";\nimport type { OperationsApiClient } from \"./useOperations\";\nimport type { MonacoValidationState } from \"../monaco/types\";\n\nconst LazyMonacoSchemaEditor = lazy(() =>\n import(\"../monaco/MonacoSchemaEditor\").then((module) => ({\n default: module.MonacoSchemaEditor,\n })),\n);\nlet schemaActionEditorSequence = 0;\n\n// FormActionContext is handed to a footerActions renderer so a host app can add\n// form-level actions (e.g. a connection \"Test\" button) that operate on the live\n// form value.\nexport type FormActionContext = {\n value: Record<string, unknown>;\n action: ResolvedOperation;\n canSubmit: boolean;\n};\n\n// FormActionsRenderer renders extra action buttons in the form footer, left of\n// the Save button. Returns null/undefined to add none.\nexport type FormActionsRenderer = (ctx: FormActionContext) => ReactNode;\n\nexport type SchemaActionFormSlots = {\n body: ReactNode;\n footer?: ReactNode;\n};\n\nexport type SchemaActionFormProps = {\n client: OperationsApiClient;\n // The create (POST) or update (PUT) operation this form submits to.\n action: ResolvedOperation;\n // Values used to resolve path parameters (e.g. { id } when editing a row).\n lockedValues?: Record<string, string>;\n // Pre-filled form value (the existing entity when editing).\n initialValue?: Record<string, unknown>;\n submitLabel?: string;\n onSuccess?: (response: ExecutionResponse) => void;\n // Custom JsonSchemaForm field extensions (e.g. a SecretKeySelector widget keyed\n // on an `x-clicky-component` hint). Forwarded verbatim to the rendered form.\n formPre?: PreExtension[];\n formPost?: PostExtension[];\n // Optional extra footer actions (e.g. a connection \"Test\" split-button) that\n // operate on the current form value, rendered left of the Save button.\n footerActions?: FormActionsRenderer;\n // Optional host layout. Dialog consumers use this to place footer controls in\n // the modal's pinned footer while standalone consumers retain the inline\n // layout below.\n renderLayout?: (slots: SchemaActionFormSlots) => ReactNode;\n // Rendered when the resource exposes no JSON Schema (or schema forms are not\n // applicable to this action) — the existing parameter form.\n fallback: ReactNode;\n};\n\n// SchemaActionForm renders a JSON-Schema-driven create/edit form for resources\n// that expose a schema via content negotiation (connections, profiles). It falls\n// back to the parameter form for everything else. Submission sends the full\n// nested form value as JSON (client.submitForm), so nested objects/arrays survive.\nexport function SchemaActionForm({\n client,\n action,\n lockedValues,\n initialValue,\n submitLabel = \"Save\",\n onSuccess,\n formPre,\n formPost,\n footerActions,\n renderLayout,\n fallback,\n}: SchemaActionFormProps) {\n const method = action.method.toUpperCase();\n const canSchemaForm = Boolean(\n client.getSchema && client.submitForm && isMutation(method),\n );\n const schemaPath = collectionPath(action.path);\n\n // Resolve `x-clicky-lookup` fields against the live form value: fetch the\n // referenced entity's lookup options (server-side search) and scope them by a\n // sibling field. Undefined when the client has no lookup endpoint (the field\n // then degrades to a free-text combobox).\n const lookupFetcher: LookupFetcher | undefined = useMemo(() => {\n const lookup = client.lookupFilterOptions;\n if (!lookup) return undefined;\n return async ({ descriptor, query, rootValue }) => {\n const extra = resolveLookupScope(descriptor, rootValue);\n const filter = await lookup.call(\n client,\n descriptor.url,\n \"GET\",\n descriptor.filter,\n query,\n extra,\n );\n return lookupOptionsToFieldOptions(filter).map((o) => ({\n value: o.value,\n label: o.label,\n }));\n };\n }, [client]);\n\n const schemaQuery = useQuery<JsonSchemaObject | null>({\n queryKey: [\"entity-schema\", schemaPath],\n // react-query forbids undefined query data; normalize \"no schema\" to null.\n queryFn: async () => (await client.getSchema!(schemaPath)) ?? null,\n enabled: canSchemaForm,\n staleTime: 5 * 60 * 1000,\n retry: 0,\n });\n\n const [value, setValue] = useState<Record<string, unknown>>(\n initialValue ?? {},\n );\n const [view, setView] = useState<\"form\" | \"yaml\">(\"form\");\n const [yamlText, setYamlText] = useState(() =>\n stringifyYaml(initialValue ?? {}),\n );\n const [yamlError, setYamlError] = useState(\"\");\n const [yamlValidation, setYamlValidation] = useState<MonacoValidationState>({\n status: \"valid\",\n errors: [],\n });\n const [error, setError] = useState(\"\");\n const [isSubmitting, setIsSubmitting] = useState(false);\n // Monaco keys models by path. A React useId can be reused after one dialog\n // unmounts and another occupies the same tree position, briefly exposing the\n // previous dialog's retained model during deferred StrictMode-safe cleanup.\n const [editorId] = useState(() => ++schemaActionEditorSequence);\n const editorPath = `file:///clicky-schema-action-${editorId}.yaml`;\n const canSubmit =\n !yamlError && (view !== \"yaml\" || yamlValidation.status === \"valid\");\n const handleValidationChange = useCallback((next: MonacoValidationState) => {\n setYamlValidation(next);\n }, []);\n\n function renderSlots(slots: SchemaActionFormSlots) {\n if (renderLayout) return renderLayout(slots);\n return (\n <div className=\"space-y-4\">\n {slots.body}\n {slots.footer}\n </div>\n );\n }\n\n if (!canSchemaForm) return <>{renderSlots({ body: fallback })}</>;\n if (schemaQuery.isLoading) {\n return (\n <>\n {renderSlots({\n body: (\n <div className=\"text-sm text-muted-foreground\">Loading form…</div>\n ),\n })}\n </>\n );\n }\n const schema = schemaQuery.data;\n if (!schema) return <>{renderSlots({ body: fallback })}</>;\n\n async function handleSubmit() {\n if (!client.submitForm) return;\n if (!canSubmit) {\n setError(\"Fix the YAML before saving.\");\n return;\n }\n setIsSubmitting(true);\n setError(\"\");\n try {\n const path = resolveActionPath(action.path, {\n ...scalarValues(value),\n ...lockedValues,\n });\n // Entity update operations do not always encode their identifier in the\n // path. Clicky can expose an entity-scoped PUT on the collection path and\n // use x-clicky.idParam to lock the row id in the action context. Keep\n // locked values out of the editable form, but include any values that\n // were not consumed by path placeholders in the request body.\n const pathParams = new Set(\n Array.from(action.path.matchAll(/\\{([^{}]+)\\}/g), (match) => match[1]),\n );\n const lockedBodyValues = Object.fromEntries(\n Object.entries(lockedValues ?? {}).filter(\n ([name]) => !pathParams.has(name),\n ),\n );\n const response = await client.submitForm(\n path,\n method,\n { ...value, ...lockedBodyValues },\n {\n Accept: \"application/json+clicky\",\n },\n );\n if (response.error) {\n setError(response.error);\n return;\n }\n onSuccess?.(response);\n } catch (err) {\n setError(\n err instanceof Error ? err.message : String(err ?? \"Unknown error\"),\n );\n } finally {\n setIsSubmitting(false);\n }\n }\n\n function changeView(next: string) {\n if (next !== \"form\" && next !== \"yaml\") return;\n if (next === \"form\") {\n // Form mode uses the last successfully parsed object, so an invalid YAML\n // draft should not trap the user in the editor or keep form actions disabled.\n setYamlError(\"\");\n }\n if (next === \"yaml\") {\n setYamlText(stringifyYaml(value));\n setYamlError(\"\");\n setYamlValidation({ status: \"loading\", errors: [] });\n }\n setView(next);\n }\n\n function changeYaml(next: string) {\n setYamlText(next);\n setError(\"\");\n try {\n const parsed = next.trim() ? parseYaml(next) : {};\n if (!isRecord(parsed))\n throw new Error(\"The YAML document must contain an object.\");\n setValue(parsed);\n setYamlError(\"\");\n setYamlValidation({ status: \"loading\", errors: [] });\n } catch (err) {\n setYamlError(err instanceof Error ? err.message : String(err));\n }\n }\n\n const body = (\n <div className=\"space-y-4\">\n <Tabs\n tabs={[\n { id: \"form\", label: \"Form\" },\n { id: \"yaml\", label: \"YAML\" },\n ]}\n value={view}\n onChange={changeView}\n />\n {view === \"form\" ? (\n <div role=\"tabpanel\" aria-label=\"Form\">\n <JsonSchemaForm\n schema={schema}\n value={value}\n onChange={setValue}\n {...(formPre ? { pre: formPre } : {})}\n {...(formPost ? { post: formPost } : {})}\n {...(lookupFetcher ? { lookupFetcher } : {})}\n />\n </div>\n ) : (\n <div role=\"tabpanel\" aria-label=\"YAML\" className=\"space-y-2\">\n <Suspense\n fallback={\n <div className=\"h-80 rounded-md border border-input p-3 text-sm text-muted-foreground\">\n Loading Monaco editor…\n </div>\n }\n >\n <LazyMonacoSchemaEditor\n language=\"yaml\"\n value={yamlText}\n onChange={changeYaml}\n path={editorPath}\n schemaUri={`${editorPath}.schema.json`}\n schema={schema}\n onValidationChange={handleValidationChange}\n />\n </Suspense>\n <div className=\"text-xs text-muted-foreground\">\n Returning through Form preserves values but discards YAML comments,\n anchors, ordering, and formatting.\n </div>\n {(yamlValidation.status === \"invalid\" ||\n yamlValidation.status === \"unavailable\") &&\n yamlValidation.errors.length > 0 && (\n <div className=\"text-sm text-destructive\" role=\"alert\">\n {yamlValidation.errors[0]}\n </div>\n )}\n {yamlValidation.status === \"loading\" && !yamlError && (\n <div className=\"text-xs text-muted-foreground\">\n Validating YAML…\n </div>\n )}\n {yamlError && (\n <div className=\"text-sm text-destructive\" role=\"alert\">\n {yamlError}\n </div>\n )}\n </div>\n )}\n {error && (\n <div className=\"rounded-md border border-destructive/40 bg-destructive/5 p-3 text-sm text-destructive\">\n {error}\n </div>\n )}\n </div>\n );\n const footer = (\n <div className=\"flex items-center justify-end gap-2\">\n {footerActions?.({ value, action, canSubmit })}\n <Button\n type=\"button\"\n onClick={handleSubmit}\n disabled={isSubmitting || !canSubmit}\n >\n {isSubmitting ? \"Saving…\" : submitLabel}\n </Button>\n </div>\n );\n return <>{renderSlots({ body, footer })}</>;\n}\n\nfunction isMutation(method: string): boolean {\n return method === \"POST\" || method === \"PUT\" || method === \"PATCH\";\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n"],"names":["lazy","module","collectionPath","useMemo","resolveLookupScope","lookupOptionsToFieldOptions","useQuery","useState","stringifyYaml","useCallback","jsxs","jsx","Fragment","resolveActionPath","scalarValues","parseYaml","Tabs","JsonSchemaForm","Suspense","Button"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SchemaActionForm.cjs","sources":["../../src/rpc/SchemaActionForm.tsx"],"sourcesContent":["import {\n lazy,\n Suspense,\n useCallback,\n useState,\n type ReactNode,\n} from \"react\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { parse as parseYaml, stringify as stringifyYaml } from \"yaml\";\nimport { Button } from \"../components/button\";\nimport { JsonSchemaForm } from \"../components/JsonSchemaForm\";\nimport { Tabs } from \"../layout/Tabs\";\nimport type {\n JsonSchemaObject,\n PreExtension,\n PostExtension,\n} from \"../components/json-schema-form-types\";\nimport { useOperationLookupFetcher } from \"./operationLookupFetcher\";\nimport {\n collectionPath,\n resolveActionPath,\n scalarValues,\n} from \"./schemaActionPath\";\nimport type { ExecutionResponse, ResolvedOperation } from \"./types\";\nimport type { OperationsApiClient } from \"./useOperations\";\nimport type { MonacoValidationState } from \"../monaco/types\";\n\nconst LazyMonacoSchemaEditor = lazy(() =>\n import(\"../monaco/MonacoSchemaEditor\").then((module) => ({\n default: module.MonacoSchemaEditor,\n })),\n);\nlet schemaActionEditorSequence = 0;\n\n// FormActionContext is handed to a footerActions renderer so a host app can add\n// form-level actions (e.g. a connection \"Test\" button) that operate on the live\n// form value.\nexport type FormActionContext = {\n value: Record<string, unknown>;\n action: ResolvedOperation;\n canSubmit: boolean;\n};\n\n// FormActionsRenderer renders extra action buttons in the form footer, left of\n// the Save button. Returns null/undefined to add none.\nexport type FormActionsRenderer = (ctx: FormActionContext) => ReactNode;\n\nexport type SchemaActionFormSlots = {\n body: ReactNode;\n footer?: ReactNode;\n};\n\nexport type SchemaActionFormProps = {\n client: OperationsApiClient;\n // The create (POST) or update (PUT) operation this form submits to.\n action: ResolvedOperation;\n // Values used to resolve path parameters (e.g. { id } when editing a row).\n lockedValues?: Record<string, string>;\n // Pre-filled form value (the existing entity when editing).\n initialValue?: Record<string, unknown>;\n submitLabel?: string;\n onSuccess?: (response: ExecutionResponse) => void;\n // Custom JsonSchemaForm field extensions (e.g. a SecretKeySelector widget keyed\n // on an `x-clicky-component` hint). Forwarded verbatim to the rendered form.\n formPre?: PreExtension[];\n formPost?: PostExtension[];\n // Optional extra footer actions (e.g. a connection \"Test\" split-button) that\n // operate on the current form value, rendered left of the Save button.\n footerActions?: FormActionsRenderer;\n // Optional host layout. Dialog consumers use this to place footer controls in\n // the modal's pinned footer while standalone consumers retain the inline\n // layout below.\n renderLayout?: (slots: SchemaActionFormSlots) => ReactNode;\n // Rendered when the resource exposes no JSON Schema (or schema forms are not\n // applicable to this action) — the existing parameter form.\n fallback: ReactNode;\n};\n\n// SchemaActionForm renders a JSON-Schema-driven create/edit form for resources\n// that expose a schema via content negotiation (connections, profiles). It falls\n// back to the parameter form for everything else. Submission sends the full\n// nested form value as JSON (client.submitForm), so nested objects/arrays survive.\nexport function SchemaActionForm({\n client,\n action,\n lockedValues,\n initialValue,\n submitLabel = \"Save\",\n onSuccess,\n formPre,\n formPost,\n footerActions,\n renderLayout,\n fallback,\n}: SchemaActionFormProps) {\n const method = action.method.toUpperCase();\n const canSchemaForm = Boolean(\n client.getSchema && client.submitForm && isMutation(method),\n );\n const schemaPath = collectionPath(action.path);\n\n const lookupFetcher = useOperationLookupFetcher(client);\n\n const schemaQuery = useQuery<JsonSchemaObject | null>({\n queryKey: [\"entity-schema\", schemaPath],\n // react-query forbids undefined query data; normalize \"no schema\" to null.\n queryFn: async () => (await client.getSchema!(schemaPath)) ?? null,\n enabled: canSchemaForm,\n staleTime: 5 * 60 * 1000,\n retry: 0,\n });\n\n const [value, setValue] = useState<Record<string, unknown>>(\n initialValue ?? {},\n );\n const [view, setView] = useState<\"form\" | \"yaml\">(\"form\");\n const [yamlText, setYamlText] = useState(() =>\n stringifyYaml(initialValue ?? {}),\n );\n const [yamlError, setYamlError] = useState(\"\");\n const [yamlValidation, setYamlValidation] = useState<MonacoValidationState>({\n status: \"valid\",\n errors: [],\n });\n const [error, setError] = useState(\"\");\n const [isSubmitting, setIsSubmitting] = useState(false);\n // Monaco keys models by path. A React useId can be reused after one dialog\n // unmounts and another occupies the same tree position, briefly exposing the\n // previous dialog's retained model during deferred StrictMode-safe cleanup.\n const [editorId] = useState(() => ++schemaActionEditorSequence);\n const editorPath = `file:///clicky-schema-action-${editorId}.yaml`;\n const canSubmit =\n !yamlError && (view !== \"yaml\" || yamlValidation.status === \"valid\");\n const handleValidationChange = useCallback((next: MonacoValidationState) => {\n setYamlValidation(next);\n }, []);\n\n function renderSlots(slots: SchemaActionFormSlots) {\n if (renderLayout) return renderLayout(slots);\n return (\n <div className=\"space-y-4\">\n {slots.body}\n {slots.footer}\n </div>\n );\n }\n\n if (!canSchemaForm) return <>{renderSlots({ body: fallback })}</>;\n if (schemaQuery.isLoading) {\n return (\n <>\n {renderSlots({\n body: (\n <div className=\"text-sm text-muted-foreground\">Loading form…</div>\n ),\n })}\n </>\n );\n }\n const schema = schemaQuery.data;\n if (!schema) return <>{renderSlots({ body: fallback })}</>;\n\n async function handleSubmit() {\n if (!client.submitForm) return;\n if (!canSubmit) {\n setError(\"Fix the YAML before saving.\");\n return;\n }\n setIsSubmitting(true);\n setError(\"\");\n try {\n const path = resolveActionPath(action.path, {\n ...scalarValues(value),\n ...lockedValues,\n });\n // Entity update operations do not always encode their identifier in the\n // path. Clicky can expose an entity-scoped PUT on the collection path and\n // use x-clicky.idParam to lock the row id in the action context. Keep\n // locked values out of the editable form, but include any values that\n // were not consumed by path placeholders in the request body.\n const pathParams = new Set(\n Array.from(action.path.matchAll(/\\{([^{}]+)\\}/g), (match) => match[1]),\n );\n const lockedBodyValues = Object.fromEntries(\n Object.entries(lockedValues ?? {}).filter(\n ([name]) => !pathParams.has(name),\n ),\n );\n const response = await client.submitForm(\n path,\n method,\n { ...value, ...lockedBodyValues },\n {\n Accept: \"application/json+clicky\",\n },\n );\n if (response.error) {\n setError(response.error);\n return;\n }\n onSuccess?.(response);\n } catch (err) {\n setError(\n err instanceof Error ? err.message : String(err ?? \"Unknown error\"),\n );\n } finally {\n setIsSubmitting(false);\n }\n }\n\n function changeView(next: string) {\n if (next !== \"form\" && next !== \"yaml\") return;\n if (next === \"form\") {\n // Form mode uses the last successfully parsed object, so an invalid YAML\n // draft should not trap the user in the editor or keep form actions disabled.\n setYamlError(\"\");\n }\n if (next === \"yaml\") {\n setYamlText(stringifyYaml(value));\n setYamlError(\"\");\n setYamlValidation({ status: \"loading\", errors: [] });\n }\n setView(next);\n }\n\n function changeYaml(next: string) {\n setYamlText(next);\n setError(\"\");\n try {\n const parsed = next.trim() ? parseYaml(next) : {};\n if (!isRecord(parsed))\n throw new Error(\"The YAML document must contain an object.\");\n setValue(parsed);\n setYamlError(\"\");\n setYamlValidation({ status: \"loading\", errors: [] });\n } catch (err) {\n setYamlError(err instanceof Error ? err.message : String(err));\n }\n }\n\n const body = (\n <div className=\"space-y-4\">\n <Tabs\n tabs={[\n { id: \"form\", label: \"Form\" },\n { id: \"yaml\", label: \"YAML\" },\n ]}\n value={view}\n onChange={changeView}\n />\n {view === \"form\" ? (\n <div role=\"tabpanel\" aria-label=\"Form\">\n <JsonSchemaForm\n schema={schema}\n value={value}\n onChange={setValue}\n {...(formPre ? { pre: formPre } : {})}\n {...(formPost ? { post: formPost } : {})}\n {...(lookupFetcher ? { lookupFetcher } : {})}\n />\n </div>\n ) : (\n <div role=\"tabpanel\" aria-label=\"YAML\" className=\"space-y-2\">\n <Suspense\n fallback={\n <div className=\"h-80 rounded-md border border-input p-3 text-sm text-muted-foreground\">\n Loading Monaco editor…\n </div>\n }\n >\n <LazyMonacoSchemaEditor\n language=\"yaml\"\n value={yamlText}\n onChange={changeYaml}\n path={editorPath}\n schemaUri={`${editorPath}.schema.json`}\n schema={schema}\n onValidationChange={handleValidationChange}\n />\n </Suspense>\n <div className=\"text-xs text-muted-foreground\">\n Returning through Form preserves values but discards YAML comments,\n anchors, ordering, and formatting.\n </div>\n {(yamlValidation.status === \"invalid\" ||\n yamlValidation.status === \"unavailable\") &&\n yamlValidation.errors.length > 0 && (\n <div className=\"text-sm text-destructive\" role=\"alert\">\n {yamlValidation.errors[0]}\n </div>\n )}\n {yamlValidation.status === \"loading\" && !yamlError && (\n <div className=\"text-xs text-muted-foreground\">\n Validating YAML…\n </div>\n )}\n {yamlError && (\n <div className=\"text-sm text-destructive\" role=\"alert\">\n {yamlError}\n </div>\n )}\n </div>\n )}\n {error && (\n <div className=\"rounded-md border border-destructive/40 bg-destructive/5 p-3 text-sm text-destructive\">\n {error}\n </div>\n )}\n </div>\n );\n const footer = (\n <div className=\"flex items-center justify-end gap-2\">\n {footerActions?.({ value, action, canSubmit })}\n <Button\n type=\"button\"\n onClick={handleSubmit}\n disabled={isSubmitting || !canSubmit}\n >\n {isSubmitting ? \"Saving…\" : submitLabel}\n </Button>\n </div>\n );\n return <>{renderSlots({ body, footer })}</>;\n}\n\nfunction isMutation(method: string): boolean {\n return method === \"POST\" || method === \"PUT\" || method === \"PATCH\";\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n"],"names":["lazy","module","collectionPath","useOperationLookupFetcher","useQuery","useState","stringifyYaml","useCallback","jsxs","jsx","Fragment","resolveActionPath","scalarValues","parseYaml","Tabs","JsonSchemaForm","Suspense","Button"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SchemaActionForm.d.ts","sourceRoot":"","sources":["../../src/rpc/SchemaActionForm.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"SchemaActionForm.d.ts","sourceRoot":"","sources":["../../src/rpc/SchemaActionForm.tsx"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAMf,OAAO,KAAK,EAEV,YAAY,EACZ,aAAa,EACd,MAAM,sCAAsC,CAAC;AAO9C,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AACpE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAa3D,MAAM,MAAM,iBAAiB,GAAG;IAC9B,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,MAAM,EAAE,iBAAiB,CAAC;IAC1B,SAAS,EAAE,OAAO,CAAC;CACpB,CAAC;AAIF,MAAM,MAAM,mBAAmB,GAAG,CAAC,GAAG,EAAE,iBAAiB,KAAK,SAAS,CAAC;AAExE,MAAM,MAAM,qBAAqB,GAAG;IAClC,IAAI,EAAE,SAAS,CAAC;IAChB,MAAM,CAAC,EAAE,SAAS,CAAC;CACpB,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAClC,MAAM,EAAE,mBAAmB,CAAC;IAE5B,MAAM,EAAE,iBAAiB,CAAC;IAE1B,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEtC,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACvC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,CAAC,QAAQ,EAAE,iBAAiB,KAAK,IAAI,CAAC;IAGlD,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,QAAQ,CAAC,EAAE,aAAa,EAAE,CAAC;IAG3B,aAAa,CAAC,EAAE,mBAAmB,CAAC;IAIpC,YAAY,CAAC,EAAE,CAAC,KAAK,EAAE,qBAAqB,KAAK,SAAS,CAAC;IAG3D,QAAQ,EAAE,SAAS,CAAC;CACrB,CAAC;AAMF,wBAAgB,gBAAgB,CAAC,EAC/B,MAAM,EACN,MAAM,EACN,YAAY,EACZ,YAAY,EACZ,WAAoB,EACpB,SAAS,EACT,OAAO,EACP,QAAQ,EACR,aAAa,EACb,YAAY,EACZ,QAAQ,GACT,EAAE,qBAAqB,2CAqOvB"}
|
|
@@ -1,12 +1,11 @@
|
|
|
1
1
|
import { jsx, Fragment, jsxs } from "react/jsx-runtime";
|
|
2
|
-
import {
|
|
2
|
+
import { useState, useCallback, Suspense, lazy } from "react";
|
|
3
3
|
import { useQuery } from "@tanstack/react-query";
|
|
4
4
|
import { stringify, parse } from "yaml";
|
|
5
5
|
import { Button } from "../components/button.js";
|
|
6
6
|
import { JsonSchemaForm } from "../components/JsonSchemaForm.js";
|
|
7
|
-
import { resolveLookupScope } from "../components/form-lookup-context.js";
|
|
8
7
|
import { Tabs } from "../layout/Tabs.js";
|
|
9
|
-
import {
|
|
8
|
+
import { useOperationLookupFetcher } from "./operationLookupFetcher.js";
|
|
10
9
|
import { collectionPath, resolveActionPath, scalarValues } from "./schemaActionPath.js";
|
|
11
10
|
const LazyMonacoSchemaEditor = lazy(
|
|
12
11
|
() => import("../monaco/MonacoSchemaEditor.js").then((module) => ({
|
|
@@ -32,25 +31,7 @@ function SchemaActionForm({
|
|
|
32
31
|
client.getSchema && client.submitForm && isMutation(method)
|
|
33
32
|
);
|
|
34
33
|
const schemaPath = collectionPath(action.path);
|
|
35
|
-
const lookupFetcher =
|
|
36
|
-
const lookup = client.lookupFilterOptions;
|
|
37
|
-
if (!lookup) return void 0;
|
|
38
|
-
return async ({ descriptor, query, rootValue }) => {
|
|
39
|
-
const extra = resolveLookupScope(descriptor, rootValue);
|
|
40
|
-
const filter = await lookup.call(
|
|
41
|
-
client,
|
|
42
|
-
descriptor.url,
|
|
43
|
-
"GET",
|
|
44
|
-
descriptor.filter,
|
|
45
|
-
query,
|
|
46
|
-
extra
|
|
47
|
-
);
|
|
48
|
-
return lookupOptionsToFieldOptions(filter).map((o) => ({
|
|
49
|
-
value: o.value,
|
|
50
|
-
label: o.label
|
|
51
|
-
}));
|
|
52
|
-
};
|
|
53
|
-
}, [client]);
|
|
34
|
+
const lookupFetcher = useOperationLookupFetcher(client);
|
|
54
35
|
const schemaQuery = useQuery({
|
|
55
36
|
queryKey: ["entity-schema", schemaPath],
|
|
56
37
|
// react-query forbids undefined query data; normalize "no schema" to null.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SchemaActionForm.js","sources":["../../src/rpc/SchemaActionForm.tsx"],"sourcesContent":["import {\n lazy,\n Suspense,\n useCallback,\n useMemo,\n useState,\n type ReactNode,\n} from \"react\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { parse as parseYaml, stringify as stringifyYaml } from \"yaml\";\nimport { Button } from \"../components/button\";\nimport { JsonSchemaForm } from \"../components/JsonSchemaForm\";\nimport { resolveLookupScope } from \"../components/form-lookup-context\";\nimport { Tabs } from \"../layout/Tabs\";\nimport type {\n JsonSchemaObject,\n LookupFetcher,\n PreExtension,\n PostExtension,\n} from \"../components/json-schema-form-types\";\nimport { lookupOptionsToFieldOptions } from \"./formMetadata\";\nimport {\n collectionPath,\n resolveActionPath,\n scalarValues,\n} from \"./schemaActionPath\";\nimport type { ExecutionResponse, ResolvedOperation } from \"./types\";\nimport type { OperationsApiClient } from \"./useOperations\";\nimport type { MonacoValidationState } from \"../monaco/types\";\n\nconst LazyMonacoSchemaEditor = lazy(() =>\n import(\"../monaco/MonacoSchemaEditor\").then((module) => ({\n default: module.MonacoSchemaEditor,\n })),\n);\nlet schemaActionEditorSequence = 0;\n\n// FormActionContext is handed to a footerActions renderer so a host app can add\n// form-level actions (e.g. a connection \"Test\" button) that operate on the live\n// form value.\nexport type FormActionContext = {\n value: Record<string, unknown>;\n action: ResolvedOperation;\n canSubmit: boolean;\n};\n\n// FormActionsRenderer renders extra action buttons in the form footer, left of\n// the Save button. Returns null/undefined to add none.\nexport type FormActionsRenderer = (ctx: FormActionContext) => ReactNode;\n\nexport type SchemaActionFormSlots = {\n body: ReactNode;\n footer?: ReactNode;\n};\n\nexport type SchemaActionFormProps = {\n client: OperationsApiClient;\n // The create (POST) or update (PUT) operation this form submits to.\n action: ResolvedOperation;\n // Values used to resolve path parameters (e.g. { id } when editing a row).\n lockedValues?: Record<string, string>;\n // Pre-filled form value (the existing entity when editing).\n initialValue?: Record<string, unknown>;\n submitLabel?: string;\n onSuccess?: (response: ExecutionResponse) => void;\n // Custom JsonSchemaForm field extensions (e.g. a SecretKeySelector widget keyed\n // on an `x-clicky-component` hint). Forwarded verbatim to the rendered form.\n formPre?: PreExtension[];\n formPost?: PostExtension[];\n // Optional extra footer actions (e.g. a connection \"Test\" split-button) that\n // operate on the current form value, rendered left of the Save button.\n footerActions?: FormActionsRenderer;\n // Optional host layout. Dialog consumers use this to place footer controls in\n // the modal's pinned footer while standalone consumers retain the inline\n // layout below.\n renderLayout?: (slots: SchemaActionFormSlots) => ReactNode;\n // Rendered when the resource exposes no JSON Schema (or schema forms are not\n // applicable to this action) — the existing parameter form.\n fallback: ReactNode;\n};\n\n// SchemaActionForm renders a JSON-Schema-driven create/edit form for resources\n// that expose a schema via content negotiation (connections, profiles). It falls\n// back to the parameter form for everything else. Submission sends the full\n// nested form value as JSON (client.submitForm), so nested objects/arrays survive.\nexport function SchemaActionForm({\n client,\n action,\n lockedValues,\n initialValue,\n submitLabel = \"Save\",\n onSuccess,\n formPre,\n formPost,\n footerActions,\n renderLayout,\n fallback,\n}: SchemaActionFormProps) {\n const method = action.method.toUpperCase();\n const canSchemaForm = Boolean(\n client.getSchema && client.submitForm && isMutation(method),\n );\n const schemaPath = collectionPath(action.path);\n\n // Resolve `x-clicky-lookup` fields against the live form value: fetch the\n // referenced entity's lookup options (server-side search) and scope them by a\n // sibling field. Undefined when the client has no lookup endpoint (the field\n // then degrades to a free-text combobox).\n const lookupFetcher: LookupFetcher | undefined = useMemo(() => {\n const lookup = client.lookupFilterOptions;\n if (!lookup) return undefined;\n return async ({ descriptor, query, rootValue }) => {\n const extra = resolveLookupScope(descriptor, rootValue);\n const filter = await lookup.call(\n client,\n descriptor.url,\n \"GET\",\n descriptor.filter,\n query,\n extra,\n );\n return lookupOptionsToFieldOptions(filter).map((o) => ({\n value: o.value,\n label: o.label,\n }));\n };\n }, [client]);\n\n const schemaQuery = useQuery<JsonSchemaObject | null>({\n queryKey: [\"entity-schema\", schemaPath],\n // react-query forbids undefined query data; normalize \"no schema\" to null.\n queryFn: async () => (await client.getSchema!(schemaPath)) ?? null,\n enabled: canSchemaForm,\n staleTime: 5 * 60 * 1000,\n retry: 0,\n });\n\n const [value, setValue] = useState<Record<string, unknown>>(\n initialValue ?? {},\n );\n const [view, setView] = useState<\"form\" | \"yaml\">(\"form\");\n const [yamlText, setYamlText] = useState(() =>\n stringifyYaml(initialValue ?? {}),\n );\n const [yamlError, setYamlError] = useState(\"\");\n const [yamlValidation, setYamlValidation] = useState<MonacoValidationState>({\n status: \"valid\",\n errors: [],\n });\n const [error, setError] = useState(\"\");\n const [isSubmitting, setIsSubmitting] = useState(false);\n // Monaco keys models by path. A React useId can be reused after one dialog\n // unmounts and another occupies the same tree position, briefly exposing the\n // previous dialog's retained model during deferred StrictMode-safe cleanup.\n const [editorId] = useState(() => ++schemaActionEditorSequence);\n const editorPath = `file:///clicky-schema-action-${editorId}.yaml`;\n const canSubmit =\n !yamlError && (view !== \"yaml\" || yamlValidation.status === \"valid\");\n const handleValidationChange = useCallback((next: MonacoValidationState) => {\n setYamlValidation(next);\n }, []);\n\n function renderSlots(slots: SchemaActionFormSlots) {\n if (renderLayout) return renderLayout(slots);\n return (\n <div className=\"space-y-4\">\n {slots.body}\n {slots.footer}\n </div>\n );\n }\n\n if (!canSchemaForm) return <>{renderSlots({ body: fallback })}</>;\n if (schemaQuery.isLoading) {\n return (\n <>\n {renderSlots({\n body: (\n <div className=\"text-sm text-muted-foreground\">Loading form…</div>\n ),\n })}\n </>\n );\n }\n const schema = schemaQuery.data;\n if (!schema) return <>{renderSlots({ body: fallback })}</>;\n\n async function handleSubmit() {\n if (!client.submitForm) return;\n if (!canSubmit) {\n setError(\"Fix the YAML before saving.\");\n return;\n }\n setIsSubmitting(true);\n setError(\"\");\n try {\n const path = resolveActionPath(action.path, {\n ...scalarValues(value),\n ...lockedValues,\n });\n // Entity update operations do not always encode their identifier in the\n // path. Clicky can expose an entity-scoped PUT on the collection path and\n // use x-clicky.idParam to lock the row id in the action context. Keep\n // locked values out of the editable form, but include any values that\n // were not consumed by path placeholders in the request body.\n const pathParams = new Set(\n Array.from(action.path.matchAll(/\\{([^{}]+)\\}/g), (match) => match[1]),\n );\n const lockedBodyValues = Object.fromEntries(\n Object.entries(lockedValues ?? {}).filter(\n ([name]) => !pathParams.has(name),\n ),\n );\n const response = await client.submitForm(\n path,\n method,\n { ...value, ...lockedBodyValues },\n {\n Accept: \"application/json+clicky\",\n },\n );\n if (response.error) {\n setError(response.error);\n return;\n }\n onSuccess?.(response);\n } catch (err) {\n setError(\n err instanceof Error ? err.message : String(err ?? \"Unknown error\"),\n );\n } finally {\n setIsSubmitting(false);\n }\n }\n\n function changeView(next: string) {\n if (next !== \"form\" && next !== \"yaml\") return;\n if (next === \"form\") {\n // Form mode uses the last successfully parsed object, so an invalid YAML\n // draft should not trap the user in the editor or keep form actions disabled.\n setYamlError(\"\");\n }\n if (next === \"yaml\") {\n setYamlText(stringifyYaml(value));\n setYamlError(\"\");\n setYamlValidation({ status: \"loading\", errors: [] });\n }\n setView(next);\n }\n\n function changeYaml(next: string) {\n setYamlText(next);\n setError(\"\");\n try {\n const parsed = next.trim() ? parseYaml(next) : {};\n if (!isRecord(parsed))\n throw new Error(\"The YAML document must contain an object.\");\n setValue(parsed);\n setYamlError(\"\");\n setYamlValidation({ status: \"loading\", errors: [] });\n } catch (err) {\n setYamlError(err instanceof Error ? err.message : String(err));\n }\n }\n\n const body = (\n <div className=\"space-y-4\">\n <Tabs\n tabs={[\n { id: \"form\", label: \"Form\" },\n { id: \"yaml\", label: \"YAML\" },\n ]}\n value={view}\n onChange={changeView}\n />\n {view === \"form\" ? (\n <div role=\"tabpanel\" aria-label=\"Form\">\n <JsonSchemaForm\n schema={schema}\n value={value}\n onChange={setValue}\n {...(formPre ? { pre: formPre } : {})}\n {...(formPost ? { post: formPost } : {})}\n {...(lookupFetcher ? { lookupFetcher } : {})}\n />\n </div>\n ) : (\n <div role=\"tabpanel\" aria-label=\"YAML\" className=\"space-y-2\">\n <Suspense\n fallback={\n <div className=\"h-80 rounded-md border border-input p-3 text-sm text-muted-foreground\">\n Loading Monaco editor…\n </div>\n }\n >\n <LazyMonacoSchemaEditor\n language=\"yaml\"\n value={yamlText}\n onChange={changeYaml}\n path={editorPath}\n schemaUri={`${editorPath}.schema.json`}\n schema={schema}\n onValidationChange={handleValidationChange}\n />\n </Suspense>\n <div className=\"text-xs text-muted-foreground\">\n Returning through Form preserves values but discards YAML comments,\n anchors, ordering, and formatting.\n </div>\n {(yamlValidation.status === \"invalid\" ||\n yamlValidation.status === \"unavailable\") &&\n yamlValidation.errors.length > 0 && (\n <div className=\"text-sm text-destructive\" role=\"alert\">\n {yamlValidation.errors[0]}\n </div>\n )}\n {yamlValidation.status === \"loading\" && !yamlError && (\n <div className=\"text-xs text-muted-foreground\">\n Validating YAML…\n </div>\n )}\n {yamlError && (\n <div className=\"text-sm text-destructive\" role=\"alert\">\n {yamlError}\n </div>\n )}\n </div>\n )}\n {error && (\n <div className=\"rounded-md border border-destructive/40 bg-destructive/5 p-3 text-sm text-destructive\">\n {error}\n </div>\n )}\n </div>\n );\n const footer = (\n <div className=\"flex items-center justify-end gap-2\">\n {footerActions?.({ value, action, canSubmit })}\n <Button\n type=\"button\"\n onClick={handleSubmit}\n disabled={isSubmitting || !canSubmit}\n >\n {isSubmitting ? \"Saving…\" : submitLabel}\n </Button>\n </div>\n );\n return <>{renderSlots({ body, footer })}</>;\n}\n\nfunction isMutation(method: string): boolean {\n return method === \"POST\" || method === \"PUT\" || method === \"PATCH\";\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n"],"names":["stringifyYaml","parseYaml"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SchemaActionForm.js","sources":["../../src/rpc/SchemaActionForm.tsx"],"sourcesContent":["import {\n lazy,\n Suspense,\n useCallback,\n useState,\n type ReactNode,\n} from \"react\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { parse as parseYaml, stringify as stringifyYaml } from \"yaml\";\nimport { Button } from \"../components/button\";\nimport { JsonSchemaForm } from \"../components/JsonSchemaForm\";\nimport { Tabs } from \"../layout/Tabs\";\nimport type {\n JsonSchemaObject,\n PreExtension,\n PostExtension,\n} from \"../components/json-schema-form-types\";\nimport { useOperationLookupFetcher } from \"./operationLookupFetcher\";\nimport {\n collectionPath,\n resolveActionPath,\n scalarValues,\n} from \"./schemaActionPath\";\nimport type { ExecutionResponse, ResolvedOperation } from \"./types\";\nimport type { OperationsApiClient } from \"./useOperations\";\nimport type { MonacoValidationState } from \"../monaco/types\";\n\nconst LazyMonacoSchemaEditor = lazy(() =>\n import(\"../monaco/MonacoSchemaEditor\").then((module) => ({\n default: module.MonacoSchemaEditor,\n })),\n);\nlet schemaActionEditorSequence = 0;\n\n// FormActionContext is handed to a footerActions renderer so a host app can add\n// form-level actions (e.g. a connection \"Test\" button) that operate on the live\n// form value.\nexport type FormActionContext = {\n value: Record<string, unknown>;\n action: ResolvedOperation;\n canSubmit: boolean;\n};\n\n// FormActionsRenderer renders extra action buttons in the form footer, left of\n// the Save button. Returns null/undefined to add none.\nexport type FormActionsRenderer = (ctx: FormActionContext) => ReactNode;\n\nexport type SchemaActionFormSlots = {\n body: ReactNode;\n footer?: ReactNode;\n};\n\nexport type SchemaActionFormProps = {\n client: OperationsApiClient;\n // The create (POST) or update (PUT) operation this form submits to.\n action: ResolvedOperation;\n // Values used to resolve path parameters (e.g. { id } when editing a row).\n lockedValues?: Record<string, string>;\n // Pre-filled form value (the existing entity when editing).\n initialValue?: Record<string, unknown>;\n submitLabel?: string;\n onSuccess?: (response: ExecutionResponse) => void;\n // Custom JsonSchemaForm field extensions (e.g. a SecretKeySelector widget keyed\n // on an `x-clicky-component` hint). Forwarded verbatim to the rendered form.\n formPre?: PreExtension[];\n formPost?: PostExtension[];\n // Optional extra footer actions (e.g. a connection \"Test\" split-button) that\n // operate on the current form value, rendered left of the Save button.\n footerActions?: FormActionsRenderer;\n // Optional host layout. Dialog consumers use this to place footer controls in\n // the modal's pinned footer while standalone consumers retain the inline\n // layout below.\n renderLayout?: (slots: SchemaActionFormSlots) => ReactNode;\n // Rendered when the resource exposes no JSON Schema (or schema forms are not\n // applicable to this action) — the existing parameter form.\n fallback: ReactNode;\n};\n\n// SchemaActionForm renders a JSON-Schema-driven create/edit form for resources\n// that expose a schema via content negotiation (connections, profiles). It falls\n// back to the parameter form for everything else. Submission sends the full\n// nested form value as JSON (client.submitForm), so nested objects/arrays survive.\nexport function SchemaActionForm({\n client,\n action,\n lockedValues,\n initialValue,\n submitLabel = \"Save\",\n onSuccess,\n formPre,\n formPost,\n footerActions,\n renderLayout,\n fallback,\n}: SchemaActionFormProps) {\n const method = action.method.toUpperCase();\n const canSchemaForm = Boolean(\n client.getSchema && client.submitForm && isMutation(method),\n );\n const schemaPath = collectionPath(action.path);\n\n const lookupFetcher = useOperationLookupFetcher(client);\n\n const schemaQuery = useQuery<JsonSchemaObject | null>({\n queryKey: [\"entity-schema\", schemaPath],\n // react-query forbids undefined query data; normalize \"no schema\" to null.\n queryFn: async () => (await client.getSchema!(schemaPath)) ?? null,\n enabled: canSchemaForm,\n staleTime: 5 * 60 * 1000,\n retry: 0,\n });\n\n const [value, setValue] = useState<Record<string, unknown>>(\n initialValue ?? {},\n );\n const [view, setView] = useState<\"form\" | \"yaml\">(\"form\");\n const [yamlText, setYamlText] = useState(() =>\n stringifyYaml(initialValue ?? {}),\n );\n const [yamlError, setYamlError] = useState(\"\");\n const [yamlValidation, setYamlValidation] = useState<MonacoValidationState>({\n status: \"valid\",\n errors: [],\n });\n const [error, setError] = useState(\"\");\n const [isSubmitting, setIsSubmitting] = useState(false);\n // Monaco keys models by path. A React useId can be reused after one dialog\n // unmounts and another occupies the same tree position, briefly exposing the\n // previous dialog's retained model during deferred StrictMode-safe cleanup.\n const [editorId] = useState(() => ++schemaActionEditorSequence);\n const editorPath = `file:///clicky-schema-action-${editorId}.yaml`;\n const canSubmit =\n !yamlError && (view !== \"yaml\" || yamlValidation.status === \"valid\");\n const handleValidationChange = useCallback((next: MonacoValidationState) => {\n setYamlValidation(next);\n }, []);\n\n function renderSlots(slots: SchemaActionFormSlots) {\n if (renderLayout) return renderLayout(slots);\n return (\n <div className=\"space-y-4\">\n {slots.body}\n {slots.footer}\n </div>\n );\n }\n\n if (!canSchemaForm) return <>{renderSlots({ body: fallback })}</>;\n if (schemaQuery.isLoading) {\n return (\n <>\n {renderSlots({\n body: (\n <div className=\"text-sm text-muted-foreground\">Loading form…</div>\n ),\n })}\n </>\n );\n }\n const schema = schemaQuery.data;\n if (!schema) return <>{renderSlots({ body: fallback })}</>;\n\n async function handleSubmit() {\n if (!client.submitForm) return;\n if (!canSubmit) {\n setError(\"Fix the YAML before saving.\");\n return;\n }\n setIsSubmitting(true);\n setError(\"\");\n try {\n const path = resolveActionPath(action.path, {\n ...scalarValues(value),\n ...lockedValues,\n });\n // Entity update operations do not always encode their identifier in the\n // path. Clicky can expose an entity-scoped PUT on the collection path and\n // use x-clicky.idParam to lock the row id in the action context. Keep\n // locked values out of the editable form, but include any values that\n // were not consumed by path placeholders in the request body.\n const pathParams = new Set(\n Array.from(action.path.matchAll(/\\{([^{}]+)\\}/g), (match) => match[1]),\n );\n const lockedBodyValues = Object.fromEntries(\n Object.entries(lockedValues ?? {}).filter(\n ([name]) => !pathParams.has(name),\n ),\n );\n const response = await client.submitForm(\n path,\n method,\n { ...value, ...lockedBodyValues },\n {\n Accept: \"application/json+clicky\",\n },\n );\n if (response.error) {\n setError(response.error);\n return;\n }\n onSuccess?.(response);\n } catch (err) {\n setError(\n err instanceof Error ? err.message : String(err ?? \"Unknown error\"),\n );\n } finally {\n setIsSubmitting(false);\n }\n }\n\n function changeView(next: string) {\n if (next !== \"form\" && next !== \"yaml\") return;\n if (next === \"form\") {\n // Form mode uses the last successfully parsed object, so an invalid YAML\n // draft should not trap the user in the editor or keep form actions disabled.\n setYamlError(\"\");\n }\n if (next === \"yaml\") {\n setYamlText(stringifyYaml(value));\n setYamlError(\"\");\n setYamlValidation({ status: \"loading\", errors: [] });\n }\n setView(next);\n }\n\n function changeYaml(next: string) {\n setYamlText(next);\n setError(\"\");\n try {\n const parsed = next.trim() ? parseYaml(next) : {};\n if (!isRecord(parsed))\n throw new Error(\"The YAML document must contain an object.\");\n setValue(parsed);\n setYamlError(\"\");\n setYamlValidation({ status: \"loading\", errors: [] });\n } catch (err) {\n setYamlError(err instanceof Error ? err.message : String(err));\n }\n }\n\n const body = (\n <div className=\"space-y-4\">\n <Tabs\n tabs={[\n { id: \"form\", label: \"Form\" },\n { id: \"yaml\", label: \"YAML\" },\n ]}\n value={view}\n onChange={changeView}\n />\n {view === \"form\" ? (\n <div role=\"tabpanel\" aria-label=\"Form\">\n <JsonSchemaForm\n schema={schema}\n value={value}\n onChange={setValue}\n {...(formPre ? { pre: formPre } : {})}\n {...(formPost ? { post: formPost } : {})}\n {...(lookupFetcher ? { lookupFetcher } : {})}\n />\n </div>\n ) : (\n <div role=\"tabpanel\" aria-label=\"YAML\" className=\"space-y-2\">\n <Suspense\n fallback={\n <div className=\"h-80 rounded-md border border-input p-3 text-sm text-muted-foreground\">\n Loading Monaco editor…\n </div>\n }\n >\n <LazyMonacoSchemaEditor\n language=\"yaml\"\n value={yamlText}\n onChange={changeYaml}\n path={editorPath}\n schemaUri={`${editorPath}.schema.json`}\n schema={schema}\n onValidationChange={handleValidationChange}\n />\n </Suspense>\n <div className=\"text-xs text-muted-foreground\">\n Returning through Form preserves values but discards YAML comments,\n anchors, ordering, and formatting.\n </div>\n {(yamlValidation.status === \"invalid\" ||\n yamlValidation.status === \"unavailable\") &&\n yamlValidation.errors.length > 0 && (\n <div className=\"text-sm text-destructive\" role=\"alert\">\n {yamlValidation.errors[0]}\n </div>\n )}\n {yamlValidation.status === \"loading\" && !yamlError && (\n <div className=\"text-xs text-muted-foreground\">\n Validating YAML…\n </div>\n )}\n {yamlError && (\n <div className=\"text-sm text-destructive\" role=\"alert\">\n {yamlError}\n </div>\n )}\n </div>\n )}\n {error && (\n <div className=\"rounded-md border border-destructive/40 bg-destructive/5 p-3 text-sm text-destructive\">\n {error}\n </div>\n )}\n </div>\n );\n const footer = (\n <div className=\"flex items-center justify-end gap-2\">\n {footerActions?.({ value, action, canSubmit })}\n <Button\n type=\"button\"\n onClick={handleSubmit}\n disabled={isSubmitting || !canSubmit}\n >\n {isSubmitting ? \"Saving…\" : submitLabel}\n </Button>\n </div>\n );\n return <>{renderSlots({ body, footer })}</>;\n}\n\nfunction isMutation(method: string): boolean {\n return method === \"POST\" || method === \"PUT\" || method === \"PATCH\";\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === \"object\" && !Array.isArray(value);\n}\n"],"names":["stringifyYaml","parseYaml"],"mappings":"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"}
|
package/dist/rpc/apiClient.cjs
CHANGED
|
@@ -153,9 +153,9 @@ function createOperationsApiClient(options = {}) {
|
|
|
153
153
|
async lookupFilterOptions(path, method, filterKey, query, extraParams) {
|
|
154
154
|
var _a, _b;
|
|
155
155
|
const upper = method.toUpperCase();
|
|
156
|
-
const resolved = resolvePathParams(path, {});
|
|
156
|
+
const resolved = resolvePathParams(path, extraParams ?? {});
|
|
157
157
|
const queryParams = {
|
|
158
|
-
...
|
|
158
|
+
...resolved.params,
|
|
159
159
|
__lookup: "filters",
|
|
160
160
|
__lookup_filter: filterKey,
|
|
161
161
|
__lookup_q: query
|
|
@@ -310,8 +310,22 @@ function paginationFromHeaders(headers) {
|
|
|
310
310
|
if (total !== void 0) pagination.total = total;
|
|
311
311
|
if (limit !== void 0) pagination.limit = limit;
|
|
312
312
|
if (offset !== void 0) pagination.offset = offset;
|
|
313
|
+
const relation = headers["x-total-relation"];
|
|
314
|
+
if (relation === "eq" || relation === "gte") pagination.totalRelation = relation;
|
|
315
|
+
const hasMore = booleanHeader(headers["x-has-more"]);
|
|
316
|
+
if (hasMore !== void 0) pagination.hasMore = hasMore;
|
|
317
|
+
const cursor = headers["x-next-cursor"];
|
|
318
|
+
if (cursor != null && cursor.trim() !== "") pagination.nextCursor = cursor;
|
|
319
|
+
if (booleanHeader(headers["x-truncated"]) === true) pagination.truncated = true;
|
|
313
320
|
return Object.keys(pagination).length > 0 ? pagination : void 0;
|
|
314
321
|
}
|
|
322
|
+
function booleanHeader(value) {
|
|
323
|
+
if (value == null || value.trim() === "") return void 0;
|
|
324
|
+
const normalized = value.trim().toLowerCase();
|
|
325
|
+
if (normalized === "true") return true;
|
|
326
|
+
if (normalized === "false") return false;
|
|
327
|
+
return void 0;
|
|
328
|
+
}
|
|
315
329
|
function integerHeader(value) {
|
|
316
330
|
if (value == null || value.trim() === "") return void 0;
|
|
317
331
|
const parsed = parseInt(value, 10);
|