@@ -91,6 +91,9 @@ public function buildResponse() {
91
91
$ content = $ this ->buildPanelConfigureContent ($ panel_list );
92
92
$ crumbs ->addTextCrumb (pht ('Configure Menu ' ));
93
93
break ;
94
+ case 'reorder ' :
95
+ $ content = $ this ->buildPanelReorderContent ($ panel_list );
96
+ break ;
94
97
case 'new ' :
95
98
$ panel_key = $ request ->getURIData ('panelKey ' );
96
99
$ content = $ this ->buildPanelNewContent ($ panel_key );
@@ -204,6 +207,8 @@ private function loadPanels() {
204
207
$ impl ->setViewer ($ viewer );
205
208
}
206
209
210
+ $ panels = msort ($ panels , 'getSortKey ' );
211
+
207
212
// Normalize keys since callers shouldn't rely on this array being
208
213
// partially keyed.
209
214
$ panels = array_values ($ panels );
@@ -305,6 +310,79 @@ private function getPanelURI($path) {
305
310
return "/project/ {$ id }/panel/ {$ path }" ;
306
311
}
307
312
313
+ private function buildPanelReorderContent (array $ panels ) {
314
+ $ viewer = $ this ->getViewer ();
315
+ $ object = $ this ->getProfileObject ();
316
+
317
+ PhabricatorPolicyFilter::requireCapability (
318
+ $ viewer ,
319
+ $ object ,
320
+ PhabricatorPolicyCapability::CAN_EDIT );
321
+
322
+ $ controller = $ this ->getController ();
323
+ $ request = $ controller ->getRequest ();
324
+
325
+ $ request ->validateCSRF ();
326
+
327
+ $ order = $ request ->getStrList ('order ' );
328
+
329
+ $ by_builtin = array ();
330
+ $ by_id = array ();
331
+
332
+ foreach ($ panels as $ key => $ panel ) {
333
+ $ id = $ panel ->getID ();
334
+ if ($ id ) {
335
+ $ by_id [$ id ] = $ key ;
336
+ continue ;
337
+ }
338
+
339
+ $ builtin_key = $ panel ->getBuiltinKey ();
340
+ if ($ builtin_key ) {
341
+ $ by_builtin [$ builtin_key ] = $ key ;
342
+ continue ;
343
+ }
344
+ }
345
+
346
+ $ key_order = array ();
347
+ foreach ($ order as $ order_item ) {
348
+ if (isset ($ by_id [$ order_item ])) {
349
+ $ key_order [] = $ by_id [$ order_item ];
350
+ continue ;
351
+ }
352
+ if (isset ($ by_builtin [$ order_item ])) {
353
+ $ key_order [] = $ by_builtin [$ order_item ];
354
+ continue ;
355
+ }
356
+ }
357
+
358
+ $ panels = array_select_keys ($ panels , $ key_order ) + $ panels ;
359
+
360
+ $ type_order =
361
+ PhabricatorProfilePanelConfigurationTransaction::TYPE_ORDER ;
362
+
363
+ $ order = 1 ;
364
+ foreach ($ panels as $ panel ) {
365
+ $ xactions = array ();
366
+
367
+ $ xactions [] = id (new PhabricatorProfilePanelConfigurationTransaction ())
368
+ ->setTransactionType ($ type_order )
369
+ ->setNewValue ($ order );
370
+
371
+ $ editor = id (new PhabricatorProfilePanelEditor ())
372
+ ->setContentSourceFromRequest ($ request )
373
+ ->setActor ($ viewer )
374
+ ->setContinueOnMissingFields (true )
375
+ ->setContinueOnNoEffect (true )
376
+ ->applyTransactions ($ panel , $ xactions );
377
+
378
+ $ order ++;
379
+ }
380
+
381
+ return id (new AphrontRedirectResponse ())
382
+ ->setURI ($ this ->getConfigureURI ());
383
+ }
384
+
385
+
308
386
private function buildPanelConfigureContent (array $ panels ) {
309
387
$ viewer = $ this ->getViewer ();
310
388
$ object = $ this ->getProfileObject ();
@@ -314,7 +392,18 @@ private function buildPanelConfigureContent(array $panels) {
314
392
$ object ,
315
393
PhabricatorPolicyCapability::CAN_EDIT );
316
394
317
- $ list = new PHUIObjectItemListView ();
395
+ $ list_id = celerity_generate_unique_node_id ();
396
+
397
+ Javelin::initBehavior (
398
+ 'reorder-profile-menu-items ' ,
399
+ array (
400
+ 'listID ' => $ list_id ,
401
+ 'orderURI ' => $ this ->getPanelURI ('reorder/ ' ),
402
+ ));
403
+
404
+ $ list = id (new PHUIObjectItemListView ())
405
+ ->setID ($ list_id );
406
+
318
407
foreach ($ panels as $ panel ) {
319
408
$ id = $ panel ->getID ();
320
409
$ builtin_key = $ panel ->getBuiltinKey ();
@@ -336,6 +425,14 @@ private function buildPanelConfigureContent(array $panels) {
336
425
$ item ->addAttribute ($ type );
337
426
338
427
if ($ can_edit ) {
428
+ $ item
429
+ ->setGrippable (true )
430
+ ->addSigil ('profile-menu-item ' )
431
+ ->setMetadata (
432
+ array (
433
+ 'key ' => nonempty ($ id , $ builtin_key ),
434
+ ));
435
+
339
436
if ($ id ) {
340
437
$ item ->setHref ($ this ->getPanelURI ("edit/ {$ id }/ " ));
341
438
} else {
0 commit comments