@topconsultnpm/sdkui-react 6.20.0-dev1.9 → 6.20.0-dev1.90
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/assets/Toppy-help-center.png +0 -0
- package/lib/components/NewComponents/ContextMenu/TMContextMenu.d.ts +4 -0
- package/lib/components/NewComponents/ContextMenu/TMContextMenu.js +441 -0
- package/lib/components/NewComponents/ContextMenu/hooks.d.ts +18 -0
- package/lib/components/NewComponents/ContextMenu/hooks.js +120 -0
- package/lib/components/NewComponents/ContextMenu/index.d.ts +5 -0
- package/lib/components/NewComponents/ContextMenu/index.js +3 -0
- package/lib/components/NewComponents/ContextMenu/styles.d.ts +35 -0
- package/lib/components/NewComponents/ContextMenu/styles.js +428 -0
- package/lib/components/NewComponents/ContextMenu/types.d.ts +39 -0
- package/lib/components/NewComponents/ContextMenu/types.js +1 -0
- package/lib/components/NewComponents/ContextMenu/useLongPress.d.ts +21 -0
- package/lib/components/NewComponents/ContextMenu/useLongPress.js +112 -0
- package/lib/components/NewComponents/FloatingMenuBar/TMFloatingMenuBar.d.ts +4 -0
- package/lib/components/NewComponents/FloatingMenuBar/TMFloatingMenuBar.js +821 -0
- package/lib/components/NewComponents/FloatingMenuBar/index.d.ts +2 -0
- package/lib/components/NewComponents/FloatingMenuBar/index.js +2 -0
- package/lib/components/NewComponents/FloatingMenuBar/styles.d.ts +54 -0
- package/lib/components/NewComponents/FloatingMenuBar/styles.js +419 -0
- package/lib/components/NewComponents/FloatingMenuBar/types.d.ts +36 -0
- package/lib/components/NewComponents/FloatingMenuBar/types.js +1 -0
- package/lib/components/base/TMAccordionNew.js +35 -14
- package/lib/components/base/TMCustomButton.js +61 -17
- package/lib/components/base/TMDataGrid.d.ts +7 -4
- package/lib/components/base/TMDataGrid.js +144 -11
- package/lib/components/base/TMDropDownMenu.js +19 -18
- package/lib/components/base/TMFileManager.d.ts +4 -3
- package/lib/components/base/TMFileManager.js +32 -24
- package/lib/components/base/TMFileManagerDataGridView.d.ts +3 -2
- package/lib/components/base/TMFileManagerDataGridView.js +1 -11
- package/lib/components/base/TMFileManagerThumbnailItems.d.ts +7 -1
- package/lib/components/base/TMFileManagerThumbnailItems.js +5 -2
- package/lib/components/base/TMFileManagerThumbnailsView.d.ts +17 -4
- package/lib/components/base/TMFileManagerThumbnailsView.js +18 -6
- package/lib/components/base/TMFileManagerUtils.d.ts +0 -12
- package/lib/components/base/TMPanel.js +1 -1
- package/lib/components/choosers/TMInvoiceRetrieveFormats.js +1 -1
- package/lib/components/choosers/TMMetadataChooser.js +8 -1
- package/lib/components/choosers/TMOrderRetrieveFormats.js +1 -1
- package/lib/components/choosers/TMUserChooser.d.ts +0 -5
- package/lib/components/choosers/TMUserChooser.js +25 -45
- package/lib/components/editors/TMMetadataValues.js +23 -5
- package/lib/components/editors/TMTextBox.js +6 -3
- package/lib/components/features/assistant/TMToppyDraggableHelpCenter.d.ts +15 -0
- package/lib/components/features/assistant/TMToppyDraggableHelpCenter.js +460 -0
- package/lib/components/features/assistant/TMToppySpeechBubble.d.ts +11 -0
- package/lib/components/features/assistant/TMToppySpeechBubble.js +126 -0
- package/lib/components/features/documents/TMDcmtForm.d.ts +13 -1
- package/lib/components/features/documents/TMDcmtForm.js +442 -198
- package/lib/components/features/documents/TMDcmtPreview.js +41 -105
- package/lib/components/features/documents/TMDcmtTasks.js +9 -9
- package/lib/components/features/documents/TMMasterDetailDcmts.js +37 -52
- package/lib/components/features/documents/TMRelationViewer.d.ts +1 -1
- package/lib/components/features/documents/TMRelationViewer.js +2 -2
- package/lib/components/features/search/TMDcmtCheckoutInfoForm.d.ts +8 -0
- package/lib/components/features/search/{TMSearchResultCheckoutInfoForm.js → TMDcmtCheckoutInfoForm.js} +2 -2
- package/lib/components/features/search/TMSavedQuerySelector.js +72 -67
- package/lib/components/features/search/TMSearch.js +44 -9
- package/lib/components/features/search/TMSearchQueryPanel.d.ts +1 -0
- package/lib/components/features/search/TMSearchQueryPanel.js +19 -18
- package/lib/components/features/search/TMSearchResult.js +187 -247
- package/lib/components/features/search/TMSearchResultsMenuItems.d.ts +3 -3
- package/lib/components/features/search/TMSearchResultsMenuItems.js +205 -169
- package/lib/components/features/search/TMSignSettingsForm.js +1 -1
- package/lib/components/features/search/TMSignatureInfoContent.d.ts +6 -0
- package/lib/components/features/search/TMSignatureInfoContent.js +140 -0
- package/lib/components/features/search/TMViewHistoryDcmt.js +1 -1
- package/lib/components/features/tasks/TMTaskForm.js +20 -1
- package/lib/components/features/tasks/TMTasksAgenda.d.ts +3 -1
- package/lib/components/features/tasks/TMTasksAgenda.js +48 -9
- package/lib/components/features/tasks/TMTasksCalendar.d.ts +2 -0
- package/lib/components/features/tasks/TMTasksCalendar.js +19 -7
- package/lib/components/features/tasks/TMTasksUtils.d.ts +2 -2
- package/lib/components/features/tasks/TMTasksUtils.js +43 -36
- package/lib/components/features/tasks/TMTasksView.js +28 -19
- package/lib/components/features/workflow/TMWorkflowPopup.d.ts +33 -2
- package/lib/components/features/workflow/TMWorkflowPopup.js +139 -34
- package/lib/components/features/workflow/diagram/DiagramItemComponent.d.ts +1 -0
- package/lib/components/features/workflow/diagram/DiagramItemComponent.js +2 -3
- package/lib/components/features/workflow/diagram/RecipientList.js +3 -2
- package/lib/components/features/workflow/diagram/WFDiagram.d.ts +3 -0
- package/lib/components/features/workflow/diagram/WFDiagram.js +157 -12
- package/lib/components/forms/Login/LoginValidatorService.d.ts +2 -0
- package/lib/components/forms/Login/LoginValidatorService.js +7 -2
- package/lib/components/forms/Login/TMLoginForm.js +34 -6
- package/lib/components/forms/TMChooserForm.js +1 -1
- package/lib/components/grids/TMBlogsPost.js +55 -30
- package/lib/components/grids/TMRecentsManager.js +20 -10
- package/lib/components/index.d.ts +5 -1
- package/lib/components/index.js +5 -1
- package/lib/components/query/TMQueryEditor.d.ts +2 -1
- package/lib/components/query/TMQueryEditor.js +92 -92
- package/lib/components/settings/SettingsAppearance.d.ts +2 -1
- package/lib/components/settings/SettingsAppearance.js +99 -30
- package/lib/components/viewers/TMDataListItemViewer.d.ts +2 -1
- package/lib/components/viewers/TMDataListItemViewer.js +35 -71
- package/lib/components/viewers/TMDataUserIdItemViewer.d.ts +8 -0
- package/lib/components/viewers/TMDataUserIdItemViewer.js +39 -0
- package/lib/css/tm-sdkui.css +1 -1
- package/lib/helper/SDKUI_Globals.d.ts +19 -0
- package/lib/helper/SDKUI_Globals.js +6 -0
- package/lib/helper/SDKUI_Localizator.d.ts +16 -1
- package/lib/helper/SDKUI_Localizator.js +157 -1
- package/lib/helper/TMCommandsContextMenu.d.ts +4 -2
- package/lib/helper/TMCommandsContextMenu.js +15 -4
- package/lib/helper/TMIcons.d.ts +3 -0
- package/lib/helper/TMIcons.js +10 -3
- package/lib/helper/TMPdfViewer.d.ts +8 -0
- package/lib/helper/TMPdfViewer.js +373 -0
- package/lib/helper/checkinCheckoutManager.d.ts +31 -1
- package/lib/helper/checkinCheckoutManager.js +112 -30
- package/lib/helper/devextremeCustomMessages.d.ts +30 -0
- package/lib/helper/devextremeCustomMessages.js +30 -0
- package/lib/helper/helpers.d.ts +2 -1
- package/lib/helper/helpers.js +14 -3
- package/lib/helper/index.d.ts +2 -0
- package/lib/helper/index.js +2 -0
- package/lib/helper/queryHelper.d.ts +1 -1
- package/lib/helper/queryHelper.js +33 -3
- package/lib/helper/workItemsHelper.d.ts +6 -0
- package/lib/helper/workItemsHelper.js +230 -0
- package/lib/hooks/useCheckInOutOperations.d.ts +28 -0
- package/lib/hooks/useCheckInOutOperations.js +223 -0
- package/lib/hooks/useDataListItem.d.ts +12 -0
- package/lib/hooks/useDataListItem.js +131 -0
- package/lib/hooks/useDataUserIdItem.d.ts +10 -0
- package/lib/hooks/useDataUserIdItem.js +96 -0
- package/lib/hooks/useSettingsFeedback.d.ts +11 -0
- package/lib/hooks/useSettingsFeedback.js +38 -0
- package/lib/hooks/useWorkflowApprove.d.ts +4 -0
- package/lib/hooks/useWorkflowApprove.js +14 -1
- package/lib/index.d.ts +1 -0
- package/lib/index.js +3 -2
- package/lib/services/platform_services.d.ts +1 -1
- package/lib/ts/types.d.ts +61 -1
- package/lib/utils/theme.d.ts +1 -1
- package/lib/utils/theme.js +1 -1
- package/package.json +7 -4
- package/lib/components/features/assistant/ToppyDraggableHelpCenter.d.ts +0 -30
- package/lib/components/features/assistant/ToppyDraggableHelpCenter.js +0 -482
- package/lib/components/features/assistant/ToppySpeechBubble.d.ts +0 -9
- package/lib/components/features/assistant/ToppySpeechBubble.js +0 -117
- package/lib/components/features/search/TMSearchResultCheckoutInfoForm.d.ts +0 -8
|
@@ -1,15 +1,14 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
2
2
|
import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';
|
|
3
3
|
import TMDcmtPreview from './TMDcmtPreview';
|
|
4
|
-
import { AccessLevels, ArchiveConstraints, ArchiveEngineByID, DcmtTypeListCacheService, LayoutCacheService, LayoutModes, MetadataDataTypes, ObjectClasses, ResultTypes, SDK_Globals, SDK_Localizator, SystemMIDsAsNumber, SystemTIDs, Task_States,
|
|
5
|
-
import { ContextMenu } from 'devextreme-react';
|
|
4
|
+
import { AccessLevels, ArchiveConstraints, ArchiveEngineByID, DcmtTypeListCacheService, LayoutCacheService, LayoutModes, MetadataDataTypes, ObjectClasses, ResultTypes, SDK_Globals, SDK_Localizator, SystemMIDsAsNumber, SystemTIDs, Task_States, TID_DID, UpdateEngineByID, UserListCacheService, ValidationItem, WorkflowCacheService, WorkItemMetadataNames } from '@topconsultnpm/sdk-ts';
|
|
6
5
|
import { WorkFlowApproveRejectPopUp, WorkFlowMoreInfoPopUp, WorkFlowOperationButtons, WorkFlowReAssignPopUp } from '../workflow/TMWorkflowPopup';
|
|
7
6
|
import { DownloadTypes, FormModes, DcmtOperationTypes } from '../../../ts';
|
|
8
7
|
import { DeviceType, useDeviceType } from '../../base/TMDeviceProvider';
|
|
9
8
|
import { useDcmtOperations } from '../../../hooks/useDcmtOperations';
|
|
10
9
|
import { useRelatedDocuments } from '../../../hooks/useRelatedDocuments';
|
|
11
10
|
import { getWorkItemSetIDAsync, handleArchiveVisibility, searchResultToMetadataValues } from '../../../helper/queryHelper';
|
|
12
|
-
import { genUniqueId, IconShow, SDKUI_Localizator, updateMruTids, IconBoard, IconDcmtTypeSys, IconDetailDcmts,
|
|
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';
|
|
13
12
|
import { hasDetailRelations, hasMasterRelations, isXMLFileExt } from '../../../helper/dcmtsHelper';
|
|
14
13
|
import { Gutters, TMColors } from '../../../utils/theme';
|
|
15
14
|
import { StyledFormButtonsContainer, StyledLoadingContainer, StyledModalContainer, StyledReferenceButton, StyledSpinner, StyledToolbarCardContainer } from '../../base/Styled';
|
|
@@ -41,10 +40,31 @@ import TMDcmtTasks from './TMDcmtTasks';
|
|
|
41
40
|
import TMToppyMessage from '../../../helper/TMToppyMessage';
|
|
42
41
|
import { getTaskAssignedToMe } from '../tasks/TMTasksUtils';
|
|
43
42
|
import TMCustomButton from '../../base/TMCustomButton';
|
|
44
|
-
import
|
|
43
|
+
import { useCheckInOutOperations } from '../../../hooks/useCheckInOutOperations';
|
|
44
|
+
import TMViewHistoryDcmt from '../search/TMViewHistoryDcmt';
|
|
45
|
+
import TMDcmtCheckoutInfoForm from '../search/TMDcmtCheckoutInfoForm';
|
|
46
|
+
import styled from 'styled-components';
|
|
47
|
+
import { ContextMenu } from '../../NewComponents/ContextMenu';
|
|
48
|
+
import TMToppyDraggableHelpCenter from '../assistant/TMToppyDraggableHelpCenter';
|
|
49
|
+
//#region Interfaces, Types and Enums
|
|
50
|
+
/**
|
|
51
|
+
* Definisce il contesto da cui è stato invocato il TMDcmtForm.
|
|
52
|
+
* Permette di gestire logiche diverse in base alla provenienza.
|
|
53
|
+
*/
|
|
54
|
+
export var InvocationContext;
|
|
55
|
+
(function (InvocationContext) {
|
|
56
|
+
/** Invocazione standard */
|
|
57
|
+
InvocationContext["Default"] = "default";
|
|
58
|
+
/** Invocato dalla pagina Todo/Task */
|
|
59
|
+
InvocationContext["Todo"] = "todo";
|
|
60
|
+
/** Invocato dalla pagina WorkflowCtrl */
|
|
61
|
+
InvocationContext["WorkflowCtrl"] = "workflowCtrl";
|
|
62
|
+
// Aggiungi qui altri contesti futuri secondo necessità
|
|
63
|
+
})(InvocationContext || (InvocationContext = {}));
|
|
45
64
|
let abortControllerLocal = new AbortController();
|
|
46
65
|
//#endregion
|
|
47
|
-
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,
|
|
66
|
+
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, taskMoreInfo, connectorFileSave = undefined, inputMids = [], openS4TViewer = false, onOpenS4TViewerRequest, s4TViewerDialogComponent, enableDragDropOverlay = false, passToSearch, isSharedDcmt = false, sharedSourceTID, sharedSourceDID, allowButtonsRefs = false, onReferenceClick, }) => {
|
|
67
|
+
const { showHistory, showHistoryCallback, hideHistoryCallback, showCheckoutInformationForm, commentFormState, hideCommentFormCallback, showCheckoutInformationFormCallback, hideCheckoutInformationFormCallback, copyCheckoutPathToClipboardCallback, handleCheckOutCallback, handleCheckInCallback, refreshPreviewTrigger, showCicoWaitPanel, cicoWaitPanelTitle, showCicoPrimaryProgress, cicoPrimaryProgressText, cicoPrimaryProgressValue, cicoPrimaryProgressMax, } = useCheckInOutOperations();
|
|
48
68
|
const [id, setID] = useState('');
|
|
49
69
|
const [showWaitPanelLocal, setShowWaitPanelLocal] = useState(false);
|
|
50
70
|
const [waitPanelTitleLocal, setWaitPanelTitleLocal] = useState('');
|
|
@@ -68,6 +88,7 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
|
|
|
68
88
|
const [layout, setLayout] = useState();
|
|
69
89
|
const [customButtonsLayout, setCustomButtonsLayout] = useState();
|
|
70
90
|
const [customButton, setCustomButton] = useState();
|
|
91
|
+
const [allUsers, setAllUsers] = useState([]);
|
|
71
92
|
const appliedInputMidsRef = useRef(null);
|
|
72
93
|
// Refs per evitare stale closure nei callback
|
|
73
94
|
// I useCallback catturano i valori delle dipendenze al momento della creazione.
|
|
@@ -91,6 +112,7 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
|
|
|
91
112
|
const [fetchError, setFetchError] = useState(false);
|
|
92
113
|
const [isWFDataLoading, setIsWFDataLoading] = useState(false);
|
|
93
114
|
const [workItems, setWorkItems] = useState([]);
|
|
115
|
+
const [workItemsForDiagram, setWorkItemsForDiagram] = useState([]);
|
|
94
116
|
const [workflows, setWorkflows] = useState([]);
|
|
95
117
|
const [showCommentForm, setShowCommentForm] = useState(false);
|
|
96
118
|
const [isInitialLoading, setIsInitialLoading] = useState(true);
|
|
@@ -98,16 +120,24 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
|
|
|
98
120
|
const [dcmtReferences, setDcmtReferences] = useState(undefined);
|
|
99
121
|
// Stato per triggerare il refresh del blog dall'esterno
|
|
100
122
|
const [refreshBlogTrigger, setRefreshBlogTrigger] = useState(0);
|
|
123
|
+
const [wfError, setWfError] = useState(null);
|
|
101
124
|
const triggerBlogRefresh = useCallback(async () => {
|
|
102
125
|
setRefreshBlogTrigger(prev => prev + 1);
|
|
103
126
|
}, []);
|
|
127
|
+
useEffect(() => {
|
|
128
|
+
const fetchAllUsers = async () => {
|
|
129
|
+
const users = await UserListCacheService.GetAllAsync();
|
|
130
|
+
setAllUsers(users ?? []);
|
|
131
|
+
};
|
|
132
|
+
fetchAllUsers();
|
|
133
|
+
}, []);
|
|
104
134
|
useEffect(() => {
|
|
105
135
|
if (!allowButtonsRefs)
|
|
106
136
|
setDcmtReferences(undefined);
|
|
107
137
|
}, [allowButtonsRefs]);
|
|
108
138
|
const { openConfirmAttachmentsDialog, ConfirmAttachmentsDialog } = useInputAttachmentsDialog();
|
|
109
139
|
const { abortController, showWaitPanel, waitPanelTitle, showPrimary, waitPanelTextPrimary, waitPanelValuePrimary, waitPanelMaxValuePrimary, showSecondary, waitPanelTextSecondary, waitPanelValueSecondary, waitPanelMaxValueSecondary, downloadDcmtsAsync, runOperationAsync } = useDcmtOperations();
|
|
110
|
-
const { workflowApproveData } = useWorkflowApprove();
|
|
140
|
+
const { workflowApproveData, getWorkItemsByDID } = useWorkflowApprove();
|
|
111
141
|
const currentSearchResults = useMemo(() => {
|
|
112
142
|
if (!formData || formData.length === 0 || !TID || !DID)
|
|
113
143
|
return [];
|
|
@@ -124,7 +154,7 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
|
|
|
124
154
|
selectMIDs: selectMIDs,
|
|
125
155
|
dtdResult: {
|
|
126
156
|
rows: [rowValues],
|
|
127
|
-
columns: selectMIDs.map(mid => ({ name: `MID_${mid}
|
|
157
|
+
columns: selectMIDs.map(mid => ({ name: `MID_${mid}`, }))
|
|
128
158
|
},
|
|
129
159
|
dcmtsFound: 1,
|
|
130
160
|
dcmtsReturned: 1
|
|
@@ -410,74 +440,175 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
|
|
|
410
440
|
const workItemSetIDValue = useMemo(() => formData.find(o => o.md?.name === WorkItemMetadataNames.WI_SetID)?.value, [formData]);
|
|
411
441
|
// Valore derivato: true se formData ha elementi validi
|
|
412
442
|
const hasFormData = useMemo(() => formData.length > 0 && formData.some(md => md.mid && md.mid > 99), [formData]);
|
|
443
|
+
const handleCheckOutOperationCallback = async (checkout) => {
|
|
444
|
+
if (!currentDcmt)
|
|
445
|
+
return;
|
|
446
|
+
await handleCheckOutCallback({ TID: currentDcmt.tid, DID: currentDcmt.did, FILEEXT: currentDcmt.fileExt }, checkout, fromDTD?.name ?? SDKUI_Localizator.SearchResult, downloadDcmtsAsync, updateCurrentDcmt);
|
|
447
|
+
};
|
|
448
|
+
const handleCheckInOperationCallback = async () => {
|
|
449
|
+
if (!currentDcmt)
|
|
450
|
+
return;
|
|
451
|
+
await handleCheckInCallback({ TID: currentDcmt.tid, DID: currentDcmt.did, FILEEXT: currentDcmt.fileExt, fileName: fromDTD?.name ?? SDKUI_Localizator.SearchResult }, updateCurrentDcmt, undefined);
|
|
452
|
+
};
|
|
453
|
+
const copyCheckoutPathToClipboardOperationCallback = () => {
|
|
454
|
+
if (!currentDcmt)
|
|
455
|
+
return;
|
|
456
|
+
copyCheckoutPathToClipboardCallback({ TID: currentDcmt.tid, DID: currentDcmt.did, FILEEXT: currentDcmt.fileExt }, fromDTD?.name ?? SDKUI_Localizator.SearchResult);
|
|
457
|
+
};
|
|
458
|
+
// useEffect per il caricamento dei dati del workflow
|
|
413
459
|
useEffect(() => {
|
|
460
|
+
// Funzione helper per caricare le informazioni del workflow
|
|
461
|
+
const loadWorkflowInfo = async (tid) => {
|
|
462
|
+
await WorkflowCacheService.GetWFInfoAsync(tid)
|
|
463
|
+
.then((result) => {
|
|
464
|
+
if (result) {
|
|
465
|
+
setWorkflows([result]);
|
|
466
|
+
setWfError(null);
|
|
467
|
+
}
|
|
468
|
+
else {
|
|
469
|
+
setWorkflows([]);
|
|
470
|
+
setWfError("Workflow info not found");
|
|
471
|
+
}
|
|
472
|
+
})
|
|
473
|
+
.catch(error => {
|
|
474
|
+
setWorkflows([]);
|
|
475
|
+
console.log("Error fetching workflow info:", error);
|
|
476
|
+
setWfError(getExceptionMessage(error));
|
|
477
|
+
});
|
|
478
|
+
};
|
|
414
479
|
const loadAllWfData = async () => {
|
|
415
|
-
|
|
480
|
+
// FASE 1: Validazione prerequisiti
|
|
481
|
+
if (layoutMode !== LayoutModes.Update || !DID) {
|
|
416
482
|
setWorkItems([]);
|
|
417
483
|
setWorkflows([]);
|
|
418
484
|
return;
|
|
419
485
|
}
|
|
420
486
|
setIsWFDataLoading(true);
|
|
421
487
|
try {
|
|
422
|
-
//
|
|
423
|
-
const itemsToProcess =
|
|
424
|
-
|
|
425
|
-
for (const dataRow of workflow.dtdResult?.rows ?? []) {
|
|
426
|
-
const did = Number(dataRow?.[1]);
|
|
427
|
-
if (did === Number(DID)) {
|
|
428
|
-
const tid = Number(dataRow?.[0]);
|
|
429
|
-
itemsToProcess.push({ tid, did });
|
|
430
|
-
}
|
|
431
|
-
}
|
|
432
|
-
}
|
|
488
|
+
// FASE 2: Raccolta work items: array di tutti i possibili work items che matchano il DID corrente
|
|
489
|
+
const itemsToProcess = getWorkItemsByDID(Number(DID));
|
|
490
|
+
// Se non ci sono work items per questo DID, resetta e esci
|
|
433
491
|
if (itemsToProcess.length === 0) {
|
|
434
492
|
setWorkItems([]);
|
|
435
493
|
setWorkflows([]);
|
|
436
494
|
setIsWFDataLoading(false);
|
|
437
495
|
return;
|
|
438
496
|
}
|
|
439
|
-
//
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
497
|
+
// FASE 3: Ricerca work item specifico
|
|
498
|
+
// Cerca prima un match esatto con TID e DID correnti
|
|
499
|
+
const foundItem = itemsToProcess.find(item => item.tid === Number(TID) && item.did === Number(DID));
|
|
500
|
+
if (foundItem) {
|
|
501
|
+
// SCENARIO A: Match esatto trovato (TID e DID corrispondono)
|
|
502
|
+
// Il documento corrente è esattamente il work item nel workflow
|
|
503
|
+
let setID = undefined;
|
|
504
|
+
// Prova a usare il setID già presente nei metadati (più veloce)
|
|
505
|
+
if (workItemSetIDValue !== undefined) {
|
|
506
|
+
setID = workItemSetIDValue;
|
|
507
|
+
}
|
|
508
|
+
else {
|
|
509
|
+
// Altrimenti caricalo dal server
|
|
510
|
+
setID = await getWorkItemSetIDAsync(foundItem.tid, foundItem.did);
|
|
511
|
+
}
|
|
512
|
+
// Imposta un singolo work item con il setID caricato
|
|
513
|
+
setWorkItems([{
|
|
514
|
+
wid: `${foundItem.tid}_${foundItem.did}`,
|
|
515
|
+
tid: foundItem.tid,
|
|
516
|
+
did: foundItem.did,
|
|
517
|
+
setID: setID,
|
|
518
|
+
details: []
|
|
519
|
+
}]);
|
|
520
|
+
// Carica le informazioni complete del workflow
|
|
521
|
+
await loadWorkflowInfo(foundItem.tid);
|
|
444
522
|
}
|
|
445
523
|
else {
|
|
446
|
-
//
|
|
447
|
-
|
|
524
|
+
// SCENARIO B: Nessun match esatto, cerca solo per DID
|
|
525
|
+
const itemsByDID = itemsToProcess.filter(item => item.did === Number(DID));
|
|
526
|
+
if (itemsByDID.length === 1) {
|
|
527
|
+
// SCENARIO B.1: Un solo item trovato per DID
|
|
528
|
+
// Situazione sicura: sappiamo esattamente quale work item usare
|
|
529
|
+
const singleItem = itemsByDID[0];
|
|
530
|
+
let setID;
|
|
531
|
+
// Carica il setID (da cache o da server)
|
|
532
|
+
if (workItemSetIDValue !== undefined) {
|
|
533
|
+
setID = workItemSetIDValue;
|
|
534
|
+
}
|
|
535
|
+
else {
|
|
536
|
+
setID = await getWorkItemSetIDAsync(singleItem.tid, singleItem.did);
|
|
537
|
+
}
|
|
538
|
+
setWorkItems([{
|
|
539
|
+
wid: `${singleItem.tid}_${singleItem.did}`,
|
|
540
|
+
tid: singleItem.tid,
|
|
541
|
+
did: singleItem.did,
|
|
542
|
+
setID: setID,
|
|
543
|
+
details: []
|
|
544
|
+
}]);
|
|
545
|
+
// Carica le informazioni del workflow
|
|
546
|
+
await loadWorkflowInfo(singleItem.tid);
|
|
547
|
+
}
|
|
548
|
+
else if (itemsByDID.length > 1) {
|
|
549
|
+
// SCENARIO B.2: Più item trovati per lo stesso DID
|
|
550
|
+
// Ambiguità: lo stesso documento appare in più workflow diversi
|
|
551
|
+
const finalWorkItems = itemsByDID.map((item, index) => ({
|
|
552
|
+
wid: `${item.tid}_${item.did}_${index}`,
|
|
553
|
+
tid: item.tid,
|
|
554
|
+
did: item.did,
|
|
555
|
+
setID: undefined,
|
|
556
|
+
details: []
|
|
557
|
+
}));
|
|
558
|
+
setWorkItems(finalWorkItems);
|
|
559
|
+
setWorkflows([]); // Non carichiamo il workflow in caso di ambiguità
|
|
560
|
+
}
|
|
448
561
|
}
|
|
449
|
-
// Crea un array di Promise per tutte le chiamate a GetWFInfoAsync
|
|
450
|
-
const workflowInfoPromises = itemsToProcess.map(item => WorkflowCacheService.GetWFInfoAsync(item.tid));
|
|
451
|
-
// Esegui tutte le chiamate in parallelo e attendi i risultati
|
|
452
|
-
const setIDResults = await Promise.all(setIDPromises);
|
|
453
|
-
const workflowInfoResults = await Promise.all(workflowInfoPromises);
|
|
454
|
-
// Combina i risultati
|
|
455
|
-
const finalWorkItems = itemsToProcess.map((item, index) => ({
|
|
456
|
-
...item,
|
|
457
|
-
setID: setIDResults[index],
|
|
458
|
-
}));
|
|
459
|
-
const validWorkflows = workflowInfoResults.filter(Boolean);
|
|
460
|
-
// Aggiorna lo stato una sola volta con i dati finali
|
|
461
|
-
setWorkItems(finalWorkItems);
|
|
462
|
-
setWorkflows(validWorkflows);
|
|
463
562
|
}
|
|
464
563
|
catch (error) {
|
|
564
|
+
// FASE 4: Gestione errori
|
|
465
565
|
TMExceptionBoxManager.show({ exception: error });
|
|
466
566
|
setWorkItems([]);
|
|
467
567
|
setWorkflows([]);
|
|
468
568
|
}
|
|
469
569
|
finally {
|
|
570
|
+
// Garantisce sempre il reset del flag di loading
|
|
470
571
|
setIsWFDataLoading(false);
|
|
471
572
|
}
|
|
472
573
|
};
|
|
473
|
-
// Usa hasFormData invece di formDataRef.current
|
|
474
574
|
if (!hasFormData || !fromDTD?.id) {
|
|
475
|
-
// console.log("formData is empty or fromDTD not loaded, skipping loadAllWfData");
|
|
476
575
|
return;
|
|
477
576
|
}
|
|
478
577
|
if (workItemSetIDValue !== undefined || workflowApproveData.length > 0)
|
|
479
578
|
loadAllWfData();
|
|
480
|
-
}, [hasFormData, workItemSetIDValue, workflowApproveData, DID, layoutMode, fromDTD?.templateTID, fromDTD?.id]);
|
|
579
|
+
}, [hasFormData, workItemSetIDValue, workflowApproveData, getWorkItemsByDID, TID, DID, layoutMode, fromDTD?.templateTID, fromDTD?.id]);
|
|
580
|
+
// useEffect per costruire workItemsForDiagram quando l'utente è autorizzato a vedere il diagramma
|
|
581
|
+
useEffect(() => {
|
|
582
|
+
const buildWorkItemsForDiagram = async () => {
|
|
583
|
+
// Verifica se l'utente è autorizzato (ha accesso al diagramma)
|
|
584
|
+
const isAuthorized = !!workflows?.[0]?.diagram;
|
|
585
|
+
if (!isAuthorized || workItems.length === 0) {
|
|
586
|
+
setWorkItemsForDiagram([]);
|
|
587
|
+
return;
|
|
588
|
+
}
|
|
589
|
+
try {
|
|
590
|
+
// Estrai i dati necessari dal primo workItem
|
|
591
|
+
const firstWorkItem = workItems[0];
|
|
592
|
+
// Costruisci WFInstanceDescriptor dai dati disponibili
|
|
593
|
+
const wfInstance = {
|
|
594
|
+
wfid: workflows[0].id,
|
|
595
|
+
tid: TID,
|
|
596
|
+
did: DID,
|
|
597
|
+
instanceId: "", // Puoi adattare questo se hai un instanceId specifico,
|
|
598
|
+
rowIndex: 0,
|
|
599
|
+
values: []
|
|
600
|
+
};
|
|
601
|
+
// Chiama buildWorkItemsFromWFCtrl per ottenere i workItems completi
|
|
602
|
+
const detailedWorkItems = await buildWorkItemsFromWFCtrl(wfInstance);
|
|
603
|
+
setWorkItemsForDiagram(detailedWorkItems);
|
|
604
|
+
}
|
|
605
|
+
catch (error) {
|
|
606
|
+
console.error('Errore durante la costruzione dei work items per il diagramma:', error);
|
|
607
|
+
setWorkItemsForDiagram([]);
|
|
608
|
+
}
|
|
609
|
+
};
|
|
610
|
+
buildWorkItemsForDiagram();
|
|
611
|
+
}, [workflows, workItems]);
|
|
481
612
|
const getSelectionDcmtInfo = useCallback(() => {
|
|
482
613
|
let dcmts = [];
|
|
483
614
|
dcmts.push({ TID: TID ?? 0, DID: DID ?? 0 });
|
|
@@ -503,12 +634,17 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
|
|
|
503
634
|
const isSysMetadataDisabled = useMemo(() => layoutMode !== LayoutModes.Update, [layoutMode]);
|
|
504
635
|
const isDetailsDisabled = useMemo(() => layoutMode !== LayoutModes.Update || !DID, [layoutMode, DID]);
|
|
505
636
|
const isMasterDisabled = useMemo(() => layoutMode !== LayoutModes.Update || !DID, [layoutMode, DID]);
|
|
506
|
-
const isWFDisabled = useMemo(() => layoutMode !== LayoutModes.Update || fetchError || workItems.length <= 0, [layoutMode, fetchError, workItems.length]);
|
|
637
|
+
const isWFDisabled = useMemo(() => layoutMode !== LayoutModes.Update || fetchError || (workItems.length <= 0 && workItemsForDiagram.length <= 0), [layoutMode, fetchError, workItems.length, workItemsForDiagram.length]);
|
|
507
638
|
const showToppyForApprove = useMemo(() => layoutMode === LayoutModes.Update && !fetchError && workItems.length > 0 && !isOpenDetails && !isOpenMaster, [layoutMode, fetchError, workItems.length, isOpenDetails, isOpenMaster]);
|
|
508
639
|
const showToppyForCompleteMoreInfo = useMemo(() => layoutMode === LayoutModes.Update && !!isTaskMoreInfo(taskMoreInfo?.name) && taskMoreInfo?.state !== Task_States.Completed, [layoutMode, taskMoreInfo?.name, taskMoreInfo?.state]);
|
|
509
640
|
const showToppyForReferences = useMemo(() => allowButtonsRefs && layoutMode === LayoutModes.Update && !!(dcmtReferences && dcmtReferences.length > 0) && !isOpenDetails && !isOpenMaster, [allowButtonsRefs, layoutMode, dcmtReferences, isOpenDetails, isOpenMaster]);
|
|
641
|
+
const isToppyVisible = useMemo(() => Boolean((showToppyForApprove || showToppyForCompleteMoreInfo || showToppyForReferences) && !openS4TViewer), [showToppyForApprove, showToppyForCompleteMoreInfo, showToppyForReferences, openS4TViewer]);
|
|
510
642
|
const isMobile = useMemo(() => deviceType === DeviceType.MOBILE, [deviceType]);
|
|
511
|
-
const isApprView = useMemo(() =>
|
|
643
|
+
const isApprView = useMemo(() => {
|
|
644
|
+
if (!fromDTD)
|
|
645
|
+
return false;
|
|
646
|
+
return isApprovalWorkflowView(fromDTD);
|
|
647
|
+
}, [fromDTD?.id]);
|
|
512
648
|
const workitemSetID = useMemo(() => workItems.find(o => o.did === Number(DID))?.setID || formData.find(o => o.md?.name === WorkItemMetadataNames.WI_SetID)?.value, [workItems, DID, formData]);
|
|
513
649
|
const approvalVID = useMemo(() => workItems.length > 0 ? Number(workItems[0].tid) : -1, [workItems]);
|
|
514
650
|
//here
|
|
@@ -516,23 +652,20 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
|
|
|
516
652
|
const items = [];
|
|
517
653
|
const operationsItems = [];
|
|
518
654
|
operationsItems.push({
|
|
519
|
-
icon:
|
|
520
|
-
operationType: 'singleRow',
|
|
655
|
+
icon: _jsx(IconDownload, {}),
|
|
521
656
|
disabled: fromDTD?.perm?.canRetrieveFile !== AccessLevels.Yes,
|
|
522
|
-
|
|
657
|
+
name: SDKUI_Localizator.DownloadFile,
|
|
523
658
|
onClick: async () => await downloadDcmtsAsync(getDcmts(), DownloadTypes.Dcmt, "download", undefined, undefined, true)
|
|
524
659
|
}, {
|
|
525
|
-
icon:
|
|
526
|
-
operationType: 'singleRow',
|
|
660
|
+
icon: _jsx(IconDownload, {}),
|
|
527
661
|
disabled: !isXMLFileExt(currentDcmt?.fileExt),
|
|
528
|
-
|
|
662
|
+
name: SDKUI_Localizator.DownloadXMLAttachments,
|
|
529
663
|
onClick: async () => await downloadDcmtsAsync(getDcmts(), DownloadTypes.Attachment, "download", undefined, openConfirmAttachmentsDialog, true)
|
|
530
664
|
});
|
|
531
665
|
if (layoutMode === LayoutModes.Update && DID) {
|
|
532
666
|
operationsItems.push({
|
|
533
|
-
icon:
|
|
534
|
-
|
|
535
|
-
operationType: 'singleRow',
|
|
667
|
+
icon: _jsx(IconStar, {}),
|
|
668
|
+
name: SDKUI_Localizator.AddTo + ' ' + SDKUI_Localizator.Favorites,
|
|
536
669
|
disabled: false,
|
|
537
670
|
onClick: async () => {
|
|
538
671
|
await runOperationAsync(getDcmts(), DcmtOperationTypes.AddToFavs);
|
|
@@ -541,17 +674,17 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
|
|
|
541
674
|
}
|
|
542
675
|
if (onTaskCreateRequest && layoutMode === LayoutModes.Update && DID) {
|
|
543
676
|
operationsItems.push({
|
|
544
|
-
icon:
|
|
545
|
-
|
|
546
|
-
operationType: 'singleRow',
|
|
677
|
+
icon: _jsx(IconActivity, {}),
|
|
678
|
+
name: SDKUI_Localizator.CreateContextualTask,
|
|
547
679
|
disabled: false,
|
|
548
680
|
onClick: () => {
|
|
549
681
|
const dcmt = getDcmts()[0];
|
|
682
|
+
const name = `${fromDTD?.name ?? '-'} (DID: ${dcmt.DID})`;
|
|
550
683
|
const taskContext = {
|
|
551
684
|
document: {
|
|
552
685
|
tid: dcmt.TID,
|
|
553
686
|
did: dcmt.DID,
|
|
554
|
-
name:
|
|
687
|
+
name: name
|
|
555
688
|
}
|
|
556
689
|
};
|
|
557
690
|
onTaskCreateRequest(taskContext);
|
|
@@ -560,76 +693,106 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
|
|
|
560
693
|
}
|
|
561
694
|
if (operationsItems.length > 0) {
|
|
562
695
|
items.push({
|
|
563
|
-
icon:
|
|
564
|
-
|
|
565
|
-
|
|
696
|
+
icon: _jsx(IconCheck, {}),
|
|
697
|
+
name: SDKUI_Localizator.DocumentOperations,
|
|
698
|
+
submenu: operationsItems
|
|
699
|
+
});
|
|
700
|
+
}
|
|
701
|
+
if (fromDTD?.id !== SystemTIDs.Drafts) {
|
|
702
|
+
// Check in/Check out menu
|
|
703
|
+
const { cicoEnabled, checkoutStatus } = getDcmtCicoStatus(formData, allUsers, fromDTD);
|
|
704
|
+
items.push({
|
|
705
|
+
icon: _jsx(IconFileDots, {}),
|
|
706
|
+
name: "Check in/Check out",
|
|
707
|
+
disabled: false,
|
|
708
|
+
submenu: [
|
|
709
|
+
{
|
|
710
|
+
name: 'Check out',
|
|
711
|
+
disabled: !cicoEnabled || checkoutStatus.isCheckedOut,
|
|
712
|
+
onClick: () => handleCheckOutOperationCallback(true),
|
|
713
|
+
},
|
|
714
|
+
{
|
|
715
|
+
name: 'Check in',
|
|
716
|
+
onClick: () => handleCheckInOperationCallback(),
|
|
717
|
+
disabled: !cicoEnabled || !checkoutStatus.isCheckedOut || checkoutStatus.mode === 'lockMode'
|
|
718
|
+
},
|
|
719
|
+
{
|
|
720
|
+
name: SDKUI_Localizator.CancelCheckOut,
|
|
721
|
+
disabled: !cicoEnabled || !checkoutStatus.isCheckedOut || checkoutStatus.mode === 'lockMode',
|
|
722
|
+
onClick: () => handleCheckOutOperationCallback(false),
|
|
723
|
+
},
|
|
724
|
+
{
|
|
725
|
+
name: SDKUI_Localizator.CheckoutInfo,
|
|
726
|
+
onClick: showCheckoutInformationFormCallback,
|
|
727
|
+
disabled: !checkoutStatus.isCheckedOut
|
|
728
|
+
},
|
|
729
|
+
{
|
|
730
|
+
name: SDKUI_Localizator.CopyCheckoutPath,
|
|
731
|
+
onClick: copyCheckoutPathToClipboardOperationCallback,
|
|
732
|
+
disabled: !checkoutStatus.isCheckedOut
|
|
733
|
+
},
|
|
734
|
+
{
|
|
735
|
+
name: SDKUI_Localizator.History,
|
|
736
|
+
disabled: !cicoEnabled,
|
|
737
|
+
onClick: showHistoryCallback,
|
|
738
|
+
},
|
|
739
|
+
]
|
|
566
740
|
});
|
|
567
741
|
}
|
|
568
742
|
if (allowRelations && layoutMode === LayoutModes.Update && DID) {
|
|
569
743
|
const relationsItems = [
|
|
570
744
|
{
|
|
571
|
-
icon:
|
|
572
|
-
|
|
573
|
-
operationType: 'singleRow',
|
|
745
|
+
icon: _jsx(IconPair, {}),
|
|
746
|
+
name: SDKUI_Localizator.MatchManyDocumentsManyToMany,
|
|
574
747
|
disabled: !hasManyToManyRelation,
|
|
575
748
|
onClick: async () => await pairManyToMany?.(true)
|
|
576
749
|
},
|
|
577
750
|
{
|
|
578
|
-
icon:
|
|
579
|
-
|
|
580
|
-
operationType: 'singleRow',
|
|
751
|
+
icon: _jsx(IconUnpair, {}),
|
|
752
|
+
name: SDKUI_Localizator.UnmatchManyDocumentsManyToMany,
|
|
581
753
|
disabled: !hasManyToManyRelation,
|
|
582
754
|
onClick: async () => await pairManyToMany?.(false)
|
|
583
755
|
},
|
|
584
756
|
{
|
|
585
|
-
icon:
|
|
586
|
-
|
|
587
|
-
operationType: 'singleRow',
|
|
588
|
-
beginGroup: true,
|
|
757
|
+
icon: _jsx(IconArchiveMaster, {}),
|
|
758
|
+
name: SDKUI_Localizator.ArchiveMasterDocument,
|
|
589
759
|
disabled: canArchiveMasterRelation !== true,
|
|
590
760
|
onClick: async () => { if (TID)
|
|
591
761
|
await archiveMasterDocuments?.(TID); }
|
|
592
762
|
},
|
|
593
763
|
{
|
|
594
|
-
icon:
|
|
595
|
-
|
|
596
|
-
operationType: 'singleRow',
|
|
764
|
+
icon: _jsx(IconArchiveDetail, {}),
|
|
765
|
+
name: SDKUI_Localizator.ArchiveDetailDocument,
|
|
597
766
|
disabled: canArchiveDetailRelation !== true,
|
|
598
767
|
onClick: async () => { if (TID)
|
|
599
768
|
await archiveDetailDocuments?.(TID); }
|
|
600
769
|
},
|
|
601
770
|
{
|
|
602
|
-
icon:
|
|
603
|
-
|
|
604
|
-
operationType: 'singleRow',
|
|
605
|
-
visible: true,
|
|
606
|
-
beginGroup: true,
|
|
771
|
+
icon: _jsx(IconDetailDcmts, { transform: 'scale(-1, 1)' }),
|
|
772
|
+
name: SDKUI_Localizator.DcmtsMaster,
|
|
607
773
|
disabled: !currentTIDHasMasterRelations || isMasterDisabled,
|
|
608
774
|
onClick: () => { if (!isMasterDisabled)
|
|
609
775
|
setIsOpenMaster(!isOpenMaster); }
|
|
610
776
|
},
|
|
611
777
|
{
|
|
612
|
-
icon:
|
|
613
|
-
|
|
614
|
-
operationType: 'singleRow',
|
|
778
|
+
icon: _jsx(IconDetailDcmts, {}),
|
|
779
|
+
name: SDKUI_Localizator.DcmtsDetail,
|
|
615
780
|
disabled: !currentTIDHasDetailRelations || isDetailsDisabled,
|
|
616
|
-
visible: true,
|
|
617
781
|
onClick: () => { if (!isDetailsDisabled)
|
|
618
782
|
setIsOpenDetails(!isOpenDetails); }
|
|
619
783
|
}
|
|
620
784
|
];
|
|
621
785
|
items.push({
|
|
622
|
-
icon:
|
|
623
|
-
|
|
624
|
-
|
|
786
|
+
icon: _jsx(IconRelation, {}),
|
|
787
|
+
name: SDKUI_Localizator.Relations,
|
|
788
|
+
submenu: relationsItems
|
|
625
789
|
});
|
|
626
790
|
}
|
|
627
791
|
if (layoutMode === LayoutModes.Update && DID) {
|
|
628
792
|
const fullTextItems = [
|
|
629
793
|
{
|
|
630
|
-
icon:
|
|
631
|
-
|
|
632
|
-
operationType: 'singleRow',
|
|
794
|
+
icon: _jsx(IconInfo, {}),
|
|
795
|
+
name: SDKUI_Localizator.IndexingInformation,
|
|
633
796
|
disabled: false,
|
|
634
797
|
onClick: async () => {
|
|
635
798
|
try {
|
|
@@ -647,18 +810,16 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
|
|
|
647
810
|
}
|
|
648
811
|
},
|
|
649
812
|
{
|
|
650
|
-
icon:
|
|
651
|
-
|
|
652
|
-
operationType: 'singleRow',
|
|
813
|
+
icon: _jsx(IconArchiveDoc, {}),
|
|
814
|
+
name: SDKUI_Localizator.IndexOrReindex,
|
|
653
815
|
disabled: false,
|
|
654
816
|
onClick: async () => {
|
|
655
817
|
await runOperationAsync(getDcmts(), DcmtOperationTypes.FreeSearchReindex);
|
|
656
818
|
}
|
|
657
819
|
},
|
|
658
820
|
{
|
|
659
|
-
icon:
|
|
660
|
-
|
|
661
|
-
operationType: 'singleRow',
|
|
821
|
+
icon: _jsx(IconDelete, {}),
|
|
822
|
+
name: SDKUI_Localizator.IndexingDelete,
|
|
662
823
|
disabled: false,
|
|
663
824
|
onClick: async () => {
|
|
664
825
|
await runOperationAsync(getDcmts(), DcmtOperationTypes.FreeSearchPurge);
|
|
@@ -666,9 +827,9 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
|
|
|
666
827
|
}
|
|
667
828
|
];
|
|
668
829
|
items.push({
|
|
669
|
-
icon:
|
|
670
|
-
|
|
671
|
-
|
|
830
|
+
icon: _jsx(IconSearch, {}),
|
|
831
|
+
name: SDKUI_Localizator.FullTextSearch,
|
|
832
|
+
submenu: fullTextItems
|
|
672
833
|
});
|
|
673
834
|
}
|
|
674
835
|
// Aggiungi submenu "Bottoni personalizzati" se esistono customButtons
|
|
@@ -676,18 +837,19 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
|
|
|
676
837
|
const customButtonsItems = customButtonsLayout.customButtons
|
|
677
838
|
.filter((customButton) => customButton.isForUpdate && customButton.isForUpdate > 0)
|
|
678
839
|
.map((customButton) => ({
|
|
679
|
-
icon:
|
|
680
|
-
|
|
840
|
+
icon: TMImageLibrary({ imageID: customButton.glyphID }),
|
|
841
|
+
name: customButton.title || 'Bottone personalizzato',
|
|
681
842
|
onClick: () => setCustomButton(customButton)
|
|
682
843
|
}));
|
|
683
|
-
items.push({
|
|
684
|
-
icon:
|
|
685
|
-
|
|
686
|
-
|
|
844
|
+
customButtonsItems && customButtonsItems.length > 0 && items.push({
|
|
845
|
+
icon: _jsx(IconCustom, {}),
|
|
846
|
+
name: SDKUI_Localizator.CustomButtons,
|
|
847
|
+
submenu: customButtonsItems
|
|
687
848
|
});
|
|
688
849
|
}
|
|
689
850
|
return items;
|
|
690
851
|
}, [
|
|
852
|
+
fromDTD?.id,
|
|
691
853
|
fromDTD?.perm?.canRetrieveFile,
|
|
692
854
|
fromDTD?.description,
|
|
693
855
|
currentDcmt?.fileExt,
|
|
@@ -713,8 +875,9 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
|
|
|
713
875
|
openConfirmAttachmentsDialog
|
|
714
876
|
]);
|
|
715
877
|
const isModified = useMemo(() => calcIsModified(formData, formDataOrig), [formData, formDataOrig]);
|
|
716
|
-
const formToolbar = useMemo(() => _jsxs("div", { style: { display: 'flex', alignItems: 'center', gap: '10px' }, children: [allowNavigation && canPrev != undefined && _jsx("p", { style: { textAlign: 'center', padding: '1px 4px', display: 'flex' }, children: `${itemIndex}/${count}` }), allowNavigation && canPrev != undefined && _jsx(TMSaveFormButtonPrevious, { btnStyle: 'icon', iconColor: 'white', isModified: isModified, formMode: formMode, canPrev: canPrev, onPrev: onPrev }), allowNavigation && canNext != undefined && _jsx(TMSaveFormButtonNext, { btnStyle: 'icon', iconColor: 'white', isModified: isModified, formMode: formMode, canNext: canNext, onNext: onNext }), layoutMode === LayoutModes.Update &&
|
|
717
|
-
_jsx(
|
|
878
|
+
const formToolbar = useMemo(() => _jsxs("div", { style: { display: 'flex', alignItems: 'center', gap: '10px' }, children: [allowNavigation && canPrev != undefined && _jsx("p", { style: { textAlign: 'center', padding: '1px 4px', display: 'flex' }, children: `${itemIndex}/${count}` }), allowNavigation && canPrev != undefined && _jsx(TMSaveFormButtonPrevious, { btnStyle: 'icon', iconColor: 'white', isModified: isModified, formMode: formMode, canPrev: canPrev, onPrev: onPrev }), allowNavigation && canNext != undefined && _jsx(TMSaveFormButtonNext, { btnStyle: 'icon', iconColor: 'white', isModified: isModified, formMode: formMode, canNext: canNext, onNext: onNext }), layoutMode === LayoutModes.Update &&
|
|
879
|
+
_jsx(ContextMenu, { items: commandsMenuItems, trigger: "left", children: _jsx(IconMenuVertical, { color: 'white', cursor: 'pointer' }) }), layoutMode === LayoutModes.Ark &&
|
|
880
|
+
_jsx(TMTooltip, { content: SDKUI_Localizator.PassToSearch, position: 'bottom', children: _jsx(IconSearch, { style: { cursor: 'pointer' }, onClick: handlePassToSearch }) })] }), [allowNavigation, canPrev, canNext, itemIndex, count, isModified, formMode, onPrev, onNext, layoutMode, commandsMenuItems, handlePassToSearch]);
|
|
718
881
|
const handleUndo = useCallback(() => {
|
|
719
882
|
setFormData(structuredClone(formDataOrig));
|
|
720
883
|
}, [formDataOrig]);
|
|
@@ -730,6 +893,60 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
|
|
|
730
893
|
},
|
|
731
894
|
});
|
|
732
895
|
}, [isModal, id, layoutMode]);
|
|
896
|
+
// Funzione helper per ottenere e aggiornare i metadati con gestione errori centralizzata
|
|
897
|
+
const refreshMetadataAsync = useCallback(async () => {
|
|
898
|
+
let metadataResult = undefined;
|
|
899
|
+
let hasGetMetadataError = false;
|
|
900
|
+
try {
|
|
901
|
+
metadataResult = await SDK_Globals.tmSession?.NewSearchEngine().GetMetadataAsync(TID, DID, true);
|
|
902
|
+
}
|
|
903
|
+
catch (metadataError) {
|
|
904
|
+
hasGetMetadataError = true;
|
|
905
|
+
// Estrai ErrorCode dal campo detail se disponibile
|
|
906
|
+
let errorCode = undefined;
|
|
907
|
+
if (metadataError?.isApiException && metadataError?.response?.detail) {
|
|
908
|
+
try {
|
|
909
|
+
const detailObj = JSON.parse(metadataError.response.detail);
|
|
910
|
+
errorCode = detailObj?.ErrorCode;
|
|
911
|
+
}
|
|
912
|
+
catch (parseError) {
|
|
913
|
+
console.log("Impossibile parsare il detail dell'eccezione:", parseError);
|
|
914
|
+
}
|
|
915
|
+
}
|
|
916
|
+
// Se ErrorCode è -5, mostra messaggio personalizzato, altrimenti mostra l'eccezione originale
|
|
917
|
+
if (errorCode === -5) {
|
|
918
|
+
TMMessageBoxManager.show({
|
|
919
|
+
message: SDKUI_Localizator.DcmtOutOfView,
|
|
920
|
+
buttons: [ButtonNames.OK],
|
|
921
|
+
});
|
|
922
|
+
}
|
|
923
|
+
else {
|
|
924
|
+
TMExceptionBoxManager.show({ exception: metadataError });
|
|
925
|
+
}
|
|
926
|
+
// Usa null per indicare al callback che c'è stato un errore e non deve ritentare
|
|
927
|
+
metadataResult = null;
|
|
928
|
+
}
|
|
929
|
+
// Aggiorna i metadati locali solo se non ci sono stati errori
|
|
930
|
+
if (!hasGetMetadataError && metadataResult && metadataResult !== null) {
|
|
931
|
+
await setMetadataList(fromDTDRef.current?.metadata ?? [], metadataResult);
|
|
932
|
+
}
|
|
933
|
+
return { success: !hasGetMetadataError, result: metadataResult };
|
|
934
|
+
}, [TID, DID, setMetadataList]);
|
|
935
|
+
const updateCurrentDcmt = useCallback(async () => {
|
|
936
|
+
try {
|
|
937
|
+
TMSpinner.show({ description: 'Aggiornamento in corso...' });
|
|
938
|
+
const { success, result: metadataResult } = await refreshMetadataAsync();
|
|
939
|
+
if (!success)
|
|
940
|
+
onClose?.();
|
|
941
|
+
await onSavedAsyncCallback?.(TID, DID, metadataResult === null ? null : metadataResult);
|
|
942
|
+
}
|
|
943
|
+
catch (e) {
|
|
944
|
+
TMExceptionBoxManager.show({ exception: e });
|
|
945
|
+
}
|
|
946
|
+
finally {
|
|
947
|
+
TMSpinner.hide();
|
|
948
|
+
}
|
|
949
|
+
}, [refreshMetadataAsync, onClose]);
|
|
733
950
|
const handleSave = useCallback(async () => {
|
|
734
951
|
const ue = new UpdateEngineByID(SDK_Globals.tmSession);
|
|
735
952
|
ue.DID = DID;
|
|
@@ -766,55 +983,20 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
|
|
|
766
983
|
const savedFormData = structuredClone(formDataRef.current);
|
|
767
984
|
setFormDataOrig(savedFormData);
|
|
768
985
|
formDataOrigRef.current = savedFormData;
|
|
769
|
-
//
|
|
770
|
-
|
|
771
|
-
let hasGetMetadataError = false;
|
|
772
|
-
try {
|
|
773
|
-
metadataResult = await SDK_Globals.tmSession?.NewSearchEngine().GetMetadataAsync(TID, DID, true);
|
|
774
|
-
}
|
|
775
|
-
catch (metadataError) {
|
|
776
|
-
hasGetMetadataError = true;
|
|
777
|
-
// Estrai ErrorCode dal campo detail se disponibile
|
|
778
|
-
let errorCode = undefined;
|
|
779
|
-
if (metadataError?.isApiException && metadataError?.response?.detail) {
|
|
780
|
-
try {
|
|
781
|
-
const detailObj = JSON.parse(metadataError.response.detail);
|
|
782
|
-
errorCode = detailObj?.ErrorCode;
|
|
783
|
-
}
|
|
784
|
-
catch (parseError) {
|
|
785
|
-
console.log("Impossibile parsare il detail dell'eccezione:", parseError);
|
|
786
|
-
}
|
|
787
|
-
}
|
|
788
|
-
// Se ErrorCode è -5, mostra messaggio personalizzato, altrimenti mostra l'eccezione originale
|
|
789
|
-
if (errorCode === -5) {
|
|
790
|
-
TMMessageBoxManager.show({
|
|
791
|
-
message: SDKUI_Localizator.DcmtOutOfView,
|
|
792
|
-
buttons: [ButtonNames.OK],
|
|
793
|
-
});
|
|
794
|
-
}
|
|
795
|
-
else {
|
|
796
|
-
TMExceptionBoxManager.show({ exception: metadataError });
|
|
797
|
-
}
|
|
798
|
-
// Usa null per indicare al callback che c'è stato un errore e non deve ritentare
|
|
799
|
-
metadataResult = null;
|
|
800
|
-
}
|
|
986
|
+
// Usa la funzione helper per ottenere i metadati aggiornati
|
|
987
|
+
const { success, result: metadataResult } = await refreshMetadataAsync();
|
|
801
988
|
// Esegui sempre il callback:
|
|
802
989
|
// - Se metadataResult è un oggetto: refresh normale
|
|
803
990
|
// - Se metadataResult è null: GetMetadataAsync fallito, rimuove il documento dalla griglia senza ritentare
|
|
804
991
|
// - Se metadataResult è undefined: nessun parametro passato, il callback può decidere cosa fare
|
|
805
992
|
await onSavedAsyncCallback?.(TID, DID, metadataResult === null ? null : metadataResult);
|
|
806
993
|
// Mostra messaggio di successo solo se non ci sono stati errori critici
|
|
807
|
-
if (
|
|
808
|
-
if (metadataResult && metadataResult !== null) {
|
|
809
|
-
// Usa fromDTDRef.current invece di fromDTD per evitare stale closure.
|
|
810
|
-
// fromDTD potrebbe essere undefined/vuoto nel callback se lo stato è cambiato,
|
|
811
|
-
// mentre fromDTDRef.current contiene sempre il valore corrente sincronizzato tramite useEffect.
|
|
812
|
-
await setMetadataList(fromDTDRef.current?.metadata ?? [], metadataResult);
|
|
813
|
-
}
|
|
994
|
+
if (success) {
|
|
814
995
|
ShowAlert({ mode: 'success', title: 'Form di documento', message: 'Le modifiche sono state salvate con successo', duration: 3000 });
|
|
815
996
|
}
|
|
816
|
-
else
|
|
997
|
+
else {
|
|
817
998
|
onClose?.();
|
|
999
|
+
}
|
|
818
1000
|
}
|
|
819
1001
|
catch (e) {
|
|
820
1002
|
TMExceptionBoxManager.show({ exception: e });
|
|
@@ -822,7 +1004,7 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
|
|
|
822
1004
|
finally {
|
|
823
1005
|
TMSpinner.hide();
|
|
824
1006
|
}
|
|
825
|
-
}, [DID, TID, getSpecificChangedKeysWithValues, onSavedAsyncCallback, onClose
|
|
1007
|
+
}, [DID, TID, getSpecificChangedKeysWithValues, refreshMetadataAsync, onSavedAsyncCallback, onClose]);
|
|
826
1008
|
const handleArchiveCompleted = useCallback(async () => {
|
|
827
1009
|
let firstBlock = true;
|
|
828
1010
|
let maxFileSize = 0;
|
|
@@ -1011,28 +1193,34 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
|
|
|
1011
1193
|
await triggerBlogRefresh();
|
|
1012
1194
|
}
|
|
1013
1195
|
}, [TID, DID, triggerBlogRefresh]);
|
|
1196
|
+
const checkoutBadge = useMemo(() => {
|
|
1197
|
+
const { cicoEnabled, checkoutStatus } = getDcmtCicoStatus(formData, allUsers, fromDTD);
|
|
1198
|
+
if (!cicoEnabled || !checkoutStatus.isCheckedOut)
|
|
1199
|
+
return null;
|
|
1200
|
+
return (_jsx(Ribbon, { "$isMobile": isMobile, children: _jsx(TMTooltip, { content: checkoutStatus.editLockTooltipText, position: "right", children: _jsx("span", { children: checkoutStatus.mode === 'editMode' ? SDKUI_Localizator.CheckOut : 'Locked' }) }) }));
|
|
1201
|
+
}, [formData, fromDTD, isMobile]);
|
|
1014
1202
|
const tmDcmtForm = useMemo(() => {
|
|
1015
|
-
return
|
|
1016
|
-
|
|
1017
|
-
|
|
1018
|
-
|
|
1019
|
-
|
|
1020
|
-
|
|
1021
|
-
|
|
1022
|
-
|
|
1023
|
-
|
|
1024
|
-
|
|
1025
|
-
|
|
1026
|
-
|
|
1027
|
-
|
|
1028
|
-
|
|
1029
|
-
|
|
1030
|
-
|
|
1031
|
-
|
|
1032
|
-
|
|
1033
|
-
|
|
1034
|
-
|
|
1035
|
-
|
|
1203
|
+
return _jsxs(_Fragment, { children: [checkoutBadge && _jsx("div", { style: { padding: '10px', display: 'flex', justifyContent: 'center' }, children: checkoutBadge }), metadataValuesSource.length > 0 &&
|
|
1204
|
+
_jsxs(StyledToolbarCardContainer, { children: [_jsx(TMMetadataValues, { TID: TID, metadataValues: metadataValuesSource, metadataValuesOrig: metadataValuesSourceOrig, isExpertMode: isExpertMode, isOpenDistinctValues: isOpenDistinctValues, openChooserBySingleClick: !isOpenDistinctValues, selectedMID: focusedMetadataValue?.mid, isReadOnly: formMode === FormModes.ReadOnly, layoutMode: layoutMode, deviceType: deviceType, validationItems: validationItems, inputMids: inputMids, layout: layout, onFocusedItemChanged: (item) => { (item?.mid !== focusedMetadataValue?.mid) && setFocusedMetadataValue(item); }, onValueChanged: (newItems) => {
|
|
1205
|
+
setFormData((prevItems) => prevItems.map((item) => {
|
|
1206
|
+
const newItem = newItems.find((newItem) => newItem.tid === item.tid && newItem.mid === item.mid);
|
|
1207
|
+
return newItem ? { ...item, ...newItem } : item;
|
|
1208
|
+
}));
|
|
1209
|
+
}, onAdvancedMenuClick: (e) => {
|
|
1210
|
+
switch (e.button) {
|
|
1211
|
+
case AdvancedMenuButtons.DistinctValues:
|
|
1212
|
+
setIsOpenDistinctValues(!isOpenDistinctValues);
|
|
1213
|
+
break;
|
|
1214
|
+
case AdvancedMenuButtons.FormulaEditor:
|
|
1215
|
+
setIsOpenFormulaEditor(!isOpenFormulaEditor);
|
|
1216
|
+
break;
|
|
1217
|
+
}
|
|
1218
|
+
} }), _jsxs(StyledFormButtonsContainer, { children: [_jsx("div", { style: { display: 'flex', flexDirection: 'column', gap: 10 }, children: _jsx("div", { style: { display: 'flex', justifyContent: 'center', alignItems: 'center', gap: '8px' }, children: layoutMode === LayoutModes.Update ? _jsxs(_Fragment, { children: [_jsx(TMSaveFormButtonSave, { showTooltip: false, btnStyle: 'advanced', advancedColor: '#f09c0a', isModified: isModified, formMode: formMode, errorsCount: validationItems.filter(o => o.ResultType == ResultTypes.ERROR).length, onSaveAsync: handleConfirmAction }), _jsx(TMSaveFormButtonUndo, { btnStyle: 'toolbar', showTooltip: true, color: 'primary', isModified: isModified, formMode: formMode, onUndo: handleUndo })] }) :
|
|
1219
|
+
_jsxs(_Fragment, { children: [_jsx(TMButton, { disabled: archiveBtnDisabled, btnStyle: 'advanced', icon: _jsx(IconBoxArchiveIn, {}), width: 'auto', showTooltip: false, caption: SDKUI_Localizator.Archive, advancedColor: TMColors.success, onClick: handleConfirmAction }), _jsx(TMButton, { disabled: !clearFormBtnDisabled, btnStyle: 'advanced', icon: _jsx(IconClear, {}), width: 'auto', showTooltip: false, caption: SDKUI_Localizator.Clear, advancedColor: TMColors.tertiary, onClick: handleClearForm }), DID && _jsx(TMButton, { disabled: undoBtnDisabled, btnStyle: 'advanced', icon: _jsx(IconUndo, {}), width: '150px', showTooltip: false, caption: SDKUI_Localizator.Undo, advancedColor: TMColors.tertiary, onClick: handleUndo })] }) }) }), customButton && _jsx(TMCustomButton, { button: customButton, formData: formData, selectedItems: [], onClose: () => setCustomButton(undefined) }), totalItems > listMaxItems &&
|
|
1220
|
+
!isApprView &&
|
|
1221
|
+
TID !== SystemTIDs.Drafts &&
|
|
1222
|
+
!shouldShowAll &&
|
|
1223
|
+
_jsx(TMShowAllOrMaxItemsButton, { showAll: showAll, dataSourceLength: totalItems, onClick: () => { setShowAll(!showAll); } })] }), _jsx(ConfirmAttachmentsDialog, {})] })] });
|
|
1036
1224
|
}, [
|
|
1037
1225
|
TID,
|
|
1038
1226
|
DID,
|
|
@@ -1060,11 +1248,11 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
|
|
|
1060
1248
|
handleUndo,
|
|
1061
1249
|
handleClearForm
|
|
1062
1250
|
]);
|
|
1063
|
-
const tmBlog = useMemo(() => _jsx(TMDcmtBlog, { tid: TID, did: DID, allTasks: allTasks, fetchBlogDataTrigger: refreshBlogTrigger, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers }), [TID, DID, allTasks, refreshBlogTrigger]);
|
|
1251
|
+
const tmBlog = useMemo(() => _jsx(TMDcmtBlog, { tid: TID, did: DID, allTasks: allTasks, fetchBlogDataTrigger: refreshBlogTrigger, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers }), [TID, DID, allTasks, refreshBlogTrigger, handleNavigateToWGs, handleNavigateToDossiers]);
|
|
1064
1252
|
const tmSysMetadata = useMemo(() => _jsx(TMMetadataValues, { layoutMode: layoutMode, openChooserBySingleClick: !isOpenDistinctValues, TID: TID, isReadOnly: true, deviceType: deviceType, metadataValues: formData.filter(o => (o.mid != undefined && o.mid <= 100)), metadataValuesOrig: formData.filter(o => (o.mid != undefined && o.mid <= 100)), validationItems: [], inputMids: inputMids }), [TID, layoutMode, formData, deviceType, inputMids]);
|
|
1065
1253
|
const tmDcmtPreview = useMemo(() => _jsx(TMDcmtPreviewWrapper, { currentDcmt: currentDcmt, dcmtFile: dcmtFile ?? inputFile, deviceType: deviceType, fromDTD: fromDTD, layoutMode: layoutMode, onFileUpload: (file) => {
|
|
1066
1254
|
setDcmtFile(file);
|
|
1067
|
-
}, enableDragDropOverlay: enableDragDropOverlay }), [currentDcmt, dcmtFile, deviceType, fromDTD, layoutMode, inputFile, enableDragDropOverlay, setDcmtFile]);
|
|
1255
|
+
}, enableDragDropOverlay: enableDragDropOverlay }, refreshPreviewTrigger), [currentDcmt, dcmtFile, deviceType, fromDTD, layoutMode, inputFile, enableDragDropOverlay, setDcmtFile]);
|
|
1068
1256
|
const tmWF = useMemo(() => {
|
|
1069
1257
|
if (isWFDataLoading) {
|
|
1070
1258
|
return (_jsx("div", { style: {
|
|
@@ -1079,7 +1267,7 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
|
|
|
1079
1267
|
const isAuthorized = !!workflows?.[0]?.diagram;
|
|
1080
1268
|
return (_jsxs("div", { style: { position: 'relative', width: '100%', height: '100%', display: 'flex', flexDirection: 'column', gap: 3 }, children: [workItems.length > 0
|
|
1081
1269
|
? (isAuthorized
|
|
1082
|
-
? _jsx(WFDiagram, { xmlDiagramString: workflows?.[0]?.diagram || '', allowEdit: false, currentSetID: workitemSetID })
|
|
1270
|
+
? _jsx(WFDiagram, { xmlDiagramString: workflows?.[0]?.diagram || '', allowEdit: false, currentSetID: workitemSetID, defaultAutoZoom: true, workitems: workItemsForDiagram })
|
|
1083
1271
|
: _jsx("div", { style: {
|
|
1084
1272
|
position: 'absolute',
|
|
1085
1273
|
top: '50%',
|
|
@@ -1088,7 +1276,27 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
|
|
|
1088
1276
|
fontSize: '1.1rem',
|
|
1089
1277
|
color: TMColors.primaryColor,
|
|
1090
1278
|
textAlign: 'center',
|
|
1091
|
-
|
|
1279
|
+
display: 'flex',
|
|
1280
|
+
flexDirection: 'column',
|
|
1281
|
+
alignItems: 'center',
|
|
1282
|
+
gap: '12px',
|
|
1283
|
+
}, children: _jsxs("div", { style: { display: 'flex', alignItems: 'center', gap: '8px' }, children: [_jsx("span", { children: SDKUI_Localizator.WorkflowDiagramNotAuthorized }), wfError && (_jsx(TMTooltip, { content: 'Visualizza errore', children: _jsx("i", { className: "dx-icon-info", style: { fontSize: 20, cursor: 'pointer', color: '#dc3545' }, onClick: () => {
|
|
1284
|
+
TMMessageBoxManager.show({
|
|
1285
|
+
title: 'Dettagli Errore Workflow',
|
|
1286
|
+
initialWidth: !isMobile ? '700px' : undefined,
|
|
1287
|
+
message: (_jsx("pre", { style: {
|
|
1288
|
+
whiteSpace: 'pre-wrap',
|
|
1289
|
+
background: '#f5f5f5',
|
|
1290
|
+
padding: '12px',
|
|
1291
|
+
borderRadius: '6px',
|
|
1292
|
+
userSelect: 'text',
|
|
1293
|
+
cursor: 'text',
|
|
1294
|
+
}, children: wfError })),
|
|
1295
|
+
resizable: true,
|
|
1296
|
+
showToppy: false,
|
|
1297
|
+
buttons: [ButtonNames.OK],
|
|
1298
|
+
});
|
|
1299
|
+
} }) }))] }) }))
|
|
1092
1300
|
: _jsx("div", { style: {
|
|
1093
1301
|
position: 'absolute',
|
|
1094
1302
|
top: '50%',
|
|
@@ -1103,7 +1311,7 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
|
|
|
1103
1311
|
backgroundColor: 'khaki',
|
|
1104
1312
|
borderRadius: 8
|
|
1105
1313
|
}, children: SDKUI_Localizator.WorkItemTechnicalNote_SetID })] }));
|
|
1106
|
-
}, [workflows, formData, workitemSetID, workItems, isWFDataLoading]);
|
|
1314
|
+
}, [workflows, formData, workitemSetID, workItems, workItemsForDiagram, isWFDataLoading, wfError, isMobile]);
|
|
1107
1315
|
const tmDcmtTasks = useMemo(() => {
|
|
1108
1316
|
const isReady = TID && DID && getAllTasks && deleteTaskByIdsCallback && addTaskCallback && editTaskCallback;
|
|
1109
1317
|
if (!isReady) {
|
|
@@ -1228,7 +1436,7 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
|
|
|
1228
1436
|
// Checks if there's a saved panel layout for the current context (ToDo or general)
|
|
1229
1437
|
const hasSavedLayout = () => {
|
|
1230
1438
|
const { setting } = getCurrentDcmtFormSetting();
|
|
1231
|
-
if (
|
|
1439
|
+
if (invocationContext === InvocationContext.Todo) {
|
|
1232
1440
|
// If invoked by ToDo, check for existence of layoutToDo and that it has keys
|
|
1233
1441
|
return setting.layoutToDo !== undefined && Object.keys(setting.layoutToDo).length > 0;
|
|
1234
1442
|
}
|
|
@@ -1247,8 +1455,8 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
|
|
|
1247
1455
|
// Prepare the new setting object with updated layout depending on context
|
|
1248
1456
|
const newSetting = {
|
|
1249
1457
|
TID: normalizedTID,
|
|
1250
|
-
layout:
|
|
1251
|
-
layoutToDo:
|
|
1458
|
+
layout: invocationContext === InvocationContext.Todo ? (existingSetting.layout ?? {}) : state,
|
|
1459
|
+
layoutToDo: invocationContext === InvocationContext.Todo ? state : (existingSetting.layoutToDo ?? {}),
|
|
1252
1460
|
};
|
|
1253
1461
|
// Replace existing setting if found, otherwise push a new one
|
|
1254
1462
|
if (idx >= 0) {
|
|
@@ -1267,7 +1475,7 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
|
|
|
1267
1475
|
return undefined;
|
|
1268
1476
|
const settings = getCurrentDcmtFormSetting()?.setting;
|
|
1269
1477
|
// Return the appropriate layout based on context
|
|
1270
|
-
return
|
|
1478
|
+
return invocationContext === InvocationContext.Todo ? settings?.layoutToDo : settings?.layout;
|
|
1271
1479
|
};
|
|
1272
1480
|
const handleCompleteMoreInfo = useCallback(async () => {
|
|
1273
1481
|
try {
|
|
@@ -1329,26 +1537,26 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
|
|
|
1329
1537
|
height: '100%',
|
|
1330
1538
|
position: 'relative',
|
|
1331
1539
|
overflow: 'hidden'
|
|
1332
|
-
}, children: [_jsxs("div", { style: { width: '100%', height: '100%', display: isOpenDetails || isOpenMaster ? 'none' : 'flex' }, children: [isNavigating && _jsx(Spinner, { description: SDKUI_Localizator.Loading, flat: false }), (fromDTD) &&
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
|
|
1339
|
-
|
|
1340
|
-
|
|
1341
|
-
|
|
1342
|
-
|
|
1343
|
-
|
|
1344
|
-
|
|
1345
|
-
|
|
1346
|
-
|
|
1347
|
-
|
|
1348
|
-
|
|
1540
|
+
}, children: [_jsxs("div", { style: { width: '100%', height: '100%', display: isOpenDetails || isOpenMaster ? 'none' : 'flex' }, children: [isNavigating && _jsx(Spinner, { description: SDKUI_Localizator.Loading, flat: false }), (fromDTD) && _jsx(TMLayoutWaitingContainer, { direction: 'vertical', showWaitPanel: useWaitPanelLocalState ? showWaitPanelLocal : showWaitPanel, showWaitPanelPrimary: useWaitPanelLocalState ? showPrimaryLocal : showPrimary, showWaitPanelSecondary: useWaitPanelLocalState ? showSecondaryLocal : showSecondary, waitPanelTitle: useWaitPanelLocalState ? waitPanelTitleLocal : waitPanelTitle, waitPanelTextPrimary: useWaitPanelLocalState ? waitPanelTextPrimaryLocal : waitPanelTextPrimary, waitPanelValuePrimary: useWaitPanelLocalState ? waitPanelValuePrimaryLocal : waitPanelValuePrimary, waitPanelMaxValuePrimary: useWaitPanelLocalState ? waitPanelMaxValuePrimaryLocal : waitPanelMaxValuePrimary, waitPanelTextSecondary: useWaitPanelLocalState ? waitPanelTextSecondaryLocal : waitPanelTextSecondary, waitPanelValueSecondary: useWaitPanelLocalState ? waitPanelValueSecondaryLocal : waitPanelValueSecondary, waitPanelMaxValueSecondary: useWaitPanelLocalState ? waitPanelMaxValueSecondaryLocal : waitPanelMaxValueSecondary, isCancelable: useWaitPanelLocalState ? dcmtFile ? dcmtFile.size >= 1000000 : false : true, abortController: useWaitPanelLocalState ? abortControllerLocal : abortController, children: _jsxs(TMLayoutWaitingContainer, { direction: 'vertical', showWaitPanel: showCicoWaitPanel, showWaitPanelPrimary: showCicoPrimaryProgress, waitPanelTitle: cicoWaitPanelTitle, waitPanelTextPrimary: cicoPrimaryProgressText, waitPanelValuePrimary: cicoPrimaryProgressValue, waitPanelMaxValuePrimary: cicoPrimaryProgressMax, isCancelable: true, abortController: abortControllerLocal, children: [(groupId && groupId.length > 0)
|
|
1541
|
+
? _jsx(TMPanelManagerContainer, { panels: initialPanels, direction: "horizontal", parentId: groupId, showToolbar: showDcmtFormSidebar })
|
|
1542
|
+
: _jsxs(TMPanelManagerWithPersistenceProvider, { panels: initialPanels, initialVisibility: allInitialPanelVisibility, defaultDimensions: defaultPanelDimensions, initialDimensions: defaultPanelDimensions, initialMobilePanelId: 'tmDcmtForm', isPersistenceEnabled: !isMobile ? hasSavedLayout() : false, persistPanelStates: !isMobile ? (state) => persistPanelStates(state) : undefined, persistedPanelStates: getPersistedPanelStates(), children: [_jsx(WfButtonStateHandler, { isWFDisabled: isWFDisabled }), _jsx(TMPanelManagerContainer, { panels: initialPanels, direction: "horizontal", parentId: groupId, showToolbar: showDcmtFormSidebar })] }), isOpenDistinctValues &&
|
|
1543
|
+
_jsx(TMDistinctValues, { tid: TID, mid: focusedMetadataValue?.mid, isModal: true, showHeader: false, layoutMode: layoutMode, onSelectionChanged: (e) => {
|
|
1544
|
+
if (!e)
|
|
1545
|
+
return;
|
|
1546
|
+
setFormData((prevItems) => prevItems.map((item) => item.tid == e.tid && item.mid === e.mid ? { ...item, value: e.newValue } : item));
|
|
1547
|
+
} }), isOpenFormulaEditor &&
|
|
1548
|
+
_jsx(TMFormulaEditor, { isModal: true, formMode: FormModes.Update, inputData: getFormula(), showBack: false, onClose: () => setIsOpenFormulaEditor(false), onApplied: (newFormula) => {
|
|
1549
|
+
setFormData((prevItems) => prevItems.map((item) => item.tid == newFormula.tid && item.mid === newFormula.mid ? { ...item, value: FormulaHelper.addFormulaTag(newFormula.expression), isSelected: true, isEditable: true } : item));
|
|
1550
|
+
setFocusedMetadataValue(prevState => ({
|
|
1551
|
+
...prevState,
|
|
1552
|
+
isSelected: true,
|
|
1553
|
+
isEditable: true,
|
|
1554
|
+
value: FormulaHelper.addFormulaTag(newFormula.expression)
|
|
1555
|
+
}));
|
|
1556
|
+
} }), showApprovePopup && _jsx(WorkFlowApproveRejectPopUp, { deviceType: deviceType, onCompleted: handleWFOperationCompleted, TID: approvalVID, DID: DID, isReject: 0, onClose: () => setShowApprovePopup(false) }), showRejectPopup && _jsx(WorkFlowApproveRejectPopUp, { deviceType: deviceType, onCompleted: handleWFOperationCompleted, TID: approvalVID, DID: DID, isReject: 1, onClose: () => setShowRejectPopup(false) }), showReAssignPopup && _jsx(WorkFlowReAssignPopUp, { deviceType: deviceType, onCompleted: handleWFOperationCompleted, TID: approvalVID, DID: DID, onClose: () => setShowReAssignPopup(false) }), showMoreInfoPopup && _jsx(WorkFlowMoreInfoPopUp, { deviceType: deviceType, onCompleted: handleWFOperationCompleted, TID: approvalVID, DID: DID, onClose: () => setShowMoreInfoPopup(false) }), (isModal && onClose) && _jsx("div", { id: "TMDcmtFormShowConfirmForClose-" + id })] }) }), _jsx(TMToppyDraggableHelpCenter, { isVisible: isToppyVisible, content: _jsxs("div", { style: { display: 'flex', flexDirection: 'column', gap: '10px' }, children: [showToppyForApprove && (workItems.length === 1 ?
|
|
1349
1557
|
_jsx(WorkFlowOperationButtons, { deviceType: deviceType, onApprove: () => setShowApprovePopup(true), onSignApprove: handleSignApprove, onReject: () => setShowRejectPopup(true), onReAssign: () => setShowReAssignPopup(true), onMoreInfo: () => setShowMoreInfoPopup(true), dtd: fromDTD })
|
|
1350
1558
|
:
|
|
1351
|
-
_jsxs("div", { style: { padding: 10, color: 'white', maxWidth: '180px', borderRadius: 10, background: '#1B1464 0% 0% no-repeat padding-box', border: '1px solid #FFFFFF' }, children: [`
|
|
1559
|
+
_jsxs("div", { style: { padding: 10, color: 'white', maxWidth: '180px', borderRadius: 10, background: '#1B1464 0% 0% no-repeat padding-box', border: '1px solid #FFFFFF' }, children: [`Questo documento è associato a ${workItems.length} workitem.`, _jsx("br", {}), `Per approvare, vai alla pagina "Approvazione workflow".`] })), showToppyForCompleteMoreInfo && (_jsxs(_Fragment, { children: [_jsx("div", { style: { padding: 10, color: 'white', maxWidth: '180px', borderRadius: 10, background: '#1B1464 0% 0% no-repeat padding-box', border: '1px solid #FFFFFF' }, children: `${SDKUI_Localizator.MoreInfoCompleteRequestSentBy} ${taskMoreInfo?.fromName}!` }), _jsx(TMButton, { caption: SDKUI_Localizator.CommentAndComplete, color: 'success', showTooltip: false, onClick: () => {
|
|
1352
1560
|
setShowCommentForm(true);
|
|
1353
1561
|
} })] })), (showToppyForReferences && (dcmtReferences && dcmtReferences.length > 0)) && dcmtReferences
|
|
1354
1562
|
.filter(ref => ref.objClass === ObjectClasses.Dossier || ref.objClass === ObjectClasses.WorkingGroup) // keep only known objClass types
|
|
@@ -1399,7 +1607,8 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
|
|
|
1399
1607
|
finally {
|
|
1400
1608
|
TMSpinner.hide();
|
|
1401
1609
|
}
|
|
1402
|
-
}, onClose: () => setShowManyToManyChooser(false), manageUseLocalizedName: false })),
|
|
1610
|
+
}, onClose: () => setShowManyToManyChooser(false), manageUseLocalizedName: false })), (showHistory && fromDTD && currentDcmt) && _jsx(TMViewHistoryDcmt, { fromDTD: fromDTD, deviceType: deviceType, inputDcmt: { TID: currentDcmt.tid, DID: currentDcmt.did }, onClose: hideHistoryCallback, allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers }), (showCheckoutInformationForm && fromDTD && currentDcmt) &&
|
|
1611
|
+
_jsx(TMDcmtCheckoutInfoForm, { dtdName: fromDTD.name ?? SDKUI_Localizator.SearchResult, selectedDcmtOrFocused: { TID: currentDcmt.tid, DID: currentDcmt.did, FILEEXT: currentDcmt.fileExt }, onClose: hideCheckoutInformationFormCallback }), (commentFormState.show && currentDcmt) && _jsx(TMBlogCommentForm, { context: { engine: 'SearchEngine', object: { tid: currentDcmt.tid, did: currentDcmt.did } }, onClose: hideCommentFormCallback, refreshCallback: triggerBlogRefresh, participants: [], showAttachmentsSection: false, allArchivedDocumentsFileItems: [], isCommentRequired: commentFormState.isRequired, removeAndEditAttachment: commentFormState.removeAndEditAttachment }), isOpenArchiveRelationForm && (_jsx(TMDcmtForm, { isModal: true, titleModal: SDKUI_Localizator.Archive + ' - ' + (archiveType === 'detail' ? SDKUI_Localizator.DcmtsDetail : SDKUI_Localizator.DcmtsMaster), TID: archiveRelatedDcmtFormTID, layoutMode: LayoutModes.Ark, inputMids: archiveRelatedDcmtFormMids, showBackButton: false, allowButtonsRefs: false, onClose: () => {
|
|
1403
1612
|
setIsOpenArchiveRelationForm(false);
|
|
1404
1613
|
setArchiveType(undefined);
|
|
1405
1614
|
setArchiveRelatedDcmtFormTID(undefined);
|
|
@@ -1410,7 +1619,7 @@ const TMDcmtForm = ({ allTasks = [], getAllTasks, deleteTaskByIdsCallback, addTa
|
|
|
1410
1619
|
setArchiveRelatedDcmtFormTID(undefined);
|
|
1411
1620
|
setArchiveRelatedDcmtFormMids([]);
|
|
1412
1621
|
await fetchData();
|
|
1413
|
-
}, allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers })), showPairDcmtsModal && (_jsx(TMModal, { title: (isPairingManyToMany ? "Abbina" : "Disabbina") + " documenti", onClose: () => setShowPairDcmtsModal(false), width: isMobile ? '90%' : '50%', height: isMobile ? '90%' : '70%', children: _jsx(TMSearchResult, { searchResults: pairedSearchResults, onRefreshSearchAsync: async () => await fetchData(), onTaskCreateRequest: onTaskCreateRequest, allowFloatingBar: false, floatingActionConfig: pairFloatingActionConfig, showBackButton: false, allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers }) }))] }));
|
|
1622
|
+
}, allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers, onReferenceClick: handleNavigateToReference })), showPairDcmtsModal && (_jsx(TMModal, { title: (isPairingManyToMany ? "Abbina" : "Disabbina") + " documenti", onClose: () => setShowPairDcmtsModal(false), width: isMobile ? '90%' : '50%', height: isMobile ? '90%' : '70%', children: _jsx(TMSearchResult, { searchResults: pairedSearchResults, onRefreshSearchAsync: async () => await fetchData(), onTaskCreateRequest: onTaskCreateRequest, allowFloatingBar: false, floatingActionConfig: pairFloatingActionConfig, showBackButton: false, allTasks: allTasks, getAllTasks: getAllTasks, deleteTaskByIdsCallback: deleteTaskByIdsCallback, addTaskCallback: addTaskCallback, editTaskCallback: editTaskCallback, handleNavigateToWGs: handleNavigateToWGs, handleNavigateToDossiers: handleNavigateToDossiers }) }))] }));
|
|
1414
1623
|
};
|
|
1415
1624
|
export default TMDcmtForm;
|
|
1416
1625
|
/**
|
|
@@ -1433,8 +1642,11 @@ const applyMetadataFilter = (data, showAll, listMaxItems, TID) => {
|
|
|
1433
1642
|
o.mid === SystemMIDsAsNumber.FileSize ||
|
|
1434
1643
|
o.mid === SystemMIDsAsNumber.LastUpdateTime ||
|
|
1435
1644
|
o.mid === SystemMIDsAsNumber.CreationTime;
|
|
1645
|
+
const chronologySystemFilter = (o) => baseFilter(o) ||
|
|
1646
|
+
o.mid === SystemMIDsAsNumber.FileExt ||
|
|
1647
|
+
o.mid === SystemMIDsAsNumber.FileSize;
|
|
1436
1648
|
// Select the appropriate filter based on document type
|
|
1437
|
-
const currentFilter = TID === SystemTIDs.Drafts ? draftFilter : baseFilter;
|
|
1649
|
+
const currentFilter = TID === SystemTIDs.Drafts ? draftFilter : TID === SystemTIDs.Chronology ? chronologySystemFilter : baseFilter;
|
|
1438
1650
|
// Apply filter once
|
|
1439
1651
|
const filteredData = data.filter(currentFilter);
|
|
1440
1652
|
// Return all filtered data or slice to max items
|
|
@@ -1488,3 +1700,35 @@ const TMDcmtPreviewWrapper = ({ currentDcmt, layoutMode, fromDTD, dcmtFile, devi
|
|
|
1488
1700
|
_jsx(TMDcmtPreview, { isVisible: isVisible, onClosePanel: (!isMobile && countVisibleLeafPanels() > 1) ? () => setPanelVisibilityById('tmDcmtPreview', false) : undefined, allowMaximize: !isMobile && countVisibleLeafPanels() > 1, onMaximizePanel: (!isMobile && countVisibleLeafPanels() > 1) ? () => toggleMaximize("tmDcmtPreview") : undefined, dcmtData: currentDcmt, isResizingActive: isResizingActive }) :
|
|
1489
1701
|
_jsx(TMFileUploader, { onFileUpload: onFileUpload, onClose: (!isMobile && countVisibleLeafPanels() > 1) ? () => setPanelVisibilityById('tmDcmtPreview', false) : undefined, isRequired: fromDTD?.archiveConstraint === ArchiveConstraints.ContentCompulsory && dcmtFile === null, defaultBlob: dcmtFile, deviceType: deviceType, isResizingActive: isResizingActive, enableDragDropOverlay: panelVisibility['tmDcmtPreview'] && enableDragDropOverlay }));
|
|
1490
1702
|
};
|
|
1703
|
+
const Ribbon = styled.div `
|
|
1704
|
+
font-size: 0.85rem;
|
|
1705
|
+
font-weight: 600;
|
|
1706
|
+
color: #fff;
|
|
1707
|
+
text-shadow: 0 1px 2px rgba(0, 0, 0, 0.25);
|
|
1708
|
+
--f: .4em; /* control the folded part */
|
|
1709
|
+
position: absolute;
|
|
1710
|
+
top: 2px;
|
|
1711
|
+
left: 2px;
|
|
1712
|
+
z-index: 1200;
|
|
1713
|
+
line-height: 1.6;
|
|
1714
|
+
padding-inline: 0.8lh;
|
|
1715
|
+
padding-bottom: var(--f);
|
|
1716
|
+
border-image: conic-gradient(#0008 0 0) 51%/var(--f);
|
|
1717
|
+
clip-path: polygon(100% calc(100% - var(--f)),100% 100%,calc(100% - var(--f)) calc(100% - var(--f)),var(--f) calc(100% - var(--f)), 0 100%,0 calc(100% - var(--f)),999px calc(100% - var(--f) - 999px),calc(100% - 999px) calc(100% - var(--f) - 999px));
|
|
1718
|
+
transform: translate(calc((cos(45deg) - 1)*100%), -100%) rotate(-45deg);
|
|
1719
|
+
transform-origin: 100% 100%;
|
|
1720
|
+
background-color: rgba(217, 148, 13, 0.92);
|
|
1721
|
+
display: inline-block;
|
|
1722
|
+
padding-top: 0.1em;
|
|
1723
|
+
white-space: nowrap;
|
|
1724
|
+
transition: ${props => props.$isMobile ? 'none' : 'all 0.3s ease'};
|
|
1725
|
+
cursor: 'default';
|
|
1726
|
+
|
|
1727
|
+
${props => !props.$isMobile && `
|
|
1728
|
+
&:hover {
|
|
1729
|
+
background-color: #d9940d;
|
|
1730
|
+
font-size: 1.1rem;
|
|
1731
|
+
transform: translate(calc((cos(45deg) - 1)*100%), -100%) rotate(-45deg) scale(1.05);
|
|
1732
|
+
}
|
|
1733
|
+
`}
|
|
1734
|
+
`;
|