Merge remote-tracking branch 'origin/master'

This commit is contained in:
2026-01-26 08:24:09 +09:00
165 changed files with 2947 additions and 487 deletions

View File

@@ -117,6 +117,11 @@ function IntegratedDetailTemplateInner<T extends Record<string, unknown>>(
const isCreateMode = mode === 'create';
const isEditMode = mode === 'edit';
// ===== mode prop 변경 시 내부 state 동기화 =====
useEffect(() => {
setMode(initialMode);
}, [initialMode]);
// ===== 초기 데이터 설정 =====
useEffect(() => {
if (initialData) {
@@ -298,10 +303,14 @@ function IntegratedDetailTemplateInner<T extends Record<string, unknown>>(
onEditProp();
return;
}
// 기본 동작: 내부 모드 변경
// 기본 동작: 내부 모드 변경 + URL 변경
setMode('edit');
onModeChange?.('edit');
}, [onEditProp, onModeChange]);
// URL에 ?mode=edit 추가
if (itemId) {
router.push(`/${locale}${config.basePath}/${itemId}?mode=edit`);
}
}, [onEditProp, onModeChange, router, locale, config.basePath, itemId]);
// ===== 액션 설정 =====
const actions = config.actions || {};
@@ -424,11 +433,12 @@ function IntegratedDetailTemplateInner<T extends Record<string, unknown>>(
}
// ===== Form 모드 - 커스텀 렌더러 =====
if (!isViewMode && renderForm) {
// View 모드에서 renderView가 없으면 renderForm으로 폴백 (EmployeeForm 등 renderForm만 사용하는 컴포넌트 지원)
if (renderForm && (!isViewMode || !renderView)) {
return (
<PageLayout>
<PageHeader
title={isCreateMode ? `${config.title} 등록` : `${config.title} 수정`}
title={isCreateMode ? `${config.title} 등록` : isViewMode ? config.title : `${config.title} 수정`}
description={config.description}
icon={config.icon}
actions={isTopButtons ? renderActionButtons() : undefined}
@@ -443,6 +453,16 @@ function IntegratedDetailTemplateInner<T extends Record<string, unknown>>(
{afterContent}
{/* 버튼 영역 - 하단 배치 시만 */}
{!isTopButtons && renderActionButtons('mt-6')}
{/* View 모드에서 renderForm 폴백 시 삭제 다이얼로그 필요 */}
{isViewMode && (
<DeleteConfirmDialog
open={showDeleteDialog}
onOpenChange={setShowDeleteDialog}
onConfirm={handleConfirmDelete}
title={deleteConfirm.title}
description={deleteConfirm.description}
/>
)}
</PageLayout>
);
}

View File

@@ -300,7 +300,7 @@ export function UniversalListPage<T>({
setSelectedItem(item);
setIsModalOpen(true);
} else if (detailMode === 'page') {
router.push(`/${locale}${config.basePath}/${id}`);
router.push(`/${locale}${config.basePath}/${id}?mode=view`);
}
},
[config.basePath, config.detailMode, getItemId, locale, router]
@@ -309,13 +309,13 @@ export function UniversalListPage<T>({
const handleEdit = useCallback(
(item: T) => {
const id = getItemId(item);
router.push(`/${locale}${config.basePath}/${id}/edit`);
router.push(`/${locale}${config.basePath}/${id}?mode=edit`);
},
[config.basePath, getItemId, locale, router]
);
const handleCreate = useCallback(() => {
router.push(`/${locale}${config.basePath}/new`);
router.push(`/${locale}${config.basePath}?mode=new`);
}, [config.basePath, locale, router]);
// ===== 삭제 핸들러 =====