@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.
- package/lib/components/NewComponents/ContextMenu/TMContextMenu.js +1 -1
- package/lib/components/NewComponents/FloatingMenuBar/TMFloatingMenuBar.js +1 -1
- package/lib/components/base/TMDataGrid.d.ts +2 -0
- package/lib/components/base/TMDataGrid.js +68 -4
- package/lib/components/base/TMModal.d.ts +4 -0
- package/lib/components/base/TMModal.js +42 -11
- package/lib/components/features/documents/TMDcmtForm.d.ts +7 -0
- package/lib/components/features/documents/TMDcmtForm.js +94 -40
- package/lib/components/features/documents/TMMasterDetailDcmts.js +88 -30
- package/lib/components/features/documents/TMMasterInfoFields.d.ts +19 -0
- package/lib/components/features/documents/TMMasterInfoFields.js +172 -0
- package/lib/components/features/documents/TMMultiMasterDetailDcmtsForm.d.ts +40 -0
- package/lib/components/features/documents/TMMultiMasterDetailDcmtsForm.js +256 -0
- package/lib/components/features/documents/TMMultiMasterDetailDcmtsUtils.d.ts +352 -0
- package/lib/components/features/documents/TMMultiMasterDetailDcmtsUtils.js +221 -0
- package/lib/components/features/documents/TMRelationViewer.d.ts +14 -1
- package/lib/components/features/documents/TMRelationViewer.js +69 -20
- package/lib/components/features/search/TMSearchResult.d.ts +8 -0
- package/lib/components/features/search/TMSearchResult.js +131 -23
- package/lib/components/layout/panelManager/TMPanelManagerContainer.d.ts +1 -0
- package/lib/components/layout/panelManager/TMPanelManagerContainer.js +24 -14
- package/lib/components/layout/panelManager/TMPanelWrapper.js +2 -2
- package/lib/components/layout/panelManager/types.d.ts +3 -0
- package/lib/helper/SDKUI_Globals.d.ts +34 -0
- package/lib/helper/SDKUI_Globals.js +37 -0
- package/lib/helper/SDKUI_Localizator.d.ts +18 -0
- package/lib/helper/SDKUI_Localizator.js +180 -0
- package/lib/helper/TMIcons.d.ts +1 -0
- package/lib/helper/TMIcons.js +3 -0
- package/lib/helper/dcmtsHelper.d.ts +20 -0
- package/lib/helper/dcmtsHelper.js +58 -1
- package/lib/helper/helpers.d.ts +9 -0
- package/lib/helper/helpers.js +8 -0
- package/lib/hooks/useArchiveListForm.d.ts +39 -0
- package/lib/hooks/useArchiveListForm.js +46 -0
- package/lib/hooks/useDocumentOperations.d.ts +1 -0
- package/lib/hooks/useDocumentOperations.js +16 -4
- package/lib/hooks/useMultiMasterDetailDcmts.d.ts +97 -0
- package/lib/hooks/useMultiMasterDetailDcmts.js +555 -0
- package/lib/hooks/useRelatedDocuments.js +2 -26
- 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";
|
package/lib/helper/TMIcons.d.ts
CHANGED
|
@@ -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;
|
package/lib/helper/TMIcons.js
CHANGED
|
@@ -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) {
|
package/lib/helper/helpers.d.ts
CHANGED
|
@@ -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;
|
package/lib/helper/helpers.js
CHANGED
|
@@ -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: '
|
|
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) }) }),
|
|
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: {
|