Converts DMN files to 1.3

This commit is contained in:
Aaron Louie 2021-08-13 16:23:34 -04:00
parent 442b3e847a
commit 97e020ea9a
4 changed files with 80 additions and 3 deletions

63
package-lock.json generated
View File

@ -18,6 +18,7 @@
"@angular/platform-browser": "^12.2.0", "@angular/platform-browser": "^12.2.0",
"@angular/platform-browser-dynamic": "^12.2.0", "@angular/platform-browser-dynamic": "^12.2.0",
"@angular/router": "^12.2.0", "@angular/router": "^12.2.0",
"@bpmn-io/dmn-migrate": "^0.4.3",
"@ngx-formly/core": "^5.10.22", "@ngx-formly/core": "^5.10.22",
"@ngx-formly/material": "^5.10.22", "@ngx-formly/material": "^5.10.22",
"@sentry/browser": "^5.30.0", "@sentry/browser": "^5.30.0",
@ -2610,6 +2611,36 @@
"node": ">=6.9.0" "node": ">=6.9.0"
} }
}, },
"node_modules/@bpmn-io/dmn-migrate": {
"version": "0.4.3",
"resolved": "https://registry.npmjs.org/@bpmn-io/dmn-migrate/-/dmn-migrate-0.4.3.tgz",
"integrity": "sha512-l4VOUoqGV9Me13EFDJZVOmw+lM0+gKaafzhXpK2z6gcqiwJhsBQ4J4AFHkJmCeZqpZaOUQLAG2klieIJVG5q6w==",
"dependencies": {
"dmn-moddle": "^8.0.0",
"ids": "^1.0.0",
"min-dash": "^3.5.2"
}
},
"node_modules/@bpmn-io/dmn-migrate/node_modules/dmn-moddle": {
"version": "8.0.4",
"resolved": "https://registry.npmjs.org/dmn-moddle/-/dmn-moddle-8.0.4.tgz",
"integrity": "sha512-7pVmt6Jr44cEleQeaitYx1InSEgU993LBbskEug/UUwfoR72ZdszHiSwfDIP5hUnc+dJylIgMbz10MXbQSld7g==",
"dependencies": {
"min-dash": "^3.0.0",
"moddle": "^5.0.1",
"moddle-xml": "^8.0.1"
}
},
"node_modules/@bpmn-io/dmn-migrate/node_modules/moddle-xml": {
"version": "8.0.8",
"resolved": "https://registry.npmjs.org/moddle-xml/-/moddle-xml-8.0.8.tgz",
"integrity": "sha512-JzW8wUCH7Qze7eh0T8A1exi7QJg6hRgq+uw8goHNP5Q7pWTGrLj83S+NgA/94M2I0JmqnK9hw3sCbyiKVOjc4Q==",
"dependencies": {
"min-dash": "^3.0.0",
"moddle": "^5.0.1",
"saxen": "^8.1.2"
}
},
"node_modules/@bpmn-io/element-templates-validator": { "node_modules/@bpmn-io/element-templates-validator": {
"version": "0.2.0", "version": "0.2.0",
"resolved": "https://registry.npmjs.org/@bpmn-io/element-templates-validator/-/element-templates-validator-0.2.0.tgz", "resolved": "https://registry.npmjs.org/@bpmn-io/element-templates-validator/-/element-templates-validator-0.2.0.tgz",
@ -23097,6 +23128,38 @@
"to-fast-properties": "^2.0.0" "to-fast-properties": "^2.0.0"
} }
}, },
"@bpmn-io/dmn-migrate": {
"version": "0.4.3",
"resolved": "https://registry.npmjs.org/@bpmn-io/dmn-migrate/-/dmn-migrate-0.4.3.tgz",
"integrity": "sha512-l4VOUoqGV9Me13EFDJZVOmw+lM0+gKaafzhXpK2z6gcqiwJhsBQ4J4AFHkJmCeZqpZaOUQLAG2klieIJVG5q6w==",
"requires": {
"dmn-moddle": "^8.0.0",
"ids": "^1.0.0",
"min-dash": "^3.5.2"
},
"dependencies": {
"dmn-moddle": {
"version": "8.0.4",
"resolved": "https://registry.npmjs.org/dmn-moddle/-/dmn-moddle-8.0.4.tgz",
"integrity": "sha512-7pVmt6Jr44cEleQeaitYx1InSEgU993LBbskEug/UUwfoR72ZdszHiSwfDIP5hUnc+dJylIgMbz10MXbQSld7g==",
"requires": {
"min-dash": "^3.0.0",
"moddle": "^5.0.1",
"moddle-xml": "^8.0.1"
}
},
"moddle-xml": {
"version": "8.0.8",
"resolved": "https://registry.npmjs.org/moddle-xml/-/moddle-xml-8.0.8.tgz",
"integrity": "sha512-JzW8wUCH7Qze7eh0T8A1exi7QJg6hRgq+uw8goHNP5Q7pWTGrLj83S+NgA/94M2I0JmqnK9hw3sCbyiKVOjc4Q==",
"requires": {
"min-dash": "^3.0.0",
"moddle": "^5.0.1",
"saxen": "^8.1.2"
}
}
}
},
"@bpmn-io/element-templates-validator": { "@bpmn-io/element-templates-validator": {
"version": "0.2.0", "version": "0.2.0",
"resolved": "https://registry.npmjs.org/@bpmn-io/element-templates-validator/-/element-templates-validator-0.2.0.tgz", "resolved": "https://registry.npmjs.org/@bpmn-io/element-templates-validator/-/element-templates-validator-0.2.0.tgz",

View File

@ -36,6 +36,7 @@
"@angular/platform-browser": "^12.2.0", "@angular/platform-browser": "^12.2.0",
"@angular/platform-browser-dynamic": "^12.2.0", "@angular/platform-browser-dynamic": "^12.2.0",
"@angular/router": "^12.2.0", "@angular/router": "^12.2.0",
"@bpmn-io/dmn-migrate": "^0.4.3",
"@ngx-formly/core": "^5.10.22", "@ngx-formly/core": "^5.10.22",
"@ngx-formly/material": "^5.10.22", "@ngx-formly/material": "^5.10.22",
"@sentry/browser": "^5.30.0", "@sentry/browser": "^5.30.0",

View File

@ -1,3 +1,5 @@
import { FileType } from 'sartography-workflow-lib'; import { FileType } from 'sartography-workflow-lib';
export const getDiagramTypeFromXml = (xml: string): FileType => (xml && xml.includes('dmndi:DMNDiagram') ? FileType.DMN : FileType.BPMN); export const getDiagramTypeFromXml = (xml: string): FileType => {
return (xml && /dmn\.xsd|dmndi:DMNDiagram/.test(xml) ? FileType.DMN : FileType.BPMN);
};

View File

@ -29,6 +29,7 @@ import { bpmnModelerConfig } from './bpmn-modeler-config';
import { dmnModelerConfig } from './dmn-modeler-config'; import { dmnModelerConfig } from './dmn-modeler-config';
import { getDiagramTypeFromXml } from '../_util/diagram-type'; import { getDiagramTypeFromXml } from '../_util/diagram-type';
import isEqual from 'lodash.isequal'; import isEqual from 'lodash.isequal';
import { migrateDiagram } from '@bpmn-io/dmn-migrate';
@Component({ @Component({
selector: 'app-diagram', selector: 'app-diagram',
@ -138,11 +139,15 @@ export class DiagramComponent implements ControlValueAccessor, AfterViewInit, On
} }
openDiagram(xml?: string, diagramType?: FileType) { openDiagram(xml?: string, diagramType?: FileType) {
console.log('openDiagram > diagramType', diagramType);
this.diagramType = diagramType || getDiagramTypeFromXml(xml); this.diagramType = diagramType || getDiagramTypeFromXml(xml);
console.log('openDiagram > this.diagramType', this.diagramType);
this.xml = xml; this.xml = xml;
const modeler = this.initializeModeler(diagramType); const modeler = this.initializeModeler(diagramType);
return this.zone.run(() => { return this.zone.run(async () => {
const isDMN = diagramType === FileType.DMN; const isDMN = diagramType === FileType.DMN;
if (!xml) { if (!xml) {
@ -154,7 +159,9 @@ export class DiagramComponent implements ControlValueAccessor, AfterViewInit, On
// Add an arbitrary string to get the save button to enable // Add an arbitrary string to get the save button to enable
if (isDMN) { if (isDMN) {
// DMN Modeler takes a callback // DMN Modeler takes a callback
this.modeler.importXML(xml, (e, w) => this.onImport(e, w || e && e.warnings)); // Convert any v1.1 or 1.2 DMN files to v1.3
const convertedXML = await this.convertDMN(xml);
this.modeler.importXML(convertedXML, (e, w) => this.onImport(e, w || e && e.warnings));
} else { } else {
// BPMN Modeler returns a Promise // BPMN Modeler returns a Promise
this.modeler.importXML(xml).then( this.modeler.importXML(xml).then(
@ -376,4 +383,8 @@ export class DiagramComponent implements ControlValueAccessor, AfterViewInit, On
return `${this.fileName}_${dateString}.${this.diagramType}`; return `${this.fileName}_${dateString}.${this.diagramType}`;
} }
} }
private async convertDMN(xml: string) {
return await migrateDiagram(xml);
}
} }