// // Copyright (C) Stanislaw Adaszewski, 2020 // Contact: s.adaszewski@gmail.com // Website: https://adared.ch/wba // License: GNU Affero General Public License, Version 3 // import { h, Component, createRef } from 'preact'; import { route } from 'preact-router'; import WBNavbarCommon from 'wb-navbar-common'; import WBArvadosCrumbs from 'wb-arvados-crumbs'; import WBBrowseDialog from 'wb-browse-dialog'; import WBTable from 'wb-table'; import makeArvadosRequest from 'make-arvados-request'; import { wbDisableControls, wbEnableControls } from 'wb-disable-controls'; import linkState from 'linkstate'; import wbParseWorkflowDef from 'wb-parse-workflow-def'; import { wbParseWorkflowInputs, wbSubmitContainerRequest } from 'wb-submit-container-request'; import WBWorkflowInput from 'wb-workflow-input'; import { parseKeepRef } from 'wb-process-misc'; class WBLaunchWorkflowPage extends Component { constructor(...args) { super(...args); this.browseDialogRef = createRef(); this.state.inputs = {}; this.state.errors = []; this.state.placeInSubProject = true; } componentDidMount() { let { app, workflowUuid } = this.props; let { arvHost, arvToken } = app.state; let prom = makeArvadosRequest(arvHost, arvToken, '/arvados/v1/workflows/' + workflowUuid); prom = prom.then(xhr => { const def = wbParseWorkflowDef(xhr.response.definition); const inputs = {}; const main = def['$graph'].find(a => (a.id === '#main')); main.inputs.map(a => (inputs[a.id] = JSON.stringify(parseKeepRef(a.default)))); this.setState({ 'workflow': xhr.response, 'workflowDefinition': def, 'defaultProcessName': xhr.response.name + ' ' + (new Date().toISOString()), 'defaultProcessDescription': xhr.response.description, inputs }); }); } submit() { // first see if all inputs are parseable const { app, workflowUuid } = this.props; const { arvHost, arvToken, currentUser } = app.state; const { workflowDefinition, projectUuid, processName, processDescription, defaultProcessName, defaultProcessDescription, placeInSubProject } = this.state; const errors = []; const inputs = wbParseWorkflowInputs(workflowDefinition, this.state.inputs, errors); if (errors.length > 0) { this.setState({ errors }); return; } const params = { arvHost, arvToken, inputs, processName: processName || defaultProcessName, processDescription: processDescription || defaultProcessDescription, projectUuid: projectUuid || currentUser.uuid, workflowUuid, workflowDefinition, placeInSubProject } wbDisableControls(); let prom = wbSubmitContainerRequest(params); prom = prom.then(xhr => { wbEnableControls(); route('/process/' + xhr.response.uuid); }); prom = prom.catch(exc => { wbEnableControls(); this.setState({ errors: [ exc.message ] }); }); } render({ app, workflowUuid }, { workflow, workflowDefinition, projectUuid, processName, processDescription, defaultProcessName, defaultProcessDescription, errors, placeInSubProject }) { return (
{ workflow ? (

Launch Workflow

{ projectUuid ? ( ) : null }
(this.state.placeInSubProject = e.target.checked) } id="placeInSubProject" />
(a.id === '#main')).inputs.map(it => [ it.label || it.id, ( ) ]) } />
{ errors.length > 0 ? (
{ errors.map(err => ( ))}
) : null }
) :
Loading...
}
); } } export default WBLaunchWorkflowPage;