@progress/kendo-angular-conversational-ui 21.0.0-develop.8 → 21.0.0-develop.9
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/chat/api/files-layout.d.ts +12 -0
- package/chat/api/index.d.ts +3 -1
- package/chat/api/message-settings.interface.d.ts +33 -0
- package/chat/api/message.interface.d.ts +5 -1
- package/chat/api/suggestions-layout.d.ts +20 -0
- package/chat/chat.component.d.ts +92 -34
- package/chat/chat.directives.d.ts +18 -0
- package/chat/chat.module.d.ts +15 -8
- package/chat/common/chat.service.d.ts +32 -3
- package/chat/common/models/model-fields.d.ts +0 -6
- package/chat/common/scroll-button.component.d.ts +32 -0
- package/chat/common/scroll.service.d.ts +39 -0
- package/chat/common/utils.d.ts +13 -1
- package/chat/l10n/messages.d.ts +9 -1
- package/chat/message-list.component.d.ts +20 -3
- package/chat/message.component.d.ts +40 -16
- package/chat/suggested-actions.component.d.ts +30 -5
- package/chat/templates/author-message-content-template.directive.d.ts +28 -0
- package/chat/templates/author-message-template.directive.d.ts +28 -0
- package/chat/templates/message-content-template.directive.d.ts +28 -0
- package/chat/templates/message-template.directive.d.ts +1 -1
- package/chat/templates/no-data-template.directive.d.ts +27 -0
- package/chat/templates/receiver-message-content-template.directive.d.ts +28 -0
- package/chat/templates/receiver-message-template.directive.d.ts +28 -0
- package/chat/templates/user-status-template.directive.d.ts +27 -0
- package/conversational-ui.module.d.ts +18 -11
- package/directives.d.ts +9 -2
- package/esm2022/chat/api/index.mjs +3 -1
- package/{chat/api/message-toolbar-visibility.d.ts → esm2022/chat/api/message-settings.interface.mjs} +1 -4
- package/esm2022/chat/api/suggestions-layout.mjs +5 -0
- package/esm2022/chat/builtin-actions.mjs +2 -0
- package/esm2022/chat/chat-file.component.mjs +2 -2
- package/esm2022/chat/chat.component.mjs +265 -71
- package/esm2022/chat/chat.directives.mjs +18 -0
- package/esm2022/chat/chat.module.mjs +16 -9
- package/esm2022/chat/common/chat.service.mjs +83 -4
- package/esm2022/chat/common/models/default-model-fields.mjs +0 -1
- package/esm2022/chat/common/scroll-button.component.mjs +81 -0
- package/esm2022/chat/common/scroll.service.mjs +110 -0
- package/esm2022/chat/common/utils.mjs +22 -3
- package/esm2022/chat/l10n/messages.mjs +13 -1
- package/esm2022/chat/message-attachments.component.mjs +2 -2
- package/esm2022/chat/message-box.component.mjs +5 -2
- package/esm2022/chat/message-list.component.mjs +165 -19
- package/esm2022/chat/message.component.mjs +487 -326
- package/esm2022/chat/suggested-actions.component.mjs +298 -80
- package/esm2022/chat/templates/author-message-content-template.directive.mjs +39 -0
- package/esm2022/chat/templates/author-message-template.directive.mjs +39 -0
- package/esm2022/chat/templates/message-content-template.directive.mjs +39 -0
- package/esm2022/chat/templates/message-template.directive.mjs +1 -1
- package/esm2022/chat/templates/no-data-template.directive.mjs +38 -0
- package/esm2022/chat/templates/receiver-message-content-template.directive.mjs +39 -0
- package/esm2022/chat/templates/receiver-message-template.directive.mjs +39 -0
- package/esm2022/chat/templates/user-status-template.directive.mjs +38 -0
- package/esm2022/conversational-ui.module.mjs +19 -12
- package/esm2022/directives.mjs +15 -1
- package/esm2022/index.mjs +7 -0
- package/esm2022/package-metadata.mjs +2 -2
- package/fesm2022/progress-kendo-angular-conversational-ui.mjs +1771 -547
- package/index.d.ts +7 -0
- package/package.json +14 -14
- /package/esm2022/chat/api/{message-toolbar-visibility.mjs → files-layout.mjs} +0 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**-----------------------------------------------------------------------------------------
|
|
2
|
+
* Copyright © 2025 Progress Software Corporation. All rights reserved.
|
|
3
|
+
* Licensed under commercial license. See LICENSE.md in the project root for more information
|
|
4
|
+
*-------------------------------------------------------------------------------------------*/
|
|
5
|
+
/**
|
|
6
|
+
* The layout of the files in the message bubble.
|
|
7
|
+
*
|
|
8
|
+
* 'horizontal' - Files are laid out in a row and are horizontally scrollable.
|
|
9
|
+
* 'vertical' - Files are displayed in a vertical stack.
|
|
10
|
+
* 'wrap' - Files wrap to new lines when space is limited.
|
|
11
|
+
*/
|
|
12
|
+
export type FilesLayoutMode = 'horizontal' | 'vertical' | 'wrap';
|
package/chat/api/index.d.ts
CHANGED
|
@@ -8,11 +8,13 @@ export * from './chat-file-interface';
|
|
|
8
8
|
export * from './chat-suggestion.interface';
|
|
9
9
|
export * from './execute-action-event';
|
|
10
10
|
export * from './message-action';
|
|
11
|
-
export * from './message-toolbar-visibility';
|
|
12
11
|
export * from './message-width-mode';
|
|
13
12
|
export * from './message.interface';
|
|
13
|
+
export * from './message-settings.interface';
|
|
14
14
|
export * from './post-message-event';
|
|
15
15
|
export * from './user.interface';
|
|
16
16
|
export * from './file-action';
|
|
17
17
|
export * from './file-download-event.interface';
|
|
18
18
|
export * from './send-button-settings';
|
|
19
|
+
export * from './files-layout';
|
|
20
|
+
export * from './suggestions-layout';
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**-----------------------------------------------------------------------------------------
|
|
2
|
+
* Copyright © 2025 Progress Software Corporation. All rights reserved.
|
|
3
|
+
* Licensed under commercial license. See LICENSE.md in the project root for more information
|
|
4
|
+
*-------------------------------------------------------------------------------------------*/
|
|
5
|
+
import { FileAction } from "./file-action";
|
|
6
|
+
import { MessageAction } from "./message-action";
|
|
7
|
+
import { MessageWidthMode } from "./message-width-mode";
|
|
8
|
+
/**
|
|
9
|
+
* Represents the settings for the Chat message ([see example](slug:databinding_chat)).
|
|
10
|
+
*
|
|
11
|
+
*/
|
|
12
|
+
export interface MessageSettings {
|
|
13
|
+
/**
|
|
14
|
+
* If set to `true`, enables the expanding/collapsing of long messages.
|
|
15
|
+
*/
|
|
16
|
+
allowMessageCollapse?: boolean;
|
|
17
|
+
/**
|
|
18
|
+
* Sets the array of actions that will be displayed in the message toolbar.
|
|
19
|
+
*/
|
|
20
|
+
messageToolbarActions?: MessageAction[];
|
|
21
|
+
/**
|
|
22
|
+
* Sets the array of actions that will be displayed in the message context menu.
|
|
23
|
+
*/
|
|
24
|
+
messageContextMenuActions?: MessageAction[];
|
|
25
|
+
/**
|
|
26
|
+
* Sets the array of actions that will be displayed for the message files.
|
|
27
|
+
*/
|
|
28
|
+
fileActions?: FileAction[];
|
|
29
|
+
/**
|
|
30
|
+
* Sets the mode that will be used to determine the message width.
|
|
31
|
+
*/
|
|
32
|
+
messageWidthMode?: MessageWidthMode;
|
|
33
|
+
}
|
|
@@ -14,7 +14,7 @@ export interface Message {
|
|
|
14
14
|
/**
|
|
15
15
|
* Sets a unique ID for the message.
|
|
16
16
|
*/
|
|
17
|
-
id
|
|
17
|
+
id: string | number;
|
|
18
18
|
/**
|
|
19
19
|
* Sets the text content for the message. Some messages may contain only attachments or quick actions.
|
|
20
20
|
*/
|
|
@@ -65,4 +65,8 @@ export interface Message {
|
|
|
65
65
|
* Indicates if the message is still being typed by the user. If `true`, the Chat shows a typing indicator.
|
|
66
66
|
*/
|
|
67
67
|
typing?: boolean;
|
|
68
|
+
/**
|
|
69
|
+
* Provides a reference to the original data item, if any.
|
|
70
|
+
*/
|
|
71
|
+
dataItem?: any;
|
|
68
72
|
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**-----------------------------------------------------------------------------------------
|
|
2
|
+
* Copyright © 2025 Progress Software Corporation. All rights reserved.
|
|
3
|
+
* Licensed under commercial license. See LICENSE.md in the project root for more information
|
|
4
|
+
*-------------------------------------------------------------------------------------------*/
|
|
5
|
+
/**
|
|
6
|
+
* Defines the layout for the suggestions list.
|
|
7
|
+
*
|
|
8
|
+
* 'scroll' - The list is scrollable when the content overflows.
|
|
9
|
+
* 'wrap' - The list wraps to new lines when space is limited.
|
|
10
|
+
* 'scrollbuttons' - The list is scrollable with navigation buttons when the content overflows.
|
|
11
|
+
*/
|
|
12
|
+
export type SuggestionsLayoutMode = 'scroll' | 'wrap' | 'scrollbuttons';
|
|
13
|
+
/**
|
|
14
|
+
* Defines the layout for the quick actions list.
|
|
15
|
+
*
|
|
16
|
+
* 'scroll' - The list is scrollable when the content overflows.
|
|
17
|
+
* 'wrap' - The list wraps to new lines when space is limited.
|
|
18
|
+
* 'scrollbuttons' - The list is scrollable with navigation buttons when the content overflows.
|
|
19
|
+
*/
|
|
20
|
+
export type QuickActionsLayoutMode = 'scroll' | 'wrap' | 'scrollbuttons';
|
package/chat/chat.component.d.ts
CHANGED
|
@@ -5,8 +5,7 @@
|
|
|
5
5
|
import { AfterViewInit, ElementRef, EventEmitter, OnDestroy, NgZone, Renderer2, SimpleChanges, OnInit, ViewContainerRef } from '@angular/core';
|
|
6
6
|
import { AttachmentTemplateDirective } from './templates/attachment-template.directive';
|
|
7
7
|
import { LocalizationService } from '@progress/kendo-angular-l10n';
|
|
8
|
-
import {
|
|
9
|
-
import { ExecuteActionEvent, FileAction, Message, SendMessageEvent, FileActionEvent, FileDownloadEvent, SendButtonSettings, MessageToolbarVisibility } from './api';
|
|
8
|
+
import { ExecuteActionEvent, FileAction, Message, SendMessageEvent, FileActionEvent, FileDownloadEvent, SendButtonSettings, FilesLayoutMode, MessageSettings } from './api';
|
|
10
9
|
import { MessageBoxType } from './common/models/message-box-options';
|
|
11
10
|
import { ChatMessageBoxTemplateDirective } from './templates/message-box.directive';
|
|
12
11
|
import { MessageBoxComponent } from './message-box.component';
|
|
@@ -22,6 +21,10 @@ import { ConversationalUIModelFields } from './common/models/model-fields';
|
|
|
22
21
|
import { ChatTimestampTemplateDirective } from './templates/timestamp-template.directive';
|
|
23
22
|
import { ChatStatusTemplateDirective } from './templates/status-template.directive';
|
|
24
23
|
import { ChatSuggestionTemplateDirective } from './templates/suggestion-template.directive';
|
|
24
|
+
import { ContextMenuComponent, ContextMenuPopupEvent } from '@progress/kendo-angular-menu';
|
|
25
|
+
import { NoDataTemplateDirective, MessageTemplateDirective, AuthorMessageContentTemplateDirective, ReceiverMessageContentTemplateDirective, ReceiverMessageTemplateDirective, AuthorMessageTemplateDirective, MessageContentTemplateDirective } from './chat.directives';
|
|
26
|
+
import { ChatUserStatusTemplateDirective } from './templates/user-status-template.directive';
|
|
27
|
+
import { QuickActionsLayoutMode, SuggestionsLayoutMode } from './api/suggestions-layout';
|
|
25
28
|
import * as i0 from "@angular/core";
|
|
26
29
|
/**
|
|
27
30
|
* Represents the [Kendo UI Chat component for Angular](slug:overview_convui).
|
|
@@ -40,7 +43,7 @@ import * as i0 from "@angular/core";
|
|
|
40
43
|
* ```
|
|
41
44
|
*
|
|
42
45
|
* @remarks
|
|
43
|
-
* Supported children components are: {@link CustomMessagesComponent}, {@link HeroCardComponent}, {@link AttachmentTemplateDirective}, {@link ChatHeaderTemplateDirective}, {@link ChatMessageBoxTemplateDirective}, {@link
|
|
46
|
+
* Supported children components are: {@link CustomMessagesComponent}, {@link HeroCardComponent}, {@link AttachmentTemplateDirective}, {@link ChatHeaderTemplateDirective}, {@link ChatMessageBoxTemplateDirective}, {@link MessageContentTemplateDirective}, {@link MessageTemplateDirective},{@link ChatStatusTemplateDirective}, {@link ChatSuggestionTemplateDirective}, {@link ChatTimestampTemplateDirective}, {@link ChatNoDataTemplateDirective}, {@link ChatUserStatusTemplateDirective}, {@link AuthorMessageContentTemplateDirective}, {@link ReceiverMessageContentTemplateDirective}, {@link ReceiverMessageTemplateDirective}, {@link AuthorMessageTemplateDirective}.
|
|
44
47
|
*/
|
|
45
48
|
export declare class ChatComponent implements OnInit, AfterViewInit, OnDestroy {
|
|
46
49
|
private localization;
|
|
@@ -49,13 +52,13 @@ export declare class ChatComponent implements OnInit, AfterViewInit, OnDestroy {
|
|
|
49
52
|
private element;
|
|
50
53
|
private chatService;
|
|
51
54
|
/**
|
|
52
|
-
*
|
|
53
|
-
*
|
|
54
|
-
* For more information,
|
|
55
|
+
* Sets the Chat messages.
|
|
56
|
+
* Accepts an array of `Message` objects, but can also accept custom data structures.
|
|
57
|
+
* For more information, check [Data Binding](slug:databinding_chat) section in the documentation.
|
|
55
58
|
*/
|
|
56
|
-
messages:
|
|
59
|
+
messages: any[];
|
|
57
60
|
/**
|
|
58
|
-
*
|
|
61
|
+
* Sets the ID that represents the local user.
|
|
59
62
|
*/
|
|
60
63
|
authorId: string | number;
|
|
61
64
|
/**
|
|
@@ -83,13 +86,14 @@ export declare class ChatComponent implements OnInit, AfterViewInit, OnDestroy {
|
|
|
83
86
|
*/
|
|
84
87
|
placeholder: string;
|
|
85
88
|
/**
|
|
86
|
-
*
|
|
89
|
+
* Controls the width of the message between the predefined options.
|
|
87
90
|
*
|
|
88
91
|
* @default 'standard'
|
|
89
92
|
*/
|
|
90
93
|
messageWidthMode: MessageWidthMode;
|
|
91
94
|
/**
|
|
92
95
|
* Enables the expand or collapse functionality for messages.
|
|
96
|
+
*
|
|
93
97
|
* @default false
|
|
94
98
|
*/
|
|
95
99
|
allowMessageCollapse: boolean;
|
|
@@ -106,35 +110,47 @@ export declare class ChatComponent implements OnInit, AfterViewInit, OnDestroy {
|
|
|
106
110
|
*/
|
|
107
111
|
enableFileSelect: boolean | FileSelectSettings;
|
|
108
112
|
/**
|
|
109
|
-
*
|
|
113
|
+
* Sets the actions of the message toolbar.
|
|
110
114
|
* These actions display in the message toolbar and let you perform specific operations on the message.
|
|
115
|
+
*
|
|
111
116
|
* @default []
|
|
112
117
|
*/
|
|
113
118
|
messageToolbarActions: MessageAction[];
|
|
114
119
|
/**
|
|
115
120
|
* Sets the value of the Message Box.
|
|
121
|
+
*
|
|
116
122
|
* @default ''
|
|
117
123
|
*/
|
|
118
124
|
inputValue: string;
|
|
119
125
|
/**
|
|
120
|
-
*
|
|
126
|
+
* Sets the settings for the author's messages.
|
|
127
|
+
*/
|
|
128
|
+
authorMessageSettings: MessageSettings;
|
|
129
|
+
/**
|
|
130
|
+
* Sets the settings for the receivers' messages.
|
|
131
|
+
*/
|
|
132
|
+
receiverMessageSettings: MessageSettings;
|
|
133
|
+
/**
|
|
134
|
+
* Sets the default actions that display in the message context menu.
|
|
121
135
|
*
|
|
122
136
|
* @default [{ id: 'copy', label: 'Copy', icon: 'copy', svgIcon: copyIcon, disabled: false }, { id: 'reply', label: 'Reply', icon: 'undo', svgIcon: undoIcon, disabled: false }]
|
|
123
137
|
*/
|
|
124
138
|
defaultContextMenuActions: MessageAction[];
|
|
125
139
|
/**
|
|
126
|
-
*
|
|
140
|
+
* Sets the actions that display in the message as a context menu.
|
|
127
141
|
* These actions display as menu items and let you perform specific operations on the message.
|
|
128
142
|
* The default actions are `copy` and `reply` and are defined by their `id`.
|
|
129
143
|
*/
|
|
130
144
|
set messageContextMenuActions(actions: MessageAction[] | null);
|
|
131
145
|
get messageContextMenuActions(): MessageAction[];
|
|
132
146
|
/**
|
|
133
|
-
*
|
|
147
|
+
* Sets the default actions that display in the file actions DropDownButton.
|
|
148
|
+
*
|
|
149
|
+
* @default [{ id: 'download', label: 'Download', icon: 'download', svgIcon: downloadIcon, disabled: false }]
|
|
134
150
|
*/
|
|
135
151
|
defaultFileActions: FileAction[];
|
|
136
152
|
/**
|
|
137
|
-
*
|
|
153
|
+
* Sets the actions that display in the file as items of a DropDownButton.
|
|
138
154
|
* These actions display when you click the file DropDownButton and let you perform specific operations on the file.
|
|
139
155
|
* The default action is `download` and is defined by its `id`.
|
|
140
156
|
*
|
|
@@ -143,17 +159,30 @@ export declare class ChatComponent implements OnInit, AfterViewInit, OnDestroy {
|
|
|
143
159
|
set fileActions(actions: FileAction[] | null);
|
|
144
160
|
get fileActions(): FileAction[];
|
|
145
161
|
/**
|
|
146
|
-
* Sets the
|
|
147
|
-
*
|
|
148
|
-
* @default
|
|
162
|
+
* Sets the layout of the files in the message bubble.
|
|
163
|
+
*
|
|
164
|
+
* @default 'vertical'
|
|
149
165
|
*/
|
|
150
|
-
|
|
166
|
+
set messageFilesLayout(layout: FilesLayoutMode);
|
|
151
167
|
/**
|
|
152
|
-
* Sets the
|
|
168
|
+
* Sets the layout of the suggestions above the message input box.
|
|
153
169
|
*
|
|
154
|
-
* @default '
|
|
170
|
+
* @default 'scroll'
|
|
155
171
|
*/
|
|
156
|
-
|
|
172
|
+
set suggestionsLayout(layoutMode: SuggestionsLayoutMode);
|
|
173
|
+
/**
|
|
174
|
+
* Sets the layout of the quick actions suggested below the messages.
|
|
175
|
+
*
|
|
176
|
+
* @default 'scroll'
|
|
177
|
+
*/
|
|
178
|
+
set quickActionsLayout(layoutMode: QuickActionsLayoutMode);
|
|
179
|
+
/**
|
|
180
|
+
* Sets the suggestions that display in the message input box.
|
|
181
|
+
* Suggestions display as a list of clickable items that let you quickly insert predefined text into the message input.
|
|
182
|
+
*
|
|
183
|
+
* @default []
|
|
184
|
+
*/
|
|
185
|
+
suggestions: ChatSuggestion[];
|
|
157
186
|
/**
|
|
158
187
|
* Sets the send button settings for the Chat component.
|
|
159
188
|
* Allows customization of the send button appearance, icons and disabled state.
|
|
@@ -168,64 +197,72 @@ export declare class ChatComponent implements OnInit, AfterViewInit, OnDestroy {
|
|
|
168
197
|
set modelFields(value: ConversationalUIModelFields);
|
|
169
198
|
get modelFields(): ConversationalUIModelFields;
|
|
170
199
|
/**
|
|
171
|
-
*
|
|
200
|
+
* Fires when the user sends a message by clicking the **Send** button or pressing **Enter**.
|
|
172
201
|
*
|
|
173
202
|
* The message is not automatically added to the `messages` array.
|
|
174
203
|
*/
|
|
175
204
|
sendMessage: EventEmitter<SendMessageEvent>;
|
|
176
205
|
/**
|
|
177
|
-
*
|
|
206
|
+
* Fires when the user clicks a quick action button in the message toolbar.
|
|
178
207
|
*/
|
|
179
208
|
toolbarActionClick: EventEmitter<MessageActionEvent>;
|
|
180
209
|
/**
|
|
181
|
-
*
|
|
210
|
+
* Fires when the user clicks an action in the message context menu.
|
|
182
211
|
*/
|
|
183
212
|
contextMenuActionClick: EventEmitter<MessageActionEvent>;
|
|
184
213
|
/**
|
|
185
|
-
*
|
|
214
|
+
* Fires when the user clicks an action in the file context menu.
|
|
186
215
|
*/
|
|
187
216
|
fileActionClick: EventEmitter<FileActionEvent>;
|
|
188
217
|
/**
|
|
189
|
-
*
|
|
218
|
+
* Fires when the user clicks an action in the file context menu.
|
|
190
219
|
*/
|
|
191
220
|
download: EventEmitter<FileDownloadEvent>;
|
|
192
221
|
/**
|
|
193
|
-
*
|
|
222
|
+
* Fires when the user clicks a quick action button.
|
|
194
223
|
* The Chat internally handles [known actions](slug:api_conversational-ui_actiontype) such as `reply`, `openUrl`, and `call`.
|
|
195
224
|
*
|
|
196
225
|
* The event is preventable. Calling [`preventDefault`](https://developer.mozilla.org/en-US/docs/Web/API/Event/preventDefault) suppresses the built-in action.
|
|
197
226
|
*/
|
|
198
227
|
executeAction: EventEmitter<ExecuteActionEvent>;
|
|
199
228
|
/**
|
|
200
|
-
*
|
|
229
|
+
* Fires when the user clicks a suggestion in the message input box.
|
|
201
230
|
*/
|
|
202
231
|
suggestionExecute: EventEmitter<ChatSuggestion>;
|
|
203
232
|
/**
|
|
204
|
-
*
|
|
233
|
+
* Fires when the user selects a file in the message input box.
|
|
205
234
|
*/
|
|
206
235
|
fileSelect: EventEmitter<SelectEvent>;
|
|
207
236
|
/**
|
|
208
|
-
*
|
|
237
|
+
* Fires when the user removes a file from the message input box.
|
|
209
238
|
*/
|
|
210
239
|
fileRemove: EventEmitter<ChatFile>;
|
|
211
240
|
/**
|
|
212
|
-
*
|
|
241
|
+
* Fires when the user unpins the pinned message.
|
|
213
242
|
* This event triggers when the user clicks the delete button on the pinned message.
|
|
214
243
|
*/
|
|
215
244
|
unpin: EventEmitter<Message>;
|
|
216
245
|
/**
|
|
217
|
-
*
|
|
246
|
+
* Fires when the user types in the message input box.
|
|
218
247
|
*/
|
|
219
248
|
inputValueChange: EventEmitter<string>;
|
|
220
249
|
get className(): string;
|
|
221
250
|
get dirAttr(): string;
|
|
251
|
+
set messagesContextMenu(contextMenu: ContextMenuComponent);
|
|
222
252
|
attachmentTemplate: AttachmentTemplateDirective;
|
|
223
253
|
chatHeaderTemplate: ChatHeaderTemplateDirective;
|
|
254
|
+
chatNoDataTemplate: NoDataTemplateDirective;
|
|
255
|
+
authorMessageContentTemplate: AuthorMessageContentTemplateDirective;
|
|
256
|
+
receiverMessageContentTemplate: ReceiverMessageContentTemplateDirective;
|
|
257
|
+
messageContentTemplate: MessageContentTemplateDirective;
|
|
258
|
+
authorMessageTemplate: AuthorMessageTemplateDirective;
|
|
259
|
+
receiverMessageTemplate: ReceiverMessageTemplateDirective;
|
|
224
260
|
messageTemplate: MessageTemplateDirective;
|
|
225
261
|
timestampTemplate: ChatTimestampTemplateDirective;
|
|
226
262
|
suggestionTemplate: ChatSuggestionTemplateDirective;
|
|
227
263
|
statusTemplate: ChatStatusTemplateDirective;
|
|
228
264
|
messageBoxTemplate: ChatMessageBoxTemplateDirective;
|
|
265
|
+
userStatusTemplate: ChatUserStatusTemplateDirective;
|
|
229
266
|
messageBox: MessageBoxComponent;
|
|
230
267
|
/**
|
|
231
268
|
* @hidden
|
|
@@ -233,9 +270,15 @@ export declare class ChatComponent implements OnInit, AfterViewInit, OnDestroy {
|
|
|
233
270
|
messageList: ViewContainerRef;
|
|
234
271
|
/**
|
|
235
272
|
* @hidden
|
|
236
|
-
* Returns processed messages when model fields are used, otherwise returns original messages
|
|
273
|
+
* Returns processed messages when model fields are used, otherwise returns original messages.
|
|
237
274
|
*/
|
|
238
275
|
get processedMessages(): Message[];
|
|
276
|
+
/**
|
|
277
|
+
* Gets the actions available in the message context menu.
|
|
278
|
+
*
|
|
279
|
+
* @hidden
|
|
280
|
+
*/
|
|
281
|
+
get contextMenuActions(): any[];
|
|
239
282
|
/**
|
|
240
283
|
* @hidden
|
|
241
284
|
*/
|
|
@@ -261,6 +304,9 @@ export declare class ChatComponent implements OnInit, AfterViewInit, OnDestroy {
|
|
|
261
304
|
private _modelFields;
|
|
262
305
|
private _messageContextMenuActions;
|
|
263
306
|
private _fileActions;
|
|
307
|
+
private _cachedProcessedMessages;
|
|
308
|
+
private _lastMessagesReference;
|
|
309
|
+
private _lastModelFields;
|
|
264
310
|
constructor(localization: LocalizationService, zone: NgZone, renderer: Renderer2, element: ElementRef, chatService: ChatService);
|
|
265
311
|
/**
|
|
266
312
|
* @hidden
|
|
@@ -290,9 +336,21 @@ export declare class ChatComponent implements OnInit, AfterViewInit, OnDestroy {
|
|
|
290
336
|
* @hidden
|
|
291
337
|
*/
|
|
292
338
|
scrollToPinnedMessage(): void;
|
|
339
|
+
/**
|
|
340
|
+
* @hidden
|
|
341
|
+
*/
|
|
342
|
+
onContextMenuAction(action: MessageAction): void;
|
|
343
|
+
/**
|
|
344
|
+
* @hidden
|
|
345
|
+
*/
|
|
346
|
+
handleMenuClose(event: ContextMenuPopupEvent): void;
|
|
347
|
+
/**
|
|
348
|
+
* @hidden
|
|
349
|
+
*/
|
|
350
|
+
onActionButtonClick(event: MouseEvent): void;
|
|
293
351
|
private findLastPinnedMessage;
|
|
294
352
|
private updateChatServiceProperties;
|
|
295
353
|
private mergeWithDefaultActions;
|
|
296
354
|
static ɵfac: i0.ɵɵFactoryDeclaration<ChatComponent, never>;
|
|
297
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<ChatComponent, "kendo-chat", never, { "messages": { "alias": "messages"; "required": false; }; "authorId": { "alias": "authorId"; "required": false; }; "messageBoxType": { "alias": "messageBoxType"; "required": false; }; "height": { "alias": "height"; "required": false; }; "width": { "alias": "width"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "messageWidthMode": { "alias": "messageWidthMode"; "required": false; }; "allowMessageCollapse": { "alias": "allowMessageCollapse"; "required": false; }; "enableSpeechToText": { "alias": "enableSpeechToText"; "required": false; }; "enableFileSelect": { "alias": "enableFileSelect"; "required": false; }; "messageToolbarActions": { "alias": "messageToolbarActions"; "required": false; }; "inputValue": { "alias": "inputValue"; "required": false; }; "messageContextMenuActions": { "alias": "messageContextMenuActions"; "required": false; }; "fileActions": { "alias": "fileActions"; "required": false; }; "
|
|
355
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<ChatComponent, "kendo-chat", never, { "messages": { "alias": "messages"; "required": false; }; "authorId": { "alias": "authorId"; "required": false; }; "messageBoxType": { "alias": "messageBoxType"; "required": false; }; "height": { "alias": "height"; "required": false; }; "width": { "alias": "width"; "required": false; }; "placeholder": { "alias": "placeholder"; "required": false; }; "messageWidthMode": { "alias": "messageWidthMode"; "required": false; }; "allowMessageCollapse": { "alias": "allowMessageCollapse"; "required": false; }; "enableSpeechToText": { "alias": "enableSpeechToText"; "required": false; }; "enableFileSelect": { "alias": "enableFileSelect"; "required": false; }; "messageToolbarActions": { "alias": "messageToolbarActions"; "required": false; }; "inputValue": { "alias": "inputValue"; "required": false; }; "authorMessageSettings": { "alias": "authorMessageSettings"; "required": false; }; "receiverMessageSettings": { "alias": "receiverMessageSettings"; "required": false; }; "messageContextMenuActions": { "alias": "messageContextMenuActions"; "required": false; }; "fileActions": { "alias": "fileActions"; "required": false; }; "messageFilesLayout": { "alias": "messageFilesLayout"; "required": false; }; "suggestionsLayout": { "alias": "suggestionsLayout"; "required": false; }; "quickActionsLayout": { "alias": "quickActionsLayout"; "required": false; }; "suggestions": { "alias": "suggestions"; "required": false; }; "sendButtonSettings": { "alias": "sendButtonSettings"; "required": false; }; "modelFields": { "alias": "modelFields"; "required": false; }; }, { "sendMessage": "sendMessage"; "toolbarActionClick": "toolbarActionClick"; "contextMenuActionClick": "contextMenuActionClick"; "fileActionClick": "fileActionClick"; "download": "download"; "executeAction": "executeAction"; "suggestionExecute": "suggestionExecute"; "fileSelect": "fileSelect"; "fileRemove": "fileRemove"; "unpin": "unpin"; "inputValueChange": "inputValueChange"; }, ["attachmentTemplate", "chatHeaderTemplate", "chatNoDataTemplate", "authorMessageContentTemplate", "receiverMessageContentTemplate", "messageContentTemplate", "authorMessageTemplate", "receiverMessageTemplate", "messageTemplate", "timestampTemplate", "suggestionTemplate", "statusTemplate", "messageBoxTemplate", "userStatusTemplate"], never, true, never>;
|
|
298
356
|
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**-----------------------------------------------------------------------------------------
|
|
2
|
+
* Copyright © 2025 Progress Software Corporation. All rights reserved.
|
|
3
|
+
* Licensed under commercial license. See LICENSE.md in the project root for more information
|
|
4
|
+
*-------------------------------------------------------------------------------------------*/
|
|
5
|
+
export { ChatComponent } from './chat.component';
|
|
6
|
+
export { AttachmentTemplateDirective } from './templates/attachment-template.directive';
|
|
7
|
+
export { MessageContentTemplateDirective } from './templates/message-content-template.directive';
|
|
8
|
+
export { MessageTemplateDirective } from './templates/message-template.directive';
|
|
9
|
+
export { ChatUserStatusTemplateDirective } from './templates/user-status-template.directive';
|
|
10
|
+
export { ChatMessageBoxTemplateDirective } from './templates/message-box.directive';
|
|
11
|
+
export { ChatHeaderTemplateDirective } from './templates/header-template.directive';
|
|
12
|
+
export { NoDataTemplateDirective } from './templates/no-data-template.directive';
|
|
13
|
+
export { ChatTimestampTemplateDirective } from './templates/timestamp-template.directive';
|
|
14
|
+
export { ChatStatusTemplateDirective } from './templates/status-template.directive';
|
|
15
|
+
export { AuthorMessageContentTemplateDirective } from './templates/author-message-content-template.directive';
|
|
16
|
+
export { ReceiverMessageContentTemplateDirective } from './templates/receiver-message-content-template.directive';
|
|
17
|
+
export { ReceiverMessageTemplateDirective } from './templates/receiver-message-template.directive';
|
|
18
|
+
export { AuthorMessageTemplateDirective } from './templates/author-message-template.directive';
|
package/chat/chat.module.d.ts
CHANGED
|
@@ -6,13 +6,20 @@ import * as i0 from "@angular/core";
|
|
|
6
6
|
import * as i1 from "./chat.component";
|
|
7
7
|
import * as i2 from "./l10n/custom-messages.component";
|
|
8
8
|
import * as i3 from "./templates/attachment-template.directive";
|
|
9
|
-
import * as i4 from "./templates/message-template.directive";
|
|
10
|
-
import * as i5 from "./
|
|
11
|
-
import * as i6 from "./templates/message-
|
|
12
|
-
import * as i7 from "./templates/
|
|
13
|
-
import * as i8 from "./templates/
|
|
14
|
-
import * as i9 from "./templates/
|
|
15
|
-
import * as i10 from "./
|
|
9
|
+
import * as i4 from "./templates/author-message-content-template.directive";
|
|
10
|
+
import * as i5 from "./templates/receiver-message-content-template.directive";
|
|
11
|
+
import * as i6 from "./templates/message-content-template.directive";
|
|
12
|
+
import * as i7 from "./templates/author-message-template.directive";
|
|
13
|
+
import * as i8 from "./templates/receiver-message-template.directive";
|
|
14
|
+
import * as i9 from "./templates/message-template.directive";
|
|
15
|
+
import * as i10 from "./cards/hero-card.component";
|
|
16
|
+
import * as i11 from "./templates/message-box.directive";
|
|
17
|
+
import * as i12 from "./templates/header-template.directive";
|
|
18
|
+
import * as i13 from "./templates/no-data-template.directive";
|
|
19
|
+
import * as i14 from "./templates/timestamp-template.directive";
|
|
20
|
+
import * as i15 from "./templates/status-template.directive";
|
|
21
|
+
import * as i16 from "./templates/suggestion-template.directive";
|
|
22
|
+
import * as i17 from "./templates/user-status-template.directive";
|
|
16
23
|
/**
|
|
17
24
|
* Represents the [`NgModule`](link:site.data.urls.angular['ngmodules']) for the Chat component.
|
|
18
25
|
*
|
|
@@ -36,6 +43,6 @@ import * as i10 from "./templates/suggestion-template.directive";
|
|
|
36
43
|
*/
|
|
37
44
|
export declare class ChatModule {
|
|
38
45
|
static ɵfac: i0.ɵɵFactoryDeclaration<ChatModule, never>;
|
|
39
|
-
static ɵmod: i0.ɵɵNgModuleDeclaration<ChatModule, never, [typeof i1.ChatComponent, typeof i2.CustomMessagesComponent, typeof i3.AttachmentTemplateDirective, typeof i4.
|
|
46
|
+
static ɵmod: i0.ɵɵNgModuleDeclaration<ChatModule, never, [typeof i1.ChatComponent, typeof i2.CustomMessagesComponent, typeof i3.AttachmentTemplateDirective, typeof i4.AuthorMessageContentTemplateDirective, typeof i5.ReceiverMessageContentTemplateDirective, typeof i6.MessageContentTemplateDirective, typeof i7.AuthorMessageTemplateDirective, typeof i8.ReceiverMessageTemplateDirective, typeof i9.MessageTemplateDirective, typeof i10.HeroCardComponent, typeof i11.ChatMessageBoxTemplateDirective, typeof i12.ChatHeaderTemplateDirective, typeof i13.NoDataTemplateDirective, typeof i14.ChatTimestampTemplateDirective, typeof i15.ChatStatusTemplateDirective, typeof i16.ChatSuggestionTemplateDirective, typeof i17.ChatUserStatusTemplateDirective], [typeof i1.ChatComponent, typeof i2.CustomMessagesComponent, typeof i3.AttachmentTemplateDirective, typeof i4.AuthorMessageContentTemplateDirective, typeof i5.ReceiverMessageContentTemplateDirective, typeof i6.MessageContentTemplateDirective, typeof i7.AuthorMessageTemplateDirective, typeof i8.ReceiverMessageTemplateDirective, typeof i9.MessageTemplateDirective, typeof i10.HeroCardComponent, typeof i11.ChatMessageBoxTemplateDirective, typeof i12.ChatHeaderTemplateDirective, typeof i13.NoDataTemplateDirective, typeof i14.ChatTimestampTemplateDirective, typeof i15.ChatStatusTemplateDirective, typeof i16.ChatSuggestionTemplateDirective, typeof i17.ChatUserStatusTemplateDirective]>;
|
|
40
47
|
static ɵinj: i0.ɵɵInjectorDeclaration<ChatModule>;
|
|
41
48
|
}
|
|
@@ -5,8 +5,9 @@
|
|
|
5
5
|
import { ViewContainerRef, ElementRef } from '@angular/core';
|
|
6
6
|
import { SpeechToTextButtonSettings } from '@progress/kendo-angular-buttons';
|
|
7
7
|
import { MessageWidthMode } from '../api/message-width-mode';
|
|
8
|
-
import { FileAction, FileActionEvent, FileDownloadEvent, Message, MessageAction, MessageActionEvent,
|
|
8
|
+
import { FileAction, FileActionEvent, FileDownloadEvent, FilesLayoutMode, Message, MessageAction, MessageActionEvent, MessageSettings, QuickActionsLayoutMode, SendButtonSettings, SuggestionsLayoutMode } from '../api';
|
|
9
9
|
import { FileSelectSettings } from '@progress/kendo-angular-upload';
|
|
10
|
+
import { ContextMenuComponent } from '@progress/kendo-angular-menu';
|
|
10
11
|
import * as i0 from "@angular/core";
|
|
11
12
|
/**
|
|
12
13
|
* @hidden
|
|
@@ -14,19 +15,29 @@ import * as i0 from "@angular/core";
|
|
|
14
15
|
export declare class ChatService {
|
|
15
16
|
authorId: string | number;
|
|
16
17
|
messageWidthMode: MessageWidthMode;
|
|
17
|
-
allowMessageCollapse: boolean;
|
|
18
18
|
messageToolbarActions: MessageAction[];
|
|
19
19
|
messageContextMenuActions: MessageAction[];
|
|
20
|
+
calculatedContextMenuActions: MessageAction[];
|
|
20
21
|
fileActions: FileAction[];
|
|
21
|
-
messageToolbarVisibility: MessageToolbarVisibility;
|
|
22
22
|
toggleMessageState: boolean;
|
|
23
23
|
reply: Message;
|
|
24
24
|
messages: Message[];
|
|
25
25
|
chatElement: ViewContainerRef;
|
|
26
26
|
messageElementsMap: Map<string | number, ElementRef>;
|
|
27
|
+
messagesContextMenu: ContextMenuComponent;
|
|
28
|
+
activeMessage: Message;
|
|
29
|
+
activeMessageElement: any;
|
|
30
|
+
selectOnMenuClose: boolean;
|
|
31
|
+
active: boolean;
|
|
32
|
+
messageFilesLayout: FilesLayoutMode;
|
|
27
33
|
private _enableSpeechToText;
|
|
28
34
|
private _enableFileSelect;
|
|
29
35
|
private _sendButtonSettings;
|
|
36
|
+
private _suggestionsLayout;
|
|
37
|
+
private _quickActionsLayout;
|
|
38
|
+
_authorMessageSettings: MessageSettings;
|
|
39
|
+
_receiverMessageSettings: MessageSettings;
|
|
40
|
+
private _allowMessageCollapse;
|
|
30
41
|
private subjects;
|
|
31
42
|
toolbarAction$: import("rxjs").Observable<MessageActionEvent>;
|
|
32
43
|
contextMenuAction$: import("rxjs").Observable<MessageActionEvent>;
|
|
@@ -34,17 +45,35 @@ export declare class ChatService {
|
|
|
34
45
|
fileDownload$: import("rxjs").Observable<FileDownloadEvent>;
|
|
35
46
|
replyReferenceClick$: import("rxjs").Observable<string | number>;
|
|
36
47
|
inputValueChange$: import("rxjs").Observable<string>;
|
|
48
|
+
contextMenuVisibilityChange$: import("rxjs").Observable<boolean>;
|
|
49
|
+
suggestionsLayoutChange$: import("rxjs").Observable<SuggestionsLayoutMode>;
|
|
50
|
+
quickActionsLayoutChange$: import("rxjs").Observable<SuggestionsLayoutMode>;
|
|
51
|
+
authorMessageSettingsChange$: import("rxjs").Observable<MessageSettings>;
|
|
52
|
+
receiverMessageSettingsChange$: import("rxjs").Observable<MessageSettings>;
|
|
53
|
+
allowMessageCollapseChange$: import("rxjs").Observable<boolean>;
|
|
54
|
+
set authorMessageSettings(settings: MessageSettings);
|
|
55
|
+
get authorMessageSettings(): MessageSettings;
|
|
56
|
+
set receiverMessageSettings(settings: MessageSettings);
|
|
57
|
+
get receiverMessageSettings(): MessageSettings;
|
|
37
58
|
set enableSpeechToText(settings: boolean | SpeechToTextButtonSettings);
|
|
38
59
|
get enableSpeechToText(): SpeechToTextButtonSettings;
|
|
39
60
|
set enableFileSelect(settings: boolean | FileSelectSettings);
|
|
40
61
|
get enableFileSelect(): FileSelectSettings;
|
|
41
62
|
set sendButtonSettings(settings: boolean | SendButtonSettings);
|
|
42
63
|
get sendButtonSettings(): SendButtonSettings;
|
|
64
|
+
set suggestionsLayout(layoutMode: SuggestionsLayoutMode);
|
|
65
|
+
get suggestionsLayout(): SuggestionsLayoutMode;
|
|
66
|
+
set quickActionsLayout(layoutMode: QuickActionsLayoutMode);
|
|
67
|
+
get quickActionsLayout(): QuickActionsLayoutMode;
|
|
68
|
+
set allowMessageCollapse(value: boolean);
|
|
69
|
+
get allowMessageCollapse(): boolean;
|
|
70
|
+
calculateContextMenuActions(isOwn: boolean): void;
|
|
43
71
|
emit(subjectKey: string, value?: any): void;
|
|
44
72
|
getMessageById(id: string | number): Message | undefined;
|
|
45
73
|
registerMessageElement(messageId: string | number, elementRef: ElementRef): void;
|
|
46
74
|
unregisterMessageElement(messageId: string | number): void;
|
|
47
75
|
scrollToMessage(messageId: string | number): void;
|
|
76
|
+
focusActiveMessageElement(): void;
|
|
48
77
|
private updateComponentSettings;
|
|
49
78
|
static ɵfac: i0.ɵɵFactoryDeclaration<ChatService, never>;
|
|
50
79
|
static ɵprov: i0.ɵɵInjectableDeclaration<ChatService>;
|
|
@@ -84,12 +84,6 @@ export interface ConversationalUIModelFields {
|
|
|
84
84
|
* @default "isPinned"
|
|
85
85
|
*/
|
|
86
86
|
isPinnedField?: string;
|
|
87
|
-
/**
|
|
88
|
-
* Field name for the user who pinned the message.
|
|
89
|
-
*
|
|
90
|
-
* @default "pinnedBy"
|
|
91
|
-
*/
|
|
92
|
-
pinnedByField?: string;
|
|
93
87
|
/**
|
|
94
88
|
* Field name for reply-to message ID.
|
|
95
89
|
*
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**-----------------------------------------------------------------------------------------
|
|
2
|
+
* Copyright © 2025 Progress Software Corporation. All rights reserved.
|
|
3
|
+
* Licensed under commercial license. See LICENSE.md in the project root for more information
|
|
4
|
+
*-------------------------------------------------------------------------------------------*/
|
|
5
|
+
import { ElementRef, Renderer2, NgZone, AfterViewInit, OnDestroy, EventEmitter } from '@angular/core';
|
|
6
|
+
import { SVGIcon } from '@progress/kendo-svg-icons';
|
|
7
|
+
import { LocalizationService } from '@progress/kendo-angular-l10n';
|
|
8
|
+
import { ScrollButtonType } from './utils';
|
|
9
|
+
import * as i0 from "@angular/core";
|
|
10
|
+
/**
|
|
11
|
+
* @hidden
|
|
12
|
+
*/
|
|
13
|
+
export declare class ChatScrollableButtonComponent implements AfterViewInit, OnDestroy {
|
|
14
|
+
host: ElementRef;
|
|
15
|
+
private renderer;
|
|
16
|
+
private ngZone;
|
|
17
|
+
private localization;
|
|
18
|
+
role: string;
|
|
19
|
+
prev: boolean;
|
|
20
|
+
onClick: EventEmitter<ScrollButtonType>;
|
|
21
|
+
get scrollButtonIconClass(): string;
|
|
22
|
+
get scrollButtonSVGIcon(): SVGIcon;
|
|
23
|
+
private chevronLeftIcon;
|
|
24
|
+
private chevronRightIcon;
|
|
25
|
+
private subs;
|
|
26
|
+
constructor(host: ElementRef, renderer: Renderer2, ngZone: NgZone, localization: LocalizationService);
|
|
27
|
+
ngAfterViewInit(): void;
|
|
28
|
+
ngOnDestroy(): void;
|
|
29
|
+
private clickHandler;
|
|
30
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<ChatScrollableButtonComponent, never>;
|
|
31
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<ChatScrollableButtonComponent, "[kendoChatScrollableButton]", never, { "prev": { "alias": "prev"; "required": false; }; }, { "onClick": "onClick"; }, never, never, true, never>;
|
|
32
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
/**-----------------------------------------------------------------------------------------
|
|
2
|
+
* Copyright © 2025 Progress Software Corporation. All rights reserved.
|
|
3
|
+
* Licensed under commercial license. See LICENSE.md in the project root for more information
|
|
4
|
+
*-------------------------------------------------------------------------------------------*/
|
|
5
|
+
import { NgZone } from '@angular/core';
|
|
6
|
+
import { Subject } from 'rxjs';
|
|
7
|
+
import { LocalizationService } from '@progress/kendo-angular-l10n';
|
|
8
|
+
import { SuggestedActionsComponent } from '../suggested-actions.component';
|
|
9
|
+
import * as i0 from "@angular/core";
|
|
10
|
+
/**
|
|
11
|
+
* @hidden
|
|
12
|
+
*/
|
|
13
|
+
export type ScrollButtonActiveStateChange = {
|
|
14
|
+
buttonType: string;
|
|
15
|
+
active: boolean;
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* @hidden
|
|
19
|
+
*/
|
|
20
|
+
export declare class SuggestionsScrollService {
|
|
21
|
+
private ngZone;
|
|
22
|
+
private localization;
|
|
23
|
+
owner: SuggestedActionsComponent;
|
|
24
|
+
position: number;
|
|
25
|
+
scrollButtonActiveStateChange: Subject<ScrollButtonActiveStateChange>;
|
|
26
|
+
get scrollElement(): HTMLElement;
|
|
27
|
+
get scrollContainerOverflowSize(): number;
|
|
28
|
+
get suggestionsOverflow(): boolean;
|
|
29
|
+
constructor(ngZone: NgZone, localization: LocalizationService);
|
|
30
|
+
toggleScrollButtonsState(): void;
|
|
31
|
+
onScroll(e: Event): void;
|
|
32
|
+
scrollSuggestions(direction: string): void;
|
|
33
|
+
updateScrollPosition(element: HTMLElement): void;
|
|
34
|
+
calculateListPosition(direction: string, scrollSpeed: number): void;
|
|
35
|
+
private toggleButtonActiveState;
|
|
36
|
+
private isDisabled;
|
|
37
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<SuggestionsScrollService, never>;
|
|
38
|
+
static ɵprov: i0.ɵɵInjectableDeclaration<SuggestionsScrollService>;
|
|
39
|
+
}
|