🎨 Update av

This commit is contained in:
Daniel 2023-07-03 19:06:54 +08:00
parent 4211248740
commit 05d4b7726d
No known key found for this signature in database
GPG key ID: 86211BA83DF03017
3 changed files with 113 additions and 12 deletions

View file

@ -75,22 +75,22 @@ func (av *AttributeView) GetColumnNames() (ret []string) {
type AttributeViewFilter struct { type AttributeViewFilter struct {
Column string `json:"column"` Column string `json:"column"`
Operator FilterOperator `json:"operator"` Operator FilterOperator `json:"operator"`
Value string `json:"value"` Value *Value `json:"value"`
} }
type FilterOperator string type FilterOperator string
const ( const (
FilterOperatorEq FilterOperator = "=" FilterOperatorEq FilterOperator = "="
FilterOperatorNe FilterOperator = "!=" FilterOperatorNe FilterOperator = "!="
FilterOperatorGt FilterOperator = ">" FilterOperatorGt FilterOperator = ">"
FilterOperatorGe FilterOperator = ">=" FilterOperatorGe FilterOperator = ">="
FilterOperatorLt FilterOperator = "<" FilterOperatorLt FilterOperator = "<"
FilterOperatorLe FilterOperator = "<=" FilterOperatorLe FilterOperator = "<="
FilterOperatorIn FilterOperator = "IN" FilterOperatorContains FilterOperator = "CONTAINS"
FilterOperatorNotIn FilterOperator = "NOT IN" FilterOperatorNotContains FilterOperator = "NOT CONTAINS"
FilterOperatorLike FilterOperator = "LIKE" FilterOperatorIsEmpty FilterOperator = "IS EMPTY"
FilterOperatorNotLike FilterOperator = "NOT LIKE" FilterOperatorIsNotEmpty FilterOperator = "IS NOT EMPTY"
) )
type AttributeViewSort struct { type AttributeViewSort struct {

View file

@ -95,6 +95,68 @@ func (value *Value) Compare(other *Value) int {
return 0 return 0
} }
func (value *Value) CompareOperator(other *Value, operator FilterOperator) bool {
if nil == value {
return false
}
if nil == other {
return false
}
if nil != value.Block && nil != other.Block {
return strings.Contains(value.Block.Content, other.Block.Content)
}
if nil != value.Text && nil != other.Text {
return strings.Contains(value.Text.Content, other.Text.Content)
}
if nil != value.Number && nil != other.Number {
switch operator {
case FilterOperatorEq:
return value.Number.Content == other.Number.Content
case FilterOperatorNe:
return value.Number.Content != other.Number.Content
case FilterOperatorGt:
return value.Number.Content > other.Number.Content
case FilterOperatorGe:
return value.Number.Content >= other.Number.Content
case FilterOperatorLt:
return value.Number.Content < other.Number.Content
case FilterOperatorLe:
return value.Number.Content <= other.Number.Content
}
}
if nil != value.Date && nil != other.Date {
switch operator {
case FilterOperatorEq:
return value.Date.Content == other.Date.Content
case FilterOperatorNe:
return value.Date.Content != other.Date.Content
case FilterOperatorGt:
return value.Date.Content > other.Date.Content
case FilterOperatorGe:
return value.Date.Content >= other.Date.Content
case FilterOperatorLt:
return value.Date.Content < other.Date.Content
case FilterOperatorLe:
return value.Date.Content <= other.Date.Content
}
}
if nil != value.Select && nil != other.Select {
return strings.Contains(value.Select.Content, other.Select.Content)
}
if nil != value.MSelect && nil != other.MSelect {
var v1 string
for _, v := range value.MSelect {
v1 += v.Content
}
var v2 string
for _, v := range other.MSelect {
v2 += v.Content
}
return strings.Contains(v1, v2)
}
return false
}
func NewCellBlock(blockID, blockContent string) *Cell { func NewCellBlock(blockID, blockContent string) *Cell {
return &Cell{ return &Cell{
ID: ast.NewNodeID(), ID: ast.NewNodeID(),

View file

@ -42,6 +42,46 @@ func RenderAttributeView(avID string) (ret *av.AttributeView, err error) {
return return
} }
filterRows(ret)
sortRows(ret)
return
}
func filterRows(ret *av.AttributeView) {
if 0 < len(ret.Filters) {
var colIndexes []int
for _, f := range ret.Filters {
for i, c := range ret.Columns {
if c.ID == f.Column {
colIndexes = append(colIndexes, i)
break
}
}
}
var rows []*av.Row
for _, row := range ret.Rows {
pass := true
for j, index := range colIndexes {
c := ret.Columns[index]
if c.Type == av.ColumnTypeBlock {
continue
}
if !row.Cells[index].Value.CompareOperator(ret.Filters[j].Value, ret.Filters[j].Operator) {
pass = false
break
}
}
if pass {
rows = append(rows, row)
}
}
ret.Rows = rows
}
}
func sortRows(ret *av.AttributeView) {
if 0 < len(ret.Sorts) { if 0 < len(ret.Sorts) {
var colIndexes []int var colIndexes []int
for _, s := range ret.Sorts { for _, s := range ret.Sorts {
@ -71,7 +111,6 @@ func RenderAttributeView(avID string) (ret *av.AttributeView, err error) {
return less return less
}) })
} }
return
} }
func (tx *Transaction) doUpdateAttrViewCell(operation *Operation) (ret *TxErr) { func (tx *Transaction) doUpdateAttrViewCell(operation *Operation) (ret *TxErr) {