@simitgroup/simpleapp-generator 1.4.2-alpha → 1.5.1-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 (72) hide show
  1. package/README.md +3 -1
  2. package/dist/buildinschemas/autoincreament.d.ts.map +1 -1
  3. package/dist/buildinschemas/autoincreament.js +1 -0
  4. package/dist/buildinschemas/autoincreament.js.map +1 -1
  5. package/dist/buildinschemas/docnoformat.d.ts.map +1 -1
  6. package/dist/buildinschemas/docnoformat.js +1 -0
  7. package/dist/buildinschemas/docnoformat.js.map +1 -1
  8. package/dist/buildinschemas/permission.d.ts.map +1 -1
  9. package/dist/buildinschemas/permission.js +1 -8
  10. package/dist/buildinschemas/permission.js.map +1 -1
  11. package/dist/framework.d.ts.map +1 -1
  12. package/dist/framework.js +4 -2
  13. package/dist/framework.js.map +1 -1
  14. package/dist/generate.js +6 -4
  15. package/dist/generate.js.map +1 -1
  16. package/dist/processors/bpmnbuilder.d.ts.map +1 -1
  17. package/dist/processors/bpmnbuilder.js +10 -4
  18. package/dist/processors/bpmnbuilder.js.map +1 -1
  19. package/dist/processors/jsonschemabuilder.d.ts.map +1 -1
  20. package/dist/processors/jsonschemabuilder.js +9 -0
  21. package/dist/processors/jsonschemabuilder.js.map +1 -1
  22. package/package.json +1 -1
  23. package/src/buildinschemas/autoincreament.ts +1 -0
  24. package/src/buildinschemas/docnoformat.ts +1 -0
  25. package/src/buildinschemas/permission.ts +1 -8
  26. package/src/framework.ts +5 -4
  27. package/src/generate.ts +7 -6
  28. package/src/processors/bpmnbuilder.ts +10 -5
  29. package/src/processors/jsonschemabuilder.ts +10 -0
  30. package/templates/basic/nest/apischema.ts.eta +5 -0
  31. package/templates/basic/nest/controller.ts.eta +31 -12
  32. package/templates/basic/nest/resolver.ts.eta +124 -0
  33. package/templates/basic/nest/service.ts.eta +0 -6
  34. package/templates/nest/.env._eta +7 -7
  35. package/templates/nest/src/app.module.ts.eta +24 -21
  36. package/templates/nest/src/app.resolver.ts.eta +9 -0
  37. package/templates/nest/src/cloudapi/cloudapi.module.ts._eta +15 -0
  38. package/templates/nest/src/cloudapi/cloudapi.service.ts._eta +15 -0
  39. package/templates/nest/src/simpleapp/apischemas/index.ts._eta +15 -1
  40. package/templates/nest/src/simpleapp/generate/commons/decorators/appuser.decorator.ts.eta +11 -5
  41. package/templates/nest/src/simpleapp/generate/commons/interceptors/response.interceptor.ts.eta +44 -39
  42. package/templates/nest/src/simpleapp/generate/commons/middlewares/tenant.middleware.ts.eta +16 -4
  43. package/templates/nest/src/simpleapp/generate/commons/robotuser.service.ts.eta +112 -0
  44. package/templates/nest/src/simpleapp/generate/commons/roles/roles.guard.ts.eta +24 -12
  45. package/templates/nest/src/simpleapp/generate/commons/user.context.ts.eta +4 -1
  46. package/templates/nest/src/simpleapp/generate/processors/simpleapp.processor.ts.eta +12 -5
  47. package/templates/nest/src/simpleapp/generate/types/index.ts.eta +1 -1
  48. package/templates/nest/src/simpleapp/generate/types/schema.type.ts.eta +191 -0
  49. package/templates/nest/src/simpleapp/generate/types/simpleapp.type.ts.eta +200 -5
  50. package/templates/nest/src/simpleapp/generate/types/workflow.type.ts.eta +15 -0
  51. package/templates/nest/src/simpleapp/generate/workflow/workflow.config.ts.eta +3 -3
  52. package/templates/nest/src/simpleapp/generate/workflow/workflow.controller.ts.eta +8 -6
  53. package/templates/nest/src/simpleapp/generate/workflow/workflow.service.ts.eta +60 -23
  54. package/templates/nest/src/simpleapp/resolvers/readme.md.eta +1 -0
  55. package/templates/nest/src/simpleapp/simpleapp.module.ts.eta +13 -3
  56. package/templates/nest/src/simpleapp/types/index.ts._eta +6 -0
  57. package/templates/nest/src/simpleapp/workflows/listeners/simpleapp.listener.ts.eta +31 -0
  58. package/templates/nuxt/app.vue._eta +8 -2
  59. package/templates/nuxt/assets/primevue/passthrough.ts._eta +1 -1
  60. package/templates/nuxt/components/renderer/RendererMoney.vue.eta +21 -12
  61. package/templates/nuxt/composables/graphquery.generate.ts.eta +26 -0
  62. package/templates/nuxt/composables/refreshDocumentList.generate.ts.eta +7 -6
  63. package/templates/nuxt/layouts/mobile.vue._eta +2 -2
  64. package/templates/nuxt/nuxt.config.ts._eta +8 -0
  65. package/templates/nuxt/pages/[xorg]/index.vue._eta +9 -0
  66. package/templates/nuxt/pages/[xorg]/mobile/index.vue._eta +2 -15
  67. package/templates/nuxt/pages/picktenant.vue._eta +3 -1
  68. package/templates/nuxt/simpleapp/generate/clients/SimpleAppClient.ts.eta +2 -0
  69. package/templates/nuxt/types/events.ts.eta +4 -3
  70. package/templates/project/workflows/bpmn/{suspendcustomer.bpmn._eta → sayhello.bpmn._eta} +6 -36
  71. package/tsconfig.tsbuildinfo +1 -1
  72. package/templates/nest/src/simpleapp/workflows/listeners/simpleapp.listener.ts._eta +0 -26
@@ -0,0 +1,15 @@
1
+ /**
2
+ * This file was automatically generated by simpleapp generator. Every
3
+ * MODIFICATION OVERRIDE BY GENERATEOR
4
+ * last change 2024-04-15
5
+ * Author: Ks Tan
6
+ */
7
+
8
+ export type WorkflowCatalogue = {
9
+ <%for(let i=0; i<it.allbpmn.length;i++){ %>
10
+ <% const bpmn = it.allbpmn[i] %>
11
+ <%=bpmn%>:any,
12
+ <%}%>
13
+ }
14
+
15
+ export type WorkflowName = keyof WorkflowCatalogue
@@ -20,7 +20,7 @@ let _this: WorkflowConfig; //we need another variable to access WorkflowConfig
20
20
  class MyDataStore extends DataStore {
21
21
  constructor(bpmnserver) {
22
22
  super(bpmnserver);
23
- console.log('this.dbConfiguration ', this.db);
23
+ //console.log('this.dbConfiguration ', this.db);
24
24
  }
25
25
  }
26
26
 
@@ -65,8 +65,8 @@ export class WorkflowConfig {
65
65
  },
66
66
  appDelegate: (server: BPMNServer) =>
67
67
  _this.workflowdelegate.setServer(server),
68
- userService: (server: BPMNServer) =>
69
- _this.workflowUserService.setServer(server),
68
+ //userService: (server: BPMNServer) =>
69
+ //_this.workflowUserService.setServer(server),
70
70
  dataStore: function (server: BPMNServer) {
71
71
  return new MyDataStore(server);
72
72
  },
@@ -1,7 +1,7 @@
1
1
  /**
2
2
  * This file was automatically generated by simpleapp generator. Every
3
3
  * MODIFICATION OVERRIDE BY GENERATEOR
4
- * last change 2024-02-23
4
+ * last change 2024-04-15
5
5
  * Author: Ks Tan
6
6
  */
7
7
  import {
@@ -15,6 +15,7 @@ import {
15
15
  Delete,
16
16
  HttpCode,
17
17
  } from '@nestjs/common';
18
+
18
19
  import { WorkflowService } from './workflow.service';
19
20
  import { UserTaskActors } from './workflow.type';
20
21
  import { Roles } from '../commons/roles/roles.decorator';
@@ -29,6 +30,7 @@ import {
29
30
  import { ApiTags, ApiBody, ApiResponse, ApiOperation } from '@nestjs/swagger';
30
31
  import { AppUser } from '../commons/decorators/appuser.decorator';
31
32
  import { UserContext } from '../commons/user.context';
33
+ import { WorkflowName } from '../types';
32
34
  @ApiTags('workflow')
33
35
  @Controller('workflow')
34
36
  export class WorkflowController {
@@ -210,7 +212,7 @@ export class WorkflowController {
210
212
  })
211
213
  async newWorkflowDefinitions(
212
214
  @AppUser() appuser: UserContext,
213
- @Param('workflowname') workflowname: string,
215
+ @Param('workflowname') workflowname: WorkflowName,
214
216
  @Body() xml: string,
215
217
  ) {
216
218
  return await this.workflowService.newWorkflowDefinitions(
@@ -234,7 +236,7 @@ export class WorkflowController {
234
236
  })
235
237
  async updateWorkflowDefinition(
236
238
  @AppUser() appuser: UserContext,
237
- @Param('workflowname') workflowname: string,
239
+ @Param('workflowname') workflowname: WorkflowName,
238
240
  @Body() xml: string,
239
241
  ) {
240
242
  return await this.workflowService.updateWorkflowDefinition(
@@ -254,7 +256,7 @@ export class WorkflowController {
254
256
  })
255
257
  async readWorkflowDefinition(
256
258
  @AppUser() appuser: UserContext,
257
- @Param('workflowname') workflowname: string,
259
+ @Param('workflowname') workflowname: WorkflowName,
258
260
  ) {
259
261
  return await this.workflowService.readWorkflowDefinition(
260
262
  appuser,
@@ -271,7 +273,7 @@ export class WorkflowController {
271
273
  })
272
274
  async dropWorkflowDefinition(
273
275
  @AppUser() appuser: UserContext,
274
- @Param('workflowname') workflowname: string,
276
+ @Param('workflowname') workflowname: WorkflowName,
275
277
  ) {
276
278
  return await this.workflowService.deleteWorkflowDefinition(
277
279
  appuser,
@@ -344,7 +346,7 @@ export class WorkflowController {
344
346
  })
345
347
  async startWorkflow(
346
348
  @AppUser() appuser: UserContext,
347
- @Param('workflowname') workflowname: string,
349
+ @Param('workflowname') workflowname: WorkflowName,
348
350
  @Body() data: any,
349
351
  ) {
350
352
  return await this.workflowService.startWorkflow(
@@ -1,7 +1,8 @@
1
+ import { error } from 'console';
1
2
  /**
2
3
  * This file was automatically generated by simpleapp generator. Every
3
4
  * MODIFICATION OVERRIDE BY GENERATEOR
4
- * last change 2024-02-23
5
+ * last change 2024-04-19
5
6
  * Author: Ks Tan
6
7
  */
7
8
  import { WorkflowConfig } from './workflow.config';
@@ -30,9 +31,11 @@ import {
30
31
  Logger as bpmnlogger,
31
32
  BPMN_TYPE,
32
33
  EXECUTION_EVENT,
34
+ ILogger,
33
35
  } from 'bpmn-server';
34
36
  // import { configuration } from './configuration';
35
37
  import { UserContext } from '../commons/user.context';
38
+ import { WorkflowName } from '../types';
36
39
  //import * as formschemas from '../../workflow/formschema';
37
40
  export {
38
41
  WorkflowSettingApiSchema,
@@ -47,7 +50,23 @@ export class WorkflowService {
47
50
  private workflowconfig: WorkflowConfig,
48
51
  private eventEmitter: EventEmitter2,
49
52
  ) {
50
- this.bpmnServer = new BPMNServer(this.workflowconfig.getConfig());
53
+ const config = this.workflowconfig.getConfig()
54
+ class HiddenLogger implements ILogger{
55
+ setOptions(){}
56
+ clear(){}
57
+ get(){ return [] as any[]}
58
+ debug(){}
59
+ warn(){}
60
+ info(){}
61
+ reportError(err:any){
62
+ console.log("report Error:",err )
63
+ }
64
+ async save(filename:any){}
65
+ log(){}
66
+ error(err: any){console.log("Error:",err )
67
+ }
68
+ }
69
+ this.bpmnServer = new BPMNServer(config, new HiddenLogger());
51
70
  this.bpmnServer.listener.on(
52
71
  'all',
53
72
  async (event) => await this.applyEventListener(event),
@@ -110,7 +129,7 @@ export class WorkflowService {
110
129
  */
111
130
  async newWorkflowDefinitions(
112
131
  appuser: UserContext,
113
- workflowName: string,
132
+ workflowName: WorkflowName,
114
133
  xml: string,
115
134
  ) {
116
135
  throw new BadRequestException(
@@ -124,13 +143,19 @@ export class WorkflowService {
124
143
  );
125
144
  }
126
145
 
127
- async readWorkflowDefinition(appuser: UserContext, workflowname: string) {
146
+ async readWorkflowDefinition(
147
+ appuser: UserContext,
148
+ workflowname: WorkflowName,
149
+ ) {
128
150
  throw new BadRequestException(
129
151
  `readWorkflowDefinition is not supported yet`,
130
152
  );
131
153
  }
132
154
 
133
- async deleteWorkflowDefinition(appuser: UserContext, workflowname: string) {
155
+ async deleteWorkflowDefinition(
156
+ appuser: UserContext,
157
+ workflowname: WorkflowName,
158
+ ) {
134
159
  throw new BadRequestException(
135
160
  `deleteWorkflowDefinition is not supported yet`,
136
161
  );
@@ -138,7 +163,7 @@ export class WorkflowService {
138
163
 
139
164
  async updateWorkflowDefinition(
140
165
  appuser: UserContext,
141
- workflowname: string,
166
+ workflowname: WorkflowName,
142
167
  xml: string,
143
168
  ) {
144
169
  throw new BadRequestException(
@@ -193,21 +218,20 @@ export class WorkflowService {
193
218
  data: any,
194
219
  ) {
195
220
  try {
196
-
197
221
  const response = await this.bpmnServer.engine.invoke(
198
222
  { 'items.id': taskId, 'items.status': 'wait' },
199
223
  data,
200
224
  appuser.getUid(),
201
- {appuser:appuser}
225
+ { appuser: appuser },
202
226
  );
203
227
  return {
204
- parentKeys:Object.keys(response),
205
- parentId:response.id,
206
- data:response.instance.data,
228
+ parentKeys: Object.keys(response),
229
+ parentId: response.id,
230
+ data: response.instance.data,
207
231
  // parentId:response,
208
- input:response.item.input,
209
- vars:response.item.vars,
210
- id:response.item.id,
232
+ input: response.item.input,
233
+ vars: response.item.vars,
234
+ id: response.item.id,
211
235
  status: response.item.status,
212
236
  };
213
237
  } catch (e) {
@@ -313,12 +337,26 @@ export class WorkflowService {
313
337
  * @returns workflowsummary
314
338
  */
315
339
  @OnEvent('workflow.start')
316
- async startWorkflow(appuser: UserContext, workflowName: string, data?: any) {
340
+ async startWorkflow(
341
+ appuser: UserContext,
342
+ workflowName: WorkflowName,
343
+ data?: any,
344
+ ) {
345
+ //run as event, it wont have transaction
346
+ appuser.setDBSession(undefined);
347
+
348
+ if (!data) data = {};
349
+
350
+ //sometimes data is Mongoose object instead of pure data, need serialize and deserialize to remove that
351
+ data = JSON.parse(JSON.stringify(data));
352
+
317
353
  try {
318
354
  // console.log('startWorkflow started: ', workflowName);
355
+
319
356
  data.tenantId = appuser.getTenantId();
320
357
  data.orgId = appuser.getOrgId();
321
358
  data.branchId = appuser.getBranchId();
359
+
322
360
  const result = await this.bpmnServer.engine.start(
323
361
  workflowName,
324
362
  data,
@@ -457,13 +495,12 @@ export class WorkflowService {
457
495
  const elementProps = event.context.item.element.def;
458
496
  // const usertaskinput = event.context.item.input ?? null;
459
497
  const data = event.context.instance.data;
460
- const vars = {}
461
- Object.assign(vars,event.context.item.input);
462
- event.context.item.input={}
498
+ const vars = {};
499
+ Object.assign(vars, event.context.item.input);
500
+ event.context.item.input = {};
463
501
  const options = event.context.options;
464
502
  switch (elementType) {
465
503
  case BPMN_TYPE.UserTask:
466
-
467
504
  let usertaskeventtype: UserTaskEventType;
468
505
  if (eventType == EXECUTION_EVENT.node_start)
469
506
  usertaskeventtype = 'start';
@@ -475,7 +512,7 @@ export class WorkflowService {
475
512
  usertaskeventtype = 'invoked';
476
513
  else if (eventType == EXECUTION_EVENT.node_wait)
477
514
  usertaskeventtype = 'wait';
478
- // console.log("event-------=================================",eventType,usertaskeventtype)
515
+ // console.log("event-------=================================",eventType,usertaskeventtype)
479
516
  if (usertaskeventtype) {
480
517
  const props: UserTaskData = {
481
518
  workflowName: workflowName,
@@ -492,9 +529,9 @@ export class WorkflowService {
492
529
  followUpDate: event.context.item.followUpDate,
493
530
  priority: event.context.item.priority,
494
531
  formKey: elementProps.formKey,
495
- },
532
+ },
496
533
  data: data,
497
- vars:vars,
534
+ vars: vars,
498
535
  options: options,
499
536
  };
500
537
  this.eventEmitter.emit(
@@ -518,7 +555,7 @@ export class WorkflowService {
518
555
  elementId: elementId,
519
556
  elementName: elementName,
520
557
  data: data,
521
- vars:vars,
558
+ vars: vars,
522
559
  options: options,
523
560
  };
524
561
  this.eventEmitter.emit(
@@ -0,0 +1 @@
1
+ graphql resolver
@@ -8,11 +8,12 @@ import { Module } from '@nestjs/common';
8
8
  import { MongooseModule } from '@nestjs/mongoose';
9
9
  import {DocNumberFormatGenerator} from './generate/commons/docnogenerator.service'
10
10
  import { AuditTrail } from './generate/commons/audittrail.service';
11
-
11
+ import { CloudApiModule } from 'src/cloudapi/cloudapi.module';
12
12
  // auto import modules
13
13
  <% for(let i=0;i<it.modules.length; i++){ %>
14
14
  <% let obj = it.modules[i]%>
15
15
  import { <%= obj.docname %>Service } from './services/<%= obj.doctype %>.service';
16
+ import { <%= obj.docname %>Resolver } from './generate/resolvers/<%= obj.doctype %>.resolver';
16
17
  import { <%= obj.docname %>Controller } from './generate/controllers/<%= obj.doctype %>.controller';
17
18
  import { <%= obj.docname %>MongoSchema } from './generate/models/<%= obj.doctype %>.model';
18
19
  <%}%>
@@ -23,6 +24,7 @@ import { WorkflowDelegate } from './generate/workflow/workflow.delegate';
23
24
  import { WorkflowConfig } from './generate/workflow/workflow.config';
24
25
  import { WorkflowService } from './generate/workflow/workflow.service';
25
26
  import { WorkflowUserService } from './generate/workflow/workflow.userservice';
27
+ import { SimpleAppRobotUserService } from './generate/commons/robotuser.service';
26
28
  <%for(let i=0; i<it.allbpmn.length;i++){%>
27
29
  <%let bpmn = it.allbpmn[i]%>
28
30
  import { <%=capitalizeFirstLetter(bpmn)%>ListenerService } from 'src/simpleapp/workflows/listeners/<%=bpmn%>.listener';
@@ -36,6 +38,7 @@ import { <%=capitalizeFirstLetter(bpmn)%>ListenerService } from 'src/simpleapp/w
36
38
 
37
39
  @Module({
38
40
  imports: [
41
+ CloudApiModule,
39
42
  MongooseModule.forFeature([
40
43
  <% for(let i=0;i<it.modules.length; i++){ %>
41
44
  <% let obj = it.modules[i]%>
@@ -45,12 +48,19 @@ import { <%=capitalizeFirstLetter(bpmn)%>ListenerService } from 'src/simpleapp/w
45
48
  ],
46
49
  controllers: [<% for(let i=0;i<it.modules.length; i++){ %><%= it.modules[i].docname %>Controller,<%}%> ProfileController,WorkflowController],
47
50
  providers: [
48
- AuditTrail,DocNumberFormatGenerator,<% for(let i=0;i<it.modules.length; i++){ %><%= it.modules[i].docname %>Service,<%}%> ProfileService,WorkflowDelegate,WorkflowConfig,WorkflowService,WorkflowUserService,
51
+ SimpleAppRobotUserService,
52
+ AuditTrail,DocNumberFormatGenerator,<% for(let i=0;i<it.modules.length; i++){ %>
53
+ <%= it.modules[i].docname %>Service,
54
+ <%= it.modules[i].docname %>Resolver,
55
+ <%}%> ProfileService,WorkflowDelegate,WorkflowConfig,WorkflowService,WorkflowUserService,
49
56
  <%for(let i=0; i<it.allbpmn.length;i++){%>
50
57
  <%let bpmn = it.allbpmn[i]%>
51
58
  <%=capitalizeFirstLetter(bpmn)%>ListenerService,
52
59
  <%}%>
53
60
  ],
54
- exports:[AuditTrail,DocNumberFormatGenerator,<% for(let i=0;i<it.modules.length; i++){ %><%= it.modules[i].docname %>Service,<%}%> ProfileService,WorkflowDelegate,WorkflowConfig,WorkflowService,WorkflowUserService,]
61
+ exports:[SimpleAppRobotUserService,AuditTrail,DocNumberFormatGenerator,<% for(let i=0;i<it.modules.length; i++){ %>
62
+ <%= it.modules[i].docname %>Service,
63
+ <%= it.modules[i].docname %>Resolver,
64
+ <%}%> ProfileService,WorkflowDelegate,WorkflowConfig,WorkflowService,WorkflowUserService,]
55
65
  })
56
66
  export class GenerateModule {}
@@ -11,6 +11,12 @@ export type ForeignKey = {
11
11
  [key:string]:any
12
12
  };
13
13
 
14
+ export type CodeLabelValue = {
15
+ _id: string
16
+ code: string
17
+ label: string
18
+ value: number
19
+ }
14
20
  export type UserPermission = {
15
21
  permId: string;
16
22
  branchId: number
@@ -0,0 +1,31 @@
1
+ /**
2
+ * This file was automatically generated by simpleapp generator.
3
+ * DONT CHANGE THIS FILE !!
4
+ * MODIFICATION OVERRIDE BY GENERATEOR
5
+ * last change 2024-03-19
6
+ * Author: Ks Tan
7
+ */
8
+ import { Inject, Injectable, Logger } from '@nestjs/common';
9
+ import { InjectModel } from '@nestjs/mongoose';
10
+ import { Model } from 'mongoose';
11
+ import { UserContext } from 'src/simpleapp/generate/commons/user.context';
12
+ import { User } from 'src/simpleapp/services/user.service';
13
+ import { Permission } from 'src/simpleapp/services/perm.service';
14
+ import { SimpleAppRobotUserService } from 'src/simpleapp/generate/commons/robotuser.service';
15
+
16
+ @Injectable()
17
+ export class SimpleAppListenerService {
18
+ private systemAccessToken: string;
19
+ private expired: string;
20
+ logger = new Logger();
21
+ @InjectModel('User') private readonly usermodel: Model<User>;
22
+ @InjectModel('Permission') private readonly permmodel: Model<Permission>;
23
+ @Inject(SimpleAppRobotUserService)
24
+ private robotuser:SimpleAppRobotUserService;
25
+
26
+ constructor() {}
27
+
28
+ prepareAppUser(data: any) {
29
+ return this.robotuser.prepareAppUser(data)
30
+ }
31
+ }
@@ -13,13 +13,15 @@
13
13
  /**
14
14
  * This file was automatically generated by simpleapp generator. Every
15
15
  * MODIFICATION OVERRIDE BY GENERATEOR
16
- * last change 2023-11-12
16
+ * last change 2024-03-17
17
17
  * Author: Ks Tan
18
18
  */
19
+
19
20
  watch(()=>useRoute().params['xorg'],async (newval,oldvalue)=>{
20
21
  await reloadUserStore()
21
22
  if(getPathPara('xorg','')!=''){
22
23
  if(!getUserProfile()?.currentGroup) goTo('pickgroup')
24
+ setGraphqlServer()
23
25
  }
24
26
  })
25
27
 
@@ -36,6 +38,10 @@ const getLayout = ()=>{
36
38
  onMounted(()=>{
37
39
  const currentgroup = useCookie('currentGroup').value
38
40
  //if no xorg, no enforce pick group
39
- if(getCurrentXorg() && !currentgroup) goTo('pickgroup')
41
+ if(getCurrentXorg()){
42
+ if (!currentgroup)goTo('pickgroup')
43
+ setGraphqlServer()
44
+ }
45
+
40
46
  })
41
47
  </script>
@@ -21,7 +21,7 @@ const CustomTailwind = usePassThrough(
21
21
  // buttonContainer:{class:'hidden'},
22
22
  },
23
23
  card:{
24
- root:{class:'bg-white dark:bg-gray-800 shadow p-4 rounded-2xl'},
24
+ root:{class:'bg-white dark:bg-gray-800 shadow p-2 rounded-2xl'},
25
25
  // title:{class:''},
26
26
  // header:{class:''}
27
27
  },
@@ -1,11 +1,13 @@
1
-
2
1
  <template>
3
- <span v-if="showCurrency"> {{ Intl.NumberFormat( useI18n().defaultLocale,{
4
- style:'currency',
5
- currency: getUserProfile()?.currency,
6
- currencyDisplay: 'symbol',
7
- }).format(modelValue) }}</span>
8
- <span v-else> {{ modelValue.toLocaleString(useI18n().defaultLocale,options) }}</span>
2
+ <span v-if="typeof modelValue=='undefined' || typeof modelValue=='string' ">-</span>
3
+ <span v-else-if="showCurrency">
4
+ {{
5
+ currenyValue
6
+ }}</span
7
+ >
8
+ <span v-else>
9
+ {{ modelValue.toLocaleString(useI18n().defaultLocale, options) }}</span
10
+ >
9
11
  </template>
10
12
  <script lang="ts" setup>
11
13
  /**
@@ -14,12 +16,19 @@
14
16
  * last change 2024-02-04
15
17
  * author: Ks Tan
16
18
  */
17
-
19
+ const currenyValue = computed(()=>{
20
+ if(modelValue.value === undefined) return '-'
21
+ return Intl.NumberFormat(useI18n().defaultLocale, {
22
+ // style: "currency",
23
+ // currency: getUserProfile()?.currency ?? '',
24
+ // currencyDisplay: "symbol",
25
+ }).format(modelValue.value)
26
+ })
18
27
  const options = {
19
- style: 'decimal', // Other options: 'currency', 'percent', etc.
28
+ style: "decimal", // Other options: 'currency', 'percent', etc.
20
29
  minimumFractionDigits: 2,
21
30
  maximumFractionDigits: 2,
22
31
  };
23
- const modelValue = defineModel<number>({required:true})
24
- const props = defineProps<{showCurrency?:boolean}>()
25
- </script>
32
+ const modelValue = defineModel<number>({ required: true });
33
+ const props = defineProps<{ showCurrency?: boolean }>();
34
+ </script>
@@ -0,0 +1,26 @@
1
+ /**
2
+ * This file was automatically generated by simpleapp generator. Every
3
+ * MODIFICATION OVERRIDE BY GENERATEOR
4
+ * last change 2024-03-13
5
+ * Author: Ks Tan
6
+ */
7
+
8
+ import { createHttpLink, } from '@apollo/client/core';
9
+
10
+ export const setGraphqlServer=()=>{
11
+ const apolloclient = useNuxtApp().$apollo.defaultClient
12
+ const newlink = createHttpLink({
13
+ uri: `${useRuntimeConfig().public.API_URL}/${getCurrentXorg()}/graphql`,
14
+ })
15
+ apolloclient.setLink(newlink)
16
+ apolloclient.defaultOptions={
17
+
18
+ query:{
19
+ fetchPolicy: 'no-cache',
20
+ errorPolicy: 'all'
21
+ }
22
+ }
23
+
24
+ }
25
+
26
+ export const graphquery=async<T>(qqlstr: typeof gql) =>(await useAsyncQuery<T>(qqlstr)).data
@@ -1,19 +1,20 @@
1
1
  /**
2
2
  * This file was automatically generated by simpleapp generator. Every
3
3
  * MODIFICATION OVERRIDE BY GENERATEOR
4
- * last change 2024-03-07
4
+ * last change 2024-04-15
5
5
  * Author: Ks Tan
6
6
  */
7
- export const refreshDocumentList = (docName:string)=>useNuxtApp().$event('RefreshDocumentList',{documentName:docName})
8
- export const refreshDocument = (docName:string)=>useNuxtApp().$event('RefreshDocument',docName)
7
+ import {SimpleAppDocumentType} from '~/types'
8
+ export const refreshDocumentList = (docName:SimpleAppDocumentType)=>useNuxtApp().$event('RefreshDocumentList',{documentName:docName})
9
+ export const refreshDocument = (docName:SimpleAppDocumentType)=>useNuxtApp().$event('RefreshDocument',docName)
9
10
 
10
- export const listenDocument = (docName:string,callback:Function) =>{
11
+ export const listenDocument = (docName:SimpleAppDocumentType,callback:Function) =>{
11
12
  useNuxtApp().$listen('RefreshDocument',async (eventdocname:string)=>{
12
13
  if(eventdocname==docName) await callback()
13
14
  })
14
15
  }
15
- export const listenDocumentList = (docName:string,callback:Function) =>{
16
+ export const listenDocumentList = (docName:SimpleAppDocumentType,callback:Function) =>{
16
17
  useNuxtApp().$listen('RefreshDocumentList',async (eventdata)=>{
17
18
  if(eventdata.documentName == docName) await callback()
18
19
  })
19
- }
20
+ }
@@ -23,9 +23,9 @@
23
23
 
24
24
  <HeaderButtonMenuPicker v-model="showMenu"></HeaderButtonMenuPicker>
25
25
  <HeaderButtonProfile v-model="showProfile"/>
26
- <UserInvitation/>
26
+
27
27
  </div>
28
-
28
+ <UserInvitation/>
29
29
  <!-- <HeaderBar class="border flex flex-row h-10 fixed left-0 w-full justify justify-between top-0 z-50 bg-white dark:bg-gray-800"/> -->
30
30
 
31
31
  </div>
@@ -50,6 +50,7 @@ devServer: {
50
50
  'dayjs-nuxt',
51
51
  '@sidebase/nuxt-auth',
52
52
  'nuxt-primevue',
53
+ '@nuxtjs/apollo',
53
54
  // '@nuxtjs/pwa', //cannot turn on, will cause nuxt cant start
54
55
  // "nuxt-security", //temporary avoid nuxt-security cause cors
55
56
  '@vueuse/nuxt',
@@ -89,6 +90,13 @@ devServer: {
89
90
  ],
90
91
  defaultLocale: "en",
91
92
  },
93
+ apollo: {
94
+ clients: {
95
+ default: {
96
+ httpEndpoint: process.env.API_URL
97
+ }
98
+ },
99
+ },
92
100
  primevue: {
93
101
 
94
102
  options: {
@@ -16,4 +16,13 @@
16
16
  * author: Ks Tan
17
17
  */
18
18
  useNuxtApp().$event('SetTitle',t('home'))
19
+
20
+ onMounted(()=>{
21
+ if(!getUserStore()?.currency || !getUserStore()?.country){
22
+ const id=getUserStore().orgRecordId
23
+ onScreenEditDocument<Organization>('organization',id, async (actionName:FormCrudEvent,data:Organization)=>{
24
+
25
+ })
26
+ }
27
+ })
19
28
  </script>
@@ -1,19 +1,6 @@
1
1
  <template>
2
- <div class="frontpage-container">
3
- <client-only>
4
- <title>{{ getUserProfile()?.branchName }}</title>
5
- </client-only>
6
- <h1 class="border text-3xl text-center m-20 p-20">
7
- {{ t("createYourContentHere") }}
8
- </h1>
9
- </div>
2
+ <IndexPage></IndexPage>
10
3
  </template>
11
4
  <script lang="ts" setup>
12
- /**
13
- * This file was automatically generated by simpleapp generator during initialization. It is changable.
14
- * --remove-this-line-to-prevent-override--
15
- * last change 2024-02-22
16
- * author: Ks Tan
17
- */
18
- useNuxtApp().$event('SetTitle',t('home'))
5
+ import IndexPage from '../index.vue'
19
6
  </script>
@@ -2,7 +2,9 @@
2
2
  <div class="flex flex-col w-full">
3
3
  <TextTitle class="text-center p-2">{{ t("pickYourDatabase") }}</TextTitle>
4
4
  <div class="flex flex-col">
5
+
5
6
  <div class="p-4">
7
+ {{ t('welcome ') }} {{ getUserProfile()?.fullName }}
6
8
  <UserButtonCreateTenant></UserButtonCreateTenant>
7
9
  </div>
8
10
  <UserTenantPicker></UserTenantPicker>
@@ -13,7 +15,7 @@
13
15
  /**
14
16
  * This file was automatically generated by simpleapp generator.
15
17
  * --remove-this-line-to-prevent-override--
16
- * last change 2023-09-09
18
+ * last change 2023-04-17
17
19
  * author: Ks Tan
18
20
  */
19
21
  </script>
@@ -68,6 +68,7 @@ export class SimpleAppClient<
68
68
  return await this.docapi.runFindOne(id,this.axios)
69
69
  .then((res: AxiosResponse) => {
70
70
  // if(this.event){this.event('info:getById',res.data)}
71
+ this.data.value={} as TData
71
72
  Object.assign(this.data.value, res.data);
72
73
  return res;
73
74
  }).catch((res:any)=>{
@@ -100,6 +101,7 @@ export class SimpleAppClient<
100
101
  // summary:'Record create successfully',
101
102
  // status:NotificationStatus.success
102
103
  // })
104
+ this.data.value = {} as TData
103
105
  this.data.value = { ...res.data };
104
106
  holdScreenEnd()
105
107
  return res.data;