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

Clean up display of clone URIs a little bit

Summary:
Ref T10923. This makes the "Clone URI" UI a little nicer:

- Show whether each URI is read-only, read-write, or external.
- Clicking the button selects the URI.
- Add a link to manage the appropriate credentials.

Test Plan: {F1308302, size=full}

Reviewers: chad

Reviewed By: chad

Maniphest Tasks: T10923

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

+191 -15
+10 -3
resources/celerity/map.php
··· 12 12 'darkconsole.pkg.js' => 'e7393ebb', 13 13 'differential.pkg.css' => '7ba78475', 14 14 'differential.pkg.js' => 'd0cd0df6', 15 - 'diffusion.pkg.css' => 'dc8e0cc2', 15 + 'diffusion.pkg.css' => '91c5d3a6', 16 16 'diffusion.pkg.js' => '3a9a8bfa', 17 17 'maniphest.pkg.css' => '4845691a', 18 18 'maniphest.pkg.js' => '949a7498', ··· 64 64 'rsrc/css/application/differential/revision-history.css' => '0e8eb855', 65 65 'rsrc/css/application/differential/revision-list.css' => 'f3c47d33', 66 66 'rsrc/css/application/differential/table-of-contents.css' => 'ae4b7a55', 67 - 'rsrc/css/application/diffusion/diffusion-icons.css' => '3311444d', 67 + 'rsrc/css/application/diffusion/diffusion-icons.css' => 'd678600a', 68 68 'rsrc/css/application/diffusion/diffusion-readme.css' => '297373eb', 69 69 'rsrc/css/application/diffusion/diffusion-source.css' => '68b30fd3', 70 70 'rsrc/css/application/feed/feed.css' => 'ecd4ec57', ··· 504 504 'rsrc/js/core/behavior-reveal-content.js' => '60821bc7', 505 505 'rsrc/js/core/behavior-scrollbar.js' => '834a1173', 506 506 'rsrc/js/core/behavior-search-typeahead.js' => '06c32383', 507 + 'rsrc/js/core/behavior-select-content.js' => 'bf5374ef', 507 508 'rsrc/js/core/behavior-select-on-click.js' => '4e3e79a6', 508 509 'rsrc/js/core/behavior-time-typeahead.js' => '522431f7', 509 510 'rsrc/js/core/behavior-toggle-class.js' => '92b9ec77', ··· 557 558 'differential-revision-history-css' => '0e8eb855', 558 559 'differential-revision-list-css' => 'f3c47d33', 559 560 'differential-table-of-contents-css' => 'ae4b7a55', 560 - 'diffusion-icons-css' => '3311444d', 561 + 'diffusion-icons-css' => 'd678600a', 561 562 'diffusion-readme-css' => '297373eb', 562 563 'diffusion-source-css' => '68b30fd3', 563 564 'diviner-shared-css' => 'aa3656aa', ··· 685 686 'javelin-behavior-repository-crossreference' => 'e5339c43', 686 687 'javelin-behavior-scrollbar' => '834a1173', 687 688 'javelin-behavior-search-reorder-queries' => 'e9581f08', 689 + 'javelin-behavior-select-content' => 'bf5374ef', 688 690 'javelin-behavior-select-on-click' => '4e3e79a6', 689 691 'javelin-behavior-slowvote-embed' => '887ad43f', 690 692 'javelin-behavior-stripe-payment-form' => '3f5d6dbf', ··· 1836 1838 'javelin-dom', 1837 1839 'javelin-util', 1838 1840 'javelin-request', 1841 + ), 1842 + 'bf5374ef' => array( 1843 + 'javelin-behavior', 1844 + 'javelin-stratcom', 1845 + 'javelin-dom', 1839 1846 ), 1840 1847 'bff6884b' => array( 1841 1848 'javelin-install',
+2
src/__phutil_library_map__.php
··· 573 573 'DiffusionCachedResolveRefsQuery' => 'applications/diffusion/query/DiffusionCachedResolveRefsQuery.php', 574 574 'DiffusionChangeController' => 'applications/diffusion/controller/DiffusionChangeController.php', 575 575 'DiffusionChangeHeraldFieldGroup' => 'applications/diffusion/herald/DiffusionChangeHeraldFieldGroup.php', 576 + 'DiffusionCloneURIView' => 'applications/diffusion/view/DiffusionCloneURIView.php', 576 577 'DiffusionCommandEngine' => 'applications/diffusion/protocol/DiffusionCommandEngine.php', 577 578 'DiffusionCommandEngineTestCase' => 'applications/diffusion/protocol/__tests__/DiffusionCommandEngineTestCase.php', 578 579 'DiffusionCommitAffectedFilesHeraldField' => 'applications/diffusion/herald/DiffusionCommitAffectedFilesHeraldField.php', ··· 4792 4793 'DiffusionCachedResolveRefsQuery' => 'DiffusionLowLevelQuery', 4793 4794 'DiffusionChangeController' => 'DiffusionController', 4794 4795 'DiffusionChangeHeraldFieldGroup' => 'HeraldFieldGroup', 4796 + 'DiffusionCloneURIView' => 'AphrontView', 4795 4797 'DiffusionCommandEngine' => 'Phobject', 4796 4798 'DiffusionCommandEngineTestCase' => 'PhabricatorTestCase', 4797 4799 'DiffusionCommitAffectedFilesHeraldField' => 'DiffusionCommitHeraldField',
+6 -12
src/applications/diffusion/controller/DiffusionRepositoryController.php
··· 669 669 PhabricatorRepository $repository, 670 670 PhabricatorRepositoryURI $uri) { 671 671 672 - require_celerity_resource('diffusion-icons-css'); 673 - 674 672 if ($repository->isSVN()) { 675 673 $display = csprintf( 676 674 'svn checkout %R %R', ··· 681 679 } 682 680 683 681 $display = (string)$display; 684 - 685 - $input = javelin_tag( 686 - 'input', 687 - array( 688 - 'type' => 'text', 689 - 'value' => $display, 690 - 'class' => 'diffusion-clone-uri', 691 - 'readonly' => 'true', 692 - )); 682 + $viewer = $this->getViewer(); 693 683 694 - return $input; 684 + return id(new DiffusionCloneURIView()) 685 + ->setViewer($viewer) 686 + ->setRepository($repository) 687 + ->setRepositoryURI($uri) 688 + ->setDisplayURI($display); 695 689 } 696 690 697 691 }
+131
src/applications/diffusion/view/DiffusionCloneURIView.php
··· 1 + <?php 2 + 3 + 4 + final class DiffusionCloneURIView extends AphrontView { 5 + 6 + private $repository; 7 + private $repositoryURI; 8 + private $displayURI; 9 + 10 + public function setRepository(PhabricatorRepository $repository) { 11 + $this->repository = $repository; 12 + return $this; 13 + } 14 + 15 + public function getRepository() { 16 + return $this->repository; 17 + } 18 + 19 + public function setRepositoryURI(PhabricatorRepositoryURI $repository_uri) { 20 + $this->repositoryURI = $repository_uri; 21 + return $this; 22 + } 23 + 24 + public function getRepositoryURI() { 25 + return $this->repositoryURI; 26 + } 27 + 28 + public function setDisplayURI($display_uri) { 29 + $this->displayURI = $display_uri; 30 + return $this; 31 + } 32 + 33 + public function getDisplayURI() { 34 + return $this->displayURI; 35 + } 36 + 37 + public function render() { 38 + require_celerity_resource('diffusion-icons-css'); 39 + 40 + Javelin::initBehavior('select-content'); 41 + 42 + $uri_id = celerity_generate_unique_node_id(); 43 + 44 + $display = $this->getDisplayURI(); 45 + 46 + $input = javelin_tag( 47 + 'input', 48 + array( 49 + 'id' => $uri_id, 50 + 'type' => 'text', 51 + 'value' => $display, 52 + 'class' => 'diffusion-clone-uri', 53 + 'readonly' => 'true', 54 + )); 55 + 56 + $uri = $this->getRepositoryURI(); 57 + switch ($uri->getEffectiveIOType()) { 58 + case PhabricatorRepositoryURI::IO_READ: 59 + $io_icon = 'fa-eye'; 60 + $io_tip = pht('Read-Only'); 61 + break; 62 + case PhabricatorRepositoryURI::IO_READWRITE: 63 + $io_icon = 'fa-download'; 64 + $io_tip = pht('Read / Write'); 65 + break; 66 + default: 67 + $io_icon = 'fa-cloud'; 68 + $io_tip = pht('External'); 69 + break; 70 + } 71 + 72 + $io = id(new PHUIButtonView()) 73 + ->setTag('a') 74 + ->setColor(PHUIButtonView::GREY) 75 + ->setIcon($io_icon) 76 + ->setHref('#') 77 + ->addSigil('select-content') 78 + ->addSigil('has-tooltip') 79 + ->setMetadata( 80 + array( 81 + 'tip' => $io_tip, 82 + 'selectID' => $uri_id, 83 + )); 84 + 85 + switch ($uri->getEffectiveIOType()) { 86 + case PhabricatorRepositoryURI::IO_READ: 87 + case PhabricatorRepositoryURI::IO_READWRITE: 88 + switch ($uri->getBuiltinProtocol()) { 89 + case PhabricatorRepositoryURI::BUILTIN_PROTOCOL_SSH: 90 + $auth_uri = '/settings/panel/ssh/'; 91 + $auth_tip = pht('Manage SSH Keys'); 92 + $auth_disabled = false; 93 + break; 94 + default: 95 + $auth_uri = '/settings/panel/vcspassword'; 96 + $auth_tip = pht('Manage Password'); 97 + $auth_disabled = false; 98 + break; 99 + } 100 + break; 101 + default: 102 + $auth_disabled = true; 103 + $auth_tip = pht('External'); 104 + $auth_uri = '#'; 105 + break; 106 + } 107 + 108 + $credentials = id(new PHUIButtonView()) 109 + ->setTag('a') 110 + ->setColor(PHUIButtonView::GREY) 111 + ->setIcon('fa-key') 112 + ->setTooltip($auth_tip) 113 + ->setHref($auth_uri) 114 + ->setDisabled($auth_disabled); 115 + 116 + $cells = array(); 117 + $cells[] = phutil_tag('td', array(), $input); 118 + $cells[] = phutil_tag('th', array(), $io); 119 + $cells[] = phutil_tag('th', array(), $credentials); 120 + 121 + $row = phutil_tag('tr', array(), $cells); 122 + 123 + return phutil_tag( 124 + 'table', 125 + array( 126 + 'class' => 'diffusion-clone-uri-table', 127 + ), 128 + $row); 129 + } 130 + 131 + }
+19
webroot/rsrc/css/application/diffusion/diffusion-icons.css
··· 28 28 .diffusion-search-boxen .phui-form-view { 29 29 padding: 0; 30 30 } 31 + 32 + .diffusion-clone-uri-table { 33 + width: 100%; 34 + } 35 + 36 + .diffusion-clone-uri-table th { 37 + width: 24px; 38 + padding: 0 0 0 4px; 39 + } 40 + 41 + .diffusion-clone-uri-table th a.button { 42 + width: 12px; 43 + height: 19px; 44 + } 45 + 46 + .diffusion-clone-uri-table th a.button .phui-icon-view { 47 + left: 12px; 48 + top: 7px; 49 + }
+23
webroot/rsrc/js/core/behavior-select-content.js
··· 1 + /** 2 + * @provides javelin-behavior-select-content 3 + * @requires javelin-behavior 4 + * javelin-stratcom 5 + * javelin-dom 6 + * @javelin 7 + */ 8 + 9 + JX.behavior('select-content', function() { 10 + JX.Stratcom.listen( 11 + 'click', 12 + 'select-content', 13 + function(e) { 14 + e.kill(); 15 + 16 + var node = e.getNode('select-content'); 17 + var data = JX.Stratcom.getData(node); 18 + 19 + var target = JX.$(data.selectID); 20 + JX.DOM.focus(target); 21 + target.select(); 22 + }); 23 + });