@simitgroup/simpleapp-generator 1.1.14 → 1.1.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/dist/framework.js +5 -5
  2. package/dist/framework.js.map +1 -1
  3. package/dist/generate.d.ts.map +1 -1
  4. package/dist/generate.js +20 -7
  5. package/dist/generate.js.map +1 -1
  6. package/dist/processors/bpmnbuilder.d.ts +2 -0
  7. package/dist/processors/bpmnbuilder.d.ts.map +1 -0
  8. package/dist/processors/bpmnbuilder.js +165 -0
  9. package/dist/processors/bpmnbuilder.js.map +1 -0
  10. package/dist/resource/camunda-moodle.d.ts +27 -0
  11. package/dist/resource/camunda-moodle.d.ts.map +1 -0
  12. package/dist/resource/camunda-moodle.js +91 -0
  13. package/dist/resource/camunda-moodle.js.map +1 -0
  14. package/package.json +3 -1
  15. package/src/framework.ts +5 -5
  16. package/src/generate.ts +25 -7
  17. package/src/processors/bpmnbuilder.ts +166 -0
  18. package/src/resource/camunda-moodle.ts +87 -0
  19. package/templates/basic/nest/controller.ts.eta +2 -1
  20. package/templates/basic/nest/service.ts.eta +1 -1
  21. package/templates/basic/nuxt/pages.[id].vue.eta +4 -3
  22. package/templates/basic/nuxt/pages.form.vue.eta +0 -1
  23. package/templates/basic/nuxt/pages.landing.vue.eta +11 -11
  24. package/templates/basic/nuxt/pages.new.vue.eta +4 -3
  25. package/templates/basic/nuxt/pages.viewer.vue.eta +4 -7
  26. package/templates/nest/.env._eta +1 -1
  27. package/templates/nest/src/app.module.ts.eta +1 -3
  28. package/templates/nest/src/simpleapp/.gitignore.eta +2 -1
  29. package/templates/nest/src/simpleapp/generate/processors/simpleapp.processor.ts.eta +1 -1
  30. package/templates/nest/src/simpleapp/generate/workflow/formschema/SimpleApproveReject.ts.eta +8 -0
  31. package/templates/nest/src/simpleapp/generate/workflow/formschema/index.ts.eta +1 -0
  32. package/templates/nest/src/simpleapp/generate/workflow/workflow.config.ts.eta +73 -0
  33. package/templates/nest/src/{workflow → simpleapp/generate/workflow}/workflow.controller.ts.eta +4 -4
  34. package/templates/nest/src/simpleapp/generate/workflow/workflow.delegate.ts.eta +190 -0
  35. package/templates/nest/src/{workflow → simpleapp/generate/workflow}/workflow.service.ts.eta +92 -43
  36. package/templates/nest/src/{workflow → simpleapp/generate/workflow}/workflow.type.ts.eta +30 -0
  37. package/templates/nest/src/simpleapp/generate/workflow/workflow.userservice.ts.eta +77 -0
  38. package/templates/nest/src/simpleapp/simpleapp.module.ts.eta +18 -4
  39. package/templates/nest/src/simpleapp/workflows/bpmn/readme.md._eta +1 -0
  40. package/templates/nest/src/simpleapp/workflows/listeners/simpleapp.listener.ts._eta +27 -0
  41. package/templates/nest/src/simpleapp/workflows/readme.md._eta +1 -0
  42. package/templates/nuxt/.gitignore.eta +5 -4
  43. package/templates/nuxt/components/header/button/task/HeaderButtonTaskList.vue.eta +47 -72
  44. package/templates/nuxt/components/simpleApp/SimpleAppForm.vue.eta +1 -1
  45. package/templates/nuxt/components/simpleApp/SimpleAppJsonSchemaForm.vue.eta +5 -6
  46. package/templates/nuxt/components/workflow/forms/dynamicfield.vue._eta +85 -0
  47. package/templates/nuxt/components/workflow/forms/index.ts._eta +10 -0
  48. package/templates/nuxt/components/workflow/forms/simpleapprove.vue._eta +43 -0
  49. package/templates/nuxt/lang/{df.ts.eta → df.ts._eta} +4 -1
  50. package/templates/nuxt/nuxt.config.ts.eta +1 -1
  51. package/templates/nuxt/simpleapp/workflows/bpmn/readme.md._eta +1 -0
  52. package/templates/nuxt/simpleapp/workflows/forms/readme.md._eta +1 -0
  53. package/templates/project/workflows/bpmn/suspendcustomer.bpmn._eta +72 -0
  54. package/templates/project/workflows/forms/index.ts.eta +2 -0
  55. package/templates/project/workflows/forms/simpleapprove.jsonschema.ts.eta +8 -0
  56. package/templates/workflow/next/listener.ts.eta +76 -0
  57. package/tsconfig.tsbuildinfo +1 -1
  58. package/src/processors/jsonschemabuilder.ts-old +0 -383
  59. package/templates/nest/src/workflow/bpmn/suspendcustomer.bpmn.eta +0 -66
  60. package/templates/nest/src/workflow/delegates/customer.ts._eta +0 -8
  61. package/templates/nest/src/workflow/delegates/hello.ts._eta +0 -5
  62. package/templates/nest/src/workflow/delegates/index.ts._eta +0 -5
  63. package/templates/nest/src/workflow/delegates/invoice.delegates.ts._eta +0 -9
  64. package/templates/nest/src/workflow/delegates/usertask.ts._eta +0 -3
  65. package/templates/nest/src/workflow/formschema/SimpleApproveReject.ts._eta +0 -8
  66. package/templates/nest/src/workflow/formschema/index.ts._eta +0 -1
  67. package/templates/nest/src/workflow/workflow.config.ts.eta +0 -57
  68. package/templates/nest/src/workflow/workflow.delegate.ts.eta +0 -104
  69. package/templates/nest/src/workflow/workflow.delegateservice.ts._eta +0 -46
  70. package/templates/nest/src/workflow/workflow.module.ts.eta +0 -21
  71. /package/templates/nest/src/{workflow → simpleapp/generate/workflow}/workflow.apischema.ts.eta +0 -0
@@ -1,6 +1,9 @@
1
1
  <template>
2
2
  <button class="text-center border-none cursor-pointer p-1" @click="visible=true" >
3
- <i class="pi pi-bell"></i>
3
+ <i class="pi pi-bell">
4
+ <Badge :value="taskqty" severity="danger"></Badge>
5
+ </i>
6
+
4
7
  <Sidebar v-model:visible="visible" position="right" :modal="false" :dismissable="false">
5
8
  <template #header>
6
9
  <div class="text text-lg font-bold">{{ t('mytasks') }}</div>
@@ -14,52 +17,44 @@
14
17
  :close-on-escape="false" >
15
18
  <template #header>
16
19
  <div class="text text-lg font-bold">
17
- {{ selectedtask.processName }} / {{ selectedtask.name }}
20
+ {{ selectedtask?.processName }} / {{ selectedtask?.name }}
18
21
  </div>
19
22
  </template>
20
23
  <template #default>
21
- <div >
22
-
23
- <div>
24
- <pre>{{ selectedtask.data}}</pre>
25
- </div>
26
- <div class="border " v-if="formSchema">
27
- <SimpleAppJsonSchemaForm :schema="formSchema" v-model="data" #default="o" >
28
- <Card>
29
- <template #header>Response</template>
30
- <template #content>
31
- <div >
32
- <div v-for="field in Object.keys(formSchema.properties)" class="border p-2">
33
- <SimpleAppInput :setting="o.getField(`#/properties/${field}`)"
34
- :input-type="autoPickInput(formSchema.properties[field])"
35
- v-model="data[field]" />
36
- </div>
37
- </div>
38
- </template>
39
- <template #footer>
40
- <Button class="btn-primary" @click="o.validate(validateCallBack)">{{ t('submit') }}</Button>
41
-
42
- </template>
43
- </Card>
44
- </SimpleAppJsonSchemaForm>
45
-
46
- </div>
24
+ <div v-if="componentresolver && formSchema" >
25
+ <component :is="componentresolver"
26
+ :processName="selectedtask?.processName ?? ''"
27
+ :taskName="selectedtask?.name??''"
28
+ :instanceData="instanceData"
29
+ :jsonschema="formSchema"
30
+ v-model="data"
31
+ @submit="invokeTask"
32
+ />
47
33
  </div>
48
34
  </template>
49
35
  </Dialog>
50
36
  </button>
51
37
  </template>
52
38
  <script setup lang="ts">
53
- import {UserTaskType,SimpleAppInputType} from '~/types'
39
+ import {UserTaskType,NotificationStatus} from '~/types'
54
40
  import { useDialog } from 'primevue/usedialog';
41
+ import * as forms from '~/simpleapp/workflows/forms'
42
+ import {getFormComponent} from '~/components/workflow/forms'
55
43
  const dialog = useDialog()
56
44
  const dialogvisible = ref(false)
57
45
  const visible = ref(false)
58
- const selectedtask = ref()
46
+ const selectedtask = ref<UserTaskType>()
59
47
  const tasklist = ref<UserTaskType[]>([])
60
48
  const formSchema = ref()
49
+ const formkey = ref<string>('')
61
50
  const data = ref<any>({})
62
- //computed(async ()=>await getTaskList())
51
+ const instanceData = ref<any>({})
52
+ const componentresolver = computed(()=>{
53
+ const workflowform = getFormComponent(formkey.value as string)
54
+ console.log("workflowformworkflowformworkflowform",workflowform)
55
+ return workflowform
56
+ })
57
+ const taskqty = computed(()=>tasklist.value.length)
63
58
 
64
59
  onMounted(async ()=> syncTask())
65
60
  watch(visible,(newvalue)=>{
@@ -78,56 +73,36 @@ const closeDialog = ()=>{
78
73
  }
79
74
 
80
75
  const invokeTask = async ()=>{
81
- const res = await invokeUserTask(selectedtask.value.taskId,data)
76
+ const res = await invokeUserTask(selectedtask.value?.taskId,data)
82
77
  syncTask()
83
78
  dialogvisible.value=false
84
79
  }
85
80
  const viewTask = async (task:UserTaskType)=>{
81
+
86
82
  selectedtask.value=task
87
- dialogvisible.value=true
83
+ instanceData.value=task.data
84
+
88
85
  const formsettings:any = await getTaskForm(task.processName, task.elementId)
89
- formSchema.value = formsettings.schema
90
- Object.keys(formsettings.schema.properties).forEach((key)=>{
91
- data.value[key]=null
92
- })
93
- console.log("data,data",data)
94
- }
86
+ formkey.value = formsettings.schema
87
+ console.log("viewTask formsettings",formsettings)
88
+ formSchema.value = forms[formkey.value as keyof typeof forms]
89
+ if(formSchema.value){
90
+ Object.keys(formSchema.value.properties).forEach((key)=>{
91
+ data.value[key]=''
92
+ })
95
93
 
96
- const autoPickInput = (setting:any) =>{
97
- if(setting.type=='boolean'){
98
- return SimpleAppInputType.checkbox
99
- }if(setting.type=='number'){
100
- return SimpleAppInputType.number
101
- }
102
- else if(setting.enum){
103
- return SimpleAppInputType.select
104
- }
105
- else if(setting.type=='string'){
106
- return pickStringInput(setting)
94
+ dialogvisible.value=true
107
95
  }else{
108
- return SimpleAppInputType.text
109
- }
110
- }
111
-
112
- const pickStringInput = (setting:any) =>{
113
- switch(setting.format){
114
- case 'date':
115
- return SimpleAppInputType.date
116
- break;
117
- case 'textarea':
118
- return SimpleAppInputType.textarea
119
- break;
120
- case 'text':
121
- default:
122
- return SimpleAppInputType.text
123
- break;
96
+ useNuxtApp().$event('Notification',{
97
+ documentName:task.processName,
98
+ summary:t('formKeyNotFound',{formKey:formkey.value}),
99
+ status:NotificationStatus.error,
100
+ message:t('formKeyNotFound',{formKey:formkey.value}),
101
+
102
+ })
124
103
  }
104
+
125
105
  }
126
106
 
127
- const validateCallBack = async (errors:any)=>{
128
- // console.log("After validate",result)
129
- if(!errors){
130
- await invokeTask()
131
- }
132
- }
107
+ onMounted(()=>syncTask())
133
108
  </script>
@@ -21,7 +21,7 @@ import _ from 'lodash'
21
21
  const getField = (path:string)=>{
22
22
  // console.log("simpleform topath",path)
23
23
  const data = props.document.getData()
24
- const schema = props.document.getSchema()
24
+ const schema = props.document.getSchema() as JSONSchema7 //force type for compatibility
25
25
  const fieldsetting = getPathObject(schema,path)
26
26
  // console.log("setting",fieldsetting)
27
27
 
@@ -10,11 +10,11 @@ import Ajv from 'ajv';
10
10
  import addFormats from 'ajv-formats';
11
11
  import addErrors from 'ajv-errors';
12
12
  import _ from 'lodash'
13
- const modelValue = defineModel()
13
+
14
14
  const props = defineProps<{
15
15
  title?:string,
16
16
  schema:JSONSchema7,
17
- // data:any,
17
+ data:any,
18
18
  // document: SimpleAppClient<any,any>
19
19
  readonly?:boolean
20
20
  }>()
@@ -37,9 +37,7 @@ const modelValue = defineModel()
37
37
  } //as SimpleAppFieldSetting
38
38
  }
39
39
 
40
- const getModelValue=(data:any,path:string)=>{
41
-
42
- }
40
+
43
41
  const getIsRequired=(schema:any,path:string)=>{
44
42
  if(!path){
45
43
  console.error('unknown path')
@@ -142,7 +140,8 @@ const modelValue = defineModel()
142
140
  // this.errorlist.value = {};
143
141
  // this.hook('pre-validation', this.data.value);
144
142
  const validate = ajv.compile(props.schema);
145
- const valid = validate(modelValue.value);
143
+ console.log("validate data",props.data)
144
+ const valid = validate(props.data);
146
145
  if (!valid) {
147
146
  const errors = validate.errors;
148
147
  const tmp: { [key: string]: any } = {};
@@ -0,0 +1,85 @@
1
+ <template>
2
+ <div >
3
+ <div>
4
+ <pre>{{ data}}dynamic</pre>
5
+ </div>
6
+ <div class="border " v-if="jsonschema">
7
+ <SimpleAppJsonSchemaForm :schema="jsonschema" :data="data" #default="o" >
8
+ <Card>
9
+ <template #header>Response</template>
10
+ <template #content>
11
+ <div >
12
+ <div v-for="field in Object.keys(jsonschema.properties ?? {} )" class="border p-2">
13
+ <SimpleAppInput :setting="o.getField(`#/properties/${field}`)"
14
+ :input-type="autoPickInput( field )"
15
+ v-model="data[field]" />
16
+ </div>
17
+ </div>
18
+ </template>
19
+ <template #footer>
20
+ <Button class="btn-primary" @click="o.validate(validateCallBack)">{{ t('submit') }}</Button>
21
+
22
+ </template>
23
+ </Card>
24
+ </SimpleAppJsonSchemaForm>
25
+
26
+ </div>
27
+ </div>
28
+ </template>
29
+ <script lang="ts" setup>
30
+ import {UserTaskType,SimpleAppInputType} from '~/types'
31
+ import type { JSONSchema7 } from 'json-schema'
32
+ const props = defineProps<{
33
+ processName:string
34
+ taskName:string
35
+ jsonschema:JSONSchema7
36
+ instanceData:any
37
+ }>()
38
+ // props.jsonschema.properties
39
+ const modelValue = defineModel<any>({})
40
+ const emit = defineEmits(['submit'])
41
+ const validateCallBack = async (errors:any)=>{
42
+ // console.log("After validate",result)
43
+ if(!errors){
44
+ emit('submit',modelValue)
45
+ }
46
+ }
47
+
48
+ const autoPickInput = (field:string) =>{
49
+ let setting :JSONSchema7= {type:'string'}
50
+
51
+ if(props.jsonschema.properties && props.jsonschema.properties[field]){
52
+ setting = props.jsonschema.properties[field] as JSONSchema7 //force type
53
+ }
54
+
55
+
56
+ if(setting.type=='boolean'){
57
+ return SimpleAppInputType.checkbox
58
+ }if(setting.type=='number'){
59
+ return SimpleAppInputType.number
60
+ }
61
+ else if(setting.enum){
62
+ return SimpleAppInputType.select
63
+ }
64
+ else if(setting.type=='string'){
65
+ return pickStringInput(setting)
66
+ }else{
67
+ return SimpleAppInputType.text
68
+ }
69
+ }
70
+
71
+ const pickStringInput = (setting:any) =>{
72
+ switch(setting.format){
73
+ case 'date':
74
+ return SimpleAppInputType.date
75
+ break;
76
+ case 'textarea':
77
+ return SimpleAppInputType.textarea
78
+ break;
79
+ case 'text':
80
+ default:
81
+ return SimpleAppInputType.text
82
+ break;
83
+ }
84
+ }
85
+ </script>
@@ -0,0 +1,10 @@
1
+ import dynamicfield from './dynamicfield.vue'
2
+ import simpleapprove from './simpleapprove.vue'
3
+
4
+ const forms: {[key:string]:Component}={
5
+ dynamicfield:dynamicfield,
6
+ simpleapprove:simpleapprove
7
+ }
8
+
9
+ export const getFormComponent =(formkey:string)=> forms[formkey] ?? forms['dynamicfield']
10
+ export {dynamicfield,simpleapprove}
@@ -0,0 +1,43 @@
1
+ <template>
2
+ <SimpleAppJsonSchemaForm :schema="jsonschema" :data="modelValue" #default="o" >
3
+ <Card>
4
+ <template #content>
5
+ <div>
6
+ <h1>{{t('simpleApproveMessage')}}</h1>
7
+ </div>
8
+ <div >
9
+ <SimpleAppInput :setting="o.getField(`#/properties/decision`)"
10
+ :input-type="SimpleAppInputType.select"
11
+ v-model="modelValue.decision"
12
+ />
13
+ <SimpleAppInput :setting="o.getField(`#/properties/description`)"
14
+ :input-type="SimpleAppInputType.textarea"
15
+ v-model="modelValue.description"
16
+ />
17
+ </div>
18
+ </template>
19
+ <template #footer>
20
+ <Button class="btn-primary" @click="o.validate(validateCallBack)">{{ t('submit') }}</Button>
21
+ </template>
22
+ </Card>
23
+ </SimpleAppJsonSchemaForm>
24
+ </template>
25
+ <script lang="ts" setup>
26
+ import {UserTaskType,SimpleAppInputType} from '~/types'
27
+ import type { JSONSchema7 } from 'json-schema'
28
+ const props = defineProps<{
29
+ processName:string
30
+ taskName:string
31
+ jsonschema:JSONSchema7
32
+ instanceData:any
33
+ }>()
34
+ const modelValue = defineModel<{decision:string,description:string}>()
35
+
36
+ const emit = defineEmits(['submit'])
37
+ const validateCallBack = async (errors:any)=>{
38
+ // console.log("After validate",result)
39
+ if(!errors){
40
+ emit('submit',modelValue)
41
+ }
42
+ }
43
+ </script>
@@ -24,7 +24,10 @@ export default {
24
24
  suspend: 'Suspend',
25
25
  submit: 'Submit',
26
26
  decision: 'Decision',
27
-
27
+ simpleApproveMessage: 'Approve or reject',
28
+ suspendcustomer:"Suspend Customer",
29
+ formKeyNotFound:'Formkey not found "{formKey}"',
30
+
28
31
  //auto generate from schema
29
32
  <% for(let i=0; i< it.allfields.length; i++){ %>
30
33
  <% let f = it.allfields[i] %>
@@ -83,7 +83,7 @@ tailwindcss: {
83
83
  exclude: ['chart']
84
84
  },
85
85
  directives: {
86
- include: ['Ripple', 'Tooltip']
86
+ include: ['Ripple', 'Tooltip','BadgeDirective']
87
87
  },
88
88
  cssLayerOrder: 'tailwind-base, primevue, tailwind-utilities',
89
89
  importPT: { as: 'SimpleAppPT', from: path.resolve(__dirname,'./assets/primevue/passthrough.ts') },
@@ -0,0 +1 @@
1
+ put bpmn files here
@@ -0,0 +1 @@
1
+ all form for user task obtain from here
@@ -0,0 +1,72 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <bpmn:definitions xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" id="Definitions_1" targetNamespace="http://bpmn.io/schema/bpmn">
3
+ <bpmn:process id="process1" name="Suspend Customer" isExecutable="false">
4
+ <bpmn:extensionElements />
5
+ <bpmn:startEvent id="StartEvent_1">
6
+ <bpmn:outgoing>Flow_1a63g0z</bpmn:outgoing>
7
+ </bpmn:startEvent>
8
+ <bpmn:endEvent id="Event_0qpgd23">
9
+ <bpmn:incoming>Flow_1oty8vq</bpmn:incoming>
10
+ </bpmn:endEvent>
11
+ <bpmn:sequenceFlow id="Flow_1a63g0z" sourceRef="StartEvent_1" targetRef="hello1" />
12
+ <bpmn:sequenceFlow id="Flow_1rspxq4" sourceRef="hello1" targetRef="approve1" />
13
+ <bpmn:serviceTask id="hello1" name="hello1">
14
+ <bpmn:documentation>hello1 doc
15
+ bbb</bpmn:documentation>
16
+ <bpmn:incoming>Flow_1a63g0z</bpmn:incoming>
17
+ <bpmn:outgoing>Flow_1rspxq4</bpmn:outgoing>
18
+ </bpmn:serviceTask>
19
+ <bpmn:sequenceFlow id="Flow_1khvymz" sourceRef="approve1" targetRef="hello2" />
20
+ <bpmn:userTask id="approve1" name="approve1" camunda:formKey="simpleapprove" camunda:assignee="kstan">
21
+ <bpmn:documentation>approve1 doc
22
+ abc</bpmn:documentation>
23
+ <bpmn:incoming>Flow_1rspxq4</bpmn:incoming>
24
+ <bpmn:outgoing>Flow_1khvymz</bpmn:outgoing>
25
+ </bpmn:userTask>
26
+ <bpmn:sequenceFlow id="Flow_1oty8vq" sourceRef="hello2" targetRef="Event_0qpgd23" />
27
+ <bpmn:serviceTask id="hello2" name="hello2">
28
+ <bpmn:documentation>hello2 doc
29
+ ccc</bpmn:documentation>
30
+ <bpmn:incoming>Flow_1khvymz</bpmn:incoming>
31
+ <bpmn:outgoing>Flow_1oty8vq</bpmn:outgoing>
32
+ </bpmn:serviceTask>
33
+ </bpmn:process>
34
+ <bpmndi:BPMNDiagram id="BPMNDiagram_1">
35
+ <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="process1">
36
+ <bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1">
37
+ <dc:Bounds x="122" y="202" width="36" height="36" />
38
+ </bpmndi:BPMNShape>
39
+ <bpmndi:BPMNShape id="Event_0qpgd23_di" bpmnElement="Event_0qpgd23">
40
+ <dc:Bounds x="672" y="202" width="36" height="36" />
41
+ </bpmndi:BPMNShape>
42
+ <bpmndi:BPMNShape id="Activity_1trhs2m_di" bpmnElement="hello1">
43
+ <dc:Bounds x="200" y="180" width="100" height="80" />
44
+ <bpmndi:BPMNLabel />
45
+ </bpmndi:BPMNShape>
46
+ <bpmndi:BPMNShape id="Activity_0l36sc9_di" bpmnElement="approve1">
47
+ <dc:Bounds x="370" y="180" width="100" height="80" />
48
+ <bpmndi:BPMNLabel />
49
+ </bpmndi:BPMNShape>
50
+ <bpmndi:BPMNShape id="Activity_1mg3y6c_di" bpmnElement="hello2">
51
+ <dc:Bounds x="510" y="180" width="100" height="80" />
52
+ <bpmndi:BPMNLabel />
53
+ </bpmndi:BPMNShape>
54
+ <bpmndi:BPMNEdge id="Flow_1a63g0z_di" bpmnElement="Flow_1a63g0z">
55
+ <di:waypoint x="158" y="220" />
56
+ <di:waypoint x="200" y="220" />
57
+ </bpmndi:BPMNEdge>
58
+ <bpmndi:BPMNEdge id="Flow_1rspxq4_di" bpmnElement="Flow_1rspxq4">
59
+ <di:waypoint x="300" y="220" />
60
+ <di:waypoint x="370" y="220" />
61
+ </bpmndi:BPMNEdge>
62
+ <bpmndi:BPMNEdge id="Flow_1khvymz_di" bpmnElement="Flow_1khvymz">
63
+ <di:waypoint x="470" y="220" />
64
+ <di:waypoint x="510" y="220" />
65
+ </bpmndi:BPMNEdge>
66
+ <bpmndi:BPMNEdge id="Flow_1oty8vq_di" bpmnElement="Flow_1oty8vq">
67
+ <di:waypoint x="610" y="220" />
68
+ <di:waypoint x="672" y="220" />
69
+ </bpmndi:BPMNEdge>
70
+ </bpmndi:BPMNPlane>
71
+ </bpmndi:BPMNDiagram>
72
+ </bpmn:definitions>
@@ -0,0 +1,2 @@
1
+ export {simpleapprove} from './simpleapprove.jsonschema'
2
+
@@ -0,0 +1,8 @@
1
+ export const simpleapprove = {
2
+ "type": "object",
3
+ "required": ["decision"],
4
+ "properties": {
5
+ "decision": { "type": "string", "enum": ["", "approve", "reject"] },
6
+ "description": { "type": "string", "default":"" }
7
+ }
8
+ }
@@ -0,0 +1,76 @@
1
+ /**
2
+ * This file was automatically generated by simpleapp generator.
3
+ * --remove-this-line-to-prevent-override--
4
+ * last change 2023-09-23
5
+ * Author: Ks Tan
6
+ */
7
+ import { Injectable,Logger } from "@nestjs/common";
8
+ import { EventEmitter2, OnEvent } from '@nestjs/event-emitter';
9
+ import { InjectModel } from "@nestjs/mongoose";
10
+ import { Model } from "mongoose";
11
+ import { UserContext } from "../../generate/commons/user.context";
12
+ import { User } from "../../services/user.service";
13
+ import { Permission } from "../../services/perm.service";
14
+ import {SimpleAppListenerService} from './simpleapp.listener'
15
+ import {
16
+ WorkflowSettingApiSchema,
17
+ WorkflowDataApiSchema,
18
+ WorkflowProcess,
19
+ WorkflowTask,
20
+ UserTaskActors,
21
+ UserTaskType,
22
+ ServiceTaskData,
23
+ UserTaskData,
24
+ UserTaskEventType,
25
+ ServiceTaskEventType
26
+ } from '../../generate/workflow/workflow.type';
27
+
28
+
29
+ @Injectable()
30
+ export class <%=it.processName%>ListenerService extends SimpleAppListenerService{
31
+ logger = new Logger()
32
+ constructor(){
33
+ super()
34
+ }
35
+
36
+ <%for(let i=0; i<it.elements.length;i++){%>
37
+ <%let e=it.elements[i]%>
38
+ <%let datatype = e.type == "bpmn:UserTask" ? "UserTaskData" : "ServiceTaskData" %>
39
+
40
+ <%if(datatype=='UserTaskData'){%>
41
+ /**
42
+ * Execute while user task <%= e.name%> invoked (triggered by actor to next step)
43
+ * bpmn: <%=it.name%>, elementId: <%= e.id%>, taskName: <%= e.name%>, event: invoke
44
+ * documentation: <%~e.documentation%>
45
+ * @param props
46
+ */
47
+ @OnEvent('<%=it.name%>.<%= e.id%>.invoke')
48
+ async <%=`watch_${e.id}_invoke`%>(props:<%=datatype%>){
49
+ console.log("Running listener <%=it.name%>.<%= e.id%>.invoke",props)
50
+ }
51
+
52
+ /**
53
+ * Execute while user task <%= e.name%> reach wait stage (pending actor input)
54
+ * bpmn: <%=it.name%>, elementId: <%= e.id%>, taskName: <%= e.name%>, event: wait
55
+ * documentation: <%= e.documentation %>
56
+ * @param props
57
+ */
58
+ @OnEvent('<%=it.name%>.<%= e.id%>.wait')
59
+ async <%=`watch_${e.id}_wait`%>(props:<%=datatype%>){
60
+ console.log("Running listener <%=it.name%>.<%= e.id%>.wait",props)
61
+ }
62
+ <%}else if( datatype=='ServiceTaskData'){ %>
63
+
64
+ /**
65
+ * Execute ServiceTask event <%= e.name%> (start)
66
+ * bpmn: <%=it.name%>, elementId: <%= e.id%>, taskName: <%= e.name%>, event: start
67
+ * documentation: <%=e.documentation%>
68
+ * @param props
69
+ */
70
+ @OnEvent('<%=it.name%>.<%= e.id%>.start')
71
+ async <%=`watch_${e.id}_start`%>(props:<%=datatype%>){
72
+ console.log("Running listener <%=it.name%>.<%= e.id%>.start",props)
73
+ }
74
+ <%}%>
75
+ <%}%>
76
+ }