Search
An error occurred while processing the template.
The following has evaluated to null or missing:
==> response.parentTaxonomyVocabulary [in template "49724393377863#35335#1658362" at line 434, column 71]
----
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: #if response.parentTaxonomyVocabulary... [in template "49724393377863#35335#1658362" at line 434, column 66]
----
1<#assign
2defaultImgMap = {
3 "Default": {
4 "image": "/documents/d/guest/default_logo.png",
5 "color": "gray"
6 },
7 "Livestream": {
8 "image": "/documents/d/guest/icon-desktop-svg",
9 "color": "purple"
10 },
11 "Recorded":{
12 "image": "/documents/d/guest/icon-play",
13 "color": "red"
14 },
15 "In Person":{
16 "image": "/documents/d/guest/icon-persons",
17 "color": "green"
18 },
19 "Download": {
20 "image": "/documents/d/guest/icon-download-black",
21 "color": "border-color"
22 },
23 "Self-paced": {
24 "image": "/documents/d/guest/icon-mouse-white",
25 "color": "black"
26 },
27 "Bank subscription": {
28 "image": "/documents/d/guest/icon-bank",
29 "color": "blue"
30 }
31 }
32/>
33<script>
34 const urlParams = new URLSearchParams(window.location.search);
35 const sortBy = urlParams.get('sort');
36 console.log('sort: ' + sortBy);
37</script>
38<div class="c-mb-4 c-mt-4 search-total-label">
39 <#if searchContainer.getTotal() == 1>
40 ${languageUtil.format(locale, "x-result-for-x", [searchContainer.getTotal(), "<strong class='ms-1'>" + htmlUtil.escape(searchResultsPortletDisplayContext.getKeywords()) + "</strong>"], false)}
41 <#else>
42 ${languageUtil.format(locale, "x-results-for-x", [searchContainer.getTotal(), "<strong class='ms-1'>" + htmlUtil.escape(searchResultsPortletDisplayContext.getKeywords()) + "</strong>"], false)}
43 </#if>
44 <span class="text-separator mx-2">|</span>
45 <div class="search-sorting-dropdown-ib">
46 <button class="search-dropdown-toggle" data-toggle="dropdown" type="button">
47 Sort By: <span class="current-sorting-value">Relevance</span>
48 <svg class="lexicon-icon lexicon-icon-caret-double-l" role="presentation"><use xlink:href="https://www.icba.org/o/classic-theme/images/clay/icons.svg#caret-double-l" /></svg>
49 </button>
50 <div class="search-dropdown-menu">
51 <a class="dropdown-item transition-link sortWidgetOptions" id="" style="secondary" href="#" data-href="relevance">Relevance</a>
52 <a class="dropdown-item transition-link sortWidgetOptions" id="-low-to-high" style="secondary" href="#" data-href="title+">Name (ascending)</a>
53 <a class="dropdown-item transition-link sortWidgetOptions" id="-low-to-high" style="secondary" href="#" data-href="title-">Name (descending)</a>
54 <a class="dropdown-item transition-link sortWidgetOptions" id="-low-to-high" style="secondary" href="#" data-href="ddmFieldArray.ddm__keyword__45357__publicationDate_en_US.ddmFieldValueKeyword_en_US_String_sortable-">Newest Publication Date</a>
55 <a class="dropdown-item transition-link sortWidgetOptions" id="-high-to-low" style="secondary" href="#" data-href="ddmFieldArray.ddm__keyword__45357__publicationDate_en_US.ddmFieldValueKeyword_en_US_String_sortable+">Oldest Publication Date</a>
56 <a class="dropdown-item transition-link sortWidgetOptions" id="-low-to-high" style="secondary" href="#" data-href="publishDate-">Date Published (newest first)</a>
57 <a class="dropdown-item transition-link sortWidgetOptions" id="-high-to-low" style="secondary" href="#" data-href="publishDate+">Date Published (oldest first)</a>
58
59 </div>
60 </div>
61 </div>
62
63<#assign
64categoryMap = {
65 "webinar": {
66 "label": "Webinar"
67 },
68 "conference": {
69 "label": "Conference"
70 },
71 "institute": {
72 "label": "Institute"
73 },
74 "learning lab": {
75 "label": "Learning lab"
76 },
77 "lunch & learn": {
78 "label": "Lunch & learn"
79 },
80 "roundtable": {
81 "label": "Roundtable"
82 },
83 "seminar": {
84 "label": "Seminar"
85 },
86 "whiteboarding": {
87 "label": "Whiteboarding"
88 }
89}
90/>
91
92<#assign endDate = "null"/>
93<#assign endTime = "null"/>
94<#assign startDate = "null"/>
95<#assign startTime = "null"/>
96<#assign modelResourceValue= ""/>
97<#assign cpeCredits = "null"/>
98<#assign locationCity = "null"/>
99<#assign locationState = "null"/>
100<div class="search-results__results">
101 <#assign index = 0/>
102 <#if entries?has_content>
103 <#list entries as entry>
104 <#assign entryDocument = searchResultsPortletDisplayContext.getDocuments()[index] />
105 <#assign index ++ />
106<!-- Other Lookup -->
107<p>
108 <#if entryDocument.getField("expando__keyword__custom_fields__CPE Credits")?has_content >
109 <#assign cpeCredits = entryDocument.getField("expando__keyword__custom_fields__CPE Credits").getValue()/>
110 </#if>
111 </p>
112 <p>
113 <#if entryDocument.getField("expando__keyword__custom_fields__Location City")?has_content >
114 <#assign locationCity = entryDocument.getField("expando__keyword__custom_fields__Location City").getValue()/>
115 </#if>
116 </p>
117 <p>
118 <#if entryDocument.getField("expando__keyword__custom_fields__Location State")?has_content >
119 <#assign locationState = entryDocument.getField("expando__keyword__custom_fields__Location State").getValue()/>
120 </#if>
121 </p>
122 <p>
123 <#if entryDocument.getField("expando__keyword__custom_fields__Event End Date")?has_content >
124 <#assign endDates = entryDocument.getField("expando__keyword__custom_fields__Event End Date").getValue()?datetime("yyyyMMddHHmmss")/>
125 <#assign myDate = endDates>
126 <#assign today = .now?datetime>
127 <#if !(myDate < today)>
128 <#assign endDate = endDates?string("MMM dd, yyyy")/>
129 <#assign endTime = endDates?string("hh:mm a")/>
130 </#if>
131 </#if>
132 </p>
133 <p>
134 <#if entryDocument.getField("expando__keyword__custom_fields__Event Start Date")?has_content >
135 <#assign startDates = entryDocument.getField("expando__keyword__custom_fields__Event Start Date").getValue()?datetime("yyyyMMddHHmmss")/>
136 <#assign myDate = startDates>
137 <#assign today = .now?datetime>
138
139 <#if !(myDate < today)>
140 <#assign startDate = startDates?string("MMM dd, yyyy")/>
141 <#assign startTime = startDates?string("hh:mm")/>
142 </#if>
143 </#if>
144 </p>
145 <div>
146 <#if entryDocument.getField("assetCategoryIds")?has_content >
147 <#list entryDocument.getField("assetCategoryIds").getValues() as categoryId>
148
149 </#list>
150 </#if>
151 </div>
152 <#assign matchedCategories = [] />
153 <#assign matchedEventCategories = [] />
154 <div>
155 <#if entryDocument.getField("assetCategoryTitles_en_US")?has_content>
156 <#assign categoryTitle = entryDocument.getField("assetCategoryTitles_en_US").getValues()/>
157 <#assign categoryList = categoryTitle?join(", ") />
158 <#assign categoryArray = categoryList?split(",") />
159
160 <#list categoryArray as category>
161 <#assign cleanCategory = category?trim />
162 <#if defaultImgMap[cleanCategory]?has_content>
163 <#assign match = {
164 "name": cleanCategory,
165 "image": defaultImgMap[cleanCategory]["image"],
166 "color": defaultImgMap[cleanCategory]["color"]
167 } />
168 <#assign matchedCategories = matchedCategories + [match] />
169 </#if>
170 </#list>
171 </#if>
172 <#if entryDocument.getField("assetCategoryTitles_en_US")?has_content>
173 <#assign eventCategoryTitle = entryDocument.getField("assetCategoryTitles_en_US").getValues()/>
174 <#assign eventCategoryList = eventCategoryTitle?join(", ") />
175 <#assign eventCategoryArray = eventCategoryList?split(",") />
176 <#list eventCategoryArray as events>
177 <#assign cleanEventCategory = events?trim />
178 <#if categoryMap[cleanEventCategory]?has_content>
179 <#assign match = {
180 "name": cleanEventCategory,
181 "label": categoryMap[cleanEventCategory]["label"]
182 } />
183 <#assign matchedEventCategories = matchedEventCategories + [match] />
184 </#if>
185 </#list>
186 </#if>
187 </div>
188
189 <div>
190 <#assign tagArray = [] />
191 <#if entryDocument.getField("assetTagNames")?has_content >
192 <#assign tagTitle = entryDocument.getField("assetTagNames").getValues()/>
193 <#assign tagList = tagTitle?join(", ") />
194 <#assign tagArray = tagList?split(",") />
195 </#if>
196 </div>
197 <div>
198 <#if entryDocument.getField("assetTagIds")?has_content >
199 <#list entryDocument.getField("assetTagIds").getValues() as assetTagId>
200
201 </#list>
202 </#if>
203 </div>
204
205 <#if entry.isModelResourceVisible()>
206 <#assign modelResourceValue = entry.getModelResource()/>
207 </#if>
208<!-- -->
209 <div class="card overflow-hidden bg-white">
210 <div class="card-body d-flex flex-column align-items-start gap-3">
211 <#if modelResourceValue == "Document">
212 <div class="autofit-col">
213 <#if entry.isThumbnailVisible()>
214 <span class="sticker">
215 <span class="sticker-overlay">
216 <img
217 alt="${languageUtil.get(locale, "thumbnail")}"
218 class="sticker-img"
219 src="${entry.getThumbnailURLString()}"
220 />
221 </span>
222 </span>
223 <#elseif entry.isUserPortraitVisible() && stringUtil.equals(entry.getClassName(), userClassName)>
224 <@liferay_ui["user-portrait"] userId=entry.getAssetEntryUserId() />
225 <#elseif entry.isIconVisible()>
226 <span class="sticker sticker-rounded sticker-secondary sticker-static">
227 <@clay.icon symbol="${entry.getIconId()}" />
228 </span>
229 </#if>
230 </div>
231 </#if>
232
233 <#if matchedCategories?has_content>
234 <div class="card-badges d-flex align-items-start gap-4">
235 <div class="d-inline-flex align-items-center gap-2 text-black fs-7 fw-semibold">
236 <#list matchedCategories as item>
237 <div class="bg-${item.color} rounded-bottom-4 py-1 px-3 me-2 text-center">
238 <img src="${item.image}" alt="" class="category-img bg-${item.color}" />
239 <span>${item.name?cap_first}</span>
240 </div>
241 </#list>
242 </div>
243 </div>
244 </#if>
245 <h2 class="card-title m-0 fw-normal">
246
247 <!-- BEGIN GATED CONTENT CHECK -->
248
249 <#assign viewUrl = entry.getViewURL() />
250
251 <#assign gatedContentUrl = "/e/gated-article-check/"+portal.getClassNameId(entry.getClassName())+"/"+entry.getClassPK()+"?p_l_back_url="+urlCodec.encodeURL(searchContainer.getIteratorURL())+"&p_l_back_url_title=Search+Articles" />
252
253 <#if entryDocument.getField("assetCategoryTitles_en_US")?has_content>
254 <#assign categoryTitle = entryDocument.getField("assetCategoryTitles_en_US").getValues()/>
255 <#assign categoryList = categoryTitle?join(",") />
256 <#assign categoryArray = categoryList?split(",") />
257 </#if>
258 <#if categoryArray?has_content >
259 <#assign isGatedContent = (categoryArray?seq_contains("gated")) />
260 <#assign hasPermissionToGatedContent = false />
261
262 <#if isGatedContent >
263 <#if themeDisplay.isSignedIn() >
264 <#assign usersUserGroupsUrl = "/headless-admin-user/v1.0/user-accounts/"+themeDisplay.getUserId()+"/user-groups" />
265 <#assign usersUserGroups = restClient.get(usersUserGroupsUrl) />
266
267 <#if usersUserGroups??>
268 <#list usersUserGroups.items as userGroup>
269 <#if hasPermissionToGatedContent >
270 <#break />
271 </#if>
272
273 <#if categoryArray?seq_contains(userGroup["name"]?trim?lower_case)>
274 <#assign hasPermissionToGatedContent = true />
275 <!--Matched Category: ${userGroup["name"]?trim?lower_case}<br/>-->
276 </#if>
277 </#list>
278 </#if>
279 </#if>
280 </#if>
281
282 <!--
283 Is Gated? ${isGatedContent?c}<br/>gat
284 <#if isGatedContent>
285 Has Permission to Gated? ${hasPermissionToGatedContent?c}<br/>
286 </#if>-->
287
288 <#if isGatedContent && !hasPermissionToGatedContent>
289 <#assign viewUrl = gatedContentUrl />
290 </#if>
291 </#if>
292 <!-- END GATED CONTENT CHECK -->
293
294 <#if modelResourceValue == "Product" && entry.getViewURL()?contains("/p/")>
295 <#assign viewUrl = ("https://www.icba.org/p/" + entry.getViewURL()?keep_after("/p/")) />
296 </#if>
297
298 <a href="${viewUrl}">
299 ${entry.getHighlightedTitle()}
300 </a>
301 </h2>
302
303 <p class="card-text m-0">
304 <#if entry.isContentVisible()>
305 ${entry.getContent()}
306 </#if>
307 </p>
308 <div class="mt-2">
309 <div class="d-flex align-items-center mb-2">
310 <div class="d-flex align-items-center flex-wrap gap-2">
311
312 <#if entry.isPublishedDateVisible() && modelResourceValue == "Web Content Article">
313 <#assign fullDate = entry.getPublishedDateString() />
314
315 <#assign ddmFieldArray = entryDocument.getField("ddmFieldArray").getValues() />
316
317 <#if ddmFieldArray??>
318 <#list ddmFieldArray as ddmField>
319 <#assign fieldFound = false />
320 <#assign articleFields = ddmField?remove_beginning("{")?remove_ending("}")?split(",") />
321
322 <#if articleFields??>
323 <#list articleFields as articleField>
324 <#assign articleFieldValues = articleField?split("=") />
325
326 <#if articleFieldValues?? && articleFieldValues?size == 2>
327 <#if articleFieldValues[0]?trim == "ddmFieldName">
328 <#if articleFieldValues[1] == "ddm__keyword__45357__publicationDate_en_US">
329 <#assign fieldFound = true />
330 </#if>
331 </#if>
332
333 <#if fieldFound && (articleFieldValues[0]?trim == "ddmFieldValueKeyword_en_US_date")>
334 <#assign fullDate = articleFieldValues[1]?datetime("yyyyMMddHHmmss")?string("MMM dd, yyyy") />
335 </#if>
336 </#if>
337 </#list>
338 </#if>
339
340 </#list>
341 </#if>
342
343 <#assign dateOnly = fullDate?split(" ")[0..2]?join(" ") />
344 <small class="text-muted">${dateOnly}</small>
345 </#if>
346
347 <#if entry.isPublishedDateVisible() && modelResourceValue == "Document">
348 <#assign fullDate = entry.getPublishedDateString() />
349 <#assign dateOnly = fullDate?split(" ")[0..2]?join(" ") />
350 <small class="text-muted">${dateOnly}</small>
351 </#if>
352 <#if entry.isCreationDateVisible() && modelResourceValue == "Product" && startDate != "null">
353 <small class="text-muted">${startDate}</small>
354 </#if>
355 <#if modelResourceValue?has_content && modelResourceValue == "Web Content Article">
356 <#if entry.isPublishedDateVisible()>
357 <div>|</div>
358 </#if>
359 <strong>Article</strong>
360 </#if>
361 <div>
362 <#if matchedEventCategories?has_content && modelResourceValue == "Product">
363 <#list matchedEventCategories as productEventType>
364 <#if startDate != "null">| </#if> <strong> ${productEventType.label}</strong>
365 </#list>
366 </#if>
367 <#if startTime?has_content && startTime != "null" && modelResourceValue == "Product">
368 ${startTime}-
369 </#if>
370 <#if endTime?has_content && endTime != "null" && modelResourceValue == "Product">
371 ${endTime}
372 </#if>
373 <#if locationCity?has_content && locationCity != "null" && modelResourceValue == "Product">
374 ${locationCity},
375 </#if>
376 <#if locationState?has_content && locationState != "null" && modelResourceValue == "Product">
377 ${locationState}
378 </#if>
379 </div>
380 <#if cpeCredits?has_content && cpeCredits != "null" && modelResourceValue == "Product">
381 CPE Credits: ${cpeCredits}
382 </#if>
383 <!-- <#if modelResourceValue?has_content && modelResourceValue == "Page">
384 <strong>${modelResourceValue} ${entry.getClassPK()}</strong>
385 </#if>-->
386 </div>
387 </div>
388 <div class="d-flex gap-2 align-items-start justify-content-start flex-wrap">
389 <#if modelResourceValue?has_content && modelResourceValue == "Product">
390 <#assign chanelId = "230564"/>
391 <#assign productCategories = restClient.get("/headless-commerce-delivery-catalog/v1.0/channels/${chanelId}/products/${entryDocument.cpProductId}/categories?pageSize=40")/>
392 <#assign categories = productCategories.items/>
393 <#if categories?has_content>
394 <#assign topicCount = 0/>
395 <#assign displayedCategories = []/>
396 <#assign totalTopicCount = 0/>
397 <#-- First, count total topic categories -->
398 <#list categories as category>
399 <#if category.vocabulary == 'topic'>
400 <#assign totalTopicCount += 1>
401 </#if>
402 </#list>
403 <#-- Now display first 3 topics -->
404 <#list categories as category>
405 <#if category.vocabulary == 'topic' && topicCount < 3>
406 <#assign taxonomyCategoryId = category.id/>
407 <#assign response = restClient.get("/headless-admin-taxonomy/v1.0/taxonomy-categories/${taxonomyCategoryId}") />
408 <#if response.taxonomyCategoryProperties?has_content>
409 <#assign firstProperty = response.taxonomyCategoryProperties[0] />
410 <#assign categoryValue = firstProperty.value />
411 <span class="tag-pill body-13">${categoryValue}</span>
412 <#else>
413 <span class="tag-pill body-13">${category.name}</span>
414 </#if>
415 <#assign topicCount += 1>
416 </#if>
417 </#list>
418 <#-- If more topics exist, show "+X More..." -->
419 <#if (totalTopicCount - topicCount) gt 0>
420 <span class="tag-pill body-13">+${totalTopicCount - topicCount} More...</span>
421 </#if>
422 </#if>
423 </#if>
424 <!-- For Article -->
425 <#if modelResourceValue?has_content && modelResourceValue == "Web Content Article">
426 <#assign topicList = [] />
427 <#assign structuredContentId = entry.getClassPK() />
428 <#assign contentCategories = restClient.get("/headless-delivery/v1.0/structured-contents/${structuredContentId}") />
429
430 <!-- Collect Topic Categories -->
431 <#list contentCategories.taxonomyCategoryBriefs as category>
432 <#assign taxonomyCategoryId = category.taxonomyCategoryId />
433 <#assign response = restClient.get("/headless-admin-taxonomy/v1.0/taxonomy-categories/${taxonomyCategoryId}") />
434 <#if response.parentTaxonomyVocabulary.name == "Topic">
435 <#assign topicList += [response] />
436 </#if>
437 </#list>
438
439 <!-- Display First 3 and '+X More' -->
440 <#assign topicCount = topicList?size />
441 <#if topicCount gt 3>
442 <#list topicList[0..2] as topic>
443 <span class="tag-pill body-13">${topic.name}</span>
444 </#list>
445 <span class="tag-pill body-13">+${topicCount - 3} More...</span>
446 <#else>
447 <#list topicList as topic>
448 <span class="tag-pill body-13">${topic.name}</span>
449 </#list>
450 </#if>
451 </#if>
452
453 <!-- Ends -->
454 <!-- For Page -->
455 <#if modelResourceValue?has_content && modelResourceValue == "Page">
456<#assign topicList = [] />
457<#assign pageId = entry.getClassPK() />
458<#assign url = "/headless-delivery/v1.0/sites/35333/site-pages?fields=id,taxonomyCategoryBriefs&filter=id%20eq%20%27${pageId}%27" />
459<#assign pageDetails = restClient.get(url) />
460<#if pageDetails?has_content && pageDetails.items?has_content>
461 <#assign items = pageDetails.items />
462 <#if items?has_content>
463 <#list items as item>
464 <#if item.taxonomyCategoryBriefs?has_content>
465 <#list item.taxonomyCategoryBriefs as brief>
466 <#assign taxonomyCategoryId = brief.taxonomyCategoryId />
467 <#assign response = restClient.get("/headless-admin-taxonomy/v1.0/taxonomy-categories/${taxonomyCategoryId}") />
468 <#if response.parentTaxonomyVocabulary.name == "Topic">
469 <#assign topicList += [response] />
470 </#if>
471 </#list>
472 </#if>
473 </#list>
474 </#if>
475 <#else>
476
477 </#if>
478<!-- Display First 3 and '+X More' -->
479<#assign topicCount = topicList?size />
480<#if topicCount gt 3>
481<#list topicList[0..2] as topic>
482 <span class="tag-pill body-13">${topic.name}</span>
483</#list>
484<span class="tag-pill body-13">+${topicCount - 3} More...</span>
485<#else>
486<#list topicList as topic>
487 <span class="tag-pill body-13">${topic.name}</span>
488</#list>
489</#if>
490</#if>
491
492
493 <!-- Ends -->
494 </div>
495 <div>
496 <#if entry.isAssetRendererURLDownloadVisible() && modelResourceValue == "Document">
497 <div class="autofit-col">
498 <span
499 class="c-mt-2 lfr-portal-tooltip"
500 title="${languageUtil.format(locale, 'download-x', ['(' + languageUtil.formatStorageSize(entry.getAssetRendererDownloadSize(), locale) + ')'])}"
501 >
502 <@clay.link
503 aria\-label="${languageUtil.format(locale, 'download-x', [entry.getTitle()])}"
504 cssClass="link-monospaced link-outline link-outline-borderless link-outline-secondary"
505 displayType="secondary"
506 href="${entry.getAssetRendererURLDownload()}"
507 >
508 <@clay.icon symbol="download" />
509 </@clay.link>
510 </span>
511 </div>
512 </#if>
513 </div>
514 </div>
515 </div>
516 </div>
517 </#list>
518 </#if>
519</div>