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