@recaptime-dev's working patches + fork for Phorge, a community fork of Phabricator. (Upstream dev and stable branches are at upstream/main and upstream/stable respectively.) hq.recaptime.dev/wiki/Phorge
phorge phabricator
at recaptime-dev/main 73 lines 2.2 kB view raw
1<?php 2 3final class PhabricatorProjectBoardReloadController 4 extends PhabricatorProjectBoardController { 5 6 public function handleRequest(AphrontRequest $request) { 7 $viewer = $request->getViewer(); 8 9 $response = $this->loadProject(); 10 if ($response) { 11 return $response; 12 } 13 14 $order = $request->getStr('order'); 15 if (!strlen($order)) { 16 $order = PhabricatorProjectColumnNaturalOrder::ORDERKEY; 17 } 18 19 $ordering = PhabricatorProjectColumnOrder::getOrderByKey($order); 20 $ordering = id(clone $ordering) 21 ->setViewer($viewer); 22 23 $project = $this->getProject(); 24 $state = $this->getViewState(); 25 $board_uri = $state->newWorkboardURI(); 26 27 $layout_engine = $state->getLayoutEngine(); 28 29 $board_phid = $project->getPHID(); 30 31 $objects = $state->getObjects(); 32 $objects = mpull($objects, null, 'getPHID'); 33 34 try { 35 $client_state = $request->getStr('state'); 36 $client_state = phutil_json_decode($client_state); 37 } catch (PhutilJSONParserException $ex) { 38 $client_state = array(); 39 } 40 41 // Figure out which objects need to be updated: either the client has an 42 // out-of-date version of them (objects which have been edited); or they 43 // exist on the client but not on the server (objects which have been 44 // removed from the board); or they exist on the server but not on the 45 // client (objects which have been added to the board). 46 47 $update_objects = array(); 48 foreach ($objects as $object_phid => $object) { 49 50 // TODO: For now, this is always hard-coded. 51 $object_version = 2; 52 53 $client_version = idx($client_state, $object_phid, 0); 54 if ($object_version > $client_version) { 55 $update_objects[$object_phid] = $object; 56 } 57 } 58 59 $update_phids = array_keys($update_objects); 60 $visible_phids = array_keys($client_state); 61 62 $engine = id(new PhabricatorBoardResponseEngine()) 63 ->setViewer($viewer) 64 ->setBoardPHID($board_phid) 65 ->setOrdering($ordering) 66 ->setObjects($objects) 67 ->setUpdatePHIDs($update_phids) 68 ->setVisiblePHIDs($visible_phids); 69 70 return $engine->buildResponse(); 71 } 72 73}