Няма описание
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

project-tab.component.html 8.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231
  1. <div class="project-tab-container" [style.gridTemplateColumns]="leftWidth + 'px 8px ' + middleWidth + 'px 8px 1fr'">
  2. <!-- 左侧面板:项目信息和步骤列表 -->
  3. <div class="left-panel">
  4. @if (project) {
  5. <!-- 项目信息卡片 -->
  6. <mat-card class="project-info-card">
  7. <mat-card-header>
  8. <mat-card-title>{{ project.title }}</mat-card-title>
  9. <mat-card-subtitle>
  10. <span class="agent-chip">{{ getAgentDisplayName(project.agent_name) }}</span>
  11. <span class="status-chip" [class]="getStatusClass(project.status)">
  12. {{ getStatusDisplayName(project.status) }}
  13. </span>
  14. </mat-card-subtitle>
  15. </mat-card-header>
  16. <mat-card-content>
  17. @if (project.description) {
  18. <p class="project-description">{{ project.description }}</p>
  19. }
  20. <div class="project-meta">
  21. <div class="meta-item">
  22. <mat-icon>person</mat-icon>
  23. <span>{{ project.user_id || '未知用户' }}</span>
  24. </div>
  25. <div class="meta-item">
  26. <mat-icon>calendar_today</mat-icon>
  27. <span>{{ formatDate(project.created_at) }}</span>
  28. </div>
  29. </div>
  30. <!-- 进度条 -->
  31. <div class="progress-section">
  32. <div class="progress-label">项目进度</div>
  33. <mat-progress-bar
  34. mode="determinate"
  35. [value]="getProgressValue(project.status)">
  36. </mat-progress-bar>
  37. <div class="progress-text">{{ getProgressText(project.status) }}</div>
  38. </div>
  39. <!-- 最新日志 -->
  40. <div class="latest-log">
  41. <div class="log-header">
  42. <mat-icon>info</mat-icon>
  43. <span>最新日志</span>
  44. </div>
  45. <div class="log-content">项目已创建,等待需求文档输入</div>
  46. </div>
  47. </mat-card-content>
  48. </mat-card>
  49. <!-- 步骤列表 -->
  50. <mat-accordion class="steps-accordion" multi>
  51. <!-- 需求文档 -->
  52. <mat-expansion-panel [expanded]="project.status === 'requirement_document'">
  53. <mat-expansion-panel-header>
  54. <mat-panel-title>
  55. <mat-icon>description</mat-icon>
  56. <span>需求文档</span>
  57. </mat-panel-title>
  58. <mat-panel-description>
  59. @if (project.status === 'requirement_document') {
  60. <span class="current-step">当前步骤</span>
  61. }
  62. </mat-panel-description>
  63. </mat-expansion-panel-header>
  64. <div class="step-content">
  65. <p>详细描述项目需求和目标</p>
  66. <button mat-button color="primary" (click)="focusRequirementInput()">
  67. <mat-icon>edit</mat-icon>
  68. 编辑需求
  69. </button>
  70. </div>
  71. </mat-expansion-panel>
  72. <!-- 技术文档 -->
  73. <mat-expansion-panel [expanded]="project.status === 'technical_document'">
  74. <mat-expansion-panel-header>
  75. <mat-panel-title>
  76. <mat-icon>code</mat-icon>
  77. <span>技术文档</span>
  78. </mat-panel-title>
  79. <mat-panel-description>
  80. @if (project.status === 'technical_document') {
  81. <span class="current-step">当前步骤</span>
  82. }
  83. </mat-panel-description>
  84. </mat-expansion-panel-header>
  85. <div class="step-content">
  86. <p>技术架构和实现方案</p>
  87. <div class="step-status">待完成</div>
  88. </div>
  89. </mat-expansion-panel>
  90. <!-- 代码开发 -->
  91. <mat-expansion-panel [expanded]="project.status === 'code'">
  92. <mat-expansion-panel-header>
  93. <mat-panel-title>
  94. <mat-icon>terminal</mat-icon>
  95. <span>代码开发</span>
  96. </mat-panel-title>
  97. <mat-panel-description>
  98. @if (project.status === 'code') {
  99. <span class="current-step">当前步骤</span>
  100. }
  101. </mat-panel-description>
  102. </mat-expansion-panel-header>
  103. <div class="step-content">
  104. <p>自动生成的代码步骤</p>
  105. <mat-list dense>
  106. <mat-list-item>
  107. <mat-icon matListItemIcon>looks_one</mat-icon>
  108. <div matListItemTitle>步骤1: 数据模型设计</div>
  109. </mat-list-item>
  110. <mat-list-item>
  111. <mat-icon matListItemIcon>looks_two</mat-icon>
  112. <div matListItemTitle>步骤2: API接口开发</div>
  113. </mat-list-item>
  114. <mat-list-item>
  115. <mat-icon matListItemIcon>looks_3</mat-icon>
  116. <div matListItemTitle>步骤3: 前端页面实现</div>
  117. </mat-list-item>
  118. </mat-list>
  119. </div>
  120. </mat-expansion-panel>
  121. <!-- 测试 -->
  122. <mat-expansion-panel [expanded]="project.status === 'test'">
  123. <mat-expansion-panel-header>
  124. <mat-panel-title>
  125. <mat-icon>bug_report</mat-icon>
  126. <span>测试</span>
  127. </mat-panel-title>
  128. <mat-panel-description>
  129. @if (project.status === 'test') {
  130. <span class="current-step">当前步骤</span>
  131. }
  132. </mat-panel-description>
  133. </mat-expansion-panel-header>
  134. <div class="step-content">
  135. <p>功能测试和验证</p>
  136. <div class="step-status">待完成</div>
  137. </div>
  138. </mat-expansion-panel>
  139. <!-- 发布 -->
  140. <mat-expansion-panel [expanded]="project.status === 'release'">
  141. <mat-expansion-panel-header>
  142. <mat-panel-title>
  143. <mat-icon>rocket_launch</mat-icon>
  144. <span>发布</span>
  145. </mat-panel-title>
  146. <mat-panel-description>
  147. @if (project.status === 'release') {
  148. <span class="current-step">当前步骤</span>
  149. }
  150. </mat-panel-description>
  151. </mat-expansion-panel-header>
  152. <div class="step-content">
  153. <p>部署和发布上线</p>
  154. <div class="step-status">待完成</div>
  155. </div>
  156. </mat-expansion-panel>
  157. </mat-accordion>
  158. <!-- 文档列表 -->
  159. <div class="document-list-section">
  160. <app-document-list
  161. [documents]="documentSessions"
  162. [defaultExpanded]="false">
  163. </app-document-list>
  164. </div>
  165. } @else {
  166. <div class="no-project">
  167. <mat-icon>error</mat-icon>
  168. <p>未找到项目信息</p>
  169. </div>
  170. }
  171. </div>
  172. <!-- 左侧分割线(调整左侧宽度) -->
  173. <div class="splitter left-splitter"
  174. (mousedown)="startDrag($event)"
  175. [class.dragging]="isDragging">
  176. <div class="splitter-handle"></div>
  177. </div>
  178. <!-- 中间面板:对话区域 -->
  179. <div class="middle-panel">
  180. @if (project) {
  181. <div class="conversation-wrapper">
  182. <app-conversation
  183. [instanceId]="effectiveInstanceId"
  184. [sessionId]="project.id"
  185. [independentEventService]="independentEventService">
  186. </app-conversation>
  187. </div>
  188. } @else {
  189. <div class="loading-placeholder">
  190. <mat-spinner diameter="40"></mat-spinner>
  191. <p>加载项目对话...</p>
  192. </div>
  193. }
  194. </div>
  195. <!-- 中间分割线(调整中间宽度) -->
  196. <div class="splitter middle-splitter"
  197. (mousedown)="startMiddleDrag($event)"
  198. [class.dragging]="isDraggingMiddle">
  199. <div class="splitter-handle"></div>
  200. </div>
  201. <!-- 右侧面板:AI回复显示框 -->
  202. <div class="right-panel">
  203. @if (project) {
  204. <div class="ai-response-wrapper">
  205. <app-ai-response
  206. [multipleSessionIds]="getDocumentSessionIds()"
  207. [sessionId]="project.id"
  208. [independentEventService]="independentEventService">
  209. </app-ai-response>
  210. </div>
  211. } @else {
  212. <div class="loading-placeholder">
  213. <p>加载AI响应...</p>
  214. </div>
  215. }
  216. </div>
  217. </div>