Sfoglia il codice sorgente

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

Vanessa 1 anno fa
parent
commit
9a0eedf820
4 ha cambiato i file con 98 aggiunte e 68 eliminazioni
  1. 12 1
      kernel/av/filter.go
  2. 54 0
      kernel/av/value.go
  3. 30 12
      kernel/model/attribute_view.go
  4. 2 55
      kernel/treenode/node.go

+ 12 - 1
kernel/av/filter.go

@@ -20,6 +20,7 @@ import (
 	"strings"
 	"time"
 
+	"github.com/88250/lute/ast"
 	"github.com/siyuan-note/siyuan/kernel/util"
 )
 
@@ -121,10 +122,20 @@ func (value *Value) Filter(filter *ViewFilter, attrView *AttributeView, rowID st
 			return false
 		}
 
+		destKey, _ := destAv.GetKey(key.Rollup.KeyID)
+		if nil == destKey {
+			return false
+		}
+
 		for _, blockID := range relVal.Relation.BlockIDs {
 			destVal := destAv.GetValue(key.Rollup.KeyID, blockID)
 			if nil == destVal {
-				continue
+				if destAv.ExistBlock(blockID) { // 数据库中存在行但是列值不存在是数据未初始化,这里补一个默认值
+					destVal = GetAttributeViewDefaultValue(ast.NewNodeID(), key.Rollup.KeyID, blockID, destKey.Type)
+				}
+				if nil == destVal {
+					continue
+				}
 			}
 
 			if destVal.filter(filter.Value.Rollup.Contents[0], filter.RelativeDate, filter.RelativeDate2, filter.Operator) {

+ 54 - 0
kernel/av/value.go

@@ -25,6 +25,7 @@ import (
 	"time"
 
 	"github.com/88250/gulu"
+	"github.com/88250/lute/ast"
 	"github.com/siyuan-note/siyuan/kernel/util"
 	"golang.org/x/text/language"
 	"golang.org/x/text/message"
@@ -902,3 +903,56 @@ func (r *ValueRollup) RenderContents(calc *RollupCalc, destKey *Key) {
 		}
 	}
 }
+
+func GetAttributeViewDefaultValue(valueID, keyID, blockID string, typ KeyType) (ret *Value) {
+	if "" == valueID {
+		valueID = ast.NewNodeID()
+	}
+
+	ret = &Value{ID: valueID, KeyID: keyID, BlockID: blockID, Type: typ}
+
+	createdStr := valueID[:len("20060102150405")]
+	created, parseErr := time.ParseInLocation("20060102150405", createdStr, time.Local)
+	if nil == parseErr {
+		ret.CreatedAt = created.UnixMilli()
+	} else {
+		ret.CreatedAt = time.Now().UnixMilli()
+	}
+	if 0 == ret.UpdatedAt {
+		ret.UpdatedAt = ret.CreatedAt
+	}
+
+	switch typ {
+	case KeyTypeText:
+		ret.Text = &ValueText{}
+	case KeyTypeNumber:
+		ret.Number = &ValueNumber{}
+	case KeyTypeDate:
+		ret.Date = &ValueDate{}
+	case KeyTypeSelect:
+		ret.MSelect = []*ValueSelect{}
+	case KeyTypeMSelect:
+		ret.MSelect = []*ValueSelect{}
+	case KeyTypeURL:
+		ret.URL = &ValueURL{}
+	case KeyTypeEmail:
+		ret.Email = &ValueEmail{}
+	case KeyTypePhone:
+		ret.Phone = &ValuePhone{}
+	case KeyTypeMAsset:
+		ret.MAsset = []*ValueAsset{}
+	case KeyTypeTemplate:
+		ret.Template = &ValueTemplate{}
+	case KeyTypeCreated:
+		ret.Created = &ValueCreated{}
+	case KeyTypeUpdated:
+		ret.Updated = &ValueUpdated{}
+	case KeyTypeCheckbox:
+		ret.Checkbox = &ValueCheckbox{}
+	case KeyTypeRelation:
+		ret.Relation = &ValueRelation{}
+	case KeyTypeRollup:
+		ret.Rollup = &ValueRollup{}
+	}
+	return
+}

+ 30 - 12
kernel/model/attribute_view.go

@@ -18,6 +18,7 @@ package model
 
 import (
 	"bytes"
+	"fmt"
 	"os"
 	"path/filepath"
 	"sort"
@@ -398,7 +399,7 @@ func GetBlockAttributeViewKeys(blockID string) (ret []*BlockAttributeViewKeys) {
 				keyValues = append(keyValues, kValues)
 			} else {
 				// 如果没有值,那么就补一个默认值
-				kValues.Values = append(kValues.Values, treenode.GetAttributeViewDefaultValue(ast.NewNodeID(), kv.Key.ID, blockID, kv.Key.Type))
+				kValues.Values = append(kValues.Values, av.GetAttributeViewDefaultValue(ast.NewNodeID(), kv.Key.ID, blockID, kv.Key.Type))
 				keyValues = append(keyValues, kValues)
 			}
 		}
@@ -426,7 +427,7 @@ func GetBlockAttributeViewKeys(blockID string) (ret []*BlockAttributeViewKeys) {
 							destVal := destAv.GetValue(kv.Key.Rollup.KeyID, bID)
 							if nil == destVal {
 								if destAv.ExistBlock(bID) { // 数据库中存在行但是列值不存在是数据未初始化,这里补一个默认值
-									destVal = treenode.GetAttributeViewDefaultValue(ast.NewNodeID(), kv.Key.Rollup.KeyID, bID, destKey.Type)
+									destVal = av.GetAttributeViewDefaultValue(ast.NewNodeID(), kv.Key.Rollup.KeyID, bID, destKey.Type)
 								}
 								if nil == destVal {
 									continue
@@ -499,6 +500,7 @@ func GetBlockAttributeViewKeys(blockID string) (ret []*BlockAttributeViewKeys) {
 		//}
 
 		// 渲染模板
+		var renderTemplateErr error
 		for _, kv := range keyValues {
 			switch kv.Key.Type {
 			case av.KeyTypeTemplate:
@@ -509,10 +511,17 @@ func GetBlockAttributeViewKeys(blockID string) (ret []*BlockAttributeViewKeys) {
 						ial = GetBlockAttrsWithoutWaitWriting(block.BlockID)
 					}
 
-					kv.Values[0].Template.Content = renderTemplateCol(ial, flashcard, keyValues, kv.Key.Template)
+					var renderErr error
+					kv.Values[0].Template.Content, renderErr = renderTemplateCol(ial, flashcard, keyValues, kv.Key.Template)
+					if nil != renderErr {
+						renderTemplateErr = renderErr
+					}
 				}
 			}
 		}
+		if nil != renderTemplateErr {
+			util.PushErrMsg(fmt.Sprintf(Conf.Language(44), util.EscapeHTML(renderTemplateErr.Error())), 30000)
+		}
 
 		// Attribute Panel - Database sort attributes by view column order https://github.com/siyuan-note/siyuan/issues/9319
 		viewID := attrs[av.NodeAttrView]
@@ -839,7 +848,7 @@ func renderAttributeView(attrView *av.AttributeView, viewID, query string, page,
 	return
 }
 
-func renderTemplateCol(ial map[string]string, flashcard *Flashcard, rowValues []*av.KeyValues, tplContent string) string {
+func renderTemplateCol(ial map[string]string, flashcard *Flashcard, rowValues []*av.KeyValues, tplContent string) (ret string, err error) {
 	if "" == ial["id"] {
 		block := getRowBlockValue(rowValues)
 		if nil != block && nil != block.Block {
@@ -857,10 +866,10 @@ func renderTemplateCol(ial map[string]string, flashcard *Flashcard, rowValues []
 	tplFuncMap := util.BuiltInTemplateFuncs()
 	SQLTemplateFuncs(&tplFuncMap)
 	goTpl = goTpl.Funcs(tplFuncMap)
-	tpl, tplErr := goTpl.Parse(tplContent)
-	if nil != tplErr {
-		logging.LogWarnf("parse template [%s] failed: %s", tplContent, tplErr)
-		return ""
+	tpl, err := goTpl.Parse(tplContent)
+	if nil != err {
+		logging.LogWarnf("parse template [%s] failed: %s", tplContent, err)
+		return
 	}
 
 	buf := &bytes.Buffer{}
@@ -943,10 +952,12 @@ func renderTemplateCol(ial map[string]string, flashcard *Flashcard, rowValues []
 		}
 	}
 
-	if err := tpl.Execute(buf, dataModel); nil != err {
+	if err = tpl.Execute(buf, dataModel); nil != err {
 		logging.LogWarnf("execute template [%s] failed: %s", tplContent, err)
+		return
 	}
-	return buf.String()
+	ret = buf.String()
+	return
 }
 
 func renderAttributeViewTable(attrView *av.AttributeView, view *av.View, query string) (ret *av.Table, err error) {
@@ -1118,7 +1129,7 @@ func renderAttributeViewTable(attrView *av.AttributeView, view *av.View, query s
 					destVal := destAv.GetValue(rollupKey.Rollup.KeyID, blockID)
 					if nil == destVal {
 						if destAv.ExistBlock(blockID) { // 数据库中存在行但是列值不存在是数据未初始化,这里补一个默认值
-							destVal = treenode.GetAttributeViewDefaultValue(ast.NewNodeID(), rollupKey.Rollup.KeyID, blockID, destKey.Type)
+							destVal = av.GetAttributeViewDefaultValue(ast.NewNodeID(), rollupKey.Rollup.KeyID, blockID, destKey.Type)
 						}
 						if nil == destVal {
 							continue
@@ -1219,6 +1230,7 @@ func renderAttributeViewTable(attrView *av.AttributeView, view *av.View, query s
 	//	}
 	//}
 
+	var renderTemplateErr error
 	for _, row := range ret.Rows {
 		for _, cell := range row.Cells {
 			switch cell.ValueType {
@@ -1229,11 +1241,17 @@ func renderAttributeViewTable(attrView *av.AttributeView, view *av.View, query s
 				if nil != block && !block.IsDetached {
 					ial = GetBlockAttrsWithoutWaitWriting(row.ID)
 				}
-				content := renderTemplateCol(ial, flashcards[row.ID], keyValues, cell.Value.Template.Content)
+				content, renderErr := renderTemplateCol(ial, flashcards[row.ID], keyValues, cell.Value.Template.Content)
 				cell.Value.Template.Content = content
+				if nil != renderErr {
+					renderTemplateErr = renderErr
+				}
 			}
 		}
 	}
+	if nil != renderTemplateErr {
+		util.PushErrMsg(fmt.Sprintf(Conf.Language(44), util.EscapeHTML(renderTemplateErr.Error())), 30000)
+	}
 
 	// 根据搜索条件过滤
 	query = strings.TrimSpace(query)

+ 2 - 55
kernel/treenode/node.go

@@ -765,7 +765,7 @@ func renderAttributeViewTable(attrView *av.AttributeView, view *av.View) (ret *a
 					destVal := destAv.GetValue(rollupKey.Rollup.KeyID, blockID)
 					if nil == destVal {
 						if destAv.ExistBlock(blockID) { // 数据库中存在行但是列值不存在是数据未初始化,这里补一个默认值
-							destVal = GetAttributeViewDefaultValue(ast.NewNodeID(), rollupKey.Rollup.KeyID, blockID, destKey.Type)
+							destVal = av.GetAttributeViewDefaultValue(ast.NewNodeID(), rollupKey.Rollup.KeyID, blockID, destKey.Type)
 						}
 						if nil == destVal {
 							continue
@@ -870,7 +870,7 @@ func renderAttributeViewTable(attrView *av.AttributeView, view *av.View) (ret *a
 
 func FillAttributeViewTableCellNilValue(tableCell *av.TableCell, rowID, colID string) {
 	if nil == tableCell.Value {
-		tableCell.Value = GetAttributeViewDefaultValue(tableCell.ID, colID, rowID, tableCell.ValueType)
+		tableCell.Value = av.GetAttributeViewDefaultValue(tableCell.ID, colID, rowID, tableCell.ValueType)
 		return
 	}
 
@@ -939,59 +939,6 @@ func FillAttributeViewTableCellNilValue(tableCell *av.TableCell, rowID, colID st
 	}
 }
 
-func GetAttributeViewDefaultValue(valueID, keyID, blockID string, typ av.KeyType) (ret *av.Value) {
-	if "" == valueID {
-		valueID = ast.NewNodeID()
-	}
-
-	ret = &av.Value{ID: valueID, KeyID: keyID, BlockID: blockID, Type: typ}
-
-	createdStr := valueID[:len("20060102150405")]
-	created, parseErr := time.ParseInLocation("20060102150405", createdStr, time.Local)
-	if nil == parseErr {
-		ret.CreatedAt = created.UnixMilli()
-	} else {
-		ret.CreatedAt = time.Now().UnixMilli()
-	}
-	if 0 == ret.UpdatedAt {
-		ret.UpdatedAt = ret.CreatedAt
-	}
-
-	switch typ {
-	case av.KeyTypeText:
-		ret.Text = &av.ValueText{}
-	case av.KeyTypeNumber:
-		ret.Number = &av.ValueNumber{}
-	case av.KeyTypeDate:
-		ret.Date = &av.ValueDate{}
-	case av.KeyTypeSelect:
-		ret.MSelect = []*av.ValueSelect{}
-	case av.KeyTypeMSelect:
-		ret.MSelect = []*av.ValueSelect{}
-	case av.KeyTypeURL:
-		ret.URL = &av.ValueURL{}
-	case av.KeyTypeEmail:
-		ret.Email = &av.ValueEmail{}
-	case av.KeyTypePhone:
-		ret.Phone = &av.ValuePhone{}
-	case av.KeyTypeMAsset:
-		ret.MAsset = []*av.ValueAsset{}
-	case av.KeyTypeTemplate:
-		ret.Template = &av.ValueTemplate{}
-	case av.KeyTypeCreated:
-		ret.Created = &av.ValueCreated{}
-	case av.KeyTypeUpdated:
-		ret.Updated = &av.ValueUpdated{}
-	case av.KeyTypeCheckbox:
-		ret.Checkbox = &av.ValueCheckbox{}
-	case av.KeyTypeRelation:
-		ret.Relation = &av.ValueRelation{}
-	case av.KeyTypeRollup:
-		ret.Rollup = &av.ValueRollup{}
-	}
-	return
-}
-
 func renderTemplateCol(ial map[string]string, rowValues []*av.KeyValues, tplContent string) string {
 	if "" == ial["id"] {
 		block := getRowBlockValue(rowValues)