From 97e020ea9abbb245d66842995e3f5e3737fab15d Mon Sep 17 00:00:00 2001 From: Aaron Louie Date: Fri, 13 Aug 2021 16:23:34 -0400 Subject: [PATCH] Converts DMN files to 1.3 --- package-lock.json | 63 ++++++++++++++++++++++++++++ package.json | 1 + src/app/_util/diagram-type.ts | 4 +- src/app/diagram/diagram.component.ts | 15 ++++++- 4 files changed, 80 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 38a4de2..e3c002c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,6 +18,7 @@ "@angular/platform-browser": "^12.2.0", "@angular/platform-browser-dynamic": "^12.2.0", "@angular/router": "^12.2.0", + "@bpmn-io/dmn-migrate": "^0.4.3", "@ngx-formly/core": "^5.10.22", "@ngx-formly/material": "^5.10.22", "@sentry/browser": "^5.30.0", @@ -2610,6 +2611,36 @@ "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": { "version": "0.2.0", "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" } }, + "@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": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/@bpmn-io/element-templates-validator/-/element-templates-validator-0.2.0.tgz", diff --git a/package.json b/package.json index c18f40d..c9979b0 100644 --- a/package.json +++ b/package.json @@ -36,6 +36,7 @@ "@angular/platform-browser": "^12.2.0", "@angular/platform-browser-dynamic": "^12.2.0", "@angular/router": "^12.2.0", + "@bpmn-io/dmn-migrate": "^0.4.3", "@ngx-formly/core": "^5.10.22", "@ngx-formly/material": "^5.10.22", "@sentry/browser": "^5.30.0", diff --git a/src/app/_util/diagram-type.ts b/src/app/_util/diagram-type.ts index 764a46b..ae4c6ca 100644 --- a/src/app/_util/diagram-type.ts +++ b/src/app/_util/diagram-type.ts @@ -1,3 +1,5 @@ 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); +}; diff --git a/src/app/diagram/diagram.component.ts b/src/app/diagram/diagram.component.ts index 481eb77..25f9c94 100644 --- a/src/app/diagram/diagram.component.ts +++ b/src/app/diagram/diagram.component.ts @@ -29,6 +29,7 @@ import { bpmnModelerConfig } from './bpmn-modeler-config'; import { dmnModelerConfig } from './dmn-modeler-config'; import { getDiagramTypeFromXml } from '../_util/diagram-type'; import isEqual from 'lodash.isequal'; +import { migrateDiagram } from '@bpmn-io/dmn-migrate'; @Component({ selector: 'app-diagram', @@ -138,11 +139,15 @@ export class DiagramComponent implements ControlValueAccessor, AfterViewInit, On } openDiagram(xml?: string, diagramType?: FileType) { + console.log('openDiagram > diagramType', diagramType); this.diagramType = diagramType || getDiagramTypeFromXml(xml); + + console.log('openDiagram > this.diagramType', this.diagramType); + this.xml = xml; const modeler = this.initializeModeler(diagramType); - return this.zone.run(() => { + return this.zone.run(async () => { const isDMN = diagramType === FileType.DMN; if (!xml) { @@ -154,7 +159,9 @@ export class DiagramComponent implements ControlValueAccessor, AfterViewInit, On // Add an arbitrary string to get the save button to enable if (isDMN) { // 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 { // BPMN Modeler returns a Promise this.modeler.importXML(xml).then( @@ -376,4 +383,8 @@ export class DiagramComponent implements ControlValueAccessor, AfterViewInit, On return `${this.fileName}_${dateString}.${this.diagramType}`; } } + + private async convertDMN(xml: string) { + return await migrateDiagram(xml); + } }