diff --git a/resources/celerity/map.php b/resources/celerity/map.php --- a/resources/celerity/map.php +++ b/resources/celerity/map.php @@ -9,7 +9,7 @@ 'names' => array( 'conpherence.pkg.css' => 'a520d619', 'conpherence.pkg.js' => '6249a1cf', - 'core.pkg.css' => '72ab63ef', + 'core.pkg.css' => 'f9a2cca6', 'core.pkg.js' => '1fa7c0c5', 'darkconsole.pkg.js' => 'e7393ebb', 'differential.pkg.css' => '4815647b', @@ -55,7 +55,7 @@ 'rsrc/css/application/contentsource/content-source-view.css' => '4b8b05d4', 'rsrc/css/application/countdown/timer.css' => '16c52f5c', 'rsrc/css/application/daemon/bulk-job.css' => 'df9c1d4a', - 'rsrc/css/application/dashboard/dashboard.css' => '226c4dc6', + 'rsrc/css/application/dashboard/dashboard.css' => '38368844', 'rsrc/css/application/diff/inline-comment-summary.css' => '51efda3a', 'rsrc/css/application/differential/add-comment.css' => 'c47f8c40', 'rsrc/css/application/differential/changeset-view.css' => '6a9bdf9c', @@ -786,7 +786,7 @@ 'phabricator-content-source-view-css' => '4b8b05d4', 'phabricator-core-css' => '9f4cb463', 'phabricator-countdown-css' => '16c52f5c', - 'phabricator-dashboard-css' => '226c4dc6', + 'phabricator-dashboard-css' => '38368844', 'phabricator-drag-and-drop-file-upload' => '58dea2fa', 'phabricator-draggable-list' => 'bea6e7f4', 'phabricator-fatal-config-template-css' => '8f18fa41', diff --git a/src/applications/dashboard/controller/PhabricatorDashboardManageController.php b/src/applications/dashboard/controller/PhabricatorDashboardManageController.php --- a/src/applications/dashboard/controller/PhabricatorDashboardManageController.php +++ b/src/applications/dashboard/controller/PhabricatorDashboardManageController.php @@ -43,6 +43,7 @@ $timeline = $this->buildTransactionTimeline( $dashboard, new PhabricatorDashboardTransactionQuery()); + $timeline->setShouldTerminate(true); $info_view = null; if (!$can_edit) { @@ -55,16 +56,6 @@ ->setErrors(array($no_edit)); } - $rendered_dashboard = id(new PhabricatorDashboardRenderingEngine()) - ->setViewer($viewer) - ->setDashboard($dashboard) - ->setArrangeMode($can_edit) - ->renderDashboard(); - - $dashboard_box = id(new PHUIBoxView()) - ->addClass('dashboard-preview-box') - ->appendChild($rendered_dashboard); - $view = id(new PHUITwoColumnView()) ->setHeader($header) ->setCurtain($curtain) @@ -72,8 +63,7 @@ $info_view, $properties, $timeline, - )) - ->setFooter($dashboard_box); + )); return $this->newPage() ->setTitle($title) diff --git a/src/applications/dashboard/controller/PhabricatorDashboardViewController.php b/src/applications/dashboard/controller/PhabricatorDashboardViewController.php --- a/src/applications/dashboard/controller/PhabricatorDashboardViewController.php +++ b/src/applications/dashboard/controller/PhabricatorDashboardViewController.php @@ -3,71 +3,102 @@ final class PhabricatorDashboardViewController extends PhabricatorDashboardController { - private $id; - - public function shouldAllowPublic() { - return true; - } - public function handleRequest(AphrontRequest $request) { $viewer = $request->getViewer(); - $this->id = $request->getURIData('id'); + $id = $request->getURIData('id'); + + $dashboard_uri = $this->getApplicationURI('view/'.$id.'/'); + + // TODO: This UI should drop a lot of capabilities if the user can't + // edit the dashboard, but we should still let them in for "Install" and + // "View History". $dashboard = id(new PhabricatorDashboardQuery()) ->setViewer($viewer) - ->withIDs(array($this->id)) + ->withIDs(array($id)) ->needPanels(true) ->executeOne(); if (!$dashboard) { return new Aphront404Response(); } + $can_edit = PhabricatorPolicyFilter::hasCapability( + $viewer, + $dashboard, + PhabricatorPolicyCapability::CAN_EDIT); + $title = $dashboard->getName(); + $crumbs = $this->buildApplicationCrumbs(); + $crumbs->addTextCrumb( + pht('Dashboard %d', $dashboard->getID()), + $dashboard_uri); + $crumbs->addTextCrumb(pht('View')); $crumbs->setBorder(true); - $crumbs->addTextCrumb(pht('Dashboard %d', $dashboard->getID())); - if ($dashboard->getPanelPHIDs()) { - $rendered_dashboard = id(new PhabricatorDashboardRenderingEngine()) - ->setViewer($viewer) - ->setDashboard($dashboard) - ->renderDashboard(); - } else { - $rendered_dashboard = $this->buildEmptyView(); + $header = $this->buildHeaderView($dashboard); + + $info_view = null; + if (!$can_edit) { + $no_edit = pht( + 'You do not have permission to edit this dashboard. If you want to '. + 'make changes, make a copy first.'); + + $info_view = id(new PHUIInfoView()) + ->setSeverity(PHUIInfoView::SEVERITY_NOTICE) + ->setErrors(array($no_edit)); } + $rendered_dashboard = id(new PhabricatorDashboardRenderingEngine()) + ->setViewer($viewer) + ->setDashboard($dashboard) + ->setArrangeMode($can_edit) + ->renderDashboard(); + + $dashboard_box = id(new PHUIBoxView()) + ->addClass('dashboard-preview-box') + ->appendChild($rendered_dashboard); + + $view = id(new PHUITwoColumnView()) + ->setHeader($header) + ->setFooter($dashboard_box); + return $this->newPage() ->setTitle($title) ->setCrumbs($crumbs) - ->appendChild($rendered_dashboard); + ->appendChild($view); + } - protected function buildApplicationCrumbs() { - $crumbs = parent::buildApplicationCrumbs(); - $id = $this->id; + private function buildHeaderView(PhabricatorDashboard $dashboard) { + $viewer = $this->getViewer(); + $id = $dashboard->getID(); - $crumbs->addAction( - id(new PHUIListItemView()) - ->setIcon('fa-th') - ->setName(pht('Manage Dashboard')) - ->setHref($this->getApplicationURI("manage/{$id}/"))); + if ($dashboard->isArchived()) { + $status_icon = 'fa-ban'; + $status_color = 'dark'; + } else { + $status_icon = 'fa-check'; + $status_color = 'bluegrey'; + } - return $crumbs; - } + $status_name = idx( + PhabricatorDashboard::getStatusNameMap(), + $dashboard->getStatus()); + + $button = id(new PHUIButtonView()) + ->setTag('a') + ->setText(pht('Manage Dashboard')) + ->setIcon('fa-gears') + ->setHref($this->getApplicationURI("manage/{$id}/")); - public function buildEmptyView() { - $id = $this->id; - $manage_uri = $this->getApplicationURI("manage/{$id}/"); - - return id(new PHUIInfoView()) - ->setSeverity(PHUIInfoView::SEVERITY_NODATA) - ->appendChild( - pht('This dashboard has no panels '. - 'yet. Use %s to add panels.', - phutil_tag( - 'a', - array('href' => $manage_uri), - pht('Manage Dashboard')))); + return id(new PHUIHeaderView()) + ->setUser($viewer) + ->setHeader($dashboard->getName()) + ->setPolicyObject($dashboard) + ->setStatus($status_icon, $status_color, $status_name) + ->setHeaderIcon($dashboard->getIcon()) + ->addActionLink($button); } } diff --git a/src/applications/dashboard/engine/PhabricatorDashboardRenderingEngine.php b/src/applications/dashboard/engine/PhabricatorDashboardRenderingEngine.php --- a/src/applications/dashboard/engine/PhabricatorDashboardRenderingEngine.php +++ b/src/applications/dashboard/engine/PhabricatorDashboardRenderingEngine.php @@ -123,7 +123,6 @@ ->setTag('a') ->setHref($create_uri) ->setWorkflow(true) - ->setColor(PHUIButtonView::GREY) ->setText(pht('Create Panel')) ->addClass(PHUI::MARGIN_MEDIUM); @@ -131,7 +130,6 @@ ->setTag('a') ->setHref($add_uri) ->setWorkflow(true) - ->setColor(PHUIButtonView::GREY) ->setText(pht('Add Existing Panel')) ->addClass(PHUI::MARGIN_MEDIUM); diff --git a/src/applications/dashboard/query/PhabricatorDashboardSearchEngine.php b/src/applications/dashboard/query/PhabricatorDashboardSearchEngine.php --- a/src/applications/dashboard/query/PhabricatorDashboardSearchEngine.php +++ b/src/applications/dashboard/query/PhabricatorDashboardSearchEngine.php @@ -182,7 +182,7 @@ $item->addAction( id(new PHUIListItemView()) ->setName(pht('Manage')) - ->setIcon('fa-th') + ->setIcon('fa-gears') ->setHref($href_view)); $href_edit = $this->getApplicationURI("edit/{$id}/"); diff --git a/webroot/rsrc/css/application/dashboard/dashboard.css b/webroot/rsrc/css/application/dashboard/dashboard.css --- a/webroot/rsrc/css/application/dashboard/dashboard.css +++ b/webroot/rsrc/css/application/dashboard/dashboard.css @@ -35,63 +35,63 @@ } .device-desktop .aphront-multi-column-fluid .aphront-multi-column-2-up -.aphront-multi-column-column-outer.half { - width: 50%; + .aphront-multi-column-column-outer.half { + width: 50%; } .device-desktop .aphront-multi-column-fluid .aphront-multi-column-2-up -.aphront-multi-column-column-outer.third { - width: 33.34%; + .aphront-multi-column-column-outer.third { + width: 33.34%; } .device-desktop .aphront-multi-column-fluid .aphront-multi-column-2-up -.aphront-multi-column-column-outer.thirds { - width: 66.66%; + .aphront-multi-column-column-outer.thirds { + width: 66.66%; } .aphront-multi-column-fluid -.aphront-multi-column-column-outer.grippable -.aphront-multi-column-column .dashboard-pane { - cursor: move; + .aphront-multi-column-column-outer.grippable + .aphront-multi-column-column .dashboard-pane { + cursor: move; } -.aphront-multi-column-fluid -.aphront-multi-column-column .drag-ghost { +.aphront-multi-column-fluid .aphront-multi-column-column .drag-ghost { list-style-type: none; - margin: 16px; } -.aphront-multi-column-fluid -.aphront-multi-column-column -.dashboard-panel-placeholder { - display: none; +.aphront-multi-column-fluid .aphront-multi-column-column + .dashboard-panel-placeholder { + display: none; } -.aphront-multi-column-fluid -.aphront-multi-column-column.dashboard-column-empty -.dashboard-panel-placeholder { - display: block; - padding: 20px; - margin: 0 0 12px 0; - text-decoration: none; - border: 1px {$greyborder} dashed; - color: {$greytext}; +.aphront-multi-column-fluid .aphront-multi-column-column.dashboard-column-empty + .dashboard-panel-placeholder { + display: block; + padding: 20px; + margin: 0 0 12px 0; + text-decoration: none; + border: 1px {$greyborder} dashed; + color: {$greytext}; } -.aphront-multi-column-fluid -.aphront-multi-column-column.drag-target-list -.dashboard-panel-placeholder { - display: none; +.aphront-multi-column-fluid .aphront-multi-column-column.drag-target-list + .dashboard-panel-placeholder { + display: none; } -.aphront-multi-column-fluid -.aphront-multi-column-column-outer -.aphront-multi-column-column .phui-info-view { - margin: 0; +.aphront-multi-column-fluid .aphront-multi-column-column-outer + .aphront-multi-column-column .phui-info-view { + margin: 0; } .dashboard-preview-box { - border: 1px solid {$lightblueborder}; - border-radius: 3px; - background-color: rgba(255,255,255,.33); + margin: -16px -16px 16px; +} + +.drag-frame .phui-object-box { + box-shadow: {$dropshadow}; +} + +.drag-frame .phui-object-box .phui-object-box { + box-shadow: none; }