Differential D20407 Diff 48714 src/applications/dashboard/engine/PhabricatorDashboardRenderingEngine.php
Changeset View
Changeset View
Standalone View
Standalone View
src/applications/dashboard/engine/PhabricatorDashboardRenderingEngine.php
| Show All 25 Lines | final class PhabricatorDashboardRenderingEngine extends Phobject { | ||||
| public function setArrangeMode($mode) { | public function setArrangeMode($mode) { | ||||
| $this->arrangeMode = $mode; | $this->arrangeMode = $mode; | ||||
| return $this; | return $this; | ||||
| } | } | ||||
| public function renderDashboard() { | public function renderDashboard() { | ||||
| require_celerity_resource('phabricator-dashboard-css'); | require_celerity_resource('phabricator-dashboard-css'); | ||||
| $dashboard = $this->dashboard; | $dashboard = $this->getDashboard(); | ||||
| $viewer = $this->viewer; | $viewer = $this->getViewer(); | ||||
| $is_editable = $this->arrangeMode; | $is_editable = $this->arrangeMode; | ||||
| $layout_config = $dashboard->getLayoutConfigObject(); | |||||
| $panel_grid_locations = $layout_config->getPanelLocations(); | |||||
| $panels = mpull($dashboard->getPanels(), null, 'getPHID'); | |||||
| $dashboard_id = celerity_generate_unique_node_id(); | |||||
| $result = id(new AphrontMultiColumnView()) | |||||
| ->setID($dashboard_id) | |||||
| ->setFluidLayout(true) | |||||
| ->setGutter(AphrontMultiColumnView::GUTTER_LARGE); | |||||
| if ($is_editable) { | if ($is_editable) { | ||||
| $h_mode = PhabricatorDashboardPanelRenderingEngine::HEADER_MODE_EDIT; | $h_mode = PhabricatorDashboardPanelRenderingEngine::HEADER_MODE_EDIT; | ||||
| } else { | } else { | ||||
| $h_mode = PhabricatorDashboardPanelRenderingEngine::HEADER_MODE_NORMAL; | $h_mode = PhabricatorDashboardPanelRenderingEngine::HEADER_MODE_NORMAL; | ||||
| } | } | ||||
| $panel_phids = array(); | $panel_phids = $dashboard->getPanelPHIDs(); | ||||
| foreach ($panel_grid_locations as $panel_column_locations) { | if ($panel_phids) { | ||||
| foreach ($panel_column_locations as $panel_phid) { | $panels = id(new PhabricatorDashboardPanelQuery()) | ||||
| $panel_phids[] = $panel_phid; | ->setViewer($viewer) | ||||
| } | ->withPHIDs($panel_phids) | ||||
| } | ->execute(); | ||||
| $panels = mpull($panels, null, 'getPHID'); | |||||
| $handles = $viewer->loadHandles($panel_phids); | $handles = $viewer->loadHandles($panel_phids); | ||||
| } else { | |||||
| $panels = array(); | |||||
| $handles = array(); | |||||
| } | |||||
| foreach ($panel_grid_locations as $column => $panel_column_locations) { | $ref_list = $dashboard->getPanelRefList(); | ||||
| $panel_phids = $panel_column_locations; | $columns = $ref_list->getColumns(); | ||||
| // TODO: This list may contain duplicates when the dashboard itself | $dashboard_id = celerity_generate_unique_node_id(); | ||||
| // does not? Perhaps this is related to T10612. For now, just unique | |||||
| // the list before moving on. | $result = id(new AphrontMultiColumnView()) | ||||
| $panel_phids = array_unique($panel_phids); | ->setID($dashboard_id) | ||||
| ->setFluidLayout(true) | |||||
| ->setGutter(AphrontMultiColumnView::GUTTER_LARGE); | |||||
| foreach ($columns as $column) { | |||||
| $column_views = array(); | |||||
| foreach ($column->getPanelRefs() as $panel_ref) { | |||||
| $panel_phid = $panel_ref->getPanelPHID(); | |||||
| $column_result = array(); | |||||
| foreach ($panel_phids as $panel_phid) { | |||||
| $panel_engine = id(new PhabricatorDashboardPanelRenderingEngine()) | $panel_engine = id(new PhabricatorDashboardPanelRenderingEngine()) | ||||
| ->setViewer($viewer) | ->setViewer($viewer) | ||||
| ->setDashboardID($dashboard->getID()) | ->setDashboardID($dashboard->getID()) | ||||
| ->setEnableAsyncRendering(true) | ->setEnableAsyncRendering(true) | ||||
| ->setContextObject($dashboard) | ->setContextObject($dashboard) | ||||
| ->setPanelPHID($panel_phid) | ->setPanelPHID($panel_phid) | ||||
| ->setParentPanelPHIDs(array()) | ->setParentPanelPHIDs(array()) | ||||
| ->setHeaderMode($h_mode) | ->setHeaderMode($h_mode) | ||||
| ->setEditMode($is_editable) | ->setEditMode($is_editable) | ||||
| ->setPanelHandle($handles[$panel_phid]); | ->setPanelHandle($handles[$panel_phid]); | ||||
| $panel = idx($panels, $panel_phid); | $panel = idx($panels, $panel_phid); | ||||
| if ($panel) { | if ($panel) { | ||||
| $panel_engine->setPanel($panel); | $panel_engine->setPanel($panel); | ||||
| } | } | ||||
| $column_result[] = $panel_engine->renderPanel(); | $column_views[] = $panel_engine->renderPanel(); | ||||
| } | } | ||||
| $column_class = $layout_config->getColumnClass( | |||||
| $column, | $column_classes = $column->getClasses(); | ||||
| $is_editable); | |||||
| if ($is_editable) { | if ($is_editable) { | ||||
| $column_result[] = $this->renderAddPanelPlaceHolder($column); | $column_views[] = $this->renderAddPanelPlaceHolder(); | ||||
| $column_result[] = $this->renderAddPanelUI($column); | $column_views[] = $this->renderAddPanelUI($column->getColumnKey()); | ||||
| } | } | ||||
| $result->addColumn( | $result->addColumn( | ||||
| $column_result, | $column_views, | ||||
| $column_class, | implode(' ', $column_classes), | ||||
| $sigil = 'dashboard-column', | $sigil = 'dashboard-column', | ||||
| $metadata = array('columnID' => $column)); | $metadata = array('columnID' => $column)); | ||||
| } | } | ||||
| if ($is_editable) { | if ($is_editable) { | ||||
| Javelin::initBehavior( | Javelin::initBehavior( | ||||
| 'dashboard-move-panels', | 'dashboard-move-panels', | ||||
| array( | array( | ||||
| 'dashboardID' => $dashboard_id, | 'dashboardID' => $dashboard_id, | ||||
| 'moveURI' => '/dashboard/movepanel/'.$dashboard->getID().'/', | 'moveURI' => '/dashboard/movepanel/'.$dashboard->getID().'/', | ||||
| )); | )); | ||||
| } | } | ||||
| $view = id(new PHUIBoxView()) | $view = id(new PHUIBoxView()) | ||||
| ->addClass('dashboard-view') | ->addClass('dashboard-view') | ||||
| ->appendChild( | ->appendChild( | ||||
| array( | array( | ||||
| $result, | $result, | ||||
| )); | )); | ||||
| return $view; | return $view; | ||||
| } | } | ||||
| private function renderAddPanelPlaceHolder($column) { | private function renderAddPanelPlaceHolder() { | ||||
| $dashboard = $this->dashboard; | |||||
| $panels = $dashboard->getPanels(); | |||||
| return javelin_tag( | return javelin_tag( | ||||
| 'span', | 'span', | ||||
| array( | array( | ||||
| 'sigil' => 'workflow', | 'sigil' => 'workflow', | ||||
| 'class' => 'drag-ghost dashboard-panel-placeholder', | 'class' => 'drag-ghost dashboard-panel-placeholder', | ||||
| ), | ), | ||||
| pht('This column does not have any panels yet.')); | pht('This column does not have any panels yet.')); | ||||
| } | } | ||||
| Show All 37 Lines | |||||