@simitgroup/simpleapp-generator 1.1.1 → 1.1.3

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 (76) hide show
  1. package/dist/framework.js +2 -2
  2. package/dist/framework.js.map +1 -1
  3. package/dist/generate.d.ts.map +1 -1
  4. package/dist/generate.js +22 -46
  5. package/dist/generate.js.map +1 -1
  6. package/dist/processors/jsonschemabuilder.js +9 -0
  7. package/dist/processors/jsonschemabuilder.js.map +1 -1
  8. package/dist/storage.d.ts +1 -0
  9. package/dist/storage.d.ts.map +1 -1
  10. package/dist/storage.js +2 -1
  11. package/dist/storage.js.map +1 -1
  12. package/package.json +1 -1
  13. package/src/framework.ts +2 -2
  14. package/src/generate.ts +29 -51
  15. package/src/processors/jsonschemabuilder.ts +12 -2
  16. package/src/storage.ts +2 -1
  17. package/templates/basic/nuxt/pages.[id].vue.eta +3 -2
  18. package/templates/basic/nuxt/pages.form.vue.eta +226 -0
  19. package/templates/basic/nuxt/pages.landing.vue.eta +19 -43
  20. package/templates/basic/nuxt/pages.new.vue.eta +7 -210
  21. package/templates/basic/nuxt/pages.viewer.vue.eta +21 -0
  22. package/templates/basic/nuxt/simpleapp.generate.client.ts.eta +2 -1
  23. package/templates/nest/src/simpleapp/services/docno.service.ts.eta +1 -1
  24. package/templates/nuxt/app.vue.eta +5 -1
  25. package/templates/nuxt/assets/css/style.css._eta +33 -15
  26. package/templates/nuxt/assets/primevue/passthrough.ts._eta +14 -7
  27. package/templates/nuxt/components/debug/DebugDocumentData.vue.eta +23 -22
  28. package/templates/nuxt/components/docPage/DocPageList.vue.eta +117 -0
  29. package/templates/nuxt/components/event/EventDocumentViewer.vue.eta +72 -0
  30. package/templates/nuxt/components/header/HeaderBar.vue.eta +12 -10
  31. package/templates/nuxt/components/header/HeaderBreadcrumb.vue.eta +76 -0
  32. package/templates/nuxt/components/header/button/HeaderButtonMenuPicker.vue.eta +5 -7
  33. package/templates/nuxt/components/header/button/HeaderButtonProfile.vue.eta +39 -8
  34. package/templates/nuxt/components/list/ListView.vue.eta +4 -2
  35. package/templates/nuxt/components/renderer/RendererForeignKey.vue.eta +22 -3
  36. package/templates/nuxt/components/simpleApp/SimpleAppAutocomplete.vue.eta +163 -0
  37. package/templates/nuxt/components/simpleApp/SimpleAppDocumentNo.vue.eta +8 -8
  38. package/templates/nuxt/components/simpleApp/SimpleAppFieldContainer.vue.eta +21 -7
  39. package/templates/nuxt/components/simpleApp/SimpleAppInput.vue.eta +24 -63
  40. package/templates/nuxt/components/table/TableDocuments.vue.eta +15 -9
  41. package/templates/nuxt/components/user/UserButtonCreateTenant.vue.eta +25 -3
  42. package/templates/nuxt/components/user/UserProfileListItem.vue.eta +41 -41
  43. package/templates/nuxt/components/user/UserTenantPicker.vue.eta +26 -14
  44. package/templates/nuxt/composables/getDocument.generate.ts.eta +1 -1
  45. package/templates/nuxt/composables/getUserStore.generate.ts.eta +4 -1
  46. package/templates/nuxt/composables/stringHelper.generate.ts.eta +5 -1
  47. package/templates/nuxt/composables/themes.generate.ts.eta +1 -0
  48. package/templates/nuxt/i18n.config.ts.eta +5 -0
  49. package/templates/nuxt/lang/cn.ts._eta +9 -0
  50. package/templates/nuxt/lang/df.ts.eta +22 -0
  51. package/templates/nuxt/lang/en.ts._eta +6 -0
  52. package/templates/nuxt/layouts/{documentlist.vue.eta → documentlist.vue.eta.disabled} +1 -1
  53. package/templates/nuxt/nuxt.config.ts.eta +49 -16
  54. package/templates/nuxt/pages/[xorg]/docnoformat.vue.eta +11 -81
  55. package/templates/nuxt/pages/[xorg]/organization/[id]/branches/new.vue +1 -1
  56. package/templates/nuxt/pages/[xorg]/organization.vue.eta +10 -0
  57. package/templates/nuxt/pages/[xorg]/profile.vue.eta +3 -0
  58. package/templates/nuxt/pages/[xorg]/user.vue.eta +5 -0
  59. package/templates/nuxt/pages/index.vue._eta +19 -56
  60. package/templates/nuxt/pages/profile.vue.eta +12 -12
  61. package/templates/nuxt/plugins/10.simpleapp-event.ts.eta +3 -0
  62. package/templates/nuxt/plugins/20.simpleapp-userstore.ts.eta +1 -1
  63. package/templates/nuxt/simpleapp/generate/clients/SimpleAppClient.ts.eta +5 -4
  64. package/templates/nuxt/simpleapp/generate/commons/documents.ts.eta +4 -1
  65. package/templates/nuxt/tailwind.config.ts._eta +18 -17
  66. package/templates/nuxt/types/events.ts.eta +12 -0
  67. package/templates/nuxt/types/index.ts.eta +2 -1
  68. package/templates/nuxt/types/others.ts.eta +4 -1
  69. package/templates/nuxt/types/schema.ts.eta +183 -0
  70. package/templates/nuxt/types/simpleappinput.ts.eta +1 -0
  71. package/templates/project/jsonschemas/invoice.json._eta +3 -3
  72. package/templates/project/jsonschemas/product.json._eta +2 -2
  73. package/templates/project/sharelibs/money.ts.eta +2 -3
  74. package/tsconfig.tsbuildinfo +1 -1
  75. /package/templates/nuxt/layouts/{sidelist.vue.eta → sidelist.vue.eta.disabled} +0 -0
  76. /package/templates/nuxt/layouts/{sidelistcrud.vue.eta → sidelistcrud.vue.eta.disabled} +0 -0
@@ -0,0 +1,226 @@
1
+ <% const skipcolumns = ['_id','createdBy','created','updatedBy','updated','orgId','branchId','tenantId','doctype','docNoFormat'] %>
2
+ <% const getBasicElement = ( inputtype, pathStr, modelValue,subtype=undefined,hidelabel=false,instancepath='') =>
3
+ `<SimpleAppInput :input-type="SimpleAppInputType.${inputtype}" :setting="o.getField('${pathStr}')" v-model="${modelValue}"`+
4
+ (subtype? `type="${subtype}"`:'') +' ' +
5
+ (hidelabel? ':hidelabel="true"':'') +
6
+ (instancepath ? `:instancepath="\`${instancepath}\`"` : '') + '/>' %>
7
+ <script setup lang="ts">
8
+ /**
9
+ * This file was automatically generated by simpleapp everytime regenerate code.
10
+ * delete file "delete-me-for-avoid-override" if you want to modify this file and
11
+ * prevent regenerate code override it.
12
+ * last change 2023-09-09
13
+ * author: Ks Tan
14
+ */
15
+ import {SimpleAppInputType} from "~/types"
16
+ import ConfirmPopup from 'primevue/confirmpopup';
17
+ import { useConfirm } from "primevue/useconfirm";
18
+ const confirm = useConfirm();
19
+ const isReadOnly =ref(true)
20
+ const props = defineProps<{_id?:string}>()
21
+ const {$<%= it.typename %>Doc,$event } = useNuxtApp();
22
+ const doc = $<%= it.typename %>Doc()
23
+ const data = doc.getReactiveData();
24
+ const emits = defineEmits(['afterCreate'])
25
+
26
+
27
+ const fetchRecord = async (recordid:string) =>{
28
+ await doc.getById(recordid)
29
+ }
30
+
31
+ const id = computed(() => props._id ?? '');
32
+
33
+
34
+ const disabled = computed(()=>{
35
+ return false
36
+ })
37
+
38
+ const createData = async () => {
39
+ // disabled.value=true
40
+
41
+ doc.create().then((res)=>{
42
+ //refresh()
43
+ emits('afterCreate',res.data)
44
+ }).catch(err=>{
45
+ console.error(err)
46
+ })
47
+
48
+ };
49
+ const updateData = async () => {
50
+ doc.update().then(()=>{
51
+ // visible.value=false
52
+ refresh()
53
+ }).catch(err=>{
54
+ console.error(err)
55
+ })
56
+
57
+ };
58
+ const deleteData = (event:Event) => {
59
+
60
+ confirm.require({
61
+ target: event.currentTarget as HTMLElement,
62
+ message:'Delete?',
63
+ icon: 'pi pi-exclamation-triangle',
64
+ acceptClass: 'p-button-danger',
65
+ accept: ()=>{
66
+ // disabled.value=true
67
+ doc.delete(data.value._id ?? "").then((res) => {
68
+ refresh();
69
+ goTo(doc.getDocName())
70
+ });
71
+ },
72
+ reject: () => {
73
+ console.log("Cancel delete")
74
+ }
75
+ })
76
+ };
77
+ const newData = ()=>{
78
+ goTo(doc.getDocName(),'new')
79
+ }
80
+ const refresh = ()=>{
81
+ $event('RefreshDocumentList',{documentName:doc.getDocName()})
82
+ }
83
+
84
+
85
+ if (id.value && id.value != 'new') {
86
+ fetchRecord(id.value);
87
+ }else{
88
+ isReadOnly.value=false
89
+ }
90
+ </script>
91
+ <template>
92
+
93
+ <SimpleAppForm #default="o" :document="doc" :readonly="isReadOnly">
94
+ <client-only>
95
+ <div v-if="isReadOnly" class="w-full">
96
+ <Button
97
+ class="btn-primary" @click="isReadOnly=false"
98
+ type="button" >Edit</Button>
99
+ <Button class="" :disabled="disabled" @click="newData" type="button" v-if="canPerform(doc.getDocName(),'create')">New</Button>
100
+ </div>
101
+ <div v-else class="simpleapp-tool-bar col-span-4 text-left gap-4" >
102
+ <Button class="" :disabled="disabled" @click="newData" type="button" v-if="canPerform(doc.getDocName(),'create')">New</Button>
103
+ <Button class="btn-primary" :disabled="disabled" @click="createData" type="button" v-if="canPerform(doc.getDocName(),'create') && doc.isNew()">Create</Button>
104
+ <Button class="btn-primary" :disabled="disabled" @click="updateData" type="button" v-if="canPerform(doc.getDocName(),'update') && !doc.isNew()">Update</Button>
105
+ <Button class="btn-danger" :disabled="disabled" @click="deleteData($event)" type="button" v-if="canPerform(doc.getDocName(),'delete') && !doc.isNew()">Delete</Button>
106
+
107
+
108
+ <ProgressSpinner v-if="disabled==true" style="width: 2rem; height: 2rem" ></ProgressSpinner>
109
+ <ConfirmPopup></ConfirmPopup>
110
+ </div>
111
+ <div class="grid grid-cols-4 gap-4">
112
+ <% let isautofocus='' %>
113
+ <%Object.keys(it.jsonschema.properties).forEach(function(key) { %>
114
+
115
+ <% let obj=it.jsonschema.properties[key] %>
116
+ <% if(skipcolumns.indexOf(key)>=0){ %>
117
+ <% } else if(obj.type=='boolean'){ %>
118
+ <%~ getBasicElement('checkbox',`#/properties/${key}`,`data.${key}`) %>
119
+ <% } else if(obj.type=='number' || obj.type=='integer'){ %>
120
+ <%~ getBasicElement('number',`#/properties/${key}`,`data.${key}`) %>
121
+ <% } else if(obj.type=='array' && obj.items && obj.items.type =='string' ){ %>
122
+ <%~ getBasicElement('chip',`#/properties/${key}`,`data.${key}`) %>
123
+ <% } else if(obj.type=='object' && typeof obj['x-foreignkey']!='undefined'){ %>
124
+ <%~ getBasicElement('autocomplete',`#/properties/${key}`,`data.${key}`) %>
125
+ <% } else if(obj.type=='string'){ %>
126
+ <% if(obj.format=='documentno'){ %>
127
+ <%~ getBasicElement('documentno',`#/properties/${key}`,`data.${key}`) %>
128
+ <% }else if(obj.format=='date'){ %>
129
+ <%~ getBasicElement('date',`#/properties/${key}`,`data.${key}`) %>
130
+ <% } else if(obj.format=='text'){ %>
131
+ <%~ getBasicElement('textarea',`#/properties/${key}`,`data.${key}`) %>
132
+ <% } else if(obj.format=='html'){ %>
133
+ <%~ getBasicElement('textarea',`#/properties/${key}`,`data.${key}`) %>
134
+ <% } else if(obj.format=='email'){ %>
135
+ <%~ getBasicElement('text',`#/properties/${key}`,`data.${key}`,'email') %>
136
+ <% } else if(obj.enum){ %>
137
+ <%~ getBasicElement('select',`#/properties/${key}`,`data.${key}`) %>
138
+ <% } else if(obj['anyOf']){ %>
139
+ <% for(let f = 0; f < obj['anyOf'].length; f++){ %>
140
+ <%if(obj['anyOf'][f]['format']){ %>
141
+ <%~ getBasicElement('text',`#/properties/${key}`,`data.${key}`,obj['anyOf'][f]['format']) %>
142
+ <%}%>
143
+ <%}%>
144
+ <% } else if(obj['oneOf']){ %>
145
+ <% for(let f = 0; f < obj['oneOf'].length; f++){ %>
146
+ <%if(obj['oneOf'][f]['format']){ %>
147
+ <%~ getBasicElement('text',`#/properties/${key}`,`data.${key}`,obj['oneOf'][f]['format']) %>
148
+ <%}%>
149
+ <%}%>
150
+
151
+ <% } else {%>
152
+ <%~ getBasicElement('text',`#/properties/${key}`,`data.${key}`) %>
153
+ <% }%>
154
+ <% } else if(obj.type=='object' && obj.properties){ %>
155
+ <SimpleAppValue :setting="o.getField('#/properties/<%= key %>')">
156
+ <%Object.keys(obj.properties).forEach(function(skey) { %>
157
+ <% let sobj=obj.properties[skey] %>
158
+ <% let fieldpath=`o.getField('#/properties/${key}/properties/${skey}')` %>
159
+ <% let vmodel=`data.${key}.${skey}` %>
160
+ <% let instancePath=`#/${key}/${skey}` %>
161
+
162
+ <% if(sobj.type=='boolean'){ %>
163
+ <%~ getBasicElement('checkbox',fieldpath,vmodel) %>
164
+ <% } else if(sobj.type=='number' || sobj.type=='integer'){ %>
165
+ <%~ getBasicElement('number',fieldpath,vmodel) %>
166
+ <% } else if(sobj.type=='array' && sobj.items && sobj.items.type =='string' ){ %>
167
+ <%~ getBasicElement('chip',fieldpath,vmodel) %>
168
+ <% } else if(sobj.type=='object' && typeof sobj['x-foreignkey']!='undefined'){ %>
169
+ <%~ getBasicElement('chip',fieldpath,vmodel) %>
170
+ <% } else if(sobj.type=='string'){ %>
171
+ <% if(sobj.format=='date'){ %>
172
+ <SimpleAppText type="<%=sobj.format%>" instancePath="<%=instancePath%>" autofocus :setting="<%~fieldpath%>" v-model="<%= vmodel %>"/>
173
+ <% } else if(sobj.format=='text'){ %>
174
+ <SimpleAppTextarea :setting="<%~fieldpath%>'" instancePath="<%=instancePath%>" v-model="<%= vmodel %>"/>
175
+ <% } else if(sobj.format=='html'){ %>
176
+ <SimpleAppEditor editorStyle="height: 320px" instancePath="<%=instancePath%>" :setting="<%=fieldpath%>" v-model="<%= vmodel %>"/>
177
+ <% } else if(sobj.format=='email'){ %>
178
+ <SimpleAppText autofocus type="<%=~obj.type%>" instancePath="<%=instancePath%>" :setting="<%=fieldpath%>" v-model="<%= vmodel %>"/>
179
+ <% } else if(sobj.enum){ %>
180
+ <SimpleAppSelect autofocus :setting="<%~fieldpath%>" instancePath="<%=instancePath%>" v-model="<%= vmodel %>"/>
181
+ <% } else {%>
182
+ <SimpleAppText autofocus :setting="<%~fieldpath%>" instancePath="<%=instancePath%>" v-model="<%= vmodel %>"/>
183
+ <% }%>
184
+ <% } %>
185
+ <%})%>
186
+ </SimpleAppValue>
187
+ <% } else if(obj.type=='array' && obj.items.type=='object'){%>
188
+ <SimpleAppInputTable :getField="o.getField" class="col-span-4"
189
+ :setting="o.getField('#/properties/<%=key%>')" v-model="data.<%=key%>">
190
+ <%let tablefields = Object.keys(obj.items.properties) %>
191
+ <% for(let a=0;a<tablefields.length;a++){%>
192
+ <%let col= tablefields[a] %>
193
+ <% if(skipcolumns.includes(col)){ continue}%>
194
+ <%let subobj = obj.items.properties[col] %>
195
+ <Column field="<%=col%>" #body="{index}" :header="camelCaseToWords('<%=col%>')">
196
+ <%if(subobj['x-foreignkey']){%>
197
+ <%~ getBasicElement('autocomplete',`#/properties/${key}/items/properties/${col}`,`data.${key}[index].${col}`,undefined,true,`/${key}/\${index}/${col}`) %>
198
+ <% } else if(subobj.type=='boolean'){%>
199
+ <%~ getBasicElement('checkbox',`#/properties/${key}/items/properties/${col}`,`data.${key}[index].${col}`,undefined,true,`/${key}/\${index}/${col}`) %>
200
+ <% } else if(subobj.type=='number' || subobj.type=='integer'){%>
201
+ <%~ getBasicElement('number',`#/properties/${key}/items/properties/${col}`,`data.${key}[index].${col}`,undefined,true,`/${key}/\${index}/${col}`) %>
202
+ <%} else if(subobj.type=='string' && subobj.format){%>
203
+ <%~ getBasicElement('number',`#/properties/${key}/items/properties/${col}`,`data.${key}[index].${col}`,subobj.format,true,`/${key}/\${index}/${col}`) %>
204
+ <%} else if(subobj.type=='string' && subobj['enum']){%>
205
+ <%~ getBasicElement('select',`#/properties/${key}/items/properties/${col}`,`data.${key}[index].${col}`,undefined,true,`/${key}/\${index}/${col}`) %>
206
+ <%} else if(subobj.type=='string' ){%>
207
+ <%~ getBasicElement('text',`#/properties/${key}/items/properties/${col}`,`data.${key}[index].${col}`,undefined,true,`/${key}/\${index}/${col}`) %>
208
+ <%} else if(subobj.type=='number'){%>
209
+ <%~ getBasicElement('number',`#/properties/${key}/items/properties/${col}`,`data.${key}[index].${col}`,undefined,true,`/${key}/\${index}/${col}`) %>
210
+ <%}%>
211
+ </Column>
212
+ <%}%>
213
+ <Column #body="{index}" header="Delete">
214
+ <Button class="btn-danger" type="button" @click="data.<%=key%>.splice(index,1)">X</Button>
215
+ </Column>
216
+ </SimpleAppInputTable>
217
+ <% } else{%>
218
+ <!-- Can auto generate <%=obj.key %> -->
219
+ <!-- <%~ JSON.stringify(obj) %>-->
220
+ <%}%>
221
+ <%})%>
222
+ </div>
223
+ </client-only>
224
+ </SimpleAppForm>
225
+ <DebugDocumentData v-model="data" :label="doc.getDocName()"/>
226
+ </template>
@@ -9,69 +9,45 @@
9
9
  <% const skipcolumns = ['_id','createdBy','created','updatedBy','updated','orgId','branchId','tenantId','doctype'] %>
10
10
 
11
11
  import { CellSetting } from "~/types";
12
- const {$<%= it.typename %>Doc } = useNuxtApp();
12
+ const {$<%= it.typename %>Doc,$listen } = useNuxtApp();
13
13
  const doc = $<%= it.typename %>Doc()
14
14
  const data = doc.getReactiveData();
15
- const visible = ref(false)
16
15
 
17
- definePageMeta({
18
- name: '<%= it.typename %>',
19
- layout:'documentlist',
20
- documentName: '<%= it.typename.toLowerCase() %>',
21
- columns: [<%Object.keys(it.jsonschema.properties).forEach(function(key) { %>
16
+ definePageMeta({
17
+ name: '<%= it.typename %>',
18
+ title: '<%= it.typename %>',
19
+ })
20
+
21
+ const columns:CellSetting[] = [<%Object.keys(it.jsonschema.properties).forEach(function(key) { %>
22
22
  <%let obj=it.jsonschema.properties[key] %>
23
23
  <%if(skipcolumns.indexOf(key)>=0){%>/* skip system columns <%=key%>*/
24
24
  <%} else if(['string','number','integer'].indexOf(obj.type)>=0){%>'<%=key%>',
25
25
  <%} else if(obj.type =='object' && obj['x-foreignkey'] ){%>
26
26
  {
27
- title:t('<%=key%>'),
27
+ title:'<%=key%>',
28
28
  field:'<%=key%>',
29
29
  rendererName:'RendererForeignKey',
30
30
  rendererSetting:{collection:'<%=obj["x-foreignkey"]%>' }
31
31
  },
32
32
  <%}%>
33
- <%})%>] as CellSetting[],
34
- sorts:[
33
+ <%})%>] as CellSetting[]
34
+ const sorts:string[][] = [
35
35
  <%if(it.jsonschema['x-simpleapp-config'] && it.jsonschema['x-simpleapp-config']['uniqueKey']){%>
36
36
  ['<%=it.jsonschema['x-simpleapp-config']['uniqueKey']%>','asc'],
37
37
  <%}%>
38
-
39
38
  ]
40
- });
41
-
42
- const newData = () => {
43
- doc.setNew()
44
- goTo(doc.getDocName(),'new')
45
- visible.value=true
46
- };
47
-
48
-
49
- const exitRecord = ()=>{
50
- goTo(doc.getDocName())
51
- console.log("exitRecord")
52
- }
53
39
 
54
- watch(()=> useRoute().fullPath ,(newvalue,oldvalue)=>{
55
- visible.value = useRoute().params.id || useRoute().fullPath.includes("/new") ? true : false;
56
- })
57
-
58
- onNuxtReady(()=>{
59
- visible.value = useRoute().params.id || useRoute().fullPath.includes('/new') ? true : false;
60
- })
40
+ const id=computed(()=>useRoute().params.id)
61
41
  </script>
62
42
  <template>
63
- <div>
64
- <Button class="btn btn-primary" v-if="canPerform(String(useRoute().meta.name),'create')" @click="newData">New</Button>
65
- <Dialog v-model:visible="visible"
66
- :pt="{ root: { class: 'w-full h-full bg-white' } , headertitle:{class:'m-2 ml-6 text-2xl font-bold'}}"
67
- modal :header="t(doc.getDocName())"
68
- :autoZIndex="false"
69
- @update:visible="exitRecord"
70
- >
71
- <NuxtPage />
72
- </Dialog>
73
- <!-- -->
74
- </div>
43
+
44
+ <DocPageList :document="doc" :columns="columns" :sorts="sorts">
45
+ <div>
46
+ <NuxtPage :_id="id ?? 'new'"/>
47
+
48
+
49
+ </div>
50
+ </DocPageList>
75
51
  </template>
76
52
 
77
53
 
@@ -1,9 +1,3 @@
1
- <% const skipcolumns = ['_id','createdBy','created','updatedBy','updated','orgId','branchId','tenantId','doctype','docNoFormat'] %>
2
- <% const getBasicElement = ( inputtype, pathStr, modelValue,subtype=undefined,hidelabel=false,instancepath='') =>
3
- `<SimpleAppInput :input-type="SimpleAppInputType.${inputtype}" :setting="o.getField('${pathStr}')" v-model="${modelValue}"`+
4
- (subtype? `type="${subtype}"`:'') +' ' +
5
- (hidelabel? ':hidelabel="true"':'') +
6
- (instancepath ? `:instancepath="\`${instancepath}\`"` : '') + '/>' %>
7
1
  <script setup lang="ts">
8
2
  /**
9
3
  * This file was automatically generated by simpleapp everytime regenerate code.
@@ -12,211 +6,14 @@
12
6
  * last change 2023-09-09
13
7
  * author: Ks Tan
14
8
  */
15
- import {SimpleAppInputType} from "~/types"
16
- import ConfirmPopup from 'primevue/confirmpopup';
17
- import { useConfirm } from "primevue/useconfirm";
18
- const confirm = useConfirm();
19
- const isReadOnly =ref(true)
20
- const {$<%= it.typename %>Doc,$event } = useNuxtApp();
21
- const doc = $<%= it.typename %>Doc()
22
- const data = doc.getReactiveData();
23
9
 
24
- const fetchRecord = async (recordid:string) =>{
25
- await doc.getById(recordid)
26
- }
27
-
28
- const id = computed(()=>String(useRoute().params.id??''))
29
-
30
-
31
- const disabled = computed(()=>{
32
- return false
33
- })
34
-
35
- const createData = async () => {
36
- // disabled.value=true
37
-
38
- doc.create().then((res)=>{
39
- //refresh()
40
- goTo(doc.getDocName(),res.data._id)
41
- }).catch(err=>{
42
- console.error(err)
43
- })
44
-
45
- };
46
- const updateData = async () => {
47
-
48
-
49
- doc.update().then(()=>{
50
- // visible.value=false
51
- refresh()
52
- }).catch(err=>{
53
- console.error(err)
54
- })
55
-
56
- };
57
- const deleteData = (event:Event) => {
58
-
59
- confirm.require({
60
- target: event.currentTarget as HTMLElement,
61
- message:'Delete?',
62
- icon: 'pi pi-exclamation-triangle',
63
- acceptClass: 'p-button-danger',
64
- accept: ()=>{
65
- // disabled.value=true
66
- doc.delete(data.value._id ?? "").then((res) => {
67
- refresh();
68
- goTo(doc.getDocName())
69
- });
70
- },
71
- reject: () => {
72
- console.log("Cancel delete")
73
- }
74
- })
75
- };
76
- const newData = ()=>{
77
- goTo(doc.getDocName(),'new')
78
- }
79
- const refresh = ()=>{
80
- $event('RefreshDocumentList',{documentName:doc.getDocName()})
81
- }
82
-
83
-
84
- if (id.value) {
85
- fetchRecord(id.value);
86
- }else{
87
- isReadOnly.value=false
10
+ import Crud from './form.vue'
11
+ const {$<%= it.typename %>Doc } = useNuxtApp();
12
+ const doc = $<%= it.typename %>Doc()
13
+ const redirect = (data:any)=>{
14
+ goTo(doc.getDocName(), data._id);
88
15
  }
89
16
  </script>
90
- <template>
91
- <SimpleAppForm #default="o" :document="doc" :readonly="isReadOnly">
92
- <div v-if="isReadOnly" class="w-full">
93
- <Button
94
- class="btn btn-primary" @click="isReadOnly=false"
95
- type="button" >Edit</Button>
96
- <Button class="" :disabled="disabled" @click="newData" type="button" v-if="canPerform(doc.getDocName(),'create')">New</Button>
97
- </div>
98
- <div v-else class="simpleapp-tool-bar col-span-4 text-left gap-4" >
99
- <Button class="" :disabled="disabled" @click="newData" type="button" v-if="canPerform(doc.getDocName(),'create')">New</Button>
100
- <Button class="btn btn-primary" :disabled="disabled" @click="createData" type="button" v-if="canPerform(doc.getDocName(),'create') && doc.isNew()">Create</Button>
101
- <Button class="btn btn-primary" :disabled="disabled" @click="updateData" type="button" v-if="canPerform(doc.getDocName(),'update') && !doc.isNew()">Update</Button>
102
- <Button class="btn btn-danger" :disabled="disabled" @click="deleteData($event)" type="button" v-if="canPerform(doc.getDocName(),'delete') && !doc.isNew()">Delete</Button>
103
-
104
-
105
- <ProgressSpinner v-if="disabled==true" style="width: 2rem; height: 2rem" ></ProgressSpinner>
106
- <ConfirmPopup></ConfirmPopup>
107
- </div>
108
- <div class="grid grid-cols-4 gap-4">
109
- <% let isautofocus='' %>
110
- <%Object.keys(it.jsonschema.properties).forEach(function(key) { %>
111
-
112
- <% let obj=it.jsonschema.properties[key] %>
113
- <% if(skipcolumns.indexOf(key)>=0){ %>
114
- <% } else if(obj.type=='boolean'){ %>
115
- <%~ getBasicElement('checkbox',`#/properties/${key}`,`data.${key}`) %>
116
- <% } else if(obj.type=='number' || obj.type=='integer'){ %>
117
- <%~ getBasicElement('number',`#/properties/${key}`,`data.${key}`) %>
118
- <% } else if(obj.type=='array' && obj.items && obj.items.type =='string' ){ %>
119
- <%~ getBasicElement('chip',`#/properties/${key}`,`data.${key}`) %>
120
- <% } else if(obj.type=='object' && typeof obj['x-foreignkey']!='undefined'){ %>
121
- <%~ getBasicElement('autocomplete',`#/properties/${key}`,`data.${key}`) %>
122
- <% } else if(obj.type=='string'){ %>
123
- <% if(obj.format=='documentno'){ %>
124
- <%~ getBasicElement('documentno',`#/properties/${key}`,`data.${key}`) %>
125
- <% }else if(obj.format=='date'){ %>
126
- <%~ getBasicElement('date',`#/properties/${key}`,`data.${key}`) %>
127
- <% } else if(obj.format=='text'){ %>
128
- <%~ getBasicElement('textarea',`#/properties/${key}`,`data.${key}`) %>
129
- <% } else if(obj.format=='html'){ %>
130
- <%~ getBasicElement('textarea',`#/properties/${key}`,`data.${key}`) %>
131
- <% } else if(obj.format=='email'){ %>
132
- <%~ getBasicElement('text',`#/properties/${key}`,`data.${key}`,'email') %>
133
- <% } else if(obj.enum){ %>
134
- <%~ getBasicElement('select',`#/properties/${key}`,`data.${key}`) %>
135
- <% } else if(obj['anyOf']){ %>
136
- <% for(let f = 0; f < obj['anyOf'].length; f++){ %>
137
- <%if(obj['anyOf'][f]['format']){ %>
138
- <%~ getBasicElement('text',`#/properties/${key}`,`data.${key}`,obj['anyOf'][f]['format']) %>
139
- <%}%>
140
- <%}%>
141
- <% } else if(obj['oneOf']){ %>
142
- <% for(let f = 0; f < obj['oneOf'].length; f++){ %>
143
- <%if(obj['oneOf'][f]['format']){ %>
144
- <%~ getBasicElement('text',`#/properties/${key}`,`data.${key}`,obj['oneOf'][f]['format']) %>
145
- <%}%>
146
- <%}%>
147
-
148
- <% } else {%>
149
- <%~ getBasicElement('text',`#/properties/${key}`,`data.${key}`) %>
150
- <% }%>
151
- <% } else if(obj.type=='object' && obj.properties){ %>
152
- <SimpleAppValue :setting="o.getField('#/properties/<%= key %>')">
153
- <%Object.keys(obj.properties).forEach(function(skey) { %>
154
- <% let sobj=obj.properties[skey] %>
155
- <% let fieldpath=`o.getField('#/properties/${key}/properties/${skey}')` %>
156
- <% let vmodel=`data.${key}.${skey}` %>
157
- <% let instancePath=`#/${key}/${skey}` %>
158
-
159
- <% if(sobj.type=='boolean'){ %>
160
- <%~ getBasicElement('checkbox',fieldpath,vmodel) %>
161
- <% } else if(sobj.type=='number' || sobj.type=='integer'){ %>
162
- <%~ getBasicElement('number',fieldpath,vmodel) %>
163
- <% } else if(sobj.type=='array' && sobj.items && sobj.items.type =='string' ){ %>
164
- <%~ getBasicElement('chip',fieldpath,vmodel) %>
165
- <% } else if(sobj.type=='object' && typeof sobj['x-foreignkey']!='undefined'){ %>
166
- <%~ getBasicElement('chip',fieldpath,vmodel) %>
167
- <% } else if(sobj.type=='string'){ %>
168
- <% if(sobj.format=='date'){ %>
169
- <SimpleAppText type="<%=sobj.format%>" instancePath="<%=instancePath%>" autofocus :setting="<%~fieldpath%>" v-model="<%= vmodel %>"/>
170
- <% } else if(sobj.format=='text'){ %>
171
- <SimpleAppTextarea :setting="<%~fieldpath%>'" instancePath="<%=instancePath%>" v-model="<%= vmodel %>"/>
172
- <% } else if(sobj.format=='html'){ %>
173
- <SimpleAppEditor editorStyle="height: 320px" instancePath="<%=instancePath%>" :setting="<%=fieldpath%>" v-model="<%= vmodel %>"/>
174
- <% } else if(sobj.format=='email'){ %>
175
- <SimpleAppText autofocus type="<%=~obj.type%>" instancePath="<%=instancePath%>" :setting="<%=fieldpath%>" v-model="<%= vmodel %>"/>
176
- <% } else if(sobj.enum){ %>
177
- <SimpleAppSelect autofocus :setting="<%~fieldpath%>" instancePath="<%=instancePath%>" v-model="<%= vmodel %>"/>
178
- <% } else {%>
179
- <SimpleAppText autofocus :setting="<%~fieldpath%>" instancePath="<%=instancePath%>" v-model="<%= vmodel %>"/>
180
- <% }%>
181
- <% } %>
182
- <%})%>
183
- </SimpleAppValue>
184
- <% } else if(obj.type=='array' && obj.items.type=='object'){%>
185
- <SimpleAppInputTable :getField="o.getField" class="col-span-4"
186
- :setting="o.getField('#/properties/<%=key%>')" v-model="data.<%=key%>">
187
- <%let tablefields = Object.keys(obj.items.properties) %>
188
- <% for(let a=0;a<tablefields.length;a++){%>
189
- <%let col= tablefields[a] %>
190
- <% if(skipcolumns.includes(col)){ continue}%>
191
- <%let subobj = obj.items.properties[col] %>
192
- <Column field="<%=col%>" #body="{index}" :header="camelCaseToWords('<%=col%>')">
193
- <%if(subobj['x-foreignkey']){%>
194
- <%~ getBasicElement('autocomplete',`#/properties/${key}/items/properties/${col}`,`data.${key}[index].${col}`,undefined,true,`/${key}/\${index}/${col}`) %>
195
- <% } else if(subobj.type=='boolean'){%>
196
- <%~ getBasicElement('checkbox',`#/properties/${key}/items/properties/${col}`,`data.${key}[index].${col}`,undefined,true,`/${key}/\${index}/${col}`) %>
197
- <% } else if(subobj.type=='number' || subobj.type=='integer'){%>
198
- <%~ getBasicElement('number',`#/properties/${key}/items/properties/${col}`,`data.${key}[index].${col}`,undefined,true,`/${key}/\${index}/${col}`) %>
199
- <%} else if(subobj.type=='string' && subobj.format){%>
200
- <%~ getBasicElement('number',`#/properties/${key}/items/properties/${col}`,`data.${key}[index].${col}`,subobj.format,true,`/${key}/\${index}/${col}`) %>
201
- <%} else if(subobj.type=='string' && subobj['enum']){%>
202
- <%~ getBasicElement('select',`#/properties/${key}/items/properties/${col}`,`data.${key}[index].${col}`,undefined,true,`/${key}/\${index}/${col}`) %>
203
- <%} else if(subobj.type=='string' ){%>
204
- <%~ getBasicElement('text',`#/properties/${key}/items/properties/${col}`,`data.${key}[index].${col}`,undefined,true,`/${key}/\${index}/${col}`) %>
205
- <%} else if(subobj.type=='number'){%>
206
- <%~ getBasicElement('number',`#/properties/${key}/items/properties/${col}`,`data.${key}[index].${col}`,undefined,true,`/${key}/\${index}/${col}`) %>
207
- <%}%>
208
- </Column>
209
- <%}%>
210
- <Column #body="{index}" header="Delete">
211
- <Button class="btn-danger" type="button" @click="data.<%=key%>.splice(index,1)">X</Button>
212
- </Column>
213
- </SimpleAppInputTable>
214
- <% } else{%>
215
- <!-- Can auto generate <%=obj.key %> -->
216
- <!-- <%~ JSON.stringify(obj) %>-->
217
- <%}%>
218
- <%})%>
219
- </div>
220
- </SimpleAppForm>
221
- <DebugDocumentData v-model="data"/>
17
+ <template>
18
+ <Crud _id="new" @after-create="redirect"/>
222
19
  </template>
@@ -0,0 +1,21 @@
1
+ <script setup lang="ts">
2
+ /**
3
+ * This file was automatically generated by simpleapp everytime regenerate code.
4
+ * delete file "delete-me-for-avoid-override" if you want to modify this file and
5
+ * prevent regenerate code override it.
6
+ * last change 2023-09-09
7
+ * author: Ks Tan
8
+ */
9
+ import Crud from './form.vue'
10
+
11
+ const emits = defineEmits(['afterCreate'])
12
+ const afterCreate = (data:any)=>{
13
+ emits('afterCreate',data)
14
+ }
15
+
16
+ </script>
17
+
18
+
19
+ <template>
20
+ <Crud _id="new" @after-create="afterCreate"/>
21
+ </template>
@@ -6,6 +6,7 @@
6
6
  * Author: Ks Tan
7
7
  */
8
8
  import _ from 'lodash'
9
+ import {SchemaType} from './types'
9
10
  import * as sharelibs from '../sharelibs'
10
11
  import * as jsonpath from 'jsonpath'
11
12
  import { SimpleAppClient } from "./SimpleAppClient";
@@ -46,7 +47,7 @@ export type {
46
47
  } from '../openapi'
47
48
 
48
49
  export class <%= it.typename%>Client extends SimpleAppClient<<%= it.typename%>,<%= it.doctype.toUpperCase()%>Api>{
49
- public readonly schema= <%~ JSON.stringify(it.jsonschema) %>;
50
+ public readonly schema= <%~ JSON.stringify(it.jsonschema) %> as SchemaType;
50
51
  protected documentIdentityCode='<%~ it.autocompletecode %>'
51
52
  protected documentIdentityName='<%~ it.autocompletename %>'
52
53
  <%if(it.jsonschema['x-simpleapp-config']['generateDocumentNumber']){%>
@@ -67,7 +67,7 @@ export class DocnoformatService extends DocnoformatProcessor {
67
67
  doctype = doctype.toUpperCase();
68
68
  const searchresult = await this.search(
69
69
  appuser,
70
- { docNoType:doctype},
70
+ { docNoType: doctype,'branch.branchId':appuser.getBranchId() },
71
71
  undefined,
72
72
  {default:'desc'}
73
73
  );
@@ -2,13 +2,17 @@
2
2
  /**
3
3
  * This file was automatically generated by simpleapp generator. Every
4
4
  * MODIFICATION OVERRIDE BY GENERATEOR
5
- * last change 2023-10-28
5
+ * last change 2023-11-12
6
6
  * Author: Ks Tan
7
7
  */
8
+ watch(()=>useRoute().params['xorg'],(newval,oldvalue)=>{
9
+ reloadUserStore()
10
+ })
8
11
  </script>
9
12
  <template>
10
13
  <div>
11
14
  <NuxtLayout>
15
+ <EventDocumentViewer></EventDocumentViewer>
12
16
  <EventDecision/>
13
17
  <EventNotification/>
14
18
  <NuxtPage />