angular-instantsearch
Version:
Lightning-fast search for Angular apps, by Algolia.
106 lines (105 loc) • 10.8 kB
JavaScript
import { Component, Input, Inject, forwardRef, Optional } from '@angular/core';
import { connectMenu } from 'instantsearch.js/es/connectors';
import { TypedBaseWidget } from '../typed-base-widget';
import { NgAisInstantSearch } from '../instantsearch/instantsearch';
import { NgAisIndex } from '../index-widget/index-widget';
import { noop } from '../utils';
export class NgAisMenu extends TypedBaseWidget {
constructor(parentIndex, instantSearchInstance) {
super('Menu');
this.parentIndex = parentIndex;
this.instantSearchInstance = instantSearchInstance;
// rendering options
this.showMoreLabel = 'Show more';
this.showLessLabel = 'Show less';
this.state = {
items: [],
refine: noop,
createURL: () => '#',
canRefine: false,
isShowingMore: false,
canToggleShowMore: false,
toggleShowMore: noop,
sendEvent: noop,
};
}
get isHidden() {
return this.state.items.length === 0 && this.autoHideContainer;
}
get showMoreClass() {
let className = this.cx('showMore');
if (!this.state.canToggleShowMore) {
className = `${className} ${this.cx('showMore', 'disabled')}`;
}
return className;
}
ngOnInit() {
this.createWidget(connectMenu, {
attribute: this.attribute,
showMore: this.showMore,
limit: this.limit,
showMoreLimit: this.showMoreLimit,
sortBy: this.sortBy,
transformItems: this.transformItems,
}, {
$$widgetType: 'ais.menu',
});
super.ngOnInit();
}
handleClick(event, value) {
event.preventDefault();
event.stopPropagation();
this.state.refine(value);
}
}
NgAisMenu.decorators = [
{ type: Component, args: [{
selector: 'ais-menu',
template: `
<div
[class]="cx()"
*ngIf="!isHidden"
>
<ul [class]="cx('list')">
<li
[class]="getItemClass(item)"
*ngFor="let item of state.items"
(click)="handleClick($event, item.value)"
>
<a
href="{{state.createURL(item.value)}}"
[class]="cx('link')"
(click)="handleClick($event, item.value)"
>
<span [class]="cx('label')">{{item.label}}</span>
<span [class]="cx('count')">{{item.count}}</span>
</a>
</li>
</ul>
<button
*ngIf="showMore"
(click)="state.toggleShowMore()"
[class]="showMoreClass"
[disabled]="!state.canToggleShowMore"
>
{{state.isShowingMore ? showLessLabel : showMoreLabel}}
</button>
</div>
`
},] }
];
NgAisMenu.ctorParameters = () => [
{ type: NgAisIndex, decorators: [{ type: Inject, args: [forwardRef(() => NgAisIndex),] }, { type: Optional }] },
{ type: NgAisInstantSearch, decorators: [{ type: Inject, args: [forwardRef(() => NgAisInstantSearch),] }] }
];
NgAisMenu.propDecorators = {
showMoreLabel: [{ type: Input }],
showLessLabel: [{ type: Input }],
attribute: [{ type: Input }],
showMore: [{ type: Input }],
limit: [{ type: Input }],
showMoreLimit: [{ type: Input }],
sortBy: [{ type: Input }],
transformItems: [{ type: Input }]
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVudS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tZW51L21lbnUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxLQUFLLEVBQUUsTUFBTSxFQUFFLFVBQVUsRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFL0UsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdDQUFnQyxDQUFDO0FBQzdELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUN2RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNwRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDMUQsT0FBTyxFQUFFLElBQUksRUFBRSxNQUFNLFVBQVUsQ0FBQztBQTJDaEMsTUFBTSxPQUFPLFNBQVUsU0FBUSxlQUc5QjtJQXNDQyxZQUdTLFdBQXVCLEVBRXZCLHFCQUF5QztRQUVoRCxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUM7UUFKUCxnQkFBVyxHQUFYLFdBQVcsQ0FBWTtRQUV2QiwwQkFBcUIsR0FBckIscUJBQXFCLENBQW9CO1FBMUNsRCxvQkFBb0I7UUFDSixrQkFBYSxHQUFXLFdBQVcsQ0FBQztRQUNwQyxrQkFBYSxHQUFXLFdBQVcsQ0FBQztRQVU3QyxVQUFLLEdBQW9CO1lBQzlCLEtBQUssRUFBRSxFQUFFO1lBQ1QsTUFBTSxFQUFFLElBQUk7WUFDWixTQUFTLEVBQUUsR0FBRyxFQUFFLENBQUMsR0FBRztZQUNwQixTQUFTLEVBQUUsS0FBSztZQUNoQixhQUFhLEVBQUUsS0FBSztZQUNwQixpQkFBaUIsRUFBRSxLQUFLO1lBQ3hCLGNBQWMsRUFBRSxJQUFJO1lBQ3BCLFNBQVMsRUFBRSxJQUFJO1NBQ2hCLENBQUM7SUF3QkYsQ0FBQztJQXRCRCxJQUFJLFFBQVE7UUFDVixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLElBQUksSUFBSSxDQUFDLGlCQUFpQixDQUFDO0lBQ2pFLENBQUM7SUFFRCxJQUFJLGFBQWE7UUFDZixJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRXBDLElBQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGlCQUFpQixFQUFFO1lBQ2pDLFNBQVMsR0FBRyxHQUFHLFNBQVMsSUFBSSxJQUFJLENBQUMsRUFBRSxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsRUFBRSxDQUFDO1NBQy9EO1FBRUQsT0FBTyxTQUFTLENBQUM7SUFDbkIsQ0FBQztJQVlNLFFBQVE7UUFDYixJQUFJLENBQUMsWUFBWSxDQUNmLFdBQVcsRUFDWDtZQUNFLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztZQUN6QixRQUFRLEVBQUUsSUFBSSxDQUFDLFFBQVE7WUFDdkIsS0FBSyxFQUFFLElBQUksQ0FBQyxLQUFLO1lBQ2pCLGFBQWEsRUFBRSxJQUFJLENBQUMsYUFBYTtZQUNqQyxNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07WUFDbkIsY0FBYyxFQUFFLElBQUksQ0FBQyxjQUFjO1NBQ3BDLEVBQ0Q7WUFDRSxZQUFZLEVBQUUsVUFBVTtTQUN6QixDQUNGLENBQUM7UUFFRixLQUFLLENBQUMsUUFBUSxFQUFFLENBQUM7SUFDbkIsQ0FBQztJQUVELFdBQVcsQ0FBQyxLQUFpQixFQUFFLEtBQXdCO1FBQ3JELEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN2QixLQUFLLENBQUMsZUFBZSxFQUFFLENBQUM7UUFFeEIsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDM0IsQ0FBQzs7O1lBOUdGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsVUFBVTtnQkFDcEIsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0dBK0JUO2FBQ0Y7OztZQTNDUSxVQUFVLHVCQXNGZCxNQUFNLFNBQUMsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLFVBQVUsQ0FBQyxjQUNuQyxRQUFRO1lBeEZKLGtCQUFrQix1QkEwRnRCLE1BQU0sU0FBQyxVQUFVLENBQUMsR0FBRyxFQUFFLENBQUMsa0JBQWtCLENBQUM7Ozs0QkF4QzdDLEtBQUs7NEJBQ0wsS0FBSzt3QkFHTCxLQUFLO3VCQUNMLEtBQUs7b0JBQ0wsS0FBSzs0QkFDTCxLQUFLO3FCQUNMLEtBQUs7NkJBQ0wsS0FBSyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgSW5wdXQsIEluamVjdCwgZm9yd2FyZFJlZiwgT3B0aW9uYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgY29ubmVjdE1lbnUgfSBmcm9tICdpbnN0YW50c2VhcmNoLmpzL2VzL2Nvbm5lY3RvcnMnO1xuaW1wb3J0IHsgVHlwZWRCYXNlV2lkZ2V0IH0gZnJvbSAnLi4vdHlwZWQtYmFzZS13aWRnZXQnO1xuaW1wb3J0IHsgTmdBaXNJbnN0YW50U2VhcmNoIH0gZnJvbSAnLi4vaW5zdGFudHNlYXJjaC9pbnN0YW50c2VhcmNoJztcbmltcG9ydCB7IE5nQWlzSW5kZXggfSBmcm9tICcuLi9pbmRleC13aWRnZXQvaW5kZXgtd2lkZ2V0JztcbmltcG9ydCB7IG5vb3AgfSBmcm9tICcuLi91dGlscyc7XG5pbXBvcnQge1xuICBNZW51Q29ubmVjdG9yUGFyYW1zLFxuICBNZW51V2lkZ2V0RGVzY3JpcHRpb24sXG4gIE1lbnVSZW5kZXJTdGF0ZSxcbiAgTWVudUl0ZW0sXG59IGZyb20gJ2luc3RhbnRzZWFyY2guanMvZXMvY29ubmVjdG9ycy9tZW51L2Nvbm5lY3RNZW51JztcblxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnYWlzLW1lbnUnLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXZcbiAgICAgIFtjbGFzc109XCJjeCgpXCJcbiAgICAgICpuZ0lmPVwiIWlzSGlkZGVuXCJcbiAgICA+XG4gICAgICA8dWwgW2NsYXNzXT1cImN4KCdsaXN0JylcIj5cbiAgICAgICAgPGxpXG4gICAgICAgICAgW2NsYXNzXT1cImdldEl0ZW1DbGFzcyhpdGVtKVwiXG4gICAgICAgICAgKm5nRm9yPVwibGV0IGl0ZW0gb2Ygc3RhdGUuaXRlbXNcIlxuICAgICAgICAgIChjbGljayk9XCJoYW5kbGVDbGljaygkZXZlbnQsIGl0ZW0udmFsdWUpXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxhXG4gICAgICAgICAgICBocmVmPVwie3tzdGF0ZS5jcmVhdGVVUkwoaXRlbS52YWx1ZSl9fVwiXG4gICAgICAgICAgICBbY2xhc3NdPVwiY3goJ2xpbmsnKVwiXG4gICAgICAgICAgICAoY2xpY2spPVwiaGFuZGxlQ2xpY2soJGV2ZW50LCBpdGVtLnZhbHVlKVwiXG4gICAgICAgICAgPlxuICAgICAgICAgICAgPHNwYW4gW2NsYXNzXT1cImN4KCdsYWJlbCcpXCI+e3tpdGVtLmxhYmVsfX08L3NwYW4+XG4gICAgICAgICAgICA8c3BhbiBbY2xhc3NdPVwiY3goJ2NvdW50JylcIj57e2l0ZW0uY291bnR9fTwvc3Bhbj5cbiAgICAgICAgICA8L2E+XG4gICAgICAgIDwvbGk+XG4gICAgICA8L3VsPlxuXG4gICAgICA8YnV0dG9uXG4gICAgICAgICpuZ0lmPVwic2hvd01vcmVcIlxuICAgICAgICAoY2xpY2spPVwic3RhdGUudG9nZ2xlU2hvd01vcmUoKVwiXG4gICAgICAgIFtjbGFzc109XCJzaG93TW9yZUNsYXNzXCJcbiAgICAgICAgW2Rpc2FibGVkXT1cIiFzdGF0ZS5jYW5Ub2dnbGVTaG93TW9yZVwiXG4gICAgICA+XG4gICAgICAgIHt7c3RhdGUuaXNTaG93aW5nTW9yZSA/IHNob3dMZXNzTGFiZWwgOiBzaG93TW9yZUxhYmVsfX1cbiAgICAgIDwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICBgLFxufSlcbmV4cG9ydCBjbGFzcyBOZ0Fpc01lbnUgZXh0ZW5kcyBUeXBlZEJhc2VXaWRnZXQ8XG4gIE1lbnVXaWRnZXREZXNjcmlwdGlvbixcbiAgTWVudUNvbm5lY3RvclBhcmFtc1xuPiB7XG4gIC8vIHJlbmRlcmluZyBvcHRpb25zXG4gIEBJbnB1dCgpIHB1YmxpYyBzaG93TW9yZUxhYmVsOiBzdHJpbmcgPSAnU2hvdyBtb3JlJztcbiAgQElucHV0KCkgcHVibGljIHNob3dMZXNzTGFiZWw6IHN0cmluZyA9ICdTaG93IGxlc3MnO1xuXG4gIC8vIGluc3RhbmNlIG9wdGlvbnNcbiAgQElucHV0KCkgcHVibGljIGF0dHJpYnV0ZTogTWVudUNvbm5lY3RvclBhcmFtc1snYXR0cmlidXRlJ107XG4gIEBJbnB1dCgpIHB1YmxpYyBzaG93TW9yZT86IE1lbnVDb25uZWN0b3JQYXJhbXNbJ3Nob3dNb3JlJ107XG4gIEBJbnB1dCgpIHB1YmxpYyBsaW1pdD86IE1lbnVDb25uZWN0b3JQYXJhbXNbJ2xpbWl0J107XG4gIEBJbnB1dCgpIHB1YmxpYyBzaG93TW9yZUxpbWl0PzogTWVudUNvbm5lY3RvclBhcmFtc1snc2hvd01vcmVMaW1pdCddO1xuICBASW5wdXQoKSBwdWJsaWMgc29ydEJ5PzogTWVudUNvbm5lY3RvclBhcmFtc1snc29ydEJ5J107XG4gIEBJbnB1dCgpIHB1YmxpYyB0cmFuc2Zvcm1JdGVtcz86IE1lbnVDb25uZWN0b3JQYXJhbXNbJ3RyYW5zZm9ybUl0ZW1zJ107XG5cbiAgcHVibGljIHN0YXRlOiBNZW51UmVuZGVyU3RhdGUgPSB7XG4gICAgaXRlbXM6IFtdLFxuICAgIHJlZmluZTogbm9vcCxcbiAgICBjcmVhdGVVUkw6ICgpID0+ICcjJyxcbiAgICBjYW5SZWZpbmU6IGZhbHNlLFxuICAgIGlzU2hvd2luZ01vcmU6IGZhbHNlLFxuICAgIGNhblRvZ2dsZVNob3dNb3JlOiBmYWxzZSxcbiAgICB0b2dnbGVTaG93TW9yZTogbm9vcCxcbiAgICBzZW5kRXZlbnQ6IG5vb3AsXG4gIH07XG5cbiAgZ2V0IGlzSGlkZGVuKCkge1xuICAgIHJldHVybiB0aGlzLnN0YXRlLml0ZW1zLmxlbmd0aCA9PT0gMCAmJiB0aGlzLmF1dG9IaWRlQ29udGFpbmVyO1xuICB9XG5cbiAgZ2V0IHNob3dNb3JlQ2xhc3MoKSB7XG4gICAgbGV0IGNsYXNzTmFtZSA9IHRoaXMuY3goJ3Nob3dNb3JlJyk7XG5cbiAgICBpZiAoIXRoaXMuc3RhdGUuY2FuVG9nZ2xlU2hvd01vcmUpIHtcbiAgICAgIGNsYXNzTmFtZSA9IGAke2NsYXNzTmFtZX0gJHt0aGlzLmN4KCdzaG93TW9yZScsICdkaXNhYmxlZCcpfWA7XG4gICAgfVxuXG4gICAgcmV0dXJuIGNsYXNzTmFtZTtcbiAgfVxuXG4gIGNvbnN0cnVjdG9yKFxuICAgIEBJbmplY3QoZm9yd2FyZFJlZigoKSA9PiBOZ0Fpc0luZGV4KSlcbiAgICBAT3B0aW9uYWwoKVxuICAgIHB1YmxpYyBwYXJlbnRJbmRleDogTmdBaXNJbmRleCxcbiAgICBASW5qZWN0KGZvcndhcmRSZWYoKCkgPT4gTmdBaXNJbnN0YW50U2VhcmNoKSlcbiAgICBwdWJsaWMgaW5zdGFudFNlYXJjaEluc3RhbmNlOiBOZ0Fpc0luc3RhbnRTZWFyY2hcbiAgKSB7XG4gICAgc3VwZXIoJ01lbnUnKTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpIHtcbiAgICB0aGlzLmNyZWF0ZVdpZGdldChcbiAgICAgIGNvbm5lY3RNZW51LFxuICAgICAge1xuICAgICAgICBhdHRyaWJ1dGU6IHRoaXMuYXR0cmlidXRlLFxuICAgICAgICBzaG93TW9yZTogdGhpcy5zaG93TW9yZSxcbiAgICAgICAgbGltaXQ6IHRoaXMubGltaXQsXG4gICAgICAgIHNob3dNb3JlTGltaXQ6IHRoaXMuc2hvd01vcmVMaW1pdCxcbiAgICAgICAgc29ydEJ5OiB0aGlzLnNvcnRCeSxcbiAgICAgICAgdHJhbnNmb3JtSXRlbXM6IHRoaXMudHJhbnNmb3JtSXRlbXMsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICAkJHdpZGdldFR5cGU6ICdhaXMubWVudScsXG4gICAgICB9XG4gICAgKTtcblxuICAgIHN1cGVyLm5nT25Jbml0KCk7XG4gIH1cblxuICBoYW5kbGVDbGljayhldmVudDogTW91c2VFdmVudCwgdmFsdWU6IE1lbnVJdGVtWyd2YWx1ZSddKSB7XG4gICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgIHRoaXMuc3RhdGUucmVmaW5lKHZhbHVlKTtcbiAgfVxufVxuIl19