diff --git a/frontend/package-lock.json b/frontend/package-lock.json index a440a87c2a..94f03cd61a 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -180,7 +180,7 @@ "dependencies": { "reactstrap": { "version": "5.0.0", - "resolved": "http://registry.npmjs.org/reactstrap/-/reactstrap-5.0.0.tgz", + "resolved": "https://registry.npmjs.org/reactstrap/-/reactstrap-5.0.0.tgz", "integrity": "sha512-y0eju/LAK7gbEaTFfq2iW92MF7/5Qh0tc1LgYr2mg92IX8NodGc03a+I+cp7bJ0VXHAiLy0bFL9UP89oSm4cBg==", "requires": { "classnames": "^2.2.3", diff --git a/frontend/src/components/rename-input.js b/frontend/src/components/rename-input.js new file mode 100644 index 0000000000..7eb4e3aa8d --- /dev/null +++ b/frontend/src/components/rename-input.js @@ -0,0 +1,72 @@ +import React from 'react'; +import PropTypes from 'prop-types'; + +const propTypes = { + type: PropTypes.string, + name: PropTypes.string.isRequired, + onRenameConfirm: PropTypes.func.isRequired, + onRenameCancel: PropTypes.func.isRequired, +}; +class RenameInput extends React.Component { + + constructor(props) { + super(props); + this.state = { + name: props.name + }; + } + + componentDidMount() { + this.refs.renameInput.focus(); + if (this.props.type === 'file') { + var endIndex = this.props.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 ( +