diff --git a/src/main/react-front-end/src/utils.js b/src/main/react-front-end/src/utils.js index 74e6887f..593e6526 100644 --- a/src/main/react-front-end/src/utils.js +++ b/src/main/react-front-end/src/utils.js @@ -22,13 +22,24 @@ export function humanReadableSpeed(size) { - if (size < 1024) - return parseFloat(size.toFixed(2)) + ' Mb/s'; - let i = Math.floor(Math.log(size) / Math.log(1024)); - let num = (size / Math.pow(1024, i)); - let round = Math.round(num); - num = round < 10 ? num.toFixed(2) : round < 100 ? num.toFixed(1) : round; - num = num*(1); - num = parseFloat(num.toFixed(4)); - return `${num} ${'KMGTPEZY'[i]}b/s` -} + if (size < 1000) + return parseFloat(size.toFixed(2)) + ' bit/s'; + + let i = 0; + let base = 1000; + let num = size; + + // Keep dividing size by 1000 until it's less than 1000 + while (num >= base) { + num /= base; + i++; + } + + // Round number to nearest two digits + num = num.toFixed(2); + + // Units array for return to choose from + const units = ['bit/s', 'Kbit/s', 'Mbit/s', 'Gbit/s', 'Tbit/s', 'Pbit/s', 'Ebit/s', 'Zbit/s', 'Ybit/s']; + + return `${num} ${units[i]}`; +} \ No newline at end of file diff --git a/src/main/react-front-end/src/views/Queue/QueueTableRow/RowElement/RowElement.js b/src/main/react-front-end/src/views/Queue/QueueTableRow/RowElement/RowElement.js index 9285b40d..76d4b941 100644 --- a/src/main/react-front-end/src/views/Queue/QueueTableRow/RowElement/RowElement.js +++ b/src/main/react-front-end/src/views/Queue/QueueTableRow/RowElement/RowElement.js @@ -13,7 +13,15 @@ import moment from "moment"; import InfoRow from "./InfoRow"; export default class RowElement extends React.Component { - + constructor(props) { + super(props); + this.state = { + bar: null, + actions: null, + speed: 0, + }; + } + infoRow() { return ( ); - let actions = (this.renderActions(resp.owner, resp.job_id, resp.status, resp.deleted)); - let difference = (Date.parse(resp.endTime) - Date.parse(resp.startTime))/1000; - let speed = parseFloat((resp.jobParameters.jobSize/1000000)*8)/(difference); - if (isNaN(speed)) - { + calculateState = () => { + const { resp } = this.props; + + // Calculate progress bar and actions + let bar = (); + let actions = this.renderActions(resp.owner, resp.job_id, resp.status, resp.deleted); + + // Calculate speed + let speed = 0; + for (let element of resp.batchSteps) { + const fileInfo = JSON.parse(resp.jobParameters[element.step_name]); + let sizeWritten = element.writeCount * fileInfo.chunkSize * 8; // Convert bytes to bits + let time_difference = (Date.parse(resp.endTime) ? Date.parse(resp.endTime) : Date.now() - Date.parse(resp.startTime)) / 1000; + speed += (sizeWritten / time_difference) / resp.batchSteps.length; + } + + if (isNaN(speed)) { speed = 0; } + // Update the state with calculated values + this.setState({ bar, actions, speed }); + } + + componentDidMount() { + this.calculateState(); + } + + componentDidUpdate(prevProps) { + if (prevProps.resp !== this.props.resp || prevProps.infoVisible !== this.props.infoVisible) { + this.calculateState(); + } + } + + render() { + const {resp, infoVisible} = this.props + const {bar, actions, speed} = this.state; + let time = moment(resp.startTime).fromNow(); - let admin = this.props.adminPg; return ( - { admin && - -

{resp.owner}

-
} - +

{resp.id}

- + {bar} - +

{humanReadableSpeed(speed)}

- +

{resp.jobParameters.sourceCredential}

- +

{resp.jobParameters.destCredential}

- { this.props.adminPg && - -

{time}

-
} - + {actions}