An error occurred while processing the template.
The following has evaluated to null or missing:
==> ddmFormFieldValue.getValue().getString(locale)  [in template "64612643129409#230641#235120" at line 17, column 32]

----
Tip: If the failing expression is known to legally refer to something that's sometimes null or missing, either specify a default value like myOptionalVar!myDefault, or use <#if myOptionalVar??>when-present<#else>when-missing</#if>. (These only cover the last step of the expression; to cover the whole expression, use parenthesis: (myOptionalVar.foo)!myDefault, (myOptionalVar.foo)??
----

----
FTL stack trace ("~" means nesting-related):
	- Failed at: #assign value = ddmFormFieldValue.get...  [in template "64612643129409#230641#235120" in function "getFieldValue" at line 17, column 17]
----
1<#setting url_escaping_charset='UTF-8'/> 
2<script src="//cdnjs.cloudflare.com/ajax/libs/luxon/1.25.0/luxon.min.js"></script> 
3 
4<#assign doubleComma ='"' /> 
5<#assign groupId = themeDisplay.getScopeGroupId() /> 
6<#assign commonServicesGroupConfiguration = ArenaConfigurationScopeManager.commonServicesGroupConfiguration(groupId) /> 
7<#assign commonServicesSystemConfiguration = ArenaConfigurationScopeManager.commonServicesSystemConfiguration() /> 
8<#assign openingHoursCustomerId = commonServicesGroupConfiguration.openingHoursCustomerId() /> 
9<#assign openingHoursApiEndpoint = commonServicesSystemConfiguration.openingHoursApiEndpoint() /> 
10<#assign customerId = doubleComma + openingHoursCustomerId + doubleComma /> 
11<#assign serviceEndpoint = doubleComma + openingHoursApiEndpoint + doubleComma /> 
12 
13<#function getFieldValue ddmFormFieldValues fieldReference> 
14    <#list ddmFormFieldValues as ddmFormFieldValue> 
15        <#if ddmFormFieldValue.getDDMFormField().getFieldReference()==fieldReference> 
16            <#if (ddmFormFieldValue.getValue())??> 
17                <#assign value=ddmFormFieldValue.getValue().getString(locale) /> 
18                <#return value /> 
19            <#else> 
20                <#return null /> 
21            </#if> 
22        </#if> 
23    </#list> 
24    <#return null /> 
25</#function> 
26 
27<script> 
28	<#-- check if array exists, otherwise create it --> 
29	var branchNames = branchNames || []; 
30	var branchNamesCount = branchNames.length; 
31	<#-- increase counter with one unless it´s zero --> 
32	var branchNamesCount = branchNamesCount == 0 ? branchNamesCount : branchNamesCount++; 
33 
34	<#-- create a new array in the array --> 
35	branchNames[branchNamesCount] = []; 
36	var branchName = []; 
37	<#list entries as entry> 
38	<#assign assetRenderer = entry.getAssetRenderer() /> 
39	<#assign className = assetRenderer.getClassName() /> 
40	<#assign ddmFormValuesReader = assetRenderer.getDDMFormValuesReader() /> 
41	<#assign ddmFormFieldValues = ddmFormValuesReader.getDDMFormValues().getDDMFormFieldValues() /> 
42	<#assign title = assetRenderer.getTitle(locale) /> 
43	<#assign branchName = getFieldValue(ddmFormFieldValues, 'libraryName')! /> 
44	<#assign entry = entry /> 
45	branchNames[branchNamesCount].push("${branchName}"); 
46	</#list> 
47</script> 
48<script> 
49	function arenaOpeningHoursAllBranchesInit() { 
50		for(var i = 0; i < branchNames.length; i++) { 
51			branchNames[i].forEach(displayOpeningHours); 
52
53
54	function displayOpeningHours(value) { 
55		var calendar = new openingHoursAllBranches.Calendar( 
56
57				instanceId: value.replace(/[ÄäÅå]/g, 'a').replace(/[Öö]/g, 'o').replace(/ /g, '-').replace(/,/g, '-').toLowerCase(), 
58				customerId: ${customerId}, 
59				openingHoursServiceEndpoint: ${serviceEndpoint}, 
60				municipalities: [{name: value,libraries: [{name: value}]}] 
61
62		); 
63		calendar.show(); 
64
65</script> 
66 
67<#list entries as entry> 
68    <#if !entries?has_content> 
69        <div class="alert alert-info"> 
70            <@liferay_ui["message"] key="there-are-no-results" /> 
71        </div> 
72    </#if> 
73    <#assign entry = entry /> 
74    <#assign assetRenderer = entry.getAssetRenderer() /> 
75    <#assign className = assetRenderer.getClassName() /> 
76    <#assign ddmFormValuesReader = assetRenderer.getDDMFormValuesReader() /> 
77    <#assign ddmFormFieldValues = ddmFormValuesReader.getDDMFormValues().getDDMFormFieldValues() /> 
78    <#assign entryTitle = assetRenderer.getTitle(locale) /> 
79    <#assign branchId = getFieldValue(ddmFormFieldValues, 'libraryName')! /> 
80    <#assign viewURL = assetPublisherHelper.getAssetViewURL(renderRequest, renderResponse, entry,!stringUtil.equals(assetLinkBehavior, "showFullContent")) /> 
81    <#assign viewURL = assetRenderer.getURLViewInContext(renderRequest, renderResponse, viewURL) /> 
82    <#assign categories = entry.getCategories() /> 
83    <#assign eventRoute = getEventRoute(categories) /> 
84    <#assign viewURL = viewURL+eventRoute /> 
85 
86    <div class="asset-abstract "> 
87        <div class="asset-actions lfr-meta-actions"><@getEditIcon /></div> 
88        <h2 class="asset-title">${entryTitle}</h2> 
89        <div class="asset-content "> 
90            <article class="branch-container branch-${entryTitle?replace('Ä', 'a')?replace('ä', 'a')?replace('Å', 'a')?replace('å', 'a')?replace('Ö', 'o')?replace('ö', 'o')?replace(' ', '-')?lower_case}"> 
91                <div class="openinghours-card"> 
92                    <div id="${branchId?replace('Ä', 'a')?replace('ä', 'a')?replace('Å', 'a')?replace('å', 'a')?replace('Ö', 'o')?replace('ö', 'o')?replace(' ', '-')?lower_case}-dynamic-cal-wrapper" class="row"> 
93                        <div class="dynamic-cal-events"> 
94                            <div class="dynamic-cal-loader"> 
95                            </div> 
96                        </div> 
97                    </div> 
98                </div> 
99            </article> 
100            <div class="more-opening-hours"> 
101                <a class="asset-abstract-link" href="${viewURL}"><span> 
102                <@liferay.language_format arguments="${entryTitle}" key="branch.opening.hours-view-all" /></span> </a> 
103            </div> 
104        </div> 
105    </div> 
106 
107</#list> 
108 
109<#function getEventRoute categories> 
110    <#assign searchQuery=''/> 
111    <#if categories?has_content> 
112        <#list categories as category> 
113            <#if searchQuery?has_content> 
114                <#assign searchQuery=searchQuery+"&location="+category.getName()?url /> 
115            <#else> 
116                <#assign searchQuery="#/?location="+category.getName()?url /> 
117            </#if> 
118        </#list> 
119    </#if> 
120    <#return searchQuery> 
121</#function> 
122 
123<#macro getEditIcon> 
124    <#if assetRenderer.hasEditPermission(themeDisplay.getPermissionChecker())> 
125        <#assign redirectURL = renderResponse.createRenderURL() /> 
126 
127        ${redirectURL.setParameter("struts_action", "/asset_publisher/add_asset_redirect")} 
128        ${redirectURL.setWindowState("pop_up")} 
129 
130        <#assign editPortletURL = assetRenderer.getURLEdit(renderRequest, renderResponse, windowStateFactory.getWindowState("pop_up"), redirectURL) /> 
131 
132        <#if validator.isNotNull(editPortletURL)> 
133            <#assign title = languageUtil.format(locale, "edit-x", htmlUtil.escape(assetRenderer.getTitle(locale))) /> 
134 
135            <@liferay_ui["icon"] 
136            <#--image="edit"--> 
137            iconCssClass="icon-edit" 
138            message=title 
139            url="javascript:Liferay.Util.openWindow({dialog: {destroyOnHide: true, width: 960}, id:'" + renderResponse.getNamespace() + "editAsset', title: '" + title + "', uri:'" + htmlUtil.escapeURL(editPortletURL.toString()) + "'});" 
140            /> 
141        </#if> 
142    </#if> 
143</#macro>