This commit is contained in:
Daniel 2025-06-10 12:23:07 +08:00
parent 49354816e3
commit 4c55a240f3
No known key found for this signature in database
GPG key ID: 86211BA83DF03017
5 changed files with 101 additions and 31 deletions

View file

@ -207,15 +207,7 @@ func NewTableView() (ret *View) {
ID: ast.NewNodeID(),
Name: getI18nName("table"),
LayoutType: LayoutTypeTable,
Table: &LayoutTable{
BaseLayout: &BaseLayout{
Spec: 0,
ID: ast.NewNodeID(),
Filters: []*ViewFilter{},
Sorts: []*ViewSort{},
PageSize: TableViewDefaultPageSize,
},
},
Table: NewLayoutTable(),
}
return
}
@ -226,15 +218,7 @@ func NewTableViewWithBlockKey(blockKeyID string) (view *View, blockKey, selectKe
ID: ast.NewNodeID(),
Name: name,
LayoutType: LayoutTypeTable,
Table: &LayoutTable{
BaseLayout: &BaseLayout{
Spec: 0,
ID: ast.NewNodeID(),
Filters: []*ViewFilter{},
Sorts: []*ViewSort{},
PageSize: TableViewDefaultPageSize,
},
},
Table: NewLayoutTable(),
}
blockKey = NewKey(blockKeyID, getI18nName("key"), "", KeyTypeBlock)
view.Table.Columns = []*ViewTableColumn{{ID: blockKeyID}}
@ -249,18 +233,7 @@ func NewGalleryView() (ret *View) {
ID: ast.NewNodeID(),
Name: getI18nName("gallery"),
LayoutType: LayoutTypeGallery,
Gallery: &LayoutGallery{
BaseLayout: &BaseLayout{
Spec: 0,
ID: ast.NewNodeID(),
Filters: []*ViewFilter{},
Sorts: []*ViewSort{},
PageSize: GalleryViewDefaultPageSize,
},
CoverFrom: CoverFromContentImage,
CardSize: CardSizeMedium,
ShowIcon: true,
},
Gallery: NewLayoutGallery(),
}
return
}

View file

@ -16,7 +16,11 @@
package av
import "sort"
import (
"sort"
"github.com/88250/lute/ast"
)
// LayoutGallery 描述了画廊布局的结构。
type LayoutGallery struct {
@ -33,6 +37,21 @@ type LayoutGallery struct {
CardIDs []string `json:"cardIds"` // 卡片 ID用于自定义排序
}
func NewLayoutGallery() *LayoutGallery {
return &LayoutGallery{
BaseLayout: &BaseLayout{
Spec: 0,
ID: ast.NewNodeID(),
Filters: []*ViewFilter{},
Sorts: []*ViewSort{},
PageSize: GalleryViewDefaultPageSize,
},
CoverFrom: CoverFromContentImage,
CardSize: CardSizeMedium,
ShowIcon: true,
}
}
type CardSize int
const (

View file

@ -18,6 +18,8 @@ package av
import (
"sort"
"github.com/88250/lute/ast"
)
// LayoutTable 描述了表格布局的结构。
@ -28,6 +30,18 @@ type LayoutTable struct {
RowIDs []string `json:"rowIds"` // 行 ID用于自定义排序
}
func NewLayoutTable() *LayoutTable {
return &LayoutTable{
BaseLayout: &BaseLayout{
Spec: 0,
ID: ast.NewNodeID(),
Filters: []*ViewFilter{},
Sorts: []*ViewSort{},
PageSize: TableViewDefaultPageSize,
},
}
}
// ViewTableColumn 描述了表格列的结构。
type ViewTableColumn struct {
ID string `json:"id"` // 列 ID

View file

@ -44,6 +44,68 @@ import (
"github.com/xrash/smetrics"
)
func (tx *Transaction) doChangeAttrViewLayout(operation *Operation) (ret *TxErr) {
err := changeAttrViewLayout(operation)
if err != nil {
return &TxErr{code: TxErrWriteAttributeView, id: operation.AvID, msg: err.Error()}
}
return
}
func changeAttrViewLayout(operation *Operation) (err error) {
attrView, err := av.ParseAttributeView(operation.AvID)
if err != nil {
return
}
view, err := getAttrViewViewByBlockID(attrView, operation.BlockID)
if err != nil {
return
}
newLayout := operation.Layout
if newLayout == view.LayoutType {
return
}
view.LayoutType = newLayout
switch newLayout {
case av.LayoutTypeTable:
if nil != view.Table {
break
}
view.Table = av.NewLayoutTable()
switch view.LayoutType {
case av.LayoutTypeGallery:
for _, field := range view.Gallery.CardFields {
view.Table.Columns = append(view.Table.Columns, &av.ViewTableColumn{ID: field.ID})
}
for _, cardID := range view.Gallery.CardIDs {
view.Table.RowIDs = append(view.Table.RowIDs, cardID)
}
}
case av.LayoutTypeGallery:
if nil != view.Gallery {
break
}
view.Gallery = av.NewLayoutGallery()
switch view.LayoutType {
case av.LayoutTypeTable:
for _, col := range view.Table.Columns {
view.Gallery.CardFields = append(view.Gallery.CardFields, &av.ViewGalleryCardField{ID: col.ID})
}
for _, rowID := range view.Table.RowIDs {
view.Gallery.CardIDs = append(view.Gallery.CardIDs, rowID)
}
}
}
err = av.SaveAttributeView(attrView)
return
}
func (tx *Transaction) doSetAttrViewWrapField(operation *Operation) (ret *TxErr) {
err := setAttrViewWrapField(operation)
if err != nil {

View file

@ -290,6 +290,8 @@ func performTx(tx *Transaction) (ret *TxErr) {
ret = tx.doSetAttrViewShowIcon(op)
case "setAttrViewWrapField":
ret = tx.doSetAttrViewWrapField(op)
case "changeAttrViewLayout":
ret = tx.doChangeAttrViewLayout(op)
}
if nil != ret {