From 5a44c85b6ba24e2c3681626e8b6b0aed9861f8f0 Mon Sep 17 00:00:00 2001 From: epriestley Date: Tue, 16 Feb 2016 06:24:15 -0800 Subject: [PATCH] Move uncommon workboard management options to "Manage Board" view Summary: This gives us room for less-common workboard management options like "Disable Board" without overloading the menus on the main board. Particularly, we can add background color options here without anything getting weird. I've left "Add Column" on the main UI since I think it's common enough to leave there. We could probably move "Hide Column" to this UI in the future, though. Test Plan: {F1114475} Reviewers: chad Reviewed By: chad Differential Revision: https://secure.phabricator.com/D15278 --- src/__phutil_library_map__.php | 2 + .../PhabricatorProjectApplication.php | 2 + ...habricatorProjectBoardManageController.php | 155 ++++++++++++++++++ ...abricatorProjectBoardReorderController.php | 4 +- .../PhabricatorProjectBoardViewController.php | 26 +-- 5 files changed, 165 insertions(+), 24 deletions(-) create mode 100644 src/applications/project/controller/PhabricatorProjectBoardManageController.php diff --git a/src/__phutil_library_map__.php b/src/__phutil_library_map__.php index 0a79cfeef1..c9c52a9d8a 100644 --- a/src/__phutil_library_map__.php +++ b/src/__phutil_library_map__.php @@ -2872,6 +2872,7 @@ phutil_register_library_map(array( 'PhabricatorProjectBoardController' => 'applications/project/controller/PhabricatorProjectBoardController.php', 'PhabricatorProjectBoardDisableController' => 'applications/project/controller/PhabricatorProjectBoardDisableController.php', 'PhabricatorProjectBoardImportController' => 'applications/project/controller/PhabricatorProjectBoardImportController.php', + 'PhabricatorProjectBoardManageController' => 'applications/project/controller/PhabricatorProjectBoardManageController.php', 'PhabricatorProjectBoardReorderController' => 'applications/project/controller/PhabricatorProjectBoardReorderController.php', 'PhabricatorProjectBoardViewController' => 'applications/project/controller/PhabricatorProjectBoardViewController.php', 'PhabricatorProjectCardView' => 'applications/project/view/PhabricatorProjectCardView.php', @@ -7300,6 +7301,7 @@ phutil_register_library_map(array( 'PhabricatorProjectBoardController' => 'PhabricatorProjectController', 'PhabricatorProjectBoardDisableController' => 'PhabricatorProjectBoardController', 'PhabricatorProjectBoardImportController' => 'PhabricatorProjectBoardController', + 'PhabricatorProjectBoardManageController' => 'PhabricatorProjectBoardController', 'PhabricatorProjectBoardReorderController' => 'PhabricatorProjectBoardController', 'PhabricatorProjectBoardViewController' => 'PhabricatorProjectBoardController', 'PhabricatorProjectCardView' => 'AphrontTagView', diff --git a/src/applications/project/application/PhabricatorProjectApplication.php b/src/applications/project/application/PhabricatorProjectApplication.php index 3a39aefa22..86f050d281 100644 --- a/src/applications/project/application/PhabricatorProjectApplication.php +++ b/src/applications/project/application/PhabricatorProjectApplication.php @@ -84,6 +84,8 @@ final class PhabricatorProjectApplication extends PhabricatorApplication { => 'PhabricatorProjectBoardReorderController', 'disable/' => 'PhabricatorProjectBoardDisableController', + 'manage/' + => 'PhabricatorProjectBoardManageController', ), 'update/(?P[1-9]\d*)/(?P[^/]+)/' => 'PhabricatorProjectUpdateController', diff --git a/src/applications/project/controller/PhabricatorProjectBoardManageController.php b/src/applications/project/controller/PhabricatorProjectBoardManageController.php new file mode 100644 index 0000000000..b21ea0cf46 --- /dev/null +++ b/src/applications/project/controller/PhabricatorProjectBoardManageController.php @@ -0,0 +1,155 @@ +getViewer(); + $board_id = $request->getURIData('projectID'); + + $board = id(new PhabricatorProjectQuery()) + ->setViewer($viewer) + ->withIDs(array($board_id)) + ->needImages(true) + ->executeOne(); + if (!$board) { + return new Aphront404Response(); + } + $this->setProject($board); + + // Perform layout of no tasks to load and populate the columns in the + // correct order. + $layout_engine = id(new PhabricatorBoardLayoutEngine()) + ->setViewer($viewer) + ->setBoardPHIDs(array($board->getPHID())) + ->setObjectPHIDs(array()) + ->setFetchAllBoards(true) + ->executeLayout(); + + $columns = $layout_engine->getColumns($board->getPHID()); + + $board_id = $board->getID(); + + $header = $this->buildHeaderView($board); + $actions = $this->buildActionView($board); + $properties = $this->buildPropertyView($board); + + $properties->setActionList($actions); + + $crumbs = $this->buildApplicationCrumbs(); + $crumbs->addTextCrumb(pht('Workboard'), "/project/board/{$board_id}/"); + $crumbs->addTextCrumb(pht('Manage')); + + $box = id(new PHUIObjectBoxView()) + ->setHeader($header) + ->addPropertyList($properties); + + $nav = $this->getProfileMenu(); + + $title = array( + pht('Manage Workboard'), + $board->getDisplayName(), + ); + + $columns_list = $this->buildColumnsList($board, $columns); + + return $this->newPage() + ->setTitle($title) + ->setNavigation($nav) + ->setCrumbs($crumbs) + ->appendChild( + array( + $box, + $columns_list, + )); + } + + private function buildHeaderView(PhabricatorProject $board) { + $viewer = $this->getRequest()->getUser(); + + $header = id(new PHUIHeaderView()) + ->setUser($viewer) + ->setHeader(pht('Workboard: %s', $board->getDisplayName())); + + return $header; + } + + private function buildActionView(PhabricatorProject $board) { + $viewer = $this->getRequest()->getUser(); + $id = $board->getID(); + + $actions = id(new PhabricatorActionListView()) + ->setUser($viewer); + + $can_edit = PhabricatorPolicyFilter::hasCapability( + $viewer, + $board, + PhabricatorPolicyCapability::CAN_EDIT); + + $reorder_uri = $this->getApplicationURI("board/{$id}/reorder/"); + + $actions->addAction( + id(new PhabricatorActionView()) + ->setIcon('fa-exchange') + ->setName(pht('Reorder Columns')) + ->setHref($reorder_uri) + ->setDisabled(!$can_edit) + ->setWorkflow(true)); + + $disable_uri = $this->getApplicationURI("board/{$id}/disable/"); + + $actions->addAction( + id(new PhabricatorActionView()) + ->setIcon('fa-ban') + ->setName(pht('Disable Board')) + ->setHref($disable_uri) + ->setDisabled(!$can_edit) + ->setWorkflow(true)); + + return $actions; + } + + private function buildPropertyView( + PhabricatorProject $board) { + $viewer = $this->getRequest()->getUser(); + + $properties = id(new PHUIPropertyListView()) + ->setUser($viewer) + ->setObject($board); + + return $properties; + } + + private function buildColumnsList( + PhabricatorProject $board, + array $columns) { + assert_instances_of($columns, 'PhabricatorProjectColumn'); + + $board_id = $board->getID(); + + $view = id(new PHUIObjectItemListView()) + ->setNoDataString(pht('This board has no columns.')); + + foreach ($columns as $column) { + $column_id = $column->getID(); + + $detail_uri = "/project/board/{$board_id}/column/{$column_id}/"; + + $item = id(new PHUIObjectItemView()) + ->setHeader($column->getDisplayName()) + ->setHref($detail_uri); + + if ($column->isHidden()) { + $item->setDisabled(true); + } + + $view->addItem($item); + } + + return id(new PHUIObjectBoxView()) + ->setHeaderText(pht('Columns')) + ->setObjectList($view); + } + + +} diff --git a/src/applications/project/controller/PhabricatorProjectBoardReorderController.php b/src/applications/project/controller/PhabricatorProjectBoardReorderController.php index 011bbd069a..05f1dd2d43 100644 --- a/src/applications/project/controller/PhabricatorProjectBoardReorderController.php +++ b/src/applications/project/controller/PhabricatorProjectBoardReorderController.php @@ -23,13 +23,13 @@ final class PhabricatorProjectBoardReorderController $this->setProject($project); $project_id = $project->getID(); - $board_uri = $this->getApplicationURI("board/{$project_id}/"); + $manage_uri = $this->getApplicationURI("board/{$project_id}/manage/"); $reorder_uri = $this->getApplicationURI("board/{$project_id}/reorder/"); if ($request->isFormPost()) { // User clicked "Done", make sure the page reloads to show the new // column order. - return id(new AphrontRedirectResponse())->setURI($board_uri); + return id(new AphrontRedirectResponse())->setURI($manage_uri); } $columns = id(new PhabricatorProjectColumnQuery()) diff --git a/src/applications/project/controller/PhabricatorProjectBoardViewController.php b/src/applications/project/controller/PhabricatorProjectBoardViewController.php index 963cb2a752..8bb58779dc 100644 --- a/src/applications/project/controller/PhabricatorProjectBoardViewController.php +++ b/src/applications/project/controller/PhabricatorProjectBoardViewController.php @@ -680,9 +680,8 @@ final class PhabricatorProjectBoardViewController $id = $project->getID(); - $disable_uri = $this->getApplicationURI("board/{$id}/disable/"); + $manage_uri = $this->getApplicationURI("board/{$id}/manage/"); $add_uri = $this->getApplicationURI("board/{$id}/edit/"); - $reorder_uri = $this->getApplicationURI("board/{$id}/reorder/"); $can_edit = PhabricatorPolicyFilter::hasCapability( $viewer, @@ -699,11 +698,9 @@ final class PhabricatorProjectBoardViewController ->setWorkflow(true); $manage_items[] = id(new PhabricatorActionView()) - ->setIcon('fa-exchange') - ->setName(pht('Reorder Columns')) - ->setHref($reorder_uri) - ->setDisabled(!$can_edit) - ->setWorkflow(true); + ->setIcon('fa-pencil') + ->setName(pht('Manage Board')) + ->setHref($manage_uri); if ($show_hidden) { $hidden_uri = $this->getURIWithState() @@ -735,13 +732,6 @@ final class PhabricatorProjectBoardViewController ->setHref($batch_edit_uri) ->setDisabled(!$can_batch_edit); - $manage_items[] = id(new PhabricatorActionView()) - ->setIcon('fa-ban') - ->setName(pht('Disable Workboard')) - ->setHref($disable_uri) - ->setWorkflow(true) - ->setDisabled(!$can_edit); - $manage_menu = id(new PhabricatorActionListView()) ->setUser($viewer); foreach ($manage_items as $item) { @@ -826,14 +816,6 @@ final class PhabricatorProjectBoardViewController ->setHref($batch_edit_uri) ->setDisabled(!$can_batch_edit); - $detail_uri = $this->getApplicationURI( - 'board/'.$this->id.'/column/'.$column->getID().'/'); - - $column_items[] = id(new PhabricatorActionView()) - ->setIcon('fa-columns') - ->setName(pht('Column Details')) - ->setHref($detail_uri); - $can_hide = ($can_edit && !$column->isDefaultColumn()); $hide_uri = 'board/'.$this->id.'/hide/'.$column->getID().'/'; $hide_uri = $this->getApplicationURI($hide_uri);