diff --git a/src/app/features/admin/categories/components/admin-categories-list.component.ts b/src/app/features/admin/categories/components/admin-categories-list.component.ts index 3b1dfb8..c2a27f6 100644 --- a/src/app/features/admin/categories/components/admin-categories-list.component.ts +++ b/src/app/features/admin/categories/components/admin-categories-list.component.ts @@ -33,7 +33,7 @@ export class AdminCategoriesListComponent { @Output() delete = new EventEmitter(); @Output() restore = new EventEmitter(); @Output() toggleVisible = new EventEmitter<{ id: string; visible: boolean }>(); - @Output() reorder = new EventEmitter<{ id: string; targetOrder: number }>(); + @Output() reorder = new EventEmitter<{ id: string; targetId: string }>(); private draggedId: string | null = null; @@ -50,7 +50,7 @@ export class AdminCategoriesListComponent { this.draggedId = null; return; } - this.reorder.emit({ id: this.draggedId, targetOrder: targetRow.category.order }); + this.reorder.emit({ id: this.draggedId, targetId: targetRow.category.id }); this.draggedId = null; } } diff --git a/src/app/features/admin/categories/facade/admin-categories.facade.ts b/src/app/features/admin/categories/facade/admin-categories.facade.ts index 61e6c42..689bcea 100644 --- a/src/app/features/admin/categories/facade/admin-categories.facade.ts +++ b/src/app/features/admin/categories/facade/admin-categories.facade.ts @@ -165,10 +165,26 @@ export class AdminCategoriesFacade { .subscribe({ next: () => this.loadList() }); } - reorder(id: string, targetOrder: number): void { - const category = this.categories().find(item => item.id === id); - if (!category) return; - this.gateway.updateCategory({ ...category, order: targetOrder, updatedAt: new Date().toISOString() }).pipe(take(1)) - .subscribe({ next: () => this.loadList() }); + reorder(id: string, targetId: string): void { + const dragged = this.categories().find(item => item.id === id); + const target = this.categories().find(item => item.id === targetId); + if (!dragged || !target || dragged.parentId !== target.parentId || dragged.id === target.id) return; + + const siblings = this.categories() + .filter(item => item.parentId === dragged.parentId) + .sort((left, right) => left.order - right.order); + const withoutDragged = siblings.filter(item => item.id !== id); + const targetIndex = withoutDragged.findIndex(item => item.id === targetId); + withoutDragged.splice(targetIndex, 0, dragged); + + const now = new Date().toISOString(); + const updates = withoutDragged + .map((item, index) => ({ item, order: index })) + .filter(({ item, order }) => item.order !== order) + .map(({ item, order }) => ({ ...item, order, updatedAt: now })); + + if (updates.length === 0) return; + updates.forEach(category => this.gateway.updateCategory(category).pipe(take(1)).subscribe()); + this.loadList(); } } diff --git a/src/app/features/admin/categories/pages/admin-categories-list-page.component.ts b/src/app/features/admin/categories/pages/admin-categories-list-page.component.ts index 69e1884..22a6abd 100644 --- a/src/app/features/admin/categories/pages/admin-categories-list-page.component.ts +++ b/src/app/features/admin/categories/pages/admin-categories-list-page.component.ts @@ -20,7 +20,7 @@ import { TranslateService } from '../../../../i18n/translate.service'; (delete)="deleteOne($event)" (restore)="facade.restoreOne($event)" (toggleVisible)="facade.setVisible($event.id, $event.visible)" - (reorder)="facade.reorder($event.id, $event.targetOrder)" />`, + (reorder)="facade.reorder($event.id, $event.targetId)" />`, changeDetection: ChangeDetectionStrategy.OnPush }) export class AdminCategoriesListPageComponent {