2 * Copyright © 2018 European Support Limited
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 *http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
16 import React, { Component } from 'react';
17 import fileSaver from 'file-saver';
18 import CustomModeler from './custom-modeler';
19 import propertiesPanelModule from 'bpmn-js-properties-panel';
20 import propertiesProviderModule from './custom-properties-provider/provider/camunda';
21 import camundaModuleDescriptor from './custom-properties-provider/descriptors/camunda';
22 import newDiagramXML from './newDiagram.bpmn';
23 import PropTypes from 'prop-types';
24 import CompositionButtons from './components/CompositionButtonsPanel';
25 import { setElementInputsOutputs } from './bpmnUtils.js';
26 import { I18n } from 'react-redux-i18n';
28 class CompositionView extends Component {
30 compositionUpdate: PropTypes.func,
31 showErrorModal: PropTypes.func,
32 composition: PropTypes.oneOfType([PropTypes.string, PropTypes.bool]),
33 name: PropTypes.oneOfType([PropTypes.string, PropTypes.bool]),
34 inputOutput: PropTypes.object,
35 activities: PropTypes.array
39 this.generatedId = 'bpmn-container' + Date.now();
40 this.fileInput = React.createRef();
41 this.selectedElement = false;
48 const { composition } = this.props;
50 this.modeler = new CustomModeler({
52 parent: '#js-properties-panel'
55 propertiesPanelModule,
56 propertiesProviderModule
59 camunda: camundaModuleDescriptor
62 activities: this.props.activities,
63 onChange: this.onActivityChanged
67 this.modeler.attachTo('#' + this.generatedId);
68 this.setDiagramToBPMN(composition ? composition : newDiagramXML);
69 this.modeler.on('element.out', () => this.exportDiagramToStore());
71 onActivityChanged = async (bo, selectedValue) => {
72 const selectedActivity = this.props.activities.find(
73 el => el.name === selectedValue
76 if (selectedActivity) {
77 const inputsOutputs = {
78 inputs: selectedActivity.inputs,
79 outputs: selectedActivity.outputs
81 setElementInputsOutputs(
84 this.modeler.get('moddle')
89 setDiagramToBPMN = diagram => {
90 let modeler = this.modeler;
91 this.modeler.importXML(diagram, err => {
93 return this.props.showErrorModal(
94 I18n.t('workflow.composition.importErrorMsg')
97 let canvas = modeler.get('canvas');
98 canvas.zoom('fit-viewport');
99 setElementInputsOutputs(
100 canvas._rootElement.businessObject,
101 this.props.inputOutput,
102 this.modeler.get('moddle')
107 exportDiagramToStore = () => {
108 this.modeler.saveXML({ format: true }, (err, xml) => {
110 return this.props.showErrorModal(
111 I18n.t('workflow.composition.saveErrorMsg')
114 return this.props.compositionUpdate(xml);
118 exportDiagram = () => {
119 const { name, showErrorModal } = this.props;
120 this.modeler.saveXML({ format: true }, (err, xml) => {
122 return showErrorModal(
123 I18n.t('workflow.composition.exportErrorMsg')
126 const blob = new Blob([xml], { type: 'text/html;charset=utf-8' });
127 fileSaver.saveAs(blob, `${name}-diagram.bpmn`);
131 loadNewDiagram = () => {
132 this.setDiagramToBPMN(newDiagramXML);
135 uploadDiagram = () => {
136 this.fileInput.current.click();
139 handleFileInputChange = filesList => {
140 const file = filesList[0];
141 const reader = new FileReader();
142 reader.onloadend = event => {
143 var xml = event.target.result;
144 this.setDiagramToBPMN(xml);
145 this.fileInput.value = '';
147 reader.readAsText(file);
152 <div className="composition-view content">
155 onChange={e => this.handleFileInputChange(e.target.files)}
160 style={{ display: 'none' }}
164 this.exportDiagramToStore();
166 className="bpmn-container"
167 id={this.generatedId}
169 <div className="bpmn-sidebar">
171 className="properties-panel"
172 id="js-properties-panel"
175 onClean={this.loadNewDiagram}
176 onDownload={this.exportDiagram}
177 onUpload={this.uploadDiagram}
185 export default CompositionView;