Skip to content

Commit

Permalink
feat: allows async form providers
Browse files Browse the repository at this point in the history
  • Loading branch information
marstamm committed Nov 21, 2023
1 parent cd0a6df commit 99b61c4
Show file tree
Hide file tree
Showing 2 changed files with 72 additions and 3 deletions.
4 changes: 2 additions & 2 deletions lib/variableProvider/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,13 +11,13 @@ class FormVariableProvider extends VariableProvider {
this._eventBus = eventBus;
}

getVariables(element) {
async getVariables(element) {

/**
* Use the eventBus to collect form schemas. We currently only support locally defined forms,
* but plan to have linked forms on a project level soon.
*/
const formSchema = this._eventBus.fire('formVariableProvider.getFormSchema', { element });
const formSchema = await (this._eventBus.fire('formVariableProvider.getFormSchema', { element }));

if (!formSchema) {
return;
Expand Down
71 changes: 70 additions & 1 deletion test/spec/Integration.spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import FormVariableProvider from 'lib/';

import placeholderXML from '../fixtures/placeholder.bpmn';
import startFormXML from '../fixtures/start-form.bpmn';

import sinon from 'sinon';


describe('<Form Extractor>', function() {
Expand Down Expand Up @@ -209,4 +209,73 @@ describe('<Form Extractor>', function() {

});


describe('additional extractors', async function() {

it('should allow async extractors', async function() {

// given
let clock = sinon.useFakeTimers();

const form = `{
"components": [
{
"label": "Number",
"type": "number",
"layout": {
"row": "Row_0tsd0f1",
"columns": null
},
"id": "Field_164bcb2",
"key": "Number_1"
},
{
"label": "Text field",
"type": "textfield",
"layout": {
"row": "Row_1l0lwcs",
"columns": null
},
"id": "Field_1b97d86",
"key": "Text_1"
}
],
"type": "default",
"id": "Form_0",
"schemaVersion": 10
}`;

await createModelerWithForm('');
const modeler = getBpmnJS();

const eventBus = modeler.get('eventBus');
const elementRegistry = modeler.get('elementRegistry');
const variableResolver = modeler.get('variableResolver');

const task = elementRegistry.get('Task_1');

const MockProvider = ({ element }) => {
if (element.id === task.id) {
return new Promise(resolve => setTimeout(resolve(form), 100));
}
};

eventBus.on('formVariableProvider.getFormSchema', MockProvider);

// when
const variables = await variableResolver.getVariablesForElement(task);
await clock.tick(1000);

// then
expect(variables).to.variableEqual([
{ name: 'Number_1', info: 'Returned from Form in Form Task' },
{ name: 'Text_1', info: 'Returned from Form in Form Task' }
]);

clock.restore();

});

});

});

0 comments on commit 99b61c4

Please sign in to comment.