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

Attempt to make dropdown item actions more consistent

Summary:
See D17210. Currently, this handler needs to be installed on each menu that doesn't build with the default behavior.

Rather than copy-pasting it to the user menu, try to make it a default behavior. This adds a new rule: don't close the menu if the item is a dynamic item built in JS with PHUIXActionView.

This allows dynamic items to control the menu themselves, while giving static items the desired default behavior.

Test Plan:
- Opened menus on: dashboards, user menu, timeline comments. Clicked stuff. Menus went away.
- Other menus still seemed to work right: Diffusion, Favorites, mobile menu.

Reviewers: chad

Reviewed By: chad

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

+63 -54
+33 -33
resources/celerity/map.php
··· 10 10 'conpherence.pkg.css' => '0b64e988', 11 11 'conpherence.pkg.js' => '6249a1cf', 12 12 'core.pkg.css' => 'e75e4f9d', 13 - 'core.pkg.js' => 'f70cb91f', 13 + 'core.pkg.js' => '2291d3b2', 14 14 'darkconsole.pkg.js' => 'e7393ebb', 15 15 'differential.pkg.css' => '9535a7e6', 16 16 'differential.pkg.js' => 'ddfeb49b', ··· 443 443 'rsrc/js/application/projects/WorkboardCard.js' => 'c587b80f', 444 444 'rsrc/js/application/projects/WorkboardColumn.js' => '21df4ff5', 445 445 'rsrc/js/application/projects/WorkboardController.js' => '55baf5ed', 446 - 'rsrc/js/application/projects/behavior-project-boards.js' => '14a1faae', 446 + 'rsrc/js/application/projects/behavior-project-boards.js' => '93ae974f', 447 447 'rsrc/js/application/projects/behavior-project-create.js' => '065227cc', 448 448 'rsrc/js/application/projects/behavior-reorder-columns.js' => 'e1d25dfb', 449 449 'rsrc/js/application/releeph/releeph-preview-branch.js' => 'b2b4fbaf', ··· 534 534 'rsrc/js/core/behavior-watch-anchor.js' => '9f36c42d', 535 535 'rsrc/js/core/behavior-workflow.js' => '0a3f3021', 536 536 'rsrc/js/core/phtize.js' => 'd254d646', 537 - 'rsrc/js/phui/behavior-phui-dropdown-menu.js' => '8744dfd1', 537 + 'rsrc/js/phui/behavior-phui-dropdown-menu.js' => 'b95d6f7d', 538 538 'rsrc/js/phui/behavior-phui-file-upload.js' => 'b003d4fb', 539 539 'rsrc/js/phui/behavior-phui-submenu.js' => 'a6f7a73b', 540 540 'rsrc/js/phui/behavior-phui-tab-group.js' => '0a0b10e9', 541 541 'rsrc/js/phuix/PHUIXActionListView.js' => 'b5c256b8', 542 - 'rsrc/js/phuix/PHUIXActionView.js' => '9cc178ed', 542 + 'rsrc/js/phuix/PHUIXActionView.js' => 'b3465b9b', 543 543 'rsrc/js/phuix/PHUIXAutocomplete.js' => '6d86ce8b', 544 - 'rsrc/js/phuix/PHUIXDropdownMenu.js' => '82e270da', 544 + 'rsrc/js/phuix/PHUIXDropdownMenu.js' => '8018ee50', 545 545 'rsrc/js/phuix/PHUIXFormControl.js' => 'bbece68d', 546 546 'rsrc/js/phuix/PHUIXIconView.js' => 'bff6884b', 547 547 ), ··· 687 687 'javelin-behavior-phabricator-watch-anchor' => '9f36c42d', 688 688 'javelin-behavior-pholio-mock-edit' => 'bee502c8', 689 689 'javelin-behavior-pholio-mock-view' => 'fbe497e7', 690 - 'javelin-behavior-phui-dropdown-menu' => '8744dfd1', 690 + 'javelin-behavior-phui-dropdown-menu' => 'b95d6f7d', 691 691 'javelin-behavior-phui-file-upload' => 'b003d4fb', 692 692 'javelin-behavior-phui-hovercards' => 'bcaccd64', 693 693 'javelin-behavior-phui-submenu' => 'a6f7a73b', 694 694 'javelin-behavior-phui-tab-group' => '0a0b10e9', 695 695 'javelin-behavior-policy-control' => 'd0c516d5', 696 696 'javelin-behavior-policy-rule-editor' => '5e9f347c', 697 - 'javelin-behavior-project-boards' => '14a1faae', 697 + 'javelin-behavior-project-boards' => '93ae974f', 698 698 'javelin-behavior-project-create' => '065227cc', 699 699 'javelin-behavior-quicksand-blacklist' => '7927a7d3', 700 700 'javelin-behavior-read-only-warning' => 'ba158207', ··· 898 898 'phui-workcard-view-css' => 'cca5fa92', 899 899 'phui-workpanel-view-css' => 'a3a63478', 900 900 'phuix-action-list-view' => 'b5c256b8', 901 - 'phuix-action-view' => '9cc178ed', 901 + 'phuix-action-view' => 'b3465b9b', 902 902 'phuix-autocomplete' => '6d86ce8b', 903 - 'phuix-dropdown-menu' => '82e270da', 903 + 'phuix-dropdown-menu' => '8018ee50', 904 904 'phuix-form-control-view' => 'bbece68d', 905 905 'phuix-icon-view' => 'bff6884b', 906 906 'policy-css' => '957ea14c', ··· 1043 1043 'javelin-stratcom', 1044 1044 'javelin-dom', 1045 1045 'javelin-history', 1046 - ), 1047 - '14a1faae' => array( 1048 - 'javelin-behavior', 1049 - 'javelin-dom', 1050 - 'javelin-util', 1051 - 'javelin-vector', 1052 - 'javelin-stratcom', 1053 - 'javelin-workflow', 1054 - 'javelin-workboard-controller', 1055 1046 ), 1056 1047 '185bbd53' => array( 1057 1048 'javelin-install', ··· 1519 1510 'javelin-behavior', 1520 1511 'javelin-history', 1521 1512 ), 1522 - '805b806a' => array( 1523 - 'javelin-magical-init', 1513 + '8018ee50' => array( 1524 1514 'javelin-install', 1525 1515 'javelin-util', 1516 + 'javelin-dom', 1526 1517 'javelin-vector', 1527 1518 'javelin-stratcom', 1528 1519 ), 1529 - '82e270da' => array( 1520 + '805b806a' => array( 1521 + 'javelin-magical-init', 1530 1522 'javelin-install', 1531 1523 'javelin-util', 1532 - 'javelin-dom', 1533 1524 'javelin-vector', 1534 1525 'javelin-stratcom', 1535 1526 ), ··· 1560 1551 'javelin-stratcom', 1561 1552 'phabricator-tooltip', 1562 1553 'changeset-view-manager', 1563 - ), 1564 - '8744dfd1' => array( 1565 - 'javelin-behavior', 1566 - 'javelin-stratcom', 1567 - 'javelin-dom', 1568 - 'phuix-dropdown-menu', 1569 1554 ), 1570 1555 '88236f00' => array( 1571 1556 'javelin-behavior', ··· 1638 1623 'javelin-behavior', 1639 1624 'javelin-stratcom', 1640 1625 'javelin-dom', 1626 + ), 1627 + '93ae974f' => array( 1628 + 'javelin-behavior', 1629 + 'javelin-dom', 1630 + 'javelin-util', 1631 + 'javelin-vector', 1632 + 'javelin-stratcom', 1633 + 'javelin-workflow', 1634 + 'javelin-workboard-controller', 1641 1635 ), 1642 1636 '93d0c9e3' => array( 1643 1637 'javelin-behavior', ··· 1699 1693 'javelin-workflow', 1700 1694 'javelin-stratcom', 1701 1695 ), 1702 - '9cc178ed' => array( 1703 - 'javelin-install', 1704 - 'javelin-dom', 1705 - 'javelin-util', 1706 - ), 1707 1696 '9d9685d6' => array( 1708 1697 'phui-oi-list-view-css', 1709 1698 ), ··· 1849 1838 'javelin-uri', 1850 1839 'javelin-request', 1851 1840 ), 1841 + 'b3465b9b' => array( 1842 + 'javelin-install', 1843 + 'javelin-dom', 1844 + 'javelin-util', 1845 + ), 1852 1846 'b3a4b884' => array( 1853 1847 'javelin-behavior', 1854 1848 'phabricator-prefab', ··· 1900 1894 'javelin-dom', 1901 1895 'javelin-json', 1902 1896 'phabricator-draggable-list', 1897 + ), 1898 + 'b95d6f7d' => array( 1899 + 'javelin-behavior', 1900 + 'javelin-stratcom', 1901 + 'javelin-dom', 1902 + 'phuix-dropdown-menu', 1903 1903 ), 1904 1904 'ba158207' => array( 1905 1905 'javelin-behavior',
-7
webroot/rsrc/js/application/projects/behavior-project-boards.js
··· 34 34 data.menu = new JX.PHUIXDropdownMenu(button); 35 35 data.menu.setContent(list); 36 36 data.menu.open(); 37 - 38 - JX.DOM.listen(list, 'click', 'tag:a', function(e) { 39 - if (!e.isNormalClick()) { 40 - return; 41 - } 42 - data.menu.close(); 43 - }); 44 37 }); 45 38 46 39 JX.Stratcom.listen(
-14
webroot/rsrc/js/phui/behavior-phui-dropdown-menu.js
··· 42 42 }); 43 43 44 44 data.menu.open(); 45 - 46 - JX.DOM.listen(list, 'click', 'tag:a', function(e) { 47 - if (!e.isNormalClick()) { 48 - return; 49 - } 50 - 51 - // If this item opens a submenu, we don't want to close the current 52 - // menu. One submenu is "Edit Related Objects..." on mobile. 53 - if (JX.Stratcom.hasSigil(e.getTarget(), 'keep-open')) { 54 - return; 55 - } 56 - 57 - data.menu.close(); 58 - }); 59 45 }); 60 46 61 47 });
+2
webroot/rsrc/js/phuix/PHUIXActionView.js
··· 96 96 className: classes.join(' ') 97 97 }; 98 98 this._node = JX.$N('li', attr, content); 99 + 100 + JX.Stratcom.addSigil(this._node, 'phuix-action-view'); 99 101 } 100 102 101 103 return this._node;
+28
webroot/rsrc/js/phuix/PHUIXDropdownMenu.js
··· 40 40 JX.Stratcom.listen('phuix.dropdown.open', null, JX.bind(this, this.close)); 41 41 42 42 JX.Stratcom.listen('keydown', null, JX.bind(this, this._onkey)); 43 + 44 + JX.DOM.listen( 45 + this._getMenuNode(), 46 + 'click', 47 + 'tag:a', 48 + JX.bind(this, this._onlink)); 43 49 }, 44 50 45 51 events: ['open', 'close'], ··· 110 116 this.open(); 111 117 } 112 118 e.prevent(); 119 + }, 120 + 121 + _onlink: function(e) { 122 + if (!e.isNormalClick()) { 123 + return; 124 + } 125 + 126 + // If this action was built dynamically with PHUIXActionView, don't 127 + // do anything by default. The caller is repsonsible for installing a 128 + // handler if they want to react to clicks. 129 + if (e.getNode('phuix-action-view')) { 130 + return; 131 + } 132 + 133 + // If this item opens a submenu, we don't want to close the current 134 + // menu. One submenu is "Edit Related Objects..." on mobile. 135 + var link = e.getNode('tag:a'); 136 + if (JX.Stratcom.hasSigil(link, 'keep-open')) { 137 + return; 138 + } 139 + 140 + this.close(); 113 141 }, 114 142 115 143 _onanyclick : function(e) {