기능 중복된 함수 제거, 메뉴 삭제시 하위메뉴 존재하면 삭제불가 처리

This commit is contained in:
2026-01-14 18:36:24 +09:00
parent 1947d15497
commit 4baaeb3c1d
2 changed files with 47 additions and 37 deletions

View File

@@ -160,6 +160,7 @@ const AdminMenuManagement: React.FC = () => {
const [loading, setLoading] = useState(false);
const [modalVisible, setModalVisible] = useState(false);
const [deleteModalVisible, setDeleteModalVisible] = useState(false);
const [hasChildMenus, setHasChildMenus] = useState(false);
const [iconPickerVisible, setIconPickerVisible] = useState(false);
const [isEditMode, setIsEditMode] = useState(false);
const [selectedMenu, setSelectedMenu] = useState<AdminMenu | null>(null);
@@ -340,9 +341,22 @@ const AdminMenuManagement: React.FC = () => {
};
// 메뉴 삭제 모달 열기
const handleDeleteClick = (menu: AdminMenu) => {
setSelectedMenu(menu);
setDeleteModalVisible(true);
const handleDeleteClick = async (menu: AdminMenu) => {
if (!menu.adminMenuSeq) return;
try {
// 하위 메뉴 존재 여부 확인
const childMenusResponse = await getAdminMenuListByParentSeq(menu.adminMenuSeq);
setHasChildMenus(childMenusResponse.totalContent > 0);
setSelectedMenu(menu);
setDeleteModalVisible(true);
} catch (error) {
console.error('하위 메뉴 확인 실패:', error);
// 에러 발생 시에도 모달은 열되, 삭제 불가로 처리
setHasChildMenus(true);
setSelectedMenu(menu);
setDeleteModalVisible(true);
}
};
// 입력 필드 변경 처리
@@ -464,15 +478,14 @@ const AdminMenuManagement: React.FC = () => {
</CButton>
</div>
<CTable align="middle" className="mb-0 border" hover responsive style={{ tableLayout: 'fixed', minWidth: isCompact ? '400px' : '650px' }}>
<CTable align="middle" className="mb-0 border" hover responsive style={{ tableLayout: 'fixed', minWidth: isCompact ? 'auto' : '650px' }}>
<CTableHead className="text-nowrap">
<CTableRow>
<CTableHeaderCell className="bg-body-tertiary text-center" style={{ width: '80px' }}> </CTableHeaderCell>
<CTableHeaderCell className="bg-body-tertiary text-center" style={{ width: '70px' }}></CTableHeaderCell>
{!isCompact && (
<CTableHeaderCell className="bg-body-tertiary text-center" style={{ width: '60px' }}></CTableHeaderCell>
)}
<CTableHeaderCell className="bg-body-tertiary text-center" style={{ width: '180px' }}> </CTableHeaderCell>
<CTableHeaderCell className="bg-body-tertiary text-center" style={{ width: '70px' }}></CTableHeaderCell>
<CTableHeaderCell className="bg-body-tertiary text-center" style={{ width: isCompact ? 'auto' : '180px' }}> </CTableHeaderCell>
{!isCompact && (
<CTableHeaderCell className="bg-body-tertiary text-center" style={{ width: 'auto' }}>URL</CTableHeaderCell>
)}
@@ -482,22 +495,20 @@ const AdminMenuManagement: React.FC = () => {
<CTableBody style={{ minHeight: '200px' }}>
{loading ? (
<CTableRow>
<CTableDataCell colSpan={isCompact ? 4 : 6} className="text-center py-5">
<CTableDataCell colSpan={isCompact ? 3 : 5} className="text-center py-5">
...
</CTableDataCell>
</CTableRow>
) : menuList.length === 0 ? (
<CTableRow>
<CTableDataCell colSpan={isCompact ? 4 : 6} className="text-center">
<CTableDataCell colSpan={isCompact ? 3 : 5} className="text-center">
.
</CTableDataCell>
</CTableRow>
) : (
menuList.map((menu) => (
<CTableRow key={menu.adminMenuSeq}>
<CTableDataCell className="text-center">
<div className="fw-semibold">{menu.adminMenuSeq}</div>
</CTableDataCell>
<CTableDataCell className="text-center">{menu.menuOrder}</CTableDataCell>
{!isCompact && (
<CTableDataCell className="text-center">
{menu.iconName && getIconByName(menu.iconName) ? (
@@ -526,7 +537,6 @@ const AdminMenuManagement: React.FC = () => {
</a>
</div>
</CTableDataCell>
<CTableDataCell className="text-center">{menu.menuOrder}</CTableDataCell>
{!isCompact && (
<CTableDataCell className="text-center">
<div
@@ -761,19 +771,34 @@ const AdminMenuManagement: React.FC = () => {
<CModalTitle> </CModalTitle>
</CModalHeader>
<CModalBody>
<strong>{selectedMenu?.menuName}</strong> ?
<br />
<small className="text-danger">
. .
</small>
{hasChildMenus ? (
<>
<div className="text-danger mb-2">
<CIcon icon={cilWarning} className="me-2" />
<strong> .</strong>
</div>
<p>
<strong>{selectedMenu?.menuName}</strong> .
</p>
<small className="text-muted">
.
</small>
</>
) : (
<>
<strong>{selectedMenu?.menuName}</strong> ?
</>
)}
</CModalBody>
<CModalFooter>
<CButton color="secondary" onClick={() => setDeleteModalVisible(false)}>
</CButton>
<CButton color="danger" onClick={handleDelete}>
{hasChildMenus ? '닫기' : '취소'}
</CButton>
{!hasChildMenus && (
<CButton color="danger" onClick={handleDelete}>
</CButton>
)}
</CModalFooter>
</CModal>
</>