@fluid-topics/ft-search-bar 1.1.7 → 1.1.8

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.
@@ -40,6 +40,7 @@ export declare class FtSearchBar extends FtLitElement implements FtSearchBarProp
40
40
  selectedPreset?: string;
41
41
  priors?: Array<FtSearchPrior>;
42
42
  searchRequestSerializer: (request: FtSearchRequest) => string;
43
+ focusOnDisplay: boolean;
43
44
  private searchFilters;
44
45
  private sizeCategory;
45
46
  displayFacets: boolean;
@@ -58,6 +59,7 @@ export declare class FtSearchBar extends FtLitElement implements FtSearchBarProp
58
59
  recentSearches: Array<string>;
59
60
  scrollToFacet?: string;
60
61
  api?: FluidTopicsApi;
62
+ reactToFocus: boolean;
61
63
  suggestManager: SuggestManager;
62
64
  selectedFacetsManager: FacetsChipsManager;
63
65
  desktopSearchBarManager: DesktopSearchBarManager;
@@ -71,7 +73,7 @@ export declare class FtSearchBar extends FtLitElement implements FtSearchBarProp
71
73
  private get hasPriors();
72
74
  hasLocaleSelector(): boolean;
73
75
  focus(): void;
74
- focusInput(): void;
76
+ focusInput(): Promise<void>;
75
77
  clear(): void;
76
78
  protected render(): import("lit").TemplateResult<1>;
77
79
  protected renderSearchBar(): import("lit").TemplateResult<1>;
@@ -100,7 +102,7 @@ export declare class FtSearchBar extends FtLitElement implements FtSearchBarProp
100
102
  private initRecentSearches;
101
103
  saveRecentSearches(): void;
102
104
  private closeFloatingContainer;
103
- connectedCallback(): void;
105
+ connectedCallback(): Promise<void>;
104
106
  disconnectedCallback(): void;
105
107
  private updateSize;
106
108
  setFilter(key: string, selectedValues: Array<string>): void;
@@ -111,4 +113,7 @@ export declare class FtSearchBar extends FtLitElement implements FtSearchBarProp
111
113
  querySelector(selectors: string): HTMLElement | null;
112
114
  querySelectorAll(selectors: string): NodeListOf<HTMLElement>;
113
115
  renderDesktopFloatingMenu(): import("lit").TemplateResult<1> | typeof nothing;
116
+ private enableFocusReactionCallback;
117
+ private enableFocusReactionOnAnyUserInteraction;
118
+ private enableFocusReaction;
114
119
  }
@@ -7,7 +7,7 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
7
7
  import { html, nothing } from "lit";
8
8
  import { property, query, state } from "lit/decorators.js";
9
9
  import { repeat } from "lit/directives/repeat.js";
10
- import { Debouncer, flatDeep, FtLitElement, jsonProperty, ParametrizedLabelResolver, serializeRequest } from "@fluid-topics/ft-wc-utils";
10
+ import { Debouncer, flatDeep, FtLitElement, isTouchScreen, jsonProperty, ParametrizedLabelResolver, serializeRequest, waitFor } from "@fluid-topics/ft-wc-utils";
11
11
  import { FtSizeCategory, FtSizeWatcher } from "@fluid-topics/ft-size-watcher";
12
12
  import { FtTypography, FtTypographyBody2 } from "@fluid-topics/ft-typography";
13
13
  import { facetToFilter, selectedValues, unquote } from "./converters";
@@ -78,6 +78,7 @@ class FtSearchBar extends FtLitElement {
78
78
  this.presets = [];
79
79
  this.priors = [];
80
80
  this.searchRequestSerializer = (request) => serializeRequest(this.baseUrl, request);
81
+ this.focusOnDisplay = false;
81
82
  this.searchFilters = [];
82
83
  this.sizeCategory = FtSizeCategory.M;
83
84
  this.displayFacets = false;
@@ -88,6 +89,7 @@ class FtSearchBar extends FtLitElement {
88
89
  this.query = "";
89
90
  this.suggestions = [];
90
91
  this.recentSearches = [];
92
+ this.reactToFocus = true;
91
93
  this.suggestManager = new SuggestManager(this);
92
94
  this.selectedFacetsManager = new FacetsChipsManager(this);
93
95
  this.desktopSearchBarManager = new DesktopSearchBarManager(this);
@@ -108,6 +110,7 @@ class FtSearchBar extends FtLitElement {
108
110
  this.compareRequests = (a, b) => (a.contentLocale == null || b.contentLocale == null || a.contentLocale === b.contentLocale)
109
111
  && a.filters.length === b.filters.length
110
112
  && a.filters.every(fa => b.filters.some(fb => this.compareFilters(fa, fb)));
113
+ this.enableFocusReactionCallback = () => this.enableFocusReaction();
111
114
  }
112
115
  isMobileMenuOpen() {
113
116
  return this.isMobile() && (this.forceMobileMenuOpen || this.forceMenuOpen || this.mobileMenuOpen);
@@ -163,13 +166,9 @@ class FtSearchBar extends FtLitElement {
163
166
  var _a;
164
167
  (_a = this.container) === null || _a === void 0 ? void 0 : _a.focus();
165
168
  }
166
- focusInput() {
167
- if (this.input) {
168
- this.input.focus();
169
- }
170
- else {
171
- setTimeout(() => this.focusInput(), 50);
172
- }
169
+ async focusInput() {
170
+ await waitFor(() => this.input, 50);
171
+ this.input.focus();
173
172
  }
174
173
  clear() {
175
174
  this.query = "";
@@ -190,9 +189,9 @@ class FtSearchBar extends FtLitElement {
190
189
  return this.facetsInitialized && this.availableContentLocalesInitialized
191
190
  ? this.isMobile() ? this.mobileSearchBarManager.render() : this.desktopSearchBarManager.render()
192
191
  : html `
193
- <ft-skeleton class="ft-search-bar--container ft-search-bar--skeleton"
194
- part="loader"
195
- tabindex="-1"></ft-skeleton>
192
+ <ft-skeleton class="ft-search-bar--container ft-search-bar--skeleton"
193
+ part="loader"
194
+ tabindex="-1"></ft-skeleton>
196
195
  `;
197
196
  }
198
197
  renderMobileFacets() {
@@ -220,31 +219,31 @@ class FtSearchBar extends FtLitElement {
220
219
  const keyWithNoColumn = facet.key.replace(":", "-");
221
220
  const values = selectedValues(filter);
222
221
  return facet.rootNodes.length > 0 ? html `
223
- <ft-accordion-item data-facet-key="${facet.key}">
224
- <div class="ft-search-bar--filter-label" slot="toggle">
225
- <ft-typography variant="button">${facet.label}</ft-typography>
226
- ${values.length > 0 ? html `
227
- <ft-typography class="ft-search-bar--filter-label-values" variant="body2">
228
- ${values.join(", ")}
229
- </ft-typography>
230
- ` : nothing}
231
- </div>
232
- <ft-filter
233
- part="filters filter filter-${keyWithNoColumn}"
234
- .exportpartsPrefixes=${["filter", "filter-" + keyWithNoColumn]}
235
- id="${filter.id}"
236
- filterPlaceHolder="${this.labelResolver.resolve("filterInputPlaceHolder", filter.label)}"
237
- clearButtonLabel="${this.labelResolver.resolve("clearFilterButton")}"
238
- moreValuesButtonLabel="${this.labelResolver.resolve("displayMoreFilterValuesButton")}"
239
- noValuesLabel="${this.labelResolver.resolve("noFilterValuesAvailable")}"
240
- ?multivalued=${filter.multivalued}
241
- raiseSelectedOptions
242
- .options=${filter.options}
243
- .displayedValuesLimit=${10}
244
- @change=${(e) => this.setFilter(filter.id, e.detail)}
245
- ></ft-filter>
246
- </ft-accordion-item>
247
- ` : nothing;
222
+ <ft-accordion-item data-facet-key="${facet.key}">
223
+ <div class="ft-search-bar--filter-label" slot="toggle">
224
+ <ft-typography variant="button">${facet.label}</ft-typography>
225
+ ${values.length > 0 ? html `
226
+ <ft-typography class="ft-search-bar--filter-label-values" variant="body2">
227
+ ${values.join(", ")}
228
+ </ft-typography>
229
+ ` : nothing}
230
+ </div>
231
+ <ft-filter
232
+ part="filters filter filter-${keyWithNoColumn}"
233
+ .exportpartsPrefixes=${["filter", "filter-" + keyWithNoColumn]}
234
+ id="${filter.id}"
235
+ filterPlaceHolder="${this.labelResolver.resolve("filterInputPlaceHolder", filter.label)}"
236
+ clearButtonLabel="${this.labelResolver.resolve("clearFilterButton")}"
237
+ moreValuesButtonLabel="${this.labelResolver.resolve("displayMoreFilterValuesButton")}"
238
+ noValuesLabel="${this.labelResolver.resolve("noFilterValuesAvailable")}"
239
+ ?multivalued=${filter.multivalued}
240
+ raiseSelectedOptions
241
+ .options=${filter.options}
242
+ .displayedValuesLimit=${10}
243
+ @change=${(e) => this.setFilter(filter.id, e.detail)}
244
+ ></ft-filter>
245
+ </ft-accordion-item>
246
+ ` : nothing;
248
247
  })}
249
248
  </ft-accordion>
250
249
  `;
@@ -253,18 +252,18 @@ class FtSearchBar extends FtLitElement {
253
252
  var _a;
254
253
  return html `
255
254
  <ft-radio-group
256
- @change=${(e) => {
255
+ @change=${(e) => {
257
256
  this.contentLocale = (e.detail === "all" ? undefined : e.detail);
258
257
  this.clearFilters();
259
258
  }}>
260
259
  ${repeat(((_a = this.availableContentLocales) !== null && _a !== void 0 ? _a : []), locale => locale.lang, locale => {
261
260
  var _a;
262
261
  return html `
263
- <ft-radio value="${(_a = locale.lang) !== null && _a !== void 0 ? _a : "all"}"
264
- ?checked=${locale.lang == this.contentLocale}>
265
- ${locale.label}
266
- </ft-radio>
267
- `;
262
+ <ft-radio value="${(_a = locale.lang) !== null && _a !== void 0 ? _a : "all"}"
263
+ ?checked=${locale.lang == this.contentLocale}>
264
+ ${locale.label}
265
+ </ft-radio>
266
+ `;
268
267
  })}
269
268
  </ft-radio-group>
270
269
  `;
@@ -292,17 +291,17 @@ class FtSearchBar extends FtLitElement {
292
291
  <div class="ft-search-bar--facets-actions">
293
292
  ${this.hasPresets ? html `
294
293
  <ft-select
295
- class="ft-search-bar--presets"
296
- part="presets"
297
- label="${this.labelResolver.resolve("presetsSelector")}"
298
- outlined
299
- @change=${(e) => this.selectedPreset = e.detail}>
294
+ class="ft-search-bar--presets"
295
+ part="presets"
296
+ label="${this.labelResolver.resolve("presetsSelector")}"
297
+ outlined
298
+ @change=${(e) => this.selectedPreset = e.detail}>
300
299
  ${repeat((_a = this.presets) !== null && _a !== void 0 ? _a : [], p => p.name, p => html `
301
- <ft-select-option value="${p.name}"
302
- label="${p.name}"
303
- ?selected=${p.name === this.selectedPreset}>
304
- </ft-select-option>
305
- `)}
300
+ <ft-select-option value="${p.name}"
301
+ label="${p.name}"
302
+ ?selected=${p.name === this.selectedPreset}>
303
+ </ft-select-option>
304
+ `)}
306
305
  </ft-select>
307
306
  ` : nothing}
308
307
  <slot name="facets-actions"></slot>
@@ -343,23 +342,23 @@ class FtSearchBar extends FtLitElement {
343
342
  const hierachical = filter.options.some(o => { var _a, _b; return ((_b = (_a = o.subOptions) === null || _a === void 0 ? void 0 : _a.length) !== null && _b !== void 0 ? _b : 0) > 0; });
344
343
  const keyWithNoColumn = facet.key.replace(":", "-");
345
344
  return html `
346
- <ft-filter
347
- class="${hierachical ? "ft-search-bar--hierarchical-filter" : ""}"
348
- part="filters filter filter-${keyWithNoColumn}"
349
- .exportpartsPrefixes=${["filter", "filter-" + keyWithNoColumn]}
350
- id="${filter.id}"
351
- label="${filter.label}"
352
- filterPlaceHolder="${this.labelResolver.resolve("filterInputPlaceHolder", filter.label)}"
353
- clearButtonLabel="${this.labelResolver.resolve("clearFilterButton")}"
354
- moreValuesButtonLabel="${this.labelResolver.resolve("displayMoreFilterValuesButton")}"
355
- noValuesLabel="${this.labelResolver.resolve("noFilterValuesAvailable")}"
356
- ?multivalued=${filter.multivalued}
357
- raiseSelectedOptions
358
- .options=${filter.options}
359
- .displayedValuesLimit=${10}
360
- @change=${(e) => this.setFilter(filter.id, e.detail)}
361
- ></ft-filter>
362
- `;
345
+ <ft-filter
346
+ class="${hierachical ? "ft-search-bar--hierarchical-filter" : ""}"
347
+ part="filters filter filter-${keyWithNoColumn}"
348
+ .exportpartsPrefixes=${["filter", "filter-" + keyWithNoColumn]}
349
+ id="${filter.id}"
350
+ label="${filter.label}"
351
+ filterPlaceHolder="${this.labelResolver.resolve("filterInputPlaceHolder", filter.label)}"
352
+ clearButtonLabel="${this.labelResolver.resolve("clearFilterButton")}"
353
+ moreValuesButtonLabel="${this.labelResolver.resolve("displayMoreFilterValuesButton")}"
354
+ noValuesLabel="${this.labelResolver.resolve("noFilterValuesAvailable")}"
355
+ ?multivalued=${filter.multivalued}
356
+ raiseSelectedOptions
357
+ .options=${filter.options}
358
+ .displayedValuesLimit=${10}
359
+ @change=${(e) => this.setFilter(filter.id, e.detail)}
360
+ ></ft-filter>
361
+ `;
363
362
  })}
364
363
  </ft-snap-scroll>
365
364
  `;
@@ -555,10 +554,15 @@ class FtSearchBar extends FtLitElement {
555
554
  url: window.location.href
556
555
  }));
557
556
  }
558
- connectedCallback() {
557
+ async connectedCallback() {
559
558
  super.connectedCallback();
560
559
  document.addEventListener("focusin", this.closeFloatingContainer);
561
560
  document.addEventListener("click", this.closeFloatingContainer);
561
+ if (this.focusOnDisplay && !isTouchScreen) {
562
+ this.reactToFocus = false;
563
+ await this.focusInput();
564
+ this.enableFocusReactionOnAnyUserInteraction();
565
+ }
562
566
  }
563
567
  disconnectedCallback() {
564
568
  super.disconnectedCallback();
@@ -615,6 +619,19 @@ class FtSearchBar extends FtLitElement {
615
619
  ${this.renderDesktopMenu()}
616
620
  </div>`;
617
621
  }
622
+ enableFocusReactionOnAnyUserInteraction() {
623
+ var _a, _b, _c;
624
+ (_a = this.container) === null || _a === void 0 ? void 0 : _a.addEventListener("blur", this.enableFocusReactionCallback);
625
+ (_b = this.container) === null || _b === void 0 ? void 0 : _b.addEventListener("click", this.enableFocusReactionCallback);
626
+ (_c = this.container) === null || _c === void 0 ? void 0 : _c.addEventListener("keyup", this.enableFocusReactionCallback);
627
+ }
628
+ enableFocusReaction() {
629
+ var _a, _b, _c;
630
+ this.reactToFocus = true;
631
+ (_a = this.container) === null || _a === void 0 ? void 0 : _a.removeEventListener("blur", this.enableFocusReactionCallback);
632
+ (_b = this.container) === null || _b === void 0 ? void 0 : _b.removeEventListener("click", this.enableFocusReactionCallback);
633
+ (_c = this.container) === null || _c === void 0 ? void 0 : _c.removeEventListener("keyup", this.enableFocusReactionCallback);
634
+ }
618
635
  }
619
636
  FtSearchBar.elementDefinitions = {
620
637
  "ft-accordion": FtAccordion,
@@ -690,6 +707,9 @@ __decorate([
690
707
  __decorate([
691
708
  property()
692
709
  ], FtSearchBar.prototype, "searchRequestSerializer", void 0);
710
+ __decorate([
711
+ property({ type: Boolean })
712
+ ], FtSearchBar.prototype, "focusOnDisplay", void 0);
693
713
  __decorate([
694
714
  state()
695
715
  ], FtSearchBar.prototype, "searchFilters", void 0);
@@ -738,6 +758,9 @@ __decorate([
738
758
  __decorate([
739
759
  state()
740
760
  ], FtSearchBar.prototype, "api", void 0);
761
+ __decorate([
762
+ state()
763
+ ], FtSearchBar.prototype, "reactToFocus", void 0);
741
764
  __decorate([
742
765
  state()
743
766
  ], FtSearchBar.prototype, "facetsLoaded", void 0);