diff --git a/kernel/av/attribute_view.go b/kernel/av/attribute_view.go index 7d6056366..ef9157014 100644 --- a/kernel/av/attribute_view.go +++ b/kernel/av/attribute_view.go @@ -37,38 +37,38 @@ type AttributeView struct { Columns []*Column `json:"columns"` // 列 Rows []*Row `json:"rows"` // 行 - CurrentViewID string `json:"currentViewId"` // 当前视图 ID + CurrentViewID string `json:"currentViewID"` // 当前视图 ID Views []*View `json:"views"` // 视图 } // View 描述了视图的结构。 type View struct { - ID string `json:"id"` // 视图 ID - Name string `json:"name"` // 视图名称 - Type ViewType `json:"type"` // 视图类型 + ID string `json:"id"` // 视图 ID + Name string `json:"name"` // 视图名称 - Table *Table `json:"table,omitempty"` // 表格视图 - // TODO Kanban *Kanban `json:"kanban,omitempty"` // 看板视图 + CurrentLayoutID string `json:"CurrentLayoutID"` // 当前布局 ID + CurrentLayoutType LayoutType `json:"type"` // 当前布局类型 + Table *LayoutTable `json:"table,omitempty"` // 表格布局 } -// ViewType 描述了视图的类型。 -type ViewType string +// LayoutType 描述了视图布局的类型。 +type LayoutType string const ( - ViewTypeTable ViewType = "table" // 属性视图类型 - 表格 - ViewTypeKanban ViewType = "kanban" // 属性视图类型 - 看板 + LayoutTypeTable LayoutType = "table" // 属性视图类型 - 表格 ) func NewView() *View { - id := ast.NewNodeID() name := "Table" + layoutID := ast.NewNodeID() return &View{ - ID: id, - Name: name, - Type: ViewTypeTable, - Table: &Table{ + ID: ast.NewNodeID(), + Name: name, + CurrentLayoutID: layoutID, + CurrentLayoutType: LayoutTypeTable, + Table: &LayoutTable{ Spec: 0, - ID: id, + ID: layoutID, Filters: []*ViewFilter{}, Sorts: []*ViewSort{}, }, @@ -81,7 +81,7 @@ type Viewable interface { Sortable Calculable - GetType() ViewType + GetType() LayoutType GetID() string } diff --git a/kernel/av/table.go b/kernel/av/table.go index 884b32eb7..48101421d 100644 --- a/kernel/av/table.go +++ b/kernel/av/table.go @@ -21,13 +21,14 @@ import ( "sort" ) -// Table 描述了表格视图的结构。 -type Table struct { - Spec int `json:"spec"` // 视图格式版本 - ID string `json:"id"` // 视图 ID +// LayoutTable 描述了表格布局的结构。 +type LayoutTable struct { + Spec int `json:"spec"` // 布局格式版本 + ID string `json:"id"` // 布局 ID Columns []*TableColumn `json:"columns"` // 表格列 - Rows []*TableRow `json:"rows"` // 表格行 + ColIDs []string `json:"colIds"` // 列 ID,用于自定义排序 + RowIDs []string `json:"rowIds"` // 行 ID,用于自定义排序 Filters []*ViewFilter `json:"filters"` // 过滤规则 Sorts []*ViewSort `json:"sorts"` // 排序规则 } @@ -49,8 +50,18 @@ type TableRow struct { Cells []*Cell `json:"cells"` } -func (table *Table) GetType() ViewType { - return ViewTypeTable +// Table 描述了表格实例的结构。 +type Table struct { + ID string `json:"id"` // 表格布局 ID + Name string `json:"name"` // 表格名称 + Filters []*ViewFilter `json:"filters"` // 过滤规则 + Sorts []*ViewSort `json:"sorts"` // 排序规则 + Columns []*TableColumn `json:"columns"` // 表格列 + Rows []*TableRow `json:"rows"` // 表格行 +} + +func (table *Table) GetType() LayoutType { + return LayoutTypeTable } func (table *Table) GetID() string { diff --git a/kernel/model/attribute_view.go b/kernel/model/attribute_view.go index dca5c7975..9a937a94a 100644 --- a/kernel/model/attribute_view.go +++ b/kernel/model/attribute_view.go @@ -58,8 +58,8 @@ func RenderAttributeView(avID string) (viewable av.Viewable, attrView *av.Attrib view = attrView.Views[0] } - switch view.Type { - case av.ViewTypeTable: + switch view.CurrentLayoutType { + case av.LayoutTypeTable: viewable, err = renderAttributeViewTable(attrView, view) } @@ -70,7 +70,13 @@ func RenderAttributeView(avID string) (viewable av.Viewable, attrView *av.Attrib } func renderAttributeViewTable(attrView *av.AttributeView, view *av.View) (ret *av.Table, err error) { - ret = view.Table + ret = &av.Table{ + ID: view.Table.ID, + Name: view.Name, + Filters: view.Table.Filters, + Sorts: view.Table.Sorts, + } + for _, avRow := range attrView.Rows { row := &av.TableRow{ID: avRow.ID, Cells: avRow.Cells} ret.Rows = append(ret.Rows, row) @@ -404,27 +410,32 @@ func sortAttributeViewRow(operation *Operation) (err error) { return } - var row *av.Row + view, err := attrView.GetView(operation.ViewID) + if nil != err { + return + } + + var rowID string var index, previousIndex int - for i, r := range attrView.Rows { - if r.ID == operation.ID { - row = r + for i, r := range view.Table.RowIDs { + if r == operation.ID { + rowID = r index = i break } } - if nil == row { + if "" == rowID { return } - attrView.Rows = append(attrView.Rows[:index], attrView.Rows[index+1:]...) - for i, r := range attrView.Rows { - if r.ID == operation.PreviousID { + view.Table.RowIDs = append(view.Table.RowIDs[:index], view.Table.RowIDs[index+1:]...) + for i, r := range view.Table.RowIDs { + if r == operation.PreviousID { previousIndex = i + 1 break } } - attrView.Rows = util.InsertElem(attrView.Rows, previousIndex, row) + view.Table.RowIDs = util.InsertElem(view.Table.RowIDs, previousIndex, rowID) err = av.SaveAttributeView(attrView) return @@ -444,6 +455,11 @@ func sortAttributeViewColumn(operation *Operation) (err error) { return } + view, err := attrView.GetView(operation.ViewID) + if nil != err { + return + } + var col *av.Column var index, previousIndex int for i, column := range attrView.Columns { @@ -561,7 +577,6 @@ func updateAttributeViewColumn(operation *Operation) (err error) { return } - func (tx *Transaction) doRemoveAttrViewColumn(operation *Operation) (ret *TxErr) { err := removeAttributeViewColumn(operation) if nil != err { @@ -694,7 +709,6 @@ func (tx *Transaction) doUpdateAttrViewColOptions(operation *Operation) (ret *Tx return } - func (tx *Transaction) doSetAttrView(operation *Operation) (ret *TxErr) { err := setAttributeView(operation) if nil != err {