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) }}
%
}
预览
@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);
}
}
}