mirror of
https://github.com/haiwen/seahub.git
synced 2025-09-16 07:08:55 +00:00
[misc] bugfix & improvement; removed unused files (#4321)
* redesigned 'repo api token' dialog * fixup for 'system admin' pages * removed unused ali 'priv/' files
This commit is contained in:
@@ -4,6 +4,7 @@ import {gettext} from '../../utils/constants';
|
|||||||
import {Modal, ModalHeader, ModalBody, Button, Input} from 'reactstrap';
|
import {Modal, ModalHeader, ModalBody, Button, Input} from 'reactstrap';
|
||||||
import RepoAPITokenPermissionEditor from '../select-editor/repo-api-token-permission-editor';
|
import RepoAPITokenPermissionEditor from '../select-editor/repo-api-token-permission-editor';
|
||||||
import {seafileAPI} from '../../utils/seafile-api';
|
import {seafileAPI} from '../../utils/seafile-api';
|
||||||
|
import { Utils } from '../../utils/utils';
|
||||||
import toaster from '../toast';
|
import toaster from '../toast';
|
||||||
import copy from 'copy-to-clipboard';
|
import copy from 'copy-to-clipboard';
|
||||||
import Loading from '../loading';
|
import Loading from '../loading';
|
||||||
@@ -45,7 +46,7 @@ class APITokenItem extends React.Component {
|
|||||||
onCopyAPIToken = () => {
|
onCopyAPIToken = () => {
|
||||||
let api_token = this.props.item.api_token;
|
let api_token = this.props.item.api_token;
|
||||||
copy(api_token);
|
copy(api_token);
|
||||||
toaster.success(gettext('API Token is copied to the clipboard.'));
|
toaster.success(gettext('API token is copied to the clipboard.'));
|
||||||
};
|
};
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
@@ -63,12 +64,10 @@ class APITokenItem extends React.Component {
|
|||||||
/>
|
/>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<Fragment>
|
<span>{item.api_token}</span>
|
||||||
<span>{item.api_token}</span>
|
{this.state.isOperationShow &&
|
||||||
{this.state.isOperationShow &&
|
<span className="far fa-copy action-icon" onClick={this.onCopyAPIToken} />
|
||||||
<span className="far fa-copy action-icon" onClick={this.onCopyAPIToken} />
|
}
|
||||||
}
|
|
||||||
</Fragment>
|
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<span
|
<span
|
||||||
@@ -85,8 +84,6 @@ class APITokenItem extends React.Component {
|
|||||||
APITokenItem.propTypes = apiTokenItemPropTypes;
|
APITokenItem.propTypes = apiTokenItemPropTypes;
|
||||||
|
|
||||||
const propTypes = {
|
const propTypes = {
|
||||||
// currentTable: PropTypes.object.isRequired,
|
|
||||||
// onTableAPITokenToggle: PropTypes.func.isRequired,
|
|
||||||
repo: PropTypes.object.isRequired,
|
repo: PropTypes.object.isRequired,
|
||||||
onRepoAPITokenToggle: PropTypes.func.isRequired,
|
onRepoAPITokenToggle: PropTypes.func.isRequired,
|
||||||
};
|
};
|
||||||
@@ -217,6 +214,16 @@ class RepoAPITokenDialog extends React.Component {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
const thead = (
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th width="22%">{gettext('App Name')}</th>
|
||||||
|
<th width="20%">{gettext('Permission')}</th>
|
||||||
|
<th width="48%">API Token</th>
|
||||||
|
<th width="10%"></th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
);
|
||||||
return (
|
return (
|
||||||
<Fragment>
|
<Fragment>
|
||||||
{this.state.errorMsg &&
|
{this.state.errorMsg &&
|
||||||
@@ -227,13 +234,7 @@ class RepoAPITokenDialog extends React.Component {
|
|||||||
{!this.state.errorMsg &&
|
{!this.state.errorMsg &&
|
||||||
<div className='mx-5 mb-5' style={{height: 'auto'}}>
|
<div className='mx-5 mb-5' style={{height: 'auto'}}>
|
||||||
<table>
|
<table>
|
||||||
<thead>
|
{thead}
|
||||||
<tr>
|
|
||||||
<th width="45%">{gettext('App Name')}</th>
|
|
||||||
<th width="40%">{gettext('Permission')}</th>
|
|
||||||
<th width="15%"></th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
@@ -253,6 +254,7 @@ class RepoAPITokenDialog extends React.Component {
|
|||||||
onPermissionChanged={this.setPermission}
|
onPermissionChanged={this.setPermission}
|
||||||
/>
|
/>
|
||||||
</td>
|
</td>
|
||||||
|
<td><span className="text-secondary">--</span></td>
|
||||||
<td>
|
<td>
|
||||||
<Button onClick={this.addAPIToken} disabled={!this.state.isSubmitBtnActive}>{gettext('Submit')}</Button>
|
<Button onClick={this.addAPIToken} disabled={!this.state.isSubmitBtnActive}>{gettext('Submit')}</Button>
|
||||||
</td>
|
</td>
|
||||||
@@ -262,15 +264,8 @@ class RepoAPITokenDialog extends React.Component {
|
|||||||
{this.state.apiTokenList.length !== 0 &&
|
{this.state.apiTokenList.length !== 0 &&
|
||||||
<div className='o-auto' style={{height: 'calc(100% - 91px)'}}>
|
<div className='o-auto' style={{height: 'calc(100% - 91px)'}}>
|
||||||
<div className="h-100" style={{maxHeight: '18rem'}}>
|
<div className="h-100" style={{maxHeight: '18rem'}}>
|
||||||
<table>
|
<table className="table-thead-hidden">
|
||||||
<thead>
|
{thead}
|
||||||
<tr>
|
|
||||||
<th width="22%">{gettext('App Name')}</th>
|
|
||||||
<th width="15%">{gettext('Permission')}</th>
|
|
||||||
<th width="53%">{gettext('Access Token')}</th>
|
|
||||||
<th width="10%"></th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody>
|
<tbody>
|
||||||
{renderAPITokenList}
|
{renderAPITokenList}
|
||||||
</tbody>
|
</tbody>
|
||||||
@@ -288,17 +283,18 @@ class RepoAPITokenDialog extends React.Component {
|
|||||||
};
|
};
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
// let currentTable = this.props.currentTable;
|
|
||||||
// let name = currentTable.name;
|
|
||||||
let repo = this.repo;
|
let repo = this.repo;
|
||||||
|
|
||||||
|
const itemName = '<span class="op-target">' + Utils.HTMLescape(repo.repo_name) + '</span>';
|
||||||
|
const title = gettext('{placeholder} API Token').replace('{placeholder}', itemName);
|
||||||
return (
|
return (
|
||||||
<Modal
|
<Modal
|
||||||
isOpen={true} className="share-dialog" style={{maxWidth: '720px'}}
|
isOpen={true} className="share-dialog" style={{maxWidth: '800px'}}
|
||||||
toggle={this.props.onRepoAPITokenToggle}
|
toggle={this.props.onRepoAPITokenToggle}
|
||||||
>
|
>
|
||||||
<ModalHeader toggle={this.props.onRepoAPITokenToggle}>
|
<ModalHeader toggle={this.props.onRepoAPITokenToggle}>
|
||||||
{gettext('API Token')} <span className="op-target" title={repo.repo_name}>{repo.repo_name}</span></ModalHeader>
|
<p dangerouslySetInnerHTML={{__html: title}} className="m-0"></p>
|
||||||
|
</ModalHeader>
|
||||||
<ModalBody className="share-dialog-content">
|
<ModalBody className="share-dialog-content">
|
||||||
{this.renderContent()}
|
{this.renderContent()}
|
||||||
</ModalBody>
|
</ModalBody>
|
||||||
|
@@ -36,9 +36,8 @@ class SysAdminTransferGroupDialog extends React.Component {
|
|||||||
|
|
||||||
render() {
|
render() {
|
||||||
const { submitBtnDisabled } = this.state;
|
const { submitBtnDisabled } = this.state;
|
||||||
const groupName = Utils.HTMLescape(this.props.groupName);
|
const groupName = '<span class="op-target">' + Utils.HTMLescape(this.props.groupName) +'</span>';
|
||||||
const innerSpan = '<span class="op-target" title=' + groupName + '>' + groupName +'</span>';
|
const msg = gettext('Transfer Group {placeholder} to').replace('{placeholder}', groupName);
|
||||||
const msg = gettext('Transfer Group {library_name} to').replace('{library_name}', innerSpan);
|
|
||||||
return (
|
return (
|
||||||
<Modal isOpen={true}>
|
<Modal isOpen={true}>
|
||||||
<ModalHeader toggle={this.props.toggleDialog}>
|
<ModalHeader toggle={this.props.toggleDialog}>
|
||||||
|
@@ -212,7 +212,7 @@ class SharedRepoListItem extends React.Component {
|
|||||||
translateResult = gettext('History Setting');
|
translateResult = gettext('History Setting');
|
||||||
break;
|
break;
|
||||||
case 'API Token':
|
case 'API Token':
|
||||||
translateResult = gettext('API Token');
|
translateResult = 'API Token'; // translation is not needed here
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
@@ -106,7 +106,7 @@ class MylibRepoMenu extends React.Component {
|
|||||||
translateResult = gettext('Label Current State');
|
translateResult = gettext('Label Current State');
|
||||||
break;
|
break;
|
||||||
case 'API Token':
|
case 'API Token':
|
||||||
translateResult = gettext('API Token');
|
translateResult = 'API Token'; // translation is not needed here
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
@@ -241,7 +241,7 @@ class InstitutionAdmins extends Component {
|
|||||||
return user.email != email;
|
return user.email != email;
|
||||||
});
|
});
|
||||||
this.setState({userList: userList});
|
this.setState({userList: userList});
|
||||||
toaster.success(gettext('Successfully revoked the admin permission of {placeholder}'.replace('{placeholder}', name)));
|
toaster.success(gettext('Successfully revoked the admin permission of {placeholder}.').replace('{placeholder}', name));
|
||||||
}).catch((error) => {
|
}).catch((error) => {
|
||||||
let errMessage = Utils.getErrorMsg(error);
|
let errMessage = Utils.getErrorMsg(error);
|
||||||
toaster.danger(errMessage);
|
toaster.danger(errMessage);
|
||||||
|
@@ -308,20 +308,16 @@ class InstitutionUsers extends Component {
|
|||||||
|
|
||||||
addUser = (emails) => {
|
addUser = (emails) => {
|
||||||
seafileAPI.sysAdminAddInstitutionUserBatch(this.props.institutionID, emails).then(res => {
|
seafileAPI.sysAdminAddInstitutionUserBatch(this.props.institutionID, emails).then(res => {
|
||||||
|
this.toggleAddUserDialog();
|
||||||
let successArray = res.data.success;
|
let successArray = res.data.success;
|
||||||
let failedArray = res.data.failed;
|
let failedArray = res.data.failed;
|
||||||
let tipStr = gettext('Add {totalCount} members. {successCount} success, {failedCount} failed.')
|
if (successArray.length) {
|
||||||
.replace('{totalCount}', emails.length)
|
let newUserList = this.state.userList.concat(successArray);
|
||||||
.replace('{successCount}', successArray.length)
|
this.setState({userList: newUserList});
|
||||||
.replace('{failedCount}', failedArray.length);
|
|
||||||
if (successArray.length > 0) {
|
|
||||||
toaster.success(tipStr);
|
|
||||||
} else {
|
|
||||||
toaster.danger(tipStr);
|
|
||||||
}
|
}
|
||||||
let newUserList = this.state.userList.concat(successArray);
|
failedArray.map((item) => {
|
||||||
this.setState({userList: newUserList});
|
toaster.danger(item.error_msg);
|
||||||
this.toggleAddUserDialog();
|
});
|
||||||
}).catch((error) => {
|
}).catch((error) => {
|
||||||
let errMessage = Utils.getErrorMsg(error);
|
let errMessage = Utils.getErrorMsg(error);
|
||||||
toaster.danger(errMessage);
|
toaster.danger(errMessage);
|
||||||
|
@@ -115,7 +115,7 @@ class Item extends Component {
|
|||||||
<td>{moment(item.ctime).fromNow()}</td>
|
<td>{moment(item.ctime).fromNow()}</td>
|
||||||
<td>{item.view_cnt}</td>
|
<td>{item.view_cnt}</td>
|
||||||
<td>
|
<td>
|
||||||
<a href="#" className={deleteIcon} title={gettext('delete')} onClick={this.deleteShareLink}></a>
|
<a href="#" className={deleteIcon} title={gettext('Remove')} onClick={this.deleteShareLink}></a>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
);
|
);
|
||||||
|
@@ -117,7 +117,7 @@ class Item extends Component {
|
|||||||
<td>{moment(item.ctime).fromNow()}</td>
|
<td>{moment(item.ctime).fromNow()}</td>
|
||||||
<td>{item.view_cnt}</td>
|
<td>{item.view_cnt}</td>
|
||||||
<td>
|
<td>
|
||||||
<a href="#" className={deleteIcon} title={gettext('delete')} onClick={this.deleteUploadLink}></a>
|
<a href="#" className={deleteIcon} title={gettext('Remove')} onClick={this.deleteUploadLink}></a>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
</Fragment>
|
</Fragment>
|
||||||
|
@@ -33,7 +33,7 @@ class Content extends Component {
|
|||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th width="33%">{gettext('Name')}</th>
|
<th width="33%">{gettext('Name')}</th>
|
||||||
<th width="34%">{gettext('ID')}</th>
|
<th width="34%">ID</th>
|
||||||
<th width="33%">{gettext('Description')}</th>
|
<th width="33%">{gettext('Description')}</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
|
@@ -176,7 +176,7 @@ class Item extends Component {
|
|||||||
<ModalPortal>
|
<ModalPortal>
|
||||||
<CommonOperationConfirmationDialog
|
<CommonOperationConfirmationDialog
|
||||||
title={gettext('Delete Library')}
|
title={gettext('Delete Library')}
|
||||||
message={gettext('Are you sure you want to delete {repo_name} completely?').replace('{repo_name}', repoName)}
|
message={gettext('Are you sure you want to delete {placeholder} completely?').replace('{placeholder}', repoName)}
|
||||||
executeOperation={this.onDeleteRepo}
|
executeOperation={this.onDeleteRepo}
|
||||||
confirmBtnText={gettext('Delete')}
|
confirmBtnText={gettext('Delete')}
|
||||||
toggleDialog={this.toggleDeleteRepoDialog}
|
toggleDialog={this.toggleDeleteRepoDialog}
|
||||||
@@ -187,7 +187,7 @@ class Item extends Component {
|
|||||||
<ModalPortal>
|
<ModalPortal>
|
||||||
<CommonOperationConfirmationDialog
|
<CommonOperationConfirmationDialog
|
||||||
title={gettext('Restore Library')}
|
title={gettext('Restore Library')}
|
||||||
message={gettext('Are you sure you want to restore %s ?').replace('%s', repoName)}
|
message={gettext('Are you sure you want to restore {placeholder}?').replace('{placeholder}', repoName)}
|
||||||
executeOperation={this.onRestoreRepo}
|
executeOperation={this.onRestoreRepo}
|
||||||
confirmBtnText={gettext('Restore')}
|
confirmBtnText={gettext('Restore')}
|
||||||
toggleDialog={this.toggleRestoreRepoDialog}
|
toggleDialog={this.toggleRestoreRepoDialog}
|
||||||
|
@@ -26,7 +26,7 @@ class StatisticReports extends React.Component {
|
|||||||
let url = siteRoot + 'api/v2.1/admin/statistics/';
|
let url = siteRoot + 'api/v2.1/admin/statistics/';
|
||||||
let { month } = this.state;
|
let { month } = this.state;
|
||||||
if (!month) {
|
if (!month) {
|
||||||
let errorMessage = gettext('Required field');
|
let errorMessage = gettext('It is required.');
|
||||||
this.setState({
|
this.setState({
|
||||||
errorMessage: errorMessage
|
errorMessage: errorMessage
|
||||||
});
|
});
|
||||||
@@ -85,4 +85,4 @@ class StatisticReports extends React.Component {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export default StatisticReports;
|
export default StatisticReports;
|
||||||
|
@@ -74,7 +74,7 @@ class TermsAndConditions extends Component {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
this.setState({termList: termList});
|
this.setState({termList: termList});
|
||||||
toaster.success(gettext('Successfully update.'));
|
toaster.success(gettext('Update succeeded.'));
|
||||||
}).catch((error) => {
|
}).catch((error) => {
|
||||||
let errMessage = Utils.getErrorMsg(error);
|
let errMessage = Utils.getErrorMsg(error);
|
||||||
toaster.danger(errMessage);
|
toaster.danger(errMessage);
|
||||||
@@ -85,7 +85,7 @@ class TermsAndConditions extends Component {
|
|||||||
seafileAPI.sysAdminDeleteTermAndCondition(termID).then(res => {
|
seafileAPI.sysAdminDeleteTermAndCondition(termID).then(res => {
|
||||||
let termList = this.state.termList.filter(item => item.id != termID);
|
let termList = this.state.termList.filter(item => item.id != termID);
|
||||||
this.setState({termList: termList});
|
this.setState({termList: termList});
|
||||||
toaster.success(gettext('Successfully deleted.'));
|
toaster.success(gettext('Successfully deleted 1 item.'));
|
||||||
}).catch((error) => {
|
}).catch((error) => {
|
||||||
let errMessage = Utils.getErrorMsg(error);
|
let errMessage = Utils.getErrorMsg(error);
|
||||||
toaster.danger(errMessage);
|
toaster.danger(errMessage);
|
||||||
|
@@ -238,7 +238,7 @@ class SearchUsers extends Component {
|
|||||||
this.setState({
|
this.setState({
|
||||||
userList: userList
|
userList: userList
|
||||||
});
|
});
|
||||||
toaster.success(gettext('Successfully revoked the admin permission of {placeholder}'.replace('{placeholder}', name)));
|
toaster.success(gettext('Successfully revoked the admin permission of {placeholder}.').replace('{placeholder}', name));
|
||||||
}).catch((error) => {
|
}).catch((error) => {
|
||||||
let errMessage = Utils.getErrorMsg(error);
|
let errMessage = Utils.getErrorMsg(error);
|
||||||
toaster.danger(errMessage);
|
toaster.danger(errMessage);
|
||||||
|
@@ -344,7 +344,7 @@ class Users extends Component {
|
|||||||
this.setState({
|
this.setState({
|
||||||
userList: userList
|
userList: userList
|
||||||
});
|
});
|
||||||
toaster.success(gettext('Successfully revoked the admin permission of {placeholder}'.replace('{placeholder}', name)));
|
toaster.success(gettext('Successfully revoked the admin permission of {placeholder}.').replace('{placeholder}', name));
|
||||||
}).catch((error) => {
|
}).catch((error) => {
|
||||||
let errMessage = Utils.getErrorMsg(error);
|
let errMessage = Utils.getErrorMsg(error);
|
||||||
toaster.danger(errMessage);
|
toaster.danger(errMessage);
|
||||||
|
@@ -615,7 +615,7 @@ export const Utils = {
|
|||||||
case 'cloud_edit':
|
case 'cloud_edit':
|
||||||
return {
|
return {
|
||||||
value: permission,
|
value: permission,
|
||||||
text: gettext('Edit on cloud'),
|
text: gettext('Edit on cloud only'),
|
||||||
permissionDetails: {
|
permissionDetails: {
|
||||||
'can_edit': true,
|
'can_edit': true,
|
||||||
"can_download": false
|
"can_download": false
|
||||||
|
@@ -1,17 +0,0 @@
|
|||||||
{% load i18n %}
|
|
||||||
<html>
|
|
||||||
<head></head>
|
|
||||||
<body>
|
|
||||||
|
|
||||||
{# 7.0-share_perm #}
|
|
||||||
<p>{% trans "Preview-Edit-on-Cloud" %}</p>
|
|
||||||
<p>{% trans "Preview-on-Cloud" %}</p>
|
|
||||||
|
|
||||||
{# alibaba custom #}
|
|
||||||
<p>{% trans "Read-Write-Sync" %}</p>
|
|
||||||
<p>{% trans "Read-Only-Sync" %}</p>
|
|
||||||
<p>{% trans "Co-Owner" %}</p>
|
|
||||||
<p>{% trans "Edit-on-Cloud" %}</p>
|
|
||||||
<p>{% trans "View-on-Cloud" %}</p>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
@@ -1,30 +0,0 @@
|
|||||||
<!DOCTYPE html>
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<script type="text/javascript">
|
|
||||||
var title;
|
|
||||||
|
|
||||||
// 7.0-share_perm
|
|
||||||
title = gettext("Preview-Edit-on-Cloud library");
|
|
||||||
title = gettext("Preview-on-Cloud library");
|
|
||||||
title = gettext("Admin access");
|
|
||||||
|
|
||||||
title = gettext("Read-Write folder");
|
|
||||||
title = gettext("Read-Only folder");
|
|
||||||
title = gettext("Preview-Edit-on-Cloud folder");
|
|
||||||
title = gettext("Preview-on-Cloud folder");
|
|
||||||
|
|
||||||
title = gettext("Preview-Edit-on-Cloud");
|
|
||||||
title = gettext("Preview-on-Cloud");
|
|
||||||
|
|
||||||
// alibaba custom
|
|
||||||
title = gettext("Read-Write-Sync");
|
|
||||||
title = gettext("Read-Only-Sync");
|
|
||||||
title = gettext("Co-Owner");
|
|
||||||
title = gettext("Edit-on-Cloud");
|
|
||||||
title = gettext("View-on-Cloud");
|
|
||||||
</script>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
@@ -1,10 +0,0 @@
|
|||||||
{% load i18n %}
|
|
||||||
<html>
|
|
||||||
<head></head>
|
|
||||||
<body>
|
|
||||||
<p>{% trans "Login with: " %}</p>
|
|
||||||
<p>{% trans "Invite user" %}</p>
|
|
||||||
<p>{% trans "Send the invitation link to the others, and they will be able to join the organization via scanning the QR code." %}</p>
|
|
||||||
<p>{% trans "Invitation link is copied." %}</p>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
Reference in New Issue
Block a user