frontend/app/multistep/ProjectTemplateMultistep.jsx (139 lines of code) (raw):

import Multistep from "react-multistep"; import React from "react"; import axios from "axios"; import TypeSelectorComponent from "./projecttemplate/TypeSelectorComponent.jsx"; import TemplateUploadComponent from "./projecttemplate/TemplateUploadComponent.jsx"; import TemplateCompletionComponent from "./projecttemplate/CompletionComponent.jsx"; import CommonMultistepComponent from "./common/CommonMultistepComponent.jsx"; class ProjectTemplateMultistep extends CommonMultistepComponent { constructor(props) { super(props); this.state = { template: null, projectTypes: [], plutoProjectTypesList: [], selectedType: null, selectedPlutoSubtype: "", currentEntry: null, error: null, fileId: null, name: "", storages: [], deprecated: false, loadingComplete: false, }; } componentDidMount() { if ( this.props.match && this.props.match.params && this.props.match.params.itemid && this.props.match.params.itemid !== "new" ) { this.setState({ currentEntry: this.props.match.params.itemid }, () => this.loadTemplateData() ); } else { this.loadTemplateData(); } } loadTemplateData() { let promiseList = [ axios.get("/api/projecttype"), axios.get("/api/storage"), axios.get("/api/plutoprojecttypeid"), ]; if (this.state.currentEntry) promiseList.push(axios.get("/api/template/" + this.state.currentEntry)); Promise.all(promiseList) .then((responses) => { const projectTypeResponse = responses[0]; const storageResponse = responses[1]; const plutoTypeResponse = responses[2]; const firstType = projectTypeResponse.data.result[0] ? projectTypeResponse.data.result[0].id : null; const baseData = { projectTypes: projectTypeResponse.data.result, selectedType: firstType, storages: storageResponse.data.result, plutoProjectTypesList: plutoTypeResponse.data.result, loadingComplete: true, }; if (this.state.currentEntry) { const loadedEntry = responses[3].data; const currentEntryData = { selectedType: loadedEntry.result.projectTypeId, fileId: loadedEntry.result.fileRef, selectedFileId: loadedEntry.result.fileRef, name: loadedEntry.result.name, deprecated: loadedEntry.result.deprecated, selectedPlutoSubtype: loadedEntry.result.hasOwnProperty( "plutoSubtype" ) ? loadedEntry.result.plutoSubtype : "", loadingComplete: true, }; this.setState(Object.assign({}, baseData, currentEntryData)); } else { this.setState(baseData); } }) .catch((error) => { console.error(error); this.setState({ error: error }); }); } render() { const steps = [ { name: "Project Type", component: ( <TypeSelectorComponent projectTypes={this.state.projectTypes} selectedType={this.state.selectedType} templateName={this.state.name} plutoTypesList={this.state.plutoProjectTypesList} selectedPlutoSubtype={this.state.selectedPlutoSubtype} deprecated={this.state.deprecated} loadingComplete={this.state.loadingComplete} valueWasSet={(nameAndType) => this.setState({ selectedType: nameAndType.selectedType, name: nameAndType.name, selectedPlutoSubtype: nameAndType.selectedPlutoSubtype, deprecated: nameAndType.deprecated, }) } /> ), }, { name: "Upload template", component: ( <TemplateUploadComponent storages={this.state.storages} existingFileId={this.state.fileId} valueWasSet={(fileId) => this.setState({ selectedFileId: fileId })} /> ), }, { name: "Confirm", component: ( <TemplateCompletionComponent currentEntry={this.state.currentEntry} fileId={this.state.selectedFileId} name={this.state.name} projectType={this.state.selectedType} plutoSubtype={this.state.selectedPlutoSubtype} deprecated={this.state.deprecated} /> ), }, ]; return <Multistep showNavigation={true} steps={steps} />; } } export default ProjectTemplateMultistep;