diff --git a/kernel/av/av.go b/kernel/av/av.go index 94f9cc39f..9fb1adb80 100644 --- a/kernel/av/av.go +++ b/kernel/av/av.go @@ -189,7 +189,7 @@ type View struct { Gallery *LayoutGallery `json:"gallery,omitempty"` // 画廊布局 } -// LayoutType 描述了视图布局的类型。 +// LayoutType 描述了视图布局类型。 type LayoutType string const ( @@ -619,8 +619,9 @@ func getI18nName(name string) string { } var ( - ErrViewNotFound = errors.New("view not found") - ErrKeyNotFound = errors.New("key not found") + ErrViewNotFound = errors.New("view not found") + ErrKeyNotFound = errors.New("key not found") + ErrWrongLayoutType = errors.New("wrong layout type") ) const ( diff --git a/kernel/model/attribute_view.go b/kernel/model/attribute_view.go index b658d6037..f31ca7f1b 100644 --- a/kernel/model/attribute_view.go +++ b/kernel/model/attribute_view.go @@ -1559,17 +1559,54 @@ func (tx *Transaction) doAddAttrViewView(operation *Operation) (ret *TxErr) { return } - view := av.NewTableView() + var view *av.View + switch operation.Layout { + case av.LayoutTypeTable: + view = av.NewTableView() + switch firstView.LayoutType { + case av.LayoutTypeTable: + for _, col := range firstView.Table.Columns { + view.Table.Columns = append(view.Table.Columns, &av.ViewTableColumn{ID: col.ID}) + } + for _, rowID := range firstView.Table.RowIDs { + view.Table.RowIDs = append(view.Table.RowIDs, rowID) + } + case av.LayoutTypeGallery: + for _, field := range firstView.Gallery.CardFields { + view.Table.Columns = append(view.Table.Columns, &av.ViewTableColumn{ID: field.ID}) + } + for _, cardID := range firstView.Gallery.CardIDs { + view.Table.RowIDs = append(view.Table.RowIDs, cardID) + } + } + case av.LayoutTypeGallery: + view = av.NewGalleryView() + switch firstView.LayoutType { + case av.LayoutTypeTable: + for _, col := range firstView.Table.Columns { + view.Gallery.CardFields = append(view.Gallery.CardFields, &av.ViewGalleryCardField{ID: col.ID}) + } + for _, rowID := range firstView.Table.RowIDs { + view.Gallery.CardIDs = append(view.Gallery.CardIDs, rowID) + } + case av.LayoutTypeGallery: + for _, field := range firstView.Gallery.CardFields { + view.Gallery.CardFields = append(view.Gallery.CardFields, &av.ViewGalleryCardField{ID: field.ID}) + } + for _, cardID := range firstView.Gallery.CardIDs { + view.Gallery.CardIDs = append(view.Gallery.CardIDs, cardID) + } + } + default: + err = av.ErrWrongLayoutType + logging.LogErrorf("wrong layout type [%s] for attribute view [%s]", operation.Layout, avID) + return + } + view.ID = operation.ID attrView.Views = append(attrView.Views, view) attrView.ViewID = view.ID - for _, col := range firstView.Table.Columns { - view.Table.Columns = append(view.Table.Columns, &av.ViewTableColumn{ID: col.ID}) - } - - view.Table.RowIDs = firstView.Table.RowIDs - if err = av.SaveAttributeView(attrView); err != nil { logging.LogErrorf("save attribute view [%s] failed: %s", avID, err) return &TxErr{code: TxErrWriteAttributeView, msg: err.Error(), id: avID} diff --git a/kernel/model/transaction.go b/kernel/model/transaction.go index 11fa2de0e..c911617e3 100644 --- a/kernel/model/transaction.go +++ b/kernel/model/transaction.go @@ -1482,6 +1482,7 @@ type Operation struct { IsTwoWay bool `json:"isTwoWay"` // 属性视图关联列是否是双向关系 BackRelationKeyID string `json:"backRelationKeyID"` // 属性视图关联列回链关联列的 ID RemoveDest bool `json:"removeDest"` // 属性视图删除关联目标 + Layout av.LayoutType `json:"layout"` // 属性视图布局类型 } type Transaction struct {