commons.html
1 <#-- WARNING : be careful to white-space and lines break in FreeMarker macros.
2 # This macro template can be used to output white-space-sensitive formats (like RSS files).
3 # See http://dev.lutece.paris.fr/jira/browse/LUTECE-765
4 -->
5 <#-- Do not remove this comment -->
6 <#-- Information about this commons file -->
7 <#macro commonsFile>commons.html</#macro>
8 <#macro commonsName>Commons Bootstrap 3</#macro>
9 <#macro commonsDescription>Freemarker Commons macros powered by Bootstrap CSS Framework 3.3</#macro>
10 <#macro coreAdminCSSLinks>
11 <link href="css/admin/bootstrap.min.css" rel="stylesheet" > <!-- provided by core -->
12 <link href="css/admin/bootstrap-colorpicker.css" rel="stylesheet" > <!-- provided by core -->
13 <link href="css/admin/jquery-ui.min.css" rel="stylesheet" > <!-- provided by core -->
14 <link href="css/admin/jquery-ui.structure.min.css" rel="stylesheet" > <!-- provided by core -->
15 <link href="css/admin/jquery-ui.theme.min.css" rel="stylesheet" > <!-- provided by core -->
16 <link href="js/admin/lib/polipop/css/polipop.core.min.css" rel="stylesheet" > <!-- provided by core -->
17 <link href="js/admin/lib/polipop/css/polipop.default.min.css" rel="stylesheet" > <!-- provided by core -->
18 <link href="css/admin/bootstrap-clockpicker.css" rel="stylesheet" > <!-- provided by core -->
19 <link href="css/admin/AdminLTE.css" rel="stylesheet" > <!-- provided by core -->
20 <link href="css/admin/tabler-icons.min.css" rel="stylesheet" > <!-- Tabler Icons -->
21 <link href="css/admin/bootstrap-icons.css" rel="stylesheet" > <!-- Bootstrap Icons -->
22 <link href="css/admin/style/bootstrap4/all.min.css" rel="stylesheet"> <!-- Font-Awesome 5.8.1, provided by core -->
23 <link href="css/admin/skins/_all-skins.min.css" rel="stylesheet" > <!-- provided by core -->
24 <link href="css/admin/portal_admin.css" rel="stylesheet" > <!-- provided by core -->
25 <link href="css/admin/portal_admin_site.css" rel="stylesheet"><!-- Site override admin CSS -Empty by default- -->
26 </#macro>
27 <#macro coreAdminJSLinks>
28 <script src="js/admin/bootstrap.min.js"></script><!-- provided by core -->
29 <script src="js/admin/jquery/jquery-ui.min.js"></script> <!-- provided by core -->
30 <script src="js/admin/bootstrap-colorpicker.js"></script> <!-- provided by core -->
31 <script src="js/admin/bootstrap-filestyle.min.js"></script> <!-- provided by core -->
32 <script src="js/admin/lib/polipop/polipop.min.js"></script> <!-- provided by core -->
33 <script src="js/admin/app.min.js"></script> <!-- provided by core -->
34 <script src="js/admin/admin.js"></script> <!-- provided by core -->
35 <script src="js/util/progress-manager.js"></script> <!-- provided by core -->
36 </#macro>
37 <#global gClassActive='active' />
38 <#macro sort jsp_url attribute id="" >
39 <#if jsp_url?contains("?")>
40 <#local sort_url = jsp_url + "&sorted_attribute_name=" + attribute + "&asc_sort=" />
41 <#else>
42 <#local sort_url = jsp_url + "?sorted_attribute_name=" + attribute + "&asc_sort=" />
43 </#if>
44 <div class="btn-group" role="group" aria-label="sortButton">
45 <a class="btn btn-default btn-flat btn-xs" id="sort${id!}_${attribute!}" href="${sort_url}true#sort${id!}_${attribute!}" title="#i18n{portal.util.sort.asc}" >
46 <i class="fa fa-chevron-up"></i>
47 </a>
48 <a class="btn btn-default btn-flat btn-xs" href="${sort_url}false#sort${id!}_${attribute!}" title="#i18n{portal.util.sort.desc}">
49 <i class="fa fa-chevron-down"></i>
50 </a>
51 </div>
52 </#macro>
53 <#macro pagination paginator >
54 <#local nbLinkPagesToDisplay = 10 />
55 <#local offsetPrev = nbLinkPagesToDisplay / 2 />
56 <#local offsetNext = nbLinkPagesToDisplay / 2 />
57 <#if ( paginator.pageCurrent <= nbLinkPagesToDisplay - offsetPrev )>
58 <#local offsetPrev = paginator.pageCurrent - 1 />
59 <#local offsetNext = nbLinkPagesToDisplay - offsetPrev />
60 <#elseif ( paginator.pageCurrent + offsetNext > paginator.pagesCount )>
61 <#local offsetNext = paginator.pagesCount - paginator.pageCurrent />
62 <#local offsetPrev = nbLinkPagesToDisplay - offsetNext />
63 </#if>
64 <#if ( paginator.pagesCount > 1 )>
65 <#if ( paginator.pageCurrent - offsetPrev > 1 )>
66 <a href="${paginator.firstPageLink?xhtml}">
67 <i class="fa fa-angle-double-left"></i> #i18n{portal.util.labelFirst}
68 </a>
69 </#if>
70 <#if ( paginator.pageCurrent > 1 )>
71 <a href="${paginator.previousPageLink?xhtml}">
72 <i class="fa fa-angle-left"></i> #i18n{portal.util.labelPrevious}
73 </a>
74 <#else>
75
76 </#if>
77 <#if ( paginator.pageCurrent - offsetPrev > 1 )>
78 <strong>...</strong>
79 </#if>
80 <#list paginator.pagesLinks as link>
81 <#if link.index == paginator.pageCurrent>
82 <strong>${link.name}</strong>
83 <#else>
84 <a href="${link.url?xhtml}">${link.name}</a>
85 </#if>
86 </#list>
87 <#if ( paginator.pageCurrent + offsetNext < paginator.pagesCount )>
88 <strong>...</strong>
89 </#if>
90 <#if ( paginator.pageCurrent < paginator.pagesCount )>
91 <a href="${paginator.nextPageLink?xhtml}">
92 <i class="fa fa-angle-right"></i> #i18n{portal.util.labelNext}
93 </a>
94 <#if ( paginator.pageCurrent + offsetNext < paginator.pagesCount )>
95 <a href="${paginator.lastPageLink?xhtml}">
96 <i class="fa fa-angle-double-right"></i> #i18n{portal.util.labelLast}
97 </a>
98 </#if>
99 </#if>
100 </#if>
101 </#macro>
102 <#macro paginationAdmin paginator combo=0 form=1 nb_items_per_page=nb_items_per_page showcount=1 showall=0>
103 <#if (paginator.pagesCount > 1) >
104 <@paginationPageLinks paginator=paginator />
105 </#if>
106 <@div align='right'>
107 <#if form == 1 >
108 <form method="post" class="form-inline">
109 </#if>
110 <@paginationItemCount paginator=paginator combo=combo nb_items_per_page=nb_items_per_page showcount=showcount showall=showall/>
111 <#if form == 1 >
112 </form>
113 </#if>
114 </@div>
115 </#macro>
116 <#macro paginationPageLinks paginator >
117 <#local nbLinkPagesToDisplay = 10 />
118 <#local offsetPrev = nbLinkPagesToDisplay / 2 />
119 <#local offsetNext = nbLinkPagesToDisplay / 2 />
120 <#if ( paginator.pageCurrent <= nbLinkPagesToDisplay - offsetPrev )>
121 <#local offsetPrev = paginator.pageCurrent - 1 />
122 <#local offsetNext = nbLinkPagesToDisplay - offsetPrev />
123 <#elseif ( paginator.pageCurrent + offsetNext > paginator.pagesCount )>
124 <#local offsetNext = paginator.pagesCount - paginator.pageCurrent />
125 <#local offsetPrev = nbLinkPagesToDisplay - offsetNext />
126 </#if>
127 <ul class="pagination pagination-sm">
128 <#if ( paginator.pageCurrent - offsetPrev > 1 )>
129 <li>
130 <@link href='${paginator.firstPageLink?xhtml}'>
131 ${paginator.labelFirst}
132 </@link>
133 </li>
134 </#if>
135 <#if (paginator.pageCurrent > 1) >
136 <li class="previous">
137 <@link href='${paginator.previousPageLink?xhtml}'>
138 ${paginator.labelPrevious}
139 </@link>
140 </li>
141 <#else>
142 <li class="disabled">
143 <@link href='${paginator.firstPageLink?xhtml}'>${paginator.labelPrevious}</@link>
144 </li>
145 </#if>
146 <#if ( paginator.pageCurrent - offsetPrev > 1 )>
147 <li>
148 <@link href='${(paginator.pagesLinks?first).url?xhtml}'><strong>...</strong></@link>
149 </li>
150 </#if>
151 <#list paginator.pagesLinks as pageLink>
152 <#if ( pageLink.index == paginator.pageCurrent )>
153 <li class="active">
154 <@link href='${pageLink.url?xhtml}'>${pageLink.name}</@link>
155 </li>
156 <#else>
157 <li>
158 <@link href='${pageLink.url?xhtml}'>${pageLink.name}</@link>
159 </li>
160 </#if>
161 </#list>
162 <#if ( paginator.pageCurrent + offsetNext < paginator.pagesCount )>
163 <li>
164 <@link href='${(paginator.pagesLinks?last).url?xhtml}'><strong>...</strong></@link>
165 </li>
166 </#if>
167 <#if (paginator.pageCurrent < paginator.pagesCount) >
168 <li class="next">
169 <@link href='${paginator.nextPageLink?xhtml}'>
170 ${paginator.labelNext}
171 </@link>
172 </li>
173 <#if ( paginator.pageCurrent + offsetNext < paginator.pagesCount )>
174 <li class="next">
175 <@link href='${paginator.lastPageLink?xhtml}'>
176 ${paginator.labelLast}
177 </@link>
178 </li>
179 </#if>
180 <#else>
181 <li class="disabled">
182 <@link href='${paginator.lastPageLink?xhtml}'>${paginator.labelNext}</@link>
183 </li>
184 </#if>
185 </ul>
186 </#macro>
187 <#macro paginationCombo paginator nb_items_per_page=nb_items_per_page showall=0>
188 <label>${paginator.labelItemCountPerPage}</label>
189 <div class="input-group">
190 <select data-max-item="${paginator.itemsCount}" class="form-control input-xs" name="${paginator.itemsPerPageParameterName}" id="${paginator.itemsPerPageParameterName}" title="${paginator.labelItemCountPerPage}">
191 <#list [ "10" , "20" , "50" , "100" ] as nb>
192 <#if nb_items_per_page = nb >
193 <option selected="selected" value="${nb}">${nb}</option>
194 <#else>
195 <option value="${nb}">${nb}</option>
196 </#if>
197 </#list>
198 <#if showall ==1>
199 <#if paginator.itemsCount > 100 >
200 <option <#if nb_items_per_page?number = paginator.itemsCount?number >selected="selected"</#if> value="${paginator.itemsCount}" class="${nb_items_per_page}">#i18n{portal.util.labelAll}</option>
201 </#if>
202 </#if>
203 </select>
204 <span class="input-group-btn">
205 <button class="btn btn-default btn-xs" type="submit" title="#i18n{portal.util.labelRefresh}">
206 <i class="fa fa-sync"></i>
207 </button>
208 </span>
209 </div>
210 </#macro>
211 <#macro paginationItemCount paginator combo=0 nb_items_per_page=nb_items_per_page showcount=1 showall=0>
212 <#-- Display combo -->
213 <#if combo == 1 >
214 <@paginationCombo paginator=paginator nb_items_per_page=nb_items_per_page showall=showall />
215 </#if>
216 <#-- Display item count -->
217 <#if showcount == 1 >
218 <span class="showcount">
219 <#if (paginator.labelItemCount)?? && paginator.labelItemCount?has_content> - ${paginator.labelItemCount} : </#if> ${paginator.itemsCount}
220 </span>
221 </#if>
222 </#macro>
223 <#-- NAVIGATION -->
224 <#macro item_navigation item_navigator id='item-navigator' align='' hideButtonTitle=[] buttonColor='info' buttonSize='sm'>
225 <#local class = alignmentSettings(align,'') />
226 <nav id="${id}" class="${class}">
227 <#if (item_navigator.currentItemId > 0)>
228 <@aButton href='${item_navigator.previousPageLink?xhtml}' title='#i18n{portal.util.labelPrevious}' buttonIcon='arrow-left' color='${buttonColor}' hideTitle=hideButtonTitle size='${buttonSize}' />
229 </#if>
230 <#if (item_navigator.currentItemId < item_navigator.listItemSize - 1) >
231 <@aButton href='${item_navigator.nextPageLink?xhtml}' title='#i18n{portal.util.labelNext}' buttonIcon='arrow-right' color='${buttonColor}' hideTitle=hideButtonTitle size='${buttonSize}' />
232 </#if>
233 </nav>
234 </#macro>
235 <#macro actionButtons button1Name='' button2Name='' i18nValue1Key='portal.admin.message.buttonValidate' i18nValue2Key='portal.admin.message.buttonCancel' url1='' url2='' icon1='save' icon2='times' offset=3>
236 <@formGroup>
237 <#if url1 != ''>
238 <@aButton href='${url1}' buttonIcon=icon1 title='#i18n{${i18nValue1Key}}' />
239 <#else>
240 <@button type='submit' name='${button1Name}' buttonIcon=icon1 title='#i18n{${i18nValue1Key}}' />
241 </#if>
242 <#if url2 != ''>
243 <@aButton href='${url2}' buttonIcon=icon2 title='#i18n{${i18nValue2Key}}' />
244 <#else>
245 <#if button2Name != ''>
246 <@button type='submit' name='${button2Name}' buttonIcon=icon2 title='#i18n{${i18nValue2Key}}' color='default' />
247 </#if>
248 </#if>
249 </@formGroup>
250 </#macro>
251 <#macro messages errors=[] infos=[] warnings=[] errors_class="alert alert-danger" infos_class="alert alert-info" warnings_class="alert alert-warning">
252 <#if errors??>
253 <#if errors?size > 0 >
254 <div class="alert alert-danger" id="messages_errors_div">
255 <button class="close"></button>
256 <#list errors as error >
257 <span class="icon"><i class="fa fa-exclamation-circle"></i></span> ${error.message} <br>
258 </#list>
259 </div>
260 </#if>
261 </#if>
262 <#if infos??>
263 <#if infos?size > 0 >
264 <div class="alert alert-info" id="messages_infos_div" >
265 <button class="close"></button>
266 <#list infos as info >
267 <span class="icon"><i class="fa fa-info-circle"></i></span> ${info.message} <br>
268 </#list>
269 </div>
270 </#if>
271 </#if>
272 <#if warnings??>
273 <#if warnings?size > 0 >
274 <div class="${warnings_class}" id="messages_warnings_div" >
275 <a class="close" data-dismiss="alert" href="#">x</a>
276 <#list warnings as warning >
277 <span class="icon"><i class="fa fa-info-circle"></i></span> ${warning.message} <br>
278 </#list>
279 </div>
280 </#if>
281 </#if>
282 </#macro>
283 <#---------------------------NEW MACROS------------------------------>
284 <#-- TABLE -->
285 <#-- class: -->
286 <#macro table id='' class='' responsive=true condensed=true hover=true striped=false bordered=false headBody=false collapsed=false caption='' params='' deprecated...>
287 <@deprecatedWarning args=deprecated />
288 <#local class = class />
289 <#if condensed> <#local class += ' table-condensed' /> </#if>
290 <#if hover> <#local class += ' table-hover' /> </#if>
291 <#if striped> <#local class += ' table-striped' /> </#if>
292 <#if bordered> <#local class += ' table-bordered' /> </#if>
293 <#if collapsed> <#local class += ' collapse' /> </#if>
294 <#if responsive><div class="table-responsive"></#if>
295 <table class="table ${class?trim}" <#if id!=''> id="${id}"</#if><#if params!=''> ${params}</#if>>
296 <#if caption!=''><caption>${caption}</caption></#if>
297 <#if headBody><thead></#if>
298 <#nested>
299 <#if headBody></tbody></#if>
300 </table>
301 <#if responsive></div></#if>
302 </#macro>
303 <#macro tableHead id='' class='' params=''>
304 <thead<#if id!=''> id="${id}"</#if><#if class?trim!=''> class="${class?trim}"</#if><#if params!=''> ${params}</#if>>
305 <#nested>
306 </thead>
307 </#macro>
308 <#macro tableBody id='' class='' params=''>
309 <tbody<#if id!=''> id="${id}"</#if><#if class?trim!=''> class="${class?trim}"</#if><#if params!=''> ${params}</#if>>
310 <#nested>
311 </tbody>
312 </#macro>
313 <#macro tableFoot id='' class='' params=''>
314 <tfoot <#if id!=''> id="${id}"</#if><#if class?trim!=''> class="${class?trim}"</#if><#if params!=''> ${params}</#if>>
315 <#nested>
316 </tfoot>
317 </#macro>
318 <#macro tableHeadBodySeparator id='' class='' params=''>
319 </thead>
320 <tbody<#if id!=''> id="${id}"</#if><#if class?trim!=''> class="${class?trim}"</#if><#if params!=''> ${params}</#if>>
321 </#macro>
322 <#-- MACRO TR -->
323 <#macro tr id='' class='' hide=[] params=''>
324 <#local class += ' ' + displaySettings(hide,'') + ' ' + alignmentSettings(align) />
325 <tr<#if id!=''> id="${id}"</#if><#if class?trim!=''> class="${class?trim}"</#if><#if params!=''> ${params}</#if>>
326 <#nested>
327 </tr>
328 </#macro>
329 <#-- MACRO TH -->
330 <#-- valign: baseline|top|middle|bottom|bottom|text-top -->
331 <#macro th id='' title='' scope='' class='' align='' valign='' hide=[] cols=0 xs=0 sm=0 md=0 lg=0 xl=0 colspan=0 rowspan=0 flex=false params=''>
332 <#local class += ' ' + displaySettings(hide,'') + ' ' + alignmentSettings(align,'text') />
333 <#local breakpoints = {'xs':xs, 'sm':sm, 'md':md, 'lg':lg, 'xl':xl}>
334 <#list breakpoints as breakpointkey,breakpointvalue>
335 <#if breakpointvalue!=0>
336 <#local class += ' col-${breakpointkey}-${breakpointvalue}' />
337 </#if>
338 </#list>
339 <th<#if class?trim != ''> class="${class?trim}"</#if><#if valign!=''> style="vertical-align:${valign};"</#if><#if flex> style="display:flex;"</#if><#if id!=''> id="${id}"</#if><#if title!=''> title="${title}"</#if><#if scope!=''> scope="${scope}"</#if><#if colspan gt 0> colspan="${colspan}"</#if><#if rowspan gt 0> rowspan="${rowspan}"</#if><#if params!=''> ${params}</#if>>
340 <#nested>
341 </th>
342 </#macro>
343 <#-- MACRO TD -->
344 <#-- valign: baseline|top|middle|bottom|bottom|text-top -->
345 <#macro td id='' class='' hide=[] align='' valign='' xs=0 sm=0 md=0 lg=0 xl=0 colspan=0 rowspan=0 flex=false params='' deprecated...>
346 <@deprecatedWarning args=deprecated />
347 <#local class += ' ' + displaySettings(hide,'') + ' ' + alignmentSettings(align,'text') />
348 <#local breakpoints = {'xs':xs, 'sm':sm, 'md':md, 'lg':lg, 'xl':xl}>
349 <#local class += ' ' + responsiveDisplay('col',{'xs':xs, 'sm':sm, 'md':md, 'lg':lg, 'xl':xl}) />
350 <td<#if class?trim != ''> class="${class?trim}"</#if><#if valign!=''> style="vertical-align:${valign};"</#if><#if flex> style="display:flex;"</#if><#if id!=''> id="${id}"</#if><#if colspan gt 0> colspan="${colspan}"</#if><#if rowspan gt 0> rowspan="${rowspan}"</#if><#if params!=''> ${params}</#if>>
351 <#nested>
352 </td>
353 </#macro>
354 <#--- MACRO SELECT (TO REPLACE "COMBO" MACROS) --->
355 <#macro select name items='' default_value='' id=name class='' size='' sort=false multiple=0 params='' title='' disabled=false tabIndex=0 maxLength=0 mandatory=false>
356 <#if propagateMandatory?? && propagateMandatory && propagateHtmlRequired ><#local mandatory = true /></#if>
357 <select id="${id}" name="${name}" class="form-control<#if size!=''> input-${size}</#if><#if class!=''> input-${class}</#if>" <#if (multiple > 0)>multiple size="${multiple}"</#if><#if (tabIndex > 0)> tabindex="${tabIndex}"</#if><#if params!=''> ${params}</#if><#if title!=''> ${title}</#if><#if mandatory> required</#if><#if disabled> disabled</#if>>
358 <#if items?has_content>
359 <#if sort=true>
360 <#list items?sort_by("name") as item>
361 <#if default_value="${item.code}">
362 <option selected="selected" value="${item.code}" <#if !item.name?has_content>label="${i18n("portal.util.labelEmpty")}"</#if>>${item.name}</option>
363 <#else>
364 <option value="${item.code}" <#if !item.name?has_content>label="${i18n("portal.util.labelEmpty")}"</#if>>${item.name}</option>
365 </#if>
366 </#list>
367 <#else>
368 <#if maxLength gt 0>
369 <#list items as item>
370 <#if maxLength < item.name?length >
371 <#assign item_new = "..." + "${item.name?substring(item.name?length-maxLength+3)}" >
372 <#else>
373 <#assign item_new = "${item.name}">
374 </#if>
375 <#if default_value="${item.code}">
376 <option selected="selected" value="${item.code}" >${item_new}</option>
377 <#else>
378 <option value="${item.code}" >${item_new}</option>
379 </#if>
380 </#list>
381 <#else>
382 <#list items as item>
383 <#if default_value="${item.code}">
384 <option selected="selected" value="${item.code}" <#if !item.name?has_content>label="${i18n("portal.util.labelEmpty")}"</#if>>${item.name}</option>
385 <#else>
386 <option value="${item.code}" <#if !item.name?has_content>label="${i18n("portal.util.labelEmpty")}"</#if>>${item.name}</option>
387 </#if>
388 </#list>
389 </#if>
390 </#if>
391 <#else>
392 <#nested>
393 </#if>
394 </select>
395 </#macro>
396 <#--- MACRO OPTIONS --->
397 <#--- items : list with label, value, selected values --->
398 <#macro options items selected='' id=false class='' params=''>
399 <#if items??>
400 <#list items as item>
401 <#local idItem><#if id>${item.code}_${item?index}<#else></#if></#local>
402 <#local selectedItem><#if selected !=''><#if item.code?string=selected>true<#else>false</#if><#else>${item.selected?c}</#if></#local>
403 <@option label=item.name value=item.code id=idItem class=class selected=selectedItem?boolean disabled=item.disabled params=params />
404 </#list>
405 </#if>
406 </#macro>
407 <#macro option label value id='' class='' selected=false disabled=false params=''>
408 <option<#if id!=''>id="${id}</#if><#if class!=''> class="${class}</#if> value="${value!}"<#if selected> selected</#if><#if disabled> disabled</#if><#if params!=''> ${params}</#if>>${label!} <#nested></option>
409 </#macro>
410 <#-- ICONS -->
411 <#-- Icons from FontAwesome 5.8.1 -->
412 <#macro icon prefix='fa-' style='' class='' title='' id='' params=''>
413 <#if style='docker' || style = 'github' || style='gitlab' || style='java' || style='jira' || style='jenkins' || style = 'twitter' >
414 <#local prefix = 'fab ' + prefix />
415 <#else>
416 <#local prefix = 'fas ' + prefix />
417 </#if>
418 <#switch style>
419 <#case 'arrows'>
420 <#local iconStyle = 'arrows-alt' />
421 <#break>
422 <#case 'arrows-h'>
423 <#local iconStyle = 'arrows-alt-h' />
424 <#break>
425 <#case 'arrows-v'>
426 <#local iconStyle = 'arrows-alt-v' />
427 <#break>
428 <#case 'clock-o'>
429 <#local iconStyle = 'clock' />
430 <#break>
431 <#case 'close'>
432 <#local iconStyle = 'times' />
433 <#break>
434 <#case 'external-link'>
435 <#local iconStyle = 'external-link-alt' />
436 <#break>
437 <#case 'file-pdf-o'>
438 <#local iconStyle = 'file-pdf' />
439 <#break>
440 <#case 'pencil'>
441 <#local iconStyle = 'edit' />
442 <#break>
443 <#case 'refresh'>
444 <#local iconStyle = 'sync' />
445 <#break>
446 <#default>
447 <#local iconStyle = style />
448 </#switch>
449 <i class="${prefix}${iconStyle}<#if class!=''> ${class}</#if>" aria-hidden="true"<#if title!=''> title='${title}'</#if><#if id!=''> id="${id}"</#if><#if params!=''> ${params}</#if>></i>
450 </#macro>
451 <#-- ICONSTACK -->
452 <#-- iconStack -->
453 <#-- class: par défaut 2x peut être tout autre taille voir doc FontAwesome -->
454 <#-- nested: 2 macro @icon une class fa-stack-2x , autre avec class fa-stack-1x dans l'ordre -->
455 <#macro iconStack class='fa-2x' id='' params=''>
456 <span class="fa-stack ${class}"<#if id!=''> ${id}</#if><#if params!=''> ${params}</#if>>
457 <#nested>
458 </span>
459 </#macro>
460 <#-- FORM -->
461 <#-- type: inline/horizontal/form -->
462 <#-- enctype: multipart/form-data | text/plain -->
463 <#macro tform type='horizontal' class='' align='' hide=[] action='' method='post' name='' id='' role='' collapsed=false enctype='' params='' deprecated...>
464 <@deprecatedWarning args=deprecated />
465 <#local class = class />
466 <#if align!=''><#local class += ' ' + alignmentSettings(align,'') /></#if>
467 <#if hide??><#local class += ' ' + displaySettings(hide,'block') /></#if>
468 <#if collapsed><#local class += ' collapse' /></#if>
469 <#switch type>
470 <#case 'horizontal'>
471 <#local class += ' form-horizontal'>
472 <#break>
473 <#case 'inline'>
474 <#local class += ' form-inline'>
475 <#break>
476 <#default>
477 <#local class += ' form'>
478 </#switch>
479 <form class="<#if class!=''>${class?trim}</#if>"<#if id!=''> id="${id}"</#if><#if action!=''> action="${action}"</#if><#if method!=''> method="${method}"</#if><#if name!=''> name="${name}"</#if><#if role!=''> role="${role}"</#if><#if method='post' && enctype!=''> enctype='${enctype}'</#if><#if params!=''> ${params}</#if>>
480 <#nested>
481 </form>
482 </#macro>
483 <#-- FORM ELEMENT STRUCTURE -->
484 <#-- formStyle values: empty/inline/horizontal/navbar-form/navbar-left... Default is horizontal -->
485 <#-- groupStyle: success/warning/error... -->
486 <#-- showLabel is deprecated in Lutece v7 -->
487 <#macro formGroup class='' formStyle='horizontal' groupStyle='' rows=1 labelKey='' labelFor='' labelId='' labelClass='' helpKey='' id='' mandatory=false htmlRequired=true hideLabel=[] collapsed=false params='' deprecated...>
488 <@deprecatedWarning args=deprecated />
489 <#local displayLabelClass = displaySettings(hideLabel,'') />
490 <#if collapsed><#local class += ' collapse' /></#if>
491 <div class="form-group<#if groupStyle!=''> has-${groupStyle} has-feedback</#if><#if class?trim!=''> ${class?trim}</#if>"<#if id!=''> id="${id}"</#if><#if params!=''> ${params}</#if>>
492 <#if rows=1>
493 <#if labelKey!='' && formStyle='horizontal'>
494 <#local labelClass += ' col-xs-12 col-sm-3 control-label'>
495 <#local divClass = 'col-xs-12 col-sm-9 col-md-6'>
496 <#elseif formStyle = 'inline'>
497 <#local labelClass += ''>
498 <#else>
499 <#local divClass='col-xs-12 col-sm-offset-3 col-sm-6'>
500 </#if>
501 <#else>
502 <#local labelClass += ' col-xs-12'>
503 <#local divClass = 'col-xs-12'>
504 </#if>
505 <#if labelKey!=''>
506 <label class="${labelClass?trim}<#if hideLabel?seq_contains('all')> sr-only</#if>" for="${labelFor}"<#if labelId!=''> id="${labelId}"</#if>>
507 <span<#if displayLabelClass!=''> class="${displayLabelClass}"</#if>>${labelKey}</span>
508 <#if mandatory=false>
509  
510 <#elseif mandatory=true>
511  <@icon style='asterisk' />
512 </#if>
513 </label>
514 </#if>
515 <#if formStyle='horizontal'>
516 <div class="${divClass}">
517 </#if>
518 <#assign propagateMandatory = mandatory>
519 <#assign propagateHtmlRequired = htmlRequired>
520 <#nested>
521 <#assign propagateMandatory = false>
522 <#assign propagateHtmlRequired = true>
523 <#if class='success'>
524 <@icon style='check' class='form-control-feedback' />
525 <#elseif class='warning'>
526 <@icon style='warning' class='form-control-feedback' />
527 <#elseif class='error'>
528 <@icon style='close' class='form-control-feedback' />
529 </#if>
530 <#if helpKey!='' && formStyle!='inline'><span class="help-block" <#if labelFor!=''>id="${labelFor}_help"</#if>>${helpKey}</span></#if>
531 <#if formStyle="horizontal">
532 </div>
533 </#if>
534 </div>
535 </#macro>
536 <#macro formField class=''>
537 <div class="row ${class}">
538 <#nested>
539 </div>
540 </#macro>
541 <#-- showLabel is deprecated in Lutece v7 -->
542 <#macro formLabel class='' labelFor='' labelId='' labelKey='' hideLabel=[] mandatory=true deprecated...>
543 <@deprecatedWarning args=deprecated />
544 <#local class += ' ' + displaySettings(hideLabel,'') />
545 <label class="<#if class !=''>${class?trim}</#if>" for="${labelFor}" <#if labelId!=''> id="${labelId}"</#if><#if mandatory=true>ariaLabel="${labelKey} [#i18n{portal.users.modify_attribute.labelMandatory}]"</#if>>
546 <#if labelKey !=''>${labelKey}<#else><#nested></#if>
547 </label>
548 </#macro>
549 <#macro formHelp style='inline' class='' labelFor=''>
550 <#if style='inline'>
551 <small class="text-muted<#if style!='inline'> form-text</#if><#if class!=''> ${class}</#if>" <#if labelFor!=''>aria-describedby="${labelFor}"</#if>>
552 <#nested>
553 </small>
554 <#else>
555 <span class="form-help" data-toggle="popover" data-html="true" data-trigger="hover" data-placement="bottom" data-content="<#nested>">?</span>
556 </#if>
557 </#macro>
558 <#-- ------------------------------------------------------------------------------------------------------------------------------------------ -->
559 <#-- INPUTS & TEXTAREA -->
560 <#-- ------------------------------------------------------------------------------------------------------------------------------------------ -->
561 <#-- name : Mandatory : Name for field -->
562 <#-- type : text/textarea/password/email/file/number/range/color/hidden/tel. Default : text -->
563 <#-- value: '' -->
564 <#-- class: '' -->
565 <#-- id: '' -->
566 <#-- title: '' -->
567 <#-- size: '' -->
568 <#-- inputSize: 0 -->
569 <#-- maxlength: 0 -->
570 <#-- placeHolder: '' -->
571 <#-- rows: 4 Textarea specific -->
572 <#-- cols: 40 Textarea specific -->
573 <#-- pattern: '' [A-F][0-9]{5} -->
574 <#-- tabIndex: '' -->
575 <#-- disabled: false -->
576 <#-- readonly: false -->
577 <#-- min: 0 -->
578 <#-- max: 0 -->
579 <#-- min: 0 -->
580 <#-- params: '' -->
581 <#-- mandatory: false -->
582 <#-- language: for input type DATE and datepickers -->
583 <#-- defaultDate: Format must be "yyyy-MM-dd hh:mm" -->
584 <#-- minDate: Format must be "yyyy-MM-dd hh:mm" -->
585 <#-- maxDate: Format must be "yyyy-MM-dd hh:mm" -->
586 <#-- defaultHour: Format must be "hh" -->
587 <#-- defaultMinute: Format must be "mm" -->
588 <#-- minTime : Format must be "hh:mm" -->
589 <#-- maxTime : Format must be "hh:mm" -->
590 <#-- format='' : Format for DB -->
591 <#-- showFormat='' Format for User -->
592 <#-- dateRangeEndId='' Id for date range date end -->
593 <#-- dateParams : [] https://flatpickr.js.org/options/ for options list | Example : dateParams=[{'inline': 'true'},{'hourIncrement': '4'}] -->
594 <#-- showFileUrl=false -->
595 <#-- fileURL='' -->
596 <#-- fileName='' -->
597 <#-- datalist='' To comma separated list of values Example : datalist='titi,tata' -->
598 <#-- ------------------------------------------------------------------------------------------------------------------------------------------ -->
599 <#macro input name id='' type='text' value='' class='' size='' inputSize=0 maxlength=0 placeHolder='' rows=4 cols=40 richtext=false tabIndex='' disabled=false readonly=false pattern='' title='' min=0 max=0 params='' mandatory=false language=.locale minDate='' maxDate='' defaultDate='' minTime='' maxTime='' defaultTime='' time_24hr=true format='' showFormat='' dateRangeEndId='' dateParams=[] showFileUrl=false fileURL='' fileName='' datalist=''>
600 <#if propagateMandatory?? && propagateMandatory && propagateHtmlRequired ><#local mandatory = true /></#if>
601 <#if type='textarea'>
602 <textarea name="${name}" class="form-control<#if size!=''> input-${size}</#if><#if class!=''> ${class}</#if><#if richtext> richtext</#if>" rows="${rows}" cols="${cols}"<#if tabIndex!=''> tabindex="${tabIndex}"</#if><#if placeHolder!=''> placeholder="${placeHolder}"</#if><#if title!=''> title="${title}"</#if><#if disabled> disabled</#if><#if readonly> readonly</#if><#if id!=''> id="${id}"</#if><#if params!=''> ${params}</#if><#if pattern!=''>pattern=${pattern}</#if><#if (mandatory && !richtext)> required</#if><#if labelFor?? && labelFor!='' && helpKey?? && helpKey!=''> aria-describedby="${labelFor}_help"</#if>><#if value!='' >${value}<#else><#nested></#if></textarea>
603 <#elseif type='text' || type='search' || type='password' || type='email' || type='file' || type='number' || type='color' || type='range' || type='tel' || type='datalist'>
604 <input class="form-control<#if size!=''> input-${size}</#if><#if type='color'> input-color</#if><#if class!=''> ${class}</#if>" type="${type}" name="${name}" value="${value}"<#if tabIndex!=''> tabindex="${tabIndex}"</#if><#if placeHolder!=''> placeholder="${placeHolder}"</#if><#if title!=''> title="${title}"</#if><#if maxlength > 0> maxlength="${maxlength}"</#if><#if inputSize!=0> size="${inputSize}"</#if><#if disabled> disabled</#if><#if readonly> readonly</#if><#if id!=''> id="${id}"</#if><#if params!=''> ${params}</#if><#if pattern!=''>pattern=${pattern}</#if><#if min!=max> min="${min}"</#if><#if max!=0> max="${max}"</#if><#if mandatory> required </#if><#if labelFor?? && labelFor!='' && helpkey?? && helpKey!=''> aria-describedby="${labelFor}_help"</#if><#if type='datalist'> list="${name}_list"</#if>>
605 <#if type='file'>
606 <input type="hidden" id=${id}Key name="${name}Key" value="${value}" />
607 <#if showFileUrl && fileURL?? && fileName??>
608 <@link href="${fileURL}">${fileName}</@link>
609 </#if>
610 </#if>
611 <#if type='datalist'>
612 <#if id !='' && datalist !='' >
613 <datalist id="${name}_list">
614 <#assign options = datalist?split(',')>
615 <#list options as opt>
616 <option value="${opt!}">
617 </#list>
618 </datalist>
619 <#else>
620 <!-- Missing id or params attribute for macro @input for type "datalist" -->
621 </#if>
622 </#if>
623 <#elseif type='date' || type='datetime' || type='daterange' || type='datetimerange' || type='time'>
624 <input class="form-control<#if size!=''> input-${size}</#if><#if class!=''> ${class}</#if>" type="text" name="${name}" value="${value}"<#if tabIndex!=''> tabindex="${tabIndex}"</#if><#if placeHolder!=''> placeholder="${placeHolder}"</#if><#if title!=''> title="${title}"</#if><#if maxlength > 0> maxlength="${maxlength}"</#if><#if inputSize!=0> size="${inputSize}"</#if><#if disabled> disabled</#if><#if readonly> readonly</#if><#if id!=''> id="${id}"</#if><#if params!=''> ${params}</#if><#if pattern!=''>pattern=${pattern}</#if><#if min!=max> min="${min}"</#if><#if max!=0> max="${max}"</#if><#if mandatory> required </#if><#if labelFor?? && labelFor!='' && helpkey?? && helpKey!=''> aria-describedby="${labelFor}_help"</#if> />
625 <#if type='date'>
626 <@getDate idField='${id}' language=language format=format showFormat=showFormat minDate=minDate maxDate=maxDate defaultDate=defaultDate dateOptions=dateParams />
627 <#elseif type='datetime'>
628 <@getDateTime idField='${id}' language=language format=format showFormat=showFormat minDate=minDate maxDate=maxDate defaultDate=defaultDate minTime=minTime maxTime=maxTime dateOptions=dateParams />
629 <#elseif type='daterange'>
630 <#if dateRangeEndId != ''>
631 <@getDateRange idField='${id}' idEndField='${dateRangeEndId}' language=language format=format showFormat=showFormat minDate=minDate maxDate=maxDate defaultDate=defaultDate dateOptions=dateParams />
632 <#else>
633 <@alert class='danger'>${i18n("portal.util.datepicker.rangeEndId.mandatory")}</@alert>
634 </#if>
635 <#elseif type='datetimerange'>
636 <#if dateRangeEndId != ''>
637 <@getDateTimeRange idField='${id}' idEndField='${dateRangeEndId}' language=language format=format showFormat=showFormat minDate=minDate maxDate=maxDate defaultDate=defaultDate minTime=minTime maxTime=maxTime dateOptions=dateParams />
638 <#else>
639 <@alert class='danger'>${i18n("portal.util.datepicker.rangeEndId.mandatory")}</@alert>
640 </#if>
641 <#elseif type='time'>
642 <@getTime idField='${id}' language=language format='H:i' showFormat='H:i' minTime=minTime maxTime=maxTime time_24hr=time_24hr defaultDate=defaultDate dateOptions=dateParams />
643 </#if>
644 <#if id=''><@alert class='danger'>${i18n("portal.util.datepicker.id.mandatory")}</@alert></#if>
645 <#elseif type='hidden'>
646 <input type="hidden" name="${name}" <#if id!=''>id="${id}"</#if> value="${value}" />
647 <#else><@icon style='warning' />Type not supported
648 </#if>
649 </#macro>
650 <#-- STATIC TEXT -->
651 <#-- Bootstrap colors: muted/primary/success/info/warning/danger -->
652 <#-- AdminLTE colors: red/yellow/aqua/blue/black/light-blue/green/gray/navy/teal/olive/lime/orange/fuchsia/purple/maroon -->
653 <#macro staticText inForm=true color='' id='' params=''>
654 <p class="<#if inForm>form-control-static</#if><#if color!=''> text-${color}</#if>"<#if id!=''> id="${id}"</#if><#if params!=''> ${params}</#if>>
655 <#nested>
656 </p>
657 </#macro>
658 <#-- CHECKBOX -->
659 <#-- orientation: vertical/inline. Default is vertical -->
660 <#-- TODO -->
661 <#macro checkBox name id='' class='' labelKey='' orientation='vertical' value='' tabIndex='' title='' disabled=false readonly=false checked=false params='' mandatory=false deprecated...>
662 <@deprecatedWarning args=deprecated />
663 <#if id = ''><#local id = name /></#if>
664 <#if orientation='vertical'><div class="checkbox"></#if>
665 <label<#if orientation!='vertical'> class="checkbox-inline"</#if> for="${id}" <#if title!=''> title="${title}"</#if>>
666 <input type="checkbox" id="${id}"<#if class!=''> class="${class}"</#if> name="${name}"<#if value!=''> value="${value}"</#if><#if tabIndex!=''> tabindex="${tabIndex}"</#if><#if checked> checked</#if><#if disabled> disabled</#if><#if readonly> readonly</#if><#if params!=''> ${params}</#if><#if mandatory> required</#if> />
667 <#if labelKey!=''>${labelKey}<#else><#nested></#if>
668 </label>
669 <#if orientation='vertical'></div></#if>
670 </#macro>
671 <#-- RADIO BUTTON -->
672 <#-- orientation: vertical/inline. Default is vertical -->
673 <#macro radioButton name id='' labelKey='' labelFor='' orientation='vertical' value='' tabIndex='' title='' disabled=false readonly=false checked=false params='' mandatory=false >
674 <#if propagateMandatory?? && propagateMandatory && propagateHtmlRequired ><#local mandatory = true /></#if>
675 <#if orientation='vertical'><div class="radio"></#if>
676 <label<#if orientation!='vertical'> class="radio-inline"</#if> for="${labelFor}">
677 <input type="radio" id="${id}" name="${name}"<#if value!=''> value="${value}"</#if><#if tabIndex!=''> tabindex="${tabIndex}"</#if><#if checked> checked</#if><#if disabled> disabled</#if><#if readonly> readonly</#if><#if mandatory> required</#if><#if params!=''> ${params}</#if> />
678 <#if labelKey!=''>${labelKey}<#else><#nested></#if>
679 </label>
680 <#if orientation='vertical'></div></#if>
681 </#macro>
682 <#-- INPUT-GROUP -->
683 <#-- size: sm/lg/no size-->
684 <#macro inputGroup size='' class='' id='' params=''>
685 <div class="input-group<#if size!=''> input-group-${size}</#if><#if class!=''> ${class}</#if>" <#if id!=''> id="${id}"</#if><#if params!=''> ${params}</#if>>
686 <#nested>
687 </div>
688 </#macro>
689 <#macro inputGroupItem pos='' type='btn' id='' params=''>
690 <#-- type: btn/text. default is btn-->
691 <#if type = 'text'>
692 <#local type = 'addon' />
693 </#if>
694 <span class="input-group-${type}"<#if id!=''> id="${id}"</#if><#if params!=''> ${params}</#if>>
695 <#nested>
696 </span>
697 </#macro>
698 <#-- DROPDOWN MENU -->
699 <#-- class: dropdown-menu-right -->
700 <#-- Expected content : <li><a>Your link here</a></li> -->
701 <#macro dropdownMenu class='' id='' params=''>
702 <ul class="dropdown-menu ${class}"<#if id!=''> id="${id}"</#if><#if params!=''> ${params}</#if>>
703 <#nested>
704 </ul>
705 </#macro>
706 <#-- ROW -->
707 <#macro row class='' id='' collapsed=false align='' params=''>
708 <#if collapsed><#local class += ' ' + 'collapse' /></#if>
709 <#if align!=''><#local class+= ' ' + alignmentSettings(align) /></#if>
710 <div class="row<#if class!=''> ${class}</#if>"<#if id!=''> id="${id}"</#if><#if params!=''> ${params}</#if>>
711 <#nested>
712 </div>
713 </#macro>
714 <#-- COLUMNS -->
715 <#-- cols = col-xs- (<544px)/col-sm- (>=544px)/col-md- (>=768px)/col-lg- (>=992px)/col-xl- (>=1200px) -->
716 <#-- Push and Pull are deprecated in Bootstrap 4 -->
717 <#-- offsetXs, offsetSm, offsetMd, offsetLg and offsetXl are deprecated. Use offset={} instead where the values are listed as following: offset={'xs':int, 'sm':int, 'md':int, 'lg':int, 'xl':int} -->
718 <#-- Order uses flexbox. Use Order for xs/all breakpoints this way: order=int, or for other breakpoints this way: order={'sm':int, 'md':int, 'lg':int, 'xl':int} -->
719 <#macro columns tag='div' offset={} offsetXs=0 offsetSm=0 offsetMd=0 offsetLg=0 offsetXl=0 order={} pushXs=0 pushSm=0 pushMd=0 pushLg=0 pushXl=0 pullXs=0 pullSm=0 pullMd=0 pullLg=0 pullXl=0 xs=12 sm=0 md=0 lg=0 xl=0 id='' class='' align='' collapsed=false params=''>
720 <#if align!=''><#local class+= ' ' + alignmentSettings(align,'text') /></#if>
721 <#if collapsed><#local class += ' ' + 'collapse' /></#if>
722 <#if align!=''><#local class+= ' ' + alignmentSettings(align,'text') /></#if>
723 <#local class += ' ' + responsiveDisplay('col',{'xs':xs, 'sm':sm, 'md':md, 'lg':lg, 'xl':xl}) />
724 <#if offset?has_content>
725 <#local class += ' ' + responsiveDisplay('offset',offset) />
726 <#elseif offsetXs > 0 || offsetSm > 0 || offsetMd > 0 || offsetLg > 0 || offsetXl > 0>
727 <#local class += ' ' + responsiveDisplay('offset',{'xs':offsetXs, 'sm':offsetSm, 'md':offsetMd, 'lg':offsetLg, 'xl':offsetXl}) />
728 </#if>
729 <#if pushXs > 0 || pushSm > 0 || pushMd > 0 || pushLg > 0 || pushXl > 0>
730 <#local breakpoints = {'xs':pushXs, 'sm':pushSm, 'md':pushMd, 'lg':pushLg, 'xl':pushXl} />
731 <#list breakpoints as breakpointkey,breakpointvalue>
732 <#if breakpointvalue!=0>
733 <#local class += ' col-${breakpointkey}-push-${breakpointvalue}' />
734 </#if>
735 </#list>
736 </#if>
737 <#if pullXs > 0 || pullSm > 0 || pullMd > 0 || pullLg > 0 || pullXl > 0>
738 <#local breakpoints = {'xs':pullXs, 'sm':pullSm, 'md':pullMd, 'lg':pullLg, 'xl':pullXl} />
739 <#list breakpoints as breakpointkey,breakpointvalue>
740 <#if breakpointvalue!=0>
741 <#local class += ' col-${breakpointkey}-pull-${breakpointvalue}' />
742 </#if>
743 </#list>
744 </#if>
745 <${tag}<#if class?trim!=''> class="${class?trim}"</#if><#if id!=''> id="${id}"</#if><#if params!=''> ${params}</#if>>
746 <#nested>
747 </${tag}>
748 </#macro>
749 <#-- LISTS -->
750 <#macro ul id='' class='' align='' hide=[] collapsed=false params=''>
751 <#if collapsed><#local class += ' ' + 'collapse' /></#if>
752 <#if align!=''><#local class+= ' ' + alignmentSettings(align) /></#if>
753 <#if hide??><#local class += ' ' + displaySettings(hide,'block') /></#if>
754 <ul<#if class!=''> class="${class?trim}"</#if><#if params!=''> ${params}</#if><#if id!=''> ${id}</#if>>
755 <#nested>
756 </ul>
757 </#macro>
758 <#macro li id='' params='' class=''>
759 <li<#if class!=''> class="${class}"</#if><#if params!=''> ${params}</#if><#if id!=''> ${id}</#if>>
760 <#nested>
761 </li>
762 </#macro>
763 <#-- DIV -->
764 <#macro div id='' class='' hide=[] collapsed=false align='' params=''>
765 <#if collapsed><#local class += ' ' + 'collapse' /></#if>
766 <#if align!=''>
767 <#local class += ' ' + alignmentSettings(align,'text') />
768 <div class="clearfix">
769 </#if>
770 <#if hide??><#local class += ' ' + displaySettings(hide,'block') /></#if>
771 <div<#if class!=''> class="${class?trim}"</#if><#if id!=''> id="${id}"</#if><#if params!=''> ${params}</#if>>
772 <#nested>
773 </div>
774 <#if align!=''>
775 </div>
776 </#if>
777 </#macro>
778 <#-- PARAGRAPH -->
779 <#macro p id='' class='' hide=[] collapsed=false align='' params=''>
780 <#if collapsed><#local class += ' ' + 'collapse' /></#if>
781 <#local class += ' ' + alignmentSettings(align,'text') + ' ' + displaySettings(hide,'block') />
782 <p<#if class!=''> class="${class?trim}"</#if><#if params!=''> ${params}</#if><#if id!=''> ${id}</#if>>
783 <#nested>
784 </p>
785 </#macro>
786 <#-- SPAN -->
787 <#macro span id='' class='' hide=[] collapsed=false align='' params=''>
788 <#if collapsed><#local class += ' ' + 'collapse' /></#if>
789 <#local class += ' ' + alignmentSettings(align,'text') + ' ' + displaySettings(hide,'inline-flex') />
790 <span<#if class!=''> class="${class?trim}"</#if><#if params!=''> ${params}</#if><#if id!=''> ${id}</#if>>
791 <#nested>
792 </span>
793 </#macro>
794 <#-- PRE -->
795 <#macro pre id='' class='' hide=[] collapsed=false align='' params=''>
796 <#local class += ' ' + alignmentSettings(align,'text') + ' ' + displaySettings(hide,'block') />
797 <pre<#if class!=''> class="${class?trim}"</#if><#if params!=''> ${params}</#if><#if id!=''> ${id}</#if>>
798 <#nested>
799 </pre>
800 </#macro>
801 <#-- TABS -->
802 <#-- Tab Container -->
803 <#-- TAB Custom AdminLTE -->
804 <#-- style: tabs/tabs nav-justified/pills/pills nav-stacked/pills nav-justified -->
805 <#macro tabs color='' style='tabs' class='' id='' hide=[] collapsed=false params=''>
806 <#if collapsed><#local class += ' ' + 'collapse' /></#if>
807 <#if hide??><#local class += ' ' + displaySettings(hide,'block') /></#if>
808 <#assign propagateTabStyle = style />
809 <div class="nav-tabs-custom<#if color!=''> ${color}</#if><#if class!=''> ${class?trim}</#if>"<#if id!=''> id="${id}"</#if><#if params!=''> ${params}</#if>>
810 <#nested>
811 </div>
812 </#macro>
813 <#-- Bootstrap UL tabs -->
814 <#-- type is deprecated -->
815 <#macro tabList style='tabs' vertical=false id='' params='' color=''>
816 <#if propagateTabStyle??><#local style = propagateTabStyle /></#if>
817 <ul class="nav nav-${style}<#if vertical> nav-stacked</#if>"<#if id!=''> id="${id}"</#if><#if params!=''> ${params}</#if><#if vertical> style="margin-bottom:2rem;"</#if>>
818 <#nested>
819 </ul>
820 </#macro>
821 <#-- Tabs -->
822 <#-- type: -->
823 <#macro tabLink class='' hide=[] id='' active=false href='' title=''tabLabel='' tabClass='' tabIcon='' params=''>
824 <#local tabLinkClass = class />
825 <#if active><#local tabLinkClass += ' active' /></#if>
826 <li class="${tabLinkClass?trim}" role="presentation"<#if id!=''> id="${id}"</#if><#if params!=''> ${params}</#if>>
827 <#local tabLinkSettings = 'role="tab" aria-expanded="false"' />
828 <#if href?contains('#') && href?contains('.jsp') == false>
829 <#local tabLinkSettings += 'data-toggle="tab"' />
830 </#if>
831 <@link href=href title=title params=tabLinkSettings>
832 <#if tabIcon!=''><@icon style=tabIcon /></#if> <#if tabLabel !=''>${tabLabel!}<#else>${title!}</#if>
833 <#nested>
834 </@link>
835 </li>
836 </#macro>
837 <#-- TAB Content AdminLTE -->
838 <#macro tabContent id='' params=''>
839 <div class="tab-content"<#if id!=''> id="${id}"</#if><#if params!=''> ${params}</#if>>
840 <#nested>
841 </div>
842 </#macro>
843 <#-- Tab Panel BS3 -->
844 <#macro tabPanel id params='' active=false>
845 <div class="tab-pane mt-2 fade<#if active> in active</#if>" role="tabpanel" id="${id}"<#if params!=''> ${params}</#if>>
846 <#nested>
847 </div>
848 </#macro>
849 <#-- ACCORDION -->
850 <#-- The accordionContainer is the container for accordionPanel, which itself is the container for accordionHeader and accordionBody -->
851 <#-- The childId argument in accordionPanel is meant to be used in the two sub-macros: accordionHeader and accordionBody -->
852 <#macro accordionContainer id='' params=''>
853 <#if id = '' >
854 <#if accordionContainerId?? == false><#assign accordionContainerId = 1 ><#else><#assign accordionContainerId = accordionContainerId + 1 ></#if>
855 <#local id = 'accCont_'+ accordionContainerId >
856 </#if>
857 <div class="box-group" id="${id}"<#if params!=''> ${params}</#if>>
858 <#assign parentId = id>
859 <#nested>
860 </div>
861 </#macro>
862 <#macro accordionPanel color='' collapsed=true childId='' id='' params=''>
863 <div class="panel box box-${color}"<#if id!=''> id="${id}"</#if><#if params!=''> ${params}</#if>>
864 <#if collapsed = true>
865 <#assign aClass = 'collapsed'>
866 <#assign expanded = 'false'>
867 <#assign childClass = 'panel-collapse collapse'>
868 <#else>
869 <#assign aClass = ''>
870 <#assign expanded = 'true'>
871 <#assign childClass = 'panel-collapse collapse in'>
872 </#if>
873 <#assign childId = childId>
874 <#nested>
875 </div>
876 </#macro>
877 <#-- ACCORDION ELEMENT -->
878 <#-- The boxTools parameter is unused, kept for backwards compatibility -->
879 <#macro accordionHeader title='' parentId=parentId childId=childId boxTools=false id='' params='' headerIcon='' >
880 <div class="box-header with-border"<#if id!=''> id="${id}"</#if><#if params!=''> ${params}</#if>>
881 <h2 class="box-title">
882 <a class="${aClass}" data-toggle="collapse" data-parent="#${parentId}" href="#${childId}" aria-expanded="${expanded}">
883 <#if headerIcon!=''><@icon style=headerIcon /></#if>
884 ${title}
885 </a>
886 </h2>
887 <#local nested><#nested></#local>
888 <#if nested?has_content>
889 <div class="box-tools">
890 ${nested}
891 </div>
892 </#if>
893 </div>
894 </#macro>
895 <#macro accordionBody id=childId class=childClass expanded=expanded params=''>
896 <div id="${id}" class="${class}" aria-expanded="${expanded}"<#if params!=''> ${params}</#if>>
897 <@boxBody>
898 <#nested>
899 </@boxBody>
900 </div>
901 </#macro>
902 <#macro progressBar description='' id='' params=''>
903 <div class="progress"<#if id!=''> id="${id}"</#if><#if params!=''> ${params}</#if>>
904 <div id="progressbar" class="progress-bar progress-bar-striped" role="progressbar">
905 <div id="complexity">0%</div>
906 </div>
907 </div>
908 <#if description!=''>
909 <span class="progress-description">${description}</span>
910 </#if>
911 </#macro>
912 <#-- Progress macro
913 token : the progress manager Feed Token
914 interval : refresh period in milli seconds (if the feed token is provided)
915 showReport : display the messages report (if the feed token is provided) -->
916 <#macro progress color='primary' id='' params='' value=0 min=0 max=100 text='' progressId='progressbar' token='' label='' showReport=false intervalTime=2000 >
917 <#if label!='' >
918 <div id="${progressId}-label" >${label}</div>
919 </#if>
920 <div class="progress"<#if id!=''> id="${id}"</#if><#if params!=''> ${params}</#if>>
921 <div id="${progressId}" class="progress-bar progress-bar-${color}<#if token!=''> progressmanager</#if>" role="progressbar" style="width: ${value}%;" aria-valuenow="${value}" aria-valuemin="${min}" aria-valuemax="${max}" <#if token!=''>token="${token}" intervalTime=${intervalTime} showReport=${showReport?c}</#if> >
922 <#if text=''>${value}%<#else>${text}</#if>
923 </div>
924 </div>
925 <#if showReport >
926 <div id="${progressId}-report" class="progress-bar-report" lastline=0></div>
927 </#if>
928 </#macro>
929 <#-- INFO-BOX AdminTLE (widget) -->
930 <#-- color: only for the left side showing the icon. -->
931 <#-- bgColor: for the right side containing the text -->
932 <#macro infoBox color='' boxText='' boxIcon='' boxNumber='' unit='' bgColor='' progressBar='' progressDescription='' id='' params=''>
933 <div class="info-box"<#if id!=''> id="${id}"</#if><#if params!=''> ${params}</#if>>
934 <span class="<#if bgColor!=''>${bgColor}</#if> info-box-icon"><@icon style=boxIcon /></span><#if boxText !=''><span class="info-box-text ml-2">${boxText}</span></#if>
935 <div class="info-box-content">
936 <#if boxNumber!='0'><span class="info-box-number">${boxNumber?trim}<#if unit!=''> <small>${unit}</small></#if></span></#if>
937 <#if bgColor!='' && progressBar!=''><div class="progress"><div class="progress-bar" style="width: ${(boxNumber?trim?number/progressBar?trim?number*100)?string.computer}%"></div></div></#if>
938 <#if progressDescription!=''><span class="progress-description">${progressDescription}</span></#if>
939 <#nested />
940 </div>
941 </div>
942 </#macro>
943 <#-- TAG -->
944 <#-- color: default/primary/success/info/warning/danger/ -->
945 <#macro tag color='default' class='' size='' title='' tagIcon='' id='' params='' deprecated...>
946 <@deprecatedWarning args=deprecated />
947 <span class="label label-${color}<#if class!=''> ${class}</#if>"<#if title!=''> title='${title}'</#if><#if id!=''>id='${id}'</#if><#if params!=''>${params}</#if>>
948 <#if tagIcon !=''>
949 <@icon style=tagIcon />
950 </#if>
951 <#nested>
952 </span>
953 </#macro>
954 <#-- BUTTON -->
955 <#-- bootstrap 3 : size: btn-xs/btn-sm/btn-lg -->
956 <#-- upcoming bootstrap 4 : size: btn-sm for small buttons/empty for medium buttons/btn-lg for large buttons -->
957 <#-- color: default[bootstrap4 : secondary]/primary/success/warning/danger/info -->
958 <#-- color (upcoming bootstrap 4): btn-outline-default/btn-outline-primary/btn-outline-success/btn-outline-warning/btn-outline-danger/btn-outline-info/ -->
959 <#-- style: btn-block/btn-flat/close/navbar-toggle/collapsed... -->
960 <#-- type: button/submit/reset -->
961 <#-- params: data-toggle/data-target/data-dismiss... -->
962 <#-- buttonIcon: icon name ex: info/check/comment/envelope... -->
963 <#-- iconPosition: left/right -->
964 <#-- cancel: switch to true for a cancellation form button. Adds the "formnovalidate" attribute to the button, as well as the right class -->
965 <#-- formId: contains the form ID if the button is outside of the form -->
966 <#-- buttonTargetId: contains the target element ID -->
967 <#-- showTitle, showTitleXs, showTitleSm, showTitleMd, showTitleLg are deprecated in Lutece v7 -->
968 <#macro button name='' id='' type='button' size='' color='' style='btn-flat' class='' params='' value='' title='' tabIndex='' hideTitle=[] showTitle=true showTitleXs=true showTitleSm=true showTitleMd=true showTitleLg=true buttonIcon='' disabled=false iconPosition='left' dropdownMenu=false cancel=false formId='' buttonTargetId='' deprecated...>
969 <@deprecatedWarning args=deprecated />
970 <#if cancel || color = 'default' || color='btn-default' || color='btn-secondary' || color='secondary'>
971 <#local buttonColor = 'default' />
972 <#elseif !cancel && color=''>
973 <#local buttonColor = 'primary' />
974 <#else>
975 <#local buttonColor = color />
976 </#if>
977 <#-- Visibility of button title -->
978 <#local displayTitleClass = displaySettings(hideTitle,'inline-flex') />
979 <#-- Visibility of button title: backwards compatibility with Lutece v6, BS3 only -->
980 <#local showTitleClass = '' />
981 <#if showTitle = false><#local showTitleClass = 'sr-only' /></#if>
982 <#if showTitleXs = false><#local showTitleClass = showTitleClass + ' hidden-xs' /></#if>
983 <#if showTitleSm = false><#local showTitleClass = showTitleClass + ' hidden-sm' /></#if>
984 <#if showTitleMd = false><#local showTitleClass = showTitleClass + ' hidden-md' /></#if>
985 <#if showTitleLg = false><#local showTitleClass = showTitleClass + ' hidden-lg' /></#if>
986 <#if style != ''>
987 <#if style?contains('card-control')>
988 <#if style?contains('collapse')>
989 <#local widgetAction = 'collapse' />
990 <div style="display:none;">
991 <script>
992 $(document).ready(function() {
993 <#if buttonIcon = 'minus'>
994 $("${buttonTargetId}").addClass("collapse in");
995 <#else>
996 $("${buttonTargetId}").addClass("collapse");
997 </#if>
998 });
999 </script>
1000 </div>
1001 <#elseif style?contains('remove')>
1002 <#local widgetAction = 'remove' />
1003 </#if>
1004 <#local btnStyle = 'btn-flat ' + style?replace('collapse|remove', '', 'r')?trim />
1005 <#elseif style?contains('modal')>
1006 <#local widgetAction = 'modal' />
1007 <#local btnStyle = 'btn-flat ' + style?replace('modal', '', 'r')?trim />
1008 <#else>
1009 <#local btnStyle = 'btn-flat ' + style />
1010 </#if>
1011 </#if>
1012 <button class="<#if style!='close'>btn</#if><#if size!=''> btn-${size}</#if><#if buttonColor!=''> btn-${buttonColor}</#if><#if btnStyle!=''> ${btnStyle}</#if><#if dropdownMenu> dropdown-toggle</#if><#if class!=''> ${class}</#if>" type="${type}"<#if title!=''> title="${title}"</#if><#if name!=''> name="${name}"</#if><#if id!=''> id="${id}"</#if><#if value!=''> value="${value}"</#if><#if params!=''> ${params}</#if><#if disabled> disabled</#if><#if dropdownMenu> data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"</#if><#if widgetAction?? && widgetAction!=''><#if widgetAction = 'collapse' || widgetAction = 'modal'> data-toggle="${widgetAction}"<#elseif widgetAction = 'remove'> data-dismiss="alert"</#if></#if><#if buttonTargetId!=''> data-target="${buttonTargetId}"</#if><#if cancel> formnovalidate</#if><#if formId!=''> form="${formId}"</#if>>
1013 <#if buttonIcon!='' && iconPosition='left'><@icon style=buttonIcon /></#if>
1014 <#local nestedContent><#nested /></#local>
1015 <#local nestedContent = nestedContent?trim />
1016 <#if nestedContent=''>
1017 <#if displayTitleClass!=''><span class="${displayTitleClass}"></#if>
1018 ${title}
1019 <#if displayTitleClass!=''></span></#if>
1020 </#if>
1021 <#if nestedContent!='' && !dropdownMenu><#if displayTitleClass!=''><span class="${displayTitleClass}"></#if><#nested><#if displayTitleClass!=''></span></#if></#if>
1022 <#if buttonIcon!='' && iconPosition='right'><@icon style=buttonIcon /></#if>
1023 <#if dropdownMenu>
1024  <@icon style='caret-down' />
1025 </#if>
1026 </button>
1027 <#if dropdownMenu>
1028 <ul class="dropdown-menu"<#if id!=''> id="${id}-content" aria-labelledby="${id}-content"</#if>>
1029 <#nested>
1030 </ul>
1031 </#if>
1032 </#macro>
1033 <#-- A BUTTON (LINK STYLED AS A BUTTON) -->
1034 <#-- size: btn-xs/btn-sm/btn-lg -->
1035 <#-- color: default/primary/success/warning/danger/info/ -->
1036 <#-- style: btn-block/btn-flat/disabled/btn-app -->
1037 <#-- icon: icon name ex: info/check/comment/envelope... -->
1038 <#-- showTitle, showTitleXs, showTitleSm, showTitleMd, showTitleLg are deprecated in Lutece v7 -->
1039 <#macro aButton name='' id='' href='' target='' size='' color='primary' style='btn-flat' align='' class='' params='' title='' tabIndex='' hideTitle=[] buttonIcon='' disabled=false iconPosition='left' dropdownMenu=false deprecated...>
1040 <@deprecatedWarning args=deprecated />
1041 <#-- Bootstrap 4 transition -->
1042 <#if color='secondary'>
1043 <#local color_temp='default'>
1044 <#else>
1045 <#local color_temp=color>
1046 </#if>
1047 <#-- Visibility of button title -->
1048 <#local displayTitleClass = displaySettings(hideTitle,'inline-flex') />
1049 <#local class += ' ' + alignmentSettings(align,'') />
1050 <a class="btn<#if size!=''> btn-${size}</#if><#if color_temp!=''> btn-${color_temp}</#if><#if style!=''> ${style}</#if><#if class!=''> ${class}</#if>"<#if name!=''> name="${name}"</#if><#if id!=''> id="${id}"</#if> href="${href}" title="${title}"<#if target!=''> target="${target}"</#if><#if params!=''> ${params}</#if><#if disabled> disabled</#if><#if dropdownMenu> data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"</#if>>
1051 <#if buttonIcon!='' && iconPosition='left'><@icon style=buttonIcon /></#if>
1052 <span class="<#if displayTitleClass!=''>${displayTitleClass}</#if>">${title}</span>
1053 <#if buttonIcon!='' && iconPosition='right'><@icon style=buttonIcon /></#if>
1054 <#if dropdownMenu>
1055  <@icon style='caret-down' />
1056 </#if>
1057 <#if !dropdownMenu>
1058 <#nested>
1059 </#if>
1060 </a>
1061 <#if dropdownMenu>
1062 <ul class="dropdown-menu"<#if id!=''> id="${id}-content" aria-labelledby="${id}"</#if>>
1063 <#nested>
1064 </ul>
1065 </#if>
1066 </#macro>
1067 <#-- BTN TOOLBAR -->
1068 <#macro btnToolbar id='' class='' align='' ariaLabel='' params=''>
1069 <#if align!=''><#local class += ' ' + alignmentSettings(align) /></#if>
1070 <div class="btn-toolbar<#if class!=''> ${class?trim}</#if>" role="toolbar"<#if ariaLabel!=''> aria-label="${ariaLabel}"</#if><#if id!=''> id="${id}"</#if><#if params!=''> ${params}</#if>>
1071 <#nested>
1072 </div>
1073 </#macro>
1074 <#-- BTN GROUP -->
1075 <#-- size: sm/empty/lg -->
1076 <#-- align: left/center/right -->
1077 <#macro btnGroup align='' size='' class='' id='' params='' ariaLabel='' hide=[] deprecated...>
1078 <@deprecatedWarning args=deprecated />
1079 <#local class += ' ' + displaySettings(hide,'') + ' ' + alignmentSettings(align,'') />
1080 <div class="btn-group<#if size!=''> btn-group-${size}</#if><#if class!=''> ${class?trim}</#if>" role="group"<#if ariaLabel!=''> aria-label="${ariaLabel}"</#if><#if id!=''> id="${id}"</#if><#if params!=''> ${params}</#if>>
1081 <#nested>
1082 </div>
1083 </#macro>
1084 <#-- Radio button/Checkbox as buttons (to use with btnGroup) -->
1085 <#-- type: radio/checkbox -->
1086 <#macro btnGroupRadioCheckbox type='checkbox' color='primary' size='' name='' id='' params='' ariaLabel='' labelFor='' labelKey='' labelParams='' tabIndex='' value='' checked=false>
1087 <label class="btn btn-${color}<#if size!=''> btn-${size}</#if>" for="${labelFor}"<#if labelParams!=''> ${labelParams}</#if>>
1088 <input type="${type}" name="${name}" id="${id}" autocomplete="off"<#if value!=''> value="${value}"</#if><#if params!=''> ${params}</#if><#if tabIndex!=''> tabindex="${tabIndex}"</#if><#if checked> checked</#if> /><#if labelKey!=''>${labelKey}</#if>
1089 </label>
1090 </#macro>
1091 <#-- Simple links a href, anchors -->
1092 <#macro link href='' class='' id='' name='' title='' alt='' target='' params=''>
1093 <a href="${href}"<#if class!=''> class="${class}"</#if><#if id!=''> id="${id}"</#if><#if name!=''> name="${name}"</#if><#if target!=''> target="${target}"</#if><#if title!=''> title="${title}"</#if><#if alt!=''> alt="${alt}"</#if><#if params!=''> ${params}</#if>>
1094 <#nested>
1095 </a>
1096 </#macro>
1097 <#-- MODAL -->
1098 <#-- bgColor: modal-default/modal-primary/modal-info/modal-warning/modal-danger -->
1099 <#macro modal id params='' bgColor='' size=''>
1100 <div class="modal ${bgColor} fade" role="dialog" id="${id}" data-toggle="modal"<#if params!=''> ${params}</#if>>
1101 <div class="modal-dialog<#if size!=''> modal-${size}</#if>" role="document">
1102 <div class="modal-content">
1103 <#nested>
1104 </div>
1105 </div>
1106 </div>
1107 </#macro>
1108 <#macro modalHeader titleLevel='h4' modalTitle='' id='' params=''>
1109 <div class="modal-header"<#if id!=''> id="${id}"</#if><#if params!=''> ${params}</#if>>
1110 <#nested>
1111 <button type="button" class="close" data-dismiss="modal" aria-label="Close">
1112 <span aria-hidden="true">×</span>
1113 </button>
1114 <${titleLevel} class="modal-title">${modalTitle}</${titleLevel}>
1115 </div>
1116 </#macro>
1117 <#macro modalBody id='' params=''>
1118 <div class="modal-body"<#if id!=''> id="${id}"</#if><#if params!=''> ${params}</#if>>
1119 <#nested>
1120 </div>
1121 </#macro>
1122 <#macro modalFooter id='' params=''>
1123 <div class="modal-footer"<#if id!=''> id="${id}"</#if><#if params!=''> ${params}</#if>>
1124 <#nested>
1125 </div>
1126 </#macro>
1127 <#-- BREADCRUMBS -->
1128 <#macro breadcrumbs id='' class='' params=''>
1129 <ol class="breadcrumb"<#if id!=''> id="${id}"</#if><#if params!=''> ${params}</#if>>
1130 <#nested>
1131 </ol>
1132 </#macro>
1133 <#macro breadcrumbItem class='' id='' params=''>
1134 <li<#if class!=''> class="${class}"</#if><#if id!=''> id="${id}"</#if><#if params!=''> ${params}</#if>>
1135 <#nested>
1136 </li>
1137 </#macro>
1138 <#-- CALLOUT -->
1139 <#-- AdminLTE classes: info/warning/danger/success -->
1140 <#macro callOut color='' titleLevel='h3' title='' callOutIcon='' id='' params=''>
1141 <div class="callout callout-${color}"<#if id!=''> id="${id}"</#if><#if params!=''> ${params}</#if>>
1142 <#if title!=''><${titleLevel}><@icon style=callOutIcon /> ${title}</${titleLevel}></#if>
1143 <#nested>
1144 </div>
1145 </#macro>
1146 <#-- ALERT -->
1147 <#-- classes: alert-success/alert-info/alert-warning/alert-danger + alert-dismissible -->
1148 <#-- color: primary/success/info/warning/dange r-->
1149 <#macro alert class='' color='' titleLevel='h3' title='' iconTitle='' dismissible=false id='' params=''>
1150 <div class="alert d-flex align-items-center<#if class!=''> ${class}</#if><#if color!=''> alert-${color}</#if>"<#if id!=''> id="${id}"</#if><#if params!=''> ${params}</#if>>
1151 <#if dismissible>
1152 <@button color='' size='' style='close' params='data-dismiss="alert" aria-hidden="true"'>×</@button>
1153 </#if>
1154 <#if iconTitle!=''><@icon style=iconTitle class='fa-inverse' params=' style="margin-right:15px;"' /></#if>
1155 <#if title!=''><${titleLevel}>${title}</${titleLevel}></#if>
1156 <#nested>
1157 </div>
1158 </#macro>
1159 <#-- -------------------------------------------------- -->
1160 <#-- AdminLTE Box -->
1161 <#-- color: default/primary/info/success/warning/danger -->
1162 <#-- style: solid (no top border) -->
1163 <#-- collapsed: true/false -->
1164 <#macro box color='' id='' style='' class='' title='' params='' collapsed=false>
1165 <div class="box<#if color!=''> box-${color}</#if><#if style!=''> box-${style}</#if><#if class!=''> ${class}</#if>"<#if id!=''> id="${id}"</#if><#if params!=''> ${params}</#if>>
1166 <#if title=''>
1167 <#nested>
1168 <#else>
1169 <@boxHeader title=title params=params skipHeader=true />
1170 <@boxBody><#nested></@boxBody>
1171 </#if>
1172 </div>
1173 </#macro>
1174 <#-- The boxTools parameter is unused, kept for backwards compatibility -->
1175 <#macro boxHeader title='' i18nTitleKey='' hideTitle=[] showTitle=true id='' class='' params='' boxTools=false titleLevel='h2' deprecated...>
1176 <@deprecatedWarning args=deprecated />
1177 <div class="box-header with-border<#if class!=''> ${class}</#if>"<#if id!=''> id="${id}"</#if><#if params!=''> ${params}</#if>>
1178 <${titleLevel} class="box-title<#if showTitle=false> sr-only</#if>"><#if title!=''>${title}</#if><#if i18nTitleKey!=''>#i18n{${i18nTitleKey}}</#if></${titleLevel}>
1179 <#local nested><#nested></#local>
1180 <#if nested?has_content>
1181 <div class="box-tools">
1182 ${nested}
1183 </div>
1184 </#if>
1185 </div>
1186 </#macro>
1187 <#macro boxBody class='' collapsed=false align='' id='' params=''>
1188 <#if collapsed><#local class += ' ' + 'collapse' /></#if>
1189 <#if align!=''><#local class += ' ' + alignmentSettings(align,'text') /></#if>
1190 <div class="box-body<#if class!=''> ${class}</#if>"<#if id!=''> id="${id}"</#if><#if params!=''> ${params}</#if>>
1191 <#nested>
1192 </div>
1193 </#macro>
1194 <#macro boxFooter class='' align='' id='' params=''>
1195 <#if align!=''><#local class += ' ' + alignmentSettings(align,'text') /></#if>
1196 <div class="box-footer<#if class!=''> ${class}</#if>"<#if id!=''> id="${id}"</#if><#if params!=''> ${params}</#if>>
1197 <#nested>
1198 </div>
1199 </#macro>
1200 <#---------------------------------------->
1201 <#-- AdminLTE Small Box -->
1202 <#-- color: Bootstrap + AdminLTE colors -->
1203 <#-- unit: %,... -->
1204 <#macro smallBox color='' title='' text='' boxIcon='' titleLevel='h3' unit='' url='' urlText='' id='' params='' fontSize='40px'>
1205 <div class="small-box<#if color!=''> bg-${color}</#if>"<#if id!=''> id="${id}"</#if><#if params!=''> ${params}</#if>>
1206 <div class="inner">
1207 <p>${text}</p>
1208 <${titleLevel} style="font-size:${fontSize};"><span>${title}</span><#if unit!=''> ${unit}</#if></${titleLevel}>
1209 </div>
1210 <div class="icon">
1211 <@icon style=boxIcon />
1212 </div>
1213 <#if url!=''>
1214 <a class="small-box-footer" href="${url}">${urlText} <@icon style='arrow-circle-right' /></a>
1215 </#if>
1216 </div>
1217 </#macro>
1218 <#-- AdminLTE Error Page -->
1219 <#-- Error Type: 500,404... -->
1220 <#-- Color: primary/blue/navy/aqua/teal/green/orange/yellow/red/purple/maroon/gray/black... -->
1221 <#macro errorPage color='' errorType='' id='' params=''>
1222 <div class="error-page"<#if id!=''> id="${id}"</#if><#if params!=''> ${params}</#if>>
1223 <h2 class="headline text-${color}">${errorType}</h2>
1224 <div class="error-content">
1225 <h3>
1226 <@icon style='warning' class='text-${color}' />
1227 <#if errorType=='404'>
1228 #i18n{portal.util.error404.title}
1229 <#elseif errorType='500'>
1230 #i18n{portal.util.error500.title}
1231 <#else>...
1232 </#if>
1233 </h3>
1234 <p>
1235 <#if errorType=='404'>
1236 #i18n{portal.util.error404.text}
1237 <#elseif errorType='500'>
1238 #i18n{portal.util.error500.text}
1239 <#else>...
1240 </#if>
1241 </p>
1242 <@aButton href='' size='' color='bg-${color}' style='btn-flat'>
1243 <@icon style='home' />
1244 #i18n{portal.util.labelBackHome}
1245 </@aButton>
1246 </div>
1247 </div>
1248 </#macro>
1249 <#-- CONTEXTUAL BACKGROUND P-->
1250 <#-- Bootstrap colors: primary/success/info/warning/danger -->
1251 <#-- AdminTLE colors: gray/gray-light/black/red/yellow/aqua/blue/light-blue/green/navy/teal/olive/lime/orange/fuchsia/purple/maroon -->
1252 <#macro coloredBg color='' type='p' id='' params=''>
1253 <${type} class="bg-${color}"<#if id!=''> id="${id}"</#if><#if params!=''> ${params}</#if>>
1254 <#nested>
1255 </${type}>
1256 </#macro>
1257 <#macro listGroup id='' class='' params=''>
1258 <ul class="list-group list-unstyled"<#if id!=''> id="${id}"</#if><#if class!=''> class="${class}"</#if><#if params!=''> ${params}</#if>>
1259 <#nested>
1260 </ul>
1261 </#macro>
1262 <#macro listGroupItem id='' class='' params=''>
1263 <li class="list-group-item"<#if id!=''> id="${id}"</#if><#if class!=''> class="${class}"</#if><#if params!=''> ${params}</#if>>
1264 <#nested>
1265 </li>
1266 </#macro>
1267 <#macro unstyledList id=''class='' params=''>
1268 <ul class="list-unstyled"<#if id!=''> id="${id}"</#if><#if class!=''> class="${class}"</#if><#if params!=''> ${params}</#if>>
1269 <#assign liClass = "margin">
1270 <#nested>
1271 </ul>
1272 </#macro>
1273 <#-- DROPDOWN MENU LIST -->
1274 <#macro dropdownList id='' class='' params=''>
1275 <ul class="dropdown-menu"<#if id!=''> id="${id}"</#if><#if class!=''> class="${class}"</#if><#if params!=''> ${params}</#if>>
1276 <#nested>
1277 </ul>
1278 </#macro>
1279 <#macro dropdownItem class='' href='' title='' target='' id='' params=''>
1280 <li>
1281 <a href="${href}" class="dropdown-item<#if class!=''> ${class}</#if>" title="${title}"<#if id!=''> id="${id}"</#if><#if params!=''> ${params}</#if><#if target!=''> target="${target}"</#if>>${title}</a>
1282 </li>
1283 </#macro>
1284 <#-- NAVBAR -->
1285 <#macro navBar tag='nav' class='' id='' params=''>
1286 <${tag} class="navbar<#if class!=''> ${class}</#if>"<#if id!=''> id="${id}"</#if><#if params!=''> ${params}</#if>>
1287 <#nested>
1288 </${tag}>
1289 </#macro>
1290 <#-- NAV -->
1291 <#macro nav tag='nav' type='tab' class='' id='' params=''>
1292 <${tag} class="nav nav-${type!}<#if class!=''> ${class}</#if>"<#if id!=''> id="${id}"</#if><#if params!=''> ${params}</#if>>
1293 <#nested>
1294 </${tag}>
1295 </#macro>
1296 <#-- NAVITEM -->
1297 <#macro navItem href='' name='' active=false title='' alt='' target='' tag='li' class='' id='' params=''>
1298 <${tag} class="nav-link<#if class!=''> ${class}</#if>"<#if id!=''> id="${id}"</#if><#if params!=''> ${params}</#if>>
1299 <#if href !='' >
1300 <@link class='nav-link' href=href name=name title=title alt=alt target=target active=active />
1301 </#if>
1302 <#nested>
1303 </#${tag}>
1304 </#macro>
1305 <#-- CARDS -->
1306 <#macro card header=false headerTitle='' headerIcon=false headerTitleIcon=''>
1307 <div class="panel panel-default">
1308 <#if header><div class="panel-heading"><#if headerIcon><@icon style='${headerTitleIcon}' /> </#if>${headerTitle}</div></#if>
1309 <div class="panel-body">
1310 <#nested>
1311 </div>
1312 </div>
1313 </#macro>
1314 <#-- FUNCTION: DISPLAY -->
1315 <#-- This function returns a "visible" or "hidden" class for any component -->
1316 <#-- breakpoints: "all" || "xs"/"sm"/"md"/"lg" -->
1317 <#-- display: unused -->
1318 <#function displaySettings breakPoints=[] display=''>
1319 <#local breakPointsOrdered = [] />
1320 <#if breakPoints?seq_contains("all")>
1321 <#local breakPointsOrdered += ["all"] />
1322 </#if>
1323 <#if breakPoints?seq_contains("xs")>
1324 <#local breakPointsOrdered += ["xs"] />
1325 </#if>
1326 <#if breakPoints?seq_contains("sm")>
1327 <#local breakPointsOrdered += ["sm"] />
1328 </#if>
1329 <#if breakPoints?seq_contains("md")>
1330 <#local breakPointsOrdered += ["md"] />
1331 </#if>
1332 <#if breakPoints?seq_contains("lg")>
1333 <#local breakPointsOrdered += ["lg"] />
1334 </#if>
1335 <#local displayClass = '' />
1336 <#if breakPointsOrdered?? && breakPointsOrdered?size > 0>
1337 <#list breakPointsOrdered as breakPoint>
1338 <#if breakPoint = "all">
1339 <#local displayClass = 'hidden' />
1340 <#elseif breakPoint = "xs">
1341 <#local displayClass = displayClass + ' hidden-xs' />
1342 <#elseif breakPoint = 'sm'>
1343 <#local displayClass = displayClass + ' hidden-sm' />
1344 <#elseif breakPoint = 'md'>
1345 <#local displayClass = displayClass + ' hidden-md' />
1346 <#elseif breakPoint = 'lg'>
1347 <#local displayClass = displayClass + ' hidden-lg' />
1348 <#else>
1349 <#local displayClass = displayClass + ' undefined_breakpoint' />
1350 </#if>
1351 </#list>
1352 </#if>
1353 <#return displayClass?trim>
1354 </#function>
1355 <#-- This function returns responsive classes -->
1356 <#-- type: col|offset -->
1357 <#function responsiveDisplay type='' breakpoints={}>
1358 <#local responsiveDisplayClass = '' />
1359 <#list breakpoints as breakpointkey,breakpointvalue>
1360 <#if breakpointvalue!=0>
1361 <#if type = 'col'>
1362 <#local responsiveDisplayClass += ' ${type}-${breakpointkey}-${breakpointvalue}' />
1363 <#elseif type = 'offset'>
1364 <#local responsiveDisplayClass += ' col-${breakpointkey}-${type}-${breakpointvalue}' />
1365 </#if>
1366 </#if>
1367 </#list>
1368 <#return responsiveDisplayClass?trim>
1369 </#function>
1370 <#function alignmentSettings align='' style=''>
1371 <#local x = ''>
1372 <#if align !=''>
1373 <#if align = 'left'>
1374 <#local x = 'pull-left' />
1375 <#elseif align = 'right'>
1376 <#if style = 'text'>
1377 <#local x = 'text-right' />
1378 <#elseif style = '' />
1379 <#local x = 'pull-right' />
1380 </#if>
1381 <#elseif align = 'center'>
1382 <#local x = 'text-center' />
1383 <#else>
1384 </#if>
1385 </#if>
1386 <#return x>
1387 </#function>
1388 <#-- NEW MACRO LUTECE-2221 -->
1389 <#-- MACRO adminHeader -->
1390 <#macro adminHeader site_name=site_name>
1391 <script src="js/admin/jquery/jquery-3.5.1.min.js"></script>
1392 <script src="js/admin/jquery/jquery-migrate-3.3.1.min.js"></script>
1393 </head>
1394 <body class="skin-blue-light hold-transition sidebar-mini" data-spy="scroll" data-target="#scrollspy">
1395 <div class="wrapper">
1396 <header class="main-header" role="banner" data-menu="${menu_pos}">
1397 <nav class="navbar navbar-fixed-top" role="navigation">
1398 <div class="navbar-header">
1399 <div class="nav-item">
1400 <a href="${prod_base_url!}jsp/site/Portal.jsp" title="#i18n{portal.users.admin_header.title.viewSite} ${site_name}" target="_blank" class="navbar-brand">
1401 <img src="#dskey{portal.site.site_property.logo_url}" class="img-responsive" title="#i18n{portal.users.admin_header.title.viewSite} ${site_name}" alt="${site_name}"><b> <#if site_name?length > 18> ${site_name?substring(0,16)}... <#else> ${site_name}</#if></b>
1402 </a>
1403 </div>
1404 <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#navbar-collapse">
1405 <i class="fa fa-bars"></i>
1406 </button>
1407 </div>
1408 <div class="collapse navbar-collapse" id="navbar-collapse">
1409 <ul id="top" class="nav navbar-nav">
1410 <#list feature_group_list as feature_group>
1411 <#if feature_group.features?size > 1>
1412 <li class="dropdown tasks-menu">
1413 <a data-toggle="dropdown" class="dropdown-toggle" id="dLabel${feature_group.id}Header" href="${admin_url}#${feature_group.id}">
1414 ${feature_group.label} <b class="caret"></b>
1415 </a>
1416 <ul class="dropdown-menu" role="menu" aria-labelledby="dLabel${feature_group.id}Header">
1417 <#list feature_group.features as feature>
1418 <li class="menu">
1419 <#if !feature.externalFeature>
1420 <a href="${feature.url}?plugin_name=${feature.pluginName}">${feature.name}</a>
1421 <#else>
1422 <a href="${feature.url}"><#if feature.iconUrl?has_content><i class="${feature.iconUrl}"></i></#if> ${feature.name}</a>
1423 </#if>
1424 </li>
1425 </#list>
1426 </ul>
1427 </li>
1428 <#else>
1429 <#list feature_group.features as feature>
1430 <li>
1431 <#if !feature.externalFeature>
1432 <a href="${feature.url}?plugin_name=${feature.pluginName}">${feature.name}</a>
1433 <#else>
1434 <a href="${feature.url}"><#if feature.iconUrl?has_content><i class="${feature.iconUrl}"></i></#if>${feature.name}</a>
1435 </#if>
1436 </li>
1437 </#list>
1438 </#if>
1439 </#list>
1440 </ul>
1441 <ul class="nav navbar-nav navbar-right user">
1442 <li class="home">
1443 <a href="${admin_url}" title="#i18n{portal.users.admin_header.homePage}"><i class="fa fa-home"></i></a>
1444 </li>
1445 <#if user.userLevel == 0>
1446 <#assign hasIcon=false />
1447 <#if listLoggersInfo?has_content>
1448 <#list listLoggersInfo?filter( logInfo -> ( logInfo.level = 'DEBUG' || logInfo.level = 'TRACE' ) ) as logInfo>
1449 <#if logInfo?size gt 0>
1450 <#if hasIcon=false >
1451 <li class="dropdown home">
1452 <a href="#" class="dropdown-toggle" data-toggle="dropdown" id="dLabelNotifHeader">
1453 <i class="fa fa-bell"></i>
1454 <span class="label label-danger">1</span>
1455 </a>
1456 <ul class="dropdown-menu logger" role="menu" aria-labelledby="dLabelNotifHeader">
1457 <li><span class="label label-danger">1</span><strong class="text-muted"> #i18n{portal.util.log.warningLevel}</strong></li>
1458 <#assign hasIcon = true />
1459 </#if>
1460 <li><strong class="text-muted">${logInfo.name!} - ${logInfo.level!}</strong><span class="text-muted">${logInfo.path!}</span></li>
1461 </#if>
1462 </#list>
1463 </#if>
1464 <#if hasIcon == true >
1465 </ul>
1466 </li>
1467 </#if>
1468 <li class="home">
1469 <a href="jsp/admin/AdminTechnicalMenu.jsp" title="#i18n{portal.admindashboard.view_dashboards.title}">
1470 <i class="fa fa-cog"></i>
1471 </a>
1472 </li>
1473 </#if>
1474 <li class="dropdown user-menu">
1475 <a href="#" class="dropdown-toggle" data-toggle="dropdown" id="dLabelUserHeader">
1476 <#if adminAvatar>
1477 <img src="servlet/plugins/adminavatar/avatar?id_user=${user.userId}" id="admin-avatar" class="user-image" alt="User's avatar">
1478 <#else>
1479 <img src="#dskey{portal.site.site_property.avatar_default}" id="admin-avatar" class="user-image" alt="User's avatar">
1480 </#if>
1481 <span id="zone4" class="hidden-sm hidden-md"> ${dashboard_zone_4}<i class="caret"></i></span>
1482 </a>
1483 <#if userMenuItems?has_content>
1484 <ul class="dropdown-menu" role="menu" aria-labelledby="dLabelUserHeader">
1485 <#list userMenuItems as item>
1486 <li class="${item.itemClass?html}">${item.content}</li>
1487 </#list>
1488 </ul>
1489 </#if>
1490 </li>
1491 <#if admin_logout_url?has_content>
1492 <li>
1493 <a href="${admin_logout_url}" title="#i18n{portal.users.admin_header.deconnectionLink}">
1494 <i class="fa fa-power-off fa-fw"></i> <span class="visible-xs">#i18n{portal.users.admin_header.deconnectionLink}</span>
1495 </a>
1496 </li>
1497 </#if>
1498 </ul>
1499 </div>
1500 </nav>
1501 </header>
1502 <#if user.userLevel == 0>
1503 <script>
1504 $( function(){
1505 const loggers = document.querySelector('.logger') ;
1506 if( loggers.childElementCount > 0 ){
1507 if( !sessionStorage.getItem('lutece-debug-modal') ){
1508 sessionStorage.setItem('lutece-debug-modal', false )
1509 }
1510 var modalContent = '<h3>#i18n{portal.util.log.warningLevel}</h3><p><strong>#i18n{portal.util.log.modalWarningMessage}</strong></p><p class="text-center"><button class="btn btn-sm btn-danger" data-toggle="collapse" data-target="#info-log" aria-expanded="false" aria-controls="info-log" type="button">#i18n{portal.util.log.modalLabelButton}</button></p><blockquote class="collapse" id="info-log">' + loggers.innerHTML + '</blockquote>';
1511 var adminModalBody = $('#adminModal .modal-body')
1512 adminModalBody.html( modalContent )
1513 var adminModalLabel = $('#adminModalLabel')
1514 var adminModalHeader = $('#adminModal .modal-header')
1515 var adminModalHeaderBtn = $('#adminModal .modal-header button')
1516 adminModalLabel.html( 'Attention configuration non conforme !' )
1517 adminModalHeader.addClass('text-white')
1518 adminModalHeaderBtn.addClass('text-white')
1519 adminModalHeader.addClass('bg-danger')
1520 adminModalBody.addClass('text-danger')
1521 if( sessionStorage.getItem('lutece-debug-modal') === 'false' ){
1522 var myAdminModal = $('#adminModal').modal()
1523 myAdminModal.on('hidden.bs.modal', function (e) {
1524 sessionStorage.setItem('lutece-debug-modal', true )
1525 })
1526 }
1527 }
1528 });
1529 </script>
1530 </#if>
1531 <!-- Wrapper -->
1532 <div id="admin-wrapper">
1533 <section class="content">
1534 <!-- Close in footer -->
1535 </#macro>
1536 <#-- MACRO adminFooter -->
1537 <#macro adminFooter >
1538 <!-- end content section -->
1539 </section>
1540 <!-- end admin-wrapper -->
1541 </div>
1542 <!-- end wrapper -->
1543 </div>
1544 <!-- footer menu -->
1545 <footer class="hidden-xs">
1546 <nav id="footer" class="navbar navbar-default" role="navigation">
1547 <div class="navbar-text footer-lutece">
1548 <a class="navbar-link" href="https://lutece.paris.fr" target="lutece" title="#i18n{portal.site.portal_footer.labelPortal}">
1549 <img src="images/poweredby.png" alt="#i18n{portal.site.portal_footer.labelMadeBy}">
1550 <small>version ${version}</small>
1551 </a>
1552 </div>
1553 </nav>
1554 </footer>
1555 <!-- Admin Modal -->
1556 <div class="modal fade" id="adminModal" tabindex="-1" role="dialog" aria-labelledby="adminModalLabel">
1557 <div class="modal-dialog" role="document">
1558 <div class="modal-content">
1559 <div class="modal-header">
1560 <button type="button" class="close" data-dismiss="modal" aria-label="#i18n{portal.site.admin_page.buttonClosed}"><span aria-hidden="true">×</span></button>
1561 <h4 class="modal-title" id="adminModalLabel"></h4>
1562 </div>
1563 <div class="modal-body"></div>
1564 <div class="modal-footer">
1565 <button type="button" class="btn btn-default" data-dismiss="modal">#i18n{portal.site.admin_page.buttonClosed}</button>
1566 </div>
1567 </div>
1568 </div>
1569 </div>
1570 <!-- Included JS Files -->
1571 <!-- Le javascript
1572 ================================================== -->
1573 <!-- Placed at the end of the document so the pages load faster -->
1574 <@coreAdminJSLinks />
1575 ${javascript_files}
1576 <script>
1577 var AdminLTEOptions = {
1578 //Bootstrap.js tooltip
1579 enableBSToppltip: false
1580 };
1581 </script>
1582 </#macro>
1583 <#-- MACRO adminHome -->
1584 <#macro adminHome >
1585 <@row>
1586 <@columns class='widget'>
1587 <section class="dashboard-widgets">
1588 <@row>
1589 <@columns sm=4 md=4 lg=4 class='widget lutece-dashboard'>
1590 <#if dashboard_zone_1?has_content>
1591 ${dashboard_zone_1}
1592 </#if>
1593 <div> </div>
1594 </@columns>
1595 <@columns sm=4 md=4 lg=4 class='widget lutece-dashboard'>
1596 <#if dashboard_zone_2?has_content>
1597 ${dashboard_zone_2}
1598 </#if>
1599 <div> </div>
1600 </@columns>
1601 <@columns sm=4 md=4 lg=4 class='widget lutece-dashboard'>
1602 <#if dashboard_zone_3?has_content>
1603 ${dashboard_zone_3}
1604 </#if>
1605 <div> </div>
1606 </@columns>
1607 </@row>
1608 </section>
1609 </@columns>
1610 </@row>
1611 </#macro>
1612 <#-- MACRO adminDashboardWidget -->
1613 <#macro adminDashboardWidget id title color='primary' url='' class='' bodyClass='table-responsive' params='' >
1614 <@box style='solid' color='${color}' id='${id}_dashboard_card'>
1615 <@boxHeader titleLevel='h5' title='${title}'>
1616 <#if url!=''><@aButton color="link" class='card-control' href='${url!}' title='${title!}' size='sm' buttonIcon='cog' hideTitle=['all'] /></#if>
1617 <@button style='card-control collapse' buttonTargetId='#${id}_dashboard_card_body' buttonIcon='minus' size='sm' />
1618 <@button style='card-control remove' buttonTargetId='#${id}_dashboard_card' buttonIcon='times' size='sm' />
1619 </@boxHeader>
1620 <@boxBody class=bodyClass id='${id}_dashboard_card_body'>
1621 <#nested>
1622 </@boxBody>
1623 </@box>
1624 </#macro>
1625 <#-- adminContentHeader -->
1626 <#macro adminContentHeader >
1627 <section class="content-header">
1628 <h1 id="feature-title">
1629 <#if feature_url?? && feature_title??>
1630 <a href="${feature_url}" title="${feature_title!''}">${feature_title!''}</a>
1631 <#else>
1632 ${feature_title!''}
1633 </#if>
1634 <#if page_title?has_content><small>${page_title}</small></#if>
1635 </h1>
1636 <@adminHeaderDocumentationLink />
1637 </section>
1638 <section class="content <#if feature_url?? && feature_url?ends_with('AdminSite.jsp')>no-padding</#if>">
1639 </#macro>
1640 <#-- adminLoginPage -->
1641 <#macro adminLoginPage title='' site_name='SITE_NAME'>
1642 <script src="js/admin/jquery/jquery-3.5.1.min.js"></script>
1643 </head>
1644 <body id="login">
1645 <section>
1646 <div class="headless-wrapper">
1647 <div class="headless-content">
1648 <div id="login-page">
1649 <img src="images/logo-header.png" id="logoLogin" title="LUTECE Back-Office" alt="LUTECE Back-Office">
1650 <div class="login-box">
1651 <div class="login-logo bg-primary">
1652 <a href="jsp/site/Portal.jsp" title="${site_name}">#i18n{portal.admin.admin_login.welcome}<br> <b>${site_name}</b></a>
1653 </div>
1654 <div class="login-box-body">
1655 <div class="login-box-header">
1656 <p class="text-center">${title}</p>
1657 </div>
1658 <#nested>
1659 </div>
1660 <p class="text-center bg-white">
1661 <@aButton href='https://lutece.paris.fr' params='target="_blank"' title='#i18n{portal.site.portal_footer.labelPortal}' hideTitle=['all'] color='link'>
1662 <img src="images/poweredby.png" height="22" alt="logo lutece" title="Lutece">
1663 </@aButton>
1664 </p>
1665 </div>
1666 </div>
1667 <script>
1668 $(function() {
1669 var randomImages = [#dskey{portal.site.site_property.back_images}];
1670 var rndNum = Math.floor(Math.random()*(randomImages.length));
1671 var bgImg = 'url(' + randomImages[rndNum] + ')';
1672 $("#login-page").css('background-image', bgImg );
1673 });
1674 </script>
1675 </#macro>
1676 <#-- adminHeaderDocumentationLink -->
1677 <#macro adminHeaderDocumentationLink >
1678 <ol class="breadcrumb ${feature_group!?lower_case}">
1679 <#if feature_documentation?has_content >
1680 <#if feature_documentation?exists>
1681 <li>
1682 <a target="_blank" href="${feature_documentation}" title="#i18n{portal.features.documentation.help}">
1683 <i class="fa fa-life-ring" ></i> #i18n{portal.features.documentation.help}
1684 </a>
1685 </li>
1686 </#if>
1687 </#if>
1688 </ol>
1689 </#macro>
1690 <#macro adminSiteColumnOutline columnid=''>
1691 <div class="admin_column_outline">
1692 <span class="admin_column_id">${i18n("portal.site.columnId",columnid)}</span>
1693 <div><#nested></div>
1694 </div>
1695 </#macro>
1696 <#-- MACRO adminSiteToolbar -->
1697 <#macro adminSiteToolbar >
1698 <@btnToolbar>
1699 <@btnGroup>
1700 <@tform type='inline' action='jsp/admin/site/AdminSite.jsp' role='search'>
1701 <@inputGroup>
1702 <@input type='number' name='page_id' id='page_id' title='${i18n("portal.site.admin_page.buttonSearchPage")}' placeHolder='22' params=' style="width:8rem;"' />
1703 <@inputGroupItem>
1704 <@button type='submit' color='primary' title='${i18n("portal.site.admin_page.buttonSearchPage")}' hideTitle=['all'] buttonIcon='search' />
1705 </@inputGroupItem>
1706 </@inputGroup>
1707 </@tform>
1708 </@btnGroup>
1709 <@btnGroup class='ms-1 ml-1'>
1710 <@aButton href='' id='display-full' title='#i18n{portal.site.admin_page.buttonLargeScreen}' buttonIcon='desktop' color='primary'hideTitle=['all'] />
1711 <@aButton href='' id='display-940' title='#i18n{portal.site.admin_page.buttonTablet}' buttonIcon='tablet' color='primary' hideTitle=['all'] />
1712 <@aButton href='' id='display-480' title='#i18n{portal.site.admin_page.buttonSmartphone}' buttonIcon='mobile' color='primary' hideTitle=['all'] />
1713 </@btnGroup>
1714 <#if page.id != 1>
1715 <@btnGroup class='ms-1 ml-1'>
1716 <@aButton href='jsp/admin/site/AdminSite.jsp?page_id=${page.parentPageId}' color='success' buttonIcon='arrow-up' title='#i18n{portal.site.admin_page.buttonUpToParentPage}' hideTitle=['all'] />
1717 <@aButton href='jsp/admin/site/RemovePage.jsp?page_id=${page.id}' color='danger btn-icon' buttonIcon='trash text-white' title='#i18n{portal.site.admin_page.buttonDeletePage}' hideTitle=['all'] />
1718 </@btnGroup>
1719 </#if>
1720 <@btnGroup class='ms-1 ml-1'>
1721 <#if portlet_types_list?has_content>
1722 <@aButton class='dropdown-toggle' id='portlet-type' dropdownMenu=true href='#' title='#i18n{portal.site.admin_page.labelPortletPage}' buttonIcon='th-large' hideTitle=['xs','sm','md']>
1723 <#list portlet_types_list?sort_by("name") as portlet_type>
1724 <@dropdownItem class='portlet-type-ref' href='jsp/admin/DoCreatePortlet.jsp?portlet_type_id=${portlet_type.id}&page_id=${page.id}' target='preview' title='${portlet_type.name}'>
1725 ${portlet_type.name}
1726 </@dropdownItem>
1727 </#list>
1728 </@aButton>
1729 </#if>
1730 <#if extendableResourceActionsHtml?? && extendableResourceActionsHtml?has_content>
1731 ${extendableResourceActionsHtml!}
1732 </#if>
1733 </@btnGroup>
1734 <@btnGroup class='ms-1 ml-1'>
1735 <@aButton href='jsp/admin/site/AdminSite.jsp?page_id=${page.id}&param_block=2' buttonIcon='wrench' title='#i18n{portal.site.admin_page.labelPageProperty}' hideTitle=['xs','sm','md'] />
1736 </@btnGroup>
1737 <@btnGroup class='ms-1 ml-1'>
1738 <@aButton href='jsp/admin/site/AdminSite.jsp?page_id=${page.id}&param_block=5' buttonIcon='plus' title='#i18n{portal.site.admin_page.labelChildPagePage}' hideTitle=['xs','sm','md'] />
1739 </@btnGroup>
1740 <@btnGroup class='ms-1 ml-1'>
1741 <@aButton href='jsp/admin/site/AdminMap.jsp?page_id=${page.id }' buttonIcon='sitemap' title='Page ${page.name} - Id ${page.id}' hideTitle=['all'] ><@span hide=['all']>#i18n{portal.site.admin_page.tabAdminMapSite}</@span></@aButton>
1742 </@btnGroup>
1743 <@btnGroup class='ms-1 ml-1'>
1744 <@aButton href='' id='fullscreen' title='#i18n{portal.site.admin_page.buttonFullscreen}' buttonIcon='arrows-alt' color='secondary' hideTitle=['all'] />
1745 </@btnGroup>
1746 </@btnToolbar>
1747 </#macro>
1748 <#-- adminMessagePage -->
1749 <#macro adminMessagePage title=''>
1750 <#local alerttype="yellow" />
1751 <#local icontype="fa-info-circle" />
1752 <#if message.type == 2 >
1753 <#local alerttype="red" />
1754 <#local icontype="fa-question-circle" />
1755 <#elseif message.type == 3 >
1756 <#local alerttype="yellow" />
1757 <#local icontype="fa-exclamation-circle" />
1758 <#elseif message.type == 4 >
1759 <#local alerttype="yellow" />
1760 <#local icontype="fa-question-circle" />
1761 <#elseif message.type == 5 >
1762 <#local alerttype="red" />
1763 <#local icontype="fa-ban" />
1764 </#if>
1765 <script src="js/admin/jquery/jquery-3.5.1.min.js"></script>
1766 </head>
1767 <body>
1768 <div class="login-box" id="message-box">
1769 <div class="login-logo bg-${alerttype}">
1770 <strong><span class="fa ${icontype}"></span> ${title!"Info"}</strong>
1771 </div>
1772 <div class="login-box-body bg-${alerttype}">
1773 <p class="lead text-center">${text}</p>
1774 <div class="footer bg-${alerttype} text-center">
1775 <#nested>
1776 </div>
1777 </div>
1778 </div>
1779 </#macro>
1780 <#-- fieldSet -->
1781 <#macro fieldSet class='' fieldsetId='' fieldsetParams='' legend='' legendClass='' legendId='' legendIcon='' legendParams='' hideLegend=[] disabled=false>
1782 <fieldset<#if class!=''> class="${class}"</#if><#if fieldsetId!=''> id="${fieldsetId}"</#if><#if fieldsetParams!=''> ${fieldsetParams}</#if><#if disabled> disabled</#if>>
1783 <#if legend!=''>
1784 <#local legendClass += ' ' + displaySettings(hideLegend,'block') />
1785 <legend<#if legendClass!=''> class="${legendClass?trim}"</#if><#if legendId!=''> id="${legendId}"</#if><#if legendParams!=''> ${legendParams}</#if>><#if legendIcon!=''><@icon style=legendIcon /> </#if>${legend}</legend>
1786 </#if>
1787 <#nested>
1788 </fieldset>
1789 </#macro>
1790 <#-- RESPONSIVE -->
1791 <#-- HTML ELEMENTS -->
1792 <#macro img url='' alt='' title='' class='' id='' params=''>
1793 <img src="${url}" alt="<#if alt!=''>${alt!}<#else>${title!}</#if>" title="${title}" class="thumbnails thumb-list<#if class!=''> ${class}</#if>"<#if id!=''> id="${id}"</#if><#if params!=''> ${params}</#if> />
1794 </#macro>
1795 <#-- Email Default Template -->
1796 <#macro emailTemplate title='Lutece' footer_link='https://lutece.paris.fr'>
1797 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
1798 <html xmlns="http://www.w3.org/1999/xhtml">
1799 <head>
1800 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
1801 <meta name="viewport" content="width=device-width"/>
1802 <style type="text/css">
1803 * { margin: 0; padding: 0; font-size: 100%; font-family: 'Avenir Next', "Helvetica Neue", "Helvetica", Helvetica, Arial, sans-serif; line-height: 1.65; }
1804 img { max-width: 100%; margin: 0 auto; display: block; }
1805 body, .body-wrap { width: 100% !important; height: 100%; background: #f8f8f8; }
1806 a { color: #007bff; text-decoration: none; }
1807 a:hover { text-decoration: underline; }
1808 .text-center { text-align: center; }
1809 .text-right { text-align: right; }
1810 .text-left { text-align: left; }
1811 .button { display: inline-block; color: white; background: #007bff; border: solid #007bff; border-width: 10px 20px 8px; font-weight: bold; border-radius: 4px; }
1812 .button:hover { text-decoration: none; }
1813 h1, h2, h3, h4, h5, h6 { margin-bottom: 20px; line-height: 1.25; }
1814 h1 { font-size: 32px; }
1815 h2 { font-size: 28px; }
1816 h3 { font-size: 24px; }
1817 h4 { font-size: 20px; }
1818 h5 { font-size: 16px; }
1819 p, ul, ol { font-size: 16px; font-weight: normal; margin-bottom: 20px; }
1820 .container { display: block !important; clear: both !important; margin: 0 auto !important; max-width: 580px !important; }
1821 .container table { width: 100% !important; border-collapse: collapse; }
1822 .container .masthead { padding: 80px 0; background: #007bff; color: white; }
1823 .container .masthead h1 { margin: 0 auto !important; max-width: 90%; text-transform: uppercase; }
1824 .container .content { background: white; padding: 30px 35px; }
1825 .container .content.footer { background: none; }
1826 .container .content.footer p { margin-bottom: 0; color: #888; text-align: center; font-size: 14px; }
1827 .container .content.footer a { color: #888; text-decoration: none; font-weight: bold; }
1828 .container .content.footer a:hover { text-decoration: underline; }
1829 </style>
1830 </head>
1831 <body>
1832 <table class="body-wrap">
1833 <tr>
1834 <td class="container">
1835 <!-- Message start -->
1836 <table>
1837 <tr>
1838 <td align="center" class="masthead">
1839 <h1>${title}</h1>
1840 </td>
1841 </tr>
1842 <tr>
1843 <td class="content">
1844 <#nested>
1845 </td>
1846 </tr>
1847 </table>
1848 </td>
1849 </tr>
1850 <tr>
1851 <td class="container">
1852 <!-- Message start -->
1853 <table>
1854 <tr>
1855 <td class="content footer" align="center">
1856 <p><a href="${footer_link}">Lutece</a></p>
1857 </td>
1858 </tr>
1859 </table>
1860 </td>
1861 </tr>
1862 </table>
1863 </body>
1864 </html>
1865 </#macro>
1866 <#macro adminLanguage languages lang action='jsp/admin/DoChangeLanguage.jsp' >
1867 <a href="javascript:return false;">
1868 <i class="fa fa-language"></i> #i18n{portal.admin.admin_home.language}
1869 </a>
1870 <@tform method='post' action=action class='form-inline'>
1871 <input type="hidden" name="token" value="${token}">
1872 <ul class="list-inline">
1873 <#list languages as language>
1874 <li>
1875 <#if lang==language.code>
1876 <#local languageButtonColor='success'>
1877 <#else>
1878 <#local languageButtonColor='default'>
1879 </#if>
1880 <@button color='${languageButtonColor}' type='submit' name='language' value='${language.code}' title='${language.name}'/>
1881 </li>
1882 </#list>
1883 </ul>
1884 </@tform>
1885 </#macro>
1886 <#macro adminAccessibilityMode>
1887 <@tform method='post' action='jsp/admin/DoModifyAccessibilityMode.jsp' class='form-inline'>
1888 <input type="hidden" name="token" value="${token}">
1889 <#if user.accessibilityMode>
1890 <@button color='link' size='md' type='submit' buttonIcon='eye' title='#i18n{portal.users.admin_header.labelDeactivateAccessibilityMode}'/>
1891 <#else>
1892 <@button color='link' size='md' type='submit' buttonIcon='eye-slash' title='#i18n{portal.users.admin_header.labelActivateAccessibilityMode}'/>
1893 </#if>
1894 </@tform>
1895 </#macro>
1896 <#macro empty title='' subtitle='' iconName='mood-empty' img='' actionTitle='' actionBtn='primary' actionIcon='plus' actionUrl='#'>
1897 <div class="empty">
1898 <#if img=''>
1899 <div class="empty-icon">
1900 <@icon prefix='ti ti-' style='${iconName}' params='style="font-size:48px"' />
1901 </div>
1902 <#else>
1903 <div class="empty-img"><img src="${img}" height="128" alt=""></div>
1904 </#if>
1905 <p class="empty-title"><#if title=''>#i18n{portal.util.message.emptyTitle}<#else>${title}</#if></p>
1906 <#if subtitle !=''>
1907 <p class="empty-subtitle text-muted">
1908 ${subtitle}
1909 </p>
1910 <#else>
1911 <p class="empty-subtitle text-muted">
1912 #i18n{portal.util.message.emptySubTitle}
1913 </p>
1914 </#if>
1915 <#if actionTitle !=''>
1916 <div class="empty-action">
1917 <a href="${actionUrl}" class="btn btn-${actionBtn}">
1918 <#if actionIcon !=''><@icon prefix='ti ti-' style='${actionIcon}' /></#if> ${actionTitle}
1919 </a>
1920 </div>
1921 </#if>
1922 </div>
1923 </#macro>
1924 <#macro timeline class='' id='' params=''>
1925 <ul class="timeline<#if class !=''> ${class}</#if>"<#if id !=''> id="${id}"</#if><#if params !=''> ${params}</#if>>
1926 <#nested>
1927 </ul>
1928 </#macro>
1929 <#macro timelineLabel bg='primary' label='' class='' id='' params=''>
1930 <li class="time-label<#if class !=''> ${class}</#if>"<#if id !=''> id="${id}"</#if><#if params !=''> ${params}</#if>>
1931 <span class="bg-${bg}"><#if label!=''>${label}<#else><#nested></#if></span>
1932 </li>
1933 </#macro>
1934 <#macro timelineItem iconFace='check' iconBg='bg-primary' time='' label='' footer='' class='' id='' params=''>
1935 <li<#if class !=''> class="${class}"</#if><#if id !=''> id="${id}"</#if><#if params !=''> ${params}</#if>>
1936 <#assign timelineIcon>${iconFace} ${iconBg}</#assign>
1937 <i class="fas fa-${timelineIcon}"></i>
1938 <div class="timeline-item clearfix">
1939 <#if time !=''><span class="time"><i class="fa fa-clock-o"></i> ${time}</span></#if>
1940 <h3 class="timeline-header">${label}</h3>
1941 <div class="timeline-body"><#nested></div>
1942 <#if footer !=''><div class="timeline-footer">${footer}</div></#if>
1943 </div>
1944 </li>
1945 </#macro>
1946 <#-- scroll to top button -->
1947 <#macro scrollTopBtn>
1948 <a href="#" id="scroll" style="display: none;"><span></span></a>
1949 <script>
1950 $( function(){
1951 $(window).scroll(function(){
1952 if ( $(this).scrollTop() > 100) {
1953 $('#scroll').fadeIn();
1954 } else {
1955 $('#scroll').fadeOut();
1956 }
1957 });
1958 $('#scroll').click(function(){
1959 $("html, body").animate({ scrollTop: 0 }, 600);
1960 return false;
1961 });
1962 });
1963 </script>
1964 </#macro>
1965 <#-- copyElementToClipboard a set of elements designed by a selector - param "selector" -->
1966 <#-- Params -->
1967 <#-- selector : Any CSS selector expression -->
1968 <#-- class : Default '' : List of class with double quote with comma separator -->
1969 <#-- Possible values : "no-hover" No icon on hover - .no-hover portal_admin.css -->
1970 <#-- Possible values : "copy-icon" Icon always shown - . see portal_admin.css -->
1971 <#-- Possible values : "copy-btn" Icon and Button styles - -->
1972 <#-- Ex for multiple classes : "class1","class2" -->
1973 <#-- showMsg : Default false : If true a message is show after copy -->
1974 <#-- msgDone : Default "Copied" : Success message -->
1975 <#-- msgError : Default "Error : not copied" : Error message -->
1976 <#-- Usage -->
1977 <#-- Basic : <@copyElementToClipboard selector='.copy-content' /> -->
1978 <#-- No message : <@copyElementToClipboard selector='.copy-content' showMsg=false /> -->
1979 <#-- No Hover : <@copyElementToClipboard selector='.copy-content' class='"no-hover"' /> -->
1980 <#-- With icon shown : <@copyElementToClipboard selector='.copy-content' class='"copy-icon"' /> -->
1981 <#macro copyElementToClipboard selector class='' showMsg=true msgDone='#i18n{portal.util.copy.done}' msgError='#i18n{portal.util.copy.error}'>
1982 <script>
1983 const elems = document.querySelectorAll('${selector!}');
1984 elems.forEach(elem => {
1985 <#if class !=''>
1986 elem.classList.add( ${class!} );
1987 </#if>
1988 elem.setAttribute('title', '#i18n{portal.util.labelCopy}');
1989 elem.addEventListener('click', () => {
1990 const selection = window.getSelection();
1991 const range = document.createRange();
1992 range.selectNodeContents(elem);
1993 selection.removeAllRanges();
1994 selection.addRange(range);
1995 try {
1996 document.execCommand('copy');
1997 selection.removeAllRanges();
1998 <#if showMsg>
1999 const original = elem.textContent;
2000 elem.textContent = '${msgDone}';
2001 elem.classList.add('msg-success');
2002 setTimeout(() => {
2003 elem.textContent = original;
2004 elem.classList.remove('msg-success');
2005 }, 1200);
2006 </#if>
2007 } catch(e) {
2008 <#if showMsg>
2009 const original = elem.textContent;
2010 elem.textContent = '${msgError}';
2011 elem.classList.add('msg-error');
2012 setTimeout(() => {
2013 elem.textContent = original;
2014 elem.classList.remove('msg-danger');
2015 }, 1200);
2016 </#if>
2017 }
2018 });
2019 });
2020 </script>
2021 </#macro>
2022 <#-- initToast -->
2023 <#-- Params -->
2024 <#-- layout='popups' -->
2025 <#-- position='top-right' -->
2026 <#-- closer=false -->
2027 <#-- sticky=false -->
2028 <#-- progressbar=true -->
2029 <#-- theme='default' -->
2030 <#-- duration=3000 -->
2031 <#-- pool=5 -->
2032 <#macro initToast layout='popups' position='top-right' closer=true sticky=false progressbar=true insert='before' theme='default' duration=3000 pool=5 >
2033 <script>
2034 $( function(){
2035 var lutecepolipop = new Polipop('lutecepop', {
2036 layout: '${layout}',
2037 position: '${position}',
2038 theme: '${theme}',
2039 life: ${duration?c},
2040 insert: '${insert}',
2041 closer: ${closer?c},
2042 closeText : '#i18n{portal.util.labelClose}',
2043 sticky: ${sticky?c},
2044 progressbar: ${progressbar?c},
2045 pool: ${pool},
2046 });
2047 <#-- Add addToast macro in your template -->
2048 <#nested>
2049 });
2050 </script>
2051 </#macro>
2052 <#-- addToast -->
2053 <#-- Params -->
2054 <#-- title : Default "Error : not copied" : Error message -->
2055 <#-- msg : Default "Copied" : Success message -->
2056 <#-- type : Default "default" ['info', 'danger', 'success' 'warning'] -->
2057 <#macro addToast title content type='default' >
2058 lutecepolipop.add({
2059 content: '${content}',
2060 title: '${title}',
2061 type: '${type}',
2062 });
2063 </#macro>
2064 <#-- selectIconFont -->
2065 <#-- Params -->
2066 <#-- id : Default "selectIcon" : Id for select -->
2067 <#-- class : Default '' : List of class for select -->
2068 <#-- name : Default "resource-icon" : Name for submit -->
2069 <#-- showListLabel : Default true : Show icons' label -->
2070 <#-- showListIcon : Default true : Show icons' icon -->
2071 <#-- searchShow : Default true : Show search field in select -->
2072 <#-- searchFocus : Default false : It true set focus in search fiedl -->
2073 <#-- searchHighlight : Default true : Highlight searched chars in list -->
2074 <#-- type : Default 'yaml' : Possible values : ['yaml','json'] -->
2075 <#-- prefix : Default 'fa' : ['fa','bi-', [ti ti-],...] Prefix for icon family -->
2076 <#-- iconsUrl : Default 'css/admin/font-awesome-icons.yml' : File url to retrieve icon name list -->
2077 <#-- resources : Default true : If true load slimselect js lib and css. -->
2078 <#-- Only needed once, so set to false if you user this macro more than once -->
2079 <#-- FontAwesome icons yaml dowloaded from https://raw.githubusercontent.com/FortAwesome/Font-Awesome/master/metadata/icons.yml -->
2080 <#macro selectIconFont id='selectIcon' class='' name='resource-icon' showListLabel=true showListIcon=true searchShow=true searchFocus=false searchHighlight=true type='yaml' prefix='fa-' iconsUrl='css/admin/font-awesome-icons.yml' resources=true defaultValue=''>
2081 <@select name='${name}' id='${id}' />
2082 <#if resources>
2083 <link rel="stylesheet" href="js/admin/lib/slimselect/slimselect.min.css">
2084 <script src="js/admin/lib/slimselect/slimselect.min.js"></script>
2085 <#if type='yaml'>
2086 <!-- js yaml parser -->
2087 <script src="js/admin/lib/slimselect/js-yaml.min.js"></script>
2088 </#if>
2089 </#if>
2090 <script>
2091 $.get('${iconsUrl}', function(data) {
2092 <#if type='yaml'>
2093 let parsedIcons = jsyaml.load(data)
2094 <#else>
2095 <#-- Json / Object -->
2096 let parsedIcons='';
2097 if( typeof data === 'object' ){
2098 parsedIcons = data;
2099 } else {
2100 parsedIcons = JSON.parse( data )
2101 }
2102 </#if>
2103 $.each( parsedIcons, function(index, icon){
2104 let i=0, prefix='${prefix}';
2105 let selected = '${defaultValue}' == index ? 'selected' : '';
2106 <#if type='yaml'>
2107 <#-- FontAwesome specific / Other lib add another test/treatment -->
2108 while( i < icon.styles.length ){
2109 switch ( icon.styles[i] ) {
2110 case 'regular':
2111 prefix = 'far'
2112 break;
2113 case 'solid':
2114 prefix = 'fas'
2115 break;
2116 case 'light':
2117 prefix = 'fal'
2118 break;
2119 case 'brands':
2120 prefix = 'fab'
2121 break;
2122 }
2123 $('#${id}').append('<option value="' + index + '"' + selected + '> <#if showListIcon><span class="' + prefix + ' fa-'+ index + ' mr-1" ' + selected + ' ></span> </#if>' <#if showListLabel>+ icon.label + ' [' + icon.styles[i] + ']'</#if>+ '</option>');
2124 i++;
2125 }
2126 <#else>
2127 <#-- Json / Object -->
2128 $('#${id}').append('<option value="' + index + '" ' + selected + ' > <#if showListIcon><span class="' + prefix + ' fa-'+ index + '"></span> </#if>' <#if showListLabel>+ index </#if>+ '</option>');
2129 </#if>
2130 });
2131 new SlimSelect({
2132 select: '#${id}',
2133 showSearch: ${searchShow?c},
2134 searchText: "#i18n{portal.util.labelNoItem}",
2135 searchPlaceholder: '#i18n{portal.util.labelSearch}',
2136 searchFocus: ${searchFocus?c}, // Whether or not to focus on the search input field
2137 searchHighlight: ${searchHighlight?c}
2138 })
2139 });
2140 </script>
2141 </#macro>
2142 <#-- Display wrong or deprecated macro arguments -->
2143 <#macro deprecatedWarning args=[] >
2144 <#if args?size != 0 ><!-- Warning : wrong or deprecated argument(s) : <#list args?keys as key >${key}, </#list> ... --></#if>
2145 </#macro>
2146 <#macro adminDashboardPanel title='' parentId='' childId='' icon='' color=''>
2147 <#assign parentId = parentId />
2148 <@accordionPanel color=color collapsed=true childId=childId>
2149 <@accordionHeader id=id title=title headerIcon=icon></@accordionHeader>
2150 <@accordionBody>
2151 <#nested>
2152 </@accordionBody>
2153 </@accordionPanel>
2154 </#macro>
2155 <#-- JStree Macro -->
2156 <#macro jsTreeInit id='tree' btntreeSearch='treesearch' multiple=false plugins=[] style='proton/style.min.css'>
2157 <link rel="stylesheet" href="js/admin/lib/jstree/themes/proton/style.min.css" >
2158 <script src="js/admin/lib/jstree/jstree.min.js"></script>
2159 <script>
2160 $(function(){
2161 let selectedTree=jsTreeId=localStorage.getItem('jsTreeSelectedId' );
2162
2163 $('#tree').jstree({
2164 'core': {
2165 'multiple' : false,
2166 'themes': {
2167 'name': 'proton',
2168 'responsive': true
2169 }
2170 },
2171 'plugins' : [ 'search' , 'wholerow' ,'changed' ]
2172 }).on('click', function( e ){
2173 window.location.replace( e.target.getAttributeNode('href').value );
2174 }).on("changed.jstree", function (e, data) {
2175 localStorage.setItem( 'jsTreeSelectedId', data.changed.selected );
2176 });
2177
2178 $('#tree').jstree( 'select_node', jsTreeId );
2179
2180 var to = false;
2181 $('#treesearch').keyup(function () {
2182 if(to) { clearTimeout(to); }
2183 to = setTimeout(function () {
2184 var v = $('#treesearch').val();
2185 $('#tree').jstree(true).search(v);
2186 }, 250);
2187 });
2188
2189 });
2190 </script>
2191 </#macro>
2192 <#macro jsTreeSearch >
2193 <@formGroup formStyle='inline' labelKey='#i18n{portal.site.admin_page.buttonSearchPage}' hideLabel=['all']>
2194 <@inputGroup size='sm'>
2195 <@input type='text' id='tree_search' name='tree_search' placeHolder='#i18n{portal.site.admin_page.buttonSearchPage}' />
2196 <@inputGroupItem>
2197 <@button id='btn-tree_search' color='link' type='button' title='#i18n{portal.site.admin_page.buttonSearchPage}' buttonIcon='search' hideTitle=['all'] />
2198 </@inputGroupItem>
2199 </@inputGroup>
2200 </@formGroup>
2201 </#macro>
2202 <#-- Display wrong or deprecated macro arguments -->
2203 <#macro deprecatedWarning args=[] >
2204 <#if args?size != 0 ><!-- Warning : wrong or deprecated argument(s) : <#list args?keys as key >${key}, </#list> ... --></#if>
2205 </#macro>
2206 <#macro codeHighLight >
2207 <link rel="stylesheet" href="js/admin/lib/prism/prism.css">
2208 <link rel="stylesheet" href="js/admin/lib/prism/prism-live.css">
2209 <script src="js/admin/lib/prism/prism.js"></script>
2210 <script src="js/admin/lib/prism/prism-live.js"></script>
2211 </#macro>