import {unicode2Emoji} from "../../../emoji"; import {getColIconByType} from "./col"; import {escapeHtml} from "../../../util/escape"; import {setPosition} from "../../../util/setPosition"; import {getFieldsByData} from "./view"; import {fetchSyncPost} from "../../../util/fetch"; import {Menu} from "../../../plugin/Menu"; import {transaction} from "../../wysiwyg/transaction"; export const setGroupMethod = async (options: { protyle: IProtyle; fieldId: string; data: IAV; menuElement: HTMLElement, blockElement: Element, }) => { const blockID = options.blockElement.getAttribute("data-node-id"); const column: IAVColumn = getFieldsByData(options.data).find(item => item.id === options.fieldId); const data = column ? { field: options.fieldId, method: column.type === "number" ? 1 : (["date", "updated", "created"].includes(column.type) ? 2 : 0), order: 0, range: column.type === "number" ? { numStart: 0, numEnd: 1000, numStep: 100, } : null } : {field: null, method: null, order: null, range: null}; const response = await fetchSyncPost("/api/av/setAttrViewGroup", { blockID, avID: options.blockElement.getAttribute("data-av-id"), group: data }); options.data.view = response.data.view; options.menuElement.innerHTML = getGroupsHTML(getFieldsByData(options.data), options.data.view); // bindGroupsEvent(options.protyle, options.menuElement, options.data, blockID); const tabRect = options.blockElement.querySelector(".av__views").getBoundingClientRect(); setPosition(options.menuElement, tabRect.right - options.menuElement.clientWidth, tabRect.bottom, tabRect.height); }; export const getGroupsMethodHTML = (columns: IAVColumn[], group: IAVGroup) => { const selectHTML = ''; let html = ``; columns.forEach(item => { if (["rollup", "mAsset"].includes(item.type)) { return; } html += ``; }); return `
`; }; const getLanguageByIndex = (index: number, type: "sort" | "date") => { if (type === "sort") { switch (index) { case 0: return window.siyuan.languages.asc; case 1: return window.siyuan.languages.desc; case 2: return window.siyuan.languages.customSort; default: return ""; } } else if (type === "date") { switch (index) { case 2: return window.siyuan.languages.groupMethodDateRelative; case 3: return window.siyuan.languages.groupMethodDateDay; case 4: return window.siyuan.languages.groupMethodDateWeek; case 5: return window.siyuan.languages.groupMethodDateMonth; case 6: return window.siyuan.languages.groupMethodDateYear; default: return ""; } } }; export const getGroupsHTML = (columns: IAVColumn[], view: IAVView) => { let html = ""; let column: IAVColumn; if (view.group && view.group.field) { let groupHTML = ""; column = columns.find(item => item.id === view.group.field); if (view.groups.length > 0) { groupHTML = ` `; const disabledDrag = ["created", "date", "created", "updated"].includes(column.type); view.groups.forEach(item => { groupHTML += ``; }); } html = ` ${groupHTML} `; } return ``; }; export const bindGroupsEvent = () => { }; export const goGroupsDate = (options: { protyle: IProtyle; target: Element; data: IAV; blockElement: Element; }) => { const menu = new Menu("avGroupDate"); if (menu.isOpen) { return; } const blockID = options.blockElement.getAttribute("data-node-id"); [2, 3, 4, 5, 6].forEach((item) => { const label = getLanguageByIndex(item, "date"); menu.addItem({ iconHTML: "", checked: options.data.view.group.method === item, label, click() { transaction(options.protyle, [{ action: "setAttrViewGroup", avID: options.data.id, blockID, data: { method: item, } }], [{ action: "setAttrViewGroup", avID: options.data.id, blockID, data: { method: options.data.view.group?.method || null, } }]); options.data.view.group.method = item; options.target.querySelector(".b3-menu__accelerator").textContent = label; } }); }); const rect = options.target.getBoundingClientRect(); menu.open({ isLeft: true, x: rect.right, y: rect.bottom }); }; export const goGroupsSort = (options: { protyle: IProtyle; target: Element; data: IAV; blockElement: Element; }) => { const menu = new Menu("avGroupSort"); if (menu.isOpen) { return; } const blockID = options.blockElement.getAttribute("data-node-id"); const column = getFieldsByData(options.data).find(item => item.id === options.data.view.group.field); (["created", "date", "created", "updated"].includes(column.type) ? [0, 1] : [0, 1, 2]).forEach((item) => { const label = getLanguageByIndex(item, "sort"); menu.addItem({ iconHTML: "", checked: options.data.view.group.order === item, label, click() { transaction(options.protyle, [{ action: "setAttrViewGroup", avID: options.data.id, blockID, data: { order: item, } }], [{ action: "setAttrViewGroup", avID: options.data.id, blockID, data: { order: options.data.view.group?.order || null, } }]); options.data.view.group.order = item; options.target.querySelector(".b3-menu__accelerator").textContent = label; } }); }); const rect = options.target.getBoundingClientRect(); menu.open({ isLeft: true, x: rect.right, y: rect.bottom }); };