From 06056c61827cf5dd97350ccdc6eb237e2ded67c4 Mon Sep 17 00:00:00 2001 From: Nils-Johan Gynther Date: Mon, 11 May 2026 10:22:17 +0200 Subject: [PATCH] feat: Improve bulk category update functionality with validation and clearer logic --- backend/src/products/products.service.ts | 9 ++++++--- .../presentation/admin_products_panel.dart | 19 ++++++++++++++----- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/backend/src/products/products.service.ts b/backend/src/products/products.service.ts index 67538a33..424f70cd 100644 --- a/backend/src/products/products.service.ts +++ b/backend/src/products/products.service.ts @@ -389,12 +389,15 @@ export class ProductsService { async bulkUpdate(ids: number[], data: { categoryId?: number | null }) { const updateData: Record = {}; - if ('categoryId' in data) { + if (data.categoryId !== undefined) { updateData.categoryId = data.categoryId; } if (Object.keys(updateData).length === 0) return { updated: 0 }; - await this.prisma.product.updateMany({ where: { id: { in: ids } }, data: updateData }); - return { updated: ids.length }; + const result = await this.prisma.product.updateMany({ + where: { id: { in: ids } }, + data: updateData, + }); + return { updated: result.count }; } async findUncategorized(): Promise<{ id: number; name: string; canonicalName: string | null }[]> { diff --git a/flutter/lib/features/admin/presentation/admin_products_panel.dart b/flutter/lib/features/admin/presentation/admin_products_panel.dart index ae76a831..b0652c4a 100644 --- a/flutter/lib/features/admin/presentation/admin_products_panel.dart +++ b/flutter/lib/features/admin/presentation/admin_products_panel.dart @@ -104,14 +104,21 @@ class _AdminProductsPanelState extends ConsumerState { Future _applyBulkCategory() async { if (_selectedIds.isEmpty || _isApplying) return; + if (_bulkCategoryValue == null) { + ScaffoldMessenger.of(context).showSnackBar( + const SnackBar(content: Text('Välj en kategori innan du uppdaterar valda produkter.')), + ); + return; + } + + final categoryId = + _bulkCategoryValue == '__remove__' ? null : int.parse(_bulkCategoryValue!); + setState(() => _isApplying = true); try { await ref.read(adminRepositoryProvider).bulkSetCategory( _selectedIds.toList(), - categoryId: _bulkCategoryValue == null || - _bulkCategoryValue == '__remove__' - ? null - : int.parse(_bulkCategoryValue!), + categoryId: categoryId, ); if (!mounted) return; setState(() { @@ -651,7 +658,9 @@ class _AdminProductsPanelState extends ConsumerState { ), if (!_showDeletedOnly) FilledButton( - onPressed: _selectedIds.isEmpty || _isApplying + onPressed: _selectedIds.isEmpty || + _isApplying || + _bulkCategoryValue == null ? null : _applyBulkCategory, child: _isApplying