@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 - add icon-based room switcher to durable column view

Summary: Ref T7380. This does the most basic thing ever and sticks up to 6 icons in there.

Test Plan: clicked the icons and noted new conpherences loaded in nicely

Reviewers: epriestley, chad

Reviewed By: epriestley

Subscribers: Korvin, epriestley

Maniphest Tasks: T7380

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

+154 -61
+68 -52
resources/celerity/map.php
··· 44 44 'rsrc/css/application/config/config-welcome.css' => '6abd79be', 45 45 'rsrc/css/application/config/setup-issue.css' => '22270af2', 46 46 'rsrc/css/application/config/unhandled-exception.css' => '37d4f9a2', 47 - 'rsrc/css/application/conpherence/durable-column.css' => '9207426d', 47 + 'rsrc/css/application/conpherence/durable-column.css' => '7abcc3f2', 48 48 'rsrc/css/application/conpherence/menu.css' => 'c6ac5299', 49 49 'rsrc/css/application/conpherence/message-pane.css' => '5930260a', 50 50 'rsrc/css/application/conpherence/notification.css' => '04a6e10a', ··· 207 207 'rsrc/externals/javelin/lib/Resource.js' => '44959b73', 208 208 'rsrc/externals/javelin/lib/Routable.js' => 'b3e7d692', 209 209 'rsrc/externals/javelin/lib/Router.js' => '29274e2b', 210 - 'rsrc/externals/javelin/lib/Scrollbar.js' => '1ed54a27', 211 - 'rsrc/externals/javelin/lib/Sound.js' => '59655c83', 210 + 'rsrc/externals/javelin/lib/Scrollbar.js' => '1feea462', 211 + 'rsrc/externals/javelin/lib/Sound.js' => '949c0fe5', 212 212 'rsrc/externals/javelin/lib/URI.js' => '6eff08aa', 213 213 'rsrc/externals/javelin/lib/Vector.js' => '2caa8fb8', 214 214 'rsrc/externals/javelin/lib/WebSocket.js' => 'e292eaf4', ··· 352 352 'rsrc/js/application/aphlict/behavior-aphlict-status.js' => 'ea681761', 353 353 'rsrc/js/application/auth/behavior-persona-login.js' => '9414ff18', 354 354 'rsrc/js/application/config/behavior-reorder-fields.js' => '14a827de', 355 - 'rsrc/js/application/conpherence/behavior-durable-column.js' => 'e4affa94', 356 - 'rsrc/js/application/conpherence/behavior-menu.js' => '869e3445', 357 - 'rsrc/js/application/conpherence/behavior-pontificate.js' => '86df5915', 358 - 'rsrc/js/application/conpherence/behavior-widget-pane.js' => '40b1ff90', 355 + 'rsrc/js/application/conpherence/ConpherenceThreadManager.js' => 'efef202b', 356 + 'rsrc/js/application/conpherence/behavior-durable-column.js' => 'd8dab826', 357 + 'rsrc/js/application/conpherence/behavior-menu.js' => 'e476c952', 358 + 'rsrc/js/application/conpherence/behavior-pontificate.js' => '21ba5861', 359 + 'rsrc/js/application/conpherence/behavior-widget-pane.js' => '2c1cd7f5', 359 360 'rsrc/js/application/countdown/timer.js' => 'e4cc26b3', 360 361 'rsrc/js/application/dashboard/behavior-dashboard-async-panel.js' => '469c0d9e', 361 362 'rsrc/js/application/dashboard/behavior-dashboard-move-panels.js' => '82439934', ··· 513 514 'changeset-view-manager' => '88be0133', 514 515 'config-options-css' => '7fedf08b', 515 516 'config-welcome-css' => '6abd79be', 516 - 'conpherence-durable-column-view' => '9207426d', 517 + 'conpherence-durable-column-view' => '7abcc3f2', 517 518 'conpherence-menu-css' => 'c6ac5299', 518 519 'conpherence-message-pane-css' => '5930260a', 519 520 'conpherence-notification-css' => '04a6e10a', 521 + 'conpherence-thread-manager' => 'efef202b', 520 522 'conpherence-update-css' => '1099a660', 521 523 'conpherence-widget-pane-css' => '3d575438', 522 524 'differential-changeset-view-css' => '6a8b172a', ··· 556 558 'javelin-behavior-boards-dropdown' => '0ec56e1d', 557 559 'javelin-behavior-choose-control' => '6153c708', 558 560 'javelin-behavior-config-reorder-fields' => '14a827de', 559 - 'javelin-behavior-conpherence-menu' => '869e3445', 560 - 'javelin-behavior-conpherence-pontificate' => '86df5915', 561 - 'javelin-behavior-conpherence-widget-pane' => '40b1ff90', 561 + 'javelin-behavior-conpherence-menu' => 'e476c952', 562 + 'javelin-behavior-conpherence-pontificate' => '21ba5861', 563 + 'javelin-behavior-conpherence-widget-pane' => '2c1cd7f5', 562 564 'javelin-behavior-countdown-timer' => 'e4cc26b3', 563 565 'javelin-behavior-dark-console' => '08883e8b', 564 566 'javelin-behavior-dashboard-async-panel' => '469c0d9e', ··· 583 585 'javelin-behavior-diffusion-locate-file' => '6d3e1947', 584 586 'javelin-behavior-diffusion-pull-lastmodified' => '2b228192', 585 587 'javelin-behavior-doorkeeper-tag' => 'e5822781', 586 - 'javelin-behavior-durable-column' => 'e4affa94', 588 + 'javelin-behavior-durable-column' => 'd8dab826', 587 589 'javelin-behavior-error-log' => '6882e80a', 588 590 'javelin-behavior-fancy-datepicker' => 'c51ae228', 589 591 'javelin-behavior-global-drag-and-drop' => '07f199d8', ··· 677 679 'javelin-resource' => '44959b73', 678 680 'javelin-routable' => 'b3e7d692', 679 681 'javelin-router' => '29274e2b', 680 - 'javelin-scrollbar' => '1ed54a27', 681 - 'javelin-sound' => '59655c83', 682 + 'javelin-scrollbar' => '1feea462', 683 + 'javelin-sound' => '949c0fe5', 682 684 'javelin-stratcom' => '6c53634d', 683 685 'javelin-tokenizer' => '7644823e', 684 686 'javelin-typeahead' => '70baed2f', ··· 952 954 'javelin-dom', 953 955 'javelin-reactor-dom', 954 956 ), 955 - '1ed54a27' => array( 957 + '1feea462' => array( 956 958 'javelin-install', 957 959 'javelin-dom', 958 960 'javelin-stratcom', ··· 969 971 'phuix-action-view', 970 972 'phabricator-phtize', 971 973 'changeset-view-manager', 974 + ), 975 + '21ba5861' => array( 976 + 'javelin-behavior', 977 + 'javelin-dom', 978 + 'javelin-util', 979 + 'javelin-workflow', 980 + 'javelin-stratcom', 981 + 'conpherence-thread-manager', 972 982 ), 973 983 '2290aeef' => array( 974 984 'javelin-install', ··· 1014 1024 'javelin-stratcom', 1015 1025 'javelin-dom', 1016 1026 ), 1027 + '2c1cd7f5' => array( 1028 + 'javelin-behavior', 1029 + 'javelin-dom', 1030 + 'javelin-stratcom', 1031 + 'javelin-workflow', 1032 + 'javelin-util', 1033 + 'phabricator-notification', 1034 + 'javelin-behavior-device', 1035 + 'phuix-dropdown-menu', 1036 + 'phuix-action-list-view', 1037 + 'phuix-action-view', 1038 + 'conpherence-thread-manager', 1039 + ), 1017 1040 '2c426492' => array( 1018 1041 'javelin-behavior', 1019 1042 'javelin-dom', ··· 1069 1092 'javelin-dom', 1070 1093 'javelin-reactor-dom', 1071 1094 ), 1072 - '40b1ff90' => array( 1073 - 'javelin-behavior', 1074 - 'javelin-dom', 1075 - 'javelin-stratcom', 1076 - 'javelin-workflow', 1077 - 'javelin-util', 1078 - 'phabricator-notification', 1079 - 'javelin-behavior-device', 1080 - 'phuix-dropdown-menu', 1081 - 'phuix-action-list-view', 1082 - 'phuix-action-view', 1083 - ), 1084 1095 42126667 => array( 1085 1096 'javelin-behavior', 1086 1097 'javelin-dom', ··· 1176 1187 'javelin-behavior', 1177 1188 'javelin-vector', 1178 1189 'javelin-dom', 1179 - ), 1180 - '59655c83' => array( 1181 - 'javelin-install', 1182 1190 ), 1183 1191 '59b251eb' => array( 1184 1192 'javelin-behavior', ··· 1439 1447 'phabricator-tooltip', 1440 1448 'changeset-view-manager', 1441 1449 ), 1442 - '869e3445' => array( 1443 - 'javelin-behavior', 1444 - 'javelin-dom', 1445 - 'javelin-util', 1446 - 'javelin-stratcom', 1447 - 'javelin-workflow', 1448 - 'javelin-behavior-device', 1449 - 'javelin-history', 1450 - 'javelin-vector', 1451 - 'phabricator-shaped-request', 1452 - ), 1453 - '86df5915' => array( 1454 - 'javelin-behavior', 1455 - 'javelin-dom', 1456 - 'javelin-util', 1457 - 'javelin-workflow', 1458 - 'javelin-stratcom', 1459 - ), 1460 1450 '87cb6b51' => array( 1461 1451 'javelin-behavior', 1462 1452 'javelin-dom', ··· 1552 1542 'javelin-stratcom', 1553 1543 'javelin-workflow', 1554 1544 'javelin-util', 1545 + ), 1546 + '949c0fe5' => array( 1547 + 'javelin-install', 1555 1548 ), 1556 1549 '94b750d2' => array( 1557 1550 'javelin-install', ··· 1793 1786 'javelin-util', 1794 1787 'phabricator-shaped-request', 1795 1788 ), 1789 + 'd8dab826' => array( 1790 + 'javelin-behavior', 1791 + 'javelin-dom', 1792 + 'javelin-stratcom', 1793 + 'javelin-scrollbar', 1794 + 'javelin-quicksand', 1795 + 'phabricator-keyboard-shortcut', 1796 + 'conpherence-thread-manager', 1797 + ), 1796 1798 'dbbf48b6' => array( 1797 1799 'javelin-behavior', 1798 1800 'javelin-stratcom', ··· 1842 1844 'javelin-dom', 1843 1845 'javelin-uri', 1844 1846 ), 1845 - 'e4affa94' => array( 1847 + 'e476c952' => array( 1846 1848 'javelin-behavior', 1847 1849 'javelin-dom', 1850 + 'javelin-util', 1848 1851 'javelin-stratcom', 1849 - 'javelin-scrollbar', 1850 - 'javelin-quicksand', 1851 - 'phabricator-keyboard-shortcut', 1852 + 'javelin-workflow', 1853 + 'javelin-behavior-device', 1854 + 'javelin-history', 1855 + 'javelin-vector', 1856 + 'phabricator-shaped-request', 1857 + 'conpherence-thread-manager', 1852 1858 ), 1853 1859 'e4cc26b3' => array( 1854 1860 'javelin-behavior', ··· 1896 1902 'efe49472' => array( 1897 1903 'javelin-install', 1898 1904 'javelin-util', 1905 + ), 1906 + 'efef202b' => array( 1907 + 'javelin-dom', 1908 + 'javelin-util', 1909 + 'javelin-stratcom', 1910 + 'javelin-install', 1911 + 'javelin-workflow', 1912 + 'javelin-router', 1913 + 'javelin-behavior-device', 1914 + 'javelin-vector', 1899 1915 ), 1900 1916 'f24f3253' => array( 1901 1917 'javelin-behavior',
+20 -7
src/applications/conpherence/controller/ConpherenceColumnViewController.php
··· 6 6 public function handleRequest(AphrontRequest $request) { 7 7 $user = $request->getUser(); 8 8 9 + $latest_conpherences = array(); 10 + $latest_participant = id(new ConpherenceParticipantQuery()) 11 + ->withParticipantPHIDs(array($user->getPHID())) 12 + ->setLimit(6) 13 + ->execute(); 14 + if ($latest_participant) { 15 + $conpherence_phids = mpull($latest_participant, 'getConpherencePHID'); 16 + $latest_conpherences = id(new ConpherenceThreadQuery()) 17 + ->setViewer($user) 18 + ->withPHIDs($conpherence_phids) 19 + ->needParticipantCache(true) 20 + ->execute(); 21 + $latest_conpherences = mpull($latest_conpherences, null, 'getPHID'); 22 + $latest_conpherences = array_select_keys( 23 + $latest_conpherences, 24 + $conpherence_phids); 25 + } 26 + 9 27 $conpherence = null; 10 28 if ($request->getInt('id')) { 11 29 $conpherence = id(new ConpherenceThreadQuery()) ··· 14 32 ->needTransactions(true) 15 33 ->setTransactionLimit(ConpherenceThreadQuery::TRANSACTION_LIMIT) 16 34 ->executeOne(); 17 - } else { 18 - // TODO - should be pulling more data than this to build the 19 - // icon bar, etc, kind of always 20 - $latest_participant = id(new ConpherenceParticipantQuery()) 21 - ->withParticipantPHIDs(array($user->getPHID())) 22 - ->setLimit(1) 23 - ->execute(); 35 + } else if ($latest_participant) { 24 36 $participant = head($latest_participant); 25 37 $conpherence = id(new ConpherenceThreadQuery()) 26 38 ->setViewer($user) ··· 45 57 $durable_column = id(new ConpherenceDurableColumnView()) 46 58 ->setUser($user) 47 59 ->setSelectedConpherence($conpherence) 60 + ->setConpherences($latest_conpherences) 48 61 ->setStyle(null); 49 62 50 63 $response = array(
+30 -1
src/applications/conpherence/view/ConpherenceDurableColumnView.php
··· 129 129 } 130 130 131 131 private function buildIconBar() { 132 - return null; 132 + $icons = array(); 133 + $selected_conpherence = $this->getSelectedConpherence(); 134 + $conpherences = $this->getConpherences(); 135 + 136 + foreach ($conpherences as $conpherence) { 137 + $classes = array('conpherence-durable-column-thread-icon'); 138 + if ($selected_conpherence->getID() == $conpherence->getID()) { 139 + $classes[] = 'selected'; 140 + } 141 + $data = $conpherence->getDisplayData($this->getUser()); 142 + $image = $data['image']; 143 + $icons[] = 144 + javelin_tag( 145 + 'a', 146 + array( 147 + 'href' => '/conpherence/columnview/', 148 + 'class' => implode(' ', $classes), 149 + 'sigil' => 'conpherence-durable-column-thread-icon', 150 + 'meta' => array( 151 + 'threadID' => $conpherence->getID(), 152 + ), 153 + ), 154 + phutil_tag( 155 + 'span', 156 + array( 157 + 'style' => 'background-image: url('.$image.')', 158 + ), 159 + '')); 160 + } 161 + return $icons; 133 162 } 134 163 135 164 private function buildHeader() {
+27 -1
webroot/rsrc/css/application/conpherence/durable-column.css
··· 55 55 56 56 .conpherence-durable-column-icon-bar { 57 57 height: 34px; 58 - padding: 5px 16px; 58 + padding: 5px 12px; 59 59 border-bottom: 1px solid {$thinblueborder}; 60 + } 61 + 62 + .conpherence-durable-column-icon-bar .conpherence-durable-column-thread-icon { 63 + float: left; 64 + display: block; 65 + width: 30px; 66 + height: 30px; 67 + margin: 0px 8px 0px 0px; 68 + border: 2px solid transparent; 69 + border-radius: 3px; 70 + } 71 + 72 + .conpherence-durable-column-icon-bar 73 + .conpherence-durable-column-thread-icon.selected { 74 + border-color: {$blueborder}; 75 + } 76 + 77 + .conpherence-durable-column-icon-bar 78 + .conpherence-durable-column-thread-icon span { 79 + position: relative; 80 + display: block; 81 + width: 26px; 82 + height: 26px; 83 + top: 2px; 84 + left: 2px; 85 + background-size: 26px 26px; 60 86 } 61 87 62 88 .conpherence-durable-column-body {
+9
webroot/rsrc/js/application/conpherence/behavior-durable-column.js
··· 141 141 } 142 142 }); 143 143 144 + JX.Stratcom.listen( 145 + 'click', 146 + 'conpherence-durable-column-thread-icon', 147 + function (e) { 148 + e.kill(); 149 + var data = e.getNodeData('conpherence-durable-column-thread-icon'); 150 + threadManager.loadThreadByID(data.threadID); 151 + }); 152 + 144 153 function _getColumnBodyNode() { 145 154 var column = JX.$('conpherence-durable-column'); 146 155 return JX.DOM.find(