UNPKG

labo-components

Version:
134 lines (116 loc) 3.89 kB
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>&nbsp;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&apos;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 }