🎨 Add "Show unique values" to the calculation of the database rollup field https://github.com/siyuan-note/siyuan/issues/15852

Signed-off-by: Daniel <845765@qq.com>
This commit is contained in:
Daniel 2025-09-15 23:07:09 +08:00
parent 66125f4b1d
commit 812dadb452
No known key found for this signature in database
GPG key ID: 86211BA83DF03017
16 changed files with 54 additions and 13 deletions

View file

@ -170,7 +170,8 @@
"cloudStoragePurgeConfirm": "‫سيؤدي تطهير التخزين السحابي إلى حذف جميع اللقطات غير المرجعية وعناصر البيانات ذات الصلة. <ul class='fn__list'><li>الرجاء التأكد من أن الأجهزة الأخرى توقفت عن المزامنة قبل التنفيذ</li><li>عملية التطهير تستغرق وقتاً طويلاً جداً، الرجاء التأكد من أن الشبكة مستقرة</li></ul>هل أنت متأكد من تنفيذها الآن؟‬", "cloudStoragePurgeConfirm": "‫سيؤدي تطهير التخزين السحابي إلى حذف جميع اللقطات غير المرجعية وعناصر البيانات ذات الصلة. <ul class='fn__list'><li>الرجاء التأكد من أن الأجهزة الأخرى توقفت عن المزامنة قبل التنفيذ</li><li>عملية التطهير تستغرق وقتاً طويلاً جداً، الرجاء التأكد من أن الشبكة مستقرة</li></ul>هل أنت متأكد من تنفيذها الآن؟‬",
"dragFill": "اسحب عمودياً لملء القيمة", "dragFill": "اسحب عمودياً لملء القيمة",
"switchReadonly": "تبديل وضع القراءة فقط", "switchReadonly": "تبديل وضع القراءة فقط",
"original": "القيمة الأصلية", "original": "عرض القيمة الأصلية",
"uniqueValues": "عرض القيم الفريدة",
"selectRelation": "الرجاء تحديد الحقل ذي الصلة أولاً", "selectRelation": "الرجاء تحديد الحقل ذي الصلة أولاً",
"backRelation": "ثنائي الاتجاه", "backRelation": "ثنائي الاتجاه",
"thisDatabase": "قاعدة البيانات هذه", "thisDatabase": "قاعدة البيانات هذه",

View file

@ -170,7 +170,8 @@
"cloudStoragePurgeConfirm": "Das Bereinigen des Cloud-Speichers löscht alle nicht referenzierten Schnappschüsse und zugehörigen Datenobjekte vollständig. <ul class='fn__list'><li>Bitte stellen Sie sicher, dass andere Geräte die Synchronisation pausiert haben, bevor Sie fortfahren</li><li>Der Bereinigungsvorgang kann sehr zeitaufwendig sein, bitte stellen Sie sicher, dass das Netzwerk stabil ist</li></ul>Sind Sie sicher, dass Sie es jetzt ausführen möchten?", "cloudStoragePurgeConfirm": "Das Bereinigen des Cloud-Speichers löscht alle nicht referenzierten Schnappschüsse und zugehörigen Datenobjekte vollständig. <ul class='fn__list'><li>Bitte stellen Sie sicher, dass andere Geräte die Synchronisation pausiert haben, bevor Sie fortfahren</li><li>Der Bereinigungsvorgang kann sehr zeitaufwendig sein, bitte stellen Sie sicher, dass das Netzwerk stabil ist</li></ul>Sind Sie sicher, dass Sie es jetzt ausführen möchten?",
"dragFill": "Vertikal ziehen, um Werte zu füllen", "dragFill": "Vertikal ziehen, um Werte zu füllen",
"switchReadonly": "In den Nur-Lesen-Modus wechseln", "switchReadonly": "In den Nur-Lesen-Modus wechseln",
"original": "Original", "original": "Originalwert anzeigen",
"uniqueValues": "Eindeutige Werte anzeigen",
"selectRelation": "Bitte wählen Sie zuerst die zugehörige Spalte aus", "selectRelation": "Bitte wählen Sie zuerst die zugehörige Spalte aus",
"backRelation": "Bidirektional", "backRelation": "Bidirektional",
"thisDatabase": "Diese Datenbank", "thisDatabase": "Diese Datenbank",

View file

@ -170,7 +170,8 @@
"cloudStoragePurgeConfirm": "Purging the cloud storage will completely delete all unreferenced snapshots and related data objects. <ul class='fn__list'><li>Please ensure that other devices have paused sync before execution</li><li>The purge operation is very time-consuming, please ensure that the network is stable</li></ul>Are you sure to execute it now?", "cloudStoragePurgeConfirm": "Purging the cloud storage will completely delete all unreferenced snapshots and related data objects. <ul class='fn__list'><li>Please ensure that other devices have paused sync before execution</li><li>The purge operation is very time-consuming, please ensure that the network is stable</li></ul>Are you sure to execute it now?",
"dragFill": "Drag vertically to fill value", "dragFill": "Drag vertically to fill value",
"switchReadonly": "Switch read-only mode", "switchReadonly": "Switch read-only mode",
"original": "Original", "original": "Show original values",
"uniqueValues": "Show unique values",
"selectRelation": "Please select the related field first", "selectRelation": "Please select the related field first",
"backRelation": "Bidirectional", "backRelation": "Bidirectional",
"thisDatabase": "This database", "thisDatabase": "This database",

View file

@ -170,7 +170,8 @@
"cloudStoragePurgeConfirm": "Al purgar el almacenamiento en la nube se eliminarán por completo todas las instantáneas sin referencia y los objetos de datos relacionados.<ul class='fn__list'><li>Asegúrese de que otros dispositivos hayan pausado la sincronización antes de la ejecución</li><li>La operación de purga requiere mucho tiempo; asegúrese de que la red esté estable</li></ul>¿Está seguro de ejecutarla ahora?", "cloudStoragePurgeConfirm": "Al purgar el almacenamiento en la nube se eliminarán por completo todas las instantáneas sin referencia y los objetos de datos relacionados.<ul class='fn__list'><li>Asegúrese de que otros dispositivos hayan pausado la sincronización antes de la ejecución</li><li>La operación de purga requiere mucho tiempo; asegúrese de que la red esté estable</li></ul>¿Está seguro de ejecutarla ahora?",
"dragFill": "Arrastra verticalmente para llenar valores", "dragFill": "Arrastra verticalmente para llenar valores",
"switchReadonly": "Cambiar modo de sólo lectura", "switchReadonly": "Cambiar modo de sólo lectura",
"original": "Original", "original": "Mostrar valor original",
"uniqueValues": "Mostrar valores únicos",
"selectRelation": "Seleccione primero la columna relacionada", "selectRelation": "Seleccione primero la columna relacionada",
"backRelation": "Bidireccional", "backRelation": "Bidireccional",
"thisDatabase": "Esta base de datos", "thisDatabase": "Esta base de datos",

View file

@ -170,7 +170,8 @@
"cloudStoragePurgeConfirm": "La purge du stockage cloud supprimera complètement tous les instantanés non référencés et les objets de données associés. <ul class='fn__list'><li>Veuillez vous assurer que la synchronisation des autres appareils a été suspendue avant l'exécution</li><li>L'opération de purge prend beaucoup de temps, veuillez vous assurer que le réseau est stable</li></ul>Êtes-vous sûr de l'exécuter maintenant ?", "cloudStoragePurgeConfirm": "La purge du stockage cloud supprimera complètement tous les instantanés non référencés et les objets de données associés. <ul class='fn__list'><li>Veuillez vous assurer que la synchronisation des autres appareils a été suspendue avant l'exécution</li><li>L'opération de purge prend beaucoup de temps, veuillez vous assurer que le réseau est stable</li></ul>Êtes-vous sûr de l'exécuter maintenant ?",
"dragFill": "Faites glisser verticalement pour remplir les valeurs", "dragFill": "Faites glisser verticalement pour remplir les valeurs",
"switchReadonly": "Changer de mode lecture seule", "switchReadonly": "Changer de mode lecture seule",
"original": "Originale", "original": "Afficher la valeur d'origine",
"uniqueValues": "Afficher les valeurs uniques",
"selectRelation": "Veuillez d'abord sélectionner la colonne associée", "selectRelation": "Veuillez d'abord sélectionner la colonne associée",
"backRelation": "Bidirectionnel", "backRelation": "Bidirectionnel",
"thisDatabase": "Cette base de données", "thisDatabase": "Cette base de données",

View file

@ -170,7 +170,8 @@
"cloudStoragePurgeConfirm": "ניקוי האחסון בענן ימחוק לחלוטין את כל הצילומים הלא מתייחסים וכל האובייקטים הנתונים הקשורים. <ul class='fn__list'><li>אנא ודא שהמכשירים האחרים הפסיקו סנכרון לפני הביצוע</li><li>הניקוי מאוד לוקח זמן, אנא ודא שהרשת יציבה</li></ul>האם אתה בטוח לבצע את זה עכשיו?", "cloudStoragePurgeConfirm": "ניקוי האחסון בענן ימחוק לחלוטין את כל הצילומים הלא מתייחסים וכל האובייקטים הנתונים הקשורים. <ul class='fn__list'><li>אנא ודא שהמכשירים האחרים הפסיקו סנכרון לפני הביצוע</li><li>הניקוי מאוד לוקח זמן, אנא ודא שהרשת יציבה</li></ul>האם אתה בטוח לבצע את זה עכשיו?",
"dragFill": "גרור אנכית כדי למלא ערכים", "dragFill": "גרור אנכית כדי למלא ערכים",
"switchReadonly": "עבר למצב קריאה בלבד", "switchReadonly": "עבר למצב קריאה בלבד",
"original": "מקורי", "original": "הצג ערך מקורי",
"uniqueValues": "הצג ערכים ייחודיים",
"selectRelation": "אנא בחר קודם את העמודה הקשורה", "selectRelation": "אנא בחר קודם את העמודה הקשורה",
"backRelation": "דו-כיווני", "backRelation": "דו-כיווני",
"thisDatabase": "בסיס הנתונים הזה", "thisDatabase": "בסיס הנתונים הזה",

View file

@ -170,7 +170,8 @@
"cloudStoragePurgeConfirm": "La pulizia dello storage cloud eliminerà completamente tutti gli snapshot non referenziati e gli oggetti dati correlati. <ul class='fn__list'><li>Assicurati che gli altri dispositivi abbiano sospeso la sincronizzazione prima dell'esecuzione</li><li>L'operazione di pulizia è molto lunga, assicurati che la rete sia stabile</li></ul>Sei sicuro di voler eseguire ora?", "cloudStoragePurgeConfirm": "La pulizia dello storage cloud eliminerà completamente tutti gli snapshot non referenziati e gli oggetti dati correlati. <ul class='fn__list'><li>Assicurati che gli altri dispositivi abbiano sospeso la sincronizzazione prima dell'esecuzione</li><li>L'operazione di pulizia è molto lunga, assicurati che la rete sia stabile</li></ul>Sei sicuro di voler eseguire ora?",
"dragFill": "Trascina verticalmente per riempire i valori", "dragFill": "Trascina verticalmente per riempire i valori",
"switchReadonly": "Passa alla modalità di sola lettura", "switchReadonly": "Passa alla modalità di sola lettura",
"original": "Originale", "original": "Mostra valore originale",
"uniqueValues": "Mostra valori unici",
"selectRelation": "Seleziona prima il campo correlato", "selectRelation": "Seleziona prima il campo correlato",
"backRelation": "Bidirezionale", "backRelation": "Bidirezionale",
"thisDatabase": "Questo database", "thisDatabase": "Questo database",

View file

@ -170,7 +170,8 @@
"cloudStoragePurgeConfirm": "クラウドストレージを消去すると、参照されていないスナップショットと関連データオブジェクトが完全に削除されます。<ul class='fn__list'><li>実行前に他のデバイスが同期を一時停止していることを確認してください</li><li>消去操作は非常に時間がかかるため、ネットワークが安定していることを確認してください</li></ul>今すぐ実行してもよろしいですか?", "cloudStoragePurgeConfirm": "クラウドストレージを消去すると、参照されていないスナップショットと関連データオブジェクトが完全に削除されます。<ul class='fn__list'><li>実行前に他のデバイスが同期を一時停止していることを確認してください</li><li>消去操作は非常に時間がかかるため、ネットワークが安定していることを確認してください</li></ul>今すぐ実行してもよろしいですか?",
"dragFill": "値を埋めるために垂直にドラッグ", "dragFill": "値を埋めるために垂直にドラッグ",
"switchReadonly": "読み取り専用モードの切り替え", "switchReadonly": "読み取り専用モードの切り替え",
"original": "元の値", "original": "元の値を表示",
"uniqueValues": "一意の値を表示",
"selectRelation": "最初に関連する列を選択してください", "selectRelation": "最初に関連する列を選択してください",
"backRelation": "双方向の関連付け", "backRelation": "双方向の関連付け",
"thisDatabase": "現在のデータベース", "thisDatabase": "現在のデータベース",

View file

@ -170,7 +170,8 @@
"cloudStoragePurgeConfirm": "Oczyszczenie pamięci w chmurze całkowicie usunie wszystkie nieodwołane zrzuty i powiązane obiekty danych. <ul class='fn__list'><li>Proszę upewnić się, że inne urządzenia wstrzymały synchronizację przed aktem</li><li>Operacja oczyszczania jest czasochłonna, proszę upewnić się, że sieć jest stabilna</li></ul>Czy na pewno chcesz to wykonać teraz?", "cloudStoragePurgeConfirm": "Oczyszczenie pamięci w chmurze całkowicie usunie wszystkie nieodwołane zrzuty i powiązane obiekty danych. <ul class='fn__list'><li>Proszę upewnić się, że inne urządzenia wstrzymały synchronizację przed aktem</li><li>Operacja oczyszczania jest czasochłonna, proszę upewnić się, że sieć jest stabilna</li></ul>Czy na pewno chcesz to wykonać teraz?",
"dragFill": "Przeciągnij w pionie, aby wypełnić wartości", "dragFill": "Przeciągnij w pionie, aby wypełnić wartości",
"switchReadonly": "Przełącz tryb tylko do odczytu", "switchReadonly": "Przełącz tryb tylko do odczytu",
"original": "Oryginalny", "original": "Pokaż wartość oryginalną",
"uniqueValues": "Pokaż unikalne wartości",
"selectRelation": "Proszę najpierw wybrać powiązaną kolumnę", "selectRelation": "Proszę najpierw wybrać powiązaną kolumnę",
"backRelation": "Dwukierunkowa", "backRelation": "Dwukierunkowa",
"thisDatabase": "Ta baza danych", "thisDatabase": "Ta baza danych",

View file

@ -170,7 +170,8 @@
"cloudStoragePurgeConfirm": "Limpar o armazenamento em nuvem excluirá completamente todos os instantâneos não referenciados e objetos de dados relacionados. <ul class='fn__list'><li>Certifique-se de que outros dispositivos pausaram a sincronização antes da execução</li><li>A operação de limpeza é muito demorada, certifique-se de que a rede está estável</li></ul>Tem certeza que deseja executar agora?", "cloudStoragePurgeConfirm": "Limpar o armazenamento em nuvem excluirá completamente todos os instantâneos não referenciados e objetos de dados relacionados. <ul class='fn__list'><li>Certifique-se de que outros dispositivos pausaram a sincronização antes da execução</li><li>A operação de limpeza é muito demorada, certifique-se de que a rede está estável</li></ul>Tem certeza que deseja executar agora?",
"dragFill": "Arrastar verticalmente para preencher valor", "dragFill": "Arrastar verticalmente para preencher valor",
"switchReadonly": "Alternar modo somente leitura", "switchReadonly": "Alternar modo somente leitura",
"original": "Original", "original": "Exibir valor original",
"uniqueValues": "Exibir valores únicos",
"selectRelation": "Por favor, selecione o campo relacionado primeiro", "selectRelation": "Por favor, selecione o campo relacionado primeiro",
"backRelation": "Bidirecional", "backRelation": "Bidirecional",
"thisDatabase": "Este banco de dados", "thisDatabase": "Este banco de dados",

View file

@ -170,7 +170,8 @@
"cloudStoragePurgeConfirm": "Очистка облачного хранилища полностью удалит все неиспользуемые снимки и связанные с ними объекты данных. <ul class='fn__list'><li>Пожалуйста, убедитесь, что другие устройства приостановили синхронизацию перед выполнением</li><li>Операция очистки занимает много времени, пожалуйста, убедитесь, что сеть стабильна</li></ul>Вы уверены, что хотите выполнить её сейчас?", "cloudStoragePurgeConfirm": "Очистка облачного хранилища полностью удалит все неиспользуемые снимки и связанные с ними объекты данных. <ul class='fn__list'><li>Пожалуйста, убедитесь, что другие устройства приостановили синхронизацию перед выполнением</li><li>Операция очистки занимает много времени, пожалуйста, убедитесь, что сеть стабильна</li></ul>Вы уверены, что хотите выполнить её сейчас?",
"dragFill": "Перетащите вертикально, чтобы заполнить значение", "dragFill": "Перетащите вертикально, чтобы заполнить значение",
"switchReadonly": "Переключить режим только для чтения", "switchReadonly": "Переключить режим только для чтения",
"original": "Оригинал", "original": "Показать исходное значение",
"uniqueValues": "Показать уникальные значения",
"selectRelation": "Пожалуйста, сначала выберите связанную колонку", "selectRelation": "Пожалуйста, сначала выберите связанную колонку",
"backRelation": "Двустороннее", "backRelation": "Двустороннее",
"thisDatabase": "Эта база данных", "thisDatabase": "Эта база данных",

View file

@ -170,7 +170,8 @@
"cloudStoragePurgeConfirm": "清理雲端儲存會徹底刪除所有未引用的快照和相關資料物件。<ul class='fn__list'><li>執行前請確保其他設備已經暫停同步</li><li>清理作業非常耗時,請確保網路穩定</li></ul>確定現在就執行嗎?", "cloudStoragePurgeConfirm": "清理雲端儲存會徹底刪除所有未引用的快照和相關資料物件。<ul class='fn__list'><li>執行前請確保其他設備已經暫停同步</li><li>清理作業非常耗時,請確保網路穩定</li></ul>確定現在就執行嗎?",
"dragFill": "垂直拖動以填充值", "dragFill": "垂直拖動以填充值",
"switchReadonly": "唯讀模式切換", "switchReadonly": "唯讀模式切換",
"original": "原值", "original": "顯示原始值",
"uniqueValues": "顯示唯一值",
"selectRelation": "請先選擇關聯欄位", "selectRelation": "請先選擇關聯欄位",
"backRelation": "雙向關聯", "backRelation": "雙向關聯",
"thisDatabase": "目前資料庫", "thisDatabase": "目前資料庫",

View file

@ -170,7 +170,8 @@
"cloudStoragePurgeConfirm": "清理云端存储会彻底删除所有未引用的快照和相关数据对象。<ul class='fn__list'><li>执行前请确保其他设备已经暂停同步</li><li>清理操作非常耗时,请确保网络稳定</li></ul> 确定现在就执行吗?", "cloudStoragePurgeConfirm": "清理云端存储会彻底删除所有未引用的快照和相关数据对象。<ul class='fn__list'><li>执行前请确保其他设备已经暂停同步</li><li>清理操作非常耗时,请确保网络稳定</li></ul> 确定现在就执行吗?",
"dragFill": "垂直拖动以填充值", "dragFill": "垂直拖动以填充值",
"switchReadonly": "只读模式切换", "switchReadonly": "只读模式切换",
"original": "原值", "original": "显示原始值",
"uniqueValues": "显示唯一值",
"selectRelation": "请先选择关联字段", "selectRelation": "请先选择关联字段",
"backRelation": "双向关联", "backRelation": "双向关联",
"thisDatabase": "当前数据库", "thisDatabase": "当前数据库",

View file

@ -131,6 +131,20 @@ export const openCalcMenu = async (protyle: IProtyle, calcElement: HTMLElement,
blockID, blockID,
target: calcElement target: calcElement
}); });
if (panelData?.data) {
// 汇总字段汇总方式中才有“显示唯一值”选项 Add "Show unique values" to the calculation of the database rollup field https://github.com/siyuan-note/siyuan/issues/15852
calcItem({
menu,
protyle,
colId,
avId,
oldOperator,
operator: "Unique values",
data: panelData?.data,
blockID,
target: calcElement
});
}
calcItem({ calcItem({
menu, menu,
protyle, protyle,
@ -488,6 +502,8 @@ export const getNameByOperator = (operator: string, isRollup: boolean) => {
case undefined: case undefined:
case "": case "":
return isRollup ? window.siyuan.languages.original : window.siyuan.languages.calcOperatorNone; return isRollup ? window.siyuan.languages.original : window.siyuan.languages.calcOperatorNone;
case "Unique values": // 仅汇总字段的汇总方式在使用
return window.siyuan.languages.uniqueValues;
case "Count all": case "Count all":
return window.siyuan.languages.calcOperatorCountAll; return window.siyuan.languages.calcOperatorCountAll;
case "Count values": case "Count values":

View file

@ -33,6 +33,7 @@ type CalcOperator string
const ( const (
CalcOperatorNone CalcOperator = "" CalcOperatorNone CalcOperator = ""
CalcOperatorUniqueValues CalcOperator = "Unique values"
CalcOperatorCountAll CalcOperator = "Count all" CalcOperatorCountAll CalcOperator = "Count all"
CalcOperatorCountValues CalcOperator = "Count values" CalcOperatorCountValues CalcOperator = "Count values"
CalcOperatorCountUniqueValues CalcOperator = "Count unique values" CalcOperatorCountUniqueValues CalcOperator = "Count unique values"

View file

@ -834,6 +834,17 @@ func (r *ValueRollup) calcContents(calc *RollupCalc, destKey *Key) {
switch calc.Operator { switch calc.Operator {
case CalcOperatorNone: case CalcOperatorNone:
case CalcOperatorUniqueValues:
var newContents []*Value
uniqueValues := map[string]bool{}
for _, v := range r.Contents {
key := v.String(true)
if !uniqueValues[key] {
uniqueValues[key] = true
newContents = append(newContents, v)
}
}
r.Contents = newContents
case CalcOperatorCountAll: case CalcOperatorCountAll:
r.Contents = []*Value{{Type: KeyTypeNumber, Number: NewFormattedValueNumber(float64(len(r.Contents)), NumberFormatNone)}} r.Contents = []*Value{{Type: KeyTypeNumber, Number: NewFormattedValueNumber(float64(len(r.Contents)), NumberFormatNone)}}
case CalcOperatorCountValues: case CalcOperatorCountValues: