project-detail.component.html 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. <div class="header">
  2. <div class="toolbar">
  3. <!-- <div class="buttons-start">
  4. <button class="back-button" (click)="goBack()">
  5. <svg class="icon" viewBox="0 0 512 512">
  6. <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"/>
  7. </svg>
  8. </button>
  9. </div> -->
  10. <div class="title">{{ project?.get('title') || '项目详情' }}</div>
  11. <!-- <div class="buttons-end">
  12. <button class="icon-button">
  13. <svg class="icon" viewBox="0 0 512 512">
  14. <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"/>
  15. </svg>
  16. </button>
  17. </div> -->
  18. </div>
  19. <!-- 四阶段导航 -->
  20. <div class="stage-toolbar">
  21. <div class="stage-navigation">
  22. @for (stage of stages; track stage.id) {
  23. <div
  24. class="stage-item"
  25. [class.completed]="getStageStatus(stage.id) === 'completed'"
  26. [class.active]="getStageStatus(stage.id) === 'active'"
  27. [class.pending]="getStageStatus(stage.id) === 'pending'"
  28. (click)="switchStage(stage.id)">
  29. <div class="stage-circle">
  30. @if (getStageStatus(stage.id) === 'completed') {
  31. <svg class="icon" viewBox="0 0 512 512">
  32. <path fill="currentColor" d="M448 256c0-106-86-192-192-192S64 150 64 256s86 192 192 192 192-86 192-192z" opacity=".3"/>
  33. <path fill="currentColor" d="M352 176L217.6 336 160 272"/>
  34. </svg>
  35. } @else {
  36. <span>{{ stage.number }}</span>
  37. }
  38. </div>
  39. <div class="stage-label">{{ stage.name }}</div>
  40. </div>
  41. @if (!$last) {
  42. <div class="stage-connector" [class.completed]="getStageStatus(stage.id) === 'completed'"></div>
  43. }
  44. }
  45. </div>
  46. </div>
  47. </div>
  48. <div class="content">
  49. <!-- 加载中 -->
  50. @if (loading) {
  51. <div class="loading-container">
  52. <div class="spinner">
  53. <div class="spinner-circle"></div>
  54. </div>
  55. <p>加载项目信息...</p>
  56. </div>
  57. }
  58. <!-- 错误 -->
  59. @if (error && !loading) {
  60. <div class="error-container">
  61. <svg class="icon error-icon" viewBox="0 0 512 512">
  62. <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"/>
  63. </svg>
  64. <p>{{ error }}</p>
  65. <button class="button outline" (click)="loadData()">重试</button>
  66. </div>
  67. }
  68. <!-- 项目详情内容 -->
  69. @if (!loading && !error && project) {
  70. <!-- 客户信息快速查看卡片 -->
  71. <div class="customer-quick-view">
  72. <div class="card">
  73. <div class="card-content">
  74. <div class="customer-info">
  75. <div class="avatar">
  76. @if (customer?.get('data')?.avatar) {
  77. <img [src]="customer?.get('data')?.avatar" alt="客户头像" />
  78. } @else {
  79. <svg class="icon avatar-icon" viewBox="0 0 512 512">
  80. <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"/>
  81. </svg>
  82. }
  83. </div>
  84. <div class="info-text">
  85. <h3>{{ customer?.get('name') || '待设置' }}</h3>
  86. @if (canViewCustomerPhone) {
  87. <p>{{ customer?.get('mobile') }}</p>
  88. }
  89. <div class="tags">
  90. <span class="badge badge-primary">{{ customer?.get('source') }}</span>
  91. <span class="badge" [class.badge-success]="project.get('status') === '进行中'" [class.badge-warning]="project.get('status') !== '进行中'">
  92. {{ project.get('status') }}
  93. </span>
  94. </div>
  95. </div>
  96. </div>
  97. </div>
  98. </div>
  99. </div>
  100. <!-- 子路由内容(各阶段组件) -->
  101. <div class="stage-content">
  102. <router-outlet></router-outlet>
  103. </div>
  104. }
  105. </div>