@memberjunction/ng-conversations 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 +287 -155
- package/dist/lib/components/active-tasks/active-tasks-panel.component.d.ts.map +1 -1
- package/dist/lib/components/active-tasks/active-tasks-panel.component.js +46 -41
- package/dist/lib/components/active-tasks/active-tasks-panel.component.js.map +1 -1
- package/dist/lib/components/agent/active-agent-indicator.component.d.ts.map +1 -1
- package/dist/lib/components/agent/active-agent-indicator.component.js +70 -68
- package/dist/lib/components/agent/active-agent-indicator.component.js.map +1 -1
- package/dist/lib/components/agent/agent-process-panel.component.d.ts.map +1 -1
- package/dist/lib/components/agent/agent-process-panel.component.js +13 -12
- package/dist/lib/components/agent/agent-process-panel.component.js.map +1 -1
- package/dist/lib/components/artifact/artifact-share-modal.component.js +17 -15
- package/dist/lib/components/artifact/artifact-share-modal.component.js.map +1 -1
- package/dist/lib/components/attachment/image-viewer.component.d.ts.map +1 -1
- package/dist/lib/components/attachment/image-viewer.component.js +20 -21
- package/dist/lib/components/attachment/image-viewer.component.js.map +1 -1
- package/dist/lib/components/collection/artifact-collection-picker-modal.component.d.ts.map +1 -1
- package/dist/lib/components/collection/artifact-collection-picker-modal.component.js +230 -233
- package/dist/lib/components/collection/artifact-collection-picker-modal.component.js.map +1 -1
- package/dist/lib/components/collection/artifact-create-modal.component.d.ts.map +1 -1
- package/dist/lib/components/collection/artifact-create-modal.component.js +100 -103
- package/dist/lib/components/collection/artifact-create-modal.component.js.map +1 -1
- package/dist/lib/components/collection/collection-artifact-card.component.d.ts.map +1 -1
- package/dist/lib/components/collection/collection-artifact-card.component.js +41 -33
- package/dist/lib/components/collection/collection-artifact-card.component.js.map +1 -1
- package/dist/lib/components/collection/collection-form-modal.component.d.ts.map +1 -1
- package/dist/lib/components/collection/collection-form-modal.component.js +85 -84
- package/dist/lib/components/collection/collection-form-modal.component.js.map +1 -1
- package/dist/lib/components/collection/collection-share-modal.component.js +20 -15
- package/dist/lib/components/collection/collection-share-modal.component.js.map +1 -1
- package/dist/lib/components/collection/collection-tree.component.d.ts.map +1 -1
- package/dist/lib/components/collection/collection-tree.component.js +13 -11
- package/dist/lib/components/collection/collection-tree.component.js.map +1 -1
- package/dist/lib/components/collection/collection-view.component.d.ts.map +1 -1
- package/dist/lib/components/collection/collection-view.component.js +67 -60
- package/dist/lib/components/collection/collection-view.component.js.map +1 -1
- package/dist/lib/components/collection/collections-full-view.component.d.ts +4 -3
- package/dist/lib/components/collection/collections-full-view.component.d.ts.map +1 -1
- package/dist/lib/components/collection/collections-full-view.component.js +619 -549
- package/dist/lib/components/collection/collections-full-view.component.js.map +1 -1
- package/dist/lib/components/conversation/conversation-chat-area.component.d.ts +3 -3
- package/dist/lib/components/conversation/conversation-chat-area.component.d.ts.map +1 -1
- package/dist/lib/components/conversation/conversation-chat-area.component.js +145 -143
- package/dist/lib/components/conversation/conversation-chat-area.component.js.map +1 -1
- package/dist/lib/components/conversation/conversation-empty-state.component.d.ts.map +1 -1
- package/dist/lib/components/conversation/conversation-empty-state.component.js +44 -44
- package/dist/lib/components/conversation/conversation-empty-state.component.js.map +1 -1
- package/dist/lib/components/conversation/conversation-list.component.d.ts.map +1 -1
- package/dist/lib/components/conversation/conversation-list.component.js +18 -18
- package/dist/lib/components/conversation/conversation-list.component.js.map +1 -1
- package/dist/lib/components/dialogs/input-dialog.component.d.ts.map +1 -1
- package/dist/lib/components/dialogs/input-dialog.component.js +65 -57
- package/dist/lib/components/dialogs/input-dialog.component.js.map +1 -1
- package/dist/lib/components/export/export-modal.component.d.ts.map +1 -1
- package/dist/lib/components/export/export-modal.component.js +126 -134
- package/dist/lib/components/export/export-modal.component.js.map +1 -1
- package/dist/lib/components/global-tasks/global-tasks-panel.component.d.ts.map +1 -1
- package/dist/lib/components/global-tasks/global-tasks-panel.component.js +86 -79
- package/dist/lib/components/global-tasks/global-tasks-panel.component.js.map +1 -1
- package/dist/lib/components/library/library-full-view.component.d.ts.map +1 -1
- package/dist/lib/components/library/library-full-view.component.js +99 -87
- package/dist/lib/components/library/library-full-view.component.js.map +1 -1
- package/dist/lib/components/members/members-modal.component.d.ts.map +1 -1
- package/dist/lib/components/members/members-modal.component.js +124 -119
- package/dist/lib/components/members/members-modal.component.js.map +1 -1
- package/dist/lib/components/mention/mention-dropdown.component.d.ts.map +1 -1
- package/dist/lib/components/mention/mention-dropdown.component.js +50 -46
- package/dist/lib/components/mention/mention-dropdown.component.js.map +1 -1
- package/dist/lib/components/mention/mention-editor.component.d.ts.map +1 -1
- package/dist/lib/components/mention/mention-editor.component.js +39 -38
- package/dist/lib/components/mention/mention-editor.component.js.map +1 -1
- package/dist/lib/components/message/actionable-commands.component.d.ts.map +1 -1
- package/dist/lib/components/message/actionable-commands.component.js +20 -21
- package/dist/lib/components/message/actionable-commands.component.js.map +1 -1
- package/dist/lib/components/message/agent-response-form.component.d.ts.map +1 -1
- package/dist/lib/components/message/agent-response-form.component.js +79 -77
- package/dist/lib/components/message/agent-response-form.component.js.map +1 -1
- package/dist/lib/components/message/conversation-message-rating.component.d.ts.map +1 -1
- package/dist/lib/components/message/conversation-message-rating.component.js +40 -39
- package/dist/lib/components/message/conversation-message-rating.component.js.map +1 -1
- package/dist/lib/components/message/form-question.component.d.ts.map +1 -1
- package/dist/lib/components/message/form-question.component.js +142 -125
- package/dist/lib/components/message/form-question.component.js.map +1 -1
- package/dist/lib/components/message/message-input-box.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-input-box.component.js +10 -11
- package/dist/lib/components/message/message-input-box.component.js.map +1 -1
- package/dist/lib/components/message/message-input.component.d.ts +2 -2
- package/dist/lib/components/message/message-input.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-input.component.js +10 -11
- package/dist/lib/components/message/message-input.component.js.map +1 -1
- package/dist/lib/components/message/message-item.component.d.ts +2 -2
- package/dist/lib/components/message/message-item.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-item.component.js +121 -107
- package/dist/lib/components/message/message-item.component.js.map +1 -1
- package/dist/lib/components/message/message-list.component.d.ts +2 -2
- package/dist/lib/components/message/message-list.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-list.component.js +25 -27
- package/dist/lib/components/message/message-list.component.js.map +1 -1
- package/dist/lib/components/message/suggested-responses.component.d.ts +1 -1
- package/dist/lib/components/message/suggested-responses.component.d.ts.map +1 -1
- package/dist/lib/components/message/suggested-responses.component.js +34 -34
- package/dist/lib/components/message/suggested-responses.component.js.map +1 -1
- package/dist/lib/components/navigation/conversation-navigation.component.d.ts.map +1 -1
- package/dist/lib/components/navigation/conversation-navigation.component.js +3 -3
- package/dist/lib/components/navigation/conversation-navigation.component.js.map +1 -1
- package/dist/lib/components/notification/activity-indicator.component.d.ts.map +1 -1
- package/dist/lib/components/notification/activity-indicator.component.js +5 -5
- package/dist/lib/components/notification/activity-indicator.component.js.map +1 -1
- package/dist/lib/components/notification/notification-badge.component.d.ts.map +1 -1
- package/dist/lib/components/notification/notification-badge.component.js +9 -6
- package/dist/lib/components/notification/notification-badge.component.js.map +1 -1
- package/dist/lib/components/project/project-form-modal.component.d.ts.map +1 -1
- package/dist/lib/components/project/project-form-modal.component.js +7 -7
- package/dist/lib/components/project/project-form-modal.component.js.map +1 -1
- package/dist/lib/components/project/project-selector.component.d.ts.map +1 -1
- package/dist/lib/components/project/project-selector.component.js +8 -8
- package/dist/lib/components/project/project-selector.component.js.map +1 -1
- package/dist/lib/components/search/search-panel.component.d.ts.map +1 -1
- package/dist/lib/components/search/search-panel.component.js +32 -27
- package/dist/lib/components/search/search-panel.component.js.map +1 -1
- package/dist/lib/components/share/share-modal.component.d.ts.map +1 -1
- package/dist/lib/components/share/share-modal.component.js +129 -131
- package/dist/lib/components/share/share-modal.component.js.map +1 -1
- package/dist/lib/components/shared/user-picker.component.js +6 -6
- package/dist/lib/components/shared/user-picker.component.js.map +1 -1
- package/dist/lib/components/sidebar/conversation-sidebar.component.d.ts.map +1 -1
- package/dist/lib/components/sidebar/conversation-sidebar.component.js +41 -37
- package/dist/lib/components/sidebar/conversation-sidebar.component.js.map +1 -1
- package/dist/lib/components/task/tasks-full-view.component.js +4 -5
- package/dist/lib/components/task/tasks-full-view.component.js.map +1 -1
- package/dist/lib/components/tasks/task-widget.component.d.ts.map +1 -1
- package/dist/lib/components/tasks/task-widget.component.js +144 -118
- package/dist/lib/components/tasks/task-widget.component.js.map +1 -1
- package/dist/lib/components/tasks/tasks-dropdown.component.d.ts.map +1 -1
- package/dist/lib/components/tasks/tasks-dropdown.component.js +176 -149
- package/dist/lib/components/tasks/tasks-dropdown.component.js.map +1 -1
- package/dist/lib/components/thread/thread-panel.component.d.ts.map +1 -1
- package/dist/lib/components/thread/thread-panel.component.js +7 -5
- package/dist/lib/components/thread/thread-panel.component.js.map +1 -1
- package/dist/lib/components/toast/toast.component.d.ts.map +1 -1
- package/dist/lib/components/toast/toast.component.js +10 -11
- package/dist/lib/components/toast/toast.component.js.map +1 -1
- package/dist/lib/components/workspace/conversation-workspace.component.d.ts +5 -5
- package/dist/lib/components/workspace/conversation-workspace.component.d.ts.map +1 -1
- package/dist/lib/components/workspace/conversation-workspace.component.js +54 -49
- package/dist/lib/components/workspace/conversation-workspace.component.js.map +1 -1
- package/dist/lib/directives/search-shortcut.directive.d.ts.map +1 -1
- package/dist/lib/directives/search-shortcut.directive.js +3 -2
- package/dist/lib/directives/search-shortcut.directive.js.map +1 -1
- package/dist/lib/services/mention-autocomplete.service.d.ts +6 -0
- package/dist/lib/services/mention-autocomplete.service.d.ts.map +1 -1
- package/dist/lib/services/mention-autocomplete.service.js +25 -2
- package/dist/lib/services/mention-autocomplete.service.js.map +1 -1
- package/package.json +38 -38
package/README.md
CHANGED
|
@@ -1,197 +1,329 @@
|
|
|
1
1
|
# @memberjunction/ng-conversations
|
|
2
2
|
|
|
3
|
-
Angular
|
|
3
|
+
A comprehensive Angular component library for building conversation-based interfaces in MemberJunction, including messaging, artifact management, collections, projects, tasks, agent interaction panels, and collaboration features.
|
|
4
|
+
|
|
5
|
+
## Overview
|
|
6
|
+
|
|
7
|
+
The `@memberjunction/ng-conversations` package is a large, feature-rich module that powers MemberJunction's conversation UI. It provides 40+ components covering the entire conversation lifecycle: message composition and rendering (with markdown, mentions, code blocks, and artifacts), conversation navigation and history, threaded discussions, artifact collections and libraries, project/task management, agent execution panels, sharing/permission modals, search, notifications, and export.
|
|
8
|
+
|
|
9
|
+
```mermaid
|
|
10
|
+
graph TD
|
|
11
|
+
A[ConversationsModule] --> B[Messaging]
|
|
12
|
+
A --> C[Navigation]
|
|
13
|
+
A --> D[Collections & Library]
|
|
14
|
+
A --> E[Agent & Tasks]
|
|
15
|
+
A --> F[Collaboration]
|
|
16
|
+
|
|
17
|
+
B --> B1[MessageItemComponent]
|
|
18
|
+
B --> B2[MessageListComponent]
|
|
19
|
+
B --> B3[MessageInputComponent]
|
|
20
|
+
B --> B4[MentionEditorComponent]
|
|
21
|
+
B --> B5[SuggestedResponsesComponent]
|
|
22
|
+
B --> B6[ConversationMessageRatingComponent]
|
|
23
|
+
|
|
24
|
+
C --> C1[ConversationWorkspaceComponent]
|
|
25
|
+
C --> C2[ConversationNavigationComponent]
|
|
26
|
+
C --> C3[ConversationSidebarComponent]
|
|
27
|
+
C --> C4[ConversationListComponent]
|
|
28
|
+
C --> C5[ConversationChatAreaComponent]
|
|
29
|
+
C --> C6[ThreadPanelComponent]
|
|
30
|
+
|
|
31
|
+
D --> D1[CollectionTreeComponent]
|
|
32
|
+
D --> D2[CollectionViewComponent]
|
|
33
|
+
D --> D3[LibraryFullViewComponent]
|
|
34
|
+
D --> D4[ArtifactCreateModalComponent]
|
|
35
|
+
|
|
36
|
+
E --> E1[AgentProcessPanelComponent]
|
|
37
|
+
E --> E2[ActiveAgentIndicatorComponent]
|
|
38
|
+
E --> E3[TasksFullViewComponent]
|
|
39
|
+
E --> E4[GlobalTasksPanelComponent]
|
|
40
|
+
|
|
41
|
+
F --> F1[ShareModalComponent]
|
|
42
|
+
F --> F2[MembersModalComponent]
|
|
43
|
+
F --> F3[ExportModalComponent]
|
|
44
|
+
F --> F4[SearchPanelComponent]
|
|
45
|
+
|
|
46
|
+
style A fill:#2d6a9f,stroke:#1a4971,color:#fff
|
|
47
|
+
style B fill:#7c5295,stroke:#563a6b,color:#fff
|
|
48
|
+
style C fill:#2d8659,stroke:#1a5c3a,color:#fff
|
|
49
|
+
style D fill:#b8762f,stroke:#8a5722,color:#fff
|
|
50
|
+
style E fill:#7c5295,stroke:#563a6b,color:#fff
|
|
51
|
+
style F fill:#2d8659,stroke:#1a5c3a,color:#fff
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## Installation
|
|
4
55
|
|
|
5
|
-
|
|
56
|
+
```bash
|
|
57
|
+
npm install @memberjunction/ng-conversations
|
|
58
|
+
```
|
|
6
59
|
|
|
7
|
-
|
|
60
|
+
## Usage
|
|
8
61
|
|
|
9
|
-
###
|
|
62
|
+
### Import the Module
|
|
10
63
|
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
- **MessageDataService** - Message management with caching
|
|
14
|
-
- **ArtifactDataService** - Artifact and version management
|
|
15
|
-
- **ProjectDataService** - Project organization
|
|
16
|
-
- **CollectionDataService** - Collection and artifact organization
|
|
17
|
-
- **ConversationStateService** - Reactive state management for conversations
|
|
18
|
-
- **ArtifactStateService** - Reactive state management for artifacts
|
|
64
|
+
```typescript
|
|
65
|
+
import { ConversationsModule } from '@memberjunction/ng-conversations';
|
|
19
66
|
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
67
|
+
@NgModule({
|
|
68
|
+
imports: [ConversationsModule]
|
|
69
|
+
})
|
|
70
|
+
export class YourModule { }
|
|
71
|
+
```
|
|
23
72
|
|
|
24
|
-
|
|
25
|
-
- TypeScript interfaces for all state management types
|
|
26
|
-
- Union types for navigation tabs, layouts, and view modes
|
|
73
|
+
### Full Conversation Workspace
|
|
27
74
|
|
|
28
|
-
|
|
75
|
+
The top-level workspace component provides a complete conversation experience with sidebar, chat area, and thread panel:
|
|
29
76
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
77
|
+
```html
|
|
78
|
+
<mj-conversation-workspace
|
|
79
|
+
[conversationId]="selectedConversationId"
|
|
80
|
+
(conversationChanged)="onConversationChanged($event)">
|
|
81
|
+
</mj-conversation-workspace>
|
|
82
|
+
```
|
|
34
83
|
|
|
35
|
-
|
|
36
|
-
- All services use Metadata.GetEntityObject() pattern
|
|
37
|
-
- RunView for efficient data loading
|
|
38
|
-
- Proper type safety with generic methods
|
|
84
|
+
### Chat Area
|
|
39
85
|
|
|
40
|
-
|
|
41
|
-
- RxJS BehaviorSubjects for all state
|
|
42
|
-
- Derived observables using combineLatest
|
|
43
|
-
- shareReplay(1) for efficient caching
|
|
86
|
+
The chat area handles message display, input, and agent interactions:
|
|
44
87
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
88
|
+
```html
|
|
89
|
+
<mj-conversation-chat-area
|
|
90
|
+
[conversationId]="conversationId"
|
|
91
|
+
[conversation]="conversation"
|
|
92
|
+
[threadId]="selectedThreadId"
|
|
93
|
+
[isNewConversation]="isNewConversation"
|
|
94
|
+
(conversationCreated)="onConversationCreated($event)"
|
|
95
|
+
(threadOpened)="onThreadOpened($event)"
|
|
96
|
+
(threadClosed)="onThreadClosed()">
|
|
97
|
+
</mj-conversation-chat-area>
|
|
98
|
+
```
|
|
48
99
|
|
|
49
|
-
###
|
|
100
|
+
### Message Components
|
|
50
101
|
|
|
51
|
-
|
|
102
|
+
#### Message List
|
|
52
103
|
|
|
53
|
-
```
|
|
54
|
-
|
|
55
|
-
|
|
104
|
+
```html
|
|
105
|
+
<mj-message-list
|
|
106
|
+
[messages]="conversationMessages"
|
|
107
|
+
[isLoading]="isLoadingMessages"
|
|
108
|
+
(messageRated)="onMessageRated($event)">
|
|
109
|
+
</mj-message-list>
|
|
56
110
|
```
|
|
57
111
|
|
|
58
|
-
|
|
112
|
+
#### Message Input with Mentions
|
|
59
113
|
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
} from '@memberjunction/ng-conversations';
|
|
67
|
-
|
|
68
|
-
// In your component
|
|
69
|
-
constructor(
|
|
70
|
-
private conversationData: ConversationDataService,
|
|
71
|
-
private conversationState: ConversationStateService,
|
|
72
|
-
private currentUser: UserInfo
|
|
73
|
-
) {}
|
|
74
|
-
|
|
75
|
-
async ngOnInit() {
|
|
76
|
-
// Load conversations
|
|
77
|
-
const conversations = await this.conversationData.loadConversations(
|
|
78
|
-
environmentId,
|
|
79
|
-
this.currentUser
|
|
80
|
-
);
|
|
81
|
-
|
|
82
|
-
// Set active conversation
|
|
83
|
-
this.conversationState.setActiveConversation(conversations[0].ID);
|
|
84
|
-
|
|
85
|
-
// Subscribe to state changes
|
|
86
|
-
this.conversationState.activeConversation$.subscribe(conv => {
|
|
87
|
-
console.log('Active conversation changed:', conv);
|
|
88
|
-
});
|
|
89
|
-
}
|
|
114
|
+
```html
|
|
115
|
+
<mj-message-input
|
|
116
|
+
[conversationId]="conversationId"
|
|
117
|
+
[allowSend]="!isProcessing"
|
|
118
|
+
(messageSent)="onMessageSent($event)">
|
|
119
|
+
</mj-message-input>
|
|
90
120
|
```
|
|
91
121
|
|
|
92
|
-
|
|
122
|
+
#### Mention Editor
|
|
93
123
|
|
|
124
|
+
```html
|
|
125
|
+
<mj-mention-editor
|
|
126
|
+
[mentionSources]="availableMentionSources"
|
|
127
|
+
(mentionSelected)="onMentionSelected($event)">
|
|
128
|
+
</mj-mention-editor>
|
|
94
129
|
```
|
|
95
|
-
src/
|
|
96
|
-
├── lib/
|
|
97
|
-
│ ├── components/
|
|
98
|
-
│ │ └── message/ # Message display components
|
|
99
|
-
│ │ ├── message-item.component.ts
|
|
100
|
-
│ │ ├── message-item.component.html
|
|
101
|
-
│ │ ├── message-item.component.css
|
|
102
|
-
│ │ ├── message-list.component.ts
|
|
103
|
-
│ │ ├── message-list.component.html
|
|
104
|
-
│ │ └── message-list.component.css
|
|
105
|
-
│ ├── services/
|
|
106
|
-
│ │ ├── conversation-data.service.ts # Conversation CRUD
|
|
107
|
-
│ │ ├── message-data.service.ts # Message CRUD
|
|
108
|
-
│ │ ├── artifact-data.service.ts # Artifact & versions
|
|
109
|
-
│ │ ├── project-data.service.ts # Project management
|
|
110
|
-
│ │ ├── collection-data.service.ts # Collections
|
|
111
|
-
│ │ ├── conversation-state.service.ts # Conversation state
|
|
112
|
-
│ │ └── artifact-state.service.ts # Artifact state
|
|
113
|
-
│ ├── models/
|
|
114
|
-
│ │ └── conversation-state.model.ts # TypeScript interfaces
|
|
115
|
-
│ └── conversations.module.ts
|
|
116
|
-
└── public-api.ts
|
|
117
|
-
```
|
|
118
|
-
|
|
119
|
-
### 🚀 Next Steps
|
|
120
130
|
|
|
121
|
-
|
|
131
|
+
### Collections and Library
|
|
122
132
|
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
133
|
+
```html
|
|
134
|
+
<!-- Collection tree for organizing artifacts -->
|
|
135
|
+
<mj-collection-tree
|
|
136
|
+
[projectId]="currentProjectId"
|
|
137
|
+
(collectionSelected)="onCollectionSelected($event)">
|
|
138
|
+
</mj-collection-tree>
|
|
127
139
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
140
|
+
<!-- Full library view -->
|
|
141
|
+
<mj-library-full-view
|
|
142
|
+
[projectId]="currentProjectId">
|
|
143
|
+
</mj-library-full-view>
|
|
144
|
+
```
|
|
133
145
|
|
|
134
|
-
|
|
135
|
-
- ArtifactPanelComponent (right panel)
|
|
136
|
-
- ArtifactViewerComponent (type-specific rendering)
|
|
137
|
-
- ArtifactEditorComponent (edit mode)
|
|
138
|
-
- ArtifactVersionHistoryComponent (version timeline)
|
|
139
|
-
- ArtifactShareModalComponent (sharing UI)
|
|
146
|
+
### Project and Task Management
|
|
140
147
|
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
148
|
+
```html
|
|
149
|
+
<!-- Project selector -->
|
|
150
|
+
<mj-project-selector
|
|
151
|
+
[currentProjectId]="projectId"
|
|
152
|
+
(projectChanged)="onProjectChanged($event)">
|
|
153
|
+
</mj-project-selector>
|
|
145
154
|
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
- AgentProcessPanelComponent (floating panel)
|
|
155
|
+
<!-- Tasks view -->
|
|
156
|
+
<mj-tasks-full-view
|
|
157
|
+
[projectId]="currentProjectId">
|
|
158
|
+
</mj-tasks-full-view>
|
|
159
|
+
```
|
|
152
160
|
|
|
153
|
-
|
|
154
|
-
- Add `/chat` route to explorer-core
|
|
155
|
-
- Create wrapper components
|
|
156
|
-
- Integrate with Explorer navigation
|
|
161
|
+
### Agent Components
|
|
157
162
|
|
|
158
|
-
|
|
163
|
+
```html
|
|
164
|
+
<!-- Agent execution panel -->
|
|
165
|
+
<mj-agent-process-panel
|
|
166
|
+
[agentRunId]="activeRunId">
|
|
167
|
+
</mj-agent-process-panel>
|
|
159
168
|
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
169
|
+
<!-- Active agent indicator -->
|
|
170
|
+
<mj-active-agent-indicator
|
|
171
|
+
[isActive]="agentIsRunning">
|
|
172
|
+
</mj-active-agent-indicator>
|
|
173
|
+
```
|
|
164
174
|
|
|
165
|
-
|
|
166
|
-
|
|
175
|
+
### Collaboration
|
|
176
|
+
|
|
177
|
+
```html
|
|
178
|
+
<!-- Share modal -->
|
|
179
|
+
<mj-share-modal
|
|
180
|
+
[visible]="showShareModal"
|
|
181
|
+
[resourceId]="resourceId"
|
|
182
|
+
[resourceType]="'conversation'"
|
|
183
|
+
(closed)="onShareClosed()">
|
|
184
|
+
</mj-share-modal>
|
|
185
|
+
|
|
186
|
+
<!-- Export modal -->
|
|
187
|
+
<mj-export-modal
|
|
188
|
+
[visible]="showExportModal"
|
|
189
|
+
[conversationId]="conversationId"
|
|
190
|
+
(exported)="onExported($event)">
|
|
191
|
+
</mj-export-modal>
|
|
167
192
|
```
|
|
168
193
|
|
|
169
|
-
|
|
194
|
+
## Component Reference
|
|
170
195
|
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
196
|
+
### Messaging Components
|
|
197
|
+
|
|
198
|
+
| Component | Selector | Description |
|
|
199
|
+
|-----------|----------|-------------|
|
|
200
|
+
| `MessageItemComponent` | `mj-message-item` | Single message display with markdown, artifacts, and rating |
|
|
201
|
+
| `MessageListComponent` | `mj-message-list` | Scrollable message list with auto-scroll |
|
|
202
|
+
| `MessageInputComponent` | `mj-message-input` | Message input with attachment support |
|
|
203
|
+
| `MessageInputBoxComponent` | `mj-message-input-box` | Core input box with auto-resize |
|
|
204
|
+
| `SuggestedResponsesComponent` | `mj-suggested-responses` | Quick response buttons |
|
|
205
|
+
| `FormQuestionComponent` | `mj-form-question` | Structured form input within conversations |
|
|
206
|
+
| `AgentResponseFormComponent` | `mj-agent-response-form` | Agent-generated form responses |
|
|
207
|
+
| `ActionableCommandsComponent` | `mj-actionable-commands` | Clickable command suggestions |
|
|
208
|
+
| `MentionDropdownComponent` | `mj-mention-dropdown` | @-mention autocomplete dropdown |
|
|
209
|
+
| `MentionEditorComponent` | `mj-mention-editor` | Rich text input with mention support |
|
|
210
|
+
| `ConversationMessageRatingComponent` | `mj-conversation-message-rating` | Message feedback (thumbs up/down) |
|
|
211
|
+
|
|
212
|
+
### Navigation Components
|
|
213
|
+
|
|
214
|
+
| Component | Selector | Description |
|
|
215
|
+
|-----------|----------|-------------|
|
|
216
|
+
| `ConversationWorkspaceComponent` | `mj-conversation-workspace` | Full workspace layout |
|
|
217
|
+
| `ConversationNavigationComponent` | `mj-conversation-navigation` | Top-level navigation |
|
|
218
|
+
| `ConversationSidebarComponent` | `mj-conversation-sidebar` | Left sidebar with conversation list |
|
|
219
|
+
| `ConversationListComponent` | `mj-conversation-list` | Scrollable conversation history |
|
|
220
|
+
| `ConversationChatAreaComponent` | `mj-conversation-chat-area` | Main chat area |
|
|
221
|
+
| `ConversationEmptyStateComponent` | `mj-conversation-empty-state` | Empty state display |
|
|
222
|
+
| `ThreadPanelComponent` | `mj-thread-panel` | Threaded discussion panel |
|
|
223
|
+
|
|
224
|
+
### Collection and Library Components
|
|
225
|
+
|
|
226
|
+
| Component | Selector | Description |
|
|
227
|
+
|-----------|----------|-------------|
|
|
228
|
+
| `CollectionTreeComponent` | `mj-collection-tree` | Hierarchical collection browser |
|
|
229
|
+
| `CollectionViewComponent` | `mj-collection-view` | Collection detail view |
|
|
230
|
+
| `CollectionArtifactCardComponent` | `mj-collection-artifact-card` | Artifact card within collections |
|
|
231
|
+
| `LibraryFullViewComponent` | `mj-library-full-view` | Full library interface |
|
|
232
|
+
| `CollectionFormModalComponent` | `mj-collection-form-modal` | Create/edit collection |
|
|
233
|
+
| `ArtifactCreateModalComponent` | `mj-artifact-create-modal` | Create new artifact |
|
|
234
|
+
| `CollectionsFullViewComponent` | `mj-collections-full-view` | All collections browser |
|
|
235
|
+
|
|
236
|
+
### Project and Task Components
|
|
237
|
+
|
|
238
|
+
| Component | Selector | Description |
|
|
239
|
+
|-----------|----------|-------------|
|
|
240
|
+
| `ProjectSelectorComponent` | `mj-project-selector` | Project selection dropdown |
|
|
241
|
+
| `ProjectFormModalComponent` | `mj-project-form-modal` | Create/edit project |
|
|
242
|
+
| `TasksFullViewComponent` | `mj-tasks-full-view` | Full tasks management view (standalone) |
|
|
243
|
+
| `TasksDropdownComponent` | `mj-tasks-dropdown` | Task quick-access dropdown |
|
|
244
|
+
| `TaskWidgetComponent` | `mj-task-widget` | Compact task widget |
|
|
245
|
+
| `GlobalTasksPanelComponent` | `mj-global-tasks-panel` | Global tasks panel |
|
|
246
|
+
|
|
247
|
+
### Agent Components
|
|
248
|
+
|
|
249
|
+
| Component | Selector | Description |
|
|
250
|
+
|-----------|----------|-------------|
|
|
251
|
+
| `AgentProcessPanelComponent` | `mj-agent-process-panel` | Agent execution panel |
|
|
252
|
+
| `ActiveAgentIndicatorComponent` | `mj-active-agent-indicator` | Active processing indicator |
|
|
253
|
+
| `ActiveTasksPanelComponent` | `mj-active-tasks-panel` | Active tasks panel |
|
|
254
|
+
|
|
255
|
+
### Utility Components
|
|
256
|
+
|
|
257
|
+
| Component | Selector | Description |
|
|
258
|
+
|-----------|----------|-------------|
|
|
259
|
+
| `ShareModalComponent` | `mj-share-modal` | Resource sharing modal |
|
|
260
|
+
| `MembersModalComponent` | `mj-members-modal` | Members management |
|
|
261
|
+
| `ExportModalComponent` | `mj-export-modal` | Data export modal |
|
|
262
|
+
| `SearchPanelComponent` | `mj-search-panel` | Search across conversations |
|
|
263
|
+
| `NotificationBadgeComponent` | `mj-notification-badge` | Unread notification count |
|
|
264
|
+
| `ActivityIndicatorComponent` | `mj-activity-indicator` | Active processing indicator |
|
|
265
|
+
| `ToastComponent` | `mj-toast` | Toast notification display |
|
|
266
|
+
| `InputDialogComponent` | `mj-input-dialog` | Generic text input dialog |
|
|
267
|
+
| `ImageViewerComponent` | `mj-image-viewer` | Image attachment viewer |
|
|
268
|
+
|
|
269
|
+
## Directives
|
|
270
|
+
|
|
271
|
+
| Directive | Selector | Description |
|
|
272
|
+
|-----------|----------|-------------|
|
|
273
|
+
| `SearchShortcutDirective` | `[mjSearchShortcut]` | Keyboard shortcut for search |
|
|
274
|
+
|
|
275
|
+
## Key Design Patterns
|
|
276
|
+
|
|
277
|
+
### Performance Optimization
|
|
278
|
+
|
|
279
|
+
Message components use dynamic component creation (`ViewContainerRef.createComponent`) instead of Angular template binding to minimize render cycles and improve performance with large message lists.
|
|
280
|
+
|
|
281
|
+
### MJ Entity Integration
|
|
282
|
+
|
|
283
|
+
All data operations use the MemberJunction entity system:
|
|
284
|
+
- `Metadata.GetEntityObject()` for entity creation
|
|
285
|
+
- `RunView` for efficient data loading
|
|
286
|
+
- Proper generic typing throughout
|
|
287
|
+
|
|
288
|
+
### Reactive State Management
|
|
289
|
+
|
|
290
|
+
RxJS `BehaviorSubject` instances for all state, with derived observables using `combineLatest` and `shareReplay(1)` for efficient caching.
|
|
291
|
+
|
|
292
|
+
## Dependencies
|
|
293
|
+
|
|
294
|
+
### MemberJunction Packages
|
|
295
|
+
|
|
296
|
+
| Package | Description |
|
|
297
|
+
|---------|-------------|
|
|
298
|
+
| `@memberjunction/core` | Core framework |
|
|
299
|
+
| `@memberjunction/core-entities` | Entity type definitions |
|
|
300
|
+
| `@memberjunction/global` | Global utilities |
|
|
301
|
+
| `@memberjunction/graphql-dataprovider` | GraphQL data access |
|
|
302
|
+
| `@memberjunction/ng-artifacts` | Artifact viewer components |
|
|
303
|
+
| `@memberjunction/ng-code-editor` | Code editor component |
|
|
304
|
+
| `@memberjunction/ng-container-directives` | Container directives |
|
|
305
|
+
| `@memberjunction/ng-markdown` | Markdown rendering |
|
|
306
|
+
| `@memberjunction/ng-shared-generic` | Shared generic components |
|
|
307
|
+
| `@memberjunction/ng-testing` | Testing framework components |
|
|
175
308
|
|
|
176
|
-
###
|
|
309
|
+
### Kendo UI Packages
|
|
177
310
|
|
|
178
|
-
-
|
|
179
|
-
- @memberjunction/core-entities ^2.101.0
|
|
180
|
-
- @memberjunction/global ^2.101.0
|
|
181
|
-
- @memberjunction/graphql-dataprovider ^2.101.0
|
|
182
|
-
- @memberjunction/ng-base-types ^2.101.0
|
|
183
|
-
- @progress/kendo-angular-* ^16.2.0
|
|
184
|
-
- @angular/* ^18.0.2
|
|
185
|
-
- @memberjunction/ng-markdown ^2.125.0
|
|
186
|
-
- marked ^9.1.6
|
|
311
|
+
Uses `@progress/kendo-angular-dialog`, `@progress/kendo-angular-buttons`, `@progress/kendo-angular-inputs`, `@progress/kendo-angular-layout`, `@progress/kendo-angular-indicators`, `@progress/kendo-angular-dropdowns`, `@progress/kendo-angular-notification`, `@progress/kendo-angular-upload`, `@progress/kendo-angular-dateinputs`.
|
|
187
312
|
|
|
188
|
-
###
|
|
313
|
+
### Peer Dependencies
|
|
314
|
+
|
|
315
|
+
- `@angular/common` ^21.x
|
|
316
|
+
- `@angular/core` ^21.x
|
|
317
|
+
- `@angular/forms` ^21.x
|
|
318
|
+
- `@angular/router` ^21.x
|
|
189
319
|
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
320
|
+
## Build
|
|
321
|
+
|
|
322
|
+
```bash
|
|
323
|
+
cd packages/Angular/Generic/conversations
|
|
324
|
+
npm run build
|
|
325
|
+
```
|
|
194
326
|
|
|
195
|
-
|
|
327
|
+
## License
|
|
196
328
|
|
|
197
|
-
|
|
329
|
+
ISC
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"active-tasks-panel.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/active-tasks/active-tasks-panel.component.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAClC,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAC;;AAErF;;;GAGG;AACH,
|
|
1
|
+
{"version":3,"file":"active-tasks-panel.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/active-tasks/active-tasks-panel.component.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,MAAM,CAAC;AAClC,OAAO,EAAE,kBAAkB,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAC;;AAErF;;;GAGG;AACH,qBAuHa,yBAAyB;IAKxB,OAAO,CAAC,kBAAkB;IAJtC,MAAM,EAAE,UAAU,CAAC,UAAU,EAAE,CAAC,CAAC;IACjC,UAAU,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;IAC/B,UAAU,UAAQ;gBAEE,kBAAkB,EAAE,kBAAkB;IAK1D,cAAc,IAAI,IAAI;IAItB,cAAc,CAAC,IAAI,EAAE,UAAU,GAAG,MAAM;IAaxC,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;yCA3B7B,yBAAyB;2CAAzB,yBAAyB;CAkCrC"}
|
|
@@ -2,16 +2,16 @@ import { Component } from '@angular/core';
|
|
|
2
2
|
import * as i0 from "@angular/core";
|
|
3
3
|
import * as i1 from "../../services/active-tasks.service";
|
|
4
4
|
import * as i2 from "@angular/common";
|
|
5
|
-
function
|
|
6
|
-
i0.ɵɵelementStart(0, "div",
|
|
7
|
-
i0.ɵɵelement(2, "i",
|
|
8
|
-
i0.ɵɵelementStart(3, "span",
|
|
5
|
+
function ActiveTasksPanelComponent_Conditional_0_Conditional_7_For_2_Template(rf, ctx) { if (rf & 1) {
|
|
6
|
+
i0.ɵɵelementStart(0, "div", 5)(1, "div", 6);
|
|
7
|
+
i0.ɵɵelement(2, "i", 7);
|
|
8
|
+
i0.ɵɵelementStart(3, "span", 8);
|
|
9
9
|
i0.ɵɵtext(4);
|
|
10
10
|
i0.ɵɵelementEnd();
|
|
11
|
-
i0.ɵɵelementStart(5, "span",
|
|
11
|
+
i0.ɵɵelementStart(5, "span", 9);
|
|
12
12
|
i0.ɵɵtext(6);
|
|
13
13
|
i0.ɵɵelementEnd()();
|
|
14
|
-
i0.ɵɵelementStart(7, "div",
|
|
14
|
+
i0.ɵɵelementStart(7, "div", 10);
|
|
15
15
|
i0.ɵɵtext(8);
|
|
16
16
|
i0.ɵɵelementEnd()();
|
|
17
17
|
} if (rf & 2) {
|
|
@@ -24,28 +24,28 @@ function ActiveTasksPanelComponent_div_0_div_7_div_1_Template(rf, ctx) { if (rf
|
|
|
24
24
|
i0.ɵɵadvance(2);
|
|
25
25
|
i0.ɵɵtextInterpolate(ctx_r1.getTrimmedStatus(task_r3.status));
|
|
26
26
|
} }
|
|
27
|
-
function
|
|
28
|
-
i0.ɵɵelementStart(0, "div",
|
|
29
|
-
i0.ɵɵ
|
|
30
|
-
i0.ɵɵpipe(
|
|
27
|
+
function ActiveTasksPanelComponent_Conditional_0_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
28
|
+
i0.ɵɵelementStart(0, "div", 4);
|
|
29
|
+
i0.ɵɵrepeaterCreate(1, ActiveTasksPanelComponent_Conditional_0_Conditional_7_For_2_Template, 9, 3, "div", 5, i0.ɵɵrepeaterTrackByIdentity);
|
|
30
|
+
i0.ɵɵpipe(3, "async");
|
|
31
31
|
i0.ɵɵelementEnd();
|
|
32
32
|
} if (rf & 2) {
|
|
33
33
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
34
34
|
i0.ɵɵadvance();
|
|
35
|
-
i0.ɵɵ
|
|
35
|
+
i0.ɵɵrepeater(i0.ɵɵpipeBind1(3, 0, ctx_r1.tasks$));
|
|
36
36
|
} }
|
|
37
|
-
function
|
|
37
|
+
function ActiveTasksPanelComponent_Conditional_0_Template(rf, ctx) { if (rf & 1) {
|
|
38
38
|
const _r1 = i0.ɵɵgetCurrentView();
|
|
39
|
-
i0.ɵɵelementStart(0, "div",
|
|
40
|
-
i0.ɵɵlistener("click", function
|
|
41
|
-
i0.ɵɵelement(2, "i",
|
|
39
|
+
i0.ɵɵelementStart(0, "div", 0)(1, "div", 1);
|
|
40
|
+
i0.ɵɵlistener("click", function ActiveTasksPanelComponent_Conditional_0_Template_div_click_1_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.toggleExpanded()); });
|
|
41
|
+
i0.ɵɵelement(2, "i", 2);
|
|
42
42
|
i0.ɵɵelementStart(3, "span");
|
|
43
43
|
i0.ɵɵtext(4);
|
|
44
44
|
i0.ɵɵpipe(5, "async");
|
|
45
45
|
i0.ɵɵelementEnd();
|
|
46
|
-
i0.ɵɵelement(6, "i",
|
|
46
|
+
i0.ɵɵelement(6, "i", 3);
|
|
47
47
|
i0.ɵɵelementEnd();
|
|
48
|
-
i0.ɵɵ
|
|
48
|
+
i0.ɵɵconditionalCreate(7, ActiveTasksPanelComponent_Conditional_0_Conditional_7_Template, 4, 2, "div", 4);
|
|
49
49
|
i0.ɵɵelementEnd();
|
|
50
50
|
} if (rf & 2) {
|
|
51
51
|
const ctx_r1 = i0.ɵɵnextContext();
|
|
@@ -54,7 +54,7 @@ function ActiveTasksPanelComponent_div_0_Template(rf, ctx) { if (rf & 1) {
|
|
|
54
54
|
i0.ɵɵadvance(2);
|
|
55
55
|
i0.ɵɵproperty("ngClass", ctx_r1.isExpanded ? "fa-chevron-up" : "fa-chevron-down");
|
|
56
56
|
i0.ɵɵadvance();
|
|
57
|
-
i0.ɵɵ
|
|
57
|
+
i0.ɵɵconditional(ctx_r1.isExpanded ? 7 : -1);
|
|
58
58
|
} }
|
|
59
59
|
/**
|
|
60
60
|
* Panel component that displays currently running agent tasks.
|
|
@@ -91,35 +91,40 @@ export class ActiveTasksPanelComponent {
|
|
|
91
91
|
return status.substring(0, maxLength) + '...';
|
|
92
92
|
}
|
|
93
93
|
static ɵfac = function ActiveTasksPanelComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ActiveTasksPanelComponent)(i0.ɵɵdirectiveInject(i1.ActiveTasksService)); };
|
|
94
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ActiveTasksPanelComponent, selectors: [["mj-active-tasks-panel"]], decls: 2, vars: 3, consts: [[
|
|
95
|
-
i0.ɵɵ
|
|
94
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ActiveTasksPanelComponent, selectors: [["mj-active-tasks-panel"]], standalone: false, decls: 2, vars: 3, consts: [[1, "active-tasks-panel"], [1, "panel-header", 3, "click"], [1, "fas", "fa-tasks"], [1, "fas", 3, "ngClass"], [1, "panel-content"], [1, "task-item"], [1, "task-header"], [1, "fas", "fa-circle-notch", "fa-spin"], [1, "task-agent"], [1, "task-elapsed"], [1, "task-status"]], template: function ActiveTasksPanelComponent_Template(rf, ctx) { if (rf & 1) {
|
|
95
|
+
i0.ɵɵconditionalCreate(0, ActiveTasksPanelComponent_Conditional_0_Template, 8, 5, "div", 0);
|
|
96
96
|
i0.ɵɵpipe(1, "async");
|
|
97
97
|
} if (rf & 2) {
|
|
98
|
-
i0.ɵɵ
|
|
99
|
-
} }, dependencies: [i2.NgClass, i2.
|
|
98
|
+
i0.ɵɵconditional(i0.ɵɵpipeBind1(1, 1, ctx.taskCount$) > 0 ? 0 : -1);
|
|
99
|
+
} }, dependencies: [i2.NgClass, i2.AsyncPipe], styles: [".active-tasks-panel[_ngcontent-%COMP%] {\n position: fixed;\n bottom: 20px;\n right: 20px;\n width: 320px;\n background: white;\n border: 1px solid #E5E7EB;\n border-radius: 8px;\n box-shadow: 0 4px 12px rgba(0,0,0,0.15);\n z-index: 1000;\n }\n\n .panel-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n background: #F9FAFB;\n border-bottom: 1px solid #E5E7EB;\n border-radius: 8px 8px 0 0;\n cursor: pointer;\n font-weight: 600;\n font-size: 14px;\n color: #111827;\n transition: background 150ms ease;\n }\n\n .panel-header[_ngcontent-%COMP%]:hover {\n background: #F3F4F6;\n }\n\n .panel-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%]:first-child {\n color: #0076B6;\n }\n\n .panel-header[_ngcontent-%COMP%] span[_ngcontent-%COMP%] {\n flex: 1;\n }\n\n .panel-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%]:last-child {\n color: #6B7280;\n font-size: 12px;\n }\n\n .panel-content[_ngcontent-%COMP%] {\n max-height: 300px;\n overflow-y: auto;\n }\n\n .task-item[_ngcontent-%COMP%] {\n padding: 12px 16px;\n border-bottom: 1px solid #F3F4F6;\n }\n\n .task-item[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n }\n\n .task-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 4px;\n }\n\n .task-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #0076B6;\n font-size: 14px;\n }\n\n .task-agent[_ngcontent-%COMP%] {\n flex: 1;\n font-weight: 600;\n color: #111827;\n font-size: 14px;\n }\n\n .task-elapsed[_ngcontent-%COMP%] {\n font-size: 12px;\n color: #6B7280;\n font-weight: 500;\n }\n\n .task-status[_ngcontent-%COMP%] {\n font-size: 13px;\n color: #6B7280;\n padding-left: 22px;\n }"] });
|
|
100
100
|
}
|
|
101
101
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ActiveTasksPanelComponent, [{
|
|
102
102
|
type: Component,
|
|
103
|
-
args: [{ selector: 'mj-active-tasks-panel', template: `
|
|
104
|
-
|
|
105
|
-
<div class="panel
|
|
106
|
-
<
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
<div class="panel-content" *ngIf="isExpanded">
|
|
112
|
-
<div class="task-item" *ngFor="let task of (tasks$ | async)">
|
|
113
|
-
<div class="task-header">
|
|
114
|
-
<i class="fas fa-circle-notch fa-spin"></i>
|
|
115
|
-
<span class="task-agent">{{ task.agentName }}</span>
|
|
116
|
-
<span class="task-elapsed">{{ getElapsedTime(task) }}</span>
|
|
117
|
-
</div>
|
|
118
|
-
<div class="task-status">{{ getTrimmedStatus(task.status) }}</div>
|
|
103
|
+
args: [{ standalone: false, selector: 'mj-active-tasks-panel', template: `
|
|
104
|
+
@if ((taskCount$ | async)! > 0) {
|
|
105
|
+
<div class="active-tasks-panel">
|
|
106
|
+
<div class="panel-header" (click)="toggleExpanded()">
|
|
107
|
+
<i class="fas fa-tasks"></i>
|
|
108
|
+
<span>Active Tasks ({{ taskCount$ | async }})</span>
|
|
109
|
+
<i class="fas" [ngClass]="isExpanded ? 'fa-chevron-up' : 'fa-chevron-down'"></i>
|
|
119
110
|
</div>
|
|
111
|
+
@if (isExpanded) {
|
|
112
|
+
<div class="panel-content">
|
|
113
|
+
@for (task of (tasks$ | async); track task) {
|
|
114
|
+
<div class="task-item">
|
|
115
|
+
<div class="task-header">
|
|
116
|
+
<i class="fas fa-circle-notch fa-spin"></i>
|
|
117
|
+
<span class="task-agent">{{ task.agentName }}</span>
|
|
118
|
+
<span class="task-elapsed">{{ getElapsedTime(task) }}</span>
|
|
119
|
+
</div>
|
|
120
|
+
<div class="task-status">{{ getTrimmedStatus(task.status) }}</div>
|
|
121
|
+
</div>
|
|
122
|
+
}
|
|
123
|
+
</div>
|
|
124
|
+
}
|
|
120
125
|
</div>
|
|
121
|
-
|
|
122
|
-
|
|
126
|
+
}
|
|
127
|
+
`, styles: ["\n .active-tasks-panel {\n position: fixed;\n bottom: 20px;\n right: 20px;\n width: 320px;\n background: white;\n border: 1px solid #E5E7EB;\n border-radius: 8px;\n box-shadow: 0 4px 12px rgba(0,0,0,0.15);\n z-index: 1000;\n }\n\n .panel-header {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 12px 16px;\n background: #F9FAFB;\n border-bottom: 1px solid #E5E7EB;\n border-radius: 8px 8px 0 0;\n cursor: pointer;\n font-weight: 600;\n font-size: 14px;\n color: #111827;\n transition: background 150ms ease;\n }\n\n .panel-header:hover {\n background: #F3F4F6;\n }\n\n .panel-header i:first-child {\n color: #0076B6;\n }\n\n .panel-header span {\n flex: 1;\n }\n\n .panel-header i:last-child {\n color: #6B7280;\n font-size: 12px;\n }\n\n .panel-content {\n max-height: 300px;\n overflow-y: auto;\n }\n\n .task-item {\n padding: 12px 16px;\n border-bottom: 1px solid #F3F4F6;\n }\n\n .task-item:last-child {\n border-bottom: none;\n }\n\n .task-header {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-bottom: 4px;\n }\n\n .task-header i {\n color: #0076B6;\n font-size: 14px;\n }\n\n .task-agent {\n flex: 1;\n font-weight: 600;\n color: #111827;\n font-size: 14px;\n }\n\n .task-elapsed {\n font-size: 12px;\n color: #6B7280;\n font-weight: 500;\n }\n\n .task-status {\n font-size: 13px;\n color: #6B7280;\n padding-left: 22px;\n }\n "] }]
|
|
123
128
|
}], () => [{ type: i1.ActiveTasksService }], null); })();
|
|
124
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ActiveTasksPanelComponent, { className: "ActiveTasksPanelComponent", filePath: "src/lib/components/active-tasks/active-tasks-panel.component.ts", lineNumber:
|
|
129
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ActiveTasksPanelComponent, { className: "ActiveTasksPanelComponent", filePath: "src/lib/components/active-tasks/active-tasks-panel.component.ts", lineNumber: 128 }); })();
|
|
125
130
|
//# sourceMappingURL=active-tasks-panel.component.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"active-tasks-panel.component.js","sourceRoot":"","sources":["../../../../src/lib/components/active-tasks/active-tasks-panel.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;;;;;
|
|
1
|
+
{"version":3,"file":"active-tasks-panel.component.js","sourceRoot":"","sources":["../../../../src/lib/components/active-tasks/active-tasks-panel.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;;;;;IAuB1B,AADF,8BAAuB,aACI;IACvB,uBAA2C;IAC3C,+BAAyB;IAAA,YAAoB;IAAA,iBAAO;IACpD,+BAA2B;IAAA,YAA0B;IACvD,AADuD,iBAAO,EACxD;IACN,+BAAyB;IAAA,YAAmC;IAC9D,AAD8D,iBAAM,EAC9D;;;;IAJuB,eAAoB;IAApB,uCAAoB;IAClB,eAA0B;IAA1B,oDAA0B;IAE9B,eAAmC;IAAnC,6DAAmC;;;IARlE,8BAA2B;IACzB,0IASC;;IACH,iBAAM;;;IAVJ,cASC;IATD,kDASC;;;;IAhBL,AADF,8BAAgC,aACuB;IAA3B,0LAAS,uBAAgB,KAAC;IAClD,uBAA4B;IAC5B,4BAAM;IAAA,YAAuC;;IAAA,iBAAO;IACpD,uBAAgF;IAClF,iBAAM;IACN,yGAAkB;IAcpB,iBAAM;;;IAjBI,eAAuC;IAAvC,qFAAuC;IAC9B,eAA4D;IAA5D,iFAA4D;IAE7E,cAaC;IAbD,4CAaC;;AA5BT;;;GAGG;AAwHH,MAAM,OAAO,yBAAyB;IAKhB;IAJpB,MAAM,CAA2B;IACjC,UAAU,CAAqB;IAC/B,UAAU,GAAG,IAAI,CAAC;IAElB,YAAoB,kBAAsC;QAAtC,uBAAkB,GAAlB,kBAAkB,CAAoB;QACxD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC;QAC7C,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC;IACvD,CAAC;IAED,cAAc;QACZ,IAAI,CAAC,UAAU,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC;IACrC,CAAC;IAED,cAAc,CAAC,IAAgB;QAC7B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC;QAC5C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;QAE3C,IAAI,OAAO,GAAG,EAAE,EAAE,CAAC;YACjB,OAAO,GAAG,OAAO,GAAG,CAAC;QACvB,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,CAAC;QACzC,MAAM,gBAAgB,GAAG,OAAO,GAAG,EAAE,CAAC;QACtC,OAAO,GAAG,OAAO,IAAI,gBAAgB,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;IACtE,CAAC;IAED,gBAAgB,CAAC,MAAc;QAC7B,MAAM,SAAS,GAAG,EAAE,CAAC;QACrB,IAAI,MAAM,CAAC,MAAM,IAAI,SAAS,EAAE,CAAC;YAC/B,OAAO,MAAM,CAAC;QAChB,CAAC;QACD,OAAO,MAAM,CAAC,SAAS,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG,KAAK,CAAC;IAChD,CAAC;mHAjCU,yBAAyB;6DAAzB,yBAAyB;YAnHlC,2FAAiC;;;YAAjC,mEAsBC;;;iFA6FQ,yBAAyB;cAvHrC,SAAS;6BACI,KAAK,YACP,uBAAuB,YACvB;;;;;;;;;;;;;;;;;;;;;;;;KAwBP;;kFA4FQ,yBAAyB"}
|