@spartacus/core
Version:
Spartacus - the core framework
78 lines • 12.3 kB
JavaScript
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==