--- /dev/null
+/* Copyright (c) 2019 AT&T Intellectual Property. #\r
+# #\r
+# Licensed under the Apache License, Version 2.0 (the "License"); #\r
+# you may not use this file except in compliance with the License. #\r
+# You may obtain a copy of the License at #\r
+# #\r
+# http://www.apache.org/licenses/LICENSE-2.0 #\r
+# #\r
+# Unless required by applicable law or agreed to in writing, software #\r
+# distributed under the License is distributed on an "AS IS" BASIS, #\r
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. #\r
+# See the License for the specific language governing permissions and #\r
+# limitations under the License. #\r
+##############################################################################*/\r
+\r
+\r
+import Modeler from 'bpmn-js/lib/Modeler';\r
+import Viewer from 'bpmn-js/lib/NavigatedViewer';\r
+import { FileTransferService } from 'app/shared/services/file-transfer.service';\r
+import { Observable } from 'rxjs';\r
+import { TestDefinitionService } from 'app/shared/services/test-definition.service';\r
+\r
+import { saveAs } from 'file-saver';\r
+//import { parseString } from 'xml2js';\r
+import { HostListener } from '@angular/core';\r
+\r
+export interface BpmnOptions {\r
+ mode: 'viewer' | 'modeler',\r
+ options: {\r
+ container: any\r
+ }\r
+}\r
+\r
+export class Bpmn {\r
+\r
+ protected model: any;\r
+ protected bpmnXml: String;\r
+ private options: BpmnOptions;\r
+\r
+ constructor(bpmnXml: String, options: BpmnOptions) {\r
+ //check for required options\r
+ if (!options.mode) {\r
+ console.error('Bpmn options require: mode');\r
+ }\r
+\r
+ this.bpmnXml = bpmnXml;\r
+ this.options = options;\r
+\r
+ //setup model\r
+ this.setModel();\r
+\r
+ //render diagram\r
+ this.renderDiagram();\r
+ }\r
+\r
+ // Getters\r
+\r
+ public getModel() {\r
+ return this.model;\r
+ }\r
+\r
+ public async getBpmnXml() {\r
+ return new Promise((resolve, reject) => {\r
+ this.model.saveXML({ format: true }, function (err, xml) {\r
+ if(err){\r
+ reject(err);\r
+ }\r
+ resolve(xml);\r
+ })\r
+ });\r
+ }\r
+\r
+ // Setters\r
+\r
+ private setModel(options?) {\r
+\r
+ if (this.model) {\r
+ return -1;\r
+ }\r
+\r
+ let op = this.options.options;\r
+\r
+ if (options) {\r
+ op = options;\r
+ }\r
+\r
+ if (!op) {\r
+ console.error('Options for the viewer/modeler must be provided');\r
+ return -1;\r
+ }\r
+\r
+ //handle the mode (viewer or modeler)\r
+ switch (this.options.mode.toLowerCase()) {\r
+ case 'viewer':\r
+ this.model = new Viewer(op);\r
+ break;\r
+\r
+ case 'modeler':\r
+ this.model = new Modeler(op);\r
+ break;\r
+\r
+ default:\r
+ console.error('Mode must either be "viewer" or "modeler"');\r
+ return;\r
+ }\r
+\r
+ }\r
+\r
+ public async setBpmnXml(xml) {\r
+ this.bpmnXml = xml;\r
+ await this.renderDiagram();\r
+ }\r
+\r
+ // Methods\r
+\r
+ public async renderDiagram() {\r
+ return new Promise((resolve, reject) => {\r
+ if (this.bpmnXml) {\r
+ this.model.importXML(this.bpmnXml, (err) => {\r
+ if (!err) {\r
+ this.model.get('canvas').zoom('fit-viewport');\r
+ resolve(true)\r
+ } else {\r
+ console.error(err);\r
+ resolve(false);\r
+ }\r
+ });\r
+ }\r
+ })\r
+ }\r
+\r
+ public resize() {\r
+ this.model.get('canvas').zoom('fit-viewport');\r
+ }\r
+\r
+ public download(saveName?) {\r
+\r
+ this.model.saveXML({ format: true }, function (err, xml) {\r
+ if (!saveName) {\r
+ let parser = new DOMParser();\r
+ let xmlDoc = parser.parseFromString(xml.toString(), "text/xml");\r
+\r
+ let id = xmlDoc.getElementsByTagName("bpmn:process")[0].attributes.getNamedItem("id").value;\r
+ \r
+ if (id) {\r
+ saveName = id;\r
+ } else {\r
+ saveName = 'workflow';\r
+ }\r
+ }\r
+\r
+ saveName += ".bpmn";\r
+\r
+ let blob = new Blob([xml], { type: "application/xml" });\r
+ saveAs(blob, saveName);\r
+ })\r
+ }\r
+\r
+}
\ No newline at end of file