diff --git a/app/src/protyle/wysiwyg/transaction.ts b/app/src/protyle/wysiwyg/transaction.ts
index 68a46cbda..322624fdd 100644
--- a/app/src/protyle/wysiwyg/transaction.ts
+++ b/app/src/protyle/wysiwyg/transaction.ts
@@ -303,6 +303,34 @@ export const onTransaction = (protyle: IProtyle, operation: IOperation, focus: b
updateRef(protyle, operation.id);
return;
}
+ if (operation.action === "updateAttrs") { // 调用接口才推送
+ protyle.wysiwyg.element.querySelectorAll(`[data-node-id="${operation.id}"]`).forEach(item => {
+ const data = operation.data as any
+ Object.keys(data.old).forEach(key => {
+ item.removeAttribute(key)
+ })
+ let nodeAttrHTML = ""
+ Object.keys(data.new).forEach(key => {
+ item.setAttribute(key, data.new[key]);
+ const escapeHTML = data.new[key]
+ if (key === "bookmark") {
+ nodeAttrHTML += `
${escapeHTML}
`;
+ } else if (key === "name") {
+ nodeAttrHTML += `${escapeHTML}
`;
+ } else if (key === "alias") {
+ nodeAttrHTML += `${escapeHTML}
`;
+ } else if (key === "memo") {
+ nodeAttrHTML += ``;
+ }
+ })
+ const refElement = item.lastElementChild.querySelector(".protyle-attr--refcount");
+ if (refElement) {
+ nodeAttrHTML += refElement.outerHTML;
+ }
+ item.lastElementChild.innerHTML = nodeAttrHTML + Constants.ZWSP;
+ });
+ return;
+ }
if (operation.action === "move") {
let cloneRange;
let range;
@@ -561,7 +589,7 @@ export const turnsIntoOneTransaction = (options: { protyle: IProtyle, selectsEle
hideElements(["gutter"], options.protyle);
};
-const removeUnfoldRepeatBlock = (html:string, protyle:IProtyle) => {
+const removeUnfoldRepeatBlock = (html: string, protyle: IProtyle) => {
const temp = document.createElement("template");
temp.innerHTML = html;
Array.from(temp.content.children).forEach(item => {
diff --git a/app/src/types/index.d.ts b/app/src/types/index.d.ts
index 5502ba73f..537004c98 100644
--- a/app/src/types/index.d.ts
+++ b/app/src/types/index.d.ts
@@ -4,7 +4,15 @@ type TDockType = "file" | "outline" | "bookmark" | "tag" | "graph" | "globalGrap
type TDockPosition = "Left" | "Right" | "Top" | "Bottom"
type TWS = "main" | "filetree" | "protyle"
type TEditorMode = "preview" | "wysiwyg"
-type TOperation = "insert" | "update" | "delete" | "move" | "foldHeading" | "unfoldHeading" | "setAttrs" | "append"
+type TOperation = "insert"
+ | "update"
+ | "delete"
+ | "move"
+ | "foldHeading"
+ | "unfoldHeading"
+ | "setAttrs"
+ | "updateAttrs"
+ | "append"
type TBazaarType = "templates" | "icons" | "widgets" | "themes"
declare module "blueimp-md5"
@@ -140,7 +148,7 @@ interface IScrollAttr {
interface IOperation {
action: TOperation, // move, delete 不需要传 data
id: string,
- data?: string,
+ data?: string, // updateAttr 时为 { old: IObject, new: IObject }
parentID?: string
previousID?: string
retData?: any