@plait/mind 0.24.0 → 0.25.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.
@@ -1,7 +1,7 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { Component, ChangeDetectionStrategy, NgModule, NgZone, Directive, Input, HostListener } from '@angular/core';
3
3
  import * as i2 from '@plait/core';
4
- import { DefaultThemeColor, ColorfulThemeColor, SoftThemeColor, RetroThemeColor, DarkThemeColor, StarryThemeColor, RectangleClient, PlaitElement, PlaitPluginKey, idCreator, isNullOrUndefined, Transforms, clearSelectedElement, addSelectedElement, PlaitBoard, Path, PlaitNode, PlaitContextService, depthFirstRecursion, getIsRecursionFunc, drawLinearPath, drawBezierPath, createG, updateForeignObject, drawRoundRectangle, getRectangleByElements, getSelectedElements, NODE_TO_PARENT, distanceBetweenPointAndRectangle, createForeignObject, createText, PlaitPointerType, PlaitPluginElementComponent, NODE_TO_INDEX, PlaitModule, isMainPointer, transformPoint, toPoint, getHitElements, distanceBetweenPointAndPoint, CLIP_BOARD_FORMAT_KEY, BOARD_TO_HOST, throttleRAF, BoardTransforms, removeSelectedElement, PlaitHistoryBoard, hotkeys, PRESS_AND_MOVE_BUFFER, MERGING, ResizeCursorClass } from '@plait/core';
4
+ import { DefaultThemeColor, ColorfulThemeColor, SoftThemeColor, RetroThemeColor, DarkThemeColor, StarryThemeColor, RectangleClient, PlaitElement, PlaitPluginKey, idCreator, isNullOrUndefined, Transforms, clearSelectedElement, addSelectedElement, PlaitBoard, Path, PlaitNode, PlaitContextService, depthFirstRecursion, getIsRecursionFunc, drawLinearPath, drawBezierPath, createG, updateForeignObject, drawRoundRectangle, getRectangleByElements, getSelectedElements, NODE_TO_PARENT, distanceBetweenPointAndRectangle, createForeignObject, createText, PlaitPointerType, PlaitPluginElementComponent, NODE_TO_INDEX, PlaitModule, isMainPointer, transformPoint, toPoint, getHitElements, distanceBetweenPointAndPoint, CLIP_BOARD_FORMAT_KEY, CLIP_BOARD_IMAGE_FORMAT_KEY, BOARD_TO_HOST, throttleRAF, BoardTransforms, removeSelectedElement, PlaitHistoryBoard, hotkeys, PRESS_AND_MOVE_BUFFER, MERGING, ResizeCursorClass } from '@plait/core';
5
5
  import { MindLayoutType, isIndentedLayout, AbstractNode, isStandardLayout, isHorizontalLogicLayout, isVerticalLogicLayout, getNonAbstractChildren, isLeftLayout, isRightLayout, isTopLayout, isBottomLayout, isHorizontalLayout, getCorrectStartEnd, ConnectingPosition, getAbstractLayout, GlobalLayout } from '@plait/layouts';
6
6
  import { PlaitMarkEditor, MarkTypes, DEFAULT_FONT_SIZE, TEXT_DEFAULT_HEIGHT, buildText, getTextSize, TextManage, ExitOrigin, TextModule, getTextFromClipboard } from '@plait/text';
7
7
  import { fromEvent, Subject } from 'rxjs';
@@ -1081,6 +1081,9 @@ const getNewNodeHeight = (board, element, newNodeDynamicWidth) => {
1081
1081
  if (height !== newHeight) {
1082
1082
  return newHeight;
1083
1083
  }
1084
+ if (Math.abs(newHeight / board.viewport.zoom - element.height) > 2) {
1085
+ return newHeight;
1086
+ }
1084
1087
  return undefined;
1085
1088
  };
1086
1089
 
@@ -2939,6 +2942,7 @@ class NodeImageDrawer {
2939
2942
  this.g = createG();
2940
2943
  const foreignRectangle = getImageForeignRectangle(this.board, element);
2941
2944
  this.foreignObject = createForeignObject(foreignRectangle.x, foreignRectangle.y, foreignRectangle.width, foreignRectangle.height);
2945
+ this.foreignObject.style.padding = `6px`;
2942
2946
  this.g.append(this.foreignObject);
2943
2947
  const componentType = this.board.getPluginOptions(WithMindPluginKey).imageComponentType;
2944
2948
  if (!componentType) {
@@ -3005,8 +3009,6 @@ class MindNodeComponent extends PlaitPluginElementComponent {
3005
3009
  this.textManage = new TextManage(this.board, this.viewContainerRef, () => {
3006
3010
  const rect = getTopicRectangleByNode(this.board, this.node);
3007
3011
  return rect;
3008
- }, (point) => {
3009
- return isHitMindElement(this.board, point, this.element);
3010
3012
  }, (textManageRef) => {
3011
3013
  const width = textManageRef.width;
3012
3014
  const height = textManageRef.height;
@@ -3145,10 +3147,21 @@ class MindNodeComponent extends PlaitPluginElementComponent {
3145
3147
  }
3146
3148
  editTopic() {
3147
3149
  this.activeDrawer.draw(this.element, this.g, { selected: this.selected, isEditing: true });
3150
+ // update text max-width when image width greater than topic default max width to cover node topic default max width style
3151
+ const defaultMaxWidth = TOPIC_DEFAULT_MAX_WORD_COUNT * (PlaitMind.isMind(this.element) ? ROOT_TOPIC_FONT_SIZE : TOPIC_FONT_SIZE);
3152
+ let hasMaxWidth = false;
3153
+ if (!this.element.manualWidth && MindElement.hasImage(this.element) && this.element.data.image.width > defaultMaxWidth) {
3154
+ const width = NodeSpace.getNodeDynamicWidth(this.board, this.element);
3155
+ this.textManage.updateWidth(width);
3156
+ hasMaxWidth = true;
3157
+ }
3148
3158
  this.textManage.edit((origin) => {
3149
3159
  if (origin === ExitOrigin.default) {
3150
3160
  this.activeDrawer.draw(this.element, this.g, { selected: this.selected, isEditing: false });
3151
3161
  }
3162
+ if (hasMaxWidth) {
3163
+ this.textManage.updateWidth(0);
3164
+ }
3152
3165
  });
3153
3166
  }
3154
3167
  ngOnDestroy() {
@@ -3463,6 +3476,20 @@ const setClipboardData = (data, elements) => {
3463
3476
  data === null || data === void 0 ? void 0 : data.setData(`application/${CLIP_BOARD_FORMAT_KEY}`, encoded);
3464
3477
  data === null || data === void 0 ? void 0 : data.setData(`text/plain`, text);
3465
3478
  };
3479
+ const setClipboardDataByImage = (data, image) => {
3480
+ const stringObj = JSON.stringify(image);
3481
+ const encoded = window.btoa(encodeURIComponent(stringObj));
3482
+ data === null || data === void 0 ? void 0 : data.setData(`application/${CLIP_BOARD_IMAGE_FORMAT_KEY}`, encoded);
3483
+ };
3484
+ const getImageItemFromClipboard = (data) => {
3485
+ const encoded = data === null || data === void 0 ? void 0 : data.getData(`application/${CLIP_BOARD_IMAGE_FORMAT_KEY}`);
3486
+ let imageItem = null;
3487
+ if (encoded) {
3488
+ const decoded = decodeURIComponent(window.atob(encoded));
3489
+ imageItem = JSON.parse(decoded);
3490
+ }
3491
+ return imageItem;
3492
+ };
3466
3493
  const getDataFromClipboard = (data) => {
3467
3494
  const encoded = data === null || data === void 0 ? void 0 : data.getData(`application/${CLIP_BOARD_FORMAT_KEY}`);
3468
3495
  let nodesData = [];
@@ -3916,7 +3943,7 @@ const withNodeHoverDetect = (board) => {
3916
3943
  };
3917
3944
 
3918
3945
  const withNodeImage = (board) => {
3919
- const { keydown, mousedown, globalMouseup, insertFragment } = board;
3946
+ const { keydown, mousedown, globalMouseup, setFragment, insertFragment, deleteFragment } = board;
3920
3947
  board.mousedown = (event) => {
3921
3948
  const selectedImageElement = getSelectedImageElement(board);
3922
3949
  if (PlaitBoard.isReadonly(board) || !isMainPointer(event) || !PlaitBoard.isPointer(board, PlaitPointerType.selection)) {
@@ -3965,6 +3992,21 @@ const withNodeImage = (board) => {
3965
3992
  }
3966
3993
  globalMouseup(event);
3967
3994
  };
3995
+ board.setFragment = (data) => {
3996
+ const selectedImageElement = getSelectedImageElement(board);
3997
+ if (selectedImageElement) {
3998
+ setClipboardDataByImage(data, selectedImageElement.data.image);
3999
+ return;
4000
+ }
4001
+ setFragment(data);
4002
+ };
4003
+ board.deleteFragment = (data) => {
4004
+ const selectedImageElement = getSelectedImageElement(board);
4005
+ if (selectedImageElement) {
4006
+ MindTransforms.removeImage(board, selectedImageElement);
4007
+ }
4008
+ deleteFragment(data);
4009
+ };
3968
4010
  board.insertFragment = (data, targetPoint) => {
3969
4011
  const selectedElements = getSelectedElements(board);
3970
4012
  const isSelectedImage = !!getSelectedImageElement(board);
@@ -3978,6 +4020,11 @@ const withNodeImage = (board) => {
3978
4020
  return;
3979
4021
  }
3980
4022
  }
4023
+ const imageItem = getImageItemFromClipboard(data);
4024
+ if (imageItem && (isSingleSelection || isSelectedImage)) {
4025
+ const selectedElement = (selectedElements[0] || getSelectedImageElement(board));
4026
+ MindTransforms.setImage(board, selectedElement, imageItem);
4027
+ }
3981
4028
  insertFragment(data, targetPoint);
3982
4029
  };
3983
4030
  return board;
@@ -4198,12 +4245,14 @@ const withMind = (baseBoard) => {
4198
4245
  };
4199
4246
  board.deleteFragment = (data) => {
4200
4247
  const selectedElements = getSelectedElements(board);
4201
- const deletableElements = getFirstLevelElement(selectedElements).reverse();
4202
- const abstractRefs = deleteElementHandleAbstract(board, deletableElements);
4203
- MindTransforms.setAbstractsByRefs(board, abstractRefs);
4204
- const refs = deleteElementsHandleRightNodeCount(board, selectedElements);
4205
- MindTransforms.setRightNodeCountByRefs(board, refs);
4206
- MindTransforms.removeElements(board, selectedElements);
4248
+ if (selectedElements.length) {
4249
+ const deletableElements = getFirstLevelElement(selectedElements).reverse();
4250
+ const abstractRefs = deleteElementHandleAbstract(board, deletableElements);
4251
+ MindTransforms.setAbstractsByRefs(board, abstractRefs);
4252
+ const refs = deleteElementsHandleRightNodeCount(board, selectedElements);
4253
+ MindTransforms.setRightNodeCountByRefs(board, refs);
4254
+ MindTransforms.removeElements(board, selectedElements);
4255
+ }
4207
4256
  deleteFragment(data);
4208
4257
  };
4209
4258
  return withNodeResize(withNodeImage(withNodeHoverDetect(withMindHotkey(withMindExtend(withCreateMind(withAbstract(withNodeDnd(board))))))));