import {Tab} from "../Tab";
import {getDockByType, setPanelFocus} from "../util";
import {fetchPost} from "../../util/fetch";
import {updateHotkeyTip} from "../../protyle/util/compatibility";
import {Model} from "../Model";
import {needSubscribe} from "../../util/needSubscribe";
import {MenuItem} from "../../menus/Menu";
import {hasClosestByAttribute, hasClosestByClassName} from "../../protyle/util/hasClosest";
import {confirmDialog} from "../../dialog/confirmDialog";
export class Inbox extends Model {
private element: Element;
private selectIds: string[] = [];
private currentPage = 1;
private pageCount = 1;
private data: { [key: string]: IInbox } = {};
constructor(tab: Tab) {
super({id: tab.id});
this.element = tab.panelElement;
this.element.classList.add("fn__flex-column", "file-tree", "sy__inbox");
this.element.innerHTML = `
${window.siyuan.languages.inbox}
`;
const countElement = this.element.querySelector(".inboxSelectCount");
const detailsElement = this.element.querySelector(".inbox__details");
const selectAllElement = this.element.querySelector(".block__icons input") as HTMLInputElement;
this.element.addEventListener("click", (event: MouseEvent) => {
setPanelFocus(this.element);
let target = event.target as HTMLElement;
while (target && !target.isEqualNode(this.element)) {
const typeElement = hasClosestByAttribute(target, "data-type", null);
if (typeElement && this.element.contains(typeElement)) {
const type = typeElement.getAttribute("data-type");
switch (type) {
case "min":
getDockByType("inbox").toggleModel("inbox");
break;
case "selectall":
if ((typeElement as HTMLInputElement).checked) {
this.element.lastElementChild.querySelectorAll(".b3-list-item").forEach(item => {
item.querySelector("input").checked = true;
this.selectIds.push(item.getAttribute("data-id"));
this.selectIds = [...new Set(this.selectIds)];
});
} else {
this.element.lastElementChild.querySelectorAll(".b3-list-item").forEach(item => {
item.querySelector("input").checked = false;
this.selectIds.splice(this.selectIds.indexOf(item.getAttribute("data-id")), 1);
});
}
this.updateAction();
countElement.innerHTML = `${this.selectIds.length.toString()}/${this.pageCount.toString()}`;
break;
case "select":
if ((typeElement.firstElementChild.nextElementSibling as HTMLInputElement).checked) {
this.selectIds.push(typeElement.parentElement.getAttribute("data-id"));
this.selectIds = [...new Set(this.selectIds)];
} else {
this.selectIds.splice(this.selectIds.indexOf(typeElement.parentElement.getAttribute("data-id")), 1);
}
this.updateAction();
countElement.innerHTML = `${this.selectIds.length.toString()}/${this.pageCount.toString()}`;
selectAllElement.checked = this.element.lastElementChild.querySelectorAll("input:checked").length === this.element.lastElementChild.querySelectorAll(".b3-list-item").length;
break;
case "previous":
if (typeElement.getAttribute("disabled") !== "disabled") {
this.currentPage--;
this.update();
}
break;
case "next":
if (typeElement.getAttribute("disabled") !== "disabled") {
this.currentPage++;
this.update();
}
break;
case "refresh":
this.currentPage = 1;
this.update();
break;
case "delete":
confirmDialog(window.siyuan.languages.deleteOpConfirm, window.siyuan.languages.confirmDelete + "?", () => {
this.remove(detailsElement.getAttribute("data-id"));
});
break;
case "move":
window.siyuan.menus.menu.remove();
window.siyuan.notebooks.forEach((item) => {
if (!item.closed) {
window.siyuan.menus.menu.append(new MenuItem({
label: item.name,
click: () => {
this.move(item.id, detailsElement.getAttribute("data-id"));
}
}).element);
}
});
window.siyuan.menus.menu.popup({x: event.clientX, y: event.clientY});
break;
case "back":
this.back();
break;
case "more":
this.more(event);
break;
}
break;
} else {
const itemElement = hasClosestByClassName(target, "b3-list-item");
if (itemElement) {
const data = this.data[itemElement.getAttribute("data-id")];
this.element.querySelector('[data-type="back"]').parentElement.classList.remove("fn__none");
this.element.querySelector('[data-type="more"]').parentElement.classList.add("fn__none");
detailsElement.innerHTML = `
${data.shorthandTitle}
${data.shorthandURL}
${(Lute.New()).MarkdownStr("", data.shorthandContent)}
`;
detailsElement.setAttribute("data-id", data.oId);
detailsElement.classList.remove("fn__none");
detailsElement.scrollTop = 0;
break;
}
}
target = target.parentElement;
}
}
);
this.update();
setPanelFocus(this.element);
}
private updateAction() {
if (this.selectIds.length === 0) {
this.element.querySelector('[data-type="refresh"]').classList.remove("fn__none");
this.element.querySelector('[data-type="more"]').classList.add("fn__none");
} else {
this.element.querySelector('[data-type="refresh"]').classList.add("fn__none");
this.element.querySelector('[data-type="more"]').classList.remove("fn__none");
}
}
private back() {
this.element.querySelector('[data-type="back"]').parentElement.classList.add("fn__none");
this.element.querySelector('[data-type="more"]').parentElement.classList.remove("fn__none");
this.element.querySelector(".inbox__details").classList.add("fn__none");
}
private more(event: MouseEvent) {
window.siyuan.menus.menu.remove();
window.siyuan.menus.menu.append(new MenuItem({
label: window.siyuan.languages.refresh,
icon: "iconRefresh",
click: () => {
this.currentPage = 1;
this.update();
}
}).element);
const submenu: IMenu[] = [];
window.siyuan.notebooks.forEach((item) => {
if (!item.closed) {
submenu.push({
label: item.name,
click: () => {
this.move(item.id);
}
});
}
});
window.siyuan.menus.menu.append(new MenuItem({
label: window.siyuan.languages.move,
icon: "iconMove",
submenu
}).element);
window.siyuan.menus.menu.append(new MenuItem({
label: window.siyuan.languages.remove,
icon: "iconTrashcan",
click: () => {
confirmDialog(window.siyuan.languages.deleteOpConfirm, window.siyuan.languages.confirmDelete + "?", () => {
this.remove();
});
}
}).element);
window.siyuan.menus.menu.popup({x: event.clientX, y: event.clientY});
}
private remove(id?: string) {
let ids: string[];
if (id) {
ids = [id];
} else {
ids = this.selectIds;
}
fetchPost("/api/inbox/removeShorthands", {ids}, () => {
if (id) {
this.back();
this.selectIds.find((item, index) => {
if (item === id) {
this.selectIds.splice(index, 1);
return true;
}
});
} else {
this.selectIds = [];
}
this.updateAction();
this.currentPage = 1;
this.update();
});
}
private move(notebookId: string, id?: string) {
let ids: string[];
if (id) {
ids = [id];
} else {
ids = this.selectIds;
}
ids.forEach(item => {
fetchPost("/api/filetree/createDoc", {
notebook: notebookId,
path: `/${Lute.NewNodeID()}.sy`,
title: this.data[item].shorthandTitle,
md: this.data[item].shorthandContent,
}, () => {
this.remove(item);
});
});
}
private update() {
if (needSubscribe("")) {
this.element.lastElementChild.innerHTML = `
-
相关功能可打开帮助文档搜索
收集箱 查看使用说明
-
${window.siyuan.config.system.container === "ios" ? window.siyuan.languages._kernel[122] : window.siyuan.languages._kernel[29]}
`;
return;
}
const refreshElement = this.element.querySelector('[data-type="refresh"] svg');
if (refreshElement.classList.contains("fn__rotate")) {
return;
}
refreshElement.classList.add("fn__rotate");
fetchPost("/api/inbox/getShorthands", {page: this.currentPage}, (response) => {
refreshElement.classList.remove("fn__rotate");
let html = "";
if (response.data.data.shorthands.length === 0) {
html = '';
} else {
html = '";
}
this.element.lastElementChild.innerHTML = html;
this.pageCount = response.data.data.pagination.paginationRecordCount;
this.element.querySelector(".inboxSelectCount").innerHTML = `${this.selectIds.length}/${this.pageCount}`;
const previousElement = this.element.querySelector('span[data-type="previous"]');
const nextElement = this.element.querySelector('span[data-type="next"]');
if (response.data.data.pagination.paginationPageCount > this.currentPage) {
nextElement.removeAttribute("disabled");
} else {
nextElement.setAttribute("disabled", "disabled");
}
if (this.currentPage === 1) {
previousElement.setAttribute("disabled", "disabled");
} else {
previousElement.removeAttribute("disabled");
}
const selectCount = this.element.lastElementChild.querySelectorAll(".b3-list-item").length;
(this.element.querySelector(".block__icons input") as HTMLInputElement).checked = this.element.lastElementChild.querySelectorAll("input:checked").length === selectCount && selectCount !== 0;
});
}
}