From 9d7e0625aedca9f2d148a1b471db797da936f569 Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Thu, 21 Aug 2025 23:08:42 +0800 Subject: [PATCH 1/9] :art: Improve av https://github.com/siyuan-note/siyuan/issues/15593 --- kernel/av/filter.go | 65 +++++++++++++++++++++++++++------------------ 1 file changed, 39 insertions(+), 26 deletions(-) diff --git a/kernel/av/filter.go b/kernel/av/filter.go index e83a72db3..1dcb92030 100644 --- a/kernel/av/filter.go +++ b/kernel/av/filter.go @@ -559,7 +559,7 @@ func filterTextContent(operator FilterOperator, valueContent, otherValueContent func filterRelativeTime(valueMills int64, valueIsNotEmpty bool, operator FilterOperator, otherValueStart, otherValueEnd time.Time, direction RelativeDateDirection, otherValueStart2, otherValueEnd2 time.Time, direction2 RelativeDateDirection) bool { valueTime := time.UnixMilli(valueMills) - if otherValueStart.After(otherValueStart2) { + if otherValueStart.After(otherValueStart2) && FilterOperatorIsBetween == operator { tmpStart, tmpEnd := otherValueStart2, otherValueEnd2 otherValueStart2, otherValueEnd2 = otherValueStart, otherValueEnd otherValueStart, otherValueEnd = tmpStart, tmpEnd @@ -657,7 +657,7 @@ func filterRelativeTime(valueMills int64, valueIsNotEmpty bool, operator FilterO func filterTime(valueMills int64, valueIsNotEmpty bool, otherValueMills, otherValueMills2 int64, operator FilterOperator) bool { valueTime := time.UnixMilli(valueMills) - if 0 != otherValueMills2 && otherValueMills > otherValueMills2 { + if 0 != otherValueMills2 && otherValueMills > otherValueMills2 && FilterOperatorIsBetween == operator { tmp := otherValueMills2 otherValueMills2 = otherValueMills otherValueMills = tmp @@ -787,16 +787,11 @@ func (filter *ViewFilter) GetAffectValue(key *Key, addingBlockID string) (ret *V } if nil == filter.Value { - if nil != filter.RelativeDate { - // 相对日期今天的动态日期不设置默认值 - return nil - } - // 两个值都空的情况下也不设置默认值 return nil } if FilterOperatorIsEmpty != filter.Operator && FilterOperatorIsNotEmpty != filter.Operator { - if filter.Value.IsEmpty() { + if filter.Value.IsEmpty() && nil == filter.RelativeDate { // 在不是过滤空值和非空值的情况下,空值不设置默认值 https://github.com/siyuan-note/siyuan/issues/11297 return nil } @@ -868,33 +863,51 @@ func (filter *ViewFilter) GetAffectValue(key *Key, addingBlockID string) (ret *V ret.Number = &ValueNumber{Content: 0, IsNotEmpty: true} } case KeyTypeDate: + start := time.Now() + end := start + start2 := start + end2 := end + + if nil != filter.Value.Date { + start = time.UnixMilli(filter.Value.Date.Content) + end = time.UnixMilli(filter.Value.Date.Content2) + } + + if nil != filter.RelativeDate { + start, end = calcRelativeTimeRegion(filter.RelativeDate.Count, filter.RelativeDate.Unit, filter.RelativeDate.Direction) + if FilterOperatorIsBetween == filter.Operator { + start2, end2 = calcRelativeTimeRegion(filter.RelativeDate2.Count, filter.RelativeDate2.Unit, filter.RelativeDate2.Direction) + } + } + if start.After(start2) { + tmp := start2 + start2 = start + start = tmp + } + if end.Before(end2) { + tmp := end2 + end2 = end + end = tmp + } + switch filter.Operator { case FilterOperatorIsEqual: - ret.Date = &ValueDate{Content: filter.Value.Date.Content, IsNotEmpty: true} - case FilterOperatorIsNotEqual: - ret.Date = &ValueDate{Content: util.CurrentTimeMillis(), IsNotEmpty: true} + ret.Date = &ValueDate{Content: end.UnixMilli(), IsNotEmpty: true} case FilterOperatorIsGreater: - ret.Date = &ValueDate{Content: filter.Value.Date.Content + 1000*60*60*24, IsNotEmpty: true} + ret.Date = &ValueDate{Content: end.UnixMilli(), IsNotEmpty: true} case FilterOperatorIsGreaterOrEqual: - ret.Date = &ValueDate{Content: filter.Value.Date.Content, IsNotEmpty: true} + ret.Date = &ValueDate{Content: end.UnixMilli(), IsNotEmpty: true} case FilterOperatorIsLess: - ret.Date = &ValueDate{Content: filter.Value.Date.Content - 1000*60*60*24, IsNotEmpty: true} + ret.Date = &ValueDate{Content: start.UnixMilli(), IsNotEmpty: true} case FilterOperatorIsLessOrEqual: - ret.Date = &ValueDate{Content: filter.Value.Date.Content, IsNotEmpty: true} + ret.Date = &ValueDate{Content: start.UnixMilli(), IsNotEmpty: true} case FilterOperatorIsBetween: - start := filter.Value.Date.Content - end := filter.Value.Date.Content2 - if start > end { - tmp := end - end = start - start = tmp - } - now := util.CurrentTimeMillis() - if start <= now && now <= end { - ret.Date = &ValueDate{Content: now, IsNotEmpty: true} + now := time.Now() + if start.Before(now) && now.Before(end) { + ret.Date = &ValueDate{Content: now.UnixMilli(), IsNotEmpty: true} return } - ret.Date = &ValueDate{Content: start, IsNotEmpty: true} + ret.Date = &ValueDate{Content: start.UnixMilli(), IsNotEmpty: true} case FilterOperatorIsEmpty: ret.Date = &ValueDate{Content: 0, IsNotEmpty: false} case FilterOperatorIsNotEmpty: From f74283f2a334f4ff8a94e9817a6921fa95a9f3b1 Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Thu, 21 Aug 2025 23:26:55 +0800 Subject: [PATCH 2/9] :art: Improve av https://github.com/siyuan-note/siyuan/issues/15593 --- kernel/av/filter.go | 50 ++++++++++++++++++++++++--------------------- 1 file changed, 27 insertions(+), 23 deletions(-) diff --git a/kernel/av/filter.go b/kernel/av/filter.go index 1dcb92030..6670d5780 100644 --- a/kernel/av/filter.go +++ b/kernel/av/filter.go @@ -865,43 +865,47 @@ func (filter *ViewFilter) GetAffectValue(key *Key, addingBlockID string) (ret *V case KeyTypeDate: start := time.Now() end := start - start2 := start - end2 := end - if nil != filter.Value.Date { start = time.UnixMilli(filter.Value.Date.Content) end = time.UnixMilli(filter.Value.Date.Content2) } - if nil != filter.RelativeDate { start, end = calcRelativeTimeRegion(filter.RelativeDate.Count, filter.RelativeDate.Unit, filter.RelativeDate.Direction) - if FilterOperatorIsBetween == filter.Operator { - start2, end2 = calcRelativeTimeRegion(filter.RelativeDate2.Count, filter.RelativeDate2.Unit, filter.RelativeDate2.Direction) - } - } - if start.After(start2) { - tmp := start2 - start2 = start - start = tmp - } - if end.Before(end2) { - tmp := end2 - end2 = end - end = tmp } switch filter.Operator { case FilterOperatorIsEqual: - ret.Date = &ValueDate{Content: end.UnixMilli(), IsNotEmpty: true} - case FilterOperatorIsGreater: - ret.Date = &ValueDate{Content: end.UnixMilli(), IsNotEmpty: true} - case FilterOperatorIsGreaterOrEqual: - ret.Date = &ValueDate{Content: end.UnixMilli(), IsNotEmpty: true} - case FilterOperatorIsLess: ret.Date = &ValueDate{Content: start.UnixMilli(), IsNotEmpty: true} + case FilterOperatorIsGreater: + ret.Date = &ValueDate{Content: end.Add(24 * time.Hour).UnixMilli(), IsNotEmpty: true} + case FilterOperatorIsGreaterOrEqual: + ret.Date = &ValueDate{Content: start.UnixMilli(), IsNotEmpty: true} + case FilterOperatorIsLess: + ret.Date = &ValueDate{Content: start.Add(-24 * time.Hour).UnixMilli(), IsNotEmpty: true} case FilterOperatorIsLessOrEqual: ret.Date = &ValueDate{Content: start.UnixMilli(), IsNotEmpty: true} case FilterOperatorIsBetween: + start2, end2 := start, end + if nil != filter.RelativeDate2 { + start2, end2 = calcRelativeTimeRegion(filter.RelativeDate2.Count, filter.RelativeDate2.Unit, filter.RelativeDate2.Direction) + if start.After(start2) { + tmp := start + start = start2 + start2 = tmp + } + if end.After(end2) { + tmp := end + end = end2 + end2 = tmp + } + } else { + if start.After(end) { + tmp := start + start = end + end = tmp + } + } + now := time.Now() if start.Before(now) && now.Before(end) { ret.Date = &ValueDate{Content: now.UnixMilli(), IsNotEmpty: true} From f8bccc2d9f68ed7532c3effea856ed4fe9b91285 Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Thu, 21 Aug 2025 23:30:52 +0800 Subject: [PATCH 3/9] :art: Improve av https://github.com/siyuan-note/siyuan/issues/15593 --- kernel/av/filter.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kernel/av/filter.go b/kernel/av/filter.go index 6670d5780..df21ebc4c 100644 --- a/kernel/av/filter.go +++ b/kernel/av/filter.go @@ -893,7 +893,7 @@ func (filter *ViewFilter) GetAffectValue(key *Key, addingBlockID string) (ret *V start = start2 start2 = tmp } - if end.After(end2) { + if end.Before(end2) { tmp := end end = end2 end2 = tmp From 83af400f65d91ab30183197bc97d1210d38a3572 Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Fri, 22 Aug 2025 00:00:38 +0800 Subject: [PATCH 4/9] :art: Improve av https://github.com/siyuan-note/siyuan/issues/15643 --- kernel/model/attribute_view.go | 9 +++++++-- kernel/model/attribute_view_render.go | 6 ++++-- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/kernel/model/attribute_view.go b/kernel/model/attribute_view.go index 1bc60928b..2c622997a 100644 --- a/kernel/model/attribute_view.go +++ b/kernel/model/attribute_view.go @@ -538,14 +538,19 @@ func SetAttributeViewGroup(avID, blockID string, group *av.ViewGroup) (err error if view.Group.HideEmpty != oldHideEmpty { if !oldHideEmpty && view.Group.HideEmpty { // 启用隐藏空分组 for _, g := range view.Groups { - if g.GroupHidden == 0 && 1 > len(g.GroupItemIDs) { + groupViewable := sql.RenderGroupView(attrView, view, g, "") + // 必须经过渲染才能得到最终的条目数 + renderViewableInstance(groupViewable, view, attrView, 1, -1) + if g.GroupHidden == 0 && 1 > groupViewable.(av.Collection).CountItems() { g.GroupHidden = 1 } } } if oldHideEmpty && !view.Group.HideEmpty { // 禁用隐藏空分组 for _, g := range view.Groups { - if g.GroupHidden == 1 && 1 > len(g.GroupItemIDs) { + groupViewable := sql.RenderGroupView(attrView, view, g, "") + renderViewableInstance(groupViewable, view, attrView, 1, -1) + if g.GroupHidden == 1 && 1 > groupViewable.(av.Collection).CountItems() { g.GroupHidden = 0 } } diff --git a/kernel/model/attribute_view_render.go b/kernel/model/attribute_view_render.go index 4ae004887..51c19dd58 100644 --- a/kernel/model/attribute_view_render.go +++ b/kernel/model/attribute_view_render.go @@ -184,14 +184,16 @@ func hideEmptyGroupViews(view *av.View, viewable av.Viewable) { return } + groupHidden := viewable.GetGroupHidden() if !view.Group.HideEmpty { - if 2 != viewable.GetGroupHidden() { + if 2 != groupHidden { viewable.SetGroupHidden(0) } return } - if 1 == viewable.GetGroupHidden() && 0 < viewable.(av.Collection).CountItems() { + itemCount := viewable.(av.Collection).CountItems() + if 1 == groupHidden && 0 < itemCount { viewable.SetGroupHidden(0) } } From b6b5b20daa25207a7e986aee074865cff4563f54 Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Fri, 22 Aug 2025 00:07:54 +0800 Subject: [PATCH 5/9] :art: Improve av https://github.com/siyuan-note/siyuan/issues/15650 --- kernel/model/attribute_view.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/kernel/model/attribute_view.go b/kernel/model/attribute_view.go index 2c622997a..aeafdd52d 100644 --- a/kernel/model/attribute_view.go +++ b/kernel/model/attribute_view.go @@ -1846,7 +1846,7 @@ func genAttrViewGroups(view *av.View, attrView *av.AttributeView) { } } - if 1 > len(groupItemsMap[groupValueDefault]) { + if 1 > len(groupItemsMap[groupValueDefault]) && av.KeyTypeCheckbox != groupKey.Type { // 始终保留默认分组 https://github.com/siyuan-note/siyuan/issues/15587 groupItemsMap[groupValueDefault] = []av.Item{} } From e3df9ab3163523cea897ae5099910f605c5b117a Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Fri, 22 Aug 2025 00:16:28 +0800 Subject: [PATCH 6/9] :art: Improve av https://github.com/siyuan-note/siyuan/issues/15649 --- kernel/model/attribute_view.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/kernel/model/attribute_view.go b/kernel/model/attribute_view.go index aeafdd52d..1cc29e8b3 100644 --- a/kernel/model/attribute_view.go +++ b/kernel/model/attribute_view.go @@ -1890,6 +1890,13 @@ func genAttrViewGroups(view *av.View, attrView *av.AttributeView) { v.GroupVal.Relation.Contents = []*av.Value{destBlock} } } + } else if av.KeyTypeCheckbox == groupKey.Type { + v.GroupVal.Text = nil + v.GroupVal.Type = av.KeyTypeCheckbox + v.GroupVal.Checkbox = &av.ValueCheckbox{} + if "" != groupValue { + v.GroupVal.Checkbox.Checked = true + } } v.GroupSort = -1 view.Groups = append(view.Groups, v) From c2ac34942b8e28dcb7fae03a37f2e1c8c8538e17 Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Fri, 22 Aug 2025 00:28:37 +0800 Subject: [PATCH 7/9] :art: Improve av https://github.com/siyuan-note/siyuan/issues/15650 --- kernel/model/attribute_view.go | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/kernel/model/attribute_view.go b/kernel/model/attribute_view.go index 1cc29e8b3..f0b95ca24 100644 --- a/kernel/model/attribute_view.go +++ b/kernel/model/attribute_view.go @@ -1846,9 +1846,19 @@ func genAttrViewGroups(view *av.View, attrView *av.AttributeView) { } } - if 1 > len(groupItemsMap[groupValueDefault]) && av.KeyTypeCheckbox != groupKey.Type { - // 始终保留默认分组 https://github.com/siyuan-note/siyuan/issues/15587 - groupItemsMap[groupValueDefault] = []av.Item{} + if av.KeyTypeCheckbox != groupKey.Type { + if 1 > len(groupItemsMap[groupValueDefault]) { + // 始终保留默认分组 https://github.com/siyuan-note/siyuan/issues/15587 + groupItemsMap[groupValueDefault] = []av.Item{} + } + } else { + // 对于复选框分组,空白分组表示未选中状态,始终保留 https://github.com/siyuan-note/siyuan/issues/15650 + if nil == groupItemsMap[""] { + groupItemsMap[""] = []av.Item{} + } + if nil == groupItemsMap["√"] { + groupItemsMap["√"] = []av.Item{} + } } for groupValue, groupItems := range groupItemsMap { From 4f073c85cdfa6344e5385e728d75bd7ce4f75a73 Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Fri, 22 Aug 2025 00:34:41 +0800 Subject: [PATCH 8/9] :art: Improve av https://github.com/siyuan-note/siyuan/issues/15650 --- kernel/model/attribute_view.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/kernel/model/attribute_view.go b/kernel/model/attribute_view.go index f0b95ca24..2f6af27a0 100644 --- a/kernel/model/attribute_view.go +++ b/kernel/model/attribute_view.go @@ -562,9 +562,10 @@ func SetAttributeViewGroup(avID, blockID string, group *av.ViewGroup) (err error // 首次设置分组时,如果分组字段是单选或多选类型,则将分组方式改为按选项排序 https://github.com/siyuan-note/siyuan/issues/15534 view.Group.Order = av.GroupOrderSelectOption sortGroupsBySelectOption(view, groupKey) - for i, g := range view.Groups { - g.GroupSort = i - } + } + + for i, g := range view.Groups { + g.GroupSort = i } } From 5077ed3b567808c79f41b8a674beff5cec9430ce Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Fri, 22 Aug 2025 00:48:15 +0800 Subject: [PATCH 9/9] :art: Improve av https://github.com/siyuan-note/siyuan/issues/15650 --- kernel/model/attribute_view.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/kernel/model/attribute_view.go b/kernel/model/attribute_view.go index 2f6af27a0..9539cde9d 100644 --- a/kernel/model/attribute_view.go +++ b/kernel/model/attribute_view.go @@ -242,9 +242,9 @@ func getAttrViewAddingBlockDefaultValues(attrView *av.AttributeView, view, group newValue.Email.Content = content case av.KeyTypePhone: newValue.Phone.Content = content - case av.KeyTypeCheckbox: - newValue.Checkbox.Checked = "" != content } + } else if av.KeyTypeCheckbox == groupView.GroupVal.Type { + newValue.Checkbox.Checked = groupView.GroupVal.Checkbox.Checked } ret[groupKey.ID] = newValue