메뉴 관리 HTMX 에러 수정 및 개발도구 메뉴 동적 렌더링

- HTMX 응답 에러 수정: JSON 래핑 대신 HTML 직접 반환
  - MenuController, GlobalMenuController의 index 메소드 수정
  - index.blade.php, global-index.blade.php의 JSON 파싱 로직 제거

- 메뉴 options 필드 검증 추가
  - StoreMenuRequest, UpdateMenuRequest에 options 필드 추가
  - section 변경이 정상 저장되도록 수정

- 개발도구 메뉴 하드코딩 제거, DB 기반 동적 렌더링
  - sidebar.blade.php에서 하드코딩된 메뉴 제거
  - tools-menu.blade.php 컴포넌트 신규 생성
  - section=tools 메뉴가 하단 고정 영역에 동적 표시
This commit is contained in:
2025-12-18 11:19:07 +09:00
parent 7205826db1
commit c94e1cff41
8 changed files with 90 additions and 52 deletions

View File

@@ -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 반환

View File

@@ -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 반환

View File

@@ -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',
];
}

View File

@@ -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',
];
}