]> git.evergreen-ils.org Git - Evergreen.git/blob - Open-ILS/src/eg2/src/app/staff/catalog/search-form.component.html
LP2045292 Color contrast for AngularJS patron bills
[Evergreen.git] / Open-ILS / src / eg2 / src / app / staff / catalog / search-form.component.html
1 <ng-template #ccvmOption let-list="list">
2   <ng-container *ngFor="let ccv of list">
3   <option *ngIf="ccv.is_simple() === 't'" value="{{ccv.code()}}">
4     {{ccv.search_label() || ccv.value()}}
5     <ng-container *ngIf="ccv.opac_visible() === 'f'" i18n>(Hidden)</ng-container>
6   </option>
7   </ng-container>
8   <ng-container *ngFor="let ccv of list">
9   <option *ngIf="ccv.is_simple() === 'f'" value="{{ccv.code()}}">
10     {{ccv.search_label() || ccv.value()}}
11     <ng-container *ngIf="ccv.opac_visible() === 'f'" i18n>(Hidden)</ng-container>
12   </option>
13   </ng-container>
14 </ng-template>
15
16 <div id='staffcat-search-form' role="form">
17
18   <div *ngIf="canBeHidden()" class="row pt-1 pe-2">
19     <div class="col-lg-12 d-flex">
20       <div class="flex-1"></div><!-- push right -->
21       <button type="button" (click)="toggleFormDisplay()" class="btn btn-link label-with-material-icon">
22         <ng-container *ngIf="hideForm()">
23           <span i18n>Show Search Form</span> 
24           <span class="material-icons" aria-hidden="true">unfold_more</span>
25         </ng-container>
26         <ng-container *ngIf="!hideForm()">
27           <span i18n>Hide Search Form</span> 
28           <span class="material-icons" aria-hidden="true">unfold_less</span>
29         </ng-container>
30       </button>
31     </div>
32   </div>
33   
34   <div *ngIf="!hideForm()" class="row pt-3 pb-1 mb-1" role="search">
35   <div class="col-lg-8">
36     <ul ngbNav #searchTabs="ngbNav" [activeId]="searchTab" (navChange)="onNavChange($event)" [keyboard]="true" [roles]="false" role="tablist" class="nav-tabs">
37       <li role="presentation" [ngbNavItem]="'term'">
38         <a i18n ngbNavLink role="tab">Keyword Search</a>
39         <ng-template ngbNavContent>
40           <div class="row row-cols-auto d-flex align-items-end mt-1"
41             *ngFor="let q of context.termSearch.query; let idx = index; trackBy:trackByIdx">
42             <div class="col-lg-2 pe-1">
43               <div *ngIf="idx === 0">
44                 <label i18n class="form-label select-label" for="context-termSearch-format">Format</label>
45                 <select class="form-select" id="context-termSearch-format" [(ngModel)]="context.termSearch.format">
46                   <option i18n value=''>All Formats</option>
47                   <ng-container
48                     *ngTemplateOutlet="ccvmOption;context:{list:ccvmMap.search_format}">
49                   </ng-container>
50                 </select>
51               </div>
52               <div *ngIf="idx > 0">
53                 <label i18n class="form-label select-label" for="context-termSearch-joinOp-{{idx}}">Join with</label>
54                 <select class="form-select" id="context-termSearch-joinOp-{{idx}}"
55                   [(ngModel)]="context.termSearch.joinOp[idx]">
56                   <option i18n value='&&'>And</option>
57                   <option i18n value='||'>Or</option>
58                 </select>
59               </div>
60             </div>
61             <div class="col-lg-2 ps-0 pe-2">
62               <label i18n class="form-label select-label" for="context-termSearch-fieldClass-{{idx}}">Catalog Field</label>
63               <select class="form-select" id="context-termSearch-fieldClass-{{idx}}"
64                 (change)="preventBogusCombos(idx)"
65                 [(ngModel)]="context.termSearch.fieldClass[idx]">
66                 <option i18n value='keyword'>Keyword</option>
67                 <option i18n value='title'>Title</option>
68                 <option i18n value='jtitle'>Journal Title</option>
69                 <option i18n value='author'>Author</option>
70                 <option i18n value='subject'>Subject</option>
71                 <option i18n value='series'>Series</option>
72                 <option i18n value='bookplate'
73                   *ngIf="showBookplate()">Digital Bookplate</option>
74               </select>
75             </div>
76             <div class="col-lg-2 ps-0 pe-2">
77               <label i18n class="form-label select-label" for="context-termSearch-matchOp-{{idx}}">Matching</label>
78               <select class="form-select" id="context-termSearch-matchOp-{{idx}}"
79                 [(ngModel)]="context.termSearch.matchOp[idx]">
80                 <option i18n value='contains'>Contains</option>
81                 <option i18n value='nocontains'>Does not contain</option>
82                 <option i18n value='phrase'>Contains phrase</option>
83                 <option [disabled]="context.termSearch.fieldClass[idx]==='keyword'"
84                   i18n value='exact'>Matches exactly</option>
85                 <option [disabled]="context.termSearch.fieldClass[idx]==='keyword'"
86                   i18n value='starts'>Starts with</option>
87               </select>
88             </div>
89             <div class="col-lg-4 ps-0 pe-2">
90               <div class="form-group">
91                 <div *ngIf="idx === 0">
92                   <label i18n class="form-label input-label" for='first-query-input'>Search Terms</label>
93                   <input type="search" class="form-control"
94                     id='first-query-input'
95                     [(ngModel)]="context.termSearch.query[idx]"
96                     (keyup.enter)="searchByForm()"
97                     placeholder="Query..." i18n-placeholder />
98                 </div>
99                 <div *ngIf="idx > 0">
100                   <label i18n class="form-label input-label" for='context-termSearch-query-{{idx}}'>Search Terms</label>
101                   <input type="search" class="form-control"
102                     [(ngModel)]="context.termSearch.query[idx]"
103                     (keyup.enter)="searchByForm()"
104                     placeholder="Query..." i18n-placeholder />
105                 </div>
106               </div>
107             </div>
108             <div class="col-lg-2 ps-0 pe-1">
109               <button type="button" class="btn btn-sm material-icon-button"
110                 (click)="addSearchRow(idx + 1)"
111                 i18n-title title="Add Search Row"
112                 i18n-aria-label aria-label="Add Search Row">
113                 <span class="material-icons" aria-hidden="true">add_circle_outline</span>
114               </button>
115               <button type="button" class="btn btn-sm material-icon-button"
116                 [disabled]="context.termSearch.query.length < 2"
117                 type="button" (click)="delSearchRow(idx)"
118                 i18n-title title="Remove Search Row"
119                 i18n-aria-label aria-label="Remove Search Row">
120                 <span class="material-icons" aria-hidden="true">remove_circle_outline</span>
121               </button>
122               <button type="button" *ngIf="idx === 0"
123                 class="btn btn-sm material-icon-button" 
124                 type="button" (click)="toggleFilters()" 
125                 title="Toggle Search Filters" i18n-title
126                 aria-label="Toggle Search Filters" i18n-aria-label>
127                 <span class="material-icons" aria-hidden="true">more_vert</span>
128               </button>
129             </div>
130           </div>
131           <div class="mt-3 gx-3 row row-cols-auto align-items-end">
132               <div class="col form-inline-group">
133                 <label i18n class="form-label select-label" for="context-sort">Sort Results</label>
134                 <select class="form-select me-2" id="context-sort" [(ngModel)]="context.sort">
135                   <option value='' i18n>Sort by Relevance</option>
136                   <optgroup label="Sort by Title" i18n-label>
137                     <option value='titlesort' i18n>Title: A to Z</option>
138                     <option value='titlesort.descending' i18n>Title: Z to A</option>
139                   </optgroup>
140                   <optgroup label="Sort by Author" i18n-label>
141                     <option value='authorsort' i18n>Author: A to Z</option>
142                     <option value='authorsort.descending' i18n>Author: Z to A</option>
143                   </optgroup>
144                   <optgroup label="Sort by Publication Date" i18n-label>
145                     <option value='pubdate.descending' i18n>Date: Newest to Oldest</option>
146                     <option value='pubdate' i18n>Date: Oldest to Newest</option>
147                   </optgroup>
148                   <optgroup label="Sort by Popularity" i18n-label>
149                     <option value='popularity' i18n>Most Popular</option>
150                     <option value='poprel' i18n>Popularity Adjusted Relevance</option>
151                   </optgroup>
152                 </select>
153               </div>
154               <div class="col form-check form-check-inline ms-2 pt-2">
155                   <label class="form-label form-check-label" for="context-termSearch-available">
156                     <input class="form-check-input" type="checkbox" [(ngModel)]="context.termSearch.available" id="context-termSearch-available" />
157                     <span class="ps-1" i18n>Limit to Available</span>
158                   </label>
159                 </div>
160               <div class="col form-check form-check-inline ms-2 pt-2">
161                   <label class="form-label form-check-label" for="context-termSearch-groupByMetarecord">
162                     <input class="form-check-input" type="checkbox" id="context-termSearch-groupByMetarecord"
163                       [(ngModel)]="context.termSearch.groupByMetarecord"/>
164                     <span class="ps-1" i18n>Group Formats/Editions</span>
165                   </label>
166               </div>
167               <div class="col form-check form-check-inline ms-2 pt-2">
168                   <label class="form-label form-check-label" for="context-global">
169                     <input class="form-check-input" type="checkbox" id="context-global" [(ngModel)]="context.global"/>
170                     <span class="ps-1" i18n>Results from All Libraries</span>
171                   </label>
172               </div>
173               <div class="col form-check form-check-inline ms-2 pt-2" *ngIf="showExcludeElectronic()">
174                   <label class="form-label form-check-label" for="context-termSearch-excludeElectronic">
175                     <input class="form-check-input" type="checkbox" id="context-termSearch-excludeElectronic"
176                       [(ngModel)]="context.termSearch.excludeElectronic"/>
177                     <span class="ps-1" i18n>Exclude Electronic Resources</span>
178                   </label>
179                 </div>
180               <div class="pt-2" *ngIf="showCourseFilter">
181                   <label for="reserveCombobox" i18n class="align-self-center mr-2">Reserves materials</label>
182                   <eg-combobox (onChange)="reserveComboboxChange($event.id)"
183                                selectedId="any" [allowFreeText]="false" class="pl-1">
184                     <eg-combobox-entry entryId="any" entryLabel="Any items"
185                                        i18n-entryLabel="No course reserves filter is applied"></eg-combobox-entry>
186                     <eg-combobox-entry entryId="limit" entryLabel="Items attached to a course"
187                                        i18n-entryLabel="Limit results to course reserves results"></eg-combobox-entry>
188                     <eg-combobox-entry entryId="negated" entryLabel="No items attached to a course"
189                                        i18n-entryLabel="Limit results to results not attached to a course"></eg-combobox-entry>
190                   </eg-combobox>
191               </div>
192           </div>
193
194           <div class="row" *ngIf="showFilters()">
195             <div class="col mt-3" *ngIf="searchFilters().includes('item_type')">
196               <label i18n class="form-label select-label" for="context-termSearch-ccvmFilters-item_type">Item Type</label>
197               <select class="form-select"  multiple="true" id="context-termSearch-ccvmFilters-item_type"
198                 [(ngModel)]="context.termSearch.ccvmFilters.item_type">
199                 <option value='' i18n>All Item Types</option>
200                 <ng-container
201                   *ngTemplateOutlet="ccvmOption;context:{list:ccvmMap.item_type}">
202                 </ng-container>
203               </select>
204             </div>
205             <div class="col mt-3" *ngIf="searchFilters().includes('item_form')">
206               <label i18n class="form-label select-label" for="context-termSearch-ccvmFilters-item_form">Form</label>
207               <select class="form-select" multiple="true" id="context-termSearch-ccvmFilters-item_form"
208                 [(ngModel)]="context.termSearch.ccvmFilters.item_form">
209                 <option value='' i18n>All Item Forms</option>
210                 <ng-container
211                   *ngTemplateOutlet="ccvmOption;context:{list:ccvmMap.item_form}">
212                 </ng-container>
213               </select>
214             </div>
215             <div class="col mt-3" *ngIf="searchFilters().includes('item_lang')">
216               <label i18n class="form-label select-label" for="context-termSearch-ccvmFilters-item_lang">Language</label>
217               <select class="form-select" id="context-termSearch-ccvmFilters-item_lang"
218                 [(ngModel)]="context.termSearch.ccvmFilters.item_lang" multiple="true">
219                 <option value='' i18n>All Languages</option>
220                 <ng-container
221                   *ngTemplateOutlet="ccvmOption;context:{list:ccvmMap.item_lang}">
222                 </ng-container>
223               </select>
224             </div>
225             <div class="col mt-3" *ngIf="searchFilters().includes('audience')">
226               <label i18n class="form-label select-label" for="context-termSearch-ccvmFilters-audience">Audience</label>
227               <select class="form-select" id="context-termSearch-ccvmFilters-audience"
228                 [(ngModel)]="context.termSearch.ccvmFilters.audience" multiple="true">
229                 <option value='' i18n>All Audiences</option>
230                 <ng-container
231                   *ngTemplateOutlet="ccvmOption;context:{list:ccvmMap.audience}">
232                 </ng-container>
233               </select>
234             </div>
235           </div>
236           <div class="row" *ngIf="showFilters()">
237             <div class="col mt-3" *ngIf="searchFilters().includes('vr_format')">
238               <label i18n class="form-label select-label" for="context-termSearch-ccvmFilters-vr_format">Video Format</label>
239               <select class="form-select" id="context-termSearch-ccvmFilters-vr_format"
240                 [(ngModel)]="context.termSearch.ccvmFilters.vr_format" multiple="true">
241                 <option value='' i18n>All Video Formats</option>
242                 <ng-container
243                   *ngTemplateOutlet="ccvmOption;context:{list:ccvmMap.vr_format}">
244                 </ng-container>
245               </select>
246             </div>
247             <div class="col mt-3" *ngIf="searchFilters().includes('bib_level')">
248               <label i18n class="form-label select-label" for="context-termSearch-ccvmFilters-bib_level">Bibliographic Level</label>
249               <select class="form-select" id="context-termSearch-ccvmFilters-bib_level"
250                 [(ngModel)]="context.termSearch.ccvmFilters.bib_level" multiple="true">
251                 <option value='' i18n>All Bib Levels</option>
252                 <ng-container
253                   *ngTemplateOutlet="ccvmOption;context:{list:ccvmMap.bib_level}">
254                 </ng-container>
255               </select>
256             </div>
257             <div class="col mt-3" *ngIf="searchFilters().includes('lit_form')">
258               <label i18n class="form-label select-label" for="context-termSearch-ccvmFilters-lit_form">Literary Form</label>
259               <select class="form-select" id="context-termSearch-ccvmFilters-lit_form"
260                 [(ngModel)]="context.termSearch.ccvmFilters.lit_form" multiple="true">
261                 <option value='' i18n>All Literary Forms</option>
262                 <ng-container
263                   *ngTemplateOutlet="ccvmOption;context:{list:ccvmMap.lit_form}">
264                 </ng-container>
265               </select>
266             </div>
267             <div class="col mt-3">
268               <label i18n class="form-label select-label" for="context-termSearch-copyLocations">Shelving Location</label>
269               <select class="form-select" id="context-termSearch-copyLocations"
270                 [(ngModel)]="context.termSearch.copyLocations" multiple="true">
271                 <option value='' i18n>All Shelving Locations</option>
272                 <option *ngFor="let loc of copyLocations" value="{{loc.id()}}" i18n>
273                   {{loc.name()}} ({{orgName(loc.owning_lib())}})
274                 </option>
275               </select>
276             </div>
277           </div>
278           <div class="row row-cols-auto mt-3" *ngIf="showFilters()">
279             <div class="col">
280               <label class="form-label" for="pub-date1-input" i18n>Publication Year is</label>
281               <label class="visually-hidden" for="pub-date-operator-select" i18n>compare publication dates using...</label>
282             </div>
283             <div class="col">
284               <select id="pub-date-operator-select" class="form-select ms-2" [(ngModel)]="context.termSearch.dateOp">
285                 <option value='is' i18n>Is</option>
286                 <option value='before' i18n>Before</option>
287                 <option value='after' i18n>After</option>
288                 <option value='between' i18n>Between</option>
289               </select>
290             </div>
291             <div class="col">
292               <label i18n class="visually-hidden" for="context-termSearch-date1">Year, or beginning of year range</label>
293               <input class="form-control ms-2" type="number" id="context-termSearch-date1"
294                 [(ngModel)]="context.termSearch.date1"/>
295             </div>
296             <div class="col">
297               <label i18n class="visually-hidden" for="context-termSearch-date2">End of year range</label>
298                 <input class="form-control ms-2" type="number"
299                 *ngIf="context.termSearch.dateOp === 'between'"
300                 [(ngModel)]="context.termSearch.date2"/>
301             </div>
302           </div>
303         </ng-template>
304       </li>
305       <li role="presentation" [ngbNavItem]="'ident'">
306         <a i18n ngbNavLink role="tab">Numeric Search</a>
307         <ng-template ngbNavContent>
308           <div class="row mt-2 gx-3 row-cols-auto justify-content-start align-items-center">
309             <div class="col">
310               <label class="form-label col-form-label" for="ident-type" i18n>Query Type</label>
311             </div>
312             <div class="col">
313               <select class="form-select" name="ident-type"
314                 [(ngModel)]="context.identSearch.queryType">
315                 <option i18n value="identifier|isbn">ISBN</option>
316                 <option i18n value="identifier|upc">UPC</option>
317                 <option i18n value="identifier|issn">ISSN</option>
318                 <option i18n value="identifier|lccn">LCCN</option>
319                 <option i18n value="identifier|tcn">TCN</option>
320                 <option i18n value="item_barcode">Item Barcode</option>
321               </select>
322             </div>
323             <div class="col">
324               <label for="ident-value" class="form-label col-form-label" i18n>Value</label>
325             </div>
326             <div class="col">
327               <input name="ident-value" id='ident-query-input' 
328                 type="text" class="form-control"
329                 [(ngModel)]="context.identSearch.value"
330                 (keyup.enter)="searchByForm()"
331                 placeholder="Numeric Query..." i18n-placeholder />
332             </div>
333           </div>
334         </ng-template>
335       </li>
336       <li role="presentation" [ngbNavItem]="'marc'">
337         <a i18n ngbNavLink role="tab">MARC Search</a>
338         <ng-template ngbNavContent>
339           <div class="mt-1">
340               <div class="row mt-2 gx-3 row-cols-auto" 
341                 *ngFor="let q of context.marcSearch.values; let idx = index; trackBy:trackByIdx">
342                 <label class="form-label col-form-label" for="marc-tag-{{idx}}" i18n>Tag</label>
343                 <div class="col ps-0">
344                   <input class="form-control ms-0" size="3" type="text" 
345                     name="marc-tag-{{idx}}" id="{{ idx === 0 ? 'first-marc-tag' : '' }}"
346                     [(ngModel)]="context.marcSearch.tags[idx]"
347                     (keyup.enter)="searchByForm()"/>
348                 </div>
349                 <label class="form-label col-form-label" for="marc-subfield-{{idx}}" i18n>Subfield</label>
350                 <div class="col ps-0">
351                   <input class="form-control ms-0" size="1" type="text" 
352                     name="marc-subfield-{{idx}}"
353                     [(ngModel)]="context.marcSearch.subfields[idx]"
354                     (keyup.enter)="searchByForm()"/>
355                 </div>
356                 <label class="form-label col-form-label"  for="marc-value-{{idx}}" i18n>Value</label>
357                 <div class="col ps-0">
358                   <input class="form-control ms-0" type="text" name="marc-value-{{idx}}"
359                     [(ngModel)]="context.marcSearch.values[idx]" 
360                     (keyup.enter)="searchByForm()"/>
361                 </div>
362                 <div class="col">
363                   <button type="button" class="btn btn-sm material-icon-button ms-2"
364                     i18n-title title="Add Search Row"
365                     i18n-aria-label aria-label="Add Search Row"
366                     (click)="addMarcSearchRow(idx + 1)">
367                     <span class="material-icons" aria-hidden="true">add_circle_outline</span>
368                   </button>
369                 </div>
370                 <div class="col">
371                   <button type="button" class="btn btn-sm material-icon-button ps-0 ms-0"
372                     i18n-title title="Remove Search Row"
373                     i18n-aria-label aria-label="Remove Search Row"
374                     [disabled]="context.marcSearch.values.length < 2"
375                     (click)="delMarcSearchRow(idx)">
376                     <span class="material-icons" aria-hidden="true">remove_circle_outline</span>
377                   </button>
378                 </div>
379               </div>
380           </div>
381           <div class="row mt-2">
382             <div class="checkbox ps-3">
383               <label>
384                 <input type="checkbox" [(ngModel)]="context.global"/>
385                 <span class="ps-1" i18n>Results from All Libraries</span>
386               </label>
387             </div>
388           </div>
389         </ng-template>
390       </li>
391       <li role="presentation" [ngbNavItem]="'browse'">
392         <a i18n ngbNavLink role="tab">Browse</a>
393         <ng-template ngbNavContent>
394           <div class="row gx-3 row-cols-auto">
395             <label class="form-label col-form-label" for="field-class" i18n>Browse for</label>
396             <div class="col ps-0">
397               <select class="form-select ms-0" name="field-class"
398                 [(ngModel)]="context.browseSearch.fieldClass">
399                 <option i18n value='title'>Title</option>
400                 <option i18n value='author'>Author</option>
401                 <option i18n value='subject'>Subject</option>
402                 <option i18n value='series'>Series</option>
403               </select>
404             </div>
405             <label class="form-label col-form-label" for="query"> starting with </label>
406             <div class="col ps-0">
407               <input type="text" class="form-control" 
408                 id='browse-term-input' name="query"
409                 [(ngModel)]="context.browseSearch.value"
410                 (keyup.enter)="searchByForm()"
411                 placeholder="Browse for..." i18n-placeholder />
412             </div>
413           </div>
414         </ng-template>
415       </li>
416       <li role="presentation" [ngbNavItem]="'cnbrowse'">
417         <a i18n ngbNavLink role="tab">Shelf Browse</a>
418         <ng-template ngbNavContent>
419           <div class="row gx-3 row-cols-auto">
420             <label class="form-label col-form-label" for="cnbrowse-term-input" i18n>
421               Browse Call Numbers starting with 
422             </label>
423             <div class="col ps-0">
424               <input type="text" class="form-control ms-2" 
425                 id='cnbrowse-term-input' name="query"
426                 [(ngModel)]="context.cnBrowseSearch.value"
427                 (keyup.enter)="searchByForm()"
428                 placeholder="Browse Call Numbers..." i18n-placeholder />
429             </div>
430           </div>
431         </ng-template>
432       </li>      
433     </ul>
434
435     <div [ngbNavOutlet]="searchTabs" class="mt-2"></div>
436
437   </div>
438   <div class="col-lg-4">
439     <div class="row">
440       <div class="col-lg-12">
441         <div class="card">
442           <div class="card-body">
443             <div class="float-end d-flex">
444               <eg-org-select 
445                 (onChange)="orgOnChange($event)"
446                 [initialOrg]="context.searchOrg"
447                 [placeholder]="'Library'" i18n-placeholder
448                 ariaLabel="Library" i18n-ariaLabel>
449               </eg-org-select>
450               <button type="button" class="btn btn-success me-1 ms-1" type="button"
451                 [disabled]="searchIsActive()"
452                 id="run-catalog-search"
453                 (click)="context.pager.offset=0;searchByForm()" i18n>
454                 Search
455               </button>
456               <button type="button" class="btn btn-destroy me-1" type="button"
457                 [disabled]="searchIsActive()"
458                 (click)="context.reset()" i18n>
459                 Reset
460               </button>
461             </div>
462           </div>
463         </div>
464       </div>
465     </div>
466     <div class="row mt-1">
467       <div class="col-lg-12">
468         <eg-catalog-search-templates [searchTab]="searchTab">
469         </eg-catalog-search-templates>
470       </div>
471     </div>
472     <div class="row mt-1">
473       <div class="col-lg-12">
474         <eg-catalog-basket-actions></eg-catalog-basket-actions>
475       </div>
476     </div>
477   </div>
478   </div>
479   <div class="row mb-3 pb-3">
480     <ng-container *ngIf="context.result.global_summary as gs">
481       <ng-container *ngIf="gs.suggestions as sugg">
482         <div *ngIf="sugg.one_class_multi_term as ocmt" class="col-lg-12 d-flex align-content-center">
483           <span class="fw-bold fst-italic me-1" i18n>Did you mean:</span>
484           <ul class="suggestion refine_search">
485             <li *ngFor="let s of ocmt.suggestions" class="suggestion refine_search">
486               <a routerLink="/staff/catalog/search" queryParamsHandling="merge"
487                 [queryParams]="{query : s.suggestion, fieldClass : ocmt.class}">
488               {{s.prefix_key || s.suggestion}}
489               </a>
490             </li>
491           </ul>
492         </div>
493       </ng-container>
494     </ng-container>
495   </div>
496 </div>
497