@coveo/atomic 3.33.9-pre.f638ec9561 → 3.33.9-pre.f81b55a35b
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/atomic/_atomic.esm.js +1 -1
- package/dist/atomic/atomic.esm.js.map +1 -1
- package/dist/atomic/components/_index.d.ts +2 -0
- package/dist/atomic/components/_index.js +1 -0
- package/dist/atomic/components/analytics-config.js +1 -1
- package/dist/atomic/components/atomic-category-facet.js +1 -1
- package/dist/atomic/components/atomic-facet.js +1 -1
- package/dist/atomic/components/atomic-format-currency.js +1 -1
- package/dist/atomic/components/atomic-format-number.js +1 -1
- package/dist/atomic/components/atomic-format-unit.js +1 -1
- package/dist/atomic/components/atomic-numeric-facet.js +1 -1
- package/dist/atomic/components/atomic-quickview-modal2.js +1 -1
- package/dist/atomic/components/atomic-quickview.js +1 -1
- package/dist/atomic/components/atomic-relevance-inspector.d.ts +11 -0
- package/dist/atomic/components/atomic-relevance-inspector.js +53 -0
- package/dist/atomic/components/atomic-relevance-inspector.js.map +1 -0
- package/dist/atomic/components/atomic-result-children.js +1 -1
- package/dist/atomic/components/atomic-result-fields-list.js +1 -1
- package/dist/atomic/components/atomic-result-link.js +1 -1
- package/dist/atomic/components/atomic-result-list.js +1 -1
- package/dist/atomic/components/atomic-result-table-placeholder2.js +1 -1
- package/dist/atomic/components/atomic-search-box-query-suggestions2.js +1 -1
- package/dist/atomic/components/atomic-search-box-recent-queries2.js +1 -1
- package/dist/atomic/components/atomic-search-box.js +3 -3
- package/dist/atomic/components/atomic-smart-snippet-feedback-modal2.js +2 -2
- package/dist/atomic/components/atomic-sort-dropdown.js +2 -2
- package/dist/atomic/components/atomic-sort-expression.js +1 -1
- package/dist/atomic/components/atomic-tab-manager.js +1 -1
- package/dist/atomic/components/components/commerce/atomic-commerce-breadbox/atomic-commerce-breadbox.js +12 -24
- package/dist/atomic/components/components/common/index.js +1 -0
- package/dist/atomic/components/components/common/lazy-index.js +1 -0
- package/dist/atomic/components/components/common/validate-props-controller/validate-props-controller.js +31 -0
- package/dist/atomic/components/components/search/atomic-search-interface/atomic-search-interface.js +23 -11
- package/dist/atomic/components/components/search/index.js +0 -1
- package/dist/atomic/components/components/search/lazy-index.js +0 -1
- package/dist/atomic/components/global/environment.js +1 -1
- package/dist/atomic/components/index.js.map +1 -1
- package/dist/atomic/components/utils/compare-utils.js +35 -0
- package/dist/atomic/{p-e1d6f5e9.entry.js → p-20019654.entry.js} +2 -2
- package/dist/atomic/{p-12db4722.entry.js → p-2aab9f25.entry.js} +2 -2
- package/dist/atomic/{p-b05d54e3.entry.js → p-30411cd4.entry.js} +2 -2
- package/dist/atomic/{p-aa911e35.entry.js → p-3e38aea6.entry.js} +2 -2
- package/dist/atomic/{p-e296615c.entry.js → p-44ef70b6.entry.js} +2 -2
- package/dist/atomic/{p-a597c345.js → p-4828eef2.js} +2 -2
- package/dist/atomic/{p-80fc1821.entry.js → p-4ae14373.entry.js} +2 -2
- package/dist/atomic/{p-5a710350.entry.js → p-4b9a166f.entry.js} +2 -2
- package/dist/atomic/{p-78bb2db9.entry.js → p-516b8165.entry.js} +2 -2
- package/dist/atomic/{p-dcba2119.entry.js → p-62afcf79.entry.js} +2 -2
- package/dist/atomic/{p-ef5ba5ae.entry.js → p-74822069.entry.js} +2 -2
- package/dist/atomic/{p-ab44a3c9.entry.js → p-8103bad3.entry.js} +2 -2
- package/dist/atomic/{p-f2467a39.entry.js → p-8acb1466.entry.js} +2 -2
- package/dist/atomic/{p-c865f044.entry.js → p-aa616502.entry.js} +2 -2
- package/dist/atomic/{p-2c221588.entry.js → p-b4ad3036.entry.js} +2 -2
- package/dist/atomic/{p-2caf7109.entry.js → p-b7cd0342.entry.js} +2 -2
- package/dist/atomic/{p-bea8dad6.entry.js → p-b80923d6.entry.js} +2 -2
- package/dist/atomic/{p-5f2d62d9.entry.js → p-d2d22ab2.entry.js} +2 -2
- package/dist/atomic/p-d8028950.entry.js +2 -0
- package/dist/atomic/p-d8028950.entry.js.map +1 -0
- package/dist/atomic/{p-47d35e28.entry.js → p-df1d50c8.entry.js} +2 -2
- package/dist/atomic/{p-bc8e7f18.entry.js → p-dfc385b7.entry.js} +2 -2
- package/dist/atomic/{p-ca3dc59b.entry.js → p-e3edbf14.entry.js} +2 -2
- package/dist/atomic/{p-fa11d674.entry.js → p-f073a78d.entry.js} +2 -2
- package/dist/cjs/_loader.cjs.js +1 -1
- package/dist/cjs/{analytics-config-82772ea9.js → analytics-config-94ab3487.js} +2 -2
- package/dist/cjs/{analytics-config-82772ea9.js.map → analytics-config-94ab3487.js.map} +1 -1
- package/dist/cjs/atomic-category-facet.cjs.entry.js +1 -1
- package/dist/cjs/atomic-facet.cjs.entry.js +1 -1
- package/dist/cjs/atomic-format-currency.cjs.entry.js +1 -1
- package/dist/cjs/atomic-format-number.cjs.entry.js +1 -1
- package/dist/cjs/atomic-format-unit.cjs.entry.js +1 -1
- package/dist/cjs/atomic-insight-interface.cjs.entry.js +1 -1
- package/dist/cjs/atomic-numeric-facet.cjs.entry.js +1 -1
- package/dist/cjs/atomic-quickview-modal.cjs.entry.js +1 -1
- package/dist/cjs/atomic-quickview.cjs.entry.js +1 -1
- package/dist/cjs/atomic-recs-interface.cjs.entry.js +1 -1
- package/dist/cjs/atomic-relevance-inspector.cjs.entry.js +38 -0
- package/dist/cjs/atomic-relevance-inspector.cjs.entry.js.map +1 -0
- package/dist/cjs/atomic-result-children.cjs.entry.js +1 -1
- package/dist/cjs/atomic-result-fields-list.cjs.entry.js +1 -1
- package/dist/cjs/atomic-result-link.cjs.entry.js +1 -1
- package/dist/cjs/atomic-result-list.cjs.entry.js +1 -1
- package/dist/cjs/atomic-result-placeholder_8.cjs.entry.js +1 -1
- package/dist/cjs/atomic-search-box-query-suggestions_2.cjs.entry.js +2 -2
- package/dist/cjs/atomic-search-box.cjs.entry.js +3 -3
- package/dist/cjs/atomic-smart-snippet-feedback-modal.cjs.entry.js +2 -2
- package/dist/cjs/atomic-sort-dropdown.cjs.entry.js +2 -2
- package/dist/cjs/atomic-sort-expression.cjs.entry.js +1 -1
- package/dist/cjs/atomic-tab-manager.cjs.entry.js +1 -1
- package/dist/cjs/atomic.cjs.js +1 -1
- package/dist/cjs/index-757bc886.js +4 -0
- package/dist/cjs/version.cjs.js +1 -1
- package/dist/esm/_loader.js +1 -1
- package/dist/esm/{analytics-config-10859e0e.js → analytics-config-480b22a1.js} +2 -2
- package/dist/esm/{analytics-config-10859e0e.js.map → analytics-config-480b22a1.js.map} +1 -1
- package/dist/esm/atomic-category-facet.entry.js +1 -1
- package/dist/esm/atomic-facet.entry.js +1 -1
- package/dist/esm/atomic-format-currency.entry.js +1 -1
- package/dist/esm/atomic-format-number.entry.js +1 -1
- package/dist/esm/atomic-format-unit.entry.js +1 -1
- package/dist/esm/atomic-insight-interface.entry.js +1 -1
- package/dist/esm/atomic-numeric-facet.entry.js +1 -1
- package/dist/esm/atomic-quickview-modal.entry.js +1 -1
- package/dist/esm/atomic-quickview.entry.js +1 -1
- package/dist/esm/atomic-recs-interface.entry.js +1 -1
- package/dist/esm/atomic-relevance-inspector.entry.js +34 -0
- package/dist/esm/atomic-relevance-inspector.entry.js.map +1 -0
- package/dist/esm/atomic-result-children.entry.js +1 -1
- package/dist/esm/atomic-result-fields-list.entry.js +1 -1
- package/dist/esm/atomic-result-link.entry.js +1 -1
- package/dist/esm/atomic-result-list.entry.js +1 -1
- package/dist/esm/atomic-result-placeholder_8.entry.js +1 -1
- package/dist/esm/atomic-search-box-query-suggestions_2.entry.js +2 -2
- package/dist/esm/atomic-search-box.entry.js +3 -3
- package/dist/esm/atomic-smart-snippet-feedback-modal.entry.js +2 -2
- package/dist/esm/atomic-sort-dropdown.entry.js +2 -2
- package/dist/esm/atomic-sort-expression.entry.js +1 -1
- package/dist/esm/atomic-tab-manager.entry.js +1 -1
- package/dist/esm/atomic.js +1 -1
- package/dist/esm/index-3f35faca.js +4 -0
- package/dist/esm/version.js +1 -1
- package/dist/types/components/commerce/atomic-commerce-breadbox/atomic-commerce-breadbox.d.ts +1 -2
- package/dist/types/components/common/index.d.ts +1 -0
- package/dist/types/components/common/validate-props-controller/validate-props-controller.d.ts +17 -0
- package/dist/types/components/search/atomic-relevance-inspector/atomic-relevance-inspector.d.ts +8 -18
- package/dist/types/components/search/atomic-search-interface/atomic-search-interface.d.ts +3 -5
- package/dist/types/components/search/index.d.ts +0 -1
- package/dist/types/components.d.ts +53 -0
- package/dist/types/utils/compare-utils.d.ts +9 -0
- package/docs/atomic-docs.json +88 -1
- package/package.json +1 -1
- package/dist/atomic/components/components/search/atomic-relevance-inspector/atomic-relevance-inspector.js +0 -100
- /package/dist/atomic/{p-e1d6f5e9.entry.js.map → p-20019654.entry.js.map} +0 -0
- /package/dist/atomic/{p-12db4722.entry.js.map → p-2aab9f25.entry.js.map} +0 -0
- /package/dist/atomic/{p-b05d54e3.entry.js.map → p-30411cd4.entry.js.map} +0 -0
- /package/dist/atomic/{p-aa911e35.entry.js.map → p-3e38aea6.entry.js.map} +0 -0
- /package/dist/atomic/{p-e296615c.entry.js.map → p-44ef70b6.entry.js.map} +0 -0
- /package/dist/atomic/{p-a597c345.js.map → p-4828eef2.js.map} +0 -0
- /package/dist/atomic/{p-80fc1821.entry.js.map → p-4ae14373.entry.js.map} +0 -0
- /package/dist/atomic/{p-5a710350.entry.js.map → p-4b9a166f.entry.js.map} +0 -0
- /package/dist/atomic/{p-78bb2db9.entry.js.map → p-516b8165.entry.js.map} +0 -0
- /package/dist/atomic/{p-dcba2119.entry.js.map → p-62afcf79.entry.js.map} +0 -0
- /package/dist/atomic/{p-ef5ba5ae.entry.js.map → p-74822069.entry.js.map} +0 -0
- /package/dist/atomic/{p-ab44a3c9.entry.js.map → p-8103bad3.entry.js.map} +0 -0
- /package/dist/atomic/{p-f2467a39.entry.js.map → p-8acb1466.entry.js.map} +0 -0
- /package/dist/atomic/{p-c865f044.entry.js.map → p-aa616502.entry.js.map} +0 -0
- /package/dist/atomic/{p-2c221588.entry.js.map → p-b4ad3036.entry.js.map} +0 -0
- /package/dist/atomic/{p-2caf7109.entry.js.map → p-b7cd0342.entry.js.map} +0 -0
- /package/dist/atomic/{p-bea8dad6.entry.js.map → p-b80923d6.entry.js.map} +0 -0
- /package/dist/atomic/{p-5f2d62d9.entry.js.map → p-d2d22ab2.entry.js.map} +0 -0
- /package/dist/atomic/{p-47d35e28.entry.js.map → p-df1d50c8.entry.js.map} +0 -0
- /package/dist/atomic/{p-bc8e7f18.entry.js.map → p-dfc385b7.entry.js.map} +0 -0
- /package/dist/atomic/{p-ca3dc59b.entry.js.map → p-e3edbf14.entry.js.map} +0 -0
- /package/dist/atomic/{p-fa11d674.entry.js.map → p-f073a78d.entry.js.map} +0 -0
@@ -0,0 +1 @@
|
|
1
|
+
{"file":"atomic-relevance-inspector.js","mappings":";;;;AAAA,MAAM,2BAA2B,GAAG,0ljEAA0ljE,CAAC;AAC/njE,uCAAe,2BAA2B;;MCY7BA,0BAAwB;;;;;;QAMZ,SAAI,GAAG,KAAK,CAAC;;oBAAN,KAAK;;IAK5B,MAAM;QACX,QACE,qEACE,WAAW,EAAC,QAAQ,EACpB,MAAM,EAAE,IAAI,CAAC,IAAI,EACjB,KAAK,EAAE;gBACL,IAAI,CAAC,uBAAuB,EAAE,IAAI,EAAE,CAAC;aACtC,IAED,0DAAG,IAAI,EAAC,QAAQ,mCAAiC,EACjD,0DAAG,IAAI,EAAC,MAAM,6EAEV,EACJ,4DAAK,IAAI,EAAC,QAAQ,EAAC,KAAK,EAAC,sCAAsC,IAC7D,EAAC,MAAM,qDACL,KAAK,EAAC,iBAAiB,EACvB,KAAK,EAAC,UAAU,EAChB,OAAO,EAAE,MAAM,IAAI,CAAC,uBAAuB,EAAE,IAAI,EAAE,aAG5C,EACT,0DACE,KAAK,EAAC,iBAAiB,EACvB,MAAM,EAAC,QAAQ,EACf,IAAI,EAAE,IAAI,CAAC,SAAS,EACpB,OAAO,EAAE,MAAM,IAAI,CAAC,uBAAuB,EAAE,IAAI,EAAE,WAGjD,CACA,CACO,EACf;KACH;IAED,IAAY,SAAS;QACnB,MAAM,EAAC,cAAc,EAAE,WAAW,EAAC,GACjC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,aAAa,CAAC;QAE3C,MAAM,KAAK,GAAG,uBAAuB,CAAC,cAAc,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;QAC5E,MAAM,EAAC,gBAAgB,EAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC;QAC7D,OAAO,GAAG,KAAK,YAAY,cAAc,8BAA8B,gBAAgB,EAAE,CAAC;KAC3F;;;;;;;;;;;;;;;;;;;;;;;;;","names":["AtomicRelevanceInspector"],"sources":["src/components/search/atomic-relevance-inspector/atomic-relevance-inspector.pcss?tag=atomic-relevance-inspector&encapsulation=shadow","src/components/search/atomic-relevance-inspector/atomic-relevance-inspector.tsx"],"sourcesContent":["@import '../../../global/global.pcss';\n","import {getOrganizationEndpoint} from '@coveo/headless';\nimport {Component, h, Prop, Event, EventEmitter} from '@stencil/core';\nimport {Button} from '../../common/stencil-button';\nimport {Bindings} from '../atomic-search-interface/atomic-search-interface';\n\n/**\n * The `atomic-relevance-inspector` component is used internally to offer insight on search page relevance, as well as information to help troubleshoot issues during development.\n */\n@Component({\n tag: 'atomic-relevance-inspector',\n styleUrl: 'atomic-relevance-inspector.pcss',\n shadow: true,\n})\nexport class AtomicRelevanceInspector {\n /**\n * The Atomic interface bindings, namely the headless search engine and i18n instances.\n */\n @Prop() bindings!: Bindings;\n\n @Prop({reflect: true}) open = false;\n\n @Event({eventName: 'atomic/relevanceInspector/close'})\n closeRelevanceInspector: EventEmitter<null> | undefined;\n\n public render() {\n return (\n <atomic-modal\n exportparts=\"footer\"\n isOpen={this.open}\n close={() => {\n this.closeRelevanceInspector?.emit();\n }}\n >\n <p slot=\"header\">Open the relevance inspector</p>\n <p slot=\"body\">\n The Relevance Inspector will open in the Coveo Administration Console.\n </p>\n <div slot=\"footer\" class=\"flex w-full items-center justify-end\">\n <Button\n style=\"outline-primary\"\n class=\"mr-2 p-2\"\n onClick={() => this.closeRelevanceInspector?.emit()}\n >\n Ignore\n </Button>\n <a\n class=\"btn-primary p-2\"\n target=\"_blank\"\n href={this.adminHref}\n onClick={() => this.closeRelevanceInspector?.emit()}\n >\n Open\n </a>\n </div>\n </atomic-modal>\n );\n }\n\n private get adminHref() {\n const {organizationId, environment} =\n this.bindings.engine.state.configuration;\n\n const admin = getOrganizationEndpoint(organizationId, environment, 'admin');\n const {searchResponseId} = this.bindings.engine.state.search;\n return `${admin}/admin/#/${organizationId}/search/relevanceInspector/${searchResponseId}`;\n }\n}\n"],"version":3}
|
@@ -138,7 +138,7 @@ const AtomicResultChildren$1 = /*@__PURE__*/ proxyCustomElement(class AtomicResu
|
|
138
138
|
return (h(ChildrenWrapper, { hasChildren: children.length > 0 }, children.map((child, i) => this.renderChild(child, i === children.length - 1))));
|
139
139
|
}
|
140
140
|
render() {
|
141
|
-
return (h(ResultChildrenGuard, { key: '
|
141
|
+
return (h(ResultChildrenGuard, { key: '87e4eb542feb7fd2fe4adafb1a966a77653195e6', inheritTemplates: this.inheritTemplates, resultTemplateRegistered: this.resultTemplateRegistered, templateHasError: this.templateHasError }, this.collection ? this.renderCollection() : this.renderFoldedResult()));
|
142
142
|
}
|
143
143
|
get host() { return this; }
|
144
144
|
static get style() { return AtomicResultChildrenStyle0; }
|
@@ -98,7 +98,7 @@ const AtomicResultFieldsList$1 = /*@__PURE__*/ proxyCustomElement(class AtomicRe
|
|
98
98
|
}
|
99
99
|
}
|
100
100
|
render() {
|
101
|
-
return h(Host, { key: '
|
101
|
+
return h(Host, { key: 'bb78009f1c331adf546e3fb7516413cce13de162' });
|
102
102
|
}
|
103
103
|
get host() { return this; }
|
104
104
|
static get style() { return AtomicResultFieldsListStyle0; }
|
@@ -43,7 +43,7 @@ const AtomicResultLink$1 = /*@__PURE__*/ proxyCustomElement(class AtomicResultLi
|
|
43
43
|
const href = isUndefined(this.hrefTemplate)
|
44
44
|
? this.result.clickUri
|
45
45
|
: buildStringTemplateFromResult(this.hrefTemplate, this.result, this.bindings);
|
46
|
-
return (h(LinkWithItemAnalytics, { key: '
|
46
|
+
return (h(LinkWithItemAnalytics, { key: '161199ea164427d67db5456e43d7c3cb2ebe9d8d', href: href, onSelect: () => this.interactiveResult.select(), onBeginDelayedSelect: () => this.interactiveResult.beginDelayedSelect(), onCancelPendingSelect: () => this.interactiveResult.cancelPendingSelect(), attributes: this.linkAttributes, stopPropagation: this.stopPropagation }, this.hasDefaultSlot ? (h("slot", null)) : (h("atomic-result-text", { field: "title", default: "no-title" }))));
|
47
47
|
}
|
48
48
|
get host() { return this; }
|
49
49
|
static get style() { return AtomicResultLinkStyle0; }
|
@@ -194,7 +194,7 @@ const AtomicResultList$1 = /*@__PURE__*/ proxyCustomElement(class AtomicResultLi
|
|
194
194
|
render() {
|
195
195
|
this.resultListCommon.updateBreakpoints();
|
196
196
|
const listClasses = this.computeListDisplayClasses();
|
197
|
-
return (h(TabGuard, { key: '
|
197
|
+
return (h(TabGuard, { key: '649dedc762f1c1c9dd45851b000ef76ecd07effa', tabsIncluded: this.tabsIncluded, tabsExcluded: this.tabsExcluded, activeTab: this.tabManagerState.activeTab }, h(ItemListGuard, { key: '05afb457fd344b7ccf5cb925d0baf32227f2ddba', hasError: this.resultListState.hasError, hasTemplate: this.resultTemplateRegistered, templateHasError: this.itemTemplateProvider.hasError, firstRequestExecuted: this.resultListState.firstSearchExecuted, hasItems: this.resultListState.hasResults }, h(DisplayWrapper, { key: 'a68a18d3eb5c4fad3949bbc8f11a1610db400346', display: this.display, listClasses: listClasses }, h(ResultsPlaceholdersGuard, { key: '19c2415dc2c2497abc612acd1866f1284cdf2422', density: this.density, display: this.display, imageSize: this.imageSize, displayPlaceholders: !this.isAppLoaded, numberOfPlaceholders: this.resultsPerPageState.numberOfResults }), h(ItemDisplayGuard, { key: '5eadfb9707d35affe14cc9eabfe70a436981cc80', firstRequestExecuted: this.resultListState.firstSearchExecuted, hasItems: this.resultListState.hasResults }, this.display === 'table'
|
198
198
|
? this.renderAsTable()
|
199
199
|
: this.display === 'grid'
|
200
200
|
? this.renderAsGrid()
|
@@ -18,7 +18,7 @@ const AtomicResultTablePlaceholder = /*@__PURE__*/ proxyCustomElement(class Atom
|
|
18
18
|
return getItemDisplayClasses('table', this.density, this.imageSize);
|
19
19
|
}
|
20
20
|
render() {
|
21
|
-
return (h("table", { key: '
|
21
|
+
return (h("table", { key: 'f0cad781eac8ea643304812a6cec890aa77b588a', class: `list-root animate-pulse ${this.getClasses().join(' ')}` }, h("thead", { key: 'd12868ee81d0bc2ffebfb3d7959eb280324b5694' }, h("tr", { key: 'bd9ee9d2bd93a248b79d83a47525d136fb4619e8' }, h("th", { key: 'a41e32a184fb8cc15606153dc3471a391d5b0f3a' }, h("div", { key: 'a9d05f5c95c57e4b2ba373f44579ffc67014f168', class: `mt-2 h-8 ${placeholderClasses}`, style: { width: '14.5rem' } })), h("th", { key: '7a0f86e0b72d04776dd636e9a3186658ab7a04c2' }, h("div", { key: '504fd4539f8338a3e45aa61369815550cc8b1d75', class: `mt-2 h-8 ${placeholderClasses}`, style: { width: '9.75rem' } })), h("th", { key: '636260d5f1e591f9b89e17095ea3139d51d22cdf' }, h("div", { key: '79ba23e12e438b8324edad76c8cc646aaf32b2d9', class: `mt-2 h-8 ${placeholderClasses}`, style: { width: '6.5rem' } })))), h("tbody", { key: 'd5f76344025e0b6d3795a6d08952e54b75092180' }, Array.from({ length: this.rows }, () => (h("tr", null, h("td", null, h("div", { class: `mb-6 h-8 ${placeholderClasses}`, style: { width: '22.875rem' } }), h("div", { class: `mb-2 h-5 ${placeholderClasses}`, style: { width: '23.75rem' } }), h("div", { class: `h-5 ${placeholderClasses}`, style: { width: '11.5rem' } })), h("td", null, h("div", { class: `mt-1.5 h-5 ${placeholderClasses}`, style: { width: '11rem' } })), h("td", null, h("div", { class: `mt-1.5 h-5 ${placeholderClasses}`, style: { width: '4.875rem' } }))))))));
|
22
22
|
}
|
23
23
|
static get style() { return AtomicResultTablePlaceholderStyle0; }
|
24
24
|
}, [1, "atomic-result-table-placeholder", {
|
@@ -60,7 +60,7 @@ const AtomicSearchBoxQuerySuggestions = /*@__PURE__*/ proxyCustomElement(class A
|
|
60
60
|
}
|
61
61
|
render() {
|
62
62
|
if (this.error) {
|
63
|
-
return (h("atomic-component-error", { key: '
|
63
|
+
return (h("atomic-component-error", { key: 'ee518dd01ee68d5ac1e13c37335888acf7089beb', element: this.host, error: this.error }));
|
64
64
|
}
|
65
65
|
}
|
66
66
|
get host() { return this; }
|
@@ -154,7 +154,7 @@ const AtomicSearchBoxRecentQueries = /*@__PURE__*/ proxyCustomElement(class Atom
|
|
154
154
|
}
|
155
155
|
render() {
|
156
156
|
if (this.error) {
|
157
|
-
return (h("atomic-component-error", { key: '
|
157
|
+
return (h("atomic-component-error", { key: '577129c08c073b99dbb6b86b77e2ffa7c2ff7f69', element: this.host, error: this.error }));
|
158
158
|
}
|
159
159
|
}
|
160
160
|
get host() { return this; }
|
@@ -436,14 +436,14 @@ const AtomicSearchBox$1 = /*@__PURE__*/ proxyCustomElement(class AtomicSearchBox
|
|
436
436
|
if (!this.suggestionManager.suggestions.length) {
|
437
437
|
this.registerSearchboxSuggestionEvents();
|
438
438
|
}
|
439
|
-
return (h(Host, { key: '
|
440
|
-
h(SearchBoxWrapper, { key: '
|
439
|
+
return (h(Host, { key: 'cd802b14a08f90326685fc94fae9284512c4a4f4' }, this.renderAbsolutePositionSpacer(), [
|
440
|
+
h(SearchBoxWrapper, { key: 'ca513e73ed33a17fa7dce2484680fd8c2fc4cba6', disabled: isDisabled, onFocusout: (event) => {
|
441
441
|
if (!isFocusingOut(event)) {
|
442
442
|
return;
|
443
443
|
}
|
444
444
|
this.suggestionManager.clearSuggestions();
|
445
445
|
this.isExpanded = false;
|
446
|
-
} }, this.renderTextBox(searchLabel), h(SubmitButton, { key: '
|
446
|
+
} }, this.renderTextBox(searchLabel), h(SubmitButton, { key: '5e83f4af25eec9ab9ace26eeb59a58845a2a7d9b', bindings: this.bindings, disabled: isDisabled, onClick: () => {
|
447
447
|
this.searchBox.submit();
|
448
448
|
this.suggestionManager.clearSuggestions();
|
449
449
|
} }), this.renderSuggestions()),
|
@@ -43,9 +43,9 @@ const AtomicSmartSnippetFeedbackModal = /*@__PURE__*/ proxyCustomElement(class A
|
|
43
43
|
}
|
44
44
|
render() {
|
45
45
|
updateBreakpoints(this.host);
|
46
|
-
return (h("atomic-modal", { key: '
|
46
|
+
return (h("atomic-modal", { key: '9915bc71b6329068bc8a3731971a793946762f39', fullscreen: false, source: this.source, container: this.host, isOpen: this.isOpen, close: () => this.close(), exportparts: ATOMIC_MODAL_EXPORT_PARTS }, h(SmartSnippetFeedbackModalHeader, { key: '385350607264cd3a0dce273b18eec02909220384', i18n: this.bindings.i18n }), h(SmartSnippetFeedbackModalBody, { key: 'e1a01e0df35dbaf9da6891c825ad5e5e1e6bc534', formId: this.formId, onSubmit: (e) => this.sendFeedback(e) }, h(SmartSnippetFeebackModalOptions, { key: 'd92a6395c26802cfafbcbd50fb1b2cd86bb907de', i18n: this.bindings.i18n }, smartSnippetFeedbackOptions.map(({ id, localeKey, correspondingAnswer }) => (h(SmartSnippetFeedbackModalOption, { correspondingAnswer: correspondingAnswer, currentAnswer: this.currentAnswer, i18n: this.bindings.i18n, id: id, localeKey: localeKey, onChange: () => {
|
47
47
|
this.currentAnswer = correspondingAnswer;
|
48
|
-
} })))), h(SmartSnippetFeedbackModalDetails, { key: '
|
48
|
+
} })))), h(SmartSnippetFeedbackModalDetails, { key: '6dfe87c931bc44d202d78c5a800936aa733b89de', currentAnswer: this.currentAnswer, i18n: this.bindings.i18n, setDetailsInputRef: (ref) => (this.detailsInputRef = ref) })), h(SmartSnippetFeedbackModalFooter, { key: '86f51c71ade3a7e360ce5c000e45939e8744ade4', formId: this.formId, i18n: this.bindings.i18n, onClick: () => this.close() })));
|
49
49
|
}
|
50
50
|
close() {
|
51
51
|
this.isOpen = false;
|
@@ -117,8 +117,8 @@ const AtomicSortDropdown$1 = /*@__PURE__*/ proxyCustomElement(class AtomicSortDr
|
|
117
117
|
const { hasError, hasResults, firstSearchExecuted } = this.searchStatusState;
|
118
118
|
const { bindings: { i18n }, id, } = this;
|
119
119
|
return [
|
120
|
-
h(SortGuard, { key: '
|
121
|
-
h("slot", { key: '
|
120
|
+
h(SortGuard, { key: '0669c3a8c7067eef9ba5c178a5f4d12752f8b085', firstSearchExecuted: firstSearchExecuted, hasError: hasError, hasResults: hasResults }, h(SortContainer, { key: '6eb9cc11bb18013dfd384b809e6e72d2177cbe60' }, h(SortLabel, { key: '4573530fcd7c614b7ed1d3dbb8f4ad5617477ee3', i18n: i18n, id: id }), h(SortSelect, { key: 'a5ee4b55058679c63fb628337c33d1db192cf481', i18n: i18n, id: id, onSelect: (evt) => this.select(evt) }, this.options.map(({ label, criteria, expression }) => (h(SortOption, { i18n: i18n, label: label, selected: this.sort.isSortedBy(criteria), value: expression })))))),
|
121
|
+
h("slot", { key: '39a0d6e53adfe877b5f677d4cf9b0ff9177f84e8' }),
|
122
122
|
];
|
123
123
|
}
|
124
124
|
get host() { return this; }
|
@@ -47,7 +47,7 @@ const AtomicSortExpression$1 = /*@__PURE__*/ proxyCustomElement(class AtomicSort
|
|
47
47
|
const dropdownComponent = 'atomic-sort-dropdown';
|
48
48
|
if (!this.host.closest(dropdownComponent)) {
|
49
49
|
const error = new Error(`The "${this.host.nodeName.toLowerCase()}" component has to be used inside an ${dropdownComponent} element.`);
|
50
|
-
return (h("atomic-component-error", { key: '
|
50
|
+
return (h("atomic-component-error", { key: '4e946fe770ef49fc6346f0bc247db856fd38ba68', element: this.host, error: error }));
|
51
51
|
}
|
52
52
|
}
|
53
53
|
get host() { return this; }
|
@@ -59,7 +59,7 @@ const AtomicTabManager$1 = /*@__PURE__*/ proxyCustomElement(class AtomicTabManag
|
|
59
59
|
});
|
60
60
|
}
|
61
61
|
render() {
|
62
|
-
return (h(Host, { key: '
|
62
|
+
return (h(Host, { key: 'ea60f4179a268319ba97570f95d6881c379c8b18' }, h("atomic-tab-bar", { key: 'ea83347d794b2f83b70706bdfc4240286c27d71e' }, h("div", { key: '9d9e588d7a4b7012f43419f3edae786b177498cc', role: "list", "aria-label": "tab-area", part: "tab-area", class: "border-neutral mb-2 flex w-full flex-row border-b" }, this.tabs.map((tab) => (h("atomic-tab-button", { active: this.tabManagerState.activeTab === tab.name, label: this.bindings.i18n.t(tab.label, {
|
63
63
|
defaultValue: tab.label,
|
64
64
|
}), select: () => {
|
65
65
|
if (!tab.tabController.state.isActive) {
|
@@ -24,6 +24,7 @@ import { renderBreadcrumbShowLess } from '../../common/breadbox/breadcrumb-show-
|
|
24
24
|
import { renderBreadcrumbShowMore } from '../../common/breadbox/breadcrumb-show-more';
|
25
25
|
import { formatHumanReadable } from '../../common/facets/numeric-facet/formatter';
|
26
26
|
import { defaultCurrencyFormatter, defaultNumberFormatter, } from '../../common/formats/format-common';
|
27
|
+
import { ValidatePropsController } from '../../common/validate-props-controller/validate-props-controller';
|
27
28
|
import styles from './atomic-commerce-breadbox.tw.css';
|
28
29
|
/**
|
29
30
|
* The `atomic-commerce-breadbox` component creates breadcrumbs that display a summary of the currently active facet values.
|
@@ -42,7 +43,7 @@ import styles from './atomic-commerce-breadbox.tw.css';
|
|
42
43
|
*/
|
43
44
|
let AtomicCommerceBreadbox = class AtomicCommerceBreadbox extends LitElement {
|
44
45
|
constructor() {
|
45
|
-
super(
|
46
|
+
super();
|
46
47
|
this.lastRemovedBreadcrumbIndex = 0;
|
47
48
|
this.numberOfBreadcrumbs = 0;
|
48
49
|
this.numberOfCollapsedBreadcrumbs = 0;
|
@@ -96,9 +97,18 @@ let AtomicCommerceBreadbox = class AtomicCommerceBreadbox extends LitElement {
|
|
96
97
|
}
|
97
98
|
}
|
98
99
|
};
|
100
|
+
new ValidatePropsController(this, {
|
101
|
+
getProps: () => ({ pathLimit: this.pathLimit }),
|
102
|
+
schema: new Schema({
|
103
|
+
pathLimit: new NumberValue({
|
104
|
+
default: 3,
|
105
|
+
min: 1,
|
106
|
+
required: false,
|
107
|
+
}),
|
108
|
+
}),
|
109
|
+
});
|
99
110
|
}
|
100
111
|
initialize() {
|
101
|
-
this.validateProps();
|
102
112
|
if (this.bindings.interfaceElement.type === 'product-listing') {
|
103
113
|
this.searchOrListing = buildProductListing(this.bindings.engine);
|
104
114
|
}
|
@@ -115,31 +125,9 @@ let AtomicCommerceBreadbox = class AtomicCommerceBreadbox extends LitElement {
|
|
115
125
|
this.breadcrumbShowMoreFocus = new FocusTargetController(this, this.bindings);
|
116
126
|
this.breadcrumbShowLessFocus = new FocusTargetController(this, this.bindings);
|
117
127
|
}
|
118
|
-
willUpdate(changedProperties) {
|
119
|
-
if (changedProperties.has('pathLimit')) {
|
120
|
-
this.validateProps();
|
121
|
-
}
|
122
|
-
}
|
123
128
|
updated() {
|
124
129
|
this.adaptBreadcrumbs();
|
125
130
|
}
|
126
|
-
validateProps() {
|
127
|
-
try {
|
128
|
-
new Schema({
|
129
|
-
pathLimit: new NumberValue({
|
130
|
-
default: 3,
|
131
|
-
min: 1,
|
132
|
-
required: false,
|
133
|
-
}),
|
134
|
-
}).validate({
|
135
|
-
pathLimit: this.pathLimit,
|
136
|
-
});
|
137
|
-
}
|
138
|
-
catch (error) {
|
139
|
-
this.error = error;
|
140
|
-
return;
|
141
|
-
}
|
142
|
-
}
|
143
131
|
disconnectedCallback() {
|
144
132
|
this.resizeObserver?.disconnect();
|
145
133
|
}
|
@@ -6,3 +6,4 @@ export { AtomicFacetPlaceholder } from './atomic-facet-placeholder/atomic-facet-
|
|
6
6
|
export { AtomicIcon } from './atomic-icon/atomic-icon.js';
|
7
7
|
export { AtomicLayoutSection } from './atomic-layout-section/atomic-layout-section.js';
|
8
8
|
export { AtomicModal } from './atomic-modal/atomic-modal.js';
|
9
|
+
export { ValidatePropsController } from './validate-props-controller/validate-props-controller.js';
|
@@ -7,4 +7,5 @@ export default {
|
|
7
7
|
'atomic-icon': async () => await import('./atomic-icon/atomic-icon.js'),
|
8
8
|
'atomic-layout-section': async () => await import('./atomic-layout-section/atomic-layout-section.js'),
|
9
9
|
'atomic-modal': async () => await import('./atomic-modal/atomic-modal.js'),
|
10
|
+
'validate-props-controller': async () => await import('./validate-props-controller/validate-props-controller.js'),
|
10
11
|
};
|
@@ -0,0 +1,31 @@
|
|
1
|
+
import { deepEqual } from "../../../utils/compare-utils";
|
2
|
+
export class ValidatePropsController {
|
3
|
+
constructor(host, options) {
|
4
|
+
this.host = host;
|
5
|
+
this.getProps = options.getProps;
|
6
|
+
this.schema = options.schema;
|
7
|
+
this.previousProps = {};
|
8
|
+
host.addController(this);
|
9
|
+
}
|
10
|
+
hostConnected() {
|
11
|
+
this._validateProps(this.getProps());
|
12
|
+
}
|
13
|
+
hostUpdate() {
|
14
|
+
const props = this.getProps();
|
15
|
+
if (this._propsHaveChanged(props)) {
|
16
|
+
this._validateProps(props);
|
17
|
+
}
|
18
|
+
}
|
19
|
+
_validateProps(props) {
|
20
|
+
try {
|
21
|
+
this.schema.validate(props);
|
22
|
+
}
|
23
|
+
catch (error) {
|
24
|
+
this.host.error = error;
|
25
|
+
}
|
26
|
+
this.previousProps = props;
|
27
|
+
}
|
28
|
+
_propsHaveChanged(newProps) {
|
29
|
+
return !deepEqual(newProps, this.previousProps);
|
30
|
+
}
|
31
|
+
}
|
package/dist/atomic/components/components/search/atomic-search-interface/atomic-search-interface.js
CHANGED
@@ -8,7 +8,7 @@ import { buildSearchEngine, buildSearchStatus, buildUrlManager, EcommerceDefault
|
|
8
8
|
import { provide } from '@lit/context';
|
9
9
|
import i18next from 'i18next';
|
10
10
|
import { css, html, LitElement } from 'lit';
|
11
|
-
import { customElement, property,
|
11
|
+
import { customElement, property, state } from 'lit/decorators.js';
|
12
12
|
import { when } from 'lit/directives/when.js';
|
13
13
|
import { InterfaceController, } from "../../common/interface/interface-controller";
|
14
14
|
import { MobileBreakpointController } from "../../common/layout/mobile-breakpoint-controller";
|
@@ -21,7 +21,6 @@ import { withTailwindStyles } from "../../../decorators/with-tailwind-styles.js"
|
|
21
21
|
import { ChildrenUpdateCompleteMixin } from "../../../mixins/children-update-complete-mixin";
|
22
22
|
import { markParentAsReady } from "../../../utils/init-queue";
|
23
23
|
import { SafeStorage, StorageItems, } from "../../../utils/local-storage-utils";
|
24
|
-
import "../atomic-relevance-inspector/atomic-relevance-inspector";
|
25
24
|
import { getAnalyticsConfig } from './analytics-config';
|
26
25
|
import { createSearchStore } from './store';
|
27
26
|
// TODO - Remove once all components that use atomic-modal have been migrated.
|
@@ -36,6 +35,7 @@ let AtomicSearchInterface = class AtomicSearchInterface extends ChildrenUpdateCo
|
|
36
35
|
constructor() {
|
37
36
|
super();
|
38
37
|
this.bindings = {};
|
38
|
+
this.relevanceInspectorIsOpen = false;
|
39
39
|
this.unsubscribeUrlManager = () => { };
|
40
40
|
this.unsubscribeSearchStatus = () => { };
|
41
41
|
this.initialized = false;
|
@@ -105,6 +105,11 @@ let AtomicSearchInterface = class AtomicSearchInterface extends ChildrenUpdateCo
|
|
105
105
|
this.handleInitialization = (event) => {
|
106
106
|
this.interfaceController.onComponentInitializing(event);
|
107
107
|
};
|
108
|
+
this.handleRelevanceInspectorDoubleClick = (e) => {
|
109
|
+
if (e.altKey) {
|
110
|
+
this.relevanceInspectorIsOpen = !this.relevanceInspectorIsOpen;
|
111
|
+
}
|
112
|
+
};
|
108
113
|
this.onHashChange = () => {
|
109
114
|
this.urlManager.synchronize(this.fragment);
|
110
115
|
};
|
@@ -117,8 +122,10 @@ let AtomicSearchInterface = class AtomicSearchInterface extends ChildrenUpdateCo
|
|
117
122
|
connectedCallback() {
|
118
123
|
super.connectedCallback();
|
119
124
|
this.store.setLoadingFlag(FirstSearchExecutedFlag);
|
125
|
+
this.initRelevanceInspector();
|
120
126
|
this.addEventListener('atomic/initializeComponent', this.handleInitialization);
|
121
127
|
this.addEventListener('atomic/scrollToTop', this.scrollToTop);
|
128
|
+
this.addEventListener('atomic/relevanceInspector/close', this.closeRelevanceInspector);
|
122
129
|
}
|
123
130
|
willUpdate(changedProperties) {
|
124
131
|
super.willUpdate(changedProperties);
|
@@ -137,6 +144,8 @@ let AtomicSearchInterface = class AtomicSearchInterface extends ChildrenUpdateCo
|
|
137
144
|
window.removeEventListener('hashchange', this.onHashChange);
|
138
145
|
this.removeEventListener('atomic/initializeComponent', this.handleInitialization);
|
139
146
|
this.removeEventListener('atomic/scrollToTop', this.scrollToTop);
|
147
|
+
this.removeEventListener('atomic/relevanceInspector/close', this.closeRelevanceInspector);
|
148
|
+
this.removeEventListener('dblclick', this.handleRelevanceInspectorDoubleClick);
|
140
149
|
}
|
141
150
|
// TODO - (v4) KIT-4991: Make private.
|
142
151
|
scrollToTop() {
|
@@ -147,13 +156,8 @@ let AtomicSearchInterface = class AtomicSearchInterface extends ChildrenUpdateCo
|
|
147
156
|
}
|
148
157
|
scrollContainerElement.scrollIntoView({ behavior: 'smooth' });
|
149
158
|
}
|
150
|
-
/**
|
151
|
-
* @deprecated provided for backward compatibility. set the 'open' property directly on the relevance inspector instead.
|
152
|
-
*/
|
153
159
|
closeRelevanceInspector() {
|
154
|
-
|
155
|
-
this.relevanceInspector.open = false;
|
156
|
-
}
|
160
|
+
this.relevanceInspectorIsOpen = false;
|
157
161
|
}
|
158
162
|
/**
|
159
163
|
* Initializes the connection with the headless search engine using options for `accessToken` (required), `organizationId` (required), `environment` (defaults to `prod`), and `renewAccessToken`.
|
@@ -310,6 +314,11 @@ let AtomicSearchInterface = class AtomicSearchInterface extends ChildrenUpdateCo
|
|
310
314
|
this.unsubscribeUrlManager = this.urlManager.subscribe(() => this.updateHash());
|
311
315
|
window.addEventListener('hashchange', this.onHashChange);
|
312
316
|
}
|
317
|
+
initRelevanceInspector() {
|
318
|
+
if (this.enableRelevanceInspector && !this.disableRelevanceInspector) {
|
319
|
+
this.addEventListener('dblclick', this.handleRelevanceInspectorDoubleClick);
|
320
|
+
}
|
321
|
+
}
|
313
322
|
initSearchStatus() {
|
314
323
|
this.searchStatus = buildSearchStatus(this.engine);
|
315
324
|
this.unsubscribeSearchStatus = this.searchStatus.subscribe(() => {
|
@@ -354,7 +363,10 @@ let AtomicSearchInterface = class AtomicSearchInterface extends ChildrenUpdateCo
|
|
354
363
|
return html `
|
355
364
|
${when(this.bindings?.engine &&
|
356
365
|
this.enableRelevanceInspector &&
|
357
|
-
!this.disableRelevanceInspector, () => html `<atomic-relevance-inspector
|
366
|
+
!this.disableRelevanceInspector, () => html `<atomic-relevance-inspector
|
367
|
+
?open=${this.relevanceInspectorIsOpen}
|
368
|
+
.bindings=${this.bindings}
|
369
|
+
></atomic-relevance-inspector>`)}
|
358
370
|
<slot></slot>
|
359
371
|
`;
|
360
372
|
}
|
@@ -370,8 +382,8 @@ __decorate([
|
|
370
382
|
state()
|
371
383
|
], AtomicSearchInterface.prototype, "error", void 0);
|
372
384
|
__decorate([
|
373
|
-
|
374
|
-
], AtomicSearchInterface.prototype, "
|
385
|
+
state()
|
386
|
+
], AtomicSearchInterface.prototype, "relevanceInspectorIsOpen", void 0);
|
375
387
|
__decorate([
|
376
388
|
property({
|
377
389
|
type: Array,
|
@@ -1,6 +1,5 @@
|
|
1
1
|
// Auto-generated file
|
2
2
|
export { AtomicQuerySummary } from './atomic-query-summary/atomic-query-summary.js';
|
3
|
-
export { AtomicRelevanceInspector } from './atomic-relevance-inspector/atomic-relevance-inspector.js';
|
4
3
|
export { AtomicResultsPerPage } from './atomic-results-per-page/atomic-results-per-page.js';
|
5
4
|
export { AtomicSearchInterface } from './atomic-search-interface/atomic-search-interface.js';
|
6
5
|
export { AtomicSearchLayout } from './atomic-search-layout/atomic-search-layout.js';
|
@@ -1,7 +1,6 @@
|
|
1
1
|
// Auto-generated file
|
2
2
|
export default {
|
3
3
|
'atomic-query-summary': async () => await import('./atomic-query-summary/atomic-query-summary.js'),
|
4
|
-
'atomic-relevance-inspector': async () => await import('./atomic-relevance-inspector/atomic-relevance-inspector.js'),
|
5
4
|
'atomic-results-per-page': async () => await import('./atomic-results-per-page/atomic-results-per-page.js'),
|
6
5
|
'atomic-search-interface': async () => await import('./atomic-search-interface/atomic-search-interface.js'),
|
7
6
|
'atomic-search-layout': async () => await import('./atomic-search-layout/atomic-search-layout.js'),
|
@@ -1 +1 @@
|
|
1
|
-
{"file":"index.js","mappings":"
|
1
|
+
{"file":"index.js","mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAGA;;;;;;;;;;;;SAYgB,cAAc,CAAoB,OAAgB;IAChE,OAAO,WAAW,CAAI,OAAO,EAAE,gBAAgB,CAAC,CAAC;AACnD;;MCHa,kBAAmB,SAAQ,KAAK;IAC3C,YAAY,WAAmB,EAAE,UAAkB;QACjD,KAAK,CACH,QAAQ,WAAW,sCAAsC,UAAU,YAAY,CAChF,CAAC;KACH;;;ACfH,MAAM,oBAAoB,GAAG,sBAAsB,CAAC;SAIpC,gBAAgB,CAAI,OAAgB,EAAE,UAAkB;IACtE,OAAO,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM;QACpC,MAAM,KAAK,GAAG,gBAAgB,CAC5B,oBAAoB,EACpB,CAAC,IAAO;YACN,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC;SACtB,CACF,CAAC;QACF,OAAO,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAE7B,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE;YACjC,MAAM,CACJ,IAAI,kBAAkB,CAAC,OAAO,CAAC,QAAQ,CAAC,WAAW,EAAE,EAAE,UAAU,CAAC,CACnE,CAAC;SACH;KACF,CAAC,CAAC;AACL;;ACoDA;;;;;;;;;;SAUgB,mBAAmB,CAAoB,OAAgB;IACrE,OAAO,gBAAgB,CAAI,OAAO,EAAE,gBAAgB,CAAC,CAAC;AACxD;;;;","names":[],"sources":["src/components/commerce/product-template-component-utils/stencil-product-template-decorators.tsx","src/components/common/item-list/context/item-context-controller.ts","src/components/common/item-list/fetch-item-context.ts","src/decorators/commerce/product-template-decorators.ts"],"sourcesContent":["import {Product} from '@coveo/headless/commerce';\nimport {itemContext} from '../../common/item-list/stencil-item-decorators';\n\n/**\n * Retrieves `Product` on a rendered `atomic-product`.\n *\n * This method is useful for building custom product template elements, see [Create a Product List](https://docs.coveo.com/en/atomic/latest/cc-search/create-custom-components/native-components/#custom-product-template-component-example) for more information.\n *\n * You should use the method in the [connectedCallback lifecycle method](https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_custom_elements#using_the_lifecycle_callbacks).\n *\n * @param element - The element that the event is dispatched to, which must be the child of a rendered \"atomic-product\".\n * @returns A promise that resolves on initialization of the parent \"atomic-product\" element, or rejects when there is no parent \"atomic-product\" element.\n *\n * @deprecated should only be used for Stencil components. For Lit components, use `fetchProductContext` from \\@/src/decorators/commerce/product-template-decorators.ts\n */\nexport function productContext<T extends Product>(element: Element) {\n return itemContext<T>(element, 'atomic-product');\n}\n","import type {LitElement, ReactiveController, ReactiveControllerHost} from 'lit';\nimport type {InitializableComponent} from '@/src/decorators/types.js';\nimport {buildCustomEvent} from '@/src/utils/event-utils';\n\ntype LitElementWithError = Omit<\n Pick<InitializableComponent, 'error'>,\n 'error'\n> &\n LitElement & {\n error: Error | null;\n };\n\nconst itemContextEventName = 'atomic/resolveResult';\n\nexport class MissingParentError extends Error {\n constructor(elementName: string, parentName: string) {\n super(\n `The \"${elementName}\" element must be the child of an \"${parentName}\" element.`\n );\n }\n}\n\nfunction extractFolded<T = Record<string, unknown>>(\n item: Record<string, unknown>,\n returnFolded: boolean\n): T {\n if (returnFolded) {\n if ('children' in item) {\n return item as T;\n } else {\n return {children: [], result: item} as T;\n }\n }\n\n if ('children' in item && 'result' in item) {\n return item.result as T;\n }\n return item as T;\n}\n\n/**\n * A reactive controller that manages item context data from parent components.\n * Handles fetching item data via custom events and manages error states.\n */\nexport class ItemContextController<T = Record<string, unknown>>\n implements ReactiveController\n{\n private host: ReactiveControllerHost & LitElementWithError;\n private parentName: string;\n private folded: boolean;\n private _item: T | null = null;\n private _error: MissingParentError | null = null;\n\n constructor(\n host: ReactiveControllerHost & LitElementWithError,\n options: {parentName?: string; folded?: boolean} = {}\n ) {\n this.host = host;\n this.parentName = options.parentName ?? 'atomic-result';\n this.folded = options.folded ?? false;\n host.addController(this);\n }\n\n get item(): T | null {\n return this._error ? null : this._item;\n }\n\n get error(): MissingParentError | null {\n return this._error;\n }\n\n get hasError(): boolean {\n return this._error !== null;\n }\n\n hostConnected(): void {\n this._resolveItemContext();\n }\n\n private _resolveItemContext(): void {\n const event = buildCustomEvent(\n itemContextEventName,\n (item: Record<string, unknown>) => {\n this._item = extractFolded<T>(item, this.folded);\n this._error = null;\n this.host.error = null;\n this.host.requestUpdate();\n }\n );\n\n const canceled = this.host.dispatchEvent(event);\n if (canceled) {\n const elementName = (this.host as Element).nodeName.toLowerCase();\n this._error = new MissingParentError(elementName, this.parentName);\n this._item = null;\n this.host.error = this._error;\n this.host.requestUpdate();\n }\n }\n}\n\ntype ItemContextEventHandler<T> = (item: T) => void;\nexport type ItemContextEvent<T> = CustomEvent<ItemContextEventHandler<T>>;\n","import {closest} from '../../../utils/dom-utils.js';\nimport {buildCustomEvent} from '../../../utils/event-utils.js';\nimport {MissingParentError} from './context/item-context-controller.js';\n\nconst itemContextEventName = 'atomic/resolveResult';\n\ntype ItemContextEventHandler<T> = (item: T) => void;\n\nexport function fetchItemContext<T>(element: Element, parentName: string) {\n return new Promise<T>((resolve, reject) => {\n const event = buildCustomEvent<ItemContextEventHandler<T>>(\n itemContextEventName,\n (item: T) => {\n return resolve(item);\n }\n );\n element.dispatchEvent(event);\n\n if (!closest(element, parentName)) {\n reject(\n new MissingParentError(element.nodeName.toLowerCase(), parentName)\n );\n }\n });\n}\n","import type {InteractiveProduct, Product} from '@coveo/headless/commerce';\nimport type {LitElement} from 'lit';\nimport {\n InteractiveItemContextController,\n type InteractiveItemContextEvent,\n} from '@/src/components/common/item-list/context/interactive-item-context-controller';\nimport {\n ItemContextController,\n type ItemContextEvent,\n} from '@/src/components/common/item-list/context/item-context-controller';\nimport {fetchItemContext} from '@/src/components/common/item-list/fetch-item-context';\n\n/**\n * Creates a [Lit reactive controller](https://lit.dev/docs/composition/controllers/) for managing product context in product template components.\n *\n * @param host - The Lit component instance\n * @param options - Configuration options\n * @returns ItemContextController instance configured for atomic-product\n *\n * @example\n * ```typescript\n * @customElement('my-product-component')\n * export class MyProductComponent extends LitElement {\n * private productController = createProductContextController(this);\n *\n * @state() product!: Product;\n *\n * render() {\n * this.product = this.productController.item;\n * return html`<div>${this.product?.ec_name}</div>`;\n * }\n * }\n * ```\n */\nexport function createProductContextController(\n host: LitElement & {error: Error | null},\n options: {folded?: boolean} = {}\n): ItemContextController<Product> {\n return new ItemContextController<Product>(host, {\n parentName: 'atomic-product',\n folded: options.folded ?? false,\n });\n}\n\n/**\n * Creates a [Lit reactive controller](https://lit.dev/docs/composition/controllers/) for managing interactive product context in product template components.\n *\n * @param host - The Lit component instance\n * @returns InteractiveItemContextController instance\n *\n * @example\n * ```typescript\n * @customElement('my-interactive-product-component')\n * export class MyInteractiveProductComponent extends LitElement {\n * private interactiveProductController = createInteractiveProductContextController(this);\n *\n * @state() product!: Product;\n *\n * render() {\n * this.product = this.interactiveProductController.interactiveItem;\n * return html`<div>${this.product?.ec_name}</div>`;\n * }\n * }\n * ```\n */\nexport function createInteractiveProductContextController(\n host: LitElement & {error: Error}\n): InteractiveItemContextController<InteractiveProduct> {\n return new InteractiveItemContextController<InteractiveProduct>(host);\n}\n\nexport type ProductContextEvent<T = Product> = ItemContextEvent<T>;\nexport type InteractiveProductContextEvent<\n T extends InteractiveProduct = InteractiveProduct,\n> = InteractiveItemContextEvent<T>;\n\n/**\n * Retrieves `Product` on a rendered `atomic-product`.\n *\n * This utility function is useful for building custom product template elements, see [Create a Product List](https://docs.coveo.com/en/atomic/latest/cc-search/create-custom-components/native-components/#custom-product-template-component-example) for more information.\n *\n * You should use the utility function in the [`connectedCallback` lifecycle method](https://developer.mozilla.org/en-US/docs/Web/Web_Components/Using_custom_elements#using_the_lifecycle_callbacks).\n *\n * @param element - The element that the event is dispatched to, which must be the child of a rendered `atomic-product`.\n * @returns A promise that resolves on initialization of the parent `atomic-product` element, or rejects when there is no parent `atomic-product` element.\n */\nexport function fetchProductContext<T extends Product>(element: Element) {\n return fetchItemContext<T>(element, 'atomic-product');\n}\n"],"version":3}
|
@@ -0,0 +1,35 @@
|
|
1
|
+
/**
|
2
|
+
* Performs a deep equality comparison between two values.
|
3
|
+
* Handles primitives, null/undefined, arrays, and objects.
|
4
|
+
*
|
5
|
+
* @param a - First value to compare
|
6
|
+
* @param b - Second value to compare
|
7
|
+
* @returns true if values are deeply equal, false otherwise
|
8
|
+
*/
|
9
|
+
export function deepEqual(a, b) {
|
10
|
+
if (a === b) {
|
11
|
+
return true;
|
12
|
+
}
|
13
|
+
if (a == null || b == null) {
|
14
|
+
return false;
|
15
|
+
}
|
16
|
+
if (typeof a !== typeof b) {
|
17
|
+
return false;
|
18
|
+
}
|
19
|
+
if (Array.isArray(a) && Array.isArray(b)) {
|
20
|
+
if (a.length !== b.length) {
|
21
|
+
return false;
|
22
|
+
}
|
23
|
+
return !a.some((item, index) => !deepEqual(item, b[index]));
|
24
|
+
}
|
25
|
+
if (typeof a === 'object' && typeof b === 'object') {
|
26
|
+
const aKeys = Object.keys(a);
|
27
|
+
const bKeys = Object.keys(b);
|
28
|
+
if (aKeys.length !== bKeys.length) {
|
29
|
+
return false;
|
30
|
+
}
|
31
|
+
return !aKeys.some((key) => !bKeys.includes(key) ||
|
32
|
+
!deepEqual(a[key], b[key]));
|
33
|
+
}
|
34
|
+
return false;
|
35
|
+
}
|