The following has evaluated to null or missing:
==> restClient.get(
"/bap-common-headless-service/v1.0/product-nav/categories" +
"?groupId=${groupId}" +
"&vocabularyName=${vocabularyName}" +
"&languageId=${languageId}"
).items [in template "20097#20123#649649" at line 15, column 5]
----
Tip: It's the step after the last dot that caused this error, not those before it.
----
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 listAssetCategory = restClien... [in template "20097#20123#649649" at line 14, column 1]
----
1<#assign countryCode = locale.getCountry()?lower_case>
2<#assign storedVehicles = []>
3<#assign selctedVehicle = "">
4
5<#assign groupId = themeDisplay.getCompanyGroupId() />
6<#assign languageId = themeDisplay.getLanguageId() />
7
8<#if countryCode == "mx">
9 <#assign vocabularyName = "product categories mx" />
10<#else>
11 <#assign vocabularyName = "product categories" />
12</#if>
13
14<#assign listAssetCategory =
15 restClient.get(
16 "/bap-common-headless-service/v1.0/product-nav/categories" +
17 "?groupId=${groupId}" +
18 "&vocabularyName=${vocabularyName}" +
19 "&languageId=${languageId}"
20 ).items
21/>
22
23<#assign siteUrl = themeDisplay.getScopeGroup().getFriendlyURL()>
24<#assign pageURL = themeDisplay.getLayout().getFriendlyURL()>
25<#assign categoryBaseUrl = propsUtil.get("category-page-base-url")>
26<#assign productsPageUrl = propsUtil.get("products-page-url-"+themeDisplay.getLanguageId())>
27
28<div id="bap-navigation" role="navigation">
29 <#if entries?has_content>
30 <div id="main-nav-container">
31 <div id="parent-nav-container" class="container">
32
33 <div class="navbar-expand-md navbar-light ">
34 <div class="navbar-toggler-container">
35 <button class="navbar-toggler" id="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
36 <i class="bap-icon bap-list-view-mobile"> </i>
37 </button>
38
39 <button type="button" id="close" class="close" aria-label="Close">
40 <i class="bap-icon bap-close" aria-hidden="true"> </i>
41 </button>
42 </div>
43 <a
44 href="${themeDisplay.getPortalURL()}"
45 class="auto-parts"
46 >
47 <@liferay.language key="label-auto-parts" />
48 </a>
49 </div>
50 <div class="border-bottom-mob" id="nav-mob-line" style="display:none" ></div>
51
52 <ul class="nav nav-tabs d-none d-lg-block" id="myTab" role="list">
53 <li class="nav-item" onClick="openSecondLevel('Products')">
54 <a
55 class="nav-link"
56 id="products-tab"
57 data-toggle="tab"
58 href="#bap-products"
59 >
60 <span><@liferay.language key="label-products" /></span>
61 <i class="bap-icon bap-right"> </i>
62 </a>
63 </li>
64
65 <#list entries as entry>
66 <#if entry.hasChildren()>
67 <li class="nav-item" onClick="openSecondLevel('${entry.getName()}')" >
68 <a
69
70 class="nav-link"
71 id="${entry.getName()?replace(' ', '')?lower_case}-tab"
72 data-toggle="tab"
73 href="#${entry.getName()?replace(' ', '')?lower_case}"
74 >
75
76 <span>${entry.getName()}</span>
77 <i class="bap-icon bap-right"> </i>
78 </a>
79 </li>
80 <#else>
81 <#assign
82 active_class = ""
83 />
84
85 <#if pageURL?replace('/', '')?lower_case == entry.getName()?lower_case >
86 <#assign
87 active_class = "active"
88 />
89 </#if>
90
91 <li class="nav-item">
92 <a
93 onClick="performAnalyticsNavigation('${entry.getName()}','')"
94 class="nav-link ${active_class}"
95 ${entry.getTarget()}
96 id="${entry.getName()?replace(' ', '')?lower_case}-tab"
97 href="${entry.getURL()}"
98 >${entry.getName()}</a>
99 </li>
100 </#if>
101 </#list>
102 <li class="auto-parts-lg">
103 <a
104 href="${themeDisplay.getPortalURL()}"
105 class="auto-parts"
106 >
107 <@liferay.language key="label-auto-parts" />
108 </a>
109 </li>
110 </ul>
111 </div>
112 </div>
113 </#if>
114 <div id="child-nav-container" class="container">
115 <div class="tab-content">
116 <#if entries?has_content>
117
118 <#list entries as entry>
119 <div class="tab-pane fade" id="${entry.getName()?replace(' ', '')?lower_case}" role="tabpanel" aria-labelledby="${entry.getName()?replace(' ', '')?lower_case}">
120 <#list entry.getChildren()?chunk(4) as row>
121 <div class="row col-md-12">
122 <#list row as page>
123 <div class="col-md-3">
124 <#if page.hasChildren()>
125 <a id="${page.getName()?replace(' ', '')?lower_case}-tab"
126 href="#${page.getName()?replace(' ', '')?lower_case}-pane"
127 data-toggle="tab"
128 onClick="performAnalyticsNavigation('${entry.getName()}','${page.getName()}')"
129 >
130 <span>${page.getName()}</span>
131 <i class="bap-icon bap-right"> </i>
132 </a>
133 <#else>
134 <a
135 onClick="performAnalyticsNavigation('${entry.getName()}','${page.getName()}')"
136 id="${page.getName()?replace(' ', '')?lower_case}-tab" ${page.getTarget()}
137 href="${page.getURL()}"
138 >${page.getName()}</a>
139 </#if>
140 </div>
141 </#list>
142 </div>
143 </#list>
144 </div>
145 </#list>
146
147 <#list entries as entry>
148 <#list entry.getChildren() as child>
149 <div class="tab-pane fade" id="${child.getName()?replace(' ', '')?lower_case}-pane" role="tabpanel" aria-labelledby="${child.getName()?replace(' ', '')?lower_case}">
150 <div class="row col-md-12">
151 <div class="col-md-3">
152 <a href="#${entry.getName()?replace(' ', '')?lower_case}"
153 data-toggle="tab"
154 >${child.getName()}</a>
155 </div>
156 </div>
157 <#list child.getChildren()?chunk(4) as row>
158 <div class="row col-md-12">
159 <#list row as grandchild>
160 <div class="col-md-3">
161 <a href="${grandchild.getURL()}" ${grandchild.getTarget()}>${grandchild.getName()}</a>
162 </div>
163 </#list>
164 </div>
165 </#list>
166 </div>
167 </#list>
168 </#list>
169
170 </#if>
171
172 <#-- TOP LEVEL PRODUCT NAV -->
173
174 <div class="tab-pane fade" id="bap-products" role="tabpanel" aria-labelledby="products">
175 <div class="row">
176 <div class="col-md-12 back-icon-mobile">
177 <a id="back-close">
178 <i class="bap-icon bap-arrow-left"> </i>
179 </a>
180 </div>
181 <#list listAssetCategory as assetCategory>
182 <#if assetCategory.parentCategoryId == 0 >
183 <div class="col-md-3">
184 <#if assetCategory.leafNode>
185 <a onClick="performAnalyticsNavigation('Products','${assetCategory.name}')" href="${categoryBaseUrl}${assetCategory.url}"
186 >${assetCategory.name}</a>
187 <#else>
188 <a onClick="performAnalyticsNavigation('Products','${assetCategory.name}')" href="#${assetCategory.name?replace(' ', '')?lower_case}-pane"
189 data-toggle="tab"
190 >
191 <span>${assetCategory.name}</span>
192 <i class="bap-icon bap-right"> </i>
193 </a>
194 </#if>
195
196 </div>
197 </#if>
198 </#list>
199 <div class="col-md-12 view-all-link">
200 <a class="catalog-url" href="${productsPageUrl}">
201 <span><@liferay.language key="label-view-all" /></span> <i class="bap-icon bap-right"> </i>
202 </a>
203 </div>
204 </div>
205 </div>
206
207 <#-- SECONDARY LEVEL PRODUCT NAV -->
208
209 <#list listAssetCategory as assetCategory>
210 <#if assetCategory.parentCategoryId == 0 >
211 <div class="tab-pane fade" id="${assetCategory.name?replace(' ', '')?lower_case}-pane" role="tabpanel" aria-labelledby="${assetCategory.name?replace(' ', '')?lower_case}">
212 <div class="row">
213 <div class="back-icon">
214 <a class="tertiary-back-arrow"
215 href="#bap-products"
216 data-toggle="tab"
217 > <i class="bap-icon bap-left"> </i> </a>
218 <a class="tertiary-back-data"
219 href="${categoryBaseUrl}${assetCategory.url}"
220 > ${assetCategory.name}</a>
221 </div>
222 </div>
223 <div class="back-icon-mobile">
224 <div class="row">
225 <a
226 href="#bap-products"
227 data-toggle="tab"
228 >
229 <i class="bap-icon bap-arrow-left"> </i>
230 </a>
231 <a class="tertiary-back-data"
232 href="${categoryBaseUrl}${assetCategory.url}"
233 > ${assetCategory.name}</a>
234 </div>
235 </div>
236 <div class="row">
237 <#list listAssetCategory as childAssetCategory>
238 <#if childAssetCategory.parentCategoryId == assetCategory.categoryId >
239 <div class="col-md-3">
240 <a href="${categoryBaseUrl}${childAssetCategory.url}">${childAssetCategory.name}</a>
241 </div>
242 </#if>
243 </#list>
244 </div>
245 </div>
246 </#if>
247 </#list>
248 </div>
249 </div>
250</div>
251
252<script>
253 $(function() {
254
255
256
257 $('.tab-pane a').on('click', function(){
258 $('.tab-pane a').removeClass('active');
259 });
260
261
262 $('#navbar-toggler').on('click', function(){
263 handleHamburgerButton();
264 });
265
266
267 $('.nav-item').on('click', function(){
268 if ( $('#myTab').css('display') == 'none' || $('#myTab').css("visibility") == "hidden"){
269 $('#myTab').removeClass("d-none d-lg-block");
270 }else{
271 $('#myTab').addClass("d-none d-lg-block");
272 }
273
274 $('.tab-content').show();
275 $('#navbar-toggler').hide();
276 $('#close').show();
277 $("#nav-mob-line").hide();
278
279 //Priti
280 if($('#bap-products.active').length > 0){
281 $("#main-nav-container").removeClass("bottom-border");
282 }
283 else{
284 $("#main-nav-container").addClass("bottom-border");
285 }
286 });
287
288
289 $('#close').on('click', function(){
290 handleCloseButton();
291 });
292
293 $('#back-close').on('click', function(){
294 handleBackButton();
295 });
296
297 $('#bap-navigation a').on('click', function() {
298 if (window.matchMedia('screen and (max-width: 768px)').matches) {
299 $(window).scrollTop($('#bap-navigation').offset().top - 50);
300 }
301 });
302 });
303
304 function getSelectedVehicle(){
305
306 var countryCode = "${countryCode}" ;
307 var storedVehicles = [];
308 var selctedVehicleName = '';
309 if(countryCode == 'mx'){
310 if( window.localStorage.getItem("bap.vehicles_mx") !== null){
311 storedVehicles = window.localStorage.getItem("bap.vehicles_mx");
312 }
313 }
314 else{
315 if( window.localStorage.getItem("bap.vehicles") !== null){
316 storedVehicles = window.localStorage.getItem("bap.vehicles")
317 }
318 }
319
320 if(storedVehicles.length > 0){
321
322 let selectedVehicle = JSON.parse(storedVehicles).filter(function (e) {
323 return e.active == true;
324 });
325 if(selectedVehicle.length > 0){
326 selctedVehicleName = selectedVehicle[0].vehicleName;
327 }
328
329 }
330 return selctedVehicleName;
331 }
332
333 function performAnalyticsNavigation(category,subCategory){
334 //debugger;
335 var selectedVehicalName = getSelectedVehicle();
336 //alert("selectedVehicalName=="+selectedVehicalName +" category=="+category+" subCategory=="+subCategory);
337 window.dataLayer = window.dataLayer || [];
338 dataLayer.push({
339 'event': 'navigation',
340 'navi_category': category, //e.g.:products
341 'navi_subcategory': subCategory, //e.g.:brakes
342 'vehicle': selectedVehicalName //e.g.:2020 Ford EcoSport 1.0L L3 GAS
343 });
344 }
345
346 function handleHamburgerButton(){
347 if ( $('#myTab').css('display') == 'none' || $('#myTab').css("visibility") == "hidden"){
348 $('#myTab').removeClass("d-none d-lg-block");
349 $("#nav-mob-line").show();
350 }else{
351 $('#myTab').addClass("d-none d-lg-block");
352 $("#nav-mob-line").hide();
353 }
354 $('.tab-content').hide();
355 }
356
357 function handleCloseButton(){
358 if($(window).width() < 767){
359 $('.nav-link.active').removeClass("active");
360 $('.tab-pane.fade.active.show').removeClass("active show");
361 $('#navbar-toggler').show();
362 $('#close').hide();
363 $("#main-nav-container").removeClass("bottom-border");
364 }
365 }
366
367 function handleBackButton(){
368 if($(window).width() < 767){
369 $('.nav-link.active').removeClass("active");
370 $('.tab-pane.fade.active.show').removeClass("active show");
371 $('#myTab').removeClass("d-none d-md-block");
372 $('#navbar-toggler').show();
373 $('#close').hide();
374 $("#nav-mob-line").show();
375 $("#main-nav-container").removeClass("bottom-border");
376 }
377 }
378
379 function openSecondLevel(category){
380 performAnalyticsNavigation(category,'')
381 $('#navbar-toggler').hide();
382 $('#close').show();
383 }
384
385 $(document).on('click', '#bap-navigation .nav-link.active', function() {
386 var href = $(this).attr('href').substring(1);
387 $(this).toggleClass('active');
388 $('.tab-pane[id="' + href + '"]').removeClass('active');
389 $(".tab-content").find(".tab-pane.fade.active").removeClass('active');
390 if($(window).width() > 767){
391 $("#main-nav-container").removeClass("bottom-border");
392 }
393 });
394
395 $(document).mouseup(function(e)
396 {
397 var parentNavContainer = $("#parent-nav-container");
398 var childNavContainer = $("#child-nav-container");
399
400 if (!parentNavContainer.is(e.target) && parentNavContainer.has(e.target).length === 0
401 && !childNavContainer.is(e.target) && childNavContainer.has(e.target).length === 0
402 )
403 {
404 $("#products-tab").removeClass('active');
405 $("#main-nav-container").removeClass("bottom-border");
406 $('#myTab').addClass("d-none d-lg-block");
407 $("#nav-mob-line").hide();
408 $("#bap-navigation .tab-content").find(".tab-pane.fade.active").removeClass('active');
409 }
410 });
411
412</script>