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