/** * @license * Copyright (C) 2016 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ (function() { 'use strict'; const MAX_AUTOCOMPLETE_RESULTS = 10; const SELF_EXPRESSION = 'self'; const ME_EXPRESSION = 'me'; Polymer({ is: 'gr-smart-search', properties: { searchQuery: String, _config: Object, _projectSuggestions: { type: Function, value() { return this._fetchProjects.bind(this); }, }, _groupSuggestions: { type: Function, value() { return this._fetchGroups.bind(this); }, }, _accountSuggestions: { type: Function, value() { return this._fetchAccounts.bind(this); }, }, }, behaviors: [ Gerrit.AnonymousNameBehavior, ], attached() { this.$.restAPI.getConfig().then(cfg => { this._config = cfg; }); }, _handleSearch(e) { const input = e.detail.inputVal; if (input) { Gerrit.Nav.navigateToSearchQuery(input); } }, _accountOrAnon(name) { return this.getUserName(this._serverConfig, name, false); }, /** * Fetch from the API the predicted projects. * @param {string} predicate - The first part of the search term, e.g. * 'project' * @param {string} expression - The second part of the search term, e.g. * 'gerr' * @return {!Promise} This returns a promise that resolves to an array of * strings. */ _fetchProjects(predicate, expression) { return this.$.restAPI.getSuggestedProjects( expression, MAX_AUTOCOMPLETE_RESULTS) .then(projects => { if (!projects) { return []; } const keys = Object.keys(projects); return keys.map(key => ({text: predicate + ':' + key})); }); }, /** * Fetch from the API the predicted groups. * @param {string} predicate - The first part of the search term, e.g. * 'ownerin' * @param {string} expression - The second part of the search term, e.g. * 'polyger' * @return {!Promise} This returns a promise that resolves to an array of * strings. */ _fetchGroups(predicate, expression) { if (expression.length === 0) { return Promise.resolve([]); } return this.$.restAPI.getSuggestedGroups( expression, MAX_AUTOCOMPLETE_RESULTS) .then(groups => { if (!groups) { return []; } const keys = Object.keys(groups); return keys.map(key => ({text: predicate + ':' + key})); }); }, /** * Fetch from the API the predicted accounts. * @param {string} predicate - The first part of the search term, e.g. * 'owner' * @param {string} expression - The second part of the search term, e.g. * 'kasp' * @return {!Promise} This returns a promise that resolves to an array of * strings. */ _fetchAccounts(predicate, expression) { if (expression.length === 0) { return Promise.resolve([]); } return this.$.restAPI.getSuggestedAccounts( expression, MAX_AUTOCOMPLETE_RESULTS) .then(accounts => { if (!accounts) { return []; } return this._mapAccountsHelper(accounts, predicate); }).then(accounts => { // When the expression supplied is a beginning substring of 'self', // add it as an autocomplete option. if (SELF_EXPRESSION.startsWith(expression)) { return accounts.concat( [{text: predicate + ':' + SELF_EXPRESSION}]); } else if (ME_EXPRESSION.startsWith(expression)) { return accounts.concat([{text: predicate + ':' + ME_EXPRESSION}]); } else { return accounts; } }); }, _mapAccountsHelper(accounts, predicate) { return accounts.map(account => ({ label: account.name || '', text: account.email ? `${predicate}:${account.email}` : `${predicate}:"${this._accountOrAnon(account)}"`, })); }, }); })();