Commit Graph
43 Commits
Author SHA1 Message Date
doouding 1c8d25bc29 feat: add ElementTransformManager for edgeless element basic manipulation (#10824)
### Overview:
We've been working with some legacy code in the default-tool and edgeless-selected-rect modules, which are responsible for fundamental operations like moving, resizing, and rotating elements. Currently, these operations are hardcoded, making it challenging to extend functionalities without diving deep into the code.

### What's Changing:
Introducing `ElementTransformManager` to streamline the handling of basic transformations (move, resize, rotate) while allowing the business logic to dictate when these actions occur.

Providing two ways to extend the transformations behaviour:
- Extends inside element view definition: Elements can decide how to handle move/resize events, such as enforcing size constraints.
- Extension mechanism provided by this manager: Adjust or completely override default drag behaviors, like snapping elements into alignment.

### Code Examples:
Delegate element movement to TransformManager:
```typescript
class DefaultTool {
  override dragStart(event) {
    if(this.dragType === DragType.ContentMoving) {
      const transformManager = this.std.get(TransformManagerIdentifier);
      transformManager.startDrag({ selectedElements, event });
    }
  }
}
```

 Enforce minimum width inside view definition:
```typescript
class EdgelessNoteBlock extends GfxBlockComponent {
  onResizeDelta({ dw, dh }) {
    const bound = this.model.elementBound;
    bound.w = Math.min(MAX_WIDTH, bound.w + dw);
    bound.h = Math.min(MAX_HEIGHT, bound.h + dh);
    this.model.xywh = bound.serialize();
  }
}
```

Use extension to implement element snapping:
```typescript
import { TransformerExtension } from '@blocksuite/std/gfx';

// Just extends the TransformerExtension
class SnapManager extends TransformerExtension {
  static override key = 'snap-manager';
  onDragInitialize() {
    return {
      onDragMove(context) {
        const { dx, dy } = this.getAlignmentMoveDistance(context.elements);
        context.dx = dx;
        context.dy = dy;
      }
    }
  }
}
```

### Others

The migration will be divided into several PRs. This PR mostly focus on refactoring elements movement part of `default-tool`.
- Delegate elements movement to `TransformManager`
- Rewrite the default tool extension into `TransformManager` extension
- Add drag handler interface to gfx view (both `GfxBlockComponent` and `GfxElementModelView`) to allow element to define how it gonna react on drag
2025-03-19 15:30:06 +00:00
doouding 0cdec6957b fix: align with only one element at a time (#10739)
### Changed
- Align with only one element at a time
- Mind map nodes cannot be alignment candidates
2025-03-10 09:43:07 +00:00
doouding 460e088873 fix: block should not be selectable when dragged into note (#10664)
### Changed
- Fixed the issue that block can still be selected when dragged into note
- Rewrite grid and layer with extension infra
2025-03-07 04:40:05 +00:00
doouding 30f97892b1 fix: snap line offset & check alignment candidates in real time (#10605) 2025-03-05 07:05:21 +00:00
doouding 1c29d0e269 feat: optimize edgeless alignment (#10435)
### Changed
- alignment line style
- threshold of snapping
- optimize alignment checking performance
2025-03-04 03:03:31 +00:00
doouding 9bb74bce6b fix: drag bookmark from note to edgeless (#10389) 2025-02-24 06:13:05 +00:00
doouding a0a97d0751 fix: drag connector and group element (#10385) 2025-02-24 06:13:05 +00:00
doouding dad39d1129 fix: handle unsupported image upload (#10272) 2025-02-19 03:47:48 +00:00
doouding c21f71f58c feat: add dnd database preview block (#10258) 2025-02-18 10:25:00 +00:00
doouding 75678ceca8 fix: allow to drop inside the note block in edgeless mode (#10255) 2025-02-18 10:24:59 +00:00
doouding 88095a87a8 fix: create linked-doc block when content can't be drop as gfx block (#10250) 2025-02-18 08:40:57 +00:00
doouding 73f3226f58 fix: drag paragraph block from note to edgeless (#10242) 2025-02-18 07:30:00 +00:00
doouding 0af921c3fc fix: edgeless drag handle position (#10241) 2025-02-18 07:29:59 +00:00
doouding eed00e0b26 fix: mindmap ai preview (#10222) 2025-02-17 12:45:20 +00:00
doouding 8ece812017 feat: dnd image preview && edgeless dnd preview issue (#10177)
### Changed
- Add new image block to render dnd preview
- Fixed the bug that dragging uploaded image does not have width and height
- Fixed the bug that drag image block from page to edgeless does not have width and height
- Better edgeless dnd preview
2025-02-14 16:02:03 +00:00
doouding ed0b25def0 fix: drop indicator in center peek (#10136) 2025-02-13 02:53:07 +00:00
doouding 81ead5cd35 fix: database cross doc dragging (#10126) 2025-02-13 02:53:06 +00:00
doouding f0a99851aa fix: embed block style when dragging doc from sidebar doc list to edgeless (#10122) 2025-02-13 01:35:33 +00:00
doouding 40121b6ad5 feat: dragged blocks should set opacity (#10119) 2025-02-13 01:35:33 +00:00
doouding 270d1754a3 feat: edgeless dnd preview (#10117) 2025-02-12 12:37:07 +00:00
doouding f89fcf82f8 feat: edgeless dnd (#9988)
### Changed
- Support edgelss dnd
- Simplify the drag-handle state
2025-02-12 12:37:06 +00:00
doouding 02122098c7 fix: drag block issue (#9902)
### Changed
- Added support for changing the preview offset during dragging.
- Fixed the preview rendering for embed block and surface-ref block
- Resolved an issue where the host element might be reused in certain cases, which could cause unexpected behavior
- Moved viewport-related constants and methods to a more appropriate location
2025-02-05 07:25:53 +00:00
doouding 73b4437081 chore: dnd cleanup (#9899) 2025-01-27 04:29:14 +00:00
doouding 1560880abd fix: drag embed block preview (#9791)
Fixes [BS-1518](https://linear.app/affine-design/issue/BS-1518/拖拽一个-embed-view-的-linked-doc,其-indicator-是错误的)
2025-01-20 09:25:05 +00:00
doouding b350dd1580 fix: legacy e2e test debug (#9746) 2025-01-17 04:26:59 +00:00
doouding 99717196c5 refactor: rewrite blocksuite dnd (#9595)
### Changed

- Refactored BlockSuite drag-and-drop using @atlaskit/pragmatic-drag-and-drop/element/adapter.
- Updated block dragging to use the new drag-and-drop infrastructure.

### BlockSuite DND API

Access the BlockSuite drag-and-drop API via `std.dnd`. This is a lightweight wrapper around pragmatic-drag-and-drop, offering convenient generic types and more intuitive option names.

#### Drag payload structure
There's some constrain about drag payload. The whole drag payload looks like this:

```typescript
type DragPayload = {
  entity: {
    type: string
  },
  from: {
    at: 'blocksuite',
    docId: string
  }
}
```
- The `from` field is auto-generated—no need for manual handling.
- The `entity` field is customizable, but it must include a `type`.

All drag-and-drop methods accept a generic type for entity, ensuring more accurate payloads in event handlers.

```typescript
type BlockEntity = {
  type: 'blocks',
  blockIds: string[]
}

dnd.draggable<BlockEntity>({
  element: someElement,
  setDragData: () => {
    // the return type must satisfy the generic type
    // in this case, it's BlockEntity
    return {
      type: 'blocks',
      blockIds: []
    }
  }
});

dnd.monitor<BlockEntity>({
  // the arguments is same for other event handler
  onDrag({ source }) {
    // the type of this is BlockEntity
    source.data.entity
  }
})
```

#### Drop payload
When hover on droppable target. You can set drop payload as well. All drag-and-drop methods accept a second generic type for drop payload.

The drop payload is customizable. Additionally, the DND system will add an `edge` field to the final payload object, indicating the nearest edge of the drop target relative to the current drag position.

```typescript
type DropPayload = {
  blockId: string;
}

dnd.dropTarget<BlockEntity, DropPayload>({
  getData() {
    // the type should be DropPayload
    return {
      blockId: 'someId'
    }
  }
});

dnd.monitor<BlockEntity, DropPayload>({
  // drag over on drop target
  onDrag({ location }) {
    const target = location.current.dropTargets[0];

    // the type is DropPayload
    target.data;
    // retrieve the nearest edge of the drop target relative to the current drop position.
    target.data.edge;
  }
})
```
2025-01-16 12:36:58 +00:00
doouding cb5d7eaabc feat: add scroll wheel zoom setting (#9476)
### Changed
Add `scroll wheel to zoom` setting option, when the option enables, user can zoom in and out with scroll wheel without pressing the cmd/ctrl key.
2025-01-03 06:09:10 +00:00
doouding a4e94ab72f feat: add shortcut of zooming to selection (#9447)
### Changed
- change edgeless shortcut `cmd + 0`, `cmd + 1` to `alt + 0`, `alt + 1`
- add new shortcut `alt + 2` to zoom to currently selected elements
2025-01-03 03:57:05 +00:00
doouding 7dbb85c8c2 fix: sentry AFFINE-84T (#9368)
Fixes [BS-2243](https://linear.app/affine-design/issue/BS-2243/typeerror-cannot-read-properties-of-undefined-reading-length)
2024-12-27 07:07:53 +00:00
doouding 71272203b0 fix: beginPath before drawing drag indicator (#9364)
Fixes [BS-2238](https://linear.app/affine-design/issue/BS-2238/frame-套一个-mindmap-,拖动行为不可用)
2024-12-27 04:02:57 +00:00
doouding 0de4f7abbb test: add mindmap collapse test (#9336) 2024-12-26 08:23:09 +00:00
doouding 4ead165dd5 fix: mini mindmap layout (#9276)
Fixes [BS-2197](https://linear.app/affine-design/issue/BS-2197/ai-生成-mindmap-预览异常)
2024-12-24 06:55:26 +00:00
doouding b246a2d45f fix: drag mind map root node should layout in real time (#9252)
Fixes [BS-2062](https://linear.app/affine-design/issue/BS-2062/拖拽整个-mind-map-还是希望和之前一样,整个思维导图跟手)
2024-12-23 10:33:56 +00:00
doouding 393dcfec78 feat: bump bs (#8212)
https://github.com/toeverything/blocksuite/pull/8311
2024-09-12 04:28:14 +00:00
doouding 52d9569f47 feat: add mind map import feature flag (#8196) 2024-09-11 06:27:47 +00:00
doouding 05ac3dbdcb feat: bump bs (#7866) 2024-08-14 04:42:20 +00:00
doouding cf7b026832 feat: bump bs (#7430)
## Features

## Bugfix
- https://github.com/toeverything/BlockSuite/pull/7499 @doouding
- https://github.com/toeverything/BlockSuite/pull/7491 @golok727

## Refactor

## Misc
- https://github.com/toeverything/BlockSuite/pull/7454 @CatsJuice
2024-07-09 07:56:16 +00:00
doouding b379aa0a91 feat: bump bs (#7266)
## Features
- https://github.com/toeverything/BlockSuite/pull/7366 @donteatfriedrice
- https://github.com/toeverything/BlockSuite/pull/7360 @Flrande
- https://github.com/toeverything/BlockSuite/pull/7350 @Flrande

## Bugfix
- https://github.com/toeverything/BlockSuite/pull/7372 @Saul-Mirone
- https://github.com/toeverything/BlockSuite/pull/7365 @CatsJuice
- https://github.com/toeverything/BlockSuite/pull/7369 @doouding
- https://github.com/toeverything/BlockSuite/pull/7367 @akumatus
- https://github.com/toeverything/BlockSuite/pull/7364 @CatsJuice
- https://github.com/toeverything/BlockSuite/pull/7356 @akumatus
- https://github.com/toeverything/BlockSuite/pull/7335 @doouding
- https://github.com/toeverything/BlockSuite/pull/7362 @Flrande
- https://github.com/toeverything/BlockSuite/pull/7361 @Flrande
- https://github.com/toeverything/BlockSuite/pull/7359 @donteatfriedrice
- https://github.com/toeverything/BlockSuite/pull/7358 @zzj3720
- https://github.com/toeverything/BlockSuite/pull/7344 @fundon

## Refactor

## Misc
- https://github.com/toeverything/BlockSuite/pull/7370 @Saul-Mirone
- https://github.com/toeverything/BlockSuite/pull/7368 @Saul-Mirone
2024-06-19 06:56:25 +00:00
doouding 314fa064ab fix: peek view on synced doc (#7265) 2024-06-19 06:41:08 +00:00
doouding a3ca41fd6a fix: surface-ref peek view (#7208)
### Change
Add ref to `SurfaceRefPeekView`. It provide `fitViewportToTarget` method to fit the `surface-ref` content.

Related to [AFF-1200](https://linear.app/affine-design/issue/AFF-1200/center-peek-frame-rendering-issue).
2024-06-13 07:05:14 +00:00
doouding ec8b2cc32a feat: bump bs (#7198)
## Features
- https://github.com/toeverything/BlockSuite/pull/7264 @CatsJuice
- https://github.com/toeverything/BlockSuite/pull/7182 @CatsJuice
- https://github.com/toeverything/BlockSuite/pull/7181 @CatsJuice

## Bugfix
- https://github.com/toeverything/BlockSuite/pull/7273 @L-Sun
- https://github.com/toeverything/BlockSuite/pull/7272 @doouding
- https://github.com/toeverything/BlockSuite/pull/7263 @doouding
- https://github.com/toeverything/BlockSuite/pull/7252 @fourdim
- https://github.com/toeverything/BlockSuite/pull/7261 @fundon

## Refactor
- https://github.com/toeverything/BlockSuite/pull/7271 @golok727

## Misc
- https://github.com/toeverything/BlockSuite/pull/7274 @Saul-Mirone
- https://github.com/toeverything/BlockSuite/pull/7266 @Saul-Mirone
2024-06-12 05:50:58 +00:00
doouding 0dd0432531 fix(server): update mind map prompt (#7079) 2024-05-27 12:01:45 +00:00
doouding 6525c99631 feat(server): new prompt for expand mind map (#6678)
feat(server): new prompt for expand mind map

feat: add migration file
2024-04-24 07:10:11 +00:00