From 9ede4c7361f4b17cb406dfc516c8a1b7d17598ee Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Mon, 8 Jan 2024 12:04:03 +0800 Subject: [PATCH 1/2] :bug: Fix render template with database table view https://github.com/siyuan-note/insider/issues/1132 --- kernel/av/av.go | 30 +++++++++------- kernel/model/template.go | 77 +++++++++++++++++++++------------------- 2 files changed, 58 insertions(+), 49 deletions(-) diff --git a/kernel/av/av.go b/kernel/av/av.go index 1578718bc..85bc6354a 100644 --- a/kernel/av/av.go +++ b/kernel/av/av.go @@ -429,14 +429,9 @@ func (av *AttributeView) ShallowClone() (ret *AttributeView) { } ret.ID = ast.NewNodeID() - view, err := ret.GetCurrentView() - if nil == err { - view.ID = ast.NewNodeID() - ret.ViewID = view.ID - } else { - view, _ = NewTableViewWithBlockKey(ast.NewNodeID()) - ret.ViewID = view.ID - ret.Views = append(ret.Views, view) + if 1 > len(ret.Views) { + logging.LogErrorf("attribute view [%s] has no views", av.ID) + return nil } keyIDMap := map[string]string{} @@ -447,11 +442,22 @@ func (av *AttributeView) ShallowClone() (ret *AttributeView) { kv.Values = []*Value{} } - view.Table.ID = ast.NewNodeID() - for _, column := range view.Table.Columns { - column.ID = keyIDMap[column.ID] + for _, view := range ret.Views { + view.ID = ast.NewNodeID() + view.Table.ID = ast.NewNodeID() + for _, column := range view.Table.Columns { + column.ID = keyIDMap[column.ID] + } + 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] + } } - view.Table.RowIDs = []string{} + ret.ViewID = ret.Views[0].ID return } diff --git a/kernel/model/template.go b/kernel/model/template.go index f6d8d6519..02565e7c3 100644 --- a/kernel/model/template.go +++ b/kernel/model/template.go @@ -287,45 +287,48 @@ func renderTemplate(p, id string, preview bool) (string, error) { logging.LogErrorf("parse attribute view [%s] failed: %s", n.AttributeViewID, parseErr) } else { cloned := attrView.ShallowClone() - if nil != cloned { - n.AttributeViewID = cloned.ID - if !preview { - // 非预览时持久化数据库 - if saveErr := av.SaveAttributeView(cloned); nil != saveErr { - logging.LogErrorf("save attribute view [%s] failed: %s", cloned.ID, saveErr) - } - } else { - // 预览时使用简单表格渲染 - view, getErr := attrView.GetCurrentView() - if nil != getErr { - logging.LogErrorf("get attribute view [%s] failed: %s", n.AttributeViewID, getErr) - return ast.WalkContinue - } + if nil == cloned { + logging.LogErrorf("clone attribute view [%s] failed", n.AttributeViewID) + return ast.WalkContinue + } - table, renderErr := renderAttributeViewTable(attrView, view) - if nil != renderErr { - logging.LogErrorf("render attribute view [%s] table failed: %s", n.AttributeViewID, renderErr) - return ast.WalkContinue - } - - var aligns []int - for range table.Columns { - aligns = append(aligns, 0) - } - mdTable := &ast.Node{Type: ast.NodeTable, TableAligns: aligns} - mdTableHead := &ast.Node{Type: ast.NodeTableHead} - mdTable.AppendChild(mdTableHead) - mdTableHeadRow := &ast.Node{Type: ast.NodeTableRow, TableAligns: aligns} - mdTableHead.AppendChild(mdTableHeadRow) - for _, col := range table.Columns { - cell := &ast.Node{Type: ast.NodeTableCell} - cell.AppendChild(&ast.Node{Type: ast.NodeText, Tokens: []byte(col.Name)}) - mdTableHeadRow.AppendChild(cell) - } - - n.InsertBefore(mdTable) - unlinks = append(unlinks, n) + n.AttributeViewID = cloned.ID + if !preview { + // 非预览时持久化数据库 + if saveErr := av.SaveAttributeView(cloned); nil != saveErr { + logging.LogErrorf("save attribute view [%s] failed: %s", cloned.ID, saveErr) } + } else { + // 预览时使用简单表格渲染 + view, getErr := attrView.GetCurrentView() + if nil != getErr { + logging.LogErrorf("get attribute view [%s] failed: %s", n.AttributeViewID, getErr) + return ast.WalkContinue + } + + table, renderErr := renderAttributeViewTable(attrView, view) + if nil != renderErr { + logging.LogErrorf("render attribute view [%s] table failed: %s", n.AttributeViewID, renderErr) + return ast.WalkContinue + } + + var aligns []int + for range table.Columns { + aligns = append(aligns, 0) + } + mdTable := &ast.Node{Type: ast.NodeTable, TableAligns: aligns} + mdTableHead := &ast.Node{Type: ast.NodeTableHead} + mdTable.AppendChild(mdTableHead) + mdTableHeadRow := &ast.Node{Type: ast.NodeTableRow, TableAligns: aligns} + mdTableHead.AppendChild(mdTableHeadRow) + for _, col := range table.Columns { + cell := &ast.Node{Type: ast.NodeTableCell} + cell.AppendChild(&ast.Node{Type: ast.NodeText, Tokens: []byte(col.Name)}) + mdTableHeadRow.AppendChild(cell) + } + + n.InsertBefore(mdTable) + unlinks = append(unlinks, n) } } } From 4b55a9623c78e191a04408bc9940b366854adb57 Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Mon, 8 Jan 2024 12:18:52 +0800 Subject: [PATCH 2/2] :art: Reduce the delay in adding rows in database table view https://github.com/siyuan-note/siyuan/issues/10082 --- kernel/model/attribute_view.go | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/kernel/model/attribute_view.go b/kernel/model/attribute_view.go index a9913b8d4..ce5496dd0 100644 --- a/kernel/model/attribute_view.go +++ b/kernel/model/attribute_view.go @@ -1691,8 +1691,12 @@ func addAttributeViewBlock(blockID string, operation *Operation, tree *parse.Tre func GetLastSortRow(rows []*av.TableRow) *av.TableRow { for i := len(rows) - 1; i >= 0; i-- { row := rows[i] - block := row.GetBlockValue() - if nil != block { + blockVal := row.GetBlockValue() + if nil != blockVal { + if nil != blockVal.Block && blockVal.Block.Created == blockVal.Block.Updated { + // 说明是刚刚创建的块,跳过 + continue + } return row } }