gengitkan/client/src/components/BoardPage/IssueCard.tsx

80 lines
2.7 KiB
TypeScript
Raw Normal View History

2019-12-05 22:37:09 +01:00
import React from 'react';
import { KanboardCard } from '../../types/kanboard';
2019-12-05 22:37:09 +01:00
export interface IssueCardProps {
card: KanboardCard
compact: boolean
}
export class IssueCard extends React.PureComponent<IssueCardProps> {
2019-12-05 22:37:09 +01:00
render() {
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}`;
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>
}
<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">
{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
}
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);
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
}