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

Improve workboard "Owner" grouping, add "Author" grouping and "Title" sort

Summary:
Depends on D20277. Ref T10333.

- Put profile icons on "Group by Owner".
- Add a similar "Group by Author". Probably not terribly useful, but cheap to implement now.
- Add "Sort by Title". Very likely not terribly useful, but cheap to implement and sort of flexible?

Test Plan: {F6265396}

Reviewers: amckinley

Reviewed By: amckinley

Maniphest Tasks: T10333

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

+223 -13
+5 -5
resources/celerity/map.php
··· 178 178 'rsrc/css/phui/workboards/phui-workboard-color.css' => 'e86de308', 179 179 'rsrc/css/phui/workboards/phui-workboard.css' => '74fc9d98', 180 180 'rsrc/css/phui/workboards/phui-workcard.css' => '9e9eb0df', 181 - 'rsrc/css/phui/workboards/phui-workpanel.css' => 'bc16cf33', 181 + 'rsrc/css/phui/workboards/phui-workpanel.css' => 'c5b408ad', 182 182 'rsrc/css/sprite-login.css' => '18b368a6', 183 183 'rsrc/css/sprite-tokens.css' => 'f1896dc5', 184 184 'rsrc/css/syntax/syntax-default.css' => '055fc231', ··· 860 860 'phui-workboard-color-css' => 'e86de308', 861 861 'phui-workboard-view-css' => '74fc9d98', 862 862 'phui-workcard-view-css' => '9e9eb0df', 863 - 'phui-workpanel-view-css' => 'bc16cf33', 863 + 'phui-workpanel-view-css' => 'c5b408ad', 864 864 'phuix-action-list-view' => 'c68f183f', 865 865 'phuix-action-view' => 'aaa08f3b', 866 866 'phuix-autocomplete' => '8f139ef0', ··· 1906 1906 'javelin-uri', 1907 1907 'phabricator-notification', 1908 1908 ), 1909 - 'bc16cf33' => array( 1910 - 'phui-workcard-view-css', 1911 - ), 1912 1909 'bdce4d78' => array( 1913 1910 'javelin-install', 1914 1911 'javelin-util', ··· 1938 1935 'javelin-aphlict', 1939 1936 'phabricator-phtize', 1940 1937 'javelin-dom', 1938 + ), 1939 + 'c5b408ad' => array( 1940 + 'phui-workcard-view-css', 1941 1941 ), 1942 1942 'c687e867' => array( 1943 1943 'javelin-behavior',
+4
src/__phutil_library_map__.php
··· 4050 4050 'PhabricatorProjectColorTransaction' => 'applications/project/xaction/PhabricatorProjectColorTransaction.php', 4051 4051 'PhabricatorProjectColorsConfigType' => 'applications/project/config/PhabricatorProjectColorsConfigType.php', 4052 4052 'PhabricatorProjectColumn' => 'applications/project/storage/PhabricatorProjectColumn.php', 4053 + 'PhabricatorProjectColumnAuthorOrder' => 'applications/project/order/PhabricatorProjectColumnAuthorOrder.php', 4053 4054 'PhabricatorProjectColumnCreatedOrder' => 'applications/project/order/PhabricatorProjectColumnCreatedOrder.php', 4054 4055 'PhabricatorProjectColumnDetailController' => 'applications/project/controller/PhabricatorProjectColumnDetailController.php', 4055 4056 'PhabricatorProjectColumnEditController' => 'applications/project/controller/PhabricatorProjectColumnEditController.php', ··· 4066 4067 'PhabricatorProjectColumnQuery' => 'applications/project/query/PhabricatorProjectColumnQuery.php', 4067 4068 'PhabricatorProjectColumnSearchEngine' => 'applications/project/query/PhabricatorProjectColumnSearchEngine.php', 4068 4069 'PhabricatorProjectColumnStatusOrder' => 'applications/project/order/PhabricatorProjectColumnStatusOrder.php', 4070 + 'PhabricatorProjectColumnTitleOrder' => 'applications/project/order/PhabricatorProjectColumnTitleOrder.php', 4069 4071 'PhabricatorProjectColumnTransaction' => 'applications/project/storage/PhabricatorProjectColumnTransaction.php', 4070 4072 'PhabricatorProjectColumnTransactionEditor' => 'applications/project/editor/PhabricatorProjectColumnTransactionEditor.php', 4071 4073 'PhabricatorProjectColumnTransactionQuery' => 'applications/project/query/PhabricatorProjectColumnTransactionQuery.php', ··· 10138 10140 'PhabricatorExtendedPolicyInterface', 10139 10141 'PhabricatorConduitResultInterface', 10140 10142 ), 10143 + 'PhabricatorProjectColumnAuthorOrder' => 'PhabricatorProjectColumnOrder', 10141 10144 'PhabricatorProjectColumnCreatedOrder' => 'PhabricatorProjectColumnOrder', 10142 10145 'PhabricatorProjectColumnDetailController' => 'PhabricatorProjectBoardController', 10143 10146 'PhabricatorProjectColumnEditController' => 'PhabricatorProjectBoardController', ··· 10157 10160 'PhabricatorProjectColumnQuery' => 'PhabricatorCursorPagedPolicyAwareQuery', 10158 10161 'PhabricatorProjectColumnSearchEngine' => 'PhabricatorApplicationSearchEngine', 10159 10162 'PhabricatorProjectColumnStatusOrder' => 'PhabricatorProjectColumnOrder', 10163 + 'PhabricatorProjectColumnTitleOrder' => 'PhabricatorProjectColumnOrder', 10160 10164 'PhabricatorProjectColumnTransaction' => 'PhabricatorApplicationTransaction', 10161 10165 'PhabricatorProjectColumnTransactionEditor' => 'PhabricatorApplicationTransactionEditor', 10162 10166 'PhabricatorProjectColumnTransactionQuery' => 'PhabricatorApplicationTransactionQuery',
+139
src/applications/project/order/PhabricatorProjectColumnAuthorOrder.php
··· 1 + <?php 2 + 3 + final class PhabricatorProjectColumnAuthorOrder 4 + extends PhabricatorProjectColumnOrder { 5 + 6 + const ORDERKEY = 'author'; 7 + 8 + public function getDisplayName() { 9 + return pht('Group by Author'); 10 + } 11 + 12 + protected function newMenuIconIcon() { 13 + return 'fa-user-plus'; 14 + } 15 + 16 + public function getHasHeaders() { 17 + return true; 18 + } 19 + 20 + public function getCanReorder() { 21 + return false; 22 + } 23 + 24 + public function getMenuOrder() { 25 + return 3000; 26 + } 27 + 28 + protected function newHeaderKeyForObject($object) { 29 + return $this->newHeaderKeyForAuthorPHID($object->getAuthorPHID()); 30 + } 31 + 32 + private function newHeaderKeyForAuthorPHID($author_phid) { 33 + return sprintf('author(%s)', $author_phid); 34 + } 35 + 36 + protected function newSortVectorsForObjects(array $objects) { 37 + $author_phids = mpull($objects, null, 'getAuthorPHID'); 38 + $author_phids = array_keys($author_phids); 39 + $author_phids = array_filter($author_phids); 40 + 41 + if ($author_phids) { 42 + $author_users = id(new PhabricatorPeopleQuery()) 43 + ->setViewer($this->getViewer()) 44 + ->withPHIDs($author_phids) 45 + ->execute(); 46 + $author_users = mpull($author_users, null, 'getPHID'); 47 + } else { 48 + $author_users = array(); 49 + } 50 + 51 + $vectors = array(); 52 + foreach ($objects as $vector_key => $object) { 53 + $author_phid = $object->getAuthorPHID(); 54 + $author = idx($author_users, $author_phid); 55 + if ($author) { 56 + $vector = $this->newSortVectorForAuthor($author); 57 + } else { 58 + $vector = $this->newSortVectorForAuthorPHID($author_phid); 59 + } 60 + 61 + $vectors[$vector_key] = $vector; 62 + } 63 + 64 + return $vectors; 65 + } 66 + 67 + private function newSortVectorForAuthor(PhabricatorUser $user) { 68 + return array( 69 + 1, 70 + $user->getUsername(), 71 + ); 72 + } 73 + 74 + private function newSortVectorForAuthorPHID($author_phid) { 75 + return array( 76 + 2, 77 + $author_phid, 78 + ); 79 + } 80 + 81 + protected function newHeadersForObjects(array $objects) { 82 + $author_phids = mpull($objects, null, 'getAuthorPHID'); 83 + $author_phids = array_keys($author_phids); 84 + $author_phids = array_filter($author_phids); 85 + 86 + if ($author_phids) { 87 + $author_users = id(new PhabricatorPeopleQuery()) 88 + ->setViewer($this->getViewer()) 89 + ->withPHIDs($author_phids) 90 + ->needProfileImage(true) 91 + ->execute(); 92 + $author_users = mpull($author_users, null, 'getPHID'); 93 + } else { 94 + $author_users = array(); 95 + } 96 + 97 + $headers = array(); 98 + foreach ($author_phids as $author_phid) { 99 + $header_key = $this->newHeaderKeyForAuthorPHID($author_phid); 100 + 101 + $author = idx($author_users, $author_phid); 102 + if ($author) { 103 + $sort_vector = $this->newSortVectorForAuthor($author); 104 + $author_name = $author->getUsername(); 105 + $author_image = $author->getProfileImageURI(); 106 + } else { 107 + $sort_vector = $this->newSortVectorForAuthorPHID($author_phid); 108 + $author_name = pht('Unknown User ("%s")', $author_phid); 109 + $author_image = null; 110 + } 111 + 112 + $author_icon = 'fa-user'; 113 + $author_color = 'bluegrey'; 114 + 115 + $icon_view = id(new PHUIIconView()); 116 + 117 + if ($author_image) { 118 + $icon_view->setImage($author_image); 119 + } else { 120 + $icon_view->setIcon($author_icon, $author_color); 121 + } 122 + 123 + $header = $this->newHeader() 124 + ->setHeaderKey($header_key) 125 + ->setSortVector($sort_vector) 126 + ->setName($author_name) 127 + ->setIcon($icon_view) 128 + ->setEditProperties( 129 + array( 130 + 'value' => $author_phid, 131 + )); 132 + 133 + $headers[] = $header; 134 + } 135 + 136 + return $headers; 137 + } 138 + 139 + }
+1 -1
src/applications/project/order/PhabricatorProjectColumnCreatedOrder.php
··· 22 22 } 23 23 24 24 public function getMenuOrder() { 25 - return 3000; 25 + return 5000; 26 26 } 27 27 28 28 protected function newSortVectorForObject($object) {
+6 -1
src/applications/project/order/PhabricatorProjectColumnHeader.php
··· 85 85 ), 86 86 array( 87 87 $icon_view, 88 - $name, 88 + phutil_tag( 89 + 'span', 90 + array( 91 + 'class' => 'workboard-group-header-name', 92 + ), 93 + $name), 89 94 )); 90 95 91 96 return $template;
+10 -2
src/applications/project/order/PhabricatorProjectColumnOwnerOrder.php
··· 108 108 $owner_users = id(new PhabricatorPeopleQuery()) 109 109 ->setViewer($this->getViewer()) 110 110 ->withPHIDs($owner_phids) 111 + ->needProfileImage(true) 111 112 ->execute(); 112 113 $owner_users = mpull($owner_users, null, 'getPHID'); 113 114 } else { ··· 120 121 foreach ($owner_phids as $owner_phid) { 121 122 $header_key = $this->newHeaderKeyForOwnerPHID($owner_phid); 122 123 124 + $owner_image = null; 123 125 if ($owner_phid === null) { 124 126 $owner = null; 125 127 $sort_vector = $this->newSortVectorForUnowned(); ··· 129 131 if ($owner) { 130 132 $sort_vector = $this->newSortVectorForOwner($owner); 131 133 $owner_name = $owner->getUsername(); 134 + $owner_image = $owner->getProfileImageURI(); 132 135 } else { 133 136 $sort_vector = $this->newSortVectorForOwnerPHID($owner_phid); 134 137 $owner_name = pht('Unknown User ("%s")', $owner_phid); ··· 138 141 $owner_icon = 'fa-user'; 139 142 $owner_color = 'bluegrey'; 140 143 141 - $icon_view = id(new PHUIIconView()) 142 - ->setIcon($owner_icon, $owner_color); 144 + $icon_view = id(new PHUIIconView()); 145 + 146 + if ($owner_image) { 147 + $icon_view->setImage($owner_image); 148 + } else { 149 + $icon_view->setIcon($owner_icon, $owner_color); 150 + } 143 151 144 152 $header = $this->newHeader() 145 153 ->setHeaderKey($header_key)
+1 -1
src/applications/project/order/PhabricatorProjectColumnPointsOrder.php
··· 26 26 } 27 27 28 28 public function getMenuOrder() { 29 - return 4000; 29 + return 6000; 30 30 } 31 31 32 32 protected function newSortVectorForObject($object) {
+1 -1
src/applications/project/order/PhabricatorProjectColumnStatusOrder.php
··· 22 22 } 23 23 24 24 public function getMenuOrder() { 25 - return 3000; 25 + return 4000; 26 26 } 27 27 28 28 protected function newHeaderKeyForObject($object) {
+34
src/applications/project/order/PhabricatorProjectColumnTitleOrder.php
··· 1 + <?php 2 + 3 + final class PhabricatorProjectColumnTitleOrder 4 + extends PhabricatorProjectColumnOrder { 5 + 6 + const ORDERKEY = 'title'; 7 + 8 + public function getDisplayName() { 9 + return pht('Sort by Title'); 10 + } 11 + 12 + protected function newMenuIconIcon() { 13 + return 'fa-sort-alpha-asc'; 14 + } 15 + 16 + public function getHasHeaders() { 17 + return false; 18 + } 19 + 20 + public function getCanReorder() { 21 + return false; 22 + } 23 + 24 + public function getMenuOrder() { 25 + return 7000; 26 + } 27 + 28 + protected function newSortVectorForObject($object) { 29 + return array( 30 + $object->getTitle(), 31 + ); 32 + } 33 + 34 + }
+22 -2
webroot/rsrc/css/phui/workboards/phui-workpanel.css
··· 148 148 149 149 .workboard-group-header { 150 150 background: rgba({$alphablue}, 0.10); 151 - padding: 4px 8px; 151 + padding: 6px 8px; 152 152 margin: 0 0 8px -8px; 153 153 border-bottom: 1px solid {$lightgreyborder}; 154 154 font-weight: bold; 155 155 color: {$darkgreytext}; 156 + position: relative; 156 157 } 157 158 158 159 .workboard-group-header .phui-icon-view { 159 - margin-right: 8px; 160 + position: absolute; 161 + display: inline-block; 162 + width: 24px; 163 + padding: 5px 0 0 0; 164 + height: 19px; 165 + background-size: 100%; 166 + border-radius: 3px; 167 + background-repeat: no-repeat; 168 + text-align: center; 169 + background-color: {$lightgreybackground}; 170 + border: 1px solid {$lightgreybackground}; 171 + } 172 + 173 + .workboard-group-header .workboard-group-header-name { 174 + display: block; 175 + position: relative; 176 + height: 24px; 177 + line-height: 24px; 178 + margin-left: 36px; 179 + overflow: hidden; 160 180 }