Skip to content

Commit b491442

Browse files
committed
feat: extention draw
1 parent 7f6a000 commit b491442

File tree

22 files changed

+1653
-125
lines changed

22 files changed

+1653
-125
lines changed

docs/extensions/Drawer/index.md

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
---
2+
description: Drawer
3+
---
4+
5+
# Drawer
6+
7+
Drawer is a node extension that allows you to add an Drawer to your editor.
8+
9+
- [Drawer](https://easydrawer.vercel.app/)
10+
11+
## Usage
12+
13+
```tsx
14+
import { Drawer } from 'reactjs-tiptap-editor/extension-bundle'; // [!code ++]
15+
16+
const extensions = [
17+
...,
18+
// Import Extensions Here
19+
Drawer.configure({// [!code ++]
20+
upload: (file: any) => {// [!code ++]
21+
// upload file to server return url
22+
},// [!code ++]
23+
}),// [!code ++]
24+
];
25+
```

package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,8 @@
176176
"clsx": "^2.1.1",
177177
"deep-equal": "^2.2.3",
178178
"docx": "^8.6.0",
179-
"echo-drag-handle-plugin": "^0.0.2",
179+
"easydrawer": "^0.0.7",
180+
"frimousse": "^0.1.0",
180181
"katex": "^0.16.21",
181182
"lodash-es": "^4.17.21",
182183
"lucide-react": "^0.427.0",

pnpm-lock.yaml

Lines changed: 21 additions & 60 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/components/BubbleMenu.tsx

Lines changed: 58 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
import type { Editor } from '@tiptap/core';
22

33
import { BubbleMenuImage, BubbleMenuImageGif, BubbleMenuLink, BubbleMenuText, BubbleMenuVideo, ColumnsBubbleMenu, ContentMenu, TableBubbleMenu } from '@/components';
4-
import type { BubbleMenuProps as BubbleMenuPropsType } from '@/types';
5-
import BubbleMenuKatex from '@/components/menus/components/BubbleMenuKatex';
4+
import { BubbleMenuDrawer } from '@/components/menus/components/BubbleMenuDrawer';
65
import { BubbleMenuExcalidraw } from '@/components/menus/components/BubbleMenuExcalidraw';
76
import { BubbleMenuIframe } from '@/components/menus/components/BubbleMenuIframe';
8-
import { ImageGif } from '@/extensions';
7+
import BubbleMenuKatex from '@/components/menus/components/BubbleMenuKatex';
98
import { BubbleMenuMermaid } from '@/components/menus/components/BubbleMenuMermaid';
109
import { BubbleMenuTwitter } from '@/components/menus/components/BubbleMenuTwitter';
10+
import { ImageGif } from '@/extensions';
11+
import type { BubbleMenuProps as BubbleMenuPropsType } from '@/types';
1112

1213
export interface BubbleMenuComponentProps {
1314
editor: Editor
@@ -27,19 +28,60 @@ export function BubbleMenu({ editor, disabled, bubbleMenu }: BubbleMenuComponent
2728
const extensionsNames = editor.extensionManager.extensions.map(ext => ext.name);
2829

2930
const renderMenuItems = () => [
30-
extensionsNames.includes('columns') && !bubbleMenu?.columnConfig?.hidden ? <ColumnsBubbleMenu key="columns" editor={editor} /> : null,
31-
extensionsNames.includes('table') && !bubbleMenu?.tableConfig?.hidden ? <TableBubbleMenu key="table" editor={editor} /> : null,
32-
extensionsNames.includes('link') && !bubbleMenu?.linkConfig?.hidden ? <BubbleMenuLink key="link" editor={editor} disabled={disabled} /> : null,
33-
extensionsNames.includes('image') && !bubbleMenu?.imageConfig?.hidden ? <BubbleMenuImage key="image" editor={editor} disabled={disabled} /> : null,
34-
extensionsNames.includes(ImageGif.name) && !bubbleMenu?.imageGifConfig?.hidden ? <BubbleMenuImageGif key="imageGif" editor={editor} disabled={disabled} /> : null,
35-
extensionsNames.includes('video') && !bubbleMenu?.videoConfig?.hidden ? <BubbleMenuVideo key="video" editor={editor} disabled={disabled} /> : null,
36-
extensionsNames.includes('katex') && !bubbleMenu?.katexConfig?.hidden ? <BubbleMenuKatex key="katex" editor={editor} disabled={disabled} /> : null,
37-
extensionsNames.includes('excalidraw') && !bubbleMenu?.excalidrawConfig?.hidden ? <BubbleMenuExcalidraw key="excalidraw" editor={editor} disabled={disabled} /> : null,
38-
extensionsNames.includes('mermaid') && !bubbleMenu?.mermaidConfig?.hidden ? <BubbleMenuMermaid key="mermaid" editor={editor} disabled={disabled} /> : null,
39-
extensionsNames.includes('iframe') && !bubbleMenu?.iframeConfig?.hidden ? <BubbleMenuIframe key="iframe" editor={editor} disabled={disabled} /> : null,
40-
extensionsNames.includes('twitter') && !bubbleMenu?.twitterConfig?.hidden ? <BubbleMenuTwitter key="twitter" editor={editor} disabled={disabled} /> : null,
41-
!bubbleMenu?.floatingMenuConfig?.hidden ? <ContentMenu key="content" editor={editor} disabled={disabled} /> : null,
42-
!bubbleMenu?.textConfig?.hidden ? <BubbleMenuText key="text" editor={editor} disabled={disabled} /> : null,
31+
extensionsNames.includes('columns') && !bubbleMenu?.columnConfig?.hidden ? <ColumnsBubbleMenu editor={editor}
32+
key="columns"
33+
/> : null,
34+
extensionsNames.includes('table') && !bubbleMenu?.tableConfig?.hidden ? <TableBubbleMenu editor={editor}
35+
key="table"
36+
/> : null,
37+
extensionsNames.includes('link') && !bubbleMenu?.linkConfig?.hidden ? <BubbleMenuLink disabled={disabled}
38+
editor={editor}
39+
key="link"
40+
/> : null,
41+
extensionsNames.includes('image') && !bubbleMenu?.imageConfig?.hidden ? <BubbleMenuImage disabled={disabled}
42+
editor={editor}
43+
key="image"
44+
/> : null,
45+
extensionsNames.includes(ImageGif.name) && !bubbleMenu?.imageGifConfig?.hidden ? <BubbleMenuImageGif disabled={disabled}
46+
editor={editor}
47+
key="imageGif"
48+
/> : null,
49+
extensionsNames.includes('video') && !bubbleMenu?.videoConfig?.hidden ? <BubbleMenuVideo disabled={disabled}
50+
editor={editor}
51+
key="video"
52+
/> : null,
53+
extensionsNames.includes('katex') && !bubbleMenu?.katexConfig?.hidden ? <BubbleMenuKatex disabled={disabled}
54+
editor={editor}
55+
key="katex"
56+
/> : null,
57+
extensionsNames.includes('excalidraw') && !bubbleMenu?.excalidrawConfig?.hidden ? <BubbleMenuExcalidraw disabled={disabled}
58+
editor={editor}
59+
key="excalidraw"
60+
/> : null,
61+
extensionsNames.includes('mermaid') && !bubbleMenu?.mermaidConfig?.hidden ? <BubbleMenuMermaid disabled={disabled}
62+
editor={editor}
63+
key="mermaid"
64+
/> : null,
65+
extensionsNames.includes('iframe') && !bubbleMenu?.iframeConfig?.hidden ? <BubbleMenuIframe disabled={disabled}
66+
editor={editor}
67+
key="iframe"
68+
/> : null,
69+
extensionsNames.includes('twitter') && !bubbleMenu?.twitterConfig?.hidden ? <BubbleMenuTwitter disabled={disabled}
70+
editor={editor}
71+
key="twitter"
72+
/> : null,
73+
!bubbleMenu?.floatingMenuConfig?.hidden ? <ContentMenu disabled={disabled}
74+
editor={editor}
75+
key="content"
76+
/> : null,
77+
!bubbleMenu?.textConfig?.hidden ? <BubbleMenuText disabled={disabled}
78+
editor={editor}
79+
key="text"
80+
/> : null,
81+
extensionsNames.includes('drawer') && !bubbleMenu?.drawerConfig?.hidden ? <BubbleMenuDrawer disabled={disabled}
82+
editor={editor}
83+
key="drawer"
84+
/> : null,
4385
];
4486

4587
if (bubbleMenu?.render) {

src/components/menus/bubble.ts

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,26 @@ function imageMermaidAlignMenus(editor: Editor): BubbleMenuItem[] {
170170
}));
171171
}
172172

173+
function imageDrawerAlignMenus(editor: Editor): BubbleMenuItem[] {
174+
const types: ImageAlignments[] = ['left', 'center', 'right'];
175+
const iconMap: any = {
176+
left: 'AlignLeft',
177+
center: 'AlignCenter',
178+
right: 'AlignRight',
179+
};
180+
return types.map(k => ({
181+
type: `image-${k}`,
182+
component: ActionButton,
183+
componentProps: {
184+
tooltip: localeActions.t(`editor.textalign.${k}.tooltip`),
185+
icon: iconMap[k],
186+
action: () => editor.commands?.setAlignImageDrawer?.(k),
187+
isActive: () => editor.isActive({ align: k }) || false,
188+
disabled: false,
189+
},
190+
}));
191+
}
192+
173193
function videoSizeMenus(editor: Editor): BubbleMenuItem[] {
174194
const types: BubbleImageOrVideoSizeType[] = ['size-small', 'size-medium', 'size-large'];
175195
const icons: NonNullable<ButtonViewReturn['componentProps']['icon']>[] = [
@@ -300,6 +320,39 @@ export function getBubbleMermaid(editor: Editor): BubbleMenuItem[] {
300320
];
301321
}
302322

323+
export function getBubbleDrawer(editor: Editor): BubbleMenuItem[] {
324+
return [
325+
...imageDrawerAlignMenus(editor),
326+
{
327+
type: 'edit',
328+
component: ActionButton,
329+
componentProps: {
330+
editor,
331+
tooltip: localeActions.t('editor.edit'),
332+
icon: 'Pencil',
333+
action: () => {
334+
console.log('AAA');
335+
336+
return true;
337+
},
338+
},
339+
},
340+
{
341+
type: 'remove',
342+
component: ActionButton,
343+
componentProps: {
344+
editor,
345+
tooltip: localeActions.t('editor.remove'),
346+
icon: 'Trash2',
347+
action: () => {
348+
const { state, dispatch } = editor.view;
349+
deleteSelection(state, dispatch);
350+
},
351+
},
352+
},
353+
];
354+
}
355+
303356
export function getBubbleVideo(editor: Editor): BubbleMenuItem[] {
304357
return [
305358
...videoSizeMenus(editor),

0 commit comments

Comments
 (0)