Skip to content

Commit 7acf6f5

Browse files
committed
✨ Database kanban view #8873
Signed-off-by: Daniel <[email protected]>
1 parent 3211d33 commit 7acf6f5

File tree

6 files changed

+395
-9
lines changed

6 files changed

+395
-9
lines changed

kernel/av/layout_kanban.go

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,15 +56,24 @@ type ViewKanbanField struct {
5656
type Kanban struct {
5757
*BaseInstance
5858

59-
Fields []*KanbanField `json:"fields"` // 卡片字段
60-
Cards []*KanbanCard `json:"cards"` // 卡片
61-
CardCount int `json:"rowCount"` // 总卡片数
59+
CoverFrom CoverFrom `json:"coverFrom"` // 封面来源
60+
CoverFromAssetKeyID string `json:"coverFromAssetKeyID,omitempty"` // 资源字段 ID,CoverFrom 为 CoverFromAssetField 时有效
61+
CardAspectRatio CardAspectRatio `json:"cardAspectRatio"` // 卡片宽高比
62+
CardSize CardSize `json:"cardSize"` // 卡片大小
63+
FitImage bool `json:"fitImage"` // 是否适应封面图片大小
64+
DisplayFieldName bool `json:"displayFieldName"` // 是否显示字段名称
65+
Fields []*KanbanField `json:"fields"` // 卡片字段
66+
Cards []*KanbanCard `json:"cards"` // 卡片
67+
CardCount int `json:"rowCount"` // 总卡片数
6268
}
6369

6470
// KanbanCard 描述了看板实例卡片的结构。
6571
type KanbanCard struct {
6672
ID string `json:"id"` // 卡片 ID
6773
Values []*KanbanFieldValue `json:"values"` // 卡片字段值
74+
75+
CoverURL string `json:"coverURL"` // 卡片封面超链接
76+
CoverContent string `json:"coverContent"` // 卡片封面文本内容
6877
}
6978

7079
// KanbanField 描述了看板实例字段的结构。

kernel/model/attribute_view.go

Lines changed: 130 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -429,7 +429,7 @@ func syncAttrViewTableColWidth(operation *Operation) (err error) {
429429
break
430430
}
431431
}
432-
case av.LayoutTypeGallery:
432+
case av.LayoutTypeGallery, av.LayoutTypeKanban:
433433
return
434434
}
435435

@@ -846,6 +846,11 @@ func setAttrViewWrapField(operation *Operation) (err error) {
846846
for _, field := range view.Gallery.CardFields {
847847
field.Wrap = allFieldWrap
848848
}
849+
case av.LayoutTypeKanban:
850+
view.Kanban.WrapField = allFieldWrap
851+
for _, field := range view.Kanban.Fields {
852+
field.Wrap = allFieldWrap
853+
}
849854
}
850855

851856
err = av.SaveAttributeView(attrView)
@@ -876,6 +881,8 @@ func setAttrViewShowIcon(operation *Operation) (err error) {
876881
view.Table.ShowIcon = operation.Data.(bool)
877882
case av.LayoutTypeGallery:
878883
view.Gallery.ShowIcon = operation.Data.(bool)
884+
case av.LayoutTypeKanban:
885+
view.Kanban.ShowIcon = operation.Data.(bool)
879886
}
880887

881888
err = av.SaveAttributeView(attrView)
@@ -1002,6 +1009,8 @@ func setAttrViewCoverFromAssetKeyID(operation *Operation) (err error) {
10021009
return
10031010
case av.LayoutTypeGallery:
10041011
view.Gallery.CoverFromAssetKeyID = operation.KeyID
1012+
case av.LayoutTypeKanban:
1013+
view.Kanban.CoverFromAssetKeyID = operation.KeyID
10051014
}
10061015

10071016
err = av.SaveAttributeView(attrView)
@@ -1955,6 +1964,9 @@ func genAttrViewGroups(view *av.View, attrView *av.AttributeView) {
19551964
case av.LayoutTypeGallery:
19561965
v = av.NewGalleryView()
19571966
v.Gallery = av.NewLayoutGallery()
1967+
case av.LayoutTypeKanban:
1968+
v = av.NewKanbanView()
1969+
v.Kanban = av.NewLayoutKanban()
19581970
default:
19591971
logging.LogWarnf("unknown layout type [%s] for group view", view.LayoutType)
19601972
return
@@ -2351,6 +2363,8 @@ func updateAttributeViewColRelation(operation *Operation) (err error) {
23512363
v.Table.Columns = append(v.Table.Columns, &av.ViewTableColumn{BaseField: &av.BaseField{ID: operation.BackRelationKeyID}})
23522364
case av.LayoutTypeGallery:
23532365
v.Gallery.CardFields = append(v.Gallery.CardFields, &av.ViewGalleryCardField{BaseField: &av.BaseField{ID: operation.BackRelationKeyID}})
2366+
case av.LayoutTypeKanban:
2367+
v.Kanban.Fields = append(v.Kanban.Fields, &av.ViewKanbanField{BaseField: &av.BaseField{ID: operation.BackRelationKeyID}})
23542368
}
23552369
}
23562370

@@ -2566,6 +2580,8 @@ func (tx *Transaction) doDuplicateAttrViewView(operation *Operation) (ret *TxErr
25662580
view = av.NewTableView()
25672581
case av.LayoutTypeGallery:
25682582
view = av.NewGalleryView()
2583+
case av.LayoutTypeKanban:
2584+
view = av.NewKanbanView()
25692585
}
25702586

25712587
view.ID = operation.ID
@@ -2718,6 +2734,10 @@ func addAttrViewView(avID, viewID, blockID string, layout av.LayoutType) (err er
27182734
for _, field := range firstView.Gallery.CardFields {
27192735
view.Table.Columns = append(view.Table.Columns, &av.ViewTableColumn{BaseField: &av.BaseField{ID: field.ID}})
27202736
}
2737+
case av.LayoutTypeKanban:
2738+
for _, field := range firstView.Kanban.Fields {
2739+
view.Table.Columns = append(view.Table.Columns, &av.ViewTableColumn{BaseField: &av.BaseField{ID: field.ID}})
2740+
}
27212741
}
27222742
case av.LayoutTypeGallery:
27232743
view = av.NewGalleryView()
@@ -2730,6 +2750,22 @@ func addAttrViewView(avID, viewID, blockID string, layout av.LayoutType) (err er
27302750
for _, field := range firstView.Gallery.CardFields {
27312751
view.Gallery.CardFields = append(view.Gallery.CardFields, &av.ViewGalleryCardField{BaseField: &av.BaseField{ID: field.ID}})
27322752
}
2753+
case av.LayoutTypeKanban:
2754+
for _, field := range firstView.Kanban.Fields {
2755+
view.Gallery.CardFields = append(view.Gallery.CardFields, &av.ViewGalleryCardField{BaseField: &av.BaseField{ID: field.ID}})
2756+
}
2757+
}
2758+
case av.LayoutTypeKanban:
2759+
view = av.NewKanbanView()
2760+
switch firstView.LayoutType {
2761+
case av.LayoutTypeTable:
2762+
for _, col := range firstView.Table.Columns {
2763+
view.Kanban.Fields = append(view.Kanban.Fields, &av.ViewKanbanField{BaseField: &av.BaseField{ID: col.ID}})
2764+
}
2765+
case av.LayoutTypeKanban:
2766+
for _, field := range firstView.Kanban.Fields {
2767+
view.Kanban.Fields = append(view.Kanban.Fields, &av.ViewKanbanField{BaseField: &av.BaseField{ID: field.ID}})
2768+
}
27332769
}
27342770
default:
27352771
err = av.ErrWrongLayoutType
@@ -3058,7 +3094,7 @@ func setAttributeViewColumnCalc(operation *Operation) (err error) {
30583094
break
30593095
}
30603096
}
3061-
case av.LayoutTypeGallery:
3097+
case av.LayoutTypeGallery, av.LayoutTypeKanban:
30623098
return
30633099
}
30643100

@@ -3558,6 +3594,22 @@ func duplicateAttributeViewKey(operation *Operation) (err error) {
35583594
break
35593595
}
35603596
}
3597+
case av.LayoutTypeKanban:
3598+
for i, field := range view.Kanban.Fields {
3599+
if field.ID == key.ID {
3600+
view.Kanban.Fields = append(view.Kanban.Fields[:i+1], append([]*av.ViewKanbanField{
3601+
{
3602+
BaseField: &av.BaseField{
3603+
ID: copyKey.ID,
3604+
Wrap: field.Wrap,
3605+
Hidden: field.Hidden,
3606+
Desc: field.Desc,
3607+
},
3608+
},
3609+
}, view.Kanban.Fields[i+1:]...)...)
3610+
break
3611+
}
3612+
}
35613613
}
35623614
}
35633615

@@ -3592,7 +3644,7 @@ func setAttributeViewColWidth(operation *Operation) (err error) {
35923644
break
35933645
}
35943646
}
3595-
case av.LayoutTypeGallery:
3647+
case av.LayoutTypeGallery, av.LayoutTypeKanban:
35963648
return
35973649
}
35983650

@@ -3638,6 +3690,14 @@ func setAttributeViewColWrap(operation *Operation) (err error) {
36383690
allFieldWrap = allFieldWrap && field.Wrap
36393691
}
36403692
view.Gallery.WrapField = allFieldWrap
3693+
case av.LayoutTypeKanban:
3694+
for _, field := range view.Kanban.Fields {
3695+
if field.ID == operation.ID {
3696+
field.Wrap = newWrap
3697+
}
3698+
allFieldWrap = allFieldWrap && field.Wrap
3699+
}
3700+
view.Kanban.WrapField = allFieldWrap
36413701
}
36423702

36433703
err = av.SaveAttributeView(attrView)
@@ -3678,6 +3738,13 @@ func setAttributeViewColHidden(operation *Operation) (err error) {
36783738
break
36793739
}
36803740
}
3741+
case av.LayoutTypeKanban:
3742+
for _, field := range view.Kanban.Fields {
3743+
if field.ID == operation.ID {
3744+
field.Hidden = operation.Data.(bool)
3745+
break
3746+
}
3747+
}
36813748
}
36823749

36833750
err = av.SaveAttributeView(attrView)
@@ -3711,7 +3778,7 @@ func setAttributeViewColPin(operation *Operation) (err error) {
37113778
break
37123779
}
37133780
}
3714-
case av.LayoutTypeGallery:
3781+
case av.LayoutTypeGallery, av.LayoutTypeKanban:
37153782
return
37163783
}
37173784

@@ -3939,6 +4006,27 @@ func SortAttributeViewViewKey(avID, blockID, keyID, previousKeyID string) (err e
39394006
}
39404007
}
39414008
view.Gallery.CardFields = util.InsertElem(view.Gallery.CardFields, previousIndex, field)
4009+
case av.LayoutTypeKanban:
4010+
var field *av.ViewKanbanField
4011+
for i, kanbanField := range view.Kanban.Fields {
4012+
if kanbanField.ID == keyID {
4013+
field = kanbanField
4014+
curIndex = i
4015+
break
4016+
}
4017+
}
4018+
if nil == field {
4019+
return
4020+
}
4021+
4022+
view.Kanban.Fields = append(view.Kanban.Fields[:curIndex], view.Kanban.Fields[curIndex+1:]...)
4023+
for i, kanbanField := range view.Kanban.Fields {
4024+
if kanbanField.ID == previousKeyID {
4025+
previousIndex = i + 1
4026+
break
4027+
}
4028+
}
4029+
view.Kanban.Fields = util.InsertElem(view.Kanban.Fields, previousIndex, field)
39424030
}
39434031

39444032
err = av.SaveAttributeView(attrView)
@@ -4062,8 +4150,8 @@ func AddAttributeViewKey(avID, keyID, keyName, keyType, keyIcon, previousKeyID s
40624150
newField.Wrap = view.Table.WrapField
40634151

40644152
if "" == previousKeyID {
4065-
if av.LayoutTypeGallery == currentView.LayoutType {
4066-
// 如果当前视图是卡片视图则添加到最后
4153+
if av.LayoutTypeGallery == currentView.LayoutType || av.LayoutTypeKanban == currentView.LayoutType {
4154+
// 如果当前视图是卡片或看板视图则添加到最后
40674155
view.Table.Columns = append(view.Table.Columns, &av.ViewTableColumn{BaseField: newField})
40684156
} else {
40694157
view.Table.Columns = append([]*av.ViewTableColumn{{BaseField: newField}}, view.Table.Columns...)
@@ -4102,6 +4190,26 @@ func AddAttributeViewKey(avID, keyID, keyName, keyType, keyIcon, previousKeyID s
41024190
}
41034191
}
41044192
}
4193+
4194+
if nil != view.Kanban {
4195+
newField.Wrap = view.Kanban.WrapField
4196+
4197+
if "" == previousKeyID {
4198+
view.Kanban.Fields = append(view.Kanban.Fields, &av.ViewKanbanField{BaseField: newField})
4199+
} else {
4200+
added := false
4201+
for i, field := range view.Kanban.Fields {
4202+
if field.ID == previousKeyID {
4203+
view.Kanban.Fields = append(view.Kanban.Fields[:i+1], append([]*av.ViewKanbanField{{BaseField: newField}}, view.Kanban.Fields[i+1:]...)...)
4204+
added = true
4205+
break
4206+
}
4207+
}
4208+
if !added {
4209+
view.Kanban.Fields = append(view.Kanban.Fields, &av.ViewKanbanField{BaseField: newField})
4210+
}
4211+
}
4212+
}
41054213
}
41064214
}
41074215

@@ -4314,6 +4422,13 @@ func RemoveAttributeViewKey(avID, keyID string, removeRelationDest bool) (err er
43144422
break
43154423
}
43164424
}
4425+
case av.LayoutTypeKanban:
4426+
for i, field := range view.Kanban.Fields {
4427+
if field.ID == removedKey.Relation.BackKeyID {
4428+
view.Kanban.Fields = append(view.Kanban.Fields[:i], view.Kanban.Fields[i+1:]...)
4429+
break
4430+
}
4431+
}
43174432
}
43184433
}
43194434
}
@@ -4358,6 +4473,15 @@ func RemoveAttributeViewKey(avID, keyID string, removeRelationDest bool) (err er
43584473
}
43594474
}
43604475
}
4476+
4477+
if nil != view.Kanban {
4478+
for i, field := range view.Kanban.Fields {
4479+
if field.ID == keyID {
4480+
view.Kanban.Fields = append(view.Kanban.Fields[:i], view.Kanban.Fields[i+1:]...)
4481+
break
4482+
}
4483+
}
4484+
}
43614485
}
43624486

43634487
for _, view := range attrView.Views {

kernel/model/attribute_view_render.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,8 @@ func renderAttributeViewGroups(viewable av.Viewable, attrView *av.AttributeView,
167167
groupView.Table.Columns = nil
168168
case av.LayoutTypeGallery:
169169
groupView.Gallery.CardFields = nil
170+
case av.LayoutTypeKanban:
171+
groupView.Kanban.Fields = nil
170172
}
171173
}
172174
viewable.SetGroups(groups)
@@ -402,6 +404,19 @@ func renderViewableInstance(viewable av.Viewable, view *av.View, attrView *av.At
402404
end = len(gallery.Cards)
403405
}
404406
gallery.Cards = gallery.Cards[start:end]
407+
case av.LayoutTypeKanban:
408+
kanban := viewable.(*av.Kanban)
409+
kanban.CardCount = 0
410+
kanban.PageSize = view.PageSize
411+
if 1 > pageSize {
412+
pageSize = kanban.PageSize
413+
}
414+
start := (page - 1) * pageSize
415+
end := start + pageSize
416+
if len(kanban.Cards) < end {
417+
end = len(kanban.Cards)
418+
}
419+
kanban.Cards = kanban.Cards[start:end]
405420
}
406421
return
407422
}

kernel/model/export.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3454,6 +3454,11 @@ func getAttrViewTable(attrView *av.AttributeView, view *av.View, query string) (
34543454
for _, field := range view.Gallery.CardFields {
34553455
view.Table.Columns = append(view.Table.Columns, &av.ViewTableColumn{BaseField: &av.BaseField{ID: field.ID}})
34563456
}
3457+
case av.LayoutTypeKanban:
3458+
view.Table = av.NewLayoutTable()
3459+
for _, field := range view.Kanban.Fields {
3460+
view.Table.Columns = append(view.Table.Columns, &av.ViewTableColumn{BaseField: &av.BaseField{ID: field.ID}})
3461+
}
34573462
}
34583463

34593464
depth := 1

kernel/sql/av.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,8 @@ func RenderGroupView(attrView *av.AttributeView, view, groupView *av.View, query
7272
groupView.Table.Columns = view.Table.Columns
7373
case av.LayoutTypeGallery:
7474
groupView.Gallery.CardFields = view.Gallery.CardFields
75+
case av.LayoutTypeKanban:
76+
groupView.Kanban.Fields = view.Kanban.Fields
7577
}
7678
}
7779

@@ -102,6 +104,8 @@ func renderView(attrView *av.AttributeView, view *av.View, query string, depth *
102104
ret = RenderAttributeViewTable(attrView, view, query, depth, cachedAttrViews)
103105
case av.LayoutTypeGallery:
104106
ret = RenderAttributeViewGallery(attrView, view, query, depth, cachedAttrViews)
107+
case av.LayoutTypeKanban:
108+
ret = RenderAttributeViewKanban(attrView, view, query, depth, cachedAttrViews)
105109
}
106110
return
107111
}
@@ -784,6 +788,16 @@ func removeMissingField(attrView *av.AttributeView, view *av.View, missingKeyID
784788
}
785789
}
786790

791+
if nil != view.Kanban {
792+
for i, kanbanField := range view.Kanban.Fields {
793+
if kanbanField.ID == missingKeyID {
794+
view.Kanban.Fields = append(view.Kanban.Fields[:i], view.Kanban.Fields[i+1:]...)
795+
changed = true
796+
break
797+
}
798+
}
799+
}
800+
787801
if changed {
788802
av.SaveAttributeView(attrView)
789803
}

0 commit comments

Comments
 (0)