From 6fbcb4f1279e5bd5c24ed8de7438e8b4a08c6eec Mon Sep 17 00:00:00 2001 From: fantasticit Date: Sun, 3 Apr 2022 15:40:28 +0800 Subject: [PATCH] feat: refactor menu, improve link, add countdown --- .../src/components/icons/IconCountdown.tsx | 16 ++ .../client/src/components/icons/index.tsx | 1 + packages/client/src/tiptap/basekit.tsx | 4 +- .../client/src/tiptap/extensions/countdown.ts | 2 +- .../{evoke-menu.tsx => quick-insert.tsx} | 12 +- .../client/src/tiptap/extensions/search.ts | 1 + packages/client/src/tiptap/menubar.tsx | 176 +++++++++--------- .../{ => _components}/color-picker/index.tsx | 0 .../color-picker/style.module.scss | 0 .../tiptap/menus/{ => _components}/size.tsx | 0 .../src/tiptap/menus/{event.ts => _event.ts} | 5 + .../menus/{align.tsx => align/index.tsx} | 5 +- .../tiptap/menus/background-color/index.tsx | 46 +++++ packages/client/src/tiptap/menus/banner.tsx | 105 ----------- .../src/tiptap/menus/base-bubble-menu.tsx | 62 ------ .../client/src/tiptap/menus/base-insert.tsx | 52 ------ .../client/src/tiptap/menus/base-menu.tsx | 89 --------- .../src/tiptap/menus/blockquote/index.tsx | 25 +++ .../client/src/tiptap/menus/bold/index.tsx | 24 +++ .../src/tiptap/menus/bullet-list/index.tsx | 24 +++ .../menus/clear-node-and-marks/index.tsx | 25 +++ .../client/src/tiptap/menus/code/index.tsx | 24 +++ packages/client/src/tiptap/menus/color.tsx | 80 -------- .../client/src/tiptap/menus/countdown.tsx | 66 ------- .../src/tiptap/menus/countdown/bubble.tsx | 40 ++++ .../src/tiptap/menus/countdown/index.tsx | 17 ++ .../modal.tsx} | 8 +- .../src/tiptap/menus/countdown/service.ts | 10 + .../client/src/tiptap/menus/emoji/index.tsx | 3 +- .../{font-size.tsx => fontsize/index.tsx} | 5 +- .../{paragraph.tsx => heading/index.tsx} | 5 +- .../tiptap/menus/horizontal-rule/index.tsx | 24 +++ .../client/src/tiptap/menus/ident/index.tsx | 42 +++++ .../menus/{iframe.tsx => iframe/bubble.tsx} | 8 +- .../client/src/tiptap/menus/iframe/index.tsx | 15 ++ .../menus/{image.tsx => image/bubble.tsx} | 8 +- .../client/src/tiptap/menus/image/index.tsx | 15 ++ .../{media-insert.tsx => insert/index.tsx} | 21 +-- .../client/src/tiptap/menus/italic/index.tsx | 24 +++ packages/client/src/tiptap/menus/link.tsx | 126 ------------- .../client/src/tiptap/menus/link/bubble.tsx | 81 ++++++++ .../client/src/tiptap/menus/link/index.tsx | 31 +++ .../client/src/tiptap/menus/link/modal.tsx | 59 ++++++ .../client/src/tiptap/menus/link/service.ts | 21 +++ packages/client/src/tiptap/menus/list.tsx | 71 ------- .../src/tiptap/menus/ordered-list/index.tsx | 24 +++ .../{evoke-menu.tsx => quick-insert.tsx} | 18 +- .../client/src/tiptap/menus/redo/index.tsx | 22 +++ .../client/src/tiptap/menus/search/index.tsx | 3 +- .../client/src/tiptap/menus/strike/index.tsx | 24 +++ .../src/tiptap/menus/subscript/index.tsx | 23 +++ .../src/tiptap/menus/superscript/index.tsx | 23 +++ .../menus/{table.tsx => table/bubble.tsx} | 6 +- .../client/src/tiptap/menus/table/index.tsx | 11 ++ .../src/tiptap/menus/task-list/index.tsx | 24 +++ .../src/tiptap/menus/text-color/index.tsx | 50 +++++ .../src/tiptap/menus/underline/index.tsx | 24 +++ .../client/src/tiptap/menus/undo/index.tsx | 22 +++ .../html-to-prosemirror/nodes/countdown.ts | 9 + .../markdown/html-to-prosemirror/renderer.ts | 2 + .../markdown/markdown-to-html/index.ts | 6 +- .../markdown/prosemirror-to-markdown/index.ts | 2 + .../src/tiptap/wrappers/countdown/index.tsx | 29 ++- 63 files changed, 1003 insertions(+), 797 deletions(-) create mode 100644 packages/client/src/components/icons/IconCountdown.tsx rename packages/client/src/tiptap/extensions/{evoke-menu.tsx => quick-insert.tsx} (92%) rename packages/client/src/tiptap/menus/{ => _components}/color-picker/index.tsx (100%) rename packages/client/src/tiptap/menus/{ => _components}/color-picker/style.module.scss (100%) rename packages/client/src/tiptap/menus/{ => _components}/size.tsx (100%) rename packages/client/src/tiptap/menus/{event.ts => _event.ts} (61%) rename packages/client/src/tiptap/menus/{align.tsx => align/index.tsx} (90%) create mode 100644 packages/client/src/tiptap/menus/background-color/index.tsx delete mode 100644 packages/client/src/tiptap/menus/banner.tsx delete mode 100644 packages/client/src/tiptap/menus/base-bubble-menu.tsx delete mode 100644 packages/client/src/tiptap/menus/base-insert.tsx delete mode 100644 packages/client/src/tiptap/menus/base-menu.tsx create mode 100644 packages/client/src/tiptap/menus/blockquote/index.tsx create mode 100644 packages/client/src/tiptap/menus/bold/index.tsx create mode 100644 packages/client/src/tiptap/menus/bullet-list/index.tsx create mode 100644 packages/client/src/tiptap/menus/clear-node-and-marks/index.tsx create mode 100644 packages/client/src/tiptap/menus/code/index.tsx delete mode 100644 packages/client/src/tiptap/menus/color.tsx delete mode 100644 packages/client/src/tiptap/menus/countdown.tsx create mode 100644 packages/client/src/tiptap/menus/countdown/bubble.tsx create mode 100644 packages/client/src/tiptap/menus/countdown/index.tsx rename packages/client/src/tiptap/menus/{countdown-setting.tsx => countdown/modal.tsx} (82%) create mode 100644 packages/client/src/tiptap/menus/countdown/service.ts rename packages/client/src/tiptap/menus/{font-size.tsx => fontsize/index.tsx} (82%) rename packages/client/src/tiptap/menus/{paragraph.tsx => heading/index.tsx} (88%) create mode 100644 packages/client/src/tiptap/menus/horizontal-rule/index.tsx create mode 100644 packages/client/src/tiptap/menus/ident/index.tsx rename packages/client/src/tiptap/menus/{iframe.tsx => iframe/bubble.tsx} (95%) create mode 100644 packages/client/src/tiptap/menus/iframe/index.tsx rename packages/client/src/tiptap/menus/{image.tsx => image/bubble.tsx} (94%) create mode 100644 packages/client/src/tiptap/menus/image/index.tsx rename packages/client/src/tiptap/menus/{media-insert.tsx => insert/index.tsx} (85%) create mode 100644 packages/client/src/tiptap/menus/italic/index.tsx delete mode 100644 packages/client/src/tiptap/menus/link.tsx create mode 100644 packages/client/src/tiptap/menus/link/bubble.tsx create mode 100644 packages/client/src/tiptap/menus/link/index.tsx create mode 100644 packages/client/src/tiptap/menus/link/modal.tsx create mode 100644 packages/client/src/tiptap/menus/link/service.ts delete mode 100644 packages/client/src/tiptap/menus/list.tsx create mode 100644 packages/client/src/tiptap/menus/ordered-list/index.tsx rename packages/client/src/tiptap/menus/{evoke-menu.tsx => quick-insert.tsx} (91%) create mode 100644 packages/client/src/tiptap/menus/redo/index.tsx create mode 100644 packages/client/src/tiptap/menus/strike/index.tsx create mode 100644 packages/client/src/tiptap/menus/subscript/index.tsx create mode 100644 packages/client/src/tiptap/menus/superscript/index.tsx rename packages/client/src/tiptap/menus/{table.tsx => table/bubble.tsx} (96%) create mode 100644 packages/client/src/tiptap/menus/table/index.tsx create mode 100644 packages/client/src/tiptap/menus/task-list/index.tsx create mode 100644 packages/client/src/tiptap/menus/text-color/index.tsx create mode 100644 packages/client/src/tiptap/menus/underline/index.tsx create mode 100644 packages/client/src/tiptap/menus/undo/index.tsx create mode 100644 packages/client/src/tiptap/services/markdown/html-to-prosemirror/nodes/countdown.ts diff --git a/packages/client/src/components/icons/IconCountdown.tsx b/packages/client/src/components/icons/IconCountdown.tsx new file mode 100644 index 00000000..477e62bd --- /dev/null +++ b/packages/client/src/components/icons/IconCountdown.tsx @@ -0,0 +1,16 @@ +import { Icon } from '@douyinfe/semi-ui'; + +export const IconCountdown: React.FC<{ style?: React.CSSProperties }> = ({ style = {} }) => { + return ( + + + + + + } + /> + ); +}; diff --git a/packages/client/src/components/icons/index.tsx b/packages/client/src/components/icons/index.tsx index 501b79f5..88fd54fc 100644 --- a/packages/client/src/components/icons/index.tsx +++ b/packages/client/src/components/icons/index.tsx @@ -48,3 +48,4 @@ export * from './IconTableHeaderCell'; export * from './IconSub'; export * from './IconSup'; export * from './IconGlobe'; +export * from './IconCountdown'; diff --git a/packages/client/src/tiptap/basekit.tsx b/packages/client/src/tiptap/basekit.tsx index 582c6987..76e75fb2 100644 --- a/packages/client/src/tiptap/basekit.tsx +++ b/packages/client/src/tiptap/basekit.tsx @@ -13,7 +13,6 @@ import { DocumentChildren } from './extensions/document-children'; import { DocumentReference } from './extensions/document-reference'; import { Dropcursor } from './extensions/dropcursor'; import { Emoji } from './extensions/emoji'; -import { EvokeMenu } from './extensions/evoke-menu'; import { Focus } from './extensions/focus'; import { FontSize } from './extensions/font-size'; import { Gapcursor } from './extensions/gapcursor'; @@ -33,6 +32,7 @@ import { Mind } from './extensions/mind'; import { OrderedList } from './extensions/ordered-list'; import { Paragraph } from './extensions/paragraph'; import { Placeholder } from './extensions/placeholder'; +import { QuickInsert } from './extensions/quick-insert'; import { SearchNReplace } from './extensions/search'; import { SelectionExtension } from './extensions/selection'; import { Status } from './extensions/status'; @@ -69,7 +69,6 @@ export const BaseKit = [ DocumentReference, Dropcursor, Emoji, - EvokeMenu, Focus, FontSize, Gapcursor, @@ -89,6 +88,7 @@ export const BaseKit = [ OrderedList, Paragraph, Placeholder, + QuickInsert, SearchNReplace, SelectionExtension, Status, diff --git a/packages/client/src/tiptap/extensions/countdown.ts b/packages/client/src/tiptap/extensions/countdown.ts index a508984b..9133b246 100644 --- a/packages/client/src/tiptap/extensions/countdown.ts +++ b/packages/client/src/tiptap/extensions/countdown.ts @@ -30,7 +30,7 @@ export const Countdown = Node.create({ addAttributes() { return { title: { - default: '倒计时', + default: '倒计时⏰', parseHTML: getDatasetAttribute('title'), }, date: { diff --git a/packages/client/src/tiptap/extensions/evoke-menu.tsx b/packages/client/src/tiptap/extensions/quick-insert.tsx similarity index 92% rename from packages/client/src/tiptap/extensions/evoke-menu.tsx rename to packages/client/src/tiptap/extensions/quick-insert.tsx index 6e91386f..0c6a9d2c 100644 --- a/packages/client/src/tiptap/extensions/evoke-menu.tsx +++ b/packages/client/src/tiptap/extensions/quick-insert.tsx @@ -5,19 +5,19 @@ import { Decoration, DecorationSet } from 'prosemirror-view'; import Suggestion from '@tiptap/suggestion'; import tippy from 'tippy.js'; import { MenuList } from '../wrappers/menu-list'; -import { EVOKE_MENU_ITEMS } from '../menus/evoke-menu'; +import { QUICK_INSERT_ITEMS } from '../menus/quick-insert'; -export const EvokeMenuPluginKey = new PluginKey('evokeMenu'); +export const QuickInsertPluginKey = new PluginKey('quickInsert'); -export const EvokeMenu = Node.create({ - name: 'evokeMenu', +export const QuickInsert = Node.create({ + name: 'quickInsert', addOptions() { return { HTMLAttributes: {}, suggestion: { char: '/', - pluginKey: EvokeMenuPluginKey, + pluginKey: QuickInsertPluginKey, command: ({ editor, range, props }) => { const { state, dispatch } = editor.view; const $from = state.selection.$from; @@ -81,7 +81,7 @@ export const EvokeMenu = Node.create({ }).configure({ suggestion: { items: ({ query }) => { - return EVOKE_MENU_ITEMS.filter((command) => command.key.startsWith(query)); + return QUICK_INSERT_ITEMS.filter((command) => command.key.startsWith(query)); }, render: () => { let component; diff --git a/packages/client/src/tiptap/extensions/search.ts b/packages/client/src/tiptap/extensions/search.ts index 285e5f6e..5d49efb0 100644 --- a/packages/client/src/tiptap/extensions/search.ts +++ b/packages/client/src/tiptap/extensions/search.ts @@ -23,6 +23,7 @@ declare module '@tiptap/core' { * @description Replace all instances of search result with given replace term. */ replaceAll: () => ReturnType; + goToPrevSearchResult: () => void; goToNextSearchResult: () => void; }; } diff --git a/packages/client/src/tiptap/menubar.tsx b/packages/client/src/tiptap/menubar.tsx index 1f164c42..b257235b 100644 --- a/packages/client/src/tiptap/menubar.tsx +++ b/packages/client/src/tiptap/menubar.tsx @@ -1,25 +1,41 @@ import React from 'react'; -import { Space, Button } from '@douyinfe/semi-ui'; -import { IconUndo, IconRedo } from '@douyinfe/semi-icons'; -import { Tooltip } from 'components/tooltip'; -import { IconClear } from 'components/icons'; +import { Space } from '@douyinfe/semi-ui'; import { Divider } from './divider'; -import { MediaInsertMenu } from './menus/media-insert'; -import { Paragraph } from './menus/paragraph'; -import { FontSize } from './menus/font-size'; -import { BaseMenu } from './menus/base-menu'; -import { AlignMenu } from './menus/align'; -import { ListMenu } from './menus/list'; -import { BaseInsertMenu } from './menus/base-insert'; -import { BaseBubbleMenu } from './menus/base-bubble-menu'; -import { ImageBubbleMenu } from './menus/image'; -import { BannerBubbleMenu } from './menus/banner'; -import { LinkBubbleMenu } from './menus/link'; -import { IframeBubbleMenu } from './menus/iframe'; -import { TableBubbleMenu } from './menus/table'; -import { CountdownBubbleMenu } from './menus/countdown'; -import { CountdownSettingModal } from './menus/countdown-setting'; +import { Insert } from './menus/insert'; +import { Undo } from './menus/undo'; +import { Redo } from './menus/redo'; +import { CleadrNodeAndMarks } from './menus/clear-node-and-marks'; + +import { Heading } from './menus/heading'; +import { FontSize } from './menus/fontsize'; +import { Bold } from './menus/bold'; +import { Italic } from './menus/italic'; +import { Underline } from './menus/underline'; +import { Strike } from './menus/strike'; +import { Code } from './menus/code'; +import { Superscript } from './menus/superscript'; +import { Subscript } from './menus/subscript'; +import { TextColor } from './menus/text-color'; +import { BackgroundColor } from './menus/background-color'; + +import { Align } from './menus/align'; + +import { BulletList } from './menus/bullet-list'; +import { OrderedList } from './menus/ordered-list'; +import { TaskList } from './menus/task-list'; +import { Ident } from './menus/ident'; + +import { Emoji } from './menus/emoji'; +import { Link } from './menus/link'; +import { Blockquote } from './menus/blockquote'; +import { HorizontalRule } from './menus/horizontal-rule'; +import { Search } from './menus/search'; + +import { Countdonw } from './menus/countdown'; +import { Image } from './menus/image'; +import { Iframe } from './menus/iframe'; +import { Table } from './menus/table'; export const MenuBar: React.FC<{ editor: any }> = ({ editor }) => { if (!editor) { @@ -29,63 +45,52 @@ export const MenuBar: React.FC<{ editor: any }> = ({ editor }) => { return (
- + - -