|  | /** | 
|  | * @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)}"`, | 
|  | })); | 
|  | }, | 
|  | }); | 
|  | })(); |