@flusys/ng-task-manager 6.0.0-rc.1 → 6.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -811,7 +811,7 @@ class TaskFormDialogComponent {
|
|
|
811
811
|
</div>
|
|
812
812
|
</ng-template>
|
|
813
813
|
</f-dialog>
|
|
814
|
-
`, isInline: true, dependencies: [{ kind: "ngmodule", type: UiModule }, { kind: "directive", type: i1.FButtonDirective, selector: "[fButton]", inputs: ["severity", "text", "outlined", "link", "variant", "rounded", "raised", "fluid", "disabled", "loading", "loadingIcon", "size", "label", "icon", "iconPos", "ariaLabel", "plain"] }, { kind: "component", type: i1.DatePickerComponent, selector: "f-datepicker", inputs: ["placeholder", "dateFormat", "disabled", "readonly", "readonlyInput", "showTime", "timeOnly", "hourFormat", "showSeconds", "selectionMode", "minDate", "maxDate", "disabledDates", "disabledDays", "inputId", "invalid", "touched", "showClear", "inputStyleClass", "showIcon", "iconDisplay", "showButtonBar", "inline", "numberOfMonths", "view", "showOtherMonths", "selectOtherMonths", "firstDayOfWeek", "appendTo", "styleClass", "style"], outputs: ["onBlur", "onSelect", "onShow", "onHide", "onClearClick", "onTodayClick", "onMonthChange", "onYearChange"] }, { kind: "directive", type: i1.InputTextDirective, selector: "[fInputText]", inputs: ["invalid", "touched", "variant", "size", "fluid"] }, { kind: "component", type: i1.MultiSelectComponent, selector: "f-multiselect", inputs: ["options", "optionLabel", "optionValue", "placeholder", "disabled", "filter", "filterBy", "filterMatchMode", "filterLocale", "filterPlaceholder", "resetFilterOnHide", "autofocusFilter", "emptyMessage", "emptyFilterMessage", "inputId", "invalid", "touched", "showClear", "optionDisabled", "display", "maxSelectedLabels", "selectionLimit", "showToggleAll", "styleClass", "style", "readonly", "autofocus", "loading", "loadingIcon", "dropdownIcon", "clearIcon", "group", "optionGroupLabel", "optionGroupChildren", "virtualScroll", "virtualScrollItemSize", "lazy"], outputs: ["onBlur", "onFocus", "onChange", "onFilter", "onShow", "onHide", "onClear", "onLazyLoad", "onSelectAllChange"] }, { kind: "component", type: i1.SelectComponent, selector: "f-select", inputs: ["options", "optionLabel", "optionValue", "placeholder", "disabled", "filter", "filterBy", "filterMatchMode", "filterLocale", "filterPlaceholder", "resetFilterOnHide", "autofocusFilter", "emptyMessage", "emptyFilterMessage", "showClear", "loading", "loadingIcon", "dropdownIcon", "clearIcon", "inputId", "invalid", "touched", "styleClass", "style", "editable", "readonly", "autofocus", "checkmark", "group", "optionGroupLabel", "optionGroupChildren", "virtualScroll", "virtualScrollItemSize", "lazy"], outputs: ["onFilter", "onChange", "onShow", "onHide", "onBlur", "onFocus", "onClear", "onLazyLoad"] }, { kind: "directive", type: i1.TextareaDirective, selector: "[fTextarea]", inputs: ["invalid", "touched", "variant", "fluid", "autoResize"], outputs: ["onResize"] }, { kind: "component", type: i1.DialogComponent, selector: "f-dialog", inputs: ["header", "visible", "modal", "closable", "closeOnEscape", "dismissableMask", "resizable", "draggable", "maximizable", "blockScroll", "returnFocusOnClose", "position", "style", "styleClass", "breakpoints"], outputs: ["visibleChange", "onShow", "onHide", "onMaximize"] }, { kind: "component", type: i1.UiIconComponent, selector: "ui-icon", inputs: ["name", "size", "spin", "fill", "severity"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
|
|
814
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: UiModule }, { kind: "directive", type: i1.FButtonDirective, selector: "[fButton]", inputs: ["severity", "text", "outlined", "link", "variant", "rounded", "raised", "fluid", "disabled", "loading", "loadingIcon", "size", "label", "icon", "iconPos", "ariaLabel", "plain"] }, { kind: "component", type: i1.DatePickerComponent, selector: "f-datepicker", inputs: ["placeholder", "dateFormat", "disabled", "readonly", "readonlyInput", "showTime", "timeOnly", "hourFormat", "showSeconds", "selectionMode", "minDate", "maxDate", "disabledDates", "disabledDays", "inputId", "invalid", "touched", "showClear", "inputStyleClass", "showIcon", "iconDisplay", "showButtonBar", "inline", "numberOfMonths", "view", "showOtherMonths", "selectOtherMonths", "firstDayOfWeek", "appendTo", "styleClass", "style"], outputs: ["onBlur", "onSelect", "onShow", "onHide", "onClearClick", "onTodayClick", "onMonthChange", "onYearChange"] }, { kind: "directive", type: i1.InputTextDirective, selector: "[fInputText]", inputs: ["invalid", "touched", "variant", "size", "fluid"] }, { kind: "component", type: i1.MultiSelectComponent, selector: "f-multiselect", inputs: ["options", "optionLabel", "optionValue", "placeholder", "disabled", "filter", "filterBy", "filterMatchMode", "filterLocale", "filterPlaceholder", "resetFilterOnHide", "autofocusFilter", "emptyMessage", "emptyFilterMessage", "inputId", "invalid", "touched", "showClear", "optionDisabled", "display", "maxSelectedLabels", "selectionLimit", "showToggleAll", "styleClass", "style", "appendTo", "readonly", "autofocus", "loading", "loadingIcon", "dropdownIcon", "clearIcon", "group", "optionGroupLabel", "optionGroupChildren", "virtualScroll", "virtualScrollItemSize", "lazy"], outputs: ["onBlur", "onFocus", "onChange", "onFilter", "onShow", "onHide", "onClear", "onLazyLoad", "onSelectAllChange"] }, { kind: "component", type: i1.SelectComponent, selector: "f-select", inputs: ["options", "optionLabel", "optionValue", "placeholder", "disabled", "filter", "filterBy", "filterMatchMode", "filterLocale", "filterPlaceholder", "resetFilterOnHide", "autofocusFilter", "emptyMessage", "emptyFilterMessage", "showClear", "loading", "loadingIcon", "dropdownIcon", "clearIcon", "inputId", "invalid", "touched", "styleClass", "style", "appendTo", "editable", "readonly", "autofocus", "checkmark", "group", "optionGroupLabel", "optionGroupChildren", "virtualScroll", "virtualScrollItemSize", "lazy"], outputs: ["onFilter", "onChange", "onShow", "onHide", "onBlur", "onFocus", "onClear", "onLazyLoad"] }, { kind: "directive", type: i1.TextareaDirective, selector: "[fTextarea]", inputs: ["invalid", "touched", "variant", "fluid", "autoResize"], outputs: ["onResize"] }, { kind: "component", type: i1.DialogComponent, selector: "f-dialog", inputs: ["header", "visible", "modal", "closable", "closeOnEscape", "dismissableMask", "resizable", "draggable", "maximizable", "blockScroll", "returnFocusOnClose", "position", "style", "styleClass", "breakpoints"], outputs: ["visibleChange", "onShow", "onHide", "onMaximize"] }, { kind: "component", type: i1.UiIconComponent, selector: "ui-icon", inputs: ["name", "size", "spin", "fill", "severity"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
|
|
815
815
|
}
|
|
816
816
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: TaskFormDialogComponent, decorators: [{
|
|
817
817
|
type: Component,
|
|
@@ -3032,7 +3032,7 @@ class BoardViewPageComponent {
|
|
|
3032
3032
|
</div>
|
|
3033
3033
|
</ng-template>
|
|
3034
3034
|
</f-dialog>
|
|
3035
|
-
`, isInline: true, dependencies: [{ kind: "ngmodule", type: UiModule }, { kind: "component", type: i1.AvatarComponent, selector: "f-avatar", inputs: ["label", "icon", "image", "shape", "size", "color", "styleClass", "ariaLabel", "ariaLabelledBy"], outputs: ["onImageError"] }, { kind: "directive", type: i1.FButtonDirective, selector: "[fButton]", inputs: ["severity", "text", "outlined", "link", "variant", "rounded", "raised", "fluid", "disabled", "loading", "loadingIcon", "size", "label", "icon", "iconPos", "ariaLabel", "plain"] }, { kind: "component", type: i1.SkeletonComponent, selector: "f-skeleton", inputs: ["width", "height", "size", "borderRadius", "shape", "animation", "styleClass"] }, { kind: "component", type: i1.TagComponent, selector: "f-tag", inputs: ["value", "severity", "icon", "rounded", "color", "styleClass", "style"] }, { kind: "directive", type: i1.InputTextDirective, selector: "[fInputText]", inputs: ["invalid", "touched", "variant", "size", "fluid"] }, { kind: "component", type: i1.SelectComponent, selector: "f-select", inputs: ["options", "optionLabel", "optionValue", "placeholder", "disabled", "filter", "filterBy", "filterMatchMode", "filterLocale", "filterPlaceholder", "resetFilterOnHide", "autofocusFilter", "emptyMessage", "emptyFilterMessage", "showClear", "loading", "loadingIcon", "dropdownIcon", "clearIcon", "inputId", "invalid", "touched", "styleClass", "style", "editable", "readonly", "autofocus", "checkmark", "group", "optionGroupLabel", "optionGroupChildren", "virtualScroll", "virtualScrollItemSize", "lazy"], outputs: ["onFilter", "onChange", "onShow", "onHide", "onBlur", "onFocus", "onClear", "onLazyLoad"] }, { kind: "directive", type: i1.TextareaDirective, selector: "[fTextarea]", inputs: ["invalid", "touched", "variant", "fluid", "autoResize"], outputs: ["onResize"] }, { kind: "component", type: i1.DialogComponent, selector: "f-dialog", inputs: ["header", "visible", "modal", "closable", "closeOnEscape", "dismissableMask", "resizable", "draggable", "maximizable", "blockScroll", "returnFocusOnClose", "position", "style", "styleClass", "breakpoints"], outputs: ["visibleChange", "onShow", "onHide", "onMaximize"] }, { kind: "component", type: i1.SortIconComponent, selector: "f-sorticon", inputs: ["field"] }, { kind: "directive", type: i1.SortableColumnDirective, selector: "[fSortableColumn]", inputs: ["fSortableColumn"] }, { kind: "component", type: i1.TableComponent, selector: "f-table", inputs: ["value", "lazy", "loading", "rows", "totalRecords", "rowHover", "dataKey", "scrollable", "scrollHeight", "paginator", "first", "rowsPerPageOptions", "showCurrentPageReport", "currentPageReportTemplate", "tableStyle", "styleClass", "globalFilterFields", "filterDelay", "responsiveLayout", "selectionMode", "sortMode", "rowExpandMode", "resizableColumns", "rowStyleClass", "virtualScroll", "virtualScrollItemSize", "sortField", "sortOrder", "multiSortMeta", "filters", "selection", "expandedRowKeys", "contextMenuSelection"], outputs: ["sortFieldChange", "sortOrderChange", "multiSortMetaChange", "filtersChange", "selectionChange", "expandedRowKeysChange", "contextMenuSelectionChange", "onLazyLoad", "onSort", "onFilter", "onRowSelect", "onRowUnselect", "onSelectAllChange", "onRowExpand", "onRowCollapse", "onColResize", "onRowContextMenu"] }, { kind: "directive", type: i1.TooltipDirective, selector: "[fTooltip]", inputs: ["fTooltip", "tooltipPosition", "positionStyle", "tooltipStyleClass", "disabled", "tooltipEvent", "showDelay", "hideDelay", "life", "autoHide", "positionTop", "positionLeft", "escape"] }, { kind: "component", type: i1.UiIconComponent, selector: "ui-icon", inputs: ["name", "size", "spin", "fill", "severity"] }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i2$1.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer", "cdkDropListHasAnchor"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i2$1.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i2$1.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "ngmodule", type: AngularModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: TaskCardComponent, selector: "tm-task-card", inputs: ["task"], outputs: ["cardClick", "editClick", "deleteClick"] }, { kind: "component", type: TaskFormDialogComponent, selector: "tm-task-form-dialog", inputs: ["visible", "task", "boardId", "listId", "members", "labels"], outputs: ["visibleChange", "saved"] }, { kind: "component", type: TaskDetailPanelComponent, selector: "tm-task-detail-panel", inputs: ["task"], outputs: ["closePanel", "editTask"] }, { kind: "component", type: UserSelectComponent, selector: "lib-user-select", inputs: ["showClear", "value"], outputs: ["valueChange", "userSelected"] }, { kind: "pipe", type: i3.DatePipe, name: "date" }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
|
|
3035
|
+
`, isInline: true, dependencies: [{ kind: "ngmodule", type: UiModule }, { kind: "component", type: i1.AvatarComponent, selector: "f-avatar", inputs: ["label", "icon", "image", "shape", "size", "color", "styleClass", "ariaLabel", "ariaLabelledBy"], outputs: ["onImageError"] }, { kind: "directive", type: i1.FButtonDirective, selector: "[fButton]", inputs: ["severity", "text", "outlined", "link", "variant", "rounded", "raised", "fluid", "disabled", "loading", "loadingIcon", "size", "label", "icon", "iconPos", "ariaLabel", "plain"] }, { kind: "component", type: i1.SkeletonComponent, selector: "f-skeleton", inputs: ["width", "height", "size", "borderRadius", "shape", "animation", "styleClass"] }, { kind: "component", type: i1.TagComponent, selector: "f-tag", inputs: ["value", "severity", "icon", "rounded", "color", "styleClass", "style"] }, { kind: "directive", type: i1.InputTextDirective, selector: "[fInputText]", inputs: ["invalid", "touched", "variant", "size", "fluid"] }, { kind: "component", type: i1.SelectComponent, selector: "f-select", inputs: ["options", "optionLabel", "optionValue", "placeholder", "disabled", "filter", "filterBy", "filterMatchMode", "filterLocale", "filterPlaceholder", "resetFilterOnHide", "autofocusFilter", "emptyMessage", "emptyFilterMessage", "showClear", "loading", "loadingIcon", "dropdownIcon", "clearIcon", "inputId", "invalid", "touched", "styleClass", "style", "appendTo", "editable", "readonly", "autofocus", "checkmark", "group", "optionGroupLabel", "optionGroupChildren", "virtualScroll", "virtualScrollItemSize", "lazy"], outputs: ["onFilter", "onChange", "onShow", "onHide", "onBlur", "onFocus", "onClear", "onLazyLoad"] }, { kind: "directive", type: i1.TextareaDirective, selector: "[fTextarea]", inputs: ["invalid", "touched", "variant", "fluid", "autoResize"], outputs: ["onResize"] }, { kind: "component", type: i1.DialogComponent, selector: "f-dialog", inputs: ["header", "visible", "modal", "closable", "closeOnEscape", "dismissableMask", "resizable", "draggable", "maximizable", "blockScroll", "returnFocusOnClose", "position", "style", "styleClass", "breakpoints"], outputs: ["visibleChange", "onShow", "onHide", "onMaximize"] }, { kind: "component", type: i1.SortIconComponent, selector: "f-sorticon", inputs: ["field"] }, { kind: "directive", type: i1.SortableColumnDirective, selector: "[fSortableColumn]", inputs: ["fSortableColumn"] }, { kind: "component", type: i1.TableComponent, selector: "f-table", inputs: ["value", "lazy", "loading", "rows", "totalRecords", "rowHover", "dataKey", "scrollable", "scrollHeight", "paginator", "first", "rowsPerPageOptions", "showCurrentPageReport", "currentPageReportTemplate", "tableStyle", "styleClass", "globalFilterFields", "filterDelay", "responsiveLayout", "selectionMode", "sortMode", "rowExpandMode", "resizableColumns", "rowStyleClass", "virtualScroll", "virtualScrollItemSize", "sortField", "sortOrder", "multiSortMeta", "filters", "selection", "expandedRowKeys", "contextMenuSelection"], outputs: ["sortFieldChange", "sortOrderChange", "multiSortMetaChange", "filtersChange", "selectionChange", "expandedRowKeysChange", "contextMenuSelectionChange", "onLazyLoad", "onSort", "onFilter", "onRowSelect", "onRowUnselect", "onSelectAllChange", "onRowExpand", "onRowCollapse", "onColResize", "onRowContextMenu"] }, { kind: "directive", type: i1.TooltipDirective, selector: "[fTooltip]", inputs: ["fTooltip", "tooltipPosition", "positionStyle", "tooltipStyleClass", "disabled", "tooltipEvent", "showDelay", "hideDelay", "life", "autoHide", "positionTop", "positionLeft", "escape"] }, { kind: "component", type: i1.UiIconComponent, selector: "ui-icon", inputs: ["name", "size", "spin", "fill", "severity"] }, { kind: "ngmodule", type: DragDropModule }, { kind: "directive", type: i2$1.CdkDropList, selector: "[cdkDropList], cdk-drop-list", inputs: ["cdkDropListConnectedTo", "cdkDropListData", "cdkDropListOrientation", "id", "cdkDropListLockAxis", "cdkDropListDisabled", "cdkDropListSortingDisabled", "cdkDropListEnterPredicate", "cdkDropListSortPredicate", "cdkDropListAutoScrollDisabled", "cdkDropListAutoScrollStep", "cdkDropListElementContainer", "cdkDropListHasAnchor"], outputs: ["cdkDropListDropped", "cdkDropListEntered", "cdkDropListExited", "cdkDropListSorted"], exportAs: ["cdkDropList"] }, { kind: "directive", type: i2$1.CdkDrag, selector: "[cdkDrag]", inputs: ["cdkDragData", "cdkDragLockAxis", "cdkDragRootElement", "cdkDragBoundary", "cdkDragStartDelay", "cdkDragFreeDragPosition", "cdkDragDisabled", "cdkDragConstrainPosition", "cdkDragPreviewClass", "cdkDragPreviewContainer", "cdkDragScale"], outputs: ["cdkDragStarted", "cdkDragReleased", "cdkDragEnded", "cdkDragEntered", "cdkDragExited", "cdkDragDropped", "cdkDragMoved"], exportAs: ["cdkDrag"] }, { kind: "directive", type: i2$1.CdkDragHandle, selector: "[cdkDragHandle]", inputs: ["cdkDragHandleDisabled"] }, { kind: "ngmodule", type: AngularModule }, { kind: "directive", type: i2.DefaultValueAccessor, selector: "input:not([type=checkbox]):not([ngNoCva])[formControlName],textarea:not([ngNoCva])[formControlName],input:not([type=checkbox]):not([ngNoCva])[formControl],textarea:not([ngNoCva])[formControl],input:not([type=checkbox]):not([ngNoCva])[ngModel],textarea:not([ngNoCva])[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i2.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i2.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: TaskCardComponent, selector: "tm-task-card", inputs: ["task"], outputs: ["cardClick", "editClick", "deleteClick"] }, { kind: "component", type: TaskFormDialogComponent, selector: "tm-task-form-dialog", inputs: ["visible", "task", "boardId", "listId", "members", "labels"], outputs: ["visibleChange", "saved"] }, { kind: "component", type: TaskDetailPanelComponent, selector: "tm-task-detail-panel", inputs: ["task"], outputs: ["closePanel", "editTask"] }, { kind: "component", type: UserSelectComponent, selector: "lib-user-select", inputs: ["showClear", "value"], outputs: ["valueChange", "userSelected"] }, { kind: "pipe", type: i3.DatePipe, name: "date" }, { kind: "pipe", type: TranslatePipe, name: "translate" }] });
|
|
3036
3036
|
}
|
|
3037
3037
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.6", ngImport: i0, type: BoardViewPageComponent, decorators: [{
|
|
3038
3038
|
type: Component,
|
|
@@ -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-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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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flusys/ng-task-manager",
|
|
3
|
-
"version": "6.0.0
|
|
3
|
+
"version": "6.0.0",
|
|
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.0.0
|
|
13
|
-
"@flusys/ng-shared": ">=6.0.0
|
|
14
|
-
"@flusys/ng-ui": ">=6.0.0
|
|
12
|
+
"@flusys/ng-core": ">=6.0.0",
|
|
13
|
+
"@flusys/ng-shared": ">=6.0.0",
|
|
14
|
+
"@flusys/ng-ui": ">=6.0.0",
|
|
15
15
|
"socket.io-client": ">=4.0.0",
|
|
16
16
|
"rxjs": "^7.8.0"
|
|
17
17
|
},
|