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 > 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 > 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>