@metadev/daga 4.2.0 → 4.2.1
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/Changelog.md +11 -1
- package/index.cjs.js +299 -166
- package/index.esm.js +299 -166
- package/package.json +1 -1
- package/src/lib/diagram/canvas/diagram-canvas.d.ts +1 -1
- package/src/lib/diagram/canvas/diagram-user-selection.d.ts +3 -1
- package/src/lib/diagram/config/diagram-config.d.ts +54 -1
- package/src/lib/diagram/model/diagram-decorator.d.ts +13 -3
- package/src/lib/diagram/model/diagram-field.d.ts +9 -3
- package/src/lib/diagram/model/diagram-port.d.ts +13 -3
- package/src/lib/diagram/model/diagram-section.d.ts +16 -0
- package/src/lib/interfaces/canvas.d.ts +2 -1
- package/src/lib/util/canvas-util.d.ts +18 -0
- package/src/lib/util/trig.d.ts +20 -0
package/index.esm.js
CHANGED
|
@@ -137,17 +137,67 @@ const translateCoordinate = (oldCoordinate, oldCoordinates, newCoordinates) => {
|
|
|
137
137
|
return (oldCoordinate - oldCoordinates[0]) / (oldCoordinates[1] - oldCoordinates[0]) * (newCoordinates[1] - newCoordinates[0]) + newCoordinates[0];
|
|
138
138
|
};
|
|
139
139
|
/**
|
|
140
|
-
* Moves the coordinates of the given point according to the given changes in coordinates.
|
|
140
|
+
* Moves the coordinates of the given point according to the given changes in coordinates and anchor points.
|
|
141
141
|
* @public
|
|
142
142
|
* @param oldPoint A point.
|
|
143
143
|
* @param oldCoordsX A range of coordinates along the x axis.
|
|
144
144
|
* @param oldCoordsY A range of coordinates along the y axis.
|
|
145
145
|
* @param newCoordsX A range of coordinates along the x axis.
|
|
146
146
|
* @param newCoordsY A range of coordinates along the y axis.
|
|
147
|
+
* @param anchorPointX The horizontal anchor point behavior.
|
|
148
|
+
* @param anchorPointY The vertical anchor point behavior.
|
|
147
149
|
* @returns A new point.
|
|
148
150
|
*/
|
|
149
|
-
const
|
|
150
|
-
|
|
151
|
+
const translatePointWithAnchors = (oldPoint, oldCoordsX, oldCoordsY, newCoordsX, newCoordsY, anchorPointX, anchorPointY) => {
|
|
152
|
+
const newX = (() => {
|
|
153
|
+
switch (anchorPointX) {
|
|
154
|
+
case 'start':
|
|
155
|
+
// Always maintain the same distance from the left edge
|
|
156
|
+
return newCoordsX[0] + (oldPoint[0] - oldCoordsX[0]);
|
|
157
|
+
case 'end':
|
|
158
|
+
// Always maintain the same distance from the right edge
|
|
159
|
+
return newCoordsX[1] - (oldCoordsX[1] - oldPoint[0]);
|
|
160
|
+
case 'middle':
|
|
161
|
+
{
|
|
162
|
+
// Always maintain the same relative position from the center
|
|
163
|
+
const oldCenterX = (oldCoordsX[0] + oldCoordsX[1]) / 2;
|
|
164
|
+
const newCenterX = (newCoordsX[0] + newCoordsX[1]) / 2;
|
|
165
|
+
const oldWidth = oldCoordsX[1] - oldCoordsX[0];
|
|
166
|
+
const newWidth = newCoordsX[1] - newCoordsX[0];
|
|
167
|
+
const relativePosition = (oldPoint[0] - oldCenterX) / oldWidth;
|
|
168
|
+
return newCenterX + relativePosition * newWidth;
|
|
169
|
+
}
|
|
170
|
+
case 'floating':
|
|
171
|
+
default:
|
|
172
|
+
// Scale proportionally (original behavior)
|
|
173
|
+
return translateCoordinate(oldPoint[0], oldCoordsX, newCoordsX);
|
|
174
|
+
}
|
|
175
|
+
})();
|
|
176
|
+
const newY = (() => {
|
|
177
|
+
switch (anchorPointY) {
|
|
178
|
+
case 'start':
|
|
179
|
+
// Always maintain the same distance from the top edge
|
|
180
|
+
return newCoordsY[0] + (oldPoint[1] - oldCoordsY[0]);
|
|
181
|
+
case 'end':
|
|
182
|
+
// Always maintain the same distance from the bottom edge
|
|
183
|
+
return newCoordsY[1] - (oldCoordsY[1] - oldPoint[1]);
|
|
184
|
+
case 'middle':
|
|
185
|
+
{
|
|
186
|
+
// Always maintain the same relative position from the center
|
|
187
|
+
const oldCenterY = (oldCoordsY[0] + oldCoordsY[1]) / 2;
|
|
188
|
+
const newCenterY = (newCoordsY[0] + newCoordsY[1]) / 2;
|
|
189
|
+
const oldHeight = oldCoordsY[1] - oldCoordsY[0];
|
|
190
|
+
const newHeight = newCoordsY[1] - newCoordsY[0];
|
|
191
|
+
const relativePosition = (oldPoint[1] - oldCenterY) / oldHeight;
|
|
192
|
+
return newCenterY + relativePosition * newHeight;
|
|
193
|
+
}
|
|
194
|
+
case 'floating':
|
|
195
|
+
default:
|
|
196
|
+
// Scale proportionally (original behavior)
|
|
197
|
+
return translateCoordinate(oldPoint[1], oldCoordsY, newCoordsY);
|
|
198
|
+
}
|
|
199
|
+
})();
|
|
200
|
+
return [newX, newY];
|
|
151
201
|
};
|
|
152
202
|
/**
|
|
153
203
|
* Calculates the euclidean distance between two points.
|
|
@@ -244,6 +294,10 @@ var ZoomEvents;
|
|
|
244
294
|
ZoomEvents["End"] = "end";
|
|
245
295
|
})(ZoomEvents || (ZoomEvents = {}));
|
|
246
296
|
|
|
297
|
+
const escapeSelector = selector => {
|
|
298
|
+
return selector.replace(/([!"#$%&'()*+,\-./:;<=>?@[\\\]^`{|}])/g, '\\$1');
|
|
299
|
+
};
|
|
300
|
+
|
|
247
301
|
/**
|
|
248
302
|
* An enumeration of the possible shapes of a line.
|
|
249
303
|
* @public
|
|
@@ -1001,10 +1055,6 @@ class DiagramEntitySet {
|
|
|
1001
1055
|
}
|
|
1002
1056
|
}
|
|
1003
1057
|
|
|
1004
|
-
const escapeSelector = selector => {
|
|
1005
|
-
return selector.replace(/([!"#$%&'()*+,\-./:;<=>?@[\\\]^`{|}])/g, '\\$1');
|
|
1006
|
-
};
|
|
1007
|
-
|
|
1008
1058
|
/**
|
|
1009
1059
|
* Default priority value for diagram elements.
|
|
1010
1060
|
* @private
|
|
@@ -1816,20 +1866,24 @@ class DiagramConnection extends DiagramElement {
|
|
|
1816
1866
|
}
|
|
1817
1867
|
set type(type) {
|
|
1818
1868
|
var _a, _b;
|
|
1819
|
-
|
|
1820
|
-
|
|
1821
|
-
|
|
1822
|
-
|
|
1869
|
+
if (type !== this._type) {
|
|
1870
|
+
this._type = type;
|
|
1871
|
+
if (this.valueSet) {
|
|
1872
|
+
this.valueSet = new ValueSet(type.propertySet, this);
|
|
1873
|
+
}
|
|
1874
|
+
(_b = (_a = this.model.canvas) === null || _a === void 0 ? void 0 : _a.userSelection) === null || _b === void 0 ? void 0 : _b.openInPropertyEditor(this, false);
|
|
1875
|
+
this.updateInView();
|
|
1823
1876
|
}
|
|
1824
|
-
this.updateInView();
|
|
1825
1877
|
}
|
|
1826
1878
|
get typeString() {
|
|
1827
1879
|
return this.type.id;
|
|
1828
1880
|
}
|
|
1829
1881
|
set typeString(typeString) {
|
|
1830
|
-
|
|
1831
|
-
|
|
1832
|
-
|
|
1882
|
+
if (typeString !== this.type.id) {
|
|
1883
|
+
const type = this.model.connections.types.get(typeString);
|
|
1884
|
+
if (type) {
|
|
1885
|
+
this.type = type;
|
|
1886
|
+
}
|
|
1833
1887
|
}
|
|
1834
1888
|
}
|
|
1835
1889
|
/**
|
|
@@ -2220,7 +2274,8 @@ const DIAGRAM_FIELD_DEFAULTS = {
|
|
|
2220
2274
|
horizontalAlign: HorizontalAlign.Center,
|
|
2221
2275
|
verticalAlign: VerticalAlign.Center,
|
|
2222
2276
|
orientation: Side.Top,
|
|
2223
|
-
fit: false
|
|
2277
|
+
fit: false,
|
|
2278
|
+
shrink: true
|
|
2224
2279
|
};
|
|
2225
2280
|
/**
|
|
2226
2281
|
* A field which displays text and is part of a diagram element.
|
|
@@ -2245,10 +2300,10 @@ class DiagramField extends DiagramElement {
|
|
|
2245
2300
|
this._text = value;
|
|
2246
2301
|
this.updateInView();
|
|
2247
2302
|
if (this.fit) {
|
|
2248
|
-
(_a = this.model.canvas) === null || _a === void 0 ? void 0 : _a.fitFieldRootInView(this.id);
|
|
2303
|
+
(_a = this.model.canvas) === null || _a === void 0 ? void 0 : _a.fitFieldRootInView(this.id, this.shrink);
|
|
2249
2304
|
}
|
|
2250
2305
|
}
|
|
2251
|
-
constructor(model, rootElement, coords, width, height, fontSize, fontFamily, color, selectedColor, horizontalAlign, verticalAlign, orientation, text, editable, fit) {
|
|
2306
|
+
constructor(model, rootElement, coords, width, height, fontSize, fontFamily, color, selectedColor, horizontalAlign, verticalAlign, orientation, text, editable, fit, shrink) {
|
|
2252
2307
|
const id = `${rootElement === null || rootElement === void 0 ? void 0 : rootElement.id}_field`;
|
|
2253
2308
|
if (model.fields.get(id) !== undefined) {
|
|
2254
2309
|
throw new Error('DiagramField for rootElement already exists');
|
|
@@ -2269,11 +2324,31 @@ class DiagramField extends DiagramElement {
|
|
|
2269
2324
|
this.selectedColor = selectedColor;
|
|
2270
2325
|
this.horizontalAlign = horizontalAlign;
|
|
2271
2326
|
this.verticalAlign = verticalAlign;
|
|
2272
|
-
|
|
2327
|
+
if (!isNaN(Number(orientation))) {
|
|
2328
|
+
this.orientation = Number(orientation);
|
|
2329
|
+
} else {
|
|
2330
|
+
switch (orientation) {
|
|
2331
|
+
case Side.Top:
|
|
2332
|
+
this.orientation = 0;
|
|
2333
|
+
break;
|
|
2334
|
+
case Side.Right:
|
|
2335
|
+
this.orientation = 90;
|
|
2336
|
+
break;
|
|
2337
|
+
case Side.Bottom:
|
|
2338
|
+
this.orientation = 180;
|
|
2339
|
+
break;
|
|
2340
|
+
case Side.Left:
|
|
2341
|
+
this.orientation = 270;
|
|
2342
|
+
break;
|
|
2343
|
+
default:
|
|
2344
|
+
this.orientation = 0;
|
|
2345
|
+
}
|
|
2346
|
+
}
|
|
2273
2347
|
this.defaultText = text;
|
|
2274
2348
|
this._text = text;
|
|
2275
2349
|
this.editable = editable;
|
|
2276
2350
|
this.fit = fit;
|
|
2351
|
+
this.shrink = shrink;
|
|
2277
2352
|
}
|
|
2278
2353
|
get removed() {
|
|
2279
2354
|
return this.selfRemoved || this.rootElement !== undefined && this.rootElement.removed;
|
|
@@ -2313,8 +2388,8 @@ class DiagramFieldSet extends DiagramElementSet {
|
|
|
2313
2388
|
* Instance a new field and add it to this set. This method is normally called when instancing an element with a field and it is rarely called by itself.
|
|
2314
2389
|
* @private
|
|
2315
2390
|
*/
|
|
2316
|
-
new(rootElement, coords, fontSize, fontFamily, color, selectedColor, width, height, horizontalAlign, verticalAlign, orientation, text, editable, fit) {
|
|
2317
|
-
const field = new DiagramField(this.model, rootElement, coords, width, height, fontSize, fontFamily, color, selectedColor, horizontalAlign, verticalAlign, orientation, text, editable, fit);
|
|
2391
|
+
new(rootElement, coords, fontSize, fontFamily, color, selectedColor, width, height, horizontalAlign, verticalAlign, orientation, text, editable, fit, shrink) {
|
|
2392
|
+
const field = new DiagramField(this.model, rootElement, coords, width, height, fontSize, fontFamily, color, selectedColor, horizontalAlign, verticalAlign, orientation, text, editable, fit, shrink);
|
|
2318
2393
|
super.add(field);
|
|
2319
2394
|
field.updateInView();
|
|
2320
2395
|
// add this field to its root element
|
|
@@ -2545,6 +2620,8 @@ class DiagramSectionType {
|
|
|
2545
2620
|
this.label = options.label || null;
|
|
2546
2621
|
this.ports = options.ports || [];
|
|
2547
2622
|
this.priority = options.priority || DEFAULT_PRIORITY;
|
|
2623
|
+
this.resizableX = options.resizableX;
|
|
2624
|
+
this.resizableY = options.resizableY;
|
|
2548
2625
|
const looks = extractLooksFromConfig(options.look || DIAGRAM_NODE_LOOK_DEFAULTS);
|
|
2549
2626
|
this.defaultLook = looks.defaultLook;
|
|
2550
2627
|
this.selectedLook = looks.selectedLook;
|
|
@@ -2673,6 +2750,34 @@ class DiagramSection extends DiagramElement {
|
|
|
2673
2750
|
var _a, _b, _c, _d, _e, _f;
|
|
2674
2751
|
return ((_f = (_e = (_d = (_c = (_b = (_a = this.node) === null || _a === void 0 ? void 0 : _a.type) === null || _b === void 0 ? void 0 : _b.sectionGrid) === null || _c === void 0 ? void 0 : _c.sections) === null || _d === void 0 ? void 0 : _d[this.indexYInNode]) === null || _e === void 0 ? void 0 : _e[this.indexXInNode]) === null || _f === void 0 ? void 0 : _f.priority) || DEFAULT_PRIORITY;
|
|
2675
2752
|
}
|
|
2753
|
+
/**
|
|
2754
|
+
* Returns whether this section can be resized horizontally.
|
|
2755
|
+
* If the section has a specific resizableX setting, it uses that.
|
|
2756
|
+
* Otherwise, it inherits from the parent node's resizableX setting.
|
|
2757
|
+
* @public
|
|
2758
|
+
*/
|
|
2759
|
+
getResizableX() {
|
|
2760
|
+
var _a, _b;
|
|
2761
|
+
const sectionType = this.type;
|
|
2762
|
+
if ((sectionType === null || sectionType === void 0 ? void 0 : sectionType.resizableX) !== undefined) {
|
|
2763
|
+
return sectionType.resizableX;
|
|
2764
|
+
}
|
|
2765
|
+
return ((_b = (_a = this.node) === null || _a === void 0 ? void 0 : _a.type) === null || _b === void 0 ? void 0 : _b.resizableX) || false;
|
|
2766
|
+
}
|
|
2767
|
+
/**
|
|
2768
|
+
* Returns whether this section can be resized vertically.
|
|
2769
|
+
* If the section has a specific resizableY setting, it uses that.
|
|
2770
|
+
* Otherwise, it inherits from the parent node's resizableY setting.
|
|
2771
|
+
* @public
|
|
2772
|
+
*/
|
|
2773
|
+
getResizableY() {
|
|
2774
|
+
var _a, _b;
|
|
2775
|
+
const sectionType = this.type;
|
|
2776
|
+
if ((sectionType === null || sectionType === void 0 ? void 0 : sectionType.resizableY) !== undefined) {
|
|
2777
|
+
return sectionType.resizableY;
|
|
2778
|
+
}
|
|
2779
|
+
return ((_b = (_a = this.node) === null || _a === void 0 ? void 0 : _a.type) === null || _b === void 0 ? void 0 : _b.resizableY) || false;
|
|
2780
|
+
}
|
|
2676
2781
|
/**
|
|
2677
2782
|
* Get the port of this section which is closest to the given coordinates.
|
|
2678
2783
|
* @param coords A point in the diagram.
|
|
@@ -2831,7 +2936,7 @@ class DiagramSection extends DiagramElement {
|
|
|
2831
2936
|
const newCoordsY = [this.coords[1], this.coords[1] + this.height];
|
|
2832
2937
|
// Move ports to match the new coords.
|
|
2833
2938
|
for (const port of this.ports) {
|
|
2834
|
-
port.move(
|
|
2939
|
+
port.move(translatePointWithAnchors(port.coords, oldCoordsX, oldCoordsY, newCoordsX, newCoordsY, port.anchorPointX, port.anchorPointY));
|
|
2835
2940
|
}
|
|
2836
2941
|
// Set label's dimensions as a function of ours.
|
|
2837
2942
|
const type = this.type;
|
|
@@ -2843,7 +2948,7 @@ class DiagramSection extends DiagramElement {
|
|
|
2843
2948
|
}
|
|
2844
2949
|
// Move decorators to match the new coords.
|
|
2845
2950
|
for (const decorator of this.decorators) {
|
|
2846
|
-
decorator.move(
|
|
2951
|
+
decorator.move(translatePointWithAnchors(decorator.coords, oldCoordsX, oldCoordsY, newCoordsX, newCoordsY, decorator.anchorPointX, decorator.anchorPointY));
|
|
2847
2952
|
}
|
|
2848
2953
|
// Update canvas.
|
|
2849
2954
|
this.getConnections().forEach(c => c.tighten());
|
|
@@ -2876,7 +2981,7 @@ class DiagramSectionSet extends DiagramElementSet {
|
|
|
2876
2981
|
if (sectionPorts && sectionPorts.length > 0) {
|
|
2877
2982
|
for (let i = 0; i < sectionPorts.length; ++i) {
|
|
2878
2983
|
const portConfig = sectionPorts[i];
|
|
2879
|
-
const port = this.model.ports.new(portConfig.type !== undefined ? this.model.ports.types.get(portConfig.type) : undefined, section, [section.coords[0] + (portConfig.coords[0] || 0), section.coords[1] + (portConfig.coords[1] || 0)], portConfig.connectionPoint !== undefined ? [section.coords[0] + (portConfig.connectionPoint[0] || 0), section.coords[1] + (portConfig.connectionPoint[1] || 0)] : undefined, portConfig === null || portConfig === void 0 ? void 0 : portConfig.direction, `${section.id}_${i}
|
|
2984
|
+
const port = this.model.ports.new(portConfig.type !== undefined ? this.model.ports.types.get(portConfig.type) : undefined, section, [section.coords[0] + (portConfig.coords[0] || 0), section.coords[1] + (portConfig.coords[1] || 0)], portConfig.connectionPoint !== undefined ? [section.coords[0] + (portConfig.connectionPoint[0] || 0), section.coords[1] + (portConfig.connectionPoint[1] || 0)] : undefined, portConfig === null || portConfig === void 0 ? void 0 : portConfig.direction, `${section.id}_${i}`, portConfig.anchorPointX || 'floating', portConfig.anchorPointY || 'floating');
|
|
2880
2985
|
if ((_e = port.type) === null || _e === void 0 ? void 0 : _e.label) {
|
|
2881
2986
|
const labelConfiguration = Object.assign(Object.assign({}, DIAGRAM_FIELD_DEFAULTS), (_f = port.type) === null || _f === void 0 ? void 0 : _f.label);
|
|
2882
2987
|
const labelWidth = 6 * labelConfiguration.fontSize + getLeftPadding$1(labelConfiguration) + getRightPadding$1(labelConfiguration);
|
|
@@ -2894,7 +2999,7 @@ class DiagramSectionSet extends DiagramElementSet {
|
|
|
2894
2999
|
default:
|
|
2895
3000
|
labelCoords = port.coords;
|
|
2896
3001
|
}
|
|
2897
|
-
this.model.fields.new(port, labelCoords, labelConfiguration.fontSize, labelConfiguration.fontFamily, labelConfiguration.color, labelConfiguration.selectedColor, labelWidth, labelHeight, labelConfiguration.horizontalAlign, labelConfiguration.verticalAlign, labelConfiguration.orientation, '', labelConfiguration.editable, labelConfiguration.fit);
|
|
3002
|
+
this.model.fields.new(port, labelCoords, labelConfiguration.fontSize, labelConfiguration.fontFamily, labelConfiguration.color, labelConfiguration.selectedColor, labelWidth, labelHeight, labelConfiguration.horizontalAlign, labelConfiguration.verticalAlign, labelConfiguration.orientation, '', labelConfiguration.editable, labelConfiguration.fit, labelConfiguration.shrink);
|
|
2898
3003
|
}
|
|
2899
3004
|
}
|
|
2900
3005
|
}
|
|
@@ -2902,7 +3007,7 @@ class DiagramSectionSet extends DiagramElementSet {
|
|
|
2902
3007
|
const sectionLabel = (_k = (_j = (_h = (_g = node.type.sectionGrid) === null || _g === void 0 ? void 0 : _g.sections) === null || _h === void 0 ? void 0 : _h[indexYInNode]) === null || _j === void 0 ? void 0 : _j[indexXInNode]) === null || _k === void 0 ? void 0 : _k.label;
|
|
2903
3008
|
if (sectionLabel) {
|
|
2904
3009
|
const labelConfiguration = Object.assign(Object.assign({}, DIAGRAM_FIELD_DEFAULTS), sectionLabel);
|
|
2905
|
-
this.model.fields.new(section, [section.coords[0] + getLeftMargin(labelConfiguration), section.coords[1] + getTopMargin(labelConfiguration)], labelConfiguration.fontSize, labelConfiguration.fontFamily, labelConfiguration.color, labelConfiguration.selectedColor, section.width - getLeftMargin(labelConfiguration) - getRightMargin(labelConfiguration), section.height - getTopMargin(labelConfiguration) - getBottomMargin(labelConfiguration), labelConfiguration.horizontalAlign, labelConfiguration.verticalAlign, labelConfiguration.orientation, '', labelConfiguration.editable, labelConfiguration.fit);
|
|
3010
|
+
this.model.fields.new(section, [section.coords[0] + getLeftMargin(labelConfiguration), section.coords[1] + getTopMargin(labelConfiguration)], labelConfiguration.fontSize, labelConfiguration.fontFamily, labelConfiguration.color, labelConfiguration.selectedColor, section.width - getLeftMargin(labelConfiguration) - getRightMargin(labelConfiguration), section.height - getTopMargin(labelConfiguration) - getBottomMargin(labelConfiguration), labelConfiguration.horizontalAlign, labelConfiguration.verticalAlign, labelConfiguration.orientation, '', labelConfiguration.editable, labelConfiguration.fit, labelConfiguration.shrink);
|
|
2906
3011
|
}
|
|
2907
3012
|
return section;
|
|
2908
3013
|
}
|
|
@@ -3022,20 +3127,24 @@ class DiagramNode extends DiagramElement {
|
|
|
3022
3127
|
}
|
|
3023
3128
|
set type(type) {
|
|
3024
3129
|
var _a, _b;
|
|
3025
|
-
|
|
3026
|
-
|
|
3027
|
-
|
|
3028
|
-
|
|
3130
|
+
if (type !== this._type) {
|
|
3131
|
+
this._type = type;
|
|
3132
|
+
if (this.valueSet) {
|
|
3133
|
+
this.valueSet = new ValueSet(type.propertySet, this);
|
|
3134
|
+
}
|
|
3135
|
+
(_b = (_a = this.model.canvas) === null || _a === void 0 ? void 0 : _a.userSelection) === null || _b === void 0 ? void 0 : _b.openInPropertyEditor(this, false);
|
|
3136
|
+
this.updateInView();
|
|
3029
3137
|
}
|
|
3030
|
-
this.updateInView();
|
|
3031
3138
|
}
|
|
3032
3139
|
get typeString() {
|
|
3033
3140
|
return this.type.id;
|
|
3034
3141
|
}
|
|
3035
3142
|
set typeString(typeString) {
|
|
3036
|
-
|
|
3037
|
-
|
|
3038
|
-
|
|
3143
|
+
if (typeString !== this.type.id) {
|
|
3144
|
+
const type = this.model.nodes.types.get(typeString);
|
|
3145
|
+
if (type) {
|
|
3146
|
+
this.type = type;
|
|
3147
|
+
}
|
|
3039
3148
|
}
|
|
3040
3149
|
}
|
|
3041
3150
|
/**
|
|
@@ -3335,21 +3444,42 @@ class DiagramNode extends DiagramElement {
|
|
|
3335
3444
|
child.parent = undefined;
|
|
3336
3445
|
}
|
|
3337
3446
|
fitToChild(child) {
|
|
3447
|
+
// if the node includes sections, we stretch the sections as well when fitting to a child node
|
|
3448
|
+
// we assume it is most natural to stretch the last row and column of section
|
|
3449
|
+
// TODO: consider being able to configure which row or column gets stretched first
|
|
3450
|
+
const maxSectionIndexX = Math.max(...this.sections.map(s => s.indexXInNode));
|
|
3451
|
+
const maxSectionIndexY = Math.max(...this.sections.map(s => s.indexYInNode));
|
|
3338
3452
|
const excessLeft = this.coords[0] - child.coords[0] + this.type.leftPadding;
|
|
3339
3453
|
if (excessLeft >= 0) {
|
|
3340
|
-
this.
|
|
3454
|
+
if (this.sections.length > 0) {
|
|
3455
|
+
this.stretchSections(Side.Left, excessLeft, maxSectionIndexX, maxSectionIndexY);
|
|
3456
|
+
} else {
|
|
3457
|
+
this.stretch(Side.Left, excessLeft);
|
|
3458
|
+
}
|
|
3341
3459
|
}
|
|
3342
3460
|
const excessTop = this.coords[1] - child.coords[1] + this.type.topPadding;
|
|
3343
3461
|
if (excessTop >= 0) {
|
|
3344
|
-
this.
|
|
3462
|
+
if (this.sections.length > 0) {
|
|
3463
|
+
this.stretchSections(Side.Top, excessTop, maxSectionIndexX, maxSectionIndexY);
|
|
3464
|
+
} else {
|
|
3465
|
+
this.stretch(Side.Top, excessTop);
|
|
3466
|
+
}
|
|
3345
3467
|
}
|
|
3346
3468
|
const excessRight = child.coords[0] + child.width - (this.coords[0] + this.width) + this.type.rightPadding;
|
|
3347
3469
|
if (excessRight >= 0) {
|
|
3348
|
-
this.
|
|
3470
|
+
if (this.sections.length > 0) {
|
|
3471
|
+
this.stretchSections(Side.Right, excessRight, maxSectionIndexX, maxSectionIndexY);
|
|
3472
|
+
} else {
|
|
3473
|
+
this.stretch(Side.Right, excessRight);
|
|
3474
|
+
}
|
|
3349
3475
|
}
|
|
3350
3476
|
const excessBottom = child.coords[1] + child.height - (this.coords[1] + this.height) + this.type.bottomPadding;
|
|
3351
3477
|
if (excessBottom >= 0) {
|
|
3352
|
-
this.
|
|
3478
|
+
if (this.sections.length > 0) {
|
|
3479
|
+
this.stretchSections(Side.Bottom, excessBottom, maxSectionIndexX, maxSectionIndexY);
|
|
3480
|
+
} else {
|
|
3481
|
+
this.stretch(Side.Bottom, excessBottom);
|
|
3482
|
+
}
|
|
3353
3483
|
}
|
|
3354
3484
|
if (this.parent) {
|
|
3355
3485
|
// ensure this node also fits inside its parent after stretching
|
|
@@ -3564,7 +3694,7 @@ class DiagramNode extends DiagramElement {
|
|
|
3564
3694
|
}
|
|
3565
3695
|
// Move ports to match the new coords.
|
|
3566
3696
|
for (const port of this.ports) {
|
|
3567
|
-
port.move(
|
|
3697
|
+
port.move(translatePointWithAnchors(port.coords, oldCoordsX, oldCoordsY, newCoordsX, newCoordsY, port.anchorPointX, port.anchorPointY));
|
|
3568
3698
|
}
|
|
3569
3699
|
// Set label's dimensions as a function of ours.
|
|
3570
3700
|
if (this.label) {
|
|
@@ -3575,7 +3705,7 @@ class DiagramNode extends DiagramElement {
|
|
|
3575
3705
|
}
|
|
3576
3706
|
// Move decorators to match the new coords.
|
|
3577
3707
|
for (const decorator of this.decorators) {
|
|
3578
|
-
decorator.move(
|
|
3708
|
+
decorator.move(translatePointWithAnchors(decorator.coords, oldCoordsX, oldCoordsY, newCoordsX, newCoordsY, decorator.anchorPointX, decorator.anchorPointY));
|
|
3579
3709
|
}
|
|
3580
3710
|
// Update canvas.
|
|
3581
3711
|
this.getConnections().forEach(c => c.tighten());
|
|
@@ -3737,7 +3867,7 @@ class DiagramNodeSet extends DiagramElementSet {
|
|
|
3737
3867
|
for (let i = 0; i < nodeType.ports.length; ++i) {
|
|
3738
3868
|
const portConfig = nodeType.ports[i];
|
|
3739
3869
|
const portType = portConfig.type !== undefined ? this.model.ports.types.get(portConfig.type) : undefined;
|
|
3740
|
-
const port = this.model.ports.new(portType, node, [node.coords[0] + portConfig.coords[0], node.coords[1] + portConfig.coords[1]], portConfig.connectionPoint !== undefined ? [node.coords[0] + (portConfig.connectionPoint[0] || 0), node.coords[1] + (portConfig.connectionPoint[1] || 0)] : undefined, portConfig.direction, `${node.id}_port_${i}
|
|
3870
|
+
const port = this.model.ports.new(portType, node, [node.coords[0] + portConfig.coords[0], node.coords[1] + portConfig.coords[1]], portConfig.connectionPoint !== undefined ? [node.coords[0] + (portConfig.connectionPoint[0] || 0), node.coords[1] + (portConfig.connectionPoint[1] || 0)] : undefined, portConfig.direction, `${node.id}_port_${i}`, portConfig.anchorPointX || 'floating', portConfig.anchorPointY || 'floating');
|
|
3741
3871
|
if ((_e = port.type) === null || _e === void 0 ? void 0 : _e.label) {
|
|
3742
3872
|
const labelConfiguration = Object.assign(Object.assign({}, DIAGRAM_FIELD_DEFAULTS), (_f = port.type) === null || _f === void 0 ? void 0 : _f.label);
|
|
3743
3873
|
const labelWidth = 6 * labelConfiguration.fontSize + getLeftPadding$1(labelConfiguration) + getRightPadding$1(labelConfiguration);
|
|
@@ -3755,20 +3885,20 @@ class DiagramNodeSet extends DiagramElementSet {
|
|
|
3755
3885
|
default:
|
|
3756
3886
|
labelCoords = port.coords;
|
|
3757
3887
|
}
|
|
3758
|
-
this.model.fields.new(port, labelCoords, labelConfiguration.fontSize, labelConfiguration.fontFamily, labelConfiguration.color, labelConfiguration.selectedColor, labelWidth, labelHeight, labelConfiguration.horizontalAlign, labelConfiguration.verticalAlign, labelConfiguration.orientation, '', labelConfiguration.editable, labelConfiguration.fit);
|
|
3888
|
+
this.model.fields.new(port, labelCoords, labelConfiguration.fontSize, labelConfiguration.fontFamily, labelConfiguration.color, labelConfiguration.selectedColor, labelWidth, labelHeight, labelConfiguration.horizontalAlign, labelConfiguration.verticalAlign, labelConfiguration.orientation, '', labelConfiguration.editable, labelConfiguration.fit, labelConfiguration.shrink);
|
|
3759
3889
|
}
|
|
3760
3890
|
}
|
|
3761
3891
|
}
|
|
3762
3892
|
// add node label
|
|
3763
3893
|
if (nodeType.label) {
|
|
3764
3894
|
const labelConfiguration = Object.assign(Object.assign({}, DIAGRAM_FIELD_DEFAULTS), nodeType.label);
|
|
3765
|
-
this.model.fields.new(node, [node.coords[0] + getLeftMargin(labelConfiguration), node.coords[1] + getTopMargin(labelConfiguration)], labelConfiguration.fontSize, labelConfiguration.fontFamily, labelConfiguration.color, labelConfiguration.selectedColor, node.width - getLeftMargin(labelConfiguration) - getRightMargin(labelConfiguration), node.height - getTopMargin(labelConfiguration) - getBottomMargin(labelConfiguration), labelConfiguration.horizontalAlign, labelConfiguration.verticalAlign, labelConfiguration.orientation, '', labelConfiguration.editable, labelConfiguration.fit);
|
|
3895
|
+
this.model.fields.new(node, [node.coords[0] + getLeftMargin(labelConfiguration), node.coords[1] + getTopMargin(labelConfiguration)], labelConfiguration.fontSize, labelConfiguration.fontFamily, labelConfiguration.color, labelConfiguration.selectedColor, node.width - getLeftMargin(labelConfiguration) - getRightMargin(labelConfiguration), node.height - getTopMargin(labelConfiguration) - getBottomMargin(labelConfiguration), labelConfiguration.horizontalAlign, labelConfiguration.verticalAlign, labelConfiguration.orientation, '', labelConfiguration.editable, labelConfiguration.fit, labelConfiguration.shrink);
|
|
3766
3896
|
}
|
|
3767
3897
|
// add node decorators
|
|
3768
3898
|
if (nodeType.decorators.length > 0) {
|
|
3769
3899
|
for (let i = 0; i < nodeType.decorators.length; ++i) {
|
|
3770
3900
|
const decoratorConfig = nodeType.decorators[i];
|
|
3771
|
-
this.model.decorators.new(node, [node.coords[0] + decoratorConfig.coords[0], node.coords[1] + decoratorConfig.coords[1]], decoratorConfig.width, decoratorConfig.height, node.getPriority(), decoratorConfig.html, `${node.id}_decorator_${i}
|
|
3901
|
+
this.model.decorators.new(node, [node.coords[0] + decoratorConfig.coords[0], node.coords[1] + decoratorConfig.coords[1]], decoratorConfig.width, decoratorConfig.height, node.getPriority(), decoratorConfig.html, `${node.id}_decorator_${i}`, decoratorConfig.anchorPointX || 'floating', decoratorConfig.anchorPointY || 'floating');
|
|
3772
3902
|
}
|
|
3773
3903
|
}
|
|
3774
3904
|
node.valueSet.resetValues();
|
|
@@ -4005,20 +4135,25 @@ class DiagramPort extends DiagramElement {
|
|
|
4005
4135
|
return this._type;
|
|
4006
4136
|
}
|
|
4007
4137
|
set type(type) {
|
|
4008
|
-
this._type
|
|
4009
|
-
|
|
4138
|
+
if (type !== this._type) {
|
|
4139
|
+
this._type = type;
|
|
4140
|
+
this.updateInView();
|
|
4141
|
+
}
|
|
4010
4142
|
}
|
|
4011
4143
|
get typeString() {
|
|
4012
4144
|
var _a;
|
|
4013
4145
|
return (_a = this.type) === null || _a === void 0 ? void 0 : _a.id;
|
|
4014
4146
|
}
|
|
4015
4147
|
set typeString(typeString) {
|
|
4016
|
-
|
|
4017
|
-
|
|
4018
|
-
|
|
4019
|
-
|
|
4020
|
-
|
|
4021
|
-
|
|
4148
|
+
var _a;
|
|
4149
|
+
if (typeString !== ((_a = this.type) === null || _a === void 0 ? void 0 : _a.id)) {
|
|
4150
|
+
if (typeString === undefined) {
|
|
4151
|
+
this.type = undefined;
|
|
4152
|
+
} else {
|
|
4153
|
+
const type = this.model.ports.types.get(typeString);
|
|
4154
|
+
if (type) {
|
|
4155
|
+
this.type = type;
|
|
4156
|
+
}
|
|
4022
4157
|
}
|
|
4023
4158
|
}
|
|
4024
4159
|
}
|
|
@@ -4103,7 +4238,7 @@ class DiagramPort extends DiagramElement {
|
|
|
4103
4238
|
get height() {
|
|
4104
4239
|
return this.width;
|
|
4105
4240
|
}
|
|
4106
|
-
constructor(model, type, rootElement, coords, connectionPoint, direction, id) {
|
|
4241
|
+
constructor(model, type, rootElement, coords, connectionPoint, direction, id, anchorPointX = 'floating', anchorPointY = 'floating') {
|
|
4107
4242
|
if (model.ports.get(id) !== undefined) {
|
|
4108
4243
|
throw new Error(`DiagramPort with id "${id}" already exists`);
|
|
4109
4244
|
}
|
|
@@ -4126,6 +4261,8 @@ class DiagramPort extends DiagramElement {
|
|
|
4126
4261
|
this.coords = coords;
|
|
4127
4262
|
this.connectionPoint = connectionPoint || coords;
|
|
4128
4263
|
this.direction = direction;
|
|
4264
|
+
this.anchorPointX = anchorPointX;
|
|
4265
|
+
this.anchorPointY = anchorPointY;
|
|
4129
4266
|
}
|
|
4130
4267
|
get removed() {
|
|
4131
4268
|
return this.selfRemoved || this.rootElement !== undefined && this.rootElement.removed;
|
|
@@ -4223,8 +4360,8 @@ class DiagramPortSet extends DiagramElementSet {
|
|
|
4223
4360
|
* Instance a new port and add it to this set. This method is normally called when instancing an element with a port and it is rarely called by itself.
|
|
4224
4361
|
* @private
|
|
4225
4362
|
*/
|
|
4226
|
-
new(type, rootElement, coords, connectionPoint, direction, id) {
|
|
4227
|
-
const port = new DiagramPort(this.model, type, rootElement, coords, connectionPoint, direction, id);
|
|
4363
|
+
new(type, rootElement, coords, connectionPoint, direction, id, anchorPointX = 'floating', anchorPointY = 'floating') {
|
|
4364
|
+
const port = new DiagramPort(this.model, type, rootElement, coords, connectionPoint, direction, id, anchorPointX, anchorPointY);
|
|
4228
4365
|
super.add(port);
|
|
4229
4366
|
port.updateInView();
|
|
4230
4367
|
// add this port to its root element
|
|
@@ -4309,7 +4446,7 @@ class DagaImporter {
|
|
|
4309
4446
|
// add node label
|
|
4310
4447
|
if (newNodeType.label) {
|
|
4311
4448
|
const labelConfiguration = Object.assign(Object.assign({}, DIAGRAM_FIELD_DEFAULTS), newNodeType.label);
|
|
4312
|
-
const newField = new DiagramField(model, newNode, [newNode.coords[0] + getLeftMargin(labelConfiguration), newNode.coords[1] + getTopMargin(labelConfiguration)], newNode.width - getLeftMargin(labelConfiguration) - getRightMargin(labelConfiguration), newNode.height - getTopMargin(labelConfiguration) - getBottomMargin(labelConfiguration), labelConfiguration.fontSize, labelConfiguration.fontFamily, labelConfiguration.color, labelConfiguration.selectedColor, labelConfiguration.horizontalAlign, labelConfiguration.verticalAlign, labelConfiguration.orientation, '', labelConfiguration.editable, labelConfiguration.fit);
|
|
4449
|
+
const newField = new DiagramField(model, newNode, [newNode.coords[0] + getLeftMargin(labelConfiguration), newNode.coords[1] + getTopMargin(labelConfiguration)], newNode.width - getLeftMargin(labelConfiguration) - getRightMargin(labelConfiguration), newNode.height - getTopMargin(labelConfiguration) - getBottomMargin(labelConfiguration), labelConfiguration.fontSize, labelConfiguration.fontFamily, labelConfiguration.color, labelConfiguration.selectedColor, labelConfiguration.horizontalAlign, labelConfiguration.verticalAlign, labelConfiguration.orientation, '', labelConfiguration.editable, labelConfiguration.fit, labelConfiguration.shrink);
|
|
4313
4450
|
newField.text = node.label;
|
|
4314
4451
|
newNode.label = newField;
|
|
4315
4452
|
model.fields.add(newField);
|
|
@@ -4331,7 +4468,7 @@ class DagaImporter {
|
|
|
4331
4468
|
// add section label
|
|
4332
4469
|
if ((_f = (_e = (_d = (_c = newNodeType.sectionGrid) === null || _c === void 0 ? void 0 : _c.sections) === null || _d === void 0 ? void 0 : _d[section.indexYInNode]) === null || _e === void 0 ? void 0 : _e[section.indexXInNode]) === null || _f === void 0 ? void 0 : _f.label) {
|
|
4333
4470
|
const labelConfiguration = Object.assign(Object.assign({}, DIAGRAM_FIELD_DEFAULTS), (_k = (_j = (_h = (_g = newNodeType.sectionGrid) === null || _g === void 0 ? void 0 : _g.sections) === null || _h === void 0 ? void 0 : _h[section.indexYInNode]) === null || _j === void 0 ? void 0 : _j[section.indexXInNode]) === null || _k === void 0 ? void 0 : _k.label);
|
|
4334
|
-
const newField = new DiagramField(model, newSection, [newSection.coords[0] + getLeftMargin(labelConfiguration), newSection.coords[1] + getTopMargin(labelConfiguration)], newSection.width - getLeftMargin(labelConfiguration) - getRightMargin(labelConfiguration), newSection.height - getTopMargin(labelConfiguration) - getBottomMargin(labelConfiguration), labelConfiguration.fontSize, labelConfiguration.fontFamily, labelConfiguration.color, labelConfiguration.selectedColor, labelConfiguration.horizontalAlign, labelConfiguration.verticalAlign, labelConfiguration.orientation, '', labelConfiguration.editable, labelConfiguration.fit);
|
|
4471
|
+
const newField = new DiagramField(model, newSection, [newSection.coords[0] + getLeftMargin(labelConfiguration), newSection.coords[1] + getTopMargin(labelConfiguration)], newSection.width - getLeftMargin(labelConfiguration) - getRightMargin(labelConfiguration), newSection.height - getTopMargin(labelConfiguration) - getBottomMargin(labelConfiguration), labelConfiguration.fontSize, labelConfiguration.fontFamily, labelConfiguration.color, labelConfiguration.selectedColor, labelConfiguration.horizontalAlign, labelConfiguration.verticalAlign, labelConfiguration.orientation, '', labelConfiguration.editable, labelConfiguration.fit, labelConfiguration.shrink);
|
|
4335
4472
|
newField.text = section.label;
|
|
4336
4473
|
newSection.label = newField;
|
|
4337
4474
|
model.fields.add(newField);
|
|
@@ -4363,7 +4500,7 @@ class DagaImporter {
|
|
|
4363
4500
|
default:
|
|
4364
4501
|
labelCoords = newPort.coords;
|
|
4365
4502
|
}
|
|
4366
|
-
const newField = new DiagramField(model, newPort, labelCoords, labelConfiguration.fontSize, labelConfiguration.fontSize, labelConfiguration.fontSize, labelConfiguration.fontFamily, labelConfiguration.color, labelConfiguration.selectedColor, labelConfiguration.horizontalAlign, labelConfiguration.verticalAlign, labelConfiguration.orientation, '', labelConfiguration.editable, labelConfiguration.fit);
|
|
4503
|
+
const newField = new DiagramField(model, newPort, labelCoords, labelConfiguration.fontSize, labelConfiguration.fontSize, labelConfiguration.fontSize, labelConfiguration.fontFamily, labelConfiguration.color, labelConfiguration.selectedColor, labelConfiguration.horizontalAlign, labelConfiguration.verticalAlign, labelConfiguration.orientation, '', labelConfiguration.editable, labelConfiguration.fit, labelConfiguration.shrink);
|
|
4367
4504
|
newField.text = port.label;
|
|
4368
4505
|
newPort.label = newField;
|
|
4369
4506
|
model.fields.add(newField);
|
|
@@ -4410,7 +4547,7 @@ class DagaImporter {
|
|
|
4410
4547
|
default:
|
|
4411
4548
|
labelCoords = newPort.coords;
|
|
4412
4549
|
}
|
|
4413
|
-
const newField = new DiagramField(model, newPort, labelCoords, labelConfiguration.fontSize, labelConfiguration.fontSize, labelConfiguration.fontSize, labelConfiguration.fontFamily, labelConfiguration.color, labelConfiguration.selectedColor, labelConfiguration.horizontalAlign, labelConfiguration.verticalAlign, labelConfiguration.orientation, '', labelConfiguration.editable, labelConfiguration.fit);
|
|
4550
|
+
const newField = new DiagramField(model, newPort, labelCoords, labelConfiguration.fontSize, labelConfiguration.fontSize, labelConfiguration.fontSize, labelConfiguration.fontFamily, labelConfiguration.color, labelConfiguration.selectedColor, labelConfiguration.horizontalAlign, labelConfiguration.verticalAlign, labelConfiguration.orientation, '', labelConfiguration.editable, labelConfiguration.fit, labelConfiguration.shrink);
|
|
4414
4551
|
newField.text = port.label;
|
|
4415
4552
|
newPort.label = newField;
|
|
4416
4553
|
model.fields.add(newField);
|
|
@@ -4654,11 +4791,11 @@ class SetGeometryCollabAction {
|
|
|
4654
4791
|
node.setGeometry(this.to);
|
|
4655
4792
|
// Re-fit the labels, in case their text has changed since `this.to` was measured.
|
|
4656
4793
|
if ((_a = node.label) === null || _a === void 0 ? void 0 : _a.fit) {
|
|
4657
|
-
this.canvas.fitFieldRootInView(node.label.id);
|
|
4794
|
+
this.canvas.fitFieldRootInView(node.label.id, node.label.shrink);
|
|
4658
4795
|
}
|
|
4659
4796
|
for (const section of node.sections) {
|
|
4660
4797
|
if ((_b = section.label) === null || _b === void 0 ? void 0 : _b.fit) {
|
|
4661
|
-
this.canvas.fitFieldRootInView(section.label.id);
|
|
4798
|
+
this.canvas.fitFieldRootInView(section.label.id, section.label.shrink);
|
|
4662
4799
|
}
|
|
4663
4800
|
}
|
|
4664
4801
|
(_c = node.parent) === null || _c === void 0 ? void 0 : _c.fitToChild(node);
|
|
@@ -5779,7 +5916,7 @@ class DiagramHighlightedEvent extends DiagramEvent {
|
|
|
5779
5916
|
* @see DiagramSection
|
|
5780
5917
|
*/
|
|
5781
5918
|
class DiagramDecorator extends DiagramElement {
|
|
5782
|
-
constructor(model, rootElement, coords, width, height, priority, html, id) {
|
|
5919
|
+
constructor(model, rootElement, coords, width, height, priority, html, id, anchorPointX = 'floating', anchorPointY = 'floating') {
|
|
5783
5920
|
if (model.objects.get(id) !== undefined) {
|
|
5784
5921
|
throw new Error(`DiagramDecorator with id "${id}" already exists`);
|
|
5785
5922
|
}
|
|
@@ -5793,6 +5930,8 @@ class DiagramDecorator extends DiagramElement {
|
|
|
5793
5930
|
this.height = height;
|
|
5794
5931
|
this.priority = priority;
|
|
5795
5932
|
this.html = html;
|
|
5933
|
+
this.anchorPointX = anchorPointX;
|
|
5934
|
+
this.anchorPointY = anchorPointY;
|
|
5796
5935
|
}
|
|
5797
5936
|
get removed() {
|
|
5798
5937
|
return this.selfRemoved || this.rootElement !== undefined && this.rootElement.removed;
|
|
@@ -5838,8 +5977,8 @@ class DiagramDecoratorSet extends DiagramElementSet {
|
|
|
5838
5977
|
* @param id The id of the decorator. Cannot be an empty string.
|
|
5839
5978
|
* @returns The instanced decorator.
|
|
5840
5979
|
*/
|
|
5841
|
-
new(rootElement, coords, width, height, priority, html, id) {
|
|
5842
|
-
const decorator = new DiagramDecorator(this.model, rootElement, coords, width, height, priority, html, id);
|
|
5980
|
+
new(rootElement, coords, width, height, priority, html, id, anchorPointX = 'floating', anchorPointY = 'floating') {
|
|
5981
|
+
const decorator = new DiagramDecorator(this.model, rootElement, coords, width, height, priority, html, id, anchorPointX, anchorPointY);
|
|
5843
5982
|
super.add(decorator);
|
|
5844
5983
|
decorator.updateInView();
|
|
5845
5984
|
// add this port to its root element
|
|
@@ -6672,11 +6811,15 @@ class DiagramUserSelection extends DiagramElementSet {
|
|
|
6672
6811
|
* Opens the value set of a diagram model or a diagram element in the property editor.
|
|
6673
6812
|
* @public
|
|
6674
6813
|
* @param selection A diagram model or a diagram element with a value set.
|
|
6814
|
+
* @param makeUpdateValuesAction Whether the method should create an UpdateValuesAction.
|
|
6675
6815
|
* @see PropertyEditor
|
|
6816
|
+
* @see UpdateValuesAction
|
|
6676
6817
|
*/
|
|
6677
|
-
openInPropertyEditor(selection) {
|
|
6818
|
+
openInPropertyEditor(selection, makeUpdateValuesAction = true) {
|
|
6678
6819
|
var _a;
|
|
6679
|
-
|
|
6820
|
+
if (makeUpdateValuesAction) {
|
|
6821
|
+
this.makeUpdateValuesAction();
|
|
6822
|
+
}
|
|
6680
6823
|
const propertyEditor = (_a = this.canvas.parentComponent) === null || _a === void 0 ? void 0 : _a.propertyEditor;
|
|
6681
6824
|
if (propertyEditor === undefined) {
|
|
6682
6825
|
return;
|
|
@@ -6684,7 +6827,9 @@ class DiagramUserSelection extends DiagramElementSet {
|
|
|
6684
6827
|
const selectedValueSet = selection === null || selection === void 0 ? void 0 : selection.valueSet;
|
|
6685
6828
|
if (selectedValueSet) {
|
|
6686
6829
|
this.propertyEditorSelection = selection;
|
|
6687
|
-
|
|
6830
|
+
if (makeUpdateValuesAction) {
|
|
6831
|
+
this.propertyEditorValues = structuredClone(selectedValueSet.getValues());
|
|
6832
|
+
}
|
|
6688
6833
|
if (propertyEditor) {
|
|
6689
6834
|
if (selection instanceof DiagramNode || selection instanceof DiagramConnection) {
|
|
6690
6835
|
if (selection instanceof DiagramNode) {
|
|
@@ -6736,6 +6881,26 @@ class DiagramUserSelection extends DiagramElementSet {
|
|
|
6736
6881
|
}
|
|
6737
6882
|
}
|
|
6738
6883
|
|
|
6884
|
+
const degreesToRadians = theta => theta * Math.PI / 180;
|
|
6885
|
+
/**
|
|
6886
|
+
* Calculates the original size of the a rectangle that has been rotated by the given number of degrees resulting in a bounding box of the given size.
|
|
6887
|
+
*
|
|
6888
|
+
* @param width The width of a bounding box.
|
|
6889
|
+
* @param height The height of a bounding box.
|
|
6890
|
+
* @param orientation A rotation in degrees.
|
|
6891
|
+
* @returns The size of the original rectangle.
|
|
6892
|
+
*/
|
|
6893
|
+
const unrotate = (width, height, orientation) => {
|
|
6894
|
+
// TODO: this method fails under certain edge cases
|
|
6895
|
+
// like for example, when angle is 45 degrees so sin(theta) == cos(theta)
|
|
6896
|
+
const theta = degreesToRadians(orientation);
|
|
6897
|
+
const orientationSine = Math.sin(theta);
|
|
6898
|
+
const orientationCosine = Math.cos(theta);
|
|
6899
|
+
const oldWidth = (Math.abs(width * orientationCosine) - Math.abs(height * orientationSine)) / (orientationCosine * orientationCosine - orientationSine * orientationSine);
|
|
6900
|
+
const oldHeight = (Math.abs(width * orientationSine) - Math.abs(height * orientationCosine)) / (orientationSine * orientationSine - orientationCosine * orientationCosine);
|
|
6901
|
+
return [oldWidth, oldHeight];
|
|
6902
|
+
};
|
|
6903
|
+
|
|
6739
6904
|
/**
|
|
6740
6905
|
* Thickness of the invisible path around a connection used to make it easier to click on, in diagram units.
|
|
6741
6906
|
* @private
|
|
@@ -7004,6 +7169,32 @@ class DiagramCanvas {
|
|
|
7004
7169
|
}
|
|
7005
7170
|
});
|
|
7006
7171
|
const canvasView = this.selectSVGElement().append('g').attr('class', 'daga-canvas-view').attr('width', `100%`).attr('height', `100%`);
|
|
7172
|
+
canvasView.call(this.zoomBehavior = d3.zoom().on(ZoomEvents.Zoom, event => {
|
|
7173
|
+
if (event.sourceEvent) {
|
|
7174
|
+
// zoom event was triggered by user
|
|
7175
|
+
if (!this.canUserPerformAction(DiagramActions.Zoom)) {
|
|
7176
|
+
setCursorStyle(CursorStyle.NotAllowed);
|
|
7177
|
+
return;
|
|
7178
|
+
}
|
|
7179
|
+
if (event.sourceEvent.type === Events.Wheel && event.sourceEvent.wheelDelta !== undefined) {
|
|
7180
|
+
if (event.sourceEvent.wheelDelta > 0) {
|
|
7181
|
+
setCursorStyle(CursorStyle.ZoomIn);
|
|
7182
|
+
}
|
|
7183
|
+
if (event.sourceEvent.wheelDelta < 0) {
|
|
7184
|
+
setCursorStyle(CursorStyle.ZoomOut);
|
|
7185
|
+
}
|
|
7186
|
+
} else if (event.sourceEvent.type === Events.MouseMove) {
|
|
7187
|
+
setCursorStyle(CursorStyle.AllScroll);
|
|
7188
|
+
}
|
|
7189
|
+
}
|
|
7190
|
+
this.zoomTransform = event.transform;
|
|
7191
|
+
const transformAttribute = event.transform.toString();
|
|
7192
|
+
this.selectCanvasElements().attr('transform', transformAttribute);
|
|
7193
|
+
d3.select(`#${this.backgroundPatternId}`).attr('patternTransform', transformAttribute);
|
|
7194
|
+
this.contextMenu.close();
|
|
7195
|
+
}).on(ZoomEvents.End, () => {
|
|
7196
|
+
setCursorStyle();
|
|
7197
|
+
}));
|
|
7007
7198
|
canvasView.append('rect').attr('x', 0).attr('y', 0).attr('width', `100%`).attr('height', `100%`).attr('fill', this.backgroundColor).attr('stroke-width', '0').on(Events.MouseMove, event => {
|
|
7008
7199
|
if (this.unfinishedConnection !== undefined) {
|
|
7009
7200
|
const pointerCoords = this.getPointerLocationRelativeToCanvas(event);
|
|
@@ -7034,53 +7225,28 @@ class DiagramCanvas {
|
|
|
7034
7225
|
this.continueMultipleSelection(event);
|
|
7035
7226
|
}).on(DragEvents.End, event => {
|
|
7036
7227
|
this.finishMultipleSelection(event);
|
|
7037
|
-
})).call(this.zoomBehavior = d3.zoom().on(ZoomEvents.Zoom, event => {
|
|
7038
|
-
if (event.sourceEvent) {
|
|
7039
|
-
// zoom event was triggered by user
|
|
7040
|
-
if (!this.canUserPerformAction(DiagramActions.Zoom)) {
|
|
7041
|
-
setCursorStyle(CursorStyle.NotAllowed);
|
|
7042
|
-
return;
|
|
7043
|
-
}
|
|
7044
|
-
if (event.sourceEvent.type === Events.Wheel && event.sourceEvent.wheelDelta !== undefined) {
|
|
7045
|
-
if (event.sourceEvent.wheelDelta > 0) {
|
|
7046
|
-
setCursorStyle(CursorStyle.ZoomIn);
|
|
7047
|
-
}
|
|
7048
|
-
if (event.sourceEvent.wheelDelta < 0) {
|
|
7049
|
-
setCursorStyle(CursorStyle.ZoomOut);
|
|
7050
|
-
}
|
|
7051
|
-
} else if (event.sourceEvent.type === Events.MouseMove) {
|
|
7052
|
-
setCursorStyle(CursorStyle.AllScroll);
|
|
7053
|
-
}
|
|
7054
|
-
}
|
|
7055
|
-
this.zoomTransform = event.transform;
|
|
7056
|
-
const transformAttribute = event.transform.toString();
|
|
7057
|
-
this.selectCanvasElements().attr('transform', transformAttribute);
|
|
7058
|
-
d3.select(`#${this.backgroundPatternId}`).attr('patternTransform', transformAttribute);
|
|
7059
|
-
this.contextMenu.close();
|
|
7060
|
-
}).on(ZoomEvents.End, () => {
|
|
7061
|
-
setCursorStyle();
|
|
7062
7228
|
}));
|
|
7063
7229
|
initializeGrid(this, canvasView, this.backgroundPatternId);
|
|
7064
7230
|
canvasView.append('g').attr('class', 'daga-canvas-elements');
|
|
7065
7231
|
}
|
|
7066
7232
|
zoomBy(factor) {
|
|
7067
7233
|
if (!isNaN(factor)) {
|
|
7068
|
-
this.zoomBehavior.scaleBy(this.selectCanvasView()
|
|
7234
|
+
this.zoomBehavior.scaleBy(this.selectCanvasView(), factor);
|
|
7069
7235
|
}
|
|
7070
7236
|
}
|
|
7071
7237
|
zoomTo(level) {
|
|
7072
7238
|
if (!isNaN(level)) {
|
|
7073
|
-
this.zoomBehavior.scaleTo(this.selectCanvasView()
|
|
7239
|
+
this.zoomBehavior.scaleTo(this.selectCanvasView(), level);
|
|
7074
7240
|
}
|
|
7075
7241
|
}
|
|
7076
7242
|
translateBy(x, y) {
|
|
7077
7243
|
if (!isNaN(x) && !isNaN(y)) {
|
|
7078
|
-
this.zoomBehavior.translateBy(this.selectCanvasView()
|
|
7244
|
+
this.zoomBehavior.translateBy(this.selectCanvasView(), x, y);
|
|
7079
7245
|
}
|
|
7080
7246
|
}
|
|
7081
7247
|
translateTo(x, y) {
|
|
7082
7248
|
if (!isNaN(x) && !isNaN(y)) {
|
|
7083
|
-
this.zoomBehavior.translateTo(this.selectCanvasView()
|
|
7249
|
+
this.zoomBehavior.translateTo(this.selectCanvasView(), x, y);
|
|
7084
7250
|
}
|
|
7085
7251
|
}
|
|
7086
7252
|
center() {
|
|
@@ -7374,8 +7540,8 @@ class DiagramCanvas {
|
|
|
7374
7540
|
let updateSelection = this.selectCanvasElements().selectAll('g.diagram-section').data(this.model.sections.filter(e => this.priorityThreshold !== undefined ? e.getPriority() >= this.priorityThreshold : true), d => d.id);
|
|
7375
7541
|
const exitSelection = updateSelection.exit();
|
|
7376
7542
|
const enterSelection = updateSelection.enter().append('g').attr('id', d => d.id).attr('class', d => {
|
|
7377
|
-
var _a
|
|
7378
|
-
return `diagram-section${
|
|
7543
|
+
var _a;
|
|
7544
|
+
return `diagram-section${d.getResizableX() ? ' resizable-x' : ''}${d.getResizableY() ? ' resizable-y' : ''} ${(_a = d.look) === null || _a === void 0 ? void 0 : _a.lookType}`;
|
|
7379
7545
|
});
|
|
7380
7546
|
if (ids && ids.length > 0) {
|
|
7381
7547
|
updateSelection = updateSelection.filter(d => ids.includes(d.id));
|
|
@@ -7457,32 +7623,27 @@ class DiagramCanvas {
|
|
|
7457
7623
|
}));
|
|
7458
7624
|
initializeLook(enterSelection);
|
|
7459
7625
|
enterSelection.filter('.resizable-x').append('line').attr('class', 'left-resizer').attr('stroke', 'transparent').attr('stroke-width', `${RESIZER_THICKNESS}px`).on(Events.MouseOver, (_event, d) => {
|
|
7460
|
-
|
|
7461
|
-
if (this.canUserPerformAction(DiagramActions.StretchSection) && ((_b = (_a = d.node) === null || _a === void 0 ? void 0 : _a.type) === null || _b === void 0 ? void 0 : _b.resizableX) && !d.removed) {
|
|
7626
|
+
if (this.canUserPerformAction(DiagramActions.StretchSection) && d.getResizableX() && !d.removed) {
|
|
7462
7627
|
setCursorStyle(CursorStyle.EWResize);
|
|
7463
7628
|
}
|
|
7464
7629
|
}).on(Events.MouseOut, (_event, d) => {
|
|
7465
|
-
|
|
7466
|
-
if (this.canUserPerformAction(DiagramActions.StretchSection) && ((_b = (_a = d.node) === null || _a === void 0 ? void 0 : _a.type) === null || _b === void 0 ? void 0 : _b.resizableX) && !d.removed) {
|
|
7630
|
+
if (this.canUserPerformAction(DiagramActions.StretchSection) && d.getResizableX() && !d.removed) {
|
|
7467
7631
|
setCursorStyle();
|
|
7468
7632
|
}
|
|
7469
7633
|
}).call(d3.drag().on(DragEvents.Start, (_event, d) => {
|
|
7470
|
-
|
|
7471
|
-
if (this.canUserPerformAction(DiagramActions.StretchSection) && ((_b = (_a = d.node) === null || _a === void 0 ? void 0 : _a.type) === null || _b === void 0 ? void 0 : _b.resizableX) && !d.removed) {
|
|
7634
|
+
if (this.canUserPerformAction(DiagramActions.StretchSection) && d.getResizableX() && !d.removed && d.node) {
|
|
7472
7635
|
setCursorStyle(CursorStyle.EWResize);
|
|
7473
7636
|
this.currentAction = new SetGeometryAction(this, DiagramActions.StretchSection, d.node.id, d.node.getGeometry(), d.node.getGeometry());
|
|
7474
7637
|
} else {
|
|
7475
7638
|
setCursorStyle(CursorStyle.NotAllowed);
|
|
7476
7639
|
}
|
|
7477
7640
|
}).on(DragEvents.Drag, (event, d) => {
|
|
7478
|
-
|
|
7479
|
-
if (this.canUserPerformAction(DiagramActions.StretchSection) && ((_b = (_a = d.node) === null || _a === void 0 ? void 0 : _a.type) === null || _b === void 0 ? void 0 : _b.resizableX) && !d.removed) {
|
|
7641
|
+
if (this.canUserPerformAction(DiagramActions.StretchSection) && d.getResizableX() && !d.removed && d.node) {
|
|
7480
7642
|
const pointerCoords = this.getPointerLocationRelativeToCanvas(event);
|
|
7481
7643
|
d.node.stretchSections(Side.Left, d.coords[0] - pointerCoords[0], d.indexXInNode, d.indexYInNode);
|
|
7482
7644
|
}
|
|
7483
7645
|
}).on(DragEvents.End, (event, d) => {
|
|
7484
|
-
|
|
7485
|
-
if (this.canUserPerformAction(DiagramActions.StretchSection) && ((_b = (_a = d.node) === null || _a === void 0 ? void 0 : _a.type) === null || _b === void 0 ? void 0 : _b.resizableX) && !d.removed && this.currentAction instanceof SetGeometryAction && this.currentAction.intent === DiagramActions.StretchSection) {
|
|
7646
|
+
if (this.canUserPerformAction(DiagramActions.StretchSection) && d.getResizableX() && !d.removed && this.currentAction instanceof SetGeometryAction && this.currentAction.intent === DiagramActions.StretchSection && d.node) {
|
|
7486
7647
|
let pointerCoords = this.getPointerLocationRelativeToCanvas(event);
|
|
7487
7648
|
if (this.snapToGrid) {
|
|
7488
7649
|
pointerCoords = this.getClosestGridPoint(pointerCoords);
|
|
@@ -7496,32 +7657,27 @@ class DiagramCanvas {
|
|
|
7496
7657
|
setCursorStyle();
|
|
7497
7658
|
}));
|
|
7498
7659
|
enterSelection.filter('.resizable-y').append('line').attr('class', 'top-resizer').attr('stroke', 'transparent').attr('stroke-width', `${RESIZER_THICKNESS}px`).on(Events.MouseOver, (_event, d) => {
|
|
7499
|
-
|
|
7500
|
-
if (this.canUserPerformAction(DiagramActions.StretchSection) && ((_b = (_a = d.node) === null || _a === void 0 ? void 0 : _a.type) === null || _b === void 0 ? void 0 : _b.resizableY) && !d.removed) {
|
|
7660
|
+
if (this.canUserPerformAction(DiagramActions.StretchSection) && d.getResizableY() && !d.removed) {
|
|
7501
7661
|
setCursorStyle(CursorStyle.NSResize);
|
|
7502
7662
|
}
|
|
7503
7663
|
}).on(Events.MouseOut, (_event, d) => {
|
|
7504
|
-
|
|
7505
|
-
if (this.canUserPerformAction(DiagramActions.StretchSection) && ((_b = (_a = d.node) === null || _a === void 0 ? void 0 : _a.type) === null || _b === void 0 ? void 0 : _b.resizableY) && !d.removed) {
|
|
7664
|
+
if (this.canUserPerformAction(DiagramActions.StretchSection) && d.getResizableY() && !d.removed) {
|
|
7506
7665
|
setCursorStyle();
|
|
7507
7666
|
}
|
|
7508
7667
|
}).call(d3.drag().on(DragEvents.Start, (_event, d) => {
|
|
7509
|
-
|
|
7510
|
-
if (this.canUserPerformAction(DiagramActions.StretchSection) && ((_b = (_a = d.node) === null || _a === void 0 ? void 0 : _a.type) === null || _b === void 0 ? void 0 : _b.resizableY) && !d.removed) {
|
|
7668
|
+
if (this.canUserPerformAction(DiagramActions.StretchSection) && d.getResizableY() && !d.removed && d.node) {
|
|
7511
7669
|
setCursorStyle(CursorStyle.NSResize);
|
|
7512
7670
|
this.currentAction = new SetGeometryAction(this, DiagramActions.StretchSection, d.node.id, d.node.getGeometry(), d.node.getGeometry());
|
|
7513
7671
|
} else {
|
|
7514
7672
|
setCursorStyle(CursorStyle.NotAllowed);
|
|
7515
7673
|
}
|
|
7516
7674
|
}).on(DragEvents.Drag, (event, d) => {
|
|
7517
|
-
|
|
7518
|
-
if (this.canUserPerformAction(DiagramActions.StretchSection) && ((_b = (_a = d.node) === null || _a === void 0 ? void 0 : _a.type) === null || _b === void 0 ? void 0 : _b.resizableY) && !d.removed) {
|
|
7675
|
+
if (this.canUserPerformAction(DiagramActions.StretchSection) && d.getResizableY() && !d.removed && d.node) {
|
|
7519
7676
|
const pointerCoords = this.getPointerLocationRelativeToCanvas(event);
|
|
7520
7677
|
d.node.stretchSections(Side.Top, d.coords[1] - pointerCoords[1], d.indexXInNode, d.indexYInNode);
|
|
7521
7678
|
}
|
|
7522
7679
|
}).on(DragEvents.End, (event, d) => {
|
|
7523
|
-
|
|
7524
|
-
if (this.canUserPerformAction(DiagramActions.StretchSection) && ((_b = (_a = d.node) === null || _a === void 0 ? void 0 : _a.type) === null || _b === void 0 ? void 0 : _b.resizableY) && !d.removed && this.currentAction instanceof SetGeometryAction && this.currentAction.intent === DiagramActions.StretchSection) {
|
|
7680
|
+
if (this.canUserPerformAction(DiagramActions.StretchSection) && d.getResizableY() && !d.removed && this.currentAction instanceof SetGeometryAction && this.currentAction.intent === DiagramActions.StretchSection && d.node) {
|
|
7525
7681
|
let pointerCoords = this.getPointerLocationRelativeToCanvas(event);
|
|
7526
7682
|
if (this.snapToGrid) {
|
|
7527
7683
|
pointerCoords = this.getClosestGridPoint(pointerCoords);
|
|
@@ -7535,32 +7691,27 @@ class DiagramCanvas {
|
|
|
7535
7691
|
setCursorStyle();
|
|
7536
7692
|
}));
|
|
7537
7693
|
enterSelection.filter('.resizable-x').append('line').attr('class', 'right-resizer').attr('stroke', 'transparent').attr('stroke-width', `${RESIZER_THICKNESS}px`).on(Events.MouseOver, (_event, d) => {
|
|
7538
|
-
|
|
7539
|
-
if (this.canUserPerformAction(DiagramActions.StretchSection) && ((_b = (_a = d.node) === null || _a === void 0 ? void 0 : _a.type) === null || _b === void 0 ? void 0 : _b.resizableX) && !d.removed) {
|
|
7694
|
+
if (this.canUserPerformAction(DiagramActions.StretchSection) && d.getResizableX() && !d.removed) {
|
|
7540
7695
|
setCursorStyle(CursorStyle.EWResize);
|
|
7541
7696
|
}
|
|
7542
7697
|
}).on(Events.MouseOut, (_event, d) => {
|
|
7543
|
-
|
|
7544
|
-
if (this.canUserPerformAction(DiagramActions.StretchSection) && ((_b = (_a = d.node) === null || _a === void 0 ? void 0 : _a.type) === null || _b === void 0 ? void 0 : _b.resizableX) && !d.removed) {
|
|
7698
|
+
if (this.canUserPerformAction(DiagramActions.StretchSection) && d.getResizableX() && !d.removed) {
|
|
7545
7699
|
setCursorStyle();
|
|
7546
7700
|
}
|
|
7547
7701
|
}).call(d3.drag().on(DragEvents.Start, (_event, d) => {
|
|
7548
|
-
|
|
7549
|
-
if (this.canUserPerformAction(DiagramActions.StretchSection) && ((_b = (_a = d.node) === null || _a === void 0 ? void 0 : _a.type) === null || _b === void 0 ? void 0 : _b.resizableX) && !d.removed) {
|
|
7702
|
+
if (this.canUserPerformAction(DiagramActions.StretchSection) && d.getResizableX() && !d.removed && d.node) {
|
|
7550
7703
|
setCursorStyle(CursorStyle.EWResize);
|
|
7551
7704
|
this.currentAction = new SetGeometryAction(this, DiagramActions.StretchSection, d.node.id, d.node.getGeometry(), d.node.getGeometry());
|
|
7552
7705
|
} else {
|
|
7553
7706
|
setCursorStyle(CursorStyle.NotAllowed);
|
|
7554
7707
|
}
|
|
7555
7708
|
}).on(DragEvents.Drag, (event, d) => {
|
|
7556
|
-
|
|
7557
|
-
if (this.canUserPerformAction(DiagramActions.StretchSection) && ((_b = (_a = d.node) === null || _a === void 0 ? void 0 : _a.type) === null || _b === void 0 ? void 0 : _b.resizableX) && !d.removed) {
|
|
7709
|
+
if (this.canUserPerformAction(DiagramActions.StretchSection) && d.getResizableX() && !d.removed && d.node) {
|
|
7558
7710
|
const pointerCoords = this.getPointerLocationRelativeToCanvas(event);
|
|
7559
7711
|
d.node.stretchSections(Side.Right, pointerCoords[0] - (d.coords[0] + d.width), d.indexXInNode, d.indexYInNode);
|
|
7560
7712
|
}
|
|
7561
7713
|
}).on(DragEvents.End, (event, d) => {
|
|
7562
|
-
|
|
7563
|
-
if (this.canUserPerformAction(DiagramActions.StretchSection) && ((_b = (_a = d.node) === null || _a === void 0 ? void 0 : _a.type) === null || _b === void 0 ? void 0 : _b.resizableX) && !d.removed && this.currentAction instanceof SetGeometryAction && this.currentAction.intent === DiagramActions.StretchSection) {
|
|
7714
|
+
if (this.canUserPerformAction(DiagramActions.StretchSection) && d.getResizableX() && !d.removed && this.currentAction instanceof SetGeometryAction && this.currentAction.intent === DiagramActions.StretchSection && d.node) {
|
|
7564
7715
|
let pointerCoords = this.getPointerLocationRelativeToCanvas(event);
|
|
7565
7716
|
if (this.snapToGrid) {
|
|
7566
7717
|
pointerCoords = this.getClosestGridPoint(pointerCoords);
|
|
@@ -7574,32 +7725,27 @@ class DiagramCanvas {
|
|
|
7574
7725
|
setCursorStyle();
|
|
7575
7726
|
}));
|
|
7576
7727
|
enterSelection.filter('.resizable-y').append('line').attr('class', 'bottom-resizer').attr('stroke', 'transparent').attr('stroke-width', `${RESIZER_THICKNESS}px`).on(Events.MouseOver, (_event, d) => {
|
|
7577
|
-
|
|
7578
|
-
if (this.canUserPerformAction(DiagramActions.StretchSection) && ((_b = (_a = d.node) === null || _a === void 0 ? void 0 : _a.type) === null || _b === void 0 ? void 0 : _b.resizableY) && !d.removed) {
|
|
7728
|
+
if (this.canUserPerformAction(DiagramActions.StretchSection) && d.getResizableY() && !d.removed) {
|
|
7579
7729
|
setCursorStyle(CursorStyle.NSResize);
|
|
7580
7730
|
}
|
|
7581
7731
|
}).on(Events.MouseOut, (_event, d) => {
|
|
7582
|
-
|
|
7583
|
-
if (this.canUserPerformAction(DiagramActions.StretchSection) && ((_b = (_a = d.node) === null || _a === void 0 ? void 0 : _a.type) === null || _b === void 0 ? void 0 : _b.resizableY) && !d.removed) {
|
|
7732
|
+
if (this.canUserPerformAction(DiagramActions.StretchSection) && d.getResizableY() && !d.removed) {
|
|
7584
7733
|
setCursorStyle();
|
|
7585
7734
|
}
|
|
7586
7735
|
}).call(d3.drag().on(DragEvents.Start, (_event, d) => {
|
|
7587
|
-
|
|
7588
|
-
if (this.canUserPerformAction(DiagramActions.StretchSection) && ((_b = (_a = d.node) === null || _a === void 0 ? void 0 : _a.type) === null || _b === void 0 ? void 0 : _b.resizableY) && !d.removed) {
|
|
7736
|
+
if (this.canUserPerformAction(DiagramActions.StretchSection) && d.getResizableY() && !d.removed && d.node) {
|
|
7589
7737
|
setCursorStyle(CursorStyle.NSResize);
|
|
7590
7738
|
this.currentAction = new SetGeometryAction(this, DiagramActions.StretchSection, d.node.id, d.node.getGeometry(), d.node.getGeometry());
|
|
7591
7739
|
} else {
|
|
7592
7740
|
setCursorStyle(CursorStyle.NotAllowed);
|
|
7593
7741
|
}
|
|
7594
7742
|
}).on(DragEvents.Drag, (event, d) => {
|
|
7595
|
-
|
|
7596
|
-
if (this.canUserPerformAction(DiagramActions.StretchSection) && ((_b = (_a = d.node) === null || _a === void 0 ? void 0 : _a.type) === null || _b === void 0 ? void 0 : _b.resizableY) && !d.removed) {
|
|
7743
|
+
if (this.canUserPerformAction(DiagramActions.StretchSection) && d.getResizableY() && !d.removed && d.node) {
|
|
7597
7744
|
const pointerCoords = this.getPointerLocationRelativeToCanvas(event);
|
|
7598
7745
|
d.node.stretchSections(Side.Bottom, pointerCoords[1] - (d.coords[1] + d.height), d.indexXInNode, d.indexYInNode);
|
|
7599
7746
|
}
|
|
7600
7747
|
}).on(DragEvents.End, (event, d) => {
|
|
7601
|
-
|
|
7602
|
-
if (this.canUserPerformAction(DiagramActions.StretchSection) && ((_b = (_a = d.node) === null || _a === void 0 ? void 0 : _a.type) === null || _b === void 0 ? void 0 : _b.resizableY) && !d.removed && this.currentAction instanceof SetGeometryAction && this.currentAction.intent === DiagramActions.StretchSection) {
|
|
7748
|
+
if (this.canUserPerformAction(DiagramActions.StretchSection) && d.getResizableY() && !d.removed && this.currentAction instanceof SetGeometryAction && this.currentAction.intent === DiagramActions.StretchSection && d.node) {
|
|
7603
7749
|
let pointerCoords = this.getPointerLocationRelativeToCanvas(event);
|
|
7604
7750
|
if (this.snapToGrid) {
|
|
7605
7751
|
pointerCoords = this.getClosestGridPoint(pointerCoords);
|
|
@@ -7916,7 +8062,7 @@ class DiagramCanvas {
|
|
|
7916
8062
|
this.diagramEvent$.next(diagramEvent);
|
|
7917
8063
|
if (!diagramEvent.defaultPrevented && this.canUserPerformAction(DiagramActions.EditField) && d.editable && !d.removed) {
|
|
7918
8064
|
this.currentAction = new EditFieldAction(this, d.id, d.text, '');
|
|
7919
|
-
this.createInputField(d.text, d.coords, d.width, d.height, d.fontSize, d.fontFamily || DIAGRAM_FIELD_DEFAULTS.fontFamily, d.orientation,
|
|
8065
|
+
this.createInputField(d.text, d.coords, d.width, d.height, d.fontSize, d.fontFamily || DIAGRAM_FIELD_DEFAULTS.fontFamily, d.orientation, _text => {
|
|
7920
8066
|
/*
|
|
7921
8067
|
Empty for now
|
|
7922
8068
|
We should create a better function to stretch the root element as the text expands
|
|
@@ -7985,24 +8131,7 @@ class DiagramCanvas {
|
|
|
7985
8131
|
}
|
|
7986
8132
|
this.secondaryButton = false;
|
|
7987
8133
|
})).append('xhtml:div').style('width', '100%').style('height', '100%').style('display', 'flex').append('xhtml:p').style('box-sizing', 'border-box').style('outline', 0).style('margin', 0).style('border', 0).style('padding', 0).style('user-select', 'none').style('font-kerning', 'none').style('white-space', 'nowrap');
|
|
7988
|
-
mergeSelection.attr('x', 0).attr('y', 0).attr('width', d => `${d.width}px`).attr('height', d => `${d.height}px`).attr('transform', d => `translate(${d.coords[0]},${d.coords[1]})`).attr('opacity', d => d.removed ? 0.5 : 1).select('div').style('justify-content', d => d.horizontalAlign === HorizontalAlign.Center ? 'center' : d.horizontalAlign === HorizontalAlign.Right ? 'flex-end' : 'flex-start').style('align-items', d => d.verticalAlign === VerticalAlign.Center ? 'center' : d.verticalAlign === VerticalAlign.Bottom ? 'end' : 'start').select('p').style('max-width', d => d.fit ? 'default' :
|
|
7989
|
-
if (!isNaN(Number(d.orientation))) {
|
|
7990
|
-
return `rotate(${d.orientation}deg)`;
|
|
7991
|
-
} else {
|
|
7992
|
-
switch (d.orientation) {
|
|
7993
|
-
case Side.Top:
|
|
7994
|
-
return 'rotate(0deg)';
|
|
7995
|
-
case Side.Right:
|
|
7996
|
-
return 'rotate(90deg)';
|
|
7997
|
-
case Side.Bottom:
|
|
7998
|
-
return 'rotate(180deg)';
|
|
7999
|
-
case Side.Left:
|
|
8000
|
-
return 'rotate(270deg)';
|
|
8001
|
-
default:
|
|
8002
|
-
return 'rotate(0deg)';
|
|
8003
|
-
}
|
|
8004
|
-
}
|
|
8005
|
-
}).style('font-size', d => `${d.fontSize}px`).style('font-family', d => d.fontFamily || "'Wonder Unit Sans', sans-serif").style('font-weight', d => d.highlighted ? 600 : 400).style('color', d => d.selected ? d.selectedColor || '#000000' : d.color || '#000000').html(d => d.text.replace(/</g, '<').replace(/>/g, '>').replace(/\n/g, '<br/>'));
|
|
8134
|
+
mergeSelection.attr('x', 0).attr('y', 0).attr('width', d => `${d.width}px`).attr('height', d => `${d.height}px`).attr('transform', d => `translate(${d.coords[0]},${d.coords[1]})`).attr('opacity', d => d.removed ? 0.5 : 1).select('div').style('justify-content', d => d.horizontalAlign === HorizontalAlign.Center ? 'center' : d.horizontalAlign === HorizontalAlign.Right ? 'flex-end' : 'flex-start').style('align-items', d => d.verticalAlign === VerticalAlign.Center ? 'center' : d.verticalAlign === VerticalAlign.Bottom ? 'end' : 'start').select('p').style('max-width', d => d.fit ? 'default' : `${unrotate(d.width, d.height, d.orientation)[0]}px`).style('max-height', d => d.fit ? 'default' : `${unrotate(d.width, d.height, d.orientation)[1]}px`).style('overflow', d => d.fit ? 'default' : 'clip').style('text-overflow', d => d.fit ? 'default' : 'ellipsis').style('text-align', d => d.horizontalAlign === HorizontalAlign.Center ? 'center' : d.horizontalAlign === HorizontalAlign.Right ? 'end' : 'start').style('transform', d => `rotate(${d.orientation}deg)`).style('font-size', d => `${d.fontSize}px`).style('font-family', d => d.fontFamily || "'Wonder Unit Sans', sans-serif").style('font-weight', d => d.highlighted ? 600 : 400).style('color', d => d.selected ? d.selectedColor || '#000000' : d.color || '#000000').html(d => d.text.replace(/</g, '<').replace(/>/g, '>').replace(/\n/g, '<br/>'));
|
|
8006
8135
|
}
|
|
8007
8136
|
updateObjectsInView(...ids) {
|
|
8008
8137
|
let updateSelection = this.selectCanvasElements().selectAll('foreignObject.diagram-object').data(this.model.objects.filter(e => this.priorityThreshold !== undefined ? e.getPriority() >= this.priorityThreshold : true), d => d.id);
|
|
@@ -8222,7 +8351,7 @@ class DiagramCanvas {
|
|
|
8222
8351
|
}
|
|
8223
8352
|
return true;
|
|
8224
8353
|
}
|
|
8225
|
-
fitFieldRootInView(id, shrink) {
|
|
8354
|
+
fitFieldRootInView(id, shrink = true) {
|
|
8226
8355
|
var _a, _b, _c;
|
|
8227
8356
|
const field = this.model.fields.get(id);
|
|
8228
8357
|
if (!field) {
|
|
@@ -8283,15 +8412,15 @@ class DiagramCanvas {
|
|
|
8283
8412
|
if (field.rootElement.height + stretchY < (field.rootElement.getMinHeight() || 0)) {
|
|
8284
8413
|
stretchY = (field.rootElement.getMinHeight() || 0) - field.rootElement.height;
|
|
8285
8414
|
}
|
|
8286
|
-
if (shrink
|
|
8415
|
+
if (shrink || stretchX > 0) {
|
|
8287
8416
|
(_b = field.rootElement.node) === null || _b === void 0 ? void 0 : _b.stretchSections(Side.Right, stretchX, field.rootElement.indexXInNode, field.rootElement.indexYInNode);
|
|
8288
8417
|
}
|
|
8289
|
-
if (shrink
|
|
8418
|
+
if (shrink || stretchY > 0) {
|
|
8290
8419
|
(_c = field.rootElement.node) === null || _c === void 0 ? void 0 : _c.stretchSections(Side.Bottom, stretchY, field.rootElement.indexXInNode, field.rootElement.indexYInNode);
|
|
8291
8420
|
}
|
|
8292
8421
|
}
|
|
8293
8422
|
}
|
|
8294
|
-
fitNodeInView(id) {
|
|
8423
|
+
fitNodeInView(id, shrink = true) {
|
|
8295
8424
|
var _a, _b;
|
|
8296
8425
|
const node = this.model.nodes.get(id);
|
|
8297
8426
|
if (!node) {
|
|
@@ -8312,8 +8441,12 @@ class DiagramCanvas {
|
|
|
8312
8441
|
// add the margin that goes between the rightmost and bottommost points of the sections and the edge of the node
|
|
8313
8442
|
newNodeWidth += ((_a = node.type.sectionGrid) === null || _a === void 0 ? void 0 : _a.margin) || 0;
|
|
8314
8443
|
newNodeHeight += ((_b = node.type.sectionGrid) === null || _b === void 0 ? void 0 : _b.margin) || 0;
|
|
8315
|
-
|
|
8316
|
-
|
|
8444
|
+
if (shrink || newNodeWidth > node.width) {
|
|
8445
|
+
node.stretch(Side.Right, newNodeWidth - node.width);
|
|
8446
|
+
}
|
|
8447
|
+
if (shrink || newNodeHeight > node.height) {
|
|
8448
|
+
node.stretch(Side.Bottom, newNodeHeight - node.height);
|
|
8449
|
+
}
|
|
8317
8450
|
}
|
|
8318
8451
|
}
|
|
8319
8452
|
selectRoot() {
|
|
@@ -9156,7 +9289,7 @@ class ForceLayout {
|
|
|
9156
9289
|
return model;
|
|
9157
9290
|
}
|
|
9158
9291
|
// as a starting point, we apply a simple layout
|
|
9159
|
-
new BreadthLayout().apply(model);
|
|
9292
|
+
new BreadthLayout(this.gapSize).apply(model);
|
|
9160
9293
|
const gapSize = this.gapSize !== undefined ? this.gapSize : (((_a = model.canvas) === null || _a === void 0 ? void 0 : _a.gridSize) || 0) * 2;
|
|
9161
9294
|
const coolingFactor = 0.99;
|
|
9162
9295
|
const minimumTemperature = 1;
|
|
@@ -9283,7 +9416,7 @@ class PriorityLayout {
|
|
|
9283
9416
|
const minimumPriority = Math.min(...model.nodes.map(n => n.getPriority()));
|
|
9284
9417
|
if (maximumPriority === minimumPriority) {
|
|
9285
9418
|
// if there's no disparity in priorities, just use breadth layout
|
|
9286
|
-
new BreadthLayout().apply(model);
|
|
9419
|
+
new BreadthLayout(this.gapSize).apply(model);
|
|
9287
9420
|
return model;
|
|
9288
9421
|
}
|
|
9289
9422
|
const gapSize = this.gapSize !== undefined ? this.gapSize : (((_a = model.canvas) === null || _a === void 0 ? void 0 : _a.gridSize) || 0) * 2;
|
|
@@ -9393,7 +9526,7 @@ class TreeLayout {
|
|
|
9393
9526
|
const minimumPriority = Math.min(...model.nodes.map(n => n.getPriority()));
|
|
9394
9527
|
if (maximumPriority === minimumPriority) {
|
|
9395
9528
|
// if there's no disparity in priorities, just use breadth layout
|
|
9396
|
-
new BreadthLayout().apply(model);
|
|
9529
|
+
new BreadthLayout(this.gapSize).apply(model);
|
|
9397
9530
|
return model;
|
|
9398
9531
|
}
|
|
9399
9532
|
const gapSize = this.gapSize !== undefined ? this.gapSize : (((_a = model.canvas) === null || _a === void 0 ? void 0 : _a.gridSize) || 0) * 2;
|