atom-nuclide
Version:
A unified developer experience for web and mobile development, built as a suite of features on top of Atom to provide hackability and the support of an active community.
901 lines (833 loc) • 35.1 kB
JavaScript
Object.defineProperty(exports, '__esModule', {
value: true
});
/*
* Copyright (c) 2015-present, Facebook, Inc.
* All rights reserved.
*
* This source code is licensed under the license found in the LICENSE file in
* the root directory of this source tree.
*/
var _slicedToArray = (function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i['return']) _i['return'](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError('Invalid attempt to destructure non-iterable instance'); } }; })();
var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
var _get = function get(_x, _x2, _x3) { var _again = true; _function: while (_again) { var object = _x, property = _x2, receiver = _x3; _again = false; if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { _x = parent; _x2 = property; _x3 = receiver; _again = true; desc = parent = undefined; continue _function; } } else if ('value' in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } } };
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
var _nuclideUiLibAtomInput2;
function _nuclideUiLibAtomInput() {
return _nuclideUiLibAtomInput2 = require('../../nuclide-ui/lib/AtomInput');
}
var _nuclideUiLibButton2;
function _nuclideUiLibButton() {
return _nuclideUiLibButton2 = require('../../nuclide-ui/lib/Button');
}
var _nuclideUiLibTabs2;
function _nuclideUiLibTabs() {
return _nuclideUiLibTabs2 = _interopRequireDefault(require('../../nuclide-ui/lib/Tabs'));
}
var _atom2;
function _atom() {
return _atom2 = require('atom');
}
var _commonsNodeDebounce2;
function _commonsNodeDebounce() {
return _commonsNodeDebounce2 = _interopRequireDefault(require('../../commons-node/debounce'));
}
var _commonsNodeHumanizeKeystroke2;
function _commonsNodeHumanizeKeystroke() {
return _commonsNodeHumanizeKeystroke2 = _interopRequireDefault(require('../../commons-node/humanizeKeystroke'));
}
var _commonsNodeCollection2;
function _commonsNodeCollection() {
return _commonsNodeCollection2 = require('../../commons-node/collection');
}
var _reactForAtom2;
function _reactForAtom() {
return _reactForAtom2 = require('react-for-atom');
}
var _SearchResultManager2;
function _SearchResultManager() {
return _SearchResultManager2 = _interopRequireDefault(require('./SearchResultManager'));
}
var _classnames2;
function _classnames() {
return _classnames2 = _interopRequireDefault(require('classnames'));
}
var _searchResultHelpers2;
function _searchResultHelpers() {
return _searchResultHelpers2 = require('./searchResultHelpers');
}
var _commonsNodeNuclideUri2;
function _commonsNodeNuclideUri() {
return _commonsNodeNuclideUri2 = _interopRequireDefault(require('../../commons-node/nuclideUri'));
}
var _QuickSelectionActions2;
function _QuickSelectionActions() {
return _QuickSelectionActions2 = _interopRequireDefault(require('./QuickSelectionActions'));
}
var RESULTS_CHANGED_DEBOUNCE_DELAY = 50;
var searchResultManager = (_SearchResultManager2 || _SearchResultManager()).default.getInstance();
/**
* Determine what the applicable shortcut for a given action is within this component's context.
* For example, this will return different keybindings on windows vs linux.
*/
function _findKeybindingForAction(action, target) {
var matchingKeyBindings = atom.keymaps.findKeyBindings({
command: action,
target: target
});
var keystroke = matchingKeyBindings.length && matchingKeyBindings[0].keystrokes || '';
return (0, (_commonsNodeHumanizeKeystroke2 || _commonsNodeHumanizeKeystroke()).default)(keystroke);
}
function sortServiceNames(names) {
return names.sort(function (serviceName1, serviceName2) {
var provider1 = searchResultManager.getProviderByName(serviceName1);
var provider2 = searchResultManager.getProviderByName(serviceName2);
if (provider1.priority == null || provider2.priority == null || provider1.priority === provider2.priority) {
return provider1.name.localeCompare(provider2.name);
}
return provider1.priority - provider2.priority;
});
}
var QuickSelectionComponent = (function (_React$Component) {
_inherits(QuickSelectionComponent, _React$Component);
function QuickSelectionComponent(props) {
var _this = this;
_classCallCheck(this, QuickSelectionComponent);
_get(Object.getPrototypeOf(QuickSelectionComponent.prototype), 'constructor', this).call(this, props);
this._emitter = new (_atom2 || _atom()).Emitter();
this._subscriptions = new (_atom2 || _atom()).CompositeDisposable();
this._boundSelect = function () {
return _this.select();
};
this._isMounted = false;
this.state = {
activeTab: searchResultManager.getProviderByName(searchResultManager.getActiveProviderName()),
// treated as immutable
resultsByService: {},
renderableProviders: searchResultManager.getRenderableProviders(),
selectedService: '',
selectedDirectory: '',
selectedItemIndex: -1,
hasUserSelection: false
};
this._handleTabChange = this._handleTabChange.bind(this);
this.handleProvidersChange = this.handleProvidersChange.bind(this);
this.handleResultsChange = this.handleResultsChange.bind(this);
this.handleDocumentMouseDown = this.handleDocumentMouseDown.bind(this);
}
_createClass(QuickSelectionComponent, [{
key: 'componentWillReceiveProps',
value: function componentWillReceiveProps(nextProps) {
var _this2 = this;
if (nextProps.activeProvider !== this.props.activeProvider) {
if (nextProps.activeProvider) {
(function () {
_this2._getTextEditor().setPlaceholderText(nextProps.activeProvider.prompt);
var newResults = {};
_this2.setState({
activeTab: nextProps.activeProvider || _this2.state.activeTab,
resultsByService: newResults
}, function () {
setImmediate(function () {
return _this2.setQuery(_this2.refs.queryInput.getText());
});
_this2._updateQueryHandler();
_this2._emitter.emit('items-changed', newResults);
});
})();
}
}
}
}, {
key: 'componentDidUpdate',
value: function componentDidUpdate(prevProps, prevState) {
if (prevState.resultsByService !== this.state.resultsByService) {
this._emitter.emit('items-changed', this.state.resultsByService);
}
if (prevState.selectedItemIndex !== this.state.selectedItemIndex || prevState.selectedService !== this.state.selectedService || prevState.selectedDirectory !== this.state.selectedDirectory) {
this._updateScrollPosition();
}
}
}, {
key: 'componentDidMount',
value: function componentDidMount() {
var _this3 = this;
this._isMounted = true;
this._modalNode = (_reactForAtom2 || _reactForAtom()).ReactDOM.findDOMNode(this);
this._subscriptions.add(atom.commands.add(this._modalNode, 'core:move-to-bottom', this.handleMoveToBottom.bind(this)), atom.commands.add(this._modalNode, 'core:move-to-top', this.handleMoveToTop.bind(this)), atom.commands.add(this._modalNode, 'core:move-down', this.handleMoveDown.bind(this)), atom.commands.add(this._modalNode, 'core:move-up', this.handleMoveUp.bind(this)), atom.commands.add(this._modalNode, 'core:confirm', this.select.bind(this)));
// Close quick open if user clicks outside the frame.
document.addEventListener('mousedown', this.handleDocumentMouseDown);
this._subscriptions.add(new (_atom2 || _atom()).Disposable(function () {
document.removeEventListener('mousedown', _this3.handleDocumentMouseDown);
}));
var inputTextEditor = this.getInputTextEditor();
this._subscriptions.add(searchResultManager.on(searchResultManager.PROVIDERS_CHANGED, this.handleProvidersChange), searchResultManager.on(searchResultManager.RESULTS_CHANGED, (0, (_commonsNodeDebounce2 || _commonsNodeDebounce()).default)(this.handleResultsChange, RESULTS_CHANGED_DEBOUNCE_DELAY, false)));
this._updateQueryHandler();
inputTextEditor.getModel().onDidChange(function () {
return _this3._handleTextInputChange();
});
this.clear();
}
}, {
key: 'componentWillUnmount',
value: function componentWillUnmount() {
this._isMounted = false;
this._emitter.dispose();
this._subscriptions.dispose();
}
}, {
key: 'handleMoveToBottom',
value: function handleMoveToBottom() {
this.moveSelectionToBottom();
this.onUserDidChangeSelection();
}
}, {
key: 'handleMoveToTop',
value: function handleMoveToTop() {
this.moveSelectionToTop();
this.onUserDidChangeSelection();
}
}, {
key: 'handleMoveDown',
value: function handleMoveDown() {
this.moveSelectionDown();
this.onUserDidChangeSelection();
}
}, {
key: 'handleMoveUp',
value: function handleMoveUp() {
this.moveSelectionUp();
this.onUserDidChangeSelection();
}
}, {
key: 'handleDocumentMouseDown',
value: function handleDocumentMouseDown(event) {
var modal = this.refs.modal;
// If the click did not happen on the modal or on any of its descendants,
// the click was elsewhere on the document and should close the modal.
if (event.target !== modal && !modal.contains(event.target)) {
this.props.onBlur();
}
}
}, {
key: 'onCancellation',
value: function onCancellation(callback) {
return this._emitter.on('canceled', callback);
}
}, {
key: 'onSelection',
value: function onSelection(callback) {
return this._emitter.on('selected', callback);
}
}, {
key: 'onSelectionChanged',
value: function onSelectionChanged(callback) {
return this._emitter.on('selection-changed', callback);
}
}, {
key: 'onItemsChanged',
value: function onItemsChanged(callback) {
return this._emitter.on('items-changed', callback);
}
}, {
key: '_updateQueryHandler',
value: function _updateQueryHandler() {
var _this4 = this;
this._debouncedQueryHandler = (0, (_commonsNodeDebounce2 || _commonsNodeDebounce()).default)(function () {
if (_this4._isMounted) {
_this4.setKeyboardQuery(_this4.getInputTextEditor().getModel().getText());
}
}, this.getProvider().debounceDelay || 0, false);
}
}, {
key: '_handleTextInputChange',
value: function _handleTextInputChange() {
this._debouncedQueryHandler();
}
}, {
key: 'handleResultsChange',
value: function handleResultsChange() {
// This function is running on a timer (debounced), it is possible that it
// may be called after the component has unmounted.
if (this._isMounted) {
var _activeProviderName = searchResultManager.getActiveProviderName();
this._updateResults(_activeProviderName);
}
}
}, {
key: '_updateResults',
value: function _updateResults(activeProviderName) {
var _this5 = this;
var updatedResults = searchResultManager.getResults(this.refs.queryInput.getText(), activeProviderName);
var _sortServiceNames = sortServiceNames(Object.keys(updatedResults));
var _sortServiceNames2 = _slicedToArray(_sortServiceNames, 1);
var topProviderName = _sortServiceNames2[0];
this.setState({
resultsByService: updatedResults
}, function () {
if (!_this5.state.hasUserSelection && topProviderName != null && _this5.state.resultsByService[topProviderName] != null) {
(function () {
var topProviderResults = _this5.state.resultsByService[topProviderName].results;
if (!Object.keys(topProviderResults).some(function (dirName) {
return topProviderResults[dirName].loading;
})) {
_this5.moveSelectionToTop();
}
})();
}
});
}
}, {
key: 'handleProvidersChange',
value: function handleProvidersChange() {
var renderableProviders = searchResultManager.getRenderableProviders();
var activeProviderName = searchResultManager.getActiveProviderName();
this._updateResults(activeProviderName);
this.setState({
renderableProviders: renderableProviders,
activeProviderName: activeProviderName
});
}
}, {
key: 'select',
value: function select() {
var selectedItem = this.getSelectedItem();
if (!selectedItem) {
this.cancel();
} else {
this._emitter.emit('selected', selectedItem);
}
}
}, {
key: 'onUserDidChangeSelection',
value: function onUserDidChangeSelection() {
this.setState({
hasUserSelection: true
});
}
}, {
key: 'cancel',
value: function cancel() {
this._emitter.emit('canceled');
}
}, {
key: 'clearSelection',
value: function clearSelection() {
this.setSelectedIndex('', '', -1);
}
}, {
key: '_getCurrentResultContext',
value: function _getCurrentResultContext() {
var nonEmptyResults = (0, (_searchResultHelpers2 || _searchResultHelpers()).filterEmptyResults)(this.state.resultsByService);
var serviceNames = sortServiceNames(Object.keys(nonEmptyResults));
var currentServiceIndex = serviceNames.indexOf(this.state.selectedService);
var currentService = nonEmptyResults[this.state.selectedService];
if (!currentService) {
return null;
}
var directoryNames = Object.keys(currentService.results);
var currentDirectoryIndex = directoryNames.indexOf(this.state.selectedDirectory);
var currentDirectory = currentService.results[this.state.selectedDirectory];
if (!currentDirectory || !currentDirectory.results) {
return null;
}
return {
nonEmptyResults: nonEmptyResults,
serviceNames: serviceNames,
currentServiceIndex: currentServiceIndex,
currentService: currentService,
directoryNames: directoryNames,
currentDirectoryIndex: currentDirectoryIndex,
currentDirectory: currentDirectory
};
}
}, {
key: 'moveSelectionDown',
value: function moveSelectionDown() {
var context = this._getCurrentResultContext();
if (!context) {
this.moveSelectionToTop();
return;
}
if (this.state.selectedItemIndex < context.currentDirectory.results.length - 1) {
// only bump the index if remaining in current directory
this.setSelectedIndex(this.state.selectedService, this.state.selectedDirectory, this.state.selectedItemIndex + 1);
} else {
// otherwise go to next directory...
if (context.currentDirectoryIndex < context.directoryNames.length - 1) {
this.setSelectedIndex(this.state.selectedService, context.directoryNames[context.currentDirectoryIndex + 1], 0);
} else {
// ...or the next service...
if (context.currentServiceIndex < context.serviceNames.length - 1) {
var newServiceName = context.serviceNames[context.currentServiceIndex + 1];
var newDirectoryName = Object.keys(context.nonEmptyResults[newServiceName].results).shift();
this.setSelectedIndex(newServiceName, newDirectoryName, 0);
} else {
// ...or wrap around to the very top
this.moveSelectionToTop();
}
}
}
}
}, {
key: 'moveSelectionUp',
value: function moveSelectionUp() {
var context = this._getCurrentResultContext();
if (!context) {
this.moveSelectionToBottom();
return;
}
if (this.state.selectedItemIndex > 0) {
// only decrease the index if remaining in current directory
this.setSelectedIndex(this.state.selectedService, this.state.selectedDirectory, this.state.selectedItemIndex - 1);
} else {
// otherwise, go to the previous directory...
if (context.currentDirectoryIndex > 0) {
this.setSelectedIndex(this.state.selectedService, context.directoryNames[context.currentDirectoryIndex - 1], context.currentService.results[context.directoryNames[context.currentDirectoryIndex - 1]].results.length - 1);
} else {
// ...or the previous service...
if (context.currentServiceIndex > 0) {
var newServiceName = context.serviceNames[context.currentServiceIndex - 1];
var newDirectoryName = Object.keys(context.nonEmptyResults[newServiceName].results).pop();
if (newDirectoryName == null) {
return;
}
var resultsForDirectory = context.nonEmptyResults[newServiceName].results[newDirectoryName];
if (resultsForDirectory == null || resultsForDirectory.results == null) {
return;
}
this.setSelectedIndex(newServiceName, newDirectoryName, resultsForDirectory.results.length - 1);
} else {
// ...or wrap around to the very bottom
this.moveSelectionToBottom();
}
}
}
}
// Update the scroll position of the list view to ensure the selected item is visible.
}, {
key: '_updateScrollPosition',
value: function _updateScrollPosition() {
if (!(this.refs && this.refs.selectionList)) {
return;
}
var listNode = (_reactForAtom2 || _reactForAtom()).ReactDOM.findDOMNode(this.refs.selectionList);
var selectedNode = listNode.getElementsByClassName('selected')[0];
// false is passed for @centerIfNeeded parameter, which defaults to true.
// Passing false causes the minimum necessary scroll to occur, so the selection sticks to the
// top/bottom.
if (selectedNode) {
selectedNode.scrollIntoViewIfNeeded(false);
}
}
}, {
key: 'moveSelectionToBottom',
value: function moveSelectionToBottom() {
var bottom = this._getOuterResults(Array.prototype.pop);
if (!bottom) {
return;
}
this.setSelectedIndex(bottom.serviceName, bottom.directoryName, bottom.results.length - 1);
}
}, {
key: 'moveSelectionToTop',
value: function moveSelectionToTop() {
var top = this._getOuterResults(Array.prototype.shift);
if (!top) {
return;
}
this.setSelectedIndex(top.serviceName, top.directoryName, 0);
}
}, {
key: '_getOuterResults',
value: function _getOuterResults(arrayOperation) {
var nonEmptyResults = (0, (_searchResultHelpers2 || _searchResultHelpers()).filterEmptyResults)(this.state.resultsByService);
var serviceName = arrayOperation.call(sortServiceNames(Object.keys(nonEmptyResults)));
if (!serviceName) {
return null;
}
var service = nonEmptyResults[serviceName];
var directoryName = arrayOperation.call(Object.keys(service.results));
return {
serviceName: serviceName,
directoryName: directoryName,
results: nonEmptyResults[serviceName].results[directoryName].results
};
}
}, {
key: 'getSelectedItem',
value: function getSelectedItem() {
return this.getItemAtIndex(this.state.selectedService, this.state.selectedDirectory, this.state.selectedItemIndex);
}
}, {
key: 'getItemAtIndex',
value: function getItemAtIndex(serviceName, directory, itemIndex) {
if (itemIndex === -1 || !this.state.resultsByService[serviceName] || !this.state.resultsByService[serviceName].results[directory] || !this.state.resultsByService[serviceName].results[directory].results[itemIndex]) {
return null;
}
return this.state.resultsByService[serviceName].results[directory].results[itemIndex];
}
}, {
key: 'componentForItem',
value: function componentForItem(item, serviceName, dirName) {
return searchResultManager.getRendererForProvider(serviceName)(item, serviceName, dirName);
}
}, {
key: 'getSelectedIndex',
value: function getSelectedIndex() {
return {
selectedDirectory: this.state.selectedDirectory,
selectedService: this.state.selectedService,
selectedItemIndex: this.state.selectedItemIndex
};
}
}, {
key: 'setSelectedIndex',
value: function setSelectedIndex(service, directory, itemIndex) {
var _this6 = this;
this.setState({
selectedService: service,
selectedDirectory: directory,
selectedItemIndex: itemIndex
}, function () {
_this6._emitter.emit('selection-changed', _this6.getSelectedIndex());
_this6.onUserDidChangeSelection();
});
}
}, {
key: 'resetSelection',
value: function resetSelection() {
this.setState({
selectedService: '',
selectedDirectory: '',
selectedItemIndex: -1,
hasUserSelection: false
});
}
}, {
key: 'setKeyboardQuery',
value: function setKeyboardQuery(query) {
this.resetSelection();
this.setQuery(query);
}
}, {
key: 'setQuery',
value: function setQuery(query) {
(_QuickSelectionActions2 || _QuickSelectionActions()).default.query(query);
}
}, {
key: 'getProvider',
value: function getProvider() {
return this.props.activeProvider;
}
}, {
key: 'getInputTextEditor',
value: function getInputTextEditor() {
return (_reactForAtom2 || _reactForAtom()).ReactDOM.findDOMNode(this.refs.queryInput);
}
}, {
key: 'clear',
value: function clear() {
this.getInputTextEditor().getModel().setText('');
this.clearSelection();
}
}, {
key: 'focus',
value: function focus() {
this.getInputTextEditor().focus();
}
}, {
key: 'blur',
value: function blur() {
this.getInputTextEditor().blur();
}
}, {
key: 'setInputValue',
value: function setInputValue(value) {
this._getTextEditor().setText(value);
}
}, {
key: 'selectInput',
value: function selectInput() {
this._getTextEditor().selectAll();
}
}, {
key: '_getTextEditor',
value: function _getTextEditor() {
return this.refs.queryInput.getTextEditor();
}
/**
* @param newTab is actually a ProviderSpec plus the `name` and `tabContent` properties added by
* _renderTabs(), which created the tab object in the first place.
*/
}, {
key: '_handleTabChange',
value: function _handleTabChange(newTab) {
var providerName = newTab.name;
if (providerName !== this.props.activeProvider.name) {
(_QuickSelectionActions2 || _QuickSelectionActions()).default.changeActiveProvider(providerName);
}
this.refs.queryInput.focus();
}
}, {
key: '_renderTabs',
value: function _renderTabs() {
var _this7 = this;
var tabs = this.state.renderableProviders.map(function (tab) {
var keyBinding = null; // TODO
var humanizedKeybinding = _findKeybindingForAction(tab.action || '', _this7._modalNode);
if (humanizedKeybinding !== '') {
keyBinding = (_reactForAtom2 || _reactForAtom()).React.createElement(
'kbd',
{ className: 'key-binding' },
humanizedKeybinding
);
}
return {
name: tab.name,
tabContent: (_reactForAtom2 || _reactForAtom()).React.createElement(
'span',
null,
tab.title,
keyBinding
)
};
});
return (_reactForAtom2 || _reactForAtom()).React.createElement(
'div',
{ className: 'omnisearch-tabs' },
(_reactForAtom2 || _reactForAtom()).React.createElement((_nuclideUiLibTabs2 || _nuclideUiLibTabs()).default, {
tabs: tabs,
activeTabName: this.state.activeTab.name,
onActiveTabChange: this._handleTabChange
})
);
}
}, {
key: '_renderEmptyMessage',
value: function _renderEmptyMessage(message) {
return (_reactForAtom2 || _reactForAtom()).React.createElement(
'ul',
{ className: 'background-message centered' },
(_reactForAtom2 || _reactForAtom()).React.createElement(
'li',
null,
message
)
);
}
}, {
key: 'openAll',
value: function openAll(files) {
var _this8 = this;
files.map(function (file) {
_this8._emitter.emit('selected', _this8.getItemAtIndex(file.selectedService, file.selectedDirectory, file.selectedItemIndex));
});
}
}, {
key: '_handleKeyPress',
value: function _handleKeyPress(e, files) {
if (e.shiftKey && e.key === 'Enter') {
this.openAll(files);
}
}
}, {
key: 'render',
value: function render() {
var _this9 = this;
var filesToOpen = [];
var numTotalResultsRendered = 0;
var isOmniSearchActive = this.state.activeTab.name === 'OmniSearchResultProvider';
var numQueriesOutstanding = 0;
var serviceNames = sortServiceNames(Object.keys(this.state.resultsByService));
var services = serviceNames.map(function (serviceName) {
var numResultsForService = 0;
var directories = _this9.state.resultsByService[serviceName].results;
var serviceTitle = _this9.state.resultsByService[serviceName].title;
var directoryNames = Object.keys(directories);
var directoriesForService = directoryNames.map(function (dirName) {
var resultsForDirectory = directories[dirName];
var message = null;
if (resultsForDirectory.loading) {
numQueriesOutstanding++;
if (!isOmniSearchActive) {
numTotalResultsRendered++;
message = (_reactForAtom2 || _reactForAtom()).React.createElement(
'span',
null,
(_reactForAtom2 || _reactForAtom()).React.createElement('span', { className: 'loading loading-spinner-tiny inline-block' }),
'Loading...'
);
}
} else if (resultsForDirectory.error && !isOmniSearchActive) {
message = (_reactForAtom2 || _reactForAtom()).React.createElement(
'span',
null,
(_reactForAtom2 || _reactForAtom()).React.createElement('span', { className: 'icon icon-circle-slash' }),
'Error: ',
(_reactForAtom2 || _reactForAtom()).React.createElement(
'pre',
null,
resultsForDirectory.error
)
);
} else if (resultsForDirectory.results.length === 0 && !isOmniSearchActive) {
message = (_reactForAtom2 || _reactForAtom()).React.createElement(
'span',
null,
(_reactForAtom2 || _reactForAtom()).React.createElement('span', { className: 'icon icon-x' }),
'No results'
);
}
var itemComponents = resultsForDirectory.results.map(function (item, itemIndex) {
numResultsForService++;
numTotalResultsRendered++;
var isSelected = serviceName === _this9.state.selectedService && dirName === _this9.state.selectedDirectory && itemIndex === _this9.state.selectedItemIndex;
filesToOpen.push({ selectedService: serviceName,
selectedDirectory: dirName,
selectedItemIndex: itemIndex
});
return (_reactForAtom2 || _reactForAtom()).React.createElement(
'li',
{
className: (0, (_classnames2 || _classnames()).default)({
'quick-open-result-item': true,
'list-item': true,
'selected': isSelected
}),
key: serviceName + dirName + itemIndex,
onMouseDown: _this9._boundSelect,
onMouseEnter: _this9.setSelectedIndex.bind(_this9, serviceName, dirName, itemIndex) },
_this9.componentForItem(item, serviceName, dirName)
);
});
var directoryLabel = null;
// hide folders if only 1 level would be shown, or if no results were found
var showDirectories = directoryNames.length > 1 && (!isOmniSearchActive || resultsForDirectory.results.length > 0);
if (showDirectories) {
directoryLabel = (_reactForAtom2 || _reactForAtom()).React.createElement(
'div',
{ className: 'list-item' },
(_reactForAtom2 || _reactForAtom()).React.createElement(
'span',
{ className: 'icon icon-file-directory' },
(_commonsNodeNuclideUri2 || _commonsNodeNuclideUri()).default.nuclideUriToDisplayString(dirName)
)
);
}
return (_reactForAtom2 || _reactForAtom()).React.createElement(
'li',
{ className: (0, (_classnames2 || _classnames()).default)({ 'list-nested-item': showDirectories }), key: dirName },
directoryLabel,
message,
(_reactForAtom2 || _reactForAtom()).React.createElement(
'ul',
{ className: 'list-tree' },
itemComponents
)
);
});
var serviceLabel = null;
if (isOmniSearchActive && numResultsForService > 0) {
serviceLabel = (_reactForAtom2 || _reactForAtom()).React.createElement(
'div',
{ className: 'list-item' },
(_reactForAtom2 || _reactForAtom()).React.createElement(
'span',
{ className: 'icon icon-gear' },
serviceTitle
)
);
return (_reactForAtom2 || _reactForAtom()).React.createElement(
'li',
{ className: 'list-nested-item', key: serviceName },
serviceLabel,
(_reactForAtom2 || _reactForAtom()).React.createElement(
'ul',
{ className: 'list-tree' },
directoriesForService
)
);
}
return directoriesForService;
});
var noResultsMessage = null;
var hasSearchResult = false;
if ((0, (_commonsNodeCollection2 || _commonsNodeCollection()).isEmpty)(this.state.resultsByService)) {
noResultsMessage = this._renderEmptyMessage('Search away!');
} else if (numTotalResultsRendered === 0) {
noResultsMessage = this._renderEmptyMessage((_reactForAtom2 || _reactForAtom()).React.createElement(
'span',
null,
'No results'
));
} else {
hasSearchResult = true;
}
var currentProvider = this.getProvider();
var promptText = currentProvider && currentProvider.prompt || '';
var omniSearchStatus = null;
if (isOmniSearchActive && numQueriesOutstanding > 0) {
omniSearchStatus = (_reactForAtom2 || _reactForAtom()).React.createElement(
'span',
null,
(_reactForAtom2 || _reactForAtom()).React.createElement('span', { className: 'loading loading-spinner-tiny inline-block' }),
'Loading...'
);
}
return (_reactForAtom2 || _reactForAtom()).React.createElement(
'div',
{
className: 'select-list omnisearch-modal',
ref: 'modal',
onKeyPress: function (e) {
return _this9._handleKeyPress(e, filesToOpen);
} },
(_reactForAtom2 || _reactForAtom()).React.createElement(
'div',
{ className: 'omnisearch-search-bar' },
(_reactForAtom2 || _reactForAtom()).React.createElement((_nuclideUiLibAtomInput2 || _nuclideUiLibAtomInput()).AtomInput, {
className: 'omnisearch-pane',
ref: 'queryInput',
placeholderText: promptText
}),
(_reactForAtom2 || _reactForAtom()).React.createElement(
(_nuclideUiLibButton2 || _nuclideUiLibButton()).Button,
{
className: 'omnisearch-open-all',
onClick: function () {
return _this9.openAll(filesToOpen);
},
disabled: !hasSearchResult },
'Open All'
)
),
this._renderTabs(),
(_reactForAtom2 || _reactForAtom()).React.createElement(
'div',
{
className: 'omnisearch-results',
style: {
maxHeight: this.props.scrollableAreaHeightGap ? 'calc(100vh - ' + this.props.scrollableAreaHeightGap + 'px)' : '100vh'
} },
noResultsMessage,
(_reactForAtom2 || _reactForAtom()).React.createElement(
'div',
{ className: 'omnisearch-pane' },
(_reactForAtom2 || _reactForAtom()).React.createElement(
'ul',
{ className: 'list-tree', ref: 'selectionList' },
services,
omniSearchStatus
)
)
)
);
}
}]);
return QuickSelectionComponent;
})((_reactForAtom2 || _reactForAtom()).React.Component);
exports.default = QuickSelectionComponent;
module.exports = exports.default;