From fcd134ad2d3db7b636546003ce86e64817ef1b16 Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Mon, 18 Dec 2023 22:25:29 +0800 Subject: [PATCH 1/2] :art: Automatically fill in the filter result value when adding rows in the database table view https://github.com/siyuan-note/siyuan/issues/9905 --- kernel/av/table.go | 2 +- kernel/av/value.go | 4 ++++ kernel/model/attribute_view.go | 43 ++++++++++++++++++++++------------ 3 files changed, 33 insertions(+), 16 deletions(-) diff --git a/kernel/av/table.go b/kernel/av/table.go index 66b297757..fabba724b 100644 --- a/kernel/av/table.go +++ b/kernel/av/table.go @@ -727,7 +727,7 @@ func (table *Table) FilterRows() { rows := []*TableRow{} for _, row := range table.Rows { block := row.GetBlockValue() - if !block.IsInitialized && nil != block.Block && "" == block.Block.Content && block.IsDetached { + if block.NotAffectFilter() { rows = append(rows, row) continue } diff --git a/kernel/av/value.go b/kernel/av/value.go index 7be46a3f1..b90d63641 100644 --- a/kernel/av/value.go +++ b/kernel/av/value.go @@ -54,6 +54,10 @@ type Value struct { Rollup *ValueRollup `json:"rollup,omitempty"` } +func (value *Value) NotAffectFilter() bool { + return !value.IsInitialized && nil != value.Block && "" == value.Block.Content && value.IsDetached +} + func (value *Value) String() string { switch value.Type { case KeyTypeBlock: diff --git a/kernel/model/attribute_view.go b/kernel/model/attribute_view.go index a7babed7d..fbcf32356 100644 --- a/kernel/model/attribute_view.go +++ b/kernel/model/attribute_view.go @@ -1114,22 +1114,24 @@ func addAttributeViewBlock(blockID string, operation *Operation, tree *parse.Tre viewable.SortRows() if 0 < len(viewable.Rows) { - row := viewable.Rows[len(viewable.Rows)-1] - for _, filter := range view.Table.Filters { - for _, cell := range row.Cells { - if nil != cell.Value && cell.Value.KeyID == filter.Column { - if av.KeyTypeBlock == cell.ValueType { - blockValue.Block.Content = cell.Value.Block.Content - continue - } + row := GetLastSortRow(viewable.Rows) + if nil != row { + for _, filter := range view.Table.Filters { + for _, cell := range row.Cells { + if nil != cell.Value && cell.Value.KeyID == filter.Column { + if av.KeyTypeBlock == cell.ValueType { + blockValue.Block.Content = cell.Value.Block.Content + continue + } - newValue := cell.Value.Clone() - newValue.ID = ast.NewNodeID() - newValue.BlockID = blockID - newValue.IsDetached = operation.IsDetached - newValue.IsInitialized = false - values, _ := attrView.GetKeyValues(filter.Column) - values.Values = append(values.Values, newValue) + newValue := cell.Value.Clone() + newValue.ID = ast.NewNodeID() + newValue.BlockID = blockID + newValue.IsDetached = operation.IsDetached + newValue.IsInitialized = false + values, _ := attrView.GetKeyValues(filter.Column) + values.Values = append(values.Values, newValue) + } } } } @@ -1178,6 +1180,17 @@ func addAttributeViewBlock(blockID string, operation *Operation, tree *parse.Tre return } +func GetLastSortRow(rows []*av.TableRow) *av.TableRow { + for i := len(rows) - 1; i >= 0; i-- { + row := rows[i] + block := row.GetBlockValue() + if !block.NotAffectFilter() { + return row + } + } + return nil +} + func (tx *Transaction) doRemoveAttrViewBlock(operation *Operation) (ret *TxErr) { err := tx.removeAttributeViewBlock(operation) if nil != err { From 28433507372d28e053b88ce37de89ddcc969d731 Mon Sep 17 00:00:00 2001 From: Daniel <845765@qq.com> Date: Mon, 18 Dec 2023 22:29:17 +0800 Subject: [PATCH 2/2] :art: Improve database table view --- kernel/av/table.go | 2 +- kernel/model/attribute_view.go | 9 ++++----- kernel/treenode/node.go | 7 +++---- 3 files changed, 8 insertions(+), 10 deletions(-) diff --git a/kernel/av/table.go b/kernel/av/table.go index fabba724b..1370a18a4 100644 --- a/kernel/av/table.go +++ b/kernel/av/table.go @@ -727,7 +727,7 @@ func (table *Table) FilterRows() { rows := []*TableRow{} for _, row := range table.Rows { block := row.GetBlockValue() - if block.NotAffectFilter() { + if nil != block && block.NotAffectFilter() { rows = append(rows, row) continue } diff --git a/kernel/model/attribute_view.go b/kernel/model/attribute_view.go index fbcf32356..ae5241ad9 100644 --- a/kernel/model/attribute_view.go +++ b/kernel/model/attribute_view.go @@ -589,7 +589,7 @@ func renderAttributeViewTable(attrView *av.AttributeView, view *av.View) (ret *a keyValues := rows[row.ID] ial := map[string]string{} block := row.GetBlockValue() - if !block.IsDetached { + if nil != block && !block.IsDetached { ial = GetBlockAttrsWithoutWaitWriting(row.ID) } content := renderTemplateCol(ial, cell.Value.Template.Content, keyValues) @@ -606,12 +606,11 @@ func renderAttributeViewTable(attrView *av.AttributeView, view *av.View) (ret *a case av.KeyTypeUpdated: // 渲染更新时间 ial := map[string]string{} block := row.GetBlockValue() - if !block.IsDetached { + if nil != block && !block.IsDetached { ial = GetBlockAttrsWithoutWaitWriting(row.ID) } updatedStr := ial["updated"] - if "" == updatedStr { - block := row.GetBlockValue() + if "" == updatedStr && nil != block { cell.Value.Updated = av.NewFormattedValueUpdated(block.Block.Updated, 0, av.UpdatedFormatNone) cell.Value.Updated.IsNotEmpty = true } else { @@ -1184,7 +1183,7 @@ func GetLastSortRow(rows []*av.TableRow) *av.TableRow { for i := len(rows) - 1; i >= 0; i-- { row := rows[i] block := row.GetBlockValue() - if !block.NotAffectFilter() { + if nil != block && !block.NotAffectFilter() { return row } } diff --git a/kernel/treenode/node.go b/kernel/treenode/node.go index 6d413d0e6..eaf962dcf 100644 --- a/kernel/treenode/node.go +++ b/kernel/treenode/node.go @@ -708,7 +708,7 @@ func renderAttributeViewTable(attrView *av.AttributeView, view *av.View) (ret *a keyValues := rows[row.ID] ial := map[string]string{} block := row.GetBlockValue() - if !block.IsDetached { + if nil != block && !block.IsDetached { ial = cache.GetBlockIAL(row.ID) if nil == ial { ial = map[string]string{} @@ -728,15 +728,14 @@ func renderAttributeViewTable(attrView *av.AttributeView, view *av.View) (ret *a case av.KeyTypeUpdated: // 渲染更新时间 ial := map[string]string{} block := row.GetBlockValue() - if !block.IsDetached { + if nil != block && !block.IsDetached { ial = cache.GetBlockIAL(row.ID) if nil == ial { ial = map[string]string{} } } updatedStr := ial["updated"] - if "" == updatedStr { - block := row.GetBlockValue() + if "" == updatedStr && nil != block { cell.Value.Updated = av.NewFormattedValueUpdated(block.Block.Updated, 0, av.UpdatedFormatNone) cell.Value.Updated.IsNotEmpty = true } else {