Kaynağa Gözat

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

Vanessa 1 yıl önce
ebeveyn
işleme
30cfb66b95

+ 2 - 2
app/src/protyle/render/av/col.ts

@@ -36,8 +36,8 @@ export const duplicateCol = (options: {
     const blockId = options.blockElement.getAttribute("data-node-id");
     transaction(options.protyle, [{
         action: "duplicateAttrViewKey",
-        keyID:newColData.id,
-        nextID:options.colId,
+        keyID: options.colId,
+        nextID: newColData.id,
         avID: options.data.id,
     }, {
         action: "doUpdateUpdated",

Dosya farkı çok büyük olduğundan ihmal edildi
+ 0 - 0
app/stage/protyle/js/lute/lute.min.js


+ 0 - 17
kernel/av/av.go

@@ -19,11 +19,8 @@ package av
 
 import (
 	"errors"
-	"fmt"
 	"os"
 	"path/filepath"
-	"regexp"
-	"strconv"
 	"strings"
 	"time"
 
@@ -644,20 +641,6 @@ func (av *AttributeView) GetBlockKey() (ret *Key) {
 	return
 }
 
-func (av *AttributeView) GetDuplicateViewName(masterViewName string) (ret string) {
-	ret = masterViewName + " (1)"
-	r := regexp.MustCompile("^(.*) \\((\\d+)\\)$")
-	m := r.FindStringSubmatch(masterViewName)
-	if nil == m || 3 > len(m) {
-		return
-	}
-
-	num, _ := strconv.Atoi(m[2])
-	num++
-	ret = fmt.Sprintf("%s (%d)", m[1], num)
-	return
-}
-
 func (av *AttributeView) ShallowClone() (ret *AttributeView) {
 	ret = &AttributeView{}
 	data, err := gulu.JSON.MarshalJSON(av)

+ 60 - 3
kernel/model/attribute_view.go

@@ -30,6 +30,7 @@ import (
 	"github.com/88250/gulu"
 	"github.com/88250/lute/ast"
 	"github.com/88250/lute/parse"
+	"github.com/jinzhu/copier"
 	"github.com/siyuan-note/dejavu/entity"
 	"github.com/siyuan-note/filelock"
 	"github.com/siyuan-note/logging"
@@ -951,7 +952,7 @@ func renderAttributeView(attrView *av.AttributeView, viewID, query string, page,
 		}
 		view.Table.Sorts = tmpSorts
 
-		viewable, err = sql.RenderAttributeViewTable(attrView, view, query, GetBlockAttrsWithoutWaitWriting)
+		viewable = sql.RenderAttributeViewTable(attrView, view, query, GetBlockAttrsWithoutWaitWriting)
 	}
 
 	viewable.FilterRows(attrView)
@@ -1500,7 +1501,7 @@ func (tx *Transaction) doDuplicateAttrViewView(operation *Operation) (ret *TxErr
 	attrView.ViewID = view.ID
 
 	view.Icon = masterView.Icon
-	view.Name = attrView.GetDuplicateViewName(masterView.Name)
+	view.Name = util.GetDuplicateName(masterView.Name)
 	view.LayoutType = masterView.LayoutType
 	view.HideAttrViewName = masterView.HideAttrViewName
 
@@ -1965,7 +1966,7 @@ func addAttributeViewBlock(now int64, avID, blockID, previousBlockID, addingBloc
 	// 如果存在过滤条件,则将过滤条件应用到新添加的块上
 	view, _ := getAttrViewViewByBlockID(attrView, blockID)
 	if nil != view && 0 < len(view.Table.Filters) && !ignoreFillFilter {
-		viewable, _ := sql.RenderAttributeViewTable(attrView, view, "", GetBlockAttrsWithoutWaitWriting)
+		viewable := sql.RenderAttributeViewTable(attrView, view, "", GetBlockAttrsWithoutWaitWriting)
 		viewable.FilterRows(attrView)
 		viewable.SortRows(attrView)
 
@@ -2179,6 +2180,62 @@ func removeNodeAvID(node *ast.Node, avID string, tx *Transaction, tree *parse.Tr
 	return
 }
 
+func (tx *Transaction) doDuplicateAttrViewKey(operation *Operation) (ret *TxErr) {
+	err := duplicateAttributeViewKey(operation)
+	if nil != err {
+		return &TxErr{code: TxErrWriteAttributeView, id: operation.AvID, msg: err.Error()}
+	}
+	return
+}
+
+func duplicateAttributeViewKey(operation *Operation) (err error) {
+	attrView, err := av.ParseAttributeView(operation.AvID)
+	if nil != err {
+		return
+	}
+
+	key, _ := attrView.GetKey(operation.KeyID)
+	if nil == key {
+		return
+	}
+
+	if av.KeyTypeBlock == key.Type || av.KeyTypeRelation == key.Type || av.KeyTypeRollup == key.Type {
+		return
+	}
+
+	copyKey := &av.Key{}
+	if err = copier.Copy(copyKey, key); nil != err {
+		logging.LogErrorf("clone key failed: %s", err)
+	}
+	copyKey.ID = operation.NextID
+	copyKey.Name = util.GetDuplicateName(key.Name)
+
+	attrView.KeyValues = append(attrView.KeyValues, &av.KeyValues{Key: copyKey})
+
+	for _, view := range attrView.Views {
+		switch view.LayoutType {
+		case av.LayoutTypeTable:
+			for i, column := range view.Table.Columns {
+				if column.ID == key.ID {
+					view.Table.Columns = append(view.Table.Columns[:i+1], append([]*av.ViewTableColumn{
+						{
+							ID:     copyKey.ID,
+							Wrap:   column.Wrap,
+							Hidden: column.Hidden,
+							Pin:    column.Pin,
+							Width:  column.Width,
+						},
+					}, view.Table.Columns[i+1:]...)...)
+					break
+				}
+			}
+		}
+	}
+
+	err = av.SaveAttributeView(attrView)
+	return
+}
+
 func (tx *Transaction) doSetAttrViewColumnWidth(operation *Operation) (ret *TxErr) {
 	err := setAttributeViewColWidth(operation)
 	if nil != err {

+ 2 - 10
kernel/model/export.go

@@ -75,11 +75,7 @@ func ExportAv2CSV(avID, blockID string) (zipPath string, err error) {
 	}
 
 	name := util.FilterFileName(getAttrViewName(attrView))
-	table, err := sql.RenderAttributeViewTable(attrView, view, "", GetBlockAttrsWithoutWaitWriting)
-	if nil != err {
-		logging.LogErrorf("render attribute view [%s] table failed: %s", avID, err)
-		return
-	}
+	table := sql.RenderAttributeViewTable(attrView, view, "", GetBlockAttrsWithoutWaitWriting)
 
 	// 遵循视图过滤和排序规则 Use filtering and sorting of current view settings when exporting database blocks https://github.com/siyuan-note/siyuan/issues/10474
 	table.FilterRows(attrView)
@@ -2237,11 +2233,7 @@ func exportTree(tree *parse.Tree, wysiwyg, keepFold bool,
 			return ast.WalkContinue
 		}
 
-		table, err := sql.RenderAttributeViewTable(attrView, view, "", GetBlockAttrsWithoutWaitWriting)
-		if nil != err {
-			logging.LogErrorf("render attribute view [%s] table failed: %s", avID, err)
-			return ast.WalkContinue
-		}
+		table := sql.RenderAttributeViewTable(attrView, view, "", GetBlockAttrsWithoutWaitWriting)
 
 		// 遵循视图过滤和排序规则 Use filtering and sorting of current view settings when exporting database blocks https://github.com/siyuan-note/siyuan/issues/10474
 		table.FilterRows(attrView)

+ 1 - 5
kernel/model/template.go

@@ -314,11 +314,7 @@ func RenderTemplate(p, id string, preview bool) (tree *parse.Tree, dom string, e
 						return ast.WalkContinue
 					}
 
-					table, renderErr := sql.RenderAttributeViewTable(attrView, view, "", GetBlockAttrsWithoutWaitWriting)
-					if nil != renderErr {
-						logging.LogErrorf("render attribute view [%s] table failed: %s", n.AttributeViewID, renderErr)
-						return ast.WalkContinue
-					}
+					table := sql.RenderAttributeViewTable(attrView, view, "", GetBlockAttrsWithoutWaitWriting)
 
 					var aligns []int
 					for range table.Columns {

+ 2 - 0
kernel/model/transaction.go

@@ -298,6 +298,8 @@ func performTx(tx *Transaction) (ret *TxErr) {
 			ret = tx.doSetAttrViewColDate(op)
 		case "unbindAttrViewBlock":
 			ret = tx.doUnbindAttrViewBlock(op)
+		case "duplicateAttrViewKey":
+			ret = tx.doDuplicateAttrViewKey(op)
 		}
 
 		if nil != ret {

+ 17 - 9
kernel/sql/av.go

@@ -33,7 +33,7 @@ import (
 )
 
 func RenderAttributeViewTable(attrView *av.AttributeView, view *av.View, query string,
-	GetBlockAttrsWithoutWaitWriting func(id string) (ret map[string]string)) (ret *av.Table, err error) {
+	GetBlockAttrsWithoutWaitWriting func(id string) (ret map[string]string)) (ret *av.Table) {
 	if nil == GetBlockAttrsWithoutWaitWriting {
 		GetBlockAttrsWithoutWaitWriting = func(id string) (ret map[string]string) {
 			ret = cache.GetBlockIAL(id)
@@ -59,8 +59,21 @@ func RenderAttributeViewTable(attrView *av.AttributeView, view *av.View, query s
 	for _, col := range view.Table.Columns {
 		key, getErr := attrView.GetKey(col.ID)
 		if nil != getErr {
-			err = getErr
-			return
+			// 找不到字段则在视图中删除
+
+			switch view.LayoutType {
+			case av.LayoutTypeTable:
+				for i, column := range view.Table.Columns {
+					if column.ID == col.ID {
+						view.Table.Columns = append(view.Table.Columns[:i], view.Table.Columns[i+1:]...)
+						break
+					}
+				}
+			}
+
+			logging.LogWarnf("get key [%s] failed: %s", col.ID, getErr)
+			av.SaveAttributeView(attrView)
+			continue
 		}
 
 		ret.Columns = append(ret.Columns, &av.TableColumn{
@@ -587,12 +600,7 @@ func getAttributeViewContent(avID string,
 		return
 	}
 
-	table, err := RenderAttributeViewTable(attrView, view, "", GetBlockAttrsWithoutWaitWriting)
-	if nil != err {
-		content = strings.TrimSpace(buf.String())
-		return
-	}
-
+	table := RenderAttributeViewTable(attrView, view, "", GetBlockAttrsWithoutWaitWriting)
 	for _, col := range table.Columns {
 		buf.WriteString(col.Name)
 		buf.WriteByte(' ')

+ 16 - 0
kernel/util/misc.go

@@ -18,7 +18,9 @@ package util
 
 import (
 	"bytes"
+	"fmt"
 	"math/rand"
+	"regexp"
 	"strconv"
 	"strings"
 	"time"
@@ -32,6 +34,20 @@ func init() {
 	rand.Seed(time.Now().UTC().UnixNano())
 }
 
+func GetDuplicateName(master string) (ret string) {
+	ret = master + " (1)"
+	r := regexp.MustCompile("^(.*) \\((\\d+)\\)$")
+	m := r.FindStringSubmatch(master)
+	if nil == m || 3 > len(m) {
+		return
+	}
+
+	num, _ := strconv.Atoi(m[2])
+	num++
+	ret = fmt.Sprintf("%s (%d)", m[1], num)
+	return
+}
+
 var (
 	letter = []rune("abcdefghijklmnopqrstuvwxyz0123456789")
 )

Bu fark içinde çok fazla dosya değişikliği olduğu için bazı dosyalar gösterilmiyor