@atlaskit/global-search
Version:
A cross-product search component (batteries included)
266 lines (228 loc) • 9.9 kB
JavaScript
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 };