commons_site.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 <#macro comboSiteWithParams name default_value additionalParameters items >
7 <select id="${name}" name="${name}" ${additionalParameters} >
8 <#list items as item>
9 <#if default_value="${item.code}">
10 <option selected="selected" value="${item.code}" >${item.name}</option>
11 <#else>
12 <option value="${item.code}" >${item.name}</option>
13 </#if>
14 </#list>
15 </select>
16 </#macro>
17 <#macro comboSiteSortedWithParams name default_value additionalParameters items >
18 <select id="${name}" name="${name}" ${additionalParameters} >
19 <#list items?sort_by("name") as item>
20 <#if default_value="${item.code}">
21 <option selected="selected" value="${item.code}" >${item.name}</option>
22 <#else>
23 <option value="${item.code}" >${item.name}</option>
24 </#if>
25 </#list>
26 </select>
27 </#macro>
28 <#macro comboSiteWithParamsAndLength name default_value additionalParameters items max_length >
29 <select id="${name}" name="${name}" ${additionalParameters} >
30 <#list items as item>
31 <#if max_length < item.name?length >
32 <#assign item_new = "..." + "${item.name?substring(item.name?length-max_length+3)}" >
33 <#else>
34 <#assign item_new = "${item.name}">
35 </#if>
36 <#if default_value="${item.code}">
37 <option selected="selected" value="${item.code}" >${item_new}</option>
38 <#else>
39 <option value="${item.code}" >${item_new}</option>
40 </#if>
41 </#list>
42 </select>
43 </#macro>
44 <#macro comboSite name default_value items >
45 <@comboSiteWithParams name="${name}" default_value="${default_value}" additionalParameters="" items=items />
46 </#macro>
47 <#macro comboSiteSorted name default_value items >
48 <@comboSite name="${name}" default_value="${default_value}" items=items?sort_by("name") />
49 </#macro>
50 <#macro sortSite jsp_url attribute id="" >
51 <#if jsp_url?contains("?")>
52 <#assign sort_url = jsp_url + "&sorted_attribute_name=" + attribute + "&asc_sort=" />
53 <#else>
54 <#assign sort_url = jsp_url + "?sorted_attribute_name=" + attribute + "&asc_sort=" />
55 </#if>
56 <a id="sort${id!}_${attribute!}" href="${sort_url}true#sort${id!}_${attribute!}" title="#i18n{portal.util.sort.asc}" >
57 <i class="icon-chevron-up"> </i>
58 </a>
59 <a href="${sort_url}false#sort${id!}_${attribute!}" title="#i18n{portal.util.sort.desc}">
60 <i class="icon-chevron-down"> </i>
61 </a>
62 </#macro>
63 <#macro paginationSite paginator combo=0 form=1 nb_items_per_page=nb_items_per_page showcount=0>
64 <#if (paginator.pagesCount > 1) >
65 <@paginationSitePageLinks paginator=paginator />
66 </#if>
67 <#if form == 1 >
68 <form method="post" action="">
69 </#if>
70 <div class="row-fluid">
71 <div class="pull-right" >
72 <div class="form-inline">
73 <@paginationSiteItemCount paginator=paginator combo=combo nb_items_per_page=nb_items_per_page showcount=showcount />
74 </div>
75 </div>
76 </div>
77 <#if form == 1 >
78 </form>
79 </#if>
80 <div class="table"></div>
81 </#macro>
82 <#macro paginationSitePageLinks paginator >
83 <#assign nbLinkPagesToDisplay = 10 />
84 <#assign offsetPrev = nbLinkPagesToDisplay / 2 />
85 <#assign offsetNext = nbLinkPagesToDisplay / 2 />
86 <#if ( paginator.pageCurrent <= nbLinkPagesToDisplay - offsetPrev )>
87 <#assign offsetPrev = paginator.pageCurrent - 1 />
88 <#assign offsetNext = nbLinkPagesToDisplay - offsetPrev />
89 <#elseif ( paginator.pageCurrent + offsetNext > paginator.pagesCount )>
90 <#assign offsetNext = paginator.pagesCount - paginator.pageCurrent />
91 <#assign offsetPrev = nbLinkPagesToDisplay - offsetNext />
92 </#if>
93 <ul class="pagination pagination-sm">
94 <#if ( paginator.pageCurrent - offsetPrev > 1 )>
95 <li>
96 <a href="${paginator.firstPageLink?xhtml}">
97 ${paginator.labelFirst}
98 </a>
99 </li>
100 </#if>
101 <#if (paginator.pageCurrent > 1) >
102 <li class="previous">
103 <a href="${paginator.previousPageLink?xhtml}">
104 ${paginator.labelPrevious}
105 </a>
106 </li>
107 <#else>
108 <li class="disabled">
109 <a href="${paginator.firstPageLink?xhtml}">${paginator.labelPrevious}</a>
110 </li>
111 </#if>
112 <#if ( paginator.pageCurrent - offsetPrev > 1 )>
113 <li>
114 <a href="${(paginator.pagesLinks?first).url?xhtml}"><strong>...</strong></a>
115 </li>
116 </#if>
117 <#list paginator.pagesLinks as link>
118 <#if ( link.index == paginator.pageCurrent )>
119 <li class="active">
120 <a href="${link.url?xhtml}">${link.name}</a>
121 </li>
122 <#else>
123 <li>
124 <a href="${link.url?xhtml}">${link.name}</a>
125 </li>
126 </#if>
127 </#list>
128 <#if ( paginator.pageCurrent + offsetNext < paginator.pagesCount )>
129 <li>
130 <a href="${(paginator.pagesLinks?last).url?xhtml}"><strong>...</strong></a>
131 </li>
132 </#if>
133 <#if (paginator.pageCurrent < paginator.pagesCount) >
134 <li class="next">
135 <a href="${paginator.nextPageLink?xhtml}">
136 ${paginator.labelNext}
137 </a>
138 </li>
139 <#if ( paginator.pageCurrent + offsetNext < paginator.pagesCount )>
140 <li class="next">
141 <a href="${paginator.lastPageLink?xhtml}">
142 ${paginator.labelLast}
143 </a>
144 </li>
145 </#if>
146 <#else>
147 <li class="disabled">
148 <a href="${paginator.lastPageLink?xhtml}">${paginator.labelNext}</a>
149 </li>
150 </#if>
151 </ul>
152 </#macro>
153 <#macro paginationSiteCombo paginator nb_items_per_page=nb_items_per_page>
154 <span class="add-on">${paginator.labelItemCountPerPage}</span>
155 <select class="input-mini" name="${paginator.itemsPerPageParameterName}" id="${paginator.itemsPerPageParameterName}" title="${paginator.labelItemCountPerPage}">
156 <#list [ "10" , "20" , "50" , "100" ] as nb>
157 <#if nb_items_per_page = nb >
158 <option selected="selected" value="${nb}">${nb}</option>
159 <#else>
160 <option value="${nb}">${nb}</option>
161 </#if>
162 </#list>
163 </select>
164 <button class="btn btn-small" type="submit" title="#i18n{portal.util.labelRefresh}"/>
165 <i class="icon-repeat"></i>
166 </button>
167 -
168 </#macro>
169 <#macro paginationSiteItemCount paginator combo=0 nb_items_per_page=nb_items_per_page showcount=0>
170 <#-- Display combo -->
171 <#if combo == 1 >
172 <@paginationSiteCombo paginator=paginator nb_items_per_page=nb_items_per_page/>
173 </#if>
174 <#if showcount == 1 >
175 <#-- Display item count -->
176 <#if (paginator.labelItemCount)?? && paginator.labelItemCount?has_content>${paginator.labelItemCount} : </#if>${paginator.itemsCount}
177 </#if>
178 </#macro>
179 <#macro item_navigationSite item_navigator>
180 <div id="item-navigator">
181 <#if (item_navigator.currentItemId > 0)>
182 <a href="${item_navigator.previousPageLink?xhtml}" title="#i18n{portal.util.labelPrevious}">
183 <i class="icon-circle-arrow-left"></i>
184 #i18n{portal.util.labelPrevious}
185 </a>
186 <#else>
187
188 </#if>
189 <#if (item_navigator.currentItemId < item_navigator.listItemSize - 1) >
190 <a href="${item_navigator.nextPageLink?xhtml}" title="#i18n{portal.util.labelNext}">
191 #i18n{portal.util.labelNext}
192 <i class="icon-circle-arrow-right"></i>
193 </a>
194 <#else>
195
196 </#if>
197 </div>
198 </#macro>
199 <#macro dataTableSite dataTableManager actionMacro="" tableClass="table table-striped table-condensed" caption=" " summary="data table" >
200 <#if 0 < dataTableManager.items?size >
201 <#if dataTableManager.enablePaginator>
202 <form class="form-inline" method="post" action="${dataTableManager.sortUrl}">
203 <#if (dataTableManager.paginator.pagesCount > 1) >
204 <@paginationSitePageLinks paginator=dataTableManager.paginator />
205 </#if>
206 <div class="pull-right">
207 <@paginationSiteItemCount paginator=dataTableManager.paginator combo=1 nb_items_per_page=dataTableManager.paginator.itemsPerPage?string/>
208 </div>
209 </form>
210 </#if>
211 <table class="${tableClass}" summary="${summary}">
212 <caption>${caption}</caption>
213 <tr>
214 <#list dataTableManager.listColumn as column>
215 <th scope="col">
216 #i18n{${column.titleKey}}
217 <#if !(column.typeColumn = "ACTION") && column.sortable>
218 <@sortSite jsp_url=dataTableManager.sortUrl attribute=column.parameterName />
219 </#if>
220 </th>
221 </#list>
222 </tr>
223 <#list dataTableManager.items as item>
224 <tr>
225 <#list dataTableManager.listColumn as column>
226 <#if column.typeColumn = "STRING">
227 <#assign propName = "item." + column.parameterName>
228 <#assign value = propName?eval>
229 <td>${value!}</td>
230 <#elseif column.typeColumn = "LABEL">
231 <#assign propName = "item." + column.parameterName>
232 <#assign value = propName?eval>
233 <td>#i18n{${value!}}</td>
234 <#elseif column.typeColumn = "BOOLEAN">
235 <#assign propName = "item." + column.parameterName>
236 <#assign value = propName?eval>
237 <#if value?? && value>
238 <td><span class="label label-success" title="#i18n{${column.labelTrue!}}"><i class="icon-ok-sign icon-white"></i>#i18n{${column.labelTrue!}}</span></td>
239 <#else>
240 <td><span class="label label-important" title="#i18n{${column.labelFalse!}}"><i class="icon-remove-sign icon-white"></i>#i18n{${column.labelFalse!}}</span></td>
241 </#if>
242 <#elseif column.typeColumn = "EMAIL">
243 <#assign propName = "item." + column.parameterName>
244 <#assign value = propName?eval>
245 <td><#if value?? && value != ""><a href="mailto:${value}" title="${value}" >${value}</a></#if></td>
246 <#elseif column.typeColumn = "ACTION">
247 <#if column.parameterName?? && column.parameterName != "">
248 <#assign macroName = column.parameterName>
249 <#elseif actionMacro?? && actionMacro != "">
250 <#assign macroName = actionMacro>
251 </#if>
252 <#if macroName?? && macroName != "">
253 <td><@.vars[macroName] item=item /></td>
254 </#if>
255 </#if>
256 </#list>
257 </tr>
258 </#list>
259 </table>
260 <#if dataTableManager.enablePaginator>
261 <form class="form-inline" method="post" action="${dataTableManager.sortUrl}">
262 <#if (dataTableManager.paginator.pagesCount > 1) >
263 <@paginationSitePageLinks paginator=dataTableManager.paginator />
264 </#if>
265 <div class="pull-right">
266 <@paginationSiteItemCount paginator=dataTableManager.paginator combo=0 nb_items_per_page=dataTableManager.paginator.itemsPerPage?string/>
267 </div>
268 </form>
269 </#if>
270 <#else>
271 #i18n{portal.util.labelNoItem}
272 </#if>
273 </#macro>
274 <#macro filterPanelSite dataTableManager formClass="form-horizontal" >
275 <#if dataTableManager.filterPanel.listFilter?? && 0 < dataTableManager.filterPanel.listFilter?size>
276 <form class="${formClass}" method="post" action="${dataTableManager.filterPanel.formUrl}" >
277 <fieldset>
278 <#list dataTableManager.filterPanel.listFilter as filter>
279 <div class="control-group">
280 <label class="control-label" for="description" >#i18n{${filter.filterLabel}} :</label>
281 <div class="controls">
282 <#if filter.filterType = "STRING">
283 <input type="text" name="${dataTableManager.filterPanelPrefix}${filter.parameterName}" id="${filter.parameterName}" size="30" value="${filter.value!}"/>
284 <#elseif filter.filterType = "BOOLEAN">
285 <input type="checkbox" value="true" name="${dataTableManager.filterPanelPrefix}${filter.parameterName}" id="${dataTableManager.filterPanelPrefix}${filter.parameterName}" <#if filter.value?? && filter.value = "true">checked="checked" </#if>/>
286 <#elseif filter.filterType = "DROPDOWNLIST">
287 <#if filter.value??>
288 <#assign filter_value = filter.value >
289 <#else>
290 <#assign filter_value = "" >
291 </#if>
292 <@comboSite name=dataTableManager.filterPanelPrefix+filter.parameterName default_value=filter_value items=filter.refList />
293 </#if>
294 </div>
295 </div>
296 </#list>
297 <div class="form-actions">
298 <input type="hidden" name="${dataTableManager.filterPanelPrefix}updateFilters" id="${dataTableManager.filterPanelPrefix}updateFilters" value="true" />
299 <button class="btn btn-primary btn-small" type="submit" >
300 <i class="icon-search icon-white"></i>
301 <span class="hidden-phone" >#i18n{portal.util.labelSearch}</span>
302 </button>
303 <#if dataTableManager.filterPanel.formUrl?contains("?")>
304 <#assign dataTableResetUrl = dataTableManager.filterPanel.formUrl + "&" + dataTableManager.filterPanelPrefix + "resetFilters=true" />
305 <#else>
306 <#assign dataTableResetUrl = dataTableManager.filterPanel.formUrl + "?" + dataTableManager.filterPanelPrefix + "resetFilters=true" />
307 </#if>
308 <a class="btn btn-primary btn-small" href="${dataTableResetUrl}" title="#i18n{portal.util.labelReset}">
309 <i class="icon-remove-circle icon-white"></i>
310 <span class="hidden-phone" >#i18n{portal.util.labelReset}</span>
311 </a>
312 </div>
313 </fieldset>
314 </form>
315 </#if>
316 </#macro>
317 <#macro fieldInputTextSite i18nLabelKey inputName mandatory=false value="" maxlength=0 i18nHelpBlockKey='' cssClass=''>
318 <div class="control-group">
319 <label class="control-label" for="${inputName}">#i18n{${i18nLabelKey}} <#if mandatory>*</#if> :</label>
320 <div class="controls">
321 <input class="${cssClass}" id="${inputName}" name="${inputName}" type="text" value="${value}" <#if maxlength > 0>maxlength=${maxlength}</#if> />
322 <#if i18nHelpBlockKey != ''><span class="help-block">#i18n{${i18nHelpBlockKey}}</span></#if>
323 </div>
324 </div>
325 </#macro>
326 <#macro fieldInputCalendarSite i18nLabelKey inputName mandatory=false value="" i18nHelpBlockKey='' cssClass='' language='fr'>
327 <div class="control-group">
328 <label class="control-label" for="${inputName}">#i18n{${i18nLabelKey}} <#if mandatory>*</#if> :</label>
329 <div class="controls">
330 <div class="input-prepend">
331 <span class="add-on"><i class="icon-calendar"> </i></span>
332 <input class="${cssClass}" id="${inputName}" name="${inputName}" type="text" value="${value}" />
333 </div>
334 <#if i18nHelpBlockKey != ''><span class="help-block">#i18n{${i18nHelpBlockKey}}</span></#if>
335 </div>
336 </div>
337 <@getDatePicker idField=inputName language=language />
338 </#macro>
339 <#macro fieldInputCheckBoxSite i18nLabelKey inputName value="" checked=false i18nHelpBlockKey='' cssClass='' >
340 <div class="control-group">
341 <label class="control-label" for="${inputName}">#i18n{${i18nLabelKey}} :</label>
342 <div class="controls">
343 <input class="${cssClass}" id="${inputName}" name="${inputName}" type="checkbox" value="${value}" <#if checked>checked="checked"</#if> />
344 <#if i18nHelpBlockKey != ''><span class="help-block">#i18n{${i18nHelpBlockKey}}</span></#if>
345 </div>
346 </div>
347 </#macro>
348 <#macro fieldInputComboSite i18nLabelKey inputName items value="" mandatory=false i18nHelpBlockKey='' cssClass='' >
349 <div class="control-group">
350 <label class="control-label" for="${inputName}">#i18n{${i18nLabelKey}} <#if mandatory>* </#if>:</label>
351 <div class="controls">
352 <#assign params = "class='" + cssClass + "'" >
353 <@comboWithParams name=inputName items=items default_value=value additionalParameters=params />
354 <#if i18nHelpBlockKey != ''><span class="help-block">#i18n{${i18nHelpBlockKey}}</span></#if>
355 </div>
356 </div>
357 </#macro>
358 <#macro fieldTextAreaSite i18nLabelKey inputName mandatory=false value="" maxlength=0 i18nHelpBlockKey='' cssClass=''>
359 <div class="control-group">
360 <label class="control-label" for="${inputName}">#i18n{${i18nLabelKey}} <#if mandatory>*</#if> :</label>
361 <div class="controls">
362 <textarea class="${cssClass}" id="${inputName}" name="${inputName}" <#if maxlength > 0>maxlength=255</#if> >${value}</textarea>
363 <#if i18nHelpBlockKey != ''><span class="help-block">#i18n{${i18nHelpBlockKey}}</span></#if>
364 </div>
365 </div>
366 </#macro>
367 <#macro autocompleteFO id name suggestionsUrl suggestionsPath="" itemValueFieldName="value" btnColor="light" btnSize="" itemLabelFieldNames="[]" itemTitleFieldNames=itemLabelFieldNames itemDescriptionFieldNames="[]" itemTagsFieldNames="[]" copyFields="[]" currentValue="" currentLabel="" required=false minimumInputLength=1 minimumInputLenghtLabel="#i18n{portal.util.labelMinimumSearchLenght}" searchLabel="#i18n{portal.util.labelSearch}" placeHolder="#i18n{portal.util.labelSearch}" emptyLabel="#i18n{portal.util.labelNoItem}" additionnalRequestParamInputId="" >
368 <div id="${id}" class="lutece-autocomplete dropdown form-group form-floating " data-itemTitleFieldNames=${itemTitleFieldNames} data-suggestionsUrl="${suggestionsUrl}" data-suggestionsPath="${suggestionsPath}" data-itemValueFieldName=${itemValueFieldName} data-minimumInputLength=${minimumInputLength} data-itemDescriptionFieldNames=${itemDescriptionFieldNames} data-itemTagsFieldNames=${itemTagsFieldNames} data-copyFields=${copyFields} data-emptyLabel="${emptyLabel}" data-currentValue="${currentValue}" data-currentLabel="${currentLabel}" data-suggestionItemClass='["list-group-item", "p-3"]' data-titleClass='["mb-0", "fw-bolder"]' data-descriptionClass='["text-muted", "mb-0"]' data-tagClass='["badge", "bg-blue-lt", "me-1"]' data-loaderIconClasses='{"loading": ["ti-loader-2", "icon-rotate"], "error": ["ti-zoom-exclamation", "text-danger"], "search": ["ti-search"]}' data-emptyClass='["list-group-item", "p-3", "text-muted", "text-center"]' data-searchLabel="${searchLabel}">
369 <div class="form-group">
370 <label for="${id}-input">${searchLabel}</label>
371 <div class="input-group">
372 <input class="form-control lutece-autocomplete-search-input w-75" type="text" name="${name}" placeholder="${placeHolder}" role="combobox" autocomplete="off" value="<#if currentValue!=''>${currentValue!}</#if>" id="${id}-input" aria-expanded="false" aria-owns="${id}-list-container" aria-autocomplete="list" aria-describedby="${id}-lutece-autocomplete-default-assistive">
373 <span role="button" class="input-group-text lutece-autocomplete-remove <#if currentValue=''>d-none</#if> text-danger">
374 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M18 6l-12 12" /><path d="M6 6l12 12" /></svg>
375 </span>
376 <span role="button" class="input-group-text lutece-autocomplete-search-icon">
377 <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"/><path d="M10 10m-7 0a7 7 0 1 0 14 0a7 7 0 1 0 -14 0" /><path d="M21 21l-6 -6" /></svg>
378 </span>
379 </div>
380 <div id="${id}-dropdown" class="lutece-autocomplete-dropdown dropdown-menu p-0" aria-labelledby="dropdownMenuButton">
381 <ul id="${id}-list-container" class="lutece-autocomplete-result-container list-group list-group-flush overflow-auto bg-white" role="listbox" id="suggestions-list" aria-labelledby="${id}-input" style="max-height:15rem;"></ul>
382 <span id="${id}-lutece-autocomplete-default-assistive" class="sr-only visually-hidden">#i18n{portal.util.message.autocomplete.avalailbleResults}</span>
383 <div class="sr-only lutece-autocomplete-status" role="status" aria-atomic="true" aria-live="polite"></div>
384 </div>
385 </div>
386 </div>
387 <script type="module">
388 import LuteceAutoComplete from "./themes/shared/modules/luteceAutoComplete.js";
389 new LuteceAutoComplete(document.getElementById(`${id}`), document.getElementById(`${additionnalRequestParamInputId}`));
390 </script>
391 </#macro>
392 <#-- Macro: deprecatedWarningSite
393 Description: Generates a warning message for deprecated or incorrect arguments.
394 Parameters:
395 - args (map, optional): a map of arguments and their values.
396 -->
397 <#macro deprecatedWarningSite args=[] >
398 <#if args?size != 0 ><!-- Warning : wrong or deprecated argument(s) : <#list args?keys as key >${key}, </#list> ... --></#if>
399 </#macro>