@sequent-org/moodboard 1.0.0

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.
Files changed (123) hide show
  1. package/package.json +44 -0
  2. package/src/assets/icons/README.md +105 -0
  3. package/src/assets/icons/attachments.svg +3 -0
  4. package/src/assets/icons/clear.svg +5 -0
  5. package/src/assets/icons/comments.svg +3 -0
  6. package/src/assets/icons/emoji.svg +6 -0
  7. package/src/assets/icons/frame.svg +3 -0
  8. package/src/assets/icons/image.svg +3 -0
  9. package/src/assets/icons/note.svg +3 -0
  10. package/src/assets/icons/pan.svg +3 -0
  11. package/src/assets/icons/pencil.svg +3 -0
  12. package/src/assets/icons/redo.svg +3 -0
  13. package/src/assets/icons/select.svg +9 -0
  14. package/src/assets/icons/shapes.svg +3 -0
  15. package/src/assets/icons/text-add.svg +3 -0
  16. package/src/assets/icons/topbar/README.md +39 -0
  17. package/src/assets/icons/topbar/grid-cross.svg +6 -0
  18. package/src/assets/icons/topbar/grid-dot.svg +3 -0
  19. package/src/assets/icons/topbar/grid-line.svg +3 -0
  20. package/src/assets/icons/topbar/grid-off.svg +3 -0
  21. package/src/assets/icons/topbar/paint.svg +3 -0
  22. package/src/assets/icons/undo.svg +3 -0
  23. package/src/core/ApiClient.js +309 -0
  24. package/src/core/EventBus.js +42 -0
  25. package/src/core/HistoryManager.js +261 -0
  26. package/src/core/KeyboardManager.js +710 -0
  27. package/src/core/PixiEngine.js +439 -0
  28. package/src/core/SaveManager.js +381 -0
  29. package/src/core/StateManager.js +64 -0
  30. package/src/core/commands/BaseCommand.js +68 -0
  31. package/src/core/commands/CopyObjectCommand.js +44 -0
  32. package/src/core/commands/CreateObjectCommand.js +46 -0
  33. package/src/core/commands/DeleteObjectCommand.js +146 -0
  34. package/src/core/commands/EditFileNameCommand.js +107 -0
  35. package/src/core/commands/GroupMoveCommand.js +47 -0
  36. package/src/core/commands/GroupReorderZCommand.js +74 -0
  37. package/src/core/commands/GroupResizeCommand.js +37 -0
  38. package/src/core/commands/GroupRotateCommand.js +41 -0
  39. package/src/core/commands/MoveObjectCommand.js +89 -0
  40. package/src/core/commands/PasteObjectCommand.js +103 -0
  41. package/src/core/commands/ReorderZCommand.js +45 -0
  42. package/src/core/commands/ResizeObjectCommand.js +135 -0
  43. package/src/core/commands/RotateObjectCommand.js +70 -0
  44. package/src/core/commands/index.js +14 -0
  45. package/src/core/events/Events.js +147 -0
  46. package/src/core/index.js +1632 -0
  47. package/src/core/rendering/GeometryUtils.js +89 -0
  48. package/src/core/rendering/HitTestManager.js +186 -0
  49. package/src/core/rendering/LayerManager.js +137 -0
  50. package/src/core/rendering/ObjectRenderer.js +363 -0
  51. package/src/core/rendering/PixiRenderer.js +140 -0
  52. package/src/core/rendering/index.js +9 -0
  53. package/src/grid/BaseGrid.js +164 -0
  54. package/src/grid/CrossGrid.js +75 -0
  55. package/src/grid/DotGrid.js +148 -0
  56. package/src/grid/GridFactory.js +173 -0
  57. package/src/grid/LineGrid.js +115 -0
  58. package/src/index.js +2 -0
  59. package/src/moodboard/ActionHandler.js +114 -0
  60. package/src/moodboard/DataManager.js +114 -0
  61. package/src/moodboard/MoodBoard.js +359 -0
  62. package/src/moodboard/WorkspaceManager.js +103 -0
  63. package/src/objects/BaseObject.js +1 -0
  64. package/src/objects/CommentObject.js +115 -0
  65. package/src/objects/DrawingObject.js +114 -0
  66. package/src/objects/EmojiObject.js +98 -0
  67. package/src/objects/FileObject.js +318 -0
  68. package/src/objects/FrameObject.js +127 -0
  69. package/src/objects/ImageObject.js +72 -0
  70. package/src/objects/NoteObject.js +227 -0
  71. package/src/objects/ObjectFactory.js +61 -0
  72. package/src/objects/ShapeObject.js +134 -0
  73. package/src/objects/StampObject.js +0 -0
  74. package/src/objects/StickerObject.js +0 -0
  75. package/src/objects/TextObject.js +123 -0
  76. package/src/services/BoardService.js +85 -0
  77. package/src/services/FileUploadService.js +398 -0
  78. package/src/services/FrameService.js +138 -0
  79. package/src/services/ImageUploadService.js +246 -0
  80. package/src/services/ZOrderManager.js +50 -0
  81. package/src/services/ZoomPanController.js +78 -0
  82. package/src/src.7z +0 -0
  83. package/src/src.zip +0 -0
  84. package/src/src2.zip +0 -0
  85. package/src/tools/AlignmentGuides.js +326 -0
  86. package/src/tools/BaseTool.js +257 -0
  87. package/src/tools/ResizeHandles.js +381 -0
  88. package/src/tools/ToolManager.js +580 -0
  89. package/src/tools/board-tools/PanTool.js +43 -0
  90. package/src/tools/board-tools/ZoomTool.js +393 -0
  91. package/src/tools/object-tools/DrawingTool.js +404 -0
  92. package/src/tools/object-tools/PlacementTool.js +1005 -0
  93. package/src/tools/object-tools/SelectTool.js +2183 -0
  94. package/src/tools/object-tools/TextTool.js +416 -0
  95. package/src/tools/object-tools/selection/BoxSelectController.js +105 -0
  96. package/src/tools/object-tools/selection/GeometryUtils.js +101 -0
  97. package/src/tools/object-tools/selection/GroupDragController.js +61 -0
  98. package/src/tools/object-tools/selection/GroupResizeController.js +90 -0
  99. package/src/tools/object-tools/selection/GroupRotateController.js +61 -0
  100. package/src/tools/object-tools/selection/HandlesSync.js +96 -0
  101. package/src/tools/object-tools/selection/ResizeController.js +68 -0
  102. package/src/tools/object-tools/selection/RotateController.js +58 -0
  103. package/src/tools/object-tools/selection/SelectionModel.js +42 -0
  104. package/src/tools/object-tools/selection/SimpleDragController.js +45 -0
  105. package/src/ui/CommentPopover.js +187 -0
  106. package/src/ui/ContextMenu.js +340 -0
  107. package/src/ui/FilePropertiesPanel.js +298 -0
  108. package/src/ui/FramePropertiesPanel.js +462 -0
  109. package/src/ui/HtmlHandlesLayer.js +778 -0
  110. package/src/ui/HtmlTextLayer.js +279 -0
  111. package/src/ui/MapPanel.js +290 -0
  112. package/src/ui/NotePropertiesPanel.js +502 -0
  113. package/src/ui/SaveStatus.js +250 -0
  114. package/src/ui/TextPropertiesPanel.js +911 -0
  115. package/src/ui/Toolbar.js +1118 -0
  116. package/src/ui/Topbar.js +220 -0
  117. package/src/ui/ZoomPanel.js +116 -0
  118. package/src/ui/styles/workspace.css +854 -0
  119. package/src/utils/colors.js +0 -0
  120. package/src/utils/geometry.js +0 -0
  121. package/src/utils/iconLoader.js +270 -0
  122. package/src/utils/objectIdGenerator.js +17 -0
  123. package/src/utils/topbarIconLoader.js +114 -0
@@ -0,0 +1,75 @@
1
+ import * as PIXI from 'pixi.js';
2
+ import { BaseGrid } from './BaseGrid.js';
3
+
4
+ /**
5
+ * Сетка с крестиками (плюсами) в узлах
6
+ */
7
+ export class CrossGrid extends BaseGrid {
8
+ constructor(options = {}) {
9
+ super(options);
10
+ this.type = 'cross';
11
+
12
+ // Размер половины креста от центра до конца линии
13
+ this.crossHalfSize = options.crossHalfSize || 4;
14
+ this.crossLineWidth = options.crossLineWidth || this.lineWidth || 1;
15
+
16
+ // По умолчанию делаем цвет крестиков серым
17
+ if (options.color == null) {
18
+ this.color = 0xB0B0B0;
19
+ }
20
+ }
21
+
22
+ /**
23
+ * Рендер сетки — рисуем крестики по узлам
24
+ */
25
+ createVisual() {
26
+ const g = this.graphics;
27
+ // Прозрачность задаем через graphics.alpha из BaseGrid; штрих рисуем с полным альфа
28
+ g.lineStyle(this.crossLineWidth, this.color, 1);
29
+
30
+ const hs = this.crossHalfSize;
31
+
32
+ for (let x = 0; x <= this.width; x += this.size) {
33
+ for (let y = 0; y <= this.height; y += this.size) {
34
+ // Горизонтальная часть креста
35
+ g.moveTo(x - hs, y);
36
+ g.lineTo(x + hs, y);
37
+ // Вертикальная часть креста
38
+ g.moveTo(x, y - hs);
39
+ g.lineTo(x, y + hs);
40
+ }
41
+ }
42
+ }
43
+
44
+ /**
45
+ * Привязка — как у линейной/точечной сетки: к ближайшему узлу
46
+ */
47
+ calculateSnapPoint(x, y) {
48
+ const snapX = Math.round(x / this.size) * this.size;
49
+ const snapY = Math.round(y / this.size) * this.size;
50
+ return { x: snapX, y: snapY };
51
+ }
52
+
53
+ /**
54
+ * Изменение размеров креста
55
+ */
56
+ setCrossHalfSize(halfSize) {
57
+ this.crossHalfSize = Math.max(1, halfSize);
58
+ this.updateVisual();
59
+ }
60
+
61
+ setCrossLineWidth(w) {
62
+ this.crossLineWidth = Math.max(1, w);
63
+ this.updateVisual();
64
+ }
65
+
66
+ serialize() {
67
+ return {
68
+ ...super.serialize(),
69
+ crossHalfSize: this.crossHalfSize,
70
+ crossLineWidth: this.crossLineWidth
71
+ };
72
+ }
73
+ }
74
+
75
+
@@ -0,0 +1,148 @@
1
+ import { BaseGrid } from './BaseGrid.js';
2
+
3
+ /**
4
+ * Точечная сетка
5
+ */
6
+ export class DotGrid extends BaseGrid {
7
+ constructor(options = {}) {
8
+ super(options);
9
+ this.type = 'dot';
10
+
11
+ // Настройки точек
12
+ this.dotSize = options.dotSize || 2;
13
+ this.dotStyle = options.dotStyle || 'circle'; // 'circle' | 'square'
14
+ this.highlightIntersections = options.highlightIntersections ?? true;
15
+ // Пересечения делаем такими же, как обычные точки по умолчанию
16
+ this.intersectionSize = options.intersectionSize || this.dotSize;
17
+ this.intersectionColor = options.intersectionColor || this.color;
18
+ }
19
+
20
+ /**
21
+ * Создает визуальное представление точечной сетки
22
+ */
23
+ createVisual() {
24
+ // Рисуем обычные точки
25
+ this.drawDots();
26
+
27
+ // Выделяем пересечения (каждые N точек)
28
+ if (this.highlightIntersections) {
29
+ this.drawIntersections();
30
+ }
31
+ }
32
+
33
+ /**
34
+ * Рисует основные точки сетки
35
+ */
36
+ drawDots() {
37
+ this.graphics.beginFill(this.color);
38
+
39
+ for (let x = 0; x <= this.width; x += this.size) {
40
+ for (let y = 0; y <= this.height; y += this.size) {
41
+ this.drawDot(x, y, this.dotSize);
42
+ }
43
+ }
44
+
45
+ this.graphics.endFill();
46
+ }
47
+
48
+ /**
49
+ * Рисует выделенные пересечения (каждые 5 точек)
50
+ */
51
+ drawIntersections() {
52
+ const intersectionStep = this.size * 5;
53
+
54
+ // Используем те же параметры, что и у обычных точек
55
+ this.graphics.beginFill(this.color);
56
+
57
+ for (let x = 0; x <= this.width; x += intersectionStep) {
58
+ for (let y = 0; y <= this.height; y += intersectionStep) {
59
+ this.drawDot(x, y, this.dotSize);
60
+ }
61
+ }
62
+
63
+ this.graphics.endFill();
64
+ }
65
+
66
+ /**
67
+ * Рисует одну точку
68
+ */
69
+ drawDot(x, y, size) {
70
+ if (this.dotStyle === 'circle') {
71
+ this.graphics.drawCircle(x, y, size);
72
+ } else if (this.dotStyle === 'square') {
73
+ const half = size;
74
+ this.graphics.drawRect(x - half, y - half, half * 2, half * 2);
75
+ }
76
+ }
77
+
78
+ /**
79
+ * Вычисляет точку привязки для точечной сетки
80
+ */
81
+ calculateSnapPoint(x, y) {
82
+ const snapX = Math.round(x / this.size) * this.size;
83
+ const snapY = Math.round(y / this.size) * this.size;
84
+
85
+ return { x: snapX, y: snapY };
86
+ }
87
+
88
+ /**
89
+ * Проверяет, находится ли точка рядом с точкой сетки
90
+ */
91
+ isNearGridPoint(x, y) {
92
+ const nearest = this.calculateSnapPoint(x, y);
93
+ const distance = Math.sqrt(
94
+ Math.pow(x - nearest.x, 2) + Math.pow(y - nearest.y, 2)
95
+ );
96
+
97
+ return distance <= this.snapTolerance;
98
+ }
99
+
100
+ /**
101
+ * Устанавливает размер точек
102
+ */
103
+ setDotSize(size) {
104
+ this.dotSize = Math.max(1, size);
105
+ // Синхронизируем размер точек пересечений
106
+ this.intersectionSize = this.dotSize;
107
+ this.updateVisual();
108
+ }
109
+
110
+ /**
111
+ * Устанавливает стиль точек
112
+ */
113
+ setDotStyle(style) {
114
+ if (['circle', 'square'].includes(style)) {
115
+ this.dotStyle = style;
116
+ this.updateVisual();
117
+ }
118
+ }
119
+
120
+ /**
121
+ * Включает/выключает выделение пересечений
122
+ */
123
+ setHighlightIntersections(enabled) {
124
+ this.highlightIntersections = enabled;
125
+ this.updateVisual();
126
+ }
127
+
128
+ // Делаем цвет пересечений таким же, как основной цвет
129
+ setColor(color) {
130
+ super.setColor(color);
131
+ this.intersectionColor = this.color;
132
+ this.updateVisual();
133
+ }
134
+
135
+ /**
136
+ * Сериализует настройки точечной сетки
137
+ */
138
+ serialize() {
139
+ return {
140
+ ...super.serialize(),
141
+ dotSize: this.dotSize,
142
+ dotStyle: this.dotStyle,
143
+ highlightIntersections: this.highlightIntersections,
144
+ intersectionSize: this.intersectionSize,
145
+ intersectionColor: this.intersectionColor
146
+ };
147
+ }
148
+ }
@@ -0,0 +1,173 @@
1
+ import { LineGrid } from './LineGrid.js';
2
+ import { DotGrid } from './DotGrid.js';
3
+ import { CrossGrid } from './CrossGrid.js';
4
+
5
+ /**
6
+ * Фабрика для создания различных типов сеток
7
+ */
8
+ export class GridFactory {
9
+ /**
10
+ * Регистрируемые типы сеток
11
+ */
12
+ static gridTypes = {
13
+ 'line': LineGrid,
14
+ 'dot': DotGrid,
15
+ 'cross': CrossGrid
16
+ };
17
+
18
+ /**
19
+ * Создает сетку указанного типа
20
+ * @param {string} type - тип сетки
21
+ * @param {Object} options - настройки сетки
22
+ * @returns {BaseGrid} экземпляр сетки
23
+ */
24
+ static createGrid(type, options = {}) {
25
+ const GridClass = this.gridTypes[type];
26
+
27
+ if (!GridClass) {
28
+ throw new Error(`Unknown grid type: ${type}`);
29
+ }
30
+
31
+ return new GridClass(options);
32
+ }
33
+
34
+ /**
35
+ * Создает сетку из сериализованных данных
36
+ * @param {Object} data - сериализованные данные сетки
37
+ * @returns {BaseGrid} экземпляр сетки
38
+ */
39
+ static fromData(data) {
40
+ const { type, ...options } = data;
41
+ return this.createGrid(type, options);
42
+ }
43
+
44
+ /**
45
+ * Регистрирует новый тип сетки
46
+ * @param {string} type - название типа
47
+ * @param {Class} GridClass - класс сетки
48
+ */
49
+ static registerGridType(type, GridClass) {
50
+ this.gridTypes[type] = GridClass;
51
+ }
52
+
53
+ /**
54
+ * Получает список доступных типов сеток
55
+ * @returns {Array<string>} массив названий типов
56
+ */
57
+ static getAvailableTypes() {
58
+ return Object.keys(this.gridTypes);
59
+ }
60
+
61
+ /**
62
+ * Получает настройки по умолчанию для типа сетки
63
+ * @param {string} type - тип сетки
64
+ * @returns {Object} настройки по умолчанию
65
+ */
66
+ static getDefaultOptions(type) {
67
+ const defaults = {
68
+ line: {
69
+ enabled: true,
70
+ size: 20,
71
+ color: 0xE0E0E0,
72
+ opacity: 0.5,
73
+ lineWidth: 1,
74
+ showSubGrid: false,
75
+ subGridDivisions: 4
76
+ },
77
+ dot: {
78
+ enabled: true,
79
+ size: 20,
80
+ color: 0xE0E0E0,
81
+ opacity: 0.5,
82
+ dotSize: 2,
83
+ dotStyle: 'circle',
84
+ highlightIntersections: true
85
+ },
86
+ cross: {
87
+ enabled: true,
88
+ size: 40,
89
+ color: 0xB0B0B0,
90
+ opacity: 0.5,
91
+ crossHalfSize: 4,
92
+ crossLineWidth: 1
93
+ }
94
+ };
95
+
96
+ return defaults[type] || {};
97
+ }
98
+
99
+ /**
100
+ * Создает пресет популярных настроек сетки
101
+ * @param {string} presetName - название пресета
102
+ * @returns {Object} настройки сетки
103
+ */
104
+ static createPreset(presetName) {
105
+ const presets = {
106
+ // Линейные сетки
107
+ 'fine-line': {
108
+ type: 'line',
109
+ size: 10,
110
+ color: 0xF0F0F0,
111
+ opacity: 0.3,
112
+ showSubGrid: true,
113
+ subGridDivisions: 2
114
+ },
115
+ 'standard-line': {
116
+ type: 'line',
117
+ size: 20,
118
+ color: 0xE0E0E0,
119
+ opacity: 0.5
120
+ },
121
+ 'coarse-line': {
122
+ type: 'line',
123
+ size: 50,
124
+ color: 0xD0D0D0,
125
+ opacity: 0.7
126
+ },
127
+
128
+ // Точечные сетки
129
+ 'fine-dots': {
130
+ type: 'dot',
131
+ size: 10,
132
+ color: 0xC0C0C0,
133
+ opacity: 0.6,
134
+ dotSize: 1
135
+ },
136
+ 'standard-dots': {
137
+ type: 'dot',
138
+ size: 20,
139
+ color: 0xB0B0B0,
140
+ opacity: 0.7,
141
+ dotSize: 2
142
+ },
143
+ 'bold-dots': {
144
+ type: 'dot',
145
+ size: 30,
146
+ color: 0xA0A0A0,
147
+ opacity: 0.8,
148
+ dotSize: 3,
149
+ dotStyle: 'square'
150
+ },
151
+
152
+ // (изометрическая сетка удалена)
153
+ };
154
+
155
+ const preset = presets[presetName];
156
+ if (!preset) {
157
+ throw new Error(`Unknown preset: ${presetName}`);
158
+ }
159
+
160
+ return this.createGrid(preset.type, preset);
161
+ }
162
+
163
+ /**
164
+ * Получает список доступных пресетов
165
+ * @returns {Array<string>} названия пресетов
166
+ */
167
+ static getAvailablePresets() {
168
+ return [
169
+ 'fine-line', 'standard-line', 'coarse-line',
170
+ 'fine-dots', 'standard-dots', 'bold-dots'
171
+ ];
172
+ }
173
+ }
@@ -0,0 +1,115 @@
1
+ import { BaseGrid } from './BaseGrid.js';
2
+
3
+ /**
4
+ * Линейная прямоугольная сетка
5
+ */
6
+ export class LineGrid extends BaseGrid {
7
+ constructor(options = {}) {
8
+ super(options);
9
+ this.type = 'line';
10
+
11
+ // Дополнительные настройки для линейной сетки
12
+ this.showSubGrid = options.showSubGrid ?? false;
13
+ this.subGridDivisions = options.subGridDivisions || 4;
14
+ this.subGridColor = options.subGridColor || 0xF0F0F0;
15
+ this.subGridOpacity = options.subGridOpacity || 0.3;
16
+ }
17
+
18
+ /**
19
+ * Создает визуальное представление линейной сетки
20
+ */
21
+ createVisual() {
22
+ this.graphics.lineStyle(this.lineWidth, this.color, 1);
23
+
24
+ // Основные линии сетки
25
+ this.drawMainGrid();
26
+
27
+ // Дополнительная подсетка
28
+ if (this.showSubGrid) {
29
+ this.drawSubGrid();
30
+ }
31
+ }
32
+
33
+ /**
34
+ * Рисует основную сетку
35
+ */
36
+ drawMainGrid() {
37
+ // Вертикальные линии
38
+ for (let x = 0; x <= this.width; x += this.size) {
39
+ this.graphics.moveTo(x, 0);
40
+ this.graphics.lineTo(x, this.height);
41
+ }
42
+
43
+ // Горизонтальные линии
44
+ for (let y = 0; y <= this.height; y += this.size) {
45
+ this.graphics.moveTo(0, y);
46
+ this.graphics.lineTo(this.width, y);
47
+ }
48
+ }
49
+
50
+ /**
51
+ * Рисует подсетку (более мелкие линии)
52
+ */
53
+ drawSubGrid() {
54
+ const subSize = this.size / this.subGridDivisions;
55
+
56
+ this.graphics.lineStyle(1, this.subGridColor, this.subGridOpacity);
57
+
58
+ // Вертикальные подлинии
59
+ for (let x = subSize; x < this.width; x += subSize) {
60
+ // Пропускаем основные линии
61
+ if (x % this.size !== 0) {
62
+ this.graphics.moveTo(x, 0);
63
+ this.graphics.lineTo(x, this.height);
64
+ }
65
+ }
66
+
67
+ // Горизонтальные подлинии
68
+ for (let y = subSize; y < this.height; y += subSize) {
69
+ // Пропускаем основные линии
70
+ if (y % this.size !== 0) {
71
+ this.graphics.moveTo(0, y);
72
+ this.graphics.lineTo(this.width, y);
73
+ }
74
+ }
75
+ }
76
+
77
+ /**
78
+ * Вычисляет точку привязки для линейной сетки
79
+ */
80
+ calculateSnapPoint(x, y) {
81
+ const snapX = Math.round(x / this.size) * this.size;
82
+ const snapY = Math.round(y / this.size) * this.size;
83
+
84
+ return { x: snapX, y: snapY };
85
+ }
86
+
87
+ /**
88
+ * Включает/выключает подсетку
89
+ */
90
+ setSubGridEnabled(enabled) {
91
+ this.showSubGrid = enabled;
92
+ this.updateVisual();
93
+ }
94
+
95
+ /**
96
+ * Устанавливает количество делений подсетки
97
+ */
98
+ setSubGridDivisions(divisions) {
99
+ this.subGridDivisions = Math.max(2, divisions);
100
+ this.updateVisual();
101
+ }
102
+
103
+ /**
104
+ * Сериализует настройки линейной сетки
105
+ */
106
+ serialize() {
107
+ return {
108
+ ...super.serialize(),
109
+ showSubGrid: this.showSubGrid,
110
+ subGridDivisions: this.subGridDivisions,
111
+ subGridColor: this.subGridColor,
112
+ subGridOpacity: this.subGridOpacity
113
+ };
114
+ }
115
+ }
package/src/index.js ADDED
@@ -0,0 +1,2 @@
1
+ // Единственный экспорт пакета - готовый MoodBoard с UI
2
+ export { MoodBoard } from './moodboard/MoodBoard.js';
@@ -0,0 +1,114 @@
1
+ /**
2
+ * Обрабатывает действия пользователя в MoodBoard
3
+ */
4
+ export class ActionHandler {
5
+ constructor(dataManager, workspaceManager) {
6
+ this.dataManager = dataManager;
7
+ this.workspaceManager = workspaceManager;
8
+ }
9
+
10
+ /**
11
+ * Обрабатывает действия тулбара
12
+ */
13
+ handleToolbarAction(action) {
14
+ switch (action.type) {
15
+ case 'frame':
16
+ case 'simple-text':
17
+ case 'text':
18
+ case 'note':
19
+ case 'shape':
20
+ case 'drawing':
21
+ case 'emoji':
22
+ case 'image':
23
+ case 'comment':
24
+ case 'file':
25
+ // Передаем imageId как extraData для изображений, fileId для файлов
26
+ const extraData = action.imageId ? { imageId: action.imageId } :
27
+ action.fileId ? { fileId: action.fileId } : {};
28
+ return this.handleCreateObject(action.type, action.position, action.properties || {}, extraData);
29
+
30
+ case 'delete-object':
31
+ if (action.id) {
32
+ this.dataManager.deleteObject(action.id);
33
+ }
34
+ return null;
35
+
36
+ case 'clear':
37
+ return this.handleClearBoard();
38
+
39
+ case 'export':
40
+ return this.handleExportBoard();
41
+
42
+ default:
43
+ console.warn('Unknown toolbar action:', action.type);
44
+ return null;
45
+ }
46
+ }
47
+
48
+ /**
49
+ * Обрабатывает создание объекта
50
+ */
51
+ handleCreateObject(type, position, properties = {}, extraData = {}) {
52
+ const objectData = this.dataManager.createObject(type, position, properties, extraData);
53
+ return objectData;
54
+ }
55
+
56
+ /**
57
+ * Обрабатывает очистку доски
58
+ */
59
+ handleClearBoard() {
60
+ const clearedCount = this.dataManager.clearBoard();
61
+
62
+ if (clearedCount > 0) {
63
+ this.workspaceManager.showNotification(`Cleared ${clearedCount} objects`);
64
+ } else {
65
+ this.workspaceManager.showNotification('Board is already empty');
66
+ }
67
+
68
+ return clearedCount;
69
+ }
70
+
71
+ /**
72
+ * Обрабатывает экспорт доски
73
+ */
74
+ handleExportBoard() {
75
+ const data = this.dataManager.exportBoardData();
76
+
77
+ if (data) {
78
+ console.log('Board data:', data);
79
+ this.workspaceManager.showNotification('Board data exported to console');
80
+ } else {
81
+ this.workspaceManager.showNotification('Failed to export board data');
82
+ }
83
+
84
+ return data;
85
+ }
86
+
87
+ /**
88
+ * Обрабатывает программное создание объекта
89
+ */
90
+ createObject(type, position, properties = {}, extraData = {}) {
91
+ return this.dataManager.createObject(type, position, properties, extraData);
92
+ }
93
+
94
+ /**
95
+ * Обрабатывает программное удаление объекта
96
+ */
97
+ deleteObject(objectId) {
98
+ return this.dataManager.deleteObject(objectId);
99
+ }
100
+
101
+ /**
102
+ * Обрабатывает программную очистку доски
103
+ */
104
+ clearBoard() {
105
+ return this.handleClearBoard();
106
+ }
107
+
108
+ /**
109
+ * Обрабатывает программный экспорт
110
+ */
111
+ exportBoard() {
112
+ return this.handleExportBoard();
113
+ }
114
+ }