diff --git a/kernel/model/attribute_view.go b/kernel/model/attribute_view.go index 6c93c4b04..08e34e241 100644 --- a/kernel/model/attribute_view.go +++ b/kernel/model/attribute_view.go @@ -885,6 +885,47 @@ func removeAttributeViewColumn(operation *Operation) (err error) { return } +func (tx *Transaction) doReplaceAttrViewBlock(operation *Operation) (ret *TxErr) { + err := replaceAttributeViewBlock(operation) + if nil != err { + return &TxErr{code: TxErrWriteAttributeView, id: operation.AvID} + } + return +} + +func replaceAttributeViewBlock(operation *Operation) (err error) { + attrView, err := av.ParseAttributeView(operation.AvID) + if nil != err { + return + } + + for _, keyValues := range attrView.KeyValues { + for _, value := range keyValues.Values { + if value.BlockID == operation.PreviousID { + value.BlockID = operation.NextID + if nil != value.Block { + value.Block.ID = operation.NextID + value.IsDetached = operation.IsDetached + } + } + } + } + + for _, v := range attrView.Views { + switch v.LayoutType { + case av.LayoutTypeTable: + for i, rowID := range v.Table.RowIDs { + if rowID == operation.PreviousID { + v.Table.RowIDs[i] = operation.NextID + } + } + } + } + + err = av.SaveAttributeView(attrView) + return +} + func (tx *Transaction) doUpdateAttrViewCell(operation *Operation) (ret *TxErr) { err := updateAttributeViewCell(operation, tx) if nil != err { diff --git a/kernel/model/transaction.go b/kernel/model/transaction.go index 18c455cf3..ab6c43db0 100644 --- a/kernel/model/transaction.go +++ b/kernel/model/transaction.go @@ -260,6 +260,8 @@ func performTx(tx *Transaction) (ret *TxErr) { ret = tx.doSetAttrViewColCalc(op) case "updateAttrViewColNumberFormat": ret = tx.doUpdateAttrViewColNumberFormat(op) + case "replaceAttrViewBlock": + ret = tx.doReplaceAttrViewBlock(op) } if nil != ret {