diff --git a/kernel/av/filter.go b/kernel/av/filter.go index d4539fc07..ed0bb5635 100644 --- a/kernel/av/filter.go +++ b/kernel/av/filter.go @@ -361,7 +361,12 @@ func (value *Value) filter(other *Value, relativeDate, relativeDate2 *RelativeDa case KeyTypeSelect, KeyTypeMSelect: if nil != value.MSelect { if 1 > len(other.MSelect) { - return true + switch operator { + case FilterOperatorIsEmpty: + return value.IsEmpty() + case FilterOperatorIsNotEmpty: + return !value.IsEmpty() + } } switch operator { diff --git a/kernel/av/value.go b/kernel/av/value.go index cb41e279f..d080ad188 100644 --- a/kernel/av/value.go +++ b/kernel/av/value.go @@ -75,12 +75,12 @@ func (value *Value) String(format bool) string { if nil == value.Block { return "" } - return value.Block.Content + return strings.TrimSpace(value.Block.Content) case KeyTypeText: if nil == value.Text { return "" } - return value.Text.Content + return strings.TrimSpace(value.Text.Content) case KeyTypeNumber: if nil == value.Number { return "" @@ -113,17 +113,17 @@ func (value *Value) String(format bool) string { if nil == value.URL { return "" } - return value.URL.Content + return strings.TrimSpace(value.URL.Content) case KeyTypeEmail: if nil == value.Email { return "" } - return value.Email.Content + return strings.TrimSpace(value.Email.Content) case KeyTypePhone: if nil == value.Phone { return "" } - return value.Phone.Content + return strings.TrimSpace(value.Phone.Content) case KeyTypeMAsset: if 1 > len(value.MAsset) { return "" @@ -978,6 +978,8 @@ func GetAttributeViewDefaultValue(valueID, keyID, blockID string, typ KeyType) ( } switch typ { + case KeyTypeBlock: + ret.Block = &ValueBlock{Created: ret.CreatedAt, Updated: ret.UpdatedAt} case KeyTypeText: ret.Text = &ValueText{} case KeyTypeNumber: diff --git a/kernel/model/attribute_view.go b/kernel/model/attribute_view.go index ee9db4970..e47cc7bed 100644 --- a/kernel/model/attribute_view.go +++ b/kernel/model/attribute_view.go @@ -215,7 +215,36 @@ func getAttrViewAddingBlockDefaultValues(attrView *av.AttributeView, view, group return } - if nil != newValue && !filterKeyIDs[groupKey.ID] /* 命中了过滤条件的话就不重复处理了 */ { + if nil == nearItem && !filterKeyIDs[groupKey.ID] { + // 没有临近项并且分组字段和过滤字段不同时,使用分组值 + newValue = av.GetAttributeViewDefaultValue(ast.NewNodeID(), groupKey.ID, addingItemID, groupKey.Type) + if av.KeyTypeText == groupView.GroupVal.Type { + content := groupView.GroupVal.Text.Content + switch newValue.Type { + case av.KeyTypeBlock: + newValue.Block.Content = content + case av.KeyTypeText: + newValue.Text.Content = content + case av.KeyTypeNumber: + num, _ := strconv.ParseFloat(strings.Split(content, " - ")[0], 64) + newValue.Number.Content = num + newValue.Number.IsNotEmpty = true + case av.KeyTypeURL: + newValue.URL.Content = content + case av.KeyTypeEmail: + newValue.Email.Content = content + case av.KeyTypePhone: + newValue.Phone.Content = content + case av.KeyTypeCheckbox: + newValue.Checkbox.Checked = "" != content + } + } + + ret[groupKey.ID] = newValue + return + } + + if nil != newValue && !filterKeyIDs[groupKey.ID] { ret[groupKey.ID] = newValue } return @@ -2418,6 +2447,7 @@ func (tx *Transaction) doDuplicateAttrViewView(operation *Operation) (ret *TxErr view.HideAttrViewName = masterView.HideAttrViewName view.Desc = masterView.Desc view.LayoutType = masterView.LayoutType + view.PageSize = masterView.PageSize for _, filter := range masterView.Filters { view.Filters = append(view.Filters, &av.ViewFilter{ @@ -2436,16 +2466,6 @@ func (tx *Transaction) doDuplicateAttrViewView(operation *Operation) (ret *TxErr }) } - if nil != masterView.Group { - view.Group = &av.ViewGroup{} - if copyErr := copier.Copy(view.Group, masterView.Group); nil != copyErr { - logging.LogErrorf("copy group failed: %s", copyErr) - return &TxErr{code: TxErrHandleAttributeView, id: avID, msg: copyErr.Error()} - } - } - - view.PageSize = masterView.PageSize - switch masterView.LayoutType { case av.LayoutTypeTable: for _, col := range masterView.Table.Columns { @@ -2487,6 +2507,17 @@ func (tx *Transaction) doDuplicateAttrViewView(operation *Operation) (ret *TxErr view.ItemIDs = masterView.ItemIDs + if nil != masterView.Group { + view.Group = &av.ViewGroup{} + if copyErr := copier.Copy(view.Group, masterView.Group); nil != copyErr { + logging.LogErrorf("copy group failed: %s", copyErr) + return &TxErr{code: TxErrHandleAttributeView, id: avID, msg: copyErr.Error()} + } + + view.GroupItemIDs = masterView.GroupItemIDs + regenAttrViewGroups(attrView, "force") + } + if err = av.SaveAttributeView(attrView); err != nil { logging.LogErrorf("save attribute view [%s] failed: %s", avID, err) return &TxErr{code: TxErrHandleAttributeView, msg: err.Error(), id: avID} diff --git a/kernel/model/attribute_view_render.go b/kernel/model/attribute_view_render.go index d6c3fa898..4ae004887 100644 --- a/kernel/model/attribute_view_render.go +++ b/kernel/model/attribute_view_render.go @@ -106,7 +106,7 @@ func renderAttributeViewGroups(viewable av.Viewable, attrView *av.AttributeView, fixDev := false for _, groupView := range view.Groups { - if ("" == groupView.GetGroupValue() || nil == groupView.GroupKey) && !fixDev { + if (nil == groupView.GroupVal || nil == groupView.GroupKey) && !fixDev { // TODO 分组上线后删除,预计 2025 年 9 月后可以删除 regenAttrViewGroups(attrView, "force") av.SaveAttributeView(attrView)