feat:add edit hyperlink contextmenu

pr675
Hufe921 4 years ago
parent 32640f4d9e
commit 072f0db8ba

@ -49,6 +49,7 @@ export class Command {
private static hyperlink: CommandAdapt['hyperlink']
private static deleteHyperlink: CommandAdapt['deleteHyperlink']
private static cancelHyperlink: CommandAdapt['cancelHyperlink']
private static editHyperlink: CommandAdapt['editHyperlink']
private static separator: CommandAdapt['separator']
private static pageBreak: CommandAdapt['pageBreak']
private static addWatermark: CommandAdapt['addWatermark']
@ -110,6 +111,7 @@ export class Command {
Command.hyperlink = adapt.hyperlink.bind(adapt)
Command.deleteHyperlink = adapt.deleteHyperlink.bind(adapt)
Command.cancelHyperlink = adapt.cancelHyperlink.bind(adapt)
Command.editHyperlink = adapt.editHyperlink.bind(adapt)
Command.separator = adapt.separator.bind(adapt)
Command.pageBreak = adapt.pageBreak.bind(adapt)
Command.addWatermark = adapt.addWatermark.bind(adapt)
@ -294,6 +296,10 @@ export class Command {
return Command.cancelHyperlink()
}
public executeEditHyperlink(payload: string) {
return Command.editHyperlink(payload)
}
public executeImage(payload: IDrawImagePayload) {
return Command.image(payload)
}

@ -1026,7 +1026,7 @@ export class CommandAdapt {
while (preIndex > 0) {
const preElement = elementList[preIndex]
if (preElement.hyperlinkId !== startElement.hyperlinkId) {
leftIndex = preIndex
leftIndex = preIndex + 1
break
}
preIndex--
@ -1056,12 +1056,13 @@ export class CommandAdapt {
const elementList = this.draw.getElementList()
const [leftIndex, rightIndex] = hyperRange
// 删除元素
elementList.splice(leftIndex + 1, rightIndex - leftIndex)
elementList.splice(leftIndex, rightIndex - leftIndex + 1)
this.draw.getHyperlinkParticle().clearHyperlinkPopup()
// 重置画布
this.range.setRange(leftIndex, leftIndex)
const newIndex = leftIndex - 1
this.range.setRange(newIndex, newIndex)
this.draw.render({
curIndex: leftIndex
curIndex: newIndex
})
}
@ -1088,6 +1089,26 @@ export class CommandAdapt {
})
}
public editHyperlink(payload: string) {
// 获取超链接索引
const hyperRange = this.getHyperlinkRange()
if (!hyperRange) return
const elementList = this.draw.getElementList()
const [leftIndex, rightIndex] = hyperRange
// 替换url
for (let i = leftIndex; i <= rightIndex; i++) {
const element = elementList[i]
element.url = payload
}
this.draw.getHyperlinkParticle().clearHyperlinkPopup()
// 重置画布
const { endIndex } = this.range.getRange()
this.draw.render({
curIndex: endIndex,
isComputeRowList: false
})
}
public separator(payload: number[]) {
const isReadonly = this.draw.isReadonly()
if (isReadonly) return

@ -29,6 +29,7 @@ export class ContextMenu {
private contextMenuList: IRegisterContextMenu[]
private contextMenuContainerList: HTMLDivElement[]
private contextMenuRelationShip: Map<HTMLDivElement, HTMLDivElement>
private context: IContextMenuContext | null
constructor(draw: Draw, command: Command) {
this.draw = draw
@ -36,6 +37,7 @@ export class ContextMenu {
this.range = draw.getRange()
this.position = draw.getPosition()
this.container = draw.getContainer()
this.context = null
// 内部菜单
this.contextMenuList = [
...globalMenus,
@ -53,7 +55,7 @@ export class ContextMenu {
}
private _proxyContextMenuEvent(evt: MouseEvent) {
const context = this._getContext()
this.context = this._getContext()
const renderList: IRegisterContextMenu[] = []
let isRegisterContextMenu = false
for (let c = 0; c < this.contextMenuList.length; c++) {
@ -61,7 +63,7 @@ export class ContextMenu {
if (menu.isDivider) {
renderList.push(menu)
} else {
const isMatch = menu.when?.(context)
const isMatch = menu.when?.(this.context)
if (isMatch) {
renderList.push(menu)
isRegisterContextMenu = true
@ -186,8 +188,8 @@ export class ContextMenu {
this._setHoverStatus(menuItem, false)
}
menuItem.onclick = () => {
if (menu.callback) {
menu.callback(this.command)
if (menu.callback && this.context) {
menu.callback(this.command, this.context)
}
this.dispose()
}

@ -1,5 +1,5 @@
import { ElementType } from '../../../dataset/enum/Element'
import { IRegisterContextMenu } from '../../../interface/contextmenu/ContextMenu'
import { IContextMenuContext, IRegisterContextMenu } from '../../../interface/contextmenu/ContextMenu'
import { Command } from '../../command/Command'
export const hyperlinkMenus: IRegisterContextMenu[] = [
@ -20,5 +20,17 @@ export const hyperlinkMenus: IRegisterContextMenu[] = [
callback: (command: Command) => {
command.executeCancelHyperlink()
}
},
{
name: '编辑链接',
when: (payload) => {
return payload.startElement?.type === ElementType.HYPERLINK
},
callback: (command: Command, context: IContextMenuContext) => {
const url = window.prompt('编辑链接', context.startElement?.url)
if (url) {
command.executeEditHyperlink(url)
}
}
}
]

@ -1,3 +1,4 @@
import { Command } from '../../core/command/Command'
import { IElement } from '../Element'
export interface IContextMenuContext {
@ -16,6 +17,6 @@ export interface IRegisterContextMenu {
name?: string;
shortCut?: string;
when?: (payload: IContextMenuContext) => boolean;
callback?: Function;
callback?: (command: Command, context: IContextMenuContext) => any;
childMenus?: IRegisterContextMenu[];
}
Loading…
Cancel
Save