-
-
+
+
+
+
+
+
+
+
+
{{ selectedNodeData.type.replace('-', ' ') }} Node
+
{{ selectedNodeData.id }}
+
+
-
-
-
-
-
+
+
+
+
+
+
+
+ Basic Properties
+
+
+
+
+
+
+
-
+
+
+
+
+
-
-
-
- Configure Form Task
-
-
+
+
+
+
+
+
+ {{ shapeOptions.find(s => s.value === nodeShape)?.label || 'Rectangle' }}
+
+
+
+
-
-
-
- Configure API Call
-
-
+
+
+
+
+ Appearance
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
- Configure Decision Paths
-
-
-
-
-
-
- Configure Business Rule
-
-
-
-
-
-
- Configure Notification
-
-
-
-
-
-
- Configure Script Task
-
+
+
+
+
+ Configuration
+
+
+
+
+
Configure form submission behavior and data mapping.
+
+
+ Configure Form Task
+
+
+
+
+
+
Set up API endpoint, request parameters, and response handling.
+
+
+ Configure API Call
+
+
+
+
+
+
Define decision conditions and workflow paths.
+
+
+ Configure Decision Paths
+
+
+
+
+
+
Set up business logic conditions and actions.
+
+
+ Configure Business Rule
+
+
+
+
+
+
Configure notification recipients, content, and delivery method.
+
+
+ Configure Notification
+
+
+
+
+
+
Write custom scripts and define execution parameters.
+
+
+ Configure Script Task
+
+
+
@@ -1743,11 +2139,549 @@ watch(() => processStore.currentProcess, async (newProcess, oldProcess) => {
padding: 10px;
}
+/* Shape classes for flowchart nodes */
+:deep(.custom-node.shape-rectangle) {
+ border-radius: 4px;
+}
+
+:deep(.custom-node.shape-rounded-rectangle) {
+ border-radius: 12px;
+}
+
+:deep(.custom-node.shape-circle) {
+ border-radius: 50%;
+ min-width: 120px;
+ min-height: 120px;
+ width: 120px;
+ height: 120px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+:deep(.custom-node.shape-circle .custom-node-content) {
+ text-align: center;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+}
+
+:deep(.custom-node.shape-diamond) {
+ transform: rotate(45deg);
+ border-radius: 8px;
+ min-width: 120px;
+ min-height: 120px;
+ width: 120px;
+ height: 120px;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+}
+
+:deep(.custom-node.shape-diamond .custom-node-content) {
+ transform: rotate(-45deg);
+ text-align: center;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+}
+
+:deep(.custom-node.shape-hexagon) {
+ position: relative;
+ border-radius: 0;
+ background: none;
+ border: none;
+ min-width: 140px;
+ min-height: 80px;
+}
+
+:deep(.custom-node.shape-hexagon::before) {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ background: var(--node-bg-color, white);
+ border: 1px solid var(--node-border-color, #ddd);
+ clip-path: polygon(25% 0%, 75% 0%, 100% 50%, 75% 100%, 25% 100%, 0% 50%);
+ z-index: 0;
+}
+
+/* Special backgrounds for business-rule, notification, and api hexagon shapes */
+:deep(.node-business-rule.shape-hexagon::before) {
+ border-left: 4px solid var(--node-border-color, #9333ea);
+}
+
+:deep(.node-notification.shape-hexagon::before) {
+ border-left: 4px solid var(--node-border-color, #3b82f6);
+}
+
+:deep(.node-api.shape-hexagon::before) {
+ border-left: 4px solid var(--node-border-color, #10b981);
+}
+
+:deep(.node-gateway.shape-hexagon::before) {
+ border: 2px solid var(--node-border-color, #FF9800);
+}
+
+:deep(.custom-node.shape-hexagon .custom-node-content) {
+ position: relative;
+ z-index: 1;
+}
+
+:deep(.custom-node.shape-parallelogram) {
+ transform: skew(-20deg);
+ border-radius: 4px;
+ min-width: 140px;
+}
+
+:deep(.custom-node.shape-parallelogram .custom-node-content) {
+ transform: skew(20deg);
+}
+
+:deep(.custom-node.shape-trapezoid) {
+ position: relative;
+ border-radius: 0;
+ background: none;
+ border: none;
+ min-width: 140px;
+ min-height: 80px;
+}
+
+:deep(.custom-node.shape-trapezoid::before) {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: 0;
+ right: 0;
+ bottom: 0;
+ background: var(--node-bg-color, white);
+ border: 1px solid var(--node-border-color, #ddd);
+ clip-path: polygon(30% 0%, 70% 0%, 100% 100%, 0% 100%);
+ z-index: 0;
+}
+
+/* Special backgrounds for business-rule, notification, and api trapezoid shapes */
+:deep(.node-business-rule.shape-trapezoid::before) {
+ border-left: 4px solid var(--node-border-color, #9333ea);
+}
+
+:deep(.node-notification.shape-trapezoid::before) {
+ border-left: 4px solid var(--node-border-color, #3b82f6);
+}
+
+:deep(.node-api.shape-trapezoid::before) {
+ border-left: 4px solid var(--node-border-color, #10b981);
+}
+
+:deep(.node-gateway.shape-trapezoid::before) {
+ border: 2px solid var(--node-border-color, #FF9800);
+}
+
+:deep(.custom-node.shape-trapezoid .custom-node-content) {
+ position: relative;
+ z-index: 1;
+}
+
+/* Handle positioning adjustments for different shapes */
+
+/* Circle shape handles */
+:deep(.custom-node.shape-circle .vue-flow__handle) {
+ width: 10px;
+ height: 10px;
+}
+
+:deep(.custom-node.shape-circle .handle-top) {
+ top: -5px;
+ left: 50%;
+ transform: translateX(-50%);
+}
+
+:deep(.custom-node.shape-circle .handle-bottom) {
+ bottom: -5px;
+ left: 50%;
+ transform: translateX(-50%);
+}
+
+:deep(.custom-node.shape-circle .handle-left) {
+ left: -5px;
+ top: 50%;
+ transform: translateY(-50%);
+}
+
+:deep(.custom-node.shape-circle .handle-right) {
+ right: -5px;
+ top: 50%;
+ transform: translateY(-50%);
+}
+
+/* Text overflow and positioning for all shapes */
+
+/* Base text styling for all nodes */
+:deep(.custom-node .custom-node-content) {
+ width: 100%;
+ height: 100%;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: center;
+ text-align: center;
+ overflow: hidden;
+ word-wrap: break-word;
+ hyphens: auto;
+ color: var(--node-text-color, #333333);
+}
+
+/* Ensure all text elements in nodes inherit the custom text color */
+:deep(.custom-node *) {
+ color: inherit !important;
+}
+
+/* Override for icons to inherit text color but maintain visibility */
+:deep(.custom-node .material-icons) {
+ color: inherit;
+ opacity: 0.9;
+}
+
+/* Ensure icons in start and end nodes maintain their original colors */
+:deep(.node-start .material-icons) {
+ color: #16a34a !important;
+ opacity: 1;
+}
+
+:deep(.node-end .material-icons) {
+ color: #dc2626 !important;
+ opacity: 1;
+}
+
+/* Special handling for colored status indicators - make them more visible */
+:deep(.custom-node .node-rule-detail-value) {
+ color: inherit;
+ font-weight: 600;
+}
+
+/* Make labels slightly dimmed for hierarchy */
+:deep(.custom-node .node-rule-detail-label) {
+ color: inherit;
+ opacity: 0.7;
+ font-weight: 500;
+ white-space: nowrap;
+}
+
+:deep(.custom-node .custom-node-content .custom-node-label) {
+ display: -webkit-box;
+ -webkit-line-clamp: 3;
+ -webkit-box-orient: vertical;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ line-height: 1.2;
+ max-width: 100%;
+ font-size: 12px;
+ font-weight: 500;
+ padding: 2px 4px;
+}
+
+/* Rectangle and rounded rectangle - allow more text */
+:deep(.custom-node.shape-rectangle .custom-node-content .custom-node-label),
+:deep(.custom-node.shape-rounded-rectangle .custom-node-content .custom-node-label) {
+ -webkit-line-clamp: 4;
+ font-size: 13px;
+ max-width: calc(100% - 8px);
+}
+
+/* Circle - more constrained text */
+:deep(.custom-node.shape-circle .custom-node-content) {
+ padding: 15px 10px;
+}
+
+:deep(.custom-node.shape-circle .custom-node-content .custom-node-label) {
+ -webkit-line-clamp: 2;
+ font-size: 11px;
+ max-width: 80px;
+ line-height: 1.1;
+}
+
+/* Diamond - very constrained text due to angled shape */
+:deep(.custom-node.shape-diamond .custom-node-content) {
+ padding: 20px 15px;
+ /* DO NOT rotate the content - keep text readable */
+}
+
+:deep(.custom-node.shape-diamond .custom-node-content .custom-node-label) {
+ -webkit-line-clamp: 2;
+ font-size: 10px;
+ max-width: 70px;
+ line-height: 1.1;
+}
+
+/* Hexagon - moderate text space */
+:deep(.custom-node.shape-hexagon .custom-node-content .custom-node-label) {
+ -webkit-line-clamp: 3;
+ font-size: 11px;
+ max-width: calc(100% - 20px);
+}
+
+/* Parallelogram - slight skew consideration */
+:deep(.custom-node.shape-parallelogram .custom-node-content .custom-node-label) {
+ -webkit-line-clamp: 3;
+ font-size: 12px;
+ max-width: calc(100% - 16px);
+}
+
+/* Trapezoid - consider the angled sides */
+:deep(.custom-node.shape-trapezoid .custom-node-content .custom-node-label) {
+ -webkit-line-clamp: 3;
+ font-size: 11px;
+ max-width: calc(100% - 20px);
+}
+
+/* Responsive text sizing for smaller nodes */
+:deep(.custom-node) {
+ min-width: 100px;
+ min-height: 60px;
+}
+
+:deep(.custom-node.shape-circle) {
+ min-width: 120px;
+ min-height: 120px;
+}
+
+:deep(.custom-node.shape-diamond) {
+ min-width: 120px;
+ min-height: 120px;
+}
+
+/* Handle text overflow gracefully with tooltips */
+:deep(.custom-node .custom-node-content .custom-node-label[title]) {
+ cursor: help;
+}
+
+/* Improve readability on hover for overflowed text */
+:deep(.custom-node:hover .custom-node-content .custom-node-label) {
+ opacity: 0.8;
+}
+
+/* Additional text styling for node details */
+:deep(.custom-node .node-description) {
+ font-size: 10px;
+ color: var(--node-text-color, #6b7280);
+ text-align: center;
+ line-height: 1.2;
+ max-width: 100%;
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ margin: 2px 0;
+}
+
+:deep(.custom-node .node-rule-detail) {
+ font-size: 9px;
+ margin: 1px 0;
+}
+
+:deep(.custom-node .node-rule-detail-value) {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ max-width: 60px;
+}
+
+/* Shape-specific adjustments for detailed content */
+:deep(.custom-node.shape-circle .node-description),
+:deep(.custom-node.shape-circle .node-rule-detail) {
+ font-size: 8px;
+}
+
+:deep(.custom-node.shape-diamond .node-description),
+:deep(.custom-node.shape-diamond .node-rule-detail) {
+ font-size: 7px;
+ /* Keep text readable - do not rotate */
+}
+
+:deep(.custom-node.shape-diamond .node-rule-detail-value) {
+ max-width: 40px;
+}
+
+/* Better spacing for different node types */
+:deep(.custom-node .gateway-details),
+:deep(.custom-node .node-details) {
+ width: 100%;
+ padding: 2px 4px;
+ overflow: hidden;
+}
+
+/* Responsive font sizing based on node size */
+@media (max-width: 768px) {
+ :deep(.custom-node .custom-node-label) {
+ font-size: 10px;
+ }
+
+ :deep(.custom-node .node-description) {
+ font-size: 8px;
+ }
+
+ :deep(.custom-node .node-rule-detail) {
+ font-size: 7px;
+ }
+}
+
+/* Diamond shape handles */
+:deep(.custom-node.shape-diamond .vue-flow__handle) {
+ width: 10px;
+ height: 10px;
+}
+
+:deep(.custom-node.shape-diamond .handle-top) {
+ top: -5px;
+ left: 50%;
+ transform: translateX(-50%);
+}
+
+:deep(.custom-node.shape-diamond .handle-bottom) {
+ bottom: -5px;
+ left: 50%;
+ transform: translateX(-50%);
+}
+
+:deep(.custom-node.shape-diamond .handle-left) {
+ left: -5px;
+ top: 50%;
+ transform: translateY(-50%);
+}
+
+:deep(.custom-node.shape-diamond .handle-right) {
+ right: -5px;
+ top: 50%;
+ transform: translateY(-50%);
+}
+
+/* Hexagon shape handles */
+:deep(.custom-node.shape-hexagon .vue-flow__handle) {
+ width: 10px;
+ height: 10px;
+}
+
+:deep(.custom-node.shape-hexagon .handle-top) {
+ top: -5px;
+ left: 50%;
+ transform: translateX(-50%);
+}
+
+:deep(.custom-node.shape-hexagon .handle-bottom) {
+ bottom: -5px;
+ left: 50%;
+ transform: translateX(-50%);
+}
+
+:deep(.custom-node.shape-hexagon .handle-left) {
+ left: 5px;
+ top: 50%;
+ transform: translateY(-50%);
+}
+
+:deep(.custom-node.shape-hexagon .handle-right) {
+ right: 5px;
+ top: 50%;
+ transform: translateY(-50%);
+}
+
+/* Parallelogram shape handles */
+:deep(.custom-node.shape-parallelogram .vue-flow__handle) {
+ width: 10px;
+ height: 10px;
+}
+
+/* Trapezoid shape handles */
+:deep(.custom-node.shape-trapezoid .vue-flow__handle) {
+ width: 10px;
+ height: 10px;
+}
+
+:deep(.custom-node.shape-trapezoid .handle-top) {
+ top: -5px;
+ left: 50%;
+ transform: translateX(-50%);
+}
+
+:deep(.custom-node.shape-trapezoid .handle-bottom) {
+ bottom: -5px;
+ left: 50%;
+ transform: translateX(-50%);
+}
+
+:deep(.custom-node.shape-trapezoid .handle-left) {
+ left: 10px;
+ top: 50%;
+ transform: translateY(-50%);
+}
+
+:deep(.custom-node.shape-trapezoid .handle-right) {
+ right: 10px;
+ top: 50%;
+ transform: translateY(-50%);
+}
+
+/* Ensure handles have higher z-index for all shapes */
+:deep(.custom-node .vue-flow__handle) {
+ z-index: 1001 !important;
+ border: 2px solid white;
+ background: #555;
+ border-radius: 50%;
+}
+
+:deep(.custom-node .vue-flow__handle:hover) {
+ background: #3b82f6;
+ border-color: white;
+ transform: scale(1.2);
+}
+
:deep(.custom-node.selected) {
border-color: var(--flow-node-selected-color);
box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.3);
}
+/* Selection highlighting for shaped nodes */
+:deep(.custom-node.shape-hexagon.selected),
+:deep(.custom-node.shape-trapezoid.selected) {
+ border: none;
+ box-shadow: none;
+}
+
+:deep(.custom-node.shape-hexagon.selected::before) {
+ border-color: var(--flow-node-selected-color);
+ box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.3);
+}
+
+:deep(.custom-node.shape-trapezoid.selected::before) {
+ border-color: var(--flow-node-selected-color);
+ box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.3);
+}
+
+/* Hover effects for shaped nodes */
+:deep(.custom-node.shape-hexagon:hover::before),
+:deep(.custom-node.shape-trapezoid:hover::before) {
+ border-color: #999;
+}
+
+/* Override selection highlighting for other shapes that use transforms */
+:deep(.custom-node.shape-circle.selected) {
+ border-color: var(--flow-node-selected-color);
+ box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.3);
+}
+
+:deep(.custom-node.shape-diamond.selected) {
+ border-color: var(--flow-node-selected-color);
+ box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.3);
+}
+
+:deep(.custom-node.shape-parallelogram.selected) {
+ border-color: var(--flow-node-selected-color);
+ box-shadow: 0 0 0 2px rgba(59, 130, 246, 0.3);
+}
+
:deep(.custom-node-content) {
display: flex;
flex-direction: column;
@@ -1763,8 +2697,16 @@ watch(() => processStore.currentProcess, async (newProcess, oldProcess) => {
:deep(.node-gateway) {
transform: rotate(45deg);
- background: white;
- border: 2px solid #FF9800;
+ background: var(--node-bg-color, white);
+ border: 2px solid var(--node-border-color, #FF9800);
+ color: var(--node-text-color, #333333);
+}
+
+/* Override borders for gateway shaped nodes */
+:deep(.node-gateway.shape-hexagon),
+:deep(.node-gateway.shape-trapezoid) {
+ background: transparent;
+ border: none;
}
:deep(.node-gateway .custom-node-content) {
@@ -1779,22 +2721,56 @@ watch(() => processStore.currentProcess, async (newProcess, oldProcess) => {
:deep(.node-task), :deep(.node-form), :deep(.node-script) {
min-width: 160px;
- background: white;
- border: 1px solid #ddd;
+ background: var(--node-bg-color, white);
+ border: 1px solid var(--node-border-color, #ddd);
+ color: var(--node-text-color, #333333);
+}
+
+/* Override borders for shaped nodes */
+:deep(.node-task.shape-hexagon),
+:deep(.node-form.shape-hexagon),
+:deep(.node-script.shape-hexagon),
+:deep(.node-task.shape-trapezoid),
+:deep(.node-form.shape-trapezoid),
+:deep(.node-script.shape-trapezoid) {
+ background: transparent;
+ border: none;
+ box-shadow: none;
}
:deep(.node-business-rule) {
min-width: 160px;
- background: white;
- border: 1px solid #ddd;
- border-left: 4px solid #9333ea; /* Purple border to match our icon color */
+ background: var(--node-bg-color, white);
+ border: 1px solid var(--node-border-color, #ddd);
+ border-left: 4px solid var(--node-border-color, #9333ea); /* Purple border to match our icon color */
+ color: var(--node-text-color, #333333);
}
:deep(.node-notification) {
min-width: 160px;
- background: white;
- border: 1px solid #ddd;
- border-left: 4px solid #3b82f6; /* Blue border to match our icon color */
+ background: var(--node-bg-color, white);
+ border: 1px solid var(--node-border-color, #ddd);
+ border-left: 4px solid var(--node-border-color, #3b82f6); /* Blue border to match our icon color */
+ color: var(--node-text-color, #333333);
+}
+
+:deep(.node-api) {
+ min-width: 160px;
+ background: var(--node-bg-color, white);
+ border: 1px solid var(--node-border-color, #ddd);
+ border-left: 4px solid var(--node-border-color, #10b981); /* Green border for API nodes */
+ color: var(--node-text-color, #333333);
+}
+
+/* Override borders for shaped business-rule, notification, and api nodes */
+:deep(.node-business-rule.shape-hexagon),
+:deep(.node-business-rule.shape-trapezoid),
+:deep(.node-notification.shape-hexagon),
+:deep(.node-notification.shape-trapezoid),
+:deep(.node-api.shape-hexagon),
+:deep(.node-api.shape-trapezoid) {
+ background: transparent;
+ border: none;
}
:deep(.node-details) {