@sequent-org/moodboard 1.0.12 → 1.0.13

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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sequent-org/moodboard",
3
- "version": "1.0.12",
3
+ "version": "1.0.13",
4
4
  "type": "module",
5
5
  "description": "Interactive moodboard",
6
6
  "main": "./src/index.js",
@@ -346,6 +346,25 @@ export class MoodBoard {
346
346
  }
347
347
  }
348
348
 
349
+ /**
350
+ * Безопасное уничтожение объекта с проверкой наличия метода destroy
351
+ * @param {Object} obj - объект для уничтожения
352
+ * @param {string} name - имя объекта для логирования
353
+ */
354
+ _safeDestroy(obj, name) {
355
+ if (obj) {
356
+ try {
357
+ if (typeof obj.destroy === 'function') {
358
+ obj.destroy();
359
+ } else {
360
+ console.warn(`Объект ${name} не имеет метода destroy()`);
361
+ }
362
+ } catch (error) {
363
+ console.error(`Ошибка при уничтожении ${name}:`, error);
364
+ }
365
+ }
366
+ }
367
+
349
368
  /**
350
369
  * Очистка ресурсов
351
370
  */
@@ -359,58 +378,44 @@ export class MoodBoard {
359
378
  // Устанавливаем флаг уничтожения
360
379
  this.destroyed = true;
361
380
 
362
- // Уничтожаем UI компоненты
363
- if (this.toolbar) {
364
- this.toolbar.destroy();
365
- this.toolbar = null;
366
- }
381
+ // Уничтожаем UI компоненты с безопасными проверками
382
+ this._safeDestroy(this.toolbar, 'toolbar');
383
+ this.toolbar = null;
367
384
 
368
- if (this.saveStatus) {
369
- this.saveStatus.destroy();
370
- this.saveStatus = null;
371
- }
385
+ this._safeDestroy(this.saveStatus, 'saveStatus');
386
+ this.saveStatus = null;
372
387
 
373
- if (this.textPropertiesPanel) {
374
- this.textPropertiesPanel.destroy();
375
- this.textPropertiesPanel = null;
376
- }
388
+ this._safeDestroy(this.textPropertiesPanel, 'textPropertiesPanel');
389
+ this.textPropertiesPanel = null;
377
390
 
378
- if (this.framePropertiesPanel) {
379
- this.framePropertiesPanel.destroy();
380
- this.framePropertiesPanel = null;
381
- }
391
+ this._safeDestroy(this.framePropertiesPanel, 'framePropertiesPanel');
392
+ this.framePropertiesPanel = null;
382
393
 
383
- if (this.notePropertiesPanel) {
384
- this.notePropertiesPanel.destroy();
385
- this.notePropertiesPanel = null;
386
- }
394
+ this._safeDestroy(this.notePropertiesPanel, 'notePropertiesPanel');
395
+ this.notePropertiesPanel = null;
387
396
 
388
- if (this.alignmentGuides) {
389
- this.alignmentGuides.destroy();
390
- this.alignmentGuides = null;
391
- }
397
+ this._safeDestroy(this.alignmentGuides, 'alignmentGuides');
398
+ this.alignmentGuides = null;
392
399
 
393
- if (this.commentPopover) {
394
- this.commentPopover.destroy();
395
- this.commentPopover = null;
396
- }
400
+ this._safeDestroy(this.commentPopover, 'commentPopover');
401
+ this.commentPopover = null;
397
402
 
398
- if (this.contextMenu) {
399
- this.contextMenu.destroy();
400
- this.contextMenu = null;
401
- }
403
+ this._safeDestroy(this.contextMenu, 'contextMenu');
404
+ this.contextMenu = null;
405
+
406
+ this._safeDestroy(this.zoombar, 'zoombar');
407
+ this.zoombar = null;
408
+
409
+ this._safeDestroy(this.mapbar, 'mapbar');
410
+ this.mapbar = null;
402
411
 
403
412
  // Уничтожаем ядро
404
- if (this.coreMoodboard) {
405
- this.coreMoodboard.destroy();
406
- this.coreMoodboard = null;
407
- }
413
+ this._safeDestroy(this.coreMoodboard, 'coreMoodboard');
414
+ this.coreMoodboard = null;
408
415
 
409
416
  // Уничтожаем workspace
410
- if (this.workspaceManager) {
411
- this.workspaceManager.destroy();
412
- this.workspaceManager = null;
413
- }
417
+ this._safeDestroy(this.workspaceManager, 'workspaceManager');
418
+ this.workspaceManager = null;
414
419
 
415
420
  // Очищаем ссылки на менеджеры
416
421
  this.dataManager = null;
@@ -9,6 +9,9 @@ export class ContextMenu {
9
9
  this.lastX = 0;
10
10
  this.lastY = 0;
11
11
  this.currentGridType = 'line';
12
+
13
+ // Флаг состояния объекта
14
+ this.destroyed = false;
12
15
 
13
16
  this.createElement();
14
17
  this.attachEvents();
@@ -335,6 +338,30 @@ export class ContextMenu {
335
338
  // По умолчанию — пусто
336
339
  this.element.innerHTML = '<div style="padding:8px 12px; color:#888;">(пусто)</div>';
337
340
  }
341
+
342
+ /**
343
+ * Уничтожение контекстного меню
344
+ */
345
+ destroy() {
346
+ if (this.destroyed) {
347
+ return;
348
+ }
349
+
350
+ this.destroyed = true;
351
+
352
+ // Скрываем меню
353
+ this.hide();
354
+
355
+ // Удаляем DOM элемент
356
+ if (this.element && this.element.parentNode) {
357
+ this.element.parentNode.removeChild(this.element);
358
+ this.element = null;
359
+ }
360
+
361
+ // Очищаем ссылки
362
+ this.container = null;
363
+ this.eventBus = null;
364
+ }
338
365
  }
339
366
 
340
367