@flanksource/clicky-ui 0.2.13 → 0.2.15
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 +5 -3
- package/dist/components/Combobox.cjs.map +1 -1
- package/dist/components/Combobox.d.ts +2 -0
- package/dist/components/Combobox.d.ts.map +1 -1
- package/dist/components/Combobox.js +5 -3
- package/dist/components/Combobox.js.map +1 -1
- package/dist/components/DateTimePicker.cjs +3 -1
- package/dist/components/DateTimePicker.cjs.map +1 -1
- package/dist/components/DateTimePicker.d.ts +5 -1
- package/dist/components/DateTimePicker.d.ts.map +1 -1
- package/dist/components/DateTimePicker.js +3 -1
- package/dist/components/DateTimePicker.js.map +1 -1
- package/dist/components/FilterBar.cjs +8 -41
- package/dist/components/FilterBar.cjs.map +1 -1
- package/dist/components/FilterBar.d.ts +0 -2
- package/dist/components/FilterBar.d.ts.map +1 -1
- package/dist/components/FilterBar.js +3 -36
- 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/SecretKeySelector.cjs +1 -2
- package/dist/components/SecretKeySelector.cjs.map +1 -1
- package/dist/components/SecretKeySelector.d.ts +5 -3
- package/dist/components/SecretKeySelector.d.ts.map +1 -1
- package/dist/components/SecretKeySelector.js +2 -3
- 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 +90 -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 +82 -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 +58 -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 +27 -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/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 +18 -6
- package/dist/components.cjs.map +1 -1
- package/dist/components.d.ts +10 -3
- package/dist/components.d.ts.map +1 -1
- package/dist/components.js +16 -4
- 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/TimeseriesCoreBars.cjs +8 -1
- package/dist/data/TimeseriesCoreBars.cjs.map +1 -1
- package/dist/data/TimeseriesCoreBars.d.ts.map +1 -1
- package/dist/data/TimeseriesCoreBars.js +8 -1
- package/dist/data/TimeseriesCoreBars.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 +71 -30
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +53 -12
- 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 +11 -4
- package/dist/overlay/Modal.cjs.map +1 -1
- package/dist/overlay/Modal.d.ts +1 -1
- package/dist/overlay/Modal.d.ts.map +1 -1
- package/dist/overlay/Modal.js +11 -4
- 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/OperationCatalog.cjs +23 -41
- package/dist/rpc/OperationCatalog.cjs.map +1 -1
- package/dist/rpc/OperationCatalog.d.ts.map +1 -1
- package/dist/rpc/OperationCatalog.js +24 -42
- 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.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
|
@@ -12,7 +12,6 @@ const clickyMetadata = require("./clickyMetadata.cjs");
|
|
|
12
12
|
const EndpointList = require("./EndpointList.cjs");
|
|
13
13
|
const ExecutionResult = require("./ExecutionResult.cjs");
|
|
14
14
|
const FilterForm = require("./FilterForm.cjs");
|
|
15
|
-
const types = require("./types.cjs");
|
|
16
15
|
const useOperations = require("./useOperations.cjs");
|
|
17
16
|
const formMetadata = require("./formMetadata.cjs");
|
|
18
17
|
const UiTable = require("../icons/components/UiTable.cjs");
|
|
@@ -103,14 +102,9 @@ function OperationCatalog({
|
|
|
103
102
|
});
|
|
104
103
|
const actionOps = react.useMemo(() => {
|
|
105
104
|
if (useSurfaceMetadata) {
|
|
106
|
-
return clickyMetadata.
|
|
105
|
+
return clickyMetadata.findSurfaceActions(domainOps, surfaceKey);
|
|
107
106
|
}
|
|
108
|
-
return domainOps.filter(
|
|
109
|
-
(op) => {
|
|
110
|
-
var _a;
|
|
111
|
-
return op.method !== "get" && !op.path.includes("{") && !((_a = op.operation.parameters) == null ? void 0 : _a.some((p) => p.in === "path" || types.isPositionalParam(p)));
|
|
112
|
-
}
|
|
113
|
-
);
|
|
107
|
+
return domainOps.filter((op) => op.method !== "get" && !op.path.includes("{"));
|
|
114
108
|
}, [domainOps, surfaceKey, useSurfaceMetadata]);
|
|
115
109
|
const filterBarConfig = react.useMemo(() => {
|
|
116
110
|
const options = {
|
|
@@ -213,40 +207,28 @@ function OperationCatalog({
|
|
|
213
207
|
] })
|
|
214
208
|
] }),
|
|
215
209
|
actionOps.length > 0 && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-2", children: actionOps.map((op) => {
|
|
216
|
-
|
|
217
|
-
const
|
|
218
|
-
const tooltip =
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
setActionError("");
|
|
231
|
-
},
|
|
232
|
-
children: [
|
|
233
|
-
/* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiAdd.UiAdd, className: "text-xs" }),
|
|
234
|
-
op.operation.summary || ((_a = clickyMetadata.getOperationClickyMeta(op)) == null ? void 0 : _a.actionName) || commandName
|
|
235
|
-
]
|
|
210
|
+
const label = clickyMetadata.surfaceActionLabel(op);
|
|
211
|
+
const summary = op.operation.summary || op.operation.description;
|
|
212
|
+
const tooltip = summary ? `${label} — ${summary}` : label;
|
|
213
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
214
|
+
button.Button,
|
|
215
|
+
{
|
|
216
|
+
type: "button",
|
|
217
|
+
variant: "outline",
|
|
218
|
+
size: "sm",
|
|
219
|
+
title: tooltip,
|
|
220
|
+
onClick: () => {
|
|
221
|
+
setActiveAction(op);
|
|
222
|
+
setActionResult(null);
|
|
223
|
+
setActionError("");
|
|
236
224
|
},
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
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",
|
|
245
|
-
children: /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
246
|
-
/* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiAdd.UiAdd, className: "text-xs" }),
|
|
247
|
-
op.operation.summary || commandName
|
|
248
|
-
] })
|
|
249
|
-
});
|
|
225
|
+
children: [
|
|
226
|
+
/* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiAdd.UiAdd, className: "text-xs" }),
|
|
227
|
+
label
|
|
228
|
+
]
|
|
229
|
+
},
|
|
230
|
+
`${op.method}:${op.path}`
|
|
231
|
+
);
|
|
250
232
|
}) }),
|
|
251
233
|
showTable ? /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: listQuery.isError && !listQuery.data ? renderError(listQuery.error, `Failed to load ${(listEndpoint == null ? void 0 : listEndpoint.path) ?? ""}`) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
252
234
|
ExecutionResult.ExecutionResult,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OperationCatalog.cjs","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":["jsxs","jsx","useOperations","useState","useMemo","filterOperationsBySurface","filterOperationsByDomain","findSurfaceListOperation","findListEndpoint","useEffect","useQuery","packParameterValues","keepPreviousData","findSurfaceCollectionActions","isPositionalParam","parametersToFormConfig","dataTablePaginationFromForm","getOperationClickyMeta","Button","Icon","UiTable","UiListFlat","UiAdd","Fragment","ExecutionResult","EndpointList","Modal","MethodBadge","FilterForm"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"OperationCatalog.cjs","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 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 {\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 // 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 findSurfaceActions(domainOps, surfaceKey);\n }\n\n // A collection-level action is any non-GET operation that lives at the\n // collection path (no `{param}` segment). clicky promotes id-bearing\n // mutations (create/update/delete) onto the collection root and\n // query-encodes the entity id as an *optional* positional argument\n // (description \"Positional argument from command\"). That positional id\n // must NOT disqualify the op — the action modal collects it. Detail-scoped\n // routes keep their `{id}` path segment and are excluded by the path check.\n return domainOps.filter((op) => op.method !== \"get\" && !op.path.includes(\"{\"));\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 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 {...(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":["jsxs","jsx","useOperations","useState","useMemo","filterOperationsBySurface","filterOperationsByDomain","findSurfaceListOperation","findListEndpoint","useEffect","useQuery","packParameterValues","keepPreviousData","findSurfaceActions","parametersToFormConfig","dataTablePaginationFromForm","getOperationClickyMeta","Button","Icon","UiTable","UiListFlat","surfaceActionLabel","UiAdd","Fragment","ExecutionResult","EndpointList","Modal","MethodBadge","FilterForm"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OperationCatalog.d.ts","sourceRoot":"","sources":["../../src/rpc/OperationCatalog.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAgC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"OperationCatalog.d.ts","sourceRoot":"","sources":["../../src/rpc/OperationCatalog.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAgC,KAAK,SAAS,EAAE,MAAM,OAAO,CAAC;AAerE,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,EAAgB,KAAK,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAG/D,OAAO,EACL,KAAK,gBAAgB,EAGrB,KAAK,iBAAiB,EACvB,MAAM,SAAS,CAAC;AACjB,OAAO,EAAiB,KAAK,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAQ1E,MAAM,MAAM,qBAAqB,GAAG;IAClC,UAAU,EAAE,gBAAgB,CAAC;IAC7B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,MAAM,EAAE,mBAAmB,CAAC;IAC5B,UAAU,EAAE,UAAU,CAAC;IAGvB,aAAa,CAAC,EAAE,OAAO,CAAC;IAGxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAG3B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,cAAc,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,EAAE,EAAE,iBAAiB,KAAK,MAAM,CAAC;IACxE,WAAW,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,KAAK,SAAS,CAAC;IACzD,IAAI,CAAC,EAAE,YAAY,GAAG,eAAe,CAAC;IACtC,cAAc,CAAC,EAAE,oBAAoB,CAAC;CACvC,CAAC;AAcF,wBAAgB,gBAAgB,CAAC,EAC/B,UAAU,EACV,QAAQ,EACR,MAAM,EACN,UAAU,EACV,aAAqB,EACrB,iBAAiB,EACjB,eAAe,EACf,UAAU,EACV,cAAmC,EACnC,WAAgC,EAChC,IAAI,EACJ,cAAc,GACf,EAAE,qBAAqB,2CA4TvB"}
|
|
@@ -6,11 +6,10 @@ import { Icon } from "../data/Icon.js";
|
|
|
6
6
|
import { MethodBadge } from "../data/MethodBadge.js";
|
|
7
7
|
import { Modal } from "../overlay/Modal.js";
|
|
8
8
|
import { filterOperationsByDomain, findListEndpoint } from "./classify.js";
|
|
9
|
-
import { filterOperationsBySurface, findSurfaceListOperation,
|
|
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 { isPositionalParam } from "./types.js";
|
|
14
13
|
import { useOperations } from "./useOperations.js";
|
|
15
14
|
import { packParameterValues, parametersToFormConfig, dataTablePaginationFromForm } from "./formMetadata.js";
|
|
16
15
|
import { UiTable } from "../icons/components/UiTable.js";
|
|
@@ -101,14 +100,9 @@ function OperationCatalog({
|
|
|
101
100
|
});
|
|
102
101
|
const actionOps = useMemo(() => {
|
|
103
102
|
if (useSurfaceMetadata) {
|
|
104
|
-
return
|
|
103
|
+
return findSurfaceActions(domainOps, surfaceKey);
|
|
105
104
|
}
|
|
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
|
-
);
|
|
105
|
+
return domainOps.filter((op) => op.method !== "get" && !op.path.includes("{"));
|
|
112
106
|
}, [domainOps, surfaceKey, useSurfaceMetadata]);
|
|
113
107
|
const filterBarConfig = useMemo(() => {
|
|
114
108
|
const options = {
|
|
@@ -211,40 +205,28 @@ function OperationCatalog({
|
|
|
211
205
|
] })
|
|
212
206
|
] }),
|
|
213
207
|
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
|
-
]
|
|
208
|
+
const label = surfaceActionLabel(op);
|
|
209
|
+
const summary = op.operation.summary || op.operation.description;
|
|
210
|
+
const tooltip = summary ? `${label} — ${summary}` : label;
|
|
211
|
+
return /* @__PURE__ */ jsxs(
|
|
212
|
+
Button,
|
|
213
|
+
{
|
|
214
|
+
type: "button",
|
|
215
|
+
variant: "outline",
|
|
216
|
+
size: "sm",
|
|
217
|
+
title: tooltip,
|
|
218
|
+
onClick: () => {
|
|
219
|
+
setActiveAction(op);
|
|
220
|
+
setActionResult(null);
|
|
221
|
+
setActionError("");
|
|
234
222
|
},
|
|
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
|
-
});
|
|
223
|
+
children: [
|
|
224
|
+
/* @__PURE__ */ jsx(Icon, { icon: UiAdd, className: "text-xs" }),
|
|
225
|
+
label
|
|
226
|
+
]
|
|
227
|
+
},
|
|
228
|
+
`${op.method}:${op.path}`
|
|
229
|
+
);
|
|
248
230
|
}) }),
|
|
249
231
|
showTable ? /* @__PURE__ */ jsx(Fragment, { children: listQuery.isError && !listQuery.data ? renderError(listQuery.error, `Failed to load ${(listEndpoint == null ? void 0 : listEndpoint.path) ?? ""}`) : /* @__PURE__ */ jsx(
|
|
250
232
|
ExecutionResult,
|
|
@@ -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, findListEndpoint } 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 {\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 // 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 findSurfaceActions(domainOps, surfaceKey);\n }\n\n // A collection-level action is any non-GET operation that lives at the\n // collection path (no `{param}` segment). clicky promotes id-bearing\n // mutations (create/update/delete) onto the collection root and\n // query-encodes the entity id as an *optional* positional argument\n // (description \"Positional argument from command\"). That positional id\n // must NOT disqualify the op — the action modal collects it. Detail-scoped\n // routes keep their `{id}` path segment and are excluded by the path check.\n return domainOps.filter((op) => op.method !== \"get\" && !op.path.includes(\"{\"));\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 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 {...(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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"}
|