import classNames from 'classnames'; import _ from 'lodash'; import moment from 'moment'; import React from 'react'; import { connect } from 'react-redux'; import TimeAgo from 'timeago-react'; import * as recordEnum from 'vj/constant/record'; import { emulateAnchorClick, i18n, mongoId, substitute, } from 'vj/utils'; const shouldShowDetail = (data) => recordEnum.STATUS_SCRATCHPAD_SHOW_DETAIL_FLAGS[data.status]; const getRecordDetail = (data) => { if (!shouldShowDetail(data)) { return ( {recordEnum.STATUS_TEXTS[data.status]} ); } const stat = _.pick( _.groupBy(data.testCases || [], 'status'), _.keys(recordEnum.STATUS_SCRATCHPAD_SHORT_TEXTS), ); return _.map(recordEnum.STATUS_SCRATCHPAD_SHORT_TEXTS, (text, status) => { const count = (stat[status] && stat[status].length) || 0; const cn = classNames('icol icol--stat', { 'record-status--text': count > 0, [recordEnum.STATUS_CODES[data.status]]: count > 0, }); return ( {text}: {count} ); }); }; const mapStateToProps = (state) => ({ items: state.records.items, }); const mergeProps = (stateProps, dispatchProps, ownProps) => ({ ...dispatchProps, data: stateProps.items[ownProps.id], }); export default connect(mapStateToProps, null, mergeProps)(class ScratchpadRecordsRowContainer extends React.PureComponent { handleRowClick(ev, id) { const url = substitute( decodeURIComponent(UiContext.getRecordDetailUrl), { rid: id }, ); emulateAnchorClick(ev, url, true); } render() { const { data } = this.props; const submitAt = mongoId(data._id).timestamp * 1000; // Is pretest return data.contest?.toString() === '000000000000000000000000' ? null : ( this.handleRowClick(ev, data._id)}> {getRecordDetail(data)} {shouldShowDetail(data) ? `${Math.ceil(data.memory / 1000)} MB` : '-'} {shouldShowDetail(data) ? `${(data.time / 1000).toFixed(1)}s` : '-'} ); } });