@memberjunction/ng-conversations 2.129.0 → 2.130.1
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/attachment/image-viewer.component.d.ts +95 -0
- package/dist/lib/components/attachment/image-viewer.component.d.ts.map +1 -0
- package/dist/lib/components/attachment/image-viewer.component.js +293 -0
- package/dist/lib/components/attachment/image-viewer.component.js.map +1 -0
- package/dist/lib/components/conversation/conversation-chat-area.component.d.ts +76 -7
- package/dist/lib/components/conversation/conversation-chat-area.component.d.ts.map +1 -1
- package/dist/lib/components/conversation/conversation-chat-area.component.js +433 -193
- package/dist/lib/components/conversation/conversation-chat-area.component.js.map +1 -1
- package/dist/lib/components/conversation/conversation-empty-state.component.d.ts +12 -3
- package/dist/lib/components/conversation/conversation-empty-state.component.d.ts.map +1 -1
- package/dist/lib/components/conversation/conversation-empty-state.component.js +68 -55
- package/dist/lib/components/conversation/conversation-empty-state.component.js.map +1 -1
- package/dist/lib/components/conversation/conversation-list.component.d.ts +2 -0
- package/dist/lib/components/conversation/conversation-list.component.d.ts.map +1 -1
- package/dist/lib/components/conversation/conversation-list.component.js +157 -145
- package/dist/lib/components/conversation/conversation-list.component.js.map +1 -1
- package/dist/lib/components/mention/mention-editor.component.d.ts +102 -5
- package/dist/lib/components/mention/mention-editor.component.d.ts.map +1 -1
- package/dist/lib/components/mention/mention-editor.component.js +349 -21
- package/dist/lib/components/mention/mention-editor.component.js.map +1 -1
- package/dist/lib/components/message/message-input-box.component.d.ts +29 -2
- package/dist/lib/components/message/message-input-box.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-input-box.component.js +79 -12
- package/dist/lib/components/message/message-input-box.component.js.map +1 -1
- package/dist/lib/components/message/message-input.component.d.ts +56 -4
- package/dist/lib/components/message/message-input.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-input.component.js +227 -60
- package/dist/lib/components/message/message-input.component.js.map +1 -1
- package/dist/lib/components/message/message-item.component.d.ts +34 -1
- package/dist/lib/components/message/message-item.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-item.component.js +181 -93
- package/dist/lib/components/message/message-item.component.js.map +1 -1
- package/dist/lib/components/message/message-list.component.d.ts +4 -1
- package/dist/lib/components/message/message-list.component.d.ts.map +1 -1
- package/dist/lib/components/message/message-list.component.js +12 -1
- package/dist/lib/components/message/message-list.component.js.map +1 -1
- package/dist/lib/components/workspace/conversation-workspace.component.d.ts +44 -13
- package/dist/lib/components/workspace/conversation-workspace.component.d.ts.map +1 -1
- package/dist/lib/components/workspace/conversation-workspace.component.js +82 -108
- package/dist/lib/components/workspace/conversation-workspace.component.js.map +1 -1
- package/dist/lib/conversations.module.d.ts +26 -25
- package/dist/lib/conversations.module.d.ts.map +1 -1
- package/dist/lib/conversations.module.js +7 -3
- package/dist/lib/conversations.module.js.map +1 -1
- package/dist/lib/services/active-tasks.service.d.ts +23 -0
- package/dist/lib/services/active-tasks.service.d.ts.map +1 -1
- package/dist/lib/services/active-tasks.service.js +91 -2
- package/dist/lib/services/active-tasks.service.js.map +1 -1
- package/dist/lib/services/conversation-agent.service.d.ts +36 -5
- package/dist/lib/services/conversation-agent.service.d.ts.map +1 -1
- package/dist/lib/services/conversation-agent.service.js +233 -71
- package/dist/lib/services/conversation-agent.service.js.map +1 -1
- package/dist/lib/services/conversation-attachment.service.d.ts +79 -0
- package/dist/lib/services/conversation-attachment.service.d.ts.map +1 -0
- package/dist/lib/services/conversation-attachment.service.js +327 -0
- package/dist/lib/services/conversation-attachment.service.js.map +1 -0
- package/dist/lib/services/conversation-data.service.d.ts +15 -1
- package/dist/lib/services/conversation-data.service.d.ts.map +1 -1
- package/dist/lib/services/conversation-data.service.js +23 -1
- package/dist/lib/services/conversation-data.service.js.map +1 -1
- package/dist/lib/services/conversation-streaming.service.d.ts +26 -1
- package/dist/lib/services/conversation-streaming.service.d.ts.map +1 -1
- package/dist/lib/services/conversation-streaming.service.js +18 -3
- package/dist/lib/services/conversation-streaming.service.js.map +1 -1
- package/dist/lib/services/mention-parser.service.d.ts +15 -0
- package/dist/lib/services/mention-parser.service.d.ts.map +1 -1
- package/dist/lib/services/mention-parser.service.js +30 -0
- package/dist/lib/services/mention-parser.service.js.map +1 -1
- package/dist/public-api.d.ts +2 -0
- package/dist/public-api.d.ts.map +1 -1
- package/dist/public-api.js +2 -0
- package/dist/public-api.js.map +1 -1
- package/package.json +17 -17
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import { EventEmitter, OnInit, OnDestroy } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
/**
|
|
4
|
+
* Full-screen image viewer modal with zoom and pan capabilities.
|
|
5
|
+
* Provides a lightbox-style experience for viewing attachment images.
|
|
6
|
+
*/
|
|
7
|
+
export declare class ImageViewerComponent implements OnInit, OnDestroy {
|
|
8
|
+
/** Image source URL (can be data URL or regular URL) */
|
|
9
|
+
imageUrl: string;
|
|
10
|
+
/** Image alt text */
|
|
11
|
+
alt: string;
|
|
12
|
+
/** Image filename for download */
|
|
13
|
+
fileName: string;
|
|
14
|
+
/** Whether the viewer is visible */
|
|
15
|
+
visible: boolean;
|
|
16
|
+
/** Emits when the viewer should be closed */
|
|
17
|
+
closed: EventEmitter<void>;
|
|
18
|
+
zoomLevel: number;
|
|
19
|
+
minZoom: number;
|
|
20
|
+
maxZoom: number;
|
|
21
|
+
translateX: number;
|
|
22
|
+
translateY: number;
|
|
23
|
+
isDragging: boolean;
|
|
24
|
+
private lastMouseX;
|
|
25
|
+
private lastMouseY;
|
|
26
|
+
ngOnInit(): void;
|
|
27
|
+
ngOnDestroy(): void;
|
|
28
|
+
/**
|
|
29
|
+
* Handle escape key to close
|
|
30
|
+
*/
|
|
31
|
+
onEscapeKey(): void;
|
|
32
|
+
/**
|
|
33
|
+
* Handle mouse wheel for zoom
|
|
34
|
+
*/
|
|
35
|
+
onWheel(event: WheelEvent): void;
|
|
36
|
+
/**
|
|
37
|
+
* Close the viewer
|
|
38
|
+
*/
|
|
39
|
+
close(): void;
|
|
40
|
+
/**
|
|
41
|
+
* Handle backdrop click
|
|
42
|
+
*/
|
|
43
|
+
onBackdropClick(event: MouseEvent): void;
|
|
44
|
+
/**
|
|
45
|
+
* Zoom in
|
|
46
|
+
*/
|
|
47
|
+
zoomIn(): void;
|
|
48
|
+
/**
|
|
49
|
+
* Zoom out
|
|
50
|
+
*/
|
|
51
|
+
zoomOut(): void;
|
|
52
|
+
/**
|
|
53
|
+
* Reset to 100% zoom
|
|
54
|
+
*/
|
|
55
|
+
resetZoom(): void;
|
|
56
|
+
/**
|
|
57
|
+
* Fit image to screen
|
|
58
|
+
*/
|
|
59
|
+
fitToScreen(): void;
|
|
60
|
+
/**
|
|
61
|
+
* Reset view to initial state
|
|
62
|
+
*/
|
|
63
|
+
private resetView;
|
|
64
|
+
/**
|
|
65
|
+
* Adjust zoom level
|
|
66
|
+
*/
|
|
67
|
+
private adjustZoom;
|
|
68
|
+
/**
|
|
69
|
+
* Handle mouse down for dragging
|
|
70
|
+
*/
|
|
71
|
+
onMouseDown(event: MouseEvent): void;
|
|
72
|
+
/**
|
|
73
|
+
* Handle mouse move for dragging
|
|
74
|
+
*/
|
|
75
|
+
onMouseMove(event: MouseEvent): void;
|
|
76
|
+
/**
|
|
77
|
+
* Handle mouse up to stop dragging
|
|
78
|
+
*/
|
|
79
|
+
onMouseUp(): void;
|
|
80
|
+
/**
|
|
81
|
+
* Download the image
|
|
82
|
+
*/
|
|
83
|
+
downloadImage(): void;
|
|
84
|
+
/**
|
|
85
|
+
* Get current zoom percentage for display
|
|
86
|
+
*/
|
|
87
|
+
get zoomPercentage(): string;
|
|
88
|
+
/**
|
|
89
|
+
* Get transform style for image
|
|
90
|
+
*/
|
|
91
|
+
get imageTransform(): string;
|
|
92
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<ImageViewerComponent, never>;
|
|
93
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<ImageViewerComponent, "mj-image-viewer", never, { "imageUrl": { "alias": "imageUrl"; "required": false; }; "alt": { "alias": "alt"; "required": false; }; "fileName": { "alias": "fileName"; "required": false; }; "visible": { "alias": "visible"; "required": false; }; }, { "closed": "closed"; }, never, never, false, never>;
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=image-viewer.component.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image-viewer.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/attachment/image-viewer.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,YAAY,EAEZ,MAAM,EACN,SAAS,EACV,MAAM,eAAe,CAAC;;AAEvB;;;GAGG;AACH,qBAKa,oBAAqB,YAAW,MAAM,EAAE,SAAS;IAC5D,wDAAwD;IAC/C,QAAQ,EAAE,MAAM,CAAM;IAE/B,qBAAqB;IACZ,GAAG,EAAE,MAAM,CAAW;IAE/B,kCAAkC;IACzB,QAAQ,EAAE,MAAM,CAAW;IAEpC,oCAAoC;IAC3B,OAAO,EAAE,OAAO,CAAS;IAElC,6CAA6C;IACnC,MAAM,qBAA4B;IAGrC,SAAS,EAAE,MAAM,CAAK;IACtB,OAAO,EAAE,MAAM,CAAO;IACtB,OAAO,EAAE,MAAM,CAAK;IACpB,UAAU,EAAE,MAAM,CAAK;IACvB,UAAU,EAAE,MAAM,CAAK;IAGvB,UAAU,EAAE,OAAO,CAAS;IACnC,OAAO,CAAC,UAAU,CAAa;IAC/B,OAAO,CAAC,UAAU,CAAa;IAE/B,QAAQ,IAAI,IAAI;IAOhB,WAAW,IAAI,IAAI;IAKnB;;OAEG;IAEH,WAAW,IAAI,IAAI;IAMnB;;OAEG;IAEH,OAAO,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAQhC;;OAEG;IACH,KAAK,IAAI,IAAI;IAMb;;OAEG;IACH,eAAe,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAQxC;;OAEG;IACH,MAAM,IAAI,IAAI;IAId;;OAEG;IACH,OAAO,IAAI,IAAI;IAIf;;OAEG;IACH,SAAS,IAAI,IAAI;IAMjB;;OAEG;IACH,WAAW,IAAI,IAAI;IAKnB;;OAEG;IACH,OAAO,CAAC,SAAS;IAMjB;;OAEG;IACH,OAAO,CAAC,UAAU;IAoBlB;;OAEG;IACH,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAUpC;;OAEG;IAEH,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI;IAapC;;OAEG;IAEH,SAAS,IAAI,IAAI;IAIjB;;OAEG;IACH,aAAa,IAAI,IAAI;IAOrB;;OAEG;IACH,IAAI,cAAc,IAAI,MAAM,CAE3B;IAED;;OAEG;IACH,IAAI,cAAc,IAAI,MAAM,CAE3B;yCA7MU,oBAAoB;2CAApB,oBAAoB;CA8MhC"}
|
|
@@ -0,0 +1,293 @@
|
|
|
1
|
+
import { Component, Input, Output, EventEmitter, HostListener } from '@angular/core';
|
|
2
|
+
import * as i0 from "@angular/core";
|
|
3
|
+
import * as i1 from "@angular/common";
|
|
4
|
+
function ImageViewerComponent_div_0_span_3_Template(rf, ctx) { if (rf & 1) {
|
|
5
|
+
i0.ɵɵelementStart(0, "span", 25);
|
|
6
|
+
i0.ɵɵtext(1);
|
|
7
|
+
i0.ɵɵelementEnd();
|
|
8
|
+
} if (rf & 2) {
|
|
9
|
+
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
10
|
+
i0.ɵɵadvance();
|
|
11
|
+
i0.ɵɵtextInterpolate(ctx_r1.fileName);
|
|
12
|
+
} }
|
|
13
|
+
function ImageViewerComponent_div_0_Template(rf, ctx) { if (rf & 1) {
|
|
14
|
+
const _r1 = i0.ɵɵgetCurrentView();
|
|
15
|
+
i0.ɵɵelementStart(0, "div", 1);
|
|
16
|
+
i0.ɵɵlistener("click", function ImageViewerComponent_div_0_Template_div_click_0_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onBackdropClick($event)); });
|
|
17
|
+
i0.ɵɵelementStart(1, "div", 2)(2, "div", 3);
|
|
18
|
+
i0.ɵɵtemplate(3, ImageViewerComponent_div_0_span_3_Template, 2, 1, "span", 4);
|
|
19
|
+
i0.ɵɵelementEnd();
|
|
20
|
+
i0.ɵɵelementStart(4, "div", 5)(5, "button", 6);
|
|
21
|
+
i0.ɵɵlistener("click", function ImageViewerComponent_div_0_Template_button_click_5_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.zoomOut()); });
|
|
22
|
+
i0.ɵɵelement(6, "i", 7);
|
|
23
|
+
i0.ɵɵelementEnd();
|
|
24
|
+
i0.ɵɵelementStart(7, "span", 8);
|
|
25
|
+
i0.ɵɵtext(8);
|
|
26
|
+
i0.ɵɵelementEnd();
|
|
27
|
+
i0.ɵɵelementStart(9, "button", 9);
|
|
28
|
+
i0.ɵɵlistener("click", function ImageViewerComponent_div_0_Template_button_click_9_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.zoomIn()); });
|
|
29
|
+
i0.ɵɵelement(10, "i", 10);
|
|
30
|
+
i0.ɵɵelementEnd();
|
|
31
|
+
i0.ɵɵelement(11, "div", 11);
|
|
32
|
+
i0.ɵɵelementStart(12, "button", 12);
|
|
33
|
+
i0.ɵɵlistener("click", function ImageViewerComponent_div_0_Template_button_click_12_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.resetZoom()); });
|
|
34
|
+
i0.ɵɵelement(13, "i", 13);
|
|
35
|
+
i0.ɵɵelementEnd();
|
|
36
|
+
i0.ɵɵelementStart(14, "button", 14);
|
|
37
|
+
i0.ɵɵlistener("click", function ImageViewerComponent_div_0_Template_button_click_14_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.fitToScreen()); });
|
|
38
|
+
i0.ɵɵelement(15, "i", 15);
|
|
39
|
+
i0.ɵɵelementEnd()();
|
|
40
|
+
i0.ɵɵelementStart(16, "div", 16)(17, "button", 17);
|
|
41
|
+
i0.ɵɵlistener("click", function ImageViewerComponent_div_0_Template_button_click_17_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.downloadImage()); });
|
|
42
|
+
i0.ɵɵelement(18, "i", 18);
|
|
43
|
+
i0.ɵɵelementEnd();
|
|
44
|
+
i0.ɵɵelementStart(19, "button", 19);
|
|
45
|
+
i0.ɵɵlistener("click", function ImageViewerComponent_div_0_Template_button_click_19_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.close()); });
|
|
46
|
+
i0.ɵɵelement(20, "i", 20);
|
|
47
|
+
i0.ɵɵelementEnd()()();
|
|
48
|
+
i0.ɵɵelementStart(21, "div", 21);
|
|
49
|
+
i0.ɵɵlistener("mousedown", function ImageViewerComponent_div_0_Template_div_mousedown_21_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onMouseDown($event)); });
|
|
50
|
+
i0.ɵɵelement(22, "img", 22);
|
|
51
|
+
i0.ɵɵelementEnd();
|
|
52
|
+
i0.ɵɵelementStart(23, "div", 23)(24, "span");
|
|
53
|
+
i0.ɵɵtext(25, "Scroll to zoom");
|
|
54
|
+
i0.ɵɵelementEnd();
|
|
55
|
+
i0.ɵɵelementStart(26, "span", 24);
|
|
56
|
+
i0.ɵɵtext(27, "|");
|
|
57
|
+
i0.ɵɵelementEnd();
|
|
58
|
+
i0.ɵɵelementStart(28, "span");
|
|
59
|
+
i0.ɵɵtext(29, "Drag to pan when zoomed");
|
|
60
|
+
i0.ɵɵelementEnd();
|
|
61
|
+
i0.ɵɵelementStart(30, "span", 24);
|
|
62
|
+
i0.ɵɵtext(31, "|");
|
|
63
|
+
i0.ɵɵelementEnd();
|
|
64
|
+
i0.ɵɵelementStart(32, "span");
|
|
65
|
+
i0.ɵɵtext(33, "Esc to close");
|
|
66
|
+
i0.ɵɵelementEnd()()();
|
|
67
|
+
} if (rf & 2) {
|
|
68
|
+
const ctx_r1 = i0.ɵɵnextContext();
|
|
69
|
+
i0.ɵɵadvance(3);
|
|
70
|
+
i0.ɵɵproperty("ngIf", ctx_r1.fileName);
|
|
71
|
+
i0.ɵɵadvance(5);
|
|
72
|
+
i0.ɵɵtextInterpolate(ctx_r1.zoomPercentage);
|
|
73
|
+
i0.ɵɵadvance(13);
|
|
74
|
+
i0.ɵɵstyleProp("cursor", ctx_r1.zoomLevel > 1 ? ctx_r1.isDragging ? "grabbing" : "grab" : "default");
|
|
75
|
+
i0.ɵɵadvance();
|
|
76
|
+
i0.ɵɵstyleProp("transform", ctx_r1.imageTransform);
|
|
77
|
+
i0.ɵɵproperty("src", ctx_r1.imageUrl, i0.ɵɵsanitizeUrl)("alt", ctx_r1.alt);
|
|
78
|
+
} }
|
|
79
|
+
/**
|
|
80
|
+
* Full-screen image viewer modal with zoom and pan capabilities.
|
|
81
|
+
* Provides a lightbox-style experience for viewing attachment images.
|
|
82
|
+
*/
|
|
83
|
+
export class ImageViewerComponent {
|
|
84
|
+
/** Image source URL (can be data URL or regular URL) */
|
|
85
|
+
imageUrl = '';
|
|
86
|
+
/** Image alt text */
|
|
87
|
+
alt = 'Image';
|
|
88
|
+
/** Image filename for download */
|
|
89
|
+
fileName = 'image';
|
|
90
|
+
/** Whether the viewer is visible */
|
|
91
|
+
visible = false;
|
|
92
|
+
/** Emits when the viewer should be closed */
|
|
93
|
+
closed = new EventEmitter();
|
|
94
|
+
// Zoom and pan state
|
|
95
|
+
zoomLevel = 1;
|
|
96
|
+
minZoom = 0.1;
|
|
97
|
+
maxZoom = 5;
|
|
98
|
+
translateX = 0;
|
|
99
|
+
translateY = 0;
|
|
100
|
+
// Drag state
|
|
101
|
+
isDragging = false;
|
|
102
|
+
lastMouseX = 0;
|
|
103
|
+
lastMouseY = 0;
|
|
104
|
+
ngOnInit() {
|
|
105
|
+
// Lock body scroll when viewer is open
|
|
106
|
+
if (this.visible) {
|
|
107
|
+
document.body.style.overflow = 'hidden';
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
ngOnDestroy() {
|
|
111
|
+
// Restore body scroll
|
|
112
|
+
document.body.style.overflow = '';
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Handle escape key to close
|
|
116
|
+
*/
|
|
117
|
+
onEscapeKey() {
|
|
118
|
+
if (this.visible) {
|
|
119
|
+
this.close();
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* Handle mouse wheel for zoom
|
|
124
|
+
*/
|
|
125
|
+
onWheel(event) {
|
|
126
|
+
if (!this.visible)
|
|
127
|
+
return;
|
|
128
|
+
event.preventDefault();
|
|
129
|
+
const delta = event.deltaY > 0 ? -0.1 : 0.1;
|
|
130
|
+
this.adjustZoom(delta, event.clientX, event.clientY);
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Close the viewer
|
|
134
|
+
*/
|
|
135
|
+
close() {
|
|
136
|
+
this.resetView();
|
|
137
|
+
document.body.style.overflow = '';
|
|
138
|
+
this.closed.emit();
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Handle backdrop click
|
|
142
|
+
*/
|
|
143
|
+
onBackdropClick(event) {
|
|
144
|
+
// Only close if clicking directly on backdrop
|
|
145
|
+
const target = event.target;
|
|
146
|
+
if (target.classList.contains('image-viewer-backdrop')) {
|
|
147
|
+
this.close();
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Zoom in
|
|
152
|
+
*/
|
|
153
|
+
zoomIn() {
|
|
154
|
+
this.adjustZoom(0.25);
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Zoom out
|
|
158
|
+
*/
|
|
159
|
+
zoomOut() {
|
|
160
|
+
this.adjustZoom(-0.25);
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Reset to 100% zoom
|
|
164
|
+
*/
|
|
165
|
+
resetZoom() {
|
|
166
|
+
this.zoomLevel = 1;
|
|
167
|
+
this.translateX = 0;
|
|
168
|
+
this.translateY = 0;
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Fit image to screen
|
|
172
|
+
*/
|
|
173
|
+
fitToScreen() {
|
|
174
|
+
// Reset position and set zoom to 1 (CSS will handle fitting)
|
|
175
|
+
this.resetView();
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* Reset view to initial state
|
|
179
|
+
*/
|
|
180
|
+
resetView() {
|
|
181
|
+
this.zoomLevel = 1;
|
|
182
|
+
this.translateX = 0;
|
|
183
|
+
this.translateY = 0;
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Adjust zoom level
|
|
187
|
+
*/
|
|
188
|
+
adjustZoom(delta, centerX, centerY) {
|
|
189
|
+
const newZoom = Math.max(this.minZoom, Math.min(this.maxZoom, this.zoomLevel + delta));
|
|
190
|
+
if (centerX !== undefined && centerY !== undefined && newZoom !== this.zoomLevel) {
|
|
191
|
+
// Zoom towards mouse position
|
|
192
|
+
const factor = newZoom / this.zoomLevel;
|
|
193
|
+
const imageContainer = document.querySelector('.image-container');
|
|
194
|
+
if (imageContainer) {
|
|
195
|
+
const rect = imageContainer.getBoundingClientRect();
|
|
196
|
+
const offsetX = centerX - rect.left - rect.width / 2 - this.translateX;
|
|
197
|
+
const offsetY = centerY - rect.top - rect.height / 2 - this.translateY;
|
|
198
|
+
this.translateX = this.translateX - offsetX * (factor - 1);
|
|
199
|
+
this.translateY = this.translateY - offsetY * (factor - 1);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
this.zoomLevel = newZoom;
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Handle mouse down for dragging
|
|
206
|
+
*/
|
|
207
|
+
onMouseDown(event) {
|
|
208
|
+
if (event.button !== 0)
|
|
209
|
+
return; // Only left click
|
|
210
|
+
if (this.zoomLevel <= 1)
|
|
211
|
+
return; // Only allow pan when zoomed in
|
|
212
|
+
this.isDragging = true;
|
|
213
|
+
this.lastMouseX = event.clientX;
|
|
214
|
+
this.lastMouseY = event.clientY;
|
|
215
|
+
event.preventDefault();
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Handle mouse move for dragging
|
|
219
|
+
*/
|
|
220
|
+
onMouseMove(event) {
|
|
221
|
+
if (!this.isDragging)
|
|
222
|
+
return;
|
|
223
|
+
const deltaX = event.clientX - this.lastMouseX;
|
|
224
|
+
const deltaY = event.clientY - this.lastMouseY;
|
|
225
|
+
this.translateX += deltaX;
|
|
226
|
+
this.translateY += deltaY;
|
|
227
|
+
this.lastMouseX = event.clientX;
|
|
228
|
+
this.lastMouseY = event.clientY;
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Handle mouse up to stop dragging
|
|
232
|
+
*/
|
|
233
|
+
onMouseUp() {
|
|
234
|
+
this.isDragging = false;
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Download the image
|
|
238
|
+
*/
|
|
239
|
+
downloadImage() {
|
|
240
|
+
const link = document.createElement('a');
|
|
241
|
+
link.href = this.imageUrl;
|
|
242
|
+
link.download = this.fileName;
|
|
243
|
+
link.click();
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Get current zoom percentage for display
|
|
247
|
+
*/
|
|
248
|
+
get zoomPercentage() {
|
|
249
|
+
return Math.round(this.zoomLevel * 100) + '%';
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Get transform style for image
|
|
253
|
+
*/
|
|
254
|
+
get imageTransform() {
|
|
255
|
+
return `translate(${this.translateX}px, ${this.translateY}px) scale(${this.zoomLevel})`;
|
|
256
|
+
}
|
|
257
|
+
static ɵfac = function ImageViewerComponent_Factory(t) { return new (t || ImageViewerComponent)(); };
|
|
258
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ImageViewerComponent, selectors: [["mj-image-viewer"]], hostBindings: function ImageViewerComponent_HostBindings(rf, ctx) { if (rf & 1) {
|
|
259
|
+
i0.ɵɵlistener("keydown.escape", function ImageViewerComponent_keydown_escape_HostBindingHandler() { return ctx.onEscapeKey(); }, false, i0.ɵɵresolveDocument)("wheel", function ImageViewerComponent_wheel_HostBindingHandler($event) { return ctx.onWheel($event); })("mousemove", function ImageViewerComponent_mousemove_HostBindingHandler($event) { return ctx.onMouseMove($event); }, false, i0.ɵɵresolveDocument)("mouseup", function ImageViewerComponent_mouseup_HostBindingHandler() { return ctx.onMouseUp(); }, false, i0.ɵɵresolveDocument);
|
|
260
|
+
} }, inputs: { imageUrl: "imageUrl", alt: "alt", fileName: "fileName", visible: "visible" }, outputs: { closed: "closed" }, decls: 1, vars: 1, consts: [["class", "image-viewer-backdrop", 3, "click", 4, "ngIf"], [1, "image-viewer-backdrop", 3, "click"], [1, "viewer-toolbar"], [1, "toolbar-left"], ["class", "file-name", 4, "ngIf"], [1, "toolbar-center"], ["title", "Zoom Out", 1, "toolbar-btn", 3, "click"], [1, "fa-solid", "fa-minus"], [1, "zoom-display"], ["title", "Zoom In", 1, "toolbar-btn", 3, "click"], [1, "fa-solid", "fa-plus"], [1, "toolbar-separator"], ["title", "Reset Zoom (100%)", 1, "toolbar-btn", 3, "click"], [1, "fa-solid", "fa-expand"], ["title", "Fit to Screen", 1, "toolbar-btn", 3, "click"], [1, "fa-solid", "fa-compress"], [1, "toolbar-right"], ["title", "Download", 1, "toolbar-btn", 3, "click"], [1, "fa-solid", "fa-download"], ["title", "Close (Esc)", 1, "toolbar-btn", "close-btn", 3, "click"], [1, "fa-solid", "fa-times"], [1, "image-container", 3, "mousedown"], ["draggable", "false", 1, "viewer-image", 3, "src", "alt"], [1, "viewer-instructions"], [1, "separator"], [1, "file-name"]], template: function ImageViewerComponent_Template(rf, ctx) { if (rf & 1) {
|
|
261
|
+
i0.ɵɵtemplate(0, ImageViewerComponent_div_0_Template, 34, 8, "div", 0);
|
|
262
|
+
} if (rf & 2) {
|
|
263
|
+
i0.ɵɵproperty("ngIf", ctx.visible);
|
|
264
|
+
} }, dependencies: [i1.NgIf], styles: [".image-viewer-backdrop[_ngcontent-%COMP%] {\n position: fixed;\n inset: 0;\n z-index: 10000;\n background: rgba(0, 0, 0, 0.92);\n display: flex;\n flex-direction: column;\n animation: _ngcontent-%COMP%_fadeIn 0.2s ease-out;\n}\n\n@keyframes _ngcontent-%COMP%_fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n\n\n.viewer-toolbar[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n background: rgba(0, 0, 0, 0.5);\n backdrop-filter: blur(10px);\n border-bottom: 1px solid rgba(255, 255, 255, 0.1);\n}\n\n.toolbar-left[_ngcontent-%COMP%], \n.toolbar-center[_ngcontent-%COMP%], \n.toolbar-right[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.toolbar-left[_ngcontent-%COMP%] {\n flex: 1;\n min-width: 0;\n}\n\n.toolbar-right[_ngcontent-%COMP%] {\n flex: 1;\n justify-content: flex-end;\n}\n\n.file-name[_ngcontent-%COMP%] {\n color: rgba(255, 255, 255, 0.9);\n font-size: 14px;\n font-weight: 500;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 300px;\n}\n\n.toolbar-btn[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n border: none;\n border-radius: 8px;\n background: rgba(255, 255, 255, 0.1);\n color: rgba(255, 255, 255, 0.9);\n cursor: pointer;\n transition: background 0.2s, transform 0.15s;\n}\n\n.toolbar-btn[_ngcontent-%COMP%]:hover {\n background: rgba(255, 255, 255, 0.2);\n transform: scale(1.05);\n}\n\n.toolbar-btn[_ngcontent-%COMP%]:active {\n transform: scale(0.95);\n}\n\n.toolbar-btn.close-btn[_ngcontent-%COMP%] {\n background: rgba(255, 59, 48, 0.2);\n}\n\n.toolbar-btn.close-btn[_ngcontent-%COMP%]:hover {\n background: rgba(255, 59, 48, 0.4);\n}\n\n.toolbar-btn[_ngcontent-%COMP%] i[_ngcontent-%COMP%] {\n font-size: 14px;\n}\n\n.zoom-display[_ngcontent-%COMP%] {\n color: rgba(255, 255, 255, 0.9);\n font-size: 13px;\n font-weight: 500;\n min-width: 50px;\n text-align: center;\n font-family: 'SF Mono', 'Monaco', 'Inconsolata', 'Roboto Mono', monospace;\n}\n\n.toolbar-separator[_ngcontent-%COMP%] {\n width: 1px;\n height: 20px;\n background: rgba(255, 255, 255, 0.2);\n margin: 0 4px;\n}\n\n\n\n.image-container[_ngcontent-%COMP%] {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n overflow: hidden;\n padding: 20px;\n}\n\n.viewer-image[_ngcontent-%COMP%] {\n max-width: 100%;\n max-height: 100%;\n object-fit: contain;\n transition: transform 0.1s ease-out;\n user-select: none;\n pointer-events: none;\n border-radius: 4px;\n box-shadow: 0 8px 32px rgba(0, 0, 0, 0.5);\n}\n\n\n\n.viewer-instructions[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 10px;\n color: rgba(255, 255, 255, 0.5);\n font-size: 12px;\n}\n\n.viewer-instructions[_ngcontent-%COMP%] .separator[_ngcontent-%COMP%] {\n opacity: 0.3;\n}\n\n\n\n@media (max-width: 768px) {\n .viewer-toolbar[_ngcontent-%COMP%] {\n padding: 8px 12px;\n }\n\n .toolbar-btn[_ngcontent-%COMP%] {\n width: 32px;\n height: 32px;\n }\n\n .file-name[_ngcontent-%COMP%] {\n max-width: 150px;\n font-size: 12px;\n }\n\n .zoom-display[_ngcontent-%COMP%] {\n min-width: 40px;\n font-size: 11px;\n }\n\n .viewer-instructions[_ngcontent-%COMP%] {\n font-size: 10px;\n padding: 8px;\n }\n\n .image-container[_ngcontent-%COMP%] {\n padding: 10px;\n }\n}\n\n\n\n@media (hover: none) {\n .toolbar-btn[_ngcontent-%COMP%]:hover {\n background: rgba(255, 255, 255, 0.1);\n transform: none;\n }\n\n .toolbar-btn.close-btn[_ngcontent-%COMP%]:hover {\n background: rgba(255, 59, 48, 0.2);\n }\n\n .viewer-instructions[_ngcontent-%COMP%] {\n display: none;\n }\n}"] });
|
|
265
|
+
}
|
|
266
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ImageViewerComponent, [{
|
|
267
|
+
type: Component,
|
|
268
|
+
args: [{ selector: 'mj-image-viewer', template: "<div class=\"image-viewer-backdrop\"\n *ngIf=\"visible\"\n (click)=\"onBackdropClick($event)\">\n\n <!-- Toolbar -->\n <div class=\"viewer-toolbar\">\n <div class=\"toolbar-left\">\n <span class=\"file-name\" *ngIf=\"fileName\">{{ fileName }}</span>\n </div>\n\n <div class=\"toolbar-center\">\n <button class=\"toolbar-btn\" (click)=\"zoomOut()\" title=\"Zoom Out\">\n <i class=\"fa-solid fa-minus\"></i>\n </button>\n\n <span class=\"zoom-display\">{{ zoomPercentage }}</span>\n\n <button class=\"toolbar-btn\" (click)=\"zoomIn()\" title=\"Zoom In\">\n <i class=\"fa-solid fa-plus\"></i>\n </button>\n\n <div class=\"toolbar-separator\"></div>\n\n <button class=\"toolbar-btn\" (click)=\"resetZoom()\" title=\"Reset Zoom (100%)\">\n <i class=\"fa-solid fa-expand\"></i>\n </button>\n\n <button class=\"toolbar-btn\" (click)=\"fitToScreen()\" title=\"Fit to Screen\">\n <i class=\"fa-solid fa-compress\"></i>\n </button>\n </div>\n\n <div class=\"toolbar-right\">\n <button class=\"toolbar-btn\" (click)=\"downloadImage()\" title=\"Download\">\n <i class=\"fa-solid fa-download\"></i>\n </button>\n\n <button class=\"toolbar-btn close-btn\" (click)=\"close()\" title=\"Close (Esc)\">\n <i class=\"fa-solid fa-times\"></i>\n </button>\n </div>\n </div>\n\n <!-- Image Container -->\n <div class=\"image-container\"\n (mousedown)=\"onMouseDown($event)\"\n [style.cursor]=\"zoomLevel > 1 ? (isDragging ? 'grabbing' : 'grab') : 'default'\">\n <img [src]=\"imageUrl\"\n [alt]=\"alt\"\n class=\"viewer-image\"\n [style.transform]=\"imageTransform\"\n draggable=\"false\">\n </div>\n\n <!-- Instructions -->\n <div class=\"viewer-instructions\">\n <span>Scroll to zoom</span>\n <span class=\"separator\">|</span>\n <span>Drag to pan when zoomed</span>\n <span class=\"separator\">|</span>\n <span>Esc to close</span>\n </div>\n</div>\n", styles: [".image-viewer-backdrop {\n position: fixed;\n inset: 0;\n z-index: 10000;\n background: rgba(0, 0, 0, 0.92);\n display: flex;\n flex-direction: column;\n animation: fadeIn 0.2s ease-out;\n}\n\n@keyframes fadeIn {\n from {\n opacity: 0;\n }\n to {\n opacity: 1;\n }\n}\n\n/* Toolbar */\n.viewer-toolbar {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 12px 16px;\n background: rgba(0, 0, 0, 0.5);\n backdrop-filter: blur(10px);\n border-bottom: 1px solid rgba(255, 255, 255, 0.1);\n}\n\n.toolbar-left,\n.toolbar-center,\n.toolbar-right {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.toolbar-left {\n flex: 1;\n min-width: 0;\n}\n\n.toolbar-right {\n flex: 1;\n justify-content: flex-end;\n}\n\n.file-name {\n color: rgba(255, 255, 255, 0.9);\n font-size: 14px;\n font-weight: 500;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n max-width: 300px;\n}\n\n.toolbar-btn {\n display: flex;\n align-items: center;\n justify-content: center;\n width: 36px;\n height: 36px;\n border: none;\n border-radius: 8px;\n background: rgba(255, 255, 255, 0.1);\n color: rgba(255, 255, 255, 0.9);\n cursor: pointer;\n transition: background 0.2s, transform 0.15s;\n}\n\n.toolbar-btn:hover {\n background: rgba(255, 255, 255, 0.2);\n transform: scale(1.05);\n}\n\n.toolbar-btn:active {\n transform: scale(0.95);\n}\n\n.toolbar-btn.close-btn {\n background: rgba(255, 59, 48, 0.2);\n}\n\n.toolbar-btn.close-btn:hover {\n background: rgba(255, 59, 48, 0.4);\n}\n\n.toolbar-btn i {\n font-size: 14px;\n}\n\n.zoom-display {\n color: rgba(255, 255, 255, 0.9);\n font-size: 13px;\n font-weight: 500;\n min-width: 50px;\n text-align: center;\n font-family: 'SF Mono', 'Monaco', 'Inconsolata', 'Roboto Mono', monospace;\n}\n\n.toolbar-separator {\n width: 1px;\n height: 20px;\n background: rgba(255, 255, 255, 0.2);\n margin: 0 4px;\n}\n\n/* Image Container */\n.image-container {\n flex: 1;\n display: flex;\n align-items: center;\n justify-content: center;\n overflow: hidden;\n padding: 20px;\n}\n\n.viewer-image {\n max-width: 100%;\n max-height: 100%;\n object-fit: contain;\n transition: transform 0.1s ease-out;\n user-select: none;\n pointer-events: none;\n border-radius: 4px;\n box-shadow: 0 8px 32px rgba(0, 0, 0, 0.5);\n}\n\n/* Instructions */\n.viewer-instructions {\n display: flex;\n align-items: center;\n justify-content: center;\n gap: 8px;\n padding: 10px;\n color: rgba(255, 255, 255, 0.5);\n font-size: 12px;\n}\n\n.viewer-instructions .separator {\n opacity: 0.3;\n}\n\n/* Responsive */\n@media (max-width: 768px) {\n .viewer-toolbar {\n padding: 8px 12px;\n }\n\n .toolbar-btn {\n width: 32px;\n height: 32px;\n }\n\n .file-name {\n max-width: 150px;\n font-size: 12px;\n }\n\n .zoom-display {\n min-width: 40px;\n font-size: 11px;\n }\n\n .viewer-instructions {\n font-size: 10px;\n padding: 8px;\n }\n\n .image-container {\n padding: 10px;\n }\n}\n\n/* Touch support */\n@media (hover: none) {\n .toolbar-btn:hover {\n background: rgba(255, 255, 255, 0.1);\n transform: none;\n }\n\n .toolbar-btn.close-btn:hover {\n background: rgba(255, 59, 48, 0.2);\n }\n\n .viewer-instructions {\n display: none;\n }\n}\n"] }]
|
|
269
|
+
}], null, { imageUrl: [{
|
|
270
|
+
type: Input
|
|
271
|
+
}], alt: [{
|
|
272
|
+
type: Input
|
|
273
|
+
}], fileName: [{
|
|
274
|
+
type: Input
|
|
275
|
+
}], visible: [{
|
|
276
|
+
type: Input
|
|
277
|
+
}], closed: [{
|
|
278
|
+
type: Output
|
|
279
|
+
}], onEscapeKey: [{
|
|
280
|
+
type: HostListener,
|
|
281
|
+
args: ['document:keydown.escape']
|
|
282
|
+
}], onWheel: [{
|
|
283
|
+
type: HostListener,
|
|
284
|
+
args: ['wheel', ['$event']]
|
|
285
|
+
}], onMouseMove: [{
|
|
286
|
+
type: HostListener,
|
|
287
|
+
args: ['document:mousemove', ['$event']]
|
|
288
|
+
}], onMouseUp: [{
|
|
289
|
+
type: HostListener,
|
|
290
|
+
args: ['document:mouseup']
|
|
291
|
+
}] }); })();
|
|
292
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ImageViewerComponent, { className: "ImageViewerComponent", filePath: "src/lib/components/attachment/image-viewer.component.ts", lineNumber: 20 }); })();
|
|
293
|
+
//# sourceMappingURL=image-viewer.component.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"image-viewer.component.js","sourceRoot":"","sources":["../../../../src/lib/components/attachment/image-viewer.component.ts","../../../../src/lib/components/attachment/image-viewer.component.html"],"names":[],"mappings":"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"}
|
|
@@ -8,8 +8,11 @@ import { ConversationAgentService } from '../../services/conversation-agent.serv
|
|
|
8
8
|
import { ActiveTasksService } from '../../services/active-tasks.service';
|
|
9
9
|
import { MentionAutocompleteService } from '../../services/mention-autocomplete.service';
|
|
10
10
|
import { ArtifactPermissionService } from '../../services/artifact-permission.service';
|
|
11
|
+
import { ConversationAttachmentService } from '../../services/conversation-attachment.service';
|
|
12
|
+
import { MessageAttachment } from '../message/message-item.component';
|
|
11
13
|
import { LazyArtifactInfo } from '../../models/lazy-artifact-info';
|
|
12
14
|
import { RatingJSON } from '../../models/conversation-complete-query.model';
|
|
15
|
+
import { PendingAttachment } from '../mention/mention-editor.component';
|
|
13
16
|
import { DialogService } from '@progress/kendo-angular-dialog';
|
|
14
17
|
import { Subject } from 'rxjs';
|
|
15
18
|
import * as i0 from "@angular/core";
|
|
@@ -22,6 +25,7 @@ export declare class ConversationChatAreaComponent implements OnInit, OnDestroy,
|
|
|
22
25
|
private mentionAutocompleteService;
|
|
23
26
|
private artifactPermissionService;
|
|
24
27
|
private dialogService;
|
|
28
|
+
private attachmentService;
|
|
25
29
|
environmentId: string;
|
|
26
30
|
currentUser: UserInfo;
|
|
27
31
|
private _conversationId;
|
|
@@ -30,9 +34,15 @@ export declare class ConversationChatAreaComponent implements OnInit, OnDestroy,
|
|
|
30
34
|
conversation: ConversationEntity | null;
|
|
31
35
|
threadId: string | null;
|
|
32
36
|
isNewConversation: boolean;
|
|
33
|
-
|
|
37
|
+
private _pendingMessage;
|
|
38
|
+
set pendingMessage(value: string | null);
|
|
39
|
+
get pendingMessage(): string | null;
|
|
40
|
+
private _pendingAttachments;
|
|
41
|
+
set pendingAttachments(value: PendingAttachment[] | null);
|
|
42
|
+
get pendingAttachments(): PendingAttachment[] | null;
|
|
34
43
|
pendingArtifactId: string | null;
|
|
35
44
|
pendingArtifactVersionNumber: number | null;
|
|
45
|
+
showSidebarToggle: boolean;
|
|
36
46
|
conversationRenamed: EventEmitter<{
|
|
37
47
|
conversationId: string;
|
|
38
48
|
name: string;
|
|
@@ -47,12 +57,20 @@ export declare class ConversationChatAreaComponent implements OnInit, OnDestroy,
|
|
|
47
57
|
type: 'conversation' | 'collection';
|
|
48
58
|
id: string;
|
|
49
59
|
}>;
|
|
50
|
-
|
|
60
|
+
sidebarToggleClicked: EventEmitter<void>;
|
|
61
|
+
conversationCreated: EventEmitter<{
|
|
62
|
+
conversation: ConversationEntity;
|
|
63
|
+
pendingMessage?: string | undefined;
|
|
64
|
+
pendingAttachments?: PendingAttachment[] | undefined;
|
|
65
|
+
}>;
|
|
51
66
|
threadOpened: EventEmitter<string>;
|
|
52
67
|
threadClosed: EventEmitter<void>;
|
|
53
68
|
pendingArtifactConsumed: EventEmitter<void>;
|
|
54
69
|
pendingMessageConsumed: EventEmitter<void>;
|
|
55
|
-
pendingMessageRequested: EventEmitter<
|
|
70
|
+
pendingMessageRequested: EventEmitter<{
|
|
71
|
+
text: string;
|
|
72
|
+
attachments: PendingAttachment[];
|
|
73
|
+
}>;
|
|
56
74
|
private scrollContainer;
|
|
57
75
|
private messageInputComponents;
|
|
58
76
|
private artifactViewerComponent?;
|
|
@@ -101,6 +119,10 @@ export declare class ConversationChatAreaComponent implements OnInit, OnDestroy,
|
|
|
101
119
|
* Ratings by conversation detail ID (parsed from RatingsJSON)
|
|
102
120
|
*/
|
|
103
121
|
ratingsByDetailId: Map<string, RatingJSON[]>;
|
|
122
|
+
/**
|
|
123
|
+
* Attachments by conversation detail ID (loaded from ConversationDetailAttachments)
|
|
124
|
+
*/
|
|
125
|
+
attachmentsByDetailId: Map<string, MessageAttachment[]>;
|
|
104
126
|
/**
|
|
105
127
|
* In-progress message IDs for streaming reconnection
|
|
106
128
|
* Passed to message-input component to reconnect PubSub updates
|
|
@@ -122,8 +144,29 @@ export declare class ConversationChatAreaComponent implements OnInit, OnDestroy,
|
|
|
122
144
|
private startX;
|
|
123
145
|
private startWidth;
|
|
124
146
|
private readonly ARTIFACT_PANE_WIDTH_KEY;
|
|
125
|
-
|
|
147
|
+
showImageViewer: boolean;
|
|
148
|
+
selectedImageUrl: string;
|
|
149
|
+
selectedImageAlt: string;
|
|
150
|
+
selectedImageFileName: string;
|
|
151
|
+
isUploadingAttachments: boolean;
|
|
152
|
+
uploadingMessage: string;
|
|
153
|
+
enableAttachments: boolean;
|
|
154
|
+
maxAttachments: number;
|
|
155
|
+
maxAttachmentSizeBytes: number;
|
|
156
|
+
acceptedFileTypes: string;
|
|
157
|
+
private conversationManagerAgent;
|
|
158
|
+
constructor(conversationData: ConversationDataService, agentStateService: AgentStateService, conversationAgentService: ConversationAgentService, activeTasks: ActiveTasksService, cdr: ChangeDetectorRef, mentionAutocompleteService: MentionAutocompleteService, artifactPermissionService: ArtifactPermissionService, dialogService: DialogService, attachmentService: ConversationAttachmentService);
|
|
126
159
|
ngOnInit(): Promise<void>;
|
|
160
|
+
/**
|
|
161
|
+
* Initializes attachment support by checking if the conversation manager agent (Sage)
|
|
162
|
+
* or any recent agent in the conversation supports non-text input modalities.
|
|
163
|
+
*/
|
|
164
|
+
private initializeAttachmentSupport;
|
|
165
|
+
/**
|
|
166
|
+
* Updates attachment support based on the current conversation context.
|
|
167
|
+
* Called when conversation changes to check if any agent in the conversation supports attachments.
|
|
168
|
+
*/
|
|
169
|
+
private updateAttachmentSupport;
|
|
127
170
|
ngAfterViewChecked(): void;
|
|
128
171
|
ngOnDestroy(): void;
|
|
129
172
|
private onConversationChanged;
|
|
@@ -169,7 +212,12 @@ export declare class ConversationChatAreaComponent implements OnInit, OnDestroy,
|
|
|
169
212
|
* Restoring them here causes duplicate "Agent Processing..." entries.
|
|
170
213
|
*/
|
|
171
214
|
private restoreActiveTasks;
|
|
172
|
-
onMessageSent(message: ConversationDetailEntity): void
|
|
215
|
+
onMessageSent(message: ConversationDetailEntity): Promise<void>;
|
|
216
|
+
/**
|
|
217
|
+
* Loads attachments for a single message and adds them to the attachmentsByDetailId map.
|
|
218
|
+
* Called after a new message is sent to ensure attachments are displayed immediately.
|
|
219
|
+
*/
|
|
220
|
+
private loadAttachmentsForMessage;
|
|
173
221
|
/**
|
|
174
222
|
* Ensures the current user is in the avatar map
|
|
175
223
|
* Called when new messages are created to ensure avatar data is available
|
|
@@ -205,6 +253,9 @@ export declare class ConversationChatAreaComponent implements OnInit, OnDestroy,
|
|
|
205
253
|
* Start 1-second timer for smooth agent run UI updates
|
|
206
254
|
* Updates the message list every second to keep elapsed times current
|
|
207
255
|
* Also detects when messages complete and reloads agent runs
|
|
256
|
+
*
|
|
257
|
+
* NOTE: This polling approach causes excessive RunView calls (24+ queries per entity).
|
|
258
|
+
* TODO: Replace with PubSub completion events - see plans/repair-conversations-ui-performance.md
|
|
208
259
|
*/
|
|
209
260
|
private startAgentRunUpdateTimer;
|
|
210
261
|
/**
|
|
@@ -312,6 +363,21 @@ export declare class ConversationChatAreaComponent implements OnInit, OnDestroy,
|
|
|
312
363
|
customInput?: string;
|
|
313
364
|
}): Promise<void>;
|
|
314
365
|
onRetryMessage(message: ConversationDetailEntity): void;
|
|
366
|
+
/**
|
|
367
|
+
* Handle attachment click - opens the image viewer for images
|
|
368
|
+
*/
|
|
369
|
+
onAttachmentClicked(attachment: MessageAttachment): void;
|
|
370
|
+
/**
|
|
371
|
+
* Handle image viewer close
|
|
372
|
+
*/
|
|
373
|
+
onImageViewerClosed(): void;
|
|
374
|
+
/**
|
|
375
|
+
* Handle upload state changes from message input component
|
|
376
|
+
*/
|
|
377
|
+
onUploadStateChanged(event: {
|
|
378
|
+
isUploading: boolean;
|
|
379
|
+
message: string;
|
|
380
|
+
}): void;
|
|
315
381
|
onArtifactClicked(data: {
|
|
316
382
|
artifactId: string;
|
|
317
383
|
versionId?: string;
|
|
@@ -374,7 +440,10 @@ export declare class ConversationChatAreaComponent implements OnInit, OnDestroy,
|
|
|
374
440
|
* Handle message sent from empty state component
|
|
375
441
|
* Creates a new conversation and emits to parent to update selection
|
|
376
442
|
*/
|
|
377
|
-
onEmptyStateMessageSent(
|
|
443
|
+
onEmptyStateMessageSent(event: {
|
|
444
|
+
text: string;
|
|
445
|
+
attachments: PendingAttachment[];
|
|
446
|
+
}): Promise<void>;
|
|
378
447
|
onOpenEntityRecord(event: {
|
|
379
448
|
entityName: string;
|
|
380
449
|
compositeKey: CompositeKey;
|
|
@@ -436,6 +505,6 @@ export declare class ConversationChatAreaComponent implements OnInit, OnDestroy,
|
|
|
436
505
|
*/
|
|
437
506
|
onIntentCheckCompleted(): void;
|
|
438
507
|
static ɵfac: i0.ɵɵFactoryDeclaration<ConversationChatAreaComponent, never>;
|
|
439
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<ConversationChatAreaComponent, "mj-conversation-chat-area", never, { "environmentId": { "alias": "environmentId"; "required": false; }; "currentUser": { "alias": "currentUser"; "required": false; }; "conversationId": { "alias": "conversationId"; "required": false; }; "conversation": { "alias": "conversation"; "required": false; }; "threadId": { "alias": "threadId"; "required": false; }; "isNewConversation": { "alias": "isNewConversation"; "required": false; }; "pendingMessage": { "alias": "pendingMessage"; "required": false; }; "pendingArtifactId": { "alias": "pendingArtifactId"; "required": false; }; "pendingArtifactVersionNumber": { "alias": "pendingArtifactVersionNumber"; "required": false; }; }, { "conversationRenamed": "conversationRenamed"; "openEntityRecord": "openEntityRecord"; "taskClicked": "taskClicked"; "artifactLinkClicked": "artifactLinkClicked"; "conversationCreated": "conversationCreated"; "threadOpened": "threadOpened"; "threadClosed": "threadClosed"; "pendingArtifactConsumed": "pendingArtifactConsumed"; "pendingMessageConsumed": "pendingMessageConsumed"; "pendingMessageRequested": "pendingMessageRequested"; }, never, never, false, never>;
|
|
508
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<ConversationChatAreaComponent, "mj-conversation-chat-area", never, { "environmentId": { "alias": "environmentId"; "required": false; }; "currentUser": { "alias": "currentUser"; "required": false; }; "conversationId": { "alias": "conversationId"; "required": false; }; "conversation": { "alias": "conversation"; "required": false; }; "threadId": { "alias": "threadId"; "required": false; }; "isNewConversation": { "alias": "isNewConversation"; "required": false; }; "pendingMessage": { "alias": "pendingMessage"; "required": false; }; "pendingAttachments": { "alias": "pendingAttachments"; "required": false; }; "pendingArtifactId": { "alias": "pendingArtifactId"; "required": false; }; "pendingArtifactVersionNumber": { "alias": "pendingArtifactVersionNumber"; "required": false; }; "showSidebarToggle": { "alias": "showSidebarToggle"; "required": false; }; }, { "conversationRenamed": "conversationRenamed"; "openEntityRecord": "openEntityRecord"; "taskClicked": "taskClicked"; "artifactLinkClicked": "artifactLinkClicked"; "sidebarToggleClicked": "sidebarToggleClicked"; "conversationCreated": "conversationCreated"; "threadOpened": "threadOpened"; "threadClosed": "threadClosed"; "pendingArtifactConsumed": "pendingArtifactConsumed"; "pendingMessageConsumed": "pendingMessageConsumed"; "pendingMessageRequested": "pendingMessageRequested"; }, never, never, false, never>;
|
|
440
509
|
}
|
|
441
510
|
//# sourceMappingURL=conversation-chat-area.component.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation-chat-area.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/conversation/conversation-chat-area.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,iBAAiB,EAAkD,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAC/K,OAAO,EAAE,QAAQ,EAA+B,YAAY,EAAe,MAAM,sBAAsB,CAAC;AACxG,OAAO,EAAE,kBAAkB,EAAE,wBAAwB,EAAE,gBAAgB,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;AAC3I,OAAO,
|
|
1
|
+
{"version":3,"file":"conversation-chat-area.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/conversation/conversation-chat-area.component.ts"],"names":[],"mappings":"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"}
|