1
0
mirror of https://github.com/haiwen/seahub.git synced 2025-08-10 03:17:39 +00:00
seahub/frontend/src/pages/file-history-old/history-item.js

140 lines
4.7 KiB
JavaScript
Raw Normal View History

2019-04-19 10:23:02 +00:00
import React, { Fragment } from 'react';
import PropTypes from 'prop-types';
import dayjs from 'dayjs';
2019-04-24 06:49:39 +00:00
import { Utils } from '../../utils/utils';
2019-04-19 10:23:02 +00:00
import { gettext, siteRoot, filePath, historyRepoID } from '../../utils/constants';
import URLDecorator from '../../utils/url-decorator';
2019-04-25 02:50:06 +00:00
import { Dropdown, DropdownToggle, DropdownMenu, DropdownItem } from 'reactstrap';
2019-04-19 10:23:02 +00:00
dayjs.locale(window.app.config.lang);
2019-04-19 10:23:02 +00:00
const propTypes = {
item: PropTypes.object.isRequired,
index: PropTypes.number.isRequired,
2019-04-24 13:27:12 +00:00
canDownload: PropTypes.bool.isRequired,
canCompare: PropTypes.bool.isRequired,
2019-04-19 10:23:02 +00:00
onItemRestore: PropTypes.func.isRequired,
snapshotURL: PropTypes.string.isRequired,
2019-04-19 10:23:02 +00:00
};
class HistoryItem extends React.Component {
constructor(props) {
super(props);
this.state = {
active: false,
};
}
onMouseEnter = () => {
this.setState({
active: true
});
};
2019-04-19 10:23:02 +00:00
onMouseLeave = () => {
this.setState({
active: false
});
};
2019-04-19 10:23:02 +00:00
onItemRestore = (e) => {
e.preventDefault();
2019-04-19 10:23:02 +00:00
this.props.onItemRestore(this.props.item);
};
2019-04-19 10:23:02 +00:00
render() {
let item = this.props.item;
2024-07-18 03:58:42 +00:00
let downloadUrl = URLDecorator.getUrl({ type: 'download_historic_file', filePath: filePath, objID: item.rev_file_id });
2019-04-19 10:23:02 +00:00
let userProfileURL = `${siteRoot}profile/${encodeURIComponent(item.creator_email)}/`;
2021-08-31 03:28:39 +00:00
let viewUrl = `${siteRoot}repo/${historyRepoID}/history/files/?obj_id=${item.rev_file_id}&commit_id=${item.commit_id}&p=${Utils.encodePath(filePath)}`;
let diffUrl = `${siteRoot}repo/text_diff/${historyRepoID}/?commit=${item.commit_id}&p=${Utils.encodePath(filePath)}`;
const snapshotURL = `${siteRoot}repo/${historyRepoID}/snapshot/?commit_id=${item.commit_id}`;
2019-04-19 10:23:02 +00:00
return (
<Fragment>
2019-04-25 02:50:06 +00:00
<tr onMouseEnter={this.onMouseEnter} onMouseLeave={this.onMouseLeave} className={this.state.active ? 'tr-highlight' : ''}>
2019-04-19 10:23:02 +00:00
<td>
<span>{dayjs(item.ctime).format('YYYY-MM-DD HH:mm:ss')}</span>
{this.props.index === 0 && <span className="ml-1">{gettext('(current version)')}</span>}
2019-04-19 10:23:02 +00:00
</td>
<td>
2019-04-25 02:50:06 +00:00
<img className="avatar" src={item.creator_avatar_url} alt=''></img>{' '}
<a href={userProfileURL} target='_blank' className="username" rel="noreferrer">{item.creator_name}</a>
2019-04-19 10:23:02 +00:00
</td>
2019-04-24 06:49:39 +00:00
<td>{Utils.bytesToSize(item.size)}</td>
2019-04-19 10:23:02 +00:00
<td>
{this.state.active &&
2019-04-25 02:50:06 +00:00
<MoreMenu
index={this.props.index}
downloadUrl={downloadUrl}
viewUrl={viewUrl}
diffUrl={diffUrl}
snapshotURL={snapshotURL}
2019-04-25 02:50:06 +00:00
onItemRestore={this.onItemRestore}
canDownload={this.props.canDownload}
canCompare={this.props.canCompare}
/>
2019-04-19 10:23:02 +00:00
}
</td>
</tr>
</Fragment>
);
}
}
HistoryItem.propTypes = propTypes;
2019-04-25 02:50:06 +00:00
const MoreMenuPropTypes = {
index: PropTypes.number.isRequired,
downloadUrl: PropTypes.string.isRequired,
viewUrl: PropTypes.string.isRequired,
diffUrl: PropTypes.string.isRequired,
onItemRestore: PropTypes.func.isRequired,
canDownload: PropTypes.bool.isRequired,
canCompare: PropTypes.bool.isRequired,
snapshotURL: PropTypes.string.isRequired,
2019-04-25 02:50:06 +00:00
};
class MoreMenu extends React.PureComponent {
constructor(props) {
super(props);
this.state = {
dropdownOpen: false
};
}
dropdownToggle = () => {
this.setState({ dropdownOpen: !this.state.dropdownOpen });
};
2019-04-25 02:50:06 +00:00
render() {
const { index, downloadUrl, viewUrl, snapshotURL, onItemRestore, canDownload } = this.props;
2019-04-25 02:50:06 +00:00
return (
<Dropdown isOpen={this.state.dropdownOpen} toggle={this.dropdownToggle} direction="down" className="mx-1 old-history-more-operation">
<DropdownToggle
tag='i'
className='sf3-font sf3-font-more-vertical'
2024-01-03 10:08:24 +00:00
title={gettext('More operations')}
aria-label={gettext('More operations')}
data-toggle="dropdown"
2019-04-25 02:50:06 +00:00
aria-expanded={this.state.dropdownOpen}
>
</DropdownToggle>
<DropdownMenu className="drop-list">
2019-04-25 02:50:06 +00:00
{index !== 0 && <a href="#" onClick={onItemRestore}><DropdownItem>{gettext('Restore')}</DropdownItem></a>}
{canDownload && <a href={downloadUrl}><DropdownItem>{gettext('Download')}</DropdownItem></a>}
<a href={viewUrl}><DropdownItem>{gettext('View')}</DropdownItem></a>
2024-07-18 03:58:42 +00:00
{/* canCompare && <a href={diffUrl}><DropdownItem>{gettext('Diff')}</DropdownItem></a>*/}
{index != 0 && <DropdownItem tag="a" href={snapshotURL} target="_blank">{gettext('View Related Snapshot')}</DropdownItem>}
2019-04-25 02:50:06 +00:00
</DropdownMenu>
</Dropdown>
);
}
}
MoreMenu.propTypes = MoreMenuPropTypes;
2019-04-19 10:23:02 +00:00
export default HistoryItem;