@flanksource/clicky-ui 0.2.21 → 0.3.2
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/comments/CommentAuthor.cjs +58 -0
- package/dist/comments/CommentAuthor.cjs.map +1 -0
- package/dist/comments/CommentAuthor.d.ts +17 -0
- package/dist/comments/CommentAuthor.d.ts.map +1 -0
- package/dist/comments/CommentAuthor.js +58 -0
- package/dist/comments/CommentAuthor.js.map +1 -0
- package/dist/comments/CommentCard.cjs +343 -0
- package/dist/comments/CommentCard.cjs.map +1 -0
- package/dist/comments/CommentCard.d.ts +27 -0
- package/dist/comments/CommentCard.d.ts.map +1 -0
- package/dist/comments/CommentCard.js +343 -0
- package/dist/comments/CommentCard.js.map +1 -0
- package/dist/comments/CommentComposer.cjs +207 -0
- package/dist/comments/CommentComposer.cjs.map +1 -0
- package/dist/comments/CommentComposer.d.ts +23 -0
- package/dist/comments/CommentComposer.d.ts.map +1 -0
- package/dist/comments/CommentComposer.js +207 -0
- package/dist/comments/CommentComposer.js.map +1 -0
- package/dist/comments/CommentFilterBar.cjs +145 -0
- package/dist/comments/CommentFilterBar.cjs.map +1 -0
- package/dist/comments/CommentFilterBar.d.ts +15 -0
- package/dist/comments/CommentFilterBar.d.ts.map +1 -0
- package/dist/comments/CommentFilterBar.js +145 -0
- package/dist/comments/CommentFilterBar.js.map +1 -0
- package/dist/comments/CommentMarkdown.cjs +156 -0
- package/dist/comments/CommentMarkdown.cjs.map +1 -0
- package/dist/comments/CommentMarkdown.d.ts +13 -0
- package/dist/comments/CommentMarkdown.d.ts.map +1 -0
- package/dist/comments/CommentMarkdown.js +156 -0
- package/dist/comments/CommentMarkdown.js.map +1 -0
- package/dist/comments/CommentProgress.cjs +86 -0
- package/dist/comments/CommentProgress.cjs.map +1 -0
- package/dist/comments/CommentProgress.d.ts +16 -0
- package/dist/comments/CommentProgress.d.ts.map +1 -0
- package/dist/comments/CommentProgress.js +86 -0
- package/dist/comments/CommentProgress.js.map +1 -0
- package/dist/comments/CommentProvider.cjs +99 -0
- package/dist/comments/CommentProvider.cjs.map +1 -0
- package/dist/comments/CommentProvider.d.ts +19 -0
- package/dist/comments/CommentProvider.d.ts.map +1 -0
- package/dist/comments/CommentProvider.js +99 -0
- package/dist/comments/CommentProvider.js.map +1 -0
- package/dist/comments/CommentSidePanel.cjs +219 -0
- package/dist/comments/CommentSidePanel.cjs.map +1 -0
- package/dist/comments/CommentSidePanel.d.ts +16 -0
- package/dist/comments/CommentSidePanel.d.ts.map +1 -0
- package/dist/comments/CommentSidePanel.js +219 -0
- package/dist/comments/CommentSidePanel.js.map +1 -0
- package/dist/comments/CommentThread.cjs +57 -0
- package/dist/comments/CommentThread.cjs.map +1 -0
- package/dist/comments/CommentThread.d.ts +24 -0
- package/dist/comments/CommentThread.d.ts.map +1 -0
- package/dist/comments/CommentThread.js +57 -0
- package/dist/comments/CommentThread.js.map +1 -0
- package/dist/comments/CommentThreadList.cjs +124 -0
- package/dist/comments/CommentThreadList.cjs.map +1 -0
- package/dist/comments/CommentThreadList.d.ts +25 -0
- package/dist/comments/CommentThreadList.d.ts.map +1 -0
- package/dist/comments/CommentThreadList.js +124 -0
- package/dist/comments/CommentThreadList.js.map +1 -0
- package/dist/comments/GroupedComments.cjs +74 -0
- package/dist/comments/GroupedComments.cjs.map +1 -0
- package/dist/comments/GroupedComments.d.ts +18 -0
- package/dist/comments/GroupedComments.d.ts.map +1 -0
- package/dist/comments/GroupedComments.js +74 -0
- package/dist/comments/GroupedComments.js.map +1 -0
- package/dist/comments/MentionTextarea.cjs +253 -0
- package/dist/comments/MentionTextarea.cjs.map +1 -0
- package/dist/comments/MentionTextarea.d.ts +28 -0
- package/dist/comments/MentionTextarea.d.ts.map +1 -0
- package/dist/comments/MentionTextarea.js +253 -0
- package/dist/comments/MentionTextarea.js.map +1 -0
- package/dist/comments/comment-context.cjs +33 -0
- package/dist/comments/comment-context.cjs.map +1 -0
- package/dist/comments/comment-context.d.ts +32 -0
- package/dist/comments/comment-context.d.ts.map +1 -0
- package/dist/comments/comment-context.js +33 -0
- package/dist/comments/comment-context.js.map +1 -0
- package/dist/comments/comment-fixtures.d.ts +11 -0
- package/dist/comments/comment-fixtures.d.ts.map +1 -0
- package/dist/comments/comment-types.cjs +19 -0
- package/dist/comments/comment-types.cjs.map +1 -0
- package/dist/comments/comment-types.d.ts +170 -0
- package/dist/comments/comment-types.d.ts.map +1 -0
- package/dist/comments/comment-types.js +19 -0
- package/dist/comments/comment-types.js.map +1 -0
- package/dist/comments/comment-utils.cjs +216 -0
- package/dist/comments/comment-utils.cjs.map +1 -0
- package/dist/comments/comment-utils.d.ts +59 -0
- package/dist/comments/comment-utils.d.ts.map +1 -0
- package/dist/comments/comment-utils.js +216 -0
- package/dist/comments/comment-utils.js.map +1 -0
- package/dist/comments.cjs +57 -0
- package/dist/comments.cjs.map +1 -0
- package/dist/comments.d.ts +16 -0
- package/dist/comments.d.ts.map +1 -0
- package/dist/comments.js +57 -0
- package/dist/comments.js.map +1 -0
- package/dist/components/Combobox.cjs +5 -2
- package/dist/components/Combobox.cjs.map +1 -1
- package/dist/components/Combobox.d.ts.map +1 -1
- package/dist/components/Combobox.js +5 -2
- package/dist/components/Combobox.js.map +1 -1
- package/dist/components/FilterBar.cjs +293 -256
- package/dist/components/FilterBar.cjs.map +1 -1
- package/dist/components/FilterBar.d.ts.map +1 -1
- package/dist/components/FilterBar.js +293 -256
- package/dist/components/FilterBar.js.map +1 -1
- package/dist/components/JsonSchemaForm.cjs +22 -6
- 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 +25 -9
- package/dist/components/JsonSchemaForm.js.map +1 -1
- package/dist/components/MultiSelect.cjs +29 -32
- package/dist/components/MultiSelect.cjs.map +1 -1
- package/dist/components/MultiSelect.d.ts.map +1 -1
- package/dist/components/MultiSelect.js +30 -33
- package/dist/components/MultiSelect.js.map +1 -1
- package/dist/components/NamespacePicker.cjs +52 -0
- package/dist/components/NamespacePicker.cjs.map +1 -0
- package/dist/components/NamespacePicker.d.ts +17 -0
- package/dist/components/NamespacePicker.d.ts.map +1 -0
- package/dist/components/NamespacePicker.js +52 -0
- package/dist/components/NamespacePicker.js.map +1 -0
- package/dist/components/TimeRange.cjs +29 -37
- package/dist/components/TimeRange.cjs.map +1 -1
- package/dist/components/TimeRange.d.ts.map +1 -1
- package/dist/components/TimeRange.js +30 -38
- package/dist/components/TimeRange.js.map +1 -1
- package/dist/components/TreePickerField.cjs +6 -3
- package/dist/components/TreePickerField.cjs.map +1 -1
- package/dist/components/TreePickerField.d.ts.map +1 -1
- package/dist/components/TreePickerField.js +6 -3
- package/dist/components/TreePickerField.js.map +1 -1
- package/dist/components/form-lookup-context.cjs +36 -0
- package/dist/components/form-lookup-context.cjs.map +1 -0
- package/dist/components/form-lookup-context.d.ts +9 -0
- package/dist/components/form-lookup-context.d.ts.map +1 -0
- package/dist/components/form-lookup-context.js +36 -0
- package/dist/components/form-lookup-context.js.map +1 -0
- package/dist/components/icon-menu-picker.cjs +9 -3
- package/dist/components/icon-menu-picker.cjs.map +1 -1
- package/dist/components/icon-menu-picker.d.ts.map +1 -1
- package/dist/components/icon-menu-picker.js +9 -3
- package/dist/components/icon-menu-picker.js.map +1 -1
- package/dist/components/json-schema-form-discriminator.cjs +67 -0
- package/dist/components/json-schema-form-discriminator.cjs.map +1 -0
- package/dist/components/json-schema-form-discriminator.d.ts +10 -0
- package/dist/components/json-schema-form-discriminator.d.ts.map +1 -0
- package/dist/components/json-schema-form-discriminator.js +67 -0
- package/dist/components/json-schema-form-discriminator.js.map +1 -0
- package/dist/components/json-schema-form-fields.cjs +146 -3
- package/dist/components/json-schema-form-fields.cjs.map +1 -1
- package/dist/components/json-schema-form-fields.d.ts +22 -0
- package/dist/components/json-schema-form-fields.d.ts.map +1 -1
- package/dist/components/json-schema-form-fields.js +147 -4
- package/dist/components/json-schema-form-fields.js.map +1 -1
- package/dist/components/json-schema-form-grid.cjs +92 -0
- package/dist/components/json-schema-form-grid.cjs.map +1 -0
- package/dist/components/json-schema-form-grid.d.ts +9 -0
- package/dist/components/json-schema-form-grid.d.ts.map +1 -0
- package/dist/components/json-schema-form-grid.js +92 -0
- package/dist/components/json-schema-form-grid.js.map +1 -0
- package/dist/components/json-schema-form-refs.cjs +60 -0
- package/dist/components/json-schema-form-refs.cjs.map +1 -0
- package/dist/components/json-schema-form-refs.d.ts +3 -0
- package/dist/components/json-schema-form-refs.d.ts.map +1 -0
- package/dist/components/json-schema-form-refs.js +60 -0
- package/dist/components/json-schema-form-refs.js.map +1 -0
- package/dist/components/json-schema-form-render.cjs +34 -5
- package/dist/components/json-schema-form-render.cjs.map +1 -1
- package/dist/components/json-schema-form-render.d.ts.map +1 -1
- package/dist/components/json-schema-form-render.js +36 -7
- package/dist/components/json-schema-form-render.js.map +1 -1
- package/dist/components/json-schema-form-resolve.cjs +29 -2
- 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 +29 -2
- package/dist/components/json-schema-form-resolve.js.map +1 -1
- package/dist/components/json-schema-form-template-menu.cjs +83 -0
- package/dist/components/json-schema-form-template-menu.cjs.map +1 -0
- package/dist/components/json-schema-form-template-menu.d.ts +15 -0
- package/dist/components/json-schema-form-template-menu.d.ts.map +1 -0
- package/dist/components/json-schema-form-template-menu.js +83 -0
- package/dist/components/json-schema-form-template-menu.js.map +1 -0
- package/dist/components/json-schema-form-template.cjs +18 -0
- package/dist/components/json-schema-form-template.cjs.map +1 -0
- package/dist/components/json-schema-form-template.d.ts +13 -0
- package/dist/components/json-schema-form-template.d.ts.map +1 -0
- package/dist/components/json-schema-form-template.js +18 -0
- package/dist/components/json-schema-form-template.js.map +1 -0
- package/dist/components/json-schema-form-types.d.ts +41 -2
- package/dist/components/json-schema-form-types.d.ts.map +1 -1
- package/dist/components/json-schema-form-utils.cjs +8 -0
- package/dist/components/json-schema-form-utils.cjs.map +1 -1
- package/dist/components/json-schema-form-utils.d.ts +1 -0
- package/dist/components/json-schema-form-utils.d.ts.map +1 -1
- package/dist/components/json-schema-form-utils.js +8 -0
- package/dist/components/json-schema-form-utils.js.map +1 -1
- package/dist/components/workload-picker-utils.cjs.map +1 -1
- package/dist/components/workload-picker-utils.d.ts +11 -1
- package/dist/components/workload-picker-utils.d.ts.map +1 -1
- package/dist/components/workload-picker-utils.js.map +1 -1
- package/dist/components.cjs +10 -0
- package/dist/components.cjs.map +1 -1
- package/dist/components.d.ts +7 -2
- package/dist/components.d.ts.map +1 -1
- package/dist/components.js +10 -0
- package/dist/components.js.map +1 -1
- package/dist/data/Clicky.cjs +231 -69
- package/dist/data/Clicky.cjs.map +1 -1
- package/dist/data/Clicky.d.ts +7 -1
- package/dist/data/Clicky.d.ts.map +1 -1
- package/dist/data/Clicky.fixtures.d.ts +3 -1
- package/dist/data/Clicky.fixtures.d.ts.map +1 -1
- package/dist/data/Clicky.js +232 -70
- package/dist/data/Clicky.js.map +1 -1
- package/dist/data/DataTable.cjs +23 -17
- package/dist/data/DataTable.cjs.map +1 -1
- package/dist/data/DataTable.d.ts +7 -1
- package/dist/data/DataTable.d.ts.map +1 -1
- package/dist/data/DataTable.js +24 -18
- package/dist/data/DataTable.js.map +1 -1
- package/dist/data/ExecutionTree.cjs +68 -0
- package/dist/data/ExecutionTree.cjs.map +1 -0
- package/dist/data/ExecutionTree.d.ts +40 -0
- package/dist/data/ExecutionTree.d.ts.map +1 -0
- package/dist/data/ExecutionTree.js +68 -0
- package/dist/data/ExecutionTree.js.map +1 -0
- package/dist/data/Gauge.cjs +37 -4
- package/dist/data/Gauge.cjs.map +1 -1
- package/dist/data/Gauge.d.ts +6 -1
- package/dist/data/Gauge.d.ts.map +1 -1
- package/dist/data/Gauge.js +37 -4
- package/dist/data/Gauge.js.map +1 -1
- package/dist/data/GaugeHoverCard.cjs +35 -0
- package/dist/data/GaugeHoverCard.cjs.map +1 -0
- package/dist/data/GaugeHoverCard.d.ts +25 -0
- package/dist/data/GaugeHoverCard.d.ts.map +1 -0
- package/dist/data/GaugeHoverCard.js +35 -0
- package/dist/data/GaugeHoverCard.js.map +1 -0
- package/dist/data/MarkdownEditor.cjs +616 -0
- package/dist/data/MarkdownEditor.cjs.map +1 -0
- package/dist/data/MarkdownEditor.d.ts +61 -0
- package/dist/data/MarkdownEditor.d.ts.map +1 -0
- package/dist/data/MarkdownEditor.js +616 -0
- package/dist/data/MarkdownEditor.js.map +1 -0
- package/dist/data/MarkdownEditor.model.cjs +27 -0
- package/dist/data/MarkdownEditor.model.cjs.map +1 -0
- package/dist/data/MarkdownEditor.model.d.ts +38 -0
- package/dist/data/MarkdownEditor.model.d.ts.map +1 -0
- package/dist/data/MarkdownEditor.model.js +27 -0
- package/dist/data/MarkdownEditor.model.js.map +1 -0
- package/dist/data/ObjectGraph.cjs +44 -0
- package/dist/data/ObjectGraph.cjs.map +1 -0
- package/dist/data/ObjectGraph.d.ts +39 -0
- package/dist/data/ObjectGraph.d.ts.map +1 -0
- package/dist/data/ObjectGraph.js +44 -0
- package/dist/data/ObjectGraph.js.map +1 -0
- package/dist/data/SchemaViewer.cjs +152 -0
- package/dist/data/SchemaViewer.cjs.map +1 -0
- package/dist/data/SchemaViewer.d.ts +27 -0
- package/dist/data/SchemaViewer.d.ts.map +1 -0
- package/dist/data/SchemaViewer.js +152 -0
- package/dist/data/SchemaViewer.js.map +1 -0
- package/dist/data/TimeseriesCoreBars.cjs +169 -32
- package/dist/data/TimeseriesCoreBars.cjs.map +1 -1
- package/dist/data/TimeseriesCoreBars.d.ts +42 -5
- package/dist/data/TimeseriesCoreBars.d.ts.map +1 -1
- package/dist/data/TimeseriesCoreBars.js +170 -33
- package/dist/data/TimeseriesCoreBars.js.map +1 -1
- package/dist/data/TimeseriesCoreBars.model.cjs +5 -5
- package/dist/data/TimeseriesCoreBars.model.cjs.map +1 -1
- package/dist/data/TimeseriesCoreBars.model.d.ts +4 -4
- package/dist/data/TimeseriesCoreBars.model.d.ts.map +1 -1
- package/dist/data/TimeseriesCoreBars.model.js +5 -5
- package/dist/data/TimeseriesCoreBars.model.js.map +1 -1
- package/dist/data/TimeseriesGauge.cjs +132 -36
- package/dist/data/TimeseriesGauge.cjs.map +1 -1
- package/dist/data/TimeseriesGauge.d.ts +15 -1
- package/dist/data/TimeseriesGauge.d.ts.map +1 -1
- package/dist/data/TimeseriesGauge.js +133 -37
- package/dist/data/TimeseriesGauge.js.map +1 -1
- package/dist/data/WorkloadCard.cjs +371 -0
- package/dist/data/WorkloadCard.cjs.map +1 -0
- package/dist/data/WorkloadCard.d.ts +25 -0
- package/dist/data/WorkloadCard.d.ts.map +1 -0
- package/dist/data/WorkloadCard.js +371 -0
- package/dist/data/WorkloadCard.js.map +1 -0
- package/dist/data/WorkloadCard.model.cjs +51 -0
- package/dist/data/WorkloadCard.model.cjs.map +1 -0
- package/dist/data/WorkloadCard.model.d.ts +53 -0
- package/dist/data/WorkloadCard.model.d.ts.map +1 -0
- package/dist/data/WorkloadCard.model.js +51 -0
- package/dist/data/WorkloadCard.model.js.map +1 -0
- package/dist/data/ai/ChatFab.cjs +3 -1
- package/dist/data/ai/ChatFab.cjs.map +1 -1
- package/dist/data/ai/ChatFab.d.ts.map +1 -1
- package/dist/data/ai/ChatFab.js +3 -1
- package/dist/data/ai/ChatFab.js.map +1 -1
- package/dist/data/ai/ChatWindow.cjs +19 -9
- package/dist/data/ai/ChatWindow.cjs.map +1 -1
- package/dist/data/ai/ChatWindow.d.ts +4 -2
- package/dist/data/ai/ChatWindow.d.ts.map +1 -1
- package/dist/data/ai/ChatWindow.js +19 -9
- package/dist/data/ai/ChatWindow.js.map +1 -1
- package/dist/data/ai/ChatWindowRequestBody.cjs +20 -0
- package/dist/data/ai/ChatWindowRequestBody.cjs.map +1 -0
- package/dist/data/ai/ChatWindowRequestBody.d.ts +9 -0
- package/dist/data/ai/ChatWindowRequestBody.d.ts.map +1 -0
- package/dist/data/ai/ChatWindowRequestBody.js +20 -0
- package/dist/data/ai/ChatWindowRequestBody.js.map +1 -0
- package/dist/data/ai/chat-window-context.cjs +2 -1
- package/dist/data/ai/chat-window-context.cjs.map +1 -1
- package/dist/data/ai/chat-window-context.d.ts +1 -1
- package/dist/data/ai/chat-window-context.d.ts.map +1 -1
- package/dist/data/ai/chat-window-context.js +2 -1
- package/dist/data/ai/chat-window-context.js.map +1 -1
- package/dist/data/ai/context.cjs.map +1 -1
- package/dist/data/ai/context.d.ts +3 -0
- package/dist/data/ai/context.d.ts.map +1 -1
- package/dist/data/ai/context.js.map +1 -1
- package/dist/data/chat/Chat.cjs +21 -1
- package/dist/data/chat/Chat.cjs.map +1 -1
- package/dist/data/chat/Chat.d.ts +11 -2
- package/dist/data/chat/Chat.d.ts.map +1 -1
- package/dist/data/chat/Chat.js +22 -2
- package/dist/data/chat/Chat.js.map +1 -1
- package/dist/data/chat/Message.cjs +13 -4
- package/dist/data/chat/Message.cjs.map +1 -1
- package/dist/data/chat/Message.d.ts +4 -2
- package/dist/data/chat/Message.d.ts.map +1 -1
- package/dist/data/chat/Message.js +13 -4
- package/dist/data/chat/Message.js.map +1 -1
- package/dist/data/chat/ToolCall.cjs +9 -4
- package/dist/data/chat/ToolCall.cjs.map +1 -1
- package/dist/data/chat/ToolCall.d.ts +3 -2
- package/dist/data/chat/ToolCall.d.ts.map +1 -1
- package/dist/data/chat/ToolCall.js +9 -4
- package/dist/data/chat/ToolCall.js.map +1 -1
- package/dist/data/chat/index.d.ts +1 -1
- package/dist/data/chat/index.d.ts.map +1 -1
- package/dist/data/chat/types.cjs.map +1 -1
- package/dist/data/chat/types.d.ts +7 -0
- package/dist/data/chat/types.d.ts.map +1 -1
- package/dist/data/chat/types.js.map +1 -1
- package/dist/data/gauge-stats.cjs +19 -0
- package/dist/data/gauge-stats.cjs.map +1 -0
- package/dist/data/gauge-stats.d.ts +15 -0
- package/dist/data/gauge-stats.d.ts.map +1 -0
- package/dist/data/gauge-stats.js +19 -0
- package/dist/data/gauge-stats.js.map +1 -0
- package/dist/data/schema-viewer-model.cjs +436 -0
- package/dist/data/schema-viewer-model.cjs.map +1 -0
- package/dist/data/schema-viewer-model.d.ts +64 -0
- package/dist/data/schema-viewer-model.d.ts.map +1 -0
- package/dist/data/schema-viewer-model.js +436 -0
- package/dist/data/schema-viewer-model.js.map +1 -0
- package/dist/data/version-info.cjs +2 -2
- package/dist/data/version-info.js +2 -2
- package/dist/data.cjs +30 -0
- package/dist/data.cjs.map +1 -1
- package/dist/data.d.ts +14 -4
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +31 -1
- package/dist/data.js.map +1 -1
- package/dist/hooks/use-sort.cjs +19 -10
- package/dist/hooks/use-sort.cjs.map +1 -1
- package/dist/hooks/use-sort.d.ts +3 -0
- package/dist/hooks/use-sort.d.ts.map +1 -1
- package/dist/hooks/use-sort.js +19 -10
- package/dist/hooks/use-sort.js.map +1 -1
- package/dist/index.cjs +98 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +98 -2
- package/dist/index.js.map +1 -1
- package/dist/layout/AppShell.cjs +6 -10
- package/dist/layout/AppShell.cjs.map +1 -1
- package/dist/layout/AppShell.d.ts +2 -0
- package/dist/layout/AppShell.d.ts.map +1 -1
- package/dist/layout/AppShell.js +6 -10
- package/dist/layout/AppShell.js.map +1 -1
- package/dist/overlay/DropdownMenu.cjs +50 -38
- package/dist/overlay/DropdownMenu.cjs.map +1 -1
- package/dist/overlay/DropdownMenu.d.ts +5 -1
- package/dist/overlay/DropdownMenu.d.ts.map +1 -1
- package/dist/overlay/DropdownMenu.js +50 -38
- package/dist/overlay/DropdownMenu.js.map +1 -1
- package/dist/overlay/HoverCard.cjs +7 -2
- package/dist/overlay/HoverCard.cjs.map +1 -1
- package/dist/overlay/HoverCard.d.ts.map +1 -1
- package/dist/overlay/HoverCard.js +7 -2
- package/dist/overlay/HoverCard.js.map +1 -1
- package/dist/overlay/Modal.cjs +20 -17
- package/dist/overlay/Modal.cjs.map +1 -1
- package/dist/overlay/Modal.d.ts.map +1 -1
- package/dist/overlay/Modal.js +21 -18
- package/dist/overlay/Modal.js.map +1 -1
- package/dist/overlay/Toast.cjs +9 -1
- package/dist/overlay/Toast.cjs.map +1 -1
- package/dist/overlay/Toast.d.ts.map +1 -1
- package/dist/overlay/Toast.js +9 -1
- package/dist/overlay/Toast.js.map +1 -1
- package/dist/overlay/modalStack.cjs +53 -1
- package/dist/overlay/modalStack.cjs.map +1 -1
- package/dist/overlay/modalStack.d.ts +12 -0
- package/dist/overlay/modalStack.d.ts.map +1 -1
- package/dist/overlay/modalStack.js +54 -2
- package/dist/overlay/modalStack.js.map +1 -1
- package/dist/overlay/zIndex.cjs +20 -0
- package/dist/overlay/zIndex.cjs.map +1 -0
- package/dist/overlay/zIndex.d.ts +39 -0
- package/dist/overlay/zIndex.d.ts.map +1 -0
- package/dist/overlay/zIndex.js +20 -0
- package/dist/overlay/zIndex.js.map +1 -0
- package/dist/rpc/EntityExplorerApp.cjs +102 -143
- package/dist/rpc/EntityExplorerApp.cjs.map +1 -1
- package/dist/rpc/EntityExplorerApp.d.ts +34 -1
- package/dist/rpc/EntityExplorerApp.d.ts.map +1 -1
- package/dist/rpc/EntityExplorerApp.js +105 -146
- package/dist/rpc/EntityExplorerApp.js.map +1 -1
- package/dist/rpc/OperationActionBar.cjs +135 -0
- package/dist/rpc/OperationActionBar.cjs.map +1 -0
- package/dist/rpc/OperationActionBar.d.ts +20 -0
- package/dist/rpc/OperationActionBar.d.ts.map +1 -0
- package/dist/rpc/OperationActionBar.js +135 -0
- package/dist/rpc/OperationActionBar.js.map +1 -0
- package/dist/rpc/OperationCatalog.cjs +79 -116
- package/dist/rpc/OperationCatalog.cjs.map +1 -1
- package/dist/rpc/OperationCatalog.d.ts +8 -1
- package/dist/rpc/OperationCatalog.d.ts.map +1 -1
- package/dist/rpc/OperationCatalog.js +80 -117
- package/dist/rpc/OperationCatalog.js.map +1 -1
- package/dist/rpc/OperationCommandPage.cjs +134 -223
- package/dist/rpc/OperationCommandPage.cjs.map +1 -1
- package/dist/rpc/OperationCommandPage.d.ts +1 -1
- package/dist/rpc/OperationCommandPage.d.ts.map +1 -1
- package/dist/rpc/OperationCommandPage.js +135 -224
- package/dist/rpc/OperationCommandPage.js.map +1 -1
- package/dist/rpc/OperationEntityPage.cjs +49 -100
- package/dist/rpc/OperationEntityPage.cjs.map +1 -1
- package/dist/rpc/OperationEntityPage.d.ts +6 -1
- package/dist/rpc/OperationEntityPage.d.ts.map +1 -1
- package/dist/rpc/OperationEntityPage.js +50 -101
- package/dist/rpc/OperationEntityPage.js.map +1 -1
- package/dist/rpc/OperationResultView.cjs +43 -0
- package/dist/rpc/OperationResultView.cjs.map +1 -0
- package/dist/rpc/OperationResultView.d.ts +30 -0
- package/dist/rpc/OperationResultView.d.ts.map +1 -0
- package/dist/rpc/OperationResultView.js +43 -0
- package/dist/rpc/OperationResultView.js.map +1 -0
- package/dist/rpc/SchemaActionForm.cjs +102 -0
- package/dist/rpc/SchemaActionForm.cjs.map +1 -0
- package/dist/rpc/SchemaActionForm.d.ts +23 -0
- package/dist/rpc/SchemaActionForm.d.ts.map +1 -0
- package/dist/rpc/SchemaActionForm.js +102 -0
- package/dist/rpc/SchemaActionForm.js.map +1 -0
- package/dist/rpc/accept-options.cjs.map +1 -1
- package/dist/rpc/accept-options.d.ts +0 -1
- package/dist/rpc/accept-options.d.ts.map +1 -1
- package/dist/rpc/accept-options.js.map +1 -1
- package/dist/rpc/apiClient.cjs +34 -2
- package/dist/rpc/apiClient.cjs.map +1 -1
- package/dist/rpc/apiClient.d.ts +4 -1
- package/dist/rpc/apiClient.d.ts.map +1 -1
- package/dist/rpc/apiClient.js +34 -2
- package/dist/rpc/apiClient.js.map +1 -1
- package/dist/rpc/clickyMetadata.cjs +4 -4
- package/dist/rpc/clickyMetadata.cjs.map +1 -1
- package/dist/rpc/clickyMetadata.d.ts +0 -1
- package/dist/rpc/clickyMetadata.d.ts.map +1 -1
- package/dist/rpc/clickyMetadata.js +4 -4
- package/dist/rpc/clickyMetadata.js.map +1 -1
- package/dist/rpc/formMetadata.cjs +1 -0
- package/dist/rpc/formMetadata.cjs.map +1 -1
- package/dist/rpc/formMetadata.d.ts +6 -1
- package/dist/rpc/formMetadata.d.ts.map +1 -1
- package/dist/rpc/formMetadata.js +1 -0
- package/dist/rpc/formMetadata.js.map +1 -1
- package/dist/rpc/rowNavigation.cjs +86 -0
- package/dist/rpc/rowNavigation.cjs.map +1 -0
- package/dist/rpc/rowNavigation.d.ts +14 -0
- package/dist/rpc/rowNavigation.d.ts.map +1 -0
- package/dist/rpc/rowNavigation.js +86 -0
- package/dist/rpc/rowNavigation.js.map +1 -0
- package/dist/rpc/schemaActionPath.cjs +22 -0
- package/dist/rpc/schemaActionPath.cjs.map +1 -0
- package/dist/rpc/schemaActionPath.d.ts +4 -0
- package/dist/rpc/schemaActionPath.d.ts.map +1 -0
- package/dist/rpc/schemaActionPath.js +22 -0
- package/dist/rpc/schemaActionPath.js.map +1 -0
- package/dist/rpc/surfaceIconMap.cjs +35 -0
- package/dist/rpc/surfaceIconMap.cjs.map +1 -0
- package/dist/rpc/surfaceIconMap.d.ts +3 -0
- package/dist/rpc/surfaceIconMap.d.ts.map +1 -0
- package/dist/rpc/surfaceIconMap.js +35 -0
- package/dist/rpc/surfaceIconMap.js.map +1 -0
- package/dist/rpc/types.cjs.map +1 -1
- package/dist/rpc/types.d.ts +2 -0
- package/dist/rpc/types.d.ts.map +1 -1
- package/dist/rpc/types.js.map +1 -1
- package/dist/rpc/useOperations.cjs.map +1 -1
- package/dist/rpc/useOperations.d.ts +4 -1
- package/dist/rpc/useOperations.d.ts.map +1 -1
- package/dist/rpc/useOperations.js.map +1 -1
- package/dist/rpc.cjs +4 -2
- package/dist/rpc.cjs.map +1 -1
- package/dist/rpc.d.ts +7 -6
- package/dist/rpc.d.ts.map +1 -1
- package/dist/rpc.js +4 -2
- package/dist/rpc.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +6 -1
- package/dist/rpc/AcceptPicker.cjs +0 -135
- package/dist/rpc/AcceptPicker.cjs.map +0 -1
- package/dist/rpc/AcceptPicker.d.ts +0 -12
- package/dist/rpc/AcceptPicker.d.ts.map +0 -1
- package/dist/rpc/AcceptPicker.js +0 -135
- package/dist/rpc/AcceptPicker.js.map +0 -1
|
@@ -39,10 +39,10 @@ function findSurfaceDetailOperation(operations, surfaceKey) {
|
|
|
39
39
|
(meta) => meta.verb === "get" && meta.scope === "entity"
|
|
40
40
|
);
|
|
41
41
|
}
|
|
42
|
-
function
|
|
42
|
+
function findSurfaceCollectionActions(operations, surfaceKey) {
|
|
43
43
|
return filterOperationsBySurface(operations, surfaceKey).filter((operation) => {
|
|
44
44
|
const meta = getOperationClickyMeta(operation);
|
|
45
|
-
return meta != null && meta.
|
|
45
|
+
return meta != null && meta.scope === "collection" && meta.verb !== "list";
|
|
46
46
|
});
|
|
47
47
|
}
|
|
48
48
|
function surfaceActionLabel(operation) {
|
|
@@ -52,7 +52,7 @@ function surfaceActionLabel(operation) {
|
|
|
52
52
|
if (short && short !== "action") {
|
|
53
53
|
return short.charAt(0).toUpperCase() + short.slice(1);
|
|
54
54
|
}
|
|
55
|
-
return operation.operation.operationId || operation.path;
|
|
55
|
+
return operation.operation.summary || operation.operation.operationId || operation.path;
|
|
56
56
|
}
|
|
57
57
|
function findSurfaceEntityActions(operations, surfaceKey) {
|
|
58
58
|
return filterOperationsBySurface(operations, surfaceKey).filter((operation) => {
|
|
@@ -68,7 +68,7 @@ function makeSurfaceDefinition(surface) {
|
|
|
68
68
|
};
|
|
69
69
|
}
|
|
70
70
|
exports.filterOperationsBySurface = filterOperationsBySurface;
|
|
71
|
-
exports.
|
|
71
|
+
exports.findSurfaceCollectionActions = findSurfaceCollectionActions;
|
|
72
72
|
exports.findSurfaceDetailOperation = findSurfaceDetailOperation;
|
|
73
73
|
exports.findSurfaceEntityActions = findSurfaceEntityActions;
|
|
74
74
|
exports.findSurfaceListOperation = findSurfaceListOperation;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clickyMetadata.cjs","sources":["../../src/rpc/clickyMetadata.ts"],"sourcesContent":["import type {\n ClickyOperationMeta,\n ClickySpecMeta,\n ClickySurface,\n DomainDefinition,\n OpenAPISpec,\n ResolvedOperation,\n} from \"./types\";\n\nexport function getClickySpecMeta(spec: OpenAPISpec | undefined): ClickySpecMeta | undefined {\n return spec?.[\"x-clicky\"];\n}\n\nexport function getClickySurfaces(spec: OpenAPISpec | undefined): ClickySurface[] {\n return getClickySpecMeta(spec)?.surfaces ?? [];\n}\n\nexport function getOperationClickyMeta(\n operation: Pick<ResolvedOperation, \"operation\">,\n): ClickyOperationMeta | undefined {\n return operation.operation[\"x-clicky\"];\n}\n\nexport function filterOperationsBySurface(\n operations: ResolvedOperation[],\n surfaceKey: string | undefined,\n): ResolvedOperation[] {\n if (!surfaceKey) return [];\n return operations.filter(\n (operation) => getOperationClickyMeta(operation)?.surface === surfaceKey,\n );\n}\n\nexport function findSurfaceOperation(\n operations: ResolvedOperation[],\n surfaceKey: string | undefined,\n predicate: (meta: ClickyOperationMeta) => boolean,\n): ResolvedOperation | undefined {\n return filterOperationsBySurface(operations, surfaceKey).find((operation) => {\n const meta = getOperationClickyMeta(operation);\n return meta != null && predicate(meta);\n });\n}\n\nexport function findSurfaceListOperation(\n operations: ResolvedOperation[],\n surfaceKey: string | undefined,\n): ResolvedOperation | undefined {\n return findSurfaceOperation(\n operations,\n surfaceKey,\n (meta) => meta.verb === \"list\" && meta.scope === \"collection\",\n );\n}\n\nexport function findSurfaceDetailOperation(\n operations: ResolvedOperation[],\n surfaceKey: string | undefined,\n): ResolvedOperation | undefined {\n return findSurfaceOperation(\n operations,\n surfaceKey,\n (meta) => meta.verb === \"get\" && meta.scope === \"entity\",\n );\n}\n\nexport function findSurfaceCollectionActions(\n operations: ResolvedOperation[],\n surfaceKey: string | undefined,\n): ResolvedOperation[] {\n return filterOperationsBySurface(operations, surfaceKey).filter((operation) => {\n const meta = getOperationClickyMeta(operation);\n return meta != null && meta.scope === \"collection\" && meta.verb !== \"list\";\n });\n}\n\n//
|
|
1
|
+
{"version":3,"file":"clickyMetadata.cjs","sources":["../../src/rpc/clickyMetadata.ts"],"sourcesContent":["import type {\n ClickyOperationMeta,\n ClickySpecMeta,\n ClickySurface,\n DomainDefinition,\n OpenAPISpec,\n ResolvedOperation,\n} from \"./types\";\n\nexport function getClickySpecMeta(spec: OpenAPISpec | undefined): ClickySpecMeta | undefined {\n return spec?.[\"x-clicky\"];\n}\n\nexport function getClickySurfaces(spec: OpenAPISpec | undefined): ClickySurface[] {\n return getClickySpecMeta(spec)?.surfaces ?? [];\n}\n\nexport function getOperationClickyMeta(\n operation: Pick<ResolvedOperation, \"operation\">,\n): ClickyOperationMeta | undefined {\n return operation.operation[\"x-clicky\"];\n}\n\nexport function filterOperationsBySurface(\n operations: ResolvedOperation[],\n surfaceKey: string | undefined,\n): ResolvedOperation[] {\n if (!surfaceKey) return [];\n return operations.filter(\n (operation) => getOperationClickyMeta(operation)?.surface === surfaceKey,\n );\n}\n\nexport function findSurfaceOperation(\n operations: ResolvedOperation[],\n surfaceKey: string | undefined,\n predicate: (meta: ClickyOperationMeta) => boolean,\n): ResolvedOperation | undefined {\n return filterOperationsBySurface(operations, surfaceKey).find((operation) => {\n const meta = getOperationClickyMeta(operation);\n return meta != null && predicate(meta);\n });\n}\n\nexport function findSurfaceListOperation(\n operations: ResolvedOperation[],\n surfaceKey: string | undefined,\n): ResolvedOperation | undefined {\n return findSurfaceOperation(\n operations,\n surfaceKey,\n (meta) => meta.verb === \"list\" && meta.scope === \"collection\",\n );\n}\n\nexport function findSurfaceDetailOperation(\n operations: ResolvedOperation[],\n surfaceKey: string | undefined,\n): ResolvedOperation | undefined {\n return findSurfaceOperation(\n operations,\n surfaceKey,\n (meta) => meta.verb === \"get\" && meta.scope === \"entity\",\n );\n}\n\nexport function findSurfaceCollectionActions(\n operations: ResolvedOperation[],\n surfaceKey: string | undefined,\n): ResolvedOperation[] {\n return filterOperationsBySurface(operations, surfaceKey).filter((operation) => {\n const meta = getOperationClickyMeta(operation);\n return meta != null && meta.scope === \"collection\" && meta.verb !== \"list\";\n });\n}\n\n// surfaceActionLabel prefers the short clicky actionName/verb (capitalized) over\n// the OpenAPI summary, which is often a full sentence. Without surface metadata\n// (a non-surface operation) it falls back to the summary, then the\n// operationId/path, so a button always has a label.\nexport function surfaceActionLabel(operation: ResolvedOperation): string {\n const meta = getOperationClickyMeta(operation);\n const short = meta?.actionName?.trim() || meta?.verb?.trim();\n if (short && short !== \"action\") {\n return short.charAt(0).toUpperCase() + short.slice(1);\n }\n return operation.operation.summary || operation.operation.operationId || operation.path;\n}\n\nexport function findSurfaceEntityActions(\n operations: ResolvedOperation[],\n surfaceKey: string | undefined,\n): ResolvedOperation[] {\n return filterOperationsBySurface(operations, surfaceKey).filter((operation) => {\n const meta = getOperationClickyMeta(operation);\n return meta != null && meta.scope === \"entity\" && meta.verb !== \"get\";\n });\n}\n\nexport function makeSurfaceDefinition(surface: ClickySurface): DomainDefinition {\n return {\n key: surface.key,\n title: surface.title,\n description: surface.description || `Manage ${surface.title.toLowerCase()} resources.`,\n };\n}\n"],"names":[],"mappings":";;AASO,SAAS,kBAAkB,MAA2D;AAC3F,SAAO,6BAAO;AAChB;AAEO,SAAS,kBAAkB,MAAgD;;AAChF,WAAO,uBAAkB,IAAI,MAAtB,mBAAyB,aAAY,CAAA;AAC9C;AAEO,SAAS,uBACd,WACiC;AACjC,SAAO,UAAU,UAAU,UAAU;AACvC;AAEO,SAAS,0BACd,YACA,YACqB;AACrB,MAAI,CAAC,WAAY,QAAO,CAAA;AACxB,SAAO,WAAW;AAAA,IAChB,CAAC,cAAA;;AAAc,2CAAuB,SAAS,MAAhC,mBAAmC,aAAY;AAAA;AAAA,EAAA;AAElE;AAEO,SAAS,qBACd,YACA,YACA,WAC+B;AAC/B,SAAO,0BAA0B,YAAY,UAAU,EAAE,KAAK,CAAC,cAAc;AAC3E,UAAM,OAAO,uBAAuB,SAAS;AAC7C,WAAO,QAAQ,QAAQ,UAAU,IAAI;AAAA,EACvC,CAAC;AACH;AAEO,SAAS,yBACd,YACA,YAC+B;AAC/B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,CAAC,SAAS,KAAK,SAAS,UAAU,KAAK,UAAU;AAAA,EAAA;AAErD;AAEO,SAAS,2BACd,YACA,YAC+B;AAC/B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,CAAC,SAAS,KAAK,SAAS,SAAS,KAAK,UAAU;AAAA,EAAA;AAEpD;AAEO,SAAS,6BACd,YACA,YACqB;AACrB,SAAO,0BAA0B,YAAY,UAAU,EAAE,OAAO,CAAC,cAAc;AAC7E,UAAM,OAAO,uBAAuB,SAAS;AAC7C,WAAO,QAAQ,QAAQ,KAAK,UAAU,gBAAgB,KAAK,SAAS;AAAA,EACtE,CAAC;AACH;AAMO,SAAS,mBAAmB,WAAsC;;AACvE,QAAM,OAAO,uBAAuB,SAAS;AAC7C,QAAM,UAAQ,kCAAM,eAAN,mBAAkB,aAAU,kCAAM,SAAN,mBAAY;AACtD,MAAI,SAAS,UAAU,UAAU;AAC/B,WAAO,MAAM,OAAO,CAAC,EAAE,gBAAgB,MAAM,MAAM,CAAC;AAAA,EACtD;AACA,SAAO,UAAU,UAAU,WAAW,UAAU,UAAU,eAAe,UAAU;AACrF;AAEO,SAAS,yBACd,YACA,YACqB;AACrB,SAAO,0BAA0B,YAAY,UAAU,EAAE,OAAO,CAAC,cAAc;AAC7E,UAAM,OAAO,uBAAuB,SAAS;AAC7C,WAAO,QAAQ,QAAQ,KAAK,UAAU,YAAY,KAAK,SAAS;AAAA,EAClE,CAAC;AACH;AAEO,SAAS,sBAAsB,SAA0C;AAC9E,SAAO;AAAA,IACL,KAAK,QAAQ;AAAA,IACb,OAAO,QAAQ;AAAA,IACf,aAAa,QAAQ,eAAe,UAAU,QAAQ,MAAM,aAAa;AAAA,EAAA;AAE7E;;;;;;;;;;;;"}
|
|
@@ -7,7 +7,6 @@ export declare function findSurfaceOperation(operations: ResolvedOperation[], su
|
|
|
7
7
|
export declare function findSurfaceListOperation(operations: ResolvedOperation[], surfaceKey: string | undefined): ResolvedOperation | undefined;
|
|
8
8
|
export declare function findSurfaceDetailOperation(operations: ResolvedOperation[], surfaceKey: string | undefined): ResolvedOperation | undefined;
|
|
9
9
|
export declare function findSurfaceCollectionActions(operations: ResolvedOperation[], surfaceKey: string | undefined): ResolvedOperation[];
|
|
10
|
-
export declare function findSurfaceActions(operations: ResolvedOperation[], surfaceKey: string | undefined): ResolvedOperation[];
|
|
11
10
|
export declare function surfaceActionLabel(operation: ResolvedOperation): string;
|
|
12
11
|
export declare function findSurfaceEntityActions(operations: ResolvedOperation[], surfaceKey: string | undefined): ResolvedOperation[];
|
|
13
12
|
export declare function makeSurfaceDefinition(surface: ClickySurface): DomainDefinition;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clickyMetadata.d.ts","sourceRoot":"","sources":["../../src/rpc/clickyMetadata.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mBAAmB,EACnB,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,WAAW,EACX,iBAAiB,EAClB,MAAM,SAAS,CAAC;AAEjB,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,WAAW,GAAG,SAAS,GAAG,cAAc,GAAG,SAAS,CAE3F;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,WAAW,GAAG,SAAS,GAAG,aAAa,EAAE,CAEhF;AAED,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,IAAI,CAAC,iBAAiB,EAAE,WAAW,CAAC,GAC9C,mBAAmB,GAAG,SAAS,CAEjC;AAED,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,iBAAiB,EAAE,EAC/B,UAAU,EAAE,MAAM,GAAG,SAAS,GAC7B,iBAAiB,EAAE,CAKrB;AAED,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,iBAAiB,EAAE,EAC/B,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,SAAS,EAAE,CAAC,IAAI,EAAE,mBAAmB,KAAK,OAAO,GAChD,iBAAiB,GAAG,SAAS,CAK/B;AAED,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,iBAAiB,EAAE,EAC/B,UAAU,EAAE,MAAM,GAAG,SAAS,GAC7B,iBAAiB,GAAG,SAAS,CAM/B;AAED,wBAAgB,0BAA0B,CACxC,UAAU,EAAE,iBAAiB,EAAE,EAC/B,UAAU,EAAE,MAAM,GAAG,SAAS,GAC7B,iBAAiB,GAAG,SAAS,CAM/B;AAED,wBAAgB,4BAA4B,CAC1C,UAAU,EAAE,iBAAiB,EAAE,EAC/B,UAAU,EAAE,MAAM,GAAG,SAAS,GAC7B,iBAAiB,EAAE,CAKrB;
|
|
1
|
+
{"version":3,"file":"clickyMetadata.d.ts","sourceRoot":"","sources":["../../src/rpc/clickyMetadata.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mBAAmB,EACnB,cAAc,EACd,aAAa,EACb,gBAAgB,EAChB,WAAW,EACX,iBAAiB,EAClB,MAAM,SAAS,CAAC;AAEjB,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,WAAW,GAAG,SAAS,GAAG,cAAc,GAAG,SAAS,CAE3F;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,WAAW,GAAG,SAAS,GAAG,aAAa,EAAE,CAEhF;AAED,wBAAgB,sBAAsB,CACpC,SAAS,EAAE,IAAI,CAAC,iBAAiB,EAAE,WAAW,CAAC,GAC9C,mBAAmB,GAAG,SAAS,CAEjC;AAED,wBAAgB,yBAAyB,CACvC,UAAU,EAAE,iBAAiB,EAAE,EAC/B,UAAU,EAAE,MAAM,GAAG,SAAS,GAC7B,iBAAiB,EAAE,CAKrB;AAED,wBAAgB,oBAAoB,CAClC,UAAU,EAAE,iBAAiB,EAAE,EAC/B,UAAU,EAAE,MAAM,GAAG,SAAS,EAC9B,SAAS,EAAE,CAAC,IAAI,EAAE,mBAAmB,KAAK,OAAO,GAChD,iBAAiB,GAAG,SAAS,CAK/B;AAED,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,iBAAiB,EAAE,EAC/B,UAAU,EAAE,MAAM,GAAG,SAAS,GAC7B,iBAAiB,GAAG,SAAS,CAM/B;AAED,wBAAgB,0BAA0B,CACxC,UAAU,EAAE,iBAAiB,EAAE,EAC/B,UAAU,EAAE,MAAM,GAAG,SAAS,GAC7B,iBAAiB,GAAG,SAAS,CAM/B;AAED,wBAAgB,4BAA4B,CAC1C,UAAU,EAAE,iBAAiB,EAAE,EAC/B,UAAU,EAAE,MAAM,GAAG,SAAS,GAC7B,iBAAiB,EAAE,CAKrB;AAMD,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,iBAAiB,GAAG,MAAM,CAOvE;AAED,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,iBAAiB,EAAE,EAC/B,UAAU,EAAE,MAAM,GAAG,SAAS,GAC7B,iBAAiB,EAAE,CAKrB;AAED,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,aAAa,GAAG,gBAAgB,CAM9E"}
|
|
@@ -37,10 +37,10 @@ function findSurfaceDetailOperation(operations, surfaceKey) {
|
|
|
37
37
|
(meta) => meta.verb === "get" && meta.scope === "entity"
|
|
38
38
|
);
|
|
39
39
|
}
|
|
40
|
-
function
|
|
40
|
+
function findSurfaceCollectionActions(operations, surfaceKey) {
|
|
41
41
|
return filterOperationsBySurface(operations, surfaceKey).filter((operation) => {
|
|
42
42
|
const meta = getOperationClickyMeta(operation);
|
|
43
|
-
return meta != null && meta.
|
|
43
|
+
return meta != null && meta.scope === "collection" && meta.verb !== "list";
|
|
44
44
|
});
|
|
45
45
|
}
|
|
46
46
|
function surfaceActionLabel(operation) {
|
|
@@ -50,7 +50,7 @@ function surfaceActionLabel(operation) {
|
|
|
50
50
|
if (short && short !== "action") {
|
|
51
51
|
return short.charAt(0).toUpperCase() + short.slice(1);
|
|
52
52
|
}
|
|
53
|
-
return operation.operation.operationId || operation.path;
|
|
53
|
+
return operation.operation.summary || operation.operation.operationId || operation.path;
|
|
54
54
|
}
|
|
55
55
|
function findSurfaceEntityActions(operations, surfaceKey) {
|
|
56
56
|
return filterOperationsBySurface(operations, surfaceKey).filter((operation) => {
|
|
@@ -67,7 +67,7 @@ function makeSurfaceDefinition(surface) {
|
|
|
67
67
|
}
|
|
68
68
|
export {
|
|
69
69
|
filterOperationsBySurface,
|
|
70
|
-
|
|
70
|
+
findSurfaceCollectionActions,
|
|
71
71
|
findSurfaceDetailOperation,
|
|
72
72
|
findSurfaceEntityActions,
|
|
73
73
|
findSurfaceListOperation,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"clickyMetadata.js","sources":["../../src/rpc/clickyMetadata.ts"],"sourcesContent":["import type {\n ClickyOperationMeta,\n ClickySpecMeta,\n ClickySurface,\n DomainDefinition,\n OpenAPISpec,\n ResolvedOperation,\n} from \"./types\";\n\nexport function getClickySpecMeta(spec: OpenAPISpec | undefined): ClickySpecMeta | undefined {\n return spec?.[\"x-clicky\"];\n}\n\nexport function getClickySurfaces(spec: OpenAPISpec | undefined): ClickySurface[] {\n return getClickySpecMeta(spec)?.surfaces ?? [];\n}\n\nexport function getOperationClickyMeta(\n operation: Pick<ResolvedOperation, \"operation\">,\n): ClickyOperationMeta | undefined {\n return operation.operation[\"x-clicky\"];\n}\n\nexport function filterOperationsBySurface(\n operations: ResolvedOperation[],\n surfaceKey: string | undefined,\n): ResolvedOperation[] {\n if (!surfaceKey) return [];\n return operations.filter(\n (operation) => getOperationClickyMeta(operation)?.surface === surfaceKey,\n );\n}\n\nexport function findSurfaceOperation(\n operations: ResolvedOperation[],\n surfaceKey: string | undefined,\n predicate: (meta: ClickyOperationMeta) => boolean,\n): ResolvedOperation | undefined {\n return filterOperationsBySurface(operations, surfaceKey).find((operation) => {\n const meta = getOperationClickyMeta(operation);\n return meta != null && predicate(meta);\n });\n}\n\nexport function findSurfaceListOperation(\n operations: ResolvedOperation[],\n surfaceKey: string | undefined,\n): ResolvedOperation | undefined {\n return findSurfaceOperation(\n operations,\n surfaceKey,\n (meta) => meta.verb === \"list\" && meta.scope === \"collection\",\n );\n}\n\nexport function findSurfaceDetailOperation(\n operations: ResolvedOperation[],\n surfaceKey: string | undefined,\n): ResolvedOperation | undefined {\n return findSurfaceOperation(\n operations,\n surfaceKey,\n (meta) => meta.verb === \"get\" && meta.scope === \"entity\",\n );\n}\n\nexport function findSurfaceCollectionActions(\n operations: ResolvedOperation[],\n surfaceKey: string | undefined,\n): ResolvedOperation[] {\n return filterOperationsBySurface(operations, surfaceKey).filter((operation) => {\n const meta = getOperationClickyMeta(operation);\n return meta != null && meta.scope === \"collection\" && meta.verb !== \"list\";\n });\n}\n\n//
|
|
1
|
+
{"version":3,"file":"clickyMetadata.js","sources":["../../src/rpc/clickyMetadata.ts"],"sourcesContent":["import type {\n ClickyOperationMeta,\n ClickySpecMeta,\n ClickySurface,\n DomainDefinition,\n OpenAPISpec,\n ResolvedOperation,\n} from \"./types\";\n\nexport function getClickySpecMeta(spec: OpenAPISpec | undefined): ClickySpecMeta | undefined {\n return spec?.[\"x-clicky\"];\n}\n\nexport function getClickySurfaces(spec: OpenAPISpec | undefined): ClickySurface[] {\n return getClickySpecMeta(spec)?.surfaces ?? [];\n}\n\nexport function getOperationClickyMeta(\n operation: Pick<ResolvedOperation, \"operation\">,\n): ClickyOperationMeta | undefined {\n return operation.operation[\"x-clicky\"];\n}\n\nexport function filterOperationsBySurface(\n operations: ResolvedOperation[],\n surfaceKey: string | undefined,\n): ResolvedOperation[] {\n if (!surfaceKey) return [];\n return operations.filter(\n (operation) => getOperationClickyMeta(operation)?.surface === surfaceKey,\n );\n}\n\nexport function findSurfaceOperation(\n operations: ResolvedOperation[],\n surfaceKey: string | undefined,\n predicate: (meta: ClickyOperationMeta) => boolean,\n): ResolvedOperation | undefined {\n return filterOperationsBySurface(operations, surfaceKey).find((operation) => {\n const meta = getOperationClickyMeta(operation);\n return meta != null && predicate(meta);\n });\n}\n\nexport function findSurfaceListOperation(\n operations: ResolvedOperation[],\n surfaceKey: string | undefined,\n): ResolvedOperation | undefined {\n return findSurfaceOperation(\n operations,\n surfaceKey,\n (meta) => meta.verb === \"list\" && meta.scope === \"collection\",\n );\n}\n\nexport function findSurfaceDetailOperation(\n operations: ResolvedOperation[],\n surfaceKey: string | undefined,\n): ResolvedOperation | undefined {\n return findSurfaceOperation(\n operations,\n surfaceKey,\n (meta) => meta.verb === \"get\" && meta.scope === \"entity\",\n );\n}\n\nexport function findSurfaceCollectionActions(\n operations: ResolvedOperation[],\n surfaceKey: string | undefined,\n): ResolvedOperation[] {\n return filterOperationsBySurface(operations, surfaceKey).filter((operation) => {\n const meta = getOperationClickyMeta(operation);\n return meta != null && meta.scope === \"collection\" && meta.verb !== \"list\";\n });\n}\n\n// surfaceActionLabel prefers the short clicky actionName/verb (capitalized) over\n// the OpenAPI summary, which is often a full sentence. Without surface metadata\n// (a non-surface operation) it falls back to the summary, then the\n// operationId/path, so a button always has a label.\nexport function surfaceActionLabel(operation: ResolvedOperation): string {\n const meta = getOperationClickyMeta(operation);\n const short = meta?.actionName?.trim() || meta?.verb?.trim();\n if (short && short !== \"action\") {\n return short.charAt(0).toUpperCase() + short.slice(1);\n }\n return operation.operation.summary || operation.operation.operationId || operation.path;\n}\n\nexport function findSurfaceEntityActions(\n operations: ResolvedOperation[],\n surfaceKey: string | undefined,\n): ResolvedOperation[] {\n return filterOperationsBySurface(operations, surfaceKey).filter((operation) => {\n const meta = getOperationClickyMeta(operation);\n return meta != null && meta.scope === \"entity\" && meta.verb !== \"get\";\n });\n}\n\nexport function makeSurfaceDefinition(surface: ClickySurface): DomainDefinition {\n return {\n key: surface.key,\n title: surface.title,\n description: surface.description || `Manage ${surface.title.toLowerCase()} resources.`,\n };\n}\n"],"names":[],"mappings":"AASO,SAAS,kBAAkB,MAA2D;AAC3F,SAAO,6BAAO;AAChB;AAEO,SAAS,kBAAkB,MAAgD;AAJ3E;AAKL,WAAO,uBAAkB,IAAI,MAAtB,mBAAyB,aAAY,CAAA;AAC9C;AAEO,SAAS,uBACd,WACiC;AACjC,SAAO,UAAU,UAAU,UAAU;AACvC;AAEO,SAAS,0BACd,YACA,YACqB;AACrB,MAAI,CAAC,WAAY,QAAO,CAAA;AACxB,SAAO,WAAW;AAAA,IAChB,CAAC,cAAA;AApBE;AAoBY,2CAAuB,SAAS,MAAhC,mBAAmC,aAAY;AAAA;AAAA,EAAA;AAElE;AAEO,SAAS,qBACd,YACA,YACA,WAC+B;AAC/B,SAAO,0BAA0B,YAAY,UAAU,EAAE,KAAK,CAAC,cAAc;AAC3E,UAAM,OAAO,uBAAuB,SAAS;AAC7C,WAAO,QAAQ,QAAQ,UAAU,IAAI;AAAA,EACvC,CAAC;AACH;AAEO,SAAS,yBACd,YACA,YAC+B;AAC/B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,CAAC,SAAS,KAAK,SAAS,UAAU,KAAK,UAAU;AAAA,EAAA;AAErD;AAEO,SAAS,2BACd,YACA,YAC+B;AAC/B,SAAO;AAAA,IACL;AAAA,IACA;AAAA,IACA,CAAC,SAAS,KAAK,SAAS,SAAS,KAAK,UAAU;AAAA,EAAA;AAEpD;AAEO,SAAS,6BACd,YACA,YACqB;AACrB,SAAO,0BAA0B,YAAY,UAAU,EAAE,OAAO,CAAC,cAAc;AAC7E,UAAM,OAAO,uBAAuB,SAAS;AAC7C,WAAO,QAAQ,QAAQ,KAAK,UAAU,gBAAgB,KAAK,SAAS;AAAA,EACtE,CAAC;AACH;AAMO,SAAS,mBAAmB,WAAsC;AAvElE;AAwEL,QAAM,OAAO,uBAAuB,SAAS;AAC7C,QAAM,UAAQ,kCAAM,eAAN,mBAAkB,aAAU,kCAAM,SAAN,mBAAY;AACtD,MAAI,SAAS,UAAU,UAAU;AAC/B,WAAO,MAAM,OAAO,CAAC,EAAE,gBAAgB,MAAM,MAAM,CAAC;AAAA,EACtD;AACA,SAAO,UAAU,UAAU,WAAW,UAAU,UAAU,eAAe,UAAU;AACrF;AAEO,SAAS,yBACd,YACA,YACqB;AACrB,SAAO,0BAA0B,YAAY,UAAU,EAAE,OAAO,CAAC,cAAc;AAC7E,UAAM,OAAO,uBAAuB,SAAS;AAC7C,WAAO,QAAQ,QAAQ,KAAK,UAAU,YAAY,KAAK,SAAS;AAAA,EAClE,CAAC;AACH;AAEO,SAAS,sBAAsB,SAA0C;AAC9E,SAAO;AAAA,IACL,KAAK,QAAQ;AAAA,IACb,OAAO,QAAQ;AAAA,IACf,aAAa,QAAQ,eAAe,UAAU,QAAQ,MAAM,aAAa;AAAA,EAAA;AAE7E;"}
|
|
@@ -332,6 +332,7 @@ function clickyNodeToPlainText(node) {
|
|
|
332
332
|
exports.buildInitialParameterValues = buildInitialParameterValues;
|
|
333
333
|
exports.dataTablePaginationFromForm = dataTablePaginationFromForm;
|
|
334
334
|
exports.defaultValueForParameter = defaultValueForParameter;
|
|
335
|
+
exports.lookupOptionsToFieldOptions = lookupOptionsToFieldOptions;
|
|
335
336
|
exports.packParameterValues = packParameterValues;
|
|
336
337
|
exports.parametersToFormConfig = parametersToFormConfig;
|
|
337
338
|
exports.parseMultiFilterValue = parseMultiFilterValue;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formMetadata.cjs","sources":["../../src/rpc/formMetadata.ts"],"sourcesContent":["import { useEffect, useState, type Dispatch, type SetStateAction } from \"react\";\nimport type {\n FilterBarFilter,\n FilterBarMultiFilterMode,\n FilterBarRangeProps,\n FilterBarSearchProps,\n} from \"../components/FilterBar\";\nimport type { DataTablePagination } from \"../data/DataTable\";\nimport type {\n ExecutionResponse,\n OpenAPIParameter,\n OperationLookupFilter,\n OperationLookupResponse,\n} from \"./types\";\nimport { isPositionalParam, parameterPlaceholder } from \"./types\";\n\nexport type ParameterValues = Record<string, string>;\nexport type ParameterValuesSetter = Dispatch<SetStateAction<ParameterValues>>;\n\n// ParameterPagination plumbs limit/offset query parameters into the\n// DataTable's pagination footer. The UI exposes both as the\n// {pageSize, pageIndex} tuple but here we keep raw string limit/offset\n// values so the executor sees exactly what the operation declared.\nexport type ParameterPagination = {\n limitParam: string; // parameter name on the operation, e.g. \"limit\"\n offsetParam: string;\n limitValue: string;\n offsetValue: string;\n setLimit: (next: string) => void;\n setOffset: (next: string) => void;\n};\n\nexport type ParameterFormConfig = {\n filters: FilterBarFilter[];\n search?: FilterBarSearchProps;\n timeRange?: FilterBarRangeProps;\n pagination?: ParameterPagination;\n};\nexport type ParameterFormOptions = {\n includeLocations?: OpenAPIParameter[\"in\"][];\n lookup?: OperationLookupResponse | undefined;\n lockedValues?: ParameterValues | undefined;\n hideLocked?: boolean;\n};\n\nexport function titleCase(value: string) {\n return value\n .split(/[-_]/)\n .filter(Boolean)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\" \");\n}\n\nexport function defaultValueForParameter(param: OpenAPIParameter, method: string): string {\n if (method.toUpperCase() === \"GET\" && param.in === \"query\" && !param.required) {\n return \"\";\n }\n const fallback = param.in === \"path\" ? \"\" : undefined;\n const value = param.schema?.default ?? fallback;\n if (typeof value === \"boolean\") {\n return value ? \"true\" : \"false\";\n }\n if (Array.isArray(value) || (value != null && typeof value === \"object\")) {\n return \"\";\n }\n if (value == null) {\n return \"\";\n }\n return String(value);\n}\n\nexport function buildInitialParameterValues(\n parameters: OpenAPIParameter[],\n method: string,\n lockedValues: ParameterValues = {},\n initialValues: ParameterValues = {},\n): ParameterValues {\n const values = Object.fromEntries(\n parameters.map((param) => [param.name, defaultValueForParameter(param, method)]),\n );\n return { ...values, ...initialValues, ...lockedValues };\n}\n\nexport function dataTablePaginationFromForm(\n pagination: ParameterPagination | undefined,\n response: Pick<ExecutionResponse, \"pagination\"> | null | undefined,\n): DataTablePagination | undefined {\n if (!pagination) return undefined;\n\n const pageSize = positiveInt(pagination.limitValue) ?? response?.pagination?.limit ?? 25;\n const offset = nonNegativeInt(pagination.offsetValue) ?? response?.pagination?.offset ?? 0;\n const page = Math.floor(offset / pageSize);\n\n return {\n page,\n pageSize,\n ...(response?.pagination?.total !== undefined ? { total: response.pagination.total } : {}),\n onPageChange: (next: number) => {\n if (positiveInt(pagination.limitValue) == null) {\n pagination.setLimit(String(pageSize));\n }\n pagination.setOffset(String(Math.max(next, 0) * pageSize));\n },\n onPageSizeChange: (next: number) => {\n pagination.setLimit(String(next));\n pagination.setOffset(\"0\");\n },\n };\n}\n\nexport function pruneParameterValues(values: ParameterValues) {\n return Object.fromEntries(Object.entries(values).filter(([, value]) => value !== \"\"));\n}\n\nexport function packParameterValues(\n values: ParameterValues,\n parameters: OpenAPIParameter[],\n): ParameterValues {\n const positionalNames = new Set(\n parameters\n .filter((param) => param.in !== \"path\" && isPositionalParam(param))\n .map((p) => p.name),\n );\n const params: ParameterValues = {};\n const args: string[] = [];\n\n for (const [key, value] of Object.entries(values)) {\n if (!value) continue;\n if (positionalNames.has(key)) {\n args.push(value);\n } else {\n params[key] = value;\n }\n }\n\n if (args.length > 0) {\n params.args = args.join(\",\");\n }\n\n return params;\n}\n\nexport function parametersToFormConfig(\n parameters: OpenAPIParameter[],\n values: ParameterValues,\n setValues: ParameterValuesSetter,\n options: ParameterFormOptions = {},\n): ParameterFormConfig {\n const emitFilters: FilterBarFilter[] = [];\n const lookupFilters = options.lookup?.filters ?? {};\n const includeLocations = new Set(options.includeLocations ?? [\"path\", \"query\", \"header\"]);\n const lockedValues = options.lockedValues ?? {};\n const hideLocked = options.hideLocked ?? false;\n\n // Pull limit/offset out of the filter loop entirely — they drive pagination,\n // not filter pills. Roles come from server-side `paramRole` (see\n // clicky/rpc/openapi.go); the older \"named limit on a GET\" heuristic is\n // intentionally not duplicated here so the server stays the single source\n // of truth for parameter classification.\n const limitParam = parameters.find((p) => p[\"x-clicky\"]?.role === \"limit\");\n const offsetParam = parameters.find((p) => p[\"x-clicky\"]?.role === \"offset\");\n const paginationOmitNames = new Set<string>();\n if (limitParam) paginationOmitNames.add(limitParam.name);\n if (offsetParam) paginationOmitNames.add(offsetParam.name);\n\n // The search-role param drives the FilterBar's dedicated search input rather\n // than a filter chip; pull it out of the chip loop the same way pagination is.\n const searchParam = parameters.find(\n (p) => p[\"x-clicky\"]?.role === \"search\" && includeLocations.has(p.in),\n );\n const omitNames = new Set(paginationOmitNames);\n if (searchParam) omitNames.add(searchParam.name);\n\n // Time-range first looks for server-stamped roles, then falls back to the\n // existing lookup-driven \"from\"/\"to\" detection so older specs keep working.\n const roleRangeStart = parameters.find((p) => p[\"x-clicky\"]?.role === \"time-from\");\n const roleRangeEnd = parameters.find((p) => p[\"x-clicky\"]?.role === \"time-to\");\n const rangeStart =\n roleRangeStart ??\n parameters.find(\n (param) =>\n includeLocations.has(param.in) &&\n param.in === \"query\" &&\n lookupFilters[param.name]?.type === \"from\",\n );\n const rangeEnd =\n roleRangeEnd ??\n parameters.find(\n (param) =>\n includeLocations.has(param.in) &&\n param.in === \"query\" &&\n lookupFilters[param.name]?.type === \"to\",\n );\n const hasTimeRange = rangeStart != null && rangeEnd != null;\n\n for (const param of parameters) {\n if (!includeLocations.has(param.in)) continue;\n if (omitNames.has(param.name)) continue;\n if (hasTimeRange && (param.name === rangeStart?.name || param.name === rangeEnd?.name)) {\n continue;\n }\n\n const disabled = Object.prototype.hasOwnProperty.call(lockedValues, param.name);\n if (disabled && hideLocked) continue;\n const value = disabled ? (lockedValues[param.name] ?? \"\") : (values[param.name] ?? \"\");\n const label = lookupFilters[param.name]?.label ?? titleCase(param.name);\n // Only an explicit placeholder is rendered — never synthesize one. The\n // field already carries `label`, so a fallback placeholder is redundant\n // and generic defaults (e.g. \"value-1, value-2\") read as fake data.\n const placeholder = parameterPlaceholder(param);\n const placeholderProp = placeholder !== undefined ? { placeholder } : {};\n const onChange = (next: string | boolean) => {\n if (disabled) return;\n const stringValue = typeof next === \"boolean\" ? (next ? \"true\" : \"false\") : next;\n setValues((current) => ({ ...current, [param.name]: stringValue }));\n };\n\n const schema = param.schema;\n const lookupFilter = lookupFilters[param.name];\n\n if (lookupFilter?.type === \"multi-filter\" && param.in === \"query\") {\n emitFilters.push({\n key: param.name,\n kind: \"multi\",\n label,\n value: parseMultiFilterValue(value),\n disabled,\n options: lookupOptionsToFieldOptions(lookupFilter),\n onChange: (next) =>\n setValues((current) => ({\n ...current,\n [param.name]: serializeMultiFilterValue(next),\n })),\n });\n continue;\n }\n\n if (schema?.enum) {\n emitFilters.push({\n key: param.name,\n kind: \"enum\",\n label,\n value,\n disabled,\n options: schema.enum.map((item) => ({\n value: String(item),\n label: String(item),\n })),\n onChange: (next) => onChange(next),\n });\n continue;\n }\n\n if (lookupFilter?.type === \"bool\" || schema?.type === \"boolean\") {\n emitFilters.push({\n key: param.name,\n kind: \"boolean\",\n label,\n value: value === \"true\",\n disabled,\n onChange: (next) => onChange(next),\n });\n continue;\n }\n\n if (lookupFilter != null && param.in === \"query\") {\n if (lookupFilter.multi) {\n emitFilters.push({\n key: param.name,\n kind: \"lookup-multi\",\n label,\n value: splitCommaValues(value),\n disabled,\n options: lookupOptionsToFieldOptions(lookupFilter),\n ...placeholderProp,\n onChange: (next) =>\n setValues((current) => ({ ...current, [param.name]: next.join(\",\") })),\n });\n continue;\n }\n\n emitFilters.push({\n key: param.name,\n kind: \"lookup\",\n label,\n value,\n disabled,\n options: lookupOptionsToFieldOptions(lookupFilter),\n ...placeholderProp,\n inputType:\n lookupFilter.type === \"number\"\n ? \"number\"\n : lookupFilter.type === \"date\"\n ? \"date\"\n : \"text\",\n onChange: (next) => onChange(next),\n });\n continue;\n }\n\n emitFilters.push({\n key: param.name,\n kind: \"text\",\n label,\n value,\n disabled,\n ...placeholderProp,\n onChange: (next) => onChange(next),\n });\n }\n\n const config: ParameterFormConfig = { filters: emitFilters };\n if (searchParam) {\n const searchDisabled = Object.prototype.hasOwnProperty.call(lockedValues, searchParam.name);\n const searchValue = searchDisabled\n ? (lockedValues[searchParam.name] ?? \"\")\n : (values[searchParam.name] ?? \"\");\n const searchPlaceholder = parameterPlaceholder(searchParam);\n config.search = {\n value: searchValue,\n onChange: (next) => {\n if (searchDisabled) return;\n setValues((current) => ({ ...current, [searchParam.name]: next }));\n },\n ...(searchPlaceholder ? { placeholder: searchPlaceholder } : {}),\n ariaLabel: lookupFilters[searchParam.name]?.label ?? titleCase(searchParam.name),\n };\n }\n if (limitParam && offsetParam) {\n config.pagination = {\n limitParam: limitParam.name,\n offsetParam: offsetParam.name,\n limitValue: values[limitParam.name] ?? \"\",\n offsetValue: values[offsetParam.name] ?? \"\",\n setLimit: (next) => setValues((current) => ({ ...current, [limitParam.name]: next })),\n setOffset: (next) => setValues((current) => ({ ...current, [offsetParam.name]: next })),\n };\n }\n if (hasTimeRange && rangeStart != null && rangeEnd != null) {\n const rangeStartMeta = lookupFilters[rangeStart.name];\n const rangeEndMeta = lookupFilters[rangeEnd.name];\n const rangeMeta = rangeStartMeta ?? rangeEndMeta;\n config.timeRange = {\n from: values[rangeStart.name] ?? \"\",\n to: values[rangeEnd.name] ?? \"\",\n onApply: (from, to) =>\n setValues((current) => ({\n ...current,\n [rangeStart.name]: from,\n [rangeEnd.name]: to,\n })),\n ...(rangeMeta?.presets ? { presets: rangeMeta.presets } : {}),\n timeEnabled: rangeMeta?.timeEnabled ?? false,\n ...(rangeMeta?.timeZone ? { timeZone: rangeMeta.timeZone } : {}),\n ...(rangeMeta?.timeZones ? { timeZones: rangeMeta.timeZones } : {}),\n ...(rangeStart.description ? { fromPlaceholder: rangeStart.description } : {}),\n ...(rangeEnd.description ? { toPlaceholder: rangeEnd.description } : {}),\n };\n }\n\n return config;\n}\n\nexport function useDebouncedRecord<T>(value: T, delayMs: number) {\n const [debounced, setDebounced] = useState(value);\n\n useEffect(() => {\n const timeoutId = window.setTimeout(() => setDebounced(value), delayMs);\n return () => window.clearTimeout(timeoutId);\n }, [delayMs, value]);\n\n return debounced;\n}\n\nexport function parseMultiFilterValue(value: string): Record<string, FilterBarMultiFilterMode> {\n const parsed: Record<string, FilterBarMultiFilterMode> = {};\n for (const item of splitCommaValues(value)) {\n if (item.startsWith(\"!\") && item.length > 1) {\n parsed[item.slice(1)] = \"exclude\";\n } else {\n parsed[item] = \"include\";\n }\n }\n return parsed;\n}\n\nexport function serializeMultiFilterValue(value: Record<string, FilterBarMultiFilterMode>): string {\n return Object.entries(value)\n .flatMap(([key, mode]) => {\n if (mode === \"include\") return [key];\n if (mode === \"exclude\") return [`!${key}`];\n return [];\n })\n .join(\",\");\n}\n\nfunction splitCommaValues(value: string) {\n return value\n .split(\",\")\n .map((item) => item.trim())\n .filter(Boolean);\n}\n\nfunction positiveInt(value: string | undefined): number | undefined {\n const parsed = parseInt(value ?? \"\", 10);\n return Number.isFinite(parsed) && parsed > 0 ? parsed : undefined;\n}\n\nfunction nonNegativeInt(value: string | undefined): number | undefined {\n const parsed = parseInt(value ?? \"\", 10);\n return Number.isFinite(parsed) && parsed >= 0 ? parsed : undefined;\n}\n\nfunction lookupOptionsToFieldOptions(filter: OperationLookupFilter) {\n const merged = new Map<string, { label?: string; title?: string }>();\n\n for (const [value, node] of Object.entries(filter.options ?? {})) {\n merged.set(value, {\n label: clickyNodeToPlainText(node) || value,\n title: clickyNodeToPlainText(node) || value,\n });\n }\n\n for (const [value, node] of Object.entries(filter.selected ?? {})) {\n if (!merged.has(value)) {\n merged.set(value, {\n label: clickyNodeToPlainText(node) || value,\n title: clickyNodeToPlainText(node) || value,\n });\n }\n }\n\n return Array.from(merged.entries()).map(([value, meta]) => ({\n value,\n label: meta.label ?? value,\n title: meta.title ?? value,\n }));\n}\n\ntype PlainTextClickyNode = {\n plain?: string;\n text?: string;\n children?: PlainTextClickyNode[];\n tooltip?: { plain?: string; text?: string };\n};\n\nfunction clickyNodeToPlainText(node: PlainTextClickyNode | null | undefined): string {\n if (node == null) return \"\";\n if (node.plain) return node.plain;\n if (node.text) return node.text;\n return (node.children ?? []).map((child) => clickyNodeToPlainText(child)).join(\"\");\n}\n"],"names":["isPositionalParam","_a","parameterPlaceholder","useState","useEffect"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"formMetadata.cjs","sources":["../../src/rpc/formMetadata.ts"],"sourcesContent":["import { useEffect, useState, type Dispatch, type SetStateAction } from \"react\";\nimport type {\n FilterBarFilter,\n FilterBarMultiFilterMode,\n FilterBarRangeProps,\n FilterBarSearchProps,\n} from \"../components/FilterBar\";\nimport type { DataTablePagination } from \"../data/DataTable\";\nimport type {\n ExecutionResponse,\n OpenAPIParameter,\n OperationLookupFilter,\n OperationLookupResponse,\n} from \"./types\";\nimport { isPositionalParam, parameterPlaceholder } from \"./types\";\n\nexport type ParameterValues = Record<string, string>;\nexport type ParameterValuesSetter = Dispatch<SetStateAction<ParameterValues>>;\n\n// ParameterPagination plumbs limit/offset query parameters into the\n// DataTable's pagination footer. The UI exposes both as the\n// {pageSize, pageIndex} tuple but here we keep raw string limit/offset\n// values so the executor sees exactly what the operation declared.\nexport type ParameterPagination = {\n limitParam: string; // parameter name on the operation, e.g. \"limit\"\n offsetParam: string;\n limitValue: string;\n offsetValue: string;\n setLimit: (next: string) => void;\n setOffset: (next: string) => void;\n};\n\nexport type ParameterFormConfig = {\n filters: FilterBarFilter[];\n search?: FilterBarSearchProps;\n timeRange?: FilterBarRangeProps;\n pagination?: ParameterPagination;\n};\nexport type ParameterFormOptions = {\n includeLocations?: OpenAPIParameter[\"in\"][];\n lookup?: OperationLookupResponse | undefined;\n lockedValues?: ParameterValues | undefined;\n hideLocked?: boolean;\n};\n\nexport function titleCase(value: string) {\n return value\n .split(/[-_]/)\n .filter(Boolean)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\" \");\n}\n\nexport function defaultValueForParameter(param: OpenAPIParameter, method: string): string {\n if (method.toUpperCase() === \"GET\" && param.in === \"query\" && !param.required) {\n return \"\";\n }\n const fallback = param.in === \"path\" ? \"\" : undefined;\n const value = param.schema?.default ?? fallback;\n if (typeof value === \"boolean\") {\n return value ? \"true\" : \"false\";\n }\n if (Array.isArray(value) || (value != null && typeof value === \"object\")) {\n return \"\";\n }\n if (value == null) {\n return \"\";\n }\n return String(value);\n}\n\nexport function buildInitialParameterValues(\n parameters: OpenAPIParameter[],\n method: string,\n lockedValues: ParameterValues = {},\n initialValues: ParameterValues = {},\n): ParameterValues {\n const values = Object.fromEntries(\n parameters.map((param) => [param.name, defaultValueForParameter(param, method)]),\n );\n return { ...values, ...initialValues, ...lockedValues };\n}\n\nexport function dataTablePaginationFromForm(\n pagination: ParameterPagination | undefined,\n response: Pick<ExecutionResponse, \"pagination\"> | null | undefined,\n): DataTablePagination | undefined {\n if (!pagination) return undefined;\n\n const pageSize = positiveInt(pagination.limitValue) ?? response?.pagination?.limit ?? 25;\n const offset = nonNegativeInt(pagination.offsetValue) ?? response?.pagination?.offset ?? 0;\n const page = Math.floor(offset / pageSize);\n\n return {\n page,\n pageSize,\n ...(response?.pagination?.total !== undefined ? { total: response.pagination.total } : {}),\n onPageChange: (next: number) => {\n if (positiveInt(pagination.limitValue) == null) {\n pagination.setLimit(String(pageSize));\n }\n pagination.setOffset(String(Math.max(next, 0) * pageSize));\n },\n onPageSizeChange: (next: number) => {\n pagination.setLimit(String(next));\n pagination.setOffset(\"0\");\n },\n };\n}\n\nexport function pruneParameterValues(values: ParameterValues) {\n return Object.fromEntries(Object.entries(values).filter(([, value]) => value !== \"\"));\n}\n\nexport function packParameterValues(\n values: ParameterValues,\n parameters: OpenAPIParameter[],\n): ParameterValues {\n const positionalNames = new Set(\n parameters\n .filter((param) => param.in !== \"path\" && isPositionalParam(param))\n .map((p) => p.name),\n );\n const params: ParameterValues = {};\n const args: string[] = [];\n\n for (const [key, value] of Object.entries(values)) {\n if (!value) continue;\n if (positionalNames.has(key)) {\n args.push(value);\n } else {\n params[key] = value;\n }\n }\n\n if (args.length > 0) {\n params.args = args.join(\",\");\n }\n\n return params;\n}\n\nexport function parametersToFormConfig(\n parameters: OpenAPIParameter[],\n values: ParameterValues,\n setValues: ParameterValuesSetter,\n options: ParameterFormOptions = {},\n): ParameterFormConfig {\n const emitFilters: FilterBarFilter[] = [];\n const lookupFilters = options.lookup?.filters ?? {};\n const includeLocations = new Set(options.includeLocations ?? [\"path\", \"query\", \"header\"]);\n const lockedValues = options.lockedValues ?? {};\n const hideLocked = options.hideLocked ?? false;\n\n // Pull limit/offset out of the filter loop entirely — they drive pagination,\n // not filter pills. Roles come from server-side `paramRole` (see\n // clicky/rpc/openapi.go); the older \"named limit on a GET\" heuristic is\n // intentionally not duplicated here so the server stays the single source\n // of truth for parameter classification.\n const limitParam = parameters.find((p) => p[\"x-clicky\"]?.role === \"limit\");\n const offsetParam = parameters.find((p) => p[\"x-clicky\"]?.role === \"offset\");\n const paginationOmitNames = new Set<string>();\n if (limitParam) paginationOmitNames.add(limitParam.name);\n if (offsetParam) paginationOmitNames.add(offsetParam.name);\n\n // The search-role param drives the FilterBar's dedicated search input rather\n // than a filter chip; pull it out of the chip loop the same way pagination is.\n const searchParam = parameters.find(\n (p) => p[\"x-clicky\"]?.role === \"search\" && includeLocations.has(p.in),\n );\n const omitNames = new Set(paginationOmitNames);\n if (searchParam) omitNames.add(searchParam.name);\n\n // Time-range first looks for server-stamped roles, then falls back to the\n // existing lookup-driven \"from\"/\"to\" detection so older specs keep working.\n const roleRangeStart = parameters.find((p) => p[\"x-clicky\"]?.role === \"time-from\");\n const roleRangeEnd = parameters.find((p) => p[\"x-clicky\"]?.role === \"time-to\");\n const rangeStart =\n roleRangeStart ??\n parameters.find(\n (param) =>\n includeLocations.has(param.in) &&\n param.in === \"query\" &&\n lookupFilters[param.name]?.type === \"from\",\n );\n const rangeEnd =\n roleRangeEnd ??\n parameters.find(\n (param) =>\n includeLocations.has(param.in) &&\n param.in === \"query\" &&\n lookupFilters[param.name]?.type === \"to\",\n );\n const hasTimeRange = rangeStart != null && rangeEnd != null;\n\n for (const param of parameters) {\n if (!includeLocations.has(param.in)) continue;\n if (omitNames.has(param.name)) continue;\n if (hasTimeRange && (param.name === rangeStart?.name || param.name === rangeEnd?.name)) {\n continue;\n }\n\n const disabled = Object.prototype.hasOwnProperty.call(lockedValues, param.name);\n if (disabled && hideLocked) continue;\n const value = disabled ? (lockedValues[param.name] ?? \"\") : (values[param.name] ?? \"\");\n const label = lookupFilters[param.name]?.label ?? titleCase(param.name);\n // Only an explicit placeholder is rendered — never synthesize one. The\n // field already carries `label`, so a fallback placeholder is redundant\n // and generic defaults (e.g. \"value-1, value-2\") read as fake data.\n const placeholder = parameterPlaceholder(param);\n const placeholderProp = placeholder !== undefined ? { placeholder } : {};\n const onChange = (next: string | boolean) => {\n if (disabled) return;\n const stringValue = typeof next === \"boolean\" ? (next ? \"true\" : \"false\") : next;\n setValues((current) => ({ ...current, [param.name]: stringValue }));\n };\n\n const schema = param.schema;\n const lookupFilter = lookupFilters[param.name];\n\n if (lookupFilter?.type === \"multi-filter\" && param.in === \"query\") {\n emitFilters.push({\n key: param.name,\n kind: \"multi\",\n label,\n value: parseMultiFilterValue(value),\n disabled,\n options: lookupOptionsToFieldOptions(lookupFilter),\n onChange: (next) =>\n setValues((current) => ({\n ...current,\n [param.name]: serializeMultiFilterValue(next),\n })),\n });\n continue;\n }\n\n if (schema?.enum) {\n emitFilters.push({\n key: param.name,\n kind: \"enum\",\n label,\n value,\n disabled,\n options: schema.enum.map((item) => ({\n value: String(item),\n label: String(item),\n })),\n onChange: (next) => onChange(next),\n });\n continue;\n }\n\n if (lookupFilter?.type === \"bool\" || schema?.type === \"boolean\") {\n emitFilters.push({\n key: param.name,\n kind: \"boolean\",\n label,\n value: value === \"true\",\n disabled,\n onChange: (next) => onChange(next),\n });\n continue;\n }\n\n if (lookupFilter != null && param.in === \"query\") {\n if (lookupFilter.multi) {\n emitFilters.push({\n key: param.name,\n kind: \"lookup-multi\",\n label,\n value: splitCommaValues(value),\n disabled,\n options: lookupOptionsToFieldOptions(lookupFilter),\n ...placeholderProp,\n onChange: (next) =>\n setValues((current) => ({ ...current, [param.name]: next.join(\",\") })),\n });\n continue;\n }\n\n emitFilters.push({\n key: param.name,\n kind: \"lookup\",\n label,\n value,\n disabled,\n options: lookupOptionsToFieldOptions(lookupFilter),\n ...placeholderProp,\n inputType:\n lookupFilter.type === \"number\"\n ? \"number\"\n : lookupFilter.type === \"date\"\n ? \"date\"\n : \"text\",\n onChange: (next) => onChange(next),\n });\n continue;\n }\n\n emitFilters.push({\n key: param.name,\n kind: \"text\",\n label,\n value,\n disabled,\n ...placeholderProp,\n onChange: (next) => onChange(next),\n });\n }\n\n const config: ParameterFormConfig = { filters: emitFilters };\n if (searchParam) {\n const searchDisabled = Object.prototype.hasOwnProperty.call(lockedValues, searchParam.name);\n const searchValue = searchDisabled\n ? (lockedValues[searchParam.name] ?? \"\")\n : (values[searchParam.name] ?? \"\");\n const searchPlaceholder = parameterPlaceholder(searchParam);\n config.search = {\n value: searchValue,\n onChange: (next) => {\n if (searchDisabled) return;\n setValues((current) => ({ ...current, [searchParam.name]: next }));\n },\n ...(searchPlaceholder ? { placeholder: searchPlaceholder } : {}),\n ariaLabel: lookupFilters[searchParam.name]?.label ?? titleCase(searchParam.name),\n };\n }\n if (limitParam && offsetParam) {\n config.pagination = {\n limitParam: limitParam.name,\n offsetParam: offsetParam.name,\n limitValue: values[limitParam.name] ?? \"\",\n offsetValue: values[offsetParam.name] ?? \"\",\n setLimit: (next) => setValues((current) => ({ ...current, [limitParam.name]: next })),\n setOffset: (next) => setValues((current) => ({ ...current, [offsetParam.name]: next })),\n };\n }\n if (hasTimeRange && rangeStart != null && rangeEnd != null) {\n const rangeStartMeta = lookupFilters[rangeStart.name];\n const rangeEndMeta = lookupFilters[rangeEnd.name];\n const rangeMeta = rangeStartMeta ?? rangeEndMeta;\n config.timeRange = {\n from: values[rangeStart.name] ?? \"\",\n to: values[rangeEnd.name] ?? \"\",\n onApply: (from, to) =>\n setValues((current) => ({\n ...current,\n [rangeStart.name]: from,\n [rangeEnd.name]: to,\n })),\n ...(rangeMeta?.presets ? { presets: rangeMeta.presets } : {}),\n timeEnabled: rangeMeta?.timeEnabled ?? false,\n ...(rangeMeta?.timeZone ? { timeZone: rangeMeta.timeZone } : {}),\n ...(rangeMeta?.timeZones ? { timeZones: rangeMeta.timeZones } : {}),\n ...(rangeStart.description ? { fromPlaceholder: rangeStart.description } : {}),\n ...(rangeEnd.description ? { toPlaceholder: rangeEnd.description } : {}),\n };\n }\n\n return config;\n}\n\nexport function useDebouncedRecord<T>(value: T, delayMs: number) {\n const [debounced, setDebounced] = useState(value);\n\n useEffect(() => {\n const timeoutId = window.setTimeout(() => setDebounced(value), delayMs);\n return () => window.clearTimeout(timeoutId);\n }, [delayMs, value]);\n\n return debounced;\n}\n\nexport function parseMultiFilterValue(value: string): Record<string, FilterBarMultiFilterMode> {\n const parsed: Record<string, FilterBarMultiFilterMode> = {};\n for (const item of splitCommaValues(value)) {\n if (item.startsWith(\"!\") && item.length > 1) {\n parsed[item.slice(1)] = \"exclude\";\n } else {\n parsed[item] = \"include\";\n }\n }\n return parsed;\n}\n\nexport function serializeMultiFilterValue(value: Record<string, FilterBarMultiFilterMode>): string {\n return Object.entries(value)\n .flatMap(([key, mode]) => {\n if (mode === \"include\") return [key];\n if (mode === \"exclude\") return [`!${key}`];\n return [];\n })\n .join(\",\");\n}\n\nfunction splitCommaValues(value: string) {\n return value\n .split(\",\")\n .map((item) => item.trim())\n .filter(Boolean);\n}\n\nfunction positiveInt(value: string | undefined): number | undefined {\n const parsed = parseInt(value ?? \"\", 10);\n return Number.isFinite(parsed) && parsed > 0 ? parsed : undefined;\n}\n\nfunction nonNegativeInt(value: string | undefined): number | undefined {\n const parsed = parseInt(value ?? \"\", 10);\n return Number.isFinite(parsed) && parsed >= 0 ? parsed : undefined;\n}\n\nexport function lookupOptionsToFieldOptions(filter: OperationLookupFilter) {\n const merged = new Map<string, { label?: string; title?: string }>();\n\n for (const [value, node] of Object.entries(filter.options ?? {})) {\n merged.set(value, {\n label: clickyNodeToPlainText(node) || value,\n title: clickyNodeToPlainText(node) || value,\n });\n }\n\n for (const [value, node] of Object.entries(filter.selected ?? {})) {\n if (!merged.has(value)) {\n merged.set(value, {\n label: clickyNodeToPlainText(node) || value,\n title: clickyNodeToPlainText(node) || value,\n });\n }\n }\n\n return Array.from(merged.entries()).map(([value, meta]) => ({\n value,\n label: meta.label ?? value,\n title: meta.title ?? value,\n }));\n}\n\ntype PlainTextClickyNode = {\n plain?: string;\n text?: string;\n children?: PlainTextClickyNode[];\n tooltip?: { plain?: string; text?: string };\n};\n\nfunction clickyNodeToPlainText(node: PlainTextClickyNode | null | undefined): string {\n if (node == null) return \"\";\n if (node.plain) return node.plain;\n if (node.text) return node.text;\n return (node.children ?? []).map((child) => clickyNodeToPlainText(child)).join(\"\");\n}\n"],"names":["isPositionalParam","_a","parameterPlaceholder","useState","useEffect"],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Dispatch, SetStateAction } from 'react';
|
|
2
2
|
import { FilterBarFilter, FilterBarMultiFilterMode, FilterBarRangeProps, FilterBarSearchProps } from '../components/FilterBar';
|
|
3
3
|
import { DataTablePagination } from '../data/DataTable';
|
|
4
|
-
import { ExecutionResponse, OpenAPIParameter, OperationLookupResponse } from './types';
|
|
4
|
+
import { ExecutionResponse, OpenAPIParameter, OperationLookupFilter, OperationLookupResponse } from './types';
|
|
5
5
|
export type ParameterValues = Record<string, string>;
|
|
6
6
|
export type ParameterValuesSetter = Dispatch<SetStateAction<ParameterValues>>;
|
|
7
7
|
export type ParameterPagination = {
|
|
@@ -36,4 +36,9 @@ export declare function parametersToFormConfig(parameters: OpenAPIParameter[], v
|
|
|
36
36
|
export declare function useDebouncedRecord<T>(value: T, delayMs: number): T;
|
|
37
37
|
export declare function parseMultiFilterValue(value: string): Record<string, FilterBarMultiFilterMode>;
|
|
38
38
|
export declare function serializeMultiFilterValue(value: Record<string, FilterBarMultiFilterMode>): string;
|
|
39
|
+
export declare function lookupOptionsToFieldOptions(filter: OperationLookupFilter): {
|
|
40
|
+
value: string;
|
|
41
|
+
label: string;
|
|
42
|
+
title: string;
|
|
43
|
+
}[];
|
|
39
44
|
//# sourceMappingURL=formMetadata.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formMetadata.d.ts","sourceRoot":"","sources":["../../src/rpc/formMetadata.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,QAAQ,EAAE,KAAK,cAAc,EAAE,MAAM,OAAO,CAAC;AAChF,OAAO,KAAK,EACV,eAAe,EACf,wBAAwB,EACxB,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,KAAK,EACV,iBAAiB,EACjB,gBAAgB,
|
|
1
|
+
{"version":3,"file":"formMetadata.d.ts","sourceRoot":"","sources":["../../src/rpc/formMetadata.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuB,KAAK,QAAQ,EAAE,KAAK,cAAc,EAAE,MAAM,OAAO,CAAC;AAChF,OAAO,KAAK,EACV,eAAe,EACf,wBAAwB,EACxB,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC7D,OAAO,KAAK,EACV,iBAAiB,EACjB,gBAAgB,EAChB,qBAAqB,EACrB,uBAAuB,EACxB,MAAM,SAAS,CAAC;AAGjB,MAAM,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;AACrD,MAAM,MAAM,qBAAqB,GAAG,QAAQ,CAAC,cAAc,CAAC,eAAe,CAAC,CAAC,CAAC;AAM9E,MAAM,MAAM,mBAAmB,GAAG;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,SAAS,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CACnC,CAAC;AAEF,MAAM,MAAM,mBAAmB,GAAG;IAChC,OAAO,EAAE,eAAe,EAAE,CAAC;IAC3B,MAAM,CAAC,EAAE,oBAAoB,CAAC;IAC9B,SAAS,CAAC,EAAE,mBAAmB,CAAC;IAChC,UAAU,CAAC,EAAE,mBAAmB,CAAC;CAClC,CAAC;AACF,MAAM,MAAM,oBAAoB,GAAG;IACjC,gBAAgB,CAAC,EAAE,gBAAgB,CAAC,IAAI,CAAC,EAAE,CAAC;IAC5C,MAAM,CAAC,EAAE,uBAAuB,GAAG,SAAS,CAAC;IAC7C,YAAY,CAAC,EAAE,eAAe,GAAG,SAAS,CAAC;IAC3C,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB,CAAC;AAEF,wBAAgB,SAAS,CAAC,KAAK,EAAE,MAAM,UAMtC;AAED,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,gBAAgB,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAgBxF;AAED,wBAAgB,2BAA2B,CACzC,UAAU,EAAE,gBAAgB,EAAE,EAC9B,MAAM,EAAE,MAAM,EACd,YAAY,GAAE,eAAoB,EAClC,aAAa,GAAE,eAAoB,GAClC,eAAe,CAKjB;AAED,wBAAgB,2BAA2B,CACzC,UAAU,EAAE,mBAAmB,GAAG,SAAS,EAC3C,QAAQ,EAAE,IAAI,CAAC,iBAAiB,EAAE,YAAY,CAAC,GAAG,IAAI,GAAG,SAAS,GACjE,mBAAmB,GAAG,SAAS,CAsBjC;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,eAAe;;EAE3D;AAED,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,eAAe,EACvB,UAAU,EAAE,gBAAgB,EAAE,GAC7B,eAAe,CAuBjB;AAED,wBAAgB,sBAAsB,CACpC,UAAU,EAAE,gBAAgB,EAAE,EAC9B,MAAM,EAAE,eAAe,EACvB,SAAS,EAAE,qBAAqB,EAChC,OAAO,GAAE,oBAAyB,GACjC,mBAAmB,CAsNrB;AAED,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,MAAM,KAS9D;AAED,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,wBAAwB,CAAC,CAU7F;AAED,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,wBAAwB,CAAC,GAAG,MAAM,CAQjG;AAmBD,wBAAgB,2BAA2B,CAAC,MAAM,EAAE,qBAAqB;;;;IAwBxE"}
|
package/dist/rpc/formMetadata.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formMetadata.js","sources":["../../src/rpc/formMetadata.ts"],"sourcesContent":["import { useEffect, useState, type Dispatch, type SetStateAction } from \"react\";\nimport type {\n FilterBarFilter,\n FilterBarMultiFilterMode,\n FilterBarRangeProps,\n FilterBarSearchProps,\n} from \"../components/FilterBar\";\nimport type { DataTablePagination } from \"../data/DataTable\";\nimport type {\n ExecutionResponse,\n OpenAPIParameter,\n OperationLookupFilter,\n OperationLookupResponse,\n} from \"./types\";\nimport { isPositionalParam, parameterPlaceholder } from \"./types\";\n\nexport type ParameterValues = Record<string, string>;\nexport type ParameterValuesSetter = Dispatch<SetStateAction<ParameterValues>>;\n\n// ParameterPagination plumbs limit/offset query parameters into the\n// DataTable's pagination footer. The UI exposes both as the\n// {pageSize, pageIndex} tuple but here we keep raw string limit/offset\n// values so the executor sees exactly what the operation declared.\nexport type ParameterPagination = {\n limitParam: string; // parameter name on the operation, e.g. \"limit\"\n offsetParam: string;\n limitValue: string;\n offsetValue: string;\n setLimit: (next: string) => void;\n setOffset: (next: string) => void;\n};\n\nexport type ParameterFormConfig = {\n filters: FilterBarFilter[];\n search?: FilterBarSearchProps;\n timeRange?: FilterBarRangeProps;\n pagination?: ParameterPagination;\n};\nexport type ParameterFormOptions = {\n includeLocations?: OpenAPIParameter[\"in\"][];\n lookup?: OperationLookupResponse | undefined;\n lockedValues?: ParameterValues | undefined;\n hideLocked?: boolean;\n};\n\nexport function titleCase(value: string) {\n return value\n .split(/[-_]/)\n .filter(Boolean)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\" \");\n}\n\nexport function defaultValueForParameter(param: OpenAPIParameter, method: string): string {\n if (method.toUpperCase() === \"GET\" && param.in === \"query\" && !param.required) {\n return \"\";\n }\n const fallback = param.in === \"path\" ? \"\" : undefined;\n const value = param.schema?.default ?? fallback;\n if (typeof value === \"boolean\") {\n return value ? \"true\" : \"false\";\n }\n if (Array.isArray(value) || (value != null && typeof value === \"object\")) {\n return \"\";\n }\n if (value == null) {\n return \"\";\n }\n return String(value);\n}\n\nexport function buildInitialParameterValues(\n parameters: OpenAPIParameter[],\n method: string,\n lockedValues: ParameterValues = {},\n initialValues: ParameterValues = {},\n): ParameterValues {\n const values = Object.fromEntries(\n parameters.map((param) => [param.name, defaultValueForParameter(param, method)]),\n );\n return { ...values, ...initialValues, ...lockedValues };\n}\n\nexport function dataTablePaginationFromForm(\n pagination: ParameterPagination | undefined,\n response: Pick<ExecutionResponse, \"pagination\"> | null | undefined,\n): DataTablePagination | undefined {\n if (!pagination) return undefined;\n\n const pageSize = positiveInt(pagination.limitValue) ?? response?.pagination?.limit ?? 25;\n const offset = nonNegativeInt(pagination.offsetValue) ?? response?.pagination?.offset ?? 0;\n const page = Math.floor(offset / pageSize);\n\n return {\n page,\n pageSize,\n ...(response?.pagination?.total !== undefined ? { total: response.pagination.total } : {}),\n onPageChange: (next: number) => {\n if (positiveInt(pagination.limitValue) == null) {\n pagination.setLimit(String(pageSize));\n }\n pagination.setOffset(String(Math.max(next, 0) * pageSize));\n },\n onPageSizeChange: (next: number) => {\n pagination.setLimit(String(next));\n pagination.setOffset(\"0\");\n },\n };\n}\n\nexport function pruneParameterValues(values: ParameterValues) {\n return Object.fromEntries(Object.entries(values).filter(([, value]) => value !== \"\"));\n}\n\nexport function packParameterValues(\n values: ParameterValues,\n parameters: OpenAPIParameter[],\n): ParameterValues {\n const positionalNames = new Set(\n parameters\n .filter((param) => param.in !== \"path\" && isPositionalParam(param))\n .map((p) => p.name),\n );\n const params: ParameterValues = {};\n const args: string[] = [];\n\n for (const [key, value] of Object.entries(values)) {\n if (!value) continue;\n if (positionalNames.has(key)) {\n args.push(value);\n } else {\n params[key] = value;\n }\n }\n\n if (args.length > 0) {\n params.args = args.join(\",\");\n }\n\n return params;\n}\n\nexport function parametersToFormConfig(\n parameters: OpenAPIParameter[],\n values: ParameterValues,\n setValues: ParameterValuesSetter,\n options: ParameterFormOptions = {},\n): ParameterFormConfig {\n const emitFilters: FilterBarFilter[] = [];\n const lookupFilters = options.lookup?.filters ?? {};\n const includeLocations = new Set(options.includeLocations ?? [\"path\", \"query\", \"header\"]);\n const lockedValues = options.lockedValues ?? {};\n const hideLocked = options.hideLocked ?? false;\n\n // Pull limit/offset out of the filter loop entirely — they drive pagination,\n // not filter pills. Roles come from server-side `paramRole` (see\n // clicky/rpc/openapi.go); the older \"named limit on a GET\" heuristic is\n // intentionally not duplicated here so the server stays the single source\n // of truth for parameter classification.\n const limitParam = parameters.find((p) => p[\"x-clicky\"]?.role === \"limit\");\n const offsetParam = parameters.find((p) => p[\"x-clicky\"]?.role === \"offset\");\n const paginationOmitNames = new Set<string>();\n if (limitParam) paginationOmitNames.add(limitParam.name);\n if (offsetParam) paginationOmitNames.add(offsetParam.name);\n\n // The search-role param drives the FilterBar's dedicated search input rather\n // than a filter chip; pull it out of the chip loop the same way pagination is.\n const searchParam = parameters.find(\n (p) => p[\"x-clicky\"]?.role === \"search\" && includeLocations.has(p.in),\n );\n const omitNames = new Set(paginationOmitNames);\n if (searchParam) omitNames.add(searchParam.name);\n\n // Time-range first looks for server-stamped roles, then falls back to the\n // existing lookup-driven \"from\"/\"to\" detection so older specs keep working.\n const roleRangeStart = parameters.find((p) => p[\"x-clicky\"]?.role === \"time-from\");\n const roleRangeEnd = parameters.find((p) => p[\"x-clicky\"]?.role === \"time-to\");\n const rangeStart =\n roleRangeStart ??\n parameters.find(\n (param) =>\n includeLocations.has(param.in) &&\n param.in === \"query\" &&\n lookupFilters[param.name]?.type === \"from\",\n );\n const rangeEnd =\n roleRangeEnd ??\n parameters.find(\n (param) =>\n includeLocations.has(param.in) &&\n param.in === \"query\" &&\n lookupFilters[param.name]?.type === \"to\",\n );\n const hasTimeRange = rangeStart != null && rangeEnd != null;\n\n for (const param of parameters) {\n if (!includeLocations.has(param.in)) continue;\n if (omitNames.has(param.name)) continue;\n if (hasTimeRange && (param.name === rangeStart?.name || param.name === rangeEnd?.name)) {\n continue;\n }\n\n const disabled = Object.prototype.hasOwnProperty.call(lockedValues, param.name);\n if (disabled && hideLocked) continue;\n const value = disabled ? (lockedValues[param.name] ?? \"\") : (values[param.name] ?? \"\");\n const label = lookupFilters[param.name]?.label ?? titleCase(param.name);\n // Only an explicit placeholder is rendered — never synthesize one. The\n // field already carries `label`, so a fallback placeholder is redundant\n // and generic defaults (e.g. \"value-1, value-2\") read as fake data.\n const placeholder = parameterPlaceholder(param);\n const placeholderProp = placeholder !== undefined ? { placeholder } : {};\n const onChange = (next: string | boolean) => {\n if (disabled) return;\n const stringValue = typeof next === \"boolean\" ? (next ? \"true\" : \"false\") : next;\n setValues((current) => ({ ...current, [param.name]: stringValue }));\n };\n\n const schema = param.schema;\n const lookupFilter = lookupFilters[param.name];\n\n if (lookupFilter?.type === \"multi-filter\" && param.in === \"query\") {\n emitFilters.push({\n key: param.name,\n kind: \"multi\",\n label,\n value: parseMultiFilterValue(value),\n disabled,\n options: lookupOptionsToFieldOptions(lookupFilter),\n onChange: (next) =>\n setValues((current) => ({\n ...current,\n [param.name]: serializeMultiFilterValue(next),\n })),\n });\n continue;\n }\n\n if (schema?.enum) {\n emitFilters.push({\n key: param.name,\n kind: \"enum\",\n label,\n value,\n disabled,\n options: schema.enum.map((item) => ({\n value: String(item),\n label: String(item),\n })),\n onChange: (next) => onChange(next),\n });\n continue;\n }\n\n if (lookupFilter?.type === \"bool\" || schema?.type === \"boolean\") {\n emitFilters.push({\n key: param.name,\n kind: \"boolean\",\n label,\n value: value === \"true\",\n disabled,\n onChange: (next) => onChange(next),\n });\n continue;\n }\n\n if (lookupFilter != null && param.in === \"query\") {\n if (lookupFilter.multi) {\n emitFilters.push({\n key: param.name,\n kind: \"lookup-multi\",\n label,\n value: splitCommaValues(value),\n disabled,\n options: lookupOptionsToFieldOptions(lookupFilter),\n ...placeholderProp,\n onChange: (next) =>\n setValues((current) => ({ ...current, [param.name]: next.join(\",\") })),\n });\n continue;\n }\n\n emitFilters.push({\n key: param.name,\n kind: \"lookup\",\n label,\n value,\n disabled,\n options: lookupOptionsToFieldOptions(lookupFilter),\n ...placeholderProp,\n inputType:\n lookupFilter.type === \"number\"\n ? \"number\"\n : lookupFilter.type === \"date\"\n ? \"date\"\n : \"text\",\n onChange: (next) => onChange(next),\n });\n continue;\n }\n\n emitFilters.push({\n key: param.name,\n kind: \"text\",\n label,\n value,\n disabled,\n ...placeholderProp,\n onChange: (next) => onChange(next),\n });\n }\n\n const config: ParameterFormConfig = { filters: emitFilters };\n if (searchParam) {\n const searchDisabled = Object.prototype.hasOwnProperty.call(lockedValues, searchParam.name);\n const searchValue = searchDisabled\n ? (lockedValues[searchParam.name] ?? \"\")\n : (values[searchParam.name] ?? \"\");\n const searchPlaceholder = parameterPlaceholder(searchParam);\n config.search = {\n value: searchValue,\n onChange: (next) => {\n if (searchDisabled) return;\n setValues((current) => ({ ...current, [searchParam.name]: next }));\n },\n ...(searchPlaceholder ? { placeholder: searchPlaceholder } : {}),\n ariaLabel: lookupFilters[searchParam.name]?.label ?? titleCase(searchParam.name),\n };\n }\n if (limitParam && offsetParam) {\n config.pagination = {\n limitParam: limitParam.name,\n offsetParam: offsetParam.name,\n limitValue: values[limitParam.name] ?? \"\",\n offsetValue: values[offsetParam.name] ?? \"\",\n setLimit: (next) => setValues((current) => ({ ...current, [limitParam.name]: next })),\n setOffset: (next) => setValues((current) => ({ ...current, [offsetParam.name]: next })),\n };\n }\n if (hasTimeRange && rangeStart != null && rangeEnd != null) {\n const rangeStartMeta = lookupFilters[rangeStart.name];\n const rangeEndMeta = lookupFilters[rangeEnd.name];\n const rangeMeta = rangeStartMeta ?? rangeEndMeta;\n config.timeRange = {\n from: values[rangeStart.name] ?? \"\",\n to: values[rangeEnd.name] ?? \"\",\n onApply: (from, to) =>\n setValues((current) => ({\n ...current,\n [rangeStart.name]: from,\n [rangeEnd.name]: to,\n })),\n ...(rangeMeta?.presets ? { presets: rangeMeta.presets } : {}),\n timeEnabled: rangeMeta?.timeEnabled ?? false,\n ...(rangeMeta?.timeZone ? { timeZone: rangeMeta.timeZone } : {}),\n ...(rangeMeta?.timeZones ? { timeZones: rangeMeta.timeZones } : {}),\n ...(rangeStart.description ? { fromPlaceholder: rangeStart.description } : {}),\n ...(rangeEnd.description ? { toPlaceholder: rangeEnd.description } : {}),\n };\n }\n\n return config;\n}\n\nexport function useDebouncedRecord<T>(value: T, delayMs: number) {\n const [debounced, setDebounced] = useState(value);\n\n useEffect(() => {\n const timeoutId = window.setTimeout(() => setDebounced(value), delayMs);\n return () => window.clearTimeout(timeoutId);\n }, [delayMs, value]);\n\n return debounced;\n}\n\nexport function parseMultiFilterValue(value: string): Record<string, FilterBarMultiFilterMode> {\n const parsed: Record<string, FilterBarMultiFilterMode> = {};\n for (const item of splitCommaValues(value)) {\n if (item.startsWith(\"!\") && item.length > 1) {\n parsed[item.slice(1)] = \"exclude\";\n } else {\n parsed[item] = \"include\";\n }\n }\n return parsed;\n}\n\nexport function serializeMultiFilterValue(value: Record<string, FilterBarMultiFilterMode>): string {\n return Object.entries(value)\n .flatMap(([key, mode]) => {\n if (mode === \"include\") return [key];\n if (mode === \"exclude\") return [`!${key}`];\n return [];\n })\n .join(\",\");\n}\n\nfunction splitCommaValues(value: string) {\n return value\n .split(\",\")\n .map((item) => item.trim())\n .filter(Boolean);\n}\n\nfunction positiveInt(value: string | undefined): number | undefined {\n const parsed = parseInt(value ?? \"\", 10);\n return Number.isFinite(parsed) && parsed > 0 ? parsed : undefined;\n}\n\nfunction nonNegativeInt(value: string | undefined): number | undefined {\n const parsed = parseInt(value ?? \"\", 10);\n return Number.isFinite(parsed) && parsed >= 0 ? parsed : undefined;\n}\n\nfunction lookupOptionsToFieldOptions(filter: OperationLookupFilter) {\n const merged = new Map<string, { label?: string; title?: string }>();\n\n for (const [value, node] of Object.entries(filter.options ?? {})) {\n merged.set(value, {\n label: clickyNodeToPlainText(node) || value,\n title: clickyNodeToPlainText(node) || value,\n });\n }\n\n for (const [value, node] of Object.entries(filter.selected ?? {})) {\n if (!merged.has(value)) {\n merged.set(value, {\n label: clickyNodeToPlainText(node) || value,\n title: clickyNodeToPlainText(node) || value,\n });\n }\n }\n\n return Array.from(merged.entries()).map(([value, meta]) => ({\n value,\n label: meta.label ?? value,\n title: meta.title ?? value,\n }));\n}\n\ntype PlainTextClickyNode = {\n plain?: string;\n text?: string;\n children?: PlainTextClickyNode[];\n tooltip?: { plain?: string; text?: string };\n};\n\nfunction clickyNodeToPlainText(node: PlainTextClickyNode | null | undefined): string {\n if (node == null) return \"\";\n if (node.plain) return node.plain;\n if (node.text) return node.text;\n return (node.children ?? []).map((child) => clickyNodeToPlainText(child)).join(\"\");\n}\n"],"names":["_a"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"formMetadata.js","sources":["../../src/rpc/formMetadata.ts"],"sourcesContent":["import { useEffect, useState, type Dispatch, type SetStateAction } from \"react\";\nimport type {\n FilterBarFilter,\n FilterBarMultiFilterMode,\n FilterBarRangeProps,\n FilterBarSearchProps,\n} from \"../components/FilterBar\";\nimport type { DataTablePagination } from \"../data/DataTable\";\nimport type {\n ExecutionResponse,\n OpenAPIParameter,\n OperationLookupFilter,\n OperationLookupResponse,\n} from \"./types\";\nimport { isPositionalParam, parameterPlaceholder } from \"./types\";\n\nexport type ParameterValues = Record<string, string>;\nexport type ParameterValuesSetter = Dispatch<SetStateAction<ParameterValues>>;\n\n// ParameterPagination plumbs limit/offset query parameters into the\n// DataTable's pagination footer. The UI exposes both as the\n// {pageSize, pageIndex} tuple but here we keep raw string limit/offset\n// values so the executor sees exactly what the operation declared.\nexport type ParameterPagination = {\n limitParam: string; // parameter name on the operation, e.g. \"limit\"\n offsetParam: string;\n limitValue: string;\n offsetValue: string;\n setLimit: (next: string) => void;\n setOffset: (next: string) => void;\n};\n\nexport type ParameterFormConfig = {\n filters: FilterBarFilter[];\n search?: FilterBarSearchProps;\n timeRange?: FilterBarRangeProps;\n pagination?: ParameterPagination;\n};\nexport type ParameterFormOptions = {\n includeLocations?: OpenAPIParameter[\"in\"][];\n lookup?: OperationLookupResponse | undefined;\n lockedValues?: ParameterValues | undefined;\n hideLocked?: boolean;\n};\n\nexport function titleCase(value: string) {\n return value\n .split(/[-_]/)\n .filter(Boolean)\n .map((part) => part.charAt(0).toUpperCase() + part.slice(1))\n .join(\" \");\n}\n\nexport function defaultValueForParameter(param: OpenAPIParameter, method: string): string {\n if (method.toUpperCase() === \"GET\" && param.in === \"query\" && !param.required) {\n return \"\";\n }\n const fallback = param.in === \"path\" ? \"\" : undefined;\n const value = param.schema?.default ?? fallback;\n if (typeof value === \"boolean\") {\n return value ? \"true\" : \"false\";\n }\n if (Array.isArray(value) || (value != null && typeof value === \"object\")) {\n return \"\";\n }\n if (value == null) {\n return \"\";\n }\n return String(value);\n}\n\nexport function buildInitialParameterValues(\n parameters: OpenAPIParameter[],\n method: string,\n lockedValues: ParameterValues = {},\n initialValues: ParameterValues = {},\n): ParameterValues {\n const values = Object.fromEntries(\n parameters.map((param) => [param.name, defaultValueForParameter(param, method)]),\n );\n return { ...values, ...initialValues, ...lockedValues };\n}\n\nexport function dataTablePaginationFromForm(\n pagination: ParameterPagination | undefined,\n response: Pick<ExecutionResponse, \"pagination\"> | null | undefined,\n): DataTablePagination | undefined {\n if (!pagination) return undefined;\n\n const pageSize = positiveInt(pagination.limitValue) ?? response?.pagination?.limit ?? 25;\n const offset = nonNegativeInt(pagination.offsetValue) ?? response?.pagination?.offset ?? 0;\n const page = Math.floor(offset / pageSize);\n\n return {\n page,\n pageSize,\n ...(response?.pagination?.total !== undefined ? { total: response.pagination.total } : {}),\n onPageChange: (next: number) => {\n if (positiveInt(pagination.limitValue) == null) {\n pagination.setLimit(String(pageSize));\n }\n pagination.setOffset(String(Math.max(next, 0) * pageSize));\n },\n onPageSizeChange: (next: number) => {\n pagination.setLimit(String(next));\n pagination.setOffset(\"0\");\n },\n };\n}\n\nexport function pruneParameterValues(values: ParameterValues) {\n return Object.fromEntries(Object.entries(values).filter(([, value]) => value !== \"\"));\n}\n\nexport function packParameterValues(\n values: ParameterValues,\n parameters: OpenAPIParameter[],\n): ParameterValues {\n const positionalNames = new Set(\n parameters\n .filter((param) => param.in !== \"path\" && isPositionalParam(param))\n .map((p) => p.name),\n );\n const params: ParameterValues = {};\n const args: string[] = [];\n\n for (const [key, value] of Object.entries(values)) {\n if (!value) continue;\n if (positionalNames.has(key)) {\n args.push(value);\n } else {\n params[key] = value;\n }\n }\n\n if (args.length > 0) {\n params.args = args.join(\",\");\n }\n\n return params;\n}\n\nexport function parametersToFormConfig(\n parameters: OpenAPIParameter[],\n values: ParameterValues,\n setValues: ParameterValuesSetter,\n options: ParameterFormOptions = {},\n): ParameterFormConfig {\n const emitFilters: FilterBarFilter[] = [];\n const lookupFilters = options.lookup?.filters ?? {};\n const includeLocations = new Set(options.includeLocations ?? [\"path\", \"query\", \"header\"]);\n const lockedValues = options.lockedValues ?? {};\n const hideLocked = options.hideLocked ?? false;\n\n // Pull limit/offset out of the filter loop entirely — they drive pagination,\n // not filter pills. Roles come from server-side `paramRole` (see\n // clicky/rpc/openapi.go); the older \"named limit on a GET\" heuristic is\n // intentionally not duplicated here so the server stays the single source\n // of truth for parameter classification.\n const limitParam = parameters.find((p) => p[\"x-clicky\"]?.role === \"limit\");\n const offsetParam = parameters.find((p) => p[\"x-clicky\"]?.role === \"offset\");\n const paginationOmitNames = new Set<string>();\n if (limitParam) paginationOmitNames.add(limitParam.name);\n if (offsetParam) paginationOmitNames.add(offsetParam.name);\n\n // The search-role param drives the FilterBar's dedicated search input rather\n // than a filter chip; pull it out of the chip loop the same way pagination is.\n const searchParam = parameters.find(\n (p) => p[\"x-clicky\"]?.role === \"search\" && includeLocations.has(p.in),\n );\n const omitNames = new Set(paginationOmitNames);\n if (searchParam) omitNames.add(searchParam.name);\n\n // Time-range first looks for server-stamped roles, then falls back to the\n // existing lookup-driven \"from\"/\"to\" detection so older specs keep working.\n const roleRangeStart = parameters.find((p) => p[\"x-clicky\"]?.role === \"time-from\");\n const roleRangeEnd = parameters.find((p) => p[\"x-clicky\"]?.role === \"time-to\");\n const rangeStart =\n roleRangeStart ??\n parameters.find(\n (param) =>\n includeLocations.has(param.in) &&\n param.in === \"query\" &&\n lookupFilters[param.name]?.type === \"from\",\n );\n const rangeEnd =\n roleRangeEnd ??\n parameters.find(\n (param) =>\n includeLocations.has(param.in) &&\n param.in === \"query\" &&\n lookupFilters[param.name]?.type === \"to\",\n );\n const hasTimeRange = rangeStart != null && rangeEnd != null;\n\n for (const param of parameters) {\n if (!includeLocations.has(param.in)) continue;\n if (omitNames.has(param.name)) continue;\n if (hasTimeRange && (param.name === rangeStart?.name || param.name === rangeEnd?.name)) {\n continue;\n }\n\n const disabled = Object.prototype.hasOwnProperty.call(lockedValues, param.name);\n if (disabled && hideLocked) continue;\n const value = disabled ? (lockedValues[param.name] ?? \"\") : (values[param.name] ?? \"\");\n const label = lookupFilters[param.name]?.label ?? titleCase(param.name);\n // Only an explicit placeholder is rendered — never synthesize one. The\n // field already carries `label`, so a fallback placeholder is redundant\n // and generic defaults (e.g. \"value-1, value-2\") read as fake data.\n const placeholder = parameterPlaceholder(param);\n const placeholderProp = placeholder !== undefined ? { placeholder } : {};\n const onChange = (next: string | boolean) => {\n if (disabled) return;\n const stringValue = typeof next === \"boolean\" ? (next ? \"true\" : \"false\") : next;\n setValues((current) => ({ ...current, [param.name]: stringValue }));\n };\n\n const schema = param.schema;\n const lookupFilter = lookupFilters[param.name];\n\n if (lookupFilter?.type === \"multi-filter\" && param.in === \"query\") {\n emitFilters.push({\n key: param.name,\n kind: \"multi\",\n label,\n value: parseMultiFilterValue(value),\n disabled,\n options: lookupOptionsToFieldOptions(lookupFilter),\n onChange: (next) =>\n setValues((current) => ({\n ...current,\n [param.name]: serializeMultiFilterValue(next),\n })),\n });\n continue;\n }\n\n if (schema?.enum) {\n emitFilters.push({\n key: param.name,\n kind: \"enum\",\n label,\n value,\n disabled,\n options: schema.enum.map((item) => ({\n value: String(item),\n label: String(item),\n })),\n onChange: (next) => onChange(next),\n });\n continue;\n }\n\n if (lookupFilter?.type === \"bool\" || schema?.type === \"boolean\") {\n emitFilters.push({\n key: param.name,\n kind: \"boolean\",\n label,\n value: value === \"true\",\n disabled,\n onChange: (next) => onChange(next),\n });\n continue;\n }\n\n if (lookupFilter != null && param.in === \"query\") {\n if (lookupFilter.multi) {\n emitFilters.push({\n key: param.name,\n kind: \"lookup-multi\",\n label,\n value: splitCommaValues(value),\n disabled,\n options: lookupOptionsToFieldOptions(lookupFilter),\n ...placeholderProp,\n onChange: (next) =>\n setValues((current) => ({ ...current, [param.name]: next.join(\",\") })),\n });\n continue;\n }\n\n emitFilters.push({\n key: param.name,\n kind: \"lookup\",\n label,\n value,\n disabled,\n options: lookupOptionsToFieldOptions(lookupFilter),\n ...placeholderProp,\n inputType:\n lookupFilter.type === \"number\"\n ? \"number\"\n : lookupFilter.type === \"date\"\n ? \"date\"\n : \"text\",\n onChange: (next) => onChange(next),\n });\n continue;\n }\n\n emitFilters.push({\n key: param.name,\n kind: \"text\",\n label,\n value,\n disabled,\n ...placeholderProp,\n onChange: (next) => onChange(next),\n });\n }\n\n const config: ParameterFormConfig = { filters: emitFilters };\n if (searchParam) {\n const searchDisabled = Object.prototype.hasOwnProperty.call(lockedValues, searchParam.name);\n const searchValue = searchDisabled\n ? (lockedValues[searchParam.name] ?? \"\")\n : (values[searchParam.name] ?? \"\");\n const searchPlaceholder = parameterPlaceholder(searchParam);\n config.search = {\n value: searchValue,\n onChange: (next) => {\n if (searchDisabled) return;\n setValues((current) => ({ ...current, [searchParam.name]: next }));\n },\n ...(searchPlaceholder ? { placeholder: searchPlaceholder } : {}),\n ariaLabel: lookupFilters[searchParam.name]?.label ?? titleCase(searchParam.name),\n };\n }\n if (limitParam && offsetParam) {\n config.pagination = {\n limitParam: limitParam.name,\n offsetParam: offsetParam.name,\n limitValue: values[limitParam.name] ?? \"\",\n offsetValue: values[offsetParam.name] ?? \"\",\n setLimit: (next) => setValues((current) => ({ ...current, [limitParam.name]: next })),\n setOffset: (next) => setValues((current) => ({ ...current, [offsetParam.name]: next })),\n };\n }\n if (hasTimeRange && rangeStart != null && rangeEnd != null) {\n const rangeStartMeta = lookupFilters[rangeStart.name];\n const rangeEndMeta = lookupFilters[rangeEnd.name];\n const rangeMeta = rangeStartMeta ?? rangeEndMeta;\n config.timeRange = {\n from: values[rangeStart.name] ?? \"\",\n to: values[rangeEnd.name] ?? \"\",\n onApply: (from, to) =>\n setValues((current) => ({\n ...current,\n [rangeStart.name]: from,\n [rangeEnd.name]: to,\n })),\n ...(rangeMeta?.presets ? { presets: rangeMeta.presets } : {}),\n timeEnabled: rangeMeta?.timeEnabled ?? false,\n ...(rangeMeta?.timeZone ? { timeZone: rangeMeta.timeZone } : {}),\n ...(rangeMeta?.timeZones ? { timeZones: rangeMeta.timeZones } : {}),\n ...(rangeStart.description ? { fromPlaceholder: rangeStart.description } : {}),\n ...(rangeEnd.description ? { toPlaceholder: rangeEnd.description } : {}),\n };\n }\n\n return config;\n}\n\nexport function useDebouncedRecord<T>(value: T, delayMs: number) {\n const [debounced, setDebounced] = useState(value);\n\n useEffect(() => {\n const timeoutId = window.setTimeout(() => setDebounced(value), delayMs);\n return () => window.clearTimeout(timeoutId);\n }, [delayMs, value]);\n\n return debounced;\n}\n\nexport function parseMultiFilterValue(value: string): Record<string, FilterBarMultiFilterMode> {\n const parsed: Record<string, FilterBarMultiFilterMode> = {};\n for (const item of splitCommaValues(value)) {\n if (item.startsWith(\"!\") && item.length > 1) {\n parsed[item.slice(1)] = \"exclude\";\n } else {\n parsed[item] = \"include\";\n }\n }\n return parsed;\n}\n\nexport function serializeMultiFilterValue(value: Record<string, FilterBarMultiFilterMode>): string {\n return Object.entries(value)\n .flatMap(([key, mode]) => {\n if (mode === \"include\") return [key];\n if (mode === \"exclude\") return [`!${key}`];\n return [];\n })\n .join(\",\");\n}\n\nfunction splitCommaValues(value: string) {\n return value\n .split(\",\")\n .map((item) => item.trim())\n .filter(Boolean);\n}\n\nfunction positiveInt(value: string | undefined): number | undefined {\n const parsed = parseInt(value ?? \"\", 10);\n return Number.isFinite(parsed) && parsed > 0 ? parsed : undefined;\n}\n\nfunction nonNegativeInt(value: string | undefined): number | undefined {\n const parsed = parseInt(value ?? \"\", 10);\n return Number.isFinite(parsed) && parsed >= 0 ? parsed : undefined;\n}\n\nexport function lookupOptionsToFieldOptions(filter: OperationLookupFilter) {\n const merged = new Map<string, { label?: string; title?: string }>();\n\n for (const [value, node] of Object.entries(filter.options ?? {})) {\n merged.set(value, {\n label: clickyNodeToPlainText(node) || value,\n title: clickyNodeToPlainText(node) || value,\n });\n }\n\n for (const [value, node] of Object.entries(filter.selected ?? {})) {\n if (!merged.has(value)) {\n merged.set(value, {\n label: clickyNodeToPlainText(node) || value,\n title: clickyNodeToPlainText(node) || value,\n });\n }\n }\n\n return Array.from(merged.entries()).map(([value, meta]) => ({\n value,\n label: meta.label ?? value,\n title: meta.title ?? value,\n }));\n}\n\ntype PlainTextClickyNode = {\n plain?: string;\n text?: string;\n children?: PlainTextClickyNode[];\n tooltip?: { plain?: string; text?: string };\n};\n\nfunction clickyNodeToPlainText(node: PlainTextClickyNode | null | undefined): string {\n if (node == null) return \"\";\n if (node.plain) return node.plain;\n if (node.text) return node.text;\n return (node.children ?? []).map((child) => clickyNodeToPlainText(child)).join(\"\");\n}\n"],"names":["_a"],"mappings":"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"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const react = require("react");
|
|
4
|
+
const clickyMetadata = require("./clickyMetadata.cjs");
|
|
5
|
+
const commandFormUtils = require("./command-form-utils.cjs");
|
|
6
|
+
const router = require("./router.cjs");
|
|
7
|
+
function clickyNodeText(node) {
|
|
8
|
+
if (!node) return "";
|
|
9
|
+
if (node.plain) return node.plain;
|
|
10
|
+
if (node.text) return node.text;
|
|
11
|
+
if (node.source) return node.source;
|
|
12
|
+
if (node.children) return node.children.map(clickyNodeText).join("");
|
|
13
|
+
if (node.items) return node.items.map(clickyNodeText).join(" ");
|
|
14
|
+
if (node.fields)
|
|
15
|
+
return node.fields.map((field) => clickyNodeText(field.value)).join(" ");
|
|
16
|
+
return "";
|
|
17
|
+
}
|
|
18
|
+
function getClickyRowId(row) {
|
|
19
|
+
const candidates = ["_id", "id", "ID", "guid", "GUID"];
|
|
20
|
+
for (const key of candidates) {
|
|
21
|
+
const value = clickyNodeText(row.cells[key]);
|
|
22
|
+
if (value) return value;
|
|
23
|
+
}
|
|
24
|
+
return void 0;
|
|
25
|
+
}
|
|
26
|
+
function apiPathToRoutePath(path) {
|
|
27
|
+
const segments = path.trim().replace(/^\/api\/v1/, "").split("/").filter(Boolean);
|
|
28
|
+
if (segments.length === 0) return "/";
|
|
29
|
+
return `/${segments.join("/").replace(/\{([^{}]+)\}/g, ":$1")}`;
|
|
30
|
+
}
|
|
31
|
+
function hrefForOperation(operation, args = [], flags = {}) {
|
|
32
|
+
let route = apiPathToRoutePath(operation.path);
|
|
33
|
+
const consumedFlags = /* @__PURE__ */ new Set();
|
|
34
|
+
commandFormUtils.pathParamNames(operation.path).forEach((name, index) => {
|
|
35
|
+
const value = flags[name] ?? args[index];
|
|
36
|
+
if (!value) return;
|
|
37
|
+
consumedFlags.add(name);
|
|
38
|
+
route = route.replace(`:${name}`, encodeURIComponent(value));
|
|
39
|
+
});
|
|
40
|
+
if (route.includes(":")) return void 0;
|
|
41
|
+
const search = new URLSearchParams();
|
|
42
|
+
for (const [key, value] of Object.entries(flags)) {
|
|
43
|
+
if (value && !consumedFlags.has(key)) search.set(key, value);
|
|
44
|
+
}
|
|
45
|
+
const query = search.toString();
|
|
46
|
+
return query ? `${route}?${query}` : route;
|
|
47
|
+
}
|
|
48
|
+
function hrefForDetail(detailOperation, id) {
|
|
49
|
+
var _a;
|
|
50
|
+
const surface = (_a = clickyMetadata.getOperationClickyMeta(detailOperation)) == null ? void 0 : _a.surface;
|
|
51
|
+
if (surface) {
|
|
52
|
+
return `/${encodeURIComponent(surface)}/${encodeURIComponent(id)}`;
|
|
53
|
+
}
|
|
54
|
+
return hrefForOperation(detailOperation, [], { id });
|
|
55
|
+
}
|
|
56
|
+
function useRowDetailNavigation(detailOperation) {
|
|
57
|
+
const { navigate } = router.useRouter();
|
|
58
|
+
const getRowHref = react.useCallback(
|
|
59
|
+
(row) => {
|
|
60
|
+
if (!detailOperation) return void 0;
|
|
61
|
+
const id = getClickyRowId(row);
|
|
62
|
+
if (!id) return void 0;
|
|
63
|
+
return hrefForDetail(detailOperation, id);
|
|
64
|
+
},
|
|
65
|
+
[detailOperation]
|
|
66
|
+
);
|
|
67
|
+
const onRowClick = react.useCallback(
|
|
68
|
+
(row) => {
|
|
69
|
+
const href = getRowHref(row);
|
|
70
|
+
if (href) navigate(href);
|
|
71
|
+
},
|
|
72
|
+
[getRowHref, navigate]
|
|
73
|
+
);
|
|
74
|
+
const isRowClickable = react.useCallback(
|
|
75
|
+
(row) => Boolean(getRowHref(row)),
|
|
76
|
+
[getRowHref]
|
|
77
|
+
);
|
|
78
|
+
return { getRowHref, onRowClick, isRowClickable };
|
|
79
|
+
}
|
|
80
|
+
exports.apiPathToRoutePath = apiPathToRoutePath;
|
|
81
|
+
exports.clickyNodeText = clickyNodeText;
|
|
82
|
+
exports.getClickyRowId = getClickyRowId;
|
|
83
|
+
exports.hrefForDetail = hrefForDetail;
|
|
84
|
+
exports.hrefForOperation = hrefForOperation;
|
|
85
|
+
exports.useRowDetailNavigation = useRowDetailNavigation;
|
|
86
|
+
//# sourceMappingURL=rowNavigation.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rowNavigation.cjs","sources":["../../src/rpc/rowNavigation.ts"],"sourcesContent":["import { useCallback } from \"react\";\nimport type {\n ClickyNode,\n ClickyRow,\n ClickyTableRowClick,\n ClickyTableRowHref,\n ClickyTableRowPredicate,\n} from \"../data/Clicky\";\nimport { getOperationClickyMeta } from \"./clickyMetadata\";\nimport { pathParamNames } from \"./command-form-utils\";\nimport { useRouter } from \"./router\";\nimport type { ResolvedOperation } from \"./types\";\n\n// clickyNodeText flattens a clicky node to its plain text — used to read an id\n// out of a table row cell.\nexport function clickyNodeText(node: ClickyNode | undefined): string {\n if (!node) return \"\";\n if (node.plain) return node.plain;\n if (node.text) return node.text;\n if (node.source) return node.source;\n if (node.children) return node.children.map(clickyNodeText).join(\"\");\n if (node.items) return node.items.map(clickyNodeText).join(\" \");\n if (node.fields)\n return node.fields.map((field) => clickyNodeText(field.value)).join(\" \");\n return \"\";\n}\n\n// getClickyRowId reads a row's identifier from the conventional id columns,\n// preferring the synthetic `_id` a clicky surface emits over a displayed `id`.\nexport function getClickyRowId(row: ClickyRow): string | undefined {\n const candidates = [\"_id\", \"id\", \"ID\", \"guid\", \"GUID\"];\n for (const key of candidates) {\n const value = clickyNodeText(row.cells[key]);\n if (value) return value;\n }\n return undefined;\n}\n\n// apiPathToRoutePath strips the /api/v1 prefix and turns `{param}` segments into\n// `:param`, mapping an OpenAPI path to the explorer's client-side route.\nexport function apiPathToRoutePath(path: string): string {\n // Split on \"/\" and drop empty segments to strip the leading /api/v1 prefix and\n // any leading/trailing slashes without backtracking-prone regexes (the `[^{}]`\n // class and segment split avoid the polynomial-ReDoS that `[^}]+` / `\\/+$` had).\n const segments = path\n .trim()\n .replace(/^\\/api\\/v1/, \"\")\n .split(\"/\")\n .filter(Boolean);\n if (segments.length === 0) return \"/\";\n return `/${segments.join(\"/\").replace(/\\{([^{}]+)\\}/g, \":$1\")}`;\n}\n\n// hrefForOperation builds the client-side route for an operation, filling path\n// params from `flags`/`args` and trailing query params from leftover flags.\n// Returns undefined when a required path param is unfilled.\nexport function hrefForOperation(\n operation: ResolvedOperation,\n args: string[] = [],\n flags: Record<string, string> = {},\n): string | undefined {\n let route = apiPathToRoutePath(operation.path);\n const consumedFlags = new Set<string>();\n\n pathParamNames(operation.path).forEach((name, index) => {\n const value = flags[name] ?? args[index];\n if (!value) return;\n consumedFlags.add(name);\n route = route.replace(`:${name}`, encodeURIComponent(value));\n });\n\n if (route.includes(\":\")) return undefined;\n\n const search = new URLSearchParams();\n for (const [key, value] of Object.entries(flags)) {\n if (value && !consumedFlags.has(key)) search.set(key, value);\n }\n const query = search.toString();\n return query ? `${route}?${query}` : route;\n}\n\n// hrefForDetail builds the entity detail route for a row. It prefers the\n// surface key the backend tags on the get operation (x-clicky.surface), since\n// that is the route key the sidebar and EntityExplorerApp's route resolver use\n// (/<surface>/<id>). The surface key is often the singular/plural sibling of the\n// API path segment (e.g. surface \"connections\" vs path /connection/{id}), so\n// deriving the route from the path alone yields an unknown-surface route. Falls\n// back to the path-derived route when the operation carries no surface meta.\nexport function hrefForDetail(detailOperation: ResolvedOperation, id: string): string | undefined {\n const surface = getOperationClickyMeta(detailOperation)?.surface;\n if (surface) {\n return `/${encodeURIComponent(surface)}/${encodeURIComponent(id)}`;\n }\n return hrefForOperation(detailOperation, [], { id });\n}\n\nexport type RowDetailNavigation = {\n getRowHref: ClickyTableRowHref;\n onRowClick: ClickyTableRowClick;\n isRowClickable: ClickyTableRowPredicate;\n};\n\n// useRowDetailNavigation wires a clicky table's rows to the entity detail page:\n// each row resolves to /<surface>/<id> via the detail operation, navigates on\n// click, and is clickable only when a detail href can be built. Shared by the\n// list catalog and the operation runner so row navigation behaves identically.\nexport function useRowDetailNavigation(\n detailOperation: ResolvedOperation | undefined,\n): RowDetailNavigation {\n const { navigate } = useRouter();\n\n const getRowHref = useCallback<ClickyTableRowHref>(\n (row) => {\n if (!detailOperation) return undefined;\n const id = getClickyRowId(row);\n if (!id) return undefined;\n return hrefForDetail(detailOperation, id);\n },\n [detailOperation],\n );\n\n const onRowClick = useCallback<ClickyTableRowClick>(\n (row) => {\n const href = getRowHref(row);\n if (href) navigate(href);\n },\n [getRowHref, navigate],\n );\n\n const isRowClickable = useCallback<ClickyTableRowPredicate>(\n (row) => Boolean(getRowHref(row)),\n [getRowHref],\n );\n\n return { getRowHref, onRowClick, isRowClickable };\n}\n"],"names":["pathParamNames","getOperationClickyMeta","useRouter","useCallback"],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { ClickyNode, ClickyRow, ClickyTableRowClick, ClickyTableRowHref, ClickyTableRowPredicate } from '../data/Clicky';
|
|
2
|
+
import { ResolvedOperation } from './types';
|
|
3
|
+
export declare function clickyNodeText(node: ClickyNode | undefined): string;
|
|
4
|
+
export declare function getClickyRowId(row: ClickyRow): string | undefined;
|
|
5
|
+
export declare function apiPathToRoutePath(path: string): string;
|
|
6
|
+
export declare function hrefForOperation(operation: ResolvedOperation, args?: string[], flags?: Record<string, string>): string | undefined;
|
|
7
|
+
export declare function hrefForDetail(detailOperation: ResolvedOperation, id: string): string | undefined;
|
|
8
|
+
export type RowDetailNavigation = {
|
|
9
|
+
getRowHref: ClickyTableRowHref;
|
|
10
|
+
onRowClick: ClickyTableRowClick;
|
|
11
|
+
isRowClickable: ClickyTableRowPredicate;
|
|
12
|
+
};
|
|
13
|
+
export declare function useRowDetailNavigation(detailOperation: ResolvedOperation | undefined): RowDetailNavigation;
|
|
14
|
+
//# sourceMappingURL=rowNavigation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rowNavigation.d.ts","sourceRoot":"","sources":["../../src/rpc/rowNavigation.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,UAAU,EACV,SAAS,EACT,mBAAmB,EACnB,kBAAkB,EAClB,uBAAuB,EACxB,MAAM,gBAAgB,CAAC;AAIxB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAIjD,wBAAgB,cAAc,CAAC,IAAI,EAAE,UAAU,GAAG,SAAS,GAAG,MAAM,CAUnE;AAID,wBAAgB,cAAc,CAAC,GAAG,EAAE,SAAS,GAAG,MAAM,GAAG,SAAS,CAOjE;AAID,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAWvD;AAKD,wBAAgB,gBAAgB,CAC9B,SAAS,EAAE,iBAAiB,EAC5B,IAAI,GAAE,MAAM,EAAO,EACnB,KAAK,GAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAM,GACjC,MAAM,GAAG,SAAS,CAmBpB;AASD,wBAAgB,aAAa,CAAC,eAAe,EAAE,iBAAiB,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAMhG;AAED,MAAM,MAAM,mBAAmB,GAAG;IAChC,UAAU,EAAE,kBAAkB,CAAC;IAC/B,UAAU,EAAE,mBAAmB,CAAC;IAChC,cAAc,EAAE,uBAAuB,CAAC;CACzC,CAAC;AAMF,wBAAgB,sBAAsB,CACpC,eAAe,EAAE,iBAAiB,GAAG,SAAS,GAC7C,mBAAmB,CA2BrB"}
|