@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
at upstream/main 148 lines 4.0 kB view raw
1<?php 2 3final class PhabricatorProjectBoardManageController 4 extends PhabricatorProjectBoardController { 5 6 public function handleRequest(AphrontRequest $request) { 7 $viewer = $request->getViewer(); 8 $board_id = $request->getURIData('projectID'); 9 10 $board = id(new PhabricatorProjectQuery()) 11 ->setViewer($viewer) 12 ->withIDs(array($board_id)) 13 ->needImages(true) 14 ->executeOne(); 15 if (!$board) { 16 return new Aphront404Response(); 17 } 18 $this->setProject($board); 19 20 // Perform layout of no tasks to load and populate the columns in the 21 // correct order. 22 $layout_engine = id(new PhabricatorBoardLayoutEngine()) 23 ->setViewer($viewer) 24 ->setBoardPHIDs(array($board->getPHID())) 25 ->setObjectPHIDs(array()) 26 ->setFetchAllBoards(true) 27 ->executeLayout(); 28 29 $columns = $layout_engine->getColumns($board->getPHID()); 30 31 $board_id = $board->getID(); 32 33 $header = $this->buildHeaderView($board); 34 $curtain = $this->buildCurtainView($board); 35 36 $crumbs = $this->buildApplicationCrumbs(); 37 $crumbs->addTextCrumb(pht('Workboard'), $board->getWorkboardURI()); 38 $crumbs->addTextCrumb(pht('Manage')); 39 $crumbs->setBorder(true); 40 41 $nav = $this->newNavigation( 42 $board, 43 PhabricatorProject::ITEM_WORKBOARD); 44 $columns_list = $this->buildColumnsList($board, $columns); 45 46 require_celerity_resource('project-view-css'); 47 48 $view = id(new PHUITwoColumnView()) 49 ->setHeader($header) 50 ->addClass('project-view-home') 51 ->addClass('project-view-people-home') 52 ->setCurtain($curtain) 53 ->setMainColumn($columns_list); 54 55 $title = array( 56 pht('Manage Workboard'), 57 $board->getDisplayName(), 58 ); 59 60 return $this->newPage() 61 ->setTitle($title) 62 ->setNavigation($nav) 63 ->setCrumbs($crumbs) 64 ->appendChild($view); 65 } 66 67 private function buildHeaderView(PhabricatorProject $board) { 68 $viewer = $this->getViewer(); 69 70 $header = id(new PHUIHeaderView()) 71 ->setHeader(pht('Workboard: %s', $board->getDisplayName())) 72 ->setUser($viewer); 73 74 return $header; 75 } 76 77 private function buildCurtainView(PhabricatorProject $board) { 78 $viewer = $this->getViewer(); 79 $id = $board->getID(); 80 81 $curtain = $this->newCurtainView(); 82 83 $can_edit = PhabricatorPolicyFilter::hasCapability( 84 $viewer, 85 $board, 86 PhabricatorPolicyCapability::CAN_EDIT); 87 88 $disable_uri = $this->getApplicationURI("board/{$id}/disable/"); 89 90 $curtain->addAction( 91 id(new PhabricatorActionView()) 92 ->setIcon('fa-ban') 93 ->setName(pht('Disable Workboard')) 94 ->setHref($disable_uri) 95 ->setDisabled(!$can_edit) 96 ->setWorkflow(true)); 97 98 return $curtain; 99 } 100 101 /** 102 * @param PhabricatorProject $board 103 * @param array<PhabricatorProjectColumn> $columns 104 */ 105 private function buildColumnsList( 106 PhabricatorProject $board, 107 array $columns) { 108 assert_instances_of($columns, PhabricatorProjectColumn::class); 109 110 $board_id = $board->getID(); 111 112 $view = id(new PHUIObjectItemListView()) 113 ->setNoDataString(pht('This board has no columns.')); 114 115 foreach ($columns as $column) { 116 $column_id = $column->getID(); 117 118 $proxy = $column->getProxy(); 119 if ($proxy && !$proxy->isMilestone()) { 120 continue; 121 } 122 123 $detail_uri = "/project/board/{$board_id}/column/{$column_id}/"; 124 125 $item = id(new PHUIObjectItemView()) 126 ->setHeader($column->getDisplayName()) 127 ->setHref($detail_uri); 128 129 if ($column->isHidden()) { 130 $item->setDisabled(true); 131 $item->addAttribute(pht('Hidden')); 132 $item->setImageIcon('fa-columns grey'); 133 } else { 134 $item->addAttribute(pht('Visible')); 135 $item->setImageIcon('fa-columns'); 136 } 137 138 $view->addItem($item); 139 } 140 141 return id(new PHUIObjectBoxView()) 142 ->setHeaderText(pht('Columns')) 143 ->setBackground(PHUIObjectBoxView::BLUE_PROPERTY) 144 ->setObjectList($view); 145 } 146 147 148}