Daniel 2025-06-29 11:11:20 +08:00
parent 778929ddde
commit 00df78768b
No known key found for this signature in database
GPG key ID: 86211BA83DF03017
9 changed files with 153 additions and 229 deletions

View file

@ -178,37 +178,20 @@ type SelectOption struct {
// View 描述了视图的结构。
type View struct {
ID string `json:"id"` // 视图 ID
Icon string `json:"icon"` // 视图图标
Name string `json:"name"` // 视图名称
HideAttrViewName bool `json:"hideAttrViewName"` // 是否隐藏属性视图名称
Desc string `json:"desc"` // 视图描述
ID string `json:"id"` // 视图 ID
Icon string `json:"icon"` // 视图图标
Name string `json:"name"` // 视图名称
HideAttrViewName bool `json:"hideAttrViewName"` // 是否隐藏属性视图名称
Desc string `json:"desc"` // 视图描述
Filters []*ViewFilter `json:"filters"` // 过滤规则
Sorts []*ViewSort `json:"sorts"` // 排序规则
PageSize int `json:"pageSize"` // 每页条目数
LayoutType LayoutType `json:"type"` // 当前布局类型
Table *LayoutTable `json:"table,omitempty"` // 表格布局
Gallery *LayoutGallery `json:"gallery,omitempty"` // 画廊布局
}
func (view *View) GetFilters() (ret []*ViewFilter) {
switch view.LayoutType {
case LayoutTypeTable:
return view.Table.Filters
case LayoutTypeGallery:
return view.Gallery.Filters
}
return
}
func (view *View) GetSorts() (ret []*ViewSort) {
switch view.LayoutType {
case LayoutTypeTable:
return view.Table.Sorts
case LayoutTypeGallery:
return view.Gallery.Sorts
}
return
}
// LayoutType 描述了视图布局类型。
type LayoutType string
@ -218,8 +201,7 @@ const (
)
const (
TableViewDefaultPageSize = 50 // 表格视图默认分页大小
GalleryViewDefaultPageSize = 50 // 画廊视图默认分页大小
ViewDefaultPageSize = 50 // 视图默认分页大小
)
func NewTableView() (ret *View) {
@ -252,6 +234,9 @@ func NewGalleryView() (ret *View) {
ret = &View{
ID: ast.NewNodeID(),
Name: GetAttributeViewI18n("gallery"),
Filters: []*ViewFilter{},
Sorts: []*ViewSort{},
PageSize: ViewDefaultPageSize,
LayoutType: LayoutTypeGallery,
Gallery: NewLayoutGallery(),
}
@ -416,18 +401,15 @@ func SaveAttributeView(av *AttributeView) (err error) {
if nil != view.Table {
// 行去重
view.Table.RowIDs = gulu.Str.RemoveDuplicatedElem(view.Table.RowIDs)
// 分页大小
if 1 > view.Table.PageSize {
view.Table.PageSize = TableViewDefaultPageSize
}
}
if nil != view.Gallery {
// 行去重
view.Gallery.CardIDs = gulu.Str.RemoveDuplicatedElem(view.Gallery.CardIDs)
// 分页大小
if 1 > view.Gallery.PageSize {
view.Gallery.PageSize = GalleryViewDefaultPageSize
}
}
// 分页大小
if 1 > view.PageSize {
view.Table.PageSize = ViewDefaultPageSize
}
}
@ -595,31 +577,25 @@ func (av *AttributeView) Clone() (ret *AttributeView) {
for _, view := range ret.Views {
view.ID = ast.NewNodeID()
view.Table.ID = ast.NewNodeID()
for _, f := range view.Filters {
f.Column = keyIDMap[f.Column]
}
for _, s := range view.Sorts {
s.Column = keyIDMap[s.Column]
}
switch view.LayoutType {
case LayoutTypeTable:
for _, column := range view.Table.Columns {
column.ID = keyIDMap[column.ID]
}
view.Table.RowIDs = []string{}
for _, f := range view.Table.Filters {
f.Column = keyIDMap[f.Column]
}
for _, s := range view.Table.Sorts {
s.Column = keyIDMap[s.Column]
}
case LayoutTypeGallery:
for _, cardField := range view.Gallery.CardFields {
cardField.ID = keyIDMap[cardField.ID]
}
view.Gallery.CardIDs = []string{}
for _, f := range view.Gallery.Filters {
f.Column = keyIDMap[f.Column]
}
for _, s := range view.Gallery.Sorts {
s.Column = keyIDMap[s.Column]
}
}
}
ret.ViewID = ret.Views[0].ID

View file

@ -17,14 +17,69 @@
package av
import (
"time"
"github.com/88250/lute/ast"
"github.com/siyuan-note/logging"
"github.com/siyuan-note/siyuan/kernel/util"
"time"
)
func UpgradeSpec(av *AttributeView) {
upgradeSpec1(av)
upgradeSpec2(av)
}
func upgradeSpec2(av *AttributeView) {
if 2 <= av.Spec {
return
}
// 如果存在 view.table.filters/sorts/pageSize 则复制覆盖到 view.filters/sorts/pageSize 下后置空
for _, view := range av.Views {
if 1 > len(view.Filters) {
view.Filters = []*ViewFilter{}
}
if 1 > len(view.Sorts) {
view.Sorts = []*ViewSort{}
}
if 1 > view.PageSize {
view.PageSize = ViewDefaultPageSize
}
if nil != view.Table {
if 0 < len(view.Table.Filters) {
view.Filters = append(view.Filters, view.Table.Filters...)
view.Table.Filters = nil
}
if 0 < len(view.Table.Sorts) {
view.Sorts = append(view.Sorts, view.Table.Sorts...)
view.Table.Sorts = nil
}
if 0 < view.Table.PageSize {
view.PageSize = view.Table.PageSize
view.Table.PageSize = 0
}
}
// 清理过滤和排序规则中不存在的键
tmpFilters := []*ViewFilter{}
for _, f := range view.Filters {
if k, _ := av.GetKey(f.Column); nil != k {
tmpFilters = append(tmpFilters, f)
}
}
view.Filters = tmpFilters
tmpSorts := []*ViewSort{}
for _, s := range view.Sorts {
if k, _ := av.GetKey(s.Column); nil != k {
tmpSorts = append(tmpSorts, s)
}
}
view.Sorts = tmpSorts
}
av.Spec = 2
}
func upgradeSpec1(av *AttributeView) {

View file

@ -20,11 +20,13 @@ import "sort"
// BaseLayout 描述了布局的基础结构。
type BaseLayout struct {
Spec int `json:"spec"` // 布局格式版本
ID string `json:"id"` // 布局 ID
Filters []*ViewFilter `json:"filters"` // 过滤规则
Sorts []*ViewSort `json:"sorts"` // 排序规则
PageSize int `json:"pageSize"` // 每页条目数
Spec int `json:"spec"` // 布局格式版本
ID string `json:"id"` // 布局 ID
// 以下三个字段已经废弃,计划于 2026 年 6 月 30 日后删除 https://github.com/siyuan-note/siyuan/issues/15162
Filters []*ViewFilter `json:"filters,omitempty"` // 过滤规则
Sorts []*ViewSort `json:"sorts,omitempty"` // 排序规则
PageSize int `json:"pageSize,omitempty"` // 每页条目数
}
// BaseValue 描述了字段值的基础结构。

View file

@ -43,11 +43,8 @@ func (layoutGallery *LayoutGallery) GetItemIDs() (ret []string) {
func NewLayoutGallery() *LayoutGallery {
return &LayoutGallery{
BaseLayout: &BaseLayout{
Spec: 0,
ID: ast.NewNodeID(),
Filters: []*ViewFilter{},
Sorts: []*ViewSort{},
PageSize: GalleryViewDefaultPageSize,
Spec: 0,
ID: ast.NewNodeID(),
},
CoverFrom: CoverFromContentImage,
CardAspectRatio: CardAspectRatio16_9,

View file

@ -35,11 +35,8 @@ func (layoutTable *LayoutTable) GetItemIDs() (ret []string) {
func NewLayoutTable() *LayoutTable {
return &LayoutTable{
BaseLayout: &BaseLayout{
Spec: 0,
ID: ast.NewNodeID(),
Filters: []*ViewFilter{},
Sorts: []*ViewSort{},
PageSize: TableViewDefaultPageSize,
Spec: 0,
ID: ast.NewNodeID(),
},
}
}