@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
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

Modernize Owners

Summary: phts, crumbs, dust, standard navs.

Test Plan: Used owners on web and mobile.

Reviewers: epriestley, btrahan

Reviewed By: epriestley

CC: aran, Korvin

Differential Revision: https://secure.phabricator.com/D5980

+138 -120
+1 -1
src/applications/owners/application/PhabricatorApplicationOwners.php
··· 11 11 } 12 12 13 13 public function getShortDescription() { 14 - return 'Group Source Code'; 14 + return pht('Group Source Code'); 15 15 } 16 16 17 17 public function getTitleGlyph() {
+36 -42
src/applications/owners/controller/PhabricatorOwnersController.php
··· 12 12 return $this; 13 13 } 14 14 15 - public function buildStandardPageResponse($view, array $data) { 15 + public function buildSideNavView() { 16 + $nav = new AphrontSideNavFilterView(); 17 + $base_uri = new PhutilURI('/owners/'); 18 + $nav->setBaseURI($base_uri); 16 19 17 - $page = $this->buildStandardPageView(); 20 + $nav->addLabel(pht('Packages')); 21 + $this->getExtraPackageViews($nav); 22 + $nav->addFilter('view/owned', pht('Owned')); 23 + $nav->addFilter('view/projects', pht('Projects')); 24 + $nav->addFilter('view/all', pht('All')); 18 25 19 - $page->setApplicationName('Owners'); 20 - $page->setBaseURI('/owners/'); 21 - $page->setTitle(idx($data, 'title')); 22 - $page->setGlyph("\xE2\x98\x81"); 23 - $nav = $this->renderSideNav(); 24 - $nav->appendChild($view); 25 - $page->appendChild($nav); 26 + $nav->selectFilter($this->getSideNavFilter(), 'view/owned'); 26 27 27 28 $filter = $nav->getSelectedFilter(); 28 29 switch ($filter) { 29 30 case 'view/owned': 31 + $title = pht('Owned Packages'); 32 + break; 30 33 case 'view/all': 31 - $crumbs = $this->buildApplicationCrumbs(); 32 - 33 - if ($filter == 'view/owned') { 34 - $title = pht('Owned Packages'); 35 - } else { 36 - $title = pht('All Packages'); 37 - } 38 - 39 - $crumbs->addCrumb( 40 - id(new PhabricatorCrumbView()) 41 - ->setName($title)); 42 - 43 - $crumbs->addAction( 44 - id(new PhabricatorMenuItemView()) 45 - ->setName(pht('Create Package')) 46 - ->setHref('/owners/new/') 47 - ->setIcon('create')); 48 - 49 - $nav->setCrumbs($crumbs); 34 + $title = pht('All Packages'); 35 + break; 36 + case 'view/projects': 37 + $title = pht('Projects'); 38 + break; 39 + case 'new': 40 + $title = pht('New Package'); 41 + break; 42 + default: 43 + $title = pht('Package'); 50 44 break; 51 45 } 52 46 53 - $response = new AphrontWebpageResponse(); 54 - return $response->setContent($page->render()); 55 - } 47 + $crumbs = $this->buildApplicationCrumbs(); 48 + $crumbs->addCrumb( 49 + id(new PhabricatorCrumbView()) 50 + ->setName($title)); 56 51 57 - public function renderSideNav() { 58 - $nav = new AphrontSideNavFilterView(); 59 - $base_uri = new PhutilURI('/owners/'); 60 - $nav->setBaseURI($base_uri); 52 + $crumbs->addAction( 53 + id(new PhabricatorMenuItemView()) 54 + ->setName(pht('Create Package')) 55 + ->setHref('/owners/new/') 56 + ->setIcon('create')); 61 57 62 - $nav->addLabel('Packages'); 63 - $this->getExtraPackageViews($nav); 64 - $nav->addFilter('view/owned', 'Owned'); 65 - $nav->addFilter('view/projects', 'Projects'); 66 - $nav->addFilter('view/all', 'All'); 58 + $nav->setCrumbs($crumbs); 67 59 68 - $nav->selectFilter($this->getSideNavFilter(), 'view/owned'); 60 + return $nav; 61 + } 69 62 70 - return $nav; 63 + public function buildApplicationMenu() { 64 + return $this->buildSideNavView()->getMenu(); 71 65 } 72 66 73 67 protected function getExtraPackageViews(AphrontSideNavFilterView $view) {
+6 -4
src/applications/owners/controller/PhabricatorOwnersDeleteController.php
··· 24 24 return id(new AphrontRedirectResponse())->setURI('/owners/'); 25 25 } 26 26 27 + $text = pht('Are you sure you want to delete the "%s" package? This '. 28 + 'operation can not be undone.', $package->getName()); 27 29 $dialog = id(new AphrontDialogView()) 28 30 ->setUser($user) 29 31 ->setTitle('Really delete this package?') 32 + ->setHeaderColor(PhabricatorActionHeaderView::HEADER_RED) 30 33 ->appendChild(hsprintf( 31 - '<p>Are you sure you want to delete the "%s" package? This operation '. 32 - 'can not be undone.</p>', 33 - $package->getName())) 34 - ->addSubmitButton('Delete') 34 + '<p>%s</p>', 35 + $text)) 36 + ->addSubmitButton(pht('Delete')) 35 37 ->addCancelButton('/owners/package/'.$package->getID().'/') 36 38 ->setSubmitURI($request->getRequestURI()); 37 39
+30 -20
src/applications/owners/controller/PhabricatorOwnersDetailController.php
··· 47 47 48 48 $rows = array(); 49 49 50 - $rows[] = array('Name', $package->getName()); 51 - $rows[] = array('Description', $package->getDescription()); 50 + $rows[] = array(pht('Name'), $package->getName()); 51 + $rows[] = array(pht('Description'), $package->getDescription()); 52 52 53 53 $primary_owner = null; 54 54 $primary_phid = $package->getPrimaryOwnerPHID(); ··· 58 58 array(), 59 59 $handles[$primary_phid]->renderLink()); 60 60 } 61 - $rows[] = array('Primary Owner', $primary_owner); 61 + $rows[] = array(pht('Primary Owner'), $primary_owner); 62 62 63 63 $owner_links = array(); 64 64 foreach ($owners as $owner) { 65 65 $owner_links[] = $handles[$owner->getUserPHID()]->renderLink(); 66 66 } 67 67 $owner_links = phutil_implode_html(phutil_tag('br'), $owner_links); 68 - $rows[] = array('Owners', $owner_links); 68 + $rows[] = array(pht('Owners'), $owner_links); 69 69 70 70 $rows[] = array( 71 - 'Auditing', 72 - $package->getAuditingEnabled() ? 'Enabled' : 'Disabled', 71 + pht('Auditing'), 72 + $package->getAuditingEnabled() ? 73 + pht('Enabled') : 74 + pht('Disabled'), 73 75 ); 74 76 75 77 $path_links = array(); ··· 99 101 $path_link); 100 102 } 101 103 $path_links = phutil_implode_html(phutil_tag('br'), $path_links); 102 - $rows[] = array('Paths', $path_links); 104 + $rows[] = array(pht('Paths'), $path_links); 103 105 104 106 $table = new AphrontTableView($rows); 105 107 $table->setColumnClasses( ··· 109 111 )); 110 112 111 113 $panel = new AphrontPanelView(); 112 - $panel->setHeader('Package Details for "'.$package->getName().'"'); 114 + $panel->setNoBackground(); 115 + $panel->setHeader( 116 + pht('Package Details for "%s"', $package->getName())); 113 117 $panel->addButton( 114 118 javelin_tag( 115 119 'a', ··· 118 122 'class' => 'button grey', 119 123 'sigil' => 'workflow', 120 124 ), 121 - 'Delete Package')); 125 + pht('Delete Package'))); 122 126 $panel->addButton( 123 127 phutil_tag( 124 128 'a', ··· 126 130 'href' => '/owners/edit/'.$package->getID().'/', 127 131 'class' => 'button', 128 132 ), 129 - 'Edit Package')); 133 + pht('Edit Package'))); 130 134 $panel->appendChild($table); 131 135 132 136 $key = 'package/'.$package->getID(); ··· 154 158 155 159 $commit_views[] = array( 156 160 'view' => $view, 157 - 'header' => 'Commits in this Package that Need Attention', 161 + 'header' => pht('Commits in this Package that Need Attention'), 158 162 'button' => phutil_tag( 159 163 'a', 160 164 array( 161 165 'href' => $commit_uri->alter('status', 'open'), 162 166 'class' => 'button grey', 163 167 ), 164 - 'View All Problem Commits'), 168 + pht('View All Problem Commits')), 165 169 ); 166 170 } 167 171 ··· 175 179 $view = new PhabricatorAuditCommitListView(); 176 180 $view->setUser($user); 177 181 $view->setCommits($all_commits); 178 - $view->setNoDataString('No commits in this package.'); 182 + $view->setNoDataString(pht('No commits in this package.')); 179 183 180 184 $commit_views[] = array( 181 185 'view' => $view, 182 - 'header' => 'Recent Commits in Package', 186 + 'header' => pht('Recent Commits in Package'), 183 187 'button' => phutil_tag( 184 188 'a', 185 189 array( 186 190 'href' => $commit_uri, 187 191 'class' => 'button grey', 188 192 ), 189 - 'View All Package Commits'), 193 + pht('View All Package Commits')), 190 194 ); 191 195 192 196 $phids = array(); ··· 199 203 $commit_panels = array(); 200 204 foreach ($commit_views as $commit_view) { 201 205 $commit_panel = new AphrontPanelView(); 206 + $commit_panel->setNoBackground(); 202 207 $commit_panel->setHeader($commit_view['header']); 203 208 if (isset($commit_view['button'])) { 204 209 $commit_panel->addButton($commit_view['button']); ··· 209 214 $commit_panels[] = $commit_panel; 210 215 } 211 216 212 - return $this->buildStandardPageResponse( 217 + $nav = $this->buildSideNavView(); 218 + $nav->appendChild($panel); 219 + $nav->appendChild($commit_panels); 220 + 221 + return $this->buildApplicationPage( 213 222 array( 214 - $panel, 215 - $commit_panels, 223 + $nav, 216 224 ), 217 225 array( 218 - 'title' => "Package '".$package->getName()."'", 226 + 'title' => pht("Package %s", $package->getName()), 227 + 'dust' => true, 228 + 'device' => true, 219 229 )); 220 230 } 221 231 222 232 protected function getExtraPackageViews(AphrontSideNavFilterView $view) { 223 233 $package = $this->package; 224 - $view->addFilter('package/'.$package->getID(), 'Details'); 234 + $view->addFilter('package/'.$package->getID(), pht('Details')); 225 235 } 226 236 227 237 }
+35 -29
src/applications/owners/controller/PhabricatorOwnersEditController.php
··· 65 65 } 66 66 67 67 if (!strlen($package->getName())) { 68 - $e_name = 'Required'; 69 - $errors[] = 'Package name is required.'; 68 + $e_name = pht('Required'); 69 + $errors[] = pht('Package name is required.'); 70 70 } else { 71 71 $e_name = null; 72 72 } 73 73 74 74 if (!$package->getPrimaryOwnerPHID()) { 75 - $e_primary = 'Required'; 76 - $errors[] = 'Package must have a primary owner.'; 75 + $e_primary = pht('Required'); 76 + $errors[] = pht('Package must have a primary owner.'); 77 77 } else { 78 78 $e_primary = null; 79 79 } 80 80 81 81 if (!$path_refs) { 82 - $errors[] = 'Package must include at least one path.'; 82 + $errors[] = pht('Package must include at least one path.'); 83 83 } 84 84 85 85 if (!$errors) { ··· 93 93 return id(new AphrontRedirectResponse()) 94 94 ->setURI('/owners/package/'.$package->getID().'/'); 95 95 } catch (AphrontQueryDuplicateKeyException $ex) { 96 - $e_name = 'Duplicate'; 97 - $errors[] = 'Package name must be unique.'; 96 + $e_name = pht('Duplicate'); 97 + $errors[] = pht('Package name must be unique.'); 98 98 } 99 99 } 100 100 } else { ··· 115 115 $error_view = null; 116 116 if ($errors) { 117 117 $error_view = new AphrontErrorView(); 118 - $error_view->setTitle('Package Errors'); 118 + $error_view->setTitle(pht('Package Errors')); 119 119 $error_view->setErrors($errors); 120 120 } 121 121 ··· 184 184 ->setFlexible(true) 185 185 ->appendChild( 186 186 id(new AphrontFormTextControl()) 187 - ->setLabel('Name') 187 + ->setLabel(pht('Name')) 188 188 ->setName('name') 189 189 ->setValue($package->getName()) 190 190 ->setError($e_name)) 191 191 ->appendChild( 192 192 id(new AphrontFormTokenizerControl()) 193 193 ->setDatasource('/typeahead/common/usersorprojects/') 194 - ->setLabel('Primary Owner') 194 + ->setLabel(pht('Primary Owner')) 195 195 ->setName('primary') 196 196 ->setLimit(1) 197 197 ->setValue($token_primary_owner) ··· 199 199 ->appendChild( 200 200 id(new AphrontFormTokenizerControl()) 201 201 ->setDatasource('/typeahead/common/usersorprojects/') 202 - ->setLabel('Owners') 202 + ->setLabel(pht('Owners')) 203 203 ->setName('owners') 204 204 ->setValue($token_all_owners)) 205 205 ->appendChild( 206 206 id(new AphrontFormSelectControl()) 207 207 ->setName('auditing') 208 - ->setLabel('Auditing') 209 - ->setCaption('With auditing enabled, all future commits that touch '. 210 - 'this package will be reviewed to make sure an owner '. 211 - 'of the package is involved and the commit message has '. 212 - 'a valid revision, reviewed by, and author.') 208 + ->setLabel(pht('Auditing')) 209 + ->setCaption( 210 + pht('With auditing enabled, all future commits that touch '. 211 + 'this package will be reviewed to make sure an owner '. 212 + 'of the package is involved and the commit message has '. 213 + 'a valid revision, reviewed by, and author.')) 213 214 ->setOptions(array( 214 - 'disabled' => 'Disabled', 215 - 'enabled' => 'Enabled', 215 + 'disabled' => pht('Disabled'), 216 + 'enabled' => pht('Enabled'), 216 217 )) 217 218 ->setValue( 218 219 $package->getAuditingEnabled() ··· 220 221 : 'disabled')) 221 222 ->appendChild( 222 223 id(new AphrontFormInsetView()) 223 - ->setTitle('Paths') 224 + ->setTitle(pht('Paths')) 224 225 ->addDivAttributes(array('id' => 'path-editor')) 225 226 ->setRightButton(javelin_tag( 226 227 'a', ··· 230 231 'sigil' => 'addpath', 231 232 'mustcapture' => true, 232 233 ), 233 - 'Add New Path')) 234 - ->setDescription('Specify the files and directories which comprise '. 235 - 'this package.') 234 + pht('Add New Path'))) 235 + ->setDescription( 236 + pht('Specify the files and directories which comprise '. 237 + 'this package.')) 236 238 ->setContent(javelin_tag( 237 239 'table', 238 240 array( ··· 242 244 ''))) 243 245 ->appendChild( 244 246 id(new AphrontFormTextAreaControl()) 245 - ->setLabel('Description') 247 + ->setLabel(pht('Description')) 246 248 ->setName('description') 247 249 ->setValue($package->getDescription())) 248 250 ->appendChild( 249 251 id(new AphrontFormSubmitControl()) 250 252 ->addCancelButton($cancel_uri) 251 - ->setValue('Save Package')); 253 + ->setValue(pht('Save Package'))); 252 254 253 255 $header = id(new PhabricatorHeaderView()) 254 256 ->setHeader($title); 255 257 258 + $nav = $this->buildSideNavView(); 259 + $nav->appendChild($error_view); 260 + $nav->appendChild($header); 261 + $nav->appendChild($form); 262 + 256 263 return $this->buildApplicationPage( 257 264 array( 258 - $error_view, 259 - $header, 260 - $form, 265 + $nav, 261 266 ), 262 267 array( 263 268 'title' => $title, 269 + 'device' => true, 264 270 'dust' => true, 265 271 )); 266 272 } 267 273 268 274 protected function getExtraPackageViews(AphrontSideNavFilterView $view) { 269 275 if ($this->id) { 270 - $view->addFilter('edit/'.$this->id, 'Edit'); 276 + $view->addFilter('edit/'.$this->id, pht('Edit')); 271 277 } else { 272 - $view->addFilter('new', 'New'); 278 + $view->addFilter('new', pht('New')); 273 279 } 274 280 } 275 281 }
+30 -24
src/applications/owners/controller/PhabricatorOwnersListController.php
··· 92 92 $having); 93 93 $packages = $package->loadAllFromArray($data); 94 94 95 - $header = 'Search Results'; 96 - $nodata = 'No packages match your query.'; 95 + $header = pht('Search Results'); 96 + $nodata = pht('No packages match your query.'); 97 97 break; 98 98 case 'owned': 99 99 $data = queryfx_all( ··· 105 105 $user->getPHID()); 106 106 $packages = $package->loadAllFromArray($data); 107 107 108 - $header = 'Owned Packages'; 109 - $nodata = 'No owned packages'; 108 + $header = pht('Owned Packages'); 109 + $nodata = pht('No owned packages'); 110 110 break; 111 111 case 'projects': 112 112 $projects = id(new PhabricatorProjectQuery()) ··· 128 128 } 129 129 $packages = $package->loadAllFromArray($data); 130 130 131 - $header = 'Owned Packages'; 132 - $nodata = 'No owned packages'; 131 + $header = pht('Owned Packages'); 132 + $nodata = pht('No owned packages'); 133 133 break; 134 134 case 'all': 135 135 $packages = $package->loadAll(); 136 136 137 - $header = 'All Packages'; 138 - $nodata = 'There are no defined packages.'; 137 + $header = pht('All Packages'); 138 + $nodata = pht('There are no defined packages.'); 139 139 break; 140 140 } 141 141 ··· 156 156 ); 157 157 } 158 158 159 - $callsigns = array('' => '(Any Repository)'); 159 + $callsigns = array('' => pht('(Any Repository)')); 160 160 $repositories = id(new PhabricatorRepository()) 161 161 ->loadAllWhere('1 = 1 ORDER BY callsign'); 162 162 foreach ($repositories as $repository) { ··· 168 168 ->setUser($user) 169 169 ->setAction('/owners/view/search/') 170 170 ->setMethod('GET') 171 + ->setNoShading(true) 171 172 ->appendChild( 172 173 id(new AphrontFormTextControl()) 173 174 ->setName('name') 174 - ->setLabel('Name') 175 + ->setLabel(pht('Name')) 175 176 ->setValue($request->getStr('name'))) 176 177 ->appendChild( 177 178 id(new AphrontFormTokenizerControl()) 178 179 ->setDatasource('/typeahead/common/usersorprojects/') 179 180 ->setLimit(1) 180 181 ->setName('owner') 181 - ->setLabel('Owner') 182 + ->setLabel(pht('Owner')) 182 183 ->setValue($owners_search_value)) 183 184 ->appendChild( 184 185 id(new AphrontFormSelectControl()) 185 186 ->setName('repository') 186 - ->setLabel('Repository') 187 + ->setLabel(pht('Repository')) 187 188 ->setOptions($callsigns) 188 189 ->setValue($request->getStr('repository'))) 189 190 ->appendChild( 190 191 id(new AphrontFormTextControl()) 191 192 ->setName('path') 192 - ->setLabel('Path') 193 + ->setLabel(pht('Path')) 193 194 ->setValue($request->getStr('path'))) 194 195 ->appendChild( 195 196 id(new AphrontFormSubmitControl()) 196 - ->setValue('Search for Packages')); 197 + ->setValue(pht('Search for Packages'))); 197 198 198 199 $filter->appendChild($form); 199 200 200 - return $this->buildStandardPageResponse( 201 + $nav = $this->buildSideNavView(); 202 + $nav->appendChild($filter); 203 + $nav->appendChild($content); 204 + 205 + return $this->buildApplicationPage( 201 206 array( 202 - $filter, 203 - $content, 207 + $nav, 204 208 ), 205 209 array( 206 - 'title' => 'Package Index', 210 + 'title' => pht('Package Index'), 211 + 'dust' => true, 212 + 'device' => true, 207 213 )); 208 214 } 209 215 ··· 304 310 array( 305 311 'href' => '/audit/view/packagecommits/?phid='.$package->getPHID(), 306 312 ), 307 - 'Related Commits') 313 + pht('Related Commits')) 308 314 ); 309 315 } 310 316 311 317 $table = new AphrontTableView($rows); 312 318 $table->setHeaders( 313 319 array( 314 - 'Name', 315 - 'Owners', 316 - 'Paths', 317 - 'Related Commits', 320 + pht('Name'), 321 + pht('Owners'), 322 + pht('Paths'), 323 + pht('Related Commits'), 318 324 )); 319 325 $table->setColumnClasses( 320 326 array( ··· 334 340 335 341 protected function getExtraPackageViews(AphrontSideNavFilterView $view) { 336 342 if ($this->view == 'search') { 337 - $view->addFilter('view/search', 'Search Results'); 343 + $view->addFilter('view/search', pht('Search Results')); 338 344 } 339 345 } 340 346 }