Differential D20408 Diff 48715 src/applications/dashboard/xaction/dashboard/PhabricatorDashboardPanelsTransaction.php
Changeset View
Changeset View
Standalone View
Standalone View
src/applications/dashboard/xaction/dashboard/PhabricatorDashboardPanelsTransaction.php
- This file was added.
| <?php | |||||
| final class PhabricatorDashboardPanelsTransaction | |||||
| extends PhabricatorDashboardTransactionType { | |||||
| const TRANSACTIONTYPE = 'panels'; | |||||
| public function generateOldValue($object) { | |||||
| return $object->getRawPanels(); | |||||
| } | |||||
| public function applyInternalEffects($object, $value) { | |||||
| $object->setRawPanels($value); | |||||
| } | |||||
| public function getTitle() { | |||||
| return pht( | |||||
| '%s changed the panels on this dashboard.', | |||||
| $this->renderAuthor()); | |||||
| } | |||||
| public function validateTransactions($object, array $xactions) { | |||||
| $actor = $this->getActor(); | |||||
| $errors = array(); | |||||
| $ref_list = $object->getPanelRefList(); | |||||
| $columns = $ref_list->getColumns(); | |||||
| $old_phids = $object->getPanelPHIDs(); | |||||
| $old_phids = array_fuse($old_phids); | |||||
| foreach ($xactions as $xaction) { | |||||
| $new_value = $xaction->getNewValue(); | |||||
| if (!is_array($new_value)) { | |||||
| $errors[] = $this->newInvalidError( | |||||
| pht('Panels must be a list of panel specifications.'), | |||||
| $xaction); | |||||
| continue; | |||||
| } | |||||
| if (!phutil_is_natural_list($new_value)) { | |||||
| $errors[] = $this->newInvalidError( | |||||
| pht('Panels must be a list, not a map.'), | |||||
| $xaction); | |||||
| continue; | |||||
| } | |||||
| $new_phids = array(); | |||||
| $seen_keys = array(); | |||||
| foreach ($new_value as $idx => $spec) { | |||||
| if (!is_array($spec)) { | |||||
| $errors[] = $this->newInvalidError( | |||||
| pht( | |||||
| 'Each panel specification must be a map of panel attributes. '. | |||||
| 'Panel specification at index "%s" is "%s".', | |||||
| $idx, | |||||
| phutil_describe_type($spec)), | |||||
| $xaction); | |||||
| continue; | |||||
| } | |||||
| try { | |||||
| PhutilTypeSpec::checkMap( | |||||
| $spec, | |||||
| array( | |||||
| 'panelPHID' => 'string', | |||||
| 'columnKey' => 'string', | |||||
| 'panelKey' => 'string', | |||||
| )); | |||||
| } catch (PhutilTypeCheckException $ex) { | |||||
| $errors[] = $this->newInvalidError( | |||||
| pht( | |||||
| 'Panel specification at index "%s" is invalid: %s', | |||||
| $idx, | |||||
| $ex->getMessage()), | |||||
| $xaction); | |||||
| continue; | |||||
| } | |||||
| $panel_key = $spec['panelKey']; | |||||
| if (!strlen($panel_key)) { | |||||
| $errors[] = $this->newInvalidError( | |||||
| pht( | |||||
| 'Panel specification at index "%s" has bad panel key "%s". '. | |||||
| 'Panel keys must be nonempty.', | |||||
| $idx, | |||||
| $panel_key), | |||||
| $xaction); | |||||
| continue; | |||||
| } | |||||
| if (isset($seen_keys[$panel_key])) { | |||||
| $errors[] = $this->newInvalidError( | |||||
| pht( | |||||
| 'Panel specification at index "%s" has duplicate panel key '. | |||||
| '"%s". Each panel must have a unique panel key.', | |||||
| $idx, | |||||
| $panel_key), | |||||
| $xaction); | |||||
| continue; | |||||
| } | |||||
| $seen_keys[$panel_key] = true; | |||||
| $panel_phid = $spec['panelPHID']; | |||||
| $new_phids[] = $panel_phid; | |||||
| $column_key = $spec['columnKey']; | |||||
| if (!isset($columns[$column_key])) { | |||||
| $errors[] = $this->newInvalidError( | |||||
| pht( | |||||
| 'Panel specification at index "%s" has bad column key "%s", '. | |||||
| 'valid column keys are: %s.', | |||||
| $idx, | |||||
| $column_key, | |||||
| implode(', ', array_keys($columns))), | |||||
| $xaction); | |||||
| continue; | |||||
| } | |||||
| } | |||||
| $new_phids = array_fuse($new_phids); | |||||
| $add_phids = array_diff_key($new_phids, $old_phids); | |||||
| if ($add_phids) { | |||||
| $panels = id(new PhabricatorDashboardPanelQuery()) | |||||
| ->setViewer($actor) | |||||
| ->withPHIDs($add_phids) | |||||
| ->execute(); | |||||
| $panels = mpull($panels, null, 'getPHID'); | |||||
| foreach ($add_phids as $add_phid) { | |||||
| $panel = idx($panels, $add_phid); | |||||
| if (!$panel) { | |||||
| $errors[] = $this->newInvalidError( | |||||
| pht( | |||||
| 'Panel specification adds panel "%s", but this is not a '. | |||||
| 'valid panel or not a visible panel. You can only add '. | |||||
| 'valid panels which you have permission to see to a dashboard.', | |||||
| $add_phid)); | |||||
| continue; | |||||
| } | |||||
| } | |||||
| } | |||||
| } | |||||
| return $errors; | |||||
| } | |||||
| } | |||||