@alauda-fe/common
Version:
Alauda frontend team common codes.
130 lines • 15.5 kB
JavaScript
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=