@topconsultnpm/sdkui-react 6.22.0-dev2.2 → 6.22.0-dev2.21

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 (109) 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/TMButton.d.ts +13 -0
  4. package/lib/components/base/TMButton.js +137 -5
  5. package/lib/components/base/TMDataGrid.d.ts +2 -0
  6. package/lib/components/base/TMDataGrid.js +68 -4
  7. package/lib/components/base/TMEditorBase.d.ts +2 -0
  8. package/lib/components/base/TMModal.d.ts +4 -0
  9. package/lib/components/base/TMModal.js +42 -11
  10. package/lib/components/base/TMPanel.d.ts +1 -0
  11. package/lib/components/base/TMPanel.js +79 -20
  12. package/lib/components/base/TMTooltip.d.ts +2 -1
  13. package/lib/components/base/TMTooltip.js +23 -6
  14. package/lib/components/base/TMTreeView.js +108 -67
  15. package/lib/components/choosers/TMDcmtTypeChooser.js +4 -3
  16. package/lib/components/choosers/TMDistinctValues.d.ts +9 -7
  17. package/lib/components/choosers/TMDistinctValues.js +149 -142
  18. package/lib/components/choosers/TMMetadataChooser.js +1 -1
  19. package/lib/components/choosers/TMQuickSearchInfo.d.ts +12 -0
  20. package/lib/components/choosers/TMQuickSearchInfo.js +279 -0
  21. package/lib/components/choosers/TMQuickSearchSettingsForm.d.ts +16 -0
  22. package/lib/components/choosers/TMQuickSearchSettingsForm.js +94 -0
  23. package/lib/components/choosers/TMSelectedValuesSummary.d.ts +13 -0
  24. package/lib/components/choosers/TMSelectedValuesSummary.js +91 -0
  25. package/lib/components/editors/TMDropDown.d.ts +3 -0
  26. package/lib/components/editors/TMDropDown.js +197 -5
  27. package/lib/components/editors/TMMetadataEditor.d.ts +5 -1
  28. package/lib/components/editors/TMMetadataEditor.js +8 -3
  29. package/lib/components/editors/TMTextBox.js +15 -15
  30. package/lib/components/features/documents/TMBatchUpdateForm.js +19 -5
  31. package/lib/components/features/documents/TMDcmtForm.d.ts +7 -0
  32. package/lib/components/features/documents/TMDcmtForm.js +104 -42
  33. package/lib/components/features/documents/TMDcmtFormActionButtons.d.ts +11 -0
  34. package/lib/components/features/documents/TMDcmtFormActionButtons.js +74 -7
  35. package/lib/components/features/documents/TMMasterDetailDcmts.js +95 -33
  36. package/lib/components/features/documents/TMMasterInfoFields.d.ts +19 -0
  37. package/lib/components/features/documents/TMMasterInfoFields.js +172 -0
  38. package/lib/components/features/documents/TMMultiMasterDetailDcmtsForm.d.ts +40 -0
  39. package/lib/components/features/documents/TMMultiMasterDetailDcmtsForm.js +277 -0
  40. package/lib/components/features/documents/TMMultiMasterDetailDcmtsUtils.d.ts +354 -0
  41. package/lib/components/features/documents/TMMultiMasterDetailDcmtsUtils.js +234 -0
  42. package/lib/components/features/documents/TMRelationViewer.d.ts +14 -1
  43. package/lib/components/features/documents/TMRelationViewer.js +69 -20
  44. package/lib/components/features/search/TMSearch.js +29 -16
  45. package/lib/components/features/search/TMSearchQueryEditor.js +5 -3
  46. package/lib/components/features/search/TMSearchQueryPanel.d.ts +1 -1
  47. package/lib/components/features/search/TMSearchQueryPanel.js +28 -7
  48. package/lib/components/features/search/TMSearchResult.d.ts +9 -0
  49. package/lib/components/features/search/TMSearchResult.js +323 -92
  50. package/lib/components/features/search/TMTreeSelector.js +18 -5
  51. package/lib/components/features/workflow/TMWorkflowPopup.d.ts +10 -0
  52. package/lib/components/features/workflow/TMWorkflowPopup.js +8 -4
  53. package/lib/components/layout/panelManager/TMPanelManagerContainer.d.ts +1 -0
  54. package/lib/components/layout/panelManager/TMPanelManagerContainer.js +24 -14
  55. package/lib/components/layout/panelManager/TMPanelWrapper.js +2 -2
  56. package/lib/components/layout/panelManager/types.d.ts +3 -0
  57. package/lib/components/viewers/TMMidViewer.js +4 -1
  58. package/lib/components/viewers/TMTidViewer.js +25 -11
  59. package/lib/helper/SDKUI_Globals.d.ts +55 -0
  60. package/lib/helper/SDKUI_Globals.js +82 -0
  61. package/lib/helper/SDKUI_Localizator.d.ts +24 -0
  62. package/lib/helper/SDKUI_Localizator.js +240 -0
  63. package/lib/helper/TMIcons.d.ts +1 -0
  64. package/lib/helper/TMIcons.js +3 -0
  65. package/lib/helper/dataGridSearchHelper.d.ts +28 -0
  66. package/lib/helper/dataGridSearchHelper.js +51 -0
  67. package/lib/helper/dcmtsHelper.d.ts +20 -0
  68. package/lib/helper/dcmtsHelper.js +58 -1
  69. package/lib/helper/helpers.d.ts +20 -0
  70. package/lib/helper/helpers.js +40 -0
  71. package/lib/helper/index.d.ts +1 -0
  72. package/lib/helper/index.js +1 -0
  73. package/lib/helper/queryHelper.d.ts +2 -0
  74. package/lib/helper/queryHelper.js +3 -1
  75. package/lib/hooks/tmDistinctValuesGridHelper.d.ts +16 -0
  76. package/lib/hooks/tmDistinctValuesGridHelper.js +31 -0
  77. package/lib/hooks/useArchiveListForm.d.ts +39 -0
  78. package/lib/hooks/useArchiveListForm.js +46 -0
  79. package/lib/hooks/useCaseFlowApprove.d.ts +56 -0
  80. package/lib/hooks/useCaseFlowApprove.js +157 -0
  81. package/lib/hooks/useDataUserIdItem.d.ts +1 -0
  82. package/lib/hooks/useDataUserIdItem.js +1 -0
  83. package/lib/hooks/useDocumentOperations.d.ts +2 -0
  84. package/lib/hooks/useDocumentOperations.js +28 -5
  85. package/lib/hooks/useMultiMasterDetailDcmts.d.ts +98 -0
  86. package/lib/hooks/useMultiMasterDetailDcmts.js +567 -0
  87. package/lib/hooks/useRelatedDocuments.js +2 -26
  88. package/lib/hooks/useTMDistinctValuesMetadataDisplay.d.ts +18 -0
  89. package/lib/hooks/useTMDistinctValuesMetadataDisplay.js +103 -0
  90. package/lib/hooks/useTMDistinctValuesQuickSearch.d.ts +49 -0
  91. package/lib/hooks/useTMDistinctValuesQuickSearch.js +307 -0
  92. package/lib/hooks/useTMDistinctValuesSelection.d.ts +42 -0
  93. package/lib/hooks/useTMDistinctValuesSelection.js +103 -0
  94. package/lib/hooks/useTMDistinctValuesSource.d.ts +29 -0
  95. package/lib/hooks/useTMDistinctValuesSource.js +105 -0
  96. package/lib/index.d.ts +1 -0
  97. package/lib/index.js +1 -0
  98. package/lib/services/caseflow/CaseFlowService.d.ts +236 -0
  99. package/lib/services/caseflow/CaseFlowService.js +693 -0
  100. package/lib/services/caseflow/CaseFlowTemplateCacheService.d.ts +28 -0
  101. package/lib/services/caseflow/CaseFlowTemplateCacheService.js +121 -0
  102. package/lib/services/caseflow/caseFlowNameCache.d.ts +32 -0
  103. package/lib/services/caseflow/caseFlowNameCache.js +116 -0
  104. package/lib/services/caseflow/caseFlowWorkItemUtils.d.ts +61 -0
  105. package/lib/services/caseflow/caseFlowWorkItemUtils.js +113 -0
  106. package/lib/services/index.d.ts +4 -0
  107. package/lib/services/index.js +4 -0
  108. package/lib/services/platform_services.d.ts +1 -1
  109. package/package.json +66 -66
@@ -0,0 +1,105 @@
1
+ import { useEffect, useMemo, useRef, useState } from 'react';
2
+ import { DataColumnTypes, DcmtTypeListCacheService, MetadataDataTypes, SDK_Globals } from '@topconsultnpm/sdk-ts';
3
+ import { TMExceptionBoxManager } from '../components/base/TMPopUp';
4
+ import TMSpinner from '../components/base/TMSpinner';
5
+ import { customizeSearchByDisplayText, getDateDisplayText } from '../helper';
6
+ import { getDateDisplayFormat, withRowIndex } from './tmDistinctValuesGridHelper';
7
+ import { needsDisplayValue } from './useTMDistinctValuesMetadataDisplay';
8
+ /** Nel risultato dei valori distinti la prima colonna è il valore, la seconda il numero di documenti che lo contengono */
9
+ const COUNT_COL_INDEX = 1;
10
+ /** Numero massimo di valori distinti richiesti al server: il conteggio dice quanti ne sono arrivati sul totale */
11
+ const MAX_DISTINCT_VALUES = 10000;
12
+ /**
13
+ * Sorgente "valori distinti" di TMDistinctValues: carica i valori del metadato con il relativo numero di
14
+ * documenti e ne espone righe, colonne e conteggi già pronti per la griglia.
15
+ *
16
+ * È anche la sorgente da cui viene il descrittore del metadato (`md`), usato dal pannello per permessi,
17
+ * titolo e visibilità dell'accodamento: per questo viene caricata anche quando è attiva la ricerca rapida.
18
+ */
19
+ export const useTMDistinctValuesSource = ({ tid, mid, display }) => {
20
+ const { loadDisplayCachesAsync, displayValueColumnProps, getMetadataDisplayValue } = display;
21
+ const [md, setMd] = useState();
22
+ const [dataSource, setDataSource] = useState([]);
23
+ const [counts, setCounts] = useState();
24
+ // Identifica la richiesta corrente: dopo ogni await le risposte delle richieste obsolete vengono scartate
25
+ const requestIdRef = useRef(0);
26
+ // Cambiando campo i valori distinti vanno ricaricati: sono la sorgente su cui si torna cambiando
27
+ // modalità e quella da cui viene il metadato del campo
28
+ useEffect(() => { loadAsync(); }, [tid, mid]);
29
+ const loadAsync = async () => {
30
+ if (!tid)
31
+ return;
32
+ const requestId = ++requestIdRef.current;
33
+ const isStale = () => requestId !== requestIdRef.current;
34
+ // Svuota subito la griglia: evita di mostrare i valori del tid/mid precedente durante il caricamento
35
+ setDataSource([]);
36
+ setCounts(undefined);
37
+ try {
38
+ TMSpinner.show({ description: 'Caricamento dei valori distinti...' });
39
+ const dtd = await DcmtTypeListCacheService.GetAsync(tid, true);
40
+ const currentMd = dtd?.metadata?.find(o => o.id === mid);
41
+ const result = await SDK_Globals.tmSession?.NewSearchEngine().GetDistinctValuesAsync(tid, mid, MAX_DISTINCT_VALUES);
42
+ if (isStale())
43
+ return;
44
+ // La prima colonna del risultato è quella dei valori distinti
45
+ await loadDisplayCachesAsync([currentMd], result?.dtdResult?.rows);
46
+ if (isStale())
47
+ return;
48
+ setMd(currentMd);
49
+ setDataSource(convertDataTableToObject(result?.dtdResult));
50
+ setCounts({ returned: result?.dcmtsReturned ?? 0, found: result?.dcmtsFound ?? 0 });
51
+ }
52
+ catch (e) {
53
+ if (isStale())
54
+ return;
55
+ TMExceptionBoxManager.show({ exception: e });
56
+ }
57
+ finally {
58
+ TMSpinner.hide();
59
+ }
60
+ };
61
+ const columns = useMemo(() => {
62
+ const isDateColumn = md?.dataType === MetadataDataTypes.DateTime;
63
+ return ([
64
+ {
65
+ dataField: 'value', dataType: isDateColumn ? 'date' : 'string', caption: md?.nameLoc,
66
+ ...(isDateColumn && { format: getDateDisplayFormat(md?.format?.format, md?.format?.formatCulture) }),
67
+ ...displayValueColumnProps(md, 'value')
68
+ },
69
+ { dataField: 'Count', dataType: 'number', caption: 'N°' }
70
+ ]);
71
+ }, [md, displayValueColumnProps]);
72
+ // La colonna del valore mostra la data formattata o la descrizione: la ricerca va fatta su quel testo
73
+ const searchTextGetters = useMemo(() => {
74
+ const getters = new Map();
75
+ if (md?.dataType === MetadataDataTypes.DateTime) {
76
+ getters.set('value', (rowData) => getDateDisplayText(rowData?.value, md?.format?.format, md?.format?.formatCulture));
77
+ }
78
+ else if (needsDisplayValue(md)) {
79
+ getters.set('value', (rowData) => String(getMetadataDisplayValue(md, rowData?.value) ?? ''));
80
+ }
81
+ return getters;
82
+ }, [md, getMetadataDisplayValue]);
83
+ const customizeColumns = useMemo(() => customizeSearchByDisplayText(searchTextGetters), [searchTextGetters]);
84
+ return { md, dataSource, counts, columns, customizeColumns, loadAsync };
85
+ };
86
+ const convertDataTableToObject = (dtdResult) => {
87
+ if (!dtdResult?.columns?.length || !dtdResult?.rows?.length)
88
+ return [];
89
+ // Descrittori di colonna calcolati una sola volta invece che per ogni riga
90
+ const columns = [];
91
+ dtdResult.columns.forEach((col, colIndex) => {
92
+ if (col?.caption) {
93
+ columns.push({ index: colIndex, key: colIndex === 0 ? "value" : col.caption, isNumber: col.dataType === DataColumnTypes.Number });
94
+ }
95
+ });
96
+ // I valori più frequenti in testa: il conteggio è nella seconda colonna del risultato
97
+ const sortedRows = dtdResult.rows.slice().sort((a, b) => (Number(b?.[COUNT_COL_INDEX]) || 0) - (Number(a?.[COUNT_COL_INDEX]) || 0));
98
+ return withRowIndex(sortedRows.map((row) => {
99
+ const rowObject = {};
100
+ columns.forEach((col) => {
101
+ rowObject[col.key] = col.isNumber ? row?.[col.index]?.replace('.', ',') : row?.[col.index] ?? null;
102
+ });
103
+ return rowObject;
104
+ }));
105
+ };
package/lib/index.d.ts CHANGED
@@ -8,6 +8,7 @@ export * from './hooks/useQueryParametersDialog';
8
8
  export * from './hooks/useDcmtOperations';
9
9
  export * from './hooks/useResizeObserver';
10
10
  export * from './hooks/useWorkflowApprove';
11
+ export * from './hooks/useCaseFlowApprove';
11
12
  export * from './hooks/useRelatedDocuments';
12
13
  export * from './hooks/useSettingsFeedback';
13
14
  export * from './hooks/useBetaFeatures';
package/lib/index.js CHANGED
@@ -8,6 +8,7 @@ export * from './hooks/useQueryParametersDialog';
8
8
  export * from './hooks/useDcmtOperations';
9
9
  export * from './hooks/useResizeObserver';
10
10
  export * from './hooks/useWorkflowApprove';
11
+ export * from './hooks/useCaseFlowApprove';
11
12
  export * from './hooks/useRelatedDocuments';
12
13
  export * from './hooks/useSettingsFeedback';
13
14
  export * from './hooks/useBetaFeatures';
@@ -0,0 +1,236 @@
1
+ import { BlogPost, BlogPostAttachment, CaseFlowDcmt, CaseFlowGuestPermissions, CaseFlowInstanceDescriptor, CaseFlowParticipant, CaseFlowTemplateDescriptor, CaseFlowWorkItem, DcmtTypeDescriptor, CF_ParticipantRoles, CF_States } from '@topconsultnpm/sdk-ts';
2
+ type PendingGroup = Array<{
3
+ caseflow: CaseFlowInstanceDescriptor;
4
+ workItems: CaseFlowWorkItem[];
5
+ }>;
6
+ /** Criteri di ricerca delle istanze (pannello Ricerca e Process Mining). */
7
+ export interface CaseFlowSearchCriteria {
8
+ templateId?: number;
9
+ name?: string;
10
+ description?: string;
11
+ state?: CF_States;
12
+ dateFrom?: string;
13
+ dateTo?: string;
14
+ metadataFilters?: Array<{
15
+ mid: number;
16
+ value: string;
17
+ }>;
18
+ /** Ricerca libera: cerca il valore in tutti i metadati di qualsiasi template */
19
+ freeTextMetadata?: string;
20
+ }
21
+ /** Documento non cancellato durante l'eliminazione di un'istanza (orfano). */
22
+ export interface CaseFlowDeleteOrphan {
23
+ tid: number;
24
+ did: number;
25
+ /** Motivo del fallimento (tipicamente "Document not accessible by this user"). */
26
+ reason: string;
27
+ }
28
+ /** Esito dell'eliminazione di un'istanza di CaseFlow. */
29
+ export interface CaseFlowDeleteResult {
30
+ instanceDID: number;
31
+ /** true se tutti i documenti individuati sono stati cancellati. */
32
+ complete: boolean;
33
+ /** Documenti non cancellati perché non accessibili all'utente (vista parametrica/CdV). */
34
+ orphaned: CaseFlowDeleteOrphan[];
35
+ }
36
+ export declare class CaseFlowService {
37
+ /** Elenco dei template reali (via CaseFlowTemplateCacheService). */
38
+ static getTemplates(): Promise<CaseFlowTemplateDescriptor[]>;
39
+ /**
40
+ * Singolo template per id. Usa GetAsync (non un find su GetAllAsync): così i
41
+ * template di cui l'utente NON può creare istanze — ma di cui è destinatario
42
+ * di un workitem (es. Completamento dati) — vengono risolti on-demand via
43
+ * RetrieveAsync mirata invece di restituire undefined.
44
+ */
45
+ static getTemplate(id: number): Promise<CaseFlowTemplateDescriptor | undefined>;
46
+ /** Invalida la cache dei template (dopo creazione/modifica/eliminazione). */
47
+ static invalidateTemplatesCache(): void;
48
+ /** DcmtTypeDescriptor (copertina) per il TID indicato. */
49
+ static getDcmtTypeAsync(tid: number): Promise<DcmtTypeDescriptor | undefined>;
50
+ /** Tutte le istanze visibili all'utente (unione di tutti i template). */
51
+ static getCaseflows(): Promise<CaseFlowInstanceDescriptor[]>;
52
+ /**
53
+ * Singola istanza COMPLETA per id. `RetrieveAllAsync` (usata dalla dashboard)
54
+ * porta i dati necessari alle card, ma per il dettaglio completo
55
+ * (documenti/bacheca/timeline) serve comunque una `RetrieveAsync(cftid, id)`
56
+ * che idrata l'istanza. Il `cftid` va passato quando noto (evita una
57
+ * scansione); in mancanza viene risolto dalla lista.
58
+ *
59
+ * ATTENZIONE sui `workItems` della RetrieveAll: contengono i soli workitem
60
+ * ANCORA APERTI, non lo storico. Una pratica conclusa arriva con
61
+ * `workItems: []`, perché non ha più nulla di pendente. Chi deve ricostruire
62
+ * la STORIA di una pratica (chi ha fatto cosa e quando) non può quindi basarsi
63
+ * sull'elenco: serve la Retrieve completa, e la fonte dei passaggi già
64
+ * avvenuti sono i messaggi di sistema della bacheca (`blogPosts` con
65
+ * allegato di riferimento all'azione).
66
+ */
67
+ static getCaseflow(id: number, cftid?: number): Promise<CaseFlowInstanceDescriptor | undefined>;
68
+ /**
69
+ * Come {@link getCaseflow} ma PROPAGA l'errore invece di inghiottirlo.
70
+ * Da usare nei punti in cui l'utente apre esplicitamente l'istanza (apertura
71
+ * scheda, deep link): il fallimento della Retrieve deve essere notificato,
72
+ * non mascherato da una vista incompleta ("non sei un partecipante").
73
+ */
74
+ static retrieveCaseflow(id: number, cftid?: number): Promise<CaseFlowInstanceDescriptor | undefined>;
75
+ /** Istanze di cui l'utente indicato è proprietario. */
76
+ static getMyCaseflows(userId: number): Promise<CaseFlowInstanceDescriptor[]>;
77
+ /** Ricerca avanzata sulle istanze applicando i filtri indicati. */
78
+ static searchCaseflows(criteria: CaseFlowSearchCriteria): Promise<CaseFlowInstanceDescriptor[]>;
79
+ /** WorkItem pendenti assegnati all'utente, raggruppati per istanza. */
80
+ static getMyPendingWorkItems(userId: number): Promise<PendingGroup>;
81
+ /**
82
+ * Richieste di "maggiori informazioni" INVIATE dall'utente e ancora in
83
+ * attesa di risposta, raggruppate per istanza.
84
+ *
85
+ * Non basta filtrare `toUserID === userId && state === MoreInfo` (il solo
86
+ * workitem "padre" bloccato intestato a me): a seconda di come il backend
87
+ * materializza la richiesta, l'unico workitem visibile può essere quello
88
+ * INVIATO al destinatario (`fromUserID === userId`, categoria MoreInfo,
89
+ * ancora Pending). In quel caso il filtro su `toUserID` non lo intercetta e
90
+ * l'istanza sparisce da TUTTE le sezioni di "Per te" (non è più Pending per
91
+ * me, non è MoreInfo intestato a me, e non ne sono owner). Consideriamo
92
+ * quindi entrambe le rappresentazioni, preferendo il figlio inviato (che
93
+ * porta il destinatario) ed evitando di mostrare padre + figlio della
94
+ * stessa richiesta.
95
+ */
96
+ static getMyMoreInfoRequests(userId: number): Promise<PendingGroup>;
97
+ private static collectWorkItemsByState;
98
+ /**
99
+ * Crea una nuova istanza a partire da un template tramite CreateAsync.
100
+ * I metadati di copertina (metadataValues: mid -> valore) vengono passati
101
+ * nel campo `cover`. Il backend materializza azioni/stati/partecipanti dal
102
+ * template identificato da `cftid`.
103
+ * @returns id della nuova istanza.
104
+ */
105
+ static CreateCaseFlowInstance(template: CaseFlowTemplateDescriptor, instanceName: string, instanceDescription: string | undefined, metadataValues: Record<number, string>): Promise<number>;
106
+ /**
107
+ * Elimina un'istanza tramite DeleteAsync(cftid, id). Il cftid è preso dal
108
+ * template fornito (se disponibile) oppure risolto dall'istanza.
109
+ */
110
+ static DeleteCaseFlowInstance(instanceId: number, template?: CaseFlowTemplateDescriptor): Promise<CaseFlowDeleteResult>;
111
+ /** Aggiorna un'istanza esistente tramite UpdateAsync. */
112
+ static saveCaseflow(caseflow: CaseFlowInstanceDescriptor): Promise<void>;
113
+ /**
114
+ * Aggiunge un post in bacheca tramite BlogPostAddAsync(cftid, id, bp). Il
115
+ * cftid è passato quando noto (evita una Retrieve) oppure risolto dall'istanza.
116
+ * @returns il post creato (transitorio: la ricarica leggerà quelli reali).
117
+ */
118
+ static addBlogPost(caseFlowId: number, text: string, authorId: number, authorName: string, attachments?: BlogPostAttachment[], cftid?: number): Promise<BlogPost>;
119
+ /**
120
+ * Elimina (o ripristina) un post in bacheca tramite
121
+ * BlogPostDeleteOrUndeleteAsync(cftid, id, postID, del).
122
+ */
123
+ static deleteOrUndeleteBlogPost(caseFlowId: number, postId: number, del: boolean, cftid?: number): Promise<void>;
124
+ /**
125
+ * Aggancia un documento (nuovo archiviato o già presente in archivio)
126
+ * all'istanza tramite DcmtAddOrRemoveAsync(remove=false).
127
+ * @returns descrittore transitorio del documento agganciato (la ricarica
128
+ * dell'istanza leggerà quello reale).
129
+ */
130
+ static addDcmtToInstance(caseFlowId: number, tid: number, did: number, cftid?: number): Promise<CaseFlowDcmt | undefined>;
131
+ /** Sgancia un documento dall'istanza tramite DcmtAddOrRemoveAsync(remove=true). */
132
+ static removeDcmtFromInstance(caseFlowId: number, tid: number, did: number, cftid?: number): Promise<void>;
133
+ /** Aggiunge o aggiorna (upsert) la regola documenti del TID sulla sola istanza. */
134
+ static saveDcmtRule(caseFlowId: number, tid: number, min: number, max: number, cftid?: number): Promise<void>;
135
+ /** Rimuove la regola documenti del TID dalla sola istanza. */
136
+ static removeDcmtRule(caseFlowId: number, tid: number, cftid?: number): Promise<void>;
137
+ /**
138
+ * Chiama DcmtRuleAddOrRemoveAsync(cftid, id, tid, min, max, remove)
139
+ * risolvendo il cftid quando non passato (come per bacheca e partecipanti).
140
+ */
141
+ private static dcmtRuleAddOrRemove;
142
+ /**
143
+ * Chiama DcmtAddOrRemoveAsync(cftid, id, tid, did, remove) risolvendo il
144
+ * cftid quando non passato (come per bacheca e partecipanti).
145
+ */
146
+ private static dcmtAddOrRemove;
147
+ /**
148
+ * Aggiunge un partecipante all'istanza (o ne aggiorna ruolo/permessi se già
149
+ * presente) tramite ParticipantsAddOrRemoveAsync(remove=false).
150
+ */
151
+ static addParticipant(caseFlowId: number, userId: number, userName: string, role: CF_ParticipantRoles, guestPermissions?: CaseFlowGuestPermissions, cftid?: number): Promise<CaseFlowParticipant | undefined>;
152
+ /** Rimuove un partecipante dall'istanza tramite ParticipantsAddOrRemoveAsync(remove=true). */
153
+ static removeParticipant(caseFlowId: number, userId: number, cftid?: number): Promise<void>;
154
+ /**
155
+ * Cambia il ruolo di un partecipante ri-applicando l'upsert col nuovo ruolo
156
+ * (non esiste un'Update dedicata). Passando a Guest si conservano/impostano i
157
+ * relativi permessi.
158
+ */
159
+ static changeParticipantRole(caseFlowId: number, userId: number, role: CF_ParticipantRoles, guestPermissions?: CaseFlowGuestPermissions, cftid?: number): Promise<void>;
160
+ /** Aggiorna i permessi Guest di un partecipante (upsert col ruolo Guest). */
161
+ static updateParticipantGuestPermissions(caseFlowId: number, userId: number, permissions: CaseFlowGuestPermissions, cftid?: number): Promise<void>;
162
+ /**
163
+ * Chiama ParticipantsAddOrRemoveAsync(cftid, id, d, remove) risolvendo il
164
+ * cftid quando non passato (come per la bacheca).
165
+ */
166
+ private static participantsAddOrRemove;
167
+ /** Istanze marcate come preferite dall'utente corrente. */
168
+ static getFavorites(): Promise<CaseFlowInstanceDescriptor[]>;
169
+ /**
170
+ * Aggiunge o rimuove l'istanza dai preferiti dell'utente corrente tramite
171
+ * FavoritesAddOrRemoveAsync(cftid, id, remove).
172
+ */
173
+ static setFavorite(caseFlowId: number, favorite: boolean, cftid?: number): Promise<void>;
174
+ /**
175
+ * Inizia o smette di seguire l'istanza tramite
176
+ * FollowAddOrRemoveAsync(cftid, id, remove).
177
+ */
178
+ static setFollow(caseFlowId: number, follow: boolean, cftid?: number): Promise<void>;
179
+ /**
180
+ * Stato "l'utente corrente segue questa pratica" letto dal descrittore.
181
+ *
182
+ * Restituisce `undefined` quando il descrittore non porta l'informazione —
183
+ * cioè SEMPRE, finché il backend non aggiunge `IsFollow` in output a
184
+ * `usp_Cfi_RetrieveAll`/`usp_Cfi_Retrieve` e la relativa proprietà al
185
+ * contratto. Il tipo è tollerante perché la colonna è un BIT/NUMBER e può
186
+ * arrivare come booleano, come 0/1 o come stringa.
187
+ *
188
+ * Da NON dedurre dalla bacheca Home come fanno pratiche-dossier e gruppi di
189
+ * lavoro (filtro su `HomeBlogPost.classID`): quella query prende `TOP 30`
190
+ * righe e il solo ultimo post non di sistema per oggetto, quindi chi segue
191
+ * un oggetto senza post risulta "non seguace"; per le istanze di CaseFlow,
192
+ * poi, non esiste nemmeno un ramo nella UNION.
193
+ */
194
+ static readFollowFlag(cf: CaseFlowInstanceDescriptor): boolean | undefined;
195
+ /** Completa (approva) un workitem. La nota facoltativa viene pubblicata in bacheca dal backend. */
196
+ static completeWorkItem(caseFlowId: number, workItemId: number, response?: string, cftid?: number): Promise<void>;
197
+ /**
198
+ * Completa un workitem di "Completamento dati": i metadati valorizzati
199
+ * (mid -> valore) viaggiano in `metadataValues`; il backend li applica al
200
+ * documento master dell'istanza e completa il workitem.
201
+ */
202
+ static completeDataCompletionWorkItem(caseFlowId: number, workItemId: number, metadataValues: Record<number, string>, response?: string, cftid?: number): Promise<void>;
203
+ /** Rifiuta un workitem. Il motivo viene pubblicato in bacheca dal backend. */
204
+ static rejectWorkItem(caseFlowId: number, workItemId: number, response?: string, cftid?: number): Promise<void>;
205
+ /** Assegna un'azione a un utente creando il relativo workitem (operazione Assign). */
206
+ static createWorkItemForAction(caseFlowId: number, actionID: number, toUserID: number, description?: string, cftid?: number): Promise<void>;
207
+ /** Forza il completamento di un'azione (supervisor). */
208
+ static forceCompleteAction(caseFlowId: number, actionID: number, reason?: string, cftid?: number): Promise<void>;
209
+ /** Forza il rifiuto di un'azione (supervisor). Il motivo è obbligatorio. */
210
+ static forceRejectAction(caseFlowId: number, actionID: number, reason: string, cftid?: number): Promise<void>;
211
+ /**
212
+ * Richiede maggiori informazioni a un altro utente: il backend crea il
213
+ * workitem MoreInfo figlio assegnato a `targetUserId` e registra la richiesta.
214
+ */
215
+ static requestMoreInfo(caseFlowId: number, workItemId: number, targetUserId: number, message?: string, cftid?: number): Promise<void>;
216
+ /** Risponde a una richiesta di informazioni completando il workitem MoreInfo. */
217
+ static respondToMoreInfo(caseFlowId: number, moreInfoWorkItemId: number, response: string, cftid?: number): Promise<void>;
218
+ /**
219
+ * Chiama ExecuteWorkItemOperationAsync(cftid, id, operation) risolvendo il
220
+ * cftid quando non passato (come per bacheca, documenti e partecipanti).
221
+ */
222
+ private static executeWorkItemOperation;
223
+ private static _inFlightInstances?;
224
+ private static loadAllInstances;
225
+ private static doLoadAllInstances;
226
+ /**
227
+ * Fallback di TRANSIZIONE: enumera le istanze template per template usando
228
+ * l'elenco dei template visibili all'utente. Non copre le istanze di template
229
+ * NON visibili (partecipante a livello di istanza): per quelle serve la
230
+ * RetrieveAll cross-template (cftid=0). Da rimuovere quando cftid=0 è stabile.
231
+ */
232
+ private static loadInstancesPerTemplate;
233
+ /** Valorizza `ownerName` sulle istanze (best-effort, via cache utenti). */
234
+ private static resolveUserNames;
235
+ }
236
+ export {};