The following has evaluated to null or missing: ==> destination [in template "34352066712900#33336#65813976" at line 117, column 93] ---- 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: ${destination} [in template "34352066712900#33336#65813976" at line 117, column 91] ----
1<#assign
2 searchInputId = namespace + stringUtil.randomId()
3/>
4
5<#if searchBarPortletDisplayContext.getDestinationFriendlyURL()?has_content>
6 <#assign destination = searchBarPortletDisplayContext.getDestinationFriendlyURL() />
7</#if>
8
9<@liferay_aui.fieldset cssClass="search-bar">
10 <@liferay_aui.input
11 cssClass="search-bar-empty-search-input"
12 name="emptySearchEnabled"
13 type="hidden"
14 value=searchBarPortletDisplayContext.isEmptySearchEnabled()
15 />
16
17 <div class="input-group ${searchBarPortletDisplayContext.isLetTheUserChooseTheSearchScope()?then("search-bar-scope","search-bar-simple")}">
18 <#if searchBarPortletDisplayContext.isLetTheUserChooseTheSearchScope()>
19 <div class="input-group-item input-group-item-shrink input-group-prepend">
20 <button aria-label="${languageUtil.get(locale, "submit")}" class="btn btn-secondary w-100" type="submit">
21 ${languageUtil.get(locale, 'search')}
22 </button>
23 </div>
24
25 <@liferay_aui.select
26 cssClass="search-bar-scope-select"
27 id="${namespace}selectScope"
28 label=""
29 name=htmlUtil.escape(searchBarPortletDisplayContext.getScopeParameterName())
30 title="scope"
31 useNamespace=false
32 wrapperCssClass="input-group-item input-group-item-shrink input-group-prepend search-bar-search-select-wrapper"
33 >
34 <@liferay_aui.option
35 label="this-site"
36 selected=searchBarPortletDisplayContext.isSelectedCurrentSiteSearchScope()
37 value=searchBarPortletDisplayContext.getCurrentSiteSearchScopeParameterString()
38 />
39
40 <#if searchBarPortletDisplayContext.isAvailableEverythingSearchScope()>
41 <@liferay_aui.option
42 label="everything"
43 selected=searchBarPortletDisplayContext.isSelectedEverythingSearchScope()
44 value=searchBarPortletDisplayContext.getEverythingSearchScopeParameterString()
45 />
46 </#if>
47 </@>
48
49 <#assign data = {
50 "test-id": "searchInput"
51 } />
52
53 <@liferay_aui.input
54 autoFocus=true
55 autocomplete="off"
56 cssClass="search-bar-keywords-input"
57 data=data
58 id=searchInputId
59 label=""
60 name=htmlUtil.escape(searchBarPortletDisplayContext.getKeywordsParameterName())
61 placeholder="Buscar en la tienda AENOR"
62 title=languageUtil.get(locale, "search")
63 type="text"
64 useNamespace=false
65 value=htmlUtil.escape(searchBarPortletDisplayContext.getKeywords())
66 wrapperCssClass="input-group-item input-group-append search-bar-keywords-input-wrapper"
67 />
68 <#else>
69 <div id="ae-search-wrapper" class="input-group-item search-bar-keywords-input-wrapper">
70 <input
71 aria-label="Buscar en la tienda AENOR"
72 autoFocus=true
73 autocomplete="off"
74 class="form-control input-group-inset input-group-inset-after search-bar-keywords-input"
75 data-qa-id="searchInput"
76 id=${searchInputId}
77 name="${htmlUtil.escape(searchBarPortletDisplayContext.getKeywordsParameterName())}"
78 placeholder="Buscar en la tienda AENOR"
79 title="${languageUtil.get(locale, "search")}"
80 type="text"
81 value="${htmlUtil.escape(searchBarPortletDisplayContext.getKeywords())}"
82 />
83
84 <div class="input-group-inset-item input-group-inset-item-after">
85 <button aria-label="${languageUtil.get(locale, "submit")}" class="btn btn-unstyled h-100 w-100" type="submit">
86 ${languageUtil.get(locale, 'search')}
87 </button>
88 </div>
89
90 <@liferay_aui.input
91 name=htmlUtil.escape(searchBarPortletDisplayContext.getScopeParameterName())
92 type="hidden"
93 value=searchBarPortletDisplayContext.getScopeParameterValue()
94 />
95 </div>
96 </#if>
97 </div>
98</@>
99
100<#if searchBarPortletDisplayContext.isSuggestionsEnabled()>
101
102 <!--<script src="https://code.jquery.com/jquery-3.6.0.js"></script> -->
103 <script src="/documents/d/asset-library-64146/jquery-ui"></script>
104
105 <script>
106 $( function() {
107 const inputElement = $("#${searchInputId}");
108 const searchWrapperElement = $("#ae-search-wrapper");
109
110 const getURL = (request) => {
111 let serviceURL = new URL(Liferay.ThemeDisplay.getPathContext() + "${searchBarPortletDisplayContext.getSuggestionsURL()}", Liferay.ThemeDisplay.getPortalURL());
112
113 const scopeIfDefined = "${searchBarPortletDisplayContext.isSelectedEverythingSearchScope()?then('everything', 'this-site')}";
114 const scopeIfLetUserChoose = $("#${namespace}selectScope").val();
115
116 serviceURL.searchParams.append("currentURL", window.location.href);
117 serviceURL.searchParams.append("destinationFriendlyURL", "${destination}");
118 serviceURL.searchParams.append("groupId", themeDisplay.getScopeGroupId());
119 serviceURL.searchParams.append("keywordsParameterName", "${searchBarPortletDisplayContext.getKeywordsParameterName()}");
120 serviceURL.searchParams.append("plid", themeDisplay.getPlid());
121 serviceURL.searchParams.append("scope", "${searchBarPortletDisplayContext.isLetTheUserChooseTheSearchScope()?c}" == 'true' ? scopeIfLetUserChoose : scopeIfDefined);
122 serviceURL.searchParams.append("search", request.term);
123
124 return serviceURL;
125 };
126
127 $.widget( "custom.catcomplete", $.ui.autocomplete, {
128 _create: function() {
129 this._super();
130 this.widget().menu( "option", "items", "a.dropdown-item" );
131 },
132 _renderMenu: function( ul, items ) {
133 ul.addClass("dropdown-menu");
134 ul.css('display', 'flex');
135 ul.css('flex-wrap', 'wrap');
136 ul.css('max-width', searchWrapperElement.width());
137
138 let li = null;
139 let hasDisclaimer = false;
140
141 $.each( items, function( index, item ) {
142 if (item.category === "${languageUtil.get(locale, "suggestions")}") {
143 if (index === 0) {
144 li = $('<li class="dropdown-category col-12">');
145 const aLink = $('<a class="dropdown-item" href="' + getSuggestionURL(item.attributes.assetURL) + '" data-senna-off="true">')
146 .append('<p class="list-group-text text-dark" style="font-size: 0.75rem;"><i class="fa-solid fa-chevron-right mr-2" style="color: var(--brand-color-2, #6A9BD3);" aria-hidden="true"></i>' +
147 Liferay.Util.escapeHTML(item.text) + '</p>')
148 .append('<p class="list-group-text text-truncate text-2 ml-3" style="color: var(--gray-500, #A7A9BC);">' +
149 Liferay.Util.escapeHTML(item.attributes.assetSearchSummary) + '</p>' );
150 $( aLink ).data("ui-autocomplete-item", item);
151 $( aLink ).appendTo( li );
152 $( li ).appendTo( ul );
153 } else {
154 const aLink = $('<a class="dropdown-item" href="' + getSuggestionURL(item.attributes.assetURL) + '" data-senna-off="true">')
155 .append('<p class="list-group-text text-dark" style="font-size: 0.75rem;"><i class="fa-solid fa-chevron-right mr-2" style="color: var(--brand-color-2, #6A9BD3);" aria-hidden="true"></i>' +
156 Liferay.Util.escapeHTML(item.text) + '</p>')
157 .append('<p class="list-group-text text-truncate text-2 ml-3" style="color: var(--gray-500, #A7A9BC);">' +
158 Liferay.Util.escapeHTML(item.attributes.assetSearchSummary) + '</p>' );
159 $( aLink ).data("ui-autocomplete-item", item);
160 $( aLink ).appendTo( li );
161 }
162 } else {
163 let category = item.category;
164 if (item.category === "Consultoría") {
165 category = item.category.concat("*");
166 hasDisclaimer = true;
167 }
168
169 let summary =
170 li = $('<li class="dropdown-category col-12 col-md-6">').append( '<div class="dropdown-subheader" style="color: var(--brand-color-3, #29337f); font-weight: 600; font-size: 0.75rem;">' + category + "</div>" );
171 const aLink = $('<a class="dropdown-item" href="' + getSuggestionURL(item.attributes.assetURL) + '" data-senna-off="true">')
172 .append('<p class="list-group-text text-dark" style="font-size: 0.75rem;"><i class="fa-solid fa-chevron-right mr-2" style="color: var(--brand-color-2, #6A9BD3);" aria-hidden="true"></i>' +
173 Liferay.Util.escapeHTML(item.text) + '</p>')
174 .append('<p class="list-group-text text-truncate text-2 ml-3" style="color: var(--gray-500, #A7A9BC);">' +
175 getSummary(Liferay.Util.escapeHTML(item.attributes.assetSearchSummary)) + '</p>' );
176 $( aLink ).data("ui-autocomplete-item", item);
177 $( aLink ).appendTo( li );
178 $( li ).appendTo( ul );
179 }
180 });
181
182 if (hasDisclaimer) {
183 let disclaimer = $('<li class="dropdown-category col-12 mt-4">');
184 const disclaimerLink = $('<a class="dropdown-item" href="' + getDisclaimerURL() + '" data-senna-off="true">')
185 .append('<p class="list-group-text text-dark" style="font-size: 0.75rem;">' +
186 getDisclaimerText() + '</p>')
187 $( disclaimerLink ).appendTo( disclaimer );
188 $( disclaimer ).appendTo( ul );
189 }
190 }
191 });
192
193 function getSuggestionURL(url) {
194 if (url.includes("/norma") || url.includes("/libro")) {
195 let q = url.indexOf("?") === -1 ? url.length : url.indexOf("?");
196 return "https://tienda.aenor.com".concat(url.substring(url.lastIndexOf("/", q), q));
197 }
198 return url.replace("/web/guest", "");
199 }
200
201 function getSummary(summary) {
202 if (summary.includes("${languageUtil.get(locale, 'page')}: ")) {
203 return summary.replace("${languageUtil.get(locale, 'page')}: ", "");
204 }
205 return summary;
206 }
207
208 function getDisclaimerURL() {
209 return "/consultoria-proyectos/sistemas-de-gestion";;
210 }
211
212 function getDisclaimerText() {
213 let disclaimerText = "${languageUtil.get(locale, 'disclaimer.consultoria.certificaciones-acreditadas')?js_string}";
214 return disclaimerText;
215 }
216
217 $( inputElement ).catcomplete({
218 minLength: ${searchBarPortletDisplayContext.getSuggestionsDisplayThreshold()},
219 source: function( request, response ) {
220 $.ajax({
221 url: getURL(request),
222 method : "POST",
223 dataType: "json",
224 contentType: "application/json",
225 headers: {
226 "Accept-Language": themeDisplay.getBCP47LanguageId(),
227 "Content-Type": "application/json",
228 "X-csrf-token": Liferay.authToken
229 },
230 data: JSON.stringify(${searchBarPortletDisplayContext.getSuggestionsContributorConfiguration()}),
231 success: function( data ) {
232 const list = [];
233
234 $.each( data.items, function( index, item ) {
235 const category = item.displayGroupName;
236
237 $.each( item.suggestions, function( index, suggestion ) {
238 list.push({...suggestion, category});
239 });
240 });
241
242 response(list);
243 }
244 });
245 },
246 focus: function( event, ui ) {
247 return false;
248 },
249 messages: {
250 noResults: '',
251 results: function() {}
252 },
253 select: function( event, ui ) {
254 return false;
255 }
256 });
257 } );
258 </script>
259</#if>
Filtrar: