ilscipio/scipio-erp

View on GitHub
themes/bulma/includes/themeTemplate.ftl

Summary

Maintainability
Test Coverage
<#--
* 
* A set of HTML templating macros, part of standard Scipio Freemarker API.
* Automatically included at all times.
* Intended to be swappable.
*
* Overrides the default SCIPIO styles located in 
* htmlTemplate.ftl - ofbiz_foundation/framework/common/webcommon/scipio/lib/standard/
* 
-->

<#-- Master include: Includes the default macros and allows overrides -->
<#include "component://common/webcommon/includes/scipio/lib/standard/htmlTemplate.ftl">

<#-- 
*************
* MACRO OVERRIDES
************
See component://common/webcommon/includes/scipio/lib/standard/htmlTemplate.ftl for documentation about
the macro interfaces used in the standard macros and these overrides.
 -->

<#-- @modal step markup - theme override -->
<#macro step_markup class="" icon="" completed=false disabled=false active=false href="" origArgs={} passArgs={} catchArgs...>
    <#local class = addClassArg(class, styles.nav_step!)>
    <#if active>
        <#local class = addClassArg(class, styles.nav_step_active!)>
    </#if>
    <#if disabled>
        <#local class = addClassArg(class, styles.nav_step_disabled!)>
    </#if>
    <li<@compiledClassAttribStr class=class />>
        <#local showLink = href?has_content && !disabled><#-- allow link to active for clean page refresh: && !active -->
        <#if showLink>
            <a href="${escapeFullUrl(href, 'html')}" class="steps-marker">
        <#else>
            <span class="steps-marker">
        </#if>
        <#if icon?has_content><i class="<#if completed>${styles.nav_step_completed!} ${styles.nav_step_icon_completed!}<#else>${escapeVal(icon, 'html')}</#if>"></i></#if>
        <#if showLink>
            </a>
        <#else>
            </span>
        </#if>
        <div class="steps-content">
            <#if showLink>
                <a href="${escapeFullUrl(href, 'html')}">
            </#if>
            <#nested>
            <#if showLink>
                </a>
            </#if>
        </div>
    </li>
</#macro>

<#macro alert_markup type="info" class="" typeClass="" id="" style="" closable=true containerId=""
containerClass="" containerStyle="" origArgs={} passArgs={} catchArgs...>
    <#local containerClass = addClassArg(containerClass,'container') />
    <div<@compiledClassAttribStr class=containerClass /><#if containerId?has_content> id="${escapeVal(containerId, 'html')}"</#if><#if containerStyle?has_content> style="${escapeVal(containerStyle, 'html')}"</#if>>
        <div data-alert class="${styles.alert_wrap!} ${styles[raw(typeClass)]!}">
            <#if closable><button class="delete"></button></#if><#t/>
            <div<@compiledClassAttribStr class=class /><#if id?has_content> id="${escapeVal(id, 'html')}"</#if><#if style?has_content> style="${escapeVal(style, 'html')}"</#if>><#rt/>
                <#-- DEV NOTE: Watch out not to create extra whitespace before nested but ensure there is one after the closable icon -->

                <#nested><#t/>
            </div><#lt/>

        </div>
    </div>
</#macro>

<#-- @modal main markup - theme override -->
<#macro modal_markup id="" modalId="" linkId="" label="" href="" class="" icon="" title="" footer="" linkClass="" origArgs={} passArgs={} catchArgs...>
    <#local class = addClassArg(class, "modal-card")>
    <#if !title?has_content && origArgs?has_content><#local title=origArgs.title!"" /></#if>
    <#local linkClass = addClassArg(linkClass, "js-modal-trigger")>
    <a data-href="${escapeFullUrl(href, 'html')}"<@compiledClassAttribStr class=linkClass/><#if linkId?has_content> id="${linkId}"</#if> data-toggle="modal" data-target="${escapeVal(modalId, 'html')}"><#if icon?has_content><i class="${escapeVal(icon, 'html')}"></i> </#if>${escapeVal(label, 'htmlmarkup')}</a>
    <div id="${escapeVal(modalId, 'html')}" role="dialog" aria-hidden="true" class="${styles.modal_wrap!""}">
        <div class="modal-background"></div>
        <#-- Modal content-->
            <#if title?has_content || footer?has_content>
                <div <@compiledClassAttribStr class=class/>>
                    <div class="modal-card-head">
                        <p class="modal-card-title">${title!""}</p>
                    </div>
                    <div class="modal-card-body">
                        <#nested>
                    </div>
                    <div class="modal-card-foot">
                        ${footer!""}
                    </div>
                </div>
            <#else>
                <div class="modal-content">
                    <div class="box"><#nested></div>
                </div>
            </#if>
        <button class="modal-close is-large" aria-label="close"></button>
    </div>
</#macro>

<#function modalControl element type="open">
    <#local call="" />
    <#switch type?lower_case>
        <#case "close">
            <#local call>
                if(${element!""} !== undefined){
                    if (${element!""} instanceof jQuery){
                        ${element!""}.removeClass('is-active');
                    }else{
                        ${element!""}.classList.remove('is-active');
                    }
                }else{
                    document.getElementById('${element!""}').classList.remove('is-active');
                }
            </#local>
            <#break>
        <#case "open">
        <#default>
            <#local call>
                if(${element!""} !== undefined){
                    if (${element!""} instanceof jQuery){
                        ${element!""}.addClass('is-active');
                    }else{
                        ${element!""}.classList.add('is-active');
                    }
                }else{
                    document.getElementById('${element!""}').classList.add('is-active');
                }
            </#local>
            <#break>
    </#switch>
    <#return call/>
</#function>

<#-- @nav main markup - theme override -->
<#macro nav_markup type="" id="" class="" style="" activeElem="" origArgs={} passArgs={} catchArgs...>
    <#switch type>
        <#case "magellan">
        <nav class="magellan" data-spy="scroll">
            <div class="container-fluid">
                <ul class="nav nav-tabs" role="tablist">
                    <#nested>
                </ul>
            </div>
        </nav>
        <#break>
        <#case "breadcrumbs">
        <nav class="${styles.nav_breadcrumbs!}" aria-label="breadcrumbs">
        <ul>
            <#nested>
        </ul>
        </nav>
        <#break>
        <#case "steps">
        <#local class = addClassArg(class, styles.nav_steps!)>
        <ul<@compiledClassAttribStr class=class /><#if id?has_content> id="${escapeVal(id, 'html')}</#if><#if style?has_content> style="${escapeVal(style, 'html')}</#if>>
            <#nested>
        </ul>
        <#break>
        <#default>
        <ul class="${styles.list_inline!} ${styles.nav_subnav!}">
            <#nested>
        </ul>
        <#break>
    </#switch>
</#macro>

<#macro menu_markup type="" specialType="" name="" class="" id="" style="" attribs={} excludeAttribs=[]
inlineItems=false titleClass="" title="" htmlwrap="ul" isNestedMenu=false parentMenuType="" parentMenuSpecialType=""
active=false activeTarget="" menuLevel=1 sepMenu={} itemCount=""
origArgs={} passArgs={} catchArgs...>
    <#if !inlineItems && htmlwrap?has_content>
        <#-- NOTE: here we always test specialType and never type, so that many (custom) menu types may reuse the same
        existing specialType special handling without having to modify this code -->
        <#if specialType == "main">
            <#-- WARN: isNestedMenu check here would not be logical -->
            <li class="${styles.menu_main_wrap!}"><a href="#" class="${styles.menu_main_item_link!}"
        <#if (styles.framework!"") == "bootstrap"> data-toggle="dropdown"</#if>>${escapeVal(title, 'htmlmarkup')}<#if (styles.framework!"") == "bootstrap"> <i class="fa fa-fw fa-caret-down"></i></#if></a>
        <#elseif specialType == "sidebar" && !isNestedMenu>
            <#-- WARN: isNestedMenu check here is flawed, but it's all we need for now -->
            <aside class="menu">
            <#-- FIXME: this "navigation" variable is way too generic name! is it even still valid? -->
            <#if navigation?has_content><heading>${escapeVal(navigation, 'htmlmarkup')}</heading></#if>
        <#elseif specialType == "button-dropdown">
            <div class="dropdown">
                <div class="dropdown-trigger">
                    <button href="#" data-dropdown="${escapeVal(id, 'html')}" aria-haspopup="true" aria-controls="${escapeVal(id, 'html')}" data-toggle="dropdown" aria-expanded="false"<@compiledClassAttribStr class=titleClass />>${escapeVal(title, 'htmlmarkup')}</button><br>
                    <#local attribs = attribs + {"data-dropdown-content":"true", "aria-hidden":"true"}>
                </div>
        </#if>
    </#if>
    <#-- Logo -->
    <#if (sepMenu.layout!) == "before-inline">
        <#if htmlwrap?has_content><${htmlwrap} class="menu-list"<#if id?has_content> id="menu_logo"</#if><#if style?has_content> style="${escapeVal(style, 'html')}"</#if><#if attribs?has_content><@commonElemAttribStr attribs=attribs exclude=excludeAttribs/></#if>></#if>
            <li class="nav-title">
                <#if layoutSettings.headerImageLinkUrl??>
                    <#assign logoLinkURL = "${layoutSettings.headerImageLinkUrl}">
                <#else>
                    <#assign logoLinkURL = "${layoutSettings.commonHeaderImageLinkUrl}">
                </#if>
                <a href="<@ofbizUrl>${logoLinkURL!""}</@ofbizUrl>" class="navbar-item brand-text">
                    <img alt="${layoutSettings.companyName}" src="<@contentUrl>/bulmatheme/images/scipio-logo-small.svg</@contentUrl>" />
                </a>
            </li>
        <#if htmlwrap?has_content></${htmlwrap}></#if>
    </#if>
    <#-- Action Menu -->
    <#if sepMenu.hasMenu>
        <#if (sepMenu.layout!) == "before-inline">
            <#local sepClass=class/>
            <#local sepClass = addClassArg(sepClass,"is-open")/>
            <#if htmlwrap?has_content><${htmlwrap}<@compiledClassAttribStr class=sepClass /><#if id?has_content> id="${escapeVal(id, 'html')}_action"</#if><#if style?has_content> style="${escapeVal(style, 'html')}"</#if><#if attribs?has_content><@commonElemAttribStr attribs=attribs exclude=excludeAttribs/></#if>></#if>
                <li class="nav-title" id="menu_1_action_title"><a href="javascript:openSidebarTab('menu_1_action');"><i class="fa fa-bolt" aria-hidden="true"></i><span class="menu-label is-sr-only">${getLabel("CommonActions")}</span></a></li>
                <@sepMenu.render sepMenu=sepMenu menuOnly=true></@sepMenu.render>
            <#if htmlwrap?has_content></${htmlwrap}></#if>
        </#if>
    <#else>
        <#local class = addClassArg(class,"is-open")/>
    </#if>
    <#-- Menu -->
    <#if htmlwrap?has_content><${htmlwrap}<@compiledClassAttribStr class=class /><#if id?has_content> id="${escapeVal(id, 'html')}"</#if><#if style?has_content> style="${escapeVal(style, 'html')}"</#if><#if attribs?has_content><@commonElemAttribStr attribs=attribs exclude=excludeAttribs/></#if> role="menu"></#if>
    <#if (sepMenu.layout!) == "before-inline">
        <li class="nav-title" id="menu_1_title"><a href="javascript:openSidebarTab('menu_1');"><i class="fa fa-sitemap" aria-hidden="true"></i><span class="menu-label is-sr-only">${getLabel("CommonNavigation")}</span></a></li>
        <#--<@menuitem type="text" class=sepMenu.nonsepTitleItemClass contentClass="is-sr-only" text=getLabel("CommonNavigation")/>--></#if>
    <#if specialType == "button-dropdown">
        <div class="dropdown-content">
            <#nested>
        </div>
    <#else>
        <#nested>
    </#if>
    <#if !inlineItems && htmlwrap?has_content>
        <#if specialType == "main">
            <#if htmlwrap?has_content></${htmlwrap}></#if>
            </li>
        <#elseif specialType == "sidebar" && !isNestedMenu>
            <#if htmlwrap?has_content></${htmlwrap}></#if>
            </aside>
        <#else>
            <#if specialType == "button-dropdown"></div></#if>
            <#if htmlwrap?has_content></${htmlwrap}></#if>
        </#if>
    </#if>
</#macro>

<#macro menuitem args={} inlineArgs...>
    <#local args = mergeArgMaps(args, inlineArgs, scipioStdTmplLib.menuitem_defaultArgs)>
    <#local dummy = localsPutAll(args)>
    <#local args = mergeArgMaps(args, {
    "class" : "",
    "contentClass" : contentClass+class
    })>
    <@scipioStdTmplLib.menuitem args=args><#nested></@scipioStdTmplLib.menuitem>
</#macro>

<#macro menuitem_markup type="" menuType="" menuSpecialType="" name="" menuName="" class="" id="" style="" attribs={}
excludeAttribs=[] inlineItem=false htmlwrap="li" disabled=false selected=false active=false activeTarget=""
isNestedMenu=false menuLevel=1 parentMenuType="" parentMenuSpecialType="" itemIndex=0 itemCount="" origArgs={} passArgs={} catchArgs...>
    <#local dummy=pushRequestStack("scp_menutitem_class",class) />
    <#if !inlineItem && htmlwrap?has_content>
        <${htmlwrap}<@compiledClassAttribStr class=class /><#if id?has_content> id="${escapeVal(id, 'html')}"</#if><#if style?has_content> style="${escapeVal(style, 'html')}"</#if><#if attribs?has_content><@commonElemAttribStr attribs=attribs exclude=["class", "id", "style"]/></#if>><#rt>
    </#if>
    <#nested><#t>
    <#if !inlineItem && htmlwrap?has_content>
        </${htmlwrap}><#lt>
    </#if>
</#macro>

<#macro menuitem_link_markup itemType="" menuType="" menuSpecialType="" itemName="" menuName="" class="" id="" style="" href="" name="" onClick="" target="" title=""
attribs={} excludeAttribs=[] disabled=false selected=false active=false activeTarget="" isNestedMenu=false menuLevel=1 parentMenuType="" parentMenuSpecialType="" itemIndex=0
origArgs={} passArgs={} catchArgs...>
    <#if active><#local class = addClassArg(class, "is-active")></#if>
    <#t><a href="${escapeFullUrl(href, 'html')}"<#if onClick?has_content> onclick="${escapeVal(onClick, 'html')}"</#if><@compiledClassAttribStr class=class /><#if id?has_content> id="${escapeVal(id, 'html')}"</#if><#if name?has_content> name="${escapeVal(name, 'html')}"</#if><#if style?has_content> style="${escapeVal(style, 'html')}"</#if><#if attribs?has_content><@commonElemAttribStr attribs=attribs exclude=excludeAttribs/></#if><#if target?has_content> target="${escapeVal(target, 'html')}"</#if><#if title?has_content> title="${escapeVal(title, 'html')}"</#if>><#nested></a>
</#macro>

<#macro table_markup open=true close=true type="" styleName="" class="" id="" cellspacing="" useResponsive=false responsiveArgs={}
autoAltRows="" firstRowAlt="" inheritAltRows=false useFootAltRows=false tableIdNum=0 attribs={} excludeAttribs=[] origArgs={} passArgs={} catchArgs...>
    <#if open><div class="table-container"></#if>
     <@scipioStdTmplLib.table_markup open=open close=close type=type styleName=styleName class=class id=id cellspacing=cellspacing useResponsive=useResponsive
        responsiveArgs=responsiveArgs autoAltRows=autoAltRows firstRowAlt=firstRowAlt inheritAltRows=inheritAltRows useFootAltRows=useFootAltRows tableIdNum=tableIdNum
        attribs=attribs excludeAttribs=excludeAttribs origArgs=origArgs passArgs=passArgs catchArgs=catchArgs><#nested></@scipioStdTmplLib.table_markup>
    <#if close></div></#if>
</#macro>

<#macro tabs_markup type="" title="" id="" class=""
origArgs={} passArgs={} catchArgs...>
    <#local class = addClassArg(class, styles.tabs_wrap!"")>
    <#local class = addClassArg(class, type)>

    <#local tabsIdNum = getRequestVar("scipioTabsIdNum")!0>
    <#local tabsIdNum = tabsIdNum + 1 />
    <#local dummy = setRequestVar("scipioTabsIdNum", tabsIdNum)>

    <#local dummy = setRequestVar("scipioTabLength", tabLength)>

    <#local dummy = setRequestVar("scipioTabInfoStack", {})>
    <#local nestedContent><#nested /></#local>
    <#local globalTabInfo=getRequestVar("scipioTabInfoStack"!{})>

    <#if title?has_content><@heading class="${styles.tabs_title!}">${escapeVal(title, 'htmlmarkup')}</@heading></#if>
    <div class="tabs is-fullwidth" id="tab-${tabsIdNum!}">
        <ul <@compiledClassAttribStr class=class /> data-tab role="tablist">
            <#--<li class="tab-title active"><a href="#panel1" data-toggle="tab" role="tab">Tab 1</a></li>-->
            <#list globalTabInfo?keys as localTab>
                <#local tab = globalTabInfo[localTab]/>
                <li class="${styles.tabs_item_title}<#if tab['tabLength']?has_content && tab['tabLength']==1> ${styles.tabs_item_title_active}</#if>">
                    <a href="#tab-${tabsIdNum!}" class="${styles.tabs_item_title_link}<#if tab['tabLength']?has_content && tab['tabLength']==1> ${styles.tabs_item_title_link_active}</#if>"
                    data-toggle="tab" role="tab">${tab['title']!tab['id']!tab['tabLength']}</a>
                </li>
            </#list>
        </ul>
    </div>
    <div<#if styles.tabs_item_container?has_content> class="${styles.tabs_item_container}"</#if>>
        ${nestedContent!}
    </div>
</#macro>


<#-- @chart main markup - theme override -->
<#macro chart_markup type="" chartLibrary="" title="" id="" xlabel="" ylabel="" label1="" label2="" labelUom1="" labelUom2="" chartIdNum=0 renderSeqNumber=0 origArgs={} passArgs={} catchArgs...>
  <#-- WARN/FIXME?: ids and type are not escaped, currently assumed to come from internal only... -->
  <#local nestedContent><#nested /></#local>
  <#if chartLibrary=="foundation">
    <#if nestedContent?has_content>
    <@row>
      <@cell columns=3>
        <ul data-${escapeVal(type, 'html')}-id="${escapeVal(id, 'html')}" class="${styles.chart_legend!}">
            <#nested/>
        </ul>
      </@cell>
      <@cell columns=9><div id="${escapeVal(id, 'html')}" style="height:300px;"></div></@cell>
    </@row>
    <#else>
        <#-- Default to chart.js chart for now, as this is capable of rendering an empty chart -->
        <@chart type=type library="chart" xlabel=xlabel ylabel=ylabel label1=label1 label2=label2>
            <#nested>
        </@chart>
    </#if>
  <#else>
    <#-- Get the number of datasets by inspecting the nested content (chartjs addData function values) -->
    <#if nestedContent?has_content>
        <#assign chartDatasets=chart_get_number_of_datasets(nestedContent, chartLibrary) />
        <#else>
        <#assign chartDatasets=0/>
    </#if>
    <#if (chartDatasets < 1)><#local chartDatasets = 1 /></#if>
    <#-- THEME Specific changes -->
      <div class="chart-wrapper">
      <span class="chart-data">&nbsp;</span>
        <canvas id="${escapeVal(id, 'html')}"></canvas>
    </div>
    <#-- End of THEME Specific changes -->
    <@script>
        $(function(){
            var chartDataEl = $('.chart-data').first();
            var chartData = chartDataEl.sassToJs({pseudoEl:"::before", cssProperty: "content"});
            var options =  {
                    responsive: true,
                    responsiveAnimationDuration: 0,
                    animation: {
                        duration: 1000
                    },
                    maintainAspectRatio: true,
                    tooltips: {
                        mode: <#if type=="line" || type=="bar">'label'<#else>'single'</#if><#if (labelUom1?has_content ||labelUom2?has_content) >,
                        callbacks: {
                            label: function(tooltipItem, data) {
                                <#if labelUom1?has_content>
                                    if(tooltipItem.datasetIndex == 0) {
                                        var datasetLabel = '';
                                        <#if type=="line" || type=="bar">
                                             datasetLabel = data.datasets[tooltipItem.datasetIndex].label;
                                             return datasetLabel + ': ' + tooltipItem.yLabel + ' ${escapeVal(labelUom1, 'js')}';
                                        <#elseif type="pie">
                                             datasetLabel = data.labels[tooltipItem.index] + ': ' + data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index];
                                             return datasetLabel + ' ${escapeVal(labelUom1, 'js')}';
                                        <#else>
                                            return datasetLabel;
                                        </#if>
                                    }
                                </#if>
                                <#if labelUom2?has_content>
                                    if(tooltipItem.datasetIndex == 1) {
                                        var datasetLabel = data.datasets[tooltipItem.datasetIndex].label || '';
                                        return datasetLabel + ': ' + tooltipItem.yLabel + ' ${escapeVal(labelUom2, 'js')}';
                                    }
                                </#if>
                            }
                        }
                        </#if>
                    },
                    hover: {
                        mode: <#if type=="line" || type=="bar">'label'<#else>'single'</#if>
                    },
                    legend: {
                        position: 'bottom',
                        labels: {
                            boxWidth: 30
                        }
                    },
                    title: {
                        <#if title?has_content>
                            display: true,
                            text: '${escapeVal(title, 'js')}',
                        <#else>
                            display: false,
                        </#if>
                        fontColor: chartData.scaleLabelFontColor,
                        fontFamily: chartData.scaleLabelFontFamily,
                        fontSize: chartData.scaleLabelFontSize
                    }
                    <#if type=="line" || type=="bar">,
                        <#if type=="line"> animation: {
                        duration: 0
                        },</#if>
                        scales: {
                            x: {
                                gridLines: {
                                    color: chartData.scaleGridLineColor
                                },
                                scaleLabel : {
                                    display: chartData.scaleLabelDisplay,
                                    <#if xlabel?has_content>labelString: '${escapeVal(xlabel, 'js')}',</#if>
                                    fontColor: chartData.scaleLabelFontColor,
                                    fontFamily: chartData.scaleLabelFontFamily,
                                    fontSize: chartData.scaleLabelFontSize
                                },
                                ticks: {
                                    display: true,
                                    autoSkip: true,
                                    padding:10,
                                    maxRotation:30,
                                    fontColor: chartData.scaleLabelFontColor,
                                    fontFamily: chartData.scaleLabelFontFamily,
                                    fontSize: chartData.scaleLabelFontSize
                                }
                              },
                            y: {
                                scaleLabel : {
                                    display: chartData.scaleLabelDisplay,
                                    <#if ylabel?has_content>scaleLabel: '${escapeVal(xlabel, 'js')}',</#if>
                                    fontColor: chartData.scaleLabelFontColor,
                                    fontFamily: chartData.scaleLabelFontFamily,
                                    fontSize: chartData.scaleLabelFontSize
                                },
                                ticks: {
                                    display: true,
                                    autoSkip: true,
                                    fontColor: chartData.scaleLabelFontColor,
                                    fontFamily: chartData.scaleLabelFontFamily,
                                    fontSize: chartData.scaleLabelFontSize
                                }
                            }
                        }
                    <#elseif type=="pie">,
                        scales: {

                        }
                    </#if>
                };
            var canvasElem = $('#${escapeVal(id, 'js')}');
            var ctx = canvasElem.get(0).getContext("2d");
            var data = {
                labels :[],
                datasets: [
                    {
                      <#if type=="line" || type=="bar">
                      label: '${escapeVal(label1, 'js')}',
                      fill: true,
                      backgroundColor: chartData.primaryFillColor,
                      borderColor: chartData.primaryStrokeColor,
                      pointBackgroundColor: chartData.pointColor,
                      pointBorderColor: chartData.primaryPointStrokeColor,
                      pointHoverBackgroundColor: chartData.pointHighlightFill,
                      pointHoverBorderColor: chartData.pointHighlightStroke,
                      <#else>
                      backgroundColor: [
                            chartData.pieFillColor1,
                            chartData.pieFillColor2,
                            chartData.pieFillColor3,
                            chartData.pieFillColor4,
                            chartData.pieFillColor5,
                            chartData.pieFillColor6
                        ],
                        hoverBackgroundColor: [
                            chartData.pieHighlightColor1,
                            chartData.pieHighlightColor2,
                            chartData.pieHighlightColor3,
                            chartData.pieHighlightColor4,
                            chartData.pieHighlightColor5,
                            chartData.pieHighlightColor6
                        ],
                      </#if>
                      data: []
                    }
                    <#if (chartDatasets > 1)>
                    ,{
                      <#if (type=="line" || type=="bar")>
                      label: '${escapeVal(label2, 'js')}',
                      fill: true,
                      backgroundColor: chartData.secondaryFillColor,
                      borderColor: chartData.secondaryStrokeColor,
                      pointBackgroundColor: chartData.pointColor,
                      pointBorderColor: chartData.secondaryPointStrokeColor,
                      pointHoverBackgroundColor: chartData.pointHighlightFill,
                      pointHoverBorderColor: chartData.pointHighlightStroke,
                      <#else>
                       backgroundColor: [
                            chartData.pieFillColor1,
                            chartData.pieFillColor2,
                            chartData.pieFillColor3,
                            chartData.pieFillColor4,
                            chartData.pieFillColor5,
                            chartData.pieFillColor6
                        ],
                      </#if>
                      data: []
                    }
                    </#if>
                    ]
                };
            var config = {
                <#switch type>
                    <#case "bar">type: 'bar'<#break>
                    <#case "pie">type: 'pie'<#break>
                    <#default>type: '${type!"line"}'
                </#switch>,
                data: data,
                options: options
            };

            var chart = new Chart(ctx, config);
            canvasElem.data("chart", chart);
            var newChart = chart; <#-- backward-compat -->
            var ${escapeVal(id, 'js')} = chart; <#-- backward-compat: TODO: REMOVE: escapeVal is not valid for use outside quotes (see freemarker docs for ?js) -->
            <#-- escapeVal unsafe outside quotes and other issues
            ${escapeVal(id, 'js')} = chart; -->
            ${nestedContent}
            chart.update();
        });
    </@script>
  </#if>
</#macro>

<#-- @slider main markup - theme override -->
<#macro slider_markup title="" id="" sliderIdNum=0 class="" library="" controls=true indicator=true
jsOptions="" origArgs={} passArgs={} catchArgs...>
    <#if langDir?has_content && langDir=="rtl"><#local jsOptions="rtl:true,"+jsOptions/></#if>
    <#if title?has_content><@heading>${escapeVal(title, 'htmlmarkup')}</@heading></#if>
    <#local library="bulma"/>
    <#switch library>
        <#case "owl">
        <#local class = addClassArg(class, "owl-carousel")>
        <div<@compiledClassAttribStr class=class /> id="${escapeVal(id, 'html')}">
            <#nested/>
        </div>
        <script type="text/javascript">
            $(document).ready(function(){
        $("#${escapeVal(id, 'js')}").owlCarousel({${jsOptions}});
                });
            </script>
        <#break>
        <#case "slick">
        <div class="slider-parent">
            <div<@compiledClassAttribStr class=class /> id="${escapeVal(id, 'html')}">
                <#nested/>
            </div>
        </div>
        <script type="text/javascript">
            $(document).ready(function(){
                $("#${escapeVal(id, 'js')}").slick({${jsOptions}});
                });
        </script>
        <#break>
        <#default>
            <div class="${styles.slider_container!}">
                <#local sliderLength = getRequestVar("scipioSliderLength")!0>
                <div class="${styles.slider_wrap!}" id="${escapeVal(id, 'html')}" >
                    <#nested/>
                </div>
            </div>
            <@script>
                document.addEventListener('DOMContentLoaded', () => {
                    bulmaCarousel.attach('#${escapeVal(id, 'js')}', {
                        ${jsOptions}
                    });
                });
            </@script>
        <#break>
    </#switch>
</#macro>

<#-- @slide main markup - theme override -->
<#macro slide_markup id="" sliderId="" class="" library="" image="" link="" linkTarget="" title="" slideIdNum=0 sliderLength=1 renderSeqNumber="" origArgs={} passArgs={} catchArgs...>
    <#local library="bulma"/>
    <#if library=="owl" || library=="slick">
        <div id="${escapeVal(id, 'html')}" class="item">
            <#if link?has_content><a href="${escapeFullUrl(link, 'html')}"<#if linkTarget?has_content> target="${escapeVal(linkTarget, 'html')}"</#if>></#if>
            <div>
                <#if title?has_content><h2>${escapeVal(title, 'htmlmarkup')}</h2></#if>
                <#if image?has_content>
                    <img src="${escapeFullUrl(image, 'html')}"  class="${styles.slide_image!}"/>
                </#if>
                <#local nestedContent><#nested></#local>
                <#if nestedContent?has_content><div class="">${nestedContent}</div></#if>
            </div>
            <#if link?has_content></a></#if>
        </div>
    <#else>
        <div class="item-${slideIdNum} <#if slideIdNum==1>active</#if>">
            <#if link?has_content><a href="${escapeFullUrl(link, 'html')}"<#if linkTarget?has_content> target="${escapeVal(linkTarget, 'html')}"</#if>></#if>
            <#if title?has_content><h2  class="title is-2">${escapeVal(title, 'htmlmarkup')}</h2></#if>
            <#if image?has_content>
                <img src="${escapeFullUrl(image, 'html')}" class="${styles.slide_image!}"/>
            </#if>
            <#local nestedContent><#nested></#local>
            <#if nestedContent?has_content><div class="${styles.slide_content!}">${nestedContent}</div></#if>
            <#if link?has_content></a></#if>
        </div>
    </#if>
</#macro>

<#macro pul_markup title="" origArgs={} passArgs={} catchArgs...>
    <div class="${styles.pricing_wrap!}">
        <#if title?has_content><@pli type="title">${escapeVal(title, 'htmlmarkup')}</@pli></#if>
        <#nested>
    </div>
</#macro>

<#-- @pli main markup - theme override -->
<#macro pli_markup type="" class="" origArgs={} passArgs={} catchArgs...>
    <#switch type>
        <#case "price">
        <#local class = addClassArg(class, "panel-block "+ styles.pricing_price!)>
        <div <@compiledClassAttribStr class=class />>
            <div class="control">
                <#nested>
            </div>
        </div>
        <#break>
        <#case "description">
        <#local class = addClassArg(class, "panel-block "+styles.pricing_description!)>
        <div <@compiledClassAttribStr class=class />><div class="control">
            <#nested>
        </div></div>
        <#break>
        <#case "title">
        <#local class = addClassArg(class, styles.pricing_title!)>
        <div <@compiledClassAttribStr class=class />><#nested></div>
        <#break>
        <#case "button">
        <#local class = addClassArg(class, "panel-block "+styles.pricing_cta!)>
        <div <@compiledClassAttribStr class=class />>
            <#nested>
        </div>
        <#break>
        <#default>
        <#local class = addClassArg(class, styles.pricing_bullet!)>
        <div <@compiledClassAttribStr class=class />><div class="control">
            <#nested>
        </div></div>
        <#break>
    </#switch>
</#macro>

<#--
FORM MACROS
-->
<#-- @fieldset main markup - theme override -->
<#macro fieldset_markup open=true close=true class="" containerClass="" id="" containerId="" title="" collapsed=false collapsibleAreaId="" expandToolTip="" collapseToolTip="" collapsible=false origArgs={} passArgs={} catchArgs...>
    <#if open>
        <#local containerClass = addClassArg(containerClass, "fieldgroup")>
        <#if collapsible || collapsed>
            <#local containerClass = addClassArg(containerClass, "toggleField")>
            <#if collapsed>
                <#local containerClass = addClassArg(containerClass, styles.collapsed)>
            </#if>
        </#if>
        <#local classes = compileClassArg(class)>
        <#local containerClasses = compileClassArg(containerClass, "${styles.grid_large!}12")>
        <@row open=true close=false />
        <@cell open=true close=false class=containerClasses id=containerId />
        <fieldset<#if classes?has_content> class="${escapeVal(classes, 'html')}"</#if><#if id?has_content> id="${escapeVal(id, 'html')}"</#if>>
        <#if title?has_content><legend><#if collapsible || collapsed>[ <i class="${styles.icon!} ${styles.icon_arrow!}"></i> ] </#if>${escapeVal(title, 'htmlmarkup')}</legend></#if>
        <div id="${escapeVal(collapsibleAreaId, 'html')}" class="fieldgroup-body"<#if collapsed> style="display: none;"</#if>>
    </#if>

        <#nested>
        <#if close>
            </div>
            </fieldset>
            <@cell close=true open=false />
            <@row close=true open=false />
        </#if>
</#macro>

<#macro field args={} inlineArgs...>
    <#local args = mergeArgMaps(args, inlineArgs, scipioStdTmplLib.field_defaultArgs)>
    <#local dummy = localsPutAll(args)>
    <#local overrideDefaultClass = {} >
    <#switch type>
        <#case "generic">
        <#case "submit">
        <#case "display">
        <#break>
        <#case "file">
        <#break>
        <#case "textarea">
            <#local class = addClassArg(class,"textarea") >
            <#if readonly>
                <#local class = addClassArg(class,"readonly is-info") >
            </#if>
        <#break>
        <#case "select">
            <#local class = addClassArg(class,"select") >
        <#break>
        <#case "checkbox">
        <#case "radio">
            <#local class = addClassArg(class,"is-checkradio") >
        <#break>
        <#case "file">
            <#local class = addClassArg(class,"file-input") >
        <#break>
        <#case "text">
        <#case "input">
        <#case "email">
        <#case "tel">
        <#default>
            <#local class = addClassArg(class,"input") >
        <#break>
    </#switch>
    <#local overrideDefaultClass = mergeArgMaps(overrideDefaultClass,{"class":class!""}) >
    <#local args = mergeArgMaps(args, overrideDefaultClass)>
    <@scipioStdTmplLib.field args=args ><#nested></@scipioStdTmplLib.field>
</#macro>

<#-- @field label area markup - theme override -->
<#macro field_markup_labelarea labelType="" labelPosition="" label="" labelContent=false labelDetail=false fieldType="" fieldsType="" fieldId="" collapse=""
required=false labelContentArgs={} norows=false nocells=false container=true origArgs={} passArgs={} catchArgs...>
    <#local label = escapeVal(label, 'htmlmarkup')?trim>
    <#if !labelContent?is_boolean>
        <@contentArgRender content=labelContent args=labelContentArgs doTrim=true />
    <#elseif label?has_content>
        <label class="label"<#if fieldId?has_content> for="${escapeVal(fieldId, 'html')}"</#if>>${label}<#if required> *</#if></label>
    </#if>
    <#if !labelDetail?is_boolean><@contentArgRender content=labelDetail args=labelContentArgs doTrim=true /></#if>
</#macro>

<#macro field_file_markup_widget class="" alert="" name="" value="" size="" style="" maxlength="" autocomplete="" id="" title="" tooltip="" fieldTitleBlank=false inlineLabel=false
required=false attribs={} origArgs={} passArgs={} catchArgs...>
    <#local class = addClassArg(class, styles.field_file_default!"")>
    <#if tooltip?has_content>
        <#local class = addClassArg(class, styles.field_file_tooltip!styles.field_default_tooltip!"")>
        <#local attribs = (styles.field_file_tooltip_attribs!styles.field_default_tooltip_attribs!{}) + attribs>
        <#local title = tooltip>
    </#if>
    <div class="file <#if title?has_content>has-name</#if>">
        <label class="file-label">
            <input type="file"<@fieldElemAttribStr attribs=attribs /><@fieldClassAttribStr class=class alert=alert /><#if id?has_content> id="${escapeVal(id, 'html')}"</#if><#if name?has_content> name="${escapeVal(name, 'html')}"</#if><#rt/>
            <#if style?has_content> style="${escapeVal(style, 'html')}"</#if><#if value?has_content> value="${escapeVal(value, 'html')}"</#if><#if size?has_content> size="${size}"</#if><#if title?has_content> title="${escapeVal(title, 'html')}"</#if><#t/>
            <#if required> required="required"</#if><#if maxlength?has_content> maxlength="${maxlength}"</#if><#if autocomplete?has_content> autocomplete="off"</#if>/><#t/>
            <span class="file-cta">
                <span class="file-icon">
                    <i class="fa fa-upload"></i>
                </span>
                <span class="file-label">
                    ${getLabel("ContentDataResourceUpload")}
                </span>
            </span>
            <#if title?has_content>
                <span class="file-name">${escapeVal(title, 'html')}"</span>
            </#if>
        </label>
    </div>
</#macro>


<#-- @field container markup - theme override
    #nested is the actual field widget (<input>, <select>, etc.). -->
<#macro field_markup_container type="" fieldsType="" defaultGridArgs={} gridArgs={}
postfix=false postfixContent=true labelArea=true labelType="" labelPosition="" labelAreaContent="" collapse=""
collapseLabel="" collapsePostfix="" norows=true nocells=true container=true containerId="" containerClass="" containerStyle=""
preWidgetContent=false postWidgetContent=false preLabelContent=false postLabelContent=false prePostfixContent=false postPostfixContent=false
labelAreaContentArgs={} postfixContentArgs={} prePostContentArgs={}
widgetAreaClass="" labelAreaClass="form-label" postfixAreaClass="" widgetPostfixAreaClass="" inverted=false labelSmallDiffColumns=""
origArgs={} passArgs={} required=false noLabelCell=true noInputCell=true catchArgs...>
    <#local rowClass = containerClass>
    <#local isSwitch = passArgs.isSwitch!false>
    <#local fieldEntryTypeClass = "">
    <#local labelInRow = (labelType != "vertical")>
    <#local iftaLabel = passArgs.iftaLabel!false>

    <#local widgetPostfixCombined = gridArgs.widgetPostfixCombined!defaultGridArgs.widgetPostfixCombined!"">
    <#if !widgetPostfixCombined?is_boolean>
        <#if postfix && !collapse> <#-- previously: ((postfix && collapsePostfix) && !collapse) -->
            <#local widgetPostfixCombined = styles["fields_" + fieldsType + "_widgetpostfixcombined"]!styles["fields_default_widgetpostfixcombined"]!true>
        <#else>
            <#local widgetPostfixCombined = false>
        </#if>
    </#if>
    <#local defaultGridStyles = getDefaultFieldGridStyles(defaultGridArgs + {"labelInRow": labelInRow,
    "widgetPostfixCombined":widgetPostfixCombined} + gridArgs)>

    <#if container>
        <#local containerClass = "field">
        <#local widgetAreaClass = "control">
    </#if>

    <#if (postfix?has_content && postfix)|| (prefix?has_content && prefix)>
        <#if container>
            <#if ((labelArea && labelPosition == "left") || (labelArea && labelPosition == "right"))>
                <#local containerClass = addClassArg(containerClass,"has-addons")>
            </#if>
        </#if>
        <#local noInputCell=false/>
    <#else>
        <#if container>
            <#if !containerClass?has_content>
                <#local containerClass = "field">
            </#if>
        </#if>
        <#local noInputCell=false/>
    </#if>

    <#if (labelArea && labelPosition == "left") || (labelArea && labelPosition == "right")>
        <#local containerClass = addClassArg(containerClass,"is-horizontal")>
        <#local labelAreaClass = addClassArg(labelAreaClass,"field-label")>
        <#local widgetAreaClass = addClassArg(widgetAreaClass,"is-expanded")>
    </#if>
    <#if containerClass?has_content><div<@fieldClassAttribStr class=containerClass/>></#if>
    <#if (labelArea && labelPosition == "left") || (labelArea && labelPosition == "top")>
        <#if labelAreaClass?has_content><div<@fieldClassAttribStr class=labelAreaClass/>></#if>
        <#if !preLabelContent?is_boolean><@contentArgRender content=preLabelContent args=prePostContentArgs /></#if>
        <#if !labelAreaContent?is_boolean><@contentArgRender content=labelAreaContent args=labelAreaContentArgs /></#if>
        <#if !postLabelContent?is_boolean><@contentArgRender content=postLabelContent args=prePostContentArgs /></#if>
        <#if labelAreaClass?has_content></div></#if>
    </#if>
    <#if (labelArea && labelPosition == "left") || (labelArea && labelPosition == "right")>
        <div class="field-body">
        <div class="field <#if (labelArea && labelPosition == "left") || (labelArea && labelPosition == "right")>has-addons</#if>">
    </#if>
    <#if widgetAreaClass?has_content><div<@fieldClassAttribStr class=widgetAreaClass/>></#if>
    <#if !preWidgetContent?is_boolean><@contentArgRender content=preWidgetContent args=prePostContentArgs /></#if>
    <#nested>
    <#if !postWidgetContent?is_boolean><@contentArgRender content=postWidgetContent args=prePostContentArgs /></#if>
    <#if widgetAreaClass?has_content></div></#if>
    <#if postfix>
        <#if !prePostfixContent?is_boolean><@contentArgRender content=prePostfixContent args=prePostContentArgs /></#if>
        <#if (postfixContent?is_boolean && postfixContent == true) || !postfixContent?has_content>
            <div class="control">
                <#--<input type="submit" class="${styles.icon!} ${styles.icon_button!}" value="${styles.icon_button_value!}"/>-->
                <button type="submit" class="button">Submit</button>
            </div>
        <#elseif !postfixContent?is_boolean> <#-- boolean false means prevent markup -->
            <#if !postfixContent?is_boolean><div class="control"><@contentArgRender content=postfixContent args=postfixContentArgs /></div></#if>
        </#if>
        <#if !postPostfixContent?is_boolean><div class="control"><@contentArgRender content=postPostfixContent args=prePostContentArgs /></div></#if>
    </#if>
    <#if (labelArea && labelPosition == "left") || (labelArea && labelPosition == "right")>
        </div>
        </div>
    </#if>
    <#if containerClass?has_content></div></#if>
</#macro>


<#macro field_datetime_markup_widget name="" class="" style="" title="" value="" size="" maxlength="" id="" dateType="" dateDisplayType=""
timeDropdownParamName="" defaultDateTimeString="" localizedIconTitle="" timeDropdown="" timeHourName="" classString=""
hour1="" hour2="" timeMinutesName="" minutes="" isTwelveHour="" ampmName="" amSelected="" pmSelected="" compositeType="" formName=""
alert=false mask="" events={} step="" timeValues="" tooltip="" postfix="" postfixColumns="" inlinePostfix=false manualInput=true collapse=false fieldTitleBlank=false origLabel="" inlineLabel=false
dateDisplayFormat="" required=false attribs={} origArgs={} passArgs={} catchArgs...>
    <#local class = addClassArg(class, styles.field_datetime_default!"")>
    <#if !dateDisplayFormat?has_content>
        <#local dateDisplayFormat = getFieldDateDispFmtStd(dateDisplayType)>
    </#if>
    <#local displayInputId = "">
    <#if !postfixColumns?is_number>
        <#local postfixColumns = 1>
    </#if>
    <#local inputId = "">
    <#if id?has_content>
        <#local displayInputId = raw(id) + "_i18n">
        <#local inputId = id>
    </#if>
    <#local displayInputName = "">
    <#local inputName = "">
    <#if name?has_content>
        <#local displayInputName = raw(name) + "_i18n">
        <#local inputName = name>
    </#if>
    <#if !postfix?is_boolean>
        <#local postfix = true>
    </#if>

    <#if tooltip?has_content>
        <#local class = addClassArg(class, styles.field_datetime_tooltip!styles.field_default_tooltip!"")>
        <#-- tooltip supplants title -->
        <#local title = tooltip>
        <#local attribs = (styles.field_datetime_tooltip_attribs!styles.field_default_tooltip_attribs!{}) + attribs>
    </#if>
    <#if title?is_boolean && title == false>
        <#local title = "">
    <#else>
        <#if title?is_boolean && title == true>
            <#local title = "">
        </#if>
        <#-- 2018-02-16: title/tooltip can now start with "+" to indicate prepend to default -->
        <#local titlePrefix = "">
        <#if raw(title)?starts_with("+")>
            <#local titlePrefix = raw(title)[1..]>
            <#local title = "">
        </#if>
        <#if !title?has_content>
            <#local title = styles.field_datetime_default_title!>
        </#if>
        <#if title?has_content>
            <#local dateFormatString = raw(uiLabelMap.CommonFormat) + ": " + raw(dateDisplayFormat)>
            <#if title == "FORMAT">
                <#local title = dateFormatString>
            <#elseif title == "LABEL">
                <#local title = origLabel>
            <#elseif title == "LABEL+FORMAT">
                <#if origLabel?has_content>
                    <#local title = raw(origLabel) + " (" + raw(dateFormatString) + ")">
                <#else>
                    <#local title = dateFormatString>
                </#if>
            <#else>
                <#local title = getTextLabelFromExpr(title, {"dateLabel":origLabel, "dateFormatString":dateFormatString})!"">
            </#if>
        </#if>
        <#if titlePrefix?has_content>
            <#if title?has_content>
                <#local title = titlePrefix + (styles.field_datetime_title_sep!" - ") + title>
            <#else>
                <#local title = titlePrefix>
            </#if>
        </#if>
    </#if>
    <input type="date" name="${escapeVal(displayInputName, 'html')}"<@fieldClassAttribStr class=class alert=alert /><#rt/>
    <@fieldElemAttribStr attribs=attribs /><#t/>
    <#if events?has_content><@commonElemEventAttribStr events=events /></#if><#t/>
    <#if title?has_content> title="${escapeVal(title, 'html')}"</#if><#t/>
    <#if value?has_content> value="${escapeVal(value, 'html')}"</#if><#t/>
    <#if style?has_content> style="${escapeVal(style, 'html')}"</#if><#t/>
    <#if size?has_content> size="${size}"</#if><#t/>
    <#if maxlength?has_content> maxlength="${maxlength}"</#if><#t/>
    <#if !manualInput> readonly="readonly"</#if><#t/>
    <#if displayInputId?has_content> id="${escapeVal(displayInputId, 'html')}"</#if><#t/>
    <#if required> required="required"</#if><#t/>
    <#--don't set this stuff here anymore, because fdatepicker has bugs with this and also it's better to factor out the fdatepicker-specific stuff into the script macro:
            data-date="" data-date-format="${escapeVal(datePickerFmt, 'html')}"<#if dateDisplayType == "month"> data-start-view="year" data-min-view="year"</#if>--> /><#t/>
    <input type="hidden"<#if inputName?has_content> name="${escapeVal(inputName, 'html')}"</#if><#if inputId?has_content> id="${escapeVal(inputId, 'html')}"</#if><#if value?has_content> value="${escapeVal(value, 'html')}"</#if> />
    <#-- TODO?: we don't handle this case yet - only show date (renderer already passed dateType="date" for this). but we must submit zero values for the event to pass. -->
    <#if timeDropdown == "time-dropdown">
        <#if timeHourName?has_content>
            <input type="hidden" name="${escapeVal(timeHourName, 'html')}" value="0"/>
        </#if>
        <#if timeMinutesName?has_content>
            <input type="hidden" name="${escapeVal(timeMinutesName, 'html')}" value="0"/>
        </#if>
    </#if>
    <#-- NOTE: this is still needed in general (but mostly for timeDropdown). only one value supported by events currenlty (Timestamp). -->
    <#if compositeType?has_content>
        <input type="hidden" name="${escapeVal(compositeType, 'html')}" value="Timestamp"/>
    </#if>
    <@field_datetime_markup_script inputId=inputId inputName=inputName displayInputId=displayInputId displayInputName=displayInputName
    dateType=dateType dateDisplayType=dateDisplayType required=required attribs=toSimpleMap(attribs) origArgs=origArgs passArgs=passArgs />
</#macro>

<#assign field_datetime_disptypefmts = {
"timestamp": "yyyy-MM-dd HH:mm:ss.SSS",
"date": "yyyy-MM-dd",
"month": "yyyy-MM",
"time": "HH:mm:ss.SSS"
}>

<#macro field_datetime_markup_script inputId="" inputName="" displayInputId="" displayInputName="" dateType=""
dateDisplayType="" htmlwrap=true required=false origArgs={} passArgs={} catchArgs...>
    <#-- Display behavior flags -->
    <#-- NOTE: displayCorrect && useFillDate are needed for fdatepicker, otherwise the YYYY-MM-DD selection constantly resets the dates -->
    <#local displayCorrect = true><#-- if true, display input is re-assigned value on every change; if false, lets datepicker choose -->
    <#local useFillDate = true && displayCorrect><#-- if true, the digits that picker can't set are preserved from last value - only works for simple dateDisplayConvFmt (YYYY-MM-DD) -->

    <#local dateConvFmt = field_datetime_typefmts[dateType]!><#-- Real date format -->
    <#local dateDisplayConvFmt = field_datetime_disptypefmts[dateDisplayType]!>
    <#-- Effective display format for when displayCorrect==true (bypass for picker display format)
      (field_datetime_disptypefmts: friendly; field_datetime_typefmts: internal; custom hash possible) -->
    <#local dateEffDispConvFmt = field_datetime_typefmts[dateDisplayType]!>

    <#switch dateDisplayType>
        <#case "timestamp">
        <#local fdpExtraOpts>,dateFormat:"${field_datetime_disptypefmts.date}", timeFormat:"${field_datetime_disptypefmts.time}", type:"datetime"</#local>
        <#break>
        <#case "date">
        <#local fdpExtraOpts>,dateFormat:"${field_datetime_disptypefmts.date}",  type:"date"</#local>
        <#break>
        <#case "month">
        <#local fdpExtraOpts>,dateFormat:"${field_datetime_disptypefmts.month}", type:"date"</#local>
        <#break>
        <#case "time">
        <#local fdpExtraOpts>,timeFormat:"${field_datetime_disptypefmts.time}", type:"time"</#local>
        <#break>
    </#switch>

    <#local displayInputIdJs = escapeVal(displayInputId, 'js')>
    <#local inputIdJs = escapeVal(inputId, 'js')>

    <#local fdatepickerOptions>{showTodayButton:true${fdpExtraOpts}}</#local><#lt/>
    <@script htmlwrap=htmlwrap>
        $(function() {
            bulmaCalendar.attach('#${displayInputIdJs}', ${fdatepickerOptions});

            var $bulmaCalendar_${inputIdJs} = document.querySelector('#${displayInputIdJs}');
            if ($bulmaCalendar_${inputIdJs}) {
                $bulmaCalendar_${inputIdJs}.bulmaCalendar.on('save', function(datepicker) {
                    document.querySelector('#${inputIdJs}').value = datepicker.data.value();
                });
            }
        });
    </@script>
</#macro>

<#macro field_datefind_markup_widget id="" class="" style="" alert="" name="" localizedInputTitle="" value="" value2="" size="" maxlength="" dateType="" dateDisplayType="" dateDisplayFormat=""
formName="" defaultDateTimeString="" imgSrc="" localizedIconTitle="" titleClass="" defaultOptionFrom="" defaultOptionThru=""
opEquals="" opSameDay="" opGreaterThanFromDayStart="" opGreaterThan="" opLessThan="" opUpToDay="" opUpThruDay="" opIsEmpty=""
title="" tooltip="" inlineLabel=false inlinePostfix=false origLabel=origLabel required=false attribs={} origArgs={} passArgs={} catchArgs...>
    <#local class = addClassArg(class, styles.field_datefind_default!"")>
    <#local selectClass = styles.field_datefind_select_default!"">
    <#-- NOTE: values of localizedInputTitle are: uiLabelMap.CommonFormatDate/Time/DateTime -->
    <#-- Reuse the template-derived formats -->
    <#if !dateDisplayFormat?has_content>
        <#local dateDisplayFormat = getFieldDateDispFmtStd(dateDisplayType)>
    </#if>
    <#local displayInputId = "">
    <#local inputId = "">
    <#if id?has_content>
        <#local displayInputId = raw(id) + "_i18n">
        <#local inputId = id>
    </#if>
    <#local displayInputName = "">
    <#local inputName = "">
    <#if name?has_content>
        <#local displayInputName = raw(name) + "_fld0_i18n">
        <#local inputName = raw(name) + "_fld0_value">
    </#if>
    <#local opSelectName = "">
    <#if name?has_content>
        <#local opSelectName = raw(name) + "_fld0_op">
    </#if>
    <#if tooltip?has_content>
        <#local class = addClassArg(class, styles.field_datefind_tooltip!styles.field_default_tooltip!"")>
        <#local title = tooltip>
        <#local attribs = (styles.field_datefind_tooltip_attribs!styles.field_default_tooltip_attribs!{}) + attribs>
    <#elseif !title?has_content>
        <#local title = localizedInputTitle>
    </#if>
    <div class="field has-addons" data-date="">
        <div class="control is-expanded">
            <input type="text"<@fieldElemAttribStr attribs=attribs /><#if displayInputId?has_content> id="${escapeVal(displayInputId, 'html')}"</#if><#if displayInputName?has_content> name="${escapeVal(displayInputName, 'html')}"</#if><@fieldClassAttribStr class=class alert=alert /><#rt/>
            <#if title?has_content> title="${escapeVal(title, 'html')}"</#if><#if value?has_content> value="${escapeVal(value, 'html')}"</#if><#if size?has_content> size="${size}"</#if><#if maxlength?has_content> maxlength="${maxlength}"</#if><#rt/>/><#lt/>
            <input type="hidden"<#if inputId?has_content> id="${escapeVal(inputId, 'html')}"</#if><#if inputName?has_content> name="${escapeVal(inputName, 'html')}"</#if><#if value?has_content> value="${escapeVal(value, 'html')}"</#if>/>
        </div>
        <div class="control">
            <div class="select">
                <select<#if opSelectName?has_content> name="${escapeVal(opSelectName, 'html')}"</#if><#-- class="selectBox"-->>
                    <option value="equals"<#if defaultOptionFrom == "equals"> selected="selected"</#if>>${escapeVal(opEquals, 'htmlmarkup')}</option>
                    <option value="sameDay"<#if defaultOptionFrom == "sameDay"> selected="selected"</#if>>${escapeVal(opSameDay, 'htmlmarkup')}</option>
                    <option value="greaterThanFromDayStart"<#if defaultOptionFrom == "greaterThanFromDayStart"> selected="selected"</#if>>${escapeVal(opGreaterThanFromDayStart, 'htmlmarkup')}</option>
                    <option value="greaterThan"<#if defaultOptionFrom == "greaterThan"> selected="selected"</#if>>${escapeVal(opGreaterThan, 'htmlmarkup')}</option>
                </select>
            </div>
        </div>
    </div>
    <@field_datetime_markup_script inputId=inputId inputName=inputName displayInputId=displayInputId displayInputName=displayInputName dateType=dateType dateDisplayType=dateDisplayType
    required=required attribs=toSimpleMap(attribs) origArgs=origArgs passArgs=passArgs />
</#macro>

<#macro field_select_widget args={} inlineArgs...>
    <#local overrideDefaultClass = {}>
    <#local args = mergeArgMaps(args, inlineArgs, scipioStdTmplLib.field_select_widget_defaultArgs,overrideDefaultClass)>
    <#local dummy = localsPutAll(args)>
    <#if (!multiple?is_boolean && (multiple == "true" || multiple == "multiple" || multiple == "Y")) || (multiple?is_boolean && multiple)>
        <div class="select is-multiple">
    <#else>
        <div class="select">
    </#if>
        <@scipioStdTmplLib.field_select_widget args=args><#nested></@scipioStdTmplLib.field_select_widget>
    </div>
</#macro>

<#macro field_lookup_markup_widget name="" formName="" fieldFormName="" class="" alert="false" value="" size="" style=""
    maxlength="" id="" events={} readonly=false autocomplete="" descriptionFieldName=""
    targetParameterIter="" imgSrc="" ajaxUrl="" ajaxEnabled=false presentation="layer" width=""
    height="" position="" fadeBackground="true" clearText="" showDescription="" initiallyCollapsed=""
    lastViewName="main" title="" fieldTitleBlank=false inlineLabel=false inlinePostfix=false tooltip="" required=false attribs={} origArgs={} passArgs={} catchArgs...>
  <#--<#if Static["org.ofbiz.widget.model.ModelWidget"].widgetBoundaryCommentsEnabled(context)>
  </#if>-->
  <#local class = addClassArg(class, styles.field_lookup_default!"")>
  <#if tooltip?has_content>
    <#local class = addClassArg(class, styles.field_lookup_tooltip!styles.field_default_tooltip!"")>
    <#local title = tooltip>
    <#local attribs = (styles.field_lookup_tooltip_attribs!styles.field_default_tooltip_attribs!{}) + attribs>
  </#if>
  <#if (!ajaxUrl?has_content) && ajaxEnabled>
    <#local ajaxUrl = requestAttributes._REQUEST_HANDLER_.makeLink(request, response, raw(fieldFormName))/>
    <#local ajaxUrl = raw(id) + "," + raw(ajaxUrl) + ",ajaxLookup=Y" />
  </#if>
  <#if (!showDescription?has_content)>
    <#local showDescriptionProp = getPropertyValue("widget", "widget.lookup.showDescription")!"N">
    <#if "Y" == showDescriptionProp>
      <#local showDescription = "true" />
    <#else>
      <#local showDescription = "false" />
    </#if>
  </#if>
  <#if ajaxEnabled>
    <@script>
      jQuery(document).ready(function(){
        if (!jQuery('form[name="${escapeVal(formName, 'js')}"]').length) {
          alert("Developer: for lookups to work you must provide a form name!")
        }
      });
    </@script>
  </#if>
        <#if size?has_content && size=="0">
          <input type="hidden"<#if name?has_content> name="${escapeVal(name, 'html')}"</#if>/>
        <#else>
          <div class="field has-addons">
            <div class="control is-expanded">
              <input type="text"<@fieldElemAttribStr attribs=attribs /><@fieldClassAttribStr class=class alert=alert /><#if name?has_content> name="${escapeVal(name, 'html')}"</#if><#if value?has_content> value="${escapeVal(value, 'html')}"</#if><#if style?has_content> style="${escapeVal(style, 'html')}"</#if><#rt/>
                <#if size?has_content> size="${size}"</#if><#if maxlength?has_content> maxlength="${maxlength}"</#if><#if id?has_content> id="${escapeVal(id, 'html')}"</#if><#t/>
                <#if readonly?has_content && readonly> readonly="readonly"</#if><#if events?has_content><@commonElemEventAttribStr events=events /></#if><#t/>
                <#if autocomplete?has_content> autocomplete="off"</#if><#t/>
                <#if title?has_content> title="${escapeVal(title, 'html')}"</#if><#t/>
                <#if required> required="required"</#if><#t/>
                /></#if><#t/>
            </div>
            <div class="control">
                <#if presentation?has_content && descriptionFieldName?has_content && presentation == "window">
                      <a href="javascript:call_fieldlookup3(document['${escapeVal(formName, 'js-html')}']['${escapeVal(name, 'js-html')}'], <#rt/>
                          document['${escapeVal(formName, 'js-html')}']['${escapeVal(descriptionFieldName, 'js-html')}'], '${escapeVal(fieldFormName, 'js-html')}', '${escapeVal(presentation, 'js-html')}'<#t/>
                      <#if targetParameterIter?has_content>
                        <#list targetParameterIter as item>
                          ,document['${escapeVal(formName, 'js-html')}']['${escapeVal(item, 'js-html')}'].value <#t/>
                        </#list>
                      </#if>
                      );" class="button"></a><#rt/>
                <#elseif presentation?has_content && presentation == "window">
                        <a href="javascript:call_fieldlookup2(document['${escapeVal(formName, 'js-html')}']['${escapeVal(name, 'js-html')}'], '${escapeVal(fieldFormName, 'js-html')}', '${escapeVal(presentation, 'js-html')}'<#rt/>
                          <#if targetParameterIter?has_content>
                            <#list targetParameterIter as item>
                              ,document['${escapeVal(formName, 'js-html')}']['${escapeVal(item, 'js-html')}'].value<#t/>
                            </#list>
                          </#if>
                          );"  class="button"></a><#rt/>
                <#else>

                    <#local defaultMinLength = getPropertyValue("widget", "widget.autocompleter.defaultMinLength")!2>
                    <#local defaultDelay = getPropertyValue("widget", "widget.autocompleter.defaultDelay")!300>
                    <#local ajaxUrl = ajaxUrl + "&amp;_LAST_VIEW_NAME_=" + lastViewName />
                    <#if !ajaxUrl?contains("searchValueFieldName=")>
                      <#if descriptionFieldName?has_content && showDescription == "true">
                        <#local ajaxUrl = ajaxUrl + "&amp;searchValueFieldName=" + descriptionFieldName />
                      <#else>
                        <#local ajaxUrl = ajaxUrl + "&amp;searchValueFieldName=" + name />
                      </#if>
                    </#if>

                    <@script>
                    jQuery(document).ready(function(){
                      var options = {
                        requestUrl : "${escapeVal(fieldFormName, 'js')}",
                        inputFieldId : "${escapeVal(id, 'js')}",
                        dialogTarget : document['${escapeVal(formName, 'js')}']['${escapeVal(name, 'js')}'],
                        dialogOptionalTarget : <#if descriptionFieldName?has_content>document['${escapeVal(formName, 'js')}']['${escapeVal(descriptionFieldName, 'js')}']<#else>null</#if>,
                        formName : "${escapeVal(formName, 'js')}",
                        lookupId: '${escapeVal(id, 'js')}',
                        width : "${width}",
                        height : "${height}",
                        position : "topright",
                        modal : "true",
                        ajaxUrl : <#if ajaxEnabled>"${escapeFullUrl(ajaxUrl, 'js')}"<#else>""</#if>,
                        showDescription : <#if ajaxEnabled>"${showDescription}"<#else>false</#if>,
                        presentation : "${escapeVal(presentation, 'js')}",
                        defaultMinLength : "${defaultMinLength}",
                        defaultDelay : "${defaultDelay}",
                        args :
                            <#if targetParameterIter?has_content>
                              <#local isFirst = true>
                              [<#t/>
                              <#list targetParameterIter as item>
                                <#if isFirst>
                                  document['${escapeVal(formName, 'js')}']['${escapeVal(item, 'js')}']<#t/>
                                  <#local isFirst = false>
                                <#else>
                                  ,document['${escapeVal(formName, 'js')}']['${escapeVal(item, 'js')}']<#t/>
                                </#if>
                              </#list>
                              ]<#t/>
                            <#else>[]
                            </#if>
                      };
                      new Lookup(options).init();
                    });
                    </@script>
                    <a href="javascript:void(0);" id="${escapeVal(id, 'html')}_button"  class="button"><i class="fa fa-search"></i></a>
              </#if>
            </div>
            <#if readonly?has_content && readonly>
                <div class="control">
                    <a id="${escapeVal(id, 'html')}_clear"
                    style="background:none;margin-left:5px;margin-right:15px;"
                    class="clearField"
                    href="javascript:void(0);"
                    onclick="javascript:document['${escapeVal(formName, 'js-html')}']['${escapeVal(name, 'js-html')}'].value='';
                      jQuery('#' + jQuery('#${escapeVal(id, 'js-html')}_clear').next().attr('id').replace('_button','') + '_${escapeVal(id, 'js-html')}_lookupDescription').html('');
                      <#if descriptionFieldName?has_content>document['${escapeVal(formName, 'js-html')}']['${escapeVal(descriptionFieldName, 'js-html')}'].value='';</#if>">
                      <#if clearText?has_content>${escapeVal(clearText, 'htmlmarkup')}<#else>${escapeVal(uiLabelMap.CommonClear, 'htmlmarkup')}</#if>
                  </a>
                </div>
            </#if>
        </div>

      <#if (presentation?has_content && presentation == "window")>
        <#local defaultMinLength = getPropertyValue("widget", "widget.autocompleter.defaultMinLength")!2>
        <#local defaultDelay = getPropertyValue("widget", "widget.autocompleter.defaultDelay")!300>
        <#if ajaxUrl?index_of("_LAST_VIEW_NAME_") < 0>
          <#local ajaxUrl = ajaxUrl + "&amp;_LAST_VIEW_NAME_=" + lastViewName />
        </#if>
        <@script>ajaxAutoCompleter('${escapeFullUrl(ajaxUrl, 'js')}', ${showDescription}, ${defaultMinLength}, ${defaultDelay});</@script><#t/>
      </#if>
</#macro>

<#macro field_textfind_markup_widget name="" formName="" value="" defaultOption="" opEquals="" opBeginsWith="" opContains=""
opIsEmpty="" opNotEqual="" opLike="" class="" id="" style="" alert="" size="" maxlength="" autocomplete=true titleClass=""
hideIgnoreCase="" ignoreCase=false ignoreCaseMsg="" title="" tooltip="" fieldTitleBlank=false hideOptions=false inlineLabel=false
origLabel="" collapse=false required=false attribs={} origArgs={} passArgs={} catchArgs...>
    <#local class = addClassArg(class, styles.field_textfind_default!"")>
    <#local selectClass = styles.field_textfind_select_default!"">
    <#if tooltip?has_content>
        <#local class = addClassArg(class, styles.field_textfind_tooltip!styles.field_default_tooltip!"")>
        <#local title = tooltip>
        <#local attribs = (styles.field_textfind_tooltip_attribs!styles.field_default_tooltip_attribs!{}) + attribs>
    </#if>
    <#-- Get heuristic-based current container sizes -->
    <#local absColSizes = getAbsContainerSizeFactors()>
    <#-- we say the parent is large if the ratio is greater than 6 -->
    <#local isLargeParent = (absColSizes.large > 6)>
    <#-- NOTE: all the code below assumes that the parent containers are using only
      large-x classes to split the page or form into columns (e.g., large-6, not medium-6) -->
        <div class="field has-addons">
                <#if !hideOptions>
                    <#local newName = name/>
                        <div class="control">
                            <div class="select">
                                <select<#if name?has_content> name="${escapeVal(name, 'html')}_op"</#if><#if selectClass?has_content> class="${selectClass}"</#if>><#-- class="selectBox"-->
                                    <option value="equals"<#if defaultOption == "equals"> selected="selected"</#if>>${escapeVal(opEquals, 'htmlmarkup')}</option>
                                    <option value="contains"<#if defaultOption == "contains"> selected="selected"</#if>>${escapeVal(opContains, 'htmlmarkup')}</option>
                                    <option value="empty"<#if defaultOption == "empty"> selected="selected"</#if>>${escapeVal(opIsEmpty, 'htmlmarkup')}</option>
                                    <option value="notEqual"<#if defaultOption == "notEqual"> selected="selected"</#if>>${escapeVal(opNotEqual, 'htmlmarkup')}</option>
                                    <option value="like"<#if defaultOption == "like"> selected="selected"</#if>>${escapeVal(opBeginsWith, 'htmlmarkup')} (${escapeVal(opLike, 'htmlmarkup')})</option>
                                </select>
                            </div>
                        </div>
                <#else>
                    <input type="hidden"<#if name?has_content> name="${escapeVal(name, 'html')}_op"</#if> value="${escapeVal(defaultOption, 'html')}"/><#rt/>
                </#if>
                    <div class="control is-expanded">
                        <input type="text"<@fieldClassAttribStr class=class alert=alert /> name="${escapeVal(name, 'html')}"<#if value?has_content> value="${escapeVal(value, 'html')}"</#if><#rt/>
                        <#if size?has_content> size="${size}"</#if><#if maxlength?has_content> maxlength="${maxlength}"</#if><#if !autocomplete> autocomplete="off"</#if><#t/>
                        <@fieldElemAttribStr attribs=attribs /><#t/>
                        <#if title?has_content> title="${escapeVal(title, 'html')}"</#if>/><#t/>
                    </div>
            <#if hideIgnoreCase>
                <input type="hidden" name="${escapeVal(name, 'html')}_ic" value="<#if ignoreCase>Y<#else></#if>"/><#rt/>
            <#else>
                <div class="control">
                    <div class="field-label is-normal">
                        <label class="label " for="${escapeVal(name, 'html')}_ic"><input type="checkbox" id="${escapeVal(name, 'html')}_ic" name="${escapeVal(name, 'html')}_ic" value="Y"<#if ignoreCase> checked="checked"</#if>/>
                            ${escapeVal(ignoreCaseMsg, 'htmlmarkup')}</label>
                        <#rt/>
                    </div>
                </div>
            </#if>
        </div>
</#macro>

<#macro field_rangefind_markup_widget class="" id="" style="" alert="" name="" formName="" value="" size="" maxlength="" autocomplete=true titleClass=""
defaultOptionFrom="" opEquals="" opGreaterThan="" opGreaterThanEquals="" opLessThan="" opLessThanEquals="" opIsEmpty="" value2=""
defaultOptionThru="" title="" tooltip="" inlineLabel=false origLabel="" collapse=false required=false attribs={} origArgs={} passArgs={} catchArgs...>
    <#local class = addClassArg(class, styles.field_rangefind_default!"")>
    <#local selectClass = styles.field_rangefind_select_default!"">
    <#if tooltip?has_content>
        <#local class = addClassArg(class, styles.field_rangefind_tooltip!styles.field_default_tooltip!"")>
        <#local title = tooltip>
        <#local attribs = (styles.field_rangefind_tooltip_attribs!styles.field_default_tooltip_attribs!{}) + attribs>
    </#if>
    <#local class1="${styles.grid_small!}9 ${styles.grid_large!}9"/>
    <#local class2="${styles.grid_small!}3 ${styles.grid_large!}3"/>
    <div class="field has-addons">
        <div class="control is-expanded">
            <input type="text"<@fieldClassAttribStr class=class alert=alert /><#if name?has_content> name="${escapeVal(name, 'html')}_fld0_value"</#if><#rt/>
            <#if value?has_content> value="${escapeVal(value, 'html')}"</#if><#if size?has_content> size="${size}"</#if><#if maxlength?has_content> maxlength="${maxlength}"</#if><#t/>
            <#if !autocomplete> autocomplete="off"</#if><#t/>
            <@fieldElemAttribStr attribs=attribs /><#t/>
            <#if title?has_content> title="${escapeVal(title, 'html')}"</#if>/><#t/>

        </div>
         <div class="control">
            <div class="select">
            <select<#if name?has_content> name="${escapeVal(name, 'html')}_fld0_op"</#if><#if selectClass?has_content> class="${selectClass}"</#if>><#-- class="selectBox"-->
                <option value="equals"<#if defaultOptionFrom=="equals"> selected="selected"</#if>>${escapeVal(opEquals, 'htmlmarkup')}</option>
                <option value="greaterThan"<#if defaultOptionFrom=="greaterThan"> selected="selected"</#if>>${escapeVal(opGreaterThan, 'htmlmarkup')}</option>
                <option value="greaterThanEqualTo"<#if defaultOptionFrom=="greaterThanEqualTo"> selected="selected"</#if>>${escapeVal(opGreaterThanEquals, 'htmlmarkup')}</option>
            </select><#rt/>
            </div>
        </div>
            <#rt/>
        <div class="control is-expanded">
            <input type="text"<@fieldClassAttribStr class=class alert=alert /><#if name?has_content> name="${escapeVal(name, 'html')}_fld1_value"</#if><#rt/>
            <#if value2?has_content> value="${escapeVal(value2, 'html')}"</#if><#if size?has_content> size="${size}"</#if><#if maxlength?has_content> maxlength="${maxlength}"</#if><#t/>
            <#if !autocomplete> autocomplete="off"</#if><#t/>
            <@fieldElemAttribStr attribs=attribs /><#t/>
            <#if title?has_content> title="${escapeVal(title, 'html')}"</#if>/><#t/>
        </div>
        <div class="control">
            <div class="select">
                <select<#if name?has_content> name="${escapeVal(name, 'html')}_fld1_op"</#if><#if selectClass?has_content> class="${selectClass}"</#if>><#-- class="selectBox"-->
                    <option value="lessThan"<#if defaultOptionThru == "lessThan"> selected="selected"</#if>>${escapeVal(opLessThan, 'htmlmarkup')}</option>
                    <option value="lessThanEqualTo"<#if defaultOptionThru == "lessThanEqualTo"> selected="selected"</#if>>${escapeVal(opLessThanEquals, 'htmlmarkup')}</option>
                </select>
            </div>
        </div>
    </div>
</#macro>

<#-- save copy of this namespace so that our macros are able to access its own definitions without overrides (sometimes needed) -->
<#assign scipioMetroTmplLib = copyObject(.namespace)>