diff --git a/app/appearance/langs/zh_CN.json b/app/appearance/langs/zh_CN.json
index 318df6a34..fde6e42e6 100644
--- a/app/appearance/langs/zh_CN.json
+++ b/app/appearance/langs/zh_CN.json
@@ -1,4 +1,5 @@
{
+ "riffCard": "闪卡",
"compare": "比较",
"switchTab": "页签切换",
"recentDocs": "最近打开的文档",
diff --git a/app/src/menus/commonMenuItem.ts b/app/src/menus/commonMenuItem.ts
index 873bed15e..bd62d0e97 100644
--- a/app/src/menus/commonMenuItem.ts
+++ b/app/src/menus/commonMenuItem.ts
@@ -38,6 +38,96 @@ const bindAttrInput = (inputElement: HTMLInputElement, confirmElement: Element)
});
};
+const genCardItem = (item: { id: string, name: string }) => {
+ return `
+
+
+
+
+
+
+
+
`,
+ destroyCallback() {
+ focusByRange(range);
+ }
+ });
+ dialog.element.addEventListener("click", (event) => {
+ let target = event.target as HTMLElement;
+ while (target && !target.isSameNode(dialog.element)) {
+ const type = target.getAttribute("data-type");
+ if (type === "create") {
+ let msgId = ""
+ const inputElement = dialog.element.querySelector(".b3-text-field") as HTMLInputElement;
+ if (inputElement.value) {
+ if (msgId) {
+ hideMessage(msgId);
+ }
+ fetchPost("/api/riff/createRiffDeck", {name: inputElement.value}, (response) => {
+ dialog.element.querySelector(".b3-list").insertAdjacentHTML("beforeend", genCardItem(response.data))
+ inputElement.value = '';
+ })
+ } else {
+ msgId = showMessage(window.siyuan.languages._kernel[142])
+ }
+ event.stopPropagation();
+ event.preventDefault();
+ break;
+ } else if (type === "add") {
+ fetchPost("/api/riff/addRiffCards", {
+ deckID: target.parentElement.getAttribute("data-id"),
+ blockIDs: ids
+ }, () => {
+
+ })
+ event.stopPropagation();
+ event.preventDefault();
+ break;
+ } else if (type === "remove") {
+ fetchPost("/api/riff/removeRiffCards", {
+ deckID: target.parentElement.getAttribute("data-id"),
+ blockIDs: ids
+ }, () => {
+
+ })
+ event.stopPropagation();
+ event.preventDefault();
+ break;
+ }
+ target = target.parentElement;
+ }
+ })
+ })
+};
+
export const openWechatNotify = (nodeElement: Element) => {
const id = nodeElement.getAttribute("data-node-id");
const range = getEditorRange(nodeElement);
@@ -805,7 +895,7 @@ export const movePathToMenu = (paths: string[]) => {
icon: "iconMove",
accelerator: window.siyuan.config.keymap.general.move.custom,
click() {
- movePathTo((toPath, toNotebook) =>{
+ movePathTo((toPath, toNotebook) => {
moveToPath(paths, toNotebook[0], toPath[0]);
}, paths);
}
diff --git a/app/src/protyle/gutter/index.ts b/app/src/protyle/gutter/index.ts
index 1ae0ccf17..f277c5155 100644
--- a/app/src/protyle/gutter/index.ts
+++ b/app/src/protyle/gutter/index.ts
@@ -7,7 +7,7 @@ import {
import {getIconByType} from "../../editor/getIcon";
import {iframeMenu, setFold, tableMenu, videoMenu, zoomOut} from "../../menus/protyle";
import {MenuItem} from "../../menus/Menu";
-import {copySubMenu, openAttr, openWechatNotify} from "../../menus/commonMenuItem";
+import {copySubMenu, openAttr, openDiffCard, openWechatNotify} from "../../menus/commonMenuItem";
import {copyPlainText, updateHotkeyTip, writeText} from "../util/compatibility";
import {
transaction,
@@ -1427,8 +1427,14 @@ export class Gutter {
openWechatNotify(nodeElement);
}
}).element);
- window.siyuan.menus.menu.append(new MenuItem({type: "separator"}).element);
}
+ window.siyuan.menus.menu.append(new MenuItem({
+ label: window.siyuan.languages.riffCard,
+ click() {
+ openDiffCard([nodeElement]);
+ }
+ }).element);
+ window.siyuan.menus.menu.append(new MenuItem({type: "separator"}).element);
let updateHTML = nodeElement.getAttribute("updated") || "";
if (updateHTML) {
updateHTML = `${window.siyuan.languages.modifiedAt} ${dayjs(updateHTML).format("YYYY-MM-DD HH:mm:ss")}