mirror of
https://github.com/haiwen/seahub.git
synced 2025-09-14 06:11:16 +00:00
@@ -1,129 +0,0 @@
|
||||
import React from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import moment from 'moment';
|
||||
import { Tooltip } from 'reactstrap';
|
||||
import { siteRoot, lang } from '../../utils/constants';
|
||||
import { Utils } from '../../utils/utils';
|
||||
|
||||
moment.locale(lang);
|
||||
const propTypes = {
|
||||
isItemFreezed: PropTypes.bool.isRequired,
|
||||
item: PropTypes.object.isRequired,
|
||||
};
|
||||
|
||||
|
||||
class Reviewers extends React.Component {
|
||||
constructor(props) {
|
||||
super(props);
|
||||
this.state = {
|
||||
reviewerTipOpen: false,
|
||||
reviewerList:''
|
||||
};
|
||||
}
|
||||
|
||||
toggle = () => {
|
||||
this.reviewerListItem();
|
||||
this.setState({
|
||||
reviewerTipOpen: !this.state.reviewerTipOpen
|
||||
});
|
||||
}
|
||||
|
||||
reviewerListItem = () => {
|
||||
let reviewers = '';
|
||||
|
||||
this.props.item.reviewers.map(item => {
|
||||
reviewers = reviewers + ' and ' + item.user_name;
|
||||
});
|
||||
|
||||
this.setState({
|
||||
reviewerList: reviewers.substr(5,)
|
||||
});
|
||||
}
|
||||
|
||||
render() {
|
||||
let items = this.props.item;
|
||||
let { reviewerList } = this.state;
|
||||
return (
|
||||
<div className='position-relative reviewer-list'>
|
||||
<span id={'reviewers' + items.id}>
|
||||
{items.reviewers.map((item, index) => (
|
||||
<img key={index} id={'reviewer-tip' + '-' + items.id + '-' + index} className="avatar avatar-sm reviewer-avatar" src={item.avatar_url} alt={item.user_name} />
|
||||
))}
|
||||
</span>
|
||||
<Tooltip placement="bottom-end" isOpen={this.state.reviewerTipOpen} target={'reviewers' + items.id} toggle={this.toggle}>
|
||||
{reviewerList}
|
||||
</Tooltip>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
class ReviewListItem extends React.Component {
|
||||
|
||||
constructor(props) {
|
||||
super(props);
|
||||
this.state = {
|
||||
highlight: '',
|
||||
authorTipOpen: false
|
||||
};
|
||||
}
|
||||
|
||||
onMouseEnter = () => {
|
||||
if (!this.props.isItemFreezed) {
|
||||
this.setState({
|
||||
highlight: 'tr-highlight'
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
onMouseLeave = () => {
|
||||
if (!this.props.isItemFreezed) {
|
||||
this.setState({
|
||||
highlight: ''
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
toggle = () => {
|
||||
this.setState({
|
||||
authorTipOpen: !this.state.authorTipOpen
|
||||
});
|
||||
}
|
||||
|
||||
getFileName(filePath) {
|
||||
let lastIndex = filePath.lastIndexOf('/');
|
||||
return filePath.slice(lastIndex+1);
|
||||
}
|
||||
|
||||
render() {
|
||||
let item = this.props.item;
|
||||
let fileName = this.getFileName(item.draft_file_path);
|
||||
let reviewUrl = siteRoot + 'drafts/review/' + item.id;
|
||||
let localTime = moment.utc(item.updated_at).toDate();
|
||||
localTime = moment(localTime).fromNow();
|
||||
|
||||
let iconUrl = Utils.getFileIconUrl(fileName);
|
||||
|
||||
return (
|
||||
<tr className={this.state.highlight} onMouseEnter={this.onMouseEnter} onMouseLeave={this.onMouseLeave}>
|
||||
<td className="text-center" style={{width: '4%'}}><img src={iconUrl} width="24" alt="" /></td>
|
||||
<td style={{width: '26%'}}><a href={reviewUrl} target="_blank">{fileName}</a></td>
|
||||
<td className='library' style={{width: '25%'}}>{item.draft_origin_repo_name}</td>
|
||||
<td className="update" style={{width: '20%'}}>{localTime}</td>
|
||||
<td className="author" style={{width: '10%'}}><img className="avatar avatar-sm cursor-pointer" id={'tip-' + item.id} src={item.author.avatar_url} alt={item.user_name} /></td>
|
||||
<td className="reviewer" style={{width: '15%'}}><Reviewers item={item}/></td>
|
||||
<Tooltip placement="bottom-end" isOpen={this.state.authorTipOpen} target={'tip-' + item.id} toggle={this.toggle}>
|
||||
{item.author.user_name}
|
||||
</Tooltip>
|
||||
</tr>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
ReviewListItem.propTypes = propTypes;
|
||||
|
||||
Reviewers.propTypes = {
|
||||
item: PropTypes.object.isRequired,
|
||||
};
|
||||
|
||||
export default ReviewListItem;
|
@@ -1,88 +0,0 @@
|
||||
import React, { Fragment } from 'react';
|
||||
import PropTypes from 'prop-types';
|
||||
import { Nav, NavItem, NavLink } from 'reactstrap';
|
||||
import classnames from 'classnames';
|
||||
import { gettext } from '../../utils/constants';
|
||||
import ReviewListItem from './review-list-item';
|
||||
|
||||
const propTypes = {
|
||||
isItemFreezed: PropTypes.bool.isRequired,
|
||||
itemsList: PropTypes.array.isRequired,
|
||||
getReviewList: PropTypes.func.isRequired,
|
||||
activeTab: PropTypes.string.isRequired,
|
||||
};
|
||||
|
||||
class ReviewListView extends React.Component {
|
||||
|
||||
constructor(props) {
|
||||
super(props);
|
||||
this.toggle = this.toggle.bind(this);
|
||||
}
|
||||
|
||||
toggle(tab) {
|
||||
if (this.props.activeTab !== tab) {
|
||||
this.props.getReviewList(tab);
|
||||
}
|
||||
}
|
||||
|
||||
render() {
|
||||
let items = this.props.itemsList;
|
||||
return (
|
||||
<Fragment>
|
||||
<Nav pills>
|
||||
<NavItem className="pt-4">
|
||||
<NavLink
|
||||
className={classnames({ active: this.props.activeTab === 'open' })}
|
||||
onClick={() => { this.toggle('open');}}
|
||||
>
|
||||
{gettext('Open')}
|
||||
</NavLink>
|
||||
</NavItem>
|
||||
<NavItem className="pt-4">
|
||||
<NavLink
|
||||
className={classnames({ active: this.props.activeTab === 'finished' })}
|
||||
onClick={() => { this.toggle('finished');}}
|
||||
>
|
||||
{gettext('Published')}
|
||||
</NavLink>
|
||||
</NavItem>
|
||||
<NavItem className="pt-4">
|
||||
<NavLink
|
||||
className={classnames({ active: this.props.activeTab === 'closed' })}
|
||||
onClick={() => { this.toggle('closed');}}
|
||||
>
|
||||
{gettext('Closed')}
|
||||
</NavLink>
|
||||
</NavItem>
|
||||
</Nav>
|
||||
<table>
|
||||
<thead>
|
||||
<tr>
|
||||
<th style={{width: '4%'}}>{/*img*/}</th>
|
||||
<th style={{width: '26%'}}>{gettext('Name')}</th>
|
||||
<th style={{width: '25%'}}>{gettext('Library')}</th>
|
||||
<th style={{width: '20%'}}>{gettext('Last Update')}</th>
|
||||
<th style={{width: '10%'}}>{gettext('Author')}</th>
|
||||
<th style={{width: '15%'}}>{gettext('Reviewers')}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{ items && items.map((item) => {
|
||||
return (
|
||||
<ReviewListItem
|
||||
key={item.id}
|
||||
item={item}
|
||||
isItemFreezed={this.props.isItemFreezed}
|
||||
/>
|
||||
);
|
||||
})}
|
||||
</tbody>
|
||||
</table>
|
||||
</Fragment>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
ReviewListView.propTypes = propTypes;
|
||||
|
||||
export default ReviewListView;
|
Reference in New Issue
Block a user