1
0
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:
llj
2019-11-29 15:17:00 +08:00
committed by Daniel Pan
parent da64e39d1b
commit 09c1a5e3d9
18 changed files with 49 additions and 115 deletions

View File

@@ -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>

View File

@@ -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}>

View File

@@ -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;

View File

@@ -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;

View File

@@ -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);

View File

@@ -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);

View File

@@ -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>
); );

View File

@@ -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>

View File

@@ -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>

View File

@@ -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}

View File

@@ -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;

View File

@@ -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);

View File

@@ -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);

View File

@@ -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);

View File

@@ -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

View File

@@ -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>

View File

@@ -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>

View File

@@ -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>