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

Convert all standard relationship-editing actions to modern Relationships code

Summary: Ref T4788. This moves everything except "merge" to the new code.

Test Plan:
- Edited relationships in Differential, Diffusion, and Pholio.
- Uninstalled Pholio, made sure "Edit Mocks..." actions vanished.

Reviewers: chad

Reviewed By: chad

Maniphest Tasks: T4788

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

+471 -54
+24 -4
src/__phutil_library_map__.php
··· 381 381 'DifferentialChangesetTwoUpRenderer' => 'applications/differential/render/DifferentialChangesetTwoUpRenderer.php', 382 382 'DifferentialChangesetTwoUpTestRenderer' => 'applications/differential/render/DifferentialChangesetTwoUpTestRenderer.php', 383 383 'DifferentialChangesetViewController' => 'applications/differential/controller/DifferentialChangesetViewController.php', 384 + 'DifferentialChildRevisionsField' => 'applications/differential/customfield/DifferentialChildRevisionsField.php', 384 385 'DifferentialCloseConduitAPIMethod' => 'applications/differential/conduit/DifferentialCloseConduitAPIMethod.php', 385 386 'DifferentialCommentPreviewController' => 'applications/differential/controller/DifferentialCommentPreviewController.php', 386 387 'DifferentialCommentSaveController' => 'applications/differential/controller/DifferentialCommentSaveController.php', ··· 407 408 'DifferentialCustomFieldStringIndex' => 'applications/differential/storage/DifferentialCustomFieldStringIndex.php', 408 409 'DifferentialDAO' => 'applications/differential/storage/DifferentialDAO.php', 409 410 'DifferentialDefaultViewCapability' => 'applications/differential/capability/DifferentialDefaultViewCapability.php', 410 - 'DifferentialDependenciesField' => 'applications/differential/customfield/DifferentialDependenciesField.php', 411 - 'DifferentialDependsOnField' => 'applications/differential/customfield/DifferentialDependsOnField.php', 412 411 'DifferentialDiff' => 'applications/differential/storage/DifferentialDiff.php', 413 412 'DifferentialDiffAffectedFilesHeraldField' => 'applications/differential/herald/DifferentialDiffAffectedFilesHeraldField.php', 414 413 'DifferentialDiffAuthorHeraldField' => 'applications/differential/herald/DifferentialDiffAuthorHeraldField.php', ··· 476 475 'DifferentialManiphestTasksField' => 'applications/differential/customfield/DifferentialManiphestTasksField.php', 477 476 'DifferentialModernHunk' => 'applications/differential/storage/DifferentialModernHunk.php', 478 477 'DifferentialNextStepField' => 'applications/differential/customfield/DifferentialNextStepField.php', 478 + 'DifferentialParentRevisionsField' => 'applications/differential/customfield/DifferentialParentRevisionsField.php', 479 479 'DifferentialParseCacheGarbageCollector' => 'applications/differential/garbagecollector/DifferentialParseCacheGarbageCollector.php', 480 480 'DifferentialParseCommitMessageConduitAPIMethod' => 'applications/differential/conduit/DifferentialParseCommitMessageConduitAPIMethod.php', 481 481 'DifferentialParseRenderTestCase' => 'applications/differential/__tests__/DifferentialParseRenderTestCase.php', ··· 521 521 'DifferentialRevisionDependsOnRevisionEdgeType' => 'applications/differential/edge/DifferentialRevisionDependsOnRevisionEdgeType.php', 522 522 'DifferentialRevisionEditController' => 'applications/differential/controller/DifferentialRevisionEditController.php', 523 523 'DifferentialRevisionFulltextEngine' => 'applications/differential/search/DifferentialRevisionFulltextEngine.php', 524 + 'DifferentialRevisionHasChildRelationship' => 'applications/differential/relationships/DifferentialRevisionHasChildRelationship.php', 524 525 'DifferentialRevisionHasCommitEdgeType' => 'applications/differential/edge/DifferentialRevisionHasCommitEdgeType.php', 526 + 'DifferentialRevisionHasCommitRelationship' => 'applications/differential/relationships/DifferentialRevisionHasCommitRelationship.php', 527 + 'DifferentialRevisionHasParentRelationship' => 'applications/differential/relationships/DifferentialRevisionHasParentRelationship.php', 525 528 'DifferentialRevisionHasReviewerEdgeType' => 'applications/differential/edge/DifferentialRevisionHasReviewerEdgeType.php', 526 529 'DifferentialRevisionHasTaskEdgeType' => 'applications/differential/edge/DifferentialRevisionHasTaskEdgeType.php', 530 + 'DifferentialRevisionHasTaskRelationship' => 'applications/differential/relationships/DifferentialRevisionHasTaskRelationship.php', 527 531 'DifferentialRevisionHeraldField' => 'applications/differential/herald/DifferentialRevisionHeraldField.php', 528 532 'DifferentialRevisionHeraldFieldGroup' => 'applications/differential/herald/DifferentialRevisionHeraldFieldGroup.php', 529 533 'DifferentialRevisionIDField' => 'applications/differential/customfield/DifferentialRevisionIDField.php', ··· 536 540 'DifferentialRevisionPackageHeraldField' => 'applications/differential/herald/DifferentialRevisionPackageHeraldField.php', 537 541 'DifferentialRevisionPackageOwnerHeraldField' => 'applications/differential/herald/DifferentialRevisionPackageOwnerHeraldField.php', 538 542 'DifferentialRevisionQuery' => 'applications/differential/query/DifferentialRevisionQuery.php', 543 + 'DifferentialRevisionRelationship' => 'applications/differential/relationships/DifferentialRevisionRelationship.php', 539 544 'DifferentialRevisionRelationshipSource' => 'applications/search/relationship/DifferentialRevisionRelationshipSource.php', 540 545 'DifferentialRevisionRepositoryHeraldField' => 'applications/differential/herald/DifferentialRevisionRepositoryHeraldField.php', 541 546 'DifferentialRevisionRepositoryProjectsHeraldField' => 'applications/differential/herald/DifferentialRevisionRepositoryProjectsHeraldField.php', ··· 601 606 'DiffusionCommitEditController' => 'applications/diffusion/controller/DiffusionCommitEditController.php', 602 607 'DiffusionCommitFulltextEngine' => 'applications/repository/search/DiffusionCommitFulltextEngine.php', 603 608 'DiffusionCommitHasRevisionEdgeType' => 'applications/diffusion/edge/DiffusionCommitHasRevisionEdgeType.php', 609 + 'DiffusionCommitHasRevisionRelationship' => 'applications/diffusion/relationships/DiffusionCommitHasRevisionRelationship.php', 604 610 'DiffusionCommitHasTaskEdgeType' => 'applications/diffusion/edge/DiffusionCommitHasTaskEdgeType.php', 611 + 'DiffusionCommitHasTaskRelationship' => 'applications/diffusion/relationships/DiffusionCommitHasTaskRelationship.php', 605 612 'DiffusionCommitHash' => 'applications/diffusion/data/DiffusionCommitHash.php', 606 613 'DiffusionCommitHeraldField' => 'applications/diffusion/herald/DiffusionCommitHeraldField.php', 607 614 'DiffusionCommitHeraldFieldGroup' => 'applications/diffusion/herald/DiffusionCommitHeraldFieldGroup.php', ··· 615 622 'DiffusionCommitParentsQueryConduitAPIMethod' => 'applications/diffusion/conduit/DiffusionCommitParentsQueryConduitAPIMethod.php', 616 623 'DiffusionCommitQuery' => 'applications/diffusion/query/DiffusionCommitQuery.php', 617 624 'DiffusionCommitRef' => 'applications/diffusion/data/DiffusionCommitRef.php', 625 + 'DiffusionCommitRelationship' => 'applications/diffusion/relationships/DiffusionCommitRelationship.php', 618 626 'DiffusionCommitRelationshipSource' => 'applications/search/relationship/DiffusionCommitRelationshipSource.php', 619 627 'DiffusionCommitRemarkupRule' => 'applications/diffusion/remarkup/DiffusionCommitRemarkupRule.php', 620 628 'DiffusionCommitRemarkupRuleTestCase' => 'applications/diffusion/remarkup/__tests__/DiffusionCommitRemarkupRuleTestCase.php', ··· 3867 3875 'PholioMockEmbedView' => 'applications/pholio/view/PholioMockEmbedView.php', 3868 3876 'PholioMockFulltextEngine' => 'applications/pholio/search/PholioMockFulltextEngine.php', 3869 3877 'PholioMockHasTaskEdgeType' => 'applications/pholio/edge/PholioMockHasTaskEdgeType.php', 3878 + 'PholioMockHasTaskRelationship' => 'applications/pholio/relationships/PholioMockHasTaskRelationship.php', 3870 3879 'PholioMockHeraldField' => 'applications/pholio/herald/PholioMockHeraldField.php', 3871 3880 'PholioMockHeraldFieldGroup' => 'applications/pholio/herald/PholioMockHeraldFieldGroup.php', 3872 3881 'PholioMockImagesView' => 'applications/pholio/view/PholioMockImagesView.php', ··· 3875 3884 'PholioMockNameHeraldField' => 'applications/pholio/herald/PholioMockNameHeraldField.php', 3876 3885 'PholioMockPHIDType' => 'applications/pholio/phid/PholioMockPHIDType.php', 3877 3886 'PholioMockQuery' => 'applications/pholio/query/PholioMockQuery.php', 3887 + 'PholioMockRelationship' => 'applications/pholio/relationships/PholioMockRelationship.php', 3878 3888 'PholioMockRelationshipSource' => 'applications/search/relationship/PholioMockRelationshipSource.php', 3879 3889 'PholioMockSearchEngine' => 'applications/pholio/query/PholioMockSearchEngine.php', 3880 3890 'PholioMockThumbGridView' => 'applications/pholio/view/PholioMockThumbGridView.php', ··· 4709 4719 'DifferentialChangesetTwoUpRenderer' => 'DifferentialChangesetHTMLRenderer', 4710 4720 'DifferentialChangesetTwoUpTestRenderer' => 'DifferentialChangesetTestRenderer', 4711 4721 'DifferentialChangesetViewController' => 'DifferentialController', 4722 + 'DifferentialChildRevisionsField' => 'DifferentialCustomField', 4712 4723 'DifferentialCloseConduitAPIMethod' => 'DifferentialConduitAPIMethod', 4713 4724 'DifferentialCommentPreviewController' => 'DifferentialController', 4714 4725 'DifferentialCommentSaveController' => 'DifferentialController', ··· 4735 4746 'DifferentialCustomFieldStringIndex' => 'PhabricatorCustomFieldStringIndexStorage', 4736 4747 'DifferentialDAO' => 'PhabricatorLiskDAO', 4737 4748 'DifferentialDefaultViewCapability' => 'PhabricatorPolicyCapability', 4738 - 'DifferentialDependenciesField' => 'DifferentialCustomField', 4739 - 'DifferentialDependsOnField' => 'DifferentialCustomField', 4740 4749 'DifferentialDiff' => array( 4741 4750 'DifferentialDAO', 4742 4751 'PhabricatorPolicyInterface', ··· 4817 4826 'DifferentialManiphestTasksField' => 'DifferentialCoreCustomField', 4818 4827 'DifferentialModernHunk' => 'DifferentialHunk', 4819 4828 'DifferentialNextStepField' => 'DifferentialCustomField', 4829 + 'DifferentialParentRevisionsField' => 'DifferentialCustomField', 4820 4830 'DifferentialParseCacheGarbageCollector' => 'PhabricatorGarbageCollector', 4821 4831 'DifferentialParseCommitMessageConduitAPIMethod' => 'DifferentialConduitAPIMethod', 4822 4832 'DifferentialParseRenderTestCase' => 'PhabricatorTestCase', ··· 4878 4888 'DifferentialRevisionDependsOnRevisionEdgeType' => 'PhabricatorEdgeType', 4879 4889 'DifferentialRevisionEditController' => 'DifferentialController', 4880 4890 'DifferentialRevisionFulltextEngine' => 'PhabricatorFulltextEngine', 4891 + 'DifferentialRevisionHasChildRelationship' => 'DifferentialRevisionRelationship', 4881 4892 'DifferentialRevisionHasCommitEdgeType' => 'PhabricatorEdgeType', 4893 + 'DifferentialRevisionHasCommitRelationship' => 'DifferentialRevisionRelationship', 4894 + 'DifferentialRevisionHasParentRelationship' => 'DifferentialRevisionRelationship', 4882 4895 'DifferentialRevisionHasReviewerEdgeType' => 'PhabricatorEdgeType', 4883 4896 'DifferentialRevisionHasTaskEdgeType' => 'PhabricatorEdgeType', 4897 + 'DifferentialRevisionHasTaskRelationship' => 'DifferentialRevisionRelationship', 4884 4898 'DifferentialRevisionHeraldField' => 'HeraldField', 4885 4899 'DifferentialRevisionHeraldFieldGroup' => 'HeraldFieldGroup', 4886 4900 'DifferentialRevisionIDField' => 'DifferentialCustomField', ··· 4893 4907 'DifferentialRevisionPackageHeraldField' => 'DifferentialRevisionHeraldField', 4894 4908 'DifferentialRevisionPackageOwnerHeraldField' => 'DifferentialRevisionHeraldField', 4895 4909 'DifferentialRevisionQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 4910 + 'DifferentialRevisionRelationship' => 'PhabricatorObjectRelationship', 4896 4911 'DifferentialRevisionRelationshipSource' => 'PhabricatorObjectRelationshipSource', 4897 4912 'DifferentialRevisionRepositoryHeraldField' => 'DifferentialRevisionHeraldField', 4898 4913 'DifferentialRevisionRepositoryProjectsHeraldField' => 'DifferentialRevisionHeraldField', ··· 4958 4973 'DiffusionCommitEditController' => 'DiffusionController', 4959 4974 'DiffusionCommitFulltextEngine' => 'PhabricatorFulltextEngine', 4960 4975 'DiffusionCommitHasRevisionEdgeType' => 'PhabricatorEdgeType', 4976 + 'DiffusionCommitHasRevisionRelationship' => 'DiffusionCommitRelationship', 4961 4977 'DiffusionCommitHasTaskEdgeType' => 'PhabricatorEdgeType', 4978 + 'DiffusionCommitHasTaskRelationship' => 'DiffusionCommitRelationship', 4962 4979 'DiffusionCommitHash' => 'Phobject', 4963 4980 'DiffusionCommitHeraldField' => 'HeraldField', 4964 4981 'DiffusionCommitHeraldFieldGroup' => 'HeraldFieldGroup', ··· 4972 4989 'DiffusionCommitParentsQueryConduitAPIMethod' => 'DiffusionQueryConduitAPIMethod', 4973 4990 'DiffusionCommitQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 4974 4991 'DiffusionCommitRef' => 'Phobject', 4992 + 'DiffusionCommitRelationship' => 'PhabricatorObjectRelationship', 4975 4993 'DiffusionCommitRelationshipSource' => 'PhabricatorObjectRelationshipSource', 4976 4994 'DiffusionCommitRemarkupRule' => 'PhabricatorObjectRemarkupRule', 4977 4995 'DiffusionCommitRemarkupRuleTestCase' => 'PhabricatorTestCase', ··· 8793 8811 'PholioMockEmbedView' => 'AphrontView', 8794 8812 'PholioMockFulltextEngine' => 'PhabricatorFulltextEngine', 8795 8813 'PholioMockHasTaskEdgeType' => 'PhabricatorEdgeType', 8814 + 'PholioMockHasTaskRelationship' => 'PholioMockRelationship', 8796 8815 'PholioMockHeraldField' => 'HeraldField', 8797 8816 'PholioMockHeraldFieldGroup' => 'HeraldFieldGroup', 8798 8817 'PholioMockImagesView' => 'AphrontView', ··· 8801 8820 'PholioMockNameHeraldField' => 'PholioMockHeraldField', 8802 8821 'PholioMockPHIDType' => 'PhabricatorPHIDType', 8803 8822 'PholioMockQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 8823 + 'PholioMockRelationship' => 'PhabricatorObjectRelationship', 8804 8824 'PholioMockRelationshipSource' => 'PhabricatorObjectRelationshipSource', 8805 8825 'PholioMockSearchEngine' => 'PhabricatorApplicationSearchEngine', 8806 8826 'PholioMockThumbGridView' => 'AphrontView',
+2 -2
src/applications/differential/config/PhabricatorDifferentialConfigOptions.php
··· 40 40 new DifferentialViewPolicyField(), 41 41 new DifferentialEditPolicyField(), 42 42 43 - new DifferentialDependsOnField(), 44 - new DifferentialDependenciesField(), 43 + new DifferentialParentRevisionsField(), 44 + new DifferentialChildRevisionsField(), 45 45 new DifferentialManiphestTasksField(), 46 46 new DifferentialCommitsField(), 47 47
+26 -22
src/applications/differential/controller/DifferentialRevisionViewController.php
··· 516 516 ->setDisabled(!$can_edit) 517 517 ->setWorkflow(!$can_edit)); 518 518 519 - $this->requireResource('phabricator-object-selector-css'); 520 - $this->requireResource('javelin-behavior-phabricator-object-selector'); 521 - 522 - $curtain->addAction( 523 - id(new PhabricatorActionView()) 524 - ->setIcon('fa-link') 525 - ->setName(pht('Edit Dependencies')) 526 - ->setHref("/search/attach/{$revision_phid}/DREV/dependencies/") 527 - ->setWorkflow(true) 528 - ->setDisabled(!$can_edit)); 529 - 530 - $maniphest = 'PhabricatorManiphestApplication'; 531 - if (PhabricatorApplication::isClassInstalled($maniphest)) { 532 - $curtain->addAction( 533 - id(new PhabricatorActionView()) 534 - ->setIcon('fa-anchor') 535 - ->setName(pht('Edit Maniphest Tasks')) 536 - ->setHref("/search/attach/{$revision_phid}/TASK/") 537 - ->setWorkflow(true) 538 - ->setDisabled(!$can_edit)); 539 - } 540 - 541 519 $request_uri = $this->getRequest()->getRequestURI(); 542 520 $curtain->addAction( 543 521 id(new PhabricatorActionView()) 544 522 ->setIcon('fa-download') 545 523 ->setName(pht('Download Raw Diff')) 546 524 ->setHref($request_uri->alter('download', 'true'))); 525 + 526 + $relationship_list = PhabricatorObjectRelationshipList::newForObject( 527 + $viewer, 528 + $revision); 529 + 530 + $parent_key = DifferentialRevisionHasParentRelationship::RELATIONSHIPKEY; 531 + $child_key = DifferentialRevisionHasChildRelationship::RELATIONSHIPKEY; 532 + 533 + $revision_submenu = array(); 534 + 535 + $revision_submenu[] = $relationship_list->getRelationship($parent_key) 536 + ->newAction($revision); 537 + 538 + $revision_submenu[] = $relationship_list->getRelationship($child_key) 539 + ->newAction($revision); 540 + 541 + $curtain->addAction( 542 + id(new PhabricatorActionView()) 543 + ->setName(pht('Edit Related Revisions...')) 544 + ->setIcon('fa-cog') 545 + ->setSubmenu($revision_submenu)); 546 + 547 + $relationship_submenu = $relationship_list->newActionMenu(); 548 + if ($relationship_submenu) { 549 + $curtain->addAction($relationship_submenu); 550 + } 547 551 548 552 return $curtain; 549 553 }
+2 -2
src/applications/differential/customfield/DifferentialDependenciesField.php src/applications/differential/customfield/DifferentialChildRevisionsField.php
··· 1 1 <?php 2 2 3 - final class DifferentialDependenciesField 3 + final class DifferentialChildRevisionsField 4 4 extends DifferentialCustomField { 5 5 6 6 public function getFieldKey() { ··· 8 8 } 9 9 10 10 public function getFieldName() { 11 - return pht('Dependencies'); 11 + return pht('Child Revisions'); 12 12 } 13 13 14 14 public function canDisableField() {
+2 -2
src/applications/differential/customfield/DifferentialDependsOnField.php src/applications/differential/customfield/DifferentialParentRevisionsField.php
··· 1 1 <?php 2 2 3 - final class DifferentialDependsOnField 3 + final class DifferentialParentRevisionsField 4 4 extends DifferentialCustomField { 5 5 6 6 public function getFieldKey() { ··· 12 12 } 13 13 14 14 public function getFieldName() { 15 - return pht('Depends On'); 15 + return pht('Parent Revisions'); 16 16 } 17 17 18 18 public function canDisableField() {
+44
src/applications/differential/relationships/DifferentialRevisionHasChildRelationship.php
··· 1 + <?php 2 + 3 + final class DifferentialRevisionHasChildRelationship 4 + extends DifferentialRevisionRelationship { 5 + 6 + const RELATIONSHIPKEY = 'revision.has-child'; 7 + 8 + public function getEdgeConstant() { 9 + return DifferentialRevisionDependedOnByRevisionEdgeType::EDGECONST; 10 + } 11 + 12 + protected function getActionName() { 13 + return pht('Edit Child Revisions'); 14 + } 15 + 16 + protected function getActionIcon() { 17 + return 'fa-chevron-circle-down'; 18 + } 19 + 20 + public function canRelateObjects($src, $dst) { 21 + return ($dst instanceof DifferentialRevision); 22 + } 23 + 24 + public function shouldAppearInActionMenu() { 25 + return false; 26 + } 27 + 28 + public function getDialogTitleText() { 29 + return pht('Edit Child Revisions'); 30 + } 31 + 32 + public function getDialogHeaderText() { 33 + return pht('Current Child Revisions'); 34 + } 35 + 36 + public function getDialogButtonText() { 37 + return pht('Save Child Revisions'); 38 + } 39 + 40 + protected function newRelationshipSource() { 41 + return new DifferentialRevisionRelationshipSource(); 42 + } 43 + 44 + }
+40
src/applications/differential/relationships/DifferentialRevisionHasCommitRelationship.php
··· 1 + <?php 2 + 3 + final class DifferentialRevisionHasCommitRelationship 4 + extends DifferentialRevisionRelationship { 5 + 6 + const RELATIONSHIPKEY = 'revision.has-commit'; 7 + 8 + public function getEdgeConstant() { 9 + return DifferentialRevisionHasCommitEdgeType::EDGECONST; 10 + } 11 + 12 + protected function getActionName() { 13 + return pht('Edit Commits'); 14 + } 15 + 16 + protected function getActionIcon() { 17 + return 'fa-code'; 18 + } 19 + 20 + public function canRelateObjects($src, $dst) { 21 + return ($dst instanceof PhabricatorRepositoryCommit); 22 + } 23 + 24 + public function getDialogTitleText() { 25 + return pht('Edit Related Commits'); 26 + } 27 + 28 + public function getDialogHeaderText() { 29 + return pht('Current Commits'); 30 + } 31 + 32 + public function getDialogButtonText() { 33 + return pht('Save Related Commits'); 34 + } 35 + 36 + protected function newRelationshipSource() { 37 + return new DiffusionCommitRelationshipSource(); 38 + } 39 + 40 + }
+44
src/applications/differential/relationships/DifferentialRevisionHasParentRelationship.php
··· 1 + <?php 2 + 3 + final class DifferentialRevisionHasParentRelationship 4 + extends DifferentialRevisionRelationship { 5 + 6 + const RELATIONSHIPKEY = 'revision.has-parent'; 7 + 8 + public function getEdgeConstant() { 9 + return DifferentialRevisionDependsOnRevisionEdgeType::EDGECONST; 10 + } 11 + 12 + protected function getActionName() { 13 + return pht('Edit Parent Revisions'); 14 + } 15 + 16 + protected function getActionIcon() { 17 + return 'fa-chevron-circle-up'; 18 + } 19 + 20 + public function canRelateObjects($src, $dst) { 21 + return ($dst instanceof DifferentialRevision); 22 + } 23 + 24 + public function shouldAppearInActionMenu() { 25 + return false; 26 + } 27 + 28 + public function getDialogTitleText() { 29 + return pht('Edit Parent Revisions'); 30 + } 31 + 32 + public function getDialogHeaderText() { 33 + return pht('Current Parent Revisions'); 34 + } 35 + 36 + public function getDialogButtonText() { 37 + return pht('Save Parent Revisions'); 38 + } 39 + 40 + protected function newRelationshipSource() { 41 + return new DifferentialRevisionRelationshipSource(); 42 + } 43 + 44 + }
+40
src/applications/differential/relationships/DifferentialRevisionHasTaskRelationship.php
··· 1 + <?php 2 + 3 + final class DifferentialRevisionHasTaskRelationship 4 + extends DifferentialRevisionRelationship { 5 + 6 + const RELATIONSHIPKEY = 'revision.has-task'; 7 + 8 + public function getEdgeConstant() { 9 + return DifferentialRevisionHasTaskEdgeType::EDGECONST; 10 + } 11 + 12 + protected function getActionName() { 13 + return pht('Edit Tasks'); 14 + } 15 + 16 + protected function getActionIcon() { 17 + return 'fa-anchor'; 18 + } 19 + 20 + public function canRelateObjects($src, $dst) { 21 + return ($dst instanceof ManiphestTask); 22 + } 23 + 24 + public function getDialogTitleText() { 25 + return pht('Edit Related Tasks'); 26 + } 27 + 28 + public function getDialogHeaderText() { 29 + return pht('Current Tasks'); 30 + } 31 + 32 + public function getDialogButtonText() { 33 + return pht('Save Related Tasks'); 34 + } 35 + 36 + protected function newRelationshipSource() { 37 + return new ManiphestTaskRelationshipSource(); 38 + } 39 + 40 + }
+19
src/applications/differential/relationships/DifferentialRevisionRelationship.php
··· 1 + <?php 2 + 3 + abstract class DifferentialRevisionRelationship 4 + extends PhabricatorObjectRelationship { 5 + 6 + public function isEnabledForObject($object) { 7 + $viewer = $this->getViewer(); 8 + 9 + $has_app = PhabricatorApplication::isClassInstalledForViewer( 10 + 'PhabricatorDifferentialApplication', 11 + $viewer); 12 + if (!$has_app) { 13 + return false; 14 + } 15 + 16 + return ($object instanceof DifferentialRevision); 17 + } 18 + 19 + }
+9 -14
src/applications/diffusion/controller/DiffusionCommitController.php
··· 968 968 ->setWorkflow(!$can_edit); 969 969 $curtain->addAction($action); 970 970 971 - require_celerity_resource('phabricator-object-selector-css'); 972 - require_celerity_resource('javelin-behavior-phabricator-object-selector'); 973 - 974 - $maniphest = 'PhabricatorManiphestApplication'; 975 - if (PhabricatorApplication::isClassInstalled($maniphest)) { 976 - $action = id(new PhabricatorActionView()) 977 - ->setName(pht('Edit Maniphest Tasks')) 978 - ->setIcon('fa-anchor') 979 - ->setHref('/search/attach/'.$commit->getPHID().'/TASK/edge/') 980 - ->setWorkflow(true) 981 - ->setDisabled(!$can_edit); 982 - $curtain->addAction($action); 983 - } 984 - 985 971 $action = id(new PhabricatorActionView()) 986 972 ->setName(pht('Download Raw Diff')) 987 973 ->setHref($request->getRequestURI()->alter('diff', true)) 988 974 ->setIcon('fa-download'); 989 975 $curtain->addAction($action); 976 + 977 + $relationship_list = PhabricatorObjectRelationshipList::newForObject( 978 + $viewer, 979 + $commit); 980 + 981 + $relationship_submenu = $relationship_list->newActionMenu(); 982 + if ($relationship_submenu) { 983 + $curtain->addAction($relationship_submenu); 984 + } 990 985 991 986 return $curtain; 992 987 }
+40
src/applications/diffusion/relationships/DiffusionCommitHasRevisionRelationship.php
··· 1 + <?php 2 + 3 + final class DiffusionCommitHasRevisionRelationship 4 + extends DiffusionCommitRelationship { 5 + 6 + const RELATIONSHIPKEY = 'commit.has-revision'; 7 + 8 + public function getEdgeConstant() { 9 + return DiffusionCommitHasRevisionEdgeType::EDGECONST; 10 + } 11 + 12 + protected function getActionName() { 13 + return pht('Edit Revisions'); 14 + } 15 + 16 + protected function getActionIcon() { 17 + return 'fa-cog'; 18 + } 19 + 20 + public function canRelateObjects($src, $dst) { 21 + return ($dst instanceof DifferentialRevision); 22 + } 23 + 24 + public function getDialogTitleText() { 25 + return pht('Edit Related Revisions'); 26 + } 27 + 28 + public function getDialogHeaderText() { 29 + return pht('Current Revisions'); 30 + } 31 + 32 + public function getDialogButtonText() { 33 + return pht('Save Related Revisions'); 34 + } 35 + 36 + protected function newRelationshipSource() { 37 + return new DifferentialRevisionRelationshipSource(); 38 + } 39 + 40 + }
+40
src/applications/diffusion/relationships/DiffusionCommitHasTaskRelationship.php
··· 1 + <?php 2 + 3 + final class DiffusionCommitHasTaskRelationship 4 + extends DiffusionCommitRelationship { 5 + 6 + const RELATIONSHIPKEY = 'commit.has-task'; 7 + 8 + public function getEdgeConstant() { 9 + return DiffusionCommitHasTaskEdgeType::EDGECONST; 10 + } 11 + 12 + protected function getActionName() { 13 + return pht('Edit Tasks'); 14 + } 15 + 16 + protected function getActionIcon() { 17 + return 'fa-anchor'; 18 + } 19 + 20 + public function canRelateObjects($src, $dst) { 21 + return ($dst instanceof ManiphestTask); 22 + } 23 + 24 + public function getDialogTitleText() { 25 + return pht('Edit Related Tasks'); 26 + } 27 + 28 + public function getDialogHeaderText() { 29 + return pht('Current Tasks'); 30 + } 31 + 32 + public function getDialogButtonText() { 33 + return pht('Save Related Tasks'); 34 + } 35 + 36 + protected function newRelationshipSource() { 37 + return new ManiphestTaskRelationshipSource(); 38 + } 39 + 40 + }
+19
src/applications/diffusion/relationships/DiffusionCommitRelationship.php
··· 1 + <?php 2 + 3 + abstract class DiffusionCommitRelationship 4 + extends PhabricatorObjectRelationship { 5 + 6 + public function isEnabledForObject($object) { 7 + $viewer = $this->getViewer(); 8 + 9 + $has_app = PhabricatorApplication::isClassInstalledForViewer( 10 + 'PhabricatorDiffusionApplication', 11 + $viewer); 12 + if (!$has_app) { 13 + return false; 14 + } 15 + 16 + return ($object instanceof PhabricatorRepositoryCommit); 17 + } 18 + 19 + }
+8 -7
src/applications/pholio/controller/PholioMockViewController.php
··· 150 150 ->setWorkflow(true)); 151 151 } 152 152 153 - $curtain->addAction( 154 - id(new PhabricatorActionView()) 155 - ->setIcon('fa-anchor') 156 - ->setName(pht('Edit Maniphest Tasks')) 157 - ->setHref("/search/attach/{$mock->getPHID()}/TASK/edge/") 158 - ->setDisabled(!$viewer->isLoggedIn()) 159 - ->setWorkflow(true)); 153 + $relationship_list = PhabricatorObjectRelationshipList::newForObject( 154 + $viewer, 155 + $mock); 156 + 157 + $relationship_submenu = $relationship_list->newActionMenu(); 158 + if ($relationship_submenu) { 159 + $curtain->addAction($relationship_submenu); 160 + } 160 161 161 162 if ($this->getManiphestTaskPHIDs()) { 162 163 $curtain->newPanel()
+40
src/applications/pholio/relationships/PholioMockHasTaskRelationship.php
··· 1 + <?php 2 + 3 + final class PholioMockHasTaskRelationship 4 + extends PholioMockRelationship { 5 + 6 + const RELATIONSHIPKEY = 'mock.has-task'; 7 + 8 + public function getEdgeConstant() { 9 + return PholioMockHasTaskEdgeType::EDGECONST; 10 + } 11 + 12 + protected function getActionName() { 13 + return pht('Edit Tasks'); 14 + } 15 + 16 + protected function getActionIcon() { 17 + return 'fa-anchor'; 18 + } 19 + 20 + public function canRelateObjects($src, $dst) { 21 + return ($dst instanceof ManiphestTask); 22 + } 23 + 24 + public function getDialogTitleText() { 25 + return pht('Edit Related Tasks'); 26 + } 27 + 28 + public function getDialogHeaderText() { 29 + return pht('Current Tasks'); 30 + } 31 + 32 + public function getDialogButtonText() { 33 + return pht('Save Related Tasks'); 34 + } 35 + 36 + protected function newRelationshipSource() { 37 + return new ManiphestTaskRelationshipSource(); 38 + } 39 + 40 + }
+19
src/applications/pholio/relationships/PholioMockRelationship.php
··· 1 + <?php 2 + 3 + abstract class PholioMockRelationship 4 + extends PhabricatorObjectRelationship { 5 + 6 + public function isEnabledForObject($object) { 7 + $viewer = $this->getViewer(); 8 + 9 + $has_app = PhabricatorApplication::isClassInstalledForViewer( 10 + 'PhabricatorPholioApplication', 11 + $viewer); 12 + if (!$has_app) { 13 + return false; 14 + } 15 + 16 + return ($object instanceof PholioMock); 17 + } 18 + 19 + }
+8
src/applications/search/relationship/DifferentialRevisionRelationshipSource.php
··· 3 3 final class DifferentialRevisionRelationshipSource 4 4 extends PhabricatorObjectRelationshipSource { 5 5 6 + public function isEnabledForObject($object) { 7 + $viewer = $this->getViewer(); 8 + 9 + return PhabricatorApplication::isClassInstalledForViewer( 10 + 'PhabricatorDifferentialApplication', 11 + $viewer); 12 + } 13 + 6 14 public function getResultPHIDTypes() { 7 15 return array( 8 16 DifferentialRevisionPHIDType::TYPECONST,
+8
src/applications/search/relationship/DiffusionCommitRelationshipSource.php
··· 3 3 final class DiffusionCommitRelationshipSource 4 4 extends PhabricatorObjectRelationshipSource { 5 5 6 + public function isEnabledForObject($object) { 7 + $viewer = $this->getViewer(); 8 + 9 + return PhabricatorApplication::isClassInstalledForViewer( 10 + 'PhabricatorDiffusionApplication', 11 + $viewer); 12 + } 13 + 6 14 public function getResultPHIDTypes() { 7 15 return array( 8 16 PhabricatorRepositoryCommitPHIDType::TYPECONST,
+8
src/applications/search/relationship/ManiphestTaskRelationshipSource.php
··· 3 3 final class ManiphestTaskRelationshipSource 4 4 extends PhabricatorObjectRelationshipSource { 5 5 6 + public function isEnabledForObject($object) { 7 + $viewer = $this->getViewer(); 8 + 9 + return PhabricatorApplication::isClassInstalledForViewer( 10 + 'PhabricatorManiphestApplication', 11 + $viewer); 12 + } 13 + 6 14 public function getResultPHIDTypes() { 7 15 return array( 8 16 ManiphestTaskPHIDType::TYPECONST,
+4 -1
src/applications/search/relationship/PhabricatorObjectRelationship.php
··· 54 54 } 55 55 56 56 final public function newSource() { 57 - return $this->newRelationshipSource(); 57 + $viewer = $this->getViewer(); 58 + 59 + return $this->newRelationshipSource() 60 + ->setViewer($viewer); 58 61 } 59 62 60 63 abstract protected function newRelationshipSource();
+5
src/applications/search/relationship/PhabricatorObjectRelationshipList.php
··· 87 87 continue; 88 88 } 89 89 90 + $source = $relationship->newSource(); 91 + if (!$source->isEnabledForObject($object)) { 92 + continue; 93 + } 94 + 90 95 $results[$key] = $relationship; 91 96 } 92 97
+12
src/applications/search/relationship/PhabricatorObjectRelationshipSource.php
··· 2 2 3 3 abstract class PhabricatorObjectRelationshipSource extends Phobject { 4 4 5 + private $viewer; 6 + 7 + final public function setViewer(PhabricatorUser $viewer) { 8 + $this->viewer = $viewer; 9 + return $this; 10 + } 11 + 12 + final public function getViewer() { 13 + return $this->viewer; 14 + } 15 + 16 + abstract public function isEnabledForObject($object); 5 17 abstract public function getResultPHIDTypes(); 6 18 7 19 }
+8
src/applications/search/relationship/PholioMockRelationshipSource.php
··· 3 3 final class PholioMockRelationshipSource 4 4 extends PhabricatorObjectRelationshipSource { 5 5 6 + public function isEnabledForObject($object) { 7 + $viewer = $this->getViewer(); 8 + 9 + return PhabricatorApplication::isClassInstalledForViewer( 10 + 'PhabricatorPholioApplication', 11 + $viewer); 12 + } 13 + 6 14 public function getResultPHIDTypes() { 7 15 return array( 8 16 PholioMockPHIDType::TYPECONST,