@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,28 @@
1
+ import { CaseFlowTemplateDescriptor } from '@topconsultnpm/sdk-ts';
2
+ export declare class CaseFlowTemplateCacheService {
3
+ private static _cache?;
4
+ private static _cachedAt;
5
+ private static _inFlight?;
6
+ /** Tempo di validità della cache (ms). */
7
+ private static readonly TTL_MS;
8
+ /**
9
+ * Restituisce l'elenco completo dei template (idratati). Usa la cache se
10
+ * valida; altrimenti effettua il recupero deduplicando le chiamate
11
+ * concorrenti.
12
+ * @param forceRefresh Se true ignora la cache e forza un nuovo recupero.
13
+ */
14
+ static GetAllAsync(forceRefresh?: boolean): Promise<CaseFlowTemplateDescriptor[]>;
15
+ private static _byId;
16
+ /**
17
+ * Restituisce un singolo template per id. Se non è nell'elenco "creabili"
18
+ * (GetAllAsync), tenta una risoluzione puntuale via RetrieveAsync e la mette in
19
+ * cache. Best-effort: se non risolvibile (permessi/rete) ritorna undefined.
20
+ */
21
+ static GetAsync(id: number, forceRefresh?: boolean): Promise<CaseFlowTemplateDescriptor | undefined>;
22
+ /**
23
+ * Invalida la cache: la prossima GetAllAsync/GetAsync rileggerà i template
24
+ * dal server. Da chiamare dopo creazione/modifica/eliminazione di template.
25
+ */
26
+ static Invalidate(): void;
27
+ private static doRetrieve;
28
+ }
@@ -0,0 +1,121 @@
1
+ // =============================================================================
2
+ // CaseFlowTemplateCacheService
3
+ // -----------------------------------------------------------------------------
4
+ // Cache in-memory dei template CaseFlow. Il recupero completo dei template è
5
+ // costoso: RetrieveAllAsync restituisce template "leggeri" che vanno idratati
6
+ // con una RetrieveAsync per ciascun template. Senza cache questa sequenza viene
7
+ // rieseguita ad ogni chiamata (caricamento istanze, movimentazione, risoluzione
8
+ // del mTID, valutazione condizioni, ...), generando molte richieste di rete
9
+ // ridondanti.
10
+ //
11
+ // La cache:
12
+ // - mantiene l'elenco completo per un breve TTL;
13
+ // - deduplica le chiamate concorrenti condividendo la stessa promise in volo;
14
+ // - può essere invalidata esplicitamente quando un template viene creato,
15
+ // aggiornato o eliminato (vedi Invalidate()).
16
+ // =============================================================================
17
+ import { SDK_Globals } from '@topconsultnpm/sdk-ts';
18
+ export class CaseFlowTemplateCacheService {
19
+ /**
20
+ * Restituisce l'elenco completo dei template (idratati). Usa la cache se
21
+ * valida; altrimenti effettua il recupero deduplicando le chiamate
22
+ * concorrenti.
23
+ * @param forceRefresh Se true ignora la cache e forza un nuovo recupero.
24
+ */
25
+ static async GetAllAsync(forceRefresh = false) {
26
+ const isFresh = this._cache != null && (Date.now() - this._cachedAt) < this.TTL_MS;
27
+ if (!forceRefresh && isFresh)
28
+ return this._cache;
29
+ if (!forceRefresh && this._inFlight)
30
+ return this._inFlight;
31
+ const p = this.doRetrieve()
32
+ .then(list => {
33
+ this._cache = list;
34
+ this._cachedAt = Date.now();
35
+ return list;
36
+ })
37
+ .catch(err => {
38
+ // Un recupero fallito NON deve inquinare la cache con `[]`: se lo
39
+ // facessimo, per l'intero TTL la dashboard mostrerebbe "nessuna
40
+ // istanza" (nessun template ⇒ nessuna RetrieveAll istanze) anche
41
+ // dopo che il backend è tornato disponibile. Se abbiamo un elenco
42
+ // valido precedente lo riusiamo; al primo caricamento (cache vuota)
43
+ // propaghiamo l'errore, così la UI può mostrarlo invece di svuotarsi.
44
+ if (this._cache != null) {
45
+ console.warn('[CaseFlow] RetrieveAll template fallita: riuso l\'ultimo elenco valido.', err);
46
+ return this._cache;
47
+ }
48
+ throw err;
49
+ })
50
+ .finally(() => { this._inFlight = undefined; });
51
+ this._inFlight = p;
52
+ return p;
53
+ }
54
+ /**
55
+ * Restituisce un singolo template per id. Se non è nell'elenco "creabili"
56
+ * (GetAllAsync), tenta una risoluzione puntuale via RetrieveAsync e la mette in
57
+ * cache. Best-effort: se non risolvibile (permessi/rete) ritorna undefined.
58
+ */
59
+ static async GetAsync(id, forceRefresh = false) {
60
+ const all = await this.GetAllAsync(forceRefresh);
61
+ const found = all.find(t => t.id === id);
62
+ if (found)
63
+ return found;
64
+ if (!forceRefresh && this._byId.has(id))
65
+ return this._byId.get(id);
66
+ try {
67
+ const engine = SDK_Globals.tmSession?.NewCaseFlowTemplateEngine();
68
+ const t = await engine?.RetrieveAsync(id);
69
+ if (t) {
70
+ this._byId.set(id, t);
71
+ return t;
72
+ }
73
+ }
74
+ catch (e) {
75
+ console.warn(`[CaseFlow] RetrieveAsync template on-demand ${id} fallita:`, e);
76
+ }
77
+ return undefined;
78
+ }
79
+ /**
80
+ * Invalida la cache: la prossima GetAllAsync/GetAsync rileggerà i template
81
+ * dal server. Da chiamare dopo creazione/modifica/eliminazione di template.
82
+ */
83
+ static Invalidate() {
84
+ this._cache = undefined;
85
+ this._cachedAt = 0;
86
+ this._inFlight = undefined;
87
+ this._byId.clear();
88
+ }
89
+ static async doRetrieve() {
90
+ const engine = SDK_Globals.tmSession?.NewCaseFlowTemplateEngine();
91
+ // Il recupero dell'elenco può fallire (rete/backend/permessi): l'errore
92
+ // deve PROPAGARSI, così GetAllAsync non lo trasforma in una cache vuota.
93
+ // L'idratazione del singolo template, invece, resta tollerante ai fallimenti
94
+ // (partial: usa il descrittore leggero se la RetrieveAsync fallisce).
95
+ const list = (await engine?.RetrieveAllAsync()) ?? [];
96
+ // RetrieveAllAsync restituisce template "leggeri" privi di mtid/witid,
97
+ // templateActions, stateDefinitions e templateParticipants: per disporre
98
+ // dei dati completi (necessari a caricare istanze, azioni e workitem)
99
+ // ogni template viene idratato con RetrieveAsync.
100
+ const fulls = await Promise.all(list.map(async (t) => {
101
+ if (t.id == null)
102
+ return t;
103
+ try {
104
+ return (await engine?.RetrieveAsync(t.id)) ?? t;
105
+ }
106
+ catch (e) {
107
+ console.warn(`[CaseFlow] RetrieveAsync del template ${t.id} fallita:`, e);
108
+ return t;
109
+ }
110
+ }));
111
+ return fulls;
112
+ }
113
+ }
114
+ CaseFlowTemplateCacheService._cachedAt = 0;
115
+ /** Tempo di validità della cache (ms). */
116
+ CaseFlowTemplateCacheService.TTL_MS = 60_000;
117
+ // Cache supplementare per i template risolti PUNTUALMENTE (on-demand): sono i
118
+ // template di cui l'utente NON può creare istanze (quindi assenti da
119
+ // GetAllAsync) ma di cui partecipa a un'istanza. Vanno risolti con una
120
+ // RetrieveAsync(cftid) mirata per poterne mostrare nome/azioni.
121
+ CaseFlowTemplateCacheService._byId = new Map();
@@ -0,0 +1,32 @@
1
+ import type { CaseFlowTemplateDescriptor } from '@topconsultnpm/sdk-ts';
2
+ /** Nome utente già risolto, oppure '' se non ancora in cache. */
3
+ export declare function getUserNameSync(userId?: number): string;
4
+ /**
5
+ * Risolve (best-effort) i nomi degli utenti mancanti tramite la cache utenti del
6
+ * SDK e li memorizza. Ritorna quando tutti gli id richiesti sono in cache.
7
+ */
8
+ export declare function ensureUserNames(userIds: Array<number | undefined>): Promise<void>;
9
+ /** Nome del template risolto dal templateId (cftid), oppure '' se sconosciuto. */
10
+ export declare function getTemplateNameSync(templateId?: number): string;
11
+ /**
12
+ * Nome del template per la VISUALIZZAZIONE. Come {@link getTemplateNameSync}, ma
13
+ * quando il template non è risolvibile (tipicamente perché l'istanza appartiene a
14
+ * un template NON visibile all'utente corrente) degrada su un fallback leggibile
15
+ * basato sull'ID (`Modello #<cftid>`) invece di lasciare il campo vuoto: l'istanza
16
+ * resta comunque mostrabile. Usare `getTemplateNameSync` per la logica/ricerca,
17
+ * questo per il rendering.
18
+ */
19
+ export declare function getTemplateDisplayName(templateId?: number): string;
20
+ /** Popola la cache dei nomi template (da chiamare quando si caricano i template). */
21
+ export declare function primeTemplateNames(templates: Array<CaseFlowTemplateDescriptor> | undefined): void;
22
+ /** Inserisce/aggiorna un singolo nome template in cache. */
23
+ export declare function primeTemplateName(templateId?: number, name?: string | null): void;
24
+ /** Nome dell'azione risolto da (cftid, actionID), oppure '' se sconosciuto. */
25
+ export declare function getActionNameSync(cftid?: number, actionID?: number): string;
26
+ /** Popola la cache dei nomi azione dalle azioni di un template. */
27
+ export declare function primeActionNames(template?: CaseFlowTemplateDescriptor | null): void;
28
+ /**
29
+ * TID del documento definito sull'azione del template, oppure `undefined` se
30
+ * l'azione non lavora su un documento (o il template non è ancora risolto).
31
+ */
32
+ export declare function getActionTidSync(cftid?: number, actionID?: number): number | undefined;
@@ -0,0 +1,116 @@
1
+ // =============================================================================
2
+ // CaseFlow — cache dei nomi denormalizzati (risolti dagli ID)
3
+ // -----------------------------------------------------------------------------
4
+ // I descrittori del SDK (@topconsultnpm/sdk-ts) espongono i CaseFlow nella loro
5
+ // forma PERSISTITA: i nomi di sola visualizzazione (nome azione, nomi utente,
6
+ // nome template) NON sono più campi del descrittore ma vanno risolti dagli ID al
7
+ // punto d'uso. Questo modulo tiene una cache condivisa userId→nome e
8
+ // templateId→nome, popolata a runtime e consultata sincronicamente dai
9
+ // componenti (direttamente o tramite gli hook in `useCaseflowNames`).
10
+ //
11
+ // Modulo PURO: dipende solo dal SDK, così può essere importato sia dagli
12
+ // helper (CaseflowUtils, servizi) sia dagli hook senza creare cicli.
13
+ // =============================================================================
14
+ import { UserListCacheService } from '@topconsultnpm/sdk-ts';
15
+ // ---- Nomi utente ------------------------------------------------------------
16
+ const userNameCache = new Map();
17
+ /** Nome utente già risolto, oppure '' se non ancora in cache. */
18
+ export function getUserNameSync(userId) {
19
+ return userId != null ? (userNameCache.get(userId) ?? '') : '';
20
+ }
21
+ /**
22
+ * Risolve (best-effort) i nomi degli utenti mancanti tramite la cache utenti del
23
+ * SDK e li memorizza. Ritorna quando tutti gli id richiesti sono in cache.
24
+ */
25
+ export async function ensureUserNames(userIds) {
26
+ const missing = [...new Set(userIds.filter((id) => id != null))]
27
+ .filter(id => !userNameCache.has(id));
28
+ if (missing.length === 0)
29
+ return;
30
+ await Promise.all(missing.map(async (id) => {
31
+ try {
32
+ const u = await UserListCacheService.GetAsync(id);
33
+ userNameCache.set(id, u?.name ?? `Utente ${id}`);
34
+ }
35
+ catch {
36
+ userNameCache.set(id, `Utente ${id}`);
37
+ }
38
+ }));
39
+ }
40
+ // ---- Nomi template ----------------------------------------------------------
41
+ const templateNameCache = new Map();
42
+ /** Nome del template risolto dal templateId (cftid), oppure '' se sconosciuto. */
43
+ export function getTemplateNameSync(templateId) {
44
+ return templateId != null ? (templateNameCache.get(templateId) ?? '') : '';
45
+ }
46
+ /**
47
+ * Nome del template per la VISUALIZZAZIONE. Come {@link getTemplateNameSync}, ma
48
+ * quando il template non è risolvibile (tipicamente perché l'istanza appartiene a
49
+ * un template NON visibile all'utente corrente) degrada su un fallback leggibile
50
+ * basato sull'ID (`Modello #<cftid>`) invece di lasciare il campo vuoto: l'istanza
51
+ * resta comunque mostrabile. Usare `getTemplateNameSync` per la logica/ricerca,
52
+ * questo per il rendering.
53
+ */
54
+ export function getTemplateDisplayName(templateId) {
55
+ if (templateId == null)
56
+ return '';
57
+ return templateNameCache.get(templateId) || `Modello #${templateId}`;
58
+ }
59
+ /** Popola la cache dei nomi template (da chiamare quando si caricano i template). */
60
+ export function primeTemplateNames(templates) {
61
+ for (const t of templates ?? []) {
62
+ if (t.id != null) {
63
+ templateNameCache.set(t.id, t.name ?? '');
64
+ primeActionNames(t);
65
+ }
66
+ }
67
+ }
68
+ /** Inserisce/aggiorna un singolo nome template in cache. */
69
+ export function primeTemplateName(templateId, name) {
70
+ if (templateId != null && name != null)
71
+ templateNameCache.set(templateId, name);
72
+ }
73
+ // ---- Nomi azione (per template) ---------------------------------------------
74
+ //
75
+ // L'array `actions` non viaggia nel payload leggero della RetrieveAll delle
76
+ // istanze: il nome dell'azione (di un workitem o dell'azione corrente) si risolve
77
+ // dalle azioni DEFINITE nel template, indicizzate per (cftid, actionID). La cache
78
+ // viene popolata quando un template viene caricato/risolto.
79
+ const actionNameCache = new Map();
80
+ const actionKey = (cftid, actionID) => `${cftid}:${actionID}`;
81
+ /** Nome dell'azione risolto da (cftid, actionID), oppure '' se sconosciuto. */
82
+ export function getActionNameSync(cftid, actionID) {
83
+ if (cftid == null || actionID == null)
84
+ return '';
85
+ return actionNameCache.get(actionKey(cftid, actionID)) ?? '';
86
+ }
87
+ /** Popola la cache dei nomi azione dalle azioni di un template. */
88
+ export function primeActionNames(template) {
89
+ const cftid = template?.id;
90
+ if (cftid == null)
91
+ return;
92
+ for (const a of template?.actions ?? []) {
93
+ if (a.id == null)
94
+ continue;
95
+ actionNameCache.set(actionKey(cftid, a.id), a.name ?? '');
96
+ if (a.actionTID != null && a.actionTID > 0)
97
+ actionTidCache.set(actionKey(cftid, a.id), a.actionTID);
98
+ }
99
+ }
100
+ // ---- TID documento per azione (per template) --------------------------------
101
+ //
102
+ // `actionTID` (il tipo documento su cui l'azione lavora: da firmare, da
103
+ // approvare, da caricare, da visionare) è autorato SUL TEMPLATE e NON viene
104
+ // materializzato sull'azione d'istanza (arriva 0). Come per i nomi azione, si
105
+ // tiene una cache indicizzata per (cftid, actionID), popolata insieme ad essi da
106
+ // {@link primeActionNames} quando un template viene caricato/risolto.
107
+ const actionTidCache = new Map();
108
+ /**
109
+ * TID del documento definito sull'azione del template, oppure `undefined` se
110
+ * l'azione non lavora su un documento (o il template non è ancora risolto).
111
+ */
112
+ export function getActionTidSync(cftid, actionID) {
113
+ if (cftid == null || actionID == null)
114
+ return undefined;
115
+ return actionTidCache.get(actionKey(cftid, actionID));
116
+ }
@@ -0,0 +1,61 @@
1
+ import { CaseFlowAction, CaseFlowInstanceDescriptor, CaseFlowWorkItem } from '@topconsultnpm/sdk-ts';
2
+ /** Nome dell'azione del workitem: dall'istanza se presente, altrimenti dal template. */
3
+ export declare const getWorkItemActionName: (cf: CaseFlowInstanceDescriptor, wi: CaseFlowWorkItem) => string;
4
+ /**
5
+ * TID del documento cui il workitem si riferisce (da firmare, approvare,
6
+ * caricare, visionare). Il workitem NON porta il TID: vive sull'azione
7
+ * (`actionTID`), che però il motore d'istanza non materializza (arriva 0).
8
+ * Si usa quindi il valore d'istanza solo se valorizzato, altrimenti quello
9
+ * autorato sul TEMPLATE (cache popolata quando il template viene risolto).
10
+ */
11
+ export declare const getWorkItemActionTid: (cf: CaseFlowInstanceDescriptor, wi: CaseFlowWorkItem) => number | undefined;
12
+ /**
13
+ * true se il workitem lavora su un DOCUMENTO (l'azione dichiara un `actionTID`).
14
+ * Discrimina, per esempio, un'approvazione documentale da un'approvazione di
15
+ * puro processo (una decisione senza documento allegato).
16
+ */
17
+ export declare const workItemRefersToDocument: (cf: CaseFlowInstanceDescriptor, wi: CaseFlowWorkItem) => boolean;
18
+ /**
19
+ * Documento su cui il workitem lavora: l'ULTIMO archiviato del tipo atteso (più
20
+ * recente per `creationTime`, a parità il DID più alto).
21
+ *
22
+ * Il workitem non porta TID/DID: il tipo arriva dall'azione (vedi
23
+ * {@link getWorkItemActionTid}) e il documento dai `dcmts` agganciati
24
+ * all'istanza. Serve l'istanza COMPLETA (quella delle liste può non portare i
25
+ * documenti) e il template già risolto, altrimenti il TID non è noto.
26
+ */
27
+ export declare const getWorkItemTargetDoc: (cf: CaseFlowInstanceDescriptor, wi: CaseFlowWorkItem) => {
28
+ tid: number;
29
+ did: number;
30
+ } | undefined;
31
+ /** Determina se un'azione di template è di tipo "Presa Visione". */
32
+ export declare function isAcknowledgmentAction(action: CaseFlowAction): boolean;
33
+ /** Determina se un workitem è di tipo "Presa Visione". */
34
+ export declare function isAcknowledgmentWorkItem(workItem: CaseFlowWorkItem): boolean;
35
+ /** Determina se un'azione di template è di tipo "Completamento dati". */
36
+ export declare function isDataCompletionAction(action: CaseFlowAction): boolean;
37
+ /** Determina se un workitem è di tipo "Completamento dati". */
38
+ export declare function isDataCompletionWorkItem(workItem: CaseFlowWorkItem): boolean;
39
+ /**
40
+ * Determina se un'azione di template è di tipo "Caricamento documento"
41
+ * (workitem informativo associato al completamento automatico).
42
+ */
43
+ export declare function isUploadAction(action: CaseFlowAction): boolean;
44
+ /**
45
+ * Determina se un workitem è di tipo "Caricamento documento": un promemoria
46
+ * senza pulsanti, che mostra solo la descrizione di ciò che l'utente deve fare.
47
+ *
48
+ * Il discriminante autorevole è il completamento automatico dell'azione
49
+ * (completionType=Automatic / autoTriggerType=DocumentUpload): questi campi
50
+ * vengono riportati sul workitem dall'azione corrispondente in fase di load.
51
+ * In subordine si considera la categoria Generic per retro-compatibilità.
52
+ */
53
+ export declare function isUploadWorkItem(workItem: CaseFlowWorkItem): boolean;
54
+ /** Determina se un workitem è di tipo "Firma". */
55
+ export declare function isSignatureWorkItem(workItem: CaseFlowWorkItem): boolean;
56
+ /**
57
+ * Determina se un workitem è una "Richiesta informazioni" (figlia): l'utente
58
+ * destinatario deve rispondere. Il discriminante è la categoria; il legame con
59
+ * il workitem principale è in `parentWorkItemID`.
60
+ */
61
+ export declare function isMoreInfoWorkItem(workItem: CaseFlowWorkItem): boolean;
@@ -0,0 +1,113 @@
1
+ import { CF_AutoTriggerTypes, CF_CompletionTypes, CF_WorkItemCategories } from '@topconsultnpm/sdk-ts';
2
+ import { getActionNameSync, getActionTidSync } from './caseFlowNameCache';
3
+ // =============================================================================
4
+ // Lettura dei workitem CaseFlow: categoria e documento di riferimento.
5
+ //
6
+ // Funzioni pure sui descrittori del SDK, usate sia dai componenti della libreria
7
+ // (il form del documento scopre da qui le attività su un TID/DID) sia
8
+ // dall'applicazione. Nessuna dipendenza dalla UI.
9
+ // =============================================================================
10
+ /** Nome dell'azione del workitem: dall'istanza se presente, altrimenti dal template. */
11
+ export const getWorkItemActionName = (cf, wi) => (cf.actions?.find(a => a.id === wi.actionID)?.name) || getActionNameSync(cf.cftid, wi.actionID);
12
+ /**
13
+ * TID del documento cui il workitem si riferisce (da firmare, approvare,
14
+ * caricare, visionare). Il workitem NON porta il TID: vive sull'azione
15
+ * (`actionTID`), che però il motore d'istanza non materializza (arriva 0).
16
+ * Si usa quindi il valore d'istanza solo se valorizzato, altrimenti quello
17
+ * autorato sul TEMPLATE (cache popolata quando il template viene risolto).
18
+ */
19
+ export const getWorkItemActionTid = (cf, wi) => {
20
+ // Quando il backend lo denormalizza, il TID arriva direttamente sul
21
+ // workitem: è il valore più specifico, ha la precedenza.
22
+ const wiTid = wi.actionTID;
23
+ if (wiTid != null && wiTid > 0)
24
+ return wiTid;
25
+ const instTid = cf.actions?.find(a => a.id === wi.actionID)?.actionTID;
26
+ if (instTid != null && instTid > 0)
27
+ return instTid;
28
+ const tplTid = getActionTidSync(cf.cftid, wi.actionID);
29
+ return tplTid != null && tplTid > 0 ? tplTid : undefined;
30
+ };
31
+ /**
32
+ * true se il workitem lavora su un DOCUMENTO (l'azione dichiara un `actionTID`).
33
+ * Discrimina, per esempio, un'approvazione documentale da un'approvazione di
34
+ * puro processo (una decisione senza documento allegato).
35
+ */
36
+ export const workItemRefersToDocument = (cf, wi) => getWorkItemActionTid(cf, wi) != null;
37
+ /**
38
+ * Documento su cui il workitem lavora: l'ULTIMO archiviato del tipo atteso (più
39
+ * recente per `creationTime`, a parità il DID più alto).
40
+ *
41
+ * Il workitem non porta TID/DID: il tipo arriva dall'azione (vedi
42
+ * {@link getWorkItemActionTid}) e il documento dai `dcmts` agganciati
43
+ * all'istanza. Serve l'istanza COMPLETA (quella delle liste può non portare i
44
+ * documenti) e il template già risolto, altrimenti il TID non è noto.
45
+ */
46
+ export const getWorkItemTargetDoc = (cf, wi) => {
47
+ const tid = getWorkItemActionTid(cf, wi);
48
+ if (tid == null)
49
+ return undefined;
50
+ const docs = (cf.dcmts ?? []).filter(d => d.tid === tid && d.did != null);
51
+ if (docs.length === 0)
52
+ return undefined;
53
+ const sorted = [...docs].sort((a, b) => {
54
+ const ta = a.creationTime?.getTime() ?? 0;
55
+ const tb = b.creationTime?.getTime() ?? 0;
56
+ if (tb !== ta)
57
+ return tb - ta; // più recente prima
58
+ return (b.did ?? 0) - (a.did ?? 0); // fallback: DID più alto
59
+ });
60
+ return { tid, did: sorted[0].did };
61
+ };
62
+ // ----- Categoria del workitem / dell'azione ----------------------------------
63
+ /** Determina se un'azione di template è di tipo "Presa Visione". */
64
+ export function isAcknowledgmentAction(action) {
65
+ return action.workItemCategory === CF_WorkItemCategories.Acknowledgment;
66
+ }
67
+ /** Determina se un workitem è di tipo "Presa Visione". */
68
+ export function isAcknowledgmentWorkItem(workItem) {
69
+ return workItem.workItemCategory === CF_WorkItemCategories.Acknowledgment;
70
+ }
71
+ /** Determina se un'azione di template è di tipo "Completamento dati". */
72
+ export function isDataCompletionAction(action) {
73
+ return action.workItemCategory === CF_WorkItemCategories.DataCompletion;
74
+ }
75
+ /** Determina se un workitem è di tipo "Completamento dati". */
76
+ export function isDataCompletionWorkItem(workItem) {
77
+ return workItem.workItemCategory === CF_WorkItemCategories.DataCompletion;
78
+ }
79
+ /**
80
+ * Determina se un'azione di template è di tipo "Caricamento documento"
81
+ * (workitem informativo associato al completamento automatico).
82
+ */
83
+ export function isUploadAction(action) {
84
+ return action.completionType === CF_CompletionTypes.Automatic
85
+ || action.autoTriggerType === CF_AutoTriggerTypes.DocumentUpload;
86
+ }
87
+ /**
88
+ * Determina se un workitem è di tipo "Caricamento documento": un promemoria
89
+ * senza pulsanti, che mostra solo la descrizione di ciò che l'utente deve fare.
90
+ *
91
+ * Il discriminante autorevole è il completamento automatico dell'azione
92
+ * (completionType=Automatic / autoTriggerType=DocumentUpload): questi campi
93
+ * vengono riportati sul workitem dall'azione corrispondente in fase di load.
94
+ * In subordine si considera la categoria Generic per retro-compatibilità.
95
+ */
96
+ export function isUploadWorkItem(workItem) {
97
+ const wi = workItem;
98
+ return wi.completionType === CF_CompletionTypes.Automatic
99
+ || wi.autoTriggerType === CF_AutoTriggerTypes.DocumentUpload
100
+ || workItem.workItemCategory === CF_WorkItemCategories.Generic;
101
+ }
102
+ /** Determina se un workitem è di tipo "Firma". */
103
+ export function isSignatureWorkItem(workItem) {
104
+ return workItem.workItemCategory === CF_WorkItemCategories.Signature;
105
+ }
106
+ /**
107
+ * Determina se un workitem è una "Richiesta informazioni" (figlia): l'utente
108
+ * destinatario deve rispondere. Il discriminante è la categoria; il legame con
109
+ * il workitem principale è in `parentWorkItemID`.
110
+ */
111
+ export function isMoreInfoWorkItem(workItem) {
112
+ return workItem.workItemCategory === CF_WorkItemCategories.MoreInfo;
113
+ }
@@ -1 +1,5 @@
1
1
  export * from './platform_services';
2
+ export * from './caseflow/CaseFlowService';
3
+ export * from './caseflow/CaseFlowTemplateCacheService';
4
+ export * from './caseflow/caseFlowNameCache';
5
+ export * from './caseflow/caseFlowWorkItemUtils';
@@ -1 +1,5 @@
1
1
  export * from './platform_services';
2
+ export * from './caseflow/CaseFlowService';
3
+ export * from './caseflow/CaseFlowTemplateCacheService';
4
+ export * from './caseflow/caseFlowNameCache';
5
+ export * from './caseflow/caseFlowWorkItemUtils';
@@ -6,7 +6,7 @@ export declare class PlatformObjectService {
6
6
  static readonly retrieveAllAdminAsync: (objClass: ObjectClasses, jobType?: JobTypes) => Promise<import("@topconsultnpm/sdk-ts").UserDescriptor[] | DcmtTypeDescriptor[] | import("@topconsultnpm/sdk-ts").RelationDescriptor[] | import("@topconsultnpm/sdk-ts").GroupDescriptor[] | import("@topconsultnpm/sdk-ts").AreaDescriptor[] | import("@topconsultnpm/sdk-ts").FEDistillerJobDescriptor[] | import("@topconsultnpm/sdk-ts").DataListDescriptor[] | import("@topconsultnpm/sdk-ts").DiskDescriptor[] | import("@topconsultnpm/sdk-ts").LDAPDescriptor[] | import("@topconsultnpm/sdk-ts").NumeratorDescriptor[] | ProcessDescriptor[] | import("@topconsultnpm/sdk-ts").SAPLoginDescriptor[] | import("@topconsultnpm/sdk-ts").SignCertDescriptor[] | import("@topconsultnpm/sdk-ts").SignServerDescriptor[] | import("@topconsultnpm/sdk-ts").TreeDescriptor[] | import("@topconsultnpm/sdk-ts").TSADescriptor[] | import("@topconsultnpm/sdk-ts").WFDescriptor[] | undefined>;
7
7
  private static readonly loadCacheForJobAsync;
8
8
  private static readonly retrieveAdminJobAsync;
9
- static readonly retrieveAdminAsync: (objClass: ObjectClasses, jobType: JobTypes, id: number) => Promise<import("@topconsultnpm/sdk-ts").UserDescriptor | import("@topconsultnpm/sdk-ts").WFDescriptor | DcmtTypeDescriptor | import("@topconsultnpm/sdk-ts").DataListDescriptor | import("@topconsultnpm/sdk-ts").RelationDescriptor | import("@topconsultnpm/sdk-ts").GroupDescriptor | import("@topconsultnpm/sdk-ts").SavedQueryDescriptor | import("@topconsultnpm/sdk-ts").AreaDescriptor | import("@topconsultnpm/sdk-ts").BasketTypeDescriptor | import("@topconsultnpm/sdk-ts").TaskDescriptor | import("@topconsultnpm/sdk-ts").WorkingGroupDescriptor | import("@topconsultnpm/sdk-ts").BarcodeArchiverJobDescriptor | import("@topconsultnpm/sdk-ts").BatchUpdaterJobDescriptor | import("@topconsultnpm/sdk-ts").CassettoDoganaleJobDescriptor | import("@topconsultnpm/sdk-ts").CassettoDoganalePlusJobDescriptor | import("@topconsultnpm/sdk-ts").CassettoDoganaleDistillerJobDescriptor | import("@topconsultnpm/sdk-ts").CassettoFiscaleQueryJobDescriptor | import("@topconsultnpm/sdk-ts").CassettoFiscaleSenderJobDescriptor | import("@topconsultnpm/sdk-ts").CheckSequenceJobDescriptor | import("@topconsultnpm/sdk-ts").COSCheckerJobDescriptor | import("@topconsultnpm/sdk-ts").DcmtConverterJobDescriptor | import("@topconsultnpm/sdk-ts").DcmtCreatorJobDescriptor | import("@topconsultnpm/sdk-ts").DcmtDeleterJobDescriptor | import("@topconsultnpm/sdk-ts").DcmtNoteJobDescriptor | import("@topconsultnpm/sdk-ts").DcmtPrinterJobDescriptor | import("@topconsultnpm/sdk-ts").FEAttacherJobDescriptor | import("@topconsultnpm/sdk-ts").FECreatorTxtJobDescriptor | import("@topconsultnpm/sdk-ts").FEDetacherJobDescriptor | import("@topconsultnpm/sdk-ts").FEDistillerJobDescriptor | import("@topconsultnpm/sdk-ts").FESenderWsJobDescriptor | import("@topconsultnpm/sdk-ts").FESplitterJobDescriptor | import("@topconsultnpm/sdk-ts").FEValidatorJobDescriptor | import("@topconsultnpm/sdk-ts").FileArchiverJobDescriptor | import("@topconsultnpm/sdk-ts").FileCheckerJobDescriptor | import("@topconsultnpm/sdk-ts").FileExecJobDescriptor | import("@topconsultnpm/sdk-ts").FileExportJobDescriptor | import("@topconsultnpm/sdk-ts").FileMoverJobDescriptor | import("@topconsultnpm/sdk-ts").LexJobDescriptor | import("@topconsultnpm/sdk-ts").LinkerJobDescriptor | import("@topconsultnpm/sdk-ts").MailArchiverJobDescriptor | import("@topconsultnpm/sdk-ts").MailQueryJobDescriptor | import("@topconsultnpm/sdk-ts").MailSenderJobDescriptor | import("@topconsultnpm/sdk-ts").MigrationJobDescriptor | import("@topconsultnpm/sdk-ts").OcrSixJobDescriptor | import("@topconsultnpm/sdk-ts").PdDCreatorJobDescriptor | import("@topconsultnpm/sdk-ts").PDFArchiverJobDescriptor | import("@topconsultnpm/sdk-ts").PdVArchiverJobDescriptor | import("@topconsultnpm/sdk-ts").PdVQueryJobDescriptor | import("@topconsultnpm/sdk-ts").PdVSenderJobDescriptor | import("@topconsultnpm/sdk-ts").PeppolQueryJobDescriptor | import("@topconsultnpm/sdk-ts").PeppolSenderJobDescriptor | import("@topconsultnpm/sdk-ts").PostelQueryJobDescriptor | import("@topconsultnpm/sdk-ts").PostelSenderJobDescriptor | import("@topconsultnpm/sdk-ts").ReplicatorJobDescriptor | import("@topconsultnpm/sdk-ts").SAPAlignerJobDescriptor | import("@topconsultnpm/sdk-ts").SAPBarcodeJobDescriptor | import("@topconsultnpm/sdk-ts").SAPDataReaderJobDescriptor | import("@topconsultnpm/sdk-ts").SAPDataWriterJobDescriptor | import("@topconsultnpm/sdk-ts").SignerJobDescriptor | import("@topconsultnpm/sdk-ts").SpoolArchiverJobDescriptor | import("@topconsultnpm/sdk-ts").UpdaterJobDescriptor | import("@topconsultnpm/sdk-ts").DiskDescriptor | import("@topconsultnpm/sdk-ts").LDAPDescriptor | import("@topconsultnpm/sdk-ts").NumeratorDescriptor | ProcessDescriptor | import("@topconsultnpm/sdk-ts").SAPLoginDescriptor | import("@topconsultnpm/sdk-ts").SignCertDescriptor | import("@topconsultnpm/sdk-ts").SignServerDescriptor | import("@topconsultnpm/sdk-ts").TreeDescriptor | import("@topconsultnpm/sdk-ts").TSADescriptor | undefined>;
9
+ static readonly retrieveAdminAsync: (objClass: ObjectClasses, jobType: JobTypes, id: number) => Promise<import("@topconsultnpm/sdk-ts").UserDescriptor | import("@topconsultnpm/sdk-ts").WFDescriptor | DcmtTypeDescriptor | import("@topconsultnpm/sdk-ts").DataListDescriptor | import("@topconsultnpm/sdk-ts").RelationDescriptor | import("@topconsultnpm/sdk-ts").GroupDescriptor | import("@topconsultnpm/sdk-ts").SavedQueryDescriptor | import("@topconsultnpm/sdk-ts").MailSenderJobDescriptor | import("@topconsultnpm/sdk-ts").AreaDescriptor | import("@topconsultnpm/sdk-ts").BasketTypeDescriptor | import("@topconsultnpm/sdk-ts").TaskDescriptor | import("@topconsultnpm/sdk-ts").WorkingGroupDescriptor | import("@topconsultnpm/sdk-ts").BarcodeArchiverJobDescriptor | import("@topconsultnpm/sdk-ts").BatchUpdaterJobDescriptor | import("@topconsultnpm/sdk-ts").CassettoDoganaleJobDescriptor | import("@topconsultnpm/sdk-ts").CassettoDoganalePlusJobDescriptor | import("@topconsultnpm/sdk-ts").CassettoDoganaleDistillerJobDescriptor | import("@topconsultnpm/sdk-ts").CassettoFiscaleQueryJobDescriptor | import("@topconsultnpm/sdk-ts").CassettoFiscaleSenderJobDescriptor | import("@topconsultnpm/sdk-ts").CheckSequenceJobDescriptor | import("@topconsultnpm/sdk-ts").COSCheckerJobDescriptor | import("@topconsultnpm/sdk-ts").DcmtConverterJobDescriptor | import("@topconsultnpm/sdk-ts").DcmtCreatorJobDescriptor | import("@topconsultnpm/sdk-ts").DcmtDeleterJobDescriptor | import("@topconsultnpm/sdk-ts").DcmtNoteJobDescriptor | import("@topconsultnpm/sdk-ts").DcmtPrinterJobDescriptor | import("@topconsultnpm/sdk-ts").FEAttacherJobDescriptor | import("@topconsultnpm/sdk-ts").FECreatorTxtJobDescriptor | import("@topconsultnpm/sdk-ts").FEDetacherJobDescriptor | import("@topconsultnpm/sdk-ts").FEDistillerJobDescriptor | import("@topconsultnpm/sdk-ts").FESenderWsJobDescriptor | import("@topconsultnpm/sdk-ts").FESplitterJobDescriptor | import("@topconsultnpm/sdk-ts").FEValidatorJobDescriptor | import("@topconsultnpm/sdk-ts").FileArchiverJobDescriptor | import("@topconsultnpm/sdk-ts").FileCheckerJobDescriptor | import("@topconsultnpm/sdk-ts").FileExecJobDescriptor | import("@topconsultnpm/sdk-ts").FileExportJobDescriptor | import("@topconsultnpm/sdk-ts").FileMoverJobDescriptor | import("@topconsultnpm/sdk-ts").LexJobDescriptor | import("@topconsultnpm/sdk-ts").LinkerJobDescriptor | import("@topconsultnpm/sdk-ts").MailArchiverJobDescriptor | import("@topconsultnpm/sdk-ts").MailQueryJobDescriptor | import("@topconsultnpm/sdk-ts").MigrationJobDescriptor | import("@topconsultnpm/sdk-ts").OcrSixJobDescriptor | import("@topconsultnpm/sdk-ts").PdDCreatorJobDescriptor | import("@topconsultnpm/sdk-ts").PDFArchiverJobDescriptor | import("@topconsultnpm/sdk-ts").PdVArchiverJobDescriptor | import("@topconsultnpm/sdk-ts").PdVQueryJobDescriptor | import("@topconsultnpm/sdk-ts").PdVSenderJobDescriptor | import("@topconsultnpm/sdk-ts").PeppolQueryJobDescriptor | import("@topconsultnpm/sdk-ts").PeppolSenderJobDescriptor | import("@topconsultnpm/sdk-ts").PostelQueryJobDescriptor | import("@topconsultnpm/sdk-ts").PostelSenderJobDescriptor | import("@topconsultnpm/sdk-ts").ReplicatorJobDescriptor | import("@topconsultnpm/sdk-ts").SAPAlignerJobDescriptor | import("@topconsultnpm/sdk-ts").SAPBarcodeJobDescriptor | import("@topconsultnpm/sdk-ts").SAPDataReaderJobDescriptor | import("@topconsultnpm/sdk-ts").SAPDataWriterJobDescriptor | import("@topconsultnpm/sdk-ts").SignerJobDescriptor | import("@topconsultnpm/sdk-ts").SpoolArchiverJobDescriptor | import("@topconsultnpm/sdk-ts").UpdaterJobDescriptor | import("@topconsultnpm/sdk-ts").DiskDescriptor | import("@topconsultnpm/sdk-ts").LDAPDescriptor | import("@topconsultnpm/sdk-ts").NumeratorDescriptor | ProcessDescriptor | import("@topconsultnpm/sdk-ts").SAPLoginDescriptor | import("@topconsultnpm/sdk-ts").SignCertDescriptor | import("@topconsultnpm/sdk-ts").SignServerDescriptor | import("@topconsultnpm/sdk-ts").TreeDescriptor | import("@topconsultnpm/sdk-ts").TSADescriptor | undefined>;
10
10
  private static readonly updateJobAsync;
11
11
  static readonly updateAsync: (objClass: ObjectClasses, jobType: JobTypes, d: any, ...args: any[]) => Promise<number | undefined>;
12
12
  private static readonly createJobAsync;