diff --git a/app/src/protyle/render/av/openMenuPanel.ts b/app/src/protyle/render/av/openMenuPanel.ts index 1286c3b1b..07e2413c3 100644 --- a/app/src/protyle/render/av/openMenuPanel.ts +++ b/app/src/protyle/render/av/openMenuPanel.ts @@ -516,7 +516,51 @@ export const openMenuPanel = (options: { event.stopPropagation(); break; } else if (type === "update-view-icon") { - // TODO + const rect = target.getBoundingClientRect(); + openEmojiPanel("", "av", { + x: rect.left, + y: rect.bottom, + h: rect.height, + w: rect.width + }, (unicode) => { + transaction(options.protyle, [{ + action: "setAttrViewViewIcon", + avID, + id: data.viewID, + data: unicode, + }], [{ + action: "setAttrViewViewIcon", + id: data.viewID, + avID, + data: target.dataset.icon, + }]); + target.innerHTML = unicode ? unicode2Emoji(unicode) : ''; + target.dataset.icon = unicode + }); + event.preventDefault(); + event.stopPropagation(); + break; + } else if (type === "duplicate-view") { + const id = Lute.NewNodeID(); + transaction(options.protyle, [{ + action: "duplicateAttrViewView", + avID, + previousID: data.viewID, + id + }], [{ + action: "removeAttrViewView", + avID, + id + }]); + event.preventDefault(); + event.stopPropagation(); + break; + } else if (type === "delete-view") { + transaction(options.protyle, [{ + action: "removeAttrViewView", + avID, + id: data.viewID + }]); event.preventDefault(); event.stopPropagation(); break; @@ -542,6 +586,7 @@ export const openMenuPanel = (options: { }]); target.innerHTML = unicode ? unicode2Emoji(unicode) : ``; updateAttrViewCellAnimation(options.blockElement.querySelector(`.av__row--header .av__cell[data-col-id="${colId}"]`)); + target.dataset.icon = unicode }); event.preventDefault(); event.stopPropagation(); diff --git a/app/src/protyle/render/av/render.ts b/app/src/protyle/render/av/render.ts index 218a55135..7c36db4b3 100644 --- a/app/src/protyle/render/av/render.ts +++ b/app/src/protyle/render/av/render.ts @@ -202,7 +202,7 @@ ${cell.color ? `color:${cell.color};` : ""}">${text}`; let tabHTML = ""; response.data.views.forEach((item: IAVView) => { tabHTML += `
- + ${response.data.view.icon ? unicode2Emoji(response.data.view.icon, "item__graphic") : ''} ${item.name}
`; }); diff --git a/app/src/protyle/render/av/view.ts b/app/src/protyle/render/av/view.ts index 72f019890..7f3900580 100644 --- a/app/src/protyle/render/av/view.ts +++ b/app/src/protyle/render/av/view.ts @@ -1,7 +1,8 @@ import {Menu} from "../../../plugin/Menu"; import {unicode2Emoji} from "../../../emoji"; +import {transaction} from "../../wysiwyg/transaction"; -export const openViewMenu = (element:HTMLElement) => { +export const openViewMenu = (element: HTMLElement) => { const menu = new Menu("av-view", () => { }); @@ -11,14 +12,14 @@ export const openViewMenu = (element:HTMLElement) => { menu.addItem({ icon: "iconEdit", label: window.siyuan.languages.rename, - click () { + click() { } }) menu.addItem({ icon: "iconSettings", label: window.siyuan.languages.config, - click () { + click() { } }) @@ -26,14 +27,14 @@ export const openViewMenu = (element:HTMLElement) => { menu.addItem({ icon: "iconCopy", label: window.siyuan.languages.duplicate, - click () { + click() { } }) menu.addItem({ icon: "iconTrashcan", label: window.siyuan.languages.delete, - click () { + click() { } }) @@ -49,8 +50,22 @@ export const bindViewEvent = (options: { data: IAV, menuElement: HTMLElement }) => { - options.menuElement.querySelector('.b3-text-field[data-type="name"]').addEventListener("blur", (event) => { - + const inputElement = options.menuElement.querySelector('.b3-text-field[data-type="name"]') as HTMLInputElement + inputElement.addEventListener("blur", () => { + if (inputElement.value !== inputElement.dataset.value) { + transaction(options.protyle, [{ + action: "setAttrViewViewName", + avID: options.data.id, + id: options.data.viewID, + data: inputElement.value + }], [{ + action: "setAttrViewViewName", + avID: options.data.id, + id: options.data.viewID, + data: inputElement.dataset.value + }]) + inputElement.dataset.value = inputElement.value + } }) } @@ -62,7 +77,7 @@ export const getViewHTML = (data: IAVTable) => { - - diff --git a/app/src/protyle/wysiwyg/transaction.ts b/app/src/protyle/wysiwyg/transaction.ts index d35442743..9b4cad2fa 100644 --- a/app/src/protyle/wysiwyg/transaction.ts +++ b/app/src/protyle/wysiwyg/transaction.ts @@ -712,7 +712,7 @@ export const onTransaction = (protyle: IProtyle, operation: IOperation, isUndo: "setAttrViewColWrap", "setAttrViewColWidth", "removeAttrViewColOption", "setAttrViewName", "setAttrViewFilters", "setAttrViewSorts", "setAttrViewColCalc", "removeAttrViewCol", "updateAttrViewColNumberFormat", "removeAttrViewBlock", "replaceAttrViewBlock", "updateAttrViewColTemplate", "setAttrViewColIcon", "setAttrViewColPin", "addAttrViewView", - "removeAttrViewView"].includes(operation.action)) { + "removeAttrViewView", "setAttrViewViewName", "setAttrViewViewIcon", "duplicateAttrViewView"].includes(operation.action)) { refreshAV(protyle, operation, isUndo); } else if (operation.action === "doUpdateUpdated") { updateElements.forEach(item => { diff --git a/app/src/types/index.d.ts b/app/src/types/index.d.ts index 9e122d0f4..ddca8b6ab 100644 --- a/app/src/types/index.d.ts +++ b/app/src/types/index.d.ts @@ -45,6 +45,8 @@ type TOperation = | "addAttrViewView" | "setAttrViewViewName" | "removeAttrViewView" + | "setAttrViewViewIcon" + | "duplicateAttrViewView" type TBazaarType = "templates" | "icons" | "widgets" | "themes" | "plugins" type TCardType = "doc" | "notebook" | "all" type TEventBus = "ws-main" |