Merge remote-tracking branch 'origin/dev' into dev

This commit is contained in:
Vanessa 2024-03-03 22:07:33 +08:00
commit 697c17635d
3 changed files with 137 additions and 23 deletions

View file

@ -321,8 +321,6 @@ func SaveAttributeView(av *AttributeView) (err error) {
}
}
// 数据订正
// 值去重
blockValues := av.GetBlockKeyValues()
blockIDs := map[string]bool{}

View file

@ -83,22 +83,6 @@ const (
)
func (value *Value) Compare(other *Value) int {
if nil == value {
return 1
}
if nil == other {
return -1
}
if !value.IsEdited() {
if other.IsEdited() {
return 1
}
return int(value.CreatedAt - other.CreatedAt)
} else if !other.IsEdited() {
return -1
}
switch value.Type {
case KeyTypeBlock:
if nil != value.Block && nil != other.Block {
@ -273,7 +257,7 @@ func (value *Value) Compare(other *Value) int {
}
func (value *Value) CompareOperator(filter *ViewFilter, attrView *AttributeView, rowID string) bool {
if nil != value.Rollup && nil != filter.Value.Rollup {
if nil != value.Rollup && KeyTypeRollup == filter.Value.Type {
rollupKey, _ := attrView.GetKey(value.KeyID)
if nil == rollupKey {
return false
@ -904,9 +888,53 @@ func (table *Table) SortRows() {
}
}
sort.Slice(table.Rows, func(i, j int) bool {
includeUneditedRows := map[string]bool{}
for i, row := range table.Rows {
for _, colIndexSort := range colIndexSorts {
result := table.Rows[i].Cells[colIndexSort.Index].Value.Compare(table.Rows[j].Cells[colIndexSort.Index].Value)
val := table.Rows[i].Cells[colIndexSort.Index].Value
if !val.IsEdited() {
// 如果该行的某个列的值是未编辑的,则该行不参与排序
includeUneditedRows[row.ID] = true
break
}
}
}
// 将包含未编辑的行和全部已编辑的行分开排序
var uneditedRows, editedRows []*TableRow
for _, row := range table.Rows {
if _, ok := includeUneditedRows[row.ID]; ok {
uneditedRows = append(uneditedRows, row)
} else {
editedRows = append(editedRows, row)
}
}
sort.Slice(uneditedRows, func(i, j int) bool {
val1 := uneditedRows[i].GetBlockValue()
if nil == val1 {
return true
}
val2 := uneditedRows[j].GetBlockValue()
if nil == val2 {
return false
}
return val1.CreatedAt < val2.CreatedAt
})
sort.Slice(editedRows, func(i, j int) bool {
for _, colIndexSort := range colIndexSorts {
val1 := editedRows[i].Cells[colIndexSort.Index].Value
if nil == val1 {
return colIndexSort.Order == SortOrderAsc
}
val2 := editedRows[j].Cells[colIndexSort.Index].Value
if nil == val2 {
return colIndexSort.Order != SortOrderAsc
}
result := val1.Compare(val2)
if 0 == result {
continue
}
@ -918,6 +946,9 @@ func (table *Table) SortRows() {
}
return false
})
// 将包含未编辑的行放在最后
table.Rows = append(editedRows, uneditedRows...)
}
func (table *Table) FilterRows(attrView *AttributeView) {

View file

@ -189,10 +189,95 @@ func (value *Value) IsEdited() bool {
return true
}
if value.CreatedAt == value.UpdatedAt {
if value.IsGenerated() {
// 所有生成的数据都认为是编辑过的
return true
}
if value.IsEmpty() {
// 空数据认为是未编辑过的
return false
}
return true
return value.CreatedAt != value.UpdatedAt
}
func (value *Value) IsGenerated() bool {
return KeyTypeTemplate == value.Type || KeyTypeRollup == value.Type || KeyTypeUpdated == value.Type || KeyTypeCreated == value.Type
}
func (value *Value) IsEmpty() bool {
switch value.Type {
case KeyTypeBlock:
if nil == value.Block {
return true
}
return "" == value.Block.Content
case KeyTypeText:
if nil == value.Text {
return true
}
return "" == value.Text.Content
case KeyTypeNumber:
if nil == value.Number {
return true
}
return !value.Number.IsNotEmpty
case KeyTypeDate:
if nil == value.Date {
return true
}
return !value.Date.IsNotEmpty
case KeyTypeSelect:
if 1 > len(value.MSelect) {
return true
}
return "" == value.MSelect[0].Content
case KeyTypeMSelect:
return 1 > len(value.MSelect)
case KeyTypeURL:
if nil == value.URL {
return true
}
return "" == value.URL.Content
case KeyTypeEmail:
if nil == value.Email {
return true
}
return "" == value.Email.Content
case KeyTypePhone:
if nil == value.Phone {
return true
}
return "" == value.Phone.Content
case KeyTypeMAsset:
return 1 > len(value.MAsset)
case KeyTypeTemplate:
if nil == value.Template {
return true
}
return "" == value.Template.Content
case KeyTypeCreated:
if nil == value.Created {
return true
}
return !value.Created.IsNotEmpty
case KeyTypeUpdated:
if nil == value.Updated {
return true
}
return !value.Updated.IsNotEmpty
case KeyTypeCheckbox:
if nil == value.Checkbox {
return true
}
return !value.Checkbox.Checked
case KeyTypeRelation:
return 1 > len(value.Relation.Contents)
case KeyTypeRollup:
return 1 > len(value.Rollup.Contents)
}
return false
}
type ValueBlock struct {