diff --git a/src/applications/differential/view/DifferentialRevisionListView.php b/src/applications/differential/view/DifferentialRevisionListView.php --- a/src/applications/differential/view/DifferentialRevisionListView.php +++ b/src/applications/differential/view/DifferentialRevisionListView.php @@ -7,7 +7,6 @@ private $revisions; private $handles; - private $highlightAge; private $header; private $noDataString; private $noBox; @@ -39,11 +38,6 @@ return $this; } - public function setHighlightAge($bool) { - $this->highlightAge = $bool; - return $this; - } - public function setNoBox($box) { $this->noBox = $box; return $this; diff --git a/src/applications/home/controller/PhabricatorHomeMainController.php b/src/applications/home/controller/PhabricatorHomeMainController.php --- a/src/applications/home/controller/PhabricatorHomeMainController.php +++ b/src/applications/home/controller/PhabricatorHomeMainController.php @@ -2,8 +2,6 @@ final class PhabricatorHomeMainController extends PhabricatorHomeController { - private $minipanels = array(); - public function shouldAllowPublic() { return true; } @@ -13,32 +11,27 @@ } 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 @@ $nav->appendChild( array( $content, - id(new PhabricatorGlobalUploadTargetView())->setUser($user), + id(new PhabricatorGlobalUploadTargetView())->setUser($viewer), )); $content = $nav; } @@ -58,354 +51,180 @@ } - 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); + $revision_panel = null; + if ($has_differential) { + $revision_panel = $this->buildRevisionPanel(); + } + + $tasks_panel = null; 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; + $repository_panel = null; + if ($has_diffusion) { + $repository_panel = $this->buildRepositoryPanel(); } - if (PhabricatorEnv::getEnvConfig('welcome.html') !== null) { - $welcome_panel = $this->buildWelcomePanel(); - } else { - $welcome_panel = null; - } + $feed_panel = $this->buildFeedPanel(); - if ($has_differential) { - $revision_panel = $this->buildRevisionPanel(); - } else { - $revision_panel = null; - } + $dashboard = id(new AphrontMultiColumnView()) + ->setFluidlayout(true) + ->setGutter(AphrontMultiColumnView::GUTTER_LARGE); - $home = phutil_tag( + $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; - } - - 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); + $dashboard->addColumn($main_panel, 'thirds'); - $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); + $side_panel = phutil_tag( + 'div', + array( + 'class' => 'homepage-side-panel', + ), + array( + $feed_panel, + )); + $dashboard->addColumn($side_panel, 'third'); - $view = new ManiphestTaskListView(); - $view->setTasks($tasks); - $view->setUser($user); - $view->setHandles($handles); + $view = id(new PHUIBoxView()) + ->addClass('dashboard-view') + ->appendChild($dashboard); - return $view; + 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); + if ($view->getObjectList()) { + $box->setObjectList($view->getObjectList()); + } + if ($view->getContent()) { + $box->appendChild($view->getContent()); + } - $commits = $query->execute(); + return $box; + } - if (!$commits) { - return $this->renderMinipanel( - pht('No Audits'), - pht('No commits are waiting for you to audit them.')); + 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('Audits'); - $href = '/audit/'; - $panel = new PHUIObjectBoxView(); - $panel->setHeader($this->renderSectionHeader($title, $href)); - $panel->setObjectList($view); - - return $panel; + return $this->buildHomepagePanel($title, $href, $view); } - public function buildCommitPanel() { - $request = $this->getRequest(); - $user = $request->getUser(); + private function buildTasksPanel() { + $viewer = $this->getViewer(); - $phids = array($user->getPHID()); + $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); + } - $query = id(new DiffusionCommitQuery()) - ->setViewer($user) - ->withAuthorPHIDs($phids) - ->withAuditStatus(DiffusionCommitQuery::AUDIT_STATUS_CONCERN) - ->needCommitData(true) - ->needAuditRequests(true) - ->setLimit(10); + public function buildFeedPanel() { + $viewer = $this->getViewer(); - $commits = $query->execute(); + $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); - if (!$commits) { - return $this->renderMinipanel( - pht('No Problem Commits'), - pht('No one has raised concerns with your commits.')); - } + $title = pht('Recent Activity'); + $href = '/feed/'; - $view = id(new PhabricatorAuditListView()) - ->setCommits($commits) - ->setUser($user); + return $this->buildHomepagePanel($title, $href, $view); + } + + public function buildRepositoryPanel() { + $viewer = $this->getViewer(); - $phids = $view->getRequiredHandlePHIDs(); - $handles = $this->loadViewerHandles($phids); - $view->setHandles($handles); + $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('Problem Commits'); - $href = '/audit/'; - $panel = new PHUIObjectBoxView(); - $panel->setHeader($this->renderSectionHeader($title, $href)); - $panel->setObjectList($view); + $title = pht('Active Repositories'); + $href = '/diffusion/'; - return $panel; + return $this->buildHomepagePanel($title, $href, $view); } } diff --git a/src/applications/maniphest/view/ManiphestTaskResultListView.php b/src/applications/maniphest/view/ManiphestTaskResultListView.php --- a/src/applications/maniphest/view/ManiphestTaskResultListView.php +++ b/src/applications/maniphest/view/ManiphestTaskResultListView.php @@ -41,7 +41,8 @@ // 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');