Skip to content

Commit 4c5eaf5

Browse files
committed
upd linked-blocks
1 parent 7cceb8c commit 4c5eaf5

File tree

7 files changed

+134
-216
lines changed

7 files changed

+134
-216
lines changed

examples/linked-block.html

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
<title>Linked Block - Metro UI :: Popular HTML, CSS and JS library</title>
1010
<style>
11-
.linked-block {
11+
.linked-block-content {
1212
display: flex;
1313
justify-content: center;
1414
align-items: center;
@@ -20,8 +20,9 @@
2020
<div class="app-bar-item-static no-hover">
2121
<div class="text-leader">Linked Block</div>
2222
</div>
23-
<div class="app-bar-container" style="position: absolute; left: 50%; transform: translateX(-50%);">
23+
<div class="app-bar-container gap-2" style="position: absolute; left: 50%; transform: translateX(-50%);">
2424
<button onclick="createBlock()">Create Block</button>
25+
<button onclick="addBlock()">Add Block</button>
2526
</div>
2627
<div class="app-bar-item-static no-hover ml-auto">
2728
<input type="checkbox" data-role="theme-switcher"/>
@@ -58,6 +59,10 @@
5859
type: "curve"
5960
})
6061
}
62+
63+
function addBlock(){
64+
65+
}
6166
</script>
6267
</body>
6368
</html>

lib/metro.css

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66529,6 +66529,10 @@ label:has(input) {
6652966529
top: 50%;
6653066530
transform: translateY(-50%);
6653166531
}
66532+
.linked-block .linked-block-content {
66533+
position: absolute;
66534+
inset: 4px;
66535+
}
6653266536
.connection-line {
6653366537
position: absolute;
6653466538
top: 0;

lib/metro.css.map

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/metro.js

Lines changed: 49 additions & 97 deletions
Original file line numberDiff line numberDiff line change
@@ -30802,8 +30802,8 @@
3080230802
},
3080330803
onLinkedBlockCreate: Metro2.noop,
3080430804
onLinkedBlockDestroy: Metro2.noop,
30805-
onPointAdd: Metro2.noop,
30806-
onPointRemove: Metro2.noop,
30805+
onAddPoint: Metro2.noop,
30806+
onRemovePoint: Metro2.noop,
3080730807
onConnect: Metro2.noop,
3080830808
onDisconnect: Metro2.noop,
3080930809
onDragStart: Metro2.noop,
@@ -30853,8 +30853,14 @@
3085330853
if (o2.minHeight) element2.css("min-height", o2.minHeight);
3085430854
if (o2.maxWidth) element2.css("max-width", o2.maxWidth);
3085530855
if (o2.maxHeight) element2.css("max-height", o2.maxHeight);
30856+
const _content = element2.innerHTML;
30857+
let contentContainer = element2.find(".linked-block-content");
30858+
if (contentContainer.length === 0) {
30859+
contentContainer = $7("<div>").addClass("linked-block-content");
30860+
element2.append(contentContainer);
30861+
}
30862+
contentContainer.html(_content || o2.content);
3085630863
this._createSides();
30857-
this._createContent();
3085830864
if (o2.showAddButtons) {
3085930865
this._createAddButtons();
3086030866
}
@@ -30872,50 +30878,6 @@
3087230878
element2.append(sideElement);
3087330879
});
3087430880
},
30875-
_createContent: function() {
30876-
const element2 = this.element;
30877-
const o2 = this.options;
30878-
let contentContainer = element2.find(".block-content");
30879-
if (contentContainer.length === 0) {
30880-
contentContainer = $7("<div>").addClass("block-content").css({
30881-
position: "absolute",
30882-
top: "50%",
30883-
left: "50%",
30884-
transform: "translate(-50%, -50%)",
30885-
pointerEvents: "none",
30886-
zIndex: 1,
30887-
display: "flex",
30888-
alignItems: "center",
30889-
justifyContent: "center",
30890-
width: "calc(100% - 20px)",
30891-
height: "calc(100% - 20px)",
30892-
textAlign: "center"
30893-
});
30894-
element2.append(contentContainer);
30895-
}
30896-
if (o2.content) {
30897-
contentContainer.html(o2.content);
30898-
} else if (element2.text().trim() && !element2.find(".side").length) {
30899-
const existingContent = element2.html();
30900-
element2.empty();
30901-
this._createSides();
30902-
contentContainer = $7("<div>").addClass("block-content").css({
30903-
position: "absolute",
30904-
top: "50%",
30905-
left: "50%",
30906-
transform: "translate(-50%, -50%)",
30907-
pointerEvents: "none",
30908-
zIndex: 1,
30909-
display: "flex",
30910-
alignItems: "center",
30911-
justifyContent: "center",
30912-
width: "calc(100% - 20px)",
30913-
height: "calc(100% - 20px)",
30914-
textAlign: "center"
30915-
}).html(existingContent);
30916-
element2.append(contentContainer);
30917-
}
30918-
},
3091930881
_createInitialPoints: function() {
3092030882
const o2 = this.options;
3092130883
Object.keys(o2.initialPoints).forEach((side) => {
@@ -30956,39 +30918,25 @@
3095630918
self.addPoint(side);
3095730919
});
3095830920
}
30959-
element2.on("dblclick.linked-block", (e2) => {
30960-
e2.preventDefault();
30961-
const rect = element2[0].getBoundingClientRect();
30962-
const x5 = e2.clientX - rect.left;
30963-
const y4 = e2.clientY - rect.top;
30964-
const side = self._getSideFromCoordinates(x5, y4, rect.width, rect.height);
30965-
self.addPoint(side);
30966-
});
30967-
element2.on("contextmenu.linked-block", ".link-point", function(e2) {
30968-
e2.preventDefault();
30969-
const pointId = $7(this).attr("id");
30970-
self.removePoint(pointId);
30971-
});
3097230921
},
3097330922
_setupDraggable: function() {
3097430923
const element2 = this.element;
3097530924
const o2 = this.options;
30976-
const self = this;
3097730925
if (o2.draggable) {
3097830926
Metro2.makePlugin(element2, "draggable", {
3097930927
onDragStart: () => {
3098030928
const { top, left } = element2.rect();
3098130929
Metro2.utils.exec(o2.onDragStart, [{ top, left }, element2]);
3098230930
},
3098330931
onDragMove: () => {
30984-
self.hoverButtons.forEach((btn) => btn.hide());
30985-
self._updateConnections();
30932+
this.hoverButtons.forEach((btn) => btn.hide());
30933+
this._updateConnections();
3098630934
const { top, left } = element2.rect();
3098730935
Metro2.utils.exec(o2.onDragMove, [{ top, left }, element2]);
3098830936
},
3098930937
onDragStop: () => {
30990-
self.hoverButtons.forEach((btn) => btn.show());
30991-
self._updateConnections();
30938+
this.hoverButtons.forEach((btn) => btn.show());
30939+
this._updateConnections();
3099230940
const { top, left } = element2.rect();
3099330941
Metro2.utils.exec(o2.onDragStop, [{ top, left }, element2]);
3099430942
}
@@ -31041,6 +30989,7 @@
3104130989
// Публічні методи
3104230990
addPoint: function(side) {
3104330991
const element2 = this.element;
30992+
const o2 = this.options;
3104430993
const validSides = ["north", "east", "south", "west"];
3104530994
if (validSides.indexOf(side) === -1) {
3104630995
console.warn("LinkedBlock: \u043D\u0435\u0432\u0456\u0440\u043D\u0430 \u0441\u0442\u043E\u0440\u043E\u043D\u0430. \u0414\u043E\u0441\u0442\u0443\u043F\u043D\u0456: north, east, south, west");
@@ -31050,7 +30999,8 @@
3105030999
const point = $7("<div>").addClass("link-point").attr("id", pointId).attr("data-side", side);
3105131000
const sideElement = element2.find(`.${side}-side`);
3105231001
sideElement.append(point);
31053-
this._fireEvent("point-add", {
31002+
Metro2.utils.exec(o2.onAddPoint, [point[0], side, pointId, element2[0]], element2[0]);
31003+
this._fireEvent("add-point", {
3105431004
element: element2,
3105531005
point,
3105631006
side,
@@ -31060,14 +31010,16 @@
3106031010
},
3106131011
removePoint: function(pointId) {
3106231012
const element2 = this.element;
31013+
const o2 = this.options;
3106331014
const point = element2.find(`#${pointId}`);
3106431015
if (point.length === 0) {
3106531016
return false;
3106631017
}
3106731018
this.disconnectPoint(pointId);
3106831019
const side = point.attr("data-side");
31020+
Metro2.utils.exec(o2.onRemovePoint, [point[0], side, pointId, element2[0]], element2[0]);
3106931021
point.remove();
31070-
this._fireEvent("point-remove", {
31022+
this._fireEvent("remove-point", {
3107131023
element: element2,
3107231024
pointId,
3107331025
side
@@ -31083,6 +31035,7 @@
3108331035
},
3108431036
connect: function(targetBlock, options = {}) {
3108531037
const element2 = this.element;
31038+
const o2 = this.options;
3108631039
const target = $7(targetBlock);
3108731040
if (target.length === 0) {
3108831041
console.warn("LinkedBlock: \u0446\u0456\u043B\u044C\u043E\u0432\u0438\u0439 \u0431\u043B\u043E\u043A \u043D\u0435 \u0437\u043D\u0430\u0439\u0434\u0435\u043D\u043E");
@@ -31109,20 +31062,25 @@
3110931062
connector,
3111031063
options
3111131064
});
31065+
Metro2.utils.exec(
31066+
o2.onConnect,
31067+
[target[0], sourcePoint[0], targetPoint[0], connector.element[0]],
31068+
element2[0]
31069+
);
3111231070
this._fireEvent("connect", {
31113-
element: element2,
31114-
target,
31115-
sourcePoint,
31116-
targetPoint,
31117-
connector,
31071+
element: element2[0],
31072+
target: target[0],
31073+
sourcePoint: sourcePoint[0],
31074+
targetPoint: targetPoint[0],
31075+
connector: connector.element[0],
3111831076
connectionId
3111931077
});
3112031078
this._updateConnections();
3112131079
return {
3112231080
id: connectionId,
31123-
connector,
31124-
sourcePoint,
31125-
targetPoint
31081+
connector: connector.element[0],
31082+
sourcePoint: sourcePoint[0],
31083+
targetPoint: targetPoint[0]
3112631084
};
3112731085
}
3112831086
this._updateConnections();
@@ -31160,48 +31118,42 @@
3116031118
},
3116131119
setContent: function(content) {
3116231120
const element2 = this.element;
31163-
let contentContainer = element2.find(".block-content");
31164-
if (contentContainer.length === 0) {
31165-
this._createContent();
31166-
contentContainer = element2.find(".block-content");
31167-
}
31121+
const contentContainer = element2.find(".linked-block-content");
3116831122
contentContainer.html(content);
3116931123
this.options.content = content;
3117031124
},
3117131125
getContent: function() {
3117231126
const element2 = this.element;
31173-
const contentContainer = element2.find(".block-content");
31127+
const contentContainer = element2.find(".linked-block-content");
3117431128
return contentContainer.length ? contentContainer.html() : "";
3117531129
},
3117631130
getConnections: function() {
3117731131
return Array.from(this.connections.values());
3117831132
},
31179-
changeAttribute: function(attr, newValue) {
31133+
changeAttribute: function(attr, val) {
3118031134
const o2 = this.options;
31181-
switch (attr) {
31182-
case "data-draggable":
31183-
o2.draggable = Metro2.utils.isValue(newValue);
31184-
this._setupDraggable();
31185-
break;
31186-
case "data-resizable":
31187-
o2.resizable = Metro2.utils.isValue(newValue);
31188-
this._setupResizable();
31189-
break;
31190-
case "data-content":
31191-
this.setContent(newValue);
31192-
break;
31193-
}
3119431135
},
3119531136
destroy: function() {
3119631137
const element2 = this.element;
31138+
const o2 = this.options;
3119731139
this.disconnectAll();
31198-
element2.off(".linked-block");
31140+
element2.off("mouseenter.linked-block");
31141+
element2.off("mouseleave.linked-block");
31142+
element2.off("click.linked-block");
3119931143
this.hoverButtons.forEach((btn) => btn.remove());
3120031144
this.hoverButtons = [];
3120131145
this._fireEvent("linked-block-destroy", {
3120231146
element: element2
3120331147
});
31204-
return element2;
31148+
if (o2.draggable) {
31149+
const draggable = Metro2.getPlugin(element2, "draggable");
31150+
draggable.destroy();
31151+
}
31152+
if (o2.resizable) {
31153+
const resizable = Metro2.getPlugin(element2, "resizable");
31154+
resizable.destroy();
31155+
}
31156+
element2.remove();
3120531157
}
3120631158
});
3120731159
Metro2.linkedBlock = {

lib/metro.js.map

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)