UNPKG

datajunction-ui

Version:

DataJunction Metrics Platform UI

217 lines (204 loc) 6.72 kB
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> ); }