Merge remote-tracking branch 'origin/dev' into dev

This commit is contained in:
Vanessa 2023-07-03 16:04:08 +08:00
commit 58f06933e8
4 changed files with 63 additions and 26 deletions

View File

@ -39,10 +39,9 @@ type AttributeView struct {
Columns []*Column `json:"columns"` // 表格列名 Columns []*Column `json:"columns"` // 表格列名
Rows []*Row `json:"rows"` // 表格行记录 Rows []*Row `json:"rows"` // 表格行记录
Type AttributeViewType `json:"type"` // 属性视图类型 Type AttributeViewType `json:"type"` // 属性视图类型
Projections []string `json:"projections"` // 显示的列名 Filters []*AttributeViewFilter `json:"filters"` // 过滤规则
Filters []*AttributeViewFilter `json:"filters"` // 过滤规则 Sorts []*AttributeViewSort `json:"sorts"` // 排序规则
Sorts []*AttributeViewSort `json:"sorts"` // 排序规则
} }
// AttributeViewType 描述了属性视图的类型。 // AttributeViewType 描述了属性视图的类型。
@ -54,15 +53,14 @@ const (
func NewAttributeView(id string) *AttributeView { func NewAttributeView(id string) *AttributeView {
return &AttributeView{ return &AttributeView{
Spec: 0, Spec: 0,
ID: id, ID: id,
Name: "Table", Name: "Table",
Columns: []*Column{{ID: ast.NewNodeID(), Name: "Block", Type: ColumnTypeBlock}}, Columns: []*Column{{ID: ast.NewNodeID(), Name: "Block", Type: ColumnTypeBlock}},
Rows: []*Row{}, Rows: []*Row{},
Type: AttributeViewTypeTable, Type: AttributeViewTypeTable,
Projections: []string{}, Filters: []*AttributeViewFilter{},
Filters: []*AttributeViewFilter{}, Sorts: []*AttributeViewSort{},
Sorts: []*AttributeViewSort{},
} }
} }

View File

@ -24,10 +24,12 @@ import (
"github.com/88250/gulu" "github.com/88250/gulu"
"github.com/88250/lute/ast" "github.com/88250/lute/ast"
"github.com/88250/lute/parse" "github.com/88250/lute/parse"
"github.com/jinzhu/copier"
"github.com/siyuan-note/logging" "github.com/siyuan-note/logging"
"github.com/siyuan-note/siyuan/kernel/av" "github.com/siyuan-note/siyuan/kernel/av"
"github.com/siyuan-note/siyuan/kernel/sql" "github.com/siyuan-note/siyuan/kernel/sql"
"github.com/siyuan-note/siyuan/kernel/treenode" "github.com/siyuan-note/siyuan/kernel/treenode"
"github.com/siyuan-note/siyuan/kernel/util"
) )
func RenderAttributeView(avID string) (ret *av.AttributeView, err error) { func RenderAttributeView(avID string) (ret *av.AttributeView, err error) {
@ -225,6 +227,14 @@ func (tx *Transaction) doSetAttrViewColumnWidth(operation *Operation) (ret *TxEr
return return
} }
func (tx *Transaction) doSetAttrView(operation *Operation) (ret *TxErr) {
err := setAttributeView(operation)
if nil != err {
return &TxErr{code: TxErrWriteAttributeView, id: operation.ParentID, msg: err.Error()}
}
return
}
func addAttributeViewColumn(name string, typ string, avID string) (err error) { func addAttributeViewColumn(name string, typ string, avID string) (err error) {
attrView, err := av.ParseAttributeView(avID) attrView, err := av.ParseAttributeView(avID)
if nil != err { if nil != err {
@ -327,12 +337,12 @@ func sortAttributeViewColumn(columnID, previousColumnID, avID string) (err error
break break
} }
} }
attrView.Columns = insertElement(attrView.Columns, previousIndex, col) attrView.Columns = util.InsertElement(attrView.Columns, previousIndex, col)
for _, row := range attrView.Rows { for _, row := range attrView.Rows {
cel := row.Cells[index] cel := row.Cells[index]
row.Cells = append(row.Cells[:index], row.Cells[index+1:]...) row.Cells = append(row.Cells[:index], row.Cells[index+1:]...)
row.Cells = insertElement(row.Cells, previousIndex, cel) row.Cells = util.InsertElement(row.Cells, previousIndex, cel)
} }
err = av.SaveAttributeView(attrView) err = av.SaveAttributeView(attrView)
@ -365,22 +375,12 @@ func sortAttributeViewRow(rowID, previousRowID, avID string) (err error) {
break break
} }
} }
attrView.Rows = insertElement(attrView.Rows, previousIndex, row) attrView.Rows = util.InsertElement(attrView.Rows, previousIndex, row)
err = av.SaveAttributeView(attrView) err = av.SaveAttributeView(attrView)
return return
} }
// 0 <= index <= len(a)
func insertElement[T any](rows []T, index int, value T) []T {
if len(rows) == index { // nil or empty slice or after last element
return append(rows, value)
}
rows = append(rows[:index+1], rows[index:]...) // index < len(a)
rows[index] = value
return rows
}
func setAttributeViewColHidden(hidden bool, columnID, avID string) (err error) { func setAttributeViewColHidden(hidden bool, columnID, avID string) (err error) {
attrView, err := av.ParseAttributeView(avID) attrView, err := av.ParseAttributeView(avID)
if nil != err { if nil != err {
@ -432,6 +432,31 @@ func setAttributeViewColWidth(width, columnID, avID string) (err error) {
return return
} }
func setAttributeView(operation *Operation) (err error) {
avID := operation.ID
attrView, err := av.ParseAttributeView(avID)
if nil != err {
return
}
data, err := gulu.JSON.MarshalJSON(operation.Data)
if nil != err {
return
}
newAttrView := &av.AttributeView{}
if err = gulu.JSON.UnmarshalJSON(data, newAttrView); nil != err {
return
}
if err = copier.Copy(attrView, newAttrView); nil != err {
return
}
err = av.SaveAttributeView(attrView)
return
}
func removeAttributeViewBlock(blockID, avID string) (ret *av.AttributeView, err error) { func removeAttributeViewBlock(blockID, avID string) (ret *av.AttributeView, err error) {
ret, err = av.ParseAttributeView(avID) ret, err = av.ParseAttributeView(avID)
if nil != err { if nil != err {

View File

@ -238,6 +238,8 @@ func performTx(tx *Transaction) (ret *TxErr) {
ret = tx.doSetAttrViewColumnWrap(op) ret = tx.doSetAttrViewColumnWrap(op)
case "setAttrViewColWidth": case "setAttrViewColWidth":
ret = tx.doSetAttrViewColumnWidth(op) ret = tx.doSetAttrViewColumnWidth(op)
case "setAttrView":
ret = tx.doSetAttrView(op)
} }
if nil != ret { if nil != ret {

View File

@ -24,6 +24,18 @@ import (
"github.com/88250/lute/html" "github.com/88250/lute/html"
) )
// InsertElement inserts a new element value at the specified index position.
// 0 <= index <= len(a)
func InsertElement[T any](ret []T, index int, value T) []T {
if len(ret) == index { // nil or empty slice or after last element
return append(ret, value)
}
ret = append(ret[:index+1], ret[index:]...) // index < len(a)
ret[index] = value
return ret
}
func EscapeHTML(s string) string { func EscapeHTML(s string) string {
if strings.Contains(s, "&amp;") { if strings.Contains(s, "&amp;") {
return s return s