diff --git a/frontend/src/components/dirent-list-view/dirent-list-item.js b/frontend/src/components/dirent-list-view/dirent-list-item.js
index 3203fd0a21..66b52001cc 100644
--- a/frontend/src/components/dirent-list-view/dirent-list-item.js
+++ b/frontend/src/components/dirent-list-view/dirent-list-item.js
@@ -6,9 +6,8 @@ import { gettext, siteRoot, mediaUrl, canGenerateShareLink, canGenerateUploadLin
import { Utils } from '../../utils/utils';
import { seafileAPI } from '../../utils/seafile-api';
import URLDecorator from '../../utils/url-decorator';
-import toaster from '../toast';
import DirentMenu from './dirent-menu';
-import DirentRename from './dirent-rename';
+import Rename from '../rename';
import ModalPortal from '../modal-portal';
import ZipDownloadDialog from '../dialog/zip-download-dialog';
import MoveDirentDialog from '../dialog/move-dirent-dialog';
@@ -194,23 +193,6 @@ class DirentListItem extends React.Component {
}
onRenameConfirm = (newName) => {
- if (newName === this.props.dirent.name) {
- this.onRenameCancel();
- return false;
- }
-
- if (!newName) {
- let errMessage = gettext('Name is required.');
- toaster.danger(errMessage);
- return false;
- }
-
- if (newName.indexOf('/') > -1) {
- let errMessage = gettext('Name should not include ' + '\'/\'' + '.');
- toaster.danger(errMessage);
- return false;
- }
-
this.props.onItemRename(this.props.dirent, newName);
this.onRenameCancel();
}
@@ -384,7 +366,7 @@ class DirentListItem extends React.Component {
{this.state.isRenameing ?
- :
+ :
{dirent.name}
}
|
diff --git a/frontend/src/components/dirent-list-view/dirent-rename.js b/frontend/src/components/dirent-list-view/dirent-rename.js
deleted file mode 100644
index b941edaa39..0000000000
--- a/frontend/src/components/dirent-list-view/dirent-rename.js
+++ /dev/null
@@ -1,71 +0,0 @@
-import React from 'react';
-import PropTypes from 'prop-types';
-
-const propTypes = {
- dirent: PropTypes.object.isRequired,
- onRenameConfirm: PropTypes.func.isRequired,
- onRenameCancel: PropTypes.func.isRequired,
-};
-class DirentRename extends React.Component {
-
- constructor(props) {
- super(props);
- this.state = {
- name: props.dirent.name
- };
- }
-
- componentDidMount() {
- this.refs.renameInput.focus();
- if (this.props.dirent.type === 'file') {
- var endIndex = this.props.dirent.name.lastIndexOf('.');
- this.refs.renameInput.setSelectionRange(0, endIndex, 'forward');
- } else {
- this.refs.renameInput.setSelectionRange(0, -1);
- }
- }
-
- onChange = (e) => {
- this.setState({name: e.target.value});
- }
-
- onClick = (e) => {
- e.nativeEvent.stopImmediatePropagation();
- }
-
- onKeyPress = (e) => {
- if (e.key === 'Enter') {
- this.onRenameConfirm(e);
- }
- }
-
- onRenameConfirm = (e) => {
- e.nativeEvent.stopImmediatePropagation();
- this.props.onRenameConfirm(this.state.name);
- }
-
- onRenameCancel = (e) => {
- e.nativeEvent.stopImmediatePropagation();
- this.props.onRenameCancel();
- }
-
- render() {
- return (
-
-
-
-
-
- );
- }
-}
-
-DirentRename.propTypes = propTypes;
-
-export default DirentRename;
diff --git a/frontend/src/components/rename-input.js b/frontend/src/components/rename.js
similarity index 60%
rename from frontend/src/components/rename-input.js
rename to frontend/src/components/rename.js
index 7eb4e3aa8d..b44963f13a 100644
--- a/frontend/src/components/rename-input.js
+++ b/frontend/src/components/rename.js
@@ -1,13 +1,16 @@
import React from 'react';
import PropTypes from 'prop-types';
+import { gettext } from '../utils/constants'
+import toaster from './toast';
const propTypes = {
- type: PropTypes.string,
+ hasSuffix: PropTypes.bool,
name: PropTypes.string.isRequired,
onRenameConfirm: PropTypes.func.isRequired,
onRenameCancel: PropTypes.func.isRequired,
};
-class RenameInput extends React.Component {
+
+class Rename extends React.Component {
constructor(props) {
super(props);
@@ -18,7 +21,7 @@ class RenameInput extends React.Component {
componentDidMount() {
this.refs.renameInput.focus();
- if (this.props.type === 'file') {
+ if (this.props.hasSuffix) {
var endIndex = this.props.name.lastIndexOf('.');
this.refs.renameInput.setSelectionRange(0, endIndex, 'forward');
} else {
@@ -42,7 +45,18 @@ class RenameInput extends React.Component {
onRenameConfirm = (e) => {
e.nativeEvent.stopImmediatePropagation();
- this.props.onRenameConfirm(this.state.name);
+ let newName = this.state.name.trim();
+ if (newName === this.props.name) {
+ this.props.onRenameCancel();
+ return;
+ }
+
+ let { isValid, errMessage } = this.validateInput();
+ if (!isValid) {
+ toaster.danger(errMessage);
+ } else {
+ this.props.onRenameConfirm(newName);
+ }
}
onRenameCancel = (e) => {
@@ -50,6 +64,25 @@ class RenameInput extends React.Component {
this.props.onRenameCancel();
}
+ validateInput = () => {
+ let newName = this.state.name.trim();
+ let isValid = true;
+ let errMessage = '';
+ if (!newName) {
+ isValid = false;
+ errMessage = gettext('Name is required.');
+ return { isValid, errMessage };
+ }
+
+ if (newName.indexOf('/') > -1) {
+ isValid = false;
+ errMessage = gettext('Name should not include ' + '\'/\'' + '.');
+ return { isValid, errMessage };
+ }
+
+ return { isValid, errMessage };
+ }
+
render() {
return (
@@ -67,6 +100,6 @@ class RenameInput extends React.Component {
}
}
-RenameInput.propTypes = propTypes;
+Rename.propTypes = propTypes;
-export default RenameInput;
+export default Rename;
diff --git a/frontend/src/components/wiki-list-view/wiki-list-item.js b/frontend/src/components/wiki-list-view/wiki-list-item.js
index d7c995f949..1306964a00 100644
--- a/frontend/src/components/wiki-list-view/wiki-list-item.js
+++ b/frontend/src/components/wiki-list-view/wiki-list-item.js
@@ -8,7 +8,7 @@ import WikiPermissionEditor from '../select-editor/wiki-permission-editor.js';
import Toast from '../toast';
import ModalPortal from '../modal-portal';
import WikiDeleteDialog from '../dialog/wiki-delete-dialog';
-import WikiRename from './wiki-rename';
+import Rename from '../rename';
const propTypes = {
wiki: PropTypes.object.isRequired,
@@ -100,22 +100,6 @@ class WikiListItem extends Component {
}
onRenameConfirm = (newName) => {
- let wiki = this.props.wiki;
-
- if (newName === wiki.name) {
- this.onRenameCancel();
- return false;
- }
- if (!newName) {
- let errMessage = gettext('Name is required.');
- Toast.error(errMessage);
- return false;
- }
- if (newName.indexOf('/') > -1) {
- let errMessage = gettext('Name should not include ' + '\'/\'' + '.');
- Toast.error(errMessage);
- return false;
- }
this.renameWiki(newName);
this.onRenameCancel();
}
@@ -163,7 +147,7 @@ class WikiListItem extends Component {
{this.state.isRenameing ?
- :
+ :
{wiki.name}
}
|
diff --git a/frontend/src/components/wiki-list-view/wiki-rename.js b/frontend/src/components/wiki-list-view/wiki-rename.js
deleted file mode 100644
index a657068a2d..0000000000
--- a/frontend/src/components/wiki-list-view/wiki-rename.js
+++ /dev/null
@@ -1,69 +0,0 @@
-import React from 'react';
-import PropTypes from 'prop-types';
-
-const propTypes = {
- wiki: PropTypes.object.isRequired,
- onRenameConfirm: PropTypes.func.isRequired,
- onRenameCancel: PropTypes.func.isRequired,
-};
-class WikiRename extends React.Component {
-
- constructor(props) {
- super(props);
- this.state = {
- name: props.wiki.name
- };
- }
-
- componentDidMount() {
- this.refs.renameInput.focus();
- this.refs.renameInput.setSelectionRange(0, -1);
- }
-
- onChange = (e) => {
- this.setState({name: e.target.value});
- }
-
- onClick = (e) => {
- e.stopPropagation();
- e.nativeEvent.stopImmediatePropagation();
- }
-
- onKeyPress = (e) => {
- if (e.key === 'Enter') {
- this.onRenameConfirm(e);
- }
- }
-
- onRenameConfirm = (e) => {
- e.stopPropagation();
- e.nativeEvent.stopImmediatePropagation();
- this.props.onRenameConfirm(this.state.name);
- }
-
- onRenameCancel = (e) => {
- e.stopPropagation();
- e.nativeEvent.stopImmediatePropagation();
- this.props.onRenameCancel();
- }
-
- render() {
- return (
-
-
-
-
-
- );
- }
-}
-
-WikiRename.propTypes = propTypes;
-
-export default WikiRename;
\ No newline at end of file
diff --git a/frontend/src/pages/my-libs/item.js b/frontend/src/pages/my-libs/item.js
index 625bee9057..c9f4783219 100644
--- a/frontend/src/pages/my-libs/item.js
+++ b/frontend/src/pages/my-libs/item.js
@@ -6,7 +6,7 @@ import { Dropdown, DropdownMenu, DropdownToggle, DropdownItem } from 'reactstrap
import { gettext, siteRoot, storages, folderPermEnabled, enableRepoSnapshotLabel } from '../../utils/constants';
import { Utils } from '../../utils/utils';
import { seafileAPI } from '../../utils/seafile-api';
-import RenameInput from '../../components/rename-input';
+import Rename from '../../components/rename';
import ModalPotal from '../../components/modal-portal';
import ShareDialog from '../../components/dialog/share-dialog';
@@ -232,7 +232,7 @@ class Item extends Component {
 |
{this.state.showChangeLibName && (
- |