ng-zorro-antd
Version:
An enterprise-class UI components based on Ant Design and Angular
142 lines • 16.9 kB
JavaScript
/**
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE
*/
import { __decorate, __metadata } from "tslib";
import { animate, AnimationBuilder, group, query, style } from '@angular/animations';
import { ChangeDetectionStrategy, Component, ElementRef, EventEmitter, Input, Output, Renderer2, TemplateRef } from '@angular/core';
import { InputBoolean } from 'ng-zorro-antd/core/util';
import { Subject } from 'rxjs';
export class NzGraphNodeComponent {
constructor(el, builder, renderer2) {
this.el = el;
this.builder = builder;
this.renderer2 = renderer2;
this.nodeClick = new EventEmitter();
this.animationInfo = null;
this.initialState = true;
this.animationPlayer = null;
}
triggerClick(event) {
event.preventDefault();
this.nodeClick.emit(this.node);
}
makeAnimation() {
const cur = this.getAnimationInfo();
if (this.animationPlayer) {
this.animationPlayer.destroy();
}
let animationFactory;
const pre = Object.assign({}, this.animationInfo);
if (this.initialState) {
animationFactory = this.builder.build([
style({ transform: `translate(${cur.x}px, ${cur.y}px)` }),
query('g', [
style({
width: `${cur.width}px`,
height: `${cur.height}px`
})
])
]);
this.initialState = false;
}
else {
animationFactory = this.builder.build([
style({ transform: `translate(${pre.x}px, ${pre.y}px)` }),
query('g', [
style({
width: `${pre.width}px`,
height: `${pre.height}px`
})
]),
group([
query('g', [
animate('150ms ease-out', style({
width: `${cur.width}px`,
height: `${cur.height}px`
}))
]),
animate('150ms ease-out', style({ transform: `translate(${cur.x}px, ${cur.y}px)` }))
])
]);
}
this.animationInfo = cur;
this.animationPlayer = animationFactory.create(this.el.nativeElement);
this.animationPlayer.play();
const done$ = new Subject();
this.animationPlayer.onDone(() => {
// Need this for canvas for now.
this.renderer2.setAttribute(this.el.nativeElement, 'transform', `translate(${cur.x}, ${cur.y})`);
done$.next();
done$.complete();
});
return done$.asObservable();
}
makeNoAnimation() {
const cur = this.getAnimationInfo();
// Need this for canvas for now.
this.renderer2.setAttribute(this.el.nativeElement, 'transform', `translate(${cur.x}, ${cur.y})`);
}
getAnimationInfo() {
const { x, y } = this.nodeTransform();
return {
width: this.node.width,
height: this.node.height,
x,
y
};
}
nodeTransform() {
const x = this.computeCXPositionOfNodeShape() - this.node.width / 2;
const y = this.node.y - this.node.height / 2;
return { x, y };
}
computeCXPositionOfNodeShape() {
if (this.node.expanded) {
return this.node.x;
}
return this.node.x - this.node.width / 2 + this.node.coreBox.width / 2;
}
}
NzGraphNodeComponent.decorators = [
{ type: Component, args: [{
selector: '[nz-graph-node]',
template: `
<svg:g [attr.width]="node.width" [attr.height]="node.height">
<ng-container
*ngIf="customTemplate"
[ngTemplateOutlet]="customTemplate"
[ngTemplateOutletContext]="{ $implicit: node }"
></ng-container>
<ng-container *ngIf="!customTemplate">
<svg:rect class="nz-graph-node-rect" [attr.width]="node.width" [attr.height]="node.height"></svg:rect>
<svg:text x="10" y="20">{{ node.id || node.name }}</svg:text>
</ng-container>
</svg:g>
`,
changeDetection: ChangeDetectionStrategy.OnPush,
host: {
'[id]': 'node.id || node.name',
'[class.nz-graph-node-expanded]': 'node.expanded',
'[class.nz-graph-group-node]': 'node.type===0',
'[class.nz-graph-base-node]': 'node.type===1',
'(click)': 'triggerClick($event)'
}
},] }
];
NzGraphNodeComponent.ctorParameters = () => [
{ type: ElementRef },
{ type: AnimationBuilder },
{ type: Renderer2 }
];
NzGraphNodeComponent.propDecorators = {
node: [{ type: Input }],
noAnimation: [{ type: Input }],
customTemplate: [{ type: Input }],
nodeClick: [{ type: Output }]
};
__decorate([
InputBoolean(),
__metadata("design:type", Boolean)
], NzGraphNodeComponent.prototype, "noAnimation", void 0);
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ3JhcGgtbm9kZS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiL2hvbWUvdnN0cy93b3JrLzEvcy9jb21wb25lbnRzL2dyYXBoLyIsInNvdXJjZXMiOlsiZ3JhcGgtbm9kZS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7OztHQUdHOztBQUVILE9BQU8sRUFBRSxPQUFPLEVBQUUsZ0JBQWdCLEVBQXFDLEtBQUssRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLE1BQU0scUJBQXFCLENBQUM7QUFDeEgsT0FBTyxFQUFFLHVCQUF1QixFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsWUFBWSxFQUFFLEtBQUssRUFBRSxNQUFNLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNwSSxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0seUJBQXlCLENBQUM7QUFDdkQsT0FBTyxFQUFjLE9BQU8sRUFBRSxNQUFNLE1BQU0sQ0FBQztBQWlDM0MsTUFBTSxPQUFPLG9CQUFvQjtJQW1CL0IsWUFBb0IsRUFBYyxFQUFVLE9BQXlCLEVBQVUsU0FBb0I7UUFBL0UsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQUFVLFlBQU8sR0FBUCxPQUFPLENBQWtCO1FBQVUsY0FBUyxHQUFULFNBQVMsQ0FBVztRQVpoRixjQUFTLEdBQWlELElBQUksWUFBWSxFQUFFLENBQUM7UUFPaEcsa0JBQWEsR0FBZ0IsSUFBSSxDQUFDO1FBQ2xDLGlCQUFZLEdBQUcsSUFBSSxDQUFDO1FBRVosb0JBQWUsR0FBMkIsSUFBSSxDQUFDO0lBRStDLENBQUM7SUFWdkcsWUFBWSxDQUFDLEtBQWlCO1FBQzVCLEtBQUssQ0FBQyxjQUFjLEVBQUUsQ0FBQztRQUN2QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDakMsQ0FBQztJQVNELGFBQWE7UUFDWCxNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLEVB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RTtvQkFDSixNQUFNLEVBQUUsc0JBQXNCO29CQUM5QixnQ0FBZ0MsRUFBRSxlQUFlO29CQUNqRCw2QkFBNkIsRUFBRSxlQUFlO29CQUM5Qyw0QkFBNEIsRUFBRSxlQUFlO29CQUM3QyxTQUFTLEVBQUUsc0JBQXNCO2lCQUNsQzthQUNGOzs7WUFsQzRDLFVBQVU7WUFEckMsZ0JBQWdCO1lBQ29ELFNBQVM7OzttQkFvQzVGLEtBQUs7MEJBQ0wsS0FBSzs2QkFDTCxLQUFLO3dCQUlMLE1BQU07O0FBTGtCO0lBQWYsWUFBWSxFQUFFOzt5REFBdUIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlXG4gKiBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vZ2l0aHViLmNvbS9ORy1aT1JSTy9uZy16b3Jyby1hbnRkL2Jsb2IvbWFzdGVyL0xJQ0VOU0VcbiAqL1xuXG5pbXBvcnQgeyBhbmltYXRlLCBBbmltYXRpb25CdWlsZGVyLCBBbmltYXRpb25GYWN0b3J5LCBBbmltYXRpb25QbGF5ZXIsIGdyb3VwLCBxdWVyeSwgc3R5bGUgfSBmcm9tICdAYW5ndWxhci9hbmltYXRpb25zJztcbmltcG9ydCB7IENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSW5wdXQsIE91dHB1dCwgUmVuZGVyZXIyLCBUZW1wbGF0ZVJlZiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgSW5wdXRCb29sZWFuIH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL3V0aWwnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgTnpHcmFwaEdyb3VwTm9kZSwgTnpHcmFwaE5vZGUgfSBmcm9tICcuL2ludGVyZmFjZSc7XG5cbmludGVyZmFjZSBJbmZvIHtcbiAgeDogbnVtYmVyO1xuICB5OiBudW1iZXI7XG4gIHdpZHRoOiBudW1iZXI7XG4gIGhlaWdodDogbnVtYmVyO1xufVxuQENvbXBvbmVudCh7XG4gIHNlbGVjdG9yOiAnW256LWdyYXBoLW5vZGVdJyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8c3ZnOmcgW2F0dHIud2lkdGhdPVwibm9kZS53aWR0aFwiIFthdHRyLmhlaWdodF09XCJub2RlLmhlaWdodFwiPlxuICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAqbmdJZj1cImN1c3RvbVRlbXBsYXRlXCJcbiAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiY3VzdG9tVGVtcGxhdGVcIlxuICAgICAgICBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyAkaW1wbGljaXQ6IG5vZGUgfVwiXG4gICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWN1c3RvbVRlbXBsYXRlXCI+XG4gICAgICAgIDxzdmc6cmVjdCBjbGFzcz1cIm56LWdyYXBoLW5vZGUtcmVjdFwiIFthdHRyLndpZHRoXT1cIm5vZGUud2lkdGhcIiBbYXR0ci5oZWlnaHRdPVwibm9kZS5oZWlnaHRcIj48L3N2ZzpyZWN0PlxuICAgICAgICA8c3ZnOnRleHQgeD1cIjEwXCIgeT1cIjIwXCI+e3sgbm9kZS5pZCB8fCBub2RlLm5hbWUgfX08L3N2Zzp0ZXh0PlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9zdmc6Zz5cbiAgYCxcbiAgY2hhbmdlRGV0ZWN0aW9uOiBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneS5PblB1c2gsXG4gIGhvc3Q6IHtcbiAgICAnW2lkXSc6ICdub2RlLmlkIHx8IG5vZGUubmFtZScsXG4gICAgJ1tjbGFzcy5uei1ncmFwaC1ub2RlLWV4cGFuZGVkXSc6ICdub2RlLmV4cGFuZGVkJyxcbiAgICAnW2NsYXNzLm56LWdyYXBoLWdyb3VwLW5vZGVdJzogJ25vZGUudHlwZT09PTAnLFxuICAgICdbY2xhc3MubnotZ3JhcGgtYmFzZS1ub2RlXSc6ICdub2RlLnR5cGU9PT0xJyxcbiAgICAnKGNsaWNrKSc6ICd0cmlnZ2VyQ2xpY2soJGV2ZW50KSdcbiAgfVxufSlcbmV4cG9ydCBjbGFzcyBOekdyYXBoTm9kZUNvbXBvbmVudCB7XG4gIEBJbnB1dCgpIG5vZGUhOiBOekdyYXBoTm9kZSB8IE56R3JhcGhHcm91cE5vZGU7XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBub0FuaW1hdGlvbj86IGJvb2xlYW47XG4gIEBJbnB1dCgpIGN1c3RvbVRlbXBsYXRlPzogVGVtcGxhdGVSZWY8e1xuICAgICRpbXBsaWNpdDogTnpHcmFwaE5vZGUgfCBOekdyYXBoR3JvdXBOb2RlO1xuICB9PjtcblxuICBAT3V0cHV0KCkgcmVhZG9ubHkgbm9kZUNsaWNrOiBFdmVudEVtaXR0ZXI8TnpHcmFwaE5vZGUgfCBOekdyYXBoR3JvdXBOb2RlPiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICB0cmlnZ2VyQ2xpY2soZXZlbnQ6IE1vdXNlRXZlbnQpOiB2b2lkIHtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMubm9kZUNsaWNrLmVtaXQodGhpcy5ub2RlKTtcbiAgfVxuXG4gIGFuaW1hdGlvbkluZm86IEluZm8gfCBudWxsID0gbnVsbDtcbiAgaW5pdGlhbFN0YXRlID0gdHJ1ZTtcblxuICBwcml2YXRlIGFuaW1hdGlvblBsYXllcjogQW5pbWF0aW9uUGxheWVyIHwgbnVsbCA9IG51bGw7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBlbDogRWxlbWVudFJlZiwgcHJpdmF0ZSBidWlsZGVyOiBBbmltYXRpb25CdWlsZGVyLCBwcml2YXRlIHJlbmRlcmVyMjogUmVuZGVyZXIyKSB7fVxuXG4gIG1ha2VBbmltYXRpb24oKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgY29uc3QgY3VyID0gdGhpcy5nZXRBbmltYXRpb25JbmZvKCk7XG4gICAgaWYgKHRoaXMuYW5pbWF0aW9uUGxheWVyKSB7XG4gICAgICB0aGlzLmFuaW1hdGlvblBsYXllci5kZXN0cm95KCk7XG4gICAgfVxuICAgIGxldCBhbmltYXRpb25GYWN0b3J5OiBBbmltYXRpb25GYWN0b3J5O1xuICAgIGNvbnN0IHByZSA9IHsgLi4udGhpcy5hbmltYXRpb25JbmZvIH0gYXMgSW5mbztcblxuICAgIGlmICh0aGlzLmluaXRpYWxTdGF0ZSkge1xuICAgICAgYW5pbWF0aW9uRmFjdG9yeSA9IHRoaXMuYnVpbGRlci5idWlsZChbXG4gICAgICAgIHN0eWxlKHsgdHJhbnNmb3JtOiBgdHJhbnNsYXRlKCR7Y3VyLnh9cHgsICR7Y3VyLnl9cHgpYCB9KSxcbiAgICAgICAgcXVlcnkoJ2cnLCBbXG4gICAgICAgICAgc3R5bGUoe1xuICAgICAgICAgICAgd2lkdGg6IGAke2N1ci53aWR0aH1weGAsXG4gICAgICAgICAgICBoZWlnaHQ6IGAke2N1ci5oZWlnaHR9cHhgXG4gICAgICAgICAgfSlcbiAgICAgICAgXSlcbiAgICAgIF0pO1xuICAgICAgdGhpcy5pbml0aWFsU3RhdGUgPSBmYWxzZTtcbiAgICB9IGVsc2Uge1xuICAgICAgYW5pbWF0aW9uRmFjdG9yeSA9IHRoaXMuYnVpbGRlci5idWlsZChbXG4gICAgICAgIHN0eWxlKHsgdHJhbnNmb3JtOiBgdHJhbnNsYXRlKCR7cHJlIS54fXB4LCAke3ByZSEueX1weClgIH0pLFxuICAgICAgICBxdWVyeSgnZycsIFtcbiAgICAgICAgICBzdHlsZSh7XG4gICAgICAgICAgICB3aWR0aDogYCR7cHJlIS53aWR0aH1weGAsXG4gICAgICAgICAgICBoZWlnaHQ6IGAke3ByZSEuaGVpZ2h0fXB4YFxuICAgICAgICAgIH0pXG4gICAgICAgIF0pLFxuICAgICAgICBncm91cChbXG4gICAgICAgICAgcXVlcnkoJ2cnLCBbXG4gICAgICAgICAgICBhbmltYXRlKFxuICAgICAgICAgICAgICAnMTUwbXMgZWFzZS1vdXQnLFxuICAgICAgICAgICAgICBzdHlsZSh7XG4gICAgICAgICAgICAgICAgd2lkdGg6IGAke2N1ci53aWR0aH1weGAsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiBgJHtjdXIuaGVpZ2h0fXB4YFxuICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKVxuICAgICAgICAgIF0pLFxuICAgICAgICAgIGFuaW1hdGUoJzE1MG1zIGVhc2Utb3V0Jywgc3R5bGUoeyB0cmFuc2Zvcm06IGB0cmFuc2xhdGUoJHtjdXIueH1weCwgJHtjdXIueX1weClgIH0pKVxuICAgICAgICBdKVxuICAgICAgXSk7XG4gICAgfVxuICAgIHRoaXMuYW5pbWF0aW9uSW5mbyA9IGN1cjtcbiAgICB0aGlzLmFuaW1hdGlvblBsYXllciA9IGFuaW1hdGlvbkZhY3RvcnkuY3JlYXRlKHRoaXMuZWwubmF0aXZlRWxlbWVudCk7XG4gICAgdGhpcy5hbmltYXRpb25QbGF5ZXIucGxheSgpO1xuICAgIGNvbnN0IGRvbmUkID0gbmV3IFN1YmplY3Q8dm9pZD4oKTtcbiAgICB0aGlzLmFuaW1hdGlvblBsYXllci5vbkRvbmUoKCkgPT4ge1xuICAgICAgLy8gTmVlZCB0aGlzIGZvciBjYW52YXMgZm9yIG5vdy5cbiAgICAgIHRoaXMucmVuZGVyZXIyLnNldEF0dHJpYnV0ZSh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQsICd0cmFuc2Zvcm0nLCBgdHJhbnNsYXRlKCR7Y3VyLnh9LCAke2N1ci55fSlgKTtcbiAgICAgIGRvbmUkLm5leHQoKTtcbiAgICAgIGRvbmUkLmNvbXBsZXRlKCk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGRvbmUkLmFzT2JzZXJ2YWJsZSgpO1xuICB9XG5cbiAgbWFrZU5vQW5pbWF0aW9uKCk6IHZvaWQge1xuICAgIGNvbnN0IGN1ciA9IHRoaXMuZ2V0QW5pbWF0aW9uSW5mbygpO1xuICAgIC8vIE5lZWQgdGhpcyBmb3IgY2FudmFzIGZvciBub3cuXG4gICAgdGhpcy5yZW5kZXJlcjIuc2V0QXR0cmlidXRlKHRoaXMuZWwubmF0aXZlRWxlbWVudCwgJ3RyYW5zZm9ybScsIGB0cmFuc2xhdGUoJHtjdXIueH0sICR7Y3VyLnl9KWApO1xuICB9XG5cbiAgZ2V0QW5pbWF0aW9uSW5mbygpOiBJbmZvIHtcbiAgICBjb25zdCB7IHgsIHkgfSA9IHRoaXMubm9kZVRyYW5zZm9ybSgpO1xuICAgIHJldHVybiB7XG4gICAgICB3aWR0aDogdGhpcy5ub2RlLndpZHRoLFxuICAgICAgaGVpZ2h0OiB0aGlzLm5vZGUuaGVpZ2h0LFxuICAgICAgeCxcbiAgICAgIHlcbiAgICB9O1xuICB9XG5cbiAgbm9kZVRyYW5zZm9ybSgpOiB7IHg6IG51bWJlcjsgeTogbnVtYmVyIH0ge1xuICAgIGNvbnN0IHggPSB0aGlzLmNvbXB1dGVDWFBvc2l0aW9uT2ZOb2RlU2hhcGUoKSAtIHRoaXMubm9kZS53aWR0aCAvIDI7XG4gICAgY29uc3QgeSA9IHRoaXMubm9kZS55IC0gdGhpcy5ub2RlLmhlaWdodCAvIDI7XG4gICAgcmV0dXJuIHsgeCwgeSB9O1xuICB9XG5cbiAgY29tcHV0ZUNYUG9zaXRpb25PZk5vZGVTaGFwZSgpOiBudW1iZXIge1xuICAgIGlmICgodGhpcy5ub2RlIGFzIE56R3JhcGhHcm91cE5vZGUpLmV4cGFuZGVkKSB7XG4gICAgICByZXR1cm4gdGhpcy5ub2RlLng7XG4gICAgfVxuICAgIHJldHVybiB0aGlzLm5vZGUueCAtIHRoaXMubm9kZS53aWR0aCAvIDIgKyB0aGlzLm5vZGUuY29yZUJveC53aWR0aCAvIDI7XG4gIH1cbn1cbiJdfQ==