@atlaskit/global-search
Version:
A cross-product search component (batteries included)
96 lines (83 loc) • 2.6 kB
JavaScript
import uuid from 'uuid';
import { ResultType, ContentType } from '../model/Result';
export const mapJiraItemToResult = analyticsType => item => item.attributes && item.attributes['@type'] ? mapJiraItemToResultV2(item, analyticsType) : mapJiraItemToResultV1(item, analyticsType);
const extractSpecificAttributes = attributes => {
const type = attributes['@type'];
switch (type) {
case 'issue':
return {
objectKey: attributes.key,
containerName: attributes.container && attributes.container.title
};
case 'board':
return {
containerName: attributes.containerName,
containerId: attributes.containerId
};
case 'filter':
return {
containerName: attributes.ownerName
};
case 'project':
return {
containerName: attributes.projectType,
projectType: attributes.projectType // projectType maps directly to JiraProjectType enum at the moment for convenience
};
}
return null;
};
const extractAvatarUrl = ({
url = '',
urls = {}
} = {}) => {
if (url) {
return url;
}
return urls['48x48'] || urls[Object.keys(urls)[0]];
};
const JIRA_TYPE_TO_CONTENT_TYPE = {
issue: ContentType.JiraIssue,
board: ContentType.JiraBoard,
filter: ContentType.JiraFilter,
project: ContentType.JiraProject
};
const mapJiraItemToResultV2 = (item, analyticsType) => {
const {
id,
name,
url,
attributes
} = item;
const contentType = JIRA_TYPE_TO_CONTENT_TYPE[attributes['@type']];
const resultType = contentType === ContentType.JiraProject ? ResultType.JiraProjectResult : ResultType.JiraObjectResult;
return {
resultId: id,
key: uuid(),
name: name,
href: url,
resultType: resultType,
containerId: attributes.container && attributes.container.id,
analyticsType,
...extractSpecificAttributes(attributes),
avatarUrl: attributes.avatar && extractAvatarUrl(attributes.avatar),
contentType,
isRecentResult: mapAnalyticsTypeToRecentResult(analyticsType)
};
};
const mapJiraItemToResultV1 = (item, analyticsType) => {
return {
resultId: item.key,
avatarUrl: item.fields.issuetype.iconUrl,
name: item.fields.summary,
href: `/browse/${item.key}`,
containerName: item.fields.project.name,
objectKey: item.key,
analyticsType,
resultType: ResultType.JiraObjectResult,
contentType: ContentType.JiraIssue,
isRecentResult: mapAnalyticsTypeToRecentResult(analyticsType)
};
};
const mapAnalyticsTypeToRecentResult = analyticsType => {
return analyticsType.startsWith('recent');
};