mirror of
https://we.phorge.it/source/phorge.git
synced 2024-11-10 08:52:39 +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:
parent
a7dcbe5980
commit
d5327fdba0
3 changed files with 135 additions and 321 deletions
|
@ -7,7 +7,6 @@ final class DifferentialRevisionListView extends AphrontView {
|
|||
|
||||
private $revisions;
|
||||
private $handles;
|
||||
private $highlightAge;
|
||||
private $header;
|
||||
private $noDataString;
|
||||
private $noBox;
|
||||
|
@ -39,11 +38,6 @@ final class DifferentialRevisionListView extends AphrontView {
|
|||
return $this;
|
||||
}
|
||||
|
||||
public function setHighlightAge($bool) {
|
||||
$this->highlightAge = $bool;
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function setNoBox($box) {
|
||||
$this->noBox = $box;
|
||||
return $this;
|
||||
|
|
|
@ -2,8 +2,6 @@
|
|||
|
||||
final class PhabricatorHomeMainController extends PhabricatorHomeController {
|
||||
|
||||
private $minipanels = array();
|
||||
|
||||
public function shouldAllowPublic() {
|
||||
return true;
|
||||
}
|
||||
|
@ -13,32 +11,27 @@ final class PhabricatorHomeMainController extends PhabricatorHomeController {
|
|||
}
|
||||
|
||||
public function handleRequest(AphrontRequest $request) {
|
||||
$user = $request->getUser();
|
||||
$viewer = $request->getViewer();
|
||||
|
||||
$dashboard = PhabricatorDashboardInstall::getDashboard(
|
||||
$user,
|
||||
$user->getPHID(),
|
||||
$viewer,
|
||||
$viewer->getPHID(),
|
||||
get_class($this->getCurrentApplication()));
|
||||
|
||||
if (!$dashboard) {
|
||||
$dashboard = PhabricatorDashboardInstall::getDashboard(
|
||||
$user,
|
||||
$viewer,
|
||||
PhabricatorHomeApplication::DASHBOARD_DEFAULT,
|
||||
get_class($this->getCurrentApplication()));
|
||||
}
|
||||
|
||||
if ($dashboard) {
|
||||
$content = id(new PhabricatorDashboardRenderingEngine())
|
||||
->setViewer($user)
|
||||
->setViewer($viewer)
|
||||
->setDashboard($dashboard)
|
||||
->renderDashboard();
|
||||
} else {
|
||||
$project_query = new PhabricatorProjectQuery();
|
||||
$project_query->setViewer($user);
|
||||
$project_query->withMemberPHIDs(array($user->getPHID()));
|
||||
$projects = $project_query->execute();
|
||||
|
||||
$content = $this->buildMainResponse($projects);
|
||||
$content = $this->buildMainResponse();
|
||||
}
|
||||
|
||||
if (!$request->getURIData('only')) {
|
||||
|
@ -46,7 +39,7 @@ final class PhabricatorHomeMainController extends PhabricatorHomeController {
|
|||
$nav->appendChild(
|
||||
array(
|
||||
$content,
|
||||
id(new PhabricatorGlobalUploadTargetView())->setUser($user),
|
||||
id(new PhabricatorGlobalUploadTargetView())->setUser($viewer),
|
||||
));
|
||||
$content = $nav;
|
||||
}
|
||||
|
@ -58,354 +51,180 @@ final class PhabricatorHomeMainController extends PhabricatorHomeController {
|
|||
|
||||
}
|
||||
|
||||
private function buildMainResponse(array $projects) {
|
||||
assert_instances_of($projects, 'PhabricatorProject');
|
||||
$viewer = $this->getRequest()->getUser();
|
||||
private function buildMainResponse() {
|
||||
require_celerity_resource('phabricator-dashboard-css');
|
||||
$viewer = $this->getViewer();
|
||||
|
||||
$has_maniphest = PhabricatorApplication::isClassInstalledForViewer(
|
||||
'PhabricatorManiphestApplication',
|
||||
$viewer);
|
||||
|
||||
$has_audit = PhabricatorApplication::isClassInstalledForViewer(
|
||||
'PhabricatorAuditApplication',
|
||||
$has_diffusion = PhabricatorApplication::isClassInstalledForViewer(
|
||||
'PhabricatorDiffusionApplication',
|
||||
$viewer);
|
||||
|
||||
$has_differential = PhabricatorApplication::isClassInstalledForViewer(
|
||||
'PhabricatorDifferentialApplication',
|
||||
$viewer);
|
||||
|
||||
if ($has_maniphest) {
|
||||
$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;
|
||||
}
|
||||
|
||||
$revision_panel = null;
|
||||
if ($has_differential) {
|
||||
$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',
|
||||
array(
|
||||
'class' => 'homepage-panel',
|
||||
),
|
||||
array(
|
||||
$welcome_panel,
|
||||
$unbreak_panel,
|
||||
$triage_panel,
|
||||
$revision_panel,
|
||||
$tasks_panel,
|
||||
$audit_panel,
|
||||
$commit_panel,
|
||||
$this->minipanels,
|
||||
$repository_panel,
|
||||
));
|
||||
return $home;
|
||||
$dashboard->addColumn($main_panel, 'thirds');
|
||||
|
||||
$side_panel = phutil_tag(
|
||||
'div',
|
||||
array(
|
||||
'class' => 'homepage-side-panel',
|
||||
),
|
||||
array(
|
||||
$feed_panel,
|
||||
));
|
||||
$dashboard->addColumn($side_panel, 'third');
|
||||
|
||||
$view = id(new PHUIBoxView())
|
||||
->addClass('dashboard-view')
|
||||
->appendChild($dashboard);
|
||||
|
||||
return $view;
|
||||
}
|
||||
|
||||
private function buildUnbreakNowPanel() {
|
||||
$unbreak_now = PhabricatorEnv::getEnvConfig(
|
||||
'maniphest.priorities.unbreak-now');
|
||||
if (!$unbreak_now) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$user = $this->getRequest()->getUser();
|
||||
|
||||
$task_query = id(new ManiphestTaskQuery())
|
||||
->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;
|
||||
}
|
||||
|
||||
private function renderSectionHeader($title, $href) {
|
||||
private function buildHomepagePanel($title, $href, $view) {
|
||||
$title = phutil_tag(
|
||||
'a',
|
||||
array(
|
||||
'href' => $href,
|
||||
),
|
||||
$title);
|
||||
|
||||
$icon = id(new PHUIIconView())
|
||||
->setIcon('fa-search')
|
||||
->setHref($href);
|
||||
|
||||
$header = id(new PHUIHeaderView())
|
||||
->setHeader($title)
|
||||
->addActionItem($icon);
|
||||
return $header;
|
||||
}
|
||||
|
||||
private function renderMiniPanel($title, $body) {
|
||||
$panel = new PHUIInfoView();
|
||||
$panel->setSeverity(PHUIInfoView::SEVERITY_NODATA);
|
||||
$panel->appendChild(
|
||||
phutil_tag(
|
||||
'p',
|
||||
array(
|
||||
),
|
||||
array(
|
||||
phutil_tag('strong', array(), $title.': '),
|
||||
$body,
|
||||
)));
|
||||
$this->minipanels[] = $panel;
|
||||
}
|
||||
$box = id(new PHUIObjectBoxView())
|
||||
->setHeader($header);
|
||||
|
||||
public function buildAuditPanel() {
|
||||
$request = $this->getRequest();
|
||||
$user = $request->getUser();
|
||||
|
||||
$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.'));
|
||||
if ($view->getObjectList()) {
|
||||
$box->setObjectList($view->getObjectList());
|
||||
}
|
||||
if ($view->getContent()) {
|
||||
$box->appendChild($view->getContent());
|
||||
}
|
||||
|
||||
$view = id(new PhabricatorAuditListView())
|
||||
->setCommits($commits)
|
||||
->setUser($user);
|
||||
|
||||
$phids = $view->getRequiredHandlePHIDs();
|
||||
$handles = $this->loadViewerHandles($phids);
|
||||
$view->setHandles($handles);
|
||||
|
||||
$title = pht('Audits');
|
||||
$href = '/audit/';
|
||||
$panel = new PHUIObjectBoxView();
|
||||
$panel->setHeader($this->renderSectionHeader($title, $href));
|
||||
$panel->setObjectList($view);
|
||||
|
||||
return $panel;
|
||||
return $box;
|
||||
}
|
||||
|
||||
public function buildCommitPanel() {
|
||||
$request = $this->getRequest();
|
||||
$user = $request->getUser();
|
||||
|
||||
$phids = array($user->getPHID());
|
||||
|
||||
$query = id(new DiffusionCommitQuery())
|
||||
->setViewer($user)
|
||||
->withAuthorPHIDs($phids)
|
||||
->withAuditStatus(DiffusionCommitQuery::AUDIT_STATUS_CONCERN)
|
||||
->needCommitData(true)
|
||||
->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.'));
|
||||
private function buildRevisionPanel() {
|
||||
$viewer = $this->getViewer();
|
||||
if (!$viewer->isLoggedIn()) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$view = id(new PhabricatorAuditListView())
|
||||
->setCommits($commits)
|
||||
->setUser($user);
|
||||
$engine = new DifferentialRevisionSearchEngine();
|
||||
$engine->setViewer($viewer);
|
||||
$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();
|
||||
$handles = $this->loadViewerHandles($phids);
|
||||
$view->setHandles($handles);
|
||||
$title = pht('Active Revisions');
|
||||
$href = '/differential/query/active/';
|
||||
|
||||
$title = pht('Problem Commits');
|
||||
$href = '/audit/';
|
||||
$panel = new PHUIObjectBoxView();
|
||||
$panel->setHeader($this->renderSectionHeader($title, $href));
|
||||
$panel->setObjectList($view);
|
||||
return $this->buildHomepagePanel($title, $href, $view);
|
||||
}
|
||||
|
||||
return $panel;
|
||||
private function buildTasksPanel() {
|
||||
$viewer = $this->getViewer();
|
||||
|
||||
$query = 'assigned';
|
||||
$title = pht('Assigned Tasks');
|
||||
$href = '/maniphest/query/assigned/';
|
||||
if (!$viewer->isLoggedIn()) {
|
||||
$query = 'open';
|
||||
$title = pht('Open Tasks');
|
||||
$href = '/maniphest/query/open/';
|
||||
}
|
||||
|
||||
$engine = new ManiphestTaskSearchEngine();
|
||||
$engine->setViewer($viewer);
|
||||
$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);
|
||||
|
||||
return $this->buildHomepagePanel($title, $href, $view);
|
||||
}
|
||||
|
||||
public function buildFeedPanel() {
|
||||
$viewer = $this->getViewer();
|
||||
|
||||
$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);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -41,7 +41,8 @@ final class ManiphestTaskResultListView extends ManiphestView {
|
|||
// If we didn't match anything, just pick up the default empty state.
|
||||
if (!$tasks) {
|
||||
return id(new PHUIObjectItemListView())
|
||||
->setUser($viewer);
|
||||
->setUser($viewer)
|
||||
->setNoDataString(pht('No tasks found.'));
|
||||
}
|
||||
|
||||
$group_parameter = nonempty($query->getParameter('group'), 'priority');
|
||||
|
|
Loading…
Reference in a new issue