@flusys/ng-task-manager 6.1.1 → 6.1.3

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.
@@ -434,7 +434,7 @@ class TaskCardComponent {
434
434
  >
435
435
  <div class="absolute top-2 right-2 hidden group-hover:flex gap-0.5">
436
436
  <button
437
- class="w-6 h-6 flex items-center justify-center rounded text-surface-400 hover:text-primary-500 hover:bg-surface-hover transition-colors"
437
+ class="w-6 h-6 flex items-center justify-center rounded text-muted-color hover:text-primary-500 hover:bg-surface-hover transition-colors"
438
438
  [fTooltip]="'shared.edit' | translate"
439
439
  tooltipPosition="top"
440
440
  (click)="$event.stopPropagation(); editClick.emit(task())"
@@ -442,7 +442,7 @@ class TaskCardComponent {
442
442
  <ui-icon name="pencil" class="text-xs"></ui-icon>
443
443
  </button>
444
444
  <button
445
- class="w-6 h-6 flex items-center justify-center rounded text-surface-400 hover:text-red-500 hover:bg-surface-hover transition-colors"
445
+ class="w-6 h-6 flex items-center justify-center rounded text-muted-color hover:text-red-500 hover:bg-surface-hover transition-colors"
446
446
  [fTooltip]="'shared.delete' | translate"
447
447
  tooltipPosition="top"
448
448
  (click)="$event.stopPropagation(); deleteClick.emit(task())"
@@ -521,7 +521,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImpor
521
521
  >
522
522
  <div class="absolute top-2 right-2 hidden group-hover:flex gap-0.5">
523
523
  <button
524
- class="w-6 h-6 flex items-center justify-center rounded text-surface-400 hover:text-primary-500 hover:bg-surface-hover transition-colors"
524
+ class="w-6 h-6 flex items-center justify-center rounded text-muted-color hover:text-primary-500 hover:bg-surface-hover transition-colors"
525
525
  [fTooltip]="'shared.edit' | translate"
526
526
  tooltipPosition="top"
527
527
  (click)="$event.stopPropagation(); editClick.emit(task())"
@@ -529,7 +529,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImpor
529
529
  <ui-icon name="pencil" class="text-xs"></ui-icon>
530
530
  </button>
531
531
  <button
532
- class="w-6 h-6 flex items-center justify-center rounded text-surface-400 hover:text-red-500 hover:bg-surface-hover transition-colors"
532
+ class="w-6 h-6 flex items-center justify-center rounded text-muted-color hover:text-red-500 hover:bg-surface-hover transition-colors"
533
533
  [fTooltip]="'shared.delete' | translate"
534
534
  tooltipPosition="top"
535
535
  (click)="$event.stopPropagation(); deleteClick.emit(task())"
@@ -1522,7 +1522,7 @@ class BoardListPageComponent {
1522
1522
  <f-skeleton height="18px" width="60%" class="mb-3" />
1523
1523
  <f-skeleton height="13px" class="mb-1" />
1524
1524
  <f-skeleton height="13px" width="70%" class="mb-5" />
1525
- <div class="flex gap-5 pt-4 border-t border-surface-100">
1525
+ <div class="flex gap-5 pt-4 border-t border-surface">
1526
1526
  <f-skeleton height="14px" width="55px" />
1527
1527
  <f-skeleton height="14px" width="45px" />
1528
1528
  <f-skeleton height="14px" width="50px" />
@@ -1537,9 +1537,9 @@ class BoardListPageComponent {
1537
1537
  class="flex flex-col items-center justify-center py-20 text-muted-color"
1538
1538
  >
1539
1539
  <span
1540
- class="w-16 h-16 rounded-2xl border-2 border-dashed border-surface-300 flex items-center justify-center mb-4"
1540
+ class="w-16 h-16 rounded-2xl border-2 border-dashed border-surface flex items-center justify-center mb-4"
1541
1541
  >
1542
- <ui-icon name="th-large" class="text-2xl text-surface-400"></ui-icon>
1542
+ <ui-icon name="th-large" class="text-2xl text-muted-color"></ui-icon>
1543
1543
  </span>
1544
1544
  <p class="text-base font-semibold mb-1">
1545
1545
  {{ 'task.manager.board.empty' | translate }}
@@ -1574,7 +1574,7 @@ class BoardListPageComponent {
1574
1574
  {{ board.name }}
1575
1575
  </h3>
1576
1576
  </div>
1577
- <ui-icon name="arrow-right" class="text-xs text-surface-300 group-hover:text-primary-500 group-hover:translate-x-0.5 transition-all duration-150 flex-shrink-0 mt-1"></ui-icon>
1577
+ <ui-icon name="arrow-right" class="text-xs text-muted-color group-hover:text-primary-500 group-hover:translate-x-0.5 transition-all duration-150 flex-shrink-0 mt-1"></ui-icon>
1578
1578
  </div>
1579
1579
 
1580
1580
  <p
@@ -1679,6 +1679,7 @@ class BoardListPageComponent {
1679
1679
  [class.ring-2]="newBoardColor === c"
1680
1680
  [class.ring-offset-2]="newBoardColor === c"
1681
1681
  [class.ring-surface-900]="newBoardColor === c"
1682
+ [class.dark:ring-surface-0]="newBoardColor === c"
1682
1683
  [fTooltip]="c"
1683
1684
  (click)="newBoardColor = c"
1684
1685
  >
@@ -1690,10 +1691,10 @@ class BoardListPageComponent {
1690
1691
  </div>
1691
1692
  <div class="flex items-center gap-2 mt-1">
1692
1693
  <span
1693
- class="w-8 h-8 rounded-full border border-surface-200 flex-shrink-0"
1694
+ class="w-8 h-8 rounded-full border border-surface flex-shrink-0"
1694
1695
  [style.background-color]="newBoardColor"
1695
1696
  ></span>
1696
- <span class="text-sm text-surface-500 font-mono">{{
1697
+ <span class="text-sm text-muted-color font-mono">{{
1697
1698
  newBoardColor
1698
1699
  }}</span>
1699
1700
  </div>
@@ -1760,7 +1761,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImpor
1760
1761
  <f-skeleton height="18px" width="60%" class="mb-3" />
1761
1762
  <f-skeleton height="13px" class="mb-1" />
1762
1763
  <f-skeleton height="13px" width="70%" class="mb-5" />
1763
- <div class="flex gap-5 pt-4 border-t border-surface-100">
1764
+ <div class="flex gap-5 pt-4 border-t border-surface">
1764
1765
  <f-skeleton height="14px" width="55px" />
1765
1766
  <f-skeleton height="14px" width="45px" />
1766
1767
  <f-skeleton height="14px" width="50px" />
@@ -1775,9 +1776,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImpor
1775
1776
  class="flex flex-col items-center justify-center py-20 text-muted-color"
1776
1777
  >
1777
1778
  <span
1778
- class="w-16 h-16 rounded-2xl border-2 border-dashed border-surface-300 flex items-center justify-center mb-4"
1779
+ class="w-16 h-16 rounded-2xl border-2 border-dashed border-surface flex items-center justify-center mb-4"
1779
1780
  >
1780
- <ui-icon name="th-large" class="text-2xl text-surface-400"></ui-icon>
1781
+ <ui-icon name="th-large" class="text-2xl text-muted-color"></ui-icon>
1781
1782
  </span>
1782
1783
  <p class="text-base font-semibold mb-1">
1783
1784
  {{ 'task.manager.board.empty' | translate }}
@@ -1812,7 +1813,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImpor
1812
1813
  {{ board.name }}
1813
1814
  </h3>
1814
1815
  </div>
1815
- <ui-icon name="arrow-right" class="text-xs text-surface-300 group-hover:text-primary-500 group-hover:translate-x-0.5 transition-all duration-150 flex-shrink-0 mt-1"></ui-icon>
1816
+ <ui-icon name="arrow-right" class="text-xs text-muted-color group-hover:text-primary-500 group-hover:translate-x-0.5 transition-all duration-150 flex-shrink-0 mt-1"></ui-icon>
1816
1817
  </div>
1817
1818
 
1818
1819
  <p
@@ -1917,6 +1918,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImpor
1917
1918
  [class.ring-2]="newBoardColor === c"
1918
1919
  [class.ring-offset-2]="newBoardColor === c"
1919
1920
  [class.ring-surface-900]="newBoardColor === c"
1921
+ [class.dark:ring-surface-0]="newBoardColor === c"
1920
1922
  [fTooltip]="c"
1921
1923
  (click)="newBoardColor = c"
1922
1924
  >
@@ -1928,10 +1930,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImpor
1928
1930
  </div>
1929
1931
  <div class="flex items-center gap-2 mt-1">
1930
1932
  <span
1931
- class="w-8 h-8 rounded-full border border-surface-200 flex-shrink-0"
1933
+ class="w-8 h-8 rounded-full border border-surface flex-shrink-0"
1932
1934
  [style.background-color]="newBoardColor"
1933
1935
  ></span>
1934
- <span class="text-sm text-surface-500 font-mono">{{
1936
+ <span class="text-sm text-muted-color font-mono">{{
1935
1937
  newBoardColor
1936
1938
  }}</span>
1937
1939
  </div>
@@ -2755,7 +2757,7 @@ class BoardViewPageComponent {
2755
2757
  <input
2756
2758
  type="color"
2757
2759
  [(ngModel)]="newLabelColor"
2758
- class="w-10 h-10 rounded cursor-pointer border border-surface-300"
2760
+ class="w-10 h-10 rounded cursor-pointer border border-surface"
2759
2761
  />
2760
2762
  </div>
2761
2763
  <button
@@ -2993,7 +2995,7 @@ class BoardViewPageComponent {
2993
2995
  <input
2994
2996
  type="color"
2995
2997
  [(ngModel)]="editBoardColor"
2996
- class="w-10 h-10 rounded cursor-pointer border border-surface-300"
2998
+ class="w-10 h-10 rounded cursor-pointer border border-surface"
2997
2999
  />
2998
3000
  <div class="flex gap-2 flex-wrap">
2999
3001
  @for (color of boardColorPalette; track color) {
@@ -3002,6 +3004,7 @@ class BoardViewPageComponent {
3002
3004
  class="w-6 h-6 rounded-full border-2 transition-transform hover:scale-110"
3003
3005
  [style.background-color]="color"
3004
3006
  [class.border-surface-900]="editBoardColor === color"
3007
+ [class.dark:border-surface-0]="editBoardColor === color"
3005
3008
  [class.border-transparent]="editBoardColor !== color"
3006
3009
  (click)="editBoardColor = color"
3007
3010
  ></button>
@@ -3573,7 +3576,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImpor
3573
3576
  <input
3574
3577
  type="color"
3575
3578
  [(ngModel)]="newLabelColor"
3576
- class="w-10 h-10 rounded cursor-pointer border border-surface-300"
3579
+ class="w-10 h-10 rounded cursor-pointer border border-surface"
3577
3580
  />
3578
3581
  </div>
3579
3582
  <button
@@ -3811,7 +3814,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImpor
3811
3814
  <input
3812
3815
  type="color"
3813
3816
  [(ngModel)]="editBoardColor"
3814
- class="w-10 h-10 rounded cursor-pointer border border-surface-300"
3817
+ class="w-10 h-10 rounded cursor-pointer border border-surface"
3815
3818
  />
3816
3819
  <div class="flex gap-2 flex-wrap">
3817
3820
  @for (color of boardColorPalette; track color) {
@@ -3820,6 +3823,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImpor
3820
3823
  class="w-6 h-6 rounded-full border-2 transition-transform hover:scale-110"
3821
3824
  [style.background-color]="color"
3822
3825
  [class.border-surface-900]="editBoardColor === color"
3826
+ [class.dark:border-surface-0]="editBoardColor === color"
3823
3827
  [class.border-transparent]="editBoardColor !== color"
3824
3828
  (click)="editBoardColor = color"
3825
3829
  ></button>
@@ -1 +1 @@
1
- {"version":3,"file":"flusys-ng-task-manager.mjs","sources":["../../../projects/ng-task-manager/services/task-board-api.service.ts","../../../projects/ng-task-manager/services/task-api.service.ts","../../../projects/ng-task-manager/services/task-board-socket.service.ts","../../../projects/ng-task-manager/services/task-board-state.service.ts","../../../projects/ng-task-manager/utils/task-utils.ts","../../../projects/ng-task-manager/components/task-card/task-card.component.ts","../../../projects/ng-task-manager/components/task-form-dialog/task-form-dialog.component.ts","../../../projects/ng-task-manager/components/task-detail-panel/task-detail-panel.component.ts","../../../projects/ng-task-manager/pages/board-list-page/board-list-page.component.ts","../../../projects/ng-task-manager/pages/board-view-page/board-view-page.component.ts","../../../projects/ng-task-manager/constants/messages.ts","../../../projects/ng-task-manager/routes/task-manager.routes.ts","../../../projects/ng-task-manager/flusys-ng-task-manager.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport {\n ApiResourceService,\n IListResponse,\n IMessageResponse,\n ISingleResponse,\n} from '@flusys/ng-shared';\nimport { firstValueFrom } from 'rxjs';\nimport {\n ITaskBoard,\n ITaskBoardMember,\n IUpdateTaskBoardDto,\n} from '../interfaces/task.interface';\n\n@Injectable({ providedIn: 'root' })\nexport class TaskBoardApiService extends ApiResourceService<\n IUpdateTaskBoardDto,\n ITaskBoard\n> {\n constructor() {\n super('board', 'taskManager');\n }\n\n getMembers(boardId: string): Promise<IListResponse<ITaskBoardMember>> {\n return firstValueFrom(\n this.http.post<IListResponse<ITaskBoardMember>>(\n `${this.baseUrl}/get-members`,\n { boardId },\n ),\n );\n }\n\n addMember(\n boardId: string,\n userId: string,\n role = 'MEMBER',\n ): Promise<ISingleResponse<ITaskBoardMember>> {\n return firstValueFrom(\n this.http.post<ISingleResponse<ITaskBoardMember>>(\n `${this.baseUrl}/add-member`,\n { boardId, userId, role },\n ),\n );\n }\n\n removeMember(boardId: string, userId: string): Promise<IMessageResponse> {\n return firstValueFrom(\n this.http.post<IMessageResponse>(`${this.baseUrl}/remove-member`, {\n boardId,\n userId,\n }),\n );\n }\n}\n","import { Injectable } from '@angular/core';\nimport { ApiResourceService, IMessageResponse, ISingleResponse } from '@flusys/ng-shared';\nimport { firstValueFrom } from 'rxjs';\nimport {\n ICreateTaskCommentDto,\n ICreateTaskLabelDto,\n ICreateTaskListDto,\n ITask,\n ITaskComment,\n ITaskLabel,\n ITaskList,\n IMoveTaskDto,\n IReorderTaskListsDto,\n IUpdateTaskListDto,\n IUpdateTaskDto,\n} from '../interfaces/task.interface';\n\n@Injectable({ providedIn: 'root' })\nexport class TaskApiService extends ApiResourceService<IUpdateTaskDto, ITask> {\n constructor() {\n super('task', 'taskManager');\n }\n\n moveTask(dto: IMoveTaskDto): Promise<ISingleResponse<ITask>> {\n return firstValueFrom(\n this.http.post<ISingleResponse<ITask>>(`${this.baseUrl}/move`, dto),\n );\n }\n}\n\n@Injectable({ providedIn: 'root' })\nexport class TaskListApiService extends ApiResourceService<ICreateTaskListDto, ITaskList> {\n constructor() {\n super('list', 'taskManager');\n }\n\n updateList(dto: IUpdateTaskListDto): Promise<ISingleResponse<ITaskList>> {\n return firstValueFrom(\n this.http.post<ISingleResponse<ITaskList>>(`${this.baseUrl}/update`, dto),\n );\n }\n\n reorderLists(dto: IReorderTaskListsDto): Promise<IMessageResponse> {\n return firstValueFrom(\n this.http.post<IMessageResponse>(`${this.baseUrl}/reorder`, dto),\n );\n }\n}\n\n@Injectable({ providedIn: 'root' })\nexport class TaskLabelApiService extends ApiResourceService<ICreateTaskLabelDto, ITaskLabel> {\n constructor() {\n super('label', 'taskManager');\n }\n}\n\n@Injectable({ providedIn: 'root' })\nexport class TaskCommentApiService extends ApiResourceService<ICreateTaskCommentDto, ITaskComment> {\n constructor() {\n super('comment', 'taskManager');\n }\n}\n","import { inject, Injectable, signal } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { io, Socket } from 'socket.io-client';\nimport { APP_CONFIG } from '@flusys/ng-core';\nimport { IBoardSocketEvent } from '../interfaces/task.interface';\n\n@Injectable({ providedIn: 'root' })\nexport class TaskBoardSocketService {\n private socket: Socket | null = null;\n private readonly appConfig = inject(APP_CONFIG);\n\n private readonly _isConnected = signal(false);\n readonly isConnected = this._isConnected.asReadonly();\n\n private readonly boardEvent$ = new Subject<IBoardSocketEvent>();\n readonly onBoardEvent = this.boardEvent$.asObservable();\n\n connect(accessToken: string): void {\n if (this.socket?.connected) return;\n\n const baseUrl = this.getBaseUrl();\n this.socket = io(`${baseUrl}/task-boards`, {\n auth: { token: accessToken },\n transports: ['websocket', 'polling'],\n reconnection: true,\n reconnectionAttempts: 5,\n reconnectionDelay: 1000,\n });\n\n this.socket.on('connect', () => this._isConnected.set(true));\n this.socket.on('disconnect', (reason: string) => {\n this._isConnected.set(false);\n if (reason === 'io server disconnect') this.socket?.connect();\n });\n this.socket.on('connect_error', () => this._isConnected.set(false));\n this.socket.on('board:event', (event: IBoardSocketEvent) => this.boardEvent$.next(event));\n }\n\n joinBoard(boardId: string): void {\n this.socket?.emit('board:join', { boardId });\n }\n\n leaveBoard(boardId: string): void {\n this.socket?.emit('board:leave', { boardId });\n }\n\n disconnect(): void {\n this.socket?.disconnect();\n this.socket = null;\n this._isConnected.set(false);\n }\n\n private getBaseUrl(): string {\n const services = this.appConfig.services as Record<string, { socketUrl?: string }> | undefined;\n return services?.['taskManager']?.socketUrl ?? this.appConfig.apiBaseUrl;\n }\n}\n","import { computed, DestroyRef, inject, Injectable, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { IBoardSocketEvent, ITask, ITaskBoard, ITaskBoardMember, ITaskLabel, ITaskList, IUpdateTaskBoardDto } from '../interfaces/task.interface';\nimport { TaskApiService, TaskLabelApiService, TaskListApiService } from './task-api.service';\nimport { TaskBoardApiService } from './task-board-api.service';\nimport { TaskBoardSocketService } from './task-board-socket.service';\n\n@Injectable({ providedIn: 'root' })\nexport class TaskBoardStateService {\n private readonly boardApi = inject(TaskBoardApiService);\n private readonly taskApi = inject(TaskApiService);\n private readonly listApi = inject(TaskListApiService);\n private readonly labelApi = inject(TaskLabelApiService);\n private readonly socketService = inject(TaskBoardSocketService);\n private readonly destroyRef = inject(DestroyRef);\n\n private readonly _boards = signal<ITaskBoard[]>([]);\n private readonly _activeBoard = signal<ITaskBoard | null>(null);\n private readonly _lists = signal<ITaskList[]>([]);\n private readonly _tasks = signal<ITask[]>([]);\n private readonly _labels = signal<ITaskLabel[]>([]);\n private readonly _members = signal<ITaskBoardMember[]>([]);\n private readonly _selectedTask = signal<ITask | null>(null);\n private readonly _isLoading = signal(false);\n private readonly _isBoardLoading = signal(false);\n\n readonly boards = this._boards.asReadonly();\n readonly activeBoard = this._activeBoard.asReadonly();\n readonly lists = this._lists.asReadonly();\n readonly tasks = this._tasks.asReadonly();\n readonly labels = this._labels.asReadonly();\n readonly members = this._members.asReadonly();\n readonly selectedTask = this._selectedTask.asReadonly();\n readonly isLoading = this._isLoading.asReadonly();\n readonly isBoardLoading = this._isBoardLoading.asReadonly();\n\n readonly tasksByList = computed(() => {\n const map = new Map<string, ITask[]>();\n for (const task of this._tasks()) {\n const list = map.get(task.listId) ?? [];\n list.push(task);\n map.set(task.listId, list);\n }\n return map;\n });\n\n readonly listsWithTasks = computed(() =>\n this._lists()\n .slice()\n .sort((a, b) => a.position - b.position)\n .map((list) => ({\n ...list,\n tasks: (this.tasksByList().get(list.id) ?? []).slice().sort((a, b) => a.position - b.position),\n })),\n );\n\n readonly hasActiveBoard = computed(() => this._activeBoard() !== null);\n readonly isSocketConnected = this.socketService.isConnected;\n\n constructor() {\n this.socketService.onBoardEvent\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((event) => this.handleBoardEvent(event));\n }\n\n async loadBoards(): Promise<void> {\n this._isLoading.set(true);\n try {\n const res = await this.boardApi.getAll({ sort: { createdAt: 'DESC' } });\n this._boards.set(res.data ?? []);\n } finally {\n this._isLoading.set(false);\n }\n }\n\n async openBoard(boardId: string): Promise<void> {\n this._isBoardLoading.set(true);\n try {\n const prevBoard = this._activeBoard();\n if (prevBoard) this.socketService.leaveBoard(prevBoard.id);\n\n const [boardRes, listsRes, tasksRes, labelsRes, membersRes] = await Promise.all([\n this.boardApi.findById(boardId),\n this.listApi.getAll({ filter: { boardId, isActive: true }, sort: { position: 'ASC' } }),\n this.taskApi.getAll({ filter: { boardId }, sort: { position: 'ASC' } }),\n this.labelApi.getAll({ filter: { boardId } }),\n this.boardApi.getMembers(boardId),\n ]);\n\n this._activeBoard.set(boardRes.data ?? null);\n this._lists.set(listsRes.data ?? []);\n this._tasks.set(tasksRes.data ?? []);\n this._labels.set(labelsRes.data ?? []);\n this._members.set(membersRes.data ?? []);\n\n this.socketService.joinBoard(boardId);\n } finally {\n this._isBoardLoading.set(false);\n }\n }\n\n closeBoard(): void {\n const board = this._activeBoard();\n if (board) this.socketService.leaveBoard(board.id);\n this._activeBoard.set(null);\n this._lists.set([]);\n this._tasks.set([]);\n this._labels.set([]);\n this._members.set([]);\n this._selectedTask.set(null);\n }\n\n selectTask(task: ITask | null): void {\n this._selectedTask.set(task);\n }\n\n async addLabel(boardId: string, name: string, color: string): Promise<void> {\n await this.labelApi.insert({ boardId, name, color });\n const res = await this.labelApi.getAll({ filter: { boardId } });\n this._labels.set(res.data ?? []);\n }\n\n async deleteLabel(labelId: string): Promise<void> {\n await this.labelApi.delete({ id: labelId, type: 'delete' });\n this._labels.update((list) => list.filter((l) => l.id !== labelId));\n }\n\n async addMember(userId: string, role = 'MEMBER'): Promise<void> {\n const board = this._activeBoard();\n if (!board) return;\n const res = await this.boardApi.addMember(board.id, userId, role);\n if (res.data) this._members.update((list) => [...list, res.data!]);\n }\n\n async removeMember(userId: string): Promise<void> {\n const board = this._activeBoard();\n if (!board) return;\n await this.boardApi.removeMember(board.id, userId);\n this._members.update((list) => list.filter((m) => m.userId !== userId));\n }\n\n async reorderLists(boardId: string, orderedIds: string[]): Promise<void> {\n const posMap = new Map(orderedIds.map((id, i) => [id, i * 100]));\n this._lists.update((list) =>\n list\n .map((l) => (posMap.has(l.id) ? { ...l, position: posMap.get(l.id)! } : l))\n .sort((a, b) => a.position - b.position),\n );\n await this.listApi.reorderLists({ boardId, orderedIds });\n }\n\n async renameList(listId: string, name: string): Promise<void> {\n await this.listApi.updateList({ id: listId, name });\n this._lists.update((list) => list.map((l) => (l.id === listId ? { ...l, name } : l)));\n }\n\n async updateBoard(dto: IUpdateTaskBoardDto): Promise<void> {\n await this.boardApi.update(dto);\n const id = dto.id;\n if (!id) return;\n this._activeBoard.update((b) => (b?.id === id ? { ...b, ...dto } : b));\n this._boards.update((list) => list.map((b) => (b.id === id ? { ...b, ...dto } : b)));\n }\n\n addTaskOptimistic(task: ITask): void {\n this._tasks.update((list) => {\n if (list.some((t) => t.id === task.id)) {\n return list.map((t) => (t.id === task.id ? { ...t, ...task } : t));\n }\n return [...list, task];\n });\n }\n\n async deleteTask(taskId: string): Promise<void> {\n await this.taskApi.delete({ id: taskId, type: 'delete' });\n this._tasks.update((list) => list.filter((t) => t.id !== taskId));\n if (this._selectedTask()?.id === taskId) this._selectedTask.set(null);\n }\n\n private handleBoardEvent(event: IBoardSocketEvent): void {\n switch (event.type) {\n case 'task:created': {\n const created = event.payload as ITask;\n this._tasks.update((list) => {\n if (list.some((t) => t.id === created.id)) return list;\n return [...list, created];\n });\n break;\n }\n\n case 'task:updated':\n case 'task:moved': {\n const updated = event.payload as ITask;\n this._tasks.update((list) =>\n list.map((t) => (t.id === updated.id ? { ...t, ...updated } : t)),\n );\n if (this._selectedTask()?.id === updated.id) {\n this._selectedTask.update((t) => (t ? { ...t, ...updated } : null));\n }\n break;\n }\n\n case 'task:deleted': {\n const deleted = event.payload as { id: string };\n this._tasks.update((list) => list.filter((t) => t.id !== deleted.id));\n if (this._selectedTask()?.id === deleted.id) this._selectedTask.set(null);\n break;\n }\n\n case 'list:created':\n this._lists.update((list) => [...list, event.payload as ITaskList]);\n break;\n\n case 'list:updated': {\n const updatedList = event.payload as ITaskList;\n this._lists.update((list) =>\n list.map((l) => (l.id === updatedList.id ? { ...l, ...updatedList } : l)),\n );\n break;\n }\n\n case 'list:deleted': {\n const deletedList = event.payload as { id: string };\n this._lists.update((list) => list.filter((l) => l.id !== deletedList.id));\n break;\n }\n\n case 'list:reordered': {\n const { orderedIds } = event.payload as { orderedIds: string[] };\n const posMap = new Map(orderedIds.map((id, i) => [id, i * 100]));\n this._lists.update((list) =>\n list\n .map((l) => (posMap.has(l.id) ? { ...l, position: posMap.get(l.id)! } : l))\n .sort((a, b) => a.position - b.position),\n );\n break;\n }\n }\n }\n}\n","export const MEMBER_COLOR_PALETTE = [\n '#6366f1',\n '#8b5cf6',\n '#ec4899',\n '#ef4444',\n '#f97316',\n '#eab308',\n '#22c55e',\n '#14b8a6',\n '#3b82f6',\n '#06b6d4',\n];\n\nexport const BOARD_COLOR_PALETTE = [\n ...MEMBER_COLOR_PALETTE,\n '#64748b',\n];\n\nexport function taskPrioritySeverity(\n priority: string,\n): 'success' | 'info' | 'warn' | 'danger' | 'secondary' {\n const map: Record<string, 'success' | 'info' | 'warn' | 'danger' | 'secondary'> = {\n LOW: 'secondary',\n MEDIUM: 'info',\n HIGH: 'warn',\n URGENT: 'danger',\n };\n return map[priority] ?? 'info';\n}\n\nexport function memberInitials(name: string | null | undefined): string {\n if (!name) return '?';\n return name\n .split(' ')\n .slice(0, 2)\n .map((n) => n[0]?.toUpperCase() ?? '')\n .join('');\n}\n\nexport function isTaskOverdue(dueDate: string): boolean {\n return new Date(dueDate) < new Date();\n}\n\nexport function memberColorFromId(userId: string): string {\n let hash = 0;\n for (let i = 0; i < userId.length; i++)\n hash = userId.charCodeAt(i) + ((hash << 5) - hash);\n return MEMBER_COLOR_PALETTE[Math.abs(hash) % MEMBER_COLOR_PALETTE.length];\n}\n","import { DatePipe } from '@angular/common';\nimport { Component, computed, input, output } from '@angular/core';\nimport { TranslatePipe } from '@flusys/ng-shared';\nimport { TooltipDirective, UiModule } from '@flusys/ng-ui';\nimport { ITask } from '../../interfaces/task.interface';\nimport {\n isTaskOverdue,\n memberColorFromId,\n memberInitials,\n taskPrioritySeverity,\n} from '../../utils/task-utils';\n\n@Component({\n selector: 'tm-task-card',\n imports: [DatePipe, TranslatePipe, TooltipDirective, UiModule],\n template: `\n <div\n class=\"task-card group relative rounded-border border border-surface p-3 cursor-pointer shadow-sm hover:shadow-md transition-shadow\"\n (click)=\"cardClick.emit(task())\"\n >\n <div class=\"absolute top-2 right-2 hidden group-hover:flex gap-0.5\">\n <button\n class=\"w-6 h-6 flex items-center justify-center rounded text-surface-400 hover:text-primary-500 hover:bg-surface-hover transition-colors\"\n [fTooltip]=\"'shared.edit' | translate\"\n tooltipPosition=\"top\"\n (click)=\"$event.stopPropagation(); editClick.emit(task())\"\n >\n <ui-icon name=\"pencil\" class=\"text-xs\"></ui-icon>\n </button>\n <button\n class=\"w-6 h-6 flex items-center justify-center rounded text-surface-400 hover:text-red-500 hover:bg-surface-hover transition-colors\"\n [fTooltip]=\"'shared.delete' | translate\"\n tooltipPosition=\"top\"\n (click)=\"$event.stopPropagation(); deleteClick.emit(task())\"\n >\n <ui-icon name=\"trash\" class=\"text-xs\"></ui-icon>\n </button>\n </div>\n\n @if (task().labels && task().labels!.length > 0) {\n <div class=\"flex flex-wrap gap-1 mb-2\">\n @for (label of task().labels; track label.id) {\n <span\n class=\"inline-block h-1.5 rounded-full w-8\"\n [style.background-color]=\"label.color\"\n [fTooltip]=\"label.name\"\n ></span>\n }\n </div>\n }\n\n <p class=\"text-sm font-semibold line-clamp-2 leading-snug pr-14\">\n {{ task().title }}\n </p>\n\n <div class=\"flex items-center justify-between gap-2 mt-auto pt-2\">\n <f-tag\n [value]=\"task().priority\"\n [severity]=\"prioritySeverity(task().priority)\"\n class=\"text-xs\"\n />\n\n @if (task().dueDate) {\n <span\n class=\"text-xs text-muted-color\"\n [class.text-red-500]=\"isOverdue(task().dueDate!)\"\n >\n {{ task().dueDate | date: 'MMM d' }}\n </span>\n }\n\n @if (visibleAssignees().length > 0) {\n <div class=\"flex items-center -space-x-1.5\">\n @for (a of visibleAssignees(); track a.userId) {\n <f-avatar\n shape=\"circle\"\n size=\"small\"\n [label]=\"initials(a.userName)\"\n [color]=\"memberColor(a.userId)\"\n styleClass=\"!ring-surface-card flex-shrink-0\"\n [fTooltip]=\"a.userName ?? ''\"\n />\n }\n @if (overflowCount() > 0) {\n <f-avatar\n shape=\"circle\"\n size=\"small\"\n [label]=\"'+' + overflowCount()\"\n styleClass=\"!bg-surface-200 dark:!bg-surface-700 !text-surface-600 dark:!text-surface-300 !ring-surface-card flex-shrink-0\"\n />\n }\n </div>\n }\n </div>\n </div>\n `,\n})\nexport class TaskCardComponent {\n readonly task = input.required<ITask>();\n readonly cardClick = output<ITask>();\n readonly editClick = output<ITask>();\n readonly deleteClick = output<ITask>();\n\n private readonly MAX_VISIBLE = 3;\n\n readonly visibleAssignees = computed(() =>\n (this.task().assignees ?? []).slice(0, this.MAX_VISIBLE),\n );\n\n readonly overflowCount = computed(() =>\n Math.max(0, (this.task().assignees ?? []).length - this.MAX_VISIBLE),\n );\n\n protected readonly prioritySeverity = taskPrioritySeverity;\n protected readonly initials = memberInitials;\n protected readonly isOverdue = isTaskOverdue;\n protected readonly memberColor = memberColorFromId;\n}\n","import {\n Component,\n effect,\n inject,\n input,\n model,\n output,\n signal,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { TranslatePipe } from '@flusys/ng-shared';\nimport { UiModule } from '@flusys/ng-ui';\nimport {\n ICreateTaskDto,\n ITask,\n ITaskBoardMember,\n ITaskLabel,\n IUpdateTaskDto,\n} from '../../interfaces/task.interface';\nimport { TaskApiService } from '../../services/task-api.service';\n\nconst PRIORITY_OPTIONS = [\n { labelKey: 'task.priority.LOW', value: 'LOW' },\n { labelKey: 'task.priority.MEDIUM', value: 'MEDIUM' },\n { labelKey: 'task.priority.HIGH', value: 'HIGH' },\n { labelKey: 'task.priority.URGENT', value: 'URGENT' },\n];\n\n@Component({\n selector: 'tm-task-form-dialog',\n imports: [UiModule, FormsModule, TranslatePipe],\n template: `\n <f-dialog\n [header]=\"\n (task() ? 'task.form.title.edit' : 'task.form.title.create') | translate\n \"\n [(visible)]=\"visible\"\n [modal]=\"true\"\n [style]=\"{ width: '540px' }\"\n (onHide)=\"onClose()\"\n >\n <div class=\"flex flex-col gap-4 py-3\">\n <div class=\"flex flex-col gap-1\">\n <label class=\"text-sm font-medium\"\n >{{ 'task.form.title.label' | translate }}\n <span class=\"text-red-500\">*</span></label\n >\n <input\n fInputText\n [(ngModel)]=\"title\"\n [placeholder]=\"'task.form.title.placeholder' | translate\"\n />\n </div>\n\n <div class=\"flex flex-col gap-1\">\n <label class=\"text-sm font-medium\">{{\n 'shared.description' | translate\n }}</label>\n <textarea\n fTextarea\n [(ngModel)]=\"description\"\n rows=\"3\"\n [placeholder]=\"'task.form.description.placeholder' | translate\"\n ></textarea>\n </div>\n\n <div class=\"grid grid-cols-2 gap-4\">\n <div class=\"flex flex-col gap-1\">\n <label class=\"text-sm font-medium\">{{\n 'task.form.priority.label' | translate\n }}</label>\n <f-select\n [(ngModel)]=\"priority\"\n [options]=\"priorityOptions\"\n optionLabel=\"labelKey\"\n optionValue=\"value\"\n [placeholder]=\"'task.form.priority.placeholder' | translate\"\n >\n <ng-template #selectedItem let-opt>\n {{ opt.labelKey | translate }}\n </ng-template>\n <ng-template #item let-opt>\n {{ opt.labelKey | translate }}\n </ng-template>\n </f-select>\n </div>\n\n <div class=\"flex flex-col gap-1\">\n <label class=\"text-sm font-medium\">{{\n 'task.form.due.date.label' | translate\n }}</label>\n <f-datepicker\n [(ngModel)]=\"dueDate\"\n [showClear]=\"true\"\n [placeholder]=\"'task.form.due.date.placeholder' | translate\"\n />\n </div>\n </div>\n\n <div class=\"flex flex-col gap-1\">\n <label class=\"text-sm font-medium\">{{\n 'task.form.assignee.label' | translate\n }}</label>\n <f-multiselect\n [(ngModel)]=\"selectedAssigneeIds\"\n [options]=\"members()\"\n optionLabel=\"userName\"\n optionValue=\"userId\"\n [placeholder]=\"'task.form.assignee.placeholder' | translate\"\n [showClear]=\"true\"\n />\n </div>\n\n <div class=\"flex flex-col gap-1\">\n <label class=\"text-sm font-medium\">{{\n 'task.form.labels.label' | translate\n }}</label>\n <f-multiselect\n [(ngModel)]=\"selectedLabelIds\"\n [options]=\"labels()\"\n optionLabel=\"name\"\n optionValue=\"id\"\n [placeholder]=\"'task.form.labels.placeholder' | translate\"\n />\n </div>\n </div>\n\n <ng-template #footer>\n <div class=\"flex justify-end gap-2 pt-1\">\n <button fButton severity=\"secondary\" (click)=\"onClose()\">\n <span pButtonLabel>{{ 'shared.cancel' | translate }}</span>\n </button>\n <button fButton (click)=\"onSave()\" [disabled]=\"isSaving()\">\n @if (isSaving()) {\n <ui-icon pButtonIcon name=\"spinner\" [spin]=\"true\"></ui-icon>\n }\n <span pButtonLabel>{{ 'shared.save' | translate }}</span>\n </button>\n </div>\n </ng-template>\n </f-dialog>\n `,\n})\nexport class TaskFormDialogComponent {\n private readonly taskApi = inject(TaskApiService);\n\n readonly visible = model(false);\n readonly task = input<ITask | null>(null);\n readonly boardId = input.required<string>();\n readonly listId = input.required<string>();\n readonly members = input<ITaskBoardMember[]>([]);\n readonly labels = input<ITaskLabel[]>([]);\n readonly saved = output<ITask>();\n\n readonly isSaving = signal(false);\n readonly priorityOptions = PRIORITY_OPTIONS;\n\n title = '';\n description = '';\n priority = 'MEDIUM';\n dueDate: Date | null = null;\n selectedAssigneeIds: string[] = [];\n selectedLabelIds: string[] = [];\n\n constructor() {\n effect(() => {\n const t = this.task();\n if (t) {\n this.title = t.title;\n this.description = t.description ?? '';\n this.priority = t.priority;\n this.dueDate = t.dueDate ? new Date(t.dueDate) : null;\n this.selectedAssigneeIds = t.assignees?.map((a) => a.userId) ?? [];\n this.selectedLabelIds = t.labelIds ?? [];\n } else {\n this.reset();\n }\n });\n }\n\n async onSave(): Promise<void> {\n if (!this.title.trim()) return;\n this.isSaving.set(true);\n try {\n const dueDateStr = this.dueDate\n ? this.dueDate.toISOString().slice(0, 10)\n : undefined;\n const existing = this.task();\n const priority = this.priority as ICreateTaskDto['priority'];\n let result;\n\n if (existing) {\n const dto: IUpdateTaskDto = {\n id: existing.id,\n title: this.title,\n description: this.description || undefined,\n priority,\n dueDate: dueDateStr,\n assigneeIds: this.selectedAssigneeIds,\n labelIds: this.selectedLabelIds,\n };\n result = await this.taskApi.update(dto);\n } else {\n const dto: ICreateTaskDto = {\n boardId: this.boardId(),\n listId: this.listId(),\n title: this.title,\n description: this.description || undefined,\n priority,\n dueDate: dueDateStr,\n assigneeIds: this.selectedAssigneeIds,\n labelIds: this.selectedLabelIds,\n };\n result = await this.taskApi.insert(dto);\n }\n\n if (result.data) this.saved.emit(result.data);\n this.visible.set(false);\n } finally {\n this.isSaving.set(false);\n }\n }\n\n onClose(): void {\n this.visible.set(false);\n this.reset();\n }\n\n private reset(): void {\n this.title = '';\n this.description = '';\n this.priority = 'MEDIUM';\n this.dueDate = null;\n this.selectedAssigneeIds = [];\n this.selectedLabelIds = [];\n }\n}\n","import { DatePipe } from '@angular/common';\nimport {\n Component,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { TranslatePipe } from '@flusys/ng-shared';\nimport { UiModule } from '@flusys/ng-ui';\nimport { ITask, ITaskComment } from '../../interfaces/task.interface';\nimport { TaskCommentApiService } from '../../services/task-api.service';\nimport { TaskBoardStateService } from '../../services/task-board-state.service';\nimport { memberInitials, taskPrioritySeverity } from '../../utils/task-utils';\n\n@Component({\n selector: 'tm-task-detail-panel',\n imports: [UiModule, DatePipe,\n FormsModule,\n TranslatePipe,],\n template: `\n <f-drawer\n [visible]=\"!!task()\"\n position=\"right\"\n [style]=\"{ width: '500px' }\"\n [header]=\"task()?.title ?? ''\"\n (onHide)=\"closePanel.emit()\"\n >\n @if (task(); as t) {\n <div class=\"flex flex-col gap-6 h-full overflow-y-auto pb-4\">\n <div class=\"flex items-center justify-end gap-1\">\n <button\n fButton\n severity=\"secondary\"\n size=\"small\"\n [text]=\"true\"\n [fTooltip]=\"'task.detail.edit' | translate\"\n tooltipPosition=\"left\"\n (click)=\"editTask.emit(t)\"\n >\n <ui-icon pButtonIcon name=\"pencil\"></ui-icon>\n </button>\n <button\n fButton\n severity=\"danger\"\n size=\"small\"\n [text]=\"true\"\n [fTooltip]=\"'task.detail.delete' | translate\"\n tooltipPosition=\"left\"\n (click)=\"deleteTask(t.id)\"\n [disabled]=\"isDeleting()\"\n >\n @if (isDeleting()) {\n <ui-icon pButtonIcon name=\"spinner\" [spin]=\"true\"></ui-icon>\n } @else {\n <ui-icon pButtonIcon name=\"trash\"></ui-icon>\n }\n </button>\n </div>\n\n <div class=\"flex items-center gap-3\">\n <f-tag\n [value]=\"t.priority\"\n [severity]=\"prioritySeverity(t.priority)\"\n />\n @if (t.dueDate) {\n <span class=\"text-sm text-muted-color\">\n {{ 'task.detail.due.label' | translate }}:\n {{ t.dueDate | date: 'mediumDate' }}\n </span>\n }\n </div>\n\n @if (assigneeMembers().length > 0) {\n <div>\n <h4 class=\"text-sm font-semibold mb-2\">\n {{ 'task.detail.assignees.label' | translate }}\n </h4>\n <div class=\"flex flex-wrap gap-2\">\n @for (member of assigneeMembers(); track member.userId) {\n <div class=\"flex items-center gap-2 px-2 py-1 rounded-full \">\n <f-avatar\n shape=\"circle\"\n size=\"small\"\n [label]=\"initials(member.userName)\"\n styleClass=\"!bg-primary-100 dark:!bg-primary-900 !text-primary-700 dark:!text-primary-300\"\n />\n <span class=\"text-sm\">{{ member.userName }}</span>\n </div>\n }\n </div>\n </div>\n }\n\n <div>\n <h4 class=\"text-sm font-semibold mb-2\">\n {{ 'shared.description' | translate }}\n </h4>\n <p class=\"text-sm text-color whitespace-pre-wrap\">\n {{\n t.description || ('task.detail.description.empty' | translate)\n }}\n </p>\n </div>\n\n <div class=\"flex flex-col gap-1\">\n <h4 class=\"text-sm font-semibold mb-1\">\n {{ 'task.detail.comments.label' | translate }} ({{\n rootComments().length\n }})\n </h4>\n\n @for (comment of rootComments(); track comment.id) {\n <div\n class=\"group flex flex-col gap-1 py-2 border-b border-surface last:border-0\"\n >\n <div class=\"flex items-center justify-between\">\n <span class=\"text-xs text-muted-color\">{{\n comment.createdAt | date: 'MMM d, y, h:mm a'\n }}</span>\n <button\n fButton\n size=\"small\"\n [text]=\"true\"\n severity=\"secondary\"\n class=\"opacity-0 group-hover:opacity-100 transition-opacity !py-0.5 !px-1.5 text-xs\"\n (click)=\"toggleReply(comment.id)\"\n >\n <ui-icon pButtonIcon name=\"reply\"></ui-icon>\n <span pButtonLabel>{{ 'task.comment.reply' | translate }}</span>\n </button>\n </div>\n <p class=\"text-sm\">{{ comment.content }}</p>\n\n @if (repliesFor(comment.id).length > 0) {\n <div\n class=\"mt-1 pl-3 border-l-2 border-surface flex flex-col gap-2\"\n >\n @for (reply of repliesFor(comment.id); track reply.id) {\n <div class=\"flex flex-col gap-0.5\">\n <span class=\"text-xs text-muted-color\">{{\n reply.createdAt | date: 'MMM d, y, h:mm a'\n }}</span>\n <p class=\"text-sm\">{{ reply.content }}</p>\n </div>\n }\n </div>\n }\n\n @if (replyingToId() === comment.id) {\n <div\n class=\"mt-2 pl-3 border-l-2 border-primary-300 dark:border-primary-700 flex gap-2\"\n >\n <textarea\n fTextarea\n [(ngModel)]=\"replyText\"\n rows=\"2\"\n [placeholder]=\"\n 'task.comment.reply.placeholder' | translate\n \"\n class=\"flex-1 resize-none text-sm\"\n autoResize=\"true\"\n ></textarea>\n <div class=\"flex flex-col gap-1\">\n <button\n fButton\n size=\"small\"\n [disabled]=\"!replyText.trim() || isSendingReply()\"\n (click)=\"submitReply(t.id, comment.id)\"\n >\n @if (isSendingReply()) {\n <ui-icon pButtonIcon name=\"spinner\" [spin]=\"true\"></ui-icon>\n } @else {\n <ui-icon pButtonIcon name=\"send\"></ui-icon>\n }\n </button>\n <button\n fButton\n size=\"small\"\n severity=\"secondary\"\n [text]=\"true\"\n (click)=\"cancelReply()\"\n >\n <ui-icon pButtonIcon name=\"times\"></ui-icon>\n </button>\n </div>\n </div>\n }\n </div>\n }\n\n @if (rootComments().length === 0) {\n <p class=\"text-sm text-muted-color py-2\">\n {{ 'task.detail.comments.empty' | translate }}\n </p>\n }\n\n <div class=\"flex gap-2 mt-3\">\n <textarea\n fTextarea\n [(ngModel)]=\"newComment\"\n rows=\"2\"\n [placeholder]=\"'task.detail.comment.placeholder' | translate\"\n class=\"flex-1 resize-none\"\n ></textarea>\n <button\n fButton\n [disabled]=\"!newComment.trim() || isSendingComment()\"\n (click)=\"addComment(t.id)\"\n >\n @if (isSendingComment()) {\n <ui-icon pButtonIcon name=\"spinner\" [spin]=\"true\"></ui-icon>\n } @else {\n <ui-icon pButtonIcon name=\"send\"></ui-icon>\n }\n </button>\n </div>\n </div>\n </div>\n }\n </f-drawer>\n `,\n})\nexport class TaskDetailPanelComponent {\n private readonly commentApi = inject(TaskCommentApiService);\n private readonly state = inject(TaskBoardStateService);\n\n readonly task = input<ITask | null>(null);\n\n readonly closePanel = output<void>();\n readonly editTask = output<ITask>();\n\n readonly comments = signal<ITaskComment[]>([]);\n readonly isSendingComment = signal(false);\n readonly isSendingReply = signal(false);\n readonly replyingToId = signal<string | null>(null);\n readonly isDeleting = signal(false);\n\n newComment = '';\n replyText = '';\n\n readonly assigneeMembers = computed(() => this.task()?.assignees ?? []);\n\n readonly rootComments = computed(() =>\n this.comments().filter((c) => !c.parentCommentId),\n );\n\n repliesFor(parentId: string): ITaskComment[] {\n return this.comments().filter((c) => c.parentCommentId === parentId);\n }\n\n constructor() {\n effect(() => {\n const t = this.task();\n if (t) this.loadComments(t.id);\n else {\n this.comments.set([]);\n this.replyingToId.set(null);\n }\n });\n }\n\n toggleReply(commentId: string): void {\n if (this.replyingToId() === commentId) {\n this.cancelReply();\n } else {\n this.replyingToId.set(commentId);\n this.replyText = '';\n }\n }\n\n cancelReply(): void {\n this.replyingToId.set(null);\n this.replyText = '';\n }\n\n async deleteTask(taskId: string): Promise<void> {\n this.isDeleting.set(true);\n try {\n await this.state.deleteTask(taskId);\n this.closePanel.emit();\n } finally {\n this.isDeleting.set(false);\n }\n }\n\n protected readonly prioritySeverity = taskPrioritySeverity;\n protected readonly initials = memberInitials;\n\n private async loadComments(taskId: string): Promise<void> {\n const res = await this.commentApi.getAll({ filter: { taskId } });\n this.comments.set(res.data ?? []);\n }\n\n async addComment(taskId: string): Promise<void> {\n if (!this.newComment.trim()) return;\n this.isSendingComment.set(true);\n try {\n const res = await this.commentApi.insert({\n taskId,\n content: this.newComment,\n });\n if (res.data) this.comments.update((list) => [...list, res.data!]);\n this.newComment = '';\n } finally {\n this.isSendingComment.set(false);\n }\n }\n\n async submitReply(taskId: string, parentCommentId: string): Promise<void> {\n if (!this.replyText.trim()) return;\n this.isSendingReply.set(true);\n try {\n const res = await this.commentApi.insert({\n taskId,\n content: this.replyText,\n parentCommentId,\n });\n if (res.data) this.comments.update((list) => [...list, res.data!]);\n this.cancelReply();\n } finally {\n this.isSendingReply.set(false);\n }\n }\n}\n","import { Component, inject, signal } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { AngularModule, TranslatePipe } from '@flusys/ng-shared';\nimport { TaskBoardApiService } from '../../services/task-board-api.service';\nimport { TaskBoardStateService } from '../../services/task-board-state.service';\nimport { BOARD_COLOR_PALETTE } from '../../utils/task-utils';\nimport { UiModule } from '@flusys/ng-ui';\n\n@Component({\n selector: 'tm-board-list-page',\n imports: [AngularModule, UiModule, TranslatePipe],\n template: `\n <div class=\"p-2 sm:p-4\">\n <div\n class=\"flex flex-col sm:flex-row justify-between items-start sm:items-center gap-3 mb-4\"\n >\n <div>\n <h1 class=\"text-xl sm:text-2xl font-bold m-0\">\n {{ 'task.manager.boards.title' | translate }}\n </h1>\n <p class=\"text-muted-color mt-1 text-sm sm:text-base\">\n {{ 'task.manager.boards.subtitle' | translate }}\n </p>\n </div>\n <button\n fButton\n (click)=\"showCreateDialog.set(true)\"\n >\n <ui-icon pButtonIcon name=\"plus\"></ui-icon>\n <span pButtonLabel>{{ 'task.manager.board.new' | translate }}</span>\n </button>\n </div>\n\n @if (state.isLoading()) {\n <div class=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4\">\n @for (i of [1, 2, 3, 4, 5, 6]; track i) {\n <div class=\"card !p-0 overflow-hidden\">\n <f-skeleton height=\"4px\" borderRadius=\"0\" />\n <div class=\"p-5\">\n <f-skeleton height=\"18px\" width=\"60%\" class=\"mb-3\" />\n <f-skeleton height=\"13px\" class=\"mb-1\" />\n <f-skeleton height=\"13px\" width=\"70%\" class=\"mb-5\" />\n <div class=\"flex gap-5 pt-4 border-t border-surface-100\">\n <f-skeleton height=\"14px\" width=\"55px\" />\n <f-skeleton height=\"14px\" width=\"45px\" />\n <f-skeleton height=\"14px\" width=\"50px\" />\n </div>\n <f-skeleton height=\"11px\" width=\"100px\" class=\"mt-2\" />\n </div>\n </div>\n }\n </div>\n } @else if (state.boards().length === 0) {\n <div\n class=\"flex flex-col items-center justify-center py-20 text-muted-color\"\n >\n <span\n class=\"w-16 h-16 rounded-2xl border-2 border-dashed border-surface-300 flex items-center justify-center mb-4\"\n >\n <ui-icon name=\"th-large\" class=\"text-2xl text-surface-400\"></ui-icon>\n </span>\n <p class=\"text-base font-semibold mb-1\">\n {{ 'task.manager.board.empty' | translate }}\n </p>\n <p class=\"text-sm text-muted-color mb-5\">\n {{ 'task.manager.board.empty.hint' | translate }}\n </p>\n <button\n fButton\n size=\"small\"\n (click)=\"showCreateDialog.set(true)\"\n >\n <ui-icon pButtonIcon name=\"plus\"></ui-icon>\n <span pButtonLabel>{{ 'task.manager.board.new' | translate }}</span>\n </button>\n </div>\n } @else {\n <div class=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4\">\n @for (board of state.boards(); track board.id) {\n <div\n class=\"card !p-0 cursor-pointer overflow-hidden group hover:shadow-lg transition-all duration-200\"\n (click)=\"openBoard(board.id)\"\n >\n <div class=\"h-1\" [style.background-color]=\"board.color\"></div>\n\n <div class=\"p-5\">\n <div class=\"flex items-start justify-between gap-3 mb-2\">\n <div class=\"flex items-center gap-2 min-w-0\">\n <h3\n class=\"font-semibold text-base m-0 truncate group-hover:text-primary-500 transition-colors duration-150\"\n >\n {{ board.name }}\n </h3>\n </div>\n <ui-icon name=\"arrow-right\" class=\"text-xs text-surface-300 group-hover:text-primary-500 group-hover:translate-x-0.5 transition-all duration-150 flex-shrink-0 mt-1\"></ui-icon>\n </div>\n\n <p\n class=\"text-sm text-muted-color line-clamp-2 pl-[18px] mb-0 min-h-[40px]\"\n >\n {{ board.description || '' }}\n </p>\n\n <div\n class=\"border-t border-surface mt-4 pt-4 space-y-2.5\"\n >\n <div class=\"flex items-center gap-4\">\n <span class=\"flex items-center gap-1.5\">\n <ui-icon name=\"users\" class=\"text-[11px] text-muted-color\"></ui-icon>\n <span class=\"text-sm font-semibold\">{{\n board.totalMembers ?? 0\n }}</span>\n <span class=\"text-xs text-muted-color\">{{\n 'task.manager.board.members' | translate\n }}</span>\n </span>\n <span\n class=\"w-px h-3 bg-surface-200 dark:bg-surface-600\"\n ></span>\n <span class=\"flex items-center gap-1.5\">\n <ui-icon name=\"list\" class=\"text-[11px] text-muted-color\"></ui-icon>\n <span class=\"text-sm font-semibold\">{{\n board.totalLists ?? 0\n }}</span>\n <span class=\"text-xs text-muted-color\">{{\n 'task.manager.board.lists' | translate\n }}</span>\n </span>\n <span\n class=\"w-px h-3 bg-surface-200 dark:bg-surface-600\"\n ></span>\n <span class=\"flex items-center gap-1.5\">\n <ui-icon name=\"check-square\" class=\"text-[11px] text-muted-color\"></ui-icon>\n <span class=\"text-sm font-semibold\">{{\n board.totalTasks ?? 0\n }}</span>\n <span class=\"text-xs text-muted-color\">{{\n 'task.manager.board.tasks' | translate\n }}</span>\n </span>\n </div>\n <div\n class=\"flex items-center gap-1.5 text-xs text-muted-color\"\n >\n <ui-icon name=\"clock\" class=\"text-[10px]\"></ui-icon>\n <span>{{ board.createdAt | date: 'MMM d, yyyy' }}</span>\n </div>\n </div>\n </div>\n </div>\n }\n </div>\n }\n </div>\n\n <f-dialog\n [header]=\"'task.manager.board.new' | translate\"\n [(visible)]=\"showCreateDialog\"\n [modal]=\"true\"\n [style]=\"{ width: '440px' }\"\n >\n <div class=\"flex flex-col gap-4 py-2\">\n <div class=\"flex flex-col gap-1\">\n <label class=\"text-sm font-medium\"\n >{{ 'shared.name' | translate }}\n <span class=\"text-red-500\">*</span></label\n >\n <input\n fInputText\n [(ngModel)]=\"newBoardName\"\n [placeholder]=\"'task.manager.board.name.placeholder' | translate\"\n />\n </div>\n <div class=\"flex flex-col gap-1\">\n <label class=\"text-sm font-medium\">{{\n 'shared.description' | translate\n }}</label>\n <textarea\n fTextarea\n [(ngModel)]=\"newBoardDescription\"\n rows=\"2\"\n [placeholder]=\"\n 'task.manager.board.description.placeholder' | translate\n \"\n ></textarea>\n </div>\n <div class=\"flex flex-col gap-2\">\n <label class=\"text-sm font-medium\">{{\n 'task.manager.board.color.label' | translate\n }}</label>\n <div class=\"flex flex-wrap gap-2\">\n @for (c of boardColors; track c) {\n <button\n type=\"button\"\n class=\"w-8 h-8 rounded-full border-2 transition-all hover:scale-110 focus:outline-none flex items-center justify-center\"\n [style.background-color]=\"c\"\n [class.ring-2]=\"newBoardColor === c\"\n [class.ring-offset-2]=\"newBoardColor === c\"\n [class.ring-surface-900]=\"newBoardColor === c\"\n [fTooltip]=\"c\"\n (click)=\"newBoardColor = c\"\n >\n @if (newBoardColor === c) {\n <ui-icon name=\"check\" class=\"text-white text-xs\"></ui-icon>\n }\n </button>\n }\n </div>\n <div class=\"flex items-center gap-2 mt-1\">\n <span\n class=\"w-8 h-8 rounded-full border border-surface-200 flex-shrink-0\"\n [style.background-color]=\"newBoardColor\"\n ></span>\n <span class=\"text-sm text-surface-500 font-mono\">{{\n newBoardColor\n }}</span>\n </div>\n </div>\n </div>\n\n <ng-template #footer>\n <div class=\"flex justify-end gap-2\">\n <button\n fButton\n severity=\"secondary\"\n (click)=\"closeCreateDialog()\"\n >\n <span pButtonLabel>{{ 'shared.cancel' | translate }}</span>\n </button>\n <button\n fButton\n (click)=\"createBoard()\"\n [disabled]=\"isCreating()\"\n >\n @if (isCreating()) {\n <ui-icon pButtonIcon name=\"spinner\" [spin]=\"true\"></ui-icon>\n }\n <span pButtonLabel>{{ 'shared.create' | translate }}</span>\n </button>\n </div>\n </ng-template>\n </f-dialog>\n `,\n})\nexport class BoardListPageComponent {\n protected readonly state = inject(TaskBoardStateService);\n private readonly boardApi = inject(TaskBoardApiService);\n private readonly router = inject(Router);\n\n readonly showCreateDialog = signal(false);\n readonly isCreating = signal(false);\n newBoardName = '';\n newBoardDescription = '';\n newBoardColor = BOARD_COLOR_PALETTE[0];\n readonly boardColors = BOARD_COLOR_PALETTE;\n\n constructor() {\n this.state.loadBoards();\n }\n\n openBoard(boardId: string): void {\n this.router.navigate(['/task-manager/board', boardId]);\n }\n\n closeCreateDialog(): void {\n this.showCreateDialog.set(false);\n this.newBoardName = '';\n this.newBoardDescription = '';\n this.newBoardColor = BOARD_COLOR_PALETTE[0];\n }\n\n async createBoard(): Promise<void> {\n if (!this.newBoardName.trim()) return;\n this.isCreating.set(true);\n try {\n await this.boardApi.insert({\n name: this.newBoardName,\n description: this.newBoardDescription || undefined,\n color: this.newBoardColor,\n });\n await this.state.loadBoards();\n this.closeCreateDialog();\n } finally {\n this.isCreating.set(false);\n }\n }\n}\n","import {\n CdkDragDrop,\n DragDropModule,\n moveItemInArray,\n transferArrayItem,\n} from '@angular/cdk/drag-drop';\nimport {\n Component,\n computed,\n DestroyRef,\n effect,\n inject,\n input,\n signal,\n untracked,\n} from '@angular/core';\nimport {\n AngularModule,\n TranslatePipe,\n TranslateService,\n UserSelectComponent,\n} from '@flusys/ng-shared';\nimport { ConfirmationService, MessageService, UiModule } from '@flusys/ng-ui';\nimport { TaskCardComponent } from '../../components/task-card/task-card.component';\nimport { TaskDetailPanelComponent } from '../../components/task-detail-panel/task-detail-panel.component';\nimport { TaskFormDialogComponent } from '../../components/task-form-dialog/task-form-dialog.component';\nimport {\n ITask,\n ITaskBoard,\n ITaskBoardMember,\n ITaskList,\n} from '../../interfaces/task.interface';\nimport {\n TaskApiService,\n TaskListApiService,\n} from '../../services/task-api.service';\nimport { TaskBoardStateService } from '../../services/task-board-state.service';\nimport {\n BOARD_COLOR_PALETTE,\n isTaskOverdue,\n memberColorFromId,\n memberInitials,\n taskPrioritySeverity,\n} from '../../utils/task-utils';\n\ntype ViewMode = 'board' | 'list';\ntype ITaskListWithTasks = ITaskList & { tasks: ITask[] };\n\ninterface ITaskRow extends ITask {\n listName: string;\n listColor: string;\n}\n\n@Component({\n selector: 'tm-board-view-page',\n imports: [\n UiModule,\n DragDropModule,\n AngularModule,\n TaskCardComponent,\n TaskFormDialogComponent,\n TaskDetailPanelComponent,\n TranslatePipe,\n UserSelectComponent,\n ],\n template: `\n <div class=\"flex flex-col h-full\">\n <div class=\"flex flex-col\">\n <div class=\"flex items-center justify-between px-5 py-2.5 gap-4\">\n @if (state.activeBoard(); as board) {\n <div class=\"flex items-center gap-2.5 min-w-0 flex-1 group\">\n <div class=\"flex flex-col min-w-0\">\n <div class=\"flex items-center gap-1.5 min-w-0\">\n <h1\n class=\"text-base font-bold text-surface-900 dark:text-surface-0 truncate leading-snug\"\n >\n {{ board.name }}\n </h1>\n <button\n fButton\n [text]=\"true\"\n size=\"small\"\n severity=\"secondary\"\n class=\"!w-6 !h-6 flex-shrink-0 opacity-0 group-hover:opacity-100 transition-opacity\"\n [fTooltip]=\"'task.manager.board.edit' | translate\"\n tooltipPosition=\"bottom\"\n (click)=\"openEditBoardDialog(board)\"\n >\n <ui-icon pButtonIcon name=\"pencil\"></ui-icon>\n </button>\n </div>\n @if (board.description) {\n <span\n class=\"text-xs text-muted-color truncate max-w-sm hidden md:block leading-snug\"\n >\n {{ board.description }}\n </span>\n }\n </div>\n </div>\n }\n\n <div class=\"flex items-center gap-1.5 flex-shrink-0\">\n @if (state.members().length > 0) {\n <div\n class=\"flex items-center -space-x-2 cursor-pointer mr-1\"\n (click)=\"showMembersDialog.set(true)\"\n [fTooltip]=\"'task.manager.board.manage.members' | translate\"\n tooltipPosition=\"bottom\"\n >\n @for (member of state.members().slice(0, 4); track member.id) {\n <f-avatar\n shape=\"circle\"\n size=\"small\"\n [label]=\"memberInitials(member)\"\n [color]=\"memberColor(member)\"\n styleClass=\"!border-2 !border-surface-card ring-1 ring-surface flex-shrink-0\"\n />\n }\n @if (state.members().length > 4) {\n <f-avatar\n shape=\"circle\"\n size=\"small\"\n [label]=\"'+' + (state.members().length - 4)\"\n styleClass=\"!border-2 !border-surface-card !bg-surface-200 dark:!bg-surface-700 !text-surface-600 dark:!text-surface-300 flex-shrink-0\"\n />\n }\n </div>\n }\n\n <div\n class=\"h-5 w-px bg-surface-300 dark:bg-surface-600 mx-0.5\"\n ></div>\n\n <div\n class=\"flex rounded-border overflow-hidden border border-surface\"\n >\n <button\n fButton\n [fTooltip]=\"'task.manager.view.board' | translate\"\n tooltipPosition=\"bottom\"\n size=\"small\"\n [severity]=\"viewMode() === 'board' ? 'primary' : 'secondary'\"\n [outlined]=\"viewMode() !== 'board'\"\n class=\"!rounded-none !border-0\"\n (click)=\"viewMode.set('board')\"\n >\n <ui-icon pButtonIcon name=\"th-large\"></ui-icon>\n </button>\n <button\n fButton\n [fTooltip]=\"'task.manager.view.list' | translate\"\n tooltipPosition=\"bottom\"\n size=\"small\"\n [severity]=\"viewMode() === 'list' ? 'primary' : 'secondary'\"\n [outlined]=\"viewMode() !== 'list'\"\n class=\"!rounded-none !border-0\"\n (click)=\"viewMode.set('list')\"\n >\n <ui-icon pButtonIcon name=\"list\"></ui-icon>\n </button>\n </div>\n\n <div\n class=\"h-5 w-px bg-surface-300 dark:bg-surface-600 mx-0.5\"\n ></div>\n\n <button\n fButton\n [text]=\"true\"\n severity=\"secondary\"\n size=\"small\"\n class=\"!w-8 !h-8\"\n [fTooltip]=\"'task.manager.board.manage.members' | translate\"\n tooltipPosition=\"bottom\"\n (click)=\"showMembersDialog.set(true)\"\n >\n <ui-icon pButtonIcon name=\"users\"></ui-icon>\n </button>\n <button\n fButton\n [text]=\"true\"\n severity=\"secondary\"\n size=\"small\"\n class=\"!w-8 !h-8\"\n [fTooltip]=\"'task.manager.board.manage.labels' | translate\"\n tooltipPosition=\"bottom\"\n (click)=\"showLabelsDialog.set(true)\"\n >\n <ui-icon pButtonIcon name=\"tag\"></ui-icon>\n </button>\n\n @if (viewMode() === 'board') {\n <div\n class=\"h-5 w-px bg-surface-300 dark:bg-surface-600 mx-0.5\"\n ></div>\n <button\n fButton\n size=\"small\"\n (click)=\"showAddListDialog.set(true)\"\n >\n <ui-icon pButtonIcon name=\"plus\"></ui-icon>\n <span pButtonLabel>{{\n 'task.manager.board.add.list' | translate\n }}</span>\n </button>\n }\n </div>\n </div>\n\n @if (state.activeBoard(); as board) {\n <div\n class=\"h-0.5 w-full flex-shrink-0\"\n [style.background-color]=\"board.color\"\n ></div>\n }\n </div>\n\n @if (state.isBoardLoading()) {\n @if (viewMode() === 'board') {\n <div class=\"flex gap-4 p-6 overflow-x-auto\">\n @for (i of [1, 2, 3]; track i) {\n <div class=\"flex-shrink-0 w-72\">\n <f-skeleton height=\"36px\" class=\"mb-3\" />\n @for (j of [1, 2, 3]; track j) {\n <f-skeleton height=\"90px\" class=\"mb-2\" />\n }\n </div>\n }\n </div>\n } @else {\n <div class=\"p-6\">\n @for (i of [1, 2, 3, 4, 5]; track i) {\n <f-skeleton height=\"48px\" class=\"mb-2\" />\n }\n </div>\n }\n } @else if (viewMode() === 'board') {\n <div\n class=\"flex gap-4 p-5 overflow-x-auto flex-1\"\n cdkDropList\n cdkDropListOrientation=\"horizontal\"\n [cdkDropListData]=\"state.listsWithTasks()\"\n (cdkDropListDropped)=\"onListDrop($event)\"\n >\n @for (list of state.listsWithTasks(); track list.id) {\n <div\n cdkDrag\n 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\"\n >\n <div\n class=\"flex items-center gap-1 px-2.5 py-2.5 border-b border-surface\"\n >\n <ui-icon\n cdkDragHandle\n name=\"bars\"\n class=\"text-muted-color text-xs cursor-grab flex-shrink-0 px-1\"\n ></ui-icon>\n\n <div class=\"flex items-center gap-2 min-w-0 flex-1\">\n @if (editingListId() === list.id) {\n <input\n fInputText\n class=\"text-sm font-semibold !h-6 !py-0 !px-1 w-full\"\n [ngModel]=\"editingListNameValue()\"\n (ngModelChange)=\"editingListNameValue.set($event)\"\n (keydown.enter)=\"saveRenameList()\"\n (keydown.escape)=\"cancelRenameList()\"\n (blur)=\"cancelRenameList()\"\n (click)=\"$event.stopPropagation()\"\n autofocus\n />\n } @else {\n <span class=\"font-semibold text-sm truncate\">{{\n list.name\n }}</span>\n <span\n class=\"text-[11px] font-semibold px-1.5 py-0.5 rounded-full text-white flex-shrink-0\"\n [style.background-color]=\"list.color\"\n >\n {{ list.tasks.length }}\n </span>\n }\n </div>\n\n @if (editingListId() === list.id) {\n <button\n fButton\n [text]=\"true\"\n size=\"small\"\n severity=\"success\"\n class=\"!w-6 !h-6 flex-shrink-0\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"saveRenameList(); $event.stopPropagation()\"\n >\n <ui-icon pButtonIcon name=\"check\"></ui-icon>\n </button>\n <button\n fButton\n [text]=\"true\"\n size=\"small\"\n severity=\"secondary\"\n class=\"!w-6 !h-6 flex-shrink-0\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"cancelRenameList(); $event.stopPropagation()\"\n >\n <ui-icon pButtonIcon name=\"times\"></ui-icon>\n </button>\n } @else {\n <button\n fButton\n [text]=\"true\"\n size=\"small\"\n severity=\"secondary\"\n class=\"!w-6 !h-6 flex-shrink-0\"\n [fTooltip]=\"'task.manager.list.rename' | translate\"\n tooltipPosition=\"bottom\"\n (click)=\"startRenameList(list); $event.stopPropagation()\"\n >\n <ui-icon pButtonIcon name=\"pencil\"></ui-icon>\n </button>\n }\n </div>\n\n <div\n cdkDropList\n [id]=\"list.id\"\n [cdkDropListData]=\"list.tasks\"\n [cdkDropListConnectedTo]=\"listDropIds()\"\n (cdkDropListDropped)=\"onTaskDrop($event)\"\n class=\"flex flex-col gap-2 p-2 overflow-y-auto flex-1 min-h-[60px]\"\n >\n @for (task of list.tasks; track task.id) {\n <div cdkDrag>\n <tm-task-card\n [task]=\"task\"\n (cardClick)=\"state.selectTask($event)\"\n (editClick)=\"onEditTask($event)\"\n (deleteClick)=\"onDeleteTask($event)\"\n />\n </div>\n }\n @if (list.tasks.length === 0) {\n <div\n class=\"flex items-center justify-center h-14 border-2 border-dashed border-surface rounded-border\"\n >\n <span class=\"text-xs text-muted-color\">{{\n 'task.manager.board.drop.tasks.here' | translate\n }}</span>\n </div>\n }\n </div>\n\n <div class=\"border-t border-surface p-1.5\">\n <button\n fButton\n severity=\"secondary\"\n [text]=\"true\"\n size=\"small\"\n class=\"w-full !justify-start\"\n (click)=\"openAddTask(list)\"\n >\n <ui-icon pButtonIcon name=\"plus\"></ui-icon>\n <span pButtonLabel>{{\n 'task.manager.board.add.task' | translate\n }}</span>\n </button>\n </div>\n </div>\n }\n\n @if (state.listsWithTasks().length === 0) {\n <div class=\"flex-1 flex items-center justify-center\">\n <div class=\"text-center text-muted-color\">\n <div\n class=\"w-16 h-16 rounded-2xl border-2 border-dashed border-surface flex items-center justify-center mx-auto mb-4\"\n >\n <ui-icon\n name=\"list\"\n class=\"text-3xl text-muted-color\"\n ></ui-icon>\n </div>\n <p class=\"font-medium text-muted-color\">\n {{ 'task.manager.board.list.empty' | translate }}\n </p>\n <button\n fButton\n severity=\"secondary\"\n size=\"small\"\n class=\"mt-3\"\n (click)=\"showAddListDialog.set(true)\"\n >\n <ui-icon pButtonIcon name=\"plus\"></ui-icon>\n <span pButtonLabel>{{\n 'task.manager.board.add.list' | translate\n }}</span>\n </button>\n </div>\n </div>\n }\n </div>\n } @else {\n <div class=\"p-4 sm:p-6 flex-1 overflow-auto\">\n <div class=\"card\">\n <div class=\"overflow-x-auto -mx-4 sm:mx-0\">\n <f-table\n [value]=\"allTasksFlat()\"\n [paginator]=\"allTasksFlat().length > 20\"\n [rows]=\"20\"\n [rowsPerPageOptions]=\"[10, 20, 50]\"\n [scrollable]=\"true\"\n [tableStyle]=\"{ 'min-width': '700px' }\"\n >\n <ng-template #header>\n <tr>\n <th fSortableColumn=\"title\" class=\"min-w-[240px]\">\n {{ 'task.manager.table.title' | translate }}\n <f-sorticon field=\"title\" />\n </th>\n <th fSortableColumn=\"listName\" class=\"w-40\">\n {{ 'task.manager.table.list' | translate }}\n <f-sorticon field=\"listName\" />\n </th>\n <th fSortableColumn=\"priority\" class=\"w-32\">\n {{ 'task.manager.table.priority' | translate }}\n <f-sorticon field=\"priority\" />\n </th>\n <th class=\"w-36\">\n {{ 'task.manager.table.assignee' | translate }}\n </th>\n <th fSortableColumn=\"dueDate\" class=\"w-32\">\n {{ 'task.manager.table.due.date' | translate }}\n <f-sorticon field=\"dueDate\" />\n </th>\n <th class=\"w-[100px]\">\n {{ 'shared.actions' | translate }}\n </th>\n </tr>\n </ng-template>\n <ng-template #body let-task>\n <tr>\n <td>\n <span\n class=\"font-medium text-sm cursor-pointer hover:text-primary-500 transition-colors\"\n (click)=\"state.selectTask(task)\"\n >{{ task.title }}</span\n >\n </td>\n <td>\n <span class=\"inline-flex items-center gap-1.5 text-sm\">\n <span\n class=\"w-2 h-2 rounded-full flex-shrink-0\"\n [style.background-color]=\"task.listColor\"\n ></span>\n {{ task.listName }}\n </span>\n </td>\n <td>\n <f-tag\n [value]=\"task.priority\"\n [severity]=\"prioritySeverity(task.priority)\"\n />\n </td>\n <td>\n @if (task.assignees?.length) {\n <div class=\"flex items-center -space-x-1.5\">\n @for (\n a of task.assignees!.slice(0, 3);\n track a.userId\n ) {\n <f-avatar\n shape=\"circle\"\n size=\"small\"\n [label]=\"getMemberInitials(a.userId)\"\n [color]=\"memberColorById(a.userId)\"\n styleClass=\"!ring-surface-card flex-shrink-0\"\n [fTooltip]=\"a.userName ?? ''\"\n />\n }\n @if (task.assignees!.length > 3) {\n <f-avatar\n shape=\"circle\"\n size=\"small\"\n [label]=\"'+' + (task.assignees!.length - 3)\"\n styleClass=\"!bg-surface-200 dark:!bg-surface-700 !text-surface-600 !ring-surface-card flex-shrink-0\"\n />\n }\n </div>\n } @else {\n <span class=\"text-muted-color text-sm\">—</span>\n }\n </td>\n <td>\n @if (task.dueDate) {\n <span\n class=\"text-sm\"\n [class.text-red-500]=\"isOverdue(task.dueDate)\"\n >\n {{ task.dueDate | date: 'MMM d, y' }}\n </span>\n } @else {\n <span class=\"text-muted-color text-sm\">—</span>\n }\n </td>\n <td>\n <div class=\"flex gap-1\">\n <button\n fButton\n [text]=\"true\"\n severity=\"secondary\"\n size=\"small\"\n [fTooltip]=\"'shared.edit' | translate\"\n (click)=\"onEditTask(task)\"\n >\n <ui-icon pButtonIcon name=\"pencil\"></ui-icon>\n </button>\n <button\n fButton\n [text]=\"true\"\n severity=\"danger\"\n size=\"small\"\n [fTooltip]=\"'shared.delete' | translate\"\n (click)=\"onDeleteTask(task)\"\n >\n <ui-icon pButtonIcon name=\"trash\"></ui-icon>\n </button>\n </div>\n </td>\n </tr>\n </ng-template>\n <ng-template #emptymessage>\n <tr>\n <td colspan=\"6\" class=\"text-center text-muted-color py-8\">\n <ui-icon\n name=\"inbox\"\n class=\"text-4xl block mb-3\"\n ></ui-icon>\n {{ 'task.manager.table.empty' | translate }}\n </td>\n </tr>\n </ng-template>\n </f-table>\n </div>\n </div>\n </div>\n }\n </div>\n\n <tm-task-form-dialog\n [(visible)]=\"showTaskForm\"\n [task]=\"editingTask()\"\n [boardId]=\"boardId()\"\n [listId]=\"activeListId()\"\n [members]=\"state.members()\"\n [labels]=\"state.labels()\"\n (saved)=\"onTaskSaved($event)\"\n />\n\n <tm-task-detail-panel\n [task]=\"state.selectedTask()\"\n (closePanel)=\"state.selectTask(null)\"\n (editTask)=\"onEditTask($event)\"\n />\n\n <f-dialog\n [header]=\"'task.manager.label.manage.title' | translate\"\n [(visible)]=\"showLabelsDialog\"\n [modal]=\"true\"\n [style]=\"{ width: '420px' }\"\n (onHide)=\"newLabelName = ''; newLabelColor = boardColorPalette[0]\"\n >\n <div class=\"flex flex-col gap-4 py-2\">\n <div class=\"flex gap-2 items-end\">\n <div class=\"flex flex-col gap-1 flex-1\">\n <label class=\"text-sm font-medium\">{{\n 'task.manager.label.name.label' | translate\n }}</label>\n <input\n fInputText\n [(ngModel)]=\"newLabelName\"\n [placeholder]=\"'task.manager.label.name.placeholder' | translate\"\n />\n </div>\n <div class=\"flex flex-col gap-1\">\n <label class=\"text-sm font-medium\">{{\n 'task.manager.label.color.label' | translate\n }}</label>\n <input\n type=\"color\"\n [(ngModel)]=\"newLabelColor\"\n class=\"w-10 h-10 rounded cursor-pointer border border-surface-300\"\n />\n </div>\n <button\n fButton\n size=\"small\"\n (click)=\"addLabel()\"\n [disabled]=\"isAddingLabel()\"\n >\n @if (isAddingLabel()) {\n <ui-icon pButtonIcon name=\"spinner\" [spin]=\"true\"></ui-icon>\n } @else {\n <ui-icon pButtonIcon name=\"plus\"></ui-icon>\n }\n <span pButtonLabel>{{ 'task.manager.label.add' | translate }}</span>\n </button>\n </div>\n\n <div class=\"flex flex-col gap-2 max-h-64 overflow-y-auto\">\n @if (state.labels().length === 0) {\n <p class=\"text-sm text-muted-color text-center py-4\">\n {{ 'task.manager.label.no.labels' | translate }}\n </p>\n }\n @for (label of state.labels(); track label.id) {\n <div\n class=\"flex items-center justify-between px-3 py-2 rounded-border border border-surface\"\n >\n <div class=\"flex items-center gap-2\">\n <span\n class=\"w-4 h-4 rounded-full flex-shrink-0\"\n [style.background-color]=\"label.color\"\n ></span>\n <span class=\"text-sm font-medium\">{{ label.name }}</span>\n </div>\n <button\n fButton\n severity=\"danger\"\n size=\"small\"\n [text]=\"true\"\n (click)=\"removeLabel(label.id)\"\n >\n <ui-icon pButtonIcon name=\"trash\"></ui-icon>\n </button>\n </div>\n }\n </div>\n </div>\n </f-dialog>\n\n <f-dialog\n [header]=\"'task.manager.member.manage.title' | translate\"\n [(visible)]=\"showMembersDialog\"\n [modal]=\"true\"\n [style]=\"{ width: '480px' }\"\n (onHide)=\"resetMemberForm()\"\n >\n <div class=\"flex flex-col gap-4 py-2\">\n <div class=\"flex flex-col gap-3\">\n <div class=\"flex flex-col gap-1\">\n <label class=\"text-sm font-medium\">{{\n 'task.manager.member.user.label' | translate\n }}</label>\n <lib-user-select\n [(value)]=\"selectedMemberUser\"\n [isEditMode]=\"true\"\n [placeHolder]=\"'task.manager.member.user.placeholder' | translate\"\n />\n </div>\n\n <div class=\"flex gap-2 items-end\">\n <div class=\"flex flex-col gap-1 flex-1\">\n <label class=\"text-sm font-medium\">{{\n 'task.manager.member.role.label' | translate\n }}</label>\n <f-select\n [(ngModel)]=\"newMemberRole\"\n [options]=\"memberRoleOptions\"\n optionValue=\"value\"\n [placeholder]=\"\n 'task.manager.member.role.placeholder' | translate\n \"\n class=\"w-full\"\n >\n <ng-template #selectedItem let-opt>\n {{ opt.labelKey | translate }}\n </ng-template>\n <ng-template #item let-opt>\n {{ opt.labelKey | translate }}\n </ng-template>\n </f-select>\n </div>\n <button\n fButton\n size=\"small\"\n [disabled]=\"!selectedMemberUser || isAddingMember()\"\n (click)=\"addMember()\"\n >\n @if (isAddingMember()) {\n <ui-icon pButtonIcon name=\"spinner\" [spin]=\"true\"></ui-icon>\n } @else {\n <ui-icon pButtonIcon name=\"plus\"></ui-icon>\n }\n <span pButtonLabel>{{\n 'task.manager.member.add' | translate\n }}</span>\n </button>\n </div>\n </div>\n\n <div class=\"flex flex-col gap-2 max-h-72 overflow-y-auto\">\n @if (state.members().length === 0) {\n <p class=\"text-sm text-muted-color text-center py-4\">\n {{ 'task.manager.member.no.members' | translate }}\n </p>\n }\n @for (member of state.members(); track member.id) {\n <div\n class=\"flex items-center justify-between px-3 py-2.5 rounded-border border border-surface\"\n >\n <div class=\"flex items-center gap-3\">\n <f-avatar\n shape=\"circle\"\n [label]=\"memberInitials(member)\"\n [color]=\"memberColor(member)\"\n styleClass=\"!text-[11px] flex-shrink-0\"\n />\n <div>\n <div class=\"text-sm font-medium \">\n {{ member.userName ?? member.userId }}\n </div>\n @if (member.userEmail) {\n <div class=\"text-xs text-muted-color\">\n {{ member.userEmail }}\n </div>\n }\n </div>\n </div>\n <div class=\"flex items-center gap-2\">\n <span\n class=\"text-[10px] font-semibold px-2 py-0.5 rounded-full\"\n [class]=\"roleBadgeClass(member.role)\"\n >\n {{\n 'task.manager.member.role.' + member.role.toLowerCase()\n | translate\n }}\n </span>\n @if (member.role !== 'OWNER') {\n <button\n fButton\n severity=\"danger\"\n size=\"small\"\n [text]=\"true\"\n (click)=\"removeMember(member.userId)\"\n >\n <ui-icon pButtonIcon name=\"trash\"></ui-icon>\n </button>\n }\n </div>\n </div>\n }\n </div>\n </div>\n </f-dialog>\n\n <f-dialog\n [header]=\"'task.manager.list.new' | translate\"\n [(visible)]=\"showAddListDialog\"\n [modal]=\"true\"\n [style]=\"{ width: '360px' }\"\n (onHide)=\"newListName = ''\"\n >\n <div class=\"flex flex-col gap-2 py-2\">\n <label class=\"text-sm font-medium\">\n {{ 'task.manager.list.name.label' | translate }}\n <span class=\"text-red-500\">*</span>\n </label>\n <input\n fInputText\n [(ngModel)]=\"newListName\"\n [placeholder]=\"'task.manager.list.name.placeholder' | translate\"\n />\n </div>\n <ng-template #footer>\n <div class=\"flex justify-end gap-2\">\n <button\n fButton\n severity=\"secondary\"\n (click)=\"showAddListDialog.set(false)\"\n >\n <span pButtonLabel>{{ 'shared.cancel' | translate }}</span>\n </button>\n <button fButton (click)=\"addList()\" [disabled]=\"isAddingList()\">\n @if (isAddingList()) {\n <ui-icon pButtonIcon name=\"spinner\" [spin]=\"true\"></ui-icon>\n }\n <span pButtonLabel>{{ 'shared.create' | translate }}</span>\n </button>\n </div>\n </ng-template>\n </f-dialog>\n\n <f-dialog\n [header]=\"'task.manager.board.edit' | translate\"\n [(visible)]=\"showEditBoardDialog\"\n [modal]=\"true\"\n [style]=\"{ width: '420px' }\"\n >\n <div class=\"flex flex-col gap-4 py-2\">\n <div class=\"flex flex-col gap-1\">\n <label class=\"text-sm font-medium\">\n {{ 'task.manager.board.name.label' | translate }}\n <span class=\"text-red-500\">*</span>\n </label>\n <input fInputText [(ngModel)]=\"editBoardName\" />\n </div>\n <div class=\"flex flex-col gap-1\">\n <label class=\"text-sm font-medium\">{{\n 'task.manager.board.description.label' | translate\n }}</label>\n <textarea\n fTextarea\n [(ngModel)]=\"editBoardDescription\"\n [rows]=\"3\"\n [placeholder]=\"\n 'task.manager.board.description.placeholder' | translate\n \"\n ></textarea>\n </div>\n <div class=\"flex flex-col gap-1\">\n <label class=\"text-sm font-medium\">{{\n 'task.manager.board.color.label' | translate\n }}</label>\n <div class=\"flex items-center gap-3\">\n <input\n type=\"color\"\n [(ngModel)]=\"editBoardColor\"\n class=\"w-10 h-10 rounded cursor-pointer border border-surface-300\"\n />\n <div class=\"flex gap-2 flex-wrap\">\n @for (color of boardColorPalette; track color) {\n <button\n type=\"button\"\n class=\"w-6 h-6 rounded-full border-2 transition-transform hover:scale-110\"\n [style.background-color]=\"color\"\n [class.border-surface-900]=\"editBoardColor === color\"\n [class.border-transparent]=\"editBoardColor !== color\"\n (click)=\"editBoardColor = color\"\n ></button>\n }\n </div>\n </div>\n </div>\n </div>\n <ng-template #footer>\n <div class=\"flex justify-end gap-2\">\n <button\n fButton\n severity=\"secondary\"\n (click)=\"showEditBoardDialog.set(false)\"\n >\n <span pButtonLabel>{{ 'shared.cancel' | translate }}</span>\n </button>\n <button\n fButton\n [disabled]=\"!editBoardName.trim() || isSavingBoard()\"\n (click)=\"saveBoard()\"\n >\n @if (isSavingBoard()) {\n <ui-icon pButtonIcon name=\"spinner\" [spin]=\"true\"></ui-icon>\n }\n <span pButtonLabel>{{ 'shared.save' | translate }}</span>\n </button>\n </div>\n </ng-template>\n </f-dialog>\n `,\n})\nexport class BoardViewPageComponent {\n protected readonly state = inject(TaskBoardStateService);\n private readonly taskApi = inject(TaskApiService);\n private readonly listApi = inject(TaskListApiService);\n private readonly confirmationService = inject(ConfirmationService);\n private readonly messageService = inject(MessageService);\n private readonly translateAdapter = inject(TranslateService, {\n optional: true,\n });\n private readonly destroyRef = inject(DestroyRef);\n\n private translate(\n key: string,\n vars?: Record<string, string | number>,\n ): string {\n return this.translateAdapter?.translate(key, vars) ?? key;\n }\n\n readonly boardId = input.required<string>();\n\n readonly viewMode = signal<ViewMode>('board');\n readonly showTaskForm = signal(false);\n readonly editingTask = signal<ITask | null>(null);\n readonly activeListId = signal('');\n readonly showAddListDialog = signal(false);\n readonly isAddingList = signal(false);\n readonly showLabelsDialog = signal(false);\n readonly isAddingLabel = signal(false);\n readonly showMembersDialog = signal(false);\n readonly isAddingMember = signal(false);\n\n readonly editingListId = signal<string | null>(null);\n readonly editingListNameValue = signal('');\n readonly showEditBoardDialog = signal(false);\n readonly isSavingBoard = signal(false);\n\n newListName = '';\n newLabelName = '';\n newLabelColor = BOARD_COLOR_PALETTE[0];\n selectedMemberUser: string | null = null;\n newMemberRole = 'MEMBER';\n editBoardName = '';\n editBoardDescription = '';\n editBoardColor = BOARD_COLOR_PALETTE[0];\n\n readonly boardColorPalette = BOARD_COLOR_PALETTE;\n\n readonly memberRoleOptions = [\n { labelKey: 'task.manager.member.role.admin', value: 'ADMIN' },\n { labelKey: 'task.manager.member.role.member', value: 'MEMBER' },\n { labelKey: 'task.manager.member.role.viewer', value: 'VIEWER' },\n ];\n\n readonly allTasksFlat = computed<ITaskRow[]>(() =>\n this.state.listsWithTasks().flatMap((list) =>\n list.tasks.map((task) => ({\n ...task,\n listName: list.name,\n listColor: list.color,\n })),\n ),\n );\n\n readonly listDropIds = computed(() =>\n this.state.listsWithTasks().map((l) => l.id),\n );\n\n constructor() {\n effect(() => {\n const id = this.boardId();\n untracked(() => this.state.openBoard(id));\n });\n this.destroyRef.onDestroy(() => this.state.closeBoard());\n }\n\n openAddTask(list: ITaskList): void {\n this.editingTask.set(null);\n this.activeListId.set(list.id);\n this.showTaskForm.set(true);\n }\n\n onTaskSaved(task: ITask): void {\n this.state.addTaskOptimistic(task);\n }\n\n onDeleteTask(task: ITask): void {\n this.confirmationService.confirm({\n message: this.translate('shared.confirm.delete.item', {\n name: task.title,\n }),\n header: this.translate('task.detail.delete'),\n icon: 'exclamation-triangle',\n acceptButtonStyleClass: 'p-button-danger',\n accept: async () => {\n try {\n await this.state.deleteTask(task.id);\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: this.translate('task.delete.success'),\n });\n } catch {}\n },\n });\n }\n\n onEditTask(task: ITask): void {\n this.editingTask.set(task);\n this.activeListId.set(task.listId);\n this.showTaskForm.set(true);\n this.state.selectTask(null);\n }\n\n getMemberName(assigneeId: string): string | null {\n return (\n this.state.members().find((m) => m.userId === assigneeId)?.userName ??\n null\n );\n }\n\n getMemberInitials(assigneeId: string): string {\n return memberInitials(this.getMemberName(assigneeId));\n }\n\n memberInitials(member: ITaskBoardMember): string {\n return memberInitials(member.userName);\n }\n\n memberColor(member: ITaskBoardMember): string {\n return memberColorFromId(member.userId);\n }\n\n memberColorById(userId: string): string {\n return memberColorFromId(userId);\n }\n\n roleBadgeClass(role: string): string {\n const map: Record<string, string> = {\n OWNER: 'text-primary-600 dark:text-primary-400 font-semibold',\n ADMIN: 'text-orange-600 dark:text-orange-400 font-semibold',\n MEMBER: 'text-surface-500 dark:text-surface-400',\n VIEWER: 'text-surface-400 dark:text-surface-500',\n };\n return map[role] ?? map['MEMBER'];\n }\n\n protected readonly prioritySeverity = taskPrioritySeverity;\n protected readonly isOverdue = isTaskOverdue;\n\n async onTaskDrop(event: CdkDragDrop<ITask[]>): Promise<void> {\n if (event.previousContainer === event.container) {\n moveItemInArray(\n event.container.data,\n event.previousIndex,\n event.currentIndex,\n );\n } else {\n transferArrayItem(\n event.previousContainer.data,\n event.container.data,\n event.previousIndex,\n event.currentIndex,\n );\n const task = event.container.data[event.currentIndex];\n await this.taskApi.moveTask({\n taskId: task.id,\n targetListId: event.container.id,\n position: event.currentIndex * 100,\n });\n }\n }\n\n async onListDrop(event: CdkDragDrop<ITaskListWithTasks[]>): Promise<void> {\n if (event.previousIndex === event.currentIndex) return;\n const lists = this.state.listsWithTasks().slice();\n moveItemInArray(lists, event.previousIndex, event.currentIndex);\n const orderedIds = lists.map((l) => l.id);\n await this.state.reorderLists(this.boardId(), orderedIds);\n }\n\n startRenameList(list: ITaskList): void {\n this.editingListId.set(list.id);\n this.editingListNameValue.set(list.name);\n }\n\n cancelRenameList(): void {\n this.editingListId.set(null);\n this.editingListNameValue.set('');\n }\n\n async saveRenameList(): Promise<void> {\n const id = this.editingListId();\n const name = this.editingListNameValue().trim();\n this.cancelRenameList();\n if (!id || !name) return;\n await this.state.renameList(id, name);\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: this.translate('task.list.update.success'),\n });\n }\n\n openEditBoardDialog(board: ITaskBoard): void {\n this.editBoardName = board.name;\n this.editBoardDescription = board.description ?? '';\n this.editBoardColor = board.color;\n this.showEditBoardDialog.set(true);\n }\n\n async saveBoard(): Promise<void> {\n const board = this.state.activeBoard();\n if (!board || !this.editBoardName.trim()) return;\n this.isSavingBoard.set(true);\n try {\n await this.state.updateBoard({\n id: board.id,\n name: this.editBoardName.trim(),\n description: this.editBoardDescription.trim() || undefined,\n color: this.editBoardColor,\n });\n this.showEditBoardDialog.set(false);\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: this.translate('task.board.update.success'),\n });\n } finally {\n this.isSavingBoard.set(false);\n }\n }\n\n async addLabel(): Promise<void> {\n if (!this.newLabelName.trim()) return;\n this.isAddingLabel.set(true);\n try {\n await this.state.addLabel(\n this.boardId(),\n this.newLabelName.trim(),\n this.newLabelColor,\n );\n this.newLabelName = '';\n this.newLabelColor = BOARD_COLOR_PALETTE[0];\n } finally {\n this.isAddingLabel.set(false);\n }\n }\n\n async removeLabel(labelId: string): Promise<void> {\n await this.state.deleteLabel(labelId);\n }\n\n async addMember(): Promise<void> {\n if (!this.selectedMemberUser) return;\n this.isAddingMember.set(true);\n try {\n await this.state.addMember(this.selectedMemberUser, this.newMemberRole);\n this.resetMemberForm();\n } finally {\n this.isAddingMember.set(false);\n }\n }\n\n resetMemberForm(): void {\n this.selectedMemberUser = null;\n this.newMemberRole = 'MEMBER';\n }\n\n async removeMember(userId: string): Promise<void> {\n await this.state.removeMember(userId);\n }\n\n async addList(): Promise<void> {\n if (!this.newListName.trim()) return;\n this.isAddingList.set(true);\n try {\n const position = this.state.lists().length * 100;\n await this.listApi.insert({\n boardId: this.boardId(),\n name: this.newListName,\n position,\n });\n await this.state.openBoard(this.boardId());\n this.showAddListDialog.set(false);\n this.newListName = '';\n } finally {\n this.isAddingList.set(false);\n }\n }\n}\n","export const TASK_MANAGER_MESSAGES = {\n // Board API messages (keys must match NestJS message-keys.ts)\n 'task.board.not.found': 'Board not found',\n 'task.board.create.success': 'Board created successfully',\n 'task.board.create.many.success': 'Boards created successfully',\n 'task.board.get.success': 'Board retrieved successfully',\n 'task.board.get.all.success': 'Boards retrieved successfully',\n 'task.board.update.success': 'Board updated successfully',\n 'task.board.update.many.success': 'Boards updated successfully',\n 'task.board.delete.success': 'Board deleted successfully',\n 'task.board.restore.success': 'Board restored successfully',\n 'task.board.member.added': 'Member added to board',\n 'task.board.member.removed': 'Member removed from board',\n 'task.board.member.not.found': 'Board member not found',\n 'task.board.member.already.exists': 'User is already a board member',\n 'task.board.member.get.all.success': 'Board members retrieved successfully',\n\n 'task.list.not.found': 'List not found',\n 'task.list.create.success': 'List created successfully',\n 'task.list.create.many.success': 'Lists created successfully',\n 'task.list.get.success': 'List retrieved successfully',\n 'task.list.get.all.success': 'Lists retrieved successfully',\n 'task.list.update.success': 'List updated successfully',\n 'task.list.update.many.success': 'Lists updated successfully',\n 'task.list.delete.success': 'List deleted successfully',\n 'task.list.restore.success': 'List restored successfully',\n 'task.list.reorder.success': 'Lists reordered successfully',\n\n 'task.not.found': 'Task not found',\n 'task.create.success': 'Task created successfully',\n 'task.create.many.success': 'Tasks created successfully',\n 'task.get.success': 'Task retrieved successfully',\n 'task.get.all.success': 'Tasks retrieved successfully',\n 'task.update.success': 'Task updated successfully',\n 'task.update.many.success': 'Tasks updated successfully',\n 'task.delete.success': 'Task deleted successfully',\n 'task.restore.success': 'Task restored successfully',\n 'task.move.success': 'Task moved successfully',\n 'task.assign.success': 'Task assigned successfully',\n 'task.assignee.not.board.member': 'Assignee is not a board member',\n\n 'task.label.not.found': 'Label not found',\n 'task.label.create.success': 'Label created successfully',\n 'task.label.create.many.success': 'Labels created successfully',\n 'task.label.get.success': 'Label retrieved successfully',\n 'task.label.get.all.success': 'Labels retrieved successfully',\n 'task.label.update.success': 'Label updated successfully',\n 'task.label.update.many.success': 'Labels updated successfully',\n 'task.label.delete.success': 'Label deleted successfully',\n 'task.label.restore.success': 'Label restored successfully',\n\n 'task.comment.not.found': 'Comment not found',\n 'task.comment.create.success': 'Comment added successfully',\n 'task.comment.create.many.success': 'Comments added successfully',\n 'task.comment.get.success': 'Comment retrieved successfully',\n 'task.comment.get.all.success': 'Comments retrieved successfully',\n 'task.comment.update.success': 'Comment updated successfully',\n 'task.comment.update.many.success': 'Comments updated successfully',\n 'task.comment.delete.success': 'Comment deleted successfully',\n 'task.comment.restore.success': 'Comment restored successfully',\n 'task.comment.forbidden': \"Cannot edit another user's comment\",\n\n 'task.manager.boards.title': 'Task Boards',\n 'task.manager.boards.subtitle': 'Manage and organize your project boards',\n 'task.manager.board.new': 'New Board',\n 'task.manager.board.name.placeholder': 'e.g. Product Backlog',\n 'task.manager.board.description.placeholder': 'Optional description',\n 'task.manager.board.color.label': 'Board Color',\n 'task.manager.board.empty': 'No boards yet',\n 'task.manager.board.empty.hint': 'Create your first board to get started',\n 'task.manager.board.members': 'Members',\n 'task.manager.board.lists': 'Lists',\n 'task.manager.board.tasks': 'Tasks',\n\n 'task.manager.board.add.list': 'Add List',\n 'task.manager.board.add.task': 'Add task',\n 'task.manager.board.drop.tasks.here': 'Drop tasks here',\n 'task.manager.board.list.empty':\n 'No lists yet. Click \"Add List\" to create one.',\n 'task.manager.list.new': 'New List',\n 'task.manager.list.name.label': 'List Name',\n 'task.manager.list.name.placeholder': 'e.g. In Progress',\n 'task.manager.list.rename': 'Rename List',\n\n 'task.manager.board.manage.members': 'Members',\n 'task.manager.member.manage.title': 'Manage Members',\n 'task.manager.member.add': 'Add Member',\n 'task.manager.member.no.members': 'No members yet.',\n 'task.manager.member.user.label': 'User',\n 'task.manager.member.user.placeholder': 'Search by name or email',\n 'task.manager.member.role.label': 'Role',\n 'task.manager.member.role.placeholder': 'Select role',\n 'task.manager.member.role.owner': 'Owner',\n 'task.manager.member.role.admin': 'Admin',\n 'task.manager.member.role.member': 'Member',\n 'task.manager.member.role.viewer': 'Viewer',\n\n 'task.manager.board.manage.labels': 'Labels',\n 'task.manager.label.manage.title': 'Manage Labels',\n 'task.manager.label.name.label': 'Label Name',\n 'task.manager.label.name.placeholder': 'e.g. Bug, Feature',\n 'task.manager.label.color.label': 'Color',\n 'task.manager.label.add': 'Add Label',\n 'task.manager.label.no.labels': 'No labels yet.',\n\n 'task.manager.board.edit': 'Edit Board',\n 'task.manager.board.name.label': 'Board Name',\n 'task.manager.board.description.label': 'Description',\n\n 'task.manager.view.board': 'Board',\n 'task.manager.view.list': 'List',\n\n 'task.manager.table.title': 'Title',\n 'task.manager.table.list': 'List',\n 'task.manager.table.priority': 'Priority',\n 'task.manager.table.assignee': 'Assignee',\n 'task.manager.table.due.date': 'Due Date',\n 'task.manager.table.empty': 'No tasks yet.',\n\n 'task.form.title.create': 'New Task',\n 'task.form.title.edit': 'Edit Task',\n 'task.form.title.label': 'Title',\n 'task.form.title.placeholder': 'Task title',\n 'task.form.description.placeholder': 'Add a description...',\n 'task.form.priority.label': 'Priority',\n 'task.form.priority.placeholder': 'Select priority',\n 'task.form.due.date.label': 'Due Date',\n 'task.form.due.date.placeholder': 'Pick a date',\n 'task.form.assignee.label': 'Assignee',\n 'task.form.assignee.placeholder': 'Assign to board member',\n 'task.form.labels.label': 'Labels',\n 'task.form.labels.placeholder': 'Select labels',\n\n 'task.priority.LOW': 'Low',\n 'task.priority.MEDIUM': 'Medium',\n 'task.priority.HIGH': 'High',\n 'task.priority.URGENT': 'Urgent',\n\n 'task.detail.description.empty': 'No description',\n 'task.detail.comments.label': 'Comments',\n 'task.detail.comments.empty': 'No comments yet',\n 'task.detail.comment.placeholder': 'Add a comment...',\n 'task.detail.due.label': 'Due',\n 'task.detail.assignees.label': 'Assignees',\n 'task.detail.edit': 'Edit task',\n 'task.detail.delete': 'Delete task',\n 'task.comment.reply': 'Reply',\n 'task.comment.reply.placeholder': 'Write a reply...',\n} as const;\n","import { Routes } from '@angular/router';\nimport { resolveTranslationModule, SHARED_MESSAGES } from '@flusys/ng-shared';\nimport { TASK_MANAGER_MESSAGES } from '../constants/messages';\n\nexport const TASK_MANAGER_ROUTES: Routes = [\n {\n path: '',\n resolve: {\n translations: resolveTranslationModule({\n modules: ['task-manager'],\n fallbackMessages: { ...TASK_MANAGER_MESSAGES, ...SHARED_MESSAGES },\n }),\n },\n loadComponent: () =>\n import('../pages/board-list-page/board-list-page.component').then(\n (m) => m.BoardListPageComponent,\n ),\n },\n {\n path: 'board/:boardId',\n resolve: {\n translations: resolveTranslationModule({\n modules: ['task-manager'],\n fallbackMessages: { ...TASK_MANAGER_MESSAGES, ...SHARED_MESSAGES },\n }),\n },\n loadComponent: () =>\n import('../pages/board-view-page/board-view-page.component').then(\n (m) => m.BoardViewPageComponent,\n ),\n },\n];\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i2","i3"],"mappings":"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"}
1
+ {"version":3,"file":"flusys-ng-task-manager.mjs","sources":["../../../projects/ng-task-manager/services/task-board-api.service.ts","../../../projects/ng-task-manager/services/task-api.service.ts","../../../projects/ng-task-manager/services/task-board-socket.service.ts","../../../projects/ng-task-manager/services/task-board-state.service.ts","../../../projects/ng-task-manager/utils/task-utils.ts","../../../projects/ng-task-manager/components/task-card/task-card.component.ts","../../../projects/ng-task-manager/components/task-form-dialog/task-form-dialog.component.ts","../../../projects/ng-task-manager/components/task-detail-panel/task-detail-panel.component.ts","../../../projects/ng-task-manager/pages/board-list-page/board-list-page.component.ts","../../../projects/ng-task-manager/pages/board-view-page/board-view-page.component.ts","../../../projects/ng-task-manager/constants/messages.ts","../../../projects/ng-task-manager/routes/task-manager.routes.ts","../../../projects/ng-task-manager/flusys-ng-task-manager.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport {\n ApiResourceService,\n IListResponse,\n IMessageResponse,\n ISingleResponse,\n} from '@flusys/ng-shared';\nimport { firstValueFrom } from 'rxjs';\nimport {\n ITaskBoard,\n ITaskBoardMember,\n IUpdateTaskBoardDto,\n} from '../interfaces/task.interface';\n\n@Injectable({ providedIn: 'root' })\nexport class TaskBoardApiService extends ApiResourceService<\n IUpdateTaskBoardDto,\n ITaskBoard\n> {\n constructor() {\n super('board', 'taskManager');\n }\n\n getMembers(boardId: string): Promise<IListResponse<ITaskBoardMember>> {\n return firstValueFrom(\n this.http.post<IListResponse<ITaskBoardMember>>(\n `${this.baseUrl}/get-members`,\n { boardId },\n ),\n );\n }\n\n addMember(\n boardId: string,\n userId: string,\n role = 'MEMBER',\n ): Promise<ISingleResponse<ITaskBoardMember>> {\n return firstValueFrom(\n this.http.post<ISingleResponse<ITaskBoardMember>>(\n `${this.baseUrl}/add-member`,\n { boardId, userId, role },\n ),\n );\n }\n\n removeMember(boardId: string, userId: string): Promise<IMessageResponse> {\n return firstValueFrom(\n this.http.post<IMessageResponse>(`${this.baseUrl}/remove-member`, {\n boardId,\n userId,\n }),\n );\n }\n}\n","import { Injectable } from '@angular/core';\nimport { ApiResourceService, IMessageResponse, ISingleResponse } from '@flusys/ng-shared';\nimport { firstValueFrom } from 'rxjs';\nimport {\n ICreateTaskCommentDto,\n ICreateTaskLabelDto,\n ICreateTaskListDto,\n ITask,\n ITaskComment,\n ITaskLabel,\n ITaskList,\n IMoveTaskDto,\n IReorderTaskListsDto,\n IUpdateTaskListDto,\n IUpdateTaskDto,\n} from '../interfaces/task.interface';\n\n@Injectable({ providedIn: 'root' })\nexport class TaskApiService extends ApiResourceService<IUpdateTaskDto, ITask> {\n constructor() {\n super('task', 'taskManager');\n }\n\n moveTask(dto: IMoveTaskDto): Promise<ISingleResponse<ITask>> {\n return firstValueFrom(\n this.http.post<ISingleResponse<ITask>>(`${this.baseUrl}/move`, dto),\n );\n }\n}\n\n@Injectable({ providedIn: 'root' })\nexport class TaskListApiService extends ApiResourceService<ICreateTaskListDto, ITaskList> {\n constructor() {\n super('list', 'taskManager');\n }\n\n updateList(dto: IUpdateTaskListDto): Promise<ISingleResponse<ITaskList>> {\n return firstValueFrom(\n this.http.post<ISingleResponse<ITaskList>>(`${this.baseUrl}/update`, dto),\n );\n }\n\n reorderLists(dto: IReorderTaskListsDto): Promise<IMessageResponse> {\n return firstValueFrom(\n this.http.post<IMessageResponse>(`${this.baseUrl}/reorder`, dto),\n );\n }\n}\n\n@Injectable({ providedIn: 'root' })\nexport class TaskLabelApiService extends ApiResourceService<ICreateTaskLabelDto, ITaskLabel> {\n constructor() {\n super('label', 'taskManager');\n }\n}\n\n@Injectable({ providedIn: 'root' })\nexport class TaskCommentApiService extends ApiResourceService<ICreateTaskCommentDto, ITaskComment> {\n constructor() {\n super('comment', 'taskManager');\n }\n}\n","import { inject, Injectable, signal } from '@angular/core';\nimport { Subject } from 'rxjs';\nimport { io, Socket } from 'socket.io-client';\nimport { APP_CONFIG } from '@flusys/ng-core';\nimport { IBoardSocketEvent } from '../interfaces/task.interface';\n\n@Injectable({ providedIn: 'root' })\nexport class TaskBoardSocketService {\n private socket: Socket | null = null;\n private readonly appConfig = inject(APP_CONFIG);\n\n private readonly _isConnected = signal(false);\n readonly isConnected = this._isConnected.asReadonly();\n\n private readonly boardEvent$ = new Subject<IBoardSocketEvent>();\n readonly onBoardEvent = this.boardEvent$.asObservable();\n\n connect(accessToken: string): void {\n if (this.socket?.connected) return;\n\n const baseUrl = this.getBaseUrl();\n this.socket = io(`${baseUrl}/task-boards`, {\n auth: { token: accessToken },\n transports: ['websocket', 'polling'],\n reconnection: true,\n reconnectionAttempts: 5,\n reconnectionDelay: 1000,\n });\n\n this.socket.on('connect', () => this._isConnected.set(true));\n this.socket.on('disconnect', (reason: string) => {\n this._isConnected.set(false);\n if (reason === 'io server disconnect') this.socket?.connect();\n });\n this.socket.on('connect_error', () => this._isConnected.set(false));\n this.socket.on('board:event', (event: IBoardSocketEvent) => this.boardEvent$.next(event));\n }\n\n joinBoard(boardId: string): void {\n this.socket?.emit('board:join', { boardId });\n }\n\n leaveBoard(boardId: string): void {\n this.socket?.emit('board:leave', { boardId });\n }\n\n disconnect(): void {\n this.socket?.disconnect();\n this.socket = null;\n this._isConnected.set(false);\n }\n\n private getBaseUrl(): string {\n const services = this.appConfig.services as Record<string, { socketUrl?: string }> | undefined;\n return services?.['taskManager']?.socketUrl ?? this.appConfig.apiBaseUrl;\n }\n}\n","import { computed, DestroyRef, inject, Injectable, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { IBoardSocketEvent, ITask, ITaskBoard, ITaskBoardMember, ITaskLabel, ITaskList, IUpdateTaskBoardDto } from '../interfaces/task.interface';\nimport { TaskApiService, TaskLabelApiService, TaskListApiService } from './task-api.service';\nimport { TaskBoardApiService } from './task-board-api.service';\nimport { TaskBoardSocketService } from './task-board-socket.service';\n\n@Injectable({ providedIn: 'root' })\nexport class TaskBoardStateService {\n private readonly boardApi = inject(TaskBoardApiService);\n private readonly taskApi = inject(TaskApiService);\n private readonly listApi = inject(TaskListApiService);\n private readonly labelApi = inject(TaskLabelApiService);\n private readonly socketService = inject(TaskBoardSocketService);\n private readonly destroyRef = inject(DestroyRef);\n\n private readonly _boards = signal<ITaskBoard[]>([]);\n private readonly _activeBoard = signal<ITaskBoard | null>(null);\n private readonly _lists = signal<ITaskList[]>([]);\n private readonly _tasks = signal<ITask[]>([]);\n private readonly _labels = signal<ITaskLabel[]>([]);\n private readonly _members = signal<ITaskBoardMember[]>([]);\n private readonly _selectedTask = signal<ITask | null>(null);\n private readonly _isLoading = signal(false);\n private readonly _isBoardLoading = signal(false);\n\n readonly boards = this._boards.asReadonly();\n readonly activeBoard = this._activeBoard.asReadonly();\n readonly lists = this._lists.asReadonly();\n readonly tasks = this._tasks.asReadonly();\n readonly labels = this._labels.asReadonly();\n readonly members = this._members.asReadonly();\n readonly selectedTask = this._selectedTask.asReadonly();\n readonly isLoading = this._isLoading.asReadonly();\n readonly isBoardLoading = this._isBoardLoading.asReadonly();\n\n readonly tasksByList = computed(() => {\n const map = new Map<string, ITask[]>();\n for (const task of this._tasks()) {\n const list = map.get(task.listId) ?? [];\n list.push(task);\n map.set(task.listId, list);\n }\n return map;\n });\n\n readonly listsWithTasks = computed(() =>\n this._lists()\n .slice()\n .sort((a, b) => a.position - b.position)\n .map((list) => ({\n ...list,\n tasks: (this.tasksByList().get(list.id) ?? []).slice().sort((a, b) => a.position - b.position),\n })),\n );\n\n readonly hasActiveBoard = computed(() => this._activeBoard() !== null);\n readonly isSocketConnected = this.socketService.isConnected;\n\n constructor() {\n this.socketService.onBoardEvent\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe((event) => this.handleBoardEvent(event));\n }\n\n async loadBoards(): Promise<void> {\n this._isLoading.set(true);\n try {\n const res = await this.boardApi.getAll({ sort: { createdAt: 'DESC' } });\n this._boards.set(res.data ?? []);\n } finally {\n this._isLoading.set(false);\n }\n }\n\n async openBoard(boardId: string): Promise<void> {\n this._isBoardLoading.set(true);\n try {\n const prevBoard = this._activeBoard();\n if (prevBoard) this.socketService.leaveBoard(prevBoard.id);\n\n const [boardRes, listsRes, tasksRes, labelsRes, membersRes] = await Promise.all([\n this.boardApi.findById(boardId),\n this.listApi.getAll({ filter: { boardId, isActive: true }, sort: { position: 'ASC' } }),\n this.taskApi.getAll({ filter: { boardId }, sort: { position: 'ASC' } }),\n this.labelApi.getAll({ filter: { boardId } }),\n this.boardApi.getMembers(boardId),\n ]);\n\n this._activeBoard.set(boardRes.data ?? null);\n this._lists.set(listsRes.data ?? []);\n this._tasks.set(tasksRes.data ?? []);\n this._labels.set(labelsRes.data ?? []);\n this._members.set(membersRes.data ?? []);\n\n this.socketService.joinBoard(boardId);\n } finally {\n this._isBoardLoading.set(false);\n }\n }\n\n closeBoard(): void {\n const board = this._activeBoard();\n if (board) this.socketService.leaveBoard(board.id);\n this._activeBoard.set(null);\n this._lists.set([]);\n this._tasks.set([]);\n this._labels.set([]);\n this._members.set([]);\n this._selectedTask.set(null);\n }\n\n selectTask(task: ITask | null): void {\n this._selectedTask.set(task);\n }\n\n async addLabel(boardId: string, name: string, color: string): Promise<void> {\n await this.labelApi.insert({ boardId, name, color });\n const res = await this.labelApi.getAll({ filter: { boardId } });\n this._labels.set(res.data ?? []);\n }\n\n async deleteLabel(labelId: string): Promise<void> {\n await this.labelApi.delete({ id: labelId, type: 'delete' });\n this._labels.update((list) => list.filter((l) => l.id !== labelId));\n }\n\n async addMember(userId: string, role = 'MEMBER'): Promise<void> {\n const board = this._activeBoard();\n if (!board) return;\n const res = await this.boardApi.addMember(board.id, userId, role);\n if (res.data) this._members.update((list) => [...list, res.data!]);\n }\n\n async removeMember(userId: string): Promise<void> {\n const board = this._activeBoard();\n if (!board) return;\n await this.boardApi.removeMember(board.id, userId);\n this._members.update((list) => list.filter((m) => m.userId !== userId));\n }\n\n async reorderLists(boardId: string, orderedIds: string[]): Promise<void> {\n const posMap = new Map(orderedIds.map((id, i) => [id, i * 100]));\n this._lists.update((list) =>\n list\n .map((l) => (posMap.has(l.id) ? { ...l, position: posMap.get(l.id)! } : l))\n .sort((a, b) => a.position - b.position),\n );\n await this.listApi.reorderLists({ boardId, orderedIds });\n }\n\n async renameList(listId: string, name: string): Promise<void> {\n await this.listApi.updateList({ id: listId, name });\n this._lists.update((list) => list.map((l) => (l.id === listId ? { ...l, name } : l)));\n }\n\n async updateBoard(dto: IUpdateTaskBoardDto): Promise<void> {\n await this.boardApi.update(dto);\n const id = dto.id;\n if (!id) return;\n this._activeBoard.update((b) => (b?.id === id ? { ...b, ...dto } : b));\n this._boards.update((list) => list.map((b) => (b.id === id ? { ...b, ...dto } : b)));\n }\n\n addTaskOptimistic(task: ITask): void {\n this._tasks.update((list) => {\n if (list.some((t) => t.id === task.id)) {\n return list.map((t) => (t.id === task.id ? { ...t, ...task } : t));\n }\n return [...list, task];\n });\n }\n\n async deleteTask(taskId: string): Promise<void> {\n await this.taskApi.delete({ id: taskId, type: 'delete' });\n this._tasks.update((list) => list.filter((t) => t.id !== taskId));\n if (this._selectedTask()?.id === taskId) this._selectedTask.set(null);\n }\n\n private handleBoardEvent(event: IBoardSocketEvent): void {\n switch (event.type) {\n case 'task:created': {\n const created = event.payload as ITask;\n this._tasks.update((list) => {\n if (list.some((t) => t.id === created.id)) return list;\n return [...list, created];\n });\n break;\n }\n\n case 'task:updated':\n case 'task:moved': {\n const updated = event.payload as ITask;\n this._tasks.update((list) =>\n list.map((t) => (t.id === updated.id ? { ...t, ...updated } : t)),\n );\n if (this._selectedTask()?.id === updated.id) {\n this._selectedTask.update((t) => (t ? { ...t, ...updated } : null));\n }\n break;\n }\n\n case 'task:deleted': {\n const deleted = event.payload as { id: string };\n this._tasks.update((list) => list.filter((t) => t.id !== deleted.id));\n if (this._selectedTask()?.id === deleted.id) this._selectedTask.set(null);\n break;\n }\n\n case 'list:created':\n this._lists.update((list) => [...list, event.payload as ITaskList]);\n break;\n\n case 'list:updated': {\n const updatedList = event.payload as ITaskList;\n this._lists.update((list) =>\n list.map((l) => (l.id === updatedList.id ? { ...l, ...updatedList } : l)),\n );\n break;\n }\n\n case 'list:deleted': {\n const deletedList = event.payload as { id: string };\n this._lists.update((list) => list.filter((l) => l.id !== deletedList.id));\n break;\n }\n\n case 'list:reordered': {\n const { orderedIds } = event.payload as { orderedIds: string[] };\n const posMap = new Map(orderedIds.map((id, i) => [id, i * 100]));\n this._lists.update((list) =>\n list\n .map((l) => (posMap.has(l.id) ? { ...l, position: posMap.get(l.id)! } : l))\n .sort((a, b) => a.position - b.position),\n );\n break;\n }\n }\n }\n}\n","export const MEMBER_COLOR_PALETTE = [\n '#6366f1',\n '#8b5cf6',\n '#ec4899',\n '#ef4444',\n '#f97316',\n '#eab308',\n '#22c55e',\n '#14b8a6',\n '#3b82f6',\n '#06b6d4',\n];\n\nexport const BOARD_COLOR_PALETTE = [\n ...MEMBER_COLOR_PALETTE,\n '#64748b',\n];\n\nexport function taskPrioritySeverity(\n priority: string,\n): 'success' | 'info' | 'warn' | 'danger' | 'secondary' {\n const map: Record<string, 'success' | 'info' | 'warn' | 'danger' | 'secondary'> = {\n LOW: 'secondary',\n MEDIUM: 'info',\n HIGH: 'warn',\n URGENT: 'danger',\n };\n return map[priority] ?? 'info';\n}\n\nexport function memberInitials(name: string | null | undefined): string {\n if (!name) return '?';\n return name\n .split(' ')\n .slice(0, 2)\n .map((n) => n[0]?.toUpperCase() ?? '')\n .join('');\n}\n\nexport function isTaskOverdue(dueDate: string): boolean {\n return new Date(dueDate) < new Date();\n}\n\nexport function memberColorFromId(userId: string): string {\n let hash = 0;\n for (let i = 0; i < userId.length; i++)\n hash = userId.charCodeAt(i) + ((hash << 5) - hash);\n return MEMBER_COLOR_PALETTE[Math.abs(hash) % MEMBER_COLOR_PALETTE.length];\n}\n","import { DatePipe } from '@angular/common';\nimport { Component, computed, input, output } from '@angular/core';\nimport { TranslatePipe } from '@flusys/ng-shared';\nimport { TooltipDirective, UiModule } from '@flusys/ng-ui';\nimport { ITask } from '../../interfaces/task.interface';\nimport {\n isTaskOverdue,\n memberColorFromId,\n memberInitials,\n taskPrioritySeverity,\n} from '../../utils/task-utils';\n\n@Component({\n selector: 'tm-task-card',\n imports: [DatePipe, TranslatePipe, TooltipDirective, UiModule],\n template: `\n <div\n class=\"task-card group relative rounded-border border border-surface p-3 cursor-pointer shadow-sm hover:shadow-md transition-shadow\"\n (click)=\"cardClick.emit(task())\"\n >\n <div class=\"absolute top-2 right-2 hidden group-hover:flex gap-0.5\">\n <button\n class=\"w-6 h-6 flex items-center justify-center rounded text-muted-color hover:text-primary-500 hover:bg-surface-hover transition-colors\"\n [fTooltip]=\"'shared.edit' | translate\"\n tooltipPosition=\"top\"\n (click)=\"$event.stopPropagation(); editClick.emit(task())\"\n >\n <ui-icon name=\"pencil\" class=\"text-xs\"></ui-icon>\n </button>\n <button\n class=\"w-6 h-6 flex items-center justify-center rounded text-muted-color hover:text-red-500 hover:bg-surface-hover transition-colors\"\n [fTooltip]=\"'shared.delete' | translate\"\n tooltipPosition=\"top\"\n (click)=\"$event.stopPropagation(); deleteClick.emit(task())\"\n >\n <ui-icon name=\"trash\" class=\"text-xs\"></ui-icon>\n </button>\n </div>\n\n @if (task().labels && task().labels!.length > 0) {\n <div class=\"flex flex-wrap gap-1 mb-2\">\n @for (label of task().labels; track label.id) {\n <span\n class=\"inline-block h-1.5 rounded-full w-8\"\n [style.background-color]=\"label.color\"\n [fTooltip]=\"label.name\"\n ></span>\n }\n </div>\n }\n\n <p class=\"text-sm font-semibold line-clamp-2 leading-snug pr-14\">\n {{ task().title }}\n </p>\n\n <div class=\"flex items-center justify-between gap-2 mt-auto pt-2\">\n <f-tag\n [value]=\"task().priority\"\n [severity]=\"prioritySeverity(task().priority)\"\n class=\"text-xs\"\n />\n\n @if (task().dueDate) {\n <span\n class=\"text-xs text-muted-color\"\n [class.text-red-500]=\"isOverdue(task().dueDate!)\"\n >\n {{ task().dueDate | date: 'MMM d' }}\n </span>\n }\n\n @if (visibleAssignees().length > 0) {\n <div class=\"flex items-center -space-x-1.5\">\n @for (a of visibleAssignees(); track a.userId) {\n <f-avatar\n shape=\"circle\"\n size=\"small\"\n [label]=\"initials(a.userName)\"\n [color]=\"memberColor(a.userId)\"\n styleClass=\"!ring-surface-card flex-shrink-0\"\n [fTooltip]=\"a.userName ?? ''\"\n />\n }\n @if (overflowCount() > 0) {\n <f-avatar\n shape=\"circle\"\n size=\"small\"\n [label]=\"'+' + overflowCount()\"\n styleClass=\"!bg-surface-200 dark:!bg-surface-700 !text-surface-600 dark:!text-surface-300 !ring-surface-card flex-shrink-0\"\n />\n }\n </div>\n }\n </div>\n </div>\n `,\n})\nexport class TaskCardComponent {\n readonly task = input.required<ITask>();\n readonly cardClick = output<ITask>();\n readonly editClick = output<ITask>();\n readonly deleteClick = output<ITask>();\n\n private readonly MAX_VISIBLE = 3;\n\n readonly visibleAssignees = computed(() =>\n (this.task().assignees ?? []).slice(0, this.MAX_VISIBLE),\n );\n\n readonly overflowCount = computed(() =>\n Math.max(0, (this.task().assignees ?? []).length - this.MAX_VISIBLE),\n );\n\n protected readonly prioritySeverity = taskPrioritySeverity;\n protected readonly initials = memberInitials;\n protected readonly isOverdue = isTaskOverdue;\n protected readonly memberColor = memberColorFromId;\n}\n","import {\n Component,\n effect,\n inject,\n input,\n model,\n output,\n signal,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { TranslatePipe } from '@flusys/ng-shared';\nimport { UiModule } from '@flusys/ng-ui';\nimport {\n ICreateTaskDto,\n ITask,\n ITaskBoardMember,\n ITaskLabel,\n IUpdateTaskDto,\n} from '../../interfaces/task.interface';\nimport { TaskApiService } from '../../services/task-api.service';\n\nconst PRIORITY_OPTIONS = [\n { labelKey: 'task.priority.LOW', value: 'LOW' },\n { labelKey: 'task.priority.MEDIUM', value: 'MEDIUM' },\n { labelKey: 'task.priority.HIGH', value: 'HIGH' },\n { labelKey: 'task.priority.URGENT', value: 'URGENT' },\n];\n\n@Component({\n selector: 'tm-task-form-dialog',\n imports: [UiModule, FormsModule, TranslatePipe],\n template: `\n <f-dialog\n [header]=\"\n (task() ? 'task.form.title.edit' : 'task.form.title.create') | translate\n \"\n [(visible)]=\"visible\"\n [modal]=\"true\"\n [style]=\"{ width: '540px' }\"\n (onHide)=\"onClose()\"\n >\n <div class=\"flex flex-col gap-4 py-3\">\n <div class=\"flex flex-col gap-1\">\n <label class=\"text-sm font-medium\"\n >{{ 'task.form.title.label' | translate }}\n <span class=\"text-red-500\">*</span></label\n >\n <input\n fInputText\n [(ngModel)]=\"title\"\n [placeholder]=\"'task.form.title.placeholder' | translate\"\n />\n </div>\n\n <div class=\"flex flex-col gap-1\">\n <label class=\"text-sm font-medium\">{{\n 'shared.description' | translate\n }}</label>\n <textarea\n fTextarea\n [(ngModel)]=\"description\"\n rows=\"3\"\n [placeholder]=\"'task.form.description.placeholder' | translate\"\n ></textarea>\n </div>\n\n <div class=\"grid grid-cols-2 gap-4\">\n <div class=\"flex flex-col gap-1\">\n <label class=\"text-sm font-medium\">{{\n 'task.form.priority.label' | translate\n }}</label>\n <f-select\n [(ngModel)]=\"priority\"\n [options]=\"priorityOptions\"\n optionLabel=\"labelKey\"\n optionValue=\"value\"\n [placeholder]=\"'task.form.priority.placeholder' | translate\"\n >\n <ng-template #selectedItem let-opt>\n {{ opt.labelKey | translate }}\n </ng-template>\n <ng-template #item let-opt>\n {{ opt.labelKey | translate }}\n </ng-template>\n </f-select>\n </div>\n\n <div class=\"flex flex-col gap-1\">\n <label class=\"text-sm font-medium\">{{\n 'task.form.due.date.label' | translate\n }}</label>\n <f-datepicker\n [(ngModel)]=\"dueDate\"\n [showClear]=\"true\"\n [placeholder]=\"'task.form.due.date.placeholder' | translate\"\n />\n </div>\n </div>\n\n <div class=\"flex flex-col gap-1\">\n <label class=\"text-sm font-medium\">{{\n 'task.form.assignee.label' | translate\n }}</label>\n <f-multiselect\n [(ngModel)]=\"selectedAssigneeIds\"\n [options]=\"members()\"\n optionLabel=\"userName\"\n optionValue=\"userId\"\n [placeholder]=\"'task.form.assignee.placeholder' | translate\"\n [showClear]=\"true\"\n />\n </div>\n\n <div class=\"flex flex-col gap-1\">\n <label class=\"text-sm font-medium\">{{\n 'task.form.labels.label' | translate\n }}</label>\n <f-multiselect\n [(ngModel)]=\"selectedLabelIds\"\n [options]=\"labels()\"\n optionLabel=\"name\"\n optionValue=\"id\"\n [placeholder]=\"'task.form.labels.placeholder' | translate\"\n />\n </div>\n </div>\n\n <ng-template #footer>\n <div class=\"flex justify-end gap-2 pt-1\">\n <button fButton severity=\"secondary\" (click)=\"onClose()\">\n <span pButtonLabel>{{ 'shared.cancel' | translate }}</span>\n </button>\n <button fButton (click)=\"onSave()\" [disabled]=\"isSaving()\">\n @if (isSaving()) {\n <ui-icon pButtonIcon name=\"spinner\" [spin]=\"true\"></ui-icon>\n }\n <span pButtonLabel>{{ 'shared.save' | translate }}</span>\n </button>\n </div>\n </ng-template>\n </f-dialog>\n `,\n})\nexport class TaskFormDialogComponent {\n private readonly taskApi = inject(TaskApiService);\n\n readonly visible = model(false);\n readonly task = input<ITask | null>(null);\n readonly boardId = input.required<string>();\n readonly listId = input.required<string>();\n readonly members = input<ITaskBoardMember[]>([]);\n readonly labels = input<ITaskLabel[]>([]);\n readonly saved = output<ITask>();\n\n readonly isSaving = signal(false);\n readonly priorityOptions = PRIORITY_OPTIONS;\n\n title = '';\n description = '';\n priority = 'MEDIUM';\n dueDate: Date | null = null;\n selectedAssigneeIds: string[] = [];\n selectedLabelIds: string[] = [];\n\n constructor() {\n effect(() => {\n const t = this.task();\n if (t) {\n this.title = t.title;\n this.description = t.description ?? '';\n this.priority = t.priority;\n this.dueDate = t.dueDate ? new Date(t.dueDate) : null;\n this.selectedAssigneeIds = t.assignees?.map((a) => a.userId) ?? [];\n this.selectedLabelIds = t.labelIds ?? [];\n } else {\n this.reset();\n }\n });\n }\n\n async onSave(): Promise<void> {\n if (!this.title.trim()) return;\n this.isSaving.set(true);\n try {\n const dueDateStr = this.dueDate\n ? this.dueDate.toISOString().slice(0, 10)\n : undefined;\n const existing = this.task();\n const priority = this.priority as ICreateTaskDto['priority'];\n let result;\n\n if (existing) {\n const dto: IUpdateTaskDto = {\n id: existing.id,\n title: this.title,\n description: this.description || undefined,\n priority,\n dueDate: dueDateStr,\n assigneeIds: this.selectedAssigneeIds,\n labelIds: this.selectedLabelIds,\n };\n result = await this.taskApi.update(dto);\n } else {\n const dto: ICreateTaskDto = {\n boardId: this.boardId(),\n listId: this.listId(),\n title: this.title,\n description: this.description || undefined,\n priority,\n dueDate: dueDateStr,\n assigneeIds: this.selectedAssigneeIds,\n labelIds: this.selectedLabelIds,\n };\n result = await this.taskApi.insert(dto);\n }\n\n if (result.data) this.saved.emit(result.data);\n this.visible.set(false);\n } finally {\n this.isSaving.set(false);\n }\n }\n\n onClose(): void {\n this.visible.set(false);\n this.reset();\n }\n\n private reset(): void {\n this.title = '';\n this.description = '';\n this.priority = 'MEDIUM';\n this.dueDate = null;\n this.selectedAssigneeIds = [];\n this.selectedLabelIds = [];\n }\n}\n","import { DatePipe } from '@angular/common';\nimport {\n Component,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { TranslatePipe } from '@flusys/ng-shared';\nimport { UiModule } from '@flusys/ng-ui';\nimport { ITask, ITaskComment } from '../../interfaces/task.interface';\nimport { TaskCommentApiService } from '../../services/task-api.service';\nimport { TaskBoardStateService } from '../../services/task-board-state.service';\nimport { memberInitials, taskPrioritySeverity } from '../../utils/task-utils';\n\n@Component({\n selector: 'tm-task-detail-panel',\n imports: [UiModule, DatePipe,\n FormsModule,\n TranslatePipe,],\n template: `\n <f-drawer\n [visible]=\"!!task()\"\n position=\"right\"\n [style]=\"{ width: '500px' }\"\n [header]=\"task()?.title ?? ''\"\n (onHide)=\"closePanel.emit()\"\n >\n @if (task(); as t) {\n <div class=\"flex flex-col gap-6 h-full overflow-y-auto pb-4\">\n <div class=\"flex items-center justify-end gap-1\">\n <button\n fButton\n severity=\"secondary\"\n size=\"small\"\n [text]=\"true\"\n [fTooltip]=\"'task.detail.edit' | translate\"\n tooltipPosition=\"left\"\n (click)=\"editTask.emit(t)\"\n >\n <ui-icon pButtonIcon name=\"pencil\"></ui-icon>\n </button>\n <button\n fButton\n severity=\"danger\"\n size=\"small\"\n [text]=\"true\"\n [fTooltip]=\"'task.detail.delete' | translate\"\n tooltipPosition=\"left\"\n (click)=\"deleteTask(t.id)\"\n [disabled]=\"isDeleting()\"\n >\n @if (isDeleting()) {\n <ui-icon pButtonIcon name=\"spinner\" [spin]=\"true\"></ui-icon>\n } @else {\n <ui-icon pButtonIcon name=\"trash\"></ui-icon>\n }\n </button>\n </div>\n\n <div class=\"flex items-center gap-3\">\n <f-tag\n [value]=\"t.priority\"\n [severity]=\"prioritySeverity(t.priority)\"\n />\n @if (t.dueDate) {\n <span class=\"text-sm text-muted-color\">\n {{ 'task.detail.due.label' | translate }}:\n {{ t.dueDate | date: 'mediumDate' }}\n </span>\n }\n </div>\n\n @if (assigneeMembers().length > 0) {\n <div>\n <h4 class=\"text-sm font-semibold mb-2\">\n {{ 'task.detail.assignees.label' | translate }}\n </h4>\n <div class=\"flex flex-wrap gap-2\">\n @for (member of assigneeMembers(); track member.userId) {\n <div class=\"flex items-center gap-2 px-2 py-1 rounded-full \">\n <f-avatar\n shape=\"circle\"\n size=\"small\"\n [label]=\"initials(member.userName)\"\n styleClass=\"!bg-primary-100 dark:!bg-primary-900 !text-primary-700 dark:!text-primary-300\"\n />\n <span class=\"text-sm\">{{ member.userName }}</span>\n </div>\n }\n </div>\n </div>\n }\n\n <div>\n <h4 class=\"text-sm font-semibold mb-2\">\n {{ 'shared.description' | translate }}\n </h4>\n <p class=\"text-sm text-color whitespace-pre-wrap\">\n {{\n t.description || ('task.detail.description.empty' | translate)\n }}\n </p>\n </div>\n\n <div class=\"flex flex-col gap-1\">\n <h4 class=\"text-sm font-semibold mb-1\">\n {{ 'task.detail.comments.label' | translate }} ({{\n rootComments().length\n }})\n </h4>\n\n @for (comment of rootComments(); track comment.id) {\n <div\n class=\"group flex flex-col gap-1 py-2 border-b border-surface last:border-0\"\n >\n <div class=\"flex items-center justify-between\">\n <span class=\"text-xs text-muted-color\">{{\n comment.createdAt | date: 'MMM d, y, h:mm a'\n }}</span>\n <button\n fButton\n size=\"small\"\n [text]=\"true\"\n severity=\"secondary\"\n class=\"opacity-0 group-hover:opacity-100 transition-opacity !py-0.5 !px-1.5 text-xs\"\n (click)=\"toggleReply(comment.id)\"\n >\n <ui-icon pButtonIcon name=\"reply\"></ui-icon>\n <span pButtonLabel>{{ 'task.comment.reply' | translate }}</span>\n </button>\n </div>\n <p class=\"text-sm\">{{ comment.content }}</p>\n\n @if (repliesFor(comment.id).length > 0) {\n <div\n class=\"mt-1 pl-3 border-l-2 border-surface flex flex-col gap-2\"\n >\n @for (reply of repliesFor(comment.id); track reply.id) {\n <div class=\"flex flex-col gap-0.5\">\n <span class=\"text-xs text-muted-color\">{{\n reply.createdAt | date: 'MMM d, y, h:mm a'\n }}</span>\n <p class=\"text-sm\">{{ reply.content }}</p>\n </div>\n }\n </div>\n }\n\n @if (replyingToId() === comment.id) {\n <div\n class=\"mt-2 pl-3 border-l-2 border-primary-300 dark:border-primary-700 flex gap-2\"\n >\n <textarea\n fTextarea\n [(ngModel)]=\"replyText\"\n rows=\"2\"\n [placeholder]=\"\n 'task.comment.reply.placeholder' | translate\n \"\n class=\"flex-1 resize-none text-sm\"\n autoResize=\"true\"\n ></textarea>\n <div class=\"flex flex-col gap-1\">\n <button\n fButton\n size=\"small\"\n [disabled]=\"!replyText.trim() || isSendingReply()\"\n (click)=\"submitReply(t.id, comment.id)\"\n >\n @if (isSendingReply()) {\n <ui-icon pButtonIcon name=\"spinner\" [spin]=\"true\"></ui-icon>\n } @else {\n <ui-icon pButtonIcon name=\"send\"></ui-icon>\n }\n </button>\n <button\n fButton\n size=\"small\"\n severity=\"secondary\"\n [text]=\"true\"\n (click)=\"cancelReply()\"\n >\n <ui-icon pButtonIcon name=\"times\"></ui-icon>\n </button>\n </div>\n </div>\n }\n </div>\n }\n\n @if (rootComments().length === 0) {\n <p class=\"text-sm text-muted-color py-2\">\n {{ 'task.detail.comments.empty' | translate }}\n </p>\n }\n\n <div class=\"flex gap-2 mt-3\">\n <textarea\n fTextarea\n [(ngModel)]=\"newComment\"\n rows=\"2\"\n [placeholder]=\"'task.detail.comment.placeholder' | translate\"\n class=\"flex-1 resize-none\"\n ></textarea>\n <button\n fButton\n [disabled]=\"!newComment.trim() || isSendingComment()\"\n (click)=\"addComment(t.id)\"\n >\n @if (isSendingComment()) {\n <ui-icon pButtonIcon name=\"spinner\" [spin]=\"true\"></ui-icon>\n } @else {\n <ui-icon pButtonIcon name=\"send\"></ui-icon>\n }\n </button>\n </div>\n </div>\n </div>\n }\n </f-drawer>\n `,\n})\nexport class TaskDetailPanelComponent {\n private readonly commentApi = inject(TaskCommentApiService);\n private readonly state = inject(TaskBoardStateService);\n\n readonly task = input<ITask | null>(null);\n\n readonly closePanel = output<void>();\n readonly editTask = output<ITask>();\n\n readonly comments = signal<ITaskComment[]>([]);\n readonly isSendingComment = signal(false);\n readonly isSendingReply = signal(false);\n readonly replyingToId = signal<string | null>(null);\n readonly isDeleting = signal(false);\n\n newComment = '';\n replyText = '';\n\n readonly assigneeMembers = computed(() => this.task()?.assignees ?? []);\n\n readonly rootComments = computed(() =>\n this.comments().filter((c) => !c.parentCommentId),\n );\n\n repliesFor(parentId: string): ITaskComment[] {\n return this.comments().filter((c) => c.parentCommentId === parentId);\n }\n\n constructor() {\n effect(() => {\n const t = this.task();\n if (t) this.loadComments(t.id);\n else {\n this.comments.set([]);\n this.replyingToId.set(null);\n }\n });\n }\n\n toggleReply(commentId: string): void {\n if (this.replyingToId() === commentId) {\n this.cancelReply();\n } else {\n this.replyingToId.set(commentId);\n this.replyText = '';\n }\n }\n\n cancelReply(): void {\n this.replyingToId.set(null);\n this.replyText = '';\n }\n\n async deleteTask(taskId: string): Promise<void> {\n this.isDeleting.set(true);\n try {\n await this.state.deleteTask(taskId);\n this.closePanel.emit();\n } finally {\n this.isDeleting.set(false);\n }\n }\n\n protected readonly prioritySeverity = taskPrioritySeverity;\n protected readonly initials = memberInitials;\n\n private async loadComments(taskId: string): Promise<void> {\n const res = await this.commentApi.getAll({ filter: { taskId } });\n this.comments.set(res.data ?? []);\n }\n\n async addComment(taskId: string): Promise<void> {\n if (!this.newComment.trim()) return;\n this.isSendingComment.set(true);\n try {\n const res = await this.commentApi.insert({\n taskId,\n content: this.newComment,\n });\n if (res.data) this.comments.update((list) => [...list, res.data!]);\n this.newComment = '';\n } finally {\n this.isSendingComment.set(false);\n }\n }\n\n async submitReply(taskId: string, parentCommentId: string): Promise<void> {\n if (!this.replyText.trim()) return;\n this.isSendingReply.set(true);\n try {\n const res = await this.commentApi.insert({\n taskId,\n content: this.replyText,\n parentCommentId,\n });\n if (res.data) this.comments.update((list) => [...list, res.data!]);\n this.cancelReply();\n } finally {\n this.isSendingReply.set(false);\n }\n }\n}\n","import { Component, inject, signal } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { AngularModule, TranslatePipe } from '@flusys/ng-shared';\nimport { TaskBoardApiService } from '../../services/task-board-api.service';\nimport { TaskBoardStateService } from '../../services/task-board-state.service';\nimport { BOARD_COLOR_PALETTE } from '../../utils/task-utils';\nimport { UiModule } from '@flusys/ng-ui';\n\n@Component({\n selector: 'tm-board-list-page',\n imports: [AngularModule, UiModule, TranslatePipe],\n template: `\n <div class=\"p-2 sm:p-4\">\n <div\n class=\"flex flex-col sm:flex-row justify-between items-start sm:items-center gap-3 mb-4\"\n >\n <div>\n <h1 class=\"text-xl sm:text-2xl font-bold m-0\">\n {{ 'task.manager.boards.title' | translate }}\n </h1>\n <p class=\"text-muted-color mt-1 text-sm sm:text-base\">\n {{ 'task.manager.boards.subtitle' | translate }}\n </p>\n </div>\n <button\n fButton\n (click)=\"showCreateDialog.set(true)\"\n >\n <ui-icon pButtonIcon name=\"plus\"></ui-icon>\n <span pButtonLabel>{{ 'task.manager.board.new' | translate }}</span>\n </button>\n </div>\n\n @if (state.isLoading()) {\n <div class=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4\">\n @for (i of [1, 2, 3, 4, 5, 6]; track i) {\n <div class=\"card !p-0 overflow-hidden\">\n <f-skeleton height=\"4px\" borderRadius=\"0\" />\n <div class=\"p-5\">\n <f-skeleton height=\"18px\" width=\"60%\" class=\"mb-3\" />\n <f-skeleton height=\"13px\" class=\"mb-1\" />\n <f-skeleton height=\"13px\" width=\"70%\" class=\"mb-5\" />\n <div class=\"flex gap-5 pt-4 border-t border-surface\">\n <f-skeleton height=\"14px\" width=\"55px\" />\n <f-skeleton height=\"14px\" width=\"45px\" />\n <f-skeleton height=\"14px\" width=\"50px\" />\n </div>\n <f-skeleton height=\"11px\" width=\"100px\" class=\"mt-2\" />\n </div>\n </div>\n }\n </div>\n } @else if (state.boards().length === 0) {\n <div\n class=\"flex flex-col items-center justify-center py-20 text-muted-color\"\n >\n <span\n class=\"w-16 h-16 rounded-2xl border-2 border-dashed border-surface flex items-center justify-center mb-4\"\n >\n <ui-icon name=\"th-large\" class=\"text-2xl text-muted-color\"></ui-icon>\n </span>\n <p class=\"text-base font-semibold mb-1\">\n {{ 'task.manager.board.empty' | translate }}\n </p>\n <p class=\"text-sm text-muted-color mb-5\">\n {{ 'task.manager.board.empty.hint' | translate }}\n </p>\n <button\n fButton\n size=\"small\"\n (click)=\"showCreateDialog.set(true)\"\n >\n <ui-icon pButtonIcon name=\"plus\"></ui-icon>\n <span pButtonLabel>{{ 'task.manager.board.new' | translate }}</span>\n </button>\n </div>\n } @else {\n <div class=\"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4\">\n @for (board of state.boards(); track board.id) {\n <div\n class=\"card !p-0 cursor-pointer overflow-hidden group hover:shadow-lg transition-all duration-200\"\n (click)=\"openBoard(board.id)\"\n >\n <div class=\"h-1\" [style.background-color]=\"board.color\"></div>\n\n <div class=\"p-5\">\n <div class=\"flex items-start justify-between gap-3 mb-2\">\n <div class=\"flex items-center gap-2 min-w-0\">\n <h3\n class=\"font-semibold text-base m-0 truncate group-hover:text-primary-500 transition-colors duration-150\"\n >\n {{ board.name }}\n </h3>\n </div>\n <ui-icon name=\"arrow-right\" class=\"text-xs text-muted-color group-hover:text-primary-500 group-hover:translate-x-0.5 transition-all duration-150 flex-shrink-0 mt-1\"></ui-icon>\n </div>\n\n <p\n class=\"text-sm text-muted-color line-clamp-2 pl-[18px] mb-0 min-h-[40px]\"\n >\n {{ board.description || '' }}\n </p>\n\n <div\n class=\"border-t border-surface mt-4 pt-4 space-y-2.5\"\n >\n <div class=\"flex items-center gap-4\">\n <span class=\"flex items-center gap-1.5\">\n <ui-icon name=\"users\" class=\"text-[11px] text-muted-color\"></ui-icon>\n <span class=\"text-sm font-semibold\">{{\n board.totalMembers ?? 0\n }}</span>\n <span class=\"text-xs text-muted-color\">{{\n 'task.manager.board.members' | translate\n }}</span>\n </span>\n <span\n class=\"w-px h-3 bg-surface-200 dark:bg-surface-600\"\n ></span>\n <span class=\"flex items-center gap-1.5\">\n <ui-icon name=\"list\" class=\"text-[11px] text-muted-color\"></ui-icon>\n <span class=\"text-sm font-semibold\">{{\n board.totalLists ?? 0\n }}</span>\n <span class=\"text-xs text-muted-color\">{{\n 'task.manager.board.lists' | translate\n }}</span>\n </span>\n <span\n class=\"w-px h-3 bg-surface-200 dark:bg-surface-600\"\n ></span>\n <span class=\"flex items-center gap-1.5\">\n <ui-icon name=\"check-square\" class=\"text-[11px] text-muted-color\"></ui-icon>\n <span class=\"text-sm font-semibold\">{{\n board.totalTasks ?? 0\n }}</span>\n <span class=\"text-xs text-muted-color\">{{\n 'task.manager.board.tasks' | translate\n }}</span>\n </span>\n </div>\n <div\n class=\"flex items-center gap-1.5 text-xs text-muted-color\"\n >\n <ui-icon name=\"clock\" class=\"text-[10px]\"></ui-icon>\n <span>{{ board.createdAt | date: 'MMM d, yyyy' }}</span>\n </div>\n </div>\n </div>\n </div>\n }\n </div>\n }\n </div>\n\n <f-dialog\n [header]=\"'task.manager.board.new' | translate\"\n [(visible)]=\"showCreateDialog\"\n [modal]=\"true\"\n [style]=\"{ width: '440px' }\"\n >\n <div class=\"flex flex-col gap-4 py-2\">\n <div class=\"flex flex-col gap-1\">\n <label class=\"text-sm font-medium\"\n >{{ 'shared.name' | translate }}\n <span class=\"text-red-500\">*</span></label\n >\n <input\n fInputText\n [(ngModel)]=\"newBoardName\"\n [placeholder]=\"'task.manager.board.name.placeholder' | translate\"\n />\n </div>\n <div class=\"flex flex-col gap-1\">\n <label class=\"text-sm font-medium\">{{\n 'shared.description' | translate\n }}</label>\n <textarea\n fTextarea\n [(ngModel)]=\"newBoardDescription\"\n rows=\"2\"\n [placeholder]=\"\n 'task.manager.board.description.placeholder' | translate\n \"\n ></textarea>\n </div>\n <div class=\"flex flex-col gap-2\">\n <label class=\"text-sm font-medium\">{{\n 'task.manager.board.color.label' | translate\n }}</label>\n <div class=\"flex flex-wrap gap-2\">\n @for (c of boardColors; track c) {\n <button\n type=\"button\"\n class=\"w-8 h-8 rounded-full border-2 transition-all hover:scale-110 focus:outline-none flex items-center justify-center\"\n [style.background-color]=\"c\"\n [class.ring-2]=\"newBoardColor === c\"\n [class.ring-offset-2]=\"newBoardColor === c\"\n [class.ring-surface-900]=\"newBoardColor === c\"\n [class.dark:ring-surface-0]=\"newBoardColor === c\"\n [fTooltip]=\"c\"\n (click)=\"newBoardColor = c\"\n >\n @if (newBoardColor === c) {\n <ui-icon name=\"check\" class=\"text-white text-xs\"></ui-icon>\n }\n </button>\n }\n </div>\n <div class=\"flex items-center gap-2 mt-1\">\n <span\n class=\"w-8 h-8 rounded-full border border-surface flex-shrink-0\"\n [style.background-color]=\"newBoardColor\"\n ></span>\n <span class=\"text-sm text-muted-color font-mono\">{{\n newBoardColor\n }}</span>\n </div>\n </div>\n </div>\n\n <ng-template #footer>\n <div class=\"flex justify-end gap-2\">\n <button\n fButton\n severity=\"secondary\"\n (click)=\"closeCreateDialog()\"\n >\n <span pButtonLabel>{{ 'shared.cancel' | translate }}</span>\n </button>\n <button\n fButton\n (click)=\"createBoard()\"\n [disabled]=\"isCreating()\"\n >\n @if (isCreating()) {\n <ui-icon pButtonIcon name=\"spinner\" [spin]=\"true\"></ui-icon>\n }\n <span pButtonLabel>{{ 'shared.create' | translate }}</span>\n </button>\n </div>\n </ng-template>\n </f-dialog>\n `,\n})\nexport class BoardListPageComponent {\n protected readonly state = inject(TaskBoardStateService);\n private readonly boardApi = inject(TaskBoardApiService);\n private readonly router = inject(Router);\n\n readonly showCreateDialog = signal(false);\n readonly isCreating = signal(false);\n newBoardName = '';\n newBoardDescription = '';\n newBoardColor = BOARD_COLOR_PALETTE[0];\n readonly boardColors = BOARD_COLOR_PALETTE;\n\n constructor() {\n this.state.loadBoards();\n }\n\n openBoard(boardId: string): void {\n this.router.navigate(['/task-manager/board', boardId]);\n }\n\n closeCreateDialog(): void {\n this.showCreateDialog.set(false);\n this.newBoardName = '';\n this.newBoardDescription = '';\n this.newBoardColor = BOARD_COLOR_PALETTE[0];\n }\n\n async createBoard(): Promise<void> {\n if (!this.newBoardName.trim()) return;\n this.isCreating.set(true);\n try {\n await this.boardApi.insert({\n name: this.newBoardName,\n description: this.newBoardDescription || undefined,\n color: this.newBoardColor,\n });\n await this.state.loadBoards();\n this.closeCreateDialog();\n } finally {\n this.isCreating.set(false);\n }\n }\n}\n","import {\n CdkDragDrop,\n DragDropModule,\n moveItemInArray,\n transferArrayItem,\n} from '@angular/cdk/drag-drop';\nimport {\n Component,\n computed,\n DestroyRef,\n effect,\n inject,\n input,\n signal,\n untracked,\n} from '@angular/core';\nimport {\n AngularModule,\n TranslatePipe,\n TranslateService,\n UserSelectComponent,\n} from '@flusys/ng-shared';\nimport { ConfirmationService, MessageService, UiModule } from '@flusys/ng-ui';\nimport { TaskCardComponent } from '../../components/task-card/task-card.component';\nimport { TaskDetailPanelComponent } from '../../components/task-detail-panel/task-detail-panel.component';\nimport { TaskFormDialogComponent } from '../../components/task-form-dialog/task-form-dialog.component';\nimport {\n ITask,\n ITaskBoard,\n ITaskBoardMember,\n ITaskList,\n} from '../../interfaces/task.interface';\nimport {\n TaskApiService,\n TaskListApiService,\n} from '../../services/task-api.service';\nimport { TaskBoardStateService } from '../../services/task-board-state.service';\nimport {\n BOARD_COLOR_PALETTE,\n isTaskOverdue,\n memberColorFromId,\n memberInitials,\n taskPrioritySeverity,\n} from '../../utils/task-utils';\n\ntype ViewMode = 'board' | 'list';\ntype ITaskListWithTasks = ITaskList & { tasks: ITask[] };\n\ninterface ITaskRow extends ITask {\n listName: string;\n listColor: string;\n}\n\n@Component({\n selector: 'tm-board-view-page',\n imports: [\n UiModule,\n DragDropModule,\n AngularModule,\n TaskCardComponent,\n TaskFormDialogComponent,\n TaskDetailPanelComponent,\n TranslatePipe,\n UserSelectComponent,\n ],\n template: `\n <div class=\"flex flex-col h-full\">\n <div class=\"flex flex-col\">\n <div class=\"flex items-center justify-between px-5 py-2.5 gap-4\">\n @if (state.activeBoard(); as board) {\n <div class=\"flex items-center gap-2.5 min-w-0 flex-1 group\">\n <div class=\"flex flex-col min-w-0\">\n <div class=\"flex items-center gap-1.5 min-w-0\">\n <h1\n class=\"text-base font-bold text-surface-900 dark:text-surface-0 truncate leading-snug\"\n >\n {{ board.name }}\n </h1>\n <button\n fButton\n [text]=\"true\"\n size=\"small\"\n severity=\"secondary\"\n class=\"!w-6 !h-6 flex-shrink-0 opacity-0 group-hover:opacity-100 transition-opacity\"\n [fTooltip]=\"'task.manager.board.edit' | translate\"\n tooltipPosition=\"bottom\"\n (click)=\"openEditBoardDialog(board)\"\n >\n <ui-icon pButtonIcon name=\"pencil\"></ui-icon>\n </button>\n </div>\n @if (board.description) {\n <span\n class=\"text-xs text-muted-color truncate max-w-sm hidden md:block leading-snug\"\n >\n {{ board.description }}\n </span>\n }\n </div>\n </div>\n }\n\n <div class=\"flex items-center gap-1.5 flex-shrink-0\">\n @if (state.members().length > 0) {\n <div\n class=\"flex items-center -space-x-2 cursor-pointer mr-1\"\n (click)=\"showMembersDialog.set(true)\"\n [fTooltip]=\"'task.manager.board.manage.members' | translate\"\n tooltipPosition=\"bottom\"\n >\n @for (member of state.members().slice(0, 4); track member.id) {\n <f-avatar\n shape=\"circle\"\n size=\"small\"\n [label]=\"memberInitials(member)\"\n [color]=\"memberColor(member)\"\n styleClass=\"!border-2 !border-surface-card ring-1 ring-surface flex-shrink-0\"\n />\n }\n @if (state.members().length > 4) {\n <f-avatar\n shape=\"circle\"\n size=\"small\"\n [label]=\"'+' + (state.members().length - 4)\"\n styleClass=\"!border-2 !border-surface-card !bg-surface-200 dark:!bg-surface-700 !text-surface-600 dark:!text-surface-300 flex-shrink-0\"\n />\n }\n </div>\n }\n\n <div\n class=\"h-5 w-px bg-surface-300 dark:bg-surface-600 mx-0.5\"\n ></div>\n\n <div\n class=\"flex rounded-border overflow-hidden border border-surface\"\n >\n <button\n fButton\n [fTooltip]=\"'task.manager.view.board' | translate\"\n tooltipPosition=\"bottom\"\n size=\"small\"\n [severity]=\"viewMode() === 'board' ? 'primary' : 'secondary'\"\n [outlined]=\"viewMode() !== 'board'\"\n class=\"!rounded-none !border-0\"\n (click)=\"viewMode.set('board')\"\n >\n <ui-icon pButtonIcon name=\"th-large\"></ui-icon>\n </button>\n <button\n fButton\n [fTooltip]=\"'task.manager.view.list' | translate\"\n tooltipPosition=\"bottom\"\n size=\"small\"\n [severity]=\"viewMode() === 'list' ? 'primary' : 'secondary'\"\n [outlined]=\"viewMode() !== 'list'\"\n class=\"!rounded-none !border-0\"\n (click)=\"viewMode.set('list')\"\n >\n <ui-icon pButtonIcon name=\"list\"></ui-icon>\n </button>\n </div>\n\n <div\n class=\"h-5 w-px bg-surface-300 dark:bg-surface-600 mx-0.5\"\n ></div>\n\n <button\n fButton\n [text]=\"true\"\n severity=\"secondary\"\n size=\"small\"\n class=\"!w-8 !h-8\"\n [fTooltip]=\"'task.manager.board.manage.members' | translate\"\n tooltipPosition=\"bottom\"\n (click)=\"showMembersDialog.set(true)\"\n >\n <ui-icon pButtonIcon name=\"users\"></ui-icon>\n </button>\n <button\n fButton\n [text]=\"true\"\n severity=\"secondary\"\n size=\"small\"\n class=\"!w-8 !h-8\"\n [fTooltip]=\"'task.manager.board.manage.labels' | translate\"\n tooltipPosition=\"bottom\"\n (click)=\"showLabelsDialog.set(true)\"\n >\n <ui-icon pButtonIcon name=\"tag\"></ui-icon>\n </button>\n\n @if (viewMode() === 'board') {\n <div\n class=\"h-5 w-px bg-surface-300 dark:bg-surface-600 mx-0.5\"\n ></div>\n <button\n fButton\n size=\"small\"\n (click)=\"showAddListDialog.set(true)\"\n >\n <ui-icon pButtonIcon name=\"plus\"></ui-icon>\n <span pButtonLabel>{{\n 'task.manager.board.add.list' | translate\n }}</span>\n </button>\n }\n </div>\n </div>\n\n @if (state.activeBoard(); as board) {\n <div\n class=\"h-0.5 w-full flex-shrink-0\"\n [style.background-color]=\"board.color\"\n ></div>\n }\n </div>\n\n @if (state.isBoardLoading()) {\n @if (viewMode() === 'board') {\n <div class=\"flex gap-4 p-6 overflow-x-auto\">\n @for (i of [1, 2, 3]; track i) {\n <div class=\"flex-shrink-0 w-72\">\n <f-skeleton height=\"36px\" class=\"mb-3\" />\n @for (j of [1, 2, 3]; track j) {\n <f-skeleton height=\"90px\" class=\"mb-2\" />\n }\n </div>\n }\n </div>\n } @else {\n <div class=\"p-6\">\n @for (i of [1, 2, 3, 4, 5]; track i) {\n <f-skeleton height=\"48px\" class=\"mb-2\" />\n }\n </div>\n }\n } @else if (viewMode() === 'board') {\n <div\n class=\"flex gap-4 p-5 overflow-x-auto flex-1\"\n cdkDropList\n cdkDropListOrientation=\"horizontal\"\n [cdkDropListData]=\"state.listsWithTasks()\"\n (cdkDropListDropped)=\"onListDrop($event)\"\n >\n @for (list of state.listsWithTasks(); track list.id) {\n <div\n cdkDrag\n 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\"\n >\n <div\n class=\"flex items-center gap-1 px-2.5 py-2.5 border-b border-surface\"\n >\n <ui-icon\n cdkDragHandle\n name=\"bars\"\n class=\"text-muted-color text-xs cursor-grab flex-shrink-0 px-1\"\n ></ui-icon>\n\n <div class=\"flex items-center gap-2 min-w-0 flex-1\">\n @if (editingListId() === list.id) {\n <input\n fInputText\n class=\"text-sm font-semibold !h-6 !py-0 !px-1 w-full\"\n [ngModel]=\"editingListNameValue()\"\n (ngModelChange)=\"editingListNameValue.set($event)\"\n (keydown.enter)=\"saveRenameList()\"\n (keydown.escape)=\"cancelRenameList()\"\n (blur)=\"cancelRenameList()\"\n (click)=\"$event.stopPropagation()\"\n autofocus\n />\n } @else {\n <span class=\"font-semibold text-sm truncate\">{{\n list.name\n }}</span>\n <span\n class=\"text-[11px] font-semibold px-1.5 py-0.5 rounded-full text-white flex-shrink-0\"\n [style.background-color]=\"list.color\"\n >\n {{ list.tasks.length }}\n </span>\n }\n </div>\n\n @if (editingListId() === list.id) {\n <button\n fButton\n [text]=\"true\"\n size=\"small\"\n severity=\"success\"\n class=\"!w-6 !h-6 flex-shrink-0\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"saveRenameList(); $event.stopPropagation()\"\n >\n <ui-icon pButtonIcon name=\"check\"></ui-icon>\n </button>\n <button\n fButton\n [text]=\"true\"\n size=\"small\"\n severity=\"secondary\"\n class=\"!w-6 !h-6 flex-shrink-0\"\n (mousedown)=\"$event.preventDefault()\"\n (click)=\"cancelRenameList(); $event.stopPropagation()\"\n >\n <ui-icon pButtonIcon name=\"times\"></ui-icon>\n </button>\n } @else {\n <button\n fButton\n [text]=\"true\"\n size=\"small\"\n severity=\"secondary\"\n class=\"!w-6 !h-6 flex-shrink-0\"\n [fTooltip]=\"'task.manager.list.rename' | translate\"\n tooltipPosition=\"bottom\"\n (click)=\"startRenameList(list); $event.stopPropagation()\"\n >\n <ui-icon pButtonIcon name=\"pencil\"></ui-icon>\n </button>\n }\n </div>\n\n <div\n cdkDropList\n [id]=\"list.id\"\n [cdkDropListData]=\"list.tasks\"\n [cdkDropListConnectedTo]=\"listDropIds()\"\n (cdkDropListDropped)=\"onTaskDrop($event)\"\n class=\"flex flex-col gap-2 p-2 overflow-y-auto flex-1 min-h-[60px]\"\n >\n @for (task of list.tasks; track task.id) {\n <div cdkDrag>\n <tm-task-card\n [task]=\"task\"\n (cardClick)=\"state.selectTask($event)\"\n (editClick)=\"onEditTask($event)\"\n (deleteClick)=\"onDeleteTask($event)\"\n />\n </div>\n }\n @if (list.tasks.length === 0) {\n <div\n class=\"flex items-center justify-center h-14 border-2 border-dashed border-surface rounded-border\"\n >\n <span class=\"text-xs text-muted-color\">{{\n 'task.manager.board.drop.tasks.here' | translate\n }}</span>\n </div>\n }\n </div>\n\n <div class=\"border-t border-surface p-1.5\">\n <button\n fButton\n severity=\"secondary\"\n [text]=\"true\"\n size=\"small\"\n class=\"w-full !justify-start\"\n (click)=\"openAddTask(list)\"\n >\n <ui-icon pButtonIcon name=\"plus\"></ui-icon>\n <span pButtonLabel>{{\n 'task.manager.board.add.task' | translate\n }}</span>\n </button>\n </div>\n </div>\n }\n\n @if (state.listsWithTasks().length === 0) {\n <div class=\"flex-1 flex items-center justify-center\">\n <div class=\"text-center text-muted-color\">\n <div\n class=\"w-16 h-16 rounded-2xl border-2 border-dashed border-surface flex items-center justify-center mx-auto mb-4\"\n >\n <ui-icon\n name=\"list\"\n class=\"text-3xl text-muted-color\"\n ></ui-icon>\n </div>\n <p class=\"font-medium text-muted-color\">\n {{ 'task.manager.board.list.empty' | translate }}\n </p>\n <button\n fButton\n severity=\"secondary\"\n size=\"small\"\n class=\"mt-3\"\n (click)=\"showAddListDialog.set(true)\"\n >\n <ui-icon pButtonIcon name=\"plus\"></ui-icon>\n <span pButtonLabel>{{\n 'task.manager.board.add.list' | translate\n }}</span>\n </button>\n </div>\n </div>\n }\n </div>\n } @else {\n <div class=\"p-4 sm:p-6 flex-1 overflow-auto\">\n <div class=\"card\">\n <div class=\"overflow-x-auto -mx-4 sm:mx-0\">\n <f-table\n [value]=\"allTasksFlat()\"\n [paginator]=\"allTasksFlat().length > 20\"\n [rows]=\"20\"\n [rowsPerPageOptions]=\"[10, 20, 50]\"\n [scrollable]=\"true\"\n [tableStyle]=\"{ 'min-width': '700px' }\"\n >\n <ng-template #header>\n <tr>\n <th fSortableColumn=\"title\" class=\"min-w-[240px]\">\n {{ 'task.manager.table.title' | translate }}\n <f-sorticon field=\"title\" />\n </th>\n <th fSortableColumn=\"listName\" class=\"w-40\">\n {{ 'task.manager.table.list' | translate }}\n <f-sorticon field=\"listName\" />\n </th>\n <th fSortableColumn=\"priority\" class=\"w-32\">\n {{ 'task.manager.table.priority' | translate }}\n <f-sorticon field=\"priority\" />\n </th>\n <th class=\"w-36\">\n {{ 'task.manager.table.assignee' | translate }}\n </th>\n <th fSortableColumn=\"dueDate\" class=\"w-32\">\n {{ 'task.manager.table.due.date' | translate }}\n <f-sorticon field=\"dueDate\" />\n </th>\n <th class=\"w-[100px]\">\n {{ 'shared.actions' | translate }}\n </th>\n </tr>\n </ng-template>\n <ng-template #body let-task>\n <tr>\n <td>\n <span\n class=\"font-medium text-sm cursor-pointer hover:text-primary-500 transition-colors\"\n (click)=\"state.selectTask(task)\"\n >{{ task.title }}</span\n >\n </td>\n <td>\n <span class=\"inline-flex items-center gap-1.5 text-sm\">\n <span\n class=\"w-2 h-2 rounded-full flex-shrink-0\"\n [style.background-color]=\"task.listColor\"\n ></span>\n {{ task.listName }}\n </span>\n </td>\n <td>\n <f-tag\n [value]=\"task.priority\"\n [severity]=\"prioritySeverity(task.priority)\"\n />\n </td>\n <td>\n @if (task.assignees?.length) {\n <div class=\"flex items-center -space-x-1.5\">\n @for (\n a of task.assignees!.slice(0, 3);\n track a.userId\n ) {\n <f-avatar\n shape=\"circle\"\n size=\"small\"\n [label]=\"getMemberInitials(a.userId)\"\n [color]=\"memberColorById(a.userId)\"\n styleClass=\"!ring-surface-card flex-shrink-0\"\n [fTooltip]=\"a.userName ?? ''\"\n />\n }\n @if (task.assignees!.length > 3) {\n <f-avatar\n shape=\"circle\"\n size=\"small\"\n [label]=\"'+' + (task.assignees!.length - 3)\"\n styleClass=\"!bg-surface-200 dark:!bg-surface-700 !text-surface-600 !ring-surface-card flex-shrink-0\"\n />\n }\n </div>\n } @else {\n <span class=\"text-muted-color text-sm\">—</span>\n }\n </td>\n <td>\n @if (task.dueDate) {\n <span\n class=\"text-sm\"\n [class.text-red-500]=\"isOverdue(task.dueDate)\"\n >\n {{ task.dueDate | date: 'MMM d, y' }}\n </span>\n } @else {\n <span class=\"text-muted-color text-sm\">—</span>\n }\n </td>\n <td>\n <div class=\"flex gap-1\">\n <button\n fButton\n [text]=\"true\"\n severity=\"secondary\"\n size=\"small\"\n [fTooltip]=\"'shared.edit' | translate\"\n (click)=\"onEditTask(task)\"\n >\n <ui-icon pButtonIcon name=\"pencil\"></ui-icon>\n </button>\n <button\n fButton\n [text]=\"true\"\n severity=\"danger\"\n size=\"small\"\n [fTooltip]=\"'shared.delete' | translate\"\n (click)=\"onDeleteTask(task)\"\n >\n <ui-icon pButtonIcon name=\"trash\"></ui-icon>\n </button>\n </div>\n </td>\n </tr>\n </ng-template>\n <ng-template #emptymessage>\n <tr>\n <td colspan=\"6\" class=\"text-center text-muted-color py-8\">\n <ui-icon\n name=\"inbox\"\n class=\"text-4xl block mb-3\"\n ></ui-icon>\n {{ 'task.manager.table.empty' | translate }}\n </td>\n </tr>\n </ng-template>\n </f-table>\n </div>\n </div>\n </div>\n }\n </div>\n\n <tm-task-form-dialog\n [(visible)]=\"showTaskForm\"\n [task]=\"editingTask()\"\n [boardId]=\"boardId()\"\n [listId]=\"activeListId()\"\n [members]=\"state.members()\"\n [labels]=\"state.labels()\"\n (saved)=\"onTaskSaved($event)\"\n />\n\n <tm-task-detail-panel\n [task]=\"state.selectedTask()\"\n (closePanel)=\"state.selectTask(null)\"\n (editTask)=\"onEditTask($event)\"\n />\n\n <f-dialog\n [header]=\"'task.manager.label.manage.title' | translate\"\n [(visible)]=\"showLabelsDialog\"\n [modal]=\"true\"\n [style]=\"{ width: '420px' }\"\n (onHide)=\"newLabelName = ''; newLabelColor = boardColorPalette[0]\"\n >\n <div class=\"flex flex-col gap-4 py-2\">\n <div class=\"flex gap-2 items-end\">\n <div class=\"flex flex-col gap-1 flex-1\">\n <label class=\"text-sm font-medium\">{{\n 'task.manager.label.name.label' | translate\n }}</label>\n <input\n fInputText\n [(ngModel)]=\"newLabelName\"\n [placeholder]=\"'task.manager.label.name.placeholder' | translate\"\n />\n </div>\n <div class=\"flex flex-col gap-1\">\n <label class=\"text-sm font-medium\">{{\n 'task.manager.label.color.label' | translate\n }}</label>\n <input\n type=\"color\"\n [(ngModel)]=\"newLabelColor\"\n class=\"w-10 h-10 rounded cursor-pointer border border-surface\"\n />\n </div>\n <button\n fButton\n size=\"small\"\n (click)=\"addLabel()\"\n [disabled]=\"isAddingLabel()\"\n >\n @if (isAddingLabel()) {\n <ui-icon pButtonIcon name=\"spinner\" [spin]=\"true\"></ui-icon>\n } @else {\n <ui-icon pButtonIcon name=\"plus\"></ui-icon>\n }\n <span pButtonLabel>{{ 'task.manager.label.add' | translate }}</span>\n </button>\n </div>\n\n <div class=\"flex flex-col gap-2 max-h-64 overflow-y-auto\">\n @if (state.labels().length === 0) {\n <p class=\"text-sm text-muted-color text-center py-4\">\n {{ 'task.manager.label.no.labels' | translate }}\n </p>\n }\n @for (label of state.labels(); track label.id) {\n <div\n class=\"flex items-center justify-between px-3 py-2 rounded-border border border-surface\"\n >\n <div class=\"flex items-center gap-2\">\n <span\n class=\"w-4 h-4 rounded-full flex-shrink-0\"\n [style.background-color]=\"label.color\"\n ></span>\n <span class=\"text-sm font-medium\">{{ label.name }}</span>\n </div>\n <button\n fButton\n severity=\"danger\"\n size=\"small\"\n [text]=\"true\"\n (click)=\"removeLabel(label.id)\"\n >\n <ui-icon pButtonIcon name=\"trash\"></ui-icon>\n </button>\n </div>\n }\n </div>\n </div>\n </f-dialog>\n\n <f-dialog\n [header]=\"'task.manager.member.manage.title' | translate\"\n [(visible)]=\"showMembersDialog\"\n [modal]=\"true\"\n [style]=\"{ width: '480px' }\"\n (onHide)=\"resetMemberForm()\"\n >\n <div class=\"flex flex-col gap-4 py-2\">\n <div class=\"flex flex-col gap-3\">\n <div class=\"flex flex-col gap-1\">\n <label class=\"text-sm font-medium\">{{\n 'task.manager.member.user.label' | translate\n }}</label>\n <lib-user-select\n [(value)]=\"selectedMemberUser\"\n [isEditMode]=\"true\"\n [placeHolder]=\"'task.manager.member.user.placeholder' | translate\"\n />\n </div>\n\n <div class=\"flex gap-2 items-end\">\n <div class=\"flex flex-col gap-1 flex-1\">\n <label class=\"text-sm font-medium\">{{\n 'task.manager.member.role.label' | translate\n }}</label>\n <f-select\n [(ngModel)]=\"newMemberRole\"\n [options]=\"memberRoleOptions\"\n optionValue=\"value\"\n [placeholder]=\"\n 'task.manager.member.role.placeholder' | translate\n \"\n class=\"w-full\"\n >\n <ng-template #selectedItem let-opt>\n {{ opt.labelKey | translate }}\n </ng-template>\n <ng-template #item let-opt>\n {{ opt.labelKey | translate }}\n </ng-template>\n </f-select>\n </div>\n <button\n fButton\n size=\"small\"\n [disabled]=\"!selectedMemberUser || isAddingMember()\"\n (click)=\"addMember()\"\n >\n @if (isAddingMember()) {\n <ui-icon pButtonIcon name=\"spinner\" [spin]=\"true\"></ui-icon>\n } @else {\n <ui-icon pButtonIcon name=\"plus\"></ui-icon>\n }\n <span pButtonLabel>{{\n 'task.manager.member.add' | translate\n }}</span>\n </button>\n </div>\n </div>\n\n <div class=\"flex flex-col gap-2 max-h-72 overflow-y-auto\">\n @if (state.members().length === 0) {\n <p class=\"text-sm text-muted-color text-center py-4\">\n {{ 'task.manager.member.no.members' | translate }}\n </p>\n }\n @for (member of state.members(); track member.id) {\n <div\n class=\"flex items-center justify-between px-3 py-2.5 rounded-border border border-surface\"\n >\n <div class=\"flex items-center gap-3\">\n <f-avatar\n shape=\"circle\"\n [label]=\"memberInitials(member)\"\n [color]=\"memberColor(member)\"\n styleClass=\"!text-[11px] flex-shrink-0\"\n />\n <div>\n <div class=\"text-sm font-medium \">\n {{ member.userName ?? member.userId }}\n </div>\n @if (member.userEmail) {\n <div class=\"text-xs text-muted-color\">\n {{ member.userEmail }}\n </div>\n }\n </div>\n </div>\n <div class=\"flex items-center gap-2\">\n <span\n class=\"text-[10px] font-semibold px-2 py-0.5 rounded-full\"\n [class]=\"roleBadgeClass(member.role)\"\n >\n {{\n 'task.manager.member.role.' + member.role.toLowerCase()\n | translate\n }}\n </span>\n @if (member.role !== 'OWNER') {\n <button\n fButton\n severity=\"danger\"\n size=\"small\"\n [text]=\"true\"\n (click)=\"removeMember(member.userId)\"\n >\n <ui-icon pButtonIcon name=\"trash\"></ui-icon>\n </button>\n }\n </div>\n </div>\n }\n </div>\n </div>\n </f-dialog>\n\n <f-dialog\n [header]=\"'task.manager.list.new' | translate\"\n [(visible)]=\"showAddListDialog\"\n [modal]=\"true\"\n [style]=\"{ width: '360px' }\"\n (onHide)=\"newListName = ''\"\n >\n <div class=\"flex flex-col gap-2 py-2\">\n <label class=\"text-sm font-medium\">\n {{ 'task.manager.list.name.label' | translate }}\n <span class=\"text-red-500\">*</span>\n </label>\n <input\n fInputText\n [(ngModel)]=\"newListName\"\n [placeholder]=\"'task.manager.list.name.placeholder' | translate\"\n />\n </div>\n <ng-template #footer>\n <div class=\"flex justify-end gap-2\">\n <button\n fButton\n severity=\"secondary\"\n (click)=\"showAddListDialog.set(false)\"\n >\n <span pButtonLabel>{{ 'shared.cancel' | translate }}</span>\n </button>\n <button fButton (click)=\"addList()\" [disabled]=\"isAddingList()\">\n @if (isAddingList()) {\n <ui-icon pButtonIcon name=\"spinner\" [spin]=\"true\"></ui-icon>\n }\n <span pButtonLabel>{{ 'shared.create' | translate }}</span>\n </button>\n </div>\n </ng-template>\n </f-dialog>\n\n <f-dialog\n [header]=\"'task.manager.board.edit' | translate\"\n [(visible)]=\"showEditBoardDialog\"\n [modal]=\"true\"\n [style]=\"{ width: '420px' }\"\n >\n <div class=\"flex flex-col gap-4 py-2\">\n <div class=\"flex flex-col gap-1\">\n <label class=\"text-sm font-medium\">\n {{ 'task.manager.board.name.label' | translate }}\n <span class=\"text-red-500\">*</span>\n </label>\n <input fInputText [(ngModel)]=\"editBoardName\" />\n </div>\n <div class=\"flex flex-col gap-1\">\n <label class=\"text-sm font-medium\">{{\n 'task.manager.board.description.label' | translate\n }}</label>\n <textarea\n fTextarea\n [(ngModel)]=\"editBoardDescription\"\n [rows]=\"3\"\n [placeholder]=\"\n 'task.manager.board.description.placeholder' | translate\n \"\n ></textarea>\n </div>\n <div class=\"flex flex-col gap-1\">\n <label class=\"text-sm font-medium\">{{\n 'task.manager.board.color.label' | translate\n }}</label>\n <div class=\"flex items-center gap-3\">\n <input\n type=\"color\"\n [(ngModel)]=\"editBoardColor\"\n class=\"w-10 h-10 rounded cursor-pointer border border-surface\"\n />\n <div class=\"flex gap-2 flex-wrap\">\n @for (color of boardColorPalette; track color) {\n <button\n type=\"button\"\n class=\"w-6 h-6 rounded-full border-2 transition-transform hover:scale-110\"\n [style.background-color]=\"color\"\n [class.border-surface-900]=\"editBoardColor === color\"\n [class.dark:border-surface-0]=\"editBoardColor === color\"\n [class.border-transparent]=\"editBoardColor !== color\"\n (click)=\"editBoardColor = color\"\n ></button>\n }\n </div>\n </div>\n </div>\n </div>\n <ng-template #footer>\n <div class=\"flex justify-end gap-2\">\n <button\n fButton\n severity=\"secondary\"\n (click)=\"showEditBoardDialog.set(false)\"\n >\n <span pButtonLabel>{{ 'shared.cancel' | translate }}</span>\n </button>\n <button\n fButton\n [disabled]=\"!editBoardName.trim() || isSavingBoard()\"\n (click)=\"saveBoard()\"\n >\n @if (isSavingBoard()) {\n <ui-icon pButtonIcon name=\"spinner\" [spin]=\"true\"></ui-icon>\n }\n <span pButtonLabel>{{ 'shared.save' | translate }}</span>\n </button>\n </div>\n </ng-template>\n </f-dialog>\n `,\n})\nexport class BoardViewPageComponent {\n protected readonly state = inject(TaskBoardStateService);\n private readonly taskApi = inject(TaskApiService);\n private readonly listApi = inject(TaskListApiService);\n private readonly confirmationService = inject(ConfirmationService);\n private readonly messageService = inject(MessageService);\n private readonly translateAdapter = inject(TranslateService, {\n optional: true,\n });\n private readonly destroyRef = inject(DestroyRef);\n\n private translate(\n key: string,\n vars?: Record<string, string | number>,\n ): string {\n return this.translateAdapter?.translate(key, vars) ?? key;\n }\n\n readonly boardId = input.required<string>();\n\n readonly viewMode = signal<ViewMode>('board');\n readonly showTaskForm = signal(false);\n readonly editingTask = signal<ITask | null>(null);\n readonly activeListId = signal('');\n readonly showAddListDialog = signal(false);\n readonly isAddingList = signal(false);\n readonly showLabelsDialog = signal(false);\n readonly isAddingLabel = signal(false);\n readonly showMembersDialog = signal(false);\n readonly isAddingMember = signal(false);\n\n readonly editingListId = signal<string | null>(null);\n readonly editingListNameValue = signal('');\n readonly showEditBoardDialog = signal(false);\n readonly isSavingBoard = signal(false);\n\n newListName = '';\n newLabelName = '';\n newLabelColor = BOARD_COLOR_PALETTE[0];\n selectedMemberUser: string | null = null;\n newMemberRole = 'MEMBER';\n editBoardName = '';\n editBoardDescription = '';\n editBoardColor = BOARD_COLOR_PALETTE[0];\n\n readonly boardColorPalette = BOARD_COLOR_PALETTE;\n\n readonly memberRoleOptions = [\n { labelKey: 'task.manager.member.role.admin', value: 'ADMIN' },\n { labelKey: 'task.manager.member.role.member', value: 'MEMBER' },\n { labelKey: 'task.manager.member.role.viewer', value: 'VIEWER' },\n ];\n\n readonly allTasksFlat = computed<ITaskRow[]>(() =>\n this.state.listsWithTasks().flatMap((list) =>\n list.tasks.map((task) => ({\n ...task,\n listName: list.name,\n listColor: list.color,\n })),\n ),\n );\n\n readonly listDropIds = computed(() =>\n this.state.listsWithTasks().map((l) => l.id),\n );\n\n constructor() {\n effect(() => {\n const id = this.boardId();\n untracked(() => this.state.openBoard(id));\n });\n this.destroyRef.onDestroy(() => this.state.closeBoard());\n }\n\n openAddTask(list: ITaskList): void {\n this.editingTask.set(null);\n this.activeListId.set(list.id);\n this.showTaskForm.set(true);\n }\n\n onTaskSaved(task: ITask): void {\n this.state.addTaskOptimistic(task);\n }\n\n onDeleteTask(task: ITask): void {\n this.confirmationService.confirm({\n message: this.translate('shared.confirm.delete.item', {\n name: task.title,\n }),\n header: this.translate('task.detail.delete'),\n icon: 'exclamation-triangle',\n acceptButtonStyleClass: 'p-button-danger',\n accept: async () => {\n try {\n await this.state.deleteTask(task.id);\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: this.translate('task.delete.success'),\n });\n } catch {}\n },\n });\n }\n\n onEditTask(task: ITask): void {\n this.editingTask.set(task);\n this.activeListId.set(task.listId);\n this.showTaskForm.set(true);\n this.state.selectTask(null);\n }\n\n getMemberName(assigneeId: string): string | null {\n return (\n this.state.members().find((m) => m.userId === assigneeId)?.userName ??\n null\n );\n }\n\n getMemberInitials(assigneeId: string): string {\n return memberInitials(this.getMemberName(assigneeId));\n }\n\n memberInitials(member: ITaskBoardMember): string {\n return memberInitials(member.userName);\n }\n\n memberColor(member: ITaskBoardMember): string {\n return memberColorFromId(member.userId);\n }\n\n memberColorById(userId: string): string {\n return memberColorFromId(userId);\n }\n\n roleBadgeClass(role: string): string {\n const map: Record<string, string> = {\n OWNER: 'text-primary-600 dark:text-primary-400 font-semibold',\n ADMIN: 'text-orange-600 dark:text-orange-400 font-semibold',\n MEMBER: 'text-surface-500 dark:text-surface-400',\n VIEWER: 'text-surface-400 dark:text-surface-500',\n };\n return map[role] ?? map['MEMBER'];\n }\n\n protected readonly prioritySeverity = taskPrioritySeverity;\n protected readonly isOverdue = isTaskOverdue;\n\n async onTaskDrop(event: CdkDragDrop<ITask[]>): Promise<void> {\n if (event.previousContainer === event.container) {\n moveItemInArray(\n event.container.data,\n event.previousIndex,\n event.currentIndex,\n );\n } else {\n transferArrayItem(\n event.previousContainer.data,\n event.container.data,\n event.previousIndex,\n event.currentIndex,\n );\n const task = event.container.data[event.currentIndex];\n await this.taskApi.moveTask({\n taskId: task.id,\n targetListId: event.container.id,\n position: event.currentIndex * 100,\n });\n }\n }\n\n async onListDrop(event: CdkDragDrop<ITaskListWithTasks[]>): Promise<void> {\n if (event.previousIndex === event.currentIndex) return;\n const lists = this.state.listsWithTasks().slice();\n moveItemInArray(lists, event.previousIndex, event.currentIndex);\n const orderedIds = lists.map((l) => l.id);\n await this.state.reorderLists(this.boardId(), orderedIds);\n }\n\n startRenameList(list: ITaskList): void {\n this.editingListId.set(list.id);\n this.editingListNameValue.set(list.name);\n }\n\n cancelRenameList(): void {\n this.editingListId.set(null);\n this.editingListNameValue.set('');\n }\n\n async saveRenameList(): Promise<void> {\n const id = this.editingListId();\n const name = this.editingListNameValue().trim();\n this.cancelRenameList();\n if (!id || !name) return;\n await this.state.renameList(id, name);\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: this.translate('task.list.update.success'),\n });\n }\n\n openEditBoardDialog(board: ITaskBoard): void {\n this.editBoardName = board.name;\n this.editBoardDescription = board.description ?? '';\n this.editBoardColor = board.color;\n this.showEditBoardDialog.set(true);\n }\n\n async saveBoard(): Promise<void> {\n const board = this.state.activeBoard();\n if (!board || !this.editBoardName.trim()) return;\n this.isSavingBoard.set(true);\n try {\n await this.state.updateBoard({\n id: board.id,\n name: this.editBoardName.trim(),\n description: this.editBoardDescription.trim() || undefined,\n color: this.editBoardColor,\n });\n this.showEditBoardDialog.set(false);\n this.messageService.add({\n severity: 'success',\n summary: this.translate('shared.success'),\n detail: this.translate('task.board.update.success'),\n });\n } finally {\n this.isSavingBoard.set(false);\n }\n }\n\n async addLabel(): Promise<void> {\n if (!this.newLabelName.trim()) return;\n this.isAddingLabel.set(true);\n try {\n await this.state.addLabel(\n this.boardId(),\n this.newLabelName.trim(),\n this.newLabelColor,\n );\n this.newLabelName = '';\n this.newLabelColor = BOARD_COLOR_PALETTE[0];\n } finally {\n this.isAddingLabel.set(false);\n }\n }\n\n async removeLabel(labelId: string): Promise<void> {\n await this.state.deleteLabel(labelId);\n }\n\n async addMember(): Promise<void> {\n if (!this.selectedMemberUser) return;\n this.isAddingMember.set(true);\n try {\n await this.state.addMember(this.selectedMemberUser, this.newMemberRole);\n this.resetMemberForm();\n } finally {\n this.isAddingMember.set(false);\n }\n }\n\n resetMemberForm(): void {\n this.selectedMemberUser = null;\n this.newMemberRole = 'MEMBER';\n }\n\n async removeMember(userId: string): Promise<void> {\n await this.state.removeMember(userId);\n }\n\n async addList(): Promise<void> {\n if (!this.newListName.trim()) return;\n this.isAddingList.set(true);\n try {\n const position = this.state.lists().length * 100;\n await this.listApi.insert({\n boardId: this.boardId(),\n name: this.newListName,\n position,\n });\n await this.state.openBoard(this.boardId());\n this.showAddListDialog.set(false);\n this.newListName = '';\n } finally {\n this.isAddingList.set(false);\n }\n }\n}\n","export const TASK_MANAGER_MESSAGES = {\n // Board API messages (keys must match NestJS message-keys.ts)\n 'task.board.not.found': 'Board not found',\n 'task.board.create.success': 'Board created successfully',\n 'task.board.create.many.success': 'Boards created successfully',\n 'task.board.get.success': 'Board retrieved successfully',\n 'task.board.get.all.success': 'Boards retrieved successfully',\n 'task.board.update.success': 'Board updated successfully',\n 'task.board.update.many.success': 'Boards updated successfully',\n 'task.board.delete.success': 'Board deleted successfully',\n 'task.board.restore.success': 'Board restored successfully',\n 'task.board.member.added': 'Member added to board',\n 'task.board.member.removed': 'Member removed from board',\n 'task.board.member.not.found': 'Board member not found',\n 'task.board.member.already.exists': 'User is already a board member',\n 'task.board.member.get.all.success': 'Board members retrieved successfully',\n\n 'task.list.not.found': 'List not found',\n 'task.list.create.success': 'List created successfully',\n 'task.list.create.many.success': 'Lists created successfully',\n 'task.list.get.success': 'List retrieved successfully',\n 'task.list.get.all.success': 'Lists retrieved successfully',\n 'task.list.update.success': 'List updated successfully',\n 'task.list.update.many.success': 'Lists updated successfully',\n 'task.list.delete.success': 'List deleted successfully',\n 'task.list.restore.success': 'List restored successfully',\n 'task.list.reorder.success': 'Lists reordered successfully',\n\n 'task.not.found': 'Task not found',\n 'task.create.success': 'Task created successfully',\n 'task.create.many.success': 'Tasks created successfully',\n 'task.get.success': 'Task retrieved successfully',\n 'task.get.all.success': 'Tasks retrieved successfully',\n 'task.update.success': 'Task updated successfully',\n 'task.update.many.success': 'Tasks updated successfully',\n 'task.delete.success': 'Task deleted successfully',\n 'task.restore.success': 'Task restored successfully',\n 'task.move.success': 'Task moved successfully',\n 'task.assign.success': 'Task assigned successfully',\n 'task.assignee.not.board.member': 'Assignee is not a board member',\n\n 'task.label.not.found': 'Label not found',\n 'task.label.create.success': 'Label created successfully',\n 'task.label.create.many.success': 'Labels created successfully',\n 'task.label.get.success': 'Label retrieved successfully',\n 'task.label.get.all.success': 'Labels retrieved successfully',\n 'task.label.update.success': 'Label updated successfully',\n 'task.label.update.many.success': 'Labels updated successfully',\n 'task.label.delete.success': 'Label deleted successfully',\n 'task.label.restore.success': 'Label restored successfully',\n\n 'task.comment.not.found': 'Comment not found',\n 'task.comment.create.success': 'Comment added successfully',\n 'task.comment.create.many.success': 'Comments added successfully',\n 'task.comment.get.success': 'Comment retrieved successfully',\n 'task.comment.get.all.success': 'Comments retrieved successfully',\n 'task.comment.update.success': 'Comment updated successfully',\n 'task.comment.update.many.success': 'Comments updated successfully',\n 'task.comment.delete.success': 'Comment deleted successfully',\n 'task.comment.restore.success': 'Comment restored successfully',\n 'task.comment.forbidden': \"Cannot edit another user's comment\",\n\n 'task.manager.boards.title': 'Task Boards',\n 'task.manager.boards.subtitle': 'Manage and organize your project boards',\n 'task.manager.board.new': 'New Board',\n 'task.manager.board.name.placeholder': 'e.g. Product Backlog',\n 'task.manager.board.description.placeholder': 'Optional description',\n 'task.manager.board.color.label': 'Board Color',\n 'task.manager.board.empty': 'No boards yet',\n 'task.manager.board.empty.hint': 'Create your first board to get started',\n 'task.manager.board.members': 'Members',\n 'task.manager.board.lists': 'Lists',\n 'task.manager.board.tasks': 'Tasks',\n\n 'task.manager.board.add.list': 'Add List',\n 'task.manager.board.add.task': 'Add task',\n 'task.manager.board.drop.tasks.here': 'Drop tasks here',\n 'task.manager.board.list.empty':\n 'No lists yet. Click \"Add List\" to create one.',\n 'task.manager.list.new': 'New List',\n 'task.manager.list.name.label': 'List Name',\n 'task.manager.list.name.placeholder': 'e.g. In Progress',\n 'task.manager.list.rename': 'Rename List',\n\n 'task.manager.board.manage.members': 'Members',\n 'task.manager.member.manage.title': 'Manage Members',\n 'task.manager.member.add': 'Add Member',\n 'task.manager.member.no.members': 'No members yet.',\n 'task.manager.member.user.label': 'User',\n 'task.manager.member.user.placeholder': 'Search by name or email',\n 'task.manager.member.role.label': 'Role',\n 'task.manager.member.role.placeholder': 'Select role',\n 'task.manager.member.role.owner': 'Owner',\n 'task.manager.member.role.admin': 'Admin',\n 'task.manager.member.role.member': 'Member',\n 'task.manager.member.role.viewer': 'Viewer',\n\n 'task.manager.board.manage.labels': 'Labels',\n 'task.manager.label.manage.title': 'Manage Labels',\n 'task.manager.label.name.label': 'Label Name',\n 'task.manager.label.name.placeholder': 'e.g. Bug, Feature',\n 'task.manager.label.color.label': 'Color',\n 'task.manager.label.add': 'Add Label',\n 'task.manager.label.no.labels': 'No labels yet.',\n\n 'task.manager.board.edit': 'Edit Board',\n 'task.manager.board.name.label': 'Board Name',\n 'task.manager.board.description.label': 'Description',\n\n 'task.manager.view.board': 'Board',\n 'task.manager.view.list': 'List',\n\n 'task.manager.table.title': 'Title',\n 'task.manager.table.list': 'List',\n 'task.manager.table.priority': 'Priority',\n 'task.manager.table.assignee': 'Assignee',\n 'task.manager.table.due.date': 'Due Date',\n 'task.manager.table.empty': 'No tasks yet.',\n\n 'task.form.title.create': 'New Task',\n 'task.form.title.edit': 'Edit Task',\n 'task.form.title.label': 'Title',\n 'task.form.title.placeholder': 'Task title',\n 'task.form.description.placeholder': 'Add a description...',\n 'task.form.priority.label': 'Priority',\n 'task.form.priority.placeholder': 'Select priority',\n 'task.form.due.date.label': 'Due Date',\n 'task.form.due.date.placeholder': 'Pick a date',\n 'task.form.assignee.label': 'Assignee',\n 'task.form.assignee.placeholder': 'Assign to board member',\n 'task.form.labels.label': 'Labels',\n 'task.form.labels.placeholder': 'Select labels',\n\n 'task.priority.LOW': 'Low',\n 'task.priority.MEDIUM': 'Medium',\n 'task.priority.HIGH': 'High',\n 'task.priority.URGENT': 'Urgent',\n\n 'task.detail.description.empty': 'No description',\n 'task.detail.comments.label': 'Comments',\n 'task.detail.comments.empty': 'No comments yet',\n 'task.detail.comment.placeholder': 'Add a comment...',\n 'task.detail.due.label': 'Due',\n 'task.detail.assignees.label': 'Assignees',\n 'task.detail.edit': 'Edit task',\n 'task.detail.delete': 'Delete task',\n 'task.comment.reply': 'Reply',\n 'task.comment.reply.placeholder': 'Write a reply...',\n} as const;\n","import { Routes } from '@angular/router';\nimport { resolveTranslationModule, SHARED_MESSAGES } from '@flusys/ng-shared';\nimport { TASK_MANAGER_MESSAGES } from '../constants/messages';\n\nexport const TASK_MANAGER_ROUTES: Routes = [\n {\n path: '',\n resolve: {\n translations: resolveTranslationModule({\n modules: ['task-manager'],\n fallbackMessages: { ...TASK_MANAGER_MESSAGES, ...SHARED_MESSAGES },\n }),\n },\n loadComponent: () =>\n import('../pages/board-list-page/board-list-page.component').then(\n (m) => m.BoardListPageComponent,\n ),\n },\n {\n path: 'board/:boardId',\n resolve: {\n translations: resolveTranslationModule({\n modules: ['task-manager'],\n fallbackMessages: { ...TASK_MANAGER_MESSAGES, ...SHARED_MESSAGES },\n }),\n },\n loadComponent: () =>\n import('../pages/board-view-page/board-view-page.component').then(\n (m) => m.BoardViewPageComponent,\n ),\n },\n];\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["i1","i2","i3"],"mappings":";;;;;;;;;;;;;;;;;AAeM,MAAO,mBAAoB,SAAQ,kBAGxC,CAAA;AACC,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,CAAC,OAAO,EAAE,aAAa,CAAC;IAC/B;AAEA,IAAA,UAAU,CAAC,OAAe,EAAA;AACxB,QAAA,OAAO,cAAc,CACnB,IAAI,CAAC,IAAI,CAAC,IAAI,CACZ,CAAA,EAAG,IAAI,CAAC,OAAO,cAAc,EAC7B,EAAE,OAAO,EAAE,CACZ,CACF;IACH;AAEA,IAAA,SAAS,CACP,OAAe,EACf,MAAc,EACd,IAAI,GAAG,QAAQ,EAAA;QAEf,OAAO,cAAc,CACnB,IAAI,CAAC,IAAI,CAAC,IAAI,CACZ,CAAA,EAAG,IAAI,CAAC,OAAO,CAAA,WAAA,CAAa,EAC5B,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,CAC1B,CACF;IACH;IAEA,YAAY,CAAC,OAAe,EAAE,MAAc,EAAA;AAC1C,QAAA,OAAO,cAAc,CACnB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAmB,CAAA,EAAG,IAAI,CAAC,OAAO,gBAAgB,EAAE;YAChE,OAAO;YACP,MAAM;AACP,SAAA,CAAC,CACH;IACH;uGArCW,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAnB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,cADN,MAAM,EAAA,CAAA;;2FACnB,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAD/B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;ACI5B,MAAO,cAAe,SAAQ,kBAAyC,CAAA;AAC3E,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,CAAC,MAAM,EAAE,aAAa,CAAC;IAC9B;AAEA,IAAA,QAAQ,CAAC,GAAiB,EAAA;AACxB,QAAA,OAAO,cAAc,CACnB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAyB,CAAA,EAAG,IAAI,CAAC,OAAO,CAAA,KAAA,CAAO,EAAE,GAAG,CAAC,CACpE;IACH;uGATW,cAAc,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAd,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,cAAc,cADD,MAAM,EAAA,CAAA;;2FACnB,cAAc,EAAA,UAAA,EAAA,CAAA;kBAD1B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;AAc5B,MAAO,kBAAmB,SAAQ,kBAAiD,CAAA;AACvF,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,CAAC,MAAM,EAAE,aAAa,CAAC;IAC9B;AAEA,IAAA,UAAU,CAAC,GAAuB,EAAA;AAChC,QAAA,OAAO,cAAc,CACnB,IAAI,CAAC,IAAI,CAAC,IAAI,CAA6B,CAAA,EAAG,IAAI,CAAC,OAAO,CAAA,OAAA,CAAS,EAAE,GAAG,CAAC,CAC1E;IACH;AAEA,IAAA,YAAY,CAAC,GAAyB,EAAA;AACpC,QAAA,OAAO,cAAc,CACnB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAmB,CAAA,EAAG,IAAI,CAAC,OAAO,CAAA,QAAA,CAAU,EAAE,GAAG,CAAC,CACjE;IACH;uGAfW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAlB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,kBAAkB,cADL,MAAM,EAAA,CAAA;;2FACnB,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBAD9B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;AAoB5B,MAAO,mBAAoB,SAAQ,kBAAmD,CAAA;AAC1F,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,CAAC,OAAO,EAAE,aAAa,CAAC;IAC/B;uGAHW,mBAAmB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAnB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,mBAAmB,cADN,MAAM,EAAA,CAAA;;2FACnB,mBAAmB,EAAA,UAAA,EAAA,CAAA;kBAD/B,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;AAQ5B,MAAO,qBAAsB,SAAQ,kBAAuD,CAAA;AAChG,IAAA,WAAA,GAAA;AACE,QAAA,KAAK,CAAC,SAAS,EAAE,aAAa,CAAC;IACjC;uGAHW,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAArB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,qBAAqB,cADR,MAAM,EAAA,CAAA;;2FACnB,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBADjC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;MCjDrB,sBAAsB,CAAA;IACzB,MAAM,GAAkB,IAAI;AACnB,IAAA,SAAS,GAAG,MAAM,CAAC,UAAU,CAAC;IAE9B,YAAY,GAAG,MAAM,CAAC,KAAK;qFAAC;AACpC,IAAA,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE;AAEpC,IAAA,WAAW,GAAG,IAAI,OAAO,EAAqB;AACtD,IAAA,YAAY,GAAG,IAAI,CAAC,WAAW,CAAC,YAAY,EAAE;AAEvD,IAAA,OAAO,CAAC,WAAmB,EAAA;AACzB,QAAA,IAAI,IAAI,CAAC,MAAM,EAAE,SAAS;YAAE;AAE5B,QAAA,MAAM,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE;QACjC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,CAAA,EAAG,OAAO,cAAc,EAAE;AACzC,YAAA,IAAI,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE;AAC5B,YAAA,UAAU,EAAE,CAAC,WAAW,EAAE,SAAS,CAAC;AACpC,YAAA,YAAY,EAAE,IAAI;AAClB,YAAA,oBAAoB,EAAE,CAAC;AACvB,YAAA,iBAAiB,EAAE,IAAI;AACxB,SAAA,CAAC;AAEF,QAAA,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC5D,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,YAAY,EAAE,CAAC,MAAc,KAAI;AAC9C,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;YAC5B,IAAI,MAAM,KAAK,sBAAsB;AAAE,gBAAA,IAAI,CAAC,MAAM,EAAE,OAAO,EAAE;AAC/D,QAAA,CAAC,CAAC;AACF,QAAA,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,eAAe,EAAE,MAAM,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACnE,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,aAAa,EAAE,CAAC,KAAwB,KAAK,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC3F;AAEA,IAAA,SAAS,CAAC,OAAe,EAAA;QACvB,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,EAAE,OAAO,EAAE,CAAC;IAC9C;AAEA,IAAA,UAAU,CAAC,OAAe,EAAA;QACxB,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,aAAa,EAAE,EAAE,OAAO,EAAE,CAAC;IAC/C;IAEA,UAAU,GAAA;AACR,QAAA,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE;AACzB,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI;AAClB,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;IAC9B;IAEQ,UAAU,GAAA;AAChB,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,QAA8D;AAC9F,QAAA,OAAO,QAAQ,GAAG,aAAa,CAAC,EAAE,SAAS,IAAI,IAAI,CAAC,SAAS,CAAC,UAAU;IAC1E;uGAhDW,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAtB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,sBAAsB,cADT,MAAM,EAAA,CAAA;;2FACnB,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBADlC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;MCErB,qBAAqB,CAAA;AACf,IAAA,QAAQ,GAAG,MAAM,CAAC,mBAAmB,CAAC;AACtC,IAAA,OAAO,GAAG,MAAM,CAAC,cAAc,CAAC;AAChC,IAAA,OAAO,GAAG,MAAM,CAAC,kBAAkB,CAAC;AACpC,IAAA,QAAQ,GAAG,MAAM,CAAC,mBAAmB,CAAC;AACtC,IAAA,aAAa,GAAG,MAAM,CAAC,sBAAsB,CAAC;AAC9C,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IAE/B,OAAO,GAAG,MAAM,CAAe,EAAE;gFAAC;IAClC,YAAY,GAAG,MAAM,CAAoB,IAAI;qFAAC;IAC9C,MAAM,GAAG,MAAM,CAAc,EAAE;+EAAC;IAChC,MAAM,GAAG,MAAM,CAAU,EAAE;+EAAC;IAC5B,OAAO,GAAG,MAAM,CAAe,EAAE;gFAAC;IAClC,QAAQ,GAAG,MAAM,CAAqB,EAAE;iFAAC;IACzC,aAAa,GAAG,MAAM,CAAe,IAAI;sFAAC;IAC1C,UAAU,GAAG,MAAM,CAAC,KAAK;mFAAC;IAC1B,eAAe,GAAG,MAAM,CAAC,KAAK;wFAAC;AAEvC,IAAA,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE;AAClC,IAAA,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC,UAAU,EAAE;AAC5C,IAAA,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE;AAChC,IAAA,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE;AAChC,IAAA,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE;AAClC,IAAA,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,UAAU,EAAE;AACpC,IAAA,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE;AAC9C,IAAA,SAAS,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE;AACxC,IAAA,cAAc,GAAG,IAAI,CAAC,eAAe,CAAC,UAAU,EAAE;AAElD,IAAA,WAAW,GAAG,QAAQ,CAAC,MAAK;AACnC,QAAA,MAAM,GAAG,GAAG,IAAI,GAAG,EAAmB;QACtC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE,EAAE;AAChC,YAAA,MAAM,IAAI,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;AACvC,YAAA,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;YACf,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;QAC5B;AACA,QAAA,OAAO,GAAG;IACZ,CAAC;oFAAC;IAEO,cAAc,GAAG,QAAQ,CAAC,MACjC,IAAI,CAAC,MAAM;AACR,SAAA,KAAK;AACL,SAAA,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ;AACtC,SAAA,GAAG,CAAC,CAAC,IAAI,MAAM;AACd,QAAA,GAAG,IAAI;AACP,QAAA,KAAK,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC;AAC/F,KAAA,CAAC,CAAC;uFACN;IAEQ,cAAc,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,YAAY,EAAE,KAAK,IAAI;uFAAC;AAC7D,IAAA,iBAAiB,GAAG,IAAI,CAAC,aAAa,CAAC,WAAW;AAE3D,IAAA,WAAA,GAAA;QACE,IAAI,CAAC,aAAa,CAAC;AAChB,aAAA,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,UAAU,CAAC;AACxC,aAAA,SAAS,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;IACvD;AAEA,IAAA,MAAM,UAAU,GAAA;AACd,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;AACzB,QAAA,IAAI;AACF,YAAA,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,CAAC;YACvE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;QAClC;gBAAU;AACR,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;QAC5B;IACF;IAEA,MAAM,SAAS,CAAC,OAAe,EAAA;AAC7B,QAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC;AAC9B,QAAA,IAAI;AACF,YAAA,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,EAAE;AACrC,YAAA,IAAI,SAAS;gBAAE,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;AAE1D,YAAA,MAAM,CAAC,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;AAC9E,gBAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAC/B,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC;gBACvF,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC;AACvE,gBAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC;AAC7C,gBAAA,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC;AAClC,aAAA,CAAC;YAEF,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,IAAI,CAAC;YAC5C,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC;YACpC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC;YACpC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,IAAI,EAAE,CAAC;YACtC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,IAAI,EAAE,CAAC;AAExC,YAAA,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,OAAO,CAAC;QACvC;gBAAU;AACR,YAAA,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,KAAK,CAAC;QACjC;IACF;IAEA,UAAU,GAAA;AACR,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE;AACjC,QAAA,IAAI,KAAK;YAAE,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;AAClD,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;AAC3B,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;AACnB,QAAA,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC;AACnB,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;AACpB,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;AACrB,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;IAC9B;AAEA,IAAA,UAAU,CAAC,IAAkB,EAAA;AAC3B,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;IAC9B;AAEA,IAAA,MAAM,QAAQ,CAAC,OAAe,EAAE,IAAY,EAAE,KAAa,EAAA;AACzD,QAAA,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;AACpD,QAAA,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC;QAC/D,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;IAClC;IAEA,MAAM,WAAW,CAAC,OAAe,EAAA;AAC/B,QAAA,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QAC3D,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,CAAC;IACrE;AAEA,IAAA,MAAM,SAAS,CAAC,MAAc,EAAE,IAAI,GAAG,QAAQ,EAAA;AAC7C,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE;AACjC,QAAA,IAAI,CAAC,KAAK;YAAE;AACZ,QAAA,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC;QACjE,IAAI,GAAG,CAAC,IAAI;AAAE,YAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,IAAI,EAAE,GAAG,CAAC,IAAK,CAAC,CAAC;IACpE;IAEA,MAAM,YAAY,CAAC,MAAc,EAAA;AAC/B,QAAA,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,EAAE;AACjC,QAAA,IAAI,CAAC,KAAK;YAAE;AACZ,QAAA,MAAM,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC;QAClD,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;IACzE;AAEA,IAAA,MAAM,YAAY,CAAC,OAAe,EAAE,UAAoB,EAAA;QACtD,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;QAChE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,KACtB;AACG,aAAA,GAAG,CAAC,CAAC,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAE,EAAE,GAAG,CAAC,CAAC;AACzE,aAAA,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAC3C;AACD,QAAA,MAAM,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC;IAC1D;AAEA,IAAA,MAAM,UAAU,CAAC,MAAc,EAAE,IAAY,EAAA;AAC3C,QAAA,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;AACnD,QAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,MAAM,GAAG,EAAE,GAAG,CAAC,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IACvF;IAEA,MAAM,WAAW,CAAC,GAAwB,EAAA;QACxC,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,CAAC;AAC/B,QAAA,MAAM,EAAE,GAAG,GAAG,CAAC,EAAE;AACjB,QAAA,IAAI,CAAC,EAAE;YAAE;AACT,QAAA,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC;AACtE,QAAA,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;IACtF;AAEA,IAAA,iBAAiB,CAAC,IAAW,EAAA;QAC3B,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,KAAI;AAC1B,YAAA,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC,EAAE;AACtC,gBAAA,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC,CAAC;YACpE;AACA,YAAA,OAAO,CAAC,GAAG,IAAI,EAAE,IAAI,CAAC;AACxB,QAAA,CAAC,CAAC;IACJ;IAEA,MAAM,UAAU,CAAC,MAAc,EAAA;AAC7B,QAAA,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;QACzD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,MAAM,CAAC,CAAC;AACjE,QAAA,IAAI,IAAI,CAAC,aAAa,EAAE,EAAE,EAAE,KAAK,MAAM;AAAE,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;IACvE;AAEQ,IAAA,gBAAgB,CAAC,KAAwB,EAAA;AAC/C,QAAA,QAAQ,KAAK,CAAC,IAAI;YAChB,KAAK,cAAc,EAAE;AACnB,gBAAA,MAAM,OAAO,GAAG,KAAK,CAAC,OAAgB;gBACtC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,KAAI;AAC1B,oBAAA,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE,CAAC;AAAE,wBAAA,OAAO,IAAI;AACtD,oBAAA,OAAO,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC;AAC3B,gBAAA,CAAC,CAAC;gBACF;YACF;AAEA,YAAA,KAAK,cAAc;YACnB,KAAK,YAAY,EAAE;AACjB,gBAAA,MAAM,OAAO,GAAG,KAAK,CAAC,OAAgB;gBACtC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,KACtB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC,CAClE;gBACD,IAAI,IAAI,CAAC,aAAa,EAAE,EAAE,EAAE,KAAK,OAAO,CAAC,EAAE,EAAE;AAC3C,oBAAA,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,OAAO,EAAE,GAAG,IAAI,CAAC,CAAC;gBACrE;gBACA;YACF;YAEA,KAAK,cAAc,EAAE;AACnB,gBAAA,MAAM,OAAO,GAAG,KAAK,CAAC,OAAyB;AAC/C,gBAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,OAAO,CAAC,EAAE,CAAC,CAAC;gBACrE,IAAI,IAAI,CAAC,aAAa,EAAE,EAAE,EAAE,KAAK,OAAO,CAAC,EAAE;AAAE,oBAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;gBACzE;YACF;AAEA,YAAA,KAAK,cAAc;AACjB,gBAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,OAAoB,CAAC,CAAC;gBACnE;YAEF,KAAK,cAAc,EAAE;AACnB,gBAAA,MAAM,WAAW,GAAG,KAAK,CAAC,OAAoB;gBAC9C,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,KACtB,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,WAAW,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,EAAE,GAAG,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,CAC1E;gBACD;YACF;YAEA,KAAK,cAAc,EAAE;AACnB,gBAAA,MAAM,WAAW,GAAG,KAAK,CAAC,OAAyB;AACnD,gBAAA,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,WAAW,CAAC,EAAE,CAAC,CAAC;gBACzE;YACF;YAEA,KAAK,gBAAgB,EAAE;AACrB,gBAAA,MAAM,EAAE,UAAU,EAAE,GAAG,KAAK,CAAC,OAAmC;gBAChE,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC;gBAChE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,KACtB;AACG,qBAAA,GAAG,CAAC,CAAC,CAAC,MAAM,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAE,EAAE,GAAG,CAAC,CAAC;AACzE,qBAAA,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAC3C;gBACD;YACF;;IAEJ;uGAtOW,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAArB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,qBAAqB,cADR,MAAM,EAAA,CAAA;;2FACnB,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBADjC,UAAU;mBAAC,EAAE,UAAU,EAAE,MAAM,EAAE;;;ACP3B,MAAM,oBAAoB,GAAG;IAClC,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;IACT,SAAS;;AAGJ,MAAM,mBAAmB,GAAG;AACjC,IAAA,GAAG,oBAAoB;IACvB,SAAS;;AAGL,SAAU,oBAAoB,CAClC,QAAgB,EAAA;AAEhB,IAAA,MAAM,GAAG,GAAyE;AAChF,QAAA,GAAG,EAAE,WAAW;AAChB,QAAA,MAAM,EAAE,MAAM;AACd,QAAA,IAAI,EAAE,MAAM;AACZ,QAAA,MAAM,EAAE,QAAQ;KACjB;AACD,IAAA,OAAO,GAAG,CAAC,QAAQ,CAAC,IAAI,MAAM;AAChC;AAEM,SAAU,cAAc,CAAC,IAA+B,EAAA;AAC5D,IAAA,IAAI,CAAC,IAAI;AAAE,QAAA,OAAO,GAAG;AACrB,IAAA,OAAO;SACJ,KAAK,CAAC,GAAG;AACT,SAAA,KAAK,CAAC,CAAC,EAAE,CAAC;AACV,SAAA,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE;SACpC,IAAI,CAAC,EAAE,CAAC;AACb;AAEM,SAAU,aAAa,CAAC,OAAe,EAAA;IAC3C,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,IAAI,EAAE;AACvC;AAEM,SAAU,iBAAiB,CAAC,MAAc,EAAA;IAC9C,IAAI,IAAI,GAAG,CAAC;AACZ,IAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE;AACpC,QAAA,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,IAAI,CAAC;AACpD,IAAA,OAAO,oBAAoB,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,oBAAoB,CAAC,MAAM,CAAC;AAC3E;;MCiDa,iBAAiB,CAAA;IACnB,IAAI,GAAG,KAAK,CAAC,QAAQ;6EAAS;IAC9B,SAAS,GAAG,MAAM,EAAS;IAC3B,SAAS,GAAG,MAAM,EAAS;IAC3B,WAAW,GAAG,MAAM,EAAS;IAErB,WAAW,GAAG,CAAC;IAEvB,gBAAgB,GAAG,QAAQ,CAAC,MACnC,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,SAAS,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,WAAW,CAAC;yFACzD;AAEQ,IAAA,aAAa,GAAG,QAAQ,CAAC,MAChC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,SAAS,IAAI,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC;sFACrE;IAEkB,gBAAgB,GAAG,oBAAoB;IACvC,QAAQ,GAAG,cAAc;IACzB,SAAS,GAAG,aAAa;IACzB,WAAW,GAAG,iBAAiB;uGAnBvC,iBAAiB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAjB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,iBAAiB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,SAAA,EAAA,WAAA,EAAA,SAAA,EAAA,WAAA,EAAA,WAAA,EAAA,aAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAlFlB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgFT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAjFkC,gBAAgB,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,cAAA,EAAA,WAAA,EAAA,WAAA,EAAA,MAAA,EAAA,UAAA,EAAA,aAAA,EAAA,cAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,QAAQ,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,OAAA,EAAA,OAAA,EAAA,MAAA,EAAA,OAAA,EAAA,YAAA,EAAA,WAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,OAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,EAAA,MAAA,EAAA,SAAA,EAAA,OAAA,EAAA,YAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAnD,QAAQ,wCAAE,aAAa,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA;;2FAmFtB,iBAAiB,EAAA,UAAA,EAAA,CAAA;kBArF7B,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,cAAc;oBACxB,OAAO,EAAE,CAAC,QAAQ,EAAE,aAAa,EAAE,gBAAgB,EAAE,QAAQ,CAAC;AAC9D,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgFT,EAAA,CAAA;AACF,iBAAA;;;AC3ED,MAAM,gBAAgB,GAAG;AACvB,IAAA,EAAE,QAAQ,EAAE,mBAAmB,EAAE,KAAK,EAAE,KAAK,EAAE;AAC/C,IAAA,EAAE,QAAQ,EAAE,sBAAsB,EAAE,KAAK,EAAE,QAAQ,EAAE;AACrD,IAAA,EAAE,QAAQ,EAAE,oBAAoB,EAAE,KAAK,EAAE,MAAM,EAAE;AACjD,IAAA,EAAE,QAAQ,EAAE,sBAAsB,EAAE,KAAK,EAAE,QAAQ,EAAE;CACtD;MAqHY,uBAAuB,CAAA;AACjB,IAAA,OAAO,GAAG,MAAM,CAAC,cAAc,CAAC;IAExC,OAAO,GAAG,KAAK,CAAC,KAAK;gFAAC;IACtB,IAAI,GAAG,KAAK,CAAe,IAAI;6EAAC;IAChC,OAAO,GAAG,KAAK,CAAC,QAAQ;gFAAU;IAClC,MAAM,GAAG,KAAK,CAAC,QAAQ;+EAAU;IACjC,OAAO,GAAG,KAAK,CAAqB,EAAE;gFAAC;IACvC,MAAM,GAAG,KAAK,CAAe,EAAE;+EAAC;IAChC,KAAK,GAAG,MAAM,EAAS;IAEvB,QAAQ,GAAG,MAAM,CAAC,KAAK;iFAAC;IACxB,eAAe,GAAG,gBAAgB;IAE3C,KAAK,GAAG,EAAE;IACV,WAAW,GAAG,EAAE;IAChB,QAAQ,GAAG,QAAQ;IACnB,OAAO,GAAgB,IAAI;IAC3B,mBAAmB,GAAa,EAAE;IAClC,gBAAgB,GAAa,EAAE;AAE/B,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE;YACrB,IAAI,CAAC,EAAE;AACL,gBAAA,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK;gBACpB,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,IAAI,EAAE;AACtC,gBAAA,IAAI,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ;gBAC1B,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,OAAO,GAAG,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,IAAI;gBACrD,IAAI,CAAC,mBAAmB,GAAG,CAAC,CAAC,SAAS,EAAE,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE;gBAClE,IAAI,CAAC,gBAAgB,GAAG,CAAC,CAAC,QAAQ,IAAI,EAAE;YAC1C;iBAAO;gBACL,IAAI,CAAC,KAAK,EAAE;YACd;AACF,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,MAAM,MAAM,GAAA;AACV,QAAA,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;YAAE;AACxB,QAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC;AACvB,QAAA,IAAI;AACF,YAAA,MAAM,UAAU,GAAG,IAAI,CAAC;AACtB,kBAAE,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE;kBACtC,SAAS;AACb,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,EAAE;AAC5B,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAsC;AAC5D,YAAA,IAAI,MAAM;YAEV,IAAI,QAAQ,EAAE;AACZ,gBAAA,MAAM,GAAG,GAAmB;oBAC1B,EAAE,EAAE,QAAQ,CAAC,EAAE;oBACf,KAAK,EAAE,IAAI,CAAC,KAAK;AACjB,oBAAA,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,SAAS;oBAC1C,QAAQ;AACR,oBAAA,OAAO,EAAE,UAAU;oBACnB,WAAW,EAAE,IAAI,CAAC,mBAAmB;oBACrC,QAAQ,EAAE,IAAI,CAAC,gBAAgB;iBAChC;gBACD,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC;YACzC;iBAAO;AACL,gBAAA,MAAM,GAAG,GAAmB;AAC1B,oBAAA,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE;AACvB,oBAAA,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE;oBACrB,KAAK,EAAE,IAAI,CAAC,KAAK;AACjB,oBAAA,WAAW,EAAE,IAAI,CAAC,WAAW,IAAI,SAAS;oBAC1C,QAAQ;AACR,oBAAA,OAAO,EAAE,UAAU;oBACnB,WAAW,EAAE,IAAI,CAAC,mBAAmB;oBACrC,QAAQ,EAAE,IAAI,CAAC,gBAAgB;iBAChC;gBACD,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC;YACzC;YAEA,IAAI,MAAM,CAAC,IAAI;gBAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;AAC7C,YAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;QACzB;gBAAU;AACR,YAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;QAC1B;IACF;IAEA,OAAO,GAAA;AACL,QAAA,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC;QACvB,IAAI,CAAC,KAAK,EAAE;IACd;IAEQ,KAAK,GAAA;AACX,QAAA,IAAI,CAAC,KAAK,GAAG,EAAE;AACf,QAAA,IAAI,CAAC,WAAW,GAAG,EAAE;AACrB,QAAA,IAAI,CAAC,QAAQ,GAAG,QAAQ;AACxB,QAAA,IAAI,CAAC,OAAO,GAAG,IAAI;AACnB,QAAA,IAAI,CAAC,mBAAmB,GAAG,EAAE;AAC7B,QAAA,IAAI,CAAC,gBAAgB,GAAG,EAAE;IAC5B;uGA5FW,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAvB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,uBAAuB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,MAAA,EAAA,EAAA,iBAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,OAAA,EAAA,eAAA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAhHxB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8GT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EA/GS,QAAQ,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,SAAA,EAAA,SAAA,EAAA,QAAA,EAAA,OAAA,EAAA,UAAA,EAAA,SAAA,EAAA,aAAA,EAAA,MAAA,EAAA,OAAA,EAAA,MAAA,EAAA,SAAA,EAAA,WAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,mBAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,YAAA,EAAA,UAAA,EAAA,UAAA,EAAA,eAAA,EAAA,UAAA,EAAA,UAAA,EAAA,YAAA,EAAA,aAAA,EAAA,eAAA,EAAA,SAAA,EAAA,SAAA,EAAA,eAAA,EAAA,cAAA,EAAA,SAAA,EAAA,SAAA,EAAA,SAAA,EAAA,WAAA,EAAA,iBAAA,EAAA,UAAA,EAAA,aAAA,EAAA,eAAA,EAAA,QAAA,EAAA,gBAAA,EAAA,MAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,gBAAA,EAAA,UAAA,EAAA,YAAA,EAAA,OAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,cAAA,EAAA,cAAA,EAAA,eAAA,EAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,SAAA,EAAA,SAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,aAAA,EAAA,aAAA,EAAA,aAAA,EAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,oBAAA,EAAA,SAAA,EAAA,SAAA,EAAA,SAAA,EAAA,WAAA,EAAA,gBAAA,EAAA,SAAA,EAAA,mBAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,YAAA,EAAA,OAAA,EAAA,UAAA,EAAA,UAAA,EAAA,WAAA,EAAA,SAAA,EAAA,aAAA,EAAA,cAAA,EAAA,WAAA,EAAA,OAAA,EAAA,kBAAA,EAAA,qBAAA,EAAA,eAAA,EAAA,uBAAA,EAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,QAAA,EAAA,SAAA,EAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,SAAA,EAAA,YAAA,EAAA,mBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,aAAA,EAAA,aAAA,EAAA,aAAA,EAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,oBAAA,EAAA,WAAA,EAAA,SAAA,EAAA,aAAA,EAAA,cAAA,EAAA,WAAA,EAAA,SAAA,EAAA,SAAA,EAAA,SAAA,EAAA,YAAA,EAAA,OAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,WAAA,EAAA,WAAA,EAAA,OAAA,EAAA,kBAAA,EAAA,qBAAA,EAAA,eAAA,EAAA,uBAAA,EAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,SAAA,EAAA,SAAA,EAAA,OAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,SAAA,EAAA,OAAA,EAAA,UAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,WAAA,EAAA,aAAA,EAAA,aAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,OAAA,EAAA,YAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,QAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,wSAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAE,aAAa,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA;;2FAiHnC,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAnHnC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,qBAAqB;AAC/B,oBAAA,OAAO,EAAE,CAAC,QAAQ,EAAE,WAAW,EAAE,aAAa,CAAC;AAC/C,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8GT,EAAA,CAAA;AACF,iBAAA;;;MCoFY,wBAAwB,CAAA;AAClB,IAAA,UAAU,GAAG,MAAM,CAAC,qBAAqB,CAAC;AAC1C,IAAA,KAAK,GAAG,MAAM,CAAC,qBAAqB,CAAC;IAE7C,IAAI,GAAG,KAAK,CAAe,IAAI;6EAAC;IAEhC,UAAU,GAAG,MAAM,EAAQ;IAC3B,QAAQ,GAAG,MAAM,EAAS;IAE1B,QAAQ,GAAG,MAAM,CAAiB,EAAE;iFAAC;IACrC,gBAAgB,GAAG,MAAM,CAAC,KAAK;yFAAC;IAChC,cAAc,GAAG,MAAM,CAAC,KAAK;uFAAC;IAC9B,YAAY,GAAG,MAAM,CAAgB,IAAI;qFAAC;IAC1C,UAAU,GAAG,MAAM,CAAC,KAAK;mFAAC;IAEnC,UAAU,GAAG,EAAE;IACf,SAAS,GAAG,EAAE;AAEL,IAAA,eAAe,GAAG,QAAQ,CAAC,MAAM,IAAI,CAAC,IAAI,EAAE,EAAE,SAAS,IAAI,EAAE;wFAAC;IAE9D,YAAY,GAAG,QAAQ,CAAC,MAC/B,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,eAAe,CAAC;qFAClD;AAED,IAAA,UAAU,CAAC,QAAgB,EAAA;AACzB,QAAA,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,eAAe,KAAK,QAAQ,CAAC;IACtE;AAEA,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE;AACrB,YAAA,IAAI,CAAC;AAAE,gBAAA,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC;iBACzB;AACH,gBAAA,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;AACrB,gBAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;YAC7B;AACF,QAAA,CAAC,CAAC;IACJ;AAEA,IAAA,WAAW,CAAC,SAAiB,EAAA;AAC3B,QAAA,IAAI,IAAI,CAAC,YAAY,EAAE,KAAK,SAAS,EAAE;YACrC,IAAI,CAAC,WAAW,EAAE;QACpB;aAAO;AACL,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC;AAChC,YAAA,IAAI,CAAC,SAAS,GAAG,EAAE;QACrB;IACF;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;AAC3B,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;IACrB;IAEA,MAAM,UAAU,CAAC,MAAc,EAAA;AAC7B,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;AACzB,QAAA,IAAI;YACF,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC;AACnC,YAAA,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;QACxB;gBAAU;AACR,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;QAC5B;IACF;IAEmB,gBAAgB,GAAG,oBAAoB;IACvC,QAAQ,GAAG,cAAc;IAEpC,MAAM,YAAY,CAAC,MAAc,EAAA;AACvC,QAAA,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC;QAChE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;IACnC;IAEA,MAAM,UAAU,CAAC,MAAc,EAAA;AAC7B,QAAA,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE;YAAE;AAC7B,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,IAAI,CAAC;AAC/B,QAAA,IAAI;YACF,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;gBACvC,MAAM;gBACN,OAAO,EAAE,IAAI,CAAC,UAAU;AACzB,aAAA,CAAC;YACF,IAAI,GAAG,CAAC,IAAI;AAAE,gBAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,IAAI,EAAE,GAAG,CAAC,IAAK,CAAC,CAAC;AAClE,YAAA,IAAI,CAAC,UAAU,GAAG,EAAE;QACtB;gBAAU;AACR,YAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC;QAClC;IACF;AAEA,IAAA,MAAM,WAAW,CAAC,MAAc,EAAE,eAAuB,EAAA;AACvD,QAAA,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE;YAAE;AAC5B,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC;AAC7B,QAAA,IAAI;YACF,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC;gBACvC,MAAM;gBACN,OAAO,EAAE,IAAI,CAAC,SAAS;gBACvB,eAAe;AAChB,aAAA,CAAC;YACF,IAAI,GAAG,CAAC,IAAI;AAAE,gBAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,KAAK,CAAC,GAAG,IAAI,EAAE,GAAG,CAAC,IAAK,CAAC,CAAC;YAClE,IAAI,CAAC,WAAW,EAAE;QACpB;gBAAU;AACR,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC;QAChC;IACF;uGApGW,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAxB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,wBAAwB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,EAAA,IAAA,EAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,UAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA3MzB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyMT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EA5MS,QAAQ,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,OAAA,EAAA,OAAA,EAAA,MAAA,EAAA,OAAA,EAAA,YAAA,EAAA,WAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,SAAA,EAAA,SAAA,EAAA,QAAA,EAAA,OAAA,EAAA,UAAA,EAAA,SAAA,EAAA,aAAA,EAAA,MAAA,EAAA,OAAA,EAAA,MAAA,EAAA,SAAA,EAAA,WAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,OAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,EAAA,MAAA,EAAA,SAAA,EAAA,OAAA,EAAA,YAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,SAAA,EAAA,SAAA,EAAA,OAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,SAAA,EAAA,UAAA,EAAA,YAAA,EAAA,OAAA,EAAA,UAAA,EAAA,eAAA,EAAA,aAAA,EAAA,aAAA,EAAA,oBAAA,EAAA,OAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,cAAA,EAAA,WAAA,EAAA,WAAA,EAAA,MAAA,EAAA,UAAA,EAAA,aAAA,EAAA,cAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAChB,WAAW,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,wSAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EADO,QAAQ,wCAE1B,aAAa,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA;;2FA4MJ,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAhNpC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,sBAAsB;AAChC,oBAAA,OAAO,EAAE,CAAC,QAAQ,EAAE,QAAQ;wBAC1B,WAAW;AACX,wBAAA,aAAa,EAAE;AACjB,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyMT,EAAA,CAAA;AACF,iBAAA;;;MCoBY,sBAAsB,CAAA;AACd,IAAA,KAAK,GAAG,MAAM,CAAC,qBAAqB,CAAC;AACvC,IAAA,QAAQ,GAAG,MAAM,CAAC,mBAAmB,CAAC;AACtC,IAAA,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;IAE/B,gBAAgB,GAAG,MAAM,CAAC,KAAK;yFAAC;IAChC,UAAU,GAAG,MAAM,CAAC,KAAK;mFAAC;IACnC,YAAY,GAAG,EAAE;IACjB,mBAAmB,GAAG,EAAE;AACxB,IAAA,aAAa,GAAG,mBAAmB,CAAC,CAAC,CAAC;IAC7B,WAAW,GAAG,mBAAmB;AAE1C,IAAA,WAAA,GAAA;AACE,QAAA,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE;IACzB;AAEA,IAAA,SAAS,CAAC,OAAe,EAAA;QACvB,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,qBAAqB,EAAE,OAAO,CAAC,CAAC;IACxD;IAEA,iBAAiB,GAAA;AACf,QAAA,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC;AAChC,QAAA,IAAI,CAAC,YAAY,GAAG,EAAE;AACtB,QAAA,IAAI,CAAC,mBAAmB,GAAG,EAAE;AAC7B,QAAA,IAAI,CAAC,aAAa,GAAG,mBAAmB,CAAC,CAAC,CAAC;IAC7C;AAEA,IAAA,MAAM,WAAW,GAAA;AACf,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;YAAE;AAC/B,QAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC;AACzB,QAAA,IAAI;AACF,YAAA,MAAM,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;gBACzB,IAAI,EAAE,IAAI,CAAC,YAAY;AACvB,gBAAA,WAAW,EAAE,IAAI,CAAC,mBAAmB,IAAI,SAAS;gBAClD,KAAK,EAAE,IAAI,CAAC,aAAa;AAC1B,aAAA,CAAC;AACF,YAAA,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE;YAC7B,IAAI,CAAC,iBAAiB,EAAE;QAC1B;gBAAU;AACR,YAAA,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,KAAK,CAAC;QAC5B;IACF;uGAzCW,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAtB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,sBAAsB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA1OvB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwOT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAzOS,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,wSAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAE,QAAQ,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,SAAA,EAAA,SAAA,EAAA,QAAA,EAAA,OAAA,EAAA,UAAA,EAAA,SAAA,EAAA,aAAA,EAAA,MAAA,EAAA,OAAA,EAAA,MAAA,EAAA,SAAA,EAAA,WAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,MAAA,EAAA,cAAA,EAAA,OAAA,EAAA,WAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,SAAA,EAAA,SAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,SAAA,EAAA,SAAA,EAAA,OAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,SAAA,EAAA,OAAA,EAAA,UAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,WAAA,EAAA,aAAA,EAAA,aAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,OAAA,EAAA,YAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,QAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,cAAA,EAAA,WAAA,EAAA,WAAA,EAAA,MAAA,EAAA,UAAA,EAAA,aAAA,EAAA,cAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAA,EAAA,CAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,EAAA,EAAA,IAAA,EAAA,MAAA,EAAA,IAAA,EAAE,aAAa,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA;;2FA2OrC,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBA7OlC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,oBAAoB;AAC9B,oBAAA,OAAO,EAAE,CAAC,aAAa,EAAE,QAAQ,EAAE,aAAa,CAAC;AACjD,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwOT,EAAA,CAAA;AACF,iBAAA;;;;;;;;MCknBY,sBAAsB,CAAA;AACd,IAAA,KAAK,GAAG,MAAM,CAAC,qBAAqB,CAAC;AACvC,IAAA,OAAO,GAAG,MAAM,CAAC,cAAc,CAAC;AAChC,IAAA,OAAO,GAAG,MAAM,CAAC,kBAAkB,CAAC;AACpC,IAAA,mBAAmB,GAAG,MAAM,CAAC,mBAAmB,CAAC;AACjD,IAAA,cAAc,GAAG,MAAM,CAAC,cAAc,CAAC;AACvC,IAAA,gBAAgB,GAAG,MAAM,CAAC,gBAAgB,EAAE;AAC3D,QAAA,QAAQ,EAAE,IAAI;AACf,KAAA,CAAC;AACe,IAAA,UAAU,GAAG,MAAM,CAAC,UAAU,CAAC;IAExC,SAAS,CACf,GAAW,EACX,IAAsC,EAAA;AAEtC,QAAA,OAAO,IAAI,CAAC,gBAAgB,EAAE,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,IAAI,GAAG;IAC3D;IAES,OAAO,GAAG,KAAK,CAAC,QAAQ;gFAAU;IAElC,QAAQ,GAAG,MAAM,CAAW,OAAO;iFAAC;IACpC,YAAY,GAAG,MAAM,CAAC,KAAK;qFAAC;IAC5B,WAAW,GAAG,MAAM,CAAe,IAAI;oFAAC;IACxC,YAAY,GAAG,MAAM,CAAC,EAAE;qFAAC;IACzB,iBAAiB,GAAG,MAAM,CAAC,KAAK;0FAAC;IACjC,YAAY,GAAG,MAAM,CAAC,KAAK;qFAAC;IAC5B,gBAAgB,GAAG,MAAM,CAAC,KAAK;yFAAC;IAChC,aAAa,GAAG,MAAM,CAAC,KAAK;sFAAC;IAC7B,iBAAiB,GAAG,MAAM,CAAC,KAAK;0FAAC;IACjC,cAAc,GAAG,MAAM,CAAC,KAAK;uFAAC;IAE9B,aAAa,GAAG,MAAM,CAAgB,IAAI;sFAAC;IAC3C,oBAAoB,GAAG,MAAM,CAAC,EAAE;6FAAC;IACjC,mBAAmB,GAAG,MAAM,CAAC,KAAK;4FAAC;IACnC,aAAa,GAAG,MAAM,CAAC,KAAK;sFAAC;IAEtC,WAAW,GAAG,EAAE;IAChB,YAAY,GAAG,EAAE;AACjB,IAAA,aAAa,GAAG,mBAAmB,CAAC,CAAC,CAAC;IACtC,kBAAkB,GAAkB,IAAI;IACxC,aAAa,GAAG,QAAQ;IACxB,aAAa,GAAG,EAAE;IAClB,oBAAoB,GAAG,EAAE;AACzB,IAAA,cAAc,GAAG,mBAAmB,CAAC,CAAC,CAAC;IAE9B,iBAAiB,GAAG,mBAAmB;AAEvC,IAAA,iBAAiB,GAAG;AAC3B,QAAA,EAAE,QAAQ,EAAE,gCAAgC,EAAE,KAAK,EAAE,OAAO,EAAE;AAC9D,QAAA,EAAE,QAAQ,EAAE,iCAAiC,EAAE,KAAK,EAAE,QAAQ,EAAE;AAChE,QAAA,EAAE,QAAQ,EAAE,iCAAiC,EAAE,KAAK,EAAE,QAAQ,EAAE;KACjE;AAEQ,IAAA,YAAY,GAAG,QAAQ,CAAa,MAC3C,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,KACvC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,MAAM;AACxB,QAAA,GAAG,IAAI;QACP,QAAQ,EAAE,IAAI,CAAC,IAAI;QACnB,SAAS,EAAE,IAAI,CAAC,KAAK;AACtB,KAAA,CAAC,CAAC,CACJ;qFACF;IAEQ,WAAW,GAAG,QAAQ,CAAC,MAC9B,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;oFAC7C;AAED,IAAA,WAAA,GAAA;QACE,MAAM,CAAC,MAAK;AACV,YAAA,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE;AACzB,YAAA,SAAS,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;AAC3C,QAAA,CAAC,CAAC;AACF,QAAA,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;IAC1D;AAEA,IAAA,WAAW,CAAC,IAAe,EAAA;AACzB,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;QAC1B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;AAC9B,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;IAC7B;AAEA,IAAA,WAAW,CAAC,IAAW,EAAA;AACrB,QAAA,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC;IACpC;AAEA,IAAA,YAAY,CAAC,IAAW,EAAA;AACtB,QAAA,IAAI,CAAC,mBAAmB,CAAC,OAAO,CAAC;AAC/B,YAAA,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,4BAA4B,EAAE;gBACpD,IAAI,EAAE,IAAI,CAAC,KAAK;aACjB,CAAC;AACF,YAAA,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,oBAAoB,CAAC;AAC5C,YAAA,IAAI,EAAE,sBAAsB;AAC5B,YAAA,sBAAsB,EAAE,iBAAiB;YACzC,MAAM,EAAE,YAAW;AACjB,gBAAA,IAAI;oBACF,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC;AACpC,oBAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;AACtB,wBAAA,QAAQ,EAAE,SAAS;AACnB,wBAAA,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC;AACzC,wBAAA,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,qBAAqB,CAAC;AAC9C,qBAAA,CAAC;gBACJ;gBAAE,MAAM,EAAC;YACX,CAAC;AACF,SAAA,CAAC;IACJ;AAEA,IAAA,UAAU,CAAC,IAAW,EAAA;AACpB,QAAA,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC;QAC1B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;AAClC,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;AAC3B,QAAA,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC;IAC7B;AAEA,IAAA,aAAa,CAAC,UAAkB,EAAA;QAC9B,QACE,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,UAAU,CAAC,EAAE,QAAQ;AACnE,YAAA,IAAI;IAER;AAEA,IAAA,iBAAiB,CAAC,UAAkB,EAAA;QAClC,OAAO,cAAc,CAAC,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,CAAC;IACvD;AAEA,IAAA,cAAc,CAAC,MAAwB,EAAA;AACrC,QAAA,OAAO,cAAc,CAAC,MAAM,CAAC,QAAQ,CAAC;IACxC;AAEA,IAAA,WAAW,CAAC,MAAwB,EAAA;AAClC,QAAA,OAAO,iBAAiB,CAAC,MAAM,CAAC,MAAM,CAAC;IACzC;AAEA,IAAA,eAAe,CAAC,MAAc,EAAA;AAC5B,QAAA,OAAO,iBAAiB,CAAC,MAAM,CAAC;IAClC;AAEA,IAAA,cAAc,CAAC,IAAY,EAAA;AACzB,QAAA,MAAM,GAAG,GAA2B;AAClC,YAAA,KAAK,EAAE,sDAAsD;AAC7D,YAAA,KAAK,EAAE,oDAAoD;AAC3D,YAAA,MAAM,EAAE,wCAAwC;AAChD,YAAA,MAAM,EAAE,wCAAwC;SACjD;QACD,OAAO,GAAG,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC;IACnC;IAEmB,gBAAgB,GAAG,oBAAoB;IACvC,SAAS,GAAG,aAAa;IAE5C,MAAM,UAAU,CAAC,KAA2B,EAAA;QAC1C,IAAI,KAAK,CAAC,iBAAiB,KAAK,KAAK,CAAC,SAAS,EAAE;AAC/C,YAAA,eAAe,CACb,KAAK,CAAC,SAAS,CAAC,IAAI,EACpB,KAAK,CAAC,aAAa,EACnB,KAAK,CAAC,YAAY,CACnB;QACH;aAAO;YACL,iBAAiB,CACf,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAC5B,KAAK,CAAC,SAAS,CAAC,IAAI,EACpB,KAAK,CAAC,aAAa,EACnB,KAAK,CAAC,YAAY,CACnB;AACD,YAAA,MAAM,IAAI,GAAG,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC;AACrD,YAAA,MAAM,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;gBAC1B,MAAM,EAAE,IAAI,CAAC,EAAE;AACf,gBAAA,YAAY,EAAE,KAAK,CAAC,SAAS,CAAC,EAAE;AAChC,gBAAA,QAAQ,EAAE,KAAK,CAAC,YAAY,GAAG,GAAG;AACnC,aAAA,CAAC;QACJ;IACF;IAEA,MAAM,UAAU,CAAC,KAAwC,EAAA;AACvD,QAAA,IAAI,KAAK,CAAC,aAAa,KAAK,KAAK,CAAC,YAAY;YAAE;QAChD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE,CAAC,KAAK,EAAE;QACjD,eAAe,CAAC,KAAK,EAAE,KAAK,CAAC,aAAa,EAAE,KAAK,CAAC,YAAY,CAAC;AAC/D,QAAA,MAAM,UAAU,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;AACzC,QAAA,MAAM,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,UAAU,CAAC;IAC3D;AAEA,IAAA,eAAe,CAAC,IAAe,EAAA;QAC7B,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/B,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;IAC1C;IAEA,gBAAgB,GAAA;AACd,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;AAC5B,QAAA,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,EAAE,CAAC;IACnC;AAEA,IAAA,MAAM,cAAc,GAAA;AAClB,QAAA,MAAM,EAAE,GAAG,IAAI,CAAC,aAAa,EAAE;QAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,oBAAoB,EAAE,CAAC,IAAI,EAAE;QAC/C,IAAI,CAAC,gBAAgB,EAAE;AACvB,QAAA,IAAI,CAAC,EAAE,IAAI,CAAC,IAAI;YAAE;QAClB,MAAM,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,EAAE,EAAE,IAAI,CAAC;AACrC,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;AACtB,YAAA,QAAQ,EAAE,SAAS;AACnB,YAAA,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC;AACzC,YAAA,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,0BAA0B,CAAC;AACnD,SAAA,CAAC;IACJ;AAEA,IAAA,mBAAmB,CAAC,KAAiB,EAAA;AACnC,QAAA,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC,IAAI;QAC/B,IAAI,CAAC,oBAAoB,GAAG,KAAK,CAAC,WAAW,IAAI,EAAE;AACnD,QAAA,IAAI,CAAC,cAAc,GAAG,KAAK,CAAC,KAAK;AACjC,QAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC;IACpC;AAEA,IAAA,MAAM,SAAS,GAAA;QACb,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE;QACtC,IAAI,CAAC,KAAK,IAAI,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE;YAAE;AAC1C,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;AAC5B,QAAA,IAAI;AACF,YAAA,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;gBAC3B,EAAE,EAAE,KAAK,CAAC,EAAE;AACZ,gBAAA,IAAI,EAAE,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE;gBAC/B,WAAW,EAAE,IAAI,CAAC,oBAAoB,CAAC,IAAI,EAAE,IAAI,SAAS;gBAC1D,KAAK,EAAE,IAAI,CAAC,cAAc;AAC3B,aAAA,CAAC;AACF,YAAA,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,KAAK,CAAC;AACnC,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC;AACtB,gBAAA,QAAQ,EAAE,SAAS;AACnB,gBAAA,OAAO,EAAE,IAAI,CAAC,SAAS,CAAC,gBAAgB,CAAC;AACzC,gBAAA,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,2BAA2B,CAAC;AACpD,aAAA,CAAC;QACJ;gBAAU;AACR,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC;QAC/B;IACF;AAEA,IAAA,MAAM,QAAQ,GAAA;AACZ,QAAA,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE;YAAE;AAC/B,QAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC;AAC5B,QAAA,IAAI;YACF,MAAM,IAAI,CAAC,KAAK,CAAC,QAAQ,CACvB,IAAI,CAAC,OAAO,EAAE,EACd,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,EACxB,IAAI,CAAC,aAAa,CACnB;AACD,YAAA,IAAI,CAAC,YAAY,GAAG,EAAE;AACtB,YAAA,IAAI,CAAC,aAAa,GAAG,mBAAmB,CAAC,CAAC,CAAC;QAC7C;gBAAU;AACR,YAAA,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,KAAK,CAAC;QAC/B;IACF;IAEA,MAAM,WAAW,CAAC,OAAe,EAAA;QAC/B,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,OAAO,CAAC;IACvC;AAEA,IAAA,MAAM,SAAS,GAAA;QACb,IAAI,CAAC,IAAI,CAAC,kBAAkB;YAAE;AAC9B,QAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC;AAC7B,QAAA,IAAI;AACF,YAAA,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,kBAAkB,EAAE,IAAI,CAAC,aAAa,CAAC;YACvE,IAAI,CAAC,eAAe,EAAE;QACxB;gBAAU;AACR,YAAA,IAAI,CAAC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC;QAChC;IACF;IAEA,eAAe,GAAA;AACb,QAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI;AAC9B,QAAA,IAAI,CAAC,aAAa,GAAG,QAAQ;IAC/B;IAEA,MAAM,YAAY,CAAC,MAAc,EAAA;QAC/B,MAAM,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,MAAM,CAAC;IACvC;AAEA,IAAA,MAAM,OAAO,GAAA;AACX,QAAA,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE;YAAE;AAC9B,QAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC;AAC3B,QAAA,IAAI;AACF,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC,MAAM,GAAG,GAAG;AAChD,YAAA,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;AACxB,gBAAA,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE;gBACvB,IAAI,EAAE,IAAI,CAAC,WAAW;gBACtB,QAAQ;AACT,aAAA,CAAC;YACF,MAAM,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC;AAC1C,YAAA,IAAI,CAAC,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC;AACjC,YAAA,IAAI,CAAC,WAAW,GAAG,EAAE;QACvB;gBAAU;AACR,YAAA,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,KAAK,CAAC;QAC9B;IACF;uGAhSW,sBAAsB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAtB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,sBAAsB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,EAAA,OAAA,EAAA,EAAA,iBAAA,EAAA,SAAA,EAAA,UAAA,EAAA,SAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAryBvB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmyBT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EA5yBC,QAAQ,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,OAAA,EAAA,OAAA,EAAA,MAAA,EAAA,OAAA,EAAA,YAAA,EAAA,WAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,cAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,MAAA,EAAA,UAAA,EAAA,MAAA,EAAA,SAAA,EAAA,SAAA,EAAA,QAAA,EAAA,OAAA,EAAA,UAAA,EAAA,SAAA,EAAA,aAAA,EAAA,MAAA,EAAA,OAAA,EAAA,MAAA,EAAA,SAAA,EAAA,WAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,MAAA,EAAA,cAAA,EAAA,OAAA,EAAA,WAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,YAAA,EAAA,QAAA,EAAA,OAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,UAAA,EAAA,MAAA,EAAA,SAAA,EAAA,OAAA,EAAA,YAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,kBAAA,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,SAAA,EAAA,SAAA,EAAA,MAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,aAAA,EAAA,aAAA,EAAA,aAAA,EAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,mBAAA,EAAA,mBAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,oBAAA,EAAA,WAAA,EAAA,SAAA,EAAA,aAAA,EAAA,cAAA,EAAA,WAAA,EAAA,SAAA,EAAA,SAAA,EAAA,SAAA,EAAA,YAAA,EAAA,OAAA,EAAA,UAAA,EAAA,UAAA,EAAA,UAAA,EAAA,WAAA,EAAA,WAAA,EAAA,OAAA,EAAA,kBAAA,EAAA,qBAAA,EAAA,eAAA,EAAA,uBAAA,EAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,UAAA,EAAA,QAAA,EAAA,QAAA,EAAA,QAAA,EAAA,SAAA,EAAA,SAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,aAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,SAAA,EAAA,SAAA,EAAA,OAAA,EAAA,YAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,UAAA,EAAA,MAAA,EAAA,CAAA,QAAA,EAAA,SAAA,EAAA,OAAA,EAAA,UAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,WAAA,EAAA,WAAA,EAAA,aAAA,EAAA,aAAA,EAAA,oBAAA,EAAA,UAAA,EAAA,OAAA,EAAA,YAAA,EAAA,aAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,QAAA,EAAA,YAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,iBAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,uBAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,cAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,OAAA,EAAA,MAAA,EAAA,SAAA,EAAA,MAAA,EAAA,cAAA,EAAA,UAAA,EAAA,SAAA,EAAA,YAAA,EAAA,cAAA,EAAA,WAAA,EAAA,OAAA,EAAA,oBAAA,EAAA,uBAAA,EAAA,2BAAA,EAAA,YAAA,EAAA,YAAA,EAAA,oBAAA,EAAA,aAAA,EAAA,kBAAA,EAAA,eAAA,EAAA,UAAA,EAAA,eAAA,EAAA,kBAAA,EAAA,eAAA,EAAA,eAAA,EAAA,uBAAA,EAAA,WAAA,EAAA,WAAA,EAAA,eAAA,EAAA,SAAA,EAAA,WAAA,EAAA,iBAAA,EAAA,sBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,iBAAA,EAAA,iBAAA,EAAA,qBAAA,EAAA,eAAA,EAAA,iBAAA,EAAA,uBAAA,EAAA,4BAAA,EAAA,YAAA,EAAA,QAAA,EAAA,UAAA,EAAA,aAAA,EAAA,eAAA,EAAA,mBAAA,EAAA,aAAA,EAAA,eAAA,EAAA,aAAA,EAAA,kBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,gBAAA,EAAA,QAAA,EAAA,YAAA,EAAA,MAAA,EAAA,CAAA,UAAA,EAAA,iBAAA,EAAA,eAAA,EAAA,mBAAA,EAAA,UAAA,EAAA,cAAA,EAAA,WAAA,EAAA,WAAA,EAAA,MAAA,EAAA,UAAA,EAAA,aAAA,EAAA,cAAA,EAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,SAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,MAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACR,cAAc,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,WAAA,EAAA,QAAA,EAAA,8BAAA,EAAA,MAAA,EAAA,CAAA,wBAAA,EAAA,iBAAA,EAAA,wBAAA,EAAA,IAAA,EAAA,qBAAA,EAAA,qBAAA,EAAA,4BAAA,EAAA,2BAAA,EAAA,0BAAA,EAAA,+BAAA,EAAA,2BAAA,EAAA,6BAAA,EAAA,sBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,oBAAA,EAAA,oBAAA,EAAA,mBAAA,EAAA,mBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,OAAA,EAAA,QAAA,EAAA,WAAA,EAAA,MAAA,EAAA,CAAA,aAAA,EAAA,iBAAA,EAAA,oBAAA,EAAA,iBAAA,EAAA,mBAAA,EAAA,yBAAA,EAAA,iBAAA,EAAA,0BAAA,EAAA,qBAAA,EAAA,yBAAA,EAAA,cAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,EAAA,iBAAA,EAAA,cAAA,EAAA,gBAAA,EAAA,eAAA,EAAA,gBAAA,EAAA,cAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,IAAA,CAAA,aAAA,EAAA,QAAA,EAAA,iBAAA,EAAA,MAAA,EAAA,CAAA,uBAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EACd,aAAa,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAC,EAAA,CAAA,oBAAA,EAAA,QAAA,EAAA,wSAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,eAAA,EAAA,QAAA,EAAA,2CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAAA,EAAA,CAAA,OAAA,EAAA,QAAA,EAAA,qDAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,UAAA,EAAA,SAAA,EAAA,gBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,CAAA,EAAA,QAAA,EAAA,CAAA,SAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACb,iBAAiB,EAAA,QAAA,EAAA,cAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,WAAA,EAAA,WAAA,EAAA,aAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACjB,uBAAuB,EAAA,QAAA,EAAA,qBAAA,EAAA,MAAA,EAAA,CAAA,SAAA,EAAA,MAAA,EAAA,SAAA,EAAA,QAAA,EAAA,SAAA,EAAA,QAAA,CAAA,EAAA,OAAA,EAAA,CAAA,eAAA,EAAA,OAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EACvB,wBAAwB,EAAA,QAAA,EAAA,sBAAA,EAAA,MAAA,EAAA,CAAA,MAAA,CAAA,EAAA,OAAA,EAAA,CAAA,YAAA,EAAA,UAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAExB,mBAAmB,oLADnB,aAAa,EAAA,IAAA,EAAA,WAAA,EAAA,CAAA,EAAA,CAAA;;2FAwyBJ,sBAAsB,EAAA,UAAA,EAAA,CAAA;kBAjzBlC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,oBAAoB;AAC9B,oBAAA,OAAO,EAAE;wBACP,QAAQ;wBACR,cAAc;wBACd,aAAa;wBACb,iBAAiB;wBACjB,uBAAuB;wBACvB,wBAAwB;wBACxB,aAAa;wBACb,mBAAmB;AACpB,qBAAA;AACD,oBAAA,QAAQ,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAmyBT,EAAA,CAAA;AACF,iBAAA;;;;;;;;ACr2BM,MAAM,qBAAqB,GAAG;;AAEnC,IAAA,sBAAsB,EAAE,iBAAiB;AACzC,IAAA,2BAA2B,EAAE,4BAA4B;AACzD,IAAA,gCAAgC,EAAE,6BAA6B;AAC/D,IAAA,wBAAwB,EAAE,8BAA8B;AACxD,IAAA,4BAA4B,EAAE,+BAA+B;AAC7D,IAAA,2BAA2B,EAAE,4BAA4B;AACzD,IAAA,gCAAgC,EAAE,6BAA6B;AAC/D,IAAA,2BAA2B,EAAE,4BAA4B;AACzD,IAAA,4BAA4B,EAAE,6BAA6B;AAC3D,IAAA,yBAAyB,EAAE,uBAAuB;AAClD,IAAA,2BAA2B,EAAE,2BAA2B;AACxD,IAAA,6BAA6B,EAAE,wBAAwB;AACvD,IAAA,kCAAkC,EAAE,gCAAgC;AACpE,IAAA,mCAAmC,EAAE,sCAAsC;AAE3E,IAAA,qBAAqB,EAAE,gBAAgB;AACvC,IAAA,0BAA0B,EAAE,2BAA2B;AACvD,IAAA,+BAA+B,EAAE,4BAA4B;AAC7D,IAAA,uBAAuB,EAAE,6BAA6B;AACtD,IAAA,2BAA2B,EAAE,8BAA8B;AAC3D,IAAA,0BAA0B,EAAE,2BAA2B;AACvD,IAAA,+BAA+B,EAAE,4BAA4B;AAC7D,IAAA,0BAA0B,EAAE,2BAA2B;AACvD,IAAA,2BAA2B,EAAE,4BAA4B;AACzD,IAAA,2BAA2B,EAAE,8BAA8B;AAE3D,IAAA,gBAAgB,EAAE,gBAAgB;AAClC,IAAA,qBAAqB,EAAE,2BAA2B;AAClD,IAAA,0BAA0B,EAAE,4BAA4B;AACxD,IAAA,kBAAkB,EAAE,6BAA6B;AACjD,IAAA,sBAAsB,EAAE,8BAA8B;AACtD,IAAA,qBAAqB,EAAE,2BAA2B;AAClD,IAAA,0BAA0B,EAAE,4BAA4B;AACxD,IAAA,qBAAqB,EAAE,2BAA2B;AAClD,IAAA,sBAAsB,EAAE,4BAA4B;AACpD,IAAA,mBAAmB,EAAE,yBAAyB;AAC9C,IAAA,qBAAqB,EAAE,4BAA4B;AACnD,IAAA,gCAAgC,EAAE,gCAAgC;AAElE,IAAA,sBAAsB,EAAE,iBAAiB;AACzC,IAAA,2BAA2B,EAAE,4BAA4B;AACzD,IAAA,gCAAgC,EAAE,6BAA6B;AAC/D,IAAA,wBAAwB,EAAE,8BAA8B;AACxD,IAAA,4BAA4B,EAAE,+BAA+B;AAC7D,IAAA,2BAA2B,EAAE,4BAA4B;AACzD,IAAA,gCAAgC,EAAE,6BAA6B;AAC/D,IAAA,2BAA2B,EAAE,4BAA4B;AACzD,IAAA,4BAA4B,EAAE,6BAA6B;AAE3D,IAAA,wBAAwB,EAAE,mBAAmB;AAC7C,IAAA,6BAA6B,EAAE,4BAA4B;AAC3D,IAAA,kCAAkC,EAAE,6BAA6B;AACjE,IAAA,0BAA0B,EAAE,gCAAgC;AAC5D,IAAA,8BAA8B,EAAE,iCAAiC;AACjE,IAAA,6BAA6B,EAAE,8BAA8B;AAC7D,IAAA,kCAAkC,EAAE,+BAA+B;AACnE,IAAA,6BAA6B,EAAE,8BAA8B;AAC7D,IAAA,8BAA8B,EAAE,+BAA+B;AAC/D,IAAA,wBAAwB,EAAE,oCAAoC;AAE9D,IAAA,2BAA2B,EAAE,aAAa;AAC1C,IAAA,8BAA8B,EAAE,yCAAyC;AACzE,IAAA,wBAAwB,EAAE,WAAW;AACrC,IAAA,qCAAqC,EAAE,sBAAsB;AAC7D,IAAA,4CAA4C,EAAE,sBAAsB;AACpE,IAAA,gCAAgC,EAAE,aAAa;AAC/C,IAAA,0BAA0B,EAAE,eAAe;AAC3C,IAAA,+BAA+B,EAAE,wCAAwC;AACzE,IAAA,4BAA4B,EAAE,SAAS;AACvC,IAAA,0BAA0B,EAAE,OAAO;AACnC,IAAA,0BAA0B,EAAE,OAAO;AAEnC,IAAA,6BAA6B,EAAE,UAAU;AACzC,IAAA,6BAA6B,EAAE,UAAU;AACzC,IAAA,oCAAoC,EAAE,iBAAiB;AACvD,IAAA,+BAA+B,EAC7B,+CAA+C;AACjD,IAAA,uBAAuB,EAAE,UAAU;AACnC,IAAA,8BAA8B,EAAE,WAAW;AAC3C,IAAA,oCAAoC,EAAE,kBAAkB;AACxD,IAAA,0BAA0B,EAAE,aAAa;AAEzC,IAAA,mCAAmC,EAAE,SAAS;AAC9C,IAAA,kCAAkC,EAAE,gBAAgB;AACpD,IAAA,yBAAyB,EAAE,YAAY;AACvC,IAAA,gCAAgC,EAAE,iBAAiB;AACnD,IAAA,gCAAgC,EAAE,MAAM;AACxC,IAAA,sCAAsC,EAAE,yBAAyB;AACjE,IAAA,gCAAgC,EAAE,MAAM;AACxC,IAAA,sCAAsC,EAAE,aAAa;AACrD,IAAA,gCAAgC,EAAE,OAAO;AACzC,IAAA,gCAAgC,EAAE,OAAO;AACzC,IAAA,iCAAiC,EAAE,QAAQ;AAC3C,IAAA,iCAAiC,EAAE,QAAQ;AAE3C,IAAA,kCAAkC,EAAE,QAAQ;AAC5C,IAAA,iCAAiC,EAAE,eAAe;AAClD,IAAA,+BAA+B,EAAE,YAAY;AAC7C,IAAA,qCAAqC,EAAE,mBAAmB;AAC1D,IAAA,gCAAgC,EAAE,OAAO;AACzC,IAAA,wBAAwB,EAAE,WAAW;AACrC,IAAA,8BAA8B,EAAE,gBAAgB;AAEhD,IAAA,yBAAyB,EAAE,YAAY;AACvC,IAAA,+BAA+B,EAAE,YAAY;AAC7C,IAAA,sCAAsC,EAAE,aAAa;AAErD,IAAA,yBAAyB,EAAE,OAAO;AAClC,IAAA,wBAAwB,EAAE,MAAM;AAEhC,IAAA,0BAA0B,EAAE,OAAO;AACnC,IAAA,yBAAyB,EAAE,MAAM;AACjC,IAAA,6BAA6B,EAAE,UAAU;AACzC,IAAA,6BAA6B,EAAE,UAAU;AACzC,IAAA,6BAA6B,EAAE,UAAU;AACzC,IAAA,0BAA0B,EAAE,eAAe;AAE3C,IAAA,wBAAwB,EAAE,UAAU;AACpC,IAAA,sBAAsB,EAAE,WAAW;AACnC,IAAA,uBAAuB,EAAE,OAAO;AAChC,IAAA,6BAA6B,EAAE,YAAY;AAC3C,IAAA,mCAAmC,EAAE,sBAAsB;AAC3D,IAAA,0BAA0B,EAAE,UAAU;AACtC,IAAA,gCAAgC,EAAE,iBAAiB;AACnD,IAAA,0BAA0B,EAAE,UAAU;AACtC,IAAA,gCAAgC,EAAE,aAAa;AAC/C,IAAA,0BAA0B,EAAE,UAAU;AACtC,IAAA,gCAAgC,EAAE,wBAAwB;AAC1D,IAAA,wBAAwB,EAAE,QAAQ;AAClC,IAAA,8BAA8B,EAAE,eAAe;AAE/C,IAAA,mBAAmB,EAAE,KAAK;AAC1B,IAAA,sBAAsB,EAAE,QAAQ;AAChC,IAAA,oBAAoB,EAAE,MAAM;AAC5B,IAAA,sBAAsB,EAAE,QAAQ;AAEhC,IAAA,+BAA+B,EAAE,gBAAgB;AACjD,IAAA,4BAA4B,EAAE,UAAU;AACxC,IAAA,4BAA4B,EAAE,iBAAiB;AAC/C,IAAA,iCAAiC,EAAE,kBAAkB;AACrD,IAAA,uBAAuB,EAAE,KAAK;AAC9B,IAAA,6BAA6B,EAAE,WAAW;AAC1C,IAAA,kBAAkB,EAAE,WAAW;AAC/B,IAAA,oBAAoB,EAAE,aAAa;AACnC,IAAA,oBAAoB,EAAE,OAAO;AAC7B,IAAA,gCAAgC,EAAE,kBAAkB;;;AC/I/C,MAAM,mBAAmB,GAAW;AACzC,IAAA;AACE,QAAA,IAAI,EAAE,EAAE;AACR,QAAA,OAAO,EAAE;YACP,YAAY,EAAE,wBAAwB,CAAC;gBACrC,OAAO,EAAE,CAAC,cAAc,CAAC;AACzB,gBAAA,gBAAgB,EAAE,EAAE,GAAG,qBAAqB,EAAE,GAAG,eAAe,EAAE;aACnE,CAAC;AACH,SAAA;AACD,QAAA,aAAa,EAAE,MACb,uEAA4D,CAAC,IAAI,CAC/D,CAAC,CAAC,KAAK,CAAC,CAAC,sBAAsB,CAChC;AACJ,KAAA;AACD,IAAA;AACE,QAAA,IAAI,EAAE,gBAAgB;AACtB,QAAA,OAAO,EAAE;YACP,YAAY,EAAE,wBAAwB,CAAC;gBACrC,OAAO,EAAE,CAAC,cAAc,CAAC;AACzB,gBAAA,gBAAgB,EAAE,EAAE,GAAG,qBAAqB,EAAE,GAAG,eAAe,EAAE;aACnE,CAAC;AACH,SAAA;AACD,QAAA,aAAa,EAAE,MACb,uEAA4D,CAAC,IAAI,CAC/D,CAAC,CAAC,KAAK,CAAC,CAAC,sBAAsB,CAChC;AACJ,KAAA;;;AC9BH;;AAEG;;;;"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@flusys/ng-task-manager",
3
- "version": "6.1.1",
3
+ "version": "6.1.3",
4
4
  "description": "Task management module with dynamic boards, lists, and real-time collaboration",
5
5
  "license": "MIT",
6
6
  "peerDependencies": {
@@ -9,9 +9,9 @@
9
9
  "@angular/core": ">=22.0.0",
10
10
  "@angular/forms": ">=22.0.0",
11
11
  "@angular/router": ">=22.0.0",
12
- "@flusys/ng-core": ">=6.1.1",
13
- "@flusys/ng-shared": ">=6.1.1",
14
- "@flusys/ng-ui": ">=6.1.1",
12
+ "@flusys/ng-core": ">=6.1.3",
13
+ "@flusys/ng-shared": ">=6.1.3",
14
+ "@flusys/ng-ui": ">=6.1.3",
15
15
  "socket.io-client": ">=4.0.0",
16
16
  "rxjs": "^7.8.0"
17
17
  },