2019-12-05 22:37:09 +01:00
|
|
|
import React from 'react';
|
2020-04-30 17:08:06 +02:00
|
|
|
import { KanboardCard } from '../../types/kanboard';
|
2019-12-05 22:37:09 +01:00
|
|
|
|
2020-04-30 15:43:40 +02:00
|
|
|
export interface IssueCardProps {
|
2020-04-30 17:08:06 +02:00
|
|
|
card: KanboardCard
|
|
|
|
compact: boolean
|
2020-04-30 15:43:40 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
export class IssueCard extends React.PureComponent<IssueCardProps> {
|
2019-12-05 22:37:09 +01:00
|
|
|
render() {
|
2020-04-30 17:08:06 +02:00
|
|
|
|
|
|
|
const { card, compact } = this.props;
|
2019-12-13 13:31:27 +01:00
|
|
|
const issueURLInfo = extractInfoFromIssueURL(card.issue.url);
|
|
|
|
const projectURL = `${issueURLInfo.baseURL}/${issueURLInfo.owner}/${issueURLInfo.projectName}`;
|
|
|
|
const issueURL = `${projectURL}/issues/${card.issue.number}`;
|
2020-04-30 17:08:06 +02:00
|
|
|
|
2019-12-05 22:37:09 +01:00
|
|
|
return (
|
|
|
|
<div className="kanboard-card">
|
2020-06-05 16:18:53 +02:00
|
|
|
<div className="box has-padding-small is-radiusless">
|
2019-12-05 22:37:09 +01:00
|
|
|
<div className="media">
|
|
|
|
<div className="media-content">
|
|
|
|
<div className="content">
|
2020-06-16 11:23:57 +02:00
|
|
|
{ !compact &&
|
|
|
|
<nav className="level">
|
|
|
|
<div className="level-left">
|
|
|
|
<div className="level-item">
|
|
|
|
<a target="_blank" href={issueURL}><strong>{`#${card.issue.number}`}</strong></a>
|
|
|
|
</div>
|
|
|
|
{ !compact &&
|
2020-06-05 16:18:53 +02:00
|
|
|
<div className="level-item">
|
2020-06-16 11:23:57 +02:00
|
|
|
<a target="_blank" href={projectURL}>{card.project}</a>
|
2020-06-05 16:18:53 +02:00
|
|
|
</div>
|
2020-06-16 11:23:57 +02:00
|
|
|
}
|
|
|
|
</div>
|
|
|
|
<div className="level-right">
|
|
|
|
{
|
|
|
|
card.issue.assignee && !compact ?
|
|
|
|
<div className="level-item">
|
|
|
|
<small>{`@${card.issue.assignee.login}`}</small>
|
|
|
|
</div>
|
|
|
|
: null
|
|
|
|
}
|
|
|
|
</div>
|
|
|
|
</nav>
|
|
|
|
}
|
|
|
|
{ compact &&
|
|
|
|
<a target="_blank" className="mr-1" href={issueURL}><strong>{`#${card.issue.number}`}</strong></a>
|
|
|
|
}
|
2020-06-05 17:14:55 +02:00
|
|
|
<span>{card.issue.title ? card.issue.title : ''}</span>
|
2019-12-05 22:37:09 +01:00
|
|
|
</div>
|
2020-06-16 11:23:57 +02:00
|
|
|
{ !compact &&
|
2020-06-05 16:18:53 +02:00
|
|
|
<nav className="level">
|
|
|
|
<div className="level-left"></div>
|
|
|
|
<div className="level-right">
|
|
|
|
<div className="level-item is-size-7">
|
2020-06-05 17:14:55 +02:00
|
|
|
{card.issue.milestone ? card.issue.milestone.title : ''}
|
2020-06-05 16:18:53 +02:00
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</nav>
|
|
|
|
}
|
2019-12-05 22:37:09 +01:00
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
</div>
|
|
|
|
);
|
|
|
|
}
|
2019-12-13 13:31:27 +01:00
|
|
|
}
|
|
|
|
|
2020-04-30 15:43:40 +02:00
|
|
|
function extractInfoFromIssueURL(issueURL: string): any|void {
|
2019-12-13 13:31:27 +01:00
|
|
|
const pattern = /^(https?:\/\/[^\/]+)\/api\/v1\/repos\/([^\/]+)\/([^\/]+)\/.*$/;
|
|
|
|
const matches = pattern.exec(issueURL);
|
2020-04-30 15:43:40 +02:00
|
|
|
|
|
|
|
if (!matches) return;
|
|
|
|
|
2019-12-13 13:31:27 +01:00
|
|
|
return {
|
|
|
|
baseURL: matches[1],
|
|
|
|
owner: matches[2],
|
|
|
|
projectName: matches[3],
|
|
|
|
};
|
2019-12-05 22:37:09 +01:00
|
|
|
}
|