diff --git a/src/applications/project/controller/list/PhabricatorProjectListController.php b/src/applications/project/controller/list/PhabricatorProjectListController.php index ecb829dc1c..d8ac9ed702 100644 --- a/src/applications/project/controller/list/PhabricatorProjectListController.php +++ b/src/applications/project/controller/list/PhabricatorProjectListController.php @@ -1,181 +1,168 @@ filter = idx($data, 'filter'); } public function processRequest() { $request = $this->getRequest(); $nav = new AphrontSideNavFilterView(); $nav ->setBaseURI(new PhutilURI('/project/filter/')) ->addLabel('User') ->addFilter('active', 'Active') ->addFilter('owned', 'Owned') ->addSpacer() ->addLabel('All') ->addFilter('all', 'All Projects'); $this->filter = $nav->selectFilter($this->filter, 'active'); $pager = new AphrontPagerView(); $pager->setPageSize(250); $pager->setURI($request->getRequestURI(), 'page'); $pager->setOffset($request->getInt('page')); $query = new PhabricatorProjectQuery(); $query->setOffset($pager->getOffset()); $query->setLimit($pager->getPageSize() + 1); $view_phid = $request->getUser()->getPHID(); switch ($this->filter) { case 'active': $table_header = 'Active Projects'; $query->setMembers(array($view_phid)); break; case 'owned': $table_header = 'Owned Projects'; $query->setOwners(array($view_phid)); break; case 'all': $table_header = 'All Projects'; break; } $projects = $query->execute(); $projects = $pager->sliceResults($projects); $project_phids = mpull($projects, 'getPHID'); $profiles = array(); if ($projects) { $profiles = id(new PhabricatorProjectProfile())->loadAllWhere( 'projectPHID in (%Ls)', $project_phids); $profiles = mpull($profiles, null, 'getProjectPHID'); } $affil_groups = array(); if ($projects) { $affil_groups = PhabricatorProjectAffiliation::loadAllForProjectPHIDs( $project_phids); } - $author_phids = mpull($projects, 'getAuthorPHID'); - $handles = id(new PhabricatorObjectHandleData($author_phids)) - ->loadHandles(); - - $query = id(new ManiphestTaskQuery()) - ->withProjects($project_phids) - ->withAnyProject(true) - ->withStatus(ManiphestTaskQuery::STATUS_OPEN) - ->setLimit(PHP_INT_MAX); - - $tasks = $query->execute(); + $tasks = array(); $groups = array(); - foreach ($tasks as $task) { - foreach ($task->getProjectPHIDs() as $phid) { - $groups[$phid][] = $task; + if ($project_phids) { + $query = id(new ManiphestTaskQuery()) + ->withProjects($project_phids) + ->withAnyProject(true) + ->withStatus(ManiphestTaskQuery::STATUS_OPEN) + ->setLimit(PHP_INT_MAX); + + $tasks = $query->execute(); + foreach ($tasks as $task) { + foreach ($task->getProjectPHIDs() as $phid) { + $groups[$phid][] = $task; + } } } $rows = array(); foreach ($projects as $project) { $phid = $project->getPHID(); $profile = $profiles[$phid]; $affiliations = $affil_groups[$phid]; $group = idx($groups, $phid, array()); $task_count = count($group); $population = count($affiliations); - $status = PhabricatorProjectStatus::getNameForStatus( - $project->getStatus()); - $blurb = $profile->getBlurb(); - $blurb = phutil_utf8_shorten($blurb, $columns = 100); + $blurb = phutil_utf8_shorten($blurb, 64); + $rows[] = array( - phutil_escape_html($project->getName()), - phutil_escape_html($blurb), - $handles[$project->getAuthorPHID()]->renderLink(), - phutil_escape_html($population), - phutil_escape_html($status), phutil_render_tag( 'a', array( - 'href' => '/maniphest/view/all/?projects='.$phid, + 'href' => '/project/view/'.$project->getID().'/', ), - phutil_escape_html($task_count)), + phutil_escape_html($project->getName())), + phutil_escape_html($blurb), + phutil_escape_html($population), phutil_render_tag( 'a', array( - 'class' => 'small grey button', - 'href' => '/project/view/'.$project->getID().'/', + 'href' => '/maniphest/view/all/?projects='.$phid, ), - 'View Project Profile'), + phutil_escape_html($task_count)), ); } $table = new AphrontTableView($rows); $table->setHeaders( array( 'Project', 'Description', - 'Mastermind', 'Population', - 'Status', 'Open Tasks', - '', )); $table->setColumnClasses( array( 'pri', 'wide', '', - 'right', - '', - 'right', - 'action', + '' )); $panel = new AphrontPanelView(); $panel->setHeader($table_header); $panel->setCreateButton('Create New Project', '/project/create/'); $panel->appendChild($table); $panel->appendChild($pager); $nav->appendChild($panel); return $this->buildStandardPageResponse( $nav, array( 'title' => 'Projects', )); } } diff --git a/src/applications/project/controller/list/__init__.php b/src/applications/project/controller/list/__init__.php index 27aedf24f7..d5ad8656c5 100644 --- a/src/applications/project/controller/list/__init__.php +++ b/src/applications/project/controller/list/__init__.php @@ -1,26 +1,24 @@ limit = $limit; return $this; } public function setOffset($offset) { $this->offset = $offset; return $this; } public function setOwners(array $owners) { $this->owners = $owners; return $this; } public function setMembers(array $members) { $this->members = $members; return $this; } public function execute() { $table = id(new PhabricatorProject()); $conn_r = $table->establishConnection('r'); $joins = $this->buildJoinsClause($conn_r); $limit = null; if ($this->limit) { $limit = qsprintf( $conn_r, 'LIMIT %d, %d', $this->offset, $this->limit); } else if ($this->offset) { $limit = qsprintf( $conn_r, 'LIMIT %d, %d', $this->offset, PHP_INT_MAX); } + $order = 'ORDER BY name'; + $data = queryfx_all( $conn_r, - 'SELECT p.* FROM %T p %Q %Q', + 'SELECT p.* FROM %T p %Q %Q %Q', $table->getTableName(), $joins, + $order, $limit); return $table->loadAllFromArray($data); } private function buildJoinsClause($conn_r) { $affil_table = new PhabricatorProjectAffiliation(); $joins = array(); if ($this->owners) { $joins[] = qsprintf( $conn_r, 'JOIN %T owner ON owner.projectPHID = p.phid AND owner.isOwner = 1 AND owner.userPHID in (%Ls)', $affil_table->getTableName(), $this->owners); } if ($this->members) { $joins[] = qsprintf( $conn_r, 'JOIN %T member ON member.projectPHID = p.phid AND member.userPHID in (%Ls)', $affil_table->getTableName(), $this->members); } return implode(' ', $joins); } }