feat: 메뉴 드래그 앤 드롭 정렬 기능 추가

- MenuService.reorderMenus() 메서드 추가
- MenuController.reorder() API 엔드포인트 추가
- POST /api/admin/menus/reorder 라우트 추가
- SortableJS 기반 드래그 앤 드롭 UI 구현
- 같은 부모 메뉴 내에서만 순서 변경 가능 (계층 구조 유지)
This commit is contained in:
2025-12-01 15:24:49 +09:00
parent c8ddbfd130
commit 302b9d73aa
5 changed files with 150 additions and 13 deletions

View File

@@ -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);
}
}
}

View File

@@ -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;
});
}
}