feat(WEB): 동적 게시판, 파트너 관리, 공지 팝업 모달 추가

- 동적 게시판 시스템 구현 (/boards/[boardCode])
- 파트너 관리 페이지 및 폼 추가
- 공지 팝업 모달 컴포넌트 (NoticePopupModal)
  - localStorage 기반 1일간 숨김 기능
  - 테스트 페이지 (/test/popup)
- IntegratedListTemplateV2 개선
- 기타 버그 수정 및 타입 개선

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
byeongcheolryu
2025-12-30 21:56:01 +09:00
parent 7b917fcbcd
commit f8dbc6b2ae
43 changed files with 6395 additions and 113 deletions

View File

@@ -28,6 +28,9 @@ interface ApiResponse<T> {
function transformApiToFrontend(apiData: BoardApiData): Board {
const extraSettings = apiData.extra_settings || {};
// permissions 추출 (read 권한 기준으로 사용)
const permissions = extraSettings.permissions?.read || [];
return {
id: String(apiData.id),
boardCode: apiData.board_code,
@@ -35,6 +38,7 @@ function transformApiToFrontend(apiData: BoardApiData): Board {
target: extraSettings.target || 'all',
targetId: extraSettings.target_id,
targetName: extraSettings.target_name,
permissions: permissions.length > 0 ? permissions : undefined,
boardName: apiData.name,
description: apiData.description || undefined,
status: apiData.is_active ? 'active' : 'inactive',
@@ -50,14 +54,26 @@ function transformApiToFrontend(apiData: BoardApiData): Board {
* 프론트엔드 데이터 → API 요청 형식 변환
*/
function transformFrontendToApi(data: BoardFormData & { boardCode?: string; description?: string }, isUpdate = false): Record<string, unknown> {
// extra_settings 구성
const extraSettings: Record<string, unknown> = {
target: data.target,
target_name: data.target === 'department' ? data.targetName : null,
};
// 권한 대상인 경우 permissions 추가
if (data.target === 'permission' && data.permissions && data.permissions.length > 0) {
extraSettings.permissions = {
read: data.permissions,
write: data.permissions,
manage: data.permissions,
};
}
const result: Record<string, unknown> = {
name: data.boardName,
description: data.description || null,
is_active: data.status === 'active',
extra_settings: {
target: data.target,
target_name: data.target === 'department' ? data.targetName : null,
},
extra_settings: extraSettings,
};
// 생성 시에만 board_code 전송 (수정 시에는 코드 변경 불가)