This commit is contained in:
Daniel 2025-08-09 21:15:59 +08:00
parent 7e7acf27cf
commit a31e79001e
No known key found for this signature in database
GPG key ID: 86211BA83DF03017
17 changed files with 65 additions and 28 deletions

View file

@ -1,4 +1,5 @@
{ {
"sortBySelectOption": "Nach Option sortieren",
"groupStep": "فاصل التجميع", "groupStep": "فاصل التجميع",
"groupRange": "نطاق التجميع", "groupRange": "نطاق التجميع",
"groupMethodDateRelative": "تاريخ نسبي", "groupMethodDateRelative": "تاريخ نسبي",

View file

@ -1,4 +1,5 @@
{ {
"sortBySelectOption": "Nach Option sortieren",
"groupStep": "Gruppierungsintervall", "groupStep": "Gruppierungsintervall",
"groupRange": "Gruppierungsbereich", "groupRange": "Gruppierungsbereich",
"groupMethodDateRelative": "Relatives Datum", "groupMethodDateRelative": "Relatives Datum",

View file

@ -1,4 +1,5 @@
{ {
"sortBySelectOption": "Sort by option",
"groupStep": "Group interval", "groupStep": "Group interval",
"groupRange": "Group range", "groupRange": "Group range",
"groupMethodDateRelative": "Relative date", "groupMethodDateRelative": "Relative date",

View file

@ -1,4 +1,5 @@
{ {
"sortBySelectOption": "Ordenar por opción",
"groupStep": "Intervalo de agrupación", "groupStep": "Intervalo de agrupación",
"groupRange": "Rango de agrupación", "groupRange": "Rango de agrupación",
"groupMethodDateRelative": "Fecha relativa", "groupMethodDateRelative": "Fecha relativa",

View file

@ -1,4 +1,5 @@
{ {
"sortBySelectOption": "Trier par option",
"groupStep": "Intervalle de regroupement", "groupStep": "Intervalle de regroupement",
"groupRange": "Plage de regroupement", "groupRange": "Plage de regroupement",
"groupMethodDateRelative": "Date relative", "groupMethodDateRelative": "Date relative",

View file

@ -1,4 +1,5 @@
{ {
"sortBySelectOption": "מיין לפי אפשרות",
"groupStep": "מרווח קיבוץ", "groupStep": "מרווח קיבוץ",
"groupRange": "טווח קיבוץ", "groupRange": "טווח קיבוץ",
"groupMethodDateRelative": "תאריך יחסי", "groupMethodDateRelative": "תאריך יחסי",

View file

@ -1,4 +1,5 @@
{ {
"sortBySelectOption": "Ordina per opzione",
"groupStep": "Intervallo di raggruppamento", "groupStep": "Intervallo di raggruppamento",
"groupRange": "Intervallo di gruppo", "groupRange": "Intervallo di gruppo",
"groupMethodDateRelative": "Data relativa", "groupMethodDateRelative": "Data relativa",

View file

@ -1,4 +1,5 @@
{ {
"sortBySelectOption": "オプションで並べ替え",
"groupStep": "グループ間隔", "groupStep": "グループ間隔",
"groupRange": "グループ範囲", "groupRange": "グループ範囲",
"groupMethodDateRelative": "相対日付", "groupMethodDateRelative": "相対日付",

View file

@ -1,4 +1,5 @@
{ {
"sortBySelectOption": "Sortuj według opcji",
"groupStep": "Odstęp grupowania", "groupStep": "Odstęp grupowania",
"groupRange": "Zakres grupowania", "groupRange": "Zakres grupowania",
"groupMethodDateRelative": "Data względna", "groupMethodDateRelative": "Data względna",

View file

@ -1,4 +1,5 @@
{ {
"sortBySelectOption": "Classificar por opção",
"groupStep": "Intervalo de agrupamento", "groupStep": "Intervalo de agrupamento",
"groupRange": "Intervalo de grupo", "groupRange": "Intervalo de grupo",
"groupMethodDateRelative": "Data relativa", "groupMethodDateRelative": "Data relativa",

View file

@ -1,4 +1,5 @@
{ {
"sortBySelectOption": "Сортировать по опции",
"groupStep": "Интервал группировки", "groupStep": "Интервал группировки",
"groupRange": "Диапазон группировки", "groupRange": "Диапазон группировки",
"groupMethodDateRelative": "Относительная дата", "groupMethodDateRelative": "Относительная дата",

View file

@ -1,4 +1,5 @@
{ {
"sortBySelectOption": "按選項排序",
"groupStep": "分組間隔", "groupStep": "分組間隔",
"groupRange": "分組範圍", "groupRange": "分組範圍",
"groupMethodDateRelative": "相對日期", "groupMethodDateRelative": "相對日期",

View file

@ -1,4 +1,5 @@
{ {
"sortBySelectOption": "按选项排序",
"groupStep": "分组间隔", "groupStep": "分组间隔",
"groupRange": "分组范围", "groupRange": "分组范围",
"groupMethodDateRelative": "相对日期", "groupMethodDateRelative": "相对日期",

View file

@ -102,6 +102,8 @@ export const getLanguageByIndex = (index: number, type: "sort" | "date") => {
return window.siyuan.languages.desc; return window.siyuan.languages.desc;
case 2: case 2:
return window.siyuan.languages.customSort; return window.siyuan.languages.customSort;
case 3:
return window.siyuan.languages.sortBySelectOption;
default: default:
return ""; return "";
} }

View file

@ -52,4 +52,5 @@ const (
GroupOrderAsc = iota // 升序 GroupOrderAsc = iota // 升序
GroupOrderDesc // 降序 GroupOrderDesc // 降序
GroupOrderMan // 手动排序 GroupOrderMan // 手动排序
GroupOrderSelectOption // 同选择的选项排序(仅单选和多选字段适用) https://github.com/siyuan-note/siyuan/issues/15500
) )

View file

@ -174,7 +174,7 @@ func sortAttributeViewGroup(avID, blockID, previousGroupID, groupID string) (err
return err return err
} }
sortGroupViews(view) sortGroupViews(attrView, view)
var groupView *av.View var groupView *av.View
var index, previousIndex int var index, previousIndex int
@ -453,26 +453,7 @@ func SetAttributeViewGroup(avID, blockID string, group *av.ViewGroup) (err error
if groupKey := view.GetGroupKey(attrView); nil != groupKey && (av.KeyTypeSelect == groupKey.Type || av.KeyTypeMSelect == groupKey.Type) { if groupKey := view.GetGroupKey(attrView); nil != groupKey && (av.KeyTypeSelect == groupKey.Type || av.KeyTypeMSelect == groupKey.Type) {
// 首次设置分组时,如果分组字段是单选或多选类型,则将分组方式改为手动排序,并按选项顺序排序分组视图 https://github.com/siyuan-note/siyuan/issues/15491 // 首次设置分组时,如果分组字段是单选或多选类型,则将分组方式改为手动排序,并按选项顺序排序分组视图 https://github.com/siyuan-note/siyuan/issues/15491
view.Group.Order = av.GroupOrderMan view.Group.Order = av.GroupOrderMan
optionSort := map[string]int{} sortGroupsBySelectOption(view, groupKey)
for i, op := range groupKey.Options {
optionSort[op.Name] = i
}
defaultGroup := view.GetGroupByGroupValue(groupValueDefault)
if nil != defaultGroup {
view.RemoveGroupByID(defaultGroup.ID)
}
sort.Slice(view.Groups, func(i, j int) bool {
vSort := optionSort[view.Groups[i].GetGroupValue()]
oSort := optionSort[view.Groups[j].GetGroupValue()]
return vSort < oSort
})
if nil != defaultGroup {
view.Groups = append(view.Groups, defaultGroup)
}
for i, g := range view.Groups { for i, g := range view.Groups {
g.GroupSort = i g.GroupSort = i
} }

View file

@ -137,7 +137,7 @@ func renderAttributeViewGroups(viewable av.Viewable, attrView *av.AttributeView,
} }
} }
sortGroupViews(view) sortGroupViews(attrView, view)
var groups []av.Viewable var groups []av.Viewable
for _, groupView := range view.Groups { for _, groupView := range view.Groups {
@ -193,13 +193,13 @@ func hideEmptyGroupViews(view *av.View, viewable av.Viewable) {
} }
} }
func sortGroupViews(view *av.View) { func sortGroupViews(attrView *av.AttributeView, view *av.View) {
if av.GroupOrderMan == view.Group.Order { if av.GroupOrderMan == view.Group.Order {
sort.Slice(view.Groups, func(i, j int) bool { return view.Groups[i].GroupSort < view.Groups[j].GroupSort }) sort.Slice(view.Groups, func(i, j int) bool { return view.Groups[i].GroupSort < view.Groups[j].GroupSort })
return return
} }
if av.GroupMethodDateRelative == view.Group.Method { // 相对日期分组排序 if av.GroupMethodDateRelative == view.Group.Method {
var relativeDateGroups []*av.View var relativeDateGroups []*av.View
var last30Days, last7Days, yesterday, today, tomorrow, next7Days, next30Days, defaultGroup *av.View var last30Days, last7Days, yesterday, today, tomorrow, next7Days, next30Days, defaultGroup *av.View
for _, groupView := range view.Groups { for _, groupView := range view.Groups {
@ -280,7 +280,10 @@ func sortGroupViews(view *av.View) {
} }
view.Groups = relativeDateGroups view.Groups = relativeDateGroups
} else { // 升序/降序 return
}
if av.GroupOrderAsc == view.Group.Order || av.GroupOrderDesc == view.Group.Order {
defaultGroup := view.GetGroupByGroupValue(groupValueDefault) defaultGroup := view.GetGroupByGroupValue(groupValueDefault)
if nil != defaultGroup { if nil != defaultGroup {
view.RemoveGroupByID(defaultGroup.ID) view.RemoveGroupByID(defaultGroup.ID)
@ -297,6 +300,43 @@ func sortGroupViews(view *av.View) {
if nil != defaultGroup { if nil != defaultGroup {
view.Groups = append(view.Groups, defaultGroup) view.Groups = append(view.Groups, defaultGroup)
} }
return
}
if av.GroupOrderSelectOption == view.Group.Order {
groupKey := view.GetGroupKey(attrView)
if nil == groupKey {
return
}
if av.KeyTypeSelect != groupKey.Type && av.KeyTypeMSelect != groupKey.Type {
return
}
sortGroupsBySelectOption(view, groupKey)
return
}
}
func sortGroupsBySelectOption(view *av.View, groupKey *av.Key) {
optionSort := map[string]int{}
for i, op := range groupKey.Options {
optionSort[op.Name] = i
}
defaultGroup := view.GetGroupByGroupValue(groupValueDefault)
if nil != defaultGroup {
view.RemoveGroupByID(defaultGroup.ID)
}
sort.Slice(view.Groups, func(i, j int) bool {
vSort := optionSort[view.Groups[i].GetGroupValue()]
oSort := optionSort[view.Groups[j].GetGroupValue()]
return vSort < oSort
})
if nil != defaultGroup {
view.Groups = append(view.Groups, defaultGroup)
} }
} }