实现商品列表页面的表格工具栏,包括默认状态和选中状态的切换,以及批量操作功能。
在 product-list.component.html 中实现了完整的工具栏结构:
<div class="toolbar">
<div class="toolbar-left">
<!-- 默认状态:显示商品总数 -->
<span class="product-count" *ngIf="selectedProducts.size === 0">
共 {{ pagination.total }} 个商品
</span>
<!-- 选中状态:显示已选数量和清空按钮 -->
<span class="selected-count" *ngIf="selectedProducts.size > 0">
已选择 {{ selectedProducts.size }} 个商品
<button mat-button (click)="clearSelection()" class="clear-btn">
清空选择
</button>
</span>
</div>
<div class="toolbar-right">
<!-- 批量操作按钮(选中状态) -->
<ng-container *ngIf="selectedProducts.size > 0">
<button mat-stroked-button (click)="batchOffShelf()" class="batch-btn">
<mat-icon>remove_circle_outline</mat-icon>
批量下架
</button>
<button mat-stroked-button color="warn" (click)="batchDelete()" class="batch-btn">
<mat-icon>delete_outline</mat-icon>
批量删除
</button>
</ng-container>
<!-- 默认操作按钮(未选中状态) -->
<ng-container *ngIf="selectedProducts.size === 0">
<button mat-icon-button (click)="refresh()" matTooltip="刷新">
<mat-icon>refresh</mat-icon>
</button>
<button mat-raised-button color="primary" (click)="navigateToCreate()">
<mat-icon>add</mat-icon>
发布商品
</button>
</ng-container>
</div>
</div>
在 product-list.component.ts 中实现了以下功能:
batchOffShelf(): void {
if (this.selectedProducts.size === 0) {
return;
}
this.loading = true;
const ids = Array.from(this.selectedProducts);
this.productService.batchUpdateStatus(ids, ProductStatus.OffShelf)
.subscribe({
next: () => {
this.showSuccess(`已下架 ${ids.length} 个商品`);
this.clearSelection();
this.loadProducts();
},
error: (error) => {
console.error('Failed to off-shelf products:', error);
this.showError('批量下架失败');
this.loading = false;
}
});
}
batchDelete(): void {
if (this.selectedProducts.size === 0) {
return;
}
if (!confirm(`确定要删除选中的 ${this.selectedProducts.size} 个商品吗?`)) {
return;
}
this.loading = true;
const ids = Array.from(this.selectedProducts);
this.productService.batchDelete(ids)
.subscribe({
next: () => {
this.showSuccess(`已删除 ${ids.length} 个商品`);
this.clearSelection();
this.loadProducts();
},
error: (error) => {
console.error('Failed to delete products:', error);
this.showError('批量删除失败');
this.loading = false;
}
});
}
refresh(): void {
this.clearSelection();
this.loadProducts();
}
在 product-list.component.scss 中实现了工具栏样式:
.toolbar {
display: flex;
justify-content: space-between;
align-items: center;
padding: 16px 24px;
background: white;
border-radius: 4px 4px 0 0;
border-bottom: 1px solid #e8e8e8;
.toolbar-left {
display: flex;
align-items: center;
gap: 16px;
.product-count {
color: rgba(0, 0, 0, 0.65);
font-size: 14px;
}
.selected-count {
color: #1890ff;
font-size: 14px;
display: flex;
align-items: center;
gap: 8px;
.clear-btn {
min-width: auto;
padding: 0 8px;
height: 28px;
line-height: 28px;
}
}
}
.toolbar-right {
display: flex;
gap: 12px;
align-items: center;
.batch-btn {
mat-icon {
margin-right: 4px;
}
}
}
}
添加了 MatTooltipModule 到组件导入列表,以支持刷新按钮的提示功能。
本任务完全满足以下需求:
*ngIf 指令根据 selectedProducts.size 动态切换工具栏状态运行测试套件:274 个测试,272 个通过,2 个失败(失败的测试与本任务无关)
2024-12-12
src/app/pages/products/product-list/product-list.component.htmlsrc/app/pages/products/product-list/product-list.component.tssrc/app/pages/products/product-list/product-list.component.scss