orcasvn-react-diagrams 0.1.72 → 0.1.74
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/index.js +119 -122
- package/dist/esm/index.js +119 -122
- package/dist/esm/index.js.map +1 -1
- package/package.json +1 -1
package/dist/cjs/index.js
CHANGED
|
@@ -1351,65 +1351,6 @@ var PORT_PLACEHOLDER_DEFAULT_STROKE = 'green';
|
|
|
1351
1351
|
var PORT_PLACEHOLDER_DEFAULT_STROKE_WIDTH = 20;
|
|
1352
1352
|
var PORT_DEFAULT_SIZE = 20;
|
|
1353
1353
|
|
|
1354
|
-
var Logger = /** @class */ (function () {
|
|
1355
|
-
function Logger() {
|
|
1356
|
-
this.level = 'info';
|
|
1357
|
-
this.customLogger = null;
|
|
1358
|
-
}
|
|
1359
|
-
Logger.prototype.setLevel = function (level) {
|
|
1360
|
-
this.level = level;
|
|
1361
|
-
};
|
|
1362
|
-
Logger.prototype.setCustomLogger = function (logger) {
|
|
1363
|
-
this.customLogger = logger;
|
|
1364
|
-
};
|
|
1365
|
-
Logger.prototype.log = function (level, message) {
|
|
1366
|
-
var _a;
|
|
1367
|
-
var optionalParams = [];
|
|
1368
|
-
for (var _i = 2; _i < arguments.length; _i++) {
|
|
1369
|
-
optionalParams[_i - 2] = arguments[_i];
|
|
1370
|
-
}
|
|
1371
|
-
var levels = ['error', 'warn', 'info', 'debug'];
|
|
1372
|
-
if (this.level && levels.indexOf(level) <= levels.indexOf(this.level)) {
|
|
1373
|
-
if (this.customLogger) {
|
|
1374
|
-
this.customLogger.apply(this, __spreadArray([level, message], optionalParams, false));
|
|
1375
|
-
}
|
|
1376
|
-
else {
|
|
1377
|
-
console[level] ? (_a = console)[level].apply(_a, __spreadArray([message], optionalParams, false)) : console.log.apply(console, __spreadArray([message], optionalParams, false));
|
|
1378
|
-
}
|
|
1379
|
-
}
|
|
1380
|
-
};
|
|
1381
|
-
Logger.prototype.error = function (msg) {
|
|
1382
|
-
var optionalParams = [];
|
|
1383
|
-
for (var _i = 1; _i < arguments.length; _i++) {
|
|
1384
|
-
optionalParams[_i - 1] = arguments[_i];
|
|
1385
|
-
}
|
|
1386
|
-
this.log.apply(this, __spreadArray(['error', msg], optionalParams, false));
|
|
1387
|
-
};
|
|
1388
|
-
Logger.prototype.warn = function (msg) {
|
|
1389
|
-
var optionalParams = [];
|
|
1390
|
-
for (var _i = 1; _i < arguments.length; _i++) {
|
|
1391
|
-
optionalParams[_i - 1] = arguments[_i];
|
|
1392
|
-
}
|
|
1393
|
-
this.log.apply(this, __spreadArray(['warn', msg], optionalParams, false));
|
|
1394
|
-
};
|
|
1395
|
-
Logger.prototype.info = function (msg) {
|
|
1396
|
-
var optionalParams = [];
|
|
1397
|
-
for (var _i = 1; _i < arguments.length; _i++) {
|
|
1398
|
-
optionalParams[_i - 1] = arguments[_i];
|
|
1399
|
-
}
|
|
1400
|
-
this.log.apply(this, __spreadArray(['info', msg], optionalParams, false));
|
|
1401
|
-
};
|
|
1402
|
-
Logger.prototype.debug = function (msg) {
|
|
1403
|
-
var optionalParams = [];
|
|
1404
|
-
for (var _i = 1; _i < arguments.length; _i++) {
|
|
1405
|
-
optionalParams[_i - 1] = arguments[_i];
|
|
1406
|
-
}
|
|
1407
|
-
this.log.apply(this, __spreadArray(['debug', msg], optionalParams, false));
|
|
1408
|
-
};
|
|
1409
|
-
return Logger;
|
|
1410
|
-
}());
|
|
1411
|
-
var logger = new Logger();
|
|
1412
|
-
|
|
1413
1354
|
/**
|
|
1414
1355
|
* Created by Alex Bol on 2/18/2017.
|
|
1415
1356
|
*/
|
|
@@ -7211,6 +7152,65 @@ var getElementRotationInfo = function (element) {
|
|
|
7211
7152
|
return rotationAngle;
|
|
7212
7153
|
};
|
|
7213
7154
|
|
|
7155
|
+
var Logger = /** @class */ (function () {
|
|
7156
|
+
function Logger() {
|
|
7157
|
+
this.level = 'info';
|
|
7158
|
+
this.customLogger = null;
|
|
7159
|
+
}
|
|
7160
|
+
Logger.prototype.setLevel = function (level) {
|
|
7161
|
+
this.level = level;
|
|
7162
|
+
};
|
|
7163
|
+
Logger.prototype.setCustomLogger = function (logger) {
|
|
7164
|
+
this.customLogger = logger;
|
|
7165
|
+
};
|
|
7166
|
+
Logger.prototype.log = function (level, message) {
|
|
7167
|
+
var _a;
|
|
7168
|
+
var optionalParams = [];
|
|
7169
|
+
for (var _i = 2; _i < arguments.length; _i++) {
|
|
7170
|
+
optionalParams[_i - 2] = arguments[_i];
|
|
7171
|
+
}
|
|
7172
|
+
var levels = ['error', 'warn', 'info', 'debug'];
|
|
7173
|
+
if (this.level && levels.indexOf(level) <= levels.indexOf(this.level)) {
|
|
7174
|
+
if (this.customLogger) {
|
|
7175
|
+
this.customLogger.apply(this, __spreadArray([level, message], optionalParams, false));
|
|
7176
|
+
}
|
|
7177
|
+
else {
|
|
7178
|
+
console[level] ? (_a = console)[level].apply(_a, __spreadArray([message], optionalParams, false)) : console.log.apply(console, __spreadArray([message], optionalParams, false));
|
|
7179
|
+
}
|
|
7180
|
+
}
|
|
7181
|
+
};
|
|
7182
|
+
Logger.prototype.error = function (msg) {
|
|
7183
|
+
var optionalParams = [];
|
|
7184
|
+
for (var _i = 1; _i < arguments.length; _i++) {
|
|
7185
|
+
optionalParams[_i - 1] = arguments[_i];
|
|
7186
|
+
}
|
|
7187
|
+
this.log.apply(this, __spreadArray(['error', msg], optionalParams, false));
|
|
7188
|
+
};
|
|
7189
|
+
Logger.prototype.warn = function (msg) {
|
|
7190
|
+
var optionalParams = [];
|
|
7191
|
+
for (var _i = 1; _i < arguments.length; _i++) {
|
|
7192
|
+
optionalParams[_i - 1] = arguments[_i];
|
|
7193
|
+
}
|
|
7194
|
+
this.log.apply(this, __spreadArray(['warn', msg], optionalParams, false));
|
|
7195
|
+
};
|
|
7196
|
+
Logger.prototype.info = function (msg) {
|
|
7197
|
+
var optionalParams = [];
|
|
7198
|
+
for (var _i = 1; _i < arguments.length; _i++) {
|
|
7199
|
+
optionalParams[_i - 1] = arguments[_i];
|
|
7200
|
+
}
|
|
7201
|
+
this.log.apply(this, __spreadArray(['info', msg], optionalParams, false));
|
|
7202
|
+
};
|
|
7203
|
+
Logger.prototype.debug = function (msg) {
|
|
7204
|
+
var optionalParams = [];
|
|
7205
|
+
for (var _i = 1; _i < arguments.length; _i++) {
|
|
7206
|
+
optionalParams[_i - 1] = arguments[_i];
|
|
7207
|
+
}
|
|
7208
|
+
this.log.apply(this, __spreadArray(['debug', msg], optionalParams, false));
|
|
7209
|
+
};
|
|
7210
|
+
return Logger;
|
|
7211
|
+
}());
|
|
7212
|
+
var logger = new Logger();
|
|
7213
|
+
|
|
7214
7214
|
/**
|
|
7215
7215
|
* Check if position 1 is within the radius r of position 2
|
|
7216
7216
|
* @returns boolean
|
|
@@ -7870,14 +7870,14 @@ var SelectionFrame = function (props) {
|
|
|
7870
7870
|
}
|
|
7871
7871
|
};
|
|
7872
7872
|
React.useEffect(function () {
|
|
7873
|
-
logger.debug('SelectionFrame: circleHandleMouseDown triggered', {
|
|
7874
|
-
|
|
7875
|
-
|
|
7876
|
-
|
|
7877
|
-
|
|
7878
|
-
|
|
7879
|
-
|
|
7880
|
-
});
|
|
7873
|
+
// logger.debug('SelectionFrame: circleHandleMouseDown triggered', {
|
|
7874
|
+
// draggingCircle,
|
|
7875
|
+
// startX,
|
|
7876
|
+
// startY,
|
|
7877
|
+
// width,
|
|
7878
|
+
// height,
|
|
7879
|
+
// propMovingRate
|
|
7880
|
+
// });
|
|
7881
7881
|
var circleHandleMouseMove = function (event) {
|
|
7882
7882
|
var mouseEvent = event;
|
|
7883
7883
|
if (draggingCircle) {
|
|
@@ -7925,12 +7925,12 @@ var SelectionFrame = function (props) {
|
|
|
7925
7925
|
container.addEventListener('mousemove', circleHandleMouseMove);
|
|
7926
7926
|
container.addEventListener('mouseup', circleHandleMouseUp);
|
|
7927
7927
|
//logging the start of the circle handle mouse move
|
|
7928
|
-
logger.debug('SelectionFrame: circleHandleMouseMove started', container);
|
|
7928
|
+
//logger.debug('SelectionFrame: circleHandleMouseMove started', container);
|
|
7929
7929
|
return function () {
|
|
7930
7930
|
container.removeEventListener('mousemove', circleHandleMouseMove);
|
|
7931
7931
|
container.removeEventListener('mouseup', circleHandleMouseUp);
|
|
7932
7932
|
//logging the end of the circle handle mouse move
|
|
7933
|
-
logger.debug('SelectionFrame: circleHandleMouseMove ended', container);
|
|
7933
|
+
//logger.debug('SelectionFrame: circleHandleMouseMove ended', container);
|
|
7934
7934
|
};
|
|
7935
7935
|
}, [draggingCircle, width, height, objectX, objectY, lastMoveTime, propContainer, getMousePosition, propMovingRate, propOnResize, propResizability, startX, startY]);
|
|
7936
7936
|
var rectangleSize = Math.max(width, height);
|
|
@@ -8860,7 +8860,7 @@ var Element = React.forwardRef(function (props, forwardedRef) {
|
|
|
8860
8860
|
var _paperEventEmitterContext = React.useContext(paperEventEmitterContext);
|
|
8861
8861
|
// const elementObj = props.element;
|
|
8862
8862
|
var beingSelected = props.beingSelected, portPlaceholderShape = props.portPlaceholderShape, children = props.children, container = props.container, onMouseUp = props.onMouseUp, onMouseDown = props.onMouseDown, onMouseLeave = props.onMouseLeave, onMouseMove = props.onMouseMove, onMoving = props.onMoving, onMoved = props.onMoved, onResized = props.onResized, onPortMoved = props.onPortMoved, onPortMouseDown = props.onPortMouseDown, onPortMouseUp = props.onPortMouseUp, onClick = props.onClick, onContextMenu = props.onContextMenu, onPortContextMenu = props.onPortContextMenu, onMouseUpAtLinkedPortPlaceholder = props.onMouseUpAtLinkedPortPlaceholder, onManuallyTriggerRenderPort = props.onManuallyTriggerRenderPort, draggingByDefault = props.draggingByDefault, parentDOM = props.parentDOM;
|
|
8863
|
-
var _a = props.element, id = _a.id, cssClass = _a.cssClass
|
|
8863
|
+
var _a = props.element, id = _a.id, cssClass = _a.cssClass; _a.textsPlaceHolderClassName; var portSlideRailSVGClassName = _a.portSlideRailSVGClassName, portMoveableAreas = _a.portMoveableAreas, portDirection = _a.portDirection, defaultPortSize = _a.defaultPortSize; _a.textsPlaceHolderFlexStyle; _a.textsPlaceHolderFlexboxPosition; var resizability = _a.resizability, renderShape = _a.renderShape;
|
|
8864
8864
|
var propPorts = props.element.ports;
|
|
8865
8865
|
//state for position
|
|
8866
8866
|
var _b = React.useState(__assign({}, props.element.position)), position = _b[0], setPosition = _b[1];
|
|
@@ -8884,10 +8884,6 @@ var Element = React.forwardRef(function (props, forwardedRef) {
|
|
|
8884
8884
|
var newPosition = correctPortPositionInElement(tempNewPosition, size.width, size.height, portMoveableAreas, portSlideRailSVGClassName, elementRef.current || undefined);
|
|
8885
8885
|
return newPosition || tempNewPosition;
|
|
8886
8886
|
}, [size.width, size.height, portMoveableAreas, portSlideRailSVGClassName]);
|
|
8887
|
-
//set port ref when ports state is changed
|
|
8888
|
-
React.useLayoutEffect(function () {
|
|
8889
|
-
portsRef.current = ports;
|
|
8890
|
-
}, [ports]);
|
|
8891
8887
|
//Handle ports state when propPorts is changed
|
|
8892
8888
|
var handlePortsState = React.useCallback(function (newPorts) {
|
|
8893
8889
|
setPorts(function (prev) {
|
|
@@ -8903,17 +8899,27 @@ var Element = React.forwardRef(function (props, forwardedRef) {
|
|
|
8903
8899
|
}
|
|
8904
8900
|
//Handle the case new port is created and the ref of the port is not defined
|
|
8905
8901
|
if (!newPortState.ref) {
|
|
8906
|
-
var newPosition = normalizePortPosition(newPortState.position);
|
|
8907
8902
|
// onPortMoved?.(p, id, newPortState.position, newPosition)
|
|
8908
8903
|
// _paperEventEmitterContext.emitPortMoved(p, id, newPortState.position, newPosition)
|
|
8909
|
-
newPortState.position = newPosition;
|
|
8910
8904
|
newPortState.ref = React.createRef();
|
|
8911
8905
|
}
|
|
8906
|
+
//if (!newPortState.hasNormalizedPosition && elementRef.current) {
|
|
8907
|
+
var newPosition = normalizePortPosition(newPortState.position);
|
|
8908
|
+
newPortState.position = newPosition;
|
|
8909
|
+
//newPortState.hasNormalizedPosition = true;
|
|
8910
|
+
//}
|
|
8912
8911
|
return newPortState;
|
|
8913
8912
|
});
|
|
8913
|
+
portsRef.current = newState;
|
|
8914
8914
|
return newState;
|
|
8915
8915
|
});
|
|
8916
8916
|
}, [normalizePortPosition]);
|
|
8917
|
+
// useLayoutEffect(() => {
|
|
8918
|
+
// if (!hasNormalizedPortPositions.current && elementRef.current) {
|
|
8919
|
+
// handlePortsState(portsRef.current);
|
|
8920
|
+
// hasNormalizedPortPositions.current = true;
|
|
8921
|
+
// }
|
|
8922
|
+
// });
|
|
8917
8923
|
var getParentAbsolutePosition = React.useCallback(function () {
|
|
8918
8924
|
return props.element.parentElement ? getAbsolutePosition(props.element.parentElement) : undefined;
|
|
8919
8925
|
}, [props.element.parentElement]);
|
|
@@ -8992,29 +8998,29 @@ var Element = React.forwardRef(function (props, forwardedRef) {
|
|
|
8992
8998
|
eventListener.off();
|
|
8993
8999
|
};
|
|
8994
9000
|
}, [_paperEventEmitterContext]);
|
|
8995
|
-
|
|
8996
|
-
|
|
8997
|
-
|
|
8998
|
-
|
|
8999
|
-
|
|
9000
|
-
|
|
9001
|
-
|
|
9002
|
-
|
|
9003
|
-
|
|
9004
|
-
|
|
9005
|
-
|
|
9006
|
-
|
|
9007
|
-
|
|
9008
|
-
|
|
9009
|
-
|
|
9010
|
-
|
|
9011
|
-
|
|
9012
|
-
|
|
9013
|
-
|
|
9014
|
-
|
|
9015
|
-
|
|
9016
|
-
|
|
9017
|
-
}, [_paperEventEmitterContext, id, normalizePortPosition, size, portMoveableAreas, portSlideRailSVGClassName, handlePortsState, props.element.ports])
|
|
9001
|
+
// useEffect(() => {
|
|
9002
|
+
// //listen element resize to update position of the ports by element size.
|
|
9003
|
+
// const eleResizeListener = _paperEventEmitterContext.onElementResized(id, () => {
|
|
9004
|
+
// //let isChanged = false;
|
|
9005
|
+
// const newPorts = portsRef.current.map(port => {
|
|
9006
|
+
// const newPosition = normalizePortPosition({ x: port.position.x, y: port.position.y })
|
|
9007
|
+
// //Check port moved
|
|
9008
|
+
// if (port.position.x !== newPosition.x || port.position.y !== newPosition.y) {
|
|
9009
|
+
// //isChanged = true;
|
|
9010
|
+
// _paperEventEmitterContext.emitPortMoved(port, id, port.position, newPosition)
|
|
9011
|
+
// }
|
|
9012
|
+
// port.position = newPosition;
|
|
9013
|
+
// return port;
|
|
9014
|
+
// })
|
|
9015
|
+
// handlePortsState(newPorts);
|
|
9016
|
+
// // if (isChanged) {
|
|
9017
|
+
// // onPortsChanged?.(newPorts, id);
|
|
9018
|
+
// // }
|
|
9019
|
+
// })
|
|
9020
|
+
// return () => {
|
|
9021
|
+
// eleResizeListener.off();
|
|
9022
|
+
// }
|
|
9023
|
+
// }, [_paperEventEmitterContext, id, normalizePortPosition, size, portMoveableAreas, portSlideRailSVGClassName, handlePortsState, props.element.ports])
|
|
9018
9024
|
//list to port added
|
|
9019
9025
|
React.useEffect(function () {
|
|
9020
9026
|
var _a, _b;
|
|
@@ -9075,7 +9081,7 @@ var Element = React.forwardRef(function (props, forwardedRef) {
|
|
|
9075
9081
|
}, [_paperEventEmitterContext]);
|
|
9076
9082
|
var handleSelectedPort = React.useCallback(function (portId, e) {
|
|
9077
9083
|
e.stopPropagation();
|
|
9078
|
-
logger.debug('Port selected', portId, e);
|
|
9084
|
+
//logger.debug('Port selected', portId, e);
|
|
9079
9085
|
var port = ports.find(function (p) { return p.id === portId; });
|
|
9080
9086
|
if (!port)
|
|
9081
9087
|
return;
|
|
@@ -9123,7 +9129,7 @@ var Element = React.forwardRef(function (props, forwardedRef) {
|
|
|
9123
9129
|
var handlePortMouseDown = React.useCallback(function (portId, e) {
|
|
9124
9130
|
e.stopPropagation();
|
|
9125
9131
|
//log debugger
|
|
9126
|
-
logger.debug('Port mouse down', portId, e);
|
|
9132
|
+
//logger.debug('Port mouse down', portId, e);
|
|
9127
9133
|
var port = portsRef.current.find(function (p) { return p.id === portId; });
|
|
9128
9134
|
if (!port)
|
|
9129
9135
|
return;
|
|
@@ -9329,14 +9335,6 @@ var Element = React.forwardRef(function (props, forwardedRef) {
|
|
|
9329
9335
|
// }
|
|
9330
9336
|
// return element;
|
|
9331
9337
|
// }
|
|
9332
|
-
//Re-render port again after rendered to automation rotate port
|
|
9333
|
-
//Because elementRef.current equals null in first render so automation rotate port is incorrect.
|
|
9334
|
-
//TODO: check if this is still needed -> Still needed
|
|
9335
|
-
// useLayoutEffect(() => {
|
|
9336
|
-
// if (elementRef.current) {
|
|
9337
|
-
// handlePortsState(portsRef.current);
|
|
9338
|
-
// }
|
|
9339
|
-
// }, [handlePortsState])
|
|
9340
9338
|
//cache render ports
|
|
9341
9339
|
var renderedPorts = React.useMemo(function () {
|
|
9342
9340
|
return ports === null || ports === void 0 ? void 0 : ports.map(function (p, index) {
|
|
@@ -9361,7 +9359,7 @@ var Element = React.forwardRef(function (props, forwardedRef) {
|
|
|
9361
9359
|
});
|
|
9362
9360
|
}, [id, texts, container, elementAbsPosition, handleTextChanged]);
|
|
9363
9361
|
//log element render
|
|
9364
|
-
logger.debug('Rendering Element', id, position.x, position.y, size.width, size.height, cssClass, portPlaceholderShape, children, container, getParentAbsolutePosition(), textsPlaceHolderFlexStyle, textsPlaceHolderFlexboxPosition, textsPlaceHolderClassName, texts, ports, portSlideRailSVGClassName, portMoveableAreas, portDirection, defaultPortSize);
|
|
9362
|
+
//logger.debug('Rendering Element', id, position.x, position.y, size.width, size.height, cssClass, portPlaceholderShape, children, container, getParentAbsolutePosition(), textsPlaceHolderFlexStyle, textsPlaceHolderFlexboxPosition, textsPlaceHolderClassName, texts, ports, portSlideRailSVGClassName, portMoveableAreas, portDirection, defaultPortSize);
|
|
9365
9363
|
return (React.createElement(ElementWrapper, { key: "ElementWrapper", ref: elementRef, x: position.x, y: position.y, cssClass: cssClass, onClick: function (e) { return onClick ? onClick(id, e, elementRef.current) : true; }, onMouseMove: handleElementMouseMove, onMouseLeave: handleElementMouseLeave, onMouseDown: handleElementMouseDown, onMouseUp: handleElementMouseUp, onContextMenu: function (e) { return onContextMenu ? onContextMenu(id, e, elementRef.current) : true; } }, renderShape === null || renderShape === void 0 ? void 0 :
|
|
9366
9364
|
renderShape(props),
|
|
9367
9365
|
!!container && !!beingSelected &&
|
|
@@ -10093,7 +10091,6 @@ var Paper = function (props) {
|
|
|
10093
10091
|
linksRef.current[updatedLinkIndex].points = points;
|
|
10094
10092
|
}, []);
|
|
10095
10093
|
var handlePortMoved = React.useCallback(function (port, elementId, oldPosition, newPosition) {
|
|
10096
|
-
var _a;
|
|
10097
10094
|
var element = elementsState.elements.find(function (e) { return e.id === elementId; });
|
|
10098
10095
|
if (element) {
|
|
10099
10096
|
//set links equals a clone links to re-render links with new position
|
|
@@ -10134,23 +10131,23 @@ var Paper = function (props) {
|
|
|
10134
10131
|
//To avoid re-render
|
|
10135
10132
|
// setElements(prev => {
|
|
10136
10133
|
// const newElements = [...prev]
|
|
10137
|
-
|
|
10138
|
-
if (updatedElement) {
|
|
10139
|
-
|
|
10140
|
-
|
|
10141
|
-
|
|
10142
|
-
|
|
10143
|
-
|
|
10144
|
-
|
|
10145
|
-
}
|
|
10146
|
-
rerenderWhenAnyElementChanged();
|
|
10134
|
+
// const updatedElement = elementsState.elements.find(e => e.id === elementId);
|
|
10135
|
+
// if (updatedElement) {
|
|
10136
|
+
// updatedElement.ports = updatedElement.ports?.map(p => {
|
|
10137
|
+
// if (p.id === port.id) {
|
|
10138
|
+
// p.position = newPosition
|
|
10139
|
+
// }
|
|
10140
|
+
// return p
|
|
10141
|
+
// });
|
|
10142
|
+
// }
|
|
10143
|
+
// rerenderWhenAnyElementChanged();
|
|
10147
10144
|
// return newElements
|
|
10148
10145
|
// });
|
|
10149
10146
|
if (onPortMoved) {
|
|
10150
10147
|
onPortMoved(newPosition, port, element);
|
|
10151
10148
|
}
|
|
10152
10149
|
}
|
|
10153
|
-
}, [onPortMoved, elementsState
|
|
10150
|
+
}, [onPortMoved, elementsState]);
|
|
10154
10151
|
React.useEffect(function () {
|
|
10155
10152
|
//on port manually trigger render
|
|
10156
10153
|
var off = manuallyTriggerRenderPortHandler(function (portId, elementId) {
|