@topconsultnpm/sdkui-react 6.22.0-dev4.5 → 6.22.0-dev4.6

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.
@@ -3,8 +3,8 @@ import React, { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useSta
3
3
  import styled from 'styled-components';
4
4
  import { LoadIndicator } from 'devextreme-react';
5
5
  import { AppModules, DataColumnTypes, DataListViewModes, DcmtTypeListCacheService, LayoutCacheService, LayoutModes, MetadataDataDomains, SDK_Globals, SystemMIDsAsNumber, UserListCacheService, } from '@topconsultnpm/sdk-ts';
6
- import { customizeSearchByDisplayText, deepCompare, formatDateTimeByMetadataFormat, formatNumberByMetadataFormat, generateUniqueColumnKeys, genUniqueId, getColumnFormatInfo, getDateDisplayText, getNumberDisplayText, getSearchToolbarVisibility, IconAll, IconBoard, IconDcmtTypeSys, IconDelete, IconDuplicate, IconEdit, IconMenuVertical, IconPlatform, IconRefresh, IconSearchCheck, IconShow, isApprovalWorkflowView, isSign4TopEnabled, searchResultDescriptorToSimpleArray, searchResultToMetadataValues, SDKUI_Globals, SDKUI_Localizator, IconCloseOutline, getSearchResultPanelLayout, getSearchResultPanelLayoutSignature, hasSearchResultPanelLayout, saveSearchResultPanelLayout, subscribeSearchResultPanelLayout, DEFAULT_VIRTUAL_RENDERING_THRESHOLD } from '../../../helper';
7
- import { CounterItemKey } from '../../base/TMCounterContainer';
6
+ import { customizeSearchByDisplayText, deepCompare, formatDateTimeByMetadataFormat, formatNumberByMetadataFormat, generateUniqueColumnKeys, genUniqueId, getColumnFormatInfo, getDateDisplayText, getNumberDisplayText, getSearchToolbarVisibility, IconAll, IconBoard, IconDcmtTypeSys, IconDelete, IconDuplicate, IconEdit, IconMenuVertical, IconPlatform, IconRefresh, IconSearchCheck, IconShow, isApprovalWorkflowView, isSign4TopEnabled, searchResultDescriptorToSimpleArray, searchResultToMetadataValues, SDKUI_Globals, SDKUI_Localizator, IconCloseOutline, getSearchResultPanelLayout, getSearchResultPanelLayoutSignature, hasSearchResultPanelLayout, saveSearchResultPanelLayout, subscribeSearchResultPanelLayout, VIRTUAL_RENDERING_THRESHOLD } from '../../../helper';
7
+ import { CounterItemKey, formatCount } from '../../base/TMCounterContainer';
8
8
  import { getDcmtCicoStatus } from '../../../helper/checkinCheckoutManager';
9
9
  import { DcmtOperationTypes, SearchResultContext, } from '../../../ts';
10
10
  import { Gutters, TMColors } from '../../../utils/theme';
@@ -1403,15 +1403,14 @@ const TMSearchResultGrid = ({ openInOffice, fromDTD, operationItems, allUsers, i
1403
1403
  const gridSorting = useMemo(() => ({ mode: 'multiple' }), []);
1404
1404
  const gridSelection = useMemo(() => ({ mode: allowMultipleSelection ? 'multiple' : 'single' }), [allowMultipleSelection]);
1405
1405
  const useNativeScrollbar = SDKUI_Globals.userSettings?.themeSettings.gridSettings.useNativeScrollbar === 1;
1406
- // Con pagine grandi (oltre la soglia impostata, default 500 righe) il rendering virtuale delle righe evita di creare nel DOM tutte le righe della pagina.
1406
+ // Con pagine grandi (oltre VIRTUAL_RENDERING_THRESHOLD righe) il rendering virtuale delle righe evita di creare nel DOM tutte le righe della pagina.
1407
1407
  // Conta le righe effettive della pagina, non pageSize: con pochi risultati la griglia resta in rendering standard.
1408
- const virtualRenderingThreshold = SDKUI_Globals.userSettings.searchSettings?.virtualRenderingThreshold ?? DEFAULT_VIRTUAL_RENDERING_THRESHOLD;
1409
1408
  const pageRowCount = Math.min(pageSize, dataSource?.length ?? 0);
1410
1409
  const gridScrolling = useMemo(() => ({
1411
1410
  columnRenderingMode: 'virtual',
1412
- rowRenderingMode: pageRowCount > virtualRenderingThreshold ? 'virtual' : 'standard',
1411
+ rowRenderingMode: pageRowCount > VIRTUAL_RENDERING_THRESHOLD ? 'virtual' : 'standard',
1413
1412
  useNative: useNativeScrollbar
1414
- }), [useNativeScrollbar, pageRowCount, virtualRenderingThreshold]);
1413
+ }), [useNativeScrollbar, pageRowCount]);
1415
1414
  // Handles selection change in the data grid
1416
1415
  const handleSelectionChange = useCallback((e) => {
1417
1416
  if (onSelectionChanged === undefined)
@@ -1524,8 +1523,8 @@ const TMSearchResultGrid = ({ openInOffice, fromDTD, operationItems, allUsers, i
1524
1523
  [CounterItemKey.allItems, {
1525
1524
  key: CounterItemKey.allItems,
1526
1525
  show: true,
1527
- caption: `${dcmtsReturned} restituiti su ${dcmtsFound} trovati`,
1528
- value: `${dcmtsReturned}/${dcmtsFound}`,
1526
+ caption: `${formatCount(dcmtsReturned)} restituiti su ${formatCount(dcmtsFound)} trovati`,
1527
+ value: `${formatCount(dcmtsReturned)}/${formatCount(dcmtsFound)}`,
1529
1528
  icon: _jsx(IconAll, {}),
1530
1529
  order: -1
1531
1530
  }]
@@ -155,7 +155,7 @@ const TMViewHistoryDcmt = (props) => {
155
155
  let result = [];
156
156
  let i = 0;
157
157
  if (abortLocalController.signal.aborted) {
158
- result.push({ rowIndex: i, id1: currentDcmt.id, id2: currentDcmt.id, resultType: ResultTypes.WARNING, description: `Operazione interrotta. Elaborate ${i}` });
158
+ result.push({ rowIndex: i, id1: currentDcmt.id, id2: currentDcmt.id, resultType: ResultTypes.WARNING, description: SDKUI_Localizator.OperationItemsInterrupted.replaceParams(i) });
159
159
  }
160
160
  else {
161
161
  panel.setSubtitle(SDKUI_Localizator.Delete);
@@ -161,16 +161,19 @@ const TMTasksView = (props) => {
161
161
  const deletedTask = visualizedTasks.find(task => task.id === deletedTaskId);
162
162
  waitPanel.setSubtitle(SDKUI_Localizator.TaskXofY.replaceParams(i, rowIds.length));
163
163
  if (waitPanel.aborted) {
164
- result.push({ rowIndex: i, id1: deletedTaskId, id2: deletedTaskId, resultType: ResultTypes.WARNING, description: `Operazione interrotta. Elaborate ${i - 1} attività` });
165
- waitPanel.warning();
164
+ const description = SDKUI_Localizator.OperationItemsInterrupted.replaceParams(i - 1);
165
+ result.push({ rowIndex: i, id1: deletedTaskId, id2: deletedTaskId, resultType: ResultTypes.WARNING, description });
166
+ waitPanel.warning(1, description);
166
167
  break;
167
168
  }
168
169
  else {
170
+ // Messaggio per il popover del pannello: il nome dice a quale attività si riferisce.
171
+ const panelMessage = (message) => `${deletedTask?.name ?? `ID ${deletedTaskId}`}: ${message}`;
169
172
  try {
170
173
  const deletionNotAllowed = deletedTask?.fromID !== SDK_Globals.tmSession?.SessionDescr?.userID;
171
174
  if (deletionNotAllowed) {
172
175
  result.push({ rowIndex: key, id1: key, id2: 0, resultType: ResultTypes.ERROR, description: SDKUI_Localizator.OperationNotAllowed });
173
- waitPanel.error();
176
+ waitPanel.error(1, panelMessage(SDKUI_Localizator.OperationNotAllowed));
174
177
  }
175
178
  else {
176
179
  await SDK_Globals.tmSession?.NewTaskEngine().DeleteAsync(deletedTaskId);
@@ -180,8 +183,9 @@ const TMTasksView = (props) => {
180
183
  }
181
184
  }
182
185
  catch (err) {
183
- result.push({ rowIndex: key, id1: key, id2: 0, resultType: ResultTypes.ERROR, description: getExceptionMessage(err) });
184
- waitPanel.error();
186
+ const description = getExceptionMessage(err);
187
+ result.push({ rowIndex: key, id1: key, id2: 0, resultType: ResultTypes.ERROR, description });
188
+ waitPanel.error(1, panelMessage(description));
185
189
  }
186
190
  // Avanza a elaborazione conclusa: con una sola attività la barra non parte dal 100%
187
191
  await waitPanel.step();
@@ -235,8 +239,9 @@ const TMTasksView = (props) => {
235
239
  selectedTask.state = status;
236
240
  waitPanel.setSubtitle(SDKUI_Localizator.TaskXofY.replaceParams(i, rowIds.length));
237
241
  if (waitPanel.aborted) {
238
- result.push({ rowIndex: i, id1: selectedTask.id, id2: selectedTask.id, resultType: ResultTypes.WARNING, description: `Operazione interrotta. Elaborate ${i - 1} attività` });
239
- waitPanel.warning();
242
+ const description = SDKUI_Localizator.OperationItemsInterrupted.replaceParams(i - 1);
243
+ result.push({ rowIndex: i, id1: selectedTask.id, id2: selectedTask.id, resultType: ResultTypes.WARNING, description });
244
+ waitPanel.warning(1, description);
240
245
  break;
241
246
  }
242
247
  else {
@@ -246,8 +251,9 @@ const TMTasksView = (props) => {
246
251
  waitPanel.ok();
247
252
  }
248
253
  catch (err) {
249
- result.push({ rowIndex: key, id1: key, id2: 0, resultType: ResultTypes.ERROR, description: getExceptionMessage(err) });
250
- waitPanel.error();
254
+ const description = getExceptionMessage(err);
255
+ result.push({ rowIndex: key, id1: key, id2: 0, resultType: ResultTypes.ERROR, description });
256
+ waitPanel.error(1, `${selectedTask.name ?? `ID ${selectedTask.id}`}: ${description}`);
251
257
  }
252
258
  // Avanza a elaborazione conclusa: con una sola attività la barra non parte dal 100%
253
259
  await waitPanel.step();
@@ -248,9 +248,10 @@ const TMWGsCopyMoveForm = (props) => {
248
248
  id1: i + 1,
249
249
  id2: i + 1,
250
250
  resultType: ResultTypes.WARNING,
251
- description: SDKUI_Localizator.OperationFilesInterrupted.replaceParams(i + 1)
251
+ // Il controllo precede l'elemento i: quelli elaborati sono i, non i + 1.
252
+ description: SDKUI_Localizator.OperationItemsInterrupted.replaceParams(i)
252
253
  });
253
- waitPanel.warning();
254
+ waitPanel.warning(1, SDKUI_Localizator.OperationItemsInterrupted.replaceParams(i));
254
255
  break;
255
256
  }
256
257
  waitPanel.setSubtitle(`${i + 1}/${totalDrafts}`);
@@ -296,14 +297,17 @@ const TMWGsCopyMoveForm = (props) => {
296
297
  waitPanel.ok();
297
298
  }
298
299
  catch (err) {
300
+ const description = getExceptionMessage(err);
299
301
  result.push({
300
302
  rowIndex: i + 1,
301
303
  id1: item.DID ?? i + 1,
302
304
  id2: item.TID ?? i + 1,
303
305
  resultType: ResultTypes.ERROR,
304
- description: getExceptionMessage(err)
306
+ description
305
307
  });
306
- waitPanel.error();
308
+ // Bozza: nome del file; documento archiviato: DID.
309
+ const label = item.name ?? `DID ${item.DID ?? item.did}`;
310
+ waitPanel.error(1, `${label}: ${description}`);
307
311
  }
308
312
  await waitPanel.step();
309
313
  }
@@ -419,15 +423,15 @@ const TMWGsCopyMoveForm = (props) => {
419
423
  }, children: SDKUI_Localizator.Cancel })] })] }) });
420
424
  };
421
425
  export default TMWGsCopyMoveForm;
422
- const StepSpan = styled.span `
423
- color: ${({ $isCurrent, $isPast }) => ($isCurrent ? TMColors.primary : $isPast ? '#555' : '#888')};
424
- font-weight: ${({ $isCurrent }) => ($isCurrent ? 600 : 400)};
425
- cursor: ${({ $isPast }) => ($isPast ? 'pointer' : 'default')};
426
- transition: color 0.3s ease;
427
- &:hover {
428
- color: ${({ $isPast }) => ($isPast ? '#007bff' : undefined)};
429
- text-decoration: ${({ $isPast }) => ($isPast ? 'underline' : 'none')};
430
- }
426
+ const StepSpan = styled.span `
427
+ color: ${({ $isCurrent, $isPast }) => ($isCurrent ? TMColors.primary : $isPast ? '#555' : '#888')};
428
+ font-weight: ${({ $isCurrent }) => ($isCurrent ? 600 : 400)};
429
+ cursor: ${({ $isPast }) => ($isPast ? 'pointer' : 'default')};
430
+ transition: color 0.3s ease;
431
+ &:hover {
432
+ color: ${({ $isPast }) => ($isPast ? '#007bff' : undefined)};
433
+ text-decoration: ${({ $isPast }) => ($isPast ? 'underline' : 'none')};
434
+ }
431
435
  `;
432
436
  export const TMStepNavigator = (props) => {
433
437
  const { steps, currentStep, onStepChange } = props;
@@ -437,7 +437,7 @@ const TMBlogsPost = (props) => {
437
437
  let result = [];
438
438
  let i = 0;
439
439
  if (localAbortController.signal.aborted) {
440
- result.push({ rowIndex: i, id1: currentBlog.id, id2: currentBlog.id, resultType: ResultTypes.WARNING, description: `Operazione interrotta. Elaborate ${i}` });
440
+ result.push({ rowIndex: i, id1: currentBlog.id, id2: currentBlog.id, resultType: ResultTypes.WARNING, description: SDKUI_Localizator.OperationItemsInterrupted.replaceParams(i) });
441
441
  }
442
442
  else {
443
443
  panel.setSubtitle(operationTitle);
@@ -97,8 +97,9 @@ const TMPage = ({ id, objClass = ObjectClasses.None, listDisabled = false, lastR
97
97
  try {
98
98
  for (let i = 0; i < selectedItems.length; i++) {
99
99
  if (waitPanel.aborted) {
100
- result.push({ rowIndex: i, id1: selectedItems[i].id, id2: 0, resultType: ResultTypes.WARNING, description: `Operazione interrotta. Elaborati ${i} lavori` });
101
- waitPanel.warning();
100
+ const description = SDKUI_Localizator.OperationItemsInterrupted.replaceParams(i);
101
+ result.push({ rowIndex: i, id1: selectedItems[i].id, id2: 0, resultType: ResultTypes.WARNING, description });
102
+ waitPanel.warning(1, description);
102
103
  break;
103
104
  }
104
105
  waitPanel.setSubtitle(`Documento ${i + 1} di ${selectedItems.length}`);
@@ -108,8 +109,10 @@ const TMPage = ({ id, objClass = ObjectClasses.None, listDisabled = false, lastR
108
109
  waitPanel.ok();
109
110
  }
110
111
  catch (ex) {
111
- result.push({ rowIndex: i, id1: selectedItems[i].id, id2: 0, resultType: ResultTypes.ERROR, description: getExceptionMessage(ex) });
112
- waitPanel.error();
112
+ const description = getExceptionMessage(ex);
113
+ result.push({ rowIndex: i, id1: selectedItems[i].id, id2: 0, resultType: ResultTypes.ERROR, description });
114
+ const item = selectedItems[i];
115
+ waitPanel.error(1, `${item?.name ?? `ID ${item?.id}`}: ${description}`);
113
116
  }
114
117
  // Avanza a elaborazione conclusa: con un solo elemento la barra non parte dal 100%
115
118
  await waitPanel.step();
@@ -66,10 +66,10 @@ export declare class ThemeSettings {
66
66
  };
67
67
  }
68
68
  export declare const DEFAULT_PREVIEW_THRESHOLD = 500;
69
- export declare const DEFAULT_PAGE_SIZE = 100;
69
+ export declare const DEFAULT_PAGE_SIZE = 200;
70
70
  /** Oltre questo numero di righe per pagina la griglia dei risultati usa il rendering virtuale delle righe */
71
- export declare const DEFAULT_VIRTUAL_RENDERING_THRESHOLD = 500;
72
- export declare const DEFAULT_MAX_DCMTS_TO_BE_RETURNED = 200;
71
+ export declare const VIRTUAL_RENDERING_THRESHOLD = 500;
72
+ export declare const DEFAULT_MAX_DCMTS_TO_BE_RETURNED = 1000;
73
73
  export declare const DEFAULT_QUICK_SEARCH_MAX_DCMTS = 1000;
74
74
  /** Ricerca rapida configurata come sorgente alternativa dei valori distinti di un campo */
75
75
  export declare class DistinctValuesQuickSearchSettings {
@@ -90,7 +90,6 @@ export declare class SearchSettings {
90
90
  defaultTree: number;
91
91
  previewThreshold: number;
92
92
  pageSize: number;
93
- virtualRenderingThreshold: number;
94
93
  maxDcmtsToBeReturned: number;
95
94
  floatingMenuBar: FloatingMenuBarSettings;
96
95
  panelLayout: {
@@ -129,10 +129,10 @@ export class ThemeSettings {
129
129
  }
130
130
  }
131
131
  export const DEFAULT_PREVIEW_THRESHOLD = 500; // KB
132
- export const DEFAULT_PAGE_SIZE = 100;
132
+ export const DEFAULT_PAGE_SIZE = 200;
133
133
  /** Oltre questo numero di righe per pagina la griglia dei risultati usa il rendering virtuale delle righe */
134
- export const DEFAULT_VIRTUAL_RENDERING_THRESHOLD = 500;
135
- export const DEFAULT_MAX_DCMTS_TO_BE_RETURNED = 200;
134
+ export const VIRTUAL_RENDERING_THRESHOLD = 500;
135
+ export const DEFAULT_MAX_DCMTS_TO_BE_RETURNED = 1000;
136
136
  export const DEFAULT_QUICK_SEARCH_MAX_DCMTS = 1000;
137
137
  /** Ricerca rapida configurata come sorgente alternativa dei valori distinti di un campo */
138
138
  export class DistinctValuesQuickSearchSettings {
@@ -156,7 +156,6 @@ export class SearchSettings {
156
156
  this.defaultTree = -1;
157
157
  this.previewThreshold = DEFAULT_PREVIEW_THRESHOLD;
158
158
  this.pageSize = DEFAULT_PAGE_SIZE;
159
- this.virtualRenderingThreshold = DEFAULT_VIRTUAL_RENDERING_THRESHOLD;
160
159
  this.maxDcmtsToBeReturned = DEFAULT_MAX_DCMTS_TO_BE_RETURNED;
161
160
  this.floatingMenuBar = new FloatingMenuBarSettings();
162
161
  this.panelLayout = {};
@@ -37,6 +37,7 @@ export declare class SDKUI_Localizator {
37
37
  static get AllStates(): "All states" | "Alle Staaten" | "Todos los estados" | "Todos os estados" | "Tous les états" | "Tutti gli stati";
38
38
  static get AllowedValuesRange(): "Allowed values: from {{0}} to {{1}}" | "Valeurs autorisées : de {{0}} à {{1}}" | "Valores permitidos: de {{0}} a {{1}}" | "Valori consentiti: da {{0}} a {{1}}" | "Zulässige Werte: von {{0}} bis {{1}}";
39
39
  static get Alphabetic(): "Alfabetico" | "Alfabética" | "Alfabético" | "Alphabetic" | "Alphabetisch" | "Alphabétique";
40
+ static get AndOthersCount(): string;
40
41
  static get Anomalies(): "Anomalias" | "Anomalie" | "Anomalien" | "Anomalies" | "Anomalías";
41
42
  static get Answer(): "Answer" | "Antwort" | "Resposta" | "Respuesta" | "Risposta" | "Réponse";
42
43
  static get AnswerTooltip(): "A resposta só pode ser editada se o estado da atividade for \"Concluída\", \"Pendente\" ou \"Adiada\"." | "Die Antwort kann nur bearbeitet werden, wenn der Aktivitätsstatus \"Abgeschlossen\", \"Ausstehend\" oder \"Verschoben\" ist." | "La respuesta solo se puede editar si el estado de la actividad es \"Completada\", \"Pendiente\" o \"Pospuesta\"." | "La risposta può essere modificata solo se lo stato dell’attività è \"Completata\", \"In attesa\" o \"Rinviata\"." | "La réponse peut être modifiée uniquement si l'état de l’activité est \"Terminée\", \"En attente\" ou \"Reportée\"." | "The answer can be edited only if the activity status is \"Completed\", \"Pending\", or \"Deferred\".";
@@ -203,7 +204,6 @@ export declare class SDKUI_Localizator {
203
204
  static get Deletion(): string;
204
205
  static get DeletionCompletedSuccessfully(): "Deletion completed successfully" | "Eliminación completada con éxito" | "Eliminazione completata con successo" | "Exclusão concluída com sucesso" | "Löschung erfolgreich abgeschlossen" | "Suppression terminée avec succès";
205
206
  static get Deleted(): "Deleted" | "Eliminados" | "Eliminati" | "Excluídos" | "Gelöscht" | "Supprimés";
206
- static get DeletionOperationInterrupted(): "Deletion operation interrupted" | "Löschvorgang abgebrochen" | "Operación de eliminación interrumpida" | "Operazione di eliminazione interrotta" | "Operação de exclusão interrompida" | "Opération de suppression interrompue";
207
207
  static get Deny(): "Ablehnen" | "Denegar" | "Deny" | "Negar" | "Negato" | "Refuser";
208
208
  static get Description(): "Beschreibung" | "Descripción" | "Description" | "Descrizione" | "Descrição";
209
209
  static get DescriptionLengthExceededMessage(): "A descrição é demasiado longa: {{0}} caracteres a mais" | "Description is too long: {{0}} characters too many" | "Die Beschreibung ist zu lang: {{0}} Zeichen zu viel" | "La descripción es demasiado larga: {{0}} caracteres de más" | "La description est trop longue : {{0}} caractères en trop" | "La descrizione è troppo lunga: {{0}} caratteri in più";
@@ -279,7 +279,6 @@ export declare class SDKUI_Localizator {
279
279
  static get DuplicationCompletedSuccessfully(): "Duplicación completada con éxito" | "Duplication completed successfully" | "Duplication terminée avec succès" | "Duplicazione completata con successo" | "Duplicação concluída com sucesso" | "Duplikation erfolgreich abgeschlossen";
280
280
  static get DuplicateDocument(): string;
281
281
  static get DuplicateNameError(): "Der Name existiert bereits in der Anmeldehistorie. Bitte wählen Sie einen anderen Namen" | "El nombre ya existe en el historial de inicio de sesión. Por favor, elija un nombre diferente" | "Il nome esiste già nella cronologia di accesso. Si prega di scegliere un nome diverso" | "Le nom existe déjà dans l'historique de connexion. Veuillez choisir un autre nom" | "O nome já existe no histórico de login. Por favor, escolha um nome diferente" | "The name already exists in the login history. Please choose a different nam";
282
- static get DuplicationOperationInterrupted(): "Duplication operation interrupted" | "Duplikationsvorgang abgebrochen" | "Operación de duplicación interrumpida" | "Operazione di duplicazione interrotta" | "Operação de duplicação interrompida" | "Opération de duplication interrompue";
283
282
  static get DuplicateActivity(): string;
284
283
  static get Edit_ConfirmFor1(): "Are you sure you want to modify '{{0}}'?" | "Möchten Sie '{{0}}' ändern?" | "Sei sicuro di voler modificare '{{0}}'?" | "Você tem certeza que deseja modificar '{{0}}'?" | "¿Estás seguro de que deseas modificar '{{0}}'?" | "Êtes-vous sûr de vouloir modifier '{{0}}'?";
285
284
  static get Edit_ConfirmForN(): "{{0}} ausgewählte Objekte. Alle ändern?" | "{{0}} objetos seleccionados. ¿Modificar todos?" | "{{0}} objetos selecionados. Modificá-los todos?" | "{{0}} objets sélectionnés. Voulez-vous tous les modifier?" | "{{0}} oggetti selezionati. Modificare tutti?" | "{{0}} selected objects. Modify them all?";
@@ -490,6 +489,8 @@ export declare class SDKUI_Localizator {
490
489
  static get LastUpdateTime(): "Dernière modifie" | "Last update Time" | "Letzte Änderung" | "Ultima modifica" | "Última modificación" | "Última modificação";
491
490
  static get LastVersion(): string;
492
491
  static get Latest(): string;
492
+ static get LatestErrors(): string;
493
+ static get LatestWarnings(): string;
493
494
  static get LayoutRemoved(): string;
494
495
  static get LexProt(): "Lex protection" | "Lex-Schutz" | "Protección Lex" | "Protection Lex" | "Protezione Lex" | "Proteção Lex";
495
496
  static get Line(): "Ligne" | "Line" | "Linea" | "Linha" | "Linie" | "Línea";
@@ -545,6 +546,7 @@ export declare class SDKUI_Localizator {
545
546
  static get MetadataFormats_ShortTime(): "Heure brève" | "Hora breve" | "Hora curta" | "Kurze Stunde" | "Ora breve" | "Short time";
546
547
  static get MetadataFormats_UpperCase(): "Alle SHIFT" | "Todo MAYÚSCULA" | "Todos os CAPS" | "Tout MAJUSCULE" | "Tutto MAIUSCOLO" | "Upper case";
547
548
  static get MetadataOnlyDocument(): string;
549
+ static get MetadataPdfCreationFailed(): string;
548
550
  static get MetadataReferenceInsert(): "Add metadata reference" | "Entrez les métadonnée de référence" | "Inserisci riferimento metadato" | "Insira metadados de referência" | "Introducir referencia metadato" | "Metadaten-Referenz einfügen";
549
551
  static get MetadataRoot(): "Metadados raiz" | "Metadato radice" | "Metadato raíz" | "Methadatenstamm" | "Métadonnée racine" | "Root metadata";
550
552
  static get MetadataSelected(): "Ausgewählte Metadaten" | "Metadados selecionados" | "Metadati selezionati" | "Metadatos seleccionados" | "Métadonnées sélectionnées" | "Selected metadata";
@@ -623,7 +625,8 @@ export declare class SDKUI_Localizator {
623
625
  static get OnlyDID(): string;
624
626
  static get OnlyOnePdfOrConvertibleFileSelected(): string;
625
627
  static get OnlyOnePdfOrConvertibleFileMergeBlocked(): string;
626
- static get OperationFilesInterrupted(): string;
628
+ static get OperationDcmtsInterrupted(): string;
629
+ static get OperationItemsInterrupted(): string;
627
630
  static get OperationNotAllowed(): string;
628
631
  static get OperationResult(): "Esito operazione" | "Operation result" | "Operationsergebnis" | "Resultado da operação" | "Resultado de la operación" | "Résultat de l'opération";
629
632
  static get OperationSuccess(): "Operación completada con éxito" | "Operation completed successfully" | "Operazione completata con successo" | "Operação concluída com sucesso" | "Opération terminée avec succès" | "Vorgang erfolgreich abgeschlossen";
@@ -677,6 +680,7 @@ export declare class SDKUI_Localizator {
677
680
  static get PdfMergeError(): string;
678
681
  static get PdfMergeFeatureNotAvailable(): string;
679
682
  static get PdfMergedSavedInFolder(): string;
683
+ static get PerPage(): string;
680
684
  static get Pending(): "Ausstehend" | "En attente" | "In attesa" | "Pendente" | "Pendiente" | "Pending";
681
685
  static get Perms(): "Autorisations" | "Berechtigungen" | "Permessi" | "Permisos" | "Permissions" | "Permissão";
682
686
  static get PersonalTaskAssignmentMessage(): "Attività personale" | "Personal task" | "Persönliche Aufgabe" | "Tarea personal" | "Tarefa pessoal" | "Tâche personnelle";
@@ -763,6 +767,7 @@ export declare class SDKUI_Localizator {
763
767
  static get RestoreDownload(): string;
764
768
  static get ResultsPerPage(): string;
765
769
  static get RetrieveFile(): "Arquivos de recuperação" | "Dateiwiederherstellung" | "Recuperación archivos" | "Recupero file" | "Retrieve file" | "Récupération fichier";
770
+ static get RowNumber(): string;
766
771
  static get Rows(): "Linien" | "lignes" | "linhas" | "líneas" | "righe" | "rows";
767
772
  static get Save(): "Enregistre" | "Guardar" | "Salva" | "Salvar" | "Save" | "Speichern";
768
773
  static get SaveAndLogin(): string;
@@ -914,7 +919,6 @@ export declare class SDKUI_Localizator {
914
919
  static get UpdateCompletedSuccessfully(): "Actualización completada con éxito" | "Aggiornamento completato con successo" | "Aktualisierung erfolgreich abgeschlossen" | "Atualização concluída com sucesso" | "Mise à jour terminée avec succès" | "Update completed successfully";
915
920
  static get UpdateIn(): "Aggiorna in" | "Aktualisierung in" | "Atualizar em" | "Mettre à jour dans" | "Update in" | "interrumpir";
916
921
  static get UpdateInProgress(): "Aggiornamento in corso" | "Aktualisierung läuft" | "Atualização em andamento" | "Mise à jour en cours" | "Update in progress";
917
- static get UpdateOperationWasInterrupted(): "A operação de atualização foi interrompida" | "Der Updatevorgang wurde abgebrochen" | "L'operazione di aggiornamento è stata interrotta" | "L'opération de mise à jour a été interrompue" | "La operación de actualización fue interrumpida" | "The update operation was interrupted";
918
922
  static get Updating(): "Actualizar" | "Aktualisieren" | "Atualizar" | "Mise à jour" | "aggiornamento" | "updating";
919
923
  static get Upload_ConfirmFor1(): "Are you sure you want to upload '{{0}}'?" | "Möchten Sie '{{0}}' hochladen?" | "Sei sicuro di voler caricare '{{0}}'?" | "Você tem certeza que deseja enviar '{{0}}'?" | "¿Estás seguro de que deseas subir '{{0}}'?" | "Êtes-vous sûr de vouloir télécharger '{{0}}'?";
920
924
  static get Upload_ConfirmForN(): "{{0}} ausgewählte Objekte. Alle hochladen?" | "{{0}} objetos seleccionados. ¿Subir todos?" | "{{0}} objetos selecionados. Enviar todos?" | "{{0}} objets sélectionnés. Voulez-vous tous les télécharger?" | "{{0}} oggetti selezionati. Caricare tutti?" | "{{0}} selected objects. Upload them all?";
@@ -318,6 +318,16 @@ export class SDKUI_Localizator {
318
318
  default: return "Alfabetico";
319
319
  }
320
320
  }
321
+ static get AndOthersCount() {
322
+ switch (this._cultureID) {
323
+ case CultureIDs.De_DE: return "… und {{0}} weitere";
324
+ case CultureIDs.En_US: return "… and {{0}} more";
325
+ case CultureIDs.Es_ES: return "… y {{0}} más";
326
+ case CultureIDs.Fr_FR: return "… et {{0}} autres";
327
+ case CultureIDs.Pt_PT: return "… e mais {{0}}";
328
+ default: return "… e altri {{0}}";
329
+ }
330
+ }
321
331
  static get Anomalies() {
322
332
  switch (this._cultureID) {
323
333
  case CultureIDs.De_DE: return "Anomalien";
@@ -2022,16 +2032,6 @@ export class SDKUI_Localizator {
2022
2032
  default: return "Eliminati";
2023
2033
  }
2024
2034
  }
2025
- static get DeletionOperationInterrupted() {
2026
- switch (this._cultureID) {
2027
- case CultureIDs.De_DE: return "Löschvorgang abgebrochen";
2028
- case CultureIDs.En_US: return "Deletion operation interrupted";
2029
- case CultureIDs.Es_ES: return "Operación de eliminación interrumpida";
2030
- case CultureIDs.Fr_FR: return "Opération de suppression interrompue";
2031
- case CultureIDs.Pt_PT: return "Operação de exclusão interrompida";
2032
- default: return "Operazione di eliminazione interrotta";
2033
- }
2034
- }
2035
2035
  static get Deny() {
2036
2036
  switch (this._cultureID) {
2037
2037
  case CultureIDs.De_DE: return "Ablehnen";
@@ -2745,16 +2745,6 @@ export class SDKUI_Localizator {
2745
2745
  return "Il nome esiste già nella cronologia di accesso. Si prega di scegliere un nome diverso";
2746
2746
  }
2747
2747
  }
2748
- static get DuplicationOperationInterrupted() {
2749
- switch (this._cultureID) {
2750
- case CultureIDs.De_DE: return "Duplikationsvorgang abgebrochen";
2751
- case CultureIDs.En_US: return "Duplication operation interrupted";
2752
- case CultureIDs.Es_ES: return "Operación de duplicación interrumpida";
2753
- case CultureIDs.Fr_FR: return "Opération de duplication interrompue";
2754
- case CultureIDs.Pt_PT: return "Operação de duplicação interrompida";
2755
- default: return "Operazione di duplicazione interrotta";
2756
- }
2757
- }
2758
2748
  static get DuplicateActivity() {
2759
2749
  switch (this._cultureID) {
2760
2750
  case CultureIDs.De_DE: return "Aktivität duplizieren";
@@ -4868,6 +4858,26 @@ export class SDKUI_Localizator {
4868
4858
  default: return "Ultimi";
4869
4859
  }
4870
4860
  }
4861
+ static get LatestErrors() {
4862
+ switch (this._cultureID) {
4863
+ case CultureIDs.De_DE: return "Letzte Fehler";
4864
+ case CultureIDs.En_US: return "Latest errors";
4865
+ case CultureIDs.Es_ES: return "Últimos errores";
4866
+ case CultureIDs.Fr_FR: return "Dernières erreurs";
4867
+ case CultureIDs.Pt_PT: return "Últimos erros";
4868
+ default: return "Ultimi errori";
4869
+ }
4870
+ }
4871
+ static get LatestWarnings() {
4872
+ switch (this._cultureID) {
4873
+ case CultureIDs.De_DE: return "Letzte Warnungen";
4874
+ case CultureIDs.En_US: return "Latest warnings";
4875
+ case CultureIDs.Es_ES: return "Últimas advertencias";
4876
+ case CultureIDs.Fr_FR: return "Derniers avertissements";
4877
+ case CultureIDs.Pt_PT: return "Últimos avisos";
4878
+ default: return "Ultimi avvisi";
4879
+ }
4880
+ }
4871
4881
  static get LayoutRemoved() {
4872
4882
  switch (this._cultureID) {
4873
4883
  case CultureIDs.De_DE: return "Layout entfernt";
@@ -5409,6 +5419,16 @@ export class SDKUI_Localizator {
5409
5419
  default: return "Documento di soli metadati";
5410
5420
  }
5411
5421
  }
5422
+ static get MetadataPdfCreationFailed() {
5423
+ switch (this._cultureID) {
5424
+ case CultureIDs.De_DE: return "Erstellung der Metadaten-PDF fehlgeschlagen";
5425
+ case CultureIDs.En_US: return "Metadata PDF creation failed";
5426
+ case CultureIDs.Es_ES: return "Error al crear el PDF de metadatos";
5427
+ case CultureIDs.Fr_FR: return "Échec de la création du PDF des métadonnées";
5428
+ case CultureIDs.Pt_PT: return "Falha na criação do PDF de metadados";
5429
+ default: return "Creazione PDF metadati fallita";
5430
+ }
5431
+ }
5412
5432
  static get MetadataReferenceInsert() {
5413
5433
  switch (this._cultureID) {
5414
5434
  case CultureIDs.De_DE: return "Metadaten-Referenz einfügen";
@@ -6190,14 +6210,24 @@ export class SDKUI_Localizator {
6190
6210
  default: return "Tra i documenti selezionati è presente un solo file PDF o convertibile: per l'unione ne servono almeno {{0}}";
6191
6211
  }
6192
6212
  }
6193
- static get OperationFilesInterrupted() {
6213
+ static get OperationDcmtsInterrupted() {
6214
+ switch (this._cultureID) {
6215
+ case CultureIDs.De_DE: return `Vorgang unterbrochen. {{0}} Dokumente verarbeitet`;
6216
+ case CultureIDs.En_US: return `Operation interrupted. Processed {{0}} documents`;
6217
+ case CultureIDs.Es_ES: return `Operación interrumpida. Procesados {{0}} documentos`;
6218
+ case CultureIDs.Fr_FR: return `Opération interrompue. {{0}} documents traités`;
6219
+ case CultureIDs.Pt_PT: return `Operação interrompida. Processados {{0}} documentos`;
6220
+ default: return `Operazione interrotta. Elaborati {{0}} documenti`;
6221
+ }
6222
+ }
6223
+ static get OperationItemsInterrupted() {
6194
6224
  switch (this._cultureID) {
6195
- case CultureIDs.De_DE: return `Vorgang unterbrochen. {{0}} Dateien verarbeitet`;
6196
- case CultureIDs.En_US: return `Operation interrupted. Processed {{0}} files`;
6197
- case CultureIDs.Es_ES: return `Operación interrumpida. Procesados {{0}} archivos`;
6198
- case CultureIDs.Fr_FR: return `Opération interrompue. {{0}} fichiers traités`;
6199
- case CultureIDs.Pt_PT: return `Operação interrompida. Processados {{0}} arquivos`;
6200
- default: return `Operazione interrotta. Elaborati {{0}} files`;
6225
+ case CultureIDs.De_DE: return `Vorgang unterbrochen. {{0}} Elemente verarbeitet`;
6226
+ case CultureIDs.En_US: return `Operation interrupted. Processed {{0}} items`;
6227
+ case CultureIDs.Es_ES: return `Operación interrumpida. Procesados {{0}} elementos`;
6228
+ case CultureIDs.Fr_FR: return `Opération interrompue. {{0}} éléments traités`;
6229
+ case CultureIDs.Pt_PT: return `Operação interrompida. Processados {{0}} elementos`;
6230
+ default: return `Operazione interrotta. Elaborati {{0}} elementi`;
6201
6231
  }
6202
6232
  }
6203
6233
  static get OperationNotAllowed() {
@@ -6736,6 +6766,16 @@ export class SDKUI_Localizator {
6736
6766
  default: return "Il file PDF unito è stato salvato nella cartella \"{{0}}\"";
6737
6767
  }
6738
6768
  }
6769
+ static get PerPage() {
6770
+ switch (this._cultureID) {
6771
+ case CultureIDs.De_DE: return "pro Seite";
6772
+ case CultureIDs.En_US: return "per page";
6773
+ case CultureIDs.Es_ES: return "por página";
6774
+ case CultureIDs.Fr_FR: return "par page";
6775
+ case CultureIDs.Pt_PT: return "por página";
6776
+ default: return "per pagina";
6777
+ }
6778
+ }
6739
6779
  static get Pending() {
6740
6780
  switch (this._cultureID) {
6741
6781
  case CultureIDs.De_DE: return "Ausstehend";
@@ -7609,6 +7649,16 @@ export class SDKUI_Localizator {
7609
7649
  default: return "Recupero file";
7610
7650
  }
7611
7651
  }
7652
+ static get RowNumber() {
7653
+ switch (this._cultureID) {
7654
+ case CultureIDs.De_DE: return "Zeile {{0}}";
7655
+ case CultureIDs.En_US: return "Row {{0}}";
7656
+ case CultureIDs.Es_ES: return "Fila {{0}}";
7657
+ case CultureIDs.Fr_FR: return "Ligne {{0}}";
7658
+ case CultureIDs.Pt_PT: return "Linha {{0}}";
7659
+ default: return "Riga {{0}}";
7660
+ }
7661
+ }
7612
7662
  static get Rows() {
7613
7663
  switch (this._cultureID) {
7614
7664
  case CultureIDs.De_DE: return "Linien";
@@ -9132,16 +9182,6 @@ export class SDKUI_Localizator {
9132
9182
  default: return "Aggiornamento in corso";
9133
9183
  }
9134
9184
  }
9135
- static get UpdateOperationWasInterrupted() {
9136
- switch (this._cultureID) {
9137
- case CultureIDs.De_DE: return "Der Updatevorgang wurde abgebrochen";
9138
- case CultureIDs.En_US: return "The update operation was interrupted";
9139
- case CultureIDs.Es_ES: return "La operación de actualización fue interrumpida";
9140
- case CultureIDs.Fr_FR: return "L'opération de mise à jour a été interrompue";
9141
- case CultureIDs.Pt_PT: return "A operação de atualização foi interrompida";
9142
- default: return "L'operazione di aggiornamento è stata interrotta";
9143
- }
9144
- }
9145
9185
  static get Updating() {
9146
9186
  switch (this._cultureID) {
9147
9187
  case CultureIDs.De_DE: return "Aktualisieren";
@@ -121,6 +121,8 @@ export const useDcmtOperations = () => {
121
121
  if (waitPanelRef.current === panel)
122
122
  waitPanelRef.current = null;
123
123
  };
124
+ /** Messaggio per il popover delle pill del pannello: il DID dice a quale documento si riferisce. */
125
+ const panelMessage = (dcmt, message) => `DID ${dcmt.DID}: ${message}`;
124
126
  // Il pannello vive fuori dall'albero del chiamante: allo smontaggio va chiuso a mano.
125
127
  useEffect(() => () => { waitPanelRef.current?.close(); waitPanelRef.current = null; }, []);
126
128
  const { OpenFileDialog } = useFileDialog();
@@ -362,8 +364,9 @@ export const useDcmtOperations = () => {
362
364
  // continuare a scaricare dietro al dialogo.
363
365
  await panel.waitWhilePaused();
364
366
  if (abortController.signal.aborted) {
365
- results.push({ rowIndex: i, id1: dcmts[i].TID, id2: dcmts[i].DID, resultType: ResultTypes.WARNING, description: `Operazione interrotta. Elaborati ${completed} documenti` });
366
- panel.warning();
367
+ const description = SDKUI_Localizator.OperationDcmtsInterrupted.replaceParams(completed);
368
+ results.push({ rowIndex: i, id1: dcmts[i].TID, id2: dcmts[i].DID, resultType: ResultTypes.WARNING, description });
369
+ panel.warning(1, description);
367
370
  break;
368
371
  }
369
372
  try {
@@ -371,8 +374,9 @@ export const useDcmtOperations = () => {
371
374
  panel.ok();
372
375
  }
373
376
  catch (ex) {
374
- results.push({ rowIndex: i, id1: dcmts[i].TID, id2: dcmts[i].DID, resultType: ResultTypes.ERROR, description: getExceptionMessage(ex) });
375
- panel.error();
377
+ const description = getExceptionMessage(ex);
378
+ results.push({ rowIndex: i, id1: dcmts[i].TID, id2: dcmts[i].DID, resultType: ResultTypes.ERROR, description });
379
+ panel.error(1, panelMessage(dcmts[i], description));
376
380
  const err = ex;
377
381
  if (err.name === 'CanceledError') {
378
382
  ShowAlert({ message: err.message, mode: 'warning', duration: 3000, title: 'Abort' });
@@ -421,7 +425,7 @@ export const useDcmtOperations = () => {
421
425
  // Download the selected files
422
426
  for (let i = 0; i < selectedFiles.length; i++) {
423
427
  if (abortController.signal.aborted) {
424
- result.push({ rowIndex: i, id1: inputDcmts[i].TID, id2: inputDcmts[i].DID, resultType: ResultTypes.WARNING, description: `Operazione interrotta. Elaborati ${i + 1} documenti` });
428
+ result.push({ rowIndex: i, id1: inputDcmts[i].TID, id2: inputDcmts[i].DID, resultType: ResultTypes.WARNING, description: SDKUI_Localizator.OperationItemsInterrupted.replaceParams(i) });
425
429
  break;
426
430
  }
427
431
  let fd = files.find(f => f.name === selectedFiles[i]);
@@ -538,8 +542,9 @@ export const useDcmtOperations = () => {
538
542
  for (let i = 0; i < inputDcmts.length; i++) {
539
543
  await panel.waitWhilePaused();
540
544
  if (abortController.signal.aborted) {
541
- result.push({ rowIndex: i, id1: inputDcmts[i].TID, id2: inputDcmts[i].DID, resultType: ResultTypes.WARNING, description: `Operazione interrotta. Elaborati ${i + 1} documenti` });
542
- panel.warning();
545
+ const description = SDKUI_Localizator.OperationDcmtsInterrupted.replaceParams(i);
546
+ result.push({ rowIndex: i, id1: inputDcmts[i].TID, id2: inputDcmts[i].DID, resultType: ResultTypes.WARNING, description });
547
+ panel.warning(1, description);
543
548
  break;
544
549
  }
545
550
  try {
@@ -566,8 +571,9 @@ export const useDcmtOperations = () => {
566
571
  panel.ok();
567
572
  }
568
573
  catch (ex) {
569
- result.push({ rowIndex: i, id1: inputDcmts[i].TID, id2: inputDcmts[i].DID, resultType: ResultTypes.ERROR, description: getExceptionMessage(ex) });
570
- panel.error();
574
+ const description = getExceptionMessage(ex);
575
+ result.push({ rowIndex: i, id1: inputDcmts[i].TID, id2: inputDcmts[i].DID, resultType: ResultTypes.ERROR, description });
576
+ panel.error(1, panelMessage(inputDcmts[i], description));
571
577
  const err = ex;
572
578
  if (err.name === 'CanceledError') {
573
579
  ShowAlert({ message: err.message, mode: 'warning', duration: 3000, title: 'Abort' });
@@ -684,8 +690,9 @@ export const useDcmtOperations = () => {
684
690
  for (let i = 0; i < inputDcmts.length; i++) {
685
691
  await panel.waitWhilePaused();
686
692
  if (abortController.signal.aborted) {
687
- result.push({ rowIndex: i, id1: inputDcmts[i].TID, id2: inputDcmts[i].DID, resultType: ResultTypes.WARNING, description: `Operazione interrotta. Elaborati ${i + 1} documenti` });
688
- panel.warning();
693
+ const description = SDKUI_Localizator.OperationDcmtsInterrupted.replaceParams(i);
694
+ result.push({ rowIndex: i, id1: inputDcmts[i].TID, id2: inputDcmts[i].DID, resultType: ResultTypes.WARNING, description });
695
+ panel.warning(1, description);
689
696
  break;
690
697
  }
691
698
  panel.setSubtitle(`Documento ${i + 1} di ${inputDcmts.length}`);
@@ -793,6 +800,7 @@ export const useDcmtOperations = () => {
793
800
  const importWarnings = await importCertificatesAsync(inputDcmts[i], i, fetchRemoteCertificates, abortController.signal);
794
801
  if (importWarnings) {
795
802
  result.push(...importWarnings);
803
+ importWarnings.forEach(w => panel.warning(1, panelMessage(inputDcmts[i], w.description ?? '')));
796
804
  }
797
805
  break;
798
806
  }
@@ -803,12 +811,13 @@ export const useDcmtOperations = () => {
803
811
  catch (ex) {
804
812
  let msg = getExceptionMessage(ex);
805
813
  if (msg.startsWith('WARNING#')) {
806
- result.push({ rowIndex: i, id1: inputDcmts[i].TID, id2: inputDcmts[i].DID, resultType: ResultTypes.WARNING, description: msg.replace('WARNING#', '') });
807
- panel.warning();
814
+ const description = msg.replace('WARNING#', '');
815
+ result.push({ rowIndex: i, id1: inputDcmts[i].TID, id2: inputDcmts[i].DID, resultType: ResultTypes.WARNING, description });
816
+ panel.warning(1, panelMessage(inputDcmts[i], description));
808
817
  }
809
818
  else {
810
819
  result.push({ rowIndex: i, id1: inputDcmts[i].TID, id2: inputDcmts[i].DID, resultType: ResultTypes.ERROR, description: msg });
811
- panel.error();
820
+ panel.error(1, panelMessage(inputDcmts[i], msg));
812
821
  }
813
822
  const err = ex;
814
823
  if (err.name === 'CanceledError') {