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')
+