메뉴 관리 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:
@@ -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 반환
|
||||
|
||||
@@ -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 반환
|
||||
|
||||
@@ -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',
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
@@ -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',
|
||||
];
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user