- Introduced a comprehensive node validation system in the process flow builder, enhancing the user experience by providing real-time feedback on node configurations and process integrity. - Added `useNodeValidation` composable to manage validation logic, including checks for required nodes, configuration completeness, and flow logic. - Integrated validation indicators in node components (ApiNode, FormNode, GatewayNode, ScriptNode) to visually represent validation issues. - Created `ValidationIndicator` and `ValidationTooltip` components for displaying validation statuses and detailed messages. - Updated `ProcessFlowCanvas.vue` to trigger validation on node and edge changes, ensuring immediate feedback during process design. - Enhanced `processBuilder` store to manage validation results and summary statistics, allowing for a centralized validation state. - Documented the validation system implementation plan to guide future enhancements and user training.
13 KiB
Node Validation System Implementation Plan
Overview
This document outlines the implementation plan for a comprehensive node validation system in the Vue Flow process builder. The system will provide visual feedback, quality-of-life improvements, and help users create robust business processes by validating process integrity and configuration completeness.
Problem Statement
Users need guidance when building business processes to ensure:
- Process flows are logically complete (have start/end nodes)
- Nodes are properly configured (forms selected, APIs configured, etc.)
- Variables are used correctly (no unused/undefined variables)
- Gateway decision paths are complete
- Process flows are reachable and don't have dead ends
System Architecture
Core Components
- Node Validation Composable (
composables/useNodeValidation.js
) - Validation Visual Indicators (warning icons, tooltips)
- Validation Store Integration (with processBuilder store)
- Real-time Validation Updates (reactive validation on changes)
Integration Points
- ProcessFlowCanvas.vue: Add validation visual layer
- Node Components: Add validation state display
- Process Builder Store: Integrate validation state
- Variable Store: Hook variable usage validation
Implementation Phases
Phase 1: Foundation & Easy Wins 🟢 START HERE
1.1 Core Validation Infrastructure
Files to Create:
composables/useNodeValidation.js
types/validation.js
(TypeScript definitions if needed)
Key Features:
// Basic validation composable structure
export function useNodeValidation() {
const validationResults = ref(new Map())
const isValidating = ref(false)
// Core validation functions
const validateNode = (node) => { /* ... */ }
const validateProcess = (nodes, edges) => { /* ... */ }
const getValidationIcon = (nodeId) => { /* ... */ }
const getValidationTooltip = (nodeId) => { /* ... */ }
return {
validationResults,
validateNode,
validateProcess,
// ... other methods
}
}
1.2 Basic Validation Rules (Quick Implementations)
1.2.1 Process Structure Validation
- ✅ Missing Start Node: Process must have exactly one start node
- ✅ Missing End Node: Process must have at least one end node
- ✅ Multiple Start Nodes: Warn if more than one start node exists
1.2.2 Node Configuration Validation
- ✅ Form Node - No Form Selected:
data.formId
is missing - ✅ API Node - No URL:
data.apiUrl
is empty/missing - ✅ Gateway Node - Insufficient Paths: Less than 2 outgoing edges
- ✅ Script Node - No Code:
data.code
is empty - ✅ Notification Node - No Content:
data.content
is missing
1.3 Visual Indicator System
1.3.1 Node Warning Overlay
<!-- Add to each node component -->
<div v-if="hasValidationIssues" class="validation-warning">
<Icon name="material-symbols:warning" class="warning-icon" />
</div>
1.3.2 Hover Tooltips
<!-- Tooltip component for validation messages -->
<Tooltip v-if="validationMessage" :content="validationMessage">
<Icon name="material-symbols:info" />
</Tooltip>
1.3.3 Canvas Integration
- Add validation overlay to
ProcessFlowCanvas.vue
- Show process-level validation summary
- Add validation toggle in canvas controls
Phase 2: Advanced Validations 🟡 MEDIUM PRIORITY
2.1 Variable Usage Analysis
2.1.1 Unused Variables Detection
// Check variables defined but never referenced
const findUnusedVariables = (processVariables, nodes) => {
const usedVariables = new Set()
// Scan all nodes for variable references
nodes.forEach(node => {
scanNodeForVariableUsage(node, usedVariables)
})
// Find variables not in usedVariables set
return Object.keys(processVariables).filter(
varName => !usedVariables.has(varName)
)
}
2.1.2 Undefined Variables Detection
// Check nodes referencing non-existent variables
const findUndefinedVariables = (processVariables, nodes) => {
const undefinedRefs = []
nodes.forEach(node => {
const referencedVars = extractVariableReferences(node)
referencedVars.forEach(varName => {
if (!processVariables[varName]) {
undefinedRefs.push({ nodeId: node.id, variable: varName })
}
})
})
return undefinedRefs
}
2.2 Flow Logic Validation
2.2.1 Reachability Analysis
// Find nodes unreachable from start
const findUnreachableNodes = (nodes, edges) => {
const startNodes = nodes.filter(n => n.type === 'start')
if (startNodes.length === 0) return nodes.map(n => n.id)
const reachable = new Set()
const queue = [...startNodes.map(n => n.id)]
while (queue.length > 0) {
const nodeId = queue.shift()
if (reachable.has(nodeId)) continue
reachable.add(nodeId)
const outgoingEdges = edges.filter(e => e.source === nodeId)
queue.push(...outgoingEdges.map(e => e.target))
}
return nodes.filter(n => !reachable.has(n.id)).map(n => n.id)
}
2.2.2 Dead End Detection
// Find nodes with no path to end (except end nodes)
const findDeadEnds = (nodes, edges) => {
const endNodes = nodes.filter(n => n.type === 'end')
if (endNodes.length === 0) return []
// Work backwards from end nodes
const reachable = new Set()
const queue = [...endNodes.map(n => n.id)]
while (queue.length > 0) {
const nodeId = queue.shift()
if (reachable.has(nodeId)) continue
reachable.add(nodeId)
const incomingEdges = edges.filter(e => e.target === nodeId)
queue.push(...incomingEdges.map(e => e.source))
}
return nodes
.filter(n => n.type !== 'end' && !reachable.has(n.id))
.map(n => n.id)
}
2.3 Gateway Completeness Validation
2.3.1 Condition Coverage
// Validate gateway has conditions for all paths
const validateGatewayConditions = (gatewayNode, edges) => {
const outgoingEdges = edges.filter(e => e.source === gatewayNode.id)
const conditions = gatewayNode.data?.conditions || []
const issues = []
// Check if each outgoing edge has a corresponding condition
outgoingEdges.forEach(edge => {
const hasCondition = conditions.some(cond =>
cond.output === edge.label || edge.label === gatewayNode.data?.defaultPath
)
if (!hasCondition) {
issues.push(`Edge to ${edge.target} has no condition defined`)
}
})
return issues
}
Phase 3: Real-time Integration 🔵 ADVANCED
3.1 Reactive Validation System
3.1.1 Process Store Integration
// In processBuilder store
watch(
() => [currentProcess.value?.nodes, currentProcess.value?.edges],
([nodes, edges]) => {
if (nodes && edges) {
validateProcess(nodes, edges)
}
},
{ deep: true }
)
3.1.2 Variable Store Integration
// In variableStore
watch(
() => processVariables.value,
(variables) => {
validateVariableUsage(variables)
},
{ deep: true }
)
3.2 Canvas UI Integration
3.2.1 Validation Summary Panel
<Panel position="top-left" class="validation-panel">
<div class="validation-summary">
<h4>Process Validation</h4>
<div class="validation-status" :class="overallStatus">
<Icon :name="statusIcon" />
<span>{{ statusText }}</span>
</div>
<div v-if="issues.length > 0" class="validation-issues">
<h5>Issues Found ({{ issues.length }})</h5>
<ul>
<li v-for="issue in issues" :key="issue.id" @click="focusIssue(issue)">
<Icon name="material-symbols:warning" />
{{ issue.message }}
</li>
</ul>
</div>
</div>
</Panel>
3.2.2 Node Validation Indicators
<!-- In each node component -->
<template>
<div class="custom-node" :class="nodeClasses">
<!-- Existing node content -->
<!-- Validation overlay -->
<div v-if="validationIssues.length > 0" class="validation-overlay">
<Tooltip :content="validationTooltip">
<Icon
name="material-symbols:warning"
class="validation-warning-icon"
:class="validationSeverity"
/>
</Tooltip>
</div>
</div>
</template>
Phase 4: User Experience Enhancements 🟣 POLISH
4.1 Validation Settings & Configuration
4.1.1 Validation Rules Configuration
// User configurable validation rules
const validationConfig = ref({
processStructure: {
requireStartNode: true,
requireEndNode: true,
allowMultipleStarts: false
},
nodeConfiguration: {
validateFormSelection: true,
validateApiUrls: true,
validateGatewayPaths: true
},
variableUsage: {
warnUnusedVariables: true,
errorUndefinedVariables: true
},
flowLogic: {
checkReachability: true,
checkDeadEnds: true
}
})
4.2 Validation Reporting & Export
4.2.1 Validation Report Generation
const generateValidationReport = () => {
return {
processId: currentProcess.value.id,
processName: currentProcess.value.name,
timestamp: new Date().toISOString(),
overallStatus: getOverallValidationStatus(),
summary: {
totalNodes: nodes.length,
validNodes: validNodes.length,
invalidNodes: invalidNodes.length,
warnings: warnings.length,
errors: errors.length
},
issues: validationResults.value,
recommendations: generateRecommendations()
}
}
Validation Rule Categories
1. Critical Errors (🔴 Red - Blocks Process Execution)
- No start node
- Unreachable nodes
- Undefined variable references
- Invalid API configurations
2. Warnings (🟡 Yellow - Should Fix)
- No end node
- Unused variables
- Missing form selections
- Incomplete gateway conditions
3. Suggestions (🔵 Blue - Best Practices)
- Process naming conventions
- Variable naming standards
- Node organization recommendations
- Performance optimizations
Implementation Checklist
Phase 1 Tasks
- Create
useNodeValidation
composable - Implement basic process structure validation
- Add node configuration validation
- Create validation visual indicators
- Add warning icons to nodes
- Implement hover tooltips
- Integrate with ProcessFlowCanvas
Phase 2 Tasks
- Variable usage analysis
- Flow reachability validation
- Dead end detection
- Gateway condition validation
- Advanced validation algorithms
Phase 3 Tasks
- Real-time validation updates
- Process store integration
- Variable store integration
- Canvas UI enhancements
Phase 4 Tasks
- Validation settings configuration
- Validation reporting system
- Export functionality
- Performance optimization
Technical Considerations
Performance
- Use debounced validation to avoid excessive re-computation
- Implement validation caching for unchanged nodes
- Consider web workers for complex validation algorithms
User Experience
- Non-blocking validation (warnings, not errors)
- Progressive disclosure of validation details
- Quick-fix suggestions where possible
- Keyboard shortcuts for validation navigation
Extensibility
- Plugin-based validation rule system
- Custom validation rules API
- Integration with external validation services
Testing Strategy
Unit Tests
- Individual validation rule functions
- Validation composable methods
- Edge case handling
Integration Tests
- Canvas integration validation
- Store integration testing
- Real-time update validation
User Testing
- Validation feedback effectiveness
- Performance impact assessment
- User workflow integration
Success Metrics
Quantitative
- Reduction in invalid process deployments
- Decrease in process runtime errors
- User validation engagement rate
- Performance impact measurement
Qualitative
- User feedback on validation helpfulness
- Process builder confidence improvement
- Reduced support requests for process issues
Future Enhancements
Advanced Features
- AI-powered process optimization suggestions
- Best practice recommendations
- Validation rule learning from user patterns
- Integration with process analytics
Enterprise Features
- Organization-wide validation policies
- Compliance validation rules
- Audit trail for validation fixes
- Team validation collaboration tools
Getting Started
- Start with Phase 1 - Basic validation infrastructure
- Test thoroughly - Ensure foundation is solid
- Iterate quickly - Get user feedback early
- Build incrementally - Add complexity gradually
This document serves as the master plan for implementing a comprehensive node validation system that will significantly improve the user experience and process quality in the Vue Flow process builder.