import React from 'react'; import PropTypes from 'prop-types'; import { Dropdown, DropdownToggle, DropdownMenu, DropdownItem } from 'reactstrap'; import { seafileAPI } from '../../utils/seafile-api'; import { siteRoot, gettext } from '../../utils/constants'; import OrgLogsFileAuditEvent from '../../models/org-logs-file-audit'; import '../../css/org-logs.css'; class OrgLogsFileAudit extends React.Component { constructor(props) { super(props); this.state = { page: 1, pageNext: false, eventList: [], userSelected: '', repoSelected: '', isItemFreezed: false }; } 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.orgAdminListFileAudit(email, repoID, page).then(res => { let eventList = res.data.log_list.map(item => { return new OrgLogsFileAuditEvent(item); }); this.setState({ eventList: eventList, pageNext: res.data.page_next, page: res.data.page, userSelected: res.data.user_selected, repoSelected: res.data.repo_selected }); }); } onChangePageNum = (e, num) => { e.preventDefault(); let page = this.state.page; if (num == 1) { page = page + 1; } else { page = page - 1; } this.initData(page); } 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('Type')} {gettext('IP')} {gettext('Date')} {gettext('Library')} {gettext('File')}
{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')}}
); } } const propTypes = { filterUser: PropTypes.func.isRequired, filterRepo: PropTypes.func.isRequired, isItemFreezed: PropTypes.bool.isRequired, }; class FileAuditItem 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} ); } renderType = (type) => { if (type.indexOf('web') != -1) { type = 'web'; } if (type.indexOf('api') != -1) { type = 'api'; } if (type.indexOf('share-link') != -1) { type = 'share link'; } return type; } 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} } ); } 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)} {this.renderType(fileEvent.type)} {fileEvent.ip} {fileEvent.time} {this.renderRepo(fileEvent)} {fileEvent.file_name} ); } } } FileAuditItem.propTypes = propTypes; export default OrgLogsFileAudit;