diff --git a/kernel/av/av.go b/kernel/av/av.go index 1b180a55e..e6e1dee4d 100644 --- a/kernel/av/av.go +++ b/kernel/av/av.go @@ -68,6 +68,16 @@ func (av *AttributeView) GetColumnNames() (ret []string) { return } +func (av *AttributeView) InsertColumn(index int, column Column) { + if 0 > index || len(av.Columns) == index { + av.Columns = append(av.Columns, column) + return + } + + av.Columns = append(av.Columns[:index+1], av.Columns[index:]...) + av.Columns[index] = column +} + type AttributeViewFilter struct { Column string `json:"column"` Operator FilterOperator `json:"operator"` diff --git a/kernel/av/column.go b/kernel/av/column.go index 9a9c06032..1bb6886a0 100644 --- a/kernel/av/column.go +++ b/kernel/av/column.go @@ -16,6 +16,8 @@ package av +import "github.com/88250/lute/ast" + // Column 描述了属性视图的列。 type Column interface { @@ -59,3 +61,11 @@ func (c *BaseColumn) Name() string { func (c *BaseColumn) Type() ColumnType { return c.BaseType } + +func NewBaseColumn(name string, columnType ColumnType) *BaseColumn { + return &BaseColumn{ + BaseID: ast.NewNodeID(), + BaseName: name, + BaseType: columnType, + } +} diff --git a/kernel/av/column_block.go b/kernel/av/column_block.go index f47e993cf..ab458a853 100644 --- a/kernel/av/column_block.go +++ b/kernel/av/column_block.go @@ -16,18 +16,12 @@ package av -import "github.com/88250/lute/ast" - type ColumnBlock struct { *BaseColumn } func NewColumnBlock() *ColumnBlock { return &ColumnBlock{ - BaseColumn: &BaseColumn{ - BaseID: ast.NewNodeID(), - BaseName: "Block", - BaseType: ColumnTypeBlock, - }, + BaseColumn: NewBaseColumn("Block", ColumnTypeBlock), } } diff --git a/kernel/av/column_text.go b/kernel/av/column_text.go index 047724c3e..6a23abbd6 100644 --- a/kernel/av/column_text.go +++ b/kernel/av/column_text.go @@ -19,3 +19,9 @@ package av type ColumnText struct { *BaseColumn } + +func NewColumnText(name string) *ColumnText { + return &ColumnText{ + BaseColumn: NewBaseColumn(name, ColumnTypeText), + } +} diff --git a/kernel/model/attribute_view.go b/kernel/model/attribute_view.go index 115f4bf91..aad9c8f48 100644 --- a/kernel/model/attribute_view.go +++ b/kernel/model/attribute_view.go @@ -17,13 +17,37 @@ package model import ( + "errors" + "fmt" + "github.com/88250/lute/parse" + "github.com/siyuan-note/logging" "github.com/siyuan-note/siyuan/kernel/av" "github.com/siyuan-note/siyuan/kernel/sql" "github.com/siyuan-note/siyuan/kernel/treenode" ) -func AddBlockToAttributeView(blockID, avID string) (err error) { +func AddAttributeViewColumn(name string, typ string, columnIndex int, avID string) (err error) { + attrView, err := av.ParseAttributeView(avID) + if nil != err { + return + } + + switch av.ColumnType(typ) { + case av.ColumnTypeText: + attrView.InsertColumn(columnIndex, av.NewColumnText(name)) + default: + msg := fmt.Sprintf("invalid column type [%s]", typ) + logging.LogErrorf(msg) + err = errors.New(msg) + return + } + + err = av.SaveAttributeView(attrView) + return +} + +func AddAttributeViewBlock(blockID, avID string) (err error) { tree, err := loadTreeByBlockID(blockID) if nil != err { return