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;