coveo-search-ui-extensions
Version:
Small generic components to extend the functionality of Coveo's Search UI framework.
126 lines • 5.48 kB
JavaScript
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