@searchcraft/javascript-sdk 0.15.0 → 0.16.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.
- package/dist/components/defineCustomElements.js +24 -24
- package/dist/components/index.d.ts +130 -47
- package/dist/components/index.js +29 -29
- package/dist/components/safeUrl.js +378 -0
- package/dist/components/safeUrl.js.map +1 -0
- package/dist/components/searchcraft-ad.js +1 -1
- package/dist/components/searchcraft-ad2.js +6 -5
- package/dist/components/searchcraft-ad2.js.map +1 -1
- package/dist/components/searchcraft-button.js +1 -1
- package/dist/components/searchcraft-button2.js +2 -2
- package/dist/components/searchcraft-error-message.js +1 -1
- package/dist/components/searchcraft-error-message2.js +1 -1
- package/dist/components/searchcraft-facet-list.js +1 -1
- package/dist/components/searchcraft-facet-list2.js +2 -2
- package/dist/components/searchcraft-filter-panel.js +5 -5
- package/dist/components/searchcraft-input-form.js +1 -1
- package/dist/components/searchcraft-input-form2.js +23 -9
- package/dist/components/searchcraft-input-form2.js.map +1 -1
- package/dist/components/searchcraft-input-label.js +1 -1
- package/dist/components/searchcraft-input-label2.js +2 -2
- package/dist/components/searchcraft-loading.js +1 -1
- package/dist/components/searchcraft-loading2.js +1 -1
- package/dist/components/searchcraft-pagination.js +4 -4
- package/dist/components/searchcraft-popover-button.js +17 -6
- package/dist/components/searchcraft-popover-button.js.map +1 -1
- package/dist/components/searchcraft-popover-footer.js +1 -1
- package/dist/components/searchcraft-popover-footer2.js +5 -5
- package/dist/components/searchcraft-popover-footer2.js.map +1 -1
- package/dist/components/searchcraft-popover-form.js +106 -21
- package/dist/components/searchcraft-popover-form.js.map +1 -1
- package/dist/components/searchcraft-popover-list-item.js +1 -1
- package/dist/components/searchcraft-popover-list-item2.js +71 -10
- package/dist/components/searchcraft-popover-list-item2.js.map +1 -1
- package/dist/components/searchcraft-popover-list-view.js +1 -1
- package/dist/components/searchcraft-popover-list-view2.js +13 -8
- package/dist/components/searchcraft-popover-list-view2.js.map +1 -1
- package/dist/components/searchcraft-results-info.js +5 -5
- package/dist/components/searchcraft-results-info.js.map +1 -1
- package/dist/components/searchcraft-results-summary.js +1 -1
- package/dist/components/searchcraft-results-summary2.js +10 -9
- package/dist/components/searchcraft-results-summary2.js.map +1 -1
- package/dist/components/searchcraft-search-result.js +1 -1
- package/dist/components/searchcraft-search-result2.js +4 -3
- package/dist/components/searchcraft-search-result2.js.map +1 -1
- package/dist/components/searchcraft-search-results-per-page.js +3 -3
- package/dist/components/searchcraft-search-results.js +35 -18
- package/dist/components/searchcraft-search-results.js.map +1 -1
- package/dist/components/searchcraft-select.js +1 -1
- package/dist/components/searchcraft-select2.js +1 -1
- package/dist/components/searchcraft-slider.js +1 -1
- package/dist/components/searchcraft-slider2.js +5 -5
- package/dist/components/searchcraft-summary-box.js +6 -6
- package/dist/components/searchcraft-theme.js +3 -3
- package/dist/components/searchcraft-theme.js.map +1 -1
- package/dist/components/searchcraft-toggle-button.js +1 -1
- package/dist/components/searchcraft-toggle-button2.js +5 -5
- package/dist/hydrate/index.js +611 -57
- package/dist/hydrate/index.mjs +611 -57
- package/dist/themes/hologram.css +1 -1
- package/dist/themes/hologram.css.map +1 -1
- package/dist/types/components/searchcraft-input-form/searchcraft-input-form.d.ts +7 -0
- package/dist/types/components/searchcraft-popover-button/searchcraft-popover-button.d.ts +8 -0
- package/dist/types/components/searchcraft-popover-form/searchcraft-popover-form.d.ts +39 -1
- package/dist/types/components/searchcraft-popover-list-item/searchcraft-popover-list-item.d.ts +22 -1
- package/dist/types/components/searchcraft-popover-list-view/searchcraft-popover-list-view.d.ts +5 -1
- package/dist/types/components/searchcraft-results-summary/searchcraft-results-summary.d.ts +2 -2
- package/dist/types/components/searchcraft-search-results/searchcraft-search-results.d.ts +14 -8
- package/dist/types/components.d.ts +92 -36
- package/dist/types/types/sdk-types/templates.types.d.ts +40 -13
- package/dist/types/utils/html.d.ts +22 -0
- package/dist/types/utils/index.d.ts +1 -0
- package/dist/types/utils/safeUrl.d.ts +17 -0
- package/package.json +7 -5
- package/dist/components/html.js +0 -18
- package/dist/components/html.js.map +0 -1
|
@@ -1,16 +1,18 @@
|
|
|
1
|
-
import { p as proxyCustomElement, H, h, t as transformTag } from './index2.js?scv=0.
|
|
2
|
-
import { r as registry } from './CoreInstanceRegistry.js?scv=0.
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import { d as defineCustomElement$
|
|
7
|
-
import { d as defineCustomElement$
|
|
8
|
-
import { d as defineCustomElement$
|
|
9
|
-
import { d as defineCustomElement$
|
|
10
|
-
import { d as defineCustomElement$
|
|
11
|
-
import { d as defineCustomElement$
|
|
12
|
-
import { d as defineCustomElement$
|
|
13
|
-
import { d as defineCustomElement$
|
|
1
|
+
import { p as proxyCustomElement, H, h, t as transformTag } from './index2.js?scv=0.16.0';
|
|
2
|
+
import { r as registry } from './CoreInstanceRegistry.js?scv=0.16.0';
|
|
3
|
+
import { s as safeUrl, h as html } from './safeUrl.js?scv=0.16.0';
|
|
4
|
+
import { c as classNames } from './index3.js?scv=0.16.0';
|
|
5
|
+
import { p as purify } from './purify.es.js?scv=0.16.0';
|
|
6
|
+
import { d as defineCustomElement$b } from './searchcraft-ad2.js?scv=0.16.0';
|
|
7
|
+
import { d as defineCustomElement$a } from './searchcraft-button2.js?scv=0.16.0';
|
|
8
|
+
import { d as defineCustomElement$9 } from './searchcraft-error-message2.js?scv=0.16.0';
|
|
9
|
+
import { d as defineCustomElement$8 } from './searchcraft-input-form2.js?scv=0.16.0';
|
|
10
|
+
import { d as defineCustomElement$7 } from './searchcraft-input-label2.js?scv=0.16.0';
|
|
11
|
+
import { d as defineCustomElement$6 } from './searchcraft-loading2.js?scv=0.16.0';
|
|
12
|
+
import { d as defineCustomElement$5 } from './searchcraft-popover-footer2.js?scv=0.16.0';
|
|
13
|
+
import { d as defineCustomElement$4 } from './searchcraft-popover-list-item2.js?scv=0.16.0';
|
|
14
|
+
import { d as defineCustomElement$3 } from './searchcraft-popover-list-view2.js?scv=0.16.0';
|
|
15
|
+
import { d as defineCustomElement$2 } from './searchcraft-results-summary2.js?scv=0.16.0';
|
|
14
16
|
|
|
15
17
|
const SearchcraftPopoverForm$1 = /*@__PURE__*/ proxyCustomElement(class SearchcraftPopoverForm extends H {
|
|
16
18
|
constructor(registerHost) {
|
|
@@ -30,6 +32,19 @@ const SearchcraftPopoverForm$1 = /*@__PURE__*/ proxyCustomElement(class Searchcr
|
|
|
30
32
|
* Formats the content rendered for each result.
|
|
31
33
|
*/
|
|
32
34
|
popoverResultMappings;
|
|
35
|
+
/**
|
|
36
|
+
* A callback function responsible for rendering a result. When provided, it is used instead of `popoverResultMappings`.
|
|
37
|
+
* Pass URLs from the result through the `safeUrl` helper before placing them in an `href` or `src`.
|
|
38
|
+
* Never place result values in event handler attributes such as `onclick`, or in `style`.
|
|
39
|
+
*/
|
|
40
|
+
template;
|
|
41
|
+
/**
|
|
42
|
+
* A callback function responsible for rendering the message shown when a search returns no results.
|
|
43
|
+
* When it is not provided, the popover shows `No results found for "<search term>".`
|
|
44
|
+
* The returned markup is sanitized with DOMPurify, which removes scripts, event handler
|
|
45
|
+
* attributes such as `onclick`, and links with schemes it does not allow, such as an app's own scheme.
|
|
46
|
+
*/
|
|
47
|
+
noResultsTemplate;
|
|
33
48
|
/**
|
|
34
49
|
* The hotkey that activates the popover.
|
|
35
50
|
*/
|
|
@@ -77,6 +92,11 @@ const SearchcraftPopoverForm$1 = /*@__PURE__*/ proxyCustomElement(class Searchcr
|
|
|
77
92
|
searchClientResponseItems = [];
|
|
78
93
|
adClientResponseItems = [];
|
|
79
94
|
searchTerm;
|
|
95
|
+
isSearchInProgress = false;
|
|
96
|
+
/**
|
|
97
|
+
* The search term of the most recent search response.
|
|
98
|
+
*/
|
|
99
|
+
completedSearchTerm;
|
|
80
100
|
isFocused = false;
|
|
81
101
|
breakpointSm = 576;
|
|
82
102
|
breakpointMd = 768;
|
|
@@ -108,6 +128,12 @@ const SearchcraftPopoverForm$1 = /*@__PURE__*/ proxyCustomElement(class Searchcr
|
|
|
108
128
|
this.searchClientResponseItems = [...state.searchClientResponseItems];
|
|
109
129
|
this.adClientResponseItems = [...state.adClientResponseItems];
|
|
110
130
|
this.searchTerm = state.searchTerm;
|
|
131
|
+
this.isSearchInProgress = state.isSearchInProgress;
|
|
132
|
+
const requestProperties = state.searchClientRequestProperties;
|
|
133
|
+
this.completedSearchTerm =
|
|
134
|
+
requestProperties && typeof requestProperties === 'object'
|
|
135
|
+
? requestProperties.searchTerm
|
|
136
|
+
: undefined;
|
|
111
137
|
this.searchResultsPage = state.searchResultsPage;
|
|
112
138
|
this.searchResultsPerPage = state.searchResultsPerPage;
|
|
113
139
|
});
|
|
@@ -189,6 +215,8 @@ const SearchcraftPopoverForm$1 = /*@__PURE__*/ proxyCustomElement(class Searchcr
|
|
|
189
215
|
if (!this.modalElement) {
|
|
190
216
|
this.modalElement = document.createElement('searchcraft-popover-form');
|
|
191
217
|
this.modalElement.popoverResultMappings = this.popoverResultMappings;
|
|
218
|
+
this.modalElement.template = this.template;
|
|
219
|
+
this.modalElement.noResultsTemplate = this.noResultsTemplate;
|
|
192
220
|
this.modalElement.setAttribute('type', 'fullscreen');
|
|
193
221
|
this.modalElement.setAttribute('searchcraft-id', this.searchcraftId);
|
|
194
222
|
if (this.placeholderValue) {
|
|
@@ -207,6 +235,17 @@ const SearchcraftPopoverForm$1 = /*@__PURE__*/ proxyCustomElement(class Searchcr
|
|
|
207
235
|
}
|
|
208
236
|
}
|
|
209
237
|
}
|
|
238
|
+
/**
|
|
239
|
+
* Passes result rendering changes on to the fullscreen form created for small viewports,
|
|
240
|
+
* which only receives these props when it is first created.
|
|
241
|
+
*/
|
|
242
|
+
syncModalElementResultRendering() {
|
|
243
|
+
if (this.modalElement) {
|
|
244
|
+
this.modalElement.popoverResultMappings = this.popoverResultMappings;
|
|
245
|
+
this.modalElement.template = this.template;
|
|
246
|
+
this.modalElement.noResultsTemplate = this.noResultsTemplate;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
210
249
|
handleModalBackdropClick(_event) {
|
|
211
250
|
this.core?.store.getState().setPopoverVisibility(false);
|
|
212
251
|
}
|
|
@@ -240,8 +279,17 @@ const SearchcraftPopoverForm$1 = /*@__PURE__*/ proxyCustomElement(class Searchcr
|
|
|
240
279
|
* @param direction
|
|
241
280
|
*/
|
|
242
281
|
focusOnNextListItem(direction) {
|
|
243
|
-
|
|
244
|
-
const
|
|
282
|
+
// Results rendered by a `template` are reached through the first link in the template.
|
|
283
|
+
const links = Array.from(document.querySelectorAll('.searchcraft-popover-list-item-link, .searchcraft-popover-list-item-template')).map((el) => el.classList.contains('searchcraft-popover-list-item-template')
|
|
284
|
+
? el.querySelector('a')
|
|
285
|
+
: el);
|
|
286
|
+
const listItems = Array.from(new Set(links)).filter((el) => !!el && !el.hasAttribute('disabled') && el.offsetParent !== null);
|
|
287
|
+
// Focus may be on another link inside a templated result, so match on the result too.
|
|
288
|
+
const activeElement = document.activeElement;
|
|
289
|
+
const currentIndex = listItems.findIndex((el) => el === activeElement ||
|
|
290
|
+
!!el
|
|
291
|
+
.closest('.searchcraft-popover-list-item-template')
|
|
292
|
+
?.contains(activeElement));
|
|
245
293
|
if (direction === 'ArrowDown') {
|
|
246
294
|
listItems[(currentIndex + 1) % listItems.length]?.focus();
|
|
247
295
|
}
|
|
@@ -266,6 +314,28 @@ const SearchcraftPopoverForm$1 = /*@__PURE__*/ proxyCustomElement(class Searchcr
|
|
|
266
314
|
this.searchTerm?.trim()?.length > 0 &&
|
|
267
315
|
this.searchClientResponseItems.length > 0);
|
|
268
316
|
}
|
|
317
|
+
/**
|
|
318
|
+
* Whether the search for the current search term finished without results.
|
|
319
|
+
*/
|
|
320
|
+
get hasNoResultsToShow() {
|
|
321
|
+
const searchTerm = this.searchTerm?.trim();
|
|
322
|
+
return (!!searchTerm &&
|
|
323
|
+
!this.isSearchInProgress &&
|
|
324
|
+
this.searchClientResponseItems.length === 0 &&
|
|
325
|
+
this.completedSearchTerm?.trim() === searchTerm);
|
|
326
|
+
}
|
|
327
|
+
renderNoResults() {
|
|
328
|
+
const searchTerm = this.searchTerm?.trim() || '';
|
|
329
|
+
if (this.noResultsTemplate) {
|
|
330
|
+
try {
|
|
331
|
+
return (h("div", { class: 'searchcraft-popover-form-no-results', innerHTML: purify.sanitize(this.noResultsTemplate({ searchTerm }, { html, safeUrl })) }));
|
|
332
|
+
}
|
|
333
|
+
catch (error) {
|
|
334
|
+
console.error('Invalid popover no results template:', error);
|
|
335
|
+
}
|
|
336
|
+
}
|
|
337
|
+
return (h("div", { class: 'searchcraft-popover-form-no-results' }, h("p", { class: 'searchcraft-popover-form-no-results-message' }, "No results found for \"", searchTerm, "\".")));
|
|
338
|
+
}
|
|
269
339
|
get viewAllResultsHref() {
|
|
270
340
|
const baseUrl = this.viewAllResultsBaseUrl;
|
|
271
341
|
if (!baseUrl) {
|
|
@@ -291,22 +361,24 @@ const SearchcraftPopoverForm$1 = /*@__PURE__*/ proxyCustomElement(class Searchcr
|
|
|
291
361
|
}
|
|
292
362
|
renderInlinePopover() {
|
|
293
363
|
const isListViewVisible = this.hasResultsToShow && this.isFocused;
|
|
364
|
+
const isNoResultsVisible = this.hasNoResultsToShow && this.isFocused;
|
|
365
|
+
const isDropdownVisible = isListViewVisible || isNoResultsVisible;
|
|
294
366
|
return (h("div", { class: classNames('searchcraft-popover-form searchcraft-popover-form-inline', {
|
|
295
|
-
'searchcraft-popover-form-active':
|
|
296
|
-
}) }, h("div", { class: 'searchcraft-popover-form-input searchcraft-popover-form-inline-input' }, h("searchcraft-input-form", { onInputFocus: this.handleInputFocus.bind(this), searchcraftId: this.searchcraftId, placeholderValue: this.placeholderValue, placeholderBehavior: this.placeholderBehavior })),
|
|
367
|
+
'searchcraft-popover-form-active': isDropdownVisible,
|
|
368
|
+
}) }, h("div", { class: 'searchcraft-popover-form-input searchcraft-popover-form-inline-input' }, h("searchcraft-input-form", { onInputFocus: this.handleInputFocus.bind(this), searchcraftId: this.searchcraftId, placeholderValue: this.placeholderValue, placeholderBehavior: this.placeholderBehavior })), isDropdownVisible && (h("div", { class: 'searchcraft-popover-form-inline-wrapper' }, h("div", { class: 'searchcraft-popover-form-inline-scroll-area' }, isListViewVisible && this.showSummaryBox && (h("searchcraft-results-summary", { searchcraftId: this.searchcraftId })), isListViewVisible ? (h("searchcraft-popover-list-view", { popoverResultMappings: this.popoverResultMappings, template: this.template, searchClientResponseItems: this.searchClientResponseItems, adClientResponseItems: this.adClientResponseItems, searchResultsPage: this.searchResultsPage, searchResultsPerPage: this.searchResultsPerPage, searchcraftId: this.searchcraftId })) : (this.renderNoResults())), h("searchcraft-popover-footer", { searchcraftId: this.searchcraftId, sdkVariant: this.sdkVariant, viewAllResultsHref: this.viewAllResultsHref, viewAllResultsLabel: this.resolvedViewAllResultsLabel })))));
|
|
297
369
|
}
|
|
298
370
|
renderModalPopover() {
|
|
299
371
|
if (this.isPopoverVisibleInState) {
|
|
300
372
|
return (h("div", { class: classNames('searchcraft-popover-form searchcraft-popover-form-modal', {
|
|
301
|
-
'searchcraft-popover-form-active': this.hasResultsToShow,
|
|
302
|
-
}) }, h("div", { class: 'searchcraft-popover-form-modal-backdrop', onClick: this.handleModalBackdropClick }), h("div", { class: 'searchcraft-popover-form-modal-wrapper' }, h("div", { class: 'searchcraft-popover-form-input searchcraft-popover-form-modal-input' }, h("searchcraft-input-form", { onInputFocus: this.handleInputFocus.bind(this), onInputInit: this.handleInputInit.bind(this), searchcraftId: this.searchcraftId, placeholderValue: this.placeholderValue, placeholderBehavior: this.placeholderBehavior }), h("button", { type: 'button', class: 'searchcraft-popover-form-cancel-button searchcraft-popover-form-modal-cancel-button', onClick: this.handleCancelButtonClick.bind(this) }, "Cancel")), h("div", { class: 'searchcraft-popover-form-modal-popover-list-view' }, this.showSummaryBox && this.hasResultsToShow && (h("searchcraft-results-summary", { searchcraftId: this.searchcraftId })), this.hasResultsToShow && (h("searchcraft-popover-list-view", { popoverResultMappings: this.popoverResultMappings, searchClientResponseItems: this.searchClientResponseItems, adClientResponseItems: this.adClientResponseItems, searchResultsPage: this.searchResultsPage, searchResultsPerPage: this.searchResultsPerPage, searchcraftId: this.searchcraftId }))), h("searchcraft-popover-footer", { searchcraftId: this.searchcraftId, sdkVariant: this.sdkVariant, viewAllResultsHref: this.viewAllResultsHref, viewAllResultsLabel: this.resolvedViewAllResultsLabel }))));
|
|
373
|
+
'searchcraft-popover-form-active': this.hasResultsToShow || this.hasNoResultsToShow,
|
|
374
|
+
}) }, h("div", { class: 'searchcraft-popover-form-modal-backdrop', onClick: this.handleModalBackdropClick }), h("div", { class: 'searchcraft-popover-form-modal-wrapper' }, h("div", { class: 'searchcraft-popover-form-input searchcraft-popover-form-modal-input' }, h("searchcraft-input-form", { onInputFocus: this.handleInputFocus.bind(this), onInputInit: this.handleInputInit.bind(this), searchcraftId: this.searchcraftId, placeholderValue: this.placeholderValue, placeholderBehavior: this.placeholderBehavior }), h("button", { type: 'button', class: 'searchcraft-popover-form-cancel-button searchcraft-popover-form-modal-cancel-button', onClick: this.handleCancelButtonClick.bind(this) }, "Cancel")), h("div", { class: 'searchcraft-popover-form-modal-popover-list-view' }, this.showSummaryBox && this.hasResultsToShow && (h("searchcraft-results-summary", { searchcraftId: this.searchcraftId })), this.hasResultsToShow && (h("searchcraft-popover-list-view", { popoverResultMappings: this.popoverResultMappings, template: this.template, searchClientResponseItems: this.searchClientResponseItems, adClientResponseItems: this.adClientResponseItems, searchResultsPage: this.searchResultsPage, searchResultsPerPage: this.searchResultsPerPage, searchcraftId: this.searchcraftId })), this.hasNoResultsToShow && this.renderNoResults()), h("searchcraft-popover-footer", { searchcraftId: this.searchcraftId, sdkVariant: this.sdkVariant, viewAllResultsHref: this.viewAllResultsHref, viewAllResultsLabel: this.resolvedViewAllResultsLabel }))));
|
|
303
375
|
}
|
|
304
376
|
}
|
|
305
377
|
renderFullscreenPopover() {
|
|
306
378
|
if (this.isPopoverVisibleInState) {
|
|
307
379
|
return (h("div", { class: classNames('searchcraft-popover-form searchcraft-popover-form-fullscreen', {
|
|
308
|
-
'searchcraft-popover-form-active': this.hasResultsToShow,
|
|
309
|
-
}) }, h("div", { class: 'searchcraft-popover-form-input searchcraft-popover-form-fullscreen-input' }, h("searchcraft-input-form", { onInputFocus: this.handleInputFocus.bind(this), onInputInit: this.handleInputInit.bind(this), searchcraftId: this.searchcraftId, placeholderValue: this.placeholderValue, placeholderBehavior: this.placeholderBehavior }), h("button", { type: 'button', class: 'searchcraft-popover-form-cancel-button searchcraft-popover-form-fullscreen-cancel-button', onClick: this.handleCancelButtonClick.bind(this) }, "Cancel")), h("div", { class: 'searchcraft-popover-form-fullscreen-popover-list-view' }, this.showSummaryBox && this.hasResultsToShow && (h("searchcraft-results-summary", { searchcraftId: this.searchcraftId })), this.hasResultsToShow && (h("searchcraft-popover-list-view", { popoverResultMappings: this.popoverResultMappings, searchClientResponseItems: this.searchClientResponseItems, adClientResponseItems: this.adClientResponseItems, searchResultsPage: this.searchResultsPage, searchResultsPerPage: this.searchResultsPerPage, searchcraftId: this.searchcraftId }))), h("searchcraft-popover-footer", { searchcraftId: this.searchcraftId, sdkVariant: this.sdkVariant, viewAllResultsHref: this.viewAllResultsHref, viewAllResultsLabel: this.resolvedViewAllResultsLabel })));
|
|
380
|
+
'searchcraft-popover-form-active': this.hasResultsToShow || this.hasNoResultsToShow,
|
|
381
|
+
}) }, h("div", { class: 'searchcraft-popover-form-input searchcraft-popover-form-fullscreen-input' }, h("searchcraft-input-form", { onInputFocus: this.handleInputFocus.bind(this), onInputInit: this.handleInputInit.bind(this), searchcraftId: this.searchcraftId, placeholderValue: this.placeholderValue, placeholderBehavior: this.placeholderBehavior }), h("button", { type: 'button', class: 'searchcraft-popover-form-cancel-button searchcraft-popover-form-fullscreen-cancel-button', onClick: this.handleCancelButtonClick.bind(this) }, "Cancel")), h("div", { class: 'searchcraft-popover-form-fullscreen-popover-list-view' }, this.showSummaryBox && this.hasResultsToShow && (h("searchcraft-results-summary", { searchcraftId: this.searchcraftId })), this.hasResultsToShow && (h("searchcraft-popover-list-view", { popoverResultMappings: this.popoverResultMappings, template: this.template, searchClientResponseItems: this.searchClientResponseItems, adClientResponseItems: this.adClientResponseItems, searchResultsPage: this.searchResultsPage, searchResultsPerPage: this.searchResultsPerPage, searchcraftId: this.searchcraftId })), this.hasNoResultsToShow && this.renderNoResults()), h("searchcraft-popover-footer", { searchcraftId: this.searchcraftId, sdkVariant: this.sdkVariant, viewAllResultsHref: this.viewAllResultsHref, viewAllResultsLabel: this.resolvedViewAllResultsLabel })));
|
|
310
382
|
}
|
|
311
383
|
}
|
|
312
384
|
render() {
|
|
@@ -319,9 +391,16 @@ const SearchcraftPopoverForm$1 = /*@__PURE__*/ proxyCustomElement(class Searchcr
|
|
|
319
391
|
return this.renderFullscreenPopover();
|
|
320
392
|
}
|
|
321
393
|
}
|
|
394
|
+
static get watchers() { return {
|
|
395
|
+
"popoverResultMappings": ["syncModalElementResultRendering"],
|
|
396
|
+
"template": ["syncModalElementResultRendering"],
|
|
397
|
+
"noResultsTemplate": ["syncModalElementResultRendering"]
|
|
398
|
+
}; }
|
|
322
399
|
}, [768, "searchcraft-popover-form", {
|
|
323
400
|
"type": [1],
|
|
324
401
|
"popoverResultMappings": [16],
|
|
402
|
+
"template": [16],
|
|
403
|
+
"noResultsTemplate": [16],
|
|
325
404
|
"hotkey": [1],
|
|
326
405
|
"hotkeyModifier": [1, "hotkey-modifier"],
|
|
327
406
|
"searchcraftId": [1, "searchcraft-id"],
|
|
@@ -335,6 +414,8 @@ const SearchcraftPopoverForm$1 = /*@__PURE__*/ proxyCustomElement(class Searchcr
|
|
|
335
414
|
"searchClientResponseItems": [32],
|
|
336
415
|
"adClientResponseItems": [32],
|
|
337
416
|
"searchTerm": [32],
|
|
417
|
+
"isSearchInProgress": [32],
|
|
418
|
+
"completedSearchTerm": [32],
|
|
338
419
|
"isFocused": [32],
|
|
339
420
|
"breakpointSm": [32],
|
|
340
421
|
"breakpointMd": [32],
|
|
@@ -342,6 +423,10 @@ const SearchcraftPopoverForm$1 = /*@__PURE__*/ proxyCustomElement(class Searchcr
|
|
|
342
423
|
"searchResultsPage": [32],
|
|
343
424
|
"searchResultsPerPage": [32],
|
|
344
425
|
"modalElement": [32]
|
|
426
|
+
}, undefined, {
|
|
427
|
+
"popoverResultMappings": ["syncModalElementResultRendering"],
|
|
428
|
+
"template": ["syncModalElementResultRendering"],
|
|
429
|
+
"noResultsTemplate": ["syncModalElementResultRendering"]
|
|
345
430
|
}]);
|
|
346
431
|
function defineCustomElement$1() {
|
|
347
432
|
if (typeof customElements === "undefined") {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"file":"searchcraft-popover-form.js","mappings":"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","names":["SearchcraftPopoverForm","__stencil_proxyCustomElement","HTMLElement"],"sources":["src/components/searchcraft-popover-form/searchcraft-popover-form.tsx"],"sourcesContent":["import type { SearchcraftCore } from '@classes';\nimport { registry } from '@classes/CoreInstanceRegistry';\nimport { Component, Element, Prop, State, h } from '@stencil/core';\nimport type {\n AdClientResponseItem,\n PopoverResultMappings,\n SearchClientResponseItem,\n} from '@types';\nimport classNames from 'classnames';\n\n/**\n * This web component is designed to display search results in a popover container that dynamically appears when the user interacts with a search input field, or when a popover-button is pressed.\n *\n * @react-import\n * ```jsx\n * import { SearchcraftPopoverForm } from \"@searchcraft/react-sdk\";\n * ```\n *\n * @vue-import\n * ```jsx\n * import { SearchcraftPopoverForm } from \"@searchcraft/vue-sdk\";\n * ```\n *\n * @js-example\n * ```html\n * <!-- index.html -->\n * <searchcraft-popover-form type=\"inline\" />\n * ```\n *\n * ```js\n * // index.js\n * const popoverForm = document.querySelector('searchcraft-popover-form');\n *\n * popoverForm.popoverResultMappings = {};\n * ```\n *\n * @react-example\n * ```jsx\n * <SearchcraftPopoverForm type=\"inline\" popoverResultMappings={[]} />\n * ```\n *\n * @vue-example\n * ```jsx\n * <SearchcraftPopoverForm type=\"inline\" :popoverResultMappings=\"[]\"\" />\n * ```\n *\n */\n@Component({\n tag: 'searchcraft-popover-form',\n shadow: false,\n})\nexport class SearchcraftPopoverForm {\n /**\n * The type of popover form to render.\n * - `inline` - Renders inline with the rest of the content on the page. The search results pop over the page content.\n * - `fullscreen` - Renders in fullscreen view. Used together with the `searchcraft-popover-button` component.\n * - `modal` - Renders in a modal view. Used together with the `searchcraft-popover-button` component.\n */\n @Prop() type?: 'inline' | 'fullscreen' | 'modal' = 'inline';\n /**\n * Formats the content rendered for each result.\n */\n @Prop() popoverResultMappings?: PopoverResultMappings;\n /**\n * The hotkey that activates the popover.\n */\n @Prop() hotkey?: string = 'k';\n /**\n * The hotkey modifier that activates the popover. Used together with the `hotkey` prop.\n */\n @Prop() hotkeyModifier?: 'ctrl' | 'meta' | 'alt' | 'option' = 'meta';\n /**\n * The id of the Searchcraft instance that this component should use.\n */\n @Prop() searchcraftId?: string;\n /**\n * The input element's placeholder value.\n */\n @Prop() placeholderValue?: string = 'Enter Search';\n /**\n * The placeholder's render behavior.\n * 'hide-on-focus' - Hide the placeholder text immediately when the input form gains focus.\n * 'hide-on-text-entered' - Only hide the placeholder when the input form has text entered into it.\n */\n @Prop() placeholderBehavior?: 'hide-on-focus' | 'hide-on-text-entered';\n /**\n * Base URL for the \"View all\" footer link. The current search term will be appended (URL encoded).\n *\n * For example, in a CMS-backed site you might set this to `/?s=` so the final URL becomes `/?s=<search-term>`.\n */\n @Prop() viewAllResultsBaseUrl?: string;\n /**\n * Optional label for the \"View All\" footer button. Defaults to \"View All\".\n */\n @Prop() viewAllResultsLabel?: string;\n /**\n * Whether to display the AI generative summary box before the search results.\n * NOTE: This requires the usage of a read key that has \"SUMMARY\" permissions and either a subscription to Searchcraft Cloud with AI features enabled or a self-hosted model connected.\n */\n @Prop() showSummaryBox?: boolean = false;\n /**\n * The SDK variant used to render this component. Used for UTM attribution on the footer link.\n *\n * @internal\n */\n @Prop() sdkVariant?: 'js' | 'react' | 'vue' = 'js';\n\n @State() isPopoverVisibleInState = false;\n @State() searchClientResponseItems: SearchClientResponseItem[] = [];\n @State() adClientResponseItems: AdClientResponseItem[] = [];\n @State() searchTerm: string | undefined;\n @State() isFocused = false;\n @State() breakpointSm = 576;\n @State() breakpointMd = 768;\n @State() breakpointLg = 992;\n @State() searchResultsPage;\n @State() searchResultsPerPage;\n\n @State() modalElement;\n\n @Element() hostElement!: HTMLElement;\n\n private unsubscribe: (() => void) | undefined;\n private cleanupCore?: () => void;\n core?: SearchcraftCore;\n\n onCoreAvailable(core: SearchcraftCore) {\n this.core = core;\n // Loads the breakpoint values into state\n const computedStyle = getComputedStyle(document.documentElement);\n this.breakpointSm = Number.parseFloat(\n computedStyle.getPropertyValue('--sc-breakpoint-sm').trim(),\n );\n this.breakpointMd = Number.parseFloat(\n computedStyle.getPropertyValue('--sc-breakpoint-md').trim(),\n );\n this.breakpointLg = Number.parseFloat(\n computedStyle.getPropertyValue('--sc-breakpoint-lg').trim(),\n );\n // Set popover visiblity in state\n this.isPopoverVisibleInState = core.store.getState().isPopoverVisible;\n\n // Add event listeners\n document.addEventListener('click', this.handleDocumentClick);\n document.addEventListener('keydown', this.handleDocumentKeyDown);\n\n // Subscribe to state events\n this.unsubscribe = core.store.subscribe((state) => {\n if (this.isPopoverVisibleInState !== state.isPopoverVisible) {\n this.handlePopoverVisibilityChange(state.isPopoverVisible);\n }\n\n this.searchClientResponseItems = [...state.searchClientResponseItems];\n this.adClientResponseItems = [...state.adClientResponseItems];\n this.searchTerm = state.searchTerm;\n this.searchResultsPage = state.searchResultsPage;\n this.searchResultsPerPage = state.searchResultsPerPage;\n });\n\n // Set hotkey and hotkeyModifier in state.\n core.store\n .getState()\n .setHotKeyAndHotKeyModifier(this.hotkey, this.hotkeyModifier);\n }\n\n connectedCallback() {\n this.cleanupCore = registry.useCoreInstance(\n this.searchcraftId,\n this.onCoreAvailable.bind(this),\n );\n }\n\n disconnectedCallback() {\n this.unsubscribe?.();\n this.cleanupCore?.();\n document.removeEventListener('click', this.handleDocumentClick);\n document.removeEventListener('keydown', this.handleDocumentKeyDown);\n }\n\n handleDocumentClick = (event: MouseEvent) => {\n if (!this.hostElement.contains(event.target as Node)) {\n this.isFocused = false;\n }\n };\n\n /**\n * Handles when popover visibility is changed in state\n */\n handlePopoverVisibilityChange(isVisible: boolean) {\n this.isPopoverVisibleInState = isVisible;\n document.body.style.overflow = isVisible ? 'hidden' : 'auto';\n }\n\n /**\n * Actions to perform when various keys are pressed within the popover form.\n */\n handleDocumentKeyDown = (event: KeyboardEvent) => {\n // Document-scoped actions\n if (event.key === this.hotkey) {\n this.handleHotkeyPressed(event);\n }\n\n // Document-scoped -> Popover-scoped keyboard event boundary\n if (!this.hostElement.contains(document.activeElement)) {\n return;\n }\n\n // Popover-scoped actions\n switch (event.key) {\n case 'ArrowDown':\n case 'ArrowUp':\n event.preventDefault();\n this.focusOnNextListItem(event.key);\n break;\n case 'Escape':\n this.core?.store.getState().setPopoverVisibility(false);\n break;\n case 'Enter':\n if (\n (event.metaKey || event.ctrlKey) &&\n this.viewAllResultsHref &&\n this.hasResultsToShow\n ) {\n event.preventDefault();\n this.navigateToViewAllResults();\n }\n break;\n default:\n return;\n }\n };\n\n handleInputInit = () => {\n const input = this.hostElement.querySelector(\n '.searchcraft-input-form-input',\n ) as HTMLInputElement | undefined;\n input?.focus();\n };\n\n /**\n * When popover is `inline` and the viewport is at the smallest breakpoint,\n * focusing on the input will open a modal version of the popover form.\n */\n handleInputFocus() {\n this.isFocused = true;\n\n if (\n this.type === 'inline' &&\n window.visualViewport &&\n window.visualViewport.width < this.breakpointSm\n ) {\n this.core?.store.getState().setPopoverVisibility(true);\n\n // Appends a popover form of type=`modal` to the body\n if (!this.modalElement) {\n this.modalElement = document.createElement('searchcraft-popover-form');\n this.modalElement.popoverResultMappings = this.popoverResultMappings;\n this.modalElement.setAttribute('type', 'fullscreen');\n this.modalElement.setAttribute('searchcraft-id', this.searchcraftId);\n if (this.placeholderValue) {\n this.modalElement.setAttribute(\n 'placeholder-value',\n this.placeholderValue,\n );\n }\n if (this.placeholderBehavior) {\n this.modalElement.setAttribute(\n 'placeholder-behavior',\n this.placeholderBehavior,\n );\n }\n if (this.viewAllResultsBaseUrl) {\n this.modalElement.setAttribute(\n 'view-all-results-base-url',\n this.viewAllResultsBaseUrl,\n );\n }\n if (this.viewAllResultsLabel) {\n this.modalElement.setAttribute(\n 'view-all-results-label',\n this.viewAllResultsLabel,\n );\n }\n document.body.appendChild(this.modalElement);\n }\n }\n }\n\n handleModalBackdropClick(_event: MouseEvent) {\n this.core?.store.getState().setPopoverVisibility(false);\n }\n\n /**\n * When a hotkey is pressed, tests if the modifiers also match.\n * If modifiers match, toggles visibility of the popover modal.\n */\n handleHotkeyPressed(event: KeyboardEvent) {\n if (\n (event.ctrlKey && this.hotkeyModifier === 'ctrl') ||\n (event.altKey && this.hotkeyModifier === 'alt') ||\n (event.metaKey && this.hotkeyModifier === 'meta')\n ) {\n event.preventDefault();\n if (this.type === 'inline' && !this.isPopoverVisibleInState) {\n const hostElementInput = this.hostElement.querySelector(\n '.searchcraft-input-form-input',\n ) as HTMLInputElement | undefined;\n hostElementInput?.focus();\n } else {\n this.core?.store\n .getState()\n .setPopoverVisibility(!this.isPopoverVisibleInState);\n }\n }\n }\n\n handleCancelButtonClick() {\n this.core?.store.getState().setPopoverVisibility(false);\n }\n\n /**\n * Moves focus to the next/previous list item in the list view. If you are at the top\n * of the list view, it moves focus back to the input.\n *\n * @param direction\n */\n focusOnNextListItem(direction: 'ArrowDown' | 'ArrowUp') {\n const listItems = Array.from(\n document.querySelectorAll<HTMLAnchorElement>(\n '.searchcraft-popover-list-item-link',\n ),\n ).filter((el) => !el.hasAttribute('disabled') && el.offsetParent !== null);\n\n const currentIndex = listItems.indexOf(\n document.activeElement as HTMLAnchorElement,\n );\n\n if (direction === 'ArrowDown') {\n listItems[(currentIndex + 1) % listItems.length]?.focus();\n } else if (direction === 'ArrowUp') {\n if (currentIndex >= 1) {\n listItems[currentIndex - 1]?.focus();\n } else {\n const input = document.querySelector('.searchcraft-input-form-input') as\n | HTMLInputElement\n | undefined;\n\n if (input) {\n input.focus();\n requestAnimationFrame(() => {\n input.selectionEnd = input.value.length;\n input.selectionStart = input.value.length;\n });\n }\n }\n }\n }\n\n get hasResultsToShow() {\n return (\n this.searchTerm &&\n this.searchTerm?.trim()?.length > 0 &&\n this.searchClientResponseItems.length > 0\n );\n }\n\n get viewAllResultsHref() {\n const baseUrl = this.viewAllResultsBaseUrl;\n if (!baseUrl) {\n return undefined;\n }\n\n const term = this.searchTerm?.trim();\n if (!term) {\n return baseUrl;\n }\n\n return `${baseUrl}${encodeURIComponent(term).replace(/%20/g, '+')}`;\n }\n\n get resolvedViewAllResultsLabel() {\n return this.viewAllResultsLabel ?? 'View All';\n }\n\n navigateToViewAllResults() {\n const href = this.viewAllResultsHref;\n\n if (!href || !this.hasResultsToShow) {\n return;\n }\n\n if (typeof window !== 'undefined') {\n window.location.href = href;\n }\n }\n\n renderInlinePopover() {\n const isListViewVisible = this.hasResultsToShow && this.isFocused;\n\n return (\n <div\n class={classNames(\n 'searchcraft-popover-form searchcraft-popover-form-inline',\n {\n 'searchcraft-popover-form-active': isListViewVisible,\n },\n )}\n >\n <div class='searchcraft-popover-form-input searchcraft-popover-form-inline-input'>\n <searchcraft-input-form\n onInputFocus={this.handleInputFocus.bind(this)}\n searchcraftId={this.searchcraftId}\n placeholderValue={this.placeholderValue}\n placeholderBehavior={this.placeholderBehavior}\n />\n </div>\n {isListViewVisible && (\n <div class='searchcraft-popover-form-inline-wrapper'>\n {this.showSummaryBox && (\n <searchcraft-results-summary searchcraftId={this.searchcraftId} />\n )}\n <searchcraft-popover-list-view\n popoverResultMappings={this.popoverResultMappings}\n searchClientResponseItems={this.searchClientResponseItems}\n adClientResponseItems={this.adClientResponseItems}\n searchResultsPage={this.searchResultsPage}\n searchResultsPerPage={this.searchResultsPerPage}\n searchcraftId={this.searchcraftId}\n />\n <searchcraft-popover-footer\n searchcraftId={this.searchcraftId}\n sdkVariant={this.sdkVariant}\n viewAllResultsHref={this.viewAllResultsHref}\n viewAllResultsLabel={this.resolvedViewAllResultsLabel}\n />\n </div>\n )}\n </div>\n );\n }\n\n renderModalPopover() {\n if (this.isPopoverVisibleInState) {\n return (\n <div\n class={classNames(\n 'searchcraft-popover-form searchcraft-popover-form-modal',\n {\n 'searchcraft-popover-form-active': this.hasResultsToShow,\n },\n )}\n >\n {/* biome-ignore lint/a11y/useKeyWithClickEvents: <explanation> */}\n <div\n class='searchcraft-popover-form-modal-backdrop'\n onClick={this.handleModalBackdropClick}\n />\n <div class='searchcraft-popover-form-modal-wrapper'>\n <div class='searchcraft-popover-form-input searchcraft-popover-form-modal-input'>\n <searchcraft-input-form\n onInputFocus={this.handleInputFocus.bind(this)}\n onInputInit={this.handleInputInit.bind(this)}\n searchcraftId={this.searchcraftId}\n placeholderValue={this.placeholderValue}\n placeholderBehavior={this.placeholderBehavior}\n />\n <button\n type='button'\n class='searchcraft-popover-form-cancel-button searchcraft-popover-form-modal-cancel-button'\n onClick={this.handleCancelButtonClick.bind(this)}\n >\n Cancel\n </button>\n </div>\n <div class='searchcraft-popover-form-modal-popover-list-view'>\n {this.showSummaryBox && this.hasResultsToShow && (\n <searchcraft-results-summary\n searchcraftId={this.searchcraftId}\n />\n )}\n {this.hasResultsToShow && (\n <searchcraft-popover-list-view\n popoverResultMappings={this.popoverResultMappings}\n searchClientResponseItems={this.searchClientResponseItems}\n adClientResponseItems={this.adClientResponseItems}\n searchResultsPage={this.searchResultsPage}\n searchResultsPerPage={this.searchResultsPerPage}\n searchcraftId={this.searchcraftId}\n />\n )}\n </div>\n <searchcraft-popover-footer\n searchcraftId={this.searchcraftId}\n sdkVariant={this.sdkVariant}\n viewAllResultsHref={this.viewAllResultsHref}\n viewAllResultsLabel={this.resolvedViewAllResultsLabel}\n />\n </div>\n </div>\n );\n }\n }\n\n renderFullscreenPopover() {\n if (this.isPopoverVisibleInState) {\n return (\n <div\n class={classNames(\n 'searchcraft-popover-form searchcraft-popover-form-fullscreen',\n {\n 'searchcraft-popover-form-active': this.hasResultsToShow,\n },\n )}\n >\n <div class='searchcraft-popover-form-input searchcraft-popover-form-fullscreen-input'>\n <searchcraft-input-form\n onInputFocus={this.handleInputFocus.bind(this)}\n onInputInit={this.handleInputInit.bind(this)}\n searchcraftId={this.searchcraftId}\n placeholderValue={this.placeholderValue}\n placeholderBehavior={this.placeholderBehavior}\n />\n <button\n type='button'\n class='searchcraft-popover-form-cancel-button searchcraft-popover-form-fullscreen-cancel-button'\n onClick={this.handleCancelButtonClick.bind(this)}\n >\n Cancel\n </button>\n </div>\n <div class='searchcraft-popover-form-fullscreen-popover-list-view'>\n {this.showSummaryBox && this.hasResultsToShow && (\n <searchcraft-results-summary searchcraftId={this.searchcraftId} />\n )}\n {this.hasResultsToShow && (\n <searchcraft-popover-list-view\n popoverResultMappings={this.popoverResultMappings}\n searchClientResponseItems={this.searchClientResponseItems}\n adClientResponseItems={this.adClientResponseItems}\n searchResultsPage={this.searchResultsPage}\n searchResultsPerPage={this.searchResultsPerPage}\n searchcraftId={this.searchcraftId}\n />\n )}\n </div>\n <searchcraft-popover-footer\n searchcraftId={this.searchcraftId}\n sdkVariant={this.sdkVariant}\n viewAllResultsHref={this.viewAllResultsHref}\n viewAllResultsLabel={this.resolvedViewAllResultsLabel}\n />\n </div>\n );\n }\n }\n\n render() {\n switch (this.type) {\n case 'inline':\n return this.renderInlinePopover();\n case 'modal':\n return this.renderModalPopover();\n case 'fullscreen':\n return this.renderFullscreenPopover();\n }\n }\n}\n"],"version":3}
|
|
1
|
+
{"file":"searchcraft-popover-form.js","mappings":"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","names":["SearchcraftPopoverForm","__stencil_proxyCustomElement","HTMLElement","DOMPurify"],"sources":["src/components/searchcraft-popover-form/searchcraft-popover-form.tsx"],"sourcesContent":["import type { SearchcraftCore } from '@classes';\nimport { registry } from '@classes/CoreInstanceRegistry';\nimport { Component, Element, Prop, State, Watch, h } from '@stencil/core';\nimport type {\n AdClientResponseItem,\n PopoverNoResultsTemplate,\n PopoverResultMappings,\n SearchClientResponseItem,\n SearchResultTemplate,\n SearchResultTemplateData,\n} from '@types';\nimport { html, safeUrl } from '@utils';\nimport classNames from 'classnames';\nimport DOMPurify from 'dompurify';\n\n/**\n * This web component is designed to display search results in a popover container that dynamically appears when the user interacts with a search input field, or when a popover-button is pressed.\n *\n * @react-import\n * ```jsx\n * import { SearchcraftPopoverForm } from \"@searchcraft/react-sdk\";\n * ```\n *\n * @vue-import\n * ```jsx\n * import { SearchcraftPopoverForm } from \"@searchcraft/vue-sdk\";\n * ```\n *\n * @js-example\n * ```html\n * <!-- index.html -->\n * <searchcraft-popover-form type=\"inline\" />\n * ```\n *\n * ```js\n * // index.js\n * const popoverForm = document.querySelector('searchcraft-popover-form');\n *\n * popoverForm.popoverResultMappings = {};\n *\n * // Or render each result with a template instead of `popoverResultMappings`.\n * popoverForm.template = (item, index, { html, safeUrl }) => html`\n * <a href=\"${safeUrl(item.url)}\">${item.title}</a>\n * `;\n *\n * // Change the message shown when a search returns no results.\n * popoverForm.noResultsTemplate = ({ searchTerm }, { html }) => html`\n * <p>Nothing matched \"${searchTerm}\".</p>\n * `;\n * ```\n *\n * @react-example\n * ```jsx\n * <SearchcraftPopoverForm type=\"inline\" popoverResultMappings={[]} />\n * ```\n *\n * @vue-example\n * ```jsx\n * <SearchcraftPopoverForm type=\"inline\" :popoverResultMappings=\"[]\"\" />\n * ```\n *\n */\n@Component({\n tag: 'searchcraft-popover-form',\n shadow: false,\n})\nexport class SearchcraftPopoverForm {\n /**\n * The type of popover form to render.\n * - `inline` - Renders inline with the rest of the content on the page. The search results pop over the page content.\n * - `fullscreen` - Renders in fullscreen view. Used together with the `searchcraft-popover-button` component.\n * - `modal` - Renders in a modal view. Used together with the `searchcraft-popover-button` component.\n */\n @Prop() type?: 'inline' | 'fullscreen' | 'modal' = 'inline';\n /**\n * Formats the content rendered for each result.\n */\n @Prop() popoverResultMappings?: PopoverResultMappings;\n /**\n * A callback function responsible for rendering a result. When provided, it is used instead of `popoverResultMappings`.\n * Pass URLs from the result through the `safeUrl` helper before placing them in an `href` or `src`.\n * Never place result values in event handler attributes such as `onclick`, or in `style`.\n */\n @Prop() template?: SearchResultTemplate<SearchResultTemplateData>;\n /**\n * A callback function responsible for rendering the message shown when a search returns no results.\n * When it is not provided, the popover shows `No results found for \"<search term>\".`\n * The returned markup is sanitized with DOMPurify, which removes scripts, event handler\n * attributes such as `onclick`, and links with schemes it does not allow, such as an app's own scheme.\n */\n @Prop() noResultsTemplate?: PopoverNoResultsTemplate;\n /**\n * The hotkey that activates the popover.\n */\n @Prop() hotkey?: string = 'k';\n /**\n * The hotkey modifier that activates the popover. Used together with the `hotkey` prop.\n */\n @Prop() hotkeyModifier?: 'ctrl' | 'meta' | 'alt' | 'option' = 'meta';\n /**\n * The id of the Searchcraft instance that this component should use.\n */\n @Prop() searchcraftId?: string;\n /**\n * The input element's placeholder value.\n */\n @Prop() placeholderValue?: string = 'Enter Search';\n /**\n * The placeholder's render behavior.\n * 'hide-on-focus' - Hide the placeholder text immediately when the input form gains focus.\n * 'hide-on-text-entered' - Only hide the placeholder when the input form has text entered into it.\n */\n @Prop() placeholderBehavior?: 'hide-on-focus' | 'hide-on-text-entered';\n /**\n * Base URL for the \"View all\" footer link. The current search term will be appended (URL encoded).\n *\n * For example, in a CMS-backed site you might set this to `/?s=` so the final URL becomes `/?s=<search-term>`.\n */\n @Prop() viewAllResultsBaseUrl?: string;\n /**\n * Optional label for the \"View All\" footer button. Defaults to \"View All\".\n */\n @Prop() viewAllResultsLabel?: string;\n /**\n * Whether to display the AI generative summary box before the search results.\n * NOTE: This requires the usage of a read key that has \"SUMMARY\" permissions and either a subscription to Searchcraft Cloud with AI features enabled or a self-hosted model connected.\n */\n @Prop() showSummaryBox?: boolean = false;\n /**\n * The SDK variant used to render this component. Used for UTM attribution on the footer link.\n *\n * @internal\n */\n @Prop() sdkVariant?: 'js' | 'react' | 'vue' = 'js';\n\n @State() isPopoverVisibleInState = false;\n @State() searchClientResponseItems: SearchClientResponseItem[] = [];\n @State() adClientResponseItems: AdClientResponseItem[] = [];\n @State() searchTerm: string | undefined;\n @State() isSearchInProgress = false;\n /**\n * The search term of the most recent search response.\n */\n @State() completedSearchTerm: string | undefined;\n @State() isFocused = false;\n @State() breakpointSm = 576;\n @State() breakpointMd = 768;\n @State() breakpointLg = 992;\n @State() searchResultsPage;\n @State() searchResultsPerPage;\n\n @State() modalElement;\n\n @Element() hostElement!: HTMLElement;\n\n private unsubscribe: (() => void) | undefined;\n private cleanupCore?: () => void;\n core?: SearchcraftCore;\n\n onCoreAvailable(core: SearchcraftCore) {\n this.core = core;\n // Loads the breakpoint values into state\n const computedStyle = getComputedStyle(document.documentElement);\n this.breakpointSm = Number.parseFloat(\n computedStyle.getPropertyValue('--sc-breakpoint-sm').trim(),\n );\n this.breakpointMd = Number.parseFloat(\n computedStyle.getPropertyValue('--sc-breakpoint-md').trim(),\n );\n this.breakpointLg = Number.parseFloat(\n computedStyle.getPropertyValue('--sc-breakpoint-lg').trim(),\n );\n // Set popover visiblity in state\n this.isPopoverVisibleInState = core.store.getState().isPopoverVisible;\n\n // Add event listeners\n document.addEventListener('click', this.handleDocumentClick);\n document.addEventListener('keydown', this.handleDocumentKeyDown);\n\n // Subscribe to state events\n this.unsubscribe = core.store.subscribe((state) => {\n if (this.isPopoverVisibleInState !== state.isPopoverVisible) {\n this.handlePopoverVisibilityChange(state.isPopoverVisible);\n }\n\n this.searchClientResponseItems = [...state.searchClientResponseItems];\n this.adClientResponseItems = [...state.adClientResponseItems];\n this.searchTerm = state.searchTerm;\n this.isSearchInProgress = state.isSearchInProgress;\n const requestProperties = state.searchClientRequestProperties;\n this.completedSearchTerm =\n requestProperties && typeof requestProperties === 'object'\n ? requestProperties.searchTerm\n : undefined;\n this.searchResultsPage = state.searchResultsPage;\n this.searchResultsPerPage = state.searchResultsPerPage;\n });\n\n // Set hotkey and hotkeyModifier in state.\n core.store\n .getState()\n .setHotKeyAndHotKeyModifier(this.hotkey, this.hotkeyModifier);\n }\n\n connectedCallback() {\n this.cleanupCore = registry.useCoreInstance(\n this.searchcraftId,\n this.onCoreAvailable.bind(this),\n );\n }\n\n disconnectedCallback() {\n this.unsubscribe?.();\n this.cleanupCore?.();\n document.removeEventListener('click', this.handleDocumentClick);\n document.removeEventListener('keydown', this.handleDocumentKeyDown);\n }\n\n handleDocumentClick = (event: MouseEvent) => {\n if (!this.hostElement.contains(event.target as Node)) {\n this.isFocused = false;\n }\n };\n\n /**\n * Handles when popover visibility is changed in state\n */\n handlePopoverVisibilityChange(isVisible: boolean) {\n this.isPopoverVisibleInState = isVisible;\n document.body.style.overflow = isVisible ? 'hidden' : 'auto';\n }\n\n /**\n * Actions to perform when various keys are pressed within the popover form.\n */\n handleDocumentKeyDown = (event: KeyboardEvent) => {\n // Document-scoped actions\n if (event.key === this.hotkey) {\n this.handleHotkeyPressed(event);\n }\n\n // Document-scoped -> Popover-scoped keyboard event boundary\n if (!this.hostElement.contains(document.activeElement)) {\n return;\n }\n\n // Popover-scoped actions\n switch (event.key) {\n case 'ArrowDown':\n case 'ArrowUp':\n event.preventDefault();\n this.focusOnNextListItem(event.key);\n break;\n case 'Escape':\n this.core?.store.getState().setPopoverVisibility(false);\n break;\n case 'Enter':\n if (\n (event.metaKey || event.ctrlKey) &&\n this.viewAllResultsHref &&\n this.hasResultsToShow\n ) {\n event.preventDefault();\n this.navigateToViewAllResults();\n }\n break;\n default:\n return;\n }\n };\n\n handleInputInit = () => {\n const input = this.hostElement.querySelector(\n '.searchcraft-input-form-input',\n ) as HTMLInputElement | undefined;\n input?.focus();\n };\n\n /**\n * When popover is `inline` and the viewport is at the smallest breakpoint,\n * focusing on the input will open a modal version of the popover form.\n */\n handleInputFocus() {\n this.isFocused = true;\n\n if (\n this.type === 'inline' &&\n window.visualViewport &&\n window.visualViewport.width < this.breakpointSm\n ) {\n this.core?.store.getState().setPopoverVisibility(true);\n\n // Appends a popover form of type=`modal` to the body\n if (!this.modalElement) {\n this.modalElement = document.createElement('searchcraft-popover-form');\n this.modalElement.popoverResultMappings = this.popoverResultMappings;\n this.modalElement.template = this.template;\n this.modalElement.noResultsTemplate = this.noResultsTemplate;\n this.modalElement.setAttribute('type', 'fullscreen');\n this.modalElement.setAttribute('searchcraft-id', this.searchcraftId);\n if (this.placeholderValue) {\n this.modalElement.setAttribute(\n 'placeholder-value',\n this.placeholderValue,\n );\n }\n if (this.placeholderBehavior) {\n this.modalElement.setAttribute(\n 'placeholder-behavior',\n this.placeholderBehavior,\n );\n }\n if (this.viewAllResultsBaseUrl) {\n this.modalElement.setAttribute(\n 'view-all-results-base-url',\n this.viewAllResultsBaseUrl,\n );\n }\n if (this.viewAllResultsLabel) {\n this.modalElement.setAttribute(\n 'view-all-results-label',\n this.viewAllResultsLabel,\n );\n }\n document.body.appendChild(this.modalElement);\n }\n }\n }\n\n /**\n * Passes result rendering changes on to the fullscreen form created for small viewports,\n * which only receives these props when it is first created.\n */\n @Watch('popoverResultMappings')\n @Watch('template')\n @Watch('noResultsTemplate')\n syncModalElementResultRendering() {\n if (this.modalElement) {\n this.modalElement.popoverResultMappings = this.popoverResultMappings;\n this.modalElement.template = this.template;\n this.modalElement.noResultsTemplate = this.noResultsTemplate;\n }\n }\n\n handleModalBackdropClick(_event: MouseEvent) {\n this.core?.store.getState().setPopoverVisibility(false);\n }\n\n /**\n * When a hotkey is pressed, tests if the modifiers also match.\n * If modifiers match, toggles visibility of the popover modal.\n */\n handleHotkeyPressed(event: KeyboardEvent) {\n if (\n (event.ctrlKey && this.hotkeyModifier === 'ctrl') ||\n (event.altKey && this.hotkeyModifier === 'alt') ||\n (event.metaKey && this.hotkeyModifier === 'meta')\n ) {\n event.preventDefault();\n if (this.type === 'inline' && !this.isPopoverVisibleInState) {\n const hostElementInput = this.hostElement.querySelector(\n '.searchcraft-input-form-input',\n ) as HTMLInputElement | undefined;\n hostElementInput?.focus();\n } else {\n this.core?.store\n .getState()\n .setPopoverVisibility(!this.isPopoverVisibleInState);\n }\n }\n }\n\n handleCancelButtonClick() {\n this.core?.store.getState().setPopoverVisibility(false);\n }\n\n /**\n * Moves focus to the next/previous list item in the list view. If you are at the top\n * of the list view, it moves focus back to the input.\n *\n * @param direction\n */\n focusOnNextListItem(direction: 'ArrowDown' | 'ArrowUp') {\n // Results rendered by a `template` are reached through the first link in the template.\n const links = Array.from(\n document.querySelectorAll<HTMLElement>(\n '.searchcraft-popover-list-item-link, .searchcraft-popover-list-item-template',\n ),\n ).map((el) =>\n el.classList.contains('searchcraft-popover-list-item-template')\n ? el.querySelector('a')\n : el,\n );\n const listItems = Array.from(new Set(links)).filter(\n (el): el is HTMLAnchorElement =>\n !!el && !el.hasAttribute('disabled') && el.offsetParent !== null,\n );\n\n // Focus may be on another link inside a templated result, so match on the result too.\n const activeElement = document.activeElement;\n const currentIndex = listItems.findIndex(\n (el) =>\n el === activeElement ||\n !!el\n .closest('.searchcraft-popover-list-item-template')\n ?.contains(activeElement),\n );\n\n if (direction === 'ArrowDown') {\n listItems[(currentIndex + 1) % listItems.length]?.focus();\n } else if (direction === 'ArrowUp') {\n if (currentIndex >= 1) {\n listItems[currentIndex - 1]?.focus();\n } else {\n const input = document.querySelector('.searchcraft-input-form-input') as\n | HTMLInputElement\n | undefined;\n\n if (input) {\n input.focus();\n requestAnimationFrame(() => {\n input.selectionEnd = input.value.length;\n input.selectionStart = input.value.length;\n });\n }\n }\n }\n }\n\n get hasResultsToShow() {\n return (\n this.searchTerm &&\n this.searchTerm?.trim()?.length > 0 &&\n this.searchClientResponseItems.length > 0\n );\n }\n\n /**\n * Whether the search for the current search term finished without results.\n */\n get hasNoResultsToShow() {\n const searchTerm = this.searchTerm?.trim();\n\n return (\n !!searchTerm &&\n !this.isSearchInProgress &&\n this.searchClientResponseItems.length === 0 &&\n this.completedSearchTerm?.trim() === searchTerm\n );\n }\n\n renderNoResults() {\n const searchTerm = this.searchTerm?.trim() || '';\n\n if (this.noResultsTemplate) {\n try {\n return (\n <div\n class='searchcraft-popover-form-no-results'\n innerHTML={DOMPurify.sanitize(\n this.noResultsTemplate({ searchTerm }, { html, safeUrl }),\n )}\n />\n );\n } catch (error) {\n console.error('Invalid popover no results template:', error);\n }\n }\n\n return (\n <div class='searchcraft-popover-form-no-results'>\n <p class='searchcraft-popover-form-no-results-message'>\n No results found for \"{searchTerm}\".\n </p>\n </div>\n );\n }\n\n get viewAllResultsHref() {\n const baseUrl = this.viewAllResultsBaseUrl;\n if (!baseUrl) {\n return undefined;\n }\n\n const term = this.searchTerm?.trim();\n if (!term) {\n return baseUrl;\n }\n\n return `${baseUrl}${encodeURIComponent(term).replace(/%20/g, '+')}`;\n }\n\n get resolvedViewAllResultsLabel() {\n return this.viewAllResultsLabel ?? 'View All';\n }\n\n navigateToViewAllResults() {\n const href = this.viewAllResultsHref;\n\n if (!href || !this.hasResultsToShow) {\n return;\n }\n\n if (typeof window !== 'undefined') {\n window.location.href = href;\n }\n }\n\n renderInlinePopover() {\n const isListViewVisible = this.hasResultsToShow && this.isFocused;\n const isNoResultsVisible = this.hasNoResultsToShow && this.isFocused;\n const isDropdownVisible = isListViewVisible || isNoResultsVisible;\n\n return (\n <div\n class={classNames(\n 'searchcraft-popover-form searchcraft-popover-form-inline',\n {\n 'searchcraft-popover-form-active': isDropdownVisible,\n },\n )}\n >\n <div class='searchcraft-popover-form-input searchcraft-popover-form-inline-input'>\n <searchcraft-input-form\n onInputFocus={this.handleInputFocus.bind(this)}\n searchcraftId={this.searchcraftId}\n placeholderValue={this.placeholderValue}\n placeholderBehavior={this.placeholderBehavior}\n />\n </div>\n {isDropdownVisible && (\n <div class='searchcraft-popover-form-inline-wrapper'>\n <div class='searchcraft-popover-form-inline-scroll-area'>\n {isListViewVisible && this.showSummaryBox && (\n <searchcraft-results-summary\n searchcraftId={this.searchcraftId}\n />\n )}\n {isListViewVisible ? (\n <searchcraft-popover-list-view\n popoverResultMappings={this.popoverResultMappings}\n template={this.template}\n searchClientResponseItems={this.searchClientResponseItems}\n adClientResponseItems={this.adClientResponseItems}\n searchResultsPage={this.searchResultsPage}\n searchResultsPerPage={this.searchResultsPerPage}\n searchcraftId={this.searchcraftId}\n />\n ) : (\n this.renderNoResults()\n )}\n </div>\n <searchcraft-popover-footer\n searchcraftId={this.searchcraftId}\n sdkVariant={this.sdkVariant}\n viewAllResultsHref={this.viewAllResultsHref}\n viewAllResultsLabel={this.resolvedViewAllResultsLabel}\n />\n </div>\n )}\n </div>\n );\n }\n\n renderModalPopover() {\n if (this.isPopoverVisibleInState) {\n return (\n <div\n class={classNames(\n 'searchcraft-popover-form searchcraft-popover-form-modal',\n {\n 'searchcraft-popover-form-active':\n this.hasResultsToShow || this.hasNoResultsToShow,\n },\n )}\n >\n {/* biome-ignore lint/a11y/useKeyWithClickEvents: <explanation> */}\n <div\n class='searchcraft-popover-form-modal-backdrop'\n onClick={this.handleModalBackdropClick}\n />\n <div class='searchcraft-popover-form-modal-wrapper'>\n <div class='searchcraft-popover-form-input searchcraft-popover-form-modal-input'>\n <searchcraft-input-form\n onInputFocus={this.handleInputFocus.bind(this)}\n onInputInit={this.handleInputInit.bind(this)}\n searchcraftId={this.searchcraftId}\n placeholderValue={this.placeholderValue}\n placeholderBehavior={this.placeholderBehavior}\n />\n <button\n type='button'\n class='searchcraft-popover-form-cancel-button searchcraft-popover-form-modal-cancel-button'\n onClick={this.handleCancelButtonClick.bind(this)}\n >\n Cancel\n </button>\n </div>\n <div class='searchcraft-popover-form-modal-popover-list-view'>\n {this.showSummaryBox && this.hasResultsToShow && (\n <searchcraft-results-summary\n searchcraftId={this.searchcraftId}\n />\n )}\n {this.hasResultsToShow && (\n <searchcraft-popover-list-view\n popoverResultMappings={this.popoverResultMappings}\n template={this.template}\n searchClientResponseItems={this.searchClientResponseItems}\n adClientResponseItems={this.adClientResponseItems}\n searchResultsPage={this.searchResultsPage}\n searchResultsPerPage={this.searchResultsPerPage}\n searchcraftId={this.searchcraftId}\n />\n )}\n {this.hasNoResultsToShow && this.renderNoResults()}\n </div>\n <searchcraft-popover-footer\n searchcraftId={this.searchcraftId}\n sdkVariant={this.sdkVariant}\n viewAllResultsHref={this.viewAllResultsHref}\n viewAllResultsLabel={this.resolvedViewAllResultsLabel}\n />\n </div>\n </div>\n );\n }\n }\n\n renderFullscreenPopover() {\n if (this.isPopoverVisibleInState) {\n return (\n <div\n class={classNames(\n 'searchcraft-popover-form searchcraft-popover-form-fullscreen',\n {\n 'searchcraft-popover-form-active':\n this.hasResultsToShow || this.hasNoResultsToShow,\n },\n )}\n >\n <div class='searchcraft-popover-form-input searchcraft-popover-form-fullscreen-input'>\n <searchcraft-input-form\n onInputFocus={this.handleInputFocus.bind(this)}\n onInputInit={this.handleInputInit.bind(this)}\n searchcraftId={this.searchcraftId}\n placeholderValue={this.placeholderValue}\n placeholderBehavior={this.placeholderBehavior}\n />\n <button\n type='button'\n class='searchcraft-popover-form-cancel-button searchcraft-popover-form-fullscreen-cancel-button'\n onClick={this.handleCancelButtonClick.bind(this)}\n >\n Cancel\n </button>\n </div>\n <div class='searchcraft-popover-form-fullscreen-popover-list-view'>\n {this.showSummaryBox && this.hasResultsToShow && (\n <searchcraft-results-summary searchcraftId={this.searchcraftId} />\n )}\n {this.hasResultsToShow && (\n <searchcraft-popover-list-view\n popoverResultMappings={this.popoverResultMappings}\n template={this.template}\n searchClientResponseItems={this.searchClientResponseItems}\n adClientResponseItems={this.adClientResponseItems}\n searchResultsPage={this.searchResultsPage}\n searchResultsPerPage={this.searchResultsPerPage}\n searchcraftId={this.searchcraftId}\n />\n )}\n {this.hasNoResultsToShow && this.renderNoResults()}\n </div>\n <searchcraft-popover-footer\n searchcraftId={this.searchcraftId}\n sdkVariant={this.sdkVariant}\n viewAllResultsHref={this.viewAllResultsHref}\n viewAllResultsLabel={this.resolvedViewAllResultsLabel}\n />\n </div>\n );\n }\n }\n\n render() {\n switch (this.type) {\n case 'inline':\n return this.renderInlinePopover();\n case 'modal':\n return this.renderModalPopover();\n case 'fullscreen':\n return this.renderFullscreenPopover();\n }\n }\n}\n"],"version":3}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { S as SearchcraftPopoverListItem$1, d as defineCustomElement$1 } from './searchcraft-popover-list-item2.js?scv=0.
|
|
1
|
+
import { S as SearchcraftPopoverListItem$1, d as defineCustomElement$1 } from './searchcraft-popover-list-item2.js?scv=0.16.0';
|
|
2
2
|
|
|
3
3
|
const SearchcraftPopoverListItem = SearchcraftPopoverListItem$1;
|
|
4
4
|
const defineCustomElement = defineCustomElement$1;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { p as proxyCustomElement, H, h, t as transformTag } from './index2.js?scv=0.
|
|
2
|
-
import { r as registry } from './CoreInstanceRegistry.js?scv=0.
|
|
3
|
-
import { g as getDocumentValueFromSearchResultMapping } from './units.js?scv=0.
|
|
4
|
-
import './
|
|
1
|
+
import { p as proxyCustomElement, H, h, t as transformTag } from './index2.js?scv=0.16.0';
|
|
2
|
+
import { r as registry } from './CoreInstanceRegistry.js?scv=0.16.0';
|
|
3
|
+
import { g as getDocumentValueFromSearchResultMapping } from './units.js?scv=0.16.0';
|
|
4
|
+
import { s as safeUrl, h as html } from './safeUrl.js?scv=0.16.0';
|
|
5
5
|
|
|
6
6
|
const SearchcraftPopoverListItem = /*@__PURE__*/ proxyCustomElement(class SearchcraftPopoverListItem extends H {
|
|
7
7
|
constructor(registerHost) {
|
|
@@ -12,6 +12,14 @@ const SearchcraftPopoverListItem = /*@__PURE__*/ proxyCustomElement(class Search
|
|
|
12
12
|
}
|
|
13
13
|
item;
|
|
14
14
|
popoverResultMappings;
|
|
15
|
+
/**
|
|
16
|
+
* A callback function responsible for rendering the result. When provided, it is used instead of `popoverResultMappings`, which are still used if the template throws.
|
|
17
|
+
*/
|
|
18
|
+
template;
|
|
19
|
+
/**
|
|
20
|
+
* The index of the result in the list view. Passed to the `template` callback.
|
|
21
|
+
*/
|
|
22
|
+
index = 0;
|
|
15
23
|
/** The document position relative to the search results (For Measure) */
|
|
16
24
|
documentPosition = 0;
|
|
17
25
|
/**
|
|
@@ -23,6 +31,8 @@ const SearchcraftPopoverListItem = /*@__PURE__*/ proxyCustomElement(class Search
|
|
|
23
31
|
href;
|
|
24
32
|
imageSource;
|
|
25
33
|
imageAlt;
|
|
34
|
+
templateHtml;
|
|
35
|
+
get hostElement() { return this; }
|
|
26
36
|
core;
|
|
27
37
|
cleanupCore;
|
|
28
38
|
mapValuesFromDocument(document) {
|
|
@@ -32,19 +42,40 @@ const SearchcraftPopoverListItem = /*@__PURE__*/ proxyCustomElement(class Search
|
|
|
32
42
|
this.imageSource = getDocumentValueFromSearchResultMapping(document, this.popoverResultMappings?.imageSource);
|
|
33
43
|
this.imageAlt = getDocumentValueFromSearchResultMapping(document, this.popoverResultMappings?.imageAlt);
|
|
34
44
|
}
|
|
45
|
+
/**
|
|
46
|
+
* Maps the document values and renders the template, if there is one. The mapped values are
|
|
47
|
+
* always kept so the result can fall back to them if the template throws or is removed.
|
|
48
|
+
*/
|
|
49
|
+
updateRenderedValues() {
|
|
50
|
+
this.templateHtml = undefined;
|
|
51
|
+
if (!this.item) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
this.mapValuesFromDocument(this.item.document);
|
|
55
|
+
if (this.template) {
|
|
56
|
+
try {
|
|
57
|
+
this.templateHtml = this.template(this.item.document, this.index, {
|
|
58
|
+
html,
|
|
59
|
+
safeUrl,
|
|
60
|
+
source_index: this.item.source_index,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
console.error('Invalid popover result template:', error);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
35
68
|
onCoreAvailable(core) {
|
|
36
69
|
this.core = core;
|
|
37
70
|
}
|
|
38
71
|
connectedCallback() {
|
|
39
|
-
|
|
40
|
-
this.mapValuesFromDocument(this.item.document);
|
|
41
|
-
}
|
|
72
|
+
this.updateRenderedValues();
|
|
42
73
|
this.cleanupCore = registry.useCoreInstance(this.searchcraftId, this.onCoreAvailable.bind(this));
|
|
43
74
|
}
|
|
44
75
|
disconnectedCallback() {
|
|
45
76
|
this.cleanupCore?.();
|
|
46
77
|
}
|
|
47
|
-
|
|
78
|
+
sendDocumentClickedEvent() {
|
|
48
79
|
if (this.core) {
|
|
49
80
|
const document_position = this.documentPosition;
|
|
50
81
|
const search_term = this.core.store.getState().searchTerm;
|
|
@@ -55,20 +86,50 @@ const SearchcraftPopoverListItem = /*@__PURE__*/ proxyCustomElement(class Search
|
|
|
55
86
|
search_term,
|
|
56
87
|
});
|
|
57
88
|
}
|
|
89
|
+
}
|
|
90
|
+
handleLinkClick = () => {
|
|
91
|
+
this.sendDocumentClickedEvent();
|
|
92
|
+
};
|
|
93
|
+
/**
|
|
94
|
+
* Sends the click event when a link inside the rendered template is clicked.
|
|
95
|
+
*/
|
|
96
|
+
handleTemplateClick = (event) => {
|
|
97
|
+
const link = event.target?.closest('a');
|
|
98
|
+
if (link && this.hostElement?.contains(link)) {
|
|
99
|
+
this.sendDocumentClickedEvent();
|
|
100
|
+
}
|
|
58
101
|
};
|
|
102
|
+
handleKeyDown = () => { };
|
|
59
103
|
render() {
|
|
60
|
-
|
|
104
|
+
if (this.template && typeof this.templateHtml === 'string') {
|
|
105
|
+
return (h("div", { class: 'searchcraft-popover-list-item searchcraft-popover-list-item-template', innerHTML: this.templateHtml, onClick: this.handleTemplateClick, onKeyDown: this.handleKeyDown }));
|
|
106
|
+
}
|
|
107
|
+
return (h("div", { class: 'searchcraft-popover-list-item' }, h("a", { class: 'searchcraft-popover-list-item-link', href: this.href ? safeUrl(this.href) : undefined, onClick: this.handleLinkClick.bind(this) }, this.imageSource && (h("div", { class: 'searchcraft-popover-list-item-image-wrapper' }, h("img", { alt: this.imageAlt, src: this.imageSource, class: 'searchcraft-popover-list-item-image' }))), h("div", { class: 'searchcraft-popover-list-item-content' }, this.title && (h("p", { class: 'searchcraft-popover-list-item-content-title' }, this.title)), this.subtitle && (h("p", { class: 'searchcraft-popover-list-item-content-subtitle' }, this.subtitle))))));
|
|
61
108
|
}
|
|
109
|
+
static get watchers() { return {
|
|
110
|
+
"item": ["updateRenderedValues"],
|
|
111
|
+
"popoverResultMappings": ["updateRenderedValues"],
|
|
112
|
+
"template": ["updateRenderedValues"],
|
|
113
|
+
"index": ["updateRenderedValues"]
|
|
114
|
+
}; }
|
|
62
115
|
}, [768, "searchcraft-popover-list-item", {
|
|
63
116
|
"item": [16],
|
|
64
117
|
"popoverResultMappings": [16],
|
|
118
|
+
"template": [16],
|
|
119
|
+
"index": [2],
|
|
65
120
|
"documentPosition": [2, "document-position"],
|
|
66
121
|
"searchcraftId": [1, "searchcraft-id"],
|
|
67
122
|
"title": [32],
|
|
68
123
|
"subtitle": [32],
|
|
69
124
|
"href": [32],
|
|
70
125
|
"imageSource": [32],
|
|
71
|
-
"imageAlt": [32]
|
|
126
|
+
"imageAlt": [32],
|
|
127
|
+
"templateHtml": [32]
|
|
128
|
+
}, undefined, {
|
|
129
|
+
"item": ["updateRenderedValues"],
|
|
130
|
+
"popoverResultMappings": ["updateRenderedValues"],
|
|
131
|
+
"template": ["updateRenderedValues"],
|
|
132
|
+
"index": ["updateRenderedValues"]
|
|
72
133
|
}]);
|
|
73
134
|
function defineCustomElement() {
|
|
74
135
|
if (typeof customElements === "undefined") {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"file":"searchcraft-popover-list-item2.js","mappings":";;;;;
|
|
1
|
+
{"file":"searchcraft-popover-list-item2.js","mappings":"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","names":["__stencil_proxyCustomElement","HTMLElement"],"sources":["src/components/searchcraft-popover-list-item/searchcraft-popover-list-item.tsx"],"sourcesContent":["import type { SearchcraftCore } from '@classes';\nimport { registry } from '@classes/CoreInstanceRegistry';\nimport { Component, Element, Prop, State, Watch, h } from '@stencil/core';\nimport type {\n PopoverResultMappings,\n SearchClientResponseItem,\n SearchDocument,\n SearchResultTemplate,\n SearchResultTemplateData,\n} from '@types';\nimport { getDocumentValueFromSearchResultMapping, html, safeUrl } from '@utils';\n\n/**\n * A single list item rendered in a searchcraft-popover-list-view.\n *\n * @internal\n */\n@Component({\n tag: 'searchcraft-popover-list-item',\n shadow: false,\n})\nexport class SearchcraftPopoverListItem {\n @Prop() item: SearchClientResponseItem | undefined;\n @Prop() popoverResultMappings: PopoverResultMappings | undefined;\n /**\n * A callback function responsible for rendering the result. When provided, it is used instead of `popoverResultMappings`, which are still used if the template throws.\n */\n @Prop() template?: SearchResultTemplate<SearchResultTemplateData>;\n /**\n * The index of the result in the list view. Passed to the `template` callback.\n */\n @Prop() index = 0;\n /** The document position relative to the search results (For Measure) */\n @Prop() documentPosition = 0;\n /**\n * The id of the Searchcraft instance that this component should use.\n */\n @Prop() searchcraftId?: string;\n\n @State() title?: string;\n @State() subtitle?: string;\n @State() href?: string;\n @State() imageSource?: string;\n @State() imageAlt?: string;\n @State() templateHtml: string | undefined;\n @Element() hostElement?: HTMLElement;\n core?: SearchcraftCore;\n private cleanupCore?: () => void;\n\n mapValuesFromDocument(document: SearchDocument) {\n this.title = getDocumentValueFromSearchResultMapping(\n document,\n this.popoverResultMappings?.title,\n );\n this.subtitle = getDocumentValueFromSearchResultMapping(\n document,\n this.popoverResultMappings?.subtitle,\n );\n this.href = getDocumentValueFromSearchResultMapping(\n document,\n this.popoverResultMappings?.href,\n );\n this.imageSource = getDocumentValueFromSearchResultMapping(\n document,\n this.popoverResultMappings?.imageSource,\n );\n this.imageAlt = getDocumentValueFromSearchResultMapping(\n document,\n this.popoverResultMappings?.imageAlt,\n );\n }\n\n /**\n * Maps the document values and renders the template, if there is one. The mapped values are\n * always kept so the result can fall back to them if the template throws or is removed.\n */\n @Watch('item')\n @Watch('popoverResultMappings')\n @Watch('template')\n @Watch('index')\n updateRenderedValues() {\n this.templateHtml = undefined;\n\n if (!this.item) {\n return;\n }\n\n this.mapValuesFromDocument(this.item.document);\n\n if (this.template) {\n try {\n this.templateHtml = this.template(this.item.document, this.index, {\n html,\n safeUrl,\n source_index: this.item.source_index,\n });\n } catch (error) {\n console.error('Invalid popover result template:', error);\n }\n }\n }\n\n onCoreAvailable(core: SearchcraftCore) {\n this.core = core;\n }\n\n connectedCallback() {\n this.updateRenderedValues();\n this.cleanupCore = registry.useCoreInstance(\n this.searchcraftId,\n this.onCoreAvailable.bind(this),\n );\n }\n\n disconnectedCallback() {\n this.cleanupCore?.();\n }\n\n sendDocumentClickedEvent() {\n if (this.core) {\n const document_position = this.documentPosition;\n const search_term = this.core.store.getState().searchTerm;\n const number_of_documents =\n this.core.store.getState().searchClientResponseItems.length || 0;\n\n this.core.measureClient?.sendMeasureEvent('document_clicked', {\n document_position,\n number_of_documents,\n search_term,\n });\n }\n }\n\n handleLinkClick = () => {\n this.sendDocumentClickedEvent();\n };\n\n /**\n * Sends the click event when a link inside the rendered template is clicked.\n */\n handleTemplateClick = (event: MouseEvent) => {\n const link = (event.target as HTMLElement | null)?.closest('a');\n\n if (link && this.hostElement?.contains(link)) {\n this.sendDocumentClickedEvent();\n }\n };\n\n handleKeyDown = () => {};\n\n render() {\n if (this.template && typeof this.templateHtml === 'string') {\n return (\n <div\n class='searchcraft-popover-list-item searchcraft-popover-list-item-template'\n innerHTML={this.templateHtml}\n onClick={this.handleTemplateClick}\n onKeyDown={this.handleKeyDown}\n />\n );\n }\n\n return (\n <div class='searchcraft-popover-list-item'>\n <a\n class='searchcraft-popover-list-item-link'\n href={this.href ? safeUrl(this.href) : undefined}\n onClick={this.handleLinkClick.bind(this)}\n >\n {this.imageSource && (\n <div class='searchcraft-popover-list-item-image-wrapper'>\n <img\n alt={this.imageAlt}\n src={this.imageSource}\n class='searchcraft-popover-list-item-image'\n />\n </div>\n )}\n <div class='searchcraft-popover-list-item-content'>\n {this.title && (\n <p class='searchcraft-popover-list-item-content-title'>\n {this.title}\n </p>\n )}\n {this.subtitle && (\n <p class='searchcraft-popover-list-item-content-subtitle'>\n {this.subtitle}\n </p>\n )}\n </div>\n </a>\n </div>\n );\n }\n}\n"],"version":3}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { S as SearchcraftPopoverListView$1, d as defineCustomElement$1 } from './searchcraft-popover-list-view2.js?scv=0.
|
|
1
|
+
import { S as SearchcraftPopoverListView$1, d as defineCustomElement$1 } from './searchcraft-popover-list-view2.js?scv=0.16.0';
|
|
2
2
|
|
|
3
3
|
const SearchcraftPopoverListView = SearchcraftPopoverListView$1;
|
|
4
4
|
const defineCustomElement = defineCustomElement$1;
|