From fb1a23a67d3b221de32e55e863ea3701210720ba Mon Sep 17 00:00:00 2001 From: Vanessa Date: Fri, 1 Mar 2024 16:13:43 +0800 Subject: [PATCH] :art: https://github.com/siyuan-note/siyuan/issues/10451 --- app/appearance/langs/zh_CN.json | 6 + app/src/protyle/render/av/filter.ts | 163 +++++++++++++++++++++------- app/src/types/index.d.ts | 8 ++ 3 files changed, 138 insertions(+), 39 deletions(-) diff --git a/app/appearance/langs/zh_CN.json b/app/appearance/langs/zh_CN.json index 506c406b6..55ac26882 100644 --- a/app/appearance/langs/zh_CN.json +++ b/app/appearance/langs/zh_CN.json @@ -1,4 +1,10 @@ { + "current": "当前", + "week": "周", + "month": "月", + "year": "年", + "before": "前", + "after": "后", "listInvalidRefBlocks": "列出引用失效的块", "listItemDotNumberClickFocus": "列表项圆点/数字单击聚焦", "listItemDotNumberClickFocusTip": "启用后单击列表项的圆点/数字将进入聚焦", diff --git a/app/src/protyle/render/av/filter.ts b/app/src/protyle/render/av/filter.ts index a777cbe5d..cf842d6df 100644 --- a/app/src/protyle/render/av/filter.ts +++ b/app/src/protyle/render/av/filter.ts @@ -26,27 +26,33 @@ export const getDefaultOperatorByType = (type: TAVCol) => { const toggleEmpty = (element: HTMLElement, operator: string, type: TAVCol) => { const menuElement = hasClosestByClassName(element, "b3-menu"); if (menuElement) { - menuElement.querySelectorAll("input, .b3-chip").forEach((inputElement, index) => { + if (["date", "updated", "created"].includes(type)) { + const filterElement = menuElement.querySelector('.b3-menu__item div[data-type="filter1"]'); + const filter2Element = filterElement.nextElementSibling + const thisOptionElement = filterElement.querySelector('option[data-type="current"]') + const thisOption2Element = filter2Element.querySelector('option[data-type="current"]') + if (operator === "Is between") { + filter2Element.classList.remove("fn__none") + filterElement.classList.remove("fn__none") + thisOptionElement.classList.remove("fn__none") + thisOption2Element.classList.remove("fn__none") + } else if (operator === "Is empty" || operator === "Is not empty") { + filter2Element.classList.add("fn__none") + filterElement.classList.add("fn__none") + } else { + filterElement.classList.remove("fn__none") + filter2Element.classList.add("fn__none") + thisOptionElement.classList.add("fn__none") + } + return; + } + menuElement.querySelectorAll("input, .b3-chip").forEach((inputElement) => { const menuItemElement = hasClosestByClassName(inputElement, "b3-menu__item"); if (menuItemElement) { - if (["date", "updated", "created"].includes(type)) { - if (operator === "Is between") { - menuItemElement.classList.remove("fn__none"); - } else if (operator === "Is empty" || operator === "Is not empty") { - menuItemElement.classList.add("fn__none"); - } else { - if (index === 0) { - menuItemElement.classList.remove("fn__none"); - } else { - menuItemElement.classList.add("fn__none"); - } - } + if (operator !== "Is empty" && operator !== "Is not empty") { + menuItemElement.classList.remove("fn__none"); } else { - if (operator !== "Is empty" && operator !== "Is not empty") { - menuItemElement.classList.remove("fn__none"); - } else { - menuItemElement.classList.add("fn__none"); - } + menuItemElement.classList.add("fn__none"); } } }); @@ -67,24 +73,27 @@ export const setFilter = async (options: { const menu = new Menu("set-filter-" + options.filter.column, () => { const oldFilters = JSON.parse(JSON.stringify(options.data.view.filters)); const selectElement = window.siyuan.menus.menu.element.querySelector(".b3-select") as HTMLSelectElement; - const operator = selectElement.value as TAVFilterOperator; - if (!selectElement || !operator) { + const newFilter: IAVFilter = { + column: options.filter.column, + value: undefined, + operator: selectElement.value as TAVFilterOperator + }; + if (!selectElement || !newFilter.operator) { return; } let hasMatch = false; - let cellValue: IAVCellValue; if (textElements.length > 0) { if (["date", "updated", "created"].includes(filterType)) { - cellValue = genCellValue(filterType, { + newFilter.value = genCellValue(filterType, { isNotEmpty2: textElements[1].value !== "", isNotEmpty: textElements[0].value !== "", content: textElements[0].value ? new Date(textElements[0].value + " 00:00").getTime() : null, content2: textElements[1].value ? new Date(textElements[1].value + " 00:00").getTime() : null, - hasEndDate: operator === "Is between", + hasEndDate: newFilter.operator === "Is between", isNotTime: true, }); } else { - cellValue = genCellValue(filterType, textElements[0].value); + newFilter.value = genCellValue(filterType, textElements[0].value); } } else if (filterType === "select" || filterType === "mSelect") { const mSelect: { @@ -100,19 +109,15 @@ export const setFilter = async (options: { }); } }); - cellValue = genCellValue(filterType, mSelect); + newFilter.value = genCellValue(filterType, mSelect); } else if (filterType === "checkbox") { - cellValue = genCellValue(filterType, { - checked: operator === "Is true" + newFilter.value = genCellValue(filterType, { + checked: newFilter.operator === "Is true" }); } else { - cellValue = genCellValue(filterType, undefined); + newFilter.value = genCellValue(filterType, undefined); } - const newFilter: IAVFilter = { - column: options.filter.column, - value: cellValue, - operator - }; + let isSame = false; options.data.view.filters.find((filter, index) => { if (filter.column === options.filter.column) { @@ -323,12 +328,65 @@ export const setFilter = async (options: { menu.addItem({ iconHTML: "", type: "readonly", - label: `` - }); - menu.addItem({ - iconHTML: "", - type: "readonly", - label: `` + label: `
+
+ +
+
+
+ +
+
+ + + + + +
+
+
+
+
+
+ +
+
+
+ +
+
+ + + + + +
+
+
` }); } menu.addItem({ @@ -361,6 +419,33 @@ export const setFilter = async (options: { selectElement.addEventListener("change", () => { toggleEmpty(selectElement, selectElement.value, filterType); }); + window.siyuan.menus.menu.element.querySelectorAll('.b3-select[data-type="dataType"]').forEach((item: HTMLSelectElement) => { + item.addEventListener("change", () => { + const filterElement = item.parentElement.parentElement; + const customElement = filterElement.querySelector('[data-type="dataDirection"]').parentElement + const timeElement = customElement.previousElementSibling; + if (item.value === "custom") { + customElement.classList.remove("fn__none"); + timeElement.classList.add("fn__none"); + } else { + customElement.classList.add("fn__none"); + timeElement.classList.remove("fn__none"); + } + }); + }) + window.siyuan.menus.menu.element.querySelectorAll('.b3-select[data-type="dataDirection"]').forEach((item: HTMLSelectElement) => { + item.addEventListener("change", () => { + const countElement = item.nextElementSibling.nextElementSibling; + if (item.value === "0") { + countElement.classList.add("fn__none"); + countElement.nextElementSibling.classList.add("fn__none"); + } else { + countElement.classList.remove("fn__none"); + countElement.nextElementSibling.classList.remove("fn__none"); + } + }); + }) + const textElements: NodeListOf = window.siyuan.menus.menu.element.querySelectorAll(".b3-text-field"); textElements.forEach(item => { item.addEventListener("keydown", (event: KeyboardEvent) => { diff --git a/app/src/types/index.d.ts b/app/src/types/index.d.ts index 1b78eed88..5f5ef94d8 100644 --- a/app/src/types/index.d.ts +++ b/app/src/types/index.d.ts @@ -1080,6 +1080,14 @@ interface IAVFilter { operator: TAVFilterOperator, value: IAVCellValue, type?: TAVCol // 仅用于标识新增时的类型,用于区分 rollup + relativeDate?: relativeDate + relativeDate2?: relativeDate +} + +interface relativeDate { + count: number // 数量 + unit: number // 单位:0: 天、1: 周、2: 月、3: 年 + direction: number // 方向:-1: 前、0: 现在、1: 后 } interface IAVSort {