@topconsultnpm/sdkui-react 6.22.0-dev2.19 → 6.22.0-dev2.20

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 (41) hide show
  1. package/lib/components/NewComponents/ContextMenu/TMContextMenu.js +1 -1
  2. package/lib/components/NewComponents/FloatingMenuBar/TMFloatingMenuBar.js +1 -1
  3. package/lib/components/base/TMDataGrid.d.ts +2 -0
  4. package/lib/components/base/TMDataGrid.js +68 -4
  5. package/lib/components/base/TMModal.d.ts +4 -0
  6. package/lib/components/base/TMModal.js +42 -11
  7. package/lib/components/features/documents/TMDcmtForm.d.ts +7 -0
  8. package/lib/components/features/documents/TMDcmtForm.js +94 -40
  9. package/lib/components/features/documents/TMMasterDetailDcmts.js +88 -30
  10. package/lib/components/features/documents/TMMasterInfoFields.d.ts +19 -0
  11. package/lib/components/features/documents/TMMasterInfoFields.js +172 -0
  12. package/lib/components/features/documents/TMMultiMasterDetailDcmtsForm.d.ts +40 -0
  13. package/lib/components/features/documents/TMMultiMasterDetailDcmtsForm.js +256 -0
  14. package/lib/components/features/documents/TMMultiMasterDetailDcmtsUtils.d.ts +352 -0
  15. package/lib/components/features/documents/TMMultiMasterDetailDcmtsUtils.js +221 -0
  16. package/lib/components/features/documents/TMRelationViewer.d.ts +14 -1
  17. package/lib/components/features/documents/TMRelationViewer.js +69 -20
  18. package/lib/components/features/search/TMSearchResult.d.ts +8 -0
  19. package/lib/components/features/search/TMSearchResult.js +131 -23
  20. package/lib/components/layout/panelManager/TMPanelManagerContainer.d.ts +1 -0
  21. package/lib/components/layout/panelManager/TMPanelManagerContainer.js +24 -14
  22. package/lib/components/layout/panelManager/TMPanelWrapper.js +2 -2
  23. package/lib/components/layout/panelManager/types.d.ts +3 -0
  24. package/lib/helper/SDKUI_Globals.d.ts +34 -0
  25. package/lib/helper/SDKUI_Globals.js +37 -0
  26. package/lib/helper/SDKUI_Localizator.d.ts +18 -0
  27. package/lib/helper/SDKUI_Localizator.js +180 -0
  28. package/lib/helper/TMIcons.d.ts +1 -0
  29. package/lib/helper/TMIcons.js +3 -0
  30. package/lib/helper/dcmtsHelper.d.ts +20 -0
  31. package/lib/helper/dcmtsHelper.js +58 -1
  32. package/lib/helper/helpers.d.ts +9 -0
  33. package/lib/helper/helpers.js +8 -0
  34. package/lib/hooks/useArchiveListForm.d.ts +39 -0
  35. package/lib/hooks/useArchiveListForm.js +46 -0
  36. package/lib/hooks/useDocumentOperations.d.ts +1 -0
  37. package/lib/hooks/useDocumentOperations.js +16 -4
  38. package/lib/hooks/useMultiMasterDetailDcmts.d.ts +97 -0
  39. package/lib/hooks/useMultiMasterDetailDcmts.js +555 -0
  40. package/lib/hooks/useRelatedDocuments.js +2 -26
  41. package/package.json +1 -1
@@ -444,6 +444,16 @@ export class SDKUI_Localizator {
444
444
  default: return "Consenti solo archiviazioni di metadati";
445
445
  }
446
446
  }
447
+ static get ArchivedDetails() {
448
+ switch (this._cultureID) {
449
+ case CultureIDs.De_DE: return "Bereits archivierte Details";
450
+ case CultureIDs.En_US: return "Already archived details";
451
+ case CultureIDs.Es_ES: return "Detalles ya archivados";
452
+ case CultureIDs.Fr_FR: return "Détails déjà archivés";
453
+ case CultureIDs.Pt_PT: return "Detalhes já arquivados";
454
+ default: return "Dettagli già archiviati";
455
+ }
456
+ }
447
457
  static get ArchivedDocuments() {
448
458
  switch (this._cultureID) {
449
459
  case CultureIDs.De_DE: return "Archivierte Dokumente";
@@ -484,6 +494,46 @@ export class SDKUI_Localizator {
484
494
  default: return "Archivia documento master";
485
495
  }
486
496
  }
497
+ static get ArchiveMultipleDetailDocuments() {
498
+ switch (this._cultureID) {
499
+ case CultureIDs.De_DE: return "Mehrere Details archivieren";
500
+ case CultureIDs.En_US: return "Archive multiple details";
501
+ case CultureIDs.Es_ES: return "Archivar múltiples detalles";
502
+ case CultureIDs.Fr_FR: return "Archiver plusieurs détails";
503
+ case CultureIDs.Pt_PT: return "Arquivar múltiplos detalhes";
504
+ default: return "Archivia dettagli multipli";
505
+ }
506
+ }
507
+ static get ArchiveMasterAndMultipleDetailDocuments() {
508
+ switch (this._cultureID) {
509
+ case CultureIDs.De_DE: return "Master mit mehreren Details archivieren";
510
+ case CultureIDs.En_US: return "Archive master with multiple details";
511
+ case CultureIDs.Es_ES: return "Archivar maestro con múltiples detalles";
512
+ case CultureIDs.Fr_FR: return "Archiver le maître avec plusieurs détails";
513
+ case CultureIDs.Pt_PT: return "Arquivar mestre com múltiplos detalhes";
514
+ default: return "Archivia master con dettagli multipli";
515
+ }
516
+ }
517
+ static get ArchiveMasterAndDetails_Confirm() {
518
+ switch (this._cultureID) {
519
+ case CultureIDs.De_DE: return "Master archivieren und mit den Details fortfahren?";
520
+ case CultureIDs.En_US: return "Archive the master and proceed with the details?";
521
+ case CultureIDs.Es_ES: return "¿Archivar el maestro y continuar con los detalles?";
522
+ case CultureIDs.Fr_FR: return "Archiver le maître et poursuivre avec les détails ?";
523
+ case CultureIDs.Pt_PT: return "Arquivar o mestre e prosseguir com os detalhes?";
524
+ default: return "Archiviare il master e proseguire con i dettagli?";
525
+ }
526
+ }
527
+ static get ExitWithoutArchiving_Confirm() {
528
+ switch (this._cultureID) {
529
+ case CultureIDs.De_DE: return "Möchten Sie wirklich beenden? Die eingegebenen Dokumente werden nicht archiviert. Fortfahren?";
530
+ case CultureIDs.En_US: return "Are you sure you want to exit? The entered documents will not be archived. Continue?";
531
+ case CultureIDs.Es_ES: return "¿Está seguro de que desea salir? Los documentos introducidos no se archivarán. ¿Continuar?";
532
+ case CultureIDs.Fr_FR: return "Êtes-vous sûr de vouloir quitter ? Les documents saisis ne seront pas archivés. Continuer ?";
533
+ case CultureIDs.Pt_PT: return "Tem a certeza de que pretende sair? Os documentos introduzidos não serão arquivados. Continuar?";
534
+ default: return "Sei sicuro di voler uscire? I documenti inseriti non verranno archiviati. Continuare?";
535
+ }
536
+ }
487
537
  static get Archiving() {
488
538
  switch (this._cultureID) {
489
539
  case CultureIDs.De_DE: return "Archivierung";
@@ -1672,6 +1722,16 @@ export class SDKUI_Localizator {
1672
1722
  default: return "Dettagli";
1673
1723
  }
1674
1724
  }
1725
+ static get DetailsToArchive() {
1726
+ switch (this._cultureID) {
1727
+ case CultureIDs.De_DE: return "Zu archivierende Details";
1728
+ case CultureIDs.En_US: return "Details to archive";
1729
+ case CultureIDs.Es_ES: return "Detalles a archivar";
1730
+ case CultureIDs.Fr_FR: return "Détails à archiver";
1731
+ case CultureIDs.Pt_PT: return "Detalhes a arquivar";
1732
+ default: return "Dettagli da archiviare";
1733
+ }
1734
+ }
1675
1735
  static get Delete() {
1676
1736
  switch (this._cultureID) {
1677
1737
  case CultureIDs.De_DE: return "Löschen";
@@ -1712,6 +1772,16 @@ export class SDKUI_Localizator {
1712
1772
  default: return "Eliminare il commento?";
1713
1773
  }
1714
1774
  }
1775
+ static get DeleteAllRowsToChangeDcmtType() {
1776
+ switch (this._cultureID) {
1777
+ case CultureIDs.De_DE: return "Löschen Sie alle Zeilen, um den Dokumenttyp zu ändern";
1778
+ case CultureIDs.En_US: return "Delete all rows to change the document type";
1779
+ case CultureIDs.Es_ES: return "Elimine todas las filas para poder cambiar el tipo de documento";
1780
+ case CultureIDs.Fr_FR: return "Supprimez toutes les lignes pour pouvoir changer le type de document";
1781
+ case CultureIDs.Pt_PT: return "Elimine todas as linhas para poder alterar o tipo de documento";
1782
+ default: return "Elimina tutte le righe per poter cambiare tipo documento";
1783
+ }
1784
+ }
1715
1785
  static get DeleteDeletedMessages() {
1716
1786
  switch (this._cultureID) {
1717
1787
  case CultureIDs.De_DE: return "Gelöschte Nachrichten löschen";
@@ -4018,6 +4088,16 @@ export class SDKUI_Localizator {
4018
4088
  default: return "Nascondi tutti";
4019
4089
  }
4020
4090
  }
4091
+ static get HideArchivedDetails() {
4092
+ switch (this._cultureID) {
4093
+ case CultureIDs.De_DE: return "Bereits archivierte Details ausblenden";
4094
+ case CultureIDs.En_US: return "Hide already archived details";
4095
+ case CultureIDs.Es_ES: return "Ocultar los detalles ya archivados";
4096
+ case CultureIDs.Fr_FR: return "Masquer les détails déjà archivés";
4097
+ case CultureIDs.Pt_PT: return "Ocultar os detalhes já arquivados";
4098
+ default: return "Nascondi i dettagli già archiviati";
4099
+ }
4100
+ }
4021
4101
  static get HideDcmtTypes() {
4022
4102
  switch (this._cultureID) {
4023
4103
  case CultureIDs.De_DE: return "Dokumenttypen ausblenden";
@@ -4028,6 +4108,16 @@ export class SDKUI_Localizator {
4028
4108
  default: return "Nascondi tipi documento";
4029
4109
  }
4030
4110
  }
4111
+ static get HideDetailsToArchive() {
4112
+ switch (this._cultureID) {
4113
+ case CultureIDs.De_DE: return "Zu archivierende Details ausblenden";
4114
+ case CultureIDs.En_US: return "Hide details to archive";
4115
+ case CultureIDs.Es_ES: return "Ocultar los detalles a archivar";
4116
+ case CultureIDs.Fr_FR: return "Masquer les détails à archiver";
4117
+ case CultureIDs.Pt_PT: return "Ocultar os detalhes a arquivar";
4118
+ default: return "Nascondi i dettagli da archiviare";
4119
+ }
4120
+ }
4031
4121
  static get HideDetailsWithZeroDocs() {
4032
4122
  switch (this._cultureID) {
4033
4123
  case CultureIDs.De_DE: return "Details mit 0 Dokumenten ausblenden";
@@ -4078,6 +4168,16 @@ export class SDKUI_Localizator {
4078
4168
  default: return "Nascondi opzioni di formattazione";
4079
4169
  }
4080
4170
  }
4171
+ static get HideMasterInfo() {
4172
+ switch (this._cultureID) {
4173
+ case CultureIDs.De_DE: return "Master-Informationen ausblenden";
4174
+ case CultureIDs.En_US: return "Hide master information";
4175
+ case CultureIDs.Es_ES: return "Ocultar la información del maestro";
4176
+ case CultureIDs.Fr_FR: return "Masquer les informations du maître";
4177
+ case CultureIDs.Pt_PT: return "Ocultar as informações do mestre";
4178
+ default: return "Nascondi le informazioni del master";
4179
+ }
4180
+ }
4081
4181
  static get HideMetadata() {
4082
4182
  switch (this._cultureID) {
4083
4183
  case CultureIDs.De_DE: return "Metadaten ausblenden";
@@ -6653,6 +6753,26 @@ export class SDKUI_Localizator {
6653
6753
  default: return "Nessuna correlazione trovata";
6654
6754
  }
6655
6755
  }
6756
+ static get StopRelationsCalculation() {
6757
+ switch (this._cultureID) {
6758
+ case CultureIDs.De_DE: return "Berechnung unterbrechen und die bereits berechneten Korrelationen anzeigen";
6759
+ case CultureIDs.En_US: return "Stop the calculation and show the already calculated correlations";
6760
+ case CultureIDs.Es_ES: return "Interrumpir el cálculo y mostrar las correlaciones ya calculadas";
6761
+ case CultureIDs.Fr_FR: return "Interrompre le calcul et afficher les corrélations déjà calculées";
6762
+ case CultureIDs.Pt_PT: return "Interromper o cálculo e mostrar as correlações já calculadas";
6763
+ default: return "Interrompi il calcolo e mostra le correlazioni già calcolate";
6764
+ }
6765
+ }
6766
+ static get RelationsCalculationStopped() {
6767
+ switch (this._cultureID) {
6768
+ case CultureIDs.De_DE: return "Berechnung der Korrelationen unterbrochen: Es werden nur die bereits berechneten Korrelationen angezeigt.";
6769
+ case CultureIDs.En_US: return "Correlations calculation stopped: only the already calculated correlations are shown.";
6770
+ case CultureIDs.Es_ES: return "Cálculo de correlaciones interrumpido: solo se muestran las correlaciones ya calculadas.";
6771
+ case CultureIDs.Fr_FR: return "Calcul des corrélations interrompu : seules les corrélations déjà calculées sont affichées.";
6772
+ case CultureIDs.Pt_PT: return "Cálculo das correlações interrompido: são mostradas apenas as correlações já calculadas.";
6773
+ default: return "Calcolo delle correlazioni interrotto: vengono mostrate solo le correlazioni già calcolate.";
6774
+ }
6775
+ }
6656
6776
  static get RelatedDcmtsNotFound() {
6657
6777
  switch (this._cultureID) {
6658
6778
  case CultureIDs.De_DE: return "Für das ausgewählte Dokument wurden keine zugehörigen Dokumente gefunden.";
@@ -6693,6 +6813,16 @@ export class SDKUI_Localizator {
6693
6813
  default: return "Rimuovi filtro contestuale";
6694
6814
  }
6695
6815
  }
6816
+ static get RemoveDetailFromSummary_Confirm() {
6817
+ switch (this._cultureID) {
6818
+ case CultureIDs.De_DE: return "Detail entfernen? Es wird nicht archiviert.";
6819
+ case CultureIDs.En_US: return "Remove this detail? It won't be archived.";
6820
+ case CultureIDs.Es_ES: return "¿Eliminar este detalle? No se archivará.";
6821
+ case CultureIDs.Fr_FR: return "Supprimer ce détail ? Il ne sera pas archivé.";
6822
+ case CultureIDs.Pt_PT: return "Remover este detalhe? Não será arquivado.";
6823
+ default: return "Rimuovere questo dettaglio? Non verrà archiviato.";
6824
+ }
6825
+ }
6696
6826
  static get RemoveFromCache() {
6697
6827
  switch (this._cultureID) {
6698
6828
  case CultureIDs.De_DE: return "Element aus Cache entfernen";
@@ -7299,6 +7429,16 @@ export class SDKUI_Localizator {
7299
7429
  default: return "Seleziona un documento per visualizzare i dettagli";
7300
7430
  }
7301
7431
  }
7432
+ static get SelectDcmtTypeForDetailArchiving() {
7433
+ switch (this._cultureID) {
7434
+ case CultureIDs.De_DE: return "Dokumenttyp auswählen, für den die Details archiviert werden sollen";
7435
+ case CultureIDs.En_US: return "Select the document type for which to archive the details";
7436
+ case CultureIDs.Es_ES: return "Seleccionar el tipo de documento sobre el cual archivar los detalles";
7437
+ case CultureIDs.Fr_FR: return "Sélectionner le type de document sur lequel archiver les détails";
7438
+ case CultureIDs.Pt_PT: return "Selecionar o tipo de documento no qual arquivar os detalhes";
7439
+ default: return "Selezionare il tipo documento sul quale effettuare l'archiviazione dei dettagli";
7440
+ }
7441
+ }
7302
7442
  static get SelectArchiveToStart() {
7303
7443
  switch (this._cultureID) {
7304
7444
  case CultureIDs.De_DE: return "Klicken Sie auf Archivieren, um zu beginnen.";
@@ -7630,6 +7770,16 @@ export class SDKUI_Localizator {
7630
7770
  default: return "Mostra tutti";
7631
7771
  }
7632
7772
  }
7773
+ static get ShowArchivedDetails() {
7774
+ switch (this._cultureID) {
7775
+ case CultureIDs.De_DE: return "Bereits archivierte Details anzeigen";
7776
+ case CultureIDs.En_US: return "Show already archived details";
7777
+ case CultureIDs.Es_ES: return "Mostrar los detalles ya archivados";
7778
+ case CultureIDs.Fr_FR: return "Afficher les détails déjà archivés";
7779
+ case CultureIDs.Pt_PT: return "Mostrar os detalhes já arquivados";
7780
+ default: return "Mostra i dettagli già archiviati";
7781
+ }
7782
+ }
7633
7783
  static get ShowColumnSelection() {
7634
7784
  switch (this._cultureID) {
7635
7785
  case CultureIDs.De_DE: return "Spaltenauswahl anzeigen";
@@ -7690,6 +7840,16 @@ export class SDKUI_Localizator {
7690
7840
  default: return "Mostra dettagli";
7691
7841
  }
7692
7842
  }
7843
+ static get ShowDetailsToArchive() {
7844
+ switch (this._cultureID) {
7845
+ case CultureIDs.De_DE: return "Zu archivierende Details anzeigen";
7846
+ case CultureIDs.En_US: return "Show details to archive";
7847
+ case CultureIDs.Es_ES: return "Mostrar los detalles a archivar";
7848
+ case CultureIDs.Fr_FR: return "Afficher les détails à archiver";
7849
+ case CultureIDs.Pt_PT: return "Mostrar os detalhes a arquivar";
7850
+ default: return "Mostra i dettagli da archiviare";
7851
+ }
7852
+ }
7693
7853
  static get ShowDetailsWithZeroDocs() {
7694
7854
  switch (this._cultureID) {
7695
7855
  case CultureIDs.De_DE: return "Details mit 0 Dokumenten anzeigen";
@@ -7740,6 +7900,26 @@ export class SDKUI_Localizator {
7740
7900
  default: return "Mostra il pannello sinistro";
7741
7901
  }
7742
7902
  }
7903
+ static get ShowMasterInfo() {
7904
+ switch (this._cultureID) {
7905
+ case CultureIDs.De_DE: return "Master-Informationen anzeigen";
7906
+ case CultureIDs.En_US: return "Show master information";
7907
+ case CultureIDs.Es_ES: return "Mostrar la información del maestro";
7908
+ case CultureIDs.Fr_FR: return "Afficher les informations du maître";
7909
+ case CultureIDs.Pt_PT: return "Mostrar as informações do mestre";
7910
+ default: return "Mostra le informazioni del master";
7911
+ }
7912
+ }
7913
+ static get ShowPartialResults() {
7914
+ switch (this._cultureID) {
7915
+ case CultureIDs.De_DE: return "Teilergebnisse anzeigen";
7916
+ case CultureIDs.En_US: return "Show partial results";
7917
+ case CultureIDs.Es_ES: return "Mostrar resultados parciales";
7918
+ case CultureIDs.Fr_FR: return "Afficher les résultats partiels";
7919
+ case CultureIDs.Pt_PT: return "Mostrar resultados parciais";
7920
+ default: return "Mostra risultati parziali";
7921
+ }
7922
+ }
7743
7923
  static get ShowSearch() {
7744
7924
  switch (this._cultureID) {
7745
7925
  case CultureIDs.De_DE: return "Suche anzeigen";
@@ -271,6 +271,7 @@ export declare function IconWizard4(props: React.SVGProps<SVGSVGElement>): impor
271
271
  export declare function IconNew(props: React.SVGProps<SVGSVGElement>): import("react/jsx-runtime").JSX.Element;
272
272
  export declare function IconFileOpenOutline(props: Readonly<React.SVGProps<SVGSVGElement>>): import("react/jsx-runtime").JSX.Element;
273
273
  export declare function IconArchiveDetail(props: React.SVGProps<SVGSVGElement>): import("react/jsx-runtime").JSX.Element;
274
+ export declare function IconArchiveMultipleDetailDocuments(props: React.SVGProps<SVGSVGElement>): import("react/jsx-runtime").JSX.Element;
274
275
  export declare function IconArchiveMaster(props: React.SVGProps<SVGSVGElement>): import("react/jsx-runtime").JSX.Element;
275
276
  export declare function IconPair(props: React.SVGProps<SVGSVGElement>): import("react/jsx-runtime").JSX.Element;
276
277
  export declare function IconUnpair(props: React.SVGProps<SVGSVGElement>): import("react/jsx-runtime").JSX.Element;
@@ -673,6 +673,9 @@ export function IconFileOpenOutline(props) {
673
673
  export function IconArchiveDetail(props) {
674
674
  return (_jsxs("svg", { fontSize: props.fontSize ?? FONTSIZE, xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", width: "1em", height: "1em", ...props, children: [" ", _jsx("path", { fill: "currentColor", d: "m20.54 5.23l-1.39-1.68C18.88 3.21 18.47 3 18 3H6c-.47 0-.88.21-1.16.55L3.46 5.23C3.17 5.57 3 6.02 3 6.5V19c0 1.1.9 2 2 2h14c1.1 0 2-.9 2-2V6.5c0-.48-.17-.93-.46-1.27M12 17.5L6.5 12H10v-2h4v2h3.5zM5.12 5l.81-1h12l.94 1z" }), " "] }));
675
675
  }
676
+ export function IconArchiveMultipleDetailDocuments(props) {
677
+ return (_jsxs("svg", { fontSize: props.fontSize ?? FONTSIZE, xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 48 48", width: "1em", height: "1em", ...props, children: [_jsx("path", { fill: "currentColor", d: "M40,35v5H8v-5H4v5c0,2.2,1.8,4,4,4h32c2.2,0,4-1.8,4-4v-5H40z" }), _jsxs("g", { fill: "currentColor", children: [_jsx("polygon", { points: "24,23.4 17,15 31,15" }), _jsx("rect", { x: "22", y: "4", width: "4", height: "14" }), _jsx("path", { d: "M31.5,26.9L30.8,28l3.5,1.9l0.6-1.2c1.6-3,2.6-4.7,3.5-5.2C39.3,23,41,23,44,23v-4C36.3,19,35.6,19.4,31.5,26.9z" }), _jsx("polygon", { points: "38.4,31 29.4,35 28,25" }), _jsx("path", { d: "M16.5,26.9l0.6,1.2L13.6,30L13,28.8c-1.6-3-2.6-4.7-3.5-5.2C8.7,23,7,23,4,23v-4C11.7,19,12.4,19.4,16.5,26.9z" }), _jsx("polygon", { points: "20,25 18.6,35 9.6,31" })] })] }));
678
+ }
676
679
  export function IconArchiveMaster(props) {
677
680
  return (_jsxs("svg", { fontSize: props.fontSize ?? FONTSIZE, xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", width: "1em", height: "1em", ...props, children: [" ", _jsx("path", { fill: "currentColor", d: "m20.55 5.22l-1.39-1.68A1.51 1.51 0 0 0 18 3H6c-.47 0-.88.21-1.15.55L3.46 5.22C3.17 5.57 3 6.01 3 6.5V19a2 2 0 0 0 2 2h14c1.1 0 2-.9 2-2V6.5c0-.49-.17-.93-.45-1.28M12 9.5l5.5 5.5H14v2h-4v-2H6.5zM5.12 5l.82-1h12l.93 1z" }), " "] }));
678
681
  }
@@ -1,8 +1,28 @@
1
+ import { DcmtTypeDescriptor, MetadataDataTypes, MetadataDescriptor, MetadataFormats, RelationDescriptor } from "@topconsultnpm/sdk-ts";
1
2
  import { MetadataValueDescriptorEx } from "../ts";
3
+ /** Metadati utente (esclusi quelli di sistema) del tipo documento, in ordine di visualizzazione */
4
+ export declare const getUserMetadataSorted: (dtd: DcmtTypeDescriptor | undefined) => Array<MetadataDescriptor>;
5
+ /** Formatta un valore scalare (non lista dati): date e numeri rispettano Format e FormatCulture del metadato */
6
+ export declare const formatScalarValue: (value: any, dataType: MetadataDataTypes | undefined, format: MetadataFormats | undefined, formatCulture: string | undefined) => string;
2
7
  /** Check if dcmtType (mTID) has configured Detail or Many-to-Many relations */
3
8
  export declare const hasDetailRelations: (mTID: number | undefined) => Promise<boolean>;
4
9
  /** Check if dcmtType (mTID) has configured Master or Many-to-Many relations */
5
10
  export declare const hasMasterRelations: (mTID: number | undefined) => Promise<boolean>;
11
+ export declare const getDcmtMetadataByMid: (dcmt: {
12
+ TID?: number;
13
+ DID?: number;
14
+ } | undefined) => Promise<Map<number, any>>;
15
+ export declare const mapAssociationsFromMetadata: (relation: RelationDescriptor, type: "detail" | "master", metadataByMid: Map<number, any>) => Array<{
16
+ mid: number;
17
+ value: string;
18
+ }>;
19
+ export declare const mapRelationAssociationsToMids: (relation: RelationDescriptor, type: "detail" | "master", dcmt: {
20
+ TID?: number;
21
+ DID?: number;
22
+ } | undefined) => Promise<Array<{
23
+ mid: number;
24
+ value: string;
25
+ }>>;
6
26
  export declare const isXMLFileExt: (fileExt: string | undefined) => boolean;
7
27
  export declare const getButtonAttributes: (args: string | undefined, formData: MetadataValueDescriptorEx[] | undefined, selectedItems: Array<any> | undefined) => Record<string, any> | undefined;
8
28
  export declare const getSelectedItem: (args: string | undefined, formData: MetadataValueDescriptorEx[] | undefined, item: any) => Record<string, any> | undefined;
@@ -1,4 +1,21 @@
1
- import { RelationCacheService, RelationTypes, SDK_Globals } from "@topconsultnpm/sdk-ts";
1
+ import { MetadataDataTypes, RelationCacheService, RelationTypes, SDK_Globals } from "@topconsultnpm/sdk-ts";
2
+ import { formatDateTimeByMetadataFormat, formatNumberByMetadataFormat } from "./TMUtils";
3
+ /** Metadati utente (esclusi quelli di sistema) del tipo documento, in ordine di visualizzazione */
4
+ export const getUserMetadataSorted = (dtd) => {
5
+ return (dtd?.metadata ?? [])
6
+ .filter(md => md.id !== undefined && md.id > 100 && md.isSystem !== 1)
7
+ .sort((a, b) => (a.ordinalPosition ?? 0) - (b.ordinalPosition ?? 0));
8
+ };
9
+ /** Formatta un valore scalare (non lista dati): date e numeri rispettano Format e FormatCulture del metadato */
10
+ export const formatScalarValue = (value, dataType, format, formatCulture) => {
11
+ if (value === undefined || value === null || value === '')
12
+ return '';
13
+ switch (dataType) {
14
+ case MetadataDataTypes.DateTime: return formatDateTimeByMetadataFormat(value instanceof Date ? value : new Date(value), format, formatCulture);
15
+ case MetadataDataTypes.Number: return formatNumberByMetadataFormat(value, format, formatCulture ?? window.navigator.language);
16
+ default: return String(value);
17
+ }
18
+ };
2
19
  /** Check if dcmtType (mTID) has configured Detail or Many-to-Many relations */
3
20
  export const hasDetailRelations = async (mTID) => {
4
21
  let allRelations = await RelationCacheService.GetAllAsync();
@@ -13,6 +30,46 @@ export const hasMasterRelations = async (mTID) => {
13
30
  let rdlManyToMany = allRelations?.filter(o => o.relationType == RelationTypes.ManyToMany && (o.masterTID == mTID || o.detailTID == mTID)) ?? [];
14
31
  return rdlManyToMany.length > 0 || rdlOneToMany.length > 0;
15
32
  };
33
+ // Legge i metadati di un documento
34
+ export const getDcmtMetadataByMid = async (dcmt) => {
35
+ const metadataMap = new Map();
36
+ if (!dcmt?.TID || !dcmt?.DID)
37
+ return metadataMap; // Documento non identificabile: mappa vuota
38
+ const searchEngine = SDK_Globals.tmSession?.NewSearchEngine();
39
+ if (!searchEngine)
40
+ return metadataMap; // Nessuna sessione attiva: mappa vuota
41
+ const allMetadata = await searchEngine.GetMetadataAsync(dcmt.TID, dcmt.DID, false);
42
+ const row = allMetadata?.dtdResult?.rows?.[0]; // Prima (e unica) riga = il documento richiesto
43
+ const mids = allMetadata?.selectMIDs; // MID nello stesso ordine dei valori di riga
44
+ if (row && mids)
45
+ mids.forEach((mid, index) => metadataMap.set(mid, row[index])); // Accoppia mid -> valore per posizione
46
+ return metadataMap;
47
+ };
48
+ // Mappa le associazioni della relazione nei MID di destinazione, usando i metadati sorgente già letti.
49
+ // 'detail' = archivio dettagli dal master (sorgente item1 -> destinazione item2); 'master' = archivio master dal dettaglio (item2 -> item1).
50
+ // Emette una voce per ogni associazione, anche vuota, per coprire tutti i collegamenti.
51
+ export const mapAssociationsFromMetadata = (relation, type, metadataByMid) => {
52
+ if (!relation.associations || relation.associations.length === 0)
53
+ return []; // Relazione senza collegamenti
54
+ return relation.associations.map(assoc => {
55
+ const sourceMid = type === 'detail' ? (assoc.item1 ?? 0) : (assoc.item2 ?? 0); // MID da cui leggere il valore
56
+ const targetMid = type === 'detail' ? (assoc.item2 ?? 0) : (assoc.item1 ?? 0); // MID da valorizzare
57
+ const value = metadataByMid.get(sourceMid); // Valore sorgente (può mancare)
58
+ return { mid: targetMid, value: value !== undefined && value !== null ? value.toString() : '' }; // Assente/null -> stringa vuota
59
+ });
60
+ };
61
+ // Legge il documento sorgente (master per 'detail', dettaglio per 'master') e mappa le associazioni nei MID di destinazione.
62
+ // Per letture ripetute dello stesso documento, riusare la mappa e chiamare direttamente `mapAssociationsFromMetadata`.
63
+ export const mapRelationAssociationsToMids = async (relation, type, dcmt) => {
64
+ if (!relation.associations || relation.associations.length === 0)
65
+ return []; // Relazione senza collegamenti
66
+ if (!dcmt?.TID || !dcmt?.DID)
67
+ return []; // Documento sorgente non identificabile
68
+ const metadataByMid = await getDcmtMetadataByMid(dcmt);
69
+ if (metadataByMid.size === 0)
70
+ return []; // Nessun metadato leggibile: [] come nel flusso originale (niente collegamenti a vuoto)
71
+ return mapAssociationsFromMetadata(relation, type, metadataByMid);
72
+ };
16
73
  export const isXMLFileExt = (fileExt) => {
17
74
  const fileExtension = fileExt?.toLowerCase() ?? '';
18
75
  switch (fileExtension) {
@@ -2,6 +2,15 @@ import { Colors as ColorsType } from "../components/base/TMEditorBase";
2
2
  import { DeviceType } from "../components";
3
3
  import { AppModules, DataColumnDescriptor, DcmtTypeDescriptor, ITopMediaSession, MetadataDescriptor, QueryDescriptor, SearchResultDescriptor, TaskDescriptor } from "@topconsultnpm/sdk-ts";
4
4
  import { FileExtensionHandler, FormModes, moduleTypes } from "../ts";
5
+ import React from "react";
6
+ /**
7
+ * Handler di hover per elementi con stili inline: applica `over` all'ingresso del mouse e `out` all'uscita.
8
+ * Da spandere sull'elemento: `{...hoverStyle({ background: 'red' }, { background: 'transparent' })}`
9
+ */
10
+ export declare const hoverStyle: (over: React.CSSProperties, out: React.CSSProperties) => {
11
+ onMouseEnter: (e: React.MouseEvent<HTMLElement>) => CSSStyleDeclaration & React.CSSProperties;
12
+ onMouseLeave: (e: React.MouseEvent<HTMLElement>) => CSSStyleDeclaration & React.CSSProperties;
13
+ };
5
14
  declare const calcResponsiveSizes: (deviceType: DeviceType | undefined, desktopSize: string, tabletSize: string, mobileSize: string) => string;
6
15
  declare const taskModalSizes: (deviceType: DeviceType | undefined, formMode: FormModes) => {
7
16
  width: string;
@@ -7,6 +7,14 @@ import { buildTypes, FileExtensionHandler, FormModes, moduleTypes } from "../ts"
7
7
  import { SDKUI_Localizator } from "./SDKUI_Localizator";
8
8
  import ReactDOMServer from "react-dom/server";
9
9
  import { DeepCompareHelper } from "./DeepCompareHelper";
10
+ /**
11
+ * Handler di hover per elementi con stili inline: applica `over` all'ingresso del mouse e `out` all'uscita.
12
+ * Da spandere sull'elemento: `{...hoverStyle({ background: 'red' }, { background: 'transparent' })}`
13
+ */
14
+ export const hoverStyle = (over, out) => ({
15
+ onMouseEnter: (e) => Object.assign(e.currentTarget.style, over),
16
+ onMouseLeave: (e) => Object.assign(e.currentTarget.style, out),
17
+ });
10
18
  const calcResponsiveSizes = (deviceType, desktopSize, tabletSize, mobileSize) => {
11
19
  if (deviceType === DeviceType.DESKTOP)
12
20
  return desktopSize;
@@ -0,0 +1,39 @@
1
+ import { MutableRefObject } from 'react';
2
+ import { MetadataValueDescriptorEx } from '../ts';
3
+ /** Modalità "aggiungi a elenco": il form non archivia a sistema, restituisce i metadati al chiamante (TMMultiMasterDetailDcmts). */
4
+ export interface ArchiveListMode {
5
+ /** true quando si modifica una riga già presente nell'elenco ("Modifica" al posto di "Aggiungi"). */
6
+ isEditingRow: boolean;
7
+ /** Restituisce metadati e file al chiamante, che aggiunge o aggiorna la riga nell'elenco (senza archiviare). */
8
+ onUpsertRow: (metadataValues: Array<MetadataValueDescriptorEx>, file: File | undefined, tid?: number) => void;
9
+ }
10
+ interface UseArchiveListFormParams {
11
+ /** Assente = modalità "aggiungi a elenco" spenta. */
12
+ mode?: ArchiveListMode;
13
+ /** Valori della riga in modifica, con cui pre-compilare il form. */
14
+ editingRowValues?: Array<{
15
+ mid: number;
16
+ value: string;
17
+ }>;
18
+ /** Template vuoto del form. */
19
+ formDataOrig: Array<MetadataValueDescriptorEx>;
20
+ /** Ref ai valori correnti del form (per leggerli al submit senza stale closure). */
21
+ formDataRef: MutableRefObject<Array<MetadataValueDescriptorEx>>;
22
+ /** Ref al file caricato. */
23
+ dcmtFileRef: MutableRefObject<File | null>;
24
+ tid?: number;
25
+ isModal?: boolean;
26
+ /** Id del form, usato come parentId del message box quando è in modale. */
27
+ id?: string;
28
+ /** Svuota il form dopo aver restituito i valori. */
29
+ clearForm: () => void;
30
+ }
31
+ /** Isola la logica della modalità "aggiungi a elenco": valori di riferimento, submit e chiusura del form. */
32
+ export declare const useArchiveListForm: ({ mode, editingRowValues, formDataOrig, formDataRef, dcmtFileRef, tid, isModal, id, clearForm, }: UseArchiveListFormParams) => {
33
+ enabled: boolean;
34
+ isEditingRow: boolean;
35
+ referenceValues: MetadataValueDescriptorEx[];
36
+ submit: () => void;
37
+ requestClose: (isModified: boolean, onClose?: () => void) => boolean;
38
+ };
39
+ export {};
@@ -0,0 +1,46 @@
1
+ import { useCallback, useMemo } from 'react';
2
+ import { ButtonNames, TMMessageBoxManager } from '../components';
3
+ /** Isola la logica della modalità "aggiungi a elenco": valori di riferimento, submit e chiusura del form. */
4
+ export const useArchiveListForm = ({ mode, editingRowValues, formDataOrig, formDataRef, dcmtFileRef, tid, isModal, id, clearForm, }) => {
5
+ const enabled = !!mode;
6
+ const isEditingRow = !!mode?.isEditingRow;
7
+ // Valori con cui si confronta il form per capire cosa è cambiato (flag "modificato" ed evidenza gialla).
8
+ // Modificando una riga si parte dai suoi valori, così i campi pre-compilati non risultano subito modificati.
9
+ const referenceValues = useMemo(() => {
10
+ if (!isEditingRow || !editingRowValues || editingRowValues.length === 0)
11
+ return formDataOrig;
12
+ return formDataOrig.map(md => {
13
+ const rowValue = editingRowValues.find(rv => rv.mid === md.mid);
14
+ return rowValue ? { ...md, value: rowValue.value } : md;
15
+ });
16
+ }, [isEditingRow, editingRowValues, formDataOrig]);
17
+ // Restituisce metadati e file al chiamante, poi svuota il form.
18
+ const submit = useCallback(() => {
19
+ if (!mode)
20
+ return;
21
+ const values = formDataRef.current.filter(md => md.mid !== undefined && md.mid > 99);
22
+ mode.onUpsertRow(values, dcmtFileRef.current ?? undefined, tid);
23
+ clearForm();
24
+ }, [mode, formDataRef, dcmtFileRef, tid, clearForm]);
25
+ // Gestisce la chiusura del form
26
+ const requestClose = useCallback((isModified, onClose) => {
27
+ if (!mode)
28
+ return false;
29
+ if (!isModified) {
30
+ onClose?.();
31
+ return true;
32
+ }
33
+ TMMessageBoxManager.show({
34
+ parentId: isModal ? "TMDcmtFormShowConfirmForClose-" + id : undefined,
35
+ message: "Chiudendo, le modifiche andranno perse. Proseguire?",
36
+ buttons: [ButtonNames.YES, ButtonNames.NO],
37
+ onButtonClick: (e) => {
38
+ // Sì: scarta le modifiche e chiude senza aggiungere all'elenco. No: resta sul form.
39
+ if (e == ButtonNames.YES)
40
+ onClose?.();
41
+ }
42
+ });
43
+ return true;
44
+ }, [mode, isModal, id]);
45
+ return { enabled, isEditingRow, referenceValues, submit, requestClose };
46
+ };
@@ -105,6 +105,7 @@ interface UseDocumentOperationsProps {
105
105
  }
106
106
  export interface UseDocumentOperationsResult {
107
107
  operationItems: Array<TMContextMenuItemProps>;
108
+ selectedDcmtInfos: Array<DcmtInfo>;
108
109
  renderFloatingBar: React.ReactNode;
109
110
  renderDcmtOperations: React.ReactNode;
110
111
  features: {
@@ -21,10 +21,11 @@ import { useDcmtOperations } from "./useDcmtOperations";
21
21
  import useFloatingBarPinnedItems from "./useFloatingBarPinnedItems";
22
22
  import { useInputAttachmentsDialog, useInputCvtFormatDialog } from "./useInputDialog";
23
23
  import { useRelatedDocuments } from "./useRelatedDocuments";
24
- import { convertSearchResultDescriptorToFileItems, dcmtsFileCachePreview, getDcmtCicoStatus, getMoreInfoTasksForDocument, IconActivity, IconArchiveDetail, IconArchiveDoc, IconArchiveMaster, IconBatchUpdate, IconCheck, IconCheckFile, IconCheckIn, IconCircleInfo, IconCloseCircle, IconConvertFilePdf, IconCopy, IconCustom, IconDelete, IconDetailDcmts, IconDotsVerticalCircleOutline, IconDownload, IconEdit, IconExportTo, IconFileDots, IconHide, IconInfo, IconMenuCAArchive, IconMoveToFolder, IconPair, IconPin, IconPlatform, IconPreview, IconRelation, IconSearch, IconShare, IconSharedDcmt, IconShow, IconSignaturePencil, IconStar, IconSubstFile, IconUndo, IconUnpair, IconUserGroupOutline, isConvertibleToPdfExt, isPdfEditorAvailable, S4T_USER_REGISTRY_MASTER, SDKUI_Globals, SDKUI_Localizator, searchResultToMetadataValues, TMImageLibrary, IconCertificateBadge } from '../helper';
24
+ import { convertSearchResultDescriptorToFileItems, dcmtsFileCachePreview, getDcmtCicoStatus, getMoreInfoTasksForDocument, IconActivity, IconArchiveDetail, IconArchiveDoc, IconArchiveMaster, IconBatchUpdate, IconCheck, IconCheckFile, IconCheckIn, IconCircleInfo, IconCloseCircle, IconConvertFilePdf, IconCopy, IconCustom, IconDelete, IconDetailDcmts, IconDotsVerticalCircleOutline, IconDownload, IconEdit, IconExportTo, IconFileDots, IconHide, IconInfo, IconMenuCAArchive, IconMoveToFolder, IconPair, IconPin, IconPlatform, IconPreview, IconRelation, IconSearch, IconShare, IconSharedDcmt, IconShow, IconSignaturePencil, IconStar, IconSubstFile, IconUndo, IconUnpair, IconUserGroupOutline, isConvertibleToPdfExt, isPdfEditorAvailable, S4T_USER_REGISTRY_MASTER, SDKUI_Globals, SDKUI_Localizator, searchResultToMetadataValues, TMImageLibrary, IconCertificateBadge, IconArchiveMultipleDetailDocuments } from '../helper';
25
25
  import { isXMLFileExt } from "../helper/dcmtsHelper";
26
26
  import TMCopyToFolderForm from "../components/features/documents/TMCopyToFolderForm";
27
27
  import TMMergeToPdfForm from "../components/features/documents/TMMergeToPdfForm";
28
+ import TMMultiMasterDetailDcmtsForm from "../components/features/documents/TMMultiMasterDetailDcmtsForm";
28
29
  export const getSelectedDcmtsOrFocused = (selectedItems, focusedItem, fileFormat) => {
29
30
  if (selectedItems.length <= 0 && !focusedItem)
30
31
  return [];
@@ -170,6 +171,7 @@ export const useDocumentOperations = (props) => {
170
171
  // State to control modal opening for master/detail documents
171
172
  const [isOpenDetailsModal, setIsOpenDetailsModal] = useState(false);
172
173
  const [isOpenMasterModal, setIsOpenMasterModal] = useState(false);
174
+ const [isOpenMultiDetailModal, setIsOpenMultiDetailModal] = useState(false);
173
175
  const openDetailDcmtsFormHandler = (value) => { setIsOpenDetails(value); };
174
176
  const openMasterDcmtsFormHandler = (value) => { setIsOpenMaster(value); };
175
177
  const openDetailDcmtsModalHandler = (value) => { setIsOpenDetailsModal(value); };
@@ -908,10 +910,18 @@ export const useDocumentOperations = (props) => {
908
910
  id: 'rel-ark-det',
909
911
  icon: _jsx(IconArchiveDetail, {}),
910
912
  name: SDKUI_Localizator.ArchiveDetailDocument,
911
- operationType: 'multiRow',
912
- disabled: canArchiveDetailRelation !== true,
913
+ operationType: 'singleRow',
914
+ disabled: canArchiveDetailRelation !== true || isDisabledForMultiRow(),
913
915
  onClick: async () => await archiveDetailDocuments(selectedDcmtInfos?.[0]?.TID)
914
916
  },
917
+ {
918
+ id: 'multi-detail',
919
+ icon: _jsx(IconArchiveMultipleDetailDocuments, {}),
920
+ name: SDKUI_Localizator.ArchiveMultipleDetailDocuments,
921
+ operationType: 'singleRow',
922
+ disabled: canArchiveDetailRelation !== true || isDisabledForMultiRow(),
923
+ onClick: () => setIsOpenMultiDetailModal(true),
924
+ },
915
925
  {
916
926
  id: 'rel-mst',
917
927
  icon: _jsx(IconDetailDcmts, { transform: 'scale(-1, 1)' }),
@@ -1391,7 +1401,8 @@ export const useDocumentOperations = (props) => {
1391
1401
  onRefreshBlogDatagrid,
1392
1402
  onRefreshPreviewDatagrid
1393
1403
  }, fetchRemoteCertificates: fetchRemoteCertificates, graphometricManager: graphometricManager })) }), (showHistory && dtd && selectedDcmtInfos.length > 0) && _jsx(TMViewHistoryDcmt, { fromDTD: dtd, deviceType: deviceType, inputDcmt: selectedDcmtInfos[0], onClose: hideHistoryCallback, allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers }), (commentFormState.show && selectedDcmtInfos.length > 0) && _jsx(TMBlogCommentForm, { context: { engine: 'SearchEngine', object: { tid: selectedDcmtInfos[0].TID, did: selectedDcmtInfos[0].DID } }, onClose: hideCommentFormCallback, refreshCallback: onRefreshBlog, participants: [], showAttachmentsSection: true, allArchivedDocumentsFileItems: convertSearchResultDescriptorToFileItems(currentSearchResults ?? []), isCommentRequired: commentFormState.isRequired, removeAndEditAttachment: commentFormState.removeAndEditAttachment, selectedAttachmentDid: [Number(selectedDcmtInfos[0].DID)] }), (showCheckoutInformationForm && dtd && selectedDcmtInfos.length > 0) &&
1394
- _jsx(TMDcmtCheckoutInfoForm, { dtdName: dtd.name ?? SDKUI_Localizator.SearchResult, selectedDcmtOrFocused: selectedDcmtInfos[0], onClose: hideCheckoutInformationFormCallback }), isOpenDetailsModal && _jsx(TMModal, { width: "95%", height: "95%", onClose: () => setIsOpenDetailsModal(false), title: SDKUI_Localizator.Relations, children: _jsx(TMMasterDetailDcmts, { ...masterDetailDetailsCommonProps, onBack: () => setIsOpenDetailsModal(false) }) }), _jsx(StyledMultiViewPanel, { "$isVisible": isOpenDetails, children: isOpenDetails && _jsx(TMMasterDetailDcmts, { ...masterDetailDetailsCommonProps, onBack: () => setIsOpenDetails(false) }) }), isOpenMasterModal && _jsx(TMModal, { width: "95%", height: "95%", onClose: () => setIsOpenMasterModal(false), title: SDKUI_Localizator.Relations, children: _jsx(TMMasterDetailDcmts, { ...masterDetailMasterCommonProps, onBack: () => setIsOpenMasterModal(false) }) }), _jsxs(StyledMultiViewPanel, { "$isVisible": isOpenMaster, children: [isOpenMaster && _jsx(TMMasterDetailDcmts, { ...masterDetailMasterCommonProps, onBack: () => setIsOpenMaster(false) }), secondaryMasterDcmts.length > 0 && secondaryMasterDcmts.map((dcmt, index) => {
1404
+ _jsx(TMDcmtCheckoutInfoForm, { dtdName: dtd.name ?? SDKUI_Localizator.SearchResult, selectedDcmtOrFocused: selectedDcmtInfos[0], onClose: hideCheckoutInformationFormCallback }), isOpenDetailsModal && _jsx(TMModal, { width: "95%", height: "95%", onClose: () => setIsOpenDetailsModal(false), title: SDKUI_Localizator.Relations, children: _jsx(TMMasterDetailDcmts, { ...masterDetailDetailsCommonProps, onBack: () => setIsOpenDetailsModal(false) }) }), _jsx(StyledMultiViewPanel, { "$isVisible": isOpenDetails, children: isOpenDetails && _jsx(TMMasterDetailDcmts, { ...masterDetailDetailsCommonProps, onBack: () => setIsOpenDetails(false) }) }), (isOpenMultiDetailModal && dtd) &&
1405
+ _jsx(TMMultiMasterDetailDcmtsForm, { dtd: dtd, masterDcmt: selectedDcmtInfos[0], onClose: () => setIsOpenMultiDetailModal(false), allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers, showDcmtFormSidebar: showDcmtFormSidebar, showTodoDcmtForm: showTodoDcmtForm, openFileUploaderPdfEditor: openFileUploaderPdfEditor, graphometricManager: graphometricManager, editPdfForm: editPdfForm, openS4TViewer: openS4TViewer, showToppyDraggableHelpCenter: showToppyDraggableHelpCenter, toppyHelpCenterUsePortal: toppyHelpCenterUsePortal, fetchRemoteCertificates: fetchRemoteCertificates, onOpenS4TViewerRequest: onOpenS4TViewerRequest, onOpenPdfEditorRequest: onOpenPdfEditorRequest, onReferenceClick: onReferenceClick, onTaskCreateRequest: onTaskCreateRequest, onRefreshAfterAddDcmtToFavs: onRefreshAfterAddDcmtToFavs, onFileOpened: onFileOpened, passToArchiveCallback: passToArchiveCallback, openWGsCopyMoveForm: openWGsCopyMoveForm }), isOpenMasterModal && _jsx(TMModal, { width: "95%", height: "95%", onClose: () => setIsOpenMasterModal(false), title: SDKUI_Localizator.Relations, children: _jsx(TMMasterDetailDcmts, { ...masterDetailMasterCommonProps, onBack: () => setIsOpenMasterModal(false) }) }), _jsxs(StyledMultiViewPanel, { "$isVisible": isOpenMaster, children: [isOpenMaster && _jsx(TMMasterDetailDcmts, { ...masterDetailMasterCommonProps, onBack: () => setIsOpenMaster(false) }), secondaryMasterDcmts.length > 0 && secondaryMasterDcmts.map((dcmt, index) => {
1395
1406
  return (_jsx(StyledModalContainer, { style: { backgroundColor: 'white' }, children: _jsx(TMMasterDetailDcmts, { ...masterDetailMasterCommonProps, inputDcmts: [dcmt], allowNavigation: false, onBack: () => handleRemoveItem(dcmt.TID, dcmt.DID) }) }, `${index}-${dcmt.DID}`));
1396
1407
  })] }), isOpenArchiveRelationForm && _jsx(TMDcmtForm, { isModal: true, titleModal: SDKUI_Localizator.Archive + ' - ' + (archiveType === 'detail' ? SDKUI_Localizator.DcmtsDetail : SDKUI_Localizator.DcmtsMaster), TID: archiveRelatedDcmtFormTID, layoutMode: LayoutModes.Ark, inputMids: archiveRelatedDcmtFormMids, showBackButton: false, allowButtonsRefs: false, onClose: () => {
1397
1408
  setIsOpenArchiveRelationForm(false);
@@ -1456,6 +1467,7 @@ export const useDocumentOperations = (props) => {
1456
1467
  } }))] }));
1457
1468
  return {
1458
1469
  operationItems: operationItems(),
1470
+ selectedDcmtInfos,
1459
1471
  renderFloatingBar,
1460
1472
  renderDcmtOperations,
1461
1473
  features: {