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>
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>
16 <div id='staffcat-search-form' role="form">
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>
26 <ng-container *ngIf="!hideForm()">
27 <span i18n>Hide Search Form</span>
28 <span class="material-icons" aria-hidden="true">unfold_less</span>
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>
48 *ngTemplateOutlet="ccvmOption;context:{list:ccvmMap.search_format}">
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>
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>
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>
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 />
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 />
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
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>
201 *ngTemplateOutlet="ccvmOption;context:{list:ccvmMap.item_type}">
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>
211 *ngTemplateOutlet="ccvmOption;context:{list:ccvmMap.item_form}">
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>
221 *ngTemplateOutlet="ccvmOption;context:{list:ccvmMap.item_lang}">
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>
231 *ngTemplateOutlet="ccvmOption;context:{list:ccvmMap.audience}">
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>
243 *ngTemplateOutlet="ccvmOption;context:{list:ccvmMap.vr_format}">
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>
253 *ngTemplateOutlet="ccvmOption;context:{list:ccvmMap.bib_level}">
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>
263 *ngTemplateOutlet="ccvmOption;context:{list:ccvmMap.lit_form}">
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())}})
278 <div class="row row-cols-auto mt-3" *ngIf="showFilters()">
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>
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>
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"/>
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"/>
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">
310 <label class="form-label col-form-label" for="ident-type" i18n>Query Type</label>
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>
324 <label for="ident-value" class="form-label col-form-label" i18n>Value</label>
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 />
336 <li role="presentation" [ngbNavItem]="'marc'">
337 <a i18n ngbNavLink role="tab">MARC Search</a>
338 <ng-template ngbNavContent>
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()"/>
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()"/>
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()"/>
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>
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>
381 <div class="row mt-2">
382 <div class="checkbox ps-3">
384 <input type="checkbox" [(ngModel)]="context.global"/>
385 <span class="ps-1" i18n>Results from All Libraries</span>
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>
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 />
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
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 />
435 <div [ngbNavOutlet]="searchTabs" class="mt-2"></div>
438 <div class="col-lg-4">
440 <div class="col-lg-12">
442 <div class="card-body">
443 <div class="float-end d-flex">
445 (onChange)="orgOnChange($event)"
446 [initialOrg]="context.searchOrg"
447 [placeholder]="'Library'" i18n-placeholder
448 ariaLabel="Library" i18n-ariaLabel>
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>
456 <button type="button" class="btn btn-destroy me-1" type="button"
457 [disabled]="searchIsActive()"
458 (click)="context.reset()" i18n>
466 <div class="row mt-1">
467 <div class="col-lg-12">
468 <eg-catalog-search-templates [searchTab]="searchTab">
469 </eg-catalog-search-templates>
472 <div class="row mt-1">
473 <div class="col-lg-12">
474 <eg-catalog-basket-actions></eg-catalog-basket-actions>
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}}