UNPKG

ng-devui

Version:

DevUI components based on Angular

125 lines 14.5 kB
import { ChangeDetectionStrategy, Component, Directive, ElementRef, Host, HostBinding, Input, Optional, Renderer2 } from '@angular/core'; import { fromEvent, Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; import { FormDirective } from './form.directive'; import * as i0 from "@angular/core"; import * as i1 from "./form.directive"; export class FormOperationComponent { constructor(elementRef, renderer) { renderer.addClass(elementRef.nativeElement, 'devui-form-operation'); } ngOnInit() { } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormOperationComponent, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: FormOperationComponent, selector: "d-form-operation", ngImport: i0, template: '<ng-content></ng-content>', isInline: true, styles: [".devui-form-horizontal :host.devui-form-operation{display:block;margin-left:96px}.devui-form-vertical :host.devui-form-operation{display:block}.devui-form-columns :host.devui-form-operation{display:block;padding:8px 0}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: FormOperationComponent, decorators: [{ type: Component, args: [{ selector: 'd-form-operation', template: '<ng-content></ng-content>', changeDetection: ChangeDetectionStrategy.OnPush, preserveWhitespaces: false, styles: [".devui-form-horizontal :host.devui-form-operation{display:block;margin-left:96px}.devui-form-vertical :host.devui-form-operation{display:block}.devui-form-columns :host.devui-form-operation{display:block;padding:8px 0}\n"] }] }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }] }); export class DFormSubmitDirective { set eventName(eventName) { if (eventName) { this._eventName = eventName; this.registerEvent(); } } // TODO:这里是否需要接管如果所关联的表单校验不通过,切换到disabled状态 constructor(elementRef, _dForm) { this.elementRef = elementRef; this._dForm = _dForm; this.default = true; this._eventName = 'click'; this.destroy$ = new Subject(); } ngAfterViewInit() { this.registerEvent(); } ngOnDestroy() { this.destroy$.next(); this.destroy$.complete(); } registerEvent() { this.destroy$.next(); fromEvent(this.elementRef.nativeElement, this._eventName) .pipe(takeUntil(this.destroy$)) .subscribe(($event) => { if (this._dForm) { this._dForm.updateOnSubmit($event, this.data); } }); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DFormSubmitDirective, deps: [{ token: i0.ElementRef }, { token: i1.FormDirective, host: true, optional: true }], target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: DFormSubmitDirective, selector: "[dFormSubmit]", inputs: { eventName: ["dFormSubmit", "eventName"], data: ["dFormSubmitData", "data"] }, host: { properties: { "class.devui-form-submit": "this.default" } }, ngImport: i0 }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DFormSubmitDirective, decorators: [{ type: Directive, args: [{ selector: '[dFormSubmit]', }] }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.FormDirective, decorators: [{ type: Optional }, { type: Host }] }], propDecorators: { default: [{ type: HostBinding, args: ['class.devui-form-submit'] }], eventName: [{ type: Input, args: ['dFormSubmit'] }], data: [{ type: Input, args: ['dFormSubmitData'] }] } }); export class DFormResetDirective { set eventName(eventName) { if (eventName) { this._eventName = eventName; this.registerEvent(); } } constructor(elementRef, _dForm) { this.elementRef = elementRef; this._dForm = _dForm; this.default = true; // TODO: emit now form // TODO: Abstract a parent class this._eventName = 'click'; this.destroy$ = new Subject(); } ngAfterViewInit() { this.registerEvent(); } ngOnDestroy() { this.destroy$.next(); this.destroy$.complete(); } registerEvent() { this.destroy$.next(); fromEvent(this.elementRef.nativeElement, this._eventName) .pipe(takeUntil(this.destroy$)) .subscribe(() => { if (this._dForm) { this._dForm.updateOnReset(); } }); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DFormResetDirective, deps: [{ token: i0.ElementRef }, { token: i1.FormDirective, host: true, optional: true }], target: i0.ɵɵFactoryTarget.Directive }); } static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.13", type: DFormResetDirective, selector: "[dFormReset]", inputs: { eventName: ["dFormReset", "eventName"] }, host: { properties: { "class.devui-form-reset": "this.default" } }, ngImport: i0 }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DFormResetDirective, decorators: [{ type: Directive, args: [{ selector: '[dFormReset]', }] }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i1.FormDirective, decorators: [{ type: Optional }, { type: Host }] }], propDecorators: { default: [{ type: HostBinding, args: ['class.devui-form-reset'] }], eventName: [{ type: Input, args: ['dFormReset'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9ybS1vcGVyYXRpb24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vZGV2dWkvZm9ybS9mb3JtLW9wZXJhdGlvbi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUVMLHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsU0FBUyxFQUNULFVBQVUsRUFDVixJQUFJLEVBQ0osV0FBVyxFQUNYLEtBQUssRUFHTCxRQUFRLEVBQ1IsU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQzFDLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzQyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7OztBQXVCakQsTUFBTSxPQUFPLHNCQUFzQjtJQUNqQyxZQUFZLFVBQXNCLEVBQUUsUUFBbUI7UUFDckQsUUFBUSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsYUFBYSxFQUFFLHNCQUFzQixDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUVELFFBQVEsS0FBSSxDQUFDOytHQUxGLHNCQUFzQjttR0FBdEIsc0JBQXNCLHdEQW5CdkIsMkJBQTJCOzs0RkFtQjFCLHNCQUFzQjtrQkFyQmxDLFNBQVM7K0JBQ0Usa0JBQWtCLFlBQ2xCLDJCQUEyQixtQkFnQnBCLHVCQUF1QixDQUFDLE1BQU0sdUJBQzFCLEtBQUs7O0FBYTVCLE1BQU0sT0FBTyxvQkFBb0I7SUFJL0IsSUFDSSxTQUFTLENBQUMsU0FBUztRQUNyQixJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ2QsSUFBSSxDQUFDLFVBQVUsR0FBRyxTQUFTLENBQUM7WUFDNUIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1FBQ3ZCLENBQUM7SUFDSCxDQUFDO0lBTUQsMkNBQTJDO0lBRTNDLFlBQW9CLFVBQXNCLEVBQThCLE1BQXFCO1FB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OzswQkFpQjhDLFFBQVE7OzBCQUFJLElBQUk7eUNBZnRCLE9BQU87c0JBQTdDLFdBQVc7dUJBQUMsd0JBQXdCO2dCQU1qQyxTQUFTO3NCQURaLEtBQUs7dUJBQUMsWUFBWSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIEFmdGVyVmlld0luaXQsXG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIERpcmVjdGl2ZSxcbiAgRWxlbWVudFJlZixcbiAgSG9zdCxcbiAgSG9zdEJpbmRpbmcsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgT3B0aW9uYWwsXG4gIFJlbmRlcmVyMlxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGZyb21FdmVudCwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHsgRm9ybURpcmVjdGl2ZSB9IGZyb20gJy4vZm9ybS5kaXJlY3RpdmUnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdkLWZvcm0tb3BlcmF0aW9uJyxcbiAgdGVtcGxhdGU6ICc8bmctY29udGVudD48L25nLWNvbnRlbnQ+JyxcbiAgc3R5bGVzOiBbXG4gICAgYFxuICAgICAgLmRldnVpLWZvcm0taG9yaXpvbnRhbCA6aG9zdC5kZXZ1aS1mb3JtLW9wZXJhdGlvbiB7XG4gICAgICAgIGRpc3BsYXk6IGJsb2NrO1xuICAgICAgICBtYXJnaW4tbGVmdDogOTZweDtcbiAgICAgIH1cbiAgICAgIC5kZXZ1aS1mb3JtLXZlcnRpY2FsIDpob3N0LmRldnVpLWZvcm0tb3BlcmF0aW9uIHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICB9XG4gICAgICAuZGV2dWktZm9ybS1jb2x1bW5zIDpob3N0LmRldnVpLWZvcm0tb3BlcmF0aW9uIHtcbiAgICAgICAgZGlzcGxheTogYmxvY2s7XG4gICAgICAgIHBhZGRpbmc6IDhweCAwO1xuICAgICAgfVxuICAgIGAsXG4gIF0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICBwcmVzZXJ2ZVdoaXRlc3BhY2VzOiBmYWxzZSxcbn0pXG5leHBvcnQgY2xhc3MgRm9ybU9wZXJhdGlvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gIGNvbnN0cnVjdG9yKGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsIHJlbmRlcmVyOiBSZW5kZXJlcjIpIHtcbiAgICByZW5kZXJlci5hZGRDbGFzcyhlbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdkZXZ1aS1mb3JtLW9wZXJhdGlvbicpO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7fVxufVxuXG5ARGlyZWN0aXZlKHtcbiAgc2VsZWN0b3I6ICdbZEZvcm1TdWJtaXRdJyxcbn0pXG5leHBvcnQgY2xhc3MgREZvcm1TdWJtaXREaXJlY3RpdmUgaW1wbGVtZW50cyBBZnRlclZpZXdJbml0LCBPbkRlc3Ryb3kge1xuICBASG9zdEJpbmRpbmcoJ2NsYXNzLmRldnVpLWZvcm0tc3VibWl0JykgZGVmYXVsdCA9IHRydWU7XG5cbiAgX2V2ZW50TmFtZSA9ICdjbGljayc7XG4gIEBJbnB1dCgnZEZvcm1TdWJtaXQnKVxuICBzZXQgZXZlbnROYW1lKGV2ZW50TmFtZSkge1xuICAgIGlmIChldmVudE5hbWUpIHtcbiAgICAgIHRoaXMuX2V2ZW50TmFtZSA9IGV2ZW50TmFtZTtcbiAgICAgIHRoaXMucmVnaXN0ZXJFdmVudCgpO1xuICAgIH1cbiAgfVxuXG4gIEBJbnB1dCgnZEZvcm1TdWJtaXREYXRhJykgZGF0YTogYW55O1xuXG4gIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xuXG4gIC8vIFRPRE/vvJrov5nph4zmmK/lkKbpnIDopoHmjqXnrqHlpoLmnpzmiYDlhbPogZTnmoTooajljZXmoKHpqozkuI3pgJrov4fvvIzliIfmjaLliLBkaXNhYmxlZOeKtuaAgVxuXG4gIGNvbnN0cnVjdG9yKHByaXZhdGUgZWxlbWVudFJlZjogRWxlbWVudFJlZiwgQE9wdGlvbmFsKCkgQEhvc3QoKSBwcml2YXRlIF9kRm9ybTogRm9ybURpcmVjdGl2ZSkge31cblxuICBuZ0FmdGVyVmlld0luaXQoKSB7XG4gICAgdGhpcy5yZWdpc3RlckV2ZW50KCk7XG4gIH1cblxuICBuZ09uRGVzdHJveSgpIHtcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcbiAgICB0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XG4gIH1cblxuICByZWdpc3RlckV2ZW50KCkge1xuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xuICAgIGZyb21FdmVudCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgdGhpcy5fZXZlbnROYW1lKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKVxuICAgICAgLnN1YnNjcmliZSgoJGV2ZW50KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLl9kRm9ybSkge1xuICAgICAgICAgIHRoaXMuX2RGb3JtLnVwZGF0ZU9uU3VibWl0KCRldmVudCwgdGhpcy5kYXRhKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cbn1cblxuQERpcmVjdGl2ZSh7XG4gIHNlbGVjdG9yOiAnW2RGb3JtUmVzZXRdJyxcbn0pXG5leHBvcnQgY2xhc3MgREZvcm1SZXNldERpcmVjdGl2ZSBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSB7XG4gIEBIb3N0QmluZGluZygnY2xhc3MuZGV2dWktZm9ybS1yZXNldCcpIGRlZmF1bHQgPSB0cnVlO1xuXG4gIC8vIFRPRE86IGVtaXQgbm93IGZvcm1cbiAgLy8gVE9ETzogQWJzdHJhY3QgYSBwYXJlbnQgY2xhc3NcbiAgX2V2ZW50TmFtZSA9ICdjbGljayc7XG4gIEBJbnB1dCgnZEZvcm1SZXNldCcpXG4gIHNldCBldmVudE5hbWUoZXZlbnROYW1lKSB7XG4gICAgaWYgKGV2ZW50TmFtZSkge1xuICAgICAgdGhpcy5fZXZlbnROYW1lID0gZXZlbnROYW1lO1xuICAgICAgdGhpcy5yZWdpc3RlckV2ZW50KCk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLCBAT3B0aW9uYWwoKSBASG9zdCgpIHByaXZhdGUgX2RGb3JtOiBGb3JtRGlyZWN0aXZlKSB7fVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpIHtcbiAgICB0aGlzLnJlZ2lzdGVyRXZlbnQoKTtcbiAgfVxuXG4gIG5nT25EZXN0cm95KCkge1xuICAgIHRoaXMuZGVzdHJveSQubmV4dCgpO1xuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcbiAgfVxuXG4gIHJlZ2lzdGVyRXZlbnQoKSB7XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgZnJvbUV2ZW50KHRoaXMuZWxlbWVudFJlZi5uYXRpdmVFbGVtZW50LCB0aGlzLl9ldmVudE5hbWUpXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMuX2RGb3JtKSB7XG4gICAgICAgICAgdGhpcy5fZEZvcm0udXBkYXRlT25SZXNldCgpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgfVxufVxuIl19