@memberjunction/ng-conversations 5.51.2 → 5.51.4
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/task/tasks-full-view.component.d.ts +6 -1
- package/dist/lib/components/task/tasks-full-view.component.d.ts.map +1 -1
- package/dist/lib/components/task/tasks-full-view.component.js +15 -6
- package/dist/lib/components/task/tasks-full-view.component.js.map +1 -1
- package/dist/lib/components/workspace/conversation-workspace.component.d.ts +11 -1
- package/dist/lib/components/workspace/conversation-workspace.component.d.ts.map +1 -1
- package/dist/lib/components/workspace/conversation-workspace.component.js +21 -26
- package/dist/lib/components/workspace/conversation-workspace.component.js.map +1 -1
- package/dist/lib/services/conversation-tasks-filter.d.ts +15 -0
- package/dist/lib/services/conversation-tasks-filter.d.ts.map +1 -0
- package/dist/lib/services/conversation-tasks-filter.js +69 -0
- package/dist/lib/services/conversation-tasks-filter.js.map +1 -0
- package/dist/lib/services/realtime-audio-recorder.d.ts +21 -4
- package/dist/lib/services/realtime-audio-recorder.d.ts.map +1 -1
- package/dist/lib/services/realtime-audio-recorder.js +42 -8
- package/dist/lib/services/realtime-audio-recorder.js.map +1 -1
- package/dist/lib/services/search.service.d.ts.map +1 -1
- package/dist/lib/services/search.service.js +3 -16
- package/dist/lib/services/search.service.js.map +1 -1
- package/package.json +29 -29
|
@@ -12,6 +12,11 @@ export declare class TasksFullViewComponent extends BaseAngularComponent impleme
|
|
|
12
12
|
environmentId: string;
|
|
13
13
|
currentUser: UserInfo;
|
|
14
14
|
baseFilter: string;
|
|
15
|
+
/**
|
|
16
|
+
* Builds the task filter each time the view loads or refreshes, so the list includes tasks
|
|
17
|
+
* created since the last load. Replaces {@link baseFilter} when set.
|
|
18
|
+
*/
|
|
19
|
+
BaseFilterResolver: (() => Promise<string>) | null;
|
|
15
20
|
activeTaskId?: string;
|
|
16
21
|
openEntityRecord: EventEmitter<{
|
|
17
22
|
entityName: string;
|
|
@@ -44,6 +49,6 @@ export declare class TasksFullViewComponent extends BaseAngularComponent impleme
|
|
|
44
49
|
getDescription(): string;
|
|
45
50
|
getTaskDetailDescription(): string;
|
|
46
51
|
static ɵfac: i0.ɵɵFactoryDeclaration<TasksFullViewComponent, never>;
|
|
47
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<TasksFullViewComponent, "mj-tasks-full-view", never, { "environmentId": { "alias": "environmentId"; "required": false; }; "currentUser": { "alias": "currentUser"; "required": false; }; "baseFilter": { "alias": "baseFilter"; "required": false; }; "activeTaskId": { "alias": "activeTaskId"; "required": false; }; }, { "openEntityRecord": "openEntityRecord"; "taskSelected": "taskSelected"; }, never, never, true, never>;
|
|
52
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<TasksFullViewComponent, "mj-tasks-full-view", never, { "environmentId": { "alias": "environmentId"; "required": false; }; "currentUser": { "alias": "currentUser"; "required": false; }; "baseFilter": { "alias": "baseFilter"; "required": false; }; "BaseFilterResolver": { "alias": "BaseFilterResolver"; "required": false; }; "activeTaskId": { "alias": "activeTaskId"; "required": false; }; }, { "openEntityRecord": "openEntityRecord"; "taskSelected": "taskSelected"; }, never, never, true, never>;
|
|
48
53
|
}
|
|
49
54
|
//# sourceMappingURL=tasks-full-view.component.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tasks-full-view.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/task/tasks-full-view.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACzG,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAErE,OAAO,EAAE,QAAQ,EAAW,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAAsB,MAAM,+BAA+B,CAAC;;AAKzG;;;;GAIG;AACH,qBA2Ha,sBAAuB,SAAQ,oBAAqB,YAAW,MAAM,EAAE,SAAS;IAClF,aAAa,EAAG,MAAM,CAAC;IACvB,WAAW,EAAG,QAAQ,CAAC;IACvB,UAAU,EAAE,MAAM,CAAS;
|
|
1
|
+
{"version":3,"file":"tasks-full-view.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/task/tasks-full-view.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,MAAM,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AACzG,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAErE,OAAO,EAAE,QAAQ,EAAW,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAAsB,MAAM,+BAA+B,CAAC;;AAKzG;;;;GAIG;AACH,qBA2Ha,sBAAuB,SAAQ,oBAAqB,YAAW,MAAM,EAAE,SAAS;IAClF,aAAa,EAAG,MAAM,CAAC;IACvB,WAAW,EAAG,QAAQ,CAAC;IACvB,UAAU,EAAE,MAAM,CAAS;IAEpC;;;OAGG;IACM,kBAAkB,EAAE,CAAC,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAQ;IAC1D,YAAY,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB;oBAAkC,MAAM;kBAAY,MAAM;OAAM;IAChF,YAAY,8BAAqC;IAEpD,QAAQ,EAAE,YAAY,EAAE,CAAM;IAC9B,aAAa,EAAE,YAAY,EAAE,CAAM;IACnC,QAAQ,EAAE,YAAY,EAAE,CAAM;IAC9B,kBAAkB,EAAE,YAAY,EAAE,CAAM;IACxC,gBAAgB,EAAE,sBAAsB,EAAE,CAAM;IAChD,WAAW,sBAA6B;IACxC,YAAY,EAAE,YAAY,GAAG,IAAI,CAAQ;IACzC,mBAAmB,EAAE,OAAO,CAAS;IACrC,SAAS,EAAE,OAAO,CAAS;IAClC,OAAO,CAAC,kBAAkB,CAAkB;IAE5C,QAAQ;IAIR,WAAW,CAAC,OAAO,EAAE,aAAa;IAgBrB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IA6D1B,WAAW,CAAC,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;YAY7C,iBAAiB;YAgDjB,oBAAoB;YAkCpB,aAAa;IA0EpB,cAAc,IAAI,IAAI;IAYtB,cAAc,CAAC,OAAO,EAAE,YAAY,GAAG,IAAI;IAK3C,kBAAkB,CAAC,KAAK,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;IAKzE,cAAc,IAAI,MAAM;IAMxB,wBAAwB,IAAI,MAAM;yCA9S9B,sBAAsB;2CAAtB,sBAAsB;CAsTlC"}
|
|
@@ -48,6 +48,11 @@ export class TasksFullViewComponent extends BaseAngularComponent {
|
|
|
48
48
|
environmentId;
|
|
49
49
|
currentUser;
|
|
50
50
|
baseFilter = '1=1'; // SQL filter for tasks (default: show all)
|
|
51
|
+
/**
|
|
52
|
+
* Builds the task filter each time the view loads or refreshes, so the list includes tasks
|
|
53
|
+
* created since the last load. Replaces {@link baseFilter} when set.
|
|
54
|
+
*/
|
|
55
|
+
BaseFilterResolver = null;
|
|
51
56
|
activeTaskId; // Task ID to auto-select and drill into
|
|
52
57
|
openEntityRecord = new EventEmitter();
|
|
53
58
|
taskSelected = new EventEmitter(); // Emits task ID when drill-down occurs, null when returning to list
|
|
@@ -65,8 +70,9 @@ export class TasksFullViewComponent extends BaseAngularComponent {
|
|
|
65
70
|
this.loadTasks();
|
|
66
71
|
}
|
|
67
72
|
ngOnChanges(changes) {
|
|
68
|
-
// Reload tasks if
|
|
69
|
-
|
|
73
|
+
// Reload tasks if the filter or the filter builder changes
|
|
74
|
+
const filterChanged = (key) => !!changes[key] && !changes[key].firstChange;
|
|
75
|
+
if (filterChanged('baseFilter') || filterChanged('BaseFilterResolver')) {
|
|
70
76
|
this.loadTasks();
|
|
71
77
|
}
|
|
72
78
|
// Auto-drill into task if activeTaskId changes
|
|
@@ -86,11 +92,12 @@ export class TasksFullViewComponent extends BaseAngularComponent {
|
|
|
86
92
|
this.aiEngineConfigured = true;
|
|
87
93
|
}
|
|
88
94
|
const rv = RunView.FromMetadataProvider(this.ProviderToUse);
|
|
89
|
-
|
|
90
|
-
|
|
95
|
+
const filter = this.BaseFilterResolver ? await this.BaseFilterResolver() : this.baseFilter;
|
|
96
|
+
console.log('📝 Tasks filter SQL:', filter);
|
|
97
|
+
// Load all tasks with the filter
|
|
91
98
|
const tasksResult = await rv.RunView({
|
|
92
99
|
EntityName: 'MJ: Tasks',
|
|
93
|
-
ExtraFilter:
|
|
100
|
+
ExtraFilter: filter,
|
|
94
101
|
OrderBy: '__mj_CreatedAt DESC',
|
|
95
102
|
MaxRows: 1000,
|
|
96
103
|
ResultType: 'entity_object'
|
|
@@ -304,7 +311,7 @@ export class TasksFullViewComponent extends BaseAngularComponent {
|
|
|
304
311
|
return `${activeCount} active, ${completedCount} completed, ${this.subTasks.length} sub-tasks`;
|
|
305
312
|
}
|
|
306
313
|
static ɵfac = /*@__PURE__*/ (() => { let ɵTasksFullViewComponent_BaseFactory; return function TasksFullViewComponent_Factory(__ngFactoryType__) { return (ɵTasksFullViewComponent_BaseFactory || (ɵTasksFullViewComponent_BaseFactory = i0.ɵɵgetInheritedFactory(TasksFullViewComponent)))(__ngFactoryType__ || TasksFullViewComponent); }; })();
|
|
307
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: TasksFullViewComponent, selectors: [["mj-tasks-full-view"]], inputs: { environmentId: "environmentId", currentUser: "currentUser", baseFilter: "baseFilter", activeTaskId: "activeTaskId" }, outputs: { openEntityRecord: "openEntityRecord", taskSelected: "taskSelected" }, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature], decls: 3, vars: 1, consts: [[1, "tasks-full-view"], [3, "tasks", "title", "description", "showHeader", "showViewToggle", "viewMode"], [1, "task-detail-view", 3, "swoosh-in"], [3, "taskClicked", "tasks", "title", "description", "showHeader", "showViewToggle", "viewMode"], [1, "task-detail-view"], [1, "breadcrumb-nav"], [1, "breadcrumb-back", 3, "click"], [1, "fas", "fa-arrow-left"], [1, "breadcrumb-divider"], [1, "breadcrumb-current"], [3, "taskClicked", "openEntityRecord", "tasks", "ganttTasks", "taskDependencies", "agentRunMap", "title", "description", "showHeader", "showViewToggle", "viewMode"]], template: function TasksFullViewComponent_Template(rf, ctx) { if (rf & 1) {
|
|
314
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: TasksFullViewComponent, selectors: [["mj-tasks-full-view"]], inputs: { environmentId: "environmentId", currentUser: "currentUser", baseFilter: "baseFilter", BaseFilterResolver: "BaseFilterResolver", activeTaskId: "activeTaskId" }, outputs: { openEntityRecord: "openEntityRecord", taskSelected: "taskSelected" }, features: [i0.ɵɵInheritDefinitionFeature, i0.ɵɵNgOnChangesFeature], decls: 3, vars: 1, consts: [[1, "tasks-full-view"], [3, "tasks", "title", "description", "showHeader", "showViewToggle", "viewMode"], [1, "task-detail-view", 3, "swoosh-in"], [3, "taskClicked", "tasks", "title", "description", "showHeader", "showViewToggle", "viewMode"], [1, "task-detail-view"], [1, "breadcrumb-nav"], [1, "breadcrumb-back", 3, "click"], [1, "fas", "fa-arrow-left"], [1, "breadcrumb-divider"], [1, "breadcrumb-current"], [3, "taskClicked", "openEntityRecord", "tasks", "ganttTasks", "taskDependencies", "agentRunMap", "title", "description", "showHeader", "showViewToggle", "viewMode"]], template: function TasksFullViewComponent_Template(rf, ctx) { if (rf & 1) {
|
|
308
315
|
i0.ɵɵelementStart(0, "div", 0);
|
|
309
316
|
i0.ɵɵconditionalCreate(1, TasksFullViewComponent_Conditional_1_Template, 1, 6, "mj-task", 1)(2, TasksFullViewComponent_Conditional_2_Template, 11, 12, "div", 2);
|
|
310
317
|
i0.ɵɵelementEnd();
|
|
@@ -365,6 +372,8 @@ export class TasksFullViewComponent extends BaseAngularComponent {
|
|
|
365
372
|
type: Input
|
|
366
373
|
}], baseFilter: [{
|
|
367
374
|
type: Input
|
|
375
|
+
}], BaseFilterResolver: [{
|
|
376
|
+
type: Input
|
|
368
377
|
}], activeTaskId: [{
|
|
369
378
|
type: Input
|
|
370
379
|
}], openEntityRecord: [{
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tasks-full-view.component.js","sourceRoot":"","sources":["../../../../src/lib/components/task/tasks-full-view.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit, OnChanges, SimpleChanges } from '@angular/core';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\n\nimport { UserInfo, RunView } from '@memberjunction/core';\nimport { MJTaskEntity, MJTaskDependencyEntity, MJAIAgentRunEntity } from '@memberjunction/core-entities';\nimport { TaskComponent } from '@memberjunction/ng-tasks';\nimport { AIEngineBase } from '@memberjunction/ai-engine-base';\nimport { UUIDsEqual } from '@memberjunction/global';\n\n/**\n * Full-page tasks view with task list and Gantt chart\n * Generic component that displays tasks based on provided filter\n * Supports drilling into individual tasks to see sub-tasks\n */\n@Component({\n selector: 'mj-tasks-full-view',\n standalone: true,\n imports: [TaskComponent],\n template: `\n <div class=\"tasks-full-view\">\n @if (!selectedTask) {\n <!-- Task List View -->\n <mj-task\n [tasks]=\"filteredTasks\"\n [title]=\"'Tasks'\"\n [description]=\"getDescription()\"\n [showHeader]=\"true\"\n [showViewToggle]=\"false\"\n [viewMode]=\"'simple'\"\n (taskClicked)=\"onTaskClick($event)\">\n </mj-task>\n } @else {\n <!-- Task Detail View with Sub-tasks -->\n <div class=\"task-detail-view\" [class.swoosh-in]=\"showDetailAnimation\">\n <!-- Breadcrumb -->\n <div class=\"breadcrumb-nav\">\n <button class=\"breadcrumb-back\" (click)=\"backToTaskList()\">\n <i class=\"fas fa-arrow-left\"></i>\n <span>Back to Tasks</span>\n </button>\n <div class=\"breadcrumb-divider\">/</div>\n <span class=\"breadcrumb-current\">{{ selectedTask.Name }}</span>\n </div>\n\n <!-- Task Details & Sub-tasks with Gantt Toggle -->\n <mj-task\n [tasks]=\"subTasks\"\n [ganttTasks]=\"subTasksWithParent\"\n [taskDependencies]=\"taskDependencies\"\n [agentRunMap]=\"agentRunMap\"\n [title]=\"selectedTask.Name\"\n [description]=\"getTaskDetailDescription()\"\n [showHeader]=\"true\"\n [showViewToggle]=\"true\"\n [viewMode]=\"'gantt'\"\n (taskClicked)=\"onSubTaskClick($event)\"\n (openEntityRecord)=\"onOpenEntityRecord($event)\">\n </mj-task>\n </div>\n }\n </div>\n `,\n styles: [`\n .tasks-full-view {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--mj-bg-surface-sunken);\n }\n\n .task-detail-view {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--mj-bg-surface);\n }\n\n .swoosh-in {\n animation: swooshIn 0.3s ease-out;\n }\n\n @keyframes swooshIn {\n from {\n opacity: 0;\n transform: translateX(50px);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n }\n\n .breadcrumb-nav {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 16px 24px;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .breadcrumb-back {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n background: transparent;\n border: 1px solid var(--mj-border-strong);\n border-radius: 6px;\n color: var(--mj-text-secondary);\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s;\n }\n\n .breadcrumb-back:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-text-disabled);\n }\n\n .breadcrumb-back i {\n font-size: 12px;\n }\n\n .breadcrumb-divider {\n color: var(--mj-text-disabled);\n font-size: 14px;\n }\n\n .breadcrumb-current {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n `]\n})\nexport class TasksFullViewComponent extends BaseAngularComponent implements OnInit, OnChanges {\n @Input() environmentId!: string;\n @Input() currentUser!: UserInfo;\n @Input() baseFilter: string = '1=1'; // SQL filter for tasks (default: show all)\n @Input() activeTaskId?: string; // Task ID to auto-select and drill into\n @Output() openEntityRecord = new EventEmitter<{ entityName: string; recordId: string }>();\n @Output() taskSelected = new EventEmitter<string | null>(); // Emits task ID when drill-down occurs, null when returning to list\n\n public allTasks: MJTaskEntity[] = [];\n public filteredTasks: MJTaskEntity[] = [];\n public subTasks: MJTaskEntity[] = [];\n public subTasksWithParent: MJTaskEntity[] = []; // Includes parent for Gantt hierarchy\n public taskDependencies: MJTaskDependencyEntity[] = []; // Dependencies for Gantt links\n public agentRunMap = new Map<string, string>(); // Maps TaskID -> AgentRunID\n public selectedTask: MJTaskEntity | null = null;\n public showDetailAnimation: boolean = false;\n public isLoading: boolean = false;\n private aiEngineConfigured: boolean = false;\n\n ngOnInit() {\n this.loadTasks();\n }\n\n ngOnChanges(changes: SimpleChanges) {\n // Reload tasks if baseFilter changes\n if (changes['baseFilter'] && !changes['baseFilter'].firstChange) {\n this.loadTasks();\n }\n\n // Auto-drill into task if activeTaskId changes\n if (changes['activeTaskId'] && this.activeTaskId) {\n const task = this.allTasks.find(t => UUIDsEqual(t.ID, this.activeTaskId));\n if (task) {\n this.onTaskClick(task);\n }\n }\n }\n\n public async loadTasks(): Promise<void> {\n this.isLoading = true;\n\n try {\n // Configure AIEngineBase on first load (false = don't force refresh)\n if (!this.aiEngineConfigured) {\n await AIEngineBase.Instance.Config(false);\n this.aiEngineConfigured = true;\n }\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n\n console.log('📝 Tasks filter SQL:', this.baseFilter);\n\n // Load all tasks with the provided filter\n const tasksResult = await rv.RunView<MJTaskEntity>(\n {\n EntityName: 'MJ: Tasks',\n ExtraFilter: this.baseFilter,\n OrderBy: '__mj_CreatedAt DESC',\n MaxRows: 1000,\n ResultType: 'entity_object'\n },\n this.currentUser\n );\n\n console.log('📊 Tasks query result:', {\n success: tasksResult.Success,\n resultCount: tasksResult.Results?.length || 0,\n errorMessage: tasksResult.ErrorMessage\n });\n\n if (tasksResult.Success) {\n this.allTasks = tasksResult.Results || [];\n this.filteredTasks = this.allTasks;\n console.log(`📋 Loaded ${this.allTasks.length} tasks`);\n if (this.allTasks.length === 0) {\n console.log('💡 No tasks found with current filter');\n } else {\n console.log('✅ Sample task:', {\n id: this.allTasks[0].ID,\n name: this.allTasks[0].Name,\n status: this.allTasks[0].Status,\n conversationDetailID: this.allTasks[0].ConversationDetailID\n });\n }\n } else {\n console.error('❌ Failed to load tasks:', tasksResult.ErrorMessage);\n this.allTasks = [];\n this.filteredTasks = [];\n }\n } catch (error) {\n console.error('Failed to load tasks:', error);\n this.allTasks = [];\n this.filteredTasks = [];\n } finally {\n this.isLoading = false;\n }\n }\n\n public async onTaskClick(task: MJTaskEntity): Promise<void> {\n console.log('Task clicked:', task);\n this.selectedTask = task;\n this.showDetailAnimation = true;\n\n // Emit task selection event for URL tracking\n this.taskSelected.emit(task.ID);\n\n // Load all tasks in the hierarchy using RootParentID\n await this.loadTaskHierarchy(task);\n }\n\n private async loadTaskHierarchy(task: MJTaskEntity): Promise<void> {\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n\n // Use RootParentID to load all tasks in this hierarchy\n // If task has no RootParentID, it's the root itself, so use its ID\n const rootId = task.RootParentID || task.ID;\n\n // Load all tasks where RootParentID matches, or tasks that are the root itself\n const hierarchyResult = await rv.RunView<MJTaskEntity>(\n {\n EntityName: 'MJ: Tasks',\n ExtraFilter: `RootParentID='${rootId}' OR ID='${rootId}'`,\n OrderBy: '__mj_CreatedAt ASC',\n MaxRows: 1000,\n ResultType: 'entity_object'\n },\n this.currentUser\n );\n\n if (hierarchyResult.Success) {\n const allHierarchy = hierarchyResult.Results || [];\n\n // For list view: Filter out the clicked task itself - only show its children/descendants\n this.subTasks = allHierarchy.filter(t => !UUIDsEqual(t.ID, task.ID));\n\n // For Gantt view: Include the parent task so hierarchy works correctly\n this.subTasksWithParent = allHierarchy;\n\n console.log(`📋 Loaded ${this.subTasks.length} tasks in hierarchy for root ${rootId}`);\n\n // Load task dependencies for this hierarchy\n await this.loadTaskDependencies(rootId);\n\n // Load agent runs for this hierarchy\n await this.loadAgentRuns(allHierarchy);\n } else {\n console.error('❌ Failed to load task hierarchy:', hierarchyResult.ErrorMessage);\n this.subTasks = [];\n this.subTasksWithParent = [];\n this.taskDependencies = [];\n }\n } catch (error) {\n console.error('Failed to load task hierarchy:', error);\n this.subTasks = [];\n }\n }\n\n private async loadTaskDependencies(rootId: string): Promise<void> {\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n\n // Load task dependencies where either TaskID or DependsOnTaskID is in this hierarchy\n // Use subquery to find all tasks with this RootParentID\n // Note: Using __mj as the default schema - this is the standard MJ schema\n const schema = '__mj';\n const depsResult = await rv.RunView<MJTaskDependencyEntity>(\n {\n EntityName: 'MJ: Task Dependencies',\n ExtraFilter: `\n TaskID IN (SELECT ID FROM [${schema}].[vwTasks] WHERE RootParentID='${rootId}' OR ID='${rootId}')\n OR\n DependsOnTaskID IN (SELECT ID FROM [${schema}].[vwTasks] WHERE RootParentID='${rootId}' OR ID='${rootId}')\n `,\n ResultType: 'entity_object'\n },\n this.currentUser\n );\n\n if (depsResult.Success) {\n this.taskDependencies = depsResult.Results || [];\n console.log(`🔗 Loaded ${this.taskDependencies.length} task dependencies`);\n } else {\n console.error('❌ Failed to load task dependencies:', depsResult.ErrorMessage);\n this.taskDependencies = [];\n }\n } catch (error) {\n console.error('Failed to load task dependencies:', error);\n this.taskDependencies = [];\n }\n }\n\n private async loadAgentRuns(tasks: MJTaskEntity[]): Promise<void> {\n try {\n // Clear existing map\n this.agentRunMap.clear();\n\n // Get all unique ConversationDetailIDs from tasks (filter out nulls)\n const conversationDetailIds = tasks\n .filter(t => t.ConversationDetailID != null)\n .map(t => t.ConversationDetailID!);\n\n if (conversationDetailIds.length === 0) {\n console.log('💡 No tasks with ConversationDetailID');\n return;\n }\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const schema = '__mj';\n\n // Build filter to find agent runs for these conversation details\n // Use a subquery to avoid passing large ID lists\n const taskIds = tasks.map(t => `'${t.ID}'`).join(',');\n\n const agentRunsResult = await rv.RunView<MJAIAgentRunEntity>(\n {\n EntityName: 'MJ: AI Agent Runs',\n ExtraFilter: `\n ConversationDetailID IN (\n SELECT DISTINCT ConversationDetailID\n FROM [${schema}].[vwTasks]\n WHERE ID IN (${taskIds})\n AND ConversationDetailID IS NOT NULL\n )\n `,\n ResultType: 'entity_object'\n },\n this.currentUser\n );\n\n if (agentRunsResult.Success) {\n const agentRuns = agentRunsResult.Results || [];\n console.log(`🤖 Loaded ${agentRuns.length} agent runs`, agentRuns);\n\n // Build map: ConversationDetailID -> AgentRunID\n const convoToRunMap = new Map<string, string>();\n agentRuns.forEach(run => {\n if (run.ConversationDetailID) {\n convoToRunMap.set(run.ConversationDetailID, run.ID);\n console.log(`📝 Mapping ConvoDetailID ${run.ConversationDetailID} -> RunID ${run.ID}`);\n }\n });\n\n // Map TaskID -> AgentRunID using ConversationDetailID as the link\n tasks.forEach(task => {\n console.log(`🔍 Task ${task.Name} - ConvoDetailID: ${task.ConversationDetailID}, AgentID: ${task.AgentID}`);\n if (task.ConversationDetailID) {\n const agentRunId = convoToRunMap.get(task.ConversationDetailID);\n if (agentRunId) {\n this.agentRunMap.set(task.ID, agentRunId);\n console.log(`✅ Mapped Task ${task.ID} -> AgentRun ${agentRunId}`);\n } else {\n console.log(`⚠️ No agent run found for ConvoDetailID ${task.ConversationDetailID}`);\n }\n }\n });\n\n console.log(`🔗 Mapped ${this.agentRunMap.size} tasks to agent runs`, Array.from(this.agentRunMap.entries()));\n } else {\n console.error('❌ Failed to load agent runs:', agentRunsResult.ErrorMessage);\n }\n } catch (error) {\n console.error('Failed to load agent runs:', error);\n }\n }\n\n public backToTaskList(): void {\n this.selectedTask = null;\n this.subTasks = [];\n this.subTasksWithParent = [];\n this.taskDependencies = [];\n this.agentRunMap.clear();\n this.showDetailAnimation = false;\n\n // Emit null to indicate returning to task list (for URL tracking)\n this.taskSelected.emit(null);\n }\n\n public onSubTaskClick(subTask: MJTaskEntity): void {\n console.log('Sub-task clicked:', subTask);\n // Could drill down further if needed\n }\n\n public onOpenEntityRecord(event: { entityName: string; recordId: string }): void {\n // Bubble up the event to parent component\n this.openEntityRecord.emit(event);\n }\n\n public getDescription(): string {\n const activeCount = this.allTasks.filter(t => t.Status === 'Pending' || t.Status === 'In Progress').length;\n const completedCount = this.allTasks.filter(t => t.Status === 'Complete').length;\n return `${activeCount} active, ${completedCount} completed, ${this.allTasks.length} total`;\n }\n\n public getTaskDetailDescription(): string {\n if (this.subTasks.length === 0) {\n return 'No sub-tasks';\n }\n const activeCount = this.subTasks.filter(t => t.Status === 'Pending' || t.Status === 'In Progress').length;\n const completedCount = this.subTasks.filter(t => t.Status === 'Complete').length;\n return `${activeCount} active, ${completedCount} completed, ${this.subTasks.length} sub-tasks`;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"tasks-full-view.component.js","sourceRoot":"","sources":["../../../../src/lib/components/task/tasks-full-view.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit, OnChanges, SimpleChanges } from '@angular/core';\nimport { BaseAngularComponent } from '@memberjunction/ng-base-types';\n\nimport { UserInfo, RunView } from '@memberjunction/core';\nimport { MJTaskEntity, MJTaskDependencyEntity, MJAIAgentRunEntity } from '@memberjunction/core-entities';\nimport { TaskComponent } from '@memberjunction/ng-tasks';\nimport { AIEngineBase } from '@memberjunction/ai-engine-base';\nimport { UUIDsEqual } from '@memberjunction/global';\n\n/**\n * Full-page tasks view with task list and Gantt chart\n * Generic component that displays tasks based on provided filter\n * Supports drilling into individual tasks to see sub-tasks\n */\n@Component({\n selector: 'mj-tasks-full-view',\n standalone: true,\n imports: [TaskComponent],\n template: `\n <div class=\"tasks-full-view\">\n @if (!selectedTask) {\n <!-- Task List View -->\n <mj-task\n [tasks]=\"filteredTasks\"\n [title]=\"'Tasks'\"\n [description]=\"getDescription()\"\n [showHeader]=\"true\"\n [showViewToggle]=\"false\"\n [viewMode]=\"'simple'\"\n (taskClicked)=\"onTaskClick($event)\">\n </mj-task>\n } @else {\n <!-- Task Detail View with Sub-tasks -->\n <div class=\"task-detail-view\" [class.swoosh-in]=\"showDetailAnimation\">\n <!-- Breadcrumb -->\n <div class=\"breadcrumb-nav\">\n <button class=\"breadcrumb-back\" (click)=\"backToTaskList()\">\n <i class=\"fas fa-arrow-left\"></i>\n <span>Back to Tasks</span>\n </button>\n <div class=\"breadcrumb-divider\">/</div>\n <span class=\"breadcrumb-current\">{{ selectedTask.Name }}</span>\n </div>\n\n <!-- Task Details & Sub-tasks with Gantt Toggle -->\n <mj-task\n [tasks]=\"subTasks\"\n [ganttTasks]=\"subTasksWithParent\"\n [taskDependencies]=\"taskDependencies\"\n [agentRunMap]=\"agentRunMap\"\n [title]=\"selectedTask.Name\"\n [description]=\"getTaskDetailDescription()\"\n [showHeader]=\"true\"\n [showViewToggle]=\"true\"\n [viewMode]=\"'gantt'\"\n (taskClicked)=\"onSubTaskClick($event)\"\n (openEntityRecord)=\"onOpenEntityRecord($event)\">\n </mj-task>\n </div>\n }\n </div>\n `,\n styles: [`\n .tasks-full-view {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--mj-bg-surface-sunken);\n }\n\n .task-detail-view {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--mj-bg-surface);\n }\n\n .swoosh-in {\n animation: swooshIn 0.3s ease-out;\n }\n\n @keyframes swooshIn {\n from {\n opacity: 0;\n transform: translateX(50px);\n }\n to {\n opacity: 1;\n transform: translateX(0);\n }\n }\n\n .breadcrumb-nav {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 16px 24px;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .breadcrumb-back {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 12px;\n background: transparent;\n border: 1px solid var(--mj-border-strong);\n border-radius: 6px;\n color: var(--mj-text-secondary);\n font-size: 14px;\n font-weight: 500;\n cursor: pointer;\n transition: all 0.15s;\n }\n\n .breadcrumb-back:hover {\n background: var(--mj-bg-surface-sunken);\n border-color: var(--mj-text-disabled);\n }\n\n .breadcrumb-back i {\n font-size: 12px;\n }\n\n .breadcrumb-divider {\n color: var(--mj-text-disabled);\n font-size: 14px;\n }\n\n .breadcrumb-current {\n font-size: 14px;\n font-weight: 600;\n color: var(--mj-text-primary);\n }\n `]\n})\nexport class TasksFullViewComponent extends BaseAngularComponent implements OnInit, OnChanges {\n @Input() environmentId!: string;\n @Input() currentUser!: UserInfo;\n @Input() baseFilter: string = '1=1'; // SQL filter for tasks (default: show all)\n\n /**\n * Builds the task filter each time the view loads or refreshes, so the list includes tasks\n * created since the last load. Replaces {@link baseFilter} when set.\n */\n @Input() BaseFilterResolver: (() => Promise<string>) | null = null;\n @Input() activeTaskId?: string; // Task ID to auto-select and drill into\n @Output() openEntityRecord = new EventEmitter<{ entityName: string; recordId: string }>();\n @Output() taskSelected = new EventEmitter<string | null>(); // Emits task ID when drill-down occurs, null when returning to list\n\n public allTasks: MJTaskEntity[] = [];\n public filteredTasks: MJTaskEntity[] = [];\n public subTasks: MJTaskEntity[] = [];\n public subTasksWithParent: MJTaskEntity[] = []; // Includes parent for Gantt hierarchy\n public taskDependencies: MJTaskDependencyEntity[] = []; // Dependencies for Gantt links\n public agentRunMap = new Map<string, string>(); // Maps TaskID -> AgentRunID\n public selectedTask: MJTaskEntity | null = null;\n public showDetailAnimation: boolean = false;\n public isLoading: boolean = false;\n private aiEngineConfigured: boolean = false;\n\n ngOnInit() {\n this.loadTasks();\n }\n\n ngOnChanges(changes: SimpleChanges) {\n // Reload tasks if the filter or the filter builder changes\n const filterChanged = (key: string) => !!changes[key] && !changes[key].firstChange;\n if (filterChanged('baseFilter') || filterChanged('BaseFilterResolver')) {\n this.loadTasks();\n }\n\n // Auto-drill into task if activeTaskId changes\n if (changes['activeTaskId'] && this.activeTaskId) {\n const task = this.allTasks.find(t => UUIDsEqual(t.ID, this.activeTaskId));\n if (task) {\n this.onTaskClick(task);\n }\n }\n }\n\n public async loadTasks(): Promise<void> {\n this.isLoading = true;\n\n try {\n // Configure AIEngineBase on first load (false = don't force refresh)\n if (!this.aiEngineConfigured) {\n await AIEngineBase.Instance.Config(false);\n this.aiEngineConfigured = true;\n }\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const filter = this.BaseFilterResolver ? await this.BaseFilterResolver() : this.baseFilter;\n\n console.log('📝 Tasks filter SQL:', filter);\n\n // Load all tasks with the filter\n const tasksResult = await rv.RunView<MJTaskEntity>(\n {\n EntityName: 'MJ: Tasks',\n ExtraFilter: filter,\n OrderBy: '__mj_CreatedAt DESC',\n MaxRows: 1000,\n ResultType: 'entity_object'\n },\n this.currentUser\n );\n\n console.log('📊 Tasks query result:', {\n success: tasksResult.Success,\n resultCount: tasksResult.Results?.length || 0,\n errorMessage: tasksResult.ErrorMessage\n });\n\n if (tasksResult.Success) {\n this.allTasks = tasksResult.Results || [];\n this.filteredTasks = this.allTasks;\n console.log(`📋 Loaded ${this.allTasks.length} tasks`);\n if (this.allTasks.length === 0) {\n console.log('💡 No tasks found with current filter');\n } else {\n console.log('✅ Sample task:', {\n id: this.allTasks[0].ID,\n name: this.allTasks[0].Name,\n status: this.allTasks[0].Status,\n conversationDetailID: this.allTasks[0].ConversationDetailID\n });\n }\n } else {\n console.error('❌ Failed to load tasks:', tasksResult.ErrorMessage);\n this.allTasks = [];\n this.filteredTasks = [];\n }\n } catch (error) {\n console.error('Failed to load tasks:', error);\n this.allTasks = [];\n this.filteredTasks = [];\n } finally {\n this.isLoading = false;\n }\n }\n\n public async onTaskClick(task: MJTaskEntity): Promise<void> {\n console.log('Task clicked:', task);\n this.selectedTask = task;\n this.showDetailAnimation = true;\n\n // Emit task selection event for URL tracking\n this.taskSelected.emit(task.ID);\n\n // Load all tasks in the hierarchy using RootParentID\n await this.loadTaskHierarchy(task);\n }\n\n private async loadTaskHierarchy(task: MJTaskEntity): Promise<void> {\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n\n // Use RootParentID to load all tasks in this hierarchy\n // If task has no RootParentID, it's the root itself, so use its ID\n const rootId = task.RootParentID || task.ID;\n\n // Load all tasks where RootParentID matches, or tasks that are the root itself\n const hierarchyResult = await rv.RunView<MJTaskEntity>(\n {\n EntityName: 'MJ: Tasks',\n ExtraFilter: `RootParentID='${rootId}' OR ID='${rootId}'`,\n OrderBy: '__mj_CreatedAt ASC',\n MaxRows: 1000,\n ResultType: 'entity_object'\n },\n this.currentUser\n );\n\n if (hierarchyResult.Success) {\n const allHierarchy = hierarchyResult.Results || [];\n\n // For list view: Filter out the clicked task itself - only show its children/descendants\n this.subTasks = allHierarchy.filter(t => !UUIDsEqual(t.ID, task.ID));\n\n // For Gantt view: Include the parent task so hierarchy works correctly\n this.subTasksWithParent = allHierarchy;\n\n console.log(`📋 Loaded ${this.subTasks.length} tasks in hierarchy for root ${rootId}`);\n\n // Load task dependencies for this hierarchy\n await this.loadTaskDependencies(rootId);\n\n // Load agent runs for this hierarchy\n await this.loadAgentRuns(allHierarchy);\n } else {\n console.error('❌ Failed to load task hierarchy:', hierarchyResult.ErrorMessage);\n this.subTasks = [];\n this.subTasksWithParent = [];\n this.taskDependencies = [];\n }\n } catch (error) {\n console.error('Failed to load task hierarchy:', error);\n this.subTasks = [];\n }\n }\n\n private async loadTaskDependencies(rootId: string): Promise<void> {\n try {\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n\n // Load task dependencies where either TaskID or DependsOnTaskID is in this hierarchy\n // Use subquery to find all tasks with this RootParentID\n // Note: Using __mj as the default schema - this is the standard MJ schema\n const schema = '__mj';\n const depsResult = await rv.RunView<MJTaskDependencyEntity>(\n {\n EntityName: 'MJ: Task Dependencies',\n ExtraFilter: `\n TaskID IN (SELECT ID FROM [${schema}].[vwTasks] WHERE RootParentID='${rootId}' OR ID='${rootId}')\n OR\n DependsOnTaskID IN (SELECT ID FROM [${schema}].[vwTasks] WHERE RootParentID='${rootId}' OR ID='${rootId}')\n `,\n ResultType: 'entity_object'\n },\n this.currentUser\n );\n\n if (depsResult.Success) {\n this.taskDependencies = depsResult.Results || [];\n console.log(`🔗 Loaded ${this.taskDependencies.length} task dependencies`);\n } else {\n console.error('❌ Failed to load task dependencies:', depsResult.ErrorMessage);\n this.taskDependencies = [];\n }\n } catch (error) {\n console.error('Failed to load task dependencies:', error);\n this.taskDependencies = [];\n }\n }\n\n private async loadAgentRuns(tasks: MJTaskEntity[]): Promise<void> {\n try {\n // Clear existing map\n this.agentRunMap.clear();\n\n // Get all unique ConversationDetailIDs from tasks (filter out nulls)\n const conversationDetailIds = tasks\n .filter(t => t.ConversationDetailID != null)\n .map(t => t.ConversationDetailID!);\n\n if (conversationDetailIds.length === 0) {\n console.log('💡 No tasks with ConversationDetailID');\n return;\n }\n\n const rv = RunView.FromMetadataProvider(this.ProviderToUse);\n const schema = '__mj';\n\n // Build filter to find agent runs for these conversation details\n // Use a subquery to avoid passing large ID lists\n const taskIds = tasks.map(t => `'${t.ID}'`).join(',');\n\n const agentRunsResult = await rv.RunView<MJAIAgentRunEntity>(\n {\n EntityName: 'MJ: AI Agent Runs',\n ExtraFilter: `\n ConversationDetailID IN (\n SELECT DISTINCT ConversationDetailID\n FROM [${schema}].[vwTasks]\n WHERE ID IN (${taskIds})\n AND ConversationDetailID IS NOT NULL\n )\n `,\n ResultType: 'entity_object'\n },\n this.currentUser\n );\n\n if (agentRunsResult.Success) {\n const agentRuns = agentRunsResult.Results || [];\n console.log(`🤖 Loaded ${agentRuns.length} agent runs`, agentRuns);\n\n // Build map: ConversationDetailID -> AgentRunID\n const convoToRunMap = new Map<string, string>();\n agentRuns.forEach(run => {\n if (run.ConversationDetailID) {\n convoToRunMap.set(run.ConversationDetailID, run.ID);\n console.log(`📝 Mapping ConvoDetailID ${run.ConversationDetailID} -> RunID ${run.ID}`);\n }\n });\n\n // Map TaskID -> AgentRunID using ConversationDetailID as the link\n tasks.forEach(task => {\n console.log(`🔍 Task ${task.Name} - ConvoDetailID: ${task.ConversationDetailID}, AgentID: ${task.AgentID}`);\n if (task.ConversationDetailID) {\n const agentRunId = convoToRunMap.get(task.ConversationDetailID);\n if (agentRunId) {\n this.agentRunMap.set(task.ID, agentRunId);\n console.log(`✅ Mapped Task ${task.ID} -> AgentRun ${agentRunId}`);\n } else {\n console.log(`⚠️ No agent run found for ConvoDetailID ${task.ConversationDetailID}`);\n }\n }\n });\n\n console.log(`🔗 Mapped ${this.agentRunMap.size} tasks to agent runs`, Array.from(this.agentRunMap.entries()));\n } else {\n console.error('❌ Failed to load agent runs:', agentRunsResult.ErrorMessage);\n }\n } catch (error) {\n console.error('Failed to load agent runs:', error);\n }\n }\n\n public backToTaskList(): void {\n this.selectedTask = null;\n this.subTasks = [];\n this.subTasksWithParent = [];\n this.taskDependencies = [];\n this.agentRunMap.clear();\n this.showDetailAnimation = false;\n\n // Emit null to indicate returning to task list (for URL tracking)\n this.taskSelected.emit(null);\n }\n\n public onSubTaskClick(subTask: MJTaskEntity): void {\n console.log('Sub-task clicked:', subTask);\n // Could drill down further if needed\n }\n\n public onOpenEntityRecord(event: { entityName: string; recordId: string }): void {\n // Bubble up the event to parent component\n this.openEntityRecord.emit(event);\n }\n\n public getDescription(): string {\n const activeCount = this.allTasks.filter(t => t.Status === 'Pending' || t.Status === 'In Progress').length;\n const completedCount = this.allTasks.filter(t => t.Status === 'Complete').length;\n return `${activeCount} active, ${completedCount} completed, ${this.allTasks.length} total`;\n }\n\n public getTaskDetailDescription(): string {\n if (this.subTasks.length === 0) {\n return 'No sub-tasks';\n }\n const activeCount = this.subTasks.filter(t => t.Status === 'Pending' || t.Status === 'In Progress').length;\n const completedCount = this.subTasks.filter(t => t.Status === 'Complete').length;\n return `${activeCount} active, ${completedCount} completed, ${this.subTasks.length} sub-tasks`;\n }\n}\n"]}
|
|
@@ -124,6 +124,7 @@ export declare class ConversationWorkspaceComponent extends BaseAngularComponent
|
|
|
124
124
|
private readonly USER_SETTING_SIDEBAR_KEY;
|
|
125
125
|
private saveSettingsTimeout;
|
|
126
126
|
private isLoadingSettings;
|
|
127
|
+
/** The user's own top-level tasks; the Tasks tab's fallback filter (see {@link TasksFilterResolver}). */
|
|
127
128
|
tasksFilter: string;
|
|
128
129
|
selectedConversationId: string | null;
|
|
129
130
|
selectedConversation: MJConversationEntity | null;
|
|
@@ -207,9 +208,18 @@ export declare class ConversationWorkspaceComponent extends BaseAngularComponent
|
|
|
207
208
|
onThreadClosed(): void;
|
|
208
209
|
ngOnInit(): Promise<void>;
|
|
209
210
|
/**
|
|
210
|
-
*
|
|
211
|
+
* Sets {@link tasksFilter} to the user's own tasks. The Tasks tab builds its full filter with
|
|
212
|
+
* {@link TasksFilterResolver} each time it loads.
|
|
211
213
|
*/
|
|
212
214
|
private buildTasksFilter;
|
|
215
|
+
/**
|
|
216
|
+
* Builds the Tasks tab filter (see {@link BuildConversationTasksFilter}). The tasks view calls it
|
|
217
|
+
* on every load and refresh, so a task linked to a message created after the workspace opened
|
|
218
|
+
* appears on the next refresh. The same function is returned every time, so the input binding
|
|
219
|
+
* does not change.
|
|
220
|
+
*/
|
|
221
|
+
get TasksFilterResolver(): () => Promise<string>;
|
|
222
|
+
private tasksFilterResolver;
|
|
213
223
|
ngDoCheck(): void;
|
|
214
224
|
ngOnDestroy(): void;
|
|
215
225
|
onWindowResize(): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"conversation-workspace.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/workspace/conversation-workspace.component.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,OAAO,EAIL,YAAY,EACZ,MAAM,EACN,SAAS,EACT,OAAO,EACP,iBAAiB,EAElB,MAAM,eAAe,CAAC;AAEvB,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,YAAY,EAAmF,MAAM,+BAA+B,CAAC;AACtL,OAAO,EAAE,QAAQ,EAAE,YAAY,EAA0B,MAAM,sBAAsB,CAAC;AACtF,OAAO,EAAE,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAAE,oBAAoB,EAAE,MAAM,uCAAuC,CAAC;AAC7E,OAAO,EAAE,sBAAsB,EAAE,MAAM,yCAAyC,CAAC;AACjF,OAAO,EAAE,yBAAyB,EAAE,MAAM,4CAA4C,CAAC;AACvF,OAAO,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAEhE,OAAO,EAAE,4BAA4B,EAAE,MAAM,+CAA+C,CAAC;AAC7F,OAAO,EAAE,uBAAuB,EAAE,MAAM,2CAA2C,CAAC;AACpF,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,uCAAuC,CAAC;AACvF,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;
|
|
1
|
+
{"version":3,"file":"conversation-workspace.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/workspace/conversation-workspace.component.ts"],"names":[],"mappings":"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"}
|
|
@@ -23,6 +23,7 @@ import { UUIDsEqual } from '@memberjunction/global';
|
|
|
23
23
|
import { ArtifactMetadataEngine, UserInfoEngine, ConversationEngine } from '@memberjunction/core-entities';
|
|
24
24
|
import { BaseAngularComponent } from '@memberjunction/ng-base-types';
|
|
25
25
|
import { MentionAutocompleteService } from '../../services/mention-autocomplete.service';
|
|
26
|
+
import { BuildConversationTasksFilter, OwnTasksFilter } from '../../services/conversation-tasks-filter';
|
|
26
27
|
import { Subject, takeUntil } from 'rxjs';
|
|
27
28
|
import { AIEngineBase } from '@memberjunction/ai-engine-base';
|
|
28
29
|
import * as i0 from "@angular/core";
|
|
@@ -97,7 +98,7 @@ function ConversationWorkspaceComponent_Conditional_4_Conditional_6_Template(rf,
|
|
|
97
98
|
} if (rf & 2) {
|
|
98
99
|
const ctx_r1 = i0.ɵɵnextContext(2);
|
|
99
100
|
i0.ɵɵadvance();
|
|
100
|
-
i0.ɵɵproperty("environmentId", ctx_r1.environmentId)("currentUser", ctx_r1.currentUser)("baseFilter", ctx_r1.tasksFilter)("activeTaskId", ctx_r1.activeTaskId);
|
|
101
|
+
i0.ɵɵproperty("environmentId", ctx_r1.environmentId)("currentUser", ctx_r1.currentUser)("baseFilter", ctx_r1.tasksFilter)("BaseFilterResolver", ctx_r1.TasksFilterResolver)("activeTaskId", ctx_r1.activeTaskId);
|
|
101
102
|
} }
|
|
102
103
|
function ConversationWorkspaceComponent_Conditional_4_Conditional_7_Template(rf, ctx) { if (rf & 1) {
|
|
103
104
|
const _r8 = i0.ɵɵgetCurrentView();
|
|
@@ -137,7 +138,7 @@ function ConversationWorkspaceComponent_Conditional_4_Template(rf, ctx) { if (rf
|
|
|
137
138
|
i0.ɵɵconditionalCreate(3, ConversationWorkspaceComponent_Conditional_4_Conditional_3_Template, 2, 0, "button", 10);
|
|
138
139
|
i0.ɵɵconditionalCreate(4, ConversationWorkspaceComponent_Conditional_4_Conditional_4_Template, 1, 0, "div", 11);
|
|
139
140
|
i0.ɵɵconditionalCreate(5, ConversationWorkspaceComponent_Conditional_4_Conditional_5_Template, 2, 2, "div", 12);
|
|
140
|
-
i0.ɵɵconditionalCreate(6, ConversationWorkspaceComponent_Conditional_4_Conditional_6_Template, 2,
|
|
141
|
+
i0.ɵɵconditionalCreate(6, ConversationWorkspaceComponent_Conditional_4_Conditional_6_Template, 2, 5, "div", 12);
|
|
141
142
|
i0.ɵɵconditionalCreate(7, ConversationWorkspaceComponent_Conditional_4_Conditional_7_Template, 2, 12, "div", 12);
|
|
142
143
|
i0.ɵɵconditionalCreate(8, ConversationWorkspaceComponent_Conditional_4_Conditional_8_Template, 3, 15);
|
|
143
144
|
i0.ɵɵelementEnd();
|
|
@@ -282,7 +283,7 @@ export class ConversationWorkspaceComponent extends BaseAngularComponent {
|
|
|
282
283
|
USER_SETTING_SIDEBAR_KEY = 'Conversations.SidebarState';
|
|
283
284
|
saveSettingsTimeout = null;
|
|
284
285
|
isLoadingSettings = false;
|
|
285
|
-
|
|
286
|
+
/** The user's own top-level tasks; the Tasks tab's fallback filter (see {@link TasksFilterResolver}). */
|
|
286
287
|
tasksFilter = '1=1';
|
|
287
288
|
// LOCAL CONVERSATION STATE - enables multiple workspace instances
|
|
288
289
|
// Each workspace manages its own selection state independently
|
|
@@ -556,29 +557,23 @@ export class ConversationWorkspaceComponent extends BaseAngularComponent {
|
|
|
556
557
|
this.buildTasksFilter();
|
|
557
558
|
}
|
|
558
559
|
/**
|
|
559
|
-
*
|
|
560
|
+
* Sets {@link tasksFilter} to the user's own tasks. The Tasks tab builds its full filter with
|
|
561
|
+
* {@link TasksFilterResolver} each time it loads.
|
|
560
562
|
*/
|
|
561
563
|
buildTasksFilter() {
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
SELECT ID FROM [${cd.SchemaName}].[${cd.BaseView}]
|
|
574
|
-
WHERE
|
|
575
|
-
UserID ='${this.currentUser.ID}' OR
|
|
576
|
-
ConversationID IN (
|
|
577
|
-
SELECT ID FROM [${c.SchemaName}].[${c.BaseView}] WHERE UserID='${this.currentUser.ID}'
|
|
578
|
-
)
|
|
579
|
-
))`;
|
|
580
|
-
console.log('📝 Conversations domain tasks filter built:', this.tasksFilter);
|
|
564
|
+
this.tasksFilter = OwnTasksFilter(this.currentUser);
|
|
565
|
+
}
|
|
566
|
+
/**
|
|
567
|
+
* Builds the Tasks tab filter (see {@link BuildConversationTasksFilter}). The tasks view calls it
|
|
568
|
+
* on every load and refresh, so a task linked to a message created after the workspace opened
|
|
569
|
+
* appears on the next refresh. The same function is returned every time, so the input binding
|
|
570
|
+
* does not change.
|
|
571
|
+
*/
|
|
572
|
+
get TasksFilterResolver() {
|
|
573
|
+
this.tasksFilterResolver ??= () => BuildConversationTasksFilter(this.ProviderToUse, this.currentUser);
|
|
574
|
+
return this.tasksFilterResolver;
|
|
581
575
|
}
|
|
576
|
+
tasksFilterResolver = null;
|
|
582
577
|
ngDoCheck() {
|
|
583
578
|
// Detect new unsaved conversation state changes
|
|
584
579
|
const currentIsNewConversation = this.isNewUnsavedConversation;
|
|
@@ -1249,7 +1244,7 @@ export class ConversationWorkspaceComponent extends BaseAngularComponent {
|
|
|
1249
1244
|
static ɵfac = function ConversationWorkspaceComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || ConversationWorkspaceComponent)(i0.ɵɵdirectiveInject(i1.ArtifactStateService), i0.ɵɵdirectiveInject(i2.CollectionStateService), i0.ɵɵdirectiveInject(i3.ArtifactPermissionService), i0.ɵɵdirectiveInject(i4.MJNotificationService), i0.ɵɵdirectiveInject(i5.ConversationStreamingService), i0.ɵɵdirectiveInject(i6.UICommandHandlerService), i0.ɵɵdirectiveInject(i0.ChangeDetectorRef)); };
|
|
1250
1245
|
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: ConversationWorkspaceComponent, selectors: [["mj-conversation-workspace"]], hostBindings: function ConversationWorkspaceComponent_HostBindings(rf, ctx) { if (rf & 1) {
|
|
1251
1246
|
i0.ɵɵlistener("resize", function ConversationWorkspaceComponent_resize_HostBindingHandler() { return ctx.onWindowResize(); }, i0.ɵɵresolveWindow)("click", function ConversationWorkspaceComponent_click_HostBindingHandler($event) { return ctx.onDocumentClick($event); }, i0.ɵɵresolveDocument);
|
|
1252
|
-
} }, inputs: { environmentId: "environmentId", initialConversationId: "initialConversationId", layout: "layout", currentUser: "currentUser", activeContext: "activeContext", contextItemId: "contextItemId", ShowRoutines: "ShowRoutines", activeTabInput: "activeTabInput", activeConversationInput: "activeConversationInput", activeCollectionInput: "activeCollectionInput", activeVersionIdInput: "activeVersionIdInput", activeTaskInput: "activeTaskInput" }, outputs: { conversationChanged: "conversationChanged", artifactOpened: "artifactOpened", navigationChanged: "navigationChanged", newConversationStarted: "newConversationStarted", actionableCommandExecuted: "actionableCommandExecuted", automaticCommandExecuted: "automaticCommandExecuted", navigationRequested: "navigationRequested" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 8, vars: 13, consts: [["mjSearchShortcut", "", 1, "conversation-workspace", 3, "searchTriggered"], [1, "workspace-navigation"], [3, "tabChanged", "sidebarToggled", "searchTriggered", "refreshTriggered", "activeTab", "environmentId", "currentUser", "conversationId"], [1, "workspace-loading"], [1, "workspace-content"], [3, "close", "resultSelected", "isOpen", "environmentId", "currentUser"], [3, "saved", "cancelled", "isOpen", "artifact", "currentUser"], ["text", "Loading agents...", "size", "large"], [1, "mobile-sidebar-backdrop", "visible"], [1, "workspace-sidebar", 3, "open", "collapsed", "no-transition", "width"], ["title", "Show conversations", 1, "sidebar-floating-toggle"], [1, "sidebar-resize-handle"], [1, "workspace-main"], [1, "mobile-sidebar-backdrop", "visible", 3, "click"], [1, "workspace-sidebar"], [3, "conversationSelected", "newConversationRequested", "openEntityRecord", "pinSidebarRequested", "unpinSidebarRequested", "activeTab", "environmentId", "currentUser", "selectedConversationId", "renamedConversationId", "isSidebarPinned", "isMobileView", "ShowRoutines", "Provider"], ["title", "Show conversations", 1, "sidebar-floating-toggle", 3, "click"], [1, "fas", "fa-table-columns"], [1, "sidebar-resize-handle", 3, "mousedown"], [3, "collectionNavigated", "environmentId", "currentUser"], [3, "openEntityRecord", "environmentId", "currentUser", "baseFilter", "activeTaskId"], [3, "conversationRenamed", "openEntityRecord", "navigationRequest", "taskClicked", "artifactLinkClicked", "conversationCreated", "realtimeConversationReady", "threadOpened", "threadClosed", "pendingArtifactConsumed", "pendingMessageConsumed", "pendingMessageRequested", "environmentId", "currentUser", "conversationId", "conversation", "threadId", "isNewConversation", "pendingMessage", "pendingAttachments", "pendingMessageConversationId", "pendingArtifactId", "pendingArtifactConversationId", "pendingArtifactVersionNumber"], [1, "artifact-panel-resize-handle"], [1, "workspace-artifact-panel"], [3, "closed", "navigateToLink", "shareRequested", "maximizeToggled", "applyFormRequested", "artifactId", "currentUser", "environmentId", "versionNumber", "showSaveToCollection", "viewContext", "contextCollectionId", "canShare", "canEdit", "isMaximized"], [1, "artifact-panel-resize-handle", 3, "mousedown"]], template: function ConversationWorkspaceComponent_Template(rf, ctx) { if (rf & 1) {
|
|
1247
|
+
} }, inputs: { environmentId: "environmentId", initialConversationId: "initialConversationId", layout: "layout", currentUser: "currentUser", activeContext: "activeContext", contextItemId: "contextItemId", ShowRoutines: "ShowRoutines", activeTabInput: "activeTabInput", activeConversationInput: "activeConversationInput", activeCollectionInput: "activeCollectionInput", activeVersionIdInput: "activeVersionIdInput", activeTaskInput: "activeTaskInput" }, outputs: { conversationChanged: "conversationChanged", artifactOpened: "artifactOpened", navigationChanged: "navigationChanged", newConversationStarted: "newConversationStarted", actionableCommandExecuted: "actionableCommandExecuted", automaticCommandExecuted: "automaticCommandExecuted", navigationRequested: "navigationRequested" }, standalone: false, features: [i0.ɵɵInheritDefinitionFeature], decls: 8, vars: 13, consts: [["mjSearchShortcut", "", 1, "conversation-workspace", 3, "searchTriggered"], [1, "workspace-navigation"], [3, "tabChanged", "sidebarToggled", "searchTriggered", "refreshTriggered", "activeTab", "environmentId", "currentUser", "conversationId"], [1, "workspace-loading"], [1, "workspace-content"], [3, "close", "resultSelected", "isOpen", "environmentId", "currentUser"], [3, "saved", "cancelled", "isOpen", "artifact", "currentUser"], ["text", "Loading agents...", "size", "large"], [1, "mobile-sidebar-backdrop", "visible"], [1, "workspace-sidebar", 3, "open", "collapsed", "no-transition", "width"], ["title", "Show conversations", 1, "sidebar-floating-toggle"], [1, "sidebar-resize-handle"], [1, "workspace-main"], [1, "mobile-sidebar-backdrop", "visible", 3, "click"], [1, "workspace-sidebar"], [3, "conversationSelected", "newConversationRequested", "openEntityRecord", "pinSidebarRequested", "unpinSidebarRequested", "activeTab", "environmentId", "currentUser", "selectedConversationId", "renamedConversationId", "isSidebarPinned", "isMobileView", "ShowRoutines", "Provider"], ["title", "Show conversations", 1, "sidebar-floating-toggle", 3, "click"], [1, "fas", "fa-table-columns"], [1, "sidebar-resize-handle", 3, "mousedown"], [3, "collectionNavigated", "environmentId", "currentUser"], [3, "openEntityRecord", "environmentId", "currentUser", "baseFilter", "BaseFilterResolver", "activeTaskId"], [3, "conversationRenamed", "openEntityRecord", "navigationRequest", "taskClicked", "artifactLinkClicked", "conversationCreated", "realtimeConversationReady", "threadOpened", "threadClosed", "pendingArtifactConsumed", "pendingMessageConsumed", "pendingMessageRequested", "environmentId", "currentUser", "conversationId", "conversation", "threadId", "isNewConversation", "pendingMessage", "pendingAttachments", "pendingMessageConversationId", "pendingArtifactId", "pendingArtifactConversationId", "pendingArtifactVersionNumber"], [1, "artifact-panel-resize-handle"], [1, "workspace-artifact-panel"], [3, "closed", "navigateToLink", "shareRequested", "maximizeToggled", "applyFormRequested", "artifactId", "currentUser", "environmentId", "versionNumber", "showSaveToCollection", "viewContext", "contextCollectionId", "canShare", "canEdit", "isMaximized"], [1, "artifact-panel-resize-handle", 3, "mousedown"]], template: function ConversationWorkspaceComponent_Template(rf, ctx) { if (rf & 1) {
|
|
1253
1248
|
i0.ɵɵelementStart(0, "div", 0);
|
|
1254
1249
|
i0.ɵɵlistener("searchTriggered", function ConversationWorkspaceComponent_Template_div_searchTriggered_0_listener() { return ctx.openSearch(); });
|
|
1255
1250
|
i0.ɵɵelementStart(1, "div", 1)(2, "mj-conversation-navigation", 2);
|
|
@@ -1280,7 +1275,7 @@ export class ConversationWorkspaceComponent extends BaseAngularComponent {
|
|
|
1280
1275
|
}
|
|
1281
1276
|
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(ConversationWorkspaceComponent, [{
|
|
1282
1277
|
type: Component,
|
|
1283
|
-
args: [{ standalone: false, selector: 'mj-conversation-workspace', template: "<div class=\"conversation-workspace\" [attr.data-layout]=\"layout\" mjSearchShortcut (searchTriggered)=\"openSearch()\">\n <!-- Top Navigation Bar -->\n <div class=\"workspace-navigation\">\n <mj-conversation-navigation\n [activeTab]=\"activeTab\"\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\"\n [conversationId]=\"selectedConversationId\"\n (tabChanged)=\"onTabChanged($event)\"\n (sidebarToggled)=\"toggleSidebar()\"\n (searchTriggered)=\"openSearch()\"\n (refreshTriggered)=\"onRefreshAgentCache()\">\n </mj-conversation-navigation>\n </div>\n\n <!-- Loading spinner while initializing agents -->\n @if (!isWorkspaceReady) {\n <div class=\"workspace-loading\">\n <mj-loading text=\"Loading agents...\" size=\"large\"></mj-loading>\n </div>\n }\n\n <!-- Main workspace content - only renders when agents are ready -->\n @if (isWorkspaceReady) {\n <div class=\"workspace-content\">\n <!-- Mobile sidebar backdrop -->\n @if (isMobileView && isSidebarVisible && activeTab !== 'collections' && activeTab !== 'tasks') {\n <div class=\"mobile-sidebar-backdrop visible\" (click)=\"closeSidebar()\"></div>\n }\n\n <!-- Left Sidebar (hidden when Collections or Tasks view is active) -->\n @if (activeTab !== 'collections' && activeTab !== 'tasks' && isSidebarSettingsLoaded) {\n <div class=\"workspace-sidebar\"\n [class.open]=\"isSidebarVisible\"\n [class.collapsed]=\"isSidebarCollapsed\"\n [class.no-transition]=\"!sidebarTransitionsEnabled\"\n [style.width.px]=\"isSidebarCollapsed ? 0 : sidebarWidth\">\n <mj-conversation-sidebar\n [activeTab]=\"activeTab\"\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\"\n [selectedConversationId]=\"selectedConversationId\"\n [renamedConversationId]=\"renamedConversationId\"\n [isSidebarPinned]=\"isSidebarPinned\"\n [isMobileView]=\"isMobileView\"\n [ShowRoutines]=\"ShowRoutines\"\n [Provider]=\"Provider\"\n (conversationSelected)=\"onConversationSelected($event)\"\n (newConversationRequested)=\"startNewConversation()\"\n (openEntityRecord)=\"onOpenEntityRecord($event)\"\n (pinSidebarRequested)=\"pinSidebar()\"\n (unpinSidebarRequested)=\"unpinSidebar()\">\n </mj-conversation-sidebar>\n </div>\n }\n\n <!-- Floating toggle button (only visible when sidebar is collapsed and settings loaded) -->\n @if (activeTab !== 'collections' && activeTab !== 'tasks' && isSidebarCollapsed && isSidebarSettingsLoaded) {\n <button class=\"sidebar-floating-toggle\"\n (click)=\"expandSidebar()\"\n title=\"Show conversations\">\n <i class=\"fas fa-table-columns\"></i>\n </button>\n }\n\n <!-- Resize handle for sidebar (only when expanded and settings loaded) -->\n @if (isSidebarVisible && !isSidebarCollapsed && activeTab !== 'collections' && activeTab !== 'tasks' && isSidebarSettingsLoaded) {\n <div class=\"sidebar-resize-handle\"\n (mousedown)=\"onSidebarResizeStart($event)\"></div>\n }\n\n <!-- Collections Full-Panel View -->\n @if (activeTab === 'collections') {\n <div class=\"workspace-main\">\n <mj-collections-full-view\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\"\n (collectionNavigated)=\"onCollectionNavigated($event)\">\n </mj-collections-full-view>\n </div>\n }\n\n <!-- Tasks Full-Panel View -->\n @if (activeTab === 'tasks') {\n <div class=\"workspace-main\">\n <mj-tasks-full-view\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\"\n [baseFilter]=\"tasksFilter\"\n [activeTaskId]=\"activeTaskId\"\n (openEntityRecord)=\"onOpenEntityRecordFromTasks($event)\">\n </mj-tasks-full-view>\n </div>\n }\n\n <!-- Main Chat Area (only shown when not in Collections or Tasks view) -->\n @if (activeTab !== 'collections' && activeTab !== 'tasks') {\n <div class=\"workspace-main\">\n <mj-conversation-chat-area\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\"\n [conversationId]=\"selectedConversationId\"\n [conversation]=\"selectedConversation\"\n [threadId]=\"selectedThreadId\"\n [isNewConversation]=\"isNewUnsavedConversation\"\n [pendingMessage]=\"pendingMessageToSend\"\n [pendingAttachments]=\"pendingAttachmentsToSend\"\n [pendingMessageConversationId]=\"pendingMessageConversationId\"\n [pendingArtifactId]=\"pendingArtifactId\"\n [pendingArtifactConversationId]=\"pendingArtifactConversationId\"\n [pendingArtifactVersionNumber]=\"pendingArtifactVersionNumber\"\n (conversationRenamed)=\"onConversationRenamed($event)\"\n (openEntityRecord)=\"onOpenEntityRecord($event)\"\n (navigationRequest)=\"onNavigationRequest($event)\"\n (taskClicked)=\"onTaskClicked($event)\"\n (artifactLinkClicked)=\"onArtifactLinkNavigation($event)\"\n (conversationCreated)=\"onConversationCreated($event)\"\n (realtimeConversationReady)=\"onRealtimeConversationReady($event)\"\n (threadOpened)=\"onThreadOpened($event)\"\n (threadClosed)=\"onThreadClosed()\"\n (pendingArtifactConsumed)=\"pendingArtifactId = null; pendingArtifactConversationId = null; pendingArtifactVersionNumber = null\"\n (pendingMessageConsumed)=\"pendingMessageToSend = null; pendingAttachmentsToSend = null; pendingMessageConversationId = null\"\n (pendingMessageRequested)=\"onPendingMessageRequested($event)\">\n </mj-conversation-chat-area>\n </div>\n }\n\n <!-- Right Artifact Panel -->\n @if (isArtifactPanelOpen && activeArtifactId) {\n @if (!isArtifactPanelMaximized) {\n <div class=\"artifact-panel-resize-handle\" (mousedown)=\"onArtifactPanelResizeStart($event)\"></div>\n }\n <div class=\"workspace-artifact-panel\"\n [style.width.%]=\"artifactPanelWidth\"\n [class.maximized]=\"isArtifactPanelMaximized\">\n <mj-artifact-viewer-panel\n [artifactId]=\"activeArtifactId\"\n [currentUser]=\"currentUser\"\n [environmentId]=\"environmentId\"\n [versionNumber]=\"activeVersionNumber ?? undefined\"\n [showSaveToCollection]=\"activeTab !== 'collections'\"\n [viewContext]=\"activeTab === 'collections' ? 'collection' : 'conversation'\"\n [contextCollectionId]=\"collectionState.activeCollectionId ?? undefined\"\n [canShare]=\"canShareActiveArtifact\"\n [canEdit]=\"canEditActiveArtifact\"\n [isMaximized]=\"isArtifactPanelMaximized\"\n (closed)=\"closeArtifactPanel()\"\n (navigateToLink)=\"onArtifactLinkNavigation($event)\"\n (shareRequested)=\"onArtifactShareRequested($event)\"\n (maximizeToggled)=\"toggleMaximizeArtifactPanel()\"\n (applyFormRequested)=\"onApplyFormRequested($event)\">\n </mj-artifact-viewer-panel>\n </div>\n }\n </div>\n }\n\n <!-- Global Search Panel -->\n <mj-search-panel\n [isOpen]=\"isSearchPanelOpen\"\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\"\n (close)=\"closeSearch()\"\n (resultSelected)=\"handleSearchResult($event)\">\n </mj-search-panel>\n\n <!-- Toast Notifications -->\n <mj-toast></mj-toast>\n\n <!-- Artifact Share Modal -->\n <mj-artifact-share-modal\n [isOpen]=\"isArtifactShareModalOpen\"\n [artifact]=\"artifactToShare\"\n [currentUser]=\"currentUser\"\n (saved)=\"onArtifactShared()\"\n (cancelled)=\"onArtifactShareModalClose()\">\n </mj-artifact-share-modal>\n</div>", styles: [".conversation-workspace {\n display: flex;\n flex-direction: column;\n height: 100%; /* Fill parent container - works in any context (tabs, embedded, etc.) */\n min-height: 0; /* Allow flex shrinking in nested flex containers */\n background-color: var(--mj-bg-surface-sunken);\n position: relative;\n}\n\n.workspace-navigation {\n flex-shrink: 0;\n height: 48px;\n background-color: var(--mj-text-primary);\n border-bottom: 1px solid color-mix(in srgb, var(--mj-text-inverse) 10%, transparent);\n}\n\n.workspace-content {\n flex: 1;\n display: flex;\n overflow: hidden;\n min-height: 0;\n position: relative;\n}\n\n.workspace-sidebar {\n flex-shrink: 0;\n background-color: var(--mj-text-primary);\n border-right: 1px solid var(--mj-border-default);\n overflow-y: auto;\n transition: width 0.3s ease;\n}\n\n/* Disable transitions during initial load to prevent jarring animation */\n.workspace-sidebar.no-transition {\n transition: none !important;\n}\n\n.workspace-sidebar.collapsed {\n width: 0 !important;\n min-width: 0;\n border-right: none;\n overflow: hidden;\n}\n\n/* Floating toggle button (only visible when sidebar is collapsed) */\n.sidebar-floating-toggle {\n position: absolute;\n top: 12px;\n left: 12px;\n z-index: 100;\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--mj-text-primary);\n border: 1px solid color-mix(in srgb, var(--mj-text-inverse) 20%, transparent);\n border-radius: 8px;\n cursor: pointer;\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-text-primary) 15%, transparent);\n transition: all 0.2s ease;\n}\n\n.sidebar-floating-toggle:hover {\n background: var(--mj-text-primary);\n border-color: color-mix(in srgb, var(--mj-text-inverse) 30%, transparent);\n box-shadow: 0 4px 12px color-mix(in srgb, var(--mj-text-primary) 20%, transparent);\n transform: scale(1.05);\n}\n\n.sidebar-floating-toggle:active {\n transform: scale(0.98);\n}\n\n.sidebar-floating-toggle i {\n color: color-mix(in srgb, var(--mj-text-inverse) 85%, transparent);\n font-size: 16px;\n transition: color 0.15s ease;\n}\n\n.sidebar-floating-toggle:hover i {\n color: var(--mj-text-inverse);\n}\n\n.sidebar-resize-handle {\n width: 4px;\n background: transparent;\n cursor: ew-resize;\n flex-shrink: 0;\n position: relative;\n transition: background-color 0.2s;\n}\n\n.sidebar-resize-handle:hover {\n background: var(--mj-brand-primary-hover);\n}\n\n.sidebar-resize-handle:active {\n background: var(--mj-brand-primary-hover);\n}\n\n.sidebar-resize-handle::before {\n content: '';\n position: absolute;\n left: -4px;\n right: -4px;\n top: 0;\n bottom: 0;\n cursor: ew-resize;\n}\n\n.workspace-main {\n flex: 1;\n display: flex;\n flex-direction: column;\n background-color: var(--mj-bg-surface-card);\n overflow: hidden;\n min-height: 0;\n}\n\n.workspace-main > mj-conversation-chat-area {\n display: flex;\n flex: 1;\n min-height: 0;\n}\n\n.workspace-artifact-panel {\n flex-shrink: 0;\n background-color: var(--mj-bg-surface-card);\n overflow: hidden;\n min-width: 300px;\n max-width: 70%;\n}\n\n.artifact-panel-resize-handle {\n width: 4px;\n background-color: transparent;\n cursor: ew-resize;\n flex-shrink: 0;\n transition: background-color 0.2s;\n position: relative;\n z-index: 10;\n}\n\n/* Wider hit area for easier grabbing */\n.artifact-panel-resize-handle::before {\n content: '';\n position: absolute;\n top: 0;\n bottom: 0;\n left: -4px;\n right: -4px;\n cursor: ew-resize;\n}\n\n.artifact-panel-resize-handle:hover {\n background-color: var(--mj-brand-primary-hover);\n}\n\n.artifact-panel-resize-handle:active {\n background-color: var(--mj-brand-primary-hover);\n}\n\n/* Maximized artifact panel */\n.workspace-artifact-panel.maximized {\n width: 100% !important;\n max-width: 100%;\n}\n\n/* Compact layout */\n.conversation-workspace[data-layout=\"compact\"] .workspace-sidebar {\n width: 240px;\n}\n\n.conversation-workspace[data-layout=\"compact\"] .workspace-artifact-panel {\n width: 400px;\n}\n\n/* Embedded layout */\n.conversation-workspace[data-layout=\"embedded\"] {\n height: 100%;\n}\n\n.conversation-workspace[data-layout=\"embedded\"] .workspace-navigation {\n height: 48px;\n}\n\n/* Responsive */\n@media (max-width: 1024px) {\n .workspace-sidebar {\n position: absolute;\n left: 0;\n top: 60px;\n bottom: 0;\n z-index: 100;\n box-shadow: 2px 0 8px color-mix(in srgb, var(--mj-text-primary) 10%, transparent);\n }\n\n .workspace-artifact-panel {\n position: fixed;\n right: 0;\n top: 60px;\n bottom: 0;\n z-index: 100;\n box-shadow: -2px 0 8px color-mix(in srgb, var(--mj-text-primary) 10%, transparent);\n }\n}\n\n/* Desktop sidebar toggle animation */\n@media (min-width: 769px) {\n .workspace-sidebar {\n transition: width 0.3s ease, min-width 0.3s ease;\n overflow: hidden;\n }\n\n .workspace-sidebar:not(.open) {\n width: 0 !important;\n min-width: 0;\n border-right: none;\n }\n\n .sidebar-resize-handle {\n transition: opacity 0.3s ease, width 0.3s ease;\n }\n\n .workspace-sidebar:not(.open) ~ .sidebar-resize-handle {\n opacity: 0;\n width: 0;\n pointer-events: none;\n }\n}\n\n/* Mobile adjustments: 481px - 768px */\n@media (max-width: 768px) {\n .workspace-sidebar {\n position: fixed;\n left: 0;\n top: 80px;\n z-index: 1000;\n width: 260px !important;\n height: calc(100vh - 80px);\n transform: translateX(-100%);\n transition: transform 0.3s ease;\n }\n\n .workspace-sidebar.open {\n transform: translateX(0);\n }\n\n .workspace-artifact-panel {\n position: fixed;\n width: 100%;\n left: 0;\n right: 0;\n top: 56px; /* 48px nav + 8px dark strip above blue border */\n bottom: 0;\n z-index: 1000;\n max-width: 100%;\n height: auto;\n }\n\n .sidebar-resize-handle,\n .artifact-panel-resize-handle,\n .sidebar-floating-toggle {\n display: none;\n }\n\n /* Mobile sidebar backdrop */\n .mobile-sidebar-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: var(--mj-bg-overlay);\n opacity: 0;\n pointer-events: none;\n transition: opacity 0.3s ease;\n z-index: 999;\n }\n\n .mobile-sidebar-backdrop.visible {\n opacity: 1;\n pointer-events: auto;\n }\n}\n\n/* Small Phone adjustments: <= 480px */\n@media (max-width: 480px) {\n .workspace-navigation {\n height: 48px;\n }\n\n .workspace-sidebar {\n width: 100%;\n }\n}\n\n/* Loading spinner (shown while initializing agents) */\n.workspace-loading {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n flex: 1;\n width: 100%;\n background: var(--mj-bg-surface-card);\n gap: 1rem;\n}\n\n.loading-spinner {\n font-size: 3rem;\n color: var(--mj-brand-primary);\n}\n\n.workspace-loading p {\n font-size: 1rem;\n color: var(--mj-text-secondary);\n margin: 0;\n}"] }]
|
|
1278
|
+
args: [{ standalone: false, selector: 'mj-conversation-workspace', template: "<div class=\"conversation-workspace\" [attr.data-layout]=\"layout\" mjSearchShortcut (searchTriggered)=\"openSearch()\">\n <!-- Top Navigation Bar -->\n <div class=\"workspace-navigation\">\n <mj-conversation-navigation\n [activeTab]=\"activeTab\"\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\"\n [conversationId]=\"selectedConversationId\"\n (tabChanged)=\"onTabChanged($event)\"\n (sidebarToggled)=\"toggleSidebar()\"\n (searchTriggered)=\"openSearch()\"\n (refreshTriggered)=\"onRefreshAgentCache()\">\n </mj-conversation-navigation>\n </div>\n\n <!-- Loading spinner while initializing agents -->\n @if (!isWorkspaceReady) {\n <div class=\"workspace-loading\">\n <mj-loading text=\"Loading agents...\" size=\"large\"></mj-loading>\n </div>\n }\n\n <!-- Main workspace content - only renders when agents are ready -->\n @if (isWorkspaceReady) {\n <div class=\"workspace-content\">\n <!-- Mobile sidebar backdrop -->\n @if (isMobileView && isSidebarVisible && activeTab !== 'collections' && activeTab !== 'tasks') {\n <div class=\"mobile-sidebar-backdrop visible\" (click)=\"closeSidebar()\"></div>\n }\n\n <!-- Left Sidebar (hidden when Collections or Tasks view is active) -->\n @if (activeTab !== 'collections' && activeTab !== 'tasks' && isSidebarSettingsLoaded) {\n <div class=\"workspace-sidebar\"\n [class.open]=\"isSidebarVisible\"\n [class.collapsed]=\"isSidebarCollapsed\"\n [class.no-transition]=\"!sidebarTransitionsEnabled\"\n [style.width.px]=\"isSidebarCollapsed ? 0 : sidebarWidth\">\n <mj-conversation-sidebar\n [activeTab]=\"activeTab\"\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\"\n [selectedConversationId]=\"selectedConversationId\"\n [renamedConversationId]=\"renamedConversationId\"\n [isSidebarPinned]=\"isSidebarPinned\"\n [isMobileView]=\"isMobileView\"\n [ShowRoutines]=\"ShowRoutines\"\n [Provider]=\"Provider\"\n (conversationSelected)=\"onConversationSelected($event)\"\n (newConversationRequested)=\"startNewConversation()\"\n (openEntityRecord)=\"onOpenEntityRecord($event)\"\n (pinSidebarRequested)=\"pinSidebar()\"\n (unpinSidebarRequested)=\"unpinSidebar()\">\n </mj-conversation-sidebar>\n </div>\n }\n\n <!-- Floating toggle button (only visible when sidebar is collapsed and settings loaded) -->\n @if (activeTab !== 'collections' && activeTab !== 'tasks' && isSidebarCollapsed && isSidebarSettingsLoaded) {\n <button class=\"sidebar-floating-toggle\"\n (click)=\"expandSidebar()\"\n title=\"Show conversations\">\n <i class=\"fas fa-table-columns\"></i>\n </button>\n }\n\n <!-- Resize handle for sidebar (only when expanded and settings loaded) -->\n @if (isSidebarVisible && !isSidebarCollapsed && activeTab !== 'collections' && activeTab !== 'tasks' && isSidebarSettingsLoaded) {\n <div class=\"sidebar-resize-handle\"\n (mousedown)=\"onSidebarResizeStart($event)\"></div>\n }\n\n <!-- Collections Full-Panel View -->\n @if (activeTab === 'collections') {\n <div class=\"workspace-main\">\n <mj-collections-full-view\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\"\n (collectionNavigated)=\"onCollectionNavigated($event)\">\n </mj-collections-full-view>\n </div>\n }\n\n <!-- Tasks Full-Panel View -->\n @if (activeTab === 'tasks') {\n <div class=\"workspace-main\">\n <mj-tasks-full-view\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\"\n [baseFilter]=\"tasksFilter\"\n [BaseFilterResolver]=\"TasksFilterResolver\"\n [activeTaskId]=\"activeTaskId\"\n (openEntityRecord)=\"onOpenEntityRecordFromTasks($event)\">\n </mj-tasks-full-view>\n </div>\n }\n\n <!-- Main Chat Area (only shown when not in Collections or Tasks view) -->\n @if (activeTab !== 'collections' && activeTab !== 'tasks') {\n <div class=\"workspace-main\">\n <mj-conversation-chat-area\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\"\n [conversationId]=\"selectedConversationId\"\n [conversation]=\"selectedConversation\"\n [threadId]=\"selectedThreadId\"\n [isNewConversation]=\"isNewUnsavedConversation\"\n [pendingMessage]=\"pendingMessageToSend\"\n [pendingAttachments]=\"pendingAttachmentsToSend\"\n [pendingMessageConversationId]=\"pendingMessageConversationId\"\n [pendingArtifactId]=\"pendingArtifactId\"\n [pendingArtifactConversationId]=\"pendingArtifactConversationId\"\n [pendingArtifactVersionNumber]=\"pendingArtifactVersionNumber\"\n (conversationRenamed)=\"onConversationRenamed($event)\"\n (openEntityRecord)=\"onOpenEntityRecord($event)\"\n (navigationRequest)=\"onNavigationRequest($event)\"\n (taskClicked)=\"onTaskClicked($event)\"\n (artifactLinkClicked)=\"onArtifactLinkNavigation($event)\"\n (conversationCreated)=\"onConversationCreated($event)\"\n (realtimeConversationReady)=\"onRealtimeConversationReady($event)\"\n (threadOpened)=\"onThreadOpened($event)\"\n (threadClosed)=\"onThreadClosed()\"\n (pendingArtifactConsumed)=\"pendingArtifactId = null; pendingArtifactConversationId = null; pendingArtifactVersionNumber = null\"\n (pendingMessageConsumed)=\"pendingMessageToSend = null; pendingAttachmentsToSend = null; pendingMessageConversationId = null\"\n (pendingMessageRequested)=\"onPendingMessageRequested($event)\">\n </mj-conversation-chat-area>\n </div>\n }\n\n <!-- Right Artifact Panel -->\n @if (isArtifactPanelOpen && activeArtifactId) {\n @if (!isArtifactPanelMaximized) {\n <div class=\"artifact-panel-resize-handle\" (mousedown)=\"onArtifactPanelResizeStart($event)\"></div>\n }\n <div class=\"workspace-artifact-panel\"\n [style.width.%]=\"artifactPanelWidth\"\n [class.maximized]=\"isArtifactPanelMaximized\">\n <mj-artifact-viewer-panel\n [artifactId]=\"activeArtifactId\"\n [currentUser]=\"currentUser\"\n [environmentId]=\"environmentId\"\n [versionNumber]=\"activeVersionNumber ?? undefined\"\n [showSaveToCollection]=\"activeTab !== 'collections'\"\n [viewContext]=\"activeTab === 'collections' ? 'collection' : 'conversation'\"\n [contextCollectionId]=\"collectionState.activeCollectionId ?? undefined\"\n [canShare]=\"canShareActiveArtifact\"\n [canEdit]=\"canEditActiveArtifact\"\n [isMaximized]=\"isArtifactPanelMaximized\"\n (closed)=\"closeArtifactPanel()\"\n (navigateToLink)=\"onArtifactLinkNavigation($event)\"\n (shareRequested)=\"onArtifactShareRequested($event)\"\n (maximizeToggled)=\"toggleMaximizeArtifactPanel()\"\n (applyFormRequested)=\"onApplyFormRequested($event)\">\n </mj-artifact-viewer-panel>\n </div>\n }\n </div>\n }\n\n <!-- Global Search Panel -->\n <mj-search-panel\n [isOpen]=\"isSearchPanelOpen\"\n [environmentId]=\"environmentId\"\n [currentUser]=\"currentUser\"\n (close)=\"closeSearch()\"\n (resultSelected)=\"handleSearchResult($event)\">\n </mj-search-panel>\n\n <!-- Toast Notifications -->\n <mj-toast></mj-toast>\n\n <!-- Artifact Share Modal -->\n <mj-artifact-share-modal\n [isOpen]=\"isArtifactShareModalOpen\"\n [artifact]=\"artifactToShare\"\n [currentUser]=\"currentUser\"\n (saved)=\"onArtifactShared()\"\n (cancelled)=\"onArtifactShareModalClose()\">\n </mj-artifact-share-modal>\n</div>", styles: [".conversation-workspace {\n display: flex;\n flex-direction: column;\n height: 100%; /* Fill parent container - works in any context (tabs, embedded, etc.) */\n min-height: 0; /* Allow flex shrinking in nested flex containers */\n background-color: var(--mj-bg-surface-sunken);\n position: relative;\n}\n\n.workspace-navigation {\n flex-shrink: 0;\n height: 48px;\n background-color: var(--mj-text-primary);\n border-bottom: 1px solid color-mix(in srgb, var(--mj-text-inverse) 10%, transparent);\n}\n\n.workspace-content {\n flex: 1;\n display: flex;\n overflow: hidden;\n min-height: 0;\n position: relative;\n}\n\n.workspace-sidebar {\n flex-shrink: 0;\n background-color: var(--mj-text-primary);\n border-right: 1px solid var(--mj-border-default);\n overflow-y: auto;\n transition: width 0.3s ease;\n}\n\n/* Disable transitions during initial load to prevent jarring animation */\n.workspace-sidebar.no-transition {\n transition: none !important;\n}\n\n.workspace-sidebar.collapsed {\n width: 0 !important;\n min-width: 0;\n border-right: none;\n overflow: hidden;\n}\n\n/* Floating toggle button (only visible when sidebar is collapsed) */\n.sidebar-floating-toggle {\n position: absolute;\n top: 12px;\n left: 12px;\n z-index: 100;\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--mj-text-primary);\n border: 1px solid color-mix(in srgb, var(--mj-text-inverse) 20%, transparent);\n border-radius: 8px;\n cursor: pointer;\n box-shadow: 0 2px 8px color-mix(in srgb, var(--mj-text-primary) 15%, transparent);\n transition: all 0.2s ease;\n}\n\n.sidebar-floating-toggle:hover {\n background: var(--mj-text-primary);\n border-color: color-mix(in srgb, var(--mj-text-inverse) 30%, transparent);\n box-shadow: 0 4px 12px color-mix(in srgb, var(--mj-text-primary) 20%, transparent);\n transform: scale(1.05);\n}\n\n.sidebar-floating-toggle:active {\n transform: scale(0.98);\n}\n\n.sidebar-floating-toggle i {\n color: color-mix(in srgb, var(--mj-text-inverse) 85%, transparent);\n font-size: 16px;\n transition: color 0.15s ease;\n}\n\n.sidebar-floating-toggle:hover i {\n color: var(--mj-text-inverse);\n}\n\n.sidebar-resize-handle {\n width: 4px;\n background: transparent;\n cursor: ew-resize;\n flex-shrink: 0;\n position: relative;\n transition: background-color 0.2s;\n}\n\n.sidebar-resize-handle:hover {\n background: var(--mj-brand-primary-hover);\n}\n\n.sidebar-resize-handle:active {\n background: var(--mj-brand-primary-hover);\n}\n\n.sidebar-resize-handle::before {\n content: '';\n position: absolute;\n left: -4px;\n right: -4px;\n top: 0;\n bottom: 0;\n cursor: ew-resize;\n}\n\n.workspace-main {\n flex: 1;\n display: flex;\n flex-direction: column;\n background-color: var(--mj-bg-surface-card);\n overflow: hidden;\n min-height: 0;\n}\n\n.workspace-main > mj-conversation-chat-area {\n display: flex;\n flex: 1;\n min-height: 0;\n}\n\n.workspace-artifact-panel {\n flex-shrink: 0;\n background-color: var(--mj-bg-surface-card);\n overflow: hidden;\n min-width: 300px;\n max-width: 70%;\n}\n\n.artifact-panel-resize-handle {\n width: 4px;\n background-color: transparent;\n cursor: ew-resize;\n flex-shrink: 0;\n transition: background-color 0.2s;\n position: relative;\n z-index: 10;\n}\n\n/* Wider hit area for easier grabbing */\n.artifact-panel-resize-handle::before {\n content: '';\n position: absolute;\n top: 0;\n bottom: 0;\n left: -4px;\n right: -4px;\n cursor: ew-resize;\n}\n\n.artifact-panel-resize-handle:hover {\n background-color: var(--mj-brand-primary-hover);\n}\n\n.artifact-panel-resize-handle:active {\n background-color: var(--mj-brand-primary-hover);\n}\n\n/* Maximized artifact panel */\n.workspace-artifact-panel.maximized {\n width: 100% !important;\n max-width: 100%;\n}\n\n/* Compact layout */\n.conversation-workspace[data-layout=\"compact\"] .workspace-sidebar {\n width: 240px;\n}\n\n.conversation-workspace[data-layout=\"compact\"] .workspace-artifact-panel {\n width: 400px;\n}\n\n/* Embedded layout */\n.conversation-workspace[data-layout=\"embedded\"] {\n height: 100%;\n}\n\n.conversation-workspace[data-layout=\"embedded\"] .workspace-navigation {\n height: 48px;\n}\n\n/* Responsive */\n@media (max-width: 1024px) {\n .workspace-sidebar {\n position: absolute;\n left: 0;\n top: 60px;\n bottom: 0;\n z-index: 100;\n box-shadow: 2px 0 8px color-mix(in srgb, var(--mj-text-primary) 10%, transparent);\n }\n\n .workspace-artifact-panel {\n position: fixed;\n right: 0;\n top: 60px;\n bottom: 0;\n z-index: 100;\n box-shadow: -2px 0 8px color-mix(in srgb, var(--mj-text-primary) 10%, transparent);\n }\n}\n\n/* Desktop sidebar toggle animation */\n@media (min-width: 769px) {\n .workspace-sidebar {\n transition: width 0.3s ease, min-width 0.3s ease;\n overflow: hidden;\n }\n\n .workspace-sidebar:not(.open) {\n width: 0 !important;\n min-width: 0;\n border-right: none;\n }\n\n .sidebar-resize-handle {\n transition: opacity 0.3s ease, width 0.3s ease;\n }\n\n .workspace-sidebar:not(.open) ~ .sidebar-resize-handle {\n opacity: 0;\n width: 0;\n pointer-events: none;\n }\n}\n\n/* Mobile adjustments: 481px - 768px */\n@media (max-width: 768px) {\n .workspace-sidebar {\n position: fixed;\n left: 0;\n top: 80px;\n z-index: 1000;\n width: 260px !important;\n height: calc(100vh - 80px);\n transform: translateX(-100%);\n transition: transform 0.3s ease;\n }\n\n .workspace-sidebar.open {\n transform: translateX(0);\n }\n\n .workspace-artifact-panel {\n position: fixed;\n width: 100%;\n left: 0;\n right: 0;\n top: 56px; /* 48px nav + 8px dark strip above blue border */\n bottom: 0;\n z-index: 1000;\n max-width: 100%;\n height: auto;\n }\n\n .sidebar-resize-handle,\n .artifact-panel-resize-handle,\n .sidebar-floating-toggle {\n display: none;\n }\n\n /* Mobile sidebar backdrop */\n .mobile-sidebar-backdrop {\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n background: var(--mj-bg-overlay);\n opacity: 0;\n pointer-events: none;\n transition: opacity 0.3s ease;\n z-index: 999;\n }\n\n .mobile-sidebar-backdrop.visible {\n opacity: 1;\n pointer-events: auto;\n }\n}\n\n/* Small Phone adjustments: <= 480px */\n@media (max-width: 480px) {\n .workspace-navigation {\n height: 48px;\n }\n\n .workspace-sidebar {\n width: 100%;\n }\n}\n\n/* Loading spinner (shown while initializing agents) */\n.workspace-loading {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n flex: 1;\n width: 100%;\n background: var(--mj-bg-surface-card);\n gap: 1rem;\n}\n\n.loading-spinner {\n font-size: 3rem;\n color: var(--mj-brand-primary);\n}\n\n.workspace-loading p {\n font-size: 1rem;\n color: var(--mj-text-secondary);\n margin: 0;\n}"] }]
|
|
1284
1279
|
}], () => [{ type: i1.ArtifactStateService }, { type: i2.CollectionStateService }, { type: i3.ArtifactPermissionService }, { type: i4.MJNotificationService }, { type: i5.ConversationStreamingService }, { type: i6.UICommandHandlerService }, { type: i0.ChangeDetectorRef }], { environmentId: [{
|
|
1285
1280
|
type: Input
|
|
1286
1281
|
}], initialConversationId: [{
|
|
@@ -1326,5 +1321,5 @@ export class ConversationWorkspaceComponent extends BaseAngularComponent {
|
|
|
1326
1321
|
type: HostListener,
|
|
1327
1322
|
args: ['document:click', ['$event']]
|
|
1328
1323
|
}] }); })();
|
|
1329
|
-
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ConversationWorkspaceComponent, { className: "ConversationWorkspaceComponent", filePath: "src/lib/components/workspace/conversation-workspace.component.ts", lineNumber:
|
|
1324
|
+
(() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(ConversationWorkspaceComponent, { className: "ConversationWorkspaceComponent", filePath: "src/lib/components/workspace/conversation-workspace.component.ts", lineNumber: 68 }); })();
|
|
1330
1325
|
//# sourceMappingURL=conversation-workspace.component.js.map
|