mirror of
https://github.com/siyuan-note/siyuan.git
synced 2025-05-20 02:50:58 +08:00
Merge remote-tracking branch 'origin/dev' into dev
This commit is contained in:
commit
0557a4232c
@ -1577,26 +1577,44 @@ func updateAttributeViewColRelation(operation *Operation) (err error) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if !destAdded {
|
if !destAdded && operation.IsTwoWay {
|
||||||
if operation.IsTwoWay {
|
// 新建双向关联目标字段
|
||||||
name := strings.TrimSpace(operation.Name)
|
name := strings.TrimSpace(operation.Name)
|
||||||
if "" == name {
|
if "" == name {
|
||||||
name = srcAv.Name + " " + operation.Format
|
name = srcAv.Name + " " + operation.Format
|
||||||
|
}
|
||||||
|
|
||||||
|
destKeyValues := &av.KeyValues{
|
||||||
|
Key: &av.Key{
|
||||||
|
ID: operation.BackRelationKeyID,
|
||||||
|
Name: name,
|
||||||
|
Type: av.KeyTypeRelation,
|
||||||
|
Relation: &av.Relation{AvID: operation.AvID, IsTwoWay: operation.IsTwoWay, BackKeyID: operation.KeyID},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
destAv.KeyValues = append(destAv.KeyValues, destKeyValues)
|
||||||
|
|
||||||
|
for _, v := range destAv.Views {
|
||||||
|
switch v.LayoutType {
|
||||||
|
case av.LayoutTypeTable:
|
||||||
|
v.Table.Columns = append(v.Table.Columns, &av.ViewTableColumn{ID: operation.BackRelationKeyID})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
now := time.Now().UnixMilli()
|
||||||
|
// 和现有值进行关联
|
||||||
|
for _, keyValues := range srcAv.KeyValues {
|
||||||
|
if keyValues.Key.ID != operation.KeyID {
|
||||||
|
continue
|
||||||
}
|
}
|
||||||
|
|
||||||
destAv.KeyValues = append(destAv.KeyValues, &av.KeyValues{
|
srcKeyValues := keyValues
|
||||||
Key: &av.Key{
|
for _, srcVal := range srcKeyValues.Values {
|
||||||
ID: operation.BackRelationKeyID,
|
for _, blockID := range srcVal.Relation.BlockIDs {
|
||||||
Name: name,
|
destVal := &av.Value{ID: ast.NewNodeID(), KeyID: destKeyValues.Key.ID, BlockID: blockID, Type: keyValues.Key.Type, Relation: &av.ValueRelation{}, CreatedAt: now, UpdatedAt: now + 1000}
|
||||||
Type: av.KeyTypeRelation,
|
destVal.Relation.BlockIDs = append(destVal.Relation.BlockIDs, srcVal.BlockID)
|
||||||
Relation: &av.Relation{AvID: operation.AvID, IsTwoWay: operation.IsTwoWay, BackKeyID: operation.KeyID},
|
destVal.Relation.BlockIDs = gulu.Str.RemoveDuplicatedElem(destVal.Relation.BlockIDs)
|
||||||
},
|
destKeyValues.Values = append(destKeyValues.Values, destVal)
|
||||||
})
|
|
||||||
|
|
||||||
for _, v := range destAv.Views {
|
|
||||||
switch v.LayoutType {
|
|
||||||
case av.LayoutTypeTable:
|
|
||||||
v.Table.Columns = append(v.Table.Columns, &av.ViewTableColumn{ID: operation.BackRelationKeyID})
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -3195,64 +3213,62 @@ func UpdateAttributeViewCell(tx *Transaction, avID, keyID, rowID, cellID string,
|
|||||||
val.SetUpdatedAt(now)
|
val.SetUpdatedAt(now)
|
||||||
|
|
||||||
key, _ := attrView.GetKey(val.KeyID)
|
key, _ := attrView.GetKey(val.KeyID)
|
||||||
if nil != key && av.KeyTypeRelation == key.Type && nil != key.Relation {
|
if nil != key && av.KeyTypeRelation == key.Type && nil != key.Relation && key.Relation.IsTwoWay {
|
||||||
destAv, _ := av.ParseAttributeView(key.Relation.AvID)
|
// 双向关联需要同时更新目标字段的值
|
||||||
if nil != destAv {
|
|
||||||
if key.Relation.IsTwoWay {
|
|
||||||
// relationChangeMode
|
|
||||||
// 0:关联列值不变(仅排序),不影响目标值
|
|
||||||
// 1:关联列值增加,增加目标值
|
|
||||||
// 2:关联列值减少,减少目标值
|
|
||||||
|
|
||||||
if 1 == relationChangeMode {
|
if destAv, _ := av.ParseAttributeView(key.Relation.AvID); nil != destAv {
|
||||||
addBlockIDs := val.Relation.BlockIDs
|
// relationChangeMode
|
||||||
for _, bID := range oldRelationBlockIDs {
|
// 0:关联列值不变(仅排序),不影响目标值
|
||||||
addBlockIDs = gulu.Str.RemoveElem(addBlockIDs, bID)
|
// 1:关联列值增加,增加目标值
|
||||||
}
|
// 2:关联列值减少,减少目标值
|
||||||
|
|
||||||
for _, blockID := range addBlockIDs {
|
if 1 == relationChangeMode {
|
||||||
for _, keyValues := range destAv.KeyValues {
|
addBlockIDs := val.Relation.BlockIDs
|
||||||
if keyValues.Key.ID != key.Relation.BackKeyID {
|
for _, bID := range oldRelationBlockIDs {
|
||||||
continue
|
addBlockIDs = gulu.Str.RemoveElem(addBlockIDs, bID)
|
||||||
}
|
}
|
||||||
|
|
||||||
destVal := keyValues.GetValue(blockID)
|
for _, blockID := range addBlockIDs {
|
||||||
if nil == destVal {
|
for _, keyValues := range destAv.KeyValues {
|
||||||
destVal = &av.Value{ID: ast.NewNodeID(), KeyID: keyValues.Key.ID, BlockID: blockID, Type: keyValues.Key.Type, Relation: &av.ValueRelation{}}
|
if keyValues.Key.ID != key.Relation.BackKeyID {
|
||||||
keyValues.Values = append(keyValues.Values, destVal)
|
continue
|
||||||
}
|
|
||||||
|
|
||||||
destVal.Relation.BlockIDs = append(destVal.Relation.BlockIDs, rowID)
|
|
||||||
destVal.Relation.BlockIDs = gulu.Str.RemoveDuplicatedElem(destVal.Relation.BlockIDs)
|
|
||||||
destVal.SetUpdatedAt(now)
|
|
||||||
break
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
} else if 2 == relationChangeMode {
|
|
||||||
removeBlockIDs := oldRelationBlockIDs
|
|
||||||
for _, bID := range val.Relation.BlockIDs {
|
|
||||||
removeBlockIDs = gulu.Str.RemoveElem(removeBlockIDs, bID)
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, blockID := range removeBlockIDs {
|
destVal := keyValues.GetValue(blockID)
|
||||||
for _, keyValues := range destAv.KeyValues {
|
if nil == destVal {
|
||||||
if keyValues.Key.ID != key.Relation.BackKeyID {
|
destVal = &av.Value{ID: ast.NewNodeID(), KeyID: keyValues.Key.ID, BlockID: blockID, Type: keyValues.Key.Type, Relation: &av.ValueRelation{}, CreatedAt: now, UpdatedAt: now + 1000}
|
||||||
continue
|
keyValues.Values = append(keyValues.Values, destVal)
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, value := range keyValues.Values {
|
destVal.Relation.BlockIDs = append(destVal.Relation.BlockIDs, rowID)
|
||||||
if value.BlockID == blockID {
|
destVal.Relation.BlockIDs = gulu.Str.RemoveDuplicatedElem(destVal.Relation.BlockIDs)
|
||||||
value.Relation.BlockIDs = gulu.Str.RemoveElem(value.Relation.BlockIDs, rowID)
|
break
|
||||||
value.SetUpdatedAt(now)
|
}
|
||||||
break
|
}
|
||||||
}
|
} else if 2 == relationChangeMode {
|
||||||
|
removeBlockIDs := oldRelationBlockIDs
|
||||||
|
for _, bID := range val.Relation.BlockIDs {
|
||||||
|
removeBlockIDs = gulu.Str.RemoveElem(removeBlockIDs, bID)
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, blockID := range removeBlockIDs {
|
||||||
|
for _, keyValues := range destAv.KeyValues {
|
||||||
|
if keyValues.Key.ID != key.Relation.BackKeyID {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, value := range keyValues.Values {
|
||||||
|
if value.BlockID == blockID {
|
||||||
|
value.Relation.BlockIDs = gulu.Str.RemoveElem(value.Relation.BlockIDs, rowID)
|
||||||
|
value.SetUpdatedAt(now)
|
||||||
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
av.SaveAttributeView(destAv)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
av.SaveAttributeView(destAv)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user