@memberjunction/ng-conversations 2.111.1 → 2.113.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/dist/lib/components/collection/artifact-create-modal.component.js +1 -1
- package/dist/lib/components/collection/artifact-create-modal.component.js.map +1 -1
- package/dist/lib/components/collection/collection-artifact-card.component.d.ts +8 -7
- package/dist/lib/components/collection/collection-artifact-card.component.d.ts.map +1 -1
- package/dist/lib/components/collection/collection-artifact-card.component.js +52 -36
- package/dist/lib/components/collection/collection-artifact-card.component.js.map +1 -1
- package/dist/lib/components/collection/collection-view.component.d.ts +28 -9
- package/dist/lib/components/collection/collection-view.component.d.ts.map +1 -1
- package/dist/lib/components/collection/collection-view.component.js +124 -58
- package/dist/lib/components/collection/collection-view.component.js.map +1 -1
- package/dist/lib/components/collection/collections-full-view.component.d.ts +18 -6
- package/dist/lib/components/collection/collections-full-view.component.d.ts.map +1 -1
- package/dist/lib/components/collection/collections-full-view.component.js +82 -58
- package/dist/lib/components/collection/collections-full-view.component.js.map +1 -1
- package/dist/lib/components/conversation/conversation-chat-area.component.d.ts +37 -0
- package/dist/lib/components/conversation/conversation-chat-area.component.d.ts.map +1 -1
- package/dist/lib/components/conversation/conversation-chat-area.component.js +278 -162
- package/dist/lib/components/conversation/conversation-chat-area.component.js.map +1 -1
- package/dist/lib/components/conversation/conversation-list.component.d.ts +10 -3
- package/dist/lib/components/conversation/conversation-list.component.d.ts.map +1 -1
- package/dist/lib/components/conversation/conversation-list.component.js +118 -77
- package/dist/lib/components/conversation/conversation-list.component.js.map +1 -1
- package/dist/lib/components/global-tasks/global-tasks-panel.component.d.ts +25 -0
- package/dist/lib/components/global-tasks/global-tasks-panel.component.d.ts.map +1 -0
- package/dist/lib/components/global-tasks/global-tasks-panel.component.js +206 -0
- package/dist/lib/components/global-tasks/global-tasks-panel.component.js.map +1 -0
- package/dist/lib/components/message/conversation-message-rating.component.d.ts +47 -0
- package/dist/lib/components/message/conversation-message-rating.component.d.ts.map +1 -0
- package/dist/lib/components/message/conversation-message-rating.component.js +224 -0
- package/dist/lib/components/message/conversation-message-rating.component.js.map +1 -0
- package/dist/lib/components/message/message-input-box.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-input-box.component.js +2 -12
- package/dist/lib/components/message/message-input-box.component.js.map +1 -1
- package/dist/lib/components/message/message-input.component.d.ts +17 -2
- package/dist/lib/components/message/message-input.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-input.component.js +258 -275
- package/dist/lib/components/message/message-input.component.js.map +1 -1
- package/dist/lib/components/message/message-item.component.d.ts +31 -1
- package/dist/lib/components/message/message-item.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-item.component.js +232 -116
- package/dist/lib/components/message/message-item.component.js.map +1 -1
- package/dist/lib/components/message/message-list.component.d.ts +3 -1
- package/dist/lib/components/message/message-list.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-list.component.js +11 -2
- package/dist/lib/components/message/message-list.component.js.map +1 -1
- package/dist/lib/components/navigation/conversation-navigation.component.d.ts +7 -1
- package/dist/lib/components/navigation/conversation-navigation.component.d.ts.map +1 -1
- package/dist/lib/components/navigation/conversation-navigation.component.js +24 -14
- package/dist/lib/components/navigation/conversation-navigation.component.js.map +1 -1
- package/dist/lib/components/tasks/tasks-dropdown.component.d.ts +17 -28
- package/dist/lib/components/tasks/tasks-dropdown.component.d.ts.map +1 -1
- package/dist/lib/components/tasks/tasks-dropdown.component.js +175 -217
- package/dist/lib/components/tasks/tasks-dropdown.component.js.map +1 -1
- package/dist/lib/components/workspace/conversation-workspace.component.d.ts +14 -8
- package/dist/lib/components/workspace/conversation-workspace.component.d.ts.map +1 -1
- package/dist/lib/components/workspace/conversation-workspace.component.js +103 -64
- package/dist/lib/components/workspace/conversation-workspace.component.js.map +1 -1
- package/dist/lib/conversations.module.d.ts +54 -52
- package/dist/lib/conversations.module.d.ts.map +1 -1
- package/dist/lib/conversations.module.js +11 -3
- package/dist/lib/conversations.module.js.map +1 -1
- package/dist/lib/models/conversation-complete-query.model.d.ts +31 -22
- package/dist/lib/models/conversation-complete-query.model.d.ts.map +1 -1
- package/dist/lib/models/conversation-complete-query.model.js +5 -2
- package/dist/lib/models/conversation-complete-query.model.js.map +1 -1
- package/dist/lib/models/lazy-artifact-info.d.ts +3 -0
- package/dist/lib/models/lazy-artifact-info.d.ts.map +1 -1
- package/dist/lib/models/lazy-artifact-info.js +7 -2
- package/dist/lib/models/lazy-artifact-info.js.map +1 -1
- package/dist/lib/services/active-tasks.service.d.ts +18 -0
- package/dist/lib/services/active-tasks.service.d.ts.map +1 -1
- package/dist/lib/services/active-tasks.service.js +53 -3
- package/dist/lib/services/active-tasks.service.js.map +1 -1
- package/dist/lib/services/agent-state.service.d.ts.map +1 -1
- package/dist/lib/services/agent-state.service.js +5 -5
- package/dist/lib/services/agent-state.service.js.map +1 -1
- package/dist/lib/services/artifact-permission.service.d.ts.map +1 -1
- package/dist/lib/services/artifact-permission.service.js +3 -1
- package/dist/lib/services/artifact-permission.service.js.map +1 -1
- package/dist/lib/services/artifact-state.service.d.ts +22 -5
- package/dist/lib/services/artifact-state.service.d.ts.map +1 -1
- package/dist/lib/services/artifact-state.service.js +118 -30
- package/dist/lib/services/artifact-state.service.js.map +1 -1
- package/dist/lib/services/artifact-use-tracking.service.d.ts +35 -0
- package/dist/lib/services/artifact-use-tracking.service.d.ts.map +1 -0
- package/dist/lib/services/artifact-use-tracking.service.js +76 -0
- package/dist/lib/services/artifact-use-tracking.service.js.map +1 -0
- package/dist/lib/services/conversation-agent.service.d.ts +30 -3
- package/dist/lib/services/conversation-agent.service.d.ts.map +1 -1
- package/dist/lib/services/conversation-agent.service.js +101 -12
- package/dist/lib/services/conversation-agent.service.js.map +1 -1
- package/dist/lib/services/conversation-state.service.d.ts +13 -0
- package/dist/lib/services/conversation-state.service.d.ts.map +1 -1
- package/dist/lib/services/conversation-state.service.js +26 -0
- package/dist/lib/services/conversation-state.service.js.map +1 -1
- package/dist/lib/services/mention-autocomplete.service.d.ts.map +1 -1
- package/dist/lib/services/mention-autocomplete.service.js +1 -1
- package/dist/lib/services/mention-autocomplete.service.js.map +1 -1
- package/dist/lib/services/search.service.d.ts.map +1 -1
- package/dist/lib/services/search.service.js +3 -1
- package/dist/lib/services/search.service.js.map +1 -1
- package/dist/public-api.d.ts +3 -0
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +3 -0
- package/dist/public-api.js.map +1 -1
- package/package.json +14 -14
|
@@ -1,262 +1,210 @@
|
|
|
1
1
|
import { Component, Input, Output, EventEmitter } from '@angular/core';
|
|
2
|
-
import { RunView } from '@memberjunction/core';
|
|
3
2
|
import { Subject } from 'rxjs';
|
|
4
3
|
import { takeUntil } from 'rxjs/operators';
|
|
5
4
|
import * as i0 from "@angular/core";
|
|
6
|
-
import * as i1 from "../../services/
|
|
7
|
-
import * as i2 from "../../services/
|
|
5
|
+
import * as i1 from "../../services/active-tasks.service";
|
|
6
|
+
import * as i2 from "../../services/conversation-state.service";
|
|
8
7
|
import * as i3 from "@angular/common";
|
|
9
|
-
|
|
10
|
-
function TasksDropdownComponent_span_5_Template(rf, ctx) { if (rf & 1) {
|
|
8
|
+
function TasksDropdownComponent_span_3_Template(rf, ctx) { if (rf & 1) {
|
|
11
9
|
i0.ɵɵelementStart(0, "span", 5);
|
|
12
10
|
i0.ɵɵtext(1);
|
|
13
11
|
i0.ɵɵelementEnd();
|
|
14
12
|
} if (rf & 2) {
|
|
15
13
|
const ctx_r0 = i0.ɵɵnextContext();
|
|
16
14
|
i0.ɵɵadvance();
|
|
17
|
-
i0.ɵɵtextInterpolate(ctx_r0.
|
|
15
|
+
i0.ɵɵtextInterpolate(ctx_r0.allTasks.length);
|
|
18
16
|
} }
|
|
19
|
-
function
|
|
20
|
-
i0.ɵɵ
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
i0.ɵɵelement(
|
|
17
|
+
function TasksDropdownComponent_div_4_i_3_Template(rf, ctx) { if (rf & 1) {
|
|
18
|
+
i0.ɵɵelement(0, "i", 16);
|
|
19
|
+
} }
|
|
20
|
+
function TasksDropdownComponent_div_4_i_4_Template(rf, ctx) { if (rf & 1) {
|
|
21
|
+
i0.ɵɵelement(0, "i", 17);
|
|
22
|
+
} }
|
|
23
|
+
function TasksDropdownComponent_div_4_div_10_div_5_Template(rf, ctx) { if (rf & 1) {
|
|
24
|
+
const _r3 = i0.ɵɵgetCurrentView();
|
|
25
|
+
i0.ɵɵelementStart(0, "div", 22);
|
|
26
|
+
i0.ɵɵlistener("click", function TasksDropdownComponent_div_4_div_10_div_5_Template_div_click_0_listener() { const task_r4 = i0.ɵɵrestoreView(_r3).$implicit; const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.onTaskClick(task_r4)); });
|
|
27
|
+
i0.ɵɵelement(1, "div", 23);
|
|
28
|
+
i0.ɵɵelementStart(2, "div", 24)(3, "div", 25);
|
|
29
|
+
i0.ɵɵelement(4, "i", 26);
|
|
24
30
|
i0.ɵɵtext(5);
|
|
25
31
|
i0.ɵɵelementEnd();
|
|
26
|
-
i0.ɵɵelementStart(6, "div",
|
|
32
|
+
i0.ɵɵelementStart(6, "div", 27);
|
|
27
33
|
i0.ɵɵtext(7);
|
|
28
34
|
i0.ɵɵelementEnd();
|
|
29
|
-
i0.ɵɵelementStart(8, "div",
|
|
35
|
+
i0.ɵɵelementStart(8, "div", 28);
|
|
30
36
|
i0.ɵɵtext(9);
|
|
31
37
|
i0.ɵɵelementEnd()()();
|
|
32
38
|
} if (rf & 2) {
|
|
33
|
-
const
|
|
39
|
+
const task_r4 = ctx.$implicit;
|
|
34
40
|
const ctx_r0 = i0.ɵɵnextContext(3);
|
|
35
41
|
i0.ɵɵadvance(5);
|
|
36
|
-
i0.ɵɵtextInterpolate1(" ",
|
|
42
|
+
i0.ɵɵtextInterpolate1(" ", task_r4.agentName, " ");
|
|
37
43
|
i0.ɵɵadvance(2);
|
|
38
|
-
i0.ɵɵtextInterpolate(ctx_r0.getTrimmedStatus(
|
|
44
|
+
i0.ɵɵtextInterpolate(ctx_r0.getTrimmedStatus(task_r4.status));
|
|
39
45
|
i0.ɵɵadvance(2);
|
|
40
|
-
i0.ɵɵtextInterpolate(ctx_r0.getElapsedTime(
|
|
46
|
+
i0.ɵɵtextInterpolate(ctx_r0.getElapsedTime(task_r4));
|
|
41
47
|
} }
|
|
42
|
-
function
|
|
43
|
-
i0.ɵɵelementStart(0, "div",
|
|
44
|
-
i0.ɵɵelement(2, "i",
|
|
48
|
+
function TasksDropdownComponent_div_4_div_10_Template(rf, ctx) { if (rf & 1) {
|
|
49
|
+
i0.ɵɵelementStart(0, "div", 18)(1, "div", 19);
|
|
50
|
+
i0.ɵɵelement(2, "i", 20);
|
|
45
51
|
i0.ɵɵelementStart(3, "span");
|
|
46
52
|
i0.ɵɵtext(4);
|
|
47
53
|
i0.ɵɵelementEnd()();
|
|
48
|
-
i0.ɵɵtemplate(5,
|
|
54
|
+
i0.ɵɵtemplate(5, TasksDropdownComponent_div_4_div_10_div_5_Template, 10, 3, "div", 21);
|
|
49
55
|
i0.ɵɵelementEnd();
|
|
50
56
|
} if (rf & 2) {
|
|
51
57
|
const ctx_r0 = i0.ɵɵnextContext(2);
|
|
52
58
|
i0.ɵɵadvance(4);
|
|
53
|
-
i0.ɵɵtextInterpolate1("
|
|
59
|
+
i0.ɵɵtextInterpolate1("Current Conversation (", ctx_r0.currentConversationTasks.length, ")");
|
|
54
60
|
i0.ɵɵadvance();
|
|
55
|
-
i0.ɵɵproperty("ngForOf", ctx_r0.
|
|
61
|
+
i0.ɵɵproperty("ngForOf", ctx_r0.currentConversationTasks);
|
|
56
62
|
} }
|
|
57
|
-
function
|
|
58
|
-
|
|
59
|
-
i0.ɵɵ
|
|
60
|
-
i0.ɵɵ
|
|
63
|
+
function TasksDropdownComponent_div_4_div_11_div_5_div_8_Template(rf, ctx) { if (rf & 1) {
|
|
64
|
+
i0.ɵɵelementStart(0, "div", 35);
|
|
65
|
+
i0.ɵɵelement(1, "i", 36);
|
|
66
|
+
i0.ɵɵtext(2);
|
|
61
67
|
i0.ɵɵelementEnd();
|
|
62
68
|
} if (rf & 2) {
|
|
63
|
-
const
|
|
64
|
-
i0.ɵɵ
|
|
69
|
+
const task_r6 = i0.ɵɵnextContext().$implicit;
|
|
70
|
+
i0.ɵɵadvance(2);
|
|
71
|
+
i0.ɵɵtextInterpolate1(" ", task_r6.conversationName, " ");
|
|
65
72
|
} }
|
|
66
|
-
function
|
|
67
|
-
i0.ɵɵ
|
|
68
|
-
i0.ɵɵ
|
|
73
|
+
function TasksDropdownComponent_div_4_div_11_div_5_Template(rf, ctx) { if (rf & 1) {
|
|
74
|
+
const _r5 = i0.ɵɵgetCurrentView();
|
|
75
|
+
i0.ɵɵelementStart(0, "div", 31);
|
|
76
|
+
i0.ɵɵlistener("click", function TasksDropdownComponent_div_4_div_11_div_5_Template_div_click_0_listener() { const task_r6 = i0.ɵɵrestoreView(_r5).$implicit; const ctx_r0 = i0.ɵɵnextContext(3); return i0.ɵɵresetView(ctx_r0.onTaskClick(task_r6)); });
|
|
77
|
+
i0.ɵɵelement(1, "div", 23);
|
|
78
|
+
i0.ɵɵelementStart(2, "div", 24)(3, "div", 25);
|
|
79
|
+
i0.ɵɵelement(4, "i", 26);
|
|
80
|
+
i0.ɵɵtext(5);
|
|
81
|
+
i0.ɵɵelementStart(6, "span", 32);
|
|
82
|
+
i0.ɵɵelement(7, "i", 33);
|
|
83
|
+
i0.ɵɵelementEnd()();
|
|
84
|
+
i0.ɵɵtemplate(8, TasksDropdownComponent_div_4_div_11_div_5_div_8_Template, 3, 1, "div", 34);
|
|
85
|
+
i0.ɵɵelementStart(9, "div", 27);
|
|
86
|
+
i0.ɵɵtext(10);
|
|
87
|
+
i0.ɵɵelementEnd();
|
|
88
|
+
i0.ɵɵelementStart(11, "div", 28);
|
|
89
|
+
i0.ɵɵtext(12);
|
|
90
|
+
i0.ɵɵelementEnd()()();
|
|
91
|
+
} if (rf & 2) {
|
|
92
|
+
const task_r6 = ctx.$implicit;
|
|
93
|
+
const ctx_r0 = i0.ɵɵnextContext(3);
|
|
94
|
+
i0.ɵɵadvance(5);
|
|
95
|
+
i0.ɵɵtextInterpolate1(" ", task_r6.agentName, " ");
|
|
96
|
+
i0.ɵɵadvance(3);
|
|
97
|
+
i0.ɵɵproperty("ngIf", task_r6.conversationName);
|
|
98
|
+
i0.ɵɵadvance(2);
|
|
99
|
+
i0.ɵɵtextInterpolate(ctx_r0.getTrimmedStatus(task_r6.status));
|
|
100
|
+
i0.ɵɵadvance(2);
|
|
101
|
+
i0.ɵɵtextInterpolate(ctx_r0.getElapsedTime(task_r6));
|
|
102
|
+
} }
|
|
103
|
+
function TasksDropdownComponent_div_4_div_11_Template(rf, ctx) { if (rf & 1) {
|
|
104
|
+
i0.ɵɵelementStart(0, "div", 18)(1, "div", 19);
|
|
105
|
+
i0.ɵɵelement(2, "i", 29);
|
|
69
106
|
i0.ɵɵelementStart(3, "span");
|
|
70
107
|
i0.ɵɵtext(4);
|
|
71
108
|
i0.ɵɵelementEnd()();
|
|
72
|
-
i0.ɵɵtemplate(5,
|
|
109
|
+
i0.ɵɵtemplate(5, TasksDropdownComponent_div_4_div_11_div_5_Template, 13, 4, "div", 30);
|
|
73
110
|
i0.ɵɵelementEnd();
|
|
74
111
|
} if (rf & 2) {
|
|
75
112
|
const ctx_r0 = i0.ɵɵnextContext(2);
|
|
76
113
|
i0.ɵɵadvance(4);
|
|
77
|
-
i0.ɵɵtextInterpolate1("
|
|
114
|
+
i0.ɵɵtextInterpolate1("Other Conversations (", ctx_r0.otherConversationTasks.length, ")");
|
|
78
115
|
i0.ɵɵadvance();
|
|
79
|
-
i0.ɵɵproperty("ngForOf", ctx_r0.
|
|
116
|
+
i0.ɵɵproperty("ngForOf", ctx_r0.otherConversationTasks);
|
|
80
117
|
} }
|
|
81
|
-
function
|
|
82
|
-
i0.ɵɵelementStart(0, "div",
|
|
83
|
-
i0.ɵɵelement(1, "i",
|
|
118
|
+
function TasksDropdownComponent_div_4_div_12_Template(rf, ctx) { if (rf & 1) {
|
|
119
|
+
i0.ɵɵelementStart(0, "div", 37);
|
|
120
|
+
i0.ɵɵelement(1, "i", 38);
|
|
84
121
|
i0.ɵɵelementStart(2, "p");
|
|
85
122
|
i0.ɵɵtext(3, "No active tasks");
|
|
86
123
|
i0.ɵɵelementEnd()();
|
|
87
124
|
} }
|
|
88
|
-
function
|
|
125
|
+
function TasksDropdownComponent_div_4_Template(rf, ctx) { if (rf & 1) {
|
|
89
126
|
const _r2 = i0.ɵɵgetCurrentView();
|
|
90
127
|
i0.ɵɵelementStart(0, "div", 6)(1, "div", 7)(2, "div", 8);
|
|
91
|
-
i0.ɵɵ
|
|
92
|
-
i0.ɵɵelementStart(
|
|
93
|
-
i0.ɵɵtext(
|
|
128
|
+
i0.ɵɵtemplate(3, TasksDropdownComponent_div_4_i_3_Template, 1, 0, "i", 9)(4, TasksDropdownComponent_div_4_i_4_Template, 1, 0, "i", 10);
|
|
129
|
+
i0.ɵɵelementStart(5, "span");
|
|
130
|
+
i0.ɵɵtext(6);
|
|
94
131
|
i0.ɵɵelementEnd()();
|
|
95
|
-
i0.ɵɵelementStart(
|
|
96
|
-
i0.ɵɵlistener("click", function
|
|
97
|
-
i0.ɵɵelement(
|
|
132
|
+
i0.ɵɵelementStart(7, "button", 11);
|
|
133
|
+
i0.ɵɵlistener("click", function TasksDropdownComponent_div_4_Template_button_click_7_listener() { i0.ɵɵrestoreView(_r2); const ctx_r0 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r0.closeDropdown()); });
|
|
134
|
+
i0.ɵɵelement(8, "i", 12);
|
|
98
135
|
i0.ɵɵelementEnd()();
|
|
99
|
-
i0.ɵɵelementStart(
|
|
100
|
-
i0.ɵɵtemplate(
|
|
136
|
+
i0.ɵɵelementStart(9, "div", 13);
|
|
137
|
+
i0.ɵɵtemplate(10, TasksDropdownComponent_div_4_div_10_Template, 6, 2, "div", 14)(11, TasksDropdownComponent_div_4_div_11_Template, 6, 2, "div", 14)(12, TasksDropdownComponent_div_4_div_12_Template, 4, 0, "div", 15);
|
|
101
138
|
i0.ɵɵelementEnd()();
|
|
102
139
|
} if (rf & 2) {
|
|
103
140
|
const ctx_r0 = i0.ɵɵnextContext();
|
|
104
|
-
i0.ɵɵadvance(
|
|
105
|
-
i0.ɵɵproperty("ngIf", ctx_r0.
|
|
141
|
+
i0.ɵɵadvance(3);
|
|
142
|
+
i0.ɵɵproperty("ngIf", ctx_r0.allTasks.length > 0);
|
|
143
|
+
i0.ɵɵadvance();
|
|
144
|
+
i0.ɵɵproperty("ngIf", ctx_r0.allTasks.length === 0);
|
|
145
|
+
i0.ɵɵadvance(2);
|
|
146
|
+
i0.ɵɵtextInterpolate1("Active Tasks (", ctx_r0.allTasks.length, ")");
|
|
147
|
+
i0.ɵɵadvance(4);
|
|
148
|
+
i0.ɵɵproperty("ngIf", ctx_r0.currentConversationTasks.length > 0);
|
|
106
149
|
i0.ɵɵadvance();
|
|
107
|
-
i0.ɵɵproperty("ngIf", ctx_r0.
|
|
150
|
+
i0.ɵɵproperty("ngIf", ctx_r0.otherConversationTasks.length > 0);
|
|
108
151
|
i0.ɵɵadvance();
|
|
109
|
-
i0.ɵɵproperty("ngIf", ctx_r0.
|
|
152
|
+
i0.ɵɵproperty("ngIf", ctx_r0.allTasks.length === 0);
|
|
110
153
|
} }
|
|
111
154
|
/**
|
|
112
155
|
* Enhanced tasks dropdown component for chat header.
|
|
113
|
-
* Shows
|
|
114
|
-
* 1. Active (running) tasks from ActiveTasksService
|
|
115
|
-
* 2. Database tasks for the current conversation
|
|
156
|
+
* Shows ALL active tasks across ALL conversations, grouped by current vs other
|
|
116
157
|
*/
|
|
117
158
|
export class TasksDropdownComponent {
|
|
118
|
-
conversationState;
|
|
119
159
|
activeTasksService;
|
|
160
|
+
conversationState;
|
|
120
161
|
currentUser;
|
|
121
162
|
taskClicked = new EventEmitter();
|
|
163
|
+
navigateToConversation = new EventEmitter();
|
|
122
164
|
isOpen = false;
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
previousConversationId = null;
|
|
165
|
+
allTasks = [];
|
|
166
|
+
currentConversationTasks = [];
|
|
167
|
+
otherConversationTasks = [];
|
|
127
168
|
destroy$ = new Subject();
|
|
128
|
-
|
|
129
|
-
_enablePolling = false;
|
|
130
|
-
_pollingInterval = 30000; // default to 30 seconds
|
|
131
|
-
constructor(conversationState, activeTasksService) {
|
|
132
|
-
this.conversationState = conversationState;
|
|
169
|
+
constructor(activeTasksService, conversationState) {
|
|
133
170
|
this.activeTasksService = activeTasksService;
|
|
134
|
-
|
|
135
|
-
get enablePolling() {
|
|
136
|
-
return this._enablePolling;
|
|
137
|
-
}
|
|
138
|
-
set enablePolling(value) {
|
|
139
|
-
this._enablePolling = value;
|
|
140
|
-
if (value) {
|
|
141
|
-
this.startPolling();
|
|
142
|
-
}
|
|
143
|
-
else {
|
|
144
|
-
this.stopPolling();
|
|
145
|
-
}
|
|
146
|
-
}
|
|
147
|
-
get pollingInterval() {
|
|
148
|
-
return this._pollingInterval;
|
|
149
|
-
}
|
|
150
|
-
set pollingInterval(value) {
|
|
151
|
-
this._pollingInterval = value;
|
|
152
|
-
if (this.enablePolling) {
|
|
153
|
-
this.stopPolling();
|
|
154
|
-
this.startPolling();
|
|
155
|
-
}
|
|
171
|
+
this.conversationState = conversationState;
|
|
156
172
|
}
|
|
157
173
|
ngOnInit() {
|
|
158
|
-
// Subscribe to active tasks
|
|
174
|
+
// Subscribe to ALL active tasks across ALL conversations
|
|
159
175
|
this.activeTasksService.tasks$
|
|
160
176
|
.pipe(takeUntil(this.destroy$))
|
|
161
177
|
.subscribe(tasks => {
|
|
162
|
-
this.
|
|
163
|
-
this.
|
|
178
|
+
this.allTasks = tasks;
|
|
179
|
+
this.groupTasks();
|
|
164
180
|
});
|
|
165
|
-
// Initial load if there's an active conversation
|
|
166
|
-
if (this.conversationState.activeConversationId) {
|
|
167
|
-
this.loadDatabaseTasks();
|
|
168
|
-
}
|
|
169
|
-
// Poll for task updates every 3 seconds when conversation is active
|
|
170
|
-
if (this.enablePolling) {
|
|
171
|
-
this.startPolling();
|
|
172
|
-
}
|
|
173
|
-
}
|
|
174
|
-
startPolling() {
|
|
175
|
-
// if we already have a polling interval, do nothing
|
|
176
|
-
if (this._pollingIntervalObject) {
|
|
177
|
-
return;
|
|
178
|
-
}
|
|
179
|
-
this._pollingIntervalObject = setInterval(() => {
|
|
180
|
-
if (this.conversationState.activeConversationId) {
|
|
181
|
-
this.loadDatabaseTasks();
|
|
182
|
-
}
|
|
183
|
-
}, 3000); // Poll every 3 seconds
|
|
184
|
-
}
|
|
185
|
-
stopPolling() {
|
|
186
|
-
if (this._pollingIntervalObject) {
|
|
187
|
-
clearInterval(this._pollingIntervalObject);
|
|
188
|
-
this._pollingIntervalObject = null;
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
ngDoCheck() {
|
|
192
|
-
// Detect conversation changes
|
|
193
|
-
const currentId = this.conversationState.activeConversationId;
|
|
194
|
-
if (currentId !== this.previousConversationId) {
|
|
195
|
-
this.previousConversationId = currentId;
|
|
196
|
-
if (currentId) {
|
|
197
|
-
this.loadDatabaseTasks();
|
|
198
|
-
}
|
|
199
|
-
else {
|
|
200
|
-
this.dbTasks = [];
|
|
201
|
-
this.updateTotalCount();
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
181
|
}
|
|
205
182
|
ngOnDestroy() {
|
|
206
|
-
this.stopPolling();
|
|
207
183
|
this.destroy$.next();
|
|
208
184
|
this.destroy$.complete();
|
|
209
185
|
}
|
|
186
|
+
groupTasks() {
|
|
187
|
+
const currentConvId = this.conversationState.activeConversationId;
|
|
188
|
+
this.currentConversationTasks = this.allTasks.filter(task => task.conversationId === currentConvId);
|
|
189
|
+
this.otherConversationTasks = this.allTasks.filter(task => task.conversationId && task.conversationId !== currentConvId);
|
|
190
|
+
}
|
|
210
191
|
toggleDropdown() {
|
|
211
192
|
this.isOpen = !this.isOpen;
|
|
212
|
-
if (this.isOpen) {
|
|
213
|
-
// Refresh database tasks when opening
|
|
214
|
-
this.loadDatabaseTasks();
|
|
215
|
-
}
|
|
216
193
|
}
|
|
217
194
|
closeDropdown() {
|
|
218
195
|
this.isOpen = false;
|
|
219
196
|
}
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
try {
|
|
229
|
-
const rv = new RunView();
|
|
230
|
-
// First get conversation details for this conversation
|
|
231
|
-
const detailsResult = await rv.RunView({
|
|
232
|
-
EntityName: 'Conversation Details',
|
|
233
|
-
ExtraFilter: `ConversationID='${activeId}'`,
|
|
234
|
-
OrderBy: '__mj_CreatedAt ASC',
|
|
235
|
-
ResultType: 'entity_object'
|
|
236
|
-
}, this.currentUser);
|
|
237
|
-
if (!detailsResult.Success || !detailsResult.Results || detailsResult.Results.length === 0) {
|
|
238
|
-
this.dbTasks = [];
|
|
239
|
-
this.updateTotalCount();
|
|
240
|
-
return;
|
|
241
|
-
}
|
|
242
|
-
// Get all conversation detail IDs
|
|
243
|
-
const detailIds = detailsResult.Results.map(d => `'${d.ID}'`).join(',');
|
|
244
|
-
// Load tasks for these conversation details (only top-level active ones)
|
|
245
|
-
const result = await rv.RunView({
|
|
246
|
-
EntityName: 'MJ: Tasks',
|
|
247
|
-
ExtraFilter: `ConversationDetailID IN (${detailIds}) AND Status IN ('Pending', 'In Progress') AND ParentID IS NULL`,
|
|
248
|
-
OrderBy: '__mj_CreatedAt DESC',
|
|
249
|
-
MaxRows: 50,
|
|
250
|
-
ResultType: 'entity_object'
|
|
251
|
-
}, this.currentUser);
|
|
252
|
-
if (result.Success) {
|
|
253
|
-
this.dbTasks = result.Results || [];
|
|
254
|
-
this.updateTotalCount();
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
catch (error) {
|
|
258
|
-
console.error('Failed to load database tasks:', error);
|
|
197
|
+
onTaskClick(task) {
|
|
198
|
+
// If task is from another conversation, emit navigation event
|
|
199
|
+
const currentConvId = this.conversationState.activeConversationId;
|
|
200
|
+
if (task.conversationId && task.conversationId !== currentConvId) {
|
|
201
|
+
this.navigateToConversation.emit({
|
|
202
|
+
conversationId: task.conversationId,
|
|
203
|
+
taskId: task.id
|
|
204
|
+
});
|
|
259
205
|
}
|
|
206
|
+
this.taskClicked.emit(task);
|
|
207
|
+
this.closeDropdown();
|
|
260
208
|
}
|
|
261
209
|
getElapsedTime(task) {
|
|
262
210
|
const elapsed = Date.now() - task.startTime;
|
|
@@ -269,36 +217,30 @@ export class TasksDropdownComponent {
|
|
|
269
217
|
return `${minutes}:${remainingSeconds.toString().padStart(2, '0')}`;
|
|
270
218
|
}
|
|
271
219
|
getTrimmedStatus(status) {
|
|
272
|
-
const maxLength =
|
|
220
|
+
const maxLength = 50;
|
|
273
221
|
if (status.length <= maxLength) {
|
|
274
222
|
return status;
|
|
275
223
|
}
|
|
276
224
|
return status.substring(0, maxLength) + '...';
|
|
277
225
|
}
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
this.closeDropdown();
|
|
281
|
-
}
|
|
282
|
-
static ɵfac = function TasksDropdownComponent_Factory(t) { return new (t || TasksDropdownComponent)(i0.ɵɵdirectiveInject(i1.ConversationStateService), i0.ɵɵdirectiveInject(i2.ActiveTasksService)); };
|
|
283
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: TasksDropdownComponent, selectors: [["mj-tasks-dropdown"]], inputs: { currentUser: "currentUser" }, outputs: { taskClicked: "taskClicked" }, decls: 7, vars: 4, consts: [[1, "tasks-dropdown-container"], ["title", "View tasks", 1, "active-tasks-btn", 3, "click"], [1, "fas", "fa-tasks"], ["class", "task-count-badge", 4, "ngIf"], ["class", "active-tasks-dropdown", 4, "ngIf"], [1, "task-count-badge"], [1, "active-tasks-dropdown"], [1, "dropdown-header"], [1, "header-left"], [1, "close-btn", 3, "click"], [1, "fas", "fa-times"], [1, "dropdown-content"], ["class", "section", 4, "ngIf"], ["class", "no-tasks", 4, "ngIf"], [1, "section"], [1, "section-header"], [1, "fas", "fa-circle-notch", "fa-spin"], ["class", "active-task-item", 4, "ngFor", "ngForOf"], [1, "active-task-item"], [1, "task-status-indicator", "active"], [1, "task-content"], [1, "task-title"], [1, "fas", "fa-robot"], [1, "task-status-text"], [1, "task-elapsed"], [1, "fas", "fa-list-check"], [3, "task", "compact", "clickable", "showProgress", "showDuration", "taskClick", 4, "ngFor", "ngForOf"], [3, "taskClick", "task", "compact", "clickable", "showProgress", "showDuration"], [1, "no-tasks"]], template: function TasksDropdownComponent_Template(rf, ctx) { if (rf & 1) {
|
|
226
|
+
static ɵfac = function TasksDropdownComponent_Factory(t) { return new (t || TasksDropdownComponent)(i0.ɵɵdirectiveInject(i1.ActiveTasksService), i0.ɵɵdirectiveInject(i2.ConversationStateService)); };
|
|
227
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: TasksDropdownComponent, selectors: [["mj-tasks-dropdown"]], inputs: { currentUser: "currentUser" }, outputs: { taskClicked: "taskClicked", navigateToConversation: "navigateToConversation" }, decls: 5, vars: 7, consts: [[1, "tasks-dropdown-container"], [1, "active-tasks-btn", 3, "click", "title"], [1, "fas", "fa-bolt"], ["class", "task-count-badge", 4, "ngIf"], ["class", "active-tasks-dropdown", 4, "ngIf"], [1, "task-count-badge"], [1, "active-tasks-dropdown"], [1, "dropdown-header"], [1, "header-left"], ["class", "fas fa-circle-notch fa-spin", 4, "ngIf"], ["class", "fas fa-tasks", 4, "ngIf"], [1, "close-btn", 3, "click"], [1, "fas", "fa-times"], [1, "dropdown-content"], ["class", "section", 4, "ngIf"], ["class", "no-tasks", 4, "ngIf"], [1, "fas", "fa-circle-notch", "fa-spin"], [1, "fas", "fa-tasks"], [1, "section"], [1, "section-header"], [1, "fas", "fa-comment"], ["class", "active-task-item", 3, "click", 4, "ngFor", "ngForOf"], [1, "active-task-item", 3, "click"], [1, "task-status-indicator", "active"], [1, "task-content"], [1, "task-title"], [1, "fas", "fa-robot"], [1, "task-status-text"], [1, "task-elapsed"], [1, "fas", "fa-comments"], ["class", "active-task-item clickable", 3, "click", 4, "ngFor", "ngForOf"], [1, "active-task-item", "clickable", 3, "click"], [1, "go-btn"], [1, "fas", "fa-arrow-right"], ["class", "task-conversation", 4, "ngIf"], [1, "task-conversation"], [1, "fas", "fa-message"], [1, "no-tasks"], [1, "fas", "fa-check-circle"]], template: function TasksDropdownComponent_Template(rf, ctx) { if (rf & 1) {
|
|
284
228
|
i0.ɵɵelementStart(0, "div", 0)(1, "button", 1);
|
|
285
229
|
i0.ɵɵlistener("click", function TasksDropdownComponent_Template_button_click_1_listener() { return ctx.toggleDropdown(); });
|
|
286
230
|
i0.ɵɵelement(2, "i", 2);
|
|
287
|
-
i0.ɵɵ
|
|
288
|
-
i0.ɵɵtext(4, "Tasks");
|
|
231
|
+
i0.ɵɵtemplate(3, TasksDropdownComponent_span_3_Template, 2, 1, "span", 3);
|
|
289
232
|
i0.ɵɵelementEnd();
|
|
290
|
-
i0.ɵɵtemplate(
|
|
291
|
-
i0.ɵɵelementEnd();
|
|
292
|
-
i0.ɵɵtemplate(6, TasksDropdownComponent_div_6_Template, 12, 3, "div", 4);
|
|
233
|
+
i0.ɵɵtemplate(4, TasksDropdownComponent_div_4_Template, 13, 6, "div", 4);
|
|
293
234
|
i0.ɵɵelementEnd();
|
|
294
235
|
} if (rf & 2) {
|
|
295
236
|
i0.ɵɵadvance();
|
|
296
|
-
i0.ɵɵclassProp("active", ctx.isOpen);
|
|
297
|
-
i0.ɵɵ
|
|
298
|
-
i0.ɵɵ
|
|
237
|
+
i0.ɵɵclassProp("active", ctx.isOpen)("has-tasks", ctx.allTasks.length > 0);
|
|
238
|
+
i0.ɵɵproperty("title", ctx.allTasks.length > 0 ? ctx.allTasks.length + " active task" + (ctx.allTasks.length > 1 ? "s" : "") : "View tasks");
|
|
239
|
+
i0.ɵɵadvance(2);
|
|
240
|
+
i0.ɵɵproperty("ngIf", ctx.allTasks.length > 0);
|
|
299
241
|
i0.ɵɵadvance();
|
|
300
242
|
i0.ɵɵproperty("ngIf", ctx.isOpen);
|
|
301
|
-
} }, dependencies: [i3.NgForOf, i3.NgIf
|
|
243
|
+
} }, dependencies: [i3.NgForOf, i3.NgIf], styles: [".tasks-dropdown-container[_ngcontent-%COMP%] {\n position: relative;\n }\n\n .active-tasks-btn[_ngcontent-%COMP%] {\n position: relative;\n width: 36px;\n height: 36px;\n border-radius: 6px;\n background: transparent;\n border: none;\n color: rgba(255,255,255,0.7);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 16px;\n transition: all 0.2s;\n }\n\n .active-tasks-btn[_ngcontent-%COMP%]:hover {\n background: rgba(255,255,255,0.1);\n color: white;\n }\n\n .active-tasks-btn.active[_ngcontent-%COMP%] {\n background: rgba(255,255,255,0.15);\n color: white;\n }\n\n .active-tasks-btn.has-tasks[_ngcontent-%COMP%] {\n color: #fb923c;\n }\n\n .active-tasks-btn.has-tasks[_ngcontent-%COMP%]:hover {\n color: #f97316;\n }\n\n .task-count-badge[_ngcontent-%COMP%] {\n position: absolute;\n top: -2px;\n right: -2px;\n background: #fb923c;\n color: white;\n padding: 2px 5px;\n border-radius: 10px;\n font-size: 10px;\n font-weight: bold;\n min-width: 16px;\n text-align: center;\n line-height: 1;\n box-shadow: 0 2px 4px rgba(0,0,0,0.2);\n }\n\n .active-tasks-dropdown[_ngcontent-%COMP%] {\n position: absolute;\n top: calc(100% + 8px);\n right: 0;\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 min-width: 420px;\n max-width: 500px;\n }\n\n .dropdown-header[_ngcontent-%COMP%] {\n padding: 12px 16px;\n border-bottom: 1px solid #E5E7EB;\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n\n .header-left[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 600;\n color: #111827;\n }\n\n .header-left[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: var(--accent, #1e40af);\n }\n\n .close-btn[_ngcontent-%COMP%] {\n background: none;\n border: none;\n color: #6B7280;\n cursor: pointer;\n font-size: 18px;\n padding: 0;\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 4px;\n }\n\n .close-btn[_ngcontent-%COMP%]:hover {\n background: #F3F4F6;\n color: #111827;\n }\n\n .dropdown-content[_ngcontent-%COMP%] {\n max-height: 500px;\n overflow-y: auto;\n }\n\n .section[_ngcontent-%COMP%] {\n padding: 12px;\n border-bottom: 1px solid #F3F4F6;\n }\n\n .section[_ngcontent-%COMP%]:last-child {\n border-bottom: none;\n }\n\n .section-header[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n font-weight: 600;\n color: #6B7280;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 12px;\n padding: 0 4px;\n }\n\n .section-header[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 11px;\n }\n\n .active-task-item[_ngcontent-%COMP%] {\n display: flex;\n gap: 12px;\n padding: 10px 12px;\n border-radius: 6px;\n background: #F9FAFB;\n border: 1px solid #E5E7EB;\n margin-bottom: 8px;\n transition: all 0.2s ease;\n }\n\n .active-task-item.clickable[_ngcontent-%COMP%] {\n cursor: pointer;\n }\n\n .active-task-item.clickable[_ngcontent-%COMP%]:hover {\n background: #EEF2FF;\n border-color: #C7D2FE;\n transform: translateX(2px);\n }\n\n .active-task-item[_ngcontent-%COMP%]:last-child {\n margin-bottom: 0;\n }\n\n .task-status-indicator[_ngcontent-%COMP%] {\n width: 4px;\n border-radius: 2px;\n flex-shrink: 0;\n }\n\n .task-status-indicator.active[_ngcontent-%COMP%] {\n background: #3B82F6;\n animation: _ngcontent-%COMP%_pulse 2s ease-in-out infinite;\n }\n\n @keyframes _ngcontent-%COMP%_pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.5; }\n }\n\n .task-content[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n\n .task-title[_ngcontent-%COMP%] {\n font-size: 14px;\n font-weight: 600;\n color: #111827;\n display: flex;\n align-items: center;\n gap: 6px;\n }\n\n .task-title[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n color: #3B82F6;\n font-size: 12px;\n }\n\n .go-btn[_ngcontent-%COMP%] {\n margin-left: auto;\n color: #3B82F6;\n font-size: 10px;\n opacity: 0.7;\n }\n\n .active-task-item.clickable[_ngcontent-%COMP%]:hover .go-btn[_ngcontent-%COMP%] {\n opacity: 1;\n }\n\n .task-conversation[_ngcontent-%COMP%] {\n font-size: 11px;\n color: #9CA3AF;\n display: flex;\n align-items: center;\n gap: 4px;\n }\n\n .task-conversation[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 10px;\n }\n\n .task-status-text[_ngcontent-%COMP%] {\n font-size: 12px;\n color: #6B7280;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .task-elapsed[_ngcontent-%COMP%] {\n font-size: 11px;\n color: #3B82F6;\n font-weight: 600;\n }\n\n .no-tasks[_ngcontent-%COMP%] {\n padding: 40px 16px;\n text-align: center;\n color: #9CA3AF;\n }\n\n .no-tasks[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 32px;\n margin-bottom: 8px;\n opacity: 0.5;\n color: #10B981;\n }\n\n .no-tasks[_ngcontent-%COMP%] p[_ngcontent-%COMP%] {\n margin: 0;\n font-size: 14px;\n }\n\n \n\n .dropdown-content[_ngcontent-%COMP%]::-webkit-scrollbar {\n width: 6px;\n }\n\n .dropdown-content[_ngcontent-%COMP%]::-webkit-scrollbar-track {\n background: #F9FAFB;\n }\n\n .dropdown-content[_ngcontent-%COMP%]::-webkit-scrollbar-thumb {\n background: #D1D5DB;\n border-radius: 3px;\n }\n\n .dropdown-content[_ngcontent-%COMP%]::-webkit-scrollbar-thumb:hover {\n background: #9CA3AF;\n }"] });
|
|
302
244
|
}
|
|
303
245
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(TasksDropdownComponent, [{
|
|
304
246
|
type: Component,
|
|
@@ -308,17 +250,18 @@ export class TasksDropdownComponent {
|
|
|
308
250
|
class="active-tasks-btn"
|
|
309
251
|
(click)="toggleDropdown()"
|
|
310
252
|
[class.active]="isOpen"
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
<
|
|
314
|
-
<span class="task-count-badge" *ngIf="
|
|
253
|
+
[class.has-tasks]="allTasks.length > 0"
|
|
254
|
+
[title]="allTasks.length > 0 ? allTasks.length + ' active task' + (allTasks.length > 1 ? 's' : '') : 'View tasks'">
|
|
255
|
+
<i class="fas fa-bolt"></i>
|
|
256
|
+
<span class="task-count-badge" *ngIf="allTasks.length > 0">{{ allTasks.length }}</span>
|
|
315
257
|
</button>
|
|
316
258
|
|
|
317
259
|
<div class="active-tasks-dropdown" *ngIf="isOpen">
|
|
318
260
|
<div class="dropdown-header">
|
|
319
261
|
<div class="header-left">
|
|
320
|
-
<i class="fas fa-
|
|
321
|
-
<
|
|
262
|
+
<i class="fas fa-circle-notch fa-spin" *ngIf="allTasks.length > 0"></i>
|
|
263
|
+
<i class="fas fa-tasks" *ngIf="allTasks.length === 0"></i>
|
|
264
|
+
<span>Active Tasks ({{ allTasks.length }})</span>
|
|
322
265
|
</div>
|
|
323
266
|
<button class="close-btn" (click)="closeDropdown()">
|
|
324
267
|
<i class="fas fa-times"></i>
|
|
@@ -326,13 +269,15 @@ export class TasksDropdownComponent {
|
|
|
326
269
|
</div>
|
|
327
270
|
|
|
328
271
|
<div class="dropdown-content">
|
|
329
|
-
<!--
|
|
330
|
-
<div class="section" *ngIf="
|
|
272
|
+
<!-- Current Conversation Tasks -->
|
|
273
|
+
<div class="section" *ngIf="currentConversationTasks.length > 0">
|
|
331
274
|
<div class="section-header">
|
|
332
|
-
<i class="fas fa-
|
|
333
|
-
<span>
|
|
275
|
+
<i class="fas fa-comment"></i>
|
|
276
|
+
<span>Current Conversation ({{ currentConversationTasks.length }})</span>
|
|
334
277
|
</div>
|
|
335
|
-
<div class="active-task-item"
|
|
278
|
+
<div class="active-task-item"
|
|
279
|
+
*ngFor="let task of currentConversationTasks"
|
|
280
|
+
(click)="onTaskClick(task)">
|
|
336
281
|
<div class="task-status-indicator active"></div>
|
|
337
282
|
<div class="task-content">
|
|
338
283
|
<div class="task-title">
|
|
@@ -345,36 +290,49 @@ export class TasksDropdownComponent {
|
|
|
345
290
|
</div>
|
|
346
291
|
</div>
|
|
347
292
|
|
|
348
|
-
<!--
|
|
349
|
-
<div class="section" *ngIf="
|
|
293
|
+
<!-- Other Conversations Tasks -->
|
|
294
|
+
<div class="section" *ngIf="otherConversationTasks.length > 0">
|
|
350
295
|
<div class="section-header">
|
|
351
|
-
<i class="fas fa-
|
|
352
|
-
<span>
|
|
296
|
+
<i class="fas fa-comments"></i>
|
|
297
|
+
<span>Other Conversations ({{ otherConversationTasks.length }})</span>
|
|
298
|
+
</div>
|
|
299
|
+
<div class="active-task-item clickable"
|
|
300
|
+
*ngFor="let task of otherConversationTasks"
|
|
301
|
+
(click)="onTaskClick(task)">
|
|
302
|
+
<div class="task-status-indicator active"></div>
|
|
303
|
+
<div class="task-content">
|
|
304
|
+
<div class="task-title">
|
|
305
|
+
<i class="fas fa-robot"></i>
|
|
306
|
+
{{ task.agentName }}
|
|
307
|
+
<span class="go-btn">
|
|
308
|
+
<i class="fas fa-arrow-right"></i>
|
|
309
|
+
</span>
|
|
310
|
+
</div>
|
|
311
|
+
<div class="task-conversation" *ngIf="task.conversationName">
|
|
312
|
+
<i class="fas fa-message"></i>
|
|
313
|
+
{{ task.conversationName }}
|
|
314
|
+
</div>
|
|
315
|
+
<div class="task-status-text">{{ getTrimmedStatus(task.status) }}</div>
|
|
316
|
+
<div class="task-elapsed">{{ getElapsedTime(task) }}</div>
|
|
317
|
+
</div>
|
|
353
318
|
</div>
|
|
354
|
-
<mj-task-widget
|
|
355
|
-
*ngFor="let task of dbTasks"
|
|
356
|
-
[task]="task"
|
|
357
|
-
[compact]="true"
|
|
358
|
-
[clickable]="true"
|
|
359
|
-
[showProgress]="true"
|
|
360
|
-
[showDuration]="false"
|
|
361
|
-
(taskClick)="onTaskClick($event)">
|
|
362
|
-
</mj-task-widget>
|
|
363
319
|
</div>
|
|
364
320
|
|
|
365
321
|
<!-- No Tasks State -->
|
|
366
|
-
<div *ngIf="
|
|
367
|
-
<i class="fas fa-
|
|
322
|
+
<div *ngIf="allTasks.length === 0" class="no-tasks">
|
|
323
|
+
<i class="fas fa-check-circle"></i>
|
|
368
324
|
<p>No active tasks</p>
|
|
369
325
|
</div>
|
|
370
326
|
</div>
|
|
371
327
|
</div>
|
|
372
328
|
</div>
|
|
373
|
-
`, styles: ["\n .tasks-dropdown-container {\n position: relative;\n }\n\n .active-tasks-btn {\n
|
|
374
|
-
}], () => [{ type: i1.
|
|
329
|
+
`, styles: ["\n .tasks-dropdown-container {\n position: relative;\n }\n\n .active-tasks-btn {\n position: relative;\n width: 36px;\n height: 36px;\n border-radius: 6px;\n background: transparent;\n border: none;\n color: rgba(255,255,255,0.7);\n cursor: pointer;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 16px;\n transition: all 0.2s;\n }\n\n .active-tasks-btn:hover {\n background: rgba(255,255,255,0.1);\n color: white;\n }\n\n .active-tasks-btn.active {\n background: rgba(255,255,255,0.15);\n color: white;\n }\n\n .active-tasks-btn.has-tasks {\n color: #fb923c;\n }\n\n .active-tasks-btn.has-tasks:hover {\n color: #f97316;\n }\n\n .task-count-badge {\n position: absolute;\n top: -2px;\n right: -2px;\n background: #fb923c;\n color: white;\n padding: 2px 5px;\n border-radius: 10px;\n font-size: 10px;\n font-weight: bold;\n min-width: 16px;\n text-align: center;\n line-height: 1;\n box-shadow: 0 2px 4px rgba(0,0,0,0.2);\n }\n\n .active-tasks-dropdown {\n position: absolute;\n top: calc(100% + 8px);\n right: 0;\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 min-width: 420px;\n max-width: 500px;\n }\n\n .dropdown-header {\n padding: 12px 16px;\n border-bottom: 1px solid #E5E7EB;\n display: flex;\n justify-content: space-between;\n align-items: center;\n }\n\n .header-left {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 600;\n color: #111827;\n }\n\n .header-left i {\n color: var(--accent, #1e40af);\n }\n\n .close-btn {\n background: none;\n border: none;\n color: #6B7280;\n cursor: pointer;\n font-size: 18px;\n padding: 0;\n width: 24px;\n height: 24px;\n display: flex;\n align-items: center;\n justify-content: center;\n border-radius: 4px;\n }\n\n .close-btn:hover {\n background: #F3F4F6;\n color: #111827;\n }\n\n .dropdown-content {\n max-height: 500px;\n overflow-y: auto;\n }\n\n .section {\n padding: 12px;\n border-bottom: 1px solid #F3F4F6;\n }\n\n .section:last-child {\n border-bottom: none;\n }\n\n .section-header {\n display: flex;\n align-items: center;\n gap: 8px;\n font-size: 12px;\n font-weight: 600;\n color: #6B7280;\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 12px;\n padding: 0 4px;\n }\n\n .section-header i {\n font-size: 11px;\n }\n\n .active-task-item {\n display: flex;\n gap: 12px;\n padding: 10px 12px;\n border-radius: 6px;\n background: #F9FAFB;\n border: 1px solid #E5E7EB;\n margin-bottom: 8px;\n transition: all 0.2s ease;\n }\n\n .active-task-item.clickable {\n cursor: pointer;\n }\n\n .active-task-item.clickable:hover {\n background: #EEF2FF;\n border-color: #C7D2FE;\n transform: translateX(2px);\n }\n\n .active-task-item:last-child {\n margin-bottom: 0;\n }\n\n .task-status-indicator {\n width: 4px;\n border-radius: 2px;\n flex-shrink: 0;\n }\n\n .task-status-indicator.active {\n background: #3B82F6;\n animation: pulse 2s ease-in-out infinite;\n }\n\n @keyframes pulse {\n 0%, 100% { opacity: 1; }\n 50% { opacity: 0.5; }\n }\n\n .task-content {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 4px;\n }\n\n .task-title {\n font-size: 14px;\n font-weight: 600;\n color: #111827;\n display: flex;\n align-items: center;\n gap: 6px;\n }\n\n .task-title i {\n color: #3B82F6;\n font-size: 12px;\n }\n\n .go-btn {\n margin-left: auto;\n color: #3B82F6;\n font-size: 10px;\n opacity: 0.7;\n }\n\n .active-task-item.clickable:hover .go-btn {\n opacity: 1;\n }\n\n .task-conversation {\n font-size: 11px;\n color: #9CA3AF;\n display: flex;\n align-items: center;\n gap: 4px;\n }\n\n .task-conversation i {\n font-size: 10px;\n }\n\n .task-status-text {\n font-size: 12px;\n color: #6B7280;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .task-elapsed {\n font-size: 11px;\n color: #3B82F6;\n font-weight: 600;\n }\n\n .no-tasks {\n padding: 40px 16px;\n text-align: center;\n color: #9CA3AF;\n }\n\n .no-tasks i {\n font-size: 32px;\n margin-bottom: 8px;\n opacity: 0.5;\n color: #10B981;\n }\n\n .no-tasks p {\n margin: 0;\n font-size: 14px;\n }\n\n /* Scrollbar Styling */\n .dropdown-content::-webkit-scrollbar {\n width: 6px;\n }\n\n .dropdown-content::-webkit-scrollbar-track {\n background: #F9FAFB;\n }\n\n .dropdown-content::-webkit-scrollbar-thumb {\n background: #D1D5DB;\n border-radius: 3px;\n }\n\n .dropdown-content::-webkit-scrollbar-thumb:hover {\n background: #9CA3AF;\n }\n "] }]
|
|
330
|
+
}], () => [{ type: i1.ActiveTasksService }, { type: i2.ConversationStateService }], { currentUser: [{
|
|
375
331
|
type: Input
|
|
376
332
|
}], taskClicked: [{
|
|
377
333
|
type: Output
|
|
334
|
+
}], navigateToConversation: [{
|
|
335
|
+
type: Output
|
|
378
336
|
}] }); })();
|
|
379
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(TasksDropdownComponent, { className: "TasksDropdownComponent", filePath: "src/lib/components/tasks/tasks-dropdown.component.ts", lineNumber:
|
|
337
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(TasksDropdownComponent, { className: "TasksDropdownComponent", filePath: "src/lib/components/tasks/tasks-dropdown.component.ts", lineNumber: 373 }); })();
|
|
380
338
|
//# sourceMappingURL=tasks-dropdown.component.js.map
|