Merge remote-tracking branch 'origin/dev' into dev
This commit is contained in:
commit
30cfb66b95
9 changed files with 101 additions and 47 deletions
|
@ -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",
|
||||
|
|
2
app/stage/protyle/js/lute/lute.min.js
vendored
2
app/stage/protyle/js/lute/lute.min.js
vendored
File diff suppressed because one or more lines are too long
|
@ -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)
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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(' ')
|
||||
|
|
|
@ -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")
|
||||
)
|
||||
|
|
Loading…
Add table
Reference in a new issue