@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 157 lines 4.3 kB view raw
1<?php 2 3final class PhabricatorProjectManageController 4 extends PhabricatorProjectController { 5 6 public function shouldAllowPublic() { 7 return true; 8 } 9 10 public function handleRequest(AphrontRequest $request) { 11 $response = $this->loadProject(); 12 if ($response) { 13 return $response; 14 } 15 16 $viewer = $request->getUser(); 17 $project = $this->getProject(); 18 $id = $project->getID(); 19 $picture = $project->getProfileImageURI(); 20 21 $header = id(new PHUIHeaderView()) 22 ->setHeader(pht('Project History')) 23 ->setViewer($viewer) 24 ->setPolicyObject($project); 25 26 if ($project->getStatus() == PhabricatorProjectStatus::STATUS_ACTIVE) { 27 $header->setStatus('fa-check', 'bluegrey', pht('Active')); 28 } else { 29 $header->setStatus('fa-ban', 'red', pht('Archived')); 30 } 31 32 $curtain = $this->buildCurtain($project); 33 $properties = $this->buildPropertyListView($project); 34 35 $timeline = $this->buildTransactionTimeline( 36 $project, 37 new PhabricatorProjectTransactionQuery()); 38 $timeline->setShouldTerminate(true); 39 40 $nav = $this->newNavigation( 41 $project, 42 PhabricatorProject::ITEM_MANAGE); 43 44 $crumbs = $this->buildApplicationCrumbs(); 45 $crumbs->addTextCrumb(pht('Manage')); 46 $crumbs->setBorder(true); 47 48 require_celerity_resource('project-view-css'); 49 50 $manage = id(new PHUITwoColumnView()) 51 ->setHeader($header) 52 ->setCurtain($curtain) 53 ->addPropertySection(pht('Details'), $properties) 54 ->addClass('project-view-home') 55 ->addClass('project-view-people-home') 56 ->setMainColumn( 57 array( 58 $timeline, 59 )); 60 61 return $this->newPage() 62 ->setNavigation($nav) 63 ->setCrumbs($crumbs) 64 ->setTitle( 65 array( 66 $project->getDisplayName(), 67 pht('Manage'), 68 )) 69 ->appendChild( 70 array( 71 $manage, 72 )); 73 } 74 75 private function buildCurtain(PhabricatorProject $project) { 76 $viewer = $this->getViewer(); 77 78 $id = $project->getID(); 79 $can_edit = PhabricatorPolicyFilter::hasCapability( 80 $viewer, 81 $project, 82 PhabricatorPolicyCapability::CAN_EDIT); 83 84 $curtain = $this->newCurtainView($project); 85 86 $curtain->addAction( 87 id(new PhabricatorActionView()) 88 ->setName(pht('Edit Details')) 89 ->setIcon('fa-pencil') 90 ->setHref($this->getApplicationURI("edit/{$id}/")) 91 ->setDisabled(!$can_edit) 92 ->setWorkflow(!$can_edit)); 93 94 $curtain->addAction( 95 id(new PhabricatorActionView()) 96 ->setName(pht('Edit Menu')) 97 ->setIcon('fa-th-list') 98 ->setHref($this->getApplicationURI("{$id}/item/configure/")) 99 ->setDisabled(!$can_edit) 100 ->setWorkflow(!$can_edit)); 101 102 $curtain->addAction( 103 id(new PhabricatorActionView()) 104 ->setName(pht('Edit Picture')) 105 ->setIcon('fa-picture-o') 106 ->setHref($this->getApplicationURI("picture/{$id}/")) 107 ->setDisabled(!$can_edit) 108 ->setWorkflow(!$can_edit)); 109 110 if ($project->isArchived()) { 111 $curtain->addAction( 112 id(new PhabricatorActionView()) 113 ->setName(pht('Activate Project')) 114 ->setIcon('fa-check') 115 ->setHref($this->getApplicationURI("archive/{$id}/")) 116 ->setDisabled(!$can_edit) 117 ->setWorkflow(true)); 118 } else { 119 $curtain->addAction( 120 id(new PhabricatorActionView()) 121 ->setName(pht('Archive Project')) 122 ->setIcon('fa-ban') 123 ->setHref($this->getApplicationURI("archive/{$id}/")) 124 ->setDisabled(!$can_edit) 125 ->setWorkflow(true)); 126 } 127 128 return $curtain; 129 } 130 131 private function buildPropertyListView( 132 PhabricatorProject $project) { 133 $viewer = $this->getViewer(); 134 135 $view = id(new PHUIPropertyListView()) 136 ->setViewer($viewer); 137 138 $view->addProperty( 139 pht('Looks Like'), 140 $viewer->renderHandle($project->getPHID())->setAsTag(true)); 141 142 $slugs = $project->getSlugs(); 143 $tags = mpull($slugs, 'getSlug'); 144 145 $view->addProperty( 146 pht('Hashtags'), 147 $this->renderHashtags($tags)); 148 149 $field_list = PhabricatorCustomField::getObjectFields( 150 $project, 151 PhabricatorCustomField::ROLE_VIEW); 152 $field_list->appendFieldsToPropertyList($project, $viewer, $view); 153 154 return $view; 155 } 156 157}