angular-responsive-carousel-ng16
Version:
Carousel for Angular. A simple solution for horizontal scrolling images with lazy loading.
139 lines • 17.1 kB
JavaScript
export class ImageUtils {
constructor(element) {
this.cellStack = [];
this.element = element;
}
getImages() {
return this.cellStack.filter(this.filter);
}
filter(cell) {
return cell.img !== undefined;
}
}
export class Cells {
get images() {
return this.carouselProperties.images;
}
get cellLength() {
return this.cells ? this.cells.length : 0;
}
get fullCellWidth() {
return this.carouselProperties.cellWidth + this.carouselProperties.margin;
}
get cellLengthInLightDOMMode() {
if (this.images) {
let cellLength = this.numberOfVisibleCells + this.overflowCellsLimit * 2;
if (cellLength > this.images.length) {
cellLength = this.images.length;
}
return cellLength;
}
else {
return this.cellLength;
}
}
get numberOfVisibleCells() {
return this.utils.numberOfVisibleCells;
}
get overflowCellsLimit() {
return this.utils.overflowCellsLimit;
}
get isLightDOM() {
return this.carouselProperties.lightDOM || this.carouselProperties.loop;
}
constructor(carouselProperties, utils) {
this.carouselProperties = carouselProperties;
this.utils = utils;
this.counter = 0;
this.imageUtils = new ImageUtils(this.element);
this.init(carouselProperties);
}
updateProperties(carouselProperties) {
this.carouselProperties = carouselProperties;
}
lineUp() {
const cells = this.element ? this.element.children : [];
this.imageUtils.cellStack = [];
for (var i = 0; i < cells.length; i++) {
let cell = cells[i];
let positionX = this.getCellPositionInContainer(i);
cell.style.transform = 'translateX(' + positionX + 'px)';
cell.style.width = this.carouselProperties.cellWidth + 'px';
if (this.getImage(i)) {
this.imageUtils.cellStack.push({
index: i,
positionX,
img: this.getImage(i)['image']
});
}
}
;
}
ifSequenceOfCellsIsChanged() {
const cells = this.element.children;
return cells[0]['style'].transform !== 'translateX(0px)';
}
getCellPositionInContainer(cellIndexInDOMTree) {
let positionIndex = this.getCellIndexInContainer(cellIndexInDOMTree);
return positionIndex * this.fullCellWidth;
}
getCellIndexInContainer(cellIndexInDOMTree) {
let positionIndex;
if (!this.isLightDOM) {
return cellIndexInDOMTree;
}
let cellLength = this.cellLengthInLightDOMMode;
let counter = this.counter - this.overflowCellsLimit;
if (counter > cellLength) {
counter = counter % cellLength;
}
if (counter < 0) {
return cellIndexInDOMTree;
}
else {
positionIndex = cellIndexInDOMTree - counter;
if (positionIndex < 0) {
positionIndex = cellLength + positionIndex;
}
}
return positionIndex;
}
getImage(cellIndex) {
if (!this.images) {
return;
}
let imageIndex = this.getImageIndex(cellIndex);
let file = this.images[imageIndex];
if (file && !file.type) {
file.type = 'image';
}
return {
image: this.images[imageIndex],
imageIndex
};
}
getImageIndex(cellIndexInDOMTree) {
const positionIndex = this.getCellIndexInContainer(cellIndexInDOMTree);
let imageIndex;
if (this.counter > this.overflowCellsLimit) {
let cellLimitOverflow = this.counter - this.overflowCellsLimit;
imageIndex = positionIndex + cellLimitOverflow;
if (this.images && this.carouselProperties.loop) {
imageIndex = imageIndex % this.images.length;
}
}
else {
imageIndex = cellIndexInDOMTree;
}
return imageIndex;
}
setCounter(value) {
this.counter = value;
}
init(carouselProperties) {
this.element = this.carouselProperties.cellsElement;
this.cells = this.element.children;
this.visibleWidth = this.carouselProperties.visibleWidth || this.element.parentElement.clientWidth;
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2VsbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLXJlc3BvbnNpdmUtY2Fyb3VzZWwtbmcxNi9zcmMvbGliL2NlbGxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQVdBLE1BQU0sT0FBTyxVQUFVO0lBSW5CLFlBQVksT0FBZ0M7UUFINUMsY0FBUyxHQUFXLEVBQUUsQ0FBQztRQUluQixJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztJQUMzQixDQUFDO0lBRUQsU0FBUztRQUNMLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQzlDLENBQUM7SUFFRCxNQUFNLENBQUMsSUFBVTtRQUNiLE9BQU8sSUFBSSxDQUFDLEdBQUcsS0FBSyxTQUFTLENBQUM7SUFDbEMsQ0FBQztDQUNKO0FBRUQsTUFBTSxPQUFPLEtBQUs7SUFPZCxJQUFJLE1BQU07UUFDTixPQUFPLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUM7SUFDMUMsQ0FBQztJQUVELElBQUksVUFBVTtRQUNWLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUM5QyxDQUFDO0lBRUQsSUFBSSxhQUFhO1FBQ2IsT0FBTyxJQUFJLENBQUMsa0JBQWtCLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUM7SUFDOUUsQ0FBQztJQUVELElBQUksd0JBQXdCO1FBQ3hCLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUNiLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxvQkFBb0IsR0FBRyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsQ0FBQyxDQUFDO1lBRXpFLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTSxF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Q3hDLElBQUksaUJBQWlCLEdBQUcsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUM7WUFDL0QsVUFBVSxHQUFHLGFBQWEsR0FBRyxpQkFBaUIsQ0FBQztZQUUvQyxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRTtnQkFDN0MsVUFBVSxHQUFHLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQzthQUNoRDtTQUNKO2FBQU07WUFDSCxVQUFVLEdBQUcsa0JBQWtCLENBQUM7U0FDbkM7UUFFRCxPQUFPLFVBQVUsQ0FBQztJQUN0QixDQUFDO0lBRUQsVUFBVSxDQUFDLEtBQWE7UUFDcEIsSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUM7SUFDekIsQ0FBQztJQUVELElBQUksQ0FBQyxrQkFBc0M7UUFDdkMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxDQUFDO1FBQ3BELElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUM7UUFDbkMsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxPQUFRLENBQUMsYUFBYyxDQUFDLFdBQVcsQ0FBQztJQUN6RyxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1Byb3BlcnRpZXMgYXMgQ2Fyb3VzZWxQcm9wZXJ0aWVzLCBJbWFnZX0gZnJvbSAnLi9pbnRlcmZhY2VzJztcblxuZXhwb3J0IGludGVyZmFjZSBDZWxsIHtcbiAgICBpbmRleDogbnVtYmVyLFxuICAgIHBvc2l0aW9uWDogbnVtYmVyLFxuICAgIGltZzoge1xuICAgICAgICBpbWFnZTogSW1hZ2UsXG4gICAgICAgIGltYWdlSW5kZXg6IG51bWJlclxuICAgIH1cbn1cblxuZXhwb3J0IGNsYXNzIEltYWdlVXRpbHMge1xuICAgIGNlbGxTdGFjazogQ2VsbFtdID0gW107XG4gICAgZWxlbWVudDphbnk7XG5cbiAgICBjb25zdHJ1Y3RvcihlbGVtZW50OiBIVE1MRWxlbWVudCB8IHVuZGVmaW5lZCkge1xuICAgICAgICB0aGlzLmVsZW1lbnQgPSBlbGVtZW50O1xuICAgIH1cblxuICAgIGdldEltYWdlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2VsbFN0YWNrLmZpbHRlcih0aGlzLmZpbHRlcik7XG4gICAgfVxuXG4gICAgZmlsdGVyKGNlbGw6IENlbGwpIHtcbiAgICAgICAgcmV0dXJuIGNlbGwuaW1nICE9PSB1bmRlZmluZWQ7XG4gICAgfVxufVxuXG5leHBvcnQgY2xhc3MgQ2VsbHMge1xuICAgIGNlbGxzOiBIVE1MQ29sbGVjdGlvbiB8IHVuZGVmaW5lZDtcbiAgICBlbGVtZW50ITogSFRNTEVsZW1lbnQ7XG4gICAgdmlzaWJsZVdpZHRoOiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgY291bnRlcjogbnVtYmVyID0gMDtcbiAgICBpbWFnZVV0aWxzO1xuXG4gICAgZ2V0IGltYWdlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2Fyb3VzZWxQcm9wZXJ0aWVzLmltYWdlcztcbiAgICB9XG5cbiAgICBnZXQgY2VsbExlbmd0aCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2VsbHMgPyB0aGlzLmNlbGxzLmxlbmd0aCA6IDA7XG4gICAgfVxuXG4gICAgZ2V0IGZ1bGxDZWxsV2lkdGgoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNhcm91c2VsUHJvcGVydGllcy5jZWxsV2lkdGggKyB0aGlzLmNhcm91c2VsUHJvcGVydGllcy5tYXJnaW47XG4gICAgfVxuXG4gICAgZ2V0IGNlbGxMZW5ndGhJbkxpZ2h0RE9NTW9kZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuaW1hZ2VzKSB7XG4gICAgICAgICAgICBsZXQgY2VsbExlbmd0aCA9IHRoaXMubnVtYmVyT2ZWaXNpYmxlQ2VsbHMgKyB0aGlzLm92ZXJmbG93Q2VsbHNMaW1pdCAqIDI7XG5cbiAgICAgICAgICAgIGlmIChjZWxsTGVuZ3RoID4gdGhpcy5pbWFnZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY2VsbExlbmd0aCA9IHRoaXMuaW1hZ2VzLmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjZWxsTGVuZ3RoO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY2VsbExlbmd0aDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldCBudW1iZXJPZlZpc2libGVDZWxscygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudXRpbHMubnVtYmVyT2ZWaXNpYmxlQ2VsbHM7XG4gICAgfVxuXG4gICAgZ2V0IG92ZXJmbG93Q2VsbHNMaW1pdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudXRpbHMub3ZlcmZsb3dDZWxsc0xpbWl0O1xuICAgIH1cblxuICAgIGdldCBpc0xpZ2h0RE9NKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jYXJvdXNlbFByb3BlcnRpZXMubGlnaHRET00gfHwgdGhpcy5jYXJvdXNlbFByb3BlcnRpZXMubG9vcDtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBjYXJvdXNlbFByb3BlcnRpZXM6IENhcm91c2VsUHJvcGVydGllcyxcbiAgICAgICAgcHJpdmF0ZSB1dGlsczogYW55KSB7XG5cbiAgICAgICAgdGhpcy5pbWFnZVV0aWxzID0gbmV3IEltYWdlVXRpbHModGhpcy5lbGVtZW50KTtcbiAgICAgICAgdGhpcy5pbml0KGNhcm91c2VsUHJvcGVydGllcyk7XG4gICAgfVxuXG4gICAgdXBkYXRlUHJvcGVydGllcyhjYXJvdXNlbFByb3BlcnRpZXM6IENhcm91c2VsUHJvcGVydGllcykge1xuICAgICAgICB0aGlzLmNhcm91c2VsUHJvcGVydGllcyA9IGNhcm91c2VsUHJvcGVydGllcztcbiAgICB9XG5cbiAgICBsaW5lVXAoKSB7XG4gICAgICAgIGNvbnN0IGNlbGxzID0gdGhpcy5lbGVtZW50ID8gdGhpcy5lbGVtZW50LmNoaWxkcmVuIDogW107XG4gICAgICAgIHRoaXMuaW1hZ2VVdGlscy5jZWxsU3RhY2sgPSBbXTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNlbGxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgY2VsbCA9IGNlbGxzW2ldO1xuICAgICAgICAgICAgbGV0IHBvc2l0aW9uWCA9IHRoaXMuZ2V0Q2VsbFBvc2l0aW9uSW5Db250YWluZXIoaSk7XG4gICAgICAgICAgICAoY2VsbCBhcyBIVE1MRWxlbWVudCkuc3R5bGUudHJhbnNmb3JtID0gJ3RyYW5zbGF0ZVgoJyArIHBvc2l0aW9uWCArICdweCknO1xuICAgICAgICAgICAgKGNlbGwgYXMgSFRNTEVsZW1lbnQpLnN0eWxlLndpZHRoID0gdGhpcy5jYXJvdXNlbFByb3BlcnRpZXMuY2VsbFdpZHRoICsgJ3B4JztcblxuICAgICAgICAgICAgaWYgKHRoaXMuZ2V0SW1hZ2UoaSkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmltYWdlVXRpbHMuY2VsbFN0YWNrLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICBpbmRleDogaSxcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb25YLFxuICAgICAgICAgICAgICAgICAgICBpbWc6IHRoaXMuZ2V0SW1hZ2UoaSkhWydpbWFnZSddXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgaWZTZXF1ZW5jZU9mQ2VsbHNJc0NoYW5nZWQoKSB7XG4gICAgICAgIGNvbnN0IGNlbGxzOmFueSA9IHRoaXMuZWxlbWVudC5jaGlsZHJlbjtcbiAgICAgICAgcmV0dXJuIGNlbGxzWzBdWydzdHlsZSddLnRyYW5zZm9ybSAhPT0gJ3RyYW5zbGF0ZVgoMHB4KSc7XG4gICAgfVxuXG4gICAgZ2V0Q2VsbFBvc2l0aW9uSW5Db250YWluZXIoY2VsbEluZGV4SW5ET01UcmVlOiBudW1iZXIpIHtcbiAgICAgICAgbGV0IHBvc2l0aW9uSW5kZXggPSB0aGlzLmdldENlbGxJbmRleEluQ29udGFpbmVyKGNlbGxJbmRleEluRE9NVHJlZSk7XG4gICAgICAgIHJldHVybiBwb3NpdGlvbkluZGV4ICogdGhpcy5mdWxsQ2VsbFdpZHRoO1xuICAgIH1cblxuICAgIGdldENlbGxJbmRleEluQ29udGFpbmVyKGNlbGxJbmRleEluRE9NVHJlZTogbnVtYmVyKSB7XG4gICAgICAgIGxldCBwb3NpdGlvbkluZGV4O1xuXG4gICAgICAgIGlmICghdGhpcy5pc0xpZ2h0RE9NKSB7XG4gICAgICAgICAgICByZXR1cm4gY2VsbEluZGV4SW5ET01UcmVlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGNlbGxMZW5ndGggPSB0aGlzLmNlbGxMZW5ndGhJbkxpZ2h0RE9NTW9kZTtcbiAgICAgICAgbGV0IGNvdW50ZXIgPSB0aGlzLmNvdW50ZXIgLSB0aGlzLm92ZXJmbG93Q2VsbHNMaW1pdDtcblxuICAgICAgICBpZiAoY291bnRlciA+IGNlbGxMZW5ndGgpIHtcbiAgICAgICAgICAgIGNvdW50ZXIgPSBjb3VudGVyICUgY2VsbExlbmd0aDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb3VudGVyIDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIGNlbGxJbmRleEluRE9NVHJlZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBvc2l0aW9uSW5kZXggPSBjZWxsSW5kZXhJbkRPTVRyZWUgLSBjb3VudGVyO1xuICAgICAgICAgICAgaWYgKHBvc2l0aW9uSW5kZXggPCAwKSB7XG4gICAgICAgICAgICAgICAgcG9zaXRpb25JbmRleCA9IGNlbGxMZW5ndGggKyBwb3NpdGlvbkluZGV4O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBvc2l0aW9uSW5kZXg7XG4gICAgfVxuXG4gICAgZ2V0SW1hZ2UoY2VsbEluZGV4OiBudW1iZXIpIHtcbiAgICAgICAgaWYgKCF0aGlzLmltYWdlcykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGltYWdlSW5kZXggPSB0aGlzLmdldEltYWdlSW5kZXgoY2VsbEluZGV4KTtcbiAgICAgICAgbGV0IGZpbGUgPSB0aGlzLmltYWdlc1tpbWFnZUluZGV4XTtcblxuICAgICAgICBpZiAoZmlsZSAmJiAhZmlsZS50eXBlKSB7XG4gICAgICAgICAgICBmaWxlLnR5cGUgPSAnaW1hZ2UnO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGltYWdlOiB0aGlzLmltYWdlc1tpbWFnZUluZGV4XSxcbiAgICAgICAgICAgIGltYWdlSW5kZXhcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBnZXRJbWFnZUluZGV4KGNlbGxJbmRleEluRE9NVHJlZTogbnVtYmVyKSB7XG4gICAgICAgIGNvbnN0IHBvc2l0aW9uSW5kZXggPSB0aGlzLmdldENlbGxJbmRleEluQ29udGFpbmVyKGNlbGxJbmRleEluRE9NVHJlZSk7XG4gICAgICAgIGxldCBpbWFnZUluZGV4O1xuXG4gICAgICAgIGlmICh0aGlzLmNvdW50ZXIgPiB0aGlzLm92ZXJmbG93Q2VsbHNMaW1pdCkge1xuICAgICAgICAgICAgbGV0IGNlbGxMaW1pdE92ZXJmbG93ID0gdGhpcy5jb3VudGVyIC0gdGhpcy5vdmVyZmxvd0NlbGxzTGltaXQ7XG4gICAgICAgICAgICBpbWFnZUluZGV4ID0gcG9zaXRpb25JbmRleCArIGNlbGxMaW1pdE92ZXJmbG93O1xuXG4gICAgICAgICAgICBpZiAodGhpcy5pbWFnZXMgJiYgdGhpcy5jYXJvdXNlbFByb3BlcnRpZXMubG9vcCkge1xuICAgICAgICAgICAgICAgIGltYWdlSW5kZXggPSBpbWFnZUluZGV4ICUgdGhpcy5pbWFnZXMubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgaW1hZ2VJbmRleCA9IGNlbGxJbmRleEluRE9NVHJlZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpbWFnZUluZGV4O1xuICAgIH1cblxuICAgIHNldENvdW50ZXIodmFsdWU6IG51bWJlcikge1xuICAgICAgICB0aGlzLmNvdW50ZXIgPSB2YWx1ZTtcbiAgICB9XG5cbiAgICBpbml0KGNhcm91c2VsUHJvcGVydGllczogQ2Fyb3VzZWxQcm9wZXJ0aWVzKSB7XG4gICAgICAgIHRoaXMuZWxlbWVudCA9IHRoaXMuY2Fyb3VzZWxQcm9wZXJ0aWVzLmNlbGxzRWxlbWVudDtcbiAgICAgICAgdGhpcy5jZWxscyA9IHRoaXMuZWxlbWVudC5jaGlsZHJlbjtcbiAgICAgICAgdGhpcy52aXNpYmxlV2lkdGggPSB0aGlzLmNhcm91c2VsUHJvcGVydGllcy52aXNpYmxlV2lkdGggfHwgdGhpcy5lbGVtZW50IS5wYXJlbnRFbGVtZW50IS5jbGllbnRXaWR0aDtcbiAgICB9XG59Il19