spiff-arena/bpmn-js-spiffworkflow/app/spiffworkflow/extensions/propertiesPanel/ExtensionsPropertiesProvide...

297 lines
8.1 KiB
JavaScript

import { ListGroup } from '@bpmn-io/properties-panel';
import { is, isAny } from 'bpmn-js/lib/util/ModelUtil';
import scriptGroup, { SCRIPT_TYPE } from './SpiffScriptGroup';
import {
ServiceTaskParameterArray,
ServiceTaskOperatorSelect, ServiceTaskResultTextInput,
} from './SpiffExtensionServiceProperties';
import {OPTION_TYPE, SpiffExtensionSelect} from './SpiffExtensionSelect';
import {SpiffExtensionLaunchButton} from './SpiffExtensionLaunchButton';
import {SpiffExtensionTextArea} from './SpiffExtensionTextArea';
const LOW_PRIORITY = 500;
export default function ExtensionsPropertiesProvider(
propertiesPanel,
translate,
moddle,
commandStack,
elementRegistry,
) {
this.getGroups = function (element) {
return function (groups) {
if (is(element, 'bpmn:ScriptTask')) {
groups.push(
createScriptGroup(element, translate, moddle, commandStack)
);
} else if (
isAny(element, ['bpmn:Task', 'bpmn:CallActivity', 'bpmn:SubProcess'])
) {
groups.push(preScriptPostScriptGroup(element, translate, moddle, commandStack));
}
if (is(element, 'bpmn:UserTask')) {
groups.push(createUserGroup(element, translate, moddle, commandStack));
}
if (is(element, 'bpmn:BusinessRuleTask')) {
groups.push(
createBusinessRuleGroup(element, translate, moddle, commandStack)
);
}
if (isAny(element, ['bpmn:ManualTask', 'bpmn:UserTask', 'bpmn:EndEvent'])) {
groups.push(
createUserInstructionsGroup (
element,
translate,
moddle,
commandStack
)
);
}
if (is(element, 'bpmn:ServiceTask')) {
groups.push(
createServiceGroup(element, translate, moddle, commandStack)
);
}
return groups;
};
};
propertiesPanel.registerProvider(LOW_PRIORITY, this);
}
ExtensionsPropertiesProvider.$inject = [
'propertiesPanel',
'translate',
'moddle',
'commandStack',
'elementRegistry',
];
/**
* Adds a group to the properties panel for the script task that allows you
* to set the script.
* @param element
* @param translate
* @returns The components to add to the properties panel. */
function createScriptGroup(element, translate, moddle, commandStack) {
return {
id: 'spiff_script',
label: translate('Script'),
entries: scriptGroup({
element,
moddle,
scriptType: SCRIPT_TYPE.bpmn,
label: 'Script',
description: 'Code to execute.',
translate,
commandStack,
}),
};
}
/**
* Adds a section to the properties' panel for NON-Script tasks, so that
* you can define a pre-script and a post-script for modifying data as it comes and out.
* @param element
* @param translate
* @param moddle For altering the underlying XML File.
* @returns The components to add to the properties panel.
*/
function preScriptPostScriptGroup(element, translate, moddle, commandStack) {
return {
id: 'spiff_pre_post_scripts',
label: translate('Pre/Post Scripts'),
entries: [
...scriptGroup({
element,
moddle,
commandStack,
translate,
scriptType: SCRIPT_TYPE.pre,
label: 'Pre-Script',
description: 'code to execute prior to this task.',
}),
...scriptGroup({
element,
moddle,
commandStack,
translate,
scriptType: SCRIPT_TYPE.post,
label: 'Post-Script',
description: 'code to execute after this task.',
}),
],
};
}
/**
* Create a group on the main panel with a select box (for choosing the Data Object to connect)
* @param element
* @param translate
* @param moddle
* @returns entries
*/
function createUserGroup(element, translate, moddle, commandStack) {
return {
id: 'user_task_properties',
label: translate('Web Form (with Json Schemas)'),
entries: [
{
element,
moddle,
commandStack,
component: SpiffExtensionSelect,
optionType: OPTION_TYPE.json_files,
name: 'formJsonSchemaFilename',
label: translate('JSON Schema Filename'),
description: translate('Form Description (RSJF)'),
},
{
component: SpiffExtensionLaunchButton,
element,
name: 'formJsonSchemaFilename',
label: translate('Launch Editor'),
event: 'spiff.file.edit',
description: translate('Edit the form description'),
},
{
element,
moddle,
commandStack,
component: SpiffExtensionSelect,
optionType: OPTION_TYPE.json_files,
label: translate('UI Schema Filename'),
event: 'spiff.file.edit',
description: translate('Rules for displaying the form. (RSJF Schema)'),
name: 'formUiSchemaFilename',
},
{
component: SpiffExtensionLaunchButton,
element,
name: 'formUiSchemaFilename',
label: translate('Launch Editor'),
event: 'spiff.file.edit',
description: translate('Edit the form schema'),
},
],
};
}
/**
* Select and launch for Business Rules
*
* @param element
* @param translate
* @param moddle
* @param commandStack
* @returns {{entries: [{moddle, component: ((function(*): preact.VNode<any>)|*), name: string, description, label, commandStack, element},{component: ((function(*): preact.VNode<any>)|*), name: string, description, label, event: string, element}], id: string, label}}
*/
function createBusinessRuleGroup(element, translate, moddle, commandStack) {
return {
id: 'business_rule_properties',
label: translate('Business Rule Properties'),
entries: [
{
element,
moddle,
commandStack,
component: SpiffExtensionSelect,
optionType: OPTION_TYPE.dmn_files,
name: 'spiffworkflow:calledDecisionId',
label: translate('Select Decision Table'),
description: translate('Select a decision table from the list'),
},
{
element,
component: SpiffExtensionLaunchButton,
name: 'spiffworkflow:calledDecisionId',
label: translate('Launch Editor'),
event: 'spiff.dmn.edit',
description: translate('Modify the Decision Table'),
},
],
};
}
/**
* Create a group on the main panel with a text box (for choosing the information to display to the user)
* @param element
* @param translate
* @param moddle
* @returns entries
*/
function createUserInstructionsGroup (
element,
translate,
moddle,
commandStack
) {
return {
id: 'instructions',
label: translate('Instructions'),
entries: [
{
element,
moddle,
commandStack,
component: SpiffExtensionTextArea,
name: 'spiffworkflow:instructionsForEndUser',
label: 'Instructions',
description: 'The instructions to display when completing this task.',
},
{
element,
moddle,
commandStack,
component: SpiffExtensionLaunchButton,
name: 'spiffworkflow:instructionsForEndUser',
label: translate('Launch Editor'),
event: 'spiff.markdown.edit',
listenEvent: 'spiff.markdown.update',
description: translate('Edit the form schema'),
}
],
};
}
/**
* Create a group on the main panel with a text box (for choosing the dmn to connect)
* @param element
* @param translate
* @param moddle
* @returns entries
*/
function createServiceGroup(element, translate, moddle, commandStack) {
return {
id: 'service_task_properties',
label: translate('Spiffworkflow Service Properties'),
entries: [
{
element,
moddle,
commandStack,
component: ServiceTaskOperatorSelect,
translate,
},
{
element,
moddle,
commandStack,
component: ServiceTaskResultTextInput,
translate,
},
{
id: 'serviceTaskParameters',
label: translate('Parameters'),
component: ListGroup,
...ServiceTaskParameterArray({
element,
moddle,
translate,
commandStack
}),
},
],
};
}