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'; const contentPropTypes = { data: PropTypes.object.isRequired, }; class FileActivitiesContent extends Component { render() { let {loading, error_msg, items, has_more} = this.props.data; if (loading) { return ; } else if (error_msg) { return

{error_msg}

; } else { return (
{/* avatar */} {gettext('User')} {gettext('Operation')} {gettext('File')} / {gettext('Library')} {gettext('Time')}
{has_more ? : ''} {error_msg ?

{error_msg}

: ''}
); } } } 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 = { loading: true, error_msg: '', events: {}, items: [], page: 1, has_more: false }; this.handleScroll = this.handleScroll.bind(this); } componentDidMount() { const pageNum = 1; const avatarSize = 72; seafileAPI.listActivities(pageNum, avatarSize).then(res => { // not logged in if (res.status == 403) { this.setState({ loading: false, error_msg: gettext('Permission denied') }); } else { // {"events":[...]} this.setState({ loading: false, items: res.data.events, has_more: res.data.events.length == '0' ? false : true }); } }); } getMore() { const pageNum = this.state.page + 1; this.setState({ page: pageNum }); seafileAPI.listActivities(pageNum) .then(res => { if (res.status == 403) { this.setState({ loading: false, error_msg: gettext('Permission denied') }); } else { // {"events":[...]} this.setState({ loading: false, items: [...this.state.items, ...res.data.events], has_more: res.data.events.length == '0' ? false : true }); } }); } 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.has_more && isBottom) { // scroll to the bottom this.getMore(); } } render() { return (

{gettext('Activities')}

); } } export default FilesActivities;