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

Add a "WorkboardCardTemplate" class to make workboard client code easier to reason about

Summary:
Depends on D20266. Boards currently have several `whateverMap<cardPHID => stuff>` properties, but we can just move these all down into a `CardTemplate`, similar to the recently introduced `HeaderTemplate`.

The `CardTemplate` holds all the global information for a card, and then `Card` is specific for a particular copy in a column. Today, each `CardTemplate` has one `Card`, but a `CardTemplate` may have more than one card in the future (when we add subproject columns).

Test Plan: Viewed workboards in different sort orders and dragged stuff around, grepped for all affected symbols.

Reviewers: amckinley

Reviewed By: amckinley

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

+140 -88
+41 -35
resources/celerity/map.php
··· 408 408 'rsrc/js/application/phortune/phortune-credit-card-form.js' => 'd12d214f', 409 409 'rsrc/js/application/policy/behavior-policy-control.js' => '0eaa33a9', 410 410 'rsrc/js/application/policy/behavior-policy-rule-editor.js' => '9347f172', 411 - 'rsrc/js/application/projects/WorkboardBoard.js' => '902a1551', 412 - 'rsrc/js/application/projects/WorkboardCard.js' => '887ef74f', 413 - 'rsrc/js/application/projects/WorkboardColumn.js' => '01ea93b3', 411 + 'rsrc/js/application/projects/WorkboardBoard.js' => '2181739b', 412 + 'rsrc/js/application/projects/WorkboardCard.js' => 'bc92741f', 413 + 'rsrc/js/application/projects/WorkboardCardTemplate.js' => 'b0b5f90a', 414 + 'rsrc/js/application/projects/WorkboardColumn.js' => '6461f58b', 414 415 'rsrc/js/application/projects/WorkboardController.js' => '42c7a5a7', 415 416 'rsrc/js/application/projects/WorkboardHeader.js' => '6e75daea', 416 417 'rsrc/js/application/projects/WorkboardHeaderTemplate.js' => '2d641f7d', 417 - 'rsrc/js/application/projects/behavior-project-boards.js' => 'e2730b90', 418 + 'rsrc/js/application/projects/behavior-project-boards.js' => 'cca3f5f8', 418 419 'rsrc/js/application/projects/behavior-project-create.js' => '34c53422', 419 420 'rsrc/js/application/projects/behavior-reorder-columns.js' => '8ac32fd9', 420 421 'rsrc/js/application/releeph/releeph-preview-branch.js' => '75184d68', ··· 655 656 'javelin-behavior-phuix-example' => 'c2c500a7', 656 657 'javelin-behavior-policy-control' => '0eaa33a9', 657 658 'javelin-behavior-policy-rule-editor' => '9347f172', 658 - 'javelin-behavior-project-boards' => 'e2730b90', 659 + 'javelin-behavior-project-boards' => 'cca3f5f8', 659 660 'javelin-behavior-project-create' => '34c53422', 660 661 'javelin-behavior-quicksand-blacklist' => '5a6f6a06', 661 662 'javelin-behavior-read-only-warning' => 'b9109f8f', ··· 727 728 'javelin-view-renderer' => '9aae2b66', 728 729 'javelin-view-visitor' => '308f9fe4', 729 730 'javelin-websocket' => 'fdc13e4e', 730 - 'javelin-workboard-board' => '902a1551', 731 - 'javelin-workboard-card' => '887ef74f', 732 - 'javelin-workboard-column' => '01ea93b3', 731 + 'javelin-workboard-board' => '2181739b', 732 + 'javelin-workboard-card' => 'bc92741f', 733 + 'javelin-workboard-card-template' => 'b0b5f90a', 734 + 'javelin-workboard-column' => '6461f58b', 733 735 'javelin-workboard-controller' => '42c7a5a7', 734 736 'javelin-workboard-header' => '6e75daea', 735 737 'javelin-workboard-header-template' => '2d641f7d', ··· 889 891 'javelin-uri', 890 892 'phabricator-notification', 891 893 ), 892 - '01ea93b3' => array( 893 - 'javelin-install', 894 - 'javelin-workboard-card', 895 - 'javelin-workboard-header', 896 - ), 897 894 '022516b4' => array( 898 895 'javelin-install', 899 896 'javelin-util', ··· 1050 1047 '202bfa3f' => array( 1051 1048 'javelin-behavior', 1052 1049 'javelin-request', 1050 + ), 1051 + '2181739b' => array( 1052 + 'javelin-install', 1053 + 'javelin-dom', 1054 + 'javelin-util', 1055 + 'javelin-stratcom', 1056 + 'javelin-workflow', 1057 + 'phabricator-draggable-list', 1058 + 'javelin-workboard-column', 1059 + 'javelin-workboard-header-template', 1060 + 'javelin-workboard-card-template', 1053 1061 ), 1054 1062 '225bbb98' => array( 1055 1063 'javelin-install', ··· 1419 1427 '60cd9241' => array( 1420 1428 'javelin-behavior', 1421 1429 ), 1430 + '6461f58b' => array( 1431 + 'javelin-install', 1432 + 'javelin-workboard-card', 1433 + 'javelin-workboard-header', 1434 + ), 1422 1435 '65bb0011' => array( 1423 1436 'javelin-behavior', 1424 1437 'javelin-dom', ··· 1568 1581 'javelin-install', 1569 1582 'javelin-dom', 1570 1583 ), 1571 - '887ef74f' => array( 1572 - 'javelin-install', 1573 - ), 1574 1584 '89a1ae3a' => array( 1575 1585 'javelin-dom', 1576 1586 'javelin-util', ··· 1620 1630 'javelin-workflow', 1621 1631 'javelin-stratcom', 1622 1632 ), 1623 - '902a1551' => array( 1624 - 'javelin-install', 1625 - 'javelin-dom', 1626 - 'javelin-util', 1627 - 'javelin-stratcom', 1628 - 'javelin-workflow', 1629 - 'phabricator-draggable-list', 1630 - 'javelin-workboard-column', 1631 - 'javelin-workboard-header-template', 1632 - ), 1633 1633 91863989 => array( 1634 1634 'javelin-install', 1635 1635 'javelin-stratcom', ··· 1839 1839 'javelin-behavior-device', 1840 1840 'javelin-vector', 1841 1841 ), 1842 + 'b0b5f90a' => array( 1843 + 'javelin-install', 1844 + ), 1842 1845 'b105a3a6' => array( 1843 1846 'javelin-behavior', 1844 1847 'javelin-stratcom', ··· 1893 1896 'bc16cf33' => array( 1894 1897 'phui-workcard-view-css', 1895 1898 ), 1899 + 'bc92741f' => array( 1900 + 'javelin-install', 1901 + ), 1896 1902 'bdce4d78' => array( 1897 1903 'javelin-install', 1898 1904 'javelin-util', ··· 1962 1968 'javelin-util', 1963 1969 'phabricator-keyboard-shortcut-manager', 1964 1970 ), 1971 + 'cca3f5f8' => array( 1972 + 'javelin-behavior', 1973 + 'javelin-dom', 1974 + 'javelin-util', 1975 + 'javelin-vector', 1976 + 'javelin-stratcom', 1977 + 'javelin-workflow', 1978 + 'javelin-workboard-controller', 1979 + ), 1965 1980 'cf32921f' => array( 1966 1981 'javelin-behavior', 1967 1982 'javelin-dom', ··· 2021 2036 'javelin-stratcom', 2022 2037 'javelin-dom', 2023 2038 'javelin-history', 2024 - ), 2025 - 'e2730b90' => array( 2026 - 'javelin-behavior', 2027 - 'javelin-dom', 2028 - 'javelin-util', 2029 - 'javelin-vector', 2030 - 'javelin-stratcom', 2031 - 'javelin-workflow', 2032 - 'javelin-workboard-controller', 2033 2039 ), 2034 2040 'e562708c' => array( 2035 2041 'javelin-install',
+27 -43
webroot/rsrc/js/application/projects/WorkboardBoard.js
··· 8 8 * phabricator-draggable-list 9 9 * javelin-workboard-column 10 10 * javelin-workboard-header-template 11 + * javelin-workboard-card-template 11 12 * @javelin 12 13 */ 13 14 ··· 18 19 this._phid = phid; 19 20 this._root = root; 20 21 21 - this._templates = {}; 22 - this._orderMaps = {}; 23 - this._propertiesMap = {}; 24 22 this._headers = {}; 23 + this._cards = {}; 24 + 25 25 this._buildColumns(); 26 26 }, 27 27 ··· 35 35 _phid: null, 36 36 _root: null, 37 37 _columns: null, 38 - _templates: null, 39 - _orderMaps: null, 40 - _propertiesMap: null, 41 38 _headers: null, 39 + _cards: null, 42 40 43 41 getRoot: function() { 44 42 return this._root; ··· 56 54 return this._phid; 57 55 }, 58 56 59 - setCardTemplate: function(phid, template) { 60 - this._templates[phid] = template; 61 - return this; 57 + getCardTemplate: function(phid) { 58 + if (!this._cards[phid]) { 59 + this._cards[phid] = new JX.WorkboardCardTemplate(phid); 60 + } 61 + 62 + return this._cards[phid]; 62 63 }, 63 64 64 65 getHeaderTemplate: function(header_key) { ··· 91 92 return this.compareVectors(u.getVector(), v.getVector()); 92 93 }, 93 94 94 - setObjectProperties: function(phid, properties) { 95 - this._propertiesMap[phid] = properties; 96 - return this; 97 - }, 98 - 99 - getObjectProperties: function(phid) { 100 - return this._propertiesMap[phid]; 101 - }, 102 - 103 - getCardTemplate: function(phid) { 104 - return this._templates[phid]; 105 - }, 106 - 107 95 getController: function() { 108 96 return this._controller; 109 - }, 110 - 111 - setOrderMap: function(phid, map) { 112 - this._orderMaps[phid] = map; 113 - return this; 114 - }, 115 - 116 - getOrderVector: function(phid, key) { 117 - return this._orderMaps[phid][key]; 118 97 }, 119 98 120 99 compareVectors: function(u_vec, v_vec) { ··· 310 289 var columns = this.getColumns(); 311 290 312 291 var phid = response.objectPHID; 292 + var card = this.getCardTemplate(phid); 313 293 314 - if (!this._templates[phid]) { 315 - for (var add_phid in response.columnMaps) { 316 - var target_column = this.getColumn(add_phid); 294 + for (var add_phid in response.columnMaps) { 295 + var target_column = this.getColumn(add_phid); 317 296 318 - if (!target_column) { 319 - // If the column isn't visible, don't try to add a card to it. 320 - continue; 321 - } 297 + if (!target_column) { 298 + // If the column isn't visible, don't try to add a card to it. 299 + continue; 300 + } 322 301 323 - target_column.newCard(phid); 324 - } 302 + target_column.newCard(phid); 325 303 } 326 304 327 - this.setCardTemplate(phid, response.cardHTML); 305 + card.setNodeHTMLTemplate(response.cardHTML); 328 306 329 307 var order_maps = response.orderMaps; 330 308 for (var order_phid in order_maps) { 331 - this.setOrderMap(order_phid, order_maps[order_phid]); 309 + var card_template = this.getCardTemplate(order_phid); 310 + for (var order_key in order_maps[order_phid]) { 311 + card_template.setSortVector( 312 + order_key, 313 + order_maps[order_phid][order_key]); 314 + } 332 315 } 333 316 334 317 var column_maps = response.columnMaps; ··· 348 331 349 332 var property_maps = response.propertyMaps; 350 333 for (var property_phid in property_maps) { 351 - this.setObjectProperties(property_phid, property_maps[property_phid]); 334 + this.getCardTemplate(property_phid) 335 + .setObjectProperties(property_maps[property_phid]); 352 336 } 353 337 354 338 for (var column_phid in columns) {
+10 -4
webroot/rsrc/js/application/projects/WorkboardCard.js
··· 29 29 }, 30 30 31 31 getProperties: function() { 32 - return this.getColumn().getBoard().getObjectProperties(this.getPHID()); 32 + return this.getColumn().getBoard().getCardTemplate(this.getPHID()) 33 + .getObjectProperties(); 33 34 }, 34 35 35 36 getPoints: function() { ··· 47 48 getNode: function() { 48 49 if (!this._root) { 49 50 var phid = this.getPHID(); 50 - var template = this.getColumn().getBoard().getCardTemplate(phid); 51 - this._root = JX.$H(template).getFragment().firstChild; 51 + 52 + var root = this.getColumn().getBoard() 53 + .getCardTemplate(phid) 54 + .newNode(); 55 + 56 + JX.Stratcom.getData(root).objectPHID = phid; 52 57 53 - JX.Stratcom.getData(this._root).objectPHID = this.getPHID(); 58 + this._root = root; 54 59 } 60 + 55 61 return this._root; 56 62 }, 57 63
+47
webroot/rsrc/js/application/projects/WorkboardCardTemplate.js
··· 1 + /** 2 + * @provides javelin-workboard-card-template 3 + * @requires javelin-install 4 + * @javelin 5 + */ 6 + 7 + JX.install('WorkboardCardTemplate', { 8 + 9 + construct: function(phid) { 10 + this._phid = phid; 11 + this._vectors = {}; 12 + 13 + this.setObjectProperties({}); 14 + }, 15 + 16 + properties: { 17 + objectProperties: null 18 + }, 19 + 20 + members: { 21 + _phid: null, 22 + _vectors: null, 23 + 24 + getPHID: function() { 25 + return this._phid; 26 + }, 27 + 28 + setNodeHTMLTemplate: function(html) { 29 + this._html = html; 30 + return this; 31 + }, 32 + 33 + setSortVector: function(order, vector) { 34 + this._vectors[order] = vector; 35 + return this; 36 + }, 37 + 38 + getSortVector: function(order) { 39 + return this._vectors[order]; 40 + }, 41 + 42 + newNode: function() { 43 + return JX.$H(this._html).getFragment().firstChild; 44 + } 45 + } 46 + 47 + });
+7 -3
webroot/rsrc/js/application/projects/WorkboardColumn.js
··· 319 319 }, 320 320 321 321 _getOrderVector: function(phid, order) { 322 + var board = this.getBoard(); 323 + 322 324 if (!this._orderVectors) { 323 325 this._orderVectors = {}; 324 326 } 325 327 326 328 if (!this._orderVectors[order]) { 327 - var board = this.getBoard(); 328 329 var cards = this.getCards(); 329 330 var vectors = {}; 330 331 331 332 for (var k in cards) { 332 333 var card_phid = cards[k].getPHID(); 333 - var vector = board.getOrderVector(card_phid, order); 334 + var vector = board.getCardTemplate(card_phid) 335 + .getSortVector(order); 336 + 334 337 vectors[card_phid] = [].concat(vector); 335 338 336 339 // Push a "card" type, so cards always sort after headers; headers ··· 352 355 // In this case, we're comparing a card being dragged in from another 353 356 // column to the cards already in this column. We're just going to 354 357 // build a temporary vector for it. 355 - var incoming_vector = this.getBoard().getOrderVector(phid, order); 358 + var incoming_vector = board.getCardTemplate(phid) 359 + .getSortVector(order); 356 360 incoming_vector = [].concat(incoming_vector); 357 361 358 362 // Add a "card" type to sort this after headers.
+8 -3
webroot/rsrc/js/application/projects/behavior-project-boards.js
··· 83 83 84 84 var templates = config.templateMap; 85 85 for (var k in templates) { 86 - board.setCardTemplate(k, templates[k]); 86 + board.getCardTemplate(k) 87 + .setNodeHTMLTemplate(templates[k]); 87 88 } 88 89 89 90 var column_maps = config.columnMaps; ··· 97 98 98 99 var order_maps = config.orderMaps; 99 100 for (var object_phid in order_maps) { 100 - board.setOrderMap(object_phid, order_maps[object_phid]); 101 + var order_card = board.getCardTemplate(object_phid); 102 + for (var order_key in order_maps[object_phid]) { 103 + order_card.setSortVector(order_key, order_maps[object_phid][order_key]); 104 + } 101 105 } 102 106 103 107 var property_maps = config.propertyMaps; 104 108 for (var property_phid in property_maps) { 105 - board.setObjectProperties(property_phid, property_maps[property_phid]); 109 + board.getCardTemplate(property_phid) 110 + .setObjectProperties(property_maps[property_phid]); 106 111 } 107 112 108 113 var headers = config.headers;