- 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.
463 lines
13 KiB
Markdown
463 lines
13 KiB
Markdown
# 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
|
|
1. **Node Validation Composable** (`composables/useNodeValidation.js`)
|
|
2. **Validation Visual Indicators** (warning icons, tooltips)
|
|
3. **Validation Store Integration** (with processBuilder store)
|
|
4. **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:**
|
|
```javascript
|
|
// 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**
|
|
```vue
|
|
<!-- 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**
|
|
```vue
|
|
<!-- 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**
|
|
```javascript
|
|
// 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**
|
|
```javascript
|
|
// 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**
|
|
```javascript
|
|
// 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**
|
|
```javascript
|
|
// 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**
|
|
```javascript
|
|
// 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**
|
|
```javascript
|
|
// 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**
|
|
```javascript
|
|
// In variableStore
|
|
watch(
|
|
() => processVariables.value,
|
|
(variables) => {
|
|
validateVariableUsage(variables)
|
|
},
|
|
{ deep: true }
|
|
)
|
|
```
|
|
|
|
#### 3.2 Canvas UI Integration
|
|
|
|
**3.2.1 Validation Summary Panel**
|
|
```vue
|
|
<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**
|
|
```vue
|
|
<!-- 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**
|
|
```javascript
|
|
// 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**
|
|
```javascript
|
|
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
|
|
|
|
1. **Start with Phase 1** - Basic validation infrastructure
|
|
2. **Test thoroughly** - Ensure foundation is solid
|
|
3. **Iterate quickly** - Get user feedback early
|
|
4. **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. |