@taiga-ui/kit
Version:
Taiga UI Angular main components kit
85 lines • 16.1 kB
JavaScript
import { inject, Injectable } from '@angular/core';
import { WaMutationObserverService } from '@ng-web-apis/mutation-observer';
import { WaResizeObserverService } from '@ng-web-apis/resize-observer';
import { tuiZonefreeScheduler, tuiZoneOptimized } from '@taiga-ui/cdk/observables';
import { tuiInjectElement } from '@taiga-ui/cdk/utils/dom';
import { tuiClamp } from '@taiga-ui/cdk/utils/math';
import { debounceTime, distinctUntilChanged, map, merge, Observable, share } from 'rxjs';
import { TuiItemsWithMoreDirective } from './items-with-more.directive';
import * as i0 from "@angular/core";
class TuiItemsWithMoreService extends Observable {
constructor() {
super((subscriber) => this.stream$.subscribe(subscriber));
this.el = tuiInjectElement();
this.directive = inject(TuiItemsWithMoreDirective);
this.stream$ = merge(this.directive.change$, inject(WaMutationObserverService, { self: true }), inject(WaResizeObserverService, { self: true })).pipe(debounceTime(0, tuiZonefreeScheduler()), map(() => this.directive.linesLimit > 1
? this.getOverflowIndexMultiline()
: this.getOverflowIndex(Array.from(this.el.children))), distinctUntilChanged(), tuiZoneOptimized(), share());
}
getOverflowIndex(children) {
const { computedSide, itemsLimit } = this.directive;
const { clientWidth } = this.el;
const items = Array.from(children, ({ clientWidth }) => clientWidth);
const index = computedSide === 'start' ? 0 : items.length - 1;
const more = children[index]?.tagName === 'SPAN' ? (items[index] ?? 0) : 0;
const total = items.reduce((sum, width) => sum + width, 0) - more;
if (total <= clientWidth && itemsLimit >= items.length) {
return computedSide === 'end' ? itemsLimit : 0;
}
return computedSide === 'start'
? this.getIndexStart(items, total, more)
: this.getIndexEnd(items, total, more);
}
getIndexStart(items, total, more) {
const { required, itemsLimit } = this.directive;
const { clientWidth } = this.el;
const min = Number.isFinite(itemsLimit) ? items.length - itemsLimit - 1 : 0;
const last = items.length - 1;
const mandatory = required === -1 ? last : required;
for (let i = 1; i < last; i++) {
if (i === mandatory + 1) {
continue;
}
total -= items[i] ?? 0;
if (total + more <= clientWidth) {
return tuiClamp(i, mandatory < min ? min + 1 : min, items.length);
}
}
return items.length;
}
getIndexEnd(items, total, more) {
const { required, itemsLimit } = this.directive;
const { clientWidth } = this.el;
const max = itemsLimit > required ? itemsLimit - 1 : itemsLimit - 2;
const last = items.length - 1;
const mandatory = required === -1 ? 0 : required;
for (let i = last - 1; i > 0; i--) {
if (i === mandatory) {
continue;
}
total -= items[i] ?? 0;
if (total + more <= clientWidth) {
return tuiClamp(i - 1, -1, max);
}
}
return -1;
}
getOverflowIndexMultiline() {
const { children } = this.el;
const { linesLimit, itemsLimit } = this.directive;
const items = Array.from(children);
const rows = new Set(items.map((item) => item.offsetTop));
const offset = Array.from(rows)[linesLimit - 1];
const firstItemLastRow = items.findIndex((i) => i.offsetTop === offset);
const lastRow = items.slice(firstItemLastRow);
const index = firstItemLastRow + this.getOverflowIndex(lastRow);
return Math.min(itemsLimit - 1, index);
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiItemsWithMoreService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiItemsWithMoreService }); }
}
export { TuiItemsWithMoreService };
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: TuiItemsWithMoreService, decorators: [{
type: Injectable
}], ctorParameters: function () { return []; } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXRlbXMtd2l0aC1tb3JlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9raXQvY29tcG9uZW50cy9pdGVtcy13aXRoLW1vcmUvaXRlbXMtd2l0aC1tb3JlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDakQsT0FBTyxFQUFDLHlCQUF5QixFQUFDLE1BQU0sZ0NBQWdDLENBQUM7QUFDekUsT0FBTyxFQUFDLHVCQUF1QixFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFDckUsT0FBTyxFQUFDLG9CQUFvQixFQUFFLGdCQUFnQixFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFDakYsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQ2xELE9BQU8sRUFBQyxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBRXZGLE9BQU8sRUFBQyx5QkFBeUIsRUFBQyxNQUFNLDZCQUE2QixDQUFDOztBQUV0RSxNQUNhLHVCQUF3QixTQUFRLFVBQWtCO0lBb0IzRDtRQUNJLEtBQUssQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztRQXBCN0MsT0FBRSxHQUFHLGdCQUFnQixFQUFFLENBQUM7UUFDeEIsY0FBUyxHQUFHLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBRTVDLFlBQU8sR0FBRyxLQUFLLENBQzlCLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUN0QixNQUFNLENBQUMseUJBQXlCLEVBQUUsRUFBQyxJQUFJ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a0JBRG5DLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2luamVjdCwgSW5qZWN0YWJsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge1dhTXV0YXRpb25PYnNlcnZlclNlcnZpY2V9IGZyb20gJ0BuZy13ZWItYXBpcy9tdXRhdGlvbi1vYnNlcnZlcic7XG5pbXBvcnQge1dhUmVzaXplT2JzZXJ2ZXJTZXJ2aWNlfSBmcm9tICdAbmctd2ViLWFwaXMvcmVzaXplLW9ic2VydmVyJztcbmltcG9ydCB7dHVpWm9uZWZyZWVTY2hlZHVsZXIsIHR1aVpvbmVPcHRpbWl6ZWR9IGZyb20gJ0B0YWlnYS11aS9jZGsvb2JzZXJ2YWJsZXMnO1xuaW1wb3J0IHt0dWlJbmplY3RFbGVtZW50fSBmcm9tICdAdGFpZ2EtdWkvY2RrL3V0aWxzL2RvbSc7XG5pbXBvcnQge3R1aUNsYW1wfSBmcm9tICdAdGFpZ2EtdWkvY2RrL3V0aWxzL21hdGgnO1xuaW1wb3J0IHtkZWJvdW5jZVRpbWUsIGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBtYXAsIG1lcmdlLCBPYnNlcnZhYmxlLCBzaGFyZX0gZnJvbSAncnhqcyc7XG5cbmltcG9ydCB7VHVpSXRlbXNXaXRoTW9yZURpcmVjdGl2ZX0gZnJvbSAnLi9pdGVtcy13aXRoLW1vcmUuZGlyZWN0aXZlJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFR1aUl0ZW1zV2l0aE1vcmVTZXJ2aWNlIGV4dGVuZHMgT2JzZXJ2YWJsZTxudW1iZXI+IHtcbiAgICBwcml2YXRlIHJlYWRvbmx5IGVsID0gdHVpSW5qZWN0RWxlbWVudCgpO1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZGlyZWN0aXZlID0gaW5qZWN0KFR1aUl0ZW1zV2l0aE1vcmVEaXJlY3RpdmUpO1xuXG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHN0cmVhbSQgPSBtZXJnZShcbiAgICAgICAgdGhpcy5kaXJlY3RpdmUuY2hhbmdlJCxcbiAgICAgICAgaW5qZWN0KFdhTXV0YXRpb25PYnNlcnZlclNlcnZpY2UsIHtzZWxmOiB0cnVlfSksXG4gICAgICAgIGluamVjdChXYVJlc2l6ZU9ic2VydmVyU2VydmljZSwge3NlbGY6IHRydWV9KSxcbiAgICApLnBpcGUoXG4gICAgICAgIGRlYm91bmNlVGltZSgwLCB0dWlab25lZnJlZVNjaGVkdWxlcigpKSxcbiAgICAgICAgbWFwKCgpID0+XG4gICAgICAgICAgICB0aGlzLmRpcmVjdGl2ZS5saW5lc0xpbWl0ID4gMVxuICAgICAgICAgICAgICAgID8gdGhpcy5nZXRPdmVyZmxvd0luZGV4TXVsdGlsaW5lKClcbiAgICAgICAgICAgICAgICA6IHRoaXMuZ2V0T3ZlcmZsb3dJbmRleChBcnJheS5mcm9tKHRoaXMuZWwuY2hpbGRyZW4pKSxcbiAgICAgICAgKSxcbiAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgICAgdHVpWm9uZU9wdGltaXplZCgpLFxuICAgICAgICBzaGFyZSgpLFxuICAgICk7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoKHN1YnNjcmliZXIpID0+IHRoaXMuc3RyZWFtJC5zdWJzY3JpYmUoc3Vic2NyaWJlcikpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0T3ZlcmZsb3dJbmRleChjaGlsZHJlbjogRWxlbWVudFtdKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3Qge2NvbXB1dGVkU2lkZSwgaXRlbXNMaW1pdH0gPSB0aGlzLmRpcmVjdGl2ZTtcbiAgICAgICAgY29uc3Qge2NsaWVudFdpZHRofSA9IHRoaXMuZWw7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gQXJyYXkuZnJvbShjaGlsZHJlbiwgKHtjbGllbnRXaWR0aH0pID0+IGNsaWVudFdpZHRoKTtcbiAgICAgICAgY29uc3QgaW5kZXggPSBjb21wdXRlZFNpZGUgPT09ICdzdGFydCcgPyAwIDogaXRlbXMubGVuZ3RoIC0gMTtcbiAgICAgICAgY29uc3QgbW9yZSA9IGNoaWxkcmVuW2luZGV4XT8udGFnTmFtZSA9PT0gJ1NQQU4nID8gKGl0ZW1zW2luZGV4XSA/PyAwKSA6IDA7XG4gICAgICAgIGNvbnN0IHRvdGFsID0gaXRlbXMucmVkdWNlKChzdW0sIHdpZHRoKSA9PiBzdW0gKyB3aWR0aCwgMCkgLSBtb3JlO1xuXG4gICAgICAgIGlmICh0b3RhbCA8PSBjbGllbnRXaWR0aCAmJiBpdGVtc0xpbWl0ID49IGl0ZW1zLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbXB1dGVkU2lkZSA9PT0gJ2VuZCcgPyBpdGVtc0xpbWl0IDogMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb21wdXRlZFNpZGUgPT09ICdzdGFydCdcbiAgICAgICAgICAgID8gdGhpcy5nZXRJbmRleFN0YXJ0KGl0ZW1zLCB0b3RhbCwgbW9yZSlcbiAgICAgICAgICAgIDogdGhpcy5nZXRJbmRleEVuZChpdGVtcywgdG90YWwsIG1vcmUpO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0SW5kZXhTdGFydChpdGVtczogbnVtYmVyW10sIHRvdGFsOiBudW1iZXIsIG1vcmU6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHtyZXF1aXJlZCwgaXRlbXNMaW1pdH0gPSB0aGlzLmRpcmVjdGl2ZTtcbiAgICAgICAgY29uc3Qge2NsaWVudFdpZHRofSA9IHRoaXMuZWw7XG4gICAgICAgIGNvbnN0IG1pbiA9IE51bWJlci5pc0Zpbml0ZShpdGVtc0xpbWl0KSA/IGl0ZW1zLmxlbmd0aCAtIGl0ZW1zTGltaXQgLSAxIDogMDtcbiAgICAgICAgY29uc3QgbGFzdCA9IGl0ZW1zLmxlbmd0aCAtIDE7XG4gICAgICAgIGNvbnN0IG1hbmRhdG9yeSA9IHJlcXVpcmVkID09PSAtMSA/IGxhc3QgOiByZXF1aXJlZDtcblxuICAgICAgICBmb3IgKGxldCBpID0gMTsgaSA8IGxhc3Q7IGkrKykge1xuICAgICAgICAgICAgaWYgKGkgPT09IG1hbmRhdG9yeSArIDEpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdG90YWwgLT0gaXRlbXNbaV0gPz8gMDtcblxuICAgICAgICAgICAgaWYgKHRvdGFsICsgbW9yZSA8PSBjbGllbnRXaWR0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0dWlDbGFtcChpLCBtYW5kYXRvcnkgPCBtaW4gPyBtaW4gKyAxIDogbWluLCBpdGVtcy5sZW5ndGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGl0ZW1zLmxlbmd0aDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEluZGV4RW5kKGl0ZW1zOiBudW1iZXJbXSwgdG90YWw6IG51bWJlciwgbW9yZTogbnVtYmVyKTogbnVtYmVyIHtcbiAgICAgICAgY29uc3Qge3JlcXVpcmVkLCBpdGVtc0xpbWl0fSA9IHRoaXMuZGlyZWN0aXZlO1xuICAgICAgICBjb25zdCB7Y2xpZW50V2lkdGh9ID0gdGhpcy5lbDtcbiAgICAgICAgY29uc3QgbWF4ID0gaXRlbXNMaW1pdCA+IHJlcXVpcmVkID8gaXRlbXNMaW1pdCAtIDEgOiBpdGVtc0xpbWl0IC0gMjtcbiAgICAgICAgY29uc3QgbGFzdCA9IGl0ZW1zLmxlbmd0aCAtIDE7XG4gICAgICAgIGNvbnN0IG1hbmRhdG9yeSA9IHJlcXVpcmVkID09PSAtMSA/IDAgOiByZXF1aXJlZDtcblxuICAgICAgICBmb3IgKGxldCBpID0gbGFzdCAtIDE7IGkgPiAwOyBpLS0pIHtcbiAgICAgICAgICAgIGlmIChpID09PSBtYW5kYXRvcnkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdG90YWwgLT0gaXRlbXNbaV0gPz8gMDtcblxuICAgICAgICAgICAgaWYgKHRvdGFsICsgbW9yZSA8PSBjbGllbnRXaWR0aCkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0dWlDbGFtcChpIC0gMSwgLTEsIG1heCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gLTE7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRPdmVyZmxvd0luZGV4TXVsdGlsaW5lKCk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHtjaGlsZHJlbn0gPSB0aGlzLmVsO1xuICAgICAgICBjb25zdCB7bGluZXNMaW1pdCwgaXRlbXNMaW1pdH0gPSB0aGlzLmRpcmVjdGl2ZTtcbiAgICAgICAgY29uc3QgaXRlbXMgPSBBcnJheS5mcm9tKGNoaWxkcmVuKSBhcyBIVE1MRWxlbWVudFtdO1xuICAgICAgICBjb25zdCByb3dzID0gbmV3IFNldChpdGVtcy5tYXAoKGl0ZW0pID0+IGl0ZW0ub2Zmc2V0VG9wKSk7XG4gICAgICAgIGNvbnN0IG9mZnNldCA9IEFycmF5LmZyb20ocm93cylbbGluZXNMaW1pdCAtIDFdO1xuICAgICAgICBjb25zdCBmaXJzdEl0ZW1MYXN0Um93ID0gaXRlbXMuZmluZEluZGV4KChpKSA9PiBpLm9mZnNldFRvcCA9PT0gb2Zmc2V0KTtcbiAgICAgICAgY29uc3QgbGFzdFJvdyA9IGl0ZW1zLnNsaWNlKGZpcnN0SXRlbUxhc3RSb3cpO1xuICAgICAgICBjb25zdCBpbmRleCA9IGZpcnN0SXRlbUxhc3RSb3cgKyB0aGlzLmdldE92ZXJmbG93SW5kZXgobGFzdFJvdyk7XG5cbiAgICAgICAgcmV0dXJuIE1hdGgubWluKGl0ZW1zTGltaXQgLSAxLCBpbmRleCk7XG4gICAgfVxufVxuIl19