labo-components
Version:
134 lines (116 loc) • 3.89 kB
JSX
import React from 'react';
import PropTypes from 'prop-types';
import Project from '../../../model/Project';
import IDUtil from '../../../util/IDUtil';
import ProjectList from "./ProjectList";
export default class ProjectMigrationForm extends React.Component {
constructor(props) {
super(props);
this.state = {
selectedProject : null,
options : this.props.projectDataTypes,
selectedOptions : [],
selectedAction : 'move',
validationError : false
}
}
selectProject = project => {
this.setState({selectedProject : project});
};
onSelectProjectData = e => {
const options = this.state.options;
const selectedOptions = this.state.selectedOptions;
if(options.includes(e.target.value)) {
options.splice(options.indexOf(e.target.value), 1);
selectedOptions.unshift(e.target.value);
} else {
options.unshift(e.target.value);
selectedOptions.splice(selectedOptions.indexOf(e.target.value), 1);
}
this.setState({ options : options, selectedOptions : selectedOptions })
};
setAction = e => {
this.setState({selectedAction : e.target.value});
};
processProjectData = (action, user, sourceProject, targetProject, selectedOptions) => {
if(!targetProject || selectedOptions.length === 0) {
this.setState({validationError : true});
} else {
this.props.onMigrate(action, user, sourceProject, targetProject, selectedOptions);
}
};
/* -------------------- rendering functions -------------------- */
renderValidationFailed = action => {
return (
<div className="validation-error">
Please select a project and at least one piece of project data to <strong>{action}</strong>
</div>
);
};
renderItem = (item, index, selected) => (
<option
key={index}
className={selected ? 'right' : 'left'}
onClick={this.onSelectProjectData}
value={item}>
{item}
</option>
);
renderSelector = (options, selected) => {
return (
<div className="multi-select">
<select multiple>
{options.map((item, index) => this.renderItem(item, index, false))}
</select>
<select multiple>
{selected.map((item, index) => this.renderItem(item, index, true))}
</select>
</div>
);
};
render() {
return (
<div className={IDUtil.cssClassName('project-migration-form')}>
<div className="project-actions">
You are about to
<select onChange={this.setAction}>
<option value="move">Move</option>
<option value="copy">Copy</option>
</select>
your project data from project: <strong>{this.props.project.name}</strong> to project:
<ProjectList
buttonText="Select target project"
activeProject={this.state.selectedProject}
onSelect={this.selectProject}
projects={this.props.userProjects}
user={this.props.user}
projectIcon={false}
/>
</div>
<br/>
Select the project data you'd like to <strong>{this.state.selectedAction}</strong>
{this.renderSelector(this.state.options, this.state.selectedOptions)}
{this.state.validationError && this.renderValidationFailed()}
<button className="btn btn-primary" onClick={() => this.processProjectData(
this.state.selectedAction,
this.props.user,
this.props.project,
this.state.selectedProject,
this.state.selectedOptions
)}>
{this.state.selectedAction}
</button>
</div>
)
}
}
ProjectMigrationForm.propTypes = {
project : Project.getPropTypes(true),
projectDataTypes : PropTypes.array.isRequired,
userProjects : PropTypes.array.isRequired,
user : PropTypes.shape({
id : PropTypes.number.isRequired,
name : PropTypes.string
}).isRequired,
onMigrate : PropTypes.func.isRequired
}