Skip to content

Conversation

@viva-jinyi
Copy link
Member

@viva-jinyi viva-jinyi commented Nov 23, 2025

Summary

  • Added showSmallDialog helper function to dialogService for reusable small dialog styling
  • Extracted showLoadWorkflowWarning and showNodeConflictDialog into independent composables
    • useMissingNodesDialog
    • useNodeConflictDialog
  • This is foundational work for also displaying MissingModels warning in a small modal

Changes

  • dialogService.ts: Added showSmallDialog helper, removed migrated functions
  • useMissingNodesDialog.ts: New composable for Missing Nodes dialog
  • useNodeConflictDialog.ts: New composable for Node Conflict dialog
  • Migrated existing usages to the new composable pattern

🤖 Generated with Claude Code

@dosubot dosubot bot added the size:L This PR changes 100-499 lines, ignoring generated files. label Nov 23, 2025
@coderabbitai
Copy link

coderabbitai bot commented Nov 23, 2025

📝 Walkthrough

Walkthrough

Replaces specific dialog functions with a generic showSmallDialog, adds two dialog composables (useNodeConflictDialog, useMissingNodesDialog), updates components/scripts to call the new composables, and adjusts NodeConflict dialog UI and tests.

Changes

Cohort / File(s) Summary
Dialog service refactor
src/services/dialogService.ts
Removed showLoadWorkflowWarning and showNodeConflictDialog; added generic showSmallDialog<T> (and kept showLayoutDialog).
Dialog store behavior
src/stores/dialogStore.ts
showDialog(options) now reuses or recreates dialogs by key and returns the dialog instance (return type changed to DialogInstance).
New dialog composables
src/composables/useNodeConflictDialog.ts, src/composables/useMissingNodesDialog.ts
Added useNodeConflictDialog() and useMissingNodesDialog() exposing { show, hide }; each assembles components/props and calls dialogService.showSmallDialog with a constant dialog key.
Components & scripts updated to use composables
src/components/sidebar/SidebarHelpCenterIcon.vue, src/workbench/extensions/manager/components/manager/button/PackEnableToggle.vue, src/workbench/extensions/manager/components/manager/button/PackInstallButton.vue, src/scripts/app.ts
Replaced useDialogService() usage with the new composables; updated destructuring from previous API shapes to patterns like { show: showNodeConflictDialog } or { show }.
Node conflict content & header UI
src/workbench/extensions/manager/components/manager/NodeConflictDialogContent.vue, src/workbench/extensions/manager/components/manager/NodeConflictHeader.vue
Content: switched bg classes to bg-secondary-background, gated conflict list with v-if="allConflictDetails.length > 0", added hover row styling, removed scoped hover CSS. Header: adjusted padding/height, replaced icon with Lucide triangle-alert, and updated title styling.
Tests updated
tests-ui/tests/components/dialog/content/manager/NodeConflictDialogContent.test.ts
Switched to data-testid selectors, asserted conditional rendering of Conflicts section, and updated panel/toggle/content assertions to match new structure.

Sequence Diagram(s)

sequenceDiagram
  autonumber
  participant Component as Component (e.g., PackInstallButton)
  participant Composable as useNodeConflictDialog / useMissingNodesDialog
  participant DialogService as dialogService.showSmallDialog
  participant DialogStore as dialogStore

  Component->>Composable: call show(...) (aliased showNodeConflictDialog or show)
  Note right of Composable: assemble DIALOG_KEY, header/footer/content components and props
  Composable->>DialogService: showSmallDialog({ key, component, headerComponent, footerComponent, props, dialogComponentProps })
  DialogService->>DialogStore: showDialog({ key, ...mergedOptions })
  DialogStore-->>DialogService: return DialogInstance
  DialogService-->>Composable: return dialog handle / promise
  Composable-->>Component: resolved dialog handle
Loading
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch feature/small-dialog

Comment @coderabbitai help to get the list of available commands and usage tips.

@github-actions
Copy link

github-actions bot commented Nov 23, 2025

🎨 Storybook Build Status

Build completed successfully!

⏰ Completed at: 11/27/2025, 01:06:36 PM UTC

🔗 Links


🎉 Your Storybook is ready for review!

@github-actions
Copy link

github-actions bot commented Nov 23, 2025

🎭 Playwright Test Results

⚠️ Tests passed with flaky tests

⏰ Completed at: 11/27/2025, 01:14:58 PM UTC

📈 Summary

  • Total Tests: 495
  • Passed: 483 ✅
  • Failed: 0
  • Flaky: 3 ⚠️
  • Skipped: 9 ⏭️

📊 Test Reports by Browser

  • chromium: View Report • ✅ 474 / ❌ 0 / ⚠️ 3 / ⏭️ 9
  • chromium-2x: View Report • ✅ 2 / ❌ 0 / ⚠️ 0 / ⏭️ 0
  • chromium-0.5x: View Report • ✅ 1 / ❌ 0 / ⚠️ 0 / ⏭️ 0
  • mobile-chrome: View Report • ✅ 6 / ❌ 0 / ⚠️ 0 / ⏭️ 0

🎉 Click on the links above to view detailed test results for each browser configuration.

@viva-jinyi viva-jinyi changed the title [refactor] Dialog composables 분리 및 showSmallDialog 헬퍼 추가 [refactor] Extract dialog composables and add showSmallDialog helper Nov 23, 2025
@github-actions
Copy link

github-actions bot commented Nov 23, 2025

Bundle Size Report

Summary

  • Raw size: 17 MB baseline 17 MB — 🔴 +869 B
  • Gzip: 3.37 MB baseline 3.37 MB — 🔴 +1.18 kB
  • Brotli: 2.58 MB baseline 2.58 MB — 🔴 +139 B
  • Bundles: 93 current • 93 baseline • 52 added / 52 removed

Category Glance
App Entry Points 🔴 +832 B (3.18 MB) · Graph Workspace 🔴 +40 B (948 kB) · Vendor & Third-Party 🟢 -3 B (8.56 MB) · Other ⚪ 0 B (3.84 MB) · Panels & Settings ⚪ 0 B (298 kB) · UI Components ⚪ 0 B (139 kB) · + 3 more

Per-category breakdown
App Entry Points — 3.18 MB (baseline 3.18 MB) • 🔴 +832 B

Main entry bundles and manifests

File Before After Δ Raw Δ Gzip Δ Brotli
assets/index-CqZryA6D.js (new) 2.95 MB 🔴 +2.95 MB 🔴 +616 kB 🔴 +467 kB
assets/index-C-pwKqT8.js (removed) 2.95 MB 🟢 -2.95 MB 🟢 -615 kB 🟢 -467 kB
assets/index-BYaQDulQ.js (new) 227 kB 🔴 +227 kB 🔴 +48.6 kB 🔴 +40 kB
assets/index-D5dNVKUd.js (removed) 227 kB 🟢 -227 kB 🟢 -48.6 kB 🟢 -40 kB
assets/index-1OA9mb6L.js (removed) 345 B 🟢 -345 B 🟢 -246 B 🟢 -233 B
assets/index-CbkoC0HB.js (new) 345 B 🔴 +345 B 🔴 +246 B 🔴 +234 B

Status: 3 added / 3 removed

Graph Workspace — 948 kB (baseline 948 kB) • 🔴 +40 B

Graph editor runtime, canvas, workflow orchestration

File Before After Δ Raw Δ Gzip Δ Brotli
assets/GraphView-B3zZUywU.js (new) 948 kB 🔴 +948 kB 🔴 +184 kB 🔴 +140 kB
assets/GraphView-BcI_bDFR.js (removed) 948 kB 🟢 -948 kB 🟢 -184 kB 🟢 -140 kB

Status: 1 added / 1 removed

Views & Navigation — 6.54 kB (baseline 6.54 kB) • ⚪ 0 B

Top-level views, pages, and routed surfaces

File Before After Δ Raw Δ Gzip Δ Brotli
assets/UserSelectView-b2-zZf_n.js (removed) 6.54 kB 🟢 -6.54 kB 🟢 -2.14 kB 🟢 -1.9 kB
assets/UserSelectView-BMSR8DpW.js (new) 6.54 kB 🔴 +6.54 kB 🔴 +2.14 kB 🔴 +1.9 kB

Status: 1 added / 1 removed

Panels & Settings — 298 kB (baseline 298 kB) • ⚪ 0 B

Configuration panels, inspectors, and settings screens

File Before After Δ Raw Δ Gzip Δ Brotli
assets/CreditsPanel-DChj3j8s.js (removed) 21.4 kB 🟢 -21.4 kB 🟢 -5.15 kB 🟢 -4.5 kB
assets/CreditsPanel-Z3yze9xX.js (new) 21.4 kB 🔴 +21.4 kB 🔴 +5.15 kB 🔴 +4.5 kB
assets/KeybindingPanel-B1ZHI3f4.js (new) 13.6 kB 🔴 +13.6 kB 🔴 +3.42 kB 🔴 +3.03 kB
assets/KeybindingPanel-B7A51x8n.js (removed) 13.6 kB 🟢 -13.6 kB 🟢 -3.42 kB 🟢 -3.02 kB
assets/ExtensionPanel-B-AN_COE.js (removed) 10.8 kB 🟢 -10.8 kB 🟢 -2.57 kB 🟢 -2.25 kB
assets/ExtensionPanel-CjiTkT4o.js (new) 10.8 kB 🔴 +10.8 kB 🔴 +2.58 kB 🔴 +2.25 kB
assets/AboutPanel-B5HxlK-3.js (new) 9.16 kB 🔴 +9.16 kB 🔴 +2.47 kB 🔴 +2.22 kB
assets/AboutPanel-BUqXiOax.js (removed) 9.16 kB 🟢 -9.16 kB 🟢 -2.46 kB 🟢 -2.21 kB
assets/ServerConfigPanel-Ch_CHclj.js (removed) 6.56 kB 🟢 -6.56 kB 🟢 -1.83 kB 🟢 -1.62 kB
assets/ServerConfigPanel-DBkytCMW.js (new) 6.56 kB 🔴 +6.56 kB 🔴 +1.83 kB 🔴 +1.63 kB
assets/UserPanel-low54n9P.js (removed) 6.23 kB 🟢 -6.23 kB 🟢 -1.72 kB 🟢 -1.5 kB
assets/UserPanel-uXVJClS8.js (new) 6.23 kB 🔴 +6.23 kB 🔴 +1.72 kB 🔴 +1.51 kB
assets/settings-BXTtSH4O.js 33.3 kB 33.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-C9Pzn-NG.js 25.2 kB 25.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CCy2fA_h.js 27.3 kB 27.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-CQpqEFfl.js 26.6 kB 26.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DHcnxypw.js 21.7 kB 21.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DhFTK9fY.js 25.1 kB 25.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DlT4t_ui.js 25.9 kB 25.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-DRgSrIdD.js 24.2 kB 24.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/settings-tjkeqiZq.js 21.1 kB 21.1 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 6 added / 6 removed

UI Components — 139 kB (baseline 139 kB) • ⚪ 0 B

Reusable component library chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/Load3D.vue_vue_type_script_setup_true_lang-BV5VuWJV.js (new) 53.9 kB 🔴 +53.9 kB 🔴 +8.52 kB 🔴 +7.32 kB
assets/Load3D.vue_vue_type_script_setup_true_lang-BvYtyg__.js (removed) 53.9 kB 🟢 -53.9 kB 🟢 -8.52 kB 🟢 -7.32 kB
assets/WidgetSelect.vue_vue_type_script_setup_true_lang-BiBGmeSi.js (removed) 46.9 kB 🟢 -46.9 kB 🟢 -10.1 kB 🟢 -8.77 kB
assets/WidgetSelect.vue_vue_type_script_setup_true_lang-D2yQhWmB.js (new) 46.9 kB 🔴 +46.9 kB 🔴 +10.1 kB 🔴 +8.76 kB
assets/WidgetInputNumber.vue_vue_type_script_setup_true_lang-B95ZHhGo.js (removed) 12.8 kB 🟢 -12.8 kB 🟢 -3.35 kB 🟢 -2.96 kB
assets/WidgetInputNumber.vue_vue_type_script_setup_true_lang-C7Z2Kdu1.js (new) 12.8 kB 🔴 +12.8 kB 🔴 +3.35 kB 🔴 +2.95 kB
assets/LazyImage.vue_vue_type_script_setup_true_lang-DMS5WHZd.js (new) 10.8 kB 🔴 +10.8 kB 🔴 +2.98 kB 🔴 +2.6 kB
assets/LazyImage.vue_vue_type_script_setup_true_lang-Pm3jgX4e.js (removed) 10.8 kB 🟢 -10.8 kB 🟢 -2.97 kB 🟢 -2.59 kB
assets/ComfyQueueButton-C4fGeQbJ.js (removed) 8.44 kB 🟢 -8.44 kB 🟢 -2.48 kB 🟢 -2.21 kB
assets/ComfyQueueButton-D84a5Aim.js (new) 8.44 kB 🔴 +8.44 kB 🔴 +2.48 kB 🔴 +2.21 kB
assets/WidgetButton-CsMa_P26.js (removed) 2.04 kB 🟢 -2.04 kB 🟢 -928 B 🟢 -810 B
assets/WidgetButton-SmPAhDYr.js (new) 2.04 kB 🔴 +2.04 kB 🔴 +930 B 🔴 +808 B
assets/WidgetLayoutField.vue_vue_type_script_setup_true_lang-Cf8dNyi2.js (removed) 2 kB 🟢 -2 kB 🟢 -768 B 🟢 -677 B
assets/WidgetLayoutField.vue_vue_type_script_setup_true_lang-DkIWto19.js (new) 2 kB 🔴 +2 kB 🔴 +773 B 🔴 +671 B
assets/UserAvatar.vue_vue_type_script_setup_true_lang-2bDSGRRr.js (new) 1.34 kB 🔴 +1.34 kB 🔴 +689 B 🔴 +595 B
assets/UserAvatar.vue_vue_type_script_setup_true_lang-Bs-EIQeq.js (removed) 1.34 kB 🟢 -1.34 kB 🟢 -686 B 🟢 -593 B
assets/MediaTitle.vue_vue_type_script_setup_true_lang-B2_OTB96.js (new) 897 B 🔴 +897 B 🔴 +504 B 🔴 +463 B
assets/MediaTitle.vue_vue_type_script_setup_true_lang-qLYLZPN5.js (removed) 897 B 🟢 -897 B 🟢 -505 B 🟢 -438 B

Status: 9 added / 9 removed

Data & Services — 12.5 kB (baseline 12.5 kB) • ⚪ 0 B

Stores, services, APIs, and repositories

File Before After Δ Raw Δ Gzip Δ Brotli
assets/keybindingService-Bml2BUAO.js (removed) 7.51 kB 🟢 -7.51 kB 🟢 -1.84 kB 🟢 -1.58 kB
assets/keybindingService-Dr5HoKkq.js (new) 7.51 kB 🔴 +7.51 kB 🔴 +1.84 kB 🔴 +1.58 kB
assets/serverConfigStore-B5NW8oSr.js (removed) 2.83 kB 🟢 -2.83 kB 🟢 -910 B 🟢 -789 B
assets/serverConfigStore-CfPuAhhR.js (new) 2.83 kB 🔴 +2.83 kB 🔴 +906 B 🔴 +793 B
assets/audioService-CGR_Pnzl.js (new) 2.2 kB 🔴 +2.2 kB 🔴 +961 B 🔴 +823 B
assets/audioService-DMHf0crI.js (removed) 2.2 kB 🟢 -2.2 kB 🟢 -960 B 🟢 -825 B

Status: 3 added / 3 removed

Utilities & Hooks — 2.94 kB (baseline 2.94 kB) • ⚪ 0 B

Helpers, composables, and utility bundles

File Before After Δ Raw Δ Gzip Δ Brotli
assets/audioUtils-B_R0ChlR.js (new) 1.41 kB 🔴 +1.41 kB 🔴 +650 B 🔴 +551 B
assets/audioUtils-Hn-WnSb1.js (removed) 1.41 kB 🟢 -1.41 kB 🟢 -651 B 🟢 -550 B
assets/mathUtil-CTARWQ-l.js 1.07 kB 1.07 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeFilterUtil-CXKCRJ-m.js 460 B 460 B ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 1 added / 1 removed

Vendor & Third-Party — 8.56 MB (baseline 8.56 MB) • 🟢 -3 B

External libraries and shared vendor chunks

File Before After Δ Raw Δ Gzip Δ Brotli
assets/vendor-other-DisjWJFj.js (removed) 3.98 MB 🟢 -3.98 MB 🟢 -843 kB 🟢 -673 kB
assets/vendor-other-CkMYmSoh.js (new) 3.98 MB 🔴 +3.98 MB 🔴 +844 kB 🔴 +673 kB
assets/vendor-primevue-jKszDxqW.js (new) 1.96 MB 🔴 +1.96 MB 🔴 +336 kB 🔴 +202 kB
assets/vendor-primevue-LncEKxae.js (removed) 1.96 MB 🟢 -1.96 MB 🟢 -336 kB 🟢 -202 kB
assets/vendor-chart-BPgPZrsW.js (new) 452 kB 🔴 +452 kB 🔴 +99.1 kB 🔴 +81 kB
assets/vendor-chart-uhYFfslB.js (removed) 452 kB 🟢 -452 kB 🟢 -99.1 kB 🟢 -81 kB
assets/vendor-tiptap-B4G2CCYJ.js (new) 232 kB 🔴 +232 kB 🔴 +45.7 kB 🔴 +37.7 kB
assets/vendor-tiptap-C4yk8cCR.js (removed) 232 kB 🟢 -232 kB 🟢 -45.7 kB 🟢 -37.7 kB
assets/vendor-vue-DUqDe5JM.js (new) 160 kB 🔴 +160 kB 🔴 +37.3 kB 🔴 +31.6 kB
assets/vendor-vue-tw3tq7KH.js (removed) 160 kB 🟢 -160 kB 🟢 -37.3 kB 🟢 -31.5 kB
assets/vendor-three-aR6ntw5X.js 1.37 MB 1.37 MB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/vendor-xterm-BZLod3g9.js 407 kB 407 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 5 added / 5 removed

Other — 3.84 MB (baseline 3.84 MB) • ⚪ 0 B

Bundles that do not match a named category

File Before After Δ Raw Δ Gzip Δ Brotli
assets/WidgetRecordAudio-CONCF3cZ.js (new) 20.4 kB 🔴 +20.4 kB 🔴 +5.24 kB 🔴 +4.64 kB
assets/WidgetRecordAudio-DhErcMj1.js (removed) 20.4 kB 🟢 -20.4 kB 🟢 -5.23 kB 🟢 -4.63 kB
assets/AudioPreviewPlayer-CMsxc32-.js (removed) 13.5 kB 🟢 -13.5 kB 🟢 -3.4 kB 🟢 -3.04 kB
assets/AudioPreviewPlayer-z6y6F_l-.js (new) 13.5 kB 🔴 +13.5 kB 🔴 +3.4 kB 🔴 +3.04 kB
assets/WidgetGalleria-B12Q6xrZ.js (removed) 4.1 kB 🟢 -4.1 kB 🟢 -1.45 kB 🟢 -1.3 kB
assets/WidgetGalleria-Dvia7pA-.js (new) 4.1 kB 🔴 +4.1 kB 🔴 +1.45 kB 🔴 +1.31 kB
assets/WidgetColorPicker-BtjO1iY4.js (new) 3.41 kB 🔴 +3.41 kB 🔴 +1.38 kB 🔴 +1.23 kB
assets/WidgetColorPicker-CLzDyOET.js (removed) 3.41 kB 🟢 -3.41 kB 🟢 -1.38 kB 🟢 -1.23 kB
assets/WidgetMarkdown-BYwhDYmk.js (new) 3.1 kB 🔴 +3.1 kB 🔴 +1.29 kB 🔴 +1.13 kB
assets/WidgetMarkdown-Kuq-N2q7.js (removed) 3.1 kB 🟢 -3.1 kB 🟢 -1.29 kB 🟢 -1.13 kB
assets/WidgetAudioUI-BhzHyehw.js (removed) 2.82 kB 🟢 -2.82 kB 🟢 -1.12 kB 🟢 -1.02 kB
assets/WidgetAudioUI-D5w3Yc-t.js (new) 2.82 kB 🔴 +2.82 kB 🔴 +1.12 kB 🔴 +1.01 kB
assets/MediaVideoTop-6PQqfKb3.js (removed) 2.76 kB 🟢 -2.76 kB 🟢 -1.05 kB 🟢 -900 B
assets/MediaVideoTop-BTriQiNF.js (new) 2.76 kB 🔴 +2.76 kB 🔴 +1.05 kB 🔴 +901 B
assets/WidgetChart-BTvxCs1X.js (new) 2.48 kB 🔴 +2.48 kB 🔴 +932 B 🔴 +817 B
assets/WidgetChart-C9sMH5oS.js (removed) 2.48 kB 🟢 -2.48 kB 🟢 -931 B 🟢 -816 B
assets/WidgetTextarea-D5ogtg1r.js (removed) 2.48 kB 🟢 -2.48 kB 🟢 -1.01 kB 🟢 -900 B
assets/WidgetTextarea-DWFdYfJp.js (new) 2.48 kB 🔴 +2.48 kB 🔴 +1.01 kB 🔴 +885 B
assets/WidgetImageCompare-C4v-wI5H.js (new) 2.21 kB 🔴 +2.21 kB 🔴 +750 B 🔴 +661 B
assets/WidgetImageCompare-D4gTOuOo.js (removed) 2.21 kB 🟢 -2.21 kB 🟢 -747 B 🟢 -660 B
assets/WidgetInputText-Bjyk3cJl.js (new) 1.99 kB 🔴 +1.99 kB 🔴 +919 B 🔴 +851 B
assets/WidgetInputText-BVmnlmCd.js (removed) 1.99 kB 🟢 -1.99 kB 🟢 -918 B 🟢 -844 B
assets/MediaImageTop-CNiBpvXI.js (new) 1.75 kB 🔴 +1.75 kB 🔴 +842 B 🔴 +714 B
assets/MediaImageTop-DbyT2UjV.js (removed) 1.75 kB 🟢 -1.75 kB 🟢 -843 B 🟢 -720 B
assets/WidgetToggleSwitch-CBRsIck7.js (removed) 1.58 kB 🟢 -1.58 kB 🟢 -760 B 🟢 -666 B
assets/WidgetToggleSwitch-CZrF9Igf.js (new) 1.58 kB 🔴 +1.58 kB 🔴 +760 B 🔴 +669 B
assets/MediaImageBottom-BTLz49ad.js (removed) 1.57 kB 🟢 -1.57 kB 🟢 -740 B 🟢 -646 B
assets/MediaImageBottom-DnWXopD2.js (new) 1.57 kB 🔴 +1.57 kB 🔴 +745 B 🔴 +650 B
assets/MediaAudioBottom-3VJTpRxq.js (removed) 1.52 kB 🟢 -1.52 kB 🟢 -742 B 🟢 -657 B
assets/MediaAudioBottom-CvJF3YAt.js (new) 1.52 kB 🔴 +1.52 kB 🔴 +745 B 🔴 +655 B
assets/MediaVideoBottom-C0STdYAL.js (removed) 1.52 kB 🟢 -1.52 kB 🟢 -741 B 🟢 -655 B
assets/MediaVideoBottom-DOojB2Cv.js (new) 1.52 kB 🔴 +1.52 kB 🔴 +742 B 🔴 +655 B
assets/Media3DBottom-BwHc361j.js (new) 1.5 kB 🔴 +1.5 kB 🔴 +736 B 🔴 +652 B
assets/Media3DBottom-D0oy3s2V.js (removed) 1.5 kB 🟢 -1.5 kB 🟢 -733 B 🟢 -652 B
assets/Media3DTop-D3aTTsus.js (removed) 1.49 kB 🟢 -1.49 kB 🟢 -765 B 🟢 -650 B
assets/Media3DTop-DtNvH92B.js (new) 1.49 kB 🔴 +1.49 kB 🔴 +767 B 🔴 +653 B
assets/MediaAudioTop-Bqc4HR5L.js (removed) 1.46 kB 🟢 -1.46 kB 🟢 -741 B 🟢 -616 B
assets/MediaAudioTop-XOOarHlq.js (new) 1.46 kB 🔴 +1.46 kB 🔴 +740 B 🔴 +613 B
assets/WidgetSelect-BohhaiQz.js (new) 655 B 🔴 +655 B 🔴 +341 B 🔴 +284 B
assets/WidgetSelect-D3mpMnZB.js (removed) 655 B 🟢 -655 B 🟢 -343 B 🟢 -307 B
assets/WidgetInputNumber-DNPkKYaR.js (removed) 595 B 🟢 -595 B 🟢 -331 B 🟢 -275 B
assets/WidgetInputNumber-DulAa0NX.js (new) 595 B 🔴 +595 B 🔴 +329 B 🔴 +275 B
assets/Load3D-h72K_g1h.js (removed) 424 B 🟢 -424 B 🟢 -266 B 🟢 -221 B
assets/Load3D-t29mMQyY.js (new) 424 B 🔴 +424 B 🔴 +268 B 🔴 +223 B
assets/WidgetLegacy-A8SOsmWk.js (removed) 364 B 🟢 -364 B 🟢 -237 B 🟢 -193 B
assets/WidgetLegacy-DUVrhy2_.js (new) 364 B 🔴 +364 B 🔴 +238 B 🔴 +196 B
assets/commands-_s-RvhJR.js 13.6 kB 13.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BuUILW6P.js 13 kB 13 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-BV4R6fLx.js 14.9 kB 14.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CLwPdnT6.js 14.2 kB 14.2 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-CWMchBmd.js 15.9 kB 15.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DazTQhtc.js 12.9 kB 12.9 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DmWrOe93.js 13.7 kB 13.7 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-DwiH7Kr6.js 13.8 kB 13.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/commands-mS3LCNPn.js 14.5 kB 14.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-5lOBdqcC.js 84.5 kB 84.5 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-BOCuaVpE.js 73.4 kB 73.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-ClrEFGUz.js 72.4 kB 72.4 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-CyNU0iQX.js 99.3 kB 99.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-D7gwLxft.js 114 kB 114 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DC8o4BCt.js 86.8 kB 86.8 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-DKiesCV4.js 94.3 kB 94.3 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-Hq2q-OtB.js 83.6 kB 83.6 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/main-USAlAlnj.js 82 kB 82 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-_Px5dSNW.js 306 kB 306 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-7z21KPoS.js 285 kB 285 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-BWKZzBPK.js 346 kB 346 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CGbgH4Yl.js 320 kB 320 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CjjjdWkV.js 313 kB 313 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-CVrNtxvj.js 288 kB 288 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DLRSA0IK.js 309 kB 309 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-DQV2gnwA.js 372 kB 372 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/nodeDefs-ofqLG5vz.js 310 kB 310 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B
assets/widgetPropFilter-BIbGSUAt.js 1.28 kB 1.28 kB ⚪ 0 B ⚪ 0 B ⚪ 0 B

Status: 23 added / 23 removed

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🧹 Nitpick comments (1)
src/services/dialogService.ts (1)

419-456: LGTM! Well-designed generic dialog helper.

The showSmallDialog function provides a clean, reusable pattern for small dialogs with consistent styling. The generic type parameter ensures type safety for component props, and the merge logic appropriately combines default styling with custom overrides.

Optional: Add explicit return type annotation

For improved code clarity and type checking, consider adding an explicit return type:

-  function showSmallDialog<T extends Component>(options: {
+  function showSmallDialog<T extends Component>(options: {
     key: string
     component: T
     headerComponent?: Component
     footerComponent?: Component
     props?: ComponentProps<T>
     footerProps?: Record<string, unknown>
     dialogComponentProps?: DialogComponentProps
-  }) {
+  }): ReturnType<typeof dialogStore.showDialog> {

Optional: Consider consistent footer props typing

The footerProps parameter uses Record<string, unknown> while props uses the more specific ComponentProps<T>. If the footer component type is known in some contexts, you might consider making it more specific, though the current approach is acceptable if footer components vary widely.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 09c888e and 36ed67e.

📒 Files selected for processing (9)
  • src/components/sidebar/SidebarHelpCenterIcon.vue (2 hunks)
  • src/composables/useMissingNodesDialog.ts (1 hunks)
  • src/composables/useNodeConflictDialog.ts (1 hunks)
  • src/scripts/app.ts (2 hunks)
  • src/services/dialogService.ts (2 hunks)
  • src/workbench/extensions/manager/components/manager/NodeConflictDialogContent.vue (6 hunks)
  • src/workbench/extensions/manager/components/manager/NodeConflictHeader.vue (1 hunks)
  • src/workbench/extensions/manager/components/manager/button/PackEnableToggle.vue (2 hunks)
  • src/workbench/extensions/manager/components/manager/button/PackInstallButton.vue (2 hunks)
🧰 Additional context used
🧬 Code graph analysis (3)
src/scripts/app.ts (1)
src/composables/useMissingNodesDialog.ts (1)
  • useMissingNodesDialog (10-29)
src/composables/useNodeConflictDialog.ts (2)
src/stores/dialogStore.ts (1)
  • DialogComponentProps (36-37)
src/workbench/extensions/manager/types/conflictDetectionTypes.ts (1)
  • ConflictDetectionResult (55-61)
src/services/dialogService.ts (1)
src/stores/dialogStore.ts (1)
  • DialogComponentProps (36-37)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (4)
  • GitHub Check: setup
  • GitHub Check: lint-and-format
  • GitHub Check: collect
  • GitHub Check: test
🔇 Additional comments (14)
src/workbench/extensions/manager/components/manager/NodeConflictHeader.vue (1)

2-7: LGTM! Visual refinements align with the new dialog system.

The styling updates (padding adjustments, icon library migration to Lucide, and text size reduction) provide a more consistent visual presentation for the conflict dialog header.

src/scripts/app.ts (2)

45-45: LGTM! Clean import of the new composable.


1020-1024: LGTM! Successful migration to the new composable pattern.

The refactor from useDialogService().showLoadWorkflowWarning() to useMissingNodesDialog().show() aligns with the PR's goal of extracting dialog logic into dedicated composables.

src/workbench/extensions/manager/components/manager/button/PackInstallButton.vue (2)

29-29: LGTM! Import updated to use the new composable.


60-60: LGTM! Clean migration to the composable pattern.

The aliasing of show to showNodeConflictDialog maintains backward compatibility with the existing codebase while adopting the new dialog composable.

src/components/sidebar/SidebarHelpCenterIcon.vue (2)

67-67: LGTM! Import updated to use the new composable.


87-87: LGTM! Consistent migration to the composable pattern.

The same refactoring approach (aliasing show to showNodeConflictDialog) is applied consistently across multiple components.

src/workbench/extensions/manager/components/manager/NodeConflictDialogContent.vue (3)

16-18: LGTM! Improved conditional rendering and styling consistency.

The addition of v-if="importFailedConflicts.length > 0" prevents rendering empty panels, and the background color standardization to bg-secondary-background improves visual consistency.


53-53: LGTM! Hover styles migrated to Tailwind classes.

The migration from scoped CSS (.conflict-list-item:hover) to inline Tailwind classes (hover:bg-alpha-azure-600-30) is a good practice that improves maintainability and eliminates the need for a separate style block.

Also applies to: 101-101, 148-148


64-66: LGTM! Conditional rendering improves UX.

Adding v-if="allConflictDetails.length > 0" ensures the Conflicts panel only renders when there are actual conflicts to display.

src/workbench/extensions/manager/components/manager/button/PackEnableToggle.vue (2)

37-37: LGTM! Import updated to use the new composable.


55-55: LGTM! Consistent migration to the composable pattern.

The migration follows the same pattern established in other components, maintaining consistency across the codebase.

src/composables/useMissingNodesDialog.ts (1)

1-29: LGTM! Well-structured composable following Vue best practices.

The composable properly encapsulates the missing nodes dialog logic with:

  • Clear separation of concerns
  • Proper TypeScript typing using ComponentProps
  • Consistent API surface (show and hide methods)
  • Alignment with the broader dialog refactoring pattern
src/services/dialogService.ts (1)

519-520: LGTM! Clean public API surface.

The export of showSmallDialog and showLayoutDialog provides a focused, composable API. The refactoring successfully replaces specific dialog methods with a generic pattern that can be consumed by dedicated composables.

Comment on lines +1 to +48
import NodeConflictDialogContent from '@/workbench/extensions/manager/components/manager/NodeConflictDialogContent.vue'
import NodeConflictFooter from '@/workbench/extensions/manager/components/manager/NodeConflictFooter.vue'
import NodeConflictHeader from '@/workbench/extensions/manager/components/manager/NodeConflictHeader.vue'
import { useDialogService } from '@/services/dialogService'
import { useDialogStore } from '@/stores/dialogStore'
import type { DialogComponentProps } from '@/stores/dialogStore'
import type { ConflictDetectionResult } from '@/workbench/extensions/manager/types/conflictDetectionTypes'

const DIALOG_KEY = 'global-node-conflict'

export const useNodeConflictDialog = () => {
const dialogService = useDialogService()
const dialogStore = useDialogStore()

function hide() {
dialogStore.closeDialog({ key: DIALOG_KEY })
}

function show(
options: {
showAfterWhatsNew?: boolean
conflictedPackages?: ConflictDetectionResult[]
dialogComponentProps?: DialogComponentProps
buttonText?: string
onButtonClick?: () => void
} = {}
) {
const { buttonText, onButtonClick, showAfterWhatsNew, conflictedPackages } =
options

return dialogService.showSmallDialog({
key: DIALOG_KEY,
headerComponent: NodeConflictHeader,
footerComponent: NodeConflictFooter,
component: NodeConflictDialogContent,
props: {
showAfterWhatsNew,
conflictedPackages
},
footerProps: {
buttonText,
onButtonClick
}
})
}

return { show, hide }
}
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

LGTM with one concern! Well-structured composable with flexible options.

The composable follows Vue best practices and provides a clean API for displaying node conflict dialogs. However, there's a potential issue:

The dialogComponentProps from the options parameter (line 23) is destructured (line 28) but not passed to showSmallDialog() (lines 31-44).

Apply this diff to pass through dialog component props:

     return dialogService.showSmallDialog({
       key: DIALOG_KEY,
       headerComponent: NodeConflictHeader,
       footerComponent: NodeConflictFooter,
       component: NodeConflictDialogContent,
       props: {
         showAfterWhatsNew,
         conflictedPackages
       },
       footerProps: {
         buttonText,
         onButtonClick
-      }
+      },
+      dialogComponentProps
     })

Committable suggestion skipped: line range outside the PR's diff.

🤖 Prompt for AI Agents
In src/composables/useNodeConflictDialog.ts around lines 1 to 48, the options
parameter accepts dialogComponentProps but that value is destructured and never
forwarded into dialogService.showSmallDialog; update the call to showSmallDialog
to merge or pass dialogComponentProps into the props object (e.g., spread
dialogComponentProps into props or assign it to a specific prop key) so the
dialog receives those component props, ensuring no other props are overwritten
when merging.

@viva-jinyi viva-jinyi requested a review from a team as a code owner November 27, 2025 03:23
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

♻️ Duplicate comments (1)
src/composables/useNodeConflictDialog.ts (1)

23-23: dialogComponentProps is destructured but not passed to showSmallDialog.

The dialogComponentProps option is accepted in the function signature (line 23) but never forwarded to showSmallDialog(). This breaks callers like SidebarHelpCenterIcon.vue that rely on dialogComponentProps.onClose for the markConflictsAsSeen() callback.

Apply this diff to pass through dialog component props:

     return dialogService.showSmallDialog({
       key: DIALOG_KEY,
       headerComponent: NodeConflictHeader,
       footerComponent: NodeConflictFooter,
       component: NodeConflictDialogContent,
       props: {
         showAfterWhatsNew,
         conflictedPackages
       },
       footerProps: {
         buttonText,
         onButtonClick
-      }
+      },
+      dialogComponentProps
     })

Also applies to: 31-44

🧹 Nitpick comments (1)
src/workbench/extensions/manager/components/manager/button/PackEnableToggle.vue (1)

129-139: Consider resetting isLoading in a finally block for robustness

If handleEnable() or handleDisable() throws, isLoading stays true and the toggle effectively “locks up” until reload. A small refactor would make this more robust:

-const handleToggle = async (enable: boolean) => {
-  if (isLoading.value) return
-
-  isLoading.value = true
-  if (enable) {
-    await handleEnable()
-  } else {
-    await handleDisable()
-  }
-  isLoading.value = false
-}
+const handleToggle = async (enable: boolean) => {
+  if (isLoading.value) return
+
+  isLoading.value = true
+  try {
+    if (enable) {
+      await handleEnable()
+    } else {
+      await handleDisable()
+    }
+  } finally {
+    isLoading.value = false
+  }
+}

You can optionally add error reporting inside the catch/finally path later to meet the “proper error handling” guideline.

<div
v-if="importFailedConflicts.length > 0"
class="flex min-h-8 w-full flex-col rounded-lg bg-base-background"
class="flex min-h-8 w-full flex-col rounded-lg bg-secondary-background"
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Read the NodeConflictDialogContent.vue file to understand its structure
cat -n src/workbench/extensions/manager/components/manager/NodeConflictDialogContent.vue

Repository: Comfy-Org/ComfyUI_frontend

Length of output: 9603


Extension List Wrapper should conditionally render when data is empty, for consistency.

The component has three collapsible list sections with identical structure. The "Import Failed List Wrapper" and "Conflict List Wrapper" both use v-if to hide when their respective data arrays are empty (lines 16, 64), but the "Extension List Wrapper" (lines 111-112) renders unconditionally regardless of conflictData.length. This creates visual inconsistency—when conflictData.length === 0, the header displays "0 Extensions At Risk" with an empty expandable list, unlike the other sections which disappear entirely.

For UI consistency, add v-if="conflictData.length > 0" to line 111-112.

🤖 Prompt for AI Agents
In
src/workbench/extensions/manager/components/manager/NodeConflictDialogContent.vue
around lines 111 to 112, the Extension List Wrapper renders even when
conflictData is empty causing an inconsistent UI; update the wrapper element to
include a conditional rendering check (v-if="conflictData.length > 0") so the
entire Extension List section is omitted when there are no conflicts, matching
the other list wrappers that already use v-if.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (2)
tests-ui/tests/components/dialog/content/manager/NodeConflictDialogContent.test.ts (2)

251-251: Complete the migration to data-testid selectors for conflict items.

The class selector .flex.h-6.flex-shrink-0 is fragile and couples tests to implementation details. Consider adding data-testid attributes to conflict/import-failed item elements in the component and updating these tests accordingly.

This would make tests more resilient to styling changes:

-      const conflictItems = expandedPanels[0].findAll('.flex.h-6.flex-shrink-0')
+      const conflictItems = expandedPanels[0].findAll('[data-testid="conflict-item"]')

Apply similar changes at lines 333 and 350.

Also applies to: 333-333, 350-350


410-412: Prefer data-testid or behavioral testing over class-based selectors.

The multi-class selector [class*="max-h-"][class*="overflow-y-auto"][class*="scrollbar-hide"] is extremely fragile. Consider either:

  1. Adding a data-testid to scrollable containers in the component
  2. Testing scroll behavior functionally (e.g., verify content overflow) rather than checking implementation classes

Example approach using data-testid:

-        const scrollableContainer = wrapper.find(
-          '[class*="max-h-"][class*="overflow-y-auto"][class*="scrollbar-hide"]'
-        )
+        const scrollableContainer = wrapper.find('[data-testid="conflict-scrollable-list"]')
         expect(scrollableContainer.exists()).toBe(true)
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 7fc434d and ca56fe9.

📒 Files selected for processing (1)
  • tests-ui/tests/components/dialog/content/manager/NodeConflictDialogContent.test.ts (6 hunks)
🧰 Additional context used
📓 Path-based instructions (9)
**/*.{vue,ts,tsx}

📄 CodeRabbit inference engine (.cursorrules)

**/*.{vue,ts,tsx}: Leverage VueUse functions for performance-enhancing utilities
Use vue-i18n in Composition API for any string literals and place new translation entries in src/locales/en/main.json

Files:

  • tests-ui/tests/components/dialog/content/manager/NodeConflictDialogContent.test.ts
**/*.{ts,tsx,js}

📄 CodeRabbit inference engine (.cursorrules)

Use es-toolkit for utility functions

Files:

  • tests-ui/tests/components/dialog/content/manager/NodeConflictDialogContent.test.ts
**/*.{ts,tsx}

📄 CodeRabbit inference engine (.cursorrules)

Use TypeScript for type safety

**/*.{ts,tsx}: Never use any type - use proper TypeScript types
Never use as any type assertions - fix the underlying type issue

Files:

  • tests-ui/tests/components/dialog/content/manager/NodeConflictDialogContent.test.ts
**/*.{ts,tsx,js,vue}

📄 CodeRabbit inference engine (.cursorrules)

Implement proper error handling in components and services

**/*.{ts,tsx,js,vue}: Use 2-space indentation, single quotes, no semicolons, and maintain 80-character line width as configured in .prettierrc
Organize imports by sorting and grouping by plugin, and run pnpm format before committing

Files:

  • tests-ui/tests/components/dialog/content/manager/NodeConflictDialogContent.test.ts
**/*.{ts,tsx,js,jsx,vue}

📄 CodeRabbit inference engine (CLAUDE.md)

Use camelCase for variable and setting names in TypeScript/Vue files

Files:

  • tests-ui/tests/components/dialog/content/manager/NodeConflictDialogContent.test.ts
**/*.{ts,tsx,vue}

📄 CodeRabbit inference engine (CLAUDE.md)

**/*.{ts,tsx,vue}: Use const settingStore = useSettingStore() and settingStore.get('Comfy.SomeSetting') to retrieve settings in TypeScript/Vue files
Use await settingStore.set('Comfy.SomeSetting', newValue) to update settings in TypeScript/Vue files
Check server capabilities using api.serverSupportsFeature('feature_name') before using enhanced features
Use api.getServerFeature('config_name', defaultValue) to retrieve server feature configuration

Enforce ESLint rules for Vue + TypeScript including: no floating promises, no unused imports, and i18n raw text restrictions in templates

Files:

  • tests-ui/tests/components/dialog/content/manager/NodeConflictDialogContent.test.ts
**/*.ts

📄 CodeRabbit inference engine (CLAUDE.md)

**/*.ts: Define dynamic setting defaults using runtime context with functions in settings configuration
Use defaultsByInstallVersion property for gradual feature rollout based on version in settings configuration

Files:

  • tests-ui/tests/components/dialog/content/manager/NodeConflictDialogContent.test.ts
tests-ui/**/*.test.{js,ts,jsx,tsx}

📄 CodeRabbit inference engine (tests-ui/CLAUDE.md)

tests-ui/**/*.test.{js,ts,jsx,tsx}: Write tests for new features
Follow existing test patterns in the codebase
Use existing test utilities rather than writing custom utilities
Mock external dependencies in tests
Always prefer vitest mock functions over writing verbose manual mocks

Files:

  • tests-ui/tests/components/dialog/content/manager/NodeConflictDialogContent.test.ts
**/*.{test,spec}.{ts,tsx,js}

📄 CodeRabbit inference engine (AGENTS.md)

Unit and component tests should be located in tests-ui/ or co-located with components as src/components/**/*.{test,spec}.ts; E2E tests should be in browser_tests/

Files:

  • tests-ui/tests/components/dialog/content/manager/NodeConflictDialogContent.test.ts
🧠 Learnings (6)
📚 Learning: 2025-11-24T19:48:03.270Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: tests-ui/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:48:03.270Z
Learning: Applies to tests-ui/**/*.test.{js,ts,jsx,tsx} : Write tests for new features

Applied to files:

  • tests-ui/tests/components/dialog/content/manager/NodeConflictDialogContent.test.ts
📚 Learning: 2025-11-24T19:48:03.270Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: tests-ui/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:48:03.270Z
Learning: Applies to tests-ui/**/*.test.{js,ts,jsx,tsx} : Follow existing test patterns in the codebase

Applied to files:

  • tests-ui/tests/components/dialog/content/manager/NodeConflictDialogContent.test.ts
📚 Learning: 2025-11-24T19:47:22.909Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: browser_tests/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:22.909Z
Learning: Applies to browser_tests/**/*.{e2e,spec}.{ts,tsx,js,jsx} : Prefer specific selectors in browser tests

Applied to files:

  • tests-ui/tests/components/dialog/content/manager/NodeConflictDialogContent.test.ts
📚 Learning: 2025-11-24T19:48:03.270Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: tests-ui/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:48:03.270Z
Learning: Check tests-ui/README.md for test guidelines

Applied to files:

  • tests-ui/tests/components/dialog/content/manager/NodeConflictDialogContent.test.ts
📚 Learning: 2025-11-24T19:48:03.270Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: tests-ui/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:48:03.270Z
Learning: Applies to tests-ui/**/*.test.{js,ts,jsx,tsx} : Use existing test utilities rather than writing custom utilities

Applied to files:

  • tests-ui/tests/components/dialog/content/manager/NodeConflictDialogContent.test.ts
📚 Learning: 2025-11-24T19:47:56.371Z
Learnt from: CR
Repo: Comfy-Org/ComfyUI_frontend PR: 0
File: src/lib/litegraph/CLAUDE.md:0-0
Timestamp: 2025-11-24T19:47:56.371Z
Learning: Applies to src/lib/litegraph/**/*.{test,spec}.{ts,tsx} : Use provided test helpers `createTestSubgraph` and `createTestSubgraphNode` from `./fixtures/subgraphHelpers` for consistent subgraph test setup

Applied to files:

  • tests-ui/tests/components/dialog/content/manager/NodeConflictDialogContent.test.ts
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (4)
  • GitHub Check: setup
  • GitHub Check: test
  • GitHub Check: lint-and-format
  • GitHub Check: collect
🔇 Additional comments (2)
tests-ui/tests/components/dialog/content/manager/NodeConflictDialogContent.test.ts (2)

141-142: LGTM! Good validation of conditional rendering.

The assertion correctly validates that the Conflicts section is hidden when there are no conflicts, and the comment helpfully explains the v-if behavior.


189-198: LGTM! Good migration to data-testid selectors.

The migration from class-based selectors to data-testid attributes improves test stability and makes the tests more resilient to styling changes.

@viva-jinyi viva-jinyi added the New Browser Test Expectations New browser test screenshot should be set by github action label Nov 27, 2025
@github-actions
Copy link

Updating Playwright Expectations

@github-actions github-actions bot removed the New Browser Test Expectations New browser test screenshot should be set by github action label Nov 27, 2025
Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/stores/dialogStore.ts (1)

206-225: Add explicit return type annotation for type safety.

The function now returns a DialogInstance but lacks an explicit return type annotation. As per coding guidelines for stores, TypeScript type safety should be enforced throughout state management.

Apply this diff to add the return type:

-  function showDialog(options: ShowDialogOptions) {
+  function showDialog(options: ShowDialogOptions): DialogInstance {
     const dialogKey = options.key || genDialogKey()

Based on coding guidelines: "Use TypeScript for type safety in state management stores."

🧹 Nitpick comments (1)
src/stores/dialogStore.ts (1)

218-218: Remove redundant assignment.

Setting dialog.visible = true is unnecessary here since we're in the else branch where dialog.visible is already true (the if condition checks !dialog.visible).

Apply this diff:

     } else {
-      dialog.visible = true
       riseDialog(dialog)
     }
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between ca56fe9 and 83e9039.

📒 Files selected for processing (1)
  • src/stores/dialogStore.ts (1 hunks)
🧰 Additional context used
📓 Path-based instructions (13)
**/*.{vue,ts,tsx}

📄 CodeRabbit inference engine (.cursorrules)

**/*.{vue,ts,tsx}: Leverage VueUse functions for performance-enhancing utilities
Use vue-i18n in Composition API for any string literals and place new translation entries in src/locales/en/main.json

Files:

  • src/stores/dialogStore.ts
**/*.{ts,tsx,js}

📄 CodeRabbit inference engine (.cursorrules)

Use es-toolkit for utility functions

Files:

  • src/stores/dialogStore.ts
**/*.{ts,tsx}

📄 CodeRabbit inference engine (.cursorrules)

Use TypeScript for type safety

**/*.{ts,tsx}: Never use any type - use proper TypeScript types
Never use as any type assertions - fix the underlying type issue

Files:

  • src/stores/dialogStore.ts
**/*.{ts,tsx,js,vue}

📄 CodeRabbit inference engine (.cursorrules)

Implement proper error handling in components and services

**/*.{ts,tsx,js,vue}: Use 2-space indentation, single quotes, no semicolons, and maintain 80-character line width as configured in .prettierrc
Organize imports by sorting and grouping by plugin, and run pnpm format before committing

Files:

  • src/stores/dialogStore.ts
src/**/*.{vue,ts}

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

src/**/*.{vue,ts}: Leverage VueUse functions for performance-enhancing styles
Implement proper error handling
Use vue-i18n in composition API for any string literals. Place new translation entries in src/locales/en/main.json

Files:

  • src/stores/dialogStore.ts
src/**/*.ts

📄 CodeRabbit inference engine (.github/copilot-instructions.md)

src/**/*.ts: Use es-toolkit for utility functions
Use TypeScript for type safety

Files:

  • src/stores/dialogStore.ts
**/*.{ts,tsx,js,jsx,vue}

📄 CodeRabbit inference engine (CLAUDE.md)

Use camelCase for variable and setting names in TypeScript/Vue files

Files:

  • src/stores/dialogStore.ts
**/*.{ts,tsx,vue}

📄 CodeRabbit inference engine (CLAUDE.md)

**/*.{ts,tsx,vue}: Use const settingStore = useSettingStore() and settingStore.get('Comfy.SomeSetting') to retrieve settings in TypeScript/Vue files
Use await settingStore.set('Comfy.SomeSetting', newValue) to update settings in TypeScript/Vue files
Check server capabilities using api.serverSupportsFeature('feature_name') before using enhanced features
Use api.getServerFeature('config_name', defaultValue) to retrieve server feature configuration

Enforce ESLint rules for Vue + TypeScript including: no floating promises, no unused imports, and i18n raw text restrictions in templates

Files:

  • src/stores/dialogStore.ts
**/*.ts

📄 CodeRabbit inference engine (CLAUDE.md)

**/*.ts: Define dynamic setting defaults using runtime context with functions in settings configuration
Use defaultsByInstallVersion property for gradual feature rollout based on version in settings configuration

Files:

  • src/stores/dialogStore.ts
src/**/*.{ts,tsx,vue}

📄 CodeRabbit inference engine (src/CLAUDE.md)

src/**/*.{ts,tsx,vue}: Sanitize HTML with DOMPurify to prevent XSS attacks
Avoid using @ts-expect-error; use proper TypeScript types instead
Use es-toolkit for utility functions instead of other utility libraries
Implement proper TypeScript types throughout the codebase

Files:

  • src/stores/dialogStore.ts
src/**/stores/**/*.{ts,tsx}

📄 CodeRabbit inference engine (src/CLAUDE.md)

src/**/stores/**/*.{ts,tsx}: Maintain clear public interfaces and restrict extension access in stores
Use TypeScript for type safety in state management stores

Files:

  • src/stores/dialogStore.ts
src/**/*.{vue,ts,tsx}

📄 CodeRabbit inference engine (src/CLAUDE.md)

Follow Vue 3 composition API style guide

Files:

  • src/stores/dialogStore.ts
**/stores/*Store.ts

📄 CodeRabbit inference engine (AGENTS.md)

Name Pinia stores with the *Store.ts suffix

Files:

  • src/stores/dialogStore.ts
🧬 Code graph analysis (1)
src/stores/dialogStore.ts (1)
src/lib/litegraph/src/LGraphCanvas.ts (1)
  • createDialog (7509-7614)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (4)
  • GitHub Check: test
  • GitHub Check: lint-and-format
  • GitHub Check: setup
  • GitHub Check: collect

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:L This PR changes 100-499 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants