@simitgroup/simpleapp-generator 1.0.32 → 1.0.35

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 (281) hide show
  1. package/.vscode/settings.json +3 -0
  2. package/README.md +185 -16
  3. package/buildinschemas copy/autoincreament.autoinc.jsonschema.json +39 -0
  4. package/buildinschemas copy/branch.branch.jsonschema.json +41 -0
  5. package/buildinschemas copy/docnoformat.docno.jsonschema.json +41 -0
  6. package/buildinschemas copy/organization.org.jsonschema.json +50 -0
  7. package/buildinschemas copy/permission.perm.jsonschema.json +23 -0
  8. package/buildinschemas copy/permission.perm.jsonschema.try.json +25 -0
  9. package/buildinschemas copy/tenant.tenant.jsonschema.json +21 -0
  10. package/buildinschemas copy/tenant.tenant.jsonschema.try.json +27 -0
  11. package/buildinschemas copy/user.user.jsonschema.json +31 -0
  12. package/dist/buildinschemas/autoincreament.d.ts +3 -0
  13. package/dist/buildinschemas/autoincreament.d.ts.map +1 -0
  14. package/dist/buildinschemas/autoincreament.js +36 -0
  15. package/dist/buildinschemas/autoincreament.js.map +1 -0
  16. package/dist/buildinschemas/branch.d.ts +3 -0
  17. package/dist/buildinschemas/branch.d.ts.map +1 -0
  18. package/dist/buildinschemas/branch.js +41 -0
  19. package/dist/buildinschemas/branch.js.map +1 -0
  20. package/dist/buildinschemas/docnoformat.d.ts +3 -0
  21. package/dist/buildinschemas/docnoformat.d.ts.map +1 -0
  22. package/dist/buildinschemas/docnoformat.js +60 -0
  23. package/dist/buildinschemas/docnoformat.js.map +1 -0
  24. package/dist/buildinschemas/index.d.ts +8 -0
  25. package/dist/buildinschemas/index.d.ts.map +1 -0
  26. package/dist/buildinschemas/index.js +18 -0
  27. package/dist/buildinschemas/index.js.map +1 -0
  28. package/dist/buildinschemas/organization.d.ts +3 -0
  29. package/dist/buildinschemas/organization.d.ts.map +1 -0
  30. package/dist/buildinschemas/organization.js +34 -0
  31. package/dist/buildinschemas/organization.js.map +1 -0
  32. package/dist/buildinschemas/permission.d.ts +3 -0
  33. package/dist/buildinschemas/permission.d.ts.map +1 -0
  34. package/dist/buildinschemas/permission.js +34 -0
  35. package/dist/buildinschemas/permission.js.map +1 -0
  36. package/dist/buildinschemas/tenant.d.ts +3 -0
  37. package/dist/buildinschemas/tenant.d.ts.map +1 -0
  38. package/dist/buildinschemas/tenant.js +41 -0
  39. package/dist/buildinschemas/tenant.js.map +1 -0
  40. package/dist/buildinschemas/user.d.ts +3 -0
  41. package/dist/buildinschemas/user.d.ts.map +1 -0
  42. package/dist/buildinschemas/user.js +31 -0
  43. package/dist/buildinschemas/user.js.map +1 -0
  44. package/dist/constant.d.ts +4 -0
  45. package/dist/constant.d.ts.map +1 -0
  46. package/dist/constant.js +2 -1
  47. package/dist/constant.js.map +1 -1
  48. package/dist/framework.d.ts +10 -0
  49. package/dist/framework.d.ts.map +1 -0
  50. package/dist/framework.js +120 -68
  51. package/dist/framework.js.map +1 -1
  52. package/dist/generate-allow-changebackend.js +305 -0
  53. package/dist/generate-allow-changebackend.js.map +1 -0
  54. package/dist/generate.d.ts +2 -0
  55. package/dist/generate.d.ts.map +1 -0
  56. package/dist/generate.js +310 -230
  57. package/dist/generate.js.map +1 -1
  58. package/dist/index.d.ts +3 -0
  59. package/dist/index.d.ts.map +1 -0
  60. package/dist/index.js +84 -20
  61. package/dist/index.js.map +1 -1
  62. package/dist/libs.d.ts +2 -0
  63. package/dist/libs.d.ts.map +1 -0
  64. package/dist/processors/groupsbuilder.js +2 -0
  65. package/dist/processors/groupsbuilder.js.map +1 -0
  66. package/dist/processors/jsonschemabuilder.d.ts +4 -0
  67. package/dist/processors/jsonschemabuilder.d.ts.map +1 -0
  68. package/dist/processors/jsonschemabuilder.js +146 -172
  69. package/dist/processors/jsonschemabuilder.js.map +1 -1
  70. package/dist/schematype/baseschema.js +25 -0
  71. package/dist/schematype/baseschema.js.map +1 -0
  72. package/dist/schematype/default.js +2 -0
  73. package/dist/schematype/default.js.map +1 -0
  74. package/dist/schematype/index.js +12 -0
  75. package/dist/schematype/index.js.map +1 -0
  76. package/dist/schematype/primarymasterdata.js +38 -0
  77. package/dist/schematype/primarymasterdata.js.map +1 -0
  78. package/dist/schematype/simple.js +24 -0
  79. package/dist/schematype/simple.js.map +1 -0
  80. package/dist/schematype/simplemasterdata.js +31 -0
  81. package/dist/schematype/simplemasterdata.js.map +1 -0
  82. package/dist/schematype/transaction.js +74 -0
  83. package/dist/schematype/transaction.js.map +1 -0
  84. package/dist/storage.d.ts +3 -0
  85. package/dist/storage.d.ts.map +1 -0
  86. package/dist/storage.js +2 -2
  87. package/dist/storage.js.map +1 -1
  88. package/dist/type.d.ts +164 -0
  89. package/dist/type.d.ts.map +1 -0
  90. package/dist/type.js +16 -1
  91. package/dist/type.js.map +1 -1
  92. package/dist/validation.d.ts +1 -0
  93. package/dist/validation.d.ts.map +1 -0
  94. package/documentation/designconcept.bpmn +349 -0
  95. package/documentation/documentation.png +0 -0
  96. package/documentation/infra.drawio +141 -0
  97. package/documentation/infra.png +0 -0
  98. package/documentation/management.drawio +57 -0
  99. package/documentation/stack.drawio +106 -0
  100. package/package.json +3 -1
  101. package/src/buildinschemas/autoincreament.ts +34 -0
  102. package/src/buildinschemas/branch.ts +39 -0
  103. package/src/buildinschemas/docnoformat.ts +58 -0
  104. package/src/buildinschemas/index.ts +7 -0
  105. package/src/buildinschemas/organization.ts +31 -0
  106. package/src/buildinschemas/permission.ts +31 -0
  107. package/src/buildinschemas/tenant.ts +38 -0
  108. package/src/buildinschemas/user.ts +28 -0
  109. package/src/constant.ts +2 -1
  110. package/src/framework.ts +126 -67
  111. package/src/generate.ts +327 -266
  112. package/src/generate.ts.backup +339 -0
  113. package/src/index.ts +93 -18
  114. package/src/processors/jsonschemabuilder.ts +199 -226
  115. package/src/processors/jsonschemabuilder.ts-old +383 -0
  116. package/src/storage.ts +1 -1
  117. package/src/type.ts +94 -27
  118. package/templates/basic/nest/controller.ts.eta +255 -0
  119. package/templates/basic/nest/default.ts.eta +42 -0
  120. package/templates/basic/{model.eta → nest/model.ts.eta} +18 -5
  121. package/templates/basic/nest/processor.ts.eta +129 -0
  122. package/templates/basic/nest/service.ts.eta +64 -0
  123. package/templates/basic/{type.eta → nest/type.ts.eta} +3 -3
  124. package/templates/basic/nuxt/default.ts.eta +42 -0
  125. package/templates/basic/{pageindex.vue.eta → nuxt/pages.crud.vue.eta} +85 -22
  126. package/templates/basic/nuxt/simpleapp.doc.ts.eta +11 -0
  127. package/templates/basic/nuxt/simpleapp.generate.client.ts.eta +212 -0
  128. package/templates/nest/.env.eta +31 -0
  129. package/templates/nest/.gitignore.eta +40 -0
  130. package/templates/nest/src/app.controller.ts.eta +19 -0
  131. package/templates/nest/src/app.module.ts.eta +77 -0
  132. package/templates/nest/src/app.service.ts.eta +9 -0
  133. package/templates/nest/src/main.ts.eta +58 -0
  134. package/templates/nest/src/simpleapp/generate/apischemas/index.ts.eta +16 -0
  135. package/templates/nest/src/simpleapp/generate/commons/decorators/appuser.decorator.ts.eta +8 -0
  136. package/templates/nest/src/simpleapp/generate/commons/dicts/foreignkeys.ts.eta +1 -0
  137. package/templates/nest/src/simpleapp/generate/commons/docnogenerator.service.ts.eta +101 -0
  138. package/templates/nest/src/simpleapp/generate/commons/exceptions/SimpleAppExceptionFilter.ts.eta +39 -0
  139. package/templates/nest/src/simpleapp/generate/commons/interceptors/response.interceptor.ts.eta +38 -0
  140. package/templates/nest/src/simpleapp/generate/commons/middlewares/tenant.middleware.ts.eta +88 -0
  141. package/templates/nest/{Workflow.eta → src/simpleapp/generate/commons/providers/workflow.provider.ts.etax} +20 -14
  142. package/templates/nest/src/simpleapp/generate/commons/roles/roles.decorator.ts.eta +6 -0
  143. package/templates/nest/src/simpleapp/generate/commons/roles/roles.enum.ts.eta +28 -0
  144. package/templates/nest/src/simpleapp/generate/commons/roles/roles.group.ts.eta +10 -0
  145. package/templates/nest/src/simpleapp/generate/commons/roles/roles.guard.ts.eta +34 -0
  146. package/templates/nest/src/simpleapp/generate/commons/user.context.ts.eta +391 -0
  147. package/templates/nest/src/simpleapp/generate/controllers/simpleapp.controller.ts.eta +71 -0
  148. package/templates/nest/src/simpleapp/generate/models/perm.model.ts.eta +53 -0
  149. package/templates/nest/src/simpleapp/generate/models/tenant.model.ts.eta +45 -0
  150. package/templates/nest/src/simpleapp/generate/models/user.model.ts.eta +57 -0
  151. package/templates/nest/src/simpleapp/generate/processors/simpleapp.processor.ts.eta +624 -0
  152. package/templates/nest/src/simpleapp/generate/types/index.ts.eta +19 -0
  153. package/templates/nest/src/simpleapp/profile/profile.apischema.ts.eta +74 -0
  154. package/templates/nest/src/simpleapp/profile/profile.controller.ts.eta +110 -0
  155. package/templates/nest/src/simpleapp/profile/profile.service.ts.eta +195 -0
  156. package/templates/nest/src/simpleapp/profile/profile.types.ts.eta +18 -0
  157. package/templates/nest/src/simpleapp/services/autoinc.service.ts.eta +89 -0
  158. package/templates/nest/src/simpleapp/services/branch.service.ts.eta +66 -0
  159. package/templates/nest/src/simpleapp/services/docno.service.ts.eta +93 -0
  160. package/templates/nest/src/simpleapp/services/org.service.ts.eta +67 -0
  161. package/templates/nest/src/simpleapp/services/perm.service.ts.eta +102 -0
  162. package/templates/nest/src/simpleapp/services/tenant.service.ts.eta +69 -0
  163. package/templates/nest/src/simpleapp/services/user.service.ts.eta +66 -0
  164. package/templates/nest/src/simpleapp/simpleapp.module.ts.eta +43 -0
  165. package/templates/nuxt/.env.eta +21 -0
  166. package/templates/nuxt/.gitignore.eta +28 -0
  167. package/templates/nuxt/app.vue.eta +5 -2
  168. package/templates/nuxt/assets/css/tailwind.css.eta +35 -0
  169. package/templates/nuxt/components/CrudNestedDoc.vue.eta +164 -0
  170. package/templates/nuxt/components/CrudSimple.vue.eta +179 -0
  171. package/templates/nuxt/{components.debugdocdata.vue.eta → components/DebugDocumentData.vue.eta} +4 -1
  172. package/templates/nuxt/{components.eventmonitor.vue.eta → components/EventMonitor.vue.eta} +27 -27
  173. package/templates/nuxt/components/Invitation.vue.eta +50 -0
  174. package/templates/nuxt/components/Menus.vue.eta +58 -0
  175. package/templates/nuxt/components/PermissionInfo.vue.eta +92 -0
  176. package/templates/nuxt/components/SimpleAppAutocomplete.vue.eta +131 -0
  177. package/templates/nuxt/components/SimpleAppAutocompletemulti.vue.eta +73 -0
  178. package/templates/nuxt/components/SimpleAppCalendar.vue.eta +55 -0
  179. package/templates/nuxt/components/SimpleAppCheckbox.vue.eta +29 -0
  180. package/templates/nuxt/components/SimpleAppChip.vue.eta +28 -0
  181. package/templates/nuxt/components/SimpleAppColor.vue.eta +41 -0
  182. package/templates/nuxt/components/SimpleAppDatatable.vue.eta +20 -0
  183. package/templates/nuxt/components/SimpleAppDocumentNo.vue.eta +90 -0
  184. package/templates/nuxt/components/SimpleAppDynamicInput.vue.eta +29 -0
  185. package/templates/nuxt/components/SimpleAppEditor.vue.eta +31 -0
  186. package/templates/nuxt/components/SimpleAppForm.vue.eta +131 -0
  187. package/templates/nuxt/components/SimpleAppInputTable.vue.eta +104 -0
  188. package/templates/nuxt/components/SimpleAppList.vue.eta +38 -0
  189. package/templates/nuxt/components/SimpleAppListmulti.vue.eta +41 -0
  190. package/templates/nuxt/components/SimpleAppNumber.vue.eta +32 -0
  191. package/templates/nuxt/components/SimpleAppPassword.vue.eta +41 -0
  192. package/templates/nuxt/components/SimpleAppRadio.vue.eta +42 -0
  193. package/templates/nuxt/components/SimpleAppRating.vue.eta +41 -0
  194. package/templates/nuxt/components/SimpleAppSelect.vue.eta +38 -0
  195. package/templates/nuxt/components/SimpleAppSelectmulti.vue.eta +39 -0
  196. package/templates/nuxt/components/SimpleAppSlider.vue.eta +42 -0
  197. package/templates/nuxt/components/SimpleAppSwitch.vue.eta +30 -0
  198. package/templates/nuxt/components/SimpleAppText.vue.eta +50 -0
  199. package/templates/nuxt/components/SimpleAppTextarea.vue.eta +30 -0
  200. package/templates/nuxt/components/SimpleAppValue.vue.eta +86 -0
  201. package/templates/nuxt/components/SimpleFieldContainer.vue.eta +102 -0
  202. package/templates/nuxt/components/XorgPicker.vue.eta +66 -0
  203. package/templates/nuxt/components/helper.ts.eta +90 -0
  204. package/templates/nuxt/components/type.ts.eta +32 -0
  205. package/templates/nuxt/composables/docformat.generate.ts.eta +5 -0
  206. package/templates/nuxt/{composables.getautocomplete.ts.eta → composables/getAutocomplete.generate.ts.eta} +4 -5
  207. package/templates/nuxt/{composables.getmenus.ts.eta → composables/getMenus.generate.ts.eta} +22 -7
  208. package/templates/nuxt/composables/getOpenApi.generate.ts.eta +6 -0
  209. package/templates/nuxt/composables/getTenant.generate.ts.eta +4 -0
  210. package/templates/nuxt/composables/getUserStore.generate.ts.eta +22 -0
  211. package/templates/nuxt/composables/logout.generate.ts.eta +22 -0
  212. package/templates/nuxt/composables/roles.generate.ts.eta +48 -0
  213. package/templates/nuxt/composables/stringHelper.generate.ts.eta +5 -0
  214. package/templates/nuxt/{layouts.default.vue.eta → layouts/default.vue.eta} +2 -0
  215. package/templates/nuxt/middleware/10.acl.global.ts.eta +38 -0
  216. package/templates/nuxt/nuxt.config.ts.eta +12 -2
  217. package/templates/nuxt/pages/[xorg]/branch/index.vue.eta +102 -0
  218. package/templates/nuxt/pages/[xorg]/docnoformat/[id].vue.eta +17 -0
  219. package/templates/nuxt/pages/[xorg]/docnoformat/index.vue.eta +269 -0
  220. package/templates/nuxt/pages/[xorg]/index.vue.eta +36 -0
  221. package/templates/nuxt/pages/[xorg]/organization/index.vue.eta +148 -0
  222. package/templates/nuxt/pages/[xorg]/permission/index.vue.eta +280 -0
  223. package/templates/nuxt/pages/[xorg]/tenant/index.vue.eta +93 -0
  224. package/templates/nuxt/pages/[xorg]/user/index.vue.eta +468 -0
  225. package/templates/nuxt/pages/index.vue.eta +191 -0
  226. package/templates/nuxt/pages/login.vue.eta +21 -0
  227. package/templates/nuxt/plugins/10.simpleapp-event.ts.eta +53 -0
  228. package/templates/nuxt/plugins/20.simpleapp-userstore.ts.eta +155 -0
  229. package/templates/nuxt/plugins/50.simpleapp-client.ts.eta +23 -0
  230. package/templates/nuxt/{server.api.ts.eta → server/api/[xorg]/[...].ts.eta} +5 -2
  231. package/templates/nuxt/server/api/auth/[...].ts.eta +68 -0
  232. package/templates/nuxt/{server.api.auth.logout.ts.eta → server/api/auth/logout.ts.eta} +1 -3
  233. package/templates/nuxt/server/api/profile/[...].ts.eta +150 -0
  234. package/templates/nuxt/server/api/profile/index.ts.eta +103 -0
  235. package/templates/nuxt/simpleapp/generate/clients/SimpleAppClient.ts.eta +187 -0
  236. package/templates/nuxt/simpleapp/generate/commons/documents.ts.eta +6 -0
  237. package/templates/nuxt/simpleapp/generate/commons/events.ts.eta +5 -0
  238. package/templates/nuxt/simpleapp/generate/commons/groups.ts.eta +11 -0
  239. package/templates/nuxt/simpleapp/generate/commons/roles.ts.eta +21 -0
  240. package/templates/nuxt/types/index.ts.eta +65 -0
  241. package/templates/project/README.md +11 -0
  242. package/templates/project/build.sh.eta +17 -0
  243. package/templates/project/config.json.eta +2 -0
  244. package/templates/project/generate.ts.eta +10 -0
  245. package/templates/project/schemas/category.ts.eta +26 -0
  246. package/templates/project/schemas/index.ts.eta +5 -0
  247. package/templates/project/schemas/product.ts.eta +59 -0
  248. package/templates/project/shares/hello.ts.eta +1 -0
  249. package/templates/project/shares/index.ts.eta +2 -0
  250. package/tsconfig.json +9 -2
  251. package/tsconfig.tsbuildinfo +1 -0
  252. package/definations/category.cat.jsonschema.json +0 -55
  253. package/definations/level.lvl.jsonschema.json +0 -48
  254. package/definations/product.prd.jsonschema.json +0 -46
  255. package/templates/basic/controller.eta +0 -152
  256. package/templates/basic/module.eta +0 -22
  257. package/templates/basic/service.eta +0 -62
  258. package/templates/basic/simpleappclient.eta +0 -120
  259. package/templates/nest/SimpleAppController.eta +0 -69
  260. package/templates/nest/SimpleAppService.eta +0 -366
  261. package/templates/nest/TenantMiddleware.eta +0 -34
  262. package/templates/nest/UserProvider.eta +0 -127
  263. package/templates/nest/app.controller.eta +0 -12
  264. package/templates/nest/app.module.eta +0 -64
  265. package/templates/nest/app.service.eta +0 -8
  266. package/templates/nest/inputvalidation-exception.eta +0 -6
  267. package/templates/nest/nest.env.eta +0 -28
  268. package/templates/nest/nest.main.eta +0 -31
  269. package/templates/nuxt/components.crudsimple.vue.eta +0 -124
  270. package/templates/nuxt/components.menus.vue.eta +0 -35
  271. package/templates/nuxt/env.eta +0 -17
  272. package/templates/nuxt/pages.[xorg].index.vue.eta +0 -20
  273. package/templates/nuxt/pages.index.vue.eta +0 -72
  274. package/templates/nuxt/pages.login.vue.eta +0 -20
  275. package/templates/nuxt/plugins.simpleapp.ts.eta +0 -88
  276. package/templates/nuxt/server.api.auth[...].ts.eta +0 -233
  277. package/templates/nuxt/tailwind.css.eta +0 -49
  278. /package/templates/basic/{apischema.eta → nest/apischema.ts.eta} +0 -0
  279. /package/templates/basic/{jsonschema.eta → nest/jsonschema.ts.eta} +0 -0
  280. /package/templates/basic/{pageindexwithid.vue.eta → nuxt/pages.[id].vue.eta} +0 -0
  281. /package/templates/nest/{oauth2-redirect.eta → public_html/oauth2-redirect.html.eta} +0 -0
@@ -0,0 +1,179 @@
1
+ <script setup lang="ts">
2
+ /**
3
+ * This file was automatically generated by simpleapp generator during initialization.
4
+ * DO NOT MODIFY IT BY HAND.
5
+ * last change 2023-09-09
6
+ * author: Ks Tan
7
+ */
8
+ import {ref} from 'vue'
9
+ import _ from 'lodash'
10
+ import { SimpleAppClient } from '../simpleapp/generate/clients/SimpleAppClient' //'../SimpleAppClient';
11
+ // import SimpleAppForm from '@simitgroup/simpleapp-vue-component/src/components/SimpleAppForm.vue';
12
+ // import SimpleAppDatatable from '@simitgroup/simpleapp-vue-component/src/components/SimpleAppDatatable.vue';
13
+ import Dialog from 'primevue/dialog';
14
+ // import axios from 'axios'
15
+ import ProgressSpinner from 'primevue/progressspinner';
16
+ import ConfirmPopup from 'primevue/confirmpopup';
17
+ import { useConfirm } from "primevue/useconfirm";
18
+ import {SearchBody} from '~/types'
19
+ const confirm = useConfirm();
20
+ const props = defineProps<{
21
+ document:SimpleAppClient<any,any>
22
+ listColumns:string[]
23
+ path:string
24
+ title:string
25
+ sorts?: any
26
+ }>()
27
+ const resourcename = ref( _.upperFirst(props.document.getDocName()))
28
+ const visible = ref(false)
29
+ const obj = props.document
30
+ const data = obj.getReactiveData()
31
+ const disabled=ref(false)
32
+ const recordlist = ref();
33
+ const router = useRouter()
34
+ const route = useRoute()
35
+ const filters = ref()
36
+ const popuptitle = ref("New "+props.title)
37
+ const systemwindows = ref(false)
38
+ const {$event} = useNuxtApp()
39
+ const currentjsonschema:any = props.document.getSchema()
40
+
41
+ if(['none'].includes(currentjsonschema['x-isolation-type'])){
42
+ systemwindows.value=true
43
+ }
44
+ watch(visible,(newvalue )=>{
45
+ if(newvalue == false){
46
+ if(data.value.created!=''){
47
+ newData()
48
+ }
49
+ }
50
+
51
+ })
52
+ defineShortcuts({
53
+ 'ctrl_enter': () => newData()
54
+ })
55
+
56
+ const refresh = () => {
57
+ const searchbody: SearchBody = {
58
+ fields: props.listColumns.concat(['created']),
59
+ sorts:props.sorts
60
+ }
61
+ obj.search(searchbody).then((res:any) => {
62
+ recordlist.value = res;
63
+ disabled.value=false
64
+ });
65
+ };
66
+ const newData = () => {
67
+ router.push({ path: `${props.path}` })
68
+ obj.setNew()
69
+ visible.value=true;
70
+ $event("newRecord")
71
+ };
72
+
73
+ const triggerEdit = (event: any) => {
74
+ let id = event.data._id.toString()
75
+ router.push({ path: `${props.path}/${id}` })
76
+ };
77
+ const editRecord = (id:string) => {
78
+
79
+ console.log("editRecord",id)
80
+
81
+ obj.getById(id).then(()=>{
82
+ visible.value=true
83
+ popuptitle.value = "Edit "+props.title
84
+ $event("editRecord",id)
85
+ });
86
+
87
+ };
88
+ const createData = async () => {
89
+ disabled.value=true
90
+
91
+ obj.create().then(()=>{
92
+ visible.value=false
93
+ refresh()
94
+ }).catch(err=>{
95
+ console.error(err)
96
+ }).finally(()=>disabled.value=false)
97
+
98
+ };
99
+ const updateData = async () => {
100
+ disabled.value=true
101
+
102
+ obj.update().then(()=>{
103
+ visible.value=false
104
+ refresh()
105
+ }).catch(err=>{
106
+ console.error(err)
107
+ }).finally(()=>disabled.value=false)
108
+
109
+ };
110
+ const deleteData = (event:Event) => {
111
+
112
+ confirm.require({
113
+ target: event.currentTarget as HTMLElement,
114
+ message:'Delete?',
115
+ icon: 'pi pi-exclamation-triangle',
116
+ acceptClass: 'p-button-danger',
117
+ accept: ()=>{
118
+ disabled.value=true
119
+ obj.delete(data.value._id ?? "").then(()=>visible.value=false).finally(() => {
120
+ refresh();
121
+ });
122
+ },
123
+ reject: () => {
124
+ console.log("Cancel delete")
125
+ }
126
+ })
127
+ };
128
+
129
+ onNuxtReady(()=>{
130
+ refresh()
131
+ if (route.params.id) {
132
+ const recordid:string = route.params.id.toString()
133
+ editRecord(recordid)
134
+ }
135
+
136
+ })
137
+
138
+
139
+ </script>
140
+
141
+ <template>
142
+ <div class="simpleapp-crudsimple">
143
+ <h1 v-if="systemwindows" class="error-text text-center">* system administration screen</h1>
144
+
145
+ <button class="btn-primary" @click="newData" v-tooltip="'Add new(ctrl+enter)'" v-if="canPerform(resourcename,'create')">New</button>
146
+ <SimpleAppDatatable
147
+ @row-dblclick="triggerEdit"
148
+ v-model="recordlist"
149
+ :setting="{}"
150
+ :columns="listColumns"
151
+ >
152
+ </SimpleAppDatatable>
153
+
154
+ <DebugDocumentData v-model="data"/>
155
+ </div>
156
+
157
+ <Dialog v-model:visible="visible" modal :header="popuptitle" class="crudsimple-dialog" :autoZIndex="false" :style="{zIndex:100, width: '80vw' }">
158
+ <SimpleAppForm :document="obj" #default="o">
159
+ <div class="simpleapp-tool-bar col-span-4 text-left gap-4" >
160
+ <button class="btn-default" :disabled="disabled" @click="newData" type="button" v-if="canPerform(resourcename,'create')">New</button>
161
+ <button class="btn-primary" :disabled="disabled" @click="createData" type="button" v-if="canPerform(resourcename,'create') && data.created==''">Create</button>
162
+ <button class="btn-primary" :disabled="disabled" @click="updateData" type="button" v-if="canPerform(resourcename,'update') && data.created!=''">Update</button>
163
+ <button class="btn-danger" :disabled="disabled" @click="deleteData($event)" type="button" v-if="canPerform(resourcename,'delete') && data.created!=''">Delete</button>
164
+ <ProgressSpinner v-if="disabled==true" style="width: 2rem; height: 2rem" ></ProgressSpinner>
165
+ <ConfirmPopup></ConfirmPopup>
166
+
167
+ </div>
168
+ <div class="grid grid-cols-4 gap-4 w-full">
169
+ <slot :data="o.data" :getField="o.getField" name="default"></slot>
170
+ </div>
171
+ </SimpleAppForm>
172
+ </Dialog>
173
+ </template>
174
+
175
+ <style scoped>
176
+ .crudsimple-dialog{
177
+ z-index: 100;
178
+ }
179
+ </style>
@@ -13,10 +13,12 @@ import {ref} from 'vue'
13
13
  const modelValue = defineModel()
14
14
  const isdebug = ref(useRuntimeConfig().public.DEBUGDATA)
15
15
  const visible = ref(false)
16
+ const props = defineProps<{label?:string}>()
17
+ const label = ref(props.label??'Debug')
16
18
  </script>
17
19
  <template>
18
20
  <div class="floatright" v-if="isdebug=='1'">
19
- <button @click="visible=true">Debug</button>
21
+ <button @click="visible=true">{{ label }}</button>
20
22
  <Dialog v-model:visible="visible" modal header="Debug data" :style="{ width: '80vw' }">
21
23
  <pre>{{ modelValue }}</pre>
22
24
  </Dialog>
@@ -30,5 +32,6 @@ const visible = ref(false)
30
32
  background-color: antiquewhite;
31
33
  font-size: large;
32
34
  top: 20;
35
+ z-index: 999999;
33
36
  }
34
37
  </style>
@@ -10,75 +10,75 @@ import { useToast, } from 'primevue/usetoast';
10
10
  import type { ToastMessageOptions } from 'primevue/toast';
11
11
  import Toast from 'primevue/toast';
12
12
  import { stringify } from 'ajv';
13
+ import {upperFirst, last } from 'lodash'
13
14
  const toast = useToast();
14
15
  const { $event,$listen } = useNuxtApp()
16
+
15
17
  let resmsg:ToastMessageOptions = {} as ToastMessageOptions
16
18
 
17
- $listen('*',(type:string,data:any)=>{
18
-
19
-
19
+
20
+ $listen('*',(type:any,data:any)=>{ //simple use case, use any to prevent error
21
+ let arrupdate = type.split(':')
22
+ let eventdata = data
20
23
  let duration = 3000
21
24
  let severity:typeof resmsg['severity']
22
25
  let isshow=true
23
26
  let toastgroup='default'
27
+ let eventname = arrupdate[1]
28
+ let eventtype = arrupdate[0]
29
+ let title = ''
24
30
  if(type.indexOf('error')>=0){
25
31
  duration = 0
26
32
  severity='error'
27
-
33
+ title=upperFirst(eventname) +' failed'
28
34
  }
29
35
  else if(type.indexOf('warn')>=0){
30
36
  duration = 10000
31
37
  severity='warn'
38
+ title=upperFirst(eventname) +' with warning'
32
39
  }
33
40
  else if(type.indexOf('info')>=0){
34
41
  duration = 3000
35
42
  severity='info'
36
43
  isshow=false
44
+ title='Info'
37
45
  }
38
46
  else if(type.indexOf('success')>=0){
39
47
  duration = 3000
40
48
  severity='success'
49
+ title= upperFirst(eventname) +' successfully'
41
50
  }
42
51
  if(Array.isArray(data)){
43
52
  toastgroup='list'
53
+ }else if(typeof data == 'object'){
54
+ // title = camelCaseToWords(useCamelCase(title.replace(":","-")))
55
+ eventdata = data.message
44
56
  }
45
- // let msg:string=prepareMsg(data,severity?.toString()??'')
57
+
46
58
 
47
- if(isshow){
59
+ if(isshow && severity){
60
+ console.log("isshow",isshow,"event:",severity,eventdata)
48
61
  toast.removeAllGroups()
49
- resmsg = { severity: severity, summary: type, detail :data, life: duration, group:toastgroup}
62
+ resmsg = { severity: severity, summary: title, detail :eventdata, life: duration, group:toastgroup}
50
63
  toast.add(resmsg)
51
64
  }
52
-
65
+ isshow=false
53
66
 
54
67
  })
55
- const prepareMsg=(data:any,msgtype:string):string=>{
56
- let res : string =''
57
-
58
- if(typeof data == 'string'){
59
- res = data
60
- }else if(Array.isArray(data)){
61
- res+='<ul>'
62
- for(let i=0;i<data.length;i++){
63
- const d=data[i]
64
- res+= '<li>'+d['instancePath']+':'+(d['message']?? JSON.stringify(d))+'</li>'
65
- }
66
- res+='</ul>'
67
- }else if(typeof data =='object'){
68
- res=JSON.stringify(data)
69
- }
70
- return res
71
68
 
72
-
73
- }
74
69
 
70
+ const getFieldName = (path:string)=>{
71
+ const lastword :string= last<string>(path.split('/'))??''
72
+ return camelCaseToWords(lastword)
73
+ // const lastField = path.split
74
+ }
75
75
  </script>
76
76
  <template>
77
77
  <Toast group="default"/>
78
78
  <Toast group="list">
79
79
  <template #message="p">
80
80
  <ol>
81
- <li v-for="(item,index) in p.message.detail" :key="index">{{item.instancePath}} {{ item.message }}</li>
81
+ <li v-for="(item,index) in p.message.detail" :key="index"><b>{{getFieldName(item.instancePath)}}</b>: {{ item.message }}</li>
82
82
  </ol>
83
83
  </template>
84
84
  </Toast>
@@ -0,0 +1,50 @@
1
+ <template>
2
+ <Dialog v-model:visible="visible" modal :header="popuptitle" class="crudsimple-dialog" :autoZIndex="false" :style="{zIndex:100 }">
3
+ <div v-if="invites">
4
+
5
+ <div v-for="item in invites" class="w w-auto p p-2 grid grid-cols-3 hover-list-primary border">
6
+ <div class="flex flex-col col-span-2">
7
+ <div class="font font-bold">{{item.tenantName}}</div>
8
+ <div class="text text-xs text-gray-500 italic">{{ item.created }}</div>
9
+ </div>
10
+ <div >
11
+ <button class="btn-primary" @click="approve(item._id)">Approve</button>
12
+ <button class="btn-danger" @click="decline(item._id)">Decline</button>
13
+ </div>
14
+ </div>
15
+ </div>
16
+ </Dialog>
17
+ </template>
18
+ <script setup lang="ts">
19
+ import Dialog from 'primevue/dialog';
20
+ import {onMounted, ref} from 'vue'
21
+ import {SimpleAppEventType} from '../simpleapp/generate/commons/events'
22
+ import ProgressSpinner from 'primevue/progressspinner'
23
+ const {$userstore,$event}= useNuxtApp()
24
+ const disabled = ref(false)
25
+ const visible=ref(false)
26
+ const invites = ref()
27
+ const invitationmsg = "There is some invitation to join their organization:"
28
+ const popuptitle = ref(invitationmsg)
29
+ onMounted(()=>{
30
+ invites.value = getUserProfile().invites
31
+ if(invites.value.length>0){
32
+ visible.value=true
33
+ }
34
+ })
35
+
36
+ const approve = async (id:string) =>{
37
+
38
+ // await reloadUserStore()
39
+ await $userstore.decideInvitation(id,'accept')
40
+ $event(SimpleAppEventType.InvitationAccepted,id)
41
+ visible.value=false
42
+ }
43
+ const decline = async (id:string) => {
44
+ // await reloadUserStore()
45
+ await $userstore.decideInvitation(id,'reject')
46
+ $event(SimpleAppEventType.InvitationRejected,id)
47
+ visible.value=false
48
+ }
49
+
50
+ </script>
@@ -0,0 +1,58 @@
1
+ <script setup lang="ts">
2
+ /**
3
+ * This file was automatically generated by simpleapp generator during initialization.
4
+ * You may modify it by hand
5
+ * last change 2023-09-10
6
+ * author: Ks Tan
7
+ */
8
+
9
+ // import MegaMenu from 'primevue/megamenu';
10
+ // import Menubar from 'primevue/menubar';
11
+ // const route = useRoute()
12
+ // const menus = getMenus(route.params.xorg)
13
+ import MenuIndex from "../pages/[xorg]/index.vue"
14
+ // import XorgPicker from "../pages/index.vue"
15
+ import Dialog from 'primevue/dialog';
16
+ import {ref} from 'vue'
17
+ const visible = ref(false)
18
+ const visibletenant = ref(false)
19
+
20
+ </script>
21
+ <template>
22
+ <!-- <header> -->
23
+ <!-- <MegaMenu :model="getMenus()" orientation="horizontal" /> -->
24
+ <div class="bg-white border-b-2 border-b-gray-300 h-10 flex">
25
+
26
+ <Dialog v-model:visible="visible" modal header="Pick Document" :autoZIndex="false" :style="{zIndex:100, width: '80vw' }">
27
+ <MenuIndex></MenuIndex>
28
+ </Dialog>
29
+ <Dialog v-model:visible="visibletenant" modal header="Pick Tenant" :autoZIndex="false" :style="{zIndex:100, width: '80vw' }">
30
+ <XorgPicker></XorgPicker>
31
+ </Dialog>
32
+
33
+ <div class="flex-1">
34
+ <NuxtLink to="/" :external="true"><i class="pi pi-home m-2"></i>Home</NuxtLink>
35
+ </div>
36
+ <div class="flex-1 p-1">
37
+ <button class="text-center border-none cursor-pointer" v-if="useRoute().params.xorg" @click="visible=true">
38
+ <i class="pi pi-microsoft mr-2"></i>Menu</button>
39
+ <span v-else></span>
40
+ </div>
41
+ <div class="flex-1 p-1">
42
+ <button class="text-center border-none cursor-pointer" v-if="useRoute().params.xorg" @click="visibletenant=true">
43
+ <i class="pi pi-globe mr-2"></i>
44
+
45
+ {{ getUserProfile().branchCode }} - {{ getUserProfile().branchName }}
46
+ </button>
47
+ <span v-else></span>
48
+ </div>
49
+ <div class="flex-1 text-right p-1">
50
+ <button class=" cursor-pointer border-none" @click="logout()">
51
+ <i class="pi pi-sign-out mr-2"></i>logout {{ getUserProfile().fullName }}
52
+ </button>
53
+ </div>
54
+
55
+
56
+ </div>
57
+ <!-- </header> -->
58
+ </template>
@@ -0,0 +1,92 @@
1
+ <template>
2
+ <div>
3
+ <SelectButton v-model="selectedgroup" @change="selectGroup" :options="grouplist" option-label="label" option-value="value"></SelectButton>
4
+ <div v-if="selectedgroup">
5
+ <div v-if="useRuntimeConfig().public.DEBUGDATA" class="flex flex-row gap-2 p-2">
6
+ <div class="flex align-items-center">
7
+ <RadioButton v-model="mode" inputId="modepreview" name="pizza" value="preview" />
8
+ <label for="modepreview" class="ml-2">Preview</label>
9
+ </div>
10
+ <div class="flex align-items-center">
11
+ <RadioButton v-model="mode" inputId="modeedit" name="edit" value="edit" />
12
+ <label for="modeedit" class="ml-2">Edit</label>
13
+ </div>
14
+ <div class="flex align-items-center">
15
+ <RadioButton v-model="mode" inputId="modejson" name="json" value="json" />
16
+ <label for="modejson" class="ml-2">JSON</label>
17
+ </div>
18
+
19
+ </div>
20
+ <div v-if="mode=='json'">
21
+ <div class="flex-row">
22
+ <div><button @click="copyText">copy</button> </div>
23
+ <div class="text text-gray-400">{{ copied }}</div>
24
+ </div>
25
+ <pre id="permissionstr">
26
+ {{ permissions }}
27
+ </pre>
28
+ </div>
29
+ <div class="permission-block flex flex-col m mt-4" v-for="res in allresources" v-else="showjson">
30
+ <div class="m mr-3 ">{{ res }}</div>
31
+ <div class="gap-4" v-if="allactions">
32
+ <SelectButton v-if="mode=='edit'" multiple :options="allactions[res]" v-model="permissions[res]"></SelectButton>
33
+
34
+ <span v-else v-for="actionname in allactions[res]" class="m m-1">
35
+ <Chip class="bg-primary" v-if="canPerformAction(selectedgroup,res,actionname)" severity="success" :label="actionname" ></Chip>
36
+ <Chip v-else :label="actionname" ></Chip>
37
+ </span>
38
+
39
+
40
+ </div>
41
+ </div>
42
+ </div>
43
+ </div>
44
+ </template>
45
+ <script setup lang="ts">
46
+ import _ from "lodash";
47
+ import Tag from "primevue/tag"
48
+ import Badge from 'primevue/badge';
49
+ import Chip from 'primevue/chip';
50
+ import RadioButton from 'primevue/radiobutton';
51
+ import {ref} from 'vue'
52
+ import ToggleButton from 'primevue/togglebutton';
53
+ import SelectButton from "primevue/selectbutton";
54
+ import Checkbox from "primevue/checkbox";
55
+ const selectedgroup = ref('')
56
+ const grouplist = getAllGroups().map((item)=>{return {value:item,label:_.capitalize(item)}})
57
+ const mode = ref('preview')
58
+
59
+ const allresources = getUniqueResource()
60
+ const allactions = ref()
61
+ const permissions=ref()
62
+
63
+ const activeroles = ref()
64
+ const copied = ref('')
65
+ const copyText = () => {
66
+ copied.value="copied!"
67
+ const storage = document.createElement('textarea');
68
+ storage.value = String(document.getElementById('permissionstr')?.innerHTML)
69
+ document.body.appendChild(storage);
70
+ storage.select();
71
+ storage.setSelectionRange(0, 99999);
72
+ document.execCommand('copy');
73
+ document.body.removeChild(storage);
74
+
75
+
76
+
77
+ }
78
+ const selectGroup = (selectedgroup:any) => {
79
+ const groupname = selectedgroup.value
80
+ activeroles.value= getGroupRoles(groupname)
81
+ allactions.value={}
82
+ permissions.value={}
83
+ for(let i=0; i< allresources.length; i++){
84
+ const r = allresources[i]
85
+ console.log(r)
86
+ const actions = getActionFromResource(r)
87
+ allactions.value[r]=actions
88
+ permissions.value[r]=getGroupResourcePermission(groupname,r).map(item=>item.action)
89
+ }
90
+ console.log(allactions.value,permissions.value)
91
+ }
92
+ </script>
@@ -0,0 +1,131 @@
1
+ <template>
2
+ <FieldContainer :hidelabel="hidelabel" v-model="modelValue" :label="label" :description="description" :setting="setting" :instancepath="instancepath" :error="error" #default="slotprops">
3
+
4
+ <div v-if="componentErr!=''" class="input-error">{{componentErr}}</div>
5
+ <AutoComplete v-else
6
+ class="simpleapp-inputfield simpleapp-autocomplete flex flex-row "
7
+ :inputId="slotprops.uuid"
8
+ v-model="selecteditem"
9
+ v-bind="$attrs"
10
+ :optionLabel="optionLabel"
11
+ :path="setting.instancepath"
12
+ @blur="onblur"
13
+ @item-select="pickValue"
14
+ @complete="getListFromAutocompleteApi"
15
+ :suggestions="list"
16
+ forceSelection
17
+ :dropdown="dropdown"
18
+ :pt="{
19
+ // root:{class: 'w-full' },
20
+ // container:{class: 'w-full' },
21
+ input:{class:'border w-full'}
22
+ }"
23
+
24
+ />
25
+
26
+ </FieldContainer>
27
+ </template>
28
+ <script lang="ts" setup>
29
+
30
+ import {computed,watch,ref} from 'vue'
31
+ import AutoComplete from 'primevue/autocomplete';
32
+ import FieldContainer from './SimpleFieldContainer.vue'
33
+ import {prepareList} from './helper'
34
+ import type {SimpleAppFieldSetting,ListOptionType} from './type'
35
+ import { SimpleAppClient } from '../generate/docs/SimpleAppClient' //'../SimpleAppClient';
36
+ import type { JSONSchema7 } from 'json-schema';
37
+
38
+ type autocompletetype={[key:string]:any}
39
+
40
+ const props = withDefaults(defineProps<{
41
+ label?:string
42
+ description?:string
43
+ error?:string
44
+ setting:SimpleAppFieldSetting
45
+ instancepath?:string
46
+ optionLabel:string
47
+ dropdown?: boolean
48
+ remoteSrc?: any
49
+ hidelabel?:boolean
50
+ readonly?:boolean
51
+ }>(),{
52
+ dropdown:true,
53
+ hidelabel:false
54
+ })
55
+ //{type:boolean, default:true, require:false},
56
+ // {type:boolean, default:false, require:false},
57
+ interface typefieldsetting extends JSONSchema7 {
58
+ 'x-foreignkey'?:string
59
+ }
60
+ const modelValue = defineModel<autocompletetype>()
61
+ const labelfield = props.optionLabel
62
+ const list = ref()
63
+ const componentErr = ref('')
64
+ let tmp:autocompletetype={}
65
+ const fieldsetting:typefieldsetting = props.setting.fieldsetting
66
+
67
+ Object.assign(tmp,modelValue.value)
68
+ const selecteditem=ref(tmp)
69
+
70
+ if(!selecteditem.value[labelfield]){
71
+ selecteditem.value[labelfield]=''
72
+ }
73
+
74
+ const getListFromAutocompleteApi = (event:any)=>{
75
+ const keyword = event.query??''
76
+ const remoteSrc = props.remoteSrc
77
+ remoteSrc.autoComplete(keyword).then((res:any)=>{
78
+ list.value = res.data
79
+ }).catch((res:any)=>{
80
+ console.error(res)
81
+ })
82
+ }
83
+ const emit = defineEmits(['change'])
84
+ watch(modelValue,(newvalue:autocompletetype)=>{
85
+ selecteditem.value=newvalue
86
+ if(newvalue){
87
+ console.log("newvalue",newvalue,props.optionLabel)
88
+ if(typeof newvalue[props.optionLabel] == 'undefined'){
89
+ selecteditem.value[props.optionLabel]=''
90
+ }
91
+ // props.setting.document.validateFailed()
92
+ emit('change',modelValue.value)
93
+ }
94
+
95
+ })
96
+
97
+ if(fieldsetting['x-foreignkey'] == 'undefined'){
98
+ componentErr.value='undefine "x-foreignkey" of this field in jsonschema'
99
+ }else if( !props['remoteSrc'] || !props['remoteSrc']['autoComplete']){
100
+ componentErr.value='invalid property "remoteSrc" cause props.remoteSrc.autoComplete(keyword:string) does not exists)'
101
+ }else{
102
+ componentErr.value=''
103
+ }
104
+
105
+
106
+ const pickValue = (event:any)=>{
107
+ if(typeof event.value.query == 'undefined'){
108
+ modelValue.value=event.value
109
+ }
110
+ }
111
+
112
+ const onblur = ()=>{
113
+ selecteditem.value={...modelValue.value}
114
+ if(typeof selecteditem.value[labelfield]=='undefined'){
115
+ selecteditem.value[labelfield]=''
116
+ }
117
+ // console.log("selecteditem.value",selecteditem.value)
118
+ }
119
+ const capitalizeFirstLetter = (str: string) => {
120
+ const res = str == '' ? '' : str.slice(0, 1).toUpperCase() + str.slice(1);
121
+ // const res = str;
122
+ return res;
123
+ };
124
+ </script>
125
+ <style scoped>
126
+ .simpleapp-autocomplete{
127
+ @apply w-auto ;
128
+ line-height: 1rem;
129
+ }
130
+
131
+ </style>