Merge remote-tracking branch 'origin/dev' into dev

This commit is contained in:
Vanessa 2026-03-03 10:08:48 +08:00
commit f719cd1f8b
4 changed files with 88 additions and 49 deletions

View file

@ -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, [{

View file

@ -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{}{

View file

@ -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 {

View file

@ -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
}