diff --git a/resources/celerity/map.php b/resources/celerity/map.php --- a/resources/celerity/map.php +++ b/resources/celerity/map.php @@ -415,7 +415,7 @@ 'rsrc/js/application/policy/behavior-policy-rule-editor.js' => 'fe9a552f', 'rsrc/js/application/ponder/behavior-votebox.js' => '4e9b766b', 'rsrc/js/application/projects/behavior-boards-dropdown.js' => '0ec56e1d', - 'rsrc/js/application/projects/behavior-project-boards.js' => 'f47fa23b', + 'rsrc/js/application/projects/behavior-project-boards.js' => 'd4bf1f3c', 'rsrc/js/application/projects/behavior-project-create.js' => '065227cc', 'rsrc/js/application/projects/behavior-reorder-columns.js' => '09eee344', 'rsrc/js/application/releeph/releeph-preview-branch.js' => 'b2b4fbaf', @@ -639,7 +639,7 @@ 'javelin-behavior-policy-control' => 'f3fef818', 'javelin-behavior-policy-rule-editor' => 'fe9a552f', 'javelin-behavior-ponder-votebox' => '4e9b766b', - 'javelin-behavior-project-boards' => 'f47fa23b', + 'javelin-behavior-project-boards' => 'd4bf1f3c', 'javelin-behavior-project-create' => '065227cc', 'javelin-behavior-refresh-csrf' => '7814b593', 'javelin-behavior-releeph-preview-branch' => 'b2b4fbaf', @@ -1700,6 +1700,14 @@ 'javelin-dom', 'javelin-view', ), + 'd4bf1f3c' => array( + 'javelin-behavior', + 'javelin-dom', + 'javelin-util', + 'javelin-stratcom', + 'javelin-workflow', + 'phabricator-draggable-list', + ), 'd4eecc63' => array( 'javelin-behavior', 'javelin-dom', @@ -1844,14 +1852,6 @@ 'phuix-action-view', 'javelin-workflow', ), - 'f47fa23b' => array( - 'javelin-behavior', - 'javelin-dom', - 'javelin-util', - 'javelin-stratcom', - 'javelin-workflow', - 'phabricator-draggable-list', - ), 'f51afce0' => array( 'javelin-behavior', 'javelin-request', diff --git a/src/applications/project/controller/PhabricatorProjectBoardViewController.php b/src/applications/project/controller/PhabricatorProjectBoardViewController.php --- a/src/applications/project/controller/PhabricatorProjectBoardViewController.php +++ b/src/applications/project/controller/PhabricatorProjectBoardViewController.php @@ -223,14 +223,8 @@ ->setHeader($column->getDisplayName()) ->setHeaderColor($column->getHeaderColor()); - $panel->setEditURI($board_uri.'column/'.$column->getID().'/'); - - $panel->setHeaderAction(id(new PHUIIconView()) - ->setIconFont('fa-plus') - ->setHref('/maniphest/task/create/') - ->addSigil('column-add-task') - ->setMetadata( - array('columnPHID' => $column->getPHID()))); + $column_menu = $this->buildColumnMenu($project, $column); + $panel->addHeaderAction($column_menu); $cards = id(new PHUIObjectItemListView()) ->setUser($viewer) @@ -511,6 +505,59 @@ return $manage_button; } + private function buildColumnMenu( + PhabricatorProject $project, + PhabricatorProjectColumn $column) { + + $request = $this->getRequest(); + $viewer = $request->getUser(); + + $can_edit = PhabricatorPolicyFilter::hasCapability( + $viewer, + $project, + PhabricatorPolicyCapability::CAN_EDIT); + + $column_items = array(); + + $column_items[] = id(new PhabricatorActionView()) + ->setIcon('fa-plus') + ->setName(pht('Create Task...')) + ->setHref('/maniphest/task/create/') + ->addSigil('column-add-task') + ->setMetadata( + array( + 'columnPHID' => $column->getPHID(), + )) + ->setDisabled(!$can_edit); + + $edit_uri = $this->getApplicationURI( + 'board/'.$this->id.'/column/'.$column->getID().'/'); + + $column_items[] = id(new PhabricatorActionView()) + ->setIcon('fa-pencil') + ->setName(pht('Edit Column')) + ->setHref($edit_uri) + ->setDisabled(!$can_edit) + ->setWorkflow(!$can_edit); + + $column_menu = id(new PhabricatorActionListView()) + ->setUser($viewer); + foreach ($column_items as $item) { + $column_menu->addAction($item); + } + + $column_button = id(new PHUIIconView()) + ->setIconFont('fa-caret-down') + ->setHref('#') + ->addSigil('boards-dropdown-menu') + ->setMetadata( + array( + 'items' => hsprintf('%s', $column_menu), + )); + + return $column_button; + } + private function initializeWorkboardDialog(PhabricatorProject $project) { $instructions = pht('This workboard has not been setup yet.'); diff --git a/src/view/phui/PHUITimelineEventView.php b/src/view/phui/PHUITimelineEventView.php --- a/src/view/phui/PHUITimelineEventView.php +++ b/src/view/phui/PHUITimelineEventView.php @@ -255,7 +255,7 @@ if ($items || $has_menu) { $icon = id(new PHUIIconView()) - ->setIconFont('fa-cog'); + ->setIconFont('fa-caret-down'); $aural = javelin_tag( 'span', array( diff --git a/src/view/phui/PHUIWorkpanelView.php b/src/view/phui/PHUIWorkpanelView.php --- a/src/view/phui/PHUIWorkpanelView.php +++ b/src/view/phui/PHUIWorkpanelView.php @@ -4,15 +4,9 @@ private $cards = array(); private $header; - private $editURI; - private $headerAction; private $footerAction; private $headerColor = PHUIActionHeaderView::HEADER_GREY; - - public function setHeaderAction(PHUIIconView $header_action) { - $this->headerAction = $header_action; - return $this; - } + private $headerActions = array(); public function setCards(PHUIObjectItemListView $cards) { $this->cards[] = $cards; @@ -24,11 +18,6 @@ return $this; } - public function setEditURI($edit_uri) { - $this->editURI = $edit_uri; - return $this; - } - public function setFooterAction(PHUIListItemView $footer_action) { $this->footerAction = $footer_action; return $this; @@ -39,6 +28,11 @@ return $this; } + public function addHeaderAction(PHUIIconView $action) { + $this->headerActions[] = $action; + return $this; + } + public function getTagAttributes() { return array( 'class' => 'phui-workpanel-view', @@ -61,20 +55,12 @@ $footer_tag); } - $header_edit = null; - if ($this->editURI) { - $header_edit = id(new PHUIIconView()) - ->setIconFont('fa-pencil') - ->setHref($this->editURI); - } $header = id(new PHUIActionHeaderView()) ->setHeaderTitle($this->header) ->setHeaderColor($this->headerColor); - if ($header_edit) { - $header->addAction($header_edit); - } - if ($this->headerAction) { - $header->addAction($this->headerAction); + + foreach ($this->headerActions as $action) { + $header->addAction($action); } $classes[] = 'phui-workpanel-'.$this->headerColor; diff --git a/webroot/rsrc/js/application/projects/behavior-project-boards.js b/webroot/rsrc/js/application/projects/behavior-project-boards.js --- a/webroot/rsrc/js/application/projects/behavior-project-boards.js +++ b/webroot/rsrc/js/application/projects/behavior-project-boards.js @@ -163,7 +163,11 @@ 'click', ['column-add-task'], function (e) { - e.kill(); + + // We want the 'boards-dropdown-menu' behavior to see this event and + // close the dropdown, but don't want to follow the link. + e.prevent(); + var column_phid = e.getNodeData('column-add-task').columnPHID; var request_data = { responseType: 'card',