♻️ Refactor av

This commit is contained in:
Daniel 2025-06-08 17:22:03 +08:00
parent 67b8566047
commit 28095c5ef7
No known key found for this signature in database
GPG key ID: 86211BA83DF03017
6 changed files with 112 additions and 87 deletions

View file

@ -16,7 +16,7 @@
package av package av
// BaseLayout 描述了布局的基础结构,包含通用的过滤、排序和分页信息 // BaseLayout 描述了布局的基础结构
type BaseLayout struct { type BaseLayout struct {
Spec int `json:"spec"` // 布局格式版本 Spec int `json:"spec"` // 布局格式版本
ID string `json:"id"` // 布局 ID ID string `json:"id"` // 布局 ID
@ -24,3 +24,32 @@ type BaseLayout struct {
Sorts []*ViewSort `json:"sorts"` // 排序规则 Sorts []*ViewSort `json:"sorts"` // 排序规则
PageSize int `json:"pageSize"` // 每页行数 PageSize int `json:"pageSize"` // 每页行数
} }
// BaseValue 描述了字段值的基础结构。
type BaseValue struct {
ID string `json:"id"` // 字段值 ID
Value *Value `json:"value"` // 字段值
ValueType KeyType `json:"valueType"` // 字段值类型
}
// BaseInstance 描述了实例的基础结构。
type BaseInstance struct {
ID string `json:"id"` // ID
Icon string `json:"icon"` // 图标
Name string `json:"name"` // 名称
Desc string `json:"desc"` // 描述
HideAttrViewName bool `json:"hideAttrViewName"` // 是否隐藏属性视图名称
Filters []*ViewFilter `json:"filters"` // 过滤规则
Sorts []*ViewSort `json:"sorts"` // 排序规则
PageSize int `json:"pageSize"` // 每页项目
}
// BaseInstanceField 描述了实例字段的基础结构。
type BaseInstanceField struct {
ID string `json:"id"` // ID
Name string `json:"name"` // 字段名
Type KeyType `json:"type"` // 字段类型
Icon string `json:"icon"` // 字段图标
Hidden bool `json:"hidden"` // 是否隐藏
Desc string `json:"desc"` // 字段描述
}

View file

@ -38,17 +38,11 @@ type ViewGalleryCardField struct {
// Gallery 描述了画廊实例的结构。 // Gallery 描述了画廊实例的结构。
type Gallery struct { type Gallery struct {
ID string `json:"id"` // 画廊布局 ID *BaseInstance
Icon string `json:"icon"` // 画廊图标
Name string `json:"name"` // 画廊名称 Fields []*GalleryField `json:"fields"` // 画廊字段
Desc string `json:"desc"` // 画廊描述 Cards []*GalleryCard `json:"cards"` // 画廊卡片
HideAttrViewName bool `json:"hideAttrViewName"` // 是否隐藏属性视图名称 CardCount int `json:"cardCount"` // 画廊总卡片数
Filters []*ViewFilter `json:"filters"` // 过滤规则
Sorts []*ViewSort `json:"sorts"` // 排序规则
Fields []*GalleryField `json:"fields"` // 画廊字段
Cards []*GalleryCard `json:"cards"` // 画廊卡片
CardCount int `json:"cardCount"` // 画廊总卡片数
PageSize int `json:"pageSize"` // 每页卡片数
} }
// GalleryCard 描述了画廊实例卡片的结构。 // GalleryCard 描述了画廊实例卡片的结构。
@ -61,12 +55,7 @@ type GalleryCard struct {
// GalleryField 描述了画廊实例卡片字段的结构。 // GalleryField 描述了画廊实例卡片字段的结构。
type GalleryField struct { type GalleryField struct {
ID string `json:"id"` // 字段 ID *BaseInstanceField
Name string `json:"name"` // 字段名
Type KeyType `json:"type"` // 字段类型
Icon string `json:"icon"` // 字段图标
Hidden bool `json:"hidden"` // 是否隐藏
Desc string `json:"desc"` // 字段描述
// 以下是某些字段类型的特有属性 // 以下是某些字段类型的特有属性
@ -80,9 +69,7 @@ type GalleryField struct {
// GalleryFieldValue 描述了画廊实例字段值的结构。 // GalleryFieldValue 描述了画廊实例字段值的结构。
type GalleryFieldValue struct { type GalleryFieldValue struct {
ID string `json:"id"` // 字段值 ID *BaseValue
Value *Value `json:"value"` // 字段值
ValueType KeyType `json:"valueType"` // 字段值类型
} }
func (card *GalleryCard) GetBlockValue() (ret *Value) { func (card *GalleryCard) GetBlockValue() (ret *Value) {

View file

@ -42,31 +42,21 @@ type ViewTableColumn struct {
// Table 描述了表格实例的结构。 // Table 描述了表格实例的结构。
type Table struct { type Table struct {
ID string `json:"id"` // 表格布局 ID *BaseInstance
Icon string `json:"icon"` // 表格图标
Name string `json:"name"` // 表格名称 Columns []*TableColumn `json:"columns"` // 表格列
Desc string `json:"desc"` // 表格描述 Rows []*TableRow `json:"rows"` // 表格行
HideAttrViewName bool `json:"hideAttrViewName"` // 是否隐藏属性视图名称 RowCount int `json:"rowCount"` // 表格总行数
Filters []*ViewFilter `json:"filters"` // 过滤规则
Sorts []*ViewSort `json:"sorts"` // 排序规则
Columns []*TableColumn `json:"columns"` // 表格列
Rows []*TableRow `json:"rows"` // 表格行
RowCount int `json:"rowCount"` // 表格总行数
PageSize int `json:"pageSize"` // 每页行数
} }
// TableColumn 描述了表格实例列的结构。 // TableColumn 描述了表格实例列的结构。
type TableColumn struct { type TableColumn struct {
ID string `json:"id"` // 列 ID *BaseInstanceField
Name string `json:"name"` // 列名
Type KeyType `json:"type"` // 列类型 Wrap bool `json:"wrap"` // 是否换行
Icon string `json:"icon"` // 列图标 Pin bool `json:"pin"` // 是否固定
Wrap bool `json:"wrap"` // 是否换行 Width string `json:"width"` // 列宽度
Hidden bool `json:"hidden"` // 是否隐藏 Calc *ColumnCalc `json:"calc"` // 计算
Pin bool `json:"pin"` // 是否固定
Width string `json:"width"` // 列宽度
Desc string `json:"desc"` // 列描述
Calc *ColumnCalc `json:"calc"` // 计算
// 以下是某些列类型的特有属性 // 以下是某些列类型的特有属性
@ -86,11 +76,10 @@ type TableRow struct {
// TableCell 描述了表格实例单元格的结构。 // TableCell 描述了表格实例单元格的结构。
type TableCell struct { type TableCell struct {
ID string `json:"id"` // 单元格 ID *BaseValue
Value *Value `json:"value"` // 单元格值
ValueType KeyType `json:"valueType"` // 单元格值类型 Color string `json:"color"` // 单元格颜色
Color string `json:"color"` // 单元格颜色 BgColor string `json:"bgColor"` // 单元格背景颜色
BgColor string `json:"bgColor"` // 单元格背景颜色
} }
func (row *TableRow) GetBlockValue() (ret *Value) { func (row *TableRow) GetBlockValue() (ret *Value) {

View file

@ -1599,6 +1599,10 @@ func (tx *Transaction) doAddAttrViewView(operation *Operation) (ret *TxErr) {
return return
} }
if "" == operation.Layout {
operation.Layout = av.LayoutTypeTable
}
var view *av.View var view *av.View
switch operation.Layout { switch operation.Layout {
case av.LayoutTypeTable: case av.LayoutTypeTable:

View file

@ -14,15 +14,17 @@ import (
func RenderAttributeViewGallery(attrView *av.AttributeView, view *av.View, query string) (ret *av.Gallery) { func RenderAttributeViewGallery(attrView *av.AttributeView, view *av.View, query string) (ret *av.Gallery) {
ret = &av.Gallery{ ret = &av.Gallery{
ID: view.ID, BaseInstance: &av.BaseInstance{
Icon: view.Icon, ID: view.ID,
Name: view.Name, Icon: view.Icon,
Desc: view.Desc, Name: view.Name,
HideAttrViewName: view.HideAttrViewName, Desc: view.Desc,
Filters: view.Gallery.Filters, HideAttrViewName: view.HideAttrViewName,
Sorts: view.Gallery.Sorts, Filters: view.Gallery.Filters,
Fields: []*av.GalleryField{}, Sorts: view.Gallery.Sorts,
Cards: []*av.GalleryCard{}, },
Fields: []*av.GalleryField{},
Cards: []*av.GalleryCard{},
} }
// 组装字段 // 组装字段
@ -35,12 +37,14 @@ func RenderAttributeViewGallery(attrView *av.AttributeView, view *av.View, query
} }
ret.Fields = append(ret.Fields, &av.GalleryField{ ret.Fields = append(ret.Fields, &av.GalleryField{
ID: key.ID, BaseInstanceField: &av.BaseInstanceField{
Name: key.Name, ID: key.ID,
Type: key.Type, Name: key.Name,
Icon: key.Icon, Type: key.Type,
Hidden: field.Hidden, Icon: key.Icon,
Desc: key.Desc, Hidden: field.Hidden,
Desc: key.Desc,
},
Options: key.Options, Options: key.Options,
NumberFormat: key.NumberFormat, NumberFormat: key.NumberFormat,
Template: key.Template, Template: key.Template,
@ -103,17 +107,21 @@ func RenderAttributeViewGallery(attrView *av.AttributeView, view *av.View, query
for _, keyValues := range card { for _, keyValues := range card {
if keyValues.Key.ID == field.ID { if keyValues.Key.ID == field.ID {
fieldValue = &av.GalleryFieldValue{ fieldValue = &av.GalleryFieldValue{
ID: keyValues.Values[0].ID, BaseValue: &av.BaseValue{
Value: keyValues.Values[0], ID: keyValues.Values[0].ID,
ValueType: field.Type, Value: keyValues.Values[0],
ValueType: field.Type,
},
} }
break break
} }
} }
if nil == fieldValue { if nil == fieldValue {
fieldValue = &av.GalleryFieldValue{ fieldValue = &av.GalleryFieldValue{
ID: ast.NewNodeID(), BaseValue: &av.BaseValue{
ValueType: field.Type, ID: ast.NewNodeID(),
ValueType: field.Type,
},
} }
} }
galleryCard.ID = cardID galleryCard.ID = cardID

View file

@ -28,15 +28,17 @@ import (
func RenderAttributeViewTable(attrView *av.AttributeView, view *av.View, query string) (ret *av.Table) { func RenderAttributeViewTable(attrView *av.AttributeView, view *av.View, query string) (ret *av.Table) {
ret = &av.Table{ ret = &av.Table{
ID: view.ID, BaseInstance: &av.BaseInstance{
Icon: view.Icon, ID: view.ID,
Name: view.Name, Icon: view.Icon,
Desc: view.Desc, Name: view.Name,
HideAttrViewName: view.HideAttrViewName, Desc: view.Desc,
Columns: []*av.TableColumn{}, HideAttrViewName: view.HideAttrViewName,
Rows: []*av.TableRow{}, Filters: view.Table.Filters,
Filters: view.Table.Filters, Sorts: view.Table.Sorts,
Sorts: view.Table.Sorts, },
Columns: []*av.TableColumn{},
Rows: []*av.TableRow{},
} }
// 组装列 // 组装列
@ -49,10 +51,14 @@ func RenderAttributeViewTable(attrView *av.AttributeView, view *av.View, query s
} }
ret.Columns = append(ret.Columns, &av.TableColumn{ ret.Columns = append(ret.Columns, &av.TableColumn{
ID: key.ID, BaseInstanceField: &av.BaseInstanceField{
Name: key.Name, ID: key.ID,
Type: key.Type, Name: key.Name,
Icon: key.Icon, Type: key.Type,
Icon: key.Icon,
Hidden: col.Hidden,
Desc: key.Desc,
},
Options: key.Options, Options: key.Options,
NumberFormat: key.NumberFormat, NumberFormat: key.NumberFormat,
Template: key.Template, Template: key.Template,
@ -60,9 +66,7 @@ func RenderAttributeViewTable(attrView *av.AttributeView, view *av.View, query s
Rollup: key.Rollup, Rollup: key.Rollup,
Date: key.Date, Date: key.Date,
Wrap: col.Wrap, Wrap: col.Wrap,
Hidden: col.Hidden,
Width: col.Width, Width: col.Width,
Desc: key.Desc,
Pin: col.Pin, Pin: col.Pin,
Calc: col.Calc, Calc: col.Calc,
}) })
@ -121,17 +125,21 @@ func RenderAttributeViewTable(attrView *av.AttributeView, view *av.View, query s
for _, keyValues := range row { for _, keyValues := range row {
if keyValues.Key.ID == col.ID { if keyValues.Key.ID == col.ID {
tableCell = &av.TableCell{ tableCell = &av.TableCell{
ID: keyValues.Values[0].ID, BaseValue: &av.BaseValue{
Value: keyValues.Values[0], ID: keyValues.Values[0].ID,
ValueType: col.Type, Value: keyValues.Values[0],
ValueType: col.Type,
},
} }
break break
} }
} }
if nil == tableCell { if nil == tableCell {
tableCell = &av.TableCell{ tableCell = &av.TableCell{
ID: ast.NewNodeID(), BaseValue: &av.BaseValue{
ValueType: col.Type, ID: ast.NewNodeID(),
ValueType: col.Type,
},
} }
} }
tableRow.ID = rowID tableRow.ID = rowID