From 8d71b64ca960d0d415ccb0aae42e8bd9c2529b50 Mon Sep 17 00:00:00 2001 From: Vanessa Date: Sat, 2 Mar 2024 00:18:08 +0800 Subject: [PATCH] :art: https://github.com/siyuan-note/siyuan/issues/10451 --- app/src/protyle/render/av/filter.ts | 97 +++++++++++++++++++---------- kernel/av/filter.go | 6 +- 2 files changed, 66 insertions(+), 37 deletions(-) diff --git a/app/src/protyle/render/av/filter.ts b/app/src/protyle/render/av/filter.ts index 4e2154449..ec14096bb 100644 --- a/app/src/protyle/render/av/filter.ts +++ b/app/src/protyle/render/av/filter.ts @@ -84,7 +84,7 @@ export const setFilter = async (options: { let hasMatch = false; if (textElements.length > 0) { if (["date", "updated", "created"].includes(filterType)) { - const typeElements = menu.element.querySelectorAll('.b3-select[data-type="dataType"]') as NodeListOf; + const typeElements = menu.element.querySelectorAll('.b3-select[data-type="dateType"]') as NodeListOf; const directElements = menu.element.querySelectorAll('.b3-select[data-type="dataDirection"]') as NodeListOf; if (typeElements[0].value === "custom") { newFilter.relativeDate = { @@ -92,7 +92,8 @@ export const setFilter = async (options: { unit: parseInt((directElements[0].parentElement.lastElementChild as HTMLSelectElement).value), direction: parseInt(directElements[0].value) } - } else if (typeElements[1].value === "custom") { + } + if (typeElements[1].value === "custom") { newFilter.relativeDate2 = { count: parseInt((directElements[1].parentElement.querySelector(".b3-text-field") as HTMLInputElement).value || "1"), unit: parseInt((directElements[1].parentElement.lastElementChild as HTMLSelectElement).value), @@ -341,29 +342,31 @@ export const setFilter = async (options: { }); } else if (["date", "updated", "created"].includes(filterType)) { const dateValue = options.filter.value ? options.filter.value[filterType as "date"] : null; + const showToday = !options.filter.relativeDate?.direction && options.filter.operator === "Is between" + const showToday2 = !options.filter.relativeDate2?.direction && options.filter.operator === "Is between" menu.addItem({ iconHTML: "", type: "readonly", label: `
-
- +
- - + + +
- +
- - + +
@@ -431,25 +434,36 @@ export const setFilter = async (options: { } } }); - const selectElement = (window.siyuan.menus.menu.element.querySelector(".b3-select") as HTMLSelectElement); + const selectElement = (menu.element.querySelector(".b3-select") as HTMLSelectElement); selectElement.addEventListener("change", () => { toggleEmpty(selectElement, selectElement.value, filterType); }); - window.siyuan.menus.menu.element.querySelectorAll('.b3-select[data-type="dataType"]').forEach((item: HTMLSelectElement) => { + const dateTypeElements = menu.element.querySelectorAll('.b3-select[data-type="dateType"]') as NodeListOf; + dateTypeElements.forEach((item) => { item.addEventListener("change", () => { - const filterElement = item.parentElement.parentElement; - const customElement = filterElement.querySelector('[data-type="dataDirection"]').parentElement - const timeElement = customElement.previousElementSibling; + const directionElements = menu.element.querySelectorAll('[data-type="dataDirection"]') + const customerElement = directionElements[0].parentElement; + const customer2Element = directionElements[1].parentElement; + const timeElement = customerElement.previousElementSibling; + const time2Element = customer2Element.previousElementSibling; if (item.value === "custom") { - customElement.classList.remove("fn__none"); + customerElement.classList.remove("fn__none"); + customer2Element.classList.remove("fn__none"); timeElement.classList.add("fn__none"); + time2Element.classList.add("fn__none"); + dateTypeElements[0].value = "custom"; + dateTypeElements[1].value = "custom"; } else { - customElement.classList.add("fn__none"); + customerElement.classList.add("fn__none"); + customer2Element.classList.add("fn__none"); timeElement.classList.remove("fn__none"); + time2Element.classList.remove("fn__none"); + dateTypeElements[0].value = "time"; + dateTypeElements[1].value = "time"; } }); }) - window.siyuan.menus.menu.element.querySelectorAll('.b3-select[data-type="dataDirection"]').forEach((item: HTMLSelectElement) => { + menu.element.querySelectorAll('.b3-select[data-type="dataDirection"]').forEach((item: HTMLSelectElement) => { item.addEventListener("change", () => { const countElement = item.nextElementSibling.nextElementSibling; if (item.value === "0") { @@ -462,7 +476,7 @@ export const setFilter = async (options: { }); }) - const textElements: NodeListOf = window.siyuan.menus.menu.element.querySelectorAll(".b3-text-field"); + const textElements: NodeListOf = menu.element.querySelectorAll(".b3-text-field"); textElements.forEach(item => { item.addEventListener("keydown", (event: KeyboardEvent) => { if (event.isComposing) { @@ -552,17 +566,32 @@ export const getFiltersHTML = (data: IAVTable) => { filterValue = ": " + window.siyuan.languages.unchecked; } else if (filter.operator === "Is true") { filterValue = ": " + window.siyuan.languages.checked; - } else if (filter.value?.date?.content) { - if (filter.value?.date?.content2 && filter.operator === "Is between") { - filterValue = ` ${window.siyuan.languages.filterOperatorIsBetween} ${dayjs(filter.value.date.content).format("YYYY-MM-DD")} ${dayjs(filter.value.date.content2).format("YYYY-MM-DD")}`; + } else if (filter.value?.date?.content || filter.relativeDate || filter.relativeDate2) { + let dateValue = ""; + let dateValue2 = ""; + if (filter.relativeDate) { + dateValue = `${window.siyuan.languages[["pastDate", "current", "nextDate"][filter.relativeDate.direction + 1]]} + ${filter.relativeDate.direction ? filter.relativeDate.count : ""} + ${window.siyuan.languages[["day", "week", "month", "year"][filter.relativeDate.unit]]}`; + } + if (filter.relativeDate2) { + dateValue2 = `${window.siyuan.languages[["pastDate", "current", "nextDate"][filter.relativeDate2.direction + 1]]} + ${filter.relativeDate2.direction ? filter.relativeDate2.count : ""} + ${window.siyuan.languages[["day", "week", "month", "year"][filter.relativeDate2.unit]]}` + } else { + dateValue = dayjs(filter.value.date.content).format("YYYY-MM-DD"); + dateValue2 = dayjs(filter.value.date.content2).format("YYYY-MM-DD"); + } + if (filter.operator === "Is between") { + filterValue = ` ${window.siyuan.languages.filterOperatorIsBetween} ${dateValue} ${dateValue2}`; } else if ("=" === filter.operator) { - filterValue = `: ${dayjs(filter.value.date.content).format("YYYY-MM-DD")}`; + filterValue = `: ${dateValue}`; } else if ([">", "<"].includes(filter.operator)) { - filterValue = ` ${filter.operator} ${dayjs(filter.value.date.content).format("YYYY-MM-DD")}`; + filterValue = ` ${filter.operator} ${dateValue}`; } else if (">=" === filter.operator) { - filterValue = ` ≥ ${dayjs(filter.value.date.content).format("YYYY-MM-DD")}`; + filterValue = ` ≥ ${dateValue}`; } else if ("<=" === filter.operator) { - filterValue = ` ≤ ${dayjs(filter.value.date.content).format("YYYY-MM-DD")}`; + filterValue = ` ≤ ${dateValue}`; } } else if (filter.value?.mSelect?.length > 0) { let selectContent = ""; diff --git a/kernel/av/filter.go b/kernel/av/filter.go index adac2ddab..c6267c66c 100644 --- a/kernel/av/filter.go +++ b/kernel/av/filter.go @@ -51,9 +51,9 @@ const ( ) type RelativeDate struct { - Count int // 数量 - Unit RelativeDateUnit // 单位:0 天、1 周、2 月、3 年 - Direction RelativeDateDirection // 方向:-1 前、0 这、1 后 + Count int `json:"count"` // 数量 + Unit RelativeDateUnit `json:"unit"` // 单位:0 天、1 周、2 月、3 年 + Direction RelativeDateDirection `json:"direction"` // 方向:-1 前、0 这、1 后 } type FilterOperator string