diff --git a/components/process-flow/ProcessFlowCanvas.vue b/components/process-flow/ProcessFlowCanvas.vue index 710ccfa..d3867ef 100644 --- a/components/process-flow/ProcessFlowCanvas.vue +++ b/components/process-flow/ProcessFlowCanvas.vue @@ -1224,7 +1224,6 @@ function fromObject(flowObject) { /* Node styles from ProcessFlowNodes.js are imported globally in a plugin */ .process-flow-container { width: 100%; - height: calc(100vh - 190px); /* Adjust based on new header/footer height */ min-height: 500px; border: 1px solid #e2e8f0; border-radius: 0; diff --git a/pages/process-builder/index.vue b/pages/process-builder/index.vue index f3f2e7c..25ff56a 100644 --- a/pages/process-builder/index.vue +++ b/pages/process-builder/index.vue @@ -121,11 +121,8 @@ const checkScreenSize = () => { showRightPanel.value = true; } } else { - // Desktop: show both panels by default - if (!showLeftPanel.value && !showRightPanel.value) { - showLeftPanel.value = true; - showRightPanel.value = true; - } + // Desktop: show both panels by default only on first load + // Don't override user preferences on screen size changes } }; @@ -148,6 +145,13 @@ const toggleRightPanel = () => { } }; +// Toggle both panels at once +const toggleBothPanels = () => { + const bothVisible = showLeftPanel.value && showRightPanel.value; + showLeftPanel.value = !bothVisible; + showRightPanel.value = !bothVisible; +}; + // Close panels when clicking on canvas (mobile only) const onPaneClickMobile = () => { selectedNode.value = null; @@ -162,6 +166,32 @@ const onPaneClickMobile = () => { } }; +// Keyboard shortcuts for panel toggles +const handleKeyboardShortcuts = (event) => { + // Only handle shortcuts when no input is focused + if (event.target.tagName === 'INPUT' || event.target.tagName === 'TEXTAREA') { + return; + } + + // Ctrl/Cmd + 1: Toggle left panel + if ((event.ctrlKey || event.metaKey) && event.key === '1') { + event.preventDefault(); + toggleLeftPanel(); + } + + // Ctrl/Cmd + 2: Toggle right panel + if ((event.ctrlKey || event.metaKey) && event.key === '2') { + event.preventDefault(); + toggleRightPanel(); + } + + // Ctrl/Cmd + 3: Toggle both panels + if ((event.ctrlKey || event.metaKey) && event.key === '3') { + event.preventDefault(); + toggleBothPanels(); + } +}; + // Handle node highlighting from variable usage const handleNodeHighlight = (event) => { @@ -1111,6 +1141,9 @@ onMounted(() => { // Add node highlight listener for variable navigation window.addEventListener('highlightNode', handleNodeHighlight); + // Add keyboard shortcuts listener + window.addEventListener('keydown', handleKeyboardShortcuts); + // Initial screen size check checkScreenSize(); }); @@ -1128,6 +1161,7 @@ onUnmounted(() => { document.removeEventListener('click', handleClickOutside); window.removeEventListener('resize', checkScreenSize); window.removeEventListener('highlightNode', handleNodeHighlight); + window.removeEventListener('keydown', handleKeyboardShortcuts); // Clear highlight timeout if it exists if (highlightTimeout.value) { @@ -2107,31 +2141,57 @@ const sendToBack = () => {

Create business processes with drag and drop

- -
+
+ + +
+ +
+ + + +
-
- -
+ { -
+
{ >

Process Components

- + @@ -2239,7 +2299,16 @@ const sendToBack = () => {
-
+
+ +
+
+ + Full Canvas Mode + Press Ctrl+3 to restore panels +
+
+ { @pane-click="onPaneClick" @nodes-change="onNodesChange" @edges-change="onEdgesChange" + class="w-full h-full" /> @@ -2279,7 +2349,7 @@ const sendToBack = () => { :class="{ 'absolute inset-y-0 right-0 z-20 bg-white shadow-lg': isMobile, 'absolute inset-y-0 right-0 z-10 bg-white shadow-md': isTablet, - 'relative w-72': !isMobile && !isTablet, + 'relative w-64': !isMobile && !isTablet, 'w-72': isMobile, 'w-80': isTablet }" @@ -2287,11 +2357,11 @@ const sendToBack = () => { >

Properties

- + @@ -3825,4 +3895,27 @@ const sendToBack = () => { .modern-icon-btn[variant~='danger-text']:hover { background: #fee2e2; } + +/* Ensure full canvas coverage */ +.process-builder { + height: 100vh; + overflow: hidden; +} + +/* Override Vue Flow container to fill full height */ +:deep(.vue-flow) { + width: 100% !important; + height: 100% !important; + min-height: 100% !important; +} + +:deep(.vue-flow__pane) { + width: 100% !important; + height: 100% !important; +} + +:deep(.vue-flow__renderer) { + width: 100% !important; + height: 100% !important; +} \ No newline at end of file