Skip to content
Snippets Groups Projects
ActivityDetails.jsx 2.2 KiB
Newer Older
import React, { Fragment } from 'react'
import { H2, Button } from '@pubsweet/ui'
Yuci Gou's avatar
Yuci Gou committed
import { th } from '@pubsweet/ui-toolkit'
Yuci Gou's avatar
Yuci Gou committed
import styled from 'styled-components'
Yuci Gou's avatar
Yuci Gou committed
import moment from 'moment'
ahamelers's avatar
ahamelers committed
import { Table } from '../ui'
import { obtainEventDescription } from './helpers'
import Mailer from '../mailer'
Yuci Gou's avatar
Yuci Gou committed
const DetailsTable = styled(Table)`
  width: 100%;
`

Yuci Gou's avatar
Yuci Gou committed
const TdDate = styled.td`
  vertical-align: top;
`

const TdPerson = TdDate

Yuci Gou's avatar
Yuci Gou committed
const ActivityList = ({ manuscript }) =>
Yuci Gou's avatar
Yuci Gou committed
  manuscript.audits
    .reduce((reversed, audit) => {
      reversed.unshift(audit)
      return reversed
    }, [])
    .map(audit => (
      <tr key={audit.id}>
Yuci Gou's avatar
Yuci Gou committed
        <TdDate>{moment(audit.created).format('DD/MM/YYYY HH:mm:ss')}</TdDate>
        <TdPerson>{`${audit.user.givenNames} ${audit.user.surname}`}</TdPerson>
Yuci Gou's avatar
Yuci Gou committed
        <td>{obtainEventDescription(audit, manuscript)}</td>
      </tr>
    ))
Yuci Gou's avatar
Yuci Gou committed
const NewMsgBtn = styled(Button)`
Yuci Gou's avatar
Yuci Gou committed
  padding: calc(${th('gridUnit')} / 2) ${th('gridUnit')};
Yuci Gou's avatar
Yuci Gou committed
`

const DetailsHeading = styled.div`
  display: flex;
  align-items: baseline;
  justify-content: space-between;
`

Yuci Gou's avatar
Yuci Gou committed
const DataColumn = styled.th`
Yuci Gou's avatar
Yuci Gou committed
  width: 20%;
Yuci Gou's avatar
Yuci Gou committed
`

const PersonColumn = styled.th`
Yuci Gou's avatar
Yuci Gou committed
  width: 20%;
Yuci Gou's avatar
Yuci Gou committed
`
Yuci Gou's avatar
Yuci Gou committed
class ActivityDetails extends React.Component {
ahamelers's avatar
ahamelers committed
  state = { sendingMail: false }
Yuci Gou's avatar
Yuci Gou committed
  render() {
    return (
      <Fragment>
        <DetailsHeading>
          <div>
            <H2>Details</H2>
          </div>
          <div>
            <NewMsgBtn
              onClick={() => this.setState({ sendingMail: true })}
              primary
            >
              New message
            </NewMsgBtn>
          </div>
          {this.state.sendingMail && (
ahamelers's avatar
ahamelers committed
            <Mailer
              close={() => this.setState({ sendingMail: false })}
              currentUser={this.props.currentUser}
              manuscript={this.props.manuscript}
            />
Yuci Gou's avatar
Yuci Gou committed
          )}
        </DetailsHeading>
Yuci Gou's avatar
Yuci Gou committed

Yuci Gou's avatar
Yuci Gou committed
        <DetailsTable>
          <tbody>
            <tr>
              <DataColumn>Date</DataColumn>
              <PersonColumn>Person</PersonColumn>
              <th>Event</th>
            </tr>
            <ActivityList manuscript={this.props.manuscript} />
          </tbody>
        </DetailsTable>
      </Fragment>
    )
  }
}

export default ActivityDetails