Hi,
I create custom meta model:
{
"name": "ext",
"uri": "http://some-company/schema/bpmn/qa",
"prefix": "au",
"xml": {
"tagAlias": "lowerCase"
},
"types": [
{
"name": "NewTask",
"extends": ["bpmn:Task"],
"properties": [
{
"name": "task-description",
"isAttr": true,
"type": "String"
},
{
"name": "arr",
"isMany": true,
"type": "String"
},
{
"name": "obj",
"type": "TaskExt"
}
]
},
{
"name": "TaskExt",
"superClass": [ "Element" ],
"properties": [
{
"name": "str",
"type": "String"
},
{
"name": "num",
"isAttr": true,
"type": "Integer"
},
{
"name": "arr",
"isMany": true,
"type": "String"
}
]
}
],
"emumerations": [],
"associations": []
}
And successfully (I guess) save it to Task element and export to xml.
Save method:
function updateTask(element) {
function getExtensionElement(element, type) {
if (!element.extensionElements) {
return;
}
return element.extensionElements.values.filter((extensionElement) => {
return extensionElement.$instanceOf(type);
})[0];
}
const businessObject = getBusinessObject(element);
const extensionElements = businessObject.extensionElements || modeler.get("moddle").create('bpmn:ExtensionElements');
let obj = getExtensionElement(businessObject, "au:TaskExt")
if (!obj) {
obj = modeler.get("moddle").create("au:TaskExt");
extensionElements.get("values").push(obj)
}
obj.str = "test"
obj.num = 2,
obj.arr = ["test1","test2"]
modeler.get("modeling").updateModdleProperties(element,getBusinessObject(element), {
name: "New task",
"task-description": "description",
arr: ["1","2","3"],
extensionElements,
});
}
and result xml:
...
<bpmn2:task id="Activity_1a76hwu" name="New task" au:task-description="testest">
<bpmn2:extensionElements>
<au:taskExt num="2">
<au:str>test</au:str>
<au:arr>test1</au:arr>
<au:arr>test2</au:arr>
</au:taskExt>
</bpmn2:extensionElements>
<bpmn2:incoming>Flow_0ho1ls1</bpmn2:incoming>
<bpmn2:outgoing>Flow_0j8ypqx</bpmn2:outgoing>
<au:arr>1</au:arr>
<au:arr>2</au:arr>
<au:arr>3</au:arr>
</bpmn2:task>
...
ModdleElement (businessObject):
And finally, my question is there a simpler way to read/write elements models? Like for example:
...
modeler.get("modeling").updateModel(element, {
name: "New task",
"task-description": "description",
arr: ["1", "2", "3"],
obj: {
str: "test",
num: 2,
arr: ["test1", "test2"]
}
});
...
const NewTask = modeler.get("moddle").getModel(element)
// Result:
// {
// name: "New task",
// "task-description": "description",
// arr: ["1", "2", "3"],
// obj: {
// str: "test",
// num: 2,
// arr: ["test1", "test2"]
// }
// }