@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.
Files changed (96) hide show
  1. package/dist/buildinschemas/branch.d.ts.map +1 -1
  2. package/dist/buildinschemas/branch.js +1 -0
  3. package/dist/buildinschemas/branch.js.map +1 -1
  4. package/dist/buildinschemas/organization.d.ts.map +1 -1
  5. package/dist/buildinschemas/organization.js +1 -0
  6. package/dist/buildinschemas/organization.js.map +1 -1
  7. package/dist/buildinschemas/permission.js +1 -1
  8. package/dist/buildinschemas/permission.js.map +1 -1
  9. package/dist/buildinschemas/user.d.ts.map +1 -1
  10. package/dist/buildinschemas/user.js +4 -1
  11. package/dist/buildinschemas/user.js.map +1 -1
  12. package/dist/framework.js +1 -1
  13. package/dist/framework.js.map +1 -1
  14. package/dist/generate.js +6 -1
  15. package/dist/generate.js.map +1 -1
  16. package/dist/type.d.ts +1 -0
  17. package/dist/type.d.ts.map +1 -1
  18. package/docs/jsonschema.md +1 -0
  19. package/package.json +1 -1
  20. package/src/buildinschemas/branch.ts +1 -0
  21. package/src/buildinschemas/organization.ts +1 -0
  22. package/src/buildinschemas/permission.ts +1 -1
  23. package/src/buildinschemas/user.ts +4 -1
  24. package/src/framework.ts +1 -1
  25. package/src/generate.ts +6 -1
  26. package/src/type.ts +1 -0
  27. package/templates/basic/nest/controller.ts.eta +5 -3
  28. package/templates/basic/nest/model.ts.eta +32 -7
  29. package/templates/basic/nuxt/pages.crud.vue.eta +59 -163
  30. package/templates/basic/nuxt/pages.index.vue.eta +225 -0
  31. package/templates/nest/.env._eta +1 -0
  32. package/templates/nest/src/simpleapp/generate/commons/exceptions/SimpleAppExceptionFilter.ts.eta +1 -1
  33. package/templates/nest/src/simpleapp/generate/commons/roles/roles.group.ts.eta +1 -1
  34. package/templates/nest/src/simpleapp/generate/commons/user.context.ts.eta +127 -22
  35. package/templates/nest/src/simpleapp/generate/processors/simpleapp.processor.ts.eta +1 -1
  36. package/templates/nest/src/simpleapp/profile/profile.controller.ts.eta +25 -2
  37. package/templates/nest/src/simpleapp/profile/profile.service.ts.eta +20 -2
  38. package/templates/nest/src/simpleapp/services/branch.service.ts.eta +41 -40
  39. package/templates/nest/src/simpleapp/services/user.service.ts.eta +10 -9
  40. package/templates/nuxt/app.vue.eta +2 -1
  41. package/templates/nuxt/assets/css/style.css._eta +3 -12
  42. package/templates/nuxt/assets/primevue/passthrough.ts._eta +24 -20
  43. package/templates/nuxt/components/ButtonCreateTenant.vue.eta +30 -23
  44. package/templates/nuxt/components/ButtonHome.vue.eta +15 -2
  45. package/templates/nuxt/components/ButtonMenuPicker.vue.eta +5 -20
  46. package/templates/nuxt/components/ButtonPermissionInfo.vue.eta +5 -7
  47. package/templates/nuxt/components/ButtonProfile.vue.eta +42 -25
  48. package/templates/nuxt/components/CrudSimple.vue.eta +1 -1
  49. package/templates/nuxt/components/EventDecision.vue.eta +115 -0
  50. package/templates/nuxt/components/EventNotification.vue.eta +157 -0
  51. package/templates/nuxt/components/HeaderBar.vue.eta +2 -2
  52. package/templates/nuxt/components/Invitation.vue.eta +3 -3
  53. package/templates/nuxt/components/SelectBranch.vue.eta +5 -2
  54. package/templates/nuxt/components/SimpleAppDatatable.vue.eta +151 -5
  55. package/templates/nuxt/components/TenantPicker.vue.eta +75 -0
  56. package/templates/nuxt/components/UserProfileListItem.vue.eta +65 -0
  57. package/templates/nuxt/components/renderers/BooleanRender.vue.eta +7 -0
  58. package/templates/nuxt/components/renderers/DateRender.vue.eta +6 -0
  59. package/templates/nuxt/components/renderers/ForeignKeyRender.vue.eta +10 -0
  60. package/templates/nuxt/components/renderers/MoneyRender.vue.eta +7 -0
  61. package/templates/nuxt/components/renderers/MultiTextRender.vue.eta +11 -0
  62. package/templates/nuxt/composables/getDocument.generate.ts.eta +4 -0
  63. package/templates/nuxt/composables/getMenus.generate.ts.eta +35 -31
  64. package/templates/nuxt/composables/getUserStore.generate.ts.eta +6 -1
  65. package/templates/nuxt/composables/goTo.generate.ts.eta +15 -0
  66. package/templates/nuxt/composables/notifications.generate.ts.eta +21 -0
  67. package/templates/nuxt/composables/stringHelper.generate.ts.eta +11 -1
  68. package/templates/nuxt/error.vue._eta +20 -5
  69. package/templates/nuxt/layouts/documentlist.vue.eta +166 -0
  70. package/templates/nuxt/middleware/30.acl.global.ts.eta +4 -1
  71. package/templates/nuxt/pages/[xorg]/organization/index.vue.eta +4 -4
  72. package/templates/nuxt/pages/[xorg]/profile.vue.eta +6 -0
  73. package/templates/nuxt/pages/[xorg]/user/[id].vue.eta +6 -0
  74. package/templates/nuxt/pages/[xorg]/user/index.vue.eta +211 -377
  75. package/templates/nuxt/pages/[xorg]/user.vue.eta +197 -0
  76. package/templates/nuxt/pages/index.vue._eta +101 -0
  77. package/templates/nuxt/pages/profile.vue.eta +94 -0
  78. package/templates/nuxt/plugins/10.simpleapp-event.ts.eta +4 -4
  79. package/templates/nuxt/plugins/20.simpleapp-userstore.ts.eta +11 -10
  80. package/templates/nuxt/simpleapp/generate/clients/SimpleAppClient.ts.eta +69 -17
  81. package/templates/nuxt/simpleapp/generate/commons/documents.ts.eta +6 -3
  82. package/templates/nuxt/tailwind.config.ts._eta +10 -0
  83. package/templates/nuxt/types/documentlist.ts.eta +9 -0
  84. package/templates/nuxt/types/events.ts.eta +20 -0
  85. package/templates/nuxt/types/index.ts.eta +6 -79
  86. package/templates/nuxt/types/notifications.ts.eta +16 -0
  87. package/templates/nuxt/types/others.ts.eta +42 -0
  88. package/templates/nuxt/types/user.ts.eta +44 -0
  89. package/tsconfig.tsbuildinfo +1 -1
  90. package/templates/nest/src/simpleapp/generate/models/perm.model.ts.eta +0 -52
  91. package/templates/nest/src/simpleapp/generate/models/tenant.model.ts.eta +0 -43
  92. package/templates/nest/src/simpleapp/generate/models/user.model.ts.eta +0 -56
  93. package/templates/nuxt/components/EventMonitor.vue.eta +0 -85
  94. package/templates/nuxt/pages/[xorg]/tenant/index.vue.eta +0 -89
  95. package/templates/nuxt/pages/index.vue.eta +0 -116
  96. 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
- <% let skipcolumns = ['_id','createdby','created','updatedby','updated','orgId','branchId','tenantId','doctype'] %>
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 columns = [
16
- <%Object.keys(it.jsonschema.properties).forEach(function(key) { %>
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
- //prepare subtable if exists
23
- /*
24
- <%Object.keys(it.jsonschema.properties).forEach(function(key) { %>
25
- <% let obj=it.jsonschema.properties[key] %>
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
- //end
38
- </script>
39
- <template>
40
- <div>
41
- <CrudSimple :document="doc" title="<%= it.typename %>"
42
- #default="o"
43
- :path="`/${useRoute().params.xorg}/<%= it.name %>`"
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
- <% } else {%>
86
- <SimpleAppText autofocus :setting="o.getField('#/properties/<%= key %>')" v-model="data.<%= key %>"/>
87
- <% }%>
88
- <% } else if(obj.type=='object' && obj.properties){ %>
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
- <% if(sobj.type=='boolean'){ %>
97
- <SimpleAppCheckbox autofocus :setting="<%~fieldpath%>" instancePath="<%=instancePath%>" v-model="<%= vmodel %>"/>
98
- <% } else if(sobj.type=='number' || sobj.type=='integer'){ %>
99
- <SimpleAppNumber autofocus :setting="<%~fieldpath%>" instancePath="<%=instancePath%>" v-model="<%= vmodel %>"/>
100
- <% } else if(sobj.type=='array' && sobj.items && sobj.items.type =='string' ){ %>
101
- <SimpleAppChip autofocus :setting="<%~fieldpath%>" instancePath="<%=instancePath%>" v-model="<%= vmodel %>"/>
102
- <% } else if(sobj.type=='object' && typeof sobj['x-foreignkey']!='undefined'){ %>
103
- <SimpleAppAutocomplete autofocus :setting="<%~fieldpath%>" instancePath="<%=instancePath%>"
104
- v-model="<%= vmodel %>" optionLabel="label" :remote-src="getAutocomplete('<%=sobj['x-foreignkey']%>')"/>
105
- <% } else if(sobj.type=='string'){ %>
106
- <% if(sobj.format=='date'){ %>
107
- <SimpleAppText type="<%=sobj.format%>" instancePath="<%=instancePath%>" autofocus :setting="<%~fieldpath%>" v-model="<%= vmodel %>"/>
108
- <% } else if(sobj.format=='text'){ %>
109
- <SimpleAppTextarea :setting="<%~fieldpath%>'" instancePath="<%=instancePath%>" v-model="<%= vmodel %>"/>
110
- <% } else if(sobj.format=='html'){ %>
111
- <SimpleAppEditor editorStyle="height: 320px" instancePath="<%=instancePath%>" :setting="<%=fieldpath%>" v-model="<%= vmodel %>"/>
112
- <% } else if(sobj.format=='email'){ %>
113
- <SimpleAppText autofocus type="<%=~obj.type%>" instancePath="<%=instancePath%>" :setting="<%=fieldpath%>" v-model="<%= vmodel %>"/>
114
- <% } else if(sobj.enum){ %>
115
- <SimpleAppSelect autofocus :setting="<%~fieldpath%>" instancePath="<%=instancePath%>" v-model="<%= vmodel %>"/>
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
- </template>
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>
@@ -29,3 +29,4 @@ AUTH_SECRET_KEY=<%=it.configs.oauthSetting.oauthAuthSecretKey%>
29
29
 
30
30
  AUTH_ORIGIN=http://localhost:8080
31
31
 
32
+ ADMIN_EMAIL =
@@ -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
@@ -7,7 +7,7 @@
7
7
  import {Role} from './roles.enum'
8
8
 
9
9
  <% Object.getOwnPropertyNames(it.allroles).forEach((key)=>{ %>
10
- export const <%=key%>=[
10
+ export const <%=key%>=()=>[
11
11
  Role.User,
12
12
  <%for(let i=0; i <it.allroles[key].length; i++){%>
13
13
  Role.<%=it.allroles[key][i]%>,