@@ -33,23 +33,30 @@ public function processRequest() {
33
33
$ uri = $ request ->getRequestURI ();
34
34
35
35
if ($ request ->isFormPost ()) {
36
- $ phid_arr = $ request ->getArr ('view_user ' );
37
- $ view_target = head ($ phid_arr );
38
- return id (new AphrontRedirectResponse ())
39
- ->setURI ($ request ->getRequestURI ()->alter ('phid ' , $ view_target ));
40
- }
36
+ // Redirect to GET so URIs can be copy/pasted.
37
+
38
+ $ user_phids = $ request ->getArr ('set_users ' );
39
+ $ proj_phids = $ request ->getArr ('set_projects ' );
40
+ $ user_phids = implode (', ' , $ user_phids );
41
+ $ proj_phids = implode (', ' , $ proj_phids );
42
+ $ user_phids = nonempty ($ user_phids , null );
43
+ $ proj_phids = nonempty ($ proj_phids , null );
41
44
45
+ $ uri = $ request ->getRequestURI ()
46
+ ->alter ('users ' , $ user_phids )
47
+ ->alter ('projects ' , $ proj_phids );
48
+
49
+ return id (new AphrontRedirectResponse ())->setURI ($ uri );
50
+ }
42
51
43
52
$ views = array (
44
53
'User Tasks ' ,
45
54
'action ' => 'Assigned ' ,
46
55
'created ' => 'Created ' ,
47
56
'triage ' => 'Need Triage ' ,
48
- // 'touched' => 'Touched',
49
57
'<hr /> ' ,
50
58
'All Tasks ' ,
51
59
'alltriage ' => 'Need Triage ' ,
52
- 'unassigned ' => 'Unassigned ' ,
53
60
'all ' => 'All Tasks ' ,
54
61
);
55
62
@@ -77,7 +84,7 @@ public function processRequest() {
77
84
phutil_render_tag (
78
85
'a ' ,
79
86
array (
80
- 'href ' => $ uri ,
87
+ 'href ' => $ uri-> alter ( ' page ' , null ) ,
81
88
'class ' => ($ this ->view == $ view )
82
89
? 'aphront-side-nav-selected '
83
90
: null ,
@@ -90,13 +97,26 @@ public function processRequest() {
90
97
list ($ grouping , $ group_links ) = $ this ->renderGroupLinks ();
91
98
list ($ order , $ order_links ) = $ this ->renderOrderLinks ();
92
99
93
- $ view_phid = nonempty ($ request ->getStr ('phid ' ), $ user ->getPHID ());
100
+ $ user_phids = $ request ->getStr ('users ' );
101
+ if (strlen ($ user_phids )) {
102
+ $ user_phids = explode (', ' , $ user_phids );
103
+ } else {
104
+ $ user_phids = array ($ user ->getPHID ());
105
+ }
106
+
107
+ $ project_phids = $ request ->getStr ('projects ' );
108
+ if (strlen ($ project_phids )) {
109
+ $ project_phids = explode (', ' , $ project_phids );
110
+ } else {
111
+ $ project_phids = array ();
112
+ }
94
113
95
114
$ page = $ request ->getInt ('page ' );
96
115
$ page_size = self ::DEFAULT_PAGE_SIZE ;
97
116
98
117
list ($ tasks , $ handles , $ total_count ) = $ this ->loadTasks (
99
- $ view_phid ,
118
+ $ user_phids ,
119
+ $ project_phids ,
100
120
array (
101
121
'status ' => $ status_map ,
102
122
'group ' => $ grouping ,
@@ -105,23 +125,33 @@ public function processRequest() {
105
125
'limit ' => $ page_size ,
106
126
));
107
127
108
-
109
128
$ form = id (new AphrontFormView ())
110
- ->setUser ($ user );
129
+ ->setUser ($ user )
130
+ ->setAction ($ request ->getRequestURI ());
111
131
112
132
if (isset ($ has_filter [$ this ->view ])) {
133
+ $ tokens = array ();
134
+ foreach ($ user_phids as $ phid ) {
135
+ $ tokens [$ phid ] = $ handles [$ phid ]->getFullName ();
136
+ }
113
137
$ form ->appendChild (
114
138
id (new AphrontFormTokenizerControl ())
115
- ->setLimit (1 )
116
139
->setDatasource ('/typeahead/common/searchowner/ ' )
117
- ->setName ('view_user ' )
118
- ->setLabel ('View User ' )
119
- ->setCaption ('Use "upforgrabs" to find unassigned tasks. ' )
120
- ->setValue (
121
- array (
122
- $ view_phid => $ handles [$ view_phid ]->getFullName (),
123
- )));
140
+ ->setName ('set_users ' )
141
+ ->setLabel ('Users ' )
142
+ ->setValue ($ tokens ));
143
+ }
144
+
145
+ $ tokens = array ();
146
+ foreach ($ project_phids as $ phid ) {
147
+ $ tokens [$ phid ] = $ handles [$ phid ]->getFullName ();
124
148
}
149
+ $ form ->appendChild (
150
+ id (new AphrontFormTokenizerControl ())
151
+ ->setDatasource ('/typeahead/common/projects/ ' )
152
+ ->setName ('set_projects ' )
153
+ ->setLabel ('Projects ' )
154
+ ->setValue ($ tokens ));
125
155
126
156
$ form
127
157
->appendChild (
@@ -137,6 +167,10 @@ public function processRequest() {
137
167
->setLabel ('Order ' )
138
168
->setValue ($ order_links ));
139
169
170
+ $ form ->appendChild (
171
+ id (new AphrontFormSubmitControl ())
172
+ ->setValue ('Filter Tasks ' ));
173
+
140
174
$ filter = new AphrontListFilterView ();
141
175
$ filter ->addButton (
142
176
phutil_render_tag (
@@ -209,141 +243,71 @@ public function processRequest() {
209
243
));
210
244
}
211
245
212
- private function loadTasks ($ view_phid , array $ dict ) {
213
- $ phids = array ($ view_phid );
214
-
215
- $ include_upforgrabs = false ;
216
- foreach ($ phids as $ key => $ phid ) {
217
- if ($ phid == ManiphestTaskOwner::OWNER_UP_FOR_GRABS ) {
218
- unset($ phids [$ key ]);
219
- $ include_upforgrabs = true ;
220
- }
221
- }
246
+ private function loadTasks (
247
+ array $ user_phids ,
248
+ array $ project_phids ,
249
+ array $ dict ) {
222
250
223
- $ task = new ManiphestTask ();
224
-
225
- $ argv = array ();
251
+ $ query = new ManiphestTaskQuery ();
252
+ $ query ->withProjects ($ project_phids );
226
253
227
254
$ status = $ dict ['status ' ];
228
255
if (!empty ($ status ['open ' ]) && !empty ($ status ['closed ' ])) {
229
- $ status_clause = ' 1 = 1 ' ;
256
+ $ query -> withStatus (ManiphestTaskQuery:: STATUS_ANY ) ;
230
257
} else if (!empty ($ status ['open ' ])) {
231
- $ status_clause = 'status = %d ' ;
232
- $ argv [] = 0 ;
258
+ $ query ->withStatus (ManiphestTaskQuery::STATUS_OPEN );
233
259
} else {
234
- $ status_clause = 'status > %d ' ;
235
- $ argv [] = 0 ;
260
+ $ query ->withStatus (ManiphestTaskQuery::STATUS_CLOSED );
236
261
}
237
262
238
- $ extra_clause = '1 = 1 ' ;
239
263
switch ($ this ->view ) {
240
264
case 'action ' :
241
- $ parts = array ();
242
- if ($ phids ) {
243
- $ parts [] = 'ownerPHID in (%Ls) ' ;
244
- $ argv [] = $ phids ;
245
- }
246
- if ($ include_upforgrabs ) {
247
- $ parts [] = 'ownerPHID IS NULL ' ;
248
- }
249
- $ extra_clause = '( ' .implode (' OR ' , $ parts ).') ' ;
265
+ $ query ->withOwners ($ user_phids );
250
266
break ;
251
267
case 'created ' :
252
- $ parts = array ();
253
- if ($ phids ) {
254
- $ parts [] = 'authorPHID in (%Ls) ' ;
255
- $ argv [] = $ phids ;
256
- }
257
- if ($ include_upforgrabs ) {
258
- // This should be impossible since every task is supposed to have a
259
- // valid author, but we might as well run the query.
260
- $ parts [] = 'authorPHID IS NULL ' ;
261
- }
262
- $ extra_clause = '( ' .implode (' OR ' , $ parts ).') ' ;
268
+ $ query ->withAuthors ($ user_phids );
263
269
break ;
264
270
case 'triage ' :
265
- $ parts = array ();
266
- if ($ phids ) {
267
- $ parts [] = 'ownerPHID in (%Ls) ' ;
268
- $ argv [] = $ phids ;
269
- }
270
- if ($ include_upforgrabs ) {
271
- $ parts [] = 'ownerPHID IS NULL ' ;
272
- }
273
- $ extra_clause = '( ' .implode (' OR ' , $ parts ).') AND priority = %d ' ;
274
- $ argv [] = ManiphestTaskPriority::PRIORITY_TRIAGE ;
271
+ $ query ->withOwners ($ user_phids );
272
+ $ query ->withPriority (ManiphestTaskPriority::PRIORITY_TRIAGE );
275
273
break ;
276
274
case 'alltriage ' :
277
- $ extra_clause = 'priority = %d ' ;
278
- $ argv [] = ManiphestTaskPriority::PRIORITY_TRIAGE ;
279
- break ;
280
- case 'unassigned ' :
281
- $ extra_clause = 'ownerPHID is NULL ' ;
275
+ $ query ->withPriority (ManiphestTaskPriority::PRIORITY_TRIAGE );
282
276
break ;
283
277
case 'all ' :
284
278
break ;
285
279
}
286
280
287
- $ order = array ();
288
- switch ($ dict ['group ' ]) {
289
- case 'priority ' :
290
- $ order [] = 'priority ' ;
291
- break ;
292
- case 'owner ' :
293
- $ order [] = 'ownerOrdering ' ;
294
- break ;
295
- case 'status ' :
296
- $ order [] = 'status ' ;
297
- break ;
298
- }
299
-
300
- switch ($ dict ['order ' ]) {
301
- case 'priority ' :
302
- $ order [] = 'priority ' ;
303
- $ order [] = 'dateModified ' ;
304
- break ;
305
- case 'created ' :
306
- $ order [] = 'id ' ;
307
- break ;
308
- default :
309
- $ order [] = 'dateModified ' ;
310
- break ;
311
- }
312
-
313
- $ order = array_unique ($ order );
314
-
315
- foreach ($ order as $ k => $ column ) {
316
- switch ($ column ) {
317
- case 'ownerOrdering ' :
318
- $ order [$ k ] = "{$ column } ASC " ;
319
- break ;
320
- default :
321
- $ order [$ k ] = "{$ column } DESC " ;
322
- break ;
323
- }
324
- }
325
-
326
- $ order = implode (', ' , $ order );
327
-
328
- $ offset = (int )idx ($ dict , 'offset ' , 0 );
329
- $ limit = (int )idx ($ dict , 'limit ' , self ::DEFAULT_PAGE_SIZE );
330
-
331
- $ sql = "SELECT SQL_CALC_FOUND_ROWS * FROM %T WHERE " .
332
- "( {$ status_clause }) AND ( {$ extra_clause }) ORDER BY {$ order } " .
333
- "LIMIT {$ offset }, {$ limit }" ;
334
-
335
- array_unshift ($ argv , $ task ->getTableName ());
336
-
337
- $ conn = $ task ->establishConnection ('r ' );
338
- $ data = vqueryfx_all ($ conn , $ sql , $ argv );
281
+ $ order_map = array (
282
+ 'priority ' => ManiphestTaskQuery::ORDER_PRIORITY ,
283
+ 'created ' => ManiphestTaskQuery::ORDER_CREATED ,
284
+ );
285
+ $ query ->setOrderBy (
286
+ idx (
287
+ $ order_map ,
288
+ $ dict ['order ' ],
289
+ ManiphestTaskQuery::ORDER_MODIFIED ));
290
+
291
+ $ group_map = array (
292
+ 'priority ' => ManiphestTaskQuery::GROUP_PRIORITY ,
293
+ 'owner ' => ManiphestTaskQuery::GROUP_OWNER ,
294
+ 'status ' => ManiphestTaskQuery::GROUP_STATUS ,
295
+ );
296
+ $ query ->setGroupBy (
297
+ idx (
298
+ $ group_map ,
299
+ $ dict ['group ' ],
300
+ ManiphestTaskQuery::GROUP_NONE ));
339
301
340
- $ total_row_count = queryfx_one ($ conn , 'SELECT FOUND_ROWS() N ' );
341
- $ total_row_count = $ total_row_count ['N ' ];
302
+ $ query ->setCalculateRows (true );
303
+ $ query ->setLimit ($ dict ['limit ' ]);
304
+ $ query ->setOffset ($ dict ['offset ' ]);
342
305
343
- $ data = $ task ->loadAllFromArray ($ data );
306
+ $ data = $ query ->execute ();
307
+ $ total_row_count = $ query ->getRowCount ();
344
308
345
309
$ handle_phids = mpull ($ data , 'getOwnerPHID ' );
346
- $ handle_phids[] = $ view_phid ;
310
+ $ handle_phids = array_merge ( $ handle_phids , $ project_phids , $ user_phids ) ;
347
311
$ handles = id (new PhabricatorObjectHandleData ($ handle_phids ))
348
312
->loadHandles ();
349
313
0 commit comments