Path: blob/master/src/applications/owners/controller/PhabricatorOwnersDetailController.php
13450 views
<?php12final class PhabricatorOwnersDetailController3extends PhabricatorOwnersController {45public function shouldAllowPublic() {6return true;7}89public function handleRequest(AphrontRequest $request) {10$viewer = $this->getViewer();1112$package = id(new PhabricatorOwnersPackageQuery())13->setViewer($viewer)14->withIDs(array($request->getURIData('id')))15->needPaths(true)16->executeOne();17if (!$package) {18return new Aphront404Response();19}2021$paths = $package->getPaths();2223$repository_phids = array();24foreach ($paths as $path) {25$repository_phids[$path->getRepositoryPHID()] = true;26}2728if ($repository_phids) {29$repositories = id(new PhabricatorRepositoryQuery())30->setViewer($viewer)31->withPHIDs(array_keys($repository_phids))32->execute();33$repositories = mpull($repositories, null, 'getPHID');34} else {35$repositories = array();36}3738$field_list = PhabricatorCustomField::getObjectFields(39$package,40PhabricatorCustomField::ROLE_VIEW);41$field_list42->setViewer($viewer)43->readFieldsFromStorage($package);4445$curtain = $this->buildCurtain($package);46$details = $this->buildPackageDetailView($package, $field_list);4748if ($package->isArchived()) {49$header_icon = 'fa-ban';50$header_name = pht('Archived');51$header_color = 'dark';52} else {53$header_icon = 'fa-check';54$header_name = pht('Active');55$header_color = 'bluegrey';56}5758$header = id(new PHUIHeaderView())59->setUser($viewer)60->setHeader($package->getName())61->setStatus($header_icon, $header_color, $header_name)62->setPolicyObject($package)63->setHeaderIcon('fa-gift');6465$commit_views = array();6667$params = array(68'package' => $package->getPHID(),69);7071$commit_uri = new PhutilURI('/diffusion/commit/', $params);7273$status_concern = DiffusionCommitAuditStatus::CONCERN_RAISED;7475$attention_commits = id(new DiffusionCommitQuery())76->setViewer($request->getUser())77->withPackagePHIDs(array($package->getPHID()))78->withStatuses(79array(80$status_concern,81))82->needCommitData(true)83->needAuditRequests(true)84->needIdentities(true)85->setLimit(10)86->execute();87$view = id(new DiffusionCommitGraphView())88->setViewer($viewer)89->setCommits($attention_commits)90->newObjectItemListView();9192$view->setNoDataString(pht('This package has no open problem commits.'));9394$commit_views[] = array(95'view' => $view,96'header' => pht('Needs Attention'),97'icon' => 'fa-warning',98'button' => id(new PHUIButtonView())99->setTag('a')100->setHref($commit_uri->alter('status', $status_concern))101->setIcon('fa-list-ul')102->setText(pht('View All')),103);104105$all_commits = id(new DiffusionCommitQuery())106->setViewer($request->getUser())107->withPackagePHIDs(array($package->getPHID()))108->needCommitData(true)109->needAuditRequests(true)110->needIdentities(true)111->setLimit(25)112->execute();113114$view = id(new DiffusionCommitGraphView())115->setViewer($viewer)116->setCommits($all_commits)117->newObjectItemListView();118119$view->setNoDataString(pht('No commits in this package.'));120121$commit_views[] = array(122'view' => $view,123'header' => pht('Recent Commits'),124'icon' => 'fa-code',125'button' => id(new PHUIButtonView())126->setTag('a')127->setHref($commit_uri)128->setIcon('fa-list-ul')129->setText(pht('View All')),130);131132$commit_panels = array();133foreach ($commit_views as $commit_view) {134$commit_panel = id(new PHUIObjectBoxView())135->setBackground(PHUIObjectBoxView::BLUE_PROPERTY);136$commit_header = id(new PHUIHeaderView())137->setHeader($commit_view['header'])138->setHeaderIcon($commit_view['icon']);139if (isset($commit_view['button'])) {140$commit_header->addActionLink($commit_view['button']);141}142$commit_panel->setHeader($commit_header);143$commit_panel->appendChild($commit_view['view']);144145$commit_panels[] = $commit_panel;146}147148$crumbs = $this->buildApplicationCrumbs();149$crumbs->addTextCrumb($package->getMonogram());150$crumbs->setBorder(true);151152$rules_view = $this->newRulesView($package);153154$timeline = $this->buildTransactionTimeline(155$package,156new PhabricatorOwnersPackageTransactionQuery());157$timeline->setShouldTerminate(true);158159$view = id(new PHUITwoColumnView())160->setHeader($header)161->setCurtain($curtain)162->setMainColumn(array(163$this->renderPathsTable($paths, $repositories),164$rules_view,165$commit_panels,166$timeline,167))168->addPropertySection(pht('Details'), $details);169170return $this->newPage()171->setTitle($package->getName())172->setCrumbs($crumbs)173->appendChild($view);174}175176private function buildPackageDetailView(177PhabricatorOwnersPackage $package,178PhabricatorCustomFieldList $field_list) {179180$viewer = $this->getViewer();181$view = id(new PHUIPropertyListView())182->setUser($viewer);183184$owners = $package->getOwners();185if ($owners) {186$owner_list = $viewer->renderHandleList(mpull($owners, 'getUserPHID'));187} else {188$owner_list = phutil_tag('em', array(), pht('None'));189}190$view->addProperty(pht('Owners'), $owner_list);191192193$dominion = $package->getDominion();194$dominion_map = PhabricatorOwnersPackage::getDominionOptionsMap();195$spec = idx($dominion_map, $dominion, array());196$name = idx($spec, 'short', $dominion);197$view->addProperty(pht('Dominion'), $name);198199$authority_mode = $package->getAuthorityMode();200$authority_map = PhabricatorOwnersPackage::getAuthorityOptionsMap();201$spec = idx($authority_map, $authority_mode, array());202$name = idx($spec, 'short', $authority_mode);203$view->addProperty(pht('Authority'), $name);204205$auto = $package->getAutoReview();206$autoreview_map = PhabricatorOwnersPackage::getAutoreviewOptionsMap();207$spec = idx($autoreview_map, $auto, array());208$name = idx($spec, 'name', $auto);209$view->addProperty(pht('Auto Review'), $name);210211$rule = $package->newAuditingRule();212$view->addProperty(pht('Auditing'), $rule->getDisplayName());213214$ignored = $package->getIgnoredPathAttributes();215$ignored = array_keys($ignored);216if ($ignored) {217$ignored = implode(', ', $ignored);218} else {219$ignored = phutil_tag('em', array(), pht('None'));220}221222$view->addProperty(pht('Ignored Attributes'), $ignored);223224$description = $package->getDescription();225if (strlen($description)) {226$description = new PHUIRemarkupView($viewer, $description);227$view->addSectionHeader(pht('Description'));228$view->addTextContent($description);229}230231$field_list->appendFieldsToPropertyList(232$package,233$viewer,234$view);235236return $view;237}238239private function buildCurtain(PhabricatorOwnersPackage $package) {240$viewer = $this->getViewer();241242$can_edit = PhabricatorPolicyFilter::hasCapability(243$viewer,244$package,245PhabricatorPolicyCapability::CAN_EDIT);246247$id = $package->getID();248$edit_uri = $this->getApplicationURI("/edit/{$id}/");249$paths_uri = $this->getApplicationURI("/paths/{$id}/");250251$curtain = $this->newCurtainView($package);252253$curtain->addAction(254id(new PhabricatorActionView())255->setName(pht('Edit Package'))256->setIcon('fa-pencil')257->setDisabled(!$can_edit)258->setWorkflow(!$can_edit)259->setHref($edit_uri));260261if ($package->isArchived()) {262$curtain->addAction(263id(new PhabricatorActionView())264->setName(pht('Activate Package'))265->setIcon('fa-check')266->setDisabled(!$can_edit)267->setWorkflow($can_edit)268->setHref($this->getApplicationURI("/archive/{$id}/")));269} else {270$curtain->addAction(271id(new PhabricatorActionView())272->setName(pht('Archive Package'))273->setIcon('fa-ban')274->setDisabled(!$can_edit)275->setWorkflow($can_edit)276->setHref($this->getApplicationURI("/archive/{$id}/")));277}278279$curtain->addAction(280id(new PhabricatorActionView())281->setName(pht('Edit Paths'))282->setIcon('fa-folder-open')283->setDisabled(!$can_edit)284->setWorkflow(!$can_edit)285->setHref($paths_uri));286287return $curtain;288}289290private function renderPathsTable(array $paths, array $repositories) {291$viewer = $this->getViewer();292293$rows = array();294foreach ($paths as $path) {295$repo = idx($repositories, $path->getRepositoryPHID());296if (!$repo) {297continue;298}299$href = $repo->generateURI(300array(301'branch' => $repo->getDefaultBranch(),302'path' => $path->getPathDisplay(),303'action' => 'browse',304));305306$path_link = phutil_tag(307'a',308array(309'href' => (string)$href,310),311$path->getPathDisplay());312313$rows[] = array(314($path->getExcluded() ? '-' : '+'),315$repo->getName(),316$path_link,317);318}319320$info = null;321if (!$paths) {322$info = id(new PHUIInfoView())323->setSeverity(PHUIInfoView::SEVERITY_WARNING)324->setErrors(325array(326pht(327'This package does not contain any paths yet. Use '.328'"Edit Paths" to add some.'),329));330}331332$table = id(new AphrontTableView($rows))333->setHeaders(334array(335null,336pht('Repository'),337pht('Path'),338))339->setColumnClasses(340array(341null,342null,343'wide',344));345346if ($info) {347$table->setNotice($info);348}349350$header = id(new PHUIHeaderView())351->setHeader(pht('Paths'))352->setHeaderIcon('fa-folder-open');353354$box = id(new PHUIObjectBoxView())355->setHeader($header)356->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)357->setTable($table);358359return $box;360}361362private function newRulesView(PhabricatorOwnersPackage $package) {363$viewer = $this->getViewer();364365$limit = 10;366$rules = id(new HeraldRuleQuery())367->setViewer($viewer)368->withDisabled(false)369->withAffectedObjectPHIDs(array($package->getPHID()))370->needValidateAuthors(true)371->setLimit($limit + 1)372->execute();373374$more_results = (count($rules) > $limit);375$rules = array_slice($rules, 0, $limit);376377$list = id(new HeraldRuleListView())378->setViewer($viewer)379->setRules($rules)380->newObjectList();381382$list->setNoDataString(383pht(384'No active Herald rules add this package as an auditor, reviewer, '.385'or subscriber.'));386387$more_href = new PhutilURI(388'/herald/',389array('affectedPHID' => $package->getPHID()));390391if ($more_results) {392$list->newTailButton()393->setHref($more_href);394}395396$more_link = id(new PHUIButtonView())397->setTag('a')398->setIcon('fa-list-ul')399->setText(pht('View All Rules'))400->setHref($more_href);401402$header = id(new PHUIHeaderView())403->setHeader(pht('Affected By Herald Rules'))404->setHeaderIcon(id(new PhabricatorHeraldApplication())->getIcon())405->addActionLink($more_link);406407return id(new PHUIObjectBoxView())408->setHeader($header)409->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)410->appendChild($list);411}412413}414415416