@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';
@@ -1119,6 +1119,9 @@ const getNewNodeHeight = (board, element, newNodeDynamicWidth) => {
1119
1119
  if (height !== newHeight) {
1120
1120
  return newHeight;
1121
1121
  }
1122
+ if (Math.abs(newHeight / board.viewport.zoom - element.height) > 2) {
1123
+ return newHeight;
1124
+ }
1122
1125
  return undefined;
1123
1126
  };
1124
1127
 
@@ -2999,6 +3002,7 @@ class NodeImageDrawer {
2999
3002
  this.g = createG();
3000
3003
  const foreignRectangle = getImageForeignRectangle(this.board, element);
3001
3004
  this.foreignObject = createForeignObject(foreignRectangle.x, foreignRectangle.y, foreignRectangle.width, foreignRectangle.height);
3005
+ this.foreignObject.style.padding = `6px`;
3002
3006
  this.g.append(this.foreignObject);
3003
3007
  const componentType = this.board.getPluginOptions(WithMindPluginKey).imageComponentType;
3004
3008
  if (!componentType) {
@@ -3064,8 +3068,6 @@ class MindNodeComponent extends PlaitPluginElementComponent {
3064
3068
  this.textManage = new TextManage(this.board, this.viewContainerRef, () => {
3065
3069
  const rect = getTopicRectangleByNode(this.board, this.node);
3066
3070
  return rect;
3067
- }, (point) => {
3068
- return isHitMindElement(this.board, point, this.element);
3069
3071
  }, (textManageRef) => {
3070
3072
  const width = textManageRef.width;
3071
3073
  const height = textManageRef.height;
@@ -3204,10 +3206,21 @@ class MindNodeComponent extends PlaitPluginElementComponent {
3204
3206
  }
3205
3207
  editTopic() {
3206
3208
  this.activeDrawer.draw(this.element, this.g, { selected: this.selected, isEditing: true });
3209
+ // update text max-width when image width greater than topic default max width to cover node topic default max width style
3210
+ const defaultMaxWidth = TOPIC_DEFAULT_MAX_WORD_COUNT * (PlaitMind.isMind(this.element) ? ROOT_TOPIC_FONT_SIZE : TOPIC_FONT_SIZE);
3211
+ let hasMaxWidth = false;
3212
+ if (!this.element.manualWidth && MindElement.hasImage(this.element) && this.element.data.image.width > defaultMaxWidth) {
3213
+ const width = NodeSpace.getNodeDynamicWidth(this.board, this.element);
3214
+ this.textManage.updateWidth(width);
3215
+ hasMaxWidth = true;
3216
+ }
3207
3217
  this.textManage.edit((origin) => {
3208
3218
  if (origin === ExitOrigin.default) {
3209
3219
  this.activeDrawer.draw(this.element, this.g, { selected: this.selected, isEditing: false });
3210
3220
  }
3221
+ if (hasMaxWidth) {
3222
+ this.textManage.updateWidth(0);
3223
+ }
3211
3224
  });
3212
3225
  }
3213
3226
  ngOnDestroy() {
@@ -3528,6 +3541,20 @@ const setClipboardData = (data, elements) => {
3528
3541
  data?.setData(`application/${CLIP_BOARD_FORMAT_KEY}`, encoded);
3529
3542
  data?.setData(`text/plain`, text);
3530
3543
  };
3544
+ const setClipboardDataByImage = (data, image) => {
3545
+ const stringObj = JSON.stringify(image);
3546
+ const encoded = window.btoa(encodeURIComponent(stringObj));
3547
+ data?.setData(`application/${CLIP_BOARD_IMAGE_FORMAT_KEY}`, encoded);
3548
+ };
3549
+ const getImageItemFromClipboard = (data) => {
3550
+ const encoded = data?.getData(`application/${CLIP_BOARD_IMAGE_FORMAT_KEY}`);
3551
+ let imageItem = null;
3552
+ if (encoded) {
3553
+ const decoded = decodeURIComponent(window.atob(encoded));
3554
+ imageItem = JSON.parse(decoded);
3555
+ }
3556
+ return imageItem;
3557
+ };
3531
3558
  const getDataFromClipboard = (data) => {
3532
3559
  const encoded = data?.getData(`application/${CLIP_BOARD_FORMAT_KEY}`);
3533
3560
  let nodesData = [];
@@ -3984,7 +4011,7 @@ const withNodeHoverDetect = (board) => {
3984
4011
  };
3985
4012
 
3986
4013
  const withNodeImage = (board) => {
3987
- const { keydown, mousedown, globalMouseup, insertFragment } = board;
4014
+ const { keydown, mousedown, globalMouseup, setFragment, insertFragment, deleteFragment } = board;
3988
4015
  board.mousedown = (event) => {
3989
4016
  const selectedImageElement = getSelectedImageElement(board);
3990
4017
  if (PlaitBoard.isReadonly(board) || !isMainPointer(event) || !PlaitBoard.isPointer(board, PlaitPointerType.selection)) {
@@ -4033,6 +4060,21 @@ const withNodeImage = (board) => {
4033
4060
  }
4034
4061
  globalMouseup(event);
4035
4062
  };
4063
+ board.setFragment = (data) => {
4064
+ const selectedImageElement = getSelectedImageElement(board);
4065
+ if (selectedImageElement) {
4066
+ setClipboardDataByImage(data, selectedImageElement.data.image);
4067
+ return;
4068
+ }
4069
+ setFragment(data);
4070
+ };
4071
+ board.deleteFragment = (data) => {
4072
+ const selectedImageElement = getSelectedImageElement(board);
4073
+ if (selectedImageElement) {
4074
+ MindTransforms.removeImage(board, selectedImageElement);
4075
+ }
4076
+ deleteFragment(data);
4077
+ };
4036
4078
  board.insertFragment = (data, targetPoint) => {
4037
4079
  const selectedElements = getSelectedElements(board);
4038
4080
  const isSelectedImage = !!getSelectedImageElement(board);
@@ -4046,6 +4088,11 @@ const withNodeImage = (board) => {
4046
4088
  return;
4047
4089
  }
4048
4090
  }
4091
+ const imageItem = getImageItemFromClipboard(data);
4092
+ if (imageItem && (isSingleSelection || isSelectedImage)) {
4093
+ const selectedElement = (selectedElements[0] || getSelectedImageElement(board));
4094
+ MindTransforms.setImage(board, selectedElement, imageItem);
4095
+ }
4049
4096
  insertFragment(data, targetPoint);
4050
4097
  };
4051
4098
  return board;
@@ -4266,12 +4313,14 @@ const withMind = (baseBoard) => {
4266
4313
  };
4267
4314
  board.deleteFragment = (data) => {
4268
4315
  const selectedElements = getSelectedElements(board);
4269
- const deletableElements = getFirstLevelElement(selectedElements).reverse();
4270
- const abstractRefs = deleteElementHandleAbstract(board, deletableElements);
4271
- MindTransforms.setAbstractsByRefs(board, abstractRefs);
4272
- const refs = deleteElementsHandleRightNodeCount(board, selectedElements);
4273
- MindTransforms.setRightNodeCountByRefs(board, refs);
4274
- MindTransforms.removeElements(board, selectedElements);
4316
+ if (selectedElements.length) {
4317
+ const deletableElements = getFirstLevelElement(selectedElements).reverse();
4318
+ const abstractRefs = deleteElementHandleAbstract(board, deletableElements);
4319
+ MindTransforms.setAbstractsByRefs(board, abstractRefs);
4320
+ const refs = deleteElementsHandleRightNodeCount(board, selectedElements);
4321
+ MindTransforms.setRightNodeCountByRefs(board, refs);
4322
+ MindTransforms.removeElements(board, selectedElements);
4323
+ }
4275
4324
  deleteFragment(data);
4276
4325
  };
4277
4326
  return withNodeResize(withNodeImage(withNodeHoverDetect(withMindHotkey(withMindExtend(withCreateMind(withAbstract(withNodeDnd(board))))))));