Page MenuHomestyx hydra

No OneTemporary

diff --git a/src/applications/project/controller/list/PhabricatorProjectListController.php b/src/applications/project/controller/list/PhabricatorProjectListController.php
index 25eaf353c7..8ac5e6f6d6 100644
--- a/src/applications/project/controller/list/PhabricatorProjectListController.php
+++ b/src/applications/project/controller/list/PhabricatorProjectListController.php
@@ -1,134 +1,139 @@
<?php
/*
* Copyright 2011 Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
class PhabricatorProjectListController
extends PhabricatorProjectController {
public function processRequest() {
+ $side_nav = new AphrontSideNavView();
+
+
$projects = id(new PhabricatorProject())->loadAllWhere(
'1 = 1 ORDER BY id DESC limit 100');
$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();
$groups = array();
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);
$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,
),
phutil_escape_html($task_count)),
phutil_render_tag(
'a',
array(
'class' => 'small grey button',
'href' => '/project/view/'.$project->getID().'/',
),
'View Project Profile'),
);
}
$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->appendChild($table);
$panel->setHeader('Project');
$panel->setCreateButton('Create New Project', '/project/create/');
+ $side_nav->appendChild($panel);
+
return $this->buildStandardPageResponse(
- $panel,
+ $side_nav,
array(
'title' => 'Projects',
));
}
}
diff --git a/src/applications/project/query/project/PhabricatorProjectQuery.php b/src/applications/project/query/project/PhabricatorProjectQuery.php
new file mode 100644
index 0000000000..5d8ed775a8
--- /dev/null
+++ b/src/applications/project/query/project/PhabricatorProjectQuery.php
@@ -0,0 +1,84 @@
+<?php
+
+final class PhabricatorProjectQuery {
+
+ private $owners;
+ private $members;
+
+ private $limit;
+ private $offset;
+
+ public function setLimit($limit) {
+ $this->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',
+ $offset,
+ $limit);
+ } else if ($this->offset) {
+ $limit = qsprintf(
+ $conn_r,
+ 'LIMIT %d, %d',
+ $offset,
+ PHP_INT_MAX);
+ }
+
+ $data = queryfx_all(
+ $conn_r,
+ 'SELECT * FROM %T p %Q %Q',
+ $table->getTableName();
+ $joins,
+ $limit);
+ }
+
+ private function buildJoinsClause($conn_r) {
+ $affil_table = new PhabricatorProjectAffiliation();
+
+ $joins = array();
+ if ($this->owners) {
+ $joins[] = qsprintf(
+ '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(
+ 'JOIN %T member ON member.projectPHID = p.phid AND member.status != %s
+ AND member.userPHID in (%Ls)',
+ $affil_table->getTableName(),
+ 'former',
+ $this->members);
+ }
+
+ return implode(' ', $joins);
+ }
+
+}
\ No newline at end of file

File Metadata

Mime Type
text/x-diff
Expires
Fri, Nov 14, 1:12 PM (1 d, 21 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
337058
Default Alt Text
(6 KB)

Event Timeline