@topconsultnpm/sdkui-react 6.22.0-dev3.9 → 6.22.0-dev4.3
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/base/TMAlert.js +6 -8
- package/lib/components/base/TMAreaManager.js +53 -55
- package/lib/components/base/TMButton.js +4 -2
- package/lib/components/base/TMCustomButton.js +40 -48
- package/lib/components/base/TMDataGrid.js +219 -219
- package/lib/components/base/TMPanel.js +173 -170
- package/lib/components/base/TMSpinner.d.ts +2 -1
- package/lib/components/base/TMSpinner.js +9 -7
- package/lib/components/base/TMTabControl.d.ts +5 -0
- package/lib/components/base/TMTabControl.js +18 -7
- package/lib/components/base/TMTreeView.js +20 -0
- package/lib/components/base/TMWaitPanel.js +1 -1
- package/lib/components/base/waitPanel/TMWaitPanelConfirm.d.ts +12 -0
- package/lib/components/base/waitPanel/TMWaitPanelConfirm.js +185 -0
- package/lib/components/base/waitPanel/TMWaitPanelManager.d.ts +169 -0
- package/lib/components/base/waitPanel/TMWaitPanelManager.js +320 -0
- package/lib/components/base/waitPanel/TMWaitPanelView.d.ts +53 -0
- package/lib/components/base/waitPanel/TMWaitPanelView.js +274 -0
- package/lib/components/base/waitPanel/index.d.ts +1 -0
- package/lib/components/base/waitPanel/index.js +1 -0
- package/lib/components/choosers/TMPathChooser.js +17 -34
- package/lib/components/editors/TMTextBox.d.ts +4 -0
- package/lib/components/editors/TMTextBox.js +99 -11
- package/lib/components/features/archive/TMArchive.js +7 -2
- package/lib/components/features/assistant/TMHelpOnLineChat.d.ts +29 -0
- package/lib/components/features/assistant/TMHelpOnLineChat.js +1384 -0
- package/lib/components/features/assistant/TMToppyDraggableHelpCenter.js +2 -2
- package/lib/components/features/assistant/dataset/Designer-Suggested-Questions.json +102 -0
- package/lib/components/features/assistant/dataset/Login-Suggested-Questions.json +32 -0
- package/lib/components/features/assistant/dataset/Surfer-Suggested-Questions.json +102 -0
- package/lib/components/features/documents/TMBatchUpdateForm.js +3 -4
- package/lib/components/features/documents/TMCopyToFolderForm.js +53 -84
- package/lib/components/features/documents/TMDcmtForm.js +50 -61
- package/lib/components/features/documents/TMDcmtIcon.d.ts +1 -3
- package/lib/components/features/documents/TMDcmtIcon.js +3 -5
- package/lib/components/features/documents/TMDcmtPreview.js +5 -3
- package/lib/components/features/documents/TMDcmtTasks.js +2 -9
- package/lib/components/features/documents/TMFileUploader.js +26 -26
- package/lib/components/features/documents/TMMasterDetailDcmts.d.ts +2 -0
- package/lib/components/features/documents/TMMasterDetailDcmts.js +53 -148
- package/lib/components/features/documents/TMMasterInfoFields.js +3 -2
- package/lib/components/features/documents/TMMergeToPdfForm.js +49 -54
- package/lib/components/features/documents/TMMultiMasterDetailDcmtsForm.js +14 -15
- package/lib/components/features/documents/TMMultiMasterDetailDcmtsUtils.d.ts +1 -1
- package/lib/components/features/documents/TMMultiMasterDetailDcmtsUtils.js +3 -3
- package/lib/components/features/documents/TMRelationViewer.d.ts +13 -14
- package/lib/components/features/documents/TMRelationViewer.js +206 -143
- package/lib/components/features/documents/relationTreeState.d.ts +32 -0
- package/lib/components/features/documents/relationTreeState.js +89 -0
- package/lib/components/features/search/TMSearch.js +3 -4
- package/lib/components/features/search/TMSearchQueryPanel.js +0 -4
- package/lib/components/features/search/TMSearchResult.d.ts +5 -0
- package/lib/components/features/search/TMSearchResult.js +39 -19
- package/lib/components/features/search/TMTreeSelector.js +23 -27
- package/lib/components/features/search/TMViewHistoryDcmt.js +14 -25
- package/lib/components/features/tasks/TMTasksView.js +91 -90
- package/lib/components/features/wg/TMWGsCopyMoveForm.js +91 -91
- package/lib/components/forms/TMResultDialog.js +1 -1
- package/lib/components/grids/TMBlogsPost.js +92 -96
- package/lib/components/index.d.ts +5 -1
- package/lib/components/index.js +4 -1
- package/lib/components/layout/panelManager/TMPanelManagerContainer.js +16 -15
- package/lib/components/layout/panelManager/TMPanelManagerContext.d.ts +1 -0
- package/lib/components/layout/panelManager/TMPanelManagerContext.js +5 -1
- package/lib/components/layout/panelManager/TMPanelManagerLoader.d.ts +6 -0
- package/lib/components/layout/panelManager/TMPanelManagerLoader.js +18 -0
- package/lib/components/layout/panelManager/TMPanelManagerToolbar.js +4 -8
- package/lib/components/layout/panelManager/TMPanelManagerWithPersistenceProvider.d.ts +1 -1
- package/lib/components/layout/panelManager/TMPanelManagerWithPersistenceProvider.js +2 -1
- package/lib/components/pages/TMPage.js +29 -31
- package/lib/components/query/TMQueryEditor.d.ts +3 -0
- package/lib/components/query/TMQueryEditor.js +2 -1
- package/lib/components/sidebar/TMHeader.d.ts +1 -0
- package/lib/components/sidebar/TMHeader.js +2 -2
- package/lib/helper/Enum_Localizator.js +1 -0
- package/lib/helper/SDKUI_Globals.d.ts +3 -0
- package/lib/helper/SDKUI_Globals.js +3 -0
- package/lib/helper/SDKUI_Localizator.d.ts +21 -0
- package/lib/helper/SDKUI_Localizator.js +210 -0
- package/lib/helper/ZipManager.d.ts +1 -1
- package/lib/helper/ZipManager.js +2 -1
- package/lib/helper/dcmtsHelper.d.ts +2 -0
- package/lib/helper/dcmtsHelper.js +3 -1
- package/lib/hooks/useCheckInOutOperations.d.ts +0 -6
- package/lib/hooks/useCheckInOutOperations.js +14 -34
- package/lib/hooks/useDcmtOperations.d.ts +3 -19
- package/lib/hooks/useDcmtOperations.js +160 -222
- package/lib/hooks/useDocumentOperations.d.ts +1 -0
- package/lib/hooks/useDocumentOperations.js +14 -25
- package/lib/hooks/useMultiMasterDetailDcmts.d.ts +0 -15
- package/lib/hooks/useMultiMasterDetailDcmts.js +65 -67
- package/lib/hooks/usePreventFileDrop.js +9 -0
- package/lib/hooks/useWorkflowApprove.js +33 -17
- package/lib/services/caseflow/CaseFlowService.d.ts +36 -6
- package/lib/services/caseflow/CaseFlowService.js +55 -14
- package/package.json +69 -69
|
@@ -60,7 +60,7 @@ const TMToppyButton = styled.div.attrs((props) => ({
|
|
|
60
60
|
height: ${(props) => props.$isCollapsed ? '56px' : '110px'};
|
|
61
61
|
max-width: 100%;
|
|
62
62
|
max-height: 100%;
|
|
63
|
-
z-index:
|
|
63
|
+
z-index: 2147483600;
|
|
64
64
|
background-color: ${(props) => props.$isCollapsed ? '#ffffff' : 'transparent'};
|
|
65
65
|
border: ${(props) => props.$isCollapsed ? '3px solid #3b82f6' : 'none'};
|
|
66
66
|
border-radius: ${(props) => props.$isCollapsed ? '50%' : '0'};
|
|
@@ -130,7 +130,7 @@ const DragOverlay = styled.div `
|
|
|
130
130
|
left: 0;
|
|
131
131
|
right: 0;
|
|
132
132
|
bottom: 0;
|
|
133
|
-
z-index:
|
|
133
|
+
z-index: 2147483599;
|
|
134
134
|
cursor: grabbing;
|
|
135
135
|
`;
|
|
136
136
|
const TMToppyDraggableHelpCenter = (props) => {
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
[
|
|
2
|
+
"Come metto un tipo documento dentro un albero?",
|
|
3
|
+
"Perché l'area di appoggio non mostra i file?",
|
|
4
|
+
"Che differenza c'è fra uno a molti e molti a molti?",
|
|
5
|
+
"A che servono i tre pulsanti della pagina certificati?",
|
|
6
|
+
"Che differenza c'è fra firma e marca temporale?",
|
|
7
|
+
"Posso cambiare il percorso di un disco?",
|
|
8
|
+
"Come esporto la configurazione?",
|
|
9
|
+
"Che differenza c'è fra la finestra dell'errore e il contatore rosso?",
|
|
10
|
+
"Ho archiviato un documento ma la ricerca libera non lo trova, perché?",
|
|
11
|
+
"Perché un gruppo non ha l'elenco degli utenti?",
|
|
12
|
+
"Come importo una configurazione?",
|
|
13
|
+
"Perché il cestino è grigio nei server LDAP?",
|
|
14
|
+
"Cosa succede ai documenti se elimino un valore di una lista dati?",
|
|
15
|
+
"Perché il cestino è grigio nei server di marca temporale?",
|
|
16
|
+
"Cosa sono i parametri fra parentesi graffe?",
|
|
17
|
+
"Come impedisco di riusare le vecchie password?",
|
|
18
|
+
"Perché la griglia dei permessi è vuota?",
|
|
19
|
+
"Che differenza c'è fra Direct e LoadBalance?",
|
|
20
|
+
"Quali campi ha un tipo serbatoio?",
|
|
21
|
+
"Come capisco se un utente sta davvero lavorando?",
|
|
22
|
+
"Perché il cestino è grigio nei server di firma?",
|
|
23
|
+
"Come aggiungo un campo a un tipo documento?",
|
|
24
|
+
"Quanti documenti ci sono in archivio?",
|
|
25
|
+
"A che serve «Usa autenticazione sicura» su un utente?",
|
|
26
|
+
"In che formato vengono mostrate le fatture elettroniche?",
|
|
27
|
+
"Come definisco quali documenti entrano in una vista?",
|
|
28
|
+
"Dove trovo la vista approvativa di un workflow?",
|
|
29
|
+
"Perché salva è grigio negli alberi?",
|
|
30
|
+
"Perché salva è grigio nelle aree di appoggio?",
|
|
31
|
+
"Perché la correlazione funziona solo in un verso?",
|
|
32
|
+
"Perché la firma non riesce pur essendo tutto compilato?",
|
|
33
|
+
"Perché non riesco a creare il certificato?",
|
|
34
|
+
"Che differenza c'è fra disco e area di appoggio?",
|
|
35
|
+
"Come esporto un tipo documento con tutto ciò che gli serve?",
|
|
36
|
+
"Che cosa vuol dire «Proseguendo le modifiche apportate andranno perse»?",
|
|
37
|
+
"A che serve la coda della ricerca full text?",
|
|
38
|
+
"Come metto una persona in un gruppo?",
|
|
39
|
+
"Come importo un tipo documento che usa liste dati che qui non esistono?",
|
|
40
|
+
"Dove metto utente e password del dominio?",
|
|
41
|
+
"Perché salva è grigio nelle liste dati?",
|
|
42
|
+
"Posso usare un certificatore diverso dai tre proposti?",
|
|
43
|
+
"Come faccio ripartire il protocollo da 1 ogni anno?",
|
|
44
|
+
"Come faccio scadere le password?",
|
|
45
|
+
"Cosa vuol dire autorizzato e non autorizzato?",
|
|
46
|
+
"Che cos'è un «Login SAP» e a che cosa serve?",
|
|
47
|
+
"Perché salva è grigio nei tipi serbatoio?",
|
|
48
|
+
"Dove trovo l'ID di sessione da dare all'assistenza?",
|
|
49
|
+
"Quali campi ha un server di firma?",
|
|
50
|
+
"Dove finiscono i file di questo tipo documento?",
|
|
51
|
+
"Quanti documenti sono senza file?",
|
|
52
|
+
"Ho creato un utente ma non vede niente, perché?",
|
|
53
|
+
"Perché il link di un documento non funziona?",
|
|
54
|
+
"Perché la stessa vista mostra cose diverse a persone diverse?",
|
|
55
|
+
"Che differenza c'è fra partecipante e responsabile?",
|
|
56
|
+
"Che cos'è un albero e a che cosa serve?",
|
|
57
|
+
"Che cos'è un'area di appoggio e a che cosa serve?",
|
|
58
|
+
"Perché dice «nessuna proprietà da definire»?",
|
|
59
|
+
"A che cosa servono «OTP Provider» e «OTP ID» del certificato?",
|
|
60
|
+
"Come aggiungo spazio all'archivio?",
|
|
61
|
+
"Perché dopo l'importazione i gruppi non vedono nulla?",
|
|
62
|
+
"Perché a volte è «Campo Obbligatorio» con la maiuscola?",
|
|
63
|
+
"Perché questo gruppo non si lascia modificare?",
|
|
64
|
+
"Devo importare tutto il file?",
|
|
65
|
+
"Perché salva è grigio nel server LDAP?",
|
|
66
|
+
"Che cos'è una lista dati e a che cosa serve?",
|
|
67
|
+
"Perché salva è grigio nel server di marca temporale?",
|
|
68
|
+
"Perché il numeratore dà sempre lo stesso numero?",
|
|
69
|
+
"A cosa servono i tre puntini nella cella dei permessi?",
|
|
70
|
+
"Dove si configura il collegamento a SAP?",
|
|
71
|
+
"Che differenza c'è fra serbatoio, disco e area di appoggio?",
|
|
72
|
+
"Quali colonne ha l'elenco delle sessioni?",
|
|
73
|
+
"Dove si configura il servizio che manda il codice OTP?",
|
|
74
|
+
"Che differenza c'è fra chiave primaria e indice univoco?",
|
|
75
|
+
"Perché un utente non riesce più ad accedere?",
|
|
76
|
+
"Come faccio vedere un documento a chi non ha un'utenza?",
|
|
77
|
+
"Perché la linguetta «Metadati» di un tipo documento è obbligatoria?",
|
|
78
|
+
"Perché la modifica al workflow non ha effetto?",
|
|
79
|
+
"Perché non riesco a salvare un albero nuovo?",
|
|
80
|
+
"Quali campi servono per un'area di appoggio?",
|
|
81
|
+
"Come risolvo l'errore sulla seconda query di una correlazione?",
|
|
82
|
+
"Perché salva è grigio nel certificato di firma?",
|
|
83
|
+
"Cosa succede ai documenti se elimino il disco?",
|
|
84
|
+
"Dove cambio il nome del file di esportazione?",
|
|
85
|
+
"Perché il salvataggio riesce ma l'oggetto non funziona?",
|
|
86
|
+
"Che cos'è un gruppo e perché i permessi si danno ai gruppi?",
|
|
87
|
+
"Perché non vedo il pulsante delle opzioni di importazione?",
|
|
88
|
+
"Che cos'è un server LDAP?",
|
|
89
|
+
"Perché la lista nuova non compare da nessuna parte?",
|
|
90
|
+
"Che cos'è un server di marca temporale?",
|
|
91
|
+
"Che cos'è un numeratore e a che cosa serve?",
|
|
92
|
+
"Perché non trovo l'oggetto nella griglia dei permessi?",
|
|
93
|
+
"Posso recuperare un profilo eliminato?",
|
|
94
|
+
"Dove si creano i tipi serbatoio?",
|
|
95
|
+
"Come faccio uscire qualcuno dall'applicazione?",
|
|
96
|
+
"Come provo che un server di firma funzioni?",
|
|
97
|
+
"Che cosa sono le opzioni del tipo documento?",
|
|
98
|
+
"Che cos'è il numero rosso nella scheda?",
|
|
99
|
+
"In che lingua vede il documento chi riceve il link?",
|
|
100
|
+
"Perché una vista ha meno opzioni di un tipo documento?",
|
|
101
|
+
"Che differenza c'è fra errore e avviso?"
|
|
102
|
+
]
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
[
|
|
2
|
+
"Che cos'è la schermata di accesso?",
|
|
3
|
+
"Quanti passaggi servono per entrare e come torno indietro?",
|
|
4
|
+
"Che cos'è il punto di accesso?",
|
|
5
|
+
"Come verifico che il punto di accesso risponda?",
|
|
6
|
+
"Che cos'è l'archivio documentale che mi viene chiesto?",
|
|
7
|
+
"Come si sceglie da un elenco a tendina o a finestra?",
|
|
8
|
+
"Quali sono le cinque modalità di autenticazione?",
|
|
9
|
+
"A che cosa servono i campi nome utente e password?",
|
|
10
|
+
"Che cos'è l'accesso «per conto di»?",
|
|
11
|
+
"Quali campi sono obbligatori per accedere?",
|
|
12
|
+
"Quali controlli ci sono sul cambio e sul recupero della password?",
|
|
13
|
+
"Che cos'è l'autenticazione a più fattori?",
|
|
14
|
+
"Come si compilano le sei caselle del codice?",
|
|
15
|
+
"Quali comandi ho accanto alle caselle del codice?",
|
|
16
|
+
"Come ottengo il codice per posta elettronica o da applicazione?",
|
|
17
|
+
"Quando compaiono «Cambia password» e «Password dimenticata»?",
|
|
18
|
+
"Come si cambia la password dalla schermata di accesso?",
|
|
19
|
+
"Ho dimenticato la password, come la recupero?",
|
|
20
|
+
"Quali requisiti deve avere la nuova password?",
|
|
21
|
+
"Che cosa sono gli accessi rapidi?",
|
|
22
|
+
"Come creo un accesso rapido prima di entrare?",
|
|
23
|
+
"Com'è fatto il pannello degli accessi rapidi?",
|
|
24
|
+
"Come personalizzo nome, icona e colore di un accesso rapido?",
|
|
25
|
+
"Come esporto e importo gli accessi rapidi?",
|
|
26
|
+
"Come cambio la lingua della schermata di accesso?",
|
|
27
|
+
"Quali versioni sono indicate nella schermata?",
|
|
28
|
+
"Che cosa vogliono dire i messaggi della schermata di accesso?",
|
|
29
|
+
"L'accesso non riesce: come capisco il motivo?",
|
|
30
|
+
"Come accedo a TopMedia da telefono?",
|
|
31
|
+
"La password nuova non viene accettata, perché?"
|
|
32
|
+
]
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
[
|
|
2
|
+
"Che cos'è l'Archiviazione?",
|
|
3
|
+
"Che cosa succede facendo clic su un risultato?",
|
|
4
|
+
"Che cosa significa tipo documento?",
|
|
5
|
+
"Che cosa sono i metadati di output?",
|
|
6
|
+
"Che cosa cambia negli elenchi e nelle finestre su Mobile?",
|
|
7
|
+
"Che cos'è la ricerca naturale?",
|
|
8
|
+
"Come effettuo una ricerca?",
|
|
9
|
+
"Come apro la sezione Ricerca?",
|
|
10
|
+
"Dove trovo i tipi documento in archiviazione?",
|
|
11
|
+
"A cosa servono i metadati?",
|
|
12
|
+
"Che cos'è un filtro di ricerca?",
|
|
13
|
+
"Come si apre la ricerca naturale?",
|
|
14
|
+
"In quale sezione di Surfer si cercano i documenti?",
|
|
15
|
+
"Che cos'è la ricerca avanzata?",
|
|
16
|
+
"Posso vedere il contenuto del file che sto archiviando?",
|
|
17
|
+
"A cosa serve il tipo documento?",
|
|
18
|
+
"Quali operatori di ricerca esistono?",
|
|
19
|
+
"Come evito errori di battitura?",
|
|
20
|
+
"Che cos'è la scheda del documento?",
|
|
21
|
+
"Devo convertire il file prima di archiviarlo?",
|
|
22
|
+
"Che cosa sono i metadati?",
|
|
23
|
+
"Che cos'è l'ordinamento del risultato?",
|
|
24
|
+
"Come cerco documenti di un certo periodo?",
|
|
25
|
+
"Come vengono nominati i file copiati?",
|
|
26
|
+
"Come scelgo il tipo documento da archiviare?",
|
|
27
|
+
"Che cos'è la ricerca per metadati?",
|
|
28
|
+
"Come cerco i documenti di oggi?",
|
|
29
|
+
"Che cos'è l'editor delle formule?",
|
|
30
|
+
"Dove metto il file da archiviare?",
|
|
31
|
+
"Che cos'è un documento in Surfer?",
|
|
32
|
+
"Come personalizzo i pannelli della ricerca?",
|
|
33
|
+
"Come si apre il pannello «Impostazioni» e come è fatto?",
|
|
34
|
+
"Come archivio una fattura elettronica?",
|
|
35
|
+
"Cosa vuol dire prendere in carico un documento?",
|
|
36
|
+
"Come aggiungo una colonna al risultato?",
|
|
37
|
+
"Che cosa vedo dopo la ricerca?",
|
|
38
|
+
"Che cosa sono i documenti master e dettaglio?",
|
|
39
|
+
"Come ordino cliccando sulla colonna?",
|
|
40
|
+
"Che cosa sono i metadati di sistema?",
|
|
41
|
+
"Come non reimposto ogni volta i filtri?",
|
|
42
|
+
"Come riconosco il tipo di dato di un metadato?",
|
|
43
|
+
"Perché non posso modificare la ricerca?",
|
|
44
|
+
"Che cos'è una vista e perché è scritta in rosso?",
|
|
45
|
+
"Come unisco due ricerche?",
|
|
46
|
+
"Che cos'è Toppy e in quanti modi compare nella Ricerca?",
|
|
47
|
+
"Come scarico un documento?",
|
|
48
|
+
"A cosa serve il check out?",
|
|
49
|
+
"Come elimino un documento dall'archivio?",
|
|
50
|
+
"Come prendo in carico un documento?",
|
|
51
|
+
"Come esporto i risultati?",
|
|
52
|
+
"Come metto un documento tra i preferiti?",
|
|
53
|
+
"Come aggiorno i risultati?",
|
|
54
|
+
"Dove sono finiti i documenti che avevo trovato?",
|
|
55
|
+
"Come faccio a rivedere le ricerche rapide?",
|
|
56
|
+
"Come scelgo il tipo documento dall'albero?",
|
|
57
|
+
"Come cambio l'albero che si apre all'inizio?",
|
|
58
|
+
"Come pulisco l'elenco delle scorciatoie?",
|
|
59
|
+
"Come filtro l'elenco dei tipi documento?",
|
|
60
|
+
"Perché non posso eliminare una ricerca?",
|
|
61
|
+
"Come faccio partire sempre la stessa ricerca?",
|
|
62
|
+
"Come richiamo una ricerca dalla pagina iniziale?",
|
|
63
|
+
"Come annullo le modifiche ai filtri?",
|
|
64
|
+
"Come aggiungo un campo di ricerca che non c'è?",
|
|
65
|
+
"Come scelgo quali colonne vedere nel risultato?",
|
|
66
|
+
"Come stabilisco la priorità dell'ordinamento?",
|
|
67
|
+
"Come faccio partire subito una ricerca salvata?",
|
|
68
|
+
"Come aggiungo un comando alla barra flottante?",
|
|
69
|
+
"Come leggo il documento senza aprirlo?",
|
|
70
|
+
"Come trovo un documento nei risultati?",
|
|
71
|
+
"Come tolgo una colonna dalla vista?",
|
|
72
|
+
"Come sostituisco il file?",
|
|
73
|
+
"Come firmo un documento?",
|
|
74
|
+
"Come trasformo un documento in pdf?",
|
|
75
|
+
"Come cambio un valore su tanti documenti?",
|
|
76
|
+
"Come trovo il documento principale?",
|
|
77
|
+
"Come collego due documenti?",
|
|
78
|
+
"Come archivio un documento simile?",
|
|
79
|
+
"Come tengo aperta l'anteprima?",
|
|
80
|
+
"Come faccio vedere l'anteprima dei file grandi?",
|
|
81
|
+
"Come copio i file in una cartella?",
|
|
82
|
+
"Come unisco più documenti?",
|
|
83
|
+
"Perché la ricerca full text non lo trova?",
|
|
84
|
+
"Come tolgo un documento dal gruppo di lavoro?",
|
|
85
|
+
"Chi ha preso il documento in passato?",
|
|
86
|
+
"Dove vedo i documenti condivisi?",
|
|
87
|
+
"Come assegno un compito su un documento?",
|
|
88
|
+
"Come scarico gli allegati di una fattura?",
|
|
89
|
+
"Come scarico la lista dei documenti?",
|
|
90
|
+
"Come cambio i dati di un documento?",
|
|
91
|
+
"Come archivio partendo da una ricerca?",
|
|
92
|
+
"Come faccio una ricerca complessa?",
|
|
93
|
+
"Perché il risultato non è quello che mi aspetto?",
|
|
94
|
+
"Come cerco una parola dentro i documenti?",
|
|
95
|
+
"Come chiedo a Toppy di trovare un documento?",
|
|
96
|
+
"Come copio i dati della firma?",
|
|
97
|
+
"Chi ha modificato il documento e quando?",
|
|
98
|
+
"Come risalgo dalla fattura all'ordine?",
|
|
99
|
+
"Come imposto una ricerca per trovare un documento?",
|
|
100
|
+
"Dove si cercano i documenti di un certo tipo?",
|
|
101
|
+
"Come vedo la cronologia dei check out di un documento?"
|
|
102
|
+
]
|
|
@@ -6,11 +6,10 @@ import { useDcmtOperations } from '../../../hooks/useDcmtOperations';
|
|
|
6
6
|
import { DcmtOperationTypes, FormModes } from '../../../ts';
|
|
7
7
|
import { StyledToolbarCardContainer, StyledFormButtonsContainer } from '../../base/Styled';
|
|
8
8
|
import { useDeviceType, DeviceType } from '../../base/TMDeviceProvider';
|
|
9
|
-
import { TMSplitterLayout } from '../../base/TMLayout';
|
|
9
|
+
import TMLayoutContainer, { TMSplitterLayout } from '../../base/TMLayout';
|
|
10
10
|
import { TMExceptionBoxManager, TMMessageBoxManager, ButtonNames } from '../../base/TMPopUp';
|
|
11
11
|
import TMShowAllOrMaxItemsButton from '../../base/TMShowAllOrMaxItemsButton';
|
|
12
12
|
import TMSpinner from '../../base/TMSpinner';
|
|
13
|
-
import { TMLayoutWaitingContainer } from '../../base/TMWaitPanel';
|
|
14
13
|
import TMDistinctValues from '../../choosers/TMDistinctValues';
|
|
15
14
|
import TMFormulaEditor, { FormulaDescriptor, FormulaHelper, FormulaTargets } from '../../editors/TMFormulaEditor';
|
|
16
15
|
import { useMetadataEditableList } from '../../editors/TMMetadataEditor';
|
|
@@ -28,7 +27,7 @@ const TMBatchUpdateForm = ({ inputDcmts, TID, DID, isExpertMode = SDKUI_Globals.
|
|
|
28
27
|
const [showFormulaEditor, setShowFormulaEditor] = useState(false);
|
|
29
28
|
const [focusedMetadataValue, setFocusedMetadataValue] = useState();
|
|
30
29
|
const [addOrRemoveEditableList] = useMetadataEditableList();
|
|
31
|
-
const {
|
|
30
|
+
const { runOperationAsync } = useDcmtOperations();
|
|
32
31
|
const deviceType = useDeviceType();
|
|
33
32
|
useEffect(() => {
|
|
34
33
|
if (!TID)
|
|
@@ -131,7 +130,7 @@ const TMBatchUpdateForm = ({ inputDcmts, TID, DID, isExpertMode = SDKUI_Globals.
|
|
|
131
130
|
});
|
|
132
131
|
};
|
|
133
132
|
const renderContent = () => {
|
|
134
|
-
return (_jsx(
|
|
133
|
+
return (_jsx(TMLayoutContainer, { children: _jsxs(TMSplitterLayout, { direction: 'horizontal', overflow: 'visible', separatorSize: Gutters.getGutters(), separatorColor: 'transparent', separatorActiveColor: 'transparent', showSeparator: showFormulaEditor, start: showFormulaEditor ? ['50%', '50%'] : ['100%', '0%'], min: ['0', '0'], children: [_jsx(TMPanel, { title: isModal ? 'Modifica i metadati' : `${SDKUI_Localizator.BatchUpdate} (${inputDcmts.length} documenti selezionati)`, onBack: deviceType === DeviceType.MOBILE ? handleClose : undefined, allowMaximize: !isModal, showHeader: !isModal, children: _jsxs(StyledToolbarCardContainer, { children: [_jsx(TMMetadataValues, { TID: TID, isExpertMode: isExpertMode, showCheckBoxes: ShowCheckBoxesMode.Always, showNullValueCheckBoxes: true, metadataValues: metadataValuesSource, metadataValuesOrig: metadataValuesSourceOrig, validationItems: validationItems, isOpenDistinctValues: showDistinctValuesPanel, selectedMID: focusedMetadataValue?.mid, onFocusedItemChanged: (item) => { setFocusedMetadataValue(item); }, onValueChanged: (newItems) => {
|
|
135
134
|
setMetadataValues((prevItems) => prevItems.map((item) => {
|
|
136
135
|
const newItem = newItems.find((newItem) => newItem.tid === item.tid && newItem.mid === item.mid);
|
|
137
136
|
return newItem ? { ...item, ...newItem } : item;
|
|
@@ -13,36 +13,26 @@ import TMOrderRetrieveFormats from '../../choosers/TMOrderRetrieveFormats';
|
|
|
13
13
|
import TMButton from '../../base/TMButton';
|
|
14
14
|
import { ButtonNames, TMMessageBoxManager } from '../../base/TMPopUp';
|
|
15
15
|
import { useDcmtOperations } from '../../../hooks/useDcmtOperations';
|
|
16
|
-
import { TMLayoutWaitingContainer } from '../../base/TMWaitPanel';
|
|
17
16
|
import { TMSplitterLayout } from '../../base/TMLayout';
|
|
17
|
+
import TMWaitPanelManager from '../../base/waitPanel/TMWaitPanelManager';
|
|
18
18
|
import TMCheckBox from '../../editors/TMCheckBox';
|
|
19
19
|
import ShowAlert from '../../base/TMAlert';
|
|
20
20
|
import { TMColors } from '../../../utils/theme';
|
|
21
21
|
import TMDownloadRelationViewerSection from './TMDownloadRelationViewerSection';
|
|
22
22
|
import { buildInitialDownloadSettings, fileExists, generateTargetFileName, generateUniqueFileName, getDcmtInfosToDownload, getFloatingLabelStyle, isDirectoryPickerSupported, } from './copyAndMergeDcmtsShared';
|
|
23
|
-
/**
|
|
24
|
-
* Numero di documenti scaricati in parallelo.
|
|
25
|
-
* I file vengono consumati via callback (scrittura su cartella o raccolta per lo ZIP),
|
|
26
|
-
* quindi il parallelismo è sicuro; l'ordine finale è garantito a valle del download.
|
|
27
|
-
*/
|
|
28
|
-
const COPY_DOWNLOAD_CONCURRENCY = 5;
|
|
29
23
|
/**
|
|
30
24
|
* Form per la copia/zip dei documenti in una cartella locale.
|
|
31
25
|
* Logica condivisa con TMMergeToPdfForm è esternalizzata in copyAndMergeDcmtsShared
|
|
32
26
|
* e TMDownloadRelationViewerSection.
|
|
33
27
|
*/
|
|
34
28
|
const TMCopyToFolderForm = ({ mode, selectedDcmtInfos, onClose, showTMRelationViewer, allTasks, getAllTasks, deleteTaskByIdsCallback, addTaskCallback, editTaskCallback, handleNavigateToWGs, handleNavigateToDossiers }) => {
|
|
35
|
-
|
|
29
|
+
// Il wait panel del download lo apre e lo aggiorna l'hook: qui serve solo la funzione.
|
|
30
|
+
const { downloadDcmtsAsync } = useDcmtOperations();
|
|
36
31
|
// Get the current device type (e.g., mobile, tablet, desktop) using a custom hook.
|
|
37
32
|
const deviceType = useDeviceType();
|
|
38
33
|
// ---- Stato dei settings ----
|
|
39
34
|
const [settings, setSettings] = useState(() => buildInitialDownloadSettings(SDKUI_Globals.userSettings.documentDownloadSettings, SDKUI_Globals.userSettings.searchSettings.invoiceRetrieveFormat, SDKUI_Globals.userSettings.searchSettings.orderRetrieveFormat));
|
|
40
35
|
const [selectedItemsRelationViewer, setSelectedItemsRelationViewer] = useState([]);
|
|
41
|
-
// ---- Stato per la creazione ZIP (spinner separato) ----
|
|
42
|
-
const [isCreatingZip, setIsCreatingZip] = useState(false);
|
|
43
|
-
const [zipProgressText, setZipProgressText] = useState('');
|
|
44
|
-
const [zipProgressValue, setZipProgressValue] = useState(0);
|
|
45
|
-
const [zipProgressMax, setZipProgressMax] = useState(0);
|
|
46
36
|
const [hasSavedLayout, setHasSavedLayout] = useState(() => {
|
|
47
37
|
const saved = SDKUI_Globals.userSettings.documentDownloadSettings;
|
|
48
38
|
const defaults = new DocumentDownloadSettings();
|
|
@@ -117,23 +107,9 @@ const TMCopyToFolderForm = ({ mode, selectedDcmtInfos, onClose, showTMRelationVi
|
|
|
117
107
|
const handleSeparatorChange = (e) => {
|
|
118
108
|
updateSettings('separatorChar', e.target.value.slice(0, 1));
|
|
119
109
|
};
|
|
120
|
-
// ---- Serializzazione delle scritture su filesystem ----
|
|
121
|
-
// I download sono paralleli, le scritture no: fileExists/generateUniqueFileName/
|
|
122
|
-
// getFileHandle sono check-then-act sulla stessa cartella e due scritture contemporanee
|
|
123
|
-
// potrebbero sovrascriversi o calcolare lo stesso nome "univoco".
|
|
124
|
-
const writeChainRef = useRef(Promise.resolve());
|
|
125
|
-
const runExclusive = (action) => {
|
|
126
|
-
const result = writeChainRef.current.then(action);
|
|
127
|
-
// La catena non deve interrompersi se una scrittura fallisce: l'errore viene
|
|
128
|
-
// comunque propagato al chiamante tramite il promise restituito.
|
|
129
|
-
writeChainRef.current = result.catch(() => undefined);
|
|
130
|
-
return result;
|
|
131
|
-
};
|
|
132
110
|
// ---- Scrittura file nel filesystem locale ----
|
|
133
111
|
const writeFileToFolder = async (file, dcmtInfo) => {
|
|
134
112
|
try {
|
|
135
|
-
// Fuori dal lock: con la denominazione da metadati questa fa una chiamata al
|
|
136
|
-
// server per documento e deve poter andare in parallelo agli altri download.
|
|
137
113
|
const baseFileName = await generateTargetFileName(file, dcmtInfo, {
|
|
138
114
|
fileNamingMode: settings.fileNamingMode,
|
|
139
115
|
separatorChar: settings.separatorChar,
|
|
@@ -152,29 +128,25 @@ const TMCopyToFolderForm = ({ mode, selectedDcmtInfos, onClose, showTMRelationVi
|
|
|
152
128
|
URL.revokeObjectURL(url);
|
|
153
129
|
return;
|
|
154
130
|
}
|
|
155
|
-
// Dentro il lock: controllo esistenza, calcolo del nome univoco e scrittura
|
|
156
|
-
// devono restare un'unica operazione atomica sulla cartella.
|
|
157
131
|
const folderHandle = folderHandleRef.current;
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
break;
|
|
171
|
-
}
|
|
132
|
+
let targetFileName = baseFileName;
|
|
133
|
+
const exists = await fileExists(folderHandle, targetFileName);
|
|
134
|
+
if (exists) {
|
|
135
|
+
switch (settings.fileExistsMode) {
|
|
136
|
+
case 'skip':
|
|
137
|
+
return;
|
|
138
|
+
case 'rename':
|
|
139
|
+
targetFileName = await generateUniqueFileName(folderHandle, targetFileName);
|
|
140
|
+
break;
|
|
141
|
+
case 'overwrite':
|
|
142
|
+
default:
|
|
143
|
+
break;
|
|
172
144
|
}
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
145
|
+
}
|
|
146
|
+
const fileHandle = await folderHandle.getFileHandle(targetFileName, { create: true });
|
|
147
|
+
const writable = await fileHandle.createWritable();
|
|
148
|
+
await writable.write(file);
|
|
149
|
+
await writable.close();
|
|
178
150
|
}
|
|
179
151
|
catch (err) {
|
|
180
152
|
console.error('Errore nella scrittura del file:', err);
|
|
@@ -202,10 +174,7 @@ const TMCopyToFolderForm = ({ mode, selectedDcmtInfos, onClose, showTMRelationVi
|
|
|
202
174
|
retrieveOptions.invoiceRetrieveFormat = settings.invoiceFormat ?? SDKUI_Globals.userSettings.searchSettings.invoiceRetrieveFormat;
|
|
203
175
|
retrieveOptions.orderRetrieveFormat = settings.orderFormat ?? SDKUI_Globals.userSettings.searchSettings.orderRetrieveFormat;
|
|
204
176
|
if (settings.exportMode === 'copy') {
|
|
205
|
-
|
|
206
|
-
// in quel caso si resta sequenziali, perché il browser blocca i click ravvicinati.
|
|
207
|
-
const copyConcurrency = folderHandleRef.current ? COPY_DOWNLOAD_CONCURRENCY : 1;
|
|
208
|
-
await downloadDcmtsAsync({ inputDcmts: dcmtInfosToDownload, downloadType: DownloadTypes.Dcmt, downloadMode: 'download', onFileDownloaded: writeFileToFolder, skipConfirmation: true, retrieveOptions, useCache: false, downloadConcurrency: copyConcurrency });
|
|
177
|
+
await downloadDcmtsAsync({ inputDcmts: dcmtInfosToDownload, downloadType: DownloadTypes.Dcmt, downloadMode: 'download', onFileDownloaded: writeFileToFolder, skipConfirmation: true, retrieveOptions, useCache: false });
|
|
209
178
|
}
|
|
210
179
|
else if (settings.exportMode === 'zip') {
|
|
211
180
|
const fileNameCounts = new Map();
|
|
@@ -220,9 +189,8 @@ const TMCopyToFolderForm = ({ mode, selectedDcmtInfos, onClose, showTMRelationVi
|
|
|
220
189
|
const ext = dotIndex > 0 ? fileName.substring(dotIndex) : '';
|
|
221
190
|
return `${baseName} (${count})${ext}`;
|
|
222
191
|
};
|
|
223
|
-
//
|
|
224
|
-
//
|
|
225
|
-
// nell'ordine di selezione, così i suffissi di deduplica restano quelli sequenziali.
|
|
192
|
+
// I file scaricati si raccolgono in mappa (nome incluso) e l'archivio viene costruito
|
|
193
|
+
// dopo, nell'ordine di selezione, così i suffissi di deduplica restano coerenti.
|
|
226
194
|
const downloadedEntries = new Map();
|
|
227
195
|
const collectFileForZip = async (file, dcmtInfo) => {
|
|
228
196
|
const targetFileName = await generateTargetFileName(file, dcmtInfo, {
|
|
@@ -231,7 +199,7 @@ const TMCopyToFolderForm = ({ mode, selectedDcmtInfos, onClose, showTMRelationVi
|
|
|
231
199
|
});
|
|
232
200
|
downloadedEntries.set(`${dcmtInfo.TID}_${dcmtInfo.DID}`, { file, targetFileName });
|
|
233
201
|
};
|
|
234
|
-
await downloadDcmtsAsync({ inputDcmts: dcmtInfosToDownload, downloadType: DownloadTypes.Dcmt, downloadMode: 'download', onFileDownloaded: collectFileForZip, skipConfirmation: true, retrieveOptions, useCache: false
|
|
202
|
+
await downloadDcmtsAsync({ inputDcmts: dcmtInfosToDownload, downloadType: DownloadTypes.Dcmt, downloadMode: 'download', onFileDownloaded: collectFileForZip, skipConfirmation: true, retrieveOptions, useCache: false });
|
|
235
203
|
const zipEntries = [];
|
|
236
204
|
for (const dcmtInfo of dcmtInfosToDownload) {
|
|
237
205
|
const entry = downloadedEntries.get(`${dcmtInfo.TID}_${dcmtInfo.DID}`);
|
|
@@ -243,18 +211,19 @@ const TMCopyToFolderForm = ({ mode, selectedDcmtInfos, onClose, showTMRelationVi
|
|
|
243
211
|
const zipFileName = settings.zipFileName.trim().toLowerCase().endsWith('.zip')
|
|
244
212
|
? settings.zipFileName.trim()
|
|
245
213
|
: settings.zipFileName.trim() + '.zip';
|
|
246
|
-
// Crea il blob ZIP
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
214
|
+
// Crea il blob ZIP: la compressione non e' interrompibile, quindi niente Interrompi.
|
|
215
|
+
const zipPanel = TMWaitPanelManager.show({
|
|
216
|
+
title: SDKUI_Localizator.CompressToZipFile,
|
|
217
|
+
subtitle: SDKUI_Localizator.CompressToZipFile,
|
|
218
|
+
max: zipEntries.length,
|
|
219
|
+
showCounters: false,
|
|
220
|
+
});
|
|
251
221
|
try {
|
|
252
222
|
const zipBlob = await ZipManager.createZip(zipEntries, {
|
|
253
223
|
compressionLevel: 6,
|
|
254
224
|
password: settings.zipPassword.trim() || undefined,
|
|
255
225
|
onProgress: (current, total, filename) => {
|
|
256
|
-
|
|
257
|
-
setZipProgressText(`${SDKUI_Localizator.CompressToZipFile}: ${filename}`);
|
|
226
|
+
zipPanel.update({ value: current, subtitle: `${SDKUI_Localizator.CompressToZipFile}: ${filename}` });
|
|
258
227
|
},
|
|
259
228
|
});
|
|
260
229
|
// Se c'è un handle della cartella: salva direttamente nella cartella selezionata
|
|
@@ -286,7 +255,7 @@ const TMCopyToFolderForm = ({ mode, selectedDcmtInfos, onClose, showTMRelationVi
|
|
|
286
255
|
ShowAlert({ message: SDKUI_Localizator.Error, mode: 'error', duration: 5000, title: SDKUI_Localizator.CompressToZipFile });
|
|
287
256
|
}
|
|
288
257
|
finally {
|
|
289
|
-
|
|
258
|
+
zipPanel.close();
|
|
290
259
|
}
|
|
291
260
|
}
|
|
292
261
|
}
|
|
@@ -416,25 +385,25 @@ const TMCopyToFolderForm = ({ mode, selectedDcmtInfos, onClose, showTMRelationVi
|
|
|
416
385
|
{ value: 'skip', display: SDKUI_Localizator.DoNotCopy },
|
|
417
386
|
{ value: 'rename', display: SDKUI_Localizator.CopyButRename },
|
|
418
387
|
], value: isUsingDefaultDownloads ? 'rename' : settings.fileExistsMode, direction: "row", disabled: isUsingDefaultDownloads, onValueChanged: (value) => updateSettings('fileExistsMode', value), fontSize: '0.9rem' }) }), isUsingDefaultDownloads && (_jsx("span", { style: { fontSize: '0.8rem', color: '#888', fontStyle: 'italic', marginTop: '4px', display: 'block' }, children: SDKUI_Localizator.BrowserAutoRenamesDuplicateFilesInDownloadsFolder }))] }) }), fileNamingRow, formatSelectorsRow] })), settings.exportMode === 'zip' && (_jsxs("div", { style: { display: 'flex', flexWrap: 'wrap', columnGap: '10px' }, children: [_jsxs("div", { style: { display: 'flex', flexWrap: 'wrap', columnGap: '10px', width: '100%' }, children: [folderSelector, _jsx("div", { style: { flex: '1 1 280px', minWidth: '280px' }, children: _jsx(TMTextBox, { label: SDKUI_Localizator.ZipFileName, value: settings.zipFileName, validationItems: zipValidationItems, autoComplete: "one-time-code", onValueChanged: (e) => updateSettings('zipFileName', e.target.value) }) }), _jsx("div", { style: { flex: '1 1 280px', minWidth: '280px' }, children: _jsx(TMTextBox, { label: SDKUI_Localizator.ProtectWithPasswordOptional, value: settings.zipPassword, type: "password", autoComplete: "one-time-code", onValueChanged: (e) => updateSettings('zipPassword', e.target.value) }) })] }), fileNamingRow, formatSelectorsRow] }))] })] }));
|
|
419
|
-
return (_jsx(
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
388
|
+
return (_jsx(TMModal, { width: calcResponsiveSizes(deviceType, showTMRelationViewer ? '95%' : '950px', '95%', '95%'), height: showTMRelationViewer ? '95%' : 'auto', title: getTitle(), onClose: onClose, showCloseButton: true, children: _jsxs("div", { onContextMenu: (e) => e.preventDefault(), style: { display: 'flex', flexDirection: 'column', padding: '4px 4px 16px 4px', width: '100%', height: '100%', boxSizing: 'border-box', overflow: 'hidden' }, children: [showTMRelationViewer ? (_jsx("div", { style: { flex: 1, minHeight: 0, display: 'flex', flexDirection: 'column' }, children: _jsxs(TMSplitterLayout, { direction: 'vertical', showSeparator: true, separatorSize: 8, separatorColor: 'transparent', separatorActiveColor: 'transparent', overflow: 'hidden', min: ["50", "50"], start: ['65%', '35%'], children: [_jsx(TMDownloadRelationViewerSection, { selectedDcmtInfos: selectedDcmtInfos, onSelectionChanged: setSelectedItemsRelationViewer, allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers }), configSection] }, "TMCopyToFolder-relation-config") })) : (configSection), _jsx("div", { style: { display: 'flex', justifyContent: 'center', alignItems: 'center', flexShrink: 0, marginTop: '12px' }, children: _jsxs("button", { disabled: !isFormValid() || (showTMRelationViewer && selectedItemsRelationViewer.filter(i => i.isDcmt).length === 0), onClick: run, style: {
|
|
389
|
+
display: 'flex',
|
|
390
|
+
alignItems: 'center',
|
|
391
|
+
justifyContent: 'center',
|
|
392
|
+
gap: '6px',
|
|
393
|
+
padding: '8px 20px',
|
|
394
|
+
fontSize: '0.95rem',
|
|
395
|
+
fontWeight: 600,
|
|
396
|
+
color: '#fff',
|
|
397
|
+
background: (!isFormValid() || (showTMRelationViewer && selectedItemsRelationViewer.filter(i => i.isDcmt).length === 0))
|
|
398
|
+
? '#b0b0b0'
|
|
399
|
+
: 'linear-gradient(135deg, #28a745 0%, #218838 100%)',
|
|
400
|
+
border: 'none',
|
|
401
|
+
borderRadius: '6px',
|
|
402
|
+
cursor: (!isFormValid() || (showTMRelationViewer && selectedItemsRelationViewer.filter(i => i.isDcmt).length === 0)) ? 'not-allowed' : 'pointer',
|
|
403
|
+
boxShadow: (!isFormValid() || (showTMRelationViewer && selectedItemsRelationViewer.filter(i => i.isDcmt).length === 0))
|
|
404
|
+
? 'none'
|
|
405
|
+
: '0 2px 8px rgba(40, 167, 69, 0.35)',
|
|
406
|
+
transition: 'all 0.2s ease',
|
|
407
|
+
}, children: [_jsx(IconPlay, {}), _jsx("span", { children: SDKUI_Localizator.Execute })] }) })] }) }));
|
|
439
408
|
};
|
|
440
409
|
export default TMCopyToFolderForm;
|