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