@simitgroup/simpleapp-generator 1.0.63 → 1.1.0

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 (147) hide show
  1. package/README copy.md +9 -9
  2. package/buildinschemas copy/autoincreament.autoinc.jsonschema.json +1 -1
  3. package/buildinschemas copy/docnoformat.docno.jsonschema.json +2 -2
  4. package/dist/buildinschemas/autoincreament.js +6 -6
  5. package/dist/buildinschemas/branch.js +3 -3
  6. package/dist/buildinschemas/branch.js.map +1 -1
  7. package/dist/buildinschemas/docnoformat.js +5 -5
  8. package/dist/buildinschemas/docnoformat.js.map +1 -1
  9. package/dist/buildinschemas/organization.js +3 -3
  10. package/dist/buildinschemas/permission.js +5 -5
  11. package/dist/buildinschemas/permission.js.map +1 -1
  12. package/dist/buildinschemas/tenant.js +2 -2
  13. package/dist/buildinschemas/user.d.ts.map +1 -1
  14. package/dist/buildinschemas/user.js +3 -4
  15. package/dist/buildinschemas/user.js.map +1 -1
  16. package/dist/generate.js +2 -2
  17. package/dist/generate.js.map +1 -1
  18. package/dist/processors/jsonschemabuilder.d.ts.map +1 -1
  19. package/dist/processors/jsonschemabuilder.js +6 -6
  20. package/dist/processors/jsonschemabuilder.js.map +1 -1
  21. package/dist/type.d.ts +7 -19
  22. package/dist/type.d.ts.map +1 -1
  23. package/docs/backend.md +2 -2
  24. package/docs/jsonschema.md +6 -6
  25. package/package.json +1 -1
  26. package/src/buildinschemas/autoincreament.ts +6 -6
  27. package/src/buildinschemas/branch.ts +3 -3
  28. package/src/buildinschemas/docnoformat.ts +5 -5
  29. package/src/buildinschemas/organization.ts +3 -3
  30. package/src/buildinschemas/permission.ts +5 -5
  31. package/src/buildinschemas/tenant.ts +2 -2
  32. package/src/buildinschemas/user.ts +4 -5
  33. package/src/generate.ts +2 -2
  34. package/src/processors/jsonschemabuilder.ts +7 -9
  35. package/src/processors/jsonschemabuilder.ts-old +5 -5
  36. package/src/type.ts +20 -20
  37. package/templates/basic/nest/controller.ts.eta +18 -18
  38. package/templates/basic/nest/processor.ts.eta +1 -1
  39. package/templates/basic/nuxt/pages.[id].vue.eta +1 -1
  40. package/templates/basic/nuxt/pages.landing.vue.eta +12 -17
  41. package/templates/basic/nuxt/{pages.crud.vue.eta → pages.new.vue.eta} +68 -71
  42. package/templates/basic/nuxt/simpleapp.generate.client.ts.eta +6 -6
  43. package/templates/nest/src/simpleapp/generate/commons/interceptors/response.interceptor.ts.eta +1 -1
  44. package/templates/nest/src/simpleapp/generate/commons/user.context.ts.eta +20 -10
  45. package/templates/nest/src/simpleapp/generate/models/apievent.model.ts.eta +1 -1
  46. package/templates/nest/src/simpleapp/generate/processors/simpleapp.processor.ts.eta +8 -9
  47. package/templates/nest/src/simpleapp/generate/types/apievent.type.ts.eta +1 -1
  48. package/templates/nest/src/simpleapp/profile/profile.service.ts.eta +16 -7
  49. package/templates/nest/src/simpleapp/services/autoinc.service.ts.eta +10 -7
  50. package/templates/nest/src/simpleapp/services/branch.service.ts.eta +2 -2
  51. package/templates/nuxt/assets/css/style.css._eta +32 -0
  52. package/templates/nuxt/assets/primevue/passthrough.ts._eta +9 -2
  53. package/templates/nuxt/components/{DebugDocumentData.vue.eta → debug/DebugDocumentData.vue.eta} +8 -4
  54. package/templates/nuxt/components/{EventNotification.vue.eta → event/EventNotification.vue.eta} +13 -9
  55. package/templates/nuxt/components/{HeaderBar.vue.eta → header/HeaderBar.vue.eta} +6 -6
  56. package/templates/nuxt/components/{SelectBranch.vue.eta → header/HeaderSelectBranch.vue.eta} +2 -2
  57. package/templates/nuxt/components/{ButtonMenuPicker.vue.eta → header/button/HeaderButtonMenuPicker.vue.eta} +3 -3
  58. package/templates/nuxt/components/list/ListView.vue.eta +64 -0
  59. package/templates/nuxt/components/renderer/RendererForeignKey.vue.eta +11 -0
  60. package/templates/nuxt/components/renderer/index.ts.eta +12 -0
  61. package/templates/nuxt/components/simpleApp/SimpleAppDocumentNo.vue.eta +77 -0
  62. package/templates/nuxt/components/{SimpleFieldContainer.vue.eta → simpleApp/SimpleAppFieldContainer.vue.eta} +12 -11
  63. package/templates/nuxt/components/{SimpleAppForm.vue.eta → simpleApp/SimpleAppForm.vue.eta} +5 -4
  64. package/templates/nuxt/components/simpleApp/SimpleAppInput.vue.eta +288 -0
  65. package/templates/nuxt/components/simpleApp/SimpleAppInputTable.vue.eta +56 -0
  66. package/templates/nuxt/components/{SimpleAppAutocomplete.vue.eta → simpleApp/pending/SimpleAppAutocomplete.vue} +14 -3
  67. package/templates/nuxt/components/{SimpleAppAutocompletemulti.vue.eta → simpleApp/pending/SimpleAppAutocompletemulti.vue} +1 -1
  68. package/templates/nuxt/components/{SimpleAppCalendar.vue.eta → simpleApp/pending/SimpleAppCalendar.vue} +1 -1
  69. package/templates/nuxt/components/{SimpleAppCheckbox.vue.eta → simpleApp/pending/SimpleAppCheckbox.vue} +1 -1
  70. package/templates/nuxt/components/{SimpleAppChip.vue.eta → simpleApp/pending/SimpleAppChip.vue} +1 -1
  71. package/templates/nuxt/components/{SimpleAppColor.vue.eta → simpleApp/pending/SimpleAppColor.vue} +1 -1
  72. package/templates/nuxt/components/{SimpleAppDocumentNo.vue.eta → simpleApp/pending/SimpleAppDocumentNo.vue} +1 -1
  73. package/templates/nuxt/components/{SimpleAppEditor.vue.eta → simpleApp/pending/SimpleAppEditor.vue} +1 -1
  74. package/templates/nuxt/components/{SimpleAppInputTable.vue.eta → simpleApp/pending/SimpleAppInputTable.vue} +1 -22
  75. package/templates/nuxt/components/{SimpleAppList.vue.eta → simpleApp/pending/SimpleAppList.vue} +1 -1
  76. package/templates/nuxt/components/{SimpleAppListmulti.vue.eta → simpleApp/pending/SimpleAppListmulti.vue} +1 -1
  77. package/templates/nuxt/components/{SimpleAppNumber.vue.eta → simpleApp/pending/SimpleAppNumber.vue} +12 -1
  78. package/templates/nuxt/components/{SimpleAppPassword.vue.eta → simpleApp/pending/SimpleAppPassword.vue} +1 -1
  79. package/templates/nuxt/components/{SimpleAppRadio.vue.eta → simpleApp/pending/SimpleAppRadio.vue} +1 -1
  80. package/templates/nuxt/components/{SimpleAppRating.vue.eta → simpleApp/pending/SimpleAppRating.vue} +1 -1
  81. package/templates/nuxt/components/{SimpleAppSelect.vue.eta → simpleApp/pending/SimpleAppSelect.vue} +12 -2
  82. package/templates/nuxt/components/{SimpleAppSelectmulti.vue.eta → simpleApp/pending/SimpleAppSelectmulti.vue} +1 -1
  83. package/templates/nuxt/components/{SimpleAppSlider.vue.eta → simpleApp/pending/SimpleAppSlider.vue} +1 -1
  84. package/templates/nuxt/components/{SimpleAppSwitch.vue.eta → simpleApp/pending/SimpleAppSwitch.vue} +1 -1
  85. package/templates/nuxt/components/{SimpleAppText.vue.eta → simpleApp/pending/SimpleAppText.vue} +13 -4
  86. package/templates/nuxt/components/{SimpleAppTextarea.vue.eta → simpleApp/pending/SimpleAppTextarea.vue} +13 -2
  87. package/templates/nuxt/components/{SimpleAppDatatable.vue.eta → table/TableDocuments.vue.eta} +15 -63
  88. package/templates/nuxt/components/{UserProfileListItem.vue.eta → user/UserProfileListItem.vue.eta} +1 -1
  89. package/templates/nuxt/composables/getMenus.generate.ts.eta +4 -1
  90. package/templates/nuxt/composables/getOpenApi.generate.ts.eta +32 -1
  91. package/templates/nuxt/composables/goTo.generate.ts.eta +7 -0
  92. package/templates/nuxt/composables/notifications.generate.ts.eta +1 -1
  93. package/templates/nuxt/composables/stringHelper.generate.ts.eta +1 -0
  94. package/templates/nuxt/layouts/default.vue.eta +1 -1
  95. package/templates/nuxt/layouts/documentlist.vue.eta +24 -8
  96. package/templates/nuxt/layouts/sidelist.vue.eta +68 -0
  97. package/templates/nuxt/layouts/sidelistcrud.vue.eta +1 -1
  98. package/templates/nuxt/nuxt.config.ts.eta +0 -1
  99. package/templates/nuxt/pages/[xorg]/branch/index.vue.etax +2 -2
  100. package/templates/nuxt/pages/[xorg]/docnoformat/{[id].vue.eta → [doctype]/[id].vue.eta} +2 -5
  101. package/templates/nuxt/pages/[xorg]/docnoformat/[doctype]/new.vue.eta +222 -0
  102. package/templates/nuxt/pages/[xorg]/docnoformat/[doctype].vue.eta +33 -0
  103. package/templates/nuxt/pages/[xorg]/docnoformat/index.vue.eta +4 -294
  104. package/templates/nuxt/pages/[xorg]/docnoformat.vue.eta +100 -0
  105. package/templates/nuxt/pages/[xorg]/organization/[bid].vue.eta +14 -0
  106. package/templates/nuxt/pages/[xorg]/organization/[id]/branches/[bid].vue +13 -0
  107. package/templates/nuxt/pages/[xorg]/organization/[id]/branches/new.vue +149 -0
  108. package/templates/nuxt/pages/[xorg]/organization/[id]/index.vue.eta +1 -0
  109. package/templates/nuxt/pages/[xorg]/organization/new.vue.eta +151 -0
  110. package/templates/nuxt/pages/[xorg]/organization.vue.eta +145 -0
  111. package/templates/nuxt/pages/[xorg]/user/index.vue.eta +23 -23
  112. package/templates/nuxt/pages/[xorg]/user.vue.eta +13 -11
  113. package/templates/nuxt/pages/index.vue._eta +2 -2
  114. package/templates/nuxt/plugins/20.simpleapp-userstore.ts.eta +10 -1
  115. package/templates/nuxt/simpleapp/generate/clients/SimpleAppClient.ts.eta +1 -1
  116. package/templates/nuxt/types/documentlist.ts.eta +2 -2
  117. package/templates/nuxt/types/index.ts.eta +2 -1
  118. package/templates/nuxt/types/simpleappinput.ts.eta +39 -0
  119. package/templates/project/jsonschemas/category.json._eta +5 -5
  120. package/templates/project/jsonschemas/customer.json._eta +5 -5
  121. package/templates/project/jsonschemas/invoice.json._eta +7 -7
  122. package/templates/project/jsonschemas/product.json._eta +5 -5
  123. package/tsconfig.tsbuildinfo +1 -1
  124. package/templates/nuxt/components/ListView.vue.eta +0 -52
  125. package/templates/nuxt/components/renderers/ForeignKeyRender.vue.eta +0 -10
  126. package/templates/nuxt/composables/getAutocomplete.generate.ts.eta +0 -32
  127. package/templates/nuxt/pages/[xorg]/organization/index.vue.eta +0 -168
  128. /package/templates/nuxt/components/{EventDecision.vue.eta → event/EventDecision.vue.eta} +0 -0
  129. /package/templates/nuxt/components/{ButtonHome.vue.eta → header/button/HeaderButtonHome.vue.eta} +0 -0
  130. /package/templates/nuxt/components/{ButtonLogout.vue.eta → header/button/HeaderButtonLogout.vue.eta} +0 -0
  131. /package/templates/nuxt/components/{ButtonProfile.vue.eta → header/button/HeaderButtonProfile.vue.eta} +0 -0
  132. /package/templates/nuxt/components/{renderers/BooleanRender.vue.eta → renderer/RendererBoolean.vue.eta} +0 -0
  133. /package/templates/nuxt/components/{renderers/DateRender.vue.eta → renderer/RendererDate.vue.eta} +0 -0
  134. /package/templates/nuxt/components/{renderers/MoneyRender.vue.eta → renderer/RendererMoney.vue.eta} +0 -0
  135. /package/templates/nuxt/components/{renderers/MultiTextRender.vue.eta → renderer/RendererMultiText.vue.eta} +0 -0
  136. /package/templates/nuxt/components/{SimpleAppDynamicInput.vue.eta → simpleApp/pending/SimpleAppDynamicInput.vue} +0 -0
  137. /package/templates/nuxt/components/{SimpleAppValue.vue.eta → simpleApp/pending/SimpleAppValue.vue} +0 -0
  138. /package/templates/nuxt/components/{helper.ts.eta → simpleApp/pending/helper.ts-backup} +0 -0
  139. /package/templates/nuxt/components/{type.ts.eta → simpleApp/pending/type.ts-backup} +0 -0
  140. /package/templates/nuxt/components/{CrudNestedDoc.vue.eta → suspended/CrudNestedDoc.vue.eta} +0 -0
  141. /package/templates/nuxt/components/{CrudSimple.vue.eta → suspended/CrudSimple.vue.eta} +0 -0
  142. /package/templates/nuxt/components/{Menus.vue.eta → suspended/Menus.vue.eta} +0 -0
  143. /package/templates/nuxt/components/{Spinner.vue.eta → suspended/Spinner.vue.eta} +0 -0
  144. /package/templates/nuxt/components/{ButtonCreateTenant.vue.eta → user/UserButtonCreateTenant.vue.eta} +0 -0
  145. /package/templates/nuxt/components/{ButtonPermissionInfo.vue.eta → user/UserButtonPermissionInfo.vue.eta} +0 -0
  146. /package/templates/nuxt/components/{Invitation.vue.eta → user/UserInvitation.vue.eta} +0 -0
  147. /package/templates/nuxt/components/{TenantPicker.vue.eta → user/UserTenantPicker.vue.eta} +0 -0
@@ -0,0 +1,288 @@
1
+ <template>
2
+ <SimpleAppFieldContainer :hidelabel="hidelabel" v-model="modelValue"
3
+ :label="label" :description="description"
4
+ :setting="setting" :instancepath="instancepath" :error="error" #default="slotprops">
5
+ <!-- binary input -->
6
+ <component :is="inputComponent" :readonly="isReadonly" :pt="pt"
7
+ v-if="[SimpleAppInputType.checkbox,SimpleAppInputType.switch ].includes(inputType)"
8
+ :inputId="slotprops.uuid" :path="setting.instancepath"
9
+ v-model="modelValue" :binary="true"/>
10
+
11
+ <!-- date component -->
12
+ <component :is="inputComponent" type="date" :pt="pt"
13
+ v-else-if="inputType == SimpleAppInputType.date"
14
+ :inputId="slotprops.uuid" :path="setting.instancepath"
15
+ v-model="datevalue" @update:modelValue="updateDate" :readonly="isReadonly"/>
16
+ <!-- calendar component -->
17
+ <component :is="inputComponent" type="date" :pt="pt" class="flex flex-col"
18
+ v-else-if="SimpleAppInputType.calendar==inputType"
19
+ :inputId="slotprops.uuid" :path="setting.instancepath"
20
+ v-model="datevalue" @update:modelValue="updateDate" :readonly="isReadonly"/>
21
+
22
+ <!-- select/list component -->
23
+ <component :is="inputComponent" v-model="modelValue" :pt="pt"
24
+ v-else-if="[SimpleAppInputType.select,SimpleAppInputType.list].includes(inputType)"
25
+ :inputId="slotprops.uuid" :path="setting.instancepath"
26
+ :readonly="isReadonly"
27
+ :options="getListOptions()" optionLabel="label" optionValue="value"/>
28
+
29
+ <!-- radio component -->
30
+ <div v-else-if="inputType == SimpleAppInputType.radio" >
31
+ <div v-for="(item,index) in getListOptions()">
32
+ <component :pt="pt" :is="inputComponent" v-model="modelValue"
33
+ :inputId="setting.key+'-'+index" name="smaple" :value="item.value"
34
+ :readonly="isReadonly"
35
+ /> {{ ' ' }}
36
+ <label :for="setting.key+'-'+index"> {{ item.label }} </label>
37
+ </div>
38
+ </div>
39
+
40
+ <!-- autocomplete -->
41
+ <AutoComplete :is="inputComponent" v-model="modelValue"
42
+ v-else-if="inputType==SimpleAppInputType.autocomplete"
43
+ forceSelection optionLabel="label" :dropdown="true"
44
+ @item-select="pickAutoComplete"
45
+ @complete="getListFromAutocompleteApi"
46
+
47
+ :pt="{
48
+ root:{class:'rounded-lg flex flex-row'},
49
+ input:{class:'w-full font-sans text-gray-600 dark:text-white/80 bg-white dark:bg-gray-900 border border-gray-300 dark:border-blue-900/40 rounded-lg rounded-tr-none rounded-br-none transition-colors duration-200 appearance-none hover:border-blue-500 focus:outline-none focus:outline-offset-0 focus:shadow-[0_0_0_0.2rem_rgba(191,219,254,1)] dark:focus:shadow-[0_0_0_0.2rem_rgba(147,197,253,0.5)] text-base'},
50
+ loadingIcon:{class:'hidden'},
51
+ dropdownbutton: {
52
+ root:' bg-primary-600 hover:bg-primary-400 text-white rounded flex flex-row p-3 rounded-tl-none rounded-bl-none '
53
+ }
54
+ }"
55
+ :disabled="isReadonly"
56
+ :suggestions="list"
57
+ @blur="onBlurAutocomplete"
58
+ :inputId="slotprops.uuid" :path="setting.instancepath"
59
+ :readonly="isReadonly"
60
+ />
61
+
62
+ <!-- document no input-->
63
+ <SimpleAppDocumentNo v-else-if="inputType == SimpleAppInputType.documentno"
64
+ :setting="setting" v-model="modelValue" :inputId="slotprops.uuid"
65
+ :readonly="isReadonly" @update:docNoFormat="triggerDocNoFormatChange"
66
+ :path="setting.instancepath"/>
67
+
68
+
69
+ <!-- password -->
70
+ <component :is="inputComponent"
71
+ v-else-if="inputType == SimpleAppInputType.password"
72
+ :type="type" v-model="modelValue" :pt="pt"
73
+ :readonly="isReadonly" class="flex flex-col"
74
+ :inputId="slotprops.uuid" :path="setting.instancepath"/>
75
+
76
+ <!-- rating -->
77
+ <Rating v-else-if="inputType == SimpleAppInputType.rating"
78
+ :is="inputComponent" :type="type" v-model="modelValue" :pt="pt"
79
+ :readonly="isReadonly"
80
+ :inputId="slotprops.uuid" :path="setting.instancepath"/>
81
+
82
+ <!-- chip -->
83
+ <component v-else-if="inputType == SimpleAppInputType.chip"
84
+ :is="inputComponent" :type="type" v-model="modelValue"
85
+ :pt="pt"
86
+ :disabled="isReadonly"
87
+
88
+
89
+ :inputId="slotprops.uuid" :path="setting.instancepath"/>
90
+ <!-- simple component -->
91
+ <component v-else :is="inputComponent" :type="type" v-model="modelValue" :pt="pt"
92
+ :readonly="isReadonly"
93
+ class="w-full flex flex-col"
94
+ :inputId="slotprops.uuid" :path="setting.instancepath"/>
95
+
96
+
97
+ <!-- component require special treatment -->
98
+
99
+ </SimpleAppFieldContainer>
100
+ </template>
101
+
102
+ <script lang="ts" setup>
103
+ import { isNull, pick } from 'lodash';
104
+ import {autocompletetype} from '~/types'
105
+ import moment from 'moment'
106
+ import AutoComplete from 'primevue/autocomplete';
107
+ import Calendar from 'primevue/calendar';
108
+ import Checkbox from 'primevue/checkbox';
109
+ import Chips from 'primevue/chips';
110
+ import SimpleAppDocumentNo from './SimpleAppDocumentNo.vue';
111
+ import Dropdown from 'primevue/dropdown';
112
+ import InputNumber from 'primevue/inputnumber';
113
+ import InputSwitch from 'primevue/inputswitch';
114
+ import InputText from 'primevue/inputtext';
115
+ import Listbox from 'primevue/listbox';
116
+ import MultiSelect from 'primevue/multiselect';
117
+ import Password from 'primevue/password';
118
+ import RadioButton from 'primevue/radiobutton';
119
+ import Rating from 'primevue/rating';
120
+ import Slider from 'primevue/slider';
121
+ import Textarea from 'primevue/textarea';
122
+ import {SimpleAppInputType} from '~/types'
123
+
124
+ let inputComponent :Component
125
+ const emptyautocomplete =():autocompletetype=> ({_id:'',label:''})
126
+ const autocompleteitem = ref<autocompletetype>(emptyautocomplete())
127
+ const datevalue = ref('')
128
+ const modelValue = defineModel()
129
+ const list = ref([])
130
+ const props = withDefaults( defineProps<{
131
+ inputType:SimpleAppInputType,
132
+ label?:string,
133
+ description?:string,
134
+ error?:string,
135
+ setting:any,
136
+ type?:string,
137
+ instancepath?:string,
138
+ hidelabel?: boolean
139
+ readonly?: boolean
140
+ pt?:any
141
+ }>(),{type:'text'})
142
+
143
+
144
+ switch(props.inputType){
145
+ case SimpleAppInputType.text:
146
+ inputComponent = InputText
147
+ break;
148
+ case SimpleAppInputType.textarea:
149
+ inputComponent = Textarea
150
+ break;
151
+ case SimpleAppInputType.number:
152
+ inputComponent = InputNumber
153
+ break
154
+ case SimpleAppInputType.date:
155
+ inputComponent = InputText
156
+ break;
157
+ case SimpleAppInputType.calendar:
158
+ inputComponent = Calendar
159
+ break;
160
+ case SimpleAppInputType.autocomplete:
161
+ inputComponent = AutoComplete
162
+ break;
163
+ case SimpleAppInputType.autocompletemultiple: //*
164
+ inputComponent = AutoComplete
165
+ break;
166
+ case SimpleAppInputType.selectmultiple: //*
167
+ inputComponent = MultiSelect
168
+ break;
169
+ case SimpleAppInputType.listmultiple: //*
170
+ break;
171
+ case SimpleAppInputType.radio: //*
172
+ inputComponent = RadioButton
173
+ break;
174
+ case SimpleAppInputType.select: //*
175
+ inputComponent = Dropdown
176
+ break;
177
+ case SimpleAppInputType.list: //*
178
+ inputComponent = Listbox
179
+ break;
180
+ case SimpleAppInputType.chip: //*
181
+ inputComponent = Chips
182
+ break;
183
+ case SimpleAppInputType.checkbox:
184
+ inputComponent = Checkbox
185
+ break;
186
+ case SimpleAppInputType.switch:
187
+ inputComponent = InputSwitch
188
+ break;
189
+ case SimpleAppInputType.documentno: //*
190
+ break;
191
+ case SimpleAppInputType.password:
192
+ inputComponent = Password
193
+ break;
194
+ case SimpleAppInputType.rating:
195
+ inputComponent = Rating
196
+ break;
197
+ case SimpleAppInputType.slider:
198
+ inputComponent = Slider
199
+ break;
200
+
201
+ }
202
+ const isReadonly = computed(()=>{
203
+ if(props.readonly){
204
+ return props.readonly
205
+ }else if(props.setting.readonly){
206
+ return props.setting.readonly
207
+ }else{
208
+ return false
209
+ }
210
+ })
211
+
212
+ const updateDate = (value:any)=>{
213
+ modelValue.value = moment(value).toISOString()
214
+ }
215
+
216
+
217
+ const getListOptions = () =>{
218
+
219
+ const options = []
220
+ if(props.setting.fieldsetting.enum){
221
+ for(let i=0;i<props.setting.fieldsetting.enum.length;i++){
222
+ const v = props.setting.fieldsetting.enum[i]
223
+ options.push({value:v, label: camelCaseToWords(v)})
224
+ }
225
+
226
+
227
+ }
228
+ return options
229
+ }
230
+
231
+
232
+ const emits = defineEmits(['change','update:modelValue','update:docNoFormat'])
233
+
234
+ watch(modelValue ,(newvalue:any)=>{
235
+
236
+ if([SimpleAppInputType.date,SimpleAppInputType.calendar].includes(props.inputType)){
237
+ datevalue.value = moment(modelValue.value as string ).format('YYYY-MM-DD')
238
+ }else if(props.inputType==SimpleAppInputType.autocomplete){
239
+ modelValue.value=autocompleteitem.value
240
+ }
241
+
242
+ emits('change',modelValue.value)
243
+ emits('update:modelValue',modelValue.value)
244
+ })
245
+
246
+
247
+ /************ start autocomplete only ***************/
248
+ const onBlurAutocomplete = ()=>{
249
+
250
+ if( autocompleteitem.value === null){
251
+ autocompleteitem.value = emptyautocomplete()
252
+ }
253
+ if(isNull(modelValue.value )){
254
+ modelValue.value = autocompleteitem.value
255
+ }
256
+ else if(typeof modelValue.value =='object'){
257
+
258
+ }else{
259
+ modelValue.value = autocompleteitem.value
260
+ }
261
+
262
+ }
263
+ const getListFromAutocompleteApi = (event:any)=>{
264
+ const keyword = event.query??''
265
+ //props.setting.document.getDocType()
266
+ const targetDocument = props.setting.fieldsetting['x-foreignkey']
267
+ getDocumentApi(targetDocument).autoComplete(keyword).then((res:any)=>{
268
+ list.value = res.data
269
+ })
270
+ }
271
+ const pickAutoComplete = (event:any)=>{
272
+ if(typeof event.value.query == 'undefined'){
273
+ modelValue.value=event.value
274
+ autocompleteitem.value = event.value
275
+ }
276
+ }
277
+ /************ end autocomplete only ***************/
278
+
279
+
280
+
281
+
282
+
283
+ const triggerDocNoFormatChange=(formatdata:any)=>{
284
+ emits('update:docNoFormat',formatdata)
285
+ }
286
+ </script>
287
+ <style scoped>
288
+ </style>
@@ -0,0 +1,56 @@
1
+ <template>
2
+ <DataTable v-bind="$attrs" stripedRows resizableColumns
3
+ class="simpleapp-datatable p-datatable-sm" :value="modelValue">
4
+ <template #empty> <div class="text-center">No record found.</div> </template>
5
+ <template #header >
6
+ <div>
7
+ <Button icon="pi pi-plus" @click="addNew()" class="simpleapp-datatable-add btn-primary" type="button">Add</Button>
8
+ </div>
9
+ </template>
10
+ <slot>
11
+
12
+
13
+ <Column class="text-center" header="undefine columns">
14
+ <template #body>
15
+ <div class="text-center">Missing {{ '<Column></Column>' }}</div>
16
+ </template>
17
+
18
+ </Column>
19
+
20
+
21
+
22
+
23
+ </slot>
24
+
25
+
26
+ </DataTable>
27
+ </template>
28
+ <script setup lang="ts">
29
+
30
+ import {ref} from 'vue'
31
+ import DataTable from 'primevue/datatable';
32
+ import Column from 'primevue/column';
33
+
34
+ const props = defineProps<{
35
+ // columns:InputTableColumn[],
36
+ setting:any,
37
+ getField:Function,
38
+ }>()
39
+
40
+
41
+ //{path: '#/properties/details', instancepath: '/details', fieldsetting: {…}, modelObject: Proxy(Object), apiObj: INVApi, …}
42
+ const modelValue = defineModel<any[]>()
43
+
44
+
45
+ const addNew = () => {
46
+ const field = props.setting.path.split('/').at(-1)
47
+ props.setting.document[`add${field}`]()
48
+ }
49
+ /**
50
+ * 1. support array with field to label
51
+ * 2. auto add edit button
52
+ * 3. option readonly or not readonly
53
+ * 4.
54
+ */
55
+
56
+ </script>
@@ -2,6 +2,7 @@
2
2
  <FieldContainer :hidelabel="hidelabel" v-model="modelValue" :label="label" :description="description" :setting="setting" :instancepath="instancepath" :error="error" #default="slotprops">
3
3
 
4
4
  <div v-if="componentErr!=''" class="input-error">{{componentErr}}</div>
5
+ <span v-else-if="isReadonly" readonly class="readonly-input">{{ selecteditem[optionLabel] }}</span>
5
6
  <AutoComplete v-else
6
7
  class="simpleapp-inputfield simpleapp-autocomplete flex flex-row "
7
8
  :inputId="slotprops.uuid"
@@ -14,6 +15,7 @@
14
15
  @complete="getListFromAutocompleteApi"
15
16
  :suggestions="list"
16
17
  forceSelection
18
+
17
19
  :dropdown="dropdown"
18
20
  :pt="{
19
21
  // root:{class: 'w-full' },
@@ -29,7 +31,7 @@
29
31
 
30
32
  import {computed,watch,ref} from 'vue'
31
33
  import AutoComplete from 'primevue/autocomplete';
32
- import FieldContainer from './SimpleFieldContainer.vue'
34
+ import FieldContainer from './SimpleAppFieldContainer.vue'
33
35
  import {prepareList} from './helper'
34
36
  import type {SimpleAppFieldSetting,ListOptionType} from './type'
35
37
  import { SimpleAppClient } from '../simpleapp/generate/clients/SimpleAppClient'
@@ -113,12 +115,21 @@ const onblur = ()=>{
113
115
  selecteditem.value={...modelValue.value}
114
116
  if(typeof selecteditem.value[labelfield]=='undefined'){
115
117
  selecteditem.value[labelfield]=''
116
- }
117
- // console.log("selecteditem.value",selecteditem.value)
118
+ }
118
119
  }
119
120
  const capitalizeFirstLetter = (str: string) => {
120
121
  const res = str == '' ? '' : str.slice(0, 1).toUpperCase() + str.slice(1);
121
122
  // const res = str;
122
123
  return res;
123
124
  };
125
+
126
+ const isReadonly = computed(()=>{
127
+ if(props.readonly){
128
+ return props.readonly
129
+ }else if(props.setting.readonly){
130
+ return props.setting.readonly
131
+ }else{
132
+ return false
133
+ }
134
+ })
124
135
  </script>
@@ -19,7 +19,7 @@
19
19
 
20
20
  import {computed,watch,ref} from 'vue'
21
21
  import AutoComplete from 'primevue/autocomplete';
22
- import FieldContainer from './SimpleFieldContainer.vue'
22
+ import FieldContainer from './SimpleAppFieldContainer.vue'
23
23
  import {prepareList} from './helper'
24
24
  import type {SimpleAppFieldSetting,ListOptionType} from './type'
25
25
  import type { JSONSchema7 } from 'json-schema';
@@ -10,7 +10,7 @@
10
10
  </FieldContainer>
11
11
  </template>
12
12
  <script setup lang="ts">
13
- import FieldContainer from './SimpleFieldContainer.vue'
13
+ import FieldContainer from './SimpleAppFieldContainer.vue'
14
14
  import { ref, watch,computed } from "vue"
15
15
  import moment from 'moment'
16
16
  import Calendar from 'primevue/calendar';
@@ -15,7 +15,7 @@
15
15
  <script lang="ts" setup>
16
16
  // import {Ref} from 'vue'
17
17
  import Checkbox from 'primevue/checkbox';
18
- import FieldContainer from './SimpleFieldContainer.vue'
18
+ import FieldContainer from './SimpleAppFieldContainer.vue'
19
19
 
20
20
  const modelValue = defineModel<boolean>()
21
21
  const props = defineProps<{
@@ -11,7 +11,7 @@
11
11
  <script lang="ts" setup>
12
12
  import {computed,watch,ref} from 'vue'
13
13
  import Chips from 'primevue/chips';
14
- import FieldContainer from './SimpleFieldContainer.vue'
14
+ import FieldContainer from './SimpleAppFieldContainer.vue'
15
15
  // const modelValue = defineModel()
16
16
 
17
17
  const modelValue=defineModel()
@@ -14,7 +14,7 @@
14
14
  import {computed,watch,ref} from 'vue'
15
15
  import ColorPicker from 'primevue/colorpicker';
16
16
 
17
- import FieldContainer from './SimpleFieldContainer.vue'
17
+ import FieldContainer from './SimpleAppFieldContainer.vue'
18
18
  const modelValue = defineModel()
19
19
  const props = defineProps<{
20
20
  label?:string,
@@ -33,7 +33,7 @@ import {ForeignKey} from '~/types'
33
33
  import OverlayPanel from 'primevue/overlaypanel';
34
34
  import {computed,watch,ref} from 'vue'
35
35
  import InputText from 'primevue/inputtext';
36
- import FieldContainer from './SimpleFieldContainer.vue'
36
+ import FieldContainer from './SimpleAppFieldContainer.vue'
37
37
  import {DocNoFormat} from "~/types"
38
38
  const selectedformat = ref()
39
39
  const op = ref();
@@ -16,7 +16,7 @@ import {computed,watch,ref} from 'vue'
16
16
  import Editor from 'primevue/editor';
17
17
 
18
18
 
19
- import FieldContainer from './SimpleFieldContainer.vue'
19
+ import FieldContainer from './SimpleAppFieldContainer.vue'
20
20
  const modelValue = defineModel()
21
21
  const props = defineProps<{
22
22
  label?:string,
@@ -20,28 +20,7 @@
20
20
 
21
21
  <!-- </template> -->
22
22
 
23
- </slot>
24
-
25
-
26
-
27
-
28
-
29
-
30
-
31
-
32
-
33
-
34
-
35
- <!-- <Column v-for="(col,index) in columns" :field="col.field" :style="col.style" :header="camelCaseToWords(col.title??'')">
36
- <template #body="{ data, field,index }">
37
- <SimpleAppDynamicInput v-if="modelValue" :instancepath="getInstancePath(index,field)" :setting="getChildFieldSetting(field)" v-model="modelValue[index][field]" :getAutocomplete="getAutocomplete" :hidelabel="true" />
38
- </template>
39
- </Column>
40
- <Column v-if="!readonly">
41
- <template #body="{data,field,index}">
42
- <Button class="simpleapp-inputtable-delrow button-danger" @click="deleteRow(index)" type="button">X</Button>
43
- </template>
44
- </Column> -->
23
+ </slot>
45
24
  </DataTable>
46
25
  </template>
47
26
  <script setup lang="ts">
@@ -15,7 +15,7 @@
15
15
  <script lang="ts" setup>
16
16
  import {computed,watch,ref} from 'vue'
17
17
  import Listbox from 'primevue/listbox';
18
- import FieldContainer from './SimpleFieldContainer.vue'
18
+ import FieldContainer from './SimpleAppFieldContainer.vue'
19
19
  import {prepareList,simpleArrayToObject} from './helper'
20
20
  import type {SimpleAppFieldSetting} from './type'
21
21
  import type { JSONSchema7 } from 'json-schema';
@@ -16,7 +16,7 @@
16
16
  <script lang="ts" setup>
17
17
  import {computed,watch,ref} from 'vue'
18
18
  import Listbox from 'primevue/listbox';
19
- import FieldContainer from './SimpleFieldContainer.vue'
19
+ import FieldContainer from './SimpleAppFieldContainer.vue'
20
20
  import {prepareList,simpleArrayToObject} from './helper'
21
21
  import type {SimpleAppFieldSetting} from './type'
22
22
  import type { JSONSchema7 } from 'json-schema';
@@ -6,13 +6,14 @@
6
6
  v-model="modelValue"
7
7
  :path="setting.instancepath"
8
8
  :pt="{input:{class:'text-right w-full'}}"
9
+ :readonly="isReadonly"
9
10
  ></InputNumber>
10
11
  </FieldContainer>
11
12
  </template>
12
13
  <script lang="ts" setup>
13
14
  import {computed,watch,ref} from 'vue'
14
15
  import InputNumber from 'primevue/inputnumber';
15
- import FieldContainer from './SimpleFieldContainer.vue'
16
+ import FieldContainer from './SimpleAppFieldContainer.vue'
16
17
  const props = withDefaults(defineProps<{
17
18
  label?:string,
18
19
  description?:string,
@@ -20,11 +21,21 @@ const props = withDefaults(defineProps<{
20
21
  error?:string,
21
22
  instancepath?:string,
22
23
  hidelabel?:boolean
24
+ readonly?:boolean
23
25
  }>(),{
24
26
  hidelabel:false
25
27
  })
26
28
  const emit = defineEmits(['change'])
27
29
  const modelValue =defineModel()
30
+ const isReadonly = computed(()=>{
31
+ if(props.readonly){
32
+ return props.readonly
33
+ }else if(props.setting.readonly){
34
+ return props.setting.readonly
35
+ }else{
36
+ return false
37
+ }
38
+ })
28
39
  watch(modelValue,()=>{
29
40
  // props.setting.document.validateFailed()
30
41
  emit('change',modelValue)
@@ -13,7 +13,7 @@
13
13
  <script lang="ts" setup>
14
14
  import {computed,watch,ref} from 'vue'
15
15
  import Password from 'primevue/password';
16
- import FieldContainer from './SimpleFieldContainer.vue'
16
+ import FieldContainer from './SimpleAppFieldContainer.vue'
17
17
  const modelValue = defineModel()
18
18
  const props = defineProps<{
19
19
  label?:string,
@@ -21,7 +21,7 @@
21
21
  </template>
22
22
  <script lang="ts" setup>
23
23
  import RadioButton from 'primevue/radiobutton';
24
- import FieldContainer from './SimpleFieldContainer.vue'
24
+ import FieldContainer from './SimpleAppFieldContainer.vue'
25
25
  import {prepareList,simpleArrayToObject} from './helper'
26
26
  import type {ListOptionType} from './type'
27
27
  const modelValue = defineModel()
@@ -14,7 +14,7 @@
14
14
  import {computed,watch,ref} from 'vue'
15
15
  import Rating from 'primevue/rating';
16
16
 
17
- import FieldContainer from './SimpleFieldContainer.vue'
17
+ import FieldContainer from './SimpleAppFieldContainer.vue'
18
18
  const modelValue = defineModel()
19
19
  const props = defineProps<{
20
20
  label?:string,
@@ -9,13 +9,14 @@
9
9
  optionLabel="label"
10
10
  :path="setting.instancepath"
11
11
  :options="options"
12
+ :readonly="isReadonly"
12
13
  />
13
14
  </FieldContainer>
14
15
  </template>
15
16
  <script lang="ts" setup>
16
17
  import {computed,watch,ref} from 'vue'
17
18
  import Dropdown from 'primevue/dropdown';
18
- import FieldContainer from './SimpleFieldContainer.vue'
19
+ import FieldContainer from './SimpleAppFieldContainer.vue'
19
20
  import {prepareList,simpleArrayToObject} from './helper'
20
21
  import type {ListOptionType} from './type'
21
22
  import type { JSONSchema7 } from 'json-schema';
@@ -29,10 +30,19 @@ const props = defineProps<{
29
30
  optionValue?:string,
30
31
  instancepath?:string,
31
32
  options?:any[]
33
+ readonly?:boolean
32
34
  }>()
33
35
 
34
36
  const optionValue = props.optionValue ?? 'value'
35
37
  const optionLabel = props.optionLabel ?? 'label'
36
38
  const options = prepareList('oneOf',props.setting.fieldsetting,optionLabel,optionValue,props.options,)
37
-
39
+ const isReadonly = computed(()=>{
40
+ if(props.readonly){
41
+ return props.readonly
42
+ }else if(props.setting.readonly){
43
+ return props.setting.readonly
44
+ }else{
45
+ return false
46
+ }
47
+ })
38
48
  </script>
@@ -16,7 +16,7 @@
16
16
  <script lang="ts" setup>
17
17
  import {computed,watch,ref} from 'vue'
18
18
  import MultiSelect from 'primevue/multiselect';
19
- import FieldContainer from './SimpleFieldContainer.vue'
19
+ import FieldContainer from './SimpleAppFieldContainer.vue'
20
20
  import {prepareList,simpleArrayToObject} from './helper'
21
21
  import type {SimpleAppFieldSetting} from './type'
22
22
  import type { JSONSchema7 } from 'json-schema';
@@ -15,7 +15,7 @@ import {computed,watch,ref} from 'vue'
15
15
  import Slider from 'primevue/slider';
16
16
 
17
17
 
18
- import FieldContainer from './SimpleFieldContainer.vue'
18
+ import FieldContainer from './SimpleAppFieldContainer.vue'
19
19
  const modelValue = defineModel()
20
20
  const props = defineProps<{
21
21
  label?:string,
@@ -15,7 +15,7 @@
15
15
  <script lang="ts" setup>
16
16
  // import {Ref} from 'vue'
17
17
  import InputSwitch from 'primevue/inputswitch';
18
- import FieldContainer from './SimpleFieldContainer.vue'
18
+ import FieldContainer from './SimpleAppFieldContainer.vue'
19
19
 
20
20
  const modelValue = defineModel<boolean>()
21
21
  const props = defineProps<{