@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.
- package/dist/framework.js +2 -2
- package/dist/framework.js.map +1 -1
- package/dist/generate.d.ts.map +1 -1
- package/dist/generate.js +22 -46
- package/dist/generate.js.map +1 -1
- package/dist/processors/jsonschemabuilder.js +9 -0
- package/dist/processors/jsonschemabuilder.js.map +1 -1
- package/dist/storage.d.ts +1 -0
- package/dist/storage.d.ts.map +1 -1
- package/dist/storage.js +2 -1
- package/dist/storage.js.map +1 -1
- package/package.json +1 -1
- package/src/framework.ts +2 -2
- package/src/generate.ts +29 -51
- package/src/processors/jsonschemabuilder.ts +12 -2
- package/src/storage.ts +2 -1
- package/templates/basic/nuxt/pages.[id].vue.eta +3 -2
- package/templates/basic/nuxt/pages.form.vue.eta +226 -0
- package/templates/basic/nuxt/pages.landing.vue.eta +19 -43
- package/templates/basic/nuxt/pages.new.vue.eta +7 -210
- package/templates/basic/nuxt/pages.viewer.vue.eta +21 -0
- package/templates/basic/nuxt/simpleapp.generate.client.ts.eta +2 -1
- package/templates/nest/src/simpleapp/services/docno.service.ts.eta +1 -1
- package/templates/nuxt/app.vue.eta +5 -1
- package/templates/nuxt/assets/css/style.css._eta +33 -15
- package/templates/nuxt/assets/primevue/passthrough.ts._eta +14 -7
- package/templates/nuxt/components/debug/DebugDocumentData.vue.eta +23 -22
- package/templates/nuxt/components/docPage/DocPageList.vue.eta +117 -0
- package/templates/nuxt/components/event/EventDocumentViewer.vue.eta +72 -0
- package/templates/nuxt/components/header/HeaderBar.vue.eta +12 -10
- package/templates/nuxt/components/header/HeaderBreadcrumb.vue.eta +76 -0
- package/templates/nuxt/components/header/button/HeaderButtonMenuPicker.vue.eta +5 -7
- package/templates/nuxt/components/header/button/HeaderButtonProfile.vue.eta +39 -8
- package/templates/nuxt/components/list/ListView.vue.eta +4 -2
- package/templates/nuxt/components/renderer/RendererForeignKey.vue.eta +22 -3
- package/templates/nuxt/components/simpleApp/SimpleAppAutocomplete.vue.eta +163 -0
- package/templates/nuxt/components/simpleApp/SimpleAppDocumentNo.vue.eta +8 -8
- package/templates/nuxt/components/simpleApp/SimpleAppFieldContainer.vue.eta +21 -7
- package/templates/nuxt/components/simpleApp/SimpleAppInput.vue.eta +24 -63
- package/templates/nuxt/components/table/TableDocuments.vue.eta +15 -9
- package/templates/nuxt/components/user/UserButtonCreateTenant.vue.eta +25 -3
- package/templates/nuxt/components/user/UserProfileListItem.vue.eta +41 -41
- package/templates/nuxt/components/user/UserTenantPicker.vue.eta +26 -14
- package/templates/nuxt/composables/getDocument.generate.ts.eta +1 -1
- package/templates/nuxt/composables/getUserStore.generate.ts.eta +4 -1
- package/templates/nuxt/composables/stringHelper.generate.ts.eta +5 -1
- package/templates/nuxt/composables/themes.generate.ts.eta +1 -0
- package/templates/nuxt/i18n.config.ts.eta +5 -0
- package/templates/nuxt/lang/cn.ts._eta +9 -0
- package/templates/nuxt/lang/df.ts.eta +22 -0
- package/templates/nuxt/lang/en.ts._eta +6 -0
- package/templates/nuxt/layouts/{documentlist.vue.eta → documentlist.vue.eta.disabled} +1 -1
- package/templates/nuxt/nuxt.config.ts.eta +49 -16
- package/templates/nuxt/pages/[xorg]/docnoformat.vue.eta +11 -81
- package/templates/nuxt/pages/[xorg]/organization/[id]/branches/new.vue +1 -1
- package/templates/nuxt/pages/[xorg]/organization.vue.eta +10 -0
- package/templates/nuxt/pages/[xorg]/profile.vue.eta +3 -0
- package/templates/nuxt/pages/[xorg]/user.vue.eta +5 -0
- package/templates/nuxt/pages/index.vue._eta +19 -56
- package/templates/nuxt/pages/profile.vue.eta +12 -12
- package/templates/nuxt/plugins/10.simpleapp-event.ts.eta +3 -0
- package/templates/nuxt/plugins/20.simpleapp-userstore.ts.eta +1 -1
- package/templates/nuxt/simpleapp/generate/clients/SimpleAppClient.ts.eta +5 -4
- package/templates/nuxt/simpleapp/generate/commons/documents.ts.eta +4 -1
- package/templates/nuxt/tailwind.config.ts._eta +18 -17
- package/templates/nuxt/types/events.ts.eta +12 -0
- package/templates/nuxt/types/index.ts.eta +2 -1
- package/templates/nuxt/types/others.ts.eta +4 -1
- package/templates/nuxt/types/schema.ts.eta +183 -0
- package/templates/nuxt/types/simpleappinput.ts.eta +1 -0
- package/templates/project/jsonschemas/invoice.json._eta +3 -3
- package/templates/project/jsonschemas/product.json._eta +2 -2
- package/templates/project/sharelibs/money.ts.eta +2 -3
- package/tsconfig.tsbuildinfo +1 -1
- /package/templates/nuxt/layouts/{sidelist.vue.eta → sidelist.vue.eta.disabled} +0 -0
- /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
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
64
|
-
|
|
65
|
-
<
|
|
66
|
-
:
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
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
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
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
|
-
<
|
|
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-
|
|
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 />
|