@simitgroup/simpleapp-generator 1.1.12 → 1.1.15
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.
- package/dist/buildinschemas/autoincreament.d.ts.map +1 -1
- package/dist/buildinschemas/autoincreament.js +1 -2
- package/dist/buildinschemas/autoincreament.js.map +1 -1
- package/dist/buildinschemas/docnoformat.d.ts.map +1 -1
- package/dist/buildinschemas/docnoformat.js +0 -1
- package/dist/buildinschemas/docnoformat.js.map +1 -1
- package/dist/buildinschemas/permission.d.ts.map +1 -1
- package/dist/buildinschemas/permission.js +0 -1
- package/dist/buildinschemas/permission.js.map +1 -1
- package/dist/framework.js +4 -4
- package/dist/framework.js.map +1 -1
- package/dist/generate.d.ts.map +1 -1
- package/dist/generate.js +20 -7
- package/dist/generate.js.map +1 -1
- package/dist/processors/bpmnbuilder.d.ts +2 -0
- package/dist/processors/bpmnbuilder.d.ts.map +1 -0
- package/dist/processors/bpmnbuilder.js +151 -0
- package/dist/processors/bpmnbuilder.js.map +1 -0
- package/dist/resource/camunda-moodle.d.ts +27 -0
- package/dist/resource/camunda-moodle.d.ts.map +1 -0
- package/dist/resource/camunda-moodle.js +91 -0
- package/dist/resource/camunda-moodle.js.map +1 -0
- package/dist/type.d.ts +0 -1
- package/dist/type.d.ts.map +1 -1
- package/dist/type.js.map +1 -1
- package/docs/backend.md +1 -1
- package/package.json +3 -1
- package/src/buildinschemas/autoincreament.ts +2 -3
- package/src/buildinschemas/docnoformat.ts +0 -1
- package/src/buildinschemas/permission.ts +0 -1
- package/src/framework.ts +4 -4
- package/src/generate.ts +25 -7
- package/src/processors/bpmnbuilder.ts +148 -0
- package/src/resource/camunda-moodle.ts +87 -0
- package/src/type.ts +1 -2
- package/templates/basic/nest/controller.ts.eta +3 -3
- package/templates/basic/nest/service.ts.eta +4 -6
- package/templates/basic/nuxt/pages.[id].vue.eta +4 -3
- package/templates/basic/nuxt/pages.form.vue.eta +0 -1
- package/templates/basic/nuxt/pages.landing.vue.eta +11 -11
- package/templates/basic/nuxt/pages.new.vue.eta +4 -3
- package/templates/basic/nuxt/pages.viewer.vue.eta +4 -7
- package/templates/nest/.env._eta +1 -1
- package/templates/nest/src/app.module.ts.eta +20 -2
- package/templates/nest/src/simpleapp/.gitignore.eta +2 -1
- package/templates/nest/src/simpleapp/generate/commons/user.context.ts.eta +23 -4
- package/templates/nest/src/simpleapp/generate/processors/simpleapp.processor.ts.eta +356 -294
- package/templates/nest/src/simpleapp/generate/workflow/formschema/SimpleApproveReject.ts.eta +8 -0
- package/templates/nest/src/simpleapp/generate/workflow/formschema/index.ts.eta +1 -0
- package/templates/nest/src/simpleapp/{workflow → generate/workflow}/workflow.apischema.ts.eta +17 -22
- package/templates/nest/src/simpleapp/generate/workflow/workflow.config.ts.eta +57 -0
- package/templates/nest/src/simpleapp/{workflow → generate/workflow}/workflow.controller.ts.eta +5 -6
- package/templates/nest/src/simpleapp/generate/workflow/workflow.delegate.ts.eta +153 -0
- package/templates/nest/src/simpleapp/{workflow → generate/workflow}/workflow.service.ts.eta +62 -75
- package/templates/nest/src/simpleapp/{workflow → generate/workflow}/workflow.type.ts.eta +24 -20
- package/templates/nest/src/simpleapp/simpleapp.module.ts.eta +16 -6
- package/templates/nest/src/simpleapp/workflows/bpmn/readme.md._eta +1 -0
- package/templates/nest/src/simpleapp/workflows/delegates/simpleapp.delegate.ts._eta +27 -0
- package/templates/nest/src/simpleapp/workflows/readme.md._eta +1 -0
- package/templates/nuxt/.gitignore.eta +5 -4
- package/templates/nuxt/components/header/button/task/HeaderButtonTaskList.vue.eta +47 -65
- package/templates/nuxt/components/simpleApp/SimpleAppForm.vue.eta +1 -1
- package/templates/nuxt/components/simpleApp/SimpleAppJsonSchemaForm.vue.eta +58 -23
- package/templates/nuxt/components/workflow/forms/dynamicfield.vue._eta +85 -0
- package/templates/nuxt/components/workflow/forms/index.ts._eta +10 -0
- package/templates/nuxt/components/workflow/forms/simpleapprove.vue._eta +43 -0
- package/templates/nuxt/lang/{df.ts.eta → df.ts._eta} +6 -1
- package/templates/nuxt/nuxt.config.ts.eta +1 -1
- package/templates/nuxt/simpleapp/workflows/bpmn/readme.md._eta +1 -0
- package/templates/nuxt/simpleapp/workflows/forms/readme.md._eta +1 -0
- package/templates/nuxt/types/schema.ts.eta +1 -2
- package/templates/project/groups/admin.json.eta +1 -1
- package/templates/{nest/src/simpleapp/workflow/bpmn/suspendcustomer.bpmn.eta → project/workflows/bpmn/suspendcustomer.bpmn._eta} +20 -20
- package/templates/project/workflows/forms/index.ts.eta +2 -0
- package/templates/project/workflows/forms/simpleapprove.jsonschema.ts.eta +8 -0
- package/templates/workflow/next/delegate.ts.eta +31 -0
- package/tsconfig.tsbuildinfo +1 -1
- package/buildinschemas copy/autoincreament.autoinc.jsonschema.json +0 -39
- package/buildinschemas copy/branch.branch.jsonschema.json +0 -41
- package/buildinschemas copy/docnoformat.docno.jsonschema.json +0 -23
- package/buildinschemas copy/organization.org.jsonschema.json +0 -50
- package/buildinschemas copy/permission.perm.jsonschema.json +0 -23
- package/buildinschemas copy/permission.perm.jsonschema.try.json +0 -25
- package/buildinschemas copy/tenant.tenant.jsonschema.json +0 -21
- package/buildinschemas copy/tenant.tenant.jsonschema.try.json +0 -27
- package/buildinschemas copy/user.user.jsonschema.json +0 -31
- package/src/processors/jsonschemabuilder.ts-old +0 -383
- package/templates/nest/src/simpleapp/workflow/appDelegate.ts.eta +0 -194
- package/templates/nest/src/simpleapp/workflow/configuration.ts.eta +0 -46
- package/templates/nest/src/simpleapp/workflow/delegates/customer.ts._eta +0 -8
- package/templates/nest/src/simpleapp/workflow/delegates/hello.ts._eta +0 -5
- package/templates/nest/src/simpleapp/workflow/delegates/index.ts._eta +0 -5
- package/templates/nest/src/simpleapp/workflow/delegates/invoice.delegates.ts._eta +0 -9
- package/templates/nest/src/simpleapp/workflow/delegates/usertask.ts._eta +0 -3
- package/templates/nest/src/simpleapp/workflow/formschema/SimpleApproveReject.ts.eta +0 -8
- package/templates/nest/src/simpleapp/workflow/formschema/index.ts.eta +0 -1
|
@@ -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"
|
|
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
|
|
20
|
+
{{ selectedtask?.processName }} / {{ selectedtask?.name }}
|
|
18
21
|
</div>
|
|
19
22
|
</template>
|
|
20
23
|
<template #default>
|
|
21
|
-
<div >
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
<div v-if="formSchema">
|
|
31
|
-
|
|
32
|
-
<SimpleAppJsonSchemaForm :schema="formSchema" #default="o">
|
|
33
|
-
<div v-for="field in Object.keys(formSchema.properties)" class="border p-2">
|
|
34
|
-
<SimpleAppInput :setting="o.getField(`#/properties/${field}`)"
|
|
35
|
-
:input-type="autoPickInput(formSchema.properties[field])"
|
|
36
|
-
v-model="data[field]" />
|
|
37
|
-
</div>
|
|
38
|
-
</SimpleAppJsonSchemaForm>
|
|
39
|
-
</div>
|
|
40
|
-
</template>
|
|
41
|
-
<template #footer>
|
|
42
|
-
<Button class="btn-primary" @click="invokeTask()">{{ t('submit') }}</Button>
|
|
43
|
-
|
|
44
|
-
</template>
|
|
45
|
-
</Card>
|
|
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,
|
|
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
|
-
|
|
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,49 +73,36 @@ const closeDialog = ()=>{
|
|
|
78
73
|
}
|
|
79
74
|
|
|
80
75
|
const invokeTask = async ()=>{
|
|
81
|
-
const res = await invokeUserTask(selectedtask.value
|
|
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
|
-
|
|
83
|
+
instanceData.value=task.data
|
|
84
|
+
|
|
88
85
|
const formsettings:any = await getTaskForm(task.processName, task.elementId)
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
+
})
|
|
109
103
|
}
|
|
104
|
+
|
|
110
105
|
}
|
|
111
106
|
|
|
112
|
-
|
|
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;
|
|
124
|
-
}
|
|
125
|
-
}
|
|
107
|
+
onMounted(()=>syncTask())
|
|
126
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
|
|
|
@@ -1,52 +1,43 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<form class="simpleapp-form" @submit.prevent="true">
|
|
3
3
|
<slot name="header"><h3 class="flex flex-col">{{ title }}</h3></slot>
|
|
4
|
-
<slot name="default" :getField="getField"></slot>
|
|
4
|
+
<slot name="default" :getField="getField" :validate="validate"></slot>
|
|
5
5
|
</form>
|
|
6
6
|
</template>
|
|
7
7
|
<script setup lang="ts" >
|
|
8
|
-
// import type {SimpleAppFieldSetting} from '/types'
|
|
9
|
-
import { SimpleAppClient } from '~/simpleapp/generate/clients/SimpleAppClient'
|
|
10
8
|
import type { JSONSchema7,JSONSchema7Definition } from 'json-schema';
|
|
9
|
+
import Ajv from 'ajv';
|
|
10
|
+
import addFormats from 'ajv-formats';
|
|
11
|
+
import addErrors from 'ajv-errors';
|
|
11
12
|
import _ from 'lodash'
|
|
13
|
+
|
|
12
14
|
const props = defineProps<{
|
|
13
15
|
title?:string,
|
|
14
16
|
schema:JSONSchema7,
|
|
17
|
+
data:any,
|
|
15
18
|
// document: SimpleAppClient<any,any>
|
|
16
19
|
readonly?:boolean
|
|
17
20
|
}>()
|
|
18
21
|
if(!props.schema){
|
|
19
22
|
throw "undefine jsonschema property 'schema'"
|
|
20
23
|
}
|
|
21
|
-
|
|
24
|
+
const formerrors = ref<any>({})
|
|
22
25
|
const getField = (path:string)=>{
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
// console.log("setting",fieldsetting)
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
return {
|
|
26
|
+
const schema = props.schema
|
|
27
|
+
const fieldsetting = getPathObject(schema,path)
|
|
28
|
+
|
|
29
|
+
return {
|
|
31
30
|
path: path,
|
|
32
31
|
key: _.last(path.split('/')),
|
|
33
32
|
instancepath: getInstancePath(schema,path),
|
|
34
|
-
fieldsetting: fieldsetting,
|
|
35
|
-
// modelObject: data,
|
|
36
|
-
// document: props.document,
|
|
37
|
-
// apiObj:props.document.getApi(),
|
|
38
|
-
// modelField: 'email',
|
|
33
|
+
fieldsetting: fieldsetting,
|
|
39
34
|
isrequired: getIsRequired(schema,path),
|
|
40
|
-
|
|
35
|
+
errors: formerrors,
|
|
41
36
|
readonly: props.readonly
|
|
42
37
|
} //as SimpleAppFieldSetting
|
|
43
38
|
}
|
|
44
39
|
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
const getModelValue=(data:any,path:string)=>{
|
|
48
|
-
|
|
49
|
-
}
|
|
40
|
+
|
|
50
41
|
const getIsRequired=(schema:any,path:string)=>{
|
|
51
42
|
if(!path){
|
|
52
43
|
console.error('unknown path')
|
|
@@ -130,4 +121,48 @@ import _ from 'lodash'
|
|
|
130
121
|
|
|
131
122
|
}
|
|
132
123
|
}
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
const validate=(callback:Function) => {
|
|
127
|
+
const ajv = new Ajv({ allErrors: true });
|
|
128
|
+
addFormats(ajv);
|
|
129
|
+
addErrors(ajv)
|
|
130
|
+
|
|
131
|
+
ajv.addFormat('tel',/^$|^\d{7,15}$/gm)
|
|
132
|
+
ajv.addFormat('text',/.*$/)
|
|
133
|
+
ajv.addFormat('html',/.*$/)
|
|
134
|
+
ajv.addFormat('documentno',/.*$/)
|
|
135
|
+
|
|
136
|
+
ajv.addKeyword({ keyword: 'x-foreignkey', schemaType: 'string' });
|
|
137
|
+
ajv.addKeyword({ keyword: 'x-simpleapp-config', schemaType: 'object' });
|
|
138
|
+
|
|
139
|
+
|
|
140
|
+
// this.errorlist.value = {};
|
|
141
|
+
// this.hook('pre-validation', this.data.value);
|
|
142
|
+
const validate = ajv.compile(props.schema);
|
|
143
|
+
console.log("validate data",props.data)
|
|
144
|
+
const valid = validate(props.data);
|
|
145
|
+
if (!valid) {
|
|
146
|
+
const errors = validate.errors;
|
|
147
|
+
const tmp: { [key: string]: any } = {};
|
|
148
|
+
if (errors) {
|
|
149
|
+
for (let i = 0; i < errors?.length; i++) {
|
|
150
|
+
const key: string = errors[i]['instancePath'];
|
|
151
|
+
if (!tmp[key]) {
|
|
152
|
+
tmp[key] = [];
|
|
153
|
+
}
|
|
154
|
+
tmp[key].push(errors[i]);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
formerrors.value = tmp;
|
|
158
|
+
console.error(formerrors.value );
|
|
159
|
+
|
|
160
|
+
// return validate.errors;
|
|
161
|
+
callback(formerrors.value )
|
|
162
|
+
} else {
|
|
163
|
+
// this.hook('post-validation', this.data.value);
|
|
164
|
+
callback(false)
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
|
|
133
168
|
</script>
|
|
@@ -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>
|
|
@@ -22,7 +22,12 @@ export default {
|
|
|
22
22
|
setting: 'Setting',
|
|
23
23
|
mytasks: 'My Tasks',
|
|
24
24
|
suspend: 'Suspend',
|
|
25
|
-
|
|
25
|
+
submit: 'Submit',
|
|
26
|
+
decision: 'Decision',
|
|
27
|
+
simpleApproveMessage: 'Approve or reject',
|
|
28
|
+
suspendcustomer:"Suspend Customer",
|
|
29
|
+
formKeyNotFound:'Formkey not found "{formKey}"',
|
|
30
|
+
|
|
26
31
|
//auto generate from schema
|
|
27
32
|
<% for(let i=0; i< it.allfields.length; i++){ %>
|
|
28
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
|
|
@@ -12,8 +12,7 @@ export type DocumentStatus = {
|
|
|
12
12
|
queryPara?:string[] //what query parameter wish to accept, example: ['description','date']
|
|
13
13
|
requiredRole?: string[] // what special user role wish to allow for this api, example: ['SuperUser']
|
|
14
14
|
workflowSetting?: {bpmn:string} //optional property, once define code gen connect the bpmn workflow
|
|
15
|
-
method:RESTMethods
|
|
16
|
-
execute:string, //what service class method name to execute, example: 'ping','getDocumentName'
|
|
15
|
+
method:RESTMethods
|
|
17
16
|
description:string //description of api
|
|
18
17
|
}
|
|
19
18
|
export enum IsolationType {"none"="none" , "tenant"="tenant","org"="org", "branch"="branch"}
|
|
@@ -1,52 +1,52 @@
|
|
|
1
1
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
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="
|
|
3
|
+
<bpmn:process id="process1" name="Suspend Customer" isExecutable="false">
|
|
4
4
|
<bpmn:extensionElements />
|
|
5
5
|
<bpmn:startEvent id="StartEvent_1">
|
|
6
6
|
<bpmn:outgoing>Flow_1a63g0z</bpmn:outgoing>
|
|
7
7
|
</bpmn:startEvent>
|
|
8
8
|
<bpmn:endEvent id="Event_0qpgd23">
|
|
9
|
-
<bpmn:incoming>
|
|
9
|
+
<bpmn:incoming>Flow_1g3iygg</bpmn:incoming>
|
|
10
10
|
</bpmn:endEvent>
|
|
11
|
-
<bpmn:sequenceFlow id="Flow_1x9zeai" sourceRef="approve1" targetRef="
|
|
11
|
+
<bpmn:sequenceFlow id="Flow_1x9zeai" sourceRef="approve1" targetRef="Activity_0pu51x5" />
|
|
12
12
|
<bpmn:sequenceFlow id="Flow_1a63g0z" sourceRef="StartEvent_1" targetRef="approve1" />
|
|
13
|
-
<bpmn:userTask id="approve1" name="approve by supervisor" camunda:formKey="
|
|
13
|
+
<bpmn:userTask id="approve1" name="approve by supervisor" camunda:formKey="form://simpleapprove" camunda:assignee="kstan">
|
|
14
14
|
<bpmn:extensionElements />
|
|
15
15
|
<bpmn:incoming>Flow_1a63g0z</bpmn:incoming>
|
|
16
16
|
<bpmn:outgoing>Flow_1x9zeai</bpmn:outgoing>
|
|
17
17
|
</bpmn:userTask>
|
|
18
|
-
<bpmn:sequenceFlow id="
|
|
19
|
-
<bpmn:serviceTask id="
|
|
18
|
+
<bpmn:sequenceFlow id="Flow_1g3iygg" sourceRef="Activity_0pu51x5" targetRef="Event_0qpgd23" />
|
|
19
|
+
<bpmn:serviceTask id="Activity_0pu51x5" name="hello" camunda:delegateExpression="system.hello">
|
|
20
20
|
<bpmn:incoming>Flow_1x9zeai</bpmn:incoming>
|
|
21
|
-
<bpmn:outgoing>
|
|
21
|
+
<bpmn:outgoing>Flow_1g3iygg</bpmn:outgoing>
|
|
22
22
|
</bpmn:serviceTask>
|
|
23
23
|
</bpmn:process>
|
|
24
24
|
<bpmndi:BPMNDiagram id="BPMNDiagram_1">
|
|
25
|
-
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="
|
|
25
|
+
<bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="process1">
|
|
26
26
|
<bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="StartEvent_1">
|
|
27
|
-
<dc:Bounds x="
|
|
27
|
+
<dc:Bounds x="122" y="202" width="36" height="36" />
|
|
28
28
|
</bpmndi:BPMNShape>
|
|
29
29
|
<bpmndi:BPMNShape id="Event_0qpgd23_di" bpmnElement="Event_0qpgd23">
|
|
30
|
-
<dc:Bounds x="
|
|
30
|
+
<dc:Bounds x="672" y="202" width="36" height="36" />
|
|
31
31
|
</bpmndi:BPMNShape>
|
|
32
32
|
<bpmndi:BPMNShape id="Activity_1odv9ki_di" bpmnElement="approve1">
|
|
33
|
-
<dc:Bounds x="
|
|
33
|
+
<dc:Bounds x="200" y="180" width="100" height="80" />
|
|
34
34
|
<bpmndi:BPMNLabel />
|
|
35
35
|
</bpmndi:BPMNShape>
|
|
36
|
-
<bpmndi:BPMNShape id="
|
|
37
|
-
<dc:Bounds x="
|
|
36
|
+
<bpmndi:BPMNShape id="Activity_1tksj2t_di" bpmnElement="Activity_0pu51x5">
|
|
37
|
+
<dc:Bounds x="520" y="180" width="100" height="80" />
|
|
38
38
|
</bpmndi:BPMNShape>
|
|
39
39
|
<bpmndi:BPMNEdge id="Flow_1x9zeai_di" bpmnElement="Flow_1x9zeai">
|
|
40
|
-
<di:waypoint x="
|
|
41
|
-
<di:waypoint x="
|
|
40
|
+
<di:waypoint x="300" y="220" />
|
|
41
|
+
<di:waypoint x="520" y="220" />
|
|
42
42
|
</bpmndi:BPMNEdge>
|
|
43
43
|
<bpmndi:BPMNEdge id="Flow_1a63g0z_di" bpmnElement="Flow_1a63g0z">
|
|
44
|
-
<di:waypoint x="
|
|
45
|
-
<di:waypoint x="
|
|
44
|
+
<di:waypoint x="158" y="220" />
|
|
45
|
+
<di:waypoint x="200" y="220" />
|
|
46
46
|
</bpmndi:BPMNEdge>
|
|
47
|
-
<bpmndi:BPMNEdge id="
|
|
48
|
-
<di:waypoint x="
|
|
49
|
-
<di:waypoint x="
|
|
47
|
+
<bpmndi:BPMNEdge id="Flow_1g3iygg_di" bpmnElement="Flow_1g3iygg">
|
|
48
|
+
<di:waypoint x="620" y="220" />
|
|
49
|
+
<di:waypoint x="672" y="220" />
|
|
50
50
|
</bpmndi:BPMNEdge>
|
|
51
51
|
</bpmndi:BPMNPlane>
|
|
52
52
|
</bpmndi:BPMNDiagram>
|
|
@@ -0,0 +1,31 @@
|
|
|
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 { InjectModel } from "@nestjs/mongoose";
|
|
9
|
+
import { Model } from "mongoose";
|
|
10
|
+
import { UserContext } from "../../generate/commons/user.context";
|
|
11
|
+
import { User } from "../../services/user.service";
|
|
12
|
+
import { Permission } from "../../services/perm.service";
|
|
13
|
+
import {SimpleAppDelegateService} from './simpleapp.delegate'
|
|
14
|
+
|
|
15
|
+
let mydelegate:<%=it.processName%>DelegateService
|
|
16
|
+
@Injectable()
|
|
17
|
+
export class <%=it.processName%>DelegateService extends SimpleAppDelegateService{
|
|
18
|
+
logger = new Logger()
|
|
19
|
+
constructor(){
|
|
20
|
+
super()
|
|
21
|
+
mydelegate=this
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
<%for(let i=0; i<it.delegates.length;i++){%>
|
|
25
|
+
<%let delegate=it.delegates[i]%>
|
|
26
|
+
async <%=delegate%>(props,item){
|
|
27
|
+
console.log("Execute delegate at process: ",'<%=it.processName%>, delegate: ','<%=delegate%>' ,props)
|
|
28
|
+
}
|
|
29
|
+
<%}%>
|
|
30
|
+
|
|
31
|
+
}
|