UNPKG

@atlaskit/global-search

Version:

A cross-product search component (batteries included)

266 lines (228 loc) 9.9 kB
import _regeneratorRuntime from "@babel/runtime/regenerator"; import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray"; import _asyncToGenerator from "@babel/runtime/helpers/asyncToGenerator"; import _classCallCheck from "@babel/runtime/helpers/classCallCheck"; import _createClass from "@babel/runtime/helpers/createClass"; import _defineProperty from "@babel/runtime/helpers/defineProperty"; var _JiraResponseGroupToC; function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; } 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 }; /** * Jira client to reterive recent items from jira */ 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 = (_JiraResponseGroupToC = {}, _defineProperty(_JiraResponseGroupToC, JiraResponseGroup.Issues, ContentType.JiraIssue), _defineProperty(_JiraResponseGroupToC, JiraResponseGroup.Boards, ContentType.JiraBoard), _defineProperty(_JiraResponseGroupToC, JiraResponseGroup.Filters, ContentType.JiraFilter), _defineProperty(_JiraResponseGroupToC, JiraResponseGroup.Projects, ContentType.JiraProject), _JiraResponseGroupToC); var JiraClientImpl = /*#__PURE__*/function () { function JiraClientImpl(url, cloudId, isUserAnonymous) { _classCallCheck(this, JiraClientImpl); this.serviceConfig = { url: url }; this.cloudId = cloudId; this.isUserAnonymous = isUserAnonymous; } // Unused, just to mute ts lint _createClass(JiraClientImpl, [{ key: "getCloudId", value: function getCloudId() { 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 */ }, { key: "getRecentItems", value: function () { var _getRecentItems = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(searchSessionId) { var _this = this; var recentItemCounts, options, recentItems, reduced, _args = arguments; return _regeneratorRuntime.wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: recentItemCounts = _args.length > 1 && _args[1] !== undefined ? _args[1] : DEFAULT_RECENT_ITEMS_COUNT; if (!this.isUserAnonymous) { _context.next = 3; break; } return _context.abrupt("return", []); case 3: options = { path: RECENT_ITEMS_PATH, queryParams: { counts: this.getRecentCountQueryParam(recentItemCounts), search_id: searchSessionId } }; _context.next = 6; return utils.requestService(this.serviceConfig, options); case 6: _context.t0 = _context.sent; if (_context.t0) { _context.next = 9; break; } _context.t0 = []; case 9: recentItems = _context.t0; reduced = recentItems.filter(function (group) { return JiraResponseGroupToContentType.hasOwnProperty(group.id); }).map(function (group) { return _this.recentItemGroupToItems(group); }).reduce(function (acc, item) { return [].concat(_toConsumableArray(acc), _toConsumableArray(item)); }, []); return _context.abrupt("return", reduced); case 12: case "end": return _context.stop(); } } }, _callee, this); })); function getRecentItems(_x) { return _getRecentItems.apply(this, arguments); } return getRecentItems; }() }, { key: "canSearchUsers", value: function () { var _canSearchUsers = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2() { var options, permissionsResponse; return _regeneratorRuntime.wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: if (!this.isUserAnonymous) { _context2.next = 2; break; } return _context2.abrupt("return", false); case 2: if (!(typeof this.canSearchUsersCache === 'boolean')) { _context2.next = 4; break; } return _context2.abrupt("return", Promise.resolve(this.canSearchUsersCache)); case 4: options = { path: PERMISSIONS_PATH }; _context2.next = 7; return utils.requestService(this.serviceConfig, options); case 7: permissionsResponse = _context2.sent; this.canSearchUsersCache = permissionsResponse && permissionsResponse.permissions && permissionsResponse.permissions.USER_PICKER && permissionsResponse.permissions.USER_PICKER.havePermission; return _context2.abrupt("return", !!this.canSearchUsersCache); case 10: case "end": return _context2.stop(); } } }, _callee2, this); })); function canSearchUsers() { return _canSearchUsers.apply(this, arguments); } return canSearchUsers; }() }, { key: "recentItemGroupToItems", value: function recentItemGroupToItems(group) { var _this2 = this; var id = group.id, items = group.items; return items.map(function (item) { return _this2.recentItemToResultItem(item, id); }); } }, { key: "recentItemToResultItem", value: function recentItemToResultItem(item, jiraGroup) { var containerId = this.getContainerId(item, jiraGroup); var contentType = JiraResponseGroupToContentType[jiraGroup]; var resultId = '' + item.id; return _objectSpread({ 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)); } }, { key: "getContainerId", value: function getContainerId(item, jiraGroup) { return jiraGroup === JiraResponseGroup.Filters ? item.attributes && item.attributes.ownerId : item.attributes && item.attributes.containerId; } }, { key: "getTypeSpecificAttributes", value: function getTypeSpecificAttributes(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 */ }, { key: "getRecentCountQueryParam", value: function getRecentCountQueryParam(recentCounts) { var keys = Object.keys(recentCounts); return keys.map(function (key) { return "".concat(key, "=").concat(recentCounts[key]); }).join(','); } }]); return JiraClientImpl; }(); export { JiraClientImpl as default };