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

@ -600,14 +600,6 @@ func renderAttrView(avID, viewID, query string, page, pageSize int) (ret *gulu.R
var views []map[string]interface{} var views []map[string]interface{}
for _, v := range attrView.Views { for _, v := range attrView.Views {
pSize := 10
switch v.LayoutType {
case av.LayoutTypeTable:
pSize = v.Table.PageSize
case av.LayoutTypeGallery:
pSize = v.Gallery.PageSize
}
view := map[string]interface{}{ view := map[string]interface{}{
"id": v.ID, "id": v.ID,
"icon": v.Icon, "icon": v.Icon,
@ -615,7 +607,7 @@ func renderAttrView(avID, viewID, query string, page, pageSize int) (ret *gulu.R
"desc": v.Desc, "desc": v.Desc,
"hideAttrViewName": v.HideAttrViewName, "hideAttrViewName": v.HideAttrViewName,
"type": v.LayoutType, "type": v.LayoutType,
"pageSize": pSize, "pageSize": v.PageSize,
} }
views = append(views, view) views = append(views, view)

View file

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

View file

@ -17,14 +17,69 @@
package av package av
import ( import (
"time"
"github.com/88250/lute/ast" "github.com/88250/lute/ast"
"github.com/siyuan-note/logging" "github.com/siyuan-note/logging"
"github.com/siyuan-note/siyuan/kernel/util" "github.com/siyuan-note/siyuan/kernel/util"
"time"
) )
func UpgradeSpec(av *AttributeView) { func UpgradeSpec(av *AttributeView) {
upgradeSpec1(av) 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) { func upgradeSpec1(av *AttributeView) {

View file

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

View file

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

View file

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

View file

@ -592,16 +592,8 @@ func GetAttributeViewFilterSort(avID, blockID string) (filters []*av.ViewFilter,
} }
} }
filters = []*av.ViewFilter{} filters = view.Filters
sorts = []*av.ViewSort{} sorts = view.Sorts
switch view.LayoutType {
case av.LayoutTypeTable:
filters = view.Table.Filters
sorts = view.Table.Sorts
case av.LayoutTypeGallery:
filters = view.Gallery.Filters
sorts = view.Gallery.Sorts
}
return return
} }
@ -1227,42 +1219,22 @@ func renderAttributeView(attrView *av.AttributeView, viewID, query string, page,
checkViewInstance(attrView) checkViewInstance(attrView)
upgradeAttributeViewSpec(attrView) upgradeAttributeViewSpec(attrView)
switch view.LayoutType { // 字段删除以后需要删除设置的过滤和排序
case av.LayoutTypeTable: tmpFilters := []*av.ViewFilter{}
// 列删除以后需要删除设置的过滤和排序 for _, f := range view.Filters {
tmpFilters := []*av.ViewFilter{} if k, _ := attrView.GetKey(f.Column); nil != k {
for _, f := range view.Table.Filters { tmpFilters = append(tmpFilters, f)
if k, _ := attrView.GetKey(f.Column); nil != k {
tmpFilters = append(tmpFilters, f)
}
} }
view.Table.Filters = tmpFilters
tmpSorts := []*av.ViewSort{}
for _, s := range view.Table.Sorts {
if k, _ := attrView.GetKey(s.Column); nil != k {
tmpSorts = append(tmpSorts, s)
}
}
view.Table.Sorts = tmpSorts
case av.LayoutTypeGallery:
// 字段删除以后需要删除设置的过滤和排序
tmpFilters := []*av.ViewFilter{}
for _, f := range view.Gallery.Filters {
if k, _ := attrView.GetKey(f.Column); nil != k {
tmpFilters = append(tmpFilters, f)
}
}
view.Gallery.Filters = tmpFilters
tmpSorts := []*av.ViewSort{}
for _, s := range view.Gallery.Sorts {
if k, _ := attrView.GetKey(s.Column); nil != k {
tmpSorts = append(tmpSorts, s)
}
}
view.Gallery.Sorts = tmpSorts
} }
view.Filters = tmpFilters
tmpSorts := []*av.ViewSort{}
for _, s := range view.Sorts {
if k, _ := attrView.GetKey(s.Column); nil != k {
tmpSorts = append(tmpSorts, s)
}
}
view.Sorts = tmpSorts
viewable = sql.RenderView(view, attrView, query) viewable = sql.RenderView(view, attrView, query)
if nil == viewable { if nil == viewable {
@ -1280,10 +1252,7 @@ func renderAttributeView(attrView *av.AttributeView, viewID, query string, page,
case av.LayoutTypeTable: case av.LayoutTypeTable:
table := viewable.(*av.Table) table := viewable.(*av.Table)
table.RowCount = len(table.Rows) table.RowCount = len(table.Rows)
if 1 > view.Table.PageSize { table.PageSize = view.PageSize
view.Table.PageSize = av.TableViewDefaultPageSize
}
table.PageSize = view.Table.PageSize
if 1 > pageSize { if 1 > pageSize {
pageSize = table.PageSize pageSize = table.PageSize
} }
@ -1296,10 +1265,7 @@ func renderAttributeView(attrView *av.AttributeView, viewID, query string, page,
case av.LayoutTypeGallery: case av.LayoutTypeGallery:
gallery := viewable.(*av.Gallery) gallery := viewable.(*av.Gallery)
gallery.CardCount = len(gallery.Cards) gallery.CardCount = len(gallery.Cards)
if 1 > view.Gallery.PageSize { gallery.PageSize = view.PageSize
view.Gallery.PageSize = av.GalleryViewDefaultPageSize
}
gallery.PageSize = view.Gallery.PageSize
if 1 > pageSize { if 1 > pageSize {
pageSize = gallery.PageSize pageSize = gallery.PageSize
} }
@ -1893,6 +1859,25 @@ func (tx *Transaction) doDuplicateAttrViewView(operation *Operation) (ret *TxErr
view.Desc = masterView.Desc view.Desc = masterView.Desc
view.LayoutType = masterView.LayoutType view.LayoutType = masterView.LayoutType
for _, filter := range masterView.Filters {
view.Filters = append(view.Filters, &av.ViewFilter{
Column: filter.Column,
Operator: filter.Operator,
Value: filter.Value,
RelativeDate: filter.RelativeDate,
RelativeDate2: filter.RelativeDate2,
})
}
for _, s := range masterView.Sorts {
view.Sorts = append(view.Sorts, &av.ViewSort{
Column: s.Column,
Order: s.Order,
})
}
view.PageSize = masterView.PageSize
switch masterView.LayoutType { switch masterView.LayoutType {
case av.LayoutTypeTable: case av.LayoutTypeTable:
for _, col := range masterView.Table.Columns { for _, col := range masterView.Table.Columns {
@ -1907,24 +1892,6 @@ func (tx *Transaction) doDuplicateAttrViewView(operation *Operation) (ret *TxErr
}) })
} }
for _, filter := range masterView.Table.Filters {
view.Table.Filters = append(view.Table.Filters, &av.ViewFilter{
Column: filter.Column,
Operator: filter.Operator,
Value: filter.Value,
RelativeDate: filter.RelativeDate,
RelativeDate2: filter.RelativeDate2,
})
}
for _, s := range masterView.Table.Sorts {
view.Table.Sorts = append(view.Table.Sorts, &av.ViewSort{
Column: s.Column,
Order: s.Order,
})
}
view.Table.PageSize = masterView.Table.PageSize
view.Table.RowIDs = masterView.Table.RowIDs view.Table.RowIDs = masterView.Table.RowIDs
case av.LayoutTypeGallery: case av.LayoutTypeGallery:
for _, field := range masterView.Gallery.CardFields { for _, field := range masterView.Gallery.CardFields {
@ -1935,26 +1902,7 @@ func (tx *Transaction) doDuplicateAttrViewView(operation *Operation) (ret *TxErr
}) })
} }
for _, filter := range masterView.Gallery.Filters {
view.Gallery.Filters = append(view.Gallery.Filters, &av.ViewFilter{
Column: filter.Column,
Operator: filter.Operator,
Value: filter.Value,
RelativeDate: filter.RelativeDate,
RelativeDate2: filter.RelativeDate2,
})
}
for _, s := range masterView.Gallery.Sorts {
view.Gallery.Sorts = append(view.Gallery.Sorts, &av.ViewSort{
Column: s.Column,
Order: s.Order,
})
}
view.Gallery.PageSize = masterView.Gallery.PageSize
view.Gallery.CardIDs = masterView.Gallery.CardIDs view.Gallery.CardIDs = masterView.Gallery.CardIDs
view.Gallery.CoverFrom = masterView.Gallery.CoverFrom view.Gallery.CoverFrom = masterView.Gallery.CoverFrom
view.Gallery.CoverFromAssetKeyID = masterView.Gallery.CoverFromAssetKeyID view.Gallery.CoverFromAssetKeyID = masterView.Gallery.CoverFromAssetKeyID
view.Gallery.CardSize = masterView.Gallery.CardSize view.Gallery.CardSize = masterView.Gallery.CardSize
@ -2256,15 +2204,8 @@ func setAttributeViewFilters(operation *Operation) (err error) {
return return
} }
switch view.LayoutType { if err = gulu.JSON.UnmarshalJSON(data, &view.Filters); err != nil {
case av.LayoutTypeTable: return
if err = gulu.JSON.UnmarshalJSON(data, &view.Table.Filters); err != nil {
return
}
case av.LayoutTypeGallery:
if err = gulu.JSON.UnmarshalJSON(data, &view.Gallery.Filters); err != nil {
return
}
} }
err = av.SaveAttributeView(attrView) err = av.SaveAttributeView(attrView)
@ -2296,15 +2237,8 @@ func setAttributeViewSorts(operation *Operation) (err error) {
return return
} }
switch view.LayoutType { if err = gulu.JSON.UnmarshalJSON(data, &view.Sorts); err != nil {
case av.LayoutTypeTable: return
if err = gulu.JSON.UnmarshalJSON(data, &view.Table.Sorts); err != nil {
return
}
case av.LayoutTypeGallery:
if err = gulu.JSON.UnmarshalJSON(data, &view.Gallery.Sorts); err != nil {
return
}
} }
err = av.SaveAttributeView(attrView) err = av.SaveAttributeView(attrView)
@ -2330,12 +2264,7 @@ func setAttributeViewPageSize(operation *Operation) (err error) {
return return
} }
switch view.LayoutType { view.PageSize = int(operation.Data.(float64))
case av.LayoutTypeTable:
view.Table.PageSize = int(operation.Data.(float64))
case av.LayoutTypeGallery:
view.Gallery.PageSize = int(operation.Data.(float64))
}
err = av.SaveAttributeView(attrView) err = av.SaveAttributeView(attrView)
return return
@ -2487,12 +2416,8 @@ func addAttributeViewBlock(now int64, avID, blockID, previousBlockID, addingBloc
// 如果存在过滤条件,则将过滤条件应用到新添加的块上 // 如果存在过滤条件,则将过滤条件应用到新添加的块上
view, _ := getAttrViewViewByBlockID(attrView, blockID) view, _ := getAttrViewViewByBlockID(attrView, blockID)
var filters []*av.ViewFilter
if nil != view {
filters = view.GetFilters()
}
if nil != view && 0 < len(filters) && !ignoreFillFilter { if nil != view && 0 < len(view.Filters) && !ignoreFillFilter {
viewable := sql.RenderView(view, attrView, "") viewable := sql.RenderView(view, attrView, "")
viewable.Filter(attrView) viewable.Filter(attrView)
viewable.Sort(attrView) viewable.Sort(attrView)
@ -2517,13 +2442,12 @@ func addAttributeViewBlock(now int64, avID, blockID, previousBlockID, addingBloc
} }
sameKeyFilterSort := false // 是否在同一个字段上同时存在过滤和排序 sameKeyFilterSort := false // 是否在同一个字段上同时存在过滤和排序
sorts := view.GetSorts() if 0 < len(view.Sorts) {
if 0 < len(sorts) {
filterKeys, sortKeys := map[string]bool{}, map[string]bool{} filterKeys, sortKeys := map[string]bool{}, map[string]bool{}
for _, f := range filters { for _, f := range view.Filters {
filterKeys[f.Column] = true filterKeys[f.Column] = true
} }
for _, s := range sorts { for _, s := range view.Sorts {
sortKeys[s.Column] = true sortKeys[s.Column] = true
} }
@ -2537,7 +2461,7 @@ func addAttributeViewBlock(now int64, avID, blockID, previousBlockID, addingBloc
if !sameKeyFilterSort { if !sameKeyFilterSort {
// 如果在同一个字段上仅存在过滤条件,则将过滤条件应用到新添加的块上 // 如果在同一个字段上仅存在过滤条件,则将过滤条件应用到新添加的块上
for _, filter := range filters { for _, filter := range view.Filters {
for _, keyValues := range attrView.KeyValues { for _, keyValues := range attrView.KeyValues {
if keyValues.Key.ID == filter.Column { if keyValues.Key.ID == filter.Column {
var defaultVal *av.Value var defaultVal *av.Value
@ -4233,36 +4157,17 @@ func updateAttributeViewColumnOption(operation *Operation) (err error) {
// 如果存在选项对应的过滤器,需要更新过滤器中设置的选项值 // 如果存在选项对应的过滤器,需要更新过滤器中设置的选项值
// Database select field filters follow option editing changes https://github.com/siyuan-note/siyuan/issues/10881 // Database select field filters follow option editing changes https://github.com/siyuan-note/siyuan/issues/10881
for _, view := range attrView.Views { for _, view := range attrView.Views {
switch view.LayoutType { for _, filter := range view.Filters {
case av.LayoutTypeTable: if filter.Column != key.ID {
for _, filter := range view.Table.Filters { continue
if filter.Column != key.ID {
continue
}
if nil != filter.Value && (av.KeyTypeSelect == filter.Value.Type || av.KeyTypeMSelect == filter.Value.Type) {
for i, opt := range filter.Value.MSelect {
if oldName == opt.Content {
filter.Value.MSelect[i].Content = newName
filter.Value.MSelect[i].Color = newColor
break
}
}
}
} }
case av.LayoutTypeGallery:
for _, filter := range view.Gallery.Filters {
if filter.Column != key.ID {
continue
}
if nil != filter.Value && (av.KeyTypeSelect == filter.Value.Type || av.KeyTypeMSelect == filter.Value.Type) { if nil != filter.Value && (av.KeyTypeSelect == filter.Value.Type || av.KeyTypeMSelect == filter.Value.Type) {
for i, opt := range filter.Value.MSelect { for i, opt := range filter.Value.MSelect {
if oldName == opt.Content { if oldName == opt.Content {
filter.Value.MSelect[i].Content = newName filter.Value.MSelect[i].Content = newName
filter.Value.MSelect[i].Color = newColor filter.Value.MSelect[i].Color = newColor
break break
}
} }
} }
} }

View file

@ -23,8 +23,8 @@ func RenderAttributeViewGallery(attrView *av.AttributeView, view *av.View, query
Name: view.Name, Name: view.Name,
Desc: view.Desc, Desc: view.Desc,
HideAttrViewName: view.HideAttrViewName, HideAttrViewName: view.HideAttrViewName,
Filters: view.Gallery.Filters, Filters: view.Filters,
Sorts: view.Gallery.Sorts, Sorts: view.Sorts,
}, },
CoverFrom: view.Gallery.CoverFrom, CoverFrom: view.Gallery.CoverFrom,
CoverFromAssetKeyID: view.Gallery.CoverFromAssetKeyID, CoverFromAssetKeyID: view.Gallery.CoverFromAssetKeyID,

View file

@ -30,8 +30,8 @@ func RenderAttributeViewTable(attrView *av.AttributeView, view *av.View, query s
Name: view.Name, Name: view.Name,
Desc: view.Desc, Desc: view.Desc,
HideAttrViewName: view.HideAttrViewName, HideAttrViewName: view.HideAttrViewName,
Filters: view.Table.Filters, Filters: view.Filters,
Sorts: view.Table.Sorts, Sorts: view.Sorts,
}, },
Columns: []*av.TableColumn{}, Columns: []*av.TableColumn{},
Rows: []*av.TableRow{}, Rows: []*av.TableRow{},