diff --git a/app/Http/Controllers/Api/Admin/MenuController.php b/app/Http/Controllers/Api/Admin/MenuController.php index 45218a7f..52182479 100644 --- a/app/Http/Controllers/Api/Admin/MenuController.php +++ b/app/Http/Controllers/Api/Admin/MenuController.php @@ -293,4 +293,30 @@ public function toggleHidden(Request $request, int $id): JsonResponse ], 500); } } + + /** + * 메뉴 순서 변경 (드래그앤드롭) + */ + public function reorder(Request $request): JsonResponse + { + $validated = $request->validate([ + 'items' => 'required|array', + 'items.*.id' => 'required|integer', + 'items.*.sort_order' => 'required|integer', + ]); + + try { + $this->menuService->reorderMenus($validated['items']); + + return response()->json([ + 'success' => true, + 'message' => '메뉴 순서가 변경되었습니다.', + ]); + } catch (\Exception $e) { + return response()->json([ + 'success' => false, + 'message' => '메뉴 순서 변경에 실패했습니다: '.$e->getMessage(), + ], 500); + } + } } diff --git a/app/Services/MenuService.php b/app/Services/MenuService.php index e33cb15e..fc1a063c 100644 --- a/app/Services/MenuService.php +++ b/app/Services/MenuService.php @@ -321,4 +321,23 @@ public function toggleHidden(int $id): bool return $menu->save(); } + + /** + * 메뉴 순서 변경 (드래그앤드롭) + * 같은 parent_id 내에서만 순서 변경 + */ + public function reorderMenus(array $items): bool + { + return \DB::transaction(function () use ($items) { + foreach ($items as $item) { + Menu::where('id', $item['id']) + ->update([ + 'sort_order' => $item['sort_order'], + 'updated_by' => auth()->id(), + ]); + } + + return true; + }); + } } diff --git a/resources/views/menus/index.blade.php b/resources/views/menus/index.blade.php index 024d8fdb..67a976ec 100644 --- a/resources/views/menus/index.blade.php +++ b/resources/views/menus/index.blade.php @@ -54,6 +54,7 @@ class="bg-white rounded-lg shadow-sm overflow-hidden"> @push('scripts') +