@sequent-org/moodboard 1.2.15 → 1.2.16
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/package.json +1 -1
- package/src/tools/object-tools/SelectTool.js +11 -6
- package/src/ui/CommentPopover.js +2 -1
- package/src/ui/ContextMenu.js +2 -1
- package/src/ui/FramePropertiesPanel.js +2 -1
- package/src/ui/HtmlHandlesLayer.js +3 -2
- package/src/ui/MapPanel.js +4 -1
- package/src/ui/NotePropertiesPanel.js +4 -2
- package/src/ui/TextPropertiesPanel.js +5 -3
- package/src/ui/Toolbar.js +4 -1
- package/src/ui/ZoomPanel.js +2 -0
package/package.json
CHANGED
|
@@ -135,9 +135,15 @@ export class SelectTool extends BaseTool {
|
|
|
135
135
|
// Обработка удаления объектов (undo создания, delete команды и т.д.)
|
|
136
136
|
this.eventBus.on(Events.Object.Deleted, (data) => {
|
|
137
137
|
const objectId = data?.objectId || data;
|
|
138
|
-
console.log('🗑️ SelectTool: получено событие удаления объекта:', objectId);
|
|
138
|
+
console.log('🗑️ SelectTool: получено событие удаления объекта:', objectId, 'данные:', data);
|
|
139
139
|
|
|
140
|
-
|
|
140
|
+
// ЗАЩИТА: Проверяем что данные валидны
|
|
141
|
+
if (!objectId) {
|
|
142
|
+
console.warn('⚠️ SelectTool: получено событие удаления с невалидным objectId');
|
|
143
|
+
return;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
if (this.selection.has(objectId)) {
|
|
141
147
|
console.log('🗑️ SelectTool: удаляем объект из selection:', objectId);
|
|
142
148
|
this.removeFromSelection(objectId);
|
|
143
149
|
|
|
@@ -147,10 +153,9 @@ export class SelectTool extends BaseTool {
|
|
|
147
153
|
this.emit(Events.Tool.SelectionClear);
|
|
148
154
|
this.updateResizeHandles();
|
|
149
155
|
}
|
|
150
|
-
} else
|
|
151
|
-
console.log('🗑️ SelectTool: объект не был в selection,
|
|
152
|
-
//
|
|
153
|
-
// Принудительно обновляем ручки
|
|
156
|
+
} else {
|
|
157
|
+
console.log('🗑️ SelectTool: объект не был в selection, обновляем ручки на всякий случай');
|
|
158
|
+
// Принудительно обновляем ручки без излишних действий
|
|
154
159
|
this.updateResizeHandles();
|
|
155
160
|
}
|
|
156
161
|
});
|
package/src/ui/CommentPopover.js
CHANGED
|
@@ -132,7 +132,8 @@ export class CommentPopover {
|
|
|
132
132
|
|
|
133
133
|
_onDocMouseDown(e) {
|
|
134
134
|
if (!this.popover || this.popover.style.display === 'none') return;
|
|
135
|
-
|
|
135
|
+
// ИСПРАВЛЕНИЕ: Защита от null элементов
|
|
136
|
+
if (this.popover && e.target && this.popover.contains(e.target)) return; // клик внутри окна — не закрываем
|
|
136
137
|
this.hide();
|
|
137
138
|
}
|
|
138
139
|
|
package/src/ui/ContextMenu.js
CHANGED
|
@@ -51,7 +51,8 @@ export class ContextMenu {
|
|
|
51
51
|
// Скрывать при клике вне меню или по Esc
|
|
52
52
|
document.addEventListener('mousedown', (e) => {
|
|
53
53
|
if (!this.isVisible) return;
|
|
54
|
-
|
|
54
|
+
// ИСПРАВЛЕНИЕ: Защита от null элементов
|
|
55
|
+
if (this.element && e.target && !this.element.contains(e.target)) {
|
|
55
56
|
this.hide();
|
|
56
57
|
}
|
|
57
58
|
});
|
|
@@ -435,7 +435,8 @@ export class FramePropertiesPanel {
|
|
|
435
435
|
}
|
|
436
436
|
|
|
437
437
|
_documentClickHandler(e) {
|
|
438
|
-
|
|
438
|
+
// ИСПРАВЛЕНИЕ: Защита от null элементов
|
|
439
|
+
if (this.colorPalette && e.target && !this.colorPalette.contains(e.target) &&
|
|
439
440
|
this.colorButton && !this.colorButton.contains(e.target)) {
|
|
440
441
|
this._hideColorPalette();
|
|
441
442
|
}
|
|
@@ -37,8 +37,9 @@ export class HtmlHandlesLayer {
|
|
|
37
37
|
this.eventBus.on(Events.Tool.DragUpdate, () => this.update());
|
|
38
38
|
|
|
39
39
|
// ИСПРАВЛЕНИЕ: Обработка удаления объектов
|
|
40
|
-
this.eventBus.on(Events.Object.Deleted, (
|
|
41
|
-
|
|
40
|
+
this.eventBus.on(Events.Object.Deleted, (data) => {
|
|
41
|
+
const objectId = data?.objectId || data;
|
|
42
|
+
console.log('🗑️ HtmlHandlesLayer: получено событие удаления:', data, 'objectId:', objectId);
|
|
42
43
|
|
|
43
44
|
// Принудительно скрываем и очищаем все ручки
|
|
44
45
|
this.hide();
|
package/src/ui/MapPanel.js
CHANGED
|
@@ -38,6 +38,8 @@ export class MapPanel {
|
|
|
38
38
|
// Закрытие по клику вне панели
|
|
39
39
|
document.addEventListener('mousedown', (e) => {
|
|
40
40
|
if (!this.popupEl) return;
|
|
41
|
+
// ИСПРАВЛЕНИЕ: Защита от null элементов
|
|
42
|
+
if (!this.element || !e.target) return;
|
|
41
43
|
if (this.element.contains(e.target)) return;
|
|
42
44
|
this.hidePopup();
|
|
43
45
|
});
|
|
@@ -45,7 +47,8 @@ export class MapPanel {
|
|
|
45
47
|
// Колесо для зума внутри миникарты
|
|
46
48
|
this.element.addEventListener('wheel', (e) => {
|
|
47
49
|
if (!this.popupEl) return;
|
|
48
|
-
|
|
50
|
+
// ИСПРАВЛЕНИЕ: Защита от null элементов
|
|
51
|
+
if (!this.popupEl || !e.target || !this.popupEl.contains(e.target)) return;
|
|
49
52
|
e.preventDefault();
|
|
50
53
|
// Масштабируем вокруг точки под курсором в миникарте
|
|
51
54
|
const rect = this.canvas.getBoundingClientRect();
|
|
@@ -448,14 +448,16 @@ export class NotePropertiesPanel {
|
|
|
448
448
|
let shouldClose = true;
|
|
449
449
|
|
|
450
450
|
for (let palette of palettes) {
|
|
451
|
-
|
|
451
|
+
// ИСПРАВЛЕНИЕ: Защита от null элементов
|
|
452
|
+
if (palette && e.target && palette.contains(e.target)) {
|
|
452
453
|
shouldClose = false;
|
|
453
454
|
break;
|
|
454
455
|
}
|
|
455
456
|
}
|
|
456
457
|
|
|
457
458
|
for (let button of buttons) {
|
|
458
|
-
|
|
459
|
+
// ИСПРАВЛЕНИЕ: Защита от null элементов
|
|
460
|
+
if (button && e.target && button.contains(e.target)) {
|
|
459
461
|
shouldClose = false;
|
|
460
462
|
break;
|
|
461
463
|
}
|
|
@@ -259,7 +259,8 @@ export class TextPropertiesPanel {
|
|
|
259
259
|
|
|
260
260
|
// Закрываем панель при клике вне её
|
|
261
261
|
document.addEventListener('click', (e) => {
|
|
262
|
-
|
|
262
|
+
// ИСПРАВЛЕНИЕ: Защита от null элементов
|
|
263
|
+
if (!colorSelectorContainer || !e.target || !colorSelectorContainer.contains(e.target)) {
|
|
263
264
|
this._hideColorDropdown();
|
|
264
265
|
}
|
|
265
266
|
});
|
|
@@ -460,7 +461,8 @@ export class TextPropertiesPanel {
|
|
|
460
461
|
|
|
461
462
|
// Закрываем панель при клике вне её
|
|
462
463
|
document.addEventListener('click', (e) => {
|
|
463
|
-
|
|
464
|
+
// ИСПРАВЛЕНИЕ: Защита от null элементов
|
|
465
|
+
if (!bgSelectorContainer || !e.target || !bgSelectorContainer.contains(e.target)) {
|
|
464
466
|
this._hideBgColorDropdown();
|
|
465
467
|
}
|
|
466
468
|
});
|
|
@@ -871,7 +873,7 @@ export class TextPropertiesPanel {
|
|
|
871
873
|
}
|
|
872
874
|
|
|
873
875
|
_onDocMouseDown(e) {
|
|
874
|
-
//
|
|
876
|
+
// ИСПРАВЛЕНИЕ: Защита от null элементов + скрываем панель при клике вне неё
|
|
875
877
|
if (!this.panel || !e.target) return;
|
|
876
878
|
|
|
877
879
|
// Если клик внутри панели - не скрываем
|
package/src/ui/Toolbar.js
CHANGED
|
@@ -555,7 +555,10 @@ export class Toolbar {
|
|
|
555
555
|
|
|
556
556
|
// Клик вне попапов — закрыть
|
|
557
557
|
document.addEventListener('click', (e) => {
|
|
558
|
-
|
|
558
|
+
// ИСПРАВЛЕНИЕ: Защита от null элементов
|
|
559
|
+
if (!e.target) return;
|
|
560
|
+
|
|
561
|
+
const isInsideToolbar = this.element && this.element.contains(e.target);
|
|
559
562
|
const isInsideShapesPopup = this.shapesPopupEl && this.shapesPopupEl.contains(e.target);
|
|
560
563
|
const isInsideDrawPopup = this.drawPopupEl && this.drawPopupEl.contains(e.target);
|
|
561
564
|
const isInsideEmojiPopup = this.emojiPopupEl && this.emojiPopupEl.contains(e.target);
|
package/src/ui/ZoomPanel.js
CHANGED
|
@@ -74,6 +74,8 @@ export class ZoomPanel {
|
|
|
74
74
|
|
|
75
75
|
document.addEventListener('mousedown', (e) => {
|
|
76
76
|
if (!this.menuEl) return;
|
|
77
|
+
// ИСПРАВЛЕНИЕ: Защита от null элементов
|
|
78
|
+
if (!this.element || !e.target) return;
|
|
77
79
|
if (this.element.contains(e.target)) return;
|
|
78
80
|
this.hideMenu();
|
|
79
81
|
});
|