@evotecit/canopyx 0.3.6 → 0.3.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/CanopyX.Html/Assets/canopyx-calendar.js +4 -3
  2. package/CanopyX.Html/Assets/canopyx-changes.css +240 -0
  3. package/CanopyX.Html/Assets/canopyx-changes.js +224 -0
  4. package/CanopyX.Html/Assets/canopyx-detail-rows.js +2 -2
  5. package/CanopyX.Html/Assets/canopyx-filter-editor.js +2 -1
  6. package/CanopyX.Html/Assets/canopyx-formatting.js +7 -6
  7. package/CanopyX.Html/Assets/canopyx-grid-module.mjs +71 -44
  8. package/CanopyX.Html/Assets/canopyx-grid.css +24 -0
  9. package/CanopyX.Html/Assets/canopyx-grid.js +71 -44
  10. package/CanopyX.Html/Assets/canopyx-interactive.js +6 -6
  11. package/CanopyX.Html/Assets/canopyx-labels-de.js +76 -2
  12. package/CanopyX.Html/Assets/canopyx-labels-es.js +76 -2
  13. package/CanopyX.Html/Assets/canopyx-labels-fr.js +76 -2
  14. package/CanopyX.Html/Assets/canopyx-labels-it.js +76 -2
  15. package/CanopyX.Html/Assets/canopyx-labels-pl.js +76 -2
  16. package/CanopyX.Html/Assets/canopyx-live.js +4 -3
  17. package/CanopyX.Html/Assets/canopyx-matrix.css +16 -3
  18. package/CanopyX.Html/Assets/canopyx-matrix.js +22 -14
  19. package/CanopyX.Html/Assets/canopyx-module.mjs +6 -6
  20. package/CanopyX.Html/Assets/canopyx-reporting-module.mjs +73 -46
  21. package/CanopyX.Html/Assets/canopyx-reporting.css +24 -0
  22. package/CanopyX.Html/Assets/canopyx-reporting.js +73 -46
  23. package/CanopyX.Html/Assets/canopyx-tree-tools.js +7 -6
  24. package/CanopyX.Html/Assets/canopyx.js +6 -6
  25. package/JavaScript/changes.d.ts +252 -0
  26. package/JavaScript/grid.d.ts +15 -5
  27. package/JavaScript/locales/de.mjs +76 -2
  28. package/JavaScript/locales/es.mjs +76 -2
  29. package/JavaScript/locales/fr.mjs +76 -2
  30. package/JavaScript/locales/it.mjs +76 -2
  31. package/JavaScript/locales/pl.mjs +76 -2
  32. package/JavaScript/matrix.d.ts +2 -0
  33. package/JavaScript/protocol.d.ts +1 -1
  34. package/README.md +7 -2
  35. package/package.json +5 -1
@@ -11,6 +11,7 @@ const labels = Object.freeze({
11
11
  searchWordTooShort: "Escriba una palabra de al menos {min} caracteres",
12
12
  searchFailed: "Error al buscar: {error}",
13
13
  columns: "Columnas",
14
+ hiddenColumns: "[one]+{count} columna[other]+{count} columnas",
14
15
  gridFilters: "Filtros",
15
16
  gridFitContent: "Ajustar al contenido",
16
17
  gridUnpin: "Desfijar",
@@ -243,7 +244,7 @@ const labels = Object.freeze({
243
244
  gridExportCancelled: "Exportación cancelada",
244
245
  gridCancelExport: "Cancelar exportación",
245
246
  gridPrint: "Imprimir",
246
- gridCloseRecord: "Cerrar detalles del registro",
247
+ gridCloseRecord: "Cerrar",
247
248
  gridContains: "contiene",
248
249
  gridStartsWith: "empieza por",
249
250
  gridIn: "es uno de estos valores",
@@ -688,13 +689,86 @@ const labels = Object.freeze({
688
689
  matrixItemTotal: "{item}: {count}",
689
690
  matrixExpandGroup: "Expandir {group}",
690
691
  matrixCollapseGroup: "Contraer {group}",
691
- matrixGroupCount: "Elementos: {count}",
692
+ matrixGroupCount: "{count}",
693
+ matrixCellCount: "Celdas: {count}",
692
694
  matrixDetails: "Detalles",
693
695
  matrixClose: "Cerrar",
694
696
  matrixValue: "Valor",
695
697
  matrixState: "Estado",
696
698
  matrixAllClear: "Nada requiere atención",
697
699
  matrixShowMore: "Mostrar más",
700
+ changeInline: "En línea",
701
+ changeSplit: "En paralelo",
702
+ changeLayout: "Diseño",
703
+ changeCopyDiff: "Copiar diff",
704
+ changeCopied: "Copiado",
705
+ changeCopyFailed: "No se pudo copiar",
706
+ changeNext: "Siguiente cambio",
707
+ changePrevious: "Cambio anterior",
708
+ changePosition: "Cambio {index} de {count}",
709
+ changeShowLines: "[one]Mostrar {count} línea más[other]Mostrar {count} líneas más",
710
+ changeHiddenLines: "[one]{count} línea sin cambios no incluida[other]{count} líneas sin cambios no incluidas",
711
+ changeLineCounts: "Líneas añadidas: {added}, eliminadas: {removed}",
712
+ changeLineAdded: "Línea añadida {line}",
713
+ changeLineRemoved: "Línea eliminada {line}",
714
+ changeLineContext: "Línea {line}",
715
+ changeBefore: "Antes",
716
+ changeAfter: "Después",
717
+ changeBinary: "Archivo binario: se compara por tamaño y hash, no por líneas.",
718
+ changeUnavailable: "El contenido de este archivo no está disponible.",
719
+ changeIdentical: "El texto no cambió.",
720
+ changeTruncated: "Algunos cambios no se muestran: la comparación era demasiado grande.",
721
+ changeTooLarge: "Estos textos son demasiado largos para compararlos aquí.",
722
+ changeDiffOf: "Cambios en {name}",
723
+ changeAdded: "Añadido",
724
+ changeRemoved: "Eliminado",
725
+ changeModified: "Modificado",
726
+ changeRenamed: "Renombrado",
727
+ changeFlaggedOnly: "Solo marcados",
728
+ changeFlaggedCount: "{count} marcados",
729
+ changeNoItems: "No hay cambios que mostrar.",
730
+ changeSize: "Tamaño",
731
+ changeHash: "Hash",
732
+ changeTime: "Hora",
733
+ changeCopyHash: "Copiar el hash completo",
734
+ changeDetails: "Detalles de {name}",
735
+ changeFileCount: "[one]{count} archivo[other]{count} archivos",
736
+ changeFrom: "desde {path}",
737
+ changeShowMore: "Mostrar más",
738
+ changeFlags: "Marcas",
739
+ changeFacts: "Detalles",
740
+ changeRoot: "Nivel superior",
741
+ changeShown: "{shown} de {total} mostrados",
742
+ changeFilter: "Mostrar cambios",
743
+ changeActions: "Acciones para {name}",
744
+ changeConverged: "Convergido",
745
+ changePropagating: "Propagándose",
746
+ changeFault: "Fallo",
747
+ changeUnknown: "Desconocido",
748
+ changeReplica: "Réplica",
749
+ changeState: "Estado",
750
+ changeFirstSeen: "Visto por primera vez",
751
+ changeLastSeen: "Visto por última vez",
752
+ changeTimeline: "Retraso",
753
+ changeNotSeen: "Aún no visto",
754
+ changeDelay: "+{duration}",
755
+ changeSource: "Origen",
756
+ changeProgress: "{converged} de {total} tienen el cambio",
757
+ changeSeconds: "{count} s",
758
+ changeMinutes: "{count} min",
759
+ changeHours: "{count} h",
760
+ changeDays: "{count} d",
761
+ changeUtcTime: "{time} UTC",
762
+ changeExportCsv: "Exportar CSV",
763
+ changeExportJson: "Exportar JSON",
764
+ changeReason: "Motivo",
765
+ changeReasonHint: "{action}: indique el motivo. El motivo se guarda con la acción.",
766
+ changeReasonRequired: "Indique primero un motivo.",
767
+ changeCancel: "Cancelar",
768
+ changeUnclaimed: "Esta página no puede realizar «{action}» por sí misma. Copie la solicitud para transmitirla.",
769
+ changeCopyRequest: "Copiar solicitud",
770
+ changeFiltered: "Filtrado: {filters}",
771
+ changePrintLimit: "{count} líneas más no se imprimen.",
698
772
  });
699
773
  const staticLabels = Object.freeze({
700
774
  overflowNote: "Filas mostradas: {shown}. Total: {total}.",
@@ -11,6 +11,7 @@ const labels = Object.freeze({
11
11
  searchWordTooShort: "Saisissez un mot d'au moins {min} caractères",
12
12
  searchFailed: "Échec de la recherche : {error}",
13
13
  columns: "Colonnes",
14
+ hiddenColumns: "[one]+{count} colonne[other]+{count} colonnes",
14
15
  gridFilters: "Filtres",
15
16
  gridFitContent: "Ajuster au contenu",
16
17
  gridUnpin: "Désépingler",
@@ -243,7 +244,7 @@ const labels = Object.freeze({
243
244
  gridExportCancelled: "Exportation annulée",
244
245
  gridCancelExport: "Annuler l'exportation",
245
246
  gridPrint: "Imprimer",
246
- gridCloseRecord: "Fermer les détails de l'enregistrement",
247
+ gridCloseRecord: "Fermer",
247
248
  gridContains: "contient",
248
249
  gridStartsWith: "commence par",
249
250
  gridIn: "est l'une des valeurs",
@@ -688,13 +689,86 @@ const labels = Object.freeze({
688
689
  matrixItemTotal: "{item} : {count}",
689
690
  matrixExpandGroup: "Développer {group}",
690
691
  matrixCollapseGroup: "Réduire {group}",
691
- matrixGroupCount: "Éléments : {count}",
692
+ matrixGroupCount: "{count}",
693
+ matrixCellCount: "Cellules : {count}",
692
694
  matrixDetails: "Détails",
693
695
  matrixClose: "Fermer",
694
696
  matrixValue: "Valeur",
695
697
  matrixState: "État",
696
698
  matrixAllClear: "Rien à examiner",
697
699
  matrixShowMore: "Afficher plus",
700
+ changeInline: "En ligne",
701
+ changeSplit: "Côte à côte",
702
+ changeLayout: "Disposition",
703
+ changeCopyDiff: "Copier le diff",
704
+ changeCopied: "Copié",
705
+ changeCopyFailed: "Copie impossible",
706
+ changeNext: "Modification suivante",
707
+ changePrevious: "Modification précédente",
708
+ changePosition: "Modification {index} sur {count}",
709
+ changeShowLines: "[one]Afficher {count} ligne de plus[other]Afficher {count} lignes de plus",
710
+ changeHiddenLines: "[one]{count} ligne inchangée non incluse[other]{count} lignes inchangées non incluses",
711
+ changeLineCounts: "Lignes ajoutées : {added}, supprimées : {removed}",
712
+ changeLineAdded: "Ligne ajoutée {line}",
713
+ changeLineRemoved: "Ligne supprimée {line}",
714
+ changeLineContext: "Ligne {line}",
715
+ changeBefore: "Avant",
716
+ changeAfter: "Après",
717
+ changeBinary: "Fichier binaire : comparé par taille et empreinte, pas par lignes.",
718
+ changeUnavailable: "Le contenu de ce fichier n'est pas disponible.",
719
+ changeIdentical: "Le texte n'a pas changé.",
720
+ changeTruncated: "Certaines modifications ne sont pas affichées : la comparaison était trop grande.",
721
+ changeTooLarge: "Ces textes sont trop longs pour être comparés ici.",
722
+ changeDiffOf: "Modifications dans {name}",
723
+ changeAdded: "Ajouté",
724
+ changeRemoved: "Supprimé",
725
+ changeModified: "Modifié",
726
+ changeRenamed: "Renommé",
727
+ changeFlaggedOnly: "Signalés uniquement",
728
+ changeFlaggedCount: "Signalés : {count}",
729
+ changeNoItems: "Aucune modification à afficher.",
730
+ changeSize: "Taille",
731
+ changeHash: "Empreinte",
732
+ changeTime: "Heure",
733
+ changeCopyHash: "Copier l'empreinte complète",
734
+ changeDetails: "Détails de {name}",
735
+ changeFileCount: "[one]{count} fichier[other]{count} fichiers",
736
+ changeFrom: "depuis {path}",
737
+ changeShowMore: "Afficher plus",
738
+ changeFlags: "Signalements",
739
+ changeFacts: "Détails",
740
+ changeRoot: "Niveau supérieur",
741
+ changeShown: "{shown} sur {total} affichés",
742
+ changeFilter: "Afficher les modifications",
743
+ changeActions: "Actions pour {name}",
744
+ changeConverged: "Convergé",
745
+ changePropagating: "En propagation",
746
+ changeFault: "Défaut",
747
+ changeUnknown: "Inconnu",
748
+ changeReplica: "Réplica",
749
+ changeState: "État",
750
+ changeFirstSeen: "Vu pour la première fois",
751
+ changeLastSeen: "Vu pour la dernière fois",
752
+ changeTimeline: "Délai",
753
+ changeNotSeen: "Pas encore vu",
754
+ changeDelay: "+{duration}",
755
+ changeSource: "Source",
756
+ changeProgress: "{converged} sur {total} ont la modification",
757
+ changeSeconds: "{count} s",
758
+ changeMinutes: "{count} min",
759
+ changeHours: "{count} h",
760
+ changeDays: "{count} j",
761
+ changeUtcTime: "{time} UTC",
762
+ changeExportCsv: "Exporter en CSV",
763
+ changeExportJson: "Exporter en JSON",
764
+ changeReason: "Motif",
765
+ changeReasonHint: "{action} : indiquez le motif. Le motif est conservé avec l'action.",
766
+ changeReasonRequired: "Indiquez d'abord un motif.",
767
+ changeCancel: "Annuler",
768
+ changeUnclaimed: "Cette page ne peut pas exécuter « {action} » elle-même. Copiez la demande pour la transmettre.",
769
+ changeCopyRequest: "Copier la demande",
770
+ changeFiltered: "Filtré : {filters}",
771
+ changePrintLimit: "{count} lignes de plus ne sont pas imprimées.",
698
772
  });
699
773
  const staticLabels = Object.freeze({
700
774
  overflowNote: "{shown} lignes affichées sur {total}.",
@@ -11,6 +11,7 @@ const labels = Object.freeze({
11
11
  searchWordTooShort: "Digita una parola di almeno {min} caratteri",
12
12
  searchFailed: "Ricerca non riuscita: {error}",
13
13
  columns: "Colonne",
14
+ hiddenColumns: "[one]+{count} colonna[other]+{count} colonne",
14
15
  gridFilters: "Filtri",
15
16
  gridFitContent: "Adatta al contenuto",
16
17
  gridUnpin: "Sblocca",
@@ -243,7 +244,7 @@ const labels = Object.freeze({
243
244
  gridExportCancelled: "Esportazione annullata",
244
245
  gridCancelExport: "Annulla esportazione",
245
246
  gridPrint: "Stampa",
246
- gridCloseRecord: "Chiudi i dettagli del record",
247
+ gridCloseRecord: "Chiudi",
247
248
  gridContains: "contiene",
248
249
  gridStartsWith: "inizia con",
249
250
  gridIn: "è uno tra",
@@ -688,13 +689,86 @@ const labels = Object.freeze({
688
689
  matrixItemTotal: "{item}: {count}",
689
690
  matrixExpandGroup: "Espandi {group}",
690
691
  matrixCollapseGroup: "Comprimi {group}",
691
- matrixGroupCount: "Elementi: {count}",
692
+ matrixGroupCount: "{count}",
693
+ matrixCellCount: "Celle: {count}",
692
694
  matrixDetails: "Dettagli",
693
695
  matrixClose: "Chiudi",
694
696
  matrixValue: "Valore",
695
697
  matrixState: "Stato",
696
698
  matrixAllClear: "Niente richiede attenzione",
697
699
  matrixShowMore: "Mostra altro",
700
+ changeInline: "In linea",
701
+ changeSplit: "Affiancato",
702
+ changeLayout: "Layout",
703
+ changeCopyDiff: "Copia diff",
704
+ changeCopied: "Copiato",
705
+ changeCopyFailed: "Impossibile copiare",
706
+ changeNext: "Modifica successiva",
707
+ changePrevious: "Modifica precedente",
708
+ changePosition: "Modifica {index} di {count}",
709
+ changeShowLines: "[one]Mostra {count} altra riga[other]Mostra altre {count} righe",
710
+ changeHiddenLines: "[one]{count} riga invariata non inclusa[other]{count} righe invariate non incluse",
711
+ changeLineCounts: "Righe aggiunte: {added}, rimosse: {removed}",
712
+ changeLineAdded: "Riga aggiunta {line}",
713
+ changeLineRemoved: "Riga rimossa {line}",
714
+ changeLineContext: "Riga {line}",
715
+ changeBefore: "Prima",
716
+ changeAfter: "Dopo",
717
+ changeBinary: "File binario: confrontato per dimensione e hash, non per righe.",
718
+ changeUnavailable: "Il contenuto di questo file non è disponibile.",
719
+ changeIdentical: "Il testo non è cambiato.",
720
+ changeTruncated: "Alcune modifiche non sono mostrate: il confronto era troppo grande.",
721
+ changeTooLarge: "Questi testi sono troppo lunghi per essere confrontati qui.",
722
+ changeDiffOf: "Modifiche in {name}",
723
+ changeAdded: "Aggiunto",
724
+ changeRemoved: "Rimosso",
725
+ changeModified: "Modificato",
726
+ changeRenamed: "Rinominato",
727
+ changeFlaggedOnly: "Solo segnalati",
728
+ changeFlaggedCount: "{count} segnalati",
729
+ changeNoItems: "Nessuna modifica da mostrare.",
730
+ changeSize: "Dimensione",
731
+ changeHash: "Hash",
732
+ changeTime: "Ora",
733
+ changeCopyHash: "Copia l'hash completo",
734
+ changeDetails: "Dettagli di {name}",
735
+ changeFileCount: "[one]{count} file[other]{count} file",
736
+ changeFrom: "da {path}",
737
+ changeShowMore: "Mostra altro",
738
+ changeFlags: "Segnalazioni",
739
+ changeFacts: "Dettagli",
740
+ changeRoot: "Livello principale",
741
+ changeShown: "{shown} di {total} mostrati",
742
+ changeFilter: "Mostra modifiche",
743
+ changeActions: "Azioni per {name}",
744
+ changeConverged: "Convergente",
745
+ changePropagating: "In propagazione",
746
+ changeFault: "Errore",
747
+ changeUnknown: "Sconosciuto",
748
+ changeReplica: "Replica",
749
+ changeState: "Stato",
750
+ changeFirstSeen: "Visto per la prima volta",
751
+ changeLastSeen: "Visto per l'ultima volta",
752
+ changeTimeline: "Ritardo",
753
+ changeNotSeen: "Non ancora visto",
754
+ changeDelay: "+{duration}",
755
+ changeSource: "Origine",
756
+ changeProgress: "{converged} su {total} hanno la modifica",
757
+ changeSeconds: "{count} s",
758
+ changeMinutes: "{count} min",
759
+ changeHours: "{count} h",
760
+ changeDays: "{count} g",
761
+ changeUtcTime: "{time} UTC",
762
+ changeExportCsv: "Esporta CSV",
763
+ changeExportJson: "Esporta JSON",
764
+ changeReason: "Motivo",
765
+ changeReasonHint: "{action}: indica il motivo. Il motivo viene conservato con l'azione.",
766
+ changeReasonRequired: "Indica prima un motivo.",
767
+ changeCancel: "Annulla",
768
+ changeUnclaimed: "Questa pagina non può eseguire «{action}» da sola. Copia la richiesta per inoltrarla.",
769
+ changeCopyRequest: "Copia richiesta",
770
+ changeFiltered: "Filtrato: {filters}",
771
+ changePrintLimit: "Altre {count} righe non vengono stampate.",
698
772
  });
699
773
  const staticLabels = Object.freeze({
700
774
  overflowNote: "Righe mostrate: {shown} su {total}.",
@@ -11,6 +11,7 @@ const labels = Object.freeze({
11
11
  searchWordTooShort: "Wpisz słowo o długości co najmniej {min} znaków",
12
12
  searchFailed: "Nie udało się wyszukać: {error}",
13
13
  columns: "Kolumny",
14
+ hiddenColumns: "[one]+{count} kolumna[few]+{count} kolumny[many]+{count} kolumn[other]+{count} kolumny",
14
15
  gridFilters: "Filtry",
15
16
  gridFitContent: "Dopasuj do zawartości",
16
17
  gridUnpin: "Odepnij",
@@ -243,7 +244,7 @@ const labels = Object.freeze({
243
244
  gridExportCancelled: "Eksport anulowany",
244
245
  gridCancelExport: "Anuluj eksport",
245
246
  gridPrint: "Drukuj",
246
- gridCloseRecord: "Zamknij szczegóły rekordu",
247
+ gridCloseRecord: "Zamknij",
247
248
  gridContains: "zawiera",
248
249
  gridStartsWith: "zaczyna się od",
249
250
  gridIn: "jest jedną z wartości",
@@ -688,13 +689,86 @@ const labels = Object.freeze({
688
689
  matrixItemTotal: "{item}: {count}",
689
690
  matrixExpandGroup: "Rozwiń {group}",
690
691
  matrixCollapseGroup: "Zwiń {group}",
691
- matrixGroupCount: "Elementy: {count}",
692
+ matrixGroupCount: "{count}",
693
+ matrixCellCount: "Komórki: {count}",
692
694
  matrixDetails: "Szczegóły",
693
695
  matrixClose: "Zamknij",
694
696
  matrixValue: "Wartość",
695
697
  matrixState: "Stan",
696
698
  matrixAllClear: "Nic nie wymaga uwagi",
697
699
  matrixShowMore: "Pokaż więcej",
700
+ changeInline: "W jednej kolumnie",
701
+ changeSplit: "Obok siebie",
702
+ changeLayout: "Układ",
703
+ changeCopyDiff: "Kopiuj różnice",
704
+ changeCopied: "Skopiowano",
705
+ changeCopyFailed: "Nie udało się skopiować",
706
+ changeNext: "Następna zmiana",
707
+ changePrevious: "Poprzednia zmiana",
708
+ changePosition: "Zmiana {index} z {count}",
709
+ changeShowLines: "[one]Pokaż jeszcze {count} wiersz[few]Pokaż jeszcze {count} wiersze[many]Pokaż jeszcze {count} wierszy[other]Pokaż jeszcze {count} wiersza",
710
+ changeHiddenLines: "[one]{count} niezmieniony wiersz pominięty[few]{count} niezmienione wiersze pominięte[many]{count} niezmienionych wierszy pominiętych[other]{count} niezmienionego wiersza pominięte",
711
+ changeLineCounts: "Dodane wiersze: {added}, usunięte: {removed}",
712
+ changeLineAdded: "Dodany wiersz {line}",
713
+ changeLineRemoved: "Usunięty wiersz {line}",
714
+ changeLineContext: "Wiersz {line}",
715
+ changeBefore: "Przed",
716
+ changeAfter: "Po",
717
+ changeBinary: "Plik binarny: porównany według rozmiaru i skrótu, nie wierszy.",
718
+ changeUnavailable: "Zawartość tego pliku jest niedostępna.",
719
+ changeIdentical: "Tekst się nie zmienił.",
720
+ changeTruncated: "Część zmian nie jest pokazana: porównanie było zbyt duże.",
721
+ changeTooLarge: "Te teksty są zbyt długie, aby je tu porównać.",
722
+ changeDiffOf: "Zmiany w {name}",
723
+ changeAdded: "Dodany",
724
+ changeRemoved: "Usunięty",
725
+ changeModified: "Zmieniony",
726
+ changeRenamed: "Przemianowany",
727
+ changeFlaggedOnly: "Tylko oznaczone",
728
+ changeFlaggedCount: "Oznaczone: {count}",
729
+ changeNoItems: "Brak zmian do pokazania.",
730
+ changeSize: "Rozmiar",
731
+ changeHash: "Skrót",
732
+ changeTime: "Czas",
733
+ changeCopyHash: "Kopiuj pełny skrót",
734
+ changeDetails: "Szczegóły: {name}",
735
+ changeFileCount: "[one]{count} plik[few]{count} pliki[many]{count} plików[other]{count} pliku",
736
+ changeFrom: "z {path}",
737
+ changeShowMore: "Pokaż więcej",
738
+ changeFlags: "Oznaczenia",
739
+ changeFacts: "Szczegóły",
740
+ changeRoot: "Poziom główny",
741
+ changeShown: "Pokazano {shown} z {total}",
742
+ changeFilter: "Pokaż zmiany",
743
+ changeActions: "Akcje dla {name}",
744
+ changeConverged: "Zbieżny",
745
+ changePropagating: "W trakcie replikacji",
746
+ changeFault: "Błąd",
747
+ changeUnknown: "Nieznany",
748
+ changeReplica: "Replika",
749
+ changeState: "Stan",
750
+ changeFirstSeen: "Pierwsze wykrycie",
751
+ changeLastSeen: "Ostatni raport",
752
+ changeTimeline: "Opóźnienie",
753
+ changeNotSeen: "Jeszcze nie wykryto",
754
+ changeDelay: "+{duration}",
755
+ changeSource: "Źródło",
756
+ changeProgress: "Zmianę ma {converged} z {total}",
757
+ changeSeconds: "{count} s",
758
+ changeMinutes: "{count} min",
759
+ changeHours: "{count} godz.",
760
+ changeDays: "{count} d.",
761
+ changeUtcTime: "{time} UTC",
762
+ changeExportCsv: "Eksportuj CSV",
763
+ changeExportJson: "Eksportuj JSON",
764
+ changeReason: "Powód",
765
+ changeReasonHint: "{action}: podaj powód. Powód zostanie zapisany razem z akcją.",
766
+ changeReasonRequired: "Najpierw podaj powód.",
767
+ changeCancel: "Anuluj",
768
+ changeUnclaimed: "Ta strona nie może sama wykonać akcji „{action}”. Skopiuj żądanie, aby je przekazać.",
769
+ changeCopyRequest: "Kopiuj żądanie",
770
+ changeFiltered: "Filtry: {filters}",
771
+ changePrintLimit: "Pominięte w wydruku wiersze: {count}.",
698
772
  });
699
773
  const staticLabels = Object.freeze({
700
774
  overflowNote: "Pokazano {shown} z {total} wierszy.",
@@ -37,6 +37,8 @@ export interface MatrixItem {
37
37
  export interface MatrixAxis {
38
38
  title?: string;
39
39
  noun?: string;
40
+ /** How a group heading counts its members: {count}, optionally in plural forms ("[one]{count} server[other]{count} servers"). */
41
+ groupCount?: string;
40
42
  attributes?: MatrixAttribute[];
41
43
  items: MatrixItem[];
42
44
  groupBy?: string;
@@ -195,7 +195,7 @@ export type LabelName =
195
195
  | "gridExport" | "gridFilteredResults" | "gridSelectedRows" | "gridAllResults" | "gridVisibleRows" | "gridAllRows" | "gridDownloadCsv" | "gridCopy" | "gridDetails"
196
196
  | "searchPlaceholder" | "searchResults" | "searchResultCount" | "searchResultCountOfTotal"
197
197
  | "searchResultCountOfMany" | "searchNoResults" | "searchTooShort" | "searchWordTooShort" | "searchFailed"
198
- | "columns" | "visibleColumns" | "resizeColumn" | "columnWidth" | "loading" | "loadError" | "queryFailed"
198
+ | "columns" | "hiddenColumns" | "visibleColumns" | "resizeColumn" | "columnWidth" | "loading" | "loadError" | "queryFailed"
199
199
  | "showMore" | "showMoreUnknownTotal" | "pageLoaded" | "itemsLoaded" | "yes" | "no"
200
200
  | "utcTime" | "localTime" | "mountError" | "actions" | "editValue" | "saveEdit" | "cancelEdit"
201
201
  | "invalidEdit" | "interactionPending" | "interactionRejected" | "interactionFailed"
package/README.md CHANGED
@@ -21,15 +21,16 @@ Turn application data into searchable trees, sortable tables and standalone HTML
21
21
  - **Email and print tables** rendered from the same .NET view without JavaScript.
22
22
  - **Calendars and resource timelines** of the same records: month, week, day, agenda and year views, resources grouped as a tree with capacity per group, recurring events, drag to reschedule through the grid's editing, and iCalendar export.
23
23
  - **Status matrices**: a state for each pair of two sets of entities, with totals, sorting, filtering and grouping on both axes, sticky headers and both axes windowed ([docs/matrix.md](docs/matrix.md)).
24
+ - **Change views**: a text diff (inline or side by side, word marks, folded regions, windowed rows), a change list with kind badges, folders, hashes and risk flags, and how a change reached its replicas ([docs/changes.md](docs/changes.md)).
24
25
  - **Guided flows** for setup and edit tasks: steps with typed fields, conditions as data, validation, a review page with change links, secrets that never echo, and one proposal to the host ([docs/flow.md](docs/flow.md)).
25
26
 
26
- ![File explorer in the light theme, with sizes, dates, owners and an expanded detail row](https://cdn.jsdelivr.net/npm/@evotecit/canopyx@0.3.6/docs/images/tree-grid-light.png)
27
+ ![File explorer in the light theme, with sizes, dates, owners and an expanded detail row](https://cdn.jsdelivr.net/npm/@evotecit/canopyx@0.3.8/docs/images/tree-grid-light.png)
27
28
 
28
29
  The same explorer in the dark theme, alongside its script-free output for email and print:
29
30
 
30
31
  | Dark theme | Static outline |
31
32
  | --- | --- |
32
- | ![File explorer in the dark theme](https://cdn.jsdelivr.net/npm/@evotecit/canopyx@0.3.6/docs/images/tree-grid-dark.png) | ![Static outline table](https://cdn.jsdelivr.net/npm/@evotecit/canopyx@0.3.6/docs/images/static-outline.png) |
33
+ | ![File explorer in the dark theme](https://cdn.jsdelivr.net/npm/@evotecit/canopyx@0.3.8/docs/images/tree-grid-dark.png) | ![Static outline table](https://cdn.jsdelivr.net/npm/@evotecit/canopyx@0.3.8/docs/images/static-outline.png) |
33
34
 
34
35
  ## Features
35
36
 
@@ -136,6 +137,10 @@ inventory.SaveHtmlPage("inventory.html");
136
137
 
137
138
  Open `inventory.html` to search the records, sort by name or size, and adjust the columns. Record IDs stay stable when the order changes.
138
139
 
140
+ Event snapshots without a key column opt in to `CanopyGridRowIdentity.Ordinal`; the typed grid assigns source positions and keeps sorting, filtering, export and drawers available. Saved selections, record deep links and keyed live updates require stable keys. Use `CanopySelectionMode.None` and leave reporting selection controls off for a read-only report with no selection consumer. See [row identity](docs/data-protocol.md#row-identity-order) and the generated `ordinal-grid.html` example.
141
+
142
+ Grid fitting reserves readable header and content minimums before preferred whitespace. Spare width restores headers first, then preferred widths, then ordinary column growth. Headers yield with a full-title tooltip only when their capped minimums cannot collectively fit; content that still needs more room scrolls horizontally. Auto height includes the actual horizontal scrollbar gutter. The [column-fitting algorithm](docs/column-fitting.md) and `report-grid-layout.html` example describe the policy.
143
+
139
144
  ### Render a table for email or print
140
145
 
141
146
  ```csharp
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@evotecit/canopyx",
3
- "version": "0.3.6",
3
+ "version": "0.3.8",
4
4
  "description": "Interactive tree grids and data tables with virtual rows, search, filters and offline HTML reports.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -50,6 +50,8 @@
50
50
  "./flow.css": "./CanopyX.Html/Assets/canopyx-flow.css",
51
51
  "./matrix.js": "./CanopyX.Html/Assets/canopyx-matrix.js",
52
52
  "./matrix.css": "./CanopyX.Html/Assets/canopyx-matrix.css",
53
+ "./changes.js": "./CanopyX.Html/Assets/canopyx-changes.js",
54
+ "./changes.css": "./CanopyX.Html/Assets/canopyx-changes.css",
53
55
  "./editing.js": "./CanopyX.Html/Assets/canopyx-editing.js",
54
56
  "./editing.css": "./CanopyX.Html/Assets/canopyx-editing.css",
55
57
  "./column-groups.js": "./CanopyX.Html/Assets/canopyx-column-groups.js",
@@ -149,6 +151,8 @@
149
151
  "CanopyX.Html/Assets/canopyx-flow-*.css",
150
152
  "CanopyX.Html/Assets/canopyx-matrix.js",
151
153
  "CanopyX.Html/Assets/canopyx-matrix.css",
154
+ "CanopyX.Html/Assets/canopyx-changes.js",
155
+ "CanopyX.Html/Assets/canopyx-changes.css",
152
156
  "CanopyX.Html/Assets/canopyx-editing.js",
153
157
  "CanopyX.Html/Assets/canopyx-editing.css",
154
158
  "CanopyX.Html/Assets/canopyx-column-groups.js",