From aa9623c5bb1e7f3cea021c552b1664ebbe6bacfb Mon Sep 17 00:00:00 2001 From: kent Date: Sat, 27 Dec 2025 22:23:03 +0900 Subject: [PATCH] =?UTF-8?q?fix(mng):=20HTMX=20SPA=20=EB=84=A4=EB=B9=84?= =?UTF-8?q?=EA=B2=8C=EC=9D=B4=EC=85=98=20=EC=98=A4=EB=A5=98=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## 수정 내용 ### HTMX 응답 형식 수정 - DepartmentController: view 직접 반환 (JSON 래핑 제거) - MenuController: ->render() 제거하여 SVG 이스케이프 문제 해결 ### 사이드바 개선 - hx-boost 적용하여 SPA 스타일 네비게이션 구현 - 메뉴 클릭 시 활성화 상태 즉시 반영 - 스크롤 위치 저장/복원 기능 추가 ### 불필요한 코드 제거 - departments/index.blade.php: JSON.parse 코드 제거 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude Opus 4.5 --- .../Api/Admin/DepartmentController.php | 10 +-- .../Controllers/Api/Admin/MenuController.php | 6 +- resources/views/departments/index.blade.php | 10 --- resources/views/partials/sidebar.blade.php | 68 ++++++++++++++++--- 4 files changed, 64 insertions(+), 30 deletions(-) diff --git a/app/Http/Controllers/Api/Admin/DepartmentController.php b/app/Http/Controllers/Api/Admin/DepartmentController.php index a0980b64..66bc3345 100644 --- a/app/Http/Controllers/Api/Admin/DepartmentController.php +++ b/app/Http/Controllers/Api/Admin/DepartmentController.php @@ -18,20 +18,16 @@ public function __construct( /** * 부서 목록 조회 */ - public function index(Request $request): JsonResponse + public function index(Request $request): JsonResponse|\Illuminate\View\View { $departments = $this->departmentService->getDepartments( $request->all(), $request->integer('per_page', 10) ); - // HTMX 요청 시 HTML 반환 + // HTMX 요청 시 HTML 직접 반환 if ($request->header('HX-Request')) { - $html = view('departments.partials.table', compact('departments'))->render(); - - return response()->json([ - 'html' => $html, - ]); + return view('departments.partials.table', compact('departments')); } // 일반 요청 시 JSON 반환 diff --git a/app/Http/Controllers/Api/Admin/MenuController.php b/app/Http/Controllers/Api/Admin/MenuController.php index d3d03fac..9d207b43 100644 --- a/app/Http/Controllers/Api/Admin/MenuController.php +++ b/app/Http/Controllers/Api/Admin/MenuController.php @@ -34,11 +34,9 @@ public function index(Request $request): JsonResponse|\Illuminate\Http\Response ); } - // HTMX 요청인 경우 HTML 직접 반환 (JSON 래핑 없이) + // HTMX 요청인 경우 HTML 직접 반환 if ($request->header('HX-Request')) { - $html = view('menus.partials.table', compact('menus', 'importMode'))->render(); - - return response($html)->header('Content-Type', 'text/html'); + return view('menus.partials.table', compact('menus', 'importMode')); } // 일반 API 요청인 경우 JSON 반환 diff --git a/resources/views/departments/index.blade.php b/resources/views/departments/index.blade.php index cbc023e6..f48eb6eb 100644 --- a/resources/views/departments/index.blade.php +++ b/resources/views/departments/index.blade.php @@ -70,16 +70,6 @@ class="bg-white rounded-lg shadow-sm overflow-hidden"> htmx.trigger('#department-table', 'filterSubmit'); }); - // HTMX 응답 처리 - document.body.addEventListener('htmx:afterSwap', function(event) { - if (event.detail.target.id === 'department-table') { - const response = JSON.parse(event.detail.xhr.response); - if (response.html) { - event.detail.target.innerHTML = response.html; - } - } - }); - // 삭제 확인 window.confirmDelete = function(id, name) { showDeleteConfirm(name, () => { diff --git a/resources/views/partials/sidebar.blade.php b/resources/views/partials/sidebar.blade.php index 52b7628a..81b3b22f 100644 --- a/resources/views/partials/sidebar.blade.php +++ b/resources/views/partials/sidebar.blade.php @@ -63,7 +63,12 @@ class="w-full border-gray-300 rounded-lg text-sm focus:ring-primary focus:border -