用户反馈的核心问题:
employee-detail-panel 组件被设计为一个完整的侧边栏面板,包含:
.employee-detail-overlay (遮罩层).employee-detail-panel (侧边栏容器).panel-header (标题和关闭按钮).panel-content (实际内容)当我们在 employee-info-panel 中复用时,这些外层容器都被包含进来,导致:
embedMode)为 employee-detail-panel 添加一个 embedMode 输入属性:
embedMode: false (默认) - 完整侧边栏模式embedMode: true - 嵌入模式,只渲染内容部分实现步骤:
修改 employee-detail-panel.ts:
@Input() embedMode: boolean = false;
修改 employee-detail-panel.html:
@if (visible && employeeDetail) {
@if (embedMode) {
<!-- 嵌入模式:只渲染panel-content -->
<div class="panel-content embedded">
<!-- 所有section内容 -->
</div>
} @else {
<!-- 完整模式:带遮罩层和侧边栏 -->
<div class="employee-detail-overlay" (click)="onClose()">
<div class="employee-detail-panel" (click)="stopPropagation($event)">
<div class="panel-header">...</div>
<div class="panel-content">
<!-- 所有section内容 -->
</div>
</div>
</div>
}
}
修改 employee-info-panel.html:
@if (activeTab === 'workload') {
<div class="tab-content workload-tab">
<app-employee-detail-panel
[visible]="true"
[employeeDetail]="employeeDetailForTeamLeader"
[embedMode]="true"
(calendarMonthChange)="onChangeMonth($event)"
(calendarDayClick)="onCalendarDayClick($event)"
(projectClick)="onProjectClick($event)"
(refreshSurvey)="onRefreshSurvey()">
</app-employee-detail-panel>
</div>
}
修改 employee-info-panel.component.scss:
// 移除所有 ::ng-deep 样式覆盖
// 让 embedded 模式的组件自然渲染
将 panel-content 的内容提取为独立组件:
employee-workload-content.component.tsemployee-detail-panel 和 employee-info-panel 共同使用优点: 更彻底的复用 缺点: 需要重构现有代码
推荐使用方案一(嵌入模式),因为:
确保 employeeDetailForTeamLeader getter 正确转换所有必要数据:
surveyCompleted - 问卷完成状态surveyData - 问卷数据calendarData - 日历数据projectData - 项目数据leaveRecords - 请假记录立即实施方案一:
employee-detail-panel 添加 embedModeemployee-info-panel 的 SCSS