datajunction-ui
Version:
DataJunction Metrics Platform UI
217 lines (204 loc) • 6.72 kB
JSX
import { useEffect, useState } from 'react';
import * as React from 'react';
import DiffIcon from '../../icons/DiffIcon';
import { labelize } from '../../../utils/form';
import CommitIcon from '../../icons/CommitIcon';
export default function NodeHistory({ node, djClient }) {
const [history, setHistory] = useState([]);
useEffect(() => {
const fetchData = async () => {
if (node) {
const data = await djClient.history('node', node.name);
setHistory(data);
}
};
fetchData().catch(console.error);
}, [djClient, node]);
const eventData = event => {
const standard = (
<>
<a href={'#'} className={'highlight-svg'} title="Browse Details">
<CommitIcon /> Details
</a>
</>
);
if (event.activity_type === 'update' && event.entity_type === 'node') {
return (
<>
<a href={`/nodes/${event.node}/revisions/${event.details.version}`}>
<span className={`badge version`}>{event.details.version}</span>
</a>
<a
href={`/nodes/${event.node}/revisions/${event.details.version}`}
className={'highlight-svg'}
title="View Diff"
>
<DiffIcon /> Diff
</a>
</>
);
}
return '';
};
const eventDescription = event => {
if (event.activity_type === 'create' && event.entity_type === 'node') {
return (
<div className="history-left">
<b style={{ textTransform: 'capitalize' }}>{event.activity_type}</b>{' '}
{event.entity_type}{' '}
<b>
<a href={'/nodes/' + event.entity_name}>{event.entity_name}</a>
</b>
</div>
);
}
if (
['create', 'update', 'delete'].includes(event.activity_type) &&
event.entity_type === 'link'
) {
return (
<div className="history-left">
<b style={{ textTransform: 'capitalize' }}>{event.activity_type}</b>{' '}
{event.entity_type} from{' '}
<b>
<a href={'/nodes/' + event.entity_name}>{event.entity_name}</a>
</b>{' '}
to{' '}
<b>
<a href={'/nodes/' + event.details.dimension}>
{event.details.dimension}
</a>
</b>
</div>
);
}
if (event.activity_type === 'refresh') {
return (
<div className="history-left">
<b style={{ textTransform: 'capitalize' }}>{event.activity_type}</b>{' '}
{event.entity_type}{' '}
<b>
<a href={'/nodes/' + event.entity_name}>{event.entity_name}</a>
</b>
</div>
);
}
if (event.activity_type === 'update' && event.entity_type === 'node') {
return (
<div className="history-left">
<b style={{ textTransform: 'capitalize' }}>{event.activity_type}</b>{' '}
{event.entity_type}{' '}
<b>
<a href={'/nodes/' + event.entity_name}>{event.entity_name}</a>
</b>
</div>
);
}
if (event.activity_type === 'tag' && event.entity_type === 'node') {
return (
<div className="history-left">
Add tag{event.details.tags.length > 1 ? 's' : ''}{' '}
{event.details.tags.map(tag => (
<span className={'badge version'}>
<a href={`/tags/${tag}`}>{tag}</a>
</span>
))}
</div>
);
}
if (event.activity_type === 'create' && event.entity_type === 'partition') {
return (
<div className="history-left">
Set <b>{event.details.partition.type_} partition</b> on{' '}
<a href={'/nodes/' + event.node}>{event.details.column}</a>
</div>
);
}
if (
event.activity_type === 'set_attribute' &&
event.entity_type === 'column_attribute'
) {
return (
<div className="history-left">
<b>Set column attributes</b> on{' '}
<b>
<a href={'/nodes/' + event.node}>{event.node}</a>
</b>
</div>
);
}
if (event.entity_type === 'materialization') {
return (
<div className="history-left">
<span style={{ textTransform: 'capitalize' }}>
{event.activity_type}
</span>{' '}
<b>{event.entity_type}</b>{' '}
<a href={`/nodes/${event.node}/materializations`}>
{event.entity_name}
</a>
</div>
);
}
if (
event.activity_type === 'status_change' &&
event.entity_type === 'node'
) {
return (
<div className="history-left">
<b style={{ textTransform: 'capitalize' }}>
{labelize(event.activity_type)}
</b>{' '}
on <a href={`/nodes/${event.node}`}>{event.node}</a> from{' '}
<b>{event.pre.status}</b> to <b>{event.post.status}</b>
</div>
);
}
if (
event.activity_type === 'create' &&
event.entity_type === 'availability'
) {
return (
<div className="history-left">
<b>Materialized</b> table{' '}
<code>
{event.post.catalog}.{event.post.schema_}.{event.post.table}
</code>{' '}
with partitions between {event.post.min_temporal_partition} and{' '}
{event.post.max_temporal_partition} available for{' '}
<a href={'/nodes/' + event.node}>{event.node}</a>.
</div>
);
}
if (event.activity_type === 'create' && event.entity_type === 'backfill') {
return (
<div className="history-left">
<b>Backfill</b> created for materialization{' '}
{event.details.materialization} for partition{' '}
{event.details.partition[0].column_name} from{' '}
{event.details.partition[0].range[0]} to{' '}
{event.details.partition[0].range[1]}
</div>
);
}
};
const removeTagNodeEventsWithoutTags = event =>
event.activity_type !== 'tag' ||
(event.activity_type === 'tag' &&
event.entity_type === 'node' &&
event.details.tags.length > 0);
return (
<ul className="history-border" role="list" aria-label="Activity">
{history.filter(removeTagNodeEventsWithoutTags).map(event => (
<li key={`history-row-${event.id}`} className="history">
{eventDescription(event)}
<div className={'history-small'}>
done by <a href="#">{event.user ? event.user : 'unknown'}</a> on{' '}
{new Date(Date.parse(event.created_at)).toLocaleString()}
</div>
<div className="history-right">{eventData(event)}</div>
</li>
))}
</ul>
);
}