mirror of
https://github.com/siyuan-note/siyuan.git
synced 2025-12-22 01:20:12 +01:00
🎨 Add Relation column to database table view https://github.com/siyuan-note/siyuan/issues/9888
This commit is contained in:
parent
16519d0082
commit
078c3700b3
1 changed files with 53 additions and 26 deletions
|
|
@ -2184,9 +2184,21 @@ func UpdateAttributeViewCell(tx *Transaction, avID, keyID, rowID, cellID string,
|
||||||
if err = gulu.JSON.UnmarshalJSON(data, &val); nil != err {
|
if err = gulu.JSON.UnmarshalJSON(data, &val); nil != err {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
relationChangeMode := 0 // 0:不变(仅排序),1:增加,2:减少
|
||||||
if av.KeyTypeRelation == val.Type {
|
if av.KeyTypeRelation == val.Type {
|
||||||
// 关联列得 content 是自动渲染的,所以不需要保存
|
// 关联列得 content 是自动渲染的,所以不需要保存
|
||||||
val.Relation.Contents = nil
|
val.Relation.Contents = nil
|
||||||
|
|
||||||
|
// 计算关联排序模式
|
||||||
|
if len(oldRelationBlockIDs) == len(val.Relation.BlockIDs) {
|
||||||
|
relationChangeMode = 0
|
||||||
|
} else {
|
||||||
|
if len(oldRelationBlockIDs) > len(val.Relation.BlockIDs) {
|
||||||
|
relationChangeMode = 2
|
||||||
|
} else {
|
||||||
|
relationChangeMode = 1
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// val.IsDetached 只有更新主键的时候才会传入,所以下面需要结合 isUpdatingBlockKey 来判断
|
// val.IsDetached 只有更新主键的时候才会传入,所以下面需要结合 isUpdatingBlockKey 来判断
|
||||||
|
|
@ -2226,24 +2238,18 @@ func UpdateAttributeViewCell(tx *Transaction, avID, keyID, rowID, cellID string,
|
||||||
if nil != key && av.KeyTypeRelation == key.Type && nil != key.Relation && key.Relation.IsTwoWay {
|
if nil != key && av.KeyTypeRelation == key.Type && nil != key.Relation && key.Relation.IsTwoWay {
|
||||||
destAv, _ := av.ParseAttributeView(key.Relation.AvID)
|
destAv, _ := av.ParseAttributeView(key.Relation.AvID)
|
||||||
if nil != destAv {
|
if nil != destAv {
|
||||||
// 清空旧的双向关联的目标值
|
// relationChangeMode
|
||||||
for _, blockID := range oldRelationBlockIDs {
|
// 0:关联列值不变(仅排序),不影响目标值
|
||||||
for _, keyValues := range destAv.KeyValues {
|
// 1:关联列值增加,增加目标值
|
||||||
if keyValues.Key.ID != key.Relation.BackKeyID {
|
// 2:关联列值减少,减少目标值
|
||||||
continue
|
|
||||||
|
if 1 == relationChangeMode {
|
||||||
|
addBlockIDs := val.Relation.BlockIDs
|
||||||
|
for _, bID := range oldRelationBlockIDs {
|
||||||
|
addBlockIDs = gulu.Str.RemoveElem(addBlockIDs, bID)
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, value := range keyValues.Values {
|
for _, blockID := range addBlockIDs {
|
||||||
if value.BlockID == blockID {
|
|
||||||
value.Relation.BlockIDs = gulu.Str.RemoveElem(value.Relation.BlockIDs, rowID)
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 更新新的双向关联的目标值
|
|
||||||
for _, blockID := range val.Relation.BlockIDs {
|
|
||||||
for _, keyValues := range destAv.KeyValues {
|
for _, keyValues := range destAv.KeyValues {
|
||||||
if keyValues.Key.ID != key.Relation.BackKeyID {
|
if keyValues.Key.ID != key.Relation.BackKeyID {
|
||||||
continue
|
continue
|
||||||
|
|
@ -2260,6 +2266,27 @@ func UpdateAttributeViewCell(tx *Transaction, avID, keyID, rowID, cellID string,
|
||||||
break
|
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)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
av.SaveAttributeView(destAv)
|
av.SaveAttributeView(destAv)
|
||||||
util.BroadcastByType("protyle", "refreshAttributeView", 0, "", map[string]interface{}{"id": destAv.ID})
|
util.BroadcastByType("protyle", "refreshAttributeView", 0, "", map[string]interface{}{"id": destAv.ID})
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue