UNPKG

@alauda-fe/common

Version:

Alauda frontend team common codes.

124 lines 17.7 kB
import { buildBem, ButtonModule, IconComponent, } from '@alauda/ui'; import { NgIf, NgTemplateOutlet } from '@angular/common'; import { ChangeDetectionStrategy, Component, ContentChild, EventEmitter, Output, TemplateRef, computed, effect, input, signal, } from '@angular/core'; import { finalize, first, from } from 'rxjs'; import { EditableEditorDirective, EditableViewerDirective, } from './editable.directive'; import { EditableMode } from './editable.type'; import * as i0 from "@angular/core"; import * as i1 from "@alauda/ui"; function EditableComponent_div_1_Template(rf, ctx) { if (rf & 1) { const _r1 = i0.ɵɵgetCurrentView(); i0.ɵɵelementStart(0, "div"); i0.ɵɵelementContainer(1, 2); i0.ɵɵelementStart(2, "button", 3); i0.ɵɵlistener("click", function EditableComponent_div_1_Template_button_click_2_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.mode.set(ctx_r1.EditableMode.Edit)); }); i0.ɵɵelement(3, "aui-icon", 4); i0.ɵɵelementEnd()(); } if (rf & 2) { const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵclassMap(ctx_r1.bem.element("viewer-container")); i0.ɵɵadvance(); i0.ɵɵproperty("ngTemplateOutlet", ctx_r1.viewer); i0.ɵɵadvance(); i0.ɵɵproperty("square", true); } } function EditableComponent_ng_container_2_Template(rf, ctx) { if (rf & 1) { const _r3 = i0.ɵɵgetCurrentView(); i0.ɵɵelementContainerStart(0); i0.ɵɵelementStart(1, "div"); i0.ɵɵelementContainer(2, 2); i0.ɵɵelementStart(3, "button", 5); i0.ɵɵlistener("click", function EditableComponent_ng_container_2_Template_button_click_3_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.saveEdit()); }); i0.ɵɵelement(4, "aui-icon", 6); i0.ɵɵelementEnd(); i0.ɵɵelementStart(5, "button", 3); i0.ɵɵlistener("click", function EditableComponent_ng_container_2_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r3); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.cancelEdit()); }); i0.ɵɵelement(6, "aui-icon", 7); i0.ɵɵelementEnd()(); i0.ɵɵelementContainerEnd(); } if (rf & 2) { const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵadvance(); i0.ɵɵclassMap(ctx_r1.bem.element("editor-container")); i0.ɵɵadvance(); i0.ɵɵproperty("ngTemplateOutlet", ctx_r1.editor); i0.ɵɵadvance(); i0.ɵɵproperty("square", true)("disabled", ctx_r1.loading); i0.ɵɵadvance(); i0.ɵɵproperty("icon", ctx_r1.loading ? "spinner" : "check"); i0.ɵɵadvance(); i0.ɵɵproperty("square", true); } } const bem = buildBem('acl-editable'); export class EditableComponent { constructor() { this.beforeSave = input(); this.position = input('top'); this.save = new EventEmitter(); this.cancel = new EventEmitter(); this.modeChange = new EventEmitter(); this.EditableMode = EditableMode; this.bem = bem; this.loading = false; this.mode = signal(EditableMode.View); this.hostClass = computed(() => { return `${bem.block()} ${bem.modifier(this.position())}`; }); effect(() => { this.modeChange.emit(this.mode()); }); } saveEdit() { this.loading = true; from(this.beforeSave()?.() || Promise.resolve()) .pipe(first(), finalize(() => (this.loading = false))) .subscribe(isContinue => { if (isContinue === false) { return; } this.mode.set(EditableMode.View); this.save.emit(); }); } cancelEdit() { this.mode.set(EditableMode.View); this.cancel.emit(); } static { this.ɵfac = function EditableComponent_Factory(t) { return new (t || EditableComponent)(); }; } static { this.ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: EditableComponent, selectors: [["acl-editable"]], contentQueries: function EditableComponent_ContentQueries(rf, ctx, dirIndex) { if (rf & 1) { i0.ɵɵcontentQuery(dirIndex, EditableViewerDirective, 5, TemplateRef); i0.ɵɵcontentQuery(dirIndex, EditableEditorDirective, 5, TemplateRef); } if (rf & 2) { let _t; i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.viewer = _t.first); i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.editor = _t.first); } }, inputs: { beforeSave: [1, "beforeSave"], position: [1, "position"] }, outputs: { save: "save", cancel: "cancel", modeChange: "modeChange" }, standalone: true, features: [i0.ɵɵStandaloneFeature], decls: 3, vars: 4, consts: [[3, "class", 4, "ngIf"], [4, "ngIf"], [3, "ngTemplateOutlet"], ["aui-button", "text", 3, "click", "square"], ["icon", "pencil"], ["aui-button", "text", 3, "click", "square", "disabled"], [3, "icon"], ["icon", "xmark"]], template: function EditableComponent_Template(rf, ctx) { if (rf & 1) { i0.ɵɵelementStart(0, "div"); i0.ɵɵtemplate(1, EditableComponent_div_1_Template, 4, 4, "div", 0)(2, EditableComponent_ng_container_2_Template, 7, 7, "ng-container", 1); i0.ɵɵelementEnd(); } if (rf & 2) { i0.ɵɵclassMap(ctx.hostClass()); i0.ɵɵadvance(); i0.ɵɵproperty("ngIf", ctx.mode() === ctx.EditableMode.View); i0.ɵɵadvance(); i0.ɵɵproperty("ngIf", ctx.mode() === ctx.EditableMode.Edit); } }, dependencies: [NgIf, NgTemplateOutlet, IconComponent, ButtonModule, i1.ButtonComponent], styles: [".acl-editable[_ngcontent-%COMP%] .aui-button--text[_ngcontent-%COMP%]{color:rgb(var(--aui-color-main-text))}.acl-editable[_ngcontent-%COMP%] .aui-button--text[_ngcontent-%COMP%]:first-of-type{margin-left:8px}.acl-editable[_ngcontent-%COMP%] .aui-button--text[_ngcontent-%COMP%]:hover{color:rgb(var(--aui-color-primary))}.acl-editable[_ngcontent-%COMP%] .aui-button--text[disabled][_ngcontent-%COMP%]{color:rgb(var(--aui-color-main-text))!important}.acl-editable--center[_ngcontent-%COMP%] .acl-editable__view-container[_ngcontent-%COMP%], .acl-editable--center[_ngcontent-%COMP%] .acl-editable__editor-container[_ngcontent-%COMP%]{display:flex;align-items:center}.acl-editable--top[_ngcontent-%COMP%] .acl-editable__view-container[_ngcontent-%COMP%], .acl-editable--top[_ngcontent-%COMP%] .acl-editable__editor-container[_ngcontent-%COMP%]{display:flex;align-items:flex-start}.acl-editable--bottom[_ngcontent-%COMP%] .acl-editable__view-container[_ngcontent-%COMP%], .acl-editable--bottom[_ngcontent-%COMP%] .acl-editable__editor-container[_ngcontent-%COMP%]{display:flex;align-items:flex-end}"], changeDetection: 0 }); } } (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(EditableComponent, [{ type: Component, args: [{ selector: 'acl-editable', standalone: true, imports: [NgIf, NgTemplateOutlet, IconComponent, ButtonModule], changeDetection: ChangeDetectionStrategy.OnPush, template: "<div [class]=\"hostClass()\">\n <div\n [class]=\"bem.element('viewer-container')\"\n *ngIf=\"mode() === EditableMode.View\"\n >\n <ng-container [ngTemplateOutlet]=\"viewer\"> </ng-container>\n <button\n aui-button=\"text\"\n [square]=\"true\"\n (click)=\"mode.set(EditableMode.Edit)\"\n >\n <aui-icon icon=\"pencil\"></aui-icon>\n </button>\n </div>\n <ng-container *ngIf=\"mode() === EditableMode.Edit\">\n <div [class]=\"bem.element('editor-container')\">\n <ng-container [ngTemplateOutlet]=\"editor\"> </ng-container>\n <button\n aui-button=\"text\"\n [square]=\"true\"\n [disabled]=\"loading\"\n (click)=\"saveEdit()\"\n >\n <aui-icon [icon]=\"loading ? 'spinner' : 'check'\"></aui-icon>\n </button>\n <button\n aui-button=\"text\"\n [square]=\"true\"\n (click)=\"cancelEdit()\"\n >\n <aui-icon icon=\"xmark\"></aui-icon>\n </button>\n </div>\n </ng-container>\n</div>\n", styles: [".acl-editable .aui-button--text{color:rgb(var(--aui-color-main-text))}.acl-editable .aui-button--text:first-of-type{margin-left:8px}.acl-editable .aui-button--text:hover{color:rgb(var(--aui-color-primary))}.acl-editable .aui-button--text[disabled]{color:rgb(var(--aui-color-main-text))!important}.acl-editable--center .acl-editable__view-container,.acl-editable--center .acl-editable__editor-container{display:flex;align-items:center}.acl-editable--top .acl-editable__view-container,.acl-editable--top .acl-editable__editor-container{display:flex;align-items:flex-start}.acl-editable--bottom .acl-editable__view-container,.acl-editable--bottom .acl-editable__editor-container{display:flex;align-items:flex-end}\n"] }] }], () => [], { save: [{ type: Output }], cancel: [{ type: Output }], modeChange: [{ type: Output }], viewer: [{ type: ContentChild, args: [EditableViewerDirective, { read: TemplateRef }] }], editor: [{ type: ContentChild, args: [EditableEditorDirective, { read: TemplateRef }] }] }); })(); (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(EditableComponent, { className: "EditableComponent" }); })(); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZWRpdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vbGlicy9jb21tb24vc3JjL2VkaXRhYmxlL2VkaXRhYmxlLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uLy4uL2xpYnMvY29tbW9uL3NyYy9lZGl0YWJsZS9lZGl0YWJsZS5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0wsUUFBUSxFQUNSLFlBQVksRUFFWixhQUFhLEdBQ2QsTUFBTSxZQUFZLENBQUM7QUFDcEIsT0FBTyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ3pELE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixZQUFZLEVBQ1osTUFBTSxFQUNOLFdBQVcsRUFDWCxRQUFRLEVBQ1IsTUFBTSxFQUNOLEtBQUssRUFDTCxNQUFNLEdBQ1AsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsSUFBSSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRTdDLE9BQU8sRUFDTCx1QkFBdUIsRUFDdkIsdUJBQXVCLEdBQ3hCLE1BQU0sc0JBQXNCLENBQUM7QUFDOUIsT0FBTyxFQUFrQixZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQzs7Ozs7SUN4QjdELDJCQUdDO0lBQ0MsMkJBQTBEO0lBQzFELGlDQUlDO0lBREMsNktBQVMseUNBQTJCLEtBQUM7SUFFckMsOEJBQW1DO0lBRXZDLEFBREUsaUJBQVMsRUFDTDs7O0lBWEoscURBQXlDO0lBRzNCLGNBQTJCO0lBQTNCLGdEQUEyQjtJQUd2QyxjQUFlO0lBQWYsNkJBQWU7Ozs7SUFNbkIsNkJBQW1EO0lBQ2pELDJCQUErQztJQUM3QywyQkFBMEQ7SUFDMUQsaUNBS0M7SUFEQyxzTEFBUyxpQkFBVSxLQUFDO0lBRXBCLDhCQUE0RDtJQUM5RCxpQkFBUztJ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SUFBSTtrQkFBYixNQUFNO1lBQ0csTUFBTTtrQkFBZixNQUFNO1lBQ0csVUFBVTtrQkFBbkIsTUFBTTtZQUlQLE1BQU07a0JBREwsWUFBWTttQkFBQyx1QkFBdUIsRUFBRSxFQUFFLElBQUksRUFBRSxXQUFXLEVBQUU7WUFJNUQsTUFBTTtrQkFETCxZQUFZO21CQUFDLHVCQUF1QixFQUFFLEVBQUUsSUFBSSxFQUFFLFdBQVcsRUFBRTs7a0ZBYmpELGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGJ1aWxkQmVtLFxuICBCdXR0b25Nb2R1bGUsXG4gIEN1c3RvbUJlZm9yZUFjdGlvbixcbiAgSWNvbkNvbXBvbmVudCxcbn0gZnJvbSAnQGFsYXVkYS91aSc7XG5pbXBvcnQgeyBOZ0lmLCBOZ1RlbXBsYXRlT3V0bGV0IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7XG4gIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICBDb21wb25lbnQsXG4gIENvbnRlbnRDaGlsZCxcbiAgRXZlbnRFbWl0dGVyLFxuICBPdXRwdXQsXG4gIFRlbXBsYXRlUmVmLFxuICBjb21wdXRlZCxcbiAgZWZmZWN0LFxuICBpbnB1dCxcbiAgc2lnbmFsLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IGZpbmFsaXplLCBmaXJzdCwgZnJvbSB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQge1xuICBFZGl0YWJsZUVkaXRvckRpcmVjdGl2ZSxcbiAgRWRpdGFibGVWaWV3ZXJEaXJlY3RpdmUsXG59IGZyb20gJy4vZWRpdGFibGUuZGlyZWN0aXZlJztcbmltcG9ydCB7IEJ1dHRvblBvc2l0aW9uLCBFZGl0YWJsZU1vZGUgfSBmcm9tICcuL2VkaXRhYmxlLnR5cGUnO1xuXG5jb25zdCBiZW0gPSBidWlsZEJlbSgnYWNsLWVkaXRhYmxlJyk7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2FjbC1lZGl0YWJsZScsXG4gIHRlbXBsYXRlVXJsOiAnZWRpdGFibGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnZWRpdGFibGUuY29tcG9uZW50LnNjc3MnXSxcbiAgc3RhbmRhbG9uZTogdHJ1ZSxcbiAgaW1wb3J0czogW05nSWYsIE5nVGVtcGxhdGVPdXRsZXQsIEljb25Db21wb25lbnQsIEJ1dHRvbk1vZHVsZV0sXG4gIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxufSlcbmV4cG9ydCBjbGFzcyBFZGl0YWJsZUNvbXBvbmVudCB7XG4gIGJlZm9yZVNhdmUgPSBpbnB1dDxDdXN0b21CZWZvcmVBY3Rpb248dW5rbm93bj4+KCk7XG5cbiAgcG9zaXRpb24gPSBpbnB1dDxCdXR0b25Qb3NpdGlvbj4oJ3RvcCcpO1xuXG4gIEBPdXRwdXQoKSBzYXZlOiBFdmVudEVtaXR0ZXI8dm9pZD4gPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIEBPdXRwdXQoKSBjYW5jZWw6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgQE91dHB1dCgpIG1vZGVDaGFuZ2U6IEV2ZW50RW1pdHRlcjxFZGl0YWJsZU1vZGU+ID1cbiAgICBuZXcgRXZlbnRFbWl0dGVyPEVkaXRhYmxlTW9kZT4oKTtcblxuICBAQ29udGVudENoaWxkKEVkaXRhYmxlVmlld2VyRGlyZWN0aXZlLCB7IHJlYWQ6IFRlbXBsYXRlUmVmIH0pXG4gIHZpZXdlcjogVGVtcGxhdGVSZWY8dW5rbm93bj47XG5cbiAgQENvbnRlbnRDaGlsZChFZGl0YWJsZUVkaXRvckRpcmVjdGl2ZSwgeyByZWFkOiBUZW1wbGF0ZVJlZiB9KVxuICBlZGl0b3I6IFRlbXBsYXRlUmVmPHVua25vd24+O1xuXG4gIEVkaXRhYmxlTW9kZSA9IEVkaXRhYmxlTW9kZTtcbiAgYmVtID0gYmVtO1xuICBsb2FkaW5nID0gZmFsc2U7XG5cbiAgbW9kZSA9IHNpZ25hbChFZGl0YWJsZU1vZGUuVmlldyk7XG5cbiAgaG9zdENsYXNzID0gY29tcHV0ZWQoKCkgPT4ge1xuICAgIHJldHVybiBgJHtiZW0uYmxvY2soKX0gJHtiZW0ubW9kaWZpZXIodGhpcy5wb3NpdGlvbigpKX1gO1xuICB9KTtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBlZmZlY3QoKCkgPT4ge1xuICAgICAgdGhpcy5tb2RlQ2hhbmdlLmVtaXQodGhpcy5tb2RlKCkpO1xuICAgIH0pO1xuICB9XG5cbiAgc2F2ZUVkaXQoKSB7XG4gICAgdGhpcy5sb2FkaW5nID0gdHJ1ZTtcbiAgICBmcm9tKHRoaXMuYmVmb3JlU2F2ZSgpPy4oKSB8fCBQcm9taXNlLnJlc29sdmUoKSlcbiAgICAgIC5waXBlKFxuICAgICAgICBmaXJzdCgpLFxuICAgICAgICBmaW5hbGl6ZSgoKSA9PiAodGhpcy5sb2FkaW5nID0gZmFsc2UpKSxcbiAgICAgIClcbiAgICAgIC5zdWJzY3JpYmUoaXNDb250aW51ZSA9PiB7XG4gICAgICAgIGlmIChpc0NvbnRpbnVlID09PSBmYWxzZSkge1xuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm1vZGUuc2V0KEVkaXRhYmxlTW9kZS5WaWV3KTtcbiAgICAgICAgdGhpcy5zYXZlLmVtaXQoKTtcbiAgICAgIH0pO1xuICB9XG5cbiAgY2FuY2VsRWRpdCgpIHtcbiAgICB0aGlzLm1vZGUuc2V0KEVkaXRhYmxlTW9kZS5WaWV3KTtcbiAgICB0aGlzLmNhbmNlbC5lbWl0KCk7XG4gIH1cbn1cbiIsIjxkaXYgW2NsYXNzXT1cImhvc3RDbGFzcygpXCI+XG4gIDxkaXZcbiAgICBbY2xhc3NdPVwiYmVtLmVsZW1lbnQoJ3ZpZXdlci1jb250YWluZXInKVwiXG4gICAgKm5nSWY9XCJtb2RlKCkgPT09IEVkaXRhYmxlTW9kZS5WaWV3XCJcbiAgPlxuICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwidmlld2VyXCI+IDwvbmctY29udGFpbmVyPlxuICAgIDxidXR0b25cbiAgICAgIGF1aS1idXR0b249XCJ0ZXh0XCJcbiAgICAgIFtzcXVhcmVdPVwidHJ1ZVwiXG4gICAgICAoY2xpY2spPVwibW9kZS5zZXQoRWRpdGFibGVNb2RlLkVkaXQpXCJcbiAgICA+XG4gICAgICA8YXVpLWljb24gaWNvbj1cInBlbmNpbFwiPjwvYXVpLWljb24+XG4gICAgPC9idXR0b24+XG4gIDwvZGl2PlxuICA8bmctY29udGFpbmVyICpuZ0lmPVwibW9kZSgpID09PSBFZGl0YWJsZU1vZGUuRWRpdFwiPlxuICAgIDxkaXYgW2NsYXNzXT1cImJlbS5lbGVtZW50KCdlZGl0b3ItY29udGFpbmVyJylcIj5cbiAgICAgIDxuZy1jb250YWluZXIgW25nVGVtcGxhdGVPdXRsZXRdPVwiZWRpdG9yXCI+IDwvbmctY29udGFpbmVyPlxuICAgICAgPGJ1dHRvblxuICAgICAgICBhdWktYnV0dG9uPVwidGV4dFwiXG4gICAgICAgIFtzcXVhcmVdPVwidHJ1ZVwiXG4gICAgICAgIFtkaXNhYmxlZF09XCJsb2FkaW5nXCJcbiAgICAgICAgKGNsaWNrKT1cInNhdmVFZGl0KClcIlxuICAgICAgPlxuICAgICAgICA8YXVpLWljb24gW2ljb25dPVwibG9hZGluZyA/ICdzcGlubmVyJyA6ICdjaGVjaydcIj48L2F1aS1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgICA8YnV0dG9uXG4gICAgICAgIGF1aS1idXR0b249XCJ0ZXh0XCJcbiAgICAgICAgW3NxdWFyZV09XCJ0cnVlXCJcbiAgICAgICAgKGNsaWNrKT1cImNhbmNlbEVkaXQoKVwiXG4gICAgICA+XG4gICAgICAgIDxhdWktaWNvbiBpY29uPVwieG1hcmtcIj48L2F1aS1pY29uPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvbmctY29udGFpbmVyPlxuPC9kaXY+XG4iXX0=