Release Notes
Um erro ocorreu enquanto processava o modelo.
The following has evaluated to null or missing: ==> restArticle.taxonomyCategoryBriefs [in template "2010607#2010649#24589768" at line 232, column 72] ---- 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: #list restArticle.taxonomyCategoryBri... [in template "2010607#2010649#24589768" at line 232, column 65] ----
1<style>
2 .container-release-feature-search {
3 a.link-container:hover, a.link-container.hover {
4 background-color: var(--color-action-primary-hover-10, #EDF3FE);
5 border: 0.0625rem solid var(--link-hover-color, #0053F0);
6 color: var(--link-hover-color, #0053F0);
7 text-decoration: none;
8 }
9
10 .btn-tooltip-availability {
11 border-color: var(--btn-default-border-color, transparent);
12 border-width: var(--btn-border-width, 0.0625rem);
13 color: var(--btn-default-color);
14 cursor: pointer;
15 line-height: normal;
16 padding: 0.063rem;
17 }
18
19 .collapse-container {
20 position: relative;
21 }
22
23 .collapse-container .tooltip {
24 margin-top: -6.25rem;
25 transform: translateX(-40%);
26 width: 8.75rem;
27 }
28
29 .empty-container {
30 background-color: var(--color-neutral-0);
31 border-color: var(--color-neutral-3);
32 border-radius: var(--border-radius);
33 border-style: solid;
34 border-width: 0.0625rem;
35 margin-top: 0.8rem;
36 padding: 1.5rem 1.5rem 0.0625rem 1.5rem;
37 }
38
39 .empty-message-title {
40 color: var(--color-neutral-10, #282934);
41 font-size: 1.125rem;
42 font-weight: 600;
43 line-height: 1.25rem;
44 }
45
46 .empty-result-message {
47 align-items: center;
48 margin: 5rem auto;
49 }
50
51 .icon-container {
52 background-color: var(--color-brand-primary-lighten-5, #E7EFFF);
53 border-radius: 0.5rem;
54 margin-bottom: 2rem;
55 max-width: 9rem;
56 }
57
58 .label-previous-status{
59 background-color: var(--color-neutral-2, #E1E1E4);
60 color: var(--color-neutral-7, #6C6C76);
61 text-decoration: line-through;
62 }
63
64 .link-container {
65 background-color: var(--color-brand-primary-lighten-6, #FBFCFE);
66 border: 0.0625rem solid var(--color-brand-primary-lighten-5, #E7EFFF);
67 border-radius: 0.625rem;
68 color: var(--color-action-neutral-default, #2B3A4B);
69 font-size: 0.875rem;
70 padding: 0.75rem;
71 word-break: break-word;
72 }
73
74 .link-container > svg {
75 fill: var(--link-color, #0B5FFF);
76 height: 0.75rem;
77 width: 0.75rem;
78 }
79
80 .link-container span {
81 padding-left: 0.5rem;
82 }
83
84 .pagination-bar {
85 align-items: flex-start;
86 display: flex;
87 gap: 1rem;
88 }
89
90 .pagination-bar .dropdown.pagination-items-per-page {
91 align-items: flex-start;
92 display: flex;
93 }
94
95 .pagination-bar .dropdown.pagination-items-per-page .dropdown-toggle.page-link {
96 align-items: center;
97 border-width: 0rem;
98 color: var(--color-action-neutral-default, #2B3A4B);
99 display: flex;
100 font-size: 0.875rem;
101 font-style: normal;
102 font-weight: 600;
103 gap: 0.25rem;
104 justify-content: center;
105 line-height: 1rem;
106 text-align: center;
107 }
108
109 .pagination-bar .dropdown.pagination-items-per-page .dropdown-toggle.page-link .c-inner {
110 align-items: center;
111 display: flex;
112 height: 1rem;
113 justify-content: center;
114 }
115
116 .pagination-bar .dropdown.pagination-items-per-page .dropdown-toggle.page-link .c-inner .lexicon-icon.lexicon-icon-caret-double-l {
117 align-items: center;
118 display: flex;
119 flex-shrink: 0;
120 height: 1rem;
121 justify-content: center;
122 width: 1rem;
123 }
124
125 .pagination-bar .pagination {
126 align-items: flex-start;
127 display: flex;
128 gap: 0.5rem;
129 justify-content: center;
130 }
131
132 .pagination-bar .pagination .page-item .page-link {
133 align-items: center;
134 border-radius: 0.375rem;
135 border-width: 0rem;
136 color: var(--color-action-neutral-default, #2B3A4B);
137 display: flex;
138 font-size: 0.875rem;
139 font-style: normal;
140 font-weight: 600;
141 gap: 0.25rem;
142 justify-content: center;
143 line-height: 1rem;
144 min-width: 2rem;
145 padding: 0.5rem;
146 text-align: center;
147 }
148
149 .pagination-bar .pagination .page-item.active .page-link {
150 background: var(--color-action-neutral-active-20, #D5D8DB);
151 }
152
153 .pagination-bar .pagination-results {
154 align-items: flex-start;
155 color: var(--color-neutral-10, #282934);
156 display: flex;
157 font-size: 0.8125rem;
158 font-style: normal;
159 font-weight: 400;
160 gap: 0.25rem;
161 line-height: 1rem;
162 margin-top: 0.5rem;
163 }
164
165 .search-icon>svg {
166 fill: var(--link-color, #0B5FFF);
167 height: 2rem;
168 margin: 1.5rem 3.5rem;
169 width: 2rem;
170 }
171
172 .search-results .search-results-entry {
173 align-items: flex-start;
174 display: flex;
175 flex-direction: column;
176 gap: 0.25rem;
177 }
178
179 .search-results .search-results-entry .search-results-entry-title {
180 color: var(--color-neutral-10, #282934);
181 border-radius: 0.625rem;
182 font-size: 1.125rem;
183 font-style: normal;
184 font-weight: 600 !important;
185 line-height: 1.25rem;
186 padding: 1rem 1rem 1rem 0.625rem;
187 }
188
189 .search-results .search-results-entry .search-results-entry-title .search-results-entry-content {
190 color: var(--color-neutral-10, #282934);
191 font-size: 1rem;
192 font-style: normal;
193 font-weight: 400;
194 line-height: 1.5rem;
195 margin-top: 1rem;
196 }
197
198 .search-results .search-results-entry .search-results-entry-title:hover {
199 background: var(--color-action-primary-hover-10, #EDF3FE);
200 }
201
202 .search-results .solid {
203 border-top: 0.0625rem solid var(--color-neutral-2, #E2E2E4);
204 }
205
206 .tooltip-inner a:hover, a.hover {
207 color: var(--color-neutral-0, #FFFFFF);
208 font-weight: var(--font-weight-bold, 700) !important;
209 }
210 }
211</style>
212
213<div class="container-release-feature-search">
214 <div class="pt-3 search-results" id="searchResults">
215 <#if entries?has_content>
216 <#list entries as searchEntry>
217 <#assign restArticle = restClient.get("/headless-delivery/v1.0/structured-contents/${searchEntry.getClassPK()}?fields=contentFields,relatedContents,taxonomyCategoryBriefs,title&nestedFields=embeddedTaxonomyCategory") />
218
219 <#if restArticle?has_content>
220 <div class="align-items-stretch search-results-entry">
221 <div
222 aria-controls="collapsePanelId-${searchEntry.getClassPK()}"
223 aria-expanded="false"
224 class="align-items-center btn btn-unstyled collapse-icon collapse-icon-middle collapsed d-flex font-weight-bold p-3 panel-header panel-header-link search-results-entry-title text-decoration-none unstyled"
225 data-target="#collapsePanelId-${searchEntry.getClassPK()}"
226 data-toggle="liferay-collapse"
227 >
228 <span class="mr-5">
229 ${restArticle.title}
230 </span>
231 <span class="ml-auto mr-5">
232 <#list restArticle.taxonomyCategoryBriefs as taxonomyCategoryBrief>
233 <#assign taxonomyVocabularyName = taxonomyCategoryBrief.embeddedTaxonomyCategory.parentTaxonomyVocabulary.name />
234
235 <#if taxonomyVocabularyName == "Product Capabilities">
236 <span class="font-weight-normal label label-secondary label-tonal-info m-0 px-2 text-paragraph-sm">
237 ${taxonomyCategoryBrief.taxonomyCategoryName}
238 </span>
239 </#if>
240 </#list>
241 </span>
242 <span class="collapse-icon-closed">
243 <@clay.icon symbol="angle-right" />
244 </span>
245 <span class="collapse-icon-open">
246 <@clay.icon symbol="angle-down" />
247 </span>
248 </div>
249
250 <div class="collapse collapse-container panel-collapse pl-3 pr-3" id="collapsePanelId-${searchEntry.getClassPK()}">
251 <div class="description search-results-entry-content">
252 <#assign
253 url = ""
254 urlTitle = ""
255 />
256
257 <#list restArticle.contentFields as fieldData>
258 <#if fieldData.contentFieldValue.data?has_content && validator.isNotNull(fieldData.contentFieldValue.data)>
259 <#assign webContentData = fieldData.contentFieldValue.data />
260
261 <div>
262 ${webContentData}
263 </div>
264 </#if>
265
266 <#list fieldData.nestedContentFields as nestedFieldData>
267 <#if nestedFieldData.contentFieldValue.data?has_content>
268 <#assign webContentNestedData = nestedFieldData.contentFieldValue.data />
269
270 <#if nestedFieldData.label?contains("Title")>
271 <#assign urlTitle = nestedFieldData.contentFieldValue.data />
272 <#else>
273 <#assign url = nestedFieldData.contentFieldValue.data />
274 </#if>
275 <#else>
276 <#assign urlTitle = "" />
277 </#if>
278 </#list>
279
280 <#if urlTitle?has_content && validator.isNotNull(urlTitle)>
281 <div class="d-flex mb-2">
282 <a class="link-container" href="${url}" target="_blank">
283 <@clay["icon"] symbol="link" />
284
285 <span>
286 ${urlTitle}
287 </span>
288 </a>
289 </div>
290 </#if>
291 </#list>
292 </div>
293
294 <div class="ml-auto mr-5 mt-3">
295 <#list restArticle.taxonomyCategoryBriefs as taxonomyCategoryBrief>
296 <#assign taxonomyVocabularyName = taxonomyCategoryBrief.embeddedTaxonomyCategory.parentTaxonomyVocabulary.name />
297
298 <#if taxonomyVocabularyName == "Release Status Previous">
299 <span class="font-weight-normal label label-previous-status label-secondary label-tonal-secondary px-2 text-paragraph-sm">
300 ${taxonomyCategoryBrief.taxonomyCategoryName}
301
302 <span class="pl-1">
303 <@clay["icon"] symbol="info-circle" />
304 </span>
305 </span>
306 <span class="mr-1">
307 <@clay["icon"] symbol="order-arrow-right" />
308 </span>
309 </#if>
310 </#list>
311
312 <#list restArticle.taxonomyCategoryBriefs as taxonomyCategoryBrief>
313 <#assign taxonomyVocabularyName = taxonomyCategoryBrief.embeddedTaxonomyCategory.parentTaxonomyVocabulary.name />
314
315 <#if taxonomyVocabularyName == "Feature Availability">
316 <span class="font-weight-normal label label-success label-tonal-success mb-3 px-2 text-paragraph-sm">
317 ${taxonomyCategoryBrief.taxonomyCategoryName}
318
319 <span class="pl-1">
320 <div class="clay-tooltip-top fade tooltip" id="tooltipId-${searchEntry.getClassPK()}" role="tooltip">
321 <div class="arrow"></div>
322
323 <div class="tooltip-inner">
324 <#assign articleTooltipURL = "https://learn.liferay.com/web/guest/w/dxp/system-administration/configuring-liferay/feature-flags" />
325
326 <a href="${articleTooltipURL}" target="_blank">
327 ${languageUtil.get(locale, "learn-about-the-feature-availability-statuses", "Learn about the feature availability statuses.")}
328 </a>
329 </div>
330 </div>
331
332 <button class="btn-tooltip-availability tooltip-button" data-tooltip-id="tooltipId-${searchEntry.getClassPK()}" type="button">
333 <@clay["icon"] symbol="info-circle" />
334 </button>
335 </span>
336 </span>
337 </#if>
338 </#list>
339 </div>
340 </div>
341 </div>
342
343 <hr class="solid">
344 </#if>
345 </#list>
346 <#else>
347 <div class="empty-container">
348 <div class="d-flex empty-result-message flex-column">
349 <div class="icon-container">
350 <div class="search-icon">
351 <@clay["icon"] symbol="search-experiences" />
352 </div>
353 </div>
354
355 <span class="empty-message-title text-center">
356 ${languageUtil.get(locale, "no-features-found-for-the-selected-product-capabilities-and-feature-availability", "No features found for the selected product capabilities and feature availability.")}
357 </span>
358 </div>
359 </div>
360 </#if>
361 </div>
362</div>
363
364<script>
365 (function() {
366 let buttons = document.querySelectorAll(".tooltip-button");
367
368 buttons.forEach(function(button) {
369 let tooltipId = button.dataset.tooltipId;
370
371 let tooltip = document.getElementById(tooltipId);
372
373 if (tooltip) {
374 tooltip.style.display = "none";
375 }
376
377 button.addEventListener("mouseover", function(event) {
378 if (tooltip) {
379 tooltip.classList.add("show");
380 tooltip.style.display = "block";
381 }
382 });
383
384 document.addEventListener("click", function(event) {
385 if (!event.target.classList.contains("tooltip-button")) {
386 let tooltips = document.querySelectorAll(".tooltip.show");
387
388 tooltips.forEach(function(tooltip) {
389 tooltip.classList.remove("show");
390 tooltip.style.display = "none";
391 });
392 }
393 });
394 });
395 })();
396</script>