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

Configure Feed

Select the types of activity you want to include in your feed.

Conpherence - continue the load less quest

Summary: basically makes it so we only really load what we need from the server for any particular update action. the javascript thus then has some things deleted from it. made a spot or two ready for when the pertinent UI won't be there as well. also added a feature in javascript -- updating the document title to the current conpherence title. Ref T2867 T2399

Test Plan: played with conpherence for quite a bit.

Reviewers: epriestley, chad

Reviewed By: epriestley

CC: aran, Korvin

Maniphest Tasks: T2867

Differential Revision: https://secure.phabricator.com/D5625

+111 -102
+3 -3
src/__celerity_resource_map__.php
··· 1282 1282 ), 1283 1283 'javelin-behavior-conpherence-menu' => 1284 1284 array( 1285 - 'uri' => '/res/257f200d/rsrc/js/application/conpherence/behavior-menu.js', 1285 + 'uri' => '/res/7021ec83/rsrc/js/application/conpherence/behavior-menu.js', 1286 1286 'type' => 'js', 1287 1287 'requires' => 1288 1288 array( ··· 1299 1299 ), 1300 1300 'javelin-behavior-conpherence-pontificate' => 1301 1301 array( 1302 - 'uri' => '/res/91d6418d/rsrc/js/application/conpherence/behavior-pontificate.js', 1302 + 'uri' => '/res/b45269fc/rsrc/js/application/conpherence/behavior-pontificate.js', 1303 1303 'type' => 'js', 1304 1304 'requires' => 1305 1305 array( ··· 1313 1313 ), 1314 1314 'javelin-behavior-conpherence-widget-pane' => 1315 1315 array( 1316 - 'uri' => '/res/0c0fc5ef/rsrc/js/application/conpherence/behavior-widget-pane.js', 1316 + 'uri' => '/res/32f4bf14/rsrc/js/application/conpherence/behavior-widget-pane.js', 1317 1317 'type' => 'js', 1318 1318 'requires' => 1319 1319 array(
+2
src/__phutil_library_map__.php
··· 252 252 'ConpherenceTransactionQuery' => 'applications/conpherence/query/ConpherenceTransactionQuery.php', 253 253 'ConpherenceTransactionType' => 'applications/conpherence/constants/ConpherenceTransactionType.php', 254 254 'ConpherenceTransactionView' => 'applications/conpherence/view/ConpherenceTransactionView.php', 255 + 'ConpherenceUpdateActions' => 'applications/conpherence/constants/ConpherenceUpdateActions.php', 255 256 'ConpherenceUpdateController' => 'applications/conpherence/controller/ConpherenceUpdateController.php', 256 257 'ConpherenceViewController' => 'applications/conpherence/controller/ConpherenceViewController.php', 257 258 'ConpherenceWidgetController' => 'applications/conpherence/controller/ConpherenceWidgetController.php', ··· 1983 1984 'ConpherenceTransactionQuery' => 'PhabricatorApplicationTransactionQuery', 1984 1985 'ConpherenceTransactionType' => 'ConpherenceConstants', 1985 1986 'ConpherenceTransactionView' => 'AphrontView', 1987 + 'ConpherenceUpdateActions' => 'ConpherenceConstants', 1986 1988 'ConpherenceUpdateController' => 'ConpherenceController', 1987 1989 'ConpherenceViewController' => 'ConpherenceController', 1988 1990 'ConpherenceWidgetController' => 'ConpherenceController',
+10
src/applications/conpherence/constants/ConpherenceUpdateActions.php
··· 1 + <?php 2 + 3 + final class ConpherenceUpdateActions extends ConpherenceConstants { 4 + 5 + const METADATA = 'metadata'; 6 + const MESSAGE = 'message'; 7 + const ADD_PERSON = 'add_person'; 8 + const REMOVE_PERSON = 'remove_person'; 9 + const NOTIFICATIONS = 'notifications'; 10 + }
+71 -31
src/applications/conpherence/controller/ConpherenceUpdateController.php
··· 36 36 ->executeOne(); 37 37 $supported_formats = PhabricatorFile::getTransformableImageFormats(); 38 38 39 - $action = $request->getStr('action', 'metadata'); 39 + $action = $request->getStr('action', ConpherenceUpdateActions::METADATA); 40 40 $latest_transaction_id = null; 41 41 $response_mode = 'ajax'; 42 42 $error_view = null; ··· 54 54 ->setActor($user); 55 55 56 56 switch ($action) { 57 - case 'message': 57 + case ConpherenceUpdateActions::MESSAGE: 58 58 $message = $request->getStr('text'); 59 59 $xactions = $editor->generateTransactionsFromText( 60 60 $conpherence, 61 61 $message); 62 62 break; 63 - case 'add_person': 63 + case ConpherenceUpdateActions::ADD_PERSON: 64 64 $xactions = array(); 65 65 $person_tokenizer = $request->getArr('add_person'); 66 66 $person_phid = reset($person_tokenizer); ··· 71 71 ->setNewValue(array('+' => array($person_phid))); 72 72 } 73 73 break; 74 - case 'remove_person': 74 + case ConpherenceUpdateActions::REMOVE_PERSON: 75 75 $xactions = array(); 76 76 if (!$request->isContinueRequest()) { 77 77 // do nothing; we'll display a confirmation dialogue instead ··· 86 86 $response_mode = 'go-home'; 87 87 } 88 88 break; 89 - case 'notifications': 89 + case ConpherenceUpdateActions::NOTIFICATIONS: 90 90 $notifications = $request->getStr('notifications'); 91 91 $participant = $conpherence->getParticipant($user->getPHID()); 92 92 $participant->setSettings(array('notifications' => $notifications)); ··· 97 97 return id(new AphrontAjaxResponse()) 98 98 ->setContent($result); 99 99 break; 100 - case 'metadata': 100 + case ConpherenceUpdateActions::METADATA: 101 101 $xactions = array(); 102 102 $top = $request->getInt('image_y'); 103 103 $left = $request->getInt('image_x'); ··· 193 193 case 'ajax': 194 194 $latest_transaction_id = $request->getInt('latest_transaction_id'); 195 195 $content = $this->loadAndRenderUpdates( 196 + $action, 196 197 $conpherence_id, 197 198 $latest_transaction_id); 198 199 return id(new AphrontAjaxResponse()) ··· 219 220 } 220 221 221 222 switch ($action) { 222 - case 'remove_person': 223 + case ConpherenceUpdateActions::REMOVE_PERSON: 223 224 $dialogue = $this->renderRemovePersonDialogue($conpherence); 224 225 break; 225 - case 'metadata': 226 + case ConpherenceUpdateActions::METADATA: 226 227 default: 227 228 $dialogue = $this->renderMetadataDialogue($conpherence, $error_view); 228 229 break; ··· 318 319 } 319 320 320 321 private function loadAndRenderUpdates( 322 + $action, 321 323 $conpherence_id, 322 324 $latest_transaction_id) { 323 325 326 + $need_header_pics = false; 327 + $need_widget_data = false; 328 + $need_transactions = false; 329 + switch ($action) { 330 + case ConpherenceUpdateActions::METADATA: 331 + $need_header_pics = true; 332 + $need_transactions = true; 333 + break; 334 + case ConpherenceUpdateActions::MESSAGE: 335 + case ConpherenceUpdateActions::ADD_PERSON: 336 + $need_transactions = true; 337 + $need_widget_data = true; 338 + break; 339 + case ConpherenceUpdateActions::REMOVE_PERSON: 340 + case ConpherenceUpdateActions::NOTIFICATIONS: 341 + default: 342 + break; 343 + 344 + } 324 345 $user = $this->getRequest()->getUser(); 325 346 $conpherence = id(new ConpherenceThreadQuery()) 326 347 ->setViewer($user) 327 348 ->setAfterMessageID($latest_transaction_id) 328 - ->needHeaderPics(true) 329 - ->needWidgetData(true) 330 - ->needTransactions(true) 349 + ->needHeaderPics($need_header_pics) 350 + ->needWidgetData($need_widget_data) 351 + ->needTransactions($need_transactions) 331 352 ->withIDs(array($conpherence_id)) 332 353 ->executeOne(); 333 354 334 - $data = $this->renderConpherenceTransactions($conpherence); 335 - $rendered_transactions = $data['transactions']; 336 - $new_latest_transaction_id = $data['latest_transaction_id']; 337 - 338 - $nav_item = id(new ConpherenceThreadListView()) 339 - ->setUser($user) 340 - ->setBaseURI($this->getApplicationURI()) 341 - ->renderSingleThread($conpherence); 342 - 343 - $header = $this->buildHeaderPaneContent($conpherence); 355 + if ($need_transactions) { 356 + $data = $this->renderConpherenceTransactions($conpherence); 357 + } else { 358 + $data = array(); 359 + } 360 + $rendered_transactions = idx($data, 'transactions'); 361 + $new_latest_transaction_id = idx($data, 'latest_transaction_id'); 344 362 345 363 $widget_uri = $this->getApplicationURI('update/'.$conpherence->getID().'/'); 346 - $file_widget = id(new ConpherenceFileWidgetView()) 347 - ->setUser($this->getRequest()->getUser()) 348 - ->setConpherence($conpherence) 349 - ->setUpdateURI($widget_uri); 350 - $people_widget = id(new ConpherencePeopleWidgetView()) 351 - ->setUser($user) 352 - ->setConpherence($conpherence) 353 - ->setUpdateURI($widget_uri); 364 + $nav_item = null; 365 + $header = null; 366 + $people_widget = null; 367 + $file_widget = null; 368 + switch ($action) { 369 + case ConpherenceUpdateActions::METADATA: 370 + $header = $this->buildHeaderPaneContent($conpherence); 371 + $nav_item = id(new ConpherenceThreadListView()) 372 + ->setUser($user) 373 + ->setBaseURI($this->getApplicationURI()) 374 + ->renderSingleThread($conpherence); 375 + break; 376 + case ConpherenceUpdateActions::MESSAGE: 377 + $file_widget = id(new ConpherenceFileWidgetView()) 378 + ->setUser($this->getRequest()->getUser()) 379 + ->setConpherence($conpherence) 380 + ->setUpdateURI($widget_uri); 381 + break; 382 + case ConpherenceUpdateActions::ADD_PERSON: 383 + $people_widget = id(new ConpherencePeopleWidgetView()) 384 + ->setUser($user) 385 + ->setConpherence($conpherence) 386 + ->setUpdateURI($widget_uri); 387 + break; 388 + case ConpherenceUpdateActions::REMOVE_PERSON: 389 + case ConpherenceUpdateActions::NOTIFICATIONS: 390 + default: 391 + break; 392 + } 354 393 355 394 $content = array( 356 395 'transactions' => $rendered_transactions, ··· 358 397 'nav_item' => hsprintf('%s', $nav_item), 359 398 'conpherence_phid' => $conpherence->getPHID(), 360 399 'header' => hsprintf('%s', $header), 361 - 'file_widget' => $file_widget->render(), 362 - 'people_widget' => $people_widget->render() 400 + 'file_widget' => $file_widget ? $file_widget->render() : null, 401 + 'people_widget' => $people_widget ? $people_widget->render() : null, 363 402 ); 403 + 364 404 return $content; 365 405 } 366 406
+1
src/applications/conpherence/view/ConpherenceThreadListView.php
··· 79 79 ->addSigil('conpherence-menu-click') 80 80 ->setMetadata( 81 81 array( 82 + 'title' => $title, 82 83 'id' => $thread->getID(), 83 84 )); 84 85 }
+6 -15
webroot/rsrc/js/application/conpherence/behavior-menu.js
··· 47 47 thread.selected = data.id; 48 48 49 49 JX.History.replace(config.base_uri + data.id + '/'); 50 + document.title = data.title; 51 + 50 52 redrawthread(); 51 53 } 52 54 ··· 139 141 var form = JX.DOM.find(root, 'form', 'conpherence-pontificate'); 140 142 var data = e.getNodeData('conpherence-edit-metadata'); 141 143 var header = JX.DOM.find(root, 'div', 'conpherence-header'); 142 - var peopleWidget = null; 143 - try { 144 - peopleWidget = JX.DOM.find(root, 'div', 'widgets-people'); 145 - } catch (ex) { 146 - // Ignore; maybe no people widget 147 - } 144 + var messages = JX.DOM.find(root, 'div', 'conpherence-messages'); 148 145 149 146 new JX.Workflow.newFromForm(form, data) 150 147 .setHandler(JX.bind(this, function(r) { 151 - // update the header 148 + JX.DOM.appendContent(messages, JX.$H(r.transactions)); 149 + messages.scrollTop = messages.scrollHeight; 150 + 152 151 JX.DOM.setContent( 153 152 header, 154 153 JX.$H(r.header) ··· 167 166 ); 168 167 } catch (ex) { 169 168 // Ignore; this view may not have a menu. 170 - } 171 - 172 - if (peopleWidget) { 173 - // update the people widget 174 - JX.DOM.setContent( 175 - peopleWidget, 176 - JX.$H(r.people_widget) 177 - ); 178 169 } 179 170 })) 180 171 .start();
+10 -30
webroot/rsrc/js/application/conpherence/behavior-pontificate.js
··· 15 15 16 16 var root = e.getNode('conpherence-layout'); 17 17 var messages = JX.DOM.find(root, 'div', 'conpherence-messages'); 18 - var header = JX.DOM.find(root, 'div', 'conpherence-header'); 19 18 var fileWidget = null; 20 19 try { 21 20 fileWidget = JX.DOM.find(root, 'div', 'widgets-files'); 22 21 } catch (ex) { 23 22 // Ignore; maybe no files widget 24 23 } 25 - var peopleWidget = null; 26 - try { 27 - peopleWidget = JX.DOM.find(root, 'div', 'widgets-people'); 28 - } catch (ex) { 29 - // Ignore; maybe no peoples widget 30 - } 31 24 32 25 JX.Workflow.newFromForm(form) 33 26 .setHandler(JX.bind(this, function(r) { 34 - // add the new transactions, probably just our post but who knows 35 27 JX.DOM.appendContent(messages, JX.$H(r.transactions)); 36 28 messages.scrollTop = messages.scrollHeight; 37 - JX.DOM.setContent(header, JX.$H(r.header)); 38 - 39 - try { 40 - var node = JX.$(r.conpherence_phid + '-nav-item'); 41 - JX.DOM.replace( 42 - node, 43 - JX.$H(r.nav_item)); 44 - JX.Stratcom.invoke( 45 - 'conpherence-selectthread', 46 - null, 47 - { id : r.conpherence_phid + '-nav-item' } 48 - ); 49 - } catch (ex) { 50 - // Ignore; this view may not have a menu. 51 - } 52 29 53 30 if (fileWidget) { 54 31 JX.DOM.setContent( 55 32 fileWidget, 56 33 JX.$H(r.file_widget) 57 - ); 58 - } 59 - 60 - if (peopleWidget) { 61 - JX.DOM.setContent( 62 - peopleWidget, 63 - JX.$H(r.people_widget) 64 34 ); 65 35 } 66 36 ··· 74 44 75 45 var textarea = JX.DOM.find(form, 'textarea'); 76 46 textarea.value = ''; 47 + 48 + try { 49 + JX.Stratcom.invoke( 50 + 'conpherence-selectthread', 51 + null, 52 + { id : r.conpherence_phid + '-nav-item' } 53 + ); 54 + } catch (ex) { 55 + // Ignore; this view may not have a menu. 56 + } 77 57 })) 78 58 .start(); 79 59 };
+8 -23
webroot/rsrc/js/application/conpherence/behavior-widget-pane.js
··· 49 49 var form = e.getNode('tag:form'); 50 50 var data = e.getNodeData('add-person'); 51 51 var peopleRoot = e.getNode('widgets-people'); 52 - var messages = JX.DOM.find(root, 'div', 'conpherence-messages'); 53 - var header = JX.DOM.find(root, 'div', 'conpherence-header'); 52 + var messages = null; 53 + try { 54 + messages = JX.DOM.find(root, 'div', 'conpherence-messages'); 55 + } catch (ex) { 56 + } 54 57 var latestTransactionData = JX.Stratcom.getData( 55 58 JX.DOM.find( 56 59 root, ··· 60 63 data.latest_transaction_id = latestTransactionData.id; 61 64 JX.Workflow.newFromForm(form, data) 62 65 .setHandler(JX.bind(this, function (r) { 63 - // update the transactions 64 - JX.DOM.appendContent(messages, JX.$H(r.transactions)); 65 - messages.scrollTop = messages.scrollHeight; 66 - 67 - try { 68 - JX.DOM.replace( 69 - JX.$(r.conpherence_phid + '-nav-item'), 70 - JX.$H(r.nav_item)); 71 - JX.Stratcom.invoke( 72 - 'conpherence-selectthread', 73 - null, 74 - { id : r.conpherence_phid + '-nav-item' } 75 - ); 76 - } catch (ex) { 77 - // Ignore; this view may not have a menu. 66 + if (messages) { 67 + JX.DOM.appendContent(messages, JX.$H(r.transactions)); 68 + messages.scrollTop = messages.scrollHeight; 78 69 } 79 - 80 - // update the header 81 - JX.DOM.setContent( 82 - header, 83 - JX.$H(r.header) 84 - ); 85 70 86 71 // update the people widget 87 72 JX.DOM.setContent(