From 638fa251948ee17066740afafb654853dd8d0ad9 Mon Sep 17 00:00:00 2001 From: "S.Listl" <S.Listl@SLISTL.aditosoftware.local> Date: Mon, 10 Feb 2020 16:42:47 +0000 Subject: [PATCH] Workflow signal implementation (cherry picked from commit 8210c6b27ce14fdbd8cfcf1b437818971b8461d2) --- .../WorkflowSignal/create_WorkflowSignal.xml | 16 +++ .../Data_alias/basic/2020.0.1/changelog.xml | 5 + .liquibase/Data_alias/changelog.xml | 1 + aliasDefinition/Data_alias/Data_alias.aod | 104 ++++++++++++++ entity/Context_entity/Context_entity.aod | 6 + .../KeywordEntry_entity.aod | 6 + entity/Offer_entity/afterOperatingState.js | 4 +- .../recordcontainers/db/onDBDelete.js | 3 +- .../recordcontainers/db/onDBInsert.js | 2 + .../recordcontainers/db/onDBUpdate.js | 5 +- .../WorkflowDefinition_entity.aod | 18 +++ .../processdefinitionid_param/valueProcess.js | 4 + .../valueProcess.js | 4 + .../WorkflowSignal_entity.aod | 133 ++++++++++++++++++ .../object_condition/valueProcess.js | 23 +++ .../processdefinition_key/valueProcess.js | 6 + .../signal_name/dropDownProcess.js | 13 ++ .../containername_param/valueProcess.js | 4 + .../recordcontainers/db/conditionProcess.js | 6 + .../trigger_event.displayvalue/expression.js | 6 + .../WorkflowTask_entity.aod | 31 +++- .../entityfields/claimtask/onActionProcess.js | 5 + .../recordcontainers/jdito/contentProcess.js | 7 +- neonContext/WorkflowSignal/WorkflowSignal.aod | 23 +++ .../WorkflowDefinitionMain_view.aod | 5 + .../WorkflowSignalEdit_view.aod | 36 +++++ .../WorkflowSignalFilter_view.aod | 31 ++++ .../WorkflowSignalPreview_view.aod | 10 ++ .../WorkflowTaskPreview_view.aod | 12 ++ process/Context_lib/process.js | 2 + process/Workflow_lib/process.js | 117 ++++++++++++++- 31 files changed, 641 insertions(+), 7 deletions(-) create mode 100644 .liquibase/Data_alias/basic/2020.0.1/WorkflowSignal/create_WorkflowSignal.xml create mode 100644 .liquibase/Data_alias/basic/2020.0.1/changelog.xml create mode 100644 entity/WorkflowDefinition_entity/entityfields/signals/children/processdefinitionid_param/valueProcess.js create mode 100644 entity/WorkflowDefinition_entity/entityfields/signals/children/processdefinitionkey_param/valueProcess.js create mode 100644 entity/WorkflowSignal_entity/WorkflowSignal_entity.aod create mode 100644 entity/WorkflowSignal_entity/entityfields/object_condition/valueProcess.js create mode 100644 entity/WorkflowSignal_entity/entityfields/processdefinition_key/valueProcess.js create mode 100644 entity/WorkflowSignal_entity/entityfields/signal_name/dropDownProcess.js create mode 100644 entity/WorkflowSignal_entity/entityfields/triggerkeyword/children/containername_param/valueProcess.js create mode 100644 entity/WorkflowSignal_entity/recordcontainers/db/conditionProcess.js create mode 100644 entity/WorkflowSignal_entity/recordcontainers/db/recordfieldmappings/trigger_event.displayvalue/expression.js create mode 100644 entity/WorkflowTask_entity/entityfields/claimtask/onActionProcess.js create mode 100644 neonContext/WorkflowSignal/WorkflowSignal.aod create mode 100644 neonView/WorkflowSignalEdit_view/WorkflowSignalEdit_view.aod create mode 100644 neonView/WorkflowSignalFilter_view/WorkflowSignalFilter_view.aod create mode 100644 neonView/WorkflowSignalPreview_view/WorkflowSignalPreview_view.aod diff --git a/.liquibase/Data_alias/basic/2020.0.1/WorkflowSignal/create_WorkflowSignal.xml b/.liquibase/Data_alias/basic/2020.0.1/WorkflowSignal/create_WorkflowSignal.xml new file mode 100644 index 00000000000..ca188068504 --- /dev/null +++ b/.liquibase/Data_alias/basic/2020.0.1/WorkflowSignal/create_WorkflowSignal.xml @@ -0,0 +1,16 @@ +<?xml version="1.1" encoding="UTF-8" standalone="no"?> +<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd"> + <changeSet author="s.listl" id="18da4f91-3334-47c6-958d-6d0efce52d31"> + <createTable tableName="WORKFLOWSIGNAL"> + <column name="WORKFLOWSIGNALID" type="CHAR(36)"> + <constraints primaryKey="true" primaryKeyName="PK_WORKFLOWSIGNALID"/> + </column> + <column name="SIGNAL_NAME" type="VARCHAR(255)"/> + <column name="OBJECT_TYPE" type="VARCHAR(63)"/> + <column name="TRIGGER_EVENT" type="CHAR(36)"/> + <column name="PROCESSDEFINITION_KEY" type="VARCHAR(255)"/> + <column name="OBJECT_CONDITION" type="NVARCHAR(512)"/> + </createTable> + </changeSet> +</databaseChangeLog> diff --git a/.liquibase/Data_alias/basic/2020.0.1/changelog.xml b/.liquibase/Data_alias/basic/2020.0.1/changelog.xml new file mode 100644 index 00000000000..c3105c90b71 --- /dev/null +++ b/.liquibase/Data_alias/basic/2020.0.1/changelog.xml @@ -0,0 +1,5 @@ +<?xml version="1.1" encoding="UTF-8" standalone="no"?> +<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-3.6.xsd"> + <include file="WorkflowSignal/create_WorkflowSignal.xml" relativeToChangelogFile="true"/> +</databaseChangeLog> diff --git a/.liquibase/Data_alias/changelog.xml b/.liquibase/Data_alias/changelog.xml index cc63bd025f4..cc2f1fb4717 100644 --- a/.liquibase/Data_alias/changelog.xml +++ b/.liquibase/Data_alias/changelog.xml @@ -8,6 +8,7 @@ <include relativeToChangelogFile="true" file="basic/2019.3.2/changelog.xml"/> <include relativeToChangelogFile="true" file="basic/2019.3.3/changelog.xml"/> <include relativeToChangelogFile="true" file="basic/2020.0.0/changelog.xml"/> + <include relativeToChangelogFile="true" file="basic/2020.0.1/changelog.xml"/> <!--enable this only when you definetly want to overwrite the existing data with demo records:--> <!--<include relativeToChangelogFile="true" file="basic/_demoData/changelog.xml" context="example"/>--> diff --git a/aliasDefinition/Data_alias/Data_alias.aod b/aliasDefinition/Data_alias/Data_alias.aod index 54d9a6d9633..864f08aaa85 100644 --- a/aliasDefinition/Data_alias/Data_alias.aod +++ b/aliasDefinition/Data_alias/Data_alias.aod @@ -13297,6 +13297,110 @@ </entityFieldDb> </entityFields> </entityDb> + <entityDb> + <name>WORKFLOWSIGNAL</name> + <dbName></dbName> + <idColumn>WORKFLOWSIGNALID</idColumn> + <idGeneratorType v="0" /> + <idGeneratorInterval v="1" /> + <documentation></documentation> + <title></title> + <description></description> + <auditSyncConfig> + <name>auditSyncConfig</name> + <auditMode v="0" /> + <syncActive v="false" /> + <syncComplete v="true" /> + <syncDirection v="1" /> + <syncIds></syncIds> + </auditSyncConfig> + <entityFields> + <entityFieldDb> + <name>SIGNAL_NAME</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="255" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>WORKFLOWSIGNALID</name> + <dbName></dbName> + <primaryKey v="true" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="true" /> + <isUnique v="true" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>TRIGGER_EVENT</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="1" /> + <size v="36" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>OBJECT_CONDITION</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="512" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>OBJECT_TYPE</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="63" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + <entityFieldDb> + <name>PROCESSDEFINITION_KEY</name> + <dbName></dbName> + <primaryKey v="false" /> + <columnType v="12" /> + <size v="255" /> + <scale v="0" /> + <notNull v="false" /> + <isUnique v="false" /> + <index v="false" /> + <documentation></documentation> + <title></title> + <description></description> + </entityFieldDb> + </entityFields> + </entityDb> </entities> </entityGroup> </aliasDefDb> diff --git a/entity/Context_entity/Context_entity.aod b/entity/Context_entity/Context_entity.aod index 92b4a55b9b2..f2201393b8e 100644 --- a/entity/Context_entity/Context_entity.aod +++ b/entity/Context_entity/Context_entity.aod @@ -151,6 +151,12 @@ <fieldName>Contexts</fieldName> <isConsumer v="false" /> </entityDependency> + <entityDependency> + <name>591679c2-8fd3-4d05-9ef3-b648373785f7</name> + <entityName>WorkflowSignal_entity</entityName> + <fieldName>Contexts</fieldName> + <isConsumer v="false" /> + </entityDependency> </dependencies> </entityProvider> </entityFields> diff --git a/entity/KeywordEntry_entity/KeywordEntry_entity.aod b/entity/KeywordEntry_entity/KeywordEntry_entity.aod index ca40ed92276..126ed926b5f 100644 --- a/entity/KeywordEntry_entity/KeywordEntry_entity.aod +++ b/entity/KeywordEntry_entity/KeywordEntry_entity.aod @@ -559,6 +559,12 @@ <fieldName>CampaignStatusKeyword</fieldName> <isConsumer v="false" /> </entityDependency> + <entityDependency> + <name>66c64130-1997-4565-854e-94802b46dc96</name> + <entityName>WorkflowSignal_entity</entityName> + <fieldName>TriggerKeyword</fieldName> + <isConsumer v="false" /> + </entityDependency> </dependencies> <children> <entityParameter> diff --git a/entity/Offer_entity/afterOperatingState.js b/entity/Offer_entity/afterOperatingState.js index 95c27335097..9e011dcf5d5 100644 --- a/entity/Offer_entity/afterOperatingState.js +++ b/entity/Offer_entity/afterOperatingState.js @@ -1,3 +1,4 @@ +import("Context_lib"); import("system.vars"); import("Workflow_lib"); @@ -5,4 +6,5 @@ if (vars.exists("$context.workflowQueue") && vars.get("$context.workflowQueue")) { WorkflowStarter.inserted(vars.get("$context.workflowQueue")); vars.set("$context.workflowQueue", null); -} \ No newline at end of file +} +WorkflowSignalSender.doInsertedOrUpdated(); \ No newline at end of file diff --git a/entity/Offer_entity/recordcontainers/db/onDBDelete.js b/entity/Offer_entity/recordcontainers/db/onDBDelete.js index 1f353a67442..dbcf3083e10 100644 --- a/entity/Offer_entity/recordcontainers/db/onDBDelete.js +++ b/entity/Offer_entity/recordcontainers/db/onDBDelete.js @@ -5,4 +5,5 @@ import("system.vars"); newWhere("OFFERITEM.OFFER_ID", "$field.OFFERID") .deleteData(); -WorkflowStarter.deleted({sum : Number(vars.get("$field.TotalGross")), status : vars.get("$field.STATUS")}); \ No newline at end of file +WorkflowStarter.deleted({sum : Number(vars.get("$field.TotalGross")), status : vars.get("$field.STATUS")}); +WorkflowSignalSender.deleted(); \ No newline at end of file diff --git a/entity/Offer_entity/recordcontainers/db/onDBInsert.js b/entity/Offer_entity/recordcontainers/db/onDBInsert.js index e889b0d6c55..f65c655ec87 100644 --- a/entity/Offer_entity/recordcontainers/db/onDBInsert.js +++ b/entity/Offer_entity/recordcontainers/db/onDBInsert.js @@ -1,3 +1,4 @@ +import("system.workflow"); import("Workflow_lib"); import("system.db"); import("system.datetime"); @@ -22,3 +23,4 @@ if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW) //start the execution in afterOperatingState, because here the dataset is not yet inserted vars.set("$context.workflowQueue", {sum : Number(vars.get("$field.TotalGross")), status : vars.get("$field.STATUS")}); +WorkflowSignalSender.markInserted(); diff --git a/entity/Offer_entity/recordcontainers/db/onDBUpdate.js b/entity/Offer_entity/recordcontainers/db/onDBUpdate.js index 8f911091e97..481f3bcd1ad 100644 --- a/entity/Offer_entity/recordcontainers/db/onDBUpdate.js +++ b/entity/Offer_entity/recordcontainers/db/onDBUpdate.js @@ -1,7 +1,10 @@ +import("system.workflow"); import("KeywordRegistry_basic"); import("system.vars"); import("Workflow_lib"); var status = vars.get("$local.rowdata")["OFFER.STATUS"]; if (vars.get("$local.changed").indexOf("OFFER.STATUS") !== -1 && status == $KeywordRegistry.offerStatus$toCheck()) - WorkflowStarter.updated({sum : Number(vars.get("$field.TotalGross")), status : status}); \ No newline at end of file + WorkflowStarter.updated({sum : Number(vars.get("$field.TotalGross")), status : status}); + +WorkflowSignalSender.markUpdated(); \ No newline at end of file diff --git a/entity/WorkflowDefinition_entity/WorkflowDefinition_entity.aod b/entity/WorkflowDefinition_entity/WorkflowDefinition_entity.aod index f7bbe40886f..7a08e145424 100644 --- a/entity/WorkflowDefinition_entity/WorkflowDefinition_entity.aod +++ b/entity/WorkflowDefinition_entity/WorkflowDefinition_entity.aod @@ -171,6 +171,24 @@ <onActionProcess>%aditoprj%/entity/WorkflowDefinition_entity/entityfields/downloadxml/onActionProcess.js</onActionProcess> <iconId>VAADIN:DOWNLOAD</iconId> </entityActionField> + <entityConsumer> + <name>Signals</name> + <dependency> + <name>dependency</name> + <entityName>WorkflowSignal_entity</entityName> + <fieldName>ProcessDefinitionSignals</fieldName> + </dependency> + <children> + <entityParameter> + <name>ProcessDefinitionId_param</name> + <valueProcess>%aditoprj%/entity/WorkflowDefinition_entity/entityfields/signals/children/processdefinitionid_param/valueProcess.js</valueProcess> + </entityParameter> + <entityParameter> + <name>ProcessDefinitionKey_param</name> + <valueProcess>%aditoprj%/entity/WorkflowDefinition_entity/entityfields/signals/children/processdefinitionkey_param/valueProcess.js</valueProcess> + </entityParameter> + </children> + </entityConsumer> </entityFields> <recordContainers> <jDitoRecordContainer> diff --git a/entity/WorkflowDefinition_entity/entityfields/signals/children/processdefinitionid_param/valueProcess.js b/entity/WorkflowDefinition_entity/entityfields/signals/children/processdefinitionid_param/valueProcess.js new file mode 100644 index 00000000000..16c85500b53 --- /dev/null +++ b/entity/WorkflowDefinition_entity/entityfields/signals/children/processdefinitionid_param/valueProcess.js @@ -0,0 +1,4 @@ +import("system.vars"); +import("system.result"); + +result.string(vars.get("$field.UID")); \ No newline at end of file diff --git a/entity/WorkflowDefinition_entity/entityfields/signals/children/processdefinitionkey_param/valueProcess.js b/entity/WorkflowDefinition_entity/entityfields/signals/children/processdefinitionkey_param/valueProcess.js new file mode 100644 index 00000000000..3c5c973d2b2 --- /dev/null +++ b/entity/WorkflowDefinition_entity/entityfields/signals/children/processdefinitionkey_param/valueProcess.js @@ -0,0 +1,4 @@ +import("system.vars"); +import("system.result"); + +result.string(vars.get("$field.KEY")); \ No newline at end of file diff --git a/entity/WorkflowSignal_entity/WorkflowSignal_entity.aod b/entity/WorkflowSignal_entity/WorkflowSignal_entity.aod new file mode 100644 index 00000000000..90a3b92882d --- /dev/null +++ b/entity/WorkflowSignal_entity/WorkflowSignal_entity.aod @@ -0,0 +1,133 @@ +<?xml version="1.0" encoding="UTF-8"?> +<entity xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.3.13" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/entity/1.3.13"> + <name>WorkflowSignal_entity</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <title>Workflow signal</title> + <titlePlural>Signals</titlePlural> + <recordContainer>db</recordContainer> + <entityFields> + <entityProvider> + <name>#PROVIDER</name> + </entityProvider> + <entityField> + <name>WORKFLOWSIGNALID</name> + </entityField> + <entityField> + <name>SIGNAL_NAME</name> + <title>Signal</title> + <dropDownProcess>%aditoprj%/entity/WorkflowSignal_entity/entityfields/signal_name/dropDownProcess.js</dropDownProcess> + </entityField> + <entityField> + <name>SCOPE</name> + <title>Scope</title> + </entityField> + <entityParameter> + <name>ProcessDefinitionId_param</name> + <expose v="true" /> + </entityParameter> + <entityField> + <name>OBJECT_TYPE</name> + <title>Context</title> + <consumer>Contexts</consumer> + </entityField> + <entityField> + <name>TRIGGER_EVENT</name> + <title>Trigger</title> + <consumer>TriggerKeyword</consumer> + </entityField> + <entityField> + <name>OBJECT_CONDITION</name> + <title>Condition</title> + <contentType>FILTER_TREE</contentType> + <valueProcess>%aditoprj%/entity/WorkflowSignal_entity/entityfields/object_condition/valueProcess.js</valueProcess> + </entityField> + <entityConsumer> + <name>Contexts</name> + <dependency> + <name>dependency</name> + <entityName>Context_entity</entityName> + <fieldName>Exclusive</fieldName> + </dependency> + </entityConsumer> + <entityConsumer> + <name>TriggerKeyword</name> + <dependency> + <name>dependency</name> + <entityName>KeywordEntry_entity</entityName> + <fieldName>SpecificContainerKeywords</fieldName> + </dependency> + <children> + <entityParameter> + <name>ContainerName_param</name> + <valueProcess>%aditoprj%/entity/WorkflowSignal_entity/entityfields/triggerkeyword/children/containername_param/valueProcess.js</valueProcess> + </entityParameter> + </children> + </entityConsumer> + <entityProvider> + <name>ProcessDefinitionSignals</name> + <dependencies> + <entityDependency> + <name>f08ff63c-296a-4b1f-8264-b6b1e6c1d748</name> + <entityName>WorkflowDefinition_entity</entityName> + <fieldName>Signals</fieldName> + <isConsumer v="false" /> + </entityDependency> + </dependencies> + </entityProvider> + <entityField> + <name>PROCESSDEFINITION_KEY</name> + <valueProcess>%aditoprj%/entity/WorkflowSignal_entity/entityfields/processdefinition_key/valueProcess.js</valueProcess> + </entityField> + <entityParameter> + <name>ProcessDefinitionKey_param</name> + <expose v="true" /> + </entityParameter> + </entityFields> + <recordContainers> + <dbRecordContainer> + <name>db</name> + <alias>Data_alias</alias> + <conditionProcess>%aditoprj%/entity/WorkflowSignal_entity/recordcontainers/db/conditionProcess.js</conditionProcess> + <linkInformation> + <linkInformation> + <name>f6162cb6-c209-4607-8d67-0d630b28feab</name> + <tableName>WORKFLOWSIGNAL</tableName> + <primaryKey>WORKFLOWSIGNALID</primaryKey> + <isUIDTable v="true" /> + <readonly v="false" /> + </linkInformation> + </linkInformation> + <recordFieldMappings> + <dbRecordFieldMapping> + <name>WORKFLOWSIGNALID.value</name> + <recordfield>WORKFLOWSIGNAL.WORKFLOWSIGNALID</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>OBJECT_CONDITION.value</name> + <recordfield>WORKFLOWSIGNAL.OBJECT_CONDITION</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>OBJECT_TYPE.value</name> + <recordfield>WORKFLOWSIGNAL.OBJECT_TYPE</recordfield> + <isFilterable v="true" /> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>SIGNAL_NAME.value</name> + <recordfield>WORKFLOWSIGNAL.SIGNAL_NAME</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>TRIGGER_EVENT.value</name> + <recordfield>WORKFLOWSIGNAL.TRIGGER_EVENT</recordfield> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>TRIGGER_EVENT.displayValue</name> + <expression>%aditoprj%/entity/WorkflowSignal_entity/recordcontainers/db/recordfieldmappings/trigger_event.displayvalue/expression.js</expression> + </dbRecordFieldMapping> + <dbRecordFieldMapping> + <name>PROCESSDEFINITION_KEY.value</name> + <recordfield>WORKFLOWSIGNAL.PROCESSDEFINITION_KEY</recordfield> + </dbRecordFieldMapping> + </recordFieldMappings> + </dbRecordContainer> + </recordContainers> +</entity> diff --git a/entity/WorkflowSignal_entity/entityfields/object_condition/valueProcess.js b/entity/WorkflowSignal_entity/entityfields/object_condition/valueProcess.js new file mode 100644 index 00000000000..8a7128421f3 --- /dev/null +++ b/entity/WorkflowSignal_entity/entityfields/object_condition/valueProcess.js @@ -0,0 +1,23 @@ +import("Context_lib"); +import("system.neon"); +import("system.vars"); +import("system.result"); +import("Attribute_lib"); + +if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW || vars.get("$sys.recordstate") == neon.OPERATINGSTATE_EDIT) +{ + var context = vars.getString("$field.OBJECT_TYPE"); + var entity = ContextUtils.getEntity(context); + var emptyFilter = {entity: entity, filter: {type: "group", operator: "AND", childs: []}}; + + var currentFilter = vars.get("$this.value"); + if (currentFilter) + currentFilter = JSON.parse(currentFilter); + + //if the filter field is empty or if the entity was changed, reset the filter + if (!currentFilter || currentFilter.entity != emptyFilter.entity) + { + var condJson = JSON.stringify(emptyFilter); + result.string(condJson); + } +} \ No newline at end of file diff --git a/entity/WorkflowSignal_entity/entityfields/processdefinition_key/valueProcess.js b/entity/WorkflowSignal_entity/entityfields/processdefinition_key/valueProcess.js new file mode 100644 index 00000000000..65a94b89933 --- /dev/null +++ b/entity/WorkflowSignal_entity/entityfields/processdefinition_key/valueProcess.js @@ -0,0 +1,6 @@ +import("system.neon"); +import("system.vars"); +import("system.result"); + +if (vars.get("$sys.recordstate") == neon.OPERATINGSTATE_NEW) + result.string(vars.get("$param.ProcessDefinitionKey_param")); \ No newline at end of file diff --git a/entity/WorkflowSignal_entity/entityfields/signal_name/dropDownProcess.js b/entity/WorkflowSignal_entity/entityfields/signal_name/dropDownProcess.js new file mode 100644 index 00000000000..50e53ca72a8 --- /dev/null +++ b/entity/WorkflowSignal_entity/entityfields/signal_name/dropDownProcess.js @@ -0,0 +1,13 @@ +import("system.result"); +import("system.workflow"); +import("system.vars"); + +var processDefinitionId = vars.get("$param.ProcessDefinitionId_param"); +var signals = processDefinitionId + ? JSON.parse(workflow.getSignalDefinitions(processDefinitionId)) + : []; + +result.object(signals.map(function (signal) +{ + return [signal.name, signal.name]; +})); \ No newline at end of file diff --git a/entity/WorkflowSignal_entity/entityfields/triggerkeyword/children/containername_param/valueProcess.js b/entity/WorkflowSignal_entity/entityfields/triggerkeyword/children/containername_param/valueProcess.js new file mode 100644 index 00000000000..dee07a7bcce --- /dev/null +++ b/entity/WorkflowSignal_entity/entityfields/triggerkeyword/children/containername_param/valueProcess.js @@ -0,0 +1,4 @@ +import("KeywordRegistry_basic"); +import("system.result"); + +result.string($KeywordRegistry.workflowTrigger()); \ No newline at end of file diff --git a/entity/WorkflowSignal_entity/recordcontainers/db/conditionProcess.js b/entity/WorkflowSignal_entity/recordcontainers/db/conditionProcess.js new file mode 100644 index 00000000000..cb352a5e45c --- /dev/null +++ b/entity/WorkflowSignal_entity/recordcontainers/db/conditionProcess.js @@ -0,0 +1,6 @@ +import("Sql_lib"); +import("system.result"); + +var cond = newWhereIfSet("WORKFLOWSIGNAL.PROCESSDEFINITION_ID", "$param.ProcessDefinitionId_param"); + +result.string(cond.toString()); \ No newline at end of file diff --git a/entity/WorkflowSignal_entity/recordcontainers/db/recordfieldmappings/trigger_event.displayvalue/expression.js b/entity/WorkflowSignal_entity/recordcontainers/db/recordfieldmappings/trigger_event.displayvalue/expression.js new file mode 100644 index 00000000000..f484f92b067 --- /dev/null +++ b/entity/WorkflowSignal_entity/recordcontainers/db/recordfieldmappings/trigger_event.displayvalue/expression.js @@ -0,0 +1,6 @@ +import("system.result"); +import("Keyword_lib"); +import("KeywordRegistry_basic"); + +var sql = KeywordUtils.getResolvedTitleSqlPart($KeywordRegistry.workflowTrigger(), "WORKFLOWSIGNAL.TRIGGER_EVENT"); +result.string(sql); \ No newline at end of file diff --git a/entity/WorkflowTask_entity/WorkflowTask_entity.aod b/entity/WorkflowTask_entity/WorkflowTask_entity.aod index f5ded376a8a..378580b2459 100644 --- a/entity/WorkflowTask_entity/WorkflowTask_entity.aod +++ b/entity/WorkflowTask_entity/WorkflowTask_entity.aod @@ -109,13 +109,33 @@ <name>TaskTitle_param</name> <expose v="true" /> </entityParameter> + <entityActionField> + <name>claimTask</name> + <title>Claim task</title> + <onActionProcess>%aditoprj%/entity/WorkflowTask_entity/entityfields/claimtask/onActionProcess.js</onActionProcess> + <iconId>VAADIN:CLIPBOARD_USER</iconId> + </entityActionField> + <entityField> + <name>ISACTIVE</name> + <title>Active</title> + <contentType>BOOLEAN</contentType> + </entityField> + <entityField> + <name>CLAIM_TIME</name> + <title>Claim date</title> + <contentType>DATE</contentType> + </entityField> + <entityField> + <name>PRIORITY</name> + <title>Priority</title> + </entityField> </entityFields> <recordContainers> <jDitoRecordContainer> <name>jdito</name> <jDitoRecordAlias>Data_alias</jDitoRecordAlias> <isFilterable v="true" /> - <isSortable v="true" /> + <isSortable v="false" /> <contentProcess>%aditoprj%/entity/WorkflowTask_entity/recordcontainers/jdito/contentProcess.js</contentProcess> <onUpdate>%aditoprj%/entity/WorkflowTask_entity/recordcontainers/jdito/onUpdate.js</onUpdate> <recordFieldMappings> @@ -175,6 +195,15 @@ <jDitoRecordFieldMapping> <name>TARGET_ID.displayValue</name> </jDitoRecordFieldMapping> + <jDitoRecordFieldMapping> + <name>CLAIM_TIME.value</name> + </jDitoRecordFieldMapping> + <jDitoRecordFieldMapping> + <name>ISACTIVE.value</name> + </jDitoRecordFieldMapping> + <jDitoRecordFieldMapping> + <name>PRIORITY.value</name> + </jDitoRecordFieldMapping> </recordFieldMappings> </jDitoRecordContainer> </recordContainers> diff --git a/entity/WorkflowTask_entity/entityfields/claimtask/onActionProcess.js b/entity/WorkflowTask_entity/entityfields/claimtask/onActionProcess.js new file mode 100644 index 00000000000..c7efdb62d29 --- /dev/null +++ b/entity/WorkflowTask_entity/entityfields/claimtask/onActionProcess.js @@ -0,0 +1,5 @@ +import("Employee_lib"); +import("system.vars"); +import("system.workflow"); + +workflow.claimTask(vars.get("$field.UID"), EmployeeUtils.getCurrentUserId()); \ No newline at end of file diff --git a/entity/WorkflowTask_entity/recordcontainers/jdito/contentProcess.js b/entity/WorkflowTask_entity/recordcontainers/jdito/contentProcess.js index 9005006abf7..60769b4b453 100644 --- a/entity/WorkflowTask_entity/recordcontainers/jdito/contentProcess.js +++ b/entity/WorkflowTask_entity/recordcontainers/jdito/contentProcess.js @@ -36,7 +36,7 @@ result.object((function () { //This can happen if the task is done, then it can't be loaded. If that's the case, return a dummy row var taskTitle = vars.exists("$param.TaskTitle_param") && vars.get("$param.TaskTitle_param") || ""; - return [[taskId, translate.text("Task done"), taskTitle, "", vars.get("$sys.date"), "", "", "", "", "", "", "", "", "", "", "", ""]]; + return [[taskId, translate.text("Task done"), taskTitle, "", vars.get("$sys.date"), "", "", "", "", "", "", "", "", "", "", "", "", "", "", ""]]; } } else @@ -72,7 +72,10 @@ result.object((function () task.owner || "", variables.targetContext || "", variables.targetId || "", - targetTitle + targetTitle, + task.claimTime, + task.active, + task.priority ]; }); diff --git a/neonContext/WorkflowSignal/WorkflowSignal.aod b/neonContext/WorkflowSignal/WorkflowSignal.aod new file mode 100644 index 00000000000..af6b238d6fe --- /dev/null +++ b/neonContext/WorkflowSignal/WorkflowSignal.aod @@ -0,0 +1,23 @@ +<?xml version="1.0" encoding="UTF-8"?> +<neonContext xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.1" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonContext/1.1.1"> + <name>WorkflowSignal</name> + <title>Workflow signal</title> + <majorModelMode>DISTRIBUTED</majorModelMode> + <filterView>WorkflowSignalFilter_view</filterView> + <editView>WorkflowSignalEdit_view</editView> + <entity>WorkflowSignal_entity</entity> + <references> + <neonViewReference> + <name>5dd8a1ec-6279-4f85-ae49-d3d82a62d1dc</name> + <view>WorkflowSignalFilter_view</view> + </neonViewReference> + <neonViewReference> + <name>0709bd97-560a-4a01-8e26-2993388956f3</name> + <view>WorkflowSignalEdit_view</view> + </neonViewReference> + <neonViewReference> + <name>9395ba99-8725-43f4-998b-9865916f9a0f</name> + <view>WorkflowSignalPreview_view</view> + </neonViewReference> + </references> +</neonContext> diff --git a/neonView/WorkflowDefinitionMain_view/WorkflowDefinitionMain_view.aod b/neonView/WorkflowDefinitionMain_view/WorkflowDefinitionMain_view.aod index 8db78b1723a..20311ee8d90 100644 --- a/neonView/WorkflowDefinitionMain_view/WorkflowDefinitionMain_view.aod +++ b/neonView/WorkflowDefinitionMain_view/WorkflowDefinitionMain_view.aod @@ -34,5 +34,10 @@ <entityField>StartConfigs</entityField> <view>WorkflowStartConfigFilter_view</view> </neonViewReference> + <neonViewReference> + <name>1a6329e9-8992-482b-82b6-fd01e09c6be1</name> + <entityField>Signals</entityField> + <view>WorkflowSignalFilter_view</view> + </neonViewReference> </children> </neonView> diff --git a/neonView/WorkflowSignalEdit_view/WorkflowSignalEdit_view.aod b/neonView/WorkflowSignalEdit_view/WorkflowSignalEdit_view.aod new file mode 100644 index 00000000000..485a890ce1c --- /dev/null +++ b/neonView/WorkflowSignalEdit_view/WorkflowSignalEdit_view.aod @@ -0,0 +1,36 @@ +<?xml version="1.0" encoding="UTF-8"?> +<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.4" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.4"> + <name>WorkflowSignalEdit_view</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <isSmall v="true" /> + <layout> + <noneLayout> + <name>layout</name> + </noneLayout> + </layout> + <children> + <genericViewTemplate> + <name>Generic</name> + <editMode v="true" /> + <entityField>#ENTITY</entityField> + <fields> + <entityFieldLink> + <name>937b8a52-58ab-49d3-80c7-ea98310632dd</name> + <entityField>SIGNAL_NAME</entityField> + </entityFieldLink> + <entityFieldLink> + <name>eb71448c-b176-4b12-a4d7-a46e2f242020</name> + <entityField>OBJECT_TYPE</entityField> + </entityFieldLink> + <entityFieldLink> + <name>bc88a7a6-6843-40c0-86ad-265424e98fb1</name> + <entityField>TRIGGER_EVENT</entityField> + </entityFieldLink> + <entityFieldLink> + <name>648536a5-2327-433e-8867-a3d60a0f8787</name> + <entityField>OBJECT_CONDITION</entityField> + </entityFieldLink> + </fields> + </genericViewTemplate> + </children> +</neonView> diff --git a/neonView/WorkflowSignalFilter_view/WorkflowSignalFilter_view.aod b/neonView/WorkflowSignalFilter_view/WorkflowSignalFilter_view.aod new file mode 100644 index 00000000000..9e428d07362 --- /dev/null +++ b/neonView/WorkflowSignalFilter_view/WorkflowSignalFilter_view.aod @@ -0,0 +1,31 @@ +<?xml version="1.0" encoding="UTF-8"?> +<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.4" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.4"> + <name>WorkflowSignalFilter_view</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <filterable v="true" /> + <layout> + <noneLayout> + <name>layout</name> + </noneLayout> + </layout> + <children> + <tableViewTemplate> + <name>Table</name> + <entityField>#ENTITY</entityField> + <columns> + <neonTableColumn> + <name>80fa7f03-9064-42f2-95bd-bebc23ca3e62</name> + <entityField>SIGNAL_NAME</entityField> + </neonTableColumn> + <neonTableColumn> + <name>44a02634-1b88-49e8-8125-5bc22e31683d</name> + <entityField>OBJECT_TYPE</entityField> + </neonTableColumn> + <neonTableColumn> + <name>c23ed9c6-7baa-4742-ba1e-d771f98167d5</name> + <entityField>TRIGGER_EVENT</entityField> + </neonTableColumn> + </columns> + </tableViewTemplate> + </children> +</neonView> diff --git a/neonView/WorkflowSignalPreview_view/WorkflowSignalPreview_view.aod b/neonView/WorkflowSignalPreview_view/WorkflowSignalPreview_view.aod new file mode 100644 index 00000000000..2b648167cc5 --- /dev/null +++ b/neonView/WorkflowSignalPreview_view/WorkflowSignalPreview_view.aod @@ -0,0 +1,10 @@ +<?xml version="1.0" encoding="UTF-8"?> +<neonView xmlns="http://www.adito.de/2018/ao/Model" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" VERSION="1.1.4" xsi:schemaLocation="http://www.adito.de/2018/ao/Model adito://models/xsd/neonView/1.1.4"> + <name>WorkflowSignalPreview_view</name> + <majorModelMode>DISTRIBUTED</majorModelMode> + <layout> + <headerFooterLayout> + <name>layout</name> + </headerFooterLayout> + </layout> +</neonView> diff --git a/neonView/WorkflowTaskPreview_view/WorkflowTaskPreview_view.aod b/neonView/WorkflowTaskPreview_view/WorkflowTaskPreview_view.aod index e8c0235a6fb..661e81ca149 100644 --- a/neonView/WorkflowTaskPreview_view/WorkflowTaskPreview_view.aod +++ b/neonView/WorkflowTaskPreview_view/WorkflowTaskPreview_view.aod @@ -47,6 +47,18 @@ <name>63697864-5b0b-471f-89fc-60621fecbaec</name> <entityField>TARGET_ID</entityField> </entityFieldLink> + <entityFieldLink> + <name>232670b6-4923-4e8d-bfa0-8720e57e932a</name> + <entityField>ISACTIVE</entityField> + </entityFieldLink> + <entityFieldLink> + <name>d193bea1-a470-4403-bce7-446e3b398540</name> + <entityField>PRIORITY</entityField> + </entityFieldLink> + <entityFieldLink> + <name>f93aeea0-7881-4284-957a-f4a300cdeeef</name> + <entityField>OWNER</entityField> + </entityFieldLink> </fields> </genericViewTemplate> </children> diff --git a/process/Context_lib/process.js b/process/Context_lib/process.js index f70649273f2..26d5997206f 100644 --- a/process/Context_lib/process.js +++ b/process/Context_lib/process.js @@ -80,6 +80,8 @@ ContextUtils.getIcon = function(pContextId) */ ContextUtils.getEntity = function (pContextId) { + if (!pContextId) + return null; return project.getContextStructure(pContextId).entity; } diff --git a/process/Workflow_lib/process.js b/process/Workflow_lib/process.js index ba2ff373f77..eb23aed65f9 100644 --- a/process/Workflow_lib/process.js +++ b/process/Workflow_lib/process.js @@ -87,9 +87,12 @@ WorkflowUtils.appendMandatoryVariables = function (pVariables, pTargetId, pTarge */ WorkflowUtils.engineIsEnabled = function () { - return project.getInstanceConfigValue("workflowEngineEnabled", "false") == "true"; + return String(project.getInstanceConfigValue("workflowEngineEnabled", "false")) == "true"; } +/** + * obsolete + */ function WorkflowStarter () {} WorkflowStarter.TRIGGER_INSERT = function () @@ -133,3 +136,115 @@ WorkflowStarter._startProcessByAction = function (pAction, pVariables, pTargetId } catch (err) {} }); } + +function WorkflowSignalSender () {} + +WorkflowSignalSender.EVENT_INSERT = function () +{ + return $KeywordRegistry.workflowTrigger$create(); +} + +WorkflowSignalSender.EVENT_UPDATE = function () +{ + return $KeywordRegistry.workflowTrigger$update(); +} + +WorkflowSignalSender.EVENT_DELETE = function () +{ + return $KeywordRegistry.workflowTrigger$delete(); +} + +WorkflowSignalSender.markInserted = function (pTargetId, pTargetContext) +{ + WorkflowSignalSender._addToQueue(WorkflowSignalSender.EVENT_INSERT(), pTargetId, pTargetContext); +} + +WorkflowSignalSender.markUpdated = function (pTargetId, pTargetContext) +{ + WorkflowSignalSender._addToQueue(WorkflowSignalSender.EVENT_UPDATE(), pTargetId, pTargetContext); +} + +WorkflowSignalSender._QUEUE_VARNAME = function () +{ + return "$context.workflowSignalQueue"; +} + +WorkflowSignalSender._addToQueue = function (pAction, pTargetId, pTargetContext) +{ + var contextVar = WorkflowSignalSender._QUEUE_VARNAME(); + var queue = []; + if (vars.exists(contextVar) && vars.get(contextVar)) + queue = vars.get(contextVar); + + queue.push([pAction, pTargetId, pTargetContext]); + vars.set(contextVar, queue); +} + +WorkflowSignalSender.doInsertedOrUpdated = function () +{ + var contextVar = WorkflowSignalSender._QUEUE_VARNAME(); + if (vars.exists(contextVar) && vars.get(contextVar)) + { + vars.get(contextVar).forEach(function (action) + { + WorkflowSignalSender.actionPerformed.apply(null, action); + }); + vars.set(contextVar, null); + } +} + +WorkflowSignalSender.deleted = function (pTargetId, pTargetContext) +{ + WorkflowSignalSender.actionPerformed(WorkflowSignalSender.EVENT_DELETE(), pTargetId, pTargetContext); +} + +WorkflowSignalSender.actionPerformed = function (pAction, pTargetId, pTargetContext) +{ + if (!pTargetId) + pTargetId = vars.get("$sys.uid"); + if (!pTargetContext) + pTargetContext = ContextUtils.getCurrentContextId(); + + var signals = WorkflowSignalSender.getSignalConfig(pTargetContext, pAction); + signals.forEach(function (signal) + { + if (_checkCondition(signal.entity, pTargetId, signal.condition)) + workflow.signalEventReceived(signal.name); + }); + + function _checkCondition (pEntity, pUid, pCondition) + { + if (!pCondition) + return true; + + var loadConfig = entities.createConfigForLoadingRows() + .entity(pEntity) + .uid(pUid) + .filter(JSON.stringify(pCondition)); + + return entities.getRowCount(loadConfig) > 0; + } +} + +WorkflowSignalSender.getSignalConfig = function (pContext, pAction) +{ + var entity = ContextUtils.getEntity(pContext); + var signals = newSelect("SIGNAL_NAME, OBJECT_CONDITION") + .from("WORKFLOWSIGNAL") + .where("WORKFLOWSIGNAL.OBJECT_TYPE", pContext) + .and("WORKFLOWSIGNAL.TRIGGER_EVENT", pAction) + .table(); + + return signals.map(function (signal) + { + var condition = signal[1] + ? JSON.parse(signal[1]).filter + : null; + + return { + name : signal[0], + entity : entity, + condition : condition + }; + }); +} \ No newline at end of file -- GitLab