@memberjunction/ng-conversations 2.104.0 → 2.106.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/dist/lib/components/collection/collection-view.component.d.ts +5 -1
  2. package/dist/lib/components/collection/collection-view.component.d.ts.map +1 -1
  3. package/dist/lib/components/collection/collection-view.component.js +53 -11
  4. package/dist/lib/components/collection/collection-view.component.js.map +1 -1
  5. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts +53 -13
  6. package/dist/lib/components/conversation/conversation-chat-area.component.d.ts.map +1 -1
  7. package/dist/lib/components/conversation/conversation-chat-area.component.js +455 -289
  8. package/dist/lib/components/conversation/conversation-chat-area.component.js.map +1 -1
  9. package/dist/lib/components/conversation/conversation-list.component.d.ts +9 -1
  10. package/dist/lib/components/conversation/conversation-list.component.d.ts.map +1 -1
  11. package/dist/lib/components/conversation/conversation-list.component.js +258 -71
  12. package/dist/lib/components/conversation/conversation-list.component.js.map +1 -1
  13. package/dist/lib/components/mention/mention-dropdown.component.d.ts +6 -0
  14. package/dist/lib/components/mention/mention-dropdown.component.d.ts.map +1 -1
  15. package/dist/lib/components/mention/mention-dropdown.component.js +35 -13
  16. package/dist/lib/components/mention/mention-dropdown.component.js.map +1 -1
  17. package/dist/lib/components/message/message-input.component.d.ts +49 -12
  18. package/dist/lib/components/message/message-input.component.d.ts.map +1 -1
  19. package/dist/lib/components/message/message-input.component.js +579 -221
  20. package/dist/lib/components/message/message-input.component.js.map +1 -1
  21. package/dist/lib/components/message/message-item.component.d.ts +16 -5
  22. package/dist/lib/components/message/message-item.component.d.ts.map +1 -1
  23. package/dist/lib/components/message/message-item.component.js +136 -64
  24. package/dist/lib/components/message/message-item.component.js.map +1 -1
  25. package/dist/lib/components/message/message-list.component.d.ts +11 -5
  26. package/dist/lib/components/message/message-list.component.d.ts.map +1 -1
  27. package/dist/lib/components/message/message-list.component.js +48 -9
  28. package/dist/lib/components/message/message-list.component.js.map +1 -1
  29. package/dist/lib/components/navigation/conversation-navigation.component.d.ts.map +1 -1
  30. package/dist/lib/components/navigation/conversation-navigation.component.js +24 -9
  31. package/dist/lib/components/navigation/conversation-navigation.component.js.map +1 -1
  32. package/dist/lib/components/task/tasks-full-view.component.d.ts +47 -0
  33. package/dist/lib/components/task/tasks-full-view.component.d.ts.map +1 -0
  34. package/dist/lib/components/task/tasks-full-view.component.js +368 -0
  35. package/dist/lib/components/task/tasks-full-view.component.js.map +1 -0
  36. package/dist/lib/components/tasks/task-widget.component.d.ts +29 -0
  37. package/dist/lib/components/tasks/task-widget.component.d.ts.map +1 -0
  38. package/dist/lib/components/tasks/task-widget.component.js +385 -0
  39. package/dist/lib/components/tasks/task-widget.component.js.map +1 -0
  40. package/dist/lib/components/tasks/tasks-dropdown.component.d.ts +22 -8
  41. package/dist/lib/components/tasks/tasks-dropdown.component.d.ts.map +1 -1
  42. package/dist/lib/components/tasks/tasks-dropdown.component.js +195 -99
  43. package/dist/lib/components/tasks/tasks-dropdown.component.js.map +1 -1
  44. package/dist/lib/components/thread/thread-panel.component.d.ts +3 -1
  45. package/dist/lib/components/thread/thread-panel.component.d.ts.map +1 -1
  46. package/dist/lib/components/thread/thread-panel.component.js +14 -14
  47. package/dist/lib/components/thread/thread-panel.component.js.map +1 -1
  48. package/dist/lib/components/workspace/conversation-workspace.component.d.ts +43 -4
  49. package/dist/lib/components/workspace/conversation-workspace.component.d.ts.map +1 -1
  50. package/dist/lib/components/workspace/conversation-workspace.component.js +288 -46
  51. package/dist/lib/components/workspace/conversation-workspace.component.js.map +1 -1
  52. package/dist/lib/conversations.module.d.ts +40 -46
  53. package/dist/lib/conversations.module.d.ts.map +1 -1
  54. package/dist/lib/conversations.module.js +28 -42
  55. package/dist/lib/conversations.module.js.map +1 -1
  56. package/dist/lib/models/conversation-state.model.d.ts +29 -1
  57. package/dist/lib/models/conversation-state.model.d.ts.map +1 -1
  58. package/dist/lib/services/conversation-agent.service.d.ts +6 -5
  59. package/dist/lib/services/conversation-agent.service.d.ts.map +1 -1
  60. package/dist/lib/services/conversation-agent.service.js +18 -19
  61. package/dist/lib/services/conversation-agent.service.js.map +1 -1
  62. package/dist/lib/services/data-cache.service.d.ts +96 -0
  63. package/dist/lib/services/data-cache.service.d.ts.map +1 -0
  64. package/dist/lib/services/data-cache.service.js +203 -0
  65. package/dist/lib/services/data-cache.service.js.map +1 -0
  66. package/dist/public-api.d.ts +3 -6
  67. package/dist/public-api.d.ts.map +1 -1
  68. package/dist/public-api.js +3 -6
  69. package/dist/public-api.js.map +1 -1
  70. package/package.json +12 -10
  71. package/dist/lib/components/artifact/artifact-panel.component.d.ts +0 -22
  72. package/dist/lib/components/artifact/artifact-panel.component.d.ts.map +0 -1
  73. package/dist/lib/components/artifact/artifact-panel.component.js +0 -237
  74. package/dist/lib/components/artifact/artifact-panel.component.js.map +0 -1
  75. package/dist/lib/components/artifact/artifact-upload-modal.component.d.ts +0 -39
  76. package/dist/lib/components/artifact/artifact-upload-modal.component.d.ts.map +0 -1
  77. package/dist/lib/components/artifact/artifact-upload-modal.component.js +0 -384
  78. package/dist/lib/components/artifact/artifact-upload-modal.component.js.map +0 -1
  79. package/dist/lib/components/artifact/artifact-version-history.component.d.ts +0 -28
  80. package/dist/lib/components/artifact/artifact-version-history.component.d.ts.map +0 -1
  81. package/dist/lib/components/artifact/artifact-version-history.component.js +0 -280
  82. package/dist/lib/components/artifact/artifact-version-history.component.js.map +0 -1
  83. package/dist/lib/components/artifact/artifact-viewer-panel.component.d.ts +0 -22
  84. package/dist/lib/components/artifact/artifact-viewer-panel.component.d.ts.map +0 -1
  85. package/dist/lib/components/artifact/artifact-viewer-panel.component.js +0 -182
  86. package/dist/lib/components/artifact/artifact-viewer-panel.component.js.map +0 -1
  87. package/dist/lib/components/artifact/artifact-viewer.component.d.ts +0 -27
  88. package/dist/lib/components/artifact/artifact-viewer.component.d.ts.map +0 -1
  89. package/dist/lib/components/artifact/artifact-viewer.component.js +0 -266
  90. package/dist/lib/components/artifact/artifact-viewer.component.js.map +0 -1
  91. package/dist/lib/components/artifact/inline-artifact.component.d.ts +0 -46
  92. package/dist/lib/components/artifact/inline-artifact.component.d.ts.map +0 -1
  93. package/dist/lib/components/artifact/inline-artifact.component.js +0 -447
  94. package/dist/lib/components/artifact/inline-artifact.component.js.map +0 -1
  95. package/dist/lib/components/task/task-form-modal.component.d.ts +0 -42
  96. package/dist/lib/components/task/task-form-modal.component.d.ts.map +0 -1
  97. package/dist/lib/components/task/task-form-modal.component.js +0 -329
  98. package/dist/lib/components/task/task-form-modal.component.js.map +0 -1
  99. package/dist/lib/components/task/task-item.component.d.ts +0 -22
  100. package/dist/lib/components/task/task-item.component.d.ts.map +0 -1
  101. package/dist/lib/components/task/task-item.component.js +0 -234
  102. package/dist/lib/components/task/task-item.component.js.map +0 -1
  103. package/dist/lib/components/task/task-list.component.d.ts +0 -32
  104. package/dist/lib/components/task/task-list.component.d.ts.map +0 -1
  105. package/dist/lib/components/task/task-list.component.js +0 -290
  106. package/dist/lib/components/task/task-list.component.js.map +0 -1
@@ -1,329 +0,0 @@
1
- import { Component, EventEmitter, Input, Output } from '@angular/core';
2
- import { Metadata } from '@memberjunction/core';
3
- import * as i0 from "@angular/core";
4
- import * as i1 from "../../services/toast.service";
5
- import * as i2 from "@angular/common";
6
- import * as i3 from "@angular/forms";
7
- import * as i4 from "@progress/kendo-angular-dialog";
8
- import * as i5 from "@progress/kendo-angular-buttons";
9
- import * as i6 from "@progress/kendo-angular-inputs";
10
- import * as i7 from "@progress/kendo-angular-indicators";
11
- import * as i8 from "@progress/kendo-angular-dropdowns";
12
- import * as i9 from "@progress/kendo-angular-dateinputs";
13
- function TaskFormModalComponent_kendo_dialog_0_span_6_Template(rf, ctx) { if (rf & 1) {
14
- i0.ɵɵelementStart(0, "span", 18);
15
- i0.ɵɵtext(1, " Title is required ");
16
- i0.ɵɵelementEnd();
17
- } }
18
- function TaskFormModalComponent_kendo_dialog_0_div_24_Template(rf, ctx) { if (rf & 1) {
19
- i0.ɵɵelementStart(0, "div", 18);
20
- i0.ɵɵtext(1);
21
- i0.ɵɵelementEnd();
22
- } if (rf & 2) {
23
- const ctx_r1 = i0.ɵɵnextContext(2);
24
- i0.ɵɵadvance();
25
- i0.ɵɵtextInterpolate1(" ", ctx_r1.errorMessage, " ");
26
- } }
27
- function TaskFormModalComponent_kendo_dialog_0_div_25_Template(rf, ctx) { if (rf & 1) {
28
- i0.ɵɵelementStart(0, "div", 19);
29
- i0.ɵɵelement(1, "kendo-loader", 20);
30
- i0.ɵɵelementStart(2, "span");
31
- i0.ɵɵtext(3, "Saving task...");
32
- i0.ɵɵelementEnd()();
33
- } }
34
- function TaskFormModalComponent_kendo_dialog_0_Template(rf, ctx) { if (rf & 1) {
35
- const _r1 = i0.ɵɵgetCurrentView();
36
- i0.ɵɵelementStart(0, "kendo-dialog", 1);
37
- i0.ɵɵlistener("close", function TaskFormModalComponent_kendo_dialog_0_Template_kendo_dialog_close_0_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onCancel()); });
38
- i0.ɵɵelementStart(1, "div", 2)(2, "div", 3)(3, "label", 4);
39
- i0.ɵɵtext(4, "Title");
40
- i0.ɵɵelementEnd();
41
- i0.ɵɵelementStart(5, "input", 5);
42
- i0.ɵɵtwoWayListener("ngModelChange", function TaskFormModalComponent_kendo_dialog_0_Template_input_ngModelChange_5_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.formData.title, $event) || (ctx_r1.formData.title = $event); return i0.ɵɵresetView($event); });
43
- i0.ɵɵlistener("keydown.enter", function TaskFormModalComponent_kendo_dialog_0_Template_input_keydown_enter_5_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onSave()); });
44
- i0.ɵɵelementEnd();
45
- i0.ɵɵtemplate(6, TaskFormModalComponent_kendo_dialog_0_span_6_Template, 2, 0, "span", 6);
46
- i0.ɵɵelementEnd();
47
- i0.ɵɵelementStart(7, "div", 3)(8, "label", 7);
48
- i0.ɵɵtext(9, "Description");
49
- i0.ɵɵelementEnd();
50
- i0.ɵɵelementStart(10, "textarea", 8);
51
- i0.ɵɵtwoWayListener("ngModelChange", function TaskFormModalComponent_kendo_dialog_0_Template_textarea_ngModelChange_10_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.formData.description, $event) || (ctx_r1.formData.description = $event); return i0.ɵɵresetView($event); });
52
- i0.ɵɵtext(11, " ");
53
- i0.ɵɵelementEnd()();
54
- i0.ɵɵelementStart(12, "div", 3)(13, "label", 9);
55
- i0.ɵɵtext(14, "Priority");
56
- i0.ɵɵelementEnd();
57
- i0.ɵɵelementStart(15, "kendo-dropdownlist", 10);
58
- i0.ɵɵtwoWayListener("ngModelChange", function TaskFormModalComponent_kendo_dialog_0_Template_kendo_dropdownlist_ngModelChange_15_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.formData.priority, $event) || (ctx_r1.formData.priority = $event); return i0.ɵɵresetView($event); });
59
- i0.ɵɵelementEnd()();
60
- i0.ɵɵelementStart(16, "div", 3)(17, "label", 11);
61
- i0.ɵɵtext(18, "Status");
62
- i0.ɵɵelementEnd();
63
- i0.ɵɵelementStart(19, "kendo-dropdownlist", 12);
64
- i0.ɵɵtwoWayListener("ngModelChange", function TaskFormModalComponent_kendo_dialog_0_Template_kendo_dropdownlist_ngModelChange_19_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.formData.status, $event) || (ctx_r1.formData.status = $event); return i0.ɵɵresetView($event); });
65
- i0.ɵɵelementEnd()();
66
- i0.ɵɵelementStart(20, "div", 3)(21, "label", 13);
67
- i0.ɵɵtext(22, "Due Date");
68
- i0.ɵɵelementEnd();
69
- i0.ɵɵelementStart(23, "kendo-datepicker", 14);
70
- i0.ɵɵtwoWayListener("ngModelChange", function TaskFormModalComponent_kendo_dialog_0_Template_kendo_datepicker_ngModelChange_23_listener($event) { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); i0.ɵɵtwoWayBindingSet(ctx_r1.formData.dueDate, $event) || (ctx_r1.formData.dueDate = $event); return i0.ɵɵresetView($event); });
71
- i0.ɵɵelementEnd()();
72
- i0.ɵɵtemplate(24, TaskFormModalComponent_kendo_dialog_0_div_24_Template, 2, 1, "div", 6)(25, TaskFormModalComponent_kendo_dialog_0_div_25_Template, 4, 0, "div", 15);
73
- i0.ɵɵelementEnd();
74
- i0.ɵɵelementStart(26, "kendo-dialog-actions")(27, "button", 16);
75
- i0.ɵɵlistener("click", function TaskFormModalComponent_kendo_dialog_0_Template_button_click_27_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onCancel()); });
76
- i0.ɵɵtext(28, "Cancel");
77
- i0.ɵɵelementEnd();
78
- i0.ɵɵelementStart(29, "button", 17);
79
- i0.ɵɵlistener("click", function TaskFormModalComponent_kendo_dialog_0_Template_button_click_29_listener() { i0.ɵɵrestoreView(_r1); const ctx_r1 = i0.ɵɵnextContext(); return i0.ɵɵresetView(ctx_r1.onSave()); });
80
- i0.ɵɵtext(30);
81
- i0.ɵɵelementEnd()()();
82
- } if (rf & 2) {
83
- const ctx_r1 = i0.ɵɵnextContext();
84
- i0.ɵɵproperty("title", ctx_r1.task ? "Edit Task" : "New Task")("width", 500)("height", 450);
85
- i0.ɵɵadvance(5);
86
- i0.ɵɵclassProp("error", ctx_r1.showValidation && !ctx_r1.formData.title);
87
- i0.ɵɵtwoWayProperty("ngModel", ctx_r1.formData.title);
88
- i0.ɵɵadvance();
89
- i0.ɵɵproperty("ngIf", ctx_r1.showValidation && !ctx_r1.formData.title);
90
- i0.ɵɵadvance(4);
91
- i0.ɵɵtwoWayProperty("ngModel", ctx_r1.formData.description);
92
- i0.ɵɵadvance(5);
93
- i0.ɵɵtwoWayProperty("ngModel", ctx_r1.formData.priority);
94
- i0.ɵɵproperty("data", ctx_r1.priorities)("textField", "label")("valueField", "value");
95
- i0.ɵɵadvance(4);
96
- i0.ɵɵtwoWayProperty("ngModel", ctx_r1.formData.status);
97
- i0.ɵɵproperty("data", ctx_r1.statuses)("textField", "label")("valueField", "value");
98
- i0.ɵɵadvance(4);
99
- i0.ɵɵtwoWayProperty("ngModel", ctx_r1.formData.dueDate);
100
- i0.ɵɵadvance();
101
- i0.ɵɵproperty("ngIf", ctx_r1.errorMessage);
102
- i0.ɵɵadvance();
103
- i0.ɵɵproperty("ngIf", ctx_r1.isSaving);
104
- i0.ɵɵadvance(2);
105
- i0.ɵɵproperty("disabled", ctx_r1.isSaving);
106
- i0.ɵɵadvance(2);
107
- i0.ɵɵproperty("primary", true)("disabled", ctx_r1.isSaving);
108
- i0.ɵɵadvance();
109
- i0.ɵɵtextInterpolate1(" ", ctx_r1.task ? "Update" : "Create", " ");
110
- } }
111
- export class TaskFormModalComponent {
112
- toastService;
113
- isVisible = false;
114
- task;
115
- conversationId;
116
- currentUser;
117
- saved = new EventEmitter();
118
- cancelled = new EventEmitter();
119
- formData = {
120
- title: '',
121
- description: '',
122
- priority: 'medium',
123
- status: 'pending',
124
- dueDate: null
125
- };
126
- priorities = [
127
- { value: 'low', label: 'Low' },
128
- { value: 'medium', label: 'Medium' },
129
- { value: 'high', label: 'High' },
130
- { value: 'urgent', label: 'Urgent' }
131
- ];
132
- statuses = [
133
- { value: 'pending', label: 'Pending' },
134
- { value: 'in_progress', label: 'In Progress' },
135
- { value: 'completed', label: 'Completed' },
136
- { value: 'cancelled', label: 'Cancelled' }
137
- ];
138
- showValidation = false;
139
- errorMessage = '';
140
- isSaving = false;
141
- constructor(toastService) {
142
- this.toastService = toastService;
143
- }
144
- ngOnChanges() {
145
- if (this.isVisible) {
146
- this.loadFormData();
147
- }
148
- }
149
- loadFormData() {
150
- if (this.task) {
151
- this.formData = {
152
- title: this.task.Name || '',
153
- description: this.task.Description || '',
154
- priority: 'medium', // Priority not used in Tasks entity
155
- status: (this.task.Status || 'Pending').toLowerCase().replace(' ', '_'),
156
- dueDate: this.task.DueAt ? new Date(this.task.DueAt) : null
157
- };
158
- }
159
- else {
160
- this.resetForm();
161
- }
162
- }
163
- async onSave() {
164
- this.showValidation = true;
165
- this.errorMessage = '';
166
- if (!this.formData.title.trim()) {
167
- return;
168
- }
169
- this.isSaving = true;
170
- try {
171
- const md = new Metadata();
172
- const taskEntity = this.task ||
173
- await md.GetEntityObject('MJ: Tasks', this.currentUser);
174
- taskEntity.Name = this.formData.title;
175
- taskEntity.Description = this.formData.description || '';
176
- // Priority field not available in Tasks entity
177
- const statusValue = this.capitalizeFirst(this.formData.status.replace('_', ' '));
178
- taskEntity.Status = statusValue;
179
- taskEntity.DueAt = this.formData.dueDate || null;
180
- if (!this.task) {
181
- taskEntity.ConversationDetailID = this.conversationId;
182
- taskEntity.PercentComplete = 0;
183
- }
184
- const saved = await taskEntity.Save();
185
- if (saved) {
186
- this.toastService.success(this.task ? 'Task updated successfully' : 'Task created successfully');
187
- this.saved.emit(taskEntity);
188
- this.resetForm();
189
- }
190
- else {
191
- this.errorMessage = 'Failed to save task';
192
- this.toastService.error(this.errorMessage);
193
- }
194
- }
195
- catch (error) {
196
- console.error('Error saving task:', error);
197
- this.errorMessage = error instanceof Error ? error.message : 'Failed to save task';
198
- this.toastService.error(this.errorMessage);
199
- }
200
- finally {
201
- this.isSaving = false;
202
- }
203
- }
204
- onCancel() {
205
- this.cancelled.emit();
206
- this.resetForm();
207
- }
208
- resetForm() {
209
- this.formData = {
210
- title: '',
211
- description: '',
212
- priority: 'medium',
213
- status: 'pending',
214
- dueDate: null
215
- };
216
- this.showValidation = false;
217
- this.errorMessage = '';
218
- this.isVisible = false;
219
- }
220
- capitalizeFirst(str) {
221
- return str.charAt(0).toUpperCase() + str.slice(1);
222
- }
223
- static ɵfac = function TaskFormModalComponent_Factory(t) { return new (t || TaskFormModalComponent)(i0.ɵɵdirectiveInject(i1.ToastService)); };
224
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: TaskFormModalComponent, selectors: [["mj-task-form-modal"]], inputs: { isVisible: "isVisible", task: "task", conversationId: "conversationId", currentUser: "currentUser" }, outputs: { saved: "saved", cancelled: "cancelled" }, features: [i0.ɵɵNgOnChangesFeature], decls: 1, vars: 1, consts: [[3, "title", "width", "height", "close", 4, "ngIf"], [3, "close", "title", "width", "height"], [1, "task-form-content"], [1, "form-group"], ["for", "task-title", 1, "required"], ["id", "task-title", "kendoTextBox", "", "placeholder", "Enter task title", 3, "ngModelChange", "keydown.enter", "ngModel"], ["class", "error-message", 4, "ngIf"], ["for", "task-description"], ["id", "task-description", "kendoTextArea", "", "placeholder", "Enter task description (optional)", "rows", "4", 3, "ngModelChange", "ngModel"], ["for", "task-priority"], ["id", "task-priority", 3, "ngModelChange", "ngModel", "data", "textField", "valueField"], ["for", "task-status"], ["id", "task-status", 3, "ngModelChange", "ngModel", "data", "textField", "valueField"], ["for", "task-due-date"], ["id", "task-due-date", 3, "ngModelChange", "ngModel"], ["class", "loading-indicator", 4, "ngIf"], ["kendoButton", "", 3, "click", "disabled"], ["kendoButton", "", 3, "click", "primary", "disabled"], [1, "error-message"], [1, "loading-indicator"], ["type", "infinite-spinner", "size", "medium"]], template: function TaskFormModalComponent_Template(rf, ctx) { if (rf & 1) {
225
- i0.ɵɵtemplate(0, TaskFormModalComponent_kendo_dialog_0_Template, 31, 23, "kendo-dialog", 0);
226
- } if (rf & 2) {
227
- i0.ɵɵproperty("ngIf", ctx.isVisible);
228
- } }, dependencies: [i2.NgIf, i3.DefaultValueAccessor, i3.NgControlStatus, i3.NgModel, i4.DialogComponent, i4.DialogActionsComponent, i5.ButtonComponent, i6.TextAreaDirective, i6.TextBoxDirective, i7.LoaderComponent, i8.DropDownListComponent, i9.DatePickerComponent], styles: [".task-form-content[_ngcontent-%COMP%] {\n padding: 20px;\n }\n\n .form-group[_ngcontent-%COMP%] {\n margin-bottom: 20px;\n }\n\n .form-group[_ngcontent-%COMP%] label[_ngcontent-%COMP%] {\n display: block;\n margin-bottom: 5px;\n font-weight: 500;\n }\n\n .form-group[_ngcontent-%COMP%] label.required[_ngcontent-%COMP%]::after {\n content: '*';\n color: #d32f2f;\n margin-left: 4px;\n }\n\n input[kendoTextBox][_ngcontent-%COMP%], \n textarea[kendoTextArea][_ngcontent-%COMP%], \n kendo-dropdownlist[_ngcontent-%COMP%], \n kendo-datepicker[_ngcontent-%COMP%] {\n width: 100%;\n }\n\n .error[_ngcontent-%COMP%] {\n border-color: #d32f2f;\n }\n\n .error-message[_ngcontent-%COMP%] {\n display: block;\n color: #d32f2f;\n font-size: 12px;\n margin-top: 5px;\n }\n\n .loading-indicator[_ngcontent-%COMP%] {\n display: flex;\n align-items: center;\n gap: 10px;\n margin-top: 15px;\n color: #666;\n }\n\n kendo-dialog-actions[_ngcontent-%COMP%] {\n display: flex;\n justify-content: flex-end;\n gap: 10px;\n padding: 15px 20px;\n border-top: 1px solid #e0e0e0;\n }"] });
229
- }
230
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(TaskFormModalComponent, [{
231
- type: Component,
232
- args: [{ selector: 'mj-task-form-modal', template: `
233
- <kendo-dialog
234
- *ngIf="isVisible"
235
- [title]="task ? 'Edit Task' : 'New Task'"
236
- [width]="500"
237
- [height]="450"
238
- (close)="onCancel()">
239
-
240
- <div class="task-form-content">
241
- <div class="form-group">
242
- <label for="task-title" class="required">Title</label>
243
- <input
244
- id="task-title"
245
- kendoTextBox
246
- [(ngModel)]="formData.title"
247
- placeholder="Enter task title"
248
- [class.error]="showValidation && !formData.title"
249
- (keydown.enter)="onSave()"
250
- />
251
- <span class="error-message" *ngIf="showValidation && !formData.title">
252
- Title is required
253
- </span>
254
- </div>
255
-
256
- <div class="form-group">
257
- <label for="task-description">Description</label>
258
- <textarea
259
- id="task-description"
260
- kendoTextArea
261
- [(ngModel)]="formData.description"
262
- placeholder="Enter task description (optional)"
263
- rows="4">
264
- </textarea>
265
- </div>
266
-
267
- <div class="form-group">
268
- <label for="task-priority">Priority</label>
269
- <kendo-dropdownlist
270
- id="task-priority"
271
- [(ngModel)]="formData.priority"
272
- [data]="priorities"
273
- [textField]="'label'"
274
- [valueField]="'value'">
275
- </kendo-dropdownlist>
276
- </div>
277
-
278
- <div class="form-group">
279
- <label for="task-status">Status</label>
280
- <kendo-dropdownlist
281
- id="task-status"
282
- [(ngModel)]="formData.status"
283
- [data]="statuses"
284
- [textField]="'label'"
285
- [valueField]="'value'">
286
- </kendo-dropdownlist>
287
- </div>
288
-
289
- <div class="form-group">
290
- <label for="task-due-date">Due Date</label>
291
- <kendo-datepicker
292
- id="task-due-date"
293
- [(ngModel)]="formData.dueDate">
294
- </kendo-datepicker>
295
- </div>
296
-
297
- <div class="error-message" *ngIf="errorMessage">
298
- {{ errorMessage }}
299
- </div>
300
-
301
- <div class="loading-indicator" *ngIf="isSaving">
302
- <kendo-loader type="infinite-spinner" size="medium"></kendo-loader>
303
- <span>Saving task...</span>
304
- </div>
305
- </div>
306
-
307
- <kendo-dialog-actions>
308
- <button kendoButton [disabled]="isSaving" (click)="onCancel()">Cancel</button>
309
- <button kendoButton [primary]="true" [disabled]="isSaving" (click)="onSave()">
310
- {{ task ? 'Update' : 'Create' }}
311
- </button>
312
- </kendo-dialog-actions>
313
- </kendo-dialog>
314
- `, styles: ["\n .task-form-content {\n padding: 20px;\n }\n\n .form-group {\n margin-bottom: 20px;\n }\n\n .form-group label {\n display: block;\n margin-bottom: 5px;\n font-weight: 500;\n }\n\n .form-group label.required::after {\n content: '*';\n color: #d32f2f;\n margin-left: 4px;\n }\n\n input[kendoTextBox],\n textarea[kendoTextArea],\n kendo-dropdownlist,\n kendo-datepicker {\n width: 100%;\n }\n\n .error {\n border-color: #d32f2f;\n }\n\n .error-message {\n display: block;\n color: #d32f2f;\n font-size: 12px;\n margin-top: 5px;\n }\n\n .loading-indicator {\n display: flex;\n align-items: center;\n gap: 10px;\n margin-top: 15px;\n color: #666;\n }\n\n kendo-dialog-actions {\n display: flex;\n justify-content: flex-end;\n gap: 10px;\n padding: 15px 20px;\n border-top: 1px solid #e0e0e0;\n }\n "] }]
315
- }], () => [{ type: i1.ToastService }], { isVisible: [{
316
- type: Input
317
- }], task: [{
318
- type: Input
319
- }], conversationId: [{
320
- type: Input
321
- }], currentUser: [{
322
- type: Input
323
- }], saved: [{
324
- type: Output
325
- }], cancelled: [{
326
- type: Output
327
- }] }); })();
328
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(TaskFormModalComponent, { className: "TaskFormModalComponent", filePath: "src/lib/components/task/task-form-modal.component.ts", lineNumber: 147 }); })();
329
- //# sourceMappingURL=task-form-modal.component.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"task-form-modal.component.js","sourceRoot":"","sources":["../../../../src/lib/components/task/task-form-modal.component.ts"],"names":[],"mappings":"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"}
@@ -1,22 +0,0 @@
1
- import { EventEmitter } from '@angular/core';
2
- import { TaskEntity } from '@memberjunction/core-entities';
3
- import * as i0 from "@angular/core";
4
- type DueDateStatus = 'overdue' | 'due-soon' | 'future' | 'completed' | 'none';
5
- export declare class TaskItemComponent {
6
- task: TaskEntity;
7
- disabled: boolean;
8
- statusToggled: EventEmitter<TaskEntity>;
9
- editRequested: EventEmitter<TaskEntity>;
10
- deleteRequested: EventEmitter<TaskEntity>;
11
- onToggleStatus(): void;
12
- onEdit(): void;
13
- onDelete(): void;
14
- getDueDateStatus(): DueDateStatus;
15
- getDueDateIcon(): string;
16
- getRelativeDueDate(): string;
17
- getDueDateTooltip(): string;
18
- static ɵfac: i0.ɵɵFactoryDeclaration<TaskItemComponent, never>;
19
- static ɵcmp: i0.ɵɵComponentDeclaration<TaskItemComponent, "mj-task-item", never, { "task": { "alias": "task"; "required": false; }; "disabled": { "alias": "disabled"; "required": false; }; }, { "statusToggled": "statusToggled"; "editRequested": "editRequested"; "deleteRequested": "deleteRequested"; }, never, never, false, never>;
20
- }
21
- export {};
22
- //# sourceMappingURL=task-item.component.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"task-item.component.d.ts","sourceRoot":"","sources":["../../../../src/lib/components/task/task-item.component.ts"],"names":[],"mappings":"AAAA,OAAO,EAA4B,YAAY,EAAE,MAAM,eAAe,CAAC;AACvE,OAAO,EAAE,UAAU,EAAE,MAAM,+BAA+B,CAAC;;AAE3D,KAAK,aAAa,GAAG,SAAS,GAAG,UAAU,GAAG,QAAQ,GAAG,WAAW,GAAG,MAAM,CAAC;AAE9E,qBA6Ea,iBAAiB;IACnB,IAAI,EAAG,UAAU,CAAC;IAClB,QAAQ,EAAE,OAAO,CAAS;IAEzB,aAAa,2BAAkC;IAC/C,aAAa,2BAAkC;IAC/C,eAAe,2BAAkC;IAE3D,cAAc,IAAI,IAAI;IAItB,MAAM,IAAI,IAAI;IAId,QAAQ,IAAI,IAAI;IAIhB,gBAAgB,IAAI,aAAa;IAuBjC,cAAc,IAAI,MAAM;IAiBxB,kBAAkB,IAAI,MAAM;IA6C5B,iBAAiB,IAAI,MAAM;yCAzGhB,iBAAiB;2CAAjB,iBAAiB;CAwH7B"}
@@ -1,234 +0,0 @@
1
- import { Component, Input, Output, EventEmitter } from '@angular/core';
2
- import * as i0 from "@angular/core";
3
- function TaskItemComponent_Conditional_9_Template(rf, ctx) { if (rf & 1) {
4
- i0.ɵɵelementStart(0, "span", 14);
5
- i0.ɵɵelement(1, "i");
6
- i0.ɵɵelementStart(2, "span", 15);
7
- i0.ɵɵtext(3);
8
- i0.ɵɵelementEnd()();
9
- } if (rf & 2) {
10
- const ctx_r0 = i0.ɵɵnextContext();
11
- i0.ɵɵclassMap("due-" + ctx_r0.getDueDateStatus());
12
- i0.ɵɵproperty("title", ctx_r0.getDueDateTooltip());
13
- i0.ɵɵadvance();
14
- i0.ɵɵclassMap(ctx_r0.getDueDateIcon());
15
- i0.ɵɵadvance(2);
16
- i0.ɵɵtextInterpolate(ctx_r0.getRelativeDueDate());
17
- } }
18
- function TaskItemComponent_Conditional_10_Template(rf, ctx) { if (rf & 1) {
19
- i0.ɵɵelementStart(0, "span", 8);
20
- i0.ɵɵtext(1);
21
- i0.ɵɵelementEnd();
22
- } if (rf & 2) {
23
- const ctx_r0 = i0.ɵɵnextContext();
24
- i0.ɵɵadvance();
25
- i0.ɵɵtextInterpolate1(" ", ctx_r0.task.PercentComplete, "% ");
26
- } }
27
- export class TaskItemComponent {
28
- task;
29
- disabled = false;
30
- statusToggled = new EventEmitter();
31
- editRequested = new EventEmitter();
32
- deleteRequested = new EventEmitter();
33
- onToggleStatus() {
34
- this.statusToggled.emit(this.task);
35
- }
36
- onEdit() {
37
- this.editRequested.emit(this.task);
38
- }
39
- onDelete() {
40
- this.deleteRequested.emit(this.task);
41
- }
42
- getDueDateStatus() {
43
- if (!this.task.DueAt) {
44
- return 'none';
45
- }
46
- if (this.task.Status === 'Complete') {
47
- return 'completed';
48
- }
49
- const now = new Date();
50
- const dueDate = new Date(this.task.DueAt);
51
- const diffMs = dueDate.getTime() - now.getTime();
52
- const diffHours = diffMs / (1000 * 60 * 60);
53
- if (diffMs < 0) {
54
- return 'overdue';
55
- }
56
- else if (diffHours < 24) {
57
- return 'due-soon';
58
- }
59
- else {
60
- return 'future';
61
- }
62
- }
63
- getDueDateIcon() {
64
- const status = this.getDueDateStatus();
65
- switch (status) {
66
- case 'overdue':
67
- return 'fa-solid fa-exclamation-circle';
68
- case 'due-soon':
69
- return 'fa-solid fa-clock';
70
- case 'future':
71
- return 'fa-solid fa-calendar-check';
72
- case 'completed':
73
- return 'fa-solid fa-check-circle';
74
- default:
75
- return 'fa-solid fa-calendar';
76
- }
77
- }
78
- getRelativeDueDate() {
79
- if (!this.task.DueAt) {
80
- return '';
81
- }
82
- const now = new Date();
83
- const dueDate = new Date(this.task.DueAt);
84
- const diffMs = dueDate.getTime() - now.getTime();
85
- const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));
86
- const diffHours = Math.floor(diffMs / (1000 * 60 * 60));
87
- if (this.task.Status === 'Complete') {
88
- return 'Completed';
89
- }
90
- if (diffMs < 0) {
91
- const absDays = Math.abs(diffDays);
92
- if (absDays === 0) {
93
- return 'Overdue (today)';
94
- }
95
- else if (absDays === 1) {
96
- return 'Overdue by 1 day';
97
- }
98
- else {
99
- return `Overdue by ${absDays} days`;
100
- }
101
- }
102
- else if (diffHours < 1) {
103
- const diffMinutes = Math.floor(diffMs / (1000 * 60));
104
- return `Due in ${diffMinutes} min`;
105
- }
106
- else if (diffHours < 24) {
107
- return `Due in ${diffHours} hours`;
108
- }
109
- else if (diffDays === 0) {
110
- return 'Due today';
111
- }
112
- else if (diffDays === 1) {
113
- return 'Due tomorrow';
114
- }
115
- else if (diffDays < 7) {
116
- return `Due in ${diffDays} days`;
117
- }
118
- else {
119
- const weeks = Math.floor(diffDays / 7);
120
- if (weeks === 1) {
121
- return 'Due in 1 week';
122
- }
123
- else {
124
- return `Due in ${weeks} weeks`;
125
- }
126
- }
127
- }
128
- getDueDateTooltip() {
129
- if (!this.task.DueAt) {
130
- return '';
131
- }
132
- const dueDate = new Date(this.task.DueAt);
133
- return dueDate.toLocaleString('en-US', {
134
- weekday: 'long',
135
- year: 'numeric',
136
- month: 'long',
137
- day: 'numeric',
138
- hour: '2-digit',
139
- minute: '2-digit'
140
- });
141
- }
142
- static ɵfac = function TaskItemComponent_Factory(t) { return new (t || TaskItemComponent)(); };
143
- static ɵcmp = /*@__PURE__*/ i0.ɵɵdefineComponent({ type: TaskItemComponent, selectors: [["mj-task-item"]], inputs: { task: "task", disabled: "disabled" }, outputs: { statusToggled: "statusToggled", editRequested: "editRequested", deleteRequested: "deleteRequested" }, decls: 16, vars: 10, consts: [[1, "task-item"], [1, "task-checkbox"], ["type", "checkbox", 3, "change", "checked", "disabled"], [1, "task-content"], [1, "task-title"], [1, "task-meta"], [1, "task-status-badge"], [1, "task-due", 3, "class", "title"], [1, "task-percent"], [1, "task-actions"], ["title", "Edit Task", 1, "task-action-btn", 3, "click"], [1, "fa-solid", "fa-edit"], ["title", "Delete Task", 1, "task-action-btn", 3, "click"], [1, "fa-solid", "fa-trash"], [1, "task-due", 3, "title"], [1, "due-date-text"]], template: function TaskItemComponent_Template(rf, ctx) { if (rf & 1) {
144
- i0.ɵɵelementStart(0, "div", 0)(1, "div", 1)(2, "input", 2);
145
- i0.ɵɵlistener("change", function TaskItemComponent_Template_input_change_2_listener() { return ctx.onToggleStatus(); });
146
- i0.ɵɵelementEnd()();
147
- i0.ɵɵelementStart(3, "div", 3)(4, "div", 4);
148
- i0.ɵɵtext(5);
149
- i0.ɵɵelementEnd();
150
- i0.ɵɵelementStart(6, "div", 5)(7, "span", 6);
151
- i0.ɵɵtext(8);
152
- i0.ɵɵelementEnd();
153
- i0.ɵɵtemplate(9, TaskItemComponent_Conditional_9_Template, 4, 6, "span", 7)(10, TaskItemComponent_Conditional_10_Template, 2, 1, "span", 8);
154
- i0.ɵɵelementEnd()();
155
- i0.ɵɵelementStart(11, "div", 9)(12, "button", 10);
156
- i0.ɵɵlistener("click", function TaskItemComponent_Template_button_click_12_listener() { return ctx.onEdit(); });
157
- i0.ɵɵelement(13, "i", 11);
158
- i0.ɵɵelementEnd();
159
- i0.ɵɵelementStart(14, "button", 12);
160
- i0.ɵɵlistener("click", function TaskItemComponent_Template_button_click_14_listener() { return ctx.onDelete(); });
161
- i0.ɵɵelement(15, "i", 13);
162
- i0.ɵɵelementEnd()()();
163
- } if (rf & 2) {
164
- i0.ɵɵclassProp("completed", ctx.task.Status === "Complete");
165
- i0.ɵɵadvance(2);
166
- i0.ɵɵproperty("checked", ctx.task.Status === "Complete")("disabled", ctx.disabled);
167
- i0.ɵɵadvance(3);
168
- i0.ɵɵtextInterpolate(ctx.task.Name);
169
- i0.ɵɵadvance(2);
170
- i0.ɵɵclassMap("status-" + ctx.task.Status.toLowerCase().replace(" ", "-"));
171
- i0.ɵɵadvance();
172
- i0.ɵɵtextInterpolate1(" ", ctx.task.Status, " ");
173
- i0.ɵɵadvance();
174
- i0.ɵɵconditional(ctx.task.DueAt ? 9 : -1);
175
- i0.ɵɵadvance();
176
- i0.ɵɵconditional(ctx.task.PercentComplete != null ? 10 : -1);
177
- } }, styles: [".task-item[_ngcontent-%COMP%] { display: flex; align-items: center; gap: 12px; padding: 12px; border-bottom: 1px solid #E8E8E8; transition: background 150ms ease; }\n .task-item[_ngcontent-%COMP%]:hover { background: #F9F9F9; }\n .task-item.completed[_ngcontent-%COMP%] { opacity: 0.6; }\n .task-item.completed[_ngcontent-%COMP%] .task-title[_ngcontent-%COMP%] { text-decoration: line-through; }\n .task-status-badge[_ngcontent-%COMP%] { padding: 2px 8px; border-radius: 3px; font-weight: 500; font-size: 11px; }\n .status-pending[_ngcontent-%COMP%] { background: #FFF3E0; color: #E65100; }\n .status-in-progress[_ngcontent-%COMP%] { background: #E3F2FD; color: #1976D2; }\n .status-complete[_ngcontent-%COMP%] { background: #E8F5E9; color: #388E3C; }\n .status-cancelled[_ngcontent-%COMP%] { background: #F5F5F5; color: #666; }\n .status-failed[_ngcontent-%COMP%] { background: #FFEBEE; color: #C62828; }\n .status-blocked[_ngcontent-%COMP%] { background: #FFEBEE; color: #D84315; }\n .status-deferred[_ngcontent-%COMP%] { background: #F5F5F5; color: #999; }\n .task-percent[_ngcontent-%COMP%] { color: #0076B6; font-weight: 500; }\n .task-checkbox[_ngcontent-%COMP%] input[_ngcontent-%COMP%] { width: 18px; height: 18px; cursor: pointer; }\n .task-content[_ngcontent-%COMP%] { flex: 1; }\n .task-title[_ngcontent-%COMP%] { font-size: 14px; margin-bottom: 4px; }\n .task-meta[_ngcontent-%COMP%] { display: flex; gap: 12px; font-size: 12px; color: #666; align-items: center; }\n .task-due[_ngcontent-%COMP%] { display: flex; align-items: center; gap: 4px; padding: 2px 8px; border-radius: 3px; font-weight: 500; }\n .task-due[_ngcontent-%COMP%] i[_ngcontent-%COMP%] { font-size: 11px; }\n .due-date-text[_ngcontent-%COMP%] { font-size: 11px; }\n\n \n\n .due-overdue[_ngcontent-%COMP%] { background: #FFEBEE; color: #C62828; }\n .due-due-soon[_ngcontent-%COMP%] { background: #FFF3E0; color: #E65100; }\n .due-future[_ngcontent-%COMP%] { background: #E8F5E9; color: #388E3C; }\n .due-completed[_ngcontent-%COMP%] { background: #F5F5F5; color: #757575; }\n\n .task-actions[_ngcontent-%COMP%] { display: none; gap: 4px; }\n .task-item[_ngcontent-%COMP%]:hover .task-actions[_ngcontent-%COMP%] { display: flex; }\n .task-action-btn[_ngcontent-%COMP%] { padding: 6px; background: transparent; border: none; cursor: pointer; border-radius: 3px; color: #666; }\n .task-action-btn[_ngcontent-%COMP%]:hover { background: rgba(0,0,0,0.1); }"] });
178
- }
179
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassMetadata(TaskItemComponent, [{
180
- type: Component,
181
- args: [{ selector: 'mj-task-item', template: `
182
- <div class="task-item" [class.completed]="task.Status === 'Complete'">
183
- <div class="task-checkbox">
184
- <input
185
- type="checkbox"
186
- [checked]="task.Status === 'Complete'"
187
- (change)="onToggleStatus()"
188
- [disabled]="disabled">
189
- </div>
190
- <div class="task-content">
191
- <div class="task-title">{{ task.Name }}</div>
192
- <div class="task-meta">
193
- <span class="task-status-badge" [class]="'status-' + task.Status.toLowerCase().replace(' ', '-')">
194
- {{ task.Status }}
195
- </span>
196
- @if (task.DueAt) {
197
- <span
198
- class="task-due"
199
- [class]="'due-' + getDueDateStatus()"
200
- [title]="getDueDateTooltip()">
201
- <i [class]="getDueDateIcon()"></i>
202
- <span class="due-date-text">{{ getRelativeDueDate() }}</span>
203
- </span>
204
- }
205
- @if (task.PercentComplete != null) {
206
- <span class="task-percent">
207
- {{ task.PercentComplete }}%
208
- </span>
209
- }
210
- </div>
211
- </div>
212
- <div class="task-actions">
213
- <button class="task-action-btn" (click)="onEdit()" title="Edit Task">
214
- <i class="fa-solid fa-edit"></i>
215
- </button>
216
- <button class="task-action-btn" (click)="onDelete()" title="Delete Task">
217
- <i class="fa-solid fa-trash"></i>
218
- </button>
219
- </div>
220
- </div>
221
- `, styles: ["\n .task-item { display: flex; align-items: center; gap: 12px; padding: 12px; border-bottom: 1px solid #E8E8E8; transition: background 150ms ease; }\n .task-item:hover { background: #F9F9F9; }\n .task-item.completed { opacity: 0.6; }\n .task-item.completed .task-title { text-decoration: line-through; }\n .task-status-badge { padding: 2px 8px; border-radius: 3px; font-weight: 500; font-size: 11px; }\n .status-pending { background: #FFF3E0; color: #E65100; }\n .status-in-progress { background: #E3F2FD; color: #1976D2; }\n .status-complete { background: #E8F5E9; color: #388E3C; }\n .status-cancelled { background: #F5F5F5; color: #666; }\n .status-failed { background: #FFEBEE; color: #C62828; }\n .status-blocked { background: #FFEBEE; color: #D84315; }\n .status-deferred { background: #F5F5F5; color: #999; }\n .task-percent { color: #0076B6; font-weight: 500; }\n .task-checkbox input { width: 18px; height: 18px; cursor: pointer; }\n .task-content { flex: 1; }\n .task-title { font-size: 14px; margin-bottom: 4px; }\n .task-meta { display: flex; gap: 12px; font-size: 12px; color: #666; align-items: center; }\n .task-due { display: flex; align-items: center; gap: 4px; padding: 2px 8px; border-radius: 3px; font-weight: 500; }\n .task-due i { font-size: 11px; }\n .due-date-text { font-size: 11px; }\n\n /* Due date status colors */\n .due-overdue { background: #FFEBEE; color: #C62828; }\n .due-due-soon { background: #FFF3E0; color: #E65100; }\n .due-future { background: #E8F5E9; color: #388E3C; }\n .due-completed { background: #F5F5F5; color: #757575; }\n\n .task-actions { display: none; gap: 4px; }\n .task-item:hover .task-actions { display: flex; }\n .task-action-btn { padding: 6px; background: transparent; border: none; cursor: pointer; border-radius: 3px; color: #666; }\n .task-action-btn:hover { background: rgba(0,0,0,0.1); }\n "] }]
222
- }], null, { task: [{
223
- type: Input
224
- }], disabled: [{
225
- type: Input
226
- }], statusToggled: [{
227
- type: Output
228
- }], editRequested: [{
229
- type: Output
230
- }], deleteRequested: [{
231
- type: Output
232
- }] }); })();
233
- (() => { (typeof ngDevMode === "undefined" || ngDevMode) && i0.ɵsetClassDebugInfo(TaskItemComponent, { className: "TaskItemComponent", filePath: "src/lib/components/task/task-item.component.ts", lineNumber: 83 }); })();
234
- //# sourceMappingURL=task-item.component.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"task-item.component.js","sourceRoot":"","sources":["../../../../src/lib/components/task/task-item.component.ts"],"names":[],"mappings":"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"}