UNPKG

ng-devui

Version:

DevUI components based on Angular

129 lines 17.8 kB
import { Directive, ElementRef, HostListener, Input } from '@angular/core'; import { ReplaySubject } from 'rxjs'; import { AnchorService } from './anchor.service'; import * as i0 from "@angular/core"; import * as i1 from "./anchor.service"; export class AnchorDirective { set isActive(active) { this._isActive = active; this.activeChangeSubject.next(active); if (active) { this.anchorService.setCurrentActive(this.anchor); } else if (this.anchorService.currentActiveAnchor === this.anchor) { this.anchorService.setCurrentActive(''); } } get isActive() { return this._isActive; } set boxElement(box) { this._boxElement = box; this.updateScrollListenTarget(); } get boxElement() { return this._boxElement; } constructor(el, anchorService) { this.el = el; this.anchorService = anchorService; this.anchorActive = 'active'; this.activeChangeSubject = new ReplaySubject(1); this.REACH_TOP_VISION_OFFSET = 50; this.THROTTLE_DELAY = 100; this.THROTTLE_TRIGGER = 600; this.throttle = () => { const fn = this.checkActiveStatus; const time = Date.now(); if (this.scrollTimer) { clearTimeout(this.scrollTimer); } if (!this.scrollPreStart) { this.scrollPreStart = time; } if (time - this.scrollPreStart > this.THROTTLE_TRIGGER) { fn(); this.scrollPreStart = null; this.scrollTimer = null; } else { this.scrollTimer = setTimeout(() => { fn(); this.scrollPreStart = null; this.scrollTimer = null; }, this.THROTTLE_DELAY); } }; this.checkActiveStatus = (activeChangeBy) => { if (this.boxElement.isScrollingToTarget) { return; } const dom = this.boxElement.scrollTarget; const fix = dom && dom instanceof Element ? dom.getBoundingClientRect().top : 0; const top = this.element.getBoundingClientRect().top - fix - ((this.boxElement.view && this.boxElement.view.top) || 0); const bottom = this.element.getBoundingClientRect().bottom - fix - ((this.boxElement.view && this.boxElement.view.top) || 0); const currentActiveAnchor = this.anchorService.currentActiveAnchor; if (this.anchor === this.boxElement.defaultAnchor && (!currentActiveAnchor || currentActiveAnchor === this.boxElement.defaultAnchor)) { this.activeChangeBy = activeChangeBy || 'scroll'; this.isActive = bottom > this.REACH_TOP_VISION_OFFSET; return; } this.activeChangeBy = activeChangeBy || 'scroll'; this.isActive = bottom > this.REACH_TOP_VISION_OFFSET && top < this.REACH_TOP_VISION_OFFSET; }; this.element = this.el.nativeElement; } ngAfterViewInit() { this.activeChangeSubscription = this.activeChangeSubject.asObservable().subscribe((active) => { if (this.lastActiveBy) { this.element.classList.remove(this.lastActiveBy); } if (active) { this.element.classList.add(this.anchorActive); this.lastActiveBy = 'anchor-active-by-' + this.activeChangeBy; setTimeout(() => { this.element.classList.add(this.lastActiveBy); }, 0); } else { this.element.classList.remove(this.anchorActive); } }); } ngOnDestroy() { this.scrollListenTarget.removeEventListener('scroll', this.throttle); if (this.activeChangeSubscription) { this.activeChangeSubscription.unsubscribe(); } } beFocused() { this.boxElement.forceActiveAnchor(this.anchor, 'click-inside'); this.boxElement.isScrollingToTarget = false; } updateScrollListenTarget() { if (this.scrollListenTarget) { return; } if (this.boxElement && typeof window !== 'undefined') { this.scrollListenTarget = this.boxElement.scrollTarget || window; // window有scroll事件,document.documentElement没有scroll事件 } this.scrollListenTarget.addEventListener('scroll', this.throttle, { passive: true }); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AnchorDirective, deps: [{ token: i0.ElementRef }, { token: i1.AnchorService }], target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: AnchorDirective, selector: "[dAnchor]", inputs: { anchor: ["dAnchor", "anchor"], anchorActive: "anchorActive" }, host: { listeners: { "click": "beFocused()" } }, ngImport: i0 }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: AnchorDirective, decorators: [{ type: Directive, args: [{ selector: '[dAnchor]', }] }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.AnchorService }], propDecorators: { anchor: [{ type: Input, args: ['dAnchor'] }], anchorActive: [{ type: Input }], beFocused: [{ type: HostListener, args: ['click'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYW5jaG9yLmRpcmVjdGl2ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2RldnVpL2FuY2hvci9hbmNob3IuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBaUIsU0FBUyxFQUFFLFVBQVUsRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFhLE1BQU0sZUFBZSxDQUFDO0FBQ3JHLE9BQU8sRUFBRSxhQUFhLEVBQWdCLE1BQU0sTUFBTSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQzs7O0FBTWpELE1BQU0sT0FBTyxlQUFlO0lBSTFCLElBQUksUUFBUSxDQUFDLE1BQWU7UUFDMUIsSUFBSSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUM7UUFDeEIsSUFBSSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN0QyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ1gsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7UUFDbkQsQ0FBQzthQUFNLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxtQkFBbUIsS0FBSyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDbEUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUMxQyxDQUFDO0lBQ0gsQ0FBQztJQUNELElBQUksUUFBUTtRQUNWLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUN4QixDQUFDO0lBUUQsSUFBSSxVQUFVLENBQUMsR0FBZTtRQUM1QixJQUFJLENBQUMsV0FBVyxHQUFHLEdBQUcsQ0FBQztRQUN2QixJQUFJLENBQUMsd0JBQXdCLEVBQUUsQ0FBQztJQUNsQyxDQUFDO0lBQ0QsSUFBSSxVQUFVO1FBQ1osT0FBTyxJQUFJLENBQUMsV0FBVyxDQUFDO0lBQzFCLENBQUM7SUFVRCxZQUFvQixF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dCwgRGlyZWN0aXZlLCBFbGVtZW50UmVmLCBIb3N0TGlzdGVuZXIsIElucHV0LCBPbkRlc3Ryb3kgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFJlcGxheVN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQW5jaG9yU2VydmljZSB9IGZyb20gJy4vYW5jaG9yLnNlcnZpY2UnO1xuaW1wb3J0IHsgQW5jaG9yQWN0aXZlQ2hhbmdlU291cmNlLCBJQW5jaG9yQm94IH0gZnJvbSAnLi9hbmNob3IudHlwZSc7XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1tkQW5jaG9yXScsXG59KVxuZXhwb3J0IGNsYXNzIEFuY2hvckRpcmVjdGl2ZSBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIEBJbnB1dCgnZEFuY2hvcicpIGFuY2hvcjogc3RyaW5nO1xuICBASW5wdXQoKSBhbmNob3JBY3RpdmUgPSAnYWN0aXZlJztcbiAgX2lzQWN0aXZlOiBib29sZWFuO1xuICBzZXQgaXNBY3RpdmUoYWN0aXZlOiBib29sZWFuKSB7XG4gICAgdGhpcy5faXNBY3RpdmUgPSBhY3RpdmU7XG4gICAgdGhpcy5hY3RpdmVDaGFuZ2VTdWJqZWN0Lm5leHQoYWN0aXZlKTtcbiAgICBpZiAoYWN0aXZlKSB7XG4gICAgICB0aGlzLmFuY2hvclNlcnZpY2Uuc2V0Q3VycmVudEFjdGl2ZSh0aGlzLmFuY2hvcik7XG4gICAgfSBlbHNlIGlmICh0aGlzLmFuY2hvclNlcnZpY2UuY3VycmVudEFjdGl2ZUFuY2hvciA9PT0gdGhpcy5hbmNob3IpIHtcbiAgICAgIHRoaXMuYW5jaG9yU2VydmljZS5zZXRDdXJyZW50QWN0aXZlKCcnKTtcbiAgICB9XG4gIH1cbiAgZ2V0IGlzQWN0aXZlKCkge1xuICAgIHJldHVybiB0aGlzLl9pc0FjdGl2ZTtcbiAgfVxuICBhY3RpdmVDaGFuZ2VCeTogQW5jaG9yQWN0aXZlQ2hhbmdlU291cmNlO1xuICBhY3RpdmVDaGFuZ2VTdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbjtcbiAgYWN0aXZlQ2hhbmdlU3ViamVjdCA9IG5ldyBSZXBsYXlTdWJqZWN0KDEpO1xuICBsYXN0QWN0aXZlQnk6IHN0cmluZztcblxuICBlbGVtZW50OiBIVE1MRWxlbWVudDtcbiAgX2JveEVsZW1lbnQ6IElBbmNob3JCb3g7XG4gIHNldCBib3hFbGVtZW50KGJveDogSUFuY2hvckJveCkge1xuICAgIHRoaXMuX2JveEVsZW1lbnQgPSBib3g7XG4gICAgdGhpcy51cGRhdGVTY3JvbGxMaXN0ZW5UYXJnZXQoKTtcbiAgfVxuICBnZXQgYm94RWxlbWVudCgpIHtcbiAgICByZXR1cm4gdGhpcy5fYm94RWxlbWVudDtcbiAgfVxuXG4gIHNjcm9sbExpc3RlblRhcmdldDogRWxlbWVudCB8IFdpbmRvdztcbiAgUkVBQ0hfVE9QX1ZJU0lPTl9PRkZTRVQgPSA1MDtcblxuICBwcml2YXRlIFRIUk9UVExFX0RFTEFZID0gMTAwO1xuICBwcml2YXRlIFRIUk9UVExFX1RSSUdHRVIgPSA2MDA7XG4gIHByaXZhdGUgc2Nyb2xsUHJlU3RhcnQ7XG4gIHByaXZhdGUgc2Nyb2xsVGltZXI7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlbDogRWxlbWVudFJlZiwgcHJpdmF0ZSBhbmNob3JTZXJ2aWNlOiBBbmNob3JTZXJ2aWNlKSB7XG4gICAgdGhpcy5lbGVtZW50ID0gdGhpcy5lbC5uYXRpdmVFbGVtZW50O1xuICB9XG5cbiAgbmdBZnRlclZpZXdJbml0KCkge1xuICAgIHRoaXMuYWN0aXZlQ2hhbmdlU3Vic2NyaXB0aW9uID0gdGhpcy5hY3RpdmVDaGFuZ2VTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpLnN1YnNjcmliZSgoYWN0aXZlKSA9PiB7XG4gICAgICBpZiAodGhpcy5sYXN0QWN0aXZlQnkpIHtcbiAgICAgICAgdGhpcy5lbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUodGhpcy5sYXN0QWN0aXZlQnkpO1xuICAgICAgfVxuICAgICAgaWYgKGFjdGl2ZSkge1xuICAgICAgICB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LmFkZCh0aGlzLmFuY2hvckFjdGl2ZSk7XG4gICAgICAgIHRoaXMubGFzdEFjdGl2ZUJ5ID0gJ2FuY2hvci1hY3RpdmUtYnktJyArIHRoaXMuYWN0aXZlQ2hhbmdlQnk7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIHRoaXMuZWxlbWVudC5jbGFzc0xpc3QuYWRkKHRoaXMubGFzdEFjdGl2ZUJ5KTtcbiAgICAgICAgfSwgMCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmVsZW1lbnQuY2xhc3NMaXN0LnJlbW92ZSh0aGlzLmFuY2hvckFjdGl2ZSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLnNjcm9sbExpc3RlblRhcmdldC5yZW1vdmVFdmVudExpc3RlbmVyKCdzY3JvbGwnLCB0aGlzLnRocm90dGxlKTtcbiAgICBpZiAodGhpcy5hY3RpdmVDaGFuZ2VTdWJzY3JpcHRpb24pIHtcbiAgICAgIHRoaXMuYWN0aXZlQ2hhbmdlU3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgfVxuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignY2xpY2snKSAvLyDpvKDmoIfokL3lhaXojIPlm7TvvIzmv4DmtLthbmNob3JcbiAgYmVGb2N1c2VkKCkge1xuICAgIHRoaXMuYm94RWxlbWVudC5mb3JjZUFjdGl2ZUFuY2hvcih0aGlzLmFuY2hvciwgJ2NsaWNrLWluc2lkZScpO1xuICAgIHRoaXMuYm94RWxlbWVudC5pc1Njcm9sbGluZ1RvVGFyZ2V0ID0gZmFsc2U7XG4gIH1cblxuICB0aHJvdHRsZSA9ICgpID0+IHtcbiAgICBjb25zdCBmbiA9IHRoaXMuY2hlY2tBY3RpdmVTdGF0dXM7XG4gICAgY29uc3QgdGltZSA9IERhdGUubm93KCk7XG4gICAgaWYgKHRoaXMuc2Nyb2xsVGltZXIpIHtcbiAgICAgIGNsZWFyVGltZW91dCh0aGlzLnNjcm9sbFRpbWVyKTtcbiAgICB9XG4gICAgaWYgKCF0aGlzLnNjcm9sbFByZVN0YXJ0KSB7XG4gICAgICB0aGlzLnNjcm9sbFByZVN0YXJ0ID0gdGltZTtcbiAgICB9XG4gICAgaWYgKHRpbWUgLSB0aGlzLnNjcm9sbFByZVN0YXJ0ID4gdGhpcy5USFJPVFRMRV9UUklHR0VSKSB7XG4gICAgICBmbigpO1xuICAgICAgdGhpcy5zY3JvbGxQcmVTdGFydCA9IG51bGw7XG4gICAgICB0aGlzLnNjcm9sbFRpbWVyID0gbnVsbDtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5zY3JvbGxUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICBmbigpO1xuICAgICAgICB0aGlzLnNjcm9sbFByZVN0YXJ0ID0gbnVsbDtcbiAgICAgICAgdGhpcy5zY3JvbGxUaW1lciA9IG51bGw7XG4gICAgICB9LCB0aGlzLlRIUk9UVExFX0RFTEFZKTtcbiAgICB9XG4gIH07XG5cbiAgY2hlY2tBY3RpdmVTdGF0dXMgPSAoYWN0aXZlQ2hhbmdlQnk/OiBBbmNob3JBY3RpdmVDaGFuZ2VTb3VyY2UpID0+IHtcbiAgICBpZiAodGhpcy5ib3hFbGVtZW50LmlzU2Nyb2xsaW5nVG9UYXJnZXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgZG9tID0gdGhpcy5ib3hFbGVtZW50LnNjcm9sbFRhcmdldDtcbiAgICBjb25zdCBmaXggPSBkb20gJiYgZG9tIGluc3RhbmNlb2YgRWxlbWVudCA/IGRvbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgOiAwO1xuICAgIGNvbnN0IHRvcCA9IHRoaXMuZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgLSBmaXggLSAoKHRoaXMuYm94RWxlbWVudC52aWV3ICYmIHRoaXMuYm94RWxlbWVudC52aWV3LnRvcCkgfHwgMCk7XG4gICAgY29uc3QgYm90dG9tID0gdGhpcy5lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLmJvdHRvbSAtIGZpeCAtICgodGhpcy5ib3hFbGVtZW50LnZpZXcgJiYgdGhpcy5ib3hFbGVtZW50LnZpZXcudG9wKSB8fCAwKTtcbiAgICBjb25zdCBjdXJyZW50QWN0aXZlQW5jaG9yID0gdGhpcy5hbmNob3JTZXJ2aWNlLmN1cnJlbnRBY3RpdmVBbmNob3I7XG5cbiAgICBpZiAodGhpcy5hbmNob3IgPT09IHRoaXMuYm94RWxlbWVudC5kZWZhdWx0QW5jaG9yICYmICghY3VycmVudEFjdGl2ZUFuY2hvciB8fCBjdXJyZW50QWN0aXZlQW5jaG9yID09PSB0aGlzLmJveEVsZW1lbnQuZGVmYXVsdEFuY2hvcikpIHtcbiAgICAgIHRoaXMuYWN0aXZlQ2hhbmdlQnkgPSBhY3RpdmVDaGFuZ2VCeSB8fCAnc2Nyb2xsJztcbiAgICAgIHRoaXMuaXNBY3RpdmUgPSBib3R0b20gPiB0aGlzLlJFQUNIX1RPUF9WSVNJT05fT0ZGU0VUO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHRoaXMuYWN0aXZlQ2hhbmdlQnkgPSBhY3RpdmVDaGFuZ2VCeSB8fCAnc2Nyb2xsJztcbiAgICB0aGlzLmlzQWN0aXZlID0gYm90dG9tID4gdGhpcy5SRUFDSF9UT1BfVklTSU9OX09GRlNFVCAmJiB0b3AgPCB0aGlzLlJFQUNIX1RPUF9WSVNJT05fT0ZGU0VUO1xuICB9O1xuXG4gIHVwZGF0ZVNjcm9sbExpc3RlblRhcmdldCgpIHtcbiAgICBpZiAodGhpcy5zY3JvbGxMaXN0ZW5UYXJnZXQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuYm94RWxlbWVudCAmJiB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgdGhpcy5zY3JvbGxMaXN0ZW5UYXJnZXQgPSB0aGlzLmJveEVsZW1lbnQuc2Nyb2xsVGFyZ2V0IHx8IHdpbmRvdzsgLy8gd2luZG935pyJc2Nyb2xs5LqL5Lu277yMZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW505rKh5pyJc2Nyb2xs5LqL5Lu2XG4gICAgfVxuICAgIHRoaXMuc2Nyb2xsTGlzdGVuVGFyZ2V0LmFkZEV2ZW50TGlzdGVuZXIoJ3Njcm9sbCcsIHRoaXMudGhyb3R0bGUsIHsgcGFzc2l2ZTogdHJ1ZSB9KTtcbiAgfVxufVxuIl19