2025-07-04 18:27:11 +08:00
|
|
|
import {unicode2Emoji} from "../../../emoji";
|
|
|
|
|
import {getColIconByType} from "./col";
|
|
|
|
|
import {escapeHtml} from "../../../util/escape";
|
|
|
|
|
import {transaction} from "../../wysiwyg/transaction";
|
|
|
|
|
import {setPosition} from "../../../util/setPosition";
|
|
|
|
|
import {getFieldsByData} from "./view";
|
|
|
|
|
|
|
|
|
|
export const setGroupMethod = (options: {
|
|
|
|
|
protyle: IProtyle;
|
|
|
|
|
fieldId: string;
|
|
|
|
|
data: IAV;
|
|
|
|
|
menuElement: HTMLElement,
|
2025-07-05 14:55:16 +08:00
|
|
|
blockElement: Element,
|
2025-07-04 18:27:11 +08:00
|
|
|
}) => {
|
2025-07-05 14:55:16 +08:00
|
|
|
const blockID = options.blockElement.getAttribute("data-block-id");
|
2025-07-04 18:27:11 +08:00
|
|
|
transaction(options.protyle, [{
|
|
|
|
|
action: "setAttrViewGroup",
|
2025-07-05 14:55:16 +08:00
|
|
|
avID: options.data.id,
|
|
|
|
|
blockID,
|
2025-07-04 18:27:11 +08:00
|
|
|
data: {
|
|
|
|
|
field: options.fieldId,
|
|
|
|
|
method: null,
|
|
|
|
|
order: null,
|
|
|
|
|
range: null
|
|
|
|
|
}
|
|
|
|
|
}], [{
|
|
|
|
|
action: "setAttrViewGroup",
|
2025-07-05 14:55:16 +08:00
|
|
|
avID: options.data.id,
|
|
|
|
|
blockID,
|
2025-07-04 18:27:11 +08:00
|
|
|
data: {
|
2025-07-05 14:55:16 +08:00
|
|
|
field: options.data.view.group?.field || "",
|
2025-07-04 18:27:11 +08:00
|
|
|
method: null,
|
|
|
|
|
order: null,
|
|
|
|
|
range: null
|
|
|
|
|
}
|
|
|
|
|
}]);
|
2025-07-05 14:55:16 +08:00
|
|
|
if (!options.data.view.group) {
|
|
|
|
|
options.data.view.group = {
|
2025-07-05 12:20:49 +08:00
|
|
|
field: options.fieldId
|
|
|
|
|
};
|
|
|
|
|
} else {
|
2025-07-05 14:55:16 +08:00
|
|
|
options.data.view.group.field = options.fieldId;
|
2025-07-05 12:20:49 +08:00
|
|
|
}
|
2025-07-05 14:55:16 +08:00
|
|
|
options.menuElement.innerHTML = getGroupsHTML(getFieldsByData(options.data), options.data.view.group);
|
2025-07-04 18:27:11 +08:00
|
|
|
// 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);
|
2025-07-05 12:20:49 +08:00
|
|
|
};
|
2025-07-04 18:27:11 +08:00
|
|
|
|
2025-07-05 14:55:16 +08:00
|
|
|
export const getGroupsMethodHTML = (columns: IAVColumn[], group: IAVGroup) => {
|
2025-07-04 18:27:11 +08:00
|
|
|
const selectHTML = '<svg class="b3-menu__checked"><use xlink:href="#iconSelect"></use></svg>';
|
|
|
|
|
let html = `<button class="b3-menu__item" data-type="setGroupMethod">
|
|
|
|
|
<div class="b3-menu__label">${window.siyuan.languages.calcOperatorNone}</div>
|
2025-07-05 14:55:16 +08:00
|
|
|
${group ? "" : selectHTML}
|
2025-07-04 18:27:11 +08:00
|
|
|
</button>`;
|
|
|
|
|
columns.forEach(item => {
|
|
|
|
|
html += `<button class="b3-menu__item" data-id="${item.id}" data-type="setGroupMethod">
|
|
|
|
|
<div class="b3-menu__label fn__flex">
|
|
|
|
|
${item.icon ? unicode2Emoji(item.icon, "b3-menu__icon", true) : `<svg class="b3-menu__icon"><use xlink:href="#${getColIconByType(item.type)}"></use></svg>`}
|
|
|
|
|
${escapeHtml(item.name) || " "}
|
|
|
|
|
</div>
|
2025-07-05 14:55:16 +08:00
|
|
|
${group?.field === item.id ? selectHTML : ""}
|
2025-07-04 18:27:11 +08:00
|
|
|
</button>`;
|
|
|
|
|
});
|
|
|
|
|
return `<div class="b3-menu__items">
|
|
|
|
|
<button class="b3-menu__item" data-type="nobg">
|
|
|
|
|
<span class="block__icon" style="padding: 8px;margin-left: -4px;" data-type="goGroups">
|
|
|
|
|
<svg><use xlink:href="#iconLeft"></use></svg>
|
|
|
|
|
</span>
|
|
|
|
|
<span class="b3-menu__label ft__center">${window.siyuan.languages.groupMethod}</span>
|
|
|
|
|
</button>
|
|
|
|
|
<button class="b3-menu__separator"></button>
|
|
|
|
|
${html}
|
|
|
|
|
</div>`;
|
|
|
|
|
};
|
|
|
|
|
|
2025-07-05 14:55:16 +08:00
|
|
|
export const getGroupsHTML = (columns: IAVColumn[], group: IAVGroup) => {
|
2025-07-04 18:27:11 +08:00
|
|
|
let html = "";
|
2025-07-23 21:46:57 +08:00
|
|
|
if (group && group.field) {
|
|
|
|
|
html = `<button class="b3-menu__item" data-type="goGroupsMethod">
|
|
|
|
|
<span class="b3-menu__label">${window.siyuan.languages.date}</span>
|
|
|
|
|
<span class="b3-menu__accelerator">${group.method}</span>
|
|
|
|
|
<svg class="b3-menu__icon b3-menu__icon--small"><use xlink:href="#iconRight"></use></svg>
|
|
|
|
|
</button>
|
|
|
|
|
<button class="b3-menu__item" data-type="goGroupsSort">
|
|
|
|
|
<span class="b3-menu__label">${window.siyuan.languages.sort}</span>
|
|
|
|
|
<span class="b3-menu__accelerator">${group.order}</span>
|
|
|
|
|
<svg class="b3-menu__icon b3-menu__icon--small"><use xlink:href="#iconRight"></use></svg>
|
|
|
|
|
</button>
|
|
|
|
|
<button class="b3-menu__item">
|
|
|
|
|
<span class="fn__flex-center">${window.siyuan.languages.hideEmptyGroup}</span>
|
|
|
|
|
<span class="fn__space fn__flex-1"></span>
|
|
|
|
|
<input type="checkbox" class="b3-switch b3-switch--menu">
|
|
|
|
|
</button>
|
|
|
|
|
<button class="b3-menu__separator"></button>
|
2025-07-04 18:27:11 +08:00
|
|
|
<button class="b3-menu__item" data-type="removeGroups">
|
|
|
|
|
<svg class="b3-menu__icon"><use xlink:href="#iconTrashcan"></use></svg>
|
2025-07-23 21:46:57 +08:00
|
|
|
<span class="b3-menu__label">${window.siyuan.languages.removeGroup}</span>
|
2025-07-04 18:27:11 +08:00
|
|
|
</button>`;
|
|
|
|
|
}
|
|
|
|
|
return `<div class="b3-menu__items">
|
|
|
|
|
<button class="b3-menu__item" data-type="nobg">
|
|
|
|
|
<span class="block__icon" style="padding: 8px;margin-left: -4px;" data-type="go-config">
|
|
|
|
|
<svg><use xlink:href="#iconLeft"></use></svg>
|
|
|
|
|
</span>
|
|
|
|
|
<span class="b3-menu__label ft__center">${window.siyuan.languages.group}</span>
|
|
|
|
|
</button>
|
|
|
|
|
<button class="b3-menu__separator"></button>
|
|
|
|
|
<button class="b3-menu__item" data-type="goGroupsMethod">
|
|
|
|
|
<span class="b3-menu__label">${window.siyuan.languages.groupMethod}</span>
|
2025-07-23 21:46:57 +08:00
|
|
|
<span class="b3-menu__accelerator">${(group && group.field) ? columns.filter(item => item.id === group.field)[0].name : ""}</span>
|
2025-07-04 18:27:11 +08:00
|
|
|
<svg class="b3-menu__icon b3-menu__icon--small"><use xlink:href="#iconRight"></use></svg>
|
|
|
|
|
</button>
|
|
|
|
|
${html}
|
|
|
|
|
</div>`;
|
|
|
|
|
};
|
|
|
|
|
|
2025-07-22 16:14:43 +08:00
|
|
|
export const bindGroupsEvent = () => {
|
2025-07-04 18:27:11 +08:00
|
|
|
|
|
|
|
|
};
|