@simitgroup/simpleapp-generator 1.0.59 → 1.0.60
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/branch.d.ts.map +1 -1
- package/dist/buildinschemas/branch.js +1 -0
- package/dist/buildinschemas/branch.js.map +1 -1
- package/dist/buildinschemas/organization.d.ts.map +1 -1
- package/dist/buildinschemas/organization.js +1 -0
- package/dist/buildinschemas/organization.js.map +1 -1
- package/dist/buildinschemas/permission.js +1 -1
- package/dist/buildinschemas/permission.js.map +1 -1
- package/dist/buildinschemas/user.d.ts.map +1 -1
- package/dist/buildinschemas/user.js +4 -1
- package/dist/buildinschemas/user.js.map +1 -1
- package/dist/framework.js +1 -1
- package/dist/framework.js.map +1 -1
- package/dist/generate.js +6 -1
- package/dist/generate.js.map +1 -1
- package/dist/type.d.ts +1 -0
- package/dist/type.d.ts.map +1 -1
- package/docs/jsonschema.md +1 -0
- package/package.json +1 -1
- package/src/buildinschemas/branch.ts +1 -0
- package/src/buildinschemas/organization.ts +1 -0
- package/src/buildinschemas/permission.ts +1 -1
- package/src/buildinschemas/user.ts +4 -1
- package/src/framework.ts +1 -1
- package/src/generate.ts +6 -1
- package/src/type.ts +1 -0
- package/templates/basic/nest/controller.ts.eta +5 -3
- package/templates/basic/nest/model.ts.eta +32 -7
- package/templates/basic/nuxt/pages.crud.vue.eta +59 -163
- package/templates/basic/nuxt/pages.index.vue.eta +225 -0
- package/templates/nest/.env._eta +1 -0
- package/templates/nest/src/simpleapp/generate/commons/exceptions/SimpleAppExceptionFilter.ts.eta +1 -1
- package/templates/nest/src/simpleapp/generate/commons/roles/roles.group.ts.eta +1 -1
- package/templates/nest/src/simpleapp/generate/commons/user.context.ts.eta +127 -22
- package/templates/nest/src/simpleapp/generate/processors/simpleapp.processor.ts.eta +1 -1
- package/templates/nest/src/simpleapp/profile/profile.controller.ts.eta +25 -2
- package/templates/nest/src/simpleapp/profile/profile.service.ts.eta +20 -2
- package/templates/nest/src/simpleapp/services/branch.service.ts.eta +41 -40
- package/templates/nest/src/simpleapp/services/user.service.ts.eta +10 -9
- package/templates/nuxt/app.vue.eta +2 -1
- package/templates/nuxt/assets/css/style.css._eta +3 -12
- package/templates/nuxt/assets/primevue/passthrough.ts._eta +24 -20
- package/templates/nuxt/components/ButtonCreateTenant.vue.eta +30 -23
- package/templates/nuxt/components/ButtonHome.vue.eta +15 -2
- package/templates/nuxt/components/ButtonMenuPicker.vue.eta +5 -20
- package/templates/nuxt/components/ButtonPermissionInfo.vue.eta +5 -7
- package/templates/nuxt/components/ButtonProfile.vue.eta +42 -25
- package/templates/nuxt/components/CrudSimple.vue.eta +1 -1
- package/templates/nuxt/components/EventDecision.vue.eta +115 -0
- package/templates/nuxt/components/EventNotification.vue.eta +157 -0
- package/templates/nuxt/components/HeaderBar.vue.eta +2 -2
- package/templates/nuxt/components/Invitation.vue.eta +3 -3
- package/templates/nuxt/components/SelectBranch.vue.eta +5 -2
- package/templates/nuxt/components/SimpleAppDatatable.vue.eta +151 -5
- package/templates/nuxt/components/TenantPicker.vue.eta +75 -0
- package/templates/nuxt/components/UserProfileListItem.vue.eta +65 -0
- package/templates/nuxt/components/renderers/BooleanRender.vue.eta +7 -0
- package/templates/nuxt/components/renderers/DateRender.vue.eta +6 -0
- package/templates/nuxt/components/renderers/ForeignKeyRender.vue.eta +10 -0
- package/templates/nuxt/components/renderers/MoneyRender.vue.eta +7 -0
- package/templates/nuxt/components/renderers/MultiTextRender.vue.eta +11 -0
- package/templates/nuxt/composables/getDocument.generate.ts.eta +4 -0
- package/templates/nuxt/composables/getMenus.generate.ts.eta +35 -31
- package/templates/nuxt/composables/getUserStore.generate.ts.eta +6 -1
- package/templates/nuxt/composables/goTo.generate.ts.eta +15 -0
- package/templates/nuxt/composables/notifications.generate.ts.eta +21 -0
- package/templates/nuxt/composables/stringHelper.generate.ts.eta +11 -1
- package/templates/nuxt/error.vue._eta +20 -5
- package/templates/nuxt/layouts/documentlist.vue.eta +166 -0
- package/templates/nuxt/middleware/30.acl.global.ts.eta +4 -1
- package/templates/nuxt/pages/[xorg]/organization/index.vue.eta +4 -4
- package/templates/nuxt/pages/[xorg]/profile.vue.eta +6 -0
- package/templates/nuxt/pages/[xorg]/user/[id].vue.eta +6 -0
- package/templates/nuxt/pages/[xorg]/user/index.vue.eta +211 -377
- package/templates/nuxt/pages/[xorg]/user.vue.eta +197 -0
- package/templates/nuxt/pages/index.vue._eta +101 -0
- package/templates/nuxt/pages/profile.vue.eta +94 -0
- package/templates/nuxt/plugins/10.simpleapp-event.ts.eta +4 -4
- package/templates/nuxt/plugins/20.simpleapp-userstore.ts.eta +11 -10
- package/templates/nuxt/simpleapp/generate/clients/SimpleAppClient.ts.eta +69 -17
- package/templates/nuxt/simpleapp/generate/commons/documents.ts.eta +6 -3
- package/templates/nuxt/tailwind.config.ts._eta +10 -0
- package/templates/nuxt/types/documentlist.ts.eta +9 -0
- package/templates/nuxt/types/events.ts.eta +20 -0
- package/templates/nuxt/types/index.ts.eta +6 -79
- package/templates/nuxt/types/notifications.ts.eta +16 -0
- package/templates/nuxt/types/others.ts.eta +42 -0
- package/templates/nuxt/types/user.ts.eta +44 -0
- package/tsconfig.tsbuildinfo +1 -1
- package/templates/nest/src/simpleapp/generate/models/perm.model.ts.eta +0 -52
- package/templates/nest/src/simpleapp/generate/models/tenant.model.ts.eta +0 -43
- package/templates/nest/src/simpleapp/generate/models/user.model.ts.eta +0 -56
- package/templates/nuxt/components/EventMonitor.vue.eta +0 -85
- package/templates/nuxt/pages/[xorg]/tenant/index.vue.eta +0 -89
- package/templates/nuxt/pages/index.vue.eta +0 -116
- package/templates/nuxt/simpleapp/generate/commons/events.ts.eta +0 -11
|
@@ -6,181 +6,77 @@
|
|
|
6
6
|
* last change 2023-09-09
|
|
7
7
|
* author: Ks Tan
|
|
8
8
|
*/
|
|
9
|
-
<%
|
|
9
|
+
<% const skipcolumns = ['_id','createdby','created','updatedby','updated','orgId','branchId','tenantId','doctype'] %>
|
|
10
10
|
//import {InputTableColumnType,InputTableColumn} from "~/components/type";
|
|
11
11
|
import Column from "primevue/column";
|
|
12
|
+
import MultiTextRender from '~/components/renderers/MultiTextRender.vue'
|
|
13
|
+
import BooleanRender from '~/components/renderers/BooleanRender.vue'
|
|
14
|
+
import DateRender from '~/components/renderers/DateRender.vue'
|
|
15
|
+
import ForeignKeyRender from '~/components/renderers/ForeignKeyRender.vue'
|
|
16
|
+
|
|
12
17
|
const {$<%= it.typename %>Doc } = useNuxtApp();
|
|
13
18
|
const doc = $<%= it.typename %>Doc()
|
|
14
19
|
const data = doc.getReactiveData();
|
|
15
|
-
const
|
|
16
|
-
|
|
20
|
+
const visible = ref(false)
|
|
21
|
+
|
|
22
|
+
definePageMeta({
|
|
23
|
+
name: '<%= it.typename %>',
|
|
24
|
+
layout:'documentlist',
|
|
25
|
+
documentName: '<%= it.typename.toLowerCase() %>',
|
|
26
|
+
columns: [<%Object.keys(it.jsonschema.properties).forEach(function(key) { %>
|
|
17
27
|
<%let obj=it.jsonschema.properties[key] %>
|
|
18
28
|
<%if(skipcolumns.indexOf(key)>=0){%>/* skip system columns <%=key%>*/
|
|
19
|
-
<%} else if(['string','number','integer'].indexOf(obj.type)>=0){%>'<%=key%>'
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
<% if(obj.type=='array' && obj.items.type=='object' && obj.items['properties']){ %>
|
|
28
|
-
<%let tablefields = Object.keys(obj.items.properties) %>
|
|
29
|
-
const <%=it.name%>_<%=key%> :InputTableColumn[] = [
|
|
30
|
-
<% for(let a=0;a<tablefields.length;a++){%>
|
|
31
|
-
{type:InputTableColumnType.field, field:'<%= tablefields[a] %>',style:'width:10%'},
|
|
29
|
+
<%} else if(['string','number','integer'].indexOf(obj.type)>=0){%>'<%=key%>',
|
|
30
|
+
<%} else if(obj.type =='object' && obj['x-foreignkey'] ){%>
|
|
31
|
+
{
|
|
32
|
+
title:'<%=capitalizeFirstLetter(key)%>',
|
|
33
|
+
field:'<%=key%>',
|
|
34
|
+
component:ForeignKeyRender,
|
|
35
|
+
componentSetting:{collection:'<%=key%>' }
|
|
36
|
+
},
|
|
32
37
|
<%}%>
|
|
33
|
-
|
|
38
|
+
<%})%>],
|
|
39
|
+
sorts:[
|
|
40
|
+
<%if(it.jsonschema['x-simpleapp-config'] && it.jsonschema['x-simpleapp-config']['uniqueKey']){%>
|
|
41
|
+
['<%=it.jsonschema['x-simpleapp-config']['uniqueKey']%>','asc'],
|
|
34
42
|
<%}%>
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
:listColumns="columns">
|
|
43
|
+
|
|
44
|
+
]
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
const newData = () => {
|
|
48
|
+
doc.setNew()
|
|
49
|
+
goTo(doc.getDocName(),undefined,'new=1')
|
|
50
|
+
visible.value=true
|
|
51
|
+
};
|
|
45
52
|
|
|
46
|
-
<%Object.keys(it.jsonschema.properties).forEach(function(key) { %>
|
|
47
|
-
|
|
48
|
-
<% let obj=it.jsonschema.properties[key] %>
|
|
49
|
-
<% if(skipcolumns.indexOf(key)>=0){ %>
|
|
50
|
-
<% } else if(obj.type=='boolean'){ %>
|
|
51
|
-
<SimpleAppCheckbox autofocus :setting="o.getField('#/properties/<%= key %>')" v-model="data.<%= key %>"/>
|
|
52
|
-
<% } else if(obj.type=='number' || obj.type=='integer'){ %>
|
|
53
|
-
<SimpleAppNumber autofocus :setting="o.getField('#/properties/<%= key %>')" v-model="data.<%= key %>"/>
|
|
54
|
-
<% } else if(obj.type=='array' && obj.items && obj.items.type =='string' ){ %>
|
|
55
|
-
<SimpleAppChip autofocus :setting="o.getField('#/properties/<%= key %>')" v-model="data.<%= key %>"/>
|
|
56
|
-
<% } else if(obj.type=='object' && typeof obj['x-foreignkey']!='undefined'){ %>
|
|
57
|
-
<SimpleAppAutocomplete :setting="o.getField('#/properties/<%= key %>')"
|
|
58
|
-
v-model="data.<%= key %>" optionLabel="label" :remote-src="getAutocomplete('<%=obj['x-foreignkey']%>')"/>
|
|
59
|
-
<% } else if(obj.type=='string'){ %>
|
|
60
|
-
<% if(obj.format=='documentno'){ %>
|
|
61
|
-
<SimpleAppDocumentNo autofocus :setting="o.getField('#/properties/<%= key %>')" v-model="data.<%= key %>" v-model:docNoFormat="data.docNoFormat" />
|
|
62
|
-
<% }else if(obj.format=='date'){ %>
|
|
63
|
-
<SimpleAppText type="<%=obj.format%>" autofocus :setting="o.getField('#/properties/<%= key %>')" v-model="data.<%= key %>"/>
|
|
64
|
-
<% } else if(obj.format=='text'){ %>
|
|
65
|
-
<SimpleAppTextarea :setting="o.getField('#/properties/<%= key %>')" v-model="data.<%= key %>"/>
|
|
66
|
-
<% } else if(obj.format=='html'){ %>
|
|
67
|
-
<SimpleAppEditor editorStyle="height: 320px" :setting="o.getField('#/properties/<%= key %>')" v-model="data.<%= key %>"/>
|
|
68
|
-
<% } else if(obj.format=='email'){ %>
|
|
69
|
-
<SimpleAppText autofocus type="<%=obj.type%>" :setting="o.getField('#/properties/<%= key %>')" v-model="data.<%= key %>"/>
|
|
70
|
-
<% } else if(obj.enum){ %>
|
|
71
|
-
<SimpleAppSelect autofocus :setting="o.getField('#/properties/<%= key %>')" v-model="data.<%= key %>"/>
|
|
72
|
-
<% } else if(obj['anyOf']){ %>
|
|
73
|
-
<% for(let f = 0; f < obj['anyOf'].length; f++){ %>
|
|
74
|
-
<%if(obj['anyOf'][f]['format']){ %>
|
|
75
|
-
<SimpleAppText type='<%=obj['anyOf'][f]['format']%>' autofocus :setting="o.getField('#/properties/<%= key %>')" v-model="data.<%= key %>"/>
|
|
76
|
-
<%}%>
|
|
77
|
-
<%}%>
|
|
78
|
-
<% } else if(obj['oneOf']){ %>
|
|
79
|
-
<% for(let f = 0; f < obj['oneOf'].length; f++){ %>
|
|
80
|
-
<%if(obj['oneOf'][f]['format']){ %>
|
|
81
|
-
<SimpleAppText type='<%=obj['oneOf'][f]['format']%>' autofocus :setting="o.getField('#/properties/<%= key %>')" v-model="data.<%= key %>"/>
|
|
82
|
-
<%}%>
|
|
83
|
-
<%}%>
|
|
84
53
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
<SimpleAppValue :setting="o.getField('#/properties/<%= key %>')">
|
|
90
|
-
<%Object.keys(obj.properties).forEach(function(skey) { %>
|
|
91
|
-
<% let sobj=obj.properties[skey] %>
|
|
92
|
-
<% let fieldpath=`o.getField('#/properties/${key}/properties/${skey}')` %>
|
|
93
|
-
<% let vmodel=`data.${key}.${skey}` %>
|
|
94
|
-
<% let instancePath=`#/${key}/${skey}` %>
|
|
54
|
+
const exitRecord = ()=>{
|
|
55
|
+
goTo(doc.getDocName())
|
|
56
|
+
console.log("exitRecord")
|
|
57
|
+
}
|
|
95
58
|
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
<% } else {%>
|
|
117
|
-
<SimpleAppText autofocus :setting="<%~fieldpath%>" instancePath="<%=instancePath%>" v-model="<%= vmodel %>"/>
|
|
118
|
-
<% }%>
|
|
119
|
-
<% } %>
|
|
120
|
-
<%})%>
|
|
121
|
-
</SimpleAppValue>
|
|
122
|
-
<% } else if(obj.type=='array' && obj.items.type=='object'){%>
|
|
123
|
-
<SimpleAppInputTable :getAutocomplete="getAutocomplete" :getField="o.getField" class="col-span-4"
|
|
124
|
-
:setting="o.getField('#/properties/<%=key%>')" v-model="data.<%=key%>">
|
|
125
|
-
<%let tablefields = Object.keys(obj.items.properties) %>
|
|
126
|
-
<% for(let a=0;a<tablefields.length;a++){%>
|
|
127
|
-
<%let col= tablefields[a] %>
|
|
128
|
-
<% if(skipcolumns.includes(col)){ continue}%>
|
|
129
|
-
<%let subobj = obj.items.properties[col] %>
|
|
130
|
-
<column field="<%=col%>" #body="{index}" :header="camelCaseToWords('<%=col%>')">
|
|
131
|
-
<%if(subobj['x-foreignkey']){%>
|
|
132
|
-
<SimpleAppAutocomplete v-model="data.<%=key%>[index].<%=col%>"
|
|
133
|
-
:setting="o.getField('#/properties/<%=key%>/items/properties/<%=col%>')"
|
|
134
|
-
:remoteSrc="getAutocomplete('<%=subobj[`x-foreignkey`]%>')"
|
|
135
|
-
optionLabel="label"
|
|
136
|
-
:hidelabel="true"
|
|
137
|
-
:instancePath="`/<%=key%>/${index}/<%=col%>`"/>
|
|
138
|
-
<% } else if(subobj.type=='boolean'){%>
|
|
139
|
-
<SimpleAppCheckbox v-model="data.<%=key%>[index].<%=col%>"
|
|
140
|
-
:setting="o.getField('#/properties/<%=key%>/items/properties/<%=col%>')"
|
|
141
|
-
:hidelabel="true"
|
|
142
|
-
:instancePath="`/<%=key%>/${index}/<%=col%>`"/>
|
|
143
|
-
<% } else if(subobj.type=='number' || subobj.type=='integer'){%>
|
|
144
|
-
<SimpleAppNumber v-model="data.<%=key%>[index].<%=col%>"
|
|
145
|
-
:setting="o.getField('#/properties/<%=key%>/items/properties/<%=col%>')"
|
|
146
|
-
:hidelabel="true"
|
|
147
|
-
:instancePath="`/<%=key%>/${index}/<%=col%>`"/>
|
|
148
|
-
<%} else if(subobj.type=='string' && subobj.format){%>
|
|
149
|
-
<SimpleAppText v-model="data.<%=key%>[index].<%=col%>"
|
|
150
|
-
:setting="o.getField('#/properties/<%=key%>/items/properties/<%=col%>')"
|
|
151
|
-
text="subobj.format"
|
|
152
|
-
:hidelabel="true"
|
|
153
|
-
:instancePath="`/<%=key%>/${index}/<%=col%>`"/>
|
|
154
|
-
<%} else if(subobj.type=='string' && subobj['enum']){%>
|
|
155
|
-
<SimpleAppSelect v-model="data.<%=key%>[index].<%=col%>"
|
|
156
|
-
:setting="o.getField('#/properties/<%=key%>/items/properties/<%=col%>')"
|
|
157
|
-
:hidelabel="true"
|
|
158
|
-
:instancePath="`/<%=key%>/${index}/<%=col%>`"/>
|
|
159
|
-
<%} else if(subobj.type=='string' ){%>
|
|
160
|
-
<SimpleAppText v-model="data.<%=key%>[index].<%=col%>"
|
|
161
|
-
:setting="o.getField('#/properties/<%=key%>/items/properties/<%=col%>')"
|
|
162
|
-
:hidelabel="true"
|
|
163
|
-
:instancePath="`/<%=key%>/${index}/<%=col%>`"/>
|
|
164
|
-
<%} else if(subobj.type=='number'){%>
|
|
165
|
-
<SimpleAppDynamicInput v-model="data.<%=key%>[index].<%=col%>"
|
|
166
|
-
:setting="o.getField('#/properties/<%=key%>/items/properties/<%=col%>')"
|
|
167
|
-
:hidelabel="true"
|
|
168
|
-
:instancePath="`/<%=key%>/${index}/<%=col%>`"/>
|
|
169
|
-
<%}%>
|
|
170
|
-
</column>
|
|
171
|
-
<%}%>
|
|
172
|
-
<column #body="{index}" header="Delete">
|
|
173
|
-
<Button class="btn-danger" type="button" @click="data.<%=key%>.splice(index,1)">X</Button>
|
|
174
|
-
</column>
|
|
175
|
-
</SimpleAppInputTable>
|
|
176
|
-
<% } else{%>
|
|
177
|
-
<!-- Can auto generate <%=obj.key %> -->
|
|
178
|
-
<!-- <%~ JSON.stringify(obj) %>-->
|
|
179
|
-
<%}%>
|
|
180
|
-
<%})%>
|
|
181
|
-
|
|
182
|
-
</CrudSimple>
|
|
59
|
+
watch(()=> useRoute().fullPath ,(newvalue,oldvalue)=>{
|
|
60
|
+
visible.value = useRoute().params.id ? true : false
|
|
61
|
+
})
|
|
62
|
+
|
|
63
|
+
onNuxtReady(()=>{
|
|
64
|
+
visible.value = useRoute().params.id || useRoute().query.new=='1' ? true : false;
|
|
65
|
+
})
|
|
66
|
+
</script>
|
|
67
|
+
<template>
|
|
68
|
+
<div>
|
|
69
|
+
<Button class="bg-primary-600 hover:bg-primary-400 text-white" v-if="canPerform(String(useRoute().meta.name),'create')" @click="newData">New</Button>
|
|
70
|
+
<Dialog v-model:visible="visible"
|
|
71
|
+
:pt="{root:{class:'w-full h-full bg-white'}}"
|
|
72
|
+
modal :header="doc.getDocName()"
|
|
73
|
+
:autoZIndex="false"
|
|
74
|
+
@update:visible="exitRecord"
|
|
75
|
+
>
|
|
76
|
+
<NuxtPage />
|
|
77
|
+
</Dialog>
|
|
78
|
+
<!-- -->
|
|
183
79
|
</div>
|
|
184
|
-
|
|
80
|
+
</template>
|
|
185
81
|
|
|
186
82
|
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
<% const skipcolumns = ['_id','createdby','created','updatedby','updated','orgId','branchId','tenantId','doctype'] %>
|
|
2
|
+
<script setup lang="ts">
|
|
3
|
+
/**
|
|
4
|
+
* This file was automatically generated by simpleapp everytime regenerate code.
|
|
5
|
+
* delete file "delete-me-for-avoid-override" if you want to modify this file and
|
|
6
|
+
* prevent regenerate code override it.
|
|
7
|
+
* last change 2023-09-09
|
|
8
|
+
* author: Ks Tan
|
|
9
|
+
*/
|
|
10
|
+
import ConfirmPopup from 'primevue/confirmpopup';
|
|
11
|
+
import { useConfirm } from "primevue/useconfirm";
|
|
12
|
+
const confirm = useConfirm();
|
|
13
|
+
|
|
14
|
+
const {$<%= it.typename %>Doc,$event } = useNuxtApp();
|
|
15
|
+
const doc = $<%= it.typename %>Doc()
|
|
16
|
+
const data = doc.getReactiveData();
|
|
17
|
+
|
|
18
|
+
const fetchRecord = async (id:string) =>{
|
|
19
|
+
await doc.getById(id)
|
|
20
|
+
}
|
|
21
|
+
onMounted(()=>{
|
|
22
|
+
const id = String(useRoute().params.id);
|
|
23
|
+
fetchRecord(id);
|
|
24
|
+
})
|
|
25
|
+
const disabled = computed(()=>{
|
|
26
|
+
return false
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
const createData = async () => {
|
|
30
|
+
// disabled.value=true
|
|
31
|
+
|
|
32
|
+
doc.create().then((res)=>{
|
|
33
|
+
//refresh()
|
|
34
|
+
goTo(doc.getDocName(),res.data._id)
|
|
35
|
+
}).catch(err=>{
|
|
36
|
+
console.error(err)
|
|
37
|
+
})
|
|
38
|
+
|
|
39
|
+
};
|
|
40
|
+
const updateData = async () => {
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
doc.update().then(()=>{
|
|
44
|
+
// visible.value=false
|
|
45
|
+
refresh()
|
|
46
|
+
}).catch(err=>{
|
|
47
|
+
console.error(err)
|
|
48
|
+
})
|
|
49
|
+
|
|
50
|
+
};
|
|
51
|
+
const deleteData = (event:Event) => {
|
|
52
|
+
|
|
53
|
+
confirm.require({
|
|
54
|
+
target: event.currentTarget as HTMLElement,
|
|
55
|
+
message:'Delete?',
|
|
56
|
+
icon: 'pi pi-exclamation-triangle',
|
|
57
|
+
acceptClass: 'p-button-danger',
|
|
58
|
+
accept: ()=>{
|
|
59
|
+
// disabled.value=true
|
|
60
|
+
doc.delete(data.value._id ?? "").then((res) => {
|
|
61
|
+
refresh();
|
|
62
|
+
goTo(doc.getDocName())
|
|
63
|
+
});
|
|
64
|
+
},
|
|
65
|
+
reject: () => {
|
|
66
|
+
console.log("Cancel delete")
|
|
67
|
+
}
|
|
68
|
+
})
|
|
69
|
+
};
|
|
70
|
+
const newData = ()=>{
|
|
71
|
+
goTo(doc.getDocName(),undefined,'new=1')
|
|
72
|
+
}
|
|
73
|
+
const refresh = ()=>{
|
|
74
|
+
$event('RefreshDocumentList',{documentName:doc.getDocName()})
|
|
75
|
+
}
|
|
76
|
+
</script>
|
|
77
|
+
<template>
|
|
78
|
+
<SimpleAppForm #default="o" :document="doc">
|
|
79
|
+
<div class="simpleapp-tool-bar col-span-4 text-left gap-4" >
|
|
80
|
+
<Button class="" :disabled="disabled" @click="newData" type="button" v-if="canPerform(doc.getDocName(),'create')">New</Button>
|
|
81
|
+
<Button class="bg-primary-600 hover:bg-primary-400" :disabled="disabled" @click="createData" type="button" v-if="canPerform(doc.getDocName(),'create') && doc.isNew()">Create</Button>
|
|
82
|
+
<Button class="bg-primary-600 hover:bg-primary-400" :disabled="disabled" @click="updateData" type="button" v-if="canPerform(doc.getDocName(),'update') && !doc.isNew()">Update</Button>
|
|
83
|
+
<Button class="bg-danger-600 hover:bg-danger-400" :disabled="disabled" @click="deleteData($event)" type="button" v-if="canPerform(doc.getDocName(),'delete') && !doc.isNew()">Delete</Button>
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
<ProgressSpinner v-if="disabled==true" style="width: 2rem; height: 2rem" ></ProgressSpinner>
|
|
87
|
+
<ConfirmPopup></ConfirmPopup>
|
|
88
|
+
</div>
|
|
89
|
+
<%Object.keys(it.jsonschema.properties).forEach(function(key) { %>
|
|
90
|
+
|
|
91
|
+
<% let obj=it.jsonschema.properties[key] %>
|
|
92
|
+
<% if(skipcolumns.indexOf(key)>=0){ %>
|
|
93
|
+
<% } else if(obj.type=='boolean'){ %>
|
|
94
|
+
<SimpleAppCheckbox autofocus :setting="o.getField('#/properties/<%= key %>')" v-model="data.<%= key %>"/>
|
|
95
|
+
<% } else if(obj.type=='number' || obj.type=='integer'){ %>
|
|
96
|
+
<SimpleAppNumber autofocus :setting="o.getField('#/properties/<%= key %>')" v-model="data.<%= key %>"/>
|
|
97
|
+
<% } else if(obj.type=='array' && obj.items && obj.items.type =='string' ){ %>
|
|
98
|
+
<SimpleAppChip autofocus :setting="o.getField('#/properties/<%= key %>')" v-model="data.<%= key %>"/>
|
|
99
|
+
<% } else if(obj.type=='object' && typeof obj['x-foreignkey']!='undefined'){ %>
|
|
100
|
+
<SimpleAppAutocomplete :setting="o.getField('#/properties/<%= key %>')"
|
|
101
|
+
v-model="data.<%= key %>" optionLabel="label" :remote-src="getAutocomplete('<%=obj['x-foreignkey']%>')"/>
|
|
102
|
+
<% } else if(obj.type=='string'){ %>
|
|
103
|
+
<% if(obj.format=='documentno'){ %>
|
|
104
|
+
<SimpleAppDocumentNo autofocus :setting="o.getField('#/properties/<%= key %>')" v-model="data.<%= key %>" v-model:docNoFormat="data.docNoFormat" />
|
|
105
|
+
<% }else if(obj.format=='date'){ %>
|
|
106
|
+
<SimpleAppText type="<%=obj.format%>" autofocus :setting="o.getField('#/properties/<%= key %>')" v-model="data.<%= key %>"/>
|
|
107
|
+
<% } else if(obj.format=='text'){ %>
|
|
108
|
+
<SimpleAppTextarea :setting="o.getField('#/properties/<%= key %>')" v-model="data.<%= key %>"/>
|
|
109
|
+
<% } else if(obj.format=='html'){ %>
|
|
110
|
+
<SimpleAppEditor editorStyle="height: 320px" :setting="o.getField('#/properties/<%= key %>')" v-model="data.<%= key %>"/>
|
|
111
|
+
<% } else if(obj.format=='email'){ %>
|
|
112
|
+
<SimpleAppText autofocus type="<%=obj.type%>" :setting="o.getField('#/properties/<%= key %>')" v-model="data.<%= key %>"/>
|
|
113
|
+
<% } else if(obj.enum){ %>
|
|
114
|
+
<SimpleAppSelect autofocus :setting="o.getField('#/properties/<%= key %>')" v-model="data.<%= key %>"/>
|
|
115
|
+
<% } else if(obj['anyOf']){ %>
|
|
116
|
+
<% for(let f = 0; f < obj['anyOf'].length; f++){ %>
|
|
117
|
+
<%if(obj['anyOf'][f]['format']){ %>
|
|
118
|
+
<SimpleAppText type='<%=obj['anyOf'][f]['format']%>' autofocus :setting="o.getField('#/properties/<%= key %>')" v-model="data.<%= key %>"/>
|
|
119
|
+
<%}%>
|
|
120
|
+
<%}%>
|
|
121
|
+
<% } else if(obj['oneOf']){ %>
|
|
122
|
+
<% for(let f = 0; f < obj['oneOf'].length; f++){ %>
|
|
123
|
+
<%if(obj['oneOf'][f]['format']){ %>
|
|
124
|
+
<SimpleAppText type='<%=obj['oneOf'][f]['format']%>' autofocus :setting="o.getField('#/properties/<%= key %>')" v-model="data.<%= key %>"/>
|
|
125
|
+
<%}%>
|
|
126
|
+
<%}%>
|
|
127
|
+
|
|
128
|
+
<% } else {%>
|
|
129
|
+
<SimpleAppText autofocus :setting="o.getField('#/properties/<%= key %>')" v-model="data.<%= key %>"/>
|
|
130
|
+
<% }%>
|
|
131
|
+
<% } else if(obj.type=='object' && obj.properties){ %>
|
|
132
|
+
<SimpleAppValue :setting="o.getField('#/properties/<%= key %>')">
|
|
133
|
+
<%Object.keys(obj.properties).forEach(function(skey) { %>
|
|
134
|
+
<% let sobj=obj.properties[skey] %>
|
|
135
|
+
<% let fieldpath=`o.getField('#/properties/${key}/properties/${skey}')` %>
|
|
136
|
+
<% let vmodel=`data.${key}.${skey}` %>
|
|
137
|
+
<% let instancePath=`#/${key}/${skey}` %>
|
|
138
|
+
|
|
139
|
+
<% if(sobj.type=='boolean'){ %>
|
|
140
|
+
<SimpleAppCheckbox autofocus :setting="<%~fieldpath%>" instancePath="<%=instancePath%>" v-model="<%= vmodel %>"/>
|
|
141
|
+
<% } else if(sobj.type=='number' || sobj.type=='integer'){ %>
|
|
142
|
+
<SimpleAppNumber autofocus :setting="<%~fieldpath%>" instancePath="<%=instancePath%>" v-model="<%= vmodel %>"/>
|
|
143
|
+
<% } else if(sobj.type=='array' && sobj.items && sobj.items.type =='string' ){ %>
|
|
144
|
+
<SimpleAppChip autofocus :setting="<%~fieldpath%>" instancePath="<%=instancePath%>" v-model="<%= vmodel %>"/>
|
|
145
|
+
<% } else if(sobj.type=='object' && typeof sobj['x-foreignkey']!='undefined'){ %>
|
|
146
|
+
<SimpleAppAutocomplete autofocus :setting="<%~fieldpath%>" instancePath="<%=instancePath%>"
|
|
147
|
+
v-model="<%= vmodel %>" optionLabel="label" :remote-src="getAutocomplete('<%=sobj['x-foreignkey']%>')"/>
|
|
148
|
+
<% } else if(sobj.type=='string'){ %>
|
|
149
|
+
<% if(sobj.format=='date'){ %>
|
|
150
|
+
<SimpleAppText type="<%=sobj.format%>" instancePath="<%=instancePath%>" autofocus :setting="<%~fieldpath%>" v-model="<%= vmodel %>"/>
|
|
151
|
+
<% } else if(sobj.format=='text'){ %>
|
|
152
|
+
<SimpleAppTextarea :setting="<%~fieldpath%>'" instancePath="<%=instancePath%>" v-model="<%= vmodel %>"/>
|
|
153
|
+
<% } else if(sobj.format=='html'){ %>
|
|
154
|
+
<SimpleAppEditor editorStyle="height: 320px" instancePath="<%=instancePath%>" :setting="<%=fieldpath%>" v-model="<%= vmodel %>"/>
|
|
155
|
+
<% } else if(sobj.format=='email'){ %>
|
|
156
|
+
<SimpleAppText autofocus type="<%=~obj.type%>" instancePath="<%=instancePath%>" :setting="<%=fieldpath%>" v-model="<%= vmodel %>"/>
|
|
157
|
+
<% } else if(sobj.enum){ %>
|
|
158
|
+
<SimpleAppSelect autofocus :setting="<%~fieldpath%>" instancePath="<%=instancePath%>" v-model="<%= vmodel %>"/>
|
|
159
|
+
<% } else {%>
|
|
160
|
+
<SimpleAppText autofocus :setting="<%~fieldpath%>" instancePath="<%=instancePath%>" v-model="<%= vmodel %>"/>
|
|
161
|
+
<% }%>
|
|
162
|
+
<% } %>
|
|
163
|
+
<%})%>
|
|
164
|
+
</SimpleAppValue>
|
|
165
|
+
<% } else if(obj.type=='array' && obj.items.type=='object'){%>
|
|
166
|
+
<SimpleAppInputTable :getAutocomplete="getAutocomplete" :getField="o.getField" class="col-span-4"
|
|
167
|
+
:setting="o.getField('#/properties/<%=key%>')" v-model="data.<%=key%>">
|
|
168
|
+
<%let tablefields = Object.keys(obj.items.properties) %>
|
|
169
|
+
<% for(let a=0;a<tablefields.length;a++){%>
|
|
170
|
+
<%let col= tablefields[a] %>
|
|
171
|
+
<% if(skipcolumns.includes(col)){ continue}%>
|
|
172
|
+
<%let subobj = obj.items.properties[col] %>
|
|
173
|
+
<column field="<%=col%>" #body="{index}" :header="camelCaseToWords('<%=col%>')">
|
|
174
|
+
<%if(subobj['x-foreignkey']){%>
|
|
175
|
+
<SimpleAppAutocomplete v-model="data.<%=key%>[index].<%=col%>"
|
|
176
|
+
:setting="o.getField('#/properties/<%=key%>/items/properties/<%=col%>')"
|
|
177
|
+
:remoteSrc="getAutocomplete('<%=subobj[`x-foreignkey`]%>')"
|
|
178
|
+
optionLabel="label"
|
|
179
|
+
:hidelabel="true"
|
|
180
|
+
:instancePath="`/<%=key%>/${index}/<%=col%>`"/>
|
|
181
|
+
<% } else if(subobj.type=='boolean'){%>
|
|
182
|
+
<SimpleAppCheckbox v-model="data.<%=key%>[index].<%=col%>"
|
|
183
|
+
:setting="o.getField('#/properties/<%=key%>/items/properties/<%=col%>')"
|
|
184
|
+
:hidelabel="true"
|
|
185
|
+
:instancePath="`/<%=key%>/${index}/<%=col%>`"/>
|
|
186
|
+
<% } else if(subobj.type=='number' || subobj.type=='integer'){%>
|
|
187
|
+
<SimpleAppNumber v-model="data.<%=key%>[index].<%=col%>"
|
|
188
|
+
:setting="o.getField('#/properties/<%=key%>/items/properties/<%=col%>')"
|
|
189
|
+
:hidelabel="true"
|
|
190
|
+
:instancePath="`/<%=key%>/${index}/<%=col%>`"/>
|
|
191
|
+
<%} else if(subobj.type=='string' && subobj.format){%>
|
|
192
|
+
<SimpleAppText v-model="data.<%=key%>[index].<%=col%>"
|
|
193
|
+
:setting="o.getField('#/properties/<%=key%>/items/properties/<%=col%>')"
|
|
194
|
+
text="subobj.format"
|
|
195
|
+
:hidelabel="true"
|
|
196
|
+
:instancePath="`/<%=key%>/${index}/<%=col%>`"/>
|
|
197
|
+
<%} else if(subobj.type=='string' && subobj['enum']){%>
|
|
198
|
+
<SimpleAppSelect v-model="data.<%=key%>[index].<%=col%>"
|
|
199
|
+
:setting="o.getField('#/properties/<%=key%>/items/properties/<%=col%>')"
|
|
200
|
+
:hidelabel="true"
|
|
201
|
+
:instancePath="`/<%=key%>/${index}/<%=col%>`"/>
|
|
202
|
+
<%} else if(subobj.type=='string' ){%>
|
|
203
|
+
<SimpleAppText v-model="data.<%=key%>[index].<%=col%>"
|
|
204
|
+
:setting="o.getField('#/properties/<%=key%>/items/properties/<%=col%>')"
|
|
205
|
+
:hidelabel="true"
|
|
206
|
+
:instancePath="`/<%=key%>/${index}/<%=col%>`"/>
|
|
207
|
+
<%} else if(subobj.type=='number'){%>
|
|
208
|
+
<SimpleAppDynamicInput v-model="data.<%=key%>[index].<%=col%>"
|
|
209
|
+
:setting="o.getField('#/properties/<%=key%>/items/properties/<%=col%>')"
|
|
210
|
+
:hidelabel="true"
|
|
211
|
+
:instancePath="`/<%=key%>/${index}/<%=col%>`"/>
|
|
212
|
+
<%}%>
|
|
213
|
+
</column>
|
|
214
|
+
<%}%>
|
|
215
|
+
<column #body="{index}" header="Delete">
|
|
216
|
+
<Button class="btn-danger" type="button" @click="data.<%=key%>.splice(index,1)">X</Button>
|
|
217
|
+
</column>
|
|
218
|
+
</SimpleAppInputTable>
|
|
219
|
+
<% } else{%>
|
|
220
|
+
<!-- Can auto generate <%=obj.key %> -->
|
|
221
|
+
<!-- <%~ JSON.stringify(obj) %>-->
|
|
222
|
+
<%}%>
|
|
223
|
+
<%})%>
|
|
224
|
+
</SimpleAppForm>
|
|
225
|
+
</template>
|
package/templates/nest/.env._eta
CHANGED
package/templates/nest/src/simpleapp/generate/commons/exceptions/SimpleAppExceptionFilter.ts.eta
CHANGED
|
@@ -29,7 +29,7 @@ export class SimpleAppExceptionFilter implements ExceptionFilter {
|
|
|
29
29
|
const session:ClientSession = request['sessionuser'].getDBSession()
|
|
30
30
|
if(session.inTransaction())session.abortTransaction()
|
|
31
31
|
}
|
|
32
|
-
console.log('exceptionexception',typeof exception,Object.keys(exception),exception)
|
|
32
|
+
// console.log('exceptionexception',typeof exception,Object.keys(exception),exception)
|
|
33
33
|
let errordata
|
|
34
34
|
let finalstatus
|
|
35
35
|
let msg
|