UNPKG

@atlaskit/global-search

Version:

A cross-product search component (batteries included)

281 lines (235 loc) 10.6 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = exports.DEFAULT_RECENT_ITEMS_COUNT = void 0; var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _utilServiceSupport = require("@atlaskit/util-service-support"); var _Result = require("../model/Result"); 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) { (0, _defineProperty2.default)(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; } var RECENT_ITEMS_PATH = 'rest/internal/2/productsearch/recent'; var PERMISSIONS_PATH = 'rest/api/2/mypermissions?permissions=USER_PICKER'; var DEFAULT_RECENT_ITEMS_COUNT = { issues: 8, boards: 2, projects: 2, filters: 2 }; /** * Jira client to reterive recent items from jira */ exports.DEFAULT_RECENT_ITEMS_COUNT = DEFAULT_RECENT_ITEMS_COUNT; 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 = {}, (0, _defineProperty2.default)(_JiraResponseGroupToC, JiraResponseGroup.Issues, _Result.ContentType.JiraIssue), (0, _defineProperty2.default)(_JiraResponseGroupToC, JiraResponseGroup.Boards, _Result.ContentType.JiraBoard), (0, _defineProperty2.default)(_JiraResponseGroupToC, JiraResponseGroup.Filters, _Result.ContentType.JiraFilter), (0, _defineProperty2.default)(_JiraResponseGroupToC, JiraResponseGroup.Projects, _Result.ContentType.JiraProject), _JiraResponseGroupToC); var JiraClientImpl = /*#__PURE__*/function () { function JiraClientImpl(url, cloudId, isUserAnonymous) { (0, _classCallCheck2.default)(this, JiraClientImpl); this.serviceConfig = { url: url }; this.cloudId = cloudId; this.isUserAnonymous = isUserAnonymous; } // Unused, just to mute ts lint (0, _createClass2.default)(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 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(searchSessionId) { var _this = this; var recentItemCounts, options, recentItems, reduced, _args = arguments; return _regenerator.default.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 _utilServiceSupport.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((0, _toConsumableArray2.default)(acc), (0, _toConsumableArray2.default)(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 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2() { var options, permissionsResponse; return _regenerator.default.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 _utilServiceSupport.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: _Result.ResultType.JiraObjectResult, resultId: resultId, name: item.title, href: item.url, analyticsType: _Result.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; }(); exports.default = JiraClientImpl;