Performance optimizations

master
Igor Kulikov 6 years ago
parent a5efa30b57
commit c31c111224

@ -296,6 +296,50 @@
FcNode.prototype.readonly; FcNode.prototype.readonly;
/* Skipping unhandled member: [key: string]: any;*/ /* Skipping unhandled member: [key: string]: any;*/
} }
/**
* @record
*/
function FcNodeRectInfo() { }
if (false) {
/**
* @return {?}
*/
FcNodeRectInfo.prototype.width = function () { };
/**
* @return {?}
*/
FcNodeRectInfo.prototype.height = function () { };
/**
* @return {?}
*/
FcNodeRectInfo.prototype.top = function () { };
/**
* @return {?}
*/
FcNodeRectInfo.prototype.left = function () { };
/**
* @return {?}
*/
FcNodeRectInfo.prototype.right = function () { };
/**
* @return {?}
*/
FcNodeRectInfo.prototype.bottom = function () { };
}
/**
* @record
*/
function FcConnectorRectInfo() { }
if (false) {
/** @type {?} */
FcConnectorRectInfo.prototype.type;
/** @type {?} */
FcConnectorRectInfo.prototype.width;
/** @type {?} */
FcConnectorRectInfo.prototype.height;
/** @type {?} */
FcConnectorRectInfo.prototype.nodeRectInfo;
}
/** /**
* @record * @record
*/ */
@ -549,7 +593,7 @@
var FcModelService = /** @class */ (function () { var FcModelService = /** @class */ (function () {
function FcModelService(modelValidation, model, modelChanged, detectChangesSubject, selectedObjects, dropNode, createEdge, edgeAddedCallback, nodeRemovedCallback, edgeRemovedCallback, canvasHtmlElement, svgHtmlElement) { function FcModelService(modelValidation, model, modelChanged, detectChangesSubject, selectedObjects, dropNode, createEdge, edgeAddedCallback, nodeRemovedCallback, edgeRemovedCallback, canvasHtmlElement, svgHtmlElement) {
var _this = this; var _this = this;
this.connectorsHtmlElements = {}; this.connectorsRectInfos = {};
this.nodesHtmlElements = {}; this.nodesHtmlElements = {};
this.canvasHtmlElement = null; this.canvasHtmlElement = null;
this.dragImage = null; this.dragImage = null;
@ -958,7 +1002,7 @@
/** @type {?} */ /** @type {?} */
FcModelService.prototype.selectedObjects; FcModelService.prototype.selectedObjects;
/** @type {?} */ /** @type {?} */
FcModelService.prototype.connectorsHtmlElements; FcModelService.prototype.connectorsRectInfos;
/** @type {?} */ /** @type {?} */
FcModelService.prototype.nodesHtmlElements; FcModelService.prototype.nodesHtmlElements;
/** @type {?} */ /** @type {?} */
@ -1000,6 +1044,10 @@
* @record * @record
*/ */
function HtmlElementMap() { } function HtmlElementMap() { }
/**
* @record
*/
function ConnectorRectInfoMap() { }
/** /**
* @abstract * @abstract
* @template T * @template T
@ -1122,25 +1170,25 @@
* @param {?} connectorId * @param {?} connectorId
* @return {?} * @return {?}
*/ */
ConnectorsModel.prototype.getHtmlElement = /** ConnectorsModel.prototype.getConnectorRectInfo = /**
* @param {?} connectorId * @param {?} connectorId
* @return {?} * @return {?}
*/ */
function (connectorId) { function (connectorId) {
return this.modelService.connectorsHtmlElements[connectorId]; return this.modelService.connectorsRectInfos[connectorId];
}; };
/** /**
* @param {?} connectorId * @param {?} connectorId
* @param {?} element * @param {?} connectorRectInfo
* @return {?} * @return {?}
*/ */
ConnectorsModel.prototype.setHtmlElement = /** ConnectorsModel.prototype.setConnectorRectInfo = /**
* @param {?} connectorId * @param {?} connectorId
* @param {?} element * @param {?} connectorRectInfo
* @return {?} * @return {?}
*/ */
function (connectorId, element) { function (connectorId, connectorRectInfo) {
this.modelService.connectorsHtmlElements[connectorId] = element; this.modelService.connectorsRectInfos[connectorId] = connectorRectInfo;
this.modelService.detectChanges(); this.modelService.detectChanges();
}; };
/** /**
@ -1157,27 +1205,26 @@
*/ */
function (connectorId, centered) { function (connectorId, centered) {
/** @type {?} */ /** @type {?} */
var element = this.getHtmlElement(connectorId); var connectorRectInfo = this.getConnectorRectInfo(connectorId);
/** @type {?} */ /** @type {?} */
var canvas = this.modelService.canvasHtmlElement; var canvas = this.modelService.canvasHtmlElement;
if (element === null || element === undefined || canvas === null) { if (connectorRectInfo === null || connectorRectInfo === undefined || canvas === null) {
return { x: 0, y: 0 }; return { x: 0, y: 0 };
} }
/** @type {?} */ /** @type {?} */
var connectorElementBox = element.getBoundingClientRect(); var x = connectorRectInfo.type === FlowchartConstants.leftConnectorType ?
connectorRectInfo.nodeRectInfo.left() : connectorRectInfo.nodeRectInfo.right();
/** @type {?} */ /** @type {?} */
var canvasElementBox = canvas.getBoundingClientRect(); var y = connectorRectInfo.nodeRectInfo.top() + connectorRectInfo.nodeRectInfo.height() / 2;
if (!centered) {
x -= connectorRectInfo.width / 2;
y -= connectorRectInfo.height / 2;
}
/** @type {?} */ /** @type {?} */
var coords = { var coords = {
x: connectorElementBox.left - canvasElementBox.left, x: Math.round(x),
y: connectorElementBox.top - canvasElementBox.top y: Math.round(y)
}; };
if (centered) {
coords = {
x: Math.round(coords.x + element.offsetWidth / 2),
y: Math.round(coords.y + element.offsetHeight / 2)
};
}
return coords; return coords;
}; };
/** /**
@ -1425,21 +1472,6 @@
function EdgesModel(modelService) { function EdgesModel(modelService) {
return _super.call(this, modelService) || this; return _super.call(this, modelService) || this;
} }
/**
* @param {?} edge
* @return {?}
*/
EdgesModel.prototype.ready = /**
* @param {?} edge
* @return {?}
*/
function (edge) {
/** @type {?} */
var source = this.modelService.connectors.getHtmlElement(edge.source);
/** @type {?} */
var destination = this.modelService.connectors.getHtmlElement(edge.destination);
return source !== undefined && destination !== undefined;
};
/** /**
* @param {?} edge * @param {?} edge
* @return {?} * @return {?}
@ -3962,7 +3994,14 @@
element.attr('draggable', 'true'); element.attr('draggable', 'true');
this.updateConnectorClass(); this.updateConnectorClass();
} }
this.modelservice.connectors.setHtmlElement(this.connector.id, element[0]); /** @type {?} */
var connectorRectInfo = {
type: this.connector.type,
width: this.elementRef.nativeElement.offsetWidth,
height: this.elementRef.nativeElement.offsetHeight,
nodeRectInfo: this.nodeRectInfo
};
this.modelservice.connectors.setConnectorRectInfo(this.connector.id, connectorRectInfo);
}; };
/** /**
* @param {?} changes * @param {?} changes
@ -4110,6 +4149,7 @@
callbacks: [{ type: core.Input }], callbacks: [{ type: core.Input }],
modelservice: [{ type: core.Input }], modelservice: [{ type: core.Input }],
connector: [{ type: core.Input }], connector: [{ type: core.Input }],
nodeRectInfo: [{ type: core.Input }],
mouseOverConnector: [{ type: core.Input }], mouseOverConnector: [{ type: core.Input }],
dragover: [{ type: core.HostListener, args: ['dragover', ['$event'],] }], dragover: [{ type: core.HostListener, args: ['dragover', ['$event'],] }],
drop: [{ type: core.HostListener, args: ['drop', ['$event'],] }], drop: [{ type: core.HostListener, args: ['drop', ['$event'],] }],
@ -4128,6 +4168,8 @@
/** @type {?} */ /** @type {?} */
FcConnectorDirective.prototype.connector; FcConnectorDirective.prototype.connector;
/** @type {?} */ /** @type {?} */
FcConnectorDirective.prototype.nodeRectInfo;
/** @type {?} */
FcConnectorDirective.prototype.mouseOverConnector; FcConnectorDirective.prototype.mouseOverConnector;
/** @type {?} */ /** @type {?} */
FcConnectorDirective.prototype.elementRef; FcConnectorDirective.prototype.elementRef;
@ -4222,6 +4264,18 @@
this.nodeComponent.node = this.node; this.nodeComponent.node = this.node;
this.nodeComponent.modelservice = this.modelservice; this.nodeComponent.modelservice = this.modelservice;
this.updateNodeComponent(); this.updateNodeComponent();
this.nodeComponent.width = this.elementRef.nativeElement.offsetWidth;
this.nodeComponent.height = this.elementRef.nativeElement.offsetHeight;
};
/**
* @return {?}
*/
FcNodeContainerComponent.prototype.ngAfterViewInit = /**
* @return {?}
*/
function () {
this.nodeComponent.width = this.elementRef.nativeElement.offsetWidth;
this.nodeComponent.height = this.elementRef.nativeElement.offsetHeight;
}; };
/** /**
* @param {?} changes * @param {?} changes
@ -4468,7 +4522,46 @@
*/ */
var FcNodeComponent = /** @class */ (function () { var FcNodeComponent = /** @class */ (function () {
function FcNodeComponent() { function FcNodeComponent() {
var _this = this;
this.flowchartConstants = FlowchartConstants; this.flowchartConstants = FlowchartConstants;
this.nodeRectInfo = {
top: (/**
* @return {?}
*/
function () {
return _this.node.y;
}),
left: (/**
* @return {?}
*/
function () {
return _this.node.x;
}),
bottom: (/**
* @return {?}
*/
function () {
return _this.node.y + _this.height;
}),
right: (/**
* @return {?}
*/
function () {
return _this.node.x + _this.width;
}),
width: (/**
* @return {?}
*/
function () {
return _this.width;
}),
height: (/**
* @return {?}
*/
function () {
return _this.height;
})
};
} }
/** /**
* @return {?} * @return {?}
@ -4512,6 +4605,12 @@
FcNodeComponent.prototype.dragging; FcNodeComponent.prototype.dragging;
/** @type {?} */ /** @type {?} */
FcNodeComponent.prototype.flowchartConstants; FcNodeComponent.prototype.flowchartConstants;
/** @type {?} */
FcNodeComponent.prototype.width;
/** @type {?} */
FcNodeComponent.prototype.height;
/** @type {?} */
FcNodeComponent.prototype.nodeRectInfo;
} }
/** /**
@ -4526,7 +4625,7 @@
DefaultFcNodeComponent.decorators = [ DefaultFcNodeComponent.decorators = [
{ type: core.Component, args: [{ { type: core.Component, args: [{
selector: 'fc-default-node', selector: 'fc-default-node',
template: "<div\n (dblclick)=\"userNodeCallbacks.doubleClick($event, node)\">\n <div class=\"{{flowchartConstants.nodeOverlayClass}}\"></div>\n <div class=\"innerNode\">\n <p>{{ node.name }}</p>\n\n <div class=\"{{flowchartConstants.leftConnectorClass}}\">\n <div fc-magnet [connector]=\"connector\" [callbacks]=\"callbacks\"\n *ngFor=\"let connector of modelservice.nodes.getConnectorsByType(node, flowchartConstants.leftConnectorType)\">\n <div fc-connector [connector]=\"connector\"\n [mouseOverConnector]=\"mouseOverConnector\"\n [callbacks]=\"callbacks\"\n [modelservice]=\"modelservice\"></div>\n </div>\n </div>\n <div class=\"{{flowchartConstants.rightConnectorClass}}\">\n <div fc-magnet [connector]=\"connector\" [callbacks]=\"callbacks\"\n *ngFor=\"let connector of modelservice.nodes.getConnectorsByType(node, flowchartConstants.rightConnectorType)\">\n <div fc-connector [connector]=\"connector\"\n [mouseOverConnector]=\"mouseOverConnector\"\n [callbacks]=\"callbacks\"\n [modelservice]=\"modelservice\"></div>\n </div>\n </div>\n </div>\n <div *ngIf=\"modelservice.isEditable() && !node.readonly\" class=\"fc-nodeedit\" (click)=\"userNodeCallbacks.nodeEdit($event, node)\">\n <i class=\"fa fa-pencil\" aria-hidden=\"true\"></i>\n </div>\n <div *ngIf=\"modelservice.isEditable() && !node.readonly\" class=\"fc-nodedelete\" (click)=\"modelservice.nodes.delete(node)\">\n &times;\n </div>\n</div>\n", template: "<div\n (dblclick)=\"userNodeCallbacks.doubleClick($event, node)\">\n <div class=\"{{flowchartConstants.nodeOverlayClass}}\"></div>\n <div class=\"innerNode\">\n <p>{{ node.name }}</p>\n\n <div class=\"{{flowchartConstants.leftConnectorClass}}\">\n <div fc-magnet [connector]=\"connector\" [callbacks]=\"callbacks\"\n *ngFor=\"let connector of modelservice.nodes.getConnectorsByType(node, flowchartConstants.leftConnectorType)\">\n <div fc-connector [connector]=\"connector\"\n [nodeRectInfo]=\"nodeRectInfo\"\n [mouseOverConnector]=\"mouseOverConnector\"\n [callbacks]=\"callbacks\"\n [modelservice]=\"modelservice\"></div>\n </div>\n </div>\n <div class=\"{{flowchartConstants.rightConnectorClass}}\">\n <div fc-magnet [connector]=\"connector\" [callbacks]=\"callbacks\"\n *ngFor=\"let connector of modelservice.nodes.getConnectorsByType(node, flowchartConstants.rightConnectorType)\">\n <div fc-connector [connector]=\"connector\"\n [nodeRectInfo]=\"nodeRectInfo\"\n [mouseOverConnector]=\"mouseOverConnector\"\n [callbacks]=\"callbacks\"\n [modelservice]=\"modelservice\"></div>\n </div>\n </div>\n </div>\n <div *ngIf=\"modelservice.isEditable() && !node.readonly\" class=\"fc-nodeedit\" (click)=\"userNodeCallbacks.nodeEdit($event, node)\">\n <i class=\"fa fa-pencil\" aria-hidden=\"true\"></i>\n </div>\n <div *ngIf=\"modelservice.isEditable() && !node.readonly\" class=\"fc-nodedelete\" (click)=\"modelservice.nodes.delete(node)\">\n &times;\n </div>\n</div>\n",
styles: [":host .fc-node-overlay{position:absolute;pointer-events:none;left:0;top:0;right:0;bottom:0;background-color:#000;opacity:0}:host :host-context(.fc-hover) .fc-node-overlay{opacity:.25;transition:opacity .2s}:host :host-context(.fc-selected) .fc-node-overlay{opacity:.25}:host .innerNode{display:flex;justify-content:center;align-items:center;min-width:100px;border-radius:5px;background-color:#f15b26;color:#fff;font-size:16px;pointer-events:none}:host .innerNode p{padding:0 15px;text-align:center}"] styles: [":host .fc-node-overlay{position:absolute;pointer-events:none;left:0;top:0;right:0;bottom:0;background-color:#000;opacity:0}:host :host-context(.fc-hover) .fc-node-overlay{opacity:.25;transition:opacity .2s}:host :host-context(.fc-selected) .fc-node-overlay{opacity:.25}:host .innerNode{display:flex;justify-content:center;align-items:center;min-width:100px;border-radius:5px;background-color:#f15b26;color:#fff;font-size:16px;pointer-events:none}:host .innerNode p{padding:0 15px;text-align:center}"]
}] } }] }
]; ];

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -12,10 +12,10 @@ export class DefaultFcNodeComponent extends FcNodeComponent {
DefaultFcNodeComponent.decorators = [ DefaultFcNodeComponent.decorators = [
{ type: Component, args: [{ { type: Component, args: [{
selector: 'fc-default-node', selector: 'fc-default-node',
template: "<div\n (dblclick)=\"userNodeCallbacks.doubleClick($event, node)\">\n <div class=\"{{flowchartConstants.nodeOverlayClass}}\"></div>\n <div class=\"innerNode\">\n <p>{{ node.name }}</p>\n\n <div class=\"{{flowchartConstants.leftConnectorClass}}\">\n <div fc-magnet [connector]=\"connector\" [callbacks]=\"callbacks\"\n *ngFor=\"let connector of modelservice.nodes.getConnectorsByType(node, flowchartConstants.leftConnectorType)\">\n <div fc-connector [connector]=\"connector\"\n [mouseOverConnector]=\"mouseOverConnector\"\n [callbacks]=\"callbacks\"\n [modelservice]=\"modelservice\"></div>\n </div>\n </div>\n <div class=\"{{flowchartConstants.rightConnectorClass}}\">\n <div fc-magnet [connector]=\"connector\" [callbacks]=\"callbacks\"\n *ngFor=\"let connector of modelservice.nodes.getConnectorsByType(node, flowchartConstants.rightConnectorType)\">\n <div fc-connector [connector]=\"connector\"\n [mouseOverConnector]=\"mouseOverConnector\"\n [callbacks]=\"callbacks\"\n [modelservice]=\"modelservice\"></div>\n </div>\n </div>\n </div>\n <div *ngIf=\"modelservice.isEditable() && !node.readonly\" class=\"fc-nodeedit\" (click)=\"userNodeCallbacks.nodeEdit($event, node)\">\n <i class=\"fa fa-pencil\" aria-hidden=\"true\"></i>\n </div>\n <div *ngIf=\"modelservice.isEditable() && !node.readonly\" class=\"fc-nodedelete\" (click)=\"modelservice.nodes.delete(node)\">\n &times;\n </div>\n</div>\n", template: "<div\n (dblclick)=\"userNodeCallbacks.doubleClick($event, node)\">\n <div class=\"{{flowchartConstants.nodeOverlayClass}}\"></div>\n <div class=\"innerNode\">\n <p>{{ node.name }}</p>\n\n <div class=\"{{flowchartConstants.leftConnectorClass}}\">\n <div fc-magnet [connector]=\"connector\" [callbacks]=\"callbacks\"\n *ngFor=\"let connector of modelservice.nodes.getConnectorsByType(node, flowchartConstants.leftConnectorType)\">\n <div fc-connector [connector]=\"connector\"\n [nodeRectInfo]=\"nodeRectInfo\"\n [mouseOverConnector]=\"mouseOverConnector\"\n [callbacks]=\"callbacks\"\n [modelservice]=\"modelservice\"></div>\n </div>\n </div>\n <div class=\"{{flowchartConstants.rightConnectorClass}}\">\n <div fc-magnet [connector]=\"connector\" [callbacks]=\"callbacks\"\n *ngFor=\"let connector of modelservice.nodes.getConnectorsByType(node, flowchartConstants.rightConnectorType)\">\n <div fc-connector [connector]=\"connector\"\n [nodeRectInfo]=\"nodeRectInfo\"\n [mouseOverConnector]=\"mouseOverConnector\"\n [callbacks]=\"callbacks\"\n [modelservice]=\"modelservice\"></div>\n </div>\n </div>\n </div>\n <div *ngIf=\"modelservice.isEditable() && !node.readonly\" class=\"fc-nodeedit\" (click)=\"userNodeCallbacks.nodeEdit($event, node)\">\n <i class=\"fa fa-pencil\" aria-hidden=\"true\"></i>\n </div>\n <div *ngIf=\"modelservice.isEditable() && !node.readonly\" class=\"fc-nodedelete\" (click)=\"modelservice.nodes.delete(node)\">\n &times;\n </div>\n</div>\n",
styles: [":host .fc-node-overlay{position:absolute;pointer-events:none;left:0;top:0;right:0;bottom:0;background-color:#000;opacity:0}:host :host-context(.fc-hover) .fc-node-overlay{opacity:.25;transition:opacity .2s}:host :host-context(.fc-selected) .fc-node-overlay{opacity:.25}:host .innerNode{display:flex;justify-content:center;align-items:center;min-width:100px;border-radius:5px;background-color:#f15b26;color:#fff;font-size:16px;pointer-events:none}:host .innerNode p{padding:0 15px;text-align:center}"] styles: [":host .fc-node-overlay{position:absolute;pointer-events:none;left:0;top:0;right:0;bottom:0;background-color:#000;opacity:0}:host :host-context(.fc-hover) .fc-node-overlay{opacity:.25;transition:opacity .2s}:host :host-context(.fc-selected) .fc-node-overlay{opacity:.25}:host .innerNode{display:flex;justify-content:center;align-items:center;min-width:100px;border-radius:5px;background-color:#f15b26;color:#fff;font-size:16px;pointer-events:none}:host .innerNode p{padding:0 15px;text-align:center}"]
}] } }] }
]; ];
/** @nocollapse */ /** @nocollapse */
DefaultFcNodeComponent.ctorParameters = () => []; DefaultFcNodeComponent.ctorParameters = () => [];
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdC1ub2RlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1mbG93Y2hhcnQvIiwic291cmNlcyI6WyJsaWIvZGVmYXVsdC1ub2RlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFPbkQsTUFBTSxPQUFPLHNCQUF1QixTQUFRLGVBQWU7SUFFekQ7UUFDRSxLQUFLLEVBQUUsQ0FBQztJQUNWLENBQUM7OztZQVRGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsaUJBQWlCO2dCQUMzQiw4aERBQTRDOzthQUU3QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRmNOb2RlQ29tcG9uZW50IH0gZnJvbSAnLi9ub2RlLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2ZjLWRlZmF1bHQtbm9kZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9kZWZhdWx0LW5vZGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9kZWZhdWx0LW5vZGUuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBEZWZhdWx0RmNOb2RlQ29tcG9uZW50IGV4dGVuZHMgRmNOb2RlQ29tcG9uZW50IHtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbn1cbiJdfQ== //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdC1ub2RlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1mbG93Y2hhcnQvIiwic291cmNlcyI6WyJsaWIvZGVmYXVsdC1ub2RlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7O0FBQUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFPbkQsTUFBTSxPQUFPLHNCQUF1QixTQUFRLGVBQWU7SUFFekQ7UUFDRSxLQUFLLEVBQUUsQ0FBQztJQUNWLENBQUM7OztZQVRGLFNBQVMsU0FBQztnQkFDVCxRQUFRLEVBQUUsaUJBQWlCO2dCQUMzQiwwbkRBQTRDOzthQUU3QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgRmNOb2RlQ29tcG9uZW50IH0gZnJvbSAnLi9ub2RlLmNvbXBvbmVudCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2ZjLWRlZmF1bHQtbm9kZScsXG4gIHRlbXBsYXRlVXJsOiAnLi9kZWZhdWx0LW5vZGUuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9kZWZhdWx0LW5vZGUuY29tcG9uZW50LnNjc3MnXVxufSlcbmV4cG9ydCBjbGFzcyBEZWZhdWx0RmNOb2RlQ29tcG9uZW50IGV4dGVuZHMgRmNOb2RlQ29tcG9uZW50IHtcblxuICBjb25zdHJ1Y3RvcigpIHtcbiAgICBzdXBlcigpO1xuICB9XG5cbn1cbiJdfQ==

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -13,7 +13,7 @@ var DefaultFcNodeComponent = /** @class */ (function (_super) {
DefaultFcNodeComponent.decorators = [ DefaultFcNodeComponent.decorators = [
{ type: Component, args: [{ { type: Component, args: [{
selector: 'fc-default-node', selector: 'fc-default-node',
template: "<div\n (dblclick)=\"userNodeCallbacks.doubleClick($event, node)\">\n <div class=\"{{flowchartConstants.nodeOverlayClass}}\"></div>\n <div class=\"innerNode\">\n <p>{{ node.name }}</p>\n\n <div class=\"{{flowchartConstants.leftConnectorClass}}\">\n <div fc-magnet [connector]=\"connector\" [callbacks]=\"callbacks\"\n *ngFor=\"let connector of modelservice.nodes.getConnectorsByType(node, flowchartConstants.leftConnectorType)\">\n <div fc-connector [connector]=\"connector\"\n [mouseOverConnector]=\"mouseOverConnector\"\n [callbacks]=\"callbacks\"\n [modelservice]=\"modelservice\"></div>\n </div>\n </div>\n <div class=\"{{flowchartConstants.rightConnectorClass}}\">\n <div fc-magnet [connector]=\"connector\" [callbacks]=\"callbacks\"\n *ngFor=\"let connector of modelservice.nodes.getConnectorsByType(node, flowchartConstants.rightConnectorType)\">\n <div fc-connector [connector]=\"connector\"\n [mouseOverConnector]=\"mouseOverConnector\"\n [callbacks]=\"callbacks\"\n [modelservice]=\"modelservice\"></div>\n </div>\n </div>\n </div>\n <div *ngIf=\"modelservice.isEditable() && !node.readonly\" class=\"fc-nodeedit\" (click)=\"userNodeCallbacks.nodeEdit($event, node)\">\n <i class=\"fa fa-pencil\" aria-hidden=\"true\"></i>\n </div>\n <div *ngIf=\"modelservice.isEditable() && !node.readonly\" class=\"fc-nodedelete\" (click)=\"modelservice.nodes.delete(node)\">\n &times;\n </div>\n</div>\n", template: "<div\n (dblclick)=\"userNodeCallbacks.doubleClick($event, node)\">\n <div class=\"{{flowchartConstants.nodeOverlayClass}}\"></div>\n <div class=\"innerNode\">\n <p>{{ node.name }}</p>\n\n <div class=\"{{flowchartConstants.leftConnectorClass}}\">\n <div fc-magnet [connector]=\"connector\" [callbacks]=\"callbacks\"\n *ngFor=\"let connector of modelservice.nodes.getConnectorsByType(node, flowchartConstants.leftConnectorType)\">\n <div fc-connector [connector]=\"connector\"\n [nodeRectInfo]=\"nodeRectInfo\"\n [mouseOverConnector]=\"mouseOverConnector\"\n [callbacks]=\"callbacks\"\n [modelservice]=\"modelservice\"></div>\n </div>\n </div>\n <div class=\"{{flowchartConstants.rightConnectorClass}}\">\n <div fc-magnet [connector]=\"connector\" [callbacks]=\"callbacks\"\n *ngFor=\"let connector of modelservice.nodes.getConnectorsByType(node, flowchartConstants.rightConnectorType)\">\n <div fc-connector [connector]=\"connector\"\n [nodeRectInfo]=\"nodeRectInfo\"\n [mouseOverConnector]=\"mouseOverConnector\"\n [callbacks]=\"callbacks\"\n [modelservice]=\"modelservice\"></div>\n </div>\n </div>\n </div>\n <div *ngIf=\"modelservice.isEditable() && !node.readonly\" class=\"fc-nodeedit\" (click)=\"userNodeCallbacks.nodeEdit($event, node)\">\n <i class=\"fa fa-pencil\" aria-hidden=\"true\"></i>\n </div>\n <div *ngIf=\"modelservice.isEditable() && !node.readonly\" class=\"fc-nodedelete\" (click)=\"modelservice.nodes.delete(node)\">\n &times;\n </div>\n</div>\n",
styles: [":host .fc-node-overlay{position:absolute;pointer-events:none;left:0;top:0;right:0;bottom:0;background-color:#000;opacity:0}:host :host-context(.fc-hover) .fc-node-overlay{opacity:.25;transition:opacity .2s}:host :host-context(.fc-selected) .fc-node-overlay{opacity:.25}:host .innerNode{display:flex;justify-content:center;align-items:center;min-width:100px;border-radius:5px;background-color:#f15b26;color:#fff;font-size:16px;pointer-events:none}:host .innerNode p{padding:0 15px;text-align:center}"] styles: [":host .fc-node-overlay{position:absolute;pointer-events:none;left:0;top:0;right:0;bottom:0;background-color:#000;opacity:0}:host :host-context(.fc-hover) .fc-node-overlay{opacity:.25;transition:opacity .2s}:host :host-context(.fc-selected) .fc-node-overlay{opacity:.25}:host .innerNode{display:flex;justify-content:center;align-items:center;min-width:100px;border-radius:5px;background-color:#f15b26;color:#fff;font-size:16px;pointer-events:none}:host .innerNode p{padding:0 15px;text-align:center}"]
}] } }] }
]; ];
@ -22,4 +22,4 @@ var DefaultFcNodeComponent = /** @class */ (function (_super) {
return DefaultFcNodeComponent; return DefaultFcNodeComponent;
}(FcNodeComponent)); }(FcNodeComponent));
export { DefaultFcNodeComponent }; export { DefaultFcNodeComponent };
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdC1ub2RlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1mbG93Y2hhcnQvIiwic291cmNlcyI6WyJsaWIvZGVmYXVsdC1ub2RlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRW5EO0lBSzRDLGtEQUFlO0lBRXpEO2VBQ0UsaUJBQU87SUFDVCxDQUFDOztnQkFURixTQUFTLFNBQUM7b0JBQ1QsUUFBUSxFQUFFLGlCQUFpQjtvQkFDM0IsOGhEQUE0Qzs7aUJBRTdDOzs7O0lBT0QsNkJBQUM7Q0FBQSxBQVhELENBSzRDLGVBQWUsR0FNMUQ7U0FOWSxzQkFBc0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZjTm9kZUNvbXBvbmVudCB9IGZyb20gJy4vbm9kZS5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdmYy1kZWZhdWx0LW5vZGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vZGVmYXVsdC1ub2RlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZGVmYXVsdC1ub2RlLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgRGVmYXVsdEZjTm9kZUNvbXBvbmVudCBleHRlbmRzIEZjTm9kZUNvbXBvbmVudCB7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG59XG4iXX0= //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmYXVsdC1ub2RlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiJuZzovL25neC1mbG93Y2hhcnQvIiwic291cmNlcyI6WyJsaWIvZGVmYXVsdC1ub2RlLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDMUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBRW5EO0lBSzRDLGtEQUFlO0lBRXpEO2VBQ0UsaUJBQU87SUFDVCxDQUFDOztnQkFURixTQUFTLFNBQUM7b0JBQ1QsUUFBUSxFQUFFLGlCQUFpQjtvQkFDM0IsMG5EQUE0Qzs7aUJBRTdDOzs7O0lBT0QsNkJBQUM7Q0FBQSxBQVhELENBSzRDLGVBQWUsR0FNMUQ7U0FOWSxzQkFBc0IiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZjTm9kZUNvbXBvbmVudCB9IGZyb20gJy4vbm9kZS5jb21wb25lbnQnO1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdmYy1kZWZhdWx0LW5vZGUnLFxuICB0ZW1wbGF0ZVVybDogJy4vZGVmYXVsdC1ub2RlLmNvbXBvbmVudC5odG1sJyxcbiAgc3R5bGVVcmxzOiBbJy4vZGVmYXVsdC1ub2RlLmNvbXBvbmVudC5zY3NzJ11cbn0pXG5leHBvcnQgY2xhc3MgRGVmYXVsdEZjTm9kZUNvbXBvbmVudCBleHRlbmRzIEZjTm9kZUNvbXBvbmVudCB7XG5cbiAgY29uc3RydWN0b3IoKSB7XG4gICAgc3VwZXIoKTtcbiAgfVxuXG59XG4iXX0=

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -99,6 +99,50 @@ if (false) {
FcNode.prototype.readonly; FcNode.prototype.readonly;
/* Skipping unhandled member: [key: string]: any;*/ /* Skipping unhandled member: [key: string]: any;*/
} }
/**
* @record
*/
function FcNodeRectInfo() { }
if (false) {
/**
* @return {?}
*/
FcNodeRectInfo.prototype.width = function () { };
/**
* @return {?}
*/
FcNodeRectInfo.prototype.height = function () { };
/**
* @return {?}
*/
FcNodeRectInfo.prototype.top = function () { };
/**
* @return {?}
*/
FcNodeRectInfo.prototype.left = function () { };
/**
* @return {?}
*/
FcNodeRectInfo.prototype.right = function () { };
/**
* @return {?}
*/
FcNodeRectInfo.prototype.bottom = function () { };
}
/**
* @record
*/
function FcConnectorRectInfo() { }
if (false) {
/** @type {?} */
FcConnectorRectInfo.prototype.type;
/** @type {?} */
FcConnectorRectInfo.prototype.width;
/** @type {?} */
FcConnectorRectInfo.prototype.height;
/** @type {?} */
FcConnectorRectInfo.prototype.nodeRectInfo;
}
/** /**
* @record * @record
*/ */
@ -343,7 +387,7 @@ class FcModelService {
* @param {?} svgHtmlElement * @param {?} svgHtmlElement
*/ */
constructor(modelValidation, model, modelChanged, detectChangesSubject, selectedObjects, dropNode, createEdge, edgeAddedCallback, nodeRemovedCallback, edgeRemovedCallback, canvasHtmlElement, svgHtmlElement) { constructor(modelValidation, model, modelChanged, detectChangesSubject, selectedObjects, dropNode, createEdge, edgeAddedCallback, nodeRemovedCallback, edgeRemovedCallback, canvasHtmlElement, svgHtmlElement) {
this.connectorsHtmlElements = {}; this.connectorsRectInfos = {};
this.nodesHtmlElements = {}; this.nodesHtmlElements = {};
this.canvasHtmlElement = null; this.canvasHtmlElement = null;
this.dragImage = null; this.dragImage = null;
@ -666,7 +710,7 @@ if (false) {
/** @type {?} */ /** @type {?} */
FcModelService.prototype.selectedObjects; FcModelService.prototype.selectedObjects;
/** @type {?} */ /** @type {?} */
FcModelService.prototype.connectorsHtmlElements; FcModelService.prototype.connectorsRectInfos;
/** @type {?} */ /** @type {?} */
FcModelService.prototype.nodesHtmlElements; FcModelService.prototype.nodesHtmlElements;
/** @type {?} */ /** @type {?} */
@ -708,6 +752,10 @@ if (false) {
* @record * @record
*/ */
function HtmlElementMap() { } function HtmlElementMap() { }
/**
* @record
*/
function ConnectorRectInfoMap() { }
/** /**
* @abstract * @abstract
* @template T * @template T
@ -786,16 +834,16 @@ class ConnectorsModel extends AbstractFcModel {
* @param {?} connectorId * @param {?} connectorId
* @return {?} * @return {?}
*/ */
getHtmlElement(connectorId) { getConnectorRectInfo(connectorId) {
return this.modelService.connectorsHtmlElements[connectorId]; return this.modelService.connectorsRectInfos[connectorId];
} }
/** /**
* @param {?} connectorId * @param {?} connectorId
* @param {?} element * @param {?} connectorRectInfo
* @return {?} * @return {?}
*/ */
setHtmlElement(connectorId, element) { setConnectorRectInfo(connectorId, connectorRectInfo) {
this.modelService.connectorsHtmlElements[connectorId] = element; this.modelService.connectorsRectInfos[connectorId] = connectorRectInfo;
this.modelService.detectChanges(); this.modelService.detectChanges();
} }
/** /**
@ -806,27 +854,26 @@ class ConnectorsModel extends AbstractFcModel {
*/ */
_getCoords(connectorId, centered) { _getCoords(connectorId, centered) {
/** @type {?} */ /** @type {?} */
const element = this.getHtmlElement(connectorId); const connectorRectInfo = this.getConnectorRectInfo(connectorId);
/** @type {?} */ /** @type {?} */
const canvas = this.modelService.canvasHtmlElement; const canvas = this.modelService.canvasHtmlElement;
if (element === null || element === undefined || canvas === null) { if (connectorRectInfo === null || connectorRectInfo === undefined || canvas === null) {
return { x: 0, y: 0 }; return { x: 0, y: 0 };
} }
/** @type {?} */ /** @type {?} */
const connectorElementBox = element.getBoundingClientRect(); let x = connectorRectInfo.type === FlowchartConstants.leftConnectorType ?
connectorRectInfo.nodeRectInfo.left() : connectorRectInfo.nodeRectInfo.right();
/** @type {?} */ /** @type {?} */
const canvasElementBox = canvas.getBoundingClientRect(); let y = connectorRectInfo.nodeRectInfo.top() + connectorRectInfo.nodeRectInfo.height() / 2;
if (!centered) {
x -= connectorRectInfo.width / 2;
y -= connectorRectInfo.height / 2;
}
/** @type {?} */ /** @type {?} */
let coords = { const coords = {
x: connectorElementBox.left - canvasElementBox.left, x: Math.round(x),
y: connectorElementBox.top - canvasElementBox.top y: Math.round(y)
};
if (centered) {
coords = {
x: Math.round(coords.x + element.offsetWidth / 2),
y: Math.round(coords.y + element.offsetHeight / 2)
}; };
}
return coords; return coords;
} }
/** /**
@ -1011,17 +1058,6 @@ class EdgesModel extends AbstractFcModel {
constructor(modelService) { constructor(modelService) {
super(modelService); super(modelService);
} }
/**
* @param {?} edge
* @return {?}
*/
ready(edge) {
/** @type {?} */
const source = this.modelService.connectors.getHtmlElement(edge.source);
/** @type {?} */
const destination = this.modelService.connectors.getHtmlElement(edge.destination);
return source !== undefined && destination !== undefined;
}
/** /**
* @param {?} edge * @param {?} edge
* @return {?} * @return {?}
@ -3160,7 +3196,14 @@ class FcConnectorDirective {
element.attr('draggable', 'true'); element.attr('draggable', 'true');
this.updateConnectorClass(); this.updateConnectorClass();
} }
this.modelservice.connectors.setHtmlElement(this.connector.id, element[0]); /** @type {?} */
const connectorRectInfo = {
type: this.connector.type,
width: this.elementRef.nativeElement.offsetWidth,
height: this.elementRef.nativeElement.offsetHeight,
nodeRectInfo: this.nodeRectInfo
};
this.modelservice.connectors.setConnectorRectInfo(this.connector.id, connectorRectInfo);
} }
/** /**
* @param {?} changes * @param {?} changes
@ -3266,6 +3309,7 @@ FcConnectorDirective.propDecorators = {
callbacks: [{ type: Input }], callbacks: [{ type: Input }],
modelservice: [{ type: Input }], modelservice: [{ type: Input }],
connector: [{ type: Input }], connector: [{ type: Input }],
nodeRectInfo: [{ type: Input }],
mouseOverConnector: [{ type: Input }], mouseOverConnector: [{ type: Input }],
dragover: [{ type: HostListener, args: ['dragover', ['$event'],] }], dragover: [{ type: HostListener, args: ['dragover', ['$event'],] }],
drop: [{ type: HostListener, args: ['drop', ['$event'],] }], drop: [{ type: HostListener, args: ['drop', ['$event'],] }],
@ -3282,6 +3326,8 @@ if (false) {
/** @type {?} */ /** @type {?} */
FcConnectorDirective.prototype.connector; FcConnectorDirective.prototype.connector;
/** @type {?} */ /** @type {?} */
FcConnectorDirective.prototype.nodeRectInfo;
/** @type {?} */
FcConnectorDirective.prototype.mouseOverConnector; FcConnectorDirective.prototype.mouseOverConnector;
/** @type {?} */ /** @type {?} */
FcConnectorDirective.prototype.elementRef; FcConnectorDirective.prototype.elementRef;
@ -3366,6 +3412,15 @@ class FcNodeContainerComponent {
this.nodeComponent.node = this.node; this.nodeComponent.node = this.node;
this.nodeComponent.modelservice = this.modelservice; this.nodeComponent.modelservice = this.modelservice;
this.updateNodeComponent(); this.updateNodeComponent();
this.nodeComponent.width = this.elementRef.nativeElement.offsetWidth;
this.nodeComponent.height = this.elementRef.nativeElement.offsetHeight;
}
/**
* @return {?}
*/
ngAfterViewInit() {
this.nodeComponent.width = this.elementRef.nativeElement.offsetWidth;
this.nodeComponent.height = this.elementRef.nativeElement.offsetHeight;
} }
/** /**
* @param {?} changes * @param {?} changes
@ -3558,6 +3613,44 @@ if (false) {
class FcNodeComponent { class FcNodeComponent {
constructor() { constructor() {
this.flowchartConstants = FlowchartConstants; this.flowchartConstants = FlowchartConstants;
this.nodeRectInfo = {
top: (/**
* @return {?}
*/
() => {
return this.node.y;
}),
left: (/**
* @return {?}
*/
() => {
return this.node.x;
}),
bottom: (/**
* @return {?}
*/
() => {
return this.node.y + this.height;
}),
right: (/**
* @return {?}
*/
() => {
return this.node.x + this.width;
}),
width: (/**
* @return {?}
*/
() => {
return this.width;
}),
height: (/**
* @return {?}
*/
() => {
return this.height;
})
};
} }
/** /**
* @return {?} * @return {?}
@ -3597,6 +3690,12 @@ if (false) {
FcNodeComponent.prototype.dragging; FcNodeComponent.prototype.dragging;
/** @type {?} */ /** @type {?} */
FcNodeComponent.prototype.flowchartConstants; FcNodeComponent.prototype.flowchartConstants;
/** @type {?} */
FcNodeComponent.prototype.width;
/** @type {?} */
FcNodeComponent.prototype.height;
/** @type {?} */
FcNodeComponent.prototype.nodeRectInfo;
} }
/** /**
@ -3611,7 +3710,7 @@ class DefaultFcNodeComponent extends FcNodeComponent {
DefaultFcNodeComponent.decorators = [ DefaultFcNodeComponent.decorators = [
{ type: Component, args: [{ { type: Component, args: [{
selector: 'fc-default-node', selector: 'fc-default-node',
template: "<div\n (dblclick)=\"userNodeCallbacks.doubleClick($event, node)\">\n <div class=\"{{flowchartConstants.nodeOverlayClass}}\"></div>\n <div class=\"innerNode\">\n <p>{{ node.name }}</p>\n\n <div class=\"{{flowchartConstants.leftConnectorClass}}\">\n <div fc-magnet [connector]=\"connector\" [callbacks]=\"callbacks\"\n *ngFor=\"let connector of modelservice.nodes.getConnectorsByType(node, flowchartConstants.leftConnectorType)\">\n <div fc-connector [connector]=\"connector\"\n [mouseOverConnector]=\"mouseOverConnector\"\n [callbacks]=\"callbacks\"\n [modelservice]=\"modelservice\"></div>\n </div>\n </div>\n <div class=\"{{flowchartConstants.rightConnectorClass}}\">\n <div fc-magnet [connector]=\"connector\" [callbacks]=\"callbacks\"\n *ngFor=\"let connector of modelservice.nodes.getConnectorsByType(node, flowchartConstants.rightConnectorType)\">\n <div fc-connector [connector]=\"connector\"\n [mouseOverConnector]=\"mouseOverConnector\"\n [callbacks]=\"callbacks\"\n [modelservice]=\"modelservice\"></div>\n </div>\n </div>\n </div>\n <div *ngIf=\"modelservice.isEditable() && !node.readonly\" class=\"fc-nodeedit\" (click)=\"userNodeCallbacks.nodeEdit($event, node)\">\n <i class=\"fa fa-pencil\" aria-hidden=\"true\"></i>\n </div>\n <div *ngIf=\"modelservice.isEditable() && !node.readonly\" class=\"fc-nodedelete\" (click)=\"modelservice.nodes.delete(node)\">\n &times;\n </div>\n</div>\n", template: "<div\n (dblclick)=\"userNodeCallbacks.doubleClick($event, node)\">\n <div class=\"{{flowchartConstants.nodeOverlayClass}}\"></div>\n <div class=\"innerNode\">\n <p>{{ node.name }}</p>\n\n <div class=\"{{flowchartConstants.leftConnectorClass}}\">\n <div fc-magnet [connector]=\"connector\" [callbacks]=\"callbacks\"\n *ngFor=\"let connector of modelservice.nodes.getConnectorsByType(node, flowchartConstants.leftConnectorType)\">\n <div fc-connector [connector]=\"connector\"\n [nodeRectInfo]=\"nodeRectInfo\"\n [mouseOverConnector]=\"mouseOverConnector\"\n [callbacks]=\"callbacks\"\n [modelservice]=\"modelservice\"></div>\n </div>\n </div>\n <div class=\"{{flowchartConstants.rightConnectorClass}}\">\n <div fc-magnet [connector]=\"connector\" [callbacks]=\"callbacks\"\n *ngFor=\"let connector of modelservice.nodes.getConnectorsByType(node, flowchartConstants.rightConnectorType)\">\n <div fc-connector [connector]=\"connector\"\n [nodeRectInfo]=\"nodeRectInfo\"\n [mouseOverConnector]=\"mouseOverConnector\"\n [callbacks]=\"callbacks\"\n [modelservice]=\"modelservice\"></div>\n </div>\n </div>\n </div>\n <div *ngIf=\"modelservice.isEditable() && !node.readonly\" class=\"fc-nodeedit\" (click)=\"userNodeCallbacks.nodeEdit($event, node)\">\n <i class=\"fa fa-pencil\" aria-hidden=\"true\"></i>\n </div>\n <div *ngIf=\"modelservice.isEditable() && !node.readonly\" class=\"fc-nodedelete\" (click)=\"modelservice.nodes.delete(node)\">\n &times;\n </div>\n</div>\n",
styles: [":host .fc-node-overlay{position:absolute;pointer-events:none;left:0;top:0;right:0;bottom:0;background-color:#000;opacity:0}:host :host-context(.fc-hover) .fc-node-overlay{opacity:.25;transition:opacity .2s}:host :host-context(.fc-selected) .fc-node-overlay{opacity:.25}:host .innerNode{display:flex;justify-content:center;align-items:center;min-width:100px;border-radius:5px;background-color:#f15b26;color:#fff;font-size:16px;pointer-events:none}:host .innerNode p{padding:0 15px;text-align:center}"] styles: [":host .fc-node-overlay{position:absolute;pointer-events:none;left:0;top:0;right:0;bottom:0;background-color:#000;opacity:0}:host :host-context(.fc-hover) .fc-node-overlay{opacity:.25;transition:opacity .2s}:host :host-context(.fc-selected) .fc-node-overlay{opacity:.25}:host .innerNode{display:flex;justify-content:center;align-items:center;min-width:100px;border-radius:5px;background-color:#f15b26;color:#fff;font-size:16px;pointer-events:none}:host .innerNode p{padding:0 15px;text-align:center}"]
}] } }] }
]; ];

File diff suppressed because one or more lines are too long

@ -100,6 +100,50 @@ if (false) {
FcNode.prototype.readonly; FcNode.prototype.readonly;
/* Skipping unhandled member: [key: string]: any;*/ /* Skipping unhandled member: [key: string]: any;*/
} }
/**
* @record
*/
function FcNodeRectInfo() { }
if (false) {
/**
* @return {?}
*/
FcNodeRectInfo.prototype.width = function () { };
/**
* @return {?}
*/
FcNodeRectInfo.prototype.height = function () { };
/**
* @return {?}
*/
FcNodeRectInfo.prototype.top = function () { };
/**
* @return {?}
*/
FcNodeRectInfo.prototype.left = function () { };
/**
* @return {?}
*/
FcNodeRectInfo.prototype.right = function () { };
/**
* @return {?}
*/
FcNodeRectInfo.prototype.bottom = function () { };
}
/**
* @record
*/
function FcConnectorRectInfo() { }
if (false) {
/** @type {?} */
FcConnectorRectInfo.prototype.type;
/** @type {?} */
FcConnectorRectInfo.prototype.width;
/** @type {?} */
FcConnectorRectInfo.prototype.height;
/** @type {?} */
FcConnectorRectInfo.prototype.nodeRectInfo;
}
/** /**
* @record * @record
*/ */
@ -353,7 +397,7 @@ function fcTopSort(graph) {
var FcModelService = /** @class */ (function () { var FcModelService = /** @class */ (function () {
function FcModelService(modelValidation, model, modelChanged, detectChangesSubject, selectedObjects, dropNode, createEdge, edgeAddedCallback, nodeRemovedCallback, edgeRemovedCallback, canvasHtmlElement, svgHtmlElement) { function FcModelService(modelValidation, model, modelChanged, detectChangesSubject, selectedObjects, dropNode, createEdge, edgeAddedCallback, nodeRemovedCallback, edgeRemovedCallback, canvasHtmlElement, svgHtmlElement) {
var _this = this; var _this = this;
this.connectorsHtmlElements = {}; this.connectorsRectInfos = {};
this.nodesHtmlElements = {}; this.nodesHtmlElements = {};
this.canvasHtmlElement = null; this.canvasHtmlElement = null;
this.dragImage = null; this.dragImage = null;
@ -762,7 +806,7 @@ if (false) {
/** @type {?} */ /** @type {?} */
FcModelService.prototype.selectedObjects; FcModelService.prototype.selectedObjects;
/** @type {?} */ /** @type {?} */
FcModelService.prototype.connectorsHtmlElements; FcModelService.prototype.connectorsRectInfos;
/** @type {?} */ /** @type {?} */
FcModelService.prototype.nodesHtmlElements; FcModelService.prototype.nodesHtmlElements;
/** @type {?} */ /** @type {?} */
@ -804,6 +848,10 @@ if (false) {
* @record * @record
*/ */
function HtmlElementMap() { } function HtmlElementMap() { }
/**
* @record
*/
function ConnectorRectInfoMap() { }
/** /**
* @abstract * @abstract
* @template T * @template T
@ -926,25 +974,25 @@ var ConnectorsModel = /** @class */ (function (_super) {
* @param {?} connectorId * @param {?} connectorId
* @return {?} * @return {?}
*/ */
ConnectorsModel.prototype.getHtmlElement = /** ConnectorsModel.prototype.getConnectorRectInfo = /**
* @param {?} connectorId * @param {?} connectorId
* @return {?} * @return {?}
*/ */
function (connectorId) { function (connectorId) {
return this.modelService.connectorsHtmlElements[connectorId]; return this.modelService.connectorsRectInfos[connectorId];
}; };
/** /**
* @param {?} connectorId * @param {?} connectorId
* @param {?} element * @param {?} connectorRectInfo
* @return {?} * @return {?}
*/ */
ConnectorsModel.prototype.setHtmlElement = /** ConnectorsModel.prototype.setConnectorRectInfo = /**
* @param {?} connectorId * @param {?} connectorId
* @param {?} element * @param {?} connectorRectInfo
* @return {?} * @return {?}
*/ */
function (connectorId, element) { function (connectorId, connectorRectInfo) {
this.modelService.connectorsHtmlElements[connectorId] = element; this.modelService.connectorsRectInfos[connectorId] = connectorRectInfo;
this.modelService.detectChanges(); this.modelService.detectChanges();
}; };
/** /**
@ -961,27 +1009,26 @@ var ConnectorsModel = /** @class */ (function (_super) {
*/ */
function (connectorId, centered) { function (connectorId, centered) {
/** @type {?} */ /** @type {?} */
var element = this.getHtmlElement(connectorId); var connectorRectInfo = this.getConnectorRectInfo(connectorId);
/** @type {?} */ /** @type {?} */
var canvas = this.modelService.canvasHtmlElement; var canvas = this.modelService.canvasHtmlElement;
if (element === null || element === undefined || canvas === null) { if (connectorRectInfo === null || connectorRectInfo === undefined || canvas === null) {
return { x: 0, y: 0 }; return { x: 0, y: 0 };
} }
/** @type {?} */ /** @type {?} */
var connectorElementBox = element.getBoundingClientRect(); var x = connectorRectInfo.type === FlowchartConstants.leftConnectorType ?
connectorRectInfo.nodeRectInfo.left() : connectorRectInfo.nodeRectInfo.right();
/** @type {?} */ /** @type {?} */
var canvasElementBox = canvas.getBoundingClientRect(); var y = connectorRectInfo.nodeRectInfo.top() + connectorRectInfo.nodeRectInfo.height() / 2;
if (!centered) {
x -= connectorRectInfo.width / 2;
y -= connectorRectInfo.height / 2;
}
/** @type {?} */ /** @type {?} */
var coords = { var coords = {
x: connectorElementBox.left - canvasElementBox.left, x: Math.round(x),
y: connectorElementBox.top - canvasElementBox.top y: Math.round(y)
}; };
if (centered) {
coords = {
x: Math.round(coords.x + element.offsetWidth / 2),
y: Math.round(coords.y + element.offsetHeight / 2)
};
}
return coords; return coords;
}; };
/** /**
@ -1229,21 +1276,6 @@ var EdgesModel = /** @class */ (function (_super) {
function EdgesModel(modelService) { function EdgesModel(modelService) {
return _super.call(this, modelService) || this; return _super.call(this, modelService) || this;
} }
/**
* @param {?} edge
* @return {?}
*/
EdgesModel.prototype.ready = /**
* @param {?} edge
* @return {?}
*/
function (edge) {
/** @type {?} */
var source = this.modelService.connectors.getHtmlElement(edge.source);
/** @type {?} */
var destination = this.modelService.connectors.getHtmlElement(edge.destination);
return source !== undefined && destination !== undefined;
};
/** /**
* @param {?} edge * @param {?} edge
* @return {?} * @return {?}
@ -3766,7 +3798,14 @@ var FcConnectorDirective = /** @class */ (function () {
element.attr('draggable', 'true'); element.attr('draggable', 'true');
this.updateConnectorClass(); this.updateConnectorClass();
} }
this.modelservice.connectors.setHtmlElement(this.connector.id, element[0]); /** @type {?} */
var connectorRectInfo = {
type: this.connector.type,
width: this.elementRef.nativeElement.offsetWidth,
height: this.elementRef.nativeElement.offsetHeight,
nodeRectInfo: this.nodeRectInfo
};
this.modelservice.connectors.setConnectorRectInfo(this.connector.id, connectorRectInfo);
}; };
/** /**
* @param {?} changes * @param {?} changes
@ -3914,6 +3953,7 @@ var FcConnectorDirective = /** @class */ (function () {
callbacks: [{ type: Input }], callbacks: [{ type: Input }],
modelservice: [{ type: Input }], modelservice: [{ type: Input }],
connector: [{ type: Input }], connector: [{ type: Input }],
nodeRectInfo: [{ type: Input }],
mouseOverConnector: [{ type: Input }], mouseOverConnector: [{ type: Input }],
dragover: [{ type: HostListener, args: ['dragover', ['$event'],] }], dragover: [{ type: HostListener, args: ['dragover', ['$event'],] }],
drop: [{ type: HostListener, args: ['drop', ['$event'],] }], drop: [{ type: HostListener, args: ['drop', ['$event'],] }],
@ -3932,6 +3972,8 @@ if (false) {
/** @type {?} */ /** @type {?} */
FcConnectorDirective.prototype.connector; FcConnectorDirective.prototype.connector;
/** @type {?} */ /** @type {?} */
FcConnectorDirective.prototype.nodeRectInfo;
/** @type {?} */
FcConnectorDirective.prototype.mouseOverConnector; FcConnectorDirective.prototype.mouseOverConnector;
/** @type {?} */ /** @type {?} */
FcConnectorDirective.prototype.elementRef; FcConnectorDirective.prototype.elementRef;
@ -4026,6 +4068,18 @@ var FcNodeContainerComponent = /** @class */ (function () {
this.nodeComponent.node = this.node; this.nodeComponent.node = this.node;
this.nodeComponent.modelservice = this.modelservice; this.nodeComponent.modelservice = this.modelservice;
this.updateNodeComponent(); this.updateNodeComponent();
this.nodeComponent.width = this.elementRef.nativeElement.offsetWidth;
this.nodeComponent.height = this.elementRef.nativeElement.offsetHeight;
};
/**
* @return {?}
*/
FcNodeContainerComponent.prototype.ngAfterViewInit = /**
* @return {?}
*/
function () {
this.nodeComponent.width = this.elementRef.nativeElement.offsetWidth;
this.nodeComponent.height = this.elementRef.nativeElement.offsetHeight;
}; };
/** /**
* @param {?} changes * @param {?} changes
@ -4272,7 +4326,46 @@ if (false) {
*/ */
var FcNodeComponent = /** @class */ (function () { var FcNodeComponent = /** @class */ (function () {
function FcNodeComponent() { function FcNodeComponent() {
var _this = this;
this.flowchartConstants = FlowchartConstants; this.flowchartConstants = FlowchartConstants;
this.nodeRectInfo = {
top: (/**
* @return {?}
*/
function () {
return _this.node.y;
}),
left: (/**
* @return {?}
*/
function () {
return _this.node.x;
}),
bottom: (/**
* @return {?}
*/
function () {
return _this.node.y + _this.height;
}),
right: (/**
* @return {?}
*/
function () {
return _this.node.x + _this.width;
}),
width: (/**
* @return {?}
*/
function () {
return _this.width;
}),
height: (/**
* @return {?}
*/
function () {
return _this.height;
})
};
} }
/** /**
* @return {?} * @return {?}
@ -4316,6 +4409,12 @@ if (false) {
FcNodeComponent.prototype.dragging; FcNodeComponent.prototype.dragging;
/** @type {?} */ /** @type {?} */
FcNodeComponent.prototype.flowchartConstants; FcNodeComponent.prototype.flowchartConstants;
/** @type {?} */
FcNodeComponent.prototype.width;
/** @type {?} */
FcNodeComponent.prototype.height;
/** @type {?} */
FcNodeComponent.prototype.nodeRectInfo;
} }
/** /**
@ -4330,7 +4429,7 @@ var DefaultFcNodeComponent = /** @class */ (function (_super) {
DefaultFcNodeComponent.decorators = [ DefaultFcNodeComponent.decorators = [
{ type: Component, args: [{ { type: Component, args: [{
selector: 'fc-default-node', selector: 'fc-default-node',
template: "<div\n (dblclick)=\"userNodeCallbacks.doubleClick($event, node)\">\n <div class=\"{{flowchartConstants.nodeOverlayClass}}\"></div>\n <div class=\"innerNode\">\n <p>{{ node.name }}</p>\n\n <div class=\"{{flowchartConstants.leftConnectorClass}}\">\n <div fc-magnet [connector]=\"connector\" [callbacks]=\"callbacks\"\n *ngFor=\"let connector of modelservice.nodes.getConnectorsByType(node, flowchartConstants.leftConnectorType)\">\n <div fc-connector [connector]=\"connector\"\n [mouseOverConnector]=\"mouseOverConnector\"\n [callbacks]=\"callbacks\"\n [modelservice]=\"modelservice\"></div>\n </div>\n </div>\n <div class=\"{{flowchartConstants.rightConnectorClass}}\">\n <div fc-magnet [connector]=\"connector\" [callbacks]=\"callbacks\"\n *ngFor=\"let connector of modelservice.nodes.getConnectorsByType(node, flowchartConstants.rightConnectorType)\">\n <div fc-connector [connector]=\"connector\"\n [mouseOverConnector]=\"mouseOverConnector\"\n [callbacks]=\"callbacks\"\n [modelservice]=\"modelservice\"></div>\n </div>\n </div>\n </div>\n <div *ngIf=\"modelservice.isEditable() && !node.readonly\" class=\"fc-nodeedit\" (click)=\"userNodeCallbacks.nodeEdit($event, node)\">\n <i class=\"fa fa-pencil\" aria-hidden=\"true\"></i>\n </div>\n <div *ngIf=\"modelservice.isEditable() && !node.readonly\" class=\"fc-nodedelete\" (click)=\"modelservice.nodes.delete(node)\">\n &times;\n </div>\n</div>\n", template: "<div\n (dblclick)=\"userNodeCallbacks.doubleClick($event, node)\">\n <div class=\"{{flowchartConstants.nodeOverlayClass}}\"></div>\n <div class=\"innerNode\">\n <p>{{ node.name }}</p>\n\n <div class=\"{{flowchartConstants.leftConnectorClass}}\">\n <div fc-magnet [connector]=\"connector\" [callbacks]=\"callbacks\"\n *ngFor=\"let connector of modelservice.nodes.getConnectorsByType(node, flowchartConstants.leftConnectorType)\">\n <div fc-connector [connector]=\"connector\"\n [nodeRectInfo]=\"nodeRectInfo\"\n [mouseOverConnector]=\"mouseOverConnector\"\n [callbacks]=\"callbacks\"\n [modelservice]=\"modelservice\"></div>\n </div>\n </div>\n <div class=\"{{flowchartConstants.rightConnectorClass}}\">\n <div fc-magnet [connector]=\"connector\" [callbacks]=\"callbacks\"\n *ngFor=\"let connector of modelservice.nodes.getConnectorsByType(node, flowchartConstants.rightConnectorType)\">\n <div fc-connector [connector]=\"connector\"\n [nodeRectInfo]=\"nodeRectInfo\"\n [mouseOverConnector]=\"mouseOverConnector\"\n [callbacks]=\"callbacks\"\n [modelservice]=\"modelservice\"></div>\n </div>\n </div>\n </div>\n <div *ngIf=\"modelservice.isEditable() && !node.readonly\" class=\"fc-nodeedit\" (click)=\"userNodeCallbacks.nodeEdit($event, node)\">\n <i class=\"fa fa-pencil\" aria-hidden=\"true\"></i>\n </div>\n <div *ngIf=\"modelservice.isEditable() && !node.readonly\" class=\"fc-nodedelete\" (click)=\"modelservice.nodes.delete(node)\">\n &times;\n </div>\n</div>\n",
styles: [":host .fc-node-overlay{position:absolute;pointer-events:none;left:0;top:0;right:0;bottom:0;background-color:#000;opacity:0}:host :host-context(.fc-hover) .fc-node-overlay{opacity:.25;transition:opacity .2s}:host :host-context(.fc-selected) .fc-node-overlay{opacity:.25}:host .innerNode{display:flex;justify-content:center;align-items:center;min-width:100px;border-radius:5px;background-color:#f15b26;color:#fff;font-size:16px;pointer-events:none}:host .innerNode p{padding:0 15px;text-align:center}"] styles: [":host .fc-node-overlay{position:absolute;pointer-events:none;left:0;top:0;right:0;bottom:0;background-color:#000;opacity:0}:host :host-context(.fc-hover) .fc-node-overlay{opacity:.25;transition:opacity .2s}:host :host-context(.fc-selected) .fc-node-overlay{opacity:.25}:host .innerNode{display:flex;justify-content:center;align-items:center;min-width:100px;border-radius:5px;background-color:#f15b26;color:#fff;font-size:16px;pointer-events:none}:host .innerNode p{padding:0 15px;text-align:center}"]
}] } }] }
]; ];

File diff suppressed because one or more lines are too long

@ -1,11 +1,12 @@
import { ElementRef, OnChanges, OnInit, SimpleChanges } from '@angular/core'; import { ElementRef, OnChanges, OnInit, SimpleChanges } from '@angular/core';
import { FcCallbacks, FcConnector } from './ngx-flowchart.models'; import { FcCallbacks, FcConnector, FcNodeRectInfo } from './ngx-flowchart.models';
import { FcModelService } from './model.service'; import { FcModelService } from './model.service';
export declare class FcConnectorDirective implements OnInit, OnChanges { export declare class FcConnectorDirective implements OnInit, OnChanges {
elementRef: ElementRef<HTMLElement>; elementRef: ElementRef<HTMLElement>;
callbacks: FcCallbacks; callbacks: FcCallbacks;
modelservice: FcModelService; modelservice: FcModelService;
connector: FcConnector; connector: FcConnector;
nodeRectInfo: FcNodeRectInfo;
mouseOverConnector: FcConnector; mouseOverConnector: FcConnector;
constructor(elementRef: ElementRef<HTMLElement>); constructor(elementRef: ElementRef<HTMLElement>);
ngOnInit(): void; ngOnInit(): void;

@ -1,5 +1,5 @@
import { FcModelValidationService } from './modelvalidation.service'; import { FcModelValidationService } from './modelvalidation.service';
import { FcConnector, FcCoords, FcEdge, FcItemInfo, FcModel, FcNode, FcRectBox } from './ngx-flowchart.models'; import { FcConnector, FcConnectorRectInfo, FcCoords, FcEdge, FcItemInfo, FcModel, FcNode, FcRectBox } from './ngx-flowchart.models';
import { Observable, Subject } from 'rxjs'; import { Observable, Subject } from 'rxjs';
import { EventEmitter } from '@angular/core'; import { EventEmitter } from '@angular/core';
export declare class FcModelService { export declare class FcModelService {
@ -7,7 +7,7 @@ export declare class FcModelService {
model: FcModel; model: FcModel;
private readonly detectChangesSubject; private readonly detectChangesSubject;
selectedObjects: any[]; selectedObjects: any[];
connectorsHtmlElements: HtmlElementMap; connectorsRectInfos: ConnectorRectInfoMap;
nodesHtmlElements: HtmlElementMap; nodesHtmlElements: HtmlElementMap;
canvasHtmlElement: HTMLElement; canvasHtmlElement: HTMLElement;
dragImage: HTMLImageElement; dragImage: HTMLImageElement;
@ -46,6 +46,9 @@ export declare class FcModelService {
interface HtmlElementMap { interface HtmlElementMap {
[id: string]: HTMLElement; [id: string]: HTMLElement;
} }
interface ConnectorRectInfoMap {
[id: string]: FcConnectorRectInfo;
}
declare abstract class AbstractFcModel<T> { declare abstract class AbstractFcModel<T> {
modelService: FcModelService; modelService: FcModelService;
protected constructor(modelService: FcModelService); protected constructor(modelService: FcModelService);
@ -58,8 +61,8 @@ declare abstract class AbstractFcModel<T> {
declare class ConnectorsModel extends AbstractFcModel<FcConnector> { declare class ConnectorsModel extends AbstractFcModel<FcConnector> {
constructor(modelService: FcModelService); constructor(modelService: FcModelService);
getConnector(connectorId: string): FcConnector; getConnector(connectorId: string): FcConnector;
getHtmlElement(connectorId: string): HTMLElement; getConnectorRectInfo(connectorId: string): FcConnectorRectInfo;
setHtmlElement(connectorId: string, element: HTMLElement): void; setConnectorRectInfo(connectorId: string, connectorRectInfo: FcConnectorRectInfo): void;
private _getCoords; private _getCoords;
getCoords(connectorId: string): FcCoords; getCoords(connectorId: string): FcCoords;
getCenteredCoord(connectorId: string): FcCoords; getCenteredCoord(connectorId: string): FcCoords;
@ -79,7 +82,6 @@ declare class NodesModel extends AbstractFcModel<FcNode> {
} }
declare class EdgesModel extends AbstractFcModel<FcEdge> { declare class EdgesModel extends AbstractFcModel<FcEdge> {
constructor(modelService: FcModelService); constructor(modelService: FcModelService);
ready(edge: FcEdge): boolean;
sourceCoord(edge: FcEdge): FcCoords; sourceCoord(edge: FcEdge): FcCoords;
destCoord(edge: FcEdge): FcCoords; destCoord(edge: FcEdge): FcCoords;
delete(edge: FcEdge): void; delete(edge: FcEdge): void;

@ -51,6 +51,20 @@ export interface FcNode extends FcCoords {
readonly?: boolean; readonly?: boolean;
[key: string]: any; [key: string]: any;
} }
export interface FcNodeRectInfo {
width(): number;
height(): number;
top(): number;
left(): number;
right(): number;
bottom(): number;
}
export interface FcConnectorRectInfo {
type: string;
width: number;
height: number;
nodeRectInfo: FcNodeRectInfo;
}
export interface FcEdge { export interface FcEdge {
label?: string; label?: string;
source?: string; source?: string;

@ -1,7 +1,7 @@
import { ComponentFactoryResolver, ElementRef, OnChanges, OnInit, SimpleChanges, ViewContainerRef } from '@angular/core'; import { AfterViewInit, ComponentFactoryResolver, ElementRef, OnChanges, OnInit, SimpleChanges, ViewContainerRef } from '@angular/core';
import { FcCallbacks, FcConnector, FcNode, FcNodeComponentConfig, UserNodeCallbacks } from './ngx-flowchart.models'; import { FcCallbacks, FcConnector, FcNode, FcNodeComponentConfig, FcNodeRectInfo, UserNodeCallbacks } from './ngx-flowchart.models';
import { FcModelService } from './model.service'; import { FcModelService } from './model.service';
export declare class FcNodeContainerComponent implements OnInit, OnChanges { export declare class FcNodeContainerComponent implements OnInit, AfterViewInit, OnChanges {
private nodeComponentConfig; private nodeComponentConfig;
private elementRef; private elementRef;
private componentFactoryResolver; private componentFactoryResolver;
@ -21,6 +21,7 @@ export declare class FcNodeContainerComponent implements OnInit, OnChanges {
nodeContentContainer: ViewContainerRef; nodeContentContainer: ViewContainerRef;
constructor(nodeComponentConfig: FcNodeComponentConfig, elementRef: ElementRef<HTMLElement>, componentFactoryResolver: ComponentFactoryResolver); constructor(nodeComponentConfig: FcNodeComponentConfig, elementRef: ElementRef<HTMLElement>, componentFactoryResolver: ComponentFactoryResolver);
ngOnInit(): void; ngOnInit(): void;
ngAfterViewInit(): void;
ngOnChanges(changes: SimpleChanges): void; ngOnChanges(changes: SimpleChanges): void;
private updateNodeClass; private updateNodeClass;
private updateNodeComponent; private updateNodeComponent;
@ -67,5 +68,8 @@ export declare abstract class FcNodeComponent implements OnInit {
canvasResizeThreshold: number; canvasResizeThreshold: number;
canvasResizeStep: number; canvasResizeStep: number;
}; };
width: number;
height: number;
nodeRectInfo: FcNodeRectInfo;
ngOnInit(): void; ngOnInit(): void;
} }

File diff suppressed because one or more lines are too long

@ -1,5 +1,5 @@
import { Directive, ElementRef, HostListener, Input, OnChanges, OnInit, SimpleChanges } from '@angular/core'; import { AfterViewInit, Directive, ElementRef, HostListener, Input, OnChanges, OnInit, SimpleChanges } from '@angular/core';
import { FcCallbacks, FcConnector, FlowchartConstants } from './ngx-flowchart.models'; import { FcCallbacks, FcConnector, FcConnectorRectInfo, FcNodeRectInfo, FlowchartConstants } from './ngx-flowchart.models';
import { FcModelService } from './model.service'; import { FcModelService } from './model.service';
@Directive({ @Directive({
@ -17,6 +17,9 @@ export class FcConnectorDirective implements OnInit, OnChanges {
@Input() @Input()
connector: FcConnector; connector: FcConnector;
@Input()
nodeRectInfo: FcNodeRectInfo;
@Input() @Input()
mouseOverConnector: FcConnector; mouseOverConnector: FcConnector;
@ -30,7 +33,13 @@ export class FcConnectorDirective implements OnInit, OnChanges {
element.attr('draggable', 'true'); element.attr('draggable', 'true');
this.updateConnectorClass(); this.updateConnectorClass();
} }
this.modelservice.connectors.setHtmlElement(this.connector.id, element[0]); const connectorRectInfo: FcConnectorRectInfo = {
type: this.connector.type,
width: this.elementRef.nativeElement.offsetWidth,
height: this.elementRef.nativeElement.offsetHeight,
nodeRectInfo: this.nodeRectInfo
};
this.modelservice.connectors.setConnectorRectInfo(this.connector.id, connectorRectInfo);
} }
ngOnChanges(changes: SimpleChanges): void { ngOnChanges(changes: SimpleChanges): void {

@ -8,6 +8,7 @@
<div fc-magnet [connector]="connector" [callbacks]="callbacks" <div fc-magnet [connector]="connector" [callbacks]="callbacks"
*ngFor="let connector of modelservice.nodes.getConnectorsByType(node, flowchartConstants.leftConnectorType)"> *ngFor="let connector of modelservice.nodes.getConnectorsByType(node, flowchartConstants.leftConnectorType)">
<div fc-connector [connector]="connector" <div fc-connector [connector]="connector"
[nodeRectInfo]="nodeRectInfo"
[mouseOverConnector]="mouseOverConnector" [mouseOverConnector]="mouseOverConnector"
[callbacks]="callbacks" [callbacks]="callbacks"
[modelservice]="modelservice"></div> [modelservice]="modelservice"></div>
@ -17,6 +18,7 @@
<div fc-magnet [connector]="connector" [callbacks]="callbacks" <div fc-magnet [connector]="connector" [callbacks]="callbacks"
*ngFor="let connector of modelservice.nodes.getConnectorsByType(node, flowchartConstants.rightConnectorType)"> *ngFor="let connector of modelservice.nodes.getConnectorsByType(node, flowchartConstants.rightConnectorType)">
<div fc-connector [connector]="connector" <div fc-connector [connector]="connector"
[nodeRectInfo]="nodeRectInfo"
[mouseOverConnector]="mouseOverConnector" [mouseOverConnector]="mouseOverConnector"
[callbacks]="callbacks" [callbacks]="callbacks"
[modelservice]="modelservice"></div> [modelservice]="modelservice"></div>

@ -1,5 +1,15 @@
import { FcModelValidationService } from './modelvalidation.service'; import { FcModelValidationService } from './modelvalidation.service';
import { FcConnector, FcCoords, FcEdge, FcItemInfo, FcModel, FcNode, FcRectBox } from './ngx-flowchart.models'; import {
FcConnector,
FcConnectorRectInfo,
FcCoords,
FcEdge,
FcItemInfo,
FcModel,
FcNode,
FcRectBox,
FlowchartConstants
} from './ngx-flowchart.models';
import { Observable, of, Subject } from 'rxjs'; import { Observable, of, Subject } from 'rxjs';
import { ChangeDetectorRef, EventEmitter } from '@angular/core'; import { ChangeDetectorRef, EventEmitter } from '@angular/core';
import { debounceTime } from 'rxjs/operators'; import { debounceTime } from 'rxjs/operators';
@ -11,7 +21,7 @@ export class FcModelService {
private readonly detectChangesSubject: Subject<any>; private readonly detectChangesSubject: Subject<any>;
selectedObjects: any[]; selectedObjects: any[];
connectorsHtmlElements: HtmlElementMap = {}; connectorsRectInfos: ConnectorRectInfoMap = {};
nodesHtmlElements: HtmlElementMap = {}; nodesHtmlElements: HtmlElementMap = {};
canvasHtmlElement: HTMLElement = null; canvasHtmlElement: HTMLElement = null;
dragImage: HTMLImageElement = null; dragImage: HTMLImageElement = null;
@ -235,6 +245,8 @@ export class FcModelService {
interface HtmlElementMap { [id: string]: HTMLElement; } interface HtmlElementMap { [id: string]: HTMLElement; }
interface ConnectorRectInfoMap { [id: string]: FcConnectorRectInfo; }
abstract class AbstractFcModel<T> { abstract class AbstractFcModel<T> {
modelService: FcModelService; modelService: FcModelService;
@ -281,33 +293,32 @@ class ConnectorsModel extends AbstractFcModel<FcConnector> {
} }
} }
public getHtmlElement(connectorId: string): HTMLElement { public getConnectorRectInfo(connectorId: string): FcConnectorRectInfo {
return this.modelService.connectorsHtmlElements[connectorId]; return this.modelService.connectorsRectInfos[connectorId];
} }
public setHtmlElement(connectorId: string, element: HTMLElement) { public setConnectorRectInfo(connectorId: string, connectorRectInfo: FcConnectorRectInfo) {
this.modelService.connectorsHtmlElements[connectorId] = element; this.modelService.connectorsRectInfos[connectorId] = connectorRectInfo;
this.modelService.detectChanges(); this.modelService.detectChanges();
} }
private _getCoords(connectorId: string, centered?: boolean): FcCoords { private _getCoords(connectorId: string, centered?: boolean): FcCoords {
const element = this.getHtmlElement(connectorId); const connectorRectInfo = this.getConnectorRectInfo(connectorId);
const canvas = this.modelService.canvasHtmlElement; const canvas = this.modelService.canvasHtmlElement;
if (element === null || element === undefined || canvas === null) { if (connectorRectInfo === null || connectorRectInfo === undefined || canvas === null) {
return {x: 0, y: 0}; return {x: 0, y: 0};
} }
const connectorElementBox = element.getBoundingClientRect(); let x = connectorRectInfo.type === FlowchartConstants.leftConnectorType ?
const canvasElementBox = canvas.getBoundingClientRect(); connectorRectInfo.nodeRectInfo.left() : connectorRectInfo.nodeRectInfo.right();
let coords: FcCoords = { let y = connectorRectInfo.nodeRectInfo.top() + connectorRectInfo.nodeRectInfo.height() / 2;
x: connectorElementBox.left - canvasElementBox.left, if (!centered) {
y: connectorElementBox.top - canvasElementBox.top x -= connectorRectInfo.width / 2;
}; y -= connectorRectInfo.height / 2;
if (centered) {
coords = {
x: Math.round(coords.x + element.offsetWidth / 2),
y: Math.round(coords.y + element.offsetHeight / 2)
};
} }
const coords: FcCoords = {
x: Math.round(x),
y: Math.round(y)
};
return coords; return coords;
} }
@ -428,12 +439,6 @@ class EdgesModel extends AbstractFcModel<FcEdge> {
super(modelService); super(modelService);
} }
public ready(edge: FcEdge): boolean {
const source = this.modelService.connectors.getHtmlElement(edge.source);
const destination = this.modelService.connectors.getHtmlElement(edge.destination);
return source !== undefined && destination !== undefined;
}
public sourceCoord(edge: FcEdge): FcCoords { public sourceCoord(edge: FcEdge): FcCoords {
return this.modelService.connectors.getCenteredCoord(edge.source); return this.modelService.connectors.getCenteredCoord(edge.source);
} }

@ -64,6 +64,22 @@ export interface FcNode extends FcCoords {
[key: string]: any; [key: string]: any;
} }
export interface FcNodeRectInfo {
width(): number;
height(): number;
top(): number;
left(): number;
right(): number;
bottom(): number;
}
export interface FcConnectorRectInfo {
type: string;
width: number;
height: number;
nodeRectInfo: FcNodeRectInfo;
}
export interface FcEdge { export interface FcEdge {
label?: string; label?: string;
source?: string; source?: string;

@ -1,4 +1,5 @@
import { import {
AfterViewInit,
Component, Component,
ComponentFactoryResolver, Directive, ComponentFactoryResolver, Directive,
ElementRef, HostBinding, ElementRef, HostBinding,
@ -16,7 +17,7 @@ import {
FcCallbacks, FcCallbacks,
FcConnector, FcConnector,
FcNode, FcNode,
FcNodeComponentConfig, FcNodeComponentConfig, FcNodeRectInfo,
FlowchartConstants, FlowchartConstants,
UserNodeCallbacks UserNodeCallbacks
} from './ngx-flowchart.models'; } from './ngx-flowchart.models';
@ -27,7 +28,7 @@ import { FcModelService } from './model.service';
template: '<ng-template #nodeContent></ng-template>', template: '<ng-template #nodeContent></ng-template>',
styleUrls: ['./node.component.scss'] styleUrls: ['./node.component.scss']
}) })
export class FcNodeContainerComponent implements OnInit, OnChanges { export class FcNodeContainerComponent implements OnInit, AfterViewInit, OnChanges {
@Input() @Input()
callbacks: FcCallbacks; callbacks: FcCallbacks;
@ -106,6 +107,13 @@ export class FcNodeContainerComponent implements OnInit, OnChanges {
this.nodeComponent.node = this.node; this.nodeComponent.node = this.node;
this.nodeComponent.modelservice = this.modelservice; this.nodeComponent.modelservice = this.modelservice;
this.updateNodeComponent(); this.updateNodeComponent();
this.nodeComponent.width = this.elementRef.nativeElement.offsetWidth;
this.nodeComponent.height = this.elementRef.nativeElement.offsetHeight;
}
ngAfterViewInit(): void {
this.nodeComponent.width = this.elementRef.nativeElement.offsetWidth;
this.nodeComponent.height = this.elementRef.nativeElement.offsetHeight;
} }
ngOnChanges(changes: SimpleChanges): void { ngOnChanges(changes: SimpleChanges): void {
@ -221,6 +229,36 @@ export abstract class FcNodeComponent implements OnInit {
flowchartConstants = FlowchartConstants; flowchartConstants = FlowchartConstants;
width: number;
height: number;
nodeRectInfo: FcNodeRectInfo = {
top: () => {
return this.node.y;
},
left: () => {
return this.node.x;
},
bottom: () => {
return this.node.y + this.height;
},
right: () => {
return this.node.x + this.width;
},
width: () => {
return this.width;
},
height: () => {
return this.height;
}
};
ngOnInit(): void { ngOnInit(): void {
} }

Loading…
Cancel
Save