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; }