diff --git a/src/app/features/tasks/add-task-bar/add-task-bar-actions/add-task-bar-actions.component.html b/src/app/features/tasks/add-task-bar/add-task-bar-actions/add-task-bar-actions.component.html index 1b47004e5c..7144c296ae 100644 --- a/src/app/features/tasks/add-task-bar/add-task-bar-actions/add-task-bar-actions.component.html +++ b/src/app/features/tasks/add-task-bar/add-task-bar-actions/add-task-bar-actions.component.html @@ -113,7 +113,7 @@ [class.menu-open]="isEstimateMenuOpen()" (click)="onEstimateMenuClick()" > - timer + hourglass_empty {{ estimateDisplay() || (T.F.TASK.ADD_TASK_BAR.ESTIMATE_BUTTON | translate) }} diff --git a/src/app/features/tasks/add-task-bar/add-task-bar.const.ts b/src/app/features/tasks/add-task-bar/add-task-bar.const.ts index 7cf699f4a3..eac6976b28 100644 --- a/src/app/features/tasks/add-task-bar/add-task-bar.const.ts +++ b/src/app/features/tasks/add-task-bar/add-task-bar.const.ts @@ -17,16 +17,18 @@ export interface AddTaskBarState { attachments: TaskAttachment[]; repeatQuickSetting: RepeatQuickSetting | null; } +const M = 60 * 1000; +const H = 60 * M; export const ESTIMATE_OPTIONS = [ - { label: '5m', value: '5m' }, - { label: '10m', value: '10m' }, - { label: '15m', value: '15m' }, - { label: '30m', value: '30m' }, - { label: '1h', value: '1h' }, - { label: '2h', value: '2h' }, - { label: '3h', value: '3h' }, - { label: '4h', value: '4h' }, - { label: '8h', value: '8h' }, + { label: '5m', value: '5m', ms: 5 * M }, + { label: '10m', value: '10m', ms: 10 * M }, + { label: '15m', value: '15m', ms: 15 * M }, + { label: '30m', value: '30m', ms: 30 * M }, + { label: '1h', value: '1h', ms: 1 * H }, + { label: '2h', value: '2h', ms: 2 * H }, + { label: '3h', value: '3h', ms: 3 * H }, + { label: '4h', value: '4h', ms: 4 * H }, + { label: '8h', value: '8h', ms: 8 * H }, ]; export const INITIAL_ADD_TASK_BAR_STATE: AddTaskBarState = { diff --git a/src/app/features/tasks/dialog-view-archived-task/dialog-view-archived-task.component.html b/src/app/features/tasks/dialog-view-archived-task/dialog-view-archived-task.component.html index 99bd59045e..bda3b268c8 100644 --- a/src/app/features/tasks/dialog-view-archived-task/dialog-view-archived-task.component.html +++ b/src/app/features/tasks/dialog-view-archived-task/dialog-view-archived-task.component.html @@ -35,7 +35,7 @@ @if (task.timeSpent || task.timeEstimate) {

- timer + hourglass_empty {{ T.F.TASK.ADDITIONAL_INFO.TIME | translate }}

diff --git a/src/app/features/tasks/task-context-menu/task-context-menu-inner/task-context-menu-inner.component.html b/src/app/features/tasks/task-context-menu/task-context-menu-inner/task-context-menu-inner.component.html index 3ac68380d1..1dd952a33a 100644 --- a/src/app/features/tasks/task-context-menu/task-context-menu-inner/task-context-menu-inner.component.html +++ b/src/app/features/tasks/task-context-menu/task-context-menu-inner/task-context-menu-inner.component.html @@ -249,6 +249,21 @@ } + @if (!task.subTaskIds.length) { + + } + + } + + + @if (task.timeEstimate > 0) { + + } + + + (false); todayList = toSignal(this._store.select(selectTodayTaskIds), { initialValue: [] }); @@ -433,6 +437,13 @@ export class TaskContextMenuInnerComponent implements AfterViewInit, OnDestroy { .subscribe(() => this.focusRelatedTaskOrNext()); } + setEstimate(ms: number): void { + if (ms === this.task.timeEstimate) { + return; + } + this._taskService.update(this.task.id, { timeEstimate: ms }); + } + addSubTask(): void { this._taskService.addSubTaskTo(this.task.parentId || this.task.id); } diff --git a/src/app/features/tasks/task-detail-panel/task-detail-panel.component.html b/src/app/features/tasks/task-detail-panel/task-detail-panel.component.html index 8de8619a8d..79cb01ac07 100644 --- a/src/app/features/tasks/task-detail-panel/task-detail-panel.component.html +++ b/src/app/features/tasks/task-detail-panel/task-detail-panel.component.html @@ -88,7 +88,7 @@ class="input-item --estimate" > - timer + hourglass_empty {{ T.F.TASK.ADDITIONAL_INFO.TIME | translate }} diff --git a/src/app/t.const.ts b/src/app/t.const.ts index 6c3d1e96a1..ae1c509502 100644 --- a/src/app/t.const.ts +++ b/src/app/t.const.ts @@ -1601,13 +1601,16 @@ const T = { ADD_SUB_TASK: 'F.TASK.CMP.ADD_SUB_TASK', ADD_TO_MY_DAY: 'F.TASK.CMP.ADD_TO_MY_DAY', ADD_TO_PROJECT: 'F.TASK.CMP.ADD_TO_PROJECT', + CLEAR_ESTIMATE: 'F.TASK.CMP.CLEAR_ESTIMATE', CONVERT_TO_PARENT_TASK: 'F.TASK.CMP.CONVERT_TO_PARENT_TASK', + CUSTOM_ESTIMATE: 'F.TASK.CMP.CUSTOM_ESTIMATE', DELETE: 'F.TASK.CMP.DELETE', DELETE_REPEAT_INSTANCE: 'F.TASK.CMP.DELETE_REPEAT_INSTANCE', DROP_ATTACHMENT: 'F.TASK.CMP.DROP_ATTACHMENT', DUPLICATE: 'F.TASK.CMP.DUPLICATE', EDIT_DEADLINE: 'F.TASK.CMP.EDIT_DEADLINE', EDIT_SCHEDULED: 'F.TASK.CMP.EDIT_SCHEDULED', + ESTIMATE: 'F.TASK.CMP.ESTIMATE', FOCUS_SESSION: 'F.TASK.CMP.FOCUS_SESSION', MARK_DONE: 'F.TASK.CMP.MARK_DONE', MOVE_TO_BACKLOG: 'F.TASK.CMP.MOVE_TO_BACKLOG', diff --git a/src/assets/i18n/en.json b/src/assets/i18n/en.json index 1fe8210d3e..d2f69d73be 100644 --- a/src/assets/i18n/en.json +++ b/src/assets/i18n/en.json @@ -1563,13 +1563,16 @@ "ADD_SUB_TASK": "Add subtask", "ADD_TO_MY_DAY": "Add to Today", "ADD_TO_PROJECT": "Add to a project", + "CLEAR_ESTIMATE": "Clear estimate", "CONVERT_TO_PARENT_TASK": "Convert to parent task", + "CUSTOM_ESTIMATE": "Custom…", "DELETE": "Delete task", "DELETE_REPEAT_INSTANCE": "Delete recurring task instance", "DROP_ATTACHMENT": "Drop here to attach to \"{{title}}\"", "DUPLICATE": "Duplicate", "EDIT_DEADLINE": "Edit deadline", "EDIT_SCHEDULED": "Reschedule", + "ESTIMATE": "Estimate", "FOCUS_SESSION": "Start focus session", "MARK_DONE": "Mark as completed", "MOVE_TO_BACKLOG": "Move to backlog",