From 49aab631249a091e61dbc4f77ec99443ceb8a80f Mon Sep 17 00:00:00 2001 From: sdarbinyan Date: Thu, 13 Aug 2026 08:22:01 +0400 Subject: [PATCH] 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 --- .../admin-products-list-page.component.ts | 50 +++++++++++++++++-- src/app/i18n/en.ts | 3 ++ src/app/i18n/hy.ts | 3 ++ src/app/i18n/ru.ts | 3 ++ src/app/i18n/translations.ts | 3 ++ 5 files changed, 57 insertions(+), 5 deletions(-) diff --git a/src/app/features/admin/products/pages/admin-products-list-page.component.ts b/src/app/features/admin/products/pages/admin-products-list-page.component.ts index 974ce31..6483e2e 100644 --- a/src/app/features/admin/products/pages/admin-products-list-page.component.ts +++ b/src/app/features/admin/products/pages/admin-products-list-page.component.ts @@ -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: ``, + (columnToggle)="facade.setColumnVisible($event.column, $event.visible)" /> + + `, changeDetection: ChangeDetectionStrategy.OnPush }) export class AdminProductsListPageComponent { @@ -50,6 +66,9 @@ export class AdminProductsListPageComponent { readonly healthFn = (product: Parameters[0]) => this.facade.health(product); + readonly pendingDeleteId = signal(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(); } diff --git a/src/app/i18n/en.ts b/src/app/i18n/en.ts index e70468a..145674c 100644 --- a/src/app/i18n/en.ts +++ b/src/app/i18n/en.ts @@ -1617,6 +1617,9 @@ export const en: Translations = { }, adminProducts: { confirmLeaveUnsaved: 'You have unsaved changes. Leave without saving?', + deleteTitle: 'Delete product', + confirmDelete: 'Delete this product? This cannot be undone.', + confirmBulkDelete: 'Delete the selected products? This cannot be undone.', emptyTitle: 'No products found', emptyDescription: 'Try adjusting your filters, or create a new product.', emptyGuide: 'Good products have a clear title, at least one photo, a price, and a short description — that\'s enough to publish. You can always add more detail later.', diff --git a/src/app/i18n/hy.ts b/src/app/i18n/hy.ts index 20a1793..1fcb0ad 100644 --- a/src/app/i18n/hy.ts +++ b/src/app/i18n/hy.ts @@ -1612,6 +1612,9 @@ export const hy: Translations = { }, adminProducts: { confirmLeaveUnsaved: 'Դուք ունեք չպահպանված փոփոխություններ։ Դո՞ւրս գալ առանց պահպանելու։', + deleteTitle: 'Ջնջել ապրանքը', + confirmDelete: 'Ջնջե՞լ այս ապրանքը։ Հնարավոր չէ հետարկել։', + confirmBulkDelete: 'Ջնջե՞լ ընտրված ապրանքները։ Հնարավոր չէ հետարկել։', emptyTitle: 'Ապրանքներ չեն գտնվել', emptyDescription: 'Փոխեք ֆիլտրերը կամ ստեղծեք նոր ապրանք։', emptyGuide: 'Լավ ապրանքին բավական է հստակ վերնագիր, առնվազն մեկ լուսանկար, գին և կարճ նկարագրություն՝ հրապարակելու համար։ Մնացածը կարող եք ավելացնել հետո։', diff --git a/src/app/i18n/ru.ts b/src/app/i18n/ru.ts index d17c01e..14fe3f7 100644 --- a/src/app/i18n/ru.ts +++ b/src/app/i18n/ru.ts @@ -1612,6 +1612,9 @@ export const ru: Translations = { }, adminProducts: { confirmLeaveUnsaved: 'У вас есть несохранённые изменения. Выйти без сохранения?', + deleteTitle: 'Удалить товар', + confirmDelete: 'Удалить этот товар? Это действие нельзя отменить.', + confirmBulkDelete: 'Удалить выбранные товары? Это действие нельзя отменить.', emptyTitle: 'Товары не найдены', emptyDescription: 'Измените фильтры или создайте новый товар.', emptyGuide: 'Хорошему товару нужны понятное название, минимум одно фото, цена и короткое описание — этого достаточно для публикации. Остальное можно добавить позже.', diff --git a/src/app/i18n/translations.ts b/src/app/i18n/translations.ts index ef1db8d..d4fa03e 100644 --- a/src/app/i18n/translations.ts +++ b/src/app/i18n/translations.ts @@ -1625,6 +1625,9 @@ export interface Translations { }; adminProducts: { confirmLeaveUnsaved: string; + deleteTitle: string; + confirmDelete: string; + confirmBulkDelete: string; emptyTitle: string; emptyDescription: string; emptyGuide: string;