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