@topconsultnpm/sdkui-react 6.22.0-dev3.24 → 6.22.0-dev3.25

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 (47) hide show
  1. package/lib/components/base/TMAlert.js +6 -8
  2. package/lib/components/base/TMAreaManager.js +53 -55
  3. package/lib/components/base/TMCustomButton.js +39 -48
  4. package/lib/components/base/TMTreeView.js +14 -0
  5. package/lib/components/base/waitPanel/TMWaitPanelConfirm.d.ts +12 -0
  6. package/lib/components/base/waitPanel/TMWaitPanelConfirm.js +185 -0
  7. package/lib/components/base/waitPanel/TMWaitPanelManager.d.ts +169 -0
  8. package/lib/components/base/waitPanel/TMWaitPanelManager.js +320 -0
  9. package/lib/components/base/waitPanel/TMWaitPanelView.d.ts +53 -0
  10. package/lib/components/base/waitPanel/TMWaitPanelView.js +274 -0
  11. package/lib/components/base/waitPanel/index.d.ts +1 -0
  12. package/lib/components/base/waitPanel/index.js +1 -0
  13. package/lib/components/choosers/TMPathChooser.js +17 -34
  14. package/lib/components/features/assistant/TMToppyDraggableHelpCenter.js +2 -2
  15. package/lib/components/features/documents/TMBatchUpdateForm.js +3 -4
  16. package/lib/components/features/documents/TMCopyToFolderForm.js +32 -35
  17. package/lib/components/features/documents/TMDcmtForm.js +48 -60
  18. package/lib/components/features/documents/TMDcmtIcon.d.ts +1 -3
  19. package/lib/components/features/documents/TMDcmtIcon.js +3 -5
  20. package/lib/components/features/documents/TMDcmtPreview.js +5 -3
  21. package/lib/components/features/documents/TMMasterDetailDcmts.d.ts +2 -0
  22. package/lib/components/features/documents/TMMasterDetailDcmts.js +45 -147
  23. package/lib/components/features/documents/TMMergeToPdfForm.js +48 -47
  24. package/lib/components/features/documents/TMMultiMasterDetailDcmtsForm.js +14 -15
  25. package/lib/components/features/documents/TMRelationViewer.d.ts +3 -14
  26. package/lib/components/features/documents/TMRelationViewer.js +115 -79
  27. package/lib/components/features/search/TMSearchResult.js +6 -8
  28. package/lib/components/features/search/TMViewHistoryDcmt.js +14 -25
  29. package/lib/components/features/tasks/TMTasksView.js +91 -90
  30. package/lib/components/features/wg/TMWGsCopyMoveForm.js +91 -91
  31. package/lib/components/grids/TMBlogsPost.js +92 -96
  32. package/lib/components/index.d.ts +2 -0
  33. package/lib/components/index.js +2 -0
  34. package/lib/components/pages/TMPage.js +29 -31
  35. package/lib/helper/SDKUI_Localizator.d.ts +7 -0
  36. package/lib/helper/SDKUI_Localizator.js +70 -0
  37. package/lib/helper/ZipManager.d.ts +1 -1
  38. package/lib/helper/ZipManager.js +2 -1
  39. package/lib/hooks/useCheckInOutOperations.d.ts +0 -6
  40. package/lib/hooks/useCheckInOutOperations.js +14 -34
  41. package/lib/hooks/useDcmtOperations.d.ts +3 -12
  42. package/lib/hooks/useDcmtOperations.js +130 -160
  43. package/lib/hooks/useDocumentOperations.js +12 -23
  44. package/lib/hooks/useMultiMasterDetailDcmts.d.ts +0 -15
  45. package/lib/hooks/useMultiMasterDetailDcmts.js +62 -65
  46. package/lib/hooks/useWorkflowApprove.js +33 -17
  47. package/package.json +1 -1
@@ -11,7 +11,8 @@ import { TMColors } from "../../utils/theme";
11
11
  import ShowAlert from "../base/TMAlert";
12
12
  import { TMMessageBoxManager, ButtonNames } from "../base/TMPopUp";
13
13
  import TMTooltip from "../base/TMTooltip";
14
- import { TMLayoutWaitingContainer } from "../base/TMWaitPanel";
14
+ import TMLayoutContainer from "../base/TMLayout";
15
+ import TMWaitPanelManager from "../base/waitPanel/TMWaitPanelManager";
15
16
  import TMHtmlContentDisplay from "../editors/TMHtmlContentDisplay";
16
17
  import TMDcmtForm from "../features/documents/TMDcmtForm";
17
18
  import { TMResultManager } from "../forms/TMResultDialog";
@@ -38,7 +39,7 @@ const TMBlogsPost = (props) => {
38
39
  isRefreshEnabled: false,
39
40
  isCreateContextualTask: false,
40
41
  }, showFloatingCommentButton = false, showCommentFormCallback, refreshCallback, showId, setShowId, refreshHomePageNews, markBlogAsRead, externalBlogPost, resetExternalBlogPost, visible = true, allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTaskCallback, editTaskCallback, afterTaskSaved, handleNavigateToWGs, handleNavigateToDossiers, handleNavigateToCaseflows, } = props;
41
- const { abortController, showWaitPanel, waitPanelTitle, showPrimary, waitPanelTextPrimary, waitPanelValuePrimary, waitPanelMaxValuePrimary, showSecondary, waitPanelTextSecondary, waitPanelValueSecondary, waitPanelMaxValueSecondary, downloadDcmtsAsync } = useDcmtOperations();
42
+ const { downloadDcmtsAsync } = useDcmtOperations();
42
43
  // Get the current device type (e.g., mobile, tablet, desktop) using a custom hook.
43
44
  const deviceType = useDeviceType();
44
45
  const bottomRef = useRef(null);
@@ -77,12 +78,6 @@ const TMBlogsPost = (props) => {
77
78
  const [menuVisible, setMenuVisible] = useState(false);
78
79
  const [menuPosition, setMenuPosition] = useState({ x: 0, y: 0 });
79
80
  const [menuItems, setMenuItems] = useState([]);
80
- const [localShowWaitPanel, setLocalShowWaitPanel] = useState(false);
81
- const [localWaitPanelTitle, setLocalWaitPanelTitle] = useState('');
82
- const [localShowPrimary, setLocalShowPrimary] = useState(false);
83
- const [localWaitPanelTextPrimary, setLocalWaitPanelTextPrimary] = useState('');
84
- const [localWaitPanelValuePrimary, setLocalWaitPanelValuePrimary] = useState(0);
85
- const [localWaitPanelMaxValuePrimary, setLocalWaitPanelMaxValuePrimary] = useState(0);
86
81
  const handleFocusedItem = (item) => {
87
82
  setFocusedAttachment(undefined);
88
83
  setFocusedItem(item);
@@ -430,18 +425,22 @@ const TMBlogsPost = (props) => {
430
425
  || (context.engine === 'DossierEngine' && !context.object.id)) {
431
426
  return Promise.resolve();
432
427
  }
433
- setLocalWaitPanelTitle(del ? SDKUI_Localizator.Delete : SDKUI_Localizator.Restore);
434
- setLocalShowWaitPanel(true);
435
- setLocalShowPrimary(true);
428
+ const operationTitle = del ? SDKUI_Localizator.Delete : SDKUI_Localizator.Restore;
436
429
  localAbortController = new AbortController();
430
+ const panel = TMWaitPanelManager.show({
431
+ title: operationTitle,
432
+ max: 1,
433
+ showCounters: false,
434
+ cancelable: true,
435
+ onAbort: () => localAbortController.abort(),
436
+ });
437
437
  let result = [];
438
438
  let i = 0;
439
- setLocalWaitPanelMaxValuePrimary(1);
440
439
  if (localAbortController.signal.aborted) {
441
440
  result.push({ rowIndex: i, id1: currentBlog.id, id2: currentBlog.id, resultType: ResultTypes.WARNING, description: `Operazione interrotta. Elaborate ${i}` });
442
441
  }
443
442
  else {
444
- setLocalWaitPanelTextPrimary(del ? SDKUI_Localizator.Delete : SDKUI_Localizator.Restore);
443
+ panel.setSubtitle(operationTitle);
445
444
  if (context.engine === 'WorkingGroupEngine' && context.object.id) {
446
445
  const workingGroupEngine = new WorkingGroupEngine(SDK_Globals.tmSession);
447
446
  await workingGroupEngine.BlogPostDeleteOrUndeleteAsync(context.object.id, currentBlog.id, del)
@@ -479,10 +478,7 @@ const TMBlogsPost = (props) => {
479
478
  });
480
479
  }
481
480
  }
482
- setLocalWaitPanelTextPrimary('');
483
- setLocalWaitPanelMaxValuePrimary(0);
484
- setLocalWaitPanelValuePrimary(0);
485
- setLocalShowWaitPanel(false);
481
+ panel.close();
486
482
  }
487
483
  });
488
484
  };
@@ -664,86 +660,86 @@ const TMBlogsPost = (props) => {
664
660
  console.warn(`Unhandled object type: ${ref.objClass}`);
665
661
  }
666
662
  };
667
- return _jsx("div", { ref: containerRef, style: { height: height, width: width }, children: _jsx(TMLayoutWaitingContainer, { direction: 'vertical', showWaitPanel: showWaitPanel, showWaitPanelPrimary: showPrimary, showWaitPanelSecondary: showSecondary, waitPanelTitle: waitPanelTitle, waitPanelTextPrimary: waitPanelTextPrimary, waitPanelValuePrimary: waitPanelValuePrimary, waitPanelMaxValuePrimary: waitPanelMaxValuePrimary, waitPanelTextSecondary: waitPanelTextSecondary, waitPanelValueSecondary: waitPanelValueSecondary, waitPanelMaxValueSecondary: waitPanelMaxValueSecondary, isCancelable: true, abortController: abortController, children: _jsxs(TMLayoutWaitingContainer, { direction: 'vertical', showWaitPanel: localShowWaitPanel, showWaitPanelPrimary: localShowPrimary, waitPanelTitle: localWaitPanelTitle, waitPanelTextPrimary: localWaitPanelTextPrimary, waitPanelValuePrimary: localWaitPanelValuePrimary, waitPanelMaxValuePrimary: localWaitPanelMaxValuePrimary, isCancelable: true, abortController: localAbortController, children: [_jsx(TMBlogHeader, { isVisible: currentHeader !== undefined && !isHeaderHidden, layoutMode: layoutMode, height: layoutMode === 'extended' ? "40px" : "70px", width: "100%", allPosts: posts, postsToShow: postsToShow, onPostsToShowChange: handlePostsToShowChange, categoryIdDataSource: categoryIdDataSource, appliedCategoryIdFilters: appliedCategoryIdFilters, setAppliedCategoryIdFilters: setAppliedCategoryIdFilters, searchText: searchText, onSearchChange: handleSearchChange }), _jsxs("div", { id: `${id}-blogs-wrapper`, onContextMenu: onContextMenu, style: {
668
- width: "100%",
669
- height: currentHeader !== undefined && !isHeaderHidden ? `calc(100% - ${layoutMode === 'extended' ? "40px" : "70px"})` : "100%",
670
- }, children: [blogPosts.length === 0 && _jsx(TMToppyMessage, { message: searchText.length > 0 ? SDKUI_Localizator.NoMessagesFound : SDKUI_Localizator.NoMessages }), blogPosts.length > 0 && _jsxs("div", { id: `${id}-blogs-container`, tabIndex: 0, onKeyDown: handleKeyDown, style: {
671
- height: '100%',
672
- width: '100%',
673
- outline: "none",
674
- display: "flex",
675
- flexDirection: "column",
676
- rowGap: "10px",
677
- overflowY: "auto",
678
- padding: "5px",
679
- backgroundColor: displayMode === 'stacked' ? "#e0e0e0" : "#fff"
680
- }, children: [blogPosts.map((blogPost) => {
681
- const isSelected = selectedItem.some(item => item.id === blogPost.id);
682
- const isFocused = focusedItem?.id === blogPost.id;
683
- const isHomeBlogPost = Boolean(blogPost.header?.trim());
684
- const isNew = Boolean(blogPost.newPosts ?? blogPost.customData1);
685
- const isOwnComment = blogPost.ownerID === SDK_Globals.tmSession?.SessionDescr?.userID;
686
- const isSys = blogPost.isSys === 1;
687
- return _jsxs(React.Fragment, { children: [(firstUnreadPost && blogPost.id === firstUnreadPost.id) && (_jsxs("div", { style: { display: 'flex', alignItems: 'center', width: '100%', color: TMColors.primary, fontWeight: '600', fontSize: '0.9rem', userSelect: 'none', marginTop: "12px", marginBottom: "12px" }, children: [_jsx("hr", { style: { flex: 1, border: 'none', borderTop: `1px solid ${TMColors.primary}`, marginRight: '15px' } }), _jsx("span", { children: SDKUI_Localizator.LastRead }), _jsx("hr", { style: { flex: 1, border: 'none', borderTop: `1px solid ${TMColors.primary}`, marginLeft: '15px' } })] })), _jsx(TMConditionalWrapper, { condition: displayMode === "chat", wrapper: children => _jsx("div", { style: {
688
- display: "flex",
689
- flexDirection: "row",
690
- alignItems: "flex-start",
691
- padding: "2px",
692
- borderRadius: "12px",
693
- cursor: "default",
694
- justifyContent: isOwnComment ? "flex-end" : "flex-start",
695
- }, children: _jsx("div", { style: {
696
- display: "flex",
697
- flexDirection: "column",
698
- alignItems: isOwnComment ? "flex-end" : "flex-start",
699
- textAlign: "left",
700
- maxWidth: '90%',
701
- borderRadius: '8px',
702
- }, children: children }) }), children: _jsxs("div", { id: `${id}-blogpost-${blogPost.id}`, onMouseEnter: () => handleMouseEnter(blogPost), onMouseLeave: handleMouseLeave, onClick: () => handleClick(blogPost), onDoubleClick: () => handleDoubleClick(blogPost), style: {
663
+ return _jsx("div", { ref: containerRef, style: { height: height, width: width }, children: _jsxs(TMLayoutContainer, { direction: 'vertical', children: [_jsx(TMBlogHeader, { isVisible: currentHeader !== undefined && !isHeaderHidden, layoutMode: layoutMode, height: layoutMode === 'extended' ? "40px" : "70px", width: "100%", allPosts: posts, postsToShow: postsToShow, onPostsToShowChange: handlePostsToShowChange, categoryIdDataSource: categoryIdDataSource, appliedCategoryIdFilters: appliedCategoryIdFilters, setAppliedCategoryIdFilters: setAppliedCategoryIdFilters, searchText: searchText, onSearchChange: handleSearchChange }), _jsxs("div", { id: `${id}-blogs-wrapper`, onContextMenu: onContextMenu, style: {
664
+ width: "100%",
665
+ height: currentHeader !== undefined && !isHeaderHidden ? `calc(100% - ${layoutMode === 'extended' ? "40px" : "70px"})` : "100%",
666
+ }, children: [blogPosts.length === 0 && _jsx(TMToppyMessage, { message: searchText.length > 0 ? SDKUI_Localizator.NoMessagesFound : SDKUI_Localizator.NoMessages }), blogPosts.length > 0 && _jsxs("div", { id: `${id}-blogs-container`, tabIndex: 0, onKeyDown: handleKeyDown, style: {
667
+ height: '100%',
668
+ width: '100%',
669
+ outline: "none",
670
+ display: "flex",
671
+ flexDirection: "column",
672
+ rowGap: "10px",
673
+ overflowY: "auto",
674
+ padding: "5px",
675
+ backgroundColor: displayMode === 'stacked' ? "#e0e0e0" : "#fff"
676
+ }, children: [blogPosts.map((blogPost) => {
677
+ const isSelected = selectedItem.some(item => item.id === blogPost.id);
678
+ const isFocused = focusedItem?.id === blogPost.id;
679
+ const isHomeBlogPost = Boolean(blogPost.header?.trim());
680
+ const isNew = Boolean(blogPost.newPosts ?? blogPost.customData1);
681
+ const isOwnComment = blogPost.ownerID === SDK_Globals.tmSession?.SessionDescr?.userID;
682
+ const isSys = blogPost.isSys === 1;
683
+ return _jsxs(React.Fragment, { children: [(firstUnreadPost && blogPost.id === firstUnreadPost.id) && (_jsxs("div", { style: { display: 'flex', alignItems: 'center', width: '100%', color: TMColors.primary, fontWeight: '600', fontSize: '0.9rem', userSelect: 'none', marginTop: "12px", marginBottom: "12px" }, children: [_jsx("hr", { style: { flex: 1, border: 'none', borderTop: `1px solid ${TMColors.primary}`, marginRight: '15px' } }), _jsx("span", { children: SDKUI_Localizator.LastRead }), _jsx("hr", { style: { flex: 1, border: 'none', borderTop: `1px solid ${TMColors.primary}`, marginLeft: '15px' } })] })), _jsx(TMConditionalWrapper, { condition: displayMode === "chat", wrapper: children => _jsx("div", { style: {
684
+ display: "flex",
685
+ flexDirection: "row",
686
+ alignItems: "flex-start",
687
+ padding: "2px",
688
+ borderRadius: "12px",
689
+ cursor: "default",
690
+ justifyContent: isOwnComment ? "flex-end" : "flex-start",
691
+ }, children: _jsx("div", { style: {
703
692
  display: "flex",
704
693
  flexDirection: "column",
705
- width: "100%",
706
- position: "relative",
707
- backgroundColor: isSelected ? "#135596"
708
- : displayMode === 'stacked' ? "#f9f9f9" : isOwnComment ? '#D9EFE0' : '#F3E6E6',
709
- transition: "all 0.2s ease",
710
- color: isSys ? "#ff0000" : isSelected ? "#ffffff" : TMColors.primary,
711
- borderRadius: "5px",
712
- padding: isHomeBlogPost ? '10px' : `10px ${isOwnComment ? '50px' : '10px'} 10px 10px`,
713
- borderLeft: "5px solid transparent",
714
- textDecoration: blogPost.isDel ? 'line-through' : 'none',
715
- boxShadow: isFocused ? "0 4px 12px rgba(19, 85, 150, 0.6)" : "none",
716
- cursor: 'pointer',
717
- }, children: [_jsx(BlogPostTitle, { displayMode: displayMode, layoutMode: layoutMode, blogPost: blogPost, isSelected: isSelected, isOwnComment: isOwnComment, searchText: searchText, isSys: isSys, isHomeBlogPost: isHomeBlogPost, showId: localShowId, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers, handleNavigateToCaseflows: handleNavigateToCaseflows }), isNew && _jsx(NewBadge, { layoutMode: layoutMode }), _jsx("div", { style: { fontSize: '1rem', color: "#000", marginTop: "10px", overflow: "hidden" }, children: _jsx(TMHtmlContentDisplay, { markup: blogPost.description ?? '-', searchText: searchText, isSelected: isSelected }) }), showExtendedAttachments && blogPost.attachments && blogPost.attachments.length > 0 && (_jsx(TMBlogAttachments, { attachments: blogPost.attachments, layoutMode: layoutMode, isSelected: isSelected, isLoading: !descriptorsLoaded, searchText: searchText, dcmtTypeDescriptors: dcmtTypeDescriptors, treeFs: treeFs, draftLatestInfoMap: draftLatestInfoMap, archivedDocumentMap: archivedDocumentMap, handleAttachmentFocus: handleFocusedAttachment, openDcmtForm: openDcmtForm }))] }, `${id}-blogpost-${blogPost.id}`) })] }, "blog-post-wrapper-" + id + "-" + blogPost.id);
718
- }), _jsx("div", { ref: bottomRef })] }), _jsx(TMContextMenu, { items: menuItems, target: `#${id}-blogs-wrapper`, externalControl: {
719
- visible: menuVisible,
720
- position: menuPosition,
721
- onClose: closeContextMenu,
722
- } }), (showTaskForm && handleNavigateToWGs && handleNavigateToDossiers && getAllTasks && deleteTaskByIdsCallback && addTaskCallback && editTaskCallback) && _jsx("div", { style: { height: "100%", width: "100%" }, children: _jsx(TMTaskForm, { id: -1, title: SDKUI_Localizator.ContextualTask, isModal: true, width: taskModalSizes(deviceType, FormModes.Create).width, height: taskModalSizes(deviceType, FormModes.Create).height, formMode: FormModes.Create, visualizedTasks: [], currentTask: currentTask, setCurrentTask: () => { }, selectedRowKeys: [], handleFocusedRowKeyChange: () => { }, onStatusChanged: () => { }, onSaved: onSavedTaskFormCallback, onClose: () => closeTaskFormCallback(), onCancel: () => closeTaskFormCallback(), usersList: participants, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers, isContextualCreate: true, taskContext: taskContext, allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback }) }), (dcmtForm.dcmt && dcmtForm.dcmt.TID && dcmtForm.dcmt.DID) && _jsx(TMDcmtForm, { TID: Number(dcmtForm.dcmt.TID), DID: Number(dcmtForm.dcmt.DID), layoutMode: LayoutModes.Update, onClose: closeDcmtForm, isClosable: true, titleModal: SDKUI_Localizator.Attachment + ": " + dcmtForm.dcmt.fileName, isModal: true, widthModal: "95%", heightModal: "95%", allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers, onReferenceClick: handleNavigateToReference, moreInfoTasks: getMoreInfoTasksForDocument(allTasks, Number(dcmtForm.dcmt.TID), Number(dcmtForm.dcmt.DID)) }), (showFloatingCommentButton && showCommentFormCallback && !(context?.engine === 'WorkingGroupEngine' && context?.object?.customData1 === 1)) && _jsx("button", { style: {
723
- position: 'absolute',
724
- bottom: '18px',
725
- right: '20px',
726
- width: '40px',
727
- height: '40px',
728
- borderRadius: "50%",
729
- backgroundColor: "#C2388B",
730
- color: '#fff',
731
- border: 'none',
732
- cursor: 'pointer',
733
- boxShadow: '0 2px 6px rgba(0,0,0,0.2)',
734
- zIndex: 1000,
735
- transition: 'background-color 0.3s ease, transform 0.2s ease',
736
- display: 'flex',
737
- justifyContent: 'center',
738
- alignItems: 'center',
739
- }, onMouseEnter: (e) => {
740
- e.currentTarget.style.backgroundColor = '#D94A9F';
741
- e.currentTarget.style.transform = 'scale(1.1)';
742
- e.currentTarget.style.boxShadow = '0 4px 12px rgba(37, 89, 165, 0.6)';
743
- }, onMouseLeave: (e) => {
744
- e.currentTarget.style.backgroundColor = "#C2388B";
745
- e.currentTarget.style.transform = 'scale(1)';
746
- e.currentTarget.style.boxShadow = '0 2px 6px rgba(0,0,0,0.2)';
747
- }, onClick: () => { showCommentFormCallback(undefined); }, children: _jsx(TMTooltip, { content: SDKUI_Localizator.AddNewComment, children: _jsx("i", { className: "dx-icon-chat", style: { fontSize: '25px' } }) }) })] })] }) }) });
694
+ alignItems: isOwnComment ? "flex-end" : "flex-start",
695
+ textAlign: "left",
696
+ maxWidth: '90%',
697
+ borderRadius: '8px',
698
+ }, children: children }) }), children: _jsxs("div", { id: `${id}-blogpost-${blogPost.id}`, onMouseEnter: () => handleMouseEnter(blogPost), onMouseLeave: handleMouseLeave, onClick: () => handleClick(blogPost), onDoubleClick: () => handleDoubleClick(blogPost), style: {
699
+ display: "flex",
700
+ flexDirection: "column",
701
+ width: "100%",
702
+ position: "relative",
703
+ backgroundColor: isSelected ? "#135596"
704
+ : displayMode === 'stacked' ? "#f9f9f9" : isOwnComment ? '#D9EFE0' : '#F3E6E6',
705
+ transition: "all 0.2s ease",
706
+ color: isSys ? "#ff0000" : isSelected ? "#ffffff" : TMColors.primary,
707
+ borderRadius: "5px",
708
+ padding: isHomeBlogPost ? '10px' : `10px ${isOwnComment ? '50px' : '10px'} 10px 10px`,
709
+ borderLeft: "5px solid transparent",
710
+ textDecoration: blogPost.isDel ? 'line-through' : 'none',
711
+ boxShadow: isFocused ? "0 4px 12px rgba(19, 85, 150, 0.6)" : "none",
712
+ cursor: 'pointer',
713
+ }, children: [_jsx(BlogPostTitle, { displayMode: displayMode, layoutMode: layoutMode, blogPost: blogPost, isSelected: isSelected, isOwnComment: isOwnComment, searchText: searchText, isSys: isSys, isHomeBlogPost: isHomeBlogPost, showId: localShowId, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers, handleNavigateToCaseflows: handleNavigateToCaseflows }), isNew && _jsx(NewBadge, { layoutMode: layoutMode }), _jsx("div", { style: { fontSize: '1rem', color: "#000", marginTop: "10px", overflow: "hidden" }, children: _jsx(TMHtmlContentDisplay, { markup: blogPost.description ?? '-', searchText: searchText, isSelected: isSelected }) }), showExtendedAttachments && blogPost.attachments && blogPost.attachments.length > 0 && (_jsx(TMBlogAttachments, { attachments: blogPost.attachments, layoutMode: layoutMode, isSelected: isSelected, isLoading: !descriptorsLoaded, searchText: searchText, dcmtTypeDescriptors: dcmtTypeDescriptors, treeFs: treeFs, draftLatestInfoMap: draftLatestInfoMap, archivedDocumentMap: archivedDocumentMap, handleAttachmentFocus: handleFocusedAttachment, openDcmtForm: openDcmtForm }))] }, `${id}-blogpost-${blogPost.id}`) })] }, "blog-post-wrapper-" + id + "-" + blogPost.id);
714
+ }), _jsx("div", { ref: bottomRef })] }), _jsx(TMContextMenu, { items: menuItems, target: `#${id}-blogs-wrapper`, externalControl: {
715
+ visible: menuVisible,
716
+ position: menuPosition,
717
+ onClose: closeContextMenu,
718
+ } }), (showTaskForm && handleNavigateToWGs && handleNavigateToDossiers && getAllTasks && deleteTaskByIdsCallback && addTaskCallback && editTaskCallback) && _jsx("div", { style: { height: "100%", width: "100%" }, children: _jsx(TMTaskForm, { id: -1, title: SDKUI_Localizator.ContextualTask, isModal: true, width: taskModalSizes(deviceType, FormModes.Create).width, height: taskModalSizes(deviceType, FormModes.Create).height, formMode: FormModes.Create, visualizedTasks: [], currentTask: currentTask, setCurrentTask: () => { }, selectedRowKeys: [], handleFocusedRowKeyChange: () => { }, onStatusChanged: () => { }, onSaved: onSavedTaskFormCallback, onClose: () => closeTaskFormCallback(), onCancel: () => closeTaskFormCallback(), usersList: participants, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers, isContextualCreate: true, taskContext: taskContext, allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback }) }), (dcmtForm.dcmt && dcmtForm.dcmt.TID && dcmtForm.dcmt.DID) && _jsx(TMDcmtForm, { TID: Number(dcmtForm.dcmt.TID), DID: Number(dcmtForm.dcmt.DID), layoutMode: LayoutModes.Update, onClose: closeDcmtForm, isClosable: true, titleModal: SDKUI_Localizator.Attachment + ": " + dcmtForm.dcmt.fileName, isModal: true, widthModal: "95%", heightModal: "95%", allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers, onReferenceClick: handleNavigateToReference, moreInfoTasks: getMoreInfoTasksForDocument(allTasks, Number(dcmtForm.dcmt.TID), Number(dcmtForm.dcmt.DID)) }), (showFloatingCommentButton && showCommentFormCallback && !(context?.engine === 'WorkingGroupEngine' && context?.object?.customData1 === 1)) && _jsx("button", { style: {
719
+ position: 'absolute',
720
+ bottom: '18px',
721
+ right: '20px',
722
+ width: '40px',
723
+ height: '40px',
724
+ borderRadius: "50%",
725
+ backgroundColor: "#C2388B",
726
+ color: '#fff',
727
+ border: 'none',
728
+ cursor: 'pointer',
729
+ boxShadow: '0 2px 6px rgba(0,0,0,0.2)',
730
+ zIndex: 1000,
731
+ transition: 'background-color 0.3s ease, transform 0.2s ease',
732
+ display: 'flex',
733
+ justifyContent: 'center',
734
+ alignItems: 'center',
735
+ }, onMouseEnter: (e) => {
736
+ e.currentTarget.style.backgroundColor = '#D94A9F';
737
+ e.currentTarget.style.transform = 'scale(1.1)';
738
+ e.currentTarget.style.boxShadow = '0 4px 12px rgba(37, 89, 165, 0.6)';
739
+ }, onMouseLeave: (e) => {
740
+ e.currentTarget.style.backgroundColor = "#C2388B";
741
+ e.currentTarget.style.transform = 'scale(1)';
742
+ e.currentTarget.style.boxShadow = '0 2px 6px rgba(0,0,0,0.2)';
743
+ }, onClick: () => { showCommentFormCallback(undefined); }, children: _jsx(TMTooltip, { content: SDKUI_Localizator.AddNewComment, children: _jsx("i", { className: "dx-icon-chat", style: { fontSize: '25px' } }) }) })] })] }) });
748
744
  };
749
745
  export default TMBlogsPost;
@@ -7,8 +7,10 @@ export { default as TMList } from './base/TMList';
7
7
  export { default as TMModal } from './base/TMModal';
8
8
  export * from './base/TMPopUp';
9
9
  export * from './base/TMLayout';
10
+ export { default as TMLayoutContainer } from './base/TMLayout';
10
11
  export * from './base/Styled';
11
12
  export * from './base/TMWaitPanel';
13
+ export * from './base/waitPanel';
12
14
  export * from './base/TMToolbarCard';
13
15
  export * from './base/TMRightSidebar';
14
16
  export * from './base/TMTreeView';
@@ -8,8 +8,10 @@ export { default as TMList } from './base/TMList';
8
8
  export { default as TMModal } from './base/TMModal';
9
9
  export * from './base/TMPopUp';
10
10
  export * from './base/TMLayout';
11
+ export { default as TMLayoutContainer } from './base/TMLayout';
11
12
  export * from './base/Styled';
12
13
  export * from './base/TMWaitPanel';
14
+ export * from './base/waitPanel';
13
15
  export * from './base/TMToolbarCard';
14
16
  export * from './base/TMRightSidebar';
15
17
  export * from './base/TMTreeView';
@@ -14,9 +14,8 @@ import { FontSize, TMColors } from "../../utils/theme";
14
14
  import selectionManagerImage from '../../assets/multipleSelectionManager.jpg';
15
15
  import { DeviceType, useDeviceType } from "../base/TMDeviceProvider";
16
16
  import { TMResultManager } from "../forms/TMResultDialog";
17
- import { TMLayoutWaitingContainer } from "../base/TMWaitPanel";
17
+ import TMWaitPanelManager from "../base/waitPanel/TMWaitPanelManager";
18
18
  import TMToolbarCard from "../base/TMToolbarCard";
19
- let abortController = new AbortController();
20
19
  const TMPage = ({ id, objClass = ObjectClasses.None, listDisabled = false, lastRefreshTime, objType, listInsteadOfContent, detailInsteadOfContent, routePage, customButtons, customColumns, searchText, detailForm, detailTitlePathKeys, deps, onSelectionChanged, onCountersChanged }) => {
21
20
  const deviceType = useDeviceType();
22
21
  let gridInstance;
@@ -28,12 +27,6 @@ const TMPage = ({ id, objClass = ObjectClasses.None, listDisabled = false, lastR
28
27
  const [selectedItems, setSelectedItems] = useState([]);
29
28
  const [visibleItems, setVisibleItems] = useState([]);
30
29
  const [formMode, setFormMode] = useState(FormModes.Update);
31
- const [showWaitPanel, setShowWaitPanel] = useState(false);
32
- const [waitPanelTitle, setWaitPanelTitle] = useState('');
33
- const [showPrimary, setShowPrimary] = useState(false);
34
- const [waitPanelTextPrimary, setWaitPanelTextPrimary] = useState('');
35
- const [waitPanelValuePrimary, setWaitPanelValuePrimary] = useState(0);
36
- const [waitPanelMaxValuePrimary, setWaitPanelMaxValuePrimary] = useState(0);
37
30
  let objName = PlatformObjectService.getName(objClass, objType);
38
31
  let objNames = PlatformObjectService.getName(objClass, objType, true);
39
32
  useEffect(() => { gridInstance?.instance().searchByText(searchText ?? ''); }, [searchText]);
@@ -95,31 +88,36 @@ const TMPage = ({ id, objClass = ObjectClasses.None, listDisabled = false, lastR
95
88
  break;
96
89
  }
97
90
  const doOperationAsync = async () => {
98
- setShowWaitPanel(true);
99
- setShowPrimary(true);
100
- setWaitPanelTitle(operationTitle);
101
- abortController = new AbortController();
91
+ const waitPanel = TMWaitPanelManager.show({
92
+ title: operationTitle,
93
+ max: selectedItems.length,
94
+ cancelable: true,
95
+ });
102
96
  let result = [];
103
- setWaitPanelMaxValuePrimary(selectedItems.length);
104
- for (let i = 0; i < selectedItems.length; i++) {
105
- if (abortController.signal.aborted) {
106
- result.push({ rowIndex: i, id1: selectedItems[i].id, id2: 0, resultType: ResultTypes.WARNING, description: `Operazione interrotta. Elaborati ${i + 1} lavori` });
107
- break;
108
- }
109
- setWaitPanelValuePrimary(i + 1);
110
- setWaitPanelTextPrimary(`Documento ${i + 1} di ${selectedItems.length}`);
111
- try {
112
- await PlatformObjectService.deleteAsync(objClass, selectedItems[i]?.id);
113
- result.push({ rowIndex: i, id1: selectedItems[i].id, id2: 0, description: objType?.toString(), resultType: ResultTypes.SUCCESS });
114
- }
115
- catch (ex) {
116
- result.push({ rowIndex: i, id1: selectedItems[i].id, id2: 0, resultType: ResultTypes.ERROR, description: getExceptionMessage(ex) });
97
+ try {
98
+ for (let i = 0; i < selectedItems.length; i++) {
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();
102
+ break;
103
+ }
104
+ waitPanel.setSubtitle(`Documento ${i + 1} di ${selectedItems.length}`);
105
+ try {
106
+ await PlatformObjectService.deleteAsync(objClass, selectedItems[i]?.id);
107
+ result.push({ rowIndex: i, id1: selectedItems[i].id, id2: 0, description: objType?.toString(), resultType: ResultTypes.SUCCESS });
108
+ waitPanel.ok();
109
+ }
110
+ catch (ex) {
111
+ result.push({ rowIndex: i, id1: selectedItems[i].id, id2: 0, resultType: ResultTypes.ERROR, description: getExceptionMessage(ex) });
112
+ waitPanel.error();
113
+ }
114
+ // Avanza a elaborazione conclusa: con un solo elemento la barra non parte dal 100%
115
+ await waitPanel.step();
117
116
  }
118
117
  }
119
- setWaitPanelMaxValuePrimary(0);
120
- setWaitPanelValuePrimary(0);
121
- setWaitPanelTextPrimary('');
122
- setShowWaitPanel(false);
118
+ finally {
119
+ waitPanel.close();
120
+ }
123
121
  TMResultManager.show(result, operationTitle, "JobID", undefined);
124
122
  await loadDataAsync();
125
123
  };
@@ -208,7 +206,7 @@ const TMPage = ({ id, objClass = ObjectClasses.None, listDisabled = false, lastR
208
206
  });
209
207
  };
210
208
  const cellRenderObjectIcon = (data) => { return PlatformObjectService.getIcon(objClass, data.row.data); };
211
- return (_jsx(TMLayoutWaitingContainer, { direction: 'vertical', showWaitPanel: showWaitPanel, showWaitPanelPrimary: showPrimary, waitPanelTitle: waitPanelTitle, waitPanelTextPrimary: waitPanelTextPrimary, waitPanelValuePrimary: waitPanelValuePrimary, waitPanelMaxValuePrimary: waitPanelMaxValuePrimary, isCancelable: true, abortController: abortController, children: _jsxs(TMSplitterLayout, { direction: "horizontal", showSeparator: showList && deviceType !== DeviceType.MOBILE, separatorSize: 10, separatorColor: 'transparent', separatorActiveColor: 'transparent', start: showList ? deviceType !== DeviceType.MOBILE ? ['30%', '70%'] : ['100%', '0%'] : ['0', '100%'], min: ['0px', '0px'], children: [listInsteadOfContent ??
209
+ return (_jsx(TMLayoutContainer, { direction: 'vertical', children: _jsxs(TMSplitterLayout, { direction: "horizontal", showSeparator: showList && deviceType !== DeviceType.MOBILE, separatorSize: 10, separatorColor: 'transparent', separatorActiveColor: 'transparent', start: showList ? deviceType !== DeviceType.MOBILE ? ['30%', '70%'] : ['100%', '0%'] : ['0', '100%'], min: ['0px', '0px'], children: [listInsteadOfContent ??
212
210
  _jsxs(TMToolbarCard, { title: objNames, children: [_jsx(ToolbarPage, {}), _jsxs(DataGrid, { disabled: selectionListDisabled, ref: (grid) => (gridInstance = grid), height: "calc(100% - 35px)", width: 'calc(100% - 5px)', dataSource: items, keyExpr: "id", allowColumnResizing: true, columnResizingMode: "widget", allowColumnReordering: true, showBorders: false, onContentReady: (e) => {
213
211
  setVisibleItems(e.component.getVisibleRows().map((row) => { return row.data; }));
214
212
  e.component.selectRows(selectedItems?.map((item) => item.id), false);
@@ -10,6 +10,7 @@ export declare class SDKUI_Localizator {
10
10
  static get ActivityOverMultipleDays(): "Actividades durante los {{0}} días" | "Activities over the course of {{0}} days" | "Activités sur {{0}} jours" | "Aktivitäten in den letzten {{0}} Tagen" | "Atividades ao longo de {{0}} dias" | "Attività che svolge nell'arco di {{0}} giorni";
11
11
  static get Abort(): "Abort" | "Arrêtez" | "Detener" | "Interrompi" | "Parar" | "Stoppen";
12
12
  static get Abort_Confirm(): "Cancel processing?" | "Interrompere l'elaborazione?" | "Pare o processamento?" | "Stoppen Sie die Verarbeitung?" | "Voulez-vous interrompre l'operation?" | "¿Interrumpir la elaboración?";
13
+ static get Aborting(): "A parar..." | "Aborting..." | "Arrêt en cours..." | "Deteniendo..." | "Interruzione..." | "Wird gestoppt...";
13
14
  static get About(): "About" | "Información" | "Informationen" | "Informations" | "Informazioni" | "Informações";
14
15
  static get AccessToOtherApplications(): string;
15
16
  static get Add(): "Add" | "Adicionar" | "Aggiungi" | "Ajoute" | "Añadir" | "Hinzufügen";
@@ -261,6 +262,8 @@ export declare class SDKUI_Localizator {
261
262
  static get Dossiers(): "Akten" | "Dossiers" | "Expedientes" | "Pratiche" | "Pratiques" | "Práticas";
262
263
  static get DossierType(): "Aktentyp" | "Dossier Type" | "Modello di Pratica" | "Tipo de Expediente" | "Tipo de Prática" | "Type de Pratique";
263
264
  static get DownloadFile(): string;
265
+ static get DownloadInterrupted(): string;
266
+ static get DownloadInterruptedFiles(): string;
264
267
  static get Download_in_Process(): "Descarga en curso" | "Download em progresso" | "Download in corso" | "Download in progress" | "Download läuft" | "Téléchargement en cours";
265
268
  static get DownloadXMLAttachments(): string;
266
269
  static get Draft(): string;
@@ -280,6 +283,7 @@ export declare class SDKUI_Localizator {
280
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}}'?";
281
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?";
282
285
  static get EditorConfiguration(): string;
286
+ static get Elapsed(): "decorridos" | "elapsed" | "transcurridos" | "trascorsi" | "vergangen" | "écoulés";
283
287
  static get ElectronicInvoice(): "Electronic invoice" | "Elektronische Rechnung" | "Factura electrónica" | "Facture électronique" | "Fattura elettronica" | "Fatura eletrônica";
284
288
  static get ElectronicOrder(): "Commande électronique" | "Electronic order" | "Elektronische Bestellung" | "Orden electrónica" | "Ordine elettronico" | "Pedido eletrônico";
285
289
  static get ElementNameConventionError(): string;
@@ -702,6 +706,8 @@ export declare class SDKUI_Localizator {
702
706
  static get RelationsNotFound(): "Aucune corrélation trouvée" | "Keine Korrelationen gefunden" | "Nenhuma correlação encontrada" | "Nessuna correlazione trovata" | "No correlations found" | "No se encontraron correlaciones";
703
707
  static get StopRelationsCalculation(): "Berechnung unterbrechen und die bereits berechneten Korrelationen anzeigen" | "Interromper o cálculo e mostrar as correlações já calculadas" | "Interrompi il calcolo e mostra le correlazioni già calcolate" | "Interrompre le calcul et afficher les corrélations déjà calculées" | "Interrumpir el cálculo y mostrar las correlaciones ya calculadas" | "Stop the calculation and show the already calculated correlations";
704
708
  static get RelationsCalculationStopped(): "Berechnung der Korrelationen unterbrochen: Es werden nur die bereits berechneten Korrelationen angezeigt." | "Calcolo delle correlazioni interrotto: vengono mostrate solo le correlazioni già calcolate." | "Calcul des corrélations interrompu : seules les corrélations déjà calculées sont affichées." | "Correlations calculation stopped: only the already calculated correlations are shown." | "Cálculo das correlações interrompido: são mostradas apenas as correlações já calculadas." | "Cálculo de correlaciones interrumpido: solo se muestran las correlaciones ya calculadas.";
709
+ static get RelationsCalculationStoppedProgress(): "Berechnung unterbrochen: {{0}} von {{1}} Dokumenten verarbeitet." | "Calcolo interrotto: elaborati {{0}} documenti su {{1}}." | "Calcul interrompu : {{0}} sur {{1}} documents traités." | "Calculation stopped: {{0}} of {{1}} documents processed." | "Cálculo interrompido: {{0}} de {{1}} documentos processados." | "Cálculo interrumpido: {{0}} de {{1}} documentos procesados.";
710
+ static get RelationsCalculationStoppedEmpty(): "Berechnung unterbrochen: kein Dokument verarbeitet." | "Calcolo interrotto: nessun documento elaborato." | "Calcul interrompu : aucun document traité." | "Calculation stopped: no documents processed." | "Cálculo interrompido: nenhum documento processado." | "Cálculo interrumpido: ningún documento procesado.";
705
711
  static get RelatedDcmtsNotFound(): "Aucun document associé n'a été trouvé pour le document sélectionné." | "Für das ausgewählte Dokument wurden keine zugehörigen Dokumente gefunden." | "Nenhum documento relacionado foi encontrado para o documento selecionado." | "No related documents were found for the selected document." | "No se encontraron documentos relacionados para el documento seleccionado." | "Non sono stati trovati documenti correlati per il documento selezionato.";
706
712
  static get RelationManyToMany(): "Correlación muchos a muchos" | "Correlazione molti a molti" | "Corrélation plusieurs à plusieurs" | "Folge viele mit vielen" | "Muitos para muitos relação" | "Relation many to many";
707
713
  static get RelationType(): "Art der Beziehung" | "Relation type" | "Tipo de relacionamento" | "Tipo de relación" | "Tipo di relazione" | "Type de relation";
@@ -728,6 +734,7 @@ export declare class SDKUI_Localizator {
728
734
  static get ValueMustBeDateOrTime(): "Der Wert muss ein Datum oder eine Uhrzeit sein" | "El valor debe ser una fecha o una hora" | "Il valore deve essere una data o un orario" | "La valeur doit être une date ou une heure" | "O valor deve ser uma data ou hora" | "Value must be a date or time";
729
735
  static get RequiredNOT(): "Nicht obligatorisch" | "No obligatorio" | "Non obbligatorio" | "Not mandatory" | "Não é obrigatório" | "Pas obligatoire";
730
736
  static get Refresh(): "Actualizar" | "Aggiorna" | "Aktualisieren" | "Mis à jour" | "Refrescar" | "Refresh";
737
+ static get Remaining(): "remaining" | "restantes" | "restants" | "rimanenti" | "verbleibend";
731
738
  static get Reminder(): "Erinnerung" | "Lembrete" | "Promemoria" | "Rappel" | "Recordatorio" | "Reminder";
732
739
  static get ReminderSetForToday(): "Es gibt eine Erinnerung, die für heute eingestellt ist und bis zum Ablaufdatum gültig ist" | "Hay un recordatorio establecido para hoy, válido hasta la fecha de vencimiento" | "Há um lembrete definido para hoje, válido até à data de expiração" | "Il y a un rappel réglé pour aujourd'hui, valable jusqu'à la date d'échéance" | "There is a reminder set for today, valid until the expiration date" | "È presente un promemoria impostato per oggi, valido fino alla data di scadenza";
733
740
  static get Remove(): "Entfernen" | "Quitar" | "Remove" | "Remover" | "Rimuovi" | "Supprime";
@@ -48,6 +48,16 @@ export class SDKUI_Localizator {
48
48
  default: return "Interrompere l'elaborazione?";
49
49
  }
50
50
  }
51
+ static get Aborting() {
52
+ switch (this._cultureID) {
53
+ case CultureIDs.De_DE: return "Wird gestoppt...";
54
+ case CultureIDs.En_US: return "Aborting...";
55
+ case CultureIDs.Es_ES: return "Deteniendo...";
56
+ case CultureIDs.Fr_FR: return "Arrêt en cours...";
57
+ case CultureIDs.Pt_PT: return "A parar...";
58
+ default: return "Interruzione...";
59
+ }
60
+ }
51
61
  static get About() {
52
62
  switch (this._cultureID) {
53
63
  case CultureIDs.De_DE: return "Informationen";
@@ -2559,6 +2569,26 @@ export class SDKUI_Localizator {
2559
2569
  default: return "Download file";
2560
2570
  }
2561
2571
  }
2572
+ static get DownloadInterrupted() {
2573
+ switch (this._cultureID) {
2574
+ case CultureIDs.De_DE: return "Download abgebrochen";
2575
+ case CultureIDs.En_US: return "Download interrupted";
2576
+ case CultureIDs.Es_ES: return "Descarga interrumpida";
2577
+ case CultureIDs.Fr_FR: return "Téléchargement interrompu";
2578
+ case CultureIDs.Pt_PT: return "Download interrompido";
2579
+ default: return "Download interrotto";
2580
+ }
2581
+ }
2582
+ static get DownloadInterruptedFiles() {
2583
+ switch (this._cultureID) {
2584
+ case CultureIDs.De_DE: return "Download abgebrochen: {{0}} von {{1}} Dateien heruntergeladen";
2585
+ case CultureIDs.En_US: return "Download interrupted: {{0}} of {{1}} files downloaded";
2586
+ case CultureIDs.Es_ES: return "Descarga interrumpida: {{0}} de {{1}} archivos descargados";
2587
+ case CultureIDs.Fr_FR: return "Téléchargement interrompu : {{0}} fichiers sur {{1}} téléchargés";
2588
+ case CultureIDs.Pt_PT: return "Download interrompido: {{0}} de {{1}} arquivos baixados";
2589
+ default: return "Download interrotto: scaricati {{0}} file su {{1}}";
2590
+ }
2591
+ }
2562
2592
  static get Download_in_Process() {
2563
2593
  switch (this._cultureID) {
2564
2594
  case CultureIDs.De_DE: return "Download läuft";
@@ -2755,6 +2785,16 @@ export class SDKUI_Localizator {
2755
2785
  default: return "Configurazione Editor";
2756
2786
  }
2757
2787
  }
2788
+ static get Elapsed() {
2789
+ switch (this._cultureID) {
2790
+ case CultureIDs.De_DE: return "vergangen";
2791
+ case CultureIDs.En_US: return "elapsed";
2792
+ case CultureIDs.Es_ES: return "transcurridos";
2793
+ case CultureIDs.Fr_FR: return "écoulés";
2794
+ case CultureIDs.Pt_PT: return "decorridos";
2795
+ default: return "trascorsi";
2796
+ }
2797
+ }
2758
2798
  static get ElectronicInvoice() {
2759
2799
  switch (this._cultureID) {
2760
2800
  case CultureIDs.De_DE: return "Elektronische Rechnung";
@@ -6993,6 +7033,26 @@ export class SDKUI_Localizator {
6993
7033
  default: return "Calcolo delle correlazioni interrotto: vengono mostrate solo le correlazioni già calcolate.";
6994
7034
  }
6995
7035
  }
7036
+ static get RelationsCalculationStoppedProgress() {
7037
+ switch (this._cultureID) {
7038
+ case CultureIDs.De_DE: return "Berechnung unterbrochen: {{0}} von {{1}} Dokumenten verarbeitet.";
7039
+ case CultureIDs.En_US: return "Calculation stopped: {{0}} of {{1}} documents processed.";
7040
+ case CultureIDs.Es_ES: return "Cálculo interrumpido: {{0}} de {{1}} documentos procesados.";
7041
+ case CultureIDs.Fr_FR: return "Calcul interrompu : {{0}} sur {{1}} documents traités.";
7042
+ case CultureIDs.Pt_PT: return "Cálculo interrompido: {{0}} de {{1}} documentos processados.";
7043
+ default: return "Calcolo interrotto: elaborati {{0}} documenti su {{1}}.";
7044
+ }
7045
+ }
7046
+ static get RelationsCalculationStoppedEmpty() {
7047
+ switch (this._cultureID) {
7048
+ case CultureIDs.De_DE: return "Berechnung unterbrochen: kein Dokument verarbeitet.";
7049
+ case CultureIDs.En_US: return "Calculation stopped: no documents processed.";
7050
+ case CultureIDs.Es_ES: return "Cálculo interrumpido: ningún documento procesado.";
7051
+ case CultureIDs.Fr_FR: return "Calcul interrompu : aucun document traité.";
7052
+ case CultureIDs.Pt_PT: return "Cálculo interrompido: nenhum documento processado.";
7053
+ default: return "Calcolo interrotto: nessun documento elaborato.";
7054
+ }
7055
+ }
6996
7056
  static get RelatedDcmtsNotFound() {
6997
7057
  switch (this._cultureID) {
6998
7058
  case CultureIDs.De_DE: return "Für das ausgewählte Dokument wurden keine zugehörigen Dokumente gefunden.";
@@ -7259,6 +7319,16 @@ export class SDKUI_Localizator {
7259
7319
  default: return "Aggiorna";
7260
7320
  }
7261
7321
  }
7322
+ static get Remaining() {
7323
+ switch (this._cultureID) {
7324
+ case CultureIDs.De_DE: return "verbleibend";
7325
+ case CultureIDs.En_US: return "remaining";
7326
+ case CultureIDs.Es_ES: return "restantes";
7327
+ case CultureIDs.Fr_FR: return "restants";
7328
+ case CultureIDs.Pt_PT: return "restantes";
7329
+ default: return "rimanenti";
7330
+ }
7331
+ }
7262
7332
  static get Reminder() {
7263
7333
  switch (this._cultureID) {
7264
7334
  case CultureIDs.De_DE: return "Erinnerung";
@@ -19,7 +19,7 @@ export interface ZipCreateOptions {
19
19
  encryptionStrength?: 1 | 2 | 3;
20
20
  /** Commento globale ZIP */
21
21
  comment?: string;
22
- /** Callback progresso: (indice, totale, nomeFile) */
22
+ /** Callback progresso, invocata a voce conclusa: (voci completate, totale, nomeFile appena aggiunto) */
23
23
  onProgress?: (index: number, total: number, filename: string) => void;
24
24
  /** Callback progresso singolo file: (bytesElaborati, bytesTotali) */
25
25
  onEntryProgress?: (progress: number, total: number) => void;
@@ -50,7 +50,6 @@ export class ZipManager {
50
50
  throw new DOMException("Operazione annullata", "AbortError");
51
51
  }
52
52
  const file = files[i];
53
- onProgress?.(i + 1, total, file.filename);
54
53
  const reader = this.createReader(file.data, { BlobReader, TextReader, Uint8ArrayReader });
55
54
  await zipWriter.add(file.filename, reader, {
56
55
  comment: file.comment,
@@ -60,6 +59,8 @@ export class ZipManager {
60
59
  encryptionStrength,
61
60
  onprogress: onEntryProgress ? (progress, total) => onEntryProgress(progress, total) : undefined
62
61
  });
62
+ // A voce conclusa, non prima: con un solo file la barra partirebbe gia' al 100%.
63
+ onProgress?.(i + 1, total, file.filename);
63
64
  }
64
65
  const commentBytes = comment ? new TextEncoder().encode(comment) : undefined;
65
66
  return await zipWriter.close(commentBytes);
@@ -20,11 +20,5 @@ export interface UseCheckInOutOperationsReturn {
20
20
  copyCheckoutPathToClipboardCallback: (dcmt: DcmtInfo, filename: string) => void;
21
21
  handleCheckOutCallback: (dcmt: DcmtInfo, checkout: boolean, filename: string, downloadDcmtsAsync: (params: DownloadDcmtsAsyncParams) => Promise<void>, onRefreshAsync?: (tid: number | undefined, did: number | undefined, refreshUI?: boolean, metadataResult?: SearchResultDescriptor | null) => Promise<void>) => Promise<void>;
22
22
  handleCheckInCallback: (dcmt: DcmtInfo, checkoutDate?: string | null, onRefreshAsync?: (tid: number | undefined, did: number | undefined, refreshUI?: boolean, metadataResult?: SearchResultDescriptor | null) => Promise<void>) => Promise<void>;
23
- showCicoWaitPanel: boolean;
24
- cicoWaitPanelTitle: string;
25
- showCicoPrimaryProgress: boolean;
26
- cicoPrimaryProgressText: string;
27
- cicoPrimaryProgressValue: number;
28
- cicoPrimaryProgressMax: number;
29
23
  }
30
24
  export declare const useCheckInOutOperations: (props: UseCheckInOutOperationsProps) => UseCheckInOutOperationsReturn;