@@ -375,8 +375,6 @@ addOptions() {
375375
376376拖拽菜单扩展主要用于拖拽的菜单功能扩展,例如转换为、复制、剪切、删除等操作。
377377
378- ![ 拖拽功能扩展] ( /img/developer-guide/plugin/extension-points/ui/default-editor-extension-drag-menu.png )
379-
380378在 [ https://github.com/halo-dev/halo/pull/7861 ] ( https://github.com/halo-dev/halo/pull/7861 ) 中,我们重构了对编辑器拖拽区域的扩展,并且支持了对拖拽菜单的扩展。如果需要对拖拽菜单进行扩展,只需要在具体的 Tiptap Extension 中的 ` addOptions ` 中定义 ` getDraggableMenuItems ` 函数即可,如:
381379
382380``` ts
@@ -392,7 +390,31 @@ addOptions() {
392390}
393391```
394392
395- 并且,拖拽菜单最多支持两级菜单嵌套, 如果想扩展已有的一级菜单,为其二级菜单增加内容,则只需将二级菜单的 ` parentKey ` 设置为一级菜单的 ` key ` 。如:
393+ 同时,为了支持不同扩展对同一菜单项的扩展,我们提供了 ` extendsKey ` 属性,用于指定扩展目标菜单项的唯一标识。只需将 ` extendsKey ` 设置为已有的菜单项的 ` key ` ,即可扩展该菜单项。可扩展已有菜单项的 ` visible ` 、` isActive ` 、` disabled ` 、` action ` 方法以及 ` children.items ` 属性,如:
394+
395+ ``` ts
396+ {
397+ addOptions () {
398+ return {
399+ ... this .parent ?.(),
400+ getDraggableMenuItems({ editor }: { editor: Editor }) {
401+ return {
402+ extendsKey: CONVERT_TO_KEY ,
403+ // 当任意扩展目标菜单项的 visible 方法返回 false 时,当前菜单项不会显示。返回 true 则会继续执行后续的扩展实现。
404+ visible : ({ editor }) => {
405+ if (isActive (editor .state , " table" )) {
406+ return false ;
407+ }
408+ return true ;
409+ },
410+ };
411+ },
412+ };
413+ },
414+ };
415+ ```
416+
417+ 拖拽菜单最多支持两级菜单嵌套, 如果想扩展已有的一级菜单,为其二级菜单增加内容,则需要同时设置 ` extendsKey ` 和 ` children.items ` 属性。如:
396418
397419``` ts
398420{
@@ -401,7 +423,7 @@ addOptions() {
401423 ... this .parent ?.(),
402424 getDraggableMenuItems({ editor }: { editor: Editor }) {
403425 return {
404- parentKey : CONVERT_TO_KEY ,
426+ extendsKey : CONVERT_TO_KEY ,
405427 children: {
406428 items: [
407429 {
@@ -420,6 +442,8 @@ addOptions() {
420442}
421443```
422444
445+ 默认情况下,将会追加 ` items ` ,若想覆盖,则需要设置子菜单的 ` key ` 属性,将会覆盖原有的子菜单项。
446+
423447下面为 ` getDraggableMenuItems ` 的返回类型:
424448
425449``` ts
@@ -433,12 +457,14 @@ getDraggableMenuItems?: ({
433457
434458// 拖拽菜单项目属性
435459export interface DragButtonItemProps {
460+ extendsKey? : string ; // 扩展目标菜单项的唯一标识,如果提供了该属性,则视为扩展目标菜单项。
461+ key? : string ; // 唯一标识,如果同级菜单项设置了同样的 key,则会被合并为一个菜单项。
436462 priority? : number ; // 优先级,数字越小优先级越大,越靠前
437463 title? : string | (() => string ); // 标题
438464 icon? : Component ; // 图标
439- key? : string ; // 唯一标识,如果同级菜单项设置了同样的 key,则会被合并为一个菜单项。
440465 action? : ({ // 点击菜单后的操作,如果返回 Component,则会将其包含在子菜单中。
441466 // 可以通过调用 close 方法可以在操作完成后关闭拖拽菜单,或者当返回为 true 或 undefined 时,会自动关闭拖拽菜单,如果返回 false,则不会关闭拖拽菜单。
467+ // 多个扩展实现时,则按照顺序执行,并在返回非 undefined 值时停止执行。
442468 editor,
443469 node,
444470 pos,
@@ -451,7 +477,7 @@ export interface DragButtonItemProps {
451477 }) => Component | boolean | void | Promise <Component | boolean | void >;
452478 iconStyle? : string ; // 图标自定义样式
453479 class? : string ; // 自定义样式
454- visible? : ({ // 是否显示当前菜单项,默认为 true
480+ visible? : ({ // 是否显示当前菜单项,默认为 true,多个扩展实现时,以 AND 逻辑判断,即所有扩展返回 true 时,当前菜单项才会显示。
455481 editor,
456482 node,
457483 pos,
@@ -460,7 +486,7 @@ export interface DragButtonItemProps {
460486 node: PMNode | null ;
461487 pos: number ;
462488 }) => boolean ;
463- isActive? : ({ // 当前菜单项是否处于活动状态,默认为 false
489+ isActive? : ({ // 当前菜单项是否处于活动状态,默认为 false,多个扩展实现时,以 OR 逻辑判断,即只要有一个扩展返回 true,则当前菜单项处于活动状态。
464490 editor,
465491 node,
466492 pos,
@@ -469,7 +495,7 @@ export interface DragButtonItemProps {
469495 node: PMNode | null ;
470496 pos: number ;
471497 }) => boolean ;
472- disabled? : ({ // 是否禁用当前菜单项,默认为 false
498+ disabled? : ({ // 是否禁用当前菜单项,默认为 false,多个扩展实现时,以 OR 逻辑判断,即只要有一个扩展返回 true,则当前菜单项会被禁用。
473499 editor,
474500 node,
475501 pos,
@@ -485,7 +511,6 @@ export interface DragButtonItemProps {
485511
486512// 一级菜单项
487513export interface DragButtonType extends DragButtonItemProps {
488- parentKey? : string ; // 父级菜单项的唯一标识,如果提供了该属性,则视为扩展目标菜单项的二级菜单。
489514 children? : { // 子菜单项,如果提供了该属性,则视为扩展目标菜单项的二级菜单。
490515 component? : Component ; // 自定义组件,如果提供了该属性,则不会显示默认的子菜单项,而是会显示自定义组件,并且将所有 props 传递给自定义组件。
491516 items? : DragButtonItemProps []; // 子菜单项列表,如果提供了该属性,则视为扩展目标菜单项的二级菜单。
0 commit comments