@flusys/ng-task-manager 5.4.1 → 5.5.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.
|
@@ -5,37 +5,34 @@ import { firstValueFrom, Subject } from 'rxjs';
|
|
|
5
5
|
import { io } from 'socket.io-client';
|
|
6
6
|
import { APP_CONFIG } from '@flusys/ng-core';
|
|
7
7
|
import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
|
|
8
|
-
import * as
|
|
8
|
+
import * as i8 from '@angular/common';
|
|
9
9
|
import { DatePipe } from '@angular/common';
|
|
10
10
|
import * as i1 from 'primeng/tag';
|
|
11
11
|
import { TagModule } from 'primeng/tag';
|
|
12
12
|
import * as i2 from 'primeng/tooltip';
|
|
13
13
|
import { TooltipModule } from 'primeng/tooltip';
|
|
14
|
-
import * as
|
|
14
|
+
import * as i2$1 from '@angular/forms';
|
|
15
15
|
import { FormsModule } from '@angular/forms';
|
|
16
|
-
import * as
|
|
16
|
+
import * as i2$2 from 'primeng/button';
|
|
17
17
|
import { ButtonModule } from 'primeng/button';
|
|
18
|
-
import * as
|
|
18
|
+
import * as i6 from 'primeng/datepicker';
|
|
19
19
|
import { DatePickerModule } from 'primeng/datepicker';
|
|
20
20
|
import * as i1$1 from 'primeng/dialog';
|
|
21
21
|
import { DialogModule } from 'primeng/dialog';
|
|
22
|
-
import * as
|
|
22
|
+
import * as i3 from 'primeng/inputtext';
|
|
23
23
|
import { InputTextModule } from 'primeng/inputtext';
|
|
24
|
-
import * as
|
|
25
|
-
import { MultiSelectModule } from 'primeng/multiselect';
|
|
26
|
-
import * as i5 from 'primeng/textarea';
|
|
27
|
-
import { TextareaModule } from 'primeng/textarea';
|
|
28
|
-
import * as i6 from 'primeng/select';
|
|
24
|
+
import * as i5 from 'primeng/select';
|
|
29
25
|
import { SelectModule } from 'primeng/select';
|
|
30
|
-
import * as
|
|
31
|
-
import {
|
|
26
|
+
import * as i4 from 'primeng/textarea';
|
|
27
|
+
import { TextareaModule } from 'primeng/textarea';
|
|
32
28
|
import * as i1$2 from 'primeng/drawer';
|
|
33
29
|
import { DrawerModule } from 'primeng/drawer';
|
|
34
30
|
import { Router } from '@angular/router';
|
|
35
|
-
import * as
|
|
31
|
+
import * as i5$1 from 'primeng/skeleton';
|
|
36
32
|
import * as i1$3 from '@angular/cdk/drag-drop';
|
|
37
33
|
import { moveItemInArray, transferArrayItem, DragDropModule } from '@angular/cdk/drag-drop';
|
|
38
|
-
import
|
|
34
|
+
import { ConfirmationService, MessageService } from 'primeng/api';
|
|
35
|
+
import * as i8$1 from 'primeng/table';
|
|
39
36
|
|
|
40
37
|
class TaskBoardApiService extends ApiResourceService {
|
|
41
38
|
constructor() {
|
|
@@ -53,10 +50,10 @@ class TaskBoardApiService extends ApiResourceService {
|
|
|
53
50
|
userId,
|
|
54
51
|
}));
|
|
55
52
|
}
|
|
56
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
57
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
53
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: TaskBoardApiService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
54
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: TaskBoardApiService, providedIn: 'root' });
|
|
58
55
|
}
|
|
59
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
56
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: TaskBoardApiService, decorators: [{
|
|
60
57
|
type: Injectable,
|
|
61
58
|
args: [{ providedIn: 'root' }]
|
|
62
59
|
}], ctorParameters: () => [] });
|
|
@@ -68,10 +65,10 @@ class TaskApiService extends ApiResourceService {
|
|
|
68
65
|
moveTask(dto) {
|
|
69
66
|
return firstValueFrom(this.http.post(`${this.baseUrl}/move`, dto));
|
|
70
67
|
}
|
|
71
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
72
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
68
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: TaskApiService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
69
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: TaskApiService, providedIn: 'root' });
|
|
73
70
|
}
|
|
74
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
71
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: TaskApiService, decorators: [{
|
|
75
72
|
type: Injectable,
|
|
76
73
|
args: [{ providedIn: 'root' }]
|
|
77
74
|
}], ctorParameters: () => [] });
|
|
@@ -85,10 +82,10 @@ class TaskListApiService extends ApiResourceService {
|
|
|
85
82
|
reorderLists(dto) {
|
|
86
83
|
return firstValueFrom(this.http.post(`${this.baseUrl}/reorder`, dto));
|
|
87
84
|
}
|
|
88
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
89
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
85
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: TaskListApiService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
86
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: TaskListApiService, providedIn: 'root' });
|
|
90
87
|
}
|
|
91
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
88
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: TaskListApiService, decorators: [{
|
|
92
89
|
type: Injectable,
|
|
93
90
|
args: [{ providedIn: 'root' }]
|
|
94
91
|
}], ctorParameters: () => [] });
|
|
@@ -96,10 +93,10 @@ class TaskLabelApiService extends ApiResourceService {
|
|
|
96
93
|
constructor() {
|
|
97
94
|
super('label', 'taskManager');
|
|
98
95
|
}
|
|
99
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
100
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
96
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: TaskLabelApiService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
97
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: TaskLabelApiService, providedIn: 'root' });
|
|
101
98
|
}
|
|
102
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
99
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: TaskLabelApiService, decorators: [{
|
|
103
100
|
type: Injectable,
|
|
104
101
|
args: [{ providedIn: 'root' }]
|
|
105
102
|
}], ctorParameters: () => [] });
|
|
@@ -107,10 +104,10 @@ class TaskCommentApiService extends ApiResourceService {
|
|
|
107
104
|
constructor() {
|
|
108
105
|
super('comment', 'taskManager');
|
|
109
106
|
}
|
|
110
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
111
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
107
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: TaskCommentApiService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
108
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: TaskCommentApiService, providedIn: 'root' });
|
|
112
109
|
}
|
|
113
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
110
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: TaskCommentApiService, decorators: [{
|
|
114
111
|
type: Injectable,
|
|
115
112
|
args: [{ providedIn: 'root' }]
|
|
116
113
|
}], ctorParameters: () => [] });
|
|
@@ -118,7 +115,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
118
115
|
class TaskBoardSocketService {
|
|
119
116
|
socket = null;
|
|
120
117
|
appConfig = inject(APP_CONFIG);
|
|
121
|
-
_isConnected = signal(false,
|
|
118
|
+
_isConnected = signal(false, /* @ts-ignore */
|
|
119
|
+
...(ngDevMode ? [{ debugName: "_isConnected" }] : /* istanbul ignore next */ []));
|
|
122
120
|
isConnected = this._isConnected.asReadonly();
|
|
123
121
|
boardEvent$ = new Subject();
|
|
124
122
|
onBoardEvent = this.boardEvent$.asObservable();
|
|
@@ -157,10 +155,10 @@ class TaskBoardSocketService {
|
|
|
157
155
|
const services = this.appConfig.services;
|
|
158
156
|
return services?.['taskManager']?.socketUrl ?? this.appConfig.apiBaseUrl;
|
|
159
157
|
}
|
|
160
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
161
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
158
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: TaskBoardSocketService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
159
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: TaskBoardSocketService, providedIn: 'root' });
|
|
162
160
|
}
|
|
163
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
161
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: TaskBoardSocketService, decorators: [{
|
|
164
162
|
type: Injectable,
|
|
165
163
|
args: [{ providedIn: 'root' }]
|
|
166
164
|
}] });
|
|
@@ -172,15 +170,24 @@ class TaskBoardStateService {
|
|
|
172
170
|
labelApi = inject(TaskLabelApiService);
|
|
173
171
|
socketService = inject(TaskBoardSocketService);
|
|
174
172
|
destroyRef = inject(DestroyRef);
|
|
175
|
-
_boards = signal([],
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
173
|
+
_boards = signal([], /* @ts-ignore */
|
|
174
|
+
...(ngDevMode ? [{ debugName: "_boards" }] : /* istanbul ignore next */ []));
|
|
175
|
+
_activeBoard = signal(null, /* @ts-ignore */
|
|
176
|
+
...(ngDevMode ? [{ debugName: "_activeBoard" }] : /* istanbul ignore next */ []));
|
|
177
|
+
_lists = signal([], /* @ts-ignore */
|
|
178
|
+
...(ngDevMode ? [{ debugName: "_lists" }] : /* istanbul ignore next */ []));
|
|
179
|
+
_tasks = signal([], /* @ts-ignore */
|
|
180
|
+
...(ngDevMode ? [{ debugName: "_tasks" }] : /* istanbul ignore next */ []));
|
|
181
|
+
_labels = signal([], /* @ts-ignore */
|
|
182
|
+
...(ngDevMode ? [{ debugName: "_labels" }] : /* istanbul ignore next */ []));
|
|
183
|
+
_members = signal([], /* @ts-ignore */
|
|
184
|
+
...(ngDevMode ? [{ debugName: "_members" }] : /* istanbul ignore next */ []));
|
|
185
|
+
_selectedTask = signal(null, /* @ts-ignore */
|
|
186
|
+
...(ngDevMode ? [{ debugName: "_selectedTask" }] : /* istanbul ignore next */ []));
|
|
187
|
+
_isLoading = signal(false, /* @ts-ignore */
|
|
188
|
+
...(ngDevMode ? [{ debugName: "_isLoading" }] : /* istanbul ignore next */ []));
|
|
189
|
+
_isBoardLoading = signal(false, /* @ts-ignore */
|
|
190
|
+
...(ngDevMode ? [{ debugName: "_isBoardLoading" }] : /* istanbul ignore next */ []));
|
|
184
191
|
boards = this._boards.asReadonly();
|
|
185
192
|
activeBoard = this._activeBoard.asReadonly();
|
|
186
193
|
lists = this._lists.asReadonly();
|
|
@@ -198,15 +205,18 @@ class TaskBoardStateService {
|
|
|
198
205
|
map.set(task.listId, list);
|
|
199
206
|
}
|
|
200
207
|
return map;
|
|
201
|
-
},
|
|
208
|
+
}, /* @ts-ignore */
|
|
209
|
+
...(ngDevMode ? [{ debugName: "tasksByList" }] : /* istanbul ignore next */ []));
|
|
202
210
|
listsWithTasks = computed(() => this._lists()
|
|
203
211
|
.slice()
|
|
204
212
|
.sort((a, b) => a.position - b.position)
|
|
205
213
|
.map((list) => ({
|
|
206
214
|
...list,
|
|
207
215
|
tasks: (this.tasksByList().get(list.id) ?? []).slice().sort((a, b) => a.position - b.position),
|
|
208
|
-
})),
|
|
209
|
-
|
|
216
|
+
})), /* @ts-ignore */
|
|
217
|
+
...(ngDevMode ? [{ debugName: "listsWithTasks" }] : /* istanbul ignore next */ []));
|
|
218
|
+
hasActiveBoard = computed(() => this._activeBoard() !== null, /* @ts-ignore */
|
|
219
|
+
...(ngDevMode ? [{ debugName: "hasActiveBoard" }] : /* istanbul ignore next */ []));
|
|
210
220
|
isSocketConnected = this.socketService.isConnected;
|
|
211
221
|
constructor() {
|
|
212
222
|
this.socketService.onBoardEvent
|
|
@@ -368,10 +378,10 @@ class TaskBoardStateService {
|
|
|
368
378
|
}
|
|
369
379
|
}
|
|
370
380
|
}
|
|
371
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
372
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "
|
|
381
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: TaskBoardStateService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
382
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: TaskBoardStateService, providedIn: 'root' });
|
|
373
383
|
}
|
|
374
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
384
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: TaskBoardStateService, decorators: [{
|
|
375
385
|
type: Injectable,
|
|
376
386
|
args: [{ providedIn: 'root' }]
|
|
377
387
|
}], ctorParameters: () => [] });
|
|
@@ -421,26 +431,29 @@ function memberColorFromId(userId) {
|
|
|
421
431
|
}
|
|
422
432
|
|
|
423
433
|
class TaskCardComponent {
|
|
424
|
-
task = input.required(
|
|
434
|
+
task = input.required(/* @ts-ignore */
|
|
435
|
+
...(ngDevMode ? [{ debugName: "task" }] : /* istanbul ignore next */ []));
|
|
425
436
|
cardClick = output();
|
|
426
437
|
editClick = output();
|
|
427
438
|
deleteClick = output();
|
|
428
439
|
MAX_VISIBLE = 3;
|
|
429
|
-
visibleAssignees = computed(() => (this.task().assignees ?? []).slice(0, this.MAX_VISIBLE),
|
|
430
|
-
|
|
440
|
+
visibleAssignees = computed(() => (this.task().assignees ?? []).slice(0, this.MAX_VISIBLE), /* @ts-ignore */
|
|
441
|
+
...(ngDevMode ? [{ debugName: "visibleAssignees" }] : /* istanbul ignore next */ []));
|
|
442
|
+
overflowCount = computed(() => Math.max(0, (this.task().assignees ?? []).length - this.MAX_VISIBLE), /* @ts-ignore */
|
|
443
|
+
...(ngDevMode ? [{ debugName: "overflowCount" }] : /* istanbul ignore next */ []));
|
|
431
444
|
prioritySeverity = taskPrioritySeverity;
|
|
432
445
|
initials = memberInitials;
|
|
433
446
|
isOverdue = isTaskOverdue;
|
|
434
447
|
memberColor = memberColorFromId;
|
|
435
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
436
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
448
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: TaskCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
449
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: TaskCardComponent, isStandalone: true, selector: "tm-task-card", inputs: { task: { classPropertyName: "task", publicName: "task", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { cardClick: "cardClick", editClick: "editClick", deleteClick: "deleteClick" }, ngImport: i0, template: `
|
|
437
450
|
<div
|
|
438
|
-
class="task-card group relative rounded-
|
|
451
|
+
class="task-card group relative rounded-border border border-surface p-3 cursor-pointer shadow-sm hover:shadow-md transition-shadow"
|
|
439
452
|
(click)="cardClick.emit(task())"
|
|
440
453
|
>
|
|
441
454
|
<div class="absolute top-2 right-2 hidden group-hover:flex gap-0.5">
|
|
442
455
|
<button
|
|
443
|
-
class="w-6 h-6 flex items-center justify-center rounded text-surface-400 hover:text-primary-500 hover:bg-surface-
|
|
456
|
+
class="w-6 h-6 flex items-center justify-center rounded text-surface-400 hover:text-primary-500 hover:bg-surface-hover transition-colors"
|
|
444
457
|
[pTooltip]="'shared.edit' | translate"
|
|
445
458
|
tooltipPosition="top"
|
|
446
459
|
(click)="$event.stopPropagation(); editClick.emit(task())"
|
|
@@ -448,7 +461,7 @@ class TaskCardComponent {
|
|
|
448
461
|
<i class="pi pi-pencil text-xs"></i>
|
|
449
462
|
</button>
|
|
450
463
|
<button
|
|
451
|
-
class="w-6 h-6 flex items-center justify-center rounded text-surface-400 hover:text-red-500 hover:bg-surface-
|
|
464
|
+
class="w-6 h-6 flex items-center justify-center rounded text-surface-400 hover:text-red-500 hover:bg-surface-hover transition-colors"
|
|
452
465
|
[pTooltip]="'shared.delete' | translate"
|
|
453
466
|
tooltipPosition="top"
|
|
454
467
|
(click)="$event.stopPropagation(); deleteClick.emit(task())"
|
|
@@ -482,7 +495,7 @@ class TaskCardComponent {
|
|
|
482
495
|
|
|
483
496
|
@if (task().dueDate) {
|
|
484
497
|
<span
|
|
485
|
-
class="text-xs text-
|
|
498
|
+
class="text-xs text-muted-color"
|
|
486
499
|
[class.text-red-500]="isOverdue(task().dueDate!)"
|
|
487
500
|
>
|
|
488
501
|
{{ task().dueDate | date: 'MMM d' }}
|
|
@@ -493,7 +506,7 @@ class TaskCardComponent {
|
|
|
493
506
|
<div class="flex items-center -space-x-1.5">
|
|
494
507
|
@for (a of visibleAssignees(); track a.userId) {
|
|
495
508
|
<span
|
|
496
|
-
class="w-6 h-6 rounded-full flex items-center justify-center text-[10px] font-bold text-white flex-shrink-0 ring-2 ring-
|
|
509
|
+
class="w-6 h-6 rounded-full flex items-center justify-center text-[10px] font-bold text-white flex-shrink-0 ring-2 ring-surface-card"
|
|
497
510
|
[style.background-color]="memberColor(a.userId)"
|
|
498
511
|
[pTooltip]="a.userName ?? undefined"
|
|
499
512
|
>
|
|
@@ -502,7 +515,7 @@ class TaskCardComponent {
|
|
|
502
515
|
}
|
|
503
516
|
@if (overflowCount() > 0) {
|
|
504
517
|
<span
|
|
505
|
-
class="w-6 h-6 rounded-full bg-surface-200 dark:bg-surface-700 text-surface-600 dark:text-surface-300 flex items-center justify-center text-[10px] font-bold flex-shrink-0 ring-2 ring-
|
|
518
|
+
class="w-6 h-6 rounded-full bg-surface-200 dark:bg-surface-700 text-surface-600 dark:text-surface-300 flex items-center justify-center text-[10px] font-bold flex-shrink-0 ring-2 ring-surface-card"
|
|
506
519
|
>
|
|
507
520
|
+{{ overflowCount() }}
|
|
508
521
|
</span>
|
|
@@ -511,21 +524,21 @@ class TaskCardComponent {
|
|
|
511
524
|
}
|
|
512
525
|
</div>
|
|
513
526
|
</div>
|
|
514
|
-
`, isInline: true, dependencies: [{ kind: "ngmodule", type: TagModule }, { kind: "component", type: i1.Tag, selector: "p-tag", inputs: ["
|
|
527
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: TagModule }, { kind: "component", type: i1.Tag, selector: "p-tag", inputs: ["severity", "value", "icon", "rounded"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i2.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "showOnEllipsis", "pTooltip", "tooltipDisabled", "tooltipOptions", "appendTo", "pTooltipPT", "pTooltipUnstyled"] }, { kind: "pipe", type: DatePipe, name: "date" }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
|
|
515
528
|
}
|
|
516
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
529
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: TaskCardComponent, decorators: [{
|
|
517
530
|
type: Component,
|
|
518
531
|
args: [{
|
|
519
532
|
selector: 'tm-task-card',
|
|
520
533
|
imports: [TagModule, TooltipModule, DatePipe, TranslatePipe],
|
|
521
534
|
template: `
|
|
522
535
|
<div
|
|
523
|
-
class="task-card group relative rounded-
|
|
536
|
+
class="task-card group relative rounded-border border border-surface p-3 cursor-pointer shadow-sm hover:shadow-md transition-shadow"
|
|
524
537
|
(click)="cardClick.emit(task())"
|
|
525
538
|
>
|
|
526
539
|
<div class="absolute top-2 right-2 hidden group-hover:flex gap-0.5">
|
|
527
540
|
<button
|
|
528
|
-
class="w-6 h-6 flex items-center justify-center rounded text-surface-400 hover:text-primary-500 hover:bg-surface-
|
|
541
|
+
class="w-6 h-6 flex items-center justify-center rounded text-surface-400 hover:text-primary-500 hover:bg-surface-hover transition-colors"
|
|
529
542
|
[pTooltip]="'shared.edit' | translate"
|
|
530
543
|
tooltipPosition="top"
|
|
531
544
|
(click)="$event.stopPropagation(); editClick.emit(task())"
|
|
@@ -533,7 +546,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
533
546
|
<i class="pi pi-pencil text-xs"></i>
|
|
534
547
|
</button>
|
|
535
548
|
<button
|
|
536
|
-
class="w-6 h-6 flex items-center justify-center rounded text-surface-400 hover:text-red-500 hover:bg-surface-
|
|
549
|
+
class="w-6 h-6 flex items-center justify-center rounded text-surface-400 hover:text-red-500 hover:bg-surface-hover transition-colors"
|
|
537
550
|
[pTooltip]="'shared.delete' | translate"
|
|
538
551
|
tooltipPosition="top"
|
|
539
552
|
(click)="$event.stopPropagation(); deleteClick.emit(task())"
|
|
@@ -567,7 +580,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
567
580
|
|
|
568
581
|
@if (task().dueDate) {
|
|
569
582
|
<span
|
|
570
|
-
class="text-xs text-
|
|
583
|
+
class="text-xs text-muted-color"
|
|
571
584
|
[class.text-red-500]="isOverdue(task().dueDate!)"
|
|
572
585
|
>
|
|
573
586
|
{{ task().dueDate | date: 'MMM d' }}
|
|
@@ -578,7 +591,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
578
591
|
<div class="flex items-center -space-x-1.5">
|
|
579
592
|
@for (a of visibleAssignees(); track a.userId) {
|
|
580
593
|
<span
|
|
581
|
-
class="w-6 h-6 rounded-full flex items-center justify-center text-[10px] font-bold text-white flex-shrink-0 ring-2 ring-
|
|
594
|
+
class="w-6 h-6 rounded-full flex items-center justify-center text-[10px] font-bold text-white flex-shrink-0 ring-2 ring-surface-card"
|
|
582
595
|
[style.background-color]="memberColor(a.userId)"
|
|
583
596
|
[pTooltip]="a.userName ?? undefined"
|
|
584
597
|
>
|
|
@@ -587,7 +600,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
587
600
|
}
|
|
588
601
|
@if (overflowCount() > 0) {
|
|
589
602
|
<span
|
|
590
|
-
class="w-6 h-6 rounded-full bg-surface-200 dark:bg-surface-700 text-surface-600 dark:text-surface-300 flex items-center justify-center text-[10px] font-bold flex-shrink-0 ring-2 ring-
|
|
603
|
+
class="w-6 h-6 rounded-full bg-surface-200 dark:bg-surface-700 text-surface-600 dark:text-surface-300 flex items-center justify-center text-[10px] font-bold flex-shrink-0 ring-2 ring-surface-card"
|
|
591
604
|
>
|
|
592
605
|
+{{ overflowCount() }}
|
|
593
606
|
</span>
|
|
@@ -601,21 +614,28 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
601
614
|
}], propDecorators: { task: [{ type: i0.Input, args: [{ isSignal: true, alias: "task", required: true }] }], cardClick: [{ type: i0.Output, args: ["cardClick"] }], editClick: [{ type: i0.Output, args: ["editClick"] }], deleteClick: [{ type: i0.Output, args: ["deleteClick"] }] } });
|
|
602
615
|
|
|
603
616
|
const PRIORITY_OPTIONS = [
|
|
604
|
-
{
|
|
605
|
-
{
|
|
606
|
-
{
|
|
607
|
-
{
|
|
617
|
+
{ labelKey: 'task.priority.LOW', value: 'LOW' },
|
|
618
|
+
{ labelKey: 'task.priority.MEDIUM', value: 'MEDIUM' },
|
|
619
|
+
{ labelKey: 'task.priority.HIGH', value: 'HIGH' },
|
|
620
|
+
{ labelKey: 'task.priority.URGENT', value: 'URGENT' },
|
|
608
621
|
];
|
|
609
622
|
class TaskFormDialogComponent {
|
|
610
623
|
taskApi = inject(TaskApiService);
|
|
611
|
-
visible = model(false,
|
|
612
|
-
|
|
613
|
-
|
|
614
|
-
|
|
615
|
-
|
|
616
|
-
|
|
624
|
+
visible = model(false, /* @ts-ignore */
|
|
625
|
+
...(ngDevMode ? [{ debugName: "visible" }] : /* istanbul ignore next */ []));
|
|
626
|
+
task = input(null, /* @ts-ignore */
|
|
627
|
+
...(ngDevMode ? [{ debugName: "task" }] : /* istanbul ignore next */ []));
|
|
628
|
+
boardId = input.required(/* @ts-ignore */
|
|
629
|
+
...(ngDevMode ? [{ debugName: "boardId" }] : /* istanbul ignore next */ []));
|
|
630
|
+
listId = input.required(/* @ts-ignore */
|
|
631
|
+
...(ngDevMode ? [{ debugName: "listId" }] : /* istanbul ignore next */ []));
|
|
632
|
+
members = input([], /* @ts-ignore */
|
|
633
|
+
...(ngDevMode ? [{ debugName: "members" }] : /* istanbul ignore next */ []));
|
|
634
|
+
labels = input([], /* @ts-ignore */
|
|
635
|
+
...(ngDevMode ? [{ debugName: "labels" }] : /* istanbul ignore next */ []));
|
|
617
636
|
saved = output();
|
|
618
|
-
isSaving = signal(false,
|
|
637
|
+
isSaving = signal(false, /* @ts-ignore */
|
|
638
|
+
...(ngDevMode ? [{ debugName: "isSaving" }] : /* istanbul ignore next */ []));
|
|
619
639
|
priorityOptions = PRIORITY_OPTIONS;
|
|
620
640
|
title = '';
|
|
621
641
|
description = '';
|
|
@@ -695,8 +715,8 @@ class TaskFormDialogComponent {
|
|
|
695
715
|
this.selectedAssigneeIds = [];
|
|
696
716
|
this.selectedLabelIds = [];
|
|
697
717
|
}
|
|
698
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
699
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.
|
|
718
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: TaskFormDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
719
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: TaskFormDialogComponent, isStandalone: true, selector: "tm-task-form-dialog", inputs: { visible: { classPropertyName: "visible", publicName: "visible", isSignal: true, isRequired: false, transformFunction: null }, task: { classPropertyName: "task", publicName: "task", isSignal: true, isRequired: false, transformFunction: null }, boardId: { classPropertyName: "boardId", publicName: "boardId", isSignal: true, isRequired: true, transformFunction: null }, listId: { classPropertyName: "listId", publicName: "listId", isSignal: true, isRequired: true, transformFunction: null }, members: { classPropertyName: "members", publicName: "members", isSignal: true, isRequired: false, transformFunction: null }, labels: { classPropertyName: "labels", publicName: "labels", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { visible: "visibleChange", saved: "saved" }, ngImport: i0, template: `
|
|
700
720
|
<p-dialog
|
|
701
721
|
[header]="
|
|
702
722
|
(task() ? 'task.form.title.edit' : 'task.form.title.create') | translate
|
|
@@ -739,15 +759,15 @@ class TaskFormDialogComponent {
|
|
|
739
759
|
<p-select
|
|
740
760
|
[(ngModel)]="priority"
|
|
741
761
|
[options]="priorityOptions"
|
|
742
|
-
optionLabel="
|
|
762
|
+
optionLabel="labelKey"
|
|
743
763
|
optionValue="value"
|
|
744
764
|
[placeholder]="'task.form.priority.placeholder' | translate"
|
|
745
765
|
>
|
|
746
766
|
<ng-template #selectedItem let-opt>
|
|
747
|
-
{{ opt.
|
|
767
|
+
{{ opt.labelKey | translate }}
|
|
748
768
|
</ng-template>
|
|
749
769
|
<ng-template #item let-opt>
|
|
750
|
-
{{ opt.
|
|
770
|
+
{{ opt.labelKey | translate }}
|
|
751
771
|
</ng-template>
|
|
752
772
|
</p-select>
|
|
753
773
|
</div>
|
|
@@ -768,12 +788,12 @@ class TaskFormDialogComponent {
|
|
|
768
788
|
<label class="text-sm font-medium">{{
|
|
769
789
|
'task.form.assignee.label' | translate
|
|
770
790
|
}}</label>
|
|
771
|
-
<p-
|
|
791
|
+
<p-select
|
|
792
|
+
[multiple]="true"
|
|
772
793
|
[(ngModel)]="selectedAssigneeIds"
|
|
773
794
|
[options]="members()"
|
|
774
795
|
optionLabel="userName"
|
|
775
796
|
optionValue="userId"
|
|
776
|
-
appendTo="body"
|
|
777
797
|
[placeholder]="'task.form.assignee.placeholder' | translate"
|
|
778
798
|
[showClear]="true"
|
|
779
799
|
/>
|
|
@@ -783,35 +803,34 @@ class TaskFormDialogComponent {
|
|
|
783
803
|
<label class="text-sm font-medium">{{
|
|
784
804
|
'task.form.labels.label' | translate
|
|
785
805
|
}}</label>
|
|
786
|
-
<p-
|
|
806
|
+
<p-select
|
|
807
|
+
[multiple]="true"
|
|
787
808
|
[(ngModel)]="selectedLabelIds"
|
|
788
809
|
[options]="labels()"
|
|
789
810
|
optionLabel="name"
|
|
790
811
|
optionValue="id"
|
|
791
|
-
appendTo="body"
|
|
792
812
|
[placeholder]="'task.form.labels.placeholder' | translate"
|
|
793
813
|
/>
|
|
794
814
|
</div>
|
|
795
815
|
</div>
|
|
796
816
|
|
|
797
|
-
<ng-template
|
|
817
|
+
<ng-template #footer>
|
|
798
818
|
<div class="flex justify-end gap-2 pt-1">
|
|
799
|
-
<
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
/>
|
|
819
|
+
<button pButton severity="secondary" (click)="onClose()">
|
|
820
|
+
<span pButtonLabel>{{ 'shared.cancel' | translate }}</span>
|
|
821
|
+
</button>
|
|
822
|
+
<button pButton (click)="onSave()" [disabled]="isSaving()">
|
|
823
|
+
@if (isSaving()) {
|
|
824
|
+
<span pButtonIcon class="pi pi-spinner pi-spin"></span>
|
|
825
|
+
}
|
|
826
|
+
<span pButtonLabel>{{ 'shared.save' | translate }}</span>
|
|
827
|
+
</button>
|
|
809
828
|
</div>
|
|
810
829
|
</ng-template>
|
|
811
830
|
</p-dialog>
|
|
812
|
-
`, isInline: true, dependencies: [{ kind: "ngmodule", type: DialogModule }, { kind: "component", type: i1$1.Dialog, selector: "p-dialog", inputs: ["hostName", "header", "draggable", "resizable", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "breakpoints", "styleClass", "maskStyleClass", "maskStyle", "showHeader", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "
|
|
831
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: DialogModule }, { kind: "component", type: i1$1.Dialog, selector: "p-dialog", inputs: ["hostName", "header", "draggable", "resizable", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "breakpoints", "styleClass", "maskStyleClass", "maskStyle", "showHeader", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "maskMotionOptions", "motionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "closeButtonProps", "maximizeButtonProps", "visible", "style", "position", "role", "appendTo"], outputs: ["visibleChange", "onShow", "onHide", "onResizeInit", "onResizeEnd", "onDragStart", "onDragEnd", "onMaximize"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2$1.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: InputTextModule }, { kind: "directive", type: i3.InputText, selector: "[pInputText]", inputs: ["hostName", "pInputTextPT", "pInputTextUnstyled", "pSize", "variant", "fluid", "invalid"] }, { kind: "ngmodule", type: TextareaModule }, { kind: "directive", type: i4.Textarea, selector: "[pTextarea], [pInputTextarea]", inputs: ["pTextareaPT", "pTextareaUnstyled", "autoResize", "pSize", "variant", "fluid", "invalid"], outputs: ["onResize"] }, { kind: "ngmodule", type: SelectModule }, { kind: "component", type: i5.Select, selector: "p-select", inputs: ["id", "scrollHeight", "filter", "panelStyle", "panelStyleClass", "readonly", "editable", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "multiple", "autoOptionFocus", "autofocusFilter", "filterValue", "options", "appendTo", "motionOptions"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "ngmodule", type: DatePickerModule }, { kind: "component", type: i6.DatePicker, selector: "p-datepicker, p-date-picker", inputs: ["iconDisplay", "inputStyle", "inputId", "inputStyleClass", "placeholder", "ariaLabelledBy", "ariaLabel", "iconAriaLabel", "dateFormat", "multipleSeparator", "rangeSeparator", "inline", "showOtherMonths", "selectOtherMonths", "showIcon", "icon", "readonlyInput", "shortYearCutoff", "hourFormat", "timeOnly", "stepHour", "stepMinute", "stepSecond", "showSeconds", "showOnFocus", "showWeek", "startWeekFromFirstDayOfYear", "showClear", "dataType", "selectionMode", "maxDateCount", "showButtonBar", "todayButtonStyleClass", "clearButtonStyleClass", "autofocus", "autoZIndex", "baseZIndex", "panelStyleClass", "panelStyle", "keepInvalid", "hideOnDateTimeSelect", "touchUI", "timeSeparator", "focusTrap", "tabindex", "minDate", "maxDate", "disabledDates", "disabledDays", "showTime", "responsiveOptions", "numberOfMonths", "firstDayOfWeek", "view", "defaultDate", "appendTo", "motionOptions"], outputs: ["onFocus", "onBlur", "onClose", "onSelect", "onClear", "onInput", "onTodayClick", "onClearClick", "onMonthChange", "onYearChange", "onClickOutside", "onShow"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i2$2.ButtonDirective, selector: "[pButton]", inputs: ["pButton", "pButtonPT", "pButtonUnstyled", "hostName", "text", "plain", "raised", "size", "outlined", "link", "rounded", "fluid", "variant", "iconOnly", "loading", "severity"] }, { kind: "directive", type: i2$2.ButtonLabel, selector: "[pButtonLabel]", inputs: ["pButtonLabelPT", "pButtonLabelUnstyled"] }, { kind: "directive", type: i2$2.ButtonIcon, selector: "[pButtonIcon]", inputs: ["pButtonIconPT", "pButtonUnstyled"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
|
|
813
832
|
}
|
|
814
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
833
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: TaskFormDialogComponent, decorators: [{
|
|
815
834
|
type: Component,
|
|
816
835
|
args: [{
|
|
817
836
|
selector: 'tm-task-form-dialog',
|
|
@@ -822,7 +841,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
822
841
|
TextareaModule,
|
|
823
842
|
SelectModule,
|
|
824
843
|
DatePickerModule,
|
|
825
|
-
MultiSelectModule,
|
|
826
844
|
ButtonModule,
|
|
827
845
|
TranslatePipe,
|
|
828
846
|
],
|
|
@@ -869,15 +887,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
869
887
|
<p-select
|
|
870
888
|
[(ngModel)]="priority"
|
|
871
889
|
[options]="priorityOptions"
|
|
872
|
-
optionLabel="
|
|
890
|
+
optionLabel="labelKey"
|
|
873
891
|
optionValue="value"
|
|
874
892
|
[placeholder]="'task.form.priority.placeholder' | translate"
|
|
875
893
|
>
|
|
876
894
|
<ng-template #selectedItem let-opt>
|
|
877
|
-
{{ opt.
|
|
895
|
+
{{ opt.labelKey | translate }}
|
|
878
896
|
</ng-template>
|
|
879
897
|
<ng-template #item let-opt>
|
|
880
|
-
{{ opt.
|
|
898
|
+
{{ opt.labelKey | translate }}
|
|
881
899
|
</ng-template>
|
|
882
900
|
</p-select>
|
|
883
901
|
</div>
|
|
@@ -898,12 +916,12 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
898
916
|
<label class="text-sm font-medium">{{
|
|
899
917
|
'task.form.assignee.label' | translate
|
|
900
918
|
}}</label>
|
|
901
|
-
<p-
|
|
919
|
+
<p-select
|
|
920
|
+
[multiple]="true"
|
|
902
921
|
[(ngModel)]="selectedAssigneeIds"
|
|
903
922
|
[options]="members()"
|
|
904
923
|
optionLabel="userName"
|
|
905
924
|
optionValue="userId"
|
|
906
|
-
appendTo="body"
|
|
907
925
|
[placeholder]="'task.form.assignee.placeholder' | translate"
|
|
908
926
|
[showClear]="true"
|
|
909
927
|
/>
|
|
@@ -913,29 +931,28 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
913
931
|
<label class="text-sm font-medium">{{
|
|
914
932
|
'task.form.labels.label' | translate
|
|
915
933
|
}}</label>
|
|
916
|
-
<p-
|
|
934
|
+
<p-select
|
|
935
|
+
[multiple]="true"
|
|
917
936
|
[(ngModel)]="selectedLabelIds"
|
|
918
937
|
[options]="labels()"
|
|
919
938
|
optionLabel="name"
|
|
920
939
|
optionValue="id"
|
|
921
|
-
appendTo="body"
|
|
922
940
|
[placeholder]="'task.form.labels.placeholder' | translate"
|
|
923
941
|
/>
|
|
924
942
|
</div>
|
|
925
943
|
</div>
|
|
926
944
|
|
|
927
|
-
<ng-template
|
|
945
|
+
<ng-template #footer>
|
|
928
946
|
<div class="flex justify-end gap-2 pt-1">
|
|
929
|
-
<
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
/>
|
|
947
|
+
<button pButton severity="secondary" (click)="onClose()">
|
|
948
|
+
<span pButtonLabel>{{ 'shared.cancel' | translate }}</span>
|
|
949
|
+
</button>
|
|
950
|
+
<button pButton (click)="onSave()" [disabled]="isSaving()">
|
|
951
|
+
@if (isSaving()) {
|
|
952
|
+
<span pButtonIcon class="pi pi-spinner pi-spin"></span>
|
|
953
|
+
}
|
|
954
|
+
<span pButtonLabel>{{ 'shared.save' | translate }}</span>
|
|
955
|
+
</button>
|
|
939
956
|
</div>
|
|
940
957
|
</ng-template>
|
|
941
958
|
</p-dialog>
|
|
@@ -946,18 +963,26 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
946
963
|
class TaskDetailPanelComponent {
|
|
947
964
|
commentApi = inject(TaskCommentApiService);
|
|
948
965
|
state = inject(TaskBoardStateService);
|
|
949
|
-
task = input(null,
|
|
966
|
+
task = input(null, /* @ts-ignore */
|
|
967
|
+
...(ngDevMode ? [{ debugName: "task" }] : /* istanbul ignore next */ []));
|
|
950
968
|
closePanel = output();
|
|
951
969
|
editTask = output();
|
|
952
|
-
comments = signal([],
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
956
|
-
|
|
970
|
+
comments = signal([], /* @ts-ignore */
|
|
971
|
+
...(ngDevMode ? [{ debugName: "comments" }] : /* istanbul ignore next */ []));
|
|
972
|
+
isSendingComment = signal(false, /* @ts-ignore */
|
|
973
|
+
...(ngDevMode ? [{ debugName: "isSendingComment" }] : /* istanbul ignore next */ []));
|
|
974
|
+
isSendingReply = signal(false, /* @ts-ignore */
|
|
975
|
+
...(ngDevMode ? [{ debugName: "isSendingReply" }] : /* istanbul ignore next */ []));
|
|
976
|
+
replyingToId = signal(null, /* @ts-ignore */
|
|
977
|
+
...(ngDevMode ? [{ debugName: "replyingToId" }] : /* istanbul ignore next */ []));
|
|
978
|
+
isDeleting = signal(false, /* @ts-ignore */
|
|
979
|
+
...(ngDevMode ? [{ debugName: "isDeleting" }] : /* istanbul ignore next */ []));
|
|
957
980
|
newComment = '';
|
|
958
981
|
replyText = '';
|
|
959
|
-
assigneeMembers = computed(() => this.task()?.assignees ?? [],
|
|
960
|
-
|
|
982
|
+
assigneeMembers = computed(() => this.task()?.assignees ?? [], /* @ts-ignore */
|
|
983
|
+
...(ngDevMode ? [{ debugName: "assigneeMembers" }] : /* istanbul ignore next */ []));
|
|
984
|
+
rootComments = computed(() => this.comments().filter((c) => !c.parentCommentId), /* @ts-ignore */
|
|
985
|
+
...(ngDevMode ? [{ debugName: "rootComments" }] : /* istanbul ignore next */ []));
|
|
961
986
|
repliesFor(parentId) {
|
|
962
987
|
return this.comments().filter((c) => c.parentCommentId === parentId);
|
|
963
988
|
}
|
|
@@ -1036,8 +1061,8 @@ class TaskDetailPanelComponent {
|
|
|
1036
1061
|
this.isSendingReply.set(false);
|
|
1037
1062
|
}
|
|
1038
1063
|
}
|
|
1039
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
1040
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
1064
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: TaskDetailPanelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
1065
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: TaskDetailPanelComponent, isStandalone: true, selector: "tm-task-detail-panel", inputs: { task: { classPropertyName: "task", publicName: "task", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { closePanel: "closePanel", editTask: "editTask" }, ngImport: i0, template: `
|
|
1041
1066
|
<p-drawer
|
|
1042
1067
|
[visible]="!!task()"
|
|
1043
1068
|
position="right"
|
|
@@ -1048,25 +1073,33 @@ class TaskDetailPanelComponent {
|
|
|
1048
1073
|
@if (task(); as t) {
|
|
1049
1074
|
<div class="flex flex-col gap-6 h-full overflow-y-auto pb-4">
|
|
1050
1075
|
<div class="flex items-center justify-end gap-1">
|
|
1051
|
-
<
|
|
1052
|
-
|
|
1076
|
+
<button
|
|
1077
|
+
pButton
|
|
1053
1078
|
severity="secondary"
|
|
1054
1079
|
size="small"
|
|
1055
1080
|
[text]="true"
|
|
1056
1081
|
[pTooltip]="'task.detail.edit' | translate"
|
|
1057
1082
|
tooltipPosition="left"
|
|
1058
|
-
(
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1083
|
+
(click)="editTask.emit(t)"
|
|
1084
|
+
>
|
|
1085
|
+
<span pButtonIcon class="pi pi-pencil"></span>
|
|
1086
|
+
</button>
|
|
1087
|
+
<button
|
|
1088
|
+
pButton
|
|
1062
1089
|
severity="danger"
|
|
1063
1090
|
size="small"
|
|
1064
1091
|
[text]="true"
|
|
1065
|
-
[loading]="isDeleting()"
|
|
1066
1092
|
[pTooltip]="'task.detail.delete' | translate"
|
|
1067
1093
|
tooltipPosition="left"
|
|
1068
|
-
(
|
|
1069
|
-
|
|
1094
|
+
(click)="deleteTask(t.id)"
|
|
1095
|
+
[disabled]="isDeleting()"
|
|
1096
|
+
>
|
|
1097
|
+
@if (isDeleting()) {
|
|
1098
|
+
<span pButtonIcon class="pi pi-spinner pi-spin"></span>
|
|
1099
|
+
} @else {
|
|
1100
|
+
<span pButtonIcon class="pi pi-trash"></span>
|
|
1101
|
+
}
|
|
1102
|
+
</button>
|
|
1070
1103
|
</div>
|
|
1071
1104
|
|
|
1072
1105
|
<div class="flex items-center gap-3">
|
|
@@ -1075,7 +1108,7 @@ class TaskDetailPanelComponent {
|
|
|
1075
1108
|
[severity]="prioritySeverity(t.priority)"
|
|
1076
1109
|
/>
|
|
1077
1110
|
@if (t.dueDate) {
|
|
1078
|
-
<span class="text-sm text-
|
|
1111
|
+
<span class="text-sm text-muted-color">
|
|
1079
1112
|
{{ 'task.detail.due.label' | translate }}:
|
|
1080
1113
|
{{ t.dueDate | date: 'mediumDate' }}
|
|
1081
1114
|
</span>
|
|
@@ -1106,9 +1139,7 @@ class TaskDetailPanelComponent {
|
|
|
1106
1139
|
<h4 class="text-sm font-semibold mb-2">
|
|
1107
1140
|
{{ 'shared.description' | translate }}
|
|
1108
1141
|
</h4>
|
|
1109
|
-
<p
|
|
1110
|
-
class="text-sm text-surface-600 dark:text-surface-400 whitespace-pre-wrap"
|
|
1111
|
-
>
|
|
1142
|
+
<p class="text-sm text-color whitespace-pre-wrap">
|
|
1112
1143
|
{{
|
|
1113
1144
|
t.description || ('task.detail.description.empty' | translate)
|
|
1114
1145
|
}}
|
|
@@ -1124,31 +1155,33 @@ class TaskDetailPanelComponent {
|
|
|
1124
1155
|
|
|
1125
1156
|
@for (comment of rootComments(); track comment.id) {
|
|
1126
1157
|
<div
|
|
1127
|
-
class="group flex flex-col gap-1 py-2 border-b border-surface
|
|
1158
|
+
class="group flex flex-col gap-1 py-2 border-b border-surface last:border-0"
|
|
1128
1159
|
>
|
|
1129
1160
|
<div class="flex items-center justify-between">
|
|
1130
|
-
<span class="text-xs text-
|
|
1161
|
+
<span class="text-xs text-muted-color">{{
|
|
1131
1162
|
comment.createdAt | date: 'MMM d, y, h:mm a'
|
|
1132
1163
|
}}</span>
|
|
1133
|
-
<
|
|
1134
|
-
|
|
1135
|
-
icon="pi pi-reply"
|
|
1164
|
+
<button
|
|
1165
|
+
pButton
|
|
1136
1166
|
size="small"
|
|
1137
1167
|
[text]="true"
|
|
1138
1168
|
severity="secondary"
|
|
1139
|
-
|
|
1140
|
-
(
|
|
1141
|
-
|
|
1169
|
+
class="opacity-0 group-hover:opacity-100 transition-opacity !py-0.5 !px-1.5 text-xs"
|
|
1170
|
+
(click)="toggleReply(comment.id)"
|
|
1171
|
+
>
|
|
1172
|
+
<span pButtonIcon class="pi pi-reply"></span>
|
|
1173
|
+
<span pButtonLabel>{{ 'task.comment.reply' | translate }}</span>
|
|
1174
|
+
</button>
|
|
1142
1175
|
</div>
|
|
1143
1176
|
<p class="text-sm">{{ comment.content }}</p>
|
|
1144
1177
|
|
|
1145
1178
|
@if (repliesFor(comment.id).length > 0) {
|
|
1146
1179
|
<div
|
|
1147
|
-
class="mt-1 pl-3 border-l-2 border-surface
|
|
1180
|
+
class="mt-1 pl-3 border-l-2 border-surface flex flex-col gap-2"
|
|
1148
1181
|
>
|
|
1149
1182
|
@for (reply of repliesFor(comment.id); track reply.id) {
|
|
1150
1183
|
<div class="flex flex-col gap-0.5">
|
|
1151
|
-
<span class="text-xs text-
|
|
1184
|
+
<span class="text-xs text-muted-color">{{
|
|
1152
1185
|
reply.createdAt | date: 'MMM d, y, h:mm a'
|
|
1153
1186
|
}}</span>
|
|
1154
1187
|
<p class="text-sm">{{ reply.content }}</p>
|
|
@@ -1172,20 +1205,27 @@ class TaskDetailPanelComponent {
|
|
|
1172
1205
|
autoResize="true"
|
|
1173
1206
|
></textarea>
|
|
1174
1207
|
<div class="flex flex-col gap-1">
|
|
1175
|
-
<
|
|
1176
|
-
|
|
1208
|
+
<button
|
|
1209
|
+
pButton
|
|
1177
1210
|
size="small"
|
|
1178
|
-
[
|
|
1179
|
-
|
|
1180
|
-
|
|
1181
|
-
|
|
1182
|
-
|
|
1183
|
-
|
|
1211
|
+
[disabled]="!replyText.trim() || isSendingReply()"
|
|
1212
|
+
(click)="submitReply(t.id, comment.id)"
|
|
1213
|
+
>
|
|
1214
|
+
@if (isSendingReply()) {
|
|
1215
|
+
<span pButtonIcon class="pi pi-spinner pi-spin"></span>
|
|
1216
|
+
} @else {
|
|
1217
|
+
<span pButtonIcon class="pi pi-send"></span>
|
|
1218
|
+
}
|
|
1219
|
+
</button>
|
|
1220
|
+
<button
|
|
1221
|
+
pButton
|
|
1184
1222
|
size="small"
|
|
1185
1223
|
severity="secondary"
|
|
1186
1224
|
[text]="true"
|
|
1187
|
-
(
|
|
1188
|
-
|
|
1225
|
+
(click)="cancelReply()"
|
|
1226
|
+
>
|
|
1227
|
+
<span pButtonIcon class="pi pi-times"></span>
|
|
1228
|
+
</button>
|
|
1189
1229
|
</div>
|
|
1190
1230
|
</div>
|
|
1191
1231
|
}
|
|
@@ -1193,7 +1233,7 @@ class TaskDetailPanelComponent {
|
|
|
1193
1233
|
}
|
|
1194
1234
|
|
|
1195
1235
|
@if (rootComments().length === 0) {
|
|
1196
|
-
<p class="text-sm text-
|
|
1236
|
+
<p class="text-sm text-muted-color py-2">
|
|
1197
1237
|
{{ 'task.detail.comments.empty' | translate }}
|
|
1198
1238
|
</p>
|
|
1199
1239
|
}
|
|
@@ -1206,20 +1246,25 @@ class TaskDetailPanelComponent {
|
|
|
1206
1246
|
[placeholder]="'task.detail.comment.placeholder' | translate"
|
|
1207
1247
|
class="flex-1 resize-none"
|
|
1208
1248
|
></textarea>
|
|
1209
|
-
<
|
|
1210
|
-
|
|
1211
|
-
[
|
|
1212
|
-
|
|
1213
|
-
|
|
1214
|
-
|
|
1249
|
+
<button
|
|
1250
|
+
pButton
|
|
1251
|
+
[disabled]="!newComment.trim() || isSendingComment()"
|
|
1252
|
+
(click)="addComment(t.id)"
|
|
1253
|
+
>
|
|
1254
|
+
@if (isSendingComment()) {
|
|
1255
|
+
<span pButtonIcon class="pi pi-spinner pi-spin"></span>
|
|
1256
|
+
} @else {
|
|
1257
|
+
<span pButtonIcon class="pi pi-send"></span>
|
|
1258
|
+
}
|
|
1259
|
+
</button>
|
|
1215
1260
|
</div>
|
|
1216
1261
|
</div>
|
|
1217
1262
|
</div>
|
|
1218
1263
|
}
|
|
1219
1264
|
</p-drawer>
|
|
1220
|
-
`, isInline: true, dependencies: [{ kind: "ngmodule", type: DrawerModule }, { kind: "component", type: i1$2.Drawer, selector: "p-drawer", inputs: ["appendTo", "motionOptions", "blockScroll", "style", "styleClass", "ariaCloseLabel", "autoZIndex", "baseZIndex", "modal", "closeButtonProps", "dismissible", "showCloseIcon", "closeOnEscape", "
|
|
1265
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: DrawerModule }, { kind: "component", type: i1$2.Drawer, selector: "p-drawer", inputs: ["appendTo", "motionOptions", "blockScroll", "style", "styleClass", "ariaCloseLabel", "autoZIndex", "baseZIndex", "modal", "closeButtonProps", "dismissible", "showCloseIcon", "closeOnEscape", "visible", "position", "fullScreen", "header", "maskStyle", "closable"], outputs: ["visibleChange", "onShow", "onHide"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i2$2.ButtonDirective, selector: "[pButton]", inputs: ["pButton", "pButtonPT", "pButtonUnstyled", "hostName", "text", "plain", "raised", "size", "outlined", "link", "rounded", "fluid", "variant", "iconOnly", "loading", "severity"] }, { kind: "directive", type: i2$2.ButtonLabel, selector: "[pButtonLabel]", inputs: ["pButtonLabelPT", "pButtonLabelUnstyled"] }, { kind: "directive", type: i2$2.ButtonIcon, selector: "[pButtonIcon]", inputs: ["pButtonIconPT", "pButtonUnstyled"] }, { kind: "ngmodule", type: TagModule }, { kind: "component", type: i1.Tag, selector: "p-tag", inputs: ["severity", "value", "icon", "rounded"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2$1.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: TextareaModule }, { kind: "directive", type: i4.Textarea, selector: "[pTextarea], [pInputTextarea]", inputs: ["pTextareaPT", "pTextareaUnstyled", "autoResize", "pSize", "variant", "fluid", "invalid"], outputs: ["onResize"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i2.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "showOnEllipsis", "pTooltip", "tooltipDisabled", "tooltipOptions", "appendTo", "pTooltipPT", "pTooltipUnstyled"] }, { kind: "pipe", type: DatePipe, name: "date" }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
|
|
1221
1266
|
}
|
|
1222
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
1267
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: TaskDetailPanelComponent, decorators: [{
|
|
1223
1268
|
type: Component,
|
|
1224
1269
|
args: [{
|
|
1225
1270
|
selector: 'tm-task-detail-panel',
|
|
@@ -1244,25 +1289,33 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
1244
1289
|
@if (task(); as t) {
|
|
1245
1290
|
<div class="flex flex-col gap-6 h-full overflow-y-auto pb-4">
|
|
1246
1291
|
<div class="flex items-center justify-end gap-1">
|
|
1247
|
-
<
|
|
1248
|
-
|
|
1292
|
+
<button
|
|
1293
|
+
pButton
|
|
1249
1294
|
severity="secondary"
|
|
1250
1295
|
size="small"
|
|
1251
1296
|
[text]="true"
|
|
1252
1297
|
[pTooltip]="'task.detail.edit' | translate"
|
|
1253
1298
|
tooltipPosition="left"
|
|
1254
|
-
(
|
|
1255
|
-
|
|
1256
|
-
|
|
1257
|
-
|
|
1299
|
+
(click)="editTask.emit(t)"
|
|
1300
|
+
>
|
|
1301
|
+
<span pButtonIcon class="pi pi-pencil"></span>
|
|
1302
|
+
</button>
|
|
1303
|
+
<button
|
|
1304
|
+
pButton
|
|
1258
1305
|
severity="danger"
|
|
1259
1306
|
size="small"
|
|
1260
1307
|
[text]="true"
|
|
1261
|
-
[loading]="isDeleting()"
|
|
1262
1308
|
[pTooltip]="'task.detail.delete' | translate"
|
|
1263
1309
|
tooltipPosition="left"
|
|
1264
|
-
(
|
|
1265
|
-
|
|
1310
|
+
(click)="deleteTask(t.id)"
|
|
1311
|
+
[disabled]="isDeleting()"
|
|
1312
|
+
>
|
|
1313
|
+
@if (isDeleting()) {
|
|
1314
|
+
<span pButtonIcon class="pi pi-spinner pi-spin"></span>
|
|
1315
|
+
} @else {
|
|
1316
|
+
<span pButtonIcon class="pi pi-trash"></span>
|
|
1317
|
+
}
|
|
1318
|
+
</button>
|
|
1266
1319
|
</div>
|
|
1267
1320
|
|
|
1268
1321
|
<div class="flex items-center gap-3">
|
|
@@ -1271,7 +1324,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
1271
1324
|
[severity]="prioritySeverity(t.priority)"
|
|
1272
1325
|
/>
|
|
1273
1326
|
@if (t.dueDate) {
|
|
1274
|
-
<span class="text-sm text-
|
|
1327
|
+
<span class="text-sm text-muted-color">
|
|
1275
1328
|
{{ 'task.detail.due.label' | translate }}:
|
|
1276
1329
|
{{ t.dueDate | date: 'mediumDate' }}
|
|
1277
1330
|
</span>
|
|
@@ -1302,9 +1355,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
1302
1355
|
<h4 class="text-sm font-semibold mb-2">
|
|
1303
1356
|
{{ 'shared.description' | translate }}
|
|
1304
1357
|
</h4>
|
|
1305
|
-
<p
|
|
1306
|
-
class="text-sm text-surface-600 dark:text-surface-400 whitespace-pre-wrap"
|
|
1307
|
-
>
|
|
1358
|
+
<p class="text-sm text-color whitespace-pre-wrap">
|
|
1308
1359
|
{{
|
|
1309
1360
|
t.description || ('task.detail.description.empty' | translate)
|
|
1310
1361
|
}}
|
|
@@ -1320,31 +1371,33 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
1320
1371
|
|
|
1321
1372
|
@for (comment of rootComments(); track comment.id) {
|
|
1322
1373
|
<div
|
|
1323
|
-
class="group flex flex-col gap-1 py-2 border-b border-surface
|
|
1374
|
+
class="group flex flex-col gap-1 py-2 border-b border-surface last:border-0"
|
|
1324
1375
|
>
|
|
1325
1376
|
<div class="flex items-center justify-between">
|
|
1326
|
-
<span class="text-xs text-
|
|
1377
|
+
<span class="text-xs text-muted-color">{{
|
|
1327
1378
|
comment.createdAt | date: 'MMM d, y, h:mm a'
|
|
1328
1379
|
}}</span>
|
|
1329
|
-
<
|
|
1330
|
-
|
|
1331
|
-
icon="pi pi-reply"
|
|
1380
|
+
<button
|
|
1381
|
+
pButton
|
|
1332
1382
|
size="small"
|
|
1333
1383
|
[text]="true"
|
|
1334
1384
|
severity="secondary"
|
|
1335
|
-
|
|
1336
|
-
(
|
|
1337
|
-
|
|
1385
|
+
class="opacity-0 group-hover:opacity-100 transition-opacity !py-0.5 !px-1.5 text-xs"
|
|
1386
|
+
(click)="toggleReply(comment.id)"
|
|
1387
|
+
>
|
|
1388
|
+
<span pButtonIcon class="pi pi-reply"></span>
|
|
1389
|
+
<span pButtonLabel>{{ 'task.comment.reply' | translate }}</span>
|
|
1390
|
+
</button>
|
|
1338
1391
|
</div>
|
|
1339
1392
|
<p class="text-sm">{{ comment.content }}</p>
|
|
1340
1393
|
|
|
1341
1394
|
@if (repliesFor(comment.id).length > 0) {
|
|
1342
1395
|
<div
|
|
1343
|
-
class="mt-1 pl-3 border-l-2 border-surface
|
|
1396
|
+
class="mt-1 pl-3 border-l-2 border-surface flex flex-col gap-2"
|
|
1344
1397
|
>
|
|
1345
1398
|
@for (reply of repliesFor(comment.id); track reply.id) {
|
|
1346
1399
|
<div class="flex flex-col gap-0.5">
|
|
1347
|
-
<span class="text-xs text-
|
|
1400
|
+
<span class="text-xs text-muted-color">{{
|
|
1348
1401
|
reply.createdAt | date: 'MMM d, y, h:mm a'
|
|
1349
1402
|
}}</span>
|
|
1350
1403
|
<p class="text-sm">{{ reply.content }}</p>
|
|
@@ -1368,20 +1421,27 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
1368
1421
|
autoResize="true"
|
|
1369
1422
|
></textarea>
|
|
1370
1423
|
<div class="flex flex-col gap-1">
|
|
1371
|
-
<
|
|
1372
|
-
|
|
1424
|
+
<button
|
|
1425
|
+
pButton
|
|
1373
1426
|
size="small"
|
|
1374
|
-
[
|
|
1375
|
-
|
|
1376
|
-
|
|
1377
|
-
|
|
1378
|
-
|
|
1379
|
-
|
|
1427
|
+
[disabled]="!replyText.trim() || isSendingReply()"
|
|
1428
|
+
(click)="submitReply(t.id, comment.id)"
|
|
1429
|
+
>
|
|
1430
|
+
@if (isSendingReply()) {
|
|
1431
|
+
<span pButtonIcon class="pi pi-spinner pi-spin"></span>
|
|
1432
|
+
} @else {
|
|
1433
|
+
<span pButtonIcon class="pi pi-send"></span>
|
|
1434
|
+
}
|
|
1435
|
+
</button>
|
|
1436
|
+
<button
|
|
1437
|
+
pButton
|
|
1380
1438
|
size="small"
|
|
1381
1439
|
severity="secondary"
|
|
1382
1440
|
[text]="true"
|
|
1383
|
-
(
|
|
1384
|
-
|
|
1441
|
+
(click)="cancelReply()"
|
|
1442
|
+
>
|
|
1443
|
+
<span pButtonIcon class="pi pi-times"></span>
|
|
1444
|
+
</button>
|
|
1385
1445
|
</div>
|
|
1386
1446
|
</div>
|
|
1387
1447
|
}
|
|
@@ -1389,7 +1449,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
1389
1449
|
}
|
|
1390
1450
|
|
|
1391
1451
|
@if (rootComments().length === 0) {
|
|
1392
|
-
<p class="text-sm text-
|
|
1452
|
+
<p class="text-sm text-muted-color py-2">
|
|
1393
1453
|
{{ 'task.detail.comments.empty' | translate }}
|
|
1394
1454
|
</p>
|
|
1395
1455
|
}
|
|
@@ -1402,12 +1462,17 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
1402
1462
|
[placeholder]="'task.detail.comment.placeholder' | translate"
|
|
1403
1463
|
class="flex-1 resize-none"
|
|
1404
1464
|
></textarea>
|
|
1405
|
-
<
|
|
1406
|
-
|
|
1407
|
-
[
|
|
1408
|
-
|
|
1409
|
-
|
|
1410
|
-
|
|
1465
|
+
<button
|
|
1466
|
+
pButton
|
|
1467
|
+
[disabled]="!newComment.trim() || isSendingComment()"
|
|
1468
|
+
(click)="addComment(t.id)"
|
|
1469
|
+
>
|
|
1470
|
+
@if (isSendingComment()) {
|
|
1471
|
+
<span pButtonIcon class="pi pi-spinner pi-spin"></span>
|
|
1472
|
+
} @else {
|
|
1473
|
+
<span pButtonIcon class="pi pi-send"></span>
|
|
1474
|
+
}
|
|
1475
|
+
</button>
|
|
1411
1476
|
</div>
|
|
1412
1477
|
</div>
|
|
1413
1478
|
</div>
|
|
@@ -1421,8 +1486,10 @@ class BoardListPageComponent {
|
|
|
1421
1486
|
state = inject(TaskBoardStateService);
|
|
1422
1487
|
boardApi = inject(TaskBoardApiService);
|
|
1423
1488
|
router = inject(Router);
|
|
1424
|
-
showCreateDialog = signal(false,
|
|
1425
|
-
|
|
1489
|
+
showCreateDialog = signal(false, /* @ts-ignore */
|
|
1490
|
+
...(ngDevMode ? [{ debugName: "showCreateDialog" }] : /* istanbul ignore next */ []));
|
|
1491
|
+
isCreating = signal(false, /* @ts-ignore */
|
|
1492
|
+
...(ngDevMode ? [{ debugName: "isCreating" }] : /* istanbul ignore next */ []));
|
|
1426
1493
|
newBoardName = '';
|
|
1427
1494
|
newBoardDescription = '';
|
|
1428
1495
|
newBoardColor = '#6366f1';
|
|
@@ -1456,8 +1523,8 @@ class BoardListPageComponent {
|
|
|
1456
1523
|
this.isCreating.set(false);
|
|
1457
1524
|
}
|
|
1458
1525
|
}
|
|
1459
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
1460
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
1526
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: BoardListPageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
1527
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: BoardListPageComponent, isStandalone: true, selector: "tm-board-list-page", ngImport: i0, template: `
|
|
1461
1528
|
<div class="p-2 sm:p-4">
|
|
1462
1529
|
<div
|
|
1463
1530
|
class="flex flex-col sm:flex-row justify-between items-start sm:items-center gap-3 mb-4"
|
|
@@ -1470,11 +1537,13 @@ class BoardListPageComponent {
|
|
|
1470
1537
|
{{ 'task.manager.boards.subtitle' | translate }}
|
|
1471
1538
|
</p>
|
|
1472
1539
|
</div>
|
|
1473
|
-
<
|
|
1474
|
-
|
|
1475
|
-
|
|
1476
|
-
|
|
1477
|
-
|
|
1540
|
+
<button
|
|
1541
|
+
pButton
|
|
1542
|
+
(click)="showCreateDialog.set(true)"
|
|
1543
|
+
>
|
|
1544
|
+
<span pButtonIcon class="pi pi-plus"></span>
|
|
1545
|
+
<span pButtonLabel>{{ 'task.manager.board.new' | translate }}</span>
|
|
1546
|
+
</button>
|
|
1478
1547
|
</div>
|
|
1479
1548
|
|
|
1480
1549
|
@if (state.isLoading()) {
|
|
@@ -1511,12 +1580,14 @@ class BoardListPageComponent {
|
|
|
1511
1580
|
<p class="text-sm text-muted-color mb-5">
|
|
1512
1581
|
{{ 'task.manager.board.empty.hint' | translate }}
|
|
1513
1582
|
</p>
|
|
1514
|
-
<
|
|
1515
|
-
|
|
1516
|
-
icon="pi pi-plus"
|
|
1583
|
+
<button
|
|
1584
|
+
pButton
|
|
1517
1585
|
size="small"
|
|
1518
|
-
(
|
|
1519
|
-
|
|
1586
|
+
(click)="showCreateDialog.set(true)"
|
|
1587
|
+
>
|
|
1588
|
+
<span pButtonIcon class="pi pi-plus"></span>
|
|
1589
|
+
<span pButtonLabel>{{ 'task.manager.board.new' | translate }}</span>
|
|
1590
|
+
</button>
|
|
1520
1591
|
</div>
|
|
1521
1592
|
} @else {
|
|
1522
1593
|
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4">
|
|
@@ -1548,7 +1619,7 @@ class BoardListPageComponent {
|
|
|
1548
1619
|
</p>
|
|
1549
1620
|
|
|
1550
1621
|
<div
|
|
1551
|
-
class="border-t border-surface
|
|
1622
|
+
class="border-t border-surface mt-4 pt-4 space-y-2.5"
|
|
1552
1623
|
>
|
|
1553
1624
|
<div class="flex items-center gap-4">
|
|
1554
1625
|
<span class="flex items-center gap-1.5">
|
|
@@ -1666,24 +1737,31 @@ class BoardListPageComponent {
|
|
|
1666
1737
|
</div>
|
|
1667
1738
|
</div>
|
|
1668
1739
|
|
|
1669
|
-
<ng-template
|
|
1740
|
+
<ng-template #footer>
|
|
1670
1741
|
<div class="flex justify-end gap-2">
|
|
1671
|
-
<
|
|
1672
|
-
|
|
1742
|
+
<button
|
|
1743
|
+
pButton
|
|
1673
1744
|
severity="secondary"
|
|
1674
|
-
(
|
|
1675
|
-
|
|
1676
|
-
|
|
1677
|
-
|
|
1678
|
-
|
|
1679
|
-
|
|
1680
|
-
|
|
1745
|
+
(click)="closeCreateDialog()"
|
|
1746
|
+
>
|
|
1747
|
+
<span pButtonLabel>{{ 'shared.cancel' | translate }}</span>
|
|
1748
|
+
</button>
|
|
1749
|
+
<button
|
|
1750
|
+
pButton
|
|
1751
|
+
(click)="createBoard()"
|
|
1752
|
+
[disabled]="isCreating()"
|
|
1753
|
+
>
|
|
1754
|
+
@if (isCreating()) {
|
|
1755
|
+
<span pButtonIcon class="pi pi-spinner pi-spin"></span>
|
|
1756
|
+
}
|
|
1757
|
+
<span pButtonLabel>{{ 'shared.create' | translate }}</span>
|
|
1758
|
+
</button>
|
|
1681
1759
|
</div>
|
|
1682
1760
|
</ng-template>
|
|
1683
1761
|
</p-dialog>
|
|
1684
|
-
`, isInline: true, dependencies: [{ kind: "ngmodule", type: AngularModule }, { kind: "directive", type:
|
|
1762
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: AngularModule }, { kind: "directive", type: i2$1.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: PrimeModule }, { kind: "directive", type: i2$2.ButtonDirective, selector: "[pButton]", inputs: ["pButton", "pButtonPT", "pButtonUnstyled", "hostName", "text", "plain", "raised", "size", "outlined", "link", "rounded", "fluid", "variant", "iconOnly", "loading", "severity"] }, { kind: "directive", type: i2$2.ButtonLabel, selector: "[pButtonLabel]", inputs: ["pButtonLabelPT", "pButtonLabelUnstyled"] }, { kind: "directive", type: i2$2.ButtonIcon, selector: "[pButtonIcon]", inputs: ["pButtonIconPT", "pButtonUnstyled"] }, { kind: "component", type: i1$1.Dialog, selector: "p-dialog", inputs: ["hostName", "header", "draggable", "resizable", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "breakpoints", "styleClass", "maskStyleClass", "maskStyle", "showHeader", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "maskMotionOptions", "motionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "closeButtonProps", "maximizeButtonProps", "visible", "style", "position", "role", "appendTo"], outputs: ["visibleChange", "onShow", "onHide", "onResizeInit", "onResizeEnd", "onDragStart", "onDragEnd", "onMaximize"] }, { kind: "directive", type: i3.InputText, selector: "[pInputText]", inputs: ["hostName", "pInputTextPT", "pInputTextUnstyled", "pSize", "variant", "fluid", "invalid"] }, { kind: "component", type: i5$1.Skeleton, selector: "p-skeleton", inputs: ["shape", "animation", "borderRadius", "size", "width", "height"] }, { kind: "directive", type: i4.Textarea, selector: "[pTextarea], [pInputTextarea]", inputs: ["pTextareaPT", "pTextareaUnstyled", "autoResize", "pSize", "variant", "fluid", "invalid"], outputs: ["onResize"] }, { kind: "directive", type: i2.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "showOnEllipsis", "pTooltip", "tooltipDisabled", "tooltipOptions", "appendTo", "pTooltipPT", "pTooltipUnstyled"] }, { kind: "pipe", type: i8.DatePipe, name: "date" }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
|
|
1685
1763
|
}
|
|
1686
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
1764
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: BoardListPageComponent, decorators: [{
|
|
1687
1765
|
type: Component,
|
|
1688
1766
|
args: [{
|
|
1689
1767
|
selector: 'tm-board-list-page',
|
|
@@ -1701,11 +1779,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
1701
1779
|
{{ 'task.manager.boards.subtitle' | translate }}
|
|
1702
1780
|
</p>
|
|
1703
1781
|
</div>
|
|
1704
|
-
<
|
|
1705
|
-
|
|
1706
|
-
|
|
1707
|
-
|
|
1708
|
-
|
|
1782
|
+
<button
|
|
1783
|
+
pButton
|
|
1784
|
+
(click)="showCreateDialog.set(true)"
|
|
1785
|
+
>
|
|
1786
|
+
<span pButtonIcon class="pi pi-plus"></span>
|
|
1787
|
+
<span pButtonLabel>{{ 'task.manager.board.new' | translate }}</span>
|
|
1788
|
+
</button>
|
|
1709
1789
|
</div>
|
|
1710
1790
|
|
|
1711
1791
|
@if (state.isLoading()) {
|
|
@@ -1742,12 +1822,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
1742
1822
|
<p class="text-sm text-muted-color mb-5">
|
|
1743
1823
|
{{ 'task.manager.board.empty.hint' | translate }}
|
|
1744
1824
|
</p>
|
|
1745
|
-
<
|
|
1746
|
-
|
|
1747
|
-
icon="pi pi-plus"
|
|
1825
|
+
<button
|
|
1826
|
+
pButton
|
|
1748
1827
|
size="small"
|
|
1749
|
-
(
|
|
1750
|
-
|
|
1828
|
+
(click)="showCreateDialog.set(true)"
|
|
1829
|
+
>
|
|
1830
|
+
<span pButtonIcon class="pi pi-plus"></span>
|
|
1831
|
+
<span pButtonLabel>{{ 'task.manager.board.new' | translate }}</span>
|
|
1832
|
+
</button>
|
|
1751
1833
|
</div>
|
|
1752
1834
|
} @else {
|
|
1753
1835
|
<div class="grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4">
|
|
@@ -1779,7 +1861,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
1779
1861
|
</p>
|
|
1780
1862
|
|
|
1781
1863
|
<div
|
|
1782
|
-
class="border-t border-surface
|
|
1864
|
+
class="border-t border-surface mt-4 pt-4 space-y-2.5"
|
|
1783
1865
|
>
|
|
1784
1866
|
<div class="flex items-center gap-4">
|
|
1785
1867
|
<span class="flex items-center gap-1.5">
|
|
@@ -1897,18 +1979,25 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
1897
1979
|
</div>
|
|
1898
1980
|
</div>
|
|
1899
1981
|
|
|
1900
|
-
<ng-template
|
|
1982
|
+
<ng-template #footer>
|
|
1901
1983
|
<div class="flex justify-end gap-2">
|
|
1902
|
-
<
|
|
1903
|
-
|
|
1984
|
+
<button
|
|
1985
|
+
pButton
|
|
1904
1986
|
severity="secondary"
|
|
1905
|
-
(
|
|
1906
|
-
|
|
1907
|
-
|
|
1908
|
-
|
|
1909
|
-
|
|
1910
|
-
|
|
1911
|
-
|
|
1987
|
+
(click)="closeCreateDialog()"
|
|
1988
|
+
>
|
|
1989
|
+
<span pButtonLabel>{{ 'shared.cancel' | translate }}</span>
|
|
1990
|
+
</button>
|
|
1991
|
+
<button
|
|
1992
|
+
pButton
|
|
1993
|
+
(click)="createBoard()"
|
|
1994
|
+
[disabled]="isCreating()"
|
|
1995
|
+
>
|
|
1996
|
+
@if (isCreating()) {
|
|
1997
|
+
<span pButtonIcon class="pi pi-spinner pi-spin"></span>
|
|
1998
|
+
}
|
|
1999
|
+
<span pButtonLabel>{{ 'shared.create' | translate }}</span>
|
|
2000
|
+
</button>
|
|
1912
2001
|
</div>
|
|
1913
2002
|
</ng-template>
|
|
1914
2003
|
</p-dialog>
|
|
@@ -1927,26 +2016,43 @@ class BoardViewPageComponent {
|
|
|
1927
2016
|
listApi = inject(TaskListApiService);
|
|
1928
2017
|
confirmationService = inject(ConfirmationService);
|
|
1929
2018
|
messageService = inject(MessageService);
|
|
1930
|
-
translateAdapter = inject(TranslateService, {
|
|
2019
|
+
translateAdapter = inject(TranslateService, {
|
|
2020
|
+
optional: true,
|
|
2021
|
+
});
|
|
1931
2022
|
destroyRef = inject(DestroyRef);
|
|
1932
2023
|
translate(key, vars) {
|
|
1933
2024
|
return this.translateAdapter?.translate(key, vars) ?? key;
|
|
1934
2025
|
}
|
|
1935
|
-
boardId = input.required(
|
|
1936
|
-
|
|
1937
|
-
|
|
1938
|
-
|
|
1939
|
-
|
|
1940
|
-
|
|
1941
|
-
|
|
1942
|
-
|
|
1943
|
-
|
|
1944
|
-
|
|
1945
|
-
|
|
1946
|
-
|
|
1947
|
-
|
|
1948
|
-
|
|
1949
|
-
|
|
2026
|
+
boardId = input.required(/* @ts-ignore */
|
|
2027
|
+
...(ngDevMode ? [{ debugName: "boardId" }] : /* istanbul ignore next */ []));
|
|
2028
|
+
viewMode = signal('board', /* @ts-ignore */
|
|
2029
|
+
...(ngDevMode ? [{ debugName: "viewMode" }] : /* istanbul ignore next */ []));
|
|
2030
|
+
showTaskForm = signal(false, /* @ts-ignore */
|
|
2031
|
+
...(ngDevMode ? [{ debugName: "showTaskForm" }] : /* istanbul ignore next */ []));
|
|
2032
|
+
editingTask = signal(null, /* @ts-ignore */
|
|
2033
|
+
...(ngDevMode ? [{ debugName: "editingTask" }] : /* istanbul ignore next */ []));
|
|
2034
|
+
activeListId = signal('', /* @ts-ignore */
|
|
2035
|
+
...(ngDevMode ? [{ debugName: "activeListId" }] : /* istanbul ignore next */ []));
|
|
2036
|
+
showAddListDialog = signal(false, /* @ts-ignore */
|
|
2037
|
+
...(ngDevMode ? [{ debugName: "showAddListDialog" }] : /* istanbul ignore next */ []));
|
|
2038
|
+
isAddingList = signal(false, /* @ts-ignore */
|
|
2039
|
+
...(ngDevMode ? [{ debugName: "isAddingList" }] : /* istanbul ignore next */ []));
|
|
2040
|
+
showLabelsDialog = signal(false, /* @ts-ignore */
|
|
2041
|
+
...(ngDevMode ? [{ debugName: "showLabelsDialog" }] : /* istanbul ignore next */ []));
|
|
2042
|
+
isAddingLabel = signal(false, /* @ts-ignore */
|
|
2043
|
+
...(ngDevMode ? [{ debugName: "isAddingLabel" }] : /* istanbul ignore next */ []));
|
|
2044
|
+
showMembersDialog = signal(false, /* @ts-ignore */
|
|
2045
|
+
...(ngDevMode ? [{ debugName: "showMembersDialog" }] : /* istanbul ignore next */ []));
|
|
2046
|
+
isAddingMember = signal(false, /* @ts-ignore */
|
|
2047
|
+
...(ngDevMode ? [{ debugName: "isAddingMember" }] : /* istanbul ignore next */ []));
|
|
2048
|
+
editingListId = signal(null, /* @ts-ignore */
|
|
2049
|
+
...(ngDevMode ? [{ debugName: "editingListId" }] : /* istanbul ignore next */ []));
|
|
2050
|
+
editingListNameValue = signal('', /* @ts-ignore */
|
|
2051
|
+
...(ngDevMode ? [{ debugName: "editingListNameValue" }] : /* istanbul ignore next */ []));
|
|
2052
|
+
showEditBoardDialog = signal(false, /* @ts-ignore */
|
|
2053
|
+
...(ngDevMode ? [{ debugName: "showEditBoardDialog" }] : /* istanbul ignore next */ []));
|
|
2054
|
+
isSavingBoard = signal(false, /* @ts-ignore */
|
|
2055
|
+
...(ngDevMode ? [{ debugName: "isSavingBoard" }] : /* istanbul ignore next */ []));
|
|
1950
2056
|
newListName = '';
|
|
1951
2057
|
newLabelName = '';
|
|
1952
2058
|
newLabelColor = '#6366F1';
|
|
@@ -1965,10 +2071,15 @@ class BoardViewPageComponent {
|
|
|
1965
2071
|
...task,
|
|
1966
2072
|
listName: list.name,
|
|
1967
2073
|
listColor: list.color,
|
|
1968
|
-
}))),
|
|
1969
|
-
|
|
2074
|
+
}))), /* @ts-ignore */
|
|
2075
|
+
...(ngDevMode ? [{ debugName: "allTasksFlat" }] : /* istanbul ignore next */ []));
|
|
2076
|
+
listDropIds = computed(() => this.state.listsWithTasks().map((l) => l.id), /* @ts-ignore */
|
|
2077
|
+
...(ngDevMode ? [{ debugName: "listDropIds" }] : /* istanbul ignore next */ []));
|
|
1970
2078
|
constructor() {
|
|
1971
|
-
effect(() => {
|
|
2079
|
+
effect(() => {
|
|
2080
|
+
const id = this.boardId();
|
|
2081
|
+
untracked(() => this.state.openBoard(id));
|
|
2082
|
+
});
|
|
1972
2083
|
this.destroyRef.onDestroy(() => this.state.closeBoard());
|
|
1973
2084
|
}
|
|
1974
2085
|
openAddTask(list) {
|
|
@@ -1981,7 +2092,9 @@ class BoardViewPageComponent {
|
|
|
1981
2092
|
}
|
|
1982
2093
|
onDeleteTask(task) {
|
|
1983
2094
|
this.confirmationService.confirm({
|
|
1984
|
-
message: this.translate('shared.confirm.delete.item', {
|
|
2095
|
+
message: this.translate('shared.confirm.delete.item', {
|
|
2096
|
+
name: task.title,
|
|
2097
|
+
}),
|
|
1985
2098
|
header: this.translate('task.detail.delete'),
|
|
1986
2099
|
icon: 'pi pi-exclamation-triangle',
|
|
1987
2100
|
acceptButtonStyleClass: 'p-button-danger',
|
|
@@ -2002,7 +2115,8 @@ class BoardViewPageComponent {
|
|
|
2002
2115
|
this.state.selectTask(null);
|
|
2003
2116
|
}
|
|
2004
2117
|
getMemberName(assigneeId) {
|
|
2005
|
-
return this.state.members().find((m) => m.userId === assigneeId)?.userName ??
|
|
2118
|
+
return (this.state.members().find((m) => m.userId === assigneeId)?.userName ??
|
|
2119
|
+
null);
|
|
2006
2120
|
}
|
|
2007
2121
|
getMemberInitials(assigneeId) {
|
|
2008
2122
|
return memberInitials(this.getMemberName(assigneeId));
|
|
@@ -2153,8 +2267,8 @@ class BoardViewPageComponent {
|
|
|
2153
2267
|
this.isAddingList.set(false);
|
|
2154
2268
|
}
|
|
2155
2269
|
}
|
|
2156
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "
|
|
2157
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "
|
|
2270
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: BoardViewPageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
2271
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.5", type: BoardViewPageComponent, isStandalone: true, selector: "tm-board-view-page", inputs: { boardId: { classPropertyName: "boardId", publicName: "boardId", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: `
|
|
2158
2272
|
<div class="flex flex-col h-full">
|
|
2159
2273
|
<div class="flex flex-col">
|
|
2160
2274
|
<div class="flex items-center justify-between px-5 py-2.5 gap-4">
|
|
@@ -2162,22 +2276,28 @@ class BoardViewPageComponent {
|
|
|
2162
2276
|
<div class="flex items-center gap-2.5 min-w-0 flex-1 group">
|
|
2163
2277
|
<div class="flex flex-col min-w-0">
|
|
2164
2278
|
<div class="flex items-center gap-1.5 min-w-0">
|
|
2165
|
-
<h1
|
|
2279
|
+
<h1
|
|
2280
|
+
class="text-base font-bold text-surface-900 dark:text-surface-0 truncate leading-snug"
|
|
2281
|
+
>
|
|
2166
2282
|
{{ board.name }}
|
|
2167
2283
|
</h1>
|
|
2168
|
-
<
|
|
2169
|
-
|
|
2284
|
+
<button
|
|
2285
|
+
pButton
|
|
2170
2286
|
[text]="true"
|
|
2171
2287
|
size="small"
|
|
2172
2288
|
severity="secondary"
|
|
2173
|
-
|
|
2289
|
+
class="!w-6 !h-6 flex-shrink-0 opacity-0 group-hover:opacity-100 transition-opacity"
|
|
2174
2290
|
[pTooltip]="'task.manager.board.edit' | translate"
|
|
2175
2291
|
tooltipPosition="bottom"
|
|
2176
|
-
(
|
|
2177
|
-
|
|
2292
|
+
(click)="openEditBoardDialog(board)"
|
|
2293
|
+
>
|
|
2294
|
+
<span pButtonIcon class="pi pi-pencil"></span>
|
|
2295
|
+
</button>
|
|
2178
2296
|
</div>
|
|
2179
2297
|
@if (board.description) {
|
|
2180
|
-
<span
|
|
2298
|
+
<span
|
|
2299
|
+
class="text-xs text-muted-color truncate max-w-sm hidden md:block leading-snug"
|
|
2300
|
+
>
|
|
2181
2301
|
{{ board.description }}
|
|
2182
2302
|
</span>
|
|
2183
2303
|
}
|
|
@@ -2195,7 +2315,7 @@ class BoardViewPageComponent {
|
|
|
2195
2315
|
>
|
|
2196
2316
|
@for (member of state.members().slice(0, 4); track member.id) {
|
|
2197
2317
|
<div
|
|
2198
|
-
class="w-6 h-6 rounded-full border-2 border-
|
|
2318
|
+
class="w-6 h-6 rounded-full border-2 border-surface-card flex items-center justify-center text-[9px] font-bold text-white flex-shrink-0 ring-1 ring-surface"
|
|
2199
2319
|
[style.background-color]="memberColor(member)"
|
|
2200
2320
|
>
|
|
2201
2321
|
{{ memberInitials(member) }}
|
|
@@ -2203,7 +2323,7 @@ class BoardViewPageComponent {
|
|
|
2203
2323
|
}
|
|
2204
2324
|
@if (state.members().length > 4) {
|
|
2205
2325
|
<div
|
|
2206
|
-
class="w-6 h-6 rounded-full border-2 border-
|
|
2326
|
+
class="w-6 h-6 rounded-full border-2 border-surface-card bg-surface-200 dark:bg-surface-700 flex items-center justify-center text-[9px] font-bold text-surface-600 dark:text-surface-300 flex-shrink-0"
|
|
2207
2327
|
>
|
|
2208
2328
|
+{{ state.members().length - 4 }}
|
|
2209
2329
|
</div>
|
|
@@ -2211,68 +2331,91 @@ class BoardViewPageComponent {
|
|
|
2211
2331
|
</div>
|
|
2212
2332
|
}
|
|
2213
2333
|
|
|
2214
|
-
<div
|
|
2334
|
+
<div
|
|
2335
|
+
class="h-5 w-px bg-surface-300 dark:bg-surface-600 mx-0.5"
|
|
2336
|
+
></div>
|
|
2215
2337
|
|
|
2216
|
-
<div
|
|
2217
|
-
|
|
2218
|
-
|
|
2338
|
+
<div
|
|
2339
|
+
class="flex rounded-border overflow-hidden border border-surface"
|
|
2340
|
+
>
|
|
2341
|
+
<button
|
|
2342
|
+
pButton
|
|
2219
2343
|
[pTooltip]="'task.manager.view.board' | translate"
|
|
2220
2344
|
tooltipPosition="bottom"
|
|
2221
2345
|
size="small"
|
|
2222
2346
|
[severity]="viewMode() === 'board' ? 'primary' : 'secondary'"
|
|
2223
2347
|
[outlined]="viewMode() !== 'board'"
|
|
2224
|
-
|
|
2225
|
-
(
|
|
2226
|
-
|
|
2227
|
-
|
|
2228
|
-
|
|
2348
|
+
class="!rounded-none !border-0"
|
|
2349
|
+
(click)="viewMode.set('board')"
|
|
2350
|
+
>
|
|
2351
|
+
<span pButtonIcon class="pi pi-th-large"></span>
|
|
2352
|
+
</button>
|
|
2353
|
+
<button
|
|
2354
|
+
pButton
|
|
2229
2355
|
[pTooltip]="'task.manager.view.list' | translate"
|
|
2230
2356
|
tooltipPosition="bottom"
|
|
2231
2357
|
size="small"
|
|
2232
2358
|
[severity]="viewMode() === 'list' ? 'primary' : 'secondary'"
|
|
2233
2359
|
[outlined]="viewMode() !== 'list'"
|
|
2234
|
-
|
|
2235
|
-
(
|
|
2236
|
-
|
|
2360
|
+
class="!rounded-none !border-0"
|
|
2361
|
+
(click)="viewMode.set('list')"
|
|
2362
|
+
>
|
|
2363
|
+
<span pButtonIcon class="pi pi-list"></span>
|
|
2364
|
+
</button>
|
|
2237
2365
|
</div>
|
|
2238
2366
|
|
|
2239
|
-
<div
|
|
2367
|
+
<div
|
|
2368
|
+
class="h-5 w-px bg-surface-300 dark:bg-surface-600 mx-0.5"
|
|
2369
|
+
></div>
|
|
2240
2370
|
|
|
2241
|
-
<
|
|
2242
|
-
|
|
2371
|
+
<button
|
|
2372
|
+
pButton
|
|
2243
2373
|
[text]="true"
|
|
2244
2374
|
severity="secondary"
|
|
2245
2375
|
size="small"
|
|
2246
|
-
|
|
2376
|
+
class="!w-8 !h-8"
|
|
2247
2377
|
[pTooltip]="'task.manager.board.manage.members' | translate"
|
|
2248
2378
|
tooltipPosition="bottom"
|
|
2249
|
-
(
|
|
2250
|
-
|
|
2251
|
-
|
|
2252
|
-
|
|
2379
|
+
(click)="showMembersDialog.set(true)"
|
|
2380
|
+
>
|
|
2381
|
+
<span pButtonIcon class="pi pi-users"></span>
|
|
2382
|
+
</button>
|
|
2383
|
+
<button
|
|
2384
|
+
pButton
|
|
2253
2385
|
[text]="true"
|
|
2254
2386
|
severity="secondary"
|
|
2255
2387
|
size="small"
|
|
2256
|
-
|
|
2388
|
+
class="!w-8 !h-8"
|
|
2257
2389
|
[pTooltip]="'task.manager.board.manage.labels' | translate"
|
|
2258
2390
|
tooltipPosition="bottom"
|
|
2259
|
-
(
|
|
2260
|
-
|
|
2391
|
+
(click)="showLabelsDialog.set(true)"
|
|
2392
|
+
>
|
|
2393
|
+
<span pButtonIcon class="pi pi-tag"></span>
|
|
2394
|
+
</button>
|
|
2261
2395
|
|
|
2262
2396
|
@if (viewMode() === 'board') {
|
|
2263
|
-
<div
|
|
2264
|
-
|
|
2265
|
-
|
|
2266
|
-
|
|
2397
|
+
<div
|
|
2398
|
+
class="h-5 w-px bg-surface-300 dark:bg-surface-600 mx-0.5"
|
|
2399
|
+
></div>
|
|
2400
|
+
<button
|
|
2401
|
+
pButton
|
|
2267
2402
|
size="small"
|
|
2268
|
-
(
|
|
2269
|
-
|
|
2403
|
+
(click)="showAddListDialog.set(true)"
|
|
2404
|
+
>
|
|
2405
|
+
<span pButtonIcon class="pi pi-plus"></span>
|
|
2406
|
+
<span pButtonLabel>{{
|
|
2407
|
+
'task.manager.board.add.list' | translate
|
|
2408
|
+
}}</span>
|
|
2409
|
+
</button>
|
|
2270
2410
|
}
|
|
2271
2411
|
</div>
|
|
2272
2412
|
</div>
|
|
2273
2413
|
|
|
2274
2414
|
@if (state.activeBoard(); as board) {
|
|
2275
|
-
<div
|
|
2415
|
+
<div
|
|
2416
|
+
class="h-0.5 w-full flex-shrink-0"
|
|
2417
|
+
[style.background-color]="board.color"
|
|
2418
|
+
></div>
|
|
2276
2419
|
}
|
|
2277
2420
|
</div>
|
|
2278
2421
|
|
|
@@ -2295,7 +2438,6 @@ class BoardViewPageComponent {
|
|
|
2295
2438
|
}
|
|
2296
2439
|
</div>
|
|
2297
2440
|
}
|
|
2298
|
-
|
|
2299
2441
|
} @else if (viewMode() === 'board') {
|
|
2300
2442
|
<div
|
|
2301
2443
|
class="flex gap-4 p-5 overflow-x-auto flex-1"
|
|
@@ -2307,15 +2449,14 @@ class BoardViewPageComponent {
|
|
|
2307
2449
|
@for (list of state.listsWithTasks(); track list.id) {
|
|
2308
2450
|
<div
|
|
2309
2451
|
cdkDrag
|
|
2310
|
-
class="flex-shrink-0 w-72 flex flex-col max-h-[calc(100vh-140px)] self-start"
|
|
2452
|
+
class="flex-shrink-0 w-72 flex flex-col max-h-[calc(100vh-140px)] self-start rounded-border border border-surface shadow-sm overflow-hidden"
|
|
2311
2453
|
>
|
|
2312
2454
|
<div
|
|
2313
|
-
class="flex items-center gap-1 px-2 py-2.5
|
|
2314
|
-
[style.border-top]="'3px solid ' + list.color"
|
|
2455
|
+
class="flex items-center gap-1 px-2.5 py-2.5 border-b border-surface"
|
|
2315
2456
|
>
|
|
2316
2457
|
<i
|
|
2317
2458
|
cdkDragHandle
|
|
2318
|
-
class="pi pi-bars text-
|
|
2459
|
+
class="pi pi-bars text-muted-color text-xs cursor-grab flex-shrink-0 px-1"
|
|
2319
2460
|
></i>
|
|
2320
2461
|
|
|
2321
2462
|
<div class="flex items-center gap-2 min-w-0 flex-1">
|
|
@@ -2332,7 +2473,9 @@ class BoardViewPageComponent {
|
|
|
2332
2473
|
autofocus
|
|
2333
2474
|
/>
|
|
2334
2475
|
} @else {
|
|
2335
|
-
<span class="font-semibold text-sm truncate">{{
|
|
2476
|
+
<span class="font-semibold text-sm truncate">{{
|
|
2477
|
+
list.name
|
|
2478
|
+
}}</span>
|
|
2336
2479
|
<span
|
|
2337
2480
|
class="text-[11px] font-semibold px-1.5 py-0.5 rounded-full text-white flex-shrink-0"
|
|
2338
2481
|
[style.background-color]="list.color"
|
|
@@ -2343,35 +2486,41 @@ class BoardViewPageComponent {
|
|
|
2343
2486
|
</div>
|
|
2344
2487
|
|
|
2345
2488
|
@if (editingListId() === list.id) {
|
|
2346
|
-
<
|
|
2347
|
-
|
|
2489
|
+
<button
|
|
2490
|
+
pButton
|
|
2348
2491
|
[text]="true"
|
|
2349
2492
|
size="small"
|
|
2350
2493
|
severity="success"
|
|
2351
|
-
|
|
2494
|
+
class="!w-6 !h-6 flex-shrink-0"
|
|
2352
2495
|
(mousedown)="$event.preventDefault()"
|
|
2353
2496
|
(click)="saveRenameList(); $event.stopPropagation()"
|
|
2354
|
-
|
|
2355
|
-
|
|
2356
|
-
|
|
2497
|
+
>
|
|
2498
|
+
<span pButtonIcon class="pi pi-check"></span>
|
|
2499
|
+
</button>
|
|
2500
|
+
<button
|
|
2501
|
+
pButton
|
|
2357
2502
|
[text]="true"
|
|
2358
2503
|
size="small"
|
|
2359
2504
|
severity="secondary"
|
|
2360
|
-
|
|
2505
|
+
class="!w-6 !h-6 flex-shrink-0"
|
|
2361
2506
|
(mousedown)="$event.preventDefault()"
|
|
2362
2507
|
(click)="cancelRenameList(); $event.stopPropagation()"
|
|
2363
|
-
|
|
2508
|
+
>
|
|
2509
|
+
<span pButtonIcon class="pi pi-times"></span>
|
|
2510
|
+
</button>
|
|
2364
2511
|
} @else {
|
|
2365
|
-
<
|
|
2366
|
-
|
|
2512
|
+
<button
|
|
2513
|
+
pButton
|
|
2367
2514
|
[text]="true"
|
|
2368
2515
|
size="small"
|
|
2369
2516
|
severity="secondary"
|
|
2370
|
-
|
|
2517
|
+
class="!w-6 !h-6 flex-shrink-0"
|
|
2371
2518
|
[pTooltip]="'task.manager.list.rename' | translate"
|
|
2372
2519
|
tooltipPosition="bottom"
|
|
2373
2520
|
(click)="startRenameList(list); $event.stopPropagation()"
|
|
2374
|
-
|
|
2521
|
+
>
|
|
2522
|
+
<span pButtonIcon class="pi pi-pencil"></span>
|
|
2523
|
+
</button>
|
|
2375
2524
|
}
|
|
2376
2525
|
</div>
|
|
2377
2526
|
|
|
@@ -2381,7 +2530,7 @@ class BoardViewPageComponent {
|
|
|
2381
2530
|
[cdkDropListData]="list.tasks"
|
|
2382
2531
|
[cdkDropListConnectedTo]="listDropIds()"
|
|
2383
2532
|
(cdkDropListDropped)="onTaskDrop($event)"
|
|
2384
|
-
class="flex flex-col gap-2 p-2 overflow-y-auto flex-1 min-h-[60px]
|
|
2533
|
+
class="flex flex-col gap-2 p-2 overflow-y-auto flex-1 min-h-[60px]"
|
|
2385
2534
|
>
|
|
2386
2535
|
@for (task of list.tasks; track task.id) {
|
|
2387
2536
|
<div cdkDrag>
|
|
@@ -2395,56 +2544,60 @@ class BoardViewPageComponent {
|
|
|
2395
2544
|
}
|
|
2396
2545
|
@if (list.tasks.length === 0) {
|
|
2397
2546
|
<div
|
|
2398
|
-
class="flex items-center justify-center h-14 border-2 border-dashed border-surface
|
|
2547
|
+
class="flex items-center justify-center h-14 border-2 border-dashed border-surface rounded-border"
|
|
2399
2548
|
>
|
|
2400
|
-
<span class="text-xs text-
|
|
2549
|
+
<span class="text-xs text-muted-color">{{
|
|
2401
2550
|
'task.manager.board.drop.tasks.here' | translate
|
|
2402
2551
|
}}</span>
|
|
2403
2552
|
</div>
|
|
2404
2553
|
}
|
|
2405
2554
|
</div>
|
|
2406
2555
|
|
|
2407
|
-
<div
|
|
2408
|
-
|
|
2409
|
-
|
|
2410
|
-
<p-button
|
|
2411
|
-
icon="pi pi-plus"
|
|
2412
|
-
[label]="'task.manager.board.add.task' | translate"
|
|
2556
|
+
<div class="border-t border-surface p-1.5">
|
|
2557
|
+
<button
|
|
2558
|
+
pButton
|
|
2413
2559
|
severity="secondary"
|
|
2560
|
+
[text]="true"
|
|
2414
2561
|
size="small"
|
|
2415
|
-
|
|
2416
|
-
(
|
|
2417
|
-
|
|
2562
|
+
class="w-full !justify-start"
|
|
2563
|
+
(click)="openAddTask(list)"
|
|
2564
|
+
>
|
|
2565
|
+
<span pButtonIcon class="pi pi-plus"></span>
|
|
2566
|
+
<span pButtonLabel>{{
|
|
2567
|
+
'task.manager.board.add.task' | translate
|
|
2568
|
+
}}</span>
|
|
2569
|
+
</button>
|
|
2418
2570
|
</div>
|
|
2419
2571
|
</div>
|
|
2420
2572
|
}
|
|
2421
2573
|
|
|
2422
2574
|
@if (state.listsWithTasks().length === 0) {
|
|
2423
2575
|
<div class="flex-1 flex items-center justify-center">
|
|
2424
|
-
<div class="text-center text-
|
|
2576
|
+
<div class="text-center text-muted-color">
|
|
2425
2577
|
<div
|
|
2426
|
-
class="w-16 h-16 rounded-2xl flex items-center justify-center mx-auto mb-4"
|
|
2578
|
+
class="w-16 h-16 rounded-2xl border-2 border-dashed border-surface flex items-center justify-center mx-auto mb-4"
|
|
2427
2579
|
>
|
|
2428
|
-
<i
|
|
2429
|
-
class="pi pi-list text-3xl text-surface-300 dark:text-surface-600"
|
|
2430
|
-
></i>
|
|
2580
|
+
<i class="pi pi-list text-3xl text-muted-color"></i>
|
|
2431
2581
|
</div>
|
|
2432
|
-
<p class="font-medium text-
|
|
2582
|
+
<p class="font-medium text-muted-color">
|
|
2433
2583
|
{{ 'task.manager.board.list.empty' | translate }}
|
|
2434
2584
|
</p>
|
|
2435
|
-
<
|
|
2436
|
-
|
|
2437
|
-
[label]="'task.manager.board.add.list' | translate"
|
|
2585
|
+
<button
|
|
2586
|
+
pButton
|
|
2438
2587
|
severity="secondary"
|
|
2439
2588
|
size="small"
|
|
2440
2589
|
class="mt-3"
|
|
2441
|
-
(
|
|
2442
|
-
|
|
2590
|
+
(click)="showAddListDialog.set(true)"
|
|
2591
|
+
>
|
|
2592
|
+
<span pButtonIcon class="pi pi-plus"></span>
|
|
2593
|
+
<span pButtonLabel>{{
|
|
2594
|
+
'task.manager.board.add.list' | translate
|
|
2595
|
+
}}</span>
|
|
2596
|
+
</button>
|
|
2443
2597
|
</div>
|
|
2444
2598
|
</div>
|
|
2445
2599
|
}
|
|
2446
2600
|
</div>
|
|
2447
|
-
|
|
2448
2601
|
} @else {
|
|
2449
2602
|
<div class="p-4 sm:p-6 flex-1 overflow-auto">
|
|
2450
2603
|
<div class="card">
|
|
@@ -2462,24 +2615,26 @@ class BoardViewPageComponent {
|
|
|
2462
2615
|
<tr>
|
|
2463
2616
|
<th pSortableColumn="title" class="min-w-[240px]">
|
|
2464
2617
|
{{ 'task.manager.table.title' | translate }}
|
|
2465
|
-
<p-
|
|
2618
|
+
<p-sorticon field="title" />
|
|
2466
2619
|
</th>
|
|
2467
2620
|
<th pSortableColumn="listName" class="w-40">
|
|
2468
2621
|
{{ 'task.manager.table.list' | translate }}
|
|
2469
|
-
<p-
|
|
2622
|
+
<p-sorticon field="listName" />
|
|
2470
2623
|
</th>
|
|
2471
2624
|
<th pSortableColumn="priority" class="w-32">
|
|
2472
2625
|
{{ 'task.manager.table.priority' | translate }}
|
|
2473
|
-
<p-
|
|
2626
|
+
<p-sorticon field="priority" />
|
|
2474
2627
|
</th>
|
|
2475
2628
|
<th class="w-36">
|
|
2476
2629
|
{{ 'task.manager.table.assignee' | translate }}
|
|
2477
2630
|
</th>
|
|
2478
2631
|
<th pSortableColumn="dueDate" class="w-32">
|
|
2479
2632
|
{{ 'task.manager.table.due.date' | translate }}
|
|
2480
|
-
<p-
|
|
2633
|
+
<p-sorticon field="dueDate" />
|
|
2634
|
+
</th>
|
|
2635
|
+
<th class="w-[100px]">
|
|
2636
|
+
{{ 'shared.actions' | translate }}
|
|
2481
2637
|
</th>
|
|
2482
|
-
<th class="w-[100px]">{{ 'shared.actions' | translate }}</th>
|
|
2483
2638
|
</tr>
|
|
2484
2639
|
</ng-template>
|
|
2485
2640
|
<ng-template #body let-task>
|
|
@@ -2488,7 +2643,8 @@ class BoardViewPageComponent {
|
|
|
2488
2643
|
<span
|
|
2489
2644
|
class="font-medium text-sm cursor-pointer hover:text-primary-500 transition-colors"
|
|
2490
2645
|
(click)="state.selectTask(task)"
|
|
2491
|
-
|
|
2646
|
+
>{{ task.title }}</span
|
|
2647
|
+
>
|
|
2492
2648
|
</td>
|
|
2493
2649
|
<td>
|
|
2494
2650
|
<span class="inline-flex items-center gap-1.5 text-sm">
|
|
@@ -2508,10 +2664,15 @@ class BoardViewPageComponent {
|
|
|
2508
2664
|
<td>
|
|
2509
2665
|
@if (task.assignees?.length) {
|
|
2510
2666
|
<div class="flex items-center -space-x-1.5">
|
|
2511
|
-
@for (
|
|
2667
|
+
@for (
|
|
2668
|
+
a of task.assignees!.slice(0, 3);
|
|
2669
|
+
track a.userId
|
|
2670
|
+
) {
|
|
2512
2671
|
<span
|
|
2513
|
-
class="w-6 h-6 rounded-full flex items-center justify-center text-[10px] font-bold text-white flex-shrink-0 ring-2 ring-
|
|
2514
|
-
[style.background-color]="
|
|
2672
|
+
class="w-6 h-6 rounded-full flex items-center justify-center text-[10px] font-bold text-white flex-shrink-0 ring-2 ring-surface-card"
|
|
2673
|
+
[style.background-color]="
|
|
2674
|
+
memberColorById(a.userId)
|
|
2675
|
+
"
|
|
2515
2676
|
[pTooltip]="a.userName ?? ''"
|
|
2516
2677
|
>
|
|
2517
2678
|
{{ getMemberInitials(a.userId) }}
|
|
@@ -2519,7 +2680,7 @@ class BoardViewPageComponent {
|
|
|
2519
2680
|
}
|
|
2520
2681
|
@if (task.assignees!.length > 3) {
|
|
2521
2682
|
<span
|
|
2522
|
-
class="w-6 h-6 rounded-full bg-surface-200 dark:bg-surface-700 flex items-center justify-center text-[10px] font-bold text-surface-600 ring-2 ring-
|
|
2683
|
+
class="w-6 h-6 rounded-full bg-surface-200 dark:bg-surface-700 flex items-center justify-center text-[10px] font-bold text-surface-600 ring-2 ring-surface-card flex-shrink-0"
|
|
2523
2684
|
>
|
|
2524
2685
|
+{{ task.assignees!.length - 3 }}
|
|
2525
2686
|
</span>
|
|
@@ -2543,22 +2704,26 @@ class BoardViewPageComponent {
|
|
|
2543
2704
|
</td>
|
|
2544
2705
|
<td>
|
|
2545
2706
|
<div class="flex gap-1">
|
|
2546
|
-
<
|
|
2547
|
-
|
|
2707
|
+
<button
|
|
2708
|
+
pButton
|
|
2548
2709
|
[text]="true"
|
|
2549
2710
|
severity="secondary"
|
|
2550
2711
|
size="small"
|
|
2551
2712
|
[pTooltip]="'shared.edit' | translate"
|
|
2552
|
-
(
|
|
2553
|
-
|
|
2554
|
-
|
|
2555
|
-
|
|
2713
|
+
(click)="onEditTask(task)"
|
|
2714
|
+
>
|
|
2715
|
+
<span pButtonIcon class="pi pi-pencil"></span>
|
|
2716
|
+
</button>
|
|
2717
|
+
<button
|
|
2718
|
+
pButton
|
|
2556
2719
|
[text]="true"
|
|
2557
2720
|
severity="danger"
|
|
2558
2721
|
size="small"
|
|
2559
2722
|
[pTooltip]="'shared.delete' | translate"
|
|
2560
|
-
(
|
|
2561
|
-
|
|
2723
|
+
(click)="onDeleteTask(task)"
|
|
2724
|
+
>
|
|
2725
|
+
<span pButtonIcon class="pi pi-trash"></span>
|
|
2726
|
+
</button>
|
|
2562
2727
|
</div>
|
|
2563
2728
|
</td>
|
|
2564
2729
|
</tr>
|
|
@@ -2623,24 +2788,30 @@ class BoardViewPageComponent {
|
|
|
2623
2788
|
class="w-10 h-10 rounded cursor-pointer border border-surface-300"
|
|
2624
2789
|
/>
|
|
2625
2790
|
</div>
|
|
2626
|
-
<
|
|
2627
|
-
|
|
2628
|
-
[label]="'task.manager.label.add' | translate"
|
|
2791
|
+
<button
|
|
2792
|
+
pButton
|
|
2629
2793
|
size="small"
|
|
2630
|
-
|
|
2631
|
-
|
|
2632
|
-
|
|
2794
|
+
(click)="addLabel()"
|
|
2795
|
+
[disabled]="isAddingLabel()"
|
|
2796
|
+
>
|
|
2797
|
+
@if (isAddingLabel()) {
|
|
2798
|
+
<span pButtonIcon class="pi pi-spinner pi-spin"></span>
|
|
2799
|
+
} @else {
|
|
2800
|
+
<span pButtonIcon class="pi pi-plus"></span>
|
|
2801
|
+
}
|
|
2802
|
+
<span pButtonLabel>{{ 'task.manager.label.add' | translate }}</span>
|
|
2803
|
+
</button>
|
|
2633
2804
|
</div>
|
|
2634
2805
|
|
|
2635
2806
|
<div class="flex flex-col gap-2 max-h-64 overflow-y-auto">
|
|
2636
2807
|
@if (state.labels().length === 0) {
|
|
2637
|
-
<p class="text-sm text-
|
|
2808
|
+
<p class="text-sm text-muted-color text-center py-4">
|
|
2638
2809
|
{{ 'task.manager.label.no.labels' | translate }}
|
|
2639
2810
|
</p>
|
|
2640
2811
|
}
|
|
2641
2812
|
@for (label of state.labels(); track label.id) {
|
|
2642
2813
|
<div
|
|
2643
|
-
class="flex items-center justify-between px-3 py-2 rounded-
|
|
2814
|
+
class="flex items-center justify-between px-3 py-2 rounded-border border border-surface"
|
|
2644
2815
|
>
|
|
2645
2816
|
<div class="flex items-center gap-2">
|
|
2646
2817
|
<span
|
|
@@ -2649,13 +2820,15 @@ class BoardViewPageComponent {
|
|
|
2649
2820
|
></span>
|
|
2650
2821
|
<span class="text-sm font-medium">{{ label.name }}</span>
|
|
2651
2822
|
</div>
|
|
2652
|
-
<
|
|
2653
|
-
|
|
2823
|
+
<button
|
|
2824
|
+
pButton
|
|
2654
2825
|
severity="danger"
|
|
2655
2826
|
size="small"
|
|
2656
2827
|
[text]="true"
|
|
2657
|
-
(
|
|
2658
|
-
|
|
2828
|
+
(click)="removeLabel(label.id)"
|
|
2829
|
+
>
|
|
2830
|
+
<span pButtonIcon class="pi pi-trash"></span>
|
|
2831
|
+
</button>
|
|
2659
2832
|
</div>
|
|
2660
2833
|
}
|
|
2661
2834
|
</div>
|
|
@@ -2695,7 +2868,6 @@ class BoardViewPageComponent {
|
|
|
2695
2868
|
'task.manager.member.role.placeholder' | translate
|
|
2696
2869
|
"
|
|
2697
2870
|
class="w-full"
|
|
2698
|
-
appendTo="body"
|
|
2699
2871
|
>
|
|
2700
2872
|
<ng-template #selectedItem let-opt>
|
|
2701
2873
|
{{ opt.labelKey | translate }}
|
|
@@ -2705,26 +2877,33 @@ class BoardViewPageComponent {
|
|
|
2705
2877
|
</ng-template>
|
|
2706
2878
|
</p-select>
|
|
2707
2879
|
</div>
|
|
2708
|
-
<
|
|
2709
|
-
|
|
2710
|
-
[label]="'task.manager.member.add' | translate"
|
|
2880
|
+
<button
|
|
2881
|
+
pButton
|
|
2711
2882
|
size="small"
|
|
2712
|
-
[
|
|
2713
|
-
|
|
2714
|
-
|
|
2715
|
-
|
|
2883
|
+
[disabled]="!selectedMemberUser || isAddingMember()"
|
|
2884
|
+
(click)="addMember()"
|
|
2885
|
+
>
|
|
2886
|
+
@if (isAddingMember()) {
|
|
2887
|
+
<span pButtonIcon class="pi pi-spinner pi-spin"></span>
|
|
2888
|
+
} @else {
|
|
2889
|
+
<span pButtonIcon class="pi pi-plus"></span>
|
|
2890
|
+
}
|
|
2891
|
+
<span pButtonLabel>{{
|
|
2892
|
+
'task.manager.member.add' | translate
|
|
2893
|
+
}}</span>
|
|
2894
|
+
</button>
|
|
2716
2895
|
</div>
|
|
2717
2896
|
</div>
|
|
2718
2897
|
|
|
2719
2898
|
<div class="flex flex-col gap-2 max-h-72 overflow-y-auto">
|
|
2720
2899
|
@if (state.members().length === 0) {
|
|
2721
|
-
<p class="text-sm text-
|
|
2900
|
+
<p class="text-sm text-muted-color text-center py-4">
|
|
2722
2901
|
{{ 'task.manager.member.no.members' | translate }}
|
|
2723
2902
|
</p>
|
|
2724
2903
|
}
|
|
2725
2904
|
@for (member of state.members(); track member.id) {
|
|
2726
2905
|
<div
|
|
2727
|
-
class="flex items-center justify-between px-3 py-2.5 rounded-
|
|
2906
|
+
class="flex items-center justify-between px-3 py-2.5 rounded-border border border-surface"
|
|
2728
2907
|
>
|
|
2729
2908
|
<div class="flex items-center gap-3">
|
|
2730
2909
|
<div
|
|
@@ -2738,7 +2917,7 @@ class BoardViewPageComponent {
|
|
|
2738
2917
|
{{ member.userName ?? member.userId }}
|
|
2739
2918
|
</div>
|
|
2740
2919
|
@if (member.userEmail) {
|
|
2741
|
-
<div class="text-xs text-
|
|
2920
|
+
<div class="text-xs text-muted-color">
|
|
2742
2921
|
{{ member.userEmail }}
|
|
2743
2922
|
</div>
|
|
2744
2923
|
}
|
|
@@ -2749,16 +2928,21 @@ class BoardViewPageComponent {
|
|
|
2749
2928
|
class="text-[10px] font-semibold px-2 py-0.5 rounded-full"
|
|
2750
2929
|
[class]="roleBadgeClass(member.role)"
|
|
2751
2930
|
>
|
|
2752
|
-
{{
|
|
2931
|
+
{{
|
|
2932
|
+
'task.manager.member.role.' + member.role.toLowerCase()
|
|
2933
|
+
| translate
|
|
2934
|
+
}}
|
|
2753
2935
|
</span>
|
|
2754
2936
|
@if (member.role !== 'OWNER') {
|
|
2755
|
-
<
|
|
2756
|
-
|
|
2937
|
+
<button
|
|
2938
|
+
pButton
|
|
2757
2939
|
severity="danger"
|
|
2758
2940
|
size="small"
|
|
2759
2941
|
[text]="true"
|
|
2760
|
-
(
|
|
2761
|
-
|
|
2942
|
+
(click)="removeMember(member.userId)"
|
|
2943
|
+
>
|
|
2944
|
+
<span pButtonIcon class="pi pi-trash"></span>
|
|
2945
|
+
</button>
|
|
2762
2946
|
}
|
|
2763
2947
|
</div>
|
|
2764
2948
|
</div>
|
|
@@ -2785,18 +2969,21 @@ class BoardViewPageComponent {
|
|
|
2785
2969
|
[placeholder]="'task.manager.list.name.placeholder' | translate"
|
|
2786
2970
|
/>
|
|
2787
2971
|
</div>
|
|
2788
|
-
<ng-template
|
|
2972
|
+
<ng-template #footer>
|
|
2789
2973
|
<div class="flex justify-end gap-2">
|
|
2790
|
-
<
|
|
2791
|
-
|
|
2974
|
+
<button
|
|
2975
|
+
pButton
|
|
2792
2976
|
severity="secondary"
|
|
2793
|
-
(
|
|
2794
|
-
|
|
2795
|
-
|
|
2796
|
-
|
|
2797
|
-
|
|
2798
|
-
(
|
|
2799
|
-
|
|
2977
|
+
(click)="showAddListDialog.set(false)"
|
|
2978
|
+
>
|
|
2979
|
+
<span pButtonLabel>{{ 'shared.cancel' | translate }}</span>
|
|
2980
|
+
</button>
|
|
2981
|
+
<button pButton (click)="addList()" [disabled]="isAddingList()">
|
|
2982
|
+
@if (isAddingList()) {
|
|
2983
|
+
<span pButtonIcon class="pi pi-spinner pi-spin"></span>
|
|
2984
|
+
}
|
|
2985
|
+
<span pButtonLabel>{{ 'shared.create' | translate }}</span>
|
|
2986
|
+
</button>
|
|
2800
2987
|
</div>
|
|
2801
2988
|
</ng-template>
|
|
2802
2989
|
</p-dialog>
|
|
@@ -2823,7 +3010,9 @@ class BoardViewPageComponent {
|
|
|
2823
3010
|
pTextarea
|
|
2824
3011
|
[(ngModel)]="editBoardDescription"
|
|
2825
3012
|
[rows]="3"
|
|
2826
|
-
[placeholder]="
|
|
3013
|
+
[placeholder]="
|
|
3014
|
+
'task.manager.board.description.placeholder' | translate
|
|
3015
|
+
"
|
|
2827
3016
|
></textarea>
|
|
2828
3017
|
</div>
|
|
2829
3018
|
<div class="flex flex-col gap-1">
|
|
@@ -2851,25 +3040,31 @@ class BoardViewPageComponent {
|
|
|
2851
3040
|
</div>
|
|
2852
3041
|
</div>
|
|
2853
3042
|
</div>
|
|
2854
|
-
<ng-template
|
|
3043
|
+
<ng-template #footer>
|
|
2855
3044
|
<div class="flex justify-end gap-2">
|
|
2856
|
-
<
|
|
2857
|
-
|
|
3045
|
+
<button
|
|
3046
|
+
pButton
|
|
2858
3047
|
severity="secondary"
|
|
2859
|
-
(
|
|
2860
|
-
|
|
2861
|
-
|
|
2862
|
-
|
|
2863
|
-
|
|
2864
|
-
|
|
2865
|
-
|
|
2866
|
-
|
|
3048
|
+
(click)="showEditBoardDialog.set(false)"
|
|
3049
|
+
>
|
|
3050
|
+
<span pButtonLabel>{{ 'shared.cancel' | translate }}</span>
|
|
3051
|
+
</button>
|
|
3052
|
+
<button
|
|
3053
|
+
pButton
|
|
3054
|
+
[disabled]="!editBoardName.trim() || isSavingBoard()"
|
|
3055
|
+
(click)="saveBoard()"
|
|
3056
|
+
>
|
|
3057
|
+
@if (isSavingBoard()) {
|
|
3058
|
+
<span pButtonIcon class="pi pi-spinner pi-spin"></span>
|
|
3059
|
+
}
|
|
3060
|
+
<span pButtonLabel>{{ 'shared.save' | translate }}</span>
|
|
3061
|
+
</button>
|
|
2867
3062
|
</div>
|
|
2868
3063
|
</ng-template>
|
|
2869
3064
|
</p-dialog>
|
|
2870
|
-
`, isInline: true, dependencies: [{ kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i1$3.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer", "cdkDropListHasAnchor"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i1$3.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i1$3.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "ngmodule", type: AngularModule }, { kind: "directive", type:
|
|
3065
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i1$3.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer", "cdkDropListHasAnchor"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i1$3.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i1$3.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "ngmodule", type: AngularModule }, { kind: "directive", type: i2$1.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: PrimeModule }, { kind: "directive", type: i2$2.ButtonDirective, selector: "[pButton]", inputs: ["pButton", "pButtonPT", "pButtonUnstyled", "hostName", "text", "plain", "raised", "size", "outlined", "link", "rounded", "fluid", "variant", "iconOnly", "loading", "severity"] }, { kind: "directive", type: i2$2.ButtonLabel, selector: "[pButtonLabel]", inputs: ["pButtonLabelPT", "pButtonLabelUnstyled"] }, { kind: "directive", type: i2$2.ButtonIcon, selector: "[pButtonIcon]", inputs: ["pButtonIconPT", "pButtonUnstyled"] }, { kind: "component", type: i1$1.Dialog, selector: "p-dialog", inputs: ["hostName", "header", "draggable", "resizable", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "breakpoints", "styleClass", "maskStyleClass", "maskStyle", "showHeader", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "maskMotionOptions", "motionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "closeButtonProps", "maximizeButtonProps", "visible", "style", "position", "role", "appendTo"], outputs: ["visibleChange", "onShow", "onHide", "onResizeInit", "onResizeEnd", "onDragStart", "onDragEnd", "onMaximize"] }, { kind: "directive", type: i3.InputText, selector: "[pInputText]", inputs: ["hostName", "pInputTextPT", "pInputTextUnstyled", "pSize", "variant", "fluid", "invalid"] }, { kind: "component", type: i5.Select, selector: "p-select", inputs: ["id", "scrollHeight", "filter", "panelStyle", "panelStyleClass", "readonly", "editable", "tabindex", "placeholder", "loadingIcon", "filterPlaceholder", "filterLocale", "inputId", "dataKey", "filterBy", "filterFields", "autofocus", "resetFilterOnHide", "checkmark", "dropdownIcon", "loading", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "group", "showClear", "emptyFilterMessage", "emptyMessage", "lazy", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "ariaLabel", "ariaLabelledBy", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "focusOnHover", "selectOnFocus", "multiple", "autoOptionFocus", "autofocusFilter", "filterValue", "options", "appendTo", "motionOptions"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "component", type: i5$1.Skeleton, selector: "p-skeleton", inputs: ["shape", "animation", "borderRadius", "size", "width", "height"] }, { kind: "component", type: i8$1.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "dataKey", "metaKeySelection", "rowSelectable", "rowTrackBy", "lazy", "lazyLoadOnInit", "compareSelectionBy", "csvSeparator", "exportFilename", "filters", "globalFilterFields", "filterDelay", "filterLocale", "expandedRowKeys", "editingRowKeys", "rowExpandMode", "scrollable", "rowGroupMode", "scrollHeight", "virtualScroll", "virtualScrollItemSize", "virtualScrollOptions", "virtualScrollDelay", "frozenWidth", "contextMenu", "resizableColumns", "columnResizeMode", "reorderableColumns", "loading", "loadingIcon", "showLoader", "rowHover", "customSort", "showInitialSortBadge", "exportFunction", "exportHeader", "stateKey", "stateStorage", "editMode", "groupRowsBy", "size", "showGridlines", "stripedRows", "groupRowsByOrder", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll"], outputs: ["contextMenuSelectionChange", "firstChange", "rowsChange", "totalRecordsChange", "selectionChange", "selectAllChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i8$1.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "component", type: i8$1.SortIcon, selector: "p-sort-icon, p-sorticon", inputs: ["field"] }, { kind: "component", type: i1.Tag, selector: "p-tag", inputs: ["severity", "value", "icon", "rounded"] }, { kind: "directive", type: i4.Textarea, selector: "[pTextarea], [pInputTextarea]", inputs: ["pTextareaPT", "pTextareaUnstyled", "autoResize", "pSize", "variant", "fluid", "invalid"], outputs: ["onResize"] }, { kind: "directive", type: i2.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "showOnEllipsis", "pTooltip", "tooltipDisabled", "tooltipOptions", "appendTo", "pTooltipPT", "pTooltipUnstyled"] }, { kind: "component", type: TaskCardComponent, selector: "tm-task-card", inputs: ["task"], outputs: ["cardClick", "editClick", "deleteClick"] }, { kind: "component", type: TaskFormDialogComponent, selector: "tm-task-form-dialog", inputs: ["visible", "task", "boardId", "listId", "members", "labels"], outputs: ["visibleChange", "saved"] }, { kind: "component", type: TaskDetailPanelComponent, selector: "tm-task-detail-panel", inputs: ["task"], outputs: ["closePanel", "editTask"] }, { kind: "component", type: UserSelectComponent, selector: "lib-user-select", inputs: ["showClear", "value"], outputs: ["valueChange", "userSelected"] }, { kind: "pipe", type: i8.DatePipe, name: "date" }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
|
|
2871
3066
|
}
|
|
2872
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "
|
|
3067
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.5", ngImport: i0, type: BoardViewPageComponent, decorators: [{
|
|
2873
3068
|
type: Component,
|
|
2874
3069
|
args: [{
|
|
2875
3070
|
selector: 'tm-board-view-page',
|
|
@@ -2891,22 +3086,28 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
2891
3086
|
<div class="flex items-center gap-2.5 min-w-0 flex-1 group">
|
|
2892
3087
|
<div class="flex flex-col min-w-0">
|
|
2893
3088
|
<div class="flex items-center gap-1.5 min-w-0">
|
|
2894
|
-
<h1
|
|
3089
|
+
<h1
|
|
3090
|
+
class="text-base font-bold text-surface-900 dark:text-surface-0 truncate leading-snug"
|
|
3091
|
+
>
|
|
2895
3092
|
{{ board.name }}
|
|
2896
3093
|
</h1>
|
|
2897
|
-
<
|
|
2898
|
-
|
|
3094
|
+
<button
|
|
3095
|
+
pButton
|
|
2899
3096
|
[text]="true"
|
|
2900
3097
|
size="small"
|
|
2901
3098
|
severity="secondary"
|
|
2902
|
-
|
|
3099
|
+
class="!w-6 !h-6 flex-shrink-0 opacity-0 group-hover:opacity-100 transition-opacity"
|
|
2903
3100
|
[pTooltip]="'task.manager.board.edit' | translate"
|
|
2904
3101
|
tooltipPosition="bottom"
|
|
2905
|
-
(
|
|
2906
|
-
|
|
3102
|
+
(click)="openEditBoardDialog(board)"
|
|
3103
|
+
>
|
|
3104
|
+
<span pButtonIcon class="pi pi-pencil"></span>
|
|
3105
|
+
</button>
|
|
2907
3106
|
</div>
|
|
2908
3107
|
@if (board.description) {
|
|
2909
|
-
<span
|
|
3108
|
+
<span
|
|
3109
|
+
class="text-xs text-muted-color truncate max-w-sm hidden md:block leading-snug"
|
|
3110
|
+
>
|
|
2910
3111
|
{{ board.description }}
|
|
2911
3112
|
</span>
|
|
2912
3113
|
}
|
|
@@ -2924,7 +3125,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
2924
3125
|
>
|
|
2925
3126
|
@for (member of state.members().slice(0, 4); track member.id) {
|
|
2926
3127
|
<div
|
|
2927
|
-
class="w-6 h-6 rounded-full border-2 border-
|
|
3128
|
+
class="w-6 h-6 rounded-full border-2 border-surface-card flex items-center justify-center text-[9px] font-bold text-white flex-shrink-0 ring-1 ring-surface"
|
|
2928
3129
|
[style.background-color]="memberColor(member)"
|
|
2929
3130
|
>
|
|
2930
3131
|
{{ memberInitials(member) }}
|
|
@@ -2932,7 +3133,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
2932
3133
|
}
|
|
2933
3134
|
@if (state.members().length > 4) {
|
|
2934
3135
|
<div
|
|
2935
|
-
class="w-6 h-6 rounded-full border-2 border-
|
|
3136
|
+
class="w-6 h-6 rounded-full border-2 border-surface-card bg-surface-200 dark:bg-surface-700 flex items-center justify-center text-[9px] font-bold text-surface-600 dark:text-surface-300 flex-shrink-0"
|
|
2936
3137
|
>
|
|
2937
3138
|
+{{ state.members().length - 4 }}
|
|
2938
3139
|
</div>
|
|
@@ -2940,68 +3141,91 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
2940
3141
|
</div>
|
|
2941
3142
|
}
|
|
2942
3143
|
|
|
2943
|
-
<div
|
|
3144
|
+
<div
|
|
3145
|
+
class="h-5 w-px bg-surface-300 dark:bg-surface-600 mx-0.5"
|
|
3146
|
+
></div>
|
|
2944
3147
|
|
|
2945
|
-
<div
|
|
2946
|
-
|
|
2947
|
-
|
|
3148
|
+
<div
|
|
3149
|
+
class="flex rounded-border overflow-hidden border border-surface"
|
|
3150
|
+
>
|
|
3151
|
+
<button
|
|
3152
|
+
pButton
|
|
2948
3153
|
[pTooltip]="'task.manager.view.board' | translate"
|
|
2949
3154
|
tooltipPosition="bottom"
|
|
2950
3155
|
size="small"
|
|
2951
3156
|
[severity]="viewMode() === 'board' ? 'primary' : 'secondary'"
|
|
2952
3157
|
[outlined]="viewMode() !== 'board'"
|
|
2953
|
-
|
|
2954
|
-
(
|
|
2955
|
-
|
|
2956
|
-
|
|
2957
|
-
|
|
3158
|
+
class="!rounded-none !border-0"
|
|
3159
|
+
(click)="viewMode.set('board')"
|
|
3160
|
+
>
|
|
3161
|
+
<span pButtonIcon class="pi pi-th-large"></span>
|
|
3162
|
+
</button>
|
|
3163
|
+
<button
|
|
3164
|
+
pButton
|
|
2958
3165
|
[pTooltip]="'task.manager.view.list' | translate"
|
|
2959
3166
|
tooltipPosition="bottom"
|
|
2960
3167
|
size="small"
|
|
2961
3168
|
[severity]="viewMode() === 'list' ? 'primary' : 'secondary'"
|
|
2962
3169
|
[outlined]="viewMode() !== 'list'"
|
|
2963
|
-
|
|
2964
|
-
(
|
|
2965
|
-
|
|
3170
|
+
class="!rounded-none !border-0"
|
|
3171
|
+
(click)="viewMode.set('list')"
|
|
3172
|
+
>
|
|
3173
|
+
<span pButtonIcon class="pi pi-list"></span>
|
|
3174
|
+
</button>
|
|
2966
3175
|
</div>
|
|
2967
3176
|
|
|
2968
|
-
<div
|
|
3177
|
+
<div
|
|
3178
|
+
class="h-5 w-px bg-surface-300 dark:bg-surface-600 mx-0.5"
|
|
3179
|
+
></div>
|
|
2969
3180
|
|
|
2970
|
-
<
|
|
2971
|
-
|
|
3181
|
+
<button
|
|
3182
|
+
pButton
|
|
2972
3183
|
[text]="true"
|
|
2973
3184
|
severity="secondary"
|
|
2974
3185
|
size="small"
|
|
2975
|
-
|
|
3186
|
+
class="!w-8 !h-8"
|
|
2976
3187
|
[pTooltip]="'task.manager.board.manage.members' | translate"
|
|
2977
3188
|
tooltipPosition="bottom"
|
|
2978
|
-
(
|
|
2979
|
-
|
|
2980
|
-
|
|
2981
|
-
|
|
3189
|
+
(click)="showMembersDialog.set(true)"
|
|
3190
|
+
>
|
|
3191
|
+
<span pButtonIcon class="pi pi-users"></span>
|
|
3192
|
+
</button>
|
|
3193
|
+
<button
|
|
3194
|
+
pButton
|
|
2982
3195
|
[text]="true"
|
|
2983
3196
|
severity="secondary"
|
|
2984
3197
|
size="small"
|
|
2985
|
-
|
|
3198
|
+
class="!w-8 !h-8"
|
|
2986
3199
|
[pTooltip]="'task.manager.board.manage.labels' | translate"
|
|
2987
3200
|
tooltipPosition="bottom"
|
|
2988
|
-
(
|
|
2989
|
-
|
|
3201
|
+
(click)="showLabelsDialog.set(true)"
|
|
3202
|
+
>
|
|
3203
|
+
<span pButtonIcon class="pi pi-tag"></span>
|
|
3204
|
+
</button>
|
|
2990
3205
|
|
|
2991
3206
|
@if (viewMode() === 'board') {
|
|
2992
|
-
<div
|
|
2993
|
-
|
|
2994
|
-
|
|
2995
|
-
|
|
3207
|
+
<div
|
|
3208
|
+
class="h-5 w-px bg-surface-300 dark:bg-surface-600 mx-0.5"
|
|
3209
|
+
></div>
|
|
3210
|
+
<button
|
|
3211
|
+
pButton
|
|
2996
3212
|
size="small"
|
|
2997
|
-
(
|
|
2998
|
-
|
|
3213
|
+
(click)="showAddListDialog.set(true)"
|
|
3214
|
+
>
|
|
3215
|
+
<span pButtonIcon class="pi pi-plus"></span>
|
|
3216
|
+
<span pButtonLabel>{{
|
|
3217
|
+
'task.manager.board.add.list' | translate
|
|
3218
|
+
}}</span>
|
|
3219
|
+
</button>
|
|
2999
3220
|
}
|
|
3000
3221
|
</div>
|
|
3001
3222
|
</div>
|
|
3002
3223
|
|
|
3003
3224
|
@if (state.activeBoard(); as board) {
|
|
3004
|
-
<div
|
|
3225
|
+
<div
|
|
3226
|
+
class="h-0.5 w-full flex-shrink-0"
|
|
3227
|
+
[style.background-color]="board.color"
|
|
3228
|
+
></div>
|
|
3005
3229
|
}
|
|
3006
3230
|
</div>
|
|
3007
3231
|
|
|
@@ -3024,7 +3248,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
3024
3248
|
}
|
|
3025
3249
|
</div>
|
|
3026
3250
|
}
|
|
3027
|
-
|
|
3028
3251
|
} @else if (viewMode() === 'board') {
|
|
3029
3252
|
<div
|
|
3030
3253
|
class="flex gap-4 p-5 overflow-x-auto flex-1"
|
|
@@ -3036,15 +3259,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
3036
3259
|
@for (list of state.listsWithTasks(); track list.id) {
|
|
3037
3260
|
<div
|
|
3038
3261
|
cdkDrag
|
|
3039
|
-
class="flex-shrink-0 w-72 flex flex-col max-h-[calc(100vh-140px)] self-start"
|
|
3262
|
+
class="flex-shrink-0 w-72 flex flex-col max-h-[calc(100vh-140px)] self-start rounded-border border border-surface shadow-sm overflow-hidden"
|
|
3040
3263
|
>
|
|
3041
3264
|
<div
|
|
3042
|
-
class="flex items-center gap-1 px-2 py-2.5
|
|
3043
|
-
[style.border-top]="'3px solid ' + list.color"
|
|
3265
|
+
class="flex items-center gap-1 px-2.5 py-2.5 border-b border-surface"
|
|
3044
3266
|
>
|
|
3045
3267
|
<i
|
|
3046
3268
|
cdkDragHandle
|
|
3047
|
-
class="pi pi-bars text-
|
|
3269
|
+
class="pi pi-bars text-muted-color text-xs cursor-grab flex-shrink-0 px-1"
|
|
3048
3270
|
></i>
|
|
3049
3271
|
|
|
3050
3272
|
<div class="flex items-center gap-2 min-w-0 flex-1">
|
|
@@ -3061,7 +3283,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
3061
3283
|
autofocus
|
|
3062
3284
|
/>
|
|
3063
3285
|
} @else {
|
|
3064
|
-
<span class="font-semibold text-sm truncate">{{
|
|
3286
|
+
<span class="font-semibold text-sm truncate">{{
|
|
3287
|
+
list.name
|
|
3288
|
+
}}</span>
|
|
3065
3289
|
<span
|
|
3066
3290
|
class="text-[11px] font-semibold px-1.5 py-0.5 rounded-full text-white flex-shrink-0"
|
|
3067
3291
|
[style.background-color]="list.color"
|
|
@@ -3072,35 +3296,41 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
3072
3296
|
</div>
|
|
3073
3297
|
|
|
3074
3298
|
@if (editingListId() === list.id) {
|
|
3075
|
-
<
|
|
3076
|
-
|
|
3299
|
+
<button
|
|
3300
|
+
pButton
|
|
3077
3301
|
[text]="true"
|
|
3078
3302
|
size="small"
|
|
3079
3303
|
severity="success"
|
|
3080
|
-
|
|
3304
|
+
class="!w-6 !h-6 flex-shrink-0"
|
|
3081
3305
|
(mousedown)="$event.preventDefault()"
|
|
3082
3306
|
(click)="saveRenameList(); $event.stopPropagation()"
|
|
3083
|
-
|
|
3084
|
-
|
|
3085
|
-
|
|
3307
|
+
>
|
|
3308
|
+
<span pButtonIcon class="pi pi-check"></span>
|
|
3309
|
+
</button>
|
|
3310
|
+
<button
|
|
3311
|
+
pButton
|
|
3086
3312
|
[text]="true"
|
|
3087
3313
|
size="small"
|
|
3088
3314
|
severity="secondary"
|
|
3089
|
-
|
|
3315
|
+
class="!w-6 !h-6 flex-shrink-0"
|
|
3090
3316
|
(mousedown)="$event.preventDefault()"
|
|
3091
3317
|
(click)="cancelRenameList(); $event.stopPropagation()"
|
|
3092
|
-
|
|
3318
|
+
>
|
|
3319
|
+
<span pButtonIcon class="pi pi-times"></span>
|
|
3320
|
+
</button>
|
|
3093
3321
|
} @else {
|
|
3094
|
-
<
|
|
3095
|
-
|
|
3322
|
+
<button
|
|
3323
|
+
pButton
|
|
3096
3324
|
[text]="true"
|
|
3097
3325
|
size="small"
|
|
3098
3326
|
severity="secondary"
|
|
3099
|
-
|
|
3327
|
+
class="!w-6 !h-6 flex-shrink-0"
|
|
3100
3328
|
[pTooltip]="'task.manager.list.rename' | translate"
|
|
3101
3329
|
tooltipPosition="bottom"
|
|
3102
3330
|
(click)="startRenameList(list); $event.stopPropagation()"
|
|
3103
|
-
|
|
3331
|
+
>
|
|
3332
|
+
<span pButtonIcon class="pi pi-pencil"></span>
|
|
3333
|
+
</button>
|
|
3104
3334
|
}
|
|
3105
3335
|
</div>
|
|
3106
3336
|
|
|
@@ -3110,7 +3340,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
3110
3340
|
[cdkDropListData]="list.tasks"
|
|
3111
3341
|
[cdkDropListConnectedTo]="listDropIds()"
|
|
3112
3342
|
(cdkDropListDropped)="onTaskDrop($event)"
|
|
3113
|
-
class="flex flex-col gap-2 p-2 overflow-y-auto flex-1 min-h-[60px]
|
|
3343
|
+
class="flex flex-col gap-2 p-2 overflow-y-auto flex-1 min-h-[60px]"
|
|
3114
3344
|
>
|
|
3115
3345
|
@for (task of list.tasks; track task.id) {
|
|
3116
3346
|
<div cdkDrag>
|
|
@@ -3124,56 +3354,60 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
3124
3354
|
}
|
|
3125
3355
|
@if (list.tasks.length === 0) {
|
|
3126
3356
|
<div
|
|
3127
|
-
class="flex items-center justify-center h-14 border-2 border-dashed border-surface
|
|
3357
|
+
class="flex items-center justify-center h-14 border-2 border-dashed border-surface rounded-border"
|
|
3128
3358
|
>
|
|
3129
|
-
<span class="text-xs text-
|
|
3359
|
+
<span class="text-xs text-muted-color">{{
|
|
3130
3360
|
'task.manager.board.drop.tasks.here' | translate
|
|
3131
3361
|
}}</span>
|
|
3132
3362
|
</div>
|
|
3133
3363
|
}
|
|
3134
3364
|
</div>
|
|
3135
3365
|
|
|
3136
|
-
<div
|
|
3137
|
-
|
|
3138
|
-
|
|
3139
|
-
<p-button
|
|
3140
|
-
icon="pi pi-plus"
|
|
3141
|
-
[label]="'task.manager.board.add.task' | translate"
|
|
3366
|
+
<div class="border-t border-surface p-1.5">
|
|
3367
|
+
<button
|
|
3368
|
+
pButton
|
|
3142
3369
|
severity="secondary"
|
|
3370
|
+
[text]="true"
|
|
3143
3371
|
size="small"
|
|
3144
|
-
|
|
3145
|
-
(
|
|
3146
|
-
|
|
3372
|
+
class="w-full !justify-start"
|
|
3373
|
+
(click)="openAddTask(list)"
|
|
3374
|
+
>
|
|
3375
|
+
<span pButtonIcon class="pi pi-plus"></span>
|
|
3376
|
+
<span pButtonLabel>{{
|
|
3377
|
+
'task.manager.board.add.task' | translate
|
|
3378
|
+
}}</span>
|
|
3379
|
+
</button>
|
|
3147
3380
|
</div>
|
|
3148
3381
|
</div>
|
|
3149
3382
|
}
|
|
3150
3383
|
|
|
3151
3384
|
@if (state.listsWithTasks().length === 0) {
|
|
3152
3385
|
<div class="flex-1 flex items-center justify-center">
|
|
3153
|
-
<div class="text-center text-
|
|
3386
|
+
<div class="text-center text-muted-color">
|
|
3154
3387
|
<div
|
|
3155
|
-
class="w-16 h-16 rounded-2xl flex items-center justify-center mx-auto mb-4"
|
|
3388
|
+
class="w-16 h-16 rounded-2xl border-2 border-dashed border-surface flex items-center justify-center mx-auto mb-4"
|
|
3156
3389
|
>
|
|
3157
|
-
<i
|
|
3158
|
-
class="pi pi-list text-3xl text-surface-300 dark:text-surface-600"
|
|
3159
|
-
></i>
|
|
3390
|
+
<i class="pi pi-list text-3xl text-muted-color"></i>
|
|
3160
3391
|
</div>
|
|
3161
|
-
<p class="font-medium text-
|
|
3392
|
+
<p class="font-medium text-muted-color">
|
|
3162
3393
|
{{ 'task.manager.board.list.empty' | translate }}
|
|
3163
3394
|
</p>
|
|
3164
|
-
<
|
|
3165
|
-
|
|
3166
|
-
[label]="'task.manager.board.add.list' | translate"
|
|
3395
|
+
<button
|
|
3396
|
+
pButton
|
|
3167
3397
|
severity="secondary"
|
|
3168
3398
|
size="small"
|
|
3169
3399
|
class="mt-3"
|
|
3170
|
-
(
|
|
3171
|
-
|
|
3400
|
+
(click)="showAddListDialog.set(true)"
|
|
3401
|
+
>
|
|
3402
|
+
<span pButtonIcon class="pi pi-plus"></span>
|
|
3403
|
+
<span pButtonLabel>{{
|
|
3404
|
+
'task.manager.board.add.list' | translate
|
|
3405
|
+
}}</span>
|
|
3406
|
+
</button>
|
|
3172
3407
|
</div>
|
|
3173
3408
|
</div>
|
|
3174
3409
|
}
|
|
3175
3410
|
</div>
|
|
3176
|
-
|
|
3177
3411
|
} @else {
|
|
3178
3412
|
<div class="p-4 sm:p-6 flex-1 overflow-auto">
|
|
3179
3413
|
<div class="card">
|
|
@@ -3191,24 +3425,26 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
3191
3425
|
<tr>
|
|
3192
3426
|
<th pSortableColumn="title" class="min-w-[240px]">
|
|
3193
3427
|
{{ 'task.manager.table.title' | translate }}
|
|
3194
|
-
<p-
|
|
3428
|
+
<p-sorticon field="title" />
|
|
3195
3429
|
</th>
|
|
3196
3430
|
<th pSortableColumn="listName" class="w-40">
|
|
3197
3431
|
{{ 'task.manager.table.list' | translate }}
|
|
3198
|
-
<p-
|
|
3432
|
+
<p-sorticon field="listName" />
|
|
3199
3433
|
</th>
|
|
3200
3434
|
<th pSortableColumn="priority" class="w-32">
|
|
3201
3435
|
{{ 'task.manager.table.priority' | translate }}
|
|
3202
|
-
<p-
|
|
3436
|
+
<p-sorticon field="priority" />
|
|
3203
3437
|
</th>
|
|
3204
3438
|
<th class="w-36">
|
|
3205
3439
|
{{ 'task.manager.table.assignee' | translate }}
|
|
3206
3440
|
</th>
|
|
3207
3441
|
<th pSortableColumn="dueDate" class="w-32">
|
|
3208
3442
|
{{ 'task.manager.table.due.date' | translate }}
|
|
3209
|
-
<p-
|
|
3443
|
+
<p-sorticon field="dueDate" />
|
|
3444
|
+
</th>
|
|
3445
|
+
<th class="w-[100px]">
|
|
3446
|
+
{{ 'shared.actions' | translate }}
|
|
3210
3447
|
</th>
|
|
3211
|
-
<th class="w-[100px]">{{ 'shared.actions' | translate }}</th>
|
|
3212
3448
|
</tr>
|
|
3213
3449
|
</ng-template>
|
|
3214
3450
|
<ng-template #body let-task>
|
|
@@ -3217,7 +3453,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
3217
3453
|
<span
|
|
3218
3454
|
class="font-medium text-sm cursor-pointer hover:text-primary-500 transition-colors"
|
|
3219
3455
|
(click)="state.selectTask(task)"
|
|
3220
|
-
|
|
3456
|
+
>{{ task.title }}</span
|
|
3457
|
+
>
|
|
3221
3458
|
</td>
|
|
3222
3459
|
<td>
|
|
3223
3460
|
<span class="inline-flex items-center gap-1.5 text-sm">
|
|
@@ -3237,10 +3474,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
3237
3474
|
<td>
|
|
3238
3475
|
@if (task.assignees?.length) {
|
|
3239
3476
|
<div class="flex items-center -space-x-1.5">
|
|
3240
|
-
@for (
|
|
3477
|
+
@for (
|
|
3478
|
+
a of task.assignees!.slice(0, 3);
|
|
3479
|
+
track a.userId
|
|
3480
|
+
) {
|
|
3241
3481
|
<span
|
|
3242
|
-
class="w-6 h-6 rounded-full flex items-center justify-center text-[10px] font-bold text-white flex-shrink-0 ring-2 ring-
|
|
3243
|
-
[style.background-color]="
|
|
3482
|
+
class="w-6 h-6 rounded-full flex items-center justify-center text-[10px] font-bold text-white flex-shrink-0 ring-2 ring-surface-card"
|
|
3483
|
+
[style.background-color]="
|
|
3484
|
+
memberColorById(a.userId)
|
|
3485
|
+
"
|
|
3244
3486
|
[pTooltip]="a.userName ?? ''"
|
|
3245
3487
|
>
|
|
3246
3488
|
{{ getMemberInitials(a.userId) }}
|
|
@@ -3248,7 +3490,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
3248
3490
|
}
|
|
3249
3491
|
@if (task.assignees!.length > 3) {
|
|
3250
3492
|
<span
|
|
3251
|
-
class="w-6 h-6 rounded-full bg-surface-200 dark:bg-surface-700 flex items-center justify-center text-[10px] font-bold text-surface-600 ring-2 ring-
|
|
3493
|
+
class="w-6 h-6 rounded-full bg-surface-200 dark:bg-surface-700 flex items-center justify-center text-[10px] font-bold text-surface-600 ring-2 ring-surface-card flex-shrink-0"
|
|
3252
3494
|
>
|
|
3253
3495
|
+{{ task.assignees!.length - 3 }}
|
|
3254
3496
|
</span>
|
|
@@ -3272,22 +3514,26 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
3272
3514
|
</td>
|
|
3273
3515
|
<td>
|
|
3274
3516
|
<div class="flex gap-1">
|
|
3275
|
-
<
|
|
3276
|
-
|
|
3517
|
+
<button
|
|
3518
|
+
pButton
|
|
3277
3519
|
[text]="true"
|
|
3278
3520
|
severity="secondary"
|
|
3279
3521
|
size="small"
|
|
3280
3522
|
[pTooltip]="'shared.edit' | translate"
|
|
3281
|
-
(
|
|
3282
|
-
|
|
3283
|
-
|
|
3284
|
-
|
|
3523
|
+
(click)="onEditTask(task)"
|
|
3524
|
+
>
|
|
3525
|
+
<span pButtonIcon class="pi pi-pencil"></span>
|
|
3526
|
+
</button>
|
|
3527
|
+
<button
|
|
3528
|
+
pButton
|
|
3285
3529
|
[text]="true"
|
|
3286
3530
|
severity="danger"
|
|
3287
3531
|
size="small"
|
|
3288
3532
|
[pTooltip]="'shared.delete' | translate"
|
|
3289
|
-
(
|
|
3290
|
-
|
|
3533
|
+
(click)="onDeleteTask(task)"
|
|
3534
|
+
>
|
|
3535
|
+
<span pButtonIcon class="pi pi-trash"></span>
|
|
3536
|
+
</button>
|
|
3291
3537
|
</div>
|
|
3292
3538
|
</td>
|
|
3293
3539
|
</tr>
|
|
@@ -3352,24 +3598,30 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
3352
3598
|
class="w-10 h-10 rounded cursor-pointer border border-surface-300"
|
|
3353
3599
|
/>
|
|
3354
3600
|
</div>
|
|
3355
|
-
<
|
|
3356
|
-
|
|
3357
|
-
[label]="'task.manager.label.add' | translate"
|
|
3601
|
+
<button
|
|
3602
|
+
pButton
|
|
3358
3603
|
size="small"
|
|
3359
|
-
|
|
3360
|
-
|
|
3361
|
-
|
|
3604
|
+
(click)="addLabel()"
|
|
3605
|
+
[disabled]="isAddingLabel()"
|
|
3606
|
+
>
|
|
3607
|
+
@if (isAddingLabel()) {
|
|
3608
|
+
<span pButtonIcon class="pi pi-spinner pi-spin"></span>
|
|
3609
|
+
} @else {
|
|
3610
|
+
<span pButtonIcon class="pi pi-plus"></span>
|
|
3611
|
+
}
|
|
3612
|
+
<span pButtonLabel>{{ 'task.manager.label.add' | translate }}</span>
|
|
3613
|
+
</button>
|
|
3362
3614
|
</div>
|
|
3363
3615
|
|
|
3364
3616
|
<div class="flex flex-col gap-2 max-h-64 overflow-y-auto">
|
|
3365
3617
|
@if (state.labels().length === 0) {
|
|
3366
|
-
<p class="text-sm text-
|
|
3618
|
+
<p class="text-sm text-muted-color text-center py-4">
|
|
3367
3619
|
{{ 'task.manager.label.no.labels' | translate }}
|
|
3368
3620
|
</p>
|
|
3369
3621
|
}
|
|
3370
3622
|
@for (label of state.labels(); track label.id) {
|
|
3371
3623
|
<div
|
|
3372
|
-
class="flex items-center justify-between px-3 py-2 rounded-
|
|
3624
|
+
class="flex items-center justify-between px-3 py-2 rounded-border border border-surface"
|
|
3373
3625
|
>
|
|
3374
3626
|
<div class="flex items-center gap-2">
|
|
3375
3627
|
<span
|
|
@@ -3378,13 +3630,15 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
3378
3630
|
></span>
|
|
3379
3631
|
<span class="text-sm font-medium">{{ label.name }}</span>
|
|
3380
3632
|
</div>
|
|
3381
|
-
<
|
|
3382
|
-
|
|
3633
|
+
<button
|
|
3634
|
+
pButton
|
|
3383
3635
|
severity="danger"
|
|
3384
3636
|
size="small"
|
|
3385
3637
|
[text]="true"
|
|
3386
|
-
(
|
|
3387
|
-
|
|
3638
|
+
(click)="removeLabel(label.id)"
|
|
3639
|
+
>
|
|
3640
|
+
<span pButtonIcon class="pi pi-trash"></span>
|
|
3641
|
+
</button>
|
|
3388
3642
|
</div>
|
|
3389
3643
|
}
|
|
3390
3644
|
</div>
|
|
@@ -3424,7 +3678,6 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
3424
3678
|
'task.manager.member.role.placeholder' | translate
|
|
3425
3679
|
"
|
|
3426
3680
|
class="w-full"
|
|
3427
|
-
appendTo="body"
|
|
3428
3681
|
>
|
|
3429
3682
|
<ng-template #selectedItem let-opt>
|
|
3430
3683
|
{{ opt.labelKey | translate }}
|
|
@@ -3434,26 +3687,33 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
3434
3687
|
</ng-template>
|
|
3435
3688
|
</p-select>
|
|
3436
3689
|
</div>
|
|
3437
|
-
<
|
|
3438
|
-
|
|
3439
|
-
[label]="'task.manager.member.add' | translate"
|
|
3690
|
+
<button
|
|
3691
|
+
pButton
|
|
3440
3692
|
size="small"
|
|
3441
|
-
[
|
|
3442
|
-
|
|
3443
|
-
|
|
3444
|
-
|
|
3693
|
+
[disabled]="!selectedMemberUser || isAddingMember()"
|
|
3694
|
+
(click)="addMember()"
|
|
3695
|
+
>
|
|
3696
|
+
@if (isAddingMember()) {
|
|
3697
|
+
<span pButtonIcon class="pi pi-spinner pi-spin"></span>
|
|
3698
|
+
} @else {
|
|
3699
|
+
<span pButtonIcon class="pi pi-plus"></span>
|
|
3700
|
+
}
|
|
3701
|
+
<span pButtonLabel>{{
|
|
3702
|
+
'task.manager.member.add' | translate
|
|
3703
|
+
}}</span>
|
|
3704
|
+
</button>
|
|
3445
3705
|
</div>
|
|
3446
3706
|
</div>
|
|
3447
3707
|
|
|
3448
3708
|
<div class="flex flex-col gap-2 max-h-72 overflow-y-auto">
|
|
3449
3709
|
@if (state.members().length === 0) {
|
|
3450
|
-
<p class="text-sm text-
|
|
3710
|
+
<p class="text-sm text-muted-color text-center py-4">
|
|
3451
3711
|
{{ 'task.manager.member.no.members' | translate }}
|
|
3452
3712
|
</p>
|
|
3453
3713
|
}
|
|
3454
3714
|
@for (member of state.members(); track member.id) {
|
|
3455
3715
|
<div
|
|
3456
|
-
class="flex items-center justify-between px-3 py-2.5 rounded-
|
|
3716
|
+
class="flex items-center justify-between px-3 py-2.5 rounded-border border border-surface"
|
|
3457
3717
|
>
|
|
3458
3718
|
<div class="flex items-center gap-3">
|
|
3459
3719
|
<div
|
|
@@ -3467,7 +3727,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
3467
3727
|
{{ member.userName ?? member.userId }}
|
|
3468
3728
|
</div>
|
|
3469
3729
|
@if (member.userEmail) {
|
|
3470
|
-
<div class="text-xs text-
|
|
3730
|
+
<div class="text-xs text-muted-color">
|
|
3471
3731
|
{{ member.userEmail }}
|
|
3472
3732
|
</div>
|
|
3473
3733
|
}
|
|
@@ -3478,16 +3738,21 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
3478
3738
|
class="text-[10px] font-semibold px-2 py-0.5 rounded-full"
|
|
3479
3739
|
[class]="roleBadgeClass(member.role)"
|
|
3480
3740
|
>
|
|
3481
|
-
{{
|
|
3741
|
+
{{
|
|
3742
|
+
'task.manager.member.role.' + member.role.toLowerCase()
|
|
3743
|
+
| translate
|
|
3744
|
+
}}
|
|
3482
3745
|
</span>
|
|
3483
3746
|
@if (member.role !== 'OWNER') {
|
|
3484
|
-
<
|
|
3485
|
-
|
|
3747
|
+
<button
|
|
3748
|
+
pButton
|
|
3486
3749
|
severity="danger"
|
|
3487
3750
|
size="small"
|
|
3488
3751
|
[text]="true"
|
|
3489
|
-
(
|
|
3490
|
-
|
|
3752
|
+
(click)="removeMember(member.userId)"
|
|
3753
|
+
>
|
|
3754
|
+
<span pButtonIcon class="pi pi-trash"></span>
|
|
3755
|
+
</button>
|
|
3491
3756
|
}
|
|
3492
3757
|
</div>
|
|
3493
3758
|
</div>
|
|
@@ -3514,18 +3779,21 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
3514
3779
|
[placeholder]="'task.manager.list.name.placeholder' | translate"
|
|
3515
3780
|
/>
|
|
3516
3781
|
</div>
|
|
3517
|
-
<ng-template
|
|
3782
|
+
<ng-template #footer>
|
|
3518
3783
|
<div class="flex justify-end gap-2">
|
|
3519
|
-
<
|
|
3520
|
-
|
|
3784
|
+
<button
|
|
3785
|
+
pButton
|
|
3521
3786
|
severity="secondary"
|
|
3522
|
-
(
|
|
3523
|
-
|
|
3524
|
-
|
|
3525
|
-
|
|
3526
|
-
|
|
3527
|
-
(
|
|
3528
|
-
|
|
3787
|
+
(click)="showAddListDialog.set(false)"
|
|
3788
|
+
>
|
|
3789
|
+
<span pButtonLabel>{{ 'shared.cancel' | translate }}</span>
|
|
3790
|
+
</button>
|
|
3791
|
+
<button pButton (click)="addList()" [disabled]="isAddingList()">
|
|
3792
|
+
@if (isAddingList()) {
|
|
3793
|
+
<span pButtonIcon class="pi pi-spinner pi-spin"></span>
|
|
3794
|
+
}
|
|
3795
|
+
<span pButtonLabel>{{ 'shared.create' | translate }}</span>
|
|
3796
|
+
</button>
|
|
3529
3797
|
</div>
|
|
3530
3798
|
</ng-template>
|
|
3531
3799
|
</p-dialog>
|
|
@@ -3552,7 +3820,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
3552
3820
|
pTextarea
|
|
3553
3821
|
[(ngModel)]="editBoardDescription"
|
|
3554
3822
|
[rows]="3"
|
|
3555
|
-
[placeholder]="
|
|
3823
|
+
[placeholder]="
|
|
3824
|
+
'task.manager.board.description.placeholder' | translate
|
|
3825
|
+
"
|
|
3556
3826
|
></textarea>
|
|
3557
3827
|
</div>
|
|
3558
3828
|
<div class="flex flex-col gap-1">
|
|
@@ -3580,19 +3850,25 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.5", ngImpor
|
|
|
3580
3850
|
</div>
|
|
3581
3851
|
</div>
|
|
3582
3852
|
</div>
|
|
3583
|
-
<ng-template
|
|
3853
|
+
<ng-template #footer>
|
|
3584
3854
|
<div class="flex justify-end gap-2">
|
|
3585
|
-
<
|
|
3586
|
-
|
|
3855
|
+
<button
|
|
3856
|
+
pButton
|
|
3587
3857
|
severity="secondary"
|
|
3588
|
-
(
|
|
3589
|
-
|
|
3590
|
-
|
|
3591
|
-
|
|
3592
|
-
|
|
3593
|
-
|
|
3594
|
-
|
|
3595
|
-
|
|
3858
|
+
(click)="showEditBoardDialog.set(false)"
|
|
3859
|
+
>
|
|
3860
|
+
<span pButtonLabel>{{ 'shared.cancel' | translate }}</span>
|
|
3861
|
+
</button>
|
|
3862
|
+
<button
|
|
3863
|
+
pButton
|
|
3864
|
+
[disabled]="!editBoardName.trim() || isSavingBoard()"
|
|
3865
|
+
(click)="saveBoard()"
|
|
3866
|
+
>
|
|
3867
|
+
@if (isSavingBoard()) {
|
|
3868
|
+
<span pButtonIcon class="pi pi-spinner pi-spin"></span>
|
|
3869
|
+
}
|
|
3870
|
+
<span pButtonLabel>{{ 'shared.save' | translate }}</span>
|
|
3871
|
+
</button>
|
|
3596
3872
|
</div>
|
|
3597
3873
|
</ng-template>
|
|
3598
3874
|
</p-dialog>
|