@simitgroup/simpleapp-generator 1.6.2-alpha → 1.6.4-alpha

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 (161) hide show
  1. package/README.md +6 -5
  2. package/dist/buildinschemas/branch.d.ts.map +1 -1
  3. package/dist/buildinschemas/branch.js +1 -2
  4. package/dist/buildinschemas/branch.js.map +1 -1
  5. package/dist/buildinschemas/changehistories.d.ts +3 -0
  6. package/dist/buildinschemas/changehistories.d.ts.map +1 -0
  7. package/dist/buildinschemas/changehistories.js +36 -0
  8. package/dist/buildinschemas/changehistories.js.map +1 -0
  9. package/dist/buildinschemas/index.d.ts +1 -0
  10. package/dist/buildinschemas/index.d.ts.map +1 -1
  11. package/dist/buildinschemas/index.js +3 -1
  12. package/dist/buildinschemas/index.js.map +1 -1
  13. package/dist/buildinschemas/organization.js +2 -2
  14. package/dist/buildinschemas/organization.js.map +1 -1
  15. package/dist/buildinschemas/user.d.ts.map +1 -1
  16. package/dist/buildinschemas/user.js +5 -1
  17. package/dist/buildinschemas/user.js.map +1 -1
  18. package/dist/buildinschemas/webhook.d.ts +3 -0
  19. package/dist/buildinschemas/webhook.d.ts.map +1 -0
  20. package/dist/buildinschemas/webhook.js +33 -0
  21. package/dist/buildinschemas/webhook.js.map +1 -0
  22. package/dist/framework.d.ts.map +1 -1
  23. package/dist/framework.js +3 -2
  24. package/dist/framework.js.map +1 -1
  25. package/dist/generate.js +30 -11
  26. package/dist/generate.js.map +1 -1
  27. package/dist/index.js +4 -1
  28. package/dist/index.js.map +1 -1
  29. package/dist/processors/jsonschemabuilder.d.ts.map +1 -1
  30. package/dist/processors/jsonschemabuilder.js +10 -2
  31. package/dist/processors/jsonschemabuilder.js.map +1 -1
  32. package/dist/type.d.ts +2 -0
  33. package/dist/type.d.ts.map +1 -1
  34. package/package.json +1 -1
  35. package/src/buildinschemas/branch.ts +1 -2
  36. package/src/buildinschemas/changehistories.ts +33 -0
  37. package/src/buildinschemas/index.ts +2 -1
  38. package/src/buildinschemas/organization.ts +2 -2
  39. package/src/buildinschemas/user.ts +5 -1
  40. package/src/buildinschemas/webhook.ts +31 -0
  41. package/src/framework.ts +3 -2
  42. package/src/generate.ts +35 -15
  43. package/src/index.ts +8 -3
  44. package/src/processors/jsonschemabuilder.ts +10 -2
  45. package/src/type.ts +2 -0
  46. package/templates/basic/nest/controller.ts.eta +23 -2
  47. package/templates/basic/nest/model.ts.eta +9 -1
  48. package/templates/basic/nest/resolver.ts.eta +2 -2
  49. package/templates/basic/nuxt/pages.[id].vue.eta +7 -7
  50. package/templates/basic/nuxt/pages.form.vue.eta +3 -6
  51. package/templates/basic/nuxt/pages.landing.vue.eta +2 -21
  52. package/templates/basic/nuxt/simpleapp.generate.client.ts.eta +8 -1
  53. package/templates/nest/src/simpleapp/generate/apischemas/simpleapp.apischema.ts.eta +2 -0
  54. package/templates/nest/src/simpleapp/generate/commons/dicts/documents.ts.eta +9 -2
  55. package/templates/nest/src/simpleapp/generate/commons/docnogenerator.service.ts.eta +36 -30
  56. package/templates/nest/src/simpleapp/generate/commons/roles/roles.enum.ts.eta +5 -10
  57. package/templates/nest/src/simpleapp/generate/commons/roles/roles.group.ts.eta +1 -0
  58. package/templates/nest/src/simpleapp/generate/commons/runwebhook.service.ts.eta +50 -0
  59. package/templates/nest/src/simpleapp/generate/commons/user.context.ts.eta +13 -3
  60. package/templates/nest/src/simpleapp/generate/controllers/simpleapp.controller.ts.eta +9 -1
  61. package/templates/nest/src/simpleapp/generate/processors/branch.processor.ts.eta +12 -6
  62. package/templates/nest/src/simpleapp/generate/processors/simpleapp.processor.ts.eta +128 -14
  63. package/templates/nest/src/simpleapp/generate/types/schema.type.ts.eta +3 -1
  64. package/templates/nest/src/simpleapp/generate/types/simpleapp.type.ts.eta +1 -0
  65. package/templates/nest/src/simpleapp/profile/profile.controller.ts.eta +19 -0
  66. package/templates/nest/src/simpleapp/profile/profile.service.ts.eta +30 -8
  67. package/templates/nest/src/simpleapp/simpleapp.module.ts.eta +2 -1
  68. package/templates/nuxt/{app.vue._eta → app.vue.eta} +3 -1
  69. package/templates/nuxt/assets/css/calendar.css._eta +3 -0
  70. package/templates/nuxt/assets/css/style.css._eta +1 -1
  71. package/templates/nuxt/assets/images/unknown.png.eta +0 -0
  72. package/templates/nuxt/assets/primevue/passthrough.ts._eta +6 -1
  73. package/templates/nuxt/components/button/ButtonAction.vue._eta +49 -7
  74. package/templates/nuxt/components/button/ButtonDanger.vue._eta +11 -3
  75. package/templates/nuxt/components/button/ButtonDefault.vue._eta +11 -3
  76. package/templates/nuxt/components/button/ButtonPrimary.vue._eta +9 -3
  77. package/templates/nuxt/components/button/ButtonSecondary.vue._eta +33 -0
  78. package/templates/nuxt/components/button/ButtonText.vue._eta +9 -5
  79. package/templates/nuxt/components/button/ButtonWarning.vue._eta +11 -3
  80. package/templates/nuxt/components/calendar/CalendarInput.vue.eta +17 -14
  81. package/templates/nuxt/components/calendar/CalendarSmall.vue.eta +33 -16
  82. package/templates/nuxt/components/chart/card.vue._eta +1 -1
  83. package/templates/nuxt/components/debug/DebugDocumentData.vue.eta +36 -26
  84. package/templates/nuxt/components/event/EventDocumentViewer.vue._eta +62 -22
  85. package/templates/nuxt/components/form/FormBranch.vue._eta +52 -5
  86. package/templates/nuxt/components/form/FormDocnoformat.vue.eta +14 -10
  87. package/templates/nuxt/components/form/FormUser.vue._eta +1 -1
  88. package/templates/nuxt/components/form/user/FormUserPermission.vue.eta +77 -59
  89. package/templates/nuxt/components/header/HeaderSelectBranch.vue.eta +42 -35
  90. package/templates/nuxt/components/image/ImageAvatar.vue.eta._vue +30 -0
  91. package/templates/nuxt/components/image/ImageOrganization.vue.eta.vue +7 -5
  92. package/templates/nuxt/components/image/ImageToBase64Uploader.vue.eta.vue +67 -50
  93. package/templates/nuxt/components/list/ListDocument.vue.eta +10 -5
  94. package/templates/nuxt/components/list/ListDocumentTable.vue.eta +21 -13
  95. package/templates/nuxt/components/list/ListMessages.vue.eta +1 -1
  96. package/templates/nuxt/components/list/ListView.vue.eta +94 -56
  97. package/templates/nuxt/components/overlay/OverlayPanelWithToolBar.vue.eta +11 -4
  98. package/templates/nuxt/components/overlay/OverlaySideBarCrud.vue.eta +17 -6
  99. package/templates/nuxt/components/overlay/OverlayViewer.vue.eta +16 -6
  100. package/templates/nuxt/components/page/PageDocList.vue.eta +108 -31
  101. package/templates/nuxt/components/renderer/RendererDate.vue.eta +8 -2
  102. package/templates/nuxt/components/renderer/RendererDateTime.vue.eta +7 -1
  103. package/templates/nuxt/components/renderer/RendererDocHistories.vue.eta +56 -0
  104. package/templates/nuxt/components/renderer/RendererForeignKey.vue.eta +9 -8
  105. package/templates/nuxt/components/renderer/RendererLink.vue.eta +7 -4
  106. package/templates/nuxt/components/renderer/RendererMoney.vue.eta +25 -17
  107. package/templates/nuxt/components/renderer/RendererTime.vue.eta +7 -1
  108. package/templates/nuxt/components/renderer/RendererViewer.vue.eta +19 -9
  109. package/templates/nuxt/components/select/SelectTemplate.vue.eta +76 -38
  110. package/templates/nuxt/components/session/SessionBlock.vue.eta +44 -46
  111. package/templates/nuxt/components/simpleApp/SimpleAppAutocomplete.vue.eta +61 -24
  112. package/templates/nuxt/components/simpleApp/SimpleAppCalendarInput.vue.eta +64 -0
  113. package/templates/nuxt/components/simpleApp/SimpleAppChildrenList.vue.eta +26 -14
  114. package/templates/nuxt/components/simpleApp/SimpleAppDocumentNo.vue.eta +8 -8
  115. package/templates/nuxt/components/simpleApp/SimpleAppFieldContainer.vue.eta +1 -1
  116. package/templates/nuxt/components/simpleApp/SimpleAppFormToolBar.vue._eta +128 -33
  117. package/templates/nuxt/components/simpleApp/SimpleAppInput.vue.eta +89 -168
  118. package/templates/nuxt/components/simpleApp/SimpleAppInputTable.vue.eta +43 -40
  119. package/templates/nuxt/components/simpleApp/SimpleAppUserPicker.vue.eta +387 -0
  120. package/templates/nuxt/components/text/TextDocStatus.vue._eta +22 -0
  121. package/templates/nuxt/components/user/UserButtonCreateTenant.vue._eta +13 -15
  122. package/templates/nuxt/components/user/UserButtonPermissionInfo.vue.eta +127 -93
  123. package/templates/nuxt/components/user/UserTenantPicker.vue.eta +1 -1
  124. package/templates/nuxt/composables/confirm.generate.ts.eta +19 -0
  125. package/templates/nuxt/composables/date.generate.ts.eta +106 -8
  126. package/templates/nuxt/composables/getDocument.generate.ts.eta +8 -6
  127. package/templates/nuxt/composables/getOpenApi.generate.ts.eta +58 -10
  128. package/templates/nuxt/composables/getUserStore.generate.ts.eta +37 -5
  129. package/templates/nuxt/composables/goTo.generate.ts.eta +14 -1
  130. package/templates/nuxt/composables/graphquery.generate.ts.eta +20 -2
  131. package/templates/nuxt/composables/recently.generate.ts.eta +16 -0
  132. package/templates/nuxt/composables/roles.generate.ts.eta +8 -13
  133. package/templates/nuxt/composables/stringHelper.generate.ts.eta +54 -1
  134. package/templates/nuxt/composables/sysmessage.generate.ts.eta +1 -1
  135. package/templates/nuxt/pages/[xorg]/docnoformat.vue.eta +1 -1
  136. package/templates/nuxt/pages/[xorg]/mobile/docnoformat/{index.vue.eta → index.vue.etaxxx} +1 -1
  137. package/templates/nuxt/pages/[xorg]/mobile/user/{index.vue.eta → index.vue.etaxxx} +1 -1
  138. package/templates/nuxt/pages/[xorg]/{organization.vue.eta → organization.vue._eta} +39 -10
  139. package/templates/nuxt/pages/[xorg]/profile.vue.eta +1 -1
  140. package/templates/nuxt/pages/[xorg]/user.vue.eta +13 -10
  141. package/templates/nuxt/pages/login.vue._eta +4 -1
  142. package/templates/nuxt/plugins/10.simpleapp-event.ts.eta +4 -0
  143. package/templates/nuxt/plugins/20.simpleapp-userstore.ts.eta +45 -26
  144. package/templates/nuxt/plugins/70.recently.ts.eta +55 -0
  145. package/templates/nuxt/providers/my-provider.ts.eta +22 -0
  146. package/templates/nuxt/server/api/[xorg]/{[...].ts.eta → [...].ts._eta} +47 -21
  147. package/templates/nuxt/simpleapp/generate/clients/SimpleAppClient.ts.eta +44 -3
  148. package/templates/nuxt/types/events.ts.eta +3 -2
  149. package/templates/nuxt/types/others.ts.eta +11 -1
  150. package/templates/nuxt/types/schema.ts.eta +3 -1
  151. package/templates/nuxt/types/simpleappinput.ts.eta +1 -1
  152. package/templates/nuxt/types/user.ts.eta +8 -7
  153. package/templates/project/jsonschemas/branch.json._eta +1 -0
  154. package/templates/project/jsonschemas/invoice.json._eta +4 -3
  155. package/templates/project/jsonschemas/organization.json._eta +2 -2
  156. package/templates/project/lang/default._json +5 -1
  157. package/tsconfig.tsbuildinfo +1 -1
  158. package/templates/nuxt/components/image/ImageAvatar.vue.eta.vue +0 -38
  159. /package/templates/nuxt/pages/[xorg]/mobile/{index.vue._eta → index.vue._etaxxx} +0 -0
  160. /package/templates/nuxt/pages/[xorg]/mobile/organization/{[id].vue._eta → [id].vue._etaxxx} +0 -0
  161. /package/templates/nuxt/pages/[xorg]/mobile/{pickgroup.vue._eta → pickgroup.vue._etaxxx} +0 -0
@@ -1,18 +1,16 @@
1
1
  <template>
2
2
  <OverlayViewer v-model="visible">
3
- <!-- <template #header>
4
-
5
- </template> -->
3
+ <template #header>
4
+ <div class="flex flex-row gap-4">
5
+ <Chip
6
+ v-for="(v, k) in allview"
7
+ :label="v.label"
8
+ @remove="deleteTab"
9
+ :removable="lastDocumentName == v.documentName"
10
+ />
11
+ </div>
12
+ </template>
6
13
  <div class="w-full h-full">
7
- <!-- <div class="flex flex-row gap-4" v-if="allview.length>0">
8
- <Chip
9
- v-for="(v, k) in allview"
10
- :label="v.label"
11
- @remove="deleteTab"
12
- :removable="true"
13
- />
14
- </div> -->
15
-
16
14
  <div
17
15
  v-for="(v, k) in allview"
18
16
  v-memo="[k]"
@@ -37,7 +35,6 @@
37
35
  <script setup lang="ts">
38
36
  /*
39
37
  * This file was automatically generated by simpleapp generator during initialization. It is changable.
40
- * --remove-this-line-to-prevent-override--
41
38
  * last change 2024-02-22
42
39
  * author: Ks Tan
43
40
  */
@@ -47,9 +44,18 @@ import { defineAsyncComponent } from "vue";
47
44
  import { ViewRecord, FormCrudEvent } from "~/types";
48
45
  // import TabView from 'primevue/tabview';
49
46
  import Chip from "primevue/chip";
47
+ const lastDocumentName = computed(() => {
48
+ const keys = Object.keys(allview.value);
49
+
50
+ if (keys.length == 0) return "";
50
51
 
52
+ const keyname = keys[keys.length - 1];
53
+
54
+ return allview.value[keyname].documentName;
55
+ });
51
56
  const { $listen } = useNuxtApp();
52
57
  const visible = ref(false);
58
+ const autodeletetab = ref(true);
53
59
  const allview = ref<{ [key: string]: ViewRecord }>({});
54
60
  const after = (
55
61
  v: ViewRecord,
@@ -58,10 +64,12 @@ const after = (
58
64
  result: any,
59
65
  ) => {
60
66
  if (v.after) {
61
- v.after(eventType, data);
62
-
67
+ v.after(eventType, data, visible);
68
+ console.log("eventTypeeventType",eventType,"setting['autoclose'] ",autodeletetab.value)
63
69
  //only after mount consider no remove tab
64
- if (eventType != "mount") deleteTab();
70
+ if (eventType == "mount") return
71
+
72
+ deleteTab();
65
73
  }
66
74
  };
67
75
 
@@ -73,18 +81,30 @@ onKeyStroke("Escape", (e) => {
73
81
  const deleteTab = () => {
74
82
  const keys = Object.keys(allview.value);
75
83
  const lastkey = keys[keys.length - 1];
76
- delete allview.value[lastkey];
84
+ console.log("Trigger delete tab")
85
+ if (keys.length == 1) {
86
+ const callback = allview.value[lastkey]?.after;
87
+ if (typeof callback == "function") {
88
+ callback(FormCrudEvent.exit, undefined, visible);
89
+ }
77
90
 
78
- // updateprops.value++
79
- if (Object.keys(allview.value).length == 0) {
80
- visible.value = false;
81
- useNuxtApp().$event("CloseDialog", "viewer");
82
- return;
91
+ if(autodeletetab.value){
92
+ delete allview.value[lastkey];
93
+ visible.value = false;
94
+ useNuxtApp().$event("CloseDialog", "viewer");
95
+ }
96
+
97
+ }else{
98
+ console.log("Trigger delete tab2")
99
+ delete allview.value[lastkey];
83
100
  }
84
101
  };
85
102
 
86
103
  $listen("ViewRecord", (setting) => {
87
104
  visible.value = true;
105
+ if (setting["autoclose"] != undefined) {
106
+ autodeletetab.value = setting["autoclose"] ==0 ? false : true;
107
+ }
88
108
  allview.value[setting.eventId] = setting;
89
109
  });
90
110
 
@@ -104,6 +124,26 @@ $listen("CloseDialog", (documentName: string) => {
104
124
  // visible.value = true;
105
125
  // allview.value[setting.eventId] = setting;
106
126
  // });
127
+ //
128
+ const clearView = () => {
129
+ const firstId = Object.keys(allview.value)[0];
130
+ console.log("clear view", allview.value);
131
+ const callback = allview.value[firstId]?.after;
132
+ if (typeof callback == "function") {
133
+ callback(FormCrudEvent.exit, undefined, visible);
134
+ }
135
+ allview.value = {};
136
+ };
137
+ // watch(visible,()=>{
138
+ // if(visible.value==false){
139
+ // v.after(FormCrudEvent.exit, data,visible);
140
+ // }
141
+ // })
142
+ watch(visible, () => {
143
+ if (!visible.value) {
144
+ clearView();
145
+ }
146
+ });
107
147
  </script>
108
148
 
109
149
  <style scoped>
@@ -7,9 +7,7 @@
7
7
  :document="doc"
8
8
  @on="actionListener"
9
9
  ></SimpleAppFormToolBar>
10
- <div
11
- class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4 p-2"
12
- >
10
+ <div class="grid grid-cols-1 lg:grid-cols-2 gap-4 p-2">
13
11
  <SimpleAppInput
14
12
  :input-type="SimpleAppInputType.text"
15
13
  :setting="o.getField('#/properties/branchName')"
@@ -27,7 +25,53 @@
27
25
  :setting="o.getField('#/properties/active')"
28
26
  v-model="data.active"
29
27
  />
28
+ <SimpleAppInput
29
+ :input-type="SimpleAppInputType.selectmultiple"
30
+ :setting="o.getField('#/properties/offdays')"
31
+ v-model="data.offdays"
32
+ />
33
+
34
+ <SimpleAppInput
35
+ :input-type="SimpleAppInputType.text"
36
+ :setting="o.getField('#/properties/street1')"
37
+ v-model="data.street1"
38
+ />
39
+ <SimpleAppInput
40
+ :input-type="SimpleAppInputType.text"
41
+ :setting="o.getField('#/properties/street2')"
42
+ v-model="data.street2"
43
+ />
30
44
 
45
+ <SimpleAppInput
46
+ :input-type="SimpleAppInputType.text"
47
+ :setting="o.getField('#/properties/postcode')"
48
+ v-model="data.postcode"
49
+ />
50
+ <SimpleAppInput
51
+ :input-type="SimpleAppInputType.text"
52
+ :setting="o.getField('#/properties/city')"
53
+ v-model="data.city"
54
+ />
55
+ <SimpleAppInput
56
+ :input-type="SimpleAppInputType.text"
57
+ :setting="o.getField('#/properties/region')"
58
+ v-model="data.region"
59
+ />
60
+ <SimpleAppInput
61
+ :input-type="SimpleAppInputType.text"
62
+ :setting="o.getField('#/properties/country')"
63
+ v-model="data.country"
64
+ />
65
+ <SimpleAppInput
66
+ :input-type="SimpleAppInputType.text"
67
+ :setting="o.getField('#/properties/tel')"
68
+ v-model="data.tel"
69
+ />
70
+ <SimpleAppInput
71
+ :input-type="SimpleAppInputType.text"
72
+ :setting="o.getField('#/properties/email')"
73
+ v-model="data.email"
74
+ />
31
75
  <SimpleAppInput
32
76
  :input-type="SimpleAppInputType.textarea"
33
77
  :setting="o.getField('#/properties/description')"
@@ -41,8 +85,7 @@
41
85
 
42
86
  <script setup lang="ts">
43
87
  /**
44
- * This file was automatically generated by simpleapp generator during initialization.
45
- * --remove-this-line-to-prevent-override--
88
+ * This file was automatically generated by simpleapp generator during initialization.
46
89
  * last change 2024-02-22
47
90
  * author: Ks Tan
48
91
  */
@@ -69,6 +112,10 @@ const getRecord = async () => {
69
112
  await doc.getById(id.value);
70
113
  } else {
71
114
  newData();
115
+ data.value.organization={
116
+ _id:getUserProfile()?.orgRecordId,
117
+ label:getUserProfile()?.orgName
118
+ }
72
119
  }
73
120
  };
74
121
 
@@ -8,13 +8,21 @@
8
8
  @on="actionListener"
9
9
  ></SimpleAppFormToolBar>
10
10
  <div
11
- class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4 p-2"
11
+ class="grid grid-cols-1 lg:grid-cols-2 gap-4 p-2"
12
12
  >
13
13
  <SimpleAppInput
14
14
  :input-type="SimpleAppInputType.autocomplete"
15
15
  :setting="o.getField('#/properties/branch')"
16
16
  v-model="data.branch"
17
17
  />
18
+ <SimpleAppInput
19
+ :readonly="!doc.isNew()"
20
+ :input-type="SimpleAppInputType.select"
21
+ :setting="o.getField('#/properties/docNoType')"
22
+ :options="getAllDocFormats().map((item) => item.docType)"
23
+ v-model="data.docNoType"
24
+ />
25
+
18
26
 
19
27
  <SimpleAppInput
20
28
  :input-type="SimpleAppInputType.text"
@@ -39,14 +47,7 @@
39
47
  v-model="data.default"
40
48
  />
41
49
 
42
- <SimpleAppInput
43
- :readonly="!doc.isNew()"
44
- :input-type="SimpleAppInputType.select"
45
- :setting="o.getField('#/properties/docNoType')"
46
- :options="getAllDocFormats().map((item) => item.docType)"
47
- v-model="data.docNoType"
48
- />
49
-
50
+
50
51
  <SimpleAppInput
51
52
  :input-type="SimpleAppInputType.text"
52
53
  :setting="o.getField('#/properties/docNoPattern')"
@@ -91,7 +92,10 @@ const id = computed(() => props._id ?? "");
91
92
 
92
93
  /************ start default methods ****************/
93
94
 
94
- const newData = () => doc.setNew();
95
+ const newData = () => {
96
+ doc.setNew()
97
+ delete data.value.branch
98
+ }
95
99
 
96
100
  const getRecord = async () => {
97
101
  if (id.value && id.value != "new") {
@@ -8,7 +8,7 @@
8
8
  <TabView lazy>
9
9
  <TabPanel :header="t('profile')">
10
10
  <div
11
- class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-4 p-2"
11
+ class="grid grid-cols-1 lg:grid-cols-2 gap-4 p-2"
12
12
  >
13
13
  <SimpleAppInput
14
14
  :input-type="SimpleAppInputType.text"
@@ -1,83 +1,101 @@
1
1
  <template>
2
- <div class=" w-full">
2
+ <div class="w-full">
3
+ <UserButtonPermissionInfo/>
3
4
  <div v-for="(b, index) in branchList" :key="index" class="flex flex-col">
4
- <div>{{ b.branchName }}</div>
5
- <div>
6
- <SelectButton :options="grouplist" v-model="permdata[b.branchId??0].groups"
7
- @update:model-value="updatePermission($event,b.branchId ??0)"
8
- multiple option-value="value" option-label="label"/>
9
- </div>
5
+ <div>{{ b.branchName }}</div>
6
+ <div>
7
+ <SelectButton
8
+ :options="grouplist"
9
+ v-model="permdata[b.branchId ?? 0].groups"
10
+ @update:model-value="updatePermission($event, b.branchId ?? 0)"
11
+ multiple
12
+ option-value="value"
13
+ option-label="label"
14
+ />
15
+ </div>
10
16
  </div>
11
17
  </div>
12
18
  </template>
13
19
  <script lang="ts" setup>
14
- import { Branch, Permission, UserPermission } from "~/simpleapp/generate/openapi";
15
- import _ from 'lodash'
20
+ import {
21
+ Branch,
22
+ Permission,
23
+ UserPermission,
24
+ } from "~/simpleapp/generate/openapi";
25
+ import _ from "lodash";
16
26
  const props = defineProps<{ id: string }>();
17
27
  const perm = useNuxtApp().$PermissionDoc();
18
- const branchList = ref<Branch[]>()
19
- const branch = useNuxtApp().$BranchDoc()
28
+ const branchList = ref<Branch[]>();
29
+ const branch = useNuxtApp().$BranchDoc();
20
30
  const grouplist = getAllGroups().map((item) => {
21
31
  return { value: item, label: _.capitalize(item) };
22
32
  });
23
33
  const orgs = ref<UserPermission[]>();
24
- const selectedGroup=ref()
25
- type PermDataType = {[key:number]: {groups?:string[],permId?:string}}
26
- const permdata=ref<PermDataType>({})
27
- const loadBranches = async ()=>{
28
- branchList.value=await branch.search({
29
- filter:{orgId:getUserProfile()?.orgId},
30
- fields:['branchCode','branchName','active','branchId'],
31
- sorts:[['branchCode','asc']]
32
- })
34
+ const selectedGroup = ref();
35
+ type PermDataType = { [key: number]: { groups?: string[]; permId?: string } };
36
+ const permdata = ref<PermDataType>({});
37
+ const loadBranches = async () => {
38
+ branchList.value = await branch.search({
39
+ filter: { orgId: getUserProfile()?.orgId },
40
+ fields: ["branchCode", "branchName", "active", "branchId"],
41
+ sorts: [["branchCode", "asc"]],
42
+ });
33
43
 
34
- branchList.value?.forEach(b=>{
35
- const branchId:number = b.branchId ?? 0
36
- permdata.value[branchId] ={groups:[],permId:''}
37
- })
38
- }
44
+ branchList.value?.forEach((b) => {
45
+ const branchId: number = b.branchId ?? 0;
46
+ permdata.value[branchId] = { groups: [], permId: "" };
47
+ });
48
+ };
39
49
  const loadPermission = async () => {
40
- const permissions:Permission[] = await perm.search({
41
- filter:{userId:props.id},
42
- fields:['groups','userId','uid','branchId']
43
- })
44
- console.log("load permissions" , permissions)
45
- permissions.forEach(p=>{
46
- console.log("PPP",p)
47
- if(p.branchId && permdata.value[p.branchId]){
48
- permdata.value[p.branchId].groups = p.groups ??[]
49
- permdata.value[p.branchId].permId = p._id
50
+ const permissions: Permission[] = await perm.search({
51
+ filter: { userId: props.id },
52
+ fields: ["groups", "userId", "uid", "branchId"],
53
+ });
54
+ console.log("load permissions", permissions);
55
+ permissions.forEach((p) => {
56
+ console.log("PPP", p);
57
+ if (p.branchId && permdata.value[p.branchId]) {
58
+ permdata.value[p.branchId].groups = p.groups ?? [];
59
+ permdata.value[p.branchId].permId = p._id;
50
60
  }
51
- })
61
+ });
52
62
  };
53
- const updatePermission = async (newgroups:string[],branchId:number)=>{
54
- const data =perm.getReactiveData()
55
- if(permdata.value[branchId] && permdata.value[branchId].permId){
56
- await perm.getById(permdata.value[branchId].permId)
57
- }else{
58
- data.value._id=randomUUID()
59
- data.value.userId=props.id
60
- }
61
- data.value.groups=newgroups
62
-
63
-
64
- if(permdata.value[branchId] && permdata.value[branchId].permId){
65
- await perm.update()
66
- }else{
67
- await perm.create()
63
+ const updatePermission = async (newgroups: string[], branchId: number) => {
64
+ const data = perm.getReactiveData();
65
+ const userdoc = useNuxtApp().$UserDoc()
66
+ await userdoc.getById(props.id);
67
+ const userdata = userdoc.getReactiveData()
68
+ console.log("userdata",userdata.value)
69
+
70
+ if (permdata.value[branchId] && permdata.value[branchId].permId) {
71
+ await perm.getById(permdata.value[branchId].permId);
72
+ if(!data.value.uid && userdata.value.uid){
73
+ data.value.uid = userdata.value.uid
68
74
  }
69
- await loadPermission()
70
- }
75
+ } else {
76
+ data.value._id = randomUUID();
77
+ data.value.userId = props.id;
78
+ data.value.uid = userdata.value.uid
79
+ data.value.branchId = branchId
80
+ }
81
+ data.value.groups = newgroups;
82
+ // console.log("data",data.value)
83
+ // return false
84
+ if (permdata.value[branchId] && permdata.value[branchId].permId) {
85
+ await perm.update();
86
+ } else {
87
+ await perm.create();
88
+ }
89
+ await loadPermission();
90
+ };
71
91
  onMounted(async () => {
72
- await loadBranches()
73
- await loadPermission()
74
-
92
+ await loadBranches();
93
+ await loadPermission();
75
94
  });
76
95
  watch(
77
96
  () => props.id,
78
97
  async () => {
79
- await loadPermission()
80
-
81
- }
98
+ await loadPermission();
99
+ },
82
100
  );
83
101
  </script>
@@ -1,3 +1,21 @@
1
+ <template>
2
+ <div>
3
+ <select
4
+ v-if="selectedbranch"
5
+ v-model="selectedbranch"
6
+ style="background: transparent; border: none;"
7
+ class="text-right pt-3 pb-3 text-lg"
8
+ @change="switchXorg()"
9
+ >
10
+ <optgroup v-for="o in orgList" :label="o.label">
11
+ <option v-for="b in getBranchesForOrg(o)" :value="b['xOrg']">
12
+ {{ b["branch"]["branchCode"] }}
13
+ </option>
14
+ </optgroup>
15
+ </select>
16
+ </div>
17
+ </template>
18
+
1
19
  <script setup lang="ts">
2
20
  /**
3
21
  * This file was automatically generated by simpleapp generator. Every
@@ -5,42 +23,31 @@
5
23
  * last change 2023-10-28
6
24
  * Author: Ks Tan
7
25
  */
8
- import _ from 'lodash'
9
- import {ref} from 'vue'
26
+ import _ from "lodash";
27
+ import { ref } from "vue";
10
28
 
11
- const selectedbranch = ref(getCurrentXorg())
12
- const currentTenant=ref(getUserProfile().tenantId)
13
-
14
- type Org = {orgId:number, label:string,_id:string}
15
- const branches = getUserProfile().branches.filter((item:any)=>{return item.branch.tenantId == currentTenant.value})
16
- const orgList:Org[] = _.uniqBy(branches,'branch.orgId').map((item)=>({
17
- _id:item['branch']['organization']['_id'],
18
- orgId:item['branch']['orgId'],
19
- label:item['branch']['organization']['label']}))
20
- // console.log("orgList",orgList)
21
- const getBranchesForOrg = (org:Org)=>{
22
- const branchlist = branches.filter((item,index)=>{
23
- // console.log(org['orgId'] ,'===', item['branch']['orgId'])
24
- return org['orgId'] === item['branch']['orgId']
25
- })
26
-
27
- return branchlist
28
- }
29
- const switchXorg = ()=>{
30
- navigateTo(`/${selectedbranch.value}`,{external:true})
31
- }
29
+ const selectedbranch = ref(getCurrentXorg());
30
+ const currentTenant = ref(getUserProfile()?.tenantId);
32
31
 
32
+ type Org = { orgId: number; label: string; _id: string };
33
+ const branches = getUserProfile()?.branches.filter((item: any) => {
34
+ return item.branch.tenantId == currentTenant.value;
35
+ });
36
+ const orgList: Org[] = _.uniqBy(branches, "branch.orgId").map((item) => ({
37
+ _id: item["branch"]["organization"]["_id"],
38
+ orgId: item["branch"]["orgId"],
39
+ label: item["branch"]["organization"]["label"],
40
+ }));
41
+ // console.log("orgList",orgList)
42
+ const getBranchesForOrg = (org: Org) => {
43
+ const branchlist = branches.filter((item, index) => {
44
+ // console.log(org['orgId'] ,'===', item['branch']['orgId'])
45
+ return org["orgId"] === item["branch"]["orgId"];
46
+ });
33
47
 
48
+ return branchlist;
49
+ };
50
+ const switchXorg = () => {
51
+ navigateTo(`/${selectedbranch.value}`, { external: true });
52
+ };
34
53
  </script>
35
- <template>
36
- <div>
37
-
38
- <select v-if="selectedbranch" v-model="selectedbranch" class=" text-right" @change="switchXorg()">
39
- <optgroup v-for="o in orgList" :label="o.label">
40
- <option v-for="b in getBranchesForOrg(o)" :value="b['xOrg']">{{ b['branch']['branchCode']}} </option>
41
- </optgroup>
42
-
43
- </select>
44
- </div>
45
-
46
- </template>
@@ -0,0 +1,30 @@
1
+ <template>
2
+ <div class="inline-block border rounded-lg w-20 h-20 bg-white">
3
+ <Avatar v-if="email"
4
+ :image="getAvatarLink(<string>email, size)"
5
+ shape="circle"
6
+ size="xlarge"
7
+ />
8
+ <Avatar v-else-if="id"
9
+ :image="getAvatarByUid(<string>id, size)"
10
+ shape="circle"
11
+ size="xlarge"
12
+ />
13
+ </div>
14
+
15
+
16
+ </template>
17
+ <script lang="ts" setup>
18
+ /**
19
+ * This file was automatically generated by simpleapp generator during initialization.
20
+ * --remove-this-line-to-prevent-override--
21
+ * last change 2024-04-06
22
+ * author: Ks Tan
23
+ */
24
+ const props = defineProps<{
25
+ email?: string;
26
+ id?: string;
27
+ size: number;
28
+ }>();
29
+
30
+ </script>
@@ -5,10 +5,12 @@
5
5
  class="w-20 h-20 place-content-center"
6
6
  @image-uploaded="handleBase64"
7
7
  >
8
- <Image :src="imageData"></Image>
8
+ <Image v-if="imageData!=''" :src="imageData"></Image>
9
+ <svg v-else xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="black" d="M21 10h-2V4h1V2H4v2h1v6H3a1 1 0 0 0-1 1v9h20v-9a1 1 0 0 0-1-1m-7 8v-4h-4v4H7V4h10v14z"/><path fill="black" d="M9 6h2v2H9zm4 0h2v2h-2zm-4 4h2v2H9zm4 0h2v2h-2z"/></svg>
9
10
  </ImageToBase64Uploader>
10
- <div v-else class="inline-block border rounded-lg w-20 h-20">
11
- <Image :src="imageData"></Image>
11
+ <div v-else class="inline-block border rounded-lg w-20 h-20 bg-white">
12
+ <Image v-if="imageData!=''" :src="imageData"></Image>
13
+ <svg v-else xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path fill="black" d="M21 10h-2V4h1V2H4v2h1v6H3a1 1 0 0 0-1 1v9h20v-9a1 1 0 0 0-1-1m-7 8v-4h-4v4H7V4h10v14z"/><path fill="black" d="M9 6h2v2H9zm4 0h2v2h-2zm-4 4h2v2H9zm4 0h2v2h-2z"/></svg>
12
14
  </div>
13
15
  </template>
14
16
  <script lang="ts" setup>
@@ -22,7 +24,7 @@ const handleBase64 = async (data: string) => {
22
24
  key: "organizationLogo",
23
25
  value: data,
24
26
  };
25
-
27
+
26
28
  const uploadok = await useNuxtApp()
27
29
  .$OrganizationDoc()
28
30
  .getApi()
@@ -33,7 +35,7 @@ const handleBase64 = async (data: string) => {
33
35
  };
34
36
  const loadLogo = async () => {
35
37
  await refreshOrgLogo();
36
- imageData.value = getOrgLogo();
38
+ imageData.value = getOrgLogo();
37
39
  };
38
40
 
39
41
  onMounted(async () => await loadLogo());