diff --git a/scripts/cleanup-workflow.js b/scripts/cleanup-workflow.js deleted file mode 100644 index 61ff63ef..00000000 --- a/scripts/cleanup-workflow.js +++ /dev/null @@ -1,72 +0,0 @@ -/** - * One-time script to clean up outputGallery nodes with embedded images - * This fixes workflows saved before the outputGallery externalization bug was fixed - */ - -const fs = require('fs'); -const path = require('path'); - -const workflowPath = process.argv[2]; - -if (!workflowPath) { - console.error('Usage: node cleanup-workflow.js '); - process.exit(1); -} - -console.log(`Reading workflow: ${workflowPath}`); -const workflow = JSON.parse(fs.readFileSync(workflowPath, 'utf8')); - -let cleaned = false; -let totalSizeBefore = 0; -let totalSizeAfter = 0; - -workflow.nodes.forEach((node, index) => { - if (node.type === 'outputGallery' && node.data.images && node.data.images.length > 0) { - const sizeBefore = JSON.stringify(node.data.images).length; - const imageCount = node.data.images.filter(img => img && img.startsWith('data:')).length; - - if (imageCount > 0) { - const removedImages = node.data.images.filter(img => img && img.startsWith('data:')); - const removedSize = removedImages.reduce((sum, img) => sum + img.length, 0); - - console.log(`\nNode ${index} (${node.id}):`); - console.log(` Found ${imageCount} embedded images`); - console.log(` Size: ${(removedSize / 1024 / 1024).toFixed(2)} MB`); - - node.data.images = node.data.images.filter(img => !(img && img.startsWith('data:'))); - totalSizeBefore += removedSize; - cleaned = true; - } - } - - if (node.type === 'output' && node.data.image && node.data.image.startsWith('data:')) { - const sizeBefore = node.data.image.length; - console.log(`\nNode ${index} (${node.id}):`); - console.log(` Found embedded output image`); - console.log(` Size: ${(sizeBefore / 1024 / 1024).toFixed(2)} MB`); - - node.data.image = null; - totalSizeBefore += sizeBefore; - cleaned = true; - } -}); - -if (cleaned) { - const backupPath = workflowPath.replace('.json', '.backup.json'); - console.log(`\nCreating backup: ${backupPath}`); - fs.copyFileSync(workflowPath, backupPath); - - console.log(`Writing cleaned workflow...`); - fs.writeFileSync(workflowPath, JSON.stringify(workflow, null, 2)); - - const finalSize = fs.statSync(workflowPath).size; - const originalSize = fs.statSync(backupPath).size; - - console.log(`\n✅ Done!`); - console.log(` Original size: ${(originalSize / 1024 / 1024).toFixed(2)} MB`); - console.log(` New size: ${(finalSize / 1024 / 1024).toFixed(2)} MB`); - console.log(` Saved: ${((originalSize - finalSize) / 1024 / 1024).toFixed(2)} MB`); - console.log(`\nBackup saved to: ${backupPath}`); -} else { - console.log('\n✓ No embedded images found - workflow is already clean!'); -} diff --git a/src/components/GroupsOverlay.tsx b/src/components/GroupsOverlay.tsx index 3dad28cb..43cee3e2 100644 --- a/src/components/GroupsOverlay.tsx +++ b/src/components/GroupsOverlay.tsx @@ -152,7 +152,6 @@ function GroupControls({ groupId, zoom }: GroupControlsProps) { // Header drag handlers const handleHeaderMouseDown = useCallback( (e: React.MouseEvent) => { - if (group?.locked) return; if ( (e.target as HTMLElement).closest("button") || (e.target as HTMLElement).closest("input") @@ -164,13 +163,12 @@ function GroupControls({ groupId, zoom }: GroupControlsProps) { setIsDragging(true); dragStartRef.current = { x: e.clientX, y: e.clientY }; }, - [group?.locked] + [] ); // Resize handlers const handleResizeMouseDown = useCallback( (e: React.MouseEvent, handle: string) => { - if (group?.locked) return; e.stopPropagation(); e.preventDefault(); setIsResizing(true); @@ -184,7 +182,7 @@ function GroupControls({ groupId, zoom }: GroupControlsProps) { posY: group.position.y, }; }, - [group?.locked, group?.size, group?.position] + [group?.size, group?.position] ); useEffect(() => { @@ -319,6 +317,11 @@ function GroupControls({ groupId, zoom }: GroupControlsProps) { className="flex items-center rounded-md px-2 py-0.5" style={{ backgroundColor: bgColor }} > + {group.locked && ( + + + + )} {isEditing ? ( { e.stopPropagation(); if (!group.locked) setIsEditing(true); }} + onDoubleClick={(e) => { e.stopPropagation(); setIsEditing(true); }} > {group.name}