mirror of
https://github.com/siyuan-note/siyuan.git
synced 2025-12-17 15:10:12 +01:00
🎨 Database gallery view https://github.com/siyuan-note/siyuan/issues/10414
This commit is contained in:
parent
67370745b2
commit
d05010a71f
5 changed files with 73 additions and 25 deletions
|
|
@ -189,6 +189,26 @@ type View struct {
|
||||||
Gallery *LayoutGallery `json:"gallery,omitempty"` // 画廊布局
|
Gallery *LayoutGallery `json:"gallery,omitempty"` // 画廊布局
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (view *View) GetFilters() (ret []*ViewFilter) {
|
||||||
|
switch view.LayoutType {
|
||||||
|
case LayoutTypeTable:
|
||||||
|
return view.Table.Filters
|
||||||
|
case LayoutTypeGallery:
|
||||||
|
return view.Gallery.Filters
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (view *View) GetSorts() (ret []*ViewSort) {
|
||||||
|
switch view.LayoutType {
|
||||||
|
case LayoutTypeTable:
|
||||||
|
return view.Table.Sorts
|
||||||
|
case LayoutTypeGallery:
|
||||||
|
return view.Gallery.Sorts
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
// LayoutType 描述了视图布局类型。
|
// LayoutType 描述了视图布局类型。
|
||||||
type LayoutType string
|
type LayoutType string
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -91,6 +91,9 @@ type Item interface {
|
||||||
// GetValues 返回项目的所有字段值。
|
// GetValues 返回项目的所有字段值。
|
||||||
GetValues() []*Value
|
GetValues() []*Value
|
||||||
|
|
||||||
|
// GetValue 返回指定键 ID 的字段值。
|
||||||
|
GetValue(keyID string) (ret *Value)
|
||||||
|
|
||||||
// GetID 返回项目的 ID。
|
// GetID 返回项目的 ID。
|
||||||
GetID() string
|
GetID() string
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -138,6 +138,16 @@ func (card *GalleryCard) GetValues() (ret []*Value) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (card *GalleryCard) GetValue(keyID string) (ret *Value) {
|
||||||
|
for _, value := range card.Values {
|
||||||
|
if nil != value.Value && keyID == value.Value.KeyID {
|
||||||
|
ret = value.Value
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
func (gallery *Gallery) GetItems() (ret []Item) {
|
func (gallery *Gallery) GetItems() (ret []Item) {
|
||||||
ret = []Item{}
|
ret = []Item{}
|
||||||
for _, card := range gallery.Cards {
|
for _, card := range gallery.Cards {
|
||||||
|
|
|
||||||
|
|
@ -91,16 +91,6 @@ type TableCell struct {
|
||||||
BgColor string `json:"bgColor"` // 单元格背景颜色
|
BgColor string `json:"bgColor"` // 单元格背景颜色
|
||||||
}
|
}
|
||||||
|
|
||||||
func (row *TableRow) GetValue(keyID string) (ret *Value) {
|
|
||||||
for _, cell := range row.Cells {
|
|
||||||
if nil != cell.Value && keyID == cell.Value.KeyID {
|
|
||||||
ret = cell.Value
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func (table *Table) GetColumn(id string) *TableColumn {
|
func (table *Table) GetColumn(id string) *TableColumn {
|
||||||
for _, column := range table.Columns {
|
for _, column := range table.Columns {
|
||||||
if column.ID == id {
|
if column.ID == id {
|
||||||
|
|
@ -134,6 +124,16 @@ func (row *TableRow) GetValues() (ret []*Value) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (row *TableRow) GetValue(keyID string) (ret *Value) {
|
||||||
|
for _, cell := range row.Cells {
|
||||||
|
if nil != cell.Value && keyID == cell.Value.KeyID {
|
||||||
|
ret = cell.Value
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
func (table *Table) GetItems() (ret []Item) {
|
func (table *Table) GetItems() (ret []Item) {
|
||||||
ret = []Item{}
|
ret = []Item{}
|
||||||
for _, row := range table.Rows {
|
for _, row := range table.Rows {
|
||||||
|
|
|
||||||
|
|
@ -2418,34 +2418,49 @@ func addAttributeViewBlock(now int64, avID, blockID, previousBlockID, addingBloc
|
||||||
|
|
||||||
// 如果存在过滤条件,则将过滤条件应用到新添加的块上
|
// 如果存在过滤条件,则将过滤条件应用到新添加的块上
|
||||||
view, _ := getAttrViewViewByBlockID(attrView, blockID)
|
view, _ := getAttrViewViewByBlockID(attrView, blockID)
|
||||||
if nil != view && 0 < len(view.Table.Filters) && !ignoreFillFilter {
|
var filters []*av.ViewFilter
|
||||||
viewable := sql.RenderAttributeViewTable(attrView, view, "")
|
if nil != view {
|
||||||
|
filters = view.GetFilters()
|
||||||
|
}
|
||||||
|
|
||||||
|
if nil != view && 0 < len(filters) && !ignoreFillFilter {
|
||||||
|
var viewable av.Viewable
|
||||||
|
switch view.LayoutType {
|
||||||
|
case av.LayoutTypeTable:
|
||||||
|
viewable = sql.RenderAttributeViewTable(attrView, view, "")
|
||||||
|
case av.LayoutTypeGallery:
|
||||||
|
viewable = sql.RenderAttributeViewGallery(attrView, view, "")
|
||||||
|
}
|
||||||
viewable.Filter(attrView)
|
viewable.Filter(attrView)
|
||||||
viewable.Sort(attrView)
|
viewable.Sort(attrView)
|
||||||
|
|
||||||
var nearRow *av.TableRow
|
collection := viewable.(av.Collection)
|
||||||
if 0 < len(viewable.Rows) {
|
items := collection.GetItems()
|
||||||
|
|
||||||
|
var nearItem av.Item
|
||||||
|
if 0 < len(items) {
|
||||||
if "" != previousBlockID {
|
if "" != previousBlockID {
|
||||||
for _, row := range viewable.Rows {
|
for _, row := range items {
|
||||||
if row.ID == previousBlockID {
|
if row.GetID() == previousBlockID {
|
||||||
nearRow = row
|
nearItem = row
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if 0 < len(viewable.Rows) {
|
if 0 < len(items) {
|
||||||
nearRow = viewable.Rows[0]
|
nearItem = items[0]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
sameKeyFilterSort := false // 是否在同一个字段上同时存在过滤和排序
|
sameKeyFilterSort := false // 是否在同一个字段上同时存在过滤和排序
|
||||||
if 0 < len(viewable.Sorts) {
|
sorts := view.GetSorts()
|
||||||
|
if 0 < len(sorts) {
|
||||||
filterKeys, sortKeys := map[string]bool{}, map[string]bool{}
|
filterKeys, sortKeys := map[string]bool{}, map[string]bool{}
|
||||||
for _, f := range view.Table.Filters {
|
for _, f := range filters {
|
||||||
filterKeys[f.Column] = true
|
filterKeys[f.Column] = true
|
||||||
}
|
}
|
||||||
for _, s := range view.Table.Sorts {
|
for _, s := range sorts {
|
||||||
sortKeys[s.Column] = true
|
sortKeys[s.Column] = true
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -2459,12 +2474,12 @@ func addAttributeViewBlock(now int64, avID, blockID, previousBlockID, addingBloc
|
||||||
|
|
||||||
if !sameKeyFilterSort {
|
if !sameKeyFilterSort {
|
||||||
// 如果在同一个字段上仅存在过滤条件,则将过滤条件应用到新添加的块上
|
// 如果在同一个字段上仅存在过滤条件,则将过滤条件应用到新添加的块上
|
||||||
for _, filter := range view.Table.Filters {
|
for _, filter := range filters {
|
||||||
for _, keyValues := range attrView.KeyValues {
|
for _, keyValues := range attrView.KeyValues {
|
||||||
if keyValues.Key.ID == filter.Column {
|
if keyValues.Key.ID == filter.Column {
|
||||||
var defaultVal *av.Value
|
var defaultVal *av.Value
|
||||||
if nil != nearRow {
|
if nil != nearItem {
|
||||||
defaultVal = nearRow.GetValue(filter.Column)
|
defaultVal = nearItem.GetValue(filter.Column)
|
||||||
}
|
}
|
||||||
|
|
||||||
newValue := filter.GetAffectValue(keyValues.Key, defaultVal)
|
newValue := filter.GetAffectValue(keyValues.Key, defaultVal)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue