import React, { Component, Fragment } from 'react'; import PropTypes from 'prop-types'; import { seafileAPI } from '../../utils/seafile-api'; import { gettext, siteRoot } from '../../utils/constants'; import { Utils } from '../../utils/utils'; import Loading from '../../components/loading'; const contentPropTypes = { isLoadingMore: PropTypes.bool.isRequired, items: PropTypes.array.isRequired, }; class FileActivitiesContent extends Component { render() { let {items, isLoadingMore} = this.props; return (
{/* avatar */} {gettext('User')} {gettext('Operation')} {gettext('File')} / {gettext('Library')} {gettext('Time')}
{isLoadingMore ? : ''}
); } } FileActivitiesContent.propTypes = contentPropTypes; const tablePropTypes = { items: PropTypes.array.isRequired, }; class TableBody extends Component { render() { let listFilesActivities = this.props.items.map(function(item, index) { let op, details; let userProfileURL = `${siteRoot}profile/${encodeURIComponent(item.author_email)}/`; let libURL = siteRoot + 'library/' + item.repo_id + '/' + encodeURIComponent(item.repo_name) + '/'; let libLink = {item.repo_name}; let smallLibLink = {item.repo_name}; if (item.obj_type == 'repo') { switch(item.op_type) { case 'create': op = gettext('Created library'); details = {libLink}; break; case 'rename': op = gettext('Renamed library'); details = {item.old_repo_name} => {libLink}; break; case 'delete': op = gettext('Deleted library'); details = {item.repo_name}; break; case 'recover': op = gettext('Restored library'); details = {libLink}; break; case 'clean-up-trash': if (item.days == 0) { op = gettext('Removed all items from trash.'); } else { op = gettext('Removed items older than {n} days from trash.').replace('{n}', item.days); } details = {libLink}; break; } } else if (item.obj_type == 'file') { let fileURL = `${siteRoot}lib/${item.repo_id}/file${Utils.encodePath(item.path)}`; let fileLink = {item.name}; switch(item.op_type) { case 'create': op = gettext('Created file'); details = {fileLink}
{smallLibLink}; break; case 'delete': op = gettext('Deleted file'); details = {item.name}
{smallLibLink}; break; case 'recover': op = gettext('Restored file'); details = {fileLink}
{smallLibLink}; break; case 'rename': op = gettext('Renamed file'); details = {item.old_name} => {fileLink}
{smallLibLink}; break; case 'move': var filePathLink = {item.path}; op = gettext('Moved file'); details = {item.old_path} => {filePathLink}
{smallLibLink}; break; case 'edit': // update op = gettext('Updated file'); details = {fileLink}
{smallLibLink}; break; } } else { // dir let dirURL = siteRoot + 'library/' + item.repo_id + '/' + encodeURIComponent(item.repo_name) + Utils.encodePath(item.path); let dirLink = {item.name}; switch(item.op_type) { case 'create': op = gettext('Created folder'); details = {dirLink}
{smallLibLink}; break; case 'delete': op = gettext('Deleted folder'); details = {item.name}
{smallLibLink}; break; case 'recover': op = gettext('Restored folder'); details = {dirLink}
{smallLibLink}; break; case 'rename': op = gettext('Renamed folder'); details = {item.old_name} => {dirLink}
{smallLibLink}; break; case 'move': var dirPathLink = {item.path}; op = gettext('Moved folder'); details = {item.old_path} => {dirPathLink}
{smallLibLink}; break; } } return ( {item.author_name} {op} {details} ); }, this); return ( {listFilesActivities} ); } } TableBody.propTypes = tablePropTypes; class FilesActivities extends Component { constructor(props) { super(props); this.state = { errorMsg: '', isFirstLoading: true, isLoadingMore: false, currentPage: 1, hasMore: true, items: [], }; } componentDidMount() { const avatarSize = 72; let currentPage = this.state.currentPage; seafileAPI.listActivities(currentPage, avatarSize).then(res => { // {"events":[...]} this.setState({ items: res.data.events, currentPage: currentPage + 1, isFirstLoading: false, hasMore: true, }); }).catch(error => { if (error.response.status == 403) { this.setState({ isFirstLoading: false, errorMsg: gettext('Permission denied') }); } }); } getMore() { this.setState({isLoadingMore: true}); let currentPage = this.state.currentPage; seafileAPI.listActivities(currentPage).then(res => { // {"events":[...]} this.setState({ isLoadingMore: false, items: [...this.state.items, ...res.data.events], currentPage: currentPage + 1, hasMore: res.data.events.length === 0 ? false : true }); }).catch(error => { if (error.response.status == 403) { this.setState({ isLoadingMore: false, errorMsg: gettext('Permission denied') }); } }); } handleScroll = (event) => { const clientHeight = event.target.clientHeight; const scrollHeight = event.target.scrollHeight; const scrollTop = event.target.scrollTop; const isBottom = (clientHeight + scrollTop + 1 >= scrollHeight); if (this.state.hasMore && isBottom) { // scroll to the bottom this.getMore(); } } render() { return (

{gettext('Activities')}

{this.state.isFirstLoading && } {(!this.state.isFirstLoading && this.state.errorMsg) &&

{this.state.errorMsg}

} {!this.state.isFirstLoading && }
); } } export default FilesActivities;