diff --git a/app/appearance/langs/ar_SA.json b/app/appearance/langs/ar_SA.json index 33a87812e..031410725 100644 --- a/app/appearance/langs/ar_SA.json +++ b/app/appearance/langs/ar_SA.json @@ -170,7 +170,8 @@ "cloudStoragePurgeConfirm": "‫سيؤدي تطهير التخزين السحابي إلى حذف جميع اللقطات غير المرجعية وعناصر البيانات ذات الصلة. هل أنت متأكد من تنفيذها الآن؟‬", "dragFill": "اسحب عمودياً لملء القيمة", "switchReadonly": "تبديل وضع القراءة فقط", - "original": "القيمة الأصلية", + "original": "عرض القيمة الأصلية", + "uniqueValues": "عرض القيم الفريدة", "selectRelation": "الرجاء تحديد الحقل ذي الصلة أولاً", "backRelation": "ثنائي الاتجاه", "thisDatabase": "قاعدة البيانات هذه", diff --git a/app/appearance/langs/de_DE.json b/app/appearance/langs/de_DE.json index 291752686..144e55559 100644 --- a/app/appearance/langs/de_DE.json +++ b/app/appearance/langs/de_DE.json @@ -170,7 +170,8 @@ "cloudStoragePurgeConfirm": "Das Bereinigen des Cloud-Speichers löscht alle nicht referenzierten Schnappschüsse und zugehörigen Datenobjekte vollständig. Sind Sie sicher, dass Sie es jetzt ausführen möchten?", "dragFill": "Vertikal ziehen, um Werte zu füllen", "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", "backRelation": "Bidirektional", "thisDatabase": "Diese Datenbank", diff --git a/app/appearance/langs/en_US.json b/app/appearance/langs/en_US.json index 2961e3a51..8f8185d44 100644 --- a/app/appearance/langs/en_US.json +++ b/app/appearance/langs/en_US.json @@ -170,7 +170,8 @@ "cloudStoragePurgeConfirm": "Purging the cloud storage will completely delete all unreferenced snapshots and related data objects. Are you sure to execute it now?", "dragFill": "Drag vertically to fill value", "switchReadonly": "Switch read-only mode", - "original": "Original", + "original": "Show original values", + "uniqueValues": "Show unique values", "selectRelation": "Please select the related field first", "backRelation": "Bidirectional", "thisDatabase": "This database", diff --git a/app/appearance/langs/es_ES.json b/app/appearance/langs/es_ES.json index 5bb042791..b05f57216 100644 --- a/app/appearance/langs/es_ES.json +++ b/app/appearance/langs/es_ES.json @@ -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.¿Está seguro de ejecutarla ahora?", "dragFill": "Arrastra verticalmente para llenar valores", "switchReadonly": "Cambiar modo de sólo lectura", - "original": "Original", + "original": "Mostrar valor original", + "uniqueValues": "Mostrar valores únicos", "selectRelation": "Seleccione primero la columna relacionada", "backRelation": "Bidireccional", "thisDatabase": "Esta base de datos", diff --git a/app/appearance/langs/fr_FR.json b/app/appearance/langs/fr_FR.json index d72f21e3e..f740c6caa 100644 --- a/app/appearance/langs/fr_FR.json +++ b/app/appearance/langs/fr_FR.json @@ -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. Êtes-vous sûr de l'exécuter maintenant ?", "dragFill": "Faites glisser verticalement pour remplir les valeurs", "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", "backRelation": "Bidirectionnel", "thisDatabase": "Cette base de données", diff --git a/app/appearance/langs/he_IL.json b/app/appearance/langs/he_IL.json index 645447a46..fbaed8cdc 100644 --- a/app/appearance/langs/he_IL.json +++ b/app/appearance/langs/he_IL.json @@ -170,7 +170,8 @@ "cloudStoragePurgeConfirm": "ניקוי האחסון בענן ימחוק לחלוטין את כל הצילומים הלא מתייחסים וכל האובייקטים הנתונים הקשורים. האם אתה בטוח לבצע את זה עכשיו?", "dragFill": "גרור אנכית כדי למלא ערכים", "switchReadonly": "עבר למצב קריאה בלבד", - "original": "מקורי", + "original": "הצג ערך מקורי", + "uniqueValues": "הצג ערכים ייחודיים", "selectRelation": "אנא בחר קודם את העמודה הקשורה", "backRelation": "דו-כיווני", "thisDatabase": "בסיס הנתונים הזה", diff --git a/app/appearance/langs/it_IT.json b/app/appearance/langs/it_IT.json index 6be46598e..75922bfc0 100644 --- a/app/appearance/langs/it_IT.json +++ b/app/appearance/langs/it_IT.json @@ -170,7 +170,8 @@ "cloudStoragePurgeConfirm": "La pulizia dello storage cloud eliminerà completamente tutti gli snapshot non referenziati e gli oggetti dati correlati. Sei sicuro di voler eseguire ora?", "dragFill": "Trascina verticalmente per riempire i valori", "switchReadonly": "Passa alla modalità di sola lettura", - "original": "Originale", + "original": "Mostra valore originale", + "uniqueValues": "Mostra valori unici", "selectRelation": "Seleziona prima il campo correlato", "backRelation": "Bidirezionale", "thisDatabase": "Questo database", diff --git a/app/appearance/langs/ja_JP.json b/app/appearance/langs/ja_JP.json index 1b0e32794..894872b15 100644 --- a/app/appearance/langs/ja_JP.json +++ b/app/appearance/langs/ja_JP.json @@ -170,7 +170,8 @@ "cloudStoragePurgeConfirm": "クラウドストレージを消去すると、参照されていないスナップショットと関連データオブジェクトが完全に削除されます。今すぐ実行してもよろしいですか?", "dragFill": "値を埋めるために垂直にドラッグ", "switchReadonly": "読み取り専用モードの切り替え", - "original": "元の値", + "original": "元の値を表示", + "uniqueValues": "一意の値を表示", "selectRelation": "最初に関連する列を選択してください", "backRelation": "双方向の関連付け", "thisDatabase": "現在のデータベース", diff --git a/app/appearance/langs/pl_PL.json b/app/appearance/langs/pl_PL.json index 156070e85..3554eafa8 100644 --- a/app/appearance/langs/pl_PL.json +++ b/app/appearance/langs/pl_PL.json @@ -170,7 +170,8 @@ "cloudStoragePurgeConfirm": "Oczyszczenie pamięci w chmurze całkowicie usunie wszystkie nieodwołane zrzuty i powiązane obiekty danych. Czy na pewno chcesz to wykonać teraz?", "dragFill": "Przeciągnij w pionie, aby wypełnić wartości", "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ę", "backRelation": "Dwukierunkowa", "thisDatabase": "Ta baza danych", diff --git a/app/appearance/langs/pt_BR.json b/app/appearance/langs/pt_BR.json index 466a99057..3931df5b2 100644 --- a/app/appearance/langs/pt_BR.json +++ b/app/appearance/langs/pt_BR.json @@ -170,7 +170,8 @@ "cloudStoragePurgeConfirm": "Limpar o armazenamento em nuvem excluirá completamente todos os instantâneos não referenciados e objetos de dados relacionados. Tem certeza que deseja executar agora?", "dragFill": "Arrastar verticalmente para preencher valor", "switchReadonly": "Alternar modo somente leitura", - "original": "Original", + "original": "Exibir valor original", + "uniqueValues": "Exibir valores únicos", "selectRelation": "Por favor, selecione o campo relacionado primeiro", "backRelation": "Bidirecional", "thisDatabase": "Este banco de dados", diff --git a/app/appearance/langs/ru_RU.json b/app/appearance/langs/ru_RU.json index 2d0953f74..e6ee2bd65 100644 --- a/app/appearance/langs/ru_RU.json +++ b/app/appearance/langs/ru_RU.json @@ -170,7 +170,8 @@ "cloudStoragePurgeConfirm": "Очистка облачного хранилища полностью удалит все неиспользуемые снимки и связанные с ними объекты данных. Вы уверены, что хотите выполнить её сейчас?", "dragFill": "Перетащите вертикально, чтобы заполнить значение", "switchReadonly": "Переключить режим только для чтения", - "original": "Оригинал", + "original": "Показать исходное значение", + "uniqueValues": "Показать уникальные значения", "selectRelation": "Пожалуйста, сначала выберите связанную колонку", "backRelation": "Двустороннее", "thisDatabase": "Эта база данных", diff --git a/app/appearance/langs/zh_CHT.json b/app/appearance/langs/zh_CHT.json index 3d28713d2..d45a75c53 100644 --- a/app/appearance/langs/zh_CHT.json +++ b/app/appearance/langs/zh_CHT.json @@ -170,7 +170,8 @@ "cloudStoragePurgeConfirm": "清理雲端儲存會徹底刪除所有未引用的快照和相關資料物件。確定現在就執行嗎?", "dragFill": "垂直拖動以填充值", "switchReadonly": "唯讀模式切換", - "original": "原值", + "original": "顯示原始值", + "uniqueValues": "顯示唯一值", "selectRelation": "請先選擇關聯欄位", "backRelation": "雙向關聯", "thisDatabase": "目前資料庫", diff --git a/app/appearance/langs/zh_CN.json b/app/appearance/langs/zh_CN.json index b0d49ef46..425d9bafd 100644 --- a/app/appearance/langs/zh_CN.json +++ b/app/appearance/langs/zh_CN.json @@ -170,7 +170,8 @@ "cloudStoragePurgeConfirm": "清理云端存储会彻底删除所有未引用的快照和相关数据对象。 确定现在就执行吗?", "dragFill": "垂直拖动以填充值", "switchReadonly": "只读模式切换", - "original": "原值", + "original": "显示原始值", + "uniqueValues": "显示唯一值", "selectRelation": "请先选择关联字段", "backRelation": "双向关联", "thisDatabase": "当前数据库", diff --git a/app/src/protyle/render/av/calc.ts b/app/src/protyle/render/av/calc.ts index 5bc8e37e6..8711777de 100644 --- a/app/src/protyle/render/av/calc.ts +++ b/app/src/protyle/render/av/calc.ts @@ -131,6 +131,20 @@ export const openCalcMenu = async (protyle: IProtyle, calcElement: HTMLElement, blockID, 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({ menu, protyle, @@ -488,6 +502,8 @@ export const getNameByOperator = (operator: string, isRollup: boolean) => { case undefined: case "": return isRollup ? window.siyuan.languages.original : window.siyuan.languages.calcOperatorNone; + case "Unique values": // 仅汇总字段的汇总方式在使用 + return window.siyuan.languages.uniqueValues; case "Count all": return window.siyuan.languages.calcOperatorCountAll; case "Count values": diff --git a/kernel/av/calc.go b/kernel/av/calc.go index 69b93bfc4..77d53bace 100644 --- a/kernel/av/calc.go +++ b/kernel/av/calc.go @@ -33,6 +33,7 @@ type CalcOperator string const ( CalcOperatorNone CalcOperator = "" + CalcOperatorUniqueValues CalcOperator = "Unique values" CalcOperatorCountAll CalcOperator = "Count all" CalcOperatorCountValues CalcOperator = "Count values" CalcOperatorCountUniqueValues CalcOperator = "Count unique values" diff --git a/kernel/av/value.go b/kernel/av/value.go index 7cdca3e8e..32ce554d5 100644 --- a/kernel/av/value.go +++ b/kernel/av/value.go @@ -834,6 +834,17 @@ func (r *ValueRollup) calcContents(calc *RollupCalc, destKey *Key) { switch calc.Operator { 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: r.Contents = []*Value{{Type: KeyTypeNumber, Number: NewFormattedValueNumber(float64(len(r.Contents)), NumberFormatNone)}} case CalcOperatorCountValues: diff --git a/kernel/model/block.go b/kernel/model/block.go index b8132bd2f..6f4ccf155 100644 --- a/kernel/model/block.go +++ b/kernel/model/block.go @@ -654,7 +654,7 @@ func GetHeadingInsertTransaction(id string) (transaction *Transaction, err error n.ID = ast.NewNodeID() n.SetIALAttr("id", n.ID) - op := &Operation{} + op := &Operation{Context: map[string]any{"ignoreProcess": "true"}} op.ID = n.ID op.Action = "insert" op.Data = luteEngine.RenderNodeBlockDOM(n)