mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-09 16:32:39 +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-repository.css' => 'ee6f20ec',
|
||||
'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/files/global-drag-and-drop.css' => 'b556a948',
|
||||
'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-typeahead.css' => '667a48ae',
|
||||
'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/tokens/tokens.css' => '3d0f239e',
|
||||
'rsrc/css/application/uiexample/example.css' => '528b19de',
|
||||
|
@ -570,7 +570,7 @@ return array(
|
|||
'differential-revision-history-css' => '0e8eb855',
|
||||
'differential-revision-list-css' => 'f3c47d33',
|
||||
'differential-table-of-contents-css' => 'ae4b7a55',
|
||||
'diffusion-css' => '8a6eb632',
|
||||
'diffusion-css' => 'd0fbb996',
|
||||
'diffusion-icons-css' => '0c15255e',
|
||||
'diffusion-readme-css' => '419dd5b6',
|
||||
'diffusion-repository-css' => 'ee6f20ec',
|
||||
|
@ -798,7 +798,7 @@ return array(
|
|||
'phabricator-phtize' => 'd254d646',
|
||||
'phabricator-prefab' => 'c5af80a2',
|
||||
'phabricator-remarkup-css' => 'cad18339',
|
||||
'phabricator-search-results-css' => '8f8e08ed',
|
||||
'phabricator-search-results-css' => '505dd8cf',
|
||||
'phabricator-shaped-request' => '7cbe244b',
|
||||
'phabricator-slowvote-css' => 'a94b7230',
|
||||
'phabricator-source-code-view-css' => 'aea41829',
|
||||
|
|
|
@ -776,6 +776,7 @@ phutil_register_library_map(array(
|
|||
'DiffusionPathQueryTestCase' => 'applications/diffusion/query/pathid/__tests__/DiffusionPathQueryTestCase.php',
|
||||
'DiffusionPathTreeController' => 'applications/diffusion/controller/DiffusionPathTreeController.php',
|
||||
'DiffusionPathValidateController' => 'applications/diffusion/controller/DiffusionPathValidateController.php',
|
||||
'DiffusionPatternSearchView' => 'applications/diffusion/view/DiffusionPatternSearchView.php',
|
||||
'DiffusionPhpExternalSymbolsSource' => 'applications/diffusion/symbol/DiffusionPhpExternalSymbolsSource.php',
|
||||
'DiffusionPreCommitContentAffectedFilesHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitContentAffectedFilesHeraldField.php',
|
||||
'DiffusionPreCommitContentAuthorHeraldField' => 'applications/diffusion/herald/DiffusionPreCommitContentAuthorHeraldField.php',
|
||||
|
@ -5776,6 +5777,7 @@ phutil_register_library_map(array(
|
|||
'DiffusionPathQueryTestCase' => 'PhabricatorTestCase',
|
||||
'DiffusionPathTreeController' => 'DiffusionController',
|
||||
'DiffusionPathValidateController' => 'DiffusionController',
|
||||
'DiffusionPatternSearchView' => 'DiffusionView',
|
||||
'DiffusionPhpExternalSymbolsSource' => 'DiffusionExternalSymbolsSource',
|
||||
'DiffusionPreCommitContentAffectedFilesHeraldField' => 'DiffusionPreCommitContentHeraldField',
|
||||
'DiffusionPreCommitContentAuthorHeraldField' => 'DiffusionPreCommitContentHeraldField',
|
||||
|
|
|
@ -447,136 +447,53 @@ final class DiffusionBrowseController extends DiffusionController {
|
|||
}
|
||||
$results = $pager->sliceResults($results);
|
||||
|
||||
$table = null;
|
||||
$header = null;
|
||||
if ($search_mode == 'grep') {
|
||||
$table = $this->renderGrepResults($results, $query_string);
|
||||
$header = pht(
|
||||
$title = pht(
|
||||
'File content matching "%s" under "%s"',
|
||||
$query_string,
|
||||
nonempty($drequest->getPath(), '/'));
|
||||
$header = id(new PHUIHeaderView())
|
||||
->setHeader($title)
|
||||
->addClass('diffusion-search-result-header');
|
||||
}
|
||||
|
||||
return id(new PHUIObjectBoxView())
|
||||
->setHeaderText($header)
|
||||
->setBackground(PHUIObjectBoxView::BLUE_PROPERTY)
|
||||
->setTable($table)
|
||||
->setPager($pager);
|
||||
return array($header, $table, $pager);
|
||||
|
||||
}
|
||||
|
||||
private function renderGrepResults(array $results, $pattern) {
|
||||
$drequest = $this->getDiffusionRequest();
|
||||
|
||||
require_celerity_resource('phabricator-search-results-css');
|
||||
|
||||
$rows = array();
|
||||
foreach ($results as $result) {
|
||||
list($path, $line, $string) = $result;
|
||||
|
||||
$href = $drequest->generateURI(array(
|
||||
'action' => 'browse',
|
||||
'path' => $path,
|
||||
'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,
|
||||
);
|
||||
if (!$results) {
|
||||
return id(new PHUIInfoView())
|
||||
->setSeverity(PHUIInfoView::SEVERITY_NODATA)
|
||||
->appendChild(
|
||||
pht(
|
||||
'The pattern you searched for was not found in the content of any '.
|
||||
'files.'));
|
||||
}
|
||||
|
||||
$table = id(new AphrontTableView($rows))
|
||||
->setClassName('remarkup-code')
|
||||
->setHeaders(array(pht('Path'), pht('Line'), pht('String')))
|
||||
->setColumnClasses(array('', 'n', 'wide'))
|
||||
->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),
|
||||
);
|
||||
$grouped = array();
|
||||
foreach ($results as $file) {
|
||||
list($path, $line, $string) = $file;
|
||||
$grouped[$path][] = array($line, $string);
|
||||
}
|
||||
|
||||
$table = id(new AphrontTableView($rows))
|
||||
->setHeaders(array(pht('Path')))
|
||||
->setColumnClasses(array('wide'))
|
||||
->setNoDataString(
|
||||
pht(
|
||||
'The pattern you searched for did not match the names of any '.
|
||||
'files.'));
|
||||
$view = array();
|
||||
foreach ($grouped as $path => $matches) {
|
||||
$view[] = id(new DiffusionPatternSearchView())
|
||||
->setPath($path)
|
||||
->setMatches($matches)
|
||||
->setPattern($pattern)
|
||||
->setDiffusionRequest($drequest)
|
||||
->render();
|
||||
}
|
||||
|
||||
return $table;
|
||||
return $view;
|
||||
}
|
||||
|
||||
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};
|
||||
}
|
||||
|
||||
.diffusion-search-result-header.phui-header-shell {
|
||||
border: none;
|
||||
padding-bottom: 24px;
|
||||
}
|
||||
|
||||
/* - Search Input ------------------------------------------------------------*/
|
||||
|
||||
.diffusion-search-form-view {
|
||||
|
|
|
@ -12,9 +12,10 @@
|
|||
}
|
||||
|
||||
.phui-source-fragment strong {
|
||||
background-color: {$lightyellow};
|
||||
font-weight: normal;
|
||||
background-color: {$gentle.highlight};
|
||||
font-weight: 600;
|
||||
color: {$blacktext};
|
||||
letter-spacing: 0.02em;
|
||||
}
|
||||
|
||||
.phui-fulltext-tokens {
|
||||
|
|
Loading…
Reference in a new issue