|
|
|
@ -11,93 +11,139 @@
|
|
|
|
<%-- 활성화된 메뉴 정보 저장할 변수 --%>
|
|
|
|
<%-- 활성화된 메뉴 정보 저장할 변수 --%>
|
|
|
|
<c:set var="activeMenuId" value="" scope="request" />
|
|
|
|
<c:set var="activeMenuId" value="" scope="request" />
|
|
|
|
<c:set var="activeSubMenuId" value="" scope="request" />
|
|
|
|
<c:set var="activeSubMenuId" value="" scope="request" />
|
|
|
|
|
|
|
|
<c:set var="activeThirdMenuId" value="" scope="request" />
|
|
|
|
<%-- 콘솔 디버깅 용도 (개발 환경에서만 사용) --%>
|
|
|
|
|
|
|
|
<!-- Current URL: ${currentUrl} -->
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<!-- Sidebar body -->
|
|
|
|
<!-- Sidebar body -->
|
|
|
|
<div class="sidebar-body">
|
|
|
|
<div class="sidebar-body">
|
|
|
|
<ul class="nav treeview mb-4" data-accordion>
|
|
|
|
<ul class="nav treeview mb-4" data-accordion>
|
|
|
|
<c:if test="${not empty sessionScope.sessionVO.menus}">
|
|
|
|
<c:if test="${not empty sessionScope.sessionVO.menus}">
|
|
|
|
<c:forEach var="menu" items="${sessionScope.sessionVO.menus}">
|
|
|
|
<c:forEach var="menu" items="${sessionScope.sessionVO.menus}">
|
|
|
|
<c:if test="${menu.useYn eq 'Y' and menu.viewYn eq 'Y'}">
|
|
|
|
<c:if test="${menu.useYn eq 'Y' and menu.viewYn eq 'Y'}">
|
|
|
|
<%-- 메뉴 상태 변수 초기화 (unescape 처리) --%>
|
|
|
|
<%-- 메뉴 상태 변수 초기화 (unescape 처리) --%>
|
|
|
|
<c:set var="menuUrl" value="${not empty menu.menuUrl ? xssUtil.unescape(menu.menuUrl) : '#'}" />
|
|
|
|
<c:set var="menuUrl" value="${not empty menu.menuUrl ? xssUtil.unescape(menu.menuUrl) : '#'}" />
|
|
|
|
<c:set var="menuUrlPattern" value="${not empty menu.urlPattern ? xssUtil.unescape(menu.urlPattern) : ''}" />
|
|
|
|
<c:set var="menuUrlPattern" value="${not empty menu.urlPattern ? xssUtil.unescape(menu.urlPattern) : ''}" />
|
|
|
|
<c:set var="isMenuActive" value="false" />
|
|
|
|
<c:set var="isMenuActive" value="false" />
|
|
|
|
<c:set var="hasActiveChild" value="false" />
|
|
|
|
<c:set var="hasActiveChild" value="false" />
|
|
|
|
|
|
|
|
|
|
|
|
<%-- 메인 메뉴 활성화 상태 확인 (디버깅 정보 추가) --%>
|
|
|
|
|
|
|
|
<c:if test="${not empty menuUrlPattern && menuUrl != '#'}">
|
|
|
|
|
|
|
|
<c:set var="patterns" value="${fn:split(menuUrlPattern, ',')}" />
|
|
|
|
|
|
|
|
<!-- Menu ID: ${menu.menuId}, Patterns: ${menuUrlPattern} -->
|
|
|
|
|
|
|
|
<c:forEach var="pattern" items="${patterns}">
|
|
|
|
|
|
|
|
<c:set var="trimmedPattern" value="${fn:trim(pattern)}" />
|
|
|
|
|
|
|
|
<!-- Checking pattern: "${trimmedPattern}" against URL: "${currentUrl}" -->
|
|
|
|
|
|
|
|
<c:if test="${path:match(trimmedPattern, currentUrl)}">
|
|
|
|
|
|
|
|
<c:set var="isMenuActive" value="true" />
|
|
|
|
|
|
|
|
<c:set var="activeMenuId" value="${menu.menuId}" scope="request" />
|
|
|
|
|
|
|
|
<!-- Pattern matched! Menu ${menu.menuId} is active -->
|
|
|
|
|
|
|
|
</c:if>
|
|
|
|
|
|
|
|
</c:forEach>
|
|
|
|
|
|
|
|
</c:if>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<%-- 서브메뉴 처리 및 활성화 상태 확인 --%>
|
|
|
|
<%-- 1뎁스 메뉴 활성화 상태 확인 --%>
|
|
|
|
<c:if test="${not empty menu.children}">
|
|
|
|
<c:if test="${not empty menuUrlPattern && menuUrl != '#'}">
|
|
|
|
<c:forEach var="subMenu" items="${menu.children}">
|
|
|
|
<c:set var="patterns" value="${fn:split(menuUrlPattern, ',')}" />
|
|
|
|
<c:if test="${subMenu.useYn eq 'Y' and subMenu.viewYn eq 'Y'}">
|
|
|
|
<c:forEach var="pattern" items="${patterns}">
|
|
|
|
<%-- 서브메뉴 URL unescape 처리 --%>
|
|
|
|
<c:set var="trimmedPattern" value="${fn:trim(pattern)}" />
|
|
|
|
<c:set var="subMenuUrl" value="${not empty subMenu.menuUrl ? xssUtil.unescape(subMenu.menuUrl) : '#'}" />
|
|
|
|
<c:if test="${path:match(trimmedPattern, currentUrl)}">
|
|
|
|
<c:set var="subMenuUrlPattern" value="${not empty subMenu.urlPattern ? xssUtil.unescape(subMenu.urlPattern) : ''}" />
|
|
|
|
<c:set var="isMenuActive" value="true" />
|
|
|
|
<c:set var="isSubMenuActive" value="false" />
|
|
|
|
<c:set var="activeMenuId" value="${menu.menuId}" scope="request" />
|
|
|
|
|
|
|
|
|
|
|
|
<%-- 서브메뉴 활성화 상태 확인 (디버깅 정보 추가) --%>
|
|
|
|
|
|
|
|
<c:if test="${not empty subMenuUrlPattern && subMenuUrl != '#'}">
|
|
|
|
|
|
|
|
<c:set var="subPatterns" value="${fn:split(subMenuUrlPattern, ',')}" />
|
|
|
|
|
|
|
|
<!-- SubMenu ID: ${subMenu.menuId}, Patterns: ${subMenuUrlPattern} -->
|
|
|
|
|
|
|
|
<c:forEach var="subPattern" items="${subPatterns}">
|
|
|
|
|
|
|
|
<c:set var="trimmedSubPattern" value="${fn:trim(subPattern)}" />
|
|
|
|
|
|
|
|
<!-- Checking subpattern: "${trimmedSubPattern}" against URL: "${currentUrl}" -->
|
|
|
|
|
|
|
|
<c:if test="${path:match(trimmedSubPattern, currentUrl)}">
|
|
|
|
|
|
|
|
<c:set var="isSubMenuActive" value="true" />
|
|
|
|
|
|
|
|
<c:set var="activeSubMenuId" value="${subMenu.menuId}" scope="request" />
|
|
|
|
|
|
|
|
<c:set var="hasActiveChild" value="true" />
|
|
|
|
|
|
|
|
<!-- SubPattern matched! SubMenu ${subMenu.menuId} is active -->
|
|
|
|
|
|
|
|
</c:if>
|
|
|
|
|
|
|
|
</c:forEach>
|
|
|
|
|
|
|
|
</c:if>
|
|
|
|
</c:if>
|
|
|
|
</c:if>
|
|
|
|
</c:forEach>
|
|
|
|
</c:forEach>
|
|
|
|
</c:if>
|
|
|
|
</c:if>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<%-- 메뉴 렌더링 --%>
|
|
|
|
|
|
|
|
<li class="nav-item" data-menu-id="${menu.menuId}" data-url-pattern="${menuUrlPattern}">
|
|
|
|
|
|
|
|
<a href="<c:url value="${empty menuUrl ? '#' : menuUrl}" />" class="nav-link has-icon ${not empty menu.children ? 'treeview-toggle' : ''} ${isMenuActive || hasActiveChild ? 'active show' : ''}">
|
|
|
|
|
|
|
|
<c:if test="${not empty menu.menuIcon}"><i data-feather="${menu.menuIcon}"></i></c:if>${menu.menuNm}
|
|
|
|
|
|
|
|
</a>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<%-- 서브메뉴 렌더링 --%>
|
|
|
|
<%-- 2뎁스 & 3뎁스 활성화 상태 확인 --%>
|
|
|
|
<c:if test="${not empty menu.children}">
|
|
|
|
<c:if test="${not empty menu.children}">
|
|
|
|
<ul class="nav" style="${isMenuActive || hasActiveChild ? '' : ''}">
|
|
|
|
<c:forEach var="subMenu" items="${menu.children}">
|
|
|
|
<c:forEach var="subMenu" items="${menu.children}">
|
|
|
|
<c:if test="${subMenu.useYn eq 'Y' and subMenu.viewYn eq 'Y'}">
|
|
|
|
<c:if test="${subMenu.useYn eq 'Y' and subMenu.viewYn eq 'Y'}">
|
|
|
|
<%-- 2뎁스 URL --%>
|
|
|
|
<%-- 서브메뉴 URL unescape 처리 --%>
|
|
|
|
<c:set var="subMenuUrl" value="${not empty subMenu.menuUrl ? xssUtil.unescape(subMenu.menuUrl) : '#'}" />
|
|
|
|
<c:set var="subMenuUrl" value="${not empty subMenu.menuUrl ? xssUtil.unescape(subMenu.menuUrl) : '#'}" />
|
|
|
|
<c:set var="subMenuUrlPattern" value="${not empty subMenu.urlPattern ? xssUtil.unescape(subMenu.urlPattern) : ''}" />
|
|
|
|
<c:set var="subMenuUrlPattern" value="${not empty subMenu.urlPattern ? xssUtil.unescape(subMenu.urlPattern) : ''}" />
|
|
|
|
<c:set var="isSubMenuActive" value="false" />
|
|
|
|
<c:set var="isSubMenuActive" value="${activeSubMenuId eq subMenu.menuId}" />
|
|
|
|
|
|
|
|
|
|
|
|
<%-- 2뎁스 활성화 확인 --%>
|
|
|
|
|
|
|
|
<c:if test="${not empty subMenuUrlPattern && subMenuUrl != '#'}">
|
|
|
|
|
|
|
|
<c:set var="subPatterns" value="${fn:split(subMenuUrlPattern, ',')}" />
|
|
|
|
|
|
|
|
<c:forEach var="subPattern" items="${subPatterns}">
|
|
|
|
|
|
|
|
<c:set var="trimmedSubPattern" value="${fn:trim(subPattern)}" />
|
|
|
|
|
|
|
|
<c:if test="${path:match(trimmedSubPattern, currentUrl)}">
|
|
|
|
|
|
|
|
<c:set var="isSubMenuActive" value="true" />
|
|
|
|
|
|
|
|
<c:set var="activeSubMenuId" value="${subMenu.menuId}" scope="request" />
|
|
|
|
|
|
|
|
<c:set var="hasActiveChild" value="true" />
|
|
|
|
|
|
|
|
</c:if>
|
|
|
|
|
|
|
|
</c:forEach>
|
|
|
|
|
|
|
|
</c:if>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<%-- 3뎁스(손자 메뉴) 활성화 확인 --%>
|
|
|
|
|
|
|
|
<c:if test="${not empty subMenu.children}">
|
|
|
|
|
|
|
|
<c:forEach var="thirdMenu" items="${subMenu.children}">
|
|
|
|
|
|
|
|
<c:if test="${thirdMenu.useYn eq 'Y' and thirdMenu.viewYn eq 'Y'}">
|
|
|
|
|
|
|
|
<c:set var="thirdMenuUrl" value="${not empty thirdMenu.menuUrl ? xssUtil.unescape(thirdMenu.menuUrl) : '#'}" />
|
|
|
|
|
|
|
|
<c:set var="thirdMenuUrlPattern" value="${not empty thirdMenu.urlPattern ? xssUtil.unescape(thirdMenu.urlPattern) : ''}" />
|
|
|
|
|
|
|
|
|
|
|
|
<li class="nav-item ${isSubMenuActive ? 'show' : ''}" data-menu-id="${subMenu.menuId}" data-url-pattern="${subMenuUrlPattern}">
|
|
|
|
<c:if test="${not empty thirdMenuUrlPattern && thirdMenuUrl != '#'}">
|
|
|
|
<a href="<c:url value='${subMenuUrl}' />" class="nav-link">${subMenu.menuNm}</a>
|
|
|
|
<c:set var="thirdPatterns" value="${fn:split(thirdMenuUrlPattern, ',')}" />
|
|
|
|
</li>
|
|
|
|
<c:forEach var="thirdPattern" items="${thirdPatterns}">
|
|
|
|
|
|
|
|
<c:set var="trimmedThirdPattern" value="${fn:trim(thirdPattern)}" />
|
|
|
|
|
|
|
|
<c:if test="${path:match(trimmedThirdPattern, currentUrl)}">
|
|
|
|
|
|
|
|
<%-- 3뎁스가 active면 부모(2뎁스, 1뎁스)도 전부 펼쳐줘야 함 --%>
|
|
|
|
|
|
|
|
<c:set var="hasActiveChild" value="true" />
|
|
|
|
|
|
|
|
<c:set var="activeSubMenuId" value="${subMenu.menuId}" scope="request" />
|
|
|
|
|
|
|
|
<c:set var="activeThirdMenuId" value="${thirdMenu.menuId}" scope="request" />
|
|
|
|
|
|
|
|
</c:if>
|
|
|
|
|
|
|
|
</c:forEach>
|
|
|
|
|
|
|
|
</c:if>
|
|
|
|
|
|
|
|
</c:if>
|
|
|
|
|
|
|
|
</c:forEach>
|
|
|
|
</c:if>
|
|
|
|
</c:if>
|
|
|
|
</c:forEach>
|
|
|
|
</c:if>
|
|
|
|
</ul>
|
|
|
|
</c:forEach>
|
|
|
|
</c:if>
|
|
|
|
</c:if>
|
|
|
|
</li>
|
|
|
|
|
|
|
|
</c:if>
|
|
|
|
|
|
|
|
</c:forEach>
|
|
|
|
|
|
|
|
</c:if>
|
|
|
|
|
|
|
|
</ul>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<%-- 1뎁스 메뉴 렌더링 --%>
|
|
|
|
|
|
|
|
<li class="nav-item" data-menu-id="${menu.menuId}" data-url-pattern="${menuUrlPattern}">
|
|
|
|
|
|
|
|
<a href="<c:url value='${empty menuUrl ? "#" : menuUrl}' />"
|
|
|
|
|
|
|
|
class="nav-link has-icon ${not empty menu.children ? 'treeview-toggle' : ''} ${isMenuActive || hasActiveChild ? 'active show' : ''}">
|
|
|
|
|
|
|
|
<c:if test="${not empty menu.menuIcon}">
|
|
|
|
|
|
|
|
<i data-feather="${menu.menuIcon}"></i>
|
|
|
|
|
|
|
|
</c:if>
|
|
|
|
|
|
|
|
${menu.menuNm}
|
|
|
|
|
|
|
|
</a>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<%-- 2뎁스 & 3뎁스 메뉴 렌더링 --%>
|
|
|
|
|
|
|
|
<c:if test="${not empty menu.children}">
|
|
|
|
|
|
|
|
<ul class="nav" style="${isMenuActive || hasActiveChild ? '' : ''}">
|
|
|
|
|
|
|
|
<c:forEach var="subMenu" items="${menu.children}">
|
|
|
|
|
|
|
|
<c:if test="${subMenu.useYn eq 'Y' and subMenu.viewYn eq 'Y'}">
|
|
|
|
|
|
|
|
<%-- 2뎁스 URL --%>
|
|
|
|
|
|
|
|
<c:set var="subMenuUrl" value="${not empty subMenu.menuUrl ? xssUtil.unescape(subMenu.menuUrl) : '#'}" />
|
|
|
|
|
|
|
|
<c:set var="subMenuUrlPattern" value="${not empty subMenu.urlPattern ? xssUtil.unescape(subMenu.urlPattern) : ''}" />
|
|
|
|
|
|
|
|
<c:set var="isSubMenuActive" value="${activeSubMenuId eq subMenu.menuId}" />
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="nav-item ${isSubMenuActive ? 'show' : ''}"
|
|
|
|
|
|
|
|
data-menu-id="${subMenu.menuId}"
|
|
|
|
|
|
|
|
data-url-pattern="${subMenuUrlPattern}">
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<a href="<c:url value='${subMenuUrl}' />"
|
|
|
|
|
|
|
|
class="nav-link ${not empty subMenu.children ? 'treeview-toggle' : ''} ${isSubMenuActive ? 'active' : ''}">
|
|
|
|
|
|
|
|
${subMenu.menuNm}
|
|
|
|
|
|
|
|
</a>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<%-- 3뎁스 메뉴 렌더링 --%>
|
|
|
|
|
|
|
|
<c:if test="${not empty subMenu.children}">
|
|
|
|
|
|
|
|
<ul class="nav nav-3depth" style="${isSubMenuActive ? '' : ''}">
|
|
|
|
|
|
|
|
<c:forEach var="thirdMenu" items="${subMenu.children}">
|
|
|
|
|
|
|
|
<c:if test="${thirdMenu.useYn eq 'Y' and thirdMenu.viewYn eq 'Y'}">
|
|
|
|
|
|
|
|
<c:set var="thirdMenuUrl" value="${not empty thirdMenu.menuUrl ? xssUtil.unescape(thirdMenu.menuUrl) : '#'}" />
|
|
|
|
|
|
|
|
<c:set var="thirdMenuUrlPattern" value="${not empty thirdMenu.urlPattern ? xssUtil.unescape(thirdMenu.urlPattern) : ''}" />
|
|
|
|
|
|
|
|
<c:set var="isThirdMenuActive" value="${activeThirdMenuId eq thirdMenu.menuId}" />
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<li class="nav-item ${isThirdMenuActive ? 'show active' : ''}"
|
|
|
|
|
|
|
|
data-menu-id="${thirdMenu.menuId}"
|
|
|
|
|
|
|
|
data-url-pattern="${thirdMenuUrlPattern}">
|
|
|
|
|
|
|
|
<a href="<c:url value='${thirdMenuUrl}' />" class="nav-link">
|
|
|
|
|
|
|
|
${thirdMenu.menuNm}
|
|
|
|
|
|
|
|
</a>
|
|
|
|
|
|
|
|
</li>
|
|
|
|
|
|
|
|
</c:if>
|
|
|
|
|
|
|
|
</c:forEach>
|
|
|
|
|
|
|
|
</ul>
|
|
|
|
|
|
|
|
</c:if>
|
|
|
|
|
|
|
|
<%-- /3뎁스 --%>
|
|
|
|
|
|
|
|
</li>
|
|
|
|
|
|
|
|
</c:if>
|
|
|
|
|
|
|
|
</c:forEach>
|
|
|
|
|
|
|
|
</ul>
|
|
|
|
|
|
|
|
</c:if>
|
|
|
|
|
|
|
|
</li>
|
|
|
|
|
|
|
|
</c:if>
|
|
|
|
|
|
|
|
</c:forEach>
|
|
|
|
|
|
|
|
</c:if>
|
|
|
|
|
|
|
|
</ul>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
<!-- /Sidebar body -->
|
|
|
|
<!-- /Sidebar body -->
|
|
|
|
|