@flusys/ng-task-manager 5.4.0 → 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 i9$1 from '@angular/common';
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 i3 from '@angular/forms';
14
+ import * as i2$1 from '@angular/forms';
15
15
  import { FormsModule } from '@angular/forms';
16
- import * as i9 from 'primeng/button';
16
+ import * as i2$2 from 'primeng/button';
17
17
  import { ButtonModule } from 'primeng/button';
18
- import * as i7 from 'primeng/datepicker';
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 i4 from 'primeng/inputtext';
22
+ import * as i3 from 'primeng/inputtext';
23
23
  import { InputTextModule } from 'primeng/inputtext';
24
- import * as i8 from 'primeng/multiselect';
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 i2$1 from 'primeng/api';
31
- import { ConfirmationService, MessageService } from 'primeng/api';
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 i6$1 from 'primeng/skeleton';
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 * as i9$2 from 'primeng/table';
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: "21.1.5", ngImport: i0, type: TaskBoardApiService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
57
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.1.5", ngImport: i0, type: TaskBoardApiService, providedIn: 'root' });
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: "21.1.5", ngImport: i0, type: TaskBoardApiService, decorators: [{
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: "21.1.5", ngImport: i0, type: TaskApiService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
72
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.1.5", ngImport: i0, type: TaskApiService, providedIn: 'root' });
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: "21.1.5", ngImport: i0, type: TaskApiService, decorators: [{
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: "21.1.5", ngImport: i0, type: TaskListApiService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
89
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.1.5", ngImport: i0, type: TaskListApiService, providedIn: 'root' });
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: "21.1.5", ngImport: i0, type: TaskListApiService, decorators: [{
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: "21.1.5", ngImport: i0, type: TaskLabelApiService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
100
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.1.5", ngImport: i0, type: TaskLabelApiService, providedIn: 'root' });
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: "21.1.5", ngImport: i0, type: TaskLabelApiService, decorators: [{
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: "21.1.5", ngImport: i0, type: TaskCommentApiService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
111
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.1.5", ngImport: i0, type: TaskCommentApiService, providedIn: 'root' });
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: "21.1.5", ngImport: i0, type: TaskCommentApiService, decorators: [{
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, ...(ngDevMode ? [{ debugName: "_isConnected" }] : []));
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: "21.1.5", ngImport: i0, type: TaskBoardSocketService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
161
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.1.5", ngImport: i0, type: TaskBoardSocketService, providedIn: 'root' });
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: "21.1.5", ngImport: i0, type: TaskBoardSocketService, decorators: [{
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([], ...(ngDevMode ? [{ debugName: "_boards" }] : []));
176
- _activeBoard = signal(null, ...(ngDevMode ? [{ debugName: "_activeBoard" }] : []));
177
- _lists = signal([], ...(ngDevMode ? [{ debugName: "_lists" }] : []));
178
- _tasks = signal([], ...(ngDevMode ? [{ debugName: "_tasks" }] : []));
179
- _labels = signal([], ...(ngDevMode ? [{ debugName: "_labels" }] : []));
180
- _members = signal([], ...(ngDevMode ? [{ debugName: "_members" }] : []));
181
- _selectedTask = signal(null, ...(ngDevMode ? [{ debugName: "_selectedTask" }] : []));
182
- _isLoading = signal(false, ...(ngDevMode ? [{ debugName: "_isLoading" }] : []));
183
- _isBoardLoading = signal(false, ...(ngDevMode ? [{ debugName: "_isBoardLoading" }] : []));
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
- }, ...(ngDevMode ? [{ debugName: "tasksByList" }] : []));
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
- })), ...(ngDevMode ? [{ debugName: "listsWithTasks" }] : []));
209
- hasActiveBoard = computed(() => this._activeBoard() !== null, ...(ngDevMode ? [{ debugName: "hasActiveBoard" }] : []));
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: "21.1.5", ngImport: i0, type: TaskBoardStateService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
372
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.1.5", ngImport: i0, type: TaskBoardStateService, providedIn: 'root' });
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: "21.1.5", ngImport: i0, type: TaskBoardStateService, decorators: [{
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(...(ngDevMode ? [{ debugName: "task" }] : []));
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), ...(ngDevMode ? [{ debugName: "visibleAssignees" }] : []));
430
- overflowCount = computed(() => Math.max(0, (this.task().assignees ?? []).length - this.MAX_VISIBLE), ...(ngDevMode ? [{ debugName: "overflowCount" }] : []));
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: "21.1.5", ngImport: i0, type: TaskCardComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
436
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.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: `
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-lg border border-surface-200 dark:border-surface-700 p-3 cursor-pointer shadow-sm hover:shadow-md transition-shadow"
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-100 dark:hover:bg-surface-700 transition-colors"
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-100 dark:hover:bg-surface-700 transition-colors"
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-surface-500"
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-white dark:ring-surface-800"
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-white dark:ring-surface-800"
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: ["styleClass", "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", "ptTooltip", "pTooltipPT", "pTooltipUnstyled"] }, { kind: "pipe", type: DatePipe, name: "date" }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
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: "21.1.5", ngImport: i0, type: TaskCardComponent, decorators: [{
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-lg border border-surface-200 dark:border-surface-700 p-3 cursor-pointer shadow-sm hover:shadow-md transition-shadow"
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-100 dark:hover:bg-surface-700 transition-colors"
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-100 dark:hover:bg-surface-700 transition-colors"
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-surface-500"
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-white dark:ring-surface-800"
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-white dark:ring-surface-800"
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
- { label: 'task.priority.LOW', value: 'LOW' },
605
- { label: 'task.priority.MEDIUM', value: 'MEDIUM' },
606
- { label: 'task.priority.HIGH', value: 'HIGH' },
607
- { label: 'task.priority.URGENT', value: 'URGENT' },
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, ...(ngDevMode ? [{ debugName: "visible" }] : []));
612
- task = input(null, ...(ngDevMode ? [{ debugName: "task" }] : []));
613
- boardId = input.required(...(ngDevMode ? [{ debugName: "boardId" }] : []));
614
- listId = input.required(...(ngDevMode ? [{ debugName: "listId" }] : []));
615
- members = input([], ...(ngDevMode ? [{ debugName: "members" }] : []));
616
- labels = input([], ...(ngDevMode ? [{ debugName: "labels" }] : []));
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, ...(ngDevMode ? [{ debugName: "isSaving" }] : []));
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: "21.1.5", ngImport: i0, type: TaskFormDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
699
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.1.0", version: "21.1.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: `
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="label"
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.label | translate }}
767
+ {{ opt.labelKey | translate }}
748
768
  </ng-template>
749
769
  <ng-template #item let-opt>
750
- {{ opt.label | translate }}
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-multiselect
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-multiselect
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 pTemplate="footer">
817
+ <ng-template #footer>
798
818
  <div class="flex justify-end gap-2 pt-1">
799
- <p-button
800
- [label]="'shared.cancel' | translate"
801
- severity="secondary"
802
- (onClick)="onClose()"
803
- />
804
- <p-button
805
- [label]="'shared.save' | translate"
806
- [loading]="isSaving()"
807
- (onClick)="onSave()"
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", "transitionOptions", "maskMotionOptions", "motionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "closeButtonProps", "maximizeButtonProps", "visible", "style", "position", "role", "appendTo", "content", "contentTemplate", "footerTemplate", "closeIconTemplate", "maximizeIconTemplate", "minimizeIconTemplate", "headlessTemplate"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }, { kind: "directive", type: i2$1.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: InputTextModule }, { kind: "directive", type: i4.InputText, selector: "[pInputText]", inputs: ["hostName", "ptInputText", "pInputTextPT", "pInputTextUnstyled", "pSize", "variant", "fluid", "invalid"] }, { kind: "ngmodule", type: TextareaModule }, { kind: "directive", type: i5.Textarea, selector: "[pTextarea], [pInputTextarea]", inputs: ["pTextareaPT", "pTextareaUnstyled", "autoResize", "pSize", "variant", "fluid", "invalid"], outputs: ["onResize"] }, { kind: "ngmodule", type: SelectModule }, { kind: "component", type: i6.Select, selector: "p-select", inputs: ["id", "scrollHeight", "filter", "panelStyle", "styleClass", "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", "autoOptionFocus", "autofocusFilter", "filterValue", "options", "appendTo", "motionOptions"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "ngmodule", type: DatePickerModule }, { kind: "component", type: i7.DatePicker, selector: "p-datePicker, p-datepicker, p-date-picker", inputs: ["iconDisplay", "styleClass", "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", "showTransitionOptions", "hideTransitionOptions", "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: MultiSelectModule }, { kind: "component", type: i8.MultiSelect, selector: "p-multiSelect, p-multiselect, p-multi-select", inputs: ["id", "ariaLabel", "styleClass", "panelStyle", "panelStyleClass", "inputId", "readonly", "group", "filter", "filterPlaceHolder", "filterLocale", "overlayVisible", "tabindex", "dataKey", "ariaLabelledBy", "displaySelectedLabel", "maxSelectedLabels", "selectionLimit", "selectedItemsLabel", "showToggleAll", "emptyFilterMessage", "emptyMessage", "resetFilterOnHide", "dropdownIcon", "chipIcon", "optionLabel", "optionValue", "optionDisabled", "optionGroupLabel", "optionGroupChildren", "showHeader", "filterBy", "scrollHeight", "lazy", "virtualScroll", "loading", "virtualScrollItemSize", "loadingIcon", "virtualScrollOptions", "overlayOptions", "ariaFilterLabel", "filterMatchMode", "tooltip", "tooltipPosition", "tooltipPositionStyle", "tooltipStyleClass", "autofocusFilter", "display", "autocomplete", "showClear", "autofocus", "placeholder", "options", "filterValue", "selectAll", "focusOnHover", "filterFields", "selectOnFocus", "autoOptionFocus", "highlightOnSelect", "size", "variant", "fluid", "appendTo", "motionOptions"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onClear", "onPanelShow", "onPanelHide", "onLazyLoad", "onRemove", "onSelectAllChange"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i9.Button, selector: "p-button", inputs: ["hostName", "type", "badge", "disabled", "raised", "rounded", "text", "plain", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "iconPos", "icon", "label", "loading", "loadingIcon", "severity", "buttonProps", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
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: "21.1.5", ngImport: i0, type: TaskFormDialogComponent, decorators: [{
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="label"
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.label | translate }}
895
+ {{ opt.labelKey | translate }}
878
896
  </ng-template>
879
897
  <ng-template #item let-opt>
880
- {{ opt.label | translate }}
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-multiselect
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-multiselect
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 pTemplate="footer">
945
+ <ng-template #footer>
928
946
  <div class="flex justify-end gap-2 pt-1">
929
- <p-button
930
- [label]="'shared.cancel' | translate"
931
- severity="secondary"
932
- (onClick)="onClose()"
933
- />
934
- <p-button
935
- [label]="'shared.save' | translate"
936
- [loading]="isSaving()"
937
- (onClick)="onSave()"
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, ...(ngDevMode ? [{ debugName: "task" }] : []));
966
+ task = input(null, /* @ts-ignore */
967
+ ...(ngDevMode ? [{ debugName: "task" }] : /* istanbul ignore next */ []));
950
968
  closePanel = output();
951
969
  editTask = output();
952
- comments = signal([], ...(ngDevMode ? [{ debugName: "comments" }] : []));
953
- isSendingComment = signal(false, ...(ngDevMode ? [{ debugName: "isSendingComment" }] : []));
954
- isSendingReply = signal(false, ...(ngDevMode ? [{ debugName: "isSendingReply" }] : []));
955
- replyingToId = signal(null, ...(ngDevMode ? [{ debugName: "replyingToId" }] : []));
956
- isDeleting = signal(false, ...(ngDevMode ? [{ debugName: "isDeleting" }] : []));
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 ?? [], ...(ngDevMode ? [{ debugName: "assigneeMembers" }] : []));
960
- rootComments = computed(() => this.comments().filter((c) => !c.parentCommentId), ...(ngDevMode ? [{ debugName: "rootComments" }] : []));
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: "21.1.5", ngImport: i0, type: TaskDetailPanelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1040
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.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: `
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
- <p-button
1052
- icon="pi pi-pencil"
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
- (onClick)="editTask.emit(t)"
1059
- />
1060
- <p-button
1061
- icon="pi pi-trash"
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
- (onClick)="deleteTask(t.id)"
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-surface-500">
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-100 dark:border-surface-800 last:border-0"
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-surface-400">{{
1161
+ <span class="text-xs text-muted-color">{{
1131
1162
  comment.createdAt | date: 'MMM d, y, h:mm a'
1132
1163
  }}</span>
1133
- <p-button
1134
- [label]="'task.comment.reply' | translate"
1135
- icon="pi pi-reply"
1164
+ <button
1165
+ pButton
1136
1166
  size="small"
1137
1167
  [text]="true"
1138
1168
  severity="secondary"
1139
- styleClass="opacity-0 group-hover:opacity-100 transition-opacity !py-0.5 !px-1.5 text-xs"
1140
- (onClick)="toggleReply(comment.id)"
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-200 dark:border-surface-700 flex flex-col gap-2"
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-surface-400">{{
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
- <p-button
1176
- icon="pi pi-send"
1208
+ <button
1209
+ pButton
1177
1210
  size="small"
1178
- [loading]="isSendingReply()"
1179
- [disabled]="!replyText.trim()"
1180
- (onClick)="submitReply(t.id, comment.id)"
1181
- />
1182
- <p-button
1183
- icon="pi pi-times"
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
- (onClick)="cancelReply()"
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-surface-400 py-2">
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
- <p-button
1210
- icon="pi pi-send"
1211
- [loading]="isSendingComment()"
1212
- [disabled]="!newComment.trim()"
1213
- (onClick)="addComment(t.id)"
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", "transitionOptions", "visible", "position", "fullScreen", "header", "maskStyle", "closable"], outputs: ["onShow", "onHide", "visibleChange"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i9.Button, selector: "p-button", inputs: ["hostName", "type", "badge", "disabled", "raised", "rounded", "text", "plain", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "iconPos", "icon", "label", "loading", "loadingIcon", "severity", "buttonProps", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "ngmodule", type: TagModule }, { kind: "component", type: i1.Tag, selector: "p-tag", inputs: ["styleClass", "severity", "value", "icon", "rounded"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: TextareaModule }, { kind: "directive", type: i5.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", "ptTooltip", "pTooltipPT", "pTooltipUnstyled"] }, { kind: "pipe", type: DatePipe, name: "date" }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
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: "21.1.5", ngImport: i0, type: TaskDetailPanelComponent, decorators: [{
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
- <p-button
1248
- icon="pi pi-pencil"
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
- (onClick)="editTask.emit(t)"
1255
- />
1256
- <p-button
1257
- icon="pi pi-trash"
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
- (onClick)="deleteTask(t.id)"
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-surface-500">
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-100 dark:border-surface-800 last:border-0"
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-surface-400">{{
1377
+ <span class="text-xs text-muted-color">{{
1327
1378
  comment.createdAt | date: 'MMM d, y, h:mm a'
1328
1379
  }}</span>
1329
- <p-button
1330
- [label]="'task.comment.reply' | translate"
1331
- icon="pi pi-reply"
1380
+ <button
1381
+ pButton
1332
1382
  size="small"
1333
1383
  [text]="true"
1334
1384
  severity="secondary"
1335
- styleClass="opacity-0 group-hover:opacity-100 transition-opacity !py-0.5 !px-1.5 text-xs"
1336
- (onClick)="toggleReply(comment.id)"
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-200 dark:border-surface-700 flex flex-col gap-2"
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-surface-400">{{
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
- <p-button
1372
- icon="pi pi-send"
1424
+ <button
1425
+ pButton
1373
1426
  size="small"
1374
- [loading]="isSendingReply()"
1375
- [disabled]="!replyText.trim()"
1376
- (onClick)="submitReply(t.id, comment.id)"
1377
- />
1378
- <p-button
1379
- icon="pi pi-times"
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
- (onClick)="cancelReply()"
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-surface-400 py-2">
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
- <p-button
1406
- icon="pi pi-send"
1407
- [loading]="isSendingComment()"
1408
- [disabled]="!newComment.trim()"
1409
- (onClick)="addComment(t.id)"
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, ...(ngDevMode ? [{ debugName: "showCreateDialog" }] : []));
1425
- isCreating = signal(false, ...(ngDevMode ? [{ debugName: "isCreating" }] : []));
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: "21.1.5", ngImport: i0, type: BoardListPageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
1460
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.5", type: BoardListPageComponent, isStandalone: true, selector: "tm-board-list-page", ngImport: i0, template: `
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
- <p-button
1474
- [label]="'task.manager.board.new' | translate"
1475
- icon="pi pi-plus"
1476
- (onClick)="showCreateDialog.set(true)"
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
- <p-button
1515
- [label]="'task.manager.board.new' | translate"
1516
- icon="pi pi-plus"
1583
+ <button
1584
+ pButton
1517
1585
  size="small"
1518
- (onClick)="showCreateDialog.set(true)"
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-100 dark:border-surface-700 mt-4 pt-4 space-y-2.5"
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 pTemplate="footer">
1740
+ <ng-template #footer>
1670
1741
  <div class="flex justify-end gap-2">
1671
- <p-button
1672
- [label]="'shared.cancel' | translate"
1742
+ <button
1743
+ pButton
1673
1744
  severity="secondary"
1674
- (onClick)="closeCreateDialog()"
1675
- />
1676
- <p-button
1677
- [label]="'shared.create' | translate"
1678
- [loading]="isCreating()"
1679
- (onClick)="createBoard()"
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: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: PrimeModule }, { kind: "directive", type: i2$1.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "component", type: i9.Button, selector: "p-button", inputs: ["hostName", "type", "badge", "disabled", "raised", "rounded", "text", "plain", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "iconPos", "icon", "label", "loading", "loadingIcon", "severity", "buttonProps", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { 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", "transitionOptions", "maskMotionOptions", "motionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "closeButtonProps", "maximizeButtonProps", "visible", "style", "position", "role", "appendTo", "content", "contentTemplate", "footerTemplate", "closeIconTemplate", "maximizeIconTemplate", "minimizeIconTemplate", "headlessTemplate"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }, { kind: "directive", type: i4.InputText, selector: "[pInputText]", inputs: ["hostName", "ptInputText", "pInputTextPT", "pInputTextUnstyled", "pSize", "variant", "fluid", "invalid"] }, { kind: "component", type: i6$1.Skeleton, selector: "p-skeleton", inputs: ["styleClass", "shape", "animation", "borderRadius", "size", "width", "height"] }, { kind: "directive", type: i5.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", "ptTooltip", "pTooltipPT", "pTooltipUnstyled"] }, { kind: "pipe", type: i9$1.DatePipe, name: "date" }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
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: "21.1.5", ngImport: i0, type: BoardListPageComponent, decorators: [{
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
- <p-button
1705
- [label]="'task.manager.board.new' | translate"
1706
- icon="pi pi-plus"
1707
- (onClick)="showCreateDialog.set(true)"
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
- <p-button
1746
- [label]="'task.manager.board.new' | translate"
1747
- icon="pi pi-plus"
1825
+ <button
1826
+ pButton
1748
1827
  size="small"
1749
- (onClick)="showCreateDialog.set(true)"
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-100 dark:border-surface-700 mt-4 pt-4 space-y-2.5"
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 pTemplate="footer">
1982
+ <ng-template #footer>
1901
1983
  <div class="flex justify-end gap-2">
1902
- <p-button
1903
- [label]="'shared.cancel' | translate"
1984
+ <button
1985
+ pButton
1904
1986
  severity="secondary"
1905
- (onClick)="closeCreateDialog()"
1906
- />
1907
- <p-button
1908
- [label]="'shared.create' | translate"
1909
- [loading]="isCreating()"
1910
- (onClick)="createBoard()"
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, { optional: true });
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(...(ngDevMode ? [{ debugName: "boardId" }] : []));
1936
- viewMode = signal('board', ...(ngDevMode ? [{ debugName: "viewMode" }] : []));
1937
- showTaskForm = signal(false, ...(ngDevMode ? [{ debugName: "showTaskForm" }] : []));
1938
- editingTask = signal(null, ...(ngDevMode ? [{ debugName: "editingTask" }] : []));
1939
- activeListId = signal('', ...(ngDevMode ? [{ debugName: "activeListId" }] : []));
1940
- showAddListDialog = signal(false, ...(ngDevMode ? [{ debugName: "showAddListDialog" }] : []));
1941
- isAddingList = signal(false, ...(ngDevMode ? [{ debugName: "isAddingList" }] : []));
1942
- showLabelsDialog = signal(false, ...(ngDevMode ? [{ debugName: "showLabelsDialog" }] : []));
1943
- isAddingLabel = signal(false, ...(ngDevMode ? [{ debugName: "isAddingLabel" }] : []));
1944
- showMembersDialog = signal(false, ...(ngDevMode ? [{ debugName: "showMembersDialog" }] : []));
1945
- isAddingMember = signal(false, ...(ngDevMode ? [{ debugName: "isAddingMember" }] : []));
1946
- editingListId = signal(null, ...(ngDevMode ? [{ debugName: "editingListId" }] : []));
1947
- editingListNameValue = signal('', ...(ngDevMode ? [{ debugName: "editingListNameValue" }] : []));
1948
- showEditBoardDialog = signal(false, ...(ngDevMode ? [{ debugName: "showEditBoardDialog" }] : []));
1949
- isSavingBoard = signal(false, ...(ngDevMode ? [{ debugName: "isSavingBoard" }] : []));
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
- }))), ...(ngDevMode ? [{ debugName: "allTasksFlat" }] : []));
1969
- listDropIds = computed(() => this.state.listsWithTasks().map((l) => l.id), ...(ngDevMode ? [{ debugName: "listDropIds" }] : []));
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(() => { const id = this.boardId(); untracked(() => this.state.openBoard(id)); });
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', { name: task.title }),
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 ?? null;
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: "21.1.5", ngImport: i0, type: BoardViewPageComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2157
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.1.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: `
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 class="text-base font-bold text-surface-900 dark:text-surface-0 truncate leading-snug">
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
- <p-button
2169
- icon="pi pi-pencil"
2284
+ <button
2285
+ pButton
2170
2286
  [text]="true"
2171
2287
  size="small"
2172
2288
  severity="secondary"
2173
- styleClass="!w-6 !h-6 flex-shrink-0 opacity-0 group-hover:opacity-100 transition-opacity"
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
- (onClick)="openEditBoardDialog(board)"
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 class="text-xs text-surface-400 truncate max-w-sm hidden md:block leading-snug">
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-white dark:border-surface-900 flex items-center justify-center text-[9px] font-bold text-white flex-shrink-0 ring-1 ring-surface-100 dark:ring-surface-800"
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-white dark:border-surface-900 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"
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 class="h-5 w-px bg-surface-200 dark:bg-surface-700 mx-0.5"></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 class="flex rounded-lg overflow-hidden border border-surface-200 dark:border-surface-700">
2217
- <p-button
2218
- icon="pi pi-th-large"
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
- styleClass="!rounded-none !border-0"
2225
- (onClick)="viewMode.set('board')"
2226
- />
2227
- <p-button
2228
- icon="pi pi-list"
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
- styleClass="!rounded-none !border-0"
2235
- (onClick)="viewMode.set('list')"
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 class="h-5 w-px bg-surface-200 dark:bg-surface-700 mx-0.5"></div>
2367
+ <div
2368
+ class="h-5 w-px bg-surface-300 dark:bg-surface-600 mx-0.5"
2369
+ ></div>
2240
2370
 
2241
- <p-button
2242
- icon="pi pi-users"
2371
+ <button
2372
+ pButton
2243
2373
  [text]="true"
2244
2374
  severity="secondary"
2245
2375
  size="small"
2246
- styleClass="!w-8 !h-8"
2376
+ class="!w-8 !h-8"
2247
2377
  [pTooltip]="'task.manager.board.manage.members' | translate"
2248
2378
  tooltipPosition="bottom"
2249
- (onClick)="showMembersDialog.set(true)"
2250
- />
2251
- <p-button
2252
- icon="pi pi-tag"
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
- styleClass="!w-8 !h-8"
2388
+ class="!w-8 !h-8"
2257
2389
  [pTooltip]="'task.manager.board.manage.labels' | translate"
2258
2390
  tooltipPosition="bottom"
2259
- (onClick)="showLabelsDialog.set(true)"
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 class="h-5 w-px bg-surface-200 dark:bg-surface-700 mx-0.5"></div>
2264
- <p-button
2265
- icon="pi pi-plus"
2266
- [label]="'task.manager.board.add.list' | translate"
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
- (onClick)="showAddListDialog.set(true)"
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 class="h-0.5 w-full flex-shrink-0" [style.background-color]="board.color"></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 rounded-t-xl border border-b-0 border-surface-200 dark:border-surface-700"
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-surface-300 dark:text-surface-600 text-xs cursor-grab flex-shrink-0 px-1"
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">{{ list.name }}</span>
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
- <p-button
2347
- icon="pi pi-check"
2489
+ <button
2490
+ pButton
2348
2491
  [text]="true"
2349
2492
  size="small"
2350
2493
  severity="success"
2351
- styleClass="!w-6 !h-6 flex-shrink-0"
2494
+ class="!w-6 !h-6 flex-shrink-0"
2352
2495
  (mousedown)="$event.preventDefault()"
2353
2496
  (click)="saveRenameList(); $event.stopPropagation()"
2354
- />
2355
- <p-button
2356
- icon="pi pi-times"
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
- styleClass="!w-6 !h-6 flex-shrink-0"
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
- <p-button
2366
- icon="pi pi-pencil"
2512
+ <button
2513
+ pButton
2367
2514
  [text]="true"
2368
2515
  size="small"
2369
2516
  severity="secondary"
2370
- styleClass="!w-6 !h-6 flex-shrink-0"
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] border border-t-0 border-b-0 border-surface-200 dark:border-surface-700"
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-200 dark:border-surface-700 rounded-lg"
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-surface-400">{{
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
- class="rounded-b-xl border border-t-0 border-surface-200 dark:border-surface-700 p-1.5"
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
- styleClass="w-full !justify-start"
2416
- (onClick)="openAddTask(list)"
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-surface-400">
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-surface-500">
2582
+ <p class="font-medium text-muted-color">
2433
2583
  {{ 'task.manager.board.list.empty' | translate }}
2434
2584
  </p>
2435
- <p-button
2436
- icon="pi pi-plus"
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
- (onClick)="showAddListDialog.set(true)"
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-sortIcon field="title" />
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-sortIcon field="listName" />
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-sortIcon field="priority" />
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-sortIcon field="dueDate" />
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
- >{{ task.title }}</span>
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 (a of task.assignees!.slice(0, 3); track a.userId) {
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-white dark:ring-surface-800"
2514
- [style.background-color]="memberColorById(a.userId)"
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-white dark:ring-surface-800 flex-shrink-0"
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
- <p-button
2547
- icon="pi pi-pencil"
2707
+ <button
2708
+ pButton
2548
2709
  [text]="true"
2549
2710
  severity="secondary"
2550
2711
  size="small"
2551
2712
  [pTooltip]="'shared.edit' | translate"
2552
- (onClick)="onEditTask(task)"
2553
- />
2554
- <p-button
2555
- icon="pi pi-trash"
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
- (onClick)="onDeleteTask(task)"
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
- <p-button
2627
- icon="pi pi-plus"
2628
- [label]="'task.manager.label.add' | translate"
2791
+ <button
2792
+ pButton
2629
2793
  size="small"
2630
- [loading]="isAddingLabel()"
2631
- (onClick)="addLabel()"
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-surface-400 text-center py-4">
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-lg border border-surface-200 dark:border-surface-700"
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
- <p-button
2653
- icon="pi pi-trash"
2823
+ <button
2824
+ pButton
2654
2825
  severity="danger"
2655
2826
  size="small"
2656
2827
  [text]="true"
2657
- (onClick)="removeLabel(label.id)"
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
- <p-button
2709
- icon="pi pi-plus"
2710
- [label]="'task.manager.member.add' | translate"
2880
+ <button
2881
+ pButton
2711
2882
  size="small"
2712
- [loading]="isAddingMember()"
2713
- [disabled]="!selectedMemberUser"
2714
- (onClick)="addMember()"
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-surface-400 text-center py-4">
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-lg border border-surface-200 dark:border-surface-700"
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-surface-400">
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
- {{ ('task.manager.member.role.' + member.role.toLowerCase()) | translate }}
2931
+ {{
2932
+ 'task.manager.member.role.' + member.role.toLowerCase()
2933
+ | translate
2934
+ }}
2753
2935
  </span>
2754
2936
  @if (member.role !== 'OWNER') {
2755
- <p-button
2756
- icon="pi pi-trash"
2937
+ <button
2938
+ pButton
2757
2939
  severity="danger"
2758
2940
  size="small"
2759
2941
  [text]="true"
2760
- (onClick)="removeMember(member.userId)"
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 pTemplate="footer">
2972
+ <ng-template #footer>
2789
2973
  <div class="flex justify-end gap-2">
2790
- <p-button
2791
- [label]="'shared.cancel' | translate"
2974
+ <button
2975
+ pButton
2792
2976
  severity="secondary"
2793
- (onClick)="showAddListDialog.set(false)"
2794
- />
2795
- <p-button
2796
- [label]="'shared.create' | translate"
2797
- [loading]="isAddingList()"
2798
- (onClick)="addList()"
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]="'task.manager.board.description.placeholder' | translate"
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 pTemplate="footer">
3043
+ <ng-template #footer>
2855
3044
  <div class="flex justify-end gap-2">
2856
- <p-button
2857
- [label]="'shared.cancel' | translate"
3045
+ <button
3046
+ pButton
2858
3047
  severity="secondary"
2859
- (onClick)="showEditBoardDialog.set(false)"
2860
- />
2861
- <p-button
2862
- [label]="'shared.save' | translate"
2863
- [loading]="isSavingBoard()"
2864
- [disabled]="!editBoardName.trim()"
2865
- (onClick)="saveBoard()"
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: i3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: PrimeModule }, { kind: "directive", type: i2$1.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "component", type: i9.Button, selector: "p-button", inputs: ["hostName", "type", "badge", "disabled", "raised", "rounded", "text", "plain", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "iconPos", "icon", "label", "loading", "loadingIcon", "severity", "buttonProps", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { 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", "transitionOptions", "maskMotionOptions", "motionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "closeButtonProps", "maximizeButtonProps", "visible", "style", "position", "role", "appendTo", "content", "contentTemplate", "footerTemplate", "closeIconTemplate", "maximizeIconTemplate", "minimizeIconTemplate", "headlessTemplate"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }, { kind: "directive", type: i4.InputText, selector: "[pInputText]", inputs: ["hostName", "ptInputText", "pInputTextPT", "pInputTextUnstyled", "pSize", "variant", "fluid", "invalid"] }, { kind: "component", type: i6.Select, selector: "p-select", inputs: ["id", "scrollHeight", "filter", "panelStyle", "styleClass", "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", "autoOptionFocus", "autofocusFilter", "filterValue", "options", "appendTo", "motionOptions"], outputs: ["onChange", "onFilter", "onFocus", "onBlur", "onClick", "onShow", "onHide", "onClear", "onLazyLoad"] }, { kind: "component", type: i6$1.Skeleton, selector: "p-skeleton", inputs: ["styleClass", "shape", "animation", "borderRadius", "size", "width", "height"] }, { kind: "component", type: i9$2.Table, selector: "p-table", inputs: ["frozenColumns", "frozenValue", "styleClass", "tableStyle", "tableStyleClass", "paginator", "pageLinks", "rowsPerPageOptions", "alwaysShowPaginator", "paginatorPosition", "paginatorStyleClass", "paginatorDropdownAppendTo", "paginatorDropdownScrollHeight", "currentPageReportTemplate", "showCurrentPageReport", "showJumpToPageDropdown", "showJumpToPageInput", "showFirstLastIcon", "showPageLinks", "defaultSortOrder", "sortMode", "resetPageOnSort", "selectionMode", "selectionPageOnly", "contextMenuSelection", "contextMenuSelectionMode", "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", "responsiveLayout", "breakpoint", "paginatorLocale", "value", "columns", "first", "rows", "totalRecords", "sortField", "sortOrder", "multiSortMeta", "selection", "selectAll"], outputs: ["contextMenuSelectionChange", "selectAllChange", "selectionChange", "onRowSelect", "onRowUnselect", "onPage", "onSort", "onFilter", "onLazyLoad", "onRowExpand", "onRowCollapse", "onContextMenuSelect", "onColResize", "onColReorder", "onRowReorder", "onEditInit", "onEditComplete", "onEditCancel", "onHeaderCheckboxToggle", "sortFunction", "firstChange", "rowsChange", "onStateSave", "onStateRestore"] }, { kind: "directive", type: i9$2.SortableColumn, selector: "[pSortableColumn]", inputs: ["pSortableColumn", "pSortableColumnDisabled"] }, { kind: "component", type: i9$2.SortIcon, selector: "p-sortIcon", inputs: ["field"] }, { kind: "component", type: i1.Tag, selector: "p-tag", inputs: ["styleClass", "severity", "value", "icon", "rounded"] }, { kind: "directive", type: i5.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", "ptTooltip", "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: i9$1.DatePipe, name: "date" }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
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: "21.1.5", ngImport: i0, type: BoardViewPageComponent, decorators: [{
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 class="text-base font-bold text-surface-900 dark:text-surface-0 truncate leading-snug">
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
- <p-button
2898
- icon="pi pi-pencil"
3094
+ <button
3095
+ pButton
2899
3096
  [text]="true"
2900
3097
  size="small"
2901
3098
  severity="secondary"
2902
- styleClass="!w-6 !h-6 flex-shrink-0 opacity-0 group-hover:opacity-100 transition-opacity"
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
- (onClick)="openEditBoardDialog(board)"
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 class="text-xs text-surface-400 truncate max-w-sm hidden md:block leading-snug">
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-white dark:border-surface-900 flex items-center justify-center text-[9px] font-bold text-white flex-shrink-0 ring-1 ring-surface-100 dark:ring-surface-800"
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-white dark:border-surface-900 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"
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 class="h-5 w-px bg-surface-200 dark:bg-surface-700 mx-0.5"></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 class="flex rounded-lg overflow-hidden border border-surface-200 dark:border-surface-700">
2946
- <p-button
2947
- icon="pi pi-th-large"
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
- styleClass="!rounded-none !border-0"
2954
- (onClick)="viewMode.set('board')"
2955
- />
2956
- <p-button
2957
- icon="pi pi-list"
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
- styleClass="!rounded-none !border-0"
2964
- (onClick)="viewMode.set('list')"
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 class="h-5 w-px bg-surface-200 dark:bg-surface-700 mx-0.5"></div>
3177
+ <div
3178
+ class="h-5 w-px bg-surface-300 dark:bg-surface-600 mx-0.5"
3179
+ ></div>
2969
3180
 
2970
- <p-button
2971
- icon="pi pi-users"
3181
+ <button
3182
+ pButton
2972
3183
  [text]="true"
2973
3184
  severity="secondary"
2974
3185
  size="small"
2975
- styleClass="!w-8 !h-8"
3186
+ class="!w-8 !h-8"
2976
3187
  [pTooltip]="'task.manager.board.manage.members' | translate"
2977
3188
  tooltipPosition="bottom"
2978
- (onClick)="showMembersDialog.set(true)"
2979
- />
2980
- <p-button
2981
- icon="pi pi-tag"
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
- styleClass="!w-8 !h-8"
3198
+ class="!w-8 !h-8"
2986
3199
  [pTooltip]="'task.manager.board.manage.labels' | translate"
2987
3200
  tooltipPosition="bottom"
2988
- (onClick)="showLabelsDialog.set(true)"
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 class="h-5 w-px bg-surface-200 dark:bg-surface-700 mx-0.5"></div>
2993
- <p-button
2994
- icon="pi pi-plus"
2995
- [label]="'task.manager.board.add.list' | translate"
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
- (onClick)="showAddListDialog.set(true)"
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 class="h-0.5 w-full flex-shrink-0" [style.background-color]="board.color"></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 rounded-t-xl border border-b-0 border-surface-200 dark:border-surface-700"
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-surface-300 dark:text-surface-600 text-xs cursor-grab flex-shrink-0 px-1"
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">{{ list.name }}</span>
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
- <p-button
3076
- icon="pi pi-check"
3299
+ <button
3300
+ pButton
3077
3301
  [text]="true"
3078
3302
  size="small"
3079
3303
  severity="success"
3080
- styleClass="!w-6 !h-6 flex-shrink-0"
3304
+ class="!w-6 !h-6 flex-shrink-0"
3081
3305
  (mousedown)="$event.preventDefault()"
3082
3306
  (click)="saveRenameList(); $event.stopPropagation()"
3083
- />
3084
- <p-button
3085
- icon="pi pi-times"
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
- styleClass="!w-6 !h-6 flex-shrink-0"
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
- <p-button
3095
- icon="pi pi-pencil"
3322
+ <button
3323
+ pButton
3096
3324
  [text]="true"
3097
3325
  size="small"
3098
3326
  severity="secondary"
3099
- styleClass="!w-6 !h-6 flex-shrink-0"
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] border border-t-0 border-b-0 border-surface-200 dark:border-surface-700"
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-200 dark:border-surface-700 rounded-lg"
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-surface-400">{{
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
- class="rounded-b-xl border border-t-0 border-surface-200 dark:border-surface-700 p-1.5"
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
- styleClass="w-full !justify-start"
3145
- (onClick)="openAddTask(list)"
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-surface-400">
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-surface-500">
3392
+ <p class="font-medium text-muted-color">
3162
3393
  {{ 'task.manager.board.list.empty' | translate }}
3163
3394
  </p>
3164
- <p-button
3165
- icon="pi pi-plus"
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
- (onClick)="showAddListDialog.set(true)"
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-sortIcon field="title" />
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-sortIcon field="listName" />
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-sortIcon field="priority" />
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-sortIcon field="dueDate" />
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
- >{{ task.title }}</span>
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 (a of task.assignees!.slice(0, 3); track a.userId) {
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-white dark:ring-surface-800"
3243
- [style.background-color]="memberColorById(a.userId)"
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-white dark:ring-surface-800 flex-shrink-0"
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
- <p-button
3276
- icon="pi pi-pencil"
3517
+ <button
3518
+ pButton
3277
3519
  [text]="true"
3278
3520
  severity="secondary"
3279
3521
  size="small"
3280
3522
  [pTooltip]="'shared.edit' | translate"
3281
- (onClick)="onEditTask(task)"
3282
- />
3283
- <p-button
3284
- icon="pi pi-trash"
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
- (onClick)="onDeleteTask(task)"
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
- <p-button
3356
- icon="pi pi-plus"
3357
- [label]="'task.manager.label.add' | translate"
3601
+ <button
3602
+ pButton
3358
3603
  size="small"
3359
- [loading]="isAddingLabel()"
3360
- (onClick)="addLabel()"
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-surface-400 text-center py-4">
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-lg border border-surface-200 dark:border-surface-700"
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
- <p-button
3382
- icon="pi pi-trash"
3633
+ <button
3634
+ pButton
3383
3635
  severity="danger"
3384
3636
  size="small"
3385
3637
  [text]="true"
3386
- (onClick)="removeLabel(label.id)"
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
- <p-button
3438
- icon="pi pi-plus"
3439
- [label]="'task.manager.member.add' | translate"
3690
+ <button
3691
+ pButton
3440
3692
  size="small"
3441
- [loading]="isAddingMember()"
3442
- [disabled]="!selectedMemberUser"
3443
- (onClick)="addMember()"
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-surface-400 text-center py-4">
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-lg border border-surface-200 dark:border-surface-700"
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-surface-400">
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
- {{ ('task.manager.member.role.' + member.role.toLowerCase()) | translate }}
3741
+ {{
3742
+ 'task.manager.member.role.' + member.role.toLowerCase()
3743
+ | translate
3744
+ }}
3482
3745
  </span>
3483
3746
  @if (member.role !== 'OWNER') {
3484
- <p-button
3485
- icon="pi pi-trash"
3747
+ <button
3748
+ pButton
3486
3749
  severity="danger"
3487
3750
  size="small"
3488
3751
  [text]="true"
3489
- (onClick)="removeMember(member.userId)"
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 pTemplate="footer">
3782
+ <ng-template #footer>
3518
3783
  <div class="flex justify-end gap-2">
3519
- <p-button
3520
- [label]="'shared.cancel' | translate"
3784
+ <button
3785
+ pButton
3521
3786
  severity="secondary"
3522
- (onClick)="showAddListDialog.set(false)"
3523
- />
3524
- <p-button
3525
- [label]="'shared.create' | translate"
3526
- [loading]="isAddingList()"
3527
- (onClick)="addList()"
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]="'task.manager.board.description.placeholder' | translate"
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 pTemplate="footer">
3853
+ <ng-template #footer>
3584
3854
  <div class="flex justify-end gap-2">
3585
- <p-button
3586
- [label]="'shared.cancel' | translate"
3855
+ <button
3856
+ pButton
3587
3857
  severity="secondary"
3588
- (onClick)="showEditBoardDialog.set(false)"
3589
- />
3590
- <p-button
3591
- [label]="'shared.save' | translate"
3592
- [loading]="isSavingBoard()"
3593
- [disabled]="!editBoardName.trim()"
3594
- (onClick)="saveBoard()"
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>