123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228 |
- 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: `
- <h2 mat-dialog-title>
- <mat-icon>add_circle</mat-icon>
- 添加对比项
- </h2>
-
- <mat-dialog-content>
- <div class="form-section">
- <mat-form-field appearance="outline" class="full-width">
- <mat-label>项目名称</mat-label>
- <input matInput [(ngModel)]="itemData.name" placeholder="请输入项目名称">
- <mat-icon matSuffix>edit</mat-icon>
- </mat-form-field>
- </div>
- <div class="form-section">
- <mat-form-field appearance="outline" class="full-width">
- <mat-label>项目类别</mat-label>
- <mat-select [(value)]="itemData.category">
- <mat-option value="研发部门">研发部门</mat-option>
- <mat-option value="创意部门">创意部门</mat-option>
- <mat-option value="策略部门">策略部门</mat-option>
- <mat-option value="执行部门">执行部门</mat-option>
- <mat-option value="支持部门">支持部门</mat-option>
- <mat-option value="管理部门">管理部门</mat-option>
- </mat-select>
- </mat-form-field>
- </div>
- <div class="form-section">
- <mat-form-field appearance="outline" class="full-width">
- <mat-label>图标</mat-label>
- <mat-select [(value)]="itemData.icon" (selectionChange)="updateIconClass()">
- <mat-option value="code">
- <mat-icon>code</mat-icon>
- 代码 (技术)
- </mat-option>
- <mat-option value="palette">
- <mat-icon>palette</mat-icon>
- 调色板 (设计)
- </mat-option>
- <mat-option value="lightbulb">
- <mat-icon>lightbulb</mat-icon>
- 灯泡 (创意)
- </mat-option>
- <mat-option value="trending_up">
- <mat-icon>trending_up</mat-icon>
- 趋势 (运营)
- </mat-option>
- <mat-option value="groups">
- <mat-icon>groups</mat-icon>
- 团队 (人事)
- </mat-option>
- <mat-option value="analytics">
- <mat-icon>analytics</mat-icon>
- 分析 (数据)
- </mat-option>
- <mat-option value="campaign">
- <mat-icon>campaign</mat-icon>
- 营销 (市场)
- </mat-option>
- <mat-option value="support">
- <mat-icon>support</mat-icon>
- 支持 (客服)
- </mat-option>
- </mat-select>
- </mat-form-field>
- </div>
- <h3>绩效指标设置</h3>
- <div class="metrics-grid">
- @for (metric of data.availableMetrics; track metric) {
- <mat-form-field appearance="outline">
- <mat-label>{{ getMetricDisplayName(metric) }}</mat-label>
- <input
- matInput
- [(ngModel)]="itemData.metrics[metric]"
- placeholder="0-100%"
- pattern="[0-9]+%?"
- (blur)="formatMetricValue(metric)">
- <span matSuffix>%</span>
- </mat-form-field>
- }
- </div>
- <div class="preview-section">
- <h3>预览</h3>
- <div class="item-preview">
- <div class="preview-header">
- <mat-icon [class]="itemData.iconClass">{{ itemData.icon }}</mat-icon>
- <div class="preview-info">
- <h4>{{ itemData.name || '新项目' }}</h4>
- <span class="preview-category">{{ itemData.category || '未分类' }}</span>
- </div>
- </div>
- <div class="preview-metrics">
- @for (metric of data.availableMetrics; track metric) {
- <div class="metric-preview">
- <span class="metric-name">{{ getMetricDisplayName(metric) }}</span>
- <span class="metric-value">{{ itemData.metrics[metric] || '0%' }}</span>
- </div>
- }
- </div>
- </div>
- </div>
- </mat-dialog-content>
-
- <mat-dialog-actions align="end">
- <button mat-button (click)="onCancel()">取消</button>
- <button mat-raised-button color="primary" (click)="onConfirm()" [disabled]="!isValid()">
- <mat-icon>add</mat-icon>
- 添加
- </button>
- </mat-dialog-actions>
- `,
- styleUrls: ['../../../shared/styles/_hr-dialog.scss']
- })
- export class AddComparisonDialogComponent {
- itemData: ComparisonItemData = {
- name: '',
- category: '',
- icon: 'add_circle',
- iconClass: 'new-icon',
- metrics: {}
- };
- constructor(
- public dialogRef: MatDialogRef<AddComparisonDialogComponent>,
- @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);
- }
- }
- }
|