packages/issue-dashboard-widgets/widgets/youtrack-activities-widget/app/content-attachment-activity.js (67 lines of code) (raw):
import React from 'react';
import classNames from 'classnames';
import Link from '@jetbrains/ring-ui/components/link/link';
import {i18n} from 'hub-dashboard-addons/dist/localization';
import ContentDefaultActivity from './content-default-activity';
import './style/activities-widget.css';
import filter from './activities-filter';
const previewWhiteList = [
'image/gif',
'image/png',
'image/jpeg',
'image/x-icon',
'image/bmp',
'image/x-windows-bmp',
'image/tiff',
'image/x-tiff',
'image/webp'
];
class ContentAttachmentActivity extends ContentDefaultActivity {
renderAttachmentStub(activity, attachment, removed) {
const uniqueKey = `${activity.id}${attachment.id}`;
const stubClass = 'aw__activity__attachment__header__stub';
const modClass = removed && 'aw__activity__attachment__header__stub_removed';
return (
<span className={classNames(stubClass, modClass)} key={uniqueKey}>
{attachment.name}
</span>
);
}
renderAttachmentThumbnail(activity, attachment) {
const uniqueKey = `${activity.id}${attachment.id}`;
const trimAttachmentsContext = url => {
const attachmentsPrefix = 'api/files';
return attachmentsPrefix + (url || '').split(attachmentsPrefix).pop();
};
const attachmentHref = `${filter.youTrackUrl}${trimAttachmentsContext(attachment.url)}`;
const hasPreview = previewWhiteList.indexOf(attachment.mimeType);
if (hasPreview >= 0) {
const thumbnailURL = `${filter.youTrackUrl}${trimAttachmentsContext(attachment.thumbnailURL)}`;
return (
<div
className="aw__activity__attachment__added-panel__thumbnail"
key={uniqueKey}
>
<Link
target={'_blank'}
href={attachmentHref}
>
<img width={96} height={64} src={thumbnailURL} alt={'preview'}/>
</Link>
</div>
);
} else {
return (
<Link
key={uniqueKey}
target={'_blank'}
href={attachmentHref}
>
{attachment.name}
</Link>
);
}
}
// eslint-disable-next-line react/display-name
renderContent = activity => {
const fieldName = i18n('Attachment');
const removedStubs = activity.removed;
const addedStubs = activity.added.filter(attachment => !attachment.url);
const addedThumbnails = activity.added.filter(attachment => attachment.url);
return (
<div className="aw__activity__attachment">
<div className="aw__activity__attachment__header">
<span className="aw__activity__attachment__header__field-name">
{`${fieldName}:`}
</span>
{removedStubs.map(attachment =>
this.renderAttachmentStub(activity, attachment, true)
)}
{addedStubs.map(attachment =>
this.renderAttachmentStub(activity, attachment, false)
)}
</div>
<div className="aw__activity__attachment__added-panel">
{addedThumbnails.map(attachment =>
this.renderAttachmentThumbnail(activity, attachment)
)}
</div>
</div>
);
};
}
export default ContentAttachmentActivity;