[ Index ] |
PHP Cross Reference of Phabricator |
[Summary view] [Print] [Text view]
1 <?php 2 3 final class PhabricatorOwnersEditController 4 extends PhabricatorOwnersController { 5 6 private $id; 7 8 public function willProcessRequest(array $data) { 9 $this->id = idx($data, 'id'); 10 } 11 12 public function processRequest() { 13 $request = $this->getRequest(); 14 $user = $request->getUser(); 15 16 if ($this->id) { 17 $package = id(new PhabricatorOwnersPackage())->load($this->id); 18 if (!$package) { 19 return new Aphront404Response(); 20 } 21 } else { 22 $package = new PhabricatorOwnersPackage(); 23 $package->setPrimaryOwnerPHID($user->getPHID()); 24 } 25 26 $e_name = true; 27 $e_primary = true; 28 29 $errors = array(); 30 31 if ($request->isFormPost()) { 32 $package->setName($request->getStr('name')); 33 $package->setDescription($request->getStr('description')); 34 $old_auditing_enabled = $package->getAuditingEnabled(); 35 $package->setAuditingEnabled( 36 ($request->getStr('auditing') === 'enabled') 37 ? 1 38 : 0); 39 40 $primary = $request->getArr('primary'); 41 $primary = reset($primary); 42 $old_primary = $package->getPrimaryOwnerPHID(); 43 $package->setPrimaryOwnerPHID($primary); 44 45 $owners = $request->getArr('owners'); 46 if ($primary) { 47 array_unshift($owners, $primary); 48 } 49 $owners = array_unique($owners); 50 51 $paths = $request->getArr('path'); 52 $repos = $request->getArr('repo'); 53 $excludes = $request->getArr('exclude'); 54 55 $path_refs = array(); 56 for ($ii = 0; $ii < count($paths); $ii++) { 57 if (empty($paths[$ii]) || empty($repos[$ii])) { 58 continue; 59 } 60 $path_refs[] = array( 61 'repositoryPHID' => $repos[$ii], 62 'path' => $paths[$ii], 63 'excluded' => $excludes[$ii], 64 ); 65 } 66 67 if (!strlen($package->getName())) { 68 $e_name = pht('Required'); 69 $errors[] = pht('Package name is required.'); 70 } else { 71 $e_name = null; 72 } 73 74 if (!$package->getPrimaryOwnerPHID()) { 75 $e_primary = pht('Required'); 76 $errors[] = pht('Package must have a primary owner.'); 77 } else { 78 $e_primary = null; 79 } 80 81 if (!$path_refs) { 82 $errors[] = pht('Package must include at least one path.'); 83 } 84 85 if (!$errors) { 86 $package->attachUnsavedOwners($owners); 87 $package->attachUnsavedPaths($path_refs); 88 $package->attachOldAuditingEnabled($old_auditing_enabled); 89 $package->attachOldPrimaryOwnerPHID($old_primary); 90 $package->attachActorPHID($user->getPHID()); 91 try { 92 $package->save(); 93 return id(new AphrontRedirectResponse()) 94 ->setURI('/owners/package/'.$package->getID().'/'); 95 } catch (AphrontDuplicateKeyQueryException $ex) { 96 $e_name = pht('Duplicate'); 97 $errors[] = pht('Package name must be unique.'); 98 } 99 } 100 } else { 101 $owners = $package->loadOwners(); 102 $owners = mpull($owners, 'getUserPHID'); 103 104 $paths = $package->loadPaths(); 105 $path_refs = array(); 106 foreach ($paths as $path) { 107 $path_refs[] = array( 108 'repositoryPHID' => $path->getRepositoryPHID(), 109 'path' => $path->getPath(), 110 'excluded' => $path->getExcluded(), 111 ); 112 } 113 } 114 115 $handles = $this->loadViewerHandles($owners); 116 117 $primary = $package->getPrimaryOwnerPHID(); 118 if ($primary && isset($handles[$primary])) { 119 $handle_primary_owner = array($handles[$primary]); 120 } else { 121 $handle_primary_owner = array(); 122 } 123 124 $handles_all_owners = array_select_keys($handles, $owners); 125 126 if ($package->getID()) { 127 $title = pht('Edit Package'); 128 $side_nav_filter = 'edit/'.$this->id; 129 } else { 130 $title = pht('New Package'); 131 $side_nav_filter = 'new'; 132 } 133 $this->setSideNavFilter($side_nav_filter); 134 135 $repos = id(new PhabricatorRepositoryQuery()) 136 ->setViewer($user) 137 ->execute(); 138 139 $default_paths = array(); 140 foreach ($repos as $repo) { 141 $default_path = $repo->getDetail('default-owners-path'); 142 if ($default_path) { 143 $default_paths[$repo->getPHID()] = $default_path; 144 } 145 } 146 147 $repos = mpull($repos, 'getCallsign', 'getPHID'); 148 149 $template = new AphrontTypeaheadTemplateView(); 150 $template = $template->render(); 151 152 Javelin::initBehavior( 153 'owners-path-editor', 154 array( 155 'root' => 'path-editor', 156 'table' => 'paths', 157 'add_button' => 'addpath', 158 'repositories' => $repos, 159 'input_template' => $template, 160 'pathRefs' => $path_refs, 161 162 'completeURI' => '/diffusion/services/path/complete/', 163 'validateURI' => '/diffusion/services/path/validate/', 164 165 'repositoryDefaultPaths' => $default_paths, 166 )); 167 168 require_celerity_resource('owners-path-editor-css'); 169 170 $cancel_uri = $package->getID() 171 ? '/owners/package/'.$package->getID().'/' 172 : '/owners/'; 173 174 $form = id(new AphrontFormView()) 175 ->setUser($user) 176 ->appendChild( 177 id(new AphrontFormTextControl()) 178 ->setLabel(pht('Name')) 179 ->setName('name') 180 ->setValue($package->getName()) 181 ->setError($e_name)) 182 ->appendChild( 183 id(new AphrontFormTokenizerControl()) 184 ->setDatasource(new PhabricatorProjectOrUserDatasource()) 185 ->setLabel(pht('Primary Owner')) 186 ->setName('primary') 187 ->setLimit(1) 188 ->setValue($handle_primary_owner) 189 ->setError($e_primary)) 190 ->appendChild( 191 id(new AphrontFormTokenizerControl()) 192 ->setDatasource(new PhabricatorProjectOrUserDatasource()) 193 ->setLabel(pht('Owners')) 194 ->setName('owners') 195 ->setValue($handles_all_owners)) 196 ->appendChild( 197 id(new AphrontFormSelectControl()) 198 ->setName('auditing') 199 ->setLabel(pht('Auditing')) 200 ->setCaption( 201 pht('With auditing enabled, all future commits that touch '. 202 'this package will be reviewed to make sure an owner '. 203 'of the package is involved and the commit message has '. 204 'a valid revision, reviewed by, and author.')) 205 ->setOptions(array( 206 'disabled' => pht('Disabled'), 207 'enabled' => pht('Enabled'), 208 )) 209 ->setValue( 210 $package->getAuditingEnabled() 211 ? 'enabled' 212 : 'disabled')) 213 ->appendChild( 214 id(new PHUIFormInsetView()) 215 ->setTitle(pht('Paths')) 216 ->addDivAttributes(array('id' => 'path-editor')) 217 ->setRightButton(javelin_tag( 218 'a', 219 array( 220 'href' => '#', 221 'class' => 'button green', 222 'sigil' => 'addpath', 223 'mustcapture' => true, 224 ), 225 pht('Add New Path'))) 226 ->setDescription( 227 pht('Specify the files and directories which comprise '. 228 'this package.')) 229 ->setContent(javelin_tag( 230 'table', 231 array( 232 'class' => 'owners-path-editor-table', 233 'sigil' => 'paths', 234 ), 235 ''))) 236 ->appendChild( 237 id(new AphrontFormTextAreaControl()) 238 ->setLabel(pht('Description')) 239 ->setName('description') 240 ->setValue($package->getDescription())) 241 ->appendChild( 242 id(new AphrontFormSubmitControl()) 243 ->addCancelButton($cancel_uri) 244 ->setValue(pht('Save Package'))); 245 246 $form_box = id(new PHUIObjectBoxView()) 247 ->setHeaderText($title) 248 ->setFormErrors($errors) 249 ->setForm($form); 250 251 $nav = $this->buildSideNavView(); 252 $nav->appendChild($form_box); 253 254 return $this->buildApplicationPage( 255 array( 256 $nav, 257 ), 258 array( 259 'title' => $title, 260 )); 261 } 262 263 protected function getExtraPackageViews(AphrontSideNavFilterView $view) { 264 if ($this->id) { 265 $view->addFilter('edit/'.$this->id, pht('Edit')); 266 } else { 267 $view->addFilter('new', pht('New')); 268 } 269 } 270 }
title
Description
Body
title
Description
Body
title
Description
Body
title
Body
Generated: Sun Nov 30 09:20:46 2014 | Cross-referenced by PHPXref 0.7.1 |