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

Allow only one global top menu to be open at a time

Summary: Fixes T3715. Makes "visible" global instead of per-menu, so all the menus share a visible state.

Test Plan: For menus A and B, clicked "A, A", "A, B, A", "A, B, B", "A, B, B, A", etc. Couldn't figure out a way to break it.

Reviewers: btrahan, chad

Reviewed By: chad

CC: aran

Maniphest Tasks: T3715

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

+73 -58
+42 -42
src/__celerity_resource_map__.php
··· 1235 1235 ), 1236 1236 'javelin-behavior-aphlict-dropdown' => 1237 1237 array( 1238 - 'uri' => '/res/c8def75f/rsrc/js/application/aphlict/behavior-aphlict-dropdown.js', 1238 + 'uri' => '/res/3ff0c90a/rsrc/js/application/aphlict/behavior-aphlict-dropdown.js', 1239 1239 'type' => 'js', 1240 1240 'requires' => 1241 1241 array( ··· 2217 2217 ), 2218 2218 'javelin-behavior-pholio-mock-edit' => 2219 2219 array( 2220 - 'uri' => '/res/d5f4b705/rsrc/js/application/pholio/behavior-pholio-mock-edit.js', 2220 + 'uri' => '/res/1fd14497/rsrc/js/application/pholio/behavior-pholio-mock-edit.js', 2221 2221 'type' => 'js', 2222 2222 'requires' => 2223 2223 array( ··· 3706 3706 ), 3707 3707 'pholio-edit-css' => 3708 3708 array( 3709 - 'uri' => '/res/00e3a3a8/rsrc/css/application/pholio/pholio-edit.css', 3709 + 'uri' => '/res/63f3332d/rsrc/css/application/pholio/pholio-edit.css', 3710 3710 'type' => 'css', 3711 3711 'requires' => 3712 3712 array( ··· 4222 4222 'uri' => '/res/pkg/638c9d42/core.pkg.css', 4223 4223 'type' => 'css', 4224 4224 ), 4225 - '7cc3f99d' => 4225 + '4f81c788' => 4226 4226 array( 4227 4227 'name' => 'core.pkg.js', 4228 4228 'symbols' => ··· 4265 4265 35 => 'phabricator-hovercard', 4266 4266 36 => 'javelin-behavior-phabricator-hovercards', 4267 4267 ), 4268 - 'uri' => '/res/pkg/7cc3f99d/core.pkg.js', 4268 + 'uri' => '/res/pkg/4f81c788/core.pkg.js', 4269 4269 'type' => 'js', 4270 4270 ), 4271 4271 '4ccfeb47' => ··· 4435 4435 'diffusion-icons-css' => 'c8ce2d88', 4436 4436 'global-drag-and-drop-css' => '638c9d42', 4437 4437 'inline-comment-summary-css' => 'dd27a69b', 4438 - 'javelin-aphlict' => '7cc3f99d', 4438 + 'javelin-aphlict' => '4f81c788', 4439 4439 'javelin-behavior' => '2dbbb7d1', 4440 - 'javelin-behavior-aphlict-dropdown' => '7cc3f99d', 4441 - 'javelin-behavior-aphlict-listen' => '7cc3f99d', 4442 - 'javelin-behavior-aphront-basic-tokenizer' => '7cc3f99d', 4440 + 'javelin-behavior-aphlict-dropdown' => '4f81c788', 4441 + 'javelin-behavior-aphlict-listen' => '4f81c788', 4442 + 'javelin-behavior-aphront-basic-tokenizer' => '4f81c788', 4443 4443 'javelin-behavior-aphront-drag-and-drop-textarea' => '48040be9', 4444 - 'javelin-behavior-aphront-form-disable-on-submit' => '7cc3f99d', 4444 + 'javelin-behavior-aphront-form-disable-on-submit' => '4f81c788', 4445 4445 'javelin-behavior-audit-preview' => '96909266', 4446 4446 'javelin-behavior-dark-console' => '4ccfeb47', 4447 - 'javelin-behavior-device' => '7cc3f99d', 4447 + 'javelin-behavior-device' => '4f81c788', 4448 4448 'javelin-behavior-differential-accept-with-errors' => '48040be9', 4449 4449 'javelin-behavior-differential-add-reviewers-and-ccs' => '48040be9', 4450 4450 'javelin-behavior-differential-comment-jump' => '48040be9', ··· 4460 4460 'javelin-behavior-diffusion-commit-graph' => '96909266', 4461 4461 'javelin-behavior-diffusion-pull-lastmodified' => '96909266', 4462 4462 'javelin-behavior-error-log' => '4ccfeb47', 4463 - 'javelin-behavior-global-drag-and-drop' => '7cc3f99d', 4464 - 'javelin-behavior-history-install' => '7cc3f99d', 4465 - 'javelin-behavior-konami' => '7cc3f99d', 4466 - 'javelin-behavior-lightbox-attachments' => '7cc3f99d', 4463 + 'javelin-behavior-global-drag-and-drop' => '4f81c788', 4464 + 'javelin-behavior-history-install' => '4f81c788', 4465 + 'javelin-behavior-konami' => '4f81c788', 4466 + 'javelin-behavior-lightbox-attachments' => '4f81c788', 4467 4467 'javelin-behavior-load-blame' => '48040be9', 4468 4468 'javelin-behavior-maniphest-batch-selector' => '98f64f07', 4469 4469 'javelin-behavior-maniphest-subpriority-editor' => '98f64f07', 4470 4470 'javelin-behavior-maniphest-transaction-controls' => '98f64f07', 4471 4471 'javelin-behavior-maniphest-transaction-expand' => '98f64f07', 4472 4472 'javelin-behavior-maniphest-transaction-preview' => '98f64f07', 4473 - 'javelin-behavior-phabricator-active-nav' => '7cc3f99d', 4474 - 'javelin-behavior-phabricator-autofocus' => '7cc3f99d', 4475 - 'javelin-behavior-phabricator-gesture' => '7cc3f99d', 4476 - 'javelin-behavior-phabricator-hovercards' => '7cc3f99d', 4477 - 'javelin-behavior-phabricator-keyboard-shortcuts' => '7cc3f99d', 4478 - 'javelin-behavior-phabricator-nav' => '7cc3f99d', 4473 + 'javelin-behavior-phabricator-active-nav' => '4f81c788', 4474 + 'javelin-behavior-phabricator-autofocus' => '4f81c788', 4475 + 'javelin-behavior-phabricator-gesture' => '4f81c788', 4476 + 'javelin-behavior-phabricator-hovercards' => '4f81c788', 4477 + 'javelin-behavior-phabricator-keyboard-shortcuts' => '4f81c788', 4478 + 'javelin-behavior-phabricator-nav' => '4f81c788', 4479 4479 'javelin-behavior-phabricator-object-selector' => '48040be9', 4480 - 'javelin-behavior-phabricator-oncopy' => '7cc3f99d', 4481 - 'javelin-behavior-phabricator-remarkup-assist' => '7cc3f99d', 4482 - 'javelin-behavior-phabricator-reveal-content' => '7cc3f99d', 4483 - 'javelin-behavior-phabricator-search-typeahead' => '7cc3f99d', 4484 - 'javelin-behavior-phabricator-tooltips' => '7cc3f99d', 4485 - 'javelin-behavior-phabricator-watch-anchor' => '7cc3f99d', 4486 - 'javelin-behavior-refresh-csrf' => '7cc3f99d', 4480 + 'javelin-behavior-phabricator-oncopy' => '4f81c788', 4481 + 'javelin-behavior-phabricator-remarkup-assist' => '4f81c788', 4482 + 'javelin-behavior-phabricator-reveal-content' => '4f81c788', 4483 + 'javelin-behavior-phabricator-search-typeahead' => '4f81c788', 4484 + 'javelin-behavior-phabricator-tooltips' => '4f81c788', 4485 + 'javelin-behavior-phabricator-watch-anchor' => '4f81c788', 4486 + 'javelin-behavior-refresh-csrf' => '4f81c788', 4487 4487 'javelin-behavior-repository-crossreference' => '48040be9', 4488 - 'javelin-behavior-toggle-class' => '7cc3f99d', 4489 - 'javelin-behavior-workflow' => '7cc3f99d', 4488 + 'javelin-behavior-toggle-class' => '4f81c788', 4489 + 'javelin-behavior-workflow' => '4f81c788', 4490 4490 'javelin-dom' => '2dbbb7d1', 4491 4491 'javelin-event' => '2dbbb7d1', 4492 4492 'javelin-history' => '2dbbb7d1', ··· 4511 4511 'maniphest-transaction-detail-css' => '06bacb9a', 4512 4512 'phabricator-action-list-view-css' => '638c9d42', 4513 4513 'phabricator-application-launch-view-css' => '638c9d42', 4514 - 'phabricator-busy' => '7cc3f99d', 4514 + 'phabricator-busy' => '4f81c788', 4515 4515 'phabricator-content-source-view-css' => 'dd27a69b', 4516 4516 'phabricator-core-css' => '638c9d42', 4517 4517 'phabricator-crumbs-view-css' => '638c9d42', 4518 4518 'phabricator-drag-and-drop-file-upload' => '48040be9', 4519 - 'phabricator-dropdown-menu' => '7cc3f99d', 4520 - 'phabricator-file-upload' => '7cc3f99d', 4519 + 'phabricator-dropdown-menu' => '4f81c788', 4520 + 'phabricator-file-upload' => '4f81c788', 4521 4521 'phabricator-filetree-view-css' => '638c9d42', 4522 4522 'phabricator-flag-css' => '638c9d42', 4523 4523 'phabricator-form-view-css' => '638c9d42', 4524 4524 'phabricator-header-view-css' => '638c9d42', 4525 - 'phabricator-hovercard' => '7cc3f99d', 4525 + 'phabricator-hovercard' => '4f81c788', 4526 4526 'phabricator-jump-nav' => '638c9d42', 4527 - 'phabricator-keyboard-shortcut' => '7cc3f99d', 4528 - 'phabricator-keyboard-shortcut-manager' => '7cc3f99d', 4527 + 'phabricator-keyboard-shortcut' => '4f81c788', 4528 + 'phabricator-keyboard-shortcut-manager' => '4f81c788', 4529 4529 'phabricator-main-menu-view' => '638c9d42', 4530 - 'phabricator-menu-item' => '7cc3f99d', 4530 + 'phabricator-menu-item' => '4f81c788', 4531 4531 'phabricator-nav-view-css' => '638c9d42', 4532 - 'phabricator-notification' => '7cc3f99d', 4532 + 'phabricator-notification' => '4f81c788', 4533 4533 'phabricator-notification-css' => '638c9d42', 4534 4534 'phabricator-notification-menu-css' => '638c9d42', 4535 4535 'phabricator-object-item-list-view-css' => '638c9d42', 4536 4536 'phabricator-object-selector-css' => 'dd27a69b', 4537 - 'phabricator-phtize' => '7cc3f99d', 4538 - 'phabricator-prefab' => '7cc3f99d', 4537 + 'phabricator-phtize' => '4f81c788', 4538 + 'phabricator-prefab' => '4f81c788', 4539 4539 'phabricator-project-tag-css' => '06bacb9a', 4540 4540 'phabricator-property-list-view-css' => '638c9d42', 4541 4541 'phabricator-remarkup-css' => '638c9d42', ··· 4543 4543 'phabricator-side-menu-view-css' => '638c9d42', 4544 4544 'phabricator-standard-page-view' => '638c9d42', 4545 4545 'phabricator-tag-view-css' => '638c9d42', 4546 - 'phabricator-textareautils' => '7cc3f99d', 4547 - 'phabricator-tooltip' => '7cc3f99d', 4546 + 'phabricator-textareautils' => '4f81c788', 4547 + 'phabricator-tooltip' => '4f81c788', 4548 4548 'phabricator-transaction-view-css' => '638c9d42', 4549 4549 'phabricator-zindex-css' => '638c9d42', 4550 4550 'phui-button-css' => '638c9d42',
+31 -16
webroot/rsrc/js/application/aphlict/behavior-aphlict-dropdown.js
··· 8 8 * javelin-uri 9 9 */ 10 10 11 - JX.behavior('aphlict-dropdown', function(config) { 11 + JX.behavior('aphlict-dropdown', function(config, statics) { 12 + // Track the current globally visible menu. 13 + statics.visible = statics.visible || null; 14 + 12 15 var dropdown = JX.$(config.dropdownID); 13 16 var count = JX.$(config.countID); 14 17 var bubble = JX.$(config.bubbleID); 15 - var visible = false; 16 18 var request = null; 17 19 var dirty = true; 18 20 ··· 28 30 if (request) { //already fetching 29 31 return; 30 32 } 33 + 31 34 request = new JX.Request(config.uri, function(response) { 32 35 var display = (response.number > 999) ? "\u221E" : response.number; 33 36 ··· 55 58 if (!e.getNode('phabricator-notification-menu')) { 56 59 // Click outside the dropdown; hide it. 57 60 JX.DOM.hide(dropdown); 58 - visible = false; 61 + statics.visible = null; 59 62 return; 60 63 } 61 64 ··· 83 86 return; 84 87 } 85 88 86 - if (visible) { 87 - JX.DOM.hide(dropdown); 88 - } else { 89 - if (dirty) { 90 - refresh(); 89 + e.kill(); 90 + 91 + // If a menu is currently open, close it. 92 + if (statics.visible) { 93 + var previously_visible = statics.visible; 94 + JX.DOM.hide(statics.visible); 95 + statics.visible = null; 96 + 97 + // If the menu we just closed was the menu attached to the clicked 98 + // icon, we're all done -- clicking the icon for an open menu just 99 + // closes it. Otherwise, we closed some other menu and still need to 100 + // open the one the user just clicked. 101 + if (previously_visible === dropdown) { 102 + return; 91 103 } 104 + } 92 105 93 - var p = JX.$V(bubble); 94 - p.y = null; 95 - p.x -= 6; 96 - p.setPos(dropdown); 106 + if (dirty) { 107 + refresh(); 108 + } 109 + 110 + var p = JX.$V(bubble); 111 + p.y = null; 112 + p.x -= 6; 113 + p.setPos(dropdown); 97 114 98 - JX.DOM.show(dropdown); 99 - } 100 - visible = !visible; 101 - e.kill(); 115 + JX.DOM.show(dropdown); 116 + statics.visible = dropdown; 102 117 } 103 118 ); 104 119