dashboard.html 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. <!-- 顶部导航栏 -->
  2. <nav class="top-navbar">
  3. <div class="navbar-left">
  4. <h2 class="navbar-title">设计组长工作台</h2>
  5. </div>
  6. <div class="navbar-right">
  7. <div class="date-display">
  8. {{ currentDate.toLocaleDateString('zh-CN', { year: 'numeric', month: 'long', day: 'numeric', weekday: 'long' }) }}
  9. </div>
  10. <div class="user-profile">
  11. <img [src]="currentUser.avatar" [alt]="currentUser.name + '头像'" class="user-avatar">
  12. <span class="user-name">{{ currentUser.name }}</span>
  13. <span class="user-role">{{ currentUser.roleName }}</span>
  14. </div>
  15. </div>
  16. </nav>
  17. <header class="dashboard-header">
  18. <!-- 统计指标卡片组件 -->
  19. <app-dashboard-metrics
  20. [overdueCount]="overdueProjects.length"
  21. [dueSoonCount]="dueSoonProjects.length"
  22. [pendingApprovalCount]="pendingApprovalProjects.length"
  23. [pendingAssignmentCount]="pendingAssignmentProjects.length"
  24. [overloadedDesignersCount]="overloadedDesignersCount"
  25. [averageWorkloadRate]="averageWorkloadRate"
  26. (filterStatus)="filterByStatus($event)">
  27. </app-dashboard-metrics>
  28. </header>
  29. <main class="dashboard-main">
  30. <!-- 待办任务组件 -->
  31. <app-todo-section
  32. [todoTasksFromIssues]="todoTasksFromIssues"
  33. [loadingTodoTasks]="loadingTodoTasks"
  34. [todoTaskError]="todoTaskError"
  35. [urgentEvents]="urgentEvents"
  36. [loadingUrgentEvents]="loadingUrgentEvents"
  37. (refresh)="refreshTodoTasks()"
  38. (navigateToIssue)="navigateToIssue($event)"
  39. (markAsRead)="markAsRead($event)"
  40. (projectClick)="viewProjectDetails($event)"
  41. (confirmEventOnTime)="confirmEventOnTime($event)"
  42. (markEventAsStagnant)="markEventAsStagnant($event)"
  43. (resolveUrgentEvent)="resolveUrgentEvent($event)"
  44. (createTodoFromEvent)="createTodoFromEvent($event)">
  45. </app-todo-section>
  46. <!-- 项目监控大盘 -->
  47. <section class="monitoring-section">
  48. <div class="section-header">
  49. <h2>项目监控大盘</h2>
  50. <div class="section-actions">
  51. @if (selectedStatus !== 'all') {
  52. <button class="btn-link" (click)="resetStatusFilter()">返回全部项目</button>
  53. }
  54. </div>
  55. </div>
  56. <!-- 工作量负载概览组件 -->
  57. <app-workload-gantt
  58. [designerWorkloadMap]="designerWorkloadMap"
  59. [realDesigners]="realDesigners"
  60. [filteredProjects]="filteredProjects"
  61. (employeeClick)="onEmployeeClick($event)">
  62. </app-workload-gantt>
  63. <!-- 🆕 视图切换按钮(固定在此位置便于切换) -->
  64. <div class="view-toggle-bar">
  65. <button class="btn-toggle-view" (click)="toggleView()">
  66. <span class="toggle-icon">{{ showGanttView ? '📋' : '📊' }}</span>
  67. <span class="toggle-text">{{ showGanttView ? '切换到项目看板' : '切换到时间轴视图' }}</span>
  68. </button>
  69. </div>
  70. <!-- 项目负载时间轴(切换视图时显示) -->
  71. @if (showGanttView) {
  72. <app-project-timeline
  73. [projects]="projectTimelineData"
  74. [companyId]="currentUser.name"
  75. (projectClick)="onProjectTimelineClick($event)">
  76. </app-project-timeline>
  77. }
  78. @if (!showGanttView) {
  79. <!-- 筛选条件栏组件 -->
  80. <app-dashboard-filter-bar
  81. [projects]="projects"
  82. [designers]="designers"
  83. [corePhases]="corePhases"
  84. [(searchTerm)]="searchTerm"
  85. [(selectedType)]="selectedType"
  86. [(selectedUrgency)]="selectedUrgency"
  87. [(selectedStatus)]="selectedStatus"
  88. [(selectedDesigner)]="selectedDesigner"
  89. [(selectedMemberType)]="selectedMemberType"
  90. [(selectedCorePhase)]="selectedCorePhase"
  91. [(selectedProjectId)]="selectedProjectId"
  92. [(selectedTimeWindow)]="selectedTimeWindow"
  93. (filterChange)="onFilterChange($event)"
  94. (viewProject)="viewProjectDetails($event)">
  95. </app-dashboard-filter-bar>
  96. <!-- 项目看板组件 -->
  97. <app-project-kanban
  98. [corePhases]="corePhases"
  99. [projects]="filteredProjects"
  100. (viewProject)="viewProjectDetailsByPhase($event.projectId, $event.phaseId)"
  101. (openSmartMatch)="openSmartMatch($event)"
  102. (assignProject)="quickAssignProject($event)"
  103. (reviewProject)="reviewProjectQuality($event)">
  104. </app-project-kanban>
  105. }
  106. </section>
  107. <!-- 超期项目提醒组件 -->
  108. <app-dashboard-alerts
  109. [showAlert]="showAlert"
  110. [overdueProjects]="overdueProjects"
  111. [urgentPinnedProjects]="urgentPinnedProjects"
  112. (viewAllOverdue)="viewAllOverdueProjects()"
  113. (closeAlert)="closeAlert()"
  114. (filterStatus)="filterByStatus($event)">
  115. </app-dashboard-alerts>
  116. </main>
  117. <!-- 员工详情面板组件 -->
  118. <app-employee-detail-panel
  119. [visible]="showEmployeeDetailPanel"
  120. [employeeName]="selectedEmployeeName"
  121. [projects]="selectedEmployeeProjects"
  122. [employeeDetail]="selectedEmployeeDetail"
  123. (close)="closeEmployeeDetailPanel()"
  124. (calendarMonthChange)="changeEmployeeCalendarMonth($event)"
  125. (calendarDayClick)="onCalendarDayClick($event)"
  126. (projectClick)="navigateToProjectFromPanel($event)"
  127. (refreshSurvey)="refreshEmployeeSurvey()">
  128. </app-employee-detail-panel>
  129. <!-- 智能推荐弹窗组件 -->
  130. <app-smart-match-modal
  131. [visible]="showSmartMatch"
  132. [selectedProject]="selectedProject"
  133. [recommendations]="recommendations"
  134. (close)="closeSmartMatch()"
  135. (assign)="assignToDesigner($event)">
  136. </app-smart-match-modal>