UNPKG

@atlaskit/global-search

Version:

A cross-product search component (batteries included)

159 lines 7.45 kB
var _a; import { __assign, __awaiter, __generator, __read, __spread } from "tslib"; import { utils, } from '@atlaskit/util-service-support'; import { AnalyticsType, ContentType, ResultType, } from '../model/Result'; var RECENT_ITEMS_PATH = 'rest/internal/2/productsearch/recent'; var PERMISSIONS_PATH = 'rest/api/2/mypermissions?permissions=USER_PICKER'; export var DEFAULT_RECENT_ITEMS_COUNT = { issues: 8, boards: 2, projects: 2, filters: 2, }; var JiraResponseGroup; (function (JiraResponseGroup) { JiraResponseGroup["Issues"] = "quick-search-issues"; JiraResponseGroup["Projects"] = "quick-search-projects"; JiraResponseGroup["Boards"] = "quick-search-boards"; JiraResponseGroup["Filters"] = "quick-search-filters"; })(JiraResponseGroup || (JiraResponseGroup = {})); var JiraResponseGroupToContentType = (_a = {}, _a[JiraResponseGroup.Issues] = ContentType.JiraIssue, _a[JiraResponseGroup.Boards] = ContentType.JiraBoard, _a[JiraResponseGroup.Filters] = ContentType.JiraFilter, _a[JiraResponseGroup.Projects] = ContentType.JiraProject, _a); var JiraClientImpl = /** @class */ (function () { function JiraClientImpl(url, cloudId, isUserAnonymous) { this.serviceConfig = { url: url }; this.cloudId = cloudId; this.isUserAnonymous = isUserAnonymous; } // Unused, just to mute ts lint JiraClientImpl.prototype.getCloudId = function () { return this.cloudId; }; /** * * @param searchSessionId unique id for each session * @param recentItemCounts number of items to return for every recent item type defaults to {@link #defaultRecentItemCounts} * @returns a promise resolved to recent items array throws if any error occurs in reqeust or if parsing or transforming response fails */ JiraClientImpl.prototype.getRecentItems = function (searchSessionId, recentItemCounts) { if (recentItemCounts === void 0) { recentItemCounts = DEFAULT_RECENT_ITEMS_COUNT; } return __awaiter(this, void 0, void 0, function () { var options, recentItems, reduced; var _this = this; return __generator(this, function (_a) { switch (_a.label) { case 0: if (this.isUserAnonymous) { return [2 /*return*/, []]; } options = { path: RECENT_ITEMS_PATH, queryParams: { counts: this.getRecentCountQueryParam(recentItemCounts), search_id: searchSessionId, }, }; return [4 /*yield*/, utils.requestService(this.serviceConfig, options)]; case 1: recentItems = (_a.sent()) || []; reduced = recentItems .filter(function (group) { return JiraResponseGroupToContentType.hasOwnProperty(group.id); }) .map(function (group) { return _this.recentItemGroupToItems(group); }) .reduce(function (acc, item) { return __spread(acc, item); }, []); return [2 /*return*/, reduced]; } }); }); }; JiraClientImpl.prototype.canSearchUsers = function () { return __awaiter(this, void 0, void 0, function () { var options, permissionsResponse; return __generator(this, function (_a) { switch (_a.label) { case 0: if (this.isUserAnonymous) { return [2 /*return*/, false]; } if (typeof this.canSearchUsersCache === 'boolean') { return [2 /*return*/, Promise.resolve(this.canSearchUsersCache)]; } options = { path: PERMISSIONS_PATH, }; return [4 /*yield*/, utils.requestService(this.serviceConfig, options)]; case 1: permissionsResponse = _a.sent(); this.canSearchUsersCache = permissionsResponse && permissionsResponse.permissions && permissionsResponse.permissions.USER_PICKER && permissionsResponse.permissions.USER_PICKER.havePermission; return [2 /*return*/, !!this.canSearchUsersCache]; } }); }); }; JiraClientImpl.prototype.recentItemGroupToItems = function (group) { var _this = this; var id = group.id, items = group.items; return items.map(function (item) { return _this.recentItemToResultItem(item, id); }); }; JiraClientImpl.prototype.recentItemToResultItem = function (item, jiraGroup) { var containerId = this.getContainerId(item, jiraGroup); var contentType = JiraResponseGroupToContentType[jiraGroup]; var resultId = '' + item.id; return __assign({ resultType: ResultType.JiraObjectResult, resultId: resultId, name: item.title, href: item.url, analyticsType: AnalyticsType.RecentJira, avatarUrl: item.avatarUrl, containerId: containerId, contentType: contentType }, this.getTypeSpecificAttributes(item, jiraGroup)); }; JiraClientImpl.prototype.getContainerId = function (item, jiraGroup) { return jiraGroup === JiraResponseGroup.Filters ? item.attributes && item.attributes.ownerId : item.attributes && item.attributes.containerId; }; JiraClientImpl.prototype.getTypeSpecificAttributes = function (item, jiraGroup) { switch (jiraGroup) { case JiraResponseGroup.Filters: return { containerName: item.metadata, objectKey: 'Filters', }; case JiraResponseGroup.Projects: return { containerName: item.metadata, }; case JiraResponseGroup.Issues: var issueType = item.attributes && item.attributes.issueTypeName; return { containerName: issueType ? issueType : item.metadata, objectKey: issueType ? item.metadata : undefined, }; case JiraResponseGroup.Boards: return { containerName: item.attributes ? item.attributes.containerName : item.metadata, }; } }; /** * Private method to construct a valid value for the 'counts' query param * for the Jira recent API. The format is as follows: * * ?counts=issues=8,boards=2,projects=2,filters=2 * * @param recentCounts */ JiraClientImpl.prototype.getRecentCountQueryParam = function (recentCounts) { var keys = Object.keys(recentCounts); return keys.map(function (key) { return key + "=" + recentCounts[key]; }).join(','); }; return JiraClientImpl; }()); export default JiraClientImpl; //# sourceMappingURL=JiraClient.js.map