@memberjunction/ng-tasks 6.2.0-edge.0 → 6.2.0-edge.2
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/.turbo/turbo-build.log +1 -1
- package/CHANGELOG.md +99 -0
- package/dist/lib/components/gantt-task-viewer.component.d.ts +61 -7
- package/dist/lib/components/gantt-task-viewer.component.d.ts.map +1 -1
- package/dist/lib/components/gantt-task-viewer.component.js +127 -37
- package/dist/lib/components/gantt-task-viewer.component.js.map +1 -1
- package/dist/lib/components/simple-task-viewer.component.d.ts +55 -5
- package/dist/lib/components/simple-task-viewer.component.d.ts.map +1 -1
- package/dist/lib/components/simple-task-viewer.component.js +98 -18
- package/dist/lib/components/simple-task-viewer.component.js.map +1 -1
- package/dist/lib/components/task-detail-panel.component.d.ts +36 -3
- package/dist/lib/components/task-detail-panel.component.d.ts.map +1 -1
- package/dist/lib/components/task-detail-panel.component.js +66 -16
- package/dist/lib/components/task-detail-panel.component.js.map +1 -1
- package/dist/lib/components/task.component.d.ts +82 -10
- package/dist/lib/components/task.component.d.ts.map +1 -1
- package/dist/lib/components/task.component.js +150 -18
- package/dist/lib/components/task.component.js.map +1 -1
- package/package.json +8 -8
- package/src/lib/components/gantt-task-viewer.component.ts +125 -33
- package/src/lib/components/simple-task-viewer.component.ts +100 -16
- package/src/lib/components/task-detail-panel.component.ts +65 -14
- package/src/lib/components/task.component.ts +140 -17
|
@@ -117,11 +117,43 @@ function TaskDetailPanelComponent_Conditional_19_Template(rf, ctx) { if (rf & 1)
|
|
|
117
117
|
* Reusable across list and Gantt views
|
|
118
118
|
*/
|
|
119
119
|
export class TaskDetailPanelComponent {
|
|
120
|
-
|
|
120
|
+
Task;
|
|
121
|
+
/** @deprecated Use {@link Task}. */
|
|
122
|
+
set task(value) {
|
|
123
|
+
this.Task = value;
|
|
124
|
+
}
|
|
125
|
+
/** @deprecated Use {@link Task}. */
|
|
126
|
+
get task() {
|
|
127
|
+
return this.Task;
|
|
128
|
+
}
|
|
121
129
|
agentRunId = null;
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
130
|
+
ClosePanel = new EventEmitter();
|
|
131
|
+
/**
|
|
132
|
+
* @deprecated Use {@link ClosePanel}.
|
|
133
|
+
*
|
|
134
|
+
* The same emitter under the old binding name, so a template still binding
|
|
135
|
+
* (closePanel) keeps working. Must stay AFTER ClosePanel: class fields
|
|
136
|
+
* initialise in order, and the other way round this captures undefined.
|
|
137
|
+
*/
|
|
138
|
+
closePanel = this.ClosePanel;
|
|
139
|
+
OpenEntityRecord = new EventEmitter();
|
|
140
|
+
/**
|
|
141
|
+
* @deprecated Use {@link OpenEntityRecord}.
|
|
142
|
+
*
|
|
143
|
+
* The same emitter under the old binding name, so a template still binding
|
|
144
|
+
* (openEntityRecord) keeps working. Must stay AFTER OpenEntityRecord: class fields
|
|
145
|
+
* initialise in order, and the other way round this captures undefined.
|
|
146
|
+
*/
|
|
147
|
+
openEntityRecord = this.OpenEntityRecord;
|
|
148
|
+
Agent = null;
|
|
149
|
+
/** @deprecated Use {@link Agent}. */
|
|
150
|
+
get agent() {
|
|
151
|
+
return this.Agent;
|
|
152
|
+
}
|
|
153
|
+
/** @deprecated Use {@link Agent}. */
|
|
154
|
+
set agent(value) {
|
|
155
|
+
this.Agent = value;
|
|
156
|
+
}
|
|
125
157
|
ngOnInit() {
|
|
126
158
|
this.loadAgentInfo();
|
|
127
159
|
}
|
|
@@ -129,16 +161,16 @@ export class TaskDetailPanelComponent {
|
|
|
129
161
|
this.loadAgentInfo();
|
|
130
162
|
}
|
|
131
163
|
async loadAgentInfo() {
|
|
132
|
-
if (!this.
|
|
133
|
-
this.
|
|
164
|
+
if (!this.Task?.AgentID) {
|
|
165
|
+
this.Agent = null;
|
|
134
166
|
return;
|
|
135
167
|
}
|
|
136
168
|
// AIEngineBase is deferred at startup; ensure loaded before reading .Agents.
|
|
137
169
|
await AIEngineBase.Instance.EnsureLoaded();
|
|
138
170
|
const agents = AIEngineBase.Instance.Agents;
|
|
139
|
-
this.
|
|
171
|
+
this.Agent = agents.find((a) => UUIDsEqual(a.ID, this.Task.AgentID)) || null;
|
|
140
172
|
}
|
|
141
|
-
|
|
173
|
+
FormatDateTime(date) {
|
|
142
174
|
if (!date)
|
|
143
175
|
return '';
|
|
144
176
|
const d = new Date(date);
|
|
@@ -150,24 +182,36 @@ export class TaskDetailPanelComponent {
|
|
|
150
182
|
minute: '2-digit'
|
|
151
183
|
});
|
|
152
184
|
}
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
185
|
+
/** @deprecated Use {@link FormatDateTime}. */
|
|
186
|
+
formatDateTime(date) {
|
|
187
|
+
return this.FormatDateTime(date);
|
|
188
|
+
}
|
|
189
|
+
OpenAgent() {
|
|
190
|
+
if (this.Task.AgentID) {
|
|
191
|
+
this.OpenEntityRecord.emit({
|
|
156
192
|
entityName: 'MJ: AI Agents',
|
|
157
|
-
recordId: this.
|
|
193
|
+
recordId: this.Task.AgentID
|
|
158
194
|
});
|
|
159
195
|
}
|
|
160
196
|
}
|
|
161
|
-
|
|
197
|
+
/** @deprecated Use {@link OpenAgent}. */
|
|
198
|
+
openAgent() {
|
|
199
|
+
return this.OpenAgent();
|
|
200
|
+
}
|
|
201
|
+
OpenAgentRun() {
|
|
162
202
|
if (this.agentRunId) {
|
|
163
|
-
this.
|
|
203
|
+
this.OpenEntityRecord.emit({
|
|
164
204
|
entityName: 'MJ: AI Agent Runs',
|
|
165
205
|
recordId: this.agentRunId
|
|
166
206
|
});
|
|
167
207
|
}
|
|
168
208
|
}
|
|
209
|
+
/** @deprecated Use {@link OpenAgentRun}. */
|
|
210
|
+
openAgentRun() {
|
|
211
|
+
return this.OpenAgentRun();
|
|
212
|
+
}
|
|
169
213
|
static ɵfac = function TaskDetailPanelComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || TaskDetailPanelComponent)(); };
|
|
170
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: TaskDetailPanelComponent, selectors: [["mj-task-detail-panel"]], inputs: { task: "task", agentRunId: "agentRunId" }, outputs: { closePanel: "closePanel", openEntityRecord: "openEntityRecord" }, features: [i0.ɵɵNgOnChangesFeature], decls: 20, vars: 10, consts: [[1, "task-detail-panel"], [1, "detail-header"], [1, "close-detail-btn", 3, "click"], [1, "fas", "fa-times"], [1, "detail-content"], [1, "detail-field"], [1, "detail-progress"], [1, "progress-bar-detail"], [1, "progress-fill-detail"], [1, "agent-info", 3, "click"], [1, "agent-icon"], [1, "agent-name"], [1, "fas", "fa-external-link-alt", "link-icon"], [1, "agent-run-link", 3, "click"]], template: function TaskDetailPanelComponent_Template(rf, ctx) { if (rf & 1) {
|
|
214
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: TaskDetailPanelComponent, selectors: [["mj-task-detail-panel"]], inputs: { Task: "Task", task: "task", agentRunId: "agentRunId" }, outputs: { ClosePanel: "ClosePanel", closePanel: "closePanel", OpenEntityRecord: "OpenEntityRecord", openEntityRecord: "openEntityRecord" }, features: [i0.ɵɵNgOnChangesFeature], decls: 20, vars: 10, consts: [[1, "task-detail-panel"], [1, "detail-header"], [1, "close-detail-btn", 3, "click"], [1, "fas", "fa-times"], [1, "detail-content"], [1, "detail-field"], [1, "detail-progress"], [1, "progress-bar-detail"], [1, "progress-fill-detail"], [1, "agent-info", 3, "click"], [1, "agent-icon"], [1, "agent-name"], [1, "fas", "fa-external-link-alt", "link-icon"], [1, "agent-run-link", 3, "click"]], template: function TaskDetailPanelComponent_Template(rf, ctx) { if (rf & 1) {
|
|
171
215
|
i0.ɵɵdomElementStart(0, "div", 0)(1, "div", 1)(2, "h3");
|
|
172
216
|
i0.ɵɵtext(3);
|
|
173
217
|
i0.ɵɵdomElementEnd();
|
|
@@ -303,12 +347,18 @@ export class TaskDetailPanelComponent {
|
|
|
303
347
|
</div>
|
|
304
348
|
</div>
|
|
305
349
|
`, styles: ["\n .task-detail-panel {\n width: 100%;\n height: calc(100% - 45px);\n background: var(--mj-bg-surface);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n\n .detail-header {\n padding: 20px;\n border-bottom: 1px solid var(--mj-border-default);\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n background: var(--mj-bg-surface-sunken);\n flex-shrink: 0;\n }\n\n .detail-header h3 {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-primary);\n flex: 1;\n padding-right: 12px;\n }\n\n .close-detail-btn {\n background: none;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n padding: 4px;\n width: 28px;\n height: 28px;\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n }\n\n .close-detail-btn:hover {\n background: var(--mj-border-default);\n color: var(--mj-text-primary);\n }\n\n .detail-content {\n padding: 20px;\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n }\n\n .detail-field {\n margin-bottom: 20px;\n }\n\n .detail-field:last-child {\n margin-bottom: 0;\n }\n\n .detail-field label {\n display: block;\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 6px;\n }\n\n .detail-field p {\n margin: 0;\n font-size: 14px;\n color: var(--mj-text-primary);\n line-height: 1.5;\n }\n\n .detail-progress {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .progress-bar-detail {\n flex: 1;\n height: 8px;\n background: var(--mj-border-default);\n border-radius: 4px;\n overflow: hidden;\n }\n\n .progress-fill-detail {\n height: calc(100% - 69px);\n background: var(--mj-brand-primary);\n transition: width 0.3s ease;\n }\n\n .detail-progress span {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-muted);\n min-width: 40px;\n }\n\n .agent-info {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 12px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.15s;\n }\n\n .agent-info:hover {\n background: var(--mj-border-default);\n }\n\n .agent-icon {\n font-size: 18px;\n color: var(--mj-brand-primary);\n }\n\n .agent-name {\n flex: 1;\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n }\n\n .link-icon {\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n .agent-run-link {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 12px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.15s;\n }\n\n .agent-run-link:hover {\n background: var(--mj-border-default);\n }\n\n .agent-run-link span {\n flex: 1;\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n }\n "] }]
|
|
306
|
-
}], null, {
|
|
350
|
+
}], null, { Task: [{
|
|
351
|
+
type: Input
|
|
352
|
+
}], task: [{
|
|
307
353
|
type: Input
|
|
308
354
|
}], agentRunId: [{
|
|
309
355
|
type: Input
|
|
356
|
+
}], ClosePanel: [{
|
|
357
|
+
type: Output
|
|
310
358
|
}], closePanel: [{
|
|
311
359
|
type: Output
|
|
360
|
+
}], OpenEntityRecord: [{
|
|
361
|
+
type: Output
|
|
312
362
|
}], openEntityRecord: [{
|
|
313
363
|
type: Output
|
|
314
364
|
}] }); })();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task-detail-panel.component.js","sourceRoot":"","sources":["../../../src/lib/components/task-detail-panel.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAqB,MAAM,eAAe,CAAC;AAG1F,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAE9D,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;;;IAsBxC,AADF,iCAA0B,YACjB;IAAA,2BAAW;IAAA,oBAAQ;IAC1B,4BAAG;IAAA,YAAsB;IAC3B,AAD2B,oBAAI,EACzB;;;IADD,eAAsB;IAAtB,6CAAsB;;;IAWzB,AADF,iCAA0B,YACjB;IAAA,wBAAQ;IAAA,oBAAQ;IAErB,AADF,iCAA6B,aACM;IAC/B,4BAA+E;IACjF,oBAAM;IACN,+BAAM;IAAA,YAA2B;IAErC,AADE,AADmC,oBAAO,EACpC,EACF;;;IAJkC,eAAsC;IAAtC,yDAAsC;IAEpE,eAA2B;IAA3B,2DAA2B;;;IAOnC,AADF,iCAA0B,YACjB;IAAA,uBAAO;IAAA,oBAAQ;IACtB,4BAAG;IAAA,YAAoC;IACzC,AADyC,oBAAI,EACvC;;;IADD,eAAoC;IAApC,kEAAoC;;;IAMvC,AADF,iCAA0B,YACjB;IAAA,mBAAG;IAAA,oBAAQ;IAClB,4BAAG;IAAA,YAAgC;IACrC,AADqC,oBAAI,EACnC;;;IADD,eAAgC;IAAhC,8DAAgC;;;IAMnC,AADF,iCAA0B,YACjB;IAAA,yBAAS;IAAA,oBAAQ;IACxB,4BAAG;IAAA,YAAsC;IAC3C,AAD2C,oBAAI,EACzC;;;IADD,eAAsC;IAAtC,oEAAsC;;;IAMzC,AADF,iCAA0B,YACjB;IAAA,6BAAa;IAAA,oBAAQ;IAC5B,4BAAG;IAAA,YAAe;IACpB,AADoB,oBAAI,EAClB;;;IADD,eAAe;IAAf,sCAAe;;;;IAOlB,AADF,iCAA0B,YACjB;IAAA,qBAAK;IAAA,oBAAQ;IACpB,iCAA8C;IAAtB,6LAAS,kBAAW,KAAC;IAC3C,2BAA0D;IAC1D,mCAAyB;IAAA,YAAgB;IAAA,oBAAO;IAChD,2BAAkD;IAEtD,AADE,oBAAM,EACF;;;IAJC,eAA+B;IAA/B,kCAA+B;IACT,eAAgB;IAAhB,uCAAgB;;;;IAS3C,AADF,iCAA0B,YACjB;IAAA,yBAAS;IAAA,oBAAQ;IACxB,kCAAqD;IAAzB,6LAAS,qBAAc,KAAC;IAClD,+BAAM;IAAA,gCAAgB;IAAA,oBAAO;IAC7B,2BAAkD;IAEtD,AADE,oBAAM,EACF;;AA1FhB;;;GAGG;AA+PH,MAAM,OAAO,wBAAwB;IAC1B,IAAI,CAAgB;IACpB,UAAU,GAAkB,IAAI,CAAC;IAChC,UAAU,GAAG,IAAI,YAAY,EAAQ,CAAC;IACtC,gBAAgB,GAAG,IAAI,YAAY,EAA4C,CAAC;IAEnF,KAAK,GAAmC,IAAI,CAAC;IAEpD,QAAQ;QACN,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAED,WAAW;QACT,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAEO,KAAK,CAAC,aAAa;QACzB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC;YACxB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;YAClB,OAAO;QACT,CAAC;QAED,6EAA6E;QAC7E,MAAM,YAAY,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC5C,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAA0B,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,IAAI,CAAC;IACxG,CAAC;IAEM,cAAc,CAAC,IAAiB;QACrC,IAAI,CAAC,IAAI;YAAE,OAAO,EAAE,CAAC;QACrB,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC;QACzB,OAAO,CAAC,CAAC,kBAAkB,CAAC,OAAO,EAAE;YACnC,KAAK,EAAE,OAAO;YACd,GAAG,EAAE,SAAS;YACd,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,SAAS;SAClB,CAAC,CAAC;IACL,CAAC;IAEM,SAAS;QACd,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACtB,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;gBACzB,UAAU,EAAE,eAAe;gBAC3B,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO;aAC5B,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAEM,YAAY;QACjB,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;gBACzB,UAAU,EAAE,mBAAmB;gBAC/B,QAAQ,EAAE,IAAI,CAAC,UAAU;aAC1B,CAAC,CAAC;QACL,CAAC;IACH,CAAC;kHAxDU,wBAAwB;6DAAxB,wBAAwB;YAvP7B,AADF,AADF,iCAA+B,aACF,SACrB;YAAA,YAAe;YAAA,oBAAK;YACxB,oCAA6D;YAA5B,wGAAS,qBAAiB,IAAC;YAC1D,0BAA4B;YAEhC,AADE,oBAAS,EACL;YAEN,iCAA4B;YAC1B,0FAAwB;YAQtB,AADF,iCAA0B,YACjB;YAAA,uBAAM;YAAA,oBAAQ;YACrB,6BAAG;YAAA,aAAiB;YACtB,AADsB,oBAAI,EACpB;YAEN,4FAAoC;YAYpC,4FAAsB;YAOtB,4FAAkB;YAOlB,4FAAwB;YAOxB,4FAAiB;YAQjB,4FAAa;YAYb,4FAAkB;YAUtB,AADE,oBAAM,EACF;;YAlFE,eAAe;YAAf,mCAAe;YAOnB,eAKC;YALD,+CAKC;YAII,eAAiB;YAAjB,qCAAiB;YAGtB,cAUC;YAVD,4DAUC;YAED,cAKC;YALD,8CAKC;YAED,cAKC;YALD,0CAKC;YAED,cAKC;YALD,gDAKC;YAED,cAKC;YALD,yCAKC;YAGD,cASC;YATD,qCASC;YAGD,cAQC;YARD,0CAQC;;;iFAuKI,wBAAwB;cA9PpC,SAAS;2BACE,sBAAsB,cACpB,IAAI,WACP,EAAE,YACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAsFP;;kBAqKF,KAAK;;kBACL,KAAK;;kBACL,MAAM;;kBACN,MAAM;;kFAJI,wBAAwB","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit, OnChanges } from '@angular/core';\n\nimport { MJTaskEntity } from '@memberjunction/core-entities';\nimport { AIEngineBase } from '@memberjunction/ai-engine-base';\nimport { MJAIAgentEntityExtended } from '@memberjunction/ai-core-plus';\nimport { UUIDsEqual } from '@memberjunction/global';\n\n/**\n * Task detail panel showing task information, agent details, and agent run\n * Reusable across list and Gantt views\n */\n@Component({\n selector: 'mj-task-detail-panel',\n standalone: true,\n imports: [],\n template: `\n <div class=\"task-detail-panel\">\n <div class=\"detail-header\">\n <h3>{{ task.Name }}</h3>\n <button class=\"close-detail-btn\" (click)=\"closePanel.emit()\">\n <i class=\"fas fa-times\"></i>\n </button>\n </div>\n \n <div class=\"detail-content\">\n @if (task.Description) {\n <div class=\"detail-field\">\n <label>Description</label>\n <p>{{ task.Description }}</p>\n </div>\n }\n \n <div class=\"detail-field\">\n <label>Status</label>\n <p>{{ task.Status }}</p>\n </div>\n \n @if (task.PercentComplete != null) {\n <div class=\"detail-field\">\n <label>Progress</label>\n <div class=\"detail-progress\">\n <div class=\"progress-bar-detail\">\n <div class=\"progress-fill-detail\" [style.width.%]=\"task.PercentComplete\"></div>\n </div>\n <span>{{ task.PercentComplete }}%</span>\n </div>\n </div>\n }\n \n @if (task.StartedAt) {\n <div class=\"detail-field\">\n <label>Started</label>\n <p>{{ formatDateTime(task.StartedAt) }}</p>\n </div>\n }\n \n @if (task.DueAt) {\n <div class=\"detail-field\">\n <label>Due</label>\n <p>{{ formatDateTime(task.DueAt) }}</p>\n </div>\n }\n \n @if (task.CompletedAt) {\n <div class=\"detail-field\">\n <label>Completed</label>\n <p>{{ formatDateTime(task.CompletedAt) }}</p>\n </div>\n }\n \n @if (task.User) {\n <div class=\"detail-field\">\n <label>Assigned User</label>\n <p>{{ task.User }}</p>\n </div>\n }\n \n <!-- Agent Information -->\n @if (agent) {\n <div class=\"detail-field\">\n <label>Agent</label>\n <div class=\"agent-info\" (click)=\"openAgent()\">\n <i [class]=\"'fas fa-' + ('robot')\" class=\"agent-icon\"></i>\n <span class=\"agent-name\">{{ agent.Name }}</span>\n <i class=\"fas fa-external-link-alt link-icon\"></i>\n </div>\n </div>\n }\n \n <!-- Agent Run Information -->\n @if (agentRunId) {\n <div class=\"detail-field\">\n <label>Agent Run</label>\n <div class=\"agent-run-link\" (click)=\"openAgentRun()\">\n <span>View Run Details</span>\n <i class=\"fas fa-external-link-alt link-icon\"></i>\n </div>\n </div>\n }\n </div>\n </div>\n `,\n styles: [`\n .task-detail-panel {\n width: 100%;\n height: calc(100% - 45px);\n background: var(--mj-bg-surface);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n\n .detail-header {\n padding: 20px;\n border-bottom: 1px solid var(--mj-border-default);\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n background: var(--mj-bg-surface-sunken);\n flex-shrink: 0;\n }\n\n .detail-header h3 {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-primary);\n flex: 1;\n padding-right: 12px;\n }\n\n .close-detail-btn {\n background: none;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n padding: 4px;\n width: 28px;\n height: 28px;\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n }\n\n .close-detail-btn:hover {\n background: var(--mj-border-default);\n color: var(--mj-text-primary);\n }\n\n .detail-content {\n padding: 20px;\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n }\n\n .detail-field {\n margin-bottom: 20px;\n }\n\n .detail-field:last-child {\n margin-bottom: 0;\n }\n\n .detail-field label {\n display: block;\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 6px;\n }\n\n .detail-field p {\n margin: 0;\n font-size: 14px;\n color: var(--mj-text-primary);\n line-height: 1.5;\n }\n\n .detail-progress {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .progress-bar-detail {\n flex: 1;\n height: 8px;\n background: var(--mj-border-default);\n border-radius: 4px;\n overflow: hidden;\n }\n\n .progress-fill-detail {\n height: calc(100% - 69px);\n background: var(--mj-brand-primary);\n transition: width 0.3s ease;\n }\n\n .detail-progress span {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-muted);\n min-width: 40px;\n }\n\n .agent-info {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 12px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.15s;\n }\n\n .agent-info:hover {\n background: var(--mj-border-default);\n }\n\n .agent-icon {\n font-size: 18px;\n color: var(--mj-brand-primary);\n }\n\n .agent-name {\n flex: 1;\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n }\n\n .link-icon {\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n .agent-run-link {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 12px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.15s;\n }\n\n .agent-run-link:hover {\n background: var(--mj-border-default);\n }\n\n .agent-run-link span {\n flex: 1;\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n }\n `]\n})\nexport class TaskDetailPanelComponent implements OnInit, OnChanges {\n @Input() task!: MJTaskEntity;\n @Input() agentRunId: string | null = null;\n @Output() closePanel = new EventEmitter<void>();\n @Output() openEntityRecord = new EventEmitter<{ entityName: string; recordId: string }>();\n\n public agent: MJAIAgentEntityExtended | null = null;\n\n ngOnInit(): void {\n this.loadAgentInfo();\n }\n\n ngOnChanges(): void {\n this.loadAgentInfo();\n }\n\n private async loadAgentInfo(): Promise<void> {\n if (!this.task?.AgentID) {\n this.agent = null;\n return;\n }\n\n // AIEngineBase is deferred at startup; ensure loaded before reading .Agents.\n await AIEngineBase.Instance.EnsureLoaded();\n const agents = AIEngineBase.Instance.Agents;\n this.agent = agents.find((a: MJAIAgentEntityExtended) => UUIDsEqual(a.ID, this.task.AgentID)) || null;\n }\n\n public formatDateTime(date: Date | null): string {\n if (!date) return '';\n const d = new Date(date);\n return d.toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n hour: '2-digit',\n minute: '2-digit'\n });\n }\n\n public openAgent(): void {\n if (this.task.AgentID) {\n this.openEntityRecord.emit({\n entityName: 'MJ: AI Agents',\n recordId: this.task.AgentID\n });\n }\n }\n\n public openAgentRun(): void {\n if (this.agentRunId) {\n this.openEntityRecord.emit({\n entityName: 'MJ: AI Agent Runs',\n recordId: this.agentRunId\n });\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"task-detail-panel.component.js","sourceRoot":"","sources":["../../../src/lib/components/task-detail-panel.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAqB,MAAM,eAAe,CAAC;AAG1F,OAAO,EAAE,YAAY,EAAE,MAAM,gCAAgC,CAAC;AAE9D,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;;;IAsBxC,AADF,iCAA0B,YACjB;IAAA,2BAAW;IAAA,oBAAQ;IAC1B,4BAAG;IAAA,YAAsB;IAC3B,AAD2B,oBAAI,EACzB;;;IADD,eAAsB;IAAtB,6CAAsB;;;IAWzB,AADF,iCAA0B,YACjB;IAAA,wBAAQ;IAAA,oBAAQ;IAErB,AADF,iCAA6B,aACM;IAC/B,4BAA+E;IACjF,oBAAM;IACN,+BAAM;IAAA,YAA2B;IAErC,AADE,AADmC,oBAAO,EACpC,EACF;;;IAJkC,eAAsC;IAAtC,yDAAsC;IAEpE,eAA2B;IAA3B,2DAA2B;;;IAOnC,AADF,iCAA0B,YACjB;IAAA,uBAAO;IAAA,oBAAQ;IACtB,4BAAG;IAAA,YAAoC;IACzC,AADyC,oBAAI,EACvC;;;IADD,eAAoC;IAApC,kEAAoC;;;IAMvC,AADF,iCAA0B,YACjB;IAAA,mBAAG;IAAA,oBAAQ;IAClB,4BAAG;IAAA,YAAgC;IACrC,AADqC,oBAAI,EACnC;;;IADD,eAAgC;IAAhC,8DAAgC;;;IAMnC,AADF,iCAA0B,YACjB;IAAA,yBAAS;IAAA,oBAAQ;IACxB,4BAAG;IAAA,YAAsC;IAC3C,AAD2C,oBAAI,EACzC;;;IADD,eAAsC;IAAtC,oEAAsC;;;IAMzC,AADF,iCAA0B,YACjB;IAAA,6BAAa;IAAA,oBAAQ;IAC5B,4BAAG;IAAA,YAAe;IACpB,AADoB,oBAAI,EAClB;;;IADD,eAAe;IAAf,sCAAe;;;;IAOlB,AADF,iCAA0B,YACjB;IAAA,qBAAK;IAAA,oBAAQ;IACpB,iCAA8C;IAAtB,6LAAS,kBAAW,KAAC;IAC3C,2BAA0D;IAC1D,mCAAyB;IAAA,YAAgB;IAAA,oBAAO;IAChD,2BAAkD;IAEtD,AADE,oBAAM,EACF;;;IAJC,eAA+B;IAA/B,kCAA+B;IACT,eAAgB;IAAhB,uCAAgB;;;;IAS3C,AADF,iCAA0B,YACjB;IAAA,yBAAS;IAAA,oBAAQ;IACxB,kCAAqD;IAAzB,6LAAS,qBAAc,KAAC;IAClD,+BAAM;IAAA,gCAAgB;IAAA,oBAAO;IAC7B,2BAAkD;IAEtD,AADE,oBAAM,EACF;;AA1FhB;;;GAGG;AA+PH,MAAM,OAAO,wBAAwB;IAC1B,IAAI,CAAgB;IAE7B,oCAAoC;IACpC,IAAa,IAAI,CAAC,KAAmB;QACnC,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;IACpB,CAAC;IACD,oCAAoC;IACpC,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,IAAI,CAAC;IACnB,CAAC;IACQ,UAAU,GAAkB,IAAI,CAAC;IAChC,UAAU,GAAG,IAAI,YAAY,EAAQ,CAAC;IAEhD;;;;;;OAMG;IACO,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;IAC7B,gBAAgB,GAAG,IAAI,YAAY,EAA4C,CAAC;IAE1F;;;;;;OAMG;IACO,gBAAgB,GAAG,IAAI,CAAC,gBAAgB,CAAC;IAE5C,KAAK,GAAmC,IAAI,CAAC;IAEpD,qCAAqC;IACrC,IAAW,KAAK;QACd,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IACD,qCAAqC;IACrC,IAAW,KAAK,CAAC,KAAqC;QACpD,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,QAAQ;QACN,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAED,WAAW;QACT,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAEO,KAAK,CAAC,aAAa;QACzB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,CAAC;YACxB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;YAClB,OAAO;QACT,CAAC;QAED,6EAA6E;QAC7E,MAAM,YAAY,CAAC,QAAQ,CAAC,YAAY,EAAE,CAAC;QAC3C,MAAM,MAAM,GAAG,YAAY,CAAC,QAAQ,CAAC,MAAM,CAAC;QAC5C,IAAI,CAAC,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAA0B,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,IAAI,CAAC;IACxG,CAAC;IAEM,cAAc,CAAC,IAAiB;QACrC,IAAI,CAAC,IAAI;YAAE,OAAO,EAAE,CAAC;QACrB,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC;QACzB,OAAO,CAAC,CAAC,kBAAkB,CAAC,OAAO,EAAE;YACnC,KAAK,EAAE,OAAO;YACd,GAAG,EAAE,SAAS;YACd,IAAI,EAAE,SAAS;YACf,IAAI,EAAE,SAAS;YACf,MAAM,EAAE,SAAS;SAClB,CAAC,CAAC;IACL,CAAC;IAED,8CAA8C;IACvC,cAAc,CAAC,IAAiB;QACrC,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC;IACnC,CAAC;IAEM,SAAS;QACd,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;YACtB,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;gBACzB,UAAU,EAAE,eAAe;gBAC3B,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,OAAO;aAC5B,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,yCAAyC;IAClC,SAAS;QACd,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC;IAC1B,CAAC;IAEM,YAAY;QACjB,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC;gBACzB,UAAU,EAAE,mBAAmB;gBAC/B,QAAQ,EAAE,IAAI,CAAC,UAAU;aAC1B,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,4CAA4C;IACrC,YAAY;QACjB,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC;IAC7B,CAAC;kHA3GU,wBAAwB;6DAAxB,wBAAwB;YAvP7B,AADF,AADF,iCAA+B,aACF,SACrB;YAAA,YAAe;YAAA,oBAAK;YACxB,oCAA6D;YAA5B,wGAAS,qBAAiB,IAAC;YAC1D,0BAA4B;YAEhC,AADE,oBAAS,EACL;YAEN,iCAA4B;YAC1B,0FAAwB;YAQtB,AADF,iCAA0B,YACjB;YAAA,uBAAM;YAAA,oBAAQ;YACrB,6BAAG;YAAA,aAAiB;YACtB,AADsB,oBAAI,EACpB;YAEN,4FAAoC;YAYpC,4FAAsB;YAOtB,4FAAkB;YAOlB,4FAAwB;YAOxB,4FAAiB;YAQjB,4FAAa;YAYb,4FAAkB;YAUtB,AADE,oBAAM,EACF;;YAlFE,eAAe;YAAf,mCAAe;YAOnB,eAKC;YALD,+CAKC;YAII,eAAiB;YAAjB,qCAAiB;YAGtB,cAUC;YAVD,4DAUC;YAED,cAKC;YALD,8CAKC;YAED,cAKC;YALD,0CAKC;YAED,cAKC;YALD,gDAKC;YAED,cAKC;YALD,yCAKC;YAGD,cASC;YATD,qCASC;YAGD,cAQC;YARD,0CAQC;;;iFAuKI,wBAAwB;cA9PpC,SAAS;2BACE,sBAAsB,cACpB,IAAI,WACP,EAAE,YACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KAsFP;;kBAqKF,KAAK;;kBAGL,KAAK;;kBAOL,KAAK;;kBACL,MAAM;;kBASN,MAAM;;kBACN,MAAM;;kBASN,MAAM;;kFA/BI,wBAAwB","sourcesContent":["import { Component, Input, Output, EventEmitter, OnInit, OnChanges } from '@angular/core';\n\nimport { MJTaskEntity } from '@memberjunction/core-entities';\nimport { AIEngineBase } from '@memberjunction/ai-engine-base';\nimport { MJAIAgentEntityExtended } from '@memberjunction/ai-core-plus';\nimport { UUIDsEqual } from '@memberjunction/global';\n\n/**\n * Task detail panel showing task information, agent details, and agent run\n * Reusable across list and Gantt views\n */\n@Component({\n selector: 'mj-task-detail-panel',\n standalone: true,\n imports: [],\n template: `\n <div class=\"task-detail-panel\">\n <div class=\"detail-header\">\n <h3>{{ task.Name }}</h3>\n <button class=\"close-detail-btn\" (click)=\"closePanel.emit()\">\n <i class=\"fas fa-times\"></i>\n </button>\n </div>\n \n <div class=\"detail-content\">\n @if (task.Description) {\n <div class=\"detail-field\">\n <label>Description</label>\n <p>{{ task.Description }}</p>\n </div>\n }\n \n <div class=\"detail-field\">\n <label>Status</label>\n <p>{{ task.Status }}</p>\n </div>\n \n @if (task.PercentComplete != null) {\n <div class=\"detail-field\">\n <label>Progress</label>\n <div class=\"detail-progress\">\n <div class=\"progress-bar-detail\">\n <div class=\"progress-fill-detail\" [style.width.%]=\"task.PercentComplete\"></div>\n </div>\n <span>{{ task.PercentComplete }}%</span>\n </div>\n </div>\n }\n \n @if (task.StartedAt) {\n <div class=\"detail-field\">\n <label>Started</label>\n <p>{{ formatDateTime(task.StartedAt) }}</p>\n </div>\n }\n \n @if (task.DueAt) {\n <div class=\"detail-field\">\n <label>Due</label>\n <p>{{ formatDateTime(task.DueAt) }}</p>\n </div>\n }\n \n @if (task.CompletedAt) {\n <div class=\"detail-field\">\n <label>Completed</label>\n <p>{{ formatDateTime(task.CompletedAt) }}</p>\n </div>\n }\n \n @if (task.User) {\n <div class=\"detail-field\">\n <label>Assigned User</label>\n <p>{{ task.User }}</p>\n </div>\n }\n \n <!-- Agent Information -->\n @if (agent) {\n <div class=\"detail-field\">\n <label>Agent</label>\n <div class=\"agent-info\" (click)=\"openAgent()\">\n <i [class]=\"'fas fa-' + ('robot')\" class=\"agent-icon\"></i>\n <span class=\"agent-name\">{{ agent.Name }}</span>\n <i class=\"fas fa-external-link-alt link-icon\"></i>\n </div>\n </div>\n }\n \n <!-- Agent Run Information -->\n @if (agentRunId) {\n <div class=\"detail-field\">\n <label>Agent Run</label>\n <div class=\"agent-run-link\" (click)=\"openAgentRun()\">\n <span>View Run Details</span>\n <i class=\"fas fa-external-link-alt link-icon\"></i>\n </div>\n </div>\n }\n </div>\n </div>\n `,\n styles: [`\n .task-detail-panel {\n width: 100%;\n height: calc(100% - 45px);\n background: var(--mj-bg-surface);\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n\n .detail-header {\n padding: 20px;\n border-bottom: 1px solid var(--mj-border-default);\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n background: var(--mj-bg-surface-sunken);\n flex-shrink: 0;\n }\n\n .detail-header h3 {\n margin: 0;\n font-size: 18px;\n font-weight: 600;\n color: var(--mj-text-primary);\n flex: 1;\n padding-right: 12px;\n }\n\n .close-detail-btn {\n background: none;\n border: none;\n color: var(--mj-text-muted);\n cursor: pointer;\n padding: 4px;\n width: 28px;\n height: 28px;\n border-radius: 4px;\n display: flex;\n align-items: center;\n justify-content: center;\n flex-shrink: 0;\n }\n\n .close-detail-btn:hover {\n background: var(--mj-border-default);\n color: var(--mj-text-primary);\n }\n\n .detail-content {\n padding: 20px;\n flex: 1;\n min-height: 0;\n overflow-y: auto;\n }\n\n .detail-field {\n margin-bottom: 20px;\n }\n\n .detail-field:last-child {\n margin-bottom: 0;\n }\n\n .detail-field label {\n display: block;\n font-size: 12px;\n font-weight: 600;\n color: var(--mj-text-muted);\n text-transform: uppercase;\n letter-spacing: 0.5px;\n margin-bottom: 6px;\n }\n\n .detail-field p {\n margin: 0;\n font-size: 14px;\n color: var(--mj-text-primary);\n line-height: 1.5;\n }\n\n .detail-progress {\n display: flex;\n align-items: center;\n gap: 12px;\n }\n\n .progress-bar-detail {\n flex: 1;\n height: 8px;\n background: var(--mj-border-default);\n border-radius: 4px;\n overflow: hidden;\n }\n\n .progress-fill-detail {\n height: calc(100% - 69px);\n background: var(--mj-brand-primary);\n transition: width 0.3s ease;\n }\n\n .detail-progress span {\n font-size: 13px;\n font-weight: 600;\n color: var(--mj-text-muted);\n min-width: 40px;\n }\n\n .agent-info {\n display: flex;\n align-items: center;\n gap: 10px;\n padding: 10px 12px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.15s;\n }\n\n .agent-info:hover {\n background: var(--mj-border-default);\n }\n\n .agent-icon {\n font-size: 18px;\n color: var(--mj-brand-primary);\n }\n\n .agent-name {\n flex: 1;\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n }\n\n .link-icon {\n font-size: 12px;\n color: var(--mj-text-muted);\n }\n\n .agent-run-link {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 10px 12px;\n background: var(--mj-bg-surface-sunken);\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.15s;\n }\n\n .agent-run-link:hover {\n background: var(--mj-border-default);\n }\n\n .agent-run-link span {\n flex: 1;\n font-size: 14px;\n font-weight: 500;\n color: var(--mj-text-primary);\n }\n `]\n})\nexport class TaskDetailPanelComponent implements OnInit, OnChanges {\n @Input() Task!: MJTaskEntity;\n\n /** @deprecated Use {@link Task}. */\n @Input() set task(value: MJTaskEntity) {\n this.Task = value;\n }\n /** @deprecated Use {@link Task}. */\n get task(): MJTaskEntity {\n return this.Task;\n }\n @Input() agentRunId: string | null = null;\n @Output() ClosePanel = new EventEmitter<void>();\n\n /**\n * @deprecated Use {@link ClosePanel}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (closePanel) keeps working. Must stay AFTER ClosePanel: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() closePanel = this.ClosePanel;\n @Output() OpenEntityRecord = new EventEmitter<{ entityName: string; recordId: string }>();\n\n /**\n * @deprecated Use {@link OpenEntityRecord}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (openEntityRecord) keeps working. Must stay AFTER OpenEntityRecord: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() openEntityRecord = this.OpenEntityRecord;\n\n public Agent: MJAIAgentEntityExtended | null = null;\n\n /** @deprecated Use {@link Agent}. */\n public get agent(): MJAIAgentEntityExtended | null {\n return this.Agent;\n }\n /** @deprecated Use {@link Agent}. */\n public set agent(value: MJAIAgentEntityExtended | null) {\n this.Agent = value;\n }\n\n ngOnInit(): void {\n this.loadAgentInfo();\n }\n\n ngOnChanges(): void {\n this.loadAgentInfo();\n }\n\n private async loadAgentInfo(): Promise<void> {\n if (!this.Task?.AgentID) {\n this.Agent = null;\n return;\n }\n\n // AIEngineBase is deferred at startup; ensure loaded before reading .Agents.\n await AIEngineBase.Instance.EnsureLoaded();\n const agents = AIEngineBase.Instance.Agents;\n this.Agent = agents.find((a: MJAIAgentEntityExtended) => UUIDsEqual(a.ID, this.Task.AgentID)) || null;\n }\n\n public FormatDateTime(date: Date | null): string {\n if (!date) return '';\n const d = new Date(date);\n return d.toLocaleDateString('en-US', {\n month: 'short',\n day: 'numeric',\n year: 'numeric',\n hour: '2-digit',\n minute: '2-digit'\n });\n }\n\n /** @deprecated Use {@link FormatDateTime}. */\n public formatDateTime(date: Date | null): string {\n return this.FormatDateTime(date);\n }\n\n public OpenAgent(): void {\n if (this.Task.AgentID) {\n this.OpenEntityRecord.emit({\n entityName: 'MJ: AI Agents',\n recordId: this.Task.AgentID\n });\n }\n }\n\n /** @deprecated Use {@link OpenAgent}. */\n public openAgent(): void {\n return this.OpenAgent();\n }\n\n public OpenAgentRun(): void {\n if (this.agentRunId) {\n this.OpenEntityRecord.emit({\n entityName: 'MJ: AI Agent Runs',\n recordId: this.agentRunId\n });\n }\n }\n\n /** @deprecated Use {@link OpenAgentRun}. */\n public openAgentRun(): void {\n return this.OpenAgentRun();\n }\n}\n"]}
|
|
@@ -7,28 +7,100 @@ import * as i0 from "@angular/core";
|
|
|
7
7
|
* Allows switching between list and Gantt chart views
|
|
8
8
|
*/
|
|
9
9
|
export declare class TaskComponent {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
10
|
+
Tasks: MJTaskEntity[];
|
|
11
|
+
/** @deprecated Use {@link Tasks}. */
|
|
12
|
+
set tasks(value: MJTaskEntity[]);
|
|
13
|
+
/** @deprecated Use {@link Tasks}. */
|
|
14
|
+
get tasks(): MJTaskEntity[];
|
|
15
|
+
GanttTasks?: MJTaskEntity[];
|
|
16
|
+
/** @deprecated Use {@link GanttTasks}. */
|
|
17
|
+
set ganttTasks(value: MJTaskEntity[] | undefined);
|
|
18
|
+
/** @deprecated Use {@link GanttTasks}. */
|
|
19
|
+
get ganttTasks(): MJTaskEntity[] | undefined;
|
|
20
|
+
TaskDependencies?: MJTaskDependencyEntity[];
|
|
21
|
+
/** @deprecated Use {@link TaskDependencies}. */
|
|
22
|
+
set taskDependencies(value: MJTaskDependencyEntity[] | undefined);
|
|
23
|
+
/** @deprecated Use {@link TaskDependencies}. */
|
|
24
|
+
get taskDependencies(): MJTaskDependencyEntity[] | undefined;
|
|
25
|
+
AgentRunMap?: Map<string, string>;
|
|
26
|
+
/** @deprecated Use {@link AgentRunMap}. */
|
|
27
|
+
set agentRunMap(value: Map<string, string> | undefined);
|
|
28
|
+
/** @deprecated Use {@link AgentRunMap}. */
|
|
29
|
+
get agentRunMap(): Map<string, string> | undefined;
|
|
30
|
+
Title?: string;
|
|
31
|
+
/** @deprecated Use {@link Title}. */
|
|
32
|
+
set title(value: string | undefined);
|
|
33
|
+
/** @deprecated Use {@link Title}. */
|
|
34
|
+
get title(): string | undefined;
|
|
35
|
+
Description?: string;
|
|
36
|
+
/** @deprecated Use {@link Description}. */
|
|
37
|
+
set description(value: string | undefined);
|
|
38
|
+
/** @deprecated Use {@link Description}. */
|
|
39
|
+
get description(): string | undefined;
|
|
40
|
+
ShowHeader: boolean;
|
|
41
|
+
/** @deprecated Use {@link ShowHeader}. */
|
|
42
|
+
set showHeader(value: boolean);
|
|
43
|
+
/** @deprecated Use {@link ShowHeader}. */
|
|
44
|
+
get showHeader(): boolean;
|
|
45
|
+
ShowViewToggle: boolean;
|
|
46
|
+
/** @deprecated Use {@link ShowViewToggle}. */
|
|
47
|
+
set showViewToggle(value: boolean);
|
|
48
|
+
/** @deprecated Use {@link ShowViewToggle}. */
|
|
49
|
+
get showViewToggle(): boolean;
|
|
50
|
+
ViewMode: TaskViewMode;
|
|
51
|
+
/** @deprecated Use {@link ViewMode}. */
|
|
52
|
+
set viewMode(value: TaskViewMode);
|
|
53
|
+
/** @deprecated Use {@link ViewMode}. */
|
|
54
|
+
get viewMode(): TaskViewMode;
|
|
55
|
+
ViewModeChanged: EventEmitter<TaskViewMode>;
|
|
56
|
+
/**
|
|
57
|
+
* @deprecated Use {@link ViewModeChanged}.
|
|
58
|
+
*
|
|
59
|
+
* The same emitter under the old binding name, so a template still binding
|
|
60
|
+
* (viewModeChanged) keeps working. Must stay AFTER ViewModeChanged: class fields
|
|
61
|
+
* initialise in order, and the other way round this captures undefined.
|
|
62
|
+
*/
|
|
19
63
|
viewModeChanged: EventEmitter<TaskViewMode>;
|
|
64
|
+
TaskClicked: EventEmitter<MJTaskEntity>;
|
|
65
|
+
/**
|
|
66
|
+
* @deprecated Use {@link TaskClicked}.
|
|
67
|
+
*
|
|
68
|
+
* The same emitter under the old binding name, so a template still binding
|
|
69
|
+
* (taskClicked) keeps working. Must stay AFTER TaskClicked: class fields
|
|
70
|
+
* initialise in order, and the other way round this captures undefined.
|
|
71
|
+
*/
|
|
20
72
|
taskClicked: EventEmitter<MJTaskEntity>;
|
|
73
|
+
OpenEntityRecord: EventEmitter<{
|
|
74
|
+
entityName: string;
|
|
75
|
+
recordId: string;
|
|
76
|
+
}>;
|
|
77
|
+
/**
|
|
78
|
+
* @deprecated Use {@link OpenEntityRecord}.
|
|
79
|
+
*
|
|
80
|
+
* The same emitter under the old binding name, so a template still binding
|
|
81
|
+
* (openEntityRecord) keeps working. Must stay AFTER OpenEntityRecord: class fields
|
|
82
|
+
* initialise in order, and the other way round this captures undefined.
|
|
83
|
+
*/
|
|
21
84
|
openEntityRecord: EventEmitter<{
|
|
22
85
|
entityName: string;
|
|
23
86
|
recordId: string;
|
|
24
87
|
}>;
|
|
88
|
+
SetViewMode(mode: TaskViewMode): void;
|
|
89
|
+
/** @deprecated Use {@link SetViewMode}. */
|
|
25
90
|
setViewMode(mode: TaskViewMode): void;
|
|
91
|
+
OnTaskClicked(task: MJTaskEntity): void;
|
|
92
|
+
/** @deprecated Use {@link OnTaskClicked}. */
|
|
26
93
|
onTaskClicked(task: MJTaskEntity): void;
|
|
94
|
+
OnOpenEntityRecord(event: {
|
|
95
|
+
entityName: string;
|
|
96
|
+
recordId: string;
|
|
97
|
+
}): void;
|
|
98
|
+
/** @deprecated Use {@link OnOpenEntityRecord}. */
|
|
27
99
|
onOpenEntityRecord(event: {
|
|
28
100
|
entityName: string;
|
|
29
101
|
recordId: string;
|
|
30
102
|
}): void;
|
|
31
103
|
static ɵfac: i0.ɵɵFactoryDeclaration<TaskComponent, never>;
|
|
32
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<TaskComponent, "mj-task", never, { "tasks": { "alias": "tasks"; "required": false; }; "ganttTasks": { "alias": "ganttTasks"; "required": false; }; "taskDependencies": { "alias": "taskDependencies"; "required": false; }; "agentRunMap": { "alias": "agentRunMap"; "required": false; }; "title": { "alias": "title"; "required": false; }; "description": { "alias": "description"; "required": false; }; "showHeader": { "alias": "showHeader"; "required": false; }; "showViewToggle": { "alias": "showViewToggle"; "required": false; }; "viewMode": { "alias": "viewMode"; "required": false; }; }, { "viewModeChanged": "viewModeChanged"; "taskClicked": "taskClicked"; "openEntityRecord": "openEntityRecord"; }, never, never, true, never>;
|
|
104
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<TaskComponent, "mj-task", never, { "Tasks": { "alias": "Tasks"; "required": false; }; "tasks": { "alias": "tasks"; "required": false; }; "GanttTasks": { "alias": "GanttTasks"; "required": false; }; "ganttTasks": { "alias": "ganttTasks"; "required": false; }; "TaskDependencies": { "alias": "TaskDependencies"; "required": false; }; "taskDependencies": { "alias": "taskDependencies"; "required": false; }; "AgentRunMap": { "alias": "AgentRunMap"; "required": false; }; "agentRunMap": { "alias": "agentRunMap"; "required": false; }; "Title": { "alias": "Title"; "required": false; }; "title": { "alias": "title"; "required": false; }; "Description": { "alias": "Description"; "required": false; }; "description": { "alias": "description"; "required": false; }; "ShowHeader": { "alias": "ShowHeader"; "required": false; }; "showHeader": { "alias": "showHeader"; "required": false; }; "ShowViewToggle": { "alias": "ShowViewToggle"; "required": false; }; "showViewToggle": { "alias": "showViewToggle"; "required": false; }; "ViewMode": { "alias": "ViewMode"; "required": false; }; "viewMode": { "alias": "viewMode"; "required": false; }; }, { "ViewModeChanged": "ViewModeChanged"; "viewModeChanged": "viewModeChanged"; "TaskClicked": "TaskClicked"; "taskClicked": "taskClicked"; "OpenEntityRecord": "OpenEntityRecord"; "openEntityRecord": "openEntityRecord"; }, never, never, true, never>;
|
|
33
105
|
}
|
|
34
106
|
//# sourceMappingURL=task.component.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task.component.d.ts","sourceRoot":"","sources":["../../../src/lib/components/task.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,MAAM,eAAe,CAAC;AAEvE,OAAO,EAAE,YAAY,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACrF,OAAO,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;;AAI1D;;;GAGG;AACH,qBAiJa,aAAa;IACf,KAAK,EAAE,YAAY,EAAE,CAAM;
|
|
1
|
+
{"version":3,"file":"task.component.d.ts","sourceRoot":"","sources":["../../../src/lib/components/task.component.ts"],"names":[],"mappings":"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"}
|
|
@@ -81,30 +81,138 @@ function TaskComponent_Conditional_4_Template(rf, ctx) { if (rf & 1) {
|
|
|
81
81
|
* Allows switching between list and Gantt chart views
|
|
82
82
|
*/
|
|
83
83
|
export class TaskComponent {
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
84
|
+
Tasks = [];
|
|
85
|
+
/** @deprecated Use {@link Tasks}. */
|
|
86
|
+
set tasks(value) {
|
|
87
|
+
this.Tasks = value;
|
|
88
|
+
}
|
|
89
|
+
/** @deprecated Use {@link Tasks}. */
|
|
90
|
+
get tasks() {
|
|
91
|
+
return this.Tasks;
|
|
92
|
+
}
|
|
93
|
+
GanttTasks;
|
|
94
|
+
/** @deprecated Use {@link GanttTasks}. */
|
|
95
|
+
set ganttTasks(value) {
|
|
96
|
+
this.GanttTasks = value;
|
|
97
|
+
}
|
|
98
|
+
/** @deprecated Use {@link GanttTasks}. */
|
|
99
|
+
get ganttTasks() {
|
|
100
|
+
return this.GanttTasks;
|
|
101
|
+
} // Optional separate task list for Gantt (includes parent)
|
|
102
|
+
TaskDependencies;
|
|
103
|
+
/** @deprecated Use {@link TaskDependencies}. */
|
|
104
|
+
set taskDependencies(value) {
|
|
105
|
+
this.TaskDependencies = value;
|
|
106
|
+
}
|
|
107
|
+
/** @deprecated Use {@link TaskDependencies}. */
|
|
108
|
+
get taskDependencies() {
|
|
109
|
+
return this.TaskDependencies;
|
|
110
|
+
} // Task dependencies for Gantt links
|
|
111
|
+
AgentRunMap;
|
|
112
|
+
/** @deprecated Use {@link AgentRunMap}. */
|
|
113
|
+
set agentRunMap(value) {
|
|
114
|
+
this.AgentRunMap = value;
|
|
115
|
+
}
|
|
116
|
+
/** @deprecated Use {@link AgentRunMap}. */
|
|
117
|
+
get agentRunMap() {
|
|
118
|
+
return this.AgentRunMap;
|
|
119
|
+
} // Maps TaskID -> AgentRunID
|
|
120
|
+
Title;
|
|
121
|
+
/** @deprecated Use {@link Title}. */
|
|
122
|
+
set title(value) {
|
|
123
|
+
this.Title = value;
|
|
124
|
+
}
|
|
125
|
+
/** @deprecated Use {@link Title}. */
|
|
126
|
+
get title() {
|
|
127
|
+
return this.Title;
|
|
128
|
+
}
|
|
129
|
+
Description;
|
|
130
|
+
/** @deprecated Use {@link Description}. */
|
|
131
|
+
set description(value) {
|
|
132
|
+
this.Description = value;
|
|
133
|
+
}
|
|
134
|
+
/** @deprecated Use {@link Description}. */
|
|
135
|
+
get description() {
|
|
136
|
+
return this.Description;
|
|
137
|
+
}
|
|
138
|
+
ShowHeader = true;
|
|
139
|
+
/** @deprecated Use {@link ShowHeader}. */
|
|
140
|
+
set showHeader(value) {
|
|
141
|
+
this.ShowHeader = value;
|
|
142
|
+
}
|
|
143
|
+
/** @deprecated Use {@link ShowHeader}. */
|
|
144
|
+
get showHeader() {
|
|
145
|
+
return this.ShowHeader;
|
|
146
|
+
}
|
|
147
|
+
ShowViewToggle = true;
|
|
148
|
+
/** @deprecated Use {@link ShowViewToggle}. */
|
|
149
|
+
set showViewToggle(value) {
|
|
150
|
+
this.ShowViewToggle = value;
|
|
151
|
+
}
|
|
152
|
+
/** @deprecated Use {@link ShowViewToggle}. */
|
|
153
|
+
get showViewToggle() {
|
|
154
|
+
return this.ShowViewToggle;
|
|
155
|
+
} // Show Gantt/List toggle
|
|
156
|
+
ViewMode = 'simple';
|
|
157
|
+
/** @deprecated Use {@link ViewMode}. */
|
|
158
|
+
set viewMode(value) {
|
|
159
|
+
this.ViewMode = value;
|
|
160
|
+
}
|
|
161
|
+
/** @deprecated Use {@link ViewMode}. */
|
|
162
|
+
get viewMode() {
|
|
163
|
+
return this.ViewMode;
|
|
164
|
+
}
|
|
165
|
+
ViewModeChanged = new EventEmitter();
|
|
166
|
+
/**
|
|
167
|
+
* @deprecated Use {@link ViewModeChanged}.
|
|
168
|
+
*
|
|
169
|
+
* The same emitter under the old binding name, so a template still binding
|
|
170
|
+
* (viewModeChanged) keeps working. Must stay AFTER ViewModeChanged: class fields
|
|
171
|
+
* initialise in order, and the other way round this captures undefined.
|
|
172
|
+
*/
|
|
173
|
+
viewModeChanged = this.ViewModeChanged;
|
|
174
|
+
TaskClicked = new EventEmitter();
|
|
175
|
+
/**
|
|
176
|
+
* @deprecated Use {@link TaskClicked}.
|
|
177
|
+
*
|
|
178
|
+
* The same emitter under the old binding name, so a template still binding
|
|
179
|
+
* (taskClicked) keeps working. Must stay AFTER TaskClicked: class fields
|
|
180
|
+
* initialise in order, and the other way round this captures undefined.
|
|
181
|
+
*/
|
|
182
|
+
taskClicked = this.TaskClicked;
|
|
183
|
+
OpenEntityRecord = new EventEmitter();
|
|
184
|
+
/**
|
|
185
|
+
* @deprecated Use {@link OpenEntityRecord}.
|
|
186
|
+
*
|
|
187
|
+
* The same emitter under the old binding name, so a template still binding
|
|
188
|
+
* (openEntityRecord) keeps working. Must stay AFTER OpenEntityRecord: class fields
|
|
189
|
+
* initialise in order, and the other way round this captures undefined.
|
|
190
|
+
*/
|
|
191
|
+
openEntityRecord = this.OpenEntityRecord;
|
|
192
|
+
SetViewMode(mode) {
|
|
193
|
+
this.ViewMode = mode;
|
|
194
|
+
this.ViewModeChanged.emit(mode);
|
|
195
|
+
}
|
|
196
|
+
/** @deprecated Use {@link SetViewMode}. */
|
|
96
197
|
setViewMode(mode) {
|
|
97
|
-
this.
|
|
98
|
-
this.viewModeChanged.emit(mode);
|
|
198
|
+
return this.SetViewMode(mode);
|
|
99
199
|
}
|
|
200
|
+
OnTaskClicked(task) {
|
|
201
|
+
this.TaskClicked.emit(task);
|
|
202
|
+
}
|
|
203
|
+
/** @deprecated Use {@link OnTaskClicked}. */
|
|
100
204
|
onTaskClicked(task) {
|
|
101
|
-
this.
|
|
205
|
+
return this.OnTaskClicked(task);
|
|
206
|
+
}
|
|
207
|
+
OnOpenEntityRecord(event) {
|
|
208
|
+
this.OpenEntityRecord.emit(event);
|
|
102
209
|
}
|
|
210
|
+
/** @deprecated Use {@link OnOpenEntityRecord}. */
|
|
103
211
|
onOpenEntityRecord(event) {
|
|
104
|
-
this.
|
|
212
|
+
return this.OnOpenEntityRecord(event);
|
|
105
213
|
}
|
|
106
214
|
static ɵfac = function TaskComponent_Factory(__ngFactoryType__) { return new (__ngFactoryType__ || TaskComponent)(); };
|
|
107
|
-
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: TaskComponent, selectors: [["mj-task"]], inputs: { tasks: "tasks", ganttTasks: "ganttTasks", taskDependencies: "taskDependencies", agentRunMap: "agentRunMap", title: "title", description: "description", showHeader: "showHeader", showViewToggle: "showViewToggle", viewMode: "viewMode" }, outputs: { viewModeChanged: "viewModeChanged", taskClicked: "taskClicked", openEntityRecord: "openEntityRecord" }, decls: 5, vars: 3, consts: [[1, "task-component"], [1, "task-header"], [1, "task-viewer"], [3, "tasks", "agentRunMap"], [3, "tasks", "taskDependencies", "agentRunMap"], [1, "header-left"], [1, "task-title"], [1, "task-description"], [1, "view-toggle"], ["title", "Gantt Chart", 1, "toggle-btn", 3, "click"], [1, "fas", "fa-chart-gantt"], ["title", "List View", 1, "toggle-btn", 3, "click"], [1, "fas", "fa-list"], [3, "taskClicked", "openEntityRecord", "tasks", "agentRunMap"], [3, "taskClicked", "openEntityRecord", "tasks", "taskDependencies", "agentRunMap"]], template: function TaskComponent_Template(rf, ctx) { if (rf & 1) {
|
|
215
|
+
static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: TaskComponent, selectors: [["mj-task"]], inputs: { Tasks: "Tasks", tasks: "tasks", GanttTasks: "GanttTasks", ganttTasks: "ganttTasks", TaskDependencies: "TaskDependencies", taskDependencies: "taskDependencies", AgentRunMap: "AgentRunMap", agentRunMap: "agentRunMap", Title: "Title", title: "title", Description: "Description", description: "description", ShowHeader: "ShowHeader", showHeader: "showHeader", ShowViewToggle: "ShowViewToggle", showViewToggle: "showViewToggle", ViewMode: "ViewMode", viewMode: "viewMode" }, outputs: { ViewModeChanged: "ViewModeChanged", viewModeChanged: "viewModeChanged", TaskClicked: "TaskClicked", taskClicked: "taskClicked", OpenEntityRecord: "OpenEntityRecord", openEntityRecord: "openEntityRecord" }, decls: 5, vars: 3, consts: [[1, "task-component"], [1, "task-header"], [1, "task-viewer"], [3, "tasks", "agentRunMap"], [3, "tasks", "taskDependencies", "agentRunMap"], [1, "header-left"], [1, "task-title"], [1, "task-description"], [1, "view-toggle"], ["title", "Gantt Chart", 1, "toggle-btn", 3, "click"], [1, "fas", "fa-chart-gantt"], ["title", "List View", 1, "toggle-btn", 3, "click"], [1, "fas", "fa-list"], [3, "taskClicked", "openEntityRecord", "tasks", "agentRunMap"], [3, "taskClicked", "openEntityRecord", "tasks", "taskDependencies", "agentRunMap"]], template: function TaskComponent_Template(rf, ctx) { if (rf & 1) {
|
|
108
216
|
i0.ɵɵelementStart(0, "div", 0);
|
|
109
217
|
i0.ɵɵconditionalCreate(1, TaskComponent_Conditional_1_Template, 5, 3, "div", 1);
|
|
110
218
|
i0.ɵɵelementStart(2, "div", 2);
|
|
@@ -181,28 +289,52 @@ export class TaskComponent {
|
|
|
181
289
|
</div>
|
|
182
290
|
</div>
|
|
183
291
|
`, styles: ["\n .task-component {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--mj-bg-surface-sunken);\n }\n\n .task-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: 20px;\n padding: 20px 24px;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .header-left {\n flex: 1;\n min-width: 0;\n }\n\n .task-title {\n margin: 0 0 8px 0;\n font-size: 20px;\n font-weight: 700;\n color: var(--mj-text-primary);\n }\n\n .task-description {\n margin: 0;\n font-size: 14px;\n color: var(--mj-text-muted);\n line-height: 1.5;\n }\n\n .view-toggle {\n display: flex;\n gap: 8px;\n background: var(--mj-bg-surface-sunken);\n padding: 4px;\n border-radius: 8px;\n }\n\n .toggle-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n border: none;\n background: transparent;\n color: var(--mj-text-muted);\n font-size: 13px;\n font-weight: 600;\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.15s;\n }\n\n .toggle-btn:hover {\n color: var(--mj-text-primary);\n background: color-mix(in srgb, var(--mj-bg-surface) 50%, transparent);\n }\n\n .toggle-btn.active {\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n box-shadow: var(--mj-shadow-sm);\n }\n\n .toggle-btn i {\n font-size: 14px;\n }\n\n .task-viewer {\n flex: 1;\n min-height: 0;\n overflow: hidden;\n }\n "] }]
|
|
184
|
-
}], null, {
|
|
292
|
+
}], null, { Tasks: [{
|
|
293
|
+
type: Input
|
|
294
|
+
}], tasks: [{
|
|
295
|
+
type: Input
|
|
296
|
+
}], GanttTasks: [{
|
|
185
297
|
type: Input
|
|
186
298
|
}], ganttTasks: [{
|
|
187
299
|
type: Input
|
|
300
|
+
}], TaskDependencies: [{
|
|
301
|
+
type: Input
|
|
188
302
|
}], taskDependencies: [{
|
|
189
303
|
type: Input
|
|
304
|
+
}], AgentRunMap: [{
|
|
305
|
+
type: Input
|
|
190
306
|
}], agentRunMap: [{
|
|
191
307
|
type: Input
|
|
308
|
+
}], Title: [{
|
|
309
|
+
type: Input
|
|
192
310
|
}], title: [{
|
|
193
311
|
type: Input
|
|
312
|
+
}], Description: [{
|
|
313
|
+
type: Input
|
|
194
314
|
}], description: [{
|
|
195
315
|
type: Input
|
|
316
|
+
}], ShowHeader: [{
|
|
317
|
+
type: Input
|
|
196
318
|
}], showHeader: [{
|
|
197
319
|
type: Input
|
|
320
|
+
}], ShowViewToggle: [{
|
|
321
|
+
type: Input
|
|
198
322
|
}], showViewToggle: [{
|
|
199
323
|
type: Input
|
|
324
|
+
}], ViewMode: [{
|
|
325
|
+
type: Input
|
|
200
326
|
}], viewMode: [{
|
|
201
327
|
type: Input
|
|
328
|
+
}], ViewModeChanged: [{
|
|
329
|
+
type: Output
|
|
202
330
|
}], viewModeChanged: [{
|
|
203
331
|
type: Output
|
|
332
|
+
}], TaskClicked: [{
|
|
333
|
+
type: Output
|
|
204
334
|
}], taskClicked: [{
|
|
205
335
|
type: Output
|
|
336
|
+
}], OpenEntityRecord: [{
|
|
337
|
+
type: Output
|
|
206
338
|
}], openEntityRecord: [{
|
|
207
339
|
type: Output
|
|
208
340
|
}] }); })();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"task.component.js","sourceRoot":"","sources":["../../../src/lib/components/task.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAIvE,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAC3E,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC;;;;IAiB3D,6BAAuB;IAAA,YAAW;IAAA,iBAAK;;;IAAhB,cAAW;IAAX,kCAAW;;;IAGlC,4BAA4B;IAAA,YAAiB;IAAA,iBAAI;;;IAArB,cAAiB;IAAjB,wCAAiB;;;;IAK7C,AADF,8BAAyB,gBAKD;IADpB,gMAAS,mBAAY,OAAO,CAAC,KAAC;IAE9B,wBAAkC;IAClC,4BAAM;IAAA,qBAAK;IACb,AADa,iBAAO,EACX;IACT,kCAIoB;IADlB,gMAAS,mBAAY,QAAQ,CAAC,KAAC;IAE/B,wBAA2B;IAC3B,4BAAM;IAAA,oBAAI;IAEd,AADE,AADY,iBAAO,EACV,EACL;;;IAdF,cAAqC;IAArC,qDAAqC;IAQrC,eAAsC;IAAtC,sDAAsC;;;IApB5C,AADF,8BAAyB,aACE;IACvB,4FAAa;IAGb,2FAAmB;IAGrB,iBAAM;IACN,6FAAsB;IAoBxB,iBAAM;;;IA3BF,eAEC;IAFD,uCAEC;IACD,cAEC;IAFD,6CAEC;IAEH,cAmBC;IAnBD,gDAmBC;;;;IAOD,iDAIkD;IAAhD,AADA,kNAAe,4BAAqB,KAAC,+MACjB,iCAA0B,KAAC;IACjD,iBAAwB;;;IAHtB,AADA,oCAAe,mCACY;;;;IAO7B,gDAKkD;IAAhD,AADA,iNAAe,4BAAqB,KAAC,8MACjB,iCAA0B,KAAC;IACjD,iBAAuB;;;IAHrB,AADA,AADA,yDAA6B,2EACc,mCAChB;;AA3DvC;;;GAGG;AAkJH,MAAM,OAAO,aAAa;IACf,KAAK,GAAmB,EAAE,CAAC;IAC3B,UAAU,CAAkB,CAAC,0DAA0D;IACvF,gBAAgB,CAA4B,CAAC,oCAAoC;IACjF,WAAW,CAAuB,CAAC,4BAA4B;IAC/D,KAAK,CAAU;IACf,WAAW,CAAU;IACrB,UAAU,GAAY,IAAI,CAAC;IAC3B,cAAc,GAAY,IAAI,CAAC,CAAC,yBAAyB;IACzD,QAAQ,GAAiB,QAAQ,CAAC;IAEjC,eAAe,GAAG,IAAI,YAAY,EAAgB,CAAC;IACnD,WAAW,GAAG,IAAI,YAAY,EAAgB,CAAC;IAC/C,gBAAgB,GAAG,IAAI,YAAY,EAA4C,CAAC;IAEnF,WAAW,CAAC,IAAkB;QACnC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAClC,CAAC;IAEM,aAAa,CAAC,IAAkB;QACrC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC;IAEM,kBAAkB,CAAC,KAA+C;QACvE,IAAI,CAAC,gBAAgB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACpC,CAAC;uGA1BU,aAAa;6DAAb,aAAa;YA5ItB,8BAA4B;YAE1B,+EAAkB;YAkClB,8BAAyB;YACvB,iGAA6B;YAS7B,gGAA4B;YAUhC,AADE,iBAAM,EACF;;YAtDJ,cA+BC;YA/BD,yCA+BC;YAIC,eAOC;YAPD,oDAOC;YAED,cAQC;YARD,mDAQC;4BAxDG,yBAAyB,EAAE,wBAAwB;;iFA8IlD,aAAa;cAjJzB,SAAS;2BACE,SAAS,cACP,IAAI,WACP,CAAC,yBAAyB,EAAE,wBAAwB,CAAC,YACpD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA0DP;;kBAoFF,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBACL,KAAK;;kBAEL,MAAM;;kBACN,MAAM;;kBACN,MAAM;;kFAbI,aAAa","sourcesContent":["import { Component, Input, Output, EventEmitter } from '@angular/core';\n\nimport { MJTaskEntity, MJTaskDependencyEntity } from '@memberjunction/core-entities';\nimport { TaskViewMode } from '../models/task-view.models';\nimport { SimpleTaskViewerComponent } from './simple-task-viewer.component';\nimport { GanttTaskViewerComponent } from './gantt-task-viewer.component';\n\n/**\n * Main task component that composes SimpleTaskViewer and GanttTaskViewer\n * Allows switching between list and Gantt chart views\n */\n@Component({\n selector: 'mj-task',\n standalone: true,\n imports: [SimpleTaskViewerComponent, GanttTaskViewerComponent],\n template: `\n <div class=\"task-component\">\n <!-- Header with View Toggle -->\n @if (showHeader) {\n <div class=\"task-header\">\n <div class=\"header-left\">\n @if (title) {\n <h2 class=\"task-title\">{{ title }}</h2>\n }\n @if (description) {\n <p class=\"task-description\">{{ description }}</p>\n }\n </div>\n @if (showViewToggle) {\n <div class=\"view-toggle\">\n <button\n class=\"toggle-btn\"\n [class.active]=\"viewMode === 'gantt'\"\n (click)=\"setViewMode('gantt')\"\n title=\"Gantt Chart\">\n <i class=\"fas fa-chart-gantt\"></i>\n <span>Gantt</span>\n </button>\n <button\n class=\"toggle-btn\"\n [class.active]=\"viewMode === 'simple'\"\n (click)=\"setViewMode('simple')\"\n title=\"List View\">\n <i class=\"fas fa-list\"></i>\n <span>List</span>\n </button>\n </div>\n }\n </div>\n }\n \n <!-- Task Viewer (Simple or Gantt) -->\n <div class=\"task-viewer\">\n @if (viewMode === 'simple') {\n <mj-simple-task-viewer\n [tasks]=\"tasks\"\n [agentRunMap]=\"agentRunMap\"\n (taskClicked)=\"onTaskClicked($event)\"\n (openEntityRecord)=\"onOpenEntityRecord($event)\">\n </mj-simple-task-viewer>\n }\n \n @if (viewMode === 'gantt') {\n <mj-gantt-task-viewer\n [tasks]=\"ganttTasks || tasks\"\n [taskDependencies]=\"taskDependencies || []\"\n [agentRunMap]=\"agentRunMap\"\n (taskClicked)=\"onTaskClicked($event)\"\n (openEntityRecord)=\"onOpenEntityRecord($event)\">\n </mj-gantt-task-viewer>\n }\n </div>\n </div>\n `,\n styles: [`\n .task-component {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--mj-bg-surface-sunken);\n }\n\n .task-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: 20px;\n padding: 20px 24px;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .header-left {\n flex: 1;\n min-width: 0;\n }\n\n .task-title {\n margin: 0 0 8px 0;\n font-size: 20px;\n font-weight: 700;\n color: var(--mj-text-primary);\n }\n\n .task-description {\n margin: 0;\n font-size: 14px;\n color: var(--mj-text-muted);\n line-height: 1.5;\n }\n\n .view-toggle {\n display: flex;\n gap: 8px;\n background: var(--mj-bg-surface-sunken);\n padding: 4px;\n border-radius: 8px;\n }\n\n .toggle-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n border: none;\n background: transparent;\n color: var(--mj-text-muted);\n font-size: 13px;\n font-weight: 600;\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.15s;\n }\n\n .toggle-btn:hover {\n color: var(--mj-text-primary);\n background: color-mix(in srgb, var(--mj-bg-surface) 50%, transparent);\n }\n\n .toggle-btn.active {\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n box-shadow: var(--mj-shadow-sm);\n }\n\n .toggle-btn i {\n font-size: 14px;\n }\n\n .task-viewer {\n flex: 1;\n min-height: 0;\n overflow: hidden;\n }\n `]\n})\nexport class TaskComponent {\n @Input() tasks: MJTaskEntity[] = [];\n @Input() ganttTasks?: MJTaskEntity[]; // Optional separate task list for Gantt (includes parent)\n @Input() taskDependencies?: MJTaskDependencyEntity[]; // Task dependencies for Gantt links\n @Input() agentRunMap?: Map<string, string>; // Maps TaskID -> AgentRunID\n @Input() title?: string;\n @Input() description?: string;\n @Input() showHeader: boolean = true;\n @Input() showViewToggle: boolean = true; // Show Gantt/List toggle\n @Input() viewMode: TaskViewMode = 'simple';\n\n @Output() viewModeChanged = new EventEmitter<TaskViewMode>();\n @Output() taskClicked = new EventEmitter<MJTaskEntity>();\n @Output() openEntityRecord = new EventEmitter<{ entityName: string; recordId: string }>();\n\n public setViewMode(mode: TaskViewMode): void {\n this.viewMode = mode;\n this.viewModeChanged.emit(mode);\n }\n\n public onTaskClicked(task: MJTaskEntity): void {\n this.taskClicked.emit(task);\n }\n\n public onOpenEntityRecord(event: { entityName: string; recordId: string }): void {\n this.openEntityRecord.emit(event);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"task.component.js","sourceRoot":"","sources":["../../../src/lib/components/task.component.ts"],"names":[],"mappings":"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","sourcesContent":["import { Component, Input, Output, EventEmitter } from '@angular/core';\n\nimport { MJTaskEntity, MJTaskDependencyEntity } from '@memberjunction/core-entities';\nimport { TaskViewMode } from '../models/task-view.models';\nimport { SimpleTaskViewerComponent } from './simple-task-viewer.component';\nimport { GanttTaskViewerComponent } from './gantt-task-viewer.component';\n\n/**\n * Main task component that composes SimpleTaskViewer and GanttTaskViewer\n * Allows switching between list and Gantt chart views\n */\n@Component({\n selector: 'mj-task',\n standalone: true,\n imports: [SimpleTaskViewerComponent, GanttTaskViewerComponent],\n template: `\n <div class=\"task-component\">\n <!-- Header with View Toggle -->\n @if (showHeader) {\n <div class=\"task-header\">\n <div class=\"header-left\">\n @if (title) {\n <h2 class=\"task-title\">{{ title }}</h2>\n }\n @if (description) {\n <p class=\"task-description\">{{ description }}</p>\n }\n </div>\n @if (showViewToggle) {\n <div class=\"view-toggle\">\n <button\n class=\"toggle-btn\"\n [class.active]=\"viewMode === 'gantt'\"\n (click)=\"setViewMode('gantt')\"\n title=\"Gantt Chart\">\n <i class=\"fas fa-chart-gantt\"></i>\n <span>Gantt</span>\n </button>\n <button\n class=\"toggle-btn\"\n [class.active]=\"viewMode === 'simple'\"\n (click)=\"setViewMode('simple')\"\n title=\"List View\">\n <i class=\"fas fa-list\"></i>\n <span>List</span>\n </button>\n </div>\n }\n </div>\n }\n \n <!-- Task Viewer (Simple or Gantt) -->\n <div class=\"task-viewer\">\n @if (viewMode === 'simple') {\n <mj-simple-task-viewer\n [tasks]=\"tasks\"\n [agentRunMap]=\"agentRunMap\"\n (taskClicked)=\"onTaskClicked($event)\"\n (openEntityRecord)=\"onOpenEntityRecord($event)\">\n </mj-simple-task-viewer>\n }\n \n @if (viewMode === 'gantt') {\n <mj-gantt-task-viewer\n [tasks]=\"ganttTasks || tasks\"\n [taskDependencies]=\"taskDependencies || []\"\n [agentRunMap]=\"agentRunMap\"\n (taskClicked)=\"onTaskClicked($event)\"\n (openEntityRecord)=\"onOpenEntityRecord($event)\">\n </mj-gantt-task-viewer>\n }\n </div>\n </div>\n `,\n styles: [`\n .task-component {\n display: flex;\n flex-direction: column;\n height: 100%;\n background: var(--mj-bg-surface-sunken);\n }\n\n .task-header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n gap: 20px;\n padding: 20px 24px;\n background: var(--mj-bg-surface);\n border-bottom: 1px solid var(--mj-border-default);\n }\n\n .header-left {\n flex: 1;\n min-width: 0;\n }\n\n .task-title {\n margin: 0 0 8px 0;\n font-size: 20px;\n font-weight: 700;\n color: var(--mj-text-primary);\n }\n\n .task-description {\n margin: 0;\n font-size: 14px;\n color: var(--mj-text-muted);\n line-height: 1.5;\n }\n\n .view-toggle {\n display: flex;\n gap: 8px;\n background: var(--mj-bg-surface-sunken);\n padding: 4px;\n border-radius: 8px;\n }\n\n .toggle-btn {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 8px 16px;\n border: none;\n background: transparent;\n color: var(--mj-text-muted);\n font-size: 13px;\n font-weight: 600;\n border-radius: 6px;\n cursor: pointer;\n transition: all 0.15s;\n }\n\n .toggle-btn:hover {\n color: var(--mj-text-primary);\n background: color-mix(in srgb, var(--mj-bg-surface) 50%, transparent);\n }\n\n .toggle-btn.active {\n background: var(--mj-bg-surface);\n color: var(--mj-brand-primary);\n box-shadow: var(--mj-shadow-sm);\n }\n\n .toggle-btn i {\n font-size: 14px;\n }\n\n .task-viewer {\n flex: 1;\n min-height: 0;\n overflow: hidden;\n }\n `]\n})\nexport class TaskComponent {\n @Input() Tasks: MJTaskEntity[] = [];\n\n /** @deprecated Use {@link Tasks}. */\n @Input() set tasks(value: MJTaskEntity[]) {\n this.Tasks = value;\n }\n /** @deprecated Use {@link Tasks}. */\n get tasks(): MJTaskEntity[] {\n return this.Tasks;\n }\n @Input() GanttTasks?: MJTaskEntity[];\n\n /** @deprecated Use {@link GanttTasks}. */\n @Input() set ganttTasks(value: MJTaskEntity[] | undefined) {\n this.GanttTasks = value;\n }\n /** @deprecated Use {@link GanttTasks}. */\n get ganttTasks(): MJTaskEntity[] | undefined {\n return this.GanttTasks;\n } // Optional separate task list for Gantt (includes parent)\n @Input() TaskDependencies?: MJTaskDependencyEntity[];\n\n /** @deprecated Use {@link TaskDependencies}. */\n @Input() set taskDependencies(value: MJTaskDependencyEntity[] | undefined) {\n this.TaskDependencies = value;\n }\n /** @deprecated Use {@link TaskDependencies}. */\n get taskDependencies(): MJTaskDependencyEntity[] | undefined {\n return this.TaskDependencies;\n } // Task dependencies for Gantt links\n @Input() AgentRunMap?: Map<string, string>;\n\n /** @deprecated Use {@link AgentRunMap}. */\n @Input() set agentRunMap(value: Map<string, string> | undefined) {\n this.AgentRunMap = value;\n }\n /** @deprecated Use {@link AgentRunMap}. */\n get agentRunMap(): Map<string, string> | undefined {\n return this.AgentRunMap;\n } // Maps TaskID -> AgentRunID\n @Input() Title?: string;\n\n /** @deprecated Use {@link Title}. */\n @Input() set title(value: string | undefined) {\n this.Title = value;\n }\n /** @deprecated Use {@link Title}. */\n get title(): string | undefined {\n return this.Title;\n }\n @Input() Description?: string;\n\n /** @deprecated Use {@link Description}. */\n @Input() set description(value: string | undefined) {\n this.Description = value;\n }\n /** @deprecated Use {@link Description}. */\n get description(): string | undefined {\n return this.Description;\n }\n @Input() ShowHeader: boolean = true;\n\n /** @deprecated Use {@link ShowHeader}. */\n @Input() set showHeader(value: boolean) {\n this.ShowHeader = value;\n }\n /** @deprecated Use {@link ShowHeader}. */\n get showHeader(): boolean {\n return this.ShowHeader;\n }\n @Input() ShowViewToggle: boolean = true;\n\n /** @deprecated Use {@link ShowViewToggle}. */\n @Input() set showViewToggle(value: boolean) {\n this.ShowViewToggle = value;\n }\n /** @deprecated Use {@link ShowViewToggle}. */\n get showViewToggle(): boolean {\n return this.ShowViewToggle;\n } // Show Gantt/List toggle\n @Input() ViewMode: TaskViewMode = 'simple';\n\n /** @deprecated Use {@link ViewMode}. */\n @Input() set viewMode(value: TaskViewMode) {\n this.ViewMode = value;\n }\n /** @deprecated Use {@link ViewMode}. */\n get viewMode(): TaskViewMode {\n return this.ViewMode;\n }\n\n @Output() ViewModeChanged = new EventEmitter<TaskViewMode>();\n\n /**\n * @deprecated Use {@link ViewModeChanged}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (viewModeChanged) keeps working. Must stay AFTER ViewModeChanged: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() viewModeChanged = this.ViewModeChanged;\n @Output() TaskClicked = new EventEmitter<MJTaskEntity>();\n\n /**\n * @deprecated Use {@link TaskClicked}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (taskClicked) keeps working. Must stay AFTER TaskClicked: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() taskClicked = this.TaskClicked;\n @Output() OpenEntityRecord = new EventEmitter<{ entityName: string; recordId: string }>();\n\n /**\n * @deprecated Use {@link OpenEntityRecord}.\n *\n * The same emitter under the old binding name, so a template still binding\n * (openEntityRecord) keeps working. Must stay AFTER OpenEntityRecord: class fields\n * initialise in order, and the other way round this captures undefined.\n */\n @Output() openEntityRecord = this.OpenEntityRecord;\n\n public SetViewMode(mode: TaskViewMode): void {\n this.ViewMode = mode;\n this.ViewModeChanged.emit(mode);\n }\n\n /** @deprecated Use {@link SetViewMode}. */\n public setViewMode(mode: TaskViewMode): void {\n return this.SetViewMode(mode);\n }\n\n public OnTaskClicked(task: MJTaskEntity): void {\n this.TaskClicked.emit(task);\n }\n\n /** @deprecated Use {@link OnTaskClicked}. */\n public onTaskClicked(task: MJTaskEntity): void {\n return this.OnTaskClicked(task);\n }\n\n public OnOpenEntityRecord(event: { entityName: string; recordId: string }): void {\n this.OpenEntityRecord.emit(event);\n }\n\n /** @deprecated Use {@link OnOpenEntityRecord}. */\n public onOpenEntityRecord(event: { entityName: string; recordId: string }): void {\n return this.OnOpenEntityRecord(event);\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@memberjunction/ng-tasks",
|
|
3
|
-
"version": "6.2.0-edge.
|
|
3
|
+
"version": "6.2.0-edge.2",
|
|
4
4
|
"description": "MemberJunction: Angular components for task visualization and management with Gantt chart support",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
7
7
|
"dependencies": {
|
|
8
|
-
"@memberjunction/ai-core-plus": "6.2.0-edge.
|
|
9
|
-
"@memberjunction/ai-engine-base": "6.2.0-edge.
|
|
10
|
-
"@memberjunction/core": "6.2.0-edge.
|
|
11
|
-
"@memberjunction/core-entities": "6.2.0-edge.
|
|
12
|
-
"@memberjunction/global": "6.2.0-edge.
|
|
13
|
-
"@memberjunction/ng-shared-generic": "6.2.0-edge.
|
|
8
|
+
"@memberjunction/ai-core-plus": "6.2.0-edge.2",
|
|
9
|
+
"@memberjunction/ai-engine-base": "6.2.0-edge.2",
|
|
10
|
+
"@memberjunction/core": "6.2.0-edge.2",
|
|
11
|
+
"@memberjunction/core-entities": "6.2.0-edge.2",
|
|
12
|
+
"@memberjunction/global": "6.2.0-edge.2",
|
|
13
|
+
"@memberjunction/ng-shared-generic": "6.2.0-edge.2",
|
|
14
14
|
"dhtmlx-gantt": "^9.1.1",
|
|
15
15
|
"rxjs": "^7.8.2"
|
|
16
16
|
},
|
|
@@ -27,7 +27,7 @@
|
|
|
27
27
|
"url": "https://github.com/MemberJunction/MJ"
|
|
28
28
|
},
|
|
29
29
|
"devDependencies": {
|
|
30
|
-
"@memberjunction/ng-test-utils": "6.2.0-edge.
|
|
30
|
+
"@memberjunction/ng-test-utils": "6.2.0-edge.2",
|
|
31
31
|
"vitest": "^4.0.18",
|
|
32
32
|
"@angular/compiler-cli": "21.2.22"
|
|
33
33
|
},
|