Files
wace_plm/WebContent/WEB-INF/view/main/menu.jsp
2025-10-17 16:26:45 +09:00

574 lines
20 KiB
Plaintext

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="com.pms.common.utils.*"%>
<%@ page import="java.util.*" %>
<%@include file= "/init.jsp" %>
<%
ArrayList userMenuList = new ArrayList();
userMenuList = (ArrayList)request.getAttribute("userMenuList");
%>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>PLM</title>
<style>
/*
.menus_off{
color:#fff; padding: 5px 10px; font-size:11px; background-color:#F29661; border-radius:3px;
}
.menus_on{
color:#fff; padding: 5px 10px; font-size:11px; background-color:#B3A7A7; border-radius:3px;
}
*/
/* */
.menus_off{
/*
color:#000; //black
*/
color:#373740; /* dark gray로 변경 */
font-size:13px;
transition: color 0.3s ease;
}
.menus_on{
color:#B3A7A7;
font-size:13.1px;
transition: color 0.3s ease;
}
.smenu{
font-weight:bold;
transition: all 0.3s ease;
}
/* 메뉴 hover 효과 */
.main_menu:hover .smenu,
.menu2:hover .smenu {
color: #1159bc !important;
background-color: rgba(17, 89, 188, 0.1);
padding: 2px 5px;
border-radius: 3px;
}
/* 메뉴 컨테이너 스타일 */
#menu {
transition: opacity 0.3s ease;
}
/* 메뉴 아이템 애니메이션 */
.main_menu, .menu2 {
transition: all 0.3s ease;
cursor: pointer;
}
.main_menu:hover, .menu2:hover {
background-color: rgba(245, 245, 245, 0.8);
border-radius: 3px;
}
/* 메뉴 영역 전체 스타일 */
body {
transition: all 0.3s ease;
}
/* 고정 버튼 스타일 */
#menu-lock-btn {
position: absolute;
top: 10px;
right: 10px;
width: 30px;
height: 30px;
background-color: #f5f5f5;
border: 1px solid #ddd;
border-radius: 5px;
cursor: pointer;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.3s ease;
z-index: 10000;
}
#menu-lock-btn:hover {
background-color: #e8e8e8;
border-color: #1159bc;
}
#menu-lock-btn.locked {
background-color: #1159bc;
border-color: #1159bc;
}
#menu-lock-btn svg {
width: 18px;
height: 18px;
fill: #666;
transition: fill 0.3s ease;
}
#menu-lock-btn.locked svg {
fill: #fff;
}
</style>
<script type="text/javascript">
// 메뉴 고정 상태 플래그
var isMenuLocked = false;
$(function(){
$(document).ready(function () {
// 메뉴 고정 버튼 클릭 이벤트
$(document).on('click', '#menu-lock-btn', function() {
isMenuLocked = !isMenuLocked;
$(this).toggleClass('locked');
// 아이콘 전환
if(isMenuLocked) {
$(this).find('.lock-icon-unlocked').hide();
$(this).find('.lock-icon-locked').show();
console.log("메뉴 고정됨");
} else {
$(this).find('.lock-icon-unlocked').show();
$(this).find('.lock-icon-locked').hide();
console.log("메뉴 고정 해제됨");
}
});
//메뉴 슬라이드토글
$("[objType=menuObj]").on('click', function(){
var url = $(this).attr("url");
var menuId = $(this).attr("id");
var menuObjId = $(this).attr("menuObjId");
if("" != url){
url = url +"?menuObjId="+menuObjId;
$(window.parent.frames['contents_page'].document.location).attr("href",url);
}else{
$(".main_menu").click(function(){
var menuKey = $(this).attr("menuObjid");
$(".menu2").css({display:"none"});
$("[parentObjid="+menuKey+"]").css({display:"block"});
});
}
});
$(".menu2").hide();
//$(".menu2").show();
$('.main_menu').on('click', function(){
var menuObjId = $(this).attr("menuObjId");
$(".menu2").not($("[parentObjid="+menuObjId+"]")).slideUp();
$("[parentObjid="+menuObjId+"]").slideToggle();
//$(".menu2").css({display:"none"});
//$("[parentObjid="+menuObjId+"]").css({display:"block"});
});
//선택된 메뉴에 다른 스타일을 준다
$("#menu>.menu2>a").click(function(){
$("#menu>.menu2>a").css({backgroundColor:"rgba( 255, 255, 255, 0 )" , color : "#000"});
$(this).css({color : "#1159bc"});
});
$(".smenu").click(function(){
$(".menus_on").removeClass('menus_on').addClass('menus_off'); //이전 클릭한 메뉴 원복
$(this).removeClass('menus_off');
$(this).addClass('menus_on');
//var firstLink = $('#menu a').first();
fnm_changeContentsLocation($(this).attr("url"), $(this).attr("menuObjId"), this);
});
// 메뉴 영역에서 마우스가 벗어났을 때 자동 숨김 (애니메이션 적용)
var hideMenuTimer;
$(document).mouseleave(function(e) {
// 메뉴가 고정되어 있으면 자동 숨김 안 함
if(isMenuLocked) {
return;
}
// 마우스가 메뉴 프레임을 벗어났을 때
clearTimeout(hideMenuTimer);
hideMenuTimer = setTimeout(function() {
try {
if(parent && parent.frames && parent.frames["toggle_page"]) {
var toggleFrame = parent.frames["toggle_page"];
if(toggleFrame.fntg_changeSizeWithAnimation) {
toggleFrame.fntg_changeSizeWithAnimation();
}
}
} catch(e) {
console.log("Toggle frame not accessible:", e);
}
}, 500); // 0.5초 후 자동 숨김
});
// 메뉴 영역에 마우스가 다시 들어왔을 때 타이머 취소
$(document).mouseenter(function() {
clearTimeout(hideMenuTimer);
});
});
});
function fn_alert(){
alert("menu.jsp");
}
function fn_initMenuArea(){
$("#menu").empty();
$('#forced-menu').remove(); // 강제로 추가된 메뉴도 제거
}
function fnm_changeContentsLocation(url, menuObjId, obj){
if("" != url){
//$(".on").removeClass('on'); //이전 클릭한 메뉴 원복
//obj.className = "on";
//obj.classList.add("on");
//$(".menus_on").removeClass('menus_on').addClass('menus_off'); //이전 클릭한 메뉴 원복
//$(this).removeClass('menus_off');
//$(this).addClass('menus_on');
var qPositionIdx = url.indexOf('?');
if(qPositionIdx > -1){
url = url +"&menuObjId="+menuObjId;
}else{
url = url +"?menuObjId="+menuObjId;
}
$(window.parent.frames['contents_page'].document.location).attr("href",url);
}else{
//$(".menu2").css({display:"none"});
//$("[parentObjid="+menuObjId+"]").css({display:"block"});
}
}
function add_menu(objid, subMenuObjid, onlyViewMenu){
//Swal.fire("add_menu : " + objid + ":" + subMenuObjid + ":" + onlyViewMenu);
var menu ="";
if(fnc_isNotEmpty(objid)){
//console.log("objid가 비어있지 않음, AJAX 호출 시작");
$.ajax({
url:"/main/getmenu.do",
type:"POST",
data:{"MENUOBJID":objid},
dataType:"json",
async:false,
success:function(data){
//console.log("AJAX 응답 성공:", data);
if(data.RESULT && data.RESULT.length>0){
//console.log("메뉴 아이템 개수:", data.RESULT.length);
for(var i=0;i<data.RESULT.length;i++){
//menu +="<div class='main_menu' menuObjId="+data.RESULT[i].OBJID+"><span><a href='javascript:fnm_changeContentsLocation(\""+data.RESULT[i].MENU_URL+"\",\""+data.RESULT[i].OBJID+"\")' url='"+data.RESULT[i].MENU_URL+"' objType='menuObj' menuObjId='"+data.RESULT[i].OBJID+"'>"+data.RESULT[i].MENU_NAME_KOR+"</a></span></div>";
/*
if((fnc_isEmpty(subMenuObjid) && i==0) || !fnc_isEmpty(subMenuObjid) && subMenuObjid == data.RESULT[i].OBJID){
menu +="<div class='main_menu' menuObjId="+data.RESULT[i].OBJID+"><span><a href='javascript:fnm_changeContentsLocation(\""+data.RESULT[i].MENU_URL+"\",\""+data.RESULT[i].OBJID+"\", this)' class='smenu menus_on' url='"+data.RESULT[i].MENU_URL+"' objType='menuObj' menuObjId='"+data.RESULT[i].OBJID+"'>"+data.RESULT[i].MENU_NAME_KOR+"</a></span></div>";
if(!onlyViewMenu) fnm_changeContentsLocation(data.RESULT[i].MENU_URL, data.RESULT[i].OBJID);
}else{
*/
var lev = data.RESULT[i].LEVEL;
var menuClass = "main_menu"; // 모든 메뉴를 main_menu로 생성
var menuUrl = fnc_checkNull(data.RESULT[i].MENU_URL);
if(fnc_isNotEmpty(lev) && Number(lev) < 2){
menuClass = "main_menu";
menu +="<div class='"+menuClass+"' menuObjId="+data.RESULT[i].OBJID+" parentObjid="+data.RESULT[i].PARENT_OBJ_ID+"><span><a href='javascript:fnm_changeContentsLocation(\""+data.RESULT[i].MENU_URL+"\",\""+data.RESULT[i].OBJID+"\", this)' class='smenu menus_off' url='"+data.RESULT[i].MENU_URL+"' objType='menuObj' menuObjId='"+data.RESULT[i].OBJID+"'>"+data.RESULT[i].MENU_NAME_KOR+"</a></span></div>";
}else{
menuClass = "menu2";
menu +="<div class='"+menuClass+"' menuObjId="+data.RESULT[i].OBJID+" parentObjid="+data.RESULT[i].PARENT_OBJ_ID+"><span><a href='javascript:fnm_changeContentsLocation(\""+data.RESULT[i].MENU_URL+"\",\""+data.RESULT[i].OBJID+"\", this)' class='smenu menus_off' url='"+data.RESULT[i].MENU_URL+"' objType='menuObj' menuObjId='"+data.RESULT[i].OBJID+"'>"+data.RESULT[i].MENU_NAME_KOR+"</a></span></div>";
}
// console.log("메뉴 생성:", data.RESULT[i].MENU_NAME_KOR, "Level:", lev);
//menu +="<div class='main_menu' menuObjId="+data.RESULT[i].OBJID+"><span><a href='' class='smenu menus_off' url='"+data.RESULT[i].MENU_URL+"' objType='menuObj' menuObjId='"+data.RESULT[i].OBJID+"'>"+data.RESULT[i].MENU_NAME_KOR+"</a></span></div>";
//}
}
}
//console.log("생성된 메뉴 HTML 길이:", menu.length);
//console.log("생성된 메뉴 HTML:", menu.substring(0, 200) + "...");
},
error: function(jqxhr, status, error){
console.log("AJAX 오류:", error);
}
});
} else {
//console.log("objid가 비어있음, sel_menu 호출");
}
console.log("DOM 추가 전 - 메뉴 HTML 길이:", menu.length);
// 기존 메뉴 완전히 제거
$("#menu").empty();
$('#forced-menu').remove(); // 강제로 추가된 메뉴도 제거
$('#menu').addClass('clickable');
$("#menu").append(menu);
// 메뉴를 강제로 표시 (원래 위치에 맞게)
if(menu.length > 0) {
// 기존 강제 메뉴가 있다면 제거
$('#forced-menu').remove();
// 기존 메뉴 프레임의 위치 정보 가져오기
var menuFrame = window.frameElement;
var frameRect = menuFrame ? menuFrame.getBoundingClientRect() : {left: 0, top: 0};
// body에 메뉴 추가 (원래 디자인에 맞게)
$('body').append('<div id="forced-menu" style="position:absolute; top:10px; left:25px; background:white; padding:0; z-index:1000; width:170px; border:none;">' + menu + '</div>');
// 메뉴 아이템 스타일 적용 (원래 디자인)
$('#forced-menu .main_menu').css({
'display': 'block',
'padding': '0',
'margin': '0',
'cursor': 'pointer',
'border': 'none',
'background': 'transparent',
'width': '100%'
});
// 메뉴 앞에 화살표 아이콘 추가
$('#forced-menu .main_menu').each(function() {
var $link = $(this).find('.smenu');
var linkText = $link.text();
$link.html('▶ ' + linkText);
});
// 메뉴 링크 스타일 (원래 디자인)
$('#forced-menu .main_menu .smenu').css({
'display': 'block',
'padding': '8px 10px',
'color': '#373740',
'font-size': '13px',
'text-decoration': 'none',
'border-bottom': '1px solid #eee',
'transition': 'color 0.3s ease'
});
// 메뉴 hover 효과 (원래 디자인)
$('#forced-menu .main_menu').hover(
function() {
$(this).find('.smenu').css({
'color': '#1159bc',
'background-color': 'rgba(17, 89, 188, 0.1)'
});
},
function() {
$(this).find('.smenu').css({
'color': '#373740',
'background-color': 'transparent'
});
}
);
console.log("강제 메뉴 표시 완료");
}
console.log("DOM 추가 완료");
// 메뉴 컨테이너도 보이도록 설정
$('#menu').css({
'display': 'block !important',
'visibility': 'visible !important',
'opacity': '1 !important',
'position': 'static !important',
'top': 'auto !important',
'left': 'auto !important',
'margin-top': '10px !important',
'height': 'auto !important',
'min-height': '200px !important',
'overflow': 'visible !important',
'z-index': '9999 !important'
});
console.log("메뉴 컨테이너 CSS 설정 완료");
// 메뉴가 그려진 후 main_menu는 보이게 하고, menu2는 숨김
$(".main_menu").show().css({
'display': 'block !important',
'visibility': 'visible !important',
'opacity': '1 !important',
'position': 'relative !important',
'margin': '2px 0 !important',
'padding': '5px !important',
'height': 'auto !important',
'width': '100% !important',
'cursor': 'pointer !important'
});
$(".menu2").hide();
console.log("메뉴 요소 개수 확인:");
console.log("- #menu 요소:", $('#menu').length);
console.log("- .main_menu 요소:", $('.main_menu').length);
console.log("- .menu2 요소:", $('.menu2').length);
console.log("메뉴 가시성 확인:");
console.log("- #menu visible:", $('#menu').is(':visible'));
console.log("- .main_menu visible:", $('.main_menu').is(':visible'));
console.log("메뉴 위치 정보:", $('#menu').offset());
console.log("메뉴 크기:", $('#menu').width(), "x", $('#menu').height());
//var firstLink = $('#menu a').first();
//fnm_changeContentsLocation(firstLink.attr("url"));
$(".main_menu").click(function(){
var smenu = $(this).find(".smenu");
var url = $(smenu).attr("url");
var menuObjId = $(smenu).attr("menuObjId");
if($(smenu).hasClass('menus_on')){
//return;
}else{
$(".menu2").not($("[parentObjid="+menuObjId+"]")).slideUp();
$("[parentObjid="+menuObjId+"]").slideToggle();
}
$(".menus_on").removeClass('menus_on').addClass('menus_off'); //이전 클릭한 메뉴 원복
$(smenu).removeClass('menus_off');
$(smenu).addClass('menus_on');
//var firstLink = $('#menu a').first();
if(fnc_isNotEmpty(url)){
//alert('aa');
fnm_changeContentsLocation(url, menuObjId, this);
if(url.toUpperCase().indexOf('/DASHBOARD.DO') > -1){ //대시보드 전체화면
try {
if(parent && parent.frames && parent.frames["toggle_page"]) {
parent.frames["toggle_page"].fntg_changeSizeS();
}
} catch(e) {
console.log("Toggle frame error:", e);
}
}else{
try {
if(parent && parent.frames && parent.frames["toggle_page"]) {
parent.frames["toggle_page"].fntg_changeSizeM();
}
} catch(e) {
console.log("Toggle frame error:", e);
}
}
}else{
//alert('bb');
try {
if(parent && parent.frames && parent.frames["toggle_page"]) {
parent.frames["toggle_page"].fntg_changeSizeM();
}
} catch(e) {
console.log("Toggle frame error:", e);
}
var menu2 = $("[parentObjid="+menuObjId+"]")[0];
smenu = $(menu2).find(".smenu");
$(menu2).trigger("click");
url = $(smenu).attr("url");
menuObjId = $(smenu).attr("menuObjId");
fnm_changeContentsLocation(url, menuObjId, menu2);
}
});
//선택된 메뉴에 다른 스타일을 준다
$("#menu>.menu2").click(function(){
$("#menu>.menu2>span>a").css({backgroundColor:"rgba( 255, 255, 255, 0 )" , color : "#000"});
//$(this).find("span>a").css({backgroundColor:"rgba( 255, 255, 255, 0 )" , color : "#000"});
//$(this).find("span>a").css({color : "#1159bc"}); //파랑
$(this).find("span>a").css({color : "#B3A7AF"}); //회색
});
if(!onlyViewMenu){
if(fnc_isEmpty(subMenuObjid)){
$('#menu a').first().trigger("click");
}else{
$(".smenu").each(function(){
if(!fnc_isEmpty(subMenuObjid)){
var menuObjId = $(this).attr("menuObjId");
if(menuObjId == subMenuObjid){
//fnm_changeContentsLocation($(this).attr("url"), $(this).attr("menuObjId"), this);
$(this).trigger("click");
}
}
});
}
}else{
sel_menu(objid, subMenuObjid, onlyViewMenu);
}
// 메뉴 그리기 완료 후 자동 숨김 처리 (애니메이션 적용)
// 메뉴가 고정되어 있지 않을 때만 자동 숨김
setTimeout(function() {
if(!isMenuLocked) {
try {
if(parent && parent.frames && parent.frames["toggle_page"]) {
var toggleFrame = parent.frames["toggle_page"];
if(toggleFrame.fntg_changeSizeWithAnimation) {
toggleFrame.fntg_changeSizeWithAnimation();
}
}
} catch(e) {
console.log("Toggle frame not accessible:", e);
}
}
}, 300);
}
function sel_menu(objid, subMenuObjid, onlyViewMenu){
//Swal.fire("sel_menu - " + objid + ":" + subMenuObjid + ":" + onlyViewMenu);
$(".menus_on").removeClass('menus_on').addClass('menus_off'); //이전 클릭한 메뉴 원복
if(!onlyViewMenu){
if(!fnc_isEmpty(subMenuObjid)){
$(".smenu").each(function(){
var menuObjId = $(this).attr("menuObjId");
if(menuObjId == subMenuObjid){
$(this).addClass('menus_on');
//fnm_changeContentsLocation($(this).attr("url"), $(this).attr("menuObjId"), this);
//$(this).trigger("click");
}
});
}
}
}
</script>
</head>
<body id="menuback_w" style="height:100%;overflow-y: hidden; position: relative;">
<form name="menuForm" action="" method="post">
<!-- 메뉴 고정 버튼 -->
<div id="menu-lock-btn" title="메뉴 고정/해제">
<svg viewBox="0 0 24 24" class="lock-icon-unlocked">
<path d="M12,17A2,2 0 0,0 14,15C14,13.89 13.1,13 12,13A2,2 0 0,0 10,15A2,2 0 0,0 12,17M18,8A2,2 0 0,1 20,10V20A2,2 0 0,1 18,22H6A2,2 0 0,1 4,20V10C4,8.89 4.9,8 6,8H15V6A3,3 0 0,0 12,3A3,3 0 0,0 9,6H7A5,5 0 0,1 12,1A5,5 0 0,1 17,6V8H18Z"/>
</svg>
<svg viewBox="0 0 24 24" class="lock-icon-locked" style="display:none;">
<path d="M12,17A2,2 0 0,0 14,15C14,13.89 13.1,13 12,13A2,2 0 0,0 10,15A2,2 0 0,0 12,17M18,8A2,2 0 0,1 20,10V20A2,2 0 0,1 18,22H6A2,2 0 0,1 4,20V10C4,8.89 4.9,8 6,8H7V6A5,5 0 0,1 12,1A5,5 0 0,1 17,6V8H18M12,3A3,3 0 0,0 9,6V8H15V6A3,3 0 0,0 12,3Z"/>
</svg>
</div>
<!--
<div style="background:#f5f5f5;color:#000;font-size:11px;text-align:center;padding:5px;line-height:15px">Integrated Information<br/> Management System </div>
-->
<div style="height:1400px;overflow: hidden;">
<!--
<section id="comm_container">
<aside class="favoritCont" style="height:100%">
<div class="faovriteListCont mScrollV mCustomScrollbar _mCS_2 mCS_no_scrollbar"><div id="mCSB_2" class="mCustomScrollBox mCS-light mCSB_vertical mCSB_inside" style="max-height: none;" tabindex="0"><div id="mCSB_2_container" class="mCSB_container mCS_y_hidden mCS_no_scrollbar_y" style="position:relative; top:0; left:0;" dir="ltr"><div id="mCSB_2" class="mCustomScrollBox mCS-light mCSB_vertical mCSB_inside" style="max-height: none;" tabindex="0"><div id="mCSB_2_container" class="mCSB_container mCS_y_hidden mCS_no_scrollbar_y" style="position:relative; top:0; left:0;" dir="ltr">
<ul id="quickContainer" class="favoriteList"></ul>
</div><div id="mCSB_2_scrollbar_vertical" class="mCSB_scrollTools mCSB_2_scrollbar mCS-light mCSB_scrollTools_vertical" style="display: none;"><a href="https://www.e-iris.com/mail/layout/mail_Mail.do?CLSYS=mail&amp;CLMD=user&amp;CLBIZ=Mail#" class="mCSB_buttonUp" oncontextmenu="return false;"></a><div class="mCSB_draggerContainer"><div id="mCSB_2_dragger_vertical" class="mCSB_dragger" style="position: absolute; min-height: 0px; height: 0px; top: 0px;" oncontextmenu="return false;"><div class="mCSB_dragger_bar" style="line-height: 0px;"></div></div><div class="mCSB_draggerRail"></div></div><a href="https://www.e-iris.com/mail/layout/mail_Mail.do?CLSYS=mail&amp;CLMD=user&amp;CLBIZ=Mail#" class="mCSB_buttonDown" oncontextmenu="return false;"></a></div></div></div><div id="mCSB_2_scrollbar_vertical" class="mCSB_scrollTools mCSB_2_scrollbar mCS-light mCSB_scrollTools_vertical"><div class="mCSB_draggerContainer"><div id="mCSB_2_dragger_vertical" class="mCSB_dragger" style="position:absolute;" oncontextmenu="return false;"><div class="mCSB_dragger_bar"></div></div><div class="mCSB_draggerRail"></div></div></div></div></div>
<ul id="quickSetContainer" class="favorite_set clear"><li> <a class="btnFavAdd">즐겨찾기 추가</a></li></ul>
</aside>
</section>
-->
<div style="float:left;width:20px;height:100%;background:#606060;">
</div>
<div id="menu" style="float:left;width:100%;margin-left:5px">
</div>
</div>
</form>
</body>
</html>