1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2025-02-02 09:58:24 +01:00

New 'default' homepage

Summary: Ref T11132. This is a new default default (no dashboard) homepage. It offers (Diffs) (Tasks) (Repositories) in the main column and (Feed) in the side column. No NUX stuff, No logged out public view (upcoming diff). This should be complete, but unclear how to bucketize Differential.

Test Plan: Test new account's default homepage.

Reviewers: epriestley

Reviewed By: epriestley

Subscribers: Korvin

Maniphest Tasks: T11132

Differential Revision: https://secure.phabricator.com/D16449
This commit is contained in:
Chad Little 2016-08-25 11:16:34 -07:00
parent a7dcbe5980
commit d5327fdba0
3 changed files with 135 additions and 321 deletions

View file

@ -7,7 +7,6 @@ final class DifferentialRevisionListView extends AphrontView {
private $revisions; private $revisions;
private $handles; private $handles;
private $highlightAge;
private $header; private $header;
private $noDataString; private $noDataString;
private $noBox; private $noBox;
@ -39,11 +38,6 @@ final class DifferentialRevisionListView extends AphrontView {
return $this; return $this;
} }
public function setHighlightAge($bool) {
$this->highlightAge = $bool;
return $this;
}
public function setNoBox($box) { public function setNoBox($box) {
$this->noBox = $box; $this->noBox = $box;
return $this; return $this;

View file

@ -2,8 +2,6 @@
final class PhabricatorHomeMainController extends PhabricatorHomeController { final class PhabricatorHomeMainController extends PhabricatorHomeController {
private $minipanels = array();
public function shouldAllowPublic() { public function shouldAllowPublic() {
return true; return true;
} }
@ -13,32 +11,27 @@ final class PhabricatorHomeMainController extends PhabricatorHomeController {
} }
public function handleRequest(AphrontRequest $request) { public function handleRequest(AphrontRequest $request) {
$user = $request->getUser(); $viewer = $request->getViewer();
$dashboard = PhabricatorDashboardInstall::getDashboard( $dashboard = PhabricatorDashboardInstall::getDashboard(
$user, $viewer,
$user->getPHID(), $viewer->getPHID(),
get_class($this->getCurrentApplication())); get_class($this->getCurrentApplication()));
if (!$dashboard) { if (!$dashboard) {
$dashboard = PhabricatorDashboardInstall::getDashboard( $dashboard = PhabricatorDashboardInstall::getDashboard(
$user, $viewer,
PhabricatorHomeApplication::DASHBOARD_DEFAULT, PhabricatorHomeApplication::DASHBOARD_DEFAULT,
get_class($this->getCurrentApplication())); get_class($this->getCurrentApplication()));
} }
if ($dashboard) { if ($dashboard) {
$content = id(new PhabricatorDashboardRenderingEngine()) $content = id(new PhabricatorDashboardRenderingEngine())
->setViewer($user) ->setViewer($viewer)
->setDashboard($dashboard) ->setDashboard($dashboard)
->renderDashboard(); ->renderDashboard();
} else { } else {
$project_query = new PhabricatorProjectQuery(); $content = $this->buildMainResponse();
$project_query->setViewer($user);
$project_query->withMemberPHIDs(array($user->getPHID()));
$projects = $project_query->execute();
$content = $this->buildMainResponse($projects);
} }
if (!$request->getURIData('only')) { if (!$request->getURIData('only')) {
@ -46,7 +39,7 @@ final class PhabricatorHomeMainController extends PhabricatorHomeController {
$nav->appendChild( $nav->appendChild(
array( array(
$content, $content,
id(new PhabricatorGlobalUploadTargetView())->setUser($user), id(new PhabricatorGlobalUploadTargetView())->setUser($viewer),
)); ));
$content = $nav; $content = $nav;
} }
@ -58,354 +51,180 @@ final class PhabricatorHomeMainController extends PhabricatorHomeController {
} }
private function buildMainResponse(array $projects) { private function buildMainResponse() {
assert_instances_of($projects, 'PhabricatorProject'); require_celerity_resource('phabricator-dashboard-css');
$viewer = $this->getRequest()->getUser(); $viewer = $this->getViewer();
$has_maniphest = PhabricatorApplication::isClassInstalledForViewer( $has_maniphest = PhabricatorApplication::isClassInstalledForViewer(
'PhabricatorManiphestApplication', 'PhabricatorManiphestApplication',
$viewer); $viewer);
$has_audit = PhabricatorApplication::isClassInstalledForViewer( $has_diffusion = PhabricatorApplication::isClassInstalledForViewer(
'PhabricatorAuditApplication', 'PhabricatorDiffusionApplication',
$viewer); $viewer);
$has_differential = PhabricatorApplication::isClassInstalledForViewer( $has_differential = PhabricatorApplication::isClassInstalledForViewer(
'PhabricatorDifferentialApplication', 'PhabricatorDifferentialApplication',
$viewer); $viewer);
if ($has_maniphest) { $revision_panel = null;
$unbreak_panel = $this->buildUnbreakNowPanel();
$triage_panel = $this->buildNeedsTriagePanel($projects);
$tasks_panel = $this->buildTasksPanel();
} else {
$unbreak_panel = null;
$triage_panel = null;
$tasks_panel = null;
}
if ($has_audit) {
$audit_panel = $this->buildAuditPanel();
$commit_panel = $this->buildCommitPanel();
} else {
$audit_panel = null;
$commit_panel = null;
}
if (PhabricatorEnv::getEnvConfig('welcome.html') !== null) {
$welcome_panel = $this->buildWelcomePanel();
} else {
$welcome_panel = null;
}
if ($has_differential) { if ($has_differential) {
$revision_panel = $this->buildRevisionPanel(); $revision_panel = $this->buildRevisionPanel();
} else {
$revision_panel = null;
} }
$home = phutil_tag( $tasks_panel = null;
if ($has_maniphest) {
$tasks_panel = $this->buildTasksPanel();
}
$repository_panel = null;
if ($has_diffusion) {
$repository_panel = $this->buildRepositoryPanel();
}
$feed_panel = $this->buildFeedPanel();
$dashboard = id(new AphrontMultiColumnView())
->setFluidlayout(true)
->setGutter(AphrontMultiColumnView::GUTTER_LARGE);
$main_panel = phutil_tag(
'div', 'div',
array( array(
'class' => 'homepage-panel', 'class' => 'homepage-panel',
), ),
array( array(
$welcome_panel,
$unbreak_panel,
$triage_panel,
$revision_panel, $revision_panel,
$tasks_panel, $tasks_panel,
$audit_panel, $repository_panel,
$commit_panel,
$this->minipanels,
)); ));
return $home; $dashboard->addColumn($main_panel, 'thirds');
}
private function buildUnbreakNowPanel() { $side_panel = phutil_tag(
$unbreak_now = PhabricatorEnv::getEnvConfig( 'div',
'maniphest.priorities.unbreak-now'); array(
if (!$unbreak_now) { 'class' => 'homepage-side-panel',
return null; ),
} array(
$feed_panel,
));
$dashboard->addColumn($side_panel, 'third');
$user = $this->getRequest()->getUser(); $view = id(new PHUIBoxView())
->addClass('dashboard-view')
$task_query = id(new ManiphestTaskQuery()) ->appendChild($dashboard);
->setViewer($user)
->withStatuses(ManiphestTaskStatus::getOpenStatusConstants())
->withPriorities(array($unbreak_now))
->needProjectPHIDs(true)
->setLimit(10);
$tasks = $task_query->execute();
if (!$tasks) {
return $this->renderMiniPanel(
pht('No "Unbreak Now!" Tasks'),
pht('Nothing appears to be critically broken right now.'));
}
$href = urisprintf(
'/maniphest/?statuses=open()&priorities=%s#R',
$unbreak_now);
$title = pht('Unbreak Now!');
$panel = new PHUIObjectBoxView();
$panel->setHeader($this->renderSectionHeader($title, $href));
$panel->setObjectList($this->buildTaskListView($tasks));
return $panel;
}
private function buildNeedsTriagePanel(array $projects) {
assert_instances_of($projects, 'PhabricatorProject');
$needs_triage = PhabricatorEnv::getEnvConfig(
'maniphest.priorities.needs-triage');
if (!$needs_triage) {
return null;
}
$user = $this->getRequest()->getUser();
if (!$user->isLoggedIn()) {
return null;
}
if ($projects) {
$task_query = id(new ManiphestTaskQuery())
->setViewer($user)
->withStatuses(ManiphestTaskStatus::getOpenStatusConstants())
->withPriorities(array($needs_triage))
->withEdgeLogicPHIDs(
PhabricatorProjectObjectHasProjectEdgeType::EDGECONST,
PhabricatorQueryConstraint::OPERATOR_OR,
mpull($projects, 'getPHID'))
->needProjectPHIDs(true)
->setLimit(10);
$tasks = $task_query->execute();
} else {
$tasks = array();
}
if (!$tasks) {
return $this->renderMiniPanel(
pht('No "Needs Triage" Tasks'),
pht('No tasks tagged with projects you are a member of need triage.'));
}
$title = pht('Needs Triage');
$href = urisprintf(
'/maniphest/?statuses=open()&priorities=%s&projects=projects(%s)#R',
$needs_triage,
$user->getPHID());
$panel = new PHUIObjectBoxView();
$panel->setHeader($this->renderSectionHeader($title, $href));
$panel->setObjectList($this->buildTaskListView($tasks));
return $panel;
}
private function buildRevisionPanel() {
$viewer = $this->getViewer();
$revisions = PhabricatorDifferentialApplication::loadNeedAttentionRevisions(
$viewer);
if (!$revisions) {
return $this->renderMiniPanel(
pht('No Waiting Revisions'),
pht('No revisions are waiting on you.'));
}
$title = pht('Revisions Waiting on You');
$href = '/differential/';
$panel = new PHUIObjectBoxView();
$panel->setHeader($this->renderSectionHeader($title, $href));
$revision_view = id(new DifferentialRevisionListView())
->setHighlightAge(true)
->setRevisions($revisions)
->setUser($viewer);
$phids = array_merge(
array($viewer->getPHID()),
$revision_view->getRequiredHandlePHIDs());
$handles = $this->loadViewerHandles($phids);
$revision_view->setHandles($handles);
$list_view = $revision_view->render();
$panel->setObjectList($list_view);
return $panel;
}
private function buildWelcomePanel() {
$panel = new PHUIObjectBoxView();
$panel->setHeaderText(pht('Welcome'));
$panel->appendChild(
phutil_safe_html(
PhabricatorEnv::getEnvConfig('welcome.html')));
return $panel;
}
private function buildTasksPanel() {
$user = $this->getRequest()->getUser();
$user_phid = $user->getPHID();
$task_query = id(new ManiphestTaskQuery())
->setViewer($user)
->withStatuses(ManiphestTaskStatus::getOpenStatusConstants())
->setGroupBy(ManiphestTaskQuery::GROUP_PRIORITY)
->withOwners(array($user_phid))
->needProjectPHIDs(true)
->setLimit(10);
$tasks = $task_query->execute();
if (!$tasks) {
return $this->renderMiniPanel(
pht('No Assigned Tasks'),
pht('You have no assigned tasks.'));
}
$title = pht('Assigned Tasks');
$href = '/maniphest/query/assigned/';
$panel = new PHUIObjectBoxView();
$panel->setHeader($this->renderSectionHeader($title, $href));
$panel->setObjectList($this->buildTaskListView($tasks));
return $panel;
}
private function buildTaskListView(array $tasks) {
assert_instances_of($tasks, 'ManiphestTask');
$user = $this->getRequest()->getUser();
$phids = array_merge(
array_filter(mpull($tasks, 'getOwnerPHID')),
array_mergev(mpull($tasks, 'getProjectPHIDs')));
$handles = $this->loadViewerHandles($phids);
$view = new ManiphestTaskListView();
$view->setTasks($tasks);
$view->setUser($user);
$view->setHandles($handles);
return $view; return $view;
} }
private function renderSectionHeader($title, $href) { private function buildHomepagePanel($title, $href, $view) {
$title = phutil_tag( $title = phutil_tag(
'a', 'a',
array( array(
'href' => $href, 'href' => $href,
), ),
$title); $title);
$icon = id(new PHUIIconView()) $icon = id(new PHUIIconView())
->setIcon('fa-search') ->setIcon('fa-search')
->setHref($href); ->setHref($href);
$header = id(new PHUIHeaderView()) $header = id(new PHUIHeaderView())
->setHeader($title) ->setHeader($title)
->addActionItem($icon); ->addActionItem($icon);
return $header;
$box = id(new PHUIObjectBoxView())
->setHeader($header);
if ($view->getObjectList()) {
$box->setObjectList($view->getObjectList());
}
if ($view->getContent()) {
$box->appendChild($view->getContent());
} }
private function renderMiniPanel($title, $body) { return $box;
$panel = new PHUIInfoView();
$panel->setSeverity(PHUIInfoView::SEVERITY_NODATA);
$panel->appendChild(
phutil_tag(
'p',
array(
),
array(
phutil_tag('strong', array(), $title.': '),
$body,
)));
$this->minipanels[] = $panel;
} }
public function buildAuditPanel() { private function buildRevisionPanel() {
$request = $this->getRequest(); $viewer = $this->getViewer();
$user = $request->getUser(); if (!$viewer->isLoggedIn()) {
return null;
$phids = PhabricatorAuditCommentEditor::loadAuditPHIDsForUser($user);
$query = id(new DiffusionCommitQuery())
->setViewer($user)
->withNeedsAuditByPHIDs($phids)
->withAuditStatus(DiffusionCommitQuery::AUDIT_STATUS_OPEN)
->needAuditRequests(true)
->needCommitData(true)
->setLimit(10);
$commits = $query->execute();
if (!$commits) {
return $this->renderMinipanel(
pht('No Audits'),
pht('No commits are waiting for you to audit them.'));
} }
$view = id(new PhabricatorAuditListView()) $engine = new DifferentialRevisionSearchEngine();
->setCommits($commits) $engine->setViewer($viewer);
->setUser($user); $saved = $engine->buildSavedQueryFromBuiltin('active');
$query = $engine->buildQueryFromSavedQuery($saved);
$pager = $engine->newPagerForSavedQuery($saved);
$pager->setPageSize(15);
$results = $engine->executeQuery($query, $pager);
$view = $engine->renderResults($results, $saved);
$phids = $view->getRequiredHandlePHIDs(); $title = pht('Active Revisions');
$handles = $this->loadViewerHandles($phids); $href = '/differential/query/active/';
$view->setHandles($handles);
$title = pht('Audits'); return $this->buildHomepagePanel($title, $href, $view);
$href = '/audit/';
$panel = new PHUIObjectBoxView();
$panel->setHeader($this->renderSectionHeader($title, $href));
$panel->setObjectList($view);
return $panel;
} }
public function buildCommitPanel() { private function buildTasksPanel() {
$request = $this->getRequest(); $viewer = $this->getViewer();
$user = $request->getUser();
$phids = array($user->getPHID()); $query = 'assigned';
$title = pht('Assigned Tasks');
$query = id(new DiffusionCommitQuery()) $href = '/maniphest/query/assigned/';
->setViewer($user) if (!$viewer->isLoggedIn()) {
->withAuthorPHIDs($phids) $query = 'open';
->withAuditStatus(DiffusionCommitQuery::AUDIT_STATUS_CONCERN) $title = pht('Open Tasks');
->needCommitData(true) $href = '/maniphest/query/open/';
->needAuditRequests(true)
->setLimit(10);
$commits = $query->execute();
if (!$commits) {
return $this->renderMinipanel(
pht('No Problem Commits'),
pht('No one has raised concerns with your commits.'));
} }
$view = id(new PhabricatorAuditListView()) $engine = new ManiphestTaskSearchEngine();
->setCommits($commits) $engine->setViewer($viewer);
->setUser($user); $saved = $engine->buildSavedQueryFromBuiltin($query);
$query = $engine->buildQueryFromSavedQuery($saved);
$pager = $engine->newPagerForSavedQuery($saved);
$pager->setPageSize(15);
$results = $engine->executeQuery($query, $pager);
$view = $engine->renderResults($results, $saved);
$phids = $view->getRequiredHandlePHIDs(); return $this->buildHomepagePanel($title, $href, $view);
$handles = $this->loadViewerHandles($phids); }
$view->setHandles($handles);
$title = pht('Problem Commits'); public function buildFeedPanel() {
$href = '/audit/'; $viewer = $this->getViewer();
$panel = new PHUIObjectBoxView();
$panel->setHeader($this->renderSectionHeader($title, $href));
$panel->setObjectList($view);
return $panel; $engine = new PhabricatorFeedSearchEngine();
$engine->setViewer($viewer);
$saved = $engine->buildSavedQueryFromBuiltin('all');
$query = $engine->buildQueryFromSavedQuery($saved);
$pager = $engine->newPagerForSavedQuery($saved);
$pager->setPageSize(40);
$results = $engine->executeQuery($query, $pager);
$view = $engine->renderResults($results, $saved);
$title = pht('Recent Activity');
$href = '/feed/';
return $this->buildHomepagePanel($title, $href, $view);
}
public function buildRepositoryPanel() {
$viewer = $this->getViewer();
$engine = new PhabricatorRepositorySearchEngine();
$engine->setViewer($viewer);
$saved = $engine->buildSavedQueryFromBuiltin('active');
$query = $engine->buildQueryFromSavedQuery($saved);
$pager = $engine->newPagerForSavedQuery($saved);
$pager->setPageSize(5);
$results = $engine->executeQuery($query, $pager);
$view = $engine->renderResults($results, $saved);
$title = pht('Active Repositories');
$href = '/diffusion/';
return $this->buildHomepagePanel($title, $href, $view);
} }
} }

View file

@ -41,7 +41,8 @@ final class ManiphestTaskResultListView extends ManiphestView {
// If we didn't match anything, just pick up the default empty state. // If we didn't match anything, just pick up the default empty state.
if (!$tasks) { if (!$tasks) {
return id(new PHUIObjectItemListView()) return id(new PHUIObjectItemListView())
->setUser($viewer); ->setUser($viewer)
->setNoDataString(pht('No tasks found.'));
} }
$group_parameter = nonempty($query->getParameter('group'), 'priority'); $group_parameter = nonempty($query->getParameter('group'), 'priority');