UNPKG

ngx-diagrams

Version:

This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 7.2.0.

160 lines 17 kB
/** * @fileoverview added by tsickle * Generated from: lib/defaults/components/default-link/default-link.component.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { Component, ChangeDetectorRef, ViewChild, ViewContainerRef } from '@angular/core'; import { DefaultLinkModel } from '../../models/default-link.model'; import { generateCurvePath } from '../../../utils/tool-kit.util'; import { combineLatest, BehaviorSubject } from 'rxjs'; import { filter, takeUntil } from 'rxjs/operators'; var DefaultLinkComponent = /** @class */ (function (_super) { tslib_1.__extends(DefaultLinkComponent, _super); function DefaultLinkComponent(cdRef) { var _this = _super.call(this, 'ngdx-default-link') || this; _this.cdRef = cdRef; _this._path$ = new BehaviorSubject(null); _this.path$ = _this._path$.asObservable(); _this.points$ = new BehaviorSubject([]); return _this; } /** * @return {?} */ DefaultLinkComponent.prototype.ngAfterViewInit = /** * @return {?} */ function () { var _this = this; /** @type {?} */ var firstPCoords$ = this.getFirstPoint().selectCoords(); /** @type {?} */ var lastPCoords$ = this.getLastPoint().selectCoords(); // Observe link coords and update drawing accordingly combineLatest([firstPCoords$, lastPCoords$]) .pipe(takeUntil(this.onEntityDestroy())) .subscribe((/** * @param {?} __0 * @return {?} */ function (_a) { var _b = tslib_1.__read(_a, 2), firstPCoords = _b[0], lastPCoords = _b[1]; /** @type {?} */ var points = [firstPCoords, lastPCoords]; /** @type {?} */ var isHorizontal = Math.abs(firstPCoords.x - lastPCoords.x) > Math.abs(firstPCoords.y - lastPCoords.y); /** @type {?} */ var xOrY = isHorizontal ? 'x' : 'y'; // draw the smoothing // if the points are too close, just draw a straight line /** @type {?} */ var isStraight = false; if (Math.abs(points[0][xOrY] - points[1][xOrY]) < 50) { isStraight = true; } /** @type {?} */ var path = generateCurvePath(firstPCoords, lastPCoords, isStraight ? 0 : _this.curvyness); _this._path$.next(path); if (!_this.getTargetPort()) { /** @type {?} */ var danglingPoint = _this.generatePoint(lastPCoords); _this.points$.next([danglingPoint]); } /** @type {?} */ var label = _this.getLabel(); // update label position if (label) { label.setCoords(_this.calcCenterOfPath(firstPCoords, lastPCoords)); // TODO: check whether we want the label to rotate along with the line // label.setRotation(this.calcLabelIncline(firstPCoords, lastPCoords)); } // TODO: handle the multiple lines in between the points // https://github.com/projectstorm/react-diagrams/blob/master/src/defaults/widgets/DefaultLinkWidget.tsx#L344-L371 _this.cdRef.detectChanges(); })); // observe link label and draw/remove accordingly this.selectLabel() .pipe(filter(Boolean)) .subscribe((/** * @param {?} label * @return {?} */ function (label) { _this.diagramEngine.generateWidgetForLabel(label, _this.labelLayer); _this.cdRef.detectChanges(); })); }; /** * @param {?} firstPoint * @param {?} secondPoint * @return {?} */ DefaultLinkComponent.prototype.calcLabelIncline = /** * @param {?} firstPoint * @param {?} secondPoint * @return {?} */ function (firstPoint, secondPoint) { /** @type {?} */ var dy = secondPoint.y - firstPoint.y; /** @type {?} */ var dx = secondPoint.x - firstPoint.x; if (dx === 0) { return 0; } /** @type {?} */ var inclineAngel = (Math.atan(dy / dx) * 180) / Math.PI; if (inclineAngel < 0) { inclineAngel += 180; } return inclineAngel; }; /** * @param {?} firstPoint * @param {?} secondPoint * @return {?} */ DefaultLinkComponent.prototype.calcCenterOfPath = /** * @param {?} firstPoint * @param {?} secondPoint * @return {?} */ function (firstPoint, secondPoint) { return { x: (firstPoint.x + secondPoint.x) / 2 + 20, y: (firstPoint.y + secondPoint.y) / 2 + 20 }; }; DefaultLinkComponent.decorators = [ { type: Component, args: [{ selector: 'ngdx-default-link', template: "<!-- Label Host -->\n<ng-template #labelLayer></ng-template>\n\n<!-- Link -->\n<svg class=\"default-link\">\n\t<g>\n\t\t<path [attr.stroke-width]=\"width\" [attr.stroke]=\"color\" [attr.d]=\"path$ | async\"></path>\n\t\t<path\n\t\t\t(mouseleave)=\"setSelected(false)\"\n\t\t\t(mouseenter)=\"setSelected()\"\n\t\t\t[attr.stroke-width]=\"20\"\n\t\t\t[attr.stroke]=\"color\"\n\t\t\t[attr.stroke-linecap]=\"'round'\"\n\t\t\t[attr.data-linkid]=\"id\"\n\t\t\t[attr.stroke-opacity]=\"(selectSelected() | async) ? '0.1' : '0'\"\n\t\t\t[attr.d]=\"path$ | async\"\n\t\t></path>\n\t</g>\n\t<g *ngFor=\"let point of points$ | async\">\n\t\t<circle [attr.cx]=\"point.selectX() | async\" [attr.cy]=\"point.selectY() | async\" r=\"5\" class=\"default-point\" />\n\n\t\t<circle\n\t\t\t(mouseleave)=\"setSelected(false)\"\n\t\t\t(mouseenter)=\"setSelected()\"\n\t\t\t[attr.data-id]=\"point.id\"\n\t\t\t[attr.data-linkid]=\"id\"\n\t\t\t[attr.cx]=\"point.selectX() | async\"\n\t\t\t[attr.cy]=\"point.selectY() | async\"\n\t\t\tr=\"15\"\n\t\t\t[attr.opacity]=\"0\"\n\t\t\tclass=\"default-point\"\n\t\t\t[ngClass]=\"{ 'default-point': true, selected: point.selectSelected() | async }\"\n\t\t/>\n\t\t{{ point.selectSelected() | async }}\n\t</g>\n</svg>\n", styles: [".default-link{fill:none;overflow:visible}.default-link .default-point{fill:rgba(255,255,255,.5)}.default-link .default-point.selected{fill:rgba(0,0,255,.5)}@-webkit-keyframes dash{from{stroke-dashoffset:24}to{stroke-dashoffset:0}}@keyframes dash{from{stroke-dashoffset:24}to{stroke-dashoffset:0}}.default-link path{fill:none;pointer-events:all}.default-link.path-selected{stroke:#00c0ff!important;stroke-dasharray:10,2;-webkit-animation:1s linear infinite dash;animation:1s linear infinite dash}"] }] } ]; /** @nocollapse */ DefaultLinkComponent.ctorParameters = function () { return [ { type: ChangeDetectorRef } ]; }; DefaultLinkComponent.propDecorators = { labelLayer: [{ type: ViewChild, args: ['labelLayer', { read: ViewContainerRef, static: true },] }] }; return DefaultLinkComponent; }(DefaultLinkModel)); export { DefaultLinkComponent }; if (false) { /** @type {?} */ DefaultLinkComponent.prototype.labelLayer; /** @type {?} */ DefaultLinkComponent.prototype._path$; /** @type {?} */ DefaultLinkComponent.prototype.path$; /** @type {?} */ DefaultLinkComponent.prototype.points$; /** @type {?} */ DefaultLinkComponent.prototype.label$; /** * @type {?} * @private */ DefaultLinkComponent.prototype.cdRef; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdC1saW5rLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1kaWFncmFtcy8iLCJzb3VyY2VzIjpbImxpYi9kZWZhdWx0cy9jb21wb25lbnRzL2RlZmF1bHQtbGluay9kZWZhdWx0LWxpbmsuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQWlCLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUN6RyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNuRSxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUNqRSxPQUFPLEVBQUUsYUFBYSxFQUFFLGVBQWUsRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUdsRSxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBR25EO0lBSzBDLGdEQUFnQjtJQVF6RCw4QkFBb0IsS0FBd0I7UUFBNUMsWUFDQyxrQkFBTSxtQkFBbUIsQ0FBQyxTQUMxQjtRQUZtQixXQUFLLEdBQUwsS0FBSyxDQUFtQjtRQUw1QyxZQUFNLEdBQTRCLElBQUksZUFBZSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzVELFdBQUssR0FBdUIsS0FBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN2RCxhQUFPLEdBQWtDLElBQUksZUFBZSxDQUFDLEVBQUUsQ0FBQyxDQUFDOztJQUtqRSxDQUFDOzs7O0lBRUQsOENBQWU7OztJQUFmO1FBQUEsaUJBa0RDOztZQWpETSxhQUFhLEdBQUcsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDLFlBQVksRUFBRTs7WUFDbkQsWUFBWSxHQUFHLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxZQUFZLEVBQUU7UUFFdkQscURBQXFEO1FBQ3JELGFBQWEsQ0FBQyxDQUFDLGFBQWEsRUFBRSxZQUFZ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ckIsQ0FBQzs7Ozs7O0lBRUQsK0NBQWdCOzs7OztJQUFoQixVQUFpQixVQUFrQixFQUFFLFdBQW1CO1FBQ3ZELE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxVQUFVLENBQUMsQ0FBQyxHQUFHLFdBQVcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxFQUFFLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsV0FBVyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQztJQUNuRyxDQUFDOztnQkF4RkQsU0FBUyxTQUFDO29CQUNWLFFBQVEsRUFBRSxtQkFBbUI7b0JBQzdCLDR0Q0FBNEM7O2lCQUU1Qzs7OztnQkFia0MsaUJBQWlCOzs7NkJBZWxELFNBQVMsU0FBQyxZQUFZLEVBQUUsRUFBRSxJQUFJLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTs7SUFtRmxFLDJCQUFDO0NBQUEsQUF6RkQsQ0FLMEMsZ0JBQWdCLEdBb0Z6RDtTQXBGWSxvQkFBb0I7OztJQUNoQywwQ0FBZ0c7O0lBRWhHLHNDQUE0RDs7SUFDNUQscUNBQXVEOztJQUN2RCx1Q0FBaUU7O0lBQ2pFLHNDQUErQjs7Ozs7SUFFbkIscUNBQWdDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29tcG9uZW50LCBBZnRlclZpZXdJbml0LCBDaGFuZ2VEZXRlY3RvclJlZiwgVmlld0NoaWxkLCBWaWV3Q29udGFpbmVyUmVmIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBEZWZhdWx0TGlua01vZGVsIH0gZnJvbSAnLi4vLi4vbW9kZWxzL2RlZmF1bHQtbGluay5tb2RlbCc7XG5pbXBvcnQgeyBnZW5lcmF0ZUN1cnZlUGF0aCB9IGZyb20gJy4uLy4uLy4uL3V0aWxzL3Rvb2wta2l0LnV0aWwnO1xuaW1wb3J0IHsgY29tYmluZUxhdGVzdCwgQmVoYXZpb3JTdWJqZWN0LCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBQb2ludE1vZGVsIH0gZnJvbSAnLi4vLi4vLi4vbW9kZWxzL3BvaW50Lm1vZGVsJztcbmltcG9ydCB7IExhYmVsTW9kZWwgfSBmcm9tICcuLi8uLi8uLi9tb2RlbHMvbGFiZWwubW9kZWwnO1xuaW1wb3J0IHsgZmlsdGVyLCB0YWtlVW50aWwgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBDb29yZHMgfSBmcm9tICcuLi8uLi8uLi9pbnRlcmZhY2VzJztcblxuQENvbXBvbmVudCh7XG5cdHNlbGVjdG9yOiAnbmdkeC1kZWZhdWx0LWxpbmsnLFxuXHR0ZW1wbGF0ZVVybDogJy4vZGVmYXVsdC1saW5rLmNvbXBvbmVudC5odG1sJyxcblx0c3R5bGVVcmxzOiBbJy4vZGVmYXVsdC1saW5rLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgRGVmYXVsdExpbmtDb21wb25lbnQgZXh0ZW5kcyBEZWZhdWx0TGlua01vZGVsIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCB7XG5cdEBWaWV3Q2hpbGQoJ2xhYmVsTGF5ZXInLCB7IHJlYWQ6IFZpZXdDb250YWluZXJSZWYsIHN0YXRpYzogdHJ1ZSB9KSBsYWJlbExheWVyOiBWaWV3Q29udGFpbmVyUmVmO1xuXG5cdF9wYXRoJDogQmVoYXZpb3JTdWJqZWN0PHN0cmluZz4gPSBuZXcgQmVoYXZpb3JTdWJqZWN0KG51bGwpO1xuXHRwYXRoJDogT2JzZXJ2YWJsZTxzdHJpbmc+ID0gdGhpcy5fcGF0aCQuYXNPYnNlcnZhYmxlKCk7XG5cdHBvaW50cyQ6IEJlaGF2aW9yU3ViamVjdDxQb2ludE1vZGVsW10+ID0gbmV3IEJlaGF2aW9yU3ViamVjdChbXSk7XG5cdGxhYmVsJDogT2JzZXJ2YWJsZTxMYWJlbE1vZGVsPjtcblxuXHRjb25zdHJ1Y3Rvcihwcml2YXRlIGNkUmVmOiBDaGFuZ2VEZXRlY3RvclJlZikge1xuXHRcdHN1cGVyKCduZ2R4LWRlZmF1bHQtbGluaycpO1xuXHR9XG5cblx0bmdBZnRlclZpZXdJbml0KCkge1xuXHRcdGNvbnN0IGZpcnN0UENvb3JkcyQgPSB0aGlzLmdldEZpcnN0UG9pbnQoKS5zZWxlY3RDb29yZHMoKTtcblx0XHRjb25zdCBsYXN0UENvb3JkcyQgPSB0aGlzLmdldExhc3RQb2ludCgpLnNlbGVjdENvb3JkcygpO1xuXG5cdFx0Ly8gT2JzZXJ2ZSBsaW5rIGNvb3JkcyBhbmQgdXBkYXRlIGRyYXdpbmcgYWNjb3JkaW5nbHlcblx0XHRjb21iaW5lTGF0ZXN0KFtmaXJzdFBDb29yZHMkLCBsYXN0UENvb3JkcyRdKVxuXHRcdFx0LnBpcGUodGFrZVVudGlsKHRoaXMub25FbnRpdHlEZXN0cm95KCkpKVxuXHRcdFx0LnN1YnNjcmliZSgoW2ZpcnN0UENvb3JkcywgbGFzdFBDb29yZHNdKSA9PiB7XG5cdFx0XHRcdGNvbnN0IHBvaW50cyA9IFtmaXJzdFBDb29yZHMsIGxhc3RQQ29vcmRzXTtcblxuXHRcdFx0XHRjb25zdCBpc0hvcml6b250YWwgPSBNYXRoLmFicyhmaXJzdFBDb29yZHMueCAtIGxhc3RQQ29vcmRzLngpID4gTWF0aC5hYnMoZmlyc3RQQ29vcmRzLnkgLSBsYXN0UENvb3Jkcy55KTtcblx0XHRcdFx0Y29uc3QgeE9yWSA9IGlzSG9yaXpvbnRhbCA/ICd4JyA6ICd5JztcblxuXHRcdFx0XHQvLyBkcmF3IHRoZSBzbW9vdGhpbmdcblx0XHRcdFx0Ly8gaWYgdGhlIHBvaW50cyBhcmUgdG9vIGNsb3NlLCBqdXN0IGRyYXcgYSBzdHJhaWdodCBsaW5lXG5cdFx0XHRcdGxldCBpc1N0cmFpZ2h0ID0gZmFsc2U7XG5cdFx0XHRcdGlmIChNYXRoLmFicyhwb2ludHNbMF1beE9yWV0gLSBwb2ludHNbMV1beE9yWV0pIDwgNTApIHtcblx0XHRcdFx0XHRpc1N0cmFpZ2h0ID0gdHJ1ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IHBhdGggPSBnZW5lcmF0ZUN1cnZlUGF0aChmaXJzdFBDb29yZHMsIGxhc3RQQ29vcmRzLCBpc1N0cmFpZ2h0ID8gMCA6IHRoaXMuY3VydnluZXNzKTtcblx0XHRcdFx0dGhpcy5fcGF0aCQubmV4dChwYXRoKTtcblxuXHRcdFx0XHRpZiAoIXRoaXMuZ2V0VGFyZ2V0UG9ydCgpKSB7XG5cdFx0XHRcdFx0Y29uc3QgZGFuZ2xpbmdQb2ludCA9IHRoaXMuZ2VuZXJhdGVQb2ludChsYXN0UENvb3Jkcyk7XG5cdFx0XHRcdFx0dGhpcy5wb2ludHMkLm5leHQoW2RhbmdsaW5nUG9pbnRdKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNvbnN0IGxhYmVsID0gdGhpcy5nZXRMYWJlbCgpO1xuXHRcdFx0XHQvLyB1cGRhdGUgbGFiZWwgcG9zaXRpb25cblx0XHRcdFx0aWYgKGxhYmVsKSB7XG5cdFx0XHRcdFx0bGFiZWwuc2V0Q29vcmRzKHRoaXMuY2FsY0NlbnRlck9mUGF0aChmaXJzdFBDb29yZHMsIGxhc3RQQ29vcmRzKSk7XG5cblx0XHRcdFx0XHQvLyBUT0RPOiBjaGVjayB3aGV0aGVyIHdlIHdhbnQgdGhlIGxhYmVsIHRvIHJvdGF0ZSBhbG9uZyB3aXRoIHRoZSBsaW5lXG5cdFx0XHRcdFx0Ly8gbGFiZWwuc2V0Um90YXRpb24odGhpcy5jYWxjTGFiZWxJbmNsaW5lKGZpcnN0UENvb3JkcywgbGFzdFBDb29yZHMpKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFRPRE86IGhhbmRsZSB0aGUgbXVsdGlwbGUgbGluZXMgaW4gYmV0d2VlbiB0aGUgcG9pbnRzXG5cdFx0XHRcdC8vIGh0dHBzOi8vZ2l0aHViLmNvbS9wcm9qZWN0c3Rvcm0vcmVhY3QtZGlhZ3JhbXMvYmxvYi9tYXN0ZXIvc3JjL2RlZmF1bHRzL3dpZGdldHMvRGVmYXVsdExpbmtXaWRnZXQudHN4I0wzNDQtTDM3MVxuXG5cdFx0XHRcdHRoaXMuY2RSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuXHRcdFx0fSk7XG5cblx0XHQvLyBvYnNlcnZlIGxpbmsgbGFiZWwgYW5kIGRyYXcvcmVtb3ZlIGFjY29yZGluZ2x5XG5cdFx0dGhpcy5zZWxlY3RMYWJlbCgpXG5cdFx0XHQucGlwZShmaWx0ZXIoQm9vbGVhbikpXG5cdFx0XHQuc3Vic2NyaWJlKChsYWJlbDogTGFiZWxNb2RlbCkgPT4ge1xuXHRcdFx0XHR0aGlzLmRpYWdyYW1FbmdpbmUuZ2VuZXJhdGVXaWRnZXRGb3JMYWJlbChsYWJlbCwgdGhpcy5sYWJlbExheWVyKTtcblx0XHRcdFx0dGhpcy5jZFJlZi5kZXRlY3RDaGFuZ2VzKCk7XG5cdFx0XHR9KTtcblx0fVxuXG5cdGNhbGNMYWJlbEluY2xpbmUoZmlyc3RQb2ludDogQ29vcmRzLCBzZWNvbmRQb2ludDogQ29vcmRzKTogbnVtYmVyIHtcblx0XHRjb25zdCBkeSA9IHNlY29uZFBvaW50LnkgLSBmaXJzdFBvaW50Lnk7XG5cdFx0Y29uc3QgZHggPSBzZWNvbmRQb2ludC54IC0gZmlyc3RQb2ludC54O1xuXG5cdFx0aWYgKGR4ID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gMDtcblx0XHR9XG5cblx0XHRsZXQgaW5jbGluZUFuZ2VsID0gKE1hdGguYXRhbihkeSAvIGR4KSAqIDE4MCkgLyBNYXRoLlBJO1xuXG5cdFx0aWYgKGluY2xpbmVBbmdlbCA8IDApIHtcblx0XHRcdGluY2xpbmVBbmdlbCArPSAxODA7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGluY2xpbmVBbmdlbDtcblx0fVxuXG5cdGNhbGNDZW50ZXJPZlBhdGgoZmlyc3RQb2ludDogQ29vcmRzLCBzZWNvbmRQb2ludDogQ29vcmRzKTogQ29vcmRzIHtcblx0XHRyZXR1cm4geyB4OiAoZmlyc3RQb2ludC54ICsgc2Vjb25kUG9pbnQueCkgLyAyICsgMjAsIHk6IChmaXJzdFBvaW50LnkgKyBzZWNvbmRQb2ludC55KSAvIDIgKyAyMCB9O1xuXHR9XG59XG4iXX0=