@topconsultnpm/sdkui-react 6.20.0-dev1.125 → 6.20.0-dev1.126

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.
@@ -13,7 +13,7 @@ export interface ITMPanelProps {
13
13
  backgroundColorContainer?: string;
14
14
  children?: React.ReactNode;
15
15
  showHeader?: boolean;
16
- title?: any;
16
+ title?: React.ReactNode;
17
17
  displayedItemsCount?: number;
18
18
  totalItems?: number;
19
19
  toolbar?: any;
@@ -8,7 +8,7 @@ import { DeviceType, useDeviceType } from '../../base/TMDeviceProvider';
8
8
  import { useDcmtOperations } from '../../../hooks/useDcmtOperations';
9
9
  import { useRelatedDocuments } from '../../../hooks/useRelatedDocuments';
10
10
  import { getWorkItemSetIDAsync, handleArchiveVisibility, searchResultToMetadataValues } from '../../../helper/queryHelper';
11
- import { genUniqueId, IconShow, SDKUI_Localizator, updateMruTids, IconBoard, IconDcmtTypeSys, IconDetailDcmts, IconDownload, calcIsModified, IconMenuVertical, Globalization, getListMaxItems, getSystemMetadata, IconBoxArchiveIn, IconClear, IconUndo, SDKUI_Globals, IconPreview, isTaskMoreInfo, IconWorkflow, IconSearch, deepCompare, IconCheck, IconActivity, TMImageLibrary, IconStar, IconRelation, IconInfo, IconArchiveDoc, IconDelete, IconPair, IconUnpair, IconArchiveMaster, IconArchiveDetail, getExceptionMessage, isApprovalWorkflowView, getDcmtCicoStatus, IconFileDots, IconCustom, buildWorkItemsFromWFCtrl } from '../../../helper';
11
+ import { genUniqueId, IconShow, SDKUI_Localizator, updateMruTids, IconBoard, IconDcmtTypeSys, IconDetailDcmts, IconDownload, calcIsModified, IconMenuVertical, Globalization, getListMaxItems, getSystemMetadata, IconBoxArchiveIn, IconClear, IconUndo, SDKUI_Globals, IconPreview, isTaskMoreInfo, IconWorkflow, IconSearch, deepCompare, IconCheck, IconActivity, TMImageLibrary, IconStar, IconRelation, IconInfo, IconArchiveDoc, IconDelete, IconPair, IconUnpair, IconArchiveMaster, IconArchiveDetail, getExceptionMessage, isApprovalWorkflowView, getDcmtCicoStatus, IconFileDots, IconCustom, buildWorkItemsFromWFCtrl, IconLock } from '../../../helper';
12
12
  import { hasDetailRelations, hasMasterRelations, isXMLFileExt } from '../../../helper/dcmtsHelper';
13
13
  import { Gutters, TMColors } from '../../../utils/theme';
14
14
  import { StyledFormButtonsContainer, StyledLoadingContainer, StyledModalContainer, StyledReferenceButton, StyledSpinner, StyledToolbarCardContainer } from '../../base/Styled';
@@ -62,6 +62,7 @@ export var InvocationContext;
62
62
  // Aggiungi qui altri contesti futuri secondo necessità
63
63
  })(InvocationContext || (InvocationContext = {}));
64
64
  let abortControllerLocal = new AbortController();
65
+ ;
65
66
  //#endregion
66
67
  const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTaskCallback, editTaskCallback, handleNavigateToWGs, handleNavigateToDossiers, showHeader = true, onSaveRecents, layoutMode = LayoutModes.Update, showBackButton = true, onClose, onSavedAsyncCallback, TID, DID, formMode = FormModes.Update, canNext, canPrev, count, itemIndex, onNext, onPrev, allowNavigation = true, allowRelations = true, isClosable = false, isExpertMode = SDKUI_Globals.userSettings.advancedSettings.expertMode === 1, showDcmtFormSidebar = true, invocationContext = InvocationContext.Default, titleModal, isModal = false, widthModal = "100%", heightModal = "100%", groupId, onWFOperationCompleted, onTaskCompleted, onTaskCreateRequest, inputFile = null, taskFormDialogComponent, moreInfoTasks, connectorFileSave = undefined, inputMids = [], openS4TViewer = false, onOpenS4TViewerRequest, s4TViewerDialogComponent, enableDragDropOverlay = false, passToSearch, isSharedDcmt = false, sharedSourceTID, sharedSourceDID, allowButtonsRefs = false, onReferenceClick, }) => {
67
68
  const { showHistory, showHistoryCallback, hideHistoryCallback, showCheckoutInformationForm, commentFormState, hideCommentFormCallback, showCheckoutInformationFormCallback, hideCheckoutInformationFormCallback, copyCheckoutPathToClipboardCallback, handleCheckOutCallback, handleCheckInCallback, refreshPreviewTrigger, showCicoWaitPanel, cicoWaitPanelTitle, showCicoPrimaryProgress, cicoPrimaryProgressText, cicoPrimaryProgressValue, cicoPrimaryProgressMax, } = useCheckInOutOperations();
@@ -121,6 +122,7 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
121
122
  // Stato per triggerare il refresh del blog dall'esterno
122
123
  const [refreshBlogTrigger, setRefreshBlogTrigger] = useState(0);
123
124
  const [wfError, setWfError] = useState(null);
125
+ const [metadataDcmtOrigin, setMetadataDcmtOrigin] = useState(null);
124
126
  const triggerBlogRefresh = useCallback(async () => {
125
127
  setRefreshBlogTrigger(prev => prev + 1);
126
128
  }, []);
@@ -188,10 +190,11 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
188
190
  return;
189
191
  TMSpinner.show({ description: 'Loading Metadata...' });
190
192
  let res = getMetadataResult ?? await SDK_Globals.tmSession?.NewSearchEngine().GetMetadataAsync(TID, did, true);
193
+ const origin = { fromName: res?.fromName, fromTID: res?.fromTID };
191
194
  let dtd = res?.dtdResult;
192
195
  let rows = dtd.rows ? dtd.rows[0] : [];
193
196
  let mids = res?.selectMIDs;
194
- let metadataList = searchResultToMetadataValues(TID, dtd, rows, mids, mdList, layoutMode);
197
+ let metadataList = searchResultToMetadataValues(TID, dtd, rows, mids, mdList, layoutMode, origin.fromTID?.toString() !== TID?.toString());
195
198
  if (archived) {
196
199
  // Usa setFormData con funzione callback per accedere allo stato precedente
197
200
  // invece di dipendere da formDataOrig nell'array di dipendenze
@@ -217,6 +220,7 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
217
220
  });
218
221
  return;
219
222
  }
223
+ setMetadataDcmtOrigin(origin);
220
224
  setFormDataOrig(structuredClone(metadataList));
221
225
  setFormData(structuredClone(metadataList));
222
226
  // Sincronizza il ref con i dati caricati per evitare stale closure in handleSave
@@ -278,7 +282,7 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
278
282
  }
279
283
  else {
280
284
  const renderedMetadata = dtd?.metadata?.filter((metadata) => handleArchiveVisibility(metadata)) ?? [];
281
- const metadataList = searchResultToMetadataValues(dtd?.id, undefined, [], [], renderedMetadata, layoutMode);
285
+ const metadataList = searchResultToMetadataValues(dtd?.id, undefined, [], [], renderedMetadata, layoutMode, metadataDcmtOrigin?.fromTID?.toString() !== TID?.toString());
282
286
  setFormDataOrig(structuredClone(metadataList));
283
287
  setFormData(structuredClone(metadataList));
284
288
  formDataOrigRef.current = structuredClone(metadataList);
@@ -293,7 +297,7 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
293
297
  setIsInitialLoading(false);
294
298
  setIsNavigating(false);
295
299
  }
296
- }, [TID, DID, layoutMode, inputFile, setMetadataList, handleReset, allowButtonsRefs]);
300
+ }, [TID, DID, layoutMode, inputFile, setMetadataList, handleReset, allowButtonsRefs, metadataDcmtOrigin?.fromTID]);
297
301
  const createChange = useCallback((mid, metadataType, modifiedValue) => {
298
302
  return { mid, metadataType, modifiedValue };
299
303
  }, []);
@@ -1377,6 +1381,11 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
1377
1381
  };
1378
1382
  const initialPanels = useMemo(() => {
1379
1383
  const { assignedToMe, assignedByMe } = getDcmtTasksCounter(TID, DID, allTasks);
1384
+ let titleDcmtFormPanel = fromDTD?.nameLoc ?? "";
1385
+ // Caso: Il documento proviene da un'origine esterna
1386
+ if (metadataDcmtOrigin?.fromTID?.toString() !== TID?.toString()) {
1387
+ titleDcmtFormPanel = (_jsxs("div", { style: { display: 'inline-flex', alignItems: 'center', gap: '4px' }, children: [_jsx(TMTooltip, { content: _jsxs("div", { style: { textAlign: 'left' }, children: [_jsx("p", { children: "Questo documento proviene da un'altra origine e non pu\u00F2 essere modificato." }), _jsx("hr", {}), _jsxs("p", { children: [_jsx("strong", { children: "TID corrente:" }), " ", TID?.toString()] }), _jsxs("p", { children: [_jsx("strong", { children: "Nome corrente:" }), " ", fromDTD?.nameLoc] }), _jsx("hr", {}), _jsxs("p", { children: [_jsx("strong", { children: "TID origine:" }), " ", metadataDcmtOrigin?.fromTID?.toString()] }), _jsxs("p", { children: [_jsx("strong", { children: "Nome origine:" }), " ", metadataDcmtOrigin?.fromName] })] }), children: _jsx(IconLock, { fontSize: 16, style: { alignSelf: 'center' } }) }), metadataDcmtOrigin?.fromName] }));
1388
+ }
1380
1389
  const panels = [
1381
1390
  {
1382
1391
  id: 'tmDcmtForm',
@@ -1386,7 +1395,7 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
1386
1395
  isClosable: isClosable,
1387
1396
  panelContainer: {
1388
1397
  showHeader: showHeader,
1389
- title: fromDTD?.nameLoc,
1398
+ title: titleDcmtFormPanel,
1390
1399
  allowMaximize: !isMobile,
1391
1400
  onBack: showBackButton ? (isClosable && deviceType !== DeviceType.MOBILE) ? undefined : handleClose : undefined,
1392
1401
  onClose: isClosable ? () => { } : undefined,
@@ -1458,7 +1467,7 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
1458
1467
  },
1459
1468
  ];
1460
1469
  return panels;
1461
- }, [fromDTD, showBackButton, tmDcmtForm, tmBlog, tmSysMetadata, tmDcmtPreview, tmWF, tmDcmtTasks, isPreviewDisabled, isSysMetadataDisabled, isBoardDisabled, isWFDisabled, inputFile, isClosable, allTasks, DID, TID]);
1470
+ }, [fromDTD, showBackButton, tmDcmtForm, tmBlog, tmSysMetadata, tmDcmtPreview, tmWF, tmDcmtTasks, isPreviewDisabled, isSysMetadataDisabled, isBoardDisabled, isWFDisabled, inputFile, isClosable, allTasks, DID, TID, metadataDcmtOrigin?.fromTID]);
1462
1471
  // Retrieves the current document form setting based on the normalized TID
1463
1472
  const getCurrentDcmtFormSetting = () => {
1464
1473
  const settings = SDKUI_Globals.userSettings.dcmtFormSettings;
@@ -15,5 +15,5 @@ export declare function getDefaultOperator(dataDomain: MetadataDataDomains | und
15
15
  export declare const getQD: (tid: number | undefined, easyOr: boolean, newMaxDcmtsToBeReturned: number) => Promise<QueryDescriptor | undefined>;
16
16
  export declare const getWorkItemSetIDAsync: (vid: number, did: number) => Promise<string | undefined>;
17
17
  export declare const getSysAllDcmtsSQD: (tid: number | undefined, easyOr: boolean) => Promise<SavedQueryDescriptor>;
18
- export declare const searchResultToMetadataValues: (tid: number | undefined, dtd: DataTableDescriptor | undefined, rows: string[], mids: number[], metadata: MetadataDescriptor[], layoutMode: LayoutModes) => MetadataValueDescriptorEx[];
18
+ export declare const searchResultToMetadataValues: (tid: number | undefined, dtd: DataTableDescriptor | undefined, rows: string[], mids: number[], metadata: MetadataDescriptor[], layoutMode: LayoutModes, isReadOnlyOrigin?: boolean) => MetadataValueDescriptorEx[];
19
19
  export declare const handleArchiveVisibility: (md: MetadataDescriptor) => boolean;
@@ -260,7 +260,7 @@ export const getSysAllDcmtsSQD = async (tid, easyOr) => {
260
260
  sqd.qd = await getQD(tid, easyOr, SDKUI_Globals.userSettings.searchSettings?.maxDcmtsToBeReturned ?? 1000);
261
261
  return sqd;
262
262
  };
263
- export const searchResultToMetadataValues = (tid, dtd, rows, mids, metadata, layoutMode) => {
263
+ export const searchResultToMetadataValues = (tid, dtd, rows, mids, metadata, layoutMode, isReadOnlyOrigin = false) => {
264
264
  if (!metadata || metadata.length === 0) {
265
265
  return [];
266
266
  }
@@ -345,27 +345,53 @@ export const searchResultToMetadataValues = (tid, dtd, rows, mids, metadata, lay
345
345
  }
346
346
  return mvd;
347
347
  };
348
- metadata.forEach(md => {
349
- if (!md.id)
350
- return;
351
- if (layoutMode === LayoutModes.Ark && !handleArchiveVisibility(md))
352
- return;
353
- if (!rows)
354
- return;
355
- if (mids.length > 0) {
356
- const index = mids.indexOf(md.id);
357
- if (index >= 0) {
358
- const isLexProt = (isLexProtIndex !== undefined && rows[isLexProtIndex]) ? (parseInt(rows[isLexProtIndex]) || undefined) : undefined;
359
- outputMetadataList.push(createMetadataProps(tid, md, rows[index], isLexProt));
348
+ // Caso: il documento proviene da un'origine esterna e non può essere modificato
349
+ // Documento esterno: visualizza tutti i metadati non di sistema come read-only
350
+ if (isReadOnlyOrigin) {
351
+ const columns = dtd?.columns || [];
352
+ const rows = dtd?.rows ?? [];
353
+ // Itera su ogni colonna per costruire la metadata read-only
354
+ columns.forEach((col, index) => {
355
+ // MID: identificatore unico della colonna
356
+ const mid = Number(col.extendedProperties?.MID);
357
+ // Solo se MID > 100 (per escludere i metadati di sistema)
358
+ if (mid > 100 && rows[0] && rows[0][index]) {
359
+ // Cerca nei metadata se esiste un oggetto corrispondente a questo MID
360
+ const md = metadata.find(m => m.fromMID === mid);
361
+ if (!md)
362
+ return;
363
+ // Crea le proprietà del metadata impostando isReadOnly a true
364
+ const metadataProps = createMetadataProps(tid, md, rows[0][index], 0);
365
+ metadataProps.isReadOnly = true;
366
+ // Aggiunge l'oggetto read-only alla lista di output
367
+ outputMetadataList.push(metadataProps);
360
368
  }
361
- }
362
- else {
363
- let defaultValue;
364
- if (layoutMode === LayoutModes.Ark && (md.dataDomain === MetadataDataDomains.DataList || md.dataDomain === MetadataDataDomains.DynamicDataList || md.dataDomain === MetadataDataDomains.UserID))
365
- defaultValue = md.defaultValue;
366
- outputMetadataList.push(createMetadataProps(tid, md, defaultValue, undefined));
367
- }
368
- });
369
+ });
370
+ }
371
+ else {
372
+ // Caso: documento locale/modificabile
373
+ metadata.forEach(md => {
374
+ if (!md.id)
375
+ return;
376
+ if (layoutMode === LayoutModes.Ark && !handleArchiveVisibility(md))
377
+ return;
378
+ if (!rows)
379
+ return;
380
+ if (mids.length > 0) {
381
+ const index = mids.indexOf(md.id);
382
+ if (index >= 0) {
383
+ const isLexProt = (isLexProtIndex !== undefined && rows[isLexProtIndex]) ? (parseInt(rows[isLexProtIndex]) || undefined) : undefined;
384
+ outputMetadataList.push(createMetadataProps(tid, md, rows[index], isLexProt));
385
+ }
386
+ }
387
+ else {
388
+ let defaultValue;
389
+ if (layoutMode === LayoutModes.Ark && (md.dataDomain === MetadataDataDomains.DataList || md.dataDomain === MetadataDataDomains.DynamicDataList || md.dataDomain === MetadataDataDomains.UserID))
390
+ defaultValue = md.defaultValue;
391
+ outputMetadataList.push(createMetadataProps(tid, md, defaultValue, undefined));
392
+ }
393
+ });
394
+ }
369
395
  return outputMetadataList;
370
396
  };
371
397
  export const handleArchiveVisibility = (md) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@topconsultnpm/sdkui-react",
3
- "version": "6.20.0-dev1.125",
3
+ "version": "6.20.0-dev1.126",
4
4
  "description": "",
5
5
  "scripts": {
6
6
  "test": "echo \"Error: no test specified\" && exit 1",