adminHeader.ftl

 1   <#--
 2      Macro: adminHeader
 3      Description: Generates a header section for an administrative page, including a navigation menu and user account menu.
 4      Parameters:
 5      - site_name (string, required): the name of the website or application.
 6   -->
 7   <#macro adminHeader site_name=site_name admin_url=admin_url>
 8   <#local readMode><#attempt><#if dskey('portal.site.site_property.layout.readmode.checkbox')?number = 1> dir="rtl"</#if><#recover></#attempt></#local>
 9   <#local darkMode><#attempt><#if dskey('portal.site.site_property.layout.darkmode.checkbox')?number==1>dark<#else>light</#if><#recover>light</#attempt></#local>
 10   <#local layout><#attempt><#if dskey('portal.site.site_property.layout.menu.checkbox')?number==1>left<#else>top</#if><#recover>top</#attempt></#local>
 11   <#local userReadMode><#attempt>${dskey('portal.site.site_property.layout.user.readmode.show.checkbox')?number}<#recover>0</#attempt></#local>
 12   <#local userDarkMode><#attempt>${dskey('portal.site.site_property.layout.user.darkmode.show.checkbox')?number}<#recover>0</#attempt></#local>
 13   <#local userMenuMode><#attempt>${dskey('portal.site.site_property.layout.user.menumode.show.checkbox')?number}<#recover>0</#attempt></#local>
 14   <#local logoUrl = (dskey('portal.site.site_property.logo_url')!)?has_content?then(dskey('portal.site.site_property.logo_url'), 'themes/admin/shared/images/logo-header.svg')>
 15   <style>.icon-item-new {width: .5rem;height: .5rem;background: #c00;border-radius: 100%; display: block; position: absolute; right: 0; top: 0; z-index: 1}</style>
 16   </head>
 17   <body class="antialiased"${readMode} data-bs-theme="${darkMode!}" data-bs-theme-menu="${layout!}" data-layout="${layout!}">
 18   <@adminSkipNav />
 19   <div class="lutece-app<#if dskey('portal.site.site_property.bo.showXs.checkbox') == '0'> d-none d-lg-block<#else> d-block</#if>">   
 20   <nav id="menu" class="border-end d-flex flex-column flex-shrink-0 shadow" aria-label="${site_name!}">
 21      <a href="${dskey('portal.site.site_property.home_url')}" class="d-block text-center mt-4 mb-4 text-white feature-link menu-logo" target="_blank" title="${site_name!}">
 22         <@img url=logoUrl title='${site_name!}' params='style="height:35px" aria-hidden="true"' />
 23         <span class="visually-hidden">#i18n{portal.site.page_home.label} ${site_name}<br> [#i18n{portal.site.portal_footer.newWindow}]</span>
 24      </a>
 25      <div class="d-inline-block h-100 text-white fw-bold ps-2 align-content-center d-none-side" style="font-size:24px">${site_name}</div>
 26      <div class="position-absolute top-0 end-0 d-flex p-4 d-lg-flex d-xl-none">
 27         <button id="menu-mobile-back" class="btn btn-sm btn-outline-light d-flex align-items-center justify-content-center d-none" type="button" >
 28         <i class="ti ti-arrow-left"></i>
 29            </button>
 30            <button id="menu-mobile-close" class="btn btn-sm btn-outline-light d-flex align-items-center justify-content-center" type="button" >
 31               <i class="ti ti-x"></i>
 32            </button>
 33      </div>
 34      <ul id="main-menu" class="nav nav-pills nav-flush flex-column mb-auto text-center ms-top-4" role="menubar" aria-label="${site_name!}">
 35         <li class="nav-item py-1" role="none">
 36            <a class="nav-link  feature-link lutece-tooltip" role="menuitem" href="${admin_url}" feature-group-label="home" feature-group="home" aria-label="#i18n{portal.util.labelHome}" data-bs-animation="false" data-bs-tooltip="#i18n{portal.util.labelHome}">
 37               <i class="fs-5 ti ti-home-2 mx-auto align-self-center"></i>
 38               <span class="menu-label">#i18n{portal.util.labelHome}</span>
 39            </a>
 40         </li>
 41         <#list feature_group_list as feature_group>
 42            <#if feature_group.icon?length < 1>
 43               <#assign icon_class = "ti ti-mood-empty">
 44            <#else>
 45               <#assign icon_class = feature_group.icon>
 46            </#if>
 47            <#if feature_group.features?size &gt; 1>
 48               <li class="nav-item py-1 text-center" role="none">
 49                  <a href="#${feature_group.id}" feature-group-label="${feature_group.label}" feature-group="${feature_group.id}" class="nav-link text-center" role="menuitem" aria-haspopup="true" aria-expanded="false" title="" data-bs-toggle="tooltip" data-bs-animation="false" data-bs-placement="right" data-bs-original-title="${feature_group.label}" aria-label="${feature_group.label}">
 50                     <i class="fs-5 align-self-center mx-auto ${icon_class}"></i>  <div class="menu-label">${feature_group.label}</div>
 51                  </a>
 52               </li>
 53            <#else>
 54               <#list feature_group.features as feature>
 55                  <#if !feature.externalFeature>
 56                     <li class="nav-item py-1 text-center" role="none">
 57                        <a href="${feature.url}?plugin_name=${feature.pluginName}" role="menuitem" aria-haspopup="true" aria-expanded="false" feature-group-label="${feature_group.label}" feature-group="${feature_group.id}" class="nav-link feature-link text-center" aria-current="page" title="" data-bs-toggle="tooltip" data-bs-placement="right" data-bs-animation="false" data-bs-original-title="${feature.name}" aria-label="${feature.name}">
 58                           <i class="fs-5 ${icon_class} align-self-center mx-auto"></i>  <div class="menu-label">${feature_group.label}</div>
 59                        </a>
 60                     </li>
 61                  <#else>
 62                     <li class="nav-item py-1 text-center" role="none">
 63                        <a href="${feature.url}?plugin_name=${feature.pluginName}"  role="menuitem"  feature-group-label="${feature_group.label}" feature-group="${feature_group.id}" class="nav-link feature-link text-center" aria-current="page" title="" data-bs-toggle="tooltip" data-bs-placement="right" data-bs-animation="false" data-bs-original-title="${feature.name}" aria-label="${feature.name}">
 64                           <i class="fs-5  align-self-center mx-auto ${icon_class}"></i>  <div class="menu-label">${feature_group.label}</div>
 65                        </a>
 66                     </li>
 67                  </#if>
 68               </#list>
 69            </#if>
 70         </#list>
 71      </ul>
 72   </div>
 73   <div id="child-menu" class="d-flex flex-column align-items-stretch flex-shrink-0 border-end d-none no-pin shadow" role="navigation">
 74      <div class="content">
 75         <div id="menu-search-container" class="h-60 border-bottom">
 76            <div class="d-flex h-60  align-items-center justify-content-center pe-4">
 77               <div class="flex-fill">
 78                  <div class="input-group input-icon input-group-flat h-60">
 79                     <label for="search-menu"><span class="visually-hidden">#i18n{portal.util.labelSearchMenu}</span></label>
 80                     <span class="input-icon-addon">
 81                        <i class="ps-2 ti ti-search" aria-hidden="true"></i>
 82                     </span>
 83                     <input class="form-control border-0" type="text" placeholder="#i18n{portal.util.labelSearchMenu}" id="search-menu">
 84                  </div>
 85               </div>
 86               <div> 
 87                  <div id="menu-switcher" class="border btn btn-light btn-rounded" role="button" aria-label="#i18n{portal.util.labelLockMenu}">
 88                     <i id="menu-icon" class="ti ti-check fs-6"></i>
 89                     <span class="visually-hidden">#i18n{portal.util.labelLockMenu}</span>
 90                  </div>
 91            </div>
 92         </div>
 93      </div>
 94      <div id="feature-list" class="h-60 border-bottom">
 95         <#list feature_group_list as feature_group>
 96            <div class="w-100 feature-group d-none" feature-group-label="${feature_group.label}" feature-group="${feature_group.id}">
 97               <div class="d-flex h-60  align-items-center justify-content-center px-4">
 98                  <div class="flex-fill">   
 99                     <h2 class="fw-bolder mb-0 h-60 lh-60 h5">${feature_group.label}</h2>
 100                  </div>
 101                     <div>
 102                     <#if user.userLevel==0>
 103                        <a href="jsp/admin/AdminTechnicalMenu.jsp?tab=assign_features_groups#features_management#${feature_group.id}" class="border btn btn-light btn-rounded">
 104                           <i class="fs-6 float-end lh-60 h-60 ${feature_group.icon!''}"></i>
 105                        </a>
 106                     </#if>
 107                  </div>
 108               </div>
 109            </div>
 110         </#list>
 111      </div>
 112      <div id="right-list" class="list-group list-group-flush scrollarea pb-5">
 113         <#list feature_group_list as feature_group>
 114            <#if feature_group.features?size &gt; 1>
 115               <#list feature_group.features as feature>
 116                  <#if !feature.externalFeature>
 117                     <a admin-url="${admin_url}" feature-url="${feature.url}" feature-group-label="${feature_group.label}" feature-group="${feature_group.id}" plugin_name="${feature.pluginName}" class="list-group-item list-group-item-action p-4 lh-tight" href="${feature.url}?plugin_name=${feature.pluginName}" title="${feature.name}" >
 118                        <div class="row align-items-center">
 119                           <div class="col">
 120                              <h3 class="mb-1 fw-bold title h6">
 121                                 <span>${feature.name}</span>
 122                              </h3>
 123                              <div class="d-block text-muted mt-n1">
 124                                 <span>${feature.description!''}</span>
 125                              </div>
 126                           </div>
 127                        </div>
 128                     </a>
 129                  <#else>
 130                     <a class="dropdown-item" href="${feature.url}" >
 131                        <#if feature.iconUrl?has_content><i class="${feature.iconUrl}"></i></#if> ${feature.name} ${feature.descriptionKey}
 132                     </a>
 133                  </#if>
 134               </#list>
 135               <#else>
 136            </#if>
 137         </#list>
 138         <li id="child-menu-more" class="nav-item dropdown list-unstyled d-none" style="position:static !important;">
 139             <a class="nav-link" id="child-menu-more-btn" href="#" id="navbarDropdown" role="button" data-bs-toggle="dropdown" data-bs-boundary="viewport" aria-expanded="false" title="#i18n{portal.users.admin_header.labelMore}">
 140               <h3><i class="ti ti-dots fs-2"></i></h3>
 141             </a>
 142             <ul class="dropdown-menu dropdown-menu-end" aria-labelledby="navbarDropdown">
 143             </ul>
 144           </li>
 145      </div>
 146   </div>
 147   </div>
 148   <header id="top-menu" class="navbar navbar-expand-md navbar-light d-print-none border-bottom h-60 shadow">
 149      <div class="container-fluid">
 150         <button id="menu-mobile" class="border btn btn-light btn-rounded">
 151           <i class="ti ti-menu-2"></i>
 152         </button>
 153         <span class="d-block d-xl-none text-white fw-bold ps-2">${site_name}</span>
 154         <ul class="navbar-nav flex-row order-md-last ms-auto">
 155            <#if userMenuMode?number = 1>
 156            <li class="nav-item d-none d-xl-flex">
 157               <div id="menu-rotate" class="border btn btn-light btn-rounded" tabindex="0" role="button" data-bs-toggle="tooltip" data-bs-animation="false" data-bs-placement="bottom" data-bs-original-title="#i18n{portal.users.admin_header.labelMenuV} / #i18n{portal.users.admin_header.labelMenuH}">
 158                  <i class="ti ti-layout-navbar-collapse menu-rotate-icon"></i>
 159                  <label for="menu-rotate">
 160                     <span class="visually-hidden">#i18n{portal.users.admin_header.labelMode} #i18n{portal.users.admin_header.admin_header.labelMenuH} / #i18n{portal.users.admin_header.admin_header.labelMenuV}</span>
 161                  </label>
 162               </div>
 163            </li>
 164            </#if>
 165            <#if userDarkMode?number = 1>
 166            <li class="nav-item d-none d-sm-block">
 167               <div id="toggle-theme" class="border btn btn-light btn-rounded" tabindex="0" role="button"  data-bs-toggle="tooltip" data-bs-animation="false" data-bs-placement="bottom" data-bs-original-title="#i18n{portal.users.admin_header.labelMode} #i18n{portal.users.admin_header.labelDarkMode} / #i18n{portal.users.admin_header.labelLightMode}">
 168                  <i class="ti ti-moon darkmode-moon"></i>
 169                  <i class="ti ti-sun-high darkmode-sun"></i>
 170                  <label for="toggle-theme">
 171                     <span class="visually-hidden">#i18n{portal.users.admin_header.labelMode} #i18n{portal.users.admin_header.labelDarkMode} / #i18n{portal.users.admin_header.labelLightMode}</span>
 172                  </label>
 173               </div>
 174            </li>
 175            </#if>
 176            <#if userReadMode?number = 1>
 177               <@adminReadMode />
 178            </#if>
 179            <#if user.userLevel==0>
 180               <#assign hasIcon=false />
 181               <#assign showLog=false />
 182               <#if listLoggersInfo?has_content>
 183                  <#list listLoggersInfo?filter( logInfo -> ( logInfo.level = 'DEBUG' || logInfo.level = 'TRACE' ) ) as logInfo><#assign showLog=true /><#break></#list>
 184                  <#if showLog>
 185                  <li class="nav-item dropdown" data-bs-toggle="tooltip" data-bs-animation="false" data-bs-placement="bottom" data-bs-original-title="#i18n{portal.users.accountLifeTime.labelLifeTimeNotifications}">
 186                     <a class="border btn btn-light btn-rounded position-relative" href="#" role="button" data-bs-toggle="dropdown" aria-expanded="false" title="#i18n{portal.users.accountLifeTime.labelLifeTimeNotifications}">
 187                           <div class="icon-item-new position-absolute end-0 me-2 mt-1"></div>
 188                           <i class="ti ti-bell"></i>
 189                     </a>
 190                        <ul class="dropdown-menu p-3">
 191                           <li class="border-bottom mb-3">
 192                              <span class="badge bg-danger-subtle text-danger-emphasis p-1 px-2 rounded-5 mb-3">
 193                                 <small>#i18n{portal.util.log.warningLevel}</small>
 194                              </span>
 195                           </li>
 196                           <#list listLoggersInfo?filter( logInfoDetail -> ( logInfoDetail.level = 'DEBUG' || logInfoDetail.level = 'TRACE' ) ) as logInfoDetail> 
 197                              <li>
 198                                 <#assign path=logInfoDetail.path?string?replace("\\", "/" )>
 199                                 <#assign dernier_element=path?split("/")?last>
 200                                 <div class="d-block text-truncate mb-2 fw-bold" title="${logInfoDetail.path!}">
 201                                    ${logInfoDetail.name!}
 202                                    <br>
 203                                    <#if logInfoDetail.level='DEBUG'>
 204                                       <span class="badge bg-warning-subtle text-warning-emphasis p-1 px-2 rounded-5">
 205                                          <small>Debug</small>
 206                                       </span>
 207                                    </#if>
 208                                    <#if logInfoDetail.level='TRACE'>
 209                                       <span class="badge bg-danger-subtle text-danger-emphasis p-1 px-2 rounded-5">
 210                                          <small>Trace</small>
 211                                       </span>
 212                                    </#if>
 213                                    <span class="badge bg-secondary-subtle text-dark-emphasis p-1 px-2 rounded-5">
 214                                       <small>
 215                                          <i class="ti ti-file-code-2"></i> ${dernier_element!}
 216                                       </small>
 217                                    </span>
 218                                 </div>
 219                              </li>
 220                           </#list>
 221                        </ul>
 222                     </#if>
 223                  </li>
 224               </#if>
 225               <li class="nav-item d-none d-xl-flex">
 226                  <a class="border btn btn-light btn-rounded" href="jsp/admin/ManageProperties.jsp" title="#i18n{portal.site.adminFeature.properties_management.name}" data-bs-toggle="tooltip" data-bs-animation="false" data-bs-placement="bottom" data-bs-original-title="#i18n{portal.site.adminFeature.properties_management.name}">
 227                     <i class="ti ti-home-cog fs-5"></i><span class="visually-hidden">#i18n{portal.site.adminFeature.properties_management.name}</span>
 228                  </a>
 229               </li>
 230               <li class="nav-item d-none d-xl-flex">
 231                  <a class="border btn btn-light btn-rounded" href="jsp/admin/AdminTechnicalMenu.jsp" title="#i18n{portal.admindashboard.view_dashboards.title}" data-bs-toggle="tooltip" data-bs-animation="false" data-bs-placement="bottom" data-bs-original-title="#i18n{portal.admindashboard.view_dashboards.title}">
 232                     <i class="ti ti-settings fs-5"></i><span class="visually-hidden">#i18n{portal.admindashboard.view_dashboards.title}</span>
 233                  </a>
 234               </li>
 235            </#if>
 236            <#if userMenuItems?has_content>   
 237               <#list userMenuItems as item>
 238                  <#if item.content?contains("jsp/admin/DoChangeLanguage.jsp")>
 239                      ${item.content}
 240                  </#if>
 241               </#list>
 242            </#if>
 243            <li class="nav-item dropdown lutece-profile d-none d-sm-block me-0">
 244               <a href="#" class="border btn btn-light btn-rounded" data-bs-toggle="dropdown" >
 245                  <div class="lutece-profile-name">
 246                     <div class="small fw-bold">
 247                        <span id="lutece-profile-name" class="truncate">${dashboard_zone_4!}</span> <i class="ti ti-chevron-down"></i>
 248                     </div>
 249                  </div>
 250               </a>
 251               <div class="dropdown-menu dropdown-menu-end dropdown-menu-arrow">
 252               <#if userMenuItems?has_content>   
 253                  <#list userMenuItems as item>
 254                     <#if !item.content?contains("jsp/admin/DoChangeLanguage.jsp")>
 255                        ${item.content}
 256                     </#if>
 257                  </#list>
 258               </#if>
 259               <div class="dropdown-divider"></div>
 260               <#if admin_logout_url?has_content>
 261                  <a class="dropdown-item" href="${admin_logout_url}" title="#i18n{portal.users.admin_header.deconnectionLink}">
 262                     <i class="ti ti-logout me-1"></i> #i18n{portal.users.admin_header.deconnectionLink}
 263                  </a>
 264               </#if>
 265               </div>
 266            </li>
 267   		 <li class="nav-item dropdown d-sm-none">
 268               <a href="#" class="border btn btn-light btn-rounded" data-bs-toggle="dropdown" >
 269   				<span class="d-md-none btn-rounded"><i class="ti ti-user"></i></span>
 270               </a>
 271   			<div class="dropdown-menu dropdown-menu-end dropdown-menu-lg-start">
 272   				<span class="dropdown-header">${dashboard_zone_4!}</span>
 273   				<hr class="dropdown-divider">
 274               <#if userMenuItems?has_content>   
 275                  <#list userMenuItems as item>
 276                     <#if !item.content?contains("jsp/admin/DoChangeLanguage.jsp")>
 277                        ${item.content}
 278                     </#if>
 279                  </#list>
 280               </#if>
 281               <div class="dropdown-divider"></div>
 282               <#if admin_logout_url?has_content>
 283                  <a class="dropdown-item" href="${admin_logout_url}" title="#i18n{portal.users.admin_header.deconnectionLink}">
 284                     <i class="ti ti-logout me-1"></i> #i18n{portal.users.admin_header.deconnectionLink}
 285                  </a>
 286               </#if>
 287               </div>
 288   		</li>
 289         </ul>
 290      </div>
 291   </header>
 292   <main id="lutece-main" class="d-flex overflow-hidden">
 293   <div id="page" class="w-100">
 294   </#macro>