@flanksource/clicky-ui 0.2.14 → 0.2.16
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/chat.cjs +20 -0
- package/dist/chat.cjs.map +1 -0
- package/dist/chat.d.ts +2 -0
- package/dist/chat.d.ts.map +1 -0
- package/dist/chat.js +20 -0
- package/dist/chat.js.map +1 -0
- package/dist/components/Combobox.cjs +19 -9
- package/dist/components/Combobox.cjs.map +1 -1
- package/dist/components/Combobox.d.ts +10 -0
- package/dist/components/Combobox.d.ts.map +1 -1
- package/dist/components/Combobox.js +19 -9
- package/dist/components/Combobox.js.map +1 -1
- package/dist/components/DateTimePicker.cjs +6 -1
- package/dist/components/DateTimePicker.cjs.map +1 -1
- package/dist/components/DateTimePicker.d.ts +11 -3
- package/dist/components/DateTimePicker.d.ts.map +1 -1
- package/dist/components/DateTimePicker.js +6 -1
- package/dist/components/DateTimePicker.js.map +1 -1
- package/dist/components/Field.cjs +33 -0
- package/dist/components/Field.cjs.map +1 -0
- package/dist/components/Field.d.ts +27 -0
- package/dist/components/Field.d.ts.map +1 -0
- package/dist/components/Field.js +33 -0
- package/dist/components/Field.js.map +1 -0
- package/dist/components/FilterBar.cjs +49 -55
- package/dist/components/FilterBar.cjs.map +1 -1
- package/dist/components/FilterBar.d.ts +2 -2
- package/dist/components/FilterBar.d.ts.map +1 -1
- package/dist/components/FilterBar.js +44 -50
- package/dist/components/FilterBar.js.map +1 -1
- package/dist/components/FormatOptionsDropdown.cjs +2 -18
- package/dist/components/FormatOptionsDropdown.cjs.map +1 -1
- package/dist/components/FormatOptionsDropdown.d.ts +1 -17
- package/dist/components/FormatOptionsDropdown.d.ts.map +1 -1
- package/dist/components/FormatOptionsDropdown.js +1 -17
- package/dist/components/FormatOptionsDropdown.js.map +1 -1
- package/dist/components/JsonSchemaForm.cjs +128 -12
- package/dist/components/JsonSchemaForm.cjs.map +1 -1
- package/dist/components/JsonSchemaForm.d.ts +1 -1
- package/dist/components/JsonSchemaForm.d.ts.map +1 -1
- package/dist/components/JsonSchemaForm.js +131 -15
- package/dist/components/JsonSchemaForm.js.map +1 -1
- package/dist/components/MultiSelect.cjs +2 -1
- package/dist/components/MultiSelect.cjs.map +1 -1
- package/dist/components/MultiSelect.d.ts +5 -1
- package/dist/components/MultiSelect.d.ts.map +1 -1
- package/dist/components/MultiSelect.js +2 -1
- package/dist/components/MultiSelect.js.map +1 -1
- package/dist/components/SecretKeySelector.cjs +0 -1
- package/dist/components/SecretKeySelector.cjs.map +1 -1
- package/dist/components/SecretKeySelector.d.ts +0 -2
- package/dist/components/SecretKeySelector.d.ts.map +1 -1
- package/dist/components/SecretKeySelector.js +1 -2
- package/dist/components/SecretKeySelector.js.map +1 -1
- package/dist/components/TreePickerField.cjs +137 -0
- package/dist/components/TreePickerField.cjs.map +1 -0
- package/dist/components/TreePickerField.d.ts +30 -0
- package/dist/components/TreePickerField.d.ts.map +1 -0
- package/dist/components/TreePickerField.js +137 -0
- package/dist/components/TreePickerField.js.map +1 -0
- package/dist/components/WorkloadPicker.cjs +6 -81
- package/dist/components/WorkloadPicker.cjs.map +1 -1
- package/dist/components/WorkloadPicker.d.ts +1 -20
- package/dist/components/WorkloadPicker.d.ts.map +1 -1
- package/dist/components/WorkloadPicker.js +3 -78
- package/dist/components/WorkloadPicker.js.map +1 -1
- package/dist/components/button-variants.cjs +30 -0
- package/dist/components/button-variants.cjs.map +1 -0
- package/dist/components/button-variants.d.ts +5 -0
- package/dist/components/button-variants.d.ts.map +1 -0
- package/dist/components/button-variants.js +30 -0
- package/dist/components/button-variants.js.map +1 -0
- package/dist/components/button.cjs +11 -82
- package/dist/components/button.cjs.map +1 -1
- package/dist/components/button.d.ts +1 -5
- package/dist/components/button.d.ts.map +1 -1
- package/dist/components/button.js +5 -76
- package/dist/components/button.js.map +1 -1
- package/dist/components/filter-bar-utils.cjs +37 -0
- package/dist/components/filter-bar-utils.cjs.map +1 -0
- package/dist/components/filter-bar-utils.d.ts +4 -0
- package/dist/components/filter-bar-utils.d.ts.map +1 -0
- package/dist/components/filter-bar-utils.js +37 -0
- package/dist/components/filter-bar-utils.js.map +1 -0
- package/dist/components/format-options.cjs +20 -0
- package/dist/components/format-options.cjs.map +1 -0
- package/dist/components/format-options.d.ts +18 -0
- package/dist/components/format-options.d.ts.map +1 -0
- package/dist/components/format-options.js +20 -0
- package/dist/components/format-options.js.map +1 -0
- package/dist/components/json-schema-form-array.cjs +13 -17
- package/dist/components/json-schema-form-array.cjs.map +1 -1
- package/dist/components/json-schema-form-array.d.ts +1 -2
- package/dist/components/json-schema-form-array.d.ts.map +1 -1
- package/dist/components/json-schema-form-array.js +3 -7
- package/dist/components/json-schema-form-array.js.map +1 -1
- package/dist/components/json-schema-form-fields.cjs +97 -232
- package/dist/components/json-schema-form-fields.cjs.map +1 -1
- package/dist/components/json-schema-form-fields.d.ts +51 -6
- package/dist/components/json-schema-form-fields.d.ts.map +1 -1
- package/dist/components/json-schema-form-fields.js +89 -224
- package/dist/components/json-schema-form-fields.js.map +1 -1
- package/dist/components/json-schema-form-object.cjs +149 -0
- package/dist/components/json-schema-form-object.cjs.map +1 -0
- package/dist/components/json-schema-form-object.d.ts +10 -0
- package/dist/components/json-schema-form-object.d.ts.map +1 -0
- package/dist/components/json-schema-form-object.js +149 -0
- package/dist/components/json-schema-form-object.js.map +1 -0
- package/dist/components/json-schema-form-preferences.cjs +41 -0
- package/dist/components/json-schema-form-preferences.cjs.map +1 -0
- package/dist/components/json-schema-form-preferences.d.ts +10 -0
- package/dist/components/json-schema-form-preferences.d.ts.map +1 -0
- package/dist/components/json-schema-form-preferences.js +41 -0
- package/dist/components/json-schema-form-preferences.js.map +1 -0
- package/dist/components/json-schema-form-render.cjs +43 -72
- package/dist/components/json-schema-form-render.cjs.map +1 -1
- package/dist/components/json-schema-form-render.d.ts +5 -33
- package/dist/components/json-schema-form-render.d.ts.map +1 -1
- package/dist/components/json-schema-form-render.js +41 -70
- package/dist/components/json-schema-form-render.js.map +1 -1
- package/dist/components/json-schema-form-resolve.cjs +9 -1
- package/dist/components/json-schema-form-resolve.cjs.map +1 -1
- package/dist/components/json-schema-form-resolve.d.ts.map +1 -1
- package/dist/components/json-schema-form-resolve.js +9 -1
- package/dist/components/json-schema-form-resolve.js.map +1 -1
- package/dist/components/json-schema-form-types.d.ts +59 -1
- package/dist/components/json-schema-form-types.d.ts.map +1 -1
- package/dist/components/json-schema-form-utils.cjs +96 -0
- package/dist/components/json-schema-form-utils.cjs.map +1 -0
- package/dist/components/json-schema-form-utils.d.ts +17 -0
- package/dist/components/json-schema-form-utils.d.ts.map +1 -0
- package/dist/components/json-schema-form-utils.js +96 -0
- package/dist/components/json-schema-form-utils.js.map +1 -0
- package/dist/components/loading.cjs +109 -0
- package/dist/components/loading.cjs.map +1 -0
- package/dist/components/loading.d.ts +29 -0
- package/dist/components/loading.d.ts.map +1 -0
- package/dist/components/loading.js +109 -0
- package/dist/components/loading.js.map +1 -0
- package/dist/components/use-form.cjs +27 -0
- package/dist/components/use-form.cjs.map +1 -0
- package/dist/components/use-form.d.ts +30 -0
- package/dist/components/use-form.d.ts.map +1 -0
- package/dist/components/use-form.js +27 -0
- package/dist/components/use-form.js.map +1 -0
- package/dist/components/workload-picker-utils.cjs +88 -0
- package/dist/components/workload-picker-utils.cjs.map +1 -0
- package/dist/components/workload-picker-utils.d.ts +34 -0
- package/dist/components/workload-picker-utils.d.ts.map +1 -0
- package/dist/components/workload-picker-utils.js +88 -0
- package/dist/components/workload-picker-utils.js.map +1 -0
- package/dist/components.cjs +25 -6
- 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 +24 -5
- package/dist/components.js.map +1 -1
- package/dist/data/Badge.cjs +11 -91
- package/dist/data/Badge.cjs.map +1 -1
- package/dist/data/Badge.d.ts +1 -5
- package/dist/data/Badge.d.ts.map +1 -1
- package/dist/data/Badge.js +11 -91
- package/dist/data/Badge.js.map +1 -1
- package/dist/data/Clicky.cjs +4 -3
- package/dist/data/Clicky.cjs.map +1 -1
- package/dist/data/Clicky.d.ts.map +1 -1
- package/dist/data/Clicky.js +4 -3
- package/dist/data/Clicky.js.map +1 -1
- package/dist/data/DataTable.cjs +161 -156
- package/dist/data/DataTable.cjs.map +1 -1
- package/dist/data/DataTable.d.ts +25 -4
- package/dist/data/DataTable.d.ts.map +1 -1
- package/dist/data/DataTable.js +140 -135
- package/dist/data/DataTable.js.map +1 -1
- package/dist/data/FilterPill.cjs +3 -0
- package/dist/data/FilterPill.cjs.map +1 -1
- package/dist/data/FilterPill.d.ts.map +1 -1
- package/dist/data/FilterPill.js +3 -0
- package/dist/data/FilterPill.js.map +1 -1
- package/dist/data/Icon.cjs +7 -7
- package/dist/data/Icon.cjs.map +1 -1
- package/dist/data/Icon.js +7 -7
- package/dist/data/Icon.js.map +1 -1
- package/dist/data/LogDetails.cjs +5 -14
- package/dist/data/LogDetails.cjs.map +1 -1
- package/dist/data/LogDetails.d.ts +8 -4
- package/dist/data/LogDetails.d.ts.map +1 -1
- package/dist/data/LogDetails.js +4 -13
- package/dist/data/LogDetails.js.map +1 -1
- package/dist/data/LogsTable.cjs +6 -165
- package/dist/data/LogsTable.cjs.map +1 -1
- package/dist/data/LogsTable.d.ts +2 -15
- package/dist/data/LogsTable.d.ts.map +1 -1
- package/dist/data/LogsTable.js +6 -165
- package/dist/data/LogsTable.js.map +1 -1
- package/dist/data/TimeseriesPanel.axes.cjs.map +1 -1
- package/dist/data/TimeseriesPanel.axes.js.map +1 -1
- package/dist/data/TreeNode.cjs +13 -7
- package/dist/data/TreeNode.cjs.map +1 -1
- package/dist/data/TreeNode.d.ts.map +1 -1
- package/dist/data/TreeNode.js +13 -7
- package/dist/data/TreeNode.js.map +1 -1
- package/dist/data/badge-variants.cjs +85 -0
- package/dist/data/badge-variants.cjs.map +1 -0
- package/dist/data/badge-variants.d.ts +6 -0
- package/dist/data/badge-variants.d.ts.map +1 -0
- package/dist/data/badge-variants.js +85 -0
- package/dist/data/badge-variants.js.map +1 -0
- package/dist/data/cache-browser/CacheBrowser.cjs +59 -0
- package/dist/data/cache-browser/CacheBrowser.cjs.map +1 -0
- package/dist/data/cache-browser/CacheBrowser.d.ts +26 -0
- package/dist/data/cache-browser/CacheBrowser.d.ts.map +1 -0
- package/dist/data/cache-browser/CacheBrowser.js +59 -0
- package/dist/data/cache-browser/CacheBrowser.js.map +1 -0
- package/dist/data/cache-browser/CacheDetailPanel.cjs +193 -0
- package/dist/data/cache-browser/CacheDetailPanel.cjs.map +1 -0
- package/dist/data/cache-browser/CacheDetailPanel.d.ts +20 -0
- package/dist/data/cache-browser/CacheDetailPanel.d.ts.map +1 -0
- package/dist/data/cache-browser/CacheDetailPanel.js +193 -0
- package/dist/data/cache-browser/CacheDetailPanel.js.map +1 -0
- package/dist/data/cache-browser/CacheStatsOverview.cjs +126 -0
- package/dist/data/cache-browser/CacheStatsOverview.cjs.map +1 -0
- package/dist/data/cache-browser/CacheStatsOverview.d.ts +17 -0
- package/dist/data/cache-browser/CacheStatsOverview.d.ts.map +1 -0
- package/dist/data/cache-browser/CacheStatsOverview.js +126 -0
- package/dist/data/cache-browser/CacheStatsOverview.js.map +1 -0
- package/dist/data/cache-browser/CacheTree.cjs +189 -0
- package/dist/data/cache-browser/CacheTree.cjs.map +1 -0
- package/dist/data/cache-browser/CacheTree.d.ts +27 -0
- package/dist/data/cache-browser/CacheTree.d.ts.map +1 -0
- package/dist/data/cache-browser/CacheTree.js +189 -0
- package/dist/data/cache-browser/CacheTree.js.map +1 -0
- package/dist/data/cache-browser/CacheValue.cjs +86 -0
- package/dist/data/cache-browser/CacheValue.cjs.map +1 -0
- package/dist/data/cache-browser/CacheValue.d.ts +11 -0
- package/dist/data/cache-browser/CacheValue.d.ts.map +1 -0
- package/dist/data/cache-browser/CacheValue.js +86 -0
- package/dist/data/cache-browser/CacheValue.js.map +1 -0
- package/dist/data/cache-browser/adapter.cjs +52 -0
- package/dist/data/cache-browser/adapter.cjs.map +1 -0
- package/dist/data/cache-browser/adapter.d.ts +48 -0
- package/dist/data/cache-browser/adapter.d.ts.map +1 -0
- package/dist/data/cache-browser/adapter.js +52 -0
- package/dist/data/cache-browser/adapter.js.map +1 -0
- package/dist/data/cache-browser/api.cjs +42 -0
- package/dist/data/cache-browser/api.cjs.map +1 -0
- package/dist/data/cache-browser/api.d.ts +33 -0
- package/dist/data/cache-browser/api.d.ts.map +1 -0
- package/dist/data/cache-browser/api.js +42 -0
- package/dist/data/cache-browser/api.js.map +1 -0
- package/dist/data/cache-browser/index.d.ts +9 -0
- package/dist/data/cache-browser/index.d.ts.map +1 -0
- package/dist/data/cache-browser/types.cjs +7 -0
- package/dist/data/cache-browser/types.cjs.map +1 -0
- package/dist/data/cache-browser/types.d.ts +78 -0
- package/dist/data/cache-browser/types.d.ts.map +1 -0
- package/dist/data/cache-browser/types.js +7 -0
- package/dist/data/cache-browser/types.js.map +1 -0
- package/dist/data/cells/TagList.cjs +4 -101
- package/dist/data/cells/TagList.cjs.map +1 -1
- package/dist/data/cells/TagList.d.ts +1 -49
- package/dist/data/cells/TagList.d.ts.map +1 -1
- package/dist/data/cells/TagList.js +3 -100
- package/dist/data/cells/TagList.js.map +1 -1
- package/dist/data/cells/Timestamp.cjs +3 -192
- package/dist/data/cells/Timestamp.cjs.map +1 -1
- package/dist/data/cells/Timestamp.d.ts +1 -50
- package/dist/data/cells/Timestamp.d.ts.map +1 -1
- package/dist/data/cells/Timestamp.js +2 -191
- package/dist/data/cells/Timestamp.js.map +1 -1
- package/dist/data/cells/tag-utils.cjs +103 -0
- package/dist/data/cells/tag-utils.cjs.map +1 -0
- package/dist/data/cells/tag-utils.d.ts +51 -0
- package/dist/data/cells/tag-utils.d.ts.map +1 -0
- package/dist/data/cells/tag-utils.js +103 -0
- package/dist/data/cells/tag-utils.js.map +1 -0
- package/dist/data/cells/timestamp-format.cjs +193 -0
- package/dist/data/cells/timestamp-format.cjs.map +1 -0
- package/dist/data/cells/timestamp-format.d.ts +51 -0
- package/dist/data/cells/timestamp-format.d.ts.map +1 -0
- package/dist/data/cells/timestamp-format.js +193 -0
- package/dist/data/cells/timestamp-format.js.map +1 -0
- package/dist/data/chat/Chat.cjs +48 -0
- package/dist/data/chat/Chat.cjs.map +1 -0
- package/dist/data/chat/Chat.d.ts +26 -0
- package/dist/data/chat/Chat.d.ts.map +1 -0
- package/dist/data/chat/Chat.fixtures.d.ts +6 -0
- package/dist/data/chat/Chat.fixtures.d.ts.map +1 -0
- package/dist/data/chat/Chat.js +48 -0
- package/dist/data/chat/Chat.js.map +1 -0
- package/dist/data/chat/Conversation.cjs +34 -0
- package/dist/data/chat/Conversation.cjs.map +1 -0
- package/dist/data/chat/Conversation.d.ts +11 -0
- package/dist/data/chat/Conversation.d.ts.map +1 -0
- package/dist/data/chat/Conversation.js +34 -0
- package/dist/data/chat/Conversation.js.map +1 -0
- package/dist/data/chat/Message.cjs +44 -0
- package/dist/data/chat/Message.cjs.map +1 -0
- package/dist/data/chat/Message.d.ts +10 -0
- package/dist/data/chat/Message.d.ts.map +1 -0
- package/dist/data/chat/Message.js +44 -0
- package/dist/data/chat/Message.js.map +1 -0
- package/dist/data/chat/PromptInput.cjs +61 -0
- package/dist/data/chat/PromptInput.cjs.map +1 -0
- package/dist/data/chat/PromptInput.d.ts +16 -0
- package/dist/data/chat/PromptInput.d.ts.map +1 -0
- package/dist/data/chat/PromptInput.js +61 -0
- package/dist/data/chat/PromptInput.js.map +1 -0
- package/dist/data/chat/ToolCall.cjs +92 -0
- package/dist/data/chat/ToolCall.cjs.map +1 -0
- package/dist/data/chat/ToolCall.d.ts +14 -0
- package/dist/data/chat/ToolCall.d.ts.map +1 -0
- package/dist/data/chat/ToolCall.js +92 -0
- package/dist/data/chat/ToolCall.js.map +1 -0
- package/dist/data/chat/clickyOperationsToTools.cjs +73 -0
- package/dist/data/chat/clickyOperationsToTools.cjs.map +1 -0
- package/dist/data/chat/clickyOperationsToTools.d.ts +10 -0
- package/dist/data/chat/clickyOperationsToTools.d.ts.map +1 -0
- package/dist/data/chat/clickyOperationsToTools.js +73 -0
- package/dist/data/chat/clickyOperationsToTools.js.map +1 -0
- package/dist/data/chat/index.d.ts +8 -0
- package/dist/data/chat/index.d.ts.map +1 -0
- package/dist/data/chat/types.cjs +18 -0
- package/dist/data/chat/types.cjs.map +1 -0
- package/dist/data/chat/types.d.ts +41 -0
- package/dist/data/chat/types.d.ts.map +1 -0
- package/dist/data/chat/types.js +18 -0
- package/dist/data/chat/types.js.map +1 -0
- package/dist/data/data-table-utils.cjs +55 -0
- package/dist/data/data-table-utils.cjs.map +1 -0
- package/dist/data/data-table-utils.d.ts +24 -0
- package/dist/data/data-table-utils.d.ts.map +1 -0
- package/dist/data/data-table-utils.js +55 -0
- package/dist/data/data-table-utils.js.map +1 -0
- package/dist/data/diagnostics/DiagnosticsDetailPanel.cjs +2 -1
- package/dist/data/diagnostics/DiagnosticsDetailPanel.cjs.map +1 -1
- package/dist/data/diagnostics/DiagnosticsDetailPanel.d.ts.map +1 -1
- package/dist/data/diagnostics/DiagnosticsDetailPanel.js +3 -2
- package/dist/data/diagnostics/DiagnosticsDetailPanel.js.map +1 -1
- package/dist/data/diagnostics/GoroutineCard.cjs +3 -22
- package/dist/data/diagnostics/GoroutineCard.cjs.map +1 -1
- package/dist/data/diagnostics/GoroutineCard.d.ts +0 -2
- package/dist/data/diagnostics/GoroutineCard.d.ts.map +1 -1
- package/dist/data/diagnostics/GoroutineCard.js +2 -21
- package/dist/data/diagnostics/GoroutineCard.js.map +1 -1
- package/dist/data/diagnostics/ThreadCard.cjs +3 -38
- package/dist/data/diagnostics/ThreadCard.cjs.map +1 -1
- package/dist/data/diagnostics/ThreadCard.d.ts +0 -2
- package/dist/data/diagnostics/ThreadCard.d.ts.map +1 -1
- package/dist/data/diagnostics/ThreadCard.js +2 -37
- package/dist/data/diagnostics/ThreadCard.js.map +1 -1
- package/dist/data/diagnostics/state-styles.cjs +59 -0
- package/dist/data/diagnostics/state-styles.cjs.map +1 -0
- package/dist/data/diagnostics/state-styles.d.ts +5 -0
- package/dist/data/diagnostics/state-styles.d.ts.map +1 -0
- package/dist/data/diagnostics/state-styles.js +59 -0
- package/dist/data/diagnostics/state-styles.js.map +1 -0
- package/dist/data/logs-normalize.cjs +166 -0
- package/dist/data/logs-normalize.cjs.map +1 -0
- package/dist/data/logs-normalize.d.ts +16 -0
- package/dist/data/logs-normalize.d.ts.map +1 -0
- package/dist/data/logs-normalize.js +166 -0
- package/dist/data/logs-normalize.js.map +1 -0
- package/dist/data/task-status.cjs +19 -19
- package/dist/data/task-status.cjs.map +1 -1
- package/dist/data/task-status.js +19 -19
- package/dist/data/task-status.js.map +1 -1
- package/dist/data/version-info.cjs +3 -3
- package/dist/data/version-info.js +3 -3
- package/dist/data.cjs +43 -18
- package/dist/data.cjs.map +1 -1
- package/dist/data.d.ts +11 -5
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +30 -5
- package/dist/data.js.map +1 -1
- package/dist/hooks/density-provider.cjs +38 -0
- package/dist/hooks/density-provider.cjs.map +1 -0
- package/dist/hooks/density-provider.d.ts +20 -0
- package/dist/hooks/density-provider.d.ts.map +1 -0
- package/dist/hooks/density-provider.js +38 -0
- package/dist/hooks/density-provider.js.map +1 -0
- package/dist/hooks/theme-provider.cjs +43 -0
- package/dist/hooks/theme-provider.cjs.map +1 -0
- package/dist/hooks/theme-provider.d.ts +9 -0
- package/dist/hooks/theme-provider.d.ts.map +1 -0
- package/dist/hooks/theme-provider.js +43 -0
- package/dist/hooks/theme-provider.js.map +1 -0
- package/dist/hooks/use-density.cjs +8 -37
- package/dist/hooks/use-density.cjs.map +1 -1
- package/dist/hooks/use-density.d.ts +5 -20
- package/dist/hooks/use-density.d.ts.map +1 -1
- package/dist/hooks/use-density.js +9 -38
- package/dist/hooks/use-density.js.map +1 -1
- package/dist/hooks/use-theme.cjs +10 -43
- package/dist/hooks/use-theme.cjs.map +1 -1
- package/dist/hooks/use-theme.d.ts +6 -9
- package/dist/hooks/use-theme.d.ts.map +1 -1
- package/dist/hooks/use-theme.js +11 -44
- package/dist/hooks/use-theme.js.map +1 -1
- package/dist/hooks.cjs +5 -2
- package/dist/hooks.cjs.map +1 -1
- package/dist/hooks.d.ts +4 -2
- package/dist/hooks.d.ts.map +1 -1
- package/dist/hooks.js +5 -2
- package/dist/hooks.js.map +1 -1
- package/dist/icons/changeIconAliases.cjs +13 -13
- package/dist/icons/changeIconAliases.cjs.map +1 -1
- package/dist/icons/changeIconAliases.d.ts.map +1 -1
- package/dist/icons/changeIconAliases.js +13 -13
- package/dist/icons/changeIconAliases.js.map +1 -1
- package/dist/index.cjs +78 -30
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +61 -13
- package/dist/index.js.map +1 -1
- package/dist/overlay/DropdownMenu.cjs +2 -0
- package/dist/overlay/DropdownMenu.cjs.map +1 -1
- package/dist/overlay/DropdownMenu.d.ts +3 -1
- package/dist/overlay/DropdownMenu.d.ts.map +1 -1
- package/dist/overlay/DropdownMenu.js +2 -0
- package/dist/overlay/DropdownMenu.js.map +1 -1
- package/dist/overlay/Modal.cjs +38 -27
- package/dist/overlay/Modal.cjs.map +1 -1
- package/dist/overlay/Modal.d.ts +8 -2
- package/dist/overlay/Modal.d.ts.map +1 -1
- package/dist/overlay/Modal.js +38 -27
- package/dist/overlay/Modal.js.map +1 -1
- package/dist/overlay/modalStack.cjs +35 -0
- package/dist/overlay/modalStack.cjs.map +1 -0
- package/dist/overlay/modalStack.d.ts +13 -0
- package/dist/overlay/modalStack.d.ts.map +1 -0
- package/dist/overlay/modalStack.js +35 -0
- package/dist/overlay/modalStack.js.map +1 -0
- package/dist/rpc/AcceptPicker.cjs +2 -18
- package/dist/rpc/AcceptPicker.cjs.map +1 -1
- package/dist/rpc/AcceptPicker.d.ts +1 -41
- package/dist/rpc/AcceptPicker.d.ts.map +1 -1
- package/dist/rpc/AcceptPicker.js +2 -18
- package/dist/rpc/AcceptPicker.js.map +1 -1
- package/dist/rpc/CommandOutput.cjs +1 -1
- package/dist/rpc/CommandOutput.cjs.map +1 -1
- package/dist/rpc/CommandOutput.js +1 -1
- package/dist/rpc/CommandOutput.js.map +1 -1
- package/dist/rpc/EndpointList.cjs +1 -1
- package/dist/rpc/EndpointList.cjs.map +1 -1
- package/dist/rpc/EndpointList.js +1 -1
- package/dist/rpc/EndpointList.js.map +1 -1
- package/dist/rpc/FilterForm.cjs +4 -4
- package/dist/rpc/FilterForm.cjs.map +1 -1
- package/dist/rpc/FilterForm.js +4 -4
- package/dist/rpc/FilterForm.js.map +1 -1
- package/dist/rpc/OperationCatalog.cjs +38 -60
- package/dist/rpc/OperationCatalog.cjs.map +1 -1
- package/dist/rpc/OperationCatalog.d.ts +3 -3
- package/dist/rpc/OperationCatalog.d.ts.map +1 -1
- package/dist/rpc/OperationCatalog.js +40 -62
- package/dist/rpc/OperationCatalog.js.map +1 -1
- package/dist/rpc/OperationCommandPage.cjs.map +1 -1
- package/dist/rpc/OperationCommandPage.d.ts.map +1 -1
- package/dist/rpc/OperationCommandPage.js.map +1 -1
- package/dist/rpc/accept-options.cjs +20 -0
- package/dist/rpc/accept-options.cjs.map +1 -0
- package/dist/rpc/accept-options.d.ts +42 -0
- package/dist/rpc/accept-options.d.ts.map +1 -0
- package/dist/rpc/accept-options.js +20 -0
- package/dist/rpc/accept-options.js.map +1 -0
- package/dist/rpc/classify.cjs +15 -4
- package/dist/rpc/classify.cjs.map +1 -1
- package/dist/rpc/classify.d.ts.map +1 -1
- package/dist/rpc/classify.js +15 -4
- package/dist/rpc/classify.js.map +1 -1
- package/dist/rpc/clickyMetadata.cjs +13 -3
- package/dist/rpc/clickyMetadata.cjs.map +1 -1
- package/dist/rpc/clickyMetadata.d.ts +2 -0
- package/dist/rpc/clickyMetadata.d.ts.map +1 -1
- package/dist/rpc/clickyMetadata.js +14 -4
- package/dist/rpc/clickyMetadata.js.map +1 -1
- package/dist/rpc/formMetadata.cjs +5 -3
- package/dist/rpc/formMetadata.cjs.map +1 -1
- package/dist/rpc/formMetadata.d.ts.map +1 -1
- package/dist/rpc/formMetadata.js +5 -3
- package/dist/rpc/formMetadata.js.map +1 -1
- package/dist/rpc.cjs +3 -2
- package/dist/rpc.cjs.map +1 -1
- package/dist/rpc.d.ts +2 -1
- package/dist/rpc.d.ts.map +1 -1
- package/dist/rpc.js +2 -1
- package/dist/rpc.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +16 -1
|
@@ -5,12 +5,12 @@ import { Button } from "../components/button.js";
|
|
|
5
5
|
import { Icon } from "../data/Icon.js";
|
|
6
6
|
import { MethodBadge } from "../data/MethodBadge.js";
|
|
7
7
|
import { Modal } from "../overlay/Modal.js";
|
|
8
|
-
import { filterOperationsByDomain
|
|
9
|
-
import { filterOperationsBySurface, findSurfaceListOperation,
|
|
8
|
+
import { filterOperationsByDomain } from "./classify.js";
|
|
9
|
+
import { filterOperationsBySurface, findSurfaceListOperation, findSurfaceActions, getOperationClickyMeta, surfaceActionLabel } from "./clickyMetadata.js";
|
|
10
10
|
import { EndpointList } from "./EndpointList.js";
|
|
11
11
|
import { ExecutionResult } from "./ExecutionResult.js";
|
|
12
12
|
import { FilterForm } from "./FilterForm.js";
|
|
13
|
-
import {
|
|
13
|
+
import { applyFilterExtensions } from "../components/FilterBar.js";
|
|
14
14
|
import { useOperations } from "./useOperations.js";
|
|
15
15
|
import { packParameterValues, parametersToFormConfig, dataTablePaginationFromForm } from "./formMetadata.js";
|
|
16
16
|
import { UiTable } from "../icons/components/UiTable.js";
|
|
@@ -30,9 +30,8 @@ function OperationCatalog({
|
|
|
30
30
|
client,
|
|
31
31
|
renderLink,
|
|
32
32
|
allOperations = false,
|
|
33
|
-
operationIdPrefix,
|
|
34
|
-
listOperationId,
|
|
35
33
|
surfaceKey,
|
|
34
|
+
filterPre,
|
|
36
35
|
getCommandHref = defaultCommandHref,
|
|
37
36
|
renderError = defaultRenderError,
|
|
38
37
|
kind,
|
|
@@ -50,19 +49,13 @@ function OperationCatalog({
|
|
|
50
49
|
);
|
|
51
50
|
const useSurfaceMetadata = surfaceOps.length > 0;
|
|
52
51
|
const domainOps = useMemo(() => {
|
|
53
|
-
if (useSurfaceMetadata)
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
return (allOperations ? operations : filterOperationsByDomain(operations, entities)).filter(
|
|
57
|
-
(op) => operationIdPrefix ? (op.operation.operationId ?? "").startsWith(operationIdPrefix) : true
|
|
58
|
-
);
|
|
59
|
-
}, [allOperations, entities, operationIdPrefix, operations, surfaceOps, useSurfaceMetadata]);
|
|
52
|
+
if (useSurfaceMetadata) return surfaceOps;
|
|
53
|
+
return allOperations ? operations : filterOperationsByDomain(operations, entities);
|
|
54
|
+
}, [allOperations, entities, operations, surfaceOps, useSurfaceMetadata]);
|
|
60
55
|
const listEndpoint = useMemo(() => {
|
|
61
|
-
if (useSurfaceMetadata)
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
return listOperationId ? domainOps.find((op) => op.method === "get" && op.operation.operationId === listOperationId) : findListEndpoint(domainOps, entities);
|
|
65
|
-
}, [domainOps, entities, listOperationId, surfaceKey, useSurfaceMetadata]);
|
|
56
|
+
if (!useSurfaceMetadata) return void 0;
|
|
57
|
+
return findSurfaceListOperation(domainOps, surfaceKey);
|
|
58
|
+
}, [domainOps, surfaceKey, useSurfaceMetadata]);
|
|
66
59
|
const [filters, setFilters] = useState(() => readFiltersFromUrl());
|
|
67
60
|
const listParameters = (listEndpoint == null ? void 0 : listEndpoint.operation.parameters) ?? [];
|
|
68
61
|
useEffect(() => {
|
|
@@ -99,17 +92,10 @@ function OperationCatalog({
|
|
|
99
92
|
staleTime: 3e4,
|
|
100
93
|
retry: 0
|
|
101
94
|
});
|
|
102
|
-
const actionOps = useMemo(
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
return domainOps.filter(
|
|
107
|
-
(op) => {
|
|
108
|
-
var _a;
|
|
109
|
-
return op.method !== "get" && !op.path.includes("{") && !((_a = op.operation.parameters) == null ? void 0 : _a.some((p) => p.in === "path" || isPositionalParam(p)));
|
|
110
|
-
}
|
|
111
|
-
);
|
|
112
|
-
}, [domainOps, surfaceKey, useSurfaceMetadata]);
|
|
95
|
+
const actionOps = useMemo(
|
|
96
|
+
() => useSurfaceMetadata ? findSurfaceActions(domainOps, surfaceKey) : [],
|
|
97
|
+
[domainOps, surfaceKey, useSurfaceMetadata]
|
|
98
|
+
);
|
|
113
99
|
const filterBarConfig = useMemo(() => {
|
|
114
100
|
const options = {
|
|
115
101
|
includeLocations: ["query"]
|
|
@@ -123,6 +109,10 @@ function OperationCatalog({
|
|
|
123
109
|
() => dataTablePaginationFromForm(filterBarConfig.pagination, listQuery.data),
|
|
124
110
|
[filterBarConfig.pagination, listQuery.data]
|
|
125
111
|
);
|
|
112
|
+
const decoratedFilters = useMemo(
|
|
113
|
+
() => filterBarConfig.filters.map((filter) => applyFilterExtensions(filter, filterPre)),
|
|
114
|
+
[filterBarConfig.filters, filterPre]
|
|
115
|
+
);
|
|
126
116
|
const hasTable = !!listEndpoint;
|
|
127
117
|
const showTable = hasTable && view === "table";
|
|
128
118
|
const sectionLabel = kind === "configuration" || definition.key.startsWith("config-") ? "Configuration" : "Operations";
|
|
@@ -211,40 +201,28 @@ function OperationCatalog({
|
|
|
211
201
|
] })
|
|
212
202
|
] }),
|
|
213
203
|
actionOps.length > 0 && /* @__PURE__ */ jsx("div", { className: "flex flex-wrap gap-2", children: actionOps.map((op) => {
|
|
214
|
-
|
|
215
|
-
const
|
|
216
|
-
const tooltip =
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
setActionError("");
|
|
229
|
-
},
|
|
230
|
-
children: [
|
|
231
|
-
/* @__PURE__ */ jsx(Icon, { icon: UiAdd, className: "text-xs" }),
|
|
232
|
-
op.operation.summary || ((_a = getOperationClickyMeta(op)) == null ? void 0 : _a.actionName) || commandName
|
|
233
|
-
]
|
|
204
|
+
const label = surfaceActionLabel(op);
|
|
205
|
+
const summary = op.operation.summary || op.operation.description;
|
|
206
|
+
const tooltip = summary ? `${label} — ${summary}` : label;
|
|
207
|
+
return /* @__PURE__ */ jsxs(
|
|
208
|
+
Button,
|
|
209
|
+
{
|
|
210
|
+
type: "button",
|
|
211
|
+
variant: "outline",
|
|
212
|
+
size: "sm",
|
|
213
|
+
title: tooltip,
|
|
214
|
+
onClick: () => {
|
|
215
|
+
setActiveAction(op);
|
|
216
|
+
setActionResult(null);
|
|
217
|
+
setActionError("");
|
|
234
218
|
},
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
className: "inline-flex items-center gap-1.5 rounded-lg border px-3 py-1.5 text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground",
|
|
243
|
-
children: /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
244
|
-
/* @__PURE__ */ jsx(Icon, { icon: UiAdd, className: "text-xs" }),
|
|
245
|
-
op.operation.summary || commandName
|
|
246
|
-
] })
|
|
247
|
-
});
|
|
219
|
+
children: [
|
|
220
|
+
/* @__PURE__ */ jsx(Icon, { icon: UiAdd, className: "text-xs" }),
|
|
221
|
+
label
|
|
222
|
+
]
|
|
223
|
+
},
|
|
224
|
+
`${op.method}:${op.path}`
|
|
225
|
+
);
|
|
248
226
|
}) }),
|
|
249
227
|
showTable ? /* @__PURE__ */ jsx(Fragment, { children: listQuery.isError && !listQuery.data ? renderError(listQuery.error, `Failed to load ${(listEndpoint == null ? void 0 : listEndpoint.path) ?? ""}`) : /* @__PURE__ */ jsx(
|
|
250
228
|
ExecutionResult,
|
|
@@ -258,7 +236,7 @@ function OperationCatalog({
|
|
|
258
236
|
...commandRuntime ? { commandRuntime } : {},
|
|
259
237
|
...filterBarConfig.search ? { search: filterBarConfig.search } : {},
|
|
260
238
|
...filterBarConfig.timeRange ? { timeRange: filterBarConfig.timeRange } : {},
|
|
261
|
-
...
|
|
239
|
+
...decoratedFilters.length > 0 ? { externalFilters: decoratedFilters } : {},
|
|
262
240
|
...dataTablePagination ? { pagination: dataTablePagination } : {}
|
|
263
241
|
}
|
|
264
242
|
) }) : /* @__PURE__ */ jsx(
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OperationCatalog.js","sources":["../../src/rpc/OperationCatalog.tsx"],"sourcesContent":["import { useEffect, useMemo, useState, type ReactNode } from \"react\";\nimport { keepPreviousData, useQuery } from \"@tanstack/react-query\";\nimport { Button } from \"../components/button\";\nimport { Icon } from \"../data/Icon\";\nimport { UiAdd, UiListFlat, UiTable } from \"../icons\";\nimport { MethodBadge } from \"../data/MethodBadge\";\nimport { Modal } from \"../overlay/Modal\";\nimport { filterOperationsByDomain, findListEndpoint } from \"./classify\";\nimport {\n filterOperationsBySurface,\n findSurfaceCollectionActions,\n findSurfaceListOperation,\n getOperationClickyMeta,\n} from \"./clickyMetadata\";\nimport type { ClickyCommandRuntime } from \"../data/Clicky\";\nimport { EndpointList, type RenderLink } from \"./EndpointList\";\nimport { ExecutionResult } from \"./ExecutionResult\";\nimport { FilterForm } from \"./FilterForm\";\nimport {\n type DomainDefinition,\n type ExecutionResponse,\n type OperationLookupResponse,\n type ResolvedOperation,\n isPositionalParam,\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 // Restrict the domain to operationIds with a shared prefix when tags alone\n // are too coarse (for example admin_ or catalog_ surfaces).\n operationIdPrefix?: string;\n // Explicit operation id for domains whose canonical list route does not\n // follow the default `<entity>_list` pattern.\n listOperationId?: string;\n surfaceKey?: string;\n getCommandHref?: (operationId: string, op: ResolvedOperation) => string;\n renderError?: (err: unknown, title: string) => ReactNode;\n kind?: \"operations\" | \"configuration\";\n commandRuntime?: ClickyCommandRuntime;\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 && <div className=\"mt-1 whitespace-pre-wrap text-xs opacity-80\">{message}</div>}\n </div>\n );\n}\n\nexport function OperationCatalog({\n definition,\n entities,\n client,\n renderLink,\n allOperations = false,\n operationIdPrefix,\n listOperationId,\n surfaceKey,\n getCommandHref = defaultCommandHref,\n renderError = defaultRenderError,\n kind,\n commandRuntime,\n}: OperationCatalogProps) {\n const { operations, isLoading } = useOperations(client);\n const [view, setView] = useState<\"table\" | \"endpoints\">(\"table\");\n const [activeAction, setActiveAction] = useState<ResolvedOperation | null>(null);\n const [actionResult, setActionResult] = useState<ExecutionResponse | null>(null);\n const [actionError, setActionError] = useState(\"\");\n const [isExecutingAction, setIsExecutingAction] = useState(false);\n\n const surfaceOps = useMemo(\n () => filterOperationsBySurface(operations, surfaceKey),\n [operations, surfaceKey],\n );\n const useSurfaceMetadata = surfaceOps.length > 0;\n\n const domainOps = useMemo(() => {\n if (useSurfaceMetadata) {\n return surfaceOps;\n }\n\n return (allOperations ? operations : filterOperationsByDomain(operations, entities)).filter(\n (op) =>\n operationIdPrefix ? (op.operation.operationId ?? \"\").startsWith(operationIdPrefix) : true,\n );\n }, [allOperations, entities, operationIdPrefix, operations, surfaceOps, useSurfaceMetadata]);\n\n const listEndpoint = useMemo(() => {\n if (useSurfaceMetadata) {\n return findSurfaceListOperation(domainOps, surfaceKey);\n }\n\n return listOperationId\n ? domainOps.find((op) => op.method === \"get\" && op.operation.operationId === listOperationId)\n : findListEndpoint(domainOps, entities);\n }, [domainOps, entities, listOperationId, surfaceKey, useSurfaceMetadata]);\n const [filters, setFilters] = useState<Record<string, string>>(() => readFiltersFromUrl());\n const listParameters = listEndpoint?.operation.parameters ?? [];\n\n useEffect(() => {\n writeFiltersToUrl(filters);\n }, [filters]);\n\n const listQuery = useQuery<ExecutionResponse>({\n queryKey: [\"operation-list\", listEndpoint?.method, listEndpoint?.path, filters],\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 && view === \"table\",\n placeholderData: keepPreviousData,\n staleTime: 30_000,\n retry: 0,\n });\n\n const lookupQuery = useQuery<OperationLookupResponse>({\n queryKey: [\"operation-lookup\", listEndpoint?.method, listEndpoint?.path, filters],\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 && view === \"table\" && !!client.lookupFilters,\n staleTime: 30_000,\n retry: 0,\n });\n\n const actionOps = useMemo(() => {\n if (useSurfaceMetadata) {\n return findSurfaceCollectionActions(domainOps, surfaceKey);\n }\n\n return domainOps.filter(\n (op) =>\n op.method !== \"get\" &&\n !op.path.includes(\"{\") &&\n !op.operation.parameters?.some((p) => p.in === \"path\" || isPositionalParam(p)),\n );\n }, [domainOps, surfaceKey, useSurfaceMetadata]);\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 () => dataTablePaginationFromForm(filterBarConfig.pagination, listQuery.data),\n [filterBarConfig.pagination, listQuery.data],\n );\n\n const hasTable = !!listEndpoint;\n const showTable = hasTable && view === \"table\";\n const sectionLabel =\n kind === \"configuration\" || definition.key.startsWith(\"config-\")\n ? \"Configuration\"\n : \"Operations\";\n const activeActionMeta = activeAction ? getOperationClickyMeta(activeAction) : undefined;\n\n const actionLockedValues = useMemo(() => {\n const meta = activeActionMeta;\n if (!activeAction || meta == null || !meta.supportsFilterMode) {\n return {};\n }\n\n const locked: Record<string, string> = {};\n for (const param of activeAction.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 ((activeAction.operation.parameters ?? []).some((param) => param.name === \"filter\")) {\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 }, [activeAction, activeActionMeta, filters]);\n\n async function executeAction(values: Record<string, string>) {\n if (!activeAction) return;\n setIsExecutingAction(true);\n setActionError(\"\");\n\n try {\n const response = await client.executeCommand(\n activeAction.path,\n activeAction.method,\n packParameterValues(values, activeAction.operation.parameters ?? []),\n { Accept: \"application/json+clicky\" },\n );\n setActionResult(response);\n await listQuery.refetch();\n } catch (err) {\n setActionResult(null);\n setActionError(err instanceof Error ? err.message : String(err ?? \"Unknown error\"));\n } finally {\n setIsExecutingAction(false);\n }\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 return (\n <div className=\"space-y-6\">\n <div className=\"flex items-start justify-between gap-4\">\n <div className=\"min-w-0\">\n <p className=\"text-xs uppercase tracking-[0.18em] text-muted-foreground\">\n {sectionLabel}\n </p>\n <h1 className=\"text-2xl font-semibold tracking-tight\">{definition.title}</h1>\n <p className=\"mt-1 max-w-2xl text-sm text-muted-foreground\">{definition.description}</p>\n </div>\n {hasTable && (\n <div className=\"flex gap-1 rounded-lg border p-1\">\n <Button\n type=\"button\"\n variant={view === \"table\" ? \"secondary\" : \"ghost\"}\n size=\"sm\"\n className=\"h-7 w-7 p-0\"\n aria-label=\"Table view\"\n aria-pressed={view === \"table\"}\n onClick={() => setView(\"table\")}\n >\n <Icon icon={UiTable} />\n </Button>\n <Button\n type=\"button\"\n variant={view === \"endpoints\" ? \"secondary\" : \"ghost\"}\n size=\"sm\"\n className=\"h-7 w-7 p-0\"\n aria-label=\"Endpoint list view\"\n aria-pressed={view === \"endpoints\"}\n onClick={() => setView(\"endpoints\")}\n >\n <Icon icon={UiListFlat} />\n </Button>\n </div>\n )}\n </div>\n\n {actionOps.length > 0 && (\n <div className=\"flex flex-wrap gap-2\">\n {actionOps.map((op) => {\n const commandName = op.operation.operationId || op.path;\n const tooltip = op.operation.description\n ? `${commandName} — ${op.operation.description}`\n : commandName;\n if (useSurfaceMetadata) {\n return (\n <Button\n key={`${op.method}:${op.path}`}\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n title={tooltip}\n onClick={() => {\n setActiveAction(op);\n setActionResult(null);\n setActionError(\"\");\n }}\n >\n <Icon icon={UiAdd} className=\"text-xs\" />\n {op.operation.summary || getOperationClickyMeta(op)?.actionName || commandName}\n </Button>\n );\n }\n\n return renderLink({\n key: `${op.method}:${op.path}`,\n to: getCommandHref(op.operation.operationId ?? commandName, op),\n title: tooltip,\n className:\n \"inline-flex items-center gap-1.5 rounded-lg border px-3 py-1.5 text-sm font-medium transition-colors hover:bg-accent hover:text-accent-foreground\",\n children: (\n <>\n <Icon icon={UiAdd} className=\"text-xs\" />\n {op.operation.summary || commandName}\n </>\n ),\n });\n })}\n </div>\n )}\n\n {showTable ? (\n <>\n {listQuery.isError && !listQuery.data ? (\n renderError(listQuery.error, `Failed to load ${listEndpoint?.path ?? \"\"}`)\n ) : (\n <ExecutionResult\n response={listQuery.data ?? null}\n loading={listQuery.isFetching}\n loadingMessage={`Loading ${definition.title} results…`}\n emptyMessage=\"No records returned\"\n ariaLabel={`${definition.title} results`}\n className=\"mt-0\"\n {...(commandRuntime ? { commandRuntime } : {})}\n {...(filterBarConfig.search ? { search: filterBarConfig.search } : {})}\n {...(filterBarConfig.timeRange ? { timeRange: filterBarConfig.timeRange } : {})}\n {...(filterBarConfig.filters.length > 0\n ? { externalFilters: filterBarConfig.filters }\n : {})}\n {...(dataTablePagination ? { pagination: dataTablePagination } : {})}\n />\n )}\n </>\n ) : (\n <EndpointList\n operations={domainOps}\n definition={definition}\n renderLink={renderLink}\n getCommandHref={getCommandHref}\n />\n )}\n\n <Modal\n open={activeAction != null}\n onClose={() => setActiveAction(null)}\n title={\n activeAction?.operation.summary ||\n activeActionMeta?.actionName ||\n activeAction?.operation.operationId ||\n \"Action\"\n }\n size=\"lg\"\n >\n {activeAction && (\n <div className=\"space-y-4\">\n <div className=\"flex items-center gap-3\">\n <MethodBadge method={activeAction.method} />\n <code className=\"rounded-md bg-muted px-2 py-1 text-sm\">{activeAction.path}</code>\n </div>\n <FilterForm\n client={client}\n path={activeAction.path}\n method={activeAction.method}\n parameters={activeAction.operation.parameters ?? []}\n lockedValues={actionLockedValues}\n enableLookup={Boolean(activeActionMeta?.supportsLookup)}\n submitLabel=\"Execute request\"\n submittingLabel=\"Executing…\"\n isSubmitting={isExecutingAction}\n onSubmit={executeAction}\n />\n {actionError ? (\n <div className=\"rounded-md border border-destructive/40 bg-destructive/5 p-3 text-sm text-destructive\">\n {actionError}\n </div>\n ) : actionResult ? (\n <ExecutionResult\n response={actionResult}\n className=\"mt-0\"\n {...(commandRuntime ? { commandRuntime } : {})}\n />\n ) : null}\n </div>\n )}\n </Modal>\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 <div className={`animate-pulse rounded-md bg-muted ${className ?? \"\"}`.trim()} />;\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 (next !== `${window.location.pathname}${window.location.search}${window.location.hash}`) {\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":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"OperationCatalog.js","sources":["../../src/rpc/OperationCatalog.tsx"],"sourcesContent":["import { useEffect, useMemo, useState, type ReactNode } from \"react\";\nimport { keepPreviousData, useQuery } from \"@tanstack/react-query\";\nimport { Button } from \"../components/button\";\nimport { Icon } from \"../data/Icon\";\nimport { UiAdd, UiListFlat, UiTable } from \"../icons\";\nimport { MethodBadge } from \"../data/MethodBadge\";\nimport { Modal } from \"../overlay/Modal\";\nimport { filterOperationsByDomain } from \"./classify\";\nimport {\n filterOperationsBySurface,\n findSurfaceActions,\n findSurfaceListOperation,\n getOperationClickyMeta,\n surfaceActionLabel,\n} from \"./clickyMetadata\";\nimport type { ClickyCommandRuntime } from \"../data/Clicky\";\nimport { EndpointList, type RenderLink } from \"./EndpointList\";\nimport { ExecutionResult } from \"./ExecutionResult\";\nimport { FilterForm } from \"./FilterForm\";\nimport { applyFilterExtensions, type FilterExtension } from \"../components/FilterBar\";\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 kind?: \"operations\" | \"configuration\";\n commandRuntime?: ClickyCommandRuntime;\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 && <div className=\"mt-1 whitespace-pre-wrap text-xs opacity-80\">{message}</div>}\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 kind,\n commandRuntime,\n}: OperationCatalogProps) {\n const { operations, isLoading } = useOperations(client);\n const [view, setView] = useState<\"table\" | \"endpoints\">(\"table\");\n const [activeAction, setActiveAction] = useState<ResolvedOperation | null>(null);\n const [actionResult, setActionResult] = useState<ExecutionResponse | null>(null);\n const [actionError, setActionError] = useState(\"\");\n const [isExecutingAction, setIsExecutingAction] = useState(false);\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 ? operations : 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 const [filters, setFilters] = useState<Record<string, string>>(() => readFiltersFromUrl());\n const listParameters = listEndpoint?.operation.parameters ?? [];\n\n useEffect(() => {\n writeFiltersToUrl(filters);\n }, [filters]);\n\n const listQuery = useQuery<ExecutionResponse>({\n queryKey: [\"operation-list\", listEndpoint?.method, listEndpoint?.path, filters],\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 && view === \"table\",\n placeholderData: keepPreviousData,\n staleTime: 30_000,\n retry: 0,\n });\n\n const lookupQuery = useQuery<OperationLookupResponse>({\n queryKey: [\"operation-lookup\", listEndpoint?.method, listEndpoint?.path, filters],\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 && view === \"table\" && !!client.lookupFilters,\n staleTime: 30_000,\n retry: 0,\n });\n\n // Action buttons come only from surface metadata. 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 () => (useSurfaceMetadata ? findSurfaceActions(domainOps, surfaceKey) : []),\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 () => dataTablePaginationFromForm(filterBarConfig.pagination, listQuery.data),\n [filterBarConfig.pagination, listQuery.data],\n );\n const decoratedFilters = useMemo(\n () => filterBarConfig.filters.map((filter) => applyFilterExtensions(filter, filterPre)),\n [filterBarConfig.filters, filterPre],\n );\n\n const hasTable = !!listEndpoint;\n const showTable = hasTable && view === \"table\";\n const sectionLabel =\n kind === \"configuration\" || definition.key.startsWith(\"config-\")\n ? \"Configuration\"\n : \"Operations\";\n const activeActionMeta = activeAction ? getOperationClickyMeta(activeAction) : undefined;\n\n const actionLockedValues = useMemo(() => {\n const meta = activeActionMeta;\n if (!activeAction || meta == null || !meta.supportsFilterMode) {\n return {};\n }\n\n const locked: Record<string, string> = {};\n for (const param of activeAction.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 ((activeAction.operation.parameters ?? []).some((param) => param.name === \"filter\")) {\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 }, [activeAction, activeActionMeta, filters]);\n\n async function executeAction(values: Record<string, string>) {\n if (!activeAction) return;\n setIsExecutingAction(true);\n setActionError(\"\");\n\n try {\n const response = await client.executeCommand(\n activeAction.path,\n activeAction.method,\n packParameterValues(values, activeAction.operation.parameters ?? []),\n { Accept: \"application/json+clicky\" },\n );\n setActionResult(response);\n await listQuery.refetch();\n } catch (err) {\n setActionResult(null);\n setActionError(err instanceof Error ? err.message : String(err ?? \"Unknown error\"));\n } finally {\n setIsExecutingAction(false);\n }\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 return (\n <div className=\"space-y-6\">\n <div className=\"flex items-start justify-between gap-4\">\n <div className=\"min-w-0\">\n <p className=\"text-xs uppercase tracking-[0.18em] text-muted-foreground\">\n {sectionLabel}\n </p>\n <h1 className=\"text-2xl font-semibold tracking-tight\">{definition.title}</h1>\n <p className=\"mt-1 max-w-2xl text-sm text-muted-foreground\">{definition.description}</p>\n </div>\n {hasTable && (\n <div className=\"flex gap-1 rounded-lg border p-1\">\n <Button\n type=\"button\"\n variant={view === \"table\" ? \"secondary\" : \"ghost\"}\n size=\"sm\"\n className=\"h-7 w-7 p-0\"\n aria-label=\"Table view\"\n aria-pressed={view === \"table\"}\n onClick={() => setView(\"table\")}\n >\n <Icon icon={UiTable} />\n </Button>\n <Button\n type=\"button\"\n variant={view === \"endpoints\" ? \"secondary\" : \"ghost\"}\n size=\"sm\"\n className=\"h-7 w-7 p-0\"\n aria-label=\"Endpoint list view\"\n aria-pressed={view === \"endpoints\"}\n onClick={() => setView(\"endpoints\")}\n >\n <Icon icon={UiListFlat} />\n </Button>\n </div>\n )}\n </div>\n\n {actionOps.length > 0 && (\n <div className=\"flex flex-wrap gap-2\">\n {actionOps.map((op) => {\n const label = surfaceActionLabel(op);\n const summary = op.operation.summary || op.operation.description;\n const tooltip = summary ? `${label} — ${summary}` : label;\n // Every action opens the execution dialog (Modal) inline — the\n // FilterForm collects params (including any id an entity-scoped\n // action needs) and the result renders without leaving the list.\n return (\n <Button\n key={`${op.method}:${op.path}`}\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n title={tooltip}\n onClick={() => {\n setActiveAction(op);\n setActionResult(null);\n setActionError(\"\");\n }}\n >\n <Icon icon={UiAdd} className=\"text-xs\" />\n {label}\n </Button>\n );\n })}\n </div>\n )}\n\n {showTable ? (\n <>\n {listQuery.isError && !listQuery.data ? (\n renderError(listQuery.error, `Failed to load ${listEndpoint?.path ?? \"\"}`)\n ) : (\n <ExecutionResult\n response={listQuery.data ?? null}\n loading={listQuery.isFetching}\n loadingMessage={`Loading ${definition.title} results…`}\n emptyMessage=\"No records returned\"\n ariaLabel={`${definition.title} results`}\n className=\"mt-0\"\n {...(commandRuntime ? { commandRuntime } : {})}\n {...(filterBarConfig.search ? { search: filterBarConfig.search } : {})}\n {...(filterBarConfig.timeRange ? { timeRange: filterBarConfig.timeRange } : {})}\n {...(decoratedFilters.length > 0\n ? { externalFilters: decoratedFilters }\n : {})}\n {...(dataTablePagination ? { pagination: dataTablePagination } : {})}\n />\n )}\n </>\n ) : (\n <EndpointList\n operations={domainOps}\n definition={definition}\n renderLink={renderLink}\n getCommandHref={getCommandHref}\n />\n )}\n\n <Modal\n open={activeAction != null}\n onClose={() => setActiveAction(null)}\n title={\n activeAction?.operation.summary ||\n activeActionMeta?.actionName ||\n activeAction?.operation.operationId ||\n \"Action\"\n }\n size=\"lg\"\n >\n {activeAction && (\n <div className=\"space-y-4\">\n <div className=\"flex items-center gap-3\">\n <MethodBadge method={activeAction.method} />\n <code className=\"rounded-md bg-muted px-2 py-1 text-sm\">{activeAction.path}</code>\n </div>\n <FilterForm\n client={client}\n path={activeAction.path}\n method={activeAction.method}\n parameters={activeAction.operation.parameters ?? []}\n lockedValues={actionLockedValues}\n enableLookup={Boolean(activeActionMeta?.supportsLookup)}\n submitLabel=\"Execute request\"\n submittingLabel=\"Executing…\"\n isSubmitting={isExecutingAction}\n onSubmit={executeAction}\n />\n {actionError ? (\n <div className=\"rounded-md border border-destructive/40 bg-destructive/5 p-3 text-sm text-destructive\">\n {actionError}\n </div>\n ) : actionResult ? (\n <ExecutionResult\n response={actionResult}\n className=\"mt-0\"\n {...(commandRuntime ? { commandRuntime } : {})}\n />\n ) : null}\n </div>\n )}\n </Modal>\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 <div className={`animate-pulse rounded-md bg-muted ${className ?? \"\"}`.trim()} />;\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 (next !== `${window.location.pathname}${window.location.search}${window.location.hash}`) {\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":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OperationCommandPage.cjs","sources":["../../src/rpc/OperationCommandPage.tsx"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { FilterBar } from \"../components/FilterBar\";\nimport type {\n ClickyCommandRuntime,\n ClickyNode,\n ClickyRow,\n ClickyTableRowClick,\n ClickyTableRowHref,\n} from \"../data/Clicky\";\nimport { MethodBadge } from \"../data/MethodBadge\";\nimport { AcceptPicker, type OperationPreviewMode } from \"./AcceptPicker\";\nimport { CommandForm, pathParamNames, submitValue } from \"./CommandForm\";\nimport { CommandOutput } from \"./CommandOutput\";\nimport type { RenderLink } from \"./EndpointList\";\nimport {\n buildInitialParameterValues,\n dataTablePaginationFromForm,\n packParameterValues,\n parametersToFormConfig,\n pruneParameterValues,\n titleCase,\n useDebouncedRecord,\n type ParameterValues,\n} from \"./formMetadata\";\nimport { InlineError } from \"./InlineError\";\nimport { OperationActionDialog } from \"./OperationActionDialog\";\nimport { isPositionalParam, type ExecutionResponse, type ResolvedOperation } from \"./types\";\nimport { useOperationById, type OperationsApiClient } from \"./useOperations\";\n\nexport type OperationCommandPageProps = {\n client: OperationsApiClient;\n operationId?: string;\n operation?: ResolvedOperation;\n operations?: ResolvedOperation[];\n initialValues?: ParameterValues;\n autoRun?: boolean;\n backHref?: string;\n backLabel?: string;\n renderLink?: RenderLink;\n commandRuntime?: ClickyCommandRuntime;\n onNavigate?: (href: string) => void;\n hideLockedPathFilters?: boolean;\n className?: string;\n};\n\nconst EMPTY_PARAMETER_VALUES: ParameterValues = {};\n\nexport function OperationCommandPage({\n client,\n operationId,\n operation: providedOperation,\n operations = providedOperation ? [providedOperation] : [],\n initialValues = EMPTY_PARAMETER_VALUES,\n autoRun,\n backHref,\n backLabel = \"Back\",\n renderLink,\n onNavigate,\n hideLockedPathFilters = Boolean(providedOperation),\n className,\n}: OperationCommandPageProps) {\n const lookup = useOperationById(client, providedOperation ? undefined : operationId);\n const operation = providedOperation ?? lookup.operation;\n const isLoading = providedOperation ? false : lookup.isLoading;\n const [accept, setAccept] = useState(\"application/clicky+json\");\n const [previewMode, setPreviewMode] = useState<OperationPreviewMode>(\"hidden\");\n const [isExecuting, setIsExecuting] = useState(false);\n const [result, setResult] = useState<ExecutionResponse | null>(null);\n const [error, setError] = useState<unknown>(null);\n const [submitError, setSubmitError] = useState(\"\");\n const [hasAutoRun, setHasAutoRun] = useState(false);\n const parameters = operation?.operation.parameters ?? [];\n const isGet = (operation?.method ?? \"\").toUpperCase() === \"GET\";\n const effectiveAutoRun = operation ? (autoRun ?? isGet) : false;\n const parameterSignature = JSON.stringify(\n parameters.map((param) => ({\n name: param.name,\n in: param.in,\n required: param.required ?? false,\n default: param.schema?.default ?? null,\n })),\n );\n const operationKey = `${operation?.method ?? \"\"}:${operation?.path ?? \"\"}:${operation?.operation.operationId ?? \"\"}`;\n const effectiveInitialValues = useMemo(\n () =>\n operation\n ? buildInitialParameterValues(\n parameters,\n operation.method,\n {},\n stripRunnerParams(initialValues),\n )\n : stripRunnerParams(initialValues),\n [initialValues, operation?.method, parameterSignature],\n );\n const pathParameters = parameters.filter((param) => param.in === \"path\");\n const lockedPathValues = useMemo<ParameterValues>(() => {\n const values: ParameterValues = {};\n for (const param of pathParameters) {\n const value = effectiveInitialValues[param.name];\n if (typeof value === \"string\" && value.trim() !== \"\") {\n values[param.name] = value;\n }\n }\n return values;\n }, [effectiveInitialValues, pathParameters]);\n const detailOperation = useMemo(\n () => (operation ? findDetailOperation(operation, operations) : undefined),\n [operation, operations],\n );\n const relatedOperations = useMemo(\n () => (operation ? findRelatedOperations(operation, operations, lockedPathValues) : []),\n [lockedPathValues, operation, operations],\n );\n\n // GET-mode parameter state: filter values + pagination cursor are driven\n // by the page so they can flow natively into <CommandOutput>'s filter bar\n // and pagination footer instead of through a separate OperationQueryFilterBar.\n const [values, setValues] = useState<ParameterValues>(effectiveInitialValues);\n useEffect(() => {\n setValues(effectiveInitialValues);\n setSubmitError(\"\");\n }, [effectiveInitialValues]);\n const debouncedValues = useDebouncedRecord(values, 250);\n\n const lookupQuery = useQuery({\n queryKey: [\"operation-query-lookup\", operation?.method, operation?.path, debouncedValues],\n queryFn: async () => {\n if (!operation) return { filters: {} };\n return (\n (await client.lookupFilters?.(\n operation.path,\n operation.method,\n packParameterValues(debouncedValues, parameters),\n { Accept: \"application/json+clicky\" },\n )) ?? { filters: {} }\n );\n },\n enabled:\n isGet &&\n !!operation &&\n !!client.lookupFilters &&\n parameters.some((param) => param.in === \"query\"),\n staleTime: 30_000,\n retry: 0,\n });\n\n const formConfig = useMemo(() => {\n if (!isGet) return { filters: [] };\n return parametersToFormConfig(parameters, values, setValues, {\n lookup: lookupQuery.data,\n lockedValues: lockedPathValues,\n hideLocked: hideLockedPathFilters,\n });\n }, [isGet, parameters, values, lookupQuery.data, lockedPathValues, hideLockedPathFilters]);\n\n const dataTablePagination = useMemo(\n () => dataTablePaginationFromForm(formConfig.pagination, result),\n [formConfig.pagination, result],\n );\n\n // Ref tracking the last submitted parameter signature so that the\n // auto-submit-on-debounced-change effect and the manual submit button\n // both coordinate against the same \"have I already fired this set of\n // values\" check.\n const lastSubmittedSignature = useRef(\"\");\n\n function handleManualSubmit() {\n if (!operation) return;\n const merged = { ...values, ...lockedPathValues };\n const missingRequired = parameters.filter((param) => {\n if (!param.required) return false;\n return (merged[param.name] ?? \"\").trim() === \"\";\n });\n if (missingRequired.length > 0) {\n setSubmitError(\n `Missing required fields: ${missingRequired\n .map((param) => titleCase(param.name))\n .join(\", \")}`,\n );\n return;\n }\n setSubmitError(\"\");\n setHasAutoRun(true);\n lastSubmittedSignature.current = JSON.stringify(pruneParameterValues(merged));\n void executeOperation(merged);\n }\n\n async function executeOperation(values: ParameterValues) {\n if (!operation) return;\n\n setIsExecuting(true);\n setError(null);\n\n try {\n const response = await client.executeCommand(\n operation.path,\n operation.method,\n packParameterValues(values, operation.operation.parameters ?? []),\n { Accept: accept },\n );\n setResult(response);\n } catch (err) {\n setResult(null);\n setError(err);\n } finally {\n setIsExecuting(false);\n }\n }\n\n useEffect(() => {\n setHasAutoRun(false);\n setResult(null);\n setError(null);\n lastSubmittedSignature.current = \"\";\n }, [effectiveAutoRun, operationKey]);\n\n useEffect(() => {\n if (!effectiveAutoRun || !operation || hasAutoRun) return;\n // Auto-run a GET as long as every required parameter has a value. Optional\n // params (limit/offset, filter chips, etc.) get their defaults; the\n // sidebar's \"click → instant table\" flow depends on this not bailing just\n // because the operation declares any parameters at all.\n const missingRequired = parameters.filter((param) => {\n if (!param.required) return false;\n return (effectiveInitialValues[param.name] ?? \"\").trim() === \"\";\n });\n if (missingRequired.length > 0) return;\n\n setHasAutoRun(true);\n lastSubmittedSignature.current = JSON.stringify(pruneParameterValues(effectiveInitialValues));\n void executeOperation(effectiveInitialValues);\n }, [\n accept,\n effectiveAutoRun,\n effectiveInitialValues,\n hasAutoRun,\n operationKey,\n parameterSignature,\n ]);\n\n // GET re-runs on debounced filter/pagination changes once the initial\n // auto-run has fired; non-GETs keep their explicit-submit behavior.\n useEffect(() => {\n if (!isGet || !operation || !hasAutoRun) return;\n const merged = { ...debouncedValues, ...lockedPathValues };\n const missingRequired = parameters.filter((param) => {\n if (!param.required) return false;\n return (merged[param.name] ?? \"\").trim() === \"\";\n });\n if (missingRequired.length > 0) return;\n const signature = JSON.stringify(pruneParameterValues(merged));\n if (lastSubmittedSignature.current === signature) return;\n lastSubmittedSignature.current = signature;\n void executeOperation(merged);\n }, [isGet, hasAutoRun, debouncedValues, lockedPathValues, parameterSignature]);\n\n const getRowDetailHref = useCallback<ClickyTableRowHref>(\n (row) => {\n if (!detailOperation) return undefined;\n const id = getClickyRowId(row);\n if (!id) return undefined;\n return hrefForOperation(detailOperation, [], { id });\n },\n [detailOperation],\n );\n\n const handleTableRowClick = useCallback<ClickyTableRowClick>(\n (row) => {\n const href = getRowDetailHref(row);\n if (href) onNavigate?.(href);\n },\n [getRowDetailHref, onNavigate],\n );\n\n const backLink =\n backHref == null ? null : renderLink ? (\n renderLink({\n to: backHref,\n className: \"text-sm text-primary underline-offset-4 hover:underline\",\n children: backLabel,\n })\n ) : (\n <a href={backHref} className=\"text-sm text-primary underline-offset-4 hover:underline\">\n {backLabel}\n </a>\n );\n\n if (isLoading) {\n return <div className=\"text-sm text-muted-foreground\">Loading operation...</div>;\n }\n\n if (!operation) {\n return (\n <div className=\"space-y-4\">\n <div className=\"text-sm text-muted-foreground\">\n Unknown operation: <code>{operationId}</code>\n </div>\n {backLink}\n </div>\n );\n }\n\n const { path, method, operation: op } = operation;\n const preview = buildOperationPreview(operation, effectiveInitialValues, accept, previewMode);\n\n return (\n <div className={className ?? \"min-w-0 flex-1 space-y-6 p-6\"}>\n <div className=\"flex items-start justify-between gap-4\">\n <div className=\"min-w-0 flex-1\">\n {backLink}\n <div className=\"flex items-center gap-3\">\n <MethodBadge method={method} />\n <h1 className=\"truncate text-xl font-bold\">{op.summary || op.operationId || path}</h1>\n </div>\n <p className=\"mt-1 font-mono text-xs text-muted-foreground\">{path}</p>\n {op.operationId && op.summary && (\n <p className=\"mt-2 font-mono text-xs text-muted-foreground\">{op.operationId}</p>\n )}\n {op.description && op.description !== op.summary && (\n <p className=\"mt-1 text-sm text-muted-foreground\">{op.description}</p>\n )}\n </div>\n <div className=\"flex shrink-0 flex-col items-end gap-3\">\n <div>\n <div className=\"mb-1 text-right text-[10px] font-semibold uppercase tracking-wider text-muted-foreground\">\n Accept\n </div>\n <AcceptPicker\n value={accept}\n onChange={setAccept}\n previewMode={previewMode}\n onPreviewModeChange={setPreviewMode}\n />\n </div>\n {relatedOperations.length > 0 && (\n <div className=\"flex flex-wrap justify-end gap-2\">\n {relatedOperations.map((related) =>\n related.href ? (\n renderLink ? (\n renderLink({\n key: `${related.operation.method}:${related.operation.path}`,\n to: related.href,\n className:\n \"inline-flex h-8 items-center justify-center gap-2 rounded-md border border-input bg-background px-3 text-xs font-medium hover:bg-accent hover:text-accent-foreground\",\n children: related.label,\n })\n ) : (\n <a\n key={`${related.operation.method}:${related.operation.path}`}\n href={related.href}\n className=\"inline-flex h-8 items-center justify-center gap-2 rounded-md border border-input bg-background px-3 text-xs font-medium hover:bg-accent hover:text-accent-foreground\"\n >\n {related.label}\n </a>\n )\n ) : (\n <OperationActionDialog\n key={`${related.operation.method}:${related.operation.path}`}\n operation={related.operation}\n client={client}\n initialValues={lockedPathValues}\n label={related.label}\n defaultAccept={accept}\n {...(onNavigate ? { onNavigateAction: onNavigate } : {})}\n />\n ),\n )}\n </div>\n )}\n </div>\n </div>\n\n <section className=\"space-y-3\">\n {method.toUpperCase() === \"GET\" ? (\n parameters.length > 0 ? (\n // Before a result lands the FilterBar lives here so users can\n // fill in path params / required inputs and submit. Once a\n // result is showing AND auto-run is on (sidebar flow), the same\n // filter chips relocate into the DataTable's filter bar via\n // externalFilters, which is the unified placement the user asked\n // for. The two branches share `formConfig.filters` so the values\n // stay in sync.\n !result || !effectiveAutoRun ? (\n <div className=\"space-y-2\">\n <FilterBar\n autoSubmit={effectiveAutoRun}\n filters={formConfig.filters}\n {...(!effectiveAutoRun ? { onApply: () => handleManualSubmit() } : {})}\n applyLabel=\"Execute request\"\n isPending={isExecuting}\n {...(formConfig.timeRange ? { timeRange: formConfig.timeRange } : {})}\n />\n {submitError && (\n <div className=\"rounded-md border border-destructive/40 bg-destructive/5 p-3 text-sm text-destructive\">\n {submitError}\n </div>\n )}\n </div>\n ) : null\n ) : null\n ) : (\n <div className=\"rounded-lg border p-4\">\n <CommandForm\n parameters={parameters}\n onExecute={(params) => executeOperation(params)}\n isPending={isExecuting}\n method={method}\n path={path}\n accept={accept}\n initialValues={effectiveInitialValues}\n />\n </div>\n )}\n\n {preview && (\n <pre className=\"overflow-x-auto rounded-md bg-muted p-3 font-mono text-xs\">{preview}</pre>\n )}\n </section>\n\n {error ? (\n <InlineError title={`Failed to load ${path} as ${accept}`} error={error} />\n ) : isExecuting || result ? (\n <div role=\"region\" aria-label=\"Response body\">\n <CommandOutput\n response={result}\n loading={isExecuting}\n loadingMessage=\"Loading execution results…\"\n bare\n {...(detailOperation\n ? {\n getTableRowHref: getRowDetailHref,\n onTableRowClick: handleTableRowClick,\n isTableRowClickable: (row: ClickyRow) => Boolean(getRowDetailHref(row)),\n }\n : {})}\n {...(isGet && effectiveAutoRun && formConfig.filters.length > 0\n ? { externalFilters: formConfig.filters }\n : {})}\n {...(isGet && effectiveAutoRun && dataTablePagination\n ? { pagination: dataTablePagination }\n : {})}\n />\n </div>\n ) : null}\n </div>\n );\n}\n\ntype RelatedOperation = {\n operation: ResolvedOperation;\n label: string;\n href?: string;\n};\n\nfunction findRelatedOperations(\n current: ResolvedOperation,\n operations: ResolvedOperation[],\n pathValues: Record<string, string>,\n): RelatedOperation[] {\n if (current.method.toUpperCase() !== \"GET\") return [];\n if (!pathTemplateSatisfied(current.path, pathValues)) return [];\n\n const basePath = current.path.replace(/\\/+$/, \"\");\n return operations\n .filter((candidate) => {\n if (candidate === current) return false;\n if (!candidate.path.startsWith(`${basePath}/`)) return false;\n if (!pathTemplateSatisfied(candidate.path, pathValues)) return false;\n const method = candidate.method.toUpperCase();\n return method === \"GET\" || method === \"POST\" || method === \"PUT\" || method === \"DELETE\";\n })\n .map((related) => {\n const method = related.method.toUpperCase();\n const href = method === \"GET\" ? hrefForOperation(related, [], pathValues) : undefined;\n return {\n operation: related,\n label: operationLabel(related),\n ...(href ? { href } : {}),\n };\n })\n .filter((related) => related.operation.method.toUpperCase() !== \"GET\" || related.href);\n}\n\nfunction findDetailOperation(current: ResolvedOperation, operations: ResolvedOperation[]) {\n const method = current.method.toUpperCase();\n const detailPath = `${current.path.replace(/\\/+$/, \"\")}/{id}`;\n return operations.find(\n (candidate) =>\n candidate.method.toUpperCase() === method &&\n candidate.path === detailPath &&\n candidate.operation.parameters?.some(\n (param) => param.in === \"path\" && param.name === \"id\" && param.required,\n ),\n );\n}\n\nfunction hrefForOperation(\n operation: ResolvedOperation,\n args: string[] = [],\n flags: Record<string, string> = {},\n): string | undefined {\n let route = apiPathToRoutePath(operation.path);\n const consumedFlags = new Set<string>();\n\n pathParamNames(operation.path).forEach((name, index) => {\n const value = flags[name] ?? args[index];\n if (!value) return;\n consumedFlags.add(name);\n route = route.replace(`:${name}`, encodeURIComponent(value));\n });\n\n if (route.includes(\":\")) return undefined;\n\n const search = new URLSearchParams();\n for (const [key, value] of Object.entries(flags)) {\n if (value && !consumedFlags.has(key)) search.set(key, value);\n }\n const query = search.toString();\n return query ? `${route}?${query}` : route;\n}\n\nfunction apiPathToRoutePath(path: string): string {\n const cliPath = path\n .trim()\n .replace(/^\\/api\\/v1\\/?/, \"\")\n .replace(/^\\/+/, \"\")\n .replace(/\\/+$/, \"\");\n if (!cliPath) return \"/\";\n return `/${cliPath.replace(/\\{([^}]+)\\}/g, \":$1\")}`;\n}\n\nfunction pathTemplateSatisfied(path: string, values: Record<string, string>) {\n return pathParamNames(path).every((name) => Boolean(values[name]));\n}\n\nfunction operationLabel(operation: ResolvedOperation): string {\n const actionName =\n operation.operation[\"x-clicky\"]?.actionName ||\n operation.path.split(\"/\").filter(Boolean).at(-1) ||\n operation.operation.operationId ||\n operation.method;\n return titleCase(actionName.replace(/[_-]+/g, \" \"));\n}\n\nfunction buildOperationPreview(\n operation: ResolvedOperation,\n values: ParameterValues,\n accept: string,\n mode: OperationPreviewMode,\n) {\n if (mode === \"hidden\") return \"\";\n if (mode === \"cli\") return buildCliPreview(operation, values);\n return buildCurlPreview(operation, values, accept);\n}\n\nfunction buildCurlPreview(operation: ResolvedOperation, values: ParameterValues, accept: string) {\n const params = operation.operation.parameters ?? [];\n const parts = [`curl -X ${operation.method.toUpperCase()}`];\n if (accept !== \"application/json\") parts.push(`-H \"Accept: ${accept}\"`);\n let url = operation.path;\n const queryParts: string[] = [];\n for (const param of params) {\n const value = submitValue(param, values[param.name]);\n if (!value) continue;\n if (param.in === \"path\") {\n url = url.replace(`{${param.name}}`, encodeURIComponent(value));\n } else if (param.in === \"query\") {\n queryParts.push(`${encodeURIComponent(param.name)}=${encodeURIComponent(value)}`);\n }\n }\n if (queryParts.length > 0) url += `?${queryParts.join(\"&\")}`;\n parts.push(`\"${url}\"`);\n return parts.join(\" \");\n}\n\nfunction buildCliPreview(operation: ResolvedOperation, values: ParameterValues) {\n const command = operation.operation[\"x-clicky\"]?.command;\n if (!command) return buildCurlPreview(operation, values, \"application/json\");\n const params = operation.operation.parameters ?? [];\n const positionalNames = new Set(params.filter(isPositionalParam).map((param) => param.name));\n const parts = [command.replaceAll(\"/\", \" \")];\n for (const param of params) {\n const value = submitValue(param, values[param.name]);\n if (!value) continue;\n if (param.in === \"path\" || positionalNames.has(param.name)) {\n parts.push(shellQuote(value));\n continue;\n }\n parts.push(`--${param.name}`, shellQuote(value));\n }\n return parts.join(\" \");\n}\n\nfunction shellQuote(value: string) {\n if (/^[a-zA-Z0-9_./:@-]+$/.test(value)) return value;\n return `'${value.replaceAll(\"'\", \"'\\\\''\")}'`;\n}\n\nfunction stripRunnerParams(values: ParameterValues): ParameterValues {\n const next: ParameterValues = {};\n for (const [key, value] of Object.entries(values)) {\n if (key === \"autoRun\" || key.startsWith(\"__\")) continue;\n next[key] = value;\n }\n return next;\n}\n\nfunction getClickyRowId(row: ClickyRow) {\n const candidates = [\"_id\", \"id\", \"ID\", \"guid\", \"GUID\"];\n for (const key of candidates) {\n const value = clickyNodeText(row.cells[key]);\n if (value) return value;\n }\n return undefined;\n}\n\nfunction clickyNodeText(node: ClickyNode | undefined): string {\n if (!node) return \"\";\n if (node.plain) return node.plain;\n if (node.text) return node.text;\n if (node.source) return node.source;\n if (node.children) return node.children.map(clickyNodeText).join(\"\");\n if (node.items) return node.items.map(clickyNodeText).join(\" \");\n if (node.fields) return node.fields.map((field) => clickyNodeText(field.value)).join(\" \");\n return \"\";\n}\n"],"names":["useOperationById","useState","useMemo","buildInitialParameterValues","values","useEffect","useDebouncedRecord","useQuery","packParameterValues","parametersToFormConfig","dataTablePaginationFromForm","useRef","titleCase","pruneParameterValues","useCallback","jsx","jsxs","MethodBadge","AcceptPicker","OperationActionDialog","FilterBar","CommandForm","InlineError","CommandOutput","pathParamNames","submitValue","isPositionalParam"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"OperationCommandPage.cjs","sources":["../../src/rpc/OperationCommandPage.tsx"],"sourcesContent":["import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { FilterBar } from \"../components/FilterBar\";\nimport type {\n ClickyCommandRuntime,\n ClickyNode,\n ClickyRow,\n ClickyTableRowClick,\n ClickyTableRowHref,\n} from \"../data/Clicky\";\nimport { MethodBadge } from \"../data/MethodBadge\";\nimport { AcceptPicker } from \"./AcceptPicker\";\nimport type { OperationPreviewMode } from \"./accept-options\";\nimport { CommandForm, pathParamNames, submitValue } from \"./CommandForm\";\nimport { CommandOutput } from \"./CommandOutput\";\nimport type { RenderLink } from \"./EndpointList\";\nimport {\n buildInitialParameterValues,\n dataTablePaginationFromForm,\n packParameterValues,\n parametersToFormConfig,\n pruneParameterValues,\n titleCase,\n useDebouncedRecord,\n type ParameterValues,\n} from \"./formMetadata\";\nimport { InlineError } from \"./InlineError\";\nimport { OperationActionDialog } from \"./OperationActionDialog\";\nimport { isPositionalParam, type ExecutionResponse, type ResolvedOperation } from \"./types\";\nimport { useOperationById, type OperationsApiClient } from \"./useOperations\";\n\nexport type OperationCommandPageProps = {\n client: OperationsApiClient;\n operationId?: string;\n operation?: ResolvedOperation;\n operations?: ResolvedOperation[];\n initialValues?: ParameterValues;\n autoRun?: boolean;\n backHref?: string;\n backLabel?: string;\n renderLink?: RenderLink;\n commandRuntime?: ClickyCommandRuntime;\n onNavigate?: (href: string) => void;\n hideLockedPathFilters?: boolean;\n className?: string;\n};\n\nconst EMPTY_PARAMETER_VALUES: ParameterValues = {};\n\nexport function OperationCommandPage({\n client,\n operationId,\n operation: providedOperation,\n operations = providedOperation ? [providedOperation] : [],\n initialValues = EMPTY_PARAMETER_VALUES,\n autoRun,\n backHref,\n backLabel = \"Back\",\n renderLink,\n onNavigate,\n hideLockedPathFilters = Boolean(providedOperation),\n className,\n}: OperationCommandPageProps) {\n const lookup = useOperationById(client, providedOperation ? undefined : operationId);\n const operation = providedOperation ?? lookup.operation;\n const isLoading = providedOperation ? false : lookup.isLoading;\n const [accept, setAccept] = useState(\"application/clicky+json\");\n const [previewMode, setPreviewMode] = useState<OperationPreviewMode>(\"hidden\");\n const [isExecuting, setIsExecuting] = useState(false);\n const [result, setResult] = useState<ExecutionResponse | null>(null);\n const [error, setError] = useState<unknown>(null);\n const [submitError, setSubmitError] = useState(\"\");\n const [hasAutoRun, setHasAutoRun] = useState(false);\n const parameters = operation?.operation.parameters ?? [];\n const isGet = (operation?.method ?? \"\").toUpperCase() === \"GET\";\n const effectiveAutoRun = operation ? (autoRun ?? isGet) : false;\n const parameterSignature = JSON.stringify(\n parameters.map((param) => ({\n name: param.name,\n in: param.in,\n required: param.required ?? false,\n default: param.schema?.default ?? null,\n })),\n );\n const operationKey = `${operation?.method ?? \"\"}:${operation?.path ?? \"\"}:${operation?.operation.operationId ?? \"\"}`;\n const effectiveInitialValues = useMemo(\n () =>\n operation\n ? buildInitialParameterValues(\n parameters,\n operation.method,\n {},\n stripRunnerParams(initialValues),\n )\n : stripRunnerParams(initialValues),\n [initialValues, operation?.method, parameterSignature],\n );\n const pathParameters = parameters.filter((param) => param.in === \"path\");\n const lockedPathValues = useMemo<ParameterValues>(() => {\n const values: ParameterValues = {};\n for (const param of pathParameters) {\n const value = effectiveInitialValues[param.name];\n if (typeof value === \"string\" && value.trim() !== \"\") {\n values[param.name] = value;\n }\n }\n return values;\n }, [effectiveInitialValues, pathParameters]);\n const detailOperation = useMemo(\n () => (operation ? findDetailOperation(operation, operations) : undefined),\n [operation, operations],\n );\n const relatedOperations = useMemo(\n () => (operation ? findRelatedOperations(operation, operations, lockedPathValues) : []),\n [lockedPathValues, operation, operations],\n );\n\n // GET-mode parameter state: filter values + pagination cursor are driven\n // by the page so they can flow natively into <CommandOutput>'s filter bar\n // and pagination footer instead of through a separate OperationQueryFilterBar.\n const [values, setValues] = useState<ParameterValues>(effectiveInitialValues);\n useEffect(() => {\n setValues(effectiveInitialValues);\n setSubmitError(\"\");\n }, [effectiveInitialValues]);\n const debouncedValues = useDebouncedRecord(values, 250);\n\n const lookupQuery = useQuery({\n queryKey: [\"operation-query-lookup\", operation?.method, operation?.path, debouncedValues],\n queryFn: async () => {\n if (!operation) return { filters: {} };\n return (\n (await client.lookupFilters?.(\n operation.path,\n operation.method,\n packParameterValues(debouncedValues, parameters),\n { Accept: \"application/json+clicky\" },\n )) ?? { filters: {} }\n );\n },\n enabled:\n isGet &&\n !!operation &&\n !!client.lookupFilters &&\n parameters.some((param) => param.in === \"query\"),\n staleTime: 30_000,\n retry: 0,\n });\n\n const formConfig = useMemo(() => {\n if (!isGet) return { filters: [] };\n return parametersToFormConfig(parameters, values, setValues, {\n lookup: lookupQuery.data,\n lockedValues: lockedPathValues,\n hideLocked: hideLockedPathFilters,\n });\n }, [isGet, parameters, values, lookupQuery.data, lockedPathValues, hideLockedPathFilters]);\n\n const dataTablePagination = useMemo(\n () => dataTablePaginationFromForm(formConfig.pagination, result),\n [formConfig.pagination, result],\n );\n\n // Ref tracking the last submitted parameter signature so that the\n // auto-submit-on-debounced-change effect and the manual submit button\n // both coordinate against the same \"have I already fired this set of\n // values\" check.\n const lastSubmittedSignature = useRef(\"\");\n\n function handleManualSubmit() {\n if (!operation) return;\n const merged = { ...values, ...lockedPathValues };\n const missingRequired = parameters.filter((param) => {\n if (!param.required) return false;\n return (merged[param.name] ?? \"\").trim() === \"\";\n });\n if (missingRequired.length > 0) {\n setSubmitError(\n `Missing required fields: ${missingRequired\n .map((param) => titleCase(param.name))\n .join(\", \")}`,\n );\n return;\n }\n setSubmitError(\"\");\n setHasAutoRun(true);\n lastSubmittedSignature.current = JSON.stringify(pruneParameterValues(merged));\n void executeOperation(merged);\n }\n\n async function executeOperation(values: ParameterValues) {\n if (!operation) return;\n\n setIsExecuting(true);\n setError(null);\n\n try {\n const response = await client.executeCommand(\n operation.path,\n operation.method,\n packParameterValues(values, operation.operation.parameters ?? []),\n { Accept: accept },\n );\n setResult(response);\n } catch (err) {\n setResult(null);\n setError(err);\n } finally {\n setIsExecuting(false);\n }\n }\n\n useEffect(() => {\n setHasAutoRun(false);\n setResult(null);\n setError(null);\n lastSubmittedSignature.current = \"\";\n }, [effectiveAutoRun, operationKey]);\n\n useEffect(() => {\n if (!effectiveAutoRun || !operation || hasAutoRun) return;\n // Auto-run a GET as long as every required parameter has a value. Optional\n // params (limit/offset, filter chips, etc.) get their defaults; the\n // sidebar's \"click → instant table\" flow depends on this not bailing just\n // because the operation declares any parameters at all.\n const missingRequired = parameters.filter((param) => {\n if (!param.required) return false;\n return (effectiveInitialValues[param.name] ?? \"\").trim() === \"\";\n });\n if (missingRequired.length > 0) return;\n\n setHasAutoRun(true);\n lastSubmittedSignature.current = JSON.stringify(pruneParameterValues(effectiveInitialValues));\n void executeOperation(effectiveInitialValues);\n }, [\n accept,\n effectiveAutoRun,\n effectiveInitialValues,\n hasAutoRun,\n operationKey,\n parameterSignature,\n ]);\n\n // GET re-runs on debounced filter/pagination changes once the initial\n // auto-run has fired; non-GETs keep their explicit-submit behavior.\n useEffect(() => {\n if (!isGet || !operation || !hasAutoRun) return;\n const merged = { ...debouncedValues, ...lockedPathValues };\n const missingRequired = parameters.filter((param) => {\n if (!param.required) return false;\n return (merged[param.name] ?? \"\").trim() === \"\";\n });\n if (missingRequired.length > 0) return;\n const signature = JSON.stringify(pruneParameterValues(merged));\n if (lastSubmittedSignature.current === signature) return;\n lastSubmittedSignature.current = signature;\n void executeOperation(merged);\n }, [isGet, hasAutoRun, debouncedValues, lockedPathValues, parameterSignature]);\n\n const getRowDetailHref = useCallback<ClickyTableRowHref>(\n (row) => {\n if (!detailOperation) return undefined;\n const id = getClickyRowId(row);\n if (!id) return undefined;\n return hrefForOperation(detailOperation, [], { id });\n },\n [detailOperation],\n );\n\n const handleTableRowClick = useCallback<ClickyTableRowClick>(\n (row) => {\n const href = getRowDetailHref(row);\n if (href) onNavigate?.(href);\n },\n [getRowDetailHref, onNavigate],\n );\n\n const backLink =\n backHref == null ? null : renderLink ? (\n renderLink({\n to: backHref,\n className: \"text-sm text-primary underline-offset-4 hover:underline\",\n children: backLabel,\n })\n ) : (\n <a href={backHref} className=\"text-sm text-primary underline-offset-4 hover:underline\">\n {backLabel}\n </a>\n );\n\n if (isLoading) {\n return <div className=\"text-sm text-muted-foreground\">Loading operation...</div>;\n }\n\n if (!operation) {\n return (\n <div className=\"space-y-4\">\n <div className=\"text-sm text-muted-foreground\">\n Unknown operation: <code>{operationId}</code>\n </div>\n {backLink}\n </div>\n );\n }\n\n const { path, method, operation: op } = operation;\n const preview = buildOperationPreview(operation, effectiveInitialValues, accept, previewMode);\n\n return (\n <div className={className ?? \"min-w-0 flex-1 space-y-6 p-6\"}>\n <div className=\"flex items-start justify-between gap-4\">\n <div className=\"min-w-0 flex-1\">\n {backLink}\n <div className=\"flex items-center gap-3\">\n <MethodBadge method={method} />\n <h1 className=\"truncate text-xl font-bold\">{op.summary || op.operationId || path}</h1>\n </div>\n <p className=\"mt-1 font-mono text-xs text-muted-foreground\">{path}</p>\n {op.operationId && op.summary && (\n <p className=\"mt-2 font-mono text-xs text-muted-foreground\">{op.operationId}</p>\n )}\n {op.description && op.description !== op.summary && (\n <p className=\"mt-1 text-sm text-muted-foreground\">{op.description}</p>\n )}\n </div>\n <div className=\"flex shrink-0 flex-col items-end gap-3\">\n <div>\n <div className=\"mb-1 text-right text-[10px] font-semibold uppercase tracking-wider text-muted-foreground\">\n Accept\n </div>\n <AcceptPicker\n value={accept}\n onChange={setAccept}\n previewMode={previewMode}\n onPreviewModeChange={setPreviewMode}\n />\n </div>\n {relatedOperations.length > 0 && (\n <div className=\"flex flex-wrap justify-end gap-2\">\n {relatedOperations.map((related) =>\n related.href ? (\n renderLink ? (\n renderLink({\n key: `${related.operation.method}:${related.operation.path}`,\n to: related.href,\n className:\n \"inline-flex h-8 items-center justify-center gap-2 rounded-md border border-input bg-background px-3 text-xs font-medium hover:bg-accent hover:text-accent-foreground\",\n children: related.label,\n })\n ) : (\n <a\n key={`${related.operation.method}:${related.operation.path}`}\n href={related.href}\n className=\"inline-flex h-8 items-center justify-center gap-2 rounded-md border border-input bg-background px-3 text-xs font-medium hover:bg-accent hover:text-accent-foreground\"\n >\n {related.label}\n </a>\n )\n ) : (\n <OperationActionDialog\n key={`${related.operation.method}:${related.operation.path}`}\n operation={related.operation}\n client={client}\n initialValues={lockedPathValues}\n label={related.label}\n defaultAccept={accept}\n {...(onNavigate ? { onNavigateAction: onNavigate } : {})}\n />\n ),\n )}\n </div>\n )}\n </div>\n </div>\n\n <section className=\"space-y-3\">\n {method.toUpperCase() === \"GET\" ? (\n parameters.length > 0 ? (\n // Before a result lands the FilterBar lives here so users can\n // fill in path params / required inputs and submit. Once a\n // result is showing AND auto-run is on (sidebar flow), the same\n // filter chips relocate into the DataTable's filter bar via\n // externalFilters, which is the unified placement the user asked\n // for. The two branches share `formConfig.filters` so the values\n // stay in sync.\n !result || !effectiveAutoRun ? (\n <div className=\"space-y-2\">\n <FilterBar\n autoSubmit={effectiveAutoRun}\n filters={formConfig.filters}\n {...(!effectiveAutoRun ? { onApply: () => handleManualSubmit() } : {})}\n applyLabel=\"Execute request\"\n isPending={isExecuting}\n {...(formConfig.timeRange ? { timeRange: formConfig.timeRange } : {})}\n />\n {submitError && (\n <div className=\"rounded-md border border-destructive/40 bg-destructive/5 p-3 text-sm text-destructive\">\n {submitError}\n </div>\n )}\n </div>\n ) : null\n ) : null\n ) : (\n <div className=\"rounded-lg border p-4\">\n <CommandForm\n parameters={parameters}\n onExecute={(params) => executeOperation(params)}\n isPending={isExecuting}\n method={method}\n path={path}\n accept={accept}\n initialValues={effectiveInitialValues}\n />\n </div>\n )}\n\n {preview && (\n <pre className=\"overflow-x-auto rounded-md bg-muted p-3 font-mono text-xs\">{preview}</pre>\n )}\n </section>\n\n {error ? (\n <InlineError title={`Failed to load ${path} as ${accept}`} error={error} />\n ) : isExecuting || result ? (\n <div role=\"region\" aria-label=\"Response body\">\n <CommandOutput\n response={result}\n loading={isExecuting}\n loadingMessage=\"Loading execution results…\"\n bare\n {...(detailOperation\n ? {\n getTableRowHref: getRowDetailHref,\n onTableRowClick: handleTableRowClick,\n isTableRowClickable: (row: ClickyRow) => Boolean(getRowDetailHref(row)),\n }\n : {})}\n {...(isGet && effectiveAutoRun && formConfig.filters.length > 0\n ? { externalFilters: formConfig.filters }\n : {})}\n {...(isGet && effectiveAutoRun && dataTablePagination\n ? { pagination: dataTablePagination }\n : {})}\n />\n </div>\n ) : null}\n </div>\n );\n}\n\ntype RelatedOperation = {\n operation: ResolvedOperation;\n label: string;\n href?: string;\n};\n\nfunction findRelatedOperations(\n current: ResolvedOperation,\n operations: ResolvedOperation[],\n pathValues: Record<string, string>,\n): RelatedOperation[] {\n if (current.method.toUpperCase() !== \"GET\") return [];\n if (!pathTemplateSatisfied(current.path, pathValues)) return [];\n\n const basePath = current.path.replace(/\\/+$/, \"\");\n return operations\n .filter((candidate) => {\n if (candidate === current) return false;\n if (!candidate.path.startsWith(`${basePath}/`)) return false;\n if (!pathTemplateSatisfied(candidate.path, pathValues)) return false;\n const method = candidate.method.toUpperCase();\n return method === \"GET\" || method === \"POST\" || method === \"PUT\" || method === \"DELETE\";\n })\n .map((related) => {\n const method = related.method.toUpperCase();\n const href = method === \"GET\" ? hrefForOperation(related, [], pathValues) : undefined;\n return {\n operation: related,\n label: operationLabel(related),\n ...(href ? { href } : {}),\n };\n })\n .filter((related) => related.operation.method.toUpperCase() !== \"GET\" || related.href);\n}\n\nfunction findDetailOperation(current: ResolvedOperation, operations: ResolvedOperation[]) {\n const method = current.method.toUpperCase();\n const detailPath = `${current.path.replace(/\\/+$/, \"\")}/{id}`;\n return operations.find(\n (candidate) =>\n candidate.method.toUpperCase() === method &&\n candidate.path === detailPath &&\n candidate.operation.parameters?.some(\n (param) => param.in === \"path\" && param.name === \"id\" && param.required,\n ),\n );\n}\n\nfunction hrefForOperation(\n operation: ResolvedOperation,\n args: string[] = [],\n flags: Record<string, string> = {},\n): string | undefined {\n let route = apiPathToRoutePath(operation.path);\n const consumedFlags = new Set<string>();\n\n pathParamNames(operation.path).forEach((name, index) => {\n const value = flags[name] ?? args[index];\n if (!value) return;\n consumedFlags.add(name);\n route = route.replace(`:${name}`, encodeURIComponent(value));\n });\n\n if (route.includes(\":\")) return undefined;\n\n const search = new URLSearchParams();\n for (const [key, value] of Object.entries(flags)) {\n if (value && !consumedFlags.has(key)) search.set(key, value);\n }\n const query = search.toString();\n return query ? `${route}?${query}` : route;\n}\n\nfunction apiPathToRoutePath(path: string): string {\n const cliPath = path\n .trim()\n .replace(/^\\/api\\/v1\\/?/, \"\")\n .replace(/^\\/+/, \"\")\n .replace(/\\/+$/, \"\");\n if (!cliPath) return \"/\";\n return `/${cliPath.replace(/\\{([^}]+)\\}/g, \":$1\")}`;\n}\n\nfunction pathTemplateSatisfied(path: string, values: Record<string, string>) {\n return pathParamNames(path).every((name) => Boolean(values[name]));\n}\n\nfunction operationLabel(operation: ResolvedOperation): string {\n const actionName =\n operation.operation[\"x-clicky\"]?.actionName ||\n operation.path.split(\"/\").filter(Boolean).at(-1) ||\n operation.operation.operationId ||\n operation.method;\n return titleCase(actionName.replace(/[_-]+/g, \" \"));\n}\n\nfunction buildOperationPreview(\n operation: ResolvedOperation,\n values: ParameterValues,\n accept: string,\n mode: OperationPreviewMode,\n) {\n if (mode === \"hidden\") return \"\";\n if (mode === \"cli\") return buildCliPreview(operation, values);\n return buildCurlPreview(operation, values, accept);\n}\n\nfunction buildCurlPreview(operation: ResolvedOperation, values: ParameterValues, accept: string) {\n const params = operation.operation.parameters ?? [];\n const parts = [`curl -X ${operation.method.toUpperCase()}`];\n if (accept !== \"application/json\") parts.push(`-H \"Accept: ${accept}\"`);\n let url = operation.path;\n const queryParts: string[] = [];\n for (const param of params) {\n const value = submitValue(param, values[param.name]);\n if (!value) continue;\n if (param.in === \"path\") {\n url = url.replace(`{${param.name}}`, encodeURIComponent(value));\n } else if (param.in === \"query\") {\n queryParts.push(`${encodeURIComponent(param.name)}=${encodeURIComponent(value)}`);\n }\n }\n if (queryParts.length > 0) url += `?${queryParts.join(\"&\")}`;\n parts.push(`\"${url}\"`);\n return parts.join(\" \");\n}\n\nfunction buildCliPreview(operation: ResolvedOperation, values: ParameterValues) {\n const command = operation.operation[\"x-clicky\"]?.command;\n if (!command) return buildCurlPreview(operation, values, \"application/json\");\n const params = operation.operation.parameters ?? [];\n const positionalNames = new Set(params.filter(isPositionalParam).map((param) => param.name));\n const parts = [command.replaceAll(\"/\", \" \")];\n for (const param of params) {\n const value = submitValue(param, values[param.name]);\n if (!value) continue;\n if (param.in === \"path\" || positionalNames.has(param.name)) {\n parts.push(shellQuote(value));\n continue;\n }\n parts.push(`--${param.name}`, shellQuote(value));\n }\n return parts.join(\" \");\n}\n\nfunction shellQuote(value: string) {\n if (/^[a-zA-Z0-9_./:@-]+$/.test(value)) return value;\n return `'${value.replaceAll(\"'\", \"'\\\\''\")}'`;\n}\n\nfunction stripRunnerParams(values: ParameterValues): ParameterValues {\n const next: ParameterValues = {};\n for (const [key, value] of Object.entries(values)) {\n if (key === \"autoRun\" || key.startsWith(\"__\")) continue;\n next[key] = value;\n }\n return next;\n}\n\nfunction getClickyRowId(row: ClickyRow) {\n const candidates = [\"_id\", \"id\", \"ID\", \"guid\", \"GUID\"];\n for (const key of candidates) {\n const value = clickyNodeText(row.cells[key]);\n if (value) return value;\n }\n return undefined;\n}\n\nfunction clickyNodeText(node: ClickyNode | undefined): string {\n if (!node) return \"\";\n if (node.plain) return node.plain;\n if (node.text) return node.text;\n if (node.source) return node.source;\n if (node.children) return node.children.map(clickyNodeText).join(\"\");\n if (node.items) return node.items.map(clickyNodeText).join(\" \");\n if (node.fields) return node.fields.map((field) => clickyNodeText(field.value)).join(\" \");\n return \"\";\n}\n"],"names":["useOperationById","useState","useMemo","buildInitialParameterValues","values","useEffect","useDebouncedRecord","useQuery","packParameterValues","parametersToFormConfig","dataTablePaginationFromForm","useRef","titleCase","pruneParameterValues","useCallback","jsx","jsxs","MethodBadge","AcceptPicker","OperationActionDialog","FilterBar","CommandForm","InlineError","CommandOutput","pathParamNames","submitValue","isPositionalParam"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OperationCommandPage.d.ts","sourceRoot":"","sources":["../../src/rpc/OperationCommandPage.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,oBAAoB,EAKrB,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"OperationCommandPage.d.ts","sourceRoot":"","sources":["../../src/rpc/OperationCommandPage.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,oBAAoB,EAKrB,MAAM,gBAAgB,CAAC;AAMxB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAQL,KAAK,eAAe,EACrB,MAAM,gBAAgB,CAAC;AAGxB,OAAO,EAA6C,KAAK,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAC5F,OAAO,EAAoB,KAAK,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAE7E,MAAM,MAAM,yBAAyB,GAAG;IACtC,MAAM,EAAE,mBAAmB,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,iBAAiB,CAAC;IAC9B,UAAU,CAAC,EAAE,iBAAiB,EAAE,CAAC;IACjC,aAAa,CAAC,EAAE,eAAe,CAAC;IAChC,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,cAAc,CAAC,EAAE,oBAAoB,CAAC;IACtC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAIF,wBAAgB,oBAAoB,CAAC,EACnC,MAAM,EACN,WAAW,EACX,SAAS,EAAE,iBAAiB,EAC5B,UAAyD,EACzD,aAAsC,EACtC,OAAO,EACP,QAAQ,EACR,SAAkB,EAClB,UAAU,EACV,UAAU,EACV,qBAAkD,EAClD,SAAS,GACV,EAAE,yBAAyB,2CAmY3B"}
|