关联列支持一键复制现有关联 (#15876)

This commit is contained in:
Achuan-2 2025-09-18 21:14:18 +08:00 committed by GitHub
parent dffd12477e
commit f747739fd5
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
14 changed files with 74 additions and 2 deletions

View file

@ -177,6 +177,7 @@
"thisDatabase": "قاعدة البيانات هذه",
"relatedTo": "الربط بـ",
"relation": "ربط",
"relatedItems": "العناصر المرتبطة",
"rollup": "القيمة المحتسبة",
"rollupProperty": "الخاصية",
"rollupCalc": "الحساب بـ",

View file

@ -177,6 +177,7 @@
"thisDatabase": "Diese Datenbank",
"relatedTo": "Verbindung zu",
"relation": "Beziehung",
"relatedItems": "Verknüpfte Einträge",
"rollup": "Rollup",
"rollupProperty": "Eigenschaft",
"rollupCalc": "Berechnen",

View file

@ -177,6 +177,7 @@
"thisDatabase": "This database",
"relatedTo": "Relation to",
"relation": "Relation",
"relatedItems": "Related Items",
"rollup": "Rollup",
"rollupProperty": "Property",
"rollupCalc": "Calculate",

View file

@ -177,6 +177,7 @@
"thisDatabase": "Esta base de datos",
"relatedTo": "Relación con",
"relation": "Relación",
"relatedItems": "Elementos relacionados",
"rollup": "Acumular",
"rollupProperty": "Propiedad",
"rollupCalc": "Calcular",

View file

@ -177,6 +177,7 @@
"thisDatabase": "Cette base de données",
"relatedTo": " Relation avec ",
"relation": "Relation",
"relatedItems": "Éléments liés",
"rollup": "Rollup",
"rollupProperty": "Propriété",
"rollupCalc": "Calculer",

View file

@ -177,6 +177,7 @@
"thisDatabase": "בסיס הנתונים הזה",
"relatedTo": "קשר ל",
"relation": "קשר",
"relatedItems": "פריטים קשורים",
"rollup": "סיכום",
"rollupProperty": "מאפיין",
"rollupCalc": "חישוב",

View file

@ -177,6 +177,7 @@
"thisDatabase": "Questo database",
"relatedTo": "Relazionato a",
"relation": "Relazione",
"relatedItems": "Elementi correlati",
"rollup": "Rollup",
"rollupProperty": "Proprietà",
"rollupCalc": "Calcola",

View file

@ -177,6 +177,7 @@
"thisDatabase": "現在のデータベース",
"relatedTo": "関連付け",
"relation": "関連",
"relatedItems": "関連項目",
"rollup": "集計",
"rollupProperty": "属性",
"rollupCalc": "計算方法",

View file

@ -177,6 +177,7 @@
"thisDatabase": "Ta baza danych",
"relatedTo": "Powiązane z",
"relation": "Relacja",
"relatedItems": "Powiązane elementy",
"rollup": "Skumuluje",
"rollupProperty": "Właściwość",
"rollupCalc": "Oblicz",

View file

@ -177,6 +177,7 @@
"thisDatabase": "Este banco de dados",
"relatedTo": "Relacionado a",
"relation": "Relação",
"relatedItems": "Itens relacionados",
"rollup": "Rollup",
"rollupProperty": "Propriedade",
"rollupCalc": "Calcular",

View file

@ -177,6 +177,7 @@
"thisDatabase": "Эта база данных",
"relatedTo": "Связано с",
"relation": "Связь",
"relatedItems": "Связанные элементы",
"rollup": "Свод",
"rollupProperty": "Свойство",
"rollupCalc": "Вычислить",

View file

@ -177,6 +177,7 @@
"thisDatabase": "目前資料庫",
"relatedTo": "關聯至",
"relation": "關聯",
"relatedItems": "已關聯條目",
"rollup": "匯總",
"rollupProperty": "總計欄位",
"rollupCalc": "彙總方式",

View file

@ -177,6 +177,7 @@
"thisDatabase": "当前数据库",
"relatedTo": "关联至",
"relation": "关联",
"relatedItems": "已关联条目",
"rollup": "汇总",
"rollupProperty": "汇总字段",
"rollupCalc": "汇总方式",

View file

@ -13,6 +13,8 @@ import {getFieldsByData, getViewName} from "./view";
import {getColId} from "./col";
import {getFieldIdByCellElement} from "./row";
import {isMobile} from "../../../util/functions";
import {showMessage} from "../../../dialog/message";
import {writeText} from "../../util/compatibility";
interface IAVItem {
avID: string;
@ -249,6 +251,19 @@ export const toggleUpdateRelationBtn = (menuItemsElement: HTMLElement, avId: str
}
};
const genRelatedItemsHeader = (hasRelatedItems: boolean) => {
if (!hasRelatedItems) {
return "";
}
return `<div style="padding: 4px 2px;">
<span class="b3-menu__label">${window.siyuan.languages.relatedItems || "已关联条目"}</span>
<span class="fn__flex-1"></span>
<button class="b3-button b3-button--small" data-type="copyRelatedItems" title="${window.siyuan.languages.copy}" style="padding: 4px 4px;">
<svg><use xlink:href="#iconCopy"></use></svg>
</button>
</div>`;
};
const genSelectItemHTML = (options: {
type: "selected" | "empty" | "unselect",
id?: string,
@ -313,7 +328,8 @@ draggable="true">${genSelectItemHTML({
});
}
});
menuElement.querySelector(".b3-menu__items").innerHTML = `${selectHTML}
const hasRelatedItems = selectHTML.trim() !== "";
menuElement.querySelector(".b3-menu__items").innerHTML = `${genRelatedItemsHeader(hasRelatedItems)}${selectHTML}
<button class="b3-menu__separator"></button>
${html}
${keyword ? genSelectItemHTML({
@ -361,7 +377,8 @@ draggable="true">${genSelectItemHTML({
});
}
});
options.menuElement.querySelector(".b3-menu__items").innerHTML = `${selectHTML}
const hasRelatedItems = selectHTML.trim() !== "";
options.menuElement.querySelector(".b3-menu__items").innerHTML = `${genRelatedItemsHeader(hasRelatedItems)}${selectHTML}
<button class="b3-menu__separator"></button>
${html || genSelectItemHTML({type: "empty"})}`;
const cellRect = options.cellElements[options.cellElements.length - 1].getBoundingClientRect();
@ -396,6 +413,48 @@ ${html || genSelectItemHTML({type: "empty"})}`;
event.stopPropagation();
filterItem(options.menuElement, options.cellElements[0], inputElement.value);
});
// 添加复制按钮的点击事件
const copyRelatedItemsHandler = (event: Event) => {
const target = event.target as HTMLElement;
if (target.closest('[data-type="copyRelatedItems"]')) {
event.preventDefault();
event.stopPropagation();
const relationItems = options.cellElements[0].querySelectorAll(".av__cell--relation");
const blockRefs: string[] = [];
relationItems.forEach((relationItem: HTMLElement) => {
const item = relationItem.querySelector(".av__celltext") as HTMLElement;
if (item) {
const text = item.textContent || window.siyuan.languages.untitled;
if (item.dataset.id) {
// 有 ID 的条目,生成块引用
const blockRef = `((${item.dataset.id} "${text}"))`;
blockRefs.push(blockRef);
} else {
// 没有 ID 的条目,直接使用纯文本
blockRefs.push(text);
}
}
});
if (blockRefs.length > 0) {
let copyText: string;
if (blockRefs.length === 1) {
// 单个条目,直接复制
copyText = blockRefs[0];
} else {
// 多个条目,复制为列表
copyText = blockRefs.map(ref => `- ${ref}`).join("\n");
}
writeText(copyText);
showMessage(window.siyuan.languages.copied || "已复制");
}
}
};
listElement.addEventListener("click", copyRelatedItemsHandler);
});
};