diff --git a/kernel/av/av.go b/kernel/av/av.go index 20a9a05b0..11cff4a09 100644 --- a/kernel/av/av.go +++ b/kernel/av/av.go @@ -747,6 +747,29 @@ func (av *AttributeView) GetBlockKey() (ret *Key) { return } +func (av *AttributeView) GetDuplicateViewName(masterViewName string) string { + count := 1 + ret := masterViewName + " (" + strconv.Itoa(count) + ")" + + existViewByName := func(name string) bool { + for _, v := range av.Views { + if v.Name == name { + return true + } + } + return false + } + + for i := 0; i < 32; i++ { + if !existViewByName(ret) { + return ret + } + count++ + ret = masterViewName + " (" + strconv.Itoa(count) + ")" + } + return ret +} + func GetAttributeViewDataPath(avID string) (ret string) { av := filepath.Join(util.DataDir, "storage", "av") ret = filepath.Join(av, avID+".json") diff --git a/kernel/model/attribute_view.go b/kernel/model/attribute_view.go index b76c235ca..079c327bd 100644 --- a/kernel/model/attribute_view.go +++ b/kernel/model/attribute_view.go @@ -687,7 +687,7 @@ func (tx *Transaction) doDuplicateAttrViewView(operation *Operation) (ret *TxErr attrView.ViewID = view.ID view.Icon = masterView.Icon - view.Name = masterView.Name + view.Name = attrView.GetDuplicateViewName(masterView.Name) view.LayoutType = masterView.LayoutType for _, col := range masterView.Table.Columns { @@ -716,7 +716,6 @@ func (tx *Transaction) doDuplicateAttrViewView(operation *Operation) (ret *TxErr }) } - attrView.ViewID = view.ID if err = av.SaveAttributeView(attrView); nil != err { logging.LogErrorf("save attribute view [%s] failed: %s", avID, err) return &TxErr{code: TxErrWriteAttributeView, msg: err.Error(), id: avID} @@ -748,7 +747,6 @@ func (tx *Transaction) doAddAttrViewView(operation *Operation) (ret *TxErr) { view.Table.Columns = append(view.Table.Columns, &av.ViewTableColumn{ID: col.ID}) } - attrView.ViewID = view.ID if err = av.SaveAttributeView(attrView); nil != err { logging.LogErrorf("save attribute view [%s] failed: %s", avID, err) return &TxErr{code: TxErrWriteAttributeView, msg: err.Error(), id: avID}