* refactor(web): split koolook_sidebar.js into 7 sidebar modules Pure mechanical split — zero behavior change. Implements the design from issue #49 (common-case layout with patchCanvasMenu extracted). Old: web/koolook_sidebar.js (1973 lines, monolithic) New: web/koolook_sidebar.js (48-line entry) + 7 modules in web/sidebar/ - constants.js (130) — REPOS, TAB_*, storage keys, event names, URLs, ensureStyle, toast, compareNames - picks_store.js (117) — localStorage user picks: load/save/add (tri-state) /remove/notify/seed/export - workflows_store.js (347) — workflowsCache + persistMutation + snapshotCache + commit + persist*/load*/seed* + in-memory ops; cache is module-private - canvas_io.js (192) — serialize*/canvasIsNonEmpty/loadWorkflowOntoCanvas /insertNode/getSelectedNodeTypes - modals.js (384) — makeModalShell + showInputModal/showConfirmModal /showSaveWorkflowModal/showContextMenu - canvas_menu.js (45) — patchCanvasMenu (idempotent LGraphCanvas patch) - tree.js (825) — pathStates (module-private) + gatherers + DOM row factories + buildFolder + workflow/dir context menus + rebuildTree + renderPanel Encapsulation invariants verified: - workflowsCache: zero references outside workflows_store.js - pathStates: zero references outside tree.js - All 8 files pass node --check - CSS string byte-identical to original - URL constants resolve to same targets after the extra `..` adjustment Documentation updated: dev-iteration-loop.md and workflows-sidebar.md now point pathStates references at web/sidebar/tree.js. Other doc references to koolook_sidebar.js as the entry remain accurate. Closes #49. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> * refactor(web): drop unreachable defensive guard in gatherWorkflows Review feedback on #51: the `if (!dir) continue;` after `dirOf(dirName)` is unreachable — `listDirectoryNames()` enumerates the same module-private `workflowsCache.directories` keys that `dirOf()` reads, synchronously, within a single event-loop turn. Removing the guard restores strict "byte-identical move" semantics for the file-split refactor. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
49 lines
1.8 KiB
JavaScript
49 lines
1.8 KiB
JavaScript
// =============================================================================
|
|
// Koolook curated-nodes sidebar — entry point.
|
|
//
|
|
// This file boots the sidebar; module bodies live in `web/sidebar/`. ComfyUI
|
|
// discovers the extension via `WEB_DIRECTORY = "./web"` (set in __init__.py)
|
|
// and calls `app.registerExtension(...).setup()` once during frontend startup.
|
|
// =============================================================================
|
|
import { app } from "../../../scripts/app.js";
|
|
|
|
import {
|
|
TAB_ID,
|
|
TAB_TITLE,
|
|
TAB_TOOLTIP,
|
|
TAB_ICON,
|
|
} from "./sidebar/constants.js";
|
|
import { seedDefaultsIfNeeded } from "./sidebar/picks_store.js";
|
|
import {
|
|
loadWorkflowsStore,
|
|
seedWorkflowDefaultsIfNeeded,
|
|
} from "./sidebar/workflows_store.js";
|
|
import { renderPanel } from "./sidebar/tree.js";
|
|
import { patchCanvasMenu } from "./sidebar/canvas_menu.js";
|
|
|
|
app.registerExtension({
|
|
name: "koolook.curated_sidebar",
|
|
async setup() {
|
|
if (!app.extensionManager || !app.extensionManager.registerSidebarTab) {
|
|
console.warn("[Koolook] extensionManager.registerSidebarTab not available; sidebar not registered.");
|
|
return;
|
|
}
|
|
await seedDefaultsIfNeeded();
|
|
const loadResult = await loadWorkflowsStore();
|
|
// Skip workflow seeding when /userdata file is corrupt — we don't want
|
|
// to overwrite a recoverable-but-unparseable file with stock defaults.
|
|
if (!loadResult.corrupt) {
|
|
await seedWorkflowDefaultsIfNeeded();
|
|
}
|
|
app.extensionManager.registerSidebarTab({
|
|
id: TAB_ID,
|
|
title: TAB_TITLE,
|
|
tooltip: TAB_TOOLTIP,
|
|
icon: TAB_ICON,
|
|
type: "custom",
|
|
render: (el) => renderPanel(el),
|
|
});
|
|
patchCanvasMenu();
|
|
},
|
|
});
|