@@ -7,9 +7,17 @@ import {
7
7
} from '@angular/core' ;
8
8
import { CdkDrag , CdkDragDrop , CdkDropList } from '@angular/cdk/drag-drop' ;
9
9
import { PlannerTaskComponent } from '../../planner/planner-task/planner-task.component' ;
10
- import { BoardPanelCfg , BoardPanelCfgTaskDoneState } from '../boards.model' ;
11
- import { Store } from '@ngrx/store' ;
12
- import { selectAllTasks } from '../../tasks/store/task.selectors' ;
10
+ import {
11
+ BoardPanelCfg ,
12
+ BoardPanelCfgScheduledState ,
13
+ BoardPanelCfgTaskDoneState ,
14
+ } from '../boards.model' ;
15
+ import { select , Store } from '@ngrx/store' ;
16
+ import {
17
+ selectAllTasks ,
18
+ selectTaskById ,
19
+ selectTaskByIdWithSubTaskData ,
20
+ } from '../../tasks/store/task.selectors' ;
13
21
import { toSignal } from '@angular/core/rxjs-interop' ;
14
22
import { AddTaskInlineComponent } from '../../planner/add-task-inline/add-task-inline.component' ;
15
23
import { T } from '../../../t.const' ;
@@ -18,7 +26,11 @@ import { TaskService } from '../../tasks/task.service';
18
26
import { BoardsActions } from '../store/boards.actions' ;
19
27
import { moveItemInArray } from '../../../util/move-item-in-array' ;
20
28
import { unique } from '../../../util/unique' ;
21
- import { updateTask } from '../../tasks/store/task.actions' ;
29
+ import {
30
+ moveToOtherProject ,
31
+ unScheduleTask ,
32
+ updateTask ,
33
+ } from '../../tasks/store/task.actions' ;
22
34
import { AsyncPipe } from '@angular/common' ;
23
35
import { LocalDateStrPipe } from '../../../ui/pipes/local-date-str.pipe' ;
24
36
import { MatIcon } from '@angular/material/icon' ;
@@ -28,6 +40,8 @@ import { PlannerService } from '../../planner/planner.service';
28
40
import { DialogScheduleTaskComponent } from '../../planner/dialog-schedule-task/dialog-schedule-task.component' ;
29
41
import { MatDialog } from '@angular/material/dialog' ;
30
42
import { fastArrayCompare } from '../../../util/fast-array-compare' ;
43
+ import { first , take } from 'rxjs/operators' ;
44
+ import { PlannerActions } from '../../planner/store/planner.actions' ;
31
45
32
46
@Component ( {
33
47
selector : 'board-task-list' ,
@@ -61,9 +75,13 @@ export class BoardTaskListComponent {
61
75
allTasks = toSignal ( this . allTasks$ , {
62
76
initialValue : [ ] ,
63
77
} ) ;
78
+ plannedTaskDayMap = toSignal ( this . plannerService . plannedTaskDayMap$ , {
79
+ initialValue : { } ,
80
+ } ) ;
64
81
65
82
additionalTaskFields = computed ( ( ) => {
66
83
const panelCfg = this . panelCfg ( ) ;
84
+
67
85
return {
68
86
...( panelCfg . includedTagIds ? { tagIds : panelCfg . includedTagIds } : { } ) ,
69
87
// ...(panelCfg.projectId ? { projectId: panelCfg.projectId } : {}),
@@ -73,11 +91,16 @@ export class BoardTaskListComponent {
73
91
...( panelCfg . taskDoneState === BoardPanelCfgTaskDoneState . UnDone
74
92
? { isDone : false }
75
93
: { } ) ,
94
+ ...( panelCfg . projectId && panelCfg . projectId . length
95
+ ? { projectId : panelCfg . projectId }
96
+ : { } ) ,
97
+ // TODO scheduledState
76
98
} ;
77
99
} ) ;
78
100
79
101
tasks = computed ( ( ) => {
80
102
const panelCfg = this . panelCfg ( ) ;
103
+ const plannedTaskDayMap = this . plannedTaskDayMap ( ) ;
81
104
const orderedTasks : TaskCopy [ ] = [ ] ;
82
105
const nonOrderedTasks : TaskCopy [ ] = [ ] ;
83
106
@@ -102,6 +125,21 @@ export class BoardTaskListComponent {
102
125
isTaskIncluded = isTaskIncluded && ! task . isDone ;
103
126
}
104
127
128
+ if ( panelCfg . projectId ) {
129
+ // TODO check parentId case thoroughly
130
+ isTaskIncluded = isTaskIncluded && task . projectId === panelCfg . projectId ;
131
+ }
132
+
133
+ console . log ( task . plannedAt , task ) ;
134
+
135
+ if ( panelCfg . scheduledState === BoardPanelCfgScheduledState . Scheduled ) {
136
+ isTaskIncluded = isTaskIncluded && ( task . plannedAt || plannedTaskDayMap [ task . id ] ) ;
137
+ }
138
+
139
+ if ( panelCfg . scheduledState === BoardPanelCfgScheduledState . NotScheduled ) {
140
+ isTaskIncluded = isTaskIncluded && ! task . plannedAt && ! plannedTaskDayMap [ task . id ] ;
141
+ }
142
+
105
143
return isTaskIncluded ;
106
144
} ) ;
107
145
@@ -116,7 +154,7 @@ export class BoardTaskListComponent {
116
154
return [ ...orderedTasks , ...nonOrderedTasks ] . filter ( ( t ) => ! ! t ) ;
117
155
} ) ;
118
156
119
- drop ( ev : CdkDragDrop < BoardPanelCfg , string , TaskCopy > ) : void {
157
+ async drop ( ev : CdkDragDrop < BoardPanelCfg , string , TaskCopy > ) : Promise < void > {
120
158
const panelCfg = ev . container . data ;
121
159
const task = ev . item . data ;
122
160
const prevTaskIds = this . tasks ( ) . map ( ( t ) => t . id ) ;
@@ -135,37 +173,58 @@ export class BoardTaskListComponent {
135
173
newTagIds = newTagIds . filter ( ( tagId ) => ! panelCfg . excludedTagIds ! . includes ( tagId ) ) ;
136
174
}
137
175
176
+ const updates : Partial < TaskCopy > = { } ;
177
+
138
178
// conditional updates
139
179
if ( ! fastArrayCompare ( task . tagIds , newTagIds ) ) {
140
180
this . taskService . updateTags ( task , unique ( newTagIds ) ) ;
141
181
}
142
182
if ( panelCfg . taskDoneState === BoardPanelCfgTaskDoneState . Done && ! task . isDone ) {
143
- this . store . dispatch (
144
- updateTask ( { task : { id : task . id , changes : { isDone : true } } } ) ,
145
- ) ;
183
+ updates . isDone = true ;
146
184
} else if (
147
185
panelCfg . taskDoneState === BoardPanelCfgTaskDoneState . UnDone &&
148
186
task . isDone
149
187
) {
188
+ updates . isDone = false ;
189
+ }
190
+
191
+ if ( panelCfg . projectId ?. length && task . projectId !== panelCfg . projectId ) {
192
+ const taskWithSubTasks = await this . store
193
+ . pipe (
194
+ select ( selectTaskByIdWithSubTaskData , { id : task . parentId || task . id } ) ,
195
+ take ( 1 ) ,
196
+ )
197
+ . toPromise ( ) ;
198
+
150
199
this . store . dispatch (
151
- updateTask ( { task : { id : task . id , changes : { isDone : false } } } ) ,
200
+ moveToOtherProject ( {
201
+ task : taskWithSubTasks ,
202
+ targetProjectId : panelCfg . projectId ,
203
+ } ) ,
152
204
) ;
153
205
}
206
+
207
+ if ( Object . keys ( updates ) . length > 0 ) {
208
+ this . store . dispatch ( updateTask ( { task : { id : task . id , changes : updates } } ) ) ;
209
+ }
210
+
154
211
this . store . dispatch (
155
212
BoardsActions . updatePanelCfgTaskIds ( {
156
213
panelId : panelCfg . id ,
157
214
taskIds,
158
215
} ) ,
159
216
) ;
217
+
218
+ this . _checkToScheduledTask ( panelCfg , task . id ) ;
160
219
}
161
220
162
- afterTaskAdd ( {
221
+ async afterTaskAdd ( {
163
222
taskId,
164
223
isAddToBottom,
165
224
} : {
166
225
taskId : string ;
167
226
isAddToBottom : boolean ;
168
- } ) : void {
227
+ } ) : Promise < void > {
169
228
const panelCfg = this . panelCfg ( ) ;
170
229
this . store . dispatch (
171
230
BoardsActions . updatePanelCfgTaskIds ( {
@@ -175,14 +234,48 @@ export class BoardTaskListComponent {
175
234
: [ taskId , ...panelCfg . taskIds ] ,
176
235
} ) ,
177
236
) ;
237
+
238
+ this . _checkToScheduledTask ( panelCfg , taskId ) ;
178
239
}
179
240
180
- scheduleTask ( task : TaskCopy , ev : MouseEvent ) : void {
181
- ev . preventDefault ( ) ;
182
- ev . stopPropagation ( ) ;
241
+ scheduleTask ( task : TaskCopy , ev ? : MouseEvent ) : void {
242
+ ev ? .preventDefault ( ) ;
243
+ ev ? .stopPropagation ( ) ;
183
244
this . _matDialog . open ( DialogScheduleTaskComponent , {
184
245
restoreFocus : true ,
185
246
data : { task } ,
186
247
} ) ;
187
248
}
249
+
250
+ private async _checkToScheduledTask (
251
+ panelCfg : BoardPanelCfg ,
252
+ taskId : string ,
253
+ ) : Promise < void > {
254
+ if ( panelCfg . scheduledState === BoardPanelCfgScheduledState . Scheduled ) {
255
+ const task = await this . store
256
+ . select ( selectTaskById , { id : taskId } )
257
+ . pipe ( first ( ) )
258
+ . toPromise ( ) ;
259
+ if ( ! this . plannedTaskDayMap ( ) [ taskId ] && ! task . plannedAt ) {
260
+ this . scheduleTask ( task ) ;
261
+ }
262
+ }
263
+ if ( panelCfg . scheduledState === BoardPanelCfgScheduledState . NotScheduled ) {
264
+ const task = await this . store
265
+ . select ( selectTaskById , { id : taskId } )
266
+ . pipe ( first ( ) )
267
+ . toPromise ( ) ;
268
+ if ( this . plannedTaskDayMap ( ) [ taskId ] ) {
269
+ this . store . dispatch ( PlannerActions . removeTaskFromDays ( { taskId } ) ) ;
270
+ } else if ( task . reminderId ) {
271
+ this . store . dispatch (
272
+ unScheduleTask ( {
273
+ id : taskId ,
274
+ reminderId : task . reminderId ,
275
+ isSkipToast : false ,
276
+ } ) ,
277
+ ) ;
278
+ }
279
+ }
280
+ }
188
281
}
0 commit comments