@memberjunction/ng-chat 3.4.0 → 4.1.0
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/README.md +88 -264
- package/dist/lib/chat/chat.component.d.ts +1 -0
- package/dist/lib/chat/chat.component.d.ts.map +1 -0
- package/dist/lib/chat/chat.component.js +13 -12
- package/dist/lib/chat/chat.component.js.map +1 -1
- package/dist/lib/module.d.ts +1 -0
- package/dist/lib/module.d.ts.map +1 -0
- package/dist/public-api.d.ts +1 -0
- package/dist/public-api.d.ts.map +1 -0
- package/package.json +14 -14
package/README.md
CHANGED
|
@@ -1,29 +1,38 @@
|
|
|
1
1
|
# @memberjunction/ng-chat
|
|
2
2
|
|
|
3
|
-
A reusable Angular component
|
|
3
|
+
A reusable Angular chat component for building AI-assisted conversations, chatbots, or peer-to-peer chat interfaces in MemberJunction applications.
|
|
4
4
|
|
|
5
5
|
## Overview
|
|
6
6
|
|
|
7
|
-
The `@memberjunction/ng-chat` package provides a feature-rich chat component with
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
7
|
+
The `@memberjunction/ng-chat` package provides a feature-rich chat component with markdown rendering, customizable welcome screens with suggested prompts, real-time message handling, auto-scrolling, loading indicators, and keyboard shortcuts. It can be used for AI conversations, customer support interfaces, or any messaging scenario.
|
|
8
|
+
|
|
9
|
+
```mermaid
|
|
10
|
+
graph TD
|
|
11
|
+
A[ChatModule] --> B[ChatComponent]
|
|
12
|
+
|
|
13
|
+
B --> C[Welcome Screen]
|
|
14
|
+
B --> D[Message List]
|
|
15
|
+
B --> E[Input Area]
|
|
16
|
+
|
|
17
|
+
C --> C1["AI Avatar
|
|
18
|
+
(large)"]
|
|
19
|
+
C --> C2["Suggested Questions
|
|
20
|
+
(up to 4)"]
|
|
21
|
+
|
|
22
|
+
D --> D1["User Messages"]
|
|
23
|
+
D --> D2["AI Messages
|
|
24
|
+
(with markdown)"]
|
|
25
|
+
D --> D3["Loading Indicator"]
|
|
26
|
+
|
|
27
|
+
E --> E1["Auto-Resize TextArea"]
|
|
28
|
+
E --> E2["Send Button"]
|
|
29
|
+
E --> E3["Clear Chat"]
|
|
30
|
+
|
|
31
|
+
style A fill:#2d6a9f,stroke:#1a4971,color:#fff
|
|
32
|
+
style B fill:#7c5295,stroke:#563a6b,color:#fff
|
|
33
|
+
style C fill:#2d8659,stroke:#1a5c3a,color:#fff
|
|
34
|
+
style D fill:#b8762f,stroke:#8a5722,color:#fff
|
|
35
|
+
```
|
|
27
36
|
|
|
28
37
|
## Installation
|
|
29
38
|
|
|
@@ -31,13 +40,6 @@ The `@memberjunction/ng-chat` package provides a feature-rich chat component wit
|
|
|
31
40
|
npm install @memberjunction/ng-chat
|
|
32
41
|
```
|
|
33
42
|
|
|
34
|
-
### Peer Dependencies
|
|
35
|
-
|
|
36
|
-
This package requires the following peer dependencies:
|
|
37
|
-
- `@angular/common`: ^18.0.2
|
|
38
|
-
- `@angular/core`: ^18.0.2
|
|
39
|
-
- `@angular/forms`: ^18.0.2
|
|
40
|
-
|
|
41
43
|
## Usage
|
|
42
44
|
|
|
43
45
|
### Import the Module
|
|
@@ -46,16 +48,12 @@ This package requires the following peer dependencies:
|
|
|
46
48
|
import { ChatModule } from '@memberjunction/ng-chat';
|
|
47
49
|
|
|
48
50
|
@NgModule({
|
|
49
|
-
imports: [
|
|
50
|
-
ChatModule,
|
|
51
|
-
// other imports
|
|
52
|
-
],
|
|
53
|
-
// ...
|
|
51
|
+
imports: [ChatModule]
|
|
54
52
|
})
|
|
55
53
|
export class YourModule { }
|
|
56
54
|
```
|
|
57
55
|
|
|
58
|
-
### Basic
|
|
56
|
+
### Basic Usage
|
|
59
57
|
|
|
60
58
|
```html
|
|
61
59
|
<mj-chat
|
|
@@ -79,10 +77,9 @@ import { ChatComponent, ChatMessage, ChatWelcomeQuestion } from '@memberjunction
|
|
|
79
77
|
#chatComponent
|
|
80
78
|
[AIImageURL]="'assets/bot-avatar.png'"
|
|
81
79
|
[AILargeImageURL]="'assets/bot-large.png'"
|
|
82
|
-
[InitialMessage]="'Hi!
|
|
80
|
+
[InitialMessage]="'Hi! How can I help you today?'"
|
|
83
81
|
[WelcomeQuestions]="welcomeQuestions"
|
|
84
82
|
[Placeholder]="'Ask me anything...'"
|
|
85
|
-
[ClearAllMessagesPrompt]="'Are you sure you want to clear this conversation?'"
|
|
86
83
|
(MessageAdded)="handleNewMessage($event)"
|
|
87
84
|
(ClearChatRequested)="handleClearChat()">
|
|
88
85
|
</mj-chat>
|
|
@@ -90,107 +87,36 @@ import { ChatComponent, ChatMessage, ChatWelcomeQuestion } from '@memberjunction
|
|
|
90
87
|
})
|
|
91
88
|
export class AIAssistantComponent {
|
|
92
89
|
@ViewChild('chatComponent') chatComponent!: ChatComponent;
|
|
93
|
-
|
|
90
|
+
|
|
94
91
|
welcomeQuestions: ChatWelcomeQuestion[] = [
|
|
95
|
-
{
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
},
|
|
100
|
-
{
|
|
101
|
-
topLine: 'Find information',
|
|
102
|
-
bottomLine: 'Search for customer details',
|
|
103
|
-
prompt: 'Find information about customer XYZ'
|
|
104
|
-
},
|
|
105
|
-
{
|
|
106
|
-
topLine: 'Summarize data',
|
|
107
|
-
bottomLine: 'Give me the key points from the data',
|
|
108
|
-
prompt: 'Summarize the key metrics from my dashboard'
|
|
109
|
-
},
|
|
110
|
-
{
|
|
111
|
-
topLine: 'Help with a task',
|
|
112
|
-
bottomLine: 'Walk me through creating a new entity',
|
|
113
|
-
prompt: 'Help me create a new entity in MemberJunction'
|
|
114
|
-
}
|
|
92
|
+
{ topLine: 'Generate a report', bottomLine: 'Create a sales summary', prompt: 'Generate a sales report for Q2' },
|
|
93
|
+
{ topLine: 'Find information', bottomLine: 'Search customer details', prompt: 'Find customer XYZ' },
|
|
94
|
+
{ topLine: 'Summarize data', bottomLine: 'Key metrics overview', prompt: 'Summarize dashboard metrics' },
|
|
95
|
+
{ topLine: 'Help with a task', bottomLine: 'Step-by-step guidance', prompt: 'Help me create a new entity' }
|
|
115
96
|
];
|
|
116
97
|
|
|
117
|
-
handleNewMessage(message: ChatMessage) {
|
|
118
|
-
// Process the new message
|
|
119
|
-
console.log('New message:', message);
|
|
120
|
-
|
|
98
|
+
async handleNewMessage(message: ChatMessage) {
|
|
121
99
|
if (message.senderType === 'user') {
|
|
122
|
-
|
|
123
|
-
|
|
100
|
+
this.chatComponent.ShowWaitingIndicator = true;
|
|
101
|
+
try {
|
|
102
|
+
const response = await this.aiService.getResponse(message.message);
|
|
103
|
+
this.chatComponent.SendMessage(response, 'Assistant', 'ai', null);
|
|
104
|
+
} finally {
|
|
105
|
+
this.chatComponent.ShowWaitingIndicator = false;
|
|
106
|
+
}
|
|
124
107
|
}
|
|
125
108
|
}
|
|
126
109
|
|
|
127
110
|
handleClearChat() {
|
|
128
|
-
// Clear any conversation state in your service
|
|
129
|
-
this.conversationHistory = [];
|
|
130
111
|
this.chatComponent.ClearAllMessages();
|
|
131
112
|
}
|
|
132
|
-
|
|
133
|
-
async processUserMessage(message: string) {
|
|
134
|
-
// Set loading state
|
|
135
|
-
this.chatComponent.ShowWaitingIndicator = true;
|
|
136
|
-
|
|
137
|
-
try {
|
|
138
|
-
// Call your AI or chat service
|
|
139
|
-
const response = await this.aiService.getResponse(message);
|
|
140
|
-
|
|
141
|
-
// Add AI response to chat
|
|
142
|
-
this.chatComponent.SendMessage(
|
|
143
|
-
response,
|
|
144
|
-
'Assistant',
|
|
145
|
-
'ai',
|
|
146
|
-
null
|
|
147
|
-
);
|
|
148
|
-
}
|
|
149
|
-
catch (error) {
|
|
150
|
-
console.error('Error getting AI response:', error);
|
|
151
|
-
// Show error message to user
|
|
152
|
-
this.chatComponent.SendMessage(
|
|
153
|
-
'Sorry, I encountered an error processing your request.',
|
|
154
|
-
'Assistant',
|
|
155
|
-
'ai',
|
|
156
|
-
null
|
|
157
|
-
);
|
|
158
|
-
}
|
|
159
|
-
finally {
|
|
160
|
-
// End loading state
|
|
161
|
-
this.chatComponent.ShowWaitingIndicator = false;
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
113
|
}
|
|
165
114
|
```
|
|
166
115
|
|
|
167
|
-
### Programmatic Message Sending
|
|
168
|
-
|
|
169
|
-
```typescript
|
|
170
|
-
// Send a user message programmatically
|
|
171
|
-
this.chatComponent.SendUserMessage('Hello, AI!');
|
|
172
|
-
|
|
173
|
-
// Send an AI message
|
|
174
|
-
this.chatComponent.SendMessage(
|
|
175
|
-
'Hello! How can I assist you today?',
|
|
176
|
-
'Assistant',
|
|
177
|
-
'ai',
|
|
178
|
-
messageId // optional ID for tracking
|
|
179
|
-
);
|
|
180
|
-
|
|
181
|
-
// Send a message without triggering the MessageAdded event
|
|
182
|
-
this.chatComponent.SendMessage(
|
|
183
|
-
'System message',
|
|
184
|
-
'System',
|
|
185
|
-
'ai',
|
|
186
|
-
null,
|
|
187
|
-
false // fireEvent = false
|
|
188
|
-
);
|
|
189
|
-
```
|
|
190
|
-
|
|
191
116
|
## API Reference
|
|
192
117
|
|
|
193
118
|
### Component Selector
|
|
119
|
+
|
|
194
120
|
`<mj-chat></mj-chat>`
|
|
195
121
|
|
|
196
122
|
### Inputs
|
|
@@ -211,173 +137,71 @@ this.chatComponent.SendMessage(
|
|
|
211
137
|
|
|
212
138
|
| Event | Type | Description |
|
|
213
139
|
|-------|------|-------------|
|
|
214
|
-
| `MessageAdded` | `EventEmitter<ChatMessage>` | Emitted when a new message is added
|
|
215
|
-
| `ClearChatRequested` | `EventEmitter<void>` | Emitted when user confirms clearing
|
|
140
|
+
| `MessageAdded` | `EventEmitter<ChatMessage>` | Emitted when a new message is added |
|
|
141
|
+
| `ClearChatRequested` | `EventEmitter<void>` | Emitted when user confirms clearing |
|
|
216
142
|
|
|
217
143
|
### Public Methods
|
|
218
144
|
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
- `message`: The message text (supports markdown)
|
|
227
|
-
- `senderName`: Display name of the sender
|
|
228
|
-
- `senderType`: Either 'user' or 'ai' for styling
|
|
229
|
-
- `id`: Optional ID for message tracking
|
|
230
|
-
- `fireEvent`: Whether to emit the MessageAdded event
|
|
231
|
-
|
|
232
|
-
#### `SendUserMessage(message: string): void`
|
|
233
|
-
Convenience method to send a user message. Automatically sets senderName to 'User' and senderType to 'user'.
|
|
234
|
-
|
|
235
|
-
#### `ClearAllMessages(): void`
|
|
236
|
-
Clears all messages from the chat and resets to initial state.
|
|
237
|
-
|
|
238
|
-
#### `HandleClearChat(): void`
|
|
239
|
-
Shows the confirmation dialog for clearing chat. This emits the ClearChatRequested event when confirmed.
|
|
145
|
+
| Method | Parameters | Description |
|
|
146
|
+
|--------|------------|-------------|
|
|
147
|
+
| `SendCurrentMessage()` | none | Sends the current input field content |
|
|
148
|
+
| `SendMessage()` | `message, senderName, senderType, id, fireEvent?` | Adds a message programmatically |
|
|
149
|
+
| `SendUserMessage()` | `message: string` | Convenience method for user messages |
|
|
150
|
+
| `ClearAllMessages()` | none | Clears all messages and resets to initial state |
|
|
151
|
+
| `HandleClearChat()` | none | Shows clear confirmation dialog |
|
|
240
152
|
|
|
241
153
|
### Classes
|
|
242
154
|
|
|
243
|
-
#### ChatMessage
|
|
244
|
-
|
|
245
155
|
```typescript
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
constructor(
|
|
253
|
-
message: string,
|
|
254
|
-
senderName: string,
|
|
255
|
-
senderType: 'user' | 'ai',
|
|
256
|
-
id: any = null
|
|
257
|
-
);
|
|
156
|
+
class ChatMessage {
|
|
157
|
+
message: string;
|
|
158
|
+
senderName: string;
|
|
159
|
+
senderType: 'user' | 'ai';
|
|
160
|
+
id?: unknown;
|
|
258
161
|
}
|
|
259
|
-
```
|
|
260
162
|
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
public topLine: string = ""; // Main text of the suggestion
|
|
266
|
-
public bottomLine: string = ""; // Supporting text/description
|
|
267
|
-
public prompt: string = ""; // The actual prompt to send when clicked
|
|
163
|
+
class ChatWelcomeQuestion {
|
|
164
|
+
topLine: string;
|
|
165
|
+
bottomLine: string;
|
|
166
|
+
prompt: string;
|
|
268
167
|
}
|
|
269
168
|
```
|
|
270
169
|
|
|
271
170
|
## Styling
|
|
272
171
|
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
- `.chat-message-wrap`: Container for each message
|
|
276
|
-
- `.chat-message`: The message content container
|
|
277
|
-
- `.chat-message-ai`: Additional class for AI messages
|
|
278
|
-
- `.chat-message-image`: Avatar/icon container
|
|
279
|
-
- `.chat-input-container`: Input area container
|
|
280
|
-
- `.chat-welcome-container`: Welcome screen container
|
|
281
|
-
|
|
282
|
-
You can override these styles in your global styles or component styles:
|
|
172
|
+
Key CSS classes for customization:
|
|
283
173
|
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
}
|
|
290
|
-
|
|
291
|
-
/* Example: Customize user avatar */
|
|
292
|
-
::ng-deep .chat-message-wrap:has(.chat-message:not(.chat-message-ai)) .chat-message-image {
|
|
293
|
-
color: #48bb78;
|
|
294
|
-
}
|
|
295
|
-
```
|
|
174
|
+
- `.chat-message-wrap` -- Container for each message
|
|
175
|
+
- `.chat-message` / `.chat-message-ai` -- Message content styling
|
|
176
|
+
- `.chat-message-image` -- Avatar container
|
|
177
|
+
- `.chat-input-container` -- Input area container
|
|
178
|
+
- `.chat-welcome-container` -- Welcome screen container
|
|
296
179
|
|
|
297
180
|
## Dependencies
|
|
298
181
|
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
-
|
|
307
|
-
|
|
308
|
-
### Integration with MemberJunction
|
|
182
|
+
| Package | Description |
|
|
183
|
+
|---------|-------------|
|
|
184
|
+
| `@memberjunction/core` | Core utilities |
|
|
185
|
+
| `@memberjunction/ng-container-directives` | Container directives |
|
|
186
|
+
| `@memberjunction/ng-shared-generic` | Shared generic components |
|
|
187
|
+
| `@memberjunction/ng-markdown` | Markdown rendering |
|
|
188
|
+
| `@progress/kendo-angular-indicators` | Loading spinner |
|
|
189
|
+
| `@progress/kendo-angular-buttons` | Button components |
|
|
190
|
+
| `@progress/kendo-angular-dialog` | Dialog for confirmations |
|
|
309
191
|
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
- Use with `@memberjunction/ai` for AI-powered conversations
|
|
313
|
-
- Combine with `@memberjunction/core-entities` for entity-aware chat
|
|
314
|
-
- Integrate with MemberJunction's authentication for user context
|
|
192
|
+
### Peer Dependencies
|
|
315
193
|
|
|
316
|
-
|
|
194
|
+
- `@angular/common` ^21.x
|
|
195
|
+
- `@angular/core` ^21.x
|
|
196
|
+
- `@angular/forms` ^21.x
|
|
317
197
|
|
|
318
|
-
|
|
198
|
+
## Build
|
|
319
199
|
|
|
320
200
|
```bash
|
|
321
|
-
|
|
201
|
+
cd packages/Angular/Generic/chat
|
|
322
202
|
npm run build
|
|
323
|
-
|
|
324
|
-
# From the repository root
|
|
325
|
-
turbo build --filter="@memberjunction/ng-chat"
|
|
326
|
-
```
|
|
327
|
-
|
|
328
|
-
The built files will be output to the `dist/` directory.
|
|
329
|
-
|
|
330
|
-
## Advanced Usage
|
|
331
|
-
|
|
332
|
-
### Custom Message Rendering
|
|
333
|
-
|
|
334
|
-
While the component handles markdown rendering by default, you can extend functionality by processing messages before sending:
|
|
335
|
-
|
|
336
|
-
```typescript
|
|
337
|
-
// Pre-process messages with custom formatting
|
|
338
|
-
const formattedMessage = this.formatMessage(userInput);
|
|
339
|
-
this.chatComponent.SendUserMessage(formattedMessage);
|
|
340
|
-
|
|
341
|
-
// Add metadata to messages using the id field
|
|
342
|
-
this.chatComponent.SendMessage(
|
|
343
|
-
response,
|
|
344
|
-
'Assistant',
|
|
345
|
-
'ai',
|
|
346
|
-
{ timestamp: Date.now(), tokens: 150, model: 'gpt-4' }
|
|
347
|
-
);
|
|
348
|
-
```
|
|
349
|
-
|
|
350
|
-
### Maintaining Conversation History
|
|
351
|
-
|
|
352
|
-
```typescript
|
|
353
|
-
// Store conversation for persistence
|
|
354
|
-
private saveConversation() {
|
|
355
|
-
const messages = this.chatComponent.Messages;
|
|
356
|
-
localStorage.setItem('chat-history', JSON.stringify(messages));
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
// Restore previous conversation
|
|
360
|
-
private loadConversation() {
|
|
361
|
-
const saved = localStorage.getItem('chat-history');
|
|
362
|
-
if (saved) {
|
|
363
|
-
const messages = JSON.parse(saved) as ChatMessage[];
|
|
364
|
-
messages.forEach(msg => {
|
|
365
|
-
this.chatComponent.SendMessage(
|
|
366
|
-
msg.message,
|
|
367
|
-
msg.senderName,
|
|
368
|
-
msg.senderType,
|
|
369
|
-
msg.id,
|
|
370
|
-
false // Don't fire events when restoring
|
|
371
|
-
);
|
|
372
|
-
});
|
|
373
|
-
}
|
|
374
|
-
}
|
|
375
203
|
```
|
|
376
204
|
|
|
377
|
-
##
|
|
205
|
+
## License
|
|
378
206
|
|
|
379
|
-
|
|
380
|
-
- Messages support full markdown syntax including code blocks, lists, and links
|
|
381
|
-
- The welcome screen is only shown when there are no messages
|
|
382
|
-
- Default icons use Font Awesome (fa-robot for AI, fa-user for users)
|
|
383
|
-
- The component uses Angular's ChangeDetectorRef for optimal performance
|
|
207
|
+
ISC
|
|
@@ -68,3 +68,4 @@ export declare class ChatComponent implements AfterViewInit {
|
|
|
68
68
|
static ɵfac: i0.ɵɵFactoryDeclaration<ChatComponent, never>;
|
|
69
69
|
static ɵcmp: i0.ɵɵComponentDeclaration<ChatComponent, "mj-chat", never, { "InitialMessage": { "alias": "InitialMessage"; "required": false; }; "Messages": { "alias": "Messages"; "required": false; }; "AIImageURL": { "alias": "AIImageURL"; "required": false; }; "AILargeImageURL": { "alias": "AILargeImageURL"; "required": false; }; "WelcomeQuestions": { "alias": "WelcomeQuestions"; "required": false; }; "ClearAllMessagesPrompt": { "alias": "ClearAllMessagesPrompt"; "required": false; }; "AllowSend": { "alias": "AllowSend"; "required": false; }; "Placeholder": { "alias": "Placeholder"; "required": false; }; "ShowWaitingIndicator": { "alias": "ShowWaitingIndicator"; "required": false; }; }, { "MessageAdded": "MessageAdded"; "ClearChatRequested": "ClearChatRequested"; }, never, never, false, never>;
|
|
70
70
|
}
|
|
71
|
+
//# sourceMappingURL=chat.component.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chat.component.d.ts","sourceRoot":"","sources":["../../../src/lib/chat/chat.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAa,UAAU,EAAE,YAAY,EAA4B,MAAM,eAAe,CAAC;AAChI,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAC;;AAI9D,qBAAa,mBAAmB;IACvB,OAAO,EAAE,MAAM,CAAI;IACnB,UAAU,EAAE,MAAM,CAAI;IACtB,MAAM,EAAE,MAAM,CAAI;CAC1B;AACD,qBAAa,WAAW;IACf,OAAO,EAAG,MAAM,CAAC;IACjB,UAAU,EAAG,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAU;IACnC,EAAE,CAAC,EAAE,GAAG,CAAC;gBAEJ,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,EAAE,EAAE,GAAE,GAAU;CAM3F;AAED,qBAMa,aAAc,YAAW,aAAa;IAuDrC,OAAO,CAAC,eAAe;IAAmB,OAAO,CAAC,EAAE;IAtDvD,cAAc,EAAE,MAAM,CAAM;IAC5B,QAAQ,EAAE,WAAW,EAAE,CAAM;IACtC;;OAEG;IACM,UAAU,EAAE,MAAM,CAAM;IACxB,eAAe,EAAE,MAAM,CAAM;IAEtC;;;OAGG;IACM,gBAAgB,EAAE,mBAAmB,EAAE,CAAM;IAEtD;;OAEG;IACM,sBAAsB,EAAE,MAAM,CAAkD;IAEzF;;;OAGG;IACM,SAAS,EAAE,OAAO,CAAQ;IAC5B,iBAAiB,EAAE,OAAO,CAAQ;IACzC;;OAEG;IACa,WAAW,EAAE,MAAM,CAAuB;IAE1D,OAAO,CAAC,qBAAqB,CAAkB;IAC/C,IAAoB,oBAAoB,IAAI,OAAO,CAElD;IACD,IAAW,oBAAoB,CAAC,KAAK,EAAE,OAAO,EAM7C;IAED,eAAe,IAAI,IAAI;IAIb,YAAY,4BAAmC;IAC/C,kBAAkB,qBAA4B;IAEN,OAAO,CAAC,iBAAiB,CAAc;IAClE,QAAQ,EAAE,UAAU,GAAG,SAAS,CAAC;IAEjD,cAAc,EAAE,MAAM,CAAM;IAC5B,qBAAqB,EAAE,OAAO,CAAS;gBAC1B,eAAe,EAAE,eAAe,EAAU,EAAE,EAAE,iBAAiB;IAE5E,kBAAkB,IAAI,IAAI;IAO1B,iBAAiB,CAAC,KAAK,EAAE,GAAG;IAMnC,SAAS,CAAC,eAAe;IAclB,WAAW,CAAC,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,SAAS,GAAE,OAAc,GAAG,IAAI;IAKrH,eAAe,CAAC,OAAO,EAAE,MAAM;IAI/B,eAAe;IAIf,gBAAgB;IAYvB,SAAS,CAAC,aAAa;cAIP,aAAa,CAAC,OAAO,EAAE,WAAW,EAAE,SAAS,GAAE,OAAc;IA0C7E,SAAS,CAAC,sBAAsB,CAAC,OAAO,GAAE,OAAc,GAAG,IAAI;IAgBxD,wBAAwB,EAAE,OAAO,CAAS;IAEjD,iBAAiB,IAAI,IAAI;yCA7Kd,aAAa;2CAAb,aAAa;CAqLzB"}
|
|
@@ -84,15 +84,17 @@ function ChatComponent_Conditional_1_Conditional_11_Template(rf, ctx) { if (rf &
|
|
|
84
84
|
} }
|
|
85
85
|
function ChatComponent_Conditional_1_Template(rf, ctx) { if (rf & 1) {
|
|
86
86
|
i0.ɵɵelementStart(0, "div", 3)(1, "div", 13);
|
|
87
|
-
i0.ɵɵ
|
|
87
|
+
i0.ɵɵconditionalCreate(2, ChatComponent_Conditional_1_Conditional_2_Template, 1, 1, "img", 14);
|
|
88
88
|
i0.ɵɵelementStart(3, "div", 15);
|
|
89
89
|
i0.ɵɵtext(4, "What can I help with today?");
|
|
90
90
|
i0.ɵɵelementEnd()();
|
|
91
91
|
i0.ɵɵelementStart(5, "div", 16)(6, "div", 17);
|
|
92
|
-
i0.ɵɵ
|
|
92
|
+
i0.ɵɵconditionalCreate(7, ChatComponent_Conditional_1_Conditional_7_Template, 5, 2, "div", 18);
|
|
93
|
+
i0.ɵɵconditionalCreate(8, ChatComponent_Conditional_1_Conditional_8_Template, 5, 2, "div", 18);
|
|
93
94
|
i0.ɵɵelementEnd();
|
|
94
95
|
i0.ɵɵelementStart(9, "div", 17);
|
|
95
|
-
i0.ɵɵ
|
|
96
|
+
i0.ɵɵconditionalCreate(10, ChatComponent_Conditional_1_Conditional_10_Template, 5, 2, "div", 18);
|
|
97
|
+
i0.ɵɵconditionalCreate(11, ChatComponent_Conditional_1_Conditional_11_Template, 5, 2, "div", 18);
|
|
96
98
|
i0.ɵɵelementEnd()()();
|
|
97
99
|
} if (rf & 2) {
|
|
98
100
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
@@ -314,24 +316,23 @@ export class ChatComponent {
|
|
|
314
316
|
}
|
|
315
317
|
static ɵfac = function ChatComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ChatComponent)(i0.ɵɵdirectiveInject(i1.MarkdownService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
|
|
316
318
|
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ChatComponent, selectors: [["mj-chat"]], viewQuery: function ChatComponent_Query(rf, ctx) { if (rf & 1) {
|
|
317
|
-
i0.ɵɵviewQuery(_c0, 7);
|
|
318
|
-
i0.ɵɵviewQuery(_c1, 5);
|
|
319
|
+
i0.ɵɵviewQuery(_c0, 7)(_c1, 5);
|
|
319
320
|
} if (rf & 2) {
|
|
320
321
|
let _t;
|
|
321
322
|
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.messagesContainer = _t.first);
|
|
322
323
|
i0.ɵɵqueryRefresh(_t = i0.ɵɵloadQuery()) && (ctx.theInput = _t.first);
|
|
323
|
-
} }, inputs: { InitialMessage: "InitialMessage", Messages: "Messages", AIImageURL: "AIImageURL", AILargeImageURL: "AILargeImageURL", WelcomeQuestions: "WelcomeQuestions", ClearAllMessagesPrompt: "ClearAllMessagesPrompt", AllowSend: "AllowSend", Placeholder: "Placeholder", ShowWaitingIndicator: "ShowWaitingIndicator" }, outputs: { MessageAdded: "MessageAdded", ClearChatRequested: "ClearChatRequested" }, decls: 18, vars: 10, consts: [["messagesContainer", ""], ["theInput", ""], [1, "chat-wrapper"], [1, "welcome-wrapper"], [1, "chat-messages", 3, "scroll"], [1, "scroll-to-bottom", "fas", "fa-arrow-down"], [1, "chat-input-area"], ["size", "small", 1, "loader", 3, "showText"], [1, "text-area-wrapper"], [3, "ngModelChange", "input", "keyup.enter", "ngModel", "disabled", "placeholder"], ["kendoButton", "", 3, "click", "disabled"], ["title", "Clear Chat", 1, "fa-solid", "fa-trash-can"], ["title", "Send Message", 1, "fas", "fa-solid", "fa-arrow-up"], [1, "welcome-message"], [3, "src"], [1, "welcome-header-text"], [1, "welcome-suggested-questions"], [1, "welcome-suggested-questions-col"], [1, "welcome-question"], [1, "welcome-question", 3, "click"], [1, "welcome-question-header"], [1, "scroll-to-bottom", "fas", "fa-arrow-down", 3, "click"], ["kendoButton", "", "themeColor", "primary", 3, "click"], ["kendoButton", "", 3, "click"]], template: function ChatComponent_Template(rf, ctx) { if (rf & 1) {
|
|
324
|
+
} }, inputs: { InitialMessage: "InitialMessage", Messages: "Messages", AIImageURL: "AIImageURL", AILargeImageURL: "AILargeImageURL", WelcomeQuestions: "WelcomeQuestions", ClearAllMessagesPrompt: "ClearAllMessagesPrompt", AllowSend: "AllowSend", Placeholder: "Placeholder", ShowWaitingIndicator: "ShowWaitingIndicator" }, outputs: { MessageAdded: "MessageAdded", ClearChatRequested: "ClearChatRequested" }, standalone: false, decls: 18, vars: 10, consts: [["messagesContainer", ""], ["theInput", ""], [1, "chat-wrapper"], [1, "welcome-wrapper"], [1, "chat-messages", 3, "scroll"], [1, "scroll-to-bottom", "fas", "fa-arrow-down"], [1, "chat-input-area"], ["size", "small", 1, "loader", 3, "showText"], [1, "text-area-wrapper"], [3, "ngModelChange", "input", "keyup.enter", "ngModel", "disabled", "placeholder"], ["kendoButton", "", 3, "click", "disabled"], ["title", "Clear Chat", 1, "fa-solid", "fa-trash-can"], ["title", "Send Message", 1, "fas", "fa-solid", "fa-arrow-up"], [1, "welcome-message"], [3, "src"], [1, "welcome-header-text"], [1, "welcome-suggested-questions"], [1, "welcome-suggested-questions-col"], [1, "welcome-question"], [1, "welcome-question", 3, "click"], [1, "welcome-question-header"], [1, "scroll-to-bottom", "fas", "fa-arrow-down", 3, "click"], ["kendoButton", "", "themeColor", "primary", 3, "click"], ["kendoButton", "", 3, "click"]], template: function ChatComponent_Template(rf, ctx) { if (rf & 1) {
|
|
324
325
|
const _r1 = i0.ɵɵgetCurrentView();
|
|
325
326
|
i0.ɵɵelementStart(0, "div", 2);
|
|
326
|
-
i0.ɵɵ
|
|
327
|
+
i0.ɵɵconditionalCreate(1, ChatComponent_Conditional_1_Template, 12, 5, "div", 3);
|
|
327
328
|
i0.ɵɵelementStart(2, "div", 4, 0);
|
|
328
329
|
i0.ɵɵlistener("scroll", function ChatComponent_Template_div_scroll_2_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.handleCheckScroll()); });
|
|
329
330
|
i0.ɵɵelementStart(4, "span");
|
|
330
331
|
i0.ɵɵtext(5);
|
|
331
332
|
i0.ɵɵelementEnd()();
|
|
332
|
-
i0.ɵɵ
|
|
333
|
+
i0.ɵɵconditionalCreate(6, ChatComponent_Conditional_6_Template, 1, 0, "span", 5);
|
|
333
334
|
i0.ɵɵelementStart(7, "div", 6);
|
|
334
|
-
i0.ɵɵ
|
|
335
|
+
i0.ɵɵconditionalCreate(8, ChatComponent_Conditional_8_Template, 1, 1, "mj-loading", 7);
|
|
335
336
|
i0.ɵɵelementStart(9, "div", 8)(10, "textarea", 9, 1);
|
|
336
337
|
i0.ɵɵtwoWayListener("ngModelChange", function ChatComponent_Template_textarea_ngModelChange_10_listener($event) { i0.ɵɵrestoreView(_r1); i0.ɵɵtwoWayBindingSet(ctx.currentMessage, $event) || (ctx.currentMessage = $event); return i0.ɵɵresetView($event); });
|
|
337
338
|
i0.ɵɵlistener("input", function ChatComponent_Template_textarea_input_10_listener($event) { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.handleInputChange($event)); })("keyup.enter", function ChatComponent_Template_textarea_keyup_enter_10_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.SendCurrentMessage()); });
|
|
@@ -345,7 +346,7 @@ export class ChatComponent {
|
|
|
345
346
|
i0.ɵɵlistener("click", function ChatComponent_Template_button_click_15_listener() { i0.ɵɵrestoreView(_r1); return i0.ɵɵresetView(ctx.SendCurrentMessage()); });
|
|
346
347
|
i0.ɵɵelement(16, "span", 12);
|
|
347
348
|
i0.ɵɵelementEnd()()();
|
|
348
|
-
i0.ɵɵ
|
|
349
|
+
i0.ɵɵconditionalCreate(17, ChatComponent_Conditional_17_Template, 8, 1, "kendo-dialog");
|
|
349
350
|
} if (rf & 2) {
|
|
350
351
|
i0.ɵɵadvance();
|
|
351
352
|
i0.ɵɵconditional(ctx.Messages.length === 0 && !ctx.ShowWaitingIndicator ? 1 : -1);
|
|
@@ -368,7 +369,7 @@ export class ChatComponent {
|
|
|
368
369
|
}
|
|
369
370
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ChatComponent, [{
|
|
370
371
|
type: Component,
|
|
371
|
-
args: [{ selector: 'mj-chat', template: "<div class=\"chat-wrapper\">\n @if(Messages.length === 0 && !ShowWaitingIndicator) {\n <div class=\"welcome-wrapper\">\n <div class='welcome-message'>\n @if(AILargeImageURL) {\n <img [src]=\"AILargeImageURL\"/>\n }\n <div class=\"welcome-header-text\">What can I help with today?</div>\n </div>\n <div class='welcome-suggested-questions'>\n <div class=\"welcome-suggested-questions-col\">\n @if (WelcomeQuestions.length > 0) {\n <div class=\"welcome-question\" (click)=\"SendUserMessage(WelcomeQuestions[0].prompt)\">\n <span class=\"welcome-question-header\">{{WelcomeQuestions[0].topLine}}</span>\n <span>{{WelcomeQuestions[0].bottomLine}}</span>\n </div>\n }\n @if (WelcomeQuestions.length > 1) {\n <div class=\"welcome-question\" (click)=\"SendUserMessage(WelcomeQuestions[1].prompt)\">\n <span class=\"welcome-question-header\">{{WelcomeQuestions[1].topLine}}</span>\n <span>{{WelcomeQuestions[1].bottomLine}}</span>\n </div> \n }\n </div>\n <div class=\"welcome-suggested-questions-col\">\n @if (WelcomeQuestions.length > 2) {\n <div class=\"welcome-question\" (click)=\"SendUserMessage(WelcomeQuestions[2].prompt)\">\n <span class=\"welcome-question-header\">{{WelcomeQuestions[2].topLine}}</span>\n <span>{{WelcomeQuestions[2].bottomLine}}</span>\n </div> \n }\n @if (WelcomeQuestions.length > 3) {\n <div class=\"welcome-question\" (click)=\"SendUserMessage(WelcomeQuestions[3].prompt)\">\n <span class=\"welcome-question-header\">{{WelcomeQuestions[3].topLine}}</span>\n <span>{{WelcomeQuestions[3].bottomLine}}</span>\n </div> \n }\n </div>\n </div>\n </div> \n }\n\n <div class=\"chat-messages\" \n #messagesContainer \n (scroll)=\"handleCheckScroll()\">\n <!-- messages go here -->\n <span>{{InitialMessage}}</span>\n </div>\n @if (ShowScrollToBottomButton) {\n <span class=\"scroll-to-bottom fas fa-arrow-down\" (click)=\"ScrollMessagesToBottom()\"></span>\n }\n\n <div class = \"chat-input-area\">\n @if (ShowWaitingIndicator) {\n <mj-loading [showText]=\"false\" size=\"small\" class=\"loader\"></mj-loading>\n }\n <div class=\"text-area-wrapper\">\n <textarea #theInput \n [(ngModel)]=\"currentMessage\" \n [disabled]=\"ShowWaitingIndicator\" \n [placeholder]=\"Placeholder\" \n (input)=\"handleInputChange($event)\"\n (keyup.enter)=\"SendCurrentMessage()\" >\n </textarea>\n </div>\n <button kendoButton \n [disabled]=\"Messages.length === 0 || ShowWaitingIndicator\"\n (click)=\"showingClearAllDialog = true\">\n <span class=\"fa-solid fa-trash-can\" title=\"Clear Chat\">\n </span>\n </button>\n <button kendoButton\n [disabled]=\"!InternalAllowSend || currentMessage.length === 0 || ShowWaitingIndicator\" \n (click)=\"SendCurrentMessage()\">\n <span class=\"fas fa-solid fa-arrow-up\" title=\"Send Message\"></span>\n </button>\n </div>\n</div>\n@if (showingClearAllDialog) {\n <kendo-dialog>\n <p>{{ClearAllMessagesPrompt}}</p>\n <kendo-dialog-actions>\n <button kendoButton (click)=\"HandleClearChat()\" themeColor=\"primary\">Yes</button>\n <button kendoButton (click)=\"showingClearAllDialog = false\">No</button>\n </kendo-dialog-actions>\n </kendo-dialog>\n}\n", styles: [".loader {\n position: absolute;\n left: 0px;\n}\n\n.chat-wrapper {\n display: flex;\n flex-direction: column;\n position: relative; /* Add this line if the wrapper needs to be a reference point */\n}\n\n.chat-messages {\n overflow-y: auto; /* enable scrolling if the content overflows */\n overflow-x: hidden; /* hide horizontal scrollbar */\n /* border: solid 1px rgba(0, 0, 0, 0.08); */\n margin-bottom: 5px;\n\n margin-top: 2px; /* align it with the top of converation history exactly*/\n\n flex: 1;\n}\n\n/* Hide scrollbar for Chrome, Safari and Opera */\n.chat-messages::-webkit-scrollbar {\n width: 0;\n background: transparent; /* Optional: just make scrollbar invisible */\n}\n\n/* Optional: Show scrollbar on hover */\n.chat-messages:hover::-webkit-scrollbar {\n width: 12px; /* Adjust the width of the scrollbar here */\n background-color: #f0f0f0; /* Adjust the background color of the scrollbar here */\n\n}\n\n/* Handle on hover */\n.chat-messages:hover::-webkit-scrollbar-thumb {\n background-color: #888; /* Adjust the color of the scrollbar handle here */\n opacity: 0.5; /* Adjust the opacity of the scrollbar handle here */\n}\n\n/* Handle rounded corners */\n.chat-messages:hover::-webkit-scrollbar-thumb {\n border-radius: 10px;\n}\n\n/* Optional: handle's hover effect */\n.chat-messages:hover::-webkit-scrollbar-thumb:hover {\n background: #555; /* Adjust hover color here */\n}\n/* Works on Firefox */\n.chat-messages {\n scrollbar-width: thin; /* \"auto\" or \"thin\" */\n scrollbar-color: #888 #f0f0f0; /* thumb and track color */\n}\n \n\n\n\n.chat-input-area {\n background: #fff;\n display: flex;\n justify-content: center;\n align-items: center;\n padding-top: 12px;\n min-height: 35px;\n margin-bottom: 15px;\n}\n.chat-input-area > button {\n vertical-align: top;\n width: 30px;\n height: 30px;\n margin-top: 3px;\n border-radius: 12px;\n}\n.chat-input-area > button:first-of-type {\n margin-left: -40px;\n}\n.chat-input-area > button:last-child {\n margin-left: -65px;\n}\n\n.text-area-wrapper {\n padding: 3px;\n border: solid 1px rgba(0, 0, 0, 0.08) ;\n border-radius: 15px;\n\n margin-top: 4px;\n margin-right: -1px;\n min-height: 42px;\n max-height: 100%; /* Prevent it from growing beyond the container */\n\n overflow: hidden; \n align-items: center;\n\n /*combined width and padding is 800*/\n max-width: 710px; \n width: 75%; /*take up 75% but no more than 710px*/\n padding-right: 90px; /* Space for the buttons */\n} \n.text-area-wrapper > textarea {\n border: 0;\n outline: 0;\n resize: none;\n\n min-height: 20px; /* Initial height */\n\n width: 100%;\n overflow-y: hidden; /* Hide scrollbar */\n\n font-family: S\u00F6hne, ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", Roboto, Ubuntu, Cantarell, \"Noto Sans\", sans-serif, \"Helvetica Neue\", Arial, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-size: 1rem;\n\n margin-left: 7px;\n margin-top: 7px;\n margin-bottom: 5px;\n}\n\n.text-area-wrapper > textarea:disabled {\n background-color: white;\n}\n\n\n::ng-deep .chat-message-wrap {\n display: flex;\n align-items: flex-start; /* Align items to the top */\n margin-bottom: 10px;\n margin-right: 10px;\n}\n\n::ng-deep .chat-message-image {\n margin-top: 12px;\n font-size: 24px; /* Adjust size as necessary */\n margin-right: 10px; /* Space between the icon and the message text */\n width: 50px;\n flex-shrink: 0; /* Prevents the icon from shrinking */ \n}\n\n/* Styling for dynamic markdown content and message differentiation */\n::ng-deep .chat-message {\n padding-left: 7px;\n padding-right: 7px;\n margin-bottom: 10px;\n border-radius: 5px;\n background-color: rgb(255, 255, 240);\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n word-wrap: break-word;\n}\n\n::ng-deep .chat-message-ai {\n background-color: rgb(230, 246, 253);\n}\n\n.scroll-to-bottom {\n position: absolute; /* Or absolute, depending on your layout specifics */\n left: 50%; /* Start from the middle of the container */\n transform: translateX(-50%); /* Move it back by half of its own width to truly center it */\n bottom: 100px; /* Adjust based on the height of your input area */\n z-index: 1000; /* Make sure it's above all other content */\n border-radius: 50%;\n width: 35px;\n height: 35px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 22px;\n background-color: #f8f8f8;\n box-shadow: 0px 0px 5px rgba(0,0,0,0.3); /* Optional: Adds a subtle shadow for better visibility */\n cursor: pointer;\n}\n\n\n\n/* Center the welcome message vertically and horizontally */\n.welcome-wrapper {\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n height: 100%;\n width: 100%;\n overflow: hidden;\n}\n\n.welcome-message {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n text-align: center;\n overflow: hidden;\n height: 100%;\n}\n\n\n.welcome-message img {\n width: 120px;\n height: 50px;\n margin-bottom: 20px; /* Adds some space between the image and the text below */\n}\n\n.welcome-header-text {\n font-size: larger;\n font-weight: bold;\n}\n\n/* Position the welcome-suggested-questions at the bottom of its container */\n.welcome-suggested-questions {\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-content: center;\n}\n.welcome-suggested-questions-col {\n display: flex;\n}\n\n/* Flex layout for questions, two per row */\n.welcome-question {\n display: flex;\n flex-direction: column; /* Stack the header and text vertically */\n align-items: left;;\n width: 300px; \n justify-content: space-between;\n margin: 5px; /* Adds some space around each question */\n border: solid 1px rgba(41, 28, 28, 0.08);\n border-radius: 15px;\n padding: 10px;\n cursor: pointer;\n}\n\n.welcome-question:hover {\n background-color: rgba(0, 0, 0, 0.05);\n}\n\n\n.welcome-question-header {\n font-size: 12pt;\n font-weight: bold;\n display: block; /* Ensures the header is on its own line */\n}\n\n/* Non-bold text for the content below the header */\n.welcome-question span:not(.welcome-question-header) {\n font-weight: normal;\n font-size: 10pt;\n}\n"] }]
|
|
372
|
+
args: [{ standalone: false, selector: 'mj-chat', template: "<div class=\"chat-wrapper\">\n @if(Messages.length === 0 && !ShowWaitingIndicator) {\n <div class=\"welcome-wrapper\">\n <div class='welcome-message'>\n @if(AILargeImageURL) {\n <img [src]=\"AILargeImageURL\"/>\n }\n <div class=\"welcome-header-text\">What can I help with today?</div>\n </div>\n <div class='welcome-suggested-questions'>\n <div class=\"welcome-suggested-questions-col\">\n @if (WelcomeQuestions.length > 0) {\n <div class=\"welcome-question\" (click)=\"SendUserMessage(WelcomeQuestions[0].prompt)\">\n <span class=\"welcome-question-header\">{{WelcomeQuestions[0].topLine}}</span>\n <span>{{WelcomeQuestions[0].bottomLine}}</span>\n </div>\n }\n @if (WelcomeQuestions.length > 1) {\n <div class=\"welcome-question\" (click)=\"SendUserMessage(WelcomeQuestions[1].prompt)\">\n <span class=\"welcome-question-header\">{{WelcomeQuestions[1].topLine}}</span>\n <span>{{WelcomeQuestions[1].bottomLine}}</span>\n </div> \n }\n </div>\n <div class=\"welcome-suggested-questions-col\">\n @if (WelcomeQuestions.length > 2) {\n <div class=\"welcome-question\" (click)=\"SendUserMessage(WelcomeQuestions[2].prompt)\">\n <span class=\"welcome-question-header\">{{WelcomeQuestions[2].topLine}}</span>\n <span>{{WelcomeQuestions[2].bottomLine}}</span>\n </div> \n }\n @if (WelcomeQuestions.length > 3) {\n <div class=\"welcome-question\" (click)=\"SendUserMessage(WelcomeQuestions[3].prompt)\">\n <span class=\"welcome-question-header\">{{WelcomeQuestions[3].topLine}}</span>\n <span>{{WelcomeQuestions[3].bottomLine}}</span>\n </div> \n }\n </div>\n </div>\n </div> \n }\n\n <div class=\"chat-messages\" \n #messagesContainer \n (scroll)=\"handleCheckScroll()\">\n <!-- messages go here -->\n <span>{{InitialMessage}}</span>\n </div>\n @if (ShowScrollToBottomButton) {\n <span class=\"scroll-to-bottom fas fa-arrow-down\" (click)=\"ScrollMessagesToBottom()\"></span>\n }\n\n <div class = \"chat-input-area\">\n @if (ShowWaitingIndicator) {\n <mj-loading [showText]=\"false\" size=\"small\" class=\"loader\"></mj-loading>\n }\n <div class=\"text-area-wrapper\">\n <textarea #theInput \n [(ngModel)]=\"currentMessage\" \n [disabled]=\"ShowWaitingIndicator\" \n [placeholder]=\"Placeholder\" \n (input)=\"handleInputChange($event)\"\n (keyup.enter)=\"SendCurrentMessage()\" >\n </textarea>\n </div>\n <button kendoButton \n [disabled]=\"Messages.length === 0 || ShowWaitingIndicator\"\n (click)=\"showingClearAllDialog = true\">\n <span class=\"fa-solid fa-trash-can\" title=\"Clear Chat\">\n </span>\n </button>\n <button kendoButton\n [disabled]=\"!InternalAllowSend || currentMessage.length === 0 || ShowWaitingIndicator\" \n (click)=\"SendCurrentMessage()\">\n <span class=\"fas fa-solid fa-arrow-up\" title=\"Send Message\"></span>\n </button>\n </div>\n</div>\n@if (showingClearAllDialog) {\n <kendo-dialog>\n <p>{{ClearAllMessagesPrompt}}</p>\n <kendo-dialog-actions>\n <button kendoButton (click)=\"HandleClearChat()\" themeColor=\"primary\">Yes</button>\n <button kendoButton (click)=\"showingClearAllDialog = false\">No</button>\n </kendo-dialog-actions>\n </kendo-dialog>\n}\n", styles: [".loader {\n position: absolute;\n left: 0px;\n}\n\n.chat-wrapper {\n display: flex;\n flex-direction: column;\n position: relative; /* Add this line if the wrapper needs to be a reference point */\n}\n\n.chat-messages {\n overflow-y: auto; /* enable scrolling if the content overflows */\n overflow-x: hidden; /* hide horizontal scrollbar */\n /* border: solid 1px rgba(0, 0, 0, 0.08); */\n margin-bottom: 5px;\n\n margin-top: 2px; /* align it with the top of converation history exactly*/\n\n flex: 1;\n}\n\n/* Hide scrollbar for Chrome, Safari and Opera */\n.chat-messages::-webkit-scrollbar {\n width: 0;\n background: transparent; /* Optional: just make scrollbar invisible */\n}\n\n/* Optional: Show scrollbar on hover */\n.chat-messages:hover::-webkit-scrollbar {\n width: 12px; /* Adjust the width of the scrollbar here */\n background-color: #f0f0f0; /* Adjust the background color of the scrollbar here */\n\n}\n\n/* Handle on hover */\n.chat-messages:hover::-webkit-scrollbar-thumb {\n background-color: #888; /* Adjust the color of the scrollbar handle here */\n opacity: 0.5; /* Adjust the opacity of the scrollbar handle here */\n}\n\n/* Handle rounded corners */\n.chat-messages:hover::-webkit-scrollbar-thumb {\n border-radius: 10px;\n}\n\n/* Optional: handle's hover effect */\n.chat-messages:hover::-webkit-scrollbar-thumb:hover {\n background: #555; /* Adjust hover color here */\n}\n/* Works on Firefox */\n.chat-messages {\n scrollbar-width: thin; /* \"auto\" or \"thin\" */\n scrollbar-color: #888 #f0f0f0; /* thumb and track color */\n}\n \n\n\n\n.chat-input-area {\n background: #fff;\n display: flex;\n justify-content: center;\n align-items: center;\n padding-top: 12px;\n min-height: 35px;\n margin-bottom: 15px;\n}\n.chat-input-area > button {\n vertical-align: top;\n width: 30px;\n height: 30px;\n margin-top: 3px;\n border-radius: 12px;\n}\n.chat-input-area > button:first-of-type {\n margin-left: -40px;\n}\n.chat-input-area > button:last-child {\n margin-left: -65px;\n}\n\n.text-area-wrapper {\n padding: 3px;\n border: solid 1px rgba(0, 0, 0, 0.08) ;\n border-radius: 15px;\n\n margin-top: 4px;\n margin-right: -1px;\n min-height: 42px;\n max-height: 100%; /* Prevent it from growing beyond the container */\n\n overflow: hidden; \n align-items: center;\n\n /*combined width and padding is 800*/\n max-width: 710px; \n width: 75%; /*take up 75% but no more than 710px*/\n padding-right: 90px; /* Space for the buttons */\n} \n.text-area-wrapper > textarea {\n border: 0;\n outline: 0;\n resize: none;\n\n min-height: 20px; /* Initial height */\n\n width: 100%;\n overflow-y: hidden; /* Hide scrollbar */\n\n font-family: S\u00F6hne, ui-sans-serif, system-ui, -apple-system, \"Segoe UI\", Roboto, Ubuntu, Cantarell, \"Noto Sans\", sans-serif, \"Helvetica Neue\", Arial, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";\n font-size: 1rem;\n\n margin-left: 7px;\n margin-top: 7px;\n margin-bottom: 5px;\n}\n\n.text-area-wrapper > textarea:disabled {\n background-color: white;\n}\n\n\n::ng-deep .chat-message-wrap {\n display: flex;\n align-items: flex-start; /* Align items to the top */\n margin-bottom: 10px;\n margin-right: 10px;\n}\n\n::ng-deep .chat-message-image {\n margin-top: 12px;\n font-size: 24px; /* Adjust size as necessary */\n margin-right: 10px; /* Space between the icon and the message text */\n width: 50px;\n flex-shrink: 0; /* Prevents the icon from shrinking */ \n}\n\n/* Styling for dynamic markdown content and message differentiation */\n::ng-deep .chat-message {\n padding-left: 7px;\n padding-right: 7px;\n margin-bottom: 10px;\n border-radius: 5px;\n background-color: rgb(255, 255, 240);\n box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n word-wrap: break-word;\n}\n\n::ng-deep .chat-message-ai {\n background-color: rgb(230, 246, 253);\n}\n\n.scroll-to-bottom {\n position: absolute; /* Or absolute, depending on your layout specifics */\n left: 50%; /* Start from the middle of the container */\n transform: translateX(-50%); /* Move it back by half of its own width to truly center it */\n bottom: 100px; /* Adjust based on the height of your input area */\n z-index: 1000; /* Make sure it's above all other content */\n border-radius: 50%;\n width: 35px;\n height: 35px;\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 22px;\n background-color: #f8f8f8;\n box-shadow: 0px 0px 5px rgba(0,0,0,0.3); /* Optional: Adds a subtle shadow for better visibility */\n cursor: pointer;\n}\n\n\n\n/* Center the welcome message vertically and horizontally */\n.welcome-wrapper {\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-items: center;\n height: 100%;\n width: 100%;\n overflow: hidden;\n}\n\n.welcome-message {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n text-align: center;\n overflow: hidden;\n height: 100%;\n}\n\n\n.welcome-message img {\n width: 120px;\n height: 50px;\n margin-bottom: 20px; /* Adds some space between the image and the text below */\n}\n\n.welcome-header-text {\n font-size: larger;\n font-weight: bold;\n}\n\n/* Position the welcome-suggested-questions at the bottom of its container */\n.welcome-suggested-questions {\n display: flex;\n flex-direction: column;\n justify-content: center;\n align-content: center;\n}\n.welcome-suggested-questions-col {\n display: flex;\n}\n\n/* Flex layout for questions, two per row */\n.welcome-question {\n display: flex;\n flex-direction: column; /* Stack the header and text vertically */\n align-items: left;;\n width: 300px; \n justify-content: space-between;\n margin: 5px; /* Adds some space around each question */\n border: solid 1px rgba(41, 28, 28, 0.08);\n border-radius: 15px;\n padding: 10px;\n cursor: pointer;\n}\n\n.welcome-question:hover {\n background-color: rgba(0, 0, 0, 0.05);\n}\n\n\n.welcome-question-header {\n font-size: 12pt;\n font-weight: bold;\n display: block; /* Ensures the header is on its own line */\n}\n\n/* Non-bold text for the content below the header */\n.welcome-question span:not(.welcome-question-header) {\n font-weight: normal;\n font-size: 10pt;\n}\n"] }]
|
|
372
373
|
}], () => [{ type: i1.MarkdownService }, { type: i0.ChangeDetectorRef }], { InitialMessage: [{
|
|
373
374
|
type: Input
|
|
374
375
|
}], Messages: [{
|
|
@@ -398,5 +399,5 @@ export class ChatComponent {
|
|
|
398
399
|
type: ViewChild,
|
|
399
400
|
args: ['theInput']
|
|
400
401
|
}] }); })();
|
|
401
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ChatComponent, { className: "ChatComponent", filePath: "src/lib/chat/chat.component.ts", lineNumber:
|
|
402
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ChatComponent, { className: "ChatComponent", filePath: "src/lib/chat/chat.component.ts", lineNumber: 31 }); })();
|
|
402
403
|
//# sourceMappingURL=chat.component.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat.component.js","sourceRoot":"","sources":["../../../src/lib/chat/chat.component.ts","../../../src/lib/chat/chat.component.html"],"names":[],"mappings":"AAAA,OAAO,EAAoC,SAAS,EAAc,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAEhI,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAA;;;;;;;;;;ICG3B,0BAA8B;;;IAAzB,8DAAuB;;;;IAOxB,+BAAoF;IAAtD,6LAAS,+CAAiC,CAAC,SAAS,KAAC;IAC/E,gCAAsC;IAAA,YAA+B;IAAA,iBAAO;IAC5E,4BAAM;IAAA,YAAkC;IAC5C,AAD4C,iBAAO,EAC7C;;;IAFoC,eAA+B;IAA/B,wDAA+B;IAC/D,eAAkC;IAAlC,2DAAkC;;;;IAI5C,+BAAoF;IAAtD,6LAAS,+CAAiC,CAAC,SAAS,KAAC;IAC/E,gCAAsC;IAAA,YAA+B;IAAA,iBAAO;IAC5E,4BAAM;IAAA,YAAkC;IAC5C,AAD4C,iBAAO,EAC7C;;;IAFoC,eAA+B;IAA/B,wDAA+B;IAC/D,eAAkC;IAAlC,2DAAkC;;;;IAM5C,+BAAoF;IAAtD,8LAAS,+CAAiC,CAAC,SAAS,KAAC;IAC/E,gCAAsC;IAAA,YAA+B;IAAA,iBAAO;IAC5E,4BAAM;IAAA,YAAkC;IAC5C,AAD4C,iBAAO,EAC7C;;;IAFoC,eAA+B;IAA/B,wDAA+B;IAC/D,eAAkC;IAAlC,2DAAkC;;;;IAI5C,+BAAoF;IAAtD,8LAAS,+CAAiC,CAAC,SAAS,KAAC;IAC/E,gCAAsC;IAAA,YAA+B;IAAA,iBAAO;IAC5E,4BAAM;IAAA,YAAkC;IAC5C,AAD4C,iBAAO,EAC7C;;;IAFoC,eAA+B;IAA/B,wDAA+B;IAC/D,eAAkC;IAAlC,2DAAkC;;;IA/BxD,AADJ,8BAA6B,cACI;IACzB,
|
|
1
|
+
{"version":3,"file":"chat.component.js","sourceRoot":"","sources":["../../../src/lib/chat/chat.component.ts","../../../src/lib/chat/chat.component.html"],"names":[],"mappings":"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"}
|
package/dist/lib/module.d.ts
CHANGED
|
@@ -13,3 +13,4 @@ export declare class ChatModule {
|
|
|
13
13
|
static ɵmod: i0.ɵɵNgModuleDeclaration<ChatModule, [typeof i1.ChatComponent], [typeof i2.CommonModule, typeof i3.FormsModule, typeof i4.ContainerDirectivesModule, typeof i5.SharedGenericModule, typeof i6.IndicatorsModule, typeof i7.ButtonsModule, typeof i8.DialogModule, typeof i9.MarkdownModule], [typeof i1.ChatComponent]>;
|
|
14
14
|
static ɵinj: i0.ɵɵInjectorDeclaration<ChatModule>;
|
|
15
15
|
}
|
|
16
|
+
//# sourceMappingURL=module.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../src/lib/module.ts"],"names":[],"mappings":";;;;;;;;;;AAeA,qBAkBa,UAAU;yCAAV,UAAU;0CAAV,UAAU;0CAAV,UAAU;CAAI"}
|
package/dist/public-api.d.ts
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"public-api.d.ts","sourceRoot":"","sources":["../src/public-api.ts"],"names":[],"mappings":"AAIA,cAAc,2BAA2B,CAAC;AAC1C,cAAc,cAAc,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memberjunction/ng-chat",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "4.1.0",
|
|
4
4
|
"description": "MemberJunction: Reusable Chat Component - can be used for AI or peer to peer chat applications.",
|
|
5
5
|
"main": "./dist/public-api.js",
|
|
6
6
|
"typings": "./dist/public-api.d.ts",
|
|
@@ -15,23 +15,23 @@
|
|
|
15
15
|
"author": "",
|
|
16
16
|
"license": "ISC",
|
|
17
17
|
"devDependencies": {
|
|
18
|
-
"@angular/compiler": "
|
|
19
|
-
"@angular/compiler-cli": "
|
|
18
|
+
"@angular/compiler": "21.1.3",
|
|
19
|
+
"@angular/compiler-cli": "21.1.3"
|
|
20
20
|
},
|
|
21
21
|
"peerDependencies": {
|
|
22
|
-
"@angular/common": "
|
|
23
|
-
"@angular/core": "
|
|
24
|
-
"@angular/forms": "
|
|
22
|
+
"@angular/common": "21.1.3",
|
|
23
|
+
"@angular/core": "21.1.3",
|
|
24
|
+
"@angular/forms": "21.1.3"
|
|
25
25
|
},
|
|
26
26
|
"dependencies": {
|
|
27
|
-
"@memberjunction/core": "
|
|
28
|
-
"@memberjunction/ng-container-directives": "
|
|
29
|
-
"@memberjunction/ng-shared-generic": "
|
|
30
|
-
"@progress/kendo-angular-indicators": "
|
|
31
|
-
"@progress/kendo-angular-buttons": "
|
|
32
|
-
"@progress/kendo-angular-dialog": "
|
|
33
|
-
"tslib": "^2.
|
|
34
|
-
"@memberjunction/ng-markdown": "
|
|
27
|
+
"@memberjunction/core": "4.1.0",
|
|
28
|
+
"@memberjunction/ng-container-directives": "4.1.0",
|
|
29
|
+
"@memberjunction/ng-shared-generic": "4.1.0",
|
|
30
|
+
"@progress/kendo-angular-indicators": "22.0.1",
|
|
31
|
+
"@progress/kendo-angular-buttons": "22.0.1",
|
|
32
|
+
"@progress/kendo-angular-dialog": "22.0.1",
|
|
33
|
+
"tslib": "^2.8.1",
|
|
34
|
+
"@memberjunction/ng-markdown": "4.1.0"
|
|
35
35
|
},
|
|
36
36
|
"sideEffects": false,
|
|
37
37
|
"repository": {
|