UNPKG

@taiga-ui/kit

Version:

Taiga UI Angular main components kit

85 lines 16.1 kB
import { inject, Injectable } from '@angular/core'; import { MutationObserverService } from '@ng-web-apis/mutation-observer'; import { ResizeObserverService } 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(MutationObserverService, { self: true }), inject(ResizeObserverService, { 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaXRlbXMtd2l0aC1tb3JlLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9raXQvY29tcG9uZW50cy9pdGVtcy13aXRoLW1vcmUvaXRlbXMtd2l0aC1tb3JlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDakQsT0FBTyxFQUFDLHVCQUF1QixFQUFDLE1BQU0sZ0NBQWdDLENBQUM7QUFDdkUsT0FBTyxFQUFDLHFCQUFxQixFQUFDLE1BQU0sOEJBQThCLENBQUM7QUFDbkUsT0FBTyxFQUFDLG9CQUFvQixFQUFFLGdCQUFnQixFQUFDLE1BQU0sMkJBQTJCLENBQUM7QUFDakYsT0FBTyxFQUFDLGdCQUFnQixFQUFDLE1BQU0seUJBQXlCLENBQUM7QUFDekQsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFNLDBCQUEwQixDQUFDO0FBQ2xELE9BQU8sRUFBQyxZQUFZLEVBQUUsb0JBQW9CLEVBQUUsR0FBRyxFQUFFLEtBQUssRUFBRSxVQUFVLEVBQUUsS0FBSyxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBRXZGLE9BQU8sRUFBQyx5QkFBeUIsRUFBQyxNQUFNLDZCQUE2QixDQUFDOztBQUV0RSxNQUNhLHVCQUF3QixTQUFRLFVBQWtCO0lBb0IzRDtRQUNJLEtBQUssQ0FBQyxDQUFDLFVBQVUsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQztRQXBCN0MsT0FBRSxHQUFHLGdCQUFnQixFQUFFLENBQUM7UUFDeEIsY0FBUyxHQUFHLE1BQU0sQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO1FBRTVDLFlBQU8sR0FBRyxLQUFLLENBQzlCLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUN0QixNQUFNLENBQUMsdUJBQXVCLEVBQUUsRUFBQyxJQUFJ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a0JBRG5DLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge2luamVjdCwgSW5qZWN0YWJsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge011dGF0aW9uT2JzZXJ2ZXJTZXJ2aWNlfSBmcm9tICdAbmctd2ViLWFwaXMvbXV0YXRpb24tb2JzZXJ2ZXInO1xuaW1wb3J0IHtSZXNpemVPYnNlcnZlclNlcnZpY2V9IGZyb20gJ0BuZy13ZWItYXBpcy9yZXNpemUtb2JzZXJ2ZXInO1xuaW1wb3J0IHt0dWlab25lZnJlZVNjaGVkdWxlciwgdHVpWm9uZU9wdGltaXplZH0gZnJvbSAnQHRhaWdhLXVpL2Nkay9vYnNlcnZhYmxlcyc7XG5pbXBvcnQge3R1aUluamVjdEVsZW1lbnR9IGZyb20gJ0B0YWlnYS11aS9jZGsvdXRpbHMvZG9tJztcbmltcG9ydCB7dHVpQ2xhbXB9IGZyb20gJ0B0YWlnYS11aS9jZGsvdXRpbHMvbWF0aCc7XG5pbXBvcnQge2RlYm91bmNlVGltZSwgZGlzdGluY3RVbnRpbENoYW5nZWQsIG1hcCwgbWVyZ2UsIE9ic2VydmFibGUsIHNoYXJlfSBmcm9tICdyeGpzJztcblxuaW1wb3J0IHtUdWlJdGVtc1dpdGhNb3JlRGlyZWN0aXZlfSBmcm9tICcuL2l0ZW1zLXdpdGgtbW9yZS5kaXJlY3RpdmUnO1xuXG5ASW5qZWN0YWJsZSgpXG5leHBvcnQgY2xhc3MgVHVpSXRlbXNXaXRoTW9yZVNlcnZpY2UgZXh0ZW5kcyBPYnNlcnZhYmxlPG51bWJlcj4ge1xuICAgIHByaXZhdGUgcmVhZG9ubHkgZWwgPSB0dWlJbmplY3RFbGVtZW50KCk7XG4gICAgcHJpdmF0ZSByZWFkb25seSBkaXJlY3RpdmUgPSBpbmplY3QoVHVpSXRlbXNXaXRoTW9yZURpcmVjdGl2ZSk7XG5cbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgc3RyZWFtJCA9IG1lcmdlKFxuICAgICAgICB0aGlzLmRpcmVjdGl2ZS5jaGFuZ2UkLFxuICAgICAgICBpbmplY3QoTXV0YXRpb25PYnNlcnZlclNlcnZpY2UsIHtzZWxmOiB0cnVlfSksXG4gICAgICAgIGluamVjdChSZXNpemVPYnNlcnZlclNlcnZpY2UsIHtzZWxmOiB0cnVlfSksXG4gICAgKS5waXBlKFxuICAgICAgICBkZWJvdW5jZVRpbWUoMCwgdHVpWm9uZWZyZWVTY2hlZHVsZXIoKSksXG4gICAgICAgIG1hcCgoKSA9PlxuICAgICAgICAgICAgdGhpcy5kaXJlY3RpdmUubGluZXNMaW1pdCA+IDFcbiAgICAgICAgICAgICAgICA/IHRoaXMuZ2V0T3ZlcmZsb3dJbmRleE11bHRpbGluZSgpXG4gICAgICAgICAgICAgICAgOiB0aGlzLmdldE92ZXJmbG93SW5kZXgoQXJyYXkuZnJvbSh0aGlzLmVsLmNoaWxkcmVuKSksXG4gICAgICAgICksXG4gICAgICAgIGRpc3RpbmN0VW50aWxDaGFuZ2VkKCksXG4gICAgICAgIHR1aVpvbmVPcHRpbWl6ZWQoKSxcbiAgICAgICAgc2hhcmUoKSxcbiAgICApO1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKChzdWJzY3JpYmVyKSA9PiB0aGlzLnN0cmVhbSQuc3Vic2NyaWJlKHN1YnNjcmliZXIpKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldE92ZXJmbG93SW5kZXgoY2hpbGRyZW46IEVsZW1lbnRbXSk6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHtjb21wdXRlZFNpZGUsIGl0ZW1zTGltaXR9ID0gdGhpcy5kaXJlY3RpdmU7XG4gICAgICAgIGNvbnN0IHtjbGllbnRXaWR0aH0gPSB0aGlzLmVsO1xuICAgICAgICBjb25zdCBpdGVtcyA9IEFycmF5LmZyb20oY2hpbGRyZW4sICh7Y2xpZW50V2lkdGh9KSA9PiBjbGllbnRXaWR0aCk7XG4gICAgICAgIGNvbnN0IGluZGV4ID0gY29tcHV0ZWRTaWRlID09PSAnc3RhcnQnID8gMCA6IGl0ZW1zLmxlbmd0aCAtIDE7XG4gICAgICAgIGNvbnN0IG1vcmUgPSBjaGlsZHJlbltpbmRleF0/LnRhZ05hbWUgPT09ICdTUEFOJyA/IChpdGVtc1tpbmRleF0gPz8gMCkgOiAwO1xuICAgICAgICBjb25zdCB0b3RhbCA9IGl0ZW1zLnJlZHVjZSgoc3VtLCB3aWR0aCkgPT4gc3VtICsgd2lkdGgsIDApIC0gbW9yZTtcblxuICAgICAgICBpZiAodG90YWwgPD0gY2xpZW50V2lkdGggJiYgaXRlbXNMaW1pdCA+PSBpdGVtcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBjb21wdXRlZFNpZGUgPT09ICdlbmQnID8gaXRlbXNMaW1pdCA6IDA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29tcHV0ZWRTaWRlID09PSAnc3RhcnQnXG4gICAgICAgICAgICA/IHRoaXMuZ2V0SW5kZXhTdGFydChpdGVtcywgdG90YWwsIG1vcmUpXG4gICAgICAgICAgICA6IHRoaXMuZ2V0SW5kZXhFbmQoaXRlbXMsIHRvdGFsLCBtb3JlKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldEluZGV4U3RhcnQoaXRlbXM6IG51bWJlcltdLCB0b3RhbDogbnVtYmVyLCBtb3JlOiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB7cmVxdWlyZWQsIGl0ZW1zTGltaXR9ID0gdGhpcy5kaXJlY3RpdmU7XG4gICAgICAgIGNvbnN0IHtjbGllbnRXaWR0aH0gPSB0aGlzLmVsO1xuICAgICAgICBjb25zdCBtaW4gPSBOdW1iZXIuaXNGaW5pdGUoaXRlbXNMaW1pdCkgPyBpdGVtcy5sZW5ndGggLSBpdGVtc0xpbWl0IC0gMSA6IDA7XG4gICAgICAgIGNvbnN0IGxhc3QgPSBpdGVtcy5sZW5ndGggLSAxO1xuICAgICAgICBjb25zdCBtYW5kYXRvcnkgPSByZXF1aXJlZCA9PT0gLTEgPyBsYXN0IDogcmVxdWlyZWQ7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCBsYXN0OyBpKyspIHtcbiAgICAgICAgICAgIGlmIChpID09PSBtYW5kYXRvcnkgKyAxKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRvdGFsIC09IGl0ZW1zW2ldID8/IDA7XG5cbiAgICAgICAgICAgIGlmICh0b3RhbCArIG1vcmUgPD0gY2xpZW50V2lkdGgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHVpQ2xhbXAoaSwgbWFuZGF0b3J5IDwgbWluID8gbWluICsgMSA6IG1pbiwgaXRlbXMubGVuZ3RoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBpdGVtcy5sZW5ndGg7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXRJbmRleEVuZChpdGVtczogbnVtYmVyW10sIHRvdGFsOiBudW1iZXIsIG1vcmU6IG51bWJlcik6IG51bWJlciB7XG4gICAgICAgIGNvbnN0IHtyZXF1aXJlZCwgaXRlbXNMaW1pdH0gPSB0aGlzLmRpcmVjdGl2ZTtcbiAgICAgICAgY29uc3Qge2NsaWVudFdpZHRofSA9IHRoaXMuZWw7XG4gICAgICAgIGNvbnN0IG1heCA9IGl0ZW1zTGltaXQgPiByZXF1aXJlZCA/IGl0ZW1zTGltaXQgLSAxIDogaXRlbXNMaW1pdCAtIDI7XG4gICAgICAgIGNvbnN0IGxhc3QgPSBpdGVtcy5sZW5ndGggLSAxO1xuICAgICAgICBjb25zdCBtYW5kYXRvcnkgPSByZXF1aXJlZCA9PT0gLTEgPyAwIDogcmVxdWlyZWQ7XG5cbiAgICAgICAgZm9yIChsZXQgaSA9IGxhc3QgLSAxOyBpID4gMDsgaS0tKSB7XG4gICAgICAgICAgICBpZiAoaSA9PT0gbWFuZGF0b3J5KSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRvdGFsIC09IGl0ZW1zW2ldID8/IDA7XG5cbiAgICAgICAgICAgIGlmICh0b3RhbCArIG1vcmUgPD0gY2xpZW50V2lkdGgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHVpQ2xhbXAoaSAtIDEsIC0xLCBtYXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIC0xO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0T3ZlcmZsb3dJbmRleE11bHRpbGluZSgpOiBudW1iZXIge1xuICAgICAgICBjb25zdCB7Y2hpbGRyZW59ID0gdGhpcy5lbDtcbiAgICAgICAgY29uc3Qge2xpbmVzTGltaXQsIGl0ZW1zTGltaXR9ID0gdGhpcy5kaXJlY3RpdmU7XG4gICAgICAgIGNvbnN0IGl0ZW1zID0gQXJyYXkuZnJvbShjaGlsZHJlbikgYXMgSFRNTEVsZW1lbnRbXTtcbiAgICAgICAgY29uc3Qgcm93cyA9IG5ldyBTZXQoaXRlbXMubWFwKChpdGVtKSA9PiBpdGVtLm9mZnNldFRvcCkpO1xuICAgICAgICBjb25zdCBvZmZzZXQgPSBBcnJheS5mcm9tKHJvd3MpW2xpbmVzTGltaXQgLSAxXTtcbiAgICAgICAgY29uc3QgZmlyc3RJdGVtTGFzdFJvdyA9IGl0ZW1zLmZpbmRJbmRleCgoaSkgPT4gaS5vZmZzZXRUb3AgPT09IG9mZnNldCk7XG4gICAgICAgIGNvbnN0IGxhc3RSb3cgPSBpdGVtcy5zbGljZShmaXJzdEl0ZW1MYXN0Um93KTtcbiAgICAgICAgY29uc3QgaW5kZXggPSBmaXJzdEl0ZW1MYXN0Um93ICsgdGhpcy5nZXRPdmVyZmxvd0luZGV4KGxhc3RSb3cpO1xuXG4gICAgICAgIHJldHVybiBNYXRoLm1pbihpdGVtc0xpbWl0IC0gMSwgaW5kZXgpO1xuICAgIH1cbn1cbiJdfQ==