import React, { Component } from 'react'; import PropTypes from 'prop-types'; import moment from 'moment'; import { Dropdown, DropdownToggle, DropdownMenu, DropdownItem } from 'reactstrap'; import { seafileAPI } from '../../utils/seafile-api'; import { siteRoot, gettext, lang } from '../../utils/constants'; import { Utils } from '../../utils/utils'; import toaster from '../../components/toast'; import OrgLogsFileUpdateEvent from '../../models/org-logs-file-update'; import ModalPortal from '../../components/modal-portal'; import FileUpdateDetailDialog from '../../components/dialog/org-logs-file-update-detail'; import '../../css/org-logs.css'; moment.locale(lang); class OrgLogsFileUpdate extends Component { constructor(props) { super(props); this.state = { page: 1, pageNext: false, eventList: [], userSelected: '', repoSelected: '', isItemFreezed: false, showDetails: false, repoID: '', commitID: '' }; } componentDidMount() { let page = this.state.page; let email = this.state.userSelected; let repoID = this.state.repoSelected; this.initData(email, repoID, page); } initData = (email, repoID, page) => { seafileAPI.orgAdminListFileUpdate(email, repoID, page).then(res => { let eventList = res.data.log_list.map(item => { return new OrgLogsFileUpdateEvent(item); }); this.setState({ eventList: eventList, pageNext: res.data.page_next, page: res.data.page, }); }).catch(error => { let errMessage = Utils.getErrorMsg(error); toaster.danger(errMessage); }); }; onChangePageNum = (e, num) => { e.preventDefault(); let page = this.state.page; if (num == 1) { page = page + 1; } else { page = page - 1; } let email = this.state.userSelected; let repoID = this.state.repoSelected; this.initData(email, repoID, page); }; toggleCancelDetail = () => { this.setState({ showDetails: !this.state.showDetails }); }; onDetails = (e, fileEvent) => { e.preventDefault(); this.setState({ showDetails: !this.state.showDetails, repoID: fileEvent.repo_id, commitID: fileEvent.repo_commit_id }); }; filterUser = (userSelected) => { this.setState({ userSelected: userSelected }); }; filterRepo = (repoSelected) => { this.setState({ repoSelected: repoSelected }); }; render() { let eventList = this.state.eventList; return (
{ (this.state.userSelected || this.state.repoSelected) && {this.state.userSelected && {this.state.userSelected}{' ✖'} } {this.state.repoSelected && {this.state.repoSelected}{' ✖'} } } {eventList.map((item, index) => { return ( ); })}
{gettext('User')} {gettext('Date')} {gettext('Library')} {gettext('Action')}
{this.state.page != 1 && this.onChangePageNum(e, -1)}>{gettext('Previous')}} {(this.state.page != 1 && this.state.pageNext) && | } {this.state.pageNext && this.onChangePageNum(e, 1)}>{gettext('Next')}}
{this.state.showDetails && }
); } } const propTypes = { filterUser: PropTypes.func.isRequired, filterRepo: PropTypes.func.isRequired, onDetails: PropTypes.func.isRequired, userSelected: PropTypes.string.isRequired, repoSelected: PropTypes.string.isRequired, isItemFreezed: PropTypes.bool.isRequired, fileEvent: PropTypes.object.isRequired, }; class FileUpdateItem extends React.Component { constructor(props) { super(props); this.state = { highlight: false, showMenu: false, isItemMenuShow: false, userDropdownOpen: false, repoDropdownOpen: false, }; } onMouseEnter = () => { if (!this.props.isItemFreezed) { this.setState({ showMenu: true, highlight: true, }); } }; onMouseLeave = () => { if (!this.props.isItemFreezed) { this.setState({ showMenu: false, highlight: false }); } }; toggleUserDropdown = () => { this.setState({ userDropdownOpen: !this.state.userDropdownOpen }); }; renderUser = (fileEvent) => { if (!fileEvent.user_email) { return gettext('Anonymous User'); } return ( {fileEvent.user_name}{' '} {gettext('Only Show')}{' '}{fileEvent.user_name} ); }; toggleRepoDropdown = () => { this.setState({ repoDropdownOpen: !this.state.repoDropdownOpen }); }; renderRepo = (fileEvent) => { let repoName = 'Deleted'; if (fileEvent.repo_name) { repoName = fileEvent.repo_name; } return ( {repoName} { fileEvent.repo_name && {gettext('Only Show')}{' '} {fileEvent.repo_name} } ); }; renderAction = (fileEvent) => { if (fileEvent.repo_encrypted || !fileEvent.repo_id) { return {fileEvent.description}; } return ( {fileEvent.description} this.props.onDetails(e, fileEvent)}>{gettext('Details')} ); }; render() { let { fileEvent } = this.props; if (this.props.userSelected && fileEvent.user_email !== this.props.userSelected ) { return null; } else if (this.props.repoSelected && fileEvent.repo_name !== this.props.repoSelected) { return null; } else { return ( {this.renderUser(fileEvent)} {moment(fileEvent.time).format('YYYY-MM-DD HH:mm:ss')} {this.renderRepo(fileEvent)} {this.renderAction(fileEvent)} ); } } } FileUpdateItem.propTypes = propTypes; export default OrgLogsFileUpdate;