feat(WEB): 전체 페이지 ?mode= URL 네비게이션 패턴 적용

- 등록(?mode=new), 상세(?mode=view), 수정(?mode=edit) URL 패턴 일괄 적용
- 중복 패턴 제거: /edit?mode=edit → ?mode=edit (16개 파일)
- 제목 일관성: {기능} 등록/상세/수정 패턴 적용
- 검수 체크리스트 문서 추가 (79개 페이지)
- UniversalListPage, IntegratedDetailTemplate 공통 컴포넌트 개선

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
유병철
2026-01-25 12:27:43 +09:00
parent 72f1accbe4
commit f6551c7e8b
162 changed files with 2907 additions and 480 deletions

View File

@@ -55,7 +55,7 @@ export function BoardDetail({ post, comments: initialComments, currentUserId }:
}, [router]);
const handleEdit = useCallback(() => {
router.push(`/ko/board/${post.boardCode}/${post.id}/edit`);
router.push(`/ko/board/${post.boardCode}/${post.id}?mode=edit`);
}, [router, post.boardCode, post.id]);
const handleConfirmDelete = useCallback(async () => {

View File

@@ -8,7 +8,7 @@ import type { DetailConfig } from '@/components/templates/IntegratedDetailTempla
* IntegratedDetailTemplate 마이그레이션 (2025-01-20)
*/
export const boardCreateConfig: DetailConfig = {
title: '게시글 등록',
title: '게시글',
description: '새로운 게시글을 등록합니다',
icon: FileText,
basePath: '/boards',

View File

@@ -169,9 +169,9 @@ export function BoardListUnified() {
onClick={() => {
const boardCode = activeTab !== 'my' ? activeTab : boards[0]?.boardCode;
if (boardCode) {
router.push(`/ko/board/${boardCode}/create`);
router.push(`/ko/board/${boardCode}?mode=new`);
} else {
router.push('/ko/board/create');
router.push('/ko/board?mode=new');
}
}}
>
@@ -198,11 +198,11 @@ export function BoardListUnified() {
const isMyPost = item.authorId === currentUserId;
const handleRowClick = () => {
router.push(`/ko/board/${item.boardCode}/${item.id}`);
router.push(`/ko/board/${item.boardCode}/${item.id}?mode=view`);
};
const handleEdit = () => {
router.push(`/ko/board/${item.boardCode}/${item.id}/edit`);
router.push(`/ko/board/${item.boardCode}/${item.id}?mode=edit`);
};
const handleDelete = async () => {
@@ -289,11 +289,11 @@ export function BoardListUnified() {
const isMyPost = item.authorId === currentUserId;
const handleRowClick = () => {
router.push(`/ko/board/${item.boardCode}/${item.id}`);
router.push(`/ko/board/${item.boardCode}/${item.id}?mode=view`);
};
const handleEdit = () => {
router.push(`/ko/board/${item.boardCode}/${item.id}/edit`);
router.push(`/ko/board/${item.boardCode}/${item.id}?mode=edit`);
};
const handleDelete = async () => {

View File

@@ -130,7 +130,7 @@ export function BoardList() {
// ===== 액션 핸들러 =====
const handleRowClick = useCallback(
(item: Post) => {
router.push(`/ko/board/${item.boardCode}/${item.id}`);
router.push(`/ko/board/${item.boardCode}/${item.id}?mode=view`);
},
[router]
);
@@ -138,9 +138,9 @@ export function BoardList() {
const handleNewPost = useCallback(() => {
const boardCode = activeTab !== 'my' ? activeTab : boards[0]?.boardCode;
if (boardCode) {
router.push(`/ko/board/${boardCode}/create`);
router.push(`/ko/board/${boardCode}?mode=new`);
} else {
router.push('/ko/board/create');
router.push('/ko/board?mode=new');
}
}, [router, activeTab, boards]);
@@ -293,7 +293,7 @@ export function BoardList() {
size="icon"
className="h-8 w-8 text-gray-600 hover:text-gray-700 hover:bg-gray-50"
onClick={() =>
router.push(`/ko/board/${item.boardCode}/${item.id}/edit`)
router.push(`/ko/board/${item.boardCode}/${item.id}?mode=edit`)
}
>
<Pencil className="h-4 w-4" />
@@ -352,7 +352,7 @@ export function BoardList() {
variant="outline"
className="flex-1"
onClick={() =>
router.push(`/ko/board/${item.boardCode}/${item.id}/edit`)
router.push(`/ko/board/${item.boardCode}/${item.id}?mode=edit`)
}
>
<Pencil className="w-4 h-4 mr-2" />

View File

@@ -49,8 +49,8 @@ export function BoardDetail({ board, onEdit, onDelete }: BoardDetailProps) {
return (
<PageLayout>
<PageHeader
title="게시판관리 상세"
description="게시판 목록을 관리합니다"
title="게시판 상세"
description="게시판 정보를 조회합니다"
icon={ClipboardList}
/>

View File

@@ -144,7 +144,7 @@ export function BoardDetailClientV2({ boardId, initialMode }: BoardDetailClientV
if (result.success) {
await forceRefreshMenus();
toast.success('게시판이 수정되었습니다.');
router.push(`${BASE_PATH}/${boardData.id}`);
router.push(`${BASE_PATH}/${boardData.id}?mode=view`);
} else {
setError(result.error || '게시판 수정에 실패했습니다.');
toast.error(result.error || '게시판 수정에 실패했습니다.');

View File

@@ -85,7 +85,7 @@ export function BoardForm({ mode, board, onSubmit }: BoardFormProps) {
const handleBack = () => {
if (mode === 'edit' && board) {
router.push(`/ko/board/board-management/${board.id}`);
router.push(`/ko/board/board-management/${board.id}?mode=view`);
} else {
router.push('/ko/board/board-management');
}
@@ -124,8 +124,8 @@ export function BoardForm({ mode, board, onSubmit }: BoardFormProps) {
return (
<PageLayout>
<PageHeader
title={mode === 'create' ? '게시판관리 상세' : '게시판관리 상세'}
description="게시판 목록을 관리합니다"
title={mode === 'create' ? '게시판 등록' : '게시판 수정'}
description={mode === 'create' ? '새 게시판을 등록합니다' : '게시판 정보를 수정합니다'}
icon={ClipboardList}
/>

View File

@@ -126,7 +126,7 @@ const createBoardManagementConfig = (router: ReturnType<typeof useRouter>): Univ
createButton: {
label: '게시판 등록',
icon: Plus,
onClick: () => router.push('/board/board-management/new'),
onClick: () => router.push('/board/board-management?mode=new'),
},
// 삭제 확인 메시지