UNPKG

coveo-search-ui-extensions

Version:

Small generic components to extend the functionality of Coveo's Search UI framework.

126 lines 5.48 kB
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; import { $$, Assert } from 'coveo-search-ui'; /** * Display a list that expand when click on the more button. */ export class ExpandableList { /** * Create an instance of the **ExpandableList** class. * * @param element Element on which to bind the component * @param items List of items to display. * @param options Initialization options. */ constructor(element, items, options) { this.element = element; this.items = items; this.options = options; this.isOpen = false; this.options = this.parseOptions(options); Assert.isNotUndefined(this.options.transform); Assert.isNotNull(this.options.transform); this.proccessedItem = items.slice(0, this.options.maximumItemsShown).map(this.options.transform); this.visibleItems = this.proccessedItem.slice(0, this.options.minimumItemsShown); this.hiddenItems = this.proccessedItem.slice(this.options.minimumItemsShown, this.options.maximumItemsShown); this.render(); } buildMoreButton() { const button = document.createElement('button'); button.type = 'button'; button.classList.add('coveo-more-less'); button.addEventListener('click', this.toggleExpansion.bind(this)); this.button = button; return button; } isSomeItemsHidden() { return !(this.options.maximumItemsShown === this.options.minimumItemsShown || this.hiddenItems.length === 0); } parseOptions(options) { const moreOrEqualThan = (mininum, value) => (value >= mininum ? value : mininum); let parsedOptions = Object.assign({}, options); parsedOptions.showLessMessage = parsedOptions.showLessMessage || ExpandableList.DEFAULTS.LESS_LABEL; parsedOptions.showMoreMessage = parsedOptions.showMoreMessage || ExpandableList.DEFAULTS.MORE_LABEL; parsedOptions.minimumItemsShown = parsedOptions.minimumItemsShown || ExpandableList.DEFAULTS.MINIMUM_ITEMS_SHOWN; parsedOptions.maximumItemsShown = parsedOptions.maximumItemsShown || ExpandableList.DEFAULTS.MAXIMUM_ITEMS_SHOWN; parsedOptions.minimumItemsShown = moreOrEqualThan(parsedOptions.minimumItemsShown, 1); parsedOptions.maximumItemsShown = moreOrEqualThan(parsedOptions.maximumItemsShown, parsedOptions.minimumItemsShown); parsedOptions.listLabel = parsedOptions.listLabel || ExpandableList.DEFAULTS.LIST_LABEL; return parsedOptions; } render() { this.element.classList.add(ExpandableList.COMPONENT_CLASS); const header = document.createElement('h2'); header.classList.add('coveo-title'); header.innerText = this.options.listLabel; const list = document.createElement('ol'); list.classList.add('coveo-list'); this.element.appendChild(header); this.element.appendChild(list); if (this.isSomeItemsHidden()) { this.element.appendChild(this.buildMoreButton()); } if (this.items.length === 0) { this.renderEmpty(); } else { this.fold(); } } renderEmpty() { const list = this.element.querySelector('.coveo-list'); const li = document.createElement('li'); li.classList.add(ExpandableList.EMPTY_CLASS); li.innerText = this.options.messageWhenEmpty || ''; list.appendChild(li); } toggleExpansion() { if (this.isOpen) { this.fold(); } else { this.unfold(); } this.isOpen = !this.isOpen; } fold() { this.update(this.visibleItems, this.options.showMoreMessage); } unfold() { this.update([...this.visibleItems, ...this.hiddenItems], this.options.showLessMessage); } update(items, buttonText) { return __awaiter(this, void 0, void 0, function* () { const list = this.element.querySelector('.coveo-list'); const listItems = (yield Promise.all(items)).map((itemElement) => { const listItem = document.createElement('li'); listItem.appendChild(itemElement); return listItem; }); list.innerHTML = ''; listItems.forEach((itemElement) => { $$(list).append(itemElement); }); if (this.button) { this.button.innerText = buttonText; } }); } } ExpandableList.DEFAULTS = Object.freeze({ LESS_LABEL: 'Show Less', MORE_LABEL: 'Show More', LIST_LABEL: 'Items', MAXIMUM_ITEMS_SHOWN: 8, MINIMUM_ITEMS_SHOWN: 4, }); ExpandableList.COMPONENT_CLASS = 'coveo-expandable-list'; ExpandableList.EMPTY_CLASS = 'coveo-empty'; //# sourceMappingURL=ExpandableList.js.map