@topconsultnpm/sdkui-react-beta 6.12.110 → 6.12.112

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.
@@ -23,7 +23,6 @@ const TMDcmtPreview = ({ dcmtData, onClose, canNext, canPrev, onNext, onPrev })
23
23
  const [error, setError] = useState('');
24
24
  const { abortController, showWaitPanel, waitPanelTitle, showPrimary, waitPanelTextPrimary, waitPanelValuePrimary, waitPanelMaxValuePrimary, showSecondary, waitPanelTextSecondary, waitPanelValueSecondary, waitPanelMaxValueSecondary, getDcmtFileAsync, clearDcmtsFileCache, removeDcmtsFileCache, isDcmtFileInCache } = useDcmtOperations();
25
25
  const cacheKey = dcmtData ? `${dcmtData.tid}-${dcmtData.did}` : '00';
26
- const FILE_SIZE_LIMIT = 500000;
27
26
  useEffect(() => {
28
27
  setDcmtBlob(undefined);
29
28
  setError('');
@@ -34,7 +33,7 @@ const TMDcmtPreview = ({ dcmtData, onClose, canNext, canPrev, onNext, onPrev })
34
33
  setShowPreview(true);
35
34
  return;
36
35
  }
37
- if ((extensionHandler(dcmtData.fileExt) !== FileExtensionHandler.NONE) && ((dcmtData.fileSize ?? 0) <= FILE_SIZE_LIMIT)) {
36
+ if ((extensionHandler(dcmtData.fileExt) !== FileExtensionHandler.NONE) && ((dcmtData.fileSize ?? 0) <= SDKUI_Globals.userSettings.searchSettings.previewThreshold)) {
38
37
  loadDocumentWithCache();
39
38
  setShowPreview(true);
40
39
  }
@@ -158,7 +158,7 @@ const TMSearch = ({ inputTID, inputSqdID, onRefreshAfterAddDcmtToFavs, onTaskCre
158
158
  newMruTIDS.splice(index, 1);
159
159
  SDKUI_Globals.userSettings.searchSettings.mruTIDs = newMruTIDS.filter(tid => tid != undefined && tid != null);
160
160
  setMruTIDs(newMruTIDS);
161
- } }) }), _jsx(TMSearchQueryPanel, { fromDTD: fromDTD, SQD: currentSQD, isOpenDistinctValuesPanel: showDistinctValuesPanel, rightSidebarItems: rightSidebarItems, onFocusedMetadataChanged: setFocusedTidMid, onRightSidebarItemClick: rightSidebarItemClickHandler, onCloseDistinctValuesPanel: () => setShowDistinctValuesPanel(false), onSearchCompleted: (searchResult, qd) => {
161
+ } }) }), _jsx(TMSearchQueryPanel, { fromDTD: fromDTD, SQD: currentSQD, isOpenDistinctValuesPanel: showDistinctValuesPanel, rightSidebarItems: rightSidebarItems, onBack: deviceType !== DeviceType.DESKTOP ? () => { setCurrentTID(0); } : undefined, onFocusedMetadataChanged: setFocusedTidMid, onRightSidebarItemClick: rightSidebarItemClickHandler, onCloseDistinctValuesPanel: () => setShowDistinctValuesPanel(false), onSearchCompleted: (searchResult, qd) => {
162
162
  setSearchResult(searchResult);
163
163
  if (searchResult.length <= 0)
164
164
  return;
@@ -7,6 +7,7 @@ interface ITMSearchQueryPanelProps {
7
7
  SQD?: SavedQueryDescriptor;
8
8
  isOpenDistinctValuesPanel?: boolean;
9
9
  rightSidebarItems?: ITMRightSidebarItem[];
10
+ onBack?: () => void;
10
11
  onRightSidebarItemClick?: (item: string) => void;
11
12
  onSqdSaved?: (newSqd: SavedQueryDescriptor) => void;
12
13
  onFocusedMetadataChanged?: (tid_mid: TID_MID | undefined) => void;
@@ -21,7 +21,7 @@ import TMDistinctValues from '../../choosers/TMDistinctValues';
21
21
  import { TMMetadataChooserForm } from '../../choosers/TMMetadataChooser';
22
22
  import TMQueryEditor from '../../query/TMQueryEditor';
23
23
  import TMSavedQueryForm from './TMSavedQueryForm';
24
- const TMSearchQueryPanel = ({ fromDTD, rightSidebarItems, isOpenDistinctValuesPanel = false, SQD, onRightSidebarItemClick, onSearchCompleted, onFocusedMetadataChanged, onCloseDistinctValuesPanel, onSqdSaved }) => {
24
+ const TMSearchQueryPanel = ({ fromDTD, rightSidebarItems, isOpenDistinctValuesPanel = false, SQD, onRightSidebarItemClick, onSearchCompleted, onFocusedMetadataChanged, onCloseDistinctValuesPanel, onSqdSaved, onBack }) => {
25
25
  const [confirmQueryParams, ConfirmQueryParamsDialog] = useQueryParametersDialog();
26
26
  const [qd, setQd] = useState();
27
27
  const [lastQdParams, setLastQdParams] = useState([]);
@@ -99,9 +99,7 @@ const TMSearchQueryPanel = ({ fromDTD, rightSidebarItems, isOpenDistinctValuesPa
99
99
  }
100
100
  }
101
101
  };
102
- return (_jsxs(TMSplitterLayout, { direction: 'horizontal', showSeparator: deviceType !== DeviceType.MOBILE && isOpenDistinctValuesPanel, separatorSize: 8, separatorColor: 'transparent', separatorActiveColor: 'transparent', min: ['0', '0'], start: deviceType === DeviceType.MOBILE ? ['100%', '0%'] : (isOpenDistinctValuesPanel ? ['55%', '45%'] : ['100%', '0%']), children: [_jsxs(TMToolbarCard, { title: fromDTD?.nameLoc ?? SDKUI_Localizator.Search_Metadata, items: rightSidebarItems, onItemClick: onRightSidebarItemClick,
103
- // onBack={deviceType !== DeviceType.DESKTOP ? () => { setCurrentTID(0) } : undefined}
104
- toolbar: _jsx(_Fragment, { children: (SQD && !showSqdForm) ?
102
+ return (_jsxs(TMSplitterLayout, { direction: 'horizontal', showSeparator: deviceType !== DeviceType.MOBILE && isOpenDistinctValuesPanel, separatorSize: 8, separatorColor: 'transparent', separatorActiveColor: 'transparent', min: ['0', '0'], start: deviceType === DeviceType.MOBILE ? ['100%', '0%'] : (isOpenDistinctValuesPanel ? ['55%', '45%'] : ['100%', '0%']), children: [_jsxs(TMToolbarCard, { title: fromDTD?.nameLoc ?? SDKUI_Localizator.Search_Metadata, items: rightSidebarItems, onItemClick: onRightSidebarItemClick, onBack: onBack, toolbar: _jsx(_Fragment, { children: (SQD && !showSqdForm) ?
105
103
  _jsx(TMDropDownMenu, { backgroundColor: 'white', borderRadius: '3px', content: _jsx(TMButton, { btnStyle: 'icon', caption: 'Altro', icon: _jsx(IconMenuVertical, { color: 'white' }), showTooltip: false }), items: [
106
104
  { icon: _jsx(IconAddCircleOutline, {}), text: SDKUI_Localizator.SavedQueryNew, onClick: () => { openSqdForm(FormModes.Create); } },
107
105
  { icon: _jsx(IconEdit, {}), text: SDKUI_Localizator.SavedQueryUpdate, disabled: (SQD && SQD.id == 1), onClick: () => { openSqdForm(FormModes.Update); } },
@@ -465,7 +465,7 @@ const TMSearchResult = ({ context = SearchResultContext.METADATA_SEARCH, isVisib
465
465
  _jsxs(StyledModalContainer, { style: { backgroundColor: 'white' }, children: [_jsx(TMMasterDetailDcmts, { deviceType: deviceType, inputDcmts: getSelectionDcmtInfo(), isForMaster: true, allowNavigation: focusedItem && selectedItems.length <= 0, canNext: canNavigateHandler('next'), canPrev: canNavigateHandler('prev'), onNext: () => onNavigateHandler('next'), onPrev: () => onNavigateHandler('prev'), onBack: () => setIsOpenMaster(false), appendMasterDcmts: handleAddItem }), secondaryMasterDcmts.length > 0 && secondaryMasterDcmts.map((dcmt, index) => {
466
466
  return (_jsx(StyledModalContainer, { style: { backgroundColor: 'white' }, children: _jsx(TMMasterDetailDcmts, { deviceType: deviceType, inputDcmts: [dcmt], isForMaster: true, allowNavigation: false, onBack: () => handleRemoveItem(dcmt.TID, dcmt.DID), appendMasterDcmts: handleAddItem }) }, `${index}-${dcmt.DID}`));
467
467
  })] }), isOpenDcmtForm &&
468
- _jsx(StyledModalContainer, { style: { backgroundColor: 'white' }, children: _jsx(TMDcmtForm, { TID: focusedItem?.TID, DID: focusedItem?.DID, layoutMode: dcmtFormLayoutMode, showPreview: true, count: visibleItems.length, itemIndex: visibleItems.findIndex(o => o.rowIndex === focusedItem?.rowIndex) + 1, canNext: canNavigateHandler('next'), canPrev: canNavigateHandler('prev'), onNext: () => onNavigateHandler('next'), onPrev: () => onNavigateHandler('prev'), onClose: () => { setIsOpenDcmtForm(false); }, onSavedAsyncCallback: async (tid, did) => { await refreshFocusedDataRowAsync(tid, did, true); } }) })] }) }));
468
+ _jsx(StyledModalContainer, { style: { backgroundColor: 'white' }, children: _jsx(TMDcmtForm, { TID: focusedItem?.TID, DID: focusedItem?.DID, layoutMode: dcmtFormLayoutMode, showPreview: deviceType !== DeviceType.MOBILE, count: visibleItems.length, itemIndex: visibleItems.findIndex(o => o.rowIndex === focusedItem?.rowIndex) + 1, canNext: canNavigateHandler('next'), canPrev: canNavigateHandler('prev'), onNext: () => onNavigateHandler('next'), onPrev: () => onNavigateHandler('prev'), onClose: () => { setIsOpenDcmtForm(false); }, onSavedAsyncCallback: async (tid, did) => { await refreshFocusedDataRowAsync(tid, did, true); } }) })] }) }));
469
469
  };
470
470
  export default TMSearchResult;
471
471
  const renderDcmtIcon = (cellData) => _jsx(TMDcmtIcon, { fileExtension: cellData.data.FILEEXT, fileCount: cellData.data.FILECOUNT, isLexProt: cellData.data.IsLexProt, isMail: cellData.data.ISMAIL, isShared: cellData.data.ISSHARED, isSigned: cellData.data.ISSIGNED });
@@ -50,8 +50,6 @@ interface TMBlogsProps {
50
50
  }>;
51
51
  /** Optional callback function to update the list of visualized blog posts */
52
52
  updateVisualizedBlogCallback?: (blogPosts: Array<BlogPost | HomeBlogPost>) => void;
53
- /** Optional callback to handle clicks on attachment folder files */
54
- handleClickAttachmentFolderFileCallback?: (folderId: number, draftId: number) => void;
55
53
  /** Optional callback to handle navigation to working groups */
56
54
  handleNavigateToWGs?: (selectedWorkingGroupId: number) => void;
57
55
  /** Optional boolean to control the visibility of an ID */
@@ -65,6 +63,8 @@ interface TMBlogsProps {
65
63
  isShowHideFilterEnabled: boolean;
66
64
  isShowHideIDEnaled: boolean;
67
65
  isCommentEnabled: boolean;
66
+ isDownloadAttachmentEnabled: boolean;
67
+ isViewEditMetadata: boolean;
68
68
  isDeleteEnabled: boolean;
69
69
  isRestoreEnabled: boolean;
70
70
  isRefreshEnabled: boolean;
@@ -1,6 +1,6 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
3
- import { DcmtTypeListCacheService, ResultTypes, SDK_Globals, WorkingGroupEngine } from "@topconsultnpm/sdk-ts-beta";
3
+ import { DcmtTypeListCacheService, LayoutModes, ResultTypes, SDK_Globals, WorkingGroupEngine } from "@topconsultnpm/sdk-ts-beta";
4
4
  import { ContextMenu, ScrollView } from 'devextreme-react';
5
5
  import { SDKUI_Localizator, IconAttachment, getExceptionMessage, Globalization, IconBoard } from '../../helper';
6
6
  import TMDataGrid from '../base/TMDataGrid';
@@ -15,12 +15,16 @@ import { TMResultManager } from '../forms/TMResultDialog';
15
15
  import { TMSearchBar } from '../sidebar/TMHeader';
16
16
  import { AttachmentElement, BlogPostContainer, colors, findFileItemByDraftID, highlightText, IconAndHeaderElement, isHeaderFullyHidden, OwnerInitialsBadge, TMBlogsFilterCategoryId } from './TMBlogsUtils';
17
17
  import { useDcmtOperations } from '../../hooks/useDcmtOperations';
18
- let abortController = new AbortController();
18
+ import { DownloadTypes } from '../../ts';
19
+ import TMDcmtForm from '../features/documents/TMDcmtForm';
20
+ let localAbortController = new AbortController();
19
21
  const TMBlogs = (props) => {
20
- const { id, allData, showExtendedAttachments = true, treeFs, draftLatestInfoMap, archivedDocumentMap, updateVisualizedBlogCallback, handleClickAttachmentFolderFileCallback, height, width, scrollToBottom = true, viewMode = 'thumbnails', header, showIconHeader = true, color = colors.PRIMARY_BLUE, handleNavigateToWGs, showId, setShowId, currentWorkingGroup, contextMenuParams = {
22
+ const { id, allData, showExtendedAttachments = true, treeFs, draftLatestInfoMap, archivedDocumentMap, updateVisualizedBlogCallback, height, width, scrollToBottom = true, viewMode = 'thumbnails', header, showIconHeader = true, color = colors.PRIMARY_BLUE, handleNavigateToWGs, showId, setShowId, currentWorkingGroup, contextMenuParams = {
21
23
  isShowHideFilterEnabled: true,
22
24
  isShowHideIDEnaled: true,
23
25
  isCommentEnabled: false,
26
+ isDownloadAttachmentEnabled: false,
27
+ isViewEditMetadata: false,
24
28
  isDeleteEnabled: false,
25
29
  isRestoreEnabled: false,
26
30
  isRefreshEnabled: false,
@@ -28,6 +32,7 @@ const TMBlogs = (props) => {
28
32
  }, refreshCallback, newPosts = [], showCommentFormCallback, showTaskFormCallback, showContextMenu = true } = props;
29
33
  // Get the current device type (e.g., mobile, tablet, desktop) using a custom hook.
30
34
  const deviceType = useDeviceType();
35
+ const { abortController, showWaitPanel, waitPanelTitle, showPrimary, waitPanelTextPrimary, waitPanelValuePrimary, waitPanelMaxValuePrimary, showSecondary, waitPanelTextSecondary, waitPanelValueSecondary, waitPanelMaxValueSecondary, downloadDcmtsAsync } = useDcmtOperations();
31
36
  // This avoids unnecessary re-renders by only recalculating when deviceType changes.
32
37
  let isMobile = useMemo(() => { return deviceType === DeviceType.MOBILE; }, [deviceType]);
33
38
  // State to manage the current rendering mode of the component (either 'thumbnails' or 'details')
@@ -45,11 +50,12 @@ const TMBlogs = (props) => {
45
50
  // State to manage the focused file
46
51
  const [focusedBlog, setFocusedBlog] = useState(undefined);
47
52
  // State to manage the focused file
53
+ const [focusedAttachment, setFocusedAttachment] = useState(undefined);
54
+ // State to manage the focused file
48
55
  const [dcmtTypeDescriptors, setDcmtTypeDescriptors] = useState(new Map());
49
- // State to store context menu items for file manager actions
50
- const [menuItems, setMenuItems] = useState([]);
51
56
  // State to manage the anchor element for context menu positioning
52
57
  const [anchorEl, setAnchorEl] = useState(null);
58
+ const contextMenuRef = useRef(null);
53
59
  // State to store the current header value. Initialized with the provided 'header' prop.
54
60
  const [currentHeader, setCurrentHeader] = useState(header);
55
61
  // State to track whether the header is fully hidden based on the current header value
@@ -61,17 +67,19 @@ const TMBlogs = (props) => {
61
67
  // Ref to the container
62
68
  const containerRef = useRef(null);
63
69
  // State variable to control the visibility of the wait panel.
64
- const [showWaitPanel, setShowWaitPanel] = useState(false);
70
+ const [localShowWaitPanel, setLocalShowWaitPanel] = useState(false);
65
71
  // State variable to store the title of the wait panel.
66
- const [waitPanelTitle, setWaitPanelTitle] = useState('');
72
+ const [localWaitPanelTitle, setLocalWaitPanelTitle] = useState('');
67
73
  // State variable to control the visibility of the primary section of the wait panel.
68
- const [showPrimary, setShowPrimary] = useState(false);
74
+ const [localShowPrimary, setLocalShowPrimary] = useState(false);
69
75
  // State variable to store the primary text of the wait panel.
70
- const [waitPanelTextPrimary, setWaitPanelTextPrimary] = useState('');
76
+ const [localWaitPanelTextPrimary, setLocalWaitPanelTextPrimary] = useState('');
71
77
  // State variable to track the current value of the primary progress indicator in the wait panel.
72
- const [waitPanelValuePrimary, setWaitPanelValuePrimary] = useState(0);
78
+ const [localWaitPanelValuePrimary, setLocalWaitPanelValuePrimary] = useState(0);
73
79
  // State variable to define the maximum value for the primary progress indicator in the wait panel.
74
- const [waitPanelMaxValuePrimary, setWaitPanelMaxValuePrimary] = useState(0);
80
+ const [localWaitPanelMaxValuePrimary, setLocalWaitPanelMaxValuePrimary] = useState(0);
81
+ // State to manage show selected file
82
+ const [showDcmtForm, setShowDcmtForm] = useState(false);
75
83
  // Data source for the number of posts to display in the UI
76
84
  const postsToShowDataSource = [
77
85
  { value: 30, display: SDKUI_Localizator.Latest + ' 30' },
@@ -110,59 +118,58 @@ const TMBlogs = (props) => {
110
118
  return;
111
119
  if (focusedBlog === undefined || focusedBlog.id === undefined || currentWorkingGroup === undefined || currentWorkingGroup.id === undefined)
112
120
  return Promise.resolve();
113
- setWaitPanelTitle(del ? SDKUI_Localizator.Delete : SDKUI_Localizator.Restore);
114
- setShowWaitPanel(true);
115
- setShowPrimary(true);
116
- abortController = new AbortController();
121
+ setLocalWaitPanelTitle(del ? SDKUI_Localizator.Delete : SDKUI_Localizator.Restore);
122
+ setLocalShowWaitPanel(true);
123
+ setLocalShowPrimary(true);
124
+ localAbortController = new AbortController();
117
125
  let result = [];
118
126
  let i = 0;
119
- setWaitPanelMaxValuePrimary(1);
127
+ setLocalWaitPanelMaxValuePrimary(1);
120
128
  if (abortController.signal.aborted) {
121
129
  result.push({ rowIndex: i, id1: focusedBlog.id, id2: focusedBlog.id, resultType: ResultTypes.WARNING, description: `Operazione interrotta. Elaborate ${i}` });
122
130
  }
123
131
  else {
124
- setWaitPanelTextPrimary(del ? SDKUI_Localizator.Delete : SDKUI_Localizator.Restore);
132
+ setLocalWaitPanelTextPrimary(del ? SDKUI_Localizator.Delete : SDKUI_Localizator.Restore);
125
133
  const workingGroupEngine = new WorkingGroupEngine(SDK_Globals.tmSession);
126
134
  await workingGroupEngine.BlogPostDeleteOrUndeleteAsync(currentWorkingGroup.id, focusedBlog.id, del)
127
135
  .then(() => {
128
136
  result.push({ rowIndex: 1, id1: currentWorkingGroup.id, id2: 0, description: SDKUI_Localizator.UpdateCompletedSuccessfully, resultType: ResultTypes.SUCCESS });
129
137
  TMResultManager.show(result, del ? SDKUI_Localizator.Delete : SDKUI_Localizator.Restore, "ID", undefined);
130
- setFocusedBlog(undefined);
138
+ handleFocusedBlog(undefined);
131
139
  refresh();
132
140
  })
133
141
  .catch((err) => {
134
142
  result.push({ rowIndex: 1, id1: currentWorkingGroup.id, id2: currentWorkingGroup.id, resultType: ResultTypes.ERROR, description: getExceptionMessage(err) });
135
143
  });
136
144
  }
137
- setWaitPanelTextPrimary('');
138
- setWaitPanelMaxValuePrimary(0);
139
- setWaitPanelValuePrimary(0);
140
- setShowWaitPanel(false);
145
+ setLocalWaitPanelTextPrimary('');
146
+ setLocalWaitPanelMaxValuePrimary(0);
147
+ setLocalWaitPanelValuePrimary(0);
148
+ setLocalShowWaitPanel(false);
141
149
  TMResultManager.show(result, del ? SDKUI_Localizator.Delete : SDKUI_Localizator.Restore, "ID", undefined);
142
150
  }
143
151
  });
144
152
  };
153
+ const handleFocusedAttachment = (attachment) => {
154
+ setFocusedAttachment(attachment);
155
+ };
156
+ const handleFocusedBlog = (blog) => {
157
+ setFocusedBlog(blog);
158
+ setFocusedAttachment(undefined);
159
+ };
145
160
  const refresh = () => {
146
161
  if (refreshCallback)
147
162
  refreshCallback();
148
163
  };
164
+ const downloadAttachment = () => {
165
+ if (focusedAttachment === undefined)
166
+ return;
167
+ if (downloadDcmtsAsync)
168
+ downloadDcmtsAsync([{ TID: focusedAttachment.TID, DID: focusedAttachment.DID, fileName: focusedAttachment.fileName }], DownloadTypes.Dcmt);
169
+ };
149
170
  // ContexMenuItems array contains a list of context menu items for a blog
150
171
  const contextMenuItems = useMemo(() => {
151
172
  let menuItemsElements = [
152
- {
153
- icon: isHeaderHidden ? 'eyeopen' : 'eyeclose',
154
- text: isHeaderHidden ? SDKUI_Localizator.ShowFilters : SDKUI_Localizator.HideFilters,
155
- visible: contextMenuParams.isShowHideFilterEnabled,
156
- onClick: toggleHeaderClick,
157
- disabled: false,
158
- },
159
- {
160
- icon: localShowId ? 'eyeclose' : 'eyeopen',
161
- onClick: () => setLocalShowId(prevShowId => !prevShowId),
162
- text: localShowId ? SDKUI_Localizator.ID_Hide : SDKUI_Localizator.ID_Show,
163
- visible: contextMenuParams.isShowHideIDEnaled,
164
- disabled: false,
165
- },
166
173
  {
167
174
  icon: "chat",
168
175
  text: SDKUI_Localizator.Comment,
@@ -170,7 +177,20 @@ const TMBlogs = (props) => {
170
177
  disabled: false,
171
178
  onClick: () => { if (showCommentFormCallback)
172
179
  showCommentFormCallback(); },
173
- beginGroup: true
180
+ },
181
+ {
182
+ icon: "download",
183
+ text: 'Download',
184
+ visible: contextMenuParams.isDownloadAttachmentEnabled && focusedAttachment !== undefined,
185
+ disabled: focusedAttachment === undefined,
186
+ onClick: downloadAttachment,
187
+ },
188
+ {
189
+ icon: showDcmtForm ? 'eyeclose' : 'eyeopen',
190
+ text: showDcmtForm ? SDKUI_Localizator.HideMetadata : SDKUI_Localizator.ViewEditMetadata,
191
+ visible: contextMenuParams.isViewEditMetadata && focusedAttachment !== undefined,
192
+ disabled: focusedAttachment === undefined,
193
+ onClick: () => setShowDcmtForm(true),
174
194
  },
175
195
  {
176
196
  icon: "trash",
@@ -178,6 +198,7 @@ const TMBlogs = (props) => {
178
198
  visible: contextMenuParams.isDeleteEnabled,
179
199
  onClick: () => deleteOrUndeleteCommentCallback(true),
180
200
  disabled: focusedBlog?.ownerID !== SDK_Globals.tmSession?.SessionDescr?.userID || focusedBlog === undefined || (focusedBlog && (focusedBlog.isDel !== undefined && focusedBlog.isDel !== 0)),
201
+ beginGroup: true
181
202
  },
182
203
  {
183
204
  icon: "undo",
@@ -195,6 +216,21 @@ const TMBlogs = (props) => {
195
216
  disabled: false,
196
217
  beginGroup: true
197
218
  },
219
+ {
220
+ icon: isHeaderHidden ? 'eyeopen' : 'eyeclose',
221
+ text: isHeaderHidden ? SDKUI_Localizator.ShowFilters : SDKUI_Localizator.HideFilters,
222
+ visible: contextMenuParams.isShowHideFilterEnabled,
223
+ onClick: toggleHeaderClick,
224
+ disabled: false,
225
+ beginGroup: true
226
+ },
227
+ {
228
+ icon: localShowId ? 'eyeclose' : 'eyeopen',
229
+ onClick: () => setLocalShowId(prevShowId => !prevShowId),
230
+ text: localShowId ? SDKUI_Localizator.ID_Hide : SDKUI_Localizator.ID_Show,
231
+ visible: contextMenuParams.isShowHideIDEnaled,
232
+ disabled: false,
233
+ },
198
234
  {
199
235
  icon: "refresh",
200
236
  text: SDKUI_Localizator.Refresh,
@@ -205,7 +241,7 @@ const TMBlogs = (props) => {
205
241
  },
206
242
  ];
207
243
  return menuItemsElements;
208
- }, [isHeaderHidden, localShowId, setLocalShowId, focusedBlog]);
244
+ }, [isHeaderHidden, localShowId, setLocalShowId, focusedBlog, focusedAttachment, showDcmtForm]);
209
245
  useEffect(() => {
210
246
  if (currentWorkingGroup === undefined)
211
247
  setNewPostCount(0);
@@ -317,7 +353,7 @@ const TMBlogs = (props) => {
317
353
  // Update the state with the filtered and limited list of blogs
318
354
  setBlogPosts(filteredBlogs);
319
355
  if (focusedBlog && focusedBlog.id && filteredBlogs.find(filteredBlog => focusedBlog.id === filteredBlog.id) === undefined)
320
- setFocusedBlog(undefined);
356
+ handleFocusedBlog(undefined);
321
357
  }, [allData, appliedGlobalFilters, searchText, postsToShow, currentHeader]);
322
358
  useEffect(() => {
323
359
  if (viewMode)
@@ -334,7 +370,6 @@ const TMBlogs = (props) => {
334
370
  }, [focusedBlog]);
335
371
  const ThumbnailView = () => {
336
372
  const scrollRef = useRef(null);
337
- const { abortController, showWaitPanel, waitPanelTitle, showPrimary, waitPanelTextPrimary, waitPanelValuePrimary, waitPanelMaxValuePrimary, showSecondary, waitPanelTextSecondary, waitPanelValueSecondary, waitPanelMaxValueSecondary, downloadDcmtsAsync } = useDcmtOperations();
338
373
  useEffect(() => {
339
374
  if (focusedBlog && focusedBlog.id) { // containerRef.current
340
375
  const focusedElement = document.getElementById(focusedBlog.id.toString());
@@ -350,7 +385,7 @@ const TMBlogs = (props) => {
350
385
  }, [blogPosts, viewMode, focusedBlog]);
351
386
  const attachmentDetails = (attachments, isSelected) => {
352
387
  return _jsx("div", { style: { marginTop: "10px", overflow: "hidden" }, children: attachments.map(attachment => {
353
- return AttachmentElement(attachment, treeFs, draftLatestInfoMap, archivedDocumentMap, dcmtTypeDescriptors, isSelected, searchText, color, handleClickAttachmentFolderFileCallback, downloadDcmtsAsync);
388
+ return AttachmentElement(attachment, treeFs, draftLatestInfoMap, archivedDocumentMap, dcmtTypeDescriptors, isSelected, searchText, color, downloadDcmtsAsync, handleFocusedAttachment, setAnchorEl, contextMenuRef);
354
389
  }) });
355
390
  };
356
391
  return _jsx(TMLayoutWaitingContainer, { direction: 'vertical', showWaitPanel: showWaitPanel, showWaitPanelPrimary: showPrimary, showWaitPanelSecondary: showSecondary, waitPanelTitle: waitPanelTitle, waitPanelTextPrimary: waitPanelTextPrimary, waitPanelValuePrimary: waitPanelValuePrimary, waitPanelMaxValuePrimary: waitPanelMaxValuePrimary, waitPanelTextSecondary: waitPanelTextSecondary, waitPanelValueSecondary: waitPanelValueSecondary, waitPanelMaxValueSecondary: waitPanelMaxValueSecondary, isCancelable: true, abortController: abortController, children: _jsx("div", { ref: scrollRef, style: { backgroundColor: "rgba(191, 191, 191, 0.15)", height: "100%", padding: "5px", overflowY: "auto", width: "100%" }, children: blogPosts.length === 0 ?
@@ -383,14 +418,14 @@ const TMBlogs = (props) => {
383
418
  handleNavigateToWGs(id);
384
419
  };
385
420
  const onClickCallback = () => {
386
- setFocusedBlog(blogPost);
421
+ handleFocusedBlog(blogPost);
387
422
  };
388
423
  const handleKeyDown = (event) => {
389
424
  event.preventDefault();
390
425
  if (event.key === 'ArrowDown' && focusedBlog) {
391
426
  const currentIndex = blogPosts.findIndex(post => post.id === focusedBlog.id);
392
427
  if (blogPosts[currentIndex + 1]) {
393
- setFocusedBlog(blogPosts[currentIndex + 1]);
428
+ handleFocusedBlog(blogPosts[currentIndex + 1]);
394
429
  }
395
430
  ;
396
431
  }
@@ -400,12 +435,17 @@ const TMBlogs = (props) => {
400
435
  if (event.key === 'ArrowUp' && focusedBlog) {
401
436
  const currentIndex = blogPosts.findIndex(post => post.id === focusedBlog.id);
402
437
  if (blogPosts[currentIndex - 1]) {
403
- setFocusedBlog(blogPosts[currentIndex - 1]);
438
+ handleFocusedBlog(blogPosts[currentIndex - 1]);
404
439
  }
405
440
  ;
406
441
  }
407
442
  };
408
- return (_jsxs(BlogPostContainer, { id: id + "-" + blogPost.id.toString(), ref: containerRef, "$color": textColor, "$textDecoration": blogPost.isDel ? 'line-through' : 'none', "$backgroundColor": bgColor, "$isNew": Boolean(blogPost.newPosts ?? 0) || isNew, "$canNavigate": canNavigate(), onClick: onClickCallback, onDoubleClick: headerClickCallback, tabIndex: 0, onKeyDown: handleKeyDown, onKeyUp: handleKeyUp, children: [_jsxs("div", { style: { display: "flex", alignItems: "center" }, children: [OwnerInitialsBadge(blogPost), _jsx("div", { style: { flex: "1 1 auto", minWidth: "0" }, children: _jsxs("div", { style: { display: 'flex', justifyContent: 'space-between', alignItems: 'center', flexWrap: "wrap", overflow: "hidden" }, children: [_jsxs("div", { children: [_jsxs("div", { style: { fontWeight: "bold", fontSize: "13px", display: "flex", alignItems: "center" }, children: [(showIconHeader && (blogPost.header && blogPost.classID))
443
+ const onContextMenu = (e) => {
444
+ e.preventDefault();
445
+ setAnchorEl(e.currentTarget);
446
+ handleFocusedAttachment(undefined);
447
+ };
448
+ return (_jsxs(BlogPostContainer, { id: id + "-" + blogPost.id.toString(), ref: containerRef, "$color": textColor, "$textDecoration": blogPost.isDel ? 'line-through' : 'none', "$backgroundColor": bgColor, "$isNew": Boolean(blogPost.newPosts ?? 0) || isNew, "$canNavigate": canNavigate(), onClick: onClickCallback, onDoubleClick: headerClickCallback, tabIndex: 0, onKeyDown: handleKeyDown, onKeyUp: handleKeyUp, onContextMenu: onContextMenu, children: [_jsxs("div", { style: { display: "flex", alignItems: "center" }, children: [OwnerInitialsBadge(blogPost), _jsx("div", { style: { flex: "1 1 auto", minWidth: "0" }, children: _jsxs("div", { style: { display: 'flex', justifyContent: 'space-between', alignItems: 'center', flexWrap: "wrap", overflow: "hidden" }, children: [_jsxs("div", { children: [_jsxs("div", { style: { fontWeight: "bold", fontSize: "13px", display: "flex", alignItems: "center" }, children: [(showIconHeader && (blogPost.header && blogPost.classID))
409
449
  ? (IconAndHeaderElement(blogPost, iconColor, isSelected, headerClickCallback, searchText)) :
410
450
  _jsx("span", { style: { marginLeft: showIconHeader ? "5px" : "0" }, children: highlightText(blogPost.ownerName ?? '', searchText, isSelected) }), (blogPost?.newPosts ?? 0) > 0 && (_jsx("div", { style: {
411
451
  marginLeft: "5px",
@@ -481,9 +521,9 @@ const TMBlogs = (props) => {
481
521
  const data = cellData.data;
482
522
  const { attachments } = data;
483
523
  return _jsx("div", { style: { marginTop: "10px", overflow: "hidden" }, children: (attachments && attachments.length > 0) ? attachments.map(attachment => {
484
- return AttachmentElement(attachment, treeFs, draftLatestInfoMap, archivedDocumentMap, dcmtTypeDescriptors, false, searchText, color, handleClickAttachmentFolderFileCallback, downloadDcmtsAsync);
524
+ return AttachmentElement(attachment, treeFs, draftLatestInfoMap, archivedDocumentMap, dcmtTypeDescriptors, false, searchText, color, downloadDcmtsAsync, handleFocusedAttachment, setAnchorEl, contextMenuRef);
485
525
  }) : '' });
486
- }, [treeFs, draftLatestInfoMap, dcmtTypeDescriptors, color, handleClickAttachmentFolderFileCallback, searchText]);
526
+ }, [treeFs, draftLatestInfoMap, dcmtTypeDescriptors, color, searchText]);
487
527
  const cellDatetimeRender = useCallback((cellData) => {
488
528
  const data = cellData.data;
489
529
  const { value } = cellData;
@@ -494,7 +534,7 @@ const TMBlogs = (props) => {
494
534
  // Handles focus change in the data grid
495
535
  const onFocusedRowChanged = useCallback((e) => {
496
536
  if (e.row)
497
- setFocusedBlog(e.row.data);
537
+ handleFocusedBlog(e.row.data);
498
538
  }, []);
499
539
  const onContextMenuPreparing = (e) => {
500
540
  if (e === undefined)
@@ -532,18 +572,23 @@ const TMBlogs = (props) => {
532
572
  setPostsToShow(Number(value));
533
573
  }
534
574
  };
575
+ // Handle closing the context menu
576
+ const closeContextMenu = useCallback(() => {
577
+ setAnchorEl(null);
578
+ }, []);
535
579
  const onContextMenu = (event) => {
536
580
  if (event === undefined)
537
581
  return;
538
- event.preventDefault();
539
- setAnchorEl(event.currentTarget);
540
- setMenuItems(showContextMenu ? contextMenuItems : []);
582
+ if (blogPosts.length === 0) {
583
+ event.preventDefault();
584
+ setAnchorEl(event.currentTarget);
585
+ }
541
586
  };
542
- // Handle closing the context menu
543
- const closeContextMenu = useCallback(() => {
544
- setAnchorEl(null);
587
+ const onCloseDcmtForm = useCallback(() => {
588
+ setShowDcmtForm(false);
589
+ handleFocusedAttachment(undefined);
545
590
  }, []);
546
- return _jsx("div", { style: { height: height ?? '100%', width: width ?? '100%' }, children: _jsxs(TMLayoutWaitingContainer, { direction: 'vertical', showWaitPanel: showWaitPanel, showWaitPanelPrimary: showPrimary, waitPanelTitle: waitPanelTitle, waitPanelTextPrimary: waitPanelTextPrimary, waitPanelValuePrimary: waitPanelValuePrimary, waitPanelMaxValuePrimary: waitPanelMaxValuePrimary, isCancelable: true, abortController: abortController, children: [(currentHeader && !isHeaderHidden) && (_jsx("div", { style: { display: 'block', width: '100%', overflowX: 'auto', overflowY: 'hidden', whiteSpace: 'nowrap' }, onContextMenu: e => e.preventDefault(), children: _jsx(ScrollView, { width: "100%", height: "auto", direction: "horizontal", useNative: true, children: _jsxs("div", { style: {
591
+ return _jsx("div", { style: { height: height ?? '100%', width: width ?? '100%' }, children: _jsxs(TMLayoutWaitingContainer, { direction: 'vertical', showWaitPanel: localShowWaitPanel, showWaitPanelPrimary: localShowPrimary, waitPanelTitle: localWaitPanelTitle, waitPanelTextPrimary: localWaitPanelTextPrimary, waitPanelValuePrimary: localWaitPanelValuePrimary, waitPanelMaxValuePrimary: localWaitPanelMaxValuePrimary, isCancelable: true, abortController: localAbortController, children: [(currentHeader && !isHeaderHidden) && (_jsx("div", { style: { display: 'block', width: '100%', overflowX: 'auto', overflowY: 'hidden', whiteSpace: 'nowrap' }, onContextMenu: e => e.preventDefault(), children: _jsx(ScrollView, { width: "100%", height: "auto", direction: "horizontal", useNative: true, children: _jsxs("div", { style: {
547
592
  display: 'flex',
548
593
  flexDirection: 'row',
549
594
  gap: '8px',
@@ -561,6 +606,6 @@ const TMBlogs = (props) => {
561
606
  minWidth: isMobile ? '90px' : '120px',
562
607
  width: isMobile ? '90px' : '150px',
563
608
  height: '29px',
564
- } }))] }) }) })), _jsxs("div", { style: { height: `calc(100% - ${currentHeader && !isHeaderHidden ? '50px' : '0px'})`, width: "100%", overflow: 'auto', display: 'block' }, children: [_jsx("div", { style: { display: renderMode === 'thumbnails' ? 'block' : 'none', width: "100%", height: "100%" }, onContextMenu: onContextMenu, children: ThumbnailView() }), _jsx("div", { style: { display: renderMode === 'details' ? 'block' : 'none', width: "100%", height: "100%" }, children: DataGridView() }), anchorEl && _jsx(ContextMenu, { dataSource: menuItems, target: anchorEl, onHiding: closeContextMenu })] })] }) });
609
+ } }))] }) }) })), _jsxs("div", { style: { height: `calc(100% - ${currentHeader && !isHeaderHidden ? '50px' : '0px'})`, width: "100%", overflow: 'auto', display: 'block' }, children: [_jsx("div", { style: { display: renderMode === 'thumbnails' ? 'block' : 'none', width: "100%", height: "100%" }, onContextMenu: onContextMenu, children: ThumbnailView() }), _jsx("div", { style: { display: renderMode === 'details' ? 'block' : 'none', width: "100%", height: "100%" }, children: DataGridView() }), anchorEl && _jsx(ContextMenu, { ref: contextMenuRef, dataSource: contextMenuItems, target: anchorEl, onHiding: closeContextMenu })] }), (showDcmtForm && focusedAttachment && focusedAttachment.TID && focusedAttachment.DID) && _jsx(TMDcmtForm, { TID: Number(focusedAttachment.TID), DID: Number(focusedAttachment.DID), layoutMode: LayoutModes.Update, onClose: onCloseDcmtForm, isClosable: true, titleModal: SDKUI_Localizator.Attachment + ": " + focusedAttachment.fileName, isModal: true, showPreview: !isMobile, showBoard: !isMobile, widthModal: "95%", heightModal: "95%" })] }) });
565
610
  };
566
611
  export default TMBlogs;
@@ -2,6 +2,7 @@ import React from 'react';
2
2
  import { BlogPost, BlogPostAttachment, DcmtTypeDescriptor, HomeBlogPost } from "@topconsultnpm/sdk-ts-beta";
3
3
  import { FileItem } from '../base/TMFileManager';
4
4
  import { DcmtInfo, DownloadTypes } from '../../ts';
5
+ import { ContextMenuRef } from 'devextreme-react/cjs/context-menu';
5
6
  export declare const DRAFT_TYPE_TID = 6;
6
7
  export declare const colors: {
7
8
  DARK_BLUE: string;
@@ -72,7 +73,7 @@ export declare const AttachmentElement: (attachment: BlogPostAttachment, treeFs:
72
73
  did: number;
73
74
  fileExt: string;
74
75
  fileSize: string;
75
- }> | undefined, dcmtTypeDescriptors: Map<number, DcmtTypeDescriptor>, isSelected: boolean, searchText: string, color: string, handleClickAttachmentFolderFileCallback: ((folderId: number, draftId: number) => void) | undefined, downloadDcmtsAsync: (inputDcmts: Array<DcmtInfo> | undefined, downloadType: DownloadTypes) => Promise<void>) => import("react/jsx-runtime").JSX.Element;
76
+ }> | undefined, dcmtTypeDescriptors: Map<number, DcmtTypeDescriptor>, isSelected: boolean, searchText: string, color: string, downloadDcmtsAsync: (inputDcmts: Array<DcmtInfo> | undefined, downloadType: DownloadTypes) => Promise<void>, handleFocusedAttachment: (attachment: DcmtInfo | undefined) => void, setAnchorEl: (value: React.SetStateAction<HTMLElement | null>) => void, contextMenuRef: React.MutableRefObject<ContextMenuRef<any> | null>) => import("react/jsx-runtime").JSX.Element;
76
77
  export declare const OwnerInitialsBadge: (blogPost: BlogPost | HomeBlogPost) => import("react/jsx-runtime").JSX.Element;
77
78
  export declare const IconAndHeaderElement: (blogPost: BlogPost | HomeBlogPost, iconColor: string, isSelected: boolean, headerClickCallback: () => void, searchText: string) => import("react/jsx-runtime").JSX.Element;
78
79
  export declare const findFileItemByDraftID: (tree: FileItem | undefined, draftID: number | undefined) => FileItem | null;
@@ -130,17 +130,8 @@ export const getAttachmentInfo = (attachment, treeFs, draftLatestInfoMap, archiv
130
130
  }
131
131
  return { name, nameElement, folderId, fileExt, draftExist, archivedDocumentsExist };
132
132
  };
133
- export const AttachmentElement = (attachment, treeFs, draftLatestInfoMap, archivedDocumentMap, dcmtTypeDescriptors, isSelected, searchText, color, handleClickAttachmentFolderFileCallback, downloadDcmtsAsync) => {
133
+ export const AttachmentElement = (attachment, treeFs, draftLatestInfoMap, archivedDocumentMap, dcmtTypeDescriptors, isSelected, searchText, color, downloadDcmtsAsync, handleFocusedAttachment, setAnchorEl, contextMenuRef) => {
134
134
  const { name, nameElement, folderId, fileExt, draftExist } = getAttachmentInfo(attachment, treeFs, draftLatestInfoMap, archivedDocumentMap, dcmtTypeDescriptors, isSelected, searchText, color);
135
- const onClickCallback = (e) => {
136
- e.preventDefault();
137
- e.stopPropagation();
138
- if (attachment.tid === DRAFT_TYPE_TID && treeFs && draftExist) {
139
- const folderIdAttachment = folderId === 0 ? -1 : folderId;
140
- if (handleClickAttachmentFolderFileCallback && attachment.draftID)
141
- handleClickAttachmentFolderFileCallback(folderIdAttachment, attachment.draftID);
142
- }
143
- };
144
135
  const onDoubleClick = (e) => {
145
136
  e.preventDefault();
146
137
  e.stopPropagation();
@@ -149,7 +140,19 @@ export const AttachmentElement = (attachment, treeFs, draftLatestInfoMap, archiv
149
140
  if (downloadDcmtsAsync)
150
141
  downloadDcmtsAsync([{ TID: attachment.tid, DID: attachment.did, fileName }], DownloadTypes.Dcmt);
151
142
  };
152
- return _jsx("div", { onClick: onClickCallback, onDoubleClick: onDoubleClick, style: {
143
+ const onContextMenu = (e) => {
144
+ const archiveID = SDK_Globals.tmSession?.SessionDescr?.archiveID;
145
+ const fileName = `${removeFileExtension(name)}_${archiveID}_${attachment.tid}_${attachment.did}.${fileExt}`;
146
+ handleFocusedAttachment({ TID: attachment.tid, DID: attachment.did, fileName });
147
+ setAnchorEl(e.currentTarget);
148
+ e.preventDefault();
149
+ e.stopPropagation();
150
+ // Slight delay to ensure state update before showing context menu
151
+ setTimeout(() => {
152
+ contextMenuRef.current?.instance()?.show();
153
+ }, 0);
154
+ };
155
+ return _jsx("div", { onDoubleClick: onDoubleClick, onContextMenu: onContextMenu, style: {
153
156
  display: 'inline-flex',
154
157
  padding: '8px 12px',
155
158
  margin: '4px',
@@ -170,6 +170,7 @@ export declare class SDKUI_Localizator {
170
170
  static get Hide_CompleteName(): "Vollständigen Namen ausblenden" | "Hide full name" | "Ocultar nombre completo" | "Masquer le nom complet" | "Ocultar nome completo" | "Nascondi nome completo";
171
171
  static get HideFilters(): string;
172
172
  static get HideLeftPanel(): "Linkes Panel ausblenden" | "Hide left panel" | "Ocultar panel izquierdo" | "Masquer le panneau de gauche" | "Ocultar painel esquerdo" | "Nascondi il pannello sinistro";
173
+ static get HideMetadata(): string;
173
174
  static get HideSearch(): "Suche ausblenden" | "Hide search" | "Ocultar búsqueda" | "Masquer la recherche" | "Ocultar pesquisa" | "Nascondi ricerca";
174
175
  static get ID_Hide(): "Ausblenden ID" | "Hide ID" | "Ocultar ID" | "Masquer ID" | "Nascondi ID";
175
176
  static get ID_Show(): "ID anzeigen" | "Show ID" | "Mostrar ID" | "Afficher ID" | "Visualizza ID";
@@ -400,6 +401,7 @@ export declare class SDKUI_Localizator {
400
401
  static get VariablesSystem(): "Systemvariablen" | "System variables" | "Variables del sistema" | "Variables de système" | "Variáveis do sistema" | "Variabili di sistema";
401
402
  static get Version(): string;
402
403
  static get View_Metadato(): "Anzeige (Methadaten)" | "Visualization (metadata)" | "Visualización (metadato)" | "Visualisation (métadonnée)" | "Display (metadados)" | "Visualizzazione (metadato)";
404
+ static get ViewEditMetadata(): string;
403
405
  static get ViewWithCheckOption(): "Kontrolle über Archivierung und Bearbeitung" | "Check on archive and update" | "Control en almacenamiento y modificación" | "Contrôle de l'archivage et la modifie" | "Controle de arquivamento e edição" | "Controllo su archiviazione e modifica";
404
406
  static get Visible(): "Sichtbar" | "Visible" | "Visibles" | "Visibiles" | "Visíveis" | "Visibili";
405
407
  static get VisibleItems(): "sichtbare Elemente" | "Visible items" | "elementos visibles" | "éléments visibles" | "itens visíveis" | "Elementi visibili";
@@ -1660,6 +1660,16 @@ export class SDKUI_Localizator {
1660
1660
  default: return "Nascondi il pannello sinistro";
1661
1661
  }
1662
1662
  }
1663
+ static get HideMetadata() {
1664
+ switch (this._cultureID) {
1665
+ case CultureIDs.De_DE: return "Metadaten ausblenden";
1666
+ case CultureIDs.En_US: return "Hide Metadata";
1667
+ case CultureIDs.Es_ES: return "Ocultar metadatos";
1668
+ case CultureIDs.Fr_FR: return "Masquer les métadonnées";
1669
+ case CultureIDs.Pt_PT: return "Ocultar metadados";
1670
+ default: return "Nascondi metadati";
1671
+ }
1672
+ }
1663
1673
  static get HideSearch() {
1664
1674
  switch (this._cultureID) {
1665
1675
  case CultureIDs.De_DE: return "Suche ausblenden";
@@ -3958,6 +3968,16 @@ export class SDKUI_Localizator {
3958
3968
  default: return "Visualizzazione (metadato)";
3959
3969
  }
3960
3970
  }
3971
+ static get ViewEditMetadata() {
3972
+ switch (this._cultureID) {
3973
+ case CultureIDs.De_DE: return "Metadaten anzeigen/bearbeiten";
3974
+ case CultureIDs.En_US: return "View/Edit Metadata";
3975
+ case CultureIDs.Es_ES: return "Ver/Editar metadatos";
3976
+ case CultureIDs.Fr_FR: return "Afficher/Modifier les métadonnées";
3977
+ case CultureIDs.Pt_PT: return "Visualizar/Editar metadados";
3978
+ default: return "Visualizza/modifica metadati";
3979
+ }
3980
+ }
3961
3981
  static get ViewWithCheckOption() {
3962
3982
  switch (this._cultureID) {
3963
3983
  case CultureIDs.De_DE: return "Kontrolle über Archivierung und Bearbeitung";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@topconsultnpm/sdkui-react-beta",
3
- "version": "6.12.110",
3
+ "version": "6.12.112",
4
4
  "description": "",
5
5
  "scripts": {
6
6
  "test": "echo \"Error: no test specified\" && exit 1",