mirror of
https://github.com/siyuan-note/siyuan.git
synced 2025-12-17 15:10:12 +01:00
This commit is contained in:
parent
d19cf0ec0e
commit
a0f016ebca
6 changed files with 35 additions and 33 deletions
|
|
@ -16,9 +16,7 @@ export const initBlockPopover = (app: App) => {
|
||||||
}
|
}
|
||||||
const aElement = hasClosestByAttribute(event.target, "data-type", "a", true) ||
|
const aElement = hasClosestByAttribute(event.target, "data-type", "a", true) ||
|
||||||
hasClosestByAttribute(event.target, "data-type", "tab-header") ||
|
hasClosestByAttribute(event.target, "data-type", "tab-header") ||
|
||||||
hasClosestByClassName(event.target, "av__gutters") ||
|
hasClosestByClassName(event.target, "ariaLabel") ||
|
||||||
hasClosestByClassName(event.target, "emojis__item") ||
|
|
||||||
hasClosestByClassName(event.target, "emojis__type") ||
|
|
||||||
hasClosestByAttribute(event.target, "data-type", "inline-memo");
|
hasClosestByAttribute(event.target, "data-type", "inline-memo");
|
||||||
if (aElement) {
|
if (aElement) {
|
||||||
let tip = aElement.getAttribute("aria-label") || aElement.getAttribute("data-inline-memo-content");
|
let tip = aElement.getAttribute("aria-label") || aElement.getAttribute("data-inline-memo-content");
|
||||||
|
|
|
||||||
|
|
@ -17,6 +17,10 @@ export const showTooltip = (message: string, target: Element, error = false) =>
|
||||||
} else {
|
} else {
|
||||||
messageElement.innerHTML = message;
|
messageElement.innerHTML = message;
|
||||||
}
|
}
|
||||||
|
if (target.getAttribute("data-type") === "navigation-file") {
|
||||||
|
setPosition(messageElement, targetRect.right, targetRect.top);
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (error) {
|
if (error) {
|
||||||
messageElement.classList.add("tooltip--error");
|
messageElement.classList.add("tooltip--error");
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
|
|
@ -51,7 +51,7 @@ export const lazyLoadEmoji = (element: HTMLElement) => {
|
||||||
if ((typeof entrie.isIntersecting === "undefined" ? entrie.intersectionRatio !== 0 : entrie.isIntersecting) && index) {
|
if ((typeof entrie.isIntersecting === "undefined" ? entrie.intersectionRatio !== 0 : entrie.isIntersecting) && index) {
|
||||||
let html = "";
|
let html = "";
|
||||||
window.siyuan.emojis[parseInt(index)].items.forEach(emoji => {
|
window.siyuan.emojis[parseInt(index)].items.forEach(emoji => {
|
||||||
html += `<button data-unicode="${emoji.unicode}" class="emojis__item" aria-label="${window.siyuan.config.lang === "zh_CN" ? emoji.description_zh_cn : emoji.description}">
|
html += `<button data-unicode="${emoji.unicode}" class="emojis__item ariaLabel" aria-label="${window.siyuan.config.lang === "zh_CN" ? emoji.description_zh_cn : emoji.description}">
|
||||||
${unicode2Emoji(emoji.unicode)}</button>`;
|
${unicode2Emoji(emoji.unicode)}</button>`;
|
||||||
});
|
});
|
||||||
entrie.target.innerHTML = html;
|
entrie.target.innerHTML = html;
|
||||||
|
|
@ -119,7 +119,7 @@ export const filterEmoji = (key = "", max?: number) => {
|
||||||
if (category.id === "custom") {
|
if (category.id === "custom") {
|
||||||
customStore.push(emoji);
|
customStore.push(emoji);
|
||||||
} else {
|
} else {
|
||||||
keyHTML += `<button data-unicode="${emoji.unicode}" class="emojis__item" aria-label="${window.siyuan.config.lang === "zh_CN" ? emoji.description_zh_cn : emoji.description}">
|
keyHTML += `<button data-unicode="${emoji.unicode}" class="emojis__item ariaLabel" aria-label="${window.siyuan.config.lang === "zh_CN" ? emoji.description_zh_cn : emoji.description}">
|
||||||
${unicode2Emoji(emoji.unicode, undefined, false, true)}</button>`;
|
${unicode2Emoji(emoji.unicode, undefined, false, true)}</button>`;
|
||||||
}
|
}
|
||||||
maxCount++;
|
maxCount++;
|
||||||
|
|
@ -129,7 +129,7 @@ ${unicode2Emoji(emoji.unicode, undefined, false, true)}</button>`;
|
||||||
recentEmojis.push(emoji);
|
recentEmojis.push(emoji);
|
||||||
}
|
}
|
||||||
if (index < 2) {
|
if (index < 2) {
|
||||||
html += `<button data-unicode="${emoji.unicode}" class="emojis__item" aria-label="${window.siyuan.config.lang === "zh_CN" ? emoji.description_zh_cn : emoji.description}">
|
html += `<button data-unicode="${emoji.unicode}" class="emojis__item ariaLabel" aria-label="${window.siyuan.config.lang === "zh_CN" ? emoji.description_zh_cn : emoji.description}">
|
||||||
${unicode2Emoji(emoji.unicode, undefined, false, true)}</button>`;
|
${unicode2Emoji(emoji.unicode, undefined, false, true)}</button>`;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -154,7 +154,7 @@ ${unicode2Emoji(emoji.unicode, undefined, false, true)}</button>`;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}).forEach(item => {
|
}).forEach(item => {
|
||||||
html += `<button data-unicode="${item.unicode}" class="emojis__item" aria-label="${window.siyuan.config.lang === "zh_CN" ? item.description_zh_cn : item.description}">
|
html += `<button data-unicode="${item.unicode}" class="emojis__item ariaLabel" aria-label="${window.siyuan.config.lang === "zh_CN" ? item.description_zh_cn : item.description}">
|
||||||
${unicode2Emoji(item.unicode, undefined, false, true)}</button>`;
|
${unicode2Emoji(item.unicode, undefined, false, true)}</button>`;
|
||||||
});
|
});
|
||||||
html = html + keyHTML + "</div>";
|
html = html + keyHTML + "</div>";
|
||||||
|
|
@ -165,7 +165,7 @@ ${unicode2Emoji(item.unicode, undefined, false, true)}</button>`;
|
||||||
window.siyuan.config.editor.emoji.forEach(emojiUnicode => {
|
window.siyuan.config.editor.emoji.forEach(emojiUnicode => {
|
||||||
const emoji = recentEmojis.filter((item) => item.unicode === emojiUnicode);
|
const emoji = recentEmojis.filter((item) => item.unicode === emojiUnicode);
|
||||||
if (emoji[0]) {
|
if (emoji[0]) {
|
||||||
recentHTML += `<button data-unicode="${emoji[0].unicode}" class="emojis__item" aria-label="${window.siyuan.config.lang === "zh_CN" ? emoji[0].description_zh_cn : emoji[0].description}">
|
recentHTML += `<button data-unicode="${emoji[0].unicode}" class="emojis__item ariaLabel" aria-label="${window.siyuan.config.lang === "zh_CN" ? emoji[0].description_zh_cn : emoji[0].description}">
|
||||||
${unicode2Emoji(emoji[0].unicode, undefined, false, true)}
|
${unicode2Emoji(emoji[0].unicode, undefined, false, true)}
|
||||||
</button>`;
|
</button>`;
|
||||||
}
|
}
|
||||||
|
|
@ -206,16 +206,16 @@ export const openEmojiPanel = (id: string, target: HTMLElement, isNotebook = fal
|
||||||
</div>
|
</div>
|
||||||
<div class="emojis__panel">${filterEmoji()}</div>
|
<div class="emojis__panel">${filterEmoji()}</div>
|
||||||
<div class="fn__flex">
|
<div class="fn__flex">
|
||||||
<div data-type="0" class="emojis__type" aria-label="${window.siyuan.languages.recentEmoji}">${unicode2Emoji("2b50")}</div>
|
<div data-type="0" class="emojis__type ariaLabel" aria-label="${window.siyuan.languages.recentEmoji}">${unicode2Emoji("2b50")}</div>
|
||||||
<div data-type="1" class="emojis__type" aria-label="${window.siyuan.emojis[0][window.siyuan.config.lang === "zh_CN" ? "title_zh_cn" : "title"]}">${unicode2Emoji("1f527")}</div>
|
<div data-type="1" class="emojis__type ariaLabel" aria-label="${window.siyuan.emojis[0][window.siyuan.config.lang === "zh_CN" ? "title_zh_cn" : "title"]}">${unicode2Emoji("1f527")}</div>
|
||||||
<div data-type="2" class="emojis__type" aria-label="${window.siyuan.emojis[1][window.siyuan.config.lang === "zh_CN" ? "title_zh_cn" : "title"]}">${unicode2Emoji("1f60d")}</div>
|
<div data-type="2" class="emojis__type ariaLabel" aria-label="${window.siyuan.emojis[1][window.siyuan.config.lang === "zh_CN" ? "title_zh_cn" : "title"]}">${unicode2Emoji("1f60d")}</div>
|
||||||
<div data-type="3" class="emojis__type" aria-label="${window.siyuan.emojis[2][window.siyuan.config.lang === "zh_CN" ? "title_zh_cn" : "title"]}">${unicode2Emoji("1f433")}</div>
|
<div data-type="3" class="emojis__type ariaLabel" aria-label="${window.siyuan.emojis[2][window.siyuan.config.lang === "zh_CN" ? "title_zh_cn" : "title"]}">${unicode2Emoji("1f433")}</div>
|
||||||
<div data-type="4" class="emojis__type" aria-label="${window.siyuan.emojis[3][window.siyuan.config.lang === "zh_CN" ? "title_zh_cn" : "title"]}">${unicode2Emoji("1f96a")}</div>
|
<div data-type="4" class="emojis__type ariaLabel" aria-label="${window.siyuan.emojis[3][window.siyuan.config.lang === "zh_CN" ? "title_zh_cn" : "title"]}">${unicode2Emoji("1f96a")}</div>
|
||||||
<div data-type="5" class="emojis__type" aria-label="${window.siyuan.emojis[4][window.siyuan.config.lang === "zh_CN" ? "title_zh_cn" : "title"]}">${unicode2Emoji("1f3a8")}</div>
|
<div data-type="5" class="emojis__type ariaLabel" aria-label="${window.siyuan.emojis[4][window.siyuan.config.lang === "zh_CN" ? "title_zh_cn" : "title"]}">${unicode2Emoji("1f3a8")}</div>
|
||||||
<div data-type="6" class="emojis__type" aria-label="${window.siyuan.emojis[5][window.siyuan.config.lang === "zh_CN" ? "title_zh_cn" : "title"]}">${unicode2Emoji("1f3dd")}</div>
|
<div data-type="6" class="emojis__type ariaLabel" aria-label="${window.siyuan.emojis[5][window.siyuan.config.lang === "zh_CN" ? "title_zh_cn" : "title"]}">${unicode2Emoji("1f3dd")}</div>
|
||||||
<div data-type="7" class="emojis__type" aria-label="${window.siyuan.emojis[6][window.siyuan.config.lang === "zh_CN" ? "title_zh_cn" : "title"]}">${unicode2Emoji("1f52e")}</div>
|
<div data-type="7" class="emojis__type ariaLabel" aria-label="${window.siyuan.emojis[6][window.siyuan.config.lang === "zh_CN" ? "title_zh_cn" : "title"]}">${unicode2Emoji("1f52e")}</div>
|
||||||
<div data-type="8" class="emojis__type" aria-label="${window.siyuan.emojis[7][window.siyuan.config.lang === "zh_CN" ? "title_zh_cn" : "title"]}">${unicode2Emoji("267e")}</div>
|
<div data-type="8" class="emojis__type ariaLabel" aria-label="${window.siyuan.emojis[7][window.siyuan.config.lang === "zh_CN" ? "title_zh_cn" : "title"]}">${unicode2Emoji("267e")}</div>
|
||||||
<div data-type="9" class="emojis__type" aria-label="${window.siyuan.emojis[8][window.siyuan.config.lang === "zh_CN" ? "title_zh_cn" : "title"]}">${unicode2Emoji("1f6a9")}</div>
|
<div data-type="9" class="emojis__type ariaLabel" aria-label="${window.siyuan.emojis[8][window.siyuan.config.lang === "zh_CN" ? "title_zh_cn" : "title"]}">${unicode2Emoji("1f6a9")}</div>
|
||||||
</div>
|
</div>
|
||||||
</div>`;
|
</div>`;
|
||||||
window.siyuan.menus.menu.element.querySelector(".emojis__item").classList.add("emojis__item--current");
|
window.siyuan.menus.menu.element.querySelector(".emojis__item").classList.add("emojis__item--current");
|
||||||
|
|
@ -343,7 +343,7 @@ export const openEmojiPanel = (id: string, target: HTMLElement, isNotebook = fal
|
||||||
if (index) {
|
if (index) {
|
||||||
let html = "";
|
let html = "";
|
||||||
window.siyuan.emojis[parseInt(index)].items.forEach(emoji => {
|
window.siyuan.emojis[parseInt(index)].items.forEach(emoji => {
|
||||||
html += `<button data-unicode="${emoji.unicode}" class="emojis__item" aria-label="${window.siyuan.config.lang === "zh_CN" ? emoji.description_zh_cn : emoji.description}">
|
html += `<button data-unicode="${emoji.unicode}" class="emojis__item ariaLabel" aria-label="${window.siyuan.config.lang === "zh_CN" ? emoji.description_zh_cn : emoji.description}">
|
||||||
${unicode2Emoji(emoji.unicode)}</button>`;
|
${unicode2Emoji(emoji.unicode)}</button>`;
|
||||||
});
|
});
|
||||||
titleElement.nextElementSibling.innerHTML = html;
|
titleElement.nextElementSibling.innerHTML = html;
|
||||||
|
|
|
||||||
|
|
@ -984,10 +984,10 @@ export class Files extends Model {
|
||||||
if (item.count && item.count > 0) {
|
if (item.count && item.count > 0) {
|
||||||
countHTML = `<span class="popover__block counter b3-tooltips b3-tooltips__nw" aria-label="${window.siyuan.languages.ref}">${item.count}</span>`;
|
countHTML = `<span class="popover__block counter b3-tooltips b3-tooltips__nw" aria-label="${window.siyuan.languages.ref}">${item.count}</span>`;
|
||||||
}
|
}
|
||||||
return `<li title="${getDisplayName(item.name, true, true)} ${item.hSize}${item.bookmark ? "\n" + window.siyuan.languages.bookmark + " " + item.bookmark : ""}${item.name1 ? "\n" + window.siyuan.languages.name + " " + item.name1 : ""}${item.alias ? "\n" + window.siyuan.languages.alias + " " + item.alias : ""}${item.memo ? "\n" + window.siyuan.languages.memo + " " + item.memo : ""}${item.subFileCount !== 0 ? window.siyuan.languages.includeSubFile.replace("x", item.subFileCount) : ""}\n${window.siyuan.languages.modifiedAt} ${item.hMtime}\n${window.siyuan.languages.createdAt} ${item.hCtime}"
|
return `<li aria-label="${getDisplayName(item.name, true, true)} ${item.hSize}${item.bookmark ? "<br>" + window.siyuan.languages.bookmark + " " + item.bookmark : ""}${item.name1 ? "<br>" + window.siyuan.languages.name + " " + item.name1 : ""}${item.alias ? "<br>" + window.siyuan.languages.alias + " " + item.alias : ""}${item.memo ? "<br>" + window.siyuan.languages.memo + " " + item.memo : ""}${item.subFileCount !== 0 ? window.siyuan.languages.includeSubFile.replace("x", item.subFileCount) : ""}<br>${window.siyuan.languages.modifiedAt} ${item.hMtime}<br>${window.siyuan.languages.createdAt} ${item.hCtime}"
|
||||||
data-node-id="${item.id}" data-name="${Lute.EscapeHTMLStr(item.name)}" draggable="true" data-count="${item.subFileCount}"
|
data-node-id="${item.id}" data-name="${Lute.EscapeHTMLStr(item.name)}" draggable="true" data-count="${item.subFileCount}"
|
||||||
data-type="navigation-file"
|
data-type="navigation-file"
|
||||||
class="b3-list-item b3-list-item--hide-action" data-path="${item.path}">
|
class="b3-list-item b3-list-item--hide-action ariaLabel" data-path="${item.path}">
|
||||||
<span style="padding-left: ${(item.path.split("/").length - 2) * 18 + 22}px" class="b3-list-item__toggle b3-list-item__toggle--hl${item.subFileCount === 0 ? " fn__hidden" : ""}">
|
<span style="padding-left: ${(item.path.split("/").length - 2) * 18 + 22}px" class="b3-list-item__toggle b3-list-item__toggle--hl${item.subFileCount === 0 ? " fn__hidden" : ""}">
|
||||||
<svg class="b3-list-item__arrow"><use xlink:href="#iconRight"></use></svg>
|
<svg class="b3-list-item__arrow"><use xlink:href="#iconRight"></use></svg>
|
||||||
</span>
|
</span>
|
||||||
|
|
|
||||||
|
|
@ -80,7 +80,7 @@ export class Hint {
|
||||||
if (index) {
|
if (index) {
|
||||||
let html = "";
|
let html = "";
|
||||||
window.siyuan.emojis[parseInt(index)].items.forEach(emoji => {
|
window.siyuan.emojis[parseInt(index)].items.forEach(emoji => {
|
||||||
html += `<button data-unicode="${emoji.unicode}" class="emojis__item" aria-label="${window.siyuan.config.lang === "zh_CN" ? emoji.description_zh_cn : emoji.description}">
|
html += `<button data-unicode="${emoji.unicode}" class="emojis__item ariaLabel" aria-label="${window.siyuan.config.lang === "zh_CN" ? emoji.description_zh_cn : emoji.description}">
|
||||||
${unicode2Emoji(emoji.unicode)}</button>`;
|
${unicode2Emoji(emoji.unicode)}</button>`;
|
||||||
});
|
});
|
||||||
titleElement.nextElementSibling.innerHTML = html;
|
titleElement.nextElementSibling.innerHTML = html;
|
||||||
|
|
@ -392,16 +392,16 @@ ${unicode2Emoji(emoji.unicode)}</button>`;
|
||||||
this.element.innerHTML = `<div class="emojis">
|
this.element.innerHTML = `<div class="emojis">
|
||||||
<div class="emojis__panel">${filterEmoji(value, 256)}</div>
|
<div class="emojis__panel">${filterEmoji(value, 256)}</div>
|
||||||
<div class="fn__flex${value ? " fn__none" : ""}">
|
<div class="fn__flex${value ? " fn__none" : ""}">
|
||||||
<button data-type="0" class="emojis__type" aria-label="${window.siyuan.languages.recentEmoji}">${unicode2Emoji("2b50")}</button>
|
<button data-type="0" class="emojis__type ariaLabel" aria-label="${window.siyuan.languages.recentEmoji}">${unicode2Emoji("2b50")}</button>
|
||||||
<button data-type="1" class="emojis__type" aria-label="${window.siyuan.emojis[0][window.siyuan.config.lang === "zh_CN" ? "title_zh_cn" : "title"]}">${unicode2Emoji("1f527")}</button>
|
<button data-type="1" class="emojis__type ariaLabel" aria-label="${window.siyuan.emojis[0][window.siyuan.config.lang === "zh_CN" ? "title_zh_cn" : "title"]}">${unicode2Emoji("1f527")}</button>
|
||||||
<button data-type="2" class="emojis__type" aria-label="${window.siyuan.emojis[1][window.siyuan.config.lang === "zh_CN" ? "title_zh_cn" : "title"]}">${unicode2Emoji("1f60d")}</button>
|
<button data-type="2" class="emojis__type ariaLabel" aria-label="${window.siyuan.emojis[1][window.siyuan.config.lang === "zh_CN" ? "title_zh_cn" : "title"]}">${unicode2Emoji("1f60d")}</button>
|
||||||
<button data-type="3" class="emojis__type" aria-label="${window.siyuan.emojis[2][window.siyuan.config.lang === "zh_CN" ? "title_zh_cn" : "title"]}">${unicode2Emoji("1f433")}</button>
|
<button data-type="3" class="emojis__type ariaLabel" aria-label="${window.siyuan.emojis[2][window.siyuan.config.lang === "zh_CN" ? "title_zh_cn" : "title"]}">${unicode2Emoji("1f433")}</button>
|
||||||
<button data-type="4" class="emojis__type" aria-label="${window.siyuan.emojis[3][window.siyuan.config.lang === "zh_CN" ? "title_zh_cn" : "title"]}">${unicode2Emoji("1f96a")}</button>
|
<button data-type="4" class="emojis__type ariaLabel" aria-label="${window.siyuan.emojis[3][window.siyuan.config.lang === "zh_CN" ? "title_zh_cn" : "title"]}">${unicode2Emoji("1f96a")}</button>
|
||||||
<button data-type="5" class="emojis__type" aria-label="${window.siyuan.emojis[4][window.siyuan.config.lang === "zh_CN" ? "title_zh_cn" : "title"]}">${unicode2Emoji("1f3a8")}</button>
|
<button data-type="5" class="emojis__type ariaLabel" aria-label="${window.siyuan.emojis[4][window.siyuan.config.lang === "zh_CN" ? "title_zh_cn" : "title"]}">${unicode2Emoji("1f3a8")}</button>
|
||||||
<button data-type="6" class="emojis__type" aria-label="${window.siyuan.emojis[5][window.siyuan.config.lang === "zh_CN" ? "title_zh_cn" : "title"]}">${unicode2Emoji("1f3dd")}</button>
|
<button data-type="6" class="emojis__type ariaLabel" aria-label="${window.siyuan.emojis[5][window.siyuan.config.lang === "zh_CN" ? "title_zh_cn" : "title"]}">${unicode2Emoji("1f3dd")}</button>
|
||||||
<button data-type="7" class="emojis__type" aria-label="${window.siyuan.emojis[6][window.siyuan.config.lang === "zh_CN" ? "title_zh_cn" : "title"]}">${unicode2Emoji("1f52e")}</button>
|
<button data-type="7" class="emojis__type ariaLabel" aria-label="${window.siyuan.emojis[6][window.siyuan.config.lang === "zh_CN" ? "title_zh_cn" : "title"]}">${unicode2Emoji("1f52e")}</button>
|
||||||
<button data-type="8" class="emojis__type" aria-label="${window.siyuan.emojis[7][window.siyuan.config.lang === "zh_CN" ? "title_zh_cn" : "title"]}">${unicode2Emoji("267e")}</button>
|
<button data-type="8" class="emojis__type ariaLabel" aria-label="${window.siyuan.emojis[7][window.siyuan.config.lang === "zh_CN" ? "title_zh_cn" : "title"]}">${unicode2Emoji("267e")}</button>
|
||||||
<button data-type="9" class="emojis__type" aria-label="${window.siyuan.emojis[8][window.siyuan.config.lang === "zh_CN" ? "title_zh_cn" : "title"]}">${unicode2Emoji("1f6a9")}</button>
|
<button data-type="9" class="emojis__type ariaLabel" aria-label="${window.siyuan.emojis[8][window.siyuan.config.lang === "zh_CN" ? "title_zh_cn" : "title"]}">${unicode2Emoji("1f6a9")}</button>
|
||||||
</div>
|
</div>
|
||||||
</div>`;
|
</div>`;
|
||||||
lazyLoadEmoji(this.element);
|
lazyLoadEmoji(this.element);
|
||||||
|
|
|
||||||
|
|
@ -46,7 +46,7 @@ ${column.wrap ? "" : "white-space: nowrap;"}">
|
||||||
// body
|
// body
|
||||||
data.rows.forEach((row: IAVRow) => {
|
data.rows.forEach((row: IAVRow) => {
|
||||||
tableHTML += `<div class="av__row" data-id="${row.id}">
|
tableHTML += `<div class="av__row" data-id="${row.id}">
|
||||||
<div class="av__gutters" draggable="true" data-position="right" aria-label="${window.siyuan.languages.rowTip}">
|
<div class="av__gutters ariaLabel" draggable="true" data-position="right" aria-label="${window.siyuan.languages.rowTip}">
|
||||||
<button><svg><use xlink:href="#iconLine"></use></svg></button>
|
<button><svg><use xlink:href="#iconLine"></use></svg></button>
|
||||||
</div>
|
</div>
|
||||||
<div class="av__firstcol"><svg><use xlink:href="#iconUncheck"></use></svg></div>`;
|
<div class="av__firstcol"><svg><use xlink:href="#iconUncheck"></use></svg></div>`;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue