@progress/kendo-angular-conversational-ui 20.1.2-develop.2 → 21.0.0-develop.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (103) hide show
  1. package/chat/api/files-layout.d.ts +12 -0
  2. package/chat/api/index.d.ts +3 -1
  3. package/chat/api/message-settings.interface.d.ts +33 -0
  4. package/chat/api/message.interface.d.ts +5 -1
  5. package/chat/api/suggestions-layout.d.ts +20 -0
  6. package/chat/chat.component.d.ts +92 -34
  7. package/chat/chat.directives.d.ts +18 -0
  8. package/chat/chat.module.d.ts +15 -8
  9. package/chat/common/chat.service.d.ts +32 -3
  10. package/chat/common/models/model-fields.d.ts +0 -6
  11. package/chat/common/scroll-button.component.d.ts +32 -0
  12. package/chat/common/scroll.service.d.ts +39 -0
  13. package/chat/common/utils.d.ts +13 -1
  14. package/chat/l10n/messages.d.ts +9 -1
  15. package/chat/message-list.component.d.ts +20 -3
  16. package/chat/message.component.d.ts +40 -16
  17. package/chat/suggested-actions.component.d.ts +30 -5
  18. package/chat/templates/author-message-content-template.directive.d.ts +28 -0
  19. package/chat/templates/author-message-template.directive.d.ts +28 -0
  20. package/chat/templates/message-content-template.directive.d.ts +28 -0
  21. package/chat/templates/message-template.directive.d.ts +1 -1
  22. package/chat/templates/no-data-template.directive.d.ts +27 -0
  23. package/chat/templates/receiver-message-content-template.directive.d.ts +28 -0
  24. package/chat/templates/receiver-message-template.directive.d.ts +28 -0
  25. package/chat/templates/user-status-template.directive.d.ts +27 -0
  26. package/codemods/template-transformer/index.js +1 -2
  27. package/codemods/utils.js +2 -2
  28. package/codemods/v20/chat-user.js +1 -1
  29. package/conversational-ui.module.d.ts +18 -11
  30. package/directives.d.ts +9 -2
  31. package/esm2022/ai-prompt/aiprompt.component.mjs +13 -11
  32. package/esm2022/ai-prompt/aiprompt.module.mjs +4 -4
  33. package/esm2022/ai-prompt/common/aiprompt.service.mjs +3 -3
  34. package/esm2022/ai-prompt/common/output-card.component.mjs +4 -4
  35. package/esm2022/ai-prompt/common/toolbar-focusable.directive.mjs +4 -4
  36. package/esm2022/ai-prompt/common/toolbar-navigation.service.mjs +4 -4
  37. package/esm2022/ai-prompt/localization/custom-messages.component.mjs +4 -4
  38. package/esm2022/ai-prompt/localization/localized-messages.directive.mjs +4 -4
  39. package/esm2022/ai-prompt/localization/messages.mjs +3 -3
  40. package/esm2022/ai-prompt/templates/aiprompt-output-body-template.directive.mjs +4 -4
  41. package/esm2022/ai-prompt/templates/aiprompt-output-template.directive.mjs +4 -4
  42. package/esm2022/ai-prompt/templates/toolbar-actions.template.mjs +5 -5
  43. package/esm2022/ai-prompt/views/base-view.mjs +5 -5
  44. package/esm2022/ai-prompt/views/command-view.component.mjs +4 -4
  45. package/esm2022/ai-prompt/views/custom-view.component.mjs +4 -4
  46. package/esm2022/ai-prompt/views/output-view.component.mjs +4 -4
  47. package/esm2022/ai-prompt/views/prompt-view.component.mjs +4 -4
  48. package/esm2022/chat/api/index.mjs +3 -1
  49. package/{chat/api/message-toolbar-visibility.d.ts → esm2022/chat/api/message-settings.interface.mjs} +1 -4
  50. package/esm2022/chat/api/suggestions-layout.mjs +5 -0
  51. package/esm2022/chat/attachment.component.mjs +3 -3
  52. package/esm2022/chat/builtin-actions.mjs +2 -0
  53. package/esm2022/chat/cards/hero-card.component.mjs +3 -3
  54. package/esm2022/chat/chat-file.component.mjs +6 -6
  55. package/esm2022/chat/chat.component.mjs +268 -74
  56. package/esm2022/chat/chat.directives.mjs +18 -0
  57. package/esm2022/chat/chat.module.mjs +18 -11
  58. package/esm2022/chat/common/chat.service.mjs +86 -7
  59. package/esm2022/chat/common/models/default-model-fields.mjs +0 -1
  60. package/esm2022/chat/common/scroll-anchor.directive.mjs +4 -4
  61. package/esm2022/chat/common/scroll-button.component.mjs +81 -0
  62. package/esm2022/chat/common/scroll.service.mjs +110 -0
  63. package/esm2022/chat/common/utils.mjs +22 -3
  64. package/esm2022/chat/l10n/custom-messages.component.mjs +4 -4
  65. package/esm2022/chat/l10n/localized-messages.directive.mjs +4 -4
  66. package/esm2022/chat/l10n/messages.mjs +15 -3
  67. package/esm2022/chat/message-attachments.component.mjs +6 -6
  68. package/esm2022/chat/message-box.component.mjs +12 -7
  69. package/esm2022/chat/message-list.component.mjs +168 -22
  70. package/esm2022/chat/message-reference-content.component.mjs +4 -4
  71. package/esm2022/chat/message.component.mjs +491 -328
  72. package/esm2022/chat/suggested-actions.component.mjs +299 -81
  73. package/esm2022/chat/templates/attachment-template.directive.mjs +5 -5
  74. package/esm2022/chat/templates/author-message-content-template.directive.mjs +39 -0
  75. package/esm2022/chat/templates/author-message-template.directive.mjs +39 -0
  76. package/esm2022/chat/templates/header-template.directive.mjs +4 -4
  77. package/esm2022/chat/templates/message-box.directive.mjs +4 -4
  78. package/esm2022/chat/templates/message-content-template.directive.mjs +39 -0
  79. package/esm2022/chat/templates/message-template.directive.mjs +6 -6
  80. package/esm2022/chat/templates/no-data-template.directive.mjs +38 -0
  81. package/esm2022/chat/templates/receiver-message-content-template.directive.mjs +39 -0
  82. package/esm2022/chat/templates/receiver-message-template.directive.mjs +39 -0
  83. package/esm2022/chat/templates/status-template.directive.mjs +4 -4
  84. package/esm2022/chat/templates/suggestion-template.directive.mjs +4 -4
  85. package/esm2022/chat/templates/timestamp-template.directive.mjs +5 -5
  86. package/esm2022/chat/templates/user-status-template.directive.mjs +38 -0
  87. package/esm2022/conversational-ui.module.mjs +21 -14
  88. package/esm2022/directives.mjs +15 -1
  89. package/esm2022/index.mjs +7 -0
  90. package/esm2022/inline-ai-prompt/inlineaiprompt-content.component.mjs +5 -5
  91. package/esm2022/inline-ai-prompt/inlineaiprompt.component.mjs +4 -4
  92. package/esm2022/inline-ai-prompt/inlineaiprompt.module.mjs +4 -4
  93. package/esm2022/inline-ai-prompt/inlineaiprompt.service.mjs +4 -4
  94. package/esm2022/inline-ai-prompt/localization/custom-messages.component.mjs +4 -4
  95. package/esm2022/inline-ai-prompt/localization/localized-messages.directive.mjs +4 -4
  96. package/esm2022/inline-ai-prompt/localization/messages.mjs +3 -3
  97. package/esm2022/inline-ai-prompt/output-template.directive.mjs +5 -5
  98. package/esm2022/package-metadata.mjs +2 -2
  99. package/fesm2022/progress-kendo-angular-conversational-ui.mjs +1969 -739
  100. package/index.d.ts +7 -0
  101. package/package.json +18 -18
  102. package/schematics/ngAdd/index.js +1 -1
  103. /package/esm2022/chat/api/{message-toolbar-visibility.mjs → files-layout.mjs} +0 -0
@@ -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';
@@ -10,13 +10,20 @@ import * as i0 from "@angular/core";
10
10
  import * as i1 from "./chat.component";
11
11
  import * as i2 from "./l10n/custom-messages.component";
12
12
  import * as i3 from "./templates/attachment-template.directive";
13
- import * as i4 from "./templates/message-template.directive";
14
- import * as i5 from "./cards/hero-card.component";
15
- import * as i6 from "./templates/message-box.directive";
16
- import * as i7 from "./templates/header-template.directive";
17
- import * as i8 from "./templates/timestamp-template.directive";
18
- import * as i9 from "./templates/status-template.directive";
19
- import * as i10 from "./templates/suggestion-template.directive";
13
+ import * as i4 from "./templates/author-message-content-template.directive";
14
+ import * as i5 from "./templates/receiver-message-content-template.directive";
15
+ import * as i6 from "./templates/message-content-template.directive";
16
+ import * as i7 from "./templates/author-message-template.directive";
17
+ import * as i8 from "./templates/receiver-message-template.directive";
18
+ import * as i9 from "./templates/message-template.directive";
19
+ import * as i10 from "./cards/hero-card.component";
20
+ import * as i11 from "./templates/message-box.directive";
21
+ import * as i12 from "./templates/header-template.directive";
22
+ import * as i13 from "./templates/no-data-template.directive";
23
+ import * as i14 from "./templates/timestamp-template.directive";
24
+ import * as i15 from "./templates/status-template.directive";
25
+ import * as i16 from "./templates/suggestion-template.directive";
26
+ import * as i17 from "./templates/user-status-template.directive";
20
27
  // IMPORTANT: NgModule export kept for backwards compatibility
21
28
  /**
22
29
  * Represents the [`NgModule`](link:site.data.urls.angular['ngmodules']) for the Chat component.
@@ -40,11 +47,11 @@ import * as i10 from "./templates/suggestion-template.directive";
40
47
  * ```
41
48
  */
42
49
  export class ChatModule {
43
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ChatModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
44
- static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "16.2.12", ngImport: i0, type: ChatModule, imports: [i1.ChatComponent, i2.CustomMessagesComponent, i3.AttachmentTemplateDirective, i4.MessageTemplateDirective, i5.HeroCardComponent, i6.ChatMessageBoxTemplateDirective, i7.ChatHeaderTemplateDirective, i8.ChatTimestampTemplateDirective, i9.ChatStatusTemplateDirective, i10.ChatSuggestionTemplateDirective], exports: [i1.ChatComponent, i2.CustomMessagesComponent, i3.AttachmentTemplateDirective, i4.MessageTemplateDirective, i5.HeroCardComponent, i6.ChatMessageBoxTemplateDirective, i7.ChatHeaderTemplateDirective, i8.ChatTimestampTemplateDirective, i9.ChatStatusTemplateDirective, i10.ChatSuggestionTemplateDirective] });
45
- static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ChatModule, providers: [IconsService, ResizeBatchService], imports: [i1.ChatComponent, i5.HeroCardComponent] });
50
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChatModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
51
+ static ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "18.2.14", ngImport: i0, type: ChatModule, imports: [i1.ChatComponent, i2.CustomMessagesComponent, i3.AttachmentTemplateDirective, i4.AuthorMessageContentTemplateDirective, i5.ReceiverMessageContentTemplateDirective, i6.MessageContentTemplateDirective, i7.AuthorMessageTemplateDirective, i8.ReceiverMessageTemplateDirective, i9.MessageTemplateDirective, i10.HeroCardComponent, i11.ChatMessageBoxTemplateDirective, i12.ChatHeaderTemplateDirective, i13.NoDataTemplateDirective, i14.ChatTimestampTemplateDirective, i15.ChatStatusTemplateDirective, i16.ChatSuggestionTemplateDirective, i17.ChatUserStatusTemplateDirective], exports: [i1.ChatComponent, i2.CustomMessagesComponent, i3.AttachmentTemplateDirective, i4.AuthorMessageContentTemplateDirective, i5.ReceiverMessageContentTemplateDirective, i6.MessageContentTemplateDirective, i7.AuthorMessageTemplateDirective, i8.ReceiverMessageTemplateDirective, i9.MessageTemplateDirective, i10.HeroCardComponent, i11.ChatMessageBoxTemplateDirective, i12.ChatHeaderTemplateDirective, i13.NoDataTemplateDirective, i14.ChatTimestampTemplateDirective, i15.ChatStatusTemplateDirective, i16.ChatSuggestionTemplateDirective, i17.ChatUserStatusTemplateDirective] });
52
+ static ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChatModule, providers: [IconsService, ResizeBatchService], imports: [i1.ChatComponent, i10.HeroCardComponent] });
46
53
  }
47
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ChatModule, decorators: [{
54
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChatModule, decorators: [{
48
55
  type: NgModule,
49
56
  args: [{
50
57
  exports: [...KENDO_CHAT],
@@ -4,7 +4,7 @@
4
4
  *-------------------------------------------------------------------------------------------*/
5
5
  import { Injectable } from '@angular/core';
6
6
  import { Subject } from 'rxjs';
7
- import { STB_DEFAULT_SETTINGS, SEND_BTN_DEFAULT_SETTINGS, FILESELECT_DEFAULT_SETTINGS } from './utils';
7
+ import { STB_DEFAULT_SETTINGS, SEND_BTN_DEFAULT_SETTINGS, FILESELECT_DEFAULT_SETTINGS, SUGGESTIONS_LAYOUT_DEFAULT_SETTINGS } from './utils';
8
8
  import * as i0 from "@angular/core";
9
9
  /**
10
10
  * @hidden
@@ -12,26 +12,42 @@ import * as i0 from "@angular/core";
12
12
  export class ChatService {
13
13
  authorId;
14
14
  messageWidthMode;
15
- allowMessageCollapse;
16
15
  messageToolbarActions = [];
17
16
  messageContextMenuActions = [];
17
+ calculatedContextMenuActions = [];
18
18
  fileActions = [];
19
- messageToolbarVisibility = 'hidden';
20
19
  toggleMessageState = false;
21
20
  reply;
22
21
  messages = [];
23
22
  chatElement;
24
23
  messageElementsMap = new Map();
24
+ messagesContextMenu;
25
+ activeMessage;
26
+ activeMessageElement;
27
+ selectOnMenuClose = false;
28
+ active = false;
29
+ messageFilesLayout = 'vertical';
25
30
  _enableSpeechToText = STB_DEFAULT_SETTINGS;
26
31
  _enableFileSelect = FILESELECT_DEFAULT_SETTINGS;
27
32
  _sendButtonSettings = SEND_BTN_DEFAULT_SETTINGS;
33
+ _suggestionsLayout = SUGGESTIONS_LAYOUT_DEFAULT_SETTINGS;
34
+ _quickActionsLayout = SUGGESTIONS_LAYOUT_DEFAULT_SETTINGS;
35
+ _authorMessageSettings;
36
+ _receiverMessageSettings;
37
+ _allowMessageCollapse;
28
38
  subjects = {
29
39
  toolbarAction: new Subject(),
30
40
  contextMenuAction: new Subject(),
31
41
  fileAction: new Subject(),
32
42
  fileDownload: new Subject(),
33
43
  replyReferenceClick: new Subject(),
34
- inputValueChange: new Subject()
44
+ inputValueChange: new Subject(),
45
+ contextMenuVisibilityChange: new Subject(),
46
+ suggestionsLayoutChange: new Subject(),
47
+ quickActionsLayoutChange: new Subject(),
48
+ authorMessageSettingsChange: new Subject(),
49
+ receiverMessageSettingsChange: new Subject(),
50
+ allowMessageCollapseChange: new Subject(),
35
51
  };
36
52
  toolbarAction$ = this.subjects.toolbarAction.asObservable();
37
53
  contextMenuAction$ = this.subjects.contextMenuAction.asObservable();
@@ -39,6 +55,32 @@ export class ChatService {
39
55
  fileDownload$ = this.subjects.fileDownload.asObservable();
40
56
  replyReferenceClick$ = this.subjects.replyReferenceClick.asObservable();
41
57
  inputValueChange$ = this.subjects.inputValueChange.asObservable();
58
+ contextMenuVisibilityChange$ = this.subjects.contextMenuVisibilityChange.asObservable();
59
+ suggestionsLayoutChange$ = this.subjects.suggestionsLayoutChange.asObservable();
60
+ quickActionsLayoutChange$ = this.subjects.quickActionsLayoutChange.asObservable();
61
+ authorMessageSettingsChange$ = this.subjects.authorMessageSettingsChange.asObservable();
62
+ receiverMessageSettingsChange$ = this.subjects.receiverMessageSettingsChange.asObservable();
63
+ allowMessageCollapseChange$ = this.subjects.allowMessageCollapseChange.asObservable();
64
+ set authorMessageSettings(settings) {
65
+ const previousSettings = this._authorMessageSettings;
66
+ if (JSON.stringify(previousSettings) !== JSON.stringify(settings)) {
67
+ this.updateComponentSettings('_authorMessageSettings', settings, null);
68
+ this.emit('authorMessageSettingsChange', this._authorMessageSettings);
69
+ }
70
+ }
71
+ get authorMessageSettings() {
72
+ return this._authorMessageSettings;
73
+ }
74
+ set receiverMessageSettings(settings) {
75
+ const previousSettings = this._receiverMessageSettings;
76
+ if (JSON.stringify(previousSettings) !== JSON.stringify(settings)) {
77
+ this.updateComponentSettings('_receiverMessageSettings', settings, null);
78
+ this.emit('receiverMessageSettingsChange', this._receiverMessageSettings);
79
+ }
80
+ }
81
+ get receiverMessageSettings() {
82
+ return this._receiverMessageSettings;
83
+ }
42
84
  set enableSpeechToText(settings) {
43
85
  this.updateComponentSettings('_enableSpeechToText', settings, STB_DEFAULT_SETTINGS);
44
86
  }
@@ -57,6 +99,38 @@ export class ChatService {
57
99
  get sendButtonSettings() {
58
100
  return this._sendButtonSettings;
59
101
  }
102
+ set suggestionsLayout(layoutMode) {
103
+ this._suggestionsLayout = layoutMode;
104
+ this.emit('suggestionsLayoutChange', this._suggestionsLayout);
105
+ }
106
+ get suggestionsLayout() {
107
+ return this._suggestionsLayout;
108
+ }
109
+ set quickActionsLayout(layoutMode) {
110
+ this._quickActionsLayout = layoutMode;
111
+ this.emit('quickActionsLayoutChange', this._quickActionsLayout);
112
+ }
113
+ get quickActionsLayout() {
114
+ return this._quickActionsLayout;
115
+ }
116
+ set allowMessageCollapse(value) {
117
+ const previousValue = this._allowMessageCollapse;
118
+ if (previousValue !== value) {
119
+ this._allowMessageCollapse = value;
120
+ this.emit('allowMessageCollapseChange', this._allowMessageCollapse);
121
+ }
122
+ }
123
+ get allowMessageCollapse() {
124
+ return this._allowMessageCollapse;
125
+ }
126
+ calculateContextMenuActions(isOwn) {
127
+ const settings = isOwn ? this.authorMessageSettings : this.receiverMessageSettings;
128
+ if (settings?.messageContextMenuActions) {
129
+ this.calculatedContextMenuActions = settings.messageContextMenuActions;
130
+ return;
131
+ }
132
+ this.calculatedContextMenuActions = this.messageContextMenuActions || [];
133
+ }
60
134
  emit(subjectKey, value) {
61
135
  (this.subjects[subjectKey]).next(value);
62
136
  }
@@ -78,6 +152,11 @@ export class ChatService {
78
152
  elementRef.nativeElement.scrollIntoView({ behavior: 'smooth', block: 'nearest' });
79
153
  }
80
154
  }
155
+ focusActiveMessageElement() {
156
+ if (this.activeMessageElement) {
157
+ this.activeMessageElement.element?.nativeElement?.focus();
158
+ }
159
+ }
81
160
  updateComponentSettings(property, settings, defaultSettings) {
82
161
  if (settings === true) {
83
162
  this[property] = defaultSettings;
@@ -89,9 +168,9 @@ export class ChatService {
89
168
  this[property] = { ...defaultSettings, ...settings };
90
169
  }
91
170
  }
92
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ChatService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
93
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ChatService });
171
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChatService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
172
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChatService });
94
173
  }
95
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ChatService, decorators: [{
174
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChatService, decorators: [{
96
175
  type: Injectable
97
176
  }] });
@@ -19,7 +19,6 @@ export const defaultModelFields = {
19
19
  attachmentLayoutField: 'attachmentLayout',
20
20
  suggestedActionsField: 'suggestedActions',
21
21
  isPinnedField: 'isPinned',
22
- pinnedByField: 'pinnedBy',
23
22
  replyToIdField: 'replyToId',
24
23
  isDeletedField: 'isDeleted',
25
24
  typingField: 'typing'
@@ -60,17 +60,17 @@ export class ScrollAnchorDirective {
60
60
  this.scrolling = true;
61
61
  this.zone.runOutsideAngular(() => setTimeout(() => this.scrolling = false, 1000));
62
62
  }
63
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ScrollAnchorDirective, deps: [{ token: i0.ElementRef }, { token: i0.NgZone }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive });
64
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: ScrollAnchorDirective, isStandalone: true, selector: "[kendoChatScrollAnchor]", inputs: { autoScroll: "autoScroll" }, outputs: { autoScrollChange: "autoScrollChange" }, host: { properties: { "style.overflow-anchor": "this.overflowAnchor" } }, exportAs: ["scrollAnchor"], ngImport: i0 });
63
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ScrollAnchorDirective, deps: [{ token: i0.ElementRef }, { token: i0.NgZone }, { token: i0.Renderer2 }], target: i0.ɵɵFactoryTarget.Directive });
64
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.14", type: ScrollAnchorDirective, isStandalone: true, selector: "[kendoChatScrollAnchor]", inputs: { autoScroll: "autoScroll" }, outputs: { autoScrollChange: "autoScrollChange" }, host: { properties: { "style.overflow-anchor": "this.overflowAnchor" } }, exportAs: ["scrollAnchor"], ngImport: i0 });
65
65
  }
66
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: ScrollAnchorDirective, decorators: [{
66
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ScrollAnchorDirective, decorators: [{
67
67
  type: Directive,
68
68
  args: [{
69
69
  selector: '[kendoChatScrollAnchor]',
70
70
  exportAs: 'scrollAnchor',
71
71
  standalone: true
72
72
  }]
73
- }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i0.NgZone }, { type: i0.Renderer2 }]; }, propDecorators: { autoScroll: [{
73
+ }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.NgZone }, { type: i0.Renderer2 }], propDecorators: { autoScroll: [{
74
74
  type: Input
75
75
  }], autoScrollChange: [{
76
76
  type: Output
@@ -0,0 +1,81 @@
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 { Component, ElementRef, HostBinding, Input, Renderer2, NgZone, Output, EventEmitter, } from '@angular/core';
6
+ import { Subscription } from 'rxjs';
7
+ import { chevronLeftIcon, chevronRightIcon } from '@progress/kendo-svg-icons';
8
+ import { LocalizationService } from '@progress/kendo-angular-l10n';
9
+ import { IconWrapperComponent } from '@progress/kendo-angular-icons';
10
+ import * as i0 from "@angular/core";
11
+ import * as i1 from "@progress/kendo-angular-l10n";
12
+ const DIRECTION_CLASSES = {
13
+ left: 'chevron-left',
14
+ right: 'chevron-right',
15
+ };
16
+ /**
17
+ * @hidden
18
+ */
19
+ export class ChatScrollableButtonComponent {
20
+ host;
21
+ renderer;
22
+ ngZone;
23
+ localization;
24
+ role = 'button';
25
+ prev = false;
26
+ onClick = new EventEmitter();
27
+ get scrollButtonIconClass() {
28
+ const defaultPrevIcon = !this.localization.rtl ? DIRECTION_CLASSES.left : DIRECTION_CLASSES.right;
29
+ const defaultNextIcon = !this.localization.rtl ? DIRECTION_CLASSES.right : DIRECTION_CLASSES.left;
30
+ return this.prev ? defaultPrevIcon : defaultNextIcon;
31
+ }
32
+ get scrollButtonSVGIcon() {
33
+ const defaultPrevSVGIcon = !this.localization.rtl ? this.chevronLeftIcon : this.chevronRightIcon;
34
+ const defaultNextSVGIcon = !this.localization.rtl ? this.chevronRightIcon : this.chevronLeftIcon;
35
+ return this.prev ? defaultPrevSVGIcon : defaultNextSVGIcon;
36
+ }
37
+ chevronLeftIcon = chevronLeftIcon;
38
+ chevronRightIcon = chevronRightIcon;
39
+ subs = new Subscription();
40
+ constructor(host, renderer, ngZone, localization) {
41
+ this.host = host;
42
+ this.renderer = renderer;
43
+ this.ngZone = ngZone;
44
+ this.localization = localization;
45
+ }
46
+ ngAfterViewInit() {
47
+ this.ngZone.runOutsideAngular(() => {
48
+ this.subs.add(this.renderer.listen(this.host.nativeElement, 'click', () => this.clickHandler()));
49
+ });
50
+ }
51
+ ngOnDestroy() {
52
+ this.subs.unsubscribe();
53
+ }
54
+ clickHandler() {
55
+ const buttonType = this.prev ? 'prev' : 'next';
56
+ this.onClick.emit(buttonType);
57
+ }
58
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChatScrollableButtonComponent, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i0.NgZone }, { token: i1.LocalizationService }], target: i0.ɵɵFactoryTarget.Component });
59
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: ChatScrollableButtonComponent, isStandalone: true, selector: "[kendoChatScrollableButton]", inputs: { prev: "prev" }, outputs: { onClick: "onClick" }, host: { properties: { "attr.role": "this.role" } }, ngImport: i0, template: `
60
+ <kendo-icon-wrapper [name]="scrollButtonIconClass" [svgIcon]="scrollButtonSVGIcon" innerCssClass="k-button-icon"> </kendo-icon-wrapper>
61
+ `, isInline: true, dependencies: [{ kind: "component", type: IconWrapperComponent, selector: "kendo-icon-wrapper", inputs: ["name", "svgIcon", "innerCssClass", "customFontClass", "size"], exportAs: ["kendoIconWrapper"] }] });
62
+ }
63
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: ChatScrollableButtonComponent, decorators: [{
64
+ type: Component,
65
+ args: [{
66
+ template: `
67
+ <kendo-icon-wrapper [name]="scrollButtonIconClass" [svgIcon]="scrollButtonSVGIcon" innerCssClass="k-button-icon"> </kendo-icon-wrapper>
68
+ `,
69
+ // eslint-disable-next-line @angular-eslint/component-selector
70
+ selector: '[kendoChatScrollableButton]',
71
+ standalone: true,
72
+ imports: [IconWrapperComponent],
73
+ }]
74
+ }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i0.NgZone }, { type: i1.LocalizationService }], propDecorators: { role: [{
75
+ type: HostBinding,
76
+ args: ['attr.role']
77
+ }], prev: [{
78
+ type: Input
79
+ }], onClick: [{
80
+ type: Output
81
+ }] } });
@@ -0,0 +1,110 @@
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 { Injectable, NgZone } from '@angular/core';
6
+ import { isDocumentAvailable } from '@progress/kendo-angular-common';
7
+ import { Subject } from 'rxjs';
8
+ import { LocalizationService } from '@progress/kendo-angular-l10n';
9
+ import * as i0 from "@angular/core";
10
+ import * as i1 from "@progress/kendo-angular-l10n";
11
+ const DEFAULT_SCROLL_BEHAVIOR = 'smooth';
12
+ const DEFAULT_SCROLL_SPEED = 100;
13
+ /**
14
+ * @hidden
15
+ */
16
+ export class SuggestionsScrollService {
17
+ ngZone;
18
+ localization;
19
+ owner;
20
+ position = 0;
21
+ scrollButtonActiveStateChange = new Subject();
22
+ get scrollElement() {
23
+ return this.owner.suggestionsContainer?.nativeElement;
24
+ }
25
+ get scrollContainerOverflowSize() {
26
+ if (!isDocumentAvailable()) {
27
+ return 0;
28
+ }
29
+ if (!this.scrollElement) {
30
+ return 0;
31
+ }
32
+ const overflowSize = Math.floor(this.scrollElement.scrollWidth - this.scrollElement.offsetWidth);
33
+ return overflowSize < 0 ? 0 : overflowSize;
34
+ }
35
+ get suggestionsOverflow() {
36
+ return this.scrollContainerOverflowSize > 0;
37
+ }
38
+ constructor(ngZone, localization) {
39
+ this.ngZone = ngZone;
40
+ this.localization = localization;
41
+ }
42
+ toggleScrollButtonsState() {
43
+ const suggestedActions = this.owner;
44
+ if (!suggestedActions?.hasScrollButtons) {
45
+ return;
46
+ }
47
+ const currentPrevButtonActive = !this.isDisabled('prev');
48
+ const currentNextButtonActive = !this.isDisabled('next');
49
+ const defaultOffset = 1;
50
+ const rtlDelta = this.localization.rtl ? -1 : 1;
51
+ const calculatedPrevButtonActive = (this.position * rtlDelta) > 0 && this.scrollContainerOverflowSize > 0;
52
+ const calculatedNextButtonActive = (this.position * rtlDelta) < this.scrollContainerOverflowSize - defaultOffset && this.scrollContainerOverflowSize > 0;
53
+ if (calculatedPrevButtonActive !== currentPrevButtonActive) {
54
+ this.ngZone.run(() => this.toggleButtonActiveState('prev', calculatedPrevButtonActive));
55
+ }
56
+ if (calculatedNextButtonActive !== currentNextButtonActive) {
57
+ this.ngZone.run(() => this.toggleButtonActiveState('next', calculatedNextButtonActive));
58
+ }
59
+ }
60
+ onScroll(e) {
61
+ this.position = e.target.scrollLeft;
62
+ this.toggleScrollButtonsState();
63
+ }
64
+ scrollSuggestions(direction) {
65
+ this.calculateListPosition(direction, DEFAULT_SCROLL_SPEED);
66
+ if (this.scrollElement) {
67
+ this.scrollElement.scrollTo({ left: this.position, behavior: DEFAULT_SCROLL_BEHAVIOR });
68
+ }
69
+ this.toggleScrollButtonsState();
70
+ }
71
+ updateScrollPosition(element) {
72
+ this.position = element.scrollLeft;
73
+ }
74
+ calculateListPosition(direction, scrollSpeed) {
75
+ if (direction === 'prev') {
76
+ if (!this.localization.rtl) {
77
+ this.position = this.position - scrollSpeed <= 0 ? 0 : this.position - scrollSpeed;
78
+ }
79
+ else {
80
+ this.position = this.position + scrollSpeed >= 0 ? 0 : this.position + scrollSpeed;
81
+ }
82
+ }
83
+ else if (direction === 'next' && this.position < this.scrollContainerOverflowSize) {
84
+ if (this.position + scrollSpeed > this.scrollContainerOverflowSize) {
85
+ if (this.localization.rtl) {
86
+ this.position = -this.scrollContainerOverflowSize;
87
+ }
88
+ else {
89
+ this.position = this.scrollContainerOverflowSize;
90
+ }
91
+ return;
92
+ }
93
+ if (this.localization.rtl) {
94
+ this.position -= scrollSpeed;
95
+ }
96
+ else {
97
+ this.position += scrollSpeed;
98
+ }
99
+ }
100
+ }
101
+ toggleButtonActiveState(buttonType, active) {
102
+ this.scrollButtonActiveStateChange.next({ buttonType, active });
103
+ }
104
+ isDisabled = (buttonType) => this.owner[`${buttonType}ScrollButton`]?.nativeElement.classList.contains('k-disabled');
105
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SuggestionsScrollService, deps: [{ token: i0.NgZone }, { token: i1.LocalizationService }], target: i0.ɵɵFactoryTarget.Injectable });
106
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SuggestionsScrollService });
107
+ }
108
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: SuggestionsScrollService, decorators: [{
109
+ type: Injectable
110
+ }], ctorParameters: () => [{ type: i0.NgZone }, { type: i1.LocalizationService }] });
@@ -67,6 +67,10 @@ export const FILESELECT_DEFAULT_SETTINGS = {
67
67
  multiple: true,
68
68
  disabled: false
69
69
  };
70
+ /**
71
+ * @hidden
72
+ */
73
+ export const SUGGESTIONS_LAYOUT_DEFAULT_SETTINGS = 'scroll';
70
74
  /**
71
75
  * @hidden
72
76
  */
@@ -119,14 +123,16 @@ export const parseMessage = (message, fields) => {
119
123
  id: authorId,
120
124
  ...(authorName && { name: authorName }),
121
125
  ...(authorImageUrl && { avatarUrl: authorImageUrl }),
122
- ...(authorImageAltText && { avatarAltText: authorImageAltText })
126
+ ...(authorImageAltText && { avatarAltText: authorImageAltText }),
123
127
  };
124
128
  }
129
+ const timestampValue = getter(modelFields.timestampField)(message);
130
+ const timestamp = timestampValue instanceof Date ? timestampValue : new Date(timestampValue);
125
131
  return {
126
132
  id: getter(modelFields.idField)(message),
127
133
  text: getter(modelFields.textField)(message),
128
134
  author: author,
129
- timestamp: new Date(getter(modelFields.timestampField)(message)),
135
+ timestamp: timestamp,
130
136
  status: getter(modelFields.statusField)(message),
131
137
  files: getter(modelFields.filesField)(message),
132
138
  attachments: getter(modelFields.attachmentsField)(message),
@@ -135,6 +141,19 @@ export const parseMessage = (message, fields) => {
135
141
  isPinned: getter(modelFields.isPinnedField)(message),
136
142
  replyToId: getter(modelFields.replyToIdField)(message),
137
143
  isDeleted: getter(modelFields.isDeletedField)(message),
138
- typing: getter(modelFields.typingField)(message)
144
+ typing: getter(modelFields.typingField)(message),
145
+ dataItem: message
139
146
  };
140
147
  };
148
+ /**
149
+ * @hidden
150
+ */
151
+ export const transformActions = (actions) => {
152
+ return actions.map(action => ({
153
+ text: action.label,
154
+ icon: action.icon,
155
+ svgIcon: action.svgIcon,
156
+ disabled: action.disabled,
157
+ originalAction: action
158
+ }));
159
+ };
@@ -31,15 +31,15 @@ export class CustomMessagesComponent extends Messages {
31
31
  get override() {
32
32
  return true;
33
33
  }
34
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CustomMessagesComponent, deps: [{ token: i1.LocalizationService }], target: i0.ɵɵFactoryTarget.Component });
35
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: CustomMessagesComponent, isStandalone: true, selector: "kendo-chat-messages", providers: [
34
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CustomMessagesComponent, deps: [{ token: i1.LocalizationService }], target: i0.ɵɵFactoryTarget.Component });
35
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: CustomMessagesComponent, isStandalone: true, selector: "kendo-chat-messages", providers: [
36
36
  {
37
37
  provide: Messages,
38
38
  useExisting: forwardRef(() => CustomMessagesComponent)
39
39
  }
40
40
  ], usesInheritance: true, ngImport: i0, template: ``, isInline: true });
41
41
  }
42
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CustomMessagesComponent, decorators: [{
42
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: CustomMessagesComponent, decorators: [{
43
43
  type: Component,
44
44
  args: [{
45
45
  providers: [
@@ -52,4 +52,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
52
52
  template: ``,
53
53
  standalone: true
54
54
  }]
55
- }], ctorParameters: function () { return [{ type: i1.LocalizationService }]; } });
55
+ }], ctorParameters: () => [{ type: i1.LocalizationService }] });
@@ -17,15 +17,15 @@ export class LocalizedMessagesDirective extends Messages {
17
17
  super();
18
18
  this.service = service;
19
19
  }
20
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: LocalizedMessagesDirective, deps: [{ token: i1.LocalizationService }], target: i0.ɵɵFactoryTarget.Directive });
21
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: LocalizedMessagesDirective, isStandalone: true, selector: "[kendoChatLocalizedMessages]", providers: [
20
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LocalizedMessagesDirective, deps: [{ token: i1.LocalizationService }], target: i0.ɵɵFactoryTarget.Directive });
21
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.14", type: LocalizedMessagesDirective, isStandalone: true, selector: "[kendoChatLocalizedMessages]", providers: [
22
22
  {
23
23
  provide: Messages,
24
24
  useExisting: forwardRef(() => LocalizedMessagesDirective)
25
25
  }
26
26
  ], usesInheritance: true, ngImport: i0 });
27
27
  }
28
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: LocalizedMessagesDirective, decorators: [{
28
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: LocalizedMessagesDirective, decorators: [{
29
29
  type: Directive,
30
30
  args: [{
31
31
  providers: [
@@ -37,4 +37,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
37
37
  selector: '[kendoChatLocalizedMessages]',
38
38
  standalone: true
39
39
  }]
40
- }], ctorParameters: function () { return [{ type: i1.LocalizationService }]; } });
40
+ }], ctorParameters: () => [{ type: i1.LocalizationService }] });
@@ -74,10 +74,18 @@ export class Messages extends ComponentMessages {
74
74
  * Sets the title of the DropDownButton that opens the File actions.
75
75
  */
76
76
  fileActionsTitle;
77
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: Messages, deps: null, target: i0.ɵɵFactoryTarget.Directive });
78
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "16.2.12", type: Messages, selector: "kendoConversationalUIMessages", inputs: { deletedMessageSenderText: "deletedMessageSenderText", deletedMessageReceiverText: "deletedMessageReceiverText", downloadAllFilesText: "downloadAllFilesText", messagePlaceholder: "messagePlaceholder", send: "send", messageListLabel: "messageListLabel", messageBoxInputLabel: "messageBoxInputLabel", messageAttachmentLeftArrow: "messageAttachmentLeftArrow", messageAttachmentRightArrow: "messageAttachmentRightArrow", speechToTextButtonTitle: "speechToTextButtonTitle", fileSelectButtonTitle: "fileSelectButtonTitle", removeReplyTitle: "removeReplyTitle", removeFileTitle: "removeFileTitle", expandTitle: "expandTitle", collapseTitle: "collapseTitle", fileActionsTitle: "fileActionsTitle" }, usesInheritance: true, ngImport: i0 });
77
+ /**
78
+ * Sets the title of the button that shows the **Scroll right** when the suggestions list is scrollable with buttons.
79
+ */
80
+ nextSuggestionsButtonTitle;
81
+ /**
82
+ * Sets the title of the button that shows the **Scroll left** when the suggestions list is scrollable with buttons.
83
+ */
84
+ previousSuggestionsButtonTitle;
85
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: Messages, deps: null, target: i0.ɵɵFactoryTarget.Directive });
86
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.14", type: Messages, selector: "kendoConversationalUIMessages", inputs: { deletedMessageSenderText: "deletedMessageSenderText", deletedMessageReceiverText: "deletedMessageReceiverText", downloadAllFilesText: "downloadAllFilesText", messagePlaceholder: "messagePlaceholder", send: "send", messageListLabel: "messageListLabel", messageBoxInputLabel: "messageBoxInputLabel", messageAttachmentLeftArrow: "messageAttachmentLeftArrow", messageAttachmentRightArrow: "messageAttachmentRightArrow", speechToTextButtonTitle: "speechToTextButtonTitle", fileSelectButtonTitle: "fileSelectButtonTitle", removeReplyTitle: "removeReplyTitle", removeFileTitle: "removeFileTitle", expandTitle: "expandTitle", collapseTitle: "collapseTitle", fileActionsTitle: "fileActionsTitle", nextSuggestionsButtonTitle: "nextSuggestionsButtonTitle", previousSuggestionsButtonTitle: "previousSuggestionsButtonTitle" }, usesInheritance: true, ngImport: i0 });
79
87
  }
80
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: Messages, decorators: [{
88
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: Messages, decorators: [{
81
89
  type: Directive,
82
90
  args: [{
83
91
  // eslint-disable-next-line @angular-eslint/directive-selector
@@ -115,4 +123,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
115
123
  type: Input
116
124
  }], fileActionsTitle: [{
117
125
  type: Input
126
+ }], nextSuggestionsButtonTitle: [{
127
+ type: Input
128
+ }], previousSuggestionsButtonTitle: [{
129
+ type: Input
118
130
  }] } });
@@ -46,10 +46,10 @@ export class MessageAttachmentsComponent extends ChatItem {
46
46
  scrollSubscription;
47
47
  direction;
48
48
  get showLeftArrow() {
49
- return this.carousel && this.direction === 'rtl' ? this.scrollPosition > -1 : this.scrollPosition > 0;
49
+ return this.carousel && (this.direction === 'rtl' ? this.scrollPosition > -1 : this.scrollPosition > 0);
50
50
  }
51
51
  get showRightArrow() {
52
- return this.carousel && this.direction === 'rtl' ? this.scrollPosition < 0 : this.scrollPosition < 1;
52
+ return this.carousel && (this.direction === 'rtl' ? this.scrollPosition < 0 : this.scrollPosition < 1);
53
53
  }
54
54
  carouselKeyHandlers = {
55
55
  [Keys.ArrowLeft]: (e) => this.navigateTo(e, this.direction === 'rtl' ? 1 : -1),
@@ -131,8 +131,8 @@ export class MessageAttachmentsComponent extends ChatItem {
131
131
  textFor(key) {
132
132
  return this.localization.get(key);
133
133
  }
134
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MessageAttachmentsComponent, deps: [{ token: i0.NgZone }, { token: i1.LocalizationService }], target: i0.ɵɵFactoryTarget.Component });
135
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: MessageAttachmentsComponent, isStandalone: true, selector: "kendo-chat-message-attachments", inputs: { attachments: "attachments", layout: "layout", tabbable: "tabbable", template: "template", localization: "localization" }, host: { properties: { "class.k-card-deck-scrollwrap": "this.carousel" } }, providers: [{
134
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MessageAttachmentsComponent, deps: [{ token: i0.NgZone }, { token: i1.LocalizationService }], target: i0.ɵɵFactoryTarget.Component });
135
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.14", type: MessageAttachmentsComponent, isStandalone: true, selector: "kendo-chat-message-attachments", inputs: { attachments: "attachments", layout: "layout", tabbable: "tabbable", template: "template", localization: "localization" }, host: { properties: { "class.k-card-deck-scrollwrap": "this.carousel" } }, providers: [{
136
136
  provide: ChatItem,
137
137
  useExisting: forwardRef(() => MessageAttachmentsComponent)
138
138
  }], viewQueries: [{ propertyName: "deck", first: true, predicate: ["deck"], descendants: true, read: ElementRef, static: true }, { propertyName: "items", predicate: ["item"], descendants: true, read: ElementRef }], usesInheritance: true, ngImport: i0, template: `
@@ -178,7 +178,7 @@ export class MessageAttachmentsComponent extends ChatItem {
178
178
  </button>
179
179
  `, isInline: true, dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: ButtonComponent, selector: "button[kendoButton]", inputs: ["arrowIcon", "toggleable", "togglable", "selected", "tabIndex", "imageUrl", "iconClass", "icon", "disabled", "size", "rounded", "fillMode", "themeColor", "svgIcon", "primary", "look"], outputs: ["selectedChange", "click"], exportAs: ["kendoButton"] }, { kind: "directive", type: NgFor, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "component", type: AttachmentComponent, selector: "kendo-chat-attachment", inputs: ["attachment", "template"] }] });
180
180
  }
181
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: MessageAttachmentsComponent, decorators: [{
181
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.14", ngImport: i0, type: MessageAttachmentsComponent, decorators: [{
182
182
  type: Component,
183
183
  args: [{
184
184
  providers: [{
@@ -231,7 +231,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImpo
231
231
  standalone: true,
232
232
  imports: [NgIf, ButtonComponent, NgFor, AttachmentComponent]
233
233
  }]
234
- }], ctorParameters: function () { return [{ type: i0.NgZone }, { type: i1.LocalizationService }]; }, propDecorators: { attachments: [{
234
+ }], ctorParameters: () => [{ type: i0.NgZone }, { type: i1.LocalizationService }], propDecorators: { attachments: [{
235
235
  type: Input
236
236
  }], layout: [{
237
237
  type: Input