UNPKG

@alauda-fe/common

Version:

Alauda frontend team common codes.

130 lines 15.5 kB
import { CdkScrollable } from '@angular/cdk/scrolling'; import { Directive, ElementRef, HostBinding, HostListener, Input, Optional, } from '@angular/core'; import { ControlContainer } from '@angular/forms'; import { fromEvent, debounceTime, startWith, take } from 'rxjs'; import * as i0 from "@angular/core"; import * as i1 from "@angular/forms"; import * as i2 from "@angular/cdk/scrolling"; const FOCUSABLE_TAG_NAMES = ['INPUT', 'TEXTAREA']; const NG_INVALID = '.ng-invalid'; const MARKED_CLASS_NAME = 'acl-scroll-to-first-invalid-marker'; const SELECTORS = [ [ FOCUSABLE_TAG_NAMES.map(tagName => `${tagName}${NG_INVALID}`), ...[ 'aui-number-input', 'aui-tags-input', 'aui-select', 'aui-multi-select', 'aui-switch', 'aui-tree-select', ].map(tagName => `${tagName}${NG_INVALID} input`), `aui-radio-group${NG_INVALID}`, `.${MARKED_CLASS_NAME}${NG_INVALID}`, ].join(','), NG_INVALID, ]; export class ScrollToFirstInvalidMarkerDirective { constructor() { this.aclScrollToFirstInvalidMarker = false; } static { this.ɵfac = function ScrollToFirstInvalidMarkerDirective_Factory(t) { return new (t || ScrollToFirstInvalidMarkerDirective)(); }; } static { this.ɵdir = /*@__PURE__*/ i0.ɵɵdefineDirective({ type: ScrollToFirstInvalidMarkerDirective, selectors: [["", "aclScrollToFirstInvalidMarker", ""]], hostVars: 4, hostBindings: function ScrollToFirstInvalidMarkerDirective_HostBindings(rf, ctx) { if (rf & 2) { i0.ɵɵclassProp("acl-scroll-to-first-invalid-marker", ctx.aclScrollToFirstInvalidMarker)("ng-invalid", ctx.aclScrollToFirstInvalidMarker); } }, inputs: { aclScrollToFirstInvalidMarker: "aclScrollToFirstInvalidMarker" } }); } } (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ScrollToFirstInvalidMarkerDirective, [{ type: Directive, args: [{ selector: '[aclScrollToFirstInvalidMarker]', }] }], null, { aclScrollToFirstInvalidMarker: [{ type: HostBinding, args: [`class.${MARKED_CLASS_NAME}`] }, { type: HostBinding, args: ['class.ng-invalid'] }, { type: Input }] }); })(); export class ScrollToFirstInvalidDirective { get containerEl() { return this.cdkScrollable?.getElementRef().nativeElement || window; } onSubmit() { requestAnimationFrame(() => { if (this.aclScrollToFirstInvalid === '' ? this.controlContainer.invalid : this.aclScrollToFirstInvalid) { this.scrollToFirstInvalid(); } }); } constructor(elRef, controlContainer, cdkScrollable) { this.elRef = elRef; this.controlContainer = controlContainer; this.cdkScrollable = cdkScrollable; this.labelOffset = this.cdkScrollable ? 20 : 150; } scrollToFirstInvalid() { const firstInvalidEl = this.getFirstInvalidInput(); if (!firstInvalidEl) { return; } this.containerEl.scrollTo({ top: this.getTopOffset(firstInvalidEl), behavior: 'smooth', }); if (FOCUSABLE_TAG_NAMES.includes(firstInvalidEl.tagName)) { fromEvent(this.containerEl, 'scroll') .pipe(startWith(null), debounceTime(100), take(1)) .subscribe(() => firstInvalidEl.focus()); } } getFirstInvalidInput() { const el = this.elRef.nativeElement; const hiddenEls = Array.from(el.querySelectorAll('[hidden]')); for (const selector of SELECTORS) { const ctrlEls = Array.from(el.querySelectorAll(selector)); for (const ctrlEl of ctrlEls) { if (hiddenEls.some(hiddenEl => hiddenEl === ctrlEl || hiddenEl.contains(ctrlEl))) { continue; } return ctrlEl; } } } getTopOffset(controlEl) { const labelOffset = this.labelOffset; const controlElTop = controlEl.getBoundingClientRect().top; if (this.cdkScrollable) { const containerEl = this.containerEl; const containerTop = containerEl.getBoundingClientRect().top; const absoluteControlElTop = controlElTop + containerEl.scrollTop; return absoluteControlElTop - containerTop - labelOffset; } const absoluteControlElTop = controlElTop + window.scrollY; return absoluteControlElTop - labelOffset; } static { this.ɵfac = function ScrollToFirstInvalidDirective_Factory(t) { return new (t || ScrollToFirstInvalidDirective)(i0.ɵɵdirectiveInject(i0.ElementRef), i0.ɵɵdirectiveInject(i1.ControlContainer), i0.ɵɵdirectiveInject(i2.CdkScrollable, 8)); }; } static { this.ɵdir = /*@__PURE__*/ i0.ɵɵdefineDirective({ type: ScrollToFirstInvalidDirective, selectors: [["", "aclScrollToFirstInvalid", ""]], hostBindings: function ScrollToFirstInvalidDirective_HostBindings(rf, ctx) { if (rf & 1) { i0.ɵɵlistener("ngSubmit", function ScrollToFirstInvalidDirective_ngSubmit_HostBindingHandler() { return ctx.onSubmit(); }); } }, inputs: { labelOffset: "labelOffset", aclScrollToFirstInvalid: "aclScrollToFirstInvalid" }, standalone: true }); } } (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ScrollToFirstInvalidDirective, [{ type: Directive, args: [{ selector: '[aclScrollToFirstInvalid]', standalone: true, }] }], () => [{ type: i0.ElementRef }, { type: i1.ControlContainer }, { type: i2.CdkScrollable, decorators: [{ type: Optional }] }], { labelOffset: [{ type: Input }], aclScrollToFirstInvalid: [{ type: Input }], onSubmit: [{ type: HostListener, args: ['ngSubmit'] }] }); })(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nyb2xsLXRvLWZpcnN0LWludmFsaWQuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9jb21tb24vc3JjL2NvcmUvZGlyZWN0aXZlcy9zY3JvbGwtdG8tZmlyc3QtaW52YWxpZC5kaXJlY3RpdmUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ3ZELE9BQU8sRUFDTCxTQUFTLEVBQ1QsVUFBVSxFQUNWLFdBQVcsRUFDWCxZQUFZLEVBQ1osS0FBSyxFQUNMLFFBQVEsR0FDVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUsU0FBUyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDOzs7O0FBRWhFLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxPQUFPLEVBQUUsVUFBVSxDQUFDLENBQUM7QUFDbEQsTUFBTSxVQUFVLEdBQUcsYUFBYSxDQUFDO0FBQ2pDLE1BQU0saUJBQWlCLEdBQUcsb0NBQW9DLENBQUM7QUFFL0QsTUFBTSxTQUFTLEdBQUc7SUFDaEI7UUFDRSxtQkFBbUIsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sR0FBRyxVQUFVLEVBQUUsQ0FBQztRQUM3RCxHQUFHO1lBQ0Qsa0JBQWtCO1lBQ2xCLGdCQUFnQjtZQUNoQixZQUFZO1lBQ1osa0JBQWtCO1lBQ2xCLFlBQVk7WUFDWixpQkFBaUI7U0FDbEIsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxHQUFHLE9BQU8sR0FBRyxVQUFVLFFBQVEsQ0FBQztRQUNqRCxrQkFBa0IsVUFBVSxFQUFFO1FBQzlCLElBQUksaUJBQWlCLEdBQUcsVUFBVSxFQUFFO0tBQ3JDLENBQUMsSUFBSSxD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QztvQkFDRCxTQUFTO2dCQUNYLENBQUM7Z0JBQ0QsT0FBTyxNQUFNLENBQUM7WUFDaEIsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRU8sWUFBWSxDQUFDLFNBQXNCO1FBQ3pDLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDckMsTUFBTSxZQUFZLEdBQUcsU0FBUyxDQUFDLHFCQUFxQixFQUFFLENBQUMsR0FBRyxDQUFDO1FBRTNELElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3ZCLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxXQUEwQixDQUFDO1lBQ3BELE1BQU0sWUFBWSxHQUFHLFdBQVcsQ0FBQyxxQkFBcUIsRUFBRSxDQUFDLEdBQUcsQ0FBQztZQUM3RCxNQUFNLG9CQUFvQixHQUFHLFlBQVksR0FBRyxXQUFXLENBQUMsU0FBUyxDQUFDO1lBQ2xFLE9BQU8sb0JBQW9CLEdBQUcsWUFBWSxHQUFHLFdBQVcsQ0FBQztRQUMzRCxDQUFDO1FBRUQsTUFBTSxvQkFBb0IsR0FBRyxZQUFZLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQztRQUMzRCxPQUFPLG9CQUFvQixHQUFHLFdBQVcsQ0FBQztJQUM1QyxDQUFDOzhGQWhGVSw2QkFBNkI7b0VBQTdCLDZCQUE2QjtZQUE3Qix3R0FBQSxjQUFVLElBQW1COzs7aUZBQTdCLDZCQUE2QjtjQUp6QyxTQUFTO2VBQUM7Z0JBQ1QsUUFBUSxFQUFFLDJCQUEyQjtnQkFDckMsVUFBVSxFQUFFLElBQUk7YUFDakI7O3NCQTRCSSxRQUFRO3FCQXpCWCxXQUFXO2tCQURWLEtBQUs7WUFJTix1QkFBdUI7a0JBRHRCLEtBQUs7WUFRTixRQUFRO2tCQURQLFlBQVk7bUJBQUMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENka1Njcm9sbGFibGUgfSBmcm9tICdAYW5ndWxhci9jZGsvc2Nyb2xsaW5nJztcbmltcG9ydCB7XG4gIERpcmVjdGl2ZSxcbiAgRWxlbWVudFJlZixcbiAgSG9zdEJpbmRpbmcsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5wdXQsXG4gIE9wdGlvbmFsLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xDb250YWluZXIgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBmcm9tRXZlbnQsIGRlYm91bmNlVGltZSwgc3RhcnRXaXRoLCB0YWtlIH0gZnJvbSAncnhqcyc7XG5cbmNvbnN0IEZPQ1VTQUJMRV9UQUdfTkFNRVMgPSBbJ0lOUFVUJywgJ1RFWFRBUkVBJ107XG5jb25zdCBOR19JTlZBTElEID0gJy5uZy1pbnZhbGlkJztcbmNvbnN0IE1BUktFRF9DTEFTU19OQU1FID0gJ2FjbC1zY3JvbGwtdG8tZmlyc3QtaW52YWxpZC1tYXJrZXInO1xuXG5jb25zdCBTRUxFQ1RPUlMgPSBbXG4gIFtcbiAgICBGT0NVU0FCTEVfVEFHX05BTUVTLm1hcCh0YWdOYW1lID0+IGAke3RhZ05hbWV9JHtOR19JTlZBTElEfWApLFxuICAgIC4uLltcbiAgICAgICdhdWktbnVtYmVyLWlucHV0JyxcbiAgICAgICdhdWktdGFncy1pbnB1dCcsXG4gICAgICAnYXVpLXNlbGVjdCcsXG4gICAgICAnYXVpLW11bHRpLXNlbGVjdCcsXG4gICAgICAnYXVpLXN3aXRjaCcsXG4gICAgICAnYXVpLXRyZWUtc2VsZWN0JyxcbiAgICBdLm1hcCh0YWdOYW1lID0+IGAke3RhZ05hbWV9JHtOR19JTlZBTElEfSBpbnB1dGApLFxuICAgIGBhdWktcmFkaW8tZ3JvdXAke05HX0lOVkFMSUR9YCxcbiAgICBgLiR7TUFSS0VEX0NMQVNTX05BTUV9JHtOR19JTlZBTElEfWAsXG4gIF0uam9pbignLCcpLFxuICBOR19JTlZBTElELFxuXTtcblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2FjbFNjcm9sbFRvRmlyc3RJbnZhbGlkTWFya2VyXScsXG59KVxuZXhwb3J0IGNsYXNzIFNjcm9sbFRvRmlyc3RJbnZhbGlkTWFya2VyRGlyZWN0aXZlIHtcbiAgQEhvc3RCaW5kaW5nKGBjbGFzcy4ke01BUktFRF9DTEFTU19OQU1FfWApXG4gIEBIb3N0QmluZGluZygnY2xhc3MubmctaW52YWxpZCcpXG4gIEBJbnB1dCgpXG4gIGFjbFNjcm9sbFRvRmlyc3RJbnZhbGlkTWFya2VyID0gZmFsc2U7XG59XG5cbkBEaXJlY3RpdmUoe1xuICBzZWxlY3RvcjogJ1thY2xTY3JvbGxUb0ZpcnN0SW52YWxpZF0nLFxuICBzdGFuZGFsb25lOiB0cnVlLFxufSlcbmV4cG9ydCBjbGFzcyBTY3JvbGxUb0ZpcnN0SW52YWxpZERpcmVjdGl2ZSB7XG4gIEBJbnB1dCgpXG4gIGxhYmVsT2Zmc2V0ID0gdGhpcy5jZGtTY3JvbGxhYmxlID8gMjAgOiAxNTA7XG5cbiAgQElucHV0KClcbiAgYWNsU2Nyb2xsVG9GaXJzdEludmFsaWQ6IGJvb2xlYW4gfCAnJztcblxuICBnZXQgY29udGFpbmVyRWwoKSB7XG4gICAgcmV0dXJuIHRoaXMuY2RrU2Nyb2xsYWJsZT8uZ2V0RWxlbWVudFJlZigpLm5hdGl2ZUVsZW1lbnQgfHwgd2luZG93O1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignbmdTdWJtaXQnKVxuICBvblN1Ym1pdCgpIHtcbiAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKCkgPT4ge1xuICAgICAgaWYgKFxuICAgICAgICB0aGlzLmFjbFNjcm9sbFRvRmlyc3RJbnZhbGlkID09PSAnJ1xuICAgICAgICAgID8gdGhpcy5jb250cm9sQ29udGFpbmVyLmludmFsaWRcbiAgICAgICAgICA6IHRoaXMuYWNsU2Nyb2xsVG9GaXJzdEludmFsaWRcbiAgICAgICkge1xuICAgICAgICB0aGlzLnNjcm9sbFRvRmlyc3RJbnZhbGlkKCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIHJlYWRvbmx5IGVsUmVmOiBFbGVtZW50UmVmPEhUTUxFbGVtZW50PixcbiAgICBwcml2YXRlIHJlYWRvbmx5IGNvbnRyb2xDb250YWluZXI6IENvbnRyb2xDb250YWluZXIsXG4gICAgQE9wdGlvbmFsKCkgcHJpdmF0ZSByZWFkb25seSBjZGtTY3JvbGxhYmxlOiBDZGtTY3JvbGxhYmxlLFxuICApIHt9XG5cbiAgc2Nyb2xsVG9GaXJzdEludmFsaWQoKSB7XG4gICAgY29uc3QgZmlyc3RJbnZhbGlkRWwgPSB0aGlzLmdldEZpcnN0SW52YWxpZElucHV0KCk7XG5cbiAgICBpZiAoIWZpcnN0SW52YWxpZEVsKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdGhpcy5jb250YWluZXJFbC5zY3JvbGxUbyh7XG4gICAgICB0b3A6IHRoaXMuZ2V0VG9wT2Zmc2V0KGZpcnN0SW52YWxpZEVsKSxcbiAgICAgIGJlaGF2aW9yOiAnc21vb3RoJyxcbiAgICB9KTtcblxuICAgIGlmIChGT0NVU0FCTEVfVEFHX05BTUVTLmluY2x1ZGVzKGZpcnN0SW52YWxpZEVsLnRhZ05hbWUpKSB7XG4gICAgICBmcm9tRXZlbnQodGhpcy5jb250YWluZXJFbCwgJ3Njcm9sbCcpXG4gICAgICAgIC5waXBlKHN0YXJ0V2l0aChudWxsIGFzIHZvaWQpLCBkZWJvdW5jZVRpbWUoMTAwKSwgdGFrZSgxKSlcbiAgICAgICAgLnN1YnNjcmliZSgoKSA9PiBmaXJzdEludmFsaWRFbC5mb2N1cygpKTtcbiAgICB9XG4gIH1cblxuICBnZXRGaXJzdEludmFsaWRJbnB1dCgpIHtcbiAgICBjb25zdCBlbCA9IHRoaXMuZWxSZWYubmF0aXZlRWxlbWVudDtcbiAgICBjb25zdCBoaWRkZW5FbHMgPSBBcnJheS5mcm9tKGVsLnF1ZXJ5U2VsZWN0b3JBbGwoJ1toaWRkZW5dJykpO1xuICAgIGZvciAoY29uc3Qgc2VsZWN0b3Igb2YgU0VMRUNUT1JTKSB7XG4gICAgICBjb25zdCBjdHJsRWxzID0gQXJyYXkuZnJvbShlbC5xdWVyeVNlbGVjdG9yQWxsPEhUTUxFbGVtZW50PihzZWxlY3RvcikpO1xuICAgICAgZm9yIChjb25zdCBjdHJsRWwgb2YgY3RybEVscykge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgaGlkZGVuRWxzLnNvbWUoXG4gICAgICAgICAgICBoaWRkZW5FbCA9PiBoaWRkZW5FbCA9PT0gY3RybEVsIHx8IGhpZGRlbkVsLmNvbnRhaW5zKGN0cmxFbCksXG4gICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY3RybEVsO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgZ2V0VG9wT2Zmc2V0KGNvbnRyb2xFbDogSFRNTEVsZW1lbnQpOiBudW1iZXIge1xuICAgIGNvbnN0IGxhYmVsT2Zmc2V0ID0gdGhpcy5sYWJlbE9mZnNldDtcbiAgICBjb25zdCBjb250cm9sRWxUb3AgPSBjb250cm9sRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wO1xuXG4gICAgaWYgKHRoaXMuY2RrU2Nyb2xsYWJsZSkge1xuICAgICAgY29uc3QgY29udGFpbmVyRWwgPSB0aGlzLmNvbnRhaW5lckVsIGFzIEhUTUxFbGVtZW50O1xuICAgICAgY29uc3QgY29udGFpbmVyVG9wID0gY29udGFpbmVyRWwuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkudG9wO1xuICAgICAgY29uc3QgYWJzb2x1dGVDb250cm9sRWxUb3AgPSBjb250cm9sRWxUb3AgKyBjb250YWluZXJFbC5zY3JvbGxUb3A7XG4gICAgICByZXR1cm4gYWJzb2x1dGVDb250cm9sRWxUb3AgLSBjb250YWluZXJUb3AgLSBsYWJlbE9mZnNldDtcbiAgICB9XG5cbiAgICBjb25zdCBhYnNvbHV0ZUNvbnRyb2xFbFRvcCA9IGNvbnRyb2xFbFRvcCArIHdpbmRvdy5zY3JvbGxZO1xuICAgIHJldHVybiBhYnNvbHV0ZUNvbnRyb2xFbFRvcCAtIGxhYmVsT2Zmc2V0O1xuICB9XG59XG4iXX0=