import React from 'react'; import ReactDOM from 'react-dom'; import { navigate } from '@reach/router'; import moment from 'moment'; import { Utils } from './utils/utils'; import { gettext, loginUrl, siteRoot, mediaUrl, logoPath, logoWidth, logoHeight, siteTitle } from './utils/constants'; import { seafileAPI } from './utils/seafile-api'; import Loading from './components/loading'; import ModalPortal from './components/modal-portal'; import CommonToolbar from './components/toolbar/common-toolbar'; import CommitDetails from './components/dialog/commit-details'; import UpdateRepoCommitLabels from './components/dialog/edit-repo-commit-labels'; import './css/toolbar.css'; import './css/search.css'; import './css/repo-history.css'; const { repoID, repoName, userPerm, showLabel } = window.app.pageOptions; class RepoHistory extends React.Component { constructor(props) { super(props); this.state = { isLoading: true, errorMsg: '', page: 1, perPage: 100, items: [], more: false }; } componentDidMount() { this.getItems(this.state.page); } getItems = (page) => { seafileAPI.getRepoHistory(repoID, page, this.state.perPage).then((res) => { this.setState({ isLoading: false, page: page, items: res.data.data, more: res.data.more }); }).catch((error) => { if (error.response) { if (error.response.status == 403) { this.setState({ isLoading: false, errorMsg: gettext('Permission denied') }); location.href = `${loginUrl}?next=${encodeURIComponent(location.href)}`; } else { this.setState({ isLoading: false, errorMsg: gettext('Error') }); } } else { this.setState({ isLoading: false, errorMsg: gettext('Please check the network.') }); } }); } getPrevious = () => { this.getItems(this.state.page - 1); } getNext = () => { this.getItems(this.state.page + 1); } onSearchedClick = (selectedItem) => { if (selectedItem.is_dir === true) { let url = siteRoot + 'library/' + selectedItem.repo_id + '/' + selectedItem.repo_name + selectedItem.path; navigate(url, {repalce: true}); } else { let url = siteRoot + 'lib/' + selectedItem.repo_id + '/file' + Utils.encodePath(selectedItem.path); let newWindow = window.open('about:blank'); newWindow.location.href = url; } } render() { return (
logo

{userPerm == 'rw' &&

{gettext('Tip: a snapshot will be generated after modification, which records the library state after the modification.')}

}
); } } class Content extends React.Component { constructor(props) { super(props); this.theadData = showLabel ? [ {width: '43%', text: gettext('Description')}, {width: '12%', text: gettext('Time')}, {width: '9%', text: gettext('Modifier')}, {width: '12%', text: `${gettext('Device')} / ${gettext('Version')}`}, {width: '12%', text: gettext('Labels')}, {width: '12%', text: ''} ] : [ {width: '43%', text: gettext('Description')}, {width: '15%', text: gettext('Time')}, {width: '15%', text: gettext('Modifier')}, {width: '15%', text: `${gettext('Device')} / ${gettext('Version')}`}, {width: '12%', text: ''} ]; } getPrevious = (e) => { e.preventDefault(); this.props.getPrevious(); } getNext = (e) => { e.preventDefault(); this.props.getNext(); } render() { const { isLoading, errorMsg, page, items, more } = this.props.data; if (isLoading) { return ; } if (errorMsg) { return

{errorMsg}

; } return ( {this.theadData.map((item, index) => { return ; })} {items.map((item, index) => { item.isFirstCommit = (page == 1) && (index == 0); item.showDetails = more || (index != items.length - 1); return ; })}
{item.text}
{page != 1 && {gettext('Previous')} } {more && {gettext('Next')} }
); } } class Item extends React.Component { constructor(props) { super(props); this.state = { labels: this.props.item.tags, isIconShown: false, isCommitLabelUpdateDialogOpen: false, isCommitDetailsDialogOpen: false }; } handleMouseOver = () => { this.setState({isIconShown: true}); } handleMouseOut = () => { this.setState({isIconShown: false}); } showCommitDetails = (e) => { e.preventDefault(); this.setState({ isCommitDetailsDialogOpen: !this.state.isCommitDetailsDialogOpen }); } toggleCommitDetailsDialog = () => { this.setState({ isCommitDetailsDialogOpen: !this.state.isCommitDetailsDialogOpen }); } editLabel = () => { this.setState({ isCommitLabelUpdateDialogOpen: !this.state.isCommitLabelUpdateDialogOpen }); } toggleLabelEditDialog = () => { this.setState({ isCommitLabelUpdateDialogOpen: !this.state.isCommitLabelUpdateDialogOpen }); } updateLabels = (labels) => { this.setState({ labels: labels }); } render() { const item = this.props.item; const { isIconShown, isCommitLabelUpdateDialogOpen, isCommitDetailsDialogOpen, labels } = this.state; let name = ''; if (item.email) { if (!item.second_parent_id) { name = {item.name}; } else { name = gettext('None'); } } else { name = gettext('Unknown'); } return ( {item.description} {item.showDetails && {gettext('Details')} } {moment(item.time).format('YYYY-MM-DD')} {name} {item.client_version ? `${item.device_name} / ${item.client_version}` : 'API / --'} {showLabel && {labels.map((item, index) => { return {item}; })} {userPerm == 'rw' && } } {userPerm == 'rw' && ( item.isFirstCommit ? {gettext('Current Version')} : {gettext('View Snapshot')} )} {isCommitDetailsDialogOpen && } {isCommitLabelUpdateDialogOpen && } ); } } ReactDOM.render( , document.getElementById('wrapper') );