@topconsultnpm/sdkui-react 6.22.0-dev4.3 → 6.22.0-dev4.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/components/base/TMDataGrid.js +13 -1
- package/lib/components/features/assistant/TMHelpOnLineChat.d.ts +0 -1
- package/lib/components/features/assistant/TMHelpOnLineChat.js +8 -161
- package/lib/components/features/search/TMSearchResult.js +78 -78
- package/package.json +1 -1
- package/lib/components/features/assistant/dataset/Designer-Suggested-Questions.json +0 -102
- package/lib/components/features/assistant/dataset/Login-Suggested-Questions.json +0 -32
- package/lib/components/features/assistant/dataset/Surfer-Suggested-Questions.json +0 -102
|
@@ -331,7 +331,8 @@ const TMDataGrid = React.forwardRef((props, ref) => {
|
|
|
331
331
|
if (!internalRef.current)
|
|
332
332
|
return;
|
|
333
333
|
// Update state with the current number of visible rows in the DataGrid
|
|
334
|
-
|
|
334
|
+
const grid = internalRef.current.instance();
|
|
335
|
+
setVisibleItemsCount(grid ? getVisibleItemsCount(grid) : 0);
|
|
335
336
|
// Focusing SearchPanel on content ready - solo se non è già stato fatto
|
|
336
337
|
if (showSearchPanel && searchPanelFocusTrigger && searchPanelFocusTrigger > 0 && !searchPanelFocusedRef.current) {
|
|
337
338
|
// Use a small delay to ensure the DOM is fully rendered before trying to focus
|
|
@@ -667,3 +668,14 @@ const getRecordCount = (dataSource) => {
|
|
|
667
668
|
}
|
|
668
669
|
return 0; // Default case when neither condition is met
|
|
669
670
|
};
|
|
671
|
+
/* Righe della pagina corrente: una per gruppo più le sue righe dati, che non contano se il gruppo è chiuso.
|
|
672
|
+
Stesso criterio di DevExtreme: un gruppo ha la proprietà items, valorizzata a null quando è chiuso. */
|
|
673
|
+
const countPageRows = (items) => items.reduce((count, item) => count + (item.items === undefined ? 1 : 1 + countPageRows(item.items ?? [])), 0);
|
|
674
|
+
/* Con il rendering virtuale getVisibleRows restituisce solo le righe disegnate a video, non tutte quelle della pagina:
|
|
675
|
+
in quel caso le righe si contano dagli elementi caricati per la pagina corrente. */
|
|
676
|
+
const getVisibleItemsCount = (grid) => {
|
|
677
|
+
if (grid.option('scrolling.rowRenderingMode') === 'virtual') {
|
|
678
|
+
return countPageRows(grid.getDataSource()?.items() ?? []);
|
|
679
|
+
}
|
|
680
|
+
return grid.getVisibleRows()?.length ?? 0;
|
|
681
|
+
};
|
|
@@ -18,7 +18,6 @@ export interface ITMHelpOnLineChatProps {
|
|
|
18
18
|
onAddMessage: (message: HolChatMessage) => void;
|
|
19
19
|
onSetThinking: (isThinking: boolean) => void;
|
|
20
20
|
onSetConversationId: (id: string) => void;
|
|
21
|
-
suggestedQuestions?: string[];
|
|
22
21
|
}
|
|
23
22
|
export interface ITMToppyHeaderButtonProps {
|
|
24
23
|
showChatButton: boolean;
|
|
@@ -2,14 +2,11 @@ import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-run
|
|
|
2
2
|
import { useCallback, useEffect, useRef, useState } from 'react';
|
|
3
3
|
import styled, { keyframes } from 'styled-components';
|
|
4
4
|
import { locale as dxLocale } from 'devextreme/localization';
|
|
5
|
-
import {
|
|
5
|
+
import { CultureIDs, HolAskDescriptor, SDK_Globals, TopMediaServer } from '@topconsultnpm/sdk-ts';
|
|
6
6
|
import TMTooltip from '../../base/TMTooltip';
|
|
7
7
|
import { TMColors } from '../../../utils/theme';
|
|
8
8
|
import { SDKUI_Localizator } from '../../../helper';
|
|
9
9
|
import ToppyImage from '../../../assets/Toppy-help-center.png';
|
|
10
|
-
import LoginSuggestedQuestions from './dataset/Login-Suggested-Questions.json';
|
|
11
|
-
import SurferSuggestedQuestions from './dataset/Surfer-Suggested-Questions.json';
|
|
12
|
-
import DesignerSuggestedQuestions from './dataset/Designer-Suggested-Questions.json';
|
|
13
10
|
const generateGUID = () => {
|
|
14
11
|
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replaceAll(/[xy]/g, (c) => {
|
|
15
12
|
const r = Math.trunc(Math.random() * 16);
|
|
@@ -20,7 +17,6 @@ const generateGUID = () => {
|
|
|
20
17
|
const PANEL_DEFAULT_WIDTH = 600;
|
|
21
18
|
const PANEL_MIN_WIDTH = 340;
|
|
22
19
|
const PANEL_MAX_WIDTH = 900;
|
|
23
|
-
const SUGGESTIONS_COUNT = 4;
|
|
24
20
|
const FEEDBACK_MAX_LENGTH = 200;
|
|
25
21
|
const NO_ANSWER_TEXT = 'Nessuna risposta ricevuta.';
|
|
26
22
|
const ERROR_TEXT = 'Si è verificato un errore, riprova più tardi.';
|
|
@@ -53,23 +49,6 @@ const copyToClipboard = async (text) => {
|
|
|
53
49
|
return false;
|
|
54
50
|
}
|
|
55
51
|
};
|
|
56
|
-
const getDefaultSuggestedQuestions = (isLogged) => {
|
|
57
|
-
if (!isLogged)
|
|
58
|
-
return LoginSuggestedQuestions;
|
|
59
|
-
switch (SDK_Globals.appModule) {
|
|
60
|
-
case AppModules.SURFER: return SurferSuggestedQuestions;
|
|
61
|
-
case AppModules.DESIGNER: return DesignerSuggestedQuestions;
|
|
62
|
-
default: return [];
|
|
63
|
-
}
|
|
64
|
-
};
|
|
65
|
-
const pickRandom = (items, count) => {
|
|
66
|
-
const pool = [...items];
|
|
67
|
-
for (let i = pool.length - 1; i > 0; i--) {
|
|
68
|
-
const j = Math.floor(Math.random() * (i + 1));
|
|
69
|
-
[pool[i], pool[j]] = [pool[j], pool[i]];
|
|
70
|
-
}
|
|
71
|
-
return pool.slice(0, count);
|
|
72
|
-
};
|
|
73
52
|
const getSafeSession = () => {
|
|
74
53
|
try {
|
|
75
54
|
return SDK_Globals.tmSession;
|
|
@@ -100,15 +79,14 @@ const getPreLoginSession = (endpointUrl) => {
|
|
|
100
79
|
}
|
|
101
80
|
return preLoginSession;
|
|
102
81
|
};
|
|
103
|
-
const TMHelpOnLineChat = ({ isOpen, showChatButton, isLogged, messages, conversationId, isThinking, endpointUrl, onClose, onToggle, onNewConversation, onAddMessage, onSetThinking, onSetConversationId
|
|
82
|
+
const TMHelpOnLineChat = ({ isOpen, showChatButton, isLogged, messages, conversationId, isThinking, endpointUrl, onClose, onToggle, onNewConversation, onAddMessage, onSetThinking, onSetConversationId }) => {
|
|
104
83
|
const [width, setWidth] = useState(PANEL_DEFAULT_WIDTH);
|
|
105
84
|
const showFab = !isLogged && showChatButton && !isOpen;
|
|
106
|
-
const questions = suggestedQuestions ?? getDefaultSuggestedQuestions(isLogged);
|
|
107
85
|
const [submittedRatings, setSubmittedRatings] = useState({});
|
|
108
86
|
const onFeedbackSubmitted = useCallback((messageId, rating) => {
|
|
109
87
|
setSubmittedRatings(prev => ({ ...prev, [messageId]: rating }));
|
|
110
88
|
}, []);
|
|
111
|
-
return (_jsxs(_Fragment, { children: [isOpen && (_jsxs(_Fragment, { children: [_jsx(Overlay, { onClick: onClose }), _jsx(ChatPanel, { width: width, onWidthChange: setWidth, messages: messages, conversationId: conversationId, isThinking: isThinking, endpointUrl: endpointUrl, onClose: onClose, onNewConversation: onNewConversation, onAddMessage: onAddMessage, onSetThinking: onSetThinking, onSetConversationId: onSetConversationId,
|
|
89
|
+
return (_jsxs(_Fragment, { children: [isOpen && (_jsxs(_Fragment, { children: [_jsx(Overlay, { onClick: onClose }), _jsx(ChatPanel, { width: width, onWidthChange: setWidth, messages: messages, conversationId: conversationId, isThinking: isThinking, endpointUrl: endpointUrl, onClose: onClose, onNewConversation: onNewConversation, onAddMessage: onAddMessage, onSetThinking: onSetThinking, onSetConversationId: onSetConversationId, isLogged: isLogged, submittedRatings: submittedRatings, onFeedbackSubmitted: onFeedbackSubmitted })] })), showFab && (_jsx(Fab, { onClick: onToggle, title: "Chiedi a Toppy", "aria-label": "Chiedi a Toppy", children: _jsx(FabAvatar, { src: ToppyImage, alt: "Toppy" }) }))] }));
|
|
112
90
|
};
|
|
113
91
|
export default TMHelpOnLineChat;
|
|
114
92
|
//#region Header button
|
|
@@ -117,11 +95,8 @@ export const TMToppyHeaderButton = ({ showChatButton, onToggle }) => {
|
|
|
117
95
|
return null;
|
|
118
96
|
return (_jsx(TMTooltip, { content: "Chiedi a Toppy", children: _jsxs(ToppyHeaderButton, { onClick: onToggle, title: "Chiedi a Toppy", children: [_jsx(ToppyHeaderAvatar, { src: ToppyImage, alt: "Toppy" }), _jsx(ToppyHeaderText, { children: "Chiedi a Toppy" })] }) }));
|
|
119
97
|
};
|
|
120
|
-
const ChatPanel = ({ width, onWidthChange, messages, conversationId, isThinking, endpointUrl, onClose, onNewConversation, onAddMessage, onSetThinking, onSetConversationId,
|
|
98
|
+
const ChatPanel = ({ width, onWidthChange, messages, conversationId, isThinking, endpointUrl, onClose, onNewConversation, onAddMessage, onSetThinking, onSetConversationId, isLogged, submittedRatings, onFeedbackSubmitted }) => {
|
|
121
99
|
const [chatInput, setChatInput] = useState('');
|
|
122
|
-
const [suggestions, setSuggestions] = useState(() => pickRandom(suggestedQuestions, SUGGESTIONS_COUNT));
|
|
123
|
-
const [hoveredSuggestion, setHoveredSuggestion] = useState(undefined);
|
|
124
|
-
const prevMessagesCountRef = useRef(messages.length);
|
|
125
100
|
const inputRef = useRef(null);
|
|
126
101
|
const messagesEndRef = useRef(null);
|
|
127
102
|
const onCloseRef = useRef(onClose);
|
|
@@ -133,12 +108,6 @@ const ChatPanel = ({ width, onWidthChange, messages, conversationId, isThinking,
|
|
|
133
108
|
useEffect(() => {
|
|
134
109
|
inputRef.current?.focus();
|
|
135
110
|
}, []);
|
|
136
|
-
useEffect(() => {
|
|
137
|
-
if (messages.length === 0 && prevMessagesCountRef.current > 0) {
|
|
138
|
-
setSuggestions(pickRandom(suggestedQuestions, SUGGESTIONS_COUNT));
|
|
139
|
-
}
|
|
140
|
-
prevMessagesCountRef.current = messages.length;
|
|
141
|
-
}, [messages.length, suggestedQuestions]);
|
|
142
111
|
useEffect(() => {
|
|
143
112
|
const onKeyDown = (e) => {
|
|
144
113
|
if (e.key === 'Escape')
|
|
@@ -167,8 +136,8 @@ const ChatPanel = ({ width, onWidthChange, messages, conversationId, isThinking,
|
|
|
167
136
|
globalThis.addEventListener('mousemove', onMove);
|
|
168
137
|
globalThis.addEventListener('mouseup', onUp);
|
|
169
138
|
}, [width, onWidthChange]);
|
|
170
|
-
const
|
|
171
|
-
const question =
|
|
139
|
+
const askHandler = useCallback(async () => {
|
|
140
|
+
const question = chatInput.trim();
|
|
172
141
|
if (question.length < 2 || isThinking) {
|
|
173
142
|
return;
|
|
174
143
|
}
|
|
@@ -210,12 +179,7 @@ const ChatPanel = ({ width, onWidthChange, messages, conversationId, isThinking,
|
|
|
210
179
|
finally {
|
|
211
180
|
onSetThinking(false);
|
|
212
181
|
}
|
|
213
|
-
}, [conversationId, isThinking, endpointUrl, onAddMessage, onSetThinking, onSetConversationId]);
|
|
214
|
-
const askHandler = useCallback(() => ask(chatInput), [ask, chatInput]);
|
|
215
|
-
const onSuggestionClick = (question) => {
|
|
216
|
-
setHoveredSuggestion(undefined);
|
|
217
|
-
ask(question);
|
|
218
|
-
};
|
|
182
|
+
}, [chatInput, conversationId, isThinking, endpointUrl, onAddMessage, onSetThinking, onSetConversationId]);
|
|
219
183
|
const onFeedbackSubmit = (index, rating, tags, feedback) => {
|
|
220
184
|
const answer = messages[index];
|
|
221
185
|
const question = messages.slice(0, index).reverse().find(m => m.isUser)?.text ?? '';
|
|
@@ -234,8 +198,7 @@ const ChatPanel = ({ width, onWidthChange, messages, conversationId, isThinking,
|
|
|
234
198
|
});
|
|
235
199
|
onFeedbackSubmitted(answer.id, rating);
|
|
236
200
|
};
|
|
237
|
-
|
|
238
|
-
return (_jsxs(PanelContainer, { $width: width, children: [_jsx(ResizeHandle, { onMouseDown: onResizeStart }), _jsxs(ChatHeader, { children: [_jsxs(HeaderLeft, { children: [_jsx(ToppyAvatar, { src: ToppyImage, alt: "Toppy" }), _jsxs(HeaderText, { children: [_jsxs(HeaderGreeting, { children: ["Ciao ", userName] }), _jsx(HeaderQuestion, { children: "Come posso aiutarti?" })] })] }), _jsxs(HeaderRight, { children: [_jsx(TMTooltip, { content: "Nuova conversazione", children: _jsx(HeaderButton, { onClick: onNewConversation, disabled: !conversationId && messages.length === 0, title: "Nuova conversazione", children: _jsx(IconNewChat, { color: "white", fontSize: 18 }) }) }), _jsx(TMTooltip, { content: "Chiudi", children: _jsx(HeaderButton, { onClick: onClose, title: "Chiudi", children: _jsx(IconClose, { fontSize: 18 }) }) })] })] }), _jsxs(ChatBody, { children: [messages.length === 0 ? (_jsxs(WelcomeMessage, { children: [_jsx(WelcomeIcon, { children: "\uD83D\uDCA1" }), _jsxs(WelcomeText, { children: ["Ciao! Sono ", _jsx("strong", { children: "Toppy" }), ", il tuo assistente.", _jsx("br", {}), "Fai una domanda e ti aiuter\u00F2 a trovare la risposta."] })] })) : (messages.map((msg, index) => (_jsxs(MessageBubble, { $isUser: msg.isUser, children: [!msg.isUser && _jsx(BotAvatar, { src: ToppyImage, alt: "Toppy" }), msg.isUser ? (_jsxs(_Fragment, { children: [_jsx(QuestionCopy, { children: _jsx(CopyButton, { text: msg.text }) }), _jsx(MessageContent, { $isUser: true, children: msg.text })] })) : (_jsxs(BotMessageColumn, { children: [_jsx(BotMessageContent, { $isUser: false, children: _jsx(MarkdownContent, { children: renderMarkdown(msg.text) }) }), msg.text !== NO_ANSWER_TEXT && msg.text !== ERROR_TEXT && (_jsx(MessageFeedback, { answer: msg.text, submittedRating: submittedRatings[msg.id], onSubmit: (rating, tags, feedback) => onFeedbackSubmit(index, rating, tags, feedback) }))] }))] }, msg.id)))), isThinking && (_jsxs(MessageBubble, { $isUser: false, children: [_jsx(BotAvatar, { src: ToppyImage, alt: "Toppy" }), _jsx(ThinkingStatus, {}, messages.length)] })), _jsx("div", { ref: messagesEndRef })] }), _jsxs(ChatFooter, { children: [showSuggestions && (_jsxs(SuggestionsSection, { children: [_jsxs(SuggestionsTitle, { children: [_jsx(IconSparkle, { fontSize: 14 }), _jsx("span", { children: "Domande suggerite" })] }), _jsx(SuggestionsGrid, { children: suggestions.map((question, index) => (_jsxs(SuggestionCard, { type: "button", $index: index, title: question, onClick: () => onSuggestionClick(question), onMouseEnter: () => setHoveredSuggestion(question), onMouseLeave: () => setHoveredSuggestion(undefined), onFocus: () => setHoveredSuggestion(question), onBlur: () => setHoveredSuggestion(undefined), children: [_jsx(SuggestionIcon, { children: _jsx(IconQuestion, { fontSize: 16 }) }), _jsx(SuggestionText, { children: question }), _jsx(SuggestionArrow, { children: _jsx(IconArrowForward, { fontSize: 16 }) })] }, question))) })] })), _jsx(TMChatInput, { inputRef: inputRef, value: chatInput, onChange: setChatInput, onSend: askHandler, placeholder: hoveredSuggestion ?? 'Scrivi la tua domanda...', tooltip: "Invia", disabled: isThinking }), _jsx(FooterHint, { children: SDKUI_Localizator.HelpOnLineShiftEnterHint })] })] }));
|
|
201
|
+
return (_jsxs(PanelContainer, { $width: width, children: [_jsx(ResizeHandle, { onMouseDown: onResizeStart }), _jsxs(ChatHeader, { children: [_jsxs(HeaderLeft, { children: [_jsx(ToppyAvatar, { src: ToppyImage, alt: "Toppy" }), _jsxs(HeaderText, { children: [_jsxs(HeaderGreeting, { children: ["Ciao ", userName] }), _jsx(HeaderQuestion, { children: "Come posso aiutarti?" })] })] }), _jsxs(HeaderRight, { children: [_jsx(TMTooltip, { content: "Nuova conversazione", children: _jsx(HeaderButton, { onClick: onNewConversation, disabled: !conversationId && messages.length === 0, title: "Nuova conversazione", children: _jsx(IconNewChat, { color: "white", fontSize: 18 }) }) }), _jsx(TMTooltip, { content: "Chiudi", children: _jsx(HeaderButton, { onClick: onClose, title: "Chiudi", children: _jsx(IconClose, { fontSize: 18 }) }) })] })] }), _jsxs(ChatBody, { children: [messages.length === 0 ? (_jsxs(WelcomeMessage, { children: [_jsx(WelcomeIcon, { children: "\uD83D\uDCA1" }), _jsxs(WelcomeText, { children: ["Ciao! Sono ", _jsx("strong", { children: "Toppy" }), ", il tuo assistente.", _jsx("br", {}), "Fai una domanda e ti aiuter\u00F2 a trovare la risposta."] })] })) : (messages.map((msg, index) => (_jsxs(MessageBubble, { $isUser: msg.isUser, children: [!msg.isUser && _jsx(BotAvatar, { src: ToppyImage, alt: "Toppy" }), msg.isUser ? (_jsxs(_Fragment, { children: [_jsx(QuestionCopy, { children: _jsx(CopyButton, { text: msg.text }) }), _jsx(MessageContent, { $isUser: true, children: msg.text })] })) : (_jsxs(BotMessageColumn, { children: [_jsx(BotMessageContent, { $isUser: false, children: _jsx(MarkdownContent, { children: renderMarkdown(msg.text) }) }), msg.text !== NO_ANSWER_TEXT && msg.text !== ERROR_TEXT && (_jsx(MessageFeedback, { answer: msg.text, submittedRating: submittedRatings[msg.id], onSubmit: (rating, tags, feedback) => onFeedbackSubmit(index, rating, tags, feedback) }))] }))] }, msg.id)))), isThinking && (_jsxs(MessageBubble, { $isUser: false, children: [_jsx(BotAvatar, { src: ToppyImage, alt: "Toppy" }), _jsx(ThinkingStatus, {}, messages.length)] })), _jsx("div", { ref: messagesEndRef })] }), _jsxs(ChatFooter, { children: [_jsx(TMChatInput, { inputRef: inputRef, value: chatInput, onChange: setChatInput, onSend: askHandler, placeholder: "Scrivi la tua domanda...", tooltip: "Invia", disabled: isThinking }), _jsx(FooterHint, { children: SDKUI_Localizator.HelpOnLineShiftEnterHint })] })] }));
|
|
239
202
|
};
|
|
240
203
|
const TMChatInput = ({ value, onChange, onSend, placeholder = 'Scrivi la tua domanda...', disabled = false, inputRef, tooltip = 'Ricerca AI' }) => {
|
|
241
204
|
const isDisabled = disabled || value.length < 2;
|
|
@@ -548,15 +511,6 @@ function IconSendFilled(props) {
|
|
|
548
511
|
function IconNewChat(props) {
|
|
549
512
|
return (_jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", width: "1em", height: "1em", fill: props.color || "currentColor", ...props, children: _jsx("path", { d: "M20 2H4c-1.1 0-2 .9-2 2v18l4-4h14c1.1 0 2-.9 2-2V4c0-1.1-.9-2-2-2zm0 14H6l-2 2V4h16v12z" }) }));
|
|
550
513
|
}
|
|
551
|
-
function IconSparkle(props) {
|
|
552
|
-
return (_jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", width: "1em", height: "1em", fill: "currentColor", ...props, children: _jsx("path", { d: "M19 9l1.25-2.75L23 5l-2.75-1.25L19 1l-1.25 2.75L15 5l2.75 1.25L19 9zm-7.5.5L9 4 6.5 9.5 1 12l5.5 2.5L9 20l2.5-5.5L17 12l-5.5-2.5zM19 15l-1.25 2.75L15 19l2.75 1.25L19 23l1.25-2.75L23 19l-2.75-1.25L19 15z" }) }));
|
|
553
|
-
}
|
|
554
|
-
function IconQuestion(props) {
|
|
555
|
-
return (_jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", width: "1em", height: "1em", fill: "currentColor", ...props, children: _jsx("path", { d: "M11 18h2v-2h-2v2zm1-16C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zm0 18c-4.41 0-8-3.59-8-8s3.59-8 8-8 8 3.59 8 8-3.59 8-8 8zm0-14c-2.21 0-4 1.79-4 4h2c0-1.1.9-2 2-2s2 .9 2 2c0 2-3 1.75-3 5h2c0-2.25 3-2.5 3-5 0-2.21-1.79-4-4-4z" }) }));
|
|
556
|
-
}
|
|
557
|
-
function IconArrowForward(props) {
|
|
558
|
-
return (_jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", width: "1em", height: "1em", fill: "currentColor", ...props, children: _jsx("path", { d: "M12 4l-1.41 1.41L16.17 11H4v2h12.17l-5.58 5.59L12 20l8-8z" }) }));
|
|
559
|
-
}
|
|
560
514
|
function IconThumbUp(props) {
|
|
561
515
|
return (_jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 24 24", width: "1em", height: "1em", fill: "currentColor", ...props, children: _jsx("path", { d: "M9 21h9c.83 0 1.54-.5 1.84-1.22l3.02-7.05c.09-.23.14-.47.14-.73v-2c0-1.1-.9-2-2-2h-6.31l.95-4.57.03-.32c0-.41-.17-.79-.44-1.06L14.17 1 7.58 7.59C7.22 7.95 7 8.45 7 9v10c0 1.1.9 2 2 2zM9 9l4.34-4.34L12 10h9v2l-3 7H9V9zM1 9h4v12H1z" }) }));
|
|
562
516
|
}
|
|
@@ -580,10 +534,6 @@ const phraseIn = keyframes `
|
|
|
580
534
|
from { opacity: 0; transform: translateY(4px); }
|
|
581
535
|
to { opacity: 1; transform: translateY(0); }
|
|
582
536
|
`;
|
|
583
|
-
const suggestionIn = keyframes `
|
|
584
|
-
from { opacity: 0; transform: translateY(6px); }
|
|
585
|
-
to { opacity: 1; transform: translateY(0); }
|
|
586
|
-
`;
|
|
587
537
|
const feedbackIn = keyframes `
|
|
588
538
|
from { opacity: 0; transform: translateY(-4px); }
|
|
589
539
|
to { opacity: 1; transform: translateY(0); }
|
|
@@ -1196,109 +1146,6 @@ const ChatFooter = styled.div `
|
|
|
1196
1146
|
border-top: 1px solid #e1e5e9;
|
|
1197
1147
|
box-shadow: 0 -2px 8px rgba(0, 0, 0, 0.05);
|
|
1198
1148
|
`;
|
|
1199
|
-
const SuggestionsSection = styled.div `
|
|
1200
|
-
margin-bottom: 14px;
|
|
1201
|
-
`;
|
|
1202
|
-
const SuggestionsTitle = styled.div `
|
|
1203
|
-
display: flex;
|
|
1204
|
-
align-items: center;
|
|
1205
|
-
gap: 6px;
|
|
1206
|
-
margin: 0 0 8px 2px;
|
|
1207
|
-
font-size: 11px;
|
|
1208
|
-
font-weight: 600;
|
|
1209
|
-
letter-spacing: 0.06em;
|
|
1210
|
-
text-transform: uppercase;
|
|
1211
|
-
color: #6b7280;
|
|
1212
|
-
|
|
1213
|
-
svg { color: ${TMColors.primary}; }
|
|
1214
|
-
`;
|
|
1215
|
-
const SuggestionsGrid = styled.div `
|
|
1216
|
-
display: grid;
|
|
1217
|
-
grid-template-columns: repeat(auto-fill, minmax(230px, 1fr));
|
|
1218
|
-
gap: 8px;
|
|
1219
|
-
`;
|
|
1220
|
-
const SuggestionIcon = styled.span `
|
|
1221
|
-
display: flex;
|
|
1222
|
-
align-items: center;
|
|
1223
|
-
justify-content: center;
|
|
1224
|
-
width: 28px;
|
|
1225
|
-
height: 28px;
|
|
1226
|
-
border-radius: 8px;
|
|
1227
|
-
flex-shrink: 0;
|
|
1228
|
-
background: ${TMColors.primary}14;
|
|
1229
|
-
color: ${TMColors.primary};
|
|
1230
|
-
transition: background 0.2s ease, color 0.2s ease;
|
|
1231
|
-
`;
|
|
1232
|
-
const SuggestionText = styled.span `
|
|
1233
|
-
flex: 1;
|
|
1234
|
-
min-width: 0;
|
|
1235
|
-
display: -webkit-box;
|
|
1236
|
-
-webkit-line-clamp: 2;
|
|
1237
|
-
-webkit-box-orient: vertical;
|
|
1238
|
-
overflow: hidden;
|
|
1239
|
-
`;
|
|
1240
|
-
const SuggestionArrow = styled.span `
|
|
1241
|
-
display: flex;
|
|
1242
|
-
flex-shrink: 0;
|
|
1243
|
-
color: ${TMColors.primary};
|
|
1244
|
-
opacity: 0;
|
|
1245
|
-
transform: translateX(-4px);
|
|
1246
|
-
transition: opacity 0.2s ease, transform 0.2s ease;
|
|
1247
|
-
`;
|
|
1248
|
-
const SuggestionCard = styled.button `
|
|
1249
|
-
display: flex;
|
|
1250
|
-
align-items: center;
|
|
1251
|
-
gap: 10px;
|
|
1252
|
-
width: 100%;
|
|
1253
|
-
min-height: 52px;
|
|
1254
|
-
padding: 9px 12px;
|
|
1255
|
-
border: 1px solid ${TMColors.primary}22;
|
|
1256
|
-
border-radius: 12px;
|
|
1257
|
-
background: linear-gradient(135deg, #ffffff 0%, ${TMColors.primary}08 100%);
|
|
1258
|
-
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04);
|
|
1259
|
-
color: #242424;
|
|
1260
|
-
font-family: inherit;
|
|
1261
|
-
font-size: 13px;
|
|
1262
|
-
line-height: 1.35;
|
|
1263
|
-
text-align: left;
|
|
1264
|
-
cursor: pointer;
|
|
1265
|
-
opacity: 0;
|
|
1266
|
-
animation: ${suggestionIn} 0.35s ease-out forwards;
|
|
1267
|
-
animation-delay: ${props => props.$index * 70}ms;
|
|
1268
|
-
transition: border-color 0.2s ease, background 0.2s ease, box-shadow 0.2s ease, transform 0.2s ease;
|
|
1269
|
-
|
|
1270
|
-
&:hover, &:focus-visible {
|
|
1271
|
-
border-color: ${TMColors.primary}66;
|
|
1272
|
-
background: ${TMColors.primary}0d;
|
|
1273
|
-
box-shadow: 0 4px 14px ${TMColors.primary}1f;
|
|
1274
|
-
transform: translateY(-1px);
|
|
1275
|
-
}
|
|
1276
|
-
|
|
1277
|
-
&:hover ${SuggestionIcon}, &:focus-visible ${SuggestionIcon} {
|
|
1278
|
-
background: ${TMColors.primary};
|
|
1279
|
-
color: white;
|
|
1280
|
-
}
|
|
1281
|
-
|
|
1282
|
-
&:hover ${SuggestionArrow}, &:focus-visible ${SuggestionArrow} {
|
|
1283
|
-
opacity: 1;
|
|
1284
|
-
transform: translateX(0);
|
|
1285
|
-
}
|
|
1286
|
-
|
|
1287
|
-
&:focus-visible {
|
|
1288
|
-
outline: 2px solid ${TMColors.primary}55;
|
|
1289
|
-
outline-offset: 2px;
|
|
1290
|
-
}
|
|
1291
|
-
|
|
1292
|
-
&:active {
|
|
1293
|
-
transform: translateY(0) scale(0.99);
|
|
1294
|
-
}
|
|
1295
|
-
|
|
1296
|
-
@media (prefers-reduced-motion: reduce) {
|
|
1297
|
-
animation: none;
|
|
1298
|
-
opacity: 1;
|
|
1299
|
-
transition: none;
|
|
1300
|
-
}
|
|
1301
|
-
`;
|
|
1302
1149
|
const FooterHint = styled.p `
|
|
1303
1150
|
margin: 6px 0 0 0;
|
|
1304
1151
|
font-size: 11px;
|
|
@@ -1537,9 +1537,9 @@ const TMSearchResultGrid = ({ openInOffice, fromDTD, operationItems, allUsers, i
|
|
|
1537
1537
|
return _jsxs("div", { style: { width: "100%", height: "100%" }, children: [!isDataGridReady && (_jsxs("div", { style: { display: 'flex', flexDirection: 'column', alignItems: 'center', justifyContent: 'center', height: '100%', width: '100%', gap: '10px' }, children: [_jsx(LoadIndicator, { height: 60, width: 60 }), _jsx("div", { children: SDKUI_Localizator.Loading })] })), isDataGridReady && _jsx(TMDataGrid, { ref: dataGridRef, id: "tm-search-result", keyExpr: "rowIndex", dataColumns: dataColumns, dataSource: dataSource, customizeColumns: customizeColumns, repaintChangesOnly: true, selectedRowKeys: selectedRowKeys, focusedRowKey: disableAutoFocus ? undefined : Number(focusedItem?.rowIndex ?? 0), showSearchPanel: showSearchTMDatagrid, showFilterPanel: true, sorting: gridSorting, selection: gridSelection, scrolling: gridScrolling, pageSize: pageSize, compactPager: compactPager, onSelectionChanged: handleSelectionChange, onFocusedRowChanged: handleFocusedRowChange, onRowDblClick: onRowDblClick, onContentReady: onContentReady, showHeaderColumnChooser: true, onKeyDown: onKeyDown, customContextMenuItems: operationItems, counterConfig: gridCounterConfig })] });
|
|
1538
1538
|
};
|
|
1539
1539
|
//#region TMSearchResultSelector
|
|
1540
|
-
const StyledItemTemplate = styled.div `
|
|
1541
|
-
background: ${(props) => props.$isSelected ? 'oklch(from var(--dx-color-primary) l c h / .2) !important' : 'transparent'};
|
|
1542
|
-
cursor: pointer;
|
|
1540
|
+
const StyledItemTemplate = styled.div `
|
|
1541
|
+
background: ${(props) => props.$isSelected ? 'oklch(from var(--dx-color-primary) l c h / .2) !important' : 'transparent'};
|
|
1542
|
+
cursor: pointer;
|
|
1543
1543
|
`;
|
|
1544
1544
|
const MemoizedStyledItemTemplate = React.memo(StyledItemTemplate);
|
|
1545
1545
|
const TMSearchResultSelector = ({ searchResults = [], disableAccordionIfSingleCategory = false, selectedTID, selectedSearchResult, autoSelectFirst = true, onSelectionChanged }) => {
|
|
@@ -1746,85 +1746,85 @@ const TMDcmtPreviewWrapper = ({ refreshPreviewTrigger, currentDcmt, isVisible, i
|
|
|
1746
1746
|
return (_jsx(TMDcmtPreview, { dcmtData: currentDcmt, onClosePanel: (!isMobile && countVisibleLeafPanels() > 1) ? () => setPanelVisibilityById('tmDcmtPreview', false) : undefined, onBack: onBack, allowMaximize: !isMobile && countVisibleLeafPanels() > 1, onMaximizePanel: (!isMobile && countVisibleLeafPanels() > 1) ? () => toggleMaximize("tmDcmtPreview") : undefined, isResizingActive: isResizingActive, isVisible: isVisible && isPageVisible }, refreshPreviewTrigger));
|
|
1747
1747
|
};
|
|
1748
1748
|
// Styled Components
|
|
1749
|
-
const StyledPlaceholder = styled.div `
|
|
1750
|
-
padding: 20px;
|
|
1751
|
-
text-align: center;
|
|
1752
|
-
color: #888;
|
|
1749
|
+
const StyledPlaceholder = styled.div `
|
|
1750
|
+
padding: 20px;
|
|
1751
|
+
text-align: center;
|
|
1752
|
+
color: #888;
|
|
1753
1753
|
`;
|
|
1754
|
-
const StyledIndexingInfoSection = styled.div `
|
|
1755
|
-
padding: 15px;
|
|
1756
|
-
border-top: 1px solid #e0e0e0;
|
|
1757
|
-
background: linear-gradient(to bottom, #f9f9f9, #f5f5f5);
|
|
1758
|
-
display: flex;
|
|
1759
|
-
flex-direction: column;
|
|
1760
|
-
gap: 10px;
|
|
1754
|
+
const StyledIndexingInfoSection = styled.div `
|
|
1755
|
+
padding: 15px;
|
|
1756
|
+
border-top: 1px solid #e0e0e0;
|
|
1757
|
+
background: linear-gradient(to bottom, #f9f9f9, #f5f5f5);
|
|
1758
|
+
display: flex;
|
|
1759
|
+
flex-direction: column;
|
|
1760
|
+
gap: 10px;
|
|
1761
1761
|
`;
|
|
1762
|
-
const StyledIndexingToggle = styled.button `
|
|
1763
|
-
display: flex;
|
|
1764
|
-
align-items: center;
|
|
1765
|
-
justify-content: space-between;
|
|
1766
|
-
width: 100%;
|
|
1767
|
-
padding: 10px 16px;
|
|
1768
|
-
background: white;
|
|
1769
|
-
border: 1px solid #d0d0d0;
|
|
1770
|
-
border-radius: 6px;
|
|
1771
|
-
cursor: ${props => props.disabled ? 'not-allowed' : 'pointer'};
|
|
1772
|
-
transition: all 0.2s ease;
|
|
1773
|
-
font-size: 14px;
|
|
1774
|
-
font-weight: 500;
|
|
1775
|
-
color: #333;
|
|
1776
|
-
opacity: ${props => props.disabled ? 0.6 : 1};
|
|
1777
|
-
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
|
|
1778
|
-
|
|
1779
|
-
&:hover:not(:disabled) {
|
|
1780
|
-
background: #f8f8f8;
|
|
1781
|
-
border-color: #2196F3;
|
|
1782
|
-
box-shadow: 0 2px 4px rgba(33, 150, 243, 0.2);
|
|
1783
|
-
}
|
|
1784
|
-
|
|
1785
|
-
&:active:not(:disabled) {
|
|
1786
|
-
transform: translateY(1px);
|
|
1787
|
-
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
|
|
1788
|
-
}
|
|
1762
|
+
const StyledIndexingToggle = styled.button `
|
|
1763
|
+
display: flex;
|
|
1764
|
+
align-items: center;
|
|
1765
|
+
justify-content: space-between;
|
|
1766
|
+
width: 100%;
|
|
1767
|
+
padding: 10px 16px;
|
|
1768
|
+
background: white;
|
|
1769
|
+
border: 1px solid #d0d0d0;
|
|
1770
|
+
border-radius: 6px;
|
|
1771
|
+
cursor: ${props => props.disabled ? 'not-allowed' : 'pointer'};
|
|
1772
|
+
transition: all 0.2s ease;
|
|
1773
|
+
font-size: 14px;
|
|
1774
|
+
font-weight: 500;
|
|
1775
|
+
color: #333;
|
|
1776
|
+
opacity: ${props => props.disabled ? 0.6 : 1};
|
|
1777
|
+
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
|
|
1778
|
+
|
|
1779
|
+
&:hover:not(:disabled) {
|
|
1780
|
+
background: #f8f8f8;
|
|
1781
|
+
border-color: #2196F3;
|
|
1782
|
+
box-shadow: 0 2px 4px rgba(33, 150, 243, 0.2);
|
|
1783
|
+
}
|
|
1784
|
+
|
|
1785
|
+
&:active:not(:disabled) {
|
|
1786
|
+
transform: translateY(1px);
|
|
1787
|
+
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
|
|
1788
|
+
}
|
|
1789
1789
|
`;
|
|
1790
|
-
const StyledLeftContent = styled.div `
|
|
1791
|
-
display: flex;
|
|
1792
|
-
align-items: center;
|
|
1793
|
-
gap: 8px;
|
|
1790
|
+
const StyledLeftContent = styled.div `
|
|
1791
|
+
display: flex;
|
|
1792
|
+
align-items: center;
|
|
1793
|
+
gap: 8px;
|
|
1794
1794
|
`;
|
|
1795
|
-
const StyledRightContent = styled.div `
|
|
1796
|
-
display: flex;
|
|
1797
|
-
align-items: center;
|
|
1798
|
-
gap: 8px;
|
|
1795
|
+
const StyledRightContent = styled.div `
|
|
1796
|
+
display: flex;
|
|
1797
|
+
align-items: center;
|
|
1798
|
+
gap: 8px;
|
|
1799
1799
|
`;
|
|
1800
|
-
const StyledChevron = styled.span `
|
|
1801
|
-
transition: transform 0.2s ease;
|
|
1802
|
-
transform: ${props => props.$isOpen ? 'rotate(180deg)' : 'rotate(0deg)'};
|
|
1803
|
-
color: #666;
|
|
1804
|
-
font-size: 12px;
|
|
1800
|
+
const StyledChevron = styled.span `
|
|
1801
|
+
transition: transform 0.2s ease;
|
|
1802
|
+
transform: ${props => props.$isOpen ? 'rotate(180deg)' : 'rotate(0deg)'};
|
|
1803
|
+
color: #666;
|
|
1804
|
+
font-size: 12px;
|
|
1805
1805
|
`;
|
|
1806
|
-
const StyledIndexingInfoBox = styled.div `
|
|
1807
|
-
position: relative;
|
|
1808
|
-
background: white;
|
|
1809
|
-
border: 1px solid #e0e0e0;
|
|
1810
|
-
border-radius: 6px;
|
|
1811
|
-
padding: 12px;
|
|
1812
|
-
max-height: 200px;
|
|
1813
|
-
overflow: auto;
|
|
1814
|
-
font-family: 'Courier New', monospace;
|
|
1815
|
-
font-size: 12px;
|
|
1816
|
-
color: #333;
|
|
1817
|
-
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
|
|
1818
|
-
animation: slideDown 0.2s ease;
|
|
1819
|
-
|
|
1820
|
-
@keyframes slideDown {
|
|
1821
|
-
from {
|
|
1822
|
-
opacity: 0;
|
|
1823
|
-
transform: translateY(-10px);
|
|
1824
|
-
}
|
|
1825
|
-
to {
|
|
1826
|
-
opacity: 1;
|
|
1827
|
-
transform: translateY(0);
|
|
1828
|
-
}
|
|
1829
|
-
}
|
|
1806
|
+
const StyledIndexingInfoBox = styled.div `
|
|
1807
|
+
position: relative;
|
|
1808
|
+
background: white;
|
|
1809
|
+
border: 1px solid #e0e0e0;
|
|
1810
|
+
border-radius: 6px;
|
|
1811
|
+
padding: 12px;
|
|
1812
|
+
max-height: 200px;
|
|
1813
|
+
overflow: auto;
|
|
1814
|
+
font-family: 'Courier New', monospace;
|
|
1815
|
+
font-size: 12px;
|
|
1816
|
+
color: #333;
|
|
1817
|
+
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
|
|
1818
|
+
animation: slideDown 0.2s ease;
|
|
1819
|
+
|
|
1820
|
+
@keyframes slideDown {
|
|
1821
|
+
from {
|
|
1822
|
+
opacity: 0;
|
|
1823
|
+
transform: translateY(-10px);
|
|
1824
|
+
}
|
|
1825
|
+
to {
|
|
1826
|
+
opacity: 1;
|
|
1827
|
+
transform: translateY(0);
|
|
1828
|
+
}
|
|
1829
|
+
}
|
|
1830
1830
|
`;
|
package/package.json
CHANGED
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
[
|
|
2
|
-
"Come metto un tipo documento dentro un albero?",
|
|
3
|
-
"Perché l'area di appoggio non mostra i file?",
|
|
4
|
-
"Che differenza c'è fra uno a molti e molti a molti?",
|
|
5
|
-
"A che servono i tre pulsanti della pagina certificati?",
|
|
6
|
-
"Che differenza c'è fra firma e marca temporale?",
|
|
7
|
-
"Posso cambiare il percorso di un disco?",
|
|
8
|
-
"Come esporto la configurazione?",
|
|
9
|
-
"Che differenza c'è fra la finestra dell'errore e il contatore rosso?",
|
|
10
|
-
"Ho archiviato un documento ma la ricerca libera non lo trova, perché?",
|
|
11
|
-
"Perché un gruppo non ha l'elenco degli utenti?",
|
|
12
|
-
"Come importo una configurazione?",
|
|
13
|
-
"Perché il cestino è grigio nei server LDAP?",
|
|
14
|
-
"Cosa succede ai documenti se elimino un valore di una lista dati?",
|
|
15
|
-
"Perché il cestino è grigio nei server di marca temporale?",
|
|
16
|
-
"Cosa sono i parametri fra parentesi graffe?",
|
|
17
|
-
"Come impedisco di riusare le vecchie password?",
|
|
18
|
-
"Perché la griglia dei permessi è vuota?",
|
|
19
|
-
"Che differenza c'è fra Direct e LoadBalance?",
|
|
20
|
-
"Quali campi ha un tipo serbatoio?",
|
|
21
|
-
"Come capisco se un utente sta davvero lavorando?",
|
|
22
|
-
"Perché il cestino è grigio nei server di firma?",
|
|
23
|
-
"Come aggiungo un campo a un tipo documento?",
|
|
24
|
-
"Quanti documenti ci sono in archivio?",
|
|
25
|
-
"A che serve «Usa autenticazione sicura» su un utente?",
|
|
26
|
-
"In che formato vengono mostrate le fatture elettroniche?",
|
|
27
|
-
"Come definisco quali documenti entrano in una vista?",
|
|
28
|
-
"Dove trovo la vista approvativa di un workflow?",
|
|
29
|
-
"Perché salva è grigio negli alberi?",
|
|
30
|
-
"Perché salva è grigio nelle aree di appoggio?",
|
|
31
|
-
"Perché la correlazione funziona solo in un verso?",
|
|
32
|
-
"Perché la firma non riesce pur essendo tutto compilato?",
|
|
33
|
-
"Perché non riesco a creare il certificato?",
|
|
34
|
-
"Che differenza c'è fra disco e area di appoggio?",
|
|
35
|
-
"Come esporto un tipo documento con tutto ciò che gli serve?",
|
|
36
|
-
"Che cosa vuol dire «Proseguendo le modifiche apportate andranno perse»?",
|
|
37
|
-
"A che serve la coda della ricerca full text?",
|
|
38
|
-
"Come metto una persona in un gruppo?",
|
|
39
|
-
"Come importo un tipo documento che usa liste dati che qui non esistono?",
|
|
40
|
-
"Dove metto utente e password del dominio?",
|
|
41
|
-
"Perché salva è grigio nelle liste dati?",
|
|
42
|
-
"Posso usare un certificatore diverso dai tre proposti?",
|
|
43
|
-
"Come faccio ripartire il protocollo da 1 ogni anno?",
|
|
44
|
-
"Come faccio scadere le password?",
|
|
45
|
-
"Cosa vuol dire autorizzato e non autorizzato?",
|
|
46
|
-
"Che cos'è un «Login SAP» e a che cosa serve?",
|
|
47
|
-
"Perché salva è grigio nei tipi serbatoio?",
|
|
48
|
-
"Dove trovo l'ID di sessione da dare all'assistenza?",
|
|
49
|
-
"Quali campi ha un server di firma?",
|
|
50
|
-
"Dove finiscono i file di questo tipo documento?",
|
|
51
|
-
"Quanti documenti sono senza file?",
|
|
52
|
-
"Ho creato un utente ma non vede niente, perché?",
|
|
53
|
-
"Perché il link di un documento non funziona?",
|
|
54
|
-
"Perché la stessa vista mostra cose diverse a persone diverse?",
|
|
55
|
-
"Che differenza c'è fra partecipante e responsabile?",
|
|
56
|
-
"Che cos'è un albero e a che cosa serve?",
|
|
57
|
-
"Che cos'è un'area di appoggio e a che cosa serve?",
|
|
58
|
-
"Perché dice «nessuna proprietà da definire»?",
|
|
59
|
-
"A che cosa servono «OTP Provider» e «OTP ID» del certificato?",
|
|
60
|
-
"Come aggiungo spazio all'archivio?",
|
|
61
|
-
"Perché dopo l'importazione i gruppi non vedono nulla?",
|
|
62
|
-
"Perché a volte è «Campo Obbligatorio» con la maiuscola?",
|
|
63
|
-
"Perché questo gruppo non si lascia modificare?",
|
|
64
|
-
"Devo importare tutto il file?",
|
|
65
|
-
"Perché salva è grigio nel server LDAP?",
|
|
66
|
-
"Che cos'è una lista dati e a che cosa serve?",
|
|
67
|
-
"Perché salva è grigio nel server di marca temporale?",
|
|
68
|
-
"Perché il numeratore dà sempre lo stesso numero?",
|
|
69
|
-
"A cosa servono i tre puntini nella cella dei permessi?",
|
|
70
|
-
"Dove si configura il collegamento a SAP?",
|
|
71
|
-
"Che differenza c'è fra serbatoio, disco e area di appoggio?",
|
|
72
|
-
"Quali colonne ha l'elenco delle sessioni?",
|
|
73
|
-
"Dove si configura il servizio che manda il codice OTP?",
|
|
74
|
-
"Che differenza c'è fra chiave primaria e indice univoco?",
|
|
75
|
-
"Perché un utente non riesce più ad accedere?",
|
|
76
|
-
"Come faccio vedere un documento a chi non ha un'utenza?",
|
|
77
|
-
"Perché la linguetta «Metadati» di un tipo documento è obbligatoria?",
|
|
78
|
-
"Perché la modifica al workflow non ha effetto?",
|
|
79
|
-
"Perché non riesco a salvare un albero nuovo?",
|
|
80
|
-
"Quali campi servono per un'area di appoggio?",
|
|
81
|
-
"Come risolvo l'errore sulla seconda query di una correlazione?",
|
|
82
|
-
"Perché salva è grigio nel certificato di firma?",
|
|
83
|
-
"Cosa succede ai documenti se elimino il disco?",
|
|
84
|
-
"Dove cambio il nome del file di esportazione?",
|
|
85
|
-
"Perché il salvataggio riesce ma l'oggetto non funziona?",
|
|
86
|
-
"Che cos'è un gruppo e perché i permessi si danno ai gruppi?",
|
|
87
|
-
"Perché non vedo il pulsante delle opzioni di importazione?",
|
|
88
|
-
"Che cos'è un server LDAP?",
|
|
89
|
-
"Perché la lista nuova non compare da nessuna parte?",
|
|
90
|
-
"Che cos'è un server di marca temporale?",
|
|
91
|
-
"Che cos'è un numeratore e a che cosa serve?",
|
|
92
|
-
"Perché non trovo l'oggetto nella griglia dei permessi?",
|
|
93
|
-
"Posso recuperare un profilo eliminato?",
|
|
94
|
-
"Dove si creano i tipi serbatoio?",
|
|
95
|
-
"Come faccio uscire qualcuno dall'applicazione?",
|
|
96
|
-
"Come provo che un server di firma funzioni?",
|
|
97
|
-
"Che cosa sono le opzioni del tipo documento?",
|
|
98
|
-
"Che cos'è il numero rosso nella scheda?",
|
|
99
|
-
"In che lingua vede il documento chi riceve il link?",
|
|
100
|
-
"Perché una vista ha meno opzioni di un tipo documento?",
|
|
101
|
-
"Che differenza c'è fra errore e avviso?"
|
|
102
|
-
]
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
[
|
|
2
|
-
"Che cos'è la schermata di accesso?",
|
|
3
|
-
"Quanti passaggi servono per entrare e come torno indietro?",
|
|
4
|
-
"Che cos'è il punto di accesso?",
|
|
5
|
-
"Come verifico che il punto di accesso risponda?",
|
|
6
|
-
"Che cos'è l'archivio documentale che mi viene chiesto?",
|
|
7
|
-
"Come si sceglie da un elenco a tendina o a finestra?",
|
|
8
|
-
"Quali sono le cinque modalità di autenticazione?",
|
|
9
|
-
"A che cosa servono i campi nome utente e password?",
|
|
10
|
-
"Che cos'è l'accesso «per conto di»?",
|
|
11
|
-
"Quali campi sono obbligatori per accedere?",
|
|
12
|
-
"Quali controlli ci sono sul cambio e sul recupero della password?",
|
|
13
|
-
"Che cos'è l'autenticazione a più fattori?",
|
|
14
|
-
"Come si compilano le sei caselle del codice?",
|
|
15
|
-
"Quali comandi ho accanto alle caselle del codice?",
|
|
16
|
-
"Come ottengo il codice per posta elettronica o da applicazione?",
|
|
17
|
-
"Quando compaiono «Cambia password» e «Password dimenticata»?",
|
|
18
|
-
"Come si cambia la password dalla schermata di accesso?",
|
|
19
|
-
"Ho dimenticato la password, come la recupero?",
|
|
20
|
-
"Quali requisiti deve avere la nuova password?",
|
|
21
|
-
"Che cosa sono gli accessi rapidi?",
|
|
22
|
-
"Come creo un accesso rapido prima di entrare?",
|
|
23
|
-
"Com'è fatto il pannello degli accessi rapidi?",
|
|
24
|
-
"Come personalizzo nome, icona e colore di un accesso rapido?",
|
|
25
|
-
"Come esporto e importo gli accessi rapidi?",
|
|
26
|
-
"Come cambio la lingua della schermata di accesso?",
|
|
27
|
-
"Quali versioni sono indicate nella schermata?",
|
|
28
|
-
"Che cosa vogliono dire i messaggi della schermata di accesso?",
|
|
29
|
-
"L'accesso non riesce: come capisco il motivo?",
|
|
30
|
-
"Come accedo a TopMedia da telefono?",
|
|
31
|
-
"La password nuova non viene accettata, perché?"
|
|
32
|
-
]
|
|
@@ -1,102 +0,0 @@
|
|
|
1
|
-
[
|
|
2
|
-
"Che cos'è l'Archiviazione?",
|
|
3
|
-
"Che cosa succede facendo clic su un risultato?",
|
|
4
|
-
"Che cosa significa tipo documento?",
|
|
5
|
-
"Che cosa sono i metadati di output?",
|
|
6
|
-
"Che cosa cambia negli elenchi e nelle finestre su Mobile?",
|
|
7
|
-
"Che cos'è la ricerca naturale?",
|
|
8
|
-
"Come effettuo una ricerca?",
|
|
9
|
-
"Come apro la sezione Ricerca?",
|
|
10
|
-
"Dove trovo i tipi documento in archiviazione?",
|
|
11
|
-
"A cosa servono i metadati?",
|
|
12
|
-
"Che cos'è un filtro di ricerca?",
|
|
13
|
-
"Come si apre la ricerca naturale?",
|
|
14
|
-
"In quale sezione di Surfer si cercano i documenti?",
|
|
15
|
-
"Che cos'è la ricerca avanzata?",
|
|
16
|
-
"Posso vedere il contenuto del file che sto archiviando?",
|
|
17
|
-
"A cosa serve il tipo documento?",
|
|
18
|
-
"Quali operatori di ricerca esistono?",
|
|
19
|
-
"Come evito errori di battitura?",
|
|
20
|
-
"Che cos'è la scheda del documento?",
|
|
21
|
-
"Devo convertire il file prima di archiviarlo?",
|
|
22
|
-
"Che cosa sono i metadati?",
|
|
23
|
-
"Che cos'è l'ordinamento del risultato?",
|
|
24
|
-
"Come cerco documenti di un certo periodo?",
|
|
25
|
-
"Come vengono nominati i file copiati?",
|
|
26
|
-
"Come scelgo il tipo documento da archiviare?",
|
|
27
|
-
"Che cos'è la ricerca per metadati?",
|
|
28
|
-
"Come cerco i documenti di oggi?",
|
|
29
|
-
"Che cos'è l'editor delle formule?",
|
|
30
|
-
"Dove metto il file da archiviare?",
|
|
31
|
-
"Che cos'è un documento in Surfer?",
|
|
32
|
-
"Come personalizzo i pannelli della ricerca?",
|
|
33
|
-
"Come si apre il pannello «Impostazioni» e come è fatto?",
|
|
34
|
-
"Come archivio una fattura elettronica?",
|
|
35
|
-
"Cosa vuol dire prendere in carico un documento?",
|
|
36
|
-
"Come aggiungo una colonna al risultato?",
|
|
37
|
-
"Che cosa vedo dopo la ricerca?",
|
|
38
|
-
"Che cosa sono i documenti master e dettaglio?",
|
|
39
|
-
"Come ordino cliccando sulla colonna?",
|
|
40
|
-
"Che cosa sono i metadati di sistema?",
|
|
41
|
-
"Come non reimposto ogni volta i filtri?",
|
|
42
|
-
"Come riconosco il tipo di dato di un metadato?",
|
|
43
|
-
"Perché non posso modificare la ricerca?",
|
|
44
|
-
"Che cos'è una vista e perché è scritta in rosso?",
|
|
45
|
-
"Come unisco due ricerche?",
|
|
46
|
-
"Che cos'è Toppy e in quanti modi compare nella Ricerca?",
|
|
47
|
-
"Come scarico un documento?",
|
|
48
|
-
"A cosa serve il check out?",
|
|
49
|
-
"Come elimino un documento dall'archivio?",
|
|
50
|
-
"Come prendo in carico un documento?",
|
|
51
|
-
"Come esporto i risultati?",
|
|
52
|
-
"Come metto un documento tra i preferiti?",
|
|
53
|
-
"Come aggiorno i risultati?",
|
|
54
|
-
"Dove sono finiti i documenti che avevo trovato?",
|
|
55
|
-
"Come faccio a rivedere le ricerche rapide?",
|
|
56
|
-
"Come scelgo il tipo documento dall'albero?",
|
|
57
|
-
"Come cambio l'albero che si apre all'inizio?",
|
|
58
|
-
"Come pulisco l'elenco delle scorciatoie?",
|
|
59
|
-
"Come filtro l'elenco dei tipi documento?",
|
|
60
|
-
"Perché non posso eliminare una ricerca?",
|
|
61
|
-
"Come faccio partire sempre la stessa ricerca?",
|
|
62
|
-
"Come richiamo una ricerca dalla pagina iniziale?",
|
|
63
|
-
"Come annullo le modifiche ai filtri?",
|
|
64
|
-
"Come aggiungo un campo di ricerca che non c'è?",
|
|
65
|
-
"Come scelgo quali colonne vedere nel risultato?",
|
|
66
|
-
"Come stabilisco la priorità dell'ordinamento?",
|
|
67
|
-
"Come faccio partire subito una ricerca salvata?",
|
|
68
|
-
"Come aggiungo un comando alla barra flottante?",
|
|
69
|
-
"Come leggo il documento senza aprirlo?",
|
|
70
|
-
"Come trovo un documento nei risultati?",
|
|
71
|
-
"Come tolgo una colonna dalla vista?",
|
|
72
|
-
"Come sostituisco il file?",
|
|
73
|
-
"Come firmo un documento?",
|
|
74
|
-
"Come trasformo un documento in pdf?",
|
|
75
|
-
"Come cambio un valore su tanti documenti?",
|
|
76
|
-
"Come trovo il documento principale?",
|
|
77
|
-
"Come collego due documenti?",
|
|
78
|
-
"Come archivio un documento simile?",
|
|
79
|
-
"Come tengo aperta l'anteprima?",
|
|
80
|
-
"Come faccio vedere l'anteprima dei file grandi?",
|
|
81
|
-
"Come copio i file in una cartella?",
|
|
82
|
-
"Come unisco più documenti?",
|
|
83
|
-
"Perché la ricerca full text non lo trova?",
|
|
84
|
-
"Come tolgo un documento dal gruppo di lavoro?",
|
|
85
|
-
"Chi ha preso il documento in passato?",
|
|
86
|
-
"Dove vedo i documenti condivisi?",
|
|
87
|
-
"Come assegno un compito su un documento?",
|
|
88
|
-
"Come scarico gli allegati di una fattura?",
|
|
89
|
-
"Come scarico la lista dei documenti?",
|
|
90
|
-
"Come cambio i dati di un documento?",
|
|
91
|
-
"Come archivio partendo da una ricerca?",
|
|
92
|
-
"Come faccio una ricerca complessa?",
|
|
93
|
-
"Perché il risultato non è quello che mi aspetto?",
|
|
94
|
-
"Come cerco una parola dentro i documenti?",
|
|
95
|
-
"Come chiedo a Toppy di trovare un documento?",
|
|
96
|
-
"Come copio i dati della firma?",
|
|
97
|
-
"Chi ha modificato il documento e quando?",
|
|
98
|
-
"Come risalgo dalla fattura all'ordine?",
|
|
99
|
-
"Come imposto una ricerca per trovare un documento?",
|
|
100
|
-
"Dove si cercano i documenti di un certo tipo?",
|
|
101
|
-
"Come vedo la cronologia dei check out di un documento?"
|
|
102
|
-
]
|