diff --git a/app/Http/Controllers/Api/Admin/GlobalMenuController.php b/app/Http/Controllers/Api/Admin/GlobalMenuController.php index 101b0495..e774ad7c 100644 --- a/app/Http/Controllers/Api/Admin/GlobalMenuController.php +++ b/app/Http/Controllers/Api/Admin/GlobalMenuController.php @@ -18,18 +18,18 @@ public function __construct( /** * 글로벌 메뉴 목록 조회 */ - public function index(Request $request): JsonResponse + public function index(Request $request): JsonResponse|\Illuminate\Http\Response { $menus = $this->menuService->getGlobalMenus( $request->all(), $request->integer('per_page', 100) // 글로벌 메뉴는 많지 않으므로 페이지당 100개 ); - // HTMX 요청인 경우 HTML 반환 + // HTMX 요청인 경우 HTML 직접 반환 (JSON 래핑 없이) if ($request->header('HX-Request')) { $html = view('menus.partials.global-table', compact('menus'))->render(); - return response()->json(['html' => $html]); + return response($html)->header('Content-Type', 'text/html'); } // 일반 API 요청인 경우 JSON 반환 diff --git a/app/Http/Controllers/Api/Admin/MenuController.php b/app/Http/Controllers/Api/Admin/MenuController.php index 94038e2f..07b5850e 100644 --- a/app/Http/Controllers/Api/Admin/MenuController.php +++ b/app/Http/Controllers/Api/Admin/MenuController.php @@ -18,7 +18,7 @@ public function __construct( /** * 메뉴 목록 조회 */ - public function index(Request $request): JsonResponse + public function index(Request $request): JsonResponse|\Illuminate\Http\Response { $tenantId = session('selected_tenant_id'); $importMode = $request->get('mode') === 'import' && $tenantId; @@ -34,11 +34,11 @@ public function index(Request $request): JsonResponse ); } - // HTMX 요청인 경우 HTML 반환 + // HTMX 요청인 경우 HTML 직접 반환 (JSON 래핑 없이) if ($request->header('HX-Request')) { $html = view('menus.partials.table', compact('menus', 'importMode'))->render(); - return response()->json(['html' => $html]); + return response($html)->header('Content-Type', 'text/html'); } // 일반 API 요청인 경우 JSON 반환 diff --git a/app/Http/Requests/StoreMenuRequest.php b/app/Http/Requests/StoreMenuRequest.php index 4c1dbde2..2b75e876 100644 --- a/app/Http/Requests/StoreMenuRequest.php +++ b/app/Http/Requests/StoreMenuRequest.php @@ -31,6 +31,9 @@ public function rules(): array 'hidden' => 'nullable|boolean', 'is_external' => 'nullable|boolean', 'external_url' => 'nullable|string|max:255|required_if:is_external,1', + 'options' => 'nullable|array', + 'options.section' => 'nullable|string|in:main,tools,labs', + 'options.meta' => 'nullable|array', ]; } diff --git a/app/Http/Requests/UpdateMenuRequest.php b/app/Http/Requests/UpdateMenuRequest.php index c5382836..3d94b839 100644 --- a/app/Http/Requests/UpdateMenuRequest.php +++ b/app/Http/Requests/UpdateMenuRequest.php @@ -42,6 +42,9 @@ function ($attribute, $value, $fail) use ($menuId) { 'hidden' => 'nullable|boolean', 'is_external' => 'nullable|boolean', 'external_url' => 'nullable|string|max:255|required_if:is_external,1', + 'options' => 'nullable|array', + 'options.section' => 'nullable|string|in:main,tools,labs', + 'options.meta' => 'nullable|array', ]; } diff --git a/resources/views/components/sidebar/tools-menu.blade.php b/resources/views/components/sidebar/tools-menu.blade.php new file mode 100644 index 00000000..94c2733e --- /dev/null +++ b/resources/views/components/sidebar/tools-menu.blade.php @@ -0,0 +1,68 @@ +@props(['menus']) + +@php + $sidebarMenuService = app(\App\Services\SidebarMenuService::class); +@endphp + +@foreach($menus as $toolsGroup) + @php + $groupId = 'tools-group-' . $toolsGroup->id; + $children = $toolsGroup->menuChildren ?? collect(); + $hasChildren = $children->isNotEmpty(); + $isExpanded = $sidebarMenuService->isMenuOrChildActive($toolsGroup); + @endphp + + {{-- 그룹 헤더 (접기/펼치기 버튼) --}} + + + {{-- 하위 메뉴 목록 --}} +