@flanksource/clicky-ui 0.3.17 → 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 +185 -53
- package/dist/data/DataTable.cjs.map +1 -1
- package/dist/data/DataTable.d.ts +63 -3
- package/dist/data/DataTable.d.ts.map +1 -1
- package/dist/data/DataTable.js +185 -53
- 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/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 +78 -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 +80 -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.cjs +1 -1
- package/dist/data/ai/ChatWindow.thread.cjs.map +1 -1
- package/dist/data/ai/ChatWindow.thread.js +1 -1
- package/dist/data/ai/ChatWindow.thread.js.map +1 -1
- 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 +2 -2
- package/dist/data/ai/PromptRunEditor/index.cjs.map +1 -1
- package/dist/data/ai/PromptRunEditor/index.d.ts +1 -1
- package/dist/data/ai/PromptRunEditor/index.d.ts.map +1 -1
- package/dist/data/ai/PromptRunEditor/index.js +2 -2
- package/dist/data/ai/PromptRunEditor/index.js.map +1 -1
- 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.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/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/fields.js +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 +11 -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 +6 -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 +156 -113
- package/dist/data/chat/Chat.cjs.map +1 -1
- package/dist/data/chat/Chat.d.ts +24 -7
- 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 +160 -117
- 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/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 +49 -6
- package/dist/data/chat/approval.cjs.map +1 -1
- package/dist/data/chat/approval.d.ts +11 -4
- package/dist/data/chat/approval.d.ts.map +1 -1
- package/dist/data/chat/approval.js +49 -6
- package/dist/data/chat/approval.js.map +1 -1
- 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 +7 -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/{ai → runtime}/RuntimeBar.d.ts +8 -6
- 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.map +1 -0
- package/dist/data/{ai → runtime}/RuntimeBar.model.d.ts +2 -2
- package/dist/data/runtime/RuntimeBar.model.d.ts.map +1 -0
- package/dist/data/runtime/RuntimeBar.model.js.map +1 -0
- package/dist/data/{ai → runtime}/RuntimeBarCombo.cjs +25 -30
- package/dist/data/runtime/RuntimeBarCombo.cjs.map +1 -0
- package/dist/data/{ai → runtime}/RuntimeBarCombo.d.ts +4 -3
- package/dist/data/runtime/RuntimeBarCombo.d.ts.map +1 -0
- package/dist/data/{ai → runtime}/RuntimeBarCombo.js +25 -30
- package/dist/data/runtime/RuntimeBarCombo.js.map +1 -0
- package/dist/data/{ai/RuntimeBar.cjs → runtime/RuntimeBarSegments.cjs} +54 -120
- 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} +58 -124
- 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/runtime/model-capabilities.cjs.map +1 -0
- package/dist/data/runtime/model-capabilities.d.ts.map +1 -0
- 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 +119 -27
- package/dist/data/runtime/runtime-mode.cjs.map +1 -0
- package/dist/data/{ai → runtime}/runtime-mode.d.ts +7 -1
- package/dist/data/runtime/runtime-mode.d.ts.map +1 -0
- package/dist/data/{ai → runtime}/runtime-mode.js +120 -28
- package/dist/data/runtime/runtime-mode.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 +16 -0
- package/dist/data.cjs.map +1 -1
- package/dist/data.d.ts +6 -2
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +16 -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 +47 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +49 -2
- package/dist/index.js.map +1 -1
- package/dist/layout/AppShell.cjs +92 -56
- 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 +92 -56
- 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/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 +83 -7
- package/dist/rpc/OperationCatalog.cjs.map +1 -1
- package/dist/rpc/OperationCatalog.d.ts.map +1 -1
- package/dist/rpc/OperationCatalog.js +84 -8
- package/dist/rpc/OperationCatalog.js.map +1 -1
- package/dist/rpc/OperationResultView.cjs +2 -0
- package/dist/rpc/OperationResultView.cjs.map +1 -1
- package/dist/rpc/OperationResultView.d.ts +6 -0
- package/dist/rpc/OperationResultView.d.ts.map +1 -1
- package/dist/rpc/OperationResultView.js +2 -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/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.map +0 -1
- package/dist/data/ai/RuntimeBar.js.map +0 -1
- package/dist/data/ai/RuntimeBar.model.cjs.map +0 -1
- package/dist/data/ai/RuntimeBar.model.d.ts.map +0 -1
- package/dist/data/ai/RuntimeBar.model.js.map +0 -1
- package/dist/data/ai/RuntimeBarCombo.cjs.map +0 -1
- package/dist/data/ai/RuntimeBarCombo.d.ts.map +0 -1
- package/dist/data/ai/RuntimeBarCombo.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
- /package/dist/data/{ai → runtime}/RuntimeBar.model.cjs +0 -0
- /package/dist/data/{ai → runtime}/RuntimeBar.model.js +0 -0
- /package/dist/data/{ai → runtime}/model-capabilities.cjs +0 -0
- /package/dist/data/{ai → runtime}/model-capabilities.d.ts +0 -0
- /package/dist/data/{ai → runtime}/model-capabilities.js +0 -0
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { jsxs, jsx } from "react/jsx-runtime";
|
|
2
|
-
import { useMemo, useState, useEffect } from "react";
|
|
2
|
+
import { useMemo, useState, useEffect, useCallback } from "react";
|
|
3
3
|
import { createPortal } from "react-dom";
|
|
4
4
|
import { useQuery, keepPreviousData } from "@tanstack/react-query";
|
|
5
5
|
import { filterOperationsByDomain } from "./classify.js";
|
|
@@ -10,6 +10,8 @@ import { OperationResultView } from "./OperationResultView.js";
|
|
|
10
10
|
import { applyFilterExtensions } from "../components/filter-bar-utils.js";
|
|
11
11
|
import { useOperations } from "./useOperations.js";
|
|
12
12
|
import { packParameterValues, parametersToFormConfig, dataTablePaginationFromForm } from "./formMetadata.js";
|
|
13
|
+
import { useOperationFilterSearch } from "./operationFilterSearch.js";
|
|
14
|
+
import { parseMultiFilterValue, serializeMultiFilterValue } from "../data/data-table-filter-values.js";
|
|
13
15
|
const defaultCommandHref = (operationId) => `/commands/${operationId}`;
|
|
14
16
|
function defaultRenderError(err, title) {
|
|
15
17
|
const message = err instanceof Error ? err.message : String(err ?? "");
|
|
@@ -121,15 +123,22 @@ function OperationCatalog({
|
|
|
121
123
|
() => useSurfaceMetadata ? findSurfaceCollectionActions(domainOps, surfaceKey) : [],
|
|
122
124
|
[domainOps, surfaceKey, useSurfaceMetadata]
|
|
123
125
|
);
|
|
126
|
+
const lookupSearch = useOperationFilterSearch(
|
|
127
|
+
client,
|
|
128
|
+
listEndpoint,
|
|
129
|
+
filters,
|
|
130
|
+
listParameters
|
|
131
|
+
);
|
|
124
132
|
const filterBarConfig = useMemo(() => {
|
|
125
133
|
const options = {
|
|
126
|
-
includeLocations: ["query"]
|
|
134
|
+
includeLocations: ["query"],
|
|
135
|
+
lookupSearch
|
|
127
136
|
};
|
|
128
137
|
if (lookupQuery.data != null) {
|
|
129
138
|
options.lookup = lookupQuery.data;
|
|
130
139
|
}
|
|
131
140
|
return parametersToFormConfig(listParameters, filters, setFilters, options);
|
|
132
|
-
}, [filters, listParameters, lookupQuery.data]);
|
|
141
|
+
}, [filters, listParameters, lookupQuery.data, lookupSearch]);
|
|
133
142
|
const dataTablePagination = useMemo(
|
|
134
143
|
() => dataTablePaginationFromForm(filterBarConfig.pagination, listQuery.data),
|
|
135
144
|
[filterBarConfig.pagination, listQuery.data]
|
|
@@ -140,6 +149,70 @@ function OperationCatalog({
|
|
|
140
149
|
),
|
|
141
150
|
[filterBarConfig.filters, filterPre]
|
|
142
151
|
);
|
|
152
|
+
const cellFilters = useMemo(
|
|
153
|
+
() => Object.fromEntries(
|
|
154
|
+
listParameters.filter((parameter) => {
|
|
155
|
+
var _a2;
|
|
156
|
+
return ((_a2 = parameter["x-clicky"]) == null ? void 0 : _a2.role) === "filter";
|
|
157
|
+
}).map((parameter) => [
|
|
158
|
+
parameter.name,
|
|
159
|
+
parseMultiFilterValue(filters[parameter.name] ?? "")
|
|
160
|
+
])
|
|
161
|
+
),
|
|
162
|
+
[filters, listParameters]
|
|
163
|
+
);
|
|
164
|
+
const onCellFilterChange = useCallback(
|
|
165
|
+
({ key, value, mode }) => {
|
|
166
|
+
if (!listParameters.some(
|
|
167
|
+
(parameter) => {
|
|
168
|
+
var _a2;
|
|
169
|
+
return parameter.name === key && ((_a2 = parameter["x-clicky"]) == null ? void 0 : _a2.role) === "filter";
|
|
170
|
+
}
|
|
171
|
+
)) {
|
|
172
|
+
throw new Error(`Clicky table column references unknown filter parameter ${key}`);
|
|
173
|
+
}
|
|
174
|
+
setFilters((current) => {
|
|
175
|
+
const selected = parseMultiFilterValue(current[key] ?? "");
|
|
176
|
+
if (mode === void 0) {
|
|
177
|
+
delete selected[value];
|
|
178
|
+
} else {
|
|
179
|
+
selected[value] = mode;
|
|
180
|
+
}
|
|
181
|
+
const next = { ...current };
|
|
182
|
+
const serialized = serializeMultiFilterValue(selected);
|
|
183
|
+
if (serialized) {
|
|
184
|
+
next[key] = serialized;
|
|
185
|
+
} else {
|
|
186
|
+
delete next[key];
|
|
187
|
+
}
|
|
188
|
+
const offset = listParameters.find(
|
|
189
|
+
(parameter) => {
|
|
190
|
+
var _a2;
|
|
191
|
+
return ((_a2 = parameter["x-clicky"]) == null ? void 0 : _a2.role) === "offset";
|
|
192
|
+
}
|
|
193
|
+
);
|
|
194
|
+
if (offset) next[offset.name] = "0";
|
|
195
|
+
return next;
|
|
196
|
+
});
|
|
197
|
+
},
|
|
198
|
+
[listParameters]
|
|
199
|
+
);
|
|
200
|
+
const resultFilterConfig = useMemo(
|
|
201
|
+
() => ({
|
|
202
|
+
filters: decoratedFilters,
|
|
203
|
+
cellFilters,
|
|
204
|
+
onCellFilterChange,
|
|
205
|
+
...filterBarConfig.search ? { search: filterBarConfig.search } : {},
|
|
206
|
+
...filterBarConfig.timeRange ? { timeRange: filterBarConfig.timeRange } : {}
|
|
207
|
+
}),
|
|
208
|
+
[
|
|
209
|
+
cellFilters,
|
|
210
|
+
decoratedFilters,
|
|
211
|
+
filterBarConfig.search,
|
|
212
|
+
filterBarConfig.timeRange,
|
|
213
|
+
onCellFilterChange
|
|
214
|
+
]
|
|
215
|
+
);
|
|
143
216
|
const showTable = !!listEndpoint;
|
|
144
217
|
let listError;
|
|
145
218
|
if (!listQuery.isFetching) {
|
|
@@ -220,11 +293,7 @@ function OperationCatalog({
|
|
|
220
293
|
ariaLabel: `${definition.title} results`,
|
|
221
294
|
className: "mt-0 h-full min-h-0",
|
|
222
295
|
detailOperation,
|
|
223
|
-
filterConfig:
|
|
224
|
-
filters: decoratedFilters,
|
|
225
|
-
...filterBarConfig.search ? { search: filterBarConfig.search } : {},
|
|
226
|
-
...filterBarConfig.timeRange ? { timeRange: filterBarConfig.timeRange } : {}
|
|
227
|
-
},
|
|
296
|
+
filterConfig: resultFilterConfig,
|
|
228
297
|
...tableError ? { error: tableError } : {},
|
|
229
298
|
...commandRuntime ? { commandRuntime } : {},
|
|
230
299
|
...dataTablePagination ? { pagination: dataTablePagination } : {},
|
|
@@ -234,6 +303,13 @@ function OperationCatalog({
|
|
|
234
303
|
return resultRenderer ? resultRenderer({
|
|
235
304
|
response: listQuery.data ?? null,
|
|
236
305
|
defaultView,
|
|
306
|
+
filterConfig: resultFilterConfig,
|
|
307
|
+
// A renderer that replaces the table owns the whole surface,
|
|
308
|
+
// pager and download menu included. Without these it can only
|
|
309
|
+
// drop them, which is how a replaced view silently loses the
|
|
310
|
+
// ability to reach page two.
|
|
311
|
+
...dataTablePagination ? { pagination: dataTablePagination } : {},
|
|
312
|
+
...download ? { download } : {},
|
|
237
313
|
...surfaceKey ? { surfaceKey } : {}
|
|
238
314
|
}) : defaultView;
|
|
239
315
|
})()
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OperationCatalog.js","sources":["../../src/rpc/OperationCatalog.tsx"],"sourcesContent":["import { useEffect, useMemo, useState, type ReactNode } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { keepPreviousData, useQuery } from \"@tanstack/react-query\";\nimport { filterOperationsByDomain } from \"./classify\";\nimport {\n filterOperationsBySurface,\n findSurfaceCollectionActions,\n findSurfaceDetailOperation,\n findSurfaceListOperation,\n getOperationClickyMeta,\n} from \"./clickyMetadata\";\nimport type {\n ClickyCommandRuntime,\n ClickyDownloadOptions,\n ClickyRemoteFormat,\n} from \"../data/Clicky\";\nimport { EndpointList, type RenderLink } from \"./EndpointList\";\nimport { OperationActionBar } from \"./OperationActionBar\";\nimport {\n OperationResultView,\n type ResultRenderer,\n} from \"./OperationResultView\";\nimport { type FormActionsRenderer } from \"./SchemaActionForm\";\nimport {\n applyFilterExtensions,\n type FilterExtension,\n} from \"../components/filter-bar-utils\";\nimport type {\n PreExtension,\n PostExtension,\n} from \"../components/json-schema-form-types\";\nimport {\n type DomainDefinition,\n type ExecutionResponse,\n type OperationLookupResponse,\n type ResolvedOperation,\n} from \"./types\";\nimport { useOperations, type OperationsApiClient } from \"./useOperations\";\nimport {\n dataTablePaginationFromForm,\n packParameterValues,\n parametersToFormConfig,\n type ParameterFormOptions,\n} from \"./formMetadata\";\n\nexport type OperationCatalogProps = {\n definition: DomainDefinition;\n entities: string[];\n client: OperationsApiClient;\n renderLink: RenderLink;\n // Override to return all operations (e.g. for an \"API explorer\" domain\n // that shouldn't be filtered by entity tags).\n allOperations?: boolean;\n surfaceKey?: string;\n // Domain-specific filter decorators (e.g. stamp an entity icon by filter\n // name). Composed in array order; mirrors JsonSchemaForm's `pre`.\n filterPre?: FilterExtension[];\n getCommandHref?: (operationId: string, op: ResolvedOperation) => string;\n renderError?: (err: unknown, title: string) => ReactNode;\n commandRuntime?: ClickyCommandRuntime;\n // Custom JsonSchemaForm field extensions forwarded to the create/edit form.\n formPre?: PreExtension[];\n formPost?: PostExtension[];\n // Optional extra footer actions for the create/edit form (e.g. a connection\n // \"Test\" button).\n formActions?: FormActionsRenderer;\n actionLabels?: Record<string, string>;\n // Optional host override for the result surface, keyed off the current surface.\n // Receives the default OperationResultView so non-overridden surfaces render\n // unchanged.\n resultRenderer?: ResultRenderer;\n /**\n * Portal target for the collection action bar (Create, bulk actions). When\n * set, the bar renders into this element — typically an app shell's\n * `bodyActions` slot — instead of inline under the catalog header.\n *\n * A portal rather than a render-prop because the bar owns its own dialog\n * state and closes over the catalog's live filters and list query; moving the\n * element would sever both. Falls back to inline rendering when null, so\n * existing consumers are unaffected.\n */\n actionsContainer?: Element | null;\n};\n\nconst defaultCommandHref = (operationId: string) => `/commands/${operationId}`;\n\nfunction defaultRenderError(err: unknown, title: string) {\n const message = err instanceof Error ? err.message : String(err ?? \"\");\n return (\n <div className=\"rounded-xl border border-destructive/40 bg-destructive/5 p-4 text-sm text-destructive\">\n <div className=\"font-medium\">{title}</div>\n {message && (\n <div className=\"mt-1 whitespace-pre-wrap text-xs opacity-80\">\n {message}\n </div>\n )}\n </div>\n );\n}\n\nexport function OperationCatalog({\n definition,\n entities,\n client,\n renderLink,\n allOperations = false,\n surfaceKey,\n filterPre,\n getCommandHref = defaultCommandHref,\n renderError = defaultRenderError,\n commandRuntime,\n formPre,\n formPost,\n formActions,\n actionLabels,\n resultRenderer,\n actionsContainer,\n}: OperationCatalogProps) {\n const { operations, isLoading } = useOperations(client);\n\n const surfaceOps = useMemo(\n () => filterOperationsBySurface(operations, surfaceKey),\n [operations, surfaceKey],\n );\n const useSurfaceMetadata = surfaceOps.length > 0;\n\n // domainOps are the operations scoped to this domain: a surface's operations\n // when surfaceKey resolves, otherwise the entity-tagged operations — used only\n // to render the generic operation-page fallback, never to guess a table.\n const domainOps = useMemo(() => {\n if (useSurfaceMetadata) return surfaceOps;\n return allOperations\n ? operations\n : filterOperationsByDomain(operations, entities);\n }, [allOperations, entities, operations, surfaceOps, useSurfaceMetadata]);\n\n // The list table is driven solely by x-clicky surface metadata. Without a\n // surface there is no authoritative list op, so listEndpoint stays undefined\n // and the catalog renders the generic EndpointList fallback instead of\n // guessing a table from operationId/path conventions.\n const listEndpoint = useMemo(() => {\n if (!useSurfaceMetadata) return undefined;\n return findSurfaceListOperation(domainOps, surfaceKey);\n }, [domainOps, surfaceKey, useSurfaceMetadata]);\n // The detail op turns each list row into a link to /<surface>/<id>; absent it\n // (no surface metadata) rows stay non-navigable.\n const detailOperation = useMemo(\n () =>\n useSurfaceMetadata\n ? findSurfaceDetailOperation(domainOps, surfaceKey)\n : undefined,\n [domainOps, surfaceKey, useSurfaceMetadata],\n );\n const [filters, setFilters] = useState<Record<string, string>>(() =>\n readFiltersFromUrl(),\n );\n const listParameters = listEndpoint?.operation.parameters ?? [];\n const download = useMemo<ClickyDownloadOptions | undefined>(() => {\n const meta = listEndpoint?.operation[\"x-clicky\"]?.export;\n if (!meta) return undefined;\n return {\n label: definition.title,\n ...(meta.formats\n ? { formats: meta.formats as ClickyRemoteFormat[] }\n : {}),\n ...(meta.scopes ? { scopes: meta.scopes } : {}),\n ...(meta.allRowsMode ? { allRowsMode: meta.allRowsMode } : {}),\n ...(meta.formatMaxRows\n ? {\n formatMaxRows: meta.formatMaxRows as Partial<\n Record<ClickyRemoteFormat, number>\n >,\n }\n : {}),\n };\n }, [definition.title, listEndpoint]);\n\n useEffect(() => {\n writeFiltersToUrl(filters);\n }, [filters]);\n\n const listQuery = useQuery<ExecutionResponse>({\n queryKey: [\n \"operation-list\",\n listEndpoint?.method,\n listEndpoint?.path,\n filters,\n ],\n queryFn: () =>\n client.executeCommand(\n listEndpoint!.path,\n listEndpoint!.method,\n packParameterValues(filters, listEndpoint!.operation.parameters ?? []),\n {\n Accept: \"application/json+clicky\",\n },\n ),\n enabled: !!listEndpoint,\n placeholderData: keepPreviousData,\n staleTime: 30_000,\n retry: 0,\n });\n\n const lookupQuery = useQuery<OperationLookupResponse>({\n queryKey: [\n \"operation-lookup\",\n listEndpoint?.method,\n listEndpoint?.path,\n filters,\n ],\n queryFn: async () =>\n (await client.lookupFilters?.(\n listEndpoint!.path,\n listEndpoint!.method,\n packParameterValues(filters, listParameters),\n { Accept: \"application/json+clicky\" },\n )) ?? { filters: {} },\n enabled: !!listEndpoint && !!client.lookupFilters,\n staleTime: 30_000,\n retry: 0,\n });\n\n // The list action bar shows only collection-scoped actions (create + bulk\n // actions that operate on the filtered set). Entity-scoped actions\n // (update/delete and per-id custom actions) need an {id}, so they live on the\n // detail page (OperationEntityPage) instead. In the generic fallback the\n // EndpointList already exposes every operation as a runnable card, so there is\n // no separate action bar to guess at.\n const actionOps = useMemo(\n () =>\n useSurfaceMetadata\n ? findSurfaceCollectionActions(domainOps, surfaceKey)\n : [],\n [domainOps, surfaceKey, useSurfaceMetadata],\n );\n\n const filterBarConfig = useMemo(() => {\n const options: ParameterFormOptions = {\n includeLocations: [\"query\"],\n };\n if (lookupQuery.data != null) {\n options.lookup = lookupQuery.data;\n }\n return parametersToFormConfig(listParameters, filters, setFilters, options);\n }, [filters, listParameters, lookupQuery.data]);\n const dataTablePagination = useMemo(\n () =>\n dataTablePaginationFromForm(filterBarConfig.pagination, listQuery.data),\n [filterBarConfig.pagination, listQuery.data],\n );\n const decoratedFilters = useMemo(\n () =>\n filterBarConfig.filters.map((filter) =>\n applyFilterExtensions(filter, filterPre),\n ),\n [filterBarConfig.filters, filterPre],\n );\n\n const showTable = !!listEndpoint;\n let listError: unknown;\n if (!listQuery.isFetching) {\n if (listQuery.isError) {\n listError = listQuery.error;\n } else if (listQuery.data?.success === false) {\n listError = new Error(\n listQuery.data.error ||\n listQuery.data.message ||\n listQuery.data.stderr ||\n `Command failed with exit code ${listQuery.data.exit_code}`,\n );\n }\n }\n const tableError =\n listError !== undefined\n ? renderError(\n listError,\n `Failed to load ${listEndpoint?.path ?? \"\"}`,\n )\n : undefined;\n const tableResponse =\n listQuery.data?.success === false ? null : (listQuery.data ?? null);\n // Lock the current list filters into a bulk action (supportsFilterMode), so a\n // collection action like \"pause\" runs against the same set the table shows.\n // Entity-scoped actions never reach here (they live on the detail page).\n function getActionLockedValues(\n op: ResolvedOperation,\n ): Record<string, string> {\n const meta = getOperationClickyMeta(op);\n if (meta == null || !meta.supportsFilterMode) {\n return {};\n }\n\n const locked: Record<string, string> = {};\n for (const param of op.operation.parameters ?? []) {\n const value = filters[param.name];\n if (param.in === \"query\" && value) {\n locked[param.name] = value;\n }\n }\n\n if (meta.idParam) {\n locked[meta.idParam] = \"all\";\n }\n\n if (\n (op.operation.parameters ?? []).some((param) => param.name === \"filter\")\n ) {\n locked.filter =\n Object.entries(filters)\n .filter(([, value]) => value)\n .map(([key, value]) => `${key}=${value}`)\n .join(\", \") || \"current list filters\";\n }\n\n return locked;\n }\n\n if (isLoading) {\n return (\n <div className=\"space-y-3\">\n <SkeletonBlock className=\"h-10 w-72\" />\n <SkeletonBlock className=\"h-4 w-[32rem]\" />\n {Array.from({ length: 5 }).map((_, i) => (\n <SkeletonBlock key={i} className=\"h-12\" />\n ))}\n </div>\n );\n }\n\n const actionBar = (\n <OperationActionBar\n actions={actionOps}\n client={client}\n getLockedValues={getActionLockedValues}\n onExecuted={() => void listQuery.refetch()}\n {...(commandRuntime ? { commandRuntime } : {})}\n {...(formPre ? { formPre } : {})}\n {...(formPost ? { formPost } : {})}\n {...(formActions ? { formActions } : {})}\n {...(actionLabels ? { actionLabels } : {})}\n />\n );\n\n return (\n <div\n className=\"flex h-full min-h-0 flex-col gap-2\"\n data-slot=\"operation-catalog\"\n >\n {/* No title/description here by design: page headers and breadcrumbs are\n the host's to define (e.g. an app shell's bodyHeader), so the catalog\n never invents chrome the consumer would have to fight or duplicate. */}\n {actionsContainer ? createPortal(actionBar, actionsContainer) : actionBar}\n\n {showTable ? (\n <div\n className=\"min-h-0 flex-1\"\n data-slot=\"operation-catalog-results\"\n >\n {(() => {\n const defaultView = (\n <OperationResultView\n response={tableResponse}\n loading={listQuery.isFetching}\n loadingMessage={`Loading ${definition.title} results…`}\n emptyMessage=\"No records returned\"\n ariaLabel={`${definition.title} results`}\n className=\"mt-0 h-full min-h-0\"\n detailOperation={detailOperation}\n filterConfig={{\n filters: decoratedFilters,\n ...(filterBarConfig.search\n ? { search: filterBarConfig.search }\n : {}),\n ...(filterBarConfig.timeRange\n ? { timeRange: filterBarConfig.timeRange }\n : {}),\n }}\n {...(tableError ? { error: tableError } : {})}\n {...(commandRuntime ? { commandRuntime } : {})}\n {...(dataTablePagination\n ? { pagination: dataTablePagination }\n : {})}\n {...(download ? { download } : {})}\n />\n );\n return resultRenderer\n ? resultRenderer({\n response: listQuery.data ?? null,\n defaultView,\n ...(surfaceKey ? { surfaceKey } : {}),\n })\n : defaultView;\n })()}\n </div>\n ) : (\n <EndpointList\n operations={domainOps}\n definition={definition}\n renderLink={renderLink}\n getCommandHref={getCommandHref}\n />\n )}\n </div>\n );\n}\n\nfunction readFiltersFromUrl(): Record<string, string> {\n if (typeof window === \"undefined\") return {};\n const search = new URLSearchParams(window.location.search);\n const values: Record<string, string> = {};\n for (const [key, value] of search.entries()) {\n if (key.startsWith(\"__\")) continue;\n if (value !== \"\") values[key] = value;\n }\n return values;\n}\n\nfunction SkeletonBlock({ className }: { className?: string }) {\n return (\n <div\n className={`animate-pulse rounded-md bg-muted ${className ?? \"\"}`.trim()}\n />\n );\n}\n\nfunction writeFiltersToUrl(filters: Record<string, string>) {\n if (typeof window === \"undefined\") return;\n const search = reservedSearchParamsFromUrl();\n for (const [key, value] of Object.entries(filters)) {\n if (value !== \"\") search.set(key, value);\n }\n const query = search.toString();\n const next = `${window.location.pathname}${query ? `?${query}` : \"\"}${window.location.hash}`;\n if (\n next !==\n `${window.location.pathname}${window.location.search}${window.location.hash}`\n ) {\n window.history.replaceState(window.history.state, \"\", next);\n }\n}\n\nfunction reservedSearchParamsFromUrl() {\n const current = new URLSearchParams(window.location.search);\n const next = new URLSearchParams();\n for (const [key, value] of current.entries()) {\n if (!key.startsWith(\"__\")) continue;\n if (key === \"__autoRun\" || key.startsWith(\"__arg\")) continue;\n next.append(key, value);\n }\n return next;\n}\n"],"names":["_a"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"OperationCatalog.js","sources":["../../src/rpc/OperationCatalog.tsx"],"sourcesContent":["import { useCallback, useEffect, useMemo, useState, type ReactNode } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { keepPreviousData, useQuery } from \"@tanstack/react-query\";\nimport { filterOperationsByDomain } from \"./classify\";\nimport {\n filterOperationsBySurface,\n findSurfaceCollectionActions,\n findSurfaceDetailOperation,\n findSurfaceListOperation,\n getOperationClickyMeta,\n} from \"./clickyMetadata\";\nimport type {\n ClickyCommandRuntime,\n ClickyDownloadOptions,\n ClickyRemoteFormat,\n} from \"../data/Clicky\";\nimport type { CellFilterChange } from \"../data/cells/CellFilterActions\";\nimport { EndpointList, type RenderLink } from \"./EndpointList\";\nimport { OperationActionBar } from \"./OperationActionBar\";\nimport {\n OperationResultView,\n type OperationResultFilterConfig,\n type ResultRenderer,\n} from \"./OperationResultView\";\nimport { type FormActionsRenderer } from \"./SchemaActionForm\";\nimport {\n applyFilterExtensions,\n type FilterExtension,\n} from \"../components/filter-bar-utils\";\nimport type {\n PreExtension,\n PostExtension,\n} from \"../components/json-schema-form-types\";\nimport {\n type DomainDefinition,\n type ExecutionResponse,\n type OperationLookupResponse,\n type ResolvedOperation,\n} from \"./types\";\nimport { useOperations, type OperationsApiClient } from \"./useOperations\";\nimport {\n dataTablePaginationFromForm,\n packParameterValues,\n parametersToFormConfig,\n type ParameterFormOptions,\n} from \"./formMetadata\";\nimport { useOperationFilterSearch } from \"./operationFilterSearch\";\nimport {\n parseMultiFilterValue,\n serializeMultiFilterValue,\n} from \"../data/data-table-filter-values\";\n\nexport type OperationCatalogProps = {\n definition: DomainDefinition;\n entities: string[];\n client: OperationsApiClient;\n renderLink: RenderLink;\n // Override to return all operations (e.g. for an \"API explorer\" domain\n // that shouldn't be filtered by entity tags).\n allOperations?: boolean;\n surfaceKey?: string;\n // Domain-specific filter decorators (e.g. stamp an entity icon by filter\n // name). Composed in array order; mirrors JsonSchemaForm's `pre`.\n filterPre?: FilterExtension[];\n getCommandHref?: (operationId: string, op: ResolvedOperation) => string;\n renderError?: (err: unknown, title: string) => ReactNode;\n commandRuntime?: ClickyCommandRuntime;\n // Custom JsonSchemaForm field extensions forwarded to the create/edit form.\n formPre?: PreExtension[];\n formPost?: PostExtension[];\n // Optional extra footer actions for the create/edit form (e.g. a connection\n // \"Test\" button).\n formActions?: FormActionsRenderer;\n actionLabels?: Record<string, string>;\n // Optional host override for the result surface, keyed off the current surface.\n // Receives the default OperationResultView so non-overridden surfaces render\n // unchanged.\n resultRenderer?: ResultRenderer;\n /**\n * Portal target for the collection action bar (Create, bulk actions). When\n * set, the bar renders into this element — typically an app shell's\n * `bodyActions` slot — instead of inline under the catalog header.\n *\n * A portal rather than a render-prop because the bar owns its own dialog\n * state and closes over the catalog's live filters and list query; moving the\n * element would sever both. Falls back to inline rendering when null, so\n * existing consumers are unaffected.\n */\n actionsContainer?: Element | null;\n};\n\nconst defaultCommandHref = (operationId: string) => `/commands/${operationId}`;\n\nfunction defaultRenderError(err: unknown, title: string) {\n const message = err instanceof Error ? err.message : String(err ?? \"\");\n return (\n <div className=\"rounded-xl border border-destructive/40 bg-destructive/5 p-4 text-sm text-destructive\">\n <div className=\"font-medium\">{title}</div>\n {message && (\n <div className=\"mt-1 whitespace-pre-wrap text-xs opacity-80\">\n {message}\n </div>\n )}\n </div>\n );\n}\n\nexport function OperationCatalog({\n definition,\n entities,\n client,\n renderLink,\n allOperations = false,\n surfaceKey,\n filterPre,\n getCommandHref = defaultCommandHref,\n renderError = defaultRenderError,\n commandRuntime,\n formPre,\n formPost,\n formActions,\n actionLabels,\n resultRenderer,\n actionsContainer,\n}: OperationCatalogProps) {\n const { operations, isLoading } = useOperations(client);\n\n const surfaceOps = useMemo(\n () => filterOperationsBySurface(operations, surfaceKey),\n [operations, surfaceKey],\n );\n const useSurfaceMetadata = surfaceOps.length > 0;\n\n // domainOps are the operations scoped to this domain: a surface's operations\n // when surfaceKey resolves, otherwise the entity-tagged operations — used only\n // to render the generic operation-page fallback, never to guess a table.\n const domainOps = useMemo(() => {\n if (useSurfaceMetadata) return surfaceOps;\n return allOperations\n ? operations\n : filterOperationsByDomain(operations, entities);\n }, [allOperations, entities, operations, surfaceOps, useSurfaceMetadata]);\n\n // The list table is driven solely by x-clicky surface metadata. Without a\n // surface there is no authoritative list op, so listEndpoint stays undefined\n // and the catalog renders the generic EndpointList fallback instead of\n // guessing a table from operationId/path conventions.\n const listEndpoint = useMemo(() => {\n if (!useSurfaceMetadata) return undefined;\n return findSurfaceListOperation(domainOps, surfaceKey);\n }, [domainOps, surfaceKey, useSurfaceMetadata]);\n // The detail op turns each list row into a link to /<surface>/<id>; absent it\n // (no surface metadata) rows stay non-navigable.\n const detailOperation = useMemo(\n () =>\n useSurfaceMetadata\n ? findSurfaceDetailOperation(domainOps, surfaceKey)\n : undefined,\n [domainOps, surfaceKey, useSurfaceMetadata],\n );\n const [filters, setFilters] = useState<Record<string, string>>(() =>\n readFiltersFromUrl(),\n );\n const listParameters = listEndpoint?.operation.parameters ?? [];\n const download = useMemo<ClickyDownloadOptions | undefined>(() => {\n const meta = listEndpoint?.operation[\"x-clicky\"]?.export;\n if (!meta) return undefined;\n return {\n label: definition.title,\n ...(meta.formats\n ? { formats: meta.formats as ClickyRemoteFormat[] }\n : {}),\n ...(meta.scopes ? { scopes: meta.scopes } : {}),\n ...(meta.allRowsMode ? { allRowsMode: meta.allRowsMode } : {}),\n ...(meta.formatMaxRows\n ? {\n formatMaxRows: meta.formatMaxRows as Partial<\n Record<ClickyRemoteFormat, number>\n >,\n }\n : {}),\n };\n }, [definition.title, listEndpoint]);\n\n useEffect(() => {\n writeFiltersToUrl(filters);\n }, [filters]);\n\n const listQuery = useQuery<ExecutionResponse>({\n queryKey: [\n \"operation-list\",\n listEndpoint?.method,\n listEndpoint?.path,\n filters,\n ],\n queryFn: () =>\n client.executeCommand(\n listEndpoint!.path,\n listEndpoint!.method,\n packParameterValues(filters, listEndpoint!.operation.parameters ?? []),\n {\n Accept: \"application/json+clicky\",\n },\n ),\n enabled: !!listEndpoint,\n placeholderData: keepPreviousData,\n staleTime: 30_000,\n retry: 0,\n });\n\n const lookupQuery = useQuery<OperationLookupResponse>({\n queryKey: [\n \"operation-lookup\",\n listEndpoint?.method,\n listEndpoint?.path,\n filters,\n ],\n queryFn: async () =>\n (await client.lookupFilters?.(\n listEndpoint!.path,\n listEndpoint!.method,\n packParameterValues(filters, listParameters),\n { Accept: \"application/json+clicky\" },\n )) ?? { filters: {} },\n enabled: !!listEndpoint && !!client.lookupFilters,\n staleTime: 30_000,\n retry: 0,\n });\n\n // The list action bar shows only collection-scoped actions (create + bulk\n // actions that operate on the filtered set). Entity-scoped actions\n // (update/delete and per-id custom actions) need an {id}, so they live on the\n // detail page (OperationEntityPage) instead. In the generic fallback the\n // EndpointList already exposes every operation as a runnable card, so there is\n // no separate action bar to guess at.\n const actionOps = useMemo(\n () =>\n useSurfaceMetadata\n ? findSurfaceCollectionActions(domainOps, surfaceKey)\n : [],\n [domainOps, surfaceKey, useSurfaceMetadata],\n );\n\n const lookupSearch = useOperationFilterSearch(\n client,\n listEndpoint,\n filters,\n listParameters,\n );\n\n const filterBarConfig = useMemo(() => {\n const options: ParameterFormOptions = {\n includeLocations: [\"query\"],\n lookupSearch,\n };\n if (lookupQuery.data != null) {\n options.lookup = lookupQuery.data;\n }\n return parametersToFormConfig(listParameters, filters, setFilters, options);\n }, [filters, listParameters, lookupQuery.data, lookupSearch]);\n const dataTablePagination = useMemo(\n () =>\n dataTablePaginationFromForm(filterBarConfig.pagination, listQuery.data),\n [filterBarConfig.pagination, listQuery.data],\n );\n const decoratedFilters = useMemo(\n () =>\n filterBarConfig.filters.map((filter) =>\n applyFilterExtensions(filter, filterPre),\n ),\n [filterBarConfig.filters, filterPre],\n );\n const cellFilters = useMemo(\n () =>\n Object.fromEntries(\n listParameters\n .filter((parameter) => parameter[\"x-clicky\"]?.role === \"filter\")\n .map((parameter) => [\n parameter.name,\n parseMultiFilterValue(filters[parameter.name] ?? \"\"),\n ]),\n ),\n [filters, listParameters],\n );\n const onCellFilterChange = useCallback(\n ({ key, value, mode }: CellFilterChange) => {\n if (\n !listParameters.some(\n (parameter) =>\n parameter.name === key && parameter[\"x-clicky\"]?.role === \"filter\",\n )\n ) {\n throw new Error(`Clicky table column references unknown filter parameter ${key}`);\n }\n\n setFilters((current) => {\n const selected = parseMultiFilterValue(current[key] ?? \"\");\n if (mode === undefined) {\n delete selected[value];\n } else {\n selected[value] = mode;\n }\n\n const next = { ...current };\n const serialized = serializeMultiFilterValue(selected);\n if (serialized) {\n next[key] = serialized;\n } else {\n delete next[key];\n }\n\n const offset = listParameters.find(\n (parameter) => parameter[\"x-clicky\"]?.role === \"offset\",\n );\n if (offset) next[offset.name] = \"0\";\n return next;\n });\n },\n [listParameters],\n );\n const resultFilterConfig = useMemo<OperationResultFilterConfig>(\n () => ({\n filters: decoratedFilters,\n cellFilters,\n onCellFilterChange,\n ...(filterBarConfig.search ? { search: filterBarConfig.search } : {}),\n ...(filterBarConfig.timeRange\n ? { timeRange: filterBarConfig.timeRange }\n : {}),\n }),\n [\n cellFilters,\n decoratedFilters,\n filterBarConfig.search,\n filterBarConfig.timeRange,\n onCellFilterChange,\n ],\n );\n\n const showTable = !!listEndpoint;\n let listError: unknown;\n if (!listQuery.isFetching) {\n if (listQuery.isError) {\n listError = listQuery.error;\n } else if (listQuery.data?.success === false) {\n listError = new Error(\n listQuery.data.error ||\n listQuery.data.message ||\n listQuery.data.stderr ||\n `Command failed with exit code ${listQuery.data.exit_code}`,\n );\n }\n }\n const tableError =\n listError !== undefined\n ? renderError(\n listError,\n `Failed to load ${listEndpoint?.path ?? \"\"}`,\n )\n : undefined;\n const tableResponse =\n listQuery.data?.success === false ? null : (listQuery.data ?? null);\n // Lock the current list filters into a bulk action (supportsFilterMode), so a\n // collection action like \"pause\" runs against the same set the table shows.\n // Entity-scoped actions never reach here (they live on the detail page).\n function getActionLockedValues(\n op: ResolvedOperation,\n ): Record<string, string> {\n const meta = getOperationClickyMeta(op);\n if (meta == null || !meta.supportsFilterMode) {\n return {};\n }\n\n const locked: Record<string, string> = {};\n for (const param of op.operation.parameters ?? []) {\n const value = filters[param.name];\n if (param.in === \"query\" && value) {\n locked[param.name] = value;\n }\n }\n\n if (meta.idParam) {\n locked[meta.idParam] = \"all\";\n }\n\n if (\n (op.operation.parameters ?? []).some((param) => param.name === \"filter\")\n ) {\n locked.filter =\n Object.entries(filters)\n .filter(([, value]) => value)\n .map(([key, value]) => `${key}=${value}`)\n .join(\", \") || \"current list filters\";\n }\n\n return locked;\n }\n\n if (isLoading) {\n return (\n <div className=\"space-y-3\">\n <SkeletonBlock className=\"h-10 w-72\" />\n <SkeletonBlock className=\"h-4 w-[32rem]\" />\n {Array.from({ length: 5 }).map((_, i) => (\n <SkeletonBlock key={i} className=\"h-12\" />\n ))}\n </div>\n );\n }\n\n const actionBar = (\n <OperationActionBar\n actions={actionOps}\n client={client}\n getLockedValues={getActionLockedValues}\n onExecuted={() => void listQuery.refetch()}\n {...(commandRuntime ? { commandRuntime } : {})}\n {...(formPre ? { formPre } : {})}\n {...(formPost ? { formPost } : {})}\n {...(formActions ? { formActions } : {})}\n {...(actionLabels ? { actionLabels } : {})}\n />\n );\n\n return (\n <div\n className=\"flex h-full min-h-0 flex-col gap-2\"\n data-slot=\"operation-catalog\"\n >\n {/* No title/description here by design: page headers and breadcrumbs are\n the host's to define (e.g. an app shell's bodyHeader), so the catalog\n never invents chrome the consumer would have to fight or duplicate. */}\n {actionsContainer ? createPortal(actionBar, actionsContainer) : actionBar}\n\n {showTable ? (\n <div\n className=\"min-h-0 flex-1\"\n data-slot=\"operation-catalog-results\"\n >\n {(() => {\n const defaultView = (\n <OperationResultView\n response={tableResponse}\n loading={listQuery.isFetching}\n loadingMessage={`Loading ${definition.title} results…`}\n emptyMessage=\"No records returned\"\n ariaLabel={`${definition.title} results`}\n className=\"mt-0 h-full min-h-0\"\n detailOperation={detailOperation}\n filterConfig={resultFilterConfig}\n {...(tableError ? { error: tableError } : {})}\n {...(commandRuntime ? { commandRuntime } : {})}\n {...(dataTablePagination\n ? { pagination: dataTablePagination }\n : {})}\n {...(download ? { download } : {})}\n />\n );\n return resultRenderer\n ? resultRenderer({\n response: listQuery.data ?? null,\n defaultView,\n filterConfig: resultFilterConfig,\n // A renderer that replaces the table owns the whole surface,\n // pager and download menu included. Without these it can only\n // drop them, which is how a replaced view silently loses the\n // ability to reach page two.\n ...(dataTablePagination ? { pagination: dataTablePagination } : {}),\n ...(download ? { download } : {}),\n ...(surfaceKey ? { surfaceKey } : {}),\n })\n : defaultView;\n })()}\n </div>\n ) : (\n <EndpointList\n operations={domainOps}\n definition={definition}\n renderLink={renderLink}\n getCommandHref={getCommandHref}\n />\n )}\n </div>\n );\n}\n\nfunction readFiltersFromUrl(): Record<string, string> {\n if (typeof window === \"undefined\") return {};\n const search = new URLSearchParams(window.location.search);\n const values: Record<string, string> = {};\n for (const [key, value] of search.entries()) {\n if (key.startsWith(\"__\")) continue;\n if (value !== \"\") values[key] = value;\n }\n return values;\n}\n\nfunction SkeletonBlock({ className }: { className?: string }) {\n return (\n <div\n className={`animate-pulse rounded-md bg-muted ${className ?? \"\"}`.trim()}\n />\n );\n}\n\nfunction writeFiltersToUrl(filters: Record<string, string>) {\n if (typeof window === \"undefined\") return;\n const search = reservedSearchParamsFromUrl();\n for (const [key, value] of Object.entries(filters)) {\n if (value !== \"\") search.set(key, value);\n }\n const query = search.toString();\n const next = `${window.location.pathname}${query ? `?${query}` : \"\"}${window.location.hash}`;\n if (\n next !==\n `${window.location.pathname}${window.location.search}${window.location.hash}`\n ) {\n window.history.replaceState(window.history.state, \"\", next);\n }\n}\n\nfunction reservedSearchParamsFromUrl() {\n const current = new URLSearchParams(window.location.search);\n const next = new URLSearchParams();\n for (const [key, value] of current.entries()) {\n if (!key.startsWith(\"__\")) continue;\n if (key === \"__autoRun\" || key.startsWith(\"__arg\")) continue;\n next.append(key, value);\n }\n return next;\n}\n"],"names":["_a"],"mappings":"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"}
|
|
@@ -78,6 +78,8 @@ function OperationResultView({
|
|
|
78
78
|
...filters && filters.length > 0 ? { externalFilters: filters } : {},
|
|
79
79
|
...(filterConfig == null ? void 0 : filterConfig.search) ? { search: filterConfig.search } : {},
|
|
80
80
|
...(filterConfig == null ? void 0 : filterConfig.timeRange) ? { timeRange: filterConfig.timeRange } : {},
|
|
81
|
+
...(filterConfig == null ? void 0 : filterConfig.cellFilters) ? { cellFilters: filterConfig.cellFilters } : {},
|
|
82
|
+
...(filterConfig == null ? void 0 : filterConfig.onCellFilterChange) ? { onCellFilterChange: filterConfig.onCellFilterChange } : {},
|
|
81
83
|
...pagination ? { pagination } : {},
|
|
82
84
|
...download ? { download } : {}
|
|
83
85
|
}
|
|
@@ -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 {\n DataTable,\n type DataTableColumn,\n type DataTablePagination,\n} from \"../data/DataTable\";\nimport type {\n ClickyCommandRuntime,\n ClickyDownloadOptions,\n} from \"../data/Clicky\";\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};\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};\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 {...(pagination ? { pagination } : {})}\n {...(download ? { download } : {})}\n />\n );\n}\n"],"names":["useRowDetailNavigation","jsx","cn","DataTable","ExecutionResult"],"mappings":";;;;;;;
|
|
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,17 +2,23 @@ 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;
|
|
@@ -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,EAGL,KAAK,mBAAmB,EACzB,MAAM,mBAAmB,CAAC;AAC3B,OAAO,KAAK,EACV,oBAAoB,EACpB,qBAAqB,EACtB,MAAM,gBAAgB,CAAC;
|
|
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"}
|
|
@@ -76,6 +76,8 @@ function OperationResultView({
|
|
|
76
76
|
...filters && filters.length > 0 ? { externalFilters: filters } : {},
|
|
77
77
|
...(filterConfig == null ? void 0 : filterConfig.search) ? { search: filterConfig.search } : {},
|
|
78
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 } : {},
|
|
79
81
|
...pagination ? { pagination } : {},
|
|
80
82
|
...download ? { download } : {}
|
|
81
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 {\n DataTable,\n type DataTableColumn,\n type DataTablePagination,\n} from \"../data/DataTable\";\nimport type {\n ClickyCommandRuntime,\n ClickyDownloadOptions,\n} from \"../data/Clicky\";\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};\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};\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 {...(pagination ? { pagination } : {})}\n {...(download ? { download } : {})}\n />\n );\n}\n"],"names":[],"mappings":";;;;;
|
|
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.
|