corrad-bp/components/process-flow/ValidationIndicator.vue
Md Afiq Iskandar f4eff35c4b Add Validation System Test Guide and Enhance Validation Panel Functionality
- Introduced a new `validation-test-guide.md` file detailing the testing process for the node validation system, including test cases and expected outcomes.
- Updated `ProcessFlowCanvas.vue` to integrate a collapsible validation panel, allowing users to toggle visibility and view validation statuses and issues in real-time.
- Enhanced the validation indicators and tooltips in `ValidationIndicator.vue` and `ValidationTooltip.vue` to provide clearer feedback on validation issues with improved styling and severity color coding.
- Removed the deprecated `vue-flow-custom-nodes-migration.md` and `vue-flow-migration-completed-final.md` documentation files to streamline project documentation.
- Adjusted styles in `ValidationTooltip.vue` for better visibility and user experience, ensuring tooltips are informative and visually distinct based on severity.
- Updated `index.vue` to ensure proper text color inheritance for custom nodes, enhancing overall UI consistency.
2025-07-29 09:50:22 +08:00

165 lines
3.9 KiB
Vue

<script setup>
import { computed } from 'vue'
import ValidationTooltip from './ValidationTooltip.vue'
const props = defineProps({
nodeId: {
type: String,
required: true
},
validationIssues: {
type: Array,
default: () => []
},
showTooltip: {
type: Boolean,
default: true
}
})
// Computed properties for validation display
const hasIssues = computed(() => props.validationIssues.length > 0)
const validationSeverity = computed(() => {
if (!hasIssues.value) return null
const hasError = props.validationIssues.some(issue => issue.severity === 'error')
const hasWarning = props.validationIssues.some(issue => issue.severity === 'warning')
if (hasError) return 'error'
if (hasWarning) return 'warning'
return 'info'
})
const validationIcon = computed(() => {
switch (validationSeverity.value) {
case 'error': return 'material-symbols:error'
case 'warning': return 'material-symbols:warning'
case 'info': return 'material-symbols:info'
default: return null
}
})
const validationTooltip = computed(() => {
if (!hasIssues.value) return null
const issuesByType = {
error: props.validationIssues.filter(i => i.severity === 'error'),
warning: props.validationIssues.filter(i => i.severity === 'warning'),
info: props.validationIssues.filter(i => i.severity === 'info')
}
const lines = []
if (issuesByType.error.length > 0) {
lines.push('ERRORS:')
issuesByType.error.forEach(issue => lines.push(`${issue.message}`))
}
if (issuesByType.warning.length > 0) {
if (lines.length > 0) lines.push('')
lines.push('WARNINGS:')
issuesByType.warning.forEach(issue => lines.push(`${issue.message}`))
}
if (issuesByType.info.length > 0) {
if (lines.length > 0) lines.push('')
lines.push('INFO:')
issuesByType.info.forEach(issue => lines.push(`${issue.message}`))
}
return lines.join('\n')
})
const severityClass = computed(() => {
return `validation-${validationSeverity.value}`
})
const severityColorClass = computed(() => {
switch (validationSeverity.value) {
case 'error': return '!text-red-500'
case 'warning': return '!text-yellow-500'
case 'info': return '!text-blue-500'
default: return ''
}
})
</script>
<template>
<div
v-if="hasIssues"
class="validation-indicator"
:class="severityClass"
>
<ValidationTooltip
v-if="showTooltip"
:content="validationTooltip"
:severity="validationSeverity"
position="top"
>
<Icon
:name="validationIcon"
:class="severityColorClass"
class="validation-icon"
></Icon>
</ValidationTooltip>
<!-- Fallback without tooltip -->
<Icon
v-else
:name="validationIcon"
:class="severityColorClass"
class="validation-icon"
></Icon>
<!-- Badge with issue count -->
<span
v-if="validationIssues.length > 1"
class="validation-badge"
:class="severityClass"
>
{{ validationIssues.length }}
</span>
</div>
</template>
<style scoped>
.validation-indicator {
@apply absolute -top-2 -right-2 z-50 flex items-center justify-center;
@apply w-6 h-6 rounded-full bg-white border-2 shadow-sm;
pointer-events: auto;
cursor: help;
}
.validation-indicator.validation-error {
@apply border-red-500 bg-red-50;
}
.validation-indicator.validation-warning {
@apply border-yellow-500 bg-yellow-50;
}
.validation-indicator.validation-info {
@apply border-blue-500 bg-blue-50;
}
.validation-icon {
@apply text-sm;
}
.validation-badge {
@apply absolute -top-1 -right-1 w-4 h-4 rounded-full text-xs;
@apply flex items-center justify-center text-white font-bold;
@apply bg-red-500;
}
.validation-badge.validation-warning {
@apply bg-yellow-500;
}
.validation-badge.validation-info {
@apply bg-blue-500;
}
/* Remove old tooltip styles - now using ValidationTooltip component */
</style>