@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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FilterForm.cjs","sources":["../../src/rpc/FilterForm.tsx"],"sourcesContent":["import { useEffect, useMemo, useRef, useState, type FormEvent } from \"react\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { Button } from \"../components/button\";\nimport type {\n FilterBarFilter,\n FilterBarMultiFilter,\n FilterBarRangeProps,\n} from \"../components/FilterBar\";\nimport { TimeRange } from \"../components/TimeRange\";\nimport { FilterPill, type FilterMode } from \"../data/FilterPill\";\nimport { Icon } from \"../data/Icon\";\nimport { UiSearch } from \"../icons\";\nimport { cn } from \"../lib/utils\";\nimport {\n packParameterValues,\n parametersToFormConfig,\n pruneParameterValues,\n buildInitialParameterValues,\n titleCase,\n useDebouncedRecord,\n type ParameterValues,\n} from \"./formMetadata\";\nimport type { OpenAPIParameter } from \"./types\";\nimport type { OperationsApiClient } from \"./useOperations\";\n\nexport type FilterFormProps = {\n client: OperationsApiClient;\n path: string;\n method: string;\n parameters?: OpenAPIParameter[];\n initialValues?: ParameterValues | undefined;\n lockedValues?: ParameterValues | undefined;\n hideLocked?: boolean | undefined;\n enableLookup?: boolean | undefined;\n autoSubmit?: boolean | undefined;\n submitLabel?: string | undefined;\n submittingLabel?: string | undefined;\n emptyMessage?: string | undefined;\n isSubmitting?: boolean | undefined;\n className?: string | undefined;\n onSubmit: (values: ParameterValues) => void | Promise<void>;\n};\n\nexport function FilterForm({\n client,\n path,\n method,\n parameters = [],\n initialValues = {},\n lockedValues = {},\n hideLocked = false,\n enableLookup = method.toUpperCase() === \"GET\",\n autoSubmit = false,\n submitLabel = \"Execute request\",\n submittingLabel = \"Executing…\",\n emptyMessage = \"This operation does not require input.\",\n isSubmitting = false,\n className,\n onSubmit,\n}: FilterFormProps) {\n const resetKey = useMemo(\n () => `${method}:${path}:${JSON.stringify(initialValues)}:${JSON.stringify(lockedValues)}`,\n [initialValues, lockedValues, method, path],\n );\n const [values, setValues] = useState<ParameterValues>(() =>\n buildInitialParameterValues(parameters, method, lockedValues, initialValues),\n );\n const [error, setError] = useState(\"\");\n const debouncedValues = useDebouncedRecord(values, 250);\n const lastAutoSubmitted = useRef<string | null>(null);\n\n const lookupQuery = useQuery({\n queryKey: [\"filter-form-lookup\", method, path, debouncedValues],\n queryFn: async () =>\n (await client.lookupFilters?.(\n path,\n method,\n packParameterValues(debouncedValues, parameters),\n { Accept: \"application/json+clicky\" },\n )) ?? { filters: {} },\n enabled:\n enableLookup && !!client.lookupFilters && parameters.some((param) => param.in === \"query\"),\n staleTime: 30_000,\n retry: 0,\n });\n\n const formConfig = useMemo(\n () =>\n parametersToFormConfig(parameters, values, setValues, {\n lookup: lookupQuery.data,\n lockedValues,\n hideLocked,\n }),\n [hideLocked, lockedValues, lookupQuery.data, parameters, values],\n );\n\n const hasFields = formConfig.filters.length > 0 || formConfig.timeRange != null;\n\n async function handleSubmit(event?: FormEvent) {\n event?.preventDefault();\n\n const missingRequired = parameters.filter((param) => {\n if (!param.required) return false;\n const value = lockedValues[param.name] ?? values[param.name] ?? \"\";\n return value.trim() === \"\";\n });\n\n if (missingRequired.length > 0) {\n setError(\n `Missing required fields: ${missingRequired.map((param) => titleCase(param.name)).join(\", \")}`,\n );\n return;\n }\n\n setError(\"\");\n await onSubmit(pruneParameterValues(values));\n }\n\n useEffect(() => {\n setValues(buildInitialParameterValues(parameters, method, lockedValues, initialValues));\n setError(\"\");\n lastAutoSubmitted.current = null;\n }, [resetKey]);\n\n useEffect(() => {\n if (!autoSubmit) {\n return;\n }\n\n const missingRequired = parameters.filter((param) => {\n if (!param.required) return false;\n const value = lockedValues[param.name] ?? debouncedValues[param.name] ?? \"\";\n return value.trim() === \"\";\n });\n if (missingRequired.length > 0) {\n return;\n }\n\n const submittedValues = pruneParameterValues(debouncedValues);\n const signature = JSON.stringify(submittedValues);\n if (lastAutoSubmitted.current === signature) {\n return;\n }\n\n lastAutoSubmitted.current = signature;\n setError(\"\");\n void onSubmit(submittedValues);\n }, [autoSubmit, debouncedValues, lockedValues, onSubmit, parameters]);\n\n return (\n <form className=\"space-y-3\" onSubmit={handleSubmit}>\n {hasFields ? (\n <ParameterGrid\n autoSubmit={autoSubmit}\n filters={formConfig.filters}\n isSubmitting={isSubmitting}\n submitLabel={submitLabel}\n submittingLabel={submittingLabel}\n {...(formConfig.timeRange ? { timeRange: formConfig.timeRange } : {})}\n {...(className ? { className } : {})}\n />\n ) : (\n <div className=\"flex items-center justify-between gap-4\">\n <p className=\"text-sm text-muted-foreground\">{emptyMessage}</p>\n <Button type=\"button\" onClick={handleSubmit} disabled={isSubmitting}>\n {isSubmitting ? submittingLabel : submitLabel}\n </Button>\n </div>\n )}\n\n {error && (\n <div className=\"rounded-md border border-destructive/40 bg-destructive/5 p-3 text-sm text-destructive\">\n {error}\n </div>\n )}\n </form>\n );\n}\n\ntype ParameterGridProps = {\n filters: FilterBarFilter[];\n timeRange?: FilterBarRangeProps | undefined;\n autoSubmit: boolean;\n isSubmitting: boolean;\n submitLabel: string;\n submittingLabel: string;\n className?: string | undefined;\n};\n\nfunction ParameterGrid({\n filters,\n timeRange,\n autoSubmit,\n isSubmitting,\n submitLabel,\n submittingLabel,\n className,\n}: ParameterGridProps) {\n return (\n <div className={cn(\"space-y-3\", className)}>\n <div className=\"divide-y divide-border border-y border-border\">\n {filters.map((filter) => (\n <ParameterRow key={filter.key} filter={filter} />\n ))}\n {timeRange && <TimeRangeRow timeRange={timeRange} />}\n </div>\n\n {!autoSubmit && (\n <div className=\"flex justify-end\">\n <Button type=\"submit\" disabled={isSubmitting}>\n {isSubmitting ? submittingLabel : submitLabel}\n </Button>\n </div>\n )}\n </div>\n );\n}\n\nfunction ParameterRow({ filter }: { filter: FilterBarFilter }) {\n const id = `clicky-param-${filter.key.replace(/[^a-zA-Z0-9_-]/g, \"-\")}`;\n\n return (\n <div\n title={filter.description}\n className={cn(\n \"grid grid-cols-1 gap-2 py-2 sm:grid-cols-[minmax(8rem,14rem)_minmax(0,1fr)] sm:items-center\",\n filter.disabled && \"opacity-60\",\n )}\n >\n <label htmlFor={id} className=\"text-sm font-medium text-muted-foreground\">\n {filter.label}\n </label>\n <div className=\"min-w-0\">{renderParameterInput(filter, id)}</div>\n </div>\n );\n}\n\nfunction renderParameterInput(filter: FilterBarFilter, id: string) {\n if (filter.kind === \"enum\") {\n return (\n <select\n id={id}\n aria-label={filter.label}\n className={inputClassName}\n value={filter.value}\n disabled={filter.disabled}\n onChange={(event) => filter.onChange(event.target.value)}\n >\n <option value=\"\">{filter.placeholder ?? `Any ${filter.label.toLowerCase()}`}</option>\n {filter.options.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label ?? option.value}\n </option>\n ))}\n </select>\n );\n }\n\n if (filter.kind === \"boolean\") {\n return (\n <div className=\"flex h-8 items-center\">\n <input\n id={id}\n type=\"checkbox\"\n aria-label={filter.label}\n className=\"h-4 w-4 accent-primary disabled:cursor-not-allowed\"\n checked={filter.value}\n disabled={filter.disabled}\n onChange={(event) => filter.onChange(event.target.checked)}\n />\n </div>\n );\n }\n\n if (filter.kind === \"lookup\") {\n const listId = `${id}-options`;\n return (\n <>\n <input\n id={id}\n type={filter.inputType === \"number\" ? \"number\" : \"text\"}\n aria-label={filter.label}\n className={inputClassName}\n placeholder={filter.placeholder ?? \"Value\"}\n value={filter.value}\n list={listId}\n disabled={filter.disabled}\n onChange={(event) => filter.onChange(event.target.value)}\n />\n <datalist id={listId}>\n {filter.options.map((option) => (\n <option\n key={option.value}\n value={option.value}\n label={option.label ?? option.value}\n disabled={option.disabled}\n />\n ))}\n </datalist>\n </>\n );\n }\n\n if (filter.kind === \"lookup-multi\") {\n const listId = `${id}-options`;\n return (\n <>\n <input\n id={id}\n type=\"text\"\n aria-label={filter.label}\n className={inputClassName}\n placeholder={filter.placeholder ?? \"value-1, value-2\"}\n value={filter.value.join(\", \")}\n list={listId}\n disabled={filter.disabled}\n onChange={(event) => filter.onChange(splitCommaValues(event.target.value))}\n />\n <datalist id={listId}>\n {filter.options.map((option) => (\n <option\n key={option.value}\n value={option.value}\n label={option.label ?? option.value}\n disabled={option.disabled}\n />\n ))}\n </datalist>\n </>\n );\n }\n\n if (filter.kind === \"multi\") {\n return <MultiParameterInput filter={filter} id={id} />;\n }\n\n if (filter.kind === \"text\") {\n return (\n <input\n id={id}\n type=\"text\"\n aria-label={filter.label}\n className={inputClassName}\n placeholder={filter.placeholder ?? \"Value\"}\n value={filter.value}\n disabled={filter.disabled}\n onChange={(event) => filter.onChange(event.target.value)}\n />\n );\n }\n\n return (\n <input\n id={id}\n type=\"text\"\n aria-label={filter.label}\n className={inputClassName}\n value={JSON.stringify(filter.value)}\n disabled\n readOnly\n />\n );\n}\n\nfunction MultiParameterInput({ filter, id }: { filter: FilterBarMultiFilter; id: string }) {\n const [query, setQuery] = useState(\"\");\n const showOptionFilter = filter.options.length > 7;\n const visibleOptions = useMemo(() => {\n const normalized = query.trim().toLowerCase();\n if (!normalized) return filter.options;\n return filter.options.filter((option) =>\n multiOptionText(option).toLowerCase().includes(normalized),\n );\n }, [filter.options, query]);\n\n const setMode = (value: string, mode: FilterMode) => {\n if (filter.disabled) return;\n const next = { ...filter.value };\n if (mode === \"include\" || mode === \"exclude\") {\n next[value] = mode;\n } else {\n delete next[value];\n }\n filter.onChange(next);\n };\n\n return (\n <div\n id={id}\n role=\"group\"\n aria-label={filter.label}\n className=\"rounded-md border border-input bg-background p-2\"\n >\n {showOptionFilter && (\n <label className=\"mb-2 flex items-center gap-2 rounded-md border border-input bg-background px-2\">\n <Icon icon={UiSearch} className=\"shrink-0 text-muted-foreground\" />\n <input\n type=\"search\"\n aria-label={`Filter ${filter.label} options`}\n className=\"h-8 min-w-0 flex-1 bg-transparent text-sm outline-none placeholder:text-muted-foreground\"\n placeholder={`Filter ${filter.label.toLowerCase()}`}\n value={query}\n disabled={filter.disabled}\n onChange={(event) => setQuery(event.target.value)}\n />\n </label>\n )}\n\n <div className=\"max-h-56 space-y-1 overflow-auto\">\n {visibleOptions.map((option) => {\n const mode: FilterMode = filter.value[option.value] ?? \"neutral\";\n return (\n <FilterPill\n key={option.value}\n className=\"w-full justify-between\"\n label={option.label}\n mode={mode}\n title={option.title ?? multiOptionText(option)}\n togglePosition=\"right\"\n onModeChange={(next) => setMode(option.value, next)}\n />\n );\n })}\n {visibleOptions.length === 0 && (\n <div className=\"px-2 py-3 text-sm text-muted-foreground\">No options found</div>\n )}\n </div>\n </div>\n );\n}\n\nfunction multiOptionText(option: FilterBarMultiFilter[\"options\"][number]) {\n const label = typeof option.label === \"string\" ? option.label : \"\";\n return [option.value, label, option.title ?? \"\"].filter(Boolean).join(\" \");\n}\n\n// TimeRangeRow renders the paired from/to parameters as the native TimeRange\n// popover picker (relative-time presets + a date picker) rather than two bare\n// text inputs, matching how FilterBar renders its own range control.\nfunction TimeRangeRow({ timeRange }: { timeRange: FilterBarRangeProps }) {\n return (\n <div className=\"grid grid-cols-1 gap-2 py-2 sm:grid-cols-[minmax(8rem,14rem)_minmax(0,1fr)] sm:items-center\">\n <div className=\"text-sm font-medium text-muted-foreground\">Time range</div>\n <div className=\"min-w-0\">\n <TimeRange\n kind={timeRange.timeEnabled ? \"time\" : \"date\"}\n label=\"Time range\"\n align=\"left\"\n from={timeRange.from ?? \"\"}\n to={timeRange.to ?? \"\"}\n onApply={timeRange.onApply}\n {...(timeRange.presets ? { presets: timeRange.presets } : {})}\n {...(timeRange.timeEnabled !== undefined ? { timeEnabled: timeRange.timeEnabled } : {})}\n {...(timeRange.timeZone ? { timeZone: timeRange.timeZone } : {})}\n {...(timeRange.timeZones ? { timeZones: timeRange.timeZones } : {})}\n {...(timeRange.fromPlaceholder ? { fromPlaceholder: timeRange.fromPlaceholder } : {})}\n {...(timeRange.toPlaceholder ? { toPlaceholder: timeRange.toPlaceholder } : {})}\n />\n </div>\n </div>\n );\n}\n\nfunction splitCommaValues(value: string) {\n return value\n .split(\",\")\n .map((item) => item.trim())\n .filter(Boolean);\n}\n\nconst inputClassName =\n \"h-8 w-full min-w-0 rounded-md border border-input bg-background px-2 text-sm text-foreground outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:bg-muted/40 focus-visible:ring-2 focus-visible:ring-ring\";\n"],"names":["useMemo","useState","buildInitialParameterValues","useDebouncedRecord","useRef","useQuery","packParameterValues","parametersToFormConfig","titleCase","pruneParameterValues","useEffect","jsxs","jsx","Button","cn","Fragment","Icon","UiSearch","FilterPill","TimeRange"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"FilterForm.cjs","sources":["../../src/rpc/FilterForm.tsx"],"sourcesContent":["import { useEffect, useMemo, useRef, useState, type FormEvent } from \"react\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { Button } from \"../components/button\";\nimport type {\n FilterBarFilter,\n FilterBarMultiFilter,\n FilterBarRangeProps,\n} from \"../components/FilterBar\";\nimport { TimeRange } from \"../components/TimeRange\";\nimport { FilterPill, type FilterMode } from \"../data/FilterPill\";\nimport { Icon } from \"../data/Icon\";\nimport { UiSearch } from \"../icons\";\nimport { cn } from \"../lib/utils\";\nimport {\n packParameterValues,\n parametersToFormConfig,\n pruneParameterValues,\n buildInitialParameterValues,\n titleCase,\n useDebouncedRecord,\n type ParameterValues,\n} from \"./formMetadata\";\nimport type { OpenAPIParameter } from \"./types\";\nimport type { OperationsApiClient } from \"./useOperations\";\n\nexport type FilterFormProps = {\n client: OperationsApiClient;\n path: string;\n method: string;\n parameters?: OpenAPIParameter[];\n initialValues?: ParameterValues | undefined;\n lockedValues?: ParameterValues | undefined;\n hideLocked?: boolean | undefined;\n enableLookup?: boolean | undefined;\n autoSubmit?: boolean | undefined;\n submitLabel?: string | undefined;\n submittingLabel?: string | undefined;\n emptyMessage?: string | undefined;\n isSubmitting?: boolean | undefined;\n className?: string | undefined;\n onSubmit: (values: ParameterValues) => void | Promise<void>;\n};\n\nexport function FilterForm({\n client,\n path,\n method,\n parameters = [],\n initialValues = {},\n lockedValues = {},\n hideLocked = false,\n enableLookup = method.toUpperCase() === \"GET\",\n autoSubmit = false,\n submitLabel = \"Execute request\",\n submittingLabel = \"Executing…\",\n emptyMessage = \"This operation does not require input.\",\n isSubmitting = false,\n className,\n onSubmit,\n}: FilterFormProps) {\n const resetKey = useMemo(\n () => `${method}:${path}:${JSON.stringify(initialValues)}:${JSON.stringify(lockedValues)}`,\n [initialValues, lockedValues, method, path],\n );\n const [values, setValues] = useState<ParameterValues>(() =>\n buildInitialParameterValues(parameters, method, lockedValues, initialValues),\n );\n const [error, setError] = useState(\"\");\n const debouncedValues = useDebouncedRecord(values, 250);\n const lastAutoSubmitted = useRef<string | null>(null);\n\n const lookupQuery = useQuery({\n queryKey: [\"filter-form-lookup\", method, path, debouncedValues],\n queryFn: async () =>\n (await client.lookupFilters?.(\n path,\n method,\n packParameterValues(debouncedValues, parameters),\n { Accept: \"application/json+clicky\" },\n )) ?? { filters: {} },\n enabled:\n enableLookup && !!client.lookupFilters && parameters.some((param) => param.in === \"query\"),\n staleTime: 30_000,\n retry: 0,\n });\n\n const formConfig = useMemo(\n () =>\n parametersToFormConfig(parameters, values, setValues, {\n lookup: lookupQuery.data,\n lockedValues,\n hideLocked,\n }),\n [hideLocked, lockedValues, lookupQuery.data, parameters, values],\n );\n\n const hasFields = formConfig.filters.length > 0 || formConfig.timeRange != null;\n\n async function handleSubmit(event?: FormEvent) {\n event?.preventDefault();\n\n const missingRequired = parameters.filter((param) => {\n if (!param.required) return false;\n const value = lockedValues[param.name] ?? values[param.name] ?? \"\";\n return value.trim() === \"\";\n });\n\n if (missingRequired.length > 0) {\n setError(\n `Missing required fields: ${missingRequired.map((param) => titleCase(param.name)).join(\", \")}`,\n );\n return;\n }\n\n setError(\"\");\n await onSubmit(pruneParameterValues(values));\n }\n\n useEffect(() => {\n setValues(buildInitialParameterValues(parameters, method, lockedValues, initialValues));\n setError(\"\");\n lastAutoSubmitted.current = null;\n }, [resetKey]);\n\n useEffect(() => {\n if (!autoSubmit) {\n return;\n }\n\n const missingRequired = parameters.filter((param) => {\n if (!param.required) return false;\n const value = lockedValues[param.name] ?? debouncedValues[param.name] ?? \"\";\n return value.trim() === \"\";\n });\n if (missingRequired.length > 0) {\n return;\n }\n\n const submittedValues = pruneParameterValues(debouncedValues);\n const signature = JSON.stringify(submittedValues);\n if (lastAutoSubmitted.current === signature) {\n return;\n }\n\n lastAutoSubmitted.current = signature;\n setError(\"\");\n void onSubmit(submittedValues);\n }, [autoSubmit, debouncedValues, lockedValues, onSubmit, parameters]);\n\n return (\n <form className=\"space-y-3\" onSubmit={handleSubmit}>\n {hasFields ? (\n <ParameterGrid\n autoSubmit={autoSubmit}\n filters={formConfig.filters}\n isSubmitting={isSubmitting}\n submitLabel={submitLabel}\n submittingLabel={submittingLabel}\n {...(formConfig.timeRange ? { timeRange: formConfig.timeRange } : {})}\n {...(className ? { className } : {})}\n />\n ) : (\n <div className=\"flex items-center justify-between gap-4\">\n <p className=\"text-sm text-muted-foreground\">{emptyMessage}</p>\n <Button type=\"button\" onClick={handleSubmit} disabled={isSubmitting}>\n {isSubmitting ? submittingLabel : submitLabel}\n </Button>\n </div>\n )}\n\n {error && (\n <div className=\"rounded-md border border-destructive/40 bg-destructive/5 p-3 text-sm text-destructive\">\n {error}\n </div>\n )}\n </form>\n );\n}\n\ntype ParameterGridProps = {\n filters: FilterBarFilter[];\n timeRange?: FilterBarRangeProps | undefined;\n autoSubmit: boolean;\n isSubmitting: boolean;\n submitLabel: string;\n submittingLabel: string;\n className?: string | undefined;\n};\n\nfunction ParameterGrid({\n filters,\n timeRange,\n autoSubmit,\n isSubmitting,\n submitLabel,\n submittingLabel,\n className,\n}: ParameterGridProps) {\n return (\n <div className={cn(\"space-y-3\", className)}>\n <div className=\"divide-y divide-border border-y border-border\">\n {filters.map((filter) => (\n <ParameterRow key={filter.key} filter={filter} />\n ))}\n {timeRange && <TimeRangeRow timeRange={timeRange} />}\n </div>\n\n {!autoSubmit && (\n <div className=\"flex justify-end\">\n <Button type=\"submit\" disabled={isSubmitting}>\n {isSubmitting ? submittingLabel : submitLabel}\n </Button>\n </div>\n )}\n </div>\n );\n}\n\nfunction ParameterRow({ filter }: { filter: FilterBarFilter }) {\n const id = `clicky-param-${filter.key.replace(/[^a-zA-Z0-9_-]/g, \"-\")}`;\n\n return (\n <div\n title={filter.description}\n className={cn(\n \"grid grid-cols-1 gap-2 py-2 sm:grid-cols-[minmax(8rem,14rem)_minmax(0,1fr)] sm:items-center\",\n filter.disabled && \"opacity-60\",\n )}\n >\n <label htmlFor={id} className=\"text-sm font-medium text-muted-foreground\">\n {filter.label}\n </label>\n <div className=\"min-w-0\">{renderParameterInput(filter, id)}</div>\n </div>\n );\n}\n\nfunction renderParameterInput(filter: FilterBarFilter, id: string) {\n if (filter.kind === \"enum\") {\n return (\n <select\n id={id}\n aria-label={filter.label}\n className={inputClassName}\n value={filter.value}\n disabled={filter.disabled}\n onChange={(event) => filter.onChange(event.target.value)}\n >\n <option value=\"\">{filter.placeholder ?? \"\"}</option>\n {filter.options.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label ?? option.value}\n </option>\n ))}\n </select>\n );\n }\n\n if (filter.kind === \"boolean\") {\n return (\n <div className=\"flex h-8 items-center\">\n <input\n id={id}\n type=\"checkbox\"\n aria-label={filter.label}\n className=\"h-4 w-4 accent-primary disabled:cursor-not-allowed\"\n checked={filter.value}\n disabled={filter.disabled}\n onChange={(event) => filter.onChange(event.target.checked)}\n />\n </div>\n );\n }\n\n if (filter.kind === \"lookup\") {\n const listId = `${id}-options`;\n return (\n <>\n <input\n id={id}\n type={filter.inputType === \"number\" ? \"number\" : \"text\"}\n aria-label={filter.label}\n className={inputClassName}\n {...(filter.placeholder !== undefined ? { placeholder: filter.placeholder } : {})}\n value={filter.value}\n list={listId}\n disabled={filter.disabled}\n onChange={(event) => filter.onChange(event.target.value)}\n />\n <datalist id={listId}>\n {filter.options.map((option) => (\n <option\n key={option.value}\n value={option.value}\n label={option.label ?? option.value}\n disabled={option.disabled}\n />\n ))}\n </datalist>\n </>\n );\n }\n\n if (filter.kind === \"lookup-multi\") {\n const listId = `${id}-options`;\n return (\n <>\n <input\n id={id}\n type=\"text\"\n aria-label={filter.label}\n className={inputClassName}\n {...(filter.placeholder !== undefined ? { placeholder: filter.placeholder } : {})}\n value={filter.value.join(\", \")}\n list={listId}\n disabled={filter.disabled}\n onChange={(event) => filter.onChange(splitCommaValues(event.target.value))}\n />\n <datalist id={listId}>\n {filter.options.map((option) => (\n <option\n key={option.value}\n value={option.value}\n label={option.label ?? option.value}\n disabled={option.disabled}\n />\n ))}\n </datalist>\n </>\n );\n }\n\n if (filter.kind === \"multi\") {\n return <MultiParameterInput filter={filter} id={id} />;\n }\n\n if (filter.kind === \"text\") {\n return (\n <input\n id={id}\n type=\"text\"\n aria-label={filter.label}\n className={inputClassName}\n {...(filter.placeholder !== undefined ? { placeholder: filter.placeholder } : {})}\n value={filter.value}\n disabled={filter.disabled}\n onChange={(event) => filter.onChange(event.target.value)}\n />\n );\n }\n\n return (\n <input\n id={id}\n type=\"text\"\n aria-label={filter.label}\n className={inputClassName}\n value={JSON.stringify(filter.value)}\n disabled\n readOnly\n />\n );\n}\n\nfunction MultiParameterInput({ filter, id }: { filter: FilterBarMultiFilter; id: string }) {\n const [query, setQuery] = useState(\"\");\n const showOptionFilter = filter.options.length > 7;\n const visibleOptions = useMemo(() => {\n const normalized = query.trim().toLowerCase();\n if (!normalized) return filter.options;\n return filter.options.filter((option) =>\n multiOptionText(option).toLowerCase().includes(normalized),\n );\n }, [filter.options, query]);\n\n const setMode = (value: string, mode: FilterMode) => {\n if (filter.disabled) return;\n const next = { ...filter.value };\n if (mode === \"include\" || mode === \"exclude\") {\n next[value] = mode;\n } else {\n delete next[value];\n }\n filter.onChange(next);\n };\n\n return (\n <div\n id={id}\n role=\"group\"\n aria-label={filter.label}\n className=\"rounded-md border border-input bg-background p-2\"\n >\n {showOptionFilter && (\n <label className=\"mb-2 flex items-center gap-2 rounded-md border border-input bg-background px-2\">\n <Icon icon={UiSearch} className=\"shrink-0 text-muted-foreground\" />\n <input\n type=\"search\"\n aria-label={`Filter ${filter.label} options`}\n className=\"h-8 min-w-0 flex-1 bg-transparent text-sm outline-none placeholder:text-muted-foreground\"\n placeholder={`Filter ${filter.label.toLowerCase()}`}\n value={query}\n disabled={filter.disabled}\n onChange={(event) => setQuery(event.target.value)}\n />\n </label>\n )}\n\n <div className=\"max-h-56 space-y-1 overflow-auto\">\n {visibleOptions.map((option) => {\n const mode: FilterMode = filter.value[option.value] ?? \"neutral\";\n return (\n <FilterPill\n key={option.value}\n className=\"w-full justify-between\"\n label={option.label}\n mode={mode}\n title={option.title ?? multiOptionText(option)}\n togglePosition=\"right\"\n onModeChange={(next) => setMode(option.value, next)}\n />\n );\n })}\n {visibleOptions.length === 0 && (\n <div className=\"px-2 py-3 text-sm text-muted-foreground\">No options found</div>\n )}\n </div>\n </div>\n );\n}\n\nfunction multiOptionText(option: FilterBarMultiFilter[\"options\"][number]) {\n const label = typeof option.label === \"string\" ? option.label : \"\";\n return [option.value, label, option.title ?? \"\"].filter(Boolean).join(\" \");\n}\n\n// TimeRangeRow renders the paired from/to parameters as the native TimeRange\n// popover picker (relative-time presets + a date picker) rather than two bare\n// text inputs, matching how FilterBar renders its own range control.\nfunction TimeRangeRow({ timeRange }: { timeRange: FilterBarRangeProps }) {\n return (\n <div className=\"grid grid-cols-1 gap-2 py-2 sm:grid-cols-[minmax(8rem,14rem)_minmax(0,1fr)] sm:items-center\">\n <div className=\"text-sm font-medium text-muted-foreground\">Time range</div>\n <div className=\"min-w-0\">\n <TimeRange\n kind={timeRange.timeEnabled ? \"time\" : \"date\"}\n label=\"Time range\"\n align=\"left\"\n from={timeRange.from ?? \"\"}\n to={timeRange.to ?? \"\"}\n onApply={timeRange.onApply}\n {...(timeRange.presets ? { presets: timeRange.presets } : {})}\n {...(timeRange.timeEnabled !== undefined ? { timeEnabled: timeRange.timeEnabled } : {})}\n {...(timeRange.timeZone ? { timeZone: timeRange.timeZone } : {})}\n {...(timeRange.timeZones ? { timeZones: timeRange.timeZones } : {})}\n {...(timeRange.fromPlaceholder ? { fromPlaceholder: timeRange.fromPlaceholder } : {})}\n {...(timeRange.toPlaceholder ? { toPlaceholder: timeRange.toPlaceholder } : {})}\n />\n </div>\n </div>\n );\n}\n\nfunction splitCommaValues(value: string) {\n return value\n .split(\",\")\n .map((item) => item.trim())\n .filter(Boolean);\n}\n\nconst inputClassName =\n \"h-8 w-full min-w-0 rounded-md border border-input bg-background px-2 text-sm text-foreground outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:bg-muted/40 focus-visible:ring-2 focus-visible:ring-ring\";\n"],"names":["useMemo","useState","buildInitialParameterValues","useDebouncedRecord","useRef","useQuery","packParameterValues","parametersToFormConfig","titleCase","pruneParameterValues","useEffect","jsxs","jsx","Button","cn","Fragment","Icon","UiSearch","FilterPill","TimeRange"],"mappings":"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"}
|
package/dist/rpc/FilterForm.js
CHANGED
|
@@ -167,7 +167,7 @@ function renderParameterInput(filter, id) {
|
|
|
167
167
|
disabled: filter.disabled,
|
|
168
168
|
onChange: (event) => filter.onChange(event.target.value),
|
|
169
169
|
children: [
|
|
170
|
-
/* @__PURE__ */ jsx("option", { value: "", children: filter.placeholder ??
|
|
170
|
+
/* @__PURE__ */ jsx("option", { value: "", children: filter.placeholder ?? "" }),
|
|
171
171
|
filter.options.map((option) => /* @__PURE__ */ jsx("option", { value: option.value, children: option.label ?? option.value }, option.value))
|
|
172
172
|
]
|
|
173
173
|
}
|
|
@@ -197,7 +197,7 @@ function renderParameterInput(filter, id) {
|
|
|
197
197
|
type: filter.inputType === "number" ? "number" : "text",
|
|
198
198
|
"aria-label": filter.label,
|
|
199
199
|
className: inputClassName,
|
|
200
|
-
placeholder: filter.placeholder
|
|
200
|
+
...filter.placeholder !== void 0 ? { placeholder: filter.placeholder } : {},
|
|
201
201
|
value: filter.value,
|
|
202
202
|
list: listId,
|
|
203
203
|
disabled: filter.disabled,
|
|
@@ -225,7 +225,7 @@ function renderParameterInput(filter, id) {
|
|
|
225
225
|
type: "text",
|
|
226
226
|
"aria-label": filter.label,
|
|
227
227
|
className: inputClassName,
|
|
228
|
-
placeholder: filter.placeholder
|
|
228
|
+
...filter.placeholder !== void 0 ? { placeholder: filter.placeholder } : {},
|
|
229
229
|
value: filter.value.join(", "),
|
|
230
230
|
list: listId,
|
|
231
231
|
disabled: filter.disabled,
|
|
@@ -254,7 +254,7 @@ function renderParameterInput(filter, id) {
|
|
|
254
254
|
type: "text",
|
|
255
255
|
"aria-label": filter.label,
|
|
256
256
|
className: inputClassName,
|
|
257
|
-
placeholder: filter.placeholder
|
|
257
|
+
...filter.placeholder !== void 0 ? { placeholder: filter.placeholder } : {},
|
|
258
258
|
value: filter.value,
|
|
259
259
|
disabled: filter.disabled,
|
|
260
260
|
onChange: (event) => filter.onChange(event.target.value)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FilterForm.js","sources":["../../src/rpc/FilterForm.tsx"],"sourcesContent":["import { useEffect, useMemo, useRef, useState, type FormEvent } from \"react\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { Button } from \"../components/button\";\nimport type {\n FilterBarFilter,\n FilterBarMultiFilter,\n FilterBarRangeProps,\n} from \"../components/FilterBar\";\nimport { TimeRange } from \"../components/TimeRange\";\nimport { FilterPill, type FilterMode } from \"../data/FilterPill\";\nimport { Icon } from \"../data/Icon\";\nimport { UiSearch } from \"../icons\";\nimport { cn } from \"../lib/utils\";\nimport {\n packParameterValues,\n parametersToFormConfig,\n pruneParameterValues,\n buildInitialParameterValues,\n titleCase,\n useDebouncedRecord,\n type ParameterValues,\n} from \"./formMetadata\";\nimport type { OpenAPIParameter } from \"./types\";\nimport type { OperationsApiClient } from \"./useOperations\";\n\nexport type FilterFormProps = {\n client: OperationsApiClient;\n path: string;\n method: string;\n parameters?: OpenAPIParameter[];\n initialValues?: ParameterValues | undefined;\n lockedValues?: ParameterValues | undefined;\n hideLocked?: boolean | undefined;\n enableLookup?: boolean | undefined;\n autoSubmit?: boolean | undefined;\n submitLabel?: string | undefined;\n submittingLabel?: string | undefined;\n emptyMessage?: string | undefined;\n isSubmitting?: boolean | undefined;\n className?: string | undefined;\n onSubmit: (values: ParameterValues) => void | Promise<void>;\n};\n\nexport function FilterForm({\n client,\n path,\n method,\n parameters = [],\n initialValues = {},\n lockedValues = {},\n hideLocked = false,\n enableLookup = method.toUpperCase() === \"GET\",\n autoSubmit = false,\n submitLabel = \"Execute request\",\n submittingLabel = \"Executing…\",\n emptyMessage = \"This operation does not require input.\",\n isSubmitting = false,\n className,\n onSubmit,\n}: FilterFormProps) {\n const resetKey = useMemo(\n () => `${method}:${path}:${JSON.stringify(initialValues)}:${JSON.stringify(lockedValues)}`,\n [initialValues, lockedValues, method, path],\n );\n const [values, setValues] = useState<ParameterValues>(() =>\n buildInitialParameterValues(parameters, method, lockedValues, initialValues),\n );\n const [error, setError] = useState(\"\");\n const debouncedValues = useDebouncedRecord(values, 250);\n const lastAutoSubmitted = useRef<string | null>(null);\n\n const lookupQuery = useQuery({\n queryKey: [\"filter-form-lookup\", method, path, debouncedValues],\n queryFn: async () =>\n (await client.lookupFilters?.(\n path,\n method,\n packParameterValues(debouncedValues, parameters),\n { Accept: \"application/json+clicky\" },\n )) ?? { filters: {} },\n enabled:\n enableLookup && !!client.lookupFilters && parameters.some((param) => param.in === \"query\"),\n staleTime: 30_000,\n retry: 0,\n });\n\n const formConfig = useMemo(\n () =>\n parametersToFormConfig(parameters, values, setValues, {\n lookup: lookupQuery.data,\n lockedValues,\n hideLocked,\n }),\n [hideLocked, lockedValues, lookupQuery.data, parameters, values],\n );\n\n const hasFields = formConfig.filters.length > 0 || formConfig.timeRange != null;\n\n async function handleSubmit(event?: FormEvent) {\n event?.preventDefault();\n\n const missingRequired = parameters.filter((param) => {\n if (!param.required) return false;\n const value = lockedValues[param.name] ?? values[param.name] ?? \"\";\n return value.trim() === \"\";\n });\n\n if (missingRequired.length > 0) {\n setError(\n `Missing required fields: ${missingRequired.map((param) => titleCase(param.name)).join(\", \")}`,\n );\n return;\n }\n\n setError(\"\");\n await onSubmit(pruneParameterValues(values));\n }\n\n useEffect(() => {\n setValues(buildInitialParameterValues(parameters, method, lockedValues, initialValues));\n setError(\"\");\n lastAutoSubmitted.current = null;\n }, [resetKey]);\n\n useEffect(() => {\n if (!autoSubmit) {\n return;\n }\n\n const missingRequired = parameters.filter((param) => {\n if (!param.required) return false;\n const value = lockedValues[param.name] ?? debouncedValues[param.name] ?? \"\";\n return value.trim() === \"\";\n });\n if (missingRequired.length > 0) {\n return;\n }\n\n const submittedValues = pruneParameterValues(debouncedValues);\n const signature = JSON.stringify(submittedValues);\n if (lastAutoSubmitted.current === signature) {\n return;\n }\n\n lastAutoSubmitted.current = signature;\n setError(\"\");\n void onSubmit(submittedValues);\n }, [autoSubmit, debouncedValues, lockedValues, onSubmit, parameters]);\n\n return (\n <form className=\"space-y-3\" onSubmit={handleSubmit}>\n {hasFields ? (\n <ParameterGrid\n autoSubmit={autoSubmit}\n filters={formConfig.filters}\n isSubmitting={isSubmitting}\n submitLabel={submitLabel}\n submittingLabel={submittingLabel}\n {...(formConfig.timeRange ? { timeRange: formConfig.timeRange } : {})}\n {...(className ? { className } : {})}\n />\n ) : (\n <div className=\"flex items-center justify-between gap-4\">\n <p className=\"text-sm text-muted-foreground\">{emptyMessage}</p>\n <Button type=\"button\" onClick={handleSubmit} disabled={isSubmitting}>\n {isSubmitting ? submittingLabel : submitLabel}\n </Button>\n </div>\n )}\n\n {error && (\n <div className=\"rounded-md border border-destructive/40 bg-destructive/5 p-3 text-sm text-destructive\">\n {error}\n </div>\n )}\n </form>\n );\n}\n\ntype ParameterGridProps = {\n filters: FilterBarFilter[];\n timeRange?: FilterBarRangeProps | undefined;\n autoSubmit: boolean;\n isSubmitting: boolean;\n submitLabel: string;\n submittingLabel: string;\n className?: string | undefined;\n};\n\nfunction ParameterGrid({\n filters,\n timeRange,\n autoSubmit,\n isSubmitting,\n submitLabel,\n submittingLabel,\n className,\n}: ParameterGridProps) {\n return (\n <div className={cn(\"space-y-3\", className)}>\n <div className=\"divide-y divide-border border-y border-border\">\n {filters.map((filter) => (\n <ParameterRow key={filter.key} filter={filter} />\n ))}\n {timeRange && <TimeRangeRow timeRange={timeRange} />}\n </div>\n\n {!autoSubmit && (\n <div className=\"flex justify-end\">\n <Button type=\"submit\" disabled={isSubmitting}>\n {isSubmitting ? submittingLabel : submitLabel}\n </Button>\n </div>\n )}\n </div>\n );\n}\n\nfunction ParameterRow({ filter }: { filter: FilterBarFilter }) {\n const id = `clicky-param-${filter.key.replace(/[^a-zA-Z0-9_-]/g, \"-\")}`;\n\n return (\n <div\n title={filter.description}\n className={cn(\n \"grid grid-cols-1 gap-2 py-2 sm:grid-cols-[minmax(8rem,14rem)_minmax(0,1fr)] sm:items-center\",\n filter.disabled && \"opacity-60\",\n )}\n >\n <label htmlFor={id} className=\"text-sm font-medium text-muted-foreground\">\n {filter.label}\n </label>\n <div className=\"min-w-0\">{renderParameterInput(filter, id)}</div>\n </div>\n );\n}\n\nfunction renderParameterInput(filter: FilterBarFilter, id: string) {\n if (filter.kind === \"enum\") {\n return (\n <select\n id={id}\n aria-label={filter.label}\n className={inputClassName}\n value={filter.value}\n disabled={filter.disabled}\n onChange={(event) => filter.onChange(event.target.value)}\n >\n <option value=\"\">{filter.placeholder ?? `Any ${filter.label.toLowerCase()}`}</option>\n {filter.options.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label ?? option.value}\n </option>\n ))}\n </select>\n );\n }\n\n if (filter.kind === \"boolean\") {\n return (\n <div className=\"flex h-8 items-center\">\n <input\n id={id}\n type=\"checkbox\"\n aria-label={filter.label}\n className=\"h-4 w-4 accent-primary disabled:cursor-not-allowed\"\n checked={filter.value}\n disabled={filter.disabled}\n onChange={(event) => filter.onChange(event.target.checked)}\n />\n </div>\n );\n }\n\n if (filter.kind === \"lookup\") {\n const listId = `${id}-options`;\n return (\n <>\n <input\n id={id}\n type={filter.inputType === \"number\" ? \"number\" : \"text\"}\n aria-label={filter.label}\n className={inputClassName}\n placeholder={filter.placeholder ?? \"Value\"}\n value={filter.value}\n list={listId}\n disabled={filter.disabled}\n onChange={(event) => filter.onChange(event.target.value)}\n />\n <datalist id={listId}>\n {filter.options.map((option) => (\n <option\n key={option.value}\n value={option.value}\n label={option.label ?? option.value}\n disabled={option.disabled}\n />\n ))}\n </datalist>\n </>\n );\n }\n\n if (filter.kind === \"lookup-multi\") {\n const listId = `${id}-options`;\n return (\n <>\n <input\n id={id}\n type=\"text\"\n aria-label={filter.label}\n className={inputClassName}\n placeholder={filter.placeholder ?? \"value-1, value-2\"}\n value={filter.value.join(\", \")}\n list={listId}\n disabled={filter.disabled}\n onChange={(event) => filter.onChange(splitCommaValues(event.target.value))}\n />\n <datalist id={listId}>\n {filter.options.map((option) => (\n <option\n key={option.value}\n value={option.value}\n label={option.label ?? option.value}\n disabled={option.disabled}\n />\n ))}\n </datalist>\n </>\n );\n }\n\n if (filter.kind === \"multi\") {\n return <MultiParameterInput filter={filter} id={id} />;\n }\n\n if (filter.kind === \"text\") {\n return (\n <input\n id={id}\n type=\"text\"\n aria-label={filter.label}\n className={inputClassName}\n placeholder={filter.placeholder ?? \"Value\"}\n value={filter.value}\n disabled={filter.disabled}\n onChange={(event) => filter.onChange(event.target.value)}\n />\n );\n }\n\n return (\n <input\n id={id}\n type=\"text\"\n aria-label={filter.label}\n className={inputClassName}\n value={JSON.stringify(filter.value)}\n disabled\n readOnly\n />\n );\n}\n\nfunction MultiParameterInput({ filter, id }: { filter: FilterBarMultiFilter; id: string }) {\n const [query, setQuery] = useState(\"\");\n const showOptionFilter = filter.options.length > 7;\n const visibleOptions = useMemo(() => {\n const normalized = query.trim().toLowerCase();\n if (!normalized) return filter.options;\n return filter.options.filter((option) =>\n multiOptionText(option).toLowerCase().includes(normalized),\n );\n }, [filter.options, query]);\n\n const setMode = (value: string, mode: FilterMode) => {\n if (filter.disabled) return;\n const next = { ...filter.value };\n if (mode === \"include\" || mode === \"exclude\") {\n next[value] = mode;\n } else {\n delete next[value];\n }\n filter.onChange(next);\n };\n\n return (\n <div\n id={id}\n role=\"group\"\n aria-label={filter.label}\n className=\"rounded-md border border-input bg-background p-2\"\n >\n {showOptionFilter && (\n <label className=\"mb-2 flex items-center gap-2 rounded-md border border-input bg-background px-2\">\n <Icon icon={UiSearch} className=\"shrink-0 text-muted-foreground\" />\n <input\n type=\"search\"\n aria-label={`Filter ${filter.label} options`}\n className=\"h-8 min-w-0 flex-1 bg-transparent text-sm outline-none placeholder:text-muted-foreground\"\n placeholder={`Filter ${filter.label.toLowerCase()}`}\n value={query}\n disabled={filter.disabled}\n onChange={(event) => setQuery(event.target.value)}\n />\n </label>\n )}\n\n <div className=\"max-h-56 space-y-1 overflow-auto\">\n {visibleOptions.map((option) => {\n const mode: FilterMode = filter.value[option.value] ?? \"neutral\";\n return (\n <FilterPill\n key={option.value}\n className=\"w-full justify-between\"\n label={option.label}\n mode={mode}\n title={option.title ?? multiOptionText(option)}\n togglePosition=\"right\"\n onModeChange={(next) => setMode(option.value, next)}\n />\n );\n })}\n {visibleOptions.length === 0 && (\n <div className=\"px-2 py-3 text-sm text-muted-foreground\">No options found</div>\n )}\n </div>\n </div>\n );\n}\n\nfunction multiOptionText(option: FilterBarMultiFilter[\"options\"][number]) {\n const label = typeof option.label === \"string\" ? option.label : \"\";\n return [option.value, label, option.title ?? \"\"].filter(Boolean).join(\" \");\n}\n\n// TimeRangeRow renders the paired from/to parameters as the native TimeRange\n// popover picker (relative-time presets + a date picker) rather than two bare\n// text inputs, matching how FilterBar renders its own range control.\nfunction TimeRangeRow({ timeRange }: { timeRange: FilterBarRangeProps }) {\n return (\n <div className=\"grid grid-cols-1 gap-2 py-2 sm:grid-cols-[minmax(8rem,14rem)_minmax(0,1fr)] sm:items-center\">\n <div className=\"text-sm font-medium text-muted-foreground\">Time range</div>\n <div className=\"min-w-0\">\n <TimeRange\n kind={timeRange.timeEnabled ? \"time\" : \"date\"}\n label=\"Time range\"\n align=\"left\"\n from={timeRange.from ?? \"\"}\n to={timeRange.to ?? \"\"}\n onApply={timeRange.onApply}\n {...(timeRange.presets ? { presets: timeRange.presets } : {})}\n {...(timeRange.timeEnabled !== undefined ? { timeEnabled: timeRange.timeEnabled } : {})}\n {...(timeRange.timeZone ? { timeZone: timeRange.timeZone } : {})}\n {...(timeRange.timeZones ? { timeZones: timeRange.timeZones } : {})}\n {...(timeRange.fromPlaceholder ? { fromPlaceholder: timeRange.fromPlaceholder } : {})}\n {...(timeRange.toPlaceholder ? { toPlaceholder: timeRange.toPlaceholder } : {})}\n />\n </div>\n </div>\n );\n}\n\nfunction splitCommaValues(value: string) {\n return value\n .split(\",\")\n .map((item) => item.trim())\n .filter(Boolean);\n}\n\nconst inputClassName =\n \"h-8 w-full min-w-0 rounded-md border border-input bg-background px-2 text-sm text-foreground outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:bg-muted/40 focus-visible:ring-2 focus-visible:ring-ring\";\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"FilterForm.js","sources":["../../src/rpc/FilterForm.tsx"],"sourcesContent":["import { useEffect, useMemo, useRef, useState, type FormEvent } from \"react\";\nimport { useQuery } from \"@tanstack/react-query\";\nimport { Button } from \"../components/button\";\nimport type {\n FilterBarFilter,\n FilterBarMultiFilter,\n FilterBarRangeProps,\n} from \"../components/FilterBar\";\nimport { TimeRange } from \"../components/TimeRange\";\nimport { FilterPill, type FilterMode } from \"../data/FilterPill\";\nimport { Icon } from \"../data/Icon\";\nimport { UiSearch } from \"../icons\";\nimport { cn } from \"../lib/utils\";\nimport {\n packParameterValues,\n parametersToFormConfig,\n pruneParameterValues,\n buildInitialParameterValues,\n titleCase,\n useDebouncedRecord,\n type ParameterValues,\n} from \"./formMetadata\";\nimport type { OpenAPIParameter } from \"./types\";\nimport type { OperationsApiClient } from \"./useOperations\";\n\nexport type FilterFormProps = {\n client: OperationsApiClient;\n path: string;\n method: string;\n parameters?: OpenAPIParameter[];\n initialValues?: ParameterValues | undefined;\n lockedValues?: ParameterValues | undefined;\n hideLocked?: boolean | undefined;\n enableLookup?: boolean | undefined;\n autoSubmit?: boolean | undefined;\n submitLabel?: string | undefined;\n submittingLabel?: string | undefined;\n emptyMessage?: string | undefined;\n isSubmitting?: boolean | undefined;\n className?: string | undefined;\n onSubmit: (values: ParameterValues) => void | Promise<void>;\n};\n\nexport function FilterForm({\n client,\n path,\n method,\n parameters = [],\n initialValues = {},\n lockedValues = {},\n hideLocked = false,\n enableLookup = method.toUpperCase() === \"GET\",\n autoSubmit = false,\n submitLabel = \"Execute request\",\n submittingLabel = \"Executing…\",\n emptyMessage = \"This operation does not require input.\",\n isSubmitting = false,\n className,\n onSubmit,\n}: FilterFormProps) {\n const resetKey = useMemo(\n () => `${method}:${path}:${JSON.stringify(initialValues)}:${JSON.stringify(lockedValues)}`,\n [initialValues, lockedValues, method, path],\n );\n const [values, setValues] = useState<ParameterValues>(() =>\n buildInitialParameterValues(parameters, method, lockedValues, initialValues),\n );\n const [error, setError] = useState(\"\");\n const debouncedValues = useDebouncedRecord(values, 250);\n const lastAutoSubmitted = useRef<string | null>(null);\n\n const lookupQuery = useQuery({\n queryKey: [\"filter-form-lookup\", method, path, debouncedValues],\n queryFn: async () =>\n (await client.lookupFilters?.(\n path,\n method,\n packParameterValues(debouncedValues, parameters),\n { Accept: \"application/json+clicky\" },\n )) ?? { filters: {} },\n enabled:\n enableLookup && !!client.lookupFilters && parameters.some((param) => param.in === \"query\"),\n staleTime: 30_000,\n retry: 0,\n });\n\n const formConfig = useMemo(\n () =>\n parametersToFormConfig(parameters, values, setValues, {\n lookup: lookupQuery.data,\n lockedValues,\n hideLocked,\n }),\n [hideLocked, lockedValues, lookupQuery.data, parameters, values],\n );\n\n const hasFields = formConfig.filters.length > 0 || formConfig.timeRange != null;\n\n async function handleSubmit(event?: FormEvent) {\n event?.preventDefault();\n\n const missingRequired = parameters.filter((param) => {\n if (!param.required) return false;\n const value = lockedValues[param.name] ?? values[param.name] ?? \"\";\n return value.trim() === \"\";\n });\n\n if (missingRequired.length > 0) {\n setError(\n `Missing required fields: ${missingRequired.map((param) => titleCase(param.name)).join(\", \")}`,\n );\n return;\n }\n\n setError(\"\");\n await onSubmit(pruneParameterValues(values));\n }\n\n useEffect(() => {\n setValues(buildInitialParameterValues(parameters, method, lockedValues, initialValues));\n setError(\"\");\n lastAutoSubmitted.current = null;\n }, [resetKey]);\n\n useEffect(() => {\n if (!autoSubmit) {\n return;\n }\n\n const missingRequired = parameters.filter((param) => {\n if (!param.required) return false;\n const value = lockedValues[param.name] ?? debouncedValues[param.name] ?? \"\";\n return value.trim() === \"\";\n });\n if (missingRequired.length > 0) {\n return;\n }\n\n const submittedValues = pruneParameterValues(debouncedValues);\n const signature = JSON.stringify(submittedValues);\n if (lastAutoSubmitted.current === signature) {\n return;\n }\n\n lastAutoSubmitted.current = signature;\n setError(\"\");\n void onSubmit(submittedValues);\n }, [autoSubmit, debouncedValues, lockedValues, onSubmit, parameters]);\n\n return (\n <form className=\"space-y-3\" onSubmit={handleSubmit}>\n {hasFields ? (\n <ParameterGrid\n autoSubmit={autoSubmit}\n filters={formConfig.filters}\n isSubmitting={isSubmitting}\n submitLabel={submitLabel}\n submittingLabel={submittingLabel}\n {...(formConfig.timeRange ? { timeRange: formConfig.timeRange } : {})}\n {...(className ? { className } : {})}\n />\n ) : (\n <div className=\"flex items-center justify-between gap-4\">\n <p className=\"text-sm text-muted-foreground\">{emptyMessage}</p>\n <Button type=\"button\" onClick={handleSubmit} disabled={isSubmitting}>\n {isSubmitting ? submittingLabel : submitLabel}\n </Button>\n </div>\n )}\n\n {error && (\n <div className=\"rounded-md border border-destructive/40 bg-destructive/5 p-3 text-sm text-destructive\">\n {error}\n </div>\n )}\n </form>\n );\n}\n\ntype ParameterGridProps = {\n filters: FilterBarFilter[];\n timeRange?: FilterBarRangeProps | undefined;\n autoSubmit: boolean;\n isSubmitting: boolean;\n submitLabel: string;\n submittingLabel: string;\n className?: string | undefined;\n};\n\nfunction ParameterGrid({\n filters,\n timeRange,\n autoSubmit,\n isSubmitting,\n submitLabel,\n submittingLabel,\n className,\n}: ParameterGridProps) {\n return (\n <div className={cn(\"space-y-3\", className)}>\n <div className=\"divide-y divide-border border-y border-border\">\n {filters.map((filter) => (\n <ParameterRow key={filter.key} filter={filter} />\n ))}\n {timeRange && <TimeRangeRow timeRange={timeRange} />}\n </div>\n\n {!autoSubmit && (\n <div className=\"flex justify-end\">\n <Button type=\"submit\" disabled={isSubmitting}>\n {isSubmitting ? submittingLabel : submitLabel}\n </Button>\n </div>\n )}\n </div>\n );\n}\n\nfunction ParameterRow({ filter }: { filter: FilterBarFilter }) {\n const id = `clicky-param-${filter.key.replace(/[^a-zA-Z0-9_-]/g, \"-\")}`;\n\n return (\n <div\n title={filter.description}\n className={cn(\n \"grid grid-cols-1 gap-2 py-2 sm:grid-cols-[minmax(8rem,14rem)_minmax(0,1fr)] sm:items-center\",\n filter.disabled && \"opacity-60\",\n )}\n >\n <label htmlFor={id} className=\"text-sm font-medium text-muted-foreground\">\n {filter.label}\n </label>\n <div className=\"min-w-0\">{renderParameterInput(filter, id)}</div>\n </div>\n );\n}\n\nfunction renderParameterInput(filter: FilterBarFilter, id: string) {\n if (filter.kind === \"enum\") {\n return (\n <select\n id={id}\n aria-label={filter.label}\n className={inputClassName}\n value={filter.value}\n disabled={filter.disabled}\n onChange={(event) => filter.onChange(event.target.value)}\n >\n <option value=\"\">{filter.placeholder ?? \"\"}</option>\n {filter.options.map((option) => (\n <option key={option.value} value={option.value}>\n {option.label ?? option.value}\n </option>\n ))}\n </select>\n );\n }\n\n if (filter.kind === \"boolean\") {\n return (\n <div className=\"flex h-8 items-center\">\n <input\n id={id}\n type=\"checkbox\"\n aria-label={filter.label}\n className=\"h-4 w-4 accent-primary disabled:cursor-not-allowed\"\n checked={filter.value}\n disabled={filter.disabled}\n onChange={(event) => filter.onChange(event.target.checked)}\n />\n </div>\n );\n }\n\n if (filter.kind === \"lookup\") {\n const listId = `${id}-options`;\n return (\n <>\n <input\n id={id}\n type={filter.inputType === \"number\" ? \"number\" : \"text\"}\n aria-label={filter.label}\n className={inputClassName}\n {...(filter.placeholder !== undefined ? { placeholder: filter.placeholder } : {})}\n value={filter.value}\n list={listId}\n disabled={filter.disabled}\n onChange={(event) => filter.onChange(event.target.value)}\n />\n <datalist id={listId}>\n {filter.options.map((option) => (\n <option\n key={option.value}\n value={option.value}\n label={option.label ?? option.value}\n disabled={option.disabled}\n />\n ))}\n </datalist>\n </>\n );\n }\n\n if (filter.kind === \"lookup-multi\") {\n const listId = `${id}-options`;\n return (\n <>\n <input\n id={id}\n type=\"text\"\n aria-label={filter.label}\n className={inputClassName}\n {...(filter.placeholder !== undefined ? { placeholder: filter.placeholder } : {})}\n value={filter.value.join(\", \")}\n list={listId}\n disabled={filter.disabled}\n onChange={(event) => filter.onChange(splitCommaValues(event.target.value))}\n />\n <datalist id={listId}>\n {filter.options.map((option) => (\n <option\n key={option.value}\n value={option.value}\n label={option.label ?? option.value}\n disabled={option.disabled}\n />\n ))}\n </datalist>\n </>\n );\n }\n\n if (filter.kind === \"multi\") {\n return <MultiParameterInput filter={filter} id={id} />;\n }\n\n if (filter.kind === \"text\") {\n return (\n <input\n id={id}\n type=\"text\"\n aria-label={filter.label}\n className={inputClassName}\n {...(filter.placeholder !== undefined ? { placeholder: filter.placeholder } : {})}\n value={filter.value}\n disabled={filter.disabled}\n onChange={(event) => filter.onChange(event.target.value)}\n />\n );\n }\n\n return (\n <input\n id={id}\n type=\"text\"\n aria-label={filter.label}\n className={inputClassName}\n value={JSON.stringify(filter.value)}\n disabled\n readOnly\n />\n );\n}\n\nfunction MultiParameterInput({ filter, id }: { filter: FilterBarMultiFilter; id: string }) {\n const [query, setQuery] = useState(\"\");\n const showOptionFilter = filter.options.length > 7;\n const visibleOptions = useMemo(() => {\n const normalized = query.trim().toLowerCase();\n if (!normalized) return filter.options;\n return filter.options.filter((option) =>\n multiOptionText(option).toLowerCase().includes(normalized),\n );\n }, [filter.options, query]);\n\n const setMode = (value: string, mode: FilterMode) => {\n if (filter.disabled) return;\n const next = { ...filter.value };\n if (mode === \"include\" || mode === \"exclude\") {\n next[value] = mode;\n } else {\n delete next[value];\n }\n filter.onChange(next);\n };\n\n return (\n <div\n id={id}\n role=\"group\"\n aria-label={filter.label}\n className=\"rounded-md border border-input bg-background p-2\"\n >\n {showOptionFilter && (\n <label className=\"mb-2 flex items-center gap-2 rounded-md border border-input bg-background px-2\">\n <Icon icon={UiSearch} className=\"shrink-0 text-muted-foreground\" />\n <input\n type=\"search\"\n aria-label={`Filter ${filter.label} options`}\n className=\"h-8 min-w-0 flex-1 bg-transparent text-sm outline-none placeholder:text-muted-foreground\"\n placeholder={`Filter ${filter.label.toLowerCase()}`}\n value={query}\n disabled={filter.disabled}\n onChange={(event) => setQuery(event.target.value)}\n />\n </label>\n )}\n\n <div className=\"max-h-56 space-y-1 overflow-auto\">\n {visibleOptions.map((option) => {\n const mode: FilterMode = filter.value[option.value] ?? \"neutral\";\n return (\n <FilterPill\n key={option.value}\n className=\"w-full justify-between\"\n label={option.label}\n mode={mode}\n title={option.title ?? multiOptionText(option)}\n togglePosition=\"right\"\n onModeChange={(next) => setMode(option.value, next)}\n />\n );\n })}\n {visibleOptions.length === 0 && (\n <div className=\"px-2 py-3 text-sm text-muted-foreground\">No options found</div>\n )}\n </div>\n </div>\n );\n}\n\nfunction multiOptionText(option: FilterBarMultiFilter[\"options\"][number]) {\n const label = typeof option.label === \"string\" ? option.label : \"\";\n return [option.value, label, option.title ?? \"\"].filter(Boolean).join(\" \");\n}\n\n// TimeRangeRow renders the paired from/to parameters as the native TimeRange\n// popover picker (relative-time presets + a date picker) rather than two bare\n// text inputs, matching how FilterBar renders its own range control.\nfunction TimeRangeRow({ timeRange }: { timeRange: FilterBarRangeProps }) {\n return (\n <div className=\"grid grid-cols-1 gap-2 py-2 sm:grid-cols-[minmax(8rem,14rem)_minmax(0,1fr)] sm:items-center\">\n <div className=\"text-sm font-medium text-muted-foreground\">Time range</div>\n <div className=\"min-w-0\">\n <TimeRange\n kind={timeRange.timeEnabled ? \"time\" : \"date\"}\n label=\"Time range\"\n align=\"left\"\n from={timeRange.from ?? \"\"}\n to={timeRange.to ?? \"\"}\n onApply={timeRange.onApply}\n {...(timeRange.presets ? { presets: timeRange.presets } : {})}\n {...(timeRange.timeEnabled !== undefined ? { timeEnabled: timeRange.timeEnabled } : {})}\n {...(timeRange.timeZone ? { timeZone: timeRange.timeZone } : {})}\n {...(timeRange.timeZones ? { timeZones: timeRange.timeZones } : {})}\n {...(timeRange.fromPlaceholder ? { fromPlaceholder: timeRange.fromPlaceholder } : {})}\n {...(timeRange.toPlaceholder ? { toPlaceholder: timeRange.toPlaceholder } : {})}\n />\n </div>\n </div>\n );\n}\n\nfunction splitCommaValues(value: string) {\n return value\n .split(\",\")\n .map((item) => item.trim())\n .filter(Boolean);\n}\n\nconst inputClassName =\n \"h-8 w-full min-w-0 rounded-md border border-input bg-background px-2 text-sm text-foreground outline-none placeholder:text-muted-foreground disabled:cursor-not-allowed disabled:bg-muted/40 focus-visible:ring-2 focus-visible:ring-ring\";\n"],"names":[],"mappings":"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"}
|
|
@@ -12,7 +12,7 @@ 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
|
|
15
|
+
const FilterBar = require("../components/FilterBar.cjs");
|
|
16
16
|
const useOperations = require("./useOperations.cjs");
|
|
17
17
|
const formMetadata = require("./formMetadata.cjs");
|
|
18
18
|
const UiTable = require("../icons/components/UiTable.cjs");
|
|
@@ -32,9 +32,8 @@ function OperationCatalog({
|
|
|
32
32
|
client,
|
|
33
33
|
renderLink,
|
|
34
34
|
allOperations = false,
|
|
35
|
-
operationIdPrefix,
|
|
36
|
-
listOperationId,
|
|
37
35
|
surfaceKey,
|
|
36
|
+
filterPre,
|
|
38
37
|
getCommandHref = defaultCommandHref,
|
|
39
38
|
renderError = defaultRenderError,
|
|
40
39
|
kind,
|
|
@@ -52,19 +51,13 @@ function OperationCatalog({
|
|
|
52
51
|
);
|
|
53
52
|
const useSurfaceMetadata = surfaceOps.length > 0;
|
|
54
53
|
const domainOps = react.useMemo(() => {
|
|
55
|
-
if (useSurfaceMetadata)
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
return (allOperations ? operations : classify.filterOperationsByDomain(operations, entities)).filter(
|
|
59
|
-
(op) => operationIdPrefix ? (op.operation.operationId ?? "").startsWith(operationIdPrefix) : true
|
|
60
|
-
);
|
|
61
|
-
}, [allOperations, entities, operationIdPrefix, operations, surfaceOps, useSurfaceMetadata]);
|
|
54
|
+
if (useSurfaceMetadata) return surfaceOps;
|
|
55
|
+
return allOperations ? operations : classify.filterOperationsByDomain(operations, entities);
|
|
56
|
+
}, [allOperations, entities, operations, surfaceOps, useSurfaceMetadata]);
|
|
62
57
|
const listEndpoint = react.useMemo(() => {
|
|
63
|
-
if (useSurfaceMetadata)
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
return listOperationId ? domainOps.find((op) => op.method === "get" && op.operation.operationId === listOperationId) : classify.findListEndpoint(domainOps, entities);
|
|
67
|
-
}, [domainOps, entities, listOperationId, surfaceKey, useSurfaceMetadata]);
|
|
58
|
+
if (!useSurfaceMetadata) return void 0;
|
|
59
|
+
return clickyMetadata.findSurfaceListOperation(domainOps, surfaceKey);
|
|
60
|
+
}, [domainOps, surfaceKey, useSurfaceMetadata]);
|
|
68
61
|
const [filters, setFilters] = react.useState(() => readFiltersFromUrl());
|
|
69
62
|
const listParameters = (listEndpoint == null ? void 0 : listEndpoint.operation.parameters) ?? [];
|
|
70
63
|
react.useEffect(() => {
|
|
@@ -101,17 +94,10 @@ function OperationCatalog({
|
|
|
101
94
|
staleTime: 3e4,
|
|
102
95
|
retry: 0
|
|
103
96
|
});
|
|
104
|
-
const actionOps = react.useMemo(
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
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
|
-
);
|
|
114
|
-
}, [domainOps, surfaceKey, useSurfaceMetadata]);
|
|
97
|
+
const actionOps = react.useMemo(
|
|
98
|
+
() => useSurfaceMetadata ? clickyMetadata.findSurfaceActions(domainOps, surfaceKey) : [],
|
|
99
|
+
[domainOps, surfaceKey, useSurfaceMetadata]
|
|
100
|
+
);
|
|
115
101
|
const filterBarConfig = react.useMemo(() => {
|
|
116
102
|
const options = {
|
|
117
103
|
includeLocations: ["query"]
|
|
@@ -125,6 +111,10 @@ function OperationCatalog({
|
|
|
125
111
|
() => formMetadata.dataTablePaginationFromForm(filterBarConfig.pagination, listQuery.data),
|
|
126
112
|
[filterBarConfig.pagination, listQuery.data]
|
|
127
113
|
);
|
|
114
|
+
const decoratedFilters = react.useMemo(
|
|
115
|
+
() => filterBarConfig.filters.map((filter) => FilterBar.applyFilterExtensions(filter, filterPre)),
|
|
116
|
+
[filterBarConfig.filters, filterPre]
|
|
117
|
+
);
|
|
128
118
|
const hasTable = !!listEndpoint;
|
|
129
119
|
const showTable = hasTable && view === "table";
|
|
130
120
|
const sectionLabel = kind === "configuration" || definition.key.startsWith("config-") ? "Configuration" : "Operations";
|
|
@@ -213,40 +203,28 @@ function OperationCatalog({
|
|
|
213
203
|
] })
|
|
214
204
|
] }),
|
|
215
205
|
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
|
-
]
|
|
206
|
+
const label = clickyMetadata.surfaceActionLabel(op);
|
|
207
|
+
const summary = op.operation.summary || op.operation.description;
|
|
208
|
+
const tooltip = summary ? `${label} — ${summary}` : label;
|
|
209
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
210
|
+
button.Button,
|
|
211
|
+
{
|
|
212
|
+
type: "button",
|
|
213
|
+
variant: "outline",
|
|
214
|
+
size: "sm",
|
|
215
|
+
title: tooltip,
|
|
216
|
+
onClick: () => {
|
|
217
|
+
setActiveAction(op);
|
|
218
|
+
setActionResult(null);
|
|
219
|
+
setActionError("");
|
|
236
220
|
},
|
|
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
|
-
});
|
|
221
|
+
children: [
|
|
222
|
+
/* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiAdd.UiAdd, className: "text-xs" }),
|
|
223
|
+
label
|
|
224
|
+
]
|
|
225
|
+
},
|
|
226
|
+
`${op.method}:${op.path}`
|
|
227
|
+
);
|
|
250
228
|
}) }),
|
|
251
229
|
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
230
|
ExecutionResult.ExecutionResult,
|
|
@@ -260,7 +238,7 @@ function OperationCatalog({
|
|
|
260
238
|
...commandRuntime ? { commandRuntime } : {},
|
|
261
239
|
...filterBarConfig.search ? { search: filterBarConfig.search } : {},
|
|
262
240
|
...filterBarConfig.timeRange ? { timeRange: filterBarConfig.timeRange } : {},
|
|
263
|
-
...
|
|
241
|
+
...decoratedFilters.length > 0 ? { externalFilters: decoratedFilters } : {},
|
|
264
242
|
...dataTablePagination ? { pagination: dataTablePagination } : {}
|
|
265
243
|
}
|
|
266
244
|
) }) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -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 } 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":["jsxs","jsx","useOperations","useState","useMemo","filterOperationsBySurface","filterOperationsByDomain","findSurfaceListOperation","useEffect","useQuery","packParameterValues","keepPreviousData","findSurfaceActions","parametersToFormConfig","dataTablePaginationFromForm","applyFilterExtensions","getOperationClickyMeta","Button","Icon","UiTable","UiListFlat","surfaceActionLabel","UiAdd","Fragment","ExecutionResult","EndpointList","Modal","MethodBadge","FilterForm"],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { ReactNode } from 'react';
|
|
2
2
|
import { ClickyCommandRuntime } from '../data/Clicky';
|
|
3
3
|
import { RenderLink } from './EndpointList';
|
|
4
|
+
import { FilterExtension } from '../components/FilterBar';
|
|
4
5
|
import { DomainDefinition, ResolvedOperation } from './types';
|
|
5
6
|
import { OperationsApiClient } from './useOperations';
|
|
6
7
|
export type OperationCatalogProps = {
|
|
@@ -9,13 +10,12 @@ export type OperationCatalogProps = {
|
|
|
9
10
|
client: OperationsApiClient;
|
|
10
11
|
renderLink: RenderLink;
|
|
11
12
|
allOperations?: boolean;
|
|
12
|
-
operationIdPrefix?: string;
|
|
13
|
-
listOperationId?: string;
|
|
14
13
|
surfaceKey?: string;
|
|
14
|
+
filterPre?: FilterExtension[];
|
|
15
15
|
getCommandHref?: (operationId: string, op: ResolvedOperation) => string;
|
|
16
16
|
renderError?: (err: unknown, title: string) => ReactNode;
|
|
17
17
|
kind?: "operations" | "configuration";
|
|
18
18
|
commandRuntime?: ClickyCommandRuntime;
|
|
19
19
|
};
|
|
20
|
-
export declare function OperationCatalog({ definition, entities, client, renderLink, allOperations,
|
|
20
|
+
export declare function OperationCatalog({ definition, entities, client, renderLink, allOperations, surfaceKey, filterPre, getCommandHref, renderError, kind, commandRuntime, }: OperationCatalogProps): import("react/jsx-runtime").JSX.Element;
|
|
21
21
|
//# sourceMappingURL=OperationCatalog.d.ts.map
|
|
@@ -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,EAAyB,KAAK,eAAe,EAAE,MAAM,yBAAyB,CAAC;AACtF,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;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;IAGpB,SAAS,CAAC,EAAE,eAAe,EAAE,CAAC;IAC9B,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,UAAU,EACV,SAAS,EACT,cAAmC,EACnC,WAAgC,EAChC,IAAI,EACJ,cAAc,GACf,EAAE,qBAAqB,2CAqTvB"}
|