@flanksource/clicky-ui 0.3.46 → 0.3.48
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/NOTICE.md +11 -0
- package/README.md +49 -0
- package/dist/ai.cjs +13 -8
- package/dist/ai.cjs.map +1 -1
- package/dist/ai.js +7 -2
- package/dist/ai.js.map +1 -1
- package/dist/comments/CommentSidePanel.cjs +10 -4
- package/dist/comments/CommentSidePanel.cjs.map +1 -1
- package/dist/comments/CommentSidePanel.d.ts +2 -0
- package/dist/comments/CommentSidePanel.d.ts.map +1 -1
- package/dist/comments/CommentSidePanel.js +10 -4
- package/dist/comments/CommentSidePanel.js.map +1 -1
- package/dist/comments/CommentThread.cjs +2 -0
- package/dist/comments/CommentThread.cjs.map +1 -1
- package/dist/comments/CommentThread.d.ts +2 -1
- package/dist/comments/CommentThread.d.ts.map +1 -1
- package/dist/comments/CommentThread.js +2 -0
- package/dist/comments/CommentThread.js.map +1 -1
- package/dist/comments/CommentThreadList.cjs +3 -0
- package/dist/comments/CommentThreadList.cjs.map +1 -1
- package/dist/comments/CommentThreadList.d.ts +3 -1
- package/dist/comments/CommentThreadList.d.ts.map +1 -1
- package/dist/comments/CommentThreadList.js +3 -0
- package/dist/comments/CommentThreadList.js.map +1 -1
- package/dist/components/ErrorWrapper.cjs +2 -3
- package/dist/components/ErrorWrapper.cjs.map +1 -1
- package/dist/components/ErrorWrapper.d.ts.map +1 -1
- package/dist/components/ErrorWrapper.js +3 -4
- package/dist/components/ErrorWrapper.js.map +1 -1
- package/dist/data/Clicky.cjs +3 -0
- package/dist/data/Clicky.cjs.map +1 -1
- package/dist/data/Clicky.js +3 -0
- package/dist/data/Clicky.js.map +1 -1
- package/dist/data/CodeLine.cjs +4 -2
- package/dist/data/CodeLine.cjs.map +1 -1
- package/dist/data/CodeLine.d.ts.map +1 -1
- package/dist/data/CodeLine.js +4 -2
- package/dist/data/CodeLine.js.map +1 -1
- package/dist/data/FilterPill.cjs +15 -2
- package/dist/data/FilterPill.cjs.map +1 -1
- package/dist/data/FilterPill.d.ts +1 -1
- package/dist/data/FilterPill.d.ts.map +1 -1
- package/dist/data/FilterPill.js +15 -2
- package/dist/data/FilterPill.js.map +1 -1
- package/dist/data/LogViewer.cjs +27 -8
- package/dist/data/LogViewer.cjs.map +1 -1
- package/dist/data/LogViewer.d.ts +11 -3
- package/dist/data/LogViewer.d.ts.map +1 -1
- package/dist/data/LogViewer.js +27 -8
- package/dist/data/LogViewer.js.map +1 -1
- package/dist/data/Properties.cjs +2 -15
- package/dist/data/Properties.cjs.map +1 -1
- package/dist/data/Properties.d.ts +4 -0
- package/dist/data/Properties.d.ts.map +1 -1
- package/dist/data/Properties.js +2 -15
- package/dist/data/Properties.js.map +1 -1
- package/dist/data/PropertyValue.cjs +37 -0
- package/dist/data/PropertyValue.cjs.map +1 -0
- package/dist/data/PropertyValue.d.ts +6 -0
- package/dist/data/PropertyValue.d.ts.map +1 -0
- package/dist/data/PropertyValue.js +37 -0
- package/dist/data/PropertyValue.js.map +1 -0
- package/dist/data/SymbolBadge.cjs +61 -0
- package/dist/data/SymbolBadge.cjs.map +1 -0
- package/dist/data/SymbolBadge.d.ts +21 -0
- package/dist/data/SymbolBadge.d.ts.map +1 -0
- package/dist/data/SymbolBadge.js +61 -0
- package/dist/data/SymbolBadge.js.map +1 -0
- package/dist/data/Tree.cjs +4 -3
- package/dist/data/Tree.cjs.map +1 -1
- package/dist/data/Tree.d.ts +3 -1
- package/dist/data/Tree.d.ts.map +1 -1
- package/dist/data/Tree.js +4 -3
- package/dist/data/Tree.js.map +1 -1
- package/dist/data/ai/ChatFab.cjs +1 -1
- package/dist/data/ai/ChatFab.cjs.map +1 -1
- package/dist/data/ai/ChatFab.js +1 -1
- package/dist/data/ai/ChatFab.js.map +1 -1
- package/dist/data/ai/ChatWindow.cjs +106 -171
- package/dist/data/ai/ChatWindow.cjs.map +1 -1
- package/dist/data/ai/ChatWindow.d.ts +6 -2
- package/dist/data/ai/ChatWindow.d.ts.map +1 -1
- package/dist/data/ai/ChatWindow.header.cjs +104 -0
- package/dist/data/ai/ChatWindow.header.cjs.map +1 -0
- package/dist/data/ai/ChatWindow.header.d.ts +29 -0
- package/dist/data/ai/ChatWindow.header.d.ts.map +1 -0
- package/dist/data/ai/ChatWindow.header.js +104 -0
- package/dist/data/ai/ChatWindow.header.js.map +1 -0
- package/dist/data/ai/ChatWindow.js +107 -172
- package/dist/data/ai/ChatWindow.js.map +1 -1
- package/dist/data/ai/ChatWindow.placement.cjs +95 -0
- package/dist/data/ai/ChatWindow.placement.cjs.map +1 -0
- package/dist/data/ai/ChatWindow.placement.d.ts +32 -0
- package/dist/data/ai/ChatWindow.placement.d.ts.map +1 -0
- package/dist/data/ai/ChatWindow.placement.js +95 -0
- package/dist/data/ai/ChatWindow.placement.js.map +1 -0
- package/dist/data/ai/SessionChatComposer.cjs +3 -1
- package/dist/data/ai/SessionChatComposer.cjs.map +1 -1
- package/dist/data/ai/SessionChatComposer.d.ts +4 -1
- package/dist/data/ai/SessionChatComposer.d.ts.map +1 -1
- package/dist/data/ai/SessionChatComposer.js +3 -1
- package/dist/data/ai/SessionChatComposer.js.map +1 -1
- package/dist/data/ai/SessionInspector.cjs +68 -72
- package/dist/data/ai/SessionInspector.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.composer-slot.cjs +8 -0
- package/dist/data/ai/SessionInspector.composer-slot.cjs.map +1 -0
- package/dist/data/ai/SessionInspector.composer-slot.d.ts +9 -0
- package/dist/data/ai/SessionInspector.composer-slot.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.composer-slot.js +8 -0
- package/dist/data/ai/SessionInspector.composer-slot.js.map +1 -0
- package/dist/data/ai/SessionInspector.d.ts +6 -1
- package/dist/data/ai/SessionInspector.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.js +69 -73
- package/dist/data/ai/SessionInspector.js.map +1 -1
- package/dist/data/ai/SessionInspector.legacy.cjs +41 -42
- package/dist/data/ai/SessionInspector.legacy.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.legacy.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.legacy.js +41 -42
- package/dist/data/ai/SessionInspector.legacy.js.map +1 -1
- package/dist/data/ai/SessionInspector.remote-view.cjs +14 -9
- package/dist/data/ai/SessionInspector.remote-view.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.remote-view.d.ts +6 -2
- package/dist/data/ai/SessionInspector.remote-view.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.remote-view.js +14 -9
- package/dist/data/ai/SessionInspector.remote-view.js.map +1 -1
- package/dist/data/ai/SessionInspector.remote.cjs +84 -16
- package/dist/data/ai/SessionInspector.remote.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.remote.d.ts +42 -7
- package/dist/data/ai/SessionInspector.remote.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.remote.js +86 -18
- package/dist/data/ai/SessionInspector.remote.js.map +1 -1
- package/dist/data/ai/SessionInspector.transcript.cjs +5 -0
- package/dist/data/ai/SessionInspector.transcript.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.transcript.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.transcript.js +5 -0
- package/dist/data/ai/SessionInspector.transcript.js.map +1 -1
- package/dist/data/ai/SessionTail.cjs +63 -0
- package/dist/data/ai/SessionTail.cjs.map +1 -0
- package/dist/data/ai/SessionTail.d.ts +14 -0
- package/dist/data/ai/SessionTail.d.ts.map +1 -0
- package/dist/data/ai/SessionTail.js +63 -0
- package/dist/data/ai/SessionTail.js.map +1 -0
- package/dist/data/ai/SessionViewer.cjs +10 -3
- package/dist/data/ai/SessionViewer.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.d.ts +7 -1
- package/dist/data/ai/SessionViewer.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.js +10 -3
- package/dist/data/ai/SessionViewer.js.map +1 -1
- package/dist/data/ai/SessionViewer.unified.d.ts +14 -0
- package/dist/data/ai/SessionViewer.unified.d.ts.map +1 -1
- package/dist/data/ai/index.d.ts +4 -3
- package/dist/data/ai/index.d.ts.map +1 -1
- package/dist/data/ai/use-session-scroll.cjs +30 -6
- package/dist/data/ai/use-session-scroll.cjs.map +1 -1
- package/dist/data/ai/use-session-scroll.d.ts +7 -0
- package/dist/data/ai/use-session-scroll.d.ts.map +1 -1
- package/dist/data/ai/use-session-scroll.js +30 -6
- package/dist/data/ai/use-session-scroll.js.map +1 -1
- package/dist/data/chat/Chat.cjs +1 -1
- package/dist/data/chat/Chat.cjs.map +1 -1
- package/dist/data/chat/Chat.js +1 -1
- package/dist/data/chat/Chat.js.map +1 -1
- package/dist/data/chat/ChatRuntimeToolbar.cjs +4 -4
- package/dist/data/chat/ChatRuntimeToolbar.cjs.map +1 -1
- package/dist/data/chat/ChatRuntimeToolbar.d.ts.map +1 -1
- package/dist/data/chat/ChatRuntimeToolbar.js +4 -4
- package/dist/data/chat/ChatRuntimeToolbar.js.map +1 -1
- package/dist/data/chat/PromptInput.cjs +4 -2
- package/dist/data/chat/PromptInput.cjs.map +1 -1
- package/dist/data/chat/PromptInput.d.ts +5 -1
- package/dist/data/chat/PromptInput.d.ts.map +1 -1
- package/dist/data/chat/PromptInput.js +4 -2
- package/dist/data/chat/PromptInput.js.map +1 -1
- package/dist/data/diagnostics/ErrorDetails.cjs +13 -2
- package/dist/data/diagnostics/ErrorDetails.cjs.map +1 -1
- package/dist/data/diagnostics/ErrorDetails.d.ts +3 -1
- package/dist/data/diagnostics/ErrorDetails.d.ts.map +1 -1
- package/dist/data/diagnostics/ErrorDetails.js +14 -3
- package/dist/data/diagnostics/ErrorDetails.js.map +1 -1
- package/dist/data/diagnostics/FrameSourceWindow.cjs +3 -2
- package/dist/data/diagnostics/FrameSourceWindow.cjs.map +1 -1
- package/dist/data/diagnostics/FrameSourceWindow.d.ts.map +1 -1
- package/dist/data/diagnostics/FrameSourceWindow.js +3 -2
- package/dist/data/diagnostics/FrameSourceWindow.js.map +1 -1
- package/dist/data/diagnostics/error-diagnostics.cjs +5 -0
- package/dist/data/diagnostics/error-diagnostics.cjs.map +1 -1
- package/dist/data/diagnostics/error-diagnostics.d.ts +1 -0
- package/dist/data/diagnostics/error-diagnostics.d.ts.map +1 -1
- package/dist/data/diagnostics/error-diagnostics.js +6 -1
- package/dist/data/diagnostics/error-diagnostics.js.map +1 -1
- package/dist/data/har/HarPanel.cjs +3 -1
- package/dist/data/har/HarPanel.cjs.map +1 -1
- package/dist/data/har/HarPanel.d.ts +4 -1
- package/dist/data/har/HarPanel.d.ts.map +1 -1
- package/dist/data/har/HarPanel.js +3 -1
- package/dist/data/har/HarPanel.js.map +1 -1
- package/dist/data/test-runner/Expectation.cjs +57 -0
- package/dist/data/test-runner/Expectation.cjs.map +1 -0
- package/dist/data/test-runner/Expectation.d.ts +19 -0
- package/dist/data/test-runner/Expectation.d.ts.map +1 -0
- package/dist/data/test-runner/Expectation.js +57 -0
- package/dist/data/test-runner/Expectation.js.map +1 -0
- package/dist/data/test-runner/MarkIcons.cjs +38 -0
- package/dist/data/test-runner/MarkIcons.cjs.map +1 -0
- package/dist/data/test-runner/MarkIcons.d.ts +15 -0
- package/dist/data/test-runner/MarkIcons.d.ts.map +1 -0
- package/dist/data/test-runner/MarkIcons.js +38 -0
- package/dist/data/test-runner/MarkIcons.js.map +1 -0
- package/dist/data/test-runner/TestDetailPanel.cjs +99 -53
- package/dist/data/test-runner/TestDetailPanel.cjs.map +1 -1
- package/dist/data/test-runner/TestDetailPanel.d.ts.map +1 -1
- package/dist/data/test-runner/TestDetailPanel.js +101 -55
- package/dist/data/test-runner/TestDetailPanel.js.map +1 -1
- package/dist/data/test-runner/TestFailureDetail.cjs +23 -27
- package/dist/data/test-runner/TestFailureDetail.cjs.map +1 -1
- package/dist/data/test-runner/TestFailureDetail.d.ts +2 -2
- package/dist/data/test-runner/TestFailureDetail.d.ts.map +1 -1
- package/dist/data/test-runner/TestFailureDetail.js +23 -27
- package/dist/data/test-runner/TestFailureDetail.js.map +1 -1
- package/dist/data/test-runner/TestFilterBar.cjs +87 -93
- package/dist/data/test-runner/TestFilterBar.cjs.map +1 -1
- package/dist/data/test-runner/TestFilterBar.d.ts +3 -2
- package/dist/data/test-runner/TestFilterBar.d.ts.map +1 -1
- package/dist/data/test-runner/TestFilterBar.js +89 -95
- package/dist/data/test-runner/TestFilterBar.js.map +1 -1
- package/dist/data/test-runner/TestRunSummary.cjs +35 -21
- package/dist/data/test-runner/TestRunSummary.cjs.map +1 -1
- package/dist/data/test-runner/TestRunSummary.d.ts.map +1 -1
- package/dist/data/test-runner/TestRunSummary.js +35 -21
- package/dist/data/test-runner/TestRunSummary.js.map +1 -1
- package/dist/data/test-runner/TestRunner.cjs +58 -30
- package/dist/data/test-runner/TestRunner.cjs.map +1 -1
- package/dist/data/test-runner/TestRunner.d.ts +6 -3
- package/dist/data/test-runner/TestRunner.d.ts.map +1 -1
- package/dist/data/test-runner/TestRunner.js +58 -30
- package/dist/data/test-runner/TestRunner.js.map +1 -1
- package/dist/data/test-runner/TestTree.cjs +5 -2
- package/dist/data/test-runner/TestTree.cjs.map +1 -1
- package/dist/data/test-runner/TestTree.d.ts +5 -2
- package/dist/data/test-runner/TestTree.d.ts.map +1 -1
- package/dist/data/test-runner/TestTree.js +5 -2
- package/dist/data/test-runner/TestTree.js.map +1 -1
- package/dist/data/test-runner/TestTreeNode.cjs +28 -19
- package/dist/data/test-runner/TestTreeNode.cjs.map +1 -1
- package/dist/data/test-runner/TestTreeNode.d.ts.map +1 -1
- package/dist/data/test-runner/TestTreeNode.js +29 -20
- package/dist/data/test-runner/TestTreeNode.js.map +1 -1
- package/dist/data/test-runner/adapter.cjs +15 -0
- package/dist/data/test-runner/adapter.cjs.map +1 -1
- package/dist/data/test-runner/adapter.d.ts +27 -7
- package/dist/data/test-runner/adapter.d.ts.map +1 -1
- package/dist/data/test-runner/adapter.js +15 -0
- package/dist/data/test-runner/adapter.js.map +1 -1
- package/dist/data/test-runner/context.cjs.map +1 -1
- package/dist/data/test-runner/context.d.ts +2 -0
- package/dist/data/test-runner/context.d.ts.map +1 -1
- package/dist/data/test-runner/context.js.map +1 -1
- package/dist/data/test-runner/copy.cjs +114 -0
- package/dist/data/test-runner/copy.cjs.map +1 -0
- package/dist/data/test-runner/copy.d.ts +47 -0
- package/dist/data/test-runner/copy.d.ts.map +1 -0
- package/dist/data/test-runner/copy.js +114 -0
- package/dist/data/test-runner/copy.js.map +1 -0
- package/dist/data/test-runner/index.d.ts +6 -3
- package/dist/data/test-runner/index.d.ts.map +1 -1
- package/dist/data/test-runner/marks.cjs +184 -0
- package/dist/data/test-runner/marks.cjs.map +1 -0
- package/dist/data/test-runner/marks.d.ts +40 -0
- package/dist/data/test-runner/marks.d.ts.map +1 -0
- package/dist/data/test-runner/marks.js +184 -0
- package/dist/data/test-runner/marks.js.map +1 -0
- package/dist/data/test-runner/status.cjs +27 -44
- package/dist/data/test-runner/status.cjs.map +1 -1
- package/dist/data/test-runner/status.d.ts +12 -3
- package/dist/data/test-runner/status.d.ts.map +1 -1
- package/dist/data/test-runner/status.js +27 -44
- package/dist/data/test-runner/status.js.map +1 -1
- package/dist/data/traces/TerminalCastPlayer.d.ts +21 -0
- package/dist/data/traces/TerminalCastPlayer.d.ts.map +1 -0
- package/dist/data/traces/TraceHarView.d.ts +13 -0
- package/dist/data/traces/TraceHarView.d.ts.map +1 -0
- package/dist/data/traces/cast.d.ts +9 -0
- package/dist/data/traces/cast.d.ts.map +1 -0
- package/dist/data/traces/fixtures.d.ts +8 -0
- package/dist/data/traces/fixtures.d.ts.map +1 -0
- package/dist/data/traces/har-adapter.d.ts +13 -0
- package/dist/data/traces/har-adapter.d.ts.map +1 -0
- package/dist/data/traces/terminal-screen.d.ts +45 -0
- package/dist/data/traces/terminal-screen.d.ts.map +1 -0
- package/dist/data/traces/terminal-timeline.d.ts +26 -0
- package/dist/data/traces/terminal-timeline.d.ts.map +1 -0
- package/dist/data/traces/types.d.ts +141 -0
- package/dist/data/traces/types.d.ts.map +1 -0
- package/dist/data/verification/VerificationResults.cjs +4 -0
- package/dist/data/verification/VerificationResults.cjs.map +1 -1
- package/dist/data/verification/VerificationResults.d.ts +3 -1
- package/dist/data/verification/VerificationResults.d.ts.map +1 -1
- package/dist/data/verification/VerificationResults.js +4 -0
- package/dist/data/verification/VerificationResults.js.map +1 -1
- package/dist/data/verification/adapterViews.cjs +28 -44
- package/dist/data/verification/adapterViews.cjs.map +1 -1
- package/dist/data/verification/adapterViews.d.ts +4 -1
- package/dist/data/verification/adapterViews.d.ts.map +1 -1
- package/dist/data/verification/adapterViews.js +28 -44
- package/dist/data/verification/adapterViews.js.map +1 -1
- package/dist/data/verification/adapters.cjs +163 -8
- package/dist/data/verification/adapters.cjs.map +1 -1
- package/dist/data/verification/adapters.d.ts +7 -1
- package/dist/data/verification/adapters.d.ts.map +1 -1
- package/dist/data/verification/adapters.js +163 -8
- package/dist/data/verification/adapters.js.map +1 -1
- package/dist/data/verification/index.d.ts +4 -2
- package/dist/data/verification/index.d.ts.map +1 -1
- package/dist/data/verification/stepKind.cjs +217 -0
- package/dist/data/verification/stepKind.cjs.map +1 -0
- package/dist/data/verification/stepKind.d.ts +87 -0
- package/dist/data/verification/stepKind.d.ts.map +1 -0
- package/dist/data/verification/stepKind.js +217 -0
- package/dist/data/verification/stepKind.js.map +1 -0
- package/dist/data/verification/stepKindViews.cjs +111 -0
- package/dist/data/verification/stepKindViews.cjs.map +1 -0
- package/dist/data/verification/stepKindViews.d.ts +18 -0
- package/dist/data/verification/stepKindViews.d.ts.map +1 -0
- package/dist/data/verification/stepKindViews.js +111 -0
- package/dist/data/verification/stepKindViews.js.map +1 -0
- package/dist/data/verification/verifyReportTests.cjs +1 -0
- package/dist/data/verification/verifyReportTests.cjs.map +1 -1
- package/dist/data/verification/verifyReportTests.d.ts +2 -1
- package/dist/data/verification/verifyReportTests.d.ts.map +1 -1
- package/dist/data/verification/verifyReportTests.js +1 -0
- package/dist/data/verification/verifyReportTests.js.map +1 -1
- package/dist/data/version-info.cjs +3 -3
- package/dist/data/version-info.js +3 -3
- package/dist/data.cjs +58 -3
- package/dist/data.cjs.map +1 -1
- package/dist/data.d.ts +3 -0
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +60 -5
- package/dist/data.js.map +1 -1
- package/dist/icons/components/UiLogoEslint.cjs +10 -0
- package/dist/icons/components/UiLogoEslint.cjs.map +1 -0
- package/dist/icons/components/UiLogoEslint.d.ts +9 -0
- package/dist/icons/components/UiLogoEslint.d.ts.map +1 -0
- package/dist/icons/components/UiLogoEslint.js +10 -0
- package/dist/icons/components/UiLogoEslint.js.map +1 -0
- package/dist/icons/components/UiLogoGo.cjs +10 -0
- package/dist/icons/components/UiLogoGo.cjs.map +1 -0
- package/dist/icons/components/UiLogoGo.d.ts +9 -0
- package/dist/icons/components/UiLogoGo.d.ts.map +1 -0
- package/dist/icons/components/UiLogoGo.js +10 -0
- package/dist/icons/components/UiLogoGo.js.map +1 -0
- package/dist/icons/components/UiLogoJest.cjs +10 -0
- package/dist/icons/components/UiLogoJest.cjs.map +1 -0
- package/dist/icons/components/UiLogoJest.d.ts +9 -0
- package/dist/icons/components/UiLogoJest.d.ts.map +1 -0
- package/dist/icons/components/UiLogoJest.js +10 -0
- package/dist/icons/components/UiLogoJest.js.map +1 -0
- package/dist/icons/components/UiLogoMarkdown.cjs +10 -0
- package/dist/icons/components/UiLogoMarkdown.cjs.map +1 -0
- package/dist/icons/components/UiLogoMarkdown.d.ts +9 -0
- package/dist/icons/components/UiLogoMarkdown.d.ts.map +1 -0
- package/dist/icons/components/UiLogoMarkdown.js +10 -0
- package/dist/icons/components/UiLogoMarkdown.js.map +1 -0
- package/dist/icons/components/UiLogoOxc.cjs +10 -0
- package/dist/icons/components/UiLogoOxc.cjs.map +1 -0
- package/dist/icons/components/UiLogoOxc.d.ts +9 -0
- package/dist/icons/components/UiLogoOxc.d.ts.map +1 -0
- package/dist/icons/components/UiLogoOxc.js +10 -0
- package/dist/icons/components/UiLogoOxc.js.map +1 -0
- package/dist/icons/components/UiLogoPlaywright.cjs +10 -0
- package/dist/icons/components/UiLogoPlaywright.cjs.map +1 -0
- package/dist/icons/components/UiLogoPlaywright.d.ts +9 -0
- package/dist/icons/components/UiLogoPlaywright.d.ts.map +1 -0
- package/dist/icons/components/UiLogoPlaywright.js +10 -0
- package/dist/icons/components/UiLogoPlaywright.js.map +1 -0
- package/dist/icons/components/UiLogoPython.cjs +10 -0
- package/dist/icons/components/UiLogoPython.cjs.map +1 -0
- package/dist/icons/components/UiLogoPython.d.ts +9 -0
- package/dist/icons/components/UiLogoPython.d.ts.map +1 -0
- package/dist/icons/components/UiLogoPython.js +10 -0
- package/dist/icons/components/UiLogoPython.js.map +1 -0
- package/dist/icons/components/UiLogoReact.cjs +10 -0
- package/dist/icons/components/UiLogoReact.cjs.map +1 -0
- package/dist/icons/components/UiLogoReact.d.ts +9 -0
- package/dist/icons/components/UiLogoReact.d.ts.map +1 -0
- package/dist/icons/components/UiLogoReact.js +10 -0
- package/dist/icons/components/UiLogoReact.js.map +1 -0
- package/dist/icons/components/UiLogoRuff.cjs +10 -0
- package/dist/icons/components/UiLogoRuff.cjs.map +1 -0
- package/dist/icons/components/UiLogoRuff.d.ts +9 -0
- package/dist/icons/components/UiLogoRuff.d.ts.map +1 -0
- package/dist/icons/components/UiLogoRuff.js +10 -0
- package/dist/icons/components/UiLogoRuff.js.map +1 -0
- package/dist/icons/components/UiLogoTypescript.cjs +10 -0
- package/dist/icons/components/UiLogoTypescript.cjs.map +1 -0
- package/dist/icons/components/UiLogoTypescript.d.ts +9 -0
- package/dist/icons/components/UiLogoTypescript.d.ts.map +1 -0
- package/dist/icons/components/UiLogoTypescript.js +10 -0
- package/dist/icons/components/UiLogoTypescript.js.map +1 -0
- package/dist/icons/components/UiLogoVitest.cjs +10 -0
- package/dist/icons/components/UiLogoVitest.cjs.map +1 -0
- package/dist/icons/components/UiLogoVitest.d.ts +9 -0
- package/dist/icons/components/UiLogoVitest.d.ts.map +1 -0
- package/dist/icons/components/UiLogoVitest.js +10 -0
- package/dist/icons/components/UiLogoVitest.js.map +1 -0
- package/dist/icons/index.d.ts +11 -0
- package/dist/icons/index.d.ts.map +1 -1
- package/dist/icons/registry.cjs +22 -0
- package/dist/icons/registry.cjs.map +1 -1
- package/dist/icons/registry.d.ts.map +1 -1
- package/dist/icons/registry.js +22 -0
- package/dist/icons/registry.js.map +1 -1
- package/dist/icons.cjs +22 -0
- package/dist/icons.cjs.map +1 -1
- package/dist/icons.js +22 -0
- package/dist/icons.js.map +1 -1
- package/dist/index.cjs +60 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +62 -5
- package/dist/index.js.map +1 -1
- package/dist/overlay/DropdownMenuSubmenu.cjs +4 -4
- package/dist/overlay/DropdownMenuSubmenu.cjs.map +1 -1
- package/dist/overlay/DropdownMenuSubmenu.js +4 -4
- package/dist/overlay/DropdownMenuSubmenu.js.map +1 -1
- package/dist/rpc/FilterForm.cjs +9 -0
- package/dist/rpc/FilterForm.cjs.map +1 -1
- package/dist/rpc/FilterForm.d.ts +5 -1
- package/dist/rpc/FilterForm.d.ts.map +1 -1
- package/dist/rpc/FilterForm.js +9 -0
- package/dist/rpc/FilterForm.js.map +1 -1
- package/dist/rpc/InlineError.cjs +12 -43
- package/dist/rpc/InlineError.cjs.map +1 -1
- package/dist/rpc/InlineError.d.ts.map +1 -1
- package/dist/rpc/InlineError.js +13 -44
- package/dist/rpc/InlineError.js.map +1 -1
- package/dist/rpc/OperationArgsForm.cjs +153 -0
- package/dist/rpc/OperationArgsForm.cjs.map +1 -0
- package/dist/rpc/OperationArgsForm.d.ts +16 -0
- package/dist/rpc/OperationArgsForm.d.ts.map +1 -0
- package/dist/rpc/OperationArgsForm.js +153 -0
- package/dist/rpc/OperationArgsForm.js.map +1 -0
- package/dist/rpc/OperationScheduleDialog.cjs +119 -22
- package/dist/rpc/OperationScheduleDialog.cjs.map +1 -1
- package/dist/rpc/OperationScheduleDialog.d.ts +7 -0
- package/dist/rpc/OperationScheduleDialog.d.ts.map +1 -1
- package/dist/rpc/OperationScheduleDialog.js +120 -23
- package/dist/rpc/OperationScheduleDialog.js.map +1 -1
- package/dist/rpc/OperationSchedules.cjs +17 -2
- package/dist/rpc/OperationSchedules.cjs.map +1 -1
- package/dist/rpc/OperationSchedules.d.ts.map +1 -1
- package/dist/rpc/OperationSchedules.js +17 -2
- package/dist/rpc/OperationSchedules.js.map +1 -1
- package/dist/rpc/operation-schedule-model.cjs +2 -7
- package/dist/rpc/operation-schedule-model.cjs.map +1 -1
- package/dist/rpc/operation-schedule-model.d.ts +0 -2
- package/dist/rpc/operation-schedule-model.d.ts.map +1 -1
- package/dist/rpc/operation-schedule-model.js +2 -7
- package/dist/rpc/operation-schedule-model.js.map +1 -1
- package/dist/rpc/operation-schedule-types.d.ts +12 -1
- package/dist/rpc/operation-schedule-types.d.ts.map +1 -1
- package/dist/rpc.cjs +2 -0
- package/dist/rpc.cjs.map +1 -1
- package/dist/rpc.d.ts +1 -0
- package/dist/rpc.d.ts.map +1 -1
- package/dist/rpc.js +2 -0
- package/dist/rpc.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +1 -1
- package/dist/data/test-runner/frameworkIcon.cjs +0 -27
- package/dist/data/test-runner/frameworkIcon.cjs.map +0 -1
- package/dist/data/test-runner/frameworkIcon.d.ts +0 -3
- package/dist/data/test-runner/frameworkIcon.d.ts.map +0 -1
- package/dist/data/test-runner/frameworkIcon.js +0 -27
- package/dist/data/test-runner/frameworkIcon.js.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DropdownMenuSubmenu.js","sources":["../../src/overlay/DropdownMenuSubmenu.tsx"],"sourcesContent":["import { Fragment, useContext, useEffect, useRef, useState } from \"react\";\nimport {\n autoUpdate,\n flip,\n FloatingFocusManager,\n FloatingList,\n FloatingNode,\n FloatingPortal,\n offset,\n safePolygon,\n shift,\n useClick,\n useDismiss,\n useFloating,\n useFloatingNodeId,\n useFloatingParentNodeId,\n useFloatingTree,\n useHover,\n useInteractions,\n useListItem,\n useListNavigation,\n useMergeRefs,\n useRole,\n type UseInteractionsReturn,\n} from \"@floating-ui/react\";\nimport { Icon, type StaticIconComponent } from \"../data/Icon\";\nimport { UiChevronRight } from \"../icons\";\nimport { MENU_POPOVER_CLASS, MenuContext } from \"./dropdownMenuContext\";\nimport { useEscapeLayer, useFloatingZIndex } from \"./modalStack\";\nimport type { DropdownMenuItem } from \"./DropdownMenu\";\nimport { cn } from \"../lib/utils\";\n\n// Shared item surfaces so a leaf renders identically in the root menu or a\n// flyout submenu.\nconst MENU_ITEM_CLASS =\n \"flex w-full items-center gap-2 px-3 py-1.5 text-left text-xs text-popover-foreground hover:bg-accent hover:text-accent-foreground disabled:pointer-events-none disabled:opacity-50\";\nconst MENU_HEADER_CLASS =\n \"select-none px-3 pb-1 pt-2 text-[10px] font-medium uppercase tracking-wide text-muted-foreground\";\n\nfunction MenuItemIcon({\n icon,\n iconColor,\n iconClassName,\n}: {\n icon: string | StaticIconComponent | undefined;\n iconColor: string | undefined;\n iconClassName: string | undefined;\n}) {\n if (!icon) return null;\n return (\n // `text-base` rather than inheriting the row: `Icon` sizes at 1em, so on a\n // `text-xs` row the glyph came out at 12px — smaller than anything a caller\n // puts in the label beside it, and too small to identify at a glance. The\n // row's content box is already 16px tall, so this does not change its height.\n <span\n className={cn(\"inline-flex shrink-0 text-base\", iconClassName)}\n style={iconColor ? { color: iconColor } : undefined}\n >\n <Icon {...(typeof icon === \"string\" ? { name: icon } : { icon })} />\n </span>\n );\n}\n\nfunction MenuLeaf({ item }: { item: DropdownMenuItem }) {\n const menu = useContext(MenuContext);\n const tree = useFloatingTree();\n const listItem = useListItem();\n const isActive = listItem.index === menu.activeIndex;\n\n const activate = () => {\n if (item.disabled) return;\n item.onSelect();\n // A selection closes every open level; each menu subscribes to \"click\".\n tree?.events.emit(\"click\");\n };\n\n return (\n <button\n ref={listItem.ref}\n type=\"button\"\n role=\"menuitem\"\n tabIndex={isActive ? 0 : -1}\n disabled={item.disabled}\n title={item.title}\n className={MENU_ITEM_CLASS}\n {...menu.getItemProps({\n onClick: activate,\n onFocus: () => menu.setHasFocusInside(true),\n onKeyDown: (event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n activate();\n }\n },\n })}\n >\n <MenuItemIcon\n icon={item.icon}\n iconColor={item.iconColor}\n iconClassName={item.iconClassName}\n />\n {item.label}\n </button>\n );\n}\n\nfunction MenuSubmenu({ item }: { item: DropdownMenuItem }) {\n const parent = useContext(MenuContext);\n const tree = useFloatingTree();\n const nodeId = useFloatingNodeId();\n const parentId = useFloatingParentNodeId();\n const listItem = useListItem();\n\n const [isOpen, setIsOpen] = useState(false);\n const [activeIndex, setActiveIndex] = useState<number | null>(null);\n const [hasFocusInside, setHasFocusInside] = useState(false);\n const elementsRef = useRef<Array<HTMLElement | null>>([]);\n const floatingZ = useFloatingZIndex();\n\n const { refs, floatingStyles, context } = useFloating<HTMLButtonElement>({\n // nodeId is always defined inside the FloatingTree; guard for the type only.\n ...(nodeId ? { nodeId } : {}),\n open: isOpen,\n onOpenChange: setIsOpen,\n placement: \"right-start\",\n middleware: [\n offset({ mainAxis: 0, alignmentAxis: -4 }),\n flip({ padding: 8 }),\n shift({ padding: 8, crossAxis: true }),\n ],\n whileElementsMounted: autoUpdate,\n });\n\n const hover = useHover(context, {\n delay: { open: 75 },\n handleClose: safePolygon(),\n });\n // Hover opens the flyout for mouse users; click/tap also opens it (touch and\n // keyboard) but never toggles it shut — leaving via safePolygon or selecting a\n // leaf is what closes it.\n const click = useClick(context, { toggle: false });\n const role = useRole(context, { role: \"menu\" });\n // Escape is owned by useEscapeLayer (below) so it dismisses one menu level at\n // a time and cooperates with modals; useDismiss keeps outside-press dismissal.\n const dismiss = useDismiss(context, { escapeKey: false, bubbles: true });\n const listNav = useListNavigation(context, {\n listRef: elementsRef,\n activeIndex,\n nested: true,\n onNavigate: setActiveIndex,\n loop: true,\n });\n const { getReferenceProps, getFloatingProps, getItemProps } = useInteractions(\n [hover, click, role, dismiss, listNav],\n );\n\n useEscapeLayer(isOpen, () => setIsOpen(false));\n\n useEffect(() => {\n if (!tree) return;\n const closeAll = () => setIsOpen(false);\n const closeSiblings = (event: {\n nodeId: string;\n parentId: string | null;\n }) => {\n if (event.nodeId !== nodeId && event.parentId === parentId) {\n setIsOpen(false);\n }\n };\n tree.events.on(\"click\", closeAll);\n tree.events.on(\"menuopen\", closeSiblings);\n return () => {\n tree.events.off(\"click\", closeAll);\n tree.events.off(\"menuopen\", closeSiblings);\n };\n }, [tree, nodeId, parentId]);\n\n useEffect(() => {\n if (isOpen && tree) tree.events.emit(\"menuopen\", { parentId, nodeId });\n }, [isOpen, tree, nodeId, parentId]);\n\n const isActive = listItem.index === parent.activeIndex;\n const referenceRef = useMergeRefs([refs.setReference, listItem.ref]);\n const ariaLabel = typeof item.label === \"string\" ? item.label : undefined;\n\n return (\n <FloatingNode id={nodeId}>\n <button\n ref={referenceRef}\n type=\"button\"\n role=\"menuitem\"\n tabIndex={isActive ? 0 : -1}\n disabled={item.disabled}\n title={item.title}\n aria-haspopup=\"menu\"\n aria-expanded={isOpen}\n data-focus-inside={hasFocusInside ? \"\" : undefined}\n className={MENU_ITEM_CLASS}\n {...parent.getItemProps(\n // Merge the parent's roving-tabindex props with this trigger's own\n // reference props (open on hover/click/ArrowRight). Both prop-getters\n // return an opaque prop bag; the cast bridges the two getter\n // signatures (getReferenceProps -> getItemProps parameter).\n getReferenceProps({\n onFocus: () => {\n setHasFocusInside(false);\n parent.setHasFocusInside(true);\n },\n }) as unknown as Parameters<UseInteractionsReturn[\"getItemProps\"]>[0],\n )}\n >\n <MenuItemIcon\n icon={item.icon}\n iconColor={item.iconColor}\n iconClassName={item.iconClassName}\n />\n <span className=\"min-w-0 flex-1 truncate\">{item.label}</span>\n <Icon icon={UiChevronRight} className=\"ml-auto shrink-0 opacity-60\" />\n </button>\n <MenuContext.Provider\n value={{\n getItemProps,\n activeIndex,\n setActiveIndex,\n setHasFocusInside,\n isOpen,\n }}\n >\n <FloatingList elementsRef={elementsRef}>\n {isOpen && (\n <FloatingPortal>\n <FloatingFocusManager\n context={context}\n modal={false}\n initialFocus={-1}\n returnFocus={false}\n >\n <div\n ref={refs.setFloating}\n role=\"menu\"\n style={{ ...floatingStyles, zIndex: floatingZ }}\n className={MENU_POPOVER_CLASS}\n {...getFloatingProps()}\n aria-label={ariaLabel}\n {...(ariaLabel ? { \"aria-labelledby\": undefined } : {})}\n >\n {item.header != null && (\n <div className=\"border-b border-border px-3 py-1.5\">\n {item.header}\n </div>\n )}\n <MenuItemList items={item.children ?? []} />\n </div>\n </FloatingFocusManager>\n </FloatingPortal>\n )}\n </FloatingList>\n </MenuContext.Provider>\n </FloatingNode>\n );\n}\n\n/**\n * Renders one menu level: a leaf `menuitem` button, or a submenu trigger when\n * the item has `children`. A group header renders above the first item of each\n * contiguous group (headers are not focusable, so keyboard navigation stays\n * dense over the interactive items). Must be rendered inside a `FloatingList`\n * whose `elementsRef` backs the enclosing menu's list navigation.\n */\nexport function MenuItemList({ items }: { items: DropdownMenuItem[] }) {\n return (\n <>\n {items.map((item, index) => {\n const showHeader =\n item.group != null && item.group !== items[index - 1]?.group;\n const hasChildren = !!item.children && item.children.length > 0;\n return (\n <Fragment key={index}>\n {showHeader && (\n <div role=\"presentation\" className={MENU_HEADER_CLASS}>\n {item.group}\n </div>\n )}\n {hasChildren ? (\n <MenuSubmenu item={item} />\n ) : (\n <MenuLeaf item={item} />\n )}\n </Fragment>\n );\n })}\n </>\n );\n}\n"],"names":["Fragment"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"DropdownMenuSubmenu.js","sources":["../../src/overlay/DropdownMenuSubmenu.tsx"],"sourcesContent":["import { Fragment, useContext, useEffect, useRef, useState } from \"react\";\nimport {\n autoUpdate,\n flip,\n FloatingFocusManager,\n FloatingList,\n FloatingNode,\n FloatingPortal,\n offset,\n safePolygon,\n shift,\n useClick,\n useDismiss,\n useFloating,\n useFloatingNodeId,\n useFloatingParentNodeId,\n useFloatingTree,\n useHover,\n useInteractions,\n useListItem,\n useListNavigation,\n useMergeRefs,\n useRole,\n type UseInteractionsReturn,\n} from \"@floating-ui/react\";\nimport { Icon, type StaticIconComponent } from \"../data/Icon\";\nimport { UiChevronRight } from \"../icons\";\nimport { MENU_POPOVER_CLASS, MenuContext } from \"./dropdownMenuContext\";\nimport { useEscapeLayer, useFloatingZIndex } from \"./modalStack\";\nimport type { DropdownMenuItem } from \"./DropdownMenu\";\nimport { cn } from \"../lib/utils\";\n\n// Shared item surfaces so a leaf renders identically in the root menu or a\n// flyout submenu.\nconst MENU_ITEM_CLASS =\n \"flex w-full items-center gap-2 px-3 py-1.5 text-left text-xs text-popover-foreground hover:bg-accent hover:text-accent-foreground disabled:pointer-events-none disabled:opacity-50\";\nconst MENU_HEADER_CLASS =\n \"select-none px-3 pb-1 pt-2 text-[10px] font-medium uppercase tracking-wide text-muted-foreground\";\n\nfunction MenuItemIcon({\n icon,\n iconColor,\n iconClassName,\n}: {\n icon: string | StaticIconComponent | undefined;\n iconColor: string | undefined;\n iconClassName: string | undefined;\n}) {\n if (!icon) return null;\n return (\n // `text-base` rather than inheriting the row: `Icon` sizes at 1em, so on a\n // `text-xs` row the glyph came out at 12px — smaller than anything a caller\n // puts in the label beside it, and too small to identify at a glance. The\n // row's content box is already 16px tall, so this does not change its height.\n <span\n className={cn(\"inline-flex shrink-0 text-base\", iconClassName)}\n style={iconColor ? { color: iconColor } : undefined}\n >\n <Icon {...(typeof icon === \"string\" ? { name: icon } : { icon })} />\n </span>\n );\n}\n\nfunction MenuLeaf({ item }: { item: DropdownMenuItem }) {\n const menu = useContext(MenuContext);\n const tree = useFloatingTree();\n const listItem = useListItem();\n const isActive = listItem.index === menu.activeIndex;\n\n const activate = () => {\n if (item.disabled) return;\n item.onSelect();\n // A selection closes every open level; each menu subscribes to \"click\".\n tree?.events.emit(\"click\");\n };\n\n return (\n <button\n ref={listItem.ref}\n type=\"button\"\n role=\"menuitem\"\n tabIndex={isActive ? 0 : -1}\n disabled={item.disabled}\n title={item.title}\n className={MENU_ITEM_CLASS}\n {...menu.getItemProps({\n onClick: activate,\n onFocus: () => menu.setHasFocusInside(true),\n onKeyDown: (event) => {\n if (event.key === \"Enter\" || event.key === \" \") {\n event.preventDefault();\n activate();\n }\n },\n })}\n >\n <MenuItemIcon\n icon={item.icon}\n iconColor={item.iconColor}\n iconClassName={item.iconClassName}\n />\n {item.label}\n </button>\n );\n}\n\nfunction MenuSubmenu({ item }: { item: DropdownMenuItem }) {\n const parent = useContext(MenuContext);\n const tree = useFloatingTree();\n const nodeId = useFloatingNodeId();\n const parentId = useFloatingParentNodeId();\n const listItem = useListItem();\n\n const [isOpen, setIsOpen] = useState(false);\n const [activeIndex, setActiveIndex] = useState<number | null>(null);\n const [hasFocusInside, setHasFocusInside] = useState(false);\n const elementsRef = useRef<Array<HTMLElement | null>>([]);\n const floatingZ = useFloatingZIndex();\n\n const { refs, floatingStyles, context } = useFloating<HTMLButtonElement>({\n // nodeId is always defined inside the FloatingTree; guard for the type only.\n ...(nodeId ? { nodeId } : {}),\n open: isOpen,\n onOpenChange: setIsOpen,\n placement: \"right-start\",\n middleware: [\n offset({ mainAxis: 0, alignmentAxis: -4 }),\n flip({ padding: 8 }),\n shift({ padding: 8, crossAxis: true }),\n ],\n whileElementsMounted: autoUpdate,\n });\n\n const hover = useHover(context, {\n delay: { open: 75 },\n handleClose: safePolygon(),\n });\n // Hover opens the flyout for mouse users; click/tap also opens it (touch and\n // keyboard) but never toggles it shut — leaving via safePolygon or selecting a\n // leaf is what closes it.\n const click = useClick(context, { toggle: false });\n const role = useRole(context, { role: \"menu\" });\n // Escape is owned by useEscapeLayer (below) so it dismisses one menu level at\n // a time and cooperates with modals; useDismiss keeps outside-press dismissal.\n const dismiss = useDismiss(context, { escapeKey: false, bubbles: true });\n const listNav = useListNavigation(context, {\n listRef: elementsRef,\n activeIndex,\n nested: true,\n onNavigate: setActiveIndex,\n loop: true,\n });\n const { getReferenceProps, getFloatingProps, getItemProps } = useInteractions(\n [hover, click, role, dismiss, listNav],\n );\n\n useEscapeLayer(isOpen, () => context.onOpenChange(false));\n\n useEffect(() => {\n if (!tree) return;\n const closeAll = () => context.onOpenChange(false);\n const closeSiblings = (event: {\n nodeId: string;\n parentId: string | null;\n }) => {\n if (event.nodeId !== nodeId && event.parentId === parentId) {\n context.onOpenChange(false);\n }\n };\n tree.events.on(\"click\", closeAll);\n tree.events.on(\"menuopen\", closeSiblings);\n return () => {\n tree.events.off(\"click\", closeAll);\n tree.events.off(\"menuopen\", closeSiblings);\n };\n }, [tree, nodeId, parentId, context.onOpenChange]);\n\n useEffect(() => {\n if (isOpen && tree) tree.events.emit(\"menuopen\", { parentId, nodeId });\n }, [isOpen, tree, nodeId, parentId]);\n\n const isActive = listItem.index === parent.activeIndex;\n const referenceRef = useMergeRefs([refs.setReference, listItem.ref]);\n const ariaLabel = typeof item.label === \"string\" ? item.label : undefined;\n\n return (\n <FloatingNode id={nodeId}>\n <button\n ref={referenceRef}\n type=\"button\"\n role=\"menuitem\"\n tabIndex={isActive ? 0 : -1}\n disabled={item.disabled}\n title={item.title}\n aria-haspopup=\"menu\"\n aria-expanded={isOpen}\n data-focus-inside={hasFocusInside ? \"\" : undefined}\n className={MENU_ITEM_CLASS}\n {...parent.getItemProps(\n // Merge the parent's roving-tabindex props with this trigger's own\n // reference props (open on hover/click/ArrowRight). Both prop-getters\n // return an opaque prop bag; the cast bridges the two getter\n // signatures (getReferenceProps -> getItemProps parameter).\n getReferenceProps({\n onFocus: () => {\n setHasFocusInside(false);\n parent.setHasFocusInside(true);\n },\n }) as unknown as Parameters<UseInteractionsReturn[\"getItemProps\"]>[0],\n )}\n >\n <MenuItemIcon\n icon={item.icon}\n iconColor={item.iconColor}\n iconClassName={item.iconClassName}\n />\n <span className=\"min-w-0 flex-1 truncate\">{item.label}</span>\n <Icon icon={UiChevronRight} className=\"ml-auto shrink-0 opacity-60\" />\n </button>\n <MenuContext.Provider\n value={{\n getItemProps,\n activeIndex,\n setActiveIndex,\n setHasFocusInside,\n isOpen,\n }}\n >\n <FloatingList elementsRef={elementsRef}>\n {isOpen && (\n <FloatingPortal>\n <FloatingFocusManager\n context={context}\n modal={false}\n initialFocus={-1}\n returnFocus={false}\n >\n <div\n ref={refs.setFloating}\n role=\"menu\"\n style={{ ...floatingStyles, zIndex: floatingZ }}\n className={MENU_POPOVER_CLASS}\n {...getFloatingProps()}\n aria-label={ariaLabel}\n {...(ariaLabel ? { \"aria-labelledby\": undefined } : {})}\n >\n {item.header != null && (\n <div className=\"border-b border-border px-3 py-1.5\">\n {item.header}\n </div>\n )}\n <MenuItemList items={item.children ?? []} />\n </div>\n </FloatingFocusManager>\n </FloatingPortal>\n )}\n </FloatingList>\n </MenuContext.Provider>\n </FloatingNode>\n );\n}\n\n/**\n * Renders one menu level: a leaf `menuitem` button, or a submenu trigger when\n * the item has `children`. A group header renders above the first item of each\n * contiguous group (headers are not focusable, so keyboard navigation stays\n * dense over the interactive items). Must be rendered inside a `FloatingList`\n * whose `elementsRef` backs the enclosing menu's list navigation.\n */\nexport function MenuItemList({ items }: { items: DropdownMenuItem[] }) {\n return (\n <>\n {items.map((item, index) => {\n const showHeader =\n item.group != null && item.group !== items[index - 1]?.group;\n const hasChildren = !!item.children && item.children.length > 0;\n return (\n <Fragment key={index}>\n {showHeader && (\n <div role=\"presentation\" className={MENU_HEADER_CLASS}>\n {item.group}\n </div>\n )}\n {hasChildren ? (\n <MenuSubmenu item={item} />\n ) : (\n <MenuLeaf item={item} />\n )}\n </Fragment>\n );\n })}\n </>\n );\n}\n"],"names":["Fragment"],"mappings":"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"}
|
package/dist/rpc/FilterForm.cjs
CHANGED
|
@@ -27,6 +27,7 @@ function FilterForm({
|
|
|
27
27
|
showSubmit = true,
|
|
28
28
|
excludedParameterNames = [],
|
|
29
29
|
presentation = "form",
|
|
30
|
+
onChange,
|
|
30
31
|
onSubmit
|
|
31
32
|
}) {
|
|
32
33
|
var _a;
|
|
@@ -48,6 +49,14 @@ function FilterForm({
|
|
|
48
49
|
const [error, setError] = react.useState("");
|
|
49
50
|
const debouncedValues = formMetadata.useDebouncedRecord(values, 250);
|
|
50
51
|
const lastAutoSubmitted = react.useRef(null);
|
|
52
|
+
const onChangeRef = react.useRef(onChange);
|
|
53
|
+
react.useEffect(() => {
|
|
54
|
+
onChangeRef.current = onChange;
|
|
55
|
+
});
|
|
56
|
+
react.useEffect(() => {
|
|
57
|
+
var _a2;
|
|
58
|
+
(_a2 = onChangeRef.current) == null ? void 0 : _a2.call(onChangeRef, values);
|
|
59
|
+
}, [values]);
|
|
51
60
|
const lookupParameters = react.useMemo(
|
|
52
61
|
() => formMetadata.packLookupParameterValues(debouncedValues, parameters),
|
|
53
62
|
[debouncedValues, parameters]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FilterForm.cjs","sources":["../../src/rpc/FilterForm.tsx"],"sourcesContent":["import { useEffect, useMemo, useRef, useState, type FormEvent } from \"react\";\nimport { keepPreviousData, useQuery } from \"@tanstack/react-query\";\nimport { Button } from \"../components/button\";\nimport { FilterBar } from \"../components/FilterBar\";\nimport {\n packLookupParameterValues,\n parametersToFormConfig,\n pruneParameterValues,\n buildInitialParameterValues,\n titleCase,\n useDebouncedRecord,\n type ParameterValues,\n} from \"./formMetadata\";\nimport type { OpenAPIParameter } from \"./types\";\nimport { useOpenAPI, type OperationsApiClient } from \"./useOperations\";\nimport { ParameterGrid } from \"./FilterFormFields\";\n\nexport type FilterFormProps = {\n client: OperationsApiClient;\n path: string;\n method: string;\n parameters?: OpenAPIParameter[];\n initialValues?: ParameterValues | undefined;\n lockedValues?: ParameterValues | undefined;\n hideLocked?: boolean | undefined;\n enableLookup?: boolean | undefined;\n autoSubmit?: boolean | undefined;\n submitLabel?: string | undefined;\n submittingLabel?: string | undefined;\n emptyMessage?: string | undefined;\n isSubmitting?: boolean | undefined;\n className?: string | undefined;\n formId?: string | undefined;\n showSubmit?: boolean | undefined;\n excludedParameterNames?: string[] | undefined;\n /** Renders operation controls as form rows or the shared table FilterBar. */\n presentation?: \"form\" | \"filter-bar\" | undefined;\n onSubmit: (values: ParameterValues) => void | Promise<void>;\n};\n\nexport function FilterForm({\n client,\n path,\n method,\n parameters = [],\n initialValues = {},\n lockedValues = {},\n hideLocked = false,\n enableLookup = method.toUpperCase() === \"GET\",\n autoSubmit = false,\n submitLabel = \"Execute request\",\n submittingLabel = \"Executing…\",\n emptyMessage = \"This operation does not require input.\",\n isSubmitting = false,\n className,\n formId,\n showSubmit = true,\n excludedParameterNames = [],\n presentation = \"form\",\n onSubmit,\n}: FilterFormProps) {\n const resetKey = useMemo(\n () =>\n `${method}:${path}:${JSON.stringify(initialValues)}:${JSON.stringify(\n lockedValues\n )}`,\n [initialValues, lockedValues, method, path]\n );\n const visibleParameters = useMemo(\n () =>\n parameters.filter(\n (parameter) => !excludedParameterNames.includes(parameter.name)\n ),\n [excludedParameterNames, parameters]\n );\n const [values, setValues] = useState<ParameterValues>(() =>\n buildInitialParameterValues(parameters, method, lockedValues, initialValues)\n );\n const [error, setError] = useState(\"\");\n const debouncedValues = useDebouncedRecord(values, 250);\n const lastAutoSubmitted = useRef<string | null>(null);\n const lookupParameters = useMemo(\n () => packLookupParameterValues(debouncedValues, parameters),\n [debouncedValues, parameters]\n );\n\n const lookupQuery = useQuery({\n queryKey: [\"filter-form-lookup\", method, path, lookupParameters],\n queryFn: async () =>\n (await client.lookupFilters?.(path, method, lookupParameters, {\n Accept: \"application/json+clicky\",\n })) ?? { filters: {} },\n enabled:\n enableLookup &&\n !!client.lookupFilters &&\n parameters.some((param) => param.in === \"query\"),\n placeholderData: keepPreviousData,\n staleTime: 30_000,\n retry: 0,\n });\n\n // Shapes come from the spec so a control keeps its identity while the lookup\n // that fills it is in flight; see parametersToFormConfig.\n const { data: spec } = useOpenAPI(client);\n const filterShapes = spec?.components?.[\"x-clicky-filters\"];\n\n const formConfig = useMemo(\n () =>\n parametersToFormConfig(visibleParameters, values, setValues, {\n lookup: lookupQuery.data,\n components: filterShapes,\n lockedValues,\n hideLocked,\n }),\n [\n filterShapes,\n hideLocked,\n lockedValues,\n lookupQuery.data,\n visibleParameters,\n values,\n ]\n );\n\n const hasFields =\n formConfig.filters.length > 0 ||\n formConfig.search != null ||\n formConfig.timeRange != null;\n\n async function handleSubmit(event?: FormEvent) {\n event?.preventDefault();\n\n const missingRequired = parameters.filter((param) => {\n if (!param.required) return false;\n const value = lockedValues[param.name] ?? values[param.name] ?? \"\";\n return value.trim() === \"\";\n });\n\n if (missingRequired.length > 0) {\n setError(\n `Missing required fields: ${missingRequired\n .map((param) => titleCase(param.name))\n .join(\", \")}`\n );\n return;\n }\n\n setError(\"\");\n await onSubmit(pruneParameterValues(values));\n }\n\n useEffect(() => {\n setValues(\n buildInitialParameterValues(\n parameters,\n method,\n lockedValues,\n initialValues\n )\n );\n setError(\"\");\n lastAutoSubmitted.current = null;\n }, [resetKey]);\n\n useEffect(() => {\n if (!autoSubmit) {\n return;\n }\n\n const missingRequired = parameters.filter((param) => {\n if (!param.required) return false;\n const value =\n lockedValues[param.name] ?? debouncedValues[param.name] ?? \"\";\n return value.trim() === \"\";\n });\n if (missingRequired.length > 0) {\n return;\n }\n\n const submittedValues = pruneParameterValues(debouncedValues);\n const signature = JSON.stringify(submittedValues);\n if (lastAutoSubmitted.current === signature) {\n return;\n }\n\n lastAutoSubmitted.current = signature;\n setError(\"\");\n void onSubmit(submittedValues);\n }, [autoSubmit, debouncedValues, lockedValues, onSubmit, parameters]);\n\n return (\n <form id={formId} className=\"space-y-3\" onSubmit={handleSubmit}>\n {hasFields ? (\n presentation === \"filter-bar\" ? (\n <FilterBar\n autoSubmit={autoSubmit}\n filters={formConfig.filters}\n overflowMode=\"wrap\"\n {...(formConfig.search ? { search: formConfig.search } : {})}\n {...(formConfig.timeRange\n ? { timeRange: formConfig.timeRange }\n : {})}\n {...(!autoSubmit\n ? {\n onApply: () => void handleSubmit(),\n applyLabel: submitLabel,\n isPending: isSubmitting,\n }\n : {})}\n {...(className ? { className } : {})}\n />\n ) : (\n <ParameterGrid\n autoSubmit={autoSubmit}\n filters={formConfig.filters}\n isSubmitting={isSubmitting}\n submitLabel={submitLabel}\n submittingLabel={submittingLabel}\n showSubmit={showSubmit}\n {...(formConfig.timeRange\n ? { timeRange: formConfig.timeRange }\n : {})}\n {...(className ? { className } : {})}\n />\n )\n ) : (\n <div className=\"flex items-center justify-between gap-4\">\n <p className=\"text-sm text-muted-foreground\">{emptyMessage}</p>\n {showSubmit ? (\n <Button\n type=\"button\"\n onClick={handleSubmit}\n disabled={isSubmitting}\n >\n {isSubmitting ? submittingLabel : submitLabel}\n </Button>\n ) : null}\n </div>\n )}\n\n {error && (\n <div className=\"rounded-md border border-destructive/40 bg-destructive/5 p-3 text-sm text-destructive\">\n {error}\n </div>\n )}\n </form>\n );\n}\n"],"names":["useMemo","useState","buildInitialParameterValues","useDebouncedRecord","useRef","packLookupParameterValues","useQuery","_a","keepPreviousData","useOpenAPI","parametersToFormConfig","titleCase","pruneParameterValues","useEffect","jsx","FilterBar","ParameterGrid","jsxs","Button"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"FilterForm.cjs","sources":["../../src/rpc/FilterForm.tsx"],"sourcesContent":["import { useEffect, useMemo, useRef, useState, type FormEvent } from \"react\";\nimport { keepPreviousData, useQuery } from \"@tanstack/react-query\";\nimport { Button } from \"../components/button\";\nimport { FilterBar } from \"../components/FilterBar\";\nimport {\n packLookupParameterValues,\n parametersToFormConfig,\n pruneParameterValues,\n buildInitialParameterValues,\n titleCase,\n useDebouncedRecord,\n type ParameterValues,\n} from \"./formMetadata\";\nimport type { OpenAPIParameter } from \"./types\";\nimport { useOpenAPI, type OperationsApiClient } from \"./useOperations\";\nimport { ParameterGrid } from \"./FilterFormFields\";\n\nexport type FilterFormProps = {\n client: OperationsApiClient;\n path: string;\n method: string;\n parameters?: OpenAPIParameter[];\n initialValues?: ParameterValues | undefined;\n lockedValues?: ParameterValues | undefined;\n hideLocked?: boolean | undefined;\n enableLookup?: boolean | undefined;\n autoSubmit?: boolean | undefined;\n submitLabel?: string | undefined;\n submittingLabel?: string | undefined;\n emptyMessage?: string | undefined;\n isSubmitting?: boolean | undefined;\n className?: string | undefined;\n formId?: string | undefined;\n showSubmit?: boolean | undefined;\n excludedParameterNames?: string[] | undefined;\n /** Renders operation controls as form rows or the shared table FilterBar. */\n presentation?: \"form\" | \"filter-bar\" | undefined;\n /** Called with the current values whenever they change, starting with the\n * initial values, so the form can act as a controlled field set inside a\n * host form (pair with showSubmit={false}). */\n onChange?: ((values: ParameterValues) => void) | undefined;\n onSubmit: (values: ParameterValues) => void | Promise<void>;\n};\n\nexport function FilterForm({\n client,\n path,\n method,\n parameters = [],\n initialValues = {},\n lockedValues = {},\n hideLocked = false,\n enableLookup = method.toUpperCase() === \"GET\",\n autoSubmit = false,\n submitLabel = \"Execute request\",\n submittingLabel = \"Executing…\",\n emptyMessage = \"This operation does not require input.\",\n isSubmitting = false,\n className,\n formId,\n showSubmit = true,\n excludedParameterNames = [],\n presentation = \"form\",\n onChange,\n onSubmit,\n}: FilterFormProps) {\n const resetKey = useMemo(\n () =>\n `${method}:${path}:${JSON.stringify(initialValues)}:${JSON.stringify(\n lockedValues\n )}`,\n [initialValues, lockedValues, method, path]\n );\n const visibleParameters = useMemo(\n () =>\n parameters.filter(\n (parameter) => !excludedParameterNames.includes(parameter.name)\n ),\n [excludedParameterNames, parameters]\n );\n const [values, setValues] = useState<ParameterValues>(() =>\n buildInitialParameterValues(parameters, method, lockedValues, initialValues)\n );\n const [error, setError] = useState(\"\");\n const debouncedValues = useDebouncedRecord(values, 250);\n const lastAutoSubmitted = useRef<string | null>(null);\n // The latest callback is read from a ref so a host passing an inline\n // function is notified per value change, not per render.\n const onChangeRef = useRef(onChange);\n useEffect(() => {\n onChangeRef.current = onChange;\n });\n useEffect(() => {\n onChangeRef.current?.(values);\n }, [values]);\n const lookupParameters = useMemo(\n () => packLookupParameterValues(debouncedValues, parameters),\n [debouncedValues, parameters]\n );\n\n const lookupQuery = useQuery({\n queryKey: [\"filter-form-lookup\", method, path, lookupParameters],\n queryFn: async () =>\n (await client.lookupFilters?.(path, method, lookupParameters, {\n Accept: \"application/json+clicky\",\n })) ?? { filters: {} },\n enabled:\n enableLookup &&\n !!client.lookupFilters &&\n parameters.some((param) => param.in === \"query\"),\n placeholderData: keepPreviousData,\n staleTime: 30_000,\n retry: 0,\n });\n\n // Shapes come from the spec so a control keeps its identity while the lookup\n // that fills it is in flight; see parametersToFormConfig.\n const { data: spec } = useOpenAPI(client);\n const filterShapes = spec?.components?.[\"x-clicky-filters\"];\n\n const formConfig = useMemo(\n () =>\n parametersToFormConfig(visibleParameters, values, setValues, {\n lookup: lookupQuery.data,\n components: filterShapes,\n lockedValues,\n hideLocked,\n }),\n [\n filterShapes,\n hideLocked,\n lockedValues,\n lookupQuery.data,\n visibleParameters,\n values,\n ]\n );\n\n const hasFields =\n formConfig.filters.length > 0 ||\n formConfig.search != null ||\n formConfig.timeRange != null;\n\n async function handleSubmit(event?: FormEvent) {\n event?.preventDefault();\n\n const missingRequired = parameters.filter((param) => {\n if (!param.required) return false;\n const value = lockedValues[param.name] ?? values[param.name] ?? \"\";\n return value.trim() === \"\";\n });\n\n if (missingRequired.length > 0) {\n setError(\n `Missing required fields: ${missingRequired\n .map((param) => titleCase(param.name))\n .join(\", \")}`\n );\n return;\n }\n\n setError(\"\");\n await onSubmit(pruneParameterValues(values));\n }\n\n useEffect(() => {\n setValues(\n buildInitialParameterValues(\n parameters,\n method,\n lockedValues,\n initialValues\n )\n );\n setError(\"\");\n lastAutoSubmitted.current = null;\n }, [resetKey]);\n\n useEffect(() => {\n if (!autoSubmit) {\n return;\n }\n\n const missingRequired = parameters.filter((param) => {\n if (!param.required) return false;\n const value =\n lockedValues[param.name] ?? debouncedValues[param.name] ?? \"\";\n return value.trim() === \"\";\n });\n if (missingRequired.length > 0) {\n return;\n }\n\n const submittedValues = pruneParameterValues(debouncedValues);\n const signature = JSON.stringify(submittedValues);\n if (lastAutoSubmitted.current === signature) {\n return;\n }\n\n lastAutoSubmitted.current = signature;\n setError(\"\");\n void onSubmit(submittedValues);\n }, [autoSubmit, debouncedValues, lockedValues, onSubmit, parameters]);\n\n return (\n <form id={formId} className=\"space-y-3\" onSubmit={handleSubmit}>\n {hasFields ? (\n presentation === \"filter-bar\" ? (\n <FilterBar\n autoSubmit={autoSubmit}\n filters={formConfig.filters}\n overflowMode=\"wrap\"\n {...(formConfig.search ? { search: formConfig.search } : {})}\n {...(formConfig.timeRange\n ? { timeRange: formConfig.timeRange }\n : {})}\n {...(!autoSubmit\n ? {\n onApply: () => void handleSubmit(),\n applyLabel: submitLabel,\n isPending: isSubmitting,\n }\n : {})}\n {...(className ? { className } : {})}\n />\n ) : (\n <ParameterGrid\n autoSubmit={autoSubmit}\n filters={formConfig.filters}\n isSubmitting={isSubmitting}\n submitLabel={submitLabel}\n submittingLabel={submittingLabel}\n showSubmit={showSubmit}\n {...(formConfig.timeRange\n ? { timeRange: formConfig.timeRange }\n : {})}\n {...(className ? { className } : {})}\n />\n )\n ) : (\n <div className=\"flex items-center justify-between gap-4\">\n <p className=\"text-sm text-muted-foreground\">{emptyMessage}</p>\n {showSubmit ? (\n <Button\n type=\"button\"\n onClick={handleSubmit}\n disabled={isSubmitting}\n >\n {isSubmitting ? submittingLabel : submitLabel}\n </Button>\n ) : null}\n </div>\n )}\n\n {error && (\n <div className=\"rounded-md border border-destructive/40 bg-destructive/5 p-3 text-sm text-destructive\">\n {error}\n </div>\n )}\n </form>\n );\n}\n"],"names":["useMemo","useState","buildInitialParameterValues","useDebouncedRecord","useRef","useEffect","_a","packLookupParameterValues","useQuery","keepPreviousData","useOpenAPI","parametersToFormConfig","titleCase","pruneParameterValues","jsx","FilterBar","ParameterGrid","jsxs","Button"],"mappings":"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"}
|
package/dist/rpc/FilterForm.d.ts
CHANGED
|
@@ -21,7 +21,11 @@ export type FilterFormProps = {
|
|
|
21
21
|
excludedParameterNames?: string[] | undefined;
|
|
22
22
|
/** Renders operation controls as form rows or the shared table FilterBar. */
|
|
23
23
|
presentation?: "form" | "filter-bar" | undefined;
|
|
24
|
+
/** Called with the current values whenever they change, starting with the
|
|
25
|
+
* initial values, so the form can act as a controlled field set inside a
|
|
26
|
+
* host form (pair with showSubmit={false}). */
|
|
27
|
+
onChange?: ((values: ParameterValues) => void) | undefined;
|
|
24
28
|
onSubmit: (values: ParameterValues) => void | Promise<void>;
|
|
25
29
|
};
|
|
26
|
-
export declare function FilterForm({ client, path, method, parameters, initialValues, lockedValues, hideLocked, enableLookup, autoSubmit, submitLabel, submittingLabel, emptyMessage, isSubmitting, className, formId, showSubmit, excludedParameterNames, presentation, onSubmit, }: FilterFormProps): import("react").JSX.Element;
|
|
30
|
+
export declare function FilterForm({ client, path, method, parameters, initialValues, lockedValues, hideLocked, enableLookup, autoSubmit, submitLabel, submittingLabel, emptyMessage, isSubmitting, className, formId, showSubmit, excludedParameterNames, presentation, onChange, onSubmit, }: FilterFormProps): import("react").JSX.Element;
|
|
27
31
|
//# sourceMappingURL=FilterForm.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FilterForm.d.ts","sourceRoot":"","sources":["../../src/rpc/FilterForm.tsx"],"names":[],"mappings":"AAIA,OAAO,EAOL,KAAK,eAAe,EACrB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAc,KAAK,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAGvE,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,mBAAmB,CAAC;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAChC,aAAa,CAAC,EAAE,eAAe,GAAG,SAAS,CAAC;IAC5C,YAAY,CAAC,EAAE,eAAe,GAAG,SAAS,CAAC;IAC3C,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACjC,YAAY,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACnC,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,YAAY,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACnC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACjC,sBAAsB,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAC9C,6EAA6E;IAC7E,YAAY,CAAC,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAAC;IACjD,QAAQ,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7D,CAAC;AAEF,wBAAgB,UAAU,CAAC,EACzB,MAAM,EACN,IAAI,EACJ,MAAM,EACN,UAAe,EACf,aAAkB,EAClB,YAAiB,EACjB,UAAkB,EAClB,YAA6C,EAC7C,UAAkB,EAClB,WAA+B,EAC/B,eAA8B,EAC9B,YAAuD,EACvD,YAAoB,EACpB,SAAS,EACT,MAAM,EACN,UAAiB,EACjB,sBAA2B,EAC3B,YAAqB,EACrB,QAAQ,GACT,EAAE,eAAe,+
|
|
1
|
+
{"version":3,"file":"FilterForm.d.ts","sourceRoot":"","sources":["../../src/rpc/FilterForm.tsx"],"names":[],"mappings":"AAIA,OAAO,EAOL,KAAK,eAAe,EACrB,MAAM,gBAAgB,CAAC;AACxB,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAChD,OAAO,EAAc,KAAK,mBAAmB,EAAE,MAAM,iBAAiB,CAAC;AAGvE,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,mBAAmB,CAAC;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,gBAAgB,EAAE,CAAC;IAChC,aAAa,CAAC,EAAE,eAAe,GAAG,SAAS,CAAC;IAC5C,YAAY,CAAC,EAAE,eAAe,GAAG,SAAS,CAAC;IAC3C,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACjC,YAAY,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACnC,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACjC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACjC,eAAe,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACrC,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAClC,YAAY,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACnC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5B,UAAU,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IACjC,sBAAsB,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IAC9C,6EAA6E;IAC7E,YAAY,CAAC,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAAC;IACjD;;oDAEgD;IAChD,QAAQ,CAAC,EAAE,CAAC,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IAC3D,QAAQ,EAAE,CAAC,MAAM,EAAE,eAAe,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7D,CAAC;AAEF,wBAAgB,UAAU,CAAC,EACzB,MAAM,EACN,IAAI,EACJ,MAAM,EACN,UAAe,EACf,aAAkB,EAClB,YAAiB,EACjB,UAAkB,EAClB,YAA6C,EAC7C,UAAkB,EAClB,WAA+B,EAC/B,eAA8B,EAC9B,YAAuD,EACvD,YAAoB,EACpB,SAAS,EACT,MAAM,EACN,UAAiB,EACjB,sBAA2B,EAC3B,YAAqB,EACrB,QAAQ,EACR,QAAQ,GACT,EAAE,eAAe,+BAoMjB"}
|
package/dist/rpc/FilterForm.js
CHANGED
|
@@ -25,6 +25,7 @@ function FilterForm({
|
|
|
25
25
|
showSubmit = true,
|
|
26
26
|
excludedParameterNames = [],
|
|
27
27
|
presentation = "form",
|
|
28
|
+
onChange,
|
|
28
29
|
onSubmit
|
|
29
30
|
}) {
|
|
30
31
|
var _a;
|
|
@@ -46,6 +47,14 @@ function FilterForm({
|
|
|
46
47
|
const [error, setError] = useState("");
|
|
47
48
|
const debouncedValues = useDebouncedRecord(values, 250);
|
|
48
49
|
const lastAutoSubmitted = useRef(null);
|
|
50
|
+
const onChangeRef = useRef(onChange);
|
|
51
|
+
useEffect(() => {
|
|
52
|
+
onChangeRef.current = onChange;
|
|
53
|
+
});
|
|
54
|
+
useEffect(() => {
|
|
55
|
+
var _a2;
|
|
56
|
+
(_a2 = onChangeRef.current) == null ? void 0 : _a2.call(onChangeRef, values);
|
|
57
|
+
}, [values]);
|
|
49
58
|
const lookupParameters = useMemo(
|
|
50
59
|
() => packLookupParameterValues(debouncedValues, parameters),
|
|
51
60
|
[debouncedValues, parameters]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FilterForm.js","sources":["../../src/rpc/FilterForm.tsx"],"sourcesContent":["import { useEffect, useMemo, useRef, useState, type FormEvent } from \"react\";\nimport { keepPreviousData, useQuery } from \"@tanstack/react-query\";\nimport { Button } from \"../components/button\";\nimport { FilterBar } from \"../components/FilterBar\";\nimport {\n packLookupParameterValues,\n parametersToFormConfig,\n pruneParameterValues,\n buildInitialParameterValues,\n titleCase,\n useDebouncedRecord,\n type ParameterValues,\n} from \"./formMetadata\";\nimport type { OpenAPIParameter } from \"./types\";\nimport { useOpenAPI, type OperationsApiClient } from \"./useOperations\";\nimport { ParameterGrid } from \"./FilterFormFields\";\n\nexport type FilterFormProps = {\n client: OperationsApiClient;\n path: string;\n method: string;\n parameters?: OpenAPIParameter[];\n initialValues?: ParameterValues | undefined;\n lockedValues?: ParameterValues | undefined;\n hideLocked?: boolean | undefined;\n enableLookup?: boolean | undefined;\n autoSubmit?: boolean | undefined;\n submitLabel?: string | undefined;\n submittingLabel?: string | undefined;\n emptyMessage?: string | undefined;\n isSubmitting?: boolean | undefined;\n className?: string | undefined;\n formId?: string | undefined;\n showSubmit?: boolean | undefined;\n excludedParameterNames?: string[] | undefined;\n /** Renders operation controls as form rows or the shared table FilterBar. */\n presentation?: \"form\" | \"filter-bar\" | undefined;\n onSubmit: (values: ParameterValues) => void | Promise<void>;\n};\n\nexport function FilterForm({\n client,\n path,\n method,\n parameters = [],\n initialValues = {},\n lockedValues = {},\n hideLocked = false,\n enableLookup = method.toUpperCase() === \"GET\",\n autoSubmit = false,\n submitLabel = \"Execute request\",\n submittingLabel = \"Executing…\",\n emptyMessage = \"This operation does not require input.\",\n isSubmitting = false,\n className,\n formId,\n showSubmit = true,\n excludedParameterNames = [],\n presentation = \"form\",\n onSubmit,\n}: FilterFormProps) {\n const resetKey = useMemo(\n () =>\n `${method}:${path}:${JSON.stringify(initialValues)}:${JSON.stringify(\n lockedValues\n )}`,\n [initialValues, lockedValues, method, path]\n );\n const visibleParameters = useMemo(\n () =>\n parameters.filter(\n (parameter) => !excludedParameterNames.includes(parameter.name)\n ),\n [excludedParameterNames, parameters]\n );\n const [values, setValues] = useState<ParameterValues>(() =>\n buildInitialParameterValues(parameters, method, lockedValues, initialValues)\n );\n const [error, setError] = useState(\"\");\n const debouncedValues = useDebouncedRecord(values, 250);\n const lastAutoSubmitted = useRef<string | null>(null);\n const lookupParameters = useMemo(\n () => packLookupParameterValues(debouncedValues, parameters),\n [debouncedValues, parameters]\n );\n\n const lookupQuery = useQuery({\n queryKey: [\"filter-form-lookup\", method, path, lookupParameters],\n queryFn: async () =>\n (await client.lookupFilters?.(path, method, lookupParameters, {\n Accept: \"application/json+clicky\",\n })) ?? { filters: {} },\n enabled:\n enableLookup &&\n !!client.lookupFilters &&\n parameters.some((param) => param.in === \"query\"),\n placeholderData: keepPreviousData,\n staleTime: 30_000,\n retry: 0,\n });\n\n // Shapes come from the spec so a control keeps its identity while the lookup\n // that fills it is in flight; see parametersToFormConfig.\n const { data: spec } = useOpenAPI(client);\n const filterShapes = spec?.components?.[\"x-clicky-filters\"];\n\n const formConfig = useMemo(\n () =>\n parametersToFormConfig(visibleParameters, values, setValues, {\n lookup: lookupQuery.data,\n components: filterShapes,\n lockedValues,\n hideLocked,\n }),\n [\n filterShapes,\n hideLocked,\n lockedValues,\n lookupQuery.data,\n visibleParameters,\n values,\n ]\n );\n\n const hasFields =\n formConfig.filters.length > 0 ||\n formConfig.search != null ||\n formConfig.timeRange != null;\n\n async function handleSubmit(event?: FormEvent) {\n event?.preventDefault();\n\n const missingRequired = parameters.filter((param) => {\n if (!param.required) return false;\n const value = lockedValues[param.name] ?? values[param.name] ?? \"\";\n return value.trim() === \"\";\n });\n\n if (missingRequired.length > 0) {\n setError(\n `Missing required fields: ${missingRequired\n .map((param) => titleCase(param.name))\n .join(\", \")}`\n );\n return;\n }\n\n setError(\"\");\n await onSubmit(pruneParameterValues(values));\n }\n\n useEffect(() => {\n setValues(\n buildInitialParameterValues(\n parameters,\n method,\n lockedValues,\n initialValues\n )\n );\n setError(\"\");\n lastAutoSubmitted.current = null;\n }, [resetKey]);\n\n useEffect(() => {\n if (!autoSubmit) {\n return;\n }\n\n const missingRequired = parameters.filter((param) => {\n if (!param.required) return false;\n const value =\n lockedValues[param.name] ?? debouncedValues[param.name] ?? \"\";\n return value.trim() === \"\";\n });\n if (missingRequired.length > 0) {\n return;\n }\n\n const submittedValues = pruneParameterValues(debouncedValues);\n const signature = JSON.stringify(submittedValues);\n if (lastAutoSubmitted.current === signature) {\n return;\n }\n\n lastAutoSubmitted.current = signature;\n setError(\"\");\n void onSubmit(submittedValues);\n }, [autoSubmit, debouncedValues, lockedValues, onSubmit, parameters]);\n\n return (\n <form id={formId} className=\"space-y-3\" onSubmit={handleSubmit}>\n {hasFields ? (\n presentation === \"filter-bar\" ? (\n <FilterBar\n autoSubmit={autoSubmit}\n filters={formConfig.filters}\n overflowMode=\"wrap\"\n {...(formConfig.search ? { search: formConfig.search } : {})}\n {...(formConfig.timeRange\n ? { timeRange: formConfig.timeRange }\n : {})}\n {...(!autoSubmit\n ? {\n onApply: () => void handleSubmit(),\n applyLabel: submitLabel,\n isPending: isSubmitting,\n }\n : {})}\n {...(className ? { className } : {})}\n />\n ) : (\n <ParameterGrid\n autoSubmit={autoSubmit}\n filters={formConfig.filters}\n isSubmitting={isSubmitting}\n submitLabel={submitLabel}\n submittingLabel={submittingLabel}\n showSubmit={showSubmit}\n {...(formConfig.timeRange\n ? { timeRange: formConfig.timeRange }\n : {})}\n {...(className ? { className } : {})}\n />\n )\n ) : (\n <div className=\"flex items-center justify-between gap-4\">\n <p className=\"text-sm text-muted-foreground\">{emptyMessage}</p>\n {showSubmit ? (\n <Button\n type=\"button\"\n onClick={handleSubmit}\n disabled={isSubmitting}\n >\n {isSubmitting ? submittingLabel : submitLabel}\n </Button>\n ) : null}\n </div>\n )}\n\n {error && (\n <div className=\"rounded-md border border-destructive/40 bg-destructive/5 p-3 text-sm text-destructive\">\n {error}\n </div>\n )}\n </form>\n );\n}\n"],"names":["_a"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"FilterForm.js","sources":["../../src/rpc/FilterForm.tsx"],"sourcesContent":["import { useEffect, useMemo, useRef, useState, type FormEvent } from \"react\";\nimport { keepPreviousData, useQuery } from \"@tanstack/react-query\";\nimport { Button } from \"../components/button\";\nimport { FilterBar } from \"../components/FilterBar\";\nimport {\n packLookupParameterValues,\n parametersToFormConfig,\n pruneParameterValues,\n buildInitialParameterValues,\n titleCase,\n useDebouncedRecord,\n type ParameterValues,\n} from \"./formMetadata\";\nimport type { OpenAPIParameter } from \"./types\";\nimport { useOpenAPI, type OperationsApiClient } from \"./useOperations\";\nimport { ParameterGrid } from \"./FilterFormFields\";\n\nexport type FilterFormProps = {\n client: OperationsApiClient;\n path: string;\n method: string;\n parameters?: OpenAPIParameter[];\n initialValues?: ParameterValues | undefined;\n lockedValues?: ParameterValues | undefined;\n hideLocked?: boolean | undefined;\n enableLookup?: boolean | undefined;\n autoSubmit?: boolean | undefined;\n submitLabel?: string | undefined;\n submittingLabel?: string | undefined;\n emptyMessage?: string | undefined;\n isSubmitting?: boolean | undefined;\n className?: string | undefined;\n formId?: string | undefined;\n showSubmit?: boolean | undefined;\n excludedParameterNames?: string[] | undefined;\n /** Renders operation controls as form rows or the shared table FilterBar. */\n presentation?: \"form\" | \"filter-bar\" | undefined;\n /** Called with the current values whenever they change, starting with the\n * initial values, so the form can act as a controlled field set inside a\n * host form (pair with showSubmit={false}). */\n onChange?: ((values: ParameterValues) => void) | undefined;\n onSubmit: (values: ParameterValues) => void | Promise<void>;\n};\n\nexport function FilterForm({\n client,\n path,\n method,\n parameters = [],\n initialValues = {},\n lockedValues = {},\n hideLocked = false,\n enableLookup = method.toUpperCase() === \"GET\",\n autoSubmit = false,\n submitLabel = \"Execute request\",\n submittingLabel = \"Executing…\",\n emptyMessage = \"This operation does not require input.\",\n isSubmitting = false,\n className,\n formId,\n showSubmit = true,\n excludedParameterNames = [],\n presentation = \"form\",\n onChange,\n onSubmit,\n}: FilterFormProps) {\n const resetKey = useMemo(\n () =>\n `${method}:${path}:${JSON.stringify(initialValues)}:${JSON.stringify(\n lockedValues\n )}`,\n [initialValues, lockedValues, method, path]\n );\n const visibleParameters = useMemo(\n () =>\n parameters.filter(\n (parameter) => !excludedParameterNames.includes(parameter.name)\n ),\n [excludedParameterNames, parameters]\n );\n const [values, setValues] = useState<ParameterValues>(() =>\n buildInitialParameterValues(parameters, method, lockedValues, initialValues)\n );\n const [error, setError] = useState(\"\");\n const debouncedValues = useDebouncedRecord(values, 250);\n const lastAutoSubmitted = useRef<string | null>(null);\n // The latest callback is read from a ref so a host passing an inline\n // function is notified per value change, not per render.\n const onChangeRef = useRef(onChange);\n useEffect(() => {\n onChangeRef.current = onChange;\n });\n useEffect(() => {\n onChangeRef.current?.(values);\n }, [values]);\n const lookupParameters = useMemo(\n () => packLookupParameterValues(debouncedValues, parameters),\n [debouncedValues, parameters]\n );\n\n const lookupQuery = useQuery({\n queryKey: [\"filter-form-lookup\", method, path, lookupParameters],\n queryFn: async () =>\n (await client.lookupFilters?.(path, method, lookupParameters, {\n Accept: \"application/json+clicky\",\n })) ?? { filters: {} },\n enabled:\n enableLookup &&\n !!client.lookupFilters &&\n parameters.some((param) => param.in === \"query\"),\n placeholderData: keepPreviousData,\n staleTime: 30_000,\n retry: 0,\n });\n\n // Shapes come from the spec so a control keeps its identity while the lookup\n // that fills it is in flight; see parametersToFormConfig.\n const { data: spec } = useOpenAPI(client);\n const filterShapes = spec?.components?.[\"x-clicky-filters\"];\n\n const formConfig = useMemo(\n () =>\n parametersToFormConfig(visibleParameters, values, setValues, {\n lookup: lookupQuery.data,\n components: filterShapes,\n lockedValues,\n hideLocked,\n }),\n [\n filterShapes,\n hideLocked,\n lockedValues,\n lookupQuery.data,\n visibleParameters,\n values,\n ]\n );\n\n const hasFields =\n formConfig.filters.length > 0 ||\n formConfig.search != null ||\n formConfig.timeRange != null;\n\n async function handleSubmit(event?: FormEvent) {\n event?.preventDefault();\n\n const missingRequired = parameters.filter((param) => {\n if (!param.required) return false;\n const value = lockedValues[param.name] ?? values[param.name] ?? \"\";\n return value.trim() === \"\";\n });\n\n if (missingRequired.length > 0) {\n setError(\n `Missing required fields: ${missingRequired\n .map((param) => titleCase(param.name))\n .join(\", \")}`\n );\n return;\n }\n\n setError(\"\");\n await onSubmit(pruneParameterValues(values));\n }\n\n useEffect(() => {\n setValues(\n buildInitialParameterValues(\n parameters,\n method,\n lockedValues,\n initialValues\n )\n );\n setError(\"\");\n lastAutoSubmitted.current = null;\n }, [resetKey]);\n\n useEffect(() => {\n if (!autoSubmit) {\n return;\n }\n\n const missingRequired = parameters.filter((param) => {\n if (!param.required) return false;\n const value =\n lockedValues[param.name] ?? debouncedValues[param.name] ?? \"\";\n return value.trim() === \"\";\n });\n if (missingRequired.length > 0) {\n return;\n }\n\n const submittedValues = pruneParameterValues(debouncedValues);\n const signature = JSON.stringify(submittedValues);\n if (lastAutoSubmitted.current === signature) {\n return;\n }\n\n lastAutoSubmitted.current = signature;\n setError(\"\");\n void onSubmit(submittedValues);\n }, [autoSubmit, debouncedValues, lockedValues, onSubmit, parameters]);\n\n return (\n <form id={formId} className=\"space-y-3\" onSubmit={handleSubmit}>\n {hasFields ? (\n presentation === \"filter-bar\" ? (\n <FilterBar\n autoSubmit={autoSubmit}\n filters={formConfig.filters}\n overflowMode=\"wrap\"\n {...(formConfig.search ? { search: formConfig.search } : {})}\n {...(formConfig.timeRange\n ? { timeRange: formConfig.timeRange }\n : {})}\n {...(!autoSubmit\n ? {\n onApply: () => void handleSubmit(),\n applyLabel: submitLabel,\n isPending: isSubmitting,\n }\n : {})}\n {...(className ? { className } : {})}\n />\n ) : (\n <ParameterGrid\n autoSubmit={autoSubmit}\n filters={formConfig.filters}\n isSubmitting={isSubmitting}\n submitLabel={submitLabel}\n submittingLabel={submittingLabel}\n showSubmit={showSubmit}\n {...(formConfig.timeRange\n ? { timeRange: formConfig.timeRange }\n : {})}\n {...(className ? { className } : {})}\n />\n )\n ) : (\n <div className=\"flex items-center justify-between gap-4\">\n <p className=\"text-sm text-muted-foreground\">{emptyMessage}</p>\n {showSubmit ? (\n <Button\n type=\"button\"\n onClick={handleSubmit}\n disabled={isSubmitting}\n >\n {isSubmitting ? submittingLabel : submitLabel}\n </Button>\n ) : null}\n </div>\n )}\n\n {error && (\n <div className=\"rounded-md border border-destructive/40 bg-destructive/5 p-3 text-sm text-destructive\">\n {error}\n </div>\n )}\n </form>\n );\n}\n"],"names":["_a"],"mappings":"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"}
|
package/dist/rpc/InlineError.cjs
CHANGED
|
@@ -2,19 +2,18 @@
|
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const jsxRuntime = require("react/jsx-runtime");
|
|
4
4
|
const button = require("../components/button.cjs");
|
|
5
|
+
const ErrorDetails = require("../data/diagnostics/ErrorDetails.cjs");
|
|
5
6
|
const Icon = require("../data/Icon.cjs");
|
|
6
|
-
const
|
|
7
|
+
const operationErrorDiagnostics = require("./operationErrorDiagnostics.cjs");
|
|
7
8
|
const UiPlay = require("../icons/components/UiPlay.cjs");
|
|
8
|
-
const UiChevronRight = require("../icons/components/UiChevronRight.cjs");
|
|
9
9
|
function InlineError({ title, error, className, runNow }) {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
runNow && /* @__PURE__ */ jsxRuntime.jsx("div", { className: "mt-3 flex justify-center", children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
10
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
11
|
+
ErrorDetails.ErrorDetails,
|
|
12
|
+
{
|
|
13
|
+
title,
|
|
14
|
+
diagnostics: operationErrorDiagnostics.operationErrorDiagnostics(error),
|
|
15
|
+
...className ? { className } : {},
|
|
16
|
+
actions: runNow && /* @__PURE__ */ jsxRuntime.jsxs(
|
|
18
17
|
button.Button,
|
|
19
18
|
{
|
|
20
19
|
type: "button",
|
|
@@ -28,39 +27,9 @@ function InlineError({ title, error, className, runNow }) {
|
|
|
28
27
|
"Run now"
|
|
29
28
|
]
|
|
30
29
|
}
|
|
31
|
-
)
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
/* @__PURE__ */ jsxRuntime.jsxs("summary", { className: "flex cursor-pointer items-center justify-center gap-1 text-xs text-muted-foreground hover:text-foreground", children: [
|
|
35
|
-
/* @__PURE__ */ jsxRuntime.jsx(Icon.Icon, { icon: UiChevronRight.UiChevronRight, className: "transition-transform group-open:rotate-90" }),
|
|
36
|
-
"More details"
|
|
37
|
-
] }),
|
|
38
|
-
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-2 space-y-2 text-left font-mono text-xs", children: [
|
|
39
|
-
(details.method || details.url || details.status) && /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "text-muted-foreground", children: [
|
|
40
|
-
details.method && /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
|
|
41
|
-
details.method,
|
|
42
|
-
" "
|
|
43
|
-
] }),
|
|
44
|
-
details.url,
|
|
45
|
-
details.status != null && /* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
|
|
46
|
-
" - ",
|
|
47
|
-
details.status
|
|
48
|
-
] })
|
|
49
|
-
] }),
|
|
50
|
-
details.responseBody && /* @__PURE__ */ jsxRuntime.jsx("pre", { className: "max-h-64 overflow-auto rounded-md bg-muted p-2 text-xs", children: details.responseBody })
|
|
51
|
-
] })
|
|
52
|
-
] })
|
|
53
|
-
] });
|
|
54
|
-
}
|
|
55
|
-
function getErrorDetails(error) {
|
|
56
|
-
if (error == null || typeof error !== "object") return {};
|
|
57
|
-
const record = error;
|
|
58
|
-
const details = {};
|
|
59
|
-
if (typeof record.method === "string") details.method = record.method;
|
|
60
|
-
if (typeof record.url === "string") details.url = record.url;
|
|
61
|
-
if (typeof record.status === "number") details.status = record.status;
|
|
62
|
-
if (typeof record.responseBody === "string") details.responseBody = record.responseBody;
|
|
63
|
-
return details;
|
|
30
|
+
)
|
|
31
|
+
}
|
|
32
|
+
);
|
|
64
33
|
}
|
|
65
34
|
exports.InlineError = InlineError;
|
|
66
35
|
//# sourceMappingURL=InlineError.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InlineError.cjs","sources":["../../src/rpc/InlineError.tsx"],"sourcesContent":["import { Button } from \"../components/button\";\nimport { Icon } from \"../data/Icon\";\nimport {
|
|
1
|
+
{"version":3,"file":"InlineError.cjs","sources":["../../src/rpc/InlineError.tsx"],"sourcesContent":["import { Button } from \"../components/button\";\nimport { ErrorDetails } from \"../data/diagnostics/ErrorDetails\";\nimport { Icon } from \"../data/Icon\";\nimport { UiPlay } from \"../icons\";\nimport { operationErrorDiagnostics } from \"./operationErrorDiagnostics\";\n\nexport type InlineErrorProps = {\n title: string;\n error: unknown;\n className?: string;\n runNow?: {\n onClick: () => void;\n loading?: boolean;\n };\n};\n\nexport function InlineError({ title, error, className, runNow }: InlineErrorProps) {\n return (\n <ErrorDetails\n title={title}\n diagnostics={operationErrorDiagnostics(error)}\n {...(className ? { className } : {})}\n actions={\n runNow && (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={runNow.onClick}\n loading={runNow.loading ?? false}\n loadingLabel={runNow.loading ? \"Running…\" : undefined}\n >\n <Icon icon={UiPlay} />\n Run now\n </Button>\n )\n }\n />\n );\n}\n"],"names":["jsx","ErrorDetails","operationErrorDiagnostics","jsxs","Button","Icon","UiPlay"],"mappings":";;;;;;;;AAgBO,SAAS,YAAY,EAAE,OAAO,OAAO,WAAW,UAA4B;AACjF,SACEA,2BAAAA;AAAAA,IAACC,aAAAA;AAAAA,IAAA;AAAA,MACC;AAAA,MACA,aAAaC,0BAAAA,0BAA0B,KAAK;AAAA,MAC3C,GAAI,YAAY,EAAE,UAAA,IAAc,CAAA;AAAA,MACjC,SACE,UACEC,2BAAAA;AAAAA,QAACC,OAAAA;AAAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAQ;AAAA,UACR,MAAK;AAAA,UACL,SAAS,OAAO;AAAA,UAChB,SAAS,OAAO,WAAW;AAAA,UAC3B,cAAc,OAAO,UAAU,aAAa;AAAA,UAE5C,UAAA;AAAA,YAAAJ,2BAAAA,IAACK,KAAAA,MAAA,EAAK,MAAMC,OAAAA,OAAA,CAAQ;AAAA,YAAE;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IAExB;AAAA,EAAA;AAKV;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InlineError.d.ts","sourceRoot":"","sources":["../../src/rpc/InlineError.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"InlineError.d.ts","sourceRoot":"","sources":["../../src/rpc/InlineError.tsx"],"names":[],"mappings":"AAMA,MAAM,MAAM,gBAAgB,GAAG;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE;QACP,OAAO,EAAE,MAAM,IAAI,CAAC;QACpB,OAAO,CAAC,EAAE,OAAO,CAAC;KACnB,CAAC;CACH,CAAC;AAEF,wBAAgB,WAAW,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,gBAAgB,+BAuBhF"}
|
package/dist/rpc/InlineError.js
CHANGED
|
@@ -1,18 +1,17 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { Button } from "../components/button.js";
|
|
3
|
+
import { ErrorDetails } from "../data/diagnostics/ErrorDetails.js";
|
|
3
4
|
import { Icon } from "../data/Icon.js";
|
|
4
|
-
import {
|
|
5
|
+
import { operationErrorDiagnostics } from "./operationErrorDiagnostics.js";
|
|
5
6
|
import { UiPlay } from "../icons/components/UiPlay.js";
|
|
6
|
-
import { UiChevronRight } from "../icons/components/UiChevronRight.js";
|
|
7
7
|
function InlineError({ title, error, className, runNow }) {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
runNow && /* @__PURE__ */ jsx("div", { className: "mt-3 flex justify-center", children: /* @__PURE__ */ jsxs(
|
|
8
|
+
return /* @__PURE__ */ jsx(
|
|
9
|
+
ErrorDetails,
|
|
10
|
+
{
|
|
11
|
+
title,
|
|
12
|
+
diagnostics: operationErrorDiagnostics(error),
|
|
13
|
+
...className ? { className } : {},
|
|
14
|
+
actions: runNow && /* @__PURE__ */ jsxs(
|
|
16
15
|
Button,
|
|
17
16
|
{
|
|
18
17
|
type: "button",
|
|
@@ -26,39 +25,9 @@ function InlineError({ title, error, className, runNow }) {
|
|
|
26
25
|
"Run now"
|
|
27
26
|
]
|
|
28
27
|
}
|
|
29
|
-
)
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
/* @__PURE__ */ jsxs("summary", { className: "flex cursor-pointer items-center justify-center gap-1 text-xs text-muted-foreground hover:text-foreground", children: [
|
|
33
|
-
/* @__PURE__ */ jsx(Icon, { icon: UiChevronRight, className: "transition-transform group-open:rotate-90" }),
|
|
34
|
-
"More details"
|
|
35
|
-
] }),
|
|
36
|
-
/* @__PURE__ */ jsxs("div", { className: "mt-2 space-y-2 text-left font-mono text-xs", children: [
|
|
37
|
-
(details.method || details.url || details.status) && /* @__PURE__ */ jsxs("div", { className: "text-muted-foreground", children: [
|
|
38
|
-
details.method && /* @__PURE__ */ jsxs("span", { children: [
|
|
39
|
-
details.method,
|
|
40
|
-
" "
|
|
41
|
-
] }),
|
|
42
|
-
details.url,
|
|
43
|
-
details.status != null && /* @__PURE__ */ jsxs("span", { children: [
|
|
44
|
-
" - ",
|
|
45
|
-
details.status
|
|
46
|
-
] })
|
|
47
|
-
] }),
|
|
48
|
-
details.responseBody && /* @__PURE__ */ jsx("pre", { className: "max-h-64 overflow-auto rounded-md bg-muted p-2 text-xs", children: details.responseBody })
|
|
49
|
-
] })
|
|
50
|
-
] })
|
|
51
|
-
] });
|
|
52
|
-
}
|
|
53
|
-
function getErrorDetails(error) {
|
|
54
|
-
if (error == null || typeof error !== "object") return {};
|
|
55
|
-
const record = error;
|
|
56
|
-
const details = {};
|
|
57
|
-
if (typeof record.method === "string") details.method = record.method;
|
|
58
|
-
if (typeof record.url === "string") details.url = record.url;
|
|
59
|
-
if (typeof record.status === "number") details.status = record.status;
|
|
60
|
-
if (typeof record.responseBody === "string") details.responseBody = record.responseBody;
|
|
61
|
-
return details;
|
|
28
|
+
)
|
|
29
|
+
}
|
|
30
|
+
);
|
|
62
31
|
}
|
|
63
32
|
export {
|
|
64
33
|
InlineError
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InlineError.js","sources":["../../src/rpc/InlineError.tsx"],"sourcesContent":["import { Button } from \"../components/button\";\nimport { Icon } from \"../data/Icon\";\nimport {
|
|
1
|
+
{"version":3,"file":"InlineError.js","sources":["../../src/rpc/InlineError.tsx"],"sourcesContent":["import { Button } from \"../components/button\";\nimport { ErrorDetails } from \"../data/diagnostics/ErrorDetails\";\nimport { Icon } from \"../data/Icon\";\nimport { UiPlay } from \"../icons\";\nimport { operationErrorDiagnostics } from \"./operationErrorDiagnostics\";\n\nexport type InlineErrorProps = {\n title: string;\n error: unknown;\n className?: string;\n runNow?: {\n onClick: () => void;\n loading?: boolean;\n };\n};\n\nexport function InlineError({ title, error, className, runNow }: InlineErrorProps) {\n return (\n <ErrorDetails\n title={title}\n diagnostics={operationErrorDiagnostics(error)}\n {...(className ? { className } : {})}\n actions={\n runNow && (\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n onClick={runNow.onClick}\n loading={runNow.loading ?? false}\n loadingLabel={runNow.loading ? \"Running…\" : undefined}\n >\n <Icon icon={UiPlay} />\n Run now\n </Button>\n )\n }\n />\n );\n}\n"],"names":[],"mappings":";;;;;;AAgBO,SAAS,YAAY,EAAE,OAAO,OAAO,WAAW,UAA4B;AACjF,SACE;AAAA,IAAC;AAAA,IAAA;AAAA,MACC;AAAA,MACA,aAAa,0BAA0B,KAAK;AAAA,MAC3C,GAAI,YAAY,EAAE,UAAA,IAAc,CAAA;AAAA,MACjC,SACE,UACE;AAAA,QAAC;AAAA,QAAA;AAAA,UACC,MAAK;AAAA,UACL,SAAQ;AAAA,UACR,MAAK;AAAA,UACL,SAAS,OAAO;AAAA,UAChB,SAAS,OAAO,WAAW;AAAA,UAC3B,cAAc,OAAO,UAAU,aAAa;AAAA,UAE5C,UAAA;AAAA,YAAA,oBAAC,MAAA,EAAK,MAAM,OAAA,CAAQ;AAAA,YAAE;AAAA,UAAA;AAAA,QAAA;AAAA,MAAA;AAAA,IAExB;AAAA,EAAA;AAKV;"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
|
+
const jsxRuntime = require("react/jsx-runtime");
|
|
4
|
+
const react = require("react");
|
|
5
|
+
const FilterForm = require("./FilterForm.cjs");
|
|
6
|
+
const clickyMetadata = require("./clickyMetadata.cjs");
|
|
7
|
+
const formMetadata = require("./formMetadata.cjs");
|
|
8
|
+
const NO_PARAMETERS = [];
|
|
9
|
+
function OperationArgsForm({
|
|
10
|
+
client,
|
|
11
|
+
operation,
|
|
12
|
+
args,
|
|
13
|
+
onChange,
|
|
14
|
+
onValidityChange,
|
|
15
|
+
className
|
|
16
|
+
}) {
|
|
17
|
+
var _a;
|
|
18
|
+
const parameters = operation.operation.parameters ?? NO_PARAMETERS;
|
|
19
|
+
const [initial] = react.useState(
|
|
20
|
+
() => storedArgsToValues(args, parameters, operation.method)
|
|
21
|
+
);
|
|
22
|
+
const [values, setValues] = react.useState(initial.values);
|
|
23
|
+
const problems = react.useMemo(
|
|
24
|
+
() => parameterProblems(parameters, values),
|
|
25
|
+
[parameters, values]
|
|
26
|
+
);
|
|
27
|
+
const valid = problems.length === 0;
|
|
28
|
+
react.useEffect(() => {
|
|
29
|
+
onValidityChange == null ? void 0 : onValidityChange(valid);
|
|
30
|
+
}, [onValidityChange, valid]);
|
|
31
|
+
const handleChange = (next) => {
|
|
32
|
+
setValues(next);
|
|
33
|
+
onChange(
|
|
34
|
+
valuesToArgs({
|
|
35
|
+
parameters,
|
|
36
|
+
method: operation.method,
|
|
37
|
+
values: next,
|
|
38
|
+
stored: initial.names
|
|
39
|
+
})
|
|
40
|
+
);
|
|
41
|
+
};
|
|
42
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-2", children: [
|
|
43
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
44
|
+
FilterForm.FilterForm,
|
|
45
|
+
{
|
|
46
|
+
client,
|
|
47
|
+
path: operation.path,
|
|
48
|
+
method: operation.method,
|
|
49
|
+
parameters,
|
|
50
|
+
initialValues: initial.values,
|
|
51
|
+
enableLookup: Boolean((_a = clickyMetadata.getOperationClickyMeta(operation)) == null ? void 0 : _a.supportsLookup),
|
|
52
|
+
showSubmit: false,
|
|
53
|
+
onChange: handleChange,
|
|
54
|
+
onSubmit: () => void 0,
|
|
55
|
+
...className ? { className } : {}
|
|
56
|
+
}
|
|
57
|
+
),
|
|
58
|
+
initial.dropped.length > 0 ? /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-xs text-muted-foreground", children: [
|
|
59
|
+
"Dropped arguments this operation no longer accepts:",
|
|
60
|
+
" ",
|
|
61
|
+
initial.dropped.join(", ")
|
|
62
|
+
] }) : null,
|
|
63
|
+
problems.map((problem) => /* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-destructive", children: problem }, problem))
|
|
64
|
+
] });
|
|
65
|
+
}
|
|
66
|
+
function storedArgsToValues(args, parameters, method) {
|
|
67
|
+
const known = new Set(parameters.map((parameter) => parameter.name));
|
|
68
|
+
const stored = {};
|
|
69
|
+
const dropped = [];
|
|
70
|
+
for (const [name, value] of Object.entries(args)) {
|
|
71
|
+
if (!known.has(name)) {
|
|
72
|
+
dropped.push(name);
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
stored[name] = storedValueToString(name, value);
|
|
76
|
+
}
|
|
77
|
+
return {
|
|
78
|
+
values: formMetadata.buildInitialParameterValues(parameters, method, {}, stored),
|
|
79
|
+
names: new Set(Object.keys(stored)),
|
|
80
|
+
dropped
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
function storedValueToString(name, value) {
|
|
84
|
+
if (Array.isArray(value)) return value.map(String).join(",");
|
|
85
|
+
if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
|
|
86
|
+
return String(value);
|
|
87
|
+
}
|
|
88
|
+
throw new Error(
|
|
89
|
+
`Stored argument ${name} has an unsupported value: ${JSON.stringify(value)}`
|
|
90
|
+
);
|
|
91
|
+
}
|
|
92
|
+
function valuesToArgs({
|
|
93
|
+
parameters,
|
|
94
|
+
method,
|
|
95
|
+
values,
|
|
96
|
+
stored
|
|
97
|
+
}) {
|
|
98
|
+
const args = {};
|
|
99
|
+
for (const parameter of parameters) {
|
|
100
|
+
const raw = values[parameter.name] ?? "";
|
|
101
|
+
if (raw.trim() === "") continue;
|
|
102
|
+
const isDefault = raw === effectiveDefault(parameter, method);
|
|
103
|
+
if (isDefault && !parameter.required && !stored.has(parameter.name)) continue;
|
|
104
|
+
args[parameter.name] = typedValue(parameter, raw);
|
|
105
|
+
}
|
|
106
|
+
return args;
|
|
107
|
+
}
|
|
108
|
+
function effectiveDefault(parameter, method) {
|
|
109
|
+
var _a;
|
|
110
|
+
const value = formMetadata.defaultValueForParameter(parameter, method);
|
|
111
|
+
return ((_a = parameter.schema) == null ? void 0 : _a.type) === "boolean" && value === "" ? "false" : value;
|
|
112
|
+
}
|
|
113
|
+
function typedValue(parameter, raw) {
|
|
114
|
+
var _a;
|
|
115
|
+
switch ((_a = parameter.schema) == null ? void 0 : _a.type) {
|
|
116
|
+
case "boolean":
|
|
117
|
+
return raw === "true";
|
|
118
|
+
case "integer":
|
|
119
|
+
return isWholeNumber(raw) ? Number(raw) : raw;
|
|
120
|
+
case "number":
|
|
121
|
+
return isNumber(raw) ? Number(raw) : raw;
|
|
122
|
+
case "array":
|
|
123
|
+
return raw.split(",").map((item) => item.trim()).filter(Boolean);
|
|
124
|
+
default:
|
|
125
|
+
return raw;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
function parameterProblems(parameters, values) {
|
|
129
|
+
var _a, _b;
|
|
130
|
+
const missing = parameters.filter(
|
|
131
|
+
(parameter) => parameter.required && (values[parameter.name] ?? "").trim() === ""
|
|
132
|
+
).map((parameter) => formMetadata.titleCase(parameter.name));
|
|
133
|
+
const problems = missing.length > 0 ? [`Missing required fields: ${missing.join(", ")}`] : [];
|
|
134
|
+
for (const parameter of parameters) {
|
|
135
|
+
const raw = (values[parameter.name] ?? "").trim();
|
|
136
|
+
if (raw === "") continue;
|
|
137
|
+
const label = formMetadata.titleCase(parameter.name);
|
|
138
|
+
if (((_a = parameter.schema) == null ? void 0 : _a.type) === "integer" && !isWholeNumber(raw)) {
|
|
139
|
+
problems.push(`${label} must be a whole number.`);
|
|
140
|
+
} else if (((_b = parameter.schema) == null ? void 0 : _b.type) === "number" && !isNumber(raw)) {
|
|
141
|
+
problems.push(`${label} must be a number.`);
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return problems;
|
|
145
|
+
}
|
|
146
|
+
function isWholeNumber(raw) {
|
|
147
|
+
return /^-?\d+$/.test(raw.trim());
|
|
148
|
+
}
|
|
149
|
+
function isNumber(raw) {
|
|
150
|
+
return raw.trim() !== "" && Number.isFinite(Number(raw));
|
|
151
|
+
}
|
|
152
|
+
exports.OperationArgsForm = OperationArgsForm;
|
|
153
|
+
//# sourceMappingURL=OperationArgsForm.cjs.map
|