From 302b9d73aab5232fcbfb5af909a65974d628f90e Mon Sep 17 00:00:00 2001 From: hskwon Date: Mon, 1 Dec 2025 15:24:49 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=EB=A9=94=EB=89=B4=20=EB=93=9C=EB=9E=98?= =?UTF-8?q?=EA=B7=B8=20=EC=95=A4=20=EB=93=9C=EB=A1=AD=20=EC=A0=95=EB=A0=AC?= =?UTF-8?q?=20=EA=B8=B0=EB=8A=A5=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - MenuService.reorderMenus() 메서드 추가 - MenuController.reorder() API 엔드포인트 추가 - POST /api/admin/menus/reorder 라우트 추가 - SortableJS 기반 드래그 앤 드롭 UI 구현 - 같은 부모 메뉴 내에서만 순서 변경 가능 (계층 구조 유지) --- .../Controllers/Api/Admin/MenuController.php | 26 ++++++ app/Services/MenuService.php | 19 +++++ resources/views/menus/index.blade.php | 81 ++++++++++++++++++- .../views/menus/partials/table.blade.php | 34 +++++--- routes/api.php | 3 +- 5 files changed, 150 insertions(+), 13 deletions(-) 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') +