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 + "&amp;sorted_attribute_name=" + attribute + "&amp;asc_sort=" />
 53   	<#else>
 54   		<#assign sort_url = jsp_url + "?sorted_attribute_name=" + attribute + "&amp;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">&nbsp;</i>
 58   	</a>
 59   	<a href="${sort_url}false#sort${id!}_${attribute!}" title="#i18n{portal.util.sort.desc}">
 60       	<i class="icon-chevron-down">&nbsp;</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   	&nbsp;-&nbsp;
 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   			&nbsp;&nbsp;
 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   			&nbsp;&nbsp;
 196   		</#if>
 197   	</div>
 198   </#macro>
 199   <#macro dataTableSite dataTableManager actionMacro="" tableClass="table table-striped table-condensed" caption="&nbsp;" 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 &gt; 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">&nbsp;</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 &gt; 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>