@topconsultnpm/sdkui-react 6.19.0-dev2.9 → 6.19.0-test2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/components/base/TMAccordionNew.d.ts +28 -0
- package/lib/components/base/TMAccordionNew.js +326 -0
- package/lib/components/base/TMButton.d.ts +1 -0
- package/lib/components/base/TMButton.js +6 -6
- package/lib/components/base/TMCustomButton.d.ts +1 -1
- package/lib/components/base/TMCustomButton.js +83 -28
- package/lib/components/base/TMDataGridExportForm.js +9 -3
- package/lib/components/base/TMFileManager.js +11 -2
- package/lib/components/base/TMFileManagerDataGridView.d.ts +2 -0
- package/lib/components/base/TMFileManagerDataGridView.js +12 -3
- package/lib/components/base/TMFileManagerThumbnailItems.d.ts +2 -0
- package/lib/components/base/TMFileManagerThumbnailItems.js +12 -2
- package/lib/components/base/TMFileManagerThumbnailsView.d.ts +2 -0
- package/lib/components/base/TMFileManagerThumbnailsView.js +2 -2
- package/lib/components/base/TMModal.d.ts +2 -0
- package/lib/components/base/TMModal.js +48 -3
- package/lib/components/base/TMPopUp.js +74 -5
- package/lib/components/base/TMWaitPanel.js +8 -2
- package/lib/components/choosers/TMDataListItemChooser.js +1 -1
- package/lib/components/choosers/TMDcmtTypeChooser.js +2 -2
- package/lib/components/choosers/TMMetadataChooser.d.ts +4 -1
- package/lib/components/choosers/TMMetadataChooser.js +31 -8
- package/lib/components/choosers/TMUserChooser.d.ts +4 -0
- package/lib/components/choosers/TMUserChooser.js +21 -5
- package/lib/components/editors/TMMetadataValues.js +45 -4
- package/lib/components/editors/TMTextArea.d.ts +1 -0
- package/lib/components/editors/TMTextArea.js +44 -10
- package/lib/components/editors/TMTextBox.js +34 -4
- package/lib/components/editors/TMTextExpression.js +36 -28
- package/lib/components/features/assistant/ToppyDraggableHelpCenter.d.ts +30 -0
- package/lib/components/features/assistant/ToppyDraggableHelpCenter.js +471 -0
- package/lib/components/features/assistant/ToppySpeechBubble.d.ts +9 -0
- package/lib/components/features/assistant/ToppySpeechBubble.js +117 -0
- package/lib/components/features/blog/TMBlogCommentForm.d.ts +2 -0
- package/lib/components/features/blog/TMBlogCommentForm.js +18 -6
- package/lib/components/features/documents/TMDcmtBlog.js +1 -1
- package/lib/components/features/documents/TMDcmtForm.js +290 -31
- package/lib/components/features/documents/TMDcmtIcon.js +9 -4
- package/lib/components/features/documents/TMDcmtPreview.js +45 -8
- package/lib/components/features/documents/TMRelationViewer.js +55 -22
- package/lib/components/features/search/TMSearch.js +2 -2
- package/lib/components/features/search/TMSearchQueryEditor.js +1 -1
- package/lib/components/features/search/TMSearchQueryPanel.js +10 -28
- package/lib/components/features/search/TMSearchResult.js +102 -33
- package/lib/components/features/search/TMSearchResultsMenuItems.d.ts +2 -1
- package/lib/components/features/search/TMSearchResultsMenuItems.js +67 -28
- package/lib/components/features/search/TMSignSettingsForm.d.ts +9 -0
- package/lib/components/features/search/TMSignSettingsForm.js +621 -0
- package/lib/components/features/tasks/TMTaskForm.js +10 -4
- package/lib/components/features/tasks/TMTasksAgenda.js +1 -1
- package/lib/components/features/tasks/TMTasksCalendar.js +1 -1
- package/lib/components/features/tasks/TMTasksUtils.d.ts +1 -0
- package/lib/components/features/tasks/TMTasksUtils.js +17 -2
- package/lib/components/features/tasks/TMTasksUtilsView.js +26 -4
- package/lib/components/features/tasks/TMTasksView.js +11 -5
- package/lib/components/features/workflow/TMWorkflowPopup.js +3 -3
- package/lib/components/features/workflow/diagram/WFDiagram.js +19 -1
- package/lib/components/forms/TMSaveForm.js +3 -11
- package/lib/components/grids/TMBlogAttachments.d.ts +0 -14
- package/lib/components/grids/TMBlogAttachments.js +10 -5
- package/lib/components/grids/TMBlogsPost.d.ts +8 -3
- package/lib/components/grids/TMBlogsPost.js +100 -39
- package/lib/components/grids/TMBlogsPostUtils.d.ts +1 -0
- package/lib/components/grids/TMBlogsPostUtils.js +27 -6
- package/lib/components/index.d.ts +2 -1
- package/lib/components/index.js +2 -1
- package/lib/components/layout/panelManager/TMPanelManagerContainer.d.ts +1 -0
- package/lib/components/layout/panelManager/TMPanelManagerContainer.js +2 -2
- package/lib/components/layout/panelManager/TMPanelManagerContext.js +0 -1
- package/lib/components/layout/panelManager/TMPanelManagerToolbar.js +2 -1
- package/lib/components/layout/panelManager/types.d.ts +1 -0
- package/lib/components/settings/SettingsAppearance.js +5 -5
- package/lib/helper/GlobalStyles.d.ts +2 -0
- package/lib/helper/GlobalStyles.js +10 -0
- package/lib/helper/Globalization.d.ts +1 -0
- package/lib/helper/Globalization.js +30 -0
- package/lib/helper/SDKUI_Localizator.d.ts +41 -1
- package/lib/helper/SDKUI_Localizator.js +410 -10
- package/lib/helper/TMIcons.d.ts +4 -1
- package/lib/helper/TMIcons.js +13 -1
- package/lib/helper/TMToppyMessage.d.ts +1 -0
- package/lib/helper/TMToppyMessage.js +4 -3
- package/lib/helper/TMUtils.d.ts +42 -4
- package/lib/helper/TMUtils.js +190 -23
- package/lib/helper/dcmtsHelper.d.ts +2 -1
- package/lib/helper/dcmtsHelper.js +56 -17
- package/lib/helper/helpers.d.ts +1 -1
- package/lib/helper/helpers.js +12 -17
- package/lib/helper/index.d.ts +1 -0
- package/lib/helper/index.js +1 -0
- package/lib/hooks/useDcmtOperations.d.ts +1 -1
- package/lib/hooks/useDcmtOperations.js +10 -6
- package/lib/hooks/useRelatedDocuments.js +35 -26
- package/lib/ts/types.d.ts +2 -0
- package/package.json +8 -8
- package/lib/components/features/assistant/ToppyHelpCenter.d.ts +0 -12
- package/lib/components/features/assistant/ToppyHelpCenter.js +0 -173
|
@@ -15,11 +15,18 @@ import { TMSaveFormButtonPrevious, TMSaveFormButtonNext } from '../../forms/TMSa
|
|
|
15
15
|
import { StyledAnimatedComponentOpacity } from '../../base/Styled';
|
|
16
16
|
import TMPanel from '../../base/TMPanel';
|
|
17
17
|
import TMTooltip from '../../base/TMTooltip';
|
|
18
|
+
const ErrorContent = ({ error, isAbortError, onRetry }) => {
|
|
19
|
+
if (isAbortError) {
|
|
20
|
+
return (_jsx(StyledAnimatedComponentOpacity, { style: { width: '100%', height: '100%' }, children: _jsxs(StyledPanelStatusContainer, { children: [_jsx(IconCloseOutline, { fontSize: 92, color: TMColors.error }), _jsxs(StyledPreviewNotAvailable, { children: [_jsx("div", { children: error }), _jsx("div", { children: SDKUI_Localizator.PreviewNotAvailable })] }), _jsx(TMButton, { caption: SDKUI_Localizator.TryAgain, onClick: onRetry, showTooltip: false })] }) }));
|
|
21
|
+
}
|
|
22
|
+
return _jsx(TMNothingToShow, { icon: _jsx(IconCloseOutline, { fontSize: 92, color: TMColors.error }), text: error });
|
|
23
|
+
};
|
|
18
24
|
const TMDcmtPreview = ({ dcmtData, isResizingActive, isVisible, canNext, canPrev, onClosePanel, onNext, onPrev, allowMaximize = true, onMaximizePanel }) => {
|
|
19
25
|
const [dcmtBlob, setDcmtBlob] = useState(undefined);
|
|
20
26
|
const [showPreview, setShowPreview] = useState(false);
|
|
21
27
|
const [isFromCache, setIsFromCache] = useState(false);
|
|
22
28
|
const [error, setError] = useState('');
|
|
29
|
+
const [isAbortError, setIsAbortError] = useState(false);
|
|
23
30
|
const { abortController, showWaitPanel, waitPanelTitle, showPrimary, waitPanelTextPrimary, waitPanelValuePrimary, waitPanelMaxValuePrimary, showSecondary, waitPanelTextSecondary, waitPanelValueSecondary, waitPanelMaxValueSecondary, getDcmtFileAsync, clearDcmtsFileCache, removeDcmtsFileCache, isDcmtFileInCache } = useDcmtOperations();
|
|
24
31
|
const cacheKey = dcmtData ? `${dcmtData.tid}-${dcmtData.did}` : '00';
|
|
25
32
|
const [hasLoadedDataOnce, setHasLoadedDataOnce] = useState(false);
|
|
@@ -29,6 +36,7 @@ const TMDcmtPreview = ({ dcmtData, isResizingActive, isVisible, canNext, canPrev
|
|
|
29
36
|
setLastLoadedDid(undefined); // Reset
|
|
30
37
|
setDcmtBlob(undefined);
|
|
31
38
|
setError('');
|
|
39
|
+
setIsAbortError(false);
|
|
32
40
|
setShowPreview(false);
|
|
33
41
|
return;
|
|
34
42
|
}
|
|
@@ -42,6 +50,7 @@ const TMDcmtPreview = ({ dcmtData, isResizingActive, isVisible, canNext, canPrev
|
|
|
42
50
|
if (shouldFetch) {
|
|
43
51
|
setDcmtBlob(undefined);
|
|
44
52
|
setError('');
|
|
53
|
+
setIsAbortError(false);
|
|
45
54
|
if ((extensionHandler(dcmtData.fileExt) !== FileExtensionHandler.NONE) && ((dcmtData.fileSize ?? 0) <= (SDKUI_Globals.userSettings.searchSettings.previewThreshold * 1024))) {
|
|
46
55
|
loadDocumentWithCache();
|
|
47
56
|
setShowPreview(true);
|
|
@@ -65,15 +74,19 @@ const TMDcmtPreview = ({ dcmtData, isResizingActive, isVisible, canNext, canPrev
|
|
|
65
74
|
let dcmtFile = await getDcmtFileAsync({ TID: dcmtData?.tid, DID: dcmtData?.did, FILEEXT: dcmtData?.fileExt }, rfo, 'Anteprima', false);
|
|
66
75
|
setDcmtBlob(dcmtFile?.file);
|
|
67
76
|
setIsFromCache(!!dcmtFile?.isFromCache);
|
|
77
|
+
setError('');
|
|
78
|
+
setIsAbortError(false);
|
|
68
79
|
}
|
|
69
80
|
catch (ex) {
|
|
70
81
|
const err = ex;
|
|
71
82
|
if (err.name === 'CanceledError') {
|
|
72
83
|
setError('Operazione annullata.');
|
|
84
|
+
setIsAbortError(true);
|
|
73
85
|
ShowAlert({ message: err.message, mode: 'warning', duration: 3000, title: 'Abort' });
|
|
74
86
|
}
|
|
75
87
|
else {
|
|
76
88
|
setError(getExceptionMessage(ex));
|
|
89
|
+
setIsAbortError(false);
|
|
77
90
|
TMExceptionBoxManager.show({ exception: ex });
|
|
78
91
|
}
|
|
79
92
|
}
|
|
@@ -101,6 +114,9 @@ const TMDcmtPreview = ({ dcmtData, isResizingActive, isVisible, canNext, canPrev
|
|
|
101
114
|
const reOpenDcmt = async () => {
|
|
102
115
|
removeDcmtsFileCache(cacheKey);
|
|
103
116
|
setIsFromCache(false);
|
|
117
|
+
setError('');
|
|
118
|
+
setIsAbortError(false);
|
|
119
|
+
setDcmtBlob(undefined);
|
|
104
120
|
try {
|
|
105
121
|
await loadDocumentWithCache();
|
|
106
122
|
}
|
|
@@ -112,7 +128,7 @@ const TMDcmtPreview = ({ dcmtData, isResizingActive, isVisible, canNext, canPrev
|
|
|
112
128
|
{ icon: _jsx(IconCloseCircle, {}), text: SDKUI_Localizator.RemoveFromCache, onClick: () => { removeDcmtsFileCache(cacheKey); setIsFromCache(false); } },
|
|
113
129
|
{ icon: _jsx(IconClear, {}), text: SDKUI_Localizator.ClearCache, onClick: () => { clearDcmtsFileCache(); setIsFromCache(false); } },
|
|
114
130
|
] }, "btn13") }), _jsx(StyledHeaderIcon, { onClick: reOpenDcmt, "$color": TMColors.primaryColor, children: _jsx(TMTooltip, { content: SDKUI_Localizator.ReopenDocument, children: _jsx(IconRefresh, {}) }) })] }), children: error
|
|
115
|
-
? _jsx(
|
|
131
|
+
? _jsx(ErrorContent, { error: error, isAbortError: isAbortError, onRetry: reOpenDcmt })
|
|
116
132
|
: renderedPreview(dcmtData?.tid, dcmtData?.did, dcmtData?.fileExt, dcmtData?.fileSize, dcmtData?.fileCount, extensionHandler(dcmtData?.fileExt), showPreview, isResizingActive, () => { loadDocumentWithCache(); setShowPreview(true); }, dcmtBlob) }) }));
|
|
117
133
|
};
|
|
118
134
|
export default TMDcmtPreview;
|
|
@@ -148,11 +164,12 @@ export const TMFileViewer = ({ fileBlob, isResizingActive }) => {
|
|
|
148
164
|
}, []);
|
|
149
165
|
useEffect(() => {
|
|
150
166
|
if (fileBlob) {
|
|
151
|
-
const url = URL.createObjectURL(fileBlob);
|
|
152
|
-
setBlobUrl(url);
|
|
153
167
|
setFileType(fileBlob.type);
|
|
154
168
|
setFormattedXml(undefined);
|
|
155
|
-
|
|
169
|
+
const fileName = fileBlob.name || '';
|
|
170
|
+
const fileExtension = fileName.split('.').pop()?.toLowerCase() || '';
|
|
171
|
+
const isConfigFile = ['config', 'cfg'].includes(fileExtension);
|
|
172
|
+
if (fileBlob.type.includes("xml") && !isConfigFile) {
|
|
156
173
|
fileBlob.text().then((text) => {
|
|
157
174
|
const parser = new DOMParser();
|
|
158
175
|
const xmlDoc = parser.parseFromString(text, "application/xml");
|
|
@@ -169,10 +186,28 @@ export const TMFileViewer = ({ fileBlob, isResizingActive }) => {
|
|
|
169
186
|
.replace(/</g, "<")
|
|
170
187
|
.replace(/>/g, ">")}</pre>`);
|
|
171
188
|
});
|
|
189
|
+
setBlobUrl(undefined);
|
|
190
|
+
}
|
|
191
|
+
else if (isConfigFile) {
|
|
192
|
+
fileBlob.text().then((text) => {
|
|
193
|
+
const escapedText = text
|
|
194
|
+
.replace(/&/g, "&")
|
|
195
|
+
.replace(/</g, "<")
|
|
196
|
+
.replace(/>/g, ">");
|
|
197
|
+
setFormattedXml(`<pre style="font-family: monospace; white-space: pre-wrap; line-height: 1.5; margin: 0; padding: 10px;">${escapedText}</pre>`);
|
|
198
|
+
}).catch((error) => {
|
|
199
|
+
console.error("Error reading text file:", error);
|
|
200
|
+
setFormattedXml(`<div style="color: red;">Error reading file</div>`);
|
|
201
|
+
});
|
|
202
|
+
setBlobUrl(undefined);
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
const url = URL.createObjectURL(fileBlob);
|
|
206
|
+
setBlobUrl(url);
|
|
207
|
+
return () => {
|
|
208
|
+
URL.revokeObjectURL(url);
|
|
209
|
+
};
|
|
172
210
|
}
|
|
173
|
-
return () => {
|
|
174
|
-
URL.revokeObjectURL(url);
|
|
175
|
-
};
|
|
176
211
|
}
|
|
177
212
|
else {
|
|
178
213
|
setBlobUrl(undefined);
|
|
@@ -225,7 +260,9 @@ export const TMFileViewer = ({ fileBlob, isResizingActive }) => {
|
|
|
225
260
|
display: 'inline-block'
|
|
226
261
|
}, children: SDKUI_Localizator.OpenInNewTab })] })] }));
|
|
227
262
|
}
|
|
228
|
-
return (_jsx("iframe", { srcDoc:
|
|
263
|
+
return (_jsx("iframe", { srcDoc: formattedXml ? `<html><body>${formattedXml}</body></html>` : undefined, src: !formattedXml
|
|
264
|
+
? (fileType === 'application/pdf' ? `${blobUrl}#view=FitH&scrollbar=1` : blobUrl)
|
|
265
|
+
: undefined, title: "File Viewer", width: "100%", height: "100%", style: { border: 'none', zIndex: 0, pointerEvents: isResizingActive === true ? "none" : "auto" } }, blobUrl));
|
|
229
266
|
};
|
|
230
267
|
const ImageViewer = ({ fileBlob, alt = 'Image', className }) => {
|
|
231
268
|
const containerRef = useRef(null);
|
|
@@ -142,12 +142,16 @@ const TMRelationViewer = ({ inputDcmts, isForMaster = false, showCurrentDcmtIndi
|
|
|
142
142
|
const [treeData, setTreeData] = useState([]);
|
|
143
143
|
const [showZeroDcmts, setShowZeroDcmts] = useState(initialShowZeroDcmts);
|
|
144
144
|
const [staticItemsState, setStaticItemsState] = useState([]);
|
|
145
|
-
// Wait Panel State (only used if allowWaitPanel is true)
|
|
146
145
|
const [showWaitPanel, setShowWaitPanel] = useState(false);
|
|
147
146
|
const [waitPanelTextPrimary, setWaitPanelTextPrimary] = useState('');
|
|
148
147
|
const [waitPanelValuePrimary, setWaitPanelValuePrimary] = useState(0);
|
|
149
148
|
const [waitPanelMaxValuePrimary, setWaitPanelMaxValuePrimary] = useState(0);
|
|
150
149
|
const [abortController] = useState(new AbortController());
|
|
150
|
+
const [showExpansionWaitPanel, setShowExpansionWaitPanel] = useState(false);
|
|
151
|
+
const [expansionWaitPanelText, setExpansionWaitPanelText] = useState('');
|
|
152
|
+
const [expansionWaitPanelValue, setExpansionWaitPanelValue] = useState(0);
|
|
153
|
+
const [expansionWaitPanelMaxValue, setExpansionWaitPanelMaxValue] = useState(0);
|
|
154
|
+
const [expansionAbortController, setExpansionAbortController] = useState(undefined);
|
|
151
155
|
// Ref to track last loaded input to prevent unnecessary reloads
|
|
152
156
|
const lastLoadedInputRef = React.useRef('');
|
|
153
157
|
// Ref to track if user has manually expanded/collapsed static items
|
|
@@ -560,30 +564,55 @@ const TMRelationViewer = ({ inputDcmts, isForMaster = false, showCurrentDcmtIndi
|
|
|
560
564
|
// If container is already loaded, return items
|
|
561
565
|
if (node.isLoaded)
|
|
562
566
|
return node.items;
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
567
|
+
const newAbortController = new AbortController();
|
|
568
|
+
setExpansionAbortController(newAbortController);
|
|
569
|
+
const itemsToLoad = node.items?.length ?? 0;
|
|
570
|
+
setShowExpansionWaitPanel(true);
|
|
571
|
+
setExpansionWaitPanelMaxValue(itemsToLoad);
|
|
572
|
+
setExpansionWaitPanelValue(0);
|
|
573
|
+
setExpansionWaitPanelText(`Caricamento documenti correlati...`);
|
|
574
|
+
try {
|
|
575
|
+
const newItems = [];
|
|
576
|
+
let processedCount = 0;
|
|
577
|
+
for (const dcmt of node.items ?? []) {
|
|
578
|
+
if (newAbortController.signal.aborted) {
|
|
579
|
+
console.log('Folder expansion aborted by user');
|
|
580
|
+
return node.items;
|
|
574
581
|
}
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
582
|
+
const item = { ...dcmt };
|
|
583
|
+
if (item.tid && item.did && !item.isLoaded) {
|
|
584
|
+
// Update progress
|
|
585
|
+
processedCount++;
|
|
586
|
+
setExpansionWaitPanelValue(processedCount);
|
|
587
|
+
setExpansionWaitPanelText(`Caricamento ${processedCount} di ${itemsToLoad}...`);
|
|
588
|
+
// Nella modalità originale (invertMasterNavigation=false),
|
|
589
|
+
// i documenti detail non devono caricare i master come figli
|
|
590
|
+
if (isForMaster && !invertMasterNavigation) {
|
|
591
|
+
// Carica i detail dei detail (navigazione naturale detail→detail)
|
|
592
|
+
const loadedItems = await getDetailDcmtsAsync(item.tid, item.did, 1);
|
|
593
|
+
item.items = updateHiddenProperty(loadedItems);
|
|
594
|
+
}
|
|
595
|
+
else {
|
|
596
|
+
// Modalità standard o invertita
|
|
597
|
+
const loadedItems = isForMaster
|
|
598
|
+
? await getMasterDcmtsAsync(item.tid, item.did, 1)
|
|
599
|
+
: await getDetailDcmtsAsync(item.tid, item.did, 1);
|
|
600
|
+
item.items = updateHiddenProperty(loadedItems);
|
|
601
|
+
}
|
|
602
|
+
item.isLoaded = true;
|
|
581
603
|
}
|
|
582
|
-
item
|
|
604
|
+
newItems.push(item);
|
|
583
605
|
}
|
|
584
|
-
newItems
|
|
606
|
+
return newItems;
|
|
607
|
+
}
|
|
608
|
+
catch (error) {
|
|
609
|
+
console.error('Error loading folder contents:', error);
|
|
610
|
+
return node.items;
|
|
611
|
+
}
|
|
612
|
+
finally {
|
|
613
|
+
setShowExpansionWaitPanel(false);
|
|
614
|
+
setExpansionAbortController(undefined);
|
|
585
615
|
}
|
|
586
|
-
return newItems;
|
|
587
616
|
}, [isForMaster, invertMasterNavigation, getDetailDcmtsAsync, getMasterDcmtsAsync, updateHiddenProperty]);
|
|
588
617
|
/**
|
|
589
618
|
* Default item renderer with metadata display (adapted from TMMasterDetailDcmts.tsx)
|
|
@@ -715,6 +744,10 @@ const TMRelationViewer = ({ inputDcmts, isForMaster = false, showCurrentDcmtIndi
|
|
|
715
744
|
if (mergedTreeData.length === 0) {
|
|
716
745
|
return _jsx("div", { style: { padding: '20px', textAlign: 'center', color: '#666' }, children: "Nessuna relazione disponibile." });
|
|
717
746
|
}
|
|
718
|
-
return (_jsx(TMTreeView, { dataSource: mergedTreeData, itemRender: finalItemRender, calculateItemsForNode: calculateItemsForNode, onDataChanged: handleDataChanged, focusedItem: focusedItem, onFocusedItemChanged: handleFocusedItemChanged, allowMultipleSelection: allowMultipleSelection, selectedItems: selectedItems, onSelectionChanged: handleSelectedItemsChanged }))
|
|
747
|
+
return (_jsxs(_Fragment, { children: [_jsx(TMTreeView, { dataSource: mergedTreeData, itemRender: finalItemRender, calculateItemsForNode: calculateItemsForNode, onDataChanged: handleDataChanged, focusedItem: focusedItem, onFocusedItemChanged: handleFocusedItemChanged, allowMultipleSelection: allowMultipleSelection, selectedItems: selectedItems, onSelectionChanged: handleSelectedItemsChanged }), showExpansionWaitPanel && (_jsx(TMWaitPanel, { title: isForMaster ? 'Caricamento documenti master' : 'Caricamento documenti dettaglio', showPrimary: true, textPrimary: expansionWaitPanelText, valuePrimary: expansionWaitPanelValue, maxValuePrimary: expansionWaitPanelMaxValue, isCancelable: true, abortController: expansionAbortController, onAbortClick: (abortController) => {
|
|
748
|
+
setTimeout(() => {
|
|
749
|
+
abortController?.abort();
|
|
750
|
+
}, 100);
|
|
751
|
+
} }))] }));
|
|
719
752
|
};
|
|
720
753
|
export default TMRelationViewer;
|
|
@@ -141,7 +141,7 @@ const TMSearch = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTask
|
|
|
141
141
|
console.error("Error refreshing search:", error);
|
|
142
142
|
}
|
|
143
143
|
};
|
|
144
|
-
const isMobile = deviceType === DeviceType.MOBILE;
|
|
144
|
+
const isMobile = deviceType === DeviceType.TABLET || deviceType === DeviceType.MOBILE;
|
|
145
145
|
// --- JSX WRAPPERS ---
|
|
146
146
|
const tmTreeSelectorElement = useMemo(() => _jsx(TMTreeSelectorWrapper, { isMobile: isMobile, onSelectedTIDChanged: (tid) => {
|
|
147
147
|
setCurrentTID(tid);
|
|
@@ -219,7 +219,7 @@ const TMSearch = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTask
|
|
|
219
219
|
toolbarOptions: { icon: _jsx(IconSavedQuery, { fontSize: 24 }), visible: true, orderNumber: 4, isActive: allInitialPanelVisibility['TMSavedQuerySelector'] }
|
|
220
220
|
}
|
|
221
221
|
], [tmTreeSelectorElement, showSearchResults, tmRecentsManagerElement, tmSearchQueryPanelElement, tmSavedQuerySelectorElement, fromDTD, mruTIDs]);
|
|
222
|
-
return (_jsxs(_Fragment, { children: [showSearchResults ? _jsx(StyledMultiViewPanel, { "$isVisible": currentSearchView === TMSearchViews.Search, children: _jsx(TMPanelManagerProvider, { panels: initialPanels, initialVisibility: allInitialPanelVisibility, defaultDimensions: initialPanelDimensions, initialDimensions: initialPanelDimensions, initialMobilePanelId: 'TMRecentsManager', children: _jsx(TMPanelManagerContainer, { panels: initialPanels, direction: "horizontal", showToolbar: true }) }) }) : tmSearchQueryPanelElement, showSearchResults && _jsx(TMSearchResult, { isVisible: isVisible && currentSearchView === TMSearchViews.Result, context: SearchResultContext.METADATA_SEARCH, searchResults: searchResult, floatingActionConfig: floatingActionConfig, onRefreshAfterAddDcmtToFavs: onRefreshAfterAddDcmtToFavs, openInOffice: openInOffice, onRefreshSearchAsync: onRefreshSearchAsync, onClose: () => { onlyShowSearchQueryPanel ? setShowSearchResults(false) : setCurrentSearchView(TMSearchViews.Search); }, onFileOpened: onFileOpened, onTaskCreateRequest: onTaskCreateRequest, openWGsCopyMoveForm: openWGsCopyMoveForm, openEditPdf: openEditPdf, openS4TViewer: openS4TViewer, onOpenS4TViewerRequest: onOpenS4TViewerRequest, passToArchiveCallback: passToArchiveCallback, onSelectedTIDChanged: onCurrentTIDChangedCallback, showTodoDcmtForm: showTodoDcmtForm, onReferenceClick: onReferenceClick, allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers })] }));
|
|
222
|
+
return (_jsxs(_Fragment, { children: [showSearchResults ? _jsx(StyledMultiViewPanel, { "$isVisible": currentSearchView === TMSearchViews.Search, children: _jsx(TMPanelManagerProvider, { panels: initialPanels, initialVisibility: allInitialPanelVisibility, defaultDimensions: initialPanelDimensions, initialDimensions: initialPanelDimensions, initialMobilePanelId: 'TMRecentsManager', children: _jsx(TMPanelManagerContainer, { panels: initialPanels, direction: "horizontal", showToolbar: true, minPanelSizePx: !isMobile ? 250 : 150 }) }) }) : tmSearchQueryPanelElement, showSearchResults && _jsx(TMSearchResult, { isVisible: isVisible && currentSearchView === TMSearchViews.Result, context: SearchResultContext.METADATA_SEARCH, searchResults: searchResult, floatingActionConfig: floatingActionConfig, onRefreshAfterAddDcmtToFavs: onRefreshAfterAddDcmtToFavs, openInOffice: openInOffice, onRefreshSearchAsync: onRefreshSearchAsync, onClose: () => { onlyShowSearchQueryPanel ? setShowSearchResults(false) : setCurrentSearchView(TMSearchViews.Search); }, onFileOpened: onFileOpened, onTaskCreateRequest: onTaskCreateRequest, openWGsCopyMoveForm: openWGsCopyMoveForm, openEditPdf: openEditPdf, openS4TViewer: openS4TViewer, onOpenS4TViewerRequest: onOpenS4TViewerRequest, passToArchiveCallback: passToArchiveCallback, onSelectedTIDChanged: onCurrentTIDChangedCallback, showTodoDcmtForm: showTodoDcmtForm, onReferenceClick: onReferenceClick, allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers })] }));
|
|
223
223
|
};
|
|
224
224
|
export default TMSearch;
|
|
225
225
|
const TMTreeSelectorWrapper = ({ isMobile, onSelectedTIDChanged }) => {
|
|
@@ -161,7 +161,7 @@ const TMSearchWhereItemEditor = React.memo(({ whereItem, queryParamsDynDataList,
|
|
|
161
161
|
}
|
|
162
162
|
onValueChanged?.(newValues);
|
|
163
163
|
};
|
|
164
|
-
return (_jsxs(StyledRowItem, { style: { marginBottom: 0 }, children: [showValue1 && _jsx(TMMetadataEditor, { openChooserBySingleClick: openChooserBySingleClick, isSelected: isSelected, tid: whereItem.tid, mid: whereItem.mid, layoutMode: LayoutModes.None, isEditable: isEditableList, value: whereItem.value1, queryOperator: whereItem.operator, queryParamsDynDataList: queryParamsDynDataList, autoFocus: autoFocus ?? false, containerElement: undefined, onValueChanged: (value) => { normalizeValue(value, true); }, onCascadeRefreshDynDataLists: onCascadeRefreshDynDataLists, onCascadeUpdateMIDs: onCascadeUpdateMIDs }), showValue2 && _jsx(TMMetadataEditor, { openChooserBySingleClick: openChooserBySingleClick, isSelected: isSelected, tid: whereItem.tid, mid: whereItem.mid, layoutMode: LayoutModes.None, isEditable: isEditableList, value: whereItem.value2, queryOperator: whereItem.operator, autoFocus: autoFocus ?? false, containerElement: undefined, onValueChanged: (value) => { normalizeValue(value, false); } })] }));
|
|
164
|
+
return (_jsxs(StyledRowItem, { style: { marginBottom: 0, width: '100%' }, children: [showValue1 && _jsx(TMMetadataEditor, { openChooserBySingleClick: openChooserBySingleClick, isSelected: isSelected, tid: whereItem.tid, mid: whereItem.mid, layoutMode: LayoutModes.None, isEditable: isEditableList, value: whereItem.value1, queryOperator: whereItem.operator, queryParamsDynDataList: queryParamsDynDataList, autoFocus: autoFocus ?? false, containerElement: undefined, onValueChanged: (value) => { normalizeValue(value, true); }, onCascadeRefreshDynDataLists: onCascadeRefreshDynDataLists, onCascadeUpdateMIDs: onCascadeUpdateMIDs }), showValue2 && _jsx(TMMetadataEditor, { openChooserBySingleClick: openChooserBySingleClick, isSelected: isSelected, tid: whereItem.tid, mid: whereItem.mid, layoutMode: LayoutModes.None, isEditable: isEditableList, value: whereItem.value2, queryOperator: whereItem.operator, autoFocus: autoFocus ?? false, containerElement: undefined, onValueChanged: (value) => { normalizeValue(value, false); } })] }));
|
|
165
165
|
});
|
|
166
166
|
const TMSearchWhereItemCard = React.memo(({ index, whereItem, isSelected, queryParamsDynDataList, showEditor, showCompleteMetadataName, showId, isEditableList, onWhereItemChange, onHideEditor, onCascadeRefreshDynDataLists, onCascadeUpdateMIDs }) => {
|
|
167
167
|
const [isOpen, setIsOpen] = useState(false);
|
|
@@ -3,7 +3,6 @@ import { useCallback, useEffect, useRef, useState } from 'react';
|
|
|
3
3
|
import { PlatformObjectValidator, WhereItem, SDK_Localizator, OrderByItem, SelectItem, SelectItemVisibilities, SDK_Globals, SavedQueryCacheService, SearchEngine, QueryOperators } from '@topconsultnpm/sdk-ts';
|
|
4
4
|
import styled from 'styled-components';
|
|
5
5
|
import TMSearchQueryEditor from './TMSearchQueryEditor';
|
|
6
|
-
import Toppy from '../../../assets/Toppy-generico.png';
|
|
7
6
|
import { getDcmtTypesByQdAsync, SDKUI_Localizator, getQD, IconMenuVertical, IconAddCircleOutline, IconEdit, IconEasy, IconAdvanced, deepCompare, IconSearch, IconClear, getDefaultOperator, prepareQdForSearchAsync, IsParametricQuery, SDKUI_Globals, IconArrowRight, IconMenuCAArchive, getListMaxItems } from '../../../helper';
|
|
8
7
|
import { useQueryParametersDialog } from '../../../hooks/useQueryParametersDialog';
|
|
9
8
|
import { FormModes } from '../../../ts';
|
|
@@ -13,7 +12,6 @@ import ShowAlert from '../../base/TMAlert';
|
|
|
13
12
|
import TMButton from '../../base/TMButton';
|
|
14
13
|
import { useDeviceType, DeviceType } from '../../base/TMDeviceProvider';
|
|
15
14
|
import TMDropDownMenu from '../../base/TMDropDownMenu';
|
|
16
|
-
import TMLayoutContainer from '../../base/TMLayout';
|
|
17
15
|
import { TMExceptionBoxManager } from '../../base/TMPopUp';
|
|
18
16
|
import TMSpinner from '../../base/TMSpinner';
|
|
19
17
|
import TMPanel from '../../base/TMPanel';
|
|
@@ -22,6 +20,7 @@ import { TMMetadataChooserForm } from '../../choosers/TMMetadataChooser';
|
|
|
22
20
|
import TMQueryEditor from '../../query/TMQueryEditor';
|
|
23
21
|
import TMSavedQueryForm from './TMSavedQueryForm';
|
|
24
22
|
import { AdvancedMenuButtons } from '../../editors/TMMetadataValues';
|
|
23
|
+
import TMToppyMessage from '../../../helper/TMToppyMessage';
|
|
25
24
|
const TMSearchQueryPanel = ({ fromDTD, showBackToResultButton, isExpertMode = SDKUI_Globals.userSettings.advancedSettings.expertMode === 1, SQD, inputMids, onSearchCompleted, onSqdSaved, onBack, onClosePanel, allowMaximize = true, onMaximizePanel, onBackToResult, passToArchiveCallback }) => {
|
|
26
25
|
const [confirmQueryParams, ConfirmQueryParamsDialog] = useQueryParametersDialog();
|
|
27
26
|
const [qd, setQd] = useState();
|
|
@@ -317,36 +316,19 @@ const TMSearchQueryPanel = ({ fromDTD, showBackToResultButton, isExpertMode = SD
|
|
|
317
316
|
: _jsx(_Fragment, {}) }), children: [_jsx(ConfirmQueryParamsDialog, {}), SQD
|
|
318
317
|
? _jsxs("div", { style: { height: '100%', width: '100%', position: 'relative', display: 'flex', flexDirection: 'column', gap: 5 }, children: [showAdvancedSearch
|
|
319
318
|
? _jsx(TMQueryEditor, { formMode: FormModes.Update, showToolbar: false, inputData: qd, validateSelect: true, showApply: false, onQDChanged: handleQdChanged })
|
|
320
|
-
: _jsx(TMSearchQueryEditor, { qd: qd, dcmtTypesList: dcmtTypesList, isExpertMode: isExpertMode, showAllMdWhere: showAllMdWhere, onQdChanged: handleQdChanged, onFocusedMetadataChanged: setFocusedTidMid, onAdvancedMenuClick: handleAdvancedMenuClick }),
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
boxSizing: 'border-box'
|
|
329
|
-
}, children: [_jsxs("div", { style: {
|
|
330
|
-
display: 'flex',
|
|
331
|
-
justifyContent: 'center',
|
|
332
|
-
alignItems: 'center',
|
|
333
|
-
gap: '10px',
|
|
334
|
-
flex: '1 1 auto',
|
|
335
|
-
minWidth: 0,
|
|
336
|
-
}, children: [_jsx(TMButton, { btnStyle: 'advanced', icon: _jsx(IconSearch, {}), showTooltip: false, width: '90px', caption: SDKUI_Localizator.Search, advancedColor: '#4A96D2', onClick: handleSearchButtonClick }), _jsx(TMButton, { width: '90px', btnStyle: 'advanced', advancedType: 'primary', showTooltip: false, caption: SDKUI_Localizator.Clear, icon: _jsx(IconClear, {}), advancedColor: 'white', color: 'primaryOutline', onClick: clearFilters })] }), (!showAdvancedSearch && qd?.where && qd.where.length > initialMaxItems) && (_jsx("div", { style: { flex: '0 0 auto' }, children: _jsx(TMButton, { width: '120px', btnStyle: isMobile ? 'icon' : 'advanced', advancedColor: TMColors.button_primary, caption: captionText, showTooltip: false, icon: isMobile ? (_jsx("div", { style: {
|
|
337
|
-
backgroundColor: TMColors.button_primary,
|
|
338
|
-
minWidth: '30px',
|
|
339
|
-
minHeight: '30px',
|
|
340
|
-
borderRadius: '10px',
|
|
341
|
-
display: 'flex',
|
|
342
|
-
alignItems: 'center',
|
|
343
|
-
justifyContent: 'center',
|
|
344
|
-
}, children: _jsx("p", { style: { color: 'white', margin: 0 }, children: showAllMdWhere ? `-${diff}` : `+${diff}` }) })) : (_jsx("p", { style: { color: 'white', margin: 0 }, children: showAllMdWhere ? `-${diff}` : `+${diff}` })), onClick: () => setShowAllMdWhere(!showAllMdWhere) }) }))] }) }), showFiltersConfig &&
|
|
319
|
+
: _jsx(TMSearchQueryEditor, { qd: qd, dcmtTypesList: dcmtTypesList, isExpertMode: isExpertMode, showAllMdWhere: showAllMdWhere, onQdChanged: handleQdChanged, onFocusedMetadataChanged: setFocusedTidMid, onAdvancedMenuClick: handleAdvancedMenuClick }), _jsxs("div", { style: {
|
|
320
|
+
display: 'flex',
|
|
321
|
+
flexWrap: 'wrap',
|
|
322
|
+
justifyContent: 'center',
|
|
323
|
+
alignItems: 'center',
|
|
324
|
+
gap: '10px',
|
|
325
|
+
width: '100%'
|
|
326
|
+
}, children: [_jsx(TMButton, { btnStyle: 'advanced', icon: _jsx(IconSearch, {}), showTooltip: false, width: '90px', caption: SDKUI_Localizator.Search, advancedColor: '#4A96D2', onClick: handleSearchButtonClick }), _jsx(TMButton, { width: '90px', btnStyle: 'advanced', advancedType: 'primary', showTooltip: false, caption: SDKUI_Localizator.Clear, icon: _jsx(IconClear, {}), advancedColor: 'white', color: 'primaryOutline', onClick: clearFilters }), (!showAdvancedSearch && qd?.where && qd.where.length > initialMaxItems) && (_jsx(TMButton, { width: '120px', btnStyle: isMobile ? 'icon' : 'advanced', advancedColor: TMColors.button_primary, caption: captionText, showTooltip: false, icon: isMobile ? (_jsx("div", { children: _jsx("p", { children: showAllMdWhere ? `-${diff}` : `+${diff}` }) })) : (_jsx("p", { children: showAllMdWhere ? `-${diff}` : `+${diff}` })), onClick: () => setShowAllMdWhere(!showAllMdWhere) }))] }), showFiltersConfig &&
|
|
345
327
|
_jsx(TMMetadataChooserForm, { allowMultipleSelection: true, height: '500px', width: '600px', allowSysMetadata: true, qd: qd, selectedIDs: qd?.where?.map((w) => ({ tid: w.tid, mid: w.mid })), onClose: handleCloseFiltersConfig, onChoose: handleChooseFilters }), showOutputConfig &&
|
|
346
328
|
_jsx(TMMetadataChooserForm, { allowMultipleSelection: true, height: '500px', width: '600px', allowSysMetadata: true, qd: qd, selectedIDs: qd?.select?.map((item) => ({ tid: item.tid, mid: item.mid })), onClose: handleCloseOutputConfig, onChoose: handleChooseOutput }), showOrderByConfig &&
|
|
347
329
|
_jsx(TMMetadataChooserForm, { allowMultipleSelection: true, height: '500px', width: '600px', allowSysMetadata: true, qd: qd, selectedIDs: qd?.orderBy?.map((item) => ({ tid: item.tid, mid: item.mid })), onClose: handleCloseOrderByConfig, onChoose: handleChooseOrderBy })] })
|
|
348
330
|
:
|
|
349
|
-
|
|
331
|
+
_jsx(TMToppyMessage, { message: SDKUI_Localizator.DcmtTypeSelectOrQuickSearch, titleTooltip: SDKUI_Localizator.DcmtTypeSelectOrQuickSearch }), showSqdForm &&
|
|
350
332
|
_jsx(StyledModalContainer, { style: { backgroundColor: `${TMColors.backgroundColorHeader}12` }, children: _jsx(TMSavedQueryForm, { height: '50%', width: '50%', id: formModeSqdForm === FormModes.Create ? -1 : SQD?.id, title: 'Ricerca rapida', formMode: formModeSqdForm, showBackButton: true, qd: qd, isAdvancedSearch: showAdvancedSearch, isModal: false, onClose: () => { setShowSqdForm(false); }, onSaved: onSqdSaved }) })] }), showDistinctValuesPanel &&
|
|
351
333
|
_jsx(TMDistinctValues, { isModal: true, tid: focusedTidMid?.tid, mid: focusedTidMid?.mid, separator: ',', onClosePanelCallback: () => setShowDistinctValuesPanel(false), onSelectionChanged: (e) => {
|
|
352
334
|
if (!e)
|