@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.

Add project history and title strings

Summary: Ref T4010. Adds a history page and restores the transaction title strings, which previously sort-of existed in the defunct feed story class.

Test Plan: See screenshots.

Reviewers: chad, btrahan

Reviewed By: chad

CC: aran

Maniphest Tasks: T4010

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

+205
+4
src/__phutil_library_map__.php
··· 1526 1526 'PhabricatorProjectDAO' => 'applications/project/storage/PhabricatorProjectDAO.php', 1527 1527 'PhabricatorProjectEditor' => 'applications/project/editor/PhabricatorProjectEditor.php', 1528 1528 'PhabricatorProjectEditorTestCase' => 'applications/project/editor/__tests__/PhabricatorProjectEditorTestCase.php', 1529 + 'PhabricatorProjectHistoryController' => 'applications/project/controller/PhabricatorProjectHistoryController.php', 1529 1530 'PhabricatorProjectListController' => 'applications/project/controller/PhabricatorProjectListController.php', 1530 1531 'PhabricatorProjectMembersEditController' => 'applications/project/controller/PhabricatorProjectMembersEditController.php', 1531 1532 'PhabricatorProjectNameCollisionException' => 'applications/project/exception/PhabricatorProjectNameCollisionException.php', ··· 1541 1542 'PhabricatorProjectStatus' => 'applications/project/constants/PhabricatorProjectStatus.php', 1542 1543 'PhabricatorProjectTestDataGenerator' => 'applications/project/lipsum/PhabricatorProjectTestDataGenerator.php', 1543 1544 'PhabricatorProjectTransaction' => 'applications/project/storage/PhabricatorProjectTransaction.php', 1545 + 'PhabricatorProjectTransactionQuery' => 'applications/project/query/PhabricatorProjectTransactionQuery.php', 1544 1546 'PhabricatorProjectUpdateController' => 'applications/project/controller/PhabricatorProjectUpdateController.php', 1545 1547 'PhabricatorQuery' => 'infrastructure/query/PhabricatorQuery.php', 1546 1548 'PhabricatorRecaptchaConfigOptions' => 'applications/config/option/PhabricatorRecaptchaConfigOptions.php', ··· 3752 3754 'PhabricatorProjectDAO' => 'PhabricatorLiskDAO', 3753 3755 'PhabricatorProjectEditor' => 'PhabricatorEditor', 3754 3756 'PhabricatorProjectEditorTestCase' => 'PhabricatorTestCase', 3757 + 'PhabricatorProjectHistoryController' => 'PhabricatorProjectController', 3755 3758 'PhabricatorProjectListController' => 3756 3759 array( 3757 3760 0 => 'PhabricatorProjectController', ··· 3770 3773 'PhabricatorProjectSearchIndexer' => 'PhabricatorSearchDocumentIndexer', 3771 3774 'PhabricatorProjectTestDataGenerator' => 'PhabricatorTestDataGenerator', 3772 3775 'PhabricatorProjectTransaction' => 'PhabricatorApplicationTransaction', 3776 + 'PhabricatorProjectTransactionQuery' => 'PhabricatorApplicationTransactionQuery', 3773 3777 'PhabricatorProjectUpdateController' => 'PhabricatorProjectController', 3774 3778 'PhabricatorRecaptchaConfigOptions' => 'PhabricatorApplicationConfigOptions', 3775 3779 'PhabricatorRedirectController' => 'PhabricatorController',
+1
src/applications/project/application/PhabricatorApplicationProject.php
··· 48 48 'board/(?P<id>[1-9]\d*)/' => 'PhabricatorProjectBoardController', 49 49 'update/(?P<id>[1-9]\d*)/(?P<action>[^/]+)/' 50 50 => 'PhabricatorProjectUpdateController', 51 + 'history/(?P<id>[1-9]\d*)/' => 'PhabricatorProjectHistoryController', 51 52 ), 52 53 ); 53 54 }
+60
src/applications/project/controller/PhabricatorProjectHistoryController.php
··· 1 + <?php 2 + 3 + final class PhabricatorProjectHistoryController 4 + extends PhabricatorProjectController { 5 + 6 + private $id; 7 + 8 + public function shouldAllowPublic() { 9 + return true; 10 + } 11 + 12 + public function willProcessRequest(array $data) { 13 + $this->id = $data['id']; 14 + } 15 + 16 + public function processRequest() { 17 + $request = $this->getRequest(); 18 + $viewer = $request->getUser(); 19 + 20 + $id = $this->id; 21 + 22 + $project = id(new PhabricatorProjectQuery()) 23 + ->setViewer($viewer) 24 + ->withIDs(array($id)) 25 + ->executeOne(); 26 + if (!$project) { 27 + return new Aphront404Response(); 28 + } 29 + 30 + $xactions = id(new PhabricatorProjectTransactionQuery()) 31 + ->setViewer($viewer) 32 + ->withObjectPHIDs(array($project->getPHID())) 33 + ->execute(); 34 + 35 + $timeline = id(new PhabricatorApplicationTransactionView()) 36 + ->setUser($viewer) 37 + ->setObjectPHID($project->getPHID()) 38 + ->setTransactions($xactions); 39 + 40 + $crumbs = $this->buildApplicationCrumbs(); 41 + $crumbs->addCrumb( 42 + id(new PhabricatorCrumbView()) 43 + ->setName($project->getName()) 44 + ->setHref($this->getApplicationURI("view/{$id}/"))); 45 + $crumbs->addCrumb( 46 + id(new PhabricatorCrumbView()) 47 + ->setName(pht('History'))); 48 + 49 + return $this->buildApplicationPage( 50 + array( 51 + $crumbs, 52 + $timeline, 53 + ), 54 + array( 55 + 'title' => $project->getName(), 56 + 'device' => true, 57 + )); 58 + } 59 + 60 + }
+6
src/applications/project/controller/PhabricatorProjectProfileController.php
··· 256 256 } 257 257 $view->addAction($action); 258 258 259 + $view->addAction( 260 + id(new PhabricatorActionView()) 261 + ->setName(pht('View History')) 262 + ->setHref($this->getApplicationURI("history/{$id}/")) 263 + ->setIcon('transcript')); 264 + 259 265 return $view; 260 266 } 261 267
+10
src/applications/project/query/PhabricatorProjectTransactionQuery.php
··· 1 + <?php 2 + 3 + final class PhabricatorProjectTransactionQuery 4 + extends PhabricatorApplicationTransactionQuery { 5 + 6 + public function getTemplateApplicationTransaction() { 7 + return new PhabricatorProjectTransaction(); 8 + } 9 + 10 + }
+87
src/applications/project/storage/PhabricatorProjectTransaction.php
··· 15 15 return PhabricatorProjectPHIDTypeProject::TYPECONST; 16 16 } 17 17 18 + public function getRequiredHandlePHIDs() { 19 + $old = $this->getOldValue(); 20 + $new = $this->getNewValue(); 21 + 22 + $req_phids = array(); 23 + switch ($this->getTransactionType()) { 24 + case PhabricatorProjectTransaction::TYPE_MEMBERS: 25 + $add = array_diff($new, $old); 26 + $rem = array_diff($old, $new); 27 + $req_phids = array_merge($add, $rem); 28 + break; 29 + } 30 + 31 + return array_merge($req_phids, parent::getRequiredHandlePHIDs()); 32 + } 33 + 34 + public function getTitle() { 35 + $old = $this->getOldValue(); 36 + $new = $this->getNewValue(); 37 + $author_handle = $this->renderHandleLink($this->getAuthorPHID()); 38 + 39 + switch ($this->getTransactionType()) { 40 + case PhabricatorProjectTransaction::TYPE_NAME: 41 + if ($old === null) { 42 + return pht( 43 + '%s created this project.', 44 + $author_handle); 45 + } else { 46 + return pht( 47 + '%s renamed this project from "%s" to "%s".', 48 + $author_handle, 49 + $old, 50 + $new); 51 + } 52 + case PhabricatorProjectTransaction::TYPE_STATUS: 53 + if ($old == 0) { 54 + return pht( 55 + '%s closed this project.', 56 + $author_handle); 57 + } else { 58 + return pht( 59 + '%s reopened this project.', 60 + $author_handle); 61 + } 62 + case PhabricatorProjectTransaction::TYPE_MEMBERS: 63 + $add = array_diff($new, $old); 64 + $rem = array_diff($old, $new); 65 + 66 + if ($add && $rem) { 67 + return pht( 68 + '%s changed project member(s), added %d: %s; removed %d: %s', 69 + $author_handle, 70 + count($add), 71 + $this->renderHandleList($add), 72 + count($rem), 73 + $this->renderHandleList($rem)); 74 + } else if ($add) { 75 + if (count($add) == 1 && (head($add) == $this->getAuthorPHID())) { 76 + return pht( 77 + '%s joined this project.', 78 + $author_handle); 79 + } else { 80 + return pht( 81 + '%s added %d project member(s): %s', 82 + $author_handle, 83 + count($add), 84 + $this->renderHandleList($add)); 85 + } 86 + } else if ($rem) { 87 + if (count($rem) == 1 && (head($rem) == $this->getAuthorPHID())) { 88 + return pht( 89 + '%s left this project.', 90 + $author_handle); 91 + } else { 92 + return pht( 93 + '%s removed %d project member(s): %s', 94 + $author_handle, 95 + count($rem), 96 + $this->renderHandleList($rem)); 97 + } 98 + } 99 + } 100 + 101 + return parent::getTitle(); 102 + } 103 + 104 + 18 105 }
+20
src/applications/transactions/storage/PhabricatorApplicationTransaction.php
··· 148 148 break; 149 149 case PhabricatorTransactions::TYPE_EDIT_POLICY: 150 150 case PhabricatorTransactions::TYPE_VIEW_POLICY: 151 + case PhabricatorTransactions::TYPE_JOIN_POLICY: 151 152 if (!PhabricatorPolicyQuery::isGlobalPolicy($old)) { 152 153 $phids[] = array($old); 153 154 } ··· 226 227 return 'message'; 227 228 case PhabricatorTransactions::TYPE_VIEW_POLICY: 228 229 case PhabricatorTransactions::TYPE_EDIT_POLICY: 230 + case PhabricatorTransactions::TYPE_JOIN_POLICY: 229 231 return 'lock'; 230 232 case PhabricatorTransactions::TYPE_EDGE: 231 233 return 'link'; ··· 242 244 switch ($this->getTransactionType()) { 243 245 case PhabricatorTransactions::TYPE_VIEW_POLICY: 244 246 case PhabricatorTransactions::TYPE_EDIT_POLICY: 247 + case PhabricatorTransactions::TYPE_JOIN_POLICY: 245 248 if ($this->getOldValue() === null) { 246 249 return true; 247 250 } else { ··· 270 273 return pht( 271 274 'This %s already has that edit policy.', 272 275 $this->getApplicationObjectTypeName()); 276 + case PhabricatorTransactions::TYPE_JOIN_POLICY: 277 + return pht( 278 + 'This %s already has that join policy.', 279 + $this->getApplicationObjectTypeName()); 273 280 case PhabricatorTransactions::TYPE_SUBSCRIBERS: 274 281 return pht( 275 282 'All users are already subscribed to this %s.', ··· 306 313 $this->getApplicationObjectTypeName(), 307 314 $this->renderPolicyName($old), 308 315 $this->renderPolicyName($new)); 316 + case PhabricatorTransactions::TYPE_JOIN_POLICY: 317 + return pht( 318 + '%s changed the join policy of this %s from "%s" to "%s".', 319 + $this->renderHandleLink($author_phid), 320 + $this->getApplicationObjectTypeName(), 321 + $this->renderPolicyName($old), 322 + $this->renderPolicyName($new)); 309 323 case PhabricatorTransactions::TYPE_SUBSCRIBERS: 310 324 $add = array_diff($new, $old); 311 325 $rem = array_diff($old, $new); ··· 420 434 '%s changed the edit policy for %s.', 421 435 $this->renderHandleLink($author_phid), 422 436 $this->renderHandleLink($object_phid)); 437 + case PhabricatorTransactions::TYPE_JOIN_POLICY: 438 + return pht( 439 + '%s changed the join policy for %s.', 440 + $this->renderHandleLink($author_phid), 441 + $this->renderHandleLink($object_phid)); 423 442 case PhabricatorTransactions::TYPE_SUBSCRIBERS: 424 443 return pht( 425 444 '%s updated subscribers of %s.', ··· 487 506 return pht('Commented On'); 488 507 case PhabricatorTransactions::TYPE_VIEW_POLICY: 489 508 case PhabricatorTransactions::TYPE_EDIT_POLICY: 509 + case PhabricatorTransactions::TYPE_JOIN_POLICY: 490 510 return pht('Changed Policy'); 491 511 case PhabricatorTransactions::TYPE_SUBSCRIBERS: 492 512 return pht('Changed Subscribers');
+17
src/infrastructure/internationalization/PhabricatorBaseEnglishTranslation.php
··· 793 793 '%s edited commit(s), added %d: %s; removed %d: %s.' => 794 794 '%s edited commits, added %3$s; removed %5$s.', 795 795 796 + '%s changed project member(s), added %d: %s; removed %d: %s' => 797 + '%s changed project members, added %3$s; removed %5$s', 798 + 799 + '%s added %d project member(s): %s' => array( 800 + array( 801 + '%s added a member: %3$s', 802 + '%s added members: %3$s', 803 + ), 804 + ), 805 + 806 + '%s removed %d project member(s): %s' => array( 807 + array( 808 + '%s removed a member: %3$s', 809 + '%s removed members: %3$s', 810 + ), 811 + ), 812 + 796 813 ); 797 814 } 798 815