2023-07-02 20:52:16 +08:00
|
|
|
import {transaction} from "../../wysiwyg/transaction";
|
|
|
|
|
import {fetchPost} from "../../../util/fetch";
|
2023-07-02 21:53:02 +08:00
|
|
|
import {addCol} from "./addCol";
|
|
|
|
|
import {getColIconByType} from "./col";
|
2023-07-02 20:52:16 +08:00
|
|
|
|
|
|
|
|
export const openMenuPanel = (protyle: IProtyle, blockElement: HTMLElement, type: "properties" | "config" = "config") => {
|
|
|
|
|
let avMenuPanel = document.querySelector(".av__panel");
|
|
|
|
|
if (avMenuPanel) {
|
|
|
|
|
avMenuPanel.remove();
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
window.siyuan.menus.menu.remove();
|
2023-07-02 21:53:02 +08:00
|
|
|
const avId = blockElement.getAttribute("data-av-id")
|
|
|
|
|
fetchPost("/api/av/renderAttributeView", {id: avId}, (response) => {
|
|
|
|
|
const data = response.data.av as IAV;
|
2023-07-02 20:52:16 +08:00
|
|
|
const tabRect = blockElement.querySelector(".layout-tab-bar").getBoundingClientRect()
|
|
|
|
|
let html
|
|
|
|
|
if (type === "config") {
|
2023-07-02 21:53:02 +08:00
|
|
|
html = getConfigHTML(data, tabRect);
|
2023-07-02 20:52:16 +08:00
|
|
|
} else if (type === "properties") {
|
2023-07-02 21:53:02 +08:00
|
|
|
html = getPropertiesHTML(data, tabRect);
|
2023-07-02 20:52:16 +08:00
|
|
|
}
|
2023-07-02 21:53:02 +08:00
|
|
|
document.body.insertAdjacentHTML("beforeend", `<div class="av__panel">${html}</div>`);
|
2023-07-02 20:52:16 +08:00
|
|
|
avMenuPanel = document.querySelector(".av__panel");
|
|
|
|
|
avMenuPanel.addEventListener("click", (event) => {
|
|
|
|
|
event.preventDefault();
|
|
|
|
|
let target = event.target as HTMLElement;
|
|
|
|
|
while (target && !target.isSameNode(avMenuPanel)) {
|
|
|
|
|
const type = target.dataset.type;
|
|
|
|
|
if (type === "close") {
|
|
|
|
|
avMenuPanel.remove();
|
2023-07-02 21:53:02 +08:00
|
|
|
event.stopPropagation();
|
|
|
|
|
break;
|
|
|
|
|
} else if (type === "goConfig") {
|
|
|
|
|
avMenuPanel.innerHTML = getConfigHTML(data, tabRect);
|
|
|
|
|
event.stopPropagation();
|
|
|
|
|
break;
|
|
|
|
|
} else if (type === "goProperties") {
|
|
|
|
|
avMenuPanel.innerHTML = getPropertiesHTML(data, tabRect);
|
|
|
|
|
event.stopPropagation();
|
|
|
|
|
break;
|
|
|
|
|
} else if (type === "newCol") {
|
|
|
|
|
avMenuPanel.remove();
|
|
|
|
|
const addMenu = addCol(protyle, blockElement);
|
|
|
|
|
addMenu.open({
|
|
|
|
|
x: tabRect.right,
|
|
|
|
|
y: tabRect.bottom,
|
|
|
|
|
h: tabRect.height,
|
|
|
|
|
isLeft: true
|
|
|
|
|
});
|
|
|
|
|
event.stopPropagation();
|
|
|
|
|
break;
|
|
|
|
|
} else if (type === "showAllCol") {
|
|
|
|
|
// showAllCol(data);
|
|
|
|
|
avMenuPanel.innerHTML = getPropertiesHTML(data, tabRect);
|
|
|
|
|
event.stopPropagation();
|
|
|
|
|
break;
|
|
|
|
|
} else if (type === "hideAllCol") {
|
|
|
|
|
|
|
|
|
|
event.stopPropagation();
|
|
|
|
|
break;
|
|
|
|
|
} else if (type === "hideCol") {
|
|
|
|
|
const colId = target.getAttribute("data-id");
|
|
|
|
|
transaction(protyle, [{
|
|
|
|
|
action: "setAttrViewColHidden",
|
|
|
|
|
id: colId,
|
|
|
|
|
parentID: avId,
|
|
|
|
|
data: true
|
|
|
|
|
}], [{
|
|
|
|
|
action: "setAttrViewColHidden",
|
|
|
|
|
id: colId,
|
|
|
|
|
parentID: avId,
|
|
|
|
|
data: false
|
|
|
|
|
}]);
|
|
|
|
|
data.columns.find((item: IAVColumn) => item.id === colId).hidden = true;
|
|
|
|
|
avMenuPanel.innerHTML = getPropertiesHTML(data, tabRect);
|
|
|
|
|
event.stopPropagation();
|
|
|
|
|
break;
|
|
|
|
|
} else if (type === "showCol") {
|
|
|
|
|
const colId = target.getAttribute("data-id");
|
|
|
|
|
transaction(protyle, [{
|
|
|
|
|
action: "setAttrViewColHidden",
|
|
|
|
|
id: colId,
|
|
|
|
|
parentID: avId,
|
|
|
|
|
data: false
|
|
|
|
|
}], [{
|
|
|
|
|
action: "setAttrViewColHidden",
|
|
|
|
|
id: colId,
|
|
|
|
|
parentID: avId,
|
|
|
|
|
data: true
|
|
|
|
|
}]);
|
|
|
|
|
data.columns.find((item: IAVColumn) => item.id === colId).hidden = false;
|
|
|
|
|
avMenuPanel.innerHTML = getPropertiesHTML(data, tabRect);
|
|
|
|
|
event.stopPropagation();
|
2023-07-02 20:52:16 +08:00
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
target = target.parentElement;
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
}
|
2023-07-02 21:53:02 +08:00
|
|
|
|
|
|
|
|
const getConfigHTML = (data: IAV, tabRect: DOMRect) => {
|
|
|
|
|
return `<div class="b3-dialog__scrim" data-type="close"></div>
|
|
|
|
|
<div class="b3-menu" style="right:${window.innerWidth - tabRect.right}px;top:${tabRect.bottom}px">
|
|
|
|
|
<button class="b3-menu__item" data-type="title">
|
|
|
|
|
<span class="b3-menu__label">${window.siyuan.languages.config}</span>
|
|
|
|
|
<svg class="b3-menu__action" data-type="close" style="opacity: 1"><use xlink:href="#iconCloseRound"></use></svg>
|
|
|
|
|
</button>
|
|
|
|
|
<button class="b3-menu__separator"></button>
|
|
|
|
|
<button class="b3-menu__item" data-type="goProperties">
|
|
|
|
|
<svg class="b3-menu__icon"></svg>
|
|
|
|
|
<span class="b3-menu__label">${window.siyuan.languages.attr}</span>
|
|
|
|
|
<span class="b3-menu__accelerator">${data.columns.filter((item: IAVColumn) => !item.hidden).length}/${data.columns.length}</span>
|
|
|
|
|
<svg class="b3-menu__icon b3-menu__icon--arrow"><use xlink:href="#iconRight"></use></svg>
|
|
|
|
|
</button>
|
|
|
|
|
<button class="b3-menu__item">
|
|
|
|
|
<svg class="b3-menu__icon"><use xlink:href="#iconFilter"></use></svg>
|
|
|
|
|
<span class="b3-menu__label">${window.siyuan.languages.filter}</span>
|
|
|
|
|
<span class="b3-menu__accelerator">${data.filters.length}</span>
|
|
|
|
|
<svg class="b3-menu__icon b3-menu__icon--arrow"><use xlink:href="#iconRight"></use></svg>
|
|
|
|
|
</button>
|
|
|
|
|
<button class="b3-menu__item">
|
|
|
|
|
<svg class="b3-menu__icon"><use xlink:href="#iconSort"></use></svg>
|
|
|
|
|
<span class="b3-menu__label">${window.siyuan.languages.sort}</span>
|
|
|
|
|
<span class="b3-menu__accelerator">${data.sorts.length}</span>
|
|
|
|
|
<svg class="b3-menu__icon b3-menu__icon--arrow"><use xlink:href="#iconRight"></use></svg>
|
|
|
|
|
</button>
|
|
|
|
|
<button class="b3-menu__item">
|
|
|
|
|
<svg class="b3-menu__icon"></svg>
|
|
|
|
|
<span class="b3-menu__label">${window.siyuan.languages.pageCount}</span>
|
|
|
|
|
<span class="b3-menu__accelerator">50</span>
|
|
|
|
|
<svg class="b3-menu__icon b3-menu__icon--arrow"><use xlink:href="#iconRight"></use></svg>
|
|
|
|
|
</button>
|
|
|
|
|
</div>`
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const getPropertiesHTML = (data: IAV, tabRect: DOMRect) => {
|
|
|
|
|
let showHTML = "";
|
|
|
|
|
let hideHTML = "";
|
|
|
|
|
data.columns.forEach((item: IAVColumn) => {
|
|
|
|
|
if (item.hidden) {
|
|
|
|
|
hideHTML += `<button class="b3-menu__item">
|
|
|
|
|
<svg class="b3-menu__icon"><use xlink:href="#${getColIconByType(item.type)}"></use></svg>
|
|
|
|
|
<span class="b3-menu__label">${item.name}</span>
|
|
|
|
|
<svg class="b3-menu__action" data-type="showCol" data-id="${item.id}"><use xlink:href="#iconEyeoff"></use></svg>
|
|
|
|
|
</button>`
|
|
|
|
|
} else {
|
|
|
|
|
showHTML += `<button class="b3-menu__item">
|
|
|
|
|
<svg class="b3-menu__icon"><use xlink:href="#${getColIconByType(item.type)}"></use></svg>
|
|
|
|
|
<span class="b3-menu__label">${item.name}</span>
|
|
|
|
|
<svg class="b3-menu__action${item.type === "block" ? " fn__none" : ""}" data-type="hideCol" data-id="${item.id}"><use xlink:href="#iconEye"></use></svg>
|
|
|
|
|
</button>`
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
if (hideHTML) {
|
|
|
|
|
hideHTML = `<button class="b3-menu__separator"></button>
|
|
|
|
|
<button class="b3-menu__item" data-type="hideAllCol">
|
|
|
|
|
<svg class="b3-menu__icon"><use xlink:href="#iconEyeoff"></use></svg>
|
|
|
|
|
<span class="b3-menu__label">${window.siyuan.languages.hideAll}</span>
|
|
|
|
|
<span class="b3-menu__accelerator">${data.columns.filter((item: IAVColumn) => item.hidden).length}</span>
|
|
|
|
|
</button>
|
|
|
|
|
${hideHTML}`;
|
|
|
|
|
}
|
|
|
|
|
return `<div class="b3-dialog__scrim" data-type="close"></div>
|
|
|
|
|
<div class="b3-menu" style="right:${window.innerWidth - tabRect.right}px;top:${tabRect.bottom}px">
|
|
|
|
|
<button class="b3-menu__item" data-type="goConfig">
|
|
|
|
|
<svg class="b3-menu__icon"><use xlink:href="#iconLeft"></use></svg>
|
|
|
|
|
<span class="b3-menu__label">${window.siyuan.languages.back}</span>
|
|
|
|
|
<svg class="b3-menu__action" data-type="close" style="opacity: 1"><use xlink:href="#iconCloseRound"></use></svg>
|
|
|
|
|
</button>
|
|
|
|
|
<button class="b3-menu__separator"></button>
|
|
|
|
|
<button class="b3-menu__item" data-type="showAllCol">
|
|
|
|
|
<svg class="b3-menu__icon"><use xlink:href="#iconEye"></use></svg>
|
|
|
|
|
<span class="b3-menu__label">${window.siyuan.languages.showAll}</span>
|
|
|
|
|
<span class="b3-menu__accelerator">${data.columns.filter((item: IAVColumn) => !item.hidden).length}</span>
|
|
|
|
|
</button>
|
|
|
|
|
${showHTML}
|
|
|
|
|
${hideHTML}
|
|
|
|
|
<button class="b3-menu__separator"></button>
|
|
|
|
|
<button class="b3-menu__item" data-type="newCol">
|
|
|
|
|
<svg class="b3-menu__icon"><use xlink:href="#iconAdd"></use></svg>
|
|
|
|
|
<span class="b3-menu__label">${window.siyuan.languages.new}</span>
|
|
|
|
|
</button>
|
|
|
|
|
</div>`
|
|
|
|
|
}
|