@simitgroup/simpleapp-generator 1.0.63 → 1.0.64

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 (125) 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.js +3 -3
  14. package/dist/generate.js +2 -2
  15. package/dist/generate.js.map +1 -1
  16. package/dist/processors/jsonschemabuilder.d.ts.map +1 -1
  17. package/dist/processors/jsonschemabuilder.js +6 -6
  18. package/dist/processors/jsonschemabuilder.js.map +1 -1
  19. package/dist/type.d.ts +7 -19
  20. package/dist/type.d.ts.map +1 -1
  21. package/docs/backend.md +2 -2
  22. package/docs/jsonschema.md +6 -6
  23. package/package.json +1 -1
  24. package/src/buildinschemas/autoincreament.ts +6 -6
  25. package/src/buildinschemas/branch.ts +3 -3
  26. package/src/buildinschemas/docnoformat.ts +5 -5
  27. package/src/buildinschemas/organization.ts +3 -3
  28. package/src/buildinschemas/permission.ts +5 -5
  29. package/src/buildinschemas/tenant.ts +2 -2
  30. package/src/buildinschemas/user.ts +3 -3
  31. package/src/generate.ts +2 -2
  32. package/src/processors/jsonschemabuilder.ts +7 -9
  33. package/src/processors/jsonschemabuilder.ts-old +5 -5
  34. package/src/type.ts +20 -20
  35. package/templates/basic/nest/controller.ts.eta +18 -18
  36. package/templates/basic/nest/processor.ts.eta +1 -1
  37. package/templates/basic/nuxt/pages.[id].vue.eta +1 -1
  38. package/templates/basic/nuxt/pages.landing.vue.eta +11 -16
  39. package/templates/basic/nuxt/{pages.crud.vue.eta → pages.new.vue.eta} +22 -9
  40. package/templates/basic/nuxt/simpleapp.generate.client.ts.eta +6 -6
  41. package/templates/nest/src/simpleapp/generate/commons/interceptors/response.interceptor.ts.eta +1 -1
  42. package/templates/nest/src/simpleapp/generate/commons/user.context.ts.eta +20 -10
  43. package/templates/nest/src/simpleapp/generate/models/apievent.model.ts.eta +1 -1
  44. package/templates/nest/src/simpleapp/generate/processors/simpleapp.processor.ts.eta +8 -8
  45. package/templates/nest/src/simpleapp/generate/types/apievent.type.ts.eta +1 -1
  46. package/templates/nest/src/simpleapp/profile/profile.service.ts.eta +16 -7
  47. package/templates/nest/src/simpleapp/services/autoinc.service.ts.eta +10 -7
  48. package/templates/nest/src/simpleapp/services/branch.service.ts.eta +2 -2
  49. package/templates/nuxt/assets/css/style.css._eta +4 -0
  50. package/templates/nuxt/assets/primevue/passthrough.ts._eta +2 -1
  51. package/templates/nuxt/components/{SimpleAppDatatable.vue.eta → DocumentDatatable.vue.eta} +15 -63
  52. package/templates/nuxt/components/ListView.vue.eta +38 -26
  53. package/templates/nuxt/components/UserProfileListItem.vue.eta +1 -1
  54. package/templates/nuxt/components/{EventNotification.vue.eta → event/EventNotification.vue.eta} +1 -1
  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/renderer/RendererForeignKey.vue.eta +11 -0
  59. package/templates/nuxt/components/renderer/index.ts.eta +12 -0
  60. package/templates/nuxt/components/{SimpleAppAutocomplete.vue.eta → simpleApp/SimpleAppAutocomplete.vue.eta} +13 -1
  61. package/templates/nuxt/components/{SimpleAppAutocompletemulti.vue.eta → simpleApp/SimpleAppAutocompletemulti.vue.eta} +1 -1
  62. package/templates/nuxt/components/{SimpleAppCalendar.vue.eta → simpleApp/SimpleAppCalendar.vue.eta} +1 -1
  63. package/templates/nuxt/components/{SimpleAppCheckbox.vue.eta → simpleApp/SimpleAppCheckbox.vue.eta} +1 -1
  64. package/templates/nuxt/components/{SimpleAppChip.vue.eta → simpleApp/SimpleAppChip.vue.eta} +1 -1
  65. package/templates/nuxt/components/{SimpleAppColor.vue.eta → simpleApp/SimpleAppColor.vue.eta} +1 -1
  66. package/templates/nuxt/components/{SimpleAppDocumentNo.vue.eta → simpleApp/SimpleAppDocumentNo.vue.eta} +1 -1
  67. package/templates/nuxt/components/{SimpleAppEditor.vue.eta → simpleApp/SimpleAppEditor.vue.eta} +1 -1
  68. package/templates/nuxt/components/{SimpleAppList.vue.eta → simpleApp/SimpleAppList.vue.eta} +1 -1
  69. package/templates/nuxt/components/{SimpleAppListmulti.vue.eta → simpleApp/SimpleAppListmulti.vue.eta} +1 -1
  70. package/templates/nuxt/components/{SimpleAppNumber.vue.eta → simpleApp/SimpleAppNumber.vue.eta} +12 -1
  71. package/templates/nuxt/components/{SimpleAppPassword.vue.eta → simpleApp/SimpleAppPassword.vue.eta} +1 -1
  72. package/templates/nuxt/components/{SimpleAppRadio.vue.eta → simpleApp/SimpleAppRadio.vue.eta} +1 -1
  73. package/templates/nuxt/components/{SimpleAppRating.vue.eta → simpleApp/SimpleAppRating.vue.eta} +1 -1
  74. package/templates/nuxt/components/{SimpleAppSelect.vue.eta → simpleApp/SimpleAppSelect.vue.eta} +12 -2
  75. package/templates/nuxt/components/{SimpleAppSelectmulti.vue.eta → simpleApp/SimpleAppSelectmulti.vue.eta} +1 -1
  76. package/templates/nuxt/components/{SimpleAppSlider.vue.eta → simpleApp/SimpleAppSlider.vue.eta} +1 -1
  77. package/templates/nuxt/components/{SimpleAppSwitch.vue.eta → simpleApp/SimpleAppSwitch.vue.eta} +1 -1
  78. package/templates/nuxt/components/{SimpleAppText.vue.eta → simpleApp/SimpleAppText.vue.eta} +13 -2
  79. package/templates/nuxt/components/{SimpleAppTextarea.vue.eta → simpleApp/SimpleAppTextarea.vue.eta} +13 -2
  80. package/templates/nuxt/composables/getMenus.generate.ts.eta +4 -1
  81. package/templates/nuxt/composables/goTo.generate.ts.eta +7 -0
  82. package/templates/nuxt/composables/notifications.generate.ts.eta +1 -1
  83. package/templates/nuxt/composables/stringHelper.generate.ts.eta +1 -0
  84. package/templates/nuxt/layouts/documentlist.vue.eta +23 -7
  85. package/templates/nuxt/layouts/sidelist.vue.eta +68 -0
  86. package/templates/nuxt/pages/[xorg]/branch/index.vue.etax +2 -2
  87. package/templates/nuxt/pages/[xorg]/docnoformat/{[id].vue.eta → [doctype]/[id].vue.eta} +2 -5
  88. package/templates/nuxt/pages/[xorg]/docnoformat/[doctype]/new.vue.eta +216 -0
  89. package/templates/nuxt/pages/[xorg]/docnoformat/[doctype].vue.eta +33 -0
  90. package/templates/nuxt/pages/[xorg]/docnoformat/index.vue.eta +4 -294
  91. package/templates/nuxt/pages/[xorg]/docnoformat.vue.eta +100 -0
  92. package/templates/nuxt/pages/[xorg]/organization/[bid].vue.eta +14 -0
  93. package/templates/nuxt/pages/[xorg]/organization/[id]/branches/[bid].vue +13 -0
  94. package/templates/nuxt/pages/[xorg]/organization/[id]/branches/new.vue +149 -0
  95. package/templates/nuxt/pages/[xorg]/organization/[id]/index.vue.eta +1 -0
  96. package/templates/nuxt/pages/[xorg]/organization/new.vue.eta +145 -0
  97. package/templates/nuxt/pages/[xorg]/organization.vue.eta +130 -0
  98. package/templates/nuxt/pages/[xorg]/user/index.vue.eta +28 -33
  99. package/templates/nuxt/pages/[xorg]/user.vue.eta +3 -3
  100. package/templates/nuxt/plugins/20.simpleapp-userstore.ts.eta +6 -0
  101. package/templates/nuxt/simpleapp/generate/clients/SimpleAppClient.ts.eta +1 -1
  102. package/templates/nuxt/types/documentlist.ts.eta +2 -2
  103. package/templates/project/jsonschemas/category.json._eta +2 -2
  104. package/templates/project/jsonschemas/customer.json._eta +2 -2
  105. package/templates/project/jsonschemas/invoice.json._eta +4 -4
  106. package/templates/project/jsonschemas/product.json._eta +2 -2
  107. package/tsconfig.tsbuildinfo +1 -1
  108. package/templates/nuxt/components/renderers/ForeignKeyRender.vue.eta +0 -10
  109. package/templates/nuxt/pages/[xorg]/organization/index.vue.eta +0 -168
  110. /package/templates/nuxt/components/{DebugDocumentData.vue.eta → debug/DebugDocumentData.vue.eta} +0 -0
  111. /package/templates/nuxt/components/{EventDecision.vue.eta → event/EventDecision.vue.eta} +0 -0
  112. /package/templates/nuxt/components/{ButtonHome.vue.eta → header/button/HeaderButtonHome.vue.eta} +0 -0
  113. /package/templates/nuxt/components/{ButtonLogout.vue.eta → header/button/HeaderButtonLogout.vue.eta} +0 -0
  114. /package/templates/nuxt/components/{ButtonProfile.vue.eta → header/button/HeaderButtonProfile.vue.eta} +0 -0
  115. /package/templates/nuxt/components/{renderers/BooleanRender.vue.eta → renderer/RendererBoolean.vue.eta} +0 -0
  116. /package/templates/nuxt/components/{renderers/DateRender.vue.eta → renderer/RendererDate.vue.eta} +0 -0
  117. /package/templates/nuxt/components/{renderers/MoneyRender.vue.eta → renderer/RendererMoney.vue.eta} +0 -0
  118. /package/templates/nuxt/components/{renderers/MultiTextRender.vue.eta → renderer/RendererMultiText.vue.eta} +0 -0
  119. /package/templates/nuxt/components/{SimpleAppDynamicInput.vue.eta → simpleApp/SimpleAppDynamicInput.vue.eta} +0 -0
  120. /package/templates/nuxt/components/{SimpleFieldContainer.vue.eta → simpleApp/SimpleAppFieldContainer.vue.eta} +0 -0
  121. /package/templates/nuxt/components/{SimpleAppForm.vue.eta → simpleApp/SimpleAppForm.vue.eta} +0 -0
  122. /package/templates/nuxt/components/{SimpleAppInputTable.vue.eta → simpleApp/SimpleAppInputTable.vue.eta} +0 -0
  123. /package/templates/nuxt/components/{SimpleAppValue.vue.eta → simpleApp/SimpleAppValue.vue.eta} +0 -0
  124. /package/templates/nuxt/components/{helper.ts.eta → simpleApp/helper.ts.eta} +0 -0
  125. /package/templates/nuxt/components/{type.ts.eta → simpleApp/type.ts.eta} +0 -0
@@ -215,7 +215,7 @@ export class SimpleAppService<T extends { _id?: string }> {
215
215
 
216
216
 
217
217
  Object.assign(pipeline[0]['$match'],isolationFilter);
218
- console.log("final agg",pipeline)
218
+ //console.log("final agg",pipeline)
219
219
  return await this.doc.aggregate(pipeline)
220
220
  }catch(err){
221
221
  throw new InternalServerErrorException(err);
@@ -330,12 +330,12 @@ export class SimpleAppService<T extends { _id?: string }> {
330
330
  }
331
331
  }else if(key == 'created'){
332
332
  data['created'] = (transtype == 'create' || !data['created']) ? new Date() .toISOString() : data['created']
333
- }else if(key == 'createdby'){
334
- data['createdby'] = (transtype == 'create' || !data['createdby']) ? appuser.getUid() : data['createdby']
333
+ }else if(key == 'createdBy'){
334
+ data['createdBy'] = (transtype == 'create' || !data['createdBy']) ? appuser.getUid() : data['createdBy']
335
335
  }else if(key == 'updated'){
336
336
  data['updated'] = new Date() .toISOString()
337
- }else if(key == 'updatedby'){
338
- data['updatedby'] = appuser.getUid()
337
+ }else if(key == 'updatedBy'){
338
+ data['updatedBy'] = appuser.getUid()
339
339
  }
340
340
  }
341
341
 
@@ -422,7 +422,7 @@ export class SimpleAppService<T extends { _id?: string }> {
422
422
  await this.hook(appuser,HookType.beforeDelete, id);
423
423
  this.logger.debug('delete record',this.documentName, id);
424
424
  dependency = await this.getRelatedRecords(id);
425
- console.log('dependency', dependency);
425
+ //console.log('dependency', dependency);
426
426
  if (!dependency) {
427
427
  let filterIsolation = this.getIsolationFilter(appuser);
428
428
  this.polishIsolationFilter(filterIsolation)
@@ -440,7 +440,7 @@ export class SimpleAppService<T extends { _id?: string }> {
440
440
  //this.doc.findByIdAndDelete(id);
441
441
  return deleteresult;
442
442
  } else {
443
- console.log("reject query",dependency)
443
+ //console.log("reject query",dependency)
444
444
 
445
445
  throw new ForbiddenException('Foreignkey constraint',dependency)
446
446
  }
@@ -609,7 +609,7 @@ export class SimpleAppService<T extends { _id?: string }> {
609
609
  }
610
610
 
611
611
  keystore[collectionname]= results
612
- console.log("keystorekeystore",keystore)
612
+ //console.log("keystorekeystore",keystore)
613
613
  let addfield={$addFields:{collection:collectionname}}
614
614
 
615
615
  const stagefilter:PipelineStage = {
@@ -9,7 +9,7 @@ export type ApiEvent = {
9
9
  created: string
10
10
  updated?:string
11
11
  duration: number
12
- createdby: string
12
+ createdBy: string
13
13
  path: string
14
14
  ip: string
15
15
  method: string
@@ -146,7 +146,7 @@ export class ProfileService {
146
146
  orgId: orgResult.orgId,
147
147
  branchId: branchResult.branchId,
148
148
  uid: appuser.getUid(),
149
- fullname: appuser.getFullname(),
149
+ fullName: appuser.getFullname(),
150
150
  email: appuser.getEmail(),
151
151
  active: true,
152
152
  };
@@ -176,13 +176,22 @@ export class ProfileService {
176
176
 
177
177
  this.logger.log(permResult, 'create Permission result');
178
178
 
179
-
180
179
  //tenant owner shall map to userId for that tenant
181
-
182
- const tenantUpdateData = await this.tenantsvc.findById(appuser,tenantResult._id)
183
- this.logger.log(tenantUpdateData, `update tenant owner(${tenantResult._id})`);
184
- tenantUpdateData.owner._id = userRecordId
185
- const updateTenantOwnerResult = await this.tenantsvc.findIdThenUpdate(appuser,tenantResult._id,tenantUpdateData)
180
+
181
+ const tenantUpdateData = await this.tenantsvc.findById(
182
+ appuser,
183
+ tenantResult._id,
184
+ );
185
+ this.logger.log(
186
+ tenantUpdateData,
187
+ `update tenant owner(${tenantResult._id})`,
188
+ );
189
+ tenantUpdateData.owner._id = userRecordId;
190
+ const updateTenantOwnerResult = await this.tenantsvc.findIdThenUpdate(
191
+ appuser,
192
+ tenantResult._id,
193
+ tenantUpdateData,
194
+ );
186
195
  if (!updateTenantOwnerResult) {
187
196
  throw new BadRequestException('Update tenant owner failed');
188
197
  }
@@ -15,9 +15,7 @@ export { Autoincreament } from '../generate/types/autoinc.type';
15
15
 
16
16
  @Injectable()
17
17
  export class AutoincreamentService extends AutoincreamentProcessor {
18
- constructor(
19
- @InjectModel('Autoincreament') mydoc: Model<Autoincreament>,
20
- ) {
18
+ constructor(@InjectModel('Autoincreament') mydoc: Model<Autoincreament>) {
21
19
  super(mydoc);
22
20
  }
23
21
 
@@ -69,18 +67,23 @@ export class AutoincreamentService extends AutoincreamentProcessor {
69
67
  if (res.length > 0) {
70
68
  // console.log("FOUND RESULT------")
71
69
  const tmp = res[0];
72
- const nextno = tmp.nextno;
70
+ const nextno = tmp.nextNo;
73
71
  data = { collectionName: collection, fieldName: field, nextno: nextno };
74
72
  this.findIdThenUpdate(appuser, tmp._id, {
75
73
  collectionName: collection,
76
74
  fieldName: field,
77
- nextno: tmp.nextno + 1,
75
+ nextNo: tmp.nextNo + 1,
78
76
  });
79
77
  } else {
80
78
  // console.log("CREATE ROW------")
81
- this.data = { collectionName: collection, fieldName: field, nextno: 2 };
79
+ this.data = { collectionName: collection, fieldName: field, nextNo: 2 };
82
80
  const createResult = await this.create(appuser, this.data);
83
- data = { _id:crypto.randomUUID(), collectionName: collection, fieldName: field, nextno: 1 };
81
+ data = {
82
+ _id: crypto.randomUUID(),
83
+ collectionName: collection,
84
+ fieldName: field,
85
+ nextno: 1,
86
+ };
84
87
  }
85
88
 
86
89
  return data;
@@ -80,8 +80,8 @@ export class BranchService extends BranchProcessor {
80
80
  const pattern = `${doc.docType}-${branchCode}-[00000]`;
81
81
  const formatdata: Docnoformat = {
82
82
  _id: crypto.randomUUID(),
83
- docNoFormatNo: doc.docType,
84
- docNoFormatName: `Default ${doc.docType}`,
83
+ docNoFormatNo: `${doc.docType}-${branchCode}`,
84
+ docNoFormatName: `Default ${doc.docType} - ${branchCode}`,
85
85
  docNoType: doc.docType,
86
86
  docNoPattern: pattern,
87
87
  branch: { _id: recordId, branchId: branchId, label: branchName },
@@ -1,3 +1,7 @@
1
1
  .router-link-exact-active{
2
2
  @apply bg-primary-100 block
3
+ }
4
+
5
+ [readonly]{
6
+ @apply bg-gray-300
3
7
  }
@@ -23,7 +23,8 @@ const CustomTailwind = usePassThrough(
23
23
  label:{class: 'text-sm'},
24
24
  },
25
25
  button:{root:{class: 'focus:outline-none transition duration-150 ease-in-out rounded px-8 py-2 m-1 border'}},
26
- dialog:{root:{class:['border p-2']}},
26
+ dialog:{root:{class:['border p-2']}},
27
+ // column:{ root:{class:'p-0'},bodyCell:{class:'p-0'}},
27
28
  sidebar:{
28
29
  root:{class:'w-1/2 bg-white border p-2 h-full'}
29
30
  },
@@ -1,59 +1,9 @@
1
- <!-- <template>
2
- <DataTable v-bind="$attrs"
3
- stripedRows
4
- dataKey="_id"
5
- :pt="{
6
- bodyRow:{class:'bg-blue-200'},
7
- wrapper:{class:'bg-red-100'},
8
-
9
- root:{class:'bg-green-100'},
10
- header:{class:'bg-blue-600'},
11
- pagebutton:{class:'bg-red-800'},
12
-
13
- tfoot:{class:'bg-red-800 boder round m-4 gap-4'},
14
- }"
15
-
16
- :value="valueModel"
17
- :filters="filters"
18
- :paginator="true" :rows="20"
19
- :rowsPerPageOptions="[20,40,60,100]"
20
- filterDisplay="row"
21
- >
22
-
23
- <template #empty> <div class="text-center">No record found.</div> </template>
24
- <template #header><slot name="header">
25
- <div class="flex flex-wrap gap-2 align-items-center justify-content-between">
26
- <h4 class="m-0 flex-1">Records</h4>
27
- <span class="p-input-icon-left">
28
- <i class="pi pi-search" />
29
- <InputText v-model="filters['global'].value" placeholder="Search..." />
30
- </span>
31
- </div>
32
-
33
- </slot></template>
34
- <Column v-for="(col,index) in columns" :field="col" :header="camelCaseToWords(col)"></Column>
35
- <slot >
36
-
37
- </slot>
38
- </DataTable>
39
- </template>
40
- <script setup lang="ts">
41
- import { FilterMatchMode } from 'primevue/api';
42
- import DataTable from 'primevue/datatable';
43
- import Column from 'primevue/column';
44
- import {camelCaseToWords} from './helper'
45
- const props = defineProps<{columns:string[]|string[][]}>()
46
- const valueModel = defineModel<Object[]>()
47
- const filters = ref({
48
- 'global': {value: null, matchMode: FilterMatchMode.CONTAINS},
49
- });
50
-
51
- </script> -->
52
1
  <template>
53
2
  <DataTable v-bind="$attrs"
54
3
  stripedRows
55
4
  dataKey="_id"
56
5
  :showGridlines="true"
6
+ size="small"
57
7
  :pt="{
58
8
  // header:{ class:'border bg-gray-100'},
59
9
  headerRow:{ class:'border bg-gray-200'},
@@ -90,9 +40,11 @@ const valueModel = defineModel<Object[]>()
90
40
  </div>
91
41
  </template>
92
42
 
93
- <Column v-for="(col,index) in columns" :field="typeof col == 'string' ? col : col.field">
43
+ <Column v-for="(col,index) in columns" sortable :field="typeof col == 'string' ? col : col.field"
44
+
45
+ >
94
46
  <template v-if="typeof col == 'string'" #header>
95
- <p >{{ col }}</p>
47
+ <p >{{ t(col) }}</p>
96
48
  </template>
97
49
  <template v-else-if="typeof col =='object'" #header>
98
50
  <span>{{ col.title }} </span>
@@ -105,11 +57,11 @@ const valueModel = defineModel<Object[]>()
105
57
  <p >{{ data[col] }}</p>
106
58
  </template>
107
59
  <template v-else-if="typeof col =='object'" #body="{index,data}">
108
- <div v-if="col.component && col.field=='*'">
109
- <component :is="col.component" :value="data" :fields="col.moreFields" :class="col.cssClass" :setting="col.componentSetting"></component>
60
+ <div v-if="col.rendererName && col.field=='*'">
61
+ <component :is="renderComponent[col.rendererName]" :value="data" :fields="col.moreFields" :class="col.cssClass" :setting="col.rendererSetting"></component>
110
62
  </div>
111
- <div v-else-if="col.component && col.field!='*'">
112
- <component :is="col.component" v-model="data[col.field]" :moreFields="col.moreFields" :class="col.cssClass" :setting="col.componentSetting" ></component>
63
+ <div v-else-if="col.rendererName && col.field!='*'">
64
+ <component :is="renderComponent[col.rendererName]" v-model="data[col.field]" :moreFields="col.moreFields" :class="col.cssClass" :setting="col.rendererSetting" ></component>
113
65
  </div>
114
66
  <div v-else class="flex flex-col">
115
67
  <div :class="col.class">{{ data[col.field] }}</div>
@@ -118,11 +70,11 @@ const valueModel = defineModel<Object[]>()
118
70
  <div v-if="typeof f == 'string'" :class="'text-gray-400 text-sm' + f.cssClass??'' ">{{ data[f] }}</div>
119
71
  <!-- additional field define as object -->
120
72
  <div v-else>
121
- <div v-if="f.component && f.field=='*'">
122
- <component :is="f.component" :value="data" :class="f.cssClass" :setting="f.componentSetting"></component>
73
+ <div v-if="f.rendererName && f.field=='*'">
74
+ <component :is="renderComponent[f.rendererName]" :value="data" :class="f.cssClass" :setting="f.rendererSetting"></component>
123
75
  </div>
124
- <div v-else-if="f.component && f.field!='*'">
125
- <component :is="f.component" v-model="data[f.field]" :class="f.cssClass" :setting="f.componentSetting" ></component>
76
+ <div v-else-if="f.rendererName && f.field!='*'">
77
+ <component :is="renderComponent[f.rendererName]" v-model="data[f.field]" :class="f.cssClass" :setting="f.rendererSetting" ></component>
126
78
  </div>
127
79
  <div v-else>
128
80
  <div :class="f.cssClass">{{ data[f.field] }}</div>
@@ -143,11 +95,11 @@ const valueModel = defineModel<Object[]>()
143
95
  </Datatable>
144
96
  </template>
145
97
  <script setup lang="ts">
146
- import {SearchBody,CellSetting} from '~/types'
98
+ import {CellSetting} from '~/types'
147
99
  import { FilterMatchMode } from 'primevue/api';
148
100
  import DataTable from 'primevue/datatable';
149
101
  import Column from 'primevue/column';
150
-
102
+ import renderComponent from '~/components/renderer'
151
103
  const props = defineProps<{
152
104
  value:any[]
153
105
  columns: CellSetting[]
@@ -1,42 +1,54 @@
1
1
  <template>
2
2
  <div>
3
- <input
4
- autofocus
5
- placeholder="search"
6
- v-model="searchvalue"
7
- class="w-full border p-2"
8
- type="search" />
9
- </div>
10
- <div class="max-h-screen overflow-auto">
11
- <ul >
12
-
13
- <li v-for="item in filterlist">
14
-
15
- <div :class="getSelectedCSS(item)">
16
- <a class="flex flex-row " @click="clickRow(item)">
17
- <div class="mr-2">{{item.name }}</div>
18
- <div class="font font-bold text-right">{{item.code}}</div>
19
- </a>
20
- </div>
21
-
22
- </li>
23
- </ul>
3
+ <div v-if="withFilter">
4
+ <input
5
+ autofocus
6
+ placeholder="search"
7
+ v-model="searchvalue"
8
+ class="w-full border p-2"
9
+ type="search" />
10
+ </div>
11
+ <div class="max-h-screen overflow-auto">
12
+ <ul >
13
+ <li v-for="item in filterlist">
14
+ <div :class="getSelectedCSS(item)">
15
+ <NuxtLink :to="`${url}/${item[idField]}`">
16
+ <div class="mr-2">{{item[titleField] }}</div>
17
+ <div class="font font-bold text-right">{{item[subTitleField]}}</div>
18
+ </NuxtLink>
19
+ </div>
20
+
21
+ </li>
22
+ </ul>
23
+ </div>
24
24
  </div>
25
25
  </template>
26
26
  <script setup lang="ts">
27
27
  import {ref} from 'vue'
28
28
  import {ListItem} from '~/types/listview'
29
- const props = defineProps<{list:any[]}>()
29
+ const props = withDefaults(defineProps<{
30
+ list:any[],
31
+ url:string,
32
+ titleField:string
33
+ idField?:string
34
+ subTitleField:string
35
+ withFilter?:boolean
36
+ }>(),{
37
+ idField:'_id'
38
+ })
30
39
  const emit = defineEmits(['clickitem'])
31
40
  const searchvalue = ref('')
32
41
  const selecteditem =ref('')
33
42
  const clickRow=(item:ListItem)=>{
34
- emit('clickitem',item)
35
- selecteditem.value = item.code
43
+ // emit('clickitem',item)
44
+ // selecteditem.value = item.code
36
45
  }
37
46
  const filterlist = computed(()=>{
38
- const newlist =props.list.filter(item=>
39
- String(item.name).toLowerCase().includes(searchvalue.value.toLowerCase()))
47
+ const newlist =props.list.filter((item:any)=>
48
+ {
49
+ return String(item[props.titleField]).toLowerCase().includes(searchvalue.value.toLowerCase()) ||
50
+ String(item[props.subTitleField]).toLowerCase().includes(searchvalue.value.toLowerCase())
51
+ })
40
52
 
41
53
  return newlist
42
54
  })
@@ -5,7 +5,7 @@
5
5
  <div class="flex min-w-0 gap-x-4">
6
6
  <img class="h-12 w-12 flex-none rounded-full bg-gray-50" :src="`${getAvatarLink(data.email,32)}`" alt="" />
7
7
  <div class="min-w-0 flex-auto">
8
- <p class="text-sm font-semibold leading-6 text-gray-900">{{ data.fullname }}</p>
8
+ <p class="text-sm font-semibold leading-6 text-gray-900">{{ data.fullName }}</p>
9
9
  <p class="mt-1 truncate text-xs leading-5 text-gray-500">{{ data.email }}</p>
10
10
  </div>
11
11
  </div>
@@ -20,7 +20,7 @@ let resmsg:ToastMessageOptions = {} as ToastMessageOptions
20
20
 
21
21
  $listen("Notification",(data:Notification)=>{
22
22
  // $listen('*',(type:key of EventType,data:any)=>{
23
- console.log("Event type",'data',data)
23
+
24
24
  const type:NotificationStatus = data.status
25
25
  // let arrupdate = type.split(':')
26
26
  // let eventdata = data
@@ -1,7 +1,7 @@
1
1
  <script setup lang="ts">
2
- import ButtonMenuPicker from "./ButtonMenuPicker.vue"
2
+ //import ButtonMenuPicker from "./ButtonMenuPicker.vue"
3
3
 
4
- import ButtonProfile from './ButtonProfile.vue';
4
+ //import ButtonProfile from './ButtonProfile.vue';
5
5
 
6
6
 
7
7
  </script>
@@ -13,22 +13,22 @@ import ButtonProfile from './ButtonProfile.vue';
13
13
 
14
14
  <div class="flex-1 flex flex-row gap-2 p-2">
15
15
  <div class="">
16
- <ButtonMenuPicker/>
16
+ <HeaderButtonMenuPicker/>
17
17
 
18
18
  </div>
19
19
  <div class="">
20
- <ButtonHome/>
20
+ <HeaderButtonHome/>
21
21
  </div>
22
22
 
23
23
  </div>
24
24
  <div class="flex-1 flex flex-row-reverse gap-2 p-2">
25
25
 
26
26
  <div class=" text-right">
27
- <ButtonProfile/>
27
+ <HeaderButtonProfile/>
28
28
  </div>
29
29
 
30
30
  <div class="">
31
- <SelectBranch/>
31
+ <HeaderSelectBranch/>
32
32
  </div>
33
33
  </div>
34
34
 
@@ -4,7 +4,7 @@ import {ref} from 'vue'
4
4
 
5
5
  const selectedbranch = ref(getCurrentXorg())
6
6
  const currentTenant=ref(getUserProfile().tenantId)
7
- console.log("currentTenant",currentTenant.value)
7
+
8
8
  type Org = {orgId:number, label:string,_id:string}
9
9
  const branches = getUserProfile().branches.filter((item:any)=>{return item.branch.tenantId == currentTenant.value})
10
10
  const orgList:Org[] = _.uniqBy(branches,'branch.orgId').map((item)=>({
@@ -24,7 +24,7 @@ const switchXorg = ()=>{
24
24
  navigateTo(`/${selectedbranch.value}`,{external:true})
25
25
  }
26
26
 
27
- console.log("selectedbranch",selectedbranch.value)
27
+
28
28
  </script>
29
29
  <template>
30
30
  <div>
@@ -20,10 +20,10 @@ const selectMenu = (menu:MenuData) =>{
20
20
  </svg>
21
21
  </button>
22
22
 
23
- <Dialog v-model:visible="visible" modal header="Pick Document" >
23
+ <Dialog v-model:visible="visible" modal header="Pick Document" :pt="{dialog:{ class:' bg-primary-800 ' }}">
24
24
  <div class="">
25
- <Button v-for="menu in menus" @click="selectMenu(menu)">
26
- <div v-if="menu.isolationType == 'none'" class="">
25
+ <Button v-for="menu in menus" @click="selectMenu(menu)" >
26
+ <div v-if="menu.isolationType == 'none'" class="text-warning-600 hover:text-warning-500">
27
27
  * {{ camelCaseToWords(menu.label) }}
28
28
  </div>
29
29
  <div v-else class="">{{ camelCaseToWords(menu.label) }}</div>
@@ -0,0 +1,11 @@
1
+ <template>
2
+ <NuxtLink v-if="setting?.collection" :to="getDocumentUrl(setting.collection,modelValue ? modelValue['_id']:'')" class="text-primary-700 hover:text-primary-500 cursor-pointer">
3
+ {{modelValue?.label}}
4
+ </NuxtLink>
5
+ <span v-else>{{modelValue?.label || modelValue}}</span>
6
+ </template>
7
+ <script setup lang="ts">
8
+ const modelValue = defineModel()
9
+
10
+ const props = defineProps<{setting:any}>()
11
+ </script>
@@ -0,0 +1,12 @@
1
+ import RendererBoolean from './RendererBoolean.vue'
2
+ import RendererDate from './RendererDate.vue'
3
+ import RendererForeignKey from './RendererForeignKey.vue'
4
+ import RendererMoney from './RendererMoney.vue'
5
+ import RendererMultiText from './RendererMultiText.vue'
6
+
7
+
8
+ export default {
9
+
10
+ RendererBoolean,RendererDate,RendererForeignKey,RendererMoney,RendererMultiText
11
+
12
+ };
@@ -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'
@@ -121,4 +123,14 @@ const capitalizeFirstLetter = (str: string) => {
121
123
  // const res = str;
122
124
  return res;
123
125
  };
126
+
127
+ const isReadonly = computed(()=>{
128
+ if(props.readonly){
129
+ return props.readonly
130
+ }else if(props.setting.readonly){
131
+ return props.setting.readonly
132
+ }else{
133
+ return false
134
+ }
135
+ })
124
136
  </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,
@@ -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';