@topconsultnpm/sdkui-react 6.19.0-dev1.9 → 6.19.0-dev2.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (144) hide show
  1. package/lib/components/NewComponents/ContextMenu/TMContextMenu.d.ts +4 -0
  2. package/lib/components/NewComponents/ContextMenu/TMContextMenu.js +187 -0
  3. package/lib/components/NewComponents/ContextMenu/hooks.d.ts +11 -0
  4. package/lib/components/NewComponents/ContextMenu/hooks.js +48 -0
  5. package/lib/components/NewComponents/ContextMenu/index.d.ts +2 -0
  6. package/lib/components/NewComponents/ContextMenu/index.js +1 -0
  7. package/lib/components/NewComponents/ContextMenu/styles.d.ts +27 -0
  8. package/lib/components/NewComponents/ContextMenu/styles.js +308 -0
  9. package/lib/components/NewComponents/ContextMenu/types.d.ts +26 -0
  10. package/lib/components/NewComponents/ContextMenu/types.js +1 -0
  11. package/lib/components/NewComponents/FloatingMenuBar/TMFloatingMenuBar.d.ts +4 -0
  12. package/lib/components/NewComponents/FloatingMenuBar/TMFloatingMenuBar.js +370 -0
  13. package/lib/components/NewComponents/FloatingMenuBar/index.d.ts +2 -0
  14. package/lib/components/NewComponents/FloatingMenuBar/index.js +2 -0
  15. package/lib/components/NewComponents/FloatingMenuBar/styles.d.ts +38 -0
  16. package/lib/components/NewComponents/FloatingMenuBar/styles.js +267 -0
  17. package/lib/components/NewComponents/FloatingMenuBar/types.d.ts +30 -0
  18. package/lib/components/NewComponents/FloatingMenuBar/types.js +1 -0
  19. package/lib/components/NewComponents/Notification/Notification.d.ts +4 -0
  20. package/lib/components/NewComponents/Notification/Notification.js +60 -0
  21. package/lib/components/NewComponents/Notification/NotificationContainer.d.ts +8 -0
  22. package/lib/components/NewComponents/Notification/NotificationContainer.js +33 -0
  23. package/lib/components/NewComponents/Notification/index.d.ts +2 -0
  24. package/lib/components/NewComponents/Notification/index.js +2 -0
  25. package/lib/components/NewComponents/Notification/styles.d.ts +21 -0
  26. package/lib/components/NewComponents/Notification/styles.js +180 -0
  27. package/lib/components/NewComponents/Notification/types.d.ts +18 -0
  28. package/lib/components/NewComponents/Notification/types.js +1 -0
  29. package/lib/components/base/Styled.d.ts +1 -0
  30. package/lib/components/base/Styled.js +40 -0
  31. package/lib/components/base/TMCustomButton.d.ts +11 -0
  32. package/lib/components/base/TMCustomButton.js +63 -0
  33. package/lib/components/base/TMFileManagerDataGridView.js +4 -1
  34. package/lib/components/base/TMLayout.d.ts +2 -1
  35. package/lib/components/base/TMLayout.js +2 -2
  36. package/lib/components/base/TMPopUp.js +5 -18
  37. package/lib/components/base/TMTreeView.js +3 -2
  38. package/lib/components/editors/TMHtmlEditor.d.ts +5 -0
  39. package/lib/components/editors/TMHtmlEditor.js +72 -12
  40. package/lib/components/editors/TMMetadataValues.js +90 -40
  41. package/lib/components/features/archive/TMArchive.d.ts +10 -0
  42. package/lib/components/features/archive/TMArchive.js +56 -25
  43. package/lib/components/features/blog/TMBlogCommentForm.d.ts +4 -4
  44. package/lib/components/features/blog/TMBlogCommentForm.js +76 -51
  45. package/lib/components/features/documents/TMDcmtBlog.d.ts +15 -0
  46. package/lib/components/features/documents/TMDcmtBlog.js +21 -33
  47. package/lib/components/features/documents/TMDcmtForm.d.ts +17 -3
  48. package/lib/components/features/documents/TMDcmtForm.js +205 -46
  49. package/lib/components/features/documents/TMDcmtTasks.d.ts +13 -0
  50. package/lib/components/features/documents/TMDcmtTasks.js +24 -0
  51. package/lib/components/features/documents/TMDragDropOverlay.js +2 -1
  52. package/lib/components/features/documents/TMMasterDetailDcmts.d.ts +8 -1
  53. package/lib/components/features/documents/TMMasterDetailDcmts.js +6 -6
  54. package/lib/components/features/documents/TMRelationViewer.d.ts +53 -3
  55. package/lib/components/features/documents/TMRelationViewer.js +232 -85
  56. package/lib/components/features/search/TMSearch.d.ts +10 -1
  57. package/lib/components/features/search/TMSearch.js +14 -5
  58. package/lib/components/features/search/TMSearchQueryPanel.d.ts +1 -1
  59. package/lib/components/features/search/TMSearchQueryPanel.js +36 -7
  60. package/lib/components/features/search/TMSearchResult.d.ts +10 -1
  61. package/lib/components/features/search/TMSearchResult.js +140 -422
  62. package/lib/components/features/search/TMSearchResultsMenuItems.d.ts +2 -2
  63. package/lib/components/features/search/TMSearchResultsMenuItems.js +40 -15
  64. package/lib/components/features/tasks/TMTaskForm.d.ts +38 -0
  65. package/lib/components/features/tasks/TMTaskForm.js +386 -0
  66. package/lib/components/features/tasks/TMTasksAgenda.d.ts +17 -0
  67. package/lib/components/features/tasks/TMTasksAgenda.js +107 -0
  68. package/lib/components/features/tasks/TMTasksCalendar.d.ts +21 -0
  69. package/lib/components/features/tasks/TMTasksCalendar.js +240 -0
  70. package/lib/components/features/tasks/TMTasksHeader.d.ts +14 -0
  71. package/lib/components/features/tasks/TMTasksHeader.js +37 -0
  72. package/lib/components/features/tasks/TMTasksPanelContent.d.ts +20 -0
  73. package/lib/components/features/tasks/TMTasksPanelContent.js +65 -0
  74. package/lib/components/features/tasks/TMTasksUtils.d.ts +132 -0
  75. package/lib/components/features/tasks/TMTasksUtils.js +634 -0
  76. package/lib/components/features/tasks/TMTasksUtilsView.d.ts +39 -0
  77. package/lib/components/features/tasks/TMTasksUtilsView.js +118 -0
  78. package/lib/components/features/tasks/TMTasksView.d.ts +40 -0
  79. package/lib/components/features/tasks/TMTasksView.js +560 -0
  80. package/lib/components/features/workflow/TMWorkflowPopup.d.ts +3 -1
  81. package/lib/components/features/workflow/TMWorkflowPopup.js +19 -6
  82. package/lib/components/features/workflow/diagram/RecipientList.js +4 -3
  83. package/lib/components/forms/Login/Chooser.js +1 -1
  84. package/lib/components/forms/TMChooserForm.d.ts +1 -1
  85. package/lib/components/forms/TMChooserForm.js +2 -2
  86. package/lib/components/grids/TMBlogAttachments.d.ts +42 -0
  87. package/lib/components/grids/TMBlogAttachments.js +43 -0
  88. package/lib/components/grids/TMBlogHeader.d.ts +31 -0
  89. package/lib/components/grids/TMBlogHeader.js +41 -0
  90. package/lib/components/grids/{TMBlogs.d.ts → TMBlogsPost.d.ts} +42 -58
  91. package/lib/components/grids/TMBlogsPost.js +628 -0
  92. package/lib/components/grids/{TMBlogsUtils.d.ts → TMBlogsPostUtils.d.ts} +61 -47
  93. package/lib/components/grids/{TMBlogsUtils.js → TMBlogsPostUtils.js} +146 -124
  94. package/lib/components/index.d.ts +14 -1
  95. package/lib/components/index.js +15 -1
  96. package/lib/components/layout/panelManager/TMPanelManagerContext.js +7 -0
  97. package/lib/components/settings/SettingsAppearance.js +9 -1
  98. package/lib/components/viewers/TMTidViewer.js +20 -2
  99. package/lib/css/tm-sdkui.css +1 -1
  100. package/lib/helper/SDKUI_Globals.d.ts +4 -1
  101. package/lib/helper/SDKUI_Globals.js +10 -1
  102. package/lib/helper/SDKUI_Localizator.d.ts +87 -4
  103. package/lib/helper/SDKUI_Localizator.js +868 -25
  104. package/lib/helper/TMCustomSearchBar.d.ts +8 -0
  105. package/lib/helper/TMCustomSearchBar.js +54 -0
  106. package/lib/helper/TMIcons.d.ts +3 -0
  107. package/lib/helper/TMIcons.js +9 -0
  108. package/lib/helper/TMImageLibrary.d.ts +3 -2
  109. package/lib/helper/TMImageLibrary.js +230 -230
  110. package/lib/helper/TMToppyMessage.d.ts +7 -0
  111. package/lib/helper/TMToppyMessage.js +42 -0
  112. package/lib/helper/TMUtils.d.ts +10 -1
  113. package/lib/helper/TMUtils.js +42 -1
  114. package/lib/helper/dcmtsHelper.d.ts +2 -0
  115. package/lib/helper/dcmtsHelper.js +18 -0
  116. package/lib/helper/helpers.js +1 -0
  117. package/lib/helper/index.d.ts +1 -0
  118. package/lib/helper/index.js +1 -0
  119. package/lib/hooks/useRelatedDocuments.d.ts +72 -0
  120. package/lib/hooks/useRelatedDocuments.js +655 -0
  121. package/lib/index.d.ts +1 -0
  122. package/lib/index.js +1 -0
  123. package/lib/ts/types.d.ts +14 -0
  124. package/lib/ts/types.js +15 -0
  125. package/lib/utils/theme.d.ts +1 -0
  126. package/lib/utils/theme.js +1 -0
  127. package/package.json +7 -7
  128. package/lib/components/grids/TMBlogs.js +0 -721
  129. package/lib/stories/TMButton.stories.d.ts +0 -4
  130. package/lib/stories/TMButton.stories.js +0 -29
  131. package/lib/stories/TMDataGrid.stories.d.ts +0 -9
  132. package/lib/stories/TMDataGrid.stories.js +0 -310
  133. package/lib/stories/TMHtmlContentDisplay.stories.d.ts +0 -6
  134. package/lib/stories/TMHtmlContentDisplay.stories.js +0 -45
  135. package/lib/stories/TMHtmlEditor.stories.d.ts +0 -6
  136. package/lib/stories/TMHtmlEditor.stories.js +0 -49
  137. package/lib/stories/TMIcons.stories.d.ts +0 -4
  138. package/lib/stories/TMIcons.stories.js +0 -13
  139. package/lib/stories/TMSDKUI_Localizator.stories.d.ts +0 -4
  140. package/lib/stories/TMSDKUI_Localizator.stories.js +0 -123
  141. package/lib/stories/TMStoriesUtils.d.ts +0 -1
  142. package/lib/stories/TMStoriesUtils.js +0 -10
  143. package/lib/stories/TMUserAvatar.stories.d.ts +0 -6
  144. package/lib/stories/TMUserAvatar.stories.js +0 -20
@@ -0,0 +1,30 @@
1
+ import type { TMContextMenuItemProps } from '../ContextMenu';
2
+ export interface TMFloatingMenuItem {
3
+ id: string;
4
+ name: string;
5
+ icon: React.ReactNode;
6
+ onClick: () => void;
7
+ disabled?: boolean;
8
+ isPinned?: boolean;
9
+ originalMenuItem?: TMContextMenuItemProps;
10
+ }
11
+ export interface TMFloatingMenuBarProps {
12
+ containerRef: React.RefObject<HTMLElement | null>;
13
+ contextMenuItems?: TMContextMenuItemProps[];
14
+ storageKey?: string;
15
+ isConstrained?: boolean;
16
+ defaultPosition?: Position;
17
+ maxItems?: number;
18
+ }
19
+ export interface Position {
20
+ x: number;
21
+ y: number;
22
+ }
23
+ export interface TMFloatingMenuBarState {
24
+ position: Position;
25
+ isDragging: boolean;
26
+ isConfigMode: boolean;
27
+ orientation: 'horizontal' | 'vertical';
28
+ items: TMFloatingMenuItem[];
29
+ draggedItemIndex: number | null;
30
+ }
@@ -0,0 +1,4 @@
1
+ import React from 'react';
2
+ import type { NotificationProps } from './types';
3
+ declare const Notification: React.FC<NotificationProps>;
4
+ export default Notification;
@@ -0,0 +1,60 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useState, useEffect, useRef } from 'react';
3
+ import * as S from './styles';
4
+ const Notification = ({ title, message, mode = 'info', position = 'top-right', duration = 3000, closable = false, stopOnMouseEnter = true, hasProgress = true, onClose, }) => {
5
+ const [state, setState] = useState({
6
+ visible: true,
7
+ isPaused: false,
8
+ progress: 100,
9
+ });
10
+ const timeoutRef = useRef(undefined);
11
+ const remainingTimeRef = useRef(duration);
12
+ const pauseTimeRef = useRef(0);
13
+ const closeNotification = () => {
14
+ setState(prev => ({ ...prev, visible: false }));
15
+ setTimeout(() => {
16
+ onClose?.();
17
+ }, 300);
18
+ };
19
+ useEffect(() => {
20
+ // Set up auto-close timer
21
+ timeoutRef.current = setTimeout(() => {
22
+ closeNotification();
23
+ }, duration);
24
+ return () => {
25
+ if (timeoutRef.current) {
26
+ clearTimeout(timeoutRef.current);
27
+ }
28
+ };
29
+ }, [duration]);
30
+ const handleMouseEnter = () => {
31
+ if (!stopOnMouseEnter)
32
+ return;
33
+ // Pause the timer
34
+ if (timeoutRef.current) {
35
+ clearTimeout(timeoutRef.current);
36
+ pauseTimeRef.current = Date.now();
37
+ }
38
+ setState(prev => ({ ...prev, isPaused: true }));
39
+ };
40
+ const handleMouseLeave = () => {
41
+ if (!stopOnMouseEnter)
42
+ return;
43
+ // Resume the timer with remaining time
44
+ const pauseDuration = Date.now() - pauseTimeRef.current;
45
+ remainingTimeRef.current = Math.max(0, remainingTimeRef.current - pauseDuration);
46
+ timeoutRef.current = setTimeout(() => {
47
+ closeNotification();
48
+ }, remainingTimeRef.current);
49
+ setState(prev => ({ ...prev, isPaused: false }));
50
+ };
51
+ const handleClose = (e) => {
52
+ e.stopPropagation();
53
+ if (timeoutRef.current) {
54
+ clearTimeout(timeoutRef.current);
55
+ }
56
+ closeNotification();
57
+ };
58
+ return (_jsxs(S.NotificationContainer, { "$position": position, "$mode": mode, "$visible": state.visible, onMouseEnter: handleMouseEnter, onMouseLeave: handleMouseLeave, role: "alert", "aria-live": "assertive", children: [_jsxs(S.NotificationContent, { children: [_jsx(S.NotificationTitle, { children: title }), _jsx(S.NotificationMessage, { children: message })] }), closable && (_jsx(S.CloseButton, { onClick: handleClose, "aria-label": "Close notification", children: "\u00D7" })), hasProgress && (_jsx(S.ProgressBar, { "$duration": duration, "$mode": mode, "$isPaused": state.isPaused }))] }));
59
+ };
60
+ export default Notification;
@@ -0,0 +1,8 @@
1
+ import React from 'react';
2
+ import type { NotificationPosition } from './types';
3
+ interface NotificationContainerProps {
4
+ position: NotificationPosition;
5
+ children: React.ReactNode;
6
+ }
7
+ declare const NotificationContainer: React.FC<NotificationContainerProps>;
8
+ export default NotificationContainer;
@@ -0,0 +1,33 @@
1
+ import { jsx as _jsx } from "react/jsx-runtime";
2
+ import styled from 'styled-components';
3
+ const Container = styled.div `
4
+ position: fixed;
5
+ z-index: 10002;
6
+ display: flex;
7
+ flex-direction: column;
8
+ gap: 12px;
9
+ pointer-events: none;
10
+
11
+ ${props => {
12
+ const isTop = props.$position.startsWith('top');
13
+ const isBottom = props.$position.startsWith('bottom');
14
+ const isLeft = props.$position.endsWith('left');
15
+ const isRight = props.$position.endsWith('right');
16
+ const isCenter = props.$position.endsWith('center');
17
+ return `
18
+ ${isTop ? 'top: 24px;' : ''}
19
+ ${isBottom ? 'bottom: 24px;' : ''}
20
+ ${isLeft ? 'left: 24px;' : ''}
21
+ ${isRight ? 'right: 24px;' : ''}
22
+ ${isCenter ? 'left: 50%; transform: translateX(-50%);' : ''}
23
+ `;
24
+ }}
25
+
26
+ & > * {
27
+ pointer-events: auto;
28
+ }
29
+ `;
30
+ const NotificationContainer = ({ position, children }) => {
31
+ return _jsx(Container, { "$position": position, children: children });
32
+ };
33
+ export default NotificationContainer;
@@ -0,0 +1,2 @@
1
+ export { default } from './Notification';
2
+ export * from './types';
@@ -0,0 +1,2 @@
1
+ export { default } from './Notification';
2
+ export * from './types';
@@ -0,0 +1,21 @@
1
+ import type { NotificationMode, NotificationPosition } from './types';
2
+ export declare const NotificationContainer: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components/dist/types").Substitute<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {
3
+ $position: NotificationPosition;
4
+ $mode: NotificationMode;
5
+ $visible: boolean;
6
+ }>> & string;
7
+ export declare const NotificationContent: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components").FastOmit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, never>> & string;
8
+ export declare const NotificationTitle: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components").FastOmit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, never>> & string;
9
+ export declare const NotificationMessage: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components").FastOmit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, never>> & string;
10
+ export declare const CloseButton: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components").FastOmit<import("react").DetailedHTMLProps<import("react").ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, never>> & string;
11
+ export declare const ProgressBar: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components/dist/types").Substitute<import("styled-components/dist/types").Substitute<import("styled-components/dist/types").Substitute<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, Omit<import("react").DetailedHTMLProps<import("react").HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "ref"> & {
12
+ ref?: ((instance: HTMLDivElement | null) => void | import("react").DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES[keyof import("react").DO_NOT_USE_OR_YOU_WILL_BE_FIRED_CALLBACK_REF_RETURN_VALUES]) | import("react").RefObject<HTMLDivElement> | null | undefined;
13
+ }>, {
14
+ $duration: number;
15
+ $mode: NotificationMode;
16
+ $isPaused: boolean;
17
+ }>, {
18
+ $duration: number;
19
+ $mode: NotificationMode;
20
+ $isPaused: boolean;
21
+ }>> & string;
@@ -0,0 +1,180 @@
1
+ import styled, { keyframes } from 'styled-components';
2
+ const slideInFromTop = keyframes `
3
+ from {
4
+ opacity: 0;
5
+ transform: translateY(-100%);
6
+ }
7
+ to {
8
+ opacity: 1;
9
+ transform: translateY(0);
10
+ }
11
+ `;
12
+ const slideInFromBottom = keyframes `
13
+ from {
14
+ opacity: 0;
15
+ transform: translateY(100%);
16
+ }
17
+ to {
18
+ opacity: 1;
19
+ transform: translateY(0);
20
+ }
21
+ `;
22
+ const slideOut = keyframes `
23
+ from {
24
+ opacity: 1;
25
+ transform: scale(1);
26
+ }
27
+ to {
28
+ opacity: 0;
29
+ transform: scale(0.9);
30
+ }
31
+ `;
32
+ const getModeColors = (mode) => {
33
+ const colors = {
34
+ success: {
35
+ bg: '#10b981',
36
+ bgDark: '#059669',
37
+ border: '#34d399',
38
+ text: '#ffffff',
39
+ },
40
+ error: {
41
+ bg: '#ef4444',
42
+ bgDark: '#dc2626',
43
+ border: '#f87171',
44
+ text: '#ffffff',
45
+ },
46
+ warning: {
47
+ bg: '#f59e0b',
48
+ bgDark: '#d97706',
49
+ border: '#fbbf24',
50
+ text: '#ffffff',
51
+ },
52
+ info: {
53
+ bg: '#3b82f6',
54
+ bgDark: '#2563eb',
55
+ border: '#60a5fa',
56
+ text: '#ffffff',
57
+ },
58
+ };
59
+ return colors[mode];
60
+ };
61
+ export const NotificationContainer = styled.div `
62
+ position: relative;
63
+ z-index: 1;
64
+ min-width: 320px;
65
+ max-width: 420px;
66
+ background: ${props => getModeColors(props.$mode).bg};
67
+ border-radius: 12px;
68
+ box-shadow: 0 12px 40px rgba(0, 0, 0, 0.2),
69
+ 0 4px 12px rgba(0, 0, 0, 0.15);
70
+ padding: 16px 20px;
71
+ animation: ${props => {
72
+ if (!props.$visible)
73
+ return slideOut;
74
+ return props.$position.startsWith('top') ? slideInFromTop : slideInFromBottom;
75
+ }} 0.3s cubic-bezier(0.4, 0, 0.2, 1) forwards;
76
+ backdrop-filter: blur(10px);
77
+ border: 2px solid ${props => getModeColors(props.$mode).border};
78
+ color: ${props => getModeColors(props.$mode).text};
79
+ overflow: hidden;
80
+
81
+ [data-theme='dark'] & {
82
+ background: ${props => getModeColors(props.$mode).bgDark};
83
+ box-shadow: 0 12px 40px rgba(0, 0, 0, 0.4),
84
+ 0 4px 12px rgba(0, 0, 0, 0.3);
85
+ }
86
+
87
+ @media (max-width: 768px) {
88
+ min-width: 280px;
89
+ max-width: calc(100vw - 48px);
90
+ }
91
+ `;
92
+ export const NotificationContent = styled.div `
93
+ display: flex;
94
+ flex-direction: column;
95
+ gap: 6px;
96
+ padding-right: 24px;
97
+ `;
98
+ export const NotificationTitle = styled.div `
99
+ font-size: 16px;
100
+ font-weight: 600;
101
+ line-height: 1.4;
102
+ letter-spacing: -0.01em;
103
+ `;
104
+ export const NotificationMessage = styled.div `
105
+ font-size: 14px;
106
+ font-weight: 400;
107
+ line-height: 1.5;
108
+ opacity: 0.95;
109
+ `;
110
+ export const CloseButton = styled.button `
111
+ position: absolute;
112
+ top: 12px;
113
+ right: 12px;
114
+ background: transparent;
115
+ border: none;
116
+ color: inherit;
117
+ cursor: pointer;
118
+ width: 24px;
119
+ height: 24px;
120
+ display: flex;
121
+ align-items: center;
122
+ justify-content: center;
123
+ border-radius: 6px;
124
+ transition: all 0.15s ease;
125
+ font-size: 18px;
126
+ line-height: 1;
127
+ padding: 0;
128
+ opacity: 0.8;
129
+
130
+ &:hover {
131
+ opacity: 1;
132
+ background: rgba(255, 255, 255, 0.2);
133
+ transform: scale(1.1);
134
+ }
135
+
136
+ &:active {
137
+ transform: scale(0.95);
138
+ }
139
+
140
+ &:focus {
141
+ outline: 2px solid rgba(255, 255, 255, 0.5);
142
+ outline-offset: 2px;
143
+ }
144
+ `;
145
+ export const ProgressBar = styled.div.attrs(props => ({
146
+ style: {
147
+ animationDuration: `${props.$duration}ms`,
148
+ },
149
+ })) `
150
+ position: absolute;
151
+ bottom: 0;
152
+ left: 0;
153
+ height: 4px;
154
+ width: 100%;
155
+ background: ${props => getModeColors(props.$mode).border};
156
+ border-radius: 0 0 0 10px;
157
+ box-shadow: 0 0 8px ${props => getModeColors(props.$mode).border};
158
+ transform-origin: left;
159
+ animation: progress-shrink linear forwards;
160
+ animation-play-state: ${props => props.$isPaused ? 'paused' : 'running'};
161
+
162
+ @keyframes progress-shrink {
163
+ from {
164
+ transform: scaleX(1);
165
+ }
166
+ to {
167
+ transform: scaleX(0);
168
+ }
169
+ }
170
+
171
+ &::after {
172
+ content: '';
173
+ position: absolute;
174
+ top: 0;
175
+ right: 0;
176
+ width: 20px;
177
+ height: 100%;
178
+ background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.4));
179
+ }
180
+ `;
@@ -0,0 +1,18 @@
1
+ export type NotificationMode = 'warning' | 'info' | 'error' | 'success';
2
+ export type NotificationPosition = 'top-left' | 'top-center' | 'top-right' | 'bottom-left' | 'bottom-center' | 'bottom-right';
3
+ export interface NotificationProps {
4
+ title: string;
5
+ message: string;
6
+ mode?: NotificationMode;
7
+ position?: NotificationPosition;
8
+ duration?: number;
9
+ closable?: boolean;
10
+ stopOnMouseEnter?: boolean;
11
+ hasProgress?: boolean;
12
+ onClose?: () => void;
13
+ }
14
+ export interface NotificationState {
15
+ visible: boolean;
16
+ isPaused: boolean;
17
+ progress: number;
18
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -7,6 +7,7 @@ export declare const StyledMultiViewPanel: import("styled-components/dist/types"
7
7
  }>> & string;
8
8
  export declare const StyledParagraph: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components").FastOmit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLParagraphElement>, HTMLParagraphElement>, never>> & string;
9
9
  export declare const StyledToolbarForm: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components").FastOmit<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, never>> & string;
10
+ export declare const StyledReferenceButton: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components").FastOmit<React.DetailedHTMLProps<React.ButtonHTMLAttributes<HTMLButtonElement>, HTMLButtonElement>, never>> & string;
10
11
  export declare const StyledPanelPage: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components/dist/types").Substitute<React.DetailedHTMLProps<React.HTMLAttributes<HTMLDivElement>, HTMLDivElement>, {
11
12
  $isOpen?: boolean;
12
13
  $padding?: string;
@@ -36,6 +36,46 @@ export const StyledToolbarForm = styled.div `
36
36
  gap: 2px;
37
37
  background-color: ${TMColors.toolbar_background};
38
38
  `;
39
+ export const StyledReferenceButton = styled.button `
40
+ display: flex;
41
+ flex-direction: column;
42
+ align-items: center;
43
+ justify-content: center;
44
+ padding: 10px 16px;
45
+ border-radius: 20px;
46
+ border: none;
47
+ background-color: ${TMColors.button_floating_background};
48
+ color: white;
49
+ font-size: 0.9rem;
50
+ font-weight: 500;
51
+ cursor: pointer;
52
+ transition: all 0.2s ease;
53
+ text-align: center;
54
+ max-width: 200px;
55
+ gap: 2px;
56
+
57
+ &:hover {
58
+ opacity: 0.9;
59
+ transform: translateY(-1px);
60
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
61
+ }
62
+
63
+ &:active {
64
+ transform: translateY(0);
65
+ }
66
+
67
+ &:disabled {
68
+ opacity: 0.5;
69
+ cursor: not-allowed;
70
+ }
71
+
72
+ span {
73
+ width: 100%;
74
+ white-space: nowrap;
75
+ overflow: hidden;
76
+ text-overflow: ellipsis;
77
+ }
78
+ `;
39
79
  export const StyledPanelPage = styled.div `
40
80
  position: absolute;
41
81
  width: calc(100% - 50px);
@@ -0,0 +1,11 @@
1
+ import { LayoutCustomButtonDescriptor } from '@topconsultnpm/sdk-ts';
2
+ import { MetadataValueDescriptorEx } from '../..';
3
+ type TMCustomButtonProps = {
4
+ button: LayoutCustomButtonDescriptor;
5
+ isModal?: boolean;
6
+ formData?: MetadataValueDescriptorEx[];
7
+ selectedItems?: Array<any>;
8
+ onClose?: () => void;
9
+ };
10
+ declare const TMCustomButton: (props: TMCustomButtonProps) => import("react/jsx-runtime").JSX.Element | null;
11
+ export default TMCustomButton;
@@ -0,0 +1,63 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { SDK_Globals } from '@topconsultnpm/sdk-ts';
3
+ import { useEffect, useRef, useState } from 'react';
4
+ import TMModal from './TMModal';
5
+ import styled from 'styled-components';
6
+ import { processButtonAttributes } from '../../helper/dcmtsHelper';
7
+ const IframeContainer = styled.div `
8
+ display: flex;
9
+ height: 100%;
10
+ flex-direction: column;
11
+ `;
12
+ const StyledIframe = styled.iframe `
13
+ border: none;
14
+ flex: 1;
15
+ `;
16
+ const TMCustomButton = (props) => {
17
+ const { button, isModal = true, formData, selectedItems, onClose } = props;
18
+ const { appName: scriptUrl, arguments: args } = button;
19
+ const iframeRef = useRef(null);
20
+ const attributes = processButtonAttributes(args, formData);
21
+ const [loading, setLoading] = useState(true);
22
+ const [error, setError] = useState(false);
23
+ const getTargetOrigin = (url) => {
24
+ if (!url)
25
+ return '*';
26
+ try {
27
+ const urlObj = new URL(url);
28
+ return urlObj.origin;
29
+ }
30
+ catch {
31
+ return '*';
32
+ }
33
+ };
34
+ useEffect(() => {
35
+ if (iframeRef.current?.contentWindow) {
36
+ const mergedAttributes = { ...attributes, selectedItems: selectedItems };
37
+ iframeRef.current.contentWindow.postMessage({
38
+ "options": mergedAttributes,
39
+ "selectedItems": selectedItems,
40
+ "session": SDK_Globals.tmSession
41
+ }, getTargetOrigin(scriptUrl));
42
+ }
43
+ clearTimeout(timeoutIframe);
44
+ }, [loading, error, scriptUrl, attributes]);
45
+ const handleLoad = () => setLoading(false);
46
+ const handleError = () => {
47
+ setLoading(false);
48
+ setError(true);
49
+ };
50
+ // Timeout di sicurezza nel caso l'evento 'error' non venga chiamato
51
+ const timeoutIframe = setTimeout(() => {
52
+ if (loading)
53
+ handleError();
54
+ }, 5000); // 5 secondi
55
+ useEffect(() => {
56
+ if (!isModal && scriptUrl) {
57
+ window.open(scriptUrl, '_blank');
58
+ onClose?.();
59
+ }
60
+ }, [isModal, scriptUrl, onClose]);
61
+ return isModal ? (_jsx(TMModal, { title: button.title, width: '60%', height: '60%', resizable: true, onClose: onClose, children: _jsxs(IframeContainer, { children: [error && _jsx("div", { children: "Si \u00E8 verificato un errore nel caricamento del contenuto." }), !error && _jsx(StyledIframe, { ref: iframeRef, loading: 'lazy', onLoad: handleLoad, onError: handleError, src: scriptUrl })] }) })) : null;
62
+ };
63
+ export default TMCustomButton;
@@ -50,7 +50,8 @@ const TMFileManagerDataGridView = (props) => {
50
50
  }
51
51
  };
52
52
  const cellDefaultRender = useCallback((cellData) => {
53
- return renderHighlightedText(cellData.value.toString(), searchText, false);
53
+ const value = cellData.value ?? '';
54
+ return renderHighlightedText(value.toString(), searchText, false);
54
55
  }, [searchText]);
55
56
  const cellNameRender = useCallback((cellData) => {
56
57
  const { checkoutDate, checkOutUserID, checkOutUserName, version, ext, creationTime, lastUpdateTime } = cellData.data;
@@ -66,6 +67,8 @@ const TMFileManagerDataGridView = (props) => {
66
67
  return _jsx("div", { style: { display: 'flex', justifyContent: 'center', alignItems: 'center' }, children: _jsx(TMDcmtIcon, { tid: item.tid, did: item.did, fileExtension: item.ext, downloadMode: 'openInNewWindow', tooltipContent: tooltipContent }) });
67
68
  }, []);
68
69
  const cellDatetimeRender = useCallback((cellData) => {
70
+ if (!cellData.value)
71
+ return '-';
69
72
  return renderHighlightedText(Globalization.getDateTimeDisplayValue(cellData.value).toString(), searchText, false);
70
73
  }, [searchText]);
71
74
  const cellSizeRender = useCallback((cellData) => {
@@ -48,7 +48,8 @@ export interface ITMLayoutContainerProps {
48
48
  alignItems?: string;
49
49
  direction?: 'vertical' | 'horizontal';
50
50
  onClick?: () => void;
51
+ onContextMenu?: (e: React.MouseEvent) => void;
51
52
  }
52
- declare const TMLayoutContainer: ({ gap, onClick, justifyContent, alignItems, children, direction }: ITMLayoutContainerProps) => import("react/jsx-runtime").JSX.Element;
53
+ declare const TMLayoutContainer: ({ gap, onClick, justifyContent, alignItems, children, direction, onContextMenu }: ITMLayoutContainerProps) => import("react/jsx-runtime").JSX.Element;
53
54
  export { TMCard, TMLayoutItem, TMSplitterLayout };
54
55
  export default TMLayoutContainer;
@@ -193,9 +193,9 @@ const TMSplitterLayout = ({ animation = false, showSeparator = true, separatorCo
193
193
  const TMLayoutItem = ({ onClick, children, width = '100%', minWidth, maxWidth, maxHeight, height = '100%', minHeight }) => {
194
194
  return (_jsx(StyledLayoutItem, { onClick: onClick, "$height": height, "$maxHeight": maxHeight, "$minHeight": minHeight, "$width": width, "$minWidth": minWidth, "$maxWidth": maxWidth, children: children }));
195
195
  };
196
- const TMLayoutContainer = ({ gap = 3, onClick, justifyContent = 'flex-start', alignItems = 'flex-start', children, direction = 'vertical' }) => {
196
+ const TMLayoutContainer = ({ gap = 3, onClick, justifyContent = 'flex-start', alignItems = 'flex-start', children, direction = 'vertical', onContextMenu }) => {
197
197
  const renderedEls = () => { return (React.Children.map(children, child => (child))); };
198
- return (_jsxs(StyledLayoutContainer, { "$alignItems": alignItems, "$justifyContent": justifyContent, onClick: onClick, "$direction": direction, style: { gap: gap }, children: [" ", renderedEls(), " "] }));
198
+ return (_jsxs(StyledLayoutContainer, { "$alignItems": alignItems, "$justifyContent": justifyContent, onClick: onClick, onContextMenu: onContextMenu, "$direction": direction, style: { gap: gap }, children: [" ", renderedEls(), " "] }));
199
199
  };
200
200
  export { TMCard, TMLayoutItem, TMSplitterLayout };
201
201
  export default TMLayoutContainer;
@@ -152,24 +152,11 @@ const ResponsiveMessageText = styled.div `
152
152
  line-height: 1.1;
153
153
  }
154
154
  `;
155
- const ResponsiveButton = styled(TMButton) `
156
- font-size: ${props => props.fontSize || 'clamp(12px, 2vw, 1.1rem)'} !important;
157
- padding: clamp(2px, 1vw, 8px) clamp(4px, 2vw, 12px) !important;
158
- min-width: clamp(30px, 10vw, 60px) !important;
159
- white-space: nowrap !important;
160
-
161
- @media (max-width: 200px) {
162
- padding: 2px 4px !important;
163
- min-width: 25px !important;
164
- font-size: 8px !important;
165
- }
166
-
167
- @media (max-width: 150px) {
168
- padding: 1px 3px !important;
169
- min-width: 20px !important;
170
- font-size: 7px !important;
171
- }
172
- `;
155
+ // ResponsiveButton wrapper component to avoid circular dependency
156
+ const ResponsiveButton = (props) => {
157
+ const { fontSize: customFontSize, ...otherProps } = props;
158
+ return _jsx(TMButton, { fontSize: customFontSize || 'clamp(12px, 2vw, 1.1rem)', padding: "clamp(2px, 1vw, 8px) clamp(4px, 2vw, 12px)", width: "clamp(30px, 10vw, 60px)", ...otherProps });
159
+ };
173
160
  const ResponsiveMessageBody = ({ message, isMobile, MessageToolbar, showToppy }) => {
174
161
  return (_jsxs(ResponsiveMessageContainer, { children: [_jsxs(ResponsiveMessageContent, { "$isMobile": isMobile, children: [showToppy && _jsx(ResponsiveToppyImage, { "$isMobile": isMobile, src: toppy, alt: "Toppy" }), _jsx(ResponsiveMessageText, { "$isMobile": isMobile, children: typeof message === 'string' ? _jsx(Message, { msg: message }) : message })] }), _jsx(MessageToolbar, {})] }));
175
162
  };
@@ -332,15 +332,16 @@ const TMTreeView = ({ dataSource = [], focusedItem, selectedItems = [], allowMul
332
332
  if (input) {
333
333
  input.indeterminate = isIndeterminate(node);
334
334
  }
335
- } })), _jsx("div", { style: { display: 'flex', alignItems: 'center', flex: 1, minHeight: 0 }, onClick: (e) => { handleNodeClick(node, e); }, children: itemRender(node) })] }), node.expanded && node.items && (_jsxs("div", { style: { paddingLeft: 20, width: '100%' }, children: [renderTree(getVisibleItems(node)), needsLoadMoreButton(node) && (_jsx("div", { style: { display: 'flex', justifyContent: 'center', margin: '5px 0' }, children: _jsx(TMButton, { onClick: () => handleLoadMoreItems(node.key), showTooltip: false, caption: `Carica altri ${itemsPerPage}... (${node.visibleItemsCount ?? itemsPerPage} / ${node.items?.length ?? 0})` }) }))] }))] }, node.key)));
335
+ } })), _jsx("div", { style: { display: 'flex', alignItems: 'center', flex: 1, minWidth: 0 }, onClick: (e) => { handleNodeClick(node, e); }, children: itemRender(node) })] }), node.expanded && node.items && (_jsxs("div", { style: { paddingLeft: 20, width: '100%' }, children: [renderTree(getVisibleItems(node)), needsLoadMoreButton(node) && (_jsx("div", { style: { display: 'flex', justifyContent: 'center', margin: '5px 0' }, children: _jsx(TMButton, { onClick: () => handleLoadMoreItems(node.key), showTooltip: false, caption: `Carica altri ${itemsPerPage}... (${node.visibleItemsCount ?? itemsPerPage} / ${node.items?.length ?? 0})` }) }))] }))] }, node.key)));
336
336
  }, [handleNodeClick, handleNodeToggle, handleCheckboxChange, focusedItem, selectedItems, allowMultipleSelection, getVisibleItems, needsLoadMoreButton, handleLoadMoreItems, itemsPerPage]);
337
- return (_jsx("div", { style: { height: '100%', width: '100%', overflowY: 'auto', padding: '0px 5px 2px 2px' }, children: renderTree(dataSource) }));
337
+ return (_jsx("div", { style: { height: '100%', width: '100%', overflowY: 'auto', overflowX: 'hidden', padding: '0px 5px 2px 2px' }, children: renderTree(dataSource) }));
338
338
  };
339
339
  export default TMTreeView;
340
340
  export const StyledTreeNode = styled.div `
341
341
  display: flex;
342
342
  flex-direction: row;
343
343
  width: 100%;
344
+ min-width: 0;
344
345
  min-height: 22px;
345
346
  max-height: 30px;
346
347
  gap: 5px;
@@ -1,4 +1,5 @@
1
1
  import { ValidationItem } from '@topconsultnpm/sdk-ts';
2
+ export declare const sanitizeAndFormatComment: (raw?: string) => string;
2
3
  export interface ITMHtmlEditor {
3
4
  /** Width of the editor (e.g., '100%', '500px') */
4
5
  width?: string;
@@ -28,6 +29,10 @@ export interface ITMHtmlEditor {
28
29
  toolbarMode?: 'compact' | 'expanded';
29
30
  /** If true, the editor will be focused on mount */
30
31
  autoFocus?: boolean;
32
+ /** Maximum number of characters allowed in the editor */
33
+ maxLength?: number;
34
+ /** If true, displays a character count below the editor */
35
+ showCount?: boolean;
31
36
  }
32
37
  declare const TMHtmlEditor: (props: ITMHtmlEditor) => import("react/jsx-runtime").JSX.Element;
33
38
  export default TMHtmlEditor;