@flanksource/clicky-ui 0.3.46 → 0.3.47
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/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/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/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/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 +74 -42
- 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 +76 -44
- 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 +52 -30
- package/dist/data/test-runner/TestRunner.cjs.map +1 -1
- package/dist/data/test-runner/TestRunner.d.ts +3 -2
- package/dist/data/test-runner/TestRunner.d.ts.map +1 -1
- package/dist/data/test-runner/TestRunner.js +52 -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 +27 -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 +28 -20
- package/dist/data/test-runner/TestTreeNode.js.map +1 -1
- package/dist/data/test-runner/adapter.cjs +11 -0
- package/dist/data/test-runner/adapter.cjs.map +1 -1
- package/dist/data/test-runner/adapter.d.ts +18 -7
- package/dist/data/test-runner/adapter.d.ts.map +1 -1
- package/dist/data/test-runner/adapter.js +11 -0
- package/dist/data/test-runner/adapter.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 +5 -2
- package/dist/data/test-runner/index.d.ts.map +1 -1
- package/dist/data/test-runner/marks.cjs +143 -0
- package/dist/data/test-runner/marks.cjs.map +1 -0
- package/dist/data/test-runner/marks.d.ts +30 -0
- package/dist/data/test-runner/marks.d.ts.map +1 -0
- package/dist/data/test-runner/marks.js +143 -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/verification/adapterViews.cjs +16 -41
- package/dist/data/verification/adapterViews.cjs.map +1 -1
- package/dist/data/verification/adapterViews.d.ts.map +1 -1
- package/dist/data/verification/adapterViews.js +16 -41
- package/dist/data/verification/adapterViews.js.map +1 -1
- package/dist/data/verification/adapters.cjs +115 -3
- package/dist/data/verification/adapters.cjs.map +1 -1
- package/dist/data/verification/adapters.d.ts.map +1 -1
- package/dist/data/verification/adapters.js +115 -3
- package/dist/data/verification/adapters.js.map +1 -1
- package/dist/data/verification/verifyReportTests.cjs.map +1 -1
- 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 +44 -3
- package/dist/data.cjs.map +1 -1
- package/dist/data.d.ts +2 -0
- package/dist/data.d.ts.map +1 -1
- package/dist/data.js +45 -4
- 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 +44 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +45 -4
- 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/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/OperationScheduleDialog.cjs +63 -10
- package/dist/rpc/OperationScheduleDialog.cjs.map +1 -1
- package/dist/rpc/OperationScheduleDialog.d.ts +4 -0
- package/dist/rpc/OperationScheduleDialog.d.ts.map +1 -1
- package/dist/rpc/OperationScheduleDialog.js +63 -10
- package/dist/rpc/OperationScheduleDialog.js.map +1 -1
- package/dist/rpc/OperationSchedules.cjs +12 -2
- package/dist/rpc/OperationSchedules.cjs.map +1 -1
- package/dist/rpc/OperationSchedules.d.ts.map +1 -1
- package/dist/rpc/OperationSchedules.js +12 -2
- package/dist/rpc/OperationSchedules.js.map +1 -1
- package/dist/rpc/operation-schedule-model.cjs +2 -0
- package/dist/rpc/operation-schedule-model.cjs.map +1 -1
- package/dist/rpc/operation-schedule-model.d.ts.map +1 -1
- package/dist/rpc/operation-schedule-model.js +2 -0
- package/dist/rpc/operation-schedule-model.js.map +1 -1
- package/dist/rpc/operation-schedule-types.d.ts +7 -1
- package/dist/rpc/operation-schedule-types.d.ts.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":"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;"}
|
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
|
3
3
|
const jsxRuntime = require("react/jsx-runtime");
|
|
4
4
|
const react = require("react");
|
|
5
5
|
const button = require("../components/button.cjs");
|
|
6
|
+
const Combobox = require("../components/Combobox.cjs");
|
|
6
7
|
const CopyButton = require("../components/CopyButton.cjs");
|
|
7
8
|
const Field = require("../components/Field.cjs");
|
|
8
9
|
const InputField = require("../components/InputField.cjs");
|
|
@@ -15,7 +16,18 @@ const InlineError = require("./InlineError.cjs");
|
|
|
15
16
|
const OperationPicker = require("./OperationPicker.cjs");
|
|
16
17
|
function OperationScheduleDialog(_props) {
|
|
17
18
|
var _a, _b, _c, _d;
|
|
18
|
-
const {
|
|
19
|
+
const {
|
|
20
|
+
open,
|
|
21
|
+
operations,
|
|
22
|
+
schedule,
|
|
23
|
+
cli,
|
|
24
|
+
targetOptions,
|
|
25
|
+
defaultTargets,
|
|
26
|
+
targetLabel = "Targets",
|
|
27
|
+
onClose,
|
|
28
|
+
onSave,
|
|
29
|
+
onRunNow
|
|
30
|
+
} = _props;
|
|
19
31
|
const [input, setInput] = react.useState(
|
|
20
32
|
operationScheduleModel.newOperationScheduleInput
|
|
21
33
|
);
|
|
@@ -25,16 +37,24 @@ function OperationScheduleDialog(_props) {
|
|
|
25
37
|
react.useEffect(() => {
|
|
26
38
|
if (!open) return;
|
|
27
39
|
setInput(
|
|
28
|
-
schedule ? operationScheduleModel.scheduleToInput(schedule) :
|
|
40
|
+
schedule ? operationScheduleModel.scheduleToInput(schedule) : {
|
|
41
|
+
...operationScheduleModel.newOperationScheduleInput(),
|
|
42
|
+
targets: [...defaultTargets ?? []]
|
|
43
|
+
}
|
|
29
44
|
);
|
|
30
45
|
setError(void 0);
|
|
31
46
|
setConfirmingRun(false);
|
|
32
|
-
}, [open, schedule]);
|
|
47
|
+
}, [open, schedule, defaultTargets]);
|
|
33
48
|
const operation = operationScheduleModel.operationByID(operations, input.operationId);
|
|
34
49
|
const schema = operationScheduleModel.operationInputSchema(operation);
|
|
35
50
|
const suggestions = ((_b = (_a = operation == null ? void 0 : operation.operation["x-clicky"]) == null ? void 0 : _a.schedule) == null ? void 0 : _b.suggestions) ?? [];
|
|
36
51
|
const destructive = ((_d = (_c = operation == null ? void 0 : operation.operation["x-clicky"]) == null ? void 0 : _c.toolHints) == null ? void 0 : _d.destructiveHint) === true;
|
|
37
|
-
const cliCommand =
|
|
52
|
+
const cliCommand = (cli == null ? void 0 : cli.targetFlag) ? input.targets.map(
|
|
53
|
+
(target) => operationCliCommand.operationCLICommand(operation, input.args, {
|
|
54
|
+
...cli,
|
|
55
|
+
globalFlags: { ...cli.globalFlags, [cli.targetFlag]: target }
|
|
56
|
+
})
|
|
57
|
+
).join("\n") : operationCliCommand.operationCLICommand(operation, input.args, cli);
|
|
38
58
|
const selectOperation = (operationId) => {
|
|
39
59
|
const selected = operationScheduleModel.operationByID(operations, operationId);
|
|
40
60
|
setInput((current) => {
|
|
@@ -64,7 +84,11 @@ function OperationScheduleDialog(_props) {
|
|
|
64
84
|
setPending("run");
|
|
65
85
|
setError(void 0);
|
|
66
86
|
try {
|
|
67
|
-
await onRunNow({
|
|
87
|
+
await onRunNow({
|
|
88
|
+
operationId: input.operationId,
|
|
89
|
+
args: input.args,
|
|
90
|
+
targets: input.targets
|
|
91
|
+
});
|
|
68
92
|
setConfirmingRun(false);
|
|
69
93
|
onClose();
|
|
70
94
|
} catch (nextError) {
|
|
@@ -75,9 +99,9 @@ function OperationScheduleDialog(_props) {
|
|
|
75
99
|
}
|
|
76
100
|
};
|
|
77
101
|
const canSave = Boolean(
|
|
78
|
-
input.name.trim() && input.operationId && input.cron.trim()
|
|
102
|
+
input.name.trim() && input.operationId && input.cron.trim() && input.targets.length
|
|
79
103
|
);
|
|
80
|
-
const canRun = Boolean(input.operationId);
|
|
104
|
+
const canRun = Boolean(input.operationId && input.targets.length);
|
|
81
105
|
return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
82
106
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
83
107
|
Modal.Modal,
|
|
@@ -111,6 +135,28 @@ function OperationScheduleDialog(_props) {
|
|
|
111
135
|
)
|
|
112
136
|
] }),
|
|
113
137
|
children: /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "space-y-5", children: [
|
|
138
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
139
|
+
Field.Field,
|
|
140
|
+
{
|
|
141
|
+
label: targetLabel,
|
|
142
|
+
htmlFor: "operation-schedule-targets",
|
|
143
|
+
required: true,
|
|
144
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
145
|
+
Combobox.Combobox,
|
|
146
|
+
{
|
|
147
|
+
id: "operation-schedule-targets",
|
|
148
|
+
multiple: true,
|
|
149
|
+
variant: "tags",
|
|
150
|
+
ariaLabel: targetLabel,
|
|
151
|
+
ariaRequired: true,
|
|
152
|
+
allowCustomValue: false,
|
|
153
|
+
options: targetOptions,
|
|
154
|
+
value: input.targets,
|
|
155
|
+
onChange: (targets) => setInput({ ...input, targets })
|
|
156
|
+
}
|
|
157
|
+
)
|
|
158
|
+
}
|
|
159
|
+
),
|
|
114
160
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
115
161
|
Field.Field,
|
|
116
162
|
{
|
|
@@ -152,7 +198,7 @@ function OperationScheduleDialog(_props) {
|
|
|
152
198
|
cliCommand ? /* @__PURE__ */ jsxRuntime.jsxs("section", { className: "space-y-1", children: [
|
|
153
199
|
/* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-sm font-semibold", children: "Equivalent CLI command" }),
|
|
154
200
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-2 rounded-md border bg-muted/30 px-3 py-2", children: [
|
|
155
|
-
/* @__PURE__ */ jsxRuntime.jsx("code", { className: "min-w-0 flex-1 overflow-x-auto whitespace-
|
|
201
|
+
/* @__PURE__ */ jsxRuntime.jsx("code", { className: "min-w-0 flex-1 overflow-x-auto whitespace-pre text-xs", children: cliCommand }),
|
|
156
202
|
/* @__PURE__ */ jsxRuntime.jsx(CopyButton.CopyButton, { value: cliCommand, label: "Copy CLI command" })
|
|
157
203
|
] })
|
|
158
204
|
] }) : null,
|
|
@@ -170,7 +216,7 @@ function OperationScheduleDialog(_props) {
|
|
|
170
216
|
] })
|
|
171
217
|
}
|
|
172
218
|
),
|
|
173
|
-
/* @__PURE__ */ jsxRuntime.
|
|
219
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
174
220
|
Modal.Modal,
|
|
175
221
|
{
|
|
176
222
|
open: confirmingRun,
|
|
@@ -198,7 +244,14 @@ function OperationScheduleDialog(_props) {
|
|
|
198
244
|
}
|
|
199
245
|
)
|
|
200
246
|
] }),
|
|
201
|
-
children:
|
|
247
|
+
children: [
|
|
248
|
+
/* @__PURE__ */ jsxRuntime.jsx("p", { className: "text-sm text-muted-foreground", children: "This runs the configured operation once without creating or changing a recurring schedule." }),
|
|
249
|
+
/* @__PURE__ */ jsxRuntime.jsxs("p", { className: "mt-2 text-sm", children: [
|
|
250
|
+
targetLabel,
|
|
251
|
+
": ",
|
|
252
|
+
input.targets.join(", ")
|
|
253
|
+
] })
|
|
254
|
+
]
|
|
202
255
|
}
|
|
203
256
|
)
|
|
204
257
|
] });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OperationScheduleDialog.cjs","sources":["../../src/rpc/OperationScheduleDialog.tsx"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport { Button } from \"../components/button\";\nimport { CopyButton } from \"../components/CopyButton\";\nimport { Field } from \"../components/Field\";\nimport { InputField } from \"../components/InputField\";\nimport { JsonSchemaForm } from \"../components/JsonSchemaForm\";\nimport { ScheduleEditor } from \"../components/ScheduleEditor\";\nimport { Modal } from \"../overlay/Modal\";\nimport {\n newOperationScheduleInput,\n operationByID,\n operationInputSchema,\n operationLabel,\n scheduleToInput,\n} from \"./operation-schedule-model\";\nimport { operationCLICommand } from \"./operation-cli-command\";\nimport type {\n OperationSchedule,\n OperationScheduleCLI,\n OperationScheduleInput,\n OperationScheduleRunInput,\n} from \"./operation-schedule-types\";\nimport type { ResolvedOperation } from \"./types\";\nimport { InlineError } from \"./InlineError\";\nimport { OperationPicker } from \"./OperationPicker\";\n\nexport interface OperationScheduleDialogProps {\n open: boolean;\n operations: readonly ResolvedOperation[];\n schedule?: OperationSchedule;\n cli?: OperationScheduleCLI;\n onClose: () => void;\n onSave: (input: OperationScheduleInput) => Promise<unknown>;\n onRunNow: (input: OperationScheduleRunInput) => Promise<unknown>;\n}\n\nexport function OperationScheduleDialog(_props: OperationScheduleDialogProps) {\n const { open, operations, schedule, cli, onClose, onSave, onRunNow } = _props;\n const [input, setInput] = useState<OperationScheduleInput>(\n newOperationScheduleInput,\n );\n const [pending, setPending] = useState<\"save\" | \"run\">();\n const [error, setError] = useState<unknown>();\n const [confirmingRun, setConfirmingRun] = useState(false);\n\n useEffect(() => {\n if (!open) return;\n setInput(\n schedule ? scheduleToInput(schedule) : newOperationScheduleInput(),\n );\n setError(undefined);\n setConfirmingRun(false);\n }, [open, schedule]);\n\n const operation = operationByID(operations, input.operationId);\n const schema = operationInputSchema(operation);\n const suggestions =\n operation?.operation[\"x-clicky\"]?.schedule?.suggestions ?? [];\n const destructive =\n operation?.operation[\"x-clicky\"]?.toolHints?.destructiveHint === true;\n const cliCommand = operationCLICommand(operation, input.args, cli);\n\n const selectOperation = (operationId: string) => {\n const selected = operationByID(operations, operationId);\n setInput((current) => ({\n ...current,\n operationId,\n args: {},\n name: current.name || operationLabel(selected),\n cron:\n selected?.operation[\"x-clicky\"]?.schedule?.suggestions?.[0]?.cron ??\n current.cron,\n }));\n };\n\n const save = async () => {\n setPending(\"save\");\n setError(undefined);\n try {\n await onSave(input);\n onClose();\n } catch (nextError) {\n setError(nextError);\n } finally {\n setPending(undefined);\n }\n };\n\n const run = async () => {\n setPending(\"run\");\n setError(undefined);\n try {\n await onRunNow({ operationId: input.operationId, args: input.args });\n setConfirmingRun(false);\n onClose();\n } catch (nextError) {\n setError(nextError);\n setConfirmingRun(false);\n } finally {\n setPending(undefined);\n }\n };\n\n const canSave = Boolean(\n input.name.trim() && input.operationId && input.cron.trim(),\n );\n const canRun = Boolean(input.operationId);\n\n return (\n <>\n <Modal\n open={open}\n onClose={onClose}\n title={schedule ? \"Edit schedule\" : \"Add schedule\"}\n size=\"xl\"\n footer={\n <div className=\"flex w-full flex-wrap justify-end gap-2\">\n <Button type=\"button\" variant=\"outline\" onClick={onClose}>\n Cancel\n </Button>\n <Button\n type=\"button\"\n variant={destructive ? \"destructive\" : \"secondary\"}\n disabled={!canRun}\n loading={pending === \"run\"}\n onClick={() => setConfirmingRun(true)}\n >\n Run now\n </Button>\n <Button\n type=\"button\"\n disabled={!canSave}\n loading={pending === \"save\"}\n onClick={save}\n >\n Save schedule\n </Button>\n </div>\n }\n >\n <div className=\"space-y-5\">\n <Field\n label=\"Schedule name\"\n htmlFor=\"operation-schedule-name\"\n required\n >\n <InputField\n id=\"operation-schedule-name\"\n value={input.name}\n onChange={(name) => setInput({ ...input, name })}\n />\n </Field>\n <OperationPicker\n id=\"operation-schedule-operation\"\n operations={operations}\n value={input.operationId}\n onChange={selectOperation}\n />\n {operation ? (\n schema && Object.keys(schema.properties ?? {}).length > 0 ? (\n <section className=\"space-y-2\">\n <h3 className=\"text-sm font-semibold\">Arguments</h3>\n <JsonSchemaForm\n schema={schema}\n value={input.args}\n onChange={(args) => setInput({ ...input, args })}\n idPrefix=\"operation-schedule-args\"\n showPreferencesMenu={false}\n />\n </section>\n ) : (\n <p className=\"text-sm text-muted-foreground\">\n This operation has no arguments.\n </p>\n )\n ) : null}\n {cliCommand ? (\n <section className=\"space-y-1\">\n <h3 className=\"text-sm font-semibold\">Equivalent CLI command</h3>\n <div className=\"flex items-center gap-2 rounded-md border bg-muted/30 px-3 py-2\">\n <code className=\"min-w-0 flex-1 overflow-x-auto whitespace-nowrap text-xs\">\n {cliCommand}\n </code>\n <CopyButton value={cliCommand} label=\"Copy CLI command\" />\n </div>\n </section>\n ) : null}\n <ScheduleEditor\n id=\"operation-schedule\"\n value={input}\n onChange={(timing) => setInput({ ...input, ...timing })}\n cronSuggestions={suggestions}\n timezoneSuggestions={[input.timezone, \"UTC\"]}\n />\n {error ? (\n <InlineError title=\"Schedule action failed\" error={error} />\n ) : null}\n </div>\n </Modal>\n <Modal\n open={confirmingRun}\n onClose={() => setConfirmingRun(false)}\n title={`Run ${operationLabel(operation)} now?`}\n size=\"sm\"\n footer={\n <div className=\"flex w-full justify-end gap-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => setConfirmingRun(false)}\n >\n Cancel\n </Button>\n <Button\n type=\"button\"\n variant={destructive ? \"destructive\" : \"default\"}\n loading={pending === \"run\"}\n onClick={run}\n >\n Run now\n </Button>\n </div>\n }\n >\n <p className=\"text-sm text-muted-foreground\">\n This runs the configured operation once without creating or changing a\n recurring schedule.\n </p>\n </Modal>\n </>\n );\n}\n"],"names":["useState","newOperationScheduleInput","useEffect","scheduleToInput","operationByID","operationInputSchema","operationCLICommand","operationLabel","_d","_c","_b","_a","jsxs","Fragment","jsx","Modal","Button","Field","InputField","OperationPicker","JsonSchemaForm","CopyButton","ScheduleEditor","InlineError"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"OperationScheduleDialog.cjs","sources":["../../src/rpc/OperationScheduleDialog.tsx"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport { Button } from \"../components/button\";\nimport { Combobox } from \"../components/Combobox\";\nimport type { ComboboxOption } from \"../components/combobox-types\";\nimport { CopyButton } from \"../components/CopyButton\";\nimport { Field } from \"../components/Field\";\nimport { InputField } from \"../components/InputField\";\nimport { JsonSchemaForm } from \"../components/JsonSchemaForm\";\nimport { ScheduleEditor } from \"../components/ScheduleEditor\";\nimport { Modal } from \"../overlay/Modal\";\nimport {\n newOperationScheduleInput,\n operationByID,\n operationInputSchema,\n operationLabel,\n scheduleToInput,\n} from \"./operation-schedule-model\";\nimport { operationCLICommand } from \"./operation-cli-command\";\nimport type {\n OperationSchedule,\n OperationScheduleCLI,\n OperationScheduleInput,\n OperationScheduleRunInput,\n} from \"./operation-schedule-types\";\nimport type { ResolvedOperation } from \"./types\";\nimport { InlineError } from \"./InlineError\";\nimport { OperationPicker } from \"./OperationPicker\";\n\nexport interface OperationScheduleDialogProps {\n open: boolean;\n operations: readonly ResolvedOperation[];\n targetOptions: ComboboxOption[];\n defaultTargets?: string[];\n targetLabel?: string;\n schedule?: OperationSchedule;\n cli?: OperationScheduleCLI;\n onClose: () => void;\n onSave: (input: OperationScheduleInput) => Promise<unknown>;\n onRunNow: (input: OperationScheduleRunInput) => Promise<unknown>;\n}\n\nexport function OperationScheduleDialog(_props: OperationScheduleDialogProps) {\n const {\n open,\n operations,\n schedule,\n cli,\n targetOptions,\n defaultTargets,\n targetLabel = \"Targets\",\n onClose,\n onSave,\n onRunNow,\n } = _props;\n const [input, setInput] = useState<OperationScheduleInput>(\n newOperationScheduleInput,\n );\n const [pending, setPending] = useState<\"save\" | \"run\">();\n const [error, setError] = useState<unknown>();\n const [confirmingRun, setConfirmingRun] = useState(false);\n\n useEffect(() => {\n if (!open) return;\n setInput(\n schedule\n ? scheduleToInput(schedule)\n : {\n ...newOperationScheduleInput(),\n targets: [...(defaultTargets ?? [])],\n },\n );\n setError(undefined);\n setConfirmingRun(false);\n }, [open, schedule, defaultTargets]);\n\n const operation = operationByID(operations, input.operationId);\n const schema = operationInputSchema(operation);\n const suggestions =\n operation?.operation[\"x-clicky\"]?.schedule?.suggestions ?? [];\n const destructive =\n operation?.operation[\"x-clicky\"]?.toolHints?.destructiveHint === true;\n const cliCommand = cli?.targetFlag\n ? input.targets\n .map((target) =>\n operationCLICommand(operation, input.args, {\n ...cli,\n globalFlags: { ...cli.globalFlags, [cli.targetFlag!]: target },\n }),\n )\n .join(\"\\n\")\n : operationCLICommand(operation, input.args, cli);\n\n const selectOperation = (operationId: string) => {\n const selected = operationByID(operations, operationId);\n setInput((current) => ({\n ...current,\n operationId,\n args: {},\n name: current.name || operationLabel(selected),\n cron:\n selected?.operation[\"x-clicky\"]?.schedule?.suggestions?.[0]?.cron ??\n current.cron,\n }));\n };\n\n const save = async () => {\n setPending(\"save\");\n setError(undefined);\n try {\n await onSave(input);\n onClose();\n } catch (nextError) {\n setError(nextError);\n } finally {\n setPending(undefined);\n }\n };\n\n const run = async () => {\n setPending(\"run\");\n setError(undefined);\n try {\n await onRunNow({\n operationId: input.operationId,\n args: input.args,\n targets: input.targets,\n });\n setConfirmingRun(false);\n onClose();\n } catch (nextError) {\n setError(nextError);\n setConfirmingRun(false);\n } finally {\n setPending(undefined);\n }\n };\n\n const canSave = Boolean(\n input.name.trim() &&\n input.operationId &&\n input.cron.trim() &&\n input.targets.length,\n );\n const canRun = Boolean(input.operationId && input.targets.length);\n\n return (\n <>\n <Modal\n open={open}\n onClose={onClose}\n title={schedule ? \"Edit schedule\" : \"Add schedule\"}\n size=\"xl\"\n footer={\n <div className=\"flex w-full flex-wrap justify-end gap-2\">\n <Button type=\"button\" variant=\"outline\" onClick={onClose}>\n Cancel\n </Button>\n <Button\n type=\"button\"\n variant={destructive ? \"destructive\" : \"secondary\"}\n disabled={!canRun}\n loading={pending === \"run\"}\n onClick={() => setConfirmingRun(true)}\n >\n Run now\n </Button>\n <Button\n type=\"button\"\n disabled={!canSave}\n loading={pending === \"save\"}\n onClick={save}\n >\n Save schedule\n </Button>\n </div>\n }\n >\n <div className=\"space-y-5\">\n <Field\n label={targetLabel}\n htmlFor=\"operation-schedule-targets\"\n required\n >\n <Combobox\n id=\"operation-schedule-targets\"\n multiple\n variant=\"tags\"\n ariaLabel={targetLabel}\n ariaRequired\n allowCustomValue={false}\n options={targetOptions}\n value={input.targets}\n onChange={(targets) => setInput({ ...input, targets })}\n />\n </Field>\n <Field\n label=\"Schedule name\"\n htmlFor=\"operation-schedule-name\"\n required\n >\n <InputField\n id=\"operation-schedule-name\"\n value={input.name}\n onChange={(name) => setInput({ ...input, name })}\n />\n </Field>\n <OperationPicker\n id=\"operation-schedule-operation\"\n operations={operations}\n value={input.operationId}\n onChange={selectOperation}\n />\n {operation ? (\n schema && Object.keys(schema.properties ?? {}).length > 0 ? (\n <section className=\"space-y-2\">\n <h3 className=\"text-sm font-semibold\">Arguments</h3>\n <JsonSchemaForm\n schema={schema}\n value={input.args}\n onChange={(args) => setInput({ ...input, args })}\n idPrefix=\"operation-schedule-args\"\n showPreferencesMenu={false}\n />\n </section>\n ) : (\n <p className=\"text-sm text-muted-foreground\">\n This operation has no arguments.\n </p>\n )\n ) : null}\n {cliCommand ? (\n <section className=\"space-y-1\">\n <h3 className=\"text-sm font-semibold\">Equivalent CLI command</h3>\n <div className=\"flex items-center gap-2 rounded-md border bg-muted/30 px-3 py-2\">\n <code className=\"min-w-0 flex-1 overflow-x-auto whitespace-pre text-xs\">\n {cliCommand}\n </code>\n <CopyButton value={cliCommand} label=\"Copy CLI command\" />\n </div>\n </section>\n ) : null}\n <ScheduleEditor\n id=\"operation-schedule\"\n value={input}\n onChange={(timing) => setInput({ ...input, ...timing })}\n cronSuggestions={suggestions}\n timezoneSuggestions={[input.timezone, \"UTC\"]}\n />\n {error ? (\n <InlineError title=\"Schedule action failed\" error={error} />\n ) : null}\n </div>\n </Modal>\n <Modal\n open={confirmingRun}\n onClose={() => setConfirmingRun(false)}\n title={`Run ${operationLabel(operation)} now?`}\n size=\"sm\"\n footer={\n <div className=\"flex w-full justify-end gap-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => setConfirmingRun(false)}\n >\n Cancel\n </Button>\n <Button\n type=\"button\"\n variant={destructive ? \"destructive\" : \"default\"}\n loading={pending === \"run\"}\n onClick={run}\n >\n Run now\n </Button>\n </div>\n }\n >\n <p className=\"text-sm text-muted-foreground\">\n This runs the configured operation once without creating or changing a\n recurring schedule.\n </p>\n <p className=\"mt-2 text-sm\">\n {targetLabel}: {input.targets.join(\", \")}\n </p>\n </Modal>\n </>\n );\n}\n"],"names":["useState","newOperationScheduleInput","useEffect","scheduleToInput","operationByID","operationInputSchema","operationCLICommand","operationLabel","_d","_c","_b","_a","jsxs","Fragment","jsx","Modal","Button","Field","Combobox","InputField","OperationPicker","JsonSchemaForm","CopyButton","ScheduleEditor","InlineError"],"mappings":"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"}
|
|
@@ -1,8 +1,12 @@
|
|
|
1
|
+
import { ComboboxOption } from '../components/combobox-types.js';
|
|
1
2
|
import { OperationSchedule, OperationScheduleCLI, OperationScheduleInput, OperationScheduleRunInput } from './operation-schedule-types.js';
|
|
2
3
|
import { ResolvedOperation } from './types.js';
|
|
3
4
|
export interface OperationScheduleDialogProps {
|
|
4
5
|
open: boolean;
|
|
5
6
|
operations: readonly ResolvedOperation[];
|
|
7
|
+
targetOptions: ComboboxOption[];
|
|
8
|
+
defaultTargets?: string[];
|
|
9
|
+
targetLabel?: string;
|
|
6
10
|
schedule?: OperationSchedule;
|
|
7
11
|
cli?: OperationScheduleCLI;
|
|
8
12
|
onClose: () => void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OperationScheduleDialog.d.ts","sourceRoot":"","sources":["../../src/rpc/OperationScheduleDialog.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"OperationScheduleDialog.d.ts","sourceRoot":"","sources":["../../src/rpc/OperationScheduleDialog.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,8BAA8B,CAAC;AAenE,OAAO,KAAK,EACV,iBAAiB,EACjB,oBAAoB,EACpB,sBAAsB,EACtB,yBAAyB,EAC1B,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAIjD,MAAM,WAAW,4BAA4B;IAC3C,IAAI,EAAE,OAAO,CAAC;IACd,UAAU,EAAE,SAAS,iBAAiB,EAAE,CAAC;IACzC,aAAa,EAAE,cAAc,EAAE,CAAC;IAChC,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B,GAAG,CAAC,EAAE,oBAAoB,CAAC;IAC3B,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,MAAM,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAC5D,QAAQ,EAAE,CAAC,KAAK,EAAE,yBAAyB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CAClE;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,4BAA4B,+BAuP3E"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { jsxs, Fragment, jsx } from "react/jsx-runtime";
|
|
2
2
|
import { useState, useEffect } from "react";
|
|
3
3
|
import { Button } from "../components/button.js";
|
|
4
|
+
import { Combobox } from "../components/Combobox.js";
|
|
4
5
|
import { CopyButton } from "../components/CopyButton.js";
|
|
5
6
|
import { Field } from "../components/Field.js";
|
|
6
7
|
import { InputField } from "../components/InputField.js";
|
|
@@ -13,7 +14,18 @@ import { InlineError } from "./InlineError.js";
|
|
|
13
14
|
import { OperationPicker } from "./OperationPicker.js";
|
|
14
15
|
function OperationScheduleDialog(_props) {
|
|
15
16
|
var _a, _b, _c, _d;
|
|
16
|
-
const {
|
|
17
|
+
const {
|
|
18
|
+
open,
|
|
19
|
+
operations,
|
|
20
|
+
schedule,
|
|
21
|
+
cli,
|
|
22
|
+
targetOptions,
|
|
23
|
+
defaultTargets,
|
|
24
|
+
targetLabel = "Targets",
|
|
25
|
+
onClose,
|
|
26
|
+
onSave,
|
|
27
|
+
onRunNow
|
|
28
|
+
} = _props;
|
|
17
29
|
const [input, setInput] = useState(
|
|
18
30
|
newOperationScheduleInput
|
|
19
31
|
);
|
|
@@ -23,16 +35,24 @@ function OperationScheduleDialog(_props) {
|
|
|
23
35
|
useEffect(() => {
|
|
24
36
|
if (!open) return;
|
|
25
37
|
setInput(
|
|
26
|
-
schedule ? scheduleToInput(schedule) :
|
|
38
|
+
schedule ? scheduleToInput(schedule) : {
|
|
39
|
+
...newOperationScheduleInput(),
|
|
40
|
+
targets: [...defaultTargets ?? []]
|
|
41
|
+
}
|
|
27
42
|
);
|
|
28
43
|
setError(void 0);
|
|
29
44
|
setConfirmingRun(false);
|
|
30
|
-
}, [open, schedule]);
|
|
45
|
+
}, [open, schedule, defaultTargets]);
|
|
31
46
|
const operation = operationByID(operations, input.operationId);
|
|
32
47
|
const schema = operationInputSchema(operation);
|
|
33
48
|
const suggestions = ((_b = (_a = operation == null ? void 0 : operation.operation["x-clicky"]) == null ? void 0 : _a.schedule) == null ? void 0 : _b.suggestions) ?? [];
|
|
34
49
|
const destructive = ((_d = (_c = operation == null ? void 0 : operation.operation["x-clicky"]) == null ? void 0 : _c.toolHints) == null ? void 0 : _d.destructiveHint) === true;
|
|
35
|
-
const cliCommand =
|
|
50
|
+
const cliCommand = (cli == null ? void 0 : cli.targetFlag) ? input.targets.map(
|
|
51
|
+
(target) => operationCLICommand(operation, input.args, {
|
|
52
|
+
...cli,
|
|
53
|
+
globalFlags: { ...cli.globalFlags, [cli.targetFlag]: target }
|
|
54
|
+
})
|
|
55
|
+
).join("\n") : operationCLICommand(operation, input.args, cli);
|
|
36
56
|
const selectOperation = (operationId) => {
|
|
37
57
|
const selected = operationByID(operations, operationId);
|
|
38
58
|
setInput((current) => {
|
|
@@ -62,7 +82,11 @@ function OperationScheduleDialog(_props) {
|
|
|
62
82
|
setPending("run");
|
|
63
83
|
setError(void 0);
|
|
64
84
|
try {
|
|
65
|
-
await onRunNow({
|
|
85
|
+
await onRunNow({
|
|
86
|
+
operationId: input.operationId,
|
|
87
|
+
args: input.args,
|
|
88
|
+
targets: input.targets
|
|
89
|
+
});
|
|
66
90
|
setConfirmingRun(false);
|
|
67
91
|
onClose();
|
|
68
92
|
} catch (nextError) {
|
|
@@ -73,9 +97,9 @@ function OperationScheduleDialog(_props) {
|
|
|
73
97
|
}
|
|
74
98
|
};
|
|
75
99
|
const canSave = Boolean(
|
|
76
|
-
input.name.trim() && input.operationId && input.cron.trim()
|
|
100
|
+
input.name.trim() && input.operationId && input.cron.trim() && input.targets.length
|
|
77
101
|
);
|
|
78
|
-
const canRun = Boolean(input.operationId);
|
|
102
|
+
const canRun = Boolean(input.operationId && input.targets.length);
|
|
79
103
|
return /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
80
104
|
/* @__PURE__ */ jsx(
|
|
81
105
|
Modal,
|
|
@@ -109,6 +133,28 @@ function OperationScheduleDialog(_props) {
|
|
|
109
133
|
)
|
|
110
134
|
] }),
|
|
111
135
|
children: /* @__PURE__ */ jsxs("div", { className: "space-y-5", children: [
|
|
136
|
+
/* @__PURE__ */ jsx(
|
|
137
|
+
Field,
|
|
138
|
+
{
|
|
139
|
+
label: targetLabel,
|
|
140
|
+
htmlFor: "operation-schedule-targets",
|
|
141
|
+
required: true,
|
|
142
|
+
children: /* @__PURE__ */ jsx(
|
|
143
|
+
Combobox,
|
|
144
|
+
{
|
|
145
|
+
id: "operation-schedule-targets",
|
|
146
|
+
multiple: true,
|
|
147
|
+
variant: "tags",
|
|
148
|
+
ariaLabel: targetLabel,
|
|
149
|
+
ariaRequired: true,
|
|
150
|
+
allowCustomValue: false,
|
|
151
|
+
options: targetOptions,
|
|
152
|
+
value: input.targets,
|
|
153
|
+
onChange: (targets) => setInput({ ...input, targets })
|
|
154
|
+
}
|
|
155
|
+
)
|
|
156
|
+
}
|
|
157
|
+
),
|
|
112
158
|
/* @__PURE__ */ jsx(
|
|
113
159
|
Field,
|
|
114
160
|
{
|
|
@@ -150,7 +196,7 @@ function OperationScheduleDialog(_props) {
|
|
|
150
196
|
cliCommand ? /* @__PURE__ */ jsxs("section", { className: "space-y-1", children: [
|
|
151
197
|
/* @__PURE__ */ jsx("h3", { className: "text-sm font-semibold", children: "Equivalent CLI command" }),
|
|
152
198
|
/* @__PURE__ */ jsxs("div", { className: "flex items-center gap-2 rounded-md border bg-muted/30 px-3 py-2", children: [
|
|
153
|
-
/* @__PURE__ */ jsx("code", { className: "min-w-0 flex-1 overflow-x-auto whitespace-
|
|
199
|
+
/* @__PURE__ */ jsx("code", { className: "min-w-0 flex-1 overflow-x-auto whitespace-pre text-xs", children: cliCommand }),
|
|
154
200
|
/* @__PURE__ */ jsx(CopyButton, { value: cliCommand, label: "Copy CLI command" })
|
|
155
201
|
] })
|
|
156
202
|
] }) : null,
|
|
@@ -168,7 +214,7 @@ function OperationScheduleDialog(_props) {
|
|
|
168
214
|
] })
|
|
169
215
|
}
|
|
170
216
|
),
|
|
171
|
-
/* @__PURE__ */
|
|
217
|
+
/* @__PURE__ */ jsxs(
|
|
172
218
|
Modal,
|
|
173
219
|
{
|
|
174
220
|
open: confirmingRun,
|
|
@@ -196,7 +242,14 @@ function OperationScheduleDialog(_props) {
|
|
|
196
242
|
}
|
|
197
243
|
)
|
|
198
244
|
] }),
|
|
199
|
-
children:
|
|
245
|
+
children: [
|
|
246
|
+
/* @__PURE__ */ jsx("p", { className: "text-sm text-muted-foreground", children: "This runs the configured operation once without creating or changing a recurring schedule." }),
|
|
247
|
+
/* @__PURE__ */ jsxs("p", { className: "mt-2 text-sm", children: [
|
|
248
|
+
targetLabel,
|
|
249
|
+
": ",
|
|
250
|
+
input.targets.join(", ")
|
|
251
|
+
] })
|
|
252
|
+
]
|
|
200
253
|
}
|
|
201
254
|
)
|
|
202
255
|
] });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OperationScheduleDialog.js","sources":["../../src/rpc/OperationScheduleDialog.tsx"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport { Button } from \"../components/button\";\nimport { CopyButton } from \"../components/CopyButton\";\nimport { Field } from \"../components/Field\";\nimport { InputField } from \"../components/InputField\";\nimport { JsonSchemaForm } from \"../components/JsonSchemaForm\";\nimport { ScheduleEditor } from \"../components/ScheduleEditor\";\nimport { Modal } from \"../overlay/Modal\";\nimport {\n newOperationScheduleInput,\n operationByID,\n operationInputSchema,\n operationLabel,\n scheduleToInput,\n} from \"./operation-schedule-model\";\nimport { operationCLICommand } from \"./operation-cli-command\";\nimport type {\n OperationSchedule,\n OperationScheduleCLI,\n OperationScheduleInput,\n OperationScheduleRunInput,\n} from \"./operation-schedule-types\";\nimport type { ResolvedOperation } from \"./types\";\nimport { InlineError } from \"./InlineError\";\nimport { OperationPicker } from \"./OperationPicker\";\n\nexport interface OperationScheduleDialogProps {\n open: boolean;\n operations: readonly ResolvedOperation[];\n schedule?: OperationSchedule;\n cli?: OperationScheduleCLI;\n onClose: () => void;\n onSave: (input: OperationScheduleInput) => Promise<unknown>;\n onRunNow: (input: OperationScheduleRunInput) => Promise<unknown>;\n}\n\nexport function OperationScheduleDialog(_props: OperationScheduleDialogProps) {\n const { open, operations, schedule, cli, onClose, onSave, onRunNow } = _props;\n const [input, setInput] = useState<OperationScheduleInput>(\n newOperationScheduleInput,\n );\n const [pending, setPending] = useState<\"save\" | \"run\">();\n const [error, setError] = useState<unknown>();\n const [confirmingRun, setConfirmingRun] = useState(false);\n\n useEffect(() => {\n if (!open) return;\n setInput(\n schedule ? scheduleToInput(schedule) : newOperationScheduleInput(),\n );\n setError(undefined);\n setConfirmingRun(false);\n }, [open, schedule]);\n\n const operation = operationByID(operations, input.operationId);\n const schema = operationInputSchema(operation);\n const suggestions =\n operation?.operation[\"x-clicky\"]?.schedule?.suggestions ?? [];\n const destructive =\n operation?.operation[\"x-clicky\"]?.toolHints?.destructiveHint === true;\n const cliCommand = operationCLICommand(operation, input.args, cli);\n\n const selectOperation = (operationId: string) => {\n const selected = operationByID(operations, operationId);\n setInput((current) => ({\n ...current,\n operationId,\n args: {},\n name: current.name || operationLabel(selected),\n cron:\n selected?.operation[\"x-clicky\"]?.schedule?.suggestions?.[0]?.cron ??\n current.cron,\n }));\n };\n\n const save = async () => {\n setPending(\"save\");\n setError(undefined);\n try {\n await onSave(input);\n onClose();\n } catch (nextError) {\n setError(nextError);\n } finally {\n setPending(undefined);\n }\n };\n\n const run = async () => {\n setPending(\"run\");\n setError(undefined);\n try {\n await onRunNow({ operationId: input.operationId, args: input.args });\n setConfirmingRun(false);\n onClose();\n } catch (nextError) {\n setError(nextError);\n setConfirmingRun(false);\n } finally {\n setPending(undefined);\n }\n };\n\n const canSave = Boolean(\n input.name.trim() && input.operationId && input.cron.trim(),\n );\n const canRun = Boolean(input.operationId);\n\n return (\n <>\n <Modal\n open={open}\n onClose={onClose}\n title={schedule ? \"Edit schedule\" : \"Add schedule\"}\n size=\"xl\"\n footer={\n <div className=\"flex w-full flex-wrap justify-end gap-2\">\n <Button type=\"button\" variant=\"outline\" onClick={onClose}>\n Cancel\n </Button>\n <Button\n type=\"button\"\n variant={destructive ? \"destructive\" : \"secondary\"}\n disabled={!canRun}\n loading={pending === \"run\"}\n onClick={() => setConfirmingRun(true)}\n >\n Run now\n </Button>\n <Button\n type=\"button\"\n disabled={!canSave}\n loading={pending === \"save\"}\n onClick={save}\n >\n Save schedule\n </Button>\n </div>\n }\n >\n <div className=\"space-y-5\">\n <Field\n label=\"Schedule name\"\n htmlFor=\"operation-schedule-name\"\n required\n >\n <InputField\n id=\"operation-schedule-name\"\n value={input.name}\n onChange={(name) => setInput({ ...input, name })}\n />\n </Field>\n <OperationPicker\n id=\"operation-schedule-operation\"\n operations={operations}\n value={input.operationId}\n onChange={selectOperation}\n />\n {operation ? (\n schema && Object.keys(schema.properties ?? {}).length > 0 ? (\n <section className=\"space-y-2\">\n <h3 className=\"text-sm font-semibold\">Arguments</h3>\n <JsonSchemaForm\n schema={schema}\n value={input.args}\n onChange={(args) => setInput({ ...input, args })}\n idPrefix=\"operation-schedule-args\"\n showPreferencesMenu={false}\n />\n </section>\n ) : (\n <p className=\"text-sm text-muted-foreground\">\n This operation has no arguments.\n </p>\n )\n ) : null}\n {cliCommand ? (\n <section className=\"space-y-1\">\n <h3 className=\"text-sm font-semibold\">Equivalent CLI command</h3>\n <div className=\"flex items-center gap-2 rounded-md border bg-muted/30 px-3 py-2\">\n <code className=\"min-w-0 flex-1 overflow-x-auto whitespace-nowrap text-xs\">\n {cliCommand}\n </code>\n <CopyButton value={cliCommand} label=\"Copy CLI command\" />\n </div>\n </section>\n ) : null}\n <ScheduleEditor\n id=\"operation-schedule\"\n value={input}\n onChange={(timing) => setInput({ ...input, ...timing })}\n cronSuggestions={suggestions}\n timezoneSuggestions={[input.timezone, \"UTC\"]}\n />\n {error ? (\n <InlineError title=\"Schedule action failed\" error={error} />\n ) : null}\n </div>\n </Modal>\n <Modal\n open={confirmingRun}\n onClose={() => setConfirmingRun(false)}\n title={`Run ${operationLabel(operation)} now?`}\n size=\"sm\"\n footer={\n <div className=\"flex w-full justify-end gap-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => setConfirmingRun(false)}\n >\n Cancel\n </Button>\n <Button\n type=\"button\"\n variant={destructive ? \"destructive\" : \"default\"}\n loading={pending === \"run\"}\n onClick={run}\n >\n Run now\n </Button>\n </div>\n }\n >\n <p className=\"text-sm text-muted-foreground\">\n This runs the configured operation once without creating or changing a\n recurring schedule.\n </p>\n </Modal>\n </>\n );\n}\n"],"names":["_d","_c","_b","_a"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"OperationScheduleDialog.js","sources":["../../src/rpc/OperationScheduleDialog.tsx"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport { Button } from \"../components/button\";\nimport { Combobox } from \"../components/Combobox\";\nimport type { ComboboxOption } from \"../components/combobox-types\";\nimport { CopyButton } from \"../components/CopyButton\";\nimport { Field } from \"../components/Field\";\nimport { InputField } from \"../components/InputField\";\nimport { JsonSchemaForm } from \"../components/JsonSchemaForm\";\nimport { ScheduleEditor } from \"../components/ScheduleEditor\";\nimport { Modal } from \"../overlay/Modal\";\nimport {\n newOperationScheduleInput,\n operationByID,\n operationInputSchema,\n operationLabel,\n scheduleToInput,\n} from \"./operation-schedule-model\";\nimport { operationCLICommand } from \"./operation-cli-command\";\nimport type {\n OperationSchedule,\n OperationScheduleCLI,\n OperationScheduleInput,\n OperationScheduleRunInput,\n} from \"./operation-schedule-types\";\nimport type { ResolvedOperation } from \"./types\";\nimport { InlineError } from \"./InlineError\";\nimport { OperationPicker } from \"./OperationPicker\";\n\nexport interface OperationScheduleDialogProps {\n open: boolean;\n operations: readonly ResolvedOperation[];\n targetOptions: ComboboxOption[];\n defaultTargets?: string[];\n targetLabel?: string;\n schedule?: OperationSchedule;\n cli?: OperationScheduleCLI;\n onClose: () => void;\n onSave: (input: OperationScheduleInput) => Promise<unknown>;\n onRunNow: (input: OperationScheduleRunInput) => Promise<unknown>;\n}\n\nexport function OperationScheduleDialog(_props: OperationScheduleDialogProps) {\n const {\n open,\n operations,\n schedule,\n cli,\n targetOptions,\n defaultTargets,\n targetLabel = \"Targets\",\n onClose,\n onSave,\n onRunNow,\n } = _props;\n const [input, setInput] = useState<OperationScheduleInput>(\n newOperationScheduleInput,\n );\n const [pending, setPending] = useState<\"save\" | \"run\">();\n const [error, setError] = useState<unknown>();\n const [confirmingRun, setConfirmingRun] = useState(false);\n\n useEffect(() => {\n if (!open) return;\n setInput(\n schedule\n ? scheduleToInput(schedule)\n : {\n ...newOperationScheduleInput(),\n targets: [...(defaultTargets ?? [])],\n },\n );\n setError(undefined);\n setConfirmingRun(false);\n }, [open, schedule, defaultTargets]);\n\n const operation = operationByID(operations, input.operationId);\n const schema = operationInputSchema(operation);\n const suggestions =\n operation?.operation[\"x-clicky\"]?.schedule?.suggestions ?? [];\n const destructive =\n operation?.operation[\"x-clicky\"]?.toolHints?.destructiveHint === true;\n const cliCommand = cli?.targetFlag\n ? input.targets\n .map((target) =>\n operationCLICommand(operation, input.args, {\n ...cli,\n globalFlags: { ...cli.globalFlags, [cli.targetFlag!]: target },\n }),\n )\n .join(\"\\n\")\n : operationCLICommand(operation, input.args, cli);\n\n const selectOperation = (operationId: string) => {\n const selected = operationByID(operations, operationId);\n setInput((current) => ({\n ...current,\n operationId,\n args: {},\n name: current.name || operationLabel(selected),\n cron:\n selected?.operation[\"x-clicky\"]?.schedule?.suggestions?.[0]?.cron ??\n current.cron,\n }));\n };\n\n const save = async () => {\n setPending(\"save\");\n setError(undefined);\n try {\n await onSave(input);\n onClose();\n } catch (nextError) {\n setError(nextError);\n } finally {\n setPending(undefined);\n }\n };\n\n const run = async () => {\n setPending(\"run\");\n setError(undefined);\n try {\n await onRunNow({\n operationId: input.operationId,\n args: input.args,\n targets: input.targets,\n });\n setConfirmingRun(false);\n onClose();\n } catch (nextError) {\n setError(nextError);\n setConfirmingRun(false);\n } finally {\n setPending(undefined);\n }\n };\n\n const canSave = Boolean(\n input.name.trim() &&\n input.operationId &&\n input.cron.trim() &&\n input.targets.length,\n );\n const canRun = Boolean(input.operationId && input.targets.length);\n\n return (\n <>\n <Modal\n open={open}\n onClose={onClose}\n title={schedule ? \"Edit schedule\" : \"Add schedule\"}\n size=\"xl\"\n footer={\n <div className=\"flex w-full flex-wrap justify-end gap-2\">\n <Button type=\"button\" variant=\"outline\" onClick={onClose}>\n Cancel\n </Button>\n <Button\n type=\"button\"\n variant={destructive ? \"destructive\" : \"secondary\"}\n disabled={!canRun}\n loading={pending === \"run\"}\n onClick={() => setConfirmingRun(true)}\n >\n Run now\n </Button>\n <Button\n type=\"button\"\n disabled={!canSave}\n loading={pending === \"save\"}\n onClick={save}\n >\n Save schedule\n </Button>\n </div>\n }\n >\n <div className=\"space-y-5\">\n <Field\n label={targetLabel}\n htmlFor=\"operation-schedule-targets\"\n required\n >\n <Combobox\n id=\"operation-schedule-targets\"\n multiple\n variant=\"tags\"\n ariaLabel={targetLabel}\n ariaRequired\n allowCustomValue={false}\n options={targetOptions}\n value={input.targets}\n onChange={(targets) => setInput({ ...input, targets })}\n />\n </Field>\n <Field\n label=\"Schedule name\"\n htmlFor=\"operation-schedule-name\"\n required\n >\n <InputField\n id=\"operation-schedule-name\"\n value={input.name}\n onChange={(name) => setInput({ ...input, name })}\n />\n </Field>\n <OperationPicker\n id=\"operation-schedule-operation\"\n operations={operations}\n value={input.operationId}\n onChange={selectOperation}\n />\n {operation ? (\n schema && Object.keys(schema.properties ?? {}).length > 0 ? (\n <section className=\"space-y-2\">\n <h3 className=\"text-sm font-semibold\">Arguments</h3>\n <JsonSchemaForm\n schema={schema}\n value={input.args}\n onChange={(args) => setInput({ ...input, args })}\n idPrefix=\"operation-schedule-args\"\n showPreferencesMenu={false}\n />\n </section>\n ) : (\n <p className=\"text-sm text-muted-foreground\">\n This operation has no arguments.\n </p>\n )\n ) : null}\n {cliCommand ? (\n <section className=\"space-y-1\">\n <h3 className=\"text-sm font-semibold\">Equivalent CLI command</h3>\n <div className=\"flex items-center gap-2 rounded-md border bg-muted/30 px-3 py-2\">\n <code className=\"min-w-0 flex-1 overflow-x-auto whitespace-pre text-xs\">\n {cliCommand}\n </code>\n <CopyButton value={cliCommand} label=\"Copy CLI command\" />\n </div>\n </section>\n ) : null}\n <ScheduleEditor\n id=\"operation-schedule\"\n value={input}\n onChange={(timing) => setInput({ ...input, ...timing })}\n cronSuggestions={suggestions}\n timezoneSuggestions={[input.timezone, \"UTC\"]}\n />\n {error ? (\n <InlineError title=\"Schedule action failed\" error={error} />\n ) : null}\n </div>\n </Modal>\n <Modal\n open={confirmingRun}\n onClose={() => setConfirmingRun(false)}\n title={`Run ${operationLabel(operation)} now?`}\n size=\"sm\"\n footer={\n <div className=\"flex w-full justify-end gap-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => setConfirmingRun(false)}\n >\n Cancel\n </Button>\n <Button\n type=\"button\"\n variant={destructive ? \"destructive\" : \"default\"}\n loading={pending === \"run\"}\n onClick={run}\n >\n Run now\n </Button>\n </div>\n }\n >\n <p className=\"text-sm text-muted-foreground\">\n This runs the configured operation once without creating or changing a\n recurring schedule.\n </p>\n <p className=\"mt-2 text-sm\">\n {targetLabel}: {input.targets.join(\", \")}\n </p>\n </Modal>\n </>\n );\n}\n"],"names":["_d","_c","_b","_a"],"mappings":"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"}
|
|
@@ -19,7 +19,10 @@ function OperationSchedules(_props) {
|
|
|
19
19
|
onDelete,
|
|
20
20
|
onRunSaved,
|
|
21
21
|
onRunDraft,
|
|
22
|
-
cli
|
|
22
|
+
cli,
|
|
23
|
+
targetOptions,
|
|
24
|
+
defaultTargets,
|
|
25
|
+
targetLabel
|
|
23
26
|
} = _props;
|
|
24
27
|
const [dialogOpen, setDialogOpen] = react.useState(false);
|
|
25
28
|
const [editing, setEditing] = react.useState();
|
|
@@ -81,6 +84,7 @@ function OperationSchedules(_props) {
|
|
|
81
84
|
children: [
|
|
82
85
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0", children: [
|
|
83
86
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "truncate font-semibold", children: schedule.name }),
|
|
87
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "text-xs text-muted-foreground", children: schedule.targets.join(", ") }),
|
|
84
88
|
/* @__PURE__ */ jsxRuntime.jsx("div", { className: "truncate text-xs text-muted-foreground", children: operationScheduleModel.operationLabel(operation) })
|
|
85
89
|
] }),
|
|
86
90
|
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: "min-w-0 text-sm", children: [
|
|
@@ -142,6 +146,9 @@ function OperationSchedules(_props) {
|
|
|
142
146
|
{
|
|
143
147
|
open: dialogOpen,
|
|
144
148
|
operations,
|
|
149
|
+
targetOptions,
|
|
150
|
+
...defaultTargets ? { defaultTargets } : {},
|
|
151
|
+
...targetLabel ? { targetLabel } : {},
|
|
145
152
|
...editing ? { schedule: editing } : {},
|
|
146
153
|
onClose: () => setDialogOpen(false),
|
|
147
154
|
onSave: (input) => editing ? onUpdate(editing.id, input) : onCreate(input),
|
|
@@ -176,7 +183,10 @@ function OperationSchedules(_props) {
|
|
|
176
183
|
}
|
|
177
184
|
)
|
|
178
185
|
] }),
|
|
179
|
-
children: /* @__PURE__ */ jsxRuntime.
|
|
186
|
+
children: /* @__PURE__ */ jsxRuntime.jsxs("p", { className: "text-sm text-muted-foreground", children: [
|
|
187
|
+
"The recurring schedule is unchanged.",
|
|
188
|
+
confirmRun ? ` Targets: ${confirmRun.targets.join(", ")}.` : ""
|
|
189
|
+
] })
|
|
180
190
|
}
|
|
181
191
|
),
|
|
182
192
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OperationSchedules.cjs","sources":["../../src/rpc/OperationSchedules.tsx"],"sourcesContent":["import { useState } from \"react\";\nimport { Button } from \"../components/button\";\nimport { Loading } from \"../components/loading\";\nimport { Modal } from \"../overlay/Modal\";\nimport {\n formatScheduleTimestamp,\n operationByID,\n operationLabel,\n} from \"./operation-schedule-model\";\nimport type { OperationSchedule } from \"./operation-schedule-types\";\nimport type { OperationSchedulesProps } from \"./operation-schedule-types\";\nimport { OperationScheduleDialog } from \"./OperationScheduleDialog\";\nimport { InlineError } from \"./InlineError\";\n\nexport function OperationSchedules(_props: OperationSchedulesProps) {\n const {\n operations,\n schedules,\n disabled,\n loading,\n onCreate,\n onUpdate,\n onDelete,\n onRunSaved,\n onRunDraft,\n cli,\n } = _props;\n const [dialogOpen, setDialogOpen] = useState(false);\n const [editing, setEditing] = useState<OperationSchedule>();\n const [confirmRun, setConfirmRun] = useState<OperationSchedule>();\n const [confirmDelete, setConfirmDelete] = useState<OperationSchedule>();\n const [pending, setPending] = useState<\"run\" | \"delete\">();\n const [error, setError] = useState<unknown>();\n\n const openAdd = () => {\n setEditing(undefined);\n setDialogOpen(true);\n };\n const openEdit = (schedule: OperationSchedule) => {\n setEditing(schedule);\n setDialogOpen(true);\n };\n\n const runSaved = async () => {\n if (!confirmRun) return;\n setPending(\"run\");\n setError(undefined);\n try {\n await onRunSaved(confirmRun.id);\n setConfirmRun(undefined);\n } catch (nextError) {\n setError(nextError);\n } finally {\n setPending(undefined);\n }\n };\n\n const deleteSaved = async () => {\n if (!confirmDelete) return;\n setPending(\"delete\");\n setError(undefined);\n try {\n await onDelete(confirmDelete.id);\n setConfirmDelete(undefined);\n } catch (nextError) {\n setError(nextError);\n } finally {\n setPending(undefined);\n }\n };\n\n if (loading) return <Loading variant=\"centered\" label=\"Loading schedules…\" />;\n\n return (\n <div className=\"space-y-3\">\n <div className=\"flex justify-end\">\n <Button type=\"button\" disabled={disabled} onClick={openAdd}>\n Add schedule\n </Button>\n </div>\n {error ? (\n <InlineError title=\"Schedule action failed\" error={error} />\n ) : null}\n {schedules.length === 0 ? (\n <div className=\"rounded-lg border border-dashed px-4 py-8 text-center text-sm text-muted-foreground\">\n No schedules yet. Add one to run an operation automatically.\n </div>\n ) : (\n <div\n role=\"list\"\n aria-label=\"Schedules\"\n className=\"divide-y rounded-lg border bg-card\"\n >\n {schedules.map((schedule) => {\n const operation = operationByID(operations, schedule.operationId);\n return (\n <div\n key={schedule.id}\n role=\"listitem\"\n className=\"grid gap-3 px-4 py-3 lg:grid-cols-[minmax(12rem,1.1fr)_minmax(12rem,1fr)_minmax(14rem,1fr)_auto] lg:items-center\"\n >\n <div className=\"min-w-0\">\n <div className=\"truncate font-semibold\">{schedule.name}</div>\n <div className=\"truncate text-xs text-muted-foreground\">\n {operationLabel(operation)}\n </div>\n </div>\n <div className=\"min-w-0 text-sm\">\n <code>{schedule.cron}</code>\n <div className=\"text-xs text-muted-foreground\">\n {schedule.timezone}\n </div>\n </div>\n <div className=\"text-xs text-muted-foreground\">\n <div>\n {schedule.enabled\n ? `Next: ${formatScheduleTimestamp(schedule.nextRun)}`\n : \"Paused\"}\n </div>\n {schedule.lastRun ? (\n <div>Last: {formatScheduleTimestamp(schedule.lastRun)}</div>\n ) : null}\n </div>\n <div className=\"flex flex-wrap justify-end gap-2\">\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n disabled={disabled}\n aria-label={`Run ${schedule.name} now`}\n onClick={() => setConfirmRun(schedule)}\n >\n Run now\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n disabled={disabled}\n onClick={() => openEdit(schedule)}\n >\n Edit\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n disabled={disabled}\n onClick={() => setConfirmDelete(schedule)}\n >\n Delete\n </Button>\n </div>\n </div>\n );\n })}\n </div>\n )}\n <OperationScheduleDialog\n open={dialogOpen}\n operations={operations}\n {...(editing ? { schedule: editing } : {})}\n onClose={() => setDialogOpen(false)}\n onSave={(input) =>\n editing ? onUpdate(editing.id, input) : onCreate(input)\n }\n onRunNow={onRunDraft}\n {...(cli ? { cli } : {})}\n />\n <Modal\n open={Boolean(confirmRun)}\n onClose={() => setConfirmRun(undefined)}\n title={confirmRun ? `Run ${confirmRun.name} now?` : \"Run schedule now?\"}\n size=\"sm\"\n footer={\n <div className=\"flex w-full justify-end gap-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => setConfirmRun(undefined)}\n >\n Cancel\n </Button>\n <Button\n type=\"button\"\n loading={pending === \"run\"}\n onClick={runSaved}\n >\n Run now\n </Button>\n </div>\n }\n >\n <p className=\"text-sm text-muted-foreground\">\n The recurring schedule is unchanged.\n </p>\n </Modal>\n <Modal\n open={Boolean(confirmDelete)}\n onClose={() => setConfirmDelete(undefined)}\n title={\n confirmDelete ? `Delete ${confirmDelete.name}?` : \"Delete schedule?\"\n }\n size=\"sm\"\n footer={\n <div className=\"flex w-full justify-end gap-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => setConfirmDelete(undefined)}\n >\n Cancel\n </Button>\n <Button\n type=\"button\"\n variant=\"destructive\"\n loading={pending === \"delete\"}\n onClick={deleteSaved}\n >\n Delete schedule\n </Button>\n </div>\n }\n >\n <p className=\"text-sm text-muted-foreground\">\n This removes the recurring definition. Previous run history is\n retained.\n </p>\n </Modal>\n </div>\n );\n}\n"],"names":["loading","useState","jsx","Loading","jsxs","Button","InlineError","operationByID","operationLabel","formatScheduleTimestamp","OperationScheduleDialog","Modal"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"OperationSchedules.cjs","sources":["../../src/rpc/OperationSchedules.tsx"],"sourcesContent":["import { useState } from \"react\";\nimport { Button } from \"../components/button\";\nimport { Loading } from \"../components/loading\";\nimport { Modal } from \"../overlay/Modal\";\nimport {\n formatScheduleTimestamp,\n operationByID,\n operationLabel,\n} from \"./operation-schedule-model\";\nimport type { OperationSchedule } from \"./operation-schedule-types\";\nimport type { OperationSchedulesProps } from \"./operation-schedule-types\";\nimport { OperationScheduleDialog } from \"./OperationScheduleDialog\";\nimport { InlineError } from \"./InlineError\";\n\nexport function OperationSchedules(_props: OperationSchedulesProps) {\n const {\n operations,\n schedules,\n disabled,\n loading,\n onCreate,\n onUpdate,\n onDelete,\n onRunSaved,\n onRunDraft,\n cli,\n targetOptions,\n defaultTargets,\n targetLabel,\n } = _props;\n const [dialogOpen, setDialogOpen] = useState(false);\n const [editing, setEditing] = useState<OperationSchedule>();\n const [confirmRun, setConfirmRun] = useState<OperationSchedule>();\n const [confirmDelete, setConfirmDelete] = useState<OperationSchedule>();\n const [pending, setPending] = useState<\"run\" | \"delete\">();\n const [error, setError] = useState<unknown>();\n\n const openAdd = () => {\n setEditing(undefined);\n setDialogOpen(true);\n };\n const openEdit = (schedule: OperationSchedule) => {\n setEditing(schedule);\n setDialogOpen(true);\n };\n\n const runSaved = async () => {\n if (!confirmRun) return;\n setPending(\"run\");\n setError(undefined);\n try {\n await onRunSaved(confirmRun.id);\n setConfirmRun(undefined);\n } catch (nextError) {\n setError(nextError);\n } finally {\n setPending(undefined);\n }\n };\n\n const deleteSaved = async () => {\n if (!confirmDelete) return;\n setPending(\"delete\");\n setError(undefined);\n try {\n await onDelete(confirmDelete.id);\n setConfirmDelete(undefined);\n } catch (nextError) {\n setError(nextError);\n } finally {\n setPending(undefined);\n }\n };\n\n if (loading) return <Loading variant=\"centered\" label=\"Loading schedules…\" />;\n\n return (\n <div className=\"space-y-3\">\n <div className=\"flex justify-end\">\n <Button type=\"button\" disabled={disabled} onClick={openAdd}>\n Add schedule\n </Button>\n </div>\n {error ? (\n <InlineError title=\"Schedule action failed\" error={error} />\n ) : null}\n {schedules.length === 0 ? (\n <div className=\"rounded-lg border border-dashed px-4 py-8 text-center text-sm text-muted-foreground\">\n No schedules yet. Add one to run an operation automatically.\n </div>\n ) : (\n <div\n role=\"list\"\n aria-label=\"Schedules\"\n className=\"divide-y rounded-lg border bg-card\"\n >\n {schedules.map((schedule) => {\n const operation = operationByID(operations, schedule.operationId);\n return (\n <div\n key={schedule.id}\n role=\"listitem\"\n className=\"grid gap-3 px-4 py-3 lg:grid-cols-[minmax(12rem,1.1fr)_minmax(12rem,1fr)_minmax(14rem,1fr)_auto] lg:items-center\"\n >\n <div className=\"min-w-0\">\n <div className=\"truncate font-semibold\">{schedule.name}</div>\n <div className=\"text-xs text-muted-foreground\">{schedule.targets.join(\", \")}</div>\n <div className=\"truncate text-xs text-muted-foreground\">\n {operationLabel(operation)}\n </div>\n </div>\n <div className=\"min-w-0 text-sm\">\n <code>{schedule.cron}</code>\n <div className=\"text-xs text-muted-foreground\">\n {schedule.timezone}\n </div>\n </div>\n <div className=\"text-xs text-muted-foreground\">\n <div>\n {schedule.enabled\n ? `Next: ${formatScheduleTimestamp(schedule.nextRun)}`\n : \"Paused\"}\n </div>\n {schedule.lastRun ? (\n <div>Last: {formatScheduleTimestamp(schedule.lastRun)}</div>\n ) : null}\n </div>\n <div className=\"flex flex-wrap justify-end gap-2\">\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n disabled={disabled}\n aria-label={`Run ${schedule.name} now`}\n onClick={() => setConfirmRun(schedule)}\n >\n Run now\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"outline\"\n disabled={disabled}\n onClick={() => openEdit(schedule)}\n >\n Edit\n </Button>\n <Button\n type=\"button\"\n size=\"sm\"\n variant=\"ghost\"\n disabled={disabled}\n onClick={() => setConfirmDelete(schedule)}\n >\n Delete\n </Button>\n </div>\n </div>\n );\n })}\n </div>\n )}\n <OperationScheduleDialog\n open={dialogOpen}\n operations={operations}\n targetOptions={targetOptions}\n {...(defaultTargets ? { defaultTargets } : {})}\n {...(targetLabel ? { targetLabel } : {})}\n {...(editing ? { schedule: editing } : {})}\n onClose={() => setDialogOpen(false)}\n onSave={(input) =>\n editing ? onUpdate(editing.id, input) : onCreate(input)\n }\n onRunNow={onRunDraft}\n {...(cli ? { cli } : {})}\n />\n <Modal\n open={Boolean(confirmRun)}\n onClose={() => setConfirmRun(undefined)}\n title={confirmRun ? `Run ${confirmRun.name} now?` : \"Run schedule now?\"}\n size=\"sm\"\n footer={\n <div className=\"flex w-full justify-end gap-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => setConfirmRun(undefined)}\n >\n Cancel\n </Button>\n <Button\n type=\"button\"\n loading={pending === \"run\"}\n onClick={runSaved}\n >\n Run now\n </Button>\n </div>\n }\n >\n <p className=\"text-sm text-muted-foreground\">\n The recurring schedule is unchanged.\n {confirmRun ? ` Targets: ${confirmRun.targets.join(\", \")}.` : \"\"}\n </p>\n </Modal>\n <Modal\n open={Boolean(confirmDelete)}\n onClose={() => setConfirmDelete(undefined)}\n title={\n confirmDelete ? `Delete ${confirmDelete.name}?` : \"Delete schedule?\"\n }\n size=\"sm\"\n footer={\n <div className=\"flex w-full justify-end gap-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n onClick={() => setConfirmDelete(undefined)}\n >\n Cancel\n </Button>\n <Button\n type=\"button\"\n variant=\"destructive\"\n loading={pending === \"delete\"}\n onClick={deleteSaved}\n >\n Delete schedule\n </Button>\n </div>\n }\n >\n <p className=\"text-sm text-muted-foreground\">\n This removes the recurring definition. Previous run history is\n retained.\n </p>\n </Modal>\n </div>\n );\n}\n"],"names":["loading","useState","jsx","Loading","jsxs","Button","InlineError","operationByID","operationLabel","formatScheduleTimestamp","OperationScheduleDialog","Modal"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OperationSchedules.d.ts","sourceRoot":"","sources":["../../src/rpc/OperationSchedules.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAI1E,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,uBAAuB,+
|
|
1
|
+
{"version":3,"file":"OperationSchedules.d.ts","sourceRoot":"","sources":["../../src/rpc/OperationSchedules.tsx"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,4BAA4B,CAAC;AAI1E,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,uBAAuB,+BAiOjE"}
|
|
@@ -17,7 +17,10 @@ function OperationSchedules(_props) {
|
|
|
17
17
|
onDelete,
|
|
18
18
|
onRunSaved,
|
|
19
19
|
onRunDraft,
|
|
20
|
-
cli
|
|
20
|
+
cli,
|
|
21
|
+
targetOptions,
|
|
22
|
+
defaultTargets,
|
|
23
|
+
targetLabel
|
|
21
24
|
} = _props;
|
|
22
25
|
const [dialogOpen, setDialogOpen] = useState(false);
|
|
23
26
|
const [editing, setEditing] = useState();
|
|
@@ -79,6 +82,7 @@ function OperationSchedules(_props) {
|
|
|
79
82
|
children: [
|
|
80
83
|
/* @__PURE__ */ jsxs("div", { className: "min-w-0", children: [
|
|
81
84
|
/* @__PURE__ */ jsx("div", { className: "truncate font-semibold", children: schedule.name }),
|
|
85
|
+
/* @__PURE__ */ jsx("div", { className: "text-xs text-muted-foreground", children: schedule.targets.join(", ") }),
|
|
82
86
|
/* @__PURE__ */ jsx("div", { className: "truncate text-xs text-muted-foreground", children: operationLabel(operation) })
|
|
83
87
|
] }),
|
|
84
88
|
/* @__PURE__ */ jsxs("div", { className: "min-w-0 text-sm", children: [
|
|
@@ -140,6 +144,9 @@ function OperationSchedules(_props) {
|
|
|
140
144
|
{
|
|
141
145
|
open: dialogOpen,
|
|
142
146
|
operations,
|
|
147
|
+
targetOptions,
|
|
148
|
+
...defaultTargets ? { defaultTargets } : {},
|
|
149
|
+
...targetLabel ? { targetLabel } : {},
|
|
143
150
|
...editing ? { schedule: editing } : {},
|
|
144
151
|
onClose: () => setDialogOpen(false),
|
|
145
152
|
onSave: (input) => editing ? onUpdate(editing.id, input) : onCreate(input),
|
|
@@ -174,7 +181,10 @@ function OperationSchedules(_props) {
|
|
|
174
181
|
}
|
|
175
182
|
)
|
|
176
183
|
] }),
|
|
177
|
-
children: /* @__PURE__ */
|
|
184
|
+
children: /* @__PURE__ */ jsxs("p", { className: "text-sm text-muted-foreground", children: [
|
|
185
|
+
"The recurring schedule is unchanged.",
|
|
186
|
+
confirmRun ? ` Targets: ${confirmRun.targets.join(", ")}.` : ""
|
|
187
|
+
] })
|
|
178
188
|
}
|
|
179
189
|
),
|
|
180
190
|
/* @__PURE__ */ jsx(
|