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 { {data.icon_title} {this.state.showChangeLibName && ( -