public static function addPanelToDashboard(PhabricatorUser $actor, PhabricatorContentSource $content_source, PhabricatorDashboardPanel $panel, PhabricatorDashboard $dashboard, $column)
 {
     $xactions = array();
     $xactions[] = id(new PhabricatorDashboardTransaction())->setTransactionType(PhabricatorTransactions::TYPE_EDGE)->setMetadataValue('edge:type', PhabricatorDashboardDashboardHasPanelEdgeType::EDGECONST)->setNewValue(array('+' => array($panel->getPHID() => $panel->getPHID())));
     $layout_config = $dashboard->getLayoutConfigObject();
     $layout_config->setPanelLocation($column, $panel->getPHID());
     $dashboard->setLayoutConfigFromObject($layout_config);
     $editor = id(new PhabricatorDashboardTransactionEditor())->setActor($actor)->setContentSource($content_source)->setContinueOnMissingFields(true)->setContinueOnNoEffect(true)->applyTransactions($dashboard, $xactions);
 }
 private function copyPanel(AphrontRequest $request, PhabricatorDashboard $dashboard, PhabricatorDashboardPanel $panel)
 {
     $viewer = $request->getUser();
     $copy = PhabricatorDashboardPanel::initializeNewPanel($viewer);
     $copy = PhabricatorDashboardPanel::copyPanel($copy, $panel);
     $copy->openTransaction();
     $copy->save();
     // TODO: This should record a transaction on the panel copy, too.
     $xactions = array();
     $xactions[] = id(new PhabricatorDashboardTransaction())->setTransactionType(PhabricatorTransactions::TYPE_EDGE)->setMetadataValue('edge:type', PhabricatorDashboardDashboardHasPanelEdgeType::EDGECONST)->setNewValue(array('+' => array($copy->getPHID() => $copy->getPHID()), '-' => array($panel->getPHID() => $panel->getPHID())));
     $layout_config = $dashboard->getLayoutConfigObject();
     $layout_config->replacePanel($panel->getPHID(), $copy->getPHID());
     $dashboard->setLayoutConfigFromObject($layout_config);
     $dashboard->save();
     $editor = id(new PhabricatorDashboardTransactionEditor())->setActor($viewer)->setContentSourceFromRequest($request)->setContinueOnMissingFields(true)->setContinueOnNoEffect(true)->applyTransactions($dashboard, $xactions);
     $copy->saveTransaction();
     return $copy;
 }