@plait/mind 0.24.1 → 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';
@@ -3002,6 +3002,7 @@ class NodeImageDrawer {
3002
3002
  this.g = createG();
3003
3003
  const foreignRectangle = getImageForeignRectangle(this.board, element);
3004
3004
  this.foreignObject = createForeignObject(foreignRectangle.x, foreignRectangle.y, foreignRectangle.width, foreignRectangle.height);
3005
+ this.foreignObject.style.padding = `6px`;
3005
3006
  this.g.append(this.foreignObject);
3006
3007
  const componentType = this.board.getPluginOptions(WithMindPluginKey).imageComponentType;
3007
3008
  if (!componentType) {
@@ -3540,6 +3541,20 @@ const setClipboardData = (data, elements) => {
3540
3541
  data?.setData(`application/${CLIP_BOARD_FORMAT_KEY}`, encoded);
3541
3542
  data?.setData(`text/plain`, text);
3542
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
+ };
3543
3558
  const getDataFromClipboard = (data) => {
3544
3559
  const encoded = data?.getData(`application/${CLIP_BOARD_FORMAT_KEY}`);
3545
3560
  let nodesData = [];
@@ -3996,7 +4011,7 @@ const withNodeHoverDetect = (board) => {
3996
4011
  };
3997
4012
 
3998
4013
  const withNodeImage = (board) => {
3999
- const { keydown, mousedown, globalMouseup, insertFragment } = board;
4014
+ const { keydown, mousedown, globalMouseup, setFragment, insertFragment, deleteFragment } = board;
4000
4015
  board.mousedown = (event) => {
4001
4016
  const selectedImageElement = getSelectedImageElement(board);
4002
4017
  if (PlaitBoard.isReadonly(board) || !isMainPointer(event) || !PlaitBoard.isPointer(board, PlaitPointerType.selection)) {
@@ -4045,6 +4060,21 @@ const withNodeImage = (board) => {
4045
4060
  }
4046
4061
  globalMouseup(event);
4047
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
+ };
4048
4078
  board.insertFragment = (data, targetPoint) => {
4049
4079
  const selectedElements = getSelectedElements(board);
4050
4080
  const isSelectedImage = !!getSelectedImageElement(board);
@@ -4058,6 +4088,11 @@ const withNodeImage = (board) => {
4058
4088
  return;
4059
4089
  }
4060
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
+ }
4061
4096
  insertFragment(data, targetPoint);
4062
4097
  };
4063
4098
  return board;
@@ -4278,12 +4313,14 @@ const withMind = (baseBoard) => {
4278
4313
  };
4279
4314
  board.deleteFragment = (data) => {
4280
4315
  const selectedElements = getSelectedElements(board);
4281
- const deletableElements = getFirstLevelElement(selectedElements).reverse();
4282
- const abstractRefs = deleteElementHandleAbstract(board, deletableElements);
4283
- MindTransforms.setAbstractsByRefs(board, abstractRefs);
4284
- const refs = deleteElementsHandleRightNodeCount(board, selectedElements);
4285
- MindTransforms.setRightNodeCountByRefs(board, refs);
4286
- 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
+ }
4287
4324
  deleteFragment(data);
4288
4325
  };
4289
4326
  return withNodeResize(withNodeImage(withNodeHoverDetect(withMindHotkey(withMindExtend(withCreateMind(withAbstract(withNodeDnd(board))))))));