diff --git a/app/appearance/langs/en_US.json b/app/appearance/langs/en_US.json
index c793a4980..168259762 100644
--- a/app/appearance/langs/en_US.json
+++ b/app/appearance/langs/en_US.json
@@ -1,4 +1,5 @@
{
+ "addToDatabase": "Add to Database",
"clearContext": "Clear context",
"cloudStoragePurge": "Purge cloud storage",
"cloudStoragePurgeConfirm": "Note:
- Please ensure that other devices have paused sync before execution
- The purge operation is very time-consuming, please ensure that the network is stable
Are you sure to execute it now?",
diff --git a/app/appearance/langs/es_ES.json b/app/appearance/langs/es_ES.json
index f1b9c6a63..a273f5b6b 100644
--- a/app/appearance/langs/es_ES.json
+++ b/app/appearance/langs/es_ES.json
@@ -1,4 +1,5 @@
{
+ "addToDatabase": "Agregar a la base de datos",
"clearContext": "Borrar contexto",
"cloudStoragePurge": "Borrar almacenamiento en la nube",
"cloudStoragePurgeConfirm": "Nota:- Asegúrese de que otros dispositivos hayan pausado la sincronización antes de la ejecución
- La operación de purga requiere mucho tiempo; asegúrese de que la red esté estable
¿Está seguro de ejecutarla ahora?",
diff --git a/app/appearance/langs/fr_FR.json b/app/appearance/langs/fr_FR.json
index 58afe8d05..438aa55f1 100644
--- a/app/appearance/langs/fr_FR.json
+++ b/app/appearance/langs/fr_FR.json
@@ -1,4 +1,5 @@
{
+ "addToDatabase": "Ajouter à la base de données",
"clearContext": "Effacer le contexte",
"cloudStoragePurge": "Purger le stockage cloud",
"cloudStoragePurgeConfirm": "Remarque :- Veuillez vous assurer que la synchronisation des autres appareils a été suspendue avant l'exécution
- L'opération de purge prend beaucoup de temps, veuillez vous assurer que le réseau est stable
Êtes-vous sûr de l'exécuter maintenant ?",
diff --git a/app/appearance/langs/zh_CHT.json b/app/appearance/langs/zh_CHT.json
index e21649ce9..bd3bb790e 100644
--- a/app/appearance/langs/zh_CHT.json
+++ b/app/appearance/langs/zh_CHT.json
@@ -1,4 +1,5 @@
{
+ "addToDatabase": "新增至資料庫",
"clearContext": "清空上下文",
"cloudStoragePurge": "清理雲端儲存",
"cloudStoragePurgeConfirm": "請注意:- 執行前請確保其他設備已經暫停同步
- 清理作業非常耗時,請確保網路穩定
確定現在就執行嗎?",
diff --git a/app/appearance/langs/zh_CN.json b/app/appearance/langs/zh_CN.json
index 7881a0c34..7627a082f 100644
--- a/app/appearance/langs/zh_CN.json
+++ b/app/appearance/langs/zh_CN.json
@@ -1,4 +1,5 @@
{
+ "addToDatabase": "添加到数据库",
"clearContext": "清空上下文",
"cloudStoragePurge": "清理云端存储",
"cloudStoragePurgeConfirm": "请注意:- 执行前请确保其他设备已经暂停同步
- 清理操作非常耗时,请确保网络稳定
确定现在就执行吗?",
diff --git a/app/src/protyle/gutter/index.ts b/app/src/protyle/gutter/index.ts
index e297b1f59..06f450596 100644
--- a/app/src/protyle/gutter/index.ts
+++ b/app/src/protyle/gutter/index.ts
@@ -46,6 +46,7 @@ import {avRender} from "../render/av/render";
import {emitOpenMenu} from "../../plugin/EventBus";
import {insertAttrViewBlockAnimation} from "../render/av/row";
import {avContextmenu} from "../render/av/action";
+import {openSearchAV} from "../render/av/relation";
export class Gutter {
public element: HTMLElement;
@@ -785,6 +786,29 @@ export class Gutter {
});
}
}).element);
+ window.siyuan.menus.menu.append(new MenuItem({
+ label: window.siyuan.languages.addToDatabase,
+ icon: "iconDatabase",
+ click: () => {
+ openSearchAV("", this.element, (listItemElement) => {
+ const sourceIds: string[] = []
+ selectsElement.forEach(item => {
+ sourceIds.push(item.getAttribute("data-node-id"));
+ });
+ const avID = listItemElement.dataset.avId;
+ transaction(protyle, [{
+ action: "insertAttrViewBlock",
+ avID,
+ srcIDs: sourceIds,
+ isDetached: false,
+ }], [{
+ action: "removeAttrViewBlock",
+ srcIDs: sourceIds,
+ avID,
+ }]);
+ });
+ }
+ }).element);
window.siyuan.menus.menu.append(new MenuItem({
label: window.siyuan.languages.delete,
icon: "iconTrashcan",
@@ -1214,6 +1238,26 @@ export class Gutter {
});
}
}).element);
+ window.siyuan.menus.menu.append(new MenuItem({
+ label: window.siyuan.languages.addToDatabase,
+ icon: "iconDatabase",
+ click: () => {
+ openSearchAV("", this.element, (listItemElement) => {
+ const sourceIds: string[] = [nodeElement.getAttribute("data-node-id")];
+ const avID = listItemElement.dataset.avId;
+ transaction(protyle, [{
+ action: "insertAttrViewBlock",
+ avID,
+ srcIDs: sourceIds,
+ isDetached: false,
+ }], [{
+ action: "removeAttrViewBlock",
+ srcIDs: sourceIds,
+ avID,
+ }]);
+ });
+ }
+ }).element);
window.siyuan.menus.menu.append(new MenuItem({
label: window.siyuan.languages.delete,
icon: "iconTrashcan",
diff --git a/app/src/protyle/render/av/relation.ts b/app/src/protyle/render/av/relation.ts
index 0e92557f0..a9accd722 100644
--- a/app/src/protyle/render/av/relation.ts
+++ b/app/src/protyle/render/av/relation.ts
@@ -45,7 +45,7 @@ const setDatabase = (avId: string, element: HTMLElement, item: HTMLElement) => {
}
};
-export const openSearchAV = (avId: string, target: HTMLElement) => {
+export const openSearchAV = (avId: string, target: HTMLElement, cb?: (element: HTMLElement) => void) => {
window.siyuan.menus.menu.remove();
const menu = new Menu();
menu.addItem({
@@ -72,19 +72,34 @@ export const openSearchAV = (avId: string, target: HTMLElement) => {
if (event.key === "Enter") {
event.preventDefault();
event.stopPropagation();
- setDatabase(avId, target, listElement.querySelector(".b3-list-item--focus"));
+ const listItemElement = listElement.querySelector(".b3-list-item--focus") as HTMLElement;
+ if (cb) {
+ cb(listItemElement);
+ } else {
+ setDatabase(avId, target, listItemElement);
+ }
window.siyuan.menus.menu.remove();
}
});
- inputElement.addEventListener("input", (event) => {
+ inputElement.addEventListener("input", (event: InputEvent) => {
event.stopPropagation();
+ if (event.isComposing) {
+ return;
+ }
+ genSearchList(listElement, inputElement.value, avId);
+ });
+ inputElement.addEventListener("compositionend", () => {
genSearchList(listElement, inputElement.value, avId);
});
element.lastElementChild.addEventListener("click", (event) => {
const listItemElement = hasClosestByClassName(event.target as HTMLElement, "b3-list-item");
if (listItemElement) {
event.stopPropagation();
- setDatabase(avId, target, listItemElement);
+ if (cb) {
+ cb(listItemElement);
+ } else {
+ setDatabase(avId, target, listItemElement);
+ }
window.siyuan.menus.menu.remove();
}
});
@@ -225,6 +240,7 @@ const filterItem = (listElement: Element, key: string) => {
}
})
}
+
export const bindRelationEvent = (options: {
menuElement: HTMLElement,
protyle: IProtyle,