fix: product delete (single+bulk) had zero confirmation

(delete) and (bulkDelete) called facade.deleteOne()/applyBulkDelete()
straight from the click event. Added app-confirm-dialog gates for
both, same pattern as categories.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
sdarbinyan
2026-08-13 08:22:01 +04:00
parent 320f1f44b7
commit 49aab63124
5 changed files with 57 additions and 5 deletions

View File

@@ -1,13 +1,15 @@
import { ChangeDetectionStrategy, Component, inject } from '@angular/core';
import { ChangeDetectionStrategy, Component, inject, signal } from '@angular/core';
import { Router } from '@angular/router';
import { AdminProductsFacade } from '../facade/admin-products.facade';
import { AdminProductsListComponent } from '../components/admin-products-list.component';
import { LanguageService } from '../../../../services/language.service';
import { ConfirmDialogComponent } from '../../../../shared/ui/confirm-dialog/confirm-dialog.component';
import { TranslatePipe } from '../../../../i18n/translate.pipe';
@Component({
selector: 'app-admin-products-list-page',
standalone: true,
imports: [AdminProductsListComponent],
imports: [AdminProductsListComponent, ConfirmDialogComponent, TranslatePipe],
template: `<app-admin-products-list
[products]="facade.products()"
[categories]="facade.categories()"
@@ -25,7 +27,7 @@ import { LanguageService } from '../../../../services/language.service';
(create)="create()"
(edit)="edit($event)"
(duplicate)="duplicate($event)"
(delete)="facade.deleteOne($event)"
(delete)="deleteOne($event)"
(archive)="facade.archiveOne($event)"
(restore)="facade.restoreOne($event)"
(loadMore)="facade.loadMore()"
@@ -33,14 +35,28 @@ import { LanguageService } from '../../../../services/language.service';
(selectionChange)="facade.toggleSelection($event.id, $event.checked)"
(selectAll)="facade.toggleAll($event)"
(bulkVisibility)="facade.applyBulkVisibility($event)"
(bulkDelete)="facade.applyBulkDelete()"
(bulkDelete)="bulkDelete()"
(bulkDuplicate)="facade.applyBulkDuplicate()"
(bulkAssignCategory)="facade.applyBulkAssignCategory($event)"
(bulkAssignTags)="facade.applyBulkAssignTags($event)"
(bulkExport)="facade.exportSelectedAsCsv()"
(viewModeChange)="facade.setViewMode($event)"
(densityChange)="facade.setDensity($event)"
(columnToggle)="facade.setColumnVisible($event.column, $event.visible)" />`,
(columnToggle)="facade.setColumnVisible($event.column, $event.visible)" />
<app-confirm-dialog
[open]="!!pendingDeleteId()"
[titleText]="'adminProducts.deleteTitle' | translate"
[message]="'adminProducts.confirmDelete' | translate"
[destructive]="true"
(confirmed)="confirmDelete()"
(cancelled)="pendingDeleteId.set(null)" />
<app-confirm-dialog
[open]="bulkDeleteConfirmOpen()"
[titleText]="'adminProducts.deleteTitle' | translate"
[message]="'adminProducts.confirmBulkDelete' | translate"
[destructive]="true"
(confirmed)="confirmBulkDelete()"
(cancelled)="bulkDeleteConfirmOpen.set(false)" />`,
changeDetection: ChangeDetectionStrategy.OnPush
})
export class AdminProductsListPageComponent {
@@ -50,6 +66,9 @@ export class AdminProductsListPageComponent {
readonly healthFn = (product: Parameters<AdminProductsFacade['health']>[0]) => this.facade.health(product);
readonly pendingDeleteId = signal<string | null>(null);
readonly bulkDeleteConfirmOpen = signal(false);
constructor() {
this.facade.loadCategories();
this.facade.loadList();
@@ -60,6 +79,27 @@ export class AdminProductsListPageComponent {
edit(id: string): void { this.facade.loadForEdit(id, 'edit'); void this.router.navigate([this.lang(), 'backoffice', 'products', id, 'edit']); }
duplicate(id: string): void { this.facade.loadForEdit(id, 'duplicate'); void this.router.navigate([this.lang(), 'backoffice', 'products', id, 'duplicate']); }
deleteOne(id: string): void {
this.pendingDeleteId.set(id);
}
confirmDelete(): void {
const id = this.pendingDeleteId();
if (id) {
this.facade.deleteOne(id);
}
this.pendingDeleteId.set(null);
}
bulkDelete(): void {
this.bulkDeleteConfirmOpen.set(true);
}
confirmBulkDelete(): void {
this.facade.applyBulkDelete();
this.bulkDeleteConfirmOpen.set(false);
}
private lang(): string {
return this.languageService.currentLanguage();
}