@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 recaptime-dev/main 192 lines 5.2 kB view raw
1<?php 2 3final class DiffusionRepositoryManagePanelsController 4 extends DiffusionRepositoryManageController { 5 6 private $navigation; 7 8 public function buildApplicationMenu() { 9 // TODO: This is messy for now; the mobile menu should be set automatically 10 // when the body content is a two-column view with navigation. 11 if ($this->navigation) { 12 return $this->navigation->getMenu(); 13 } 14 return parent::buildApplicationMenu(); 15 } 16 17 18 public function handleRequest(AphrontRequest $request) { 19 $response = $this->loadDiffusionContext(); 20 if ($response) { 21 return $response; 22 } 23 24 $viewer = $this->getViewer(); 25 $drequest = $this->getDiffusionRequest(); 26 $repository = $drequest->getRepository(); 27 28 $panels = DiffusionRepositoryManagementPanel::getAllPanels(); 29 30 foreach ($panels as $key => $panel) { 31 $panel 32 ->setViewer($viewer) 33 ->setRepository($repository) 34 ->setController($this); 35 36 if (!$panel->shouldEnableForRepository($repository)) { 37 unset($panels[$key]); 38 continue; 39 } 40 } 41 42 $selected = $request->getURIData('panel'); 43 if (!phutil_nonempty_string($selected)) { 44 $selected = head_key($panels); 45 } 46 47 if (empty($panels[$selected])) { 48 return new Aphront404Response(); 49 } 50 51 $nav = $this->renderSideNav($repository, $panels, $selected); 52 $this->navigation = $nav; 53 54 $panel = $panels[$selected]; 55 56 $crumbs = $this->buildApplicationCrumbs(); 57 $crumbs->addTextCrumb($panel->getManagementPanelLabel()); 58 $crumbs->setBorder(true); 59 60 $content = $panel->buildManagementPanelContent(); 61 62 $title = array( 63 $panel->getManagementPanelLabel(), 64 $repository->getDisplayName(), 65 ); 66 67 $header = $this->buildHeaderView($repository->getDisplayName()); 68 69 $view = id(new PHUITwoColumnView()) 70 ->setHeader($header) 71 ->setMainColumn($content); 72 73 $curtain = $panel->buildManagementPanelCurtain(); 74 if ($curtain) { 75 $view->setCurtain($curtain); 76 } 77 78 return $this->newPage() 79 ->setTitle($title) 80 ->setCrumbs($crumbs) 81 ->setNavigation($nav) 82 ->appendChild($view); 83 } 84 85 private function renderSideNav( 86 PhabricatorRepository $repository, 87 array $panels, 88 $selected) { 89 90 $base_uri = $repository->getPathURI('manage/'); 91 $base_uri = new PhutilURI($base_uri); 92 93 $nav = id(new AphrontSideNavFilterView()) 94 ->setBaseURI($base_uri); 95 96 $groups = DiffusionRepositoryManagementPanelGroup::getAllPanelGroups(); 97 $panel_groups = mgroup($panels, 'getManagementPanelGroupKey'); 98 $other_key = DiffusionRepositoryManagementOtherPanelGroup::PANELGROUPKEY; 99 100 foreach ($groups as $group_key => $group) { 101 // If this is the "Other" group, include everything else that isn't in 102 // some actual group. 103 if ($group_key === $other_key) { 104 $group_panels = array_mergev($panel_groups); 105 $panel_groups = array(); 106 } else { 107 $group_panels = idx($panel_groups, $group_key); 108 unset($panel_groups[$group_key]); 109 } 110 111 if (!$group_panels) { 112 continue; 113 } 114 115 $label = $group->getManagementPanelGroupLabel(); 116 if ($label) { 117 $nav->addLabel($label); 118 } 119 120 foreach ($group_panels as $panel) { 121 $key = $panel->getManagementPanelKey(); 122 $label = $panel->getManagementPanelLabel(); 123 $icon = $panel->getManagementPanelIcon(); 124 $href = $panel->getPanelNavigationURI(); 125 126 $item = id(new PHUIListItemView()) 127 ->setKey($key) 128 ->setName($label) 129 ->setType(PHUIListItemView::TYPE_LINK) 130 ->setHref($href) 131 ->setIcon($icon); 132 133 $nav->addMenuItem($item); 134 } 135 } 136 137 $nav->selectFilter($selected); 138 139 return $nav; 140 } 141 142 public function buildHeaderView($title) { 143 $viewer = $this->getViewer(); 144 145 $drequest = $this->getDiffusionRequest(); 146 $repository = $drequest->getRepository(); 147 148 $header = id(new PHUIHeaderView()) 149 ->setHeader($title) 150 ->setProfileHeader(true) 151 ->setHref($repository->getURI()) 152 ->setImage($repository->getProfileImageURI()); 153 154 if ($repository->isTracked()) { 155 $header->setStatus('fa-check', 'bluegrey', pht('Active')); 156 } else { 157 $header->setStatus('fa-ban', 'dark', pht('Inactive')); 158 } 159 160 $doc_href = PhabricatorEnv::getDoclink( 161 'Diffusion User Guide: Managing Repositories'); 162 163 $header->addActionLink( 164 id(new PHUIButtonView()) 165 ->setTag('a') 166 ->setText(pht('View Repository')) 167 ->setHref($repository->getURI()) 168 ->setIcon('fa-code') 169 ->setColor(PHUIButtonView::GREY)); 170 171 $header->addActionLink( 172 id(new PHUIButtonView()) 173 ->setTag('a') 174 ->setIcon('fa-book') 175 ->setHref($doc_href) 176 ->setText(pht('Help')) 177 ->setColor(PHUIButtonView::GREY)); 178 179 return $header; 180 } 181 182 public function newTimeline(PhabricatorRepository $repository) { 183 $timeline = $this->buildTransactionTimeline( 184 $repository, 185 new PhabricatorRepositoryTransactionQuery()); 186 $timeline->setShouldTerminate(true); 187 188 return $timeline; 189 } 190 191 192}