Une erreur inattendue s'est produite
Une erreur inattendue s'est produite
Our Featured Products
Une erreur inattendue s'est produite
Une erreur inattendue s'est produite
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>
Please enter a valid video URL.
The URL can point to any video file or a Youtube video.