단속 행위정보 - 각종 버그 수정 진행중...

dev
박성영 3 months ago
parent 58357b7aa0
commit 64138f96da

@ -15,6 +15,7 @@
p.CRDN_PHOTO_PATH,
p.CRDN_PHOTO_NM,
p.CRDN_PHOTO_SE_CD,
p.ACTN_INFO_ID,
cd.CD_NM AS CRDN_PHOTO_SE_CD_NM,
p.ORGNL_PHOTO_NM,
p.REG_DT,
@ -25,6 +26,9 @@
FROM tb_crdn_photo p
LEFT JOIN tb_cd_detail cd ON cd.CD_GROUP_ID = 'CRDN_PHOTO_SE_CD' AND cd.CD_ID = p.CRDN_PHOTO_SE_CD
WHERE p.ACT_INFO_ID = #{actInfoId}
<if test='actnInfoId != null and actnInfoId != ""'>
AND p.ACTN_INFO_ID = #{actnInfoId}
</if>
<if test='crdnPhotoSeCd != null and crdnPhotoSeCd != ""'>
AND p.CRDN_PHOTO_SE_CD = #{crdnPhotoSeCd}
</if>

@ -427,7 +427,7 @@
'<div class="photo-preview-item existing-photo" data-act-info-id="' + photo.actInfoId + '" data-photo-sn="' + photo.crdnPhotoSn + '" data-photo-type="2">' +
' <div class="photo-thumbnail">' +
' <img src="<c:url value='/crdn/crndRegistAndView/crdnActInfo/downloadPhoto.do'/>?actInfoId=' + photo.actInfoId + '&crdnPhotoSn=' + photo.crdnPhotoSn + '"' +
' alt="' + photo.orgnlPhotoNm + '" onclick="viewOriginalPhoto(\'' + photo.actnInfoId + '\', \'' + photo.actInfoId + '\', \'' + photo.crdnPhotoSn + '\', \'' + photo.crdnPhotoSeCd + '\')">' +
' alt="' + photo.orgnlPhotoNm + '" onclick="CrdnActnInfoRegistPopup.viewOriginalPhoto(\'' + photo.actnInfoId + '\', \'' + photo.actInfoId + '\', \'' + photo.crdnPhotoSn + '\', \'' + photo.crdnPhotoSeCd + '\')">' +
' </div>' +
' <div class="photo-info">' +
' <div class="photo-name" title="' + photo.orgnlPhotoNm + '">' + photo.orgnlPhotoNm + '</div>' +
@ -706,14 +706,13 @@
window.opener.focus();
}
window.close();
}
};
},
function viewOriginalPhoto(actnInfoId, actInfoId, crdnPhotoSn, crdnPhotoSeCd) {
var url = '<c:url value="/crdn/crndRegistAndView/crdnActInfo/photoView.do"/>?actnInfoId=' + actnInfoId + '&actInfoId=' + actInfoId + '&crdnPhotoSn=' + crdnPhotoSn + '&crdnPhotoSeCd=' + crdnPhotoSeCd ;
openPopup(url, 1000, 700, '_blank');
}
viewOriginalPhoto: function(actnInfoId, actInfoId, crdnPhotoSn, crdnPhotoSeCd) {
var url = '<c:url value="/crdn/crndRegistAndView/crdnActInfo/photoView.do"/>?actnInfoId=' + actnInfoId + '&actInfoId=' + actInfoId + '&crdnPhotoSn=' + crdnPhotoSn + '&crdnPhotoSeCd=' + crdnPhotoSeCd ;
openPopup(url, 1000, 700, '_blank');
},
};
$(document).ready(function() {

@ -53,69 +53,8 @@ $(document).ajaxError( function( event, jqxhr, settings, exception ){
if( jqxhr.responseJSON ){
// 세션 만료인 경우 처리
if(jqxhr.responseJSON.errorCode === "SESSION_EXPIRED") {
// 팝업창인지 확인
if (window.opener && !window.opener.closed) {
// 팝업창인 경우 세션 만료 메시지 표시
alert("세션이 종료되었습니다. 로그인 페이지로 이동합니다.");
try {
// 중요로직: 최상위 부모창 찾기 (다중 팝업 처리)
var topWindow = window;
while (topWindow.opener && !topWindow.opener.closed) {
topWindow = topWindow.opener;
}
// 최상위 부모창을 로그인 페이지로 이동
if (topWindow && !topWindow.closed) {
topWindow.location.href = loginUrl;
} else {
// 부모창이 닫혀있는 경우 현재 창에서 이동
location.href = loginUrl;
}
// 중요로직: 메인창 외에 모든 팝업창 종료 - 현재창부터 최상위까지 순차적으로 닫기
setTimeout(function() {
try {
var currentWindow = window;
var windowsToClose = [];
// 현재 창부터 최상위 부모창까지의 모든 팝업창 수집
while (currentWindow && currentWindow.opener && !currentWindow.opener.closed) {
windowsToClose.push(currentWindow);
currentWindow = currentWindow.opener;
}
// 수집된 모든 팝업창을 역순으로 닫기 (하위창부터 상위창 순서)
for (var i = 0; i < windowsToClose.length; i++) {
try {
console.log('[세션만료] 팝업창 닫기 시도:', i + 1, '/', windowsToClose.length);
windowsToClose[i].close();
} catch (closeError) {
console.warn('[세션만료] 팝업창 닫기 실패:', closeError);
}
}
console.log('[세션만료] 총', windowsToClose.length, '개의 팝업창 닫기 완료');
} catch (e) {
console.warn('[세션만료] 팝업창 일괄 닫기 실패:', e);
// 기본 방식으로 현재 창 닫기
try {
window.close();
} catch (fallbackError) {
console.warn('[세션만료] 기본 방식 팝업창 닫기도 실패:', fallbackError);
}
}
}, 100);
} catch (e) {
console.error("팝업 세션 만료 처리 중 오류:", e);
// 오류 발생 시 현재 창에서 로그인 페이지로 이동
location.href = loginUrl;
}
} else {
// 일반 페이지인 경우 메시지 표시 후 로그인 페이지로 이동
alert(jqxhr.responseJSON.message);
location.href = loginUrl;
}
// 새로운 공통 함수를 사용하여 세션 만료 처리
handleSessionExpired();
} else if(jqxhr.responseJSON.errorCode === "MessageException") {
alert(jqxhr.responseJSON.message);
} else if(jqxhr.responseJSON.errorCode === "MESSAGE") {
@ -397,6 +336,124 @@ function makeColorTransparent(color, opacity) {
return color;
}
/**
* 모든 팝업을 닫고 메인페이지를 로그인 페이지로 이동시키는 함수
* 중요로직: 다중 팝업 구조에서 안전하게 모든 팝업을 닫고 최상위 창만 로그인 페이지로 이동
* @param {string} message - 사용자에게 표시할 메시지 (선택사항)
* @param {boolean} showAlert - alert 표시 여부 (기본값: true)
*/
function redirectToLoginWithCloseAllPopups(message, showAlert) {
try {
// 기본값 설정
if (showAlert === undefined) showAlert = true;
if (!message) message = "로그인 페이지로 이동합니다.";
// 메시지 표시
if (showAlert) {
alert(message);
}
// 중요로직: 최상위 부모창 찾기 (다중 팝업 처리)
var topWindow = window;
var currentWindow = window;
// 현재 창부터 최상위까지의 모든 창 정보 수집
var windowChain = [];
while (currentWindow) {
windowChain.push({
window: currentWindow,
isPopup: !!(currentWindow.opener && !currentWindow.opener.closed)
});
if (currentWindow.opener && !currentWindow.opener.closed) {
currentWindow = currentWindow.opener;
topWindow = currentWindow;
} else {
break;
}
}
console.log('[로그인 리다이렉트] 창 체인 정보:', windowChain.length + '개의 창 감지');
// 최상위 부모창을 로그인 페이지로 이동
if (topWindow && !topWindow.closed) {
try {
topWindow.location.href = (contextPath || '') + loginUrl;
console.log('[로그인 리다이렉트] 최상위 창 리다이렉트 성공');
} catch (redirectError) {
console.warn('[로그인 리다이렉트] 최상위 창 리다이렉트 실패:', redirectError);
// 리다이렉트 실패 시 현재 창에서 이동
location.href = (contextPath || '') + loginUrl;
}
} else {
// 최상위 창이 닫혀있는 경우 현재 창에서 이동
location.href = (contextPath || '') + loginUrl;
console.log('[로그인 리다이렉트] 현재 창에서 리다이렉트');
}
// 중요로직: 메인창 외에 모든 팝업창 종료
setTimeout(function() {
try {
var popupsToClose = windowChain.filter(function(item) {
return item.isPopup;
});
console.log('[로그인 리다이렉트] 닫을 팝업 수:', popupsToClose.length);
// 수집된 모든 팝업창을 닫기 (하위창부터 상위창 순서)
for (var i = 0; i < popupsToClose.length; i++) {
try {
var popupWindow = popupsToClose[i].window;
if (popupWindow && !popupWindow.closed) {
popupWindow.close();
console.log('[로그인 리다이렉트] 팝업창 닫기 성공:', i + 1);
}
} catch (closeError) {
console.warn('[로그인 리다이렉트] 팝업창 닫기 실패:', closeError);
}
}
console.log('[로그인 리다이렉트] 모든 팝업창 닫기 완료');
} catch (e) {
console.warn('[로그인 리다이렉트] 팝업창 일괄 닫기 실패:', e);
// 기본 방식으로 현재 창 닫기 시도
if (window.opener && !window.opener.closed) {
try {
window.close();
} catch (fallbackError) {
console.warn('[로그인 리다이렉트] 기본 방식 팝업창 닫기도 실패:', fallbackError);
}
}
}
}, 200); // 리다이렉트 후 약간의 지연을 두어 안정성 확보
} catch (e) {
console.error("[로그인 리다이렉트] 전체 처리 중 오류:", e);
// 모든 처리가 실패한 경우 현재 창에서 로그인 페이지로 이동
try {
location.href = (contextPath || '') + loginUrl;
} catch (finalError) {
console.error("[로그인 리다이렉트] 최종 리다이렉트도 실패:", finalError);
// 최후의 수단으로 새로고침
location.reload();
}
}
}
/**
* 로그아웃 함수 - 모든 팝업을 닫고 로그인 페이지로 이동
*/
function logout() {
redirectToLoginWithCloseAllPopups("로그아웃 되었습니다.");
}
/**
* 세션 만료 처리 함수 - 모든 팝업을 닫고 로그인 페이지로 이동
*/
function handleSessionExpired() {
redirectToLoginWithCloseAllPopups("세션이 종료되었습니다. 다시 로그인해주세요.");
}
/**
* 페이지 로드 모든 selectbox에 자동 색상 적용
*/

Loading…
Cancel
Save