import { Component, Inject } from '@angular/core'; import { CommonModule } from '@angular/common'; import { FormsModule } from '@angular/forms'; import { MatDialogRef, MAT_DIALOG_DATA, MatDialogModule } from '@angular/material/dialog'; import { MatButtonModule } from '@angular/material/button'; import { MatFormFieldModule } from '@angular/material/form-field'; import { MatSelectModule } from '@angular/material/select'; import { MatInputModule } from '@angular/material/input'; import { MatIconModule } from '@angular/material/icon'; import { MatChipsModule } from '@angular/material/chips'; export interface ComparisonItemData { name: string; category: string; icon: string; iconClass: string; metrics: { [key: string]: string }; } export interface DialogData { dimension: string; availableMetrics: string[]; } @Component({ selector: 'app-add-comparison-dialog', standalone: true, imports: [ CommonModule, FormsModule, MatDialogModule, MatButtonModule, MatFormFieldModule, MatSelectModule, MatInputModule, MatIconModule, MatChipsModule ], template: `

add_circle 添加对比项

项目名称 edit
项目类别 研发部门 创意部门 策略部门 执行部门 支持部门 管理部门
图标 code 代码 (技术) palette 调色板 (设计) lightbulb 灯泡 (创意) trending_up 趋势 (运营) groups 团队 (人事) analytics 分析 (数据) campaign 营销 (市场) support 支持 (客服)

绩效指标设置

@for (metric of data.availableMetrics; track metric) { {{ getMetricDisplayName(metric) }} % }

预览

{{ itemData.icon }}

{{ itemData.name || '新项目' }}

{{ itemData.category || '未分类' }}
@for (metric of data.availableMetrics; track metric) {
{{ getMetricDisplayName(metric) }} {{ itemData.metrics[metric] || '0%' }}
}
`, styleUrls: ['../../../shared/styles/_hr-dialog.scss'] }) export class AddComparisonDialogComponent { itemData: ComparisonItemData = { name: '', category: '', icon: 'add_circle', iconClass: 'new-icon', metrics: {} }; constructor( public dialogRef: MatDialogRef, @Inject(MAT_DIALOG_DATA) public data: DialogData ) { // 初始化指标数据 this.data.availableMetrics.forEach(metric => { this.itemData.metrics[metric] = '0%'; }); } getMetricDisplayName(metric: string): string { const metricNames: { [key: string]: string } = { 'completion': '完成率', 'quality': '质量评分', 'efficiency': '效率指数', 'satisfaction': '满意度', 'innovation': '创新度' }; return metricNames[metric] || metric; } updateIconClass(): void { const iconClassMap: { [key: string]: string } = { 'code': 'tech-icon', 'palette': 'design-icon', 'lightbulb': 'product-icon', 'trending_up': 'operation-icon', 'groups': 'hr-icon', 'analytics': 'data-icon', 'campaign': 'marketing-icon', 'support': 'support-icon' }; this.itemData.iconClass = iconClassMap[this.itemData.icon] || 'new-icon'; } formatMetricValue(metric: string): void { let value = this.itemData.metrics[metric]; if (value && !value.endsWith('%')) { // 移除非数字字符,只保留数字 const numericValue = value.replace(/[^\d]/g, ''); if (numericValue) { // 确保值在0-100范围内 const num = Math.min(100, Math.max(0, parseInt(numericValue))); this.itemData.metrics[metric] = num + '%'; } else { this.itemData.metrics[metric] = '0%'; } } } isValid(): boolean { return !!(this.itemData.name && this.itemData.category && this.itemData.icon); } onCancel(): void { this.dialogRef.close(); } onConfirm(): void { if (this.isValid()) { this.dialogRef.close(this.itemData); } } }