mirror of
https://we.phorge.it/source/phorge.git
synced 2024-12-23 14:00:56 +01:00
Build a basic DiffusionPatternSearchView
Summary: Roughs this in a little, kinda basic. Allows for grouping results by page. A bit better on mobile. Would like more content return from conduit though. Test Plan: Test `CMS`, `cms`, and `OMGLOLWTFBBQ`, desktop and mobile {F5099081} Reviewers: epriestley Reviewed By: epriestley Subscribers: Korvin Differential Revision: https://secure.phabricator.com/D18429
This commit is contained in:
parent
0a9ad6d5e7
commit
4d335b7bef
6 changed files with 166 additions and 117 deletions
|
@ -75,7 +75,7 @@ return array(
|
||||||
'rsrc/css/application/diffusion/diffusion-readme.css' => '419dd5b6',
|
'rsrc/css/application/diffusion/diffusion-readme.css' => '419dd5b6',
|
||||||
'rsrc/css/application/diffusion/diffusion-repository.css' => 'ee6f20ec',
|
'rsrc/css/application/diffusion/diffusion-repository.css' => 'ee6f20ec',
|
||||||
'rsrc/css/application/diffusion/diffusion-source.css' => '750add59',
|
'rsrc/css/application/diffusion/diffusion-source.css' => '750add59',
|
||||||
'rsrc/css/application/diffusion/diffusion.css' => '8a6eb632',
|
'rsrc/css/application/diffusion/diffusion.css' => 'd0fbb996',
|
||||||
'rsrc/css/application/feed/feed.css' => 'ecd4ec57',
|
'rsrc/css/application/feed/feed.css' => 'ecd4ec57',
|
||||||
'rsrc/css/application/files/global-drag-and-drop.css' => 'b556a948',
|
'rsrc/css/application/files/global-drag-and-drop.css' => 'b556a948',
|
||||||
'rsrc/css/application/flag/flag.css' => 'bba8f811',
|
'rsrc/css/application/flag/flag.css' => 'bba8f811',
|
||||||
|
@ -111,7 +111,7 @@ return array(
|
||||||
'rsrc/css/application/releeph/releeph-request-differential-create-dialog.css' => '8d8b92cd',
|
'rsrc/css/application/releeph/releeph-request-differential-create-dialog.css' => '8d8b92cd',
|
||||||
'rsrc/css/application/releeph/releeph-request-typeahead.css' => '667a48ae',
|
'rsrc/css/application/releeph/releeph-request-typeahead.css' => '667a48ae',
|
||||||
'rsrc/css/application/search/application-search-view.css' => '66ee5d46',
|
'rsrc/css/application/search/application-search-view.css' => '66ee5d46',
|
||||||
'rsrc/css/application/search/search-results.css' => '8f8e08ed',
|
'rsrc/css/application/search/search-results.css' => '505dd8cf',
|
||||||
'rsrc/css/application/slowvote/slowvote.css' => 'a94b7230',
|
'rsrc/css/application/slowvote/slowvote.css' => 'a94b7230',
|
||||||
'rsrc/css/application/tokens/tokens.css' => '3d0f239e',
|
'rsrc/css/application/tokens/tokens.css' => '3d0f239e',
|
||||||
'rsrc/css/application/uiexample/example.css' => '528b19de',
|
'rsrc/css/application/uiexample/example.css' => '528b19de',
|
||||||
|
@ -570,7 +570,7 @@ return array(
|
||||||
'differential-revision-history-css' => '0e8eb855',
|
'differential-revision-history-css' => '0e8eb855',
|
||||||
'differential-revision-list-css' => 'f3c47d33',
|
'differential-revision-list-css' => 'f3c47d33',
|
||||||
'differential-table-of-contents-css' => 'ae4b7a55',
|
'differential-table-of-contents-css' => 'ae4b7a55',
|
||||||
'diffusion-css' => '8a6eb632',
|
'diffusion-css' => 'd0fbb996',
|
||||||
'diffusion-icons-css' => '0c15255e',
|
'diffusion-icons-css' => '0c15255e',
|
||||||
'diffusion-readme-css' => '419dd5b6',
|
'diffusion-readme-css' => '419dd5b6',
|
||||||
'diffusion-repository-css' => 'ee6f20ec',
|
'diffusion-repository-css' => 'ee6f20ec',
|
||||||
|
@ -798,7 +798,7 @@ return array(
|
||||||
'phabricator-phtize' => 'd254d646',
|
'phabricator-phtize' => 'd254d646',
|
||||||
'phabricator-prefab' => 'c5af80a2',
|
'phabricator-prefab' => 'c5af80a2',
|
||||||
'phabricator-remarkup-css' => 'cad18339',
|
'phabricator-remarkup-css' => 'cad18339',
|
||||||
'phabricator-search-results-css' => '8f8e08ed',
|
'phabricator-search-results-css' => '505dd8cf',
|
||||||
'phabricator-shaped-request' => '7cbe244b',
|
'phabricator-shaped-request' => '7cbe244b',
|
||||||
'phabricator-slowvote-css' => 'a94b7230',
|
'phabricator-slowvote-css' => 'a94b7230',
|
||||||
'phabricator-source-code-view-css' => 'aea41829',
|
'phabricator-source-code-view-css' => 'aea41829',
|
||||||
|
|
|
@ -776,6 +776,7 @@ phutil_register_library_map(array(
|
||||||
'DiffusionPathQueryTestCase' => 'applications/diffusion/query/pathid/__tests__/DiffusionPathQueryTestCase.php',
|
'DiffusionPathQueryTestCase' => 'applications/diffusion/query/pathid/__tests__/DiffusionPathQueryTestCase.php',
|
||||||
'DiffusionPathTreeController' => 'applications/diffusion/controller/DiffusionPathTreeController.php',
|
'DiffusionPathTreeController' => 'applications/diffusion/controller/DiffusionPathTreeController.php',
|
||||||
'DiffusionPathValidateController' => 'applications/diffusion/controller/DiffusionPathValidateController.php',
|
'DiffusionPathValidateController' => 'applications/diffusion/controller/DiffusionPathValidateController.php',
|
||||||
|
'DiffusionPatternSearchView' => 'applications/diffusion/view/DiffusionPatternSearchView.php',
|
||||||
'DiffusionPhpExternalSymbolsSource' => 'applications/diffusion/symbol/DiffusionPhpExternalSymbolsSource.php',
|
'DiffusionPhpExternalSymbolsSource' => 'applications/diffusion/symbol/DiffusionPhpExternalSymbolsSource.php',
|
||||||
'DiffusionPreCommitContentAffectedFilesHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitContentAffectedFilesHeraldField.php',
|
'DiffusionPreCommitContentAffectedFilesHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitContentAffectedFilesHeraldField.php',
|
||||||
'DiffusionPreCommitContentAuthorHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitContentAuthorHeraldField.php',
|
'DiffusionPreCommitContentAuthorHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitContentAuthorHeraldField.php',
|
||||||
|
@ -5776,6 +5777,7 @@ phutil_register_library_map(array(
|
||||||
'DiffusionPathQueryTestCase' => 'PhabricatorTestCase',
|
'DiffusionPathQueryTestCase' => 'PhabricatorTestCase',
|
||||||
'DiffusionPathTreeController' => 'DiffusionController',
|
'DiffusionPathTreeController' => 'DiffusionController',
|
||||||
'DiffusionPathValidateController' => 'DiffusionController',
|
'DiffusionPathValidateController' => 'DiffusionController',
|
||||||
|
'DiffusionPatternSearchView' => 'DiffusionView',
|
||||||
'DiffusionPhpExternalSymbolsSource' => 'DiffusionExternalSymbolsSource',
|
'DiffusionPhpExternalSymbolsSource' => 'DiffusionExternalSymbolsSource',
|
||||||
'DiffusionPreCommitContentAffectedFilesHeraldField' => 'DiffusionPreCommitContentHeraldField',
|
'DiffusionPreCommitContentAffectedFilesHeraldField' => 'DiffusionPreCommitContentHeraldField',
|
||||||
'DiffusionPreCommitContentAuthorHeraldField' => 'DiffusionPreCommitContentHeraldField',
|
'DiffusionPreCommitContentAuthorHeraldField' => 'DiffusionPreCommitContentHeraldField',
|
||||||
|
|
|
@ -447,136 +447,53 @@ final class DiffusionBrowseController extends DiffusionController {
|
||||||
}
|
}
|
||||||
$results = $pager->sliceResults($results);
|
$results = $pager->sliceResults($results);
|
||||||
|
|
||||||
|
$table = null;
|
||||||
|
$header = null;
|
||||||
if ($search_mode == 'grep') {
|
if ($search_mode == 'grep') {
|
||||||
$table = $this->renderGrepResults($results, $query_string);
|
$table = $this->renderGrepResults($results, $query_string);
|
||||||
$header = pht(
|
$title = pht(
|
||||||
'File content matching "%s" under "%s"',
|
'File content matching "%s" under "%s"',
|
||||||
$query_string,
|
$query_string,
|
||||||
nonempty($drequest->getPath(), '/'));
|
nonempty($drequest->getPath(), '/'));
|
||||||
|
$header = id(new PHUIHeaderView())
|
||||||
|
->setHeader($title)
|
||||||
|
->addClass('diffusion-search-result-header');
|
||||||
}
|
}
|
||||||
|
|
||||||
return id(new PHUIObjectBoxView())
|
return array($header, $table, $pager);
|
||||||
->setHeaderText($header)
|
|
||||||
->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)
|
|
||||||
->setTable($table)
|
|
||||||
->setPager($pager);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private function renderGrepResults(array $results, $pattern) {
|
private function renderGrepResults(array $results, $pattern) {
|
||||||
$drequest = $this->getDiffusionRequest();
|
$drequest = $this->getDiffusionRequest();
|
||||||
|
|
||||||
require_celerity_resource('phabricator-search-results-css');
|
require_celerity_resource('phabricator-search-results-css');
|
||||||
|
|
||||||
$rows = array();
|
if (!$results) {
|
||||||
foreach ($results as $result) {
|
return id(new PHUIInfoView())
|
||||||
list($path, $line, $string) = $result;
|
->setSeverity(PHUIInfoView::SEVERITY_NODATA)
|
||||||
|
->appendChild(
|
||||||
$href = $drequest->generateURI(array(
|
pht(
|
||||||
'action' => 'browse',
|
'The pattern you searched for was not found in the content of any '.
|
||||||
'path' => $path,
|
'files.'));
|
||||||
'line' => $line,
|
|
||||||
));
|
|
||||||
|
|
||||||
$matches = null;
|
|
||||||
$count = @preg_match_all(
|
|
||||||
'('.$pattern.')u',
|
|
||||||
$string,
|
|
||||||
$matches,
|
|
||||||
PREG_OFFSET_CAPTURE);
|
|
||||||
|
|
||||||
if (!$count) {
|
|
||||||
$output = ltrim($string);
|
|
||||||
} else {
|
|
||||||
$output = array();
|
|
||||||
$cursor = 0;
|
|
||||||
$length = strlen($string);
|
|
||||||
foreach ($matches[0] as $match) {
|
|
||||||
$offset = $match[1];
|
|
||||||
if ($cursor != $offset) {
|
|
||||||
$output[] = array(
|
|
||||||
'text' => substr($string, $cursor, $offset),
|
|
||||||
'highlight' => false,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
$output[] = array(
|
|
||||||
'text' => $match[0],
|
|
||||||
'highlight' => true,
|
|
||||||
);
|
|
||||||
$cursor = $offset + strlen($match[0]);
|
|
||||||
}
|
|
||||||
if ($cursor != $length) {
|
|
||||||
$output[] = array(
|
|
||||||
'text' => substr($string, $cursor),
|
|
||||||
'highlight' => false,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($output) {
|
|
||||||
$output[0]['text'] = ltrim($output[0]['text']);
|
|
||||||
}
|
|
||||||
|
|
||||||
foreach ($output as $key => $segment) {
|
|
||||||
if ($segment['highlight']) {
|
|
||||||
$output[$key] = phutil_tag('strong', array(), $segment['text']);
|
|
||||||
} else {
|
|
||||||
$output[$key] = $segment['text'];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
$string = phutil_tag(
|
|
||||||
'pre',
|
|
||||||
array('class' => 'PhabricatorMonospaced phui-source-fragment'),
|
|
||||||
$output);
|
|
||||||
|
|
||||||
$path = Filesystem::readablePath($path, $drequest->getPath());
|
|
||||||
|
|
||||||
$rows[] = array(
|
|
||||||
phutil_tag('a', array('href' => $href), $path),
|
|
||||||
$line,
|
|
||||||
$string,
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$table = id(new AphrontTableView($rows))
|
$grouped = array();
|
||||||
->setClassName('remarkup-code')
|
foreach ($results as $file) {
|
||||||
->setHeaders(array(pht('Path'), pht('Line'), pht('String')))
|
list($path, $line, $string) = $file;
|
||||||
->setColumnClasses(array('', 'n', 'wide'))
|
$grouped[$path][] = array($line, $string);
|
||||||
->setNoDataString(
|
|
||||||
pht(
|
|
||||||
'The pattern you searched for was not found in the content of any '.
|
|
||||||
'files.'));
|
|
||||||
|
|
||||||
return $table;
|
|
||||||
}
|
|
||||||
|
|
||||||
private function renderFindResults(array $results) {
|
|
||||||
$drequest = $this->getDiffusionRequest();
|
|
||||||
|
|
||||||
$rows = array();
|
|
||||||
foreach ($results as $result) {
|
|
||||||
$href = $drequest->generateURI(array(
|
|
||||||
'action' => 'browse',
|
|
||||||
'path' => $result,
|
|
||||||
));
|
|
||||||
|
|
||||||
$readable = Filesystem::readablePath($result, $drequest->getPath());
|
|
||||||
|
|
||||||
$rows[] = array(
|
|
||||||
phutil_tag('a', array('href' => $href), $readable),
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
$table = id(new AphrontTableView($rows))
|
$view = array();
|
||||||
->setHeaders(array(pht('Path')))
|
foreach ($grouped as $path => $matches) {
|
||||||
->setColumnClasses(array('wide'))
|
$view[] = id(new DiffusionPatternSearchView())
|
||||||
->setNoDataString(
|
->setPath($path)
|
||||||
pht(
|
->setMatches($matches)
|
||||||
'The pattern you searched for did not match the names of any '.
|
->setPattern($pattern)
|
||||||
'files.'));
|
->setDiffusionRequest($drequest)
|
||||||
|
->render();
|
||||||
|
}
|
||||||
|
|
||||||
return $table;
|
return $view;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function loadLintMessages() {
|
private function loadLintMessages() {
|
||||||
|
|
124
src/applications/diffusion/view/DiffusionPatternSearchView.php
Normal file
124
src/applications/diffusion/view/DiffusionPatternSearchView.php
Normal file
|
@ -0,0 +1,124 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
final class DiffusionPatternSearchView extends DiffusionView {
|
||||||
|
|
||||||
|
private $path;
|
||||||
|
private $matches;
|
||||||
|
private $pattern;
|
||||||
|
|
||||||
|
public function setPath($path) {
|
||||||
|
$this->path = $path;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setMatches(array $matches) {
|
||||||
|
$this->matches = $matches;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setPattern($pattern) {
|
||||||
|
$this->pattern = $pattern;
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function render() {
|
||||||
|
$drequest = $this->getDiffusionRequest();
|
||||||
|
$path = $this->path;
|
||||||
|
$pattern = $this->pattern;
|
||||||
|
$rows = array();
|
||||||
|
|
||||||
|
foreach ($this->matches as $result) {
|
||||||
|
list($line, $string) = $result;
|
||||||
|
|
||||||
|
$matches = null;
|
||||||
|
$count = @preg_match_all(
|
||||||
|
'('.$pattern.')u',
|
||||||
|
$string,
|
||||||
|
$matches,
|
||||||
|
PREG_OFFSET_CAPTURE);
|
||||||
|
|
||||||
|
if (!$count) {
|
||||||
|
$output = ltrim($string);
|
||||||
|
} else {
|
||||||
|
$output = array();
|
||||||
|
$cursor = 0;
|
||||||
|
$length = strlen($string);
|
||||||
|
foreach ($matches[0] as $match) {
|
||||||
|
$offset = $match[1];
|
||||||
|
if ($cursor != $offset) {
|
||||||
|
$output[] = array(
|
||||||
|
'text' => substr($string, $cursor, $offset),
|
||||||
|
'highlight' => false,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
$output[] = array(
|
||||||
|
'text' => $match[0],
|
||||||
|
'highlight' => true,
|
||||||
|
);
|
||||||
|
$cursor = $offset + strlen($match[0]);
|
||||||
|
}
|
||||||
|
if ($cursor != $length) {
|
||||||
|
$output[] = array(
|
||||||
|
'text' => substr($string, $cursor),
|
||||||
|
'highlight' => false,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($output) {
|
||||||
|
$output[0]['text'] = ltrim($output[0]['text']);
|
||||||
|
}
|
||||||
|
|
||||||
|
foreach ($output as $key => $segment) {
|
||||||
|
if ($segment['highlight']) {
|
||||||
|
$output[$key] = phutil_tag('strong', array(), $segment['text']);
|
||||||
|
} else {
|
||||||
|
$output[$key] = $segment['text'];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$string = phutil_tag(
|
||||||
|
'pre',
|
||||||
|
array('class' => 'PhabricatorMonospaced phui-source-fragment'),
|
||||||
|
$output);
|
||||||
|
|
||||||
|
$href = $drequest->generateURI(array(
|
||||||
|
'action' => 'browse',
|
||||||
|
'path' => $path,
|
||||||
|
'line' => $line,
|
||||||
|
));
|
||||||
|
|
||||||
|
$rows[] = array(
|
||||||
|
phutil_tag('a', array('href' => $href), $line),
|
||||||
|
$string,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
$path_title = Filesystem::readablePath($this->path, $drequest->getPath());
|
||||||
|
|
||||||
|
$href = $drequest->generateURI(array(
|
||||||
|
'action' => 'browse',
|
||||||
|
'path' => $path_title,
|
||||||
|
));
|
||||||
|
|
||||||
|
$title = phutil_tag('a', array('href' => $href), $path_title);
|
||||||
|
|
||||||
|
|
||||||
|
$table = id(new AphrontTableView($rows))
|
||||||
|
->setClassName('remarkup-code')
|
||||||
|
->setHeaders(array(pht('Line'), pht('String')))
|
||||||
|
->setColumnClasses(array('n', 'wide'));
|
||||||
|
|
||||||
|
$header = id(new PHUIHeaderView())
|
||||||
|
->setHeader($title);
|
||||||
|
|
||||||
|
$box = id(new PHUIObjectBoxView())
|
||||||
|
->setHeader($header)
|
||||||
|
->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)
|
||||||
|
->setTable($table);
|
||||||
|
|
||||||
|
return $box->render();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -122,6 +122,11 @@
|
||||||
color: {$darkbluetext};
|
color: {$darkbluetext};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.diffusion-search-result-header.phui-header-shell {
|
||||||
|
border: none;
|
||||||
|
padding-bottom: 24px;
|
||||||
|
}
|
||||||
|
|
||||||
/* - Search Input ------------------------------------------------------------*/
|
/* - Search Input ------------------------------------------------------------*/
|
||||||
|
|
||||||
.diffusion-search-form-view {
|
.diffusion-search-form-view {
|
||||||
|
|
|
@ -12,9 +12,10 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
.phui-source-fragment strong {
|
.phui-source-fragment strong {
|
||||||
background-color: {$lightyellow};
|
background-color: {$gentle.highlight};
|
||||||
font-weight: normal;
|
font-weight: 600;
|
||||||
color: {$blacktext};
|
color: {$blacktext};
|
||||||
|
letter-spacing: 0.02em;
|
||||||
}
|
}
|
||||||
|
|
||||||
.phui-fulltext-tokens {
|
.phui-fulltext-tokens {
|
||||||
|
|
Loading…
Reference in a new issue