@searchstax-inc/searchstudio-ux-angular 1.2.53 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (48) hide show
  1. package/CHANGELOG.md +8 -1
  2. package/README.md +1188 -686
  3. package/esm2022/lib/components/searchstax-input/searchstax-input.component.mjs +6 -40
  4. package/esm2022/lib/components/searchstax-results/searchstax-results.component.mjs +5 -3
  5. package/esm2022/lib/components/searchstax-search-answer/searchstax-search-answer.component.mjs +4 -3
  6. package/esm2022/lib/components/searchstax-search-external/searchstax-search-external.component.mjs +4 -3
  7. package/esm2022/lib/components/searchstax-search-facets/searchstax-search-facets.component.mjs +5 -3
  8. package/esm2022/lib/components/searchstax-search-location/searchstax-search-location.component.mjs +4 -4
  9. package/esm2022/lib/components/searchstax-search-overview/searchstax-search-overview.component.mjs +4 -3
  10. package/esm2022/lib/components/searchstax-search-pagination/searchstax-search-pagination.component.mjs +5 -3
  11. package/esm2022/lib/components/searchstax-search-related/searchstax-search-related.component.mjs +4 -3
  12. package/esm2022/lib/components/searchstax-search-sorting/searchstax-search-sorting.component.mjs +4 -4
  13. package/esm2022/lib/components/templates/SearchstaxLocationWidgetTemplateConfig.mjs +91 -0
  14. package/esm2022/lib/components/templates/searchstax-search-answer-template.mjs +119 -0
  15. package/esm2022/lib/components/templates/searchstax-search-external-template.mjs +107 -0
  16. package/esm2022/lib/components/templates/searchstax-search-facet-desktop-template.mjs +207 -0
  17. package/esm2022/lib/components/templates/searchstax-search-facet-mobile-template.mjs +343 -0
  18. package/esm2022/lib/components/templates/searchstax-search-input-template.mjs +126 -0
  19. package/esm2022/lib/components/templates/searchstax-search-location-template.mjs +152 -0
  20. package/esm2022/lib/components/templates/searchstax-search-no-results-template.mjs +85 -0
  21. package/esm2022/lib/components/templates/searchstax-search-overview-template.mjs +87 -0
  22. package/esm2022/lib/components/templates/searchstax-search-pagination-infinite-template.mjs +60 -0
  23. package/esm2022/lib/components/templates/searchstax-search-pagination-template.mjs +96 -0
  24. package/esm2022/lib/components/templates/searchstax-search-related-template.mjs +81 -0
  25. package/esm2022/lib/components/templates/searchstax-search-results-template.mjs +171 -0
  26. package/esm2022/lib/components/templates/searchstax-search-sorting-template.mjs +76 -0
  27. package/esm2022/lib/searchstudio-ux-angular.module.mjs +70 -5
  28. package/esm2022/public-api.mjs +14 -1
  29. package/fesm2022/searchstax-inc-searchstudio-ux-angular.mjs +1840 -64
  30. package/fesm2022/searchstax-inc-searchstudio-ux-angular.mjs.map +1 -1
  31. package/lib/components/searchstax-input/searchstax-input.component.d.ts +11 -1
  32. package/lib/components/templates/SearchstaxLocationWidgetTemplateConfig.d.ts +13 -0
  33. package/lib/components/templates/searchstax-search-answer-template.d.ts +7 -0
  34. package/lib/components/templates/searchstax-search-external-template.d.ts +7 -0
  35. package/lib/components/templates/searchstax-search-facet-desktop-template.d.ts +7 -0
  36. package/lib/components/templates/searchstax-search-facet-mobile-template.d.ts +7 -0
  37. package/lib/components/templates/searchstax-search-input-template.d.ts +7 -0
  38. package/lib/components/templates/searchstax-search-location-template.d.ts +7 -0
  39. package/lib/components/templates/searchstax-search-no-results-template.d.ts +7 -0
  40. package/lib/components/templates/searchstax-search-overview-template.d.ts +7 -0
  41. package/lib/components/templates/searchstax-search-pagination-infinite-template.d.ts +7 -0
  42. package/lib/components/templates/searchstax-search-pagination-template.d.ts +7 -0
  43. package/lib/components/templates/searchstax-search-related-template.d.ts +7 -0
  44. package/lib/components/templates/searchstax-search-results-template.d.ts +7 -0
  45. package/lib/components/templates/searchstax-search-sorting-template.d.ts +7 -0
  46. package/lib/searchstudio-ux-angular.module.d.ts +16 -3
  47. package/package.json +2 -2
  48. package/public-api.d.ts +13 -0
@@ -1,9 +1,9 @@
1
1
  import * as i0 from '@angular/core';
2
- import { Injectable, EventEmitter, Output, Input, Component, NgModule } from '@angular/core';
2
+ import { Injectable, EventEmitter, Output, Input, Component, ViewChild, NgModule } from '@angular/core';
3
3
  import { Searchstax } from '@searchstax-inc/searchstudio-ux-js';
4
- import * as i2 from '@angular/common';
4
+ import * as i1 from '@angular/common';
5
5
  import { CommonModule } from '@angular/common';
6
- import * as i3 from '@angular/forms';
6
+ import * as i2 from '@angular/forms';
7
7
  import { FormsModule } from '@angular/forms';
8
8
 
9
9
  class StoreServiceService {
@@ -110,6 +110,243 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
110
110
  type: Output
111
111
  }] } });
112
112
 
113
+ //CUT START
114
+ const config = {
115
+ appId: "APP_ID",
116
+ relatedSearchesAPIKey: "KEY"
117
+ };
118
+ const locationWidgetConfig = {
119
+ locationDecode: (term) => {
120
+ return new Promise((resolve) => {
121
+ // make a request to google geocoding API to retrieve lat, lon and address
122
+ const geocodingAPIKey = "GEOCODING_API_KEY";
123
+ const geocodingURL = `https://maps.googleapis.com/maps/api/geocode/json?address=${encodeURIComponent(term)}&key=${geocodingAPIKey}`;
124
+ fetch(geocodingURL)
125
+ .then((response) => response.json())
126
+ .then((data) => {
127
+ if (data.status === "OK" && data.results.length > 0) {
128
+ const result = data.results[0];
129
+ const location = {
130
+ lat: result.geometry.location.lat,
131
+ lon: result.geometry.location.lng,
132
+ address: result.formatted_address,
133
+ };
134
+ resolve(location);
135
+ }
136
+ else {
137
+ resolve({
138
+ address: undefined,
139
+ lat: undefined,
140
+ lon: undefined,
141
+ error: true,
142
+ });
143
+ }
144
+ })
145
+ .catch(() => {
146
+ resolve({
147
+ address: undefined,
148
+ lat: undefined,
149
+ lon: undefined,
150
+ error: true,
151
+ });
152
+ });
153
+ });
154
+ },
155
+ locationDecodeCoordinatesToAddress: (lat, lon) => {
156
+ return new Promise((resolve) => {
157
+ fetch(`https://geocoding-staging.searchstax.co/reverse?location=${lat},${lon}&components=country:US&app_id=${config.appId}`, {
158
+ method: "GET",
159
+ headers: {
160
+ Authorization: `Token ${config.relatedSearchesAPIKey}`,
161
+ },
162
+ })
163
+ .then((response) => response.json())
164
+ .then((data) => {
165
+ if (data.status === "OK" && data.results.length > 0) {
166
+ const result = data.results[0];
167
+ resolve({
168
+ address: result.formatted_address,
169
+ lat: lat,
170
+ lon: lon,
171
+ error: false,
172
+ });
173
+ }
174
+ else {
175
+ resolve({
176
+ address: undefined,
177
+ lat: lat,
178
+ lon: lon,
179
+ error: true,
180
+ });
181
+ }
182
+ })
183
+ .catch(() => {
184
+ resolve({
185
+ address: undefined,
186
+ lat: lat,
187
+ lon: lon,
188
+ error: true,
189
+ });
190
+ });
191
+ });
192
+ },
193
+ locationSearchEnabled: false,
194
+ locationValuesOverride: {
195
+ locationDistanceEnabled: true,
196
+ filterValues: ["any", "1000"],
197
+ filterUnit: "miles",
198
+ locationFilterDefaultValue: "any"
199
+ },
200
+ };
201
+
202
+ // reusable-template.component.ts
203
+ class LocationTemplateComponent {
204
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: LocationTemplateComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
205
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: LocationTemplateComponent, selector: "app-location-template", viewQueries: [{ propertyName: "locationTemplate", first: true, predicate: ["locationTemplate"], descendants: true }], ngImport: i0, template: `
206
+ <ng-template
207
+ #locationTemplate
208
+ let-context="context"
209
+ let-locationData="locationData"
210
+ let-inputValue="inputValue"
211
+ let-selectValue="selectValue"
212
+ let-radiusChange="radiusChange"
213
+ let-inputChange="inputChange"
214
+ let-locationBlur="locationBlur"
215
+ let-locationError="locationError"
216
+ let-getCurrentLocation="getCurrentLocation"
217
+ >
218
+ <div
219
+ class="searchstax-location-input-container"
220
+ data-test-id="searchstax-location-input-container"
221
+ *ngIf="locationData"
222
+ >
223
+ <div class="searchstax-location-input-wrapper">
224
+ <span class="searchstax-location-input-label">NEAR</span>
225
+ <div class="searchstax-location-input-wrapper-inner">
226
+ <input
227
+ type="text"
228
+ id="searchstax-location-input"
229
+ class="searchstax-location-input"
230
+ [ngClass]="{
231
+ 'searchstax-input-location-error': locationError
232
+ }"
233
+ placeholder="Zip, Postal Code or City..."
234
+ aria-label="Search Location Input"
235
+ data-test-id="searchstax-location-input"
236
+ [value]="inputValue"
237
+ (change)="inputChange($event, context)"
238
+ (blur)="locationBlur(context)"
239
+ />
240
+ <button
241
+ (click)="getCurrentLocation(context)"
242
+ class="searchstax-get-current-location-button"
243
+ >
244
+ Use my current location
245
+ </button>
246
+ </div>
247
+ <span
248
+ *ngIf="locationData.shouldShowLocationDistanceDropdown"
249
+ class="searchstax-location-input-label"
250
+ >WITHIN</span
251
+ >
252
+ <select
253
+ *ngIf="locationData.shouldShowLocationDistanceDropdown"
254
+ id="searchstax-location-radius-select"
255
+ class="searchstax-location-radius-select"
256
+ aria-label="Search Location Radius Select"
257
+ data-test-id="searchstax-location-radius-select"
258
+ (change)="radiusChange($event, context)"
259
+ [(ngModel)]="context.selectValue"
260
+ >
261
+ <option
262
+ *ngFor="let value of locationData.locationSearchDistanceValues"
263
+ [value]="value.value"
264
+ >
265
+ {{ value.label }}
266
+ </option>
267
+ </select>
268
+ </div>
269
+ </div>
270
+ </ng-template>
271
+ `, isInline: true, dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] }); }
272
+ }
273
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: LocationTemplateComponent, decorators: [{
274
+ type: Component,
275
+ args: [{
276
+ selector: "app-location-template",
277
+ template: `
278
+ <ng-template
279
+ #locationTemplate
280
+ let-context="context"
281
+ let-locationData="locationData"
282
+ let-inputValue="inputValue"
283
+ let-selectValue="selectValue"
284
+ let-radiusChange="radiusChange"
285
+ let-inputChange="inputChange"
286
+ let-locationBlur="locationBlur"
287
+ let-locationError="locationError"
288
+ let-getCurrentLocation="getCurrentLocation"
289
+ >
290
+ <div
291
+ class="searchstax-location-input-container"
292
+ data-test-id="searchstax-location-input-container"
293
+ *ngIf="locationData"
294
+ >
295
+ <div class="searchstax-location-input-wrapper">
296
+ <span class="searchstax-location-input-label">NEAR</span>
297
+ <div class="searchstax-location-input-wrapper-inner">
298
+ <input
299
+ type="text"
300
+ id="searchstax-location-input"
301
+ class="searchstax-location-input"
302
+ [ngClass]="{
303
+ 'searchstax-input-location-error': locationError
304
+ }"
305
+ placeholder="Zip, Postal Code or City..."
306
+ aria-label="Search Location Input"
307
+ data-test-id="searchstax-location-input"
308
+ [value]="inputValue"
309
+ (change)="inputChange($event, context)"
310
+ (blur)="locationBlur(context)"
311
+ />
312
+ <button
313
+ (click)="getCurrentLocation(context)"
314
+ class="searchstax-get-current-location-button"
315
+ >
316
+ Use my current location
317
+ </button>
318
+ </div>
319
+ <span
320
+ *ngIf="locationData.shouldShowLocationDistanceDropdown"
321
+ class="searchstax-location-input-label"
322
+ >WITHIN</span
323
+ >
324
+ <select
325
+ *ngIf="locationData.shouldShowLocationDistanceDropdown"
326
+ id="searchstax-location-radius-select"
327
+ class="searchstax-location-radius-select"
328
+ aria-label="Search Location Radius Select"
329
+ data-test-id="searchstax-location-radius-select"
330
+ (change)="radiusChange($event, context)"
331
+ [(ngModel)]="context.selectValue"
332
+ >
333
+ <option
334
+ *ngFor="let value of locationData.locationSearchDistanceValues"
335
+ [value]="value.value"
336
+ >
337
+ {{ value.label }}
338
+ </option>
339
+ </select>
340
+ </div>
341
+ </div>
342
+ </ng-template>
343
+ `,
344
+ }]
345
+ }], propDecorators: { locationTemplate: [{
346
+ type: ViewChild,
347
+ args: ["locationTemplate"]
348
+ }] } });
349
+
113
350
  class SearchstaxSearchLocationWidget {
114
351
  constructor(storeServiceService) {
115
352
  this.storeServiceService = storeServiceService;
@@ -180,11 +417,11 @@ class SearchstaxSearchLocationWidget {
180
417
  });
181
418
  }
182
419
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SearchstaxSearchLocationWidget, deps: [{ token: StoreServiceService }], target: i0.ɵɵFactoryTarget.Component }); }
183
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: SearchstaxSearchLocationWidget, selector: "app-searchstax-search-location", inputs: { templateOverride: "templateOverride", locationSearchEnabled: "locationSearchEnabled", locationValuesOverride: "locationValuesOverride", locationDecode: "locationDecode", locationDecodeCoordinatesToAddress: "locationDecodeCoordinatesToAddress" }, ngImport: i0, template: "<div\n [id]=\"'searchstax-location-container' + rand\"\n class=\"searchstax-location-container\"\n>\n <div\n class=\"searchstax-location-input-container\"\n data-test-id=\"searchstax-location-input-container\"\n *ngIf=\"locationData && !templateOverride\"\n >\n <div class=\"searchstax-location-input-wrapper\">\n <span class=\"searchstax-location-input-label\">NEAR</span>\n <div class=\"searchstax-location-input-wrapper-inner\">\n <input\n type=\"text\"\n id=\"searchstax-location-input\"\n class=\"searchstax-location-input\"\n [ngClass]=\"{\n 'searchstax-input-location-error': locationError\n }\"\n placeholder=\"Zip, Postal Code or City...\"\n aria-label=\"Search Location Input\"\n data-test-id=\"searchstax-location-input\"\n [(ngModel)]=\"inputValue\"\n (blur)=\"locationBlur(context)\"\n />\n <button\n (click)=\"getCurrentLocation(context)\"\n class=\"searchstax-get-current-location-button\"\n >\n Use my current location\n </button>\n </div>\n <span\n *ngIf=\"locationData.shouldShowLocationDistanceDropdown\"\n class=\"searchstax-location-input-label\"\n >WITHIN</span\n >\n <select\n *ngIf=\"locationData.shouldShowLocationDistanceDropdown\"\n id=\"searchstax-location-radius-select\"\n class=\"searchstax-location-radius-select\"\n aria-label=\"Search Location Radius Select\"\n data-test-id=\"searchstax-location-radius-select\"\n (change)=\"radiusChange($event, context)\"\n [(ngModel)]=\"selectValue\"\n >\n <option\n *ngFor=\"let value of locationData.locationSearchDistanceValues\"\n [value]=\"value.value\"\n >\n {{ value.label }}\n </option>\n </select>\n </div>\n </div>\n\n <div *ngIf=\"locationData && templateOverride\">\n <ng-container\n *ngTemplateOutlet=\"templateOverride; context: context\"\n ></ng-container>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] }); }
420
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: SearchstaxSearchLocationWidget, selector: "app-searchstax-search-location", inputs: { templateOverride: "templateOverride", locationSearchEnabled: "locationSearchEnabled", locationValuesOverride: "locationValuesOverride", locationDecode: "locationDecode", locationDecodeCoordinatesToAddress: "locationDecodeCoordinatesToAddress" }, ngImport: i0, template: "<div\n [id]=\"'searchstax-location-container' + rand\"\n class=\"searchstax-location-container\"\n>\n <div *ngIf=\"!!locationData && !templateOverride\">\n <app-location-template #ref></app-location-template>\n <ng-template\n *ngTemplateOutlet=\"ref.locationTemplate; context: context\"\n ></ng-template>\n </div>\n\n <div *ngIf=\"!!locationData && templateOverride\">\n <ng-container\n *ngTemplateOutlet=\"templateOverride; context: context\"\n ></ng-container>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: LocationTemplateComponent, selector: "app-location-template" }] }); }
184
421
  }
185
422
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SearchstaxSearchLocationWidget, decorators: [{
186
423
  type: Component,
187
- args: [{ selector: "app-searchstax-search-location", template: "<div\n [id]=\"'searchstax-location-container' + rand\"\n class=\"searchstax-location-container\"\n>\n <div\n class=\"searchstax-location-input-container\"\n data-test-id=\"searchstax-location-input-container\"\n *ngIf=\"locationData && !templateOverride\"\n >\n <div class=\"searchstax-location-input-wrapper\">\n <span class=\"searchstax-location-input-label\">NEAR</span>\n <div class=\"searchstax-location-input-wrapper-inner\">\n <input\n type=\"text\"\n id=\"searchstax-location-input\"\n class=\"searchstax-location-input\"\n [ngClass]=\"{\n 'searchstax-input-location-error': locationError\n }\"\n placeholder=\"Zip, Postal Code or City...\"\n aria-label=\"Search Location Input\"\n data-test-id=\"searchstax-location-input\"\n [(ngModel)]=\"inputValue\"\n (blur)=\"locationBlur(context)\"\n />\n <button\n (click)=\"getCurrentLocation(context)\"\n class=\"searchstax-get-current-location-button\"\n >\n Use my current location\n </button>\n </div>\n <span\n *ngIf=\"locationData.shouldShowLocationDistanceDropdown\"\n class=\"searchstax-location-input-label\"\n >WITHIN</span\n >\n <select\n *ngIf=\"locationData.shouldShowLocationDistanceDropdown\"\n id=\"searchstax-location-radius-select\"\n class=\"searchstax-location-radius-select\"\n aria-label=\"Search Location Radius Select\"\n data-test-id=\"searchstax-location-radius-select\"\n (change)=\"radiusChange($event, context)\"\n [(ngModel)]=\"selectValue\"\n >\n <option\n *ngFor=\"let value of locationData.locationSearchDistanceValues\"\n [value]=\"value.value\"\n >\n {{ value.label }}\n </option>\n </select>\n </div>\n </div>\n\n <div *ngIf=\"locationData && templateOverride\">\n <ng-container\n *ngTemplateOutlet=\"templateOverride; context: context\"\n ></ng-container>\n </div>\n</div>\n" }]
424
+ args: [{ selector: "app-searchstax-search-location", template: "<div\n [id]=\"'searchstax-location-container' + rand\"\n class=\"searchstax-location-container\"\n>\n <div *ngIf=\"!!locationData && !templateOverride\">\n <app-location-template #ref></app-location-template>\n <ng-template\n *ngTemplateOutlet=\"ref.locationTemplate; context: context\"\n ></ng-template>\n </div>\n\n <div *ngIf=\"!!locationData && templateOverride\">\n <ng-container\n *ngTemplateOutlet=\"templateOverride; context: context\"\n ></ng-container>\n </div>\n</div>\n" }]
188
425
  }], ctorParameters: () => [{ type: StoreServiceService }], propDecorators: { templateOverride: [{
189
426
  type: Input
190
427
  }], locationSearchEnabled: [{
@@ -197,6 +434,128 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
197
434
  type: Input
198
435
  }] } });
199
436
 
437
+ // reusable-template.component.ts
438
+ class InputTemplateComponent {
439
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: InputTemplateComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
440
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: InputTemplateComponent, selector: "app-input-template", viewQueries: [{ propertyName: "inputTemplate", first: true, predicate: ["inputTemplate"], descendants: true }], ngImport: i0, template: `
441
+ <ng-template
442
+ #inputTemplate
443
+ let-suggestions="suggestions"
444
+ let-onMouseLeave="onMouseLeave"
445
+ let-onMouseOver="onMouseOver"
446
+ let-onMouseClick="onMouseClick"
447
+ let-context="context"
448
+ let-locationWidgetConfig="locationWidgetConfig"
449
+ >
450
+ <div class="searchstax-search-input-wrapper">
451
+ <input
452
+ type="text"
453
+ id="searchstax-search-input"
454
+ class="searchstax-search-input"
455
+ placeholder="SEARCH FOR..."
456
+ aria-label="search"
457
+ />
458
+ <div
459
+ class="searchstax-autosuggest-container"
460
+ [ngClass]="{ hidden: suggestions.length === 0 }"
461
+ (mouseleave)="onMouseLeave(context)"
462
+ >
463
+ <div
464
+ class="searchstax-autosuggest-item"
465
+ *ngFor="let suggestion of suggestions"
466
+ >
467
+ <div
468
+ class="searchstax-autosuggest-item-term-container"
469
+ [innerHtml]="suggestion.term"
470
+ (mouseover)="onMouseOver(suggestion, context)"
471
+ tabindex="0"
472
+ (click)="onMouseClick($event, context)"
473
+ ></div>
474
+ </div>
475
+ </div>
476
+ </div>
477
+ <app-searchstax-search-location
478
+ [locationDecode]="locationWidgetConfig.locationDecode"
479
+ [locationDecodeCoordinatesToAddress]="
480
+ locationWidgetConfig.locationDecodeCoordinatesToAddress
481
+ "
482
+ [locationSearchEnabled]="locationWidgetConfig.locationSearchEnabled"
483
+ [locationValuesOverride]="locationWidgetConfig.locationValuesOverride"
484
+ >
485
+ </app-searchstax-search-location>
486
+ <button
487
+ class="searchstax-spinner-icon"
488
+ id="searchstax-search-input-action-button"
489
+ role="button"
490
+ aria-label="search"
491
+ ></button>
492
+ </ng-template>
493
+ `, isInline: true, dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: SearchstaxSearchLocationWidget, selector: "app-searchstax-search-location", inputs: ["templateOverride", "locationSearchEnabled", "locationValuesOverride", "locationDecode", "locationDecodeCoordinatesToAddress"] }] }); }
494
+ }
495
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: InputTemplateComponent, decorators: [{
496
+ type: Component,
497
+ args: [{
498
+ selector: "app-input-template",
499
+ template: `
500
+ <ng-template
501
+ #inputTemplate
502
+ let-suggestions="suggestions"
503
+ let-onMouseLeave="onMouseLeave"
504
+ let-onMouseOver="onMouseOver"
505
+ let-onMouseClick="onMouseClick"
506
+ let-context="context"
507
+ let-locationWidgetConfig="locationWidgetConfig"
508
+ >
509
+ <div class="searchstax-search-input-wrapper">
510
+ <input
511
+ type="text"
512
+ id="searchstax-search-input"
513
+ class="searchstax-search-input"
514
+ placeholder="SEARCH FOR..."
515
+ aria-label="search"
516
+ />
517
+ <div
518
+ class="searchstax-autosuggest-container"
519
+ [ngClass]="{ hidden: suggestions.length === 0 }"
520
+ (mouseleave)="onMouseLeave(context)"
521
+ >
522
+ <div
523
+ class="searchstax-autosuggest-item"
524
+ *ngFor="let suggestion of suggestions"
525
+ >
526
+ <div
527
+ class="searchstax-autosuggest-item-term-container"
528
+ [innerHtml]="suggestion.term"
529
+ (mouseover)="onMouseOver(suggestion, context)"
530
+ tabindex="0"
531
+ (click)="onMouseClick($event, context)"
532
+ ></div>
533
+ </div>
534
+ </div>
535
+ </div>
536
+ <app-searchstax-search-location
537
+ [locationDecode]="locationWidgetConfig.locationDecode"
538
+ [locationDecodeCoordinatesToAddress]="
539
+ locationWidgetConfig.locationDecodeCoordinatesToAddress
540
+ "
541
+ [locationSearchEnabled]="locationWidgetConfig.locationSearchEnabled"
542
+ [locationValuesOverride]="locationWidgetConfig.locationValuesOverride"
543
+ >
544
+ </app-searchstax-search-location>
545
+ <button
546
+ class="searchstax-spinner-icon"
547
+ id="searchstax-search-input-action-button"
548
+ role="button"
549
+ aria-label="search"
550
+ ></button>
551
+ </ng-template>
552
+ `,
553
+ }]
554
+ }], propDecorators: { inputTemplate: [{
555
+ type: ViewChild,
556
+ args: ["inputTemplate"]
557
+ }] } });
558
+
200
559
  class SearchstaxInputWidget {
201
560
  constructor(storeServiceService) {
202
561
  this.storeServiceService = storeServiceService;
@@ -205,6 +564,7 @@ class SearchstaxInputWidget {
205
564
  this.suggestions = [];
206
565
  this.context = this;
207
566
  this.templateData = null;
567
+ this.locationWidgetConfig = locationWidgetConfig;
208
568
  }
209
569
  ngOnInit() {
210
570
  if (this.storeServiceService.searchstax) {
@@ -234,42 +594,6 @@ class SearchstaxInputWidget {
234
594
  throw Error("Searchstax instance needs to be passed via props");
235
595
  }
236
596
  }
237
- locationDecode(term) {
238
- return new Promise((resolve) => {
239
- // make a request to google geocoding API to retrieve lat, lon and address
240
- const geocodingAPIKey = "AIzaSyDK5wQQaz7kmP60_DViAto5rTQ301eVBFs";
241
- const geocodingURL = `https://maps.googleapis.com/maps/api/geocode/json?address=${encodeURIComponent(term)}&key=${geocodingAPIKey}`;
242
- fetch(geocodingURL)
243
- .then((response) => response.json())
244
- .then((data) => {
245
- if (data.status === "OK" && data.results.length > 0) {
246
- const result = data.results[0];
247
- const location = {
248
- lat: result.geometry.location.lat,
249
- lon: result.geometry.location.lng,
250
- address: result.formatted_address,
251
- };
252
- resolve(location);
253
- }
254
- else {
255
- resolve({
256
- address: undefined,
257
- lat: undefined,
258
- lon: undefined,
259
- error: true,
260
- });
261
- }
262
- })
263
- .catch(() => {
264
- resolve({
265
- address: undefined,
266
- lat: undefined,
267
- lon: undefined,
268
- error: true,
269
- });
270
- });
271
- });
272
- }
273
597
  onMouseLeave(context) {
274
598
  context.storeServiceService.searchstax.searchInputWidget?.resetAutosuggestSelection();
275
599
  context.storeServiceService.searchstax.searchInputWidget?.markActiveAutosuggestItem();
@@ -290,11 +614,11 @@ class SearchstaxInputWidget {
290
614
  });
291
615
  }
292
616
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SearchstaxInputWidget, deps: [{ token: StoreServiceService }], target: i0.ɵɵFactoryTarget.Component }); }
293
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: SearchstaxInputWidget, selector: "app-searchstax-input", inputs: { afterAutosuggest: "afterAutosuggest", beforeAutosuggest: "beforeAutosuggest", searchInputId: "searchInputId", suggestAfterMinChars: "suggestAfterMinChars", templateOverride: "templateOverride" }, ngImport: i0, template: "<div id=\"searchstax-input-container\">\n <div class=\"searchstax-search-input-container searchstax-search-input-container-new\" [class]=\"{ 'searchstax-alternative-render': !!templateData?.locationEnabled }\">\n <ng-container *ngIf=\"!templateOverride\">\n <div class=\"searchstax-search-input-wrapper\">\n <input\n type=\"text\"\n id=\"searchstax-search-input\"\n class=\"searchstax-search-input\"\n placeholder=\"SEARCH FOR...\"\n aria-label=\"search\"\n />\n <div\n class=\"searchstax-autosuggest-container\"\n [ngClass]=\"{ hidden: suggestions.length === 0 }\"\n (mouseleave)=\"(onMouseLeave)\"\n >\n <div\n class=\"searchstax-autosuggest-item\"\n *ngFor=\"let suggestion of suggestions\"\n >\n <div\n class=\"searchstax-autosuggest-item-term-container\"\n [innerHtml]=\"suggestion.term\"\n (mouseover)=\"onMouseOver(suggestion, context)\"\n tabindex=\"0\"\n (click)=\"onMouseClick($event, context)\"\n ></div>\n </div>\n </div>\n </div>\n <app-searchstax-search-location [locationDecode]=\"locationDecode\"></app-searchstax-search-location>\n <button\n class=\"searchstax-spinner-icon\"\n id=\"searchstax-search-input-action-button\"\n aria-label=\"search\"\n ></button>\n </ng-container>\n <ng-container *ngIf=\"templateOverride\">\n <ng-container\n *ngTemplateOutlet=\"templateOverride; context: context\"\n ></ng-container>\n </ng-container>\n\n <!-- <slot\n name=\"input\"\n :suggestions=\"suggestions\"\n :onMouseClick=\"onMouseClick\"\n :onMouseOver=\"onMouseOver\"\n :onMouseLeave=\"onMouseLeave\"\n ></slot> -->\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: SearchstaxSearchLocationWidget, selector: "app-searchstax-search-location", inputs: ["templateOverride", "locationSearchEnabled", "locationValuesOverride", "locationDecode", "locationDecodeCoordinatesToAddress"] }] }); }
617
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: SearchstaxInputWidget, selector: "app-searchstax-input", inputs: { afterAutosuggest: "afterAutosuggest", beforeAutosuggest: "beforeAutosuggest", searchInputId: "searchInputId", suggestAfterMinChars: "suggestAfterMinChars", templateOverride: "templateOverride" }, ngImport: i0, template: "<div id=\"searchstax-input-container\">\n <div\n class=\"searchstax-search-input-container searchstax-search-input-container-new\"\n [class]=\"{\n 'searchstax-alternative-render': !!templateData?.locationEnabled\n }\"\n >\n <ng-container *ngIf=\"!templateOverride\">\n <app-input-template #ref></app-input-template>\n <ng-template\n *ngTemplateOutlet=\"ref.inputTemplate; context: context\"\n ></ng-template>\n </ng-container>\n <ng-container *ngIf=\"templateOverride\">\n <ng-container\n *ngTemplateOutlet=\"templateOverride; context: context\"\n ></ng-container>\n </ng-container>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: InputTemplateComponent, selector: "app-input-template" }] }); }
294
618
  }
295
619
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SearchstaxInputWidget, decorators: [{
296
620
  type: Component,
297
- args: [{ selector: "app-searchstax-input", template: "<div id=\"searchstax-input-container\">\n <div class=\"searchstax-search-input-container searchstax-search-input-container-new\" [class]=\"{ 'searchstax-alternative-render': !!templateData?.locationEnabled }\">\n <ng-container *ngIf=\"!templateOverride\">\n <div class=\"searchstax-search-input-wrapper\">\n <input\n type=\"text\"\n id=\"searchstax-search-input\"\n class=\"searchstax-search-input\"\n placeholder=\"SEARCH FOR...\"\n aria-label=\"search\"\n />\n <div\n class=\"searchstax-autosuggest-container\"\n [ngClass]=\"{ hidden: suggestions.length === 0 }\"\n (mouseleave)=\"(onMouseLeave)\"\n >\n <div\n class=\"searchstax-autosuggest-item\"\n *ngFor=\"let suggestion of suggestions\"\n >\n <div\n class=\"searchstax-autosuggest-item-term-container\"\n [innerHtml]=\"suggestion.term\"\n (mouseover)=\"onMouseOver(suggestion, context)\"\n tabindex=\"0\"\n (click)=\"onMouseClick($event, context)\"\n ></div>\n </div>\n </div>\n </div>\n <app-searchstax-search-location [locationDecode]=\"locationDecode\"></app-searchstax-search-location>\n <button\n class=\"searchstax-spinner-icon\"\n id=\"searchstax-search-input-action-button\"\n aria-label=\"search\"\n ></button>\n </ng-container>\n <ng-container *ngIf=\"templateOverride\">\n <ng-container\n *ngTemplateOutlet=\"templateOverride; context: context\"\n ></ng-container>\n </ng-container>\n\n <!-- <slot\n name=\"input\"\n :suggestions=\"suggestions\"\n :onMouseClick=\"onMouseClick\"\n :onMouseOver=\"onMouseOver\"\n :onMouseLeave=\"onMouseLeave\"\n ></slot> -->\n </div>\n</div>\n" }]
621
+ args: [{ selector: "app-searchstax-input", template: "<div id=\"searchstax-input-container\">\n <div\n class=\"searchstax-search-input-container searchstax-search-input-container-new\"\n [class]=\"{\n 'searchstax-alternative-render': !!templateData?.locationEnabled\n }\"\n >\n <ng-container *ngIf=\"!templateOverride\">\n <app-input-template #ref></app-input-template>\n <ng-template\n *ngTemplateOutlet=\"ref.inputTemplate; context: context\"\n ></ng-template>\n </ng-container>\n <ng-container *ngIf=\"templateOverride\">\n <ng-container\n *ngTemplateOutlet=\"templateOverride; context: context\"\n ></ng-container>\n </ng-container>\n </div>\n</div>\n" }]
298
622
  }], ctorParameters: () => [{ type: StoreServiceService }], propDecorators: { afterAutosuggest: [{
299
623
  type: Input
300
624
  }], beforeAutosuggest: [{
@@ -307,6 +631,256 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
307
631
  type: Input
308
632
  }] } });
309
633
 
634
+ // reusable-template.component.ts
635
+ class ResultsTemplateComponent {
636
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ResultsTemplateComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
637
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: ResultsTemplateComponent, selector: "app-results-template", viewQueries: [{ propertyName: "resultsTemplate", first: true, predicate: ["resultsTemplate"], descendants: true }], ngImport: i0, template: `
638
+ <ng-template
639
+ #resultsTemplate
640
+ let-searchResults="searchResults"
641
+ let-resultClicked="resultClicked"
642
+ let-isImage="isImage"
643
+ let-context="context"
644
+ >
645
+ <div class="searchstax-search-results">
646
+ <a
647
+ *ngFor="let searchResult of searchResults"
648
+ [href]="searchResult.url"
649
+ [attr.data-searchstax-unique-result-id]="searchResult.uniqueId"
650
+ (click)="resultClicked(searchResult, $event, context)"
651
+ (keyup.enter)="resultClicked(searchResult, $event, context)"
652
+ (keyup.space)="resultClicked(searchResult, $event, context)"
653
+ tabindex="0"
654
+ class="searchstax-result-item-link searchstax-result-item-link-wrapping"
655
+ >
656
+ <div
657
+ class="searchstax-search-result"
658
+ [ngClass]="{ 'has-thumbnail': searchResult.thumbnail }"
659
+ >
660
+ <div
661
+ *ngIf="searchResult.promoted"
662
+ class="searchstax-search-result-promoted"
663
+ ></div>
664
+ <div
665
+ *ngIf="searchResult.ribbon"
666
+ [innerHTML]="searchResult.ribbon"
667
+ class="searchstax-search-result-ribbon"
668
+ ></div>
669
+ <img
670
+ alt=""
671
+ *ngIf="searchResult.thumbnail"
672
+ [src]="searchResult.thumbnail"
673
+ class="searchstax-thumbnail"
674
+ />
675
+ <div class="searchstax-search-result-title-container">
676
+ <span
677
+ class="searchstax-search-result-title"
678
+ [innerHTML]="searchResult.title"
679
+ ></span>
680
+ </div>
681
+ <p
682
+ *ngIf="searchResult.paths"
683
+ class="searchstax-search-result-common"
684
+ [innerHTML]="searchResult.paths"
685
+ ></p>
686
+ <p
687
+ *ngIf="searchResult.description"
688
+ [innerHTML]="searchResult.description"
689
+ class="searchstax-search-result-description searchstax-search-result-common"
690
+ ></p>
691
+ <div *ngFor="let unmappedField of searchResult.unmappedFields">
692
+ <div
693
+ *ngIf="isImage(unmappedField)"
694
+ class="searchstax-search-result-image-container"
695
+ >
696
+ <img
697
+ alt=""
698
+ [src]="unmappedField.value"
699
+ class="searchstax-result-image"
700
+ />
701
+ </div>
702
+ <div *ngIf="!isImage(unmappedField)">
703
+ <p
704
+ class="searchstax-search-result-common"
705
+ [innerHTML]="unmappedField.value"
706
+ ></p>
707
+ </div>
708
+ </div>
709
+ </div>
710
+ </a>
711
+ </div>
712
+ </ng-template>
713
+ `, isInline: true, dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
714
+ }
715
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ResultsTemplateComponent, decorators: [{
716
+ type: Component,
717
+ args: [{
718
+ selector: "app-results-template",
719
+ template: `
720
+ <ng-template
721
+ #resultsTemplate
722
+ let-searchResults="searchResults"
723
+ let-resultClicked="resultClicked"
724
+ let-isImage="isImage"
725
+ let-context="context"
726
+ >
727
+ <div class="searchstax-search-results">
728
+ <a
729
+ *ngFor="let searchResult of searchResults"
730
+ [href]="searchResult.url"
731
+ [attr.data-searchstax-unique-result-id]="searchResult.uniqueId"
732
+ (click)="resultClicked(searchResult, $event, context)"
733
+ (keyup.enter)="resultClicked(searchResult, $event, context)"
734
+ (keyup.space)="resultClicked(searchResult, $event, context)"
735
+ tabindex="0"
736
+ class="searchstax-result-item-link searchstax-result-item-link-wrapping"
737
+ >
738
+ <div
739
+ class="searchstax-search-result"
740
+ [ngClass]="{ 'has-thumbnail': searchResult.thumbnail }"
741
+ >
742
+ <div
743
+ *ngIf="searchResult.promoted"
744
+ class="searchstax-search-result-promoted"
745
+ ></div>
746
+ <div
747
+ *ngIf="searchResult.ribbon"
748
+ [innerHTML]="searchResult.ribbon"
749
+ class="searchstax-search-result-ribbon"
750
+ ></div>
751
+ <img
752
+ alt=""
753
+ *ngIf="searchResult.thumbnail"
754
+ [src]="searchResult.thumbnail"
755
+ class="searchstax-thumbnail"
756
+ />
757
+ <div class="searchstax-search-result-title-container">
758
+ <span
759
+ class="searchstax-search-result-title"
760
+ [innerHTML]="searchResult.title"
761
+ ></span>
762
+ </div>
763
+ <p
764
+ *ngIf="searchResult.paths"
765
+ class="searchstax-search-result-common"
766
+ [innerHTML]="searchResult.paths"
767
+ ></p>
768
+ <p
769
+ *ngIf="searchResult.description"
770
+ [innerHTML]="searchResult.description"
771
+ class="searchstax-search-result-description searchstax-search-result-common"
772
+ ></p>
773
+ <div *ngFor="let unmappedField of searchResult.unmappedFields">
774
+ <div
775
+ *ngIf="isImage(unmappedField)"
776
+ class="searchstax-search-result-image-container"
777
+ >
778
+ <img
779
+ alt=""
780
+ [src]="unmappedField.value"
781
+ class="searchstax-result-image"
782
+ />
783
+ </div>
784
+ <div *ngIf="!isImage(unmappedField)">
785
+ <p
786
+ class="searchstax-search-result-common"
787
+ [innerHTML]="unmappedField.value"
788
+ ></p>
789
+ </div>
790
+ </div>
791
+ </div>
792
+ </a>
793
+ </div>
794
+ </ng-template>
795
+ `,
796
+ }]
797
+ }], propDecorators: { resultsTemplate: [{
798
+ type: ViewChild,
799
+ args: ["resultsTemplate"]
800
+ }] } });
801
+
802
+ // reusable-template.component.ts
803
+ class NoResultsTemplateComponent {
804
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NoResultsTemplateComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
805
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: NoResultsTemplateComponent, selector: "app-no-results-template", viewQueries: [{ propertyName: "noResultsTemplate", first: true, predicate: ["noResultsTemplate"], descendants: true }], ngImport: i0, template: `
806
+ <ng-template
807
+ #noResultsTemplate
808
+ let-metadata="metadata"
809
+ let-searchTerm="searchTerm"
810
+ let-executeSearch="executeSearch"
811
+ let-context="context"
812
+ >
813
+ <div class="searchstax-no-results">
814
+ Showing <strong>no results</strong> for
815
+ <strong>"{{ searchTerm }}"</strong>
816
+ <br />
817
+ <span *ngIf="metadata?.spellingSuggestion"
818
+ >&nbsp;Did you mean
819
+ <a
820
+ href="#"
821
+ [attr.aria-label]="'did you mean: ' + metadata?.spellingSuggestion"
822
+ class="searchstax-suggestion-term"
823
+ (click)="
824
+ executeSearch(metadata?.spellingSuggestion ?? '', $event, context)
825
+ "
826
+ >{{ metadata?.spellingSuggestion }}</a
827
+ >?</span
828
+ >
829
+ </div>
830
+ <ul>
831
+ <li>
832
+ Try searching for search related terms or topics. We offer a wide
833
+ variety of content to help you get the information you need.
834
+ </li>
835
+ <li>Lost? Click on the ‘X” in the Search Box to reset your search.</li>
836
+ </ul>
837
+ </ng-template>
838
+ `, isInline: true, dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
839
+ }
840
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: NoResultsTemplateComponent, decorators: [{
841
+ type: Component,
842
+ args: [{
843
+ selector: "app-no-results-template",
844
+ template: `
845
+ <ng-template
846
+ #noResultsTemplate
847
+ let-metadata="metadata"
848
+ let-searchTerm="searchTerm"
849
+ let-executeSearch="executeSearch"
850
+ let-context="context"
851
+ >
852
+ <div class="searchstax-no-results">
853
+ Showing <strong>no results</strong> for
854
+ <strong>"{{ searchTerm }}"</strong>
855
+ <br />
856
+ <span *ngIf="metadata?.spellingSuggestion"
857
+ >&nbsp;Did you mean
858
+ <a
859
+ href="#"
860
+ [attr.aria-label]="'did you mean: ' + metadata?.spellingSuggestion"
861
+ class="searchstax-suggestion-term"
862
+ (click)="
863
+ executeSearch(metadata?.spellingSuggestion ?? '', $event, context)
864
+ "
865
+ >{{ metadata?.spellingSuggestion }}</a
866
+ >?</span
867
+ >
868
+ </div>
869
+ <ul>
870
+ <li>
871
+ Try searching for search related terms or topics. We offer a wide
872
+ variety of content to help you get the information you need.
873
+ </li>
874
+ <li>Lost? Click on the ‘X” in the Search Box to reset your search.</li>
875
+ </ul>
876
+ </ng-template>
877
+ `,
878
+ }]
879
+ }], propDecorators: { noResultsTemplate: [{
880
+ type: ViewChild,
881
+ args: ["noResultsTemplate"]
882
+ }] } });
883
+
310
884
  class SearchstaxResultsWidget {
311
885
  get hooks() {
312
886
  const hooks = {};
@@ -371,11 +945,11 @@ class SearchstaxResultsWidget {
371
945
  return field.isImage && typeof field.value === 'string';
372
946
  }
373
947
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SearchstaxResultsWidget, deps: [{ token: StoreServiceService }], target: i0.ɵɵFactoryTarget.Component }); }
374
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: SearchstaxResultsWidget, selector: "app-searchstax-results", inputs: { afterLinkClick: "afterLinkClick", noResultsTemplate: "noResultsTemplate", resultsTemplate: "resultsTemplate", renderMethod: "renderMethod" }, ngImport: i0, template: "<div id=\"searchstax-results-container\">\n <div class=\"searchstax-search-results-container\">\n <div id=\"searchstax-result-container\">\n <div\n *ngIf=\"searchResults?.length === 0 && searchTerm !== '' && searchTerm !== '*' && storeServiceService.searchstax.dataLayer.parsedData.firstSearchHappened && !noResultsTemplate\"\n >\n <div class=\"searchstax-no-results\">\n Showing <strong>no results</strong> for\n <strong>\"{{ searchTerm }}\"</strong>\n <br />\n <span *ngIf=\"metadata?.spellingSuggestion\"\n >&nbsp;Did you mean\n <a href=\"#\" class=\"searchstax-suggestion-term\" (click)=\"executeSearch(metadata?.spellingSuggestion ?? '', $event, context)\">{{\n metadata?.spellingSuggestion\n }}</a\n >?</span\n >\n </div>\n <ul>\n <li>\n Try searching for search related terms or topics. We offer a wide\n variety of content to help you get the information you need.\n </li>\n <li>Lost? Click on the \u2018X\u201D in the Search Box to reset your search.</li>\n </ul>\n </div>\n <div\n *ngIf=\"searchResults?.length === 0 && searchTerm !== '' && searchTerm !== '*' && storeServiceService.searchstax.dataLayer.parsedData.firstSearchHappened && noResultsTemplate\"\n >\n <ng-container\n *ngTemplateOutlet=\"noResultsTemplate; context: context\"\n ></ng-container>\n </div>\n\n <div\n class=\"searchstax-search-results\"\n *ngIf=\"searchResults && searchResults.length && !resultsTemplate\"\n >\n\n <a\n *ngFor=\"let searchResult of searchResults\"\n [href]=\"searchResult.url\"\n [attr.data-searchstax-unique-result-id]=\"searchResult.uniqueId\"\n (click)=\"resultClicked(searchResult, $event, context)\"\n (keyup.enter)=\"resultClicked(searchResult, $event, context)\"\n (keyup.space)=\"resultClicked(searchResult, $event, context)\"\n tabindex=\"0\"\n class=\"searchstax-result-item-link searchstax-result-item-link-wrapping\"\n >\n\n <div\n class=\"searchstax-search-result\"\n [ngClass]=\"{ 'has-thumbnail': searchResult.thumbnail }\"\n\n >\n <div\n *ngIf=\"searchResult.promoted\"\n class=\"searchstax-search-result-promoted\"\n ></div>\n <div\n *ngIf=\"searchResult.ribbon\"\n [innerHTML]=\"searchResult.ribbon\"\n class=\"searchstax-search-result-ribbon\"\n >\n </div>\n <img\n *ngIf=\"searchResult.thumbnail\"\n [src]=\"searchResult.thumbnail\"\n class=\"searchstax-thumbnail\"\n />\n <div class=\"searchstax-search-result-title-container\">\n <span class=\"searchstax-search-result-title\" [innerHTML]=\"searchResult.title\"></span>\n </div>\n <p *ngIf=\"searchResult.paths\" class=\"searchstax-search-result-common\" [innerHTML]=\"searchResult.paths\">\n </p>\n <p\n *ngIf=\"searchResult.description\"\n [innerHTML]=\"searchResult.description\"\n class=\"searchstax-search-result-description searchstax-search-result-common\"\n >\n </p>\n <div *ngFor=\"let unmappedField of searchResult.unmappedFields\">\n <div\n *ngIf=\"isImage(unmappedField)\"\n class=\"searchstax-search-result-image-container\"\n >\n <img\n [src]=\"unmappedField.value\"\n class=\"searchstax-result-image\"\n />\n </div>\n <div *ngIf=\"!isImage(unmappedField)\">\n <p class=\"searchstax-search-result-common\"\n [innerHTML]=\"unmappedField.value\"\n >\n </p>\n </div>\n </div>\n </div>\n </a>\n </div>\n\n <div *ngIf=\"searchResults && searchResults.length && resultsTemplate\">\n <ng-container\n *ngTemplateOutlet=\"resultsTemplate; context: context\"\n ></ng-container>\n </div>\n </div>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] }); }
948
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: SearchstaxResultsWidget, selector: "app-searchstax-results", inputs: { afterLinkClick: "afterLinkClick", noResultsTemplate: "noResultsTemplate", resultsTemplate: "resultsTemplate", renderMethod: "renderMethod" }, ngImport: i0, template: "<div id=\"searchstax-results-container\">\n <section aria-label=\"search results container\" tabindex=\"0\">\n <div\n class=\"searchstax-search-results-container\"\n id=\"searchstax-search-results-container\"\n >\n <div id=\"searchstax-result-container\">\n <div\n *ngIf=\"\n searchResults?.length === 0 &&\n searchTerm !== '' &&\n searchTerm !== '*' &&\n storeServiceService.searchstax.dataLayer.parsedData\n .firstSearchHappened &&\n !noResultsTemplate\n \"\n >\n <app-no-results-template #ref></app-no-results-template>\n <ng-template\n *ngTemplateOutlet=\"ref.noResultsTemplate; context: context\"\n ></ng-template>\n </div>\n <div\n *ngIf=\"\n searchResults?.length === 0 &&\n searchTerm !== '' &&\n searchTerm !== '*' &&\n storeServiceService.searchstax.dataLayer.parsedData\n .firstSearchHappened &&\n noResultsTemplate\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"noResultsTemplate; context: context\"\n ></ng-container>\n </div>\n\n <ng-container\n *ngIf=\"searchResults && searchResults.length && !resultsTemplate\"\n >\n <app-results-template #ref></app-results-template>\n <ng-template\n *ngTemplateOutlet=\"ref.resultsTemplate; context: context\"\n ></ng-template>\n </ng-container>\n\n <div *ngIf=\"searchResults && searchResults.length && resultsTemplate\">\n <ng-container\n *ngTemplateOutlet=\"resultsTemplate; context: context\"\n ></ng-container>\n </div>\n </div>\n </div>\n </section>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: ResultsTemplateComponent, selector: "app-results-template" }, { kind: "component", type: NoResultsTemplateComponent, selector: "app-no-results-template" }] }); }
375
949
  }
376
950
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SearchstaxResultsWidget, decorators: [{
377
951
  type: Component,
378
- args: [{ selector: 'app-searchstax-results', template: "<div id=\"searchstax-results-container\">\n <div class=\"searchstax-search-results-container\">\n <div id=\"searchstax-result-container\">\n <div\n *ngIf=\"searchResults?.length === 0 && searchTerm !== '' && searchTerm !== '*' && storeServiceService.searchstax.dataLayer.parsedData.firstSearchHappened && !noResultsTemplate\"\n >\n <div class=\"searchstax-no-results\">\n Showing <strong>no results</strong> for\n <strong>\"{{ searchTerm }}\"</strong>\n <br />\n <span *ngIf=\"metadata?.spellingSuggestion\"\n >&nbsp;Did you mean\n <a href=\"#\" class=\"searchstax-suggestion-term\" (click)=\"executeSearch(metadata?.spellingSuggestion ?? '', $event, context)\">{{\n metadata?.spellingSuggestion\n }}</a\n >?</span\n >\n </div>\n <ul>\n <li>\n Try searching for search related terms or topics. We offer a wide\n variety of content to help you get the information you need.\n </li>\n <li>Lost? Click on the \u2018X\u201D in the Search Box to reset your search.</li>\n </ul>\n </div>\n <div\n *ngIf=\"searchResults?.length === 0 && searchTerm !== '' && searchTerm !== '*' && storeServiceService.searchstax.dataLayer.parsedData.firstSearchHappened && noResultsTemplate\"\n >\n <ng-container\n *ngTemplateOutlet=\"noResultsTemplate; context: context\"\n ></ng-container>\n </div>\n\n <div\n class=\"searchstax-search-results\"\n *ngIf=\"searchResults && searchResults.length && !resultsTemplate\"\n >\n\n <a\n *ngFor=\"let searchResult of searchResults\"\n [href]=\"searchResult.url\"\n [attr.data-searchstax-unique-result-id]=\"searchResult.uniqueId\"\n (click)=\"resultClicked(searchResult, $event, context)\"\n (keyup.enter)=\"resultClicked(searchResult, $event, context)\"\n (keyup.space)=\"resultClicked(searchResult, $event, context)\"\n tabindex=\"0\"\n class=\"searchstax-result-item-link searchstax-result-item-link-wrapping\"\n >\n\n <div\n class=\"searchstax-search-result\"\n [ngClass]=\"{ 'has-thumbnail': searchResult.thumbnail }\"\n\n >\n <div\n *ngIf=\"searchResult.promoted\"\n class=\"searchstax-search-result-promoted\"\n ></div>\n <div\n *ngIf=\"searchResult.ribbon\"\n [innerHTML]=\"searchResult.ribbon\"\n class=\"searchstax-search-result-ribbon\"\n >\n </div>\n <img\n *ngIf=\"searchResult.thumbnail\"\n [src]=\"searchResult.thumbnail\"\n class=\"searchstax-thumbnail\"\n />\n <div class=\"searchstax-search-result-title-container\">\n <span class=\"searchstax-search-result-title\" [innerHTML]=\"searchResult.title\"></span>\n </div>\n <p *ngIf=\"searchResult.paths\" class=\"searchstax-search-result-common\" [innerHTML]=\"searchResult.paths\">\n </p>\n <p\n *ngIf=\"searchResult.description\"\n [innerHTML]=\"searchResult.description\"\n class=\"searchstax-search-result-description searchstax-search-result-common\"\n >\n </p>\n <div *ngFor=\"let unmappedField of searchResult.unmappedFields\">\n <div\n *ngIf=\"isImage(unmappedField)\"\n class=\"searchstax-search-result-image-container\"\n >\n <img\n [src]=\"unmappedField.value\"\n class=\"searchstax-result-image\"\n />\n </div>\n <div *ngIf=\"!isImage(unmappedField)\">\n <p class=\"searchstax-search-result-common\"\n [innerHTML]=\"unmappedField.value\"\n >\n </p>\n </div>\n </div>\n </div>\n </a>\n </div>\n\n <div *ngIf=\"searchResults && searchResults.length && resultsTemplate\">\n <ng-container\n *ngTemplateOutlet=\"resultsTemplate; context: context\"\n ></ng-container>\n </div>\n </div>\n </div>\n</div>\n" }]
952
+ args: [{ selector: 'app-searchstax-results', template: "<div id=\"searchstax-results-container\">\n <section aria-label=\"search results container\" tabindex=\"0\">\n <div\n class=\"searchstax-search-results-container\"\n id=\"searchstax-search-results-container\"\n >\n <div id=\"searchstax-result-container\">\n <div\n *ngIf=\"\n searchResults?.length === 0 &&\n searchTerm !== '' &&\n searchTerm !== '*' &&\n storeServiceService.searchstax.dataLayer.parsedData\n .firstSearchHappened &&\n !noResultsTemplate\n \"\n >\n <app-no-results-template #ref></app-no-results-template>\n <ng-template\n *ngTemplateOutlet=\"ref.noResultsTemplate; context: context\"\n ></ng-template>\n </div>\n <div\n *ngIf=\"\n searchResults?.length === 0 &&\n searchTerm !== '' &&\n searchTerm !== '*' &&\n storeServiceService.searchstax.dataLayer.parsedData\n .firstSearchHappened &&\n noResultsTemplate\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"noResultsTemplate; context: context\"\n ></ng-container>\n </div>\n\n <ng-container\n *ngIf=\"searchResults && searchResults.length && !resultsTemplate\"\n >\n <app-results-template #ref></app-results-template>\n <ng-template\n *ngTemplateOutlet=\"ref.resultsTemplate; context: context\"\n ></ng-template>\n </ng-container>\n\n <div *ngIf=\"searchResults && searchResults.length && resultsTemplate\">\n <ng-container\n *ngTemplateOutlet=\"resultsTemplate; context: context\"\n ></ng-container>\n </div>\n </div>\n </div>\n </section>\n</div>\n" }]
379
953
  }], ctorParameters: () => [{ type: StoreServiceService }], propDecorators: { afterLinkClick: [{
380
954
  type: Input
381
955
  }], noResultsTemplate: [{
@@ -386,6 +960,90 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
386
960
  type: Input
387
961
  }] } });
388
962
 
963
+ // reusable-template.component.ts
964
+ class OverviewTemplateComponent {
965
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OverviewTemplateComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
966
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: OverviewTemplateComponent, selector: "app-overview-template", viewQueries: [{ propertyName: "overviewTemplate", first: true, predicate: ["feedbackTemplate"], descendants: true }], ngImport: i0, template: `
967
+ <ng-template
968
+ #feedbackTemplate
969
+ let-searchFeedbackData="searchFeedbackData"
970
+ let-onOriginalQueryClick="onOriginalQueryClick"
971
+ let-context="context"
972
+ >
973
+ <h2 class="searchstax-feedback-container">
974
+ Showing
975
+ <b
976
+ >{{ searchFeedbackData!.startResultIndex }} -
977
+ {{ searchFeedbackData!.endResultIndex }}</b
978
+ >
979
+ of <b>{{ searchFeedbackData!.totalResults }}</b> results
980
+ <span *ngIf="searchFeedbackData.searchTerm"
981
+ >for "<b>{{ searchFeedbackData!.searchTerm }}</b
982
+ >"
983
+ </span>
984
+ <div class="searchstax-feedback-container-suggested">
985
+ <div *ngIf="searchFeedbackData.autoCorrectedQuery">
986
+ Search instead for
987
+ <a
988
+ href="#"
989
+ (click)="onOriginalQueryClick($event, context)"
990
+ class="searchstax-feedback-original-query"
991
+ [attr.aria-label]="
992
+ 'Search instead for: ' + searchFeedbackData!.originalQuery
993
+ "
994
+ >{{ searchFeedbackData!.originalQuery }}</a
995
+ >
996
+ </div>
997
+ </div>
998
+ </h2>
999
+ </ng-template>
1000
+ `, isInline: true, dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
1001
+ }
1002
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: OverviewTemplateComponent, decorators: [{
1003
+ type: Component,
1004
+ args: [{
1005
+ selector: "app-overview-template",
1006
+ template: `
1007
+ <ng-template
1008
+ #feedbackTemplate
1009
+ let-searchFeedbackData="searchFeedbackData"
1010
+ let-onOriginalQueryClick="onOriginalQueryClick"
1011
+ let-context="context"
1012
+ >
1013
+ <h2 class="searchstax-feedback-container">
1014
+ Showing
1015
+ <b
1016
+ >{{ searchFeedbackData!.startResultIndex }} -
1017
+ {{ searchFeedbackData!.endResultIndex }}</b
1018
+ >
1019
+ of <b>{{ searchFeedbackData!.totalResults }}</b> results
1020
+ <span *ngIf="searchFeedbackData.searchTerm"
1021
+ >for "<b>{{ searchFeedbackData!.searchTerm }}</b
1022
+ >"
1023
+ </span>
1024
+ <div class="searchstax-feedback-container-suggested">
1025
+ <div *ngIf="searchFeedbackData.autoCorrectedQuery">
1026
+ Search instead for
1027
+ <a
1028
+ href="#"
1029
+ (click)="onOriginalQueryClick($event, context)"
1030
+ class="searchstax-feedback-original-query"
1031
+ [attr.aria-label]="
1032
+ 'Search instead for: ' + searchFeedbackData!.originalQuery
1033
+ "
1034
+ >{{ searchFeedbackData!.originalQuery }}</a
1035
+ >
1036
+ </div>
1037
+ </div>
1038
+ </h2>
1039
+ </ng-template>
1040
+ `,
1041
+ }]
1042
+ }], propDecorators: { overviewTemplate: [{
1043
+ type: ViewChild,
1044
+ args: ["feedbackTemplate"]
1045
+ }] } });
1046
+
389
1047
  class SearchstaxSearchFeedbackWidget {
390
1048
  constructor(storeServiceService) {
391
1049
  this.storeServiceService = storeServiceService;
@@ -414,15 +1072,167 @@ class SearchstaxSearchFeedbackWidget {
414
1072
  });
415
1073
  }
416
1074
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SearchstaxSearchFeedbackWidget, deps: [{ token: StoreServiceService }], target: i0.ɵɵFactoryTarget.Component }); }
417
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: SearchstaxSearchFeedbackWidget, selector: "app-searchstax-search-feedback", inputs: { templateOverride: "templateOverride" }, ngImport: i0, template: "<div\n class=\"search-feedback-container\"\n [id]=\"'search-feedback-container' + rand\"\n>\n <div\n class=\"searchstax-feedback-container\"\n *ngIf=\"\n searchFeedbackData &&\n searchFeedbackData?.searchExecuted &&\n !templateOverride &&\n searchFeedbackData?.totalResults\n \"\n >\n Showing\n <b\n >{{ searchFeedbackData!.startResultIndex }} -\n {{ searchFeedbackData!.endResultIndex }}</b\n >\n of <b>{{ searchFeedbackData!.totalResults }}</b> results\n <span *ngIf=\"searchFeedbackData.searchTerm\"\n >for \"<b>{{ searchFeedbackData!.searchTerm }}</b\n >\"\n </span>\n <div class=\"searchstax-feedback-container-suggested\">\n <div *ngIf=\"searchFeedbackData.autoCorrectedQuery\">\n Search instead for\n <a\n href=\"#\"\n (click)=\"onOriginalQueryClick($event, context)\"\n class=\"searchstax-feedback-original-query\"\n >{{ searchFeedbackData!.originalQuery }}</a\n >\n </div>\n </div>\n </div>\n\n <div\n *ngIf=\"\n searchFeedbackData &&\n searchFeedbackData?.searchExecuted &&\n templateOverride &&\n searchFeedbackData?.totalResults\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"templateOverride; context: context\"\n ></ng-container>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] }); }
1075
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: SearchstaxSearchFeedbackWidget, selector: "app-searchstax-search-feedback", inputs: { templateOverride: "templateOverride" }, ngImport: i0, template: "<div\n class=\"search-feedback-container\"\n [id]=\"'search-feedback-container' + rand\"\n>\n <div\n class=\"searchstax-feedback-container\"\n *ngIf=\"\n searchFeedbackData &&\n searchFeedbackData?.searchExecuted &&\n !templateOverride &&\n searchFeedbackData?.totalResults\n \"\n >\n <app-overview-template #ref></app-overview-template>\n <ng-template\n *ngTemplateOutlet=\"ref.overviewTemplate; context: context\"\n ></ng-template>\n </div>\n\n <div\n *ngIf=\"\n searchFeedbackData &&\n searchFeedbackData?.searchExecuted &&\n templateOverride &&\n searchFeedbackData?.totalResults\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"templateOverride; context: context\"\n ></ng-container>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: OverviewTemplateComponent, selector: "app-overview-template" }] }); }
418
1076
  }
419
1077
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SearchstaxSearchFeedbackWidget, decorators: [{
420
1078
  type: Component,
421
- args: [{ selector: "app-searchstax-search-feedback", template: "<div\n class=\"search-feedback-container\"\n [id]=\"'search-feedback-container' + rand\"\n>\n <div\n class=\"searchstax-feedback-container\"\n *ngIf=\"\n searchFeedbackData &&\n searchFeedbackData?.searchExecuted &&\n !templateOverride &&\n searchFeedbackData?.totalResults\n \"\n >\n Showing\n <b\n >{{ searchFeedbackData!.startResultIndex }} -\n {{ searchFeedbackData!.endResultIndex }}</b\n >\n of <b>{{ searchFeedbackData!.totalResults }}</b> results\n <span *ngIf=\"searchFeedbackData.searchTerm\"\n >for \"<b>{{ searchFeedbackData!.searchTerm }}</b\n >\"\n </span>\n <div class=\"searchstax-feedback-container-suggested\">\n <div *ngIf=\"searchFeedbackData.autoCorrectedQuery\">\n Search instead for\n <a\n href=\"#\"\n (click)=\"onOriginalQueryClick($event, context)\"\n class=\"searchstax-feedback-original-query\"\n >{{ searchFeedbackData!.originalQuery }}</a\n >\n </div>\n </div>\n </div>\n\n <div\n *ngIf=\"\n searchFeedbackData &&\n searchFeedbackData?.searchExecuted &&\n templateOverride &&\n searchFeedbackData?.totalResults\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"templateOverride; context: context\"\n ></ng-container>\n </div>\n</div>\n" }]
1079
+ args: [{ selector: "app-searchstax-search-feedback", template: "<div\n class=\"search-feedback-container\"\n [id]=\"'search-feedback-container' + rand\"\n>\n <div\n class=\"searchstax-feedback-container\"\n *ngIf=\"\n searchFeedbackData &&\n searchFeedbackData?.searchExecuted &&\n !templateOverride &&\n searchFeedbackData?.totalResults\n \"\n >\n <app-overview-template #ref></app-overview-template>\n <ng-template\n *ngTemplateOutlet=\"ref.overviewTemplate; context: context\"\n ></ng-template>\n </div>\n\n <div\n *ngIf=\"\n searchFeedbackData &&\n searchFeedbackData?.searchExecuted &&\n templateOverride &&\n searchFeedbackData?.totalResults\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"templateOverride; context: context\"\n ></ng-container>\n </div>\n</div>\n" }]
422
1080
  }], ctorParameters: () => [{ type: StoreServiceService }], propDecorators: { templateOverride: [{
423
1081
  type: Input
424
1082
  }] } });
425
1083
 
1084
+ // reusable-template.component.ts
1085
+ class PaginationTemplateComponent {
1086
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PaginationTemplateComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1087
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: PaginationTemplateComponent, selector: "app-pagination-template", viewQueries: [{ propertyName: "paginationTemplate", first: true, predicate: ["paginationTemplate"], descendants: true }], ngImport: i0, template: `
1088
+ <ng-template
1089
+ #paginationTemplate
1090
+ let-paginationData="paginationData"
1091
+ let-previousPage="previousPage"
1092
+ let-nextPage="nextPage"
1093
+ let-context="context"
1094
+ >
1095
+ <div class="searchstax-pagination-container">
1096
+ <div class="searchstax-pagination-content">
1097
+ <a
1098
+ class="searchstax-pagination-previous"
1099
+ [class]="paginationData.isFirstPage ? 'disabled' : ''"
1100
+ (click)="previousPage($event, context)"
1101
+ (keyup.enter)="previousPage($event, context)"
1102
+ (keyup.space)="previousPage($event, context)"
1103
+ tabindex="0"
1104
+ id="searchstax-pagination-previous"
1105
+ >
1106
+ &lt; Previous
1107
+ </a>
1108
+ <div class="searchstax-pagination-details">
1109
+ {{ paginationData?.startResultIndex }} -
1110
+ {{ paginationData?.endResultIndex }} of
1111
+ {{ paginationData?.totalResults }}
1112
+ </div>
1113
+ <a
1114
+ class="searchstax-pagination-next"
1115
+ [class]="paginationData.isLastPage ? 'disabled' : ''"
1116
+ (click)="nextPage($event, context)"
1117
+ (keyup.enter)="nextPage($event, context)"
1118
+ (keyup.space)="nextPage($event, context)"
1119
+ tabindex="0"
1120
+ id="searchstax-pagination-next"
1121
+ >Next ></a
1122
+ >
1123
+ </div>
1124
+ </div>
1125
+ </ng-template>
1126
+ `, isInline: true }); }
1127
+ }
1128
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PaginationTemplateComponent, decorators: [{
1129
+ type: Component,
1130
+ args: [{
1131
+ selector: "app-pagination-template",
1132
+ template: `
1133
+ <ng-template
1134
+ #paginationTemplate
1135
+ let-paginationData="paginationData"
1136
+ let-previousPage="previousPage"
1137
+ let-nextPage="nextPage"
1138
+ let-context="context"
1139
+ >
1140
+ <div class="searchstax-pagination-container">
1141
+ <div class="searchstax-pagination-content">
1142
+ <a
1143
+ class="searchstax-pagination-previous"
1144
+ [class]="paginationData.isFirstPage ? 'disabled' : ''"
1145
+ (click)="previousPage($event, context)"
1146
+ (keyup.enter)="previousPage($event, context)"
1147
+ (keyup.space)="previousPage($event, context)"
1148
+ tabindex="0"
1149
+ id="searchstax-pagination-previous"
1150
+ >
1151
+ &lt; Previous
1152
+ </a>
1153
+ <div class="searchstax-pagination-details">
1154
+ {{ paginationData?.startResultIndex }} -
1155
+ {{ paginationData?.endResultIndex }} of
1156
+ {{ paginationData?.totalResults }}
1157
+ </div>
1158
+ <a
1159
+ class="searchstax-pagination-next"
1160
+ [class]="paginationData.isLastPage ? 'disabled' : ''"
1161
+ (click)="nextPage($event, context)"
1162
+ (keyup.enter)="nextPage($event, context)"
1163
+ (keyup.space)="nextPage($event, context)"
1164
+ tabindex="0"
1165
+ id="searchstax-pagination-next"
1166
+ >Next ></a
1167
+ >
1168
+ </div>
1169
+ </div>
1170
+ </ng-template>
1171
+ `,
1172
+ }]
1173
+ }], propDecorators: { paginationTemplate: [{
1174
+ type: ViewChild,
1175
+ args: ["paginationTemplate"]
1176
+ }] } });
1177
+
1178
+ // reusable-template.component.ts
1179
+ class PaginationInfiniteTemplateComponent {
1180
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PaginationInfiniteTemplateComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1181
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: PaginationInfiniteTemplateComponent, selector: "app-pagination-infinite-template", viewQueries: [{ propertyName: "infiniteScrollTemplate", first: true, predicate: ["infiniteScrollTemplate"], descendants: true }], ngImport: i0, template: `
1182
+ <ng-template
1183
+ #infiniteScrollTemplate
1184
+ let-paginationData="paginationData"
1185
+ let-nextPage="nextPage"
1186
+ let-context="context"
1187
+ >
1188
+ <div class="searchstax-pagination-container">
1189
+ <div class="searchstax-pagination-content">
1190
+ <a
1191
+ class="searchstax-pagination-load-more"
1192
+ (click)="nextPage($event, context)"
1193
+ (keyup.enter)="nextPage($event, context)"
1194
+ (keyup.space)="nextPage($event, context)"
1195
+ tabindex="0"
1196
+ >
1197
+ Load More
1198
+ </a>
1199
+ </div>
1200
+ </div>
1201
+ </ng-template>
1202
+ `, isInline: true }); }
1203
+ }
1204
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: PaginationInfiniteTemplateComponent, decorators: [{
1205
+ type: Component,
1206
+ args: [{
1207
+ selector: "app-pagination-infinite-template",
1208
+ template: `
1209
+ <ng-template
1210
+ #infiniteScrollTemplate
1211
+ let-paginationData="paginationData"
1212
+ let-nextPage="nextPage"
1213
+ let-context="context"
1214
+ >
1215
+ <div class="searchstax-pagination-container">
1216
+ <div class="searchstax-pagination-content">
1217
+ <a
1218
+ class="searchstax-pagination-load-more"
1219
+ (click)="nextPage($event, context)"
1220
+ (keyup.enter)="nextPage($event, context)"
1221
+ (keyup.space)="nextPage($event, context)"
1222
+ tabindex="0"
1223
+ >
1224
+ Load More
1225
+ </a>
1226
+ </div>
1227
+ </div>
1228
+ </ng-template>
1229
+ `,
1230
+ }]
1231
+ }], propDecorators: { infiniteScrollTemplate: [{
1232
+ type: ViewChild,
1233
+ args: ["infiniteScrollTemplate"]
1234
+ }] } });
1235
+
426
1236
  class SearchstaxSearchPaginationWidget {
427
1237
  constructor(storeServiceService) {
428
1238
  this.storeServiceService = storeServiceService;
@@ -470,17 +1280,561 @@ class SearchstaxSearchPaginationWidget {
470
1280
  });
471
1281
  }
472
1282
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SearchstaxSearchPaginationWidget, deps: [{ token: StoreServiceService }], target: i0.ɵɵFactoryTarget.Component }); }
473
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: SearchstaxSearchPaginationWidget, selector: "app-searchstax-search-pagination", inputs: { templateOverride: "templateOverride", infiniteScrollTemplateOverride: "infiniteScrollTemplateOverride" }, ngImport: i0, template: "<div [id]=\"'searchstax-pagination-container' + rand\">\n <div\n class=\"searchstax-pagination-container\"\n *ngIf=\"\n paginationData?.totalResults &&\n !templateOverride &&\n !paginationData?.isInfiniteScroll\n \"\n >\n <div class=\"searchstax-pagination-content\">\n <a\n class=\"searchstax-pagination-previous\"\n [class]=\"paginationData?.isFirstPage ? 'disabled' : ''\"\n (click)=\"previousPage($event, context)\"\n (keyup.enter)=\"previousPage($event, context)\"\n (keyup.space)=\"previousPage($event, context)\"\n tabindex=\"0\"\n id=\"searchstax-pagination-previous\"\n >\n &lt; Previous\n </a>\n <div class=\"searchstax-pagination-details\">\n {{ paginationData?.startResultIndex }} -\n {{ paginationData?.endResultIndex }} of\n {{ paginationData?.totalResults }}\n </div>\n <a\n class=\"searchstax-pagination-next\"\n [class]=\"paginationData?.isLastPage ? 'disabled' : ''\"\n (click)=\"nextPage($event, context)\"\n (keyup.enter)=\"nextPage($event, context)\"\n (keyup.space)=\"nextPage($event, context)\"\n tabindex=\"0\"\n id=\"searchstax-pagination-next\"\n >Next ></a\n >\n </div>\n </div>\n\n <div\n *ngIf=\"\n paginationData?.totalResults &&\n templateOverride &&\n !paginationData?.isInfiniteScroll\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"templateOverride; context: context\"\n ></ng-container>\n </div>\n\n <div\n class=\"searchstax-pagination-container\"\n *ngIf=\"\n paginationData?.totalResults &&\n !infiniteScrollTemplateOverride &&\n paginationData?.totalResults !== 0 &&\n !paginationData?.isLastPage &&\n paginationData?.isInfiniteScroll\n \"\n >\n <a\n class=\"searchstax-pagination-load-more\"\n (click)=\"nextPage($event, context)\"\n (keyup.enter)=\"nextPage($event, context)\"\n (keyup.space)=\"nextPage($event, context)\"\n tabindex=\"0\"\n >\n Load More\n </a>\n </div>\n\n <div\n *ngIf=\"\n paginationData?.totalResults &&\n infiniteScrollTemplateOverride &&\n paginationData?.totalResults !== 0 &&\n !paginationData?.isLastPage &&\n paginationData?.isInfiniteScroll\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"infiniteScrollTemplateOverride; context: context\"\n ></ng-container>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] }); }
1283
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: SearchstaxSearchPaginationWidget, selector: "app-searchstax-search-pagination", inputs: { templateOverride: "templateOverride", infiniteScrollTemplateOverride: "infiniteScrollTemplateOverride" }, ngImport: i0, template: "<div [id]=\"'searchstax-pagination-container' + rand\">\n <ng-container\n *ngIf=\"\n paginationData?.totalResults &&\n !templateOverride &&\n !paginationData?.isInfiniteScroll\n \"\n >\n <app-pagination-template #ref></app-pagination-template>\n <ng-template\n *ngTemplateOutlet=\"ref.paginationTemplate; context: context\"\n ></ng-template>\n </ng-container>\n\n <div\n *ngIf=\"\n paginationData?.totalResults &&\n templateOverride &&\n !paginationData?.isInfiniteScroll\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"templateOverride; context: context\"\n ></ng-container>\n </div>\n\n <ng-container\n *ngIf=\"\n paginationData?.totalResults &&\n !infiniteScrollTemplateOverride &&\n paginationData?.totalResults !== 0 &&\n !paginationData?.isLastPage &&\n paginationData?.isInfiniteScroll\n \"\n >\n <app-pagination-infinite-template #ref></app-pagination-infinite-template>\n <ng-template\n *ngTemplateOutlet=\"ref.infiniteScrollTemplate; context: context\"\n ></ng-template>\n </ng-container>\n\n <div\n *ngIf=\"\n paginationData?.totalResults &&\n infiniteScrollTemplateOverride &&\n paginationData?.totalResults !== 0 &&\n !paginationData?.isLastPage &&\n paginationData?.isInfiniteScroll\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"infiniteScrollTemplateOverride; context: context\"\n ></ng-container>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: PaginationTemplateComponent, selector: "app-pagination-template" }, { kind: "component", type: PaginationInfiniteTemplateComponent, selector: "app-pagination-infinite-template" }] }); }
474
1284
  }
475
1285
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SearchstaxSearchPaginationWidget, decorators: [{
476
1286
  type: Component,
477
- args: [{ selector: "app-searchstax-search-pagination", template: "<div [id]=\"'searchstax-pagination-container' + rand\">\n <div\n class=\"searchstax-pagination-container\"\n *ngIf=\"\n paginationData?.totalResults &&\n !templateOverride &&\n !paginationData?.isInfiniteScroll\n \"\n >\n <div class=\"searchstax-pagination-content\">\n <a\n class=\"searchstax-pagination-previous\"\n [class]=\"paginationData?.isFirstPage ? 'disabled' : ''\"\n (click)=\"previousPage($event, context)\"\n (keyup.enter)=\"previousPage($event, context)\"\n (keyup.space)=\"previousPage($event, context)\"\n tabindex=\"0\"\n id=\"searchstax-pagination-previous\"\n >\n &lt; Previous\n </a>\n <div class=\"searchstax-pagination-details\">\n {{ paginationData?.startResultIndex }} -\n {{ paginationData?.endResultIndex }} of\n {{ paginationData?.totalResults }}\n </div>\n <a\n class=\"searchstax-pagination-next\"\n [class]=\"paginationData?.isLastPage ? 'disabled' : ''\"\n (click)=\"nextPage($event, context)\"\n (keyup.enter)=\"nextPage($event, context)\"\n (keyup.space)=\"nextPage($event, context)\"\n tabindex=\"0\"\n id=\"searchstax-pagination-next\"\n >Next ></a\n >\n </div>\n </div>\n\n <div\n *ngIf=\"\n paginationData?.totalResults &&\n templateOverride &&\n !paginationData?.isInfiniteScroll\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"templateOverride; context: context\"\n ></ng-container>\n </div>\n\n <div\n class=\"searchstax-pagination-container\"\n *ngIf=\"\n paginationData?.totalResults &&\n !infiniteScrollTemplateOverride &&\n paginationData?.totalResults !== 0 &&\n !paginationData?.isLastPage &&\n paginationData?.isInfiniteScroll\n \"\n >\n <a\n class=\"searchstax-pagination-load-more\"\n (click)=\"nextPage($event, context)\"\n (keyup.enter)=\"nextPage($event, context)\"\n (keyup.space)=\"nextPage($event, context)\"\n tabindex=\"0\"\n >\n Load More\n </a>\n </div>\n\n <div\n *ngIf=\"\n paginationData?.totalResults &&\n infiniteScrollTemplateOverride &&\n paginationData?.totalResults !== 0 &&\n !paginationData?.isLastPage &&\n paginationData?.isInfiniteScroll\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"infiniteScrollTemplateOverride; context: context\"\n ></ng-container>\n </div>\n</div>\n" }]
1287
+ args: [{ selector: "app-searchstax-search-pagination", template: "<div [id]=\"'searchstax-pagination-container' + rand\">\n <ng-container\n *ngIf=\"\n paginationData?.totalResults &&\n !templateOverride &&\n !paginationData?.isInfiniteScroll\n \"\n >\n <app-pagination-template #ref></app-pagination-template>\n <ng-template\n *ngTemplateOutlet=\"ref.paginationTemplate; context: context\"\n ></ng-template>\n </ng-container>\n\n <div\n *ngIf=\"\n paginationData?.totalResults &&\n templateOverride &&\n !paginationData?.isInfiniteScroll\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"templateOverride; context: context\"\n ></ng-container>\n </div>\n\n <ng-container\n *ngIf=\"\n paginationData?.totalResults &&\n !infiniteScrollTemplateOverride &&\n paginationData?.totalResults !== 0 &&\n !paginationData?.isLastPage &&\n paginationData?.isInfiniteScroll\n \"\n >\n <app-pagination-infinite-template #ref></app-pagination-infinite-template>\n <ng-template\n *ngTemplateOutlet=\"ref.infiniteScrollTemplate; context: context\"\n ></ng-template>\n </ng-container>\n\n <div\n *ngIf=\"\n paginationData?.totalResults &&\n infiniteScrollTemplateOverride &&\n paginationData?.totalResults !== 0 &&\n !paginationData?.isLastPage &&\n paginationData?.isInfiniteScroll\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"infiniteScrollTemplateOverride; context: context\"\n ></ng-container>\n </div>\n</div>\n" }]
478
1288
  }], ctorParameters: () => [{ type: StoreServiceService }], propDecorators: { templateOverride: [{
479
1289
  type: Input
480
1290
  }], infiniteScrollTemplateOverride: [{
481
1291
  type: Input
482
1292
  }] } });
483
1293
 
1294
+ // reusable-template.component.ts
1295
+ class FacetDesktopTemplateComponent {
1296
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FacetDesktopTemplateComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1297
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: FacetDesktopTemplateComponent, selector: "app-facet-desktop-template", viewQueries: [{ propertyName: "templateOverrideDesktop", first: true, predicate: ["templateOverrideDesktop"], descendants: true }], ngImport: i0, template: `
1298
+ <ng-template
1299
+ #templateOverrideDesktop
1300
+ let-facetsTemplateDataDesktop="facetsTemplateDataDesktop"
1301
+ let-isNotDeactivated="isNotDeactivated"
1302
+ let-context="context"
1303
+ let-toggleFacetGroup="toggleFacetGroup"
1304
+ let-facetValues="facetValues"
1305
+ let-isChecked="isChecked"
1306
+ let-selectFacet="selectFacet"
1307
+ let-showMoreLessDesktop="showMoreLessDesktop"
1308
+ >
1309
+ <div class="searchstax-facets-container-desktop">
1310
+ <div
1311
+ class="searchstax-facet-container"
1312
+ *ngFor="let facet of facetsTemplateDataDesktop?.facets"
1313
+ [class]="{ active: isNotDeactivated(facet.name, context) }"
1314
+ >
1315
+ <div>
1316
+ <div
1317
+ class="searchstax-facet-title-container"
1318
+ (click)="toggleFacetGroup(facet.name, context)"
1319
+ >
1320
+ <div class="searchstax-facet-title">
1321
+ {{ facet.label }}
1322
+ </div>
1323
+ <div class="searchstax-facet-title-arrow active"></div>
1324
+ </div>
1325
+ <div class="searchstax-facet-values-container" aria-live="polite">
1326
+ <div
1327
+ *ngFor="let facetValue of facetValues(facet); index as key"
1328
+ class="searchstax-facet-value-container"
1329
+ [class]="{
1330
+ 'searchstax-facet-value-disabled': facetValue.disabled
1331
+ }"
1332
+ #ref
1333
+ >
1334
+ <div class="searchstax-facet-input">
1335
+ <input
1336
+ type="checkbox"
1337
+ class="searchstax-facet-input-checkbox"
1338
+ [checked]="isChecked(facetValue, context)"
1339
+ [attr.aria-label]="
1340
+ facetValue.value + ' ' + facetValue.count
1341
+ "
1342
+ [disabled]="facetValue.disabled"
1343
+ (click)="
1344
+ selectFacet(ref, $event, facetValue, true, context)
1345
+ "
1346
+ />
1347
+ </div>
1348
+ <div
1349
+ class="searchstax-facet-value-label"
1350
+ (click)="selectFacet(ref, $event, facetValue, false, context)"
1351
+ >
1352
+ {{ facetValue.value }}
1353
+ </div>
1354
+ <div
1355
+ class="searchstax-facet-value-count"
1356
+ (click)="selectFacet(ref, $event, facetValue, false, context)"
1357
+ >
1358
+ ({{ facetValue.count }})
1359
+ </div>
1360
+ </div>
1361
+ <div
1362
+ class="searchstax-facet-show-more-container"
1363
+ *ngIf="facet.hasMoreFacets"
1364
+ >
1365
+ <div
1366
+ class="searchstax-facet-show-more-container"
1367
+ (click)="showMoreLessDesktop($event, facet, context)"
1368
+ (keyup.enter)="showMoreLessDesktop($event, facet, context)"
1369
+ (keyup.space)="showMoreLessDesktop($event, facet, context)"
1370
+ tabindex="0"
1371
+ >
1372
+ <div
1373
+ *ngIf="facet.showingAllFacets"
1374
+ class="searchstax-facet-show-less-button searchstax-facet-show-button"
1375
+ >
1376
+ less
1377
+ </div>
1378
+ <div
1379
+ *ngIf="!facet.showingAllFacets"
1380
+ class="searchstax-facet-show-more-button searchstax-facet-show-button"
1381
+ >
1382
+ more
1383
+ </div>
1384
+ </div>
1385
+ </div>
1386
+ </div>
1387
+ </div>
1388
+ </div>
1389
+ </div>
1390
+ </ng-template>
1391
+ `, isInline: true, dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
1392
+ }
1393
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FacetDesktopTemplateComponent, decorators: [{
1394
+ type: Component,
1395
+ args: [{
1396
+ selector: "app-facet-desktop-template",
1397
+ template: `
1398
+ <ng-template
1399
+ #templateOverrideDesktop
1400
+ let-facetsTemplateDataDesktop="facetsTemplateDataDesktop"
1401
+ let-isNotDeactivated="isNotDeactivated"
1402
+ let-context="context"
1403
+ let-toggleFacetGroup="toggleFacetGroup"
1404
+ let-facetValues="facetValues"
1405
+ let-isChecked="isChecked"
1406
+ let-selectFacet="selectFacet"
1407
+ let-showMoreLessDesktop="showMoreLessDesktop"
1408
+ >
1409
+ <div class="searchstax-facets-container-desktop">
1410
+ <div
1411
+ class="searchstax-facet-container"
1412
+ *ngFor="let facet of facetsTemplateDataDesktop?.facets"
1413
+ [class]="{ active: isNotDeactivated(facet.name, context) }"
1414
+ >
1415
+ <div>
1416
+ <div
1417
+ class="searchstax-facet-title-container"
1418
+ (click)="toggleFacetGroup(facet.name, context)"
1419
+ >
1420
+ <div class="searchstax-facet-title">
1421
+ {{ facet.label }}
1422
+ </div>
1423
+ <div class="searchstax-facet-title-arrow active"></div>
1424
+ </div>
1425
+ <div class="searchstax-facet-values-container" aria-live="polite">
1426
+ <div
1427
+ *ngFor="let facetValue of facetValues(facet); index as key"
1428
+ class="searchstax-facet-value-container"
1429
+ [class]="{
1430
+ 'searchstax-facet-value-disabled': facetValue.disabled
1431
+ }"
1432
+ #ref
1433
+ >
1434
+ <div class="searchstax-facet-input">
1435
+ <input
1436
+ type="checkbox"
1437
+ class="searchstax-facet-input-checkbox"
1438
+ [checked]="isChecked(facetValue, context)"
1439
+ [attr.aria-label]="
1440
+ facetValue.value + ' ' + facetValue.count
1441
+ "
1442
+ [disabled]="facetValue.disabled"
1443
+ (click)="
1444
+ selectFacet(ref, $event, facetValue, true, context)
1445
+ "
1446
+ />
1447
+ </div>
1448
+ <div
1449
+ class="searchstax-facet-value-label"
1450
+ (click)="selectFacet(ref, $event, facetValue, false, context)"
1451
+ >
1452
+ {{ facetValue.value }}
1453
+ </div>
1454
+ <div
1455
+ class="searchstax-facet-value-count"
1456
+ (click)="selectFacet(ref, $event, facetValue, false, context)"
1457
+ >
1458
+ ({{ facetValue.count }})
1459
+ </div>
1460
+ </div>
1461
+ <div
1462
+ class="searchstax-facet-show-more-container"
1463
+ *ngIf="facet.hasMoreFacets"
1464
+ >
1465
+ <div
1466
+ class="searchstax-facet-show-more-container"
1467
+ (click)="showMoreLessDesktop($event, facet, context)"
1468
+ (keyup.enter)="showMoreLessDesktop($event, facet, context)"
1469
+ (keyup.space)="showMoreLessDesktop($event, facet, context)"
1470
+ tabindex="0"
1471
+ >
1472
+ <div
1473
+ *ngIf="facet.showingAllFacets"
1474
+ class="searchstax-facet-show-less-button searchstax-facet-show-button"
1475
+ >
1476
+ less
1477
+ </div>
1478
+ <div
1479
+ *ngIf="!facet.showingAllFacets"
1480
+ class="searchstax-facet-show-more-button searchstax-facet-show-button"
1481
+ >
1482
+ more
1483
+ </div>
1484
+ </div>
1485
+ </div>
1486
+ </div>
1487
+ </div>
1488
+ </div>
1489
+ </div>
1490
+ </ng-template>
1491
+ `,
1492
+ }]
1493
+ }], propDecorators: { templateOverrideDesktop: [{
1494
+ type: ViewChild,
1495
+ args: ["templateOverrideDesktop"]
1496
+ }] } });
1497
+
1498
+ // reusable-template.component.ts
1499
+ class FacetMobileTemplateComponent {
1500
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FacetMobileTemplateComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1501
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: FacetMobileTemplateComponent, selector: "app-facet-mobile-template", viewQueries: [{ propertyName: "templateOverrideMobile", first: true, predicate: ["templateOverrideMobile"], descendants: true }], ngImport: i0, template: `
1502
+ <ng-template
1503
+ #templateOverrideMobile
1504
+ let-isNotDeactivated="isNotDeactivated"
1505
+ let-context="context"
1506
+ let-toggleFacetGroup="toggleFacetGroup"
1507
+ let-facetValues="facetValues"
1508
+ let-isChecked="isChecked"
1509
+ let-selectFacet="selectFacet"
1510
+ let-openOverlay="openOverlay"
1511
+ let-selectedFacetsCheckboxes="selectedFacetsCheckboxes"
1512
+ let-unselectFacet="unselectFacet"
1513
+ let-unselectAll="unselectAll"
1514
+ let-facetMobileData="facetMobileData"
1515
+ let-facetsTemplateDataMobile="facetsTemplateDataMobile"
1516
+ let-closeOverlay="closeOverlay"
1517
+ let-showMoreLessDesktop="showMoreLessDesktop"
1518
+ let-showMoreLessMobile="showMoreLessMobile"
1519
+ >
1520
+ <div class="searchstax-facets-container-mobile">
1521
+ <div class="searchstax-facets-pills-container">
1522
+ <div
1523
+ class="searchstax-facets-pill searchstax-facets-pill-filter-by"
1524
+ (click)="openOverlay(context)"
1525
+ >
1526
+ <div class="searchstax-facets-pill-label">Filter By</div>
1527
+ </div>
1528
+ <div class="searchstax-facets-pills-selected">
1529
+ <div
1530
+ class="searchstax-facets-pill searchstax-facets-pill-facets"
1531
+ *ngFor="let facet of selectedFacetsCheckboxes"
1532
+ (click)="unselectFacet(facet, context)"
1533
+ >
1534
+ <div class="searchstax-facets-pill-label">
1535
+ {{ facet.value }} ({{ facet.count }})
1536
+ </div>
1537
+ <div class="searchstax-facets-pill-icon-close"></div>
1538
+ </div>
1539
+ </div>
1540
+ <div
1541
+ class="searchstax-facets-pill searchstax-clear-filters searchstax-facets-pill-clear-all"
1542
+ *ngIf="selectedFacetsCheckboxes.length"
1543
+ (click)="unselectAll(context)"
1544
+ >
1545
+ <div class="searchstax-facets-pill-label">Clear Filters</div>
1546
+ </div>
1547
+ </div>
1548
+ <div
1549
+ class="searchstax-facets-mobile-overlay"
1550
+ [class]="{
1551
+ 'searchstax-show': facetMobileData(facetsTemplateDataMobile)
1552
+ ?.overlayOpened
1553
+ }"
1554
+ >
1555
+ <div class="searchstax-facets-mobile-overlay-header">
1556
+ <div class="searchstax-facets-mobile-overlay-header-title">
1557
+ Filter By
1558
+ </div>
1559
+ <div
1560
+ class="searchstax-search-close"
1561
+ (click)="closeOverlay(context)"
1562
+ ></div>
1563
+ </div>
1564
+ <div class="searchstax-facets-container-mobile">
1565
+ <div
1566
+ *ngFor="let facet of facetsTemplateDataMobile?.facets"
1567
+ class="searchstax-facet-container"
1568
+ [class]="{
1569
+ active: isNotDeactivated(facet.name, context)
1570
+ }"
1571
+ >
1572
+ <div>
1573
+ <div
1574
+ class="searchstax-facet-title-container"
1575
+ (click)="toggleFacetGroup(facet.name, context)"
1576
+ >
1577
+ <div class="searchstax-facet-title">
1578
+ {{ facet.label }}
1579
+ </div>
1580
+ <div class="searchstax-facet-title-arrow active"></div>
1581
+ </div>
1582
+ <div
1583
+ class="searchstax-facet-values-container"
1584
+ aria-live="polite"
1585
+ >
1586
+ <div
1587
+ *ngFor="let facetValue of facetValues(facet); index as key"
1588
+ class="searchstax-facet-value-container"
1589
+ [class]="{
1590
+ 'searchstax-facet-value-disabled': facetValue.disabled
1591
+ }"
1592
+ #ref
1593
+ >
1594
+ <div class="searchstax-facet-input">
1595
+ <input
1596
+ type="checkbox"
1597
+ class="searchstax-facet-input-checkbox"
1598
+ [checked]="isChecked(facetValue, context)"
1599
+ [attr.aria-label]="
1600
+ facetValue.value + ' ' + facetValue.count
1601
+ "
1602
+ [disabled]="facetValue.disabled"
1603
+ (click)="
1604
+ selectFacet(ref, $event, facetValue, true, context)
1605
+ "
1606
+ />
1607
+ </div>
1608
+ <div
1609
+ class="searchstax-facet-value-label"
1610
+ (click)="
1611
+ selectFacet(ref, $event, facetValue, false, context)
1612
+ "
1613
+ >
1614
+ {{ facetValue.value }}
1615
+ </div>
1616
+ <div
1617
+ class="searchstax-facet-value-count"
1618
+ (click)="
1619
+ selectFacet(ref, $event, facetValue, false, context)
1620
+ "
1621
+ >
1622
+ ({{ facetValue.count }})
1623
+ </div>
1624
+ </div>
1625
+ <div
1626
+ class="searchstax-facet-show-more-container"
1627
+ *ngIf="facet.hasMoreFacets"
1628
+ >
1629
+ <div
1630
+ class="searchstax-facet-show-more-container"
1631
+ (click)="showMoreLessMobile($event, facet, context)"
1632
+ (keyup.enter)="showMoreLessMobile($event, facet, context)"
1633
+ (keyup.space)="showMoreLessMobile($event, facet, context)"
1634
+ tabindex="0"
1635
+ >
1636
+ <div
1637
+ *ngIf="facet.showingAllFacets"
1638
+ class="searchstax-facet-show-less-button searchstax-facet-show-button"
1639
+ >
1640
+ less
1641
+ </div>
1642
+ <div
1643
+ *ngIf="!facet.showingAllFacets"
1644
+ class="searchstax-facet-show-more-button searchstax-facet-show-button"
1645
+ >
1646
+ more
1647
+ </div>
1648
+ </div>
1649
+ </div>
1650
+ </div>
1651
+ </div>
1652
+ </div>
1653
+ </div>
1654
+ <button
1655
+ class="searchstax-facets-mobile-overlay-done"
1656
+ (click)="closeOverlay(context)"
1657
+ >
1658
+ Done
1659
+ </button>
1660
+ </div>
1661
+ </div>
1662
+ </ng-template>
1663
+ `, isInline: true, dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
1664
+ }
1665
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: FacetMobileTemplateComponent, decorators: [{
1666
+ type: Component,
1667
+ args: [{
1668
+ selector: "app-facet-mobile-template",
1669
+ template: `
1670
+ <ng-template
1671
+ #templateOverrideMobile
1672
+ let-isNotDeactivated="isNotDeactivated"
1673
+ let-context="context"
1674
+ let-toggleFacetGroup="toggleFacetGroup"
1675
+ let-facetValues="facetValues"
1676
+ let-isChecked="isChecked"
1677
+ let-selectFacet="selectFacet"
1678
+ let-openOverlay="openOverlay"
1679
+ let-selectedFacetsCheckboxes="selectedFacetsCheckboxes"
1680
+ let-unselectFacet="unselectFacet"
1681
+ let-unselectAll="unselectAll"
1682
+ let-facetMobileData="facetMobileData"
1683
+ let-facetsTemplateDataMobile="facetsTemplateDataMobile"
1684
+ let-closeOverlay="closeOverlay"
1685
+ let-showMoreLessDesktop="showMoreLessDesktop"
1686
+ let-showMoreLessMobile="showMoreLessMobile"
1687
+ >
1688
+ <div class="searchstax-facets-container-mobile">
1689
+ <div class="searchstax-facets-pills-container">
1690
+ <div
1691
+ class="searchstax-facets-pill searchstax-facets-pill-filter-by"
1692
+ (click)="openOverlay(context)"
1693
+ >
1694
+ <div class="searchstax-facets-pill-label">Filter By</div>
1695
+ </div>
1696
+ <div class="searchstax-facets-pills-selected">
1697
+ <div
1698
+ class="searchstax-facets-pill searchstax-facets-pill-facets"
1699
+ *ngFor="let facet of selectedFacetsCheckboxes"
1700
+ (click)="unselectFacet(facet, context)"
1701
+ >
1702
+ <div class="searchstax-facets-pill-label">
1703
+ {{ facet.value }} ({{ facet.count }})
1704
+ </div>
1705
+ <div class="searchstax-facets-pill-icon-close"></div>
1706
+ </div>
1707
+ </div>
1708
+ <div
1709
+ class="searchstax-facets-pill searchstax-clear-filters searchstax-facets-pill-clear-all"
1710
+ *ngIf="selectedFacetsCheckboxes.length"
1711
+ (click)="unselectAll(context)"
1712
+ >
1713
+ <div class="searchstax-facets-pill-label">Clear Filters</div>
1714
+ </div>
1715
+ </div>
1716
+ <div
1717
+ class="searchstax-facets-mobile-overlay"
1718
+ [class]="{
1719
+ 'searchstax-show': facetMobileData(facetsTemplateDataMobile)
1720
+ ?.overlayOpened
1721
+ }"
1722
+ >
1723
+ <div class="searchstax-facets-mobile-overlay-header">
1724
+ <div class="searchstax-facets-mobile-overlay-header-title">
1725
+ Filter By
1726
+ </div>
1727
+ <div
1728
+ class="searchstax-search-close"
1729
+ (click)="closeOverlay(context)"
1730
+ ></div>
1731
+ </div>
1732
+ <div class="searchstax-facets-container-mobile">
1733
+ <div
1734
+ *ngFor="let facet of facetsTemplateDataMobile?.facets"
1735
+ class="searchstax-facet-container"
1736
+ [class]="{
1737
+ active: isNotDeactivated(facet.name, context)
1738
+ }"
1739
+ >
1740
+ <div>
1741
+ <div
1742
+ class="searchstax-facet-title-container"
1743
+ (click)="toggleFacetGroup(facet.name, context)"
1744
+ >
1745
+ <div class="searchstax-facet-title">
1746
+ {{ facet.label }}
1747
+ </div>
1748
+ <div class="searchstax-facet-title-arrow active"></div>
1749
+ </div>
1750
+ <div
1751
+ class="searchstax-facet-values-container"
1752
+ aria-live="polite"
1753
+ >
1754
+ <div
1755
+ *ngFor="let facetValue of facetValues(facet); index as key"
1756
+ class="searchstax-facet-value-container"
1757
+ [class]="{
1758
+ 'searchstax-facet-value-disabled': facetValue.disabled
1759
+ }"
1760
+ #ref
1761
+ >
1762
+ <div class="searchstax-facet-input">
1763
+ <input
1764
+ type="checkbox"
1765
+ class="searchstax-facet-input-checkbox"
1766
+ [checked]="isChecked(facetValue, context)"
1767
+ [attr.aria-label]="
1768
+ facetValue.value + ' ' + facetValue.count
1769
+ "
1770
+ [disabled]="facetValue.disabled"
1771
+ (click)="
1772
+ selectFacet(ref, $event, facetValue, true, context)
1773
+ "
1774
+ />
1775
+ </div>
1776
+ <div
1777
+ class="searchstax-facet-value-label"
1778
+ (click)="
1779
+ selectFacet(ref, $event, facetValue, false, context)
1780
+ "
1781
+ >
1782
+ {{ facetValue.value }}
1783
+ </div>
1784
+ <div
1785
+ class="searchstax-facet-value-count"
1786
+ (click)="
1787
+ selectFacet(ref, $event, facetValue, false, context)
1788
+ "
1789
+ >
1790
+ ({{ facetValue.count }})
1791
+ </div>
1792
+ </div>
1793
+ <div
1794
+ class="searchstax-facet-show-more-container"
1795
+ *ngIf="facet.hasMoreFacets"
1796
+ >
1797
+ <div
1798
+ class="searchstax-facet-show-more-container"
1799
+ (click)="showMoreLessMobile($event, facet, context)"
1800
+ (keyup.enter)="showMoreLessMobile($event, facet, context)"
1801
+ (keyup.space)="showMoreLessMobile($event, facet, context)"
1802
+ tabindex="0"
1803
+ >
1804
+ <div
1805
+ *ngIf="facet.showingAllFacets"
1806
+ class="searchstax-facet-show-less-button searchstax-facet-show-button"
1807
+ >
1808
+ less
1809
+ </div>
1810
+ <div
1811
+ *ngIf="!facet.showingAllFacets"
1812
+ class="searchstax-facet-show-more-button searchstax-facet-show-button"
1813
+ >
1814
+ more
1815
+ </div>
1816
+ </div>
1817
+ </div>
1818
+ </div>
1819
+ </div>
1820
+ </div>
1821
+ </div>
1822
+ <button
1823
+ class="searchstax-facets-mobile-overlay-done"
1824
+ (click)="closeOverlay(context)"
1825
+ >
1826
+ Done
1827
+ </button>
1828
+ </div>
1829
+ </div>
1830
+ </ng-template>
1831
+ `,
1832
+ }]
1833
+ }], propDecorators: { templateOverrideMobile: [{
1834
+ type: ViewChild,
1835
+ args: ["templateOverrideMobile"]
1836
+ }] } });
1837
+
484
1838
  class SearchstaxSearchFacetsWidget {
485
1839
  // @ViewChildren("facetContainers") facetContainers: QueryList<ElementRef>;
486
1840
  constructor(storeServiceService) {
@@ -570,11 +1924,11 @@ class SearchstaxSearchFacetsWidget {
570
1924
  return facet;
571
1925
  }
572
1926
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SearchstaxSearchFacetsWidget, deps: [{ token: StoreServiceService }], target: i0.ɵɵFactoryTarget.Component }); }
573
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: SearchstaxSearchFacetsWidget, selector: "app-searchstax-search-facets", inputs: { templateOverrideMobile: "templateOverrideMobile", templateOverrideDesktop: "templateOverrideDesktop", facetingType: "facetingType", itemsPerPageDesktop: "itemsPerPageDesktop", itemsPerPageMobile: "itemsPerPageMobile", specificFacets: "specificFacets" }, ngImport: i0, template: "<div [id]=\"'searchstax-facets-container' + rand\">\n <div\n *ngIf=\"facetsTemplateDataDesktop?.hasResultsOrExternalPromotions && !templateOverrideDesktop\"\n class=\"searchstax-facets-container-desktop\"\n >\n <div\n class=\"searchstax-facet-container\"\n *ngFor=\"let facet of facetsTemplateDataDesktop?.facets\"\n [class]=\"{ active: isNotDeactivated(facet.name, context) }\"\n >\n <div>\n <div class=\"searchstax-facet-title-container\" (click)=\"toggleFacetGroup(facet.name, context)\">\n <div class=\"searchstax-facet-title\">{{ facet.label }}</div>\n <div class=\"searchstax-facet-title-arrow active\"></div>\n </div>\n <div class=\"searchstax-facet-values-container\">\n <div\n *ngFor=\"let facetValue of facetValues(facet); index as key\"\n class=\"searchstax-facet-value-container\"\n [class]=\"{ 'searchstax-facet-value-disabled': facetValue.disabled }\"\n #ref\n >\n <div class=\"searchstax-facet-input\">\n <input\n type=\"checkbox\"\n class=\"searchstax-facet-input-checkbox\"\n [attr.aria-label]=\"facetValue.value + ' ' + facetValue.count\"\n [checked]=\"isChecked(facetValue, context)\"\n [disabled]=\"facetValue.disabled\"\n (click)=\"selectFacet(ref, $event, facetValue, true, context)\"\n />\n </div>\n <div class=\"searchstax-facet-value-label\" (click)=\"selectFacet(ref, $event, facetValue, false, context)\">\n {{ facetValue.value }}\n </div>\n <div class=\"searchstax-facet-value-count\" (click)=\"selectFacet(ref, $event, facetValue, false, context)\">\n ({{ facetValue.count }})\n </div>\n </div>\n <div class=\"searchstax-facet-show-more-container\" *ngIf=\"facet.hasMoreFacets\">\n <div class=\"searchstax-facet-show-more-container\" (click)=\"showMoreLessDesktop($event, facet, context)\" (keyup.enter)=\"showMoreLessDesktop($event, facet, context)\" (keyup.space)=\"showMoreLessDesktop($event, facet, context)\" tabindex=\"0\">\n <div\n *ngIf=\"facet.showingAllFacets\"\n class=\"searchstax-facet-show-less-button searchstax-facet-show-button\"\n >\n less\n </div>\n <div\n *ngIf=\"!facet.showingAllFacets\"\n class=\"searchstax-facet-show-more-button searchstax-facet-show-button\"\n >\n more\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div *ngIf=\"facetsTemplateDataDesktop?.hasResultsOrExternalPromotions && templateOverrideDesktop\">\n <ng-container *ngTemplateOutlet=\"templateOverrideDesktop; context: context\"></ng-container>\n </div>\n\n <div\n class=\"searchstax-facets-container-mobile\"\n *ngIf=\"facetsTemplateDataMobile?.hasResultsOrExternalPromotions && !templateOverrideMobile\"\n >\n <div class=\"searchstax-facets-pills-container\">\n <div class=\"searchstax-facets-pill searchstax-facets-pill-filter-by\" (click)=\"openOverlay(context)\">\n <div class=\"searchstax-facets-pill-label\">Filter By</div>\n </div>\n <div class=\"searchstax-facets-pills-selected\">\n <div\n class=\"searchstax-facets-pill searchstax-facets-pill-facets\"\n *ngFor=\"let facet of selectedFacetsCheckboxes\"\n (click)=\"unselectFacet(facet, context)\"\n >\n <div class=\"searchstax-facets-pill-label\">{{ facet.value }} ({{ facet.count }})</div>\n <div class=\"searchstax-facets-pill-icon-close\"></div>\n </div>\n </div>\n <div\n class=\"searchstax-facets-pill searchstax-clear-filters searchstax-facets-pill-clear-all\"\n *ngIf=\"selectedFacetsCheckboxes.length\"\n (click)=\"unselectAll(context)\"\n >\n <div class=\"searchstax-facets-pill-label\">Clear Filters</div>\n </div>\n </div>\n <div\n class=\"searchstax-facets-mobile-overlay\"\n [class]=\"{ 'searchstax-show': facetMobileData(facetsTemplateDataMobile)?.overlayOpened }\"\n >\n <div class=\"searchstax-facets-mobile-overlay-header\">\n <div class=\"searchstax-facets-mobile-overlay-header-title\">Filter By</div>\n <div class=\"searchstax-search-close\" (click)=\"closeOverlay(context)\"></div>\n </div>\n <div class=\"searchstax-facets-container-mobile\">\n <div\n *ngFor=\"let facet of facetsTemplateDataMobile?.facets\"\n class=\"searchstax-facet-container\"\n [class]=\"{ active: isNotDeactivated(facet.name, context) }\"\n >\n <div>\n <div class=\"searchstax-facet-title-container\" (click)=\"toggleFacetGroup(facet.name, context)\">\n <div class=\"searchstax-facet-title\">{{ facet.label }}</div>\n <div class=\"searchstax-facet-title-arrow active\"></div>\n </div>\n <div class=\"searchstax-facet-values-container\">\n <div\n *ngFor=\"let facetValue of facetValues(facet); index as key\"\n class=\"searchstax-facet-value-container\"\n [class]=\"{ 'searchstax-facet-value-disabled': facetValue.disabled }\"\n #ref\n >\n <div class=\"searchstax-facet-input\">\n <input\n type=\"checkbox\"\n class=\"searchstax-facet-input-checkbox\"\n [attr.aria-label]=\"facetValue.value + ' ' + facetValue.count\"\n [checked]=\"isChecked(facetValue, context)\"\n [disabled]=\"facetValue.disabled\"\n (click)=\"selectFacet(ref, $event, facetValue, true, context)\"\n />\n </div>\n <div\n class=\"searchstax-facet-value-label\"\n (click)=\"selectFacet(ref, $event, facetValue, false, context)\"\n >\n {{ facetValue.value }}\n </div>\n <div\n class=\"searchstax-facet-value-count\"\n (click)=\"selectFacet(ref, $event, facetValue, false, context)\"\n >\n ({{ facetValue.count }})\n </div>\n </div>\n <div class=\"searchstax-facet-show-more-container\" *ngIf=\"facet.hasMoreFacets\">\n <div class=\"searchstax-facet-show-more-container\" (click)=\"showMoreLessMobile($event, facet, context)\" (keyup.enter)=\"showMoreLessMobile($event, facet, context)\" (keyup.space)=\"showMoreLessMobile($event, facet, context)\" tabindex=\"0\">\n <div\n *ngIf=\"facet.showingAllFacets\"\n class=\"searchstax-facet-show-less-button searchstax-facet-show-button\"\n >\n less\n </div>\n <div\n *ngIf=\"!facet.showingAllFacets\"\n class=\"searchstax-facet-show-more-button searchstax-facet-show-button\"\n >\n more\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <button class=\"searchstax-facets-mobile-overlay-done\" (click)=\"closeOverlay(context)\">Done</button>\n </div>\n </div>\n <div *ngIf=\"facetsTemplateDataMobile?.hasResultsOrExternalPromotions && templateOverrideMobile\">\n <ng-container *ngTemplateOutlet=\"templateOverrideMobile; context: context\"></ng-container>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] }); }
1927
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: SearchstaxSearchFacetsWidget, selector: "app-searchstax-search-facets", inputs: { templateOverrideMobile: "templateOverrideMobile", templateOverrideDesktop: "templateOverrideDesktop", facetingType: "facetingType", itemsPerPageDesktop: "itemsPerPageDesktop", itemsPerPageMobile: "itemsPerPageMobile", specificFacets: "specificFacets" }, ngImport: i0, template: "<div [id]=\"'searchstax-facets-container' + rand\">\n <ng-container\n *ngIf=\"\n facetsTemplateDataDesktop?.hasResultsOrExternalPromotions &&\n !templateOverrideDesktop\n \"\n >\n <app-facet-desktop-template #ref></app-facet-desktop-template>\n <ng-template\n *ngTemplateOutlet=\"ref.templateOverrideDesktop; context: context\"\n ></ng-template>\n </ng-container>\n\n <div\n *ngIf=\"\n facetsTemplateDataDesktop?.hasResultsOrExternalPromotions &&\n templateOverrideDesktop\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"templateOverrideDesktop; context: context\"\n ></ng-container>\n </div>\n\n <ng-container\n *ngIf=\"\n facetsTemplateDataMobile?.hasResultsOrExternalPromotions &&\n !templateOverrideMobile\n \"\n >\n <app-facet-mobile-template #ref></app-facet-mobile-template>\n <ng-template\n *ngTemplateOutlet=\"ref.templateOverrideMobile; context: context\"\n ></ng-template>\n </ng-container>\n\n <div\n *ngIf=\"\n facetsTemplateDataMobile?.hasResultsOrExternalPromotions &&\n templateOverrideMobile\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"templateOverrideMobile; context: context\"\n ></ng-container>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: FacetDesktopTemplateComponent, selector: "app-facet-desktop-template" }, { kind: "component", type: FacetMobileTemplateComponent, selector: "app-facet-mobile-template" }] }); }
574
1928
  }
575
1929
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SearchstaxSearchFacetsWidget, decorators: [{
576
1930
  type: Component,
577
- args: [{ selector: "app-searchstax-search-facets", template: "<div [id]=\"'searchstax-facets-container' + rand\">\n <div\n *ngIf=\"facetsTemplateDataDesktop?.hasResultsOrExternalPromotions && !templateOverrideDesktop\"\n class=\"searchstax-facets-container-desktop\"\n >\n <div\n class=\"searchstax-facet-container\"\n *ngFor=\"let facet of facetsTemplateDataDesktop?.facets\"\n [class]=\"{ active: isNotDeactivated(facet.name, context) }\"\n >\n <div>\n <div class=\"searchstax-facet-title-container\" (click)=\"toggleFacetGroup(facet.name, context)\">\n <div class=\"searchstax-facet-title\">{{ facet.label }}</div>\n <div class=\"searchstax-facet-title-arrow active\"></div>\n </div>\n <div class=\"searchstax-facet-values-container\">\n <div\n *ngFor=\"let facetValue of facetValues(facet); index as key\"\n class=\"searchstax-facet-value-container\"\n [class]=\"{ 'searchstax-facet-value-disabled': facetValue.disabled }\"\n #ref\n >\n <div class=\"searchstax-facet-input\">\n <input\n type=\"checkbox\"\n class=\"searchstax-facet-input-checkbox\"\n [attr.aria-label]=\"facetValue.value + ' ' + facetValue.count\"\n [checked]=\"isChecked(facetValue, context)\"\n [disabled]=\"facetValue.disabled\"\n (click)=\"selectFacet(ref, $event, facetValue, true, context)\"\n />\n </div>\n <div class=\"searchstax-facet-value-label\" (click)=\"selectFacet(ref, $event, facetValue, false, context)\">\n {{ facetValue.value }}\n </div>\n <div class=\"searchstax-facet-value-count\" (click)=\"selectFacet(ref, $event, facetValue, false, context)\">\n ({{ facetValue.count }})\n </div>\n </div>\n <div class=\"searchstax-facet-show-more-container\" *ngIf=\"facet.hasMoreFacets\">\n <div class=\"searchstax-facet-show-more-container\" (click)=\"showMoreLessDesktop($event, facet, context)\" (keyup.enter)=\"showMoreLessDesktop($event, facet, context)\" (keyup.space)=\"showMoreLessDesktop($event, facet, context)\" tabindex=\"0\">\n <div\n *ngIf=\"facet.showingAllFacets\"\n class=\"searchstax-facet-show-less-button searchstax-facet-show-button\"\n >\n less\n </div>\n <div\n *ngIf=\"!facet.showingAllFacets\"\n class=\"searchstax-facet-show-more-button searchstax-facet-show-button\"\n >\n more\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <div *ngIf=\"facetsTemplateDataDesktop?.hasResultsOrExternalPromotions && templateOverrideDesktop\">\n <ng-container *ngTemplateOutlet=\"templateOverrideDesktop; context: context\"></ng-container>\n </div>\n\n <div\n class=\"searchstax-facets-container-mobile\"\n *ngIf=\"facetsTemplateDataMobile?.hasResultsOrExternalPromotions && !templateOverrideMobile\"\n >\n <div class=\"searchstax-facets-pills-container\">\n <div class=\"searchstax-facets-pill searchstax-facets-pill-filter-by\" (click)=\"openOverlay(context)\">\n <div class=\"searchstax-facets-pill-label\">Filter By</div>\n </div>\n <div class=\"searchstax-facets-pills-selected\">\n <div\n class=\"searchstax-facets-pill searchstax-facets-pill-facets\"\n *ngFor=\"let facet of selectedFacetsCheckboxes\"\n (click)=\"unselectFacet(facet, context)\"\n >\n <div class=\"searchstax-facets-pill-label\">{{ facet.value }} ({{ facet.count }})</div>\n <div class=\"searchstax-facets-pill-icon-close\"></div>\n </div>\n </div>\n <div\n class=\"searchstax-facets-pill searchstax-clear-filters searchstax-facets-pill-clear-all\"\n *ngIf=\"selectedFacetsCheckboxes.length\"\n (click)=\"unselectAll(context)\"\n >\n <div class=\"searchstax-facets-pill-label\">Clear Filters</div>\n </div>\n </div>\n <div\n class=\"searchstax-facets-mobile-overlay\"\n [class]=\"{ 'searchstax-show': facetMobileData(facetsTemplateDataMobile)?.overlayOpened }\"\n >\n <div class=\"searchstax-facets-mobile-overlay-header\">\n <div class=\"searchstax-facets-mobile-overlay-header-title\">Filter By</div>\n <div class=\"searchstax-search-close\" (click)=\"closeOverlay(context)\"></div>\n </div>\n <div class=\"searchstax-facets-container-mobile\">\n <div\n *ngFor=\"let facet of facetsTemplateDataMobile?.facets\"\n class=\"searchstax-facet-container\"\n [class]=\"{ active: isNotDeactivated(facet.name, context) }\"\n >\n <div>\n <div class=\"searchstax-facet-title-container\" (click)=\"toggleFacetGroup(facet.name, context)\">\n <div class=\"searchstax-facet-title\">{{ facet.label }}</div>\n <div class=\"searchstax-facet-title-arrow active\"></div>\n </div>\n <div class=\"searchstax-facet-values-container\">\n <div\n *ngFor=\"let facetValue of facetValues(facet); index as key\"\n class=\"searchstax-facet-value-container\"\n [class]=\"{ 'searchstax-facet-value-disabled': facetValue.disabled }\"\n #ref\n >\n <div class=\"searchstax-facet-input\">\n <input\n type=\"checkbox\"\n class=\"searchstax-facet-input-checkbox\"\n [attr.aria-label]=\"facetValue.value + ' ' + facetValue.count\"\n [checked]=\"isChecked(facetValue, context)\"\n [disabled]=\"facetValue.disabled\"\n (click)=\"selectFacet(ref, $event, facetValue, true, context)\"\n />\n </div>\n <div\n class=\"searchstax-facet-value-label\"\n (click)=\"selectFacet(ref, $event, facetValue, false, context)\"\n >\n {{ facetValue.value }}\n </div>\n <div\n class=\"searchstax-facet-value-count\"\n (click)=\"selectFacet(ref, $event, facetValue, false, context)\"\n >\n ({{ facetValue.count }})\n </div>\n </div>\n <div class=\"searchstax-facet-show-more-container\" *ngIf=\"facet.hasMoreFacets\">\n <div class=\"searchstax-facet-show-more-container\" (click)=\"showMoreLessMobile($event, facet, context)\" (keyup.enter)=\"showMoreLessMobile($event, facet, context)\" (keyup.space)=\"showMoreLessMobile($event, facet, context)\" tabindex=\"0\">\n <div\n *ngIf=\"facet.showingAllFacets\"\n class=\"searchstax-facet-show-less-button searchstax-facet-show-button\"\n >\n less\n </div>\n <div\n *ngIf=\"!facet.showingAllFacets\"\n class=\"searchstax-facet-show-more-button searchstax-facet-show-button\"\n >\n more\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n </div>\n <button class=\"searchstax-facets-mobile-overlay-done\" (click)=\"closeOverlay(context)\">Done</button>\n </div>\n </div>\n <div *ngIf=\"facetsTemplateDataMobile?.hasResultsOrExternalPromotions && templateOverrideMobile\">\n <ng-container *ngTemplateOutlet=\"templateOverrideMobile; context: context\"></ng-container>\n </div>\n</div>\n" }]
1931
+ args: [{ selector: "app-searchstax-search-facets", template: "<div [id]=\"'searchstax-facets-container' + rand\">\n <ng-container\n *ngIf=\"\n facetsTemplateDataDesktop?.hasResultsOrExternalPromotions &&\n !templateOverrideDesktop\n \"\n >\n <app-facet-desktop-template #ref></app-facet-desktop-template>\n <ng-template\n *ngTemplateOutlet=\"ref.templateOverrideDesktop; context: context\"\n ></ng-template>\n </ng-container>\n\n <div\n *ngIf=\"\n facetsTemplateDataDesktop?.hasResultsOrExternalPromotions &&\n templateOverrideDesktop\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"templateOverrideDesktop; context: context\"\n ></ng-container>\n </div>\n\n <ng-container\n *ngIf=\"\n facetsTemplateDataMobile?.hasResultsOrExternalPromotions &&\n !templateOverrideMobile\n \"\n >\n <app-facet-mobile-template #ref></app-facet-mobile-template>\n <ng-template\n *ngTemplateOutlet=\"ref.templateOverrideMobile; context: context\"\n ></ng-template>\n </ng-container>\n\n <div\n *ngIf=\"\n facetsTemplateDataMobile?.hasResultsOrExternalPromotions &&\n templateOverrideMobile\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"templateOverrideMobile; context: context\"\n ></ng-container>\n </div>\n</div>\n" }]
578
1932
  }], ctorParameters: () => [{ type: StoreServiceService }], propDecorators: { templateOverrideMobile: [{
579
1933
  type: Input
580
1934
  }], templateOverrideDesktop: [{
@@ -589,6 +1943,78 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
589
1943
  type: Input
590
1944
  }] } });
591
1945
 
1946
+ // reusable-template.component.ts
1947
+ class SortingTemplateComponent {
1948
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SortingTemplateComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
1949
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: SortingTemplateComponent, selector: "app-sorting-template", viewQueries: [{ propertyName: "sortingTemplate", first: true, predicate: ["sortingTemplateOverride"], descendants: true }], ngImport: i0, template: `
1950
+ <ng-template
1951
+ #sortingTemplateOverride
1952
+ let-selectedSorting="selectedSorting"
1953
+ let-orderChange="orderChange"
1954
+ let-context="context"
1955
+ >
1956
+ <div class="searchstax-sorting-container">
1957
+ <label
1958
+ class="searchstax-sorting-label"
1959
+ for="searchstax-search-order-select"
1960
+ >Sort By</label
1961
+ >
1962
+ <select
1963
+ id="searchstax-search-order-select"
1964
+ class="searchstax-search-order-select"
1965
+ [(ngModel)]="context.selectedSorting"
1966
+ (change)="orderChange($event, context)"
1967
+ >
1968
+ <option
1969
+ *ngFor="let sortOption of context.sortingData.sortOptions"
1970
+ [value]="sortOption.key"
1971
+ >
1972
+ {{ sortOption.value }}
1973
+ </option>
1974
+ </select>
1975
+ </div>
1976
+ </ng-template>
1977
+ `, isInline: true, dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i2.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] }); }
1978
+ }
1979
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SortingTemplateComponent, decorators: [{
1980
+ type: Component,
1981
+ args: [{
1982
+ selector: "app-sorting-template",
1983
+ template: `
1984
+ <ng-template
1985
+ #sortingTemplateOverride
1986
+ let-selectedSorting="selectedSorting"
1987
+ let-orderChange="orderChange"
1988
+ let-context="context"
1989
+ >
1990
+ <div class="searchstax-sorting-container">
1991
+ <label
1992
+ class="searchstax-sorting-label"
1993
+ for="searchstax-search-order-select"
1994
+ >Sort By</label
1995
+ >
1996
+ <select
1997
+ id="searchstax-search-order-select"
1998
+ class="searchstax-search-order-select"
1999
+ [(ngModel)]="context.selectedSorting"
2000
+ (change)="orderChange($event, context)"
2001
+ >
2002
+ <option
2003
+ *ngFor="let sortOption of context.sortingData.sortOptions"
2004
+ [value]="sortOption.key"
2005
+ >
2006
+ {{ sortOption.value }}
2007
+ </option>
2008
+ </select>
2009
+ </div>
2010
+ </ng-template>
2011
+ `,
2012
+ }]
2013
+ }], propDecorators: { sortingTemplate: [{
2014
+ type: ViewChild,
2015
+ args: ["sortingTemplateOverride"]
2016
+ }] } });
2017
+
592
2018
  class SearchstaxSearchSortingWidget {
593
2019
  constructor(storeServiceService) {
594
2020
  this.storeServiceService = storeServiceService;
@@ -621,15 +2047,131 @@ class SearchstaxSearchSortingWidget {
621
2047
  });
622
2048
  }
623
2049
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SearchstaxSearchSortingWidget, deps: [{ token: StoreServiceService }], target: i0.ɵɵFactoryTarget.Component }); }
624
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: SearchstaxSearchSortingWidget, selector: "app-searchstax-search-sorting", inputs: { templateOverride: "templateOverride" }, ngImport: i0, template: "<div class=\"search-feedback-container\" [id]=\"'search-sorting-container' + rand\">\n <div\n class=\"searchstax-sorting-container\"\n *ngIf=\"sortingData && sortingData?.searchExecuted && sortingData?.hasResultsOrExternalPromotions && !templateOverride\"\n >\n <label class=\"searchstax-sorting-label\" for=\"searchstax-search-order-select\">Sort By</label>\n <select\n id=\"searchstax-search-order-select\"\n class=\"searchstax-search-order-select\"\n [(ngModel)]=\"selectedSorting\"\n (change)=\"orderChange($event, context)\"\n >\n <option *ngFor=\"let sortOption of sortingData.sortOptions\" [value]=\"sortOption.key\">{{sortOption.value}}</option>\n </select>\n </div>\n\n <div\n *ngIf=\"\n sortingData && sortingData?.searchExecuted && sortingData?.hasResultsOrExternalPromotions && templateOverride\n \"\n >\n <ng-container *ngTemplateOutlet=\"templateOverride; context: context\"></ng-container>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i3.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i3.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }] }); }
2050
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: SearchstaxSearchSortingWidget, selector: "app-searchstax-search-sorting", inputs: { templateOverride: "templateOverride" }, ngImport: i0, template: "<div class=\"search-feedback-container\" [id]=\"'search-sorting-container' + rand\">\n <ng-container\n *ngIf=\"\n sortingData &&\n sortingData?.searchExecuted &&\n sortingData?.hasResultsOrExternalPromotions &&\n !templateOverride\n \"\n >\n <app-sorting-template #ref></app-sorting-template>\n <ng-template\n *ngTemplateOutlet=\"ref.sortingTemplate; context: context\"\n ></ng-template>\n </ng-container>\n\n <div\n *ngIf=\"\n sortingData &&\n sortingData?.searchExecuted &&\n sortingData?.hasResultsOrExternalPromotions &&\n templateOverride\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"templateOverride; context: context\"\n ></ng-container>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: SortingTemplateComponent, selector: "app-sorting-template" }] }); }
625
2051
  }
626
2052
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SearchstaxSearchSortingWidget, decorators: [{
627
2053
  type: Component,
628
- args: [{ selector: "app-searchstax-search-sorting", template: "<div class=\"search-feedback-container\" [id]=\"'search-sorting-container' + rand\">\n <div\n class=\"searchstax-sorting-container\"\n *ngIf=\"sortingData && sortingData?.searchExecuted && sortingData?.hasResultsOrExternalPromotions && !templateOverride\"\n >\n <label class=\"searchstax-sorting-label\" for=\"searchstax-search-order-select\">Sort By</label>\n <select\n id=\"searchstax-search-order-select\"\n class=\"searchstax-search-order-select\"\n [(ngModel)]=\"selectedSorting\"\n (change)=\"orderChange($event, context)\"\n >\n <option *ngFor=\"let sortOption of sortingData.sortOptions\" [value]=\"sortOption.key\">{{sortOption.value}}</option>\n </select>\n </div>\n\n <div\n *ngIf=\"\n sortingData && sortingData?.searchExecuted && sortingData?.hasResultsOrExternalPromotions && templateOverride\n \"\n >\n <ng-container *ngTemplateOutlet=\"templateOverride; context: context\"></ng-container>\n </div>\n</div>\n" }]
2054
+ args: [{ selector: "app-searchstax-search-sorting", template: "<div class=\"search-feedback-container\" [id]=\"'search-sorting-container' + rand\">\n <ng-container\n *ngIf=\"\n sortingData &&\n sortingData?.searchExecuted &&\n sortingData?.hasResultsOrExternalPromotions &&\n !templateOverride\n \"\n >\n <app-sorting-template #ref></app-sorting-template>\n <ng-template\n *ngTemplateOutlet=\"ref.sortingTemplate; context: context\"\n ></ng-template>\n </ng-container>\n\n <div\n *ngIf=\"\n sortingData &&\n sortingData?.searchExecuted &&\n sortingData?.hasResultsOrExternalPromotions &&\n templateOverride\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"templateOverride; context: context\"\n ></ng-container>\n </div>\n</div>\n" }]
629
2055
  }], ctorParameters: () => [{ type: StoreServiceService }], propDecorators: { templateOverride: [{
630
2056
  type: Input
631
2057
  }] } });
632
2058
 
2059
+ // reusable-template.component.ts
2060
+ class AnswerTemplateComponent {
2061
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AnswerTemplateComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2062
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: AnswerTemplateComponent, selector: "app-answer-template", viewQueries: [{ propertyName: "answerTemplate", first: true, predicate: ["answerTemplate"], descendants: true }], ngImport: i0, template: `
2063
+ <ng-template
2064
+ #answerTemplate
2065
+ let-answerData="answerData"
2066
+ let-showMore="showMore"
2067
+ let-context="context"
2068
+ >
2069
+ <div class="searchstax-answer-wrap">
2070
+ <div class="searchstax-answer-icon"></div>
2071
+ <div>
2072
+ <div
2073
+ [class]="{
2074
+ 'searchstax-answer-container': true,
2075
+ 'searchstax-answer-show-more': answerData.showMoreButtonVisible
2076
+ }"
2077
+ >
2078
+ <div class="searchstax-answer-title">Smart Answers</div>
2079
+ <div
2080
+ class="searchstax-answer-error"
2081
+ *ngIf="answerData.shouldShowAnswerError"
2082
+ [innerHTML]="answerData.answerErrorMessage"
2083
+ ></div>
2084
+ <div
2085
+ class="searchstax-answer-description"
2086
+ [innerHTML]="answerData.fullAnswerFormatted"
2087
+ ></div>
2088
+ <div
2089
+ *ngIf="answerData.answerLoading"
2090
+ class="searchstax-answer-loading"
2091
+ ></div>
2092
+ </div>
2093
+ <div
2094
+ *ngIf="answerData.showMoreButtonVisible"
2095
+ class="searchstax-answer-load-more-button-container"
2096
+ >
2097
+ <button
2098
+ class="searchstax-answer-load-more-button"
2099
+ (click)="showMore($event, context)"
2100
+ >
2101
+ Read More
2102
+ </button>
2103
+ </div>
2104
+ </div>
2105
+ <div class="searchstax-answer-footer">
2106
+ <div id="feedbackWidgetContainer"></div>
2107
+ <div class="searchstax-lightweight-widget-separator-inline"></div>
2108
+ <p class="searchstax-disclaimer">Generative AI is Experimental</p>
2109
+ </div>
2110
+ </div>
2111
+ </ng-template>
2112
+ `, isInline: true, dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
2113
+ }
2114
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: AnswerTemplateComponent, decorators: [{
2115
+ type: Component,
2116
+ args: [{
2117
+ selector: "app-answer-template",
2118
+ template: `
2119
+ <ng-template
2120
+ #answerTemplate
2121
+ let-answerData="answerData"
2122
+ let-showMore="showMore"
2123
+ let-context="context"
2124
+ >
2125
+ <div class="searchstax-answer-wrap">
2126
+ <div class="searchstax-answer-icon"></div>
2127
+ <div>
2128
+ <div
2129
+ [class]="{
2130
+ 'searchstax-answer-container': true,
2131
+ 'searchstax-answer-show-more': answerData.showMoreButtonVisible
2132
+ }"
2133
+ >
2134
+ <div class="searchstax-answer-title">Smart Answers</div>
2135
+ <div
2136
+ class="searchstax-answer-error"
2137
+ *ngIf="answerData.shouldShowAnswerError"
2138
+ [innerHTML]="answerData.answerErrorMessage"
2139
+ ></div>
2140
+ <div
2141
+ class="searchstax-answer-description"
2142
+ [innerHTML]="answerData.fullAnswerFormatted"
2143
+ ></div>
2144
+ <div
2145
+ *ngIf="answerData.answerLoading"
2146
+ class="searchstax-answer-loading"
2147
+ ></div>
2148
+ </div>
2149
+ <div
2150
+ *ngIf="answerData.showMoreButtonVisible"
2151
+ class="searchstax-answer-load-more-button-container"
2152
+ >
2153
+ <button
2154
+ class="searchstax-answer-load-more-button"
2155
+ (click)="showMore($event, context)"
2156
+ >
2157
+ Read More
2158
+ </button>
2159
+ </div>
2160
+ </div>
2161
+ <div class="searchstax-answer-footer">
2162
+ <div id="feedbackWidgetContainer"></div>
2163
+ <div class="searchstax-lightweight-widget-separator-inline"></div>
2164
+ <p class="searchstax-disclaimer">Generative AI is Experimental</p>
2165
+ </div>
2166
+ </div>
2167
+ </ng-template>
2168
+ `,
2169
+ }]
2170
+ }], propDecorators: { answerTemplate: [{
2171
+ type: ViewChild,
2172
+ args: ["answerTemplate"]
2173
+ }] } });
2174
+
633
2175
  class SearchstaxSearchAnswerWidget {
634
2176
  constructor(storeServiceService) {
635
2177
  this.storeServiceService = storeServiceService;
@@ -659,11 +2201,11 @@ class SearchstaxSearchAnswerWidget {
659
2201
  });
660
2202
  }
661
2203
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SearchstaxSearchAnswerWidget, deps: [{ token: StoreServiceService }], target: i0.ɵɵFactoryTarget.Component }); }
662
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: SearchstaxSearchAnswerWidget, selector: "app-searchstax-answer", inputs: { templateOverride: "templateOverride", feedbackwidget: "feedbackwidget", showShowMoreAfterWordCount: "showShowMoreAfterWordCount" }, ngImport: i0, template: "<div [id]=\"'searchstax-answer-container' + rand\">\n <div\n *ngIf=\"\n answerData &&\n answerData?.searchExecuted &&\n answerData.shouldShowAnswer &&\n !templateOverride\n \"\n >\n <div class=\"searchstax-answer-wrap\">\n <div class=\"searchstax-answer-icon\"></div>\n <div>\n <div\n [class]=\"\n 'searchstax-answer-container' + answerData.showMoreButtonVisible\n ? 'searchstax-answer-show-more'\n : ''\n \"\n >\n <div class=\"searchstax-answer-title\">Answer</div>\n <div class=\"searchstax-answer-error\" *ngIf=\"answerData.shouldShowAnswerError\" [innerHTML]=\"answerData.answerErrorMessage\"></div>\n <div\n class=\"searchstax-answer-description\"\n [innerHTML]=\"answerData.fullAnswerFormatted\"\n ></div>\n <div\n *ngIf=\"answerData.answerLoading\"\n class=\"searchstax-answer-loading\"\n ></div>\n </div>\n <div\n *ngIf=\"answerData.showMoreButtonVisible\"\n class=\"searchstax-answer-load-more-button-container\"\n >\n <button\n class=\"searchstax-answer-load-more-button\"\n (click)=\"showMore($event, context)\"\n >\n Show More...\n </button>\n </div>\n </div>\n <div class=\"searchstax-answer-footer\">\n <div id=\"feedbackWidgetContainer\"></div>\n <div class=\"searchstax-lightweight-widget-separator-inline\"></div>\n <p class=\"searchstax-disclaimer\">Generative AI is Experimental</p>\n </div>\n </div>\n </div>\n <div\n *ngIf=\"\n answerData &&\n answerData?.searchExecuted &&\n answerData.shouldShowAnswer &&\n templateOverride\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"templateOverride; context: context\"\n ></ng-container>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] }); }
2204
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: SearchstaxSearchAnswerWidget, selector: "app-searchstax-answer", inputs: { templateOverride: "templateOverride", feedbackwidget: "feedbackwidget", showShowMoreAfterWordCount: "showShowMoreAfterWordCount" }, ngImport: i0, template: "<div [id]=\"'searchstax-answer-container' + rand\">\n <div\n *ngIf=\"\n answerData &&\n answerData?.searchExecuted &&\n answerData.shouldShowAnswer &&\n !templateOverride\n \"\n >\n <app-answer-template #ref></app-answer-template>\n <ng-template\n [ngTemplateOutlet]=\"ref.answerTemplate\"\n [ngTemplateOutletContext]=\"context\"\n ></ng-template>\n </div>\n <div\n *ngIf=\"\n answerData &&\n answerData?.searchExecuted &&\n answerData.shouldShowAnswer &&\n templateOverride\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"templateOverride; context: context\"\n ></ng-container>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: AnswerTemplateComponent, selector: "app-answer-template" }] }); }
663
2205
  }
664
2206
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SearchstaxSearchAnswerWidget, decorators: [{
665
2207
  type: Component,
666
- args: [{ selector: "app-searchstax-answer", template: "<div [id]=\"'searchstax-answer-container' + rand\">\n <div\n *ngIf=\"\n answerData &&\n answerData?.searchExecuted &&\n answerData.shouldShowAnswer &&\n !templateOverride\n \"\n >\n <div class=\"searchstax-answer-wrap\">\n <div class=\"searchstax-answer-icon\"></div>\n <div>\n <div\n [class]=\"\n 'searchstax-answer-container' + answerData.showMoreButtonVisible\n ? 'searchstax-answer-show-more'\n : ''\n \"\n >\n <div class=\"searchstax-answer-title\">Answer</div>\n <div class=\"searchstax-answer-error\" *ngIf=\"answerData.shouldShowAnswerError\" [innerHTML]=\"answerData.answerErrorMessage\"></div>\n <div\n class=\"searchstax-answer-description\"\n [innerHTML]=\"answerData.fullAnswerFormatted\"\n ></div>\n <div\n *ngIf=\"answerData.answerLoading\"\n class=\"searchstax-answer-loading\"\n ></div>\n </div>\n <div\n *ngIf=\"answerData.showMoreButtonVisible\"\n class=\"searchstax-answer-load-more-button-container\"\n >\n <button\n class=\"searchstax-answer-load-more-button\"\n (click)=\"showMore($event, context)\"\n >\n Show More...\n </button>\n </div>\n </div>\n <div class=\"searchstax-answer-footer\">\n <div id=\"feedbackWidgetContainer\"></div>\n <div class=\"searchstax-lightweight-widget-separator-inline\"></div>\n <p class=\"searchstax-disclaimer\">Generative AI is Experimental</p>\n </div>\n </div>\n </div>\n <div\n *ngIf=\"\n answerData &&\n answerData?.searchExecuted &&\n answerData.shouldShowAnswer &&\n templateOverride\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"templateOverride; context: context\"\n ></ng-container>\n </div>\n</div>\n" }]
2208
+ args: [{ selector: "app-searchstax-answer", template: "<div [id]=\"'searchstax-answer-container' + rand\">\n <div\n *ngIf=\"\n answerData &&\n answerData?.searchExecuted &&\n answerData.shouldShowAnswer &&\n !templateOverride\n \"\n >\n <app-answer-template #ref></app-answer-template>\n <ng-template\n [ngTemplateOutlet]=\"ref.answerTemplate\"\n [ngTemplateOutletContext]=\"context\"\n ></ng-template>\n </div>\n <div\n *ngIf=\"\n answerData &&\n answerData?.searchExecuted &&\n answerData.shouldShowAnswer &&\n templateOverride\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"templateOverride; context: context\"\n ></ng-container>\n </div>\n</div>\n" }]
667
2209
  }], ctorParameters: () => [{ type: StoreServiceService }], propDecorators: { templateOverride: [{
668
2210
  type: Input
669
2211
  }], feedbackwidget: [{
@@ -672,6 +2214,84 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
672
2214
  type: Input
673
2215
  }] } });
674
2216
 
2217
+ // reusable-template.component.ts
2218
+ class RelatedTemplateComponent {
2219
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: RelatedTemplateComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2220
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: RelatedTemplateComponent, selector: "app-related-template", viewQueries: [{ propertyName: "relatedTemplate", first: true, predicate: ["relatedTemplate"], descendants: true }], ngImport: i0, template: `
2221
+ <ng-template
2222
+ #relatedTemplate
2223
+ let-rand="rand"
2224
+ let-relatedData="relatedData"
2225
+ let-executeSearch="executeSearch"
2226
+ let-context="context"
2227
+ >
2228
+ <div
2229
+ class="searchstax-related-searches-container"
2230
+ [id]="'searchstax-related-searches-container' + rand"
2231
+ >
2232
+ Related searches: <span id="searchstax-related-searches"></span>
2233
+ <span
2234
+ class="searchstax-related-search"
2235
+ *ngIf="relatedData.relatedSearches"
2236
+ >
2237
+ <span
2238
+ *ngFor="let related of relatedData.relatedSearches"
2239
+ (click)="executeSearch(related, context)"
2240
+ (keyup.enter)="executeSearch(related, context)"
2241
+ (keyup.space)="executeSearch(related, context)"
2242
+ tabindex="0"
2243
+ class="searchstax-related-search searchstax-related-search-item"
2244
+ [attr.aria-label]="'Related search: ' + related.related_search"
2245
+ >
2246
+ {{ related.related_search }}<span *ngIf="!related.last">,</span>
2247
+ </span>
2248
+ </span>
2249
+ </div>
2250
+ </ng-template>
2251
+ `, isInline: true, dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
2252
+ }
2253
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: RelatedTemplateComponent, decorators: [{
2254
+ type: Component,
2255
+ args: [{
2256
+ selector: "app-related-template",
2257
+ template: `
2258
+ <ng-template
2259
+ #relatedTemplate
2260
+ let-rand="rand"
2261
+ let-relatedData="relatedData"
2262
+ let-executeSearch="executeSearch"
2263
+ let-context="context"
2264
+ >
2265
+ <div
2266
+ class="searchstax-related-searches-container"
2267
+ [id]="'searchstax-related-searches-container' + rand"
2268
+ >
2269
+ Related searches: <span id="searchstax-related-searches"></span>
2270
+ <span
2271
+ class="searchstax-related-search"
2272
+ *ngIf="relatedData.relatedSearches"
2273
+ >
2274
+ <span
2275
+ *ngFor="let related of relatedData.relatedSearches"
2276
+ (click)="executeSearch(related, context)"
2277
+ (keyup.enter)="executeSearch(related, context)"
2278
+ (keyup.space)="executeSearch(related, context)"
2279
+ tabindex="0"
2280
+ class="searchstax-related-search searchstax-related-search-item"
2281
+ [attr.aria-label]="'Related search: ' + related.related_search"
2282
+ >
2283
+ {{ related.related_search }}<span *ngIf="!related.last">,</span>
2284
+ </span>
2285
+ </span>
2286
+ </div>
2287
+ </ng-template>
2288
+ `,
2289
+ }]
2290
+ }], propDecorators: { relatedTemplate: [{
2291
+ type: ViewChild,
2292
+ args: ["relatedTemplate"]
2293
+ }] } });
2294
+
675
2295
  class SearchstaxSearchRelatedSearchesWidget {
676
2296
  constructor(storeServiceService) {
677
2297
  this.storeServiceService = storeServiceService;
@@ -699,11 +2319,11 @@ class SearchstaxSearchRelatedSearchesWidget {
699
2319
  });
700
2320
  }
701
2321
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SearchstaxSearchRelatedSearchesWidget, deps: [{ token: StoreServiceService }], target: i0.ɵɵFactoryTarget.Component }); }
702
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: SearchstaxSearchRelatedSearchesWidget, selector: "app-searchstax-related-searches", inputs: { relatedSearchesURL: "relatedSearchesURL", relatedSearchesAPIKey: "relatedSearchesAPIKey", templateOverride: "templateOverride" }, ngImport: i0, template: "<div\n class=\"searchstax-related-searches-container\"\n [id]=\"'searchstax-related-searches-container' + rand\"\n *ngIf=\"relatedData && relatedData?.searchExecuted && relatedData?.hasRelatedSearches && !templateOverride\"\n>\n Related searches: <span id=\"searchstax-related-searches\"></span>\n <span class=\"searchstax-related-search\" *ngIf=\"relatedData.relatedSearches\">\n <span\n *ngFor=\"let related of relatedData.relatedSearches\"\n tabindex=\"0\"\n (click)=\"executeSearch(related, context)\"\n (keyup.enter)=\"executeSearch(related, context)\"\n (keyup.space)=\"executeSearch(related, context)\"\n class=\"searchstax-related-search searchstax-related-search-item\"\n >\n {{ related.related_search }}<span *ngIf=\"!related.last\">,</span>\n </span>\n </span>\n</div>\n\n<div *ngIf=\"relatedData && relatedData?.searchExecuted && relatedData?.hasRelatedSearches && templateOverride\">\n <ng-container *ngTemplateOutlet=\"templateOverride; context: context\"></ng-container>\n</div>\n", dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] }); }
2322
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: SearchstaxSearchRelatedSearchesWidget, selector: "app-searchstax-related-searches", inputs: { relatedSearchesURL: "relatedSearchesURL", relatedSearchesAPIKey: "relatedSearchesAPIKey", templateOverride: "templateOverride" }, ngImport: i0, template: "<ng-container\n *ngIf=\"\n relatedData &&\n relatedData?.searchExecuted &&\n relatedData?.hasRelatedSearches &&\n !templateOverride\n \"\n>\n <app-related-template #ref></app-related-template>\n <ng-template\n *ngTemplateOutlet=\"ref.relatedTemplate; context: context\"\n ></ng-template>\n</ng-container>\n\n<div\n *ngIf=\"\n relatedData &&\n relatedData?.searchExecuted &&\n relatedData?.hasRelatedSearches &&\n templateOverride\n \"\n>\n <ng-container\n *ngTemplateOutlet=\"templateOverride; context: context\"\n ></ng-container>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: RelatedTemplateComponent, selector: "app-related-template" }] }); }
703
2323
  }
704
2324
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SearchstaxSearchRelatedSearchesWidget, decorators: [{
705
2325
  type: Component,
706
- args: [{ selector: "app-searchstax-related-searches", template: "<div\n class=\"searchstax-related-searches-container\"\n [id]=\"'searchstax-related-searches-container' + rand\"\n *ngIf=\"relatedData && relatedData?.searchExecuted && relatedData?.hasRelatedSearches && !templateOverride\"\n>\n Related searches: <span id=\"searchstax-related-searches\"></span>\n <span class=\"searchstax-related-search\" *ngIf=\"relatedData.relatedSearches\">\n <span\n *ngFor=\"let related of relatedData.relatedSearches\"\n tabindex=\"0\"\n (click)=\"executeSearch(related, context)\"\n (keyup.enter)=\"executeSearch(related, context)\"\n (keyup.space)=\"executeSearch(related, context)\"\n class=\"searchstax-related-search searchstax-related-search-item\"\n >\n {{ related.related_search }}<span *ngIf=\"!related.last\">,</span>\n </span>\n </span>\n</div>\n\n<div *ngIf=\"relatedData && relatedData?.searchExecuted && relatedData?.hasRelatedSearches && templateOverride\">\n <ng-container *ngTemplateOutlet=\"templateOverride; context: context\"></ng-container>\n</div>\n" }]
2326
+ args: [{ selector: "app-searchstax-related-searches", template: "<ng-container\n *ngIf=\"\n relatedData &&\n relatedData?.searchExecuted &&\n relatedData?.hasRelatedSearches &&\n !templateOverride\n \"\n>\n <app-related-template #ref></app-related-template>\n <ng-template\n *ngTemplateOutlet=\"ref.relatedTemplate; context: context\"\n ></ng-template>\n</ng-container>\n\n<div\n *ngIf=\"\n relatedData &&\n relatedData?.searchExecuted &&\n relatedData?.hasRelatedSearches &&\n templateOverride\n \"\n>\n <ng-container\n *ngTemplateOutlet=\"templateOverride; context: context\"\n ></ng-container>\n</div>\n" }]
707
2327
  }], ctorParameters: () => [{ type: StoreServiceService }], propDecorators: { relatedSearchesURL: [{
708
2328
  type: Input
709
2329
  }], relatedSearchesAPIKey: [{
@@ -712,6 +2332,110 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
712
2332
  type: Input
713
2333
  }] } });
714
2334
 
2335
+ // reusable-template.component.ts
2336
+ class ExternalPromotionsTemplateComponent {
2337
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ExternalPromotionsTemplateComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
2338
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: ExternalPromotionsTemplateComponent, selector: "app-external-template", viewQueries: [{ propertyName: "externalPromotionsTemplate", first: true, predicate: ["externalPromotionsTemplate"], descendants: true }], ngImport: i0, template: `
2339
+ <ng-template
2340
+ #externalPromotionsTemplate
2341
+ let-context="context"
2342
+ let-externalPromotionsData="externalPromotionsData"
2343
+ let-trackClick="trackClick"
2344
+ >
2345
+ <div
2346
+ class="searchstax-external-promotions-container"
2347
+ id="searchstax-external-promotions-container"
2348
+ >
2349
+ <div
2350
+ class="searchstax-external-promotion searchstax-search-result"
2351
+ *ngFor="
2352
+ let externalPromotion of externalPromotionsData.externalPromotions
2353
+ "
2354
+ >
2355
+ <div class="icon-elevated"></div>
2356
+ <a
2357
+ *ngIf="externalPromotion.url"
2358
+ [href]="externalPromotion.url"
2359
+ (click)="trackClick(externalPromotion, $event, context)"
2360
+ class="searchstax-result-item-link"
2361
+ ></a>
2362
+ <div class="searchstax-search-result-title-container">
2363
+ <span class="searchstax-search-result-title">{{
2364
+ externalPromotion.name
2365
+ }}</span>
2366
+ </div>
2367
+ <p
2368
+ *ngIf="externalPromotion.description"
2369
+ class="searchstax-search-result-description searchstax-search-result-common"
2370
+ >
2371
+ {{ externalPromotion.description }}
2372
+ </p>
2373
+ <p
2374
+ *ngIf="externalPromotion.url"
2375
+ class="searchstax-search-result-description searchstax-search-result-common"
2376
+ >
2377
+ {{ externalPromotion.url }}
2378
+ </p>
2379
+ </div>
2380
+ </div>
2381
+ </ng-template>
2382
+ `, isInline: true, dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] }); }
2383
+ }
2384
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ExternalPromotionsTemplateComponent, decorators: [{
2385
+ type: Component,
2386
+ args: [{
2387
+ selector: "app-external-template",
2388
+ template: `
2389
+ <ng-template
2390
+ #externalPromotionsTemplate
2391
+ let-context="context"
2392
+ let-externalPromotionsData="externalPromotionsData"
2393
+ let-trackClick="trackClick"
2394
+ >
2395
+ <div
2396
+ class="searchstax-external-promotions-container"
2397
+ id="searchstax-external-promotions-container"
2398
+ >
2399
+ <div
2400
+ class="searchstax-external-promotion searchstax-search-result"
2401
+ *ngFor="
2402
+ let externalPromotion of externalPromotionsData.externalPromotions
2403
+ "
2404
+ >
2405
+ <div class="icon-elevated"></div>
2406
+ <a
2407
+ *ngIf="externalPromotion.url"
2408
+ [href]="externalPromotion.url"
2409
+ (click)="trackClick(externalPromotion, $event, context)"
2410
+ class="searchstax-result-item-link"
2411
+ ></a>
2412
+ <div class="searchstax-search-result-title-container">
2413
+ <span class="searchstax-search-result-title">{{
2414
+ externalPromotion.name
2415
+ }}</span>
2416
+ </div>
2417
+ <p
2418
+ *ngIf="externalPromotion.description"
2419
+ class="searchstax-search-result-description searchstax-search-result-common"
2420
+ >
2421
+ {{ externalPromotion.description }}
2422
+ </p>
2423
+ <p
2424
+ *ngIf="externalPromotion.url"
2425
+ class="searchstax-search-result-description searchstax-search-result-common"
2426
+ >
2427
+ {{ externalPromotion.url }}
2428
+ </p>
2429
+ </div>
2430
+ </div>
2431
+ </ng-template>
2432
+ `,
2433
+ }]
2434
+ }], propDecorators: { externalPromotionsTemplate: [{
2435
+ type: ViewChild,
2436
+ args: ["externalPromotionsTemplate"]
2437
+ }] } });
2438
+
715
2439
  class SearchstaxSearchExternalPromotionsWidget {
716
2440
  constructor(storeServiceService) {
717
2441
  this.storeServiceService = storeServiceService;
@@ -739,11 +2463,11 @@ class SearchstaxSearchExternalPromotionsWidget {
739
2463
  });
740
2464
  }
741
2465
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SearchstaxSearchExternalPromotionsWidget, deps: [{ token: StoreServiceService }], target: i0.ɵɵFactoryTarget.Component }); }
742
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: SearchstaxSearchExternalPromotionsWidget, selector: "app-searchstax-external-promotions", inputs: { templateOverride: "templateOverride" }, ngImport: i0, template: "<div [id]=\"'searchstax-external-promotions-layout-container' + rand\">\n <div\n class=\"searchstax-external-promotions-container\"\n id=\"searchstax-external-promotions-container\"\n *ngIf=\"\n externalPromotionsData &&\n externalPromotionsData?.searchExecuted &&\n externalPromotionsData?.hasExternalPromotions &&\n !templateOverride\n \"\n >\n <div\n class=\"searchstax-external-promotion searchstax-search-result\"\n *ngFor=\"let externalPromotion of externalPromotionsData.externalPromotions\"\n >\n <div class=\"icon-elevated\"></div>\n <a\n *ngIf=\"externalPromotion.url\"\n [href]=\"externalPromotion.url\"\n (click)=\"trackClick(externalPromotion, $event, context)\"\n class=\"searchstax-result-item-link\"\n ></a>\n <div class=\"searchstax-search-result-title-container\">\n <span class=\"searchstax-search-result-title\">{{ externalPromotion.name }}</span>\n </div>\n <p\n *ngIf=\"externalPromotion.description\"\n class=\"searchstax-search-result-description searchstax-search-result-common\"\n >\n {{ externalPromotion.description }}\n </p>\n <p *ngIf=\"externalPromotion.url\" class=\"searchstax-search-result-description searchstax-search-result-common\">\n {{ externalPromotion.url }}\n </p>\n </div>\n </div>\n <div\n *ngIf=\"\n externalPromotionsData &&\n externalPromotionsData?.searchExecuted &&\n externalPromotionsData?.hasExternalPromotions &&\n templateOverride\n \"\n >\n <ng-container *ngTemplateOutlet=\"templateOverride; context: context\"></ng-container>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }] }); }
2466
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: SearchstaxSearchExternalPromotionsWidget, selector: "app-searchstax-external-promotions", inputs: { templateOverride: "templateOverride" }, ngImport: i0, template: "<div [id]=\"'searchstax-external-promotions-layout-container' + rand\">\n <ng-container\n *ngIf=\"\n externalPromotionsData &&\n externalPromotionsData?.searchExecuted &&\n externalPromotionsData?.hasExternalPromotions &&\n !templateOverride\n \"\n >\n <app-external-template #ref></app-external-template>\n <ng-template\n *ngTemplateOutlet=\"ref.externalPromotionsTemplate; context: context\"\n ></ng-template>\n </ng-container>\n <div\n *ngIf=\"\n externalPromotionsData &&\n externalPromotionsData?.searchExecuted &&\n externalPromotionsData?.hasExternalPromotions &&\n templateOverride\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"templateOverride; context: context\"\n ></ng-container>\n </div>\n</div>\n", dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: ExternalPromotionsTemplateComponent, selector: "app-external-template" }] }); }
743
2467
  }
744
2468
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SearchstaxSearchExternalPromotionsWidget, decorators: [{
745
2469
  type: Component,
746
- args: [{ selector: "app-searchstax-external-promotions", template: "<div [id]=\"'searchstax-external-promotions-layout-container' + rand\">\n <div\n class=\"searchstax-external-promotions-container\"\n id=\"searchstax-external-promotions-container\"\n *ngIf=\"\n externalPromotionsData &&\n externalPromotionsData?.searchExecuted &&\n externalPromotionsData?.hasExternalPromotions &&\n !templateOverride\n \"\n >\n <div\n class=\"searchstax-external-promotion searchstax-search-result\"\n *ngFor=\"let externalPromotion of externalPromotionsData.externalPromotions\"\n >\n <div class=\"icon-elevated\"></div>\n <a\n *ngIf=\"externalPromotion.url\"\n [href]=\"externalPromotion.url\"\n (click)=\"trackClick(externalPromotion, $event, context)\"\n class=\"searchstax-result-item-link\"\n ></a>\n <div class=\"searchstax-search-result-title-container\">\n <span class=\"searchstax-search-result-title\">{{ externalPromotion.name }}</span>\n </div>\n <p\n *ngIf=\"externalPromotion.description\"\n class=\"searchstax-search-result-description searchstax-search-result-common\"\n >\n {{ externalPromotion.description }}\n </p>\n <p *ngIf=\"externalPromotion.url\" class=\"searchstax-search-result-description searchstax-search-result-common\">\n {{ externalPromotion.url }}\n </p>\n </div>\n </div>\n <div\n *ngIf=\"\n externalPromotionsData &&\n externalPromotionsData?.searchExecuted &&\n externalPromotionsData?.hasExternalPromotions &&\n templateOverride\n \"\n >\n <ng-container *ngTemplateOutlet=\"templateOverride; context: context\"></ng-container>\n </div>\n</div>\n" }]
2470
+ args: [{ selector: "app-searchstax-external-promotions", template: "<div [id]=\"'searchstax-external-promotions-layout-container' + rand\">\n <ng-container\n *ngIf=\"\n externalPromotionsData &&\n externalPromotionsData?.searchExecuted &&\n externalPromotionsData?.hasExternalPromotions &&\n !templateOverride\n \"\n >\n <app-external-template #ref></app-external-template>\n <ng-template\n *ngTemplateOutlet=\"ref.externalPromotionsTemplate; context: context\"\n ></ng-template>\n </ng-container>\n <div\n *ngIf=\"\n externalPromotionsData &&\n externalPromotionsData?.searchExecuted &&\n externalPromotionsData?.hasExternalPromotions &&\n templateOverride\n \"\n >\n <ng-container\n *ngTemplateOutlet=\"templateOverride; context: context\"\n ></ng-container>\n </div>\n</div>\n" }]
747
2471
  }], ctorParameters: () => [{ type: StoreServiceService }], propDecorators: { templateOverride: [{
748
2472
  type: Input
749
2473
  }] } });
@@ -760,7 +2484,20 @@ class SearchstudioUxAngularModule {
760
2484
  SearchstaxSearchRelatedSearchesWidget,
761
2485
  SearchstaxSearchExternalPromotionsWidget,
762
2486
  SearchstaxSearchAnswerWidget,
763
- SearchstaxSearchLocationWidget], imports: [CommonModule, FormsModule], exports: [SearchstaxWrapper,
2487
+ SearchstaxSearchLocationWidget,
2488
+ AnswerTemplateComponent,
2489
+ OverviewTemplateComponent,
2490
+ InputTemplateComponent,
2491
+ LocationTemplateComponent,
2492
+ PaginationTemplateComponent,
2493
+ PaginationInfiniteTemplateComponent,
2494
+ ResultsTemplateComponent,
2495
+ NoResultsTemplateComponent,
2496
+ ExternalPromotionsTemplateComponent,
2497
+ SortingTemplateComponent,
2498
+ RelatedTemplateComponent,
2499
+ FacetDesktopTemplateComponent,
2500
+ FacetMobileTemplateComponent], imports: [CommonModule, FormsModule], exports: [SearchstaxWrapper,
764
2501
  SearchstaxInputWidget,
765
2502
  SearchstaxResultsWidget,
766
2503
  SearchstaxSearchFeedbackWidget,
@@ -770,7 +2507,20 @@ class SearchstudioUxAngularModule {
770
2507
  SearchstaxSearchRelatedSearchesWidget,
771
2508
  SearchstaxSearchExternalPromotionsWidget,
772
2509
  SearchstaxSearchAnswerWidget,
773
- SearchstaxSearchLocationWidget] }); }
2510
+ SearchstaxSearchLocationWidget,
2511
+ AnswerTemplateComponent,
2512
+ OverviewTemplateComponent,
2513
+ InputTemplateComponent,
2514
+ LocationTemplateComponent,
2515
+ PaginationTemplateComponent,
2516
+ PaginationInfiniteTemplateComponent,
2517
+ ResultsTemplateComponent,
2518
+ NoResultsTemplateComponent,
2519
+ ExternalPromotionsTemplateComponent,
2520
+ SortingTemplateComponent,
2521
+ RelatedTemplateComponent,
2522
+ FacetDesktopTemplateComponent,
2523
+ FacetMobileTemplateComponent] }); }
774
2524
  static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SearchstudioUxAngularModule, imports: [CommonModule, FormsModule] }); }
775
2525
  }
776
2526
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: SearchstudioUxAngularModule, decorators: [{
@@ -787,7 +2537,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
787
2537
  SearchstaxSearchRelatedSearchesWidget,
788
2538
  SearchstaxSearchExternalPromotionsWidget,
789
2539
  SearchstaxSearchAnswerWidget,
790
- SearchstaxSearchLocationWidget
2540
+ SearchstaxSearchLocationWidget,
2541
+ AnswerTemplateComponent,
2542
+ OverviewTemplateComponent,
2543
+ InputTemplateComponent,
2544
+ LocationTemplateComponent,
2545
+ PaginationTemplateComponent,
2546
+ PaginationInfiniteTemplateComponent,
2547
+ ResultsTemplateComponent,
2548
+ NoResultsTemplateComponent,
2549
+ ExternalPromotionsTemplateComponent,
2550
+ SortingTemplateComponent,
2551
+ RelatedTemplateComponent,
2552
+ FacetDesktopTemplateComponent,
2553
+ FacetMobileTemplateComponent
791
2554
  ],
792
2555
  imports: [CommonModule, FormsModule],
793
2556
  exports: [
@@ -801,7 +2564,20 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
801
2564
  SearchstaxSearchRelatedSearchesWidget,
802
2565
  SearchstaxSearchExternalPromotionsWidget,
803
2566
  SearchstaxSearchAnswerWidget,
804
- SearchstaxSearchLocationWidget
2567
+ SearchstaxSearchLocationWidget,
2568
+ AnswerTemplateComponent,
2569
+ OverviewTemplateComponent,
2570
+ InputTemplateComponent,
2571
+ LocationTemplateComponent,
2572
+ PaginationTemplateComponent,
2573
+ PaginationInfiniteTemplateComponent,
2574
+ ResultsTemplateComponent,
2575
+ NoResultsTemplateComponent,
2576
+ ExternalPromotionsTemplateComponent,
2577
+ SortingTemplateComponent,
2578
+ RelatedTemplateComponent,
2579
+ FacetDesktopTemplateComponent,
2580
+ FacetMobileTemplateComponent
805
2581
  ],
806
2582
  }]
807
2583
  }] });
@@ -814,5 +2590,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
814
2590
  * Generated bundle index. Do not edit.
815
2591
  */
816
2592
 
817
- export { SearchstaxInputWidget, SearchstaxResultsWidget, SearchstaxSearchAnswerWidget, SearchstaxSearchExternalPromotionsWidget, SearchstaxSearchFacetsWidget, SearchstaxSearchFeedbackWidget, SearchstaxSearchLocationWidget, SearchstaxSearchPaginationWidget, SearchstaxSearchRelatedSearchesWidget, SearchstaxSearchSortingWidget, SearchstaxWrapper, SearchstudioUxAngularModule, StoreServiceService };
2593
+ export { AnswerTemplateComponent, ExternalPromotionsTemplateComponent, FacetDesktopTemplateComponent, FacetMobileTemplateComponent, InputTemplateComponent, LocationTemplateComponent, NoResultsTemplateComponent, OverviewTemplateComponent, PaginationInfiniteTemplateComponent, PaginationTemplateComponent, RelatedTemplateComponent, ResultsTemplateComponent, SearchstaxInputWidget, SearchstaxResultsWidget, SearchstaxSearchAnswerWidget, SearchstaxSearchExternalPromotionsWidget, SearchstaxSearchFacetsWidget, SearchstaxSearchFeedbackWidget, SearchstaxSearchLocationWidget, SearchstaxSearchPaginationWidget, SearchstaxSearchRelatedSearchesWidget, SearchstaxSearchSortingWidget, SearchstaxWrapper, SearchstudioUxAngularModule, SortingTemplateComponent, StoreServiceService };
818
2594
  //# sourceMappingURL=searchstax-inc-searchstudio-ux-angular.mjs.map