@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

On workboards, provide all of the supported "create task" forms in the dropdown

Summary:
Ref T12314. Ref T6064. Ref T11580. If an install defines several different task create forms (like "Create Plant" and "Create Animal"), allow any of them to be created directly onto a workboard column.

This is just a general consistency improvement that makes Custom Forms and Workboards work together a bit better. We might do something fancier eventually for T6064 (which wants fewer clicks) and/or T11580 (which wants per-workboard control over forms or defaults).

Test Plan:
- Created several different types of tasks directly onto a workboard.
- Faked just one create form, saw the UI unchanged (except that it respects any renaming).

{F3492928}

Reviewers: chad

Reviewed By: chad

Maniphest Tasks: T12314, T11580, T6064

Differential Revision: https://secure.phabricator.com/D17446

+49 -59
+23 -23
resources/celerity/map.php
··· 441 441 'rsrc/js/application/projects/WorkboardBoard.js' => '8935deef', 442 442 'rsrc/js/application/projects/WorkboardCard.js' => 'c587b80f', 443 443 'rsrc/js/application/projects/WorkboardColumn.js' => '21df4ff5', 444 - 'rsrc/js/application/projects/WorkboardController.js' => '55baf5ed', 445 - 'rsrc/js/application/projects/behavior-project-boards.js' => '93ae974f', 444 + 'rsrc/js/application/projects/WorkboardController.js' => '26167537', 445 + 'rsrc/js/application/projects/behavior-project-boards.js' => '4250a34e', 446 446 'rsrc/js/application/projects/behavior-project-create.js' => '065227cc', 447 447 'rsrc/js/application/projects/behavior-reorder-columns.js' => 'e1d25dfb', 448 448 'rsrc/js/application/releeph/releeph-preview-branch.js' => 'b2b4fbaf', ··· 693 693 'javelin-behavior-phui-tab-group' => '0a0b10e9', 694 694 'javelin-behavior-policy-control' => 'd0c516d5', 695 695 'javelin-behavior-policy-rule-editor' => '5e9f347c', 696 - 'javelin-behavior-project-boards' => '93ae974f', 696 + 'javelin-behavior-project-boards' => '4250a34e', 697 697 'javelin-behavior-project-create' => '065227cc', 698 698 'javelin-behavior-quicksand-blacklist' => '7927a7d3', 699 699 'javelin-behavior-read-only-warning' => 'ba158207', ··· 767 767 'javelin-workboard-board' => '8935deef', 768 768 'javelin-workboard-card' => 'c587b80f', 769 769 'javelin-workboard-column' => '21df4ff5', 770 - 'javelin-workboard-controller' => '55baf5ed', 770 + 'javelin-workboard-controller' => '26167537', 771 771 'javelin-workflow' => '1e911d0f', 772 772 'maniphest-batch-editor' => 'b0f0b6d5', 773 773 'maniphest-report-css' => '9b9580b7', ··· 1089 1089 'javelin-workflow', 1090 1090 'javelin-util', 1091 1091 ), 1092 + 26167537 => array( 1093 + 'javelin-install', 1094 + 'javelin-dom', 1095 + 'javelin-util', 1096 + 'javelin-vector', 1097 + 'javelin-stratcom', 1098 + 'javelin-workflow', 1099 + 'phabricator-drag-and-drop-file-upload', 1100 + 'javelin-workboard-board', 1101 + ), 1092 1102 '2926fff2' => array( 1093 1103 'javelin-behavior', 1094 1104 'javelin-dom', ··· 1174 1184 'javelin-dom', 1175 1185 'javelin-request', 1176 1186 ), 1187 + '4250a34e' => array( 1188 + 'javelin-behavior', 1189 + 'javelin-dom', 1190 + 'javelin-util', 1191 + 'javelin-vector', 1192 + 'javelin-stratcom', 1193 + 'javelin-workflow', 1194 + 'javelin-workboard-controller', 1195 + ), 1177 1196 '44959b73' => array( 1178 1197 'javelin-util', 1179 1198 'javelin-uri', ··· 1306 1325 'javelin-behavior', 1307 1326 'javelin-vector', 1308 1327 'javelin-dom', 1309 - ), 1310 - '55baf5ed' => array( 1311 - 'javelin-install', 1312 - 'javelin-dom', 1313 - 'javelin-util', 1314 - 'javelin-vector', 1315 - 'javelin-stratcom', 1316 - 'javelin-workflow', 1317 - 'phabricator-drag-and-drop-file-upload', 1318 - 'javelin-workboard-board', 1319 1328 ), 1320 1329 '58dea2fa' => array( 1321 1330 'javelin-install', ··· 1628 1637 'javelin-behavior', 1629 1638 'javelin-stratcom', 1630 1639 'javelin-dom', 1631 - ), 1632 - '93ae974f' => array( 1633 - 'javelin-behavior', 1634 - 'javelin-dom', 1635 - 'javelin-util', 1636 - 'javelin-vector', 1637 - 'javelin-stratcom', 1638 - 'javelin-workflow', 1639 - 'javelin-workboard-controller', 1640 1640 ), 1641 1641 '93d0c9e3' => array( 1642 1642 'javelin-behavior',
+24 -31
src/applications/project/controller/PhabricatorProjectBoardViewController.php
··· 372 372 373 373 $behavior_config = array( 374 374 'moveURI' => $this->getApplicationURI('move/'.$project->getID().'/'), 375 - 'createURI' => $this->getCreateURI(), 376 375 'uploadURI' => '/file/dropupload/', 377 376 'coverURI' => $this->getApplicationURI('cover/'), 378 377 'chunkThreshold' => PhabricatorFileStorageEngine::getChunkThreshold(), ··· 800 799 $default_phid = $column->getProjectPHID(); 801 800 } 802 801 803 - $column_items[] = id(new PhabricatorActionView()) 804 - ->setIcon('fa-plus') 805 - ->setName(pht('Create Task...')) 806 - ->setHref($this->getCreateURI()) 807 - ->addSigil('column-add-task') 808 - ->setMetadata( 809 - array( 810 - 'columnPHID' => $column->getPHID(), 811 - 'boardPHID' => $project->getPHID(), 812 - 'projectPHID' => $default_phid, 813 - )); 802 + $specs = id(new ManiphestEditEngine()) 803 + ->setViewer($viewer) 804 + ->newCreateActionSpecifications(array()); 805 + 806 + foreach ($specs as $spec) { 807 + $column_items[] = id(new PhabricatorActionView()) 808 + ->setIcon($spec['icon']) 809 + ->setName($spec['name']) 810 + ->setHref($spec['uri']) 811 + ->setDisabled($spec['disabled']) 812 + ->addSigil('column-add-task') 813 + ->setMetadata( 814 + array( 815 + 'createURI' => $spec['uri'], 816 + 'columnPHID' => $column->getPHID(), 817 + 'boardPHID' => $project->getPHID(), 818 + 'projectPHID' => $default_phid, 819 + )); 820 + } 821 + 822 + if (count($specs) > 1) { 823 + $column_items[] = id(new PhabricatorActionView()) 824 + ->setType(PhabricatorActionView::TYPE_DIVIDER); 825 + } 814 826 815 827 $batch_edit_uri = $request->getRequestURI(); 816 828 $batch_edit_uri->setQueryParam('batch', $column->getID()); ··· 902 914 903 915 return $base; 904 916 } 905 - 906 - private function getCreateURI() { 907 - $viewer = $this->getViewer(); 908 - 909 - // TODO: This should be cleaned up, but maybe we're going to make options 910 - // for each column or board? 911 - $edit_config = id(new ManiphestEditEngine()) 912 - ->setViewer($viewer) 913 - ->loadDefaultEditConfiguration(new ManiphestTask()); 914 - if ($edit_config) { 915 - $form_key = $edit_config->getIdentifier(); 916 - $create_uri = "/maniphest/task/edit/form/{$form_key}/"; 917 - } else { 918 - $create_uri = '/maniphest/task/edit/'; 919 - } 920 - 921 - return $create_uri; 922 - } 923 - 924 917 925 918 private function buildInitializeContent(PhabricatorProject $project) { 926 919 $request = $this->getRequest();
+1 -1
src/applications/transactions/editengine/PhabricatorEditEngine.php
··· 1483 1483 * Build a raw description of available "Create New Object" UI options so 1484 1484 * other methods can build menus or buttons. 1485 1485 */ 1486 - private function newCreateActionSpecifications(array $parameters) { 1486 + public function newCreateActionSpecifications(array $parameters) { 1487 1487 $viewer = $this->getViewer(); 1488 1488 1489 1489 $can_create = $this->hasCreateCapability();
+1 -2
webroot/rsrc/js/application/projects/WorkboardController.js
··· 21 21 uploadURI: null, 22 22 coverURI: null, 23 23 moveURI: null, 24 - createURI: null, 25 24 chunkThreshold: null 26 25 }, 27 26 ··· 170 169 order: board.getOrder() 171 170 }; 172 171 173 - new JX.Workflow(this.getCreateURI(), request_data) 172 + new JX.Workflow(column_data.createURI, request_data) 174 173 .setHandler(JX.bind(board, board.updateCard)) 175 174 .start(); 176 175 },
-2
webroot/rsrc/js/application/projects/behavior-project-boards.js
··· 16 16 statics.projectPHID = update_config.projectPHID; 17 17 statics.order = update_config.order; 18 18 statics.moveURI = update_config.moveURI; 19 - statics.createURI = update_config.createURI; 20 19 } 21 20 22 21 function setup() { ··· 71 70 .setUploadURI(config.uploadURI) 72 71 .setCoverURI(config.coverURI) 73 72 .setMoveURI(config.moveURI) 74 - .setCreateURI(config.createURI) 75 73 .setChunkThreshold(config.chunkThreshold) 76 74 .start(); 77 75 }