mirror of
https://github.com/siyuan-note/siyuan.git
synced 2025-12-17 15:10:12 +01:00
🎨 Database gallery view https://github.com/siyuan-note/siyuan/issues/10414
This commit is contained in:
parent
49354816e3
commit
4c55a240f3
5 changed files with 101 additions and 31 deletions
|
|
@ -207,15 +207,7 @@ func NewTableView() (ret *View) {
|
||||||
ID: ast.NewNodeID(),
|
ID: ast.NewNodeID(),
|
||||||
Name: getI18nName("table"),
|
Name: getI18nName("table"),
|
||||||
LayoutType: LayoutTypeTable,
|
LayoutType: LayoutTypeTable,
|
||||||
Table: &LayoutTable{
|
Table: NewLayoutTable(),
|
||||||
BaseLayout: &BaseLayout{
|
|
||||||
Spec: 0,
|
|
||||||
ID: ast.NewNodeID(),
|
|
||||||
Filters: []*ViewFilter{},
|
|
||||||
Sorts: []*ViewSort{},
|
|
||||||
PageSize: TableViewDefaultPageSize,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
@ -226,15 +218,7 @@ func NewTableViewWithBlockKey(blockKeyID string) (view *View, blockKey, selectKe
|
||||||
ID: ast.NewNodeID(),
|
ID: ast.NewNodeID(),
|
||||||
Name: name,
|
Name: name,
|
||||||
LayoutType: LayoutTypeTable,
|
LayoutType: LayoutTypeTable,
|
||||||
Table: &LayoutTable{
|
Table: NewLayoutTable(),
|
||||||
BaseLayout: &BaseLayout{
|
|
||||||
Spec: 0,
|
|
||||||
ID: ast.NewNodeID(),
|
|
||||||
Filters: []*ViewFilter{},
|
|
||||||
Sorts: []*ViewSort{},
|
|
||||||
PageSize: TableViewDefaultPageSize,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
blockKey = NewKey(blockKeyID, getI18nName("key"), "", KeyTypeBlock)
|
blockKey = NewKey(blockKeyID, getI18nName("key"), "", KeyTypeBlock)
|
||||||
view.Table.Columns = []*ViewTableColumn{{ID: blockKeyID}}
|
view.Table.Columns = []*ViewTableColumn{{ID: blockKeyID}}
|
||||||
|
|
@ -249,18 +233,7 @@ func NewGalleryView() (ret *View) {
|
||||||
ID: ast.NewNodeID(),
|
ID: ast.NewNodeID(),
|
||||||
Name: getI18nName("gallery"),
|
Name: getI18nName("gallery"),
|
||||||
LayoutType: LayoutTypeGallery,
|
LayoutType: LayoutTypeGallery,
|
||||||
Gallery: &LayoutGallery{
|
Gallery: NewLayoutGallery(),
|
||||||
BaseLayout: &BaseLayout{
|
|
||||||
Spec: 0,
|
|
||||||
ID: ast.NewNodeID(),
|
|
||||||
Filters: []*ViewFilter{},
|
|
||||||
Sorts: []*ViewSort{},
|
|
||||||
PageSize: GalleryViewDefaultPageSize,
|
|
||||||
},
|
|
||||||
CoverFrom: CoverFromContentImage,
|
|
||||||
CardSize: CardSizeMedium,
|
|
||||||
ShowIcon: true,
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,11 @@
|
||||||
|
|
||||||
package av
|
package av
|
||||||
|
|
||||||
import "sort"
|
import (
|
||||||
|
"sort"
|
||||||
|
|
||||||
|
"github.com/88250/lute/ast"
|
||||||
|
)
|
||||||
|
|
||||||
// LayoutGallery 描述了画廊布局的结构。
|
// LayoutGallery 描述了画廊布局的结构。
|
||||||
type LayoutGallery struct {
|
type LayoutGallery struct {
|
||||||
|
|
@ -33,6 +37,21 @@ type LayoutGallery struct {
|
||||||
CardIDs []string `json:"cardIds"` // 卡片 ID,用于自定义排序
|
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
|
type CardSize int
|
||||||
|
|
||||||
const (
|
const (
|
||||||
|
|
|
||||||
|
|
@ -18,6 +18,8 @@ package av
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"sort"
|
"sort"
|
||||||
|
|
||||||
|
"github.com/88250/lute/ast"
|
||||||
)
|
)
|
||||||
|
|
||||||
// LayoutTable 描述了表格布局的结构。
|
// LayoutTable 描述了表格布局的结构。
|
||||||
|
|
@ -28,6 +30,18 @@ type LayoutTable struct {
|
||||||
RowIDs []string `json:"rowIds"` // 行 ID,用于自定义排序
|
RowIDs []string `json:"rowIds"` // 行 ID,用于自定义排序
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func NewLayoutTable() *LayoutTable {
|
||||||
|
return &LayoutTable{
|
||||||
|
BaseLayout: &BaseLayout{
|
||||||
|
Spec: 0,
|
||||||
|
ID: ast.NewNodeID(),
|
||||||
|
Filters: []*ViewFilter{},
|
||||||
|
Sorts: []*ViewSort{},
|
||||||
|
PageSize: TableViewDefaultPageSize,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// ViewTableColumn 描述了表格列的结构。
|
// ViewTableColumn 描述了表格列的结构。
|
||||||
type ViewTableColumn struct {
|
type ViewTableColumn struct {
|
||||||
ID string `json:"id"` // 列 ID
|
ID string `json:"id"` // 列 ID
|
||||||
|
|
|
||||||
|
|
@ -44,6 +44,68 @@ import (
|
||||||
"github.com/xrash/smetrics"
|
"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) {
|
func (tx *Transaction) doSetAttrViewWrapField(operation *Operation) (ret *TxErr) {
|
||||||
err := setAttrViewWrapField(operation)
|
err := setAttrViewWrapField(operation)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
||||||
|
|
@ -290,6 +290,8 @@ func performTx(tx *Transaction) (ret *TxErr) {
|
||||||
ret = tx.doSetAttrViewShowIcon(op)
|
ret = tx.doSetAttrViewShowIcon(op)
|
||||||
case "setAttrViewWrapField":
|
case "setAttrViewWrapField":
|
||||||
ret = tx.doSetAttrViewWrapField(op)
|
ret = tx.doSetAttrViewWrapField(op)
|
||||||
|
case "changeAttrViewLayout":
|
||||||
|
ret = tx.doChangeAttrViewLayout(op)
|
||||||
}
|
}
|
||||||
|
|
||||||
if nil != ret {
|
if nil != ret {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue