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

This commit is contained in:
Vanessa 2025-08-23 10:25:43 +08:00
commit 9d4ed40acd
15 changed files with 120 additions and 27 deletions

View file

@ -29,7 +29,7 @@
"small": "صغير",
"fitImage": "تعديل حجم الصورة تلقائيًا",
"showIcon": "عرض الأيقونة",
"showAllFieldsIcon": "عرض أيقونات الحقول",
"showAllEntriesIcons": "عرض أيقونات المدخلات",
"wrapAllFields": "التفاف الحقول تلقائيًا",
"gallery": "بطاقة",
"newTag": "علامة جديدة",

View file

@ -29,7 +29,7 @@
"small": "Klein",
"fitImage": "Bildgröße automatisch anpassen",
"showIcon": "Symbol anzeigen",
"showAllFieldsIcon": "Feldsymbole anzeigen",
"showAllEntriesIcons": "Eintragssymbole anzeigen",
"wrapAllFields": "Felder automatisch umbrechen",
"gallery": "Karte",
"newTag": "Neuer Tag",

View file

@ -29,7 +29,7 @@
"small": "Small",
"fitImage": "Auto-fit image size",
"showIcon": "Show icon",
"showAllFieldsIcon": "Show field icons",
"showAllEntriesIcons": "Show entry icons",
"wrapAllFields": "Auto-wrap fields",
"gallery": "Card",
"newTag": "New tag",

View file

@ -29,7 +29,7 @@
"small": "Pequeño",
"fitImage": "Ajustar automáticamente el tamaño de la imagen",
"showIcon": "Mostrar ícono",
"showAllFieldsIcon": "Mostrar íconos de campos",
"showAllEntriesIcons": "Mostrar íconos de entradas",
"wrapAllFields": "Ajuste automático de campos",
"gallery": "Tarjeta",
"newTag": "Nueva etiqueta",

View file

@ -29,7 +29,7 @@
"small": "Petit",
"fitImage": "Ajuster automatiquement la taille de l'image",
"showIcon": "Afficher l'icône",
"showAllFieldsIcon": "Afficher les icônes des champs",
"showAllEntriesIcons": "Afficher les icônes des entrées",
"wrapAllFields": "Retour automatique des champs",
"gallery": "Carte",
"newTag": "Nouvelle étiquette",

View file

@ -29,7 +29,7 @@
"small": "קטן",
"fitImage": "התאמה אוטומטית לגודל התמונה",
"showIcon": "הצג סמל",
"showAllFieldsIcon": "הצג סמלי שדות",
"showAllEntriesIcons": "הצג סמלי כניסות",
"wrapAllFields": "עטיפת שדות אוטומטית",
"gallery": "כרטיס",
"newTag": "תג חדש",

View file

@ -29,7 +29,7 @@
"small": "Piccolo",
"fitImage": "Adatta automaticamente la dimensione dell'immagine",
"showIcon": "Mostra icona",
"showAllFieldsIcon": "Mostra icone dei campi",
"showAllEntriesIcons": "Mostra icone delle voci",
"wrapAllFields": "Avvolgi automaticamente i campi",
"gallery": "Scheda",
"newTag": "Nuova etichetta",

View file

@ -29,7 +29,7 @@
"small": "小",
"fitImage": "画像サイズを自動調整",
"showIcon": "アイコンを表示",
"showAllFieldsIcon": "フィールドアイコンを表示",
"showAllEntriesIcons": "エントリアイコンを表示",
"wrapAllFields": "フィールドを自動折り返し",
"gallery": "カード",
"newTag": "新しいタグ",

View file

@ -29,7 +29,7 @@
"small": "Mały",
"fitImage": "Automatyczne dopasowanie rozmiaru obrazu",
"showIcon": "Pokaż ikonę",
"showAllFieldsIcon": "Pokaż ikony pól",
"showAllEntriesIcons": "Pokaż ikony wpisów",
"wrapAllFields": "Automatyczne zawijanie pól",
"gallery": "Karta",
"newTag": "Nowy tag",

View file

@ -29,7 +29,7 @@
"small": "Pequeno",
"fitImage": "Ajustar automaticamente o tamanho da imagem",
"showIcon": "Mostrar ícone",
"showAllFieldsIcon": "Mostrar ícones de campos",
"showAllEntriesIcons": "Mostrar ícones de entradas",
"wrapAllFields": "Quebrar automaticamente os campos",
"gallery": "Cartão",
"newTag": "Nova tag",

View file

@ -29,7 +29,7 @@
"small": "Маленький",
"fitImage": "Автоматическая подгонка размера изображения",
"showIcon": "Показать значок",
"showAllFieldsIcon": "Показать значки полей",
"showAllEntriesIcons": "Показать значки записей",
"wrapAllFields": "Автоматический перенос полей",
"gallery": "Карточка",
"newTag": "Новый тег",

View file

@ -29,7 +29,7 @@
"small": "小",
"fitImage": "自動調整圖片大小",
"showIcon": "顯示圖標",
"showAllFieldsIcon": "顯示字段圖標",
"showAllEntriesIcons": "顯示條目圖標",
"wrapAllFields": "字段自動換行",
"gallery": "卡片",
"newTag": "新建標籤",

View file

@ -29,7 +29,7 @@
"small": "小",
"fitImage": "自适应图片大小",
"showIcon": "显示图标",
"showAllFieldsIcon": "显示字段图标",
"showAllEntriesIcons": "显示条目图标",
"wrapAllFields": "字段自动换行",
"gallery": "卡片",
"newTag": "新建标签",

View file

@ -82,14 +82,14 @@ export const getLayoutHTML = (data: IAV) => {
</label>
${html}
<label class="b3-menu__item">
<span class="fn__flex-center">${window.siyuan.languages.showAllFieldsIcon}</span>
<span class="fn__flex-center">${window.siyuan.languages.showAllEntriesIcons}</span>
<span class="fn__space fn__flex-1"></span>
<input data-type="toggle-gallery-icon" type="checkbox" class="b3-switch b3-switch--menu" ${view.showIcon ? "checked" : ""}>
<input data-type="toggle-entries-icons" type="checkbox" class="b3-switch b3-switch--menu" ${view.showIcon ? "checked" : ""}>
</label>
<label class="b3-menu__item">
<span class="fn__flex-center">${window.siyuan.languages.wrapAllFields}</span>
<span class="fn__space fn__flex-1"></span>
<input data-type="toggle-gallery-wrap" type="checkbox" class="b3-switch b3-switch--menu" ${view.wrapField ? "checked" : ""}>
<input data-type="toggle-entries-wrap" type="checkbox" class="b3-switch b3-switch--menu" ${view.wrapField ? "checked" : ""}>
</label>
<button class="b3-menu__item" data-type="set-page-size" data-size="${view.pageSize}">
<span class="fn__flex-center">${window.siyuan.languages.entryNum}</span>
@ -124,7 +124,7 @@ export const bindLayoutEvent = (options: {
}]);
options.data.view.hideAttrViewName = !checked;
});
const toggleIconElement = options.menuElement.querySelector('.b3-switch[data-type="toggle-gallery-icon"]') as HTMLInputElement;
const toggleIconElement = options.menuElement.querySelector('.b3-switch[data-type="toggle-entries-icons"]') as HTMLInputElement;
toggleIconElement.addEventListener("change", () => {
const avID = options.blockElement.getAttribute("data-av-id");
const blockID = options.blockElement.getAttribute("data-node-id");
@ -142,7 +142,7 @@ export const bindLayoutEvent = (options: {
}]);
options.data.view.showIcon = checked;
});
const toggleWrapElement = options.menuElement.querySelector('.b3-switch[data-type="toggle-gallery-wrap"]') as HTMLInputElement;
const toggleWrapElement = options.menuElement.querySelector('.b3-switch[data-type="toggle-entries-wrap"]') as HTMLInputElement;
toggleWrapElement.addEventListener("change", () => {
const avID = options.blockElement.getAttribute("data-av-id");
const blockID = options.blockElement.getAttribute("data-node-id");

View file

@ -975,16 +975,55 @@ func (r *ValueRollup) calcContents(calc *RollupCalc, destKey *Key) {
isNotTime = v.Date.IsNotTime
hasEndDate = v.Date.HasEndDate
}
} else if KeyTypeUpdated == v.Type && nil != v.Updated && v.Updated.IsNotEmpty {
if 0 == earliest || v.Updated.Content < earliest {
earliest = v.Updated.Content
isNotTime = true
hasEndDate = false
}
if 0 == latest || v.Updated.Content > latest {
latest = v.Updated.Content
isNotTime = true
hasEndDate = false
}
} else if KeyTypeCreated == v.Type && nil != v.Created && v.Created.IsNotEmpty {
if 0 == earliest || v.Created.Content < earliest {
earliest = v.Created.Content
isNotTime = true
hasEndDate = false
}
if 0 == latest || v.Created.Content > latest {
latest = v.Created.Content
isNotTime = true
hasEndDate = false
}
}
}
if math.MaxFloat64 != minVal && -math.MaxFloat64 != maxVal {
r.Contents = []*Value{{Type: KeyTypeNumber, Number: NewFormattedValueNumber(maxVal-minVal, destKey.NumberFormat)}}
}
if 0 != earliest && 0 != latest {
r.Contents = []*Value{{Type: KeyTypeDate, Date: NewFormattedValueDate(earliest, latest, DateFormatDuration, isNotTime, hasEndDate)}}
typ := r.Contents[0].Type
switch typ {
case KeyTypeNumber:
if math.MaxFloat64 != minVal && -math.MaxFloat64 != maxVal {
r.Contents = []*Value{{Type: KeyTypeNumber, Number: NewFormattedValueNumber(maxVal-minVal, destKey.NumberFormat)}}
}
case KeyTypeDate:
if 0 != earliest && 0 != latest {
r.Contents = []*Value{{Type: KeyTypeDate, Date: NewFormattedValueDate(earliest, latest, DateFormatDuration, isNotTime, hasEndDate)}}
}
case KeyTypeUpdated:
if 0 != earliest && 0 != latest {
r.Contents = []*Value{{Type: KeyTypeUpdated, Date: NewFormattedValueDate(earliest, latest, DateFormatDuration, isNotTime, hasEndDate)}}
}
case KeyTypeCreated:
if 0 != earliest && 0 != latest {
r.Contents = []*Value{{Type: KeyTypeCreated, Date: NewFormattedValueDate(earliest, latest, DateFormatDuration, isNotTime, hasEndDate)}}
}
}
case CalcOperatorEarliest:
if 1 > len(r.Contents) {
return
}
earliest := int64(0)
var isNotTime, hasEndDate bool
for _, v := range r.Contents {
@ -994,12 +1033,41 @@ func (r *ValueRollup) calcContents(calc *RollupCalc, destKey *Key) {
isNotTime = v.Date.IsNotTime
hasEndDate = v.Date.HasEndDate
}
} else if KeyTypeUpdated == v.Type && nil != v.Updated && v.Updated.IsNotEmpty {
if 0 == earliest || v.Updated.Content < earliest {
earliest = v.Updated.Content
isNotTime = true
hasEndDate = false
}
} else if KeyTypeCreated == v.Type && nil != v.Created && v.Created.IsNotEmpty {
if 0 == earliest || v.Created.Content < earliest {
earliest = v.Created.Content
isNotTime = true
hasEndDate = false
}
}
}
if 0 != earliest {
r.Contents = []*Value{{Type: KeyTypeDate, Date: NewFormattedValueDate(earliest, 0, DateFormatNone, isNotTime, hasEndDate)}}
typ := r.Contents[0].Type
switch typ {
case KeyTypeDate:
if 0 != earliest {
r.Contents = []*Value{{Type: KeyTypeDate, Date: NewFormattedValueDate(earliest, 0, DateFormatNone, isNotTime, hasEndDate)}}
}
case KeyTypeUpdated:
if 0 != earliest {
r.Contents = []*Value{{Type: KeyTypeUpdated, Date: NewFormattedValueDate(earliest, 0, DateFormatNone, isNotTime, hasEndDate)}}
}
case KeyTypeCreated:
if 0 != earliest {
r.Contents = []*Value{{Type: KeyTypeCreated, Date: NewFormattedValueDate(earliest, 0, DateFormatNone, isNotTime, hasEndDate)}}
}
}
case CalcOperatorLatest:
if 1 > len(r.Contents) {
return
}
latest := int64(0)
var isNotTime, hasEndDate bool
for _, v := range r.Contents {
@ -1009,10 +1077,35 @@ func (r *ValueRollup) calcContents(calc *RollupCalc, destKey *Key) {
isNotTime = v.Date.IsNotTime
hasEndDate = v.Date.HasEndDate
}
} else if KeyTypeUpdated == v.Type && nil != v.Updated && v.Updated.IsNotEmpty {
if 0 == latest || latest < v.Updated.Content {
latest = v.Updated.Content
isNotTime = true
hasEndDate = false
}
} else if KeyTypeCreated == v.Type && nil != v.Created && v.Created.IsNotEmpty {
if 0 == latest || latest < v.Created.Content {
latest = v.Created.Content
isNotTime = true
hasEndDate = false
}
}
}
if 0 != latest {
r.Contents = []*Value{{Type: KeyTypeDate, Date: NewFormattedValueDate(latest, 0, DateFormatNone, isNotTime, hasEndDate)}}
typ := r.Contents[0].Type
switch typ {
case KeyTypeDate:
if 0 != latest {
r.Contents = []*Value{{Type: KeyTypeDate, Date: NewFormattedValueDate(latest, 0, DateFormatNone, isNotTime, hasEndDate)}}
}
case KeyTypeUpdated:
if 0 != latest {
r.Contents = []*Value{{Type: KeyTypeUpdated, Date: NewFormattedValueDate(latest, 0, DateFormatNone, isNotTime, hasEndDate)}}
}
case KeyTypeCreated:
if 0 != latest {
r.Contents = []*Value{{Type: KeyTypeCreated, Date: NewFormattedValueDate(latest, 0, DateFormatNone, isNotTime, hasEndDate)}}
}
}
case CalcOperatorChecked:
countChecked := 0