@buerokratt-ria/common-gui-components 0.0.57 → 0.0.58
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/CHANGELOG.md
CHANGED
|
@@ -4,6 +4,10 @@ All changes to this project will be documented in this file.
|
|
|
4
4
|
|
|
5
5
|
## Template [MajorVersion.MediterraneanVersion.MinorVersion] - DD-MM-YYYY
|
|
6
6
|
|
|
7
|
+
## [0.0.58] - 25.05.2026
|
|
8
|
+
|
|
9
|
+
- Properly render mcq selected button
|
|
10
|
+
|
|
7
11
|
## [0.0.57] - 14.05.2026
|
|
8
12
|
|
|
9
13
|
- Added authenticated person to chosen columns list
|
package/package.json
CHANGED
|
@@ -9,10 +9,21 @@
|
|
|
9
9
|
gap: 24px;
|
|
10
10
|
}
|
|
11
11
|
|
|
12
|
+
.history-page-wrapper {
|
|
13
|
+
display: flex;
|
|
14
|
+
flex-direction: column;
|
|
15
|
+
height: 100%;
|
|
16
|
+
min-height: 0;
|
|
17
|
+
overflow: hidden;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
|
|
12
21
|
.card-drawer-container {
|
|
13
22
|
display: flex;
|
|
14
23
|
width: 100%;
|
|
15
|
-
|
|
24
|
+
flex: 1;
|
|
25
|
+
min-height: 0;
|
|
26
|
+
overflow: hidden;
|
|
16
27
|
box-sizing: border-box;
|
|
17
28
|
}
|
|
18
29
|
|
|
@@ -57,7 +68,7 @@
|
|
|
57
68
|
|
|
58
69
|
.drawer-container {
|
|
59
70
|
flex: 1;
|
|
60
|
-
height:
|
|
71
|
+
min-height: 0;
|
|
61
72
|
overflow-y: auto;
|
|
62
73
|
box-shadow: -2px 0 5px rgba(0, 0, 0, 0.1);
|
|
63
74
|
border: 1px solid get-color(black-coral-2);
|
|
@@ -87,6 +98,11 @@
|
|
|
87
98
|
}
|
|
88
99
|
|
|
89
100
|
.history-content {
|
|
101
|
+
display: flex;
|
|
102
|
+
flex-direction: column;
|
|
103
|
+
flex: 1;
|
|
104
|
+
min-height: 0;
|
|
105
|
+
|
|
90
106
|
&--loading {
|
|
91
107
|
opacity: 0.5;
|
|
92
108
|
pointer-events: none;
|
|
@@ -1099,7 +1099,7 @@ const ChatHistory: FC<PropsWithChildren<HistoryProps>> = ({
|
|
|
1099
1099
|
if (!filteredEndedChatsList) return <>Loading... {{filteredEndedChatsList}} something is wrong </>;
|
|
1100
1100
|
|
|
1101
1101
|
return (
|
|
1102
|
-
|
|
1102
|
+
<div className="history-page-wrapper">
|
|
1103
1103
|
<div className="header-container">
|
|
1104
1104
|
{displayTitle && (
|
|
1105
1105
|
<h1>{t('chat.history.title')}{totalCount === null ? '' : ` (${totalCount.toLocaleString('et-EE')})`}</h1>
|
|
@@ -1255,7 +1255,7 @@ const ChatHistory: FC<PropsWithChildren<HistoryProps>> = ({
|
|
|
1255
1255
|
<ClearFiltersButton style={{ marginLeft: 'auto' }} onClick={onClearFilersClick} />
|
|
1256
1256
|
</Track>
|
|
1257
1257
|
)}
|
|
1258
|
-
<div className="card-drawer-container"
|
|
1258
|
+
<div className="card-drawer-container">
|
|
1259
1259
|
<div className="card-wrapper">
|
|
1260
1260
|
<Card>
|
|
1261
1261
|
<DataTable
|
|
@@ -1496,7 +1496,7 @@ const ChatHistory: FC<PropsWithChildren<HistoryProps>> = ({
|
|
|
1496
1496
|
<p>{t('global.removeValidation')}</p>
|
|
1497
1497
|
</Dialog>
|
|
1498
1498
|
)}
|
|
1499
|
-
|
|
1499
|
+
</div>
|
|
1500
1500
|
);
|
|
1501
1501
|
|
|
1502
1502
|
function getUserName() {
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React, { FC, useMemo } from "react";
|
|
2
2
|
import { format } from "date-fns";
|
|
3
|
-
import { Message } from "../../types/message";
|
|
3
|
+
import { Message, MessageButton } from "../../types/message";
|
|
4
4
|
import Markdownify from "../Chat/Markdownify";
|
|
5
5
|
import { parseButtons, parseOptions } from "../../utils/parse-utils";
|
|
6
6
|
import ButtonMessage from "../ButtonMessage";
|
|
@@ -12,14 +12,25 @@ type ChatMessageProps = {
|
|
|
12
12
|
message: Message;
|
|
13
13
|
onMessageClick?: (message: Message) => void;
|
|
14
14
|
toastContext: ToastContextType | null;
|
|
15
|
+
previousButtons?: MessageButton[];
|
|
15
16
|
};
|
|
16
17
|
|
|
17
|
-
const
|
|
18
|
+
const isButtonPayload = (content: string) =>
|
|
19
|
+
content.startsWith("#service,") || content.startsWith("#common_service,");
|
|
20
|
+
|
|
21
|
+
const ChatMessage: FC<ChatMessageProps> = ({ message, onMessageClick, toastContext, previousButtons }) => {
|
|
18
22
|
const buttons = useMemo(() => parseButtons(message), [message.buttons]);
|
|
19
23
|
const options = useMemo(() => parseOptions(message), [message.options]);
|
|
20
24
|
const { t } = useTranslation();
|
|
21
25
|
const toast = toastContext;
|
|
22
26
|
|
|
27
|
+
const selectedButton = useMemo(() => {
|
|
28
|
+
const content = message.content ?? "";
|
|
29
|
+
if (!isButtonPayload(content)) return null;
|
|
30
|
+
const match = previousButtons?.find((b) => b.payload === content);
|
|
31
|
+
return match ?? { title: content, payload: content };
|
|
32
|
+
}, [message.content, previousButtons]);
|
|
33
|
+
|
|
23
34
|
const handleContextMenu = (event: React.MouseEvent<HTMLButtonElement>) => {
|
|
24
35
|
event.preventDefault();
|
|
25
36
|
const content = message.content ?? "";
|
|
@@ -44,13 +55,17 @@ const ChatMessage: FC<ChatMessageProps> = ({ message, onMessageClick, toastConte
|
|
|
44
55
|
return (
|
|
45
56
|
<>
|
|
46
57
|
<div className="historical-chat__message">
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
58
|
+
{selectedButton ? (
|
|
59
|
+
<ButtonMessage buttons={[selectedButton]} />
|
|
60
|
+
) : (
|
|
61
|
+
<button
|
|
62
|
+
className="historical-chat__message-text"
|
|
63
|
+
onClick={onMessageClick ? () => onMessageClick(message) : undefined}
|
|
64
|
+
onContextMenu={handleContextMenu}
|
|
65
|
+
>
|
|
66
|
+
<Markdownify message={message.content ?? ""} sanitizeLinks={message.authorRole === "end-user"} />
|
|
67
|
+
</button>
|
|
68
|
+
)}
|
|
54
69
|
<time dateTime={message.created} className="historical-chat__message-date">
|
|
55
70
|
{format(new Date(message.created ?? ""), "HH:mm:ss")}
|
|
56
71
|
</time>
|
|
@@ -13,6 +13,8 @@ import { apiDev } from "../../services/api";
|
|
|
13
13
|
import ChatEvent from "../../ui-components/ChatEvent";
|
|
14
14
|
import { ToastContextType } from "../../context";
|
|
15
15
|
import { AUTHOR_ROLES } from "../../utils/constants";
|
|
16
|
+
import { parseButtons } from "../../utils/parse-utils";
|
|
17
|
+
import { MessageButton } from "../../types/message";
|
|
16
18
|
|
|
17
19
|
type ChatProps = {
|
|
18
20
|
chat: ChatType;
|
|
@@ -57,7 +59,7 @@ const HistoricalChat: FC<ChatProps> = ({
|
|
|
57
59
|
onMessageClick,
|
|
58
60
|
}) => {
|
|
59
61
|
const { t } = useTranslation();
|
|
60
|
-
const
|
|
62
|
+
const groupWrapperRef = useRef<HTMLDivElement>(null);
|
|
61
63
|
const [messageGroups, setMessageGroups] = useState<GroupedMessage[]>([]);
|
|
62
64
|
const [editingComment, setEditingComment] = useState<string | null>(null);
|
|
63
65
|
const [messagesList, setMessagesList] = useState<Message[]>([]);
|
|
@@ -184,14 +186,22 @@ const HistoricalChat: FC<ChatProps> = ({
|
|
|
184
186
|
}, [messagesList, endUserFullName]);
|
|
185
187
|
|
|
186
188
|
useEffect(() => {
|
|
187
|
-
if (!
|
|
188
|
-
|
|
189
|
+
if (!groupWrapperRef.current || !messageGroups) return;
|
|
190
|
+
groupWrapperRef.current.scrollTop = groupWrapperRef.current.scrollHeight;
|
|
189
191
|
}, [messageGroups]);
|
|
190
192
|
|
|
191
193
|
const isEvent = (group: GroupedMessage) => {
|
|
192
194
|
return (group.type === "event" || group.name.trim() === "" || group.messages.some((message) => message.event && message.event !== CHAT_EVENTS.GREETING));
|
|
193
195
|
};
|
|
194
196
|
|
|
197
|
+
const getPreviousButtons = (messageId: string | undefined): MessageButton[] => {
|
|
198
|
+
const idx = messagesList.findIndex((m) => m.id === messageId);
|
|
199
|
+
for (let i = idx - 1; i >= 0; i--) {
|
|
200
|
+
if (messagesList[i].buttons) return parseButtons(messagesList[i]);
|
|
201
|
+
}
|
|
202
|
+
return [];
|
|
203
|
+
};
|
|
204
|
+
|
|
195
205
|
const eventGroup = (group: GroupedMessage) => {
|
|
196
206
|
return group.messages.map((message) => {
|
|
197
207
|
if (message.event) {
|
|
@@ -232,6 +242,7 @@ const HistoricalChat: FC<ChatProps> = ({
|
|
|
232
242
|
message={message}
|
|
233
243
|
key={`${message.id ?? ""}`}
|
|
234
244
|
toastContext={toastContext}
|
|
245
|
+
previousButtons={getPreviousButtons(message.id)}
|
|
235
246
|
onMessageClick={(message) => {
|
|
236
247
|
onMessageClick?.(message);
|
|
237
248
|
}}
|
|
@@ -247,7 +258,7 @@ const HistoricalChat: FC<ChatProps> = ({
|
|
|
247
258
|
<div className="historical-chat">
|
|
248
259
|
<div className="historical-chat__body">
|
|
249
260
|
{header_link && <div className={"header-link"}>{header_link}</div>}
|
|
250
|
-
<div className="historical-chat__group-wrapper">
|
|
261
|
+
<div className="historical-chat__group-wrapper" ref={groupWrapperRef}>
|
|
251
262
|
{messageGroups?.map((group, index) => (
|
|
252
263
|
<div
|
|
253
264
|
className={clsx(["historical-chat__group", `historical-chat__group--${group.type}`])}
|
|
@@ -282,6 +293,7 @@ const HistoricalChat: FC<ChatProps> = ({
|
|
|
282
293
|
message={message}
|
|
283
294
|
key={`${message.id ?? ""}-${i}`}
|
|
284
295
|
toastContext={toastContext}
|
|
296
|
+
previousButtons={getPreviousButtons(message.id)}
|
|
285
297
|
onMessageClick={(message) => {
|
|
286
298
|
onMessageClick?.(message);
|
|
287
299
|
}}
|
|
@@ -292,7 +304,6 @@ const HistoricalChat: FC<ChatProps> = ({
|
|
|
292
304
|
)}
|
|
293
305
|
</div>
|
|
294
306
|
))}
|
|
295
|
-
<div id="anchor" ref={chatRef}></div>
|
|
296
307
|
</div>
|
|
297
308
|
{lastMessage && (
|
|
298
309
|
<div className="historical-chat__toolbar">
|
|
@@ -350,7 +361,6 @@ const HistoricalChat: FC<ChatProps> = ({
|
|
|
350
361
|
</div>
|
|
351
362
|
)}
|
|
352
363
|
</div>
|
|
353
|
-
<div id="anchor" ref={chatRef}></div>
|
|
354
364
|
</div>
|
|
355
365
|
);
|
|
356
366
|
};
|