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,
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 }
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 }
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");
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
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 = {
0 commit comments