1. /menus 페이지 hx-boost 네비게이션 시 SortableJS 미실행 수정
- htmx:afterSettle 이벤트로 페이지별 스크립트 초기화
- menu-sortable.js로 SortableJS 로직 분리
- 중복 코드 제거
2. 세션 만료 시 자동 갱신 로직 추가
- /auth/refresh-session 엔드포인트 추가
- Remember Token으로 자동 재인증 (자동 로그인 사용자)
- 재인증 실패 시 로그인 페이지 리다이렉트
- htmx:responseError 이벤트에서 401 상태 감지
- SweetAlert2로 세션 만료 알림 표시
- 확인 후 /login 페이지로 자동 이동
- 중복 리다이렉트 방지 플래그 추가
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- EnsureHQMember: HTMX/AJAX 요청 시 JSON 응답 반환
- EnsureSuperAdmin: HX-Request 헤더 체크 추가
- bootstrap/app.php: 전역 Exception Handler에서 HTMX 요청 처리
- RoleService: SpatieRole → App\Models\Role로 변경하여 테넌트별 역할 분리
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 인증 모달에 회사(테넌트) 선택 드롭다운 추가
- 헤더의 $globalTenants 재사용
- tenant.switch 라우트와 동기화
- 회사 변경 시 사용자 목록 자동 갱신
- Bearer 토큰 표시 및 복사 기능 추가
- 토큰 발급 API 엔드포인트 추가 (POST /dev-tools/api-explorer/issue-token)
- 현재 상태 영역에 토큰 표시
- 클립보드 복사 버튼 (Clipboard API + fallback)
- 적용 후 모달 유지하여 토큰 복사 가능
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- HTMX 로드 직후 htmx:configRequest 이벤트 리스너를 head에 등록
- 모든 HTMX 요청에서 쿠키의 per_page 값을 적용하도록 수정
- 기존 body 끝의 중복 코드 제거
- 타이밍 이슈로 인한 load 트리거 선행 실행 문제 해결
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- FormulaEvaluatorService: 공식 평가 로직 개선
- simulator.blade.php: 시뮬레이터 UI/UX 개선
- 입력 필드 레이아웃 최적화
- 계산 결과 표시 개선
- 에러 처리 강화
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 완제품 조회 순서 변경 (마진값 결정을 위해 선행 조회)
- 제품 카테고리(SCREEN/STEEL)에 따른 마진값 동적 결정
- 스크린: W+140, H+350
- 철재: W+110, H+350
- 제품 카테고리에 따른 중량(K) 계산 로직 구현
- 스크린: M×2 + W0/1000×14.17
- 철재: M×25
- getItemDetails()에 item_category, process_type 필드 추가
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- GuideModal, ExampleFlows, ExamplesModal 변수를 const에서 window 패턴으로 변경
- htmx가 콘텐츠를 다시 로드할 때 'Identifier has already been declared' 에러 방지
- window.XXX = window.XXX || {} 패턴으로 중복 선언 방지
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 댓글 라우트 추가 (store, update, destroy)
- PostService에 댓글 관리 메서드 추가
- PostController에 댓글 컨트롤러 메서드 추가
- 게시글 상세 페이지에 댓글 섹션 UI 추가 (AlpineJS)
- 계층형 댓글 지원 (부모/대댓글)
- BoardComment 모델 추가
- HTMLPurifier 패키지 및 설정 추가
- 게시글 목록에 첨부파일/댓글 수 표시
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
## 슈퍼관리자 삭제 게시물 관리
- 삭제된 게시물 목록에 표시 (빨간색 배경, 취소선)
- 게시물 복원 기능 추가 (POST /{post}/restore)
- 게시물 영구삭제 기능 추가 (DELETE /{post}/force)
- 통계 카드에 삭제됨 카운트 추가
## 페이지 타이틀 회사명 표시
- /boards: "회사명 게시판 관리" 형식으로 표시
- /boards/{code}/posts: "회사명 게시판명" 형식으로 표시
- 회사명 파란색으로 구분 표시
## 버그 수정
- 통계 카드 CSS: Tailwind 동적 클래스 문제 해결
(grid-cols-{{ }} → 정적 클래스로 변경)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- FileObserver: 파일 생성/삭제 시 tenant.storage_used 자동 업데이트
- RecalculateTenantStorageCommand: 기존 데이터 재계산 명령어
- php artisan tenant:recalculate-storage [--tenant=ID] [--dry-run]
- 음수 storage_used 방지 로직 포함
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 본사(tenant_type=HQ) 선택 시: 시스템 게시판 + 본사 게시판 표시
- 일반 테넌트 선택 시: 해당 테넌트 게시판만 표시
- 정렬: is_system DESC 추가 (시스템 게시판 우선)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Route Model Binding → 수동 조회로 변경 (board_code + tenant_id)
- PostController: resolveBoard() 헬퍼 추가
- t 파라미터 → 시스템 게시판 → 로그인 회원 tenant 순서
- 사이드바 메뉴 리다이렉트: tenant_id ?? 1 fallback 추가
- SidebarMenuService와 동일한 로직으로 일관성 확보
- 게시판 목록 테이블에 게시글 수 컬럼 추가
- 모든 posts View에 tenant_id 파라미터 추가
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- api-logs: let→var 변경으로 스크립트 재실행 오류 해결
- api-explorer: @push('styles')→content 내 style로 hx-boost 호환
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- MenuService::updateMenuForBoard() 메서드 추가
- 시스템 게시판: global_menus + 연결된 모든 menus URL 업데이트
- 테넌트 게시판: 해당 테넌트의 menus만 URL 업데이트
- BoardService::updateAnyBoard()에서 board_code/name 변경 감지 시 호출
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- createMenuForBoard(): GlobalMenu 조회/생성 후 테넌트 Menu에 global_menu_id 설정
- restoreMenuForBoard(): 복원/생성 시에도 global_menu_id 연결
- is_customized: false 추가하여 글로벌 메뉴 연동 표시
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Tenant::where('is_active', true) → Tenant::active()
- tenants 테이블에 is_active 컬럼이 없어 발생한 SQL 오류 수정
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- createMenuForBoard(): 시스템 게시판 생성 시 GlobalMenu + 모든 활성 테넌트의 Menu에 추가
- deleteMenuForBoard(): 시스템 게시판 삭제 시 GlobalMenu + 모든 테넌트의 Menu 삭제
- restoreMenuForBoard(): 시스템 게시판 복원 시 GlobalMenu + 모든 테넌트의 Menu 복원/생성
- /menus 페이지(테넌트 메뉴)에서 시스템 게시판 메뉴가 모든 테넌트에 표시됨
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- createBoard() 메서드에서도 createMenuForBoard() 호출
- 기존에는 createBoardFromTemplate()에서만 메뉴가 생성되었음
- 이제 모든 게시판 생성 경로에서 메뉴 자동 생성됨
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- createMenuForBoard(): 시스템 게시판 생성 시 global_menus와 menus 테이블 모두에 추가
- deleteMenuForBoard(): 시스템 게시판 삭제 시 GlobalMenu와 Menu 둘 다 삭제
- restoreMenuForBoard(): 시스템 게시판 복원 시 GlobalMenu와 Menu 둘 다 복원
이제 시스템 게시판이 /menus/global과 /menus 페이지 모두에 표시됨
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- BoardController: *Board() → *AnyBoard() 메서드로 변경하여 메뉴 연동 활성화
- MenuService: restoreMenuForBoard() 메서드 추가
- soft-deleted 메뉴 있으면 복원
- 활성 메뉴가 이미 있으면 스킵 (중복 방지)
- 둘 다 없으면 새로 생성
- BoardService: restoreAnyBoard()에서 board name 전달하도록 수정
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
## 수정 내용
### 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 <noreply@anthropic.com>
## 주요 변경사항
### 게시판-메뉴 자동 연동
- 게시판 생성 시 메뉴 자동 생성 (BoardService.createBoardFromTemplate)
- 게시판 삭제 시 연결 메뉴 함께 삭제 (Soft Delete 연동)
- 게시판 복원 시 메뉴 재생성
- 게시판 영구삭제 시 메뉴 영구삭제
### 게시판 메뉴 보호
- MenuService: 게시판 연동 메뉴 수동 수정/삭제 방지
- isBoardMenuUrl(), isBoardMenu(), validateNotBoardUrl() 헬퍼 추가
- 8개 CRUD 메서드에 검증 로직 적용
### URL 패턴 변경
- 시스템 게시판: /system-boards/{code} → /customer-center/{code}
- 테넌트 게시판: /boards/{code} (변경 없음)
### UI 개선
- 메뉴 목록에서 게시판 메뉴 "📋 게시판" 뱃지 표시
- 게시판 메뉴는 수정/삭제 버튼 숨김 (활성/숨김 토글만 허용)
- 삭제된 게시판 행 클릭 시 404 오류 수정
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- 사이드바에 hx-boost 적용하여 메인 콘텐츠만 교체
- main-content 영역에 id 부여
- 메뉴 클릭 시 활성화 상태 JavaScript로 처리
- 페이지 전환 시 사이드바 스크롤 위치 유지
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- /customer-center/{code} → /boards/{id}/posts 리다이렉트
- 시스템 게시판(tenant_id=null) + 활성화된 게시판만 대상
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- /customer-center 라우트 신규 생성
- 활성화된 시스템 게시판만 표시
- 테이블 컬럼: ID, 유형, 코드, 게시판명, 게시글 수, 생성일
- 관리 기능(구분, 필드, 상태, 액션) 제외한 읽기 전용 뷰
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- api_request_logs 테이블 사용으로 변경 (실제 API 호출 기록)
- 기존 admin_api_histories는 API Explorer 테스트 기록용으로 유지
- ApiRequestLog 모델 추가
- URL에서 엔드포인트 경로 추출 (REGEXP_REPLACE 사용)
- DB facade 사용으로 Eloquent accessor 충돌 방지
변경 전: 테스트 호출 2건만 표시
변경 후: 실제 API 호출 857건+ 표시
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Morph map에 Post, Department 모델 등록 (ClassMorphViolationException 해결)
- 파일 저장 방식을 API 스타일로 변경 (document_id + document_type)
- 파일 미리보기 라우트 및 메서드 추가 (previewFile)
- 게시글 상세 페이지에서 이미지 첨부파일을 본문 상단에 풀 너비로 표시
- 비이미지 첨부파일은 하단에 다운로드 목록으로 분리
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- QuoteFormulaCategorySeeder: 카테고리 4개 (입력변수, 계산변수, 범위선택, 품목매핑)
- QuoteFormulaSeeder: 변수/계산식 19개 (W0, H0, W1, H1, M, K 등)
- QuoteFormulaRangeSeeder: 범위 조건 12개 (모터/가이드레일/케이스 선택)
- QuoteFormulaItemSeeder: 품목 매핑 24개 (FG-SCR-001, FG-STL-001 BOM)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>