1
0
Fork 0
mirror of https://we.phorge.it/source/phorge.git synced 2024-11-14 02:42:40 +01:00

Update the search scope selector after Quicksand navigation

Summary:
Fixes T7900.

  - Update the hidden form input so the current application is searched.
  - Update the menu icon.
  - Update the button icon, if "Search Current Application" is selected.

Test Plan:
  - Navigated between applications with Quicksand.
    - Observed button icon update.
    - Observed menu icon update.
    - Observed results being scoped to the correct application.

Reviewers: btrahan

Reviewed By: btrahan

Subscribers: epriestley

Maniphest Tasks: T7900

Differential Revision: https://secure.phabricator.com/D12540
This commit is contained in:
epriestley 2015-04-24 14:20:48 -07:00
parent 1ab6ad3ee8
commit 0b309b6193
5 changed files with 96 additions and 36 deletions

View file

@ -8,7 +8,7 @@
return array( return array(
'names' => array( 'names' => array(
'core.pkg.css' => '9a9b59ca', 'core.pkg.css' => '9a9b59ca',
'core.pkg.js' => '493cc6e6', 'core.pkg.js' => '6f7446de',
'darkconsole.pkg.js' => '8ab24e01', 'darkconsole.pkg.js' => '8ab24e01',
'differential.pkg.css' => '3500921f', 'differential.pkg.css' => '3500921f',
'differential.pkg.js' => '890046d3', 'differential.pkg.js' => '890046d3',
@ -468,7 +468,7 @@ return array(
'rsrc/js/core/behavior-file-tree.js' => '88236f00', 'rsrc/js/core/behavior-file-tree.js' => '88236f00',
'rsrc/js/core/behavior-form.js' => '5c54cbf3', 'rsrc/js/core/behavior-form.js' => '5c54cbf3',
'rsrc/js/core/behavior-gesture.js' => '3ab51e2c', 'rsrc/js/core/behavior-gesture.js' => '3ab51e2c',
'rsrc/js/core/behavior-global-drag-and-drop.js' => '3f6075ff', 'rsrc/js/core/behavior-global-drag-and-drop.js' => 'c203e6ee',
'rsrc/js/core/behavior-high-security-warning.js' => 'a464fe03', 'rsrc/js/core/behavior-high-security-warning.js' => 'a464fe03',
'rsrc/js/core/behavior-history-install.js' => '7ee2b591', 'rsrc/js/core/behavior-history-install.js' => '7ee2b591',
'rsrc/js/core/behavior-hovercard.js' => 'f36e01af', 'rsrc/js/core/behavior-hovercard.js' => 'f36e01af',
@ -486,7 +486,7 @@ return array(
'rsrc/js/core/behavior-reorder-applications.js' => '76b9fc3e', 'rsrc/js/core/behavior-reorder-applications.js' => '76b9fc3e',
'rsrc/js/core/behavior-reveal-content.js' => '60821bc7', 'rsrc/js/core/behavior-reveal-content.js' => '60821bc7',
'rsrc/js/core/behavior-scrollbar.js' => '834a1173', 'rsrc/js/core/behavior-scrollbar.js' => '834a1173',
'rsrc/js/core/behavior-search-typeahead.js' => 'c5172d25', 'rsrc/js/core/behavior-search-typeahead.js' => '048330fa',
'rsrc/js/core/behavior-select-on-click.js' => '4e3e79a6', 'rsrc/js/core/behavior-select-on-click.js' => '4e3e79a6',
'rsrc/js/core/behavior-toggle-class.js' => 'e566f52c', 'rsrc/js/core/behavior-toggle-class.js' => 'e566f52c',
'rsrc/js/core/behavior-tokenizer.js' => 'b3a4b884', 'rsrc/js/core/behavior-tokenizer.js' => 'b3a4b884',
@ -593,7 +593,7 @@ return array(
'javelin-behavior-durable-column' => '657c2b50', 'javelin-behavior-durable-column' => '657c2b50',
'javelin-behavior-error-log' => '6882e80a', 'javelin-behavior-error-log' => '6882e80a',
'javelin-behavior-fancy-datepicker' => 'c51ae228', 'javelin-behavior-fancy-datepicker' => 'c51ae228',
'javelin-behavior-global-drag-and-drop' => '3f6075ff', 'javelin-behavior-global-drag-and-drop' => 'c203e6ee',
'javelin-behavior-herald-rule-editor' => '7ebaeed3', 'javelin-behavior-herald-rule-editor' => '7ebaeed3',
'javelin-behavior-high-security-warning' => 'a464fe03', 'javelin-behavior-high-security-warning' => 'a464fe03',
'javelin-behavior-history-install' => '7ee2b591', 'javelin-behavior-history-install' => '7ee2b591',
@ -628,7 +628,7 @@ return array(
'javelin-behavior-phabricator-oncopy' => '2926fff2', 'javelin-behavior-phabricator-oncopy' => '2926fff2',
'javelin-behavior-phabricator-remarkup-assist' => 'e32d14ab', 'javelin-behavior-phabricator-remarkup-assist' => 'e32d14ab',
'javelin-behavior-phabricator-reveal-content' => '60821bc7', 'javelin-behavior-phabricator-reveal-content' => '60821bc7',
'javelin-behavior-phabricator-search-typeahead' => 'c5172d25', 'javelin-behavior-phabricator-search-typeahead' => '048330fa',
'javelin-behavior-phabricator-show-older-transactions' => 'dbbf48b6', 'javelin-behavior-phabricator-show-older-transactions' => 'dbbf48b6',
'javelin-behavior-phabricator-tooltips' => '3ee3408b', 'javelin-behavior-phabricator-tooltips' => '3ee3408b',
'javelin-behavior-phabricator-transaction-comment-form' => '9f7309fb', 'javelin-behavior-phabricator-transaction-comment-form' => '9f7309fb',
@ -845,6 +845,16 @@ return array(
'029a133d' => array( '029a133d' => array(
'aphront-dialog-view-css', 'aphront-dialog-view-css',
), ),
'048330fa' => array(
'javelin-behavior',
'javelin-typeahead-ondemand-source',
'javelin-typeahead',
'javelin-dom',
'javelin-uri',
'javelin-util',
'javelin-stratcom',
'phabricator-prefab',
),
'05270951' => array( '05270951' => array(
'javelin-util', 'javelin-util',
'javelin-magical-init', 'javelin-magical-init',
@ -1088,13 +1098,6 @@ return array(
'javelin-dom', 'javelin-dom',
'phortune-credit-card-form', 'phortune-credit-card-form',
), ),
'3f6075ff' => array(
'javelin-behavior',
'javelin-dom',
'javelin-uri',
'javelin-mask',
'phabricator-drag-and-drop-file-upload',
),
'40a6a403' => array( '40a6a403' => array(
'javelin-install', 'javelin-install',
'javelin-dom', 'javelin-dom',
@ -1755,15 +1758,12 @@ return array(
'javelin-dom', 'javelin-dom',
'javelin-vector', 'javelin-vector',
), ),
'c5172d25' => array( 'c203e6ee' => array(
'javelin-behavior', 'javelin-behavior',
'javelin-typeahead-ondemand-source',
'javelin-typeahead',
'javelin-dom', 'javelin-dom',
'javelin-uri', 'javelin-uri',
'javelin-util', 'javelin-mask',
'javelin-stratcom', 'phabricator-drag-and-drop-file-upload',
'phabricator-prefab',
), ),
'c51ae228' => array( 'c51ae228' => array(
'javelin-behavior', 'javelin-behavior',

View file

@ -649,6 +649,19 @@ final class PhabricatorStandardPageView extends PhabricatorBarePageView {
$upload_enabled = $controller->isGlobalDragAndDropUploadEnabled(); $upload_enabled = $controller->isGlobalDragAndDropUploadEnabled();
} }
$application_class = null;
$application_search_icon = null;
$controller = $this->getController();
if ($controller) {
$application = $controller->getCurrentApplication();
if ($application) {
$application_class = get_class($application);
if ($application->getApplicationSearchDocumentTypes()) {
$application_search_icon = $application->getFontIcon();
}
}
}
return array( return array(
'title' => $this->getTitle(), 'title' => $this->getTitle(),
'aphlictDropdownData' => array( 'aphlictDropdownData' => array(
@ -659,6 +672,8 @@ final class PhabricatorStandardPageView extends PhabricatorBarePageView {
'aphlictDropdowns' => $rendered_dropdowns, 'aphlictDropdowns' => $rendered_dropdowns,
'hisecWarningConfig' => $hisec_warning_config, 'hisecWarningConfig' => $hisec_warning_config,
'consoleConfig' => $console_config, 'consoleConfig' => $console_config,
'applicationClass' => $application_class,
'applicationSearchIcon' => $application_search_icon,
) + $this->buildAphlictListenConfigData(); ) + $this->buildAphlictListenConfigData();
} }

View file

@ -2,6 +2,8 @@
final class PhabricatorMainMenuSearchView extends AphrontView { final class PhabricatorMainMenuSearchView extends AphrontView {
const DEFAULT_APPLICATION_ICON = 'fa-dot-circle-o';
private $id; private $id;
private $application; private $application;
@ -27,6 +29,8 @@ final class PhabricatorMainMenuSearchView extends AphrontView {
$target_id = celerity_generate_unique_node_id(); $target_id = celerity_generate_unique_node_id();
$search_id = $this->getID(); $search_id = $this->getID();
$button_id = celerity_generate_unique_node_id(); $button_id = celerity_generate_unique_node_id();
$selector_id = celerity_generate_unique_node_id();
$application_id = celerity_generate_unique_node_id();
$input = phutil_tag( $input = phutil_tag(
'input', 'input',
@ -54,6 +58,10 @@ final class PhabricatorMainMenuSearchView extends AphrontView {
'id' => $target_id, 'id' => $target_id,
'input' => $search_id, 'input' => $search_id,
'button' => $button_id, 'button' => $button_id,
'selectorID' => $selector_id,
'applicationID' => $application_id,
'defaultApplicationIcon' => self::DEFAULT_APPLICATION_ICON,
'appScope' => PhabricatorSearchController::SCOPE_CURRENT_APPLICATION,
'src' => $search_datasource->getDatasourceURI(), 'src' => $search_datasource->getDatasourceURI(),
'limit' => 10, 'limit' => 10,
'placeholder' => pht('Search'), 'placeholder' => pht('Search'),
@ -75,7 +83,7 @@ final class PhabricatorMainMenuSearchView extends AphrontView {
), ),
pht('Search')); pht('Search'));
$selector = $this->buildModeSelector(); $selector = $this->buildModeSelector($selector_id, $application_id);
$form = phabricator_form( $form = phabricator_form(
$user, $user,
@ -100,7 +108,7 @@ final class PhabricatorMainMenuSearchView extends AphrontView {
return $form; return $form;
} }
private function buildModeSelector() { private function buildModeSelector($selector_id, $application_id) {
$viewer = $this->getUser(); $viewer = $this->getUser();
$items = array(); $items = array();
@ -115,7 +123,7 @@ final class PhabricatorMainMenuSearchView extends AphrontView {
); );
$application_value = null; $application_value = null;
$application_icon = 'fa-dot-circle-o'; $application_icon = self::DEFAULT_APPLICATION_ICON;
$application = $this->getApplication(); $application = $this->getApplication();
if ($application) { if ($application) {
$application_value = get_class($application); $application_value = get_class($application);
@ -183,6 +191,7 @@ final class PhabricatorMainMenuSearchView extends AphrontView {
} }
$selector = id(new PHUIButtonView()) $selector = id(new PHUIButtonView())
->setID($selector_id)
->addClass('phabricator-main-menu-search-dropdown') ->addClass('phabricator-main-menu-search-dropdown')
->addSigil('global-search-dropdown') ->addSigil('global-search-dropdown')
->setMetadata( ->setMetadata(
@ -210,6 +219,7 @@ final class PhabricatorMainMenuSearchView extends AphrontView {
'input', 'input',
array( array(
'type' => 'hidden', 'type' => 'hidden',
'id' => $application_id,
'sigil' => 'global-search-dropdown-app', 'sigil' => 'global-search-dropdown-app',
'name' => 'search:application', 'name' => 'search:application',
'value' => $application_value, 'value' => $application_value,

View file

@ -98,8 +98,6 @@ JX.behavior('global-drag-and-drop', function(config, statics) {
'quicksand-redraw', 'quicksand-redraw',
null, null,
function (e) { function (e) {
e.kill();
var data = e.getData(); var data = e.getData();
var toggle = data.newResponse.globalDragAndDrop; var toggle = data.newResponse.globalDragAndDrop;
statics.enabled = toggle; statics.enabled = toggle;

View file

@ -144,10 +144,39 @@ JX.behavior('phabricator-search-typeahead', function(config) {
typeahead.updatePlaceHolder(); typeahead.updatePlaceHolder();
}); });
// TODO: Quicksand needs to update the application search input as we change
// applications; we should register a listener. // When the user navigates between applications, we need to update the
// TODO: Quicksand also needs to update the application search icon on the // input in the document, the icon on the button, and the icon in the
// button itself and in the menu. // menu.
JX.Stratcom.listen(
'quicksand-redraw',
null,
function(e) {
var r = e.getData().newResponse;
updateCurrentApplication(r.applicationClass, r.applicationSearchIcon);
});
var current_app_icon;
function updateCurrentApplication(app_class, app_icon) {
current_app_icon = app_icon || config.defaultApplicationIcon;
// Update the icon on the button.
var button = JX.$(config.selectorID);
var data = JX.Stratcom.getData(button);
if (data.value == config.appScope) {
updateIcon(button, data, current_app_icon);
}
// Set the hidden input to the new value.
JX.$(config.applicationID).value = app_class;
}
function updateIcon(button, data, new_icon) {
var icon = JX.DOM.find(button, 'span', 'global-search-dropdown-icon');
JX.DOM.alterClass(icon, data.icon, false);
data.icon = new_icon;
JX.DOM.alterClass(icon, data.icon, true);
}
// Implement the scope selector menu for the global search. // Implement the scope selector menu for the global search.
JX.Stratcom.listen('click', 'global-search-dropdown', function(e) { JX.Stratcom.listen('click', 'global-search-dropdown', function(e) {
@ -165,10 +194,7 @@ JX.behavior('phabricator-search-typeahead', function(config) {
} }
// Swap out the icon. // Swap out the icon.
var icon = JX.DOM.find(button, 'span', 'global-search-dropdown-icon'); updateIcon(button, data, spec.icon);
JX.DOM.alterClass(icon, data.icon, false);
data.icon = spec.icon;
JX.DOM.alterClass(icon, data.icon, true);
// Update the value. // Update the value.
data.value = spec.value; data.value = spec.value;
@ -192,6 +218,17 @@ JX.behavior('phabricator-search-typeahead', function(config) {
for (var ii = 0; ii < data.items.length; ii++) { for (var ii = 0; ii < data.items.length; ii++) {
var spec = data.items[ii]; var spec = data.items[ii];
// If this is the "Search Current Application" item and we've
// navigated to a page which sent us new information about the
// icon, update the icon so the menu reflects the icon for the
// current application.
if (spec.value == config.appScope) {
if (current_app_icon !== undefined) {
spec.icon = current_app_icon;
}
}
var item = new JX.PHUIXActionView() var item = new JX.PHUIXActionView()
.setName(spec.name) .setName(spec.name)
.setIcon(spec.icon); .setIcon(spec.icon);