From 87db48289705382b381a8619c896452924f5ede0 Mon Sep 17 00:00:00 2001 From: Benjamin Kausch Date: Fri, 19 Jan 2024 11:04:54 +0100 Subject: [PATCH] Adds "Locate File" input to every browse directory view in Diffusion Summary: Ref T15645 The very helpful "Locate File" input in Diffusion was so far only visible in the homepage route of any repository (`/repository`). With this revision you can now locate a file from every browsed directory and in any selected commit. The finder was already "directory sensitive" meaning: if you are trying to locate a file from within a browsed directory, only the children of this path will be searched. For the searching in a specified commit (for example: https://we.phorge.it/source/phorge/browse/master/src/;05f4d5071fdca02123bd1ff4c0935b847c7f9963), I had to do a little JS magic adding the commit to the URI on the client side. Test Plan: Checkout, browse through your repos with Diffusion trying to find files. (I tested only with Git repos.) Reviewers: O1 Blessed Committers, speck Reviewed By: O1 Blessed Committers, speck Subscribers: speck, tobiaswiese, valerio.bozzolan, Matthew, Cigaryno Maniphest Tasks: T15645 Differential Revision: https://we.phorge.it/D25521 --- resources/celerity/map.php | 18 ++++---- .../controller/DiffusionBrowseController.php | 2 + .../controller/DiffusionController.php | 43 +++++++++++++++++++ .../DiffusionRepositoryController.php | 37 ---------------- .../diffusion/behavior-locate-file.js | 6 ++- 5 files changed, 59 insertions(+), 47 deletions(-) diff --git a/resources/celerity/map.php b/resources/celerity/map.php index 4008d8876e..4d48b64336 100644 --- a/resources/celerity/map.php +++ b/resources/celerity/map.php @@ -391,7 +391,7 @@ return array( 'rsrc/js/application/diffusion/behavior-audit-preview.js' => 'b7b73831', 'rsrc/js/application/diffusion/behavior-commit-branches.js' => '4b671572', 'rsrc/js/application/diffusion/behavior-commit-graph.js' => 'ac10c917', - 'rsrc/js/application/diffusion/behavior-locate-file.js' => '87428eb2', + 'rsrc/js/application/diffusion/behavior-locate-file.js' => '4c77f259', 'rsrc/js/application/diffusion/behavior-pull-lastmodified.js' => 'c715c123', 'rsrc/js/application/doorkeeper/behavior-doorkeeper-tag.js' => '6a85bc5a', 'rsrc/js/application/drydock/drydock-live-operation-status.js' => '47a0728b', @@ -619,7 +619,7 @@ return array( 'javelin-behavior-differential-populate' => 'b86ef6c2', 'javelin-behavior-diffusion-commit-branches' => '4b671572', 'javelin-behavior-diffusion-commit-graph' => 'ac10c917', - 'javelin-behavior-diffusion-locate-file' => '87428eb2', + 'javelin-behavior-diffusion-locate-file' => '4c77f259', 'javelin-behavior-diffusion-pull-lastmodified' => 'c715c123', 'javelin-behavior-document-engine' => '243d6c22', 'javelin-behavior-doorkeeper-tag' => '6a85bc5a', @@ -1375,6 +1375,13 @@ return array( 'javelin-install', 'javelin-dom', ), + '4c77f259' => array( + 'javelin-behavior', + 'javelin-diffusion-locate-file-source', + 'javelin-dom', + 'javelin-typeahead', + 'javelin-uri', + ), '4dffaeb2' => array( 'javelin-behavior', 'javelin-stratcom', @@ -1672,13 +1679,6 @@ return array( '84f82dad' => array( 'javelin-install', ), - '87428eb2' => array( - 'javelin-behavior', - 'javelin-diffusion-locate-file-source', - 'javelin-dom', - 'javelin-typeahead', - 'javelin-uri', - ), '876506b6' => array( 'javelin-view', 'javelin-install', diff --git a/src/applications/diffusion/controller/DiffusionBrowseController.php b/src/applications/diffusion/controller/DiffusionBrowseController.php index b81c42db8c..8cc0ae31c3 100644 --- a/src/applications/diffusion/controller/DiffusionBrowseController.php +++ b/src/applications/diffusion/controller/DiffusionBrowseController.php @@ -326,9 +326,11 @@ final class DiffusionBrowseController extends DiffusionController { )); $crumbs->setBorder(true); + $locate_file = $this->buildLocateFile(); $tabs = $this->buildTabsView('code'); $owners_list = $this->buildOwnersList($drequest); $bar = id(new PHUILeftRightView()) + ->setLeft($locate_file) ->setRight($this->corpusButtons) ->addClass('diffusion-action-bar'); diff --git a/src/applications/diffusion/controller/DiffusionController.php b/src/applications/diffusion/controller/DiffusionController.php index 618ee1a631..dc4c8e8699 100644 --- a/src/applications/diffusion/controller/DiffusionController.php +++ b/src/applications/diffusion/controller/DiffusionController.php @@ -554,4 +554,47 @@ abstract class DiffusionController extends PhabricatorController { } + /** + * @return PHUIBoxView|null + */ + protected function buildLocateFile() { + $request = $this->getRequest(); + $viewer = $request->getUser(); + $drequest = $this->getDiffusionRequest(); + $repository = $drequest->getRepository(); + + $form_box = null; + if ($repository->canUsePathTree()) { + Javelin::initBehavior( + 'diffusion-locate-file', + array( + 'controlID' => 'locate-control', + 'inputID' => 'locate-input', + 'symbolicCommit' => $drequest->getSymbolicCommit(), + 'browseBaseURI' => (string)$drequest->generateURI( + array( + 'action' => 'browse', + 'commit' => '', + 'path' => '', + )), + 'uri' => (string)$drequest->generateURI( + array( + 'action' => 'pathtree', + )), + )); + + $form = id(new AphrontFormView()) + ->setUser($viewer) + ->appendChild( + id(new AphrontFormTypeaheadControl()) + ->setHardpointID('locate-control') + ->setID('locate-input') + ->setPlaceholder(pht('Locate File'))); + $form_box = id(new PHUIBoxView()) + ->appendChild($form->buildLayoutView()) + ->addClass('diffusion-profile-locate'); + } + return $form_box; + } + } diff --git a/src/applications/diffusion/controller/DiffusionRepositoryController.php b/src/applications/diffusion/controller/DiffusionRepositoryController.php index 3ae237c22d..d111d52c4e 100644 --- a/src/applications/diffusion/controller/DiffusionRepositoryController.php +++ b/src/applications/diffusion/controller/DiffusionRepositoryController.php @@ -433,43 +433,6 @@ final class DiffusionRepositoryController extends DiffusionController { return $button; } - private function buildLocateFile() { - $request = $this->getRequest(); - $viewer = $request->getUser(); - $drequest = $this->getDiffusionRequest(); - $repository = $drequest->getRepository(); - - $form_box = null; - if ($repository->canUsePathTree()) { - Javelin::initBehavior( - 'diffusion-locate-file', - array( - 'controlID' => 'locate-control', - 'inputID' => 'locate-input', - 'browseBaseURI' => (string)$drequest->generateURI( - array( - 'action' => 'browse', - )), - 'uri' => (string)$drequest->generateURI( - array( - 'action' => 'pathtree', - )), - )); - - $form = id(new AphrontFormView()) - ->setUser($viewer) - ->appendChild( - id(new AphrontFormTypeaheadControl()) - ->setHardpointID('locate-control') - ->setID('locate-input') - ->setPlaceholder(pht('Locate File'))); - $form_box = id(new PHUIBoxView()) - ->appendChild($form->buildLayoutView()) - ->addClass('diffusion-profile-locate'); - } - return $form_box; - } - private function buildBrowseTable( $browse_results, $browse_paths, diff --git a/webroot/rsrc/js/application/diffusion/behavior-locate-file.js b/webroot/rsrc/js/application/diffusion/behavior-locate-file.js index c8817428e6..c44a1c7922 100644 --- a/webroot/rsrc/js/application/diffusion/behavior-locate-file.js +++ b/webroot/rsrc/js/application/diffusion/behavior-locate-file.js @@ -17,7 +17,11 @@ JX.behavior('diffusion-locate-file', function(config) { typeahead.setDatasource(datasource); typeahead.listen('choose', function(r) { - JX.$U(config.browseBaseURI + r.ref).go(); + var browseURI = config.browseBaseURI + r.ref; + if (config.symbolicCommit) { + browseURI += ';' + config.symbolicCommit; + } + JX.$U(browseURI).go(); }); var started = false;