Skip to content

Commit

Permalink
feat(drd): add Modeling#updateModdleProperties
Browse files Browse the repository at this point in the history
  • Loading branch information
philippfromme committed Jul 11, 2024
1 parent ff60a72 commit 4613132
Show file tree
Hide file tree
Showing 4 changed files with 148 additions and 0 deletions.
10 changes: 10 additions & 0 deletions packages/dmn-js-drd/src/features/modeling/Modeling.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import BaseModeling from 'diagram-js/lib/features/modeling/Modeling';
import IdClaimHandler from './cmd/IdClaimHandler.js';
import UpdateLabelHandler from '../label-editing/cmd/UpdateLabelHandler.js';
import UpdatePropertiesHandler from './cmd/UpdatePropertiesHandler.js';
import UpdateModdlePropertiesHandler from './cmd/UpdateModdlePropertiesHandler.js';


/**
Expand Down Expand Up @@ -60,6 +61,7 @@ Modeling.prototype.getHandlers = function() {
handlers['id.updateClaim'] = IdClaimHandler;
handlers['element.updateLabel'] = UpdateLabelHandler;
handlers['element.updateProperties'] = UpdatePropertiesHandler;
handlers['element.updateModdleProperties'] = UpdateModdlePropertiesHandler;

return handlers;
};
Expand All @@ -71,6 +73,14 @@ Modeling.prototype.unclaimId = function(id, moddleElement) {
});
};

Modeling.prototype.updateModdleProperties = function(element, moddleElement, properties) {
this._commandStack.execute('element.updateModdleProperties', {
element: element,
moddleElement: moddleElement,
properties: properties
});
};

Modeling.prototype.updateProperties = function(element, properties) {
this._commandStack.execute('element.updateProperties', {
element: element,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
import {
reduce,
keys,
forEach
} from 'min-dash';

export default function UpdateModdlePropertiesHandler(elementRegistry) {
this._elementRegistry = elementRegistry;
}

UpdateModdlePropertiesHandler.$inject = [ 'elementRegistry' ];

UpdateModdlePropertiesHandler.prototype.execute = function(context) {

var element = context.element,
moddleElement = context.moddleElement,
properties = context.properties;

if (!moddleElement) {
throw new Error('<moddleElement> required');
}

// TODO(nikku): we need to ensure that ID properties
// are properly registered / unregistered via
// this._moddle.ids.assigned(id)
var changed = context.changed || [ element ];
var oldProperties = context.oldProperties
|| getModdleProperties(moddleElement, keys(properties));

setModdleProperties(moddleElement, properties);

context.oldProperties = oldProperties;
context.changed = changed;

return changed;
};

UpdateModdlePropertiesHandler.prototype.revert = function(context) {
var oldProperties = context.oldProperties,
moddleElement = context.moddleElement,
changed = context.changed;

setModdleProperties(moddleElement, oldProperties);

return changed;
};


// helpers /////////////////

function getModdleProperties(moddleElement, propertyNames) {
return reduce(propertyNames, function(result, key) {
result[key] = moddleElement.get(key);
return result;
}, {});
}

function setModdleProperties(moddleElement, properties) {
forEach(properties, function(value, key) {
moddleElement.set(key, value);
});
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="https://www.omg.org/spec/DMN/20191111/MODEL/" xmlns:dmndi="https://www.omg.org/spec/DMN/20191111/DMNDI/" xmlns:dc="http://www.omg.org/spec/DMN/20180521/DC/" xmlns:modeler="http://camunda.org/schema/modeler/1.0" id="Definitions_1" name="DRD" namespace="http://camunda.org/schema/1.0/dmn" exporter="Camunda Modeler" exporterVersion="5.23.0" modeler:executionPlatform="Camunda Cloud" modeler:executionPlatformVersion="8.5.0">
<decision id="Decision_1" name="Decision 1">
<decisionTable id="DecisionTable_075f9cc">
<input id="Input_1">
<inputExpression id="InputExpression_1" typeRef="string">
<text></text>
</inputExpression>
</input>
<output id="Output_1" typeRef="string" />
</decisionTable>
</decision>
<dmndi:DMNDI>
<dmndi:DMNDiagram>
<dmndi:DMNShape dmnElementRef="Decision_1">
<dc:Bounds height="80" width="180" x="160" y="100" />
</dmndi:DMNShape>
</dmndi:DMNDiagram>
</dmndi:DMNDI>
</definitions>
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
/* global sinon */

import { getBusinessObject } from 'dmn-js-shared/lib/util/ModelUtil';

import {
bootstrapModeler,
inject
} from 'test/TestHelper';

import modelingModule from 'src/features/modeling';
import coreModule from 'src/core';

var testModules = [ coreModule, modelingModule ];


describe('features/modeling - update moddle properties', function() {

describe('updating dmn:Decision', function() {

var diagramXML = require('./UpdateModdleProperties.dmn');

beforeEach(bootstrapModeler(diagramXML, { modules: testModules }));


it('should update', inject(function(elementRegistry, modeling, eventBus) {

// given
var decision = elementRegistry.get('Decision_1'),
businessObject = getBusinessObject(decision);

var changedElements;

var elementsChangedListener = sinon.spy(function(event) {
changedElements = event.elements;
});

eventBus.on('elements.changed', elementsChangedListener);

// assume
expect(businessObject.get('name')).to.eql('Decision 1');

// when
modeling.updateModdleProperties(decision, businessObject, { name: 'Decision 2' });

// then
expect(businessObject.get('name')).to.eql('Decision 2');

// changed affected elements
expect(changedElements).to.eql([
decision
]);
}));

});

});

0 comments on commit 4613132

Please sign in to comment.