diff --git a/src/applications/macro/controller/PhabricatorMacroListController.php b/src/applications/macro/controller/PhabricatorMacroListController.php index 691fa6b9b7..828cbf01a0 100644 --- a/src/applications/macro/controller/PhabricatorMacroListController.php +++ b/src/applications/macro/controller/PhabricatorMacroListController.php @@ -9,16 +9,38 @@ final class PhabricatorMacroListController $viewer = $request->getUser(); $macro_table = new PhabricatorFileImageMacro(); + $file_table = new PhabricatorFile(); + $conn = $macro_table->establishConnection('r'); + + $where = array(); + + $join = array(); + $join[] = qsprintf($conn, '%T m', $macro_table->getTableName()); $filter = $request->getStr('name'); if (strlen($filter)) { - $macros = $macro_table->loadAllWhere( - 'name LIKE %~', - $filter); + $where[] = qsprintf($conn, 'm.name LIKE %~', $filter); + } - $nodata = pht( - 'There are no macros matching the filter "%s".', - phutil_escape_html($filter)); + $authors = $request->getArr('authors'); + if ($authors) { + $join[] = qsprintf( + $conn, + '%T f ON m.filePHID = f.phid', + $file_table->getTableName()); + $where[] = qsprintf($conn, 'f.authorPHID IN (%Ls)', $authors); + } + + $has_search = $where; + + if ($has_search) { + $macros = queryfx_all( + $conn, + 'SELECT m.* + FROM '.implode(' JOIN ', $join).' + WHERE '.implode(' AND ', $where)); + $macros = $macro_table->loadAllFromArray($macros); + $nodata = pht('There are no macros matching the filter.'); } else { $pager = new AphrontPagerView(); $pager->setOffset($request->getInt('page')); @@ -31,7 +53,7 @@ final class PhabricatorMacroListController // Get an exact count since the size here is reasonably going to be a few // thousand at most in any reasonable case. $count = queryfx_one( - $macro_table->establishConnection('r'), + $conn, 'SELECT COUNT(*) N FROM %T', $macro_table->getTableName()); $count = $count['N']; @@ -42,19 +64,22 @@ final class PhabricatorMacroListController $nodata = pht('There are no image macros yet.'); } + $author_phids = array_combine($authors, $authors); + $file_phids = mpull($macros, 'getFilePHID'); $files = array(); if ($file_phids) { - $files = id(new PhabricatorFile())->loadAllWhere( + $files = $file_table->loadAllWhere( "phid IN (%Ls)", $file_phids); - $author_phids = mpull($files, 'getAuthorPHID', 'getPHID'); - - $this->loadHandles($author_phids); + $author_phids += mpull($files, 'getAuthorPHID', 'getAuthorPHID'); } $files_map = mpull($files, null, 'getPHID'); + $this->loadHandles($author_phids); + $author_handles = array_select_keys($this->getLoadedHandles(), $authors); + $filter_form = id(new AphrontFormView()) ->setMethod('GET') ->setUser($request->getUser()) @@ -63,6 +88,12 @@ final class PhabricatorMacroListController ->setName('name') ->setLabel('Name') ->setValue($filter)) + ->appendChild( + id(new AphrontFormTokenizerControl()) + ->setName('authors') + ->setLabel(pht('Authors')) + ->setDatasource('/typeahead/common/users/') + ->setValue(mpull($author_handles, 'getFullName'))) ->appendChild( id(new AphrontFormSubmitControl()) ->setValue('Filter Image Macros')); @@ -70,7 +101,6 @@ final class PhabricatorMacroListController $filter_view = new AphrontListFilterView(); $filter_view->appendChild($filter_form); - $has_search = strlen($filter); $nav = $this->buildSideNavView( $for_app = false, $has_search); @@ -107,7 +137,7 @@ final class PhabricatorMacroListController } $nav->appendChild($pinboard); - if (!strlen($filter)) { + if (!$has_search) { $nav->appendChild($pager); $name = pht('All Macros'); } else {