123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110 |
- <div class="header">
- <div class="toolbar">
- <!-- <div class="buttons-start">
- <button class="back-button" (click)="goBack()">
- <svg class="icon" viewBox="0 0 512 512">
- <path fill="currentColor" d="M256 48C141.13 48 48 141.13 48 256s93.13 208 208 208 208-93.13 208-208S370.87 48 256 48zm35.31 292.69a16 16 0 11-22.62 22.62l-96-96a16 16 0 010-22.62l96-96a16 16 0 0122.62 22.62L206.63 256z"/>
- </svg>
- </button>
- </div> -->
- <div class="title">{{ project?.get('title') || '项目详情' }}</div>
- <!-- <div class="buttons-end">
- <button class="icon-button">
- <svg class="icon" viewBox="0 0 512 512">
- <path fill="currentColor" d="M256 176a32 32 0 11-32 32 32 32 0 0132-32zM256 80a32 32 0 11-32 32 32 32 0 0132-32zM256 272a32 32 0 11-32 32 32 32 0 0132-32z"/>
- </svg>
- </button>
- </div> -->
- </div>
- <!-- 四阶段导航 -->
- <div class="stage-toolbar">
- <div class="stage-navigation">
- @for (stage of stages; track stage.id) {
- <div
- class="stage-item"
- [class.completed]="getStageStatus(stage.id) === 'completed'"
- [class.active]="getStageStatus(stage.id) === 'active'"
- [class.pending]="getStageStatus(stage.id) === 'pending'"
- (click)="switchStage(stage.id)">
- <div class="stage-circle">
- @if (getStageStatus(stage.id) === 'completed') {
- <svg class="icon" viewBox="0 0 512 512">
- <path fill="currentColor" d="M448 256c0-106-86-192-192-192S64 150 64 256s86 192 192 192 192-86 192-192z" opacity=".3"/>
- <path fill="currentColor" d="M352 176L217.6 336 160 272"/>
- </svg>
- } @else {
- <span>{{ stage.number }}</span>
- }
- </div>
- <div class="stage-label">{{ stage.name }}</div>
- </div>
- @if (!$last) {
- <div class="stage-connector" [class.completed]="getStageStatus(stage.id) === 'completed'"></div>
- }
- }
- </div>
- </div>
- </div>
- <div class="content">
- <!-- 加载中 -->
- @if (loading) {
- <div class="loading-container">
- <div class="spinner">
- <div class="spinner-circle"></div>
- </div>
- <p>加载项目信息...</p>
- </div>
- }
- <!-- 错误 -->
- @if (error && !loading) {
- <div class="error-container">
- <svg class="icon error-icon" viewBox="0 0 512 512">
- <path fill="currentColor" d="M256 48C141.31 48 48 141.31 48 256s93.31 208 208 208 208-93.31 208-208S370.69 48 256 48zm0 319.91a20 20 0 1120-20 20 20 0 01-20 20zm21.72-201.15l-5.74 122a16 16 0 01-32 0l-5.74-121.94v-.05a21.74 21.74 0 1143.44 0z"/>
- </svg>
- <p>{{ error }}</p>
- <button class="button outline" (click)="loadData()">重试</button>
- </div>
- }
- <!-- 项目详情内容 -->
- @if (!loading && !error && project) {
- <!-- 客户信息快速查看卡片 -->
- <div class="customer-quick-view">
- <div class="card">
- <div class="card-content">
- <div class="customer-info">
- <div class="avatar">
- @if (customer?.get('data')?.avatar) {
- <img [src]="customer?.get('data')?.avatar" alt="客户头像" />
- } @else {
- <svg class="icon avatar-icon" viewBox="0 0 512 512">
- <path fill="currentColor" d="M256 48C141.31 48 48 141.31 48 256s93.31 208 208 208 208-93.31 208-208S370.69 48 256 48zm0 60a60 60 0 11-60 60 60 60 0 0160-60zm0 336c-63.6 0-119.92-36.47-146.39-89.68C109.74 329.09 176.24 296 256 296s146.26 33.09 146.39 58.32C376.92 407.53 319.6 444 256 444z"/>
- </svg>
- }
- </div>
- <div class="info-text">
- <h3>{{ customer?.get('name') || '待设置' }}</h3>
- @if (canViewCustomerPhone) {
- <p>{{ customer?.get('mobile') }}</p>
- }
- <div class="tags">
- <span class="badge badge-primary">{{ customer?.get('source') }}</span>
- <span class="badge" [class.badge-success]="project.get('status') === '进行中'" [class.badge-warning]="project.get('status') !== '进行中'">
- {{ project.get('status') }}
- </span>
- </div>
- </div>
- </div>
- </div>
- </div>
- </div>
- <!-- 子路由内容(各阶段组件) -->
- <div class="stage-content">
- <router-outlet></router-outlet>
- </div>
- }
- </div>
|