UNPKG

@spartacus/core

Version:

Spartacus - the core framework

78 lines 12.3 kB
import { Injectable } from '@angular/core'; import { filter, map, pairwise } from 'rxjs/operators'; import { createFrom } from '../../util/create-from'; import { FacetChangedEvent } from './product.events'; import * as i0 from "@angular/core"; import * as i1 from "../../event/event.service"; import * as i2 from "../facade/product-search.service"; export class ProductEventBuilder { constructor(eventService, productSearchService) { this.eventService = eventService; this.productSearchService = productSearchService; this.register(); } register() { this.eventService.register(FacetChangedEvent, this.buildFacetChangedEvent()); } /** * To get the changed facet, we need to compare the product search results * got before and after toggling the facet value. These 2 product searches must * have the same search queries except one different solr filter term. That means * these 2 searches must have the same 'freeTextSearch'; and if they are category * searches, they must have the same root (in the same category or brand). */ buildFacetChangedEvent() { return this.productSearchService.getResults().pipe(pairwise(), filter(([prev, curr]) => this.compareSearchResults(prev, curr)), map(([prev, curr]) => { const toggled = this.getToggledBreadcrumb(curr.breadcrumbs, prev.breadcrumbs) || this.getToggledBreadcrumb(prev.breadcrumbs, curr.breadcrumbs); if (toggled) { return createFrom(FacetChangedEvent, { code: toggled.facetCode, name: toggled.facetName, valueCode: toggled.facetValueCode, valueName: toggled.facetValueName, selected: curr.breadcrumbs.length > prev.breadcrumbs.length, }); } })); } /** * The 2 product searches (before and after facet changed) must have the same * search queries; and if they are category searches, they also must have the * same root (in the same category or brand). */ compareSearchResults(prev, curr) { var _a, _b, _c; if (prev && Object.keys(prev).length !== 0) { // for text searches, they must have the same freeTextSearch const sameFreeTextSearch = prev.freeTextSearch !== '' && prev.freeTextSearch === curr.freeTextSearch; // for category searches, they must have the same root const sameCategoryRoot = ((_a = curr.breadcrumbs[0]) === null || _a === void 0 ? void 0 : _a.facetCode) === 'allCategories' && ((_b = prev.breadcrumbs[0]) === null || _b === void 0 ? void 0 : _b.facetCode) === ((_c = curr.breadcrumbs[0]) === null || _c === void 0 ? void 0 : _c.facetCode) && // same category or brand prev.breadcrumbs[0].facetValueCode === curr.breadcrumbs[0].facetValueCode; return sameFreeTextSearch || sameCategoryRoot; } } /** * Get the toggled breadcrumb. The 2 breadcrumb lists got from the 2 search results * only can have one different solr filter term. */ getToggledBreadcrumb(bc1, bc2) { if (bc1.length - bc2.length === 1) { return bc1.find((x) => !bc2.find((y) => y.facetCode === x.facetCode && y.facetValueCode === x.facetValueCode)); } } } ProductEventBuilder.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: ProductEventBuilder, deps: [{ token: i1.EventService }, { token: i2.ProductSearchService }], target: i0.ɵɵFactoryTarget.Injectable }); ProductEventBuilder.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: ProductEventBuilder, providedIn: 'root' }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "12.0.5", ngImport: i0, type: ProductEventBuilder, decorators: [{ type: Injectable, args: [{ providedIn: 'root', }] }], ctorParameters: function () { return [{ type: i1.EventService }, { type: i2.ProductSearchService }]; } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZHVjdC1ldmVudC5idWlsZGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY29yZS9zcmMvcHJvZHVjdC9ldmVudC9wcm9kdWN0LWV2ZW50LmJ1aWxkZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUUzQyxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQU12RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFFcEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sa0JBQWtCLENBQUM7Ozs7QUFLckQsTUFBTSxPQUFPLG1CQUFtQjtJQUM5QixZQUNZLFlBQTBCLEVBQzFCLG9CQUEwQztRQUQxQyxpQkFBWSxHQUFaLFlBQVksQ0FBYztRQUMxQix5QkFBb0IsR0FBcEIsb0JBQW9CLENBQXNCO1FBRXBELElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztJQUNsQixDQUFDO0lBRVMsUUFBUTtRQUNoQixJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FDeEIsaUJBQWlCLEVBQ2pCLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUM5QixDQUFDO0lBQ0osQ0FBQztJQUVEOzs7Ozs7T0FNRztJQUNPLHNCQUFzQjtRQUM5QixPQUFPLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxVQUFVLEVBQUUsQ0FBQyxJQUFJLENBQ2hELFFBQVEsRUFBRSxFQUNWLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLEVBQy9ELEdBQUcsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUU7WUFDbkIsTUFBTSxPQUFPLEdBQ1gsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQztnQkFDN0QsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQ2hFLElBQUksT0FBTyxFQUFFO2dCQUNYLE9BQU8sVUFBVSxDQUFDLGlCQUFpQixFQUFFO29CQUNuQyxJQUFJLEVBQUUsT0FBTyxDQUFDLFNBQVM7b0JBQ3ZCLElBQUksRUFBRSxPQUFPLENBQUMsU0FBUztvQkFDdkIsU0FBUyxFQUFFLE9BQU8sQ0FBQyxjQUFjO29CQUNqQyxTQUFTLEVBQUUsT0FBTyxDQUFDLGNBQWM7b0JBQ2pDLFFBQVEsRUFBRSxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU07aUJBQzVELENBQUMsQ0FBQzthQUNKO1FBQ0gsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ssb0JBQW9CLENBQzFCLElBQXVCLEVBQ3ZCLElBQXVCOztRQUV2QixJQUFJLElBQUksSUFBSSxNQUFNLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDMUMsNERBQTREO1lBQzVELE1BQU0sa0JBQWtCLEdBQ3RCLElBQUksQ0FBQyxjQUFjLEtBQUssRUFBRTtnQkFDMUIsSUFBSSxDQUFDLGNBQWMsS0FBSyxJQUFJLENBQUMsY0FBYyxDQUFDO1lBRTlDLHNEQUFzRDtZQUN0RCxNQUFNLGdCQUFnQixHQUNwQixDQUFBLE1BQUEsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsMENBQUUsU0FBUyxNQUFLLGVBQWU7Z0JBQ2xELENBQUEsTUFBQSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQywwQ0FBRSxTQUFTLE9BQUssTUFBQSxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQywwQ0FBRSxTQUFTLENBQUE7Z0JBQ2pFLHlCQUF5QjtnQkFDekIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxjQUFjO29CQUNoQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLGNBQWMsQ0FBQztZQUV2QyxPQUFPLGtCQUFrQixJQUFJLGdCQUFnQixDQUFDO1NBQy9DO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNLLG9CQUFvQixDQUMxQixHQUFpQixFQUNqQixHQUFpQjtRQUVqQixJQUFJLEdBQUcsQ0FBQyxNQUFNLEdBQUcsR0FBRyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDakMsT0FBTyxHQUFHLENBQUMsSUFBSSxDQUNiLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FDSixDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQ1AsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUNKLENBQUMsQ0FBQyxTQUFTLEtBQUssQ0FBQyxDQUFDLFNBQVM7Z0JBQzNCLENBQUMsQ0FBQyxjQUFjLEtBQUssQ0FBQyxDQUFDLGNBQWMsQ0FDeEMsQ0FDSixDQUFDO1NBQ0g7SUFDSCxDQUFDOztnSEF4RlUsbUJBQW1CO29IQUFuQixtQkFBbUIsY0FGbEIsTUFBTTsyRkFFUCxtQkFBbUI7a0JBSC9CLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgZmlsdGVyLCBtYXAsIHBhaXJ3aXNlIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgRXZlbnRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vZXZlbnQvZXZlbnQuc2VydmljZSc7XG5pbXBvcnQge1xuICBCcmVhZGNydW1iLFxuICBQcm9kdWN0U2VhcmNoUGFnZSxcbn0gZnJvbSAnLi4vLi4vbW9kZWwvcHJvZHVjdC1zZWFyY2gubW9kZWwnO1xuaW1wb3J0IHsgY3JlYXRlRnJvbSB9IGZyb20gJy4uLy4uL3V0aWwvY3JlYXRlLWZyb20nO1xuaW1wb3J0IHsgUHJvZHVjdFNlYXJjaFNlcnZpY2UgfSBmcm9tICcuLi9mYWNhZGUvcHJvZHVjdC1zZWFyY2guc2VydmljZSc7XG5pbXBvcnQgeyBGYWNldENoYW5nZWRFdmVudCB9IGZyb20gJy4vcHJvZHVjdC5ldmVudHMnO1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290Jyxcbn0pXG5leHBvcnQgY2xhc3MgUHJvZHVjdEV2ZW50QnVpbGRlciB7XG4gIGNvbnN0cnVjdG9yKFxuICAgIHByb3RlY3RlZCBldmVudFNlcnZpY2U6IEV2ZW50U2VydmljZSxcbiAgICBwcm90ZWN0ZWQgcHJvZHVjdFNlYXJjaFNlcnZpY2U6IFByb2R1Y3RTZWFyY2hTZXJ2aWNlXG4gICkge1xuICAgIHRoaXMucmVnaXN0ZXIoKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZWdpc3RlcigpOiB2b2lkIHtcbiAgICB0aGlzLmV2ZW50U2VydmljZS5yZWdpc3RlcihcbiAgICAgIEZhY2V0Q2hhbmdlZEV2ZW50LFxuICAgICAgdGhpcy5idWlsZEZhY2V0Q2hhbmdlZEV2ZW50KClcbiAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIFRvIGdldCB0aGUgY2hhbmdlZCBmYWNldCwgd2UgbmVlZCB0byBjb21wYXJlIHRoZSBwcm9kdWN0IHNlYXJjaCByZXN1bHRzXG4gICAqIGdvdCBiZWZvcmUgYW5kIGFmdGVyIHRvZ2dsaW5nIHRoZSBmYWNldCB2YWx1ZS4gVGhlc2UgMiBwcm9kdWN0IHNlYXJjaGVzIG11c3RcbiAgICogaGF2ZSB0aGUgc2FtZSBzZWFyY2ggcXVlcmllcyBleGNlcHQgb25lIGRpZmZlcmVudCBzb2xyIGZpbHRlciB0ZXJtLiBUaGF0IG1lYW5zXG4gICAqIHRoZXNlIDIgc2VhcmNoZXMgbXVzdCBoYXZlIHRoZSBzYW1lICdmcmVlVGV4dFNlYXJjaCc7IGFuZCBpZiB0aGV5IGFyZSBjYXRlZ29yeVxuICAgKiBzZWFyY2hlcywgdGhleSBtdXN0IGhhdmUgdGhlIHNhbWUgcm9vdCAoaW4gdGhlIHNhbWUgY2F0ZWdvcnkgb3IgYnJhbmQpLlxuICAgKi9cbiAgcHJvdGVjdGVkIGJ1aWxkRmFjZXRDaGFuZ2VkRXZlbnQoKTogT2JzZXJ2YWJsZTxGYWNldENoYW5nZWRFdmVudD4ge1xuICAgIHJldHVybiB0aGlzLnByb2R1Y3RTZWFyY2hTZXJ2aWNlLmdldFJlc3VsdHMoKS5waXBlKFxuICAgICAgcGFpcndpc2UoKSxcbiAgICAgIGZpbHRlcigoW3ByZXYsIGN1cnJdKSA9PiB0aGlzLmNvbXBhcmVTZWFyY2hSZXN1bHRzKHByZXYsIGN1cnIpKSxcbiAgICAgIG1hcCgoW3ByZXYsIGN1cnJdKSA9PiB7XG4gICAgICAgIGNvbnN0IHRvZ2dsZWQgPVxuICAgICAgICAgIHRoaXMuZ2V0VG9nZ2xlZEJyZWFkY3J1bWIoY3Vyci5icmVhZGNydW1icywgcHJldi5icmVhZGNydW1icykgfHxcbiAgICAgICAgICB0aGlzLmdldFRvZ2dsZWRCcmVhZGNydW1iKHByZXYuYnJlYWRjcnVtYnMsIGN1cnIuYnJlYWRjcnVtYnMpO1xuICAgICAgICBpZiAodG9nZ2xlZCkge1xuICAgICAgICAgIHJldHVybiBjcmVhdGVGcm9tKEZhY2V0Q2hhbmdlZEV2ZW50LCB7XG4gICAgICAgICAgICBjb2RlOiB0b2dnbGVkLmZhY2V0Q29kZSxcbiAgICAgICAgICAgIG5hbWU6IHRvZ2dsZWQuZmFjZXROYW1lLFxuICAgICAgICAgICAgdmFsdWVDb2RlOiB0b2dnbGVkLmZhY2V0VmFsdWVDb2RlLFxuICAgICAgICAgICAgdmFsdWVOYW1lOiB0b2dnbGVkLmZhY2V0VmFsdWVOYW1lLFxuICAgICAgICAgICAgc2VsZWN0ZWQ6IGN1cnIuYnJlYWRjcnVtYnMubGVuZ3RoID4gcHJldi5icmVhZGNydW1icy5sZW5ndGgsXG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBUaGUgMiBwcm9kdWN0IHNlYXJjaGVzIChiZWZvcmUgYW5kIGFmdGVyIGZhY2V0IGNoYW5nZWQpIG11c3QgaGF2ZSB0aGUgc2FtZVxuICAgKiBzZWFyY2ggcXVlcmllczsgYW5kIGlmIHRoZXkgYXJlIGNhdGVnb3J5IHNlYXJjaGVzLCB0aGV5IGFsc28gbXVzdCBoYXZlIHRoZVxuICAgKiBzYW1lIHJvb3QgKGluIHRoZSBzYW1lIGNhdGVnb3J5IG9yIGJyYW5kKS5cbiAgICovXG4gIHByaXZhdGUgY29tcGFyZVNlYXJjaFJlc3VsdHMoXG4gICAgcHJldjogUHJvZHVjdFNlYXJjaFBhZ2UsXG4gICAgY3VycjogUHJvZHVjdFNlYXJjaFBhZ2VcbiAgKTogYm9vbGVhbiB7XG4gICAgaWYgKHByZXYgJiYgT2JqZWN0LmtleXMocHJldikubGVuZ3RoICE9PSAwKSB7XG4gICAgICAvLyBmb3IgdGV4dCBzZWFyY2hlcywgdGhleSBtdXN0IGhhdmUgdGhlIHNhbWUgZnJlZVRleHRTZWFyY2hcbiAgICAgIGNvbnN0IHNhbWVGcmVlVGV4dFNlYXJjaCA9XG4gICAgICAgIHByZXYuZnJlZVRleHRTZWFyY2ggIT09ICcnICYmXG4gICAgICAgIHByZXYuZnJlZVRleHRTZWFyY2ggPT09IGN1cnIuZnJlZVRleHRTZWFyY2g7XG5cbiAgICAgIC8vIGZvciBjYXRlZ29yeSBzZWFyY2hlcywgdGhleSBtdXN0IGhhdmUgdGhlIHNhbWUgcm9vdFxuICAgICAgY29uc3Qgc2FtZUNhdGVnb3J5Um9vdCA9XG4gICAgICAgIGN1cnIuYnJlYWRjcnVtYnNbMF0/LmZhY2V0Q29kZSA9PT0gJ2FsbENhdGVnb3JpZXMnICYmXG4gICAgICAgIHByZXYuYnJlYWRjcnVtYnNbMF0/LmZhY2V0Q29kZSA9PT0gY3Vyci5icmVhZGNydW1ic1swXT8uZmFjZXRDb2RlICYmXG4gICAgICAgIC8vIHNhbWUgY2F0ZWdvcnkgb3IgYnJhbmRcbiAgICAgICAgcHJldi5icmVhZGNydW1ic1swXS5mYWNldFZhbHVlQ29kZSA9PT1cbiAgICAgICAgICBjdXJyLmJyZWFkY3J1bWJzWzBdLmZhY2V0VmFsdWVDb2RlO1xuXG4gICAgICByZXR1cm4gc2FtZUZyZWVUZXh0U2VhcmNoIHx8IHNhbWVDYXRlZ29yeVJvb3Q7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCB0aGUgdG9nZ2xlZCBicmVhZGNydW1iLiBUaGUgMiBicmVhZGNydW1iIGxpc3RzIGdvdCBmcm9tIHRoZSAyIHNlYXJjaCByZXN1bHRzXG4gICAqIG9ubHkgY2FuIGhhdmUgb25lIGRpZmZlcmVudCBzb2xyIGZpbHRlciB0ZXJtLlxuICAgKi9cbiAgcHJpdmF0ZSBnZXRUb2dnbGVkQnJlYWRjcnVtYihcbiAgICBiYzE6IEJyZWFkY3J1bWJbXSxcbiAgICBiYzI6IEJyZWFkY3J1bWJbXVxuICApOiBCcmVhZGNydW1iIHtcbiAgICBpZiAoYmMxLmxlbmd0aCAtIGJjMi5sZW5ndGggPT09IDEpIHtcbiAgICAgIHJldHVybiBiYzEuZmluZChcbiAgICAgICAgKHgpID0+XG4gICAgICAgICAgIWJjMi5maW5kKFxuICAgICAgICAgICAgKHkpID0+XG4gICAgICAgICAgICAgIHkuZmFjZXRDb2RlID09PSB4LmZhY2V0Q29kZSAmJlxuICAgICAgICAgICAgICB5LmZhY2V0VmFsdWVDb2RlID09PSB4LmZhY2V0VmFsdWVDb2RlXG4gICAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG4gIH1cbn1cbiJdfQ==