From 75d29419c5c9f51896e4a7eff95f55f08d0a27d4 Mon Sep 17 00:00:00 2001 From: Jeffrey Chen <78434827+TCOTC@users.noreply.github.com> Date: Tue, 3 Mar 2026 09:49:15 +0800 Subject: [PATCH] :bug: Unable to obtain the correct number of view entries when viewing unreferenced databases or historical databases (#17088) --- app/src/protyle/render/av/action.ts | 5 +++ kernel/api/av.go | 62 +++++++++++++-------------- kernel/av/av.go | 39 +++++++++++------ kernel/model/attribute_view_render.go | 31 ++++++++++++-- 4 files changed, 88 insertions(+), 49 deletions(-) diff --git a/app/src/protyle/render/av/action.ts b/app/src/protyle/render/av/action.ts index 783da9053..80004da58 100644 --- a/app/src/protyle/render/av/action.ts +++ b/app/src/protyle/render/av/action.ts @@ -281,6 +281,11 @@ export const avClick = (protyle: IProtyle, event: MouseEvent & { target: HTMLEle } else if (protyle.options.action.includes(Constants.CB_GET_HISTORY)) { blockElement.setAttribute(Constants.CUSTOM_SY_AV_VIEW, target.dataset.id); blockElement.removeAttribute("data-render"); + if (target.dataset.page) { + blockElement.querySelectorAll(".av__body").forEach((bodyItem: HTMLElement) => { + bodyItem.dataset.pageSize = target.dataset.page; + }); + } avRender(blockElement, protyle); } else { transaction(protyle, [{ diff --git a/kernel/api/av.go b/kernel/api/av.go index 5fbff06ff..4c706393f 100644 --- a/kernel/api/av.go +++ b/kernel/api/av.go @@ -721,17 +721,17 @@ func renderSnapshotAttributeView(c *gin.Context) { return } - var views []map[string]interface{} + var views []*av.ViewData for _, v := range attrView.Views { - view := map[string]interface{}{ - "id": v.ID, - "icon": v.Icon, - "name": v.Name, - "hideAttrViewName": v.HideAttrViewName, - "type": v.LayoutType, - } - - views = append(views, view) + views = append(views, &av.ViewData{ + ID: v.ID, + Icon: v.Icon, + Name: v.Name, + Desc: v.Desc, + HideAttrViewName: v.HideAttrViewName, + Type: v.LayoutType, + PageSize: v.PageSize, + }) } ret.Data = map[string]interface{}{ @@ -797,17 +797,17 @@ func renderHistoryAttributeView(c *gin.Context) { return } - var views []map[string]interface{} + var views []*av.ViewData for _, v := range attrView.Views { - view := map[string]interface{}{ - "id": v.ID, - "icon": v.Icon, - "name": v.Name, - "hideAttrViewName": v.HideAttrViewName, - "type": v.LayoutType, - } - - views = append(views, view) + views = append(views, &av.ViewData{ + ID: v.ID, + Icon: v.Icon, + Name: v.Name, + Desc: v.Desc, + HideAttrViewName: v.HideAttrViewName, + Type: v.LayoutType, + PageSize: v.PageSize, + }) } ret.Data = map[string]interface{}{ @@ -883,19 +883,17 @@ func renderAttrView(blockID, avID, viewID, query string, page, pageSize int, gro return } - var views []map[string]interface{} + var views []*av.ViewData for _, v := range attrView.Views { - view := map[string]interface{}{ - "id": v.ID, - "icon": v.Icon, - "name": v.Name, - "desc": v.Desc, - "hideAttrViewName": v.HideAttrViewName, - "type": v.LayoutType, - "pageSize": v.PageSize, - } - - views = append(views, view) + views = append(views, &av.ViewData{ + ID: v.ID, + Icon: v.Icon, + Name: v.Name, + Desc: v.Desc, + HideAttrViewName: v.HideAttrViewName, + Type: v.LayoutType, + PageSize: v.PageSize, + }) } ret.Data = map[string]interface{}{ diff --git a/kernel/av/av.go b/kernel/av/av.go index 95aaf5d2e..340f9d213 100644 --- a/kernel/av/av.go +++ b/kernel/av/av.go @@ -238,6 +238,17 @@ type View struct { GroupSort int `json:"groupSort"` // 分组排序值,用于手动排序 } +// ViewData 用于序列化视图数据到前端 +type ViewData struct { + ID string `json:"id"` + Icon string `json:"icon"` + Name string `json:"name"` + Desc string `json:"desc"` + HideAttrViewName bool `json:"hideAttrViewName"` + Type LayoutType `json:"type"` + PageSize int `json:"pageSize"` +} + func (view *View) IsGroupView() bool { return nil != view.Group && "" != view.Group.Field } @@ -587,22 +598,24 @@ func SaveAttributeView(av *AttributeView) (err error) { // 值去重 blockValues := av.GetBlockKeyValues() - blockIDs := map[string]bool{} - var duplicatedValueIDs []string - for _, blockValue := range blockValues.Values { - if !blockIDs[blockValue.BlockID] { - blockIDs[blockValue.BlockID] = true - } else { - duplicatedValueIDs = append(duplicatedValueIDs, blockValue.ID) + if nil != blockValues { + blockIDs := map[string]bool{} + var duplicatedValueIDs []string + for _, blockValue := range blockValues.Values { + if !blockIDs[blockValue.BlockID] { + blockIDs[blockValue.BlockID] = true + } else { + duplicatedValueIDs = append(duplicatedValueIDs, blockValue.ID) + } } - } - var tmp []*Value - for _, blockValue := range blockValues.Values { - if !gulu.Str.Contains(blockValue.ID, duplicatedValueIDs) { - tmp = append(tmp, blockValue) + var tmp []*Value + for _, blockValue := range blockValues.Values { + if !gulu.Str.Contains(blockValue.ID, duplicatedValueIDs) { + tmp = append(tmp, blockValue) + } } + blockValues.Values = tmp } - blockValues.Values = tmp // 视图值去重 for _, view := range av.Views { diff --git a/kernel/model/attribute_view_render.go b/kernel/model/attribute_view_render.go index 93b654236..efb20bbe8 100644 --- a/kernel/model/attribute_view_render.go +++ b/kernel/model/attribute_view_render.go @@ -104,8 +104,14 @@ func renderAttributeViewGroups(viewable av.Viewable, attrView *av.AttributeView, preferredGroupKey := getKanbanPreferredGroupKey(attrView) group := &av.ViewGroup{Field: preferredGroupKey.ID} setAttributeViewGroup(attrView, view, group) - av.SaveAttributeView(attrView) + if err = av.SaveAttributeView(attrView); err != nil { + logging.LogErrorf("save attribute view [%s] failed: %s", attrView.ID, err) + return + } groupKey = view.GetGroupKey(attrView) + if nil == groupKey { + return + } } else { return } @@ -116,20 +122,29 @@ func renderAttributeViewGroups(viewable av.Viewable, attrView *av.AttributeView, createdDate := time.UnixMilli(view.GroupCreated).Format("2006-01-02") if time.Now().Format("2006-01-02") != createdDate { genAttrViewGroups(view, attrView) // 仅重新生成一个视图的分组以提升性能 - av.SaveAttributeView(attrView) + if err = av.SaveAttributeView(attrView); err != nil { + logging.LogErrorf("save attribute view [%s] failed: %s", attrView.ID, err) + return + } } } // 如果是按模板分组则需要重新生成分组 if isGroupByTemplate(attrView, view) { genAttrViewGroups(view, attrView) // 仅重新生成一个视图的分组以提升性能 - av.SaveAttributeView(attrView) + if err = av.SaveAttributeView(attrView); err != nil { + logging.LogErrorf("save attribute view [%s] failed: %s", attrView.ID, err) + return + } } // 渲染分组视图 if nil == view.Groups { genAttrViewGroups(view, attrView) - av.SaveAttributeView(attrView) + if err = av.SaveAttributeView(attrView); err != nil { + logging.LogErrorf("save attribute view [%s] failed: %s", attrView.ID, err) + return + } } for _, groupView := range view.Groups { @@ -510,10 +525,13 @@ func RenderRepoSnapshotAttributeView(indexID, avID string) (viewable av.Viewable } attrView = av.NewAttributeView(avID) + err = av.ErrAttributeViewNotFound + return } else { data, readErr := repo.OpenFile(avFile) if nil != readErr { logging.LogErrorf("read attribute view [%s] failed: %s", avID, readErr) + err = readErr return } @@ -537,6 +555,7 @@ func RenderHistoryAttributeView(blockID, avID, viewID, query string, page, pageS createdUnix, parseErr := strconv.ParseInt(created, 10, 64) if nil != parseErr { logging.LogErrorf("parse created [%s] failed: %s", created, parseErr) + err = fmt.Errorf("parse created [%s] failed: %w", created, parseErr) return } @@ -548,6 +567,7 @@ func RenderHistoryAttributeView(blockID, avID, viewID, query string, page, pageS return } if 1 > len(matches) { + err = av.ErrAttributeViewNotFound return } @@ -565,10 +585,13 @@ func RenderHistoryAttributeView(blockID, avID, viewID, query string, page, pageS } attrView = av.NewAttributeView(avID) + err = av.ErrAttributeViewNotFound + return } else { data, readErr := os.ReadFile(avJSONPath) if nil != readErr { logging.LogErrorf("read attribute view [%s] failed: %s", avID, readErr) + err = readErr return }