diff --git a/app/src/protyle/render/av/openMenuPanel.ts b/app/src/protyle/render/av/openMenuPanel.ts index bae0b05f7..d641d8be1 100644 --- a/app/src/protyle/render/av/openMenuPanel.ts +++ b/app/src/protyle/render/av/openMenuPanel.ts @@ -4,6 +4,7 @@ import {addCol} from "./addCol"; import {getColIconByType} from "./col"; import {setPosition} from "../../../util/setPosition"; import {Menu} from "../../../plugin/Menu"; +import {hasClosestByClassName} from "../../util/hasClosest"; export const openMenuPanel = (protyle: IProtyle, blockElement: HTMLElement, type: "properties" | "config" | "sorts" | "filters" = "config") => { let avPanelElement = document.querySelector(".av__panel"); @@ -152,13 +153,13 @@ export const openMenuPanel = (protyle: IProtyle, blockElement: HTMLElement, type action: "setAttrView", id: avId, data: { - filter: data.filters + filters: data.filters } }], [{ action: "setAttrView", id: avId, data: { - filter: oldFilters + filters: oldFilters } }]); menuElement.innerHTML = getFiltersHTML(data); @@ -414,7 +415,7 @@ const setFilter = (protyle: IProtyle, data: IAV, target: HTMLElement) => { data.filters.find((filter) => { if (filter.column === colId) { filter.value[colType] = { - content: (window.siyuan.menus.menu.element.querySelector(".b3-text-field") as HTMLInputElement).value + content: textElement.value }; filter.operator = (window.siyuan.menus.menu.element.querySelector(".b3-select") as HTMLSelectElement).value as TAVFilterOperator; return true; @@ -433,18 +434,23 @@ const setFilter = (protyle: IProtyle, data: IAV, target: HTMLElement) => { filters: oldFilters } }]); + const menuElement = hasClosestByClassName(target, "b3-menu") + if (menuElement) { + menuElement.innerHTML = getFiltersHTML(data); + } }); let selectHTML = ""; + const filterOperation = target.getAttribute("data-op") switch (colType) { case "text": - selectHTML = ` - - - - - - - + selectHTML = ` + + + + + + + `; break; } @@ -454,10 +460,22 @@ const setFilter = (protyle: IProtyle, data: IAV, target: HTMLElement) => { }) menu.addItem({ iconHTML: "", - label: `` + label: `` + }) + const textElement = (window.siyuan.menus.menu.element.querySelector(".b3-text-field") as HTMLInputElement) + textElement.addEventListener("keydown", (event) => { + if (event.isComposing) { + event.preventDefault(); + return; + } + if (event.key === "Enter") { + menu.close(); + event.preventDefault(); + } }) const rectTarget = target.getBoundingClientRect(); - menu.open({x: rectTarget.left, y: rectTarget.bottom}) + menu.open({x: rectTarget.left, y: rectTarget.bottom}); + textElement.select(); } const addFilter = (options: { @@ -483,7 +501,6 @@ const addFilter = (options: { icon: getColIconByType(column.type), click: () => { const oldFilters = Object.assign([], options.data.filters); - options.data.filters.push({ column: column.id, operator: "Contains", @@ -508,6 +525,7 @@ const addFilter = (options: { }]); options.menuElement.innerHTML = getFiltersHTML(options.data); setPosition(options.menuElement, options.tabRect.right - options.menuElement.clientWidth, options.tabRect.bottom, options.tabRect.height); + setFilter(options.protyle, options.data, options.menuElement.querySelector(`[data-id="${column.id}"] .b3-chip`)); } }); } @@ -525,10 +543,10 @@ const getFiltersHTML = (data: IAV) => { let filterHTML = ""; data.columns.find((item) => { if (item.id === filter.column) { - const filterValue = (filter.value && filter.value[item.type] && filter.value[item.type].content) ? ":" + filter.value[item.type].content : ""; - filterHTML += ` + const filterValue = (filter.value && filter.value[item.type] && filter.value[item.type].content) ? filter.value[item.type].content : ""; + filterHTML += ` - ${item.name}${filterValue} + ${item.name}${filterValue ? ": " + filterValue : ""} `; return true }