Changeset View
Changeset View
Standalone View
Standalone View
src/applications/project/engine/PhabricatorBoardResponseEngine.php
<?php | <?php | ||||
final class PhabricatorBoardResponseEngine extends Phobject { | final class PhabricatorBoardResponseEngine extends Phobject { | ||||
private $viewer; | private $viewer; | ||||
private $boardPHID; | private $boardPHID; | ||||
private $objectPHID; | private $objectPHID; | ||||
private $visiblePHIDs; | private $visiblePHIDs; | ||||
private $updatePHIDs = array(); | |||||
private $ordering; | private $ordering; | ||||
private $sounds; | private $sounds; | ||||
public function setViewer(PhabricatorUser $viewer) { | public function setViewer(PhabricatorUser $viewer) { | ||||
$this->viewer = $viewer; | $this->viewer = $viewer; | ||||
return $this; | return $this; | ||||
} | } | ||||
Show All 23 Lines | public function setVisiblePHIDs(array $visible_phids) { | ||||
$this->visiblePHIDs = $visible_phids; | $this->visiblePHIDs = $visible_phids; | ||||
return $this; | return $this; | ||||
} | } | ||||
public function getVisiblePHIDs() { | public function getVisiblePHIDs() { | ||||
return $this->visiblePHIDs; | return $this->visiblePHIDs; | ||||
} | } | ||||
public function setUpdatePHIDs(array $update_phids) { | |||||
$this->updatePHIDs = $update_phids; | |||||
return $this; | |||||
} | |||||
public function getUpdatePHIDs() { | |||||
return $this->updatePHIDs; | |||||
} | |||||
public function setOrdering(PhabricatorProjectColumnOrder $ordering) { | public function setOrdering(PhabricatorProjectColumnOrder $ordering) { | ||||
$this->ordering = $ordering; | $this->ordering = $ordering; | ||||
return $this; | return $this; | ||||
} | } | ||||
public function getOrdering() { | public function getOrdering() { | ||||
return $this->ordering; | return $this->ordering; | ||||
} | } | ||||
Show All 10 Lines | final class PhabricatorBoardResponseEngine extends Phobject { | ||||
public function buildResponse() { | public function buildResponse() { | ||||
$viewer = $this->getViewer(); | $viewer = $this->getViewer(); | ||||
$object_phid = $this->getObjectPHID(); | $object_phid = $this->getObjectPHID(); | ||||
$board_phid = $this->getBoardPHID(); | $board_phid = $this->getBoardPHID(); | ||||
$ordering = $this->getOrdering(); | $ordering = $this->getOrdering(); | ||||
// Load all the other tasks that are visible in the affected columns and | // Load all the other tasks that are visible in the affected columns and | ||||
// perform layout for them. | // perform layout for them. | ||||
$visible_phids = $this->getAllVisiblePHIDs(); | $all_phids = $this->getAllVisiblePHIDs(); | ||||
$layout_engine = id(new PhabricatorBoardLayoutEngine()) | $layout_engine = id(new PhabricatorBoardLayoutEngine()) | ||||
->setViewer($viewer) | ->setViewer($viewer) | ||||
->setBoardPHIDs(array($board_phid)) | ->setBoardPHIDs(array($board_phid)) | ||||
->setObjectPHIDs($visible_phids) | ->setObjectPHIDs($all_phids) | ||||
->executeLayout(); | ->executeLayout(); | ||||
$object_columns = $layout_engine->getObjectColumns( | $natural = array(); | ||||
$update_phids = $this->getAllUpdatePHIDs(); | |||||
$update_columns = array(); | |||||
foreach ($update_phids as $update_phid) { | |||||
$update_columns += $layout_engine->getObjectColumns( | |||||
$board_phid, | $board_phid, | ||||
$object_phid); | $update_phid); | ||||
} | |||||
$natural = array(); | foreach ($update_columns as $column_phid => $column) { | ||||
foreach ($object_columns as $column_phid => $column) { | |||||
$column_object_phids = $layout_engine->getColumnObjectPHIDs( | $column_object_phids = $layout_engine->getColumnObjectPHIDs( | ||||
$board_phid, | $board_phid, | ||||
$column_phid); | $column_phid); | ||||
$natural[$column_phid] = array_values($column_object_phids); | $natural[$column_phid] = array_values($column_object_phids); | ||||
} | } | ||||
$all_visible = id(new ManiphestTaskQuery()) | $all_objects = id(new ManiphestTaskQuery()) | ||||
->setViewer($viewer) | ->setViewer($viewer) | ||||
->withPHIDs($visible_phids) | ->withPHIDs($all_phids) | ||||
->execute(); | ->execute(); | ||||
$all_visible = mpull($all_visible, null, 'getPHID'); | $all_objects = mpull($all_objects, null, 'getPHID'); | ||||
if ($ordering) { | if ($ordering) { | ||||
$vectors = $ordering->getSortVectorsForObjects($all_visible); | $vectors = $ordering->getSortVectorsForObjects($all_objects); | ||||
$header_keys = $ordering->getHeaderKeysForObjects($all_visible); | $header_keys = $ordering->getHeaderKeysForObjects($all_objects); | ||||
$headers = $ordering->getHeadersForObjects($all_visible); | $headers = $ordering->getHeadersForObjects($all_objects); | ||||
$headers = mpull($headers, 'toDictionary'); | $headers = mpull($headers, 'toDictionary'); | ||||
} else { | } else { | ||||
$vectors = array(); | $vectors = array(); | ||||
$header_keys = array(); | $header_keys = array(); | ||||
$headers = array(); | $headers = array(); | ||||
} | } | ||||
$object = id(new ManiphestTaskQuery()) | $templates = $this->newCardTemplates(); | ||||
->setViewer($viewer) | |||||
->withPHIDs(array($object_phid)) | |||||
->needProjectPHIDs(true) | |||||
->executeOne(); | |||||
if (!$object) { | |||||
return new Aphront404Response(); | |||||
} | |||||
$template = $this->buildTemplate($object); | |||||
$cards = array(); | $cards = array(); | ||||
foreach ($all_visible as $card_phid => $object) { | foreach ($all_objects as $card_phid => $object) { | ||||
$card = array( | $card = array( | ||||
'vectors' => array(), | 'vectors' => array(), | ||||
'headers' => array(), | 'headers' => array(), | ||||
'properties' => array(), | 'properties' => array(), | ||||
'nodeHTMLTemplate' => null, | 'nodeHTMLTemplate' => null, | ||||
); | ); | ||||
if ($ordering) { | if ($ordering) { | ||||
$order_key = $ordering->getColumnOrderKey(); | $order_key = $ordering->getColumnOrderKey(); | ||||
$vector = idx($vectors, $card_phid); | $vector = idx($vectors, $card_phid); | ||||
if ($vector !== null) { | if ($vector !== null) { | ||||
$card['vectors'][$order_key] = $vector; | $card['vectors'][$order_key] = $vector; | ||||
} | } | ||||
$header = idx($header_keys, $card_phid); | $header = idx($header_keys, $card_phid); | ||||
if ($header !== null) { | if ($header !== null) { | ||||
$card['headers'][$order_key] = $header; | $card['headers'][$order_key] = $header; | ||||
} | } | ||||
$card['properties'] = self::newTaskProperties($object); | $card['properties'] = self::newTaskProperties($object); | ||||
} | } | ||||
if ($card_phid === $object_phid) { | if (isset($templates[$card_phid])) { | ||||
$card['nodeHTMLTemplate'] = hsprintf('%s', $template); | $card['nodeHTMLTemplate'] = hsprintf('%s', $templates[$card_phid]); | ||||
amckinley: Debugging code, but I'm sure you're going to land this is as a big stack anyway. | |||||
$card['update'] = true; | |||||
} else { | |||||
$card['update'] = false; | |||||
} | } | ||||
$card['vectors'] = (object)$card['vectors']; | $card['vectors'] = (object)$card['vectors']; | ||||
$card['headers'] = (object)$card['headers']; | $card['headers'] = (object)$card['headers']; | ||||
$card['properties'] = (object)$card['properties']; | $card['properties'] = (object)$card['properties']; | ||||
$cards[$card_phid] = $card; | $cards[$card_phid] = $card; | ||||
} | } | ||||
$payload = array( | $payload = array( | ||||
'objectPHID' => $object_phid, | |||||
'columnMaps' => $natural, | 'columnMaps' => $natural, | ||||
'cards' => $cards, | 'cards' => $cards, | ||||
'headers' => $headers, | 'headers' => $headers, | ||||
'sounds' => $this->getSounds(), | 'sounds' => $this->getSounds(), | ||||
); | ); | ||||
return id(new AphrontAjaxResponse()) | return id(new AphrontAjaxResponse()) | ||||
->setContent($payload); | ->setContent($payload); | ||||
} | } | ||||
public static function newTaskProperties($task) { | public static function newTaskProperties($task) { | ||||
return array( | return array( | ||||
'points' => (double)$task->getPoints(), | 'points' => (double)$task->getPoints(), | ||||
'status' => $task->getStatus(), | 'status' => $task->getStatus(), | ||||
'priority' => (int)$task->getPriority(), | 'priority' => (int)$task->getPriority(), | ||||
'owner' => $task->getOwnerPHID(), | 'owner' => $task->getOwnerPHID(), | ||||
); | ); | ||||
} | } | ||||
private function buildTemplate($object) { | |||||
$viewer = $this->getViewer(); | |||||
$object_phid = $this->getObjectPHID(); | |||||
$excluded_phids = $this->loadExcludedProjectPHIDs(); | |||||
$rendering_engine = id(new PhabricatorBoardRenderingEngine()) | |||||
->setViewer($viewer) | |||||
->setObjects(array($object)) | |||||
->setExcludedProjectPHIDs($excluded_phids); | |||||
$card = $rendering_engine->renderCard($object_phid); | |||||
return hsprintf('%s', $card->getItem()); | |||||
} | |||||
private function loadExcludedProjectPHIDs() { | private function loadExcludedProjectPHIDs() { | ||||
$viewer = $this->getViewer(); | $viewer = $this->getViewer(); | ||||
$board_phid = $this->getBoardPHID(); | $board_phid = $this->getBoardPHID(); | ||||
$exclude_phids = array($board_phid); | $exclude_phids = array($board_phid); | ||||
$descendants = id(new PhabricatorProjectQuery()) | $descendants = id(new PhabricatorProjectQuery()) | ||||
->setViewer($viewer) | ->setViewer($viewer) | ||||
->withAncestorProjectPHIDs($exclude_phids) | ->withAncestorProjectPHIDs($exclude_phids) | ||||
->execute(); | ->execute(); | ||||
foreach ($descendants as $descendant) { | foreach ($descendants as $descendant) { | ||||
$exclude_phids[] = $descendant->getPHID(); | $exclude_phids[] = $descendant->getPHID(); | ||||
} | } | ||||
return array_fuse($exclude_phids); | return array_fuse($exclude_phids); | ||||
} | } | ||||
private function getAllVisiblePHIDs() { | private function getAllVisiblePHIDs() { | ||||
$visible_phids = $this->getVisiblePHIDs(); | $phids = $this->getAllUpdatePHIDs(); | ||||
$visible_phids[] = $this->getObjectPHID(); | |||||
$visible_phids = array_fuse($visible_phids); | foreach ($this->getVisiblePHIDs() as $phid) { | ||||
return $visible_phids; | $phids[] = $phid; | ||||
} | |||||
$phids = array_fuse($phids); | |||||
return $phids; | |||||
} | |||||
private function getAllUpdatePHIDs() { | |||||
$phids = $this->getUpdatePHIDs(); | |||||
$object_phid = $this->getObjectPHID(); | |||||
if ($object_phid) { | |||||
$phids[] = $object_phid; | |||||
} | |||||
$phids = array_fuse($phids); | |||||
return $phids; | |||||
} | |||||
private function newCardTemplates() { | |||||
$viewer = $this->getViewer(); | |||||
$update_phids = $this->getAllUpdatePHIDs(); | |||||
if (!$update_phids) { | |||||
return array(); | |||||
} | |||||
$objects = id(new ManiphestTaskQuery()) | |||||
->setViewer($viewer) | |||||
->withPHIDs($update_phids) | |||||
->needProjectPHIDs(true) | |||||
->execute(); | |||||
if (!$objects) { | |||||
return array(); | |||||
} | |||||
$excluded_phids = $this->loadExcludedProjectPHIDs(); | |||||
$rendering_engine = id(new PhabricatorBoardRenderingEngine()) | |||||
->setViewer($viewer) | |||||
->setObjects($objects) | |||||
->setExcludedProjectPHIDs($excluded_phids); | |||||
$templates = array(); | |||||
foreach ($objects as $object) { | |||||
$object_phid = $object->getPHID(); | |||||
$card = $rendering_engine->renderCard($object_phid); | |||||
$item = $card->getItem(); | |||||
$template = hsprintf('%s', $item); | |||||
$templates[$object_phid] = $template; | |||||
} | |||||
return $templates; | |||||
} | } | ||||
} | } |
Debugging code, but I'm sure you're going to land this is as a big stack anyway.