@things-factory/lite-menu 8.0.0-alpha.8 → 8.0.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (29) hide show
  1. package/client/actions/lite-menu.ts +10 -2
  2. package/client/pages/addon-menu-setting.ts +28 -13
  3. package/client/reducers/lite-menu.ts +5 -4
  4. package/dist-client/actions/lite-menu.js +1 -0
  5. package/dist-client/actions/lite-menu.js.map +1 -1
  6. package/dist-client/pages/addon-menu-setting.js +28 -13
  7. package/dist-client/pages/addon-menu-setting.js.map +1 -1
  8. package/dist-client/reducers/lite-menu.js +5 -4
  9. package/dist-client/reducers/lite-menu.js.map +1 -1
  10. package/dist-client/tsconfig.tsbuildinfo +1 -1
  11. package/dist-server/service/lite-menu/lite-menu-query.d.ts +2 -1
  12. package/dist-server/service/lite-menu/lite-menu-query.js +31 -14
  13. package/dist-server/service/lite-menu/lite-menu-query.js.map +1 -1
  14. package/dist-server/service/lite-menu/lite-menu-type.d.ts +5 -3
  15. package/dist-server/service/lite-menu/lite-menu-type.js +14 -7
  16. package/dist-server/service/lite-menu/lite-menu-type.js.map +1 -1
  17. package/dist-server/service/lite-menu/lite-menu.d.ts +4 -2
  18. package/dist-server/service/lite-menu/lite-menu.js +28 -6
  19. package/dist-server/service/lite-menu/lite-menu.js.map +1 -1
  20. package/dist-server/tsconfig.tsbuildinfo +1 -1
  21. package/package.json +22 -22
  22. package/server/service/lite-menu/lite-menu-query.ts +31 -17
  23. package/server/service/lite-menu/lite-menu-type.ts +11 -6
  24. package/server/service/lite-menu/lite-menu.ts +28 -6
  25. package/translations/en.json +1 -0
  26. package/translations/ja.json +1 -0
  27. package/translations/ko.json +1 -0
  28. package/translations/ms.json +1 -0
  29. package/translations/zh.json +1 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@things-factory/lite-menu",
3
- "version": "8.0.0-alpha.8",
3
+ "version": "8.0.0-beta.0",
4
4
  "main": "dist-server/index.js",
5
5
  "browser": "dist-client/index.js",
6
6
  "things-factory": true,
@@ -28,26 +28,26 @@
28
28
  },
29
29
  "dependencies": {
30
30
  "@material/web": "^2.0.0",
31
- "@operato/data-grist": "^8.0.0-alpha",
32
- "@operato/graphql": "^8.0.0-alpha",
33
- "@operato/grist-editor": "^8.0.0-alpha",
34
- "@operato/i18n": "^8.0.0-alpha",
35
- "@operato/input": "^8.0.0-alpha",
36
- "@operato/layout": "^8.0.0-alpha",
37
- "@operato/menu": "^8.0.0-alpha",
38
- "@operato/p13n": "^8.0.0-alpha",
39
- "@operato/popup": "^8.0.0-alpha",
40
- "@operato/shell": "^8.0.0-alpha",
41
- "@operato/styles": "^8.0.0-alpha",
42
- "@operato/utils": "^8.0.0-alpha",
43
- "@things-factory/apptool-base": "^8.0.0-alpha.8",
44
- "@things-factory/auth-base": "^8.0.0-alpha.8",
45
- "@things-factory/board-service": "^8.0.0-alpha.8",
46
- "@things-factory/board-ui": "^8.0.0-alpha.8",
47
- "@things-factory/more-base": "^8.0.0-alpha.8",
48
- "@things-factory/personalization": "^8.0.0-alpha.8",
49
- "@things-factory/setting-base": "^8.0.0-alpha.8",
50
- "@things-factory/utils": "^8.0.0-alpha.0"
31
+ "@operato/data-grist": "^8.0.0-beta",
32
+ "@operato/graphql": "^8.0.0-beta",
33
+ "@operato/grist-editor": "^8.0.0-beta",
34
+ "@operato/i18n": "^8.0.0-beta",
35
+ "@operato/input": "^8.0.0-beta",
36
+ "@operato/layout": "^8.0.0-beta",
37
+ "@operato/menu": "^8.0.0-beta",
38
+ "@operato/p13n": "^8.0.0-beta",
39
+ "@operato/popup": "^8.0.0-beta",
40
+ "@operato/shell": "^8.0.0-beta",
41
+ "@operato/styles": "^8.0.0-beta",
42
+ "@operato/utils": "^8.0.0-beta",
43
+ "@things-factory/apptool-base": "^8.0.0-beta.0",
44
+ "@things-factory/auth-base": "^8.0.0-beta.0",
45
+ "@things-factory/board-service": "^8.0.0-beta.0",
46
+ "@things-factory/board-ui": "^8.0.0-beta.0",
47
+ "@things-factory/more-base": "^8.0.0-beta.0",
48
+ "@things-factory/personalization": "^8.0.0-beta.0",
49
+ "@things-factory/setting-base": "^8.0.0-beta.0",
50
+ "@things-factory/utils": "^8.0.0-beta.0"
51
51
  },
52
- "gitHead": "0a9fb3ab431934982294b58c743d01b6f782a15f"
52
+ "gitHead": "add6fb8224b2cb19cbea47bed6a5ecb0424c9a28"
53
53
  }
@@ -1,8 +1,8 @@
1
- import { In } from 'typeorm'
1
+ import { In, Brackets } from 'typeorm'
2
2
  import { Arg, Args, Ctx, FieldResolver, Query, Resolver, Root } from 'type-graphql'
3
3
 
4
4
  import { Domain, getQueryBuilderFromListParams, getRepository, ListParam } from '@things-factory/shell'
5
- import { User, checkPermission } from '@things-factory/auth-base'
5
+ import { User, Role } from '@things-factory/auth-base'
6
6
  import { Board } from '@things-factory/board-service'
7
7
 
8
8
  import { LiteMenu } from './lite-menu'
@@ -43,25 +43,34 @@ export class LiteMenuQuery {
43
43
  @Args(type => ListParam) params: ListParam,
44
44
  @Ctx() context: ResolverContext
45
45
  ): Promise<LiteMenuList> {
46
- const { domain, user, unsafeIP, prohibitedPrivileges } = context.state
46
+ const { domain, user } = context.state
47
47
 
48
- const queryBuilder = getQueryBuilderFromListParams({
48
+ const me = await getRepository(User).findOne({
49
+ where: { id: user.id },
50
+ relations: ['roles']
51
+ })
52
+
53
+ const roles = me.roles
54
+ .filter(role => role.domainId === domain.id || (domain.parentId && role.domainId === domain.parentId))
55
+ .map(role => role.id)
56
+
57
+ const [items, total] = await getQueryBuilderFromListParams({
49
58
  repository: getRepository(LiteMenu),
50
59
  params,
51
60
  domain,
61
+ alias: 'menu',
52
62
  searchables: ['name', 'description']
53
63
  })
54
- var [items, total] = await queryBuilder.getManyAndCount()
55
-
56
- const filtered = []
64
+ .andWhere('menu.active = :active', { active: true })
65
+ .andWhere(
66
+ new Brackets(qb => {
67
+ qb.where('menu.role IN (:...roles)').orWhere('menu.role is null')
68
+ })
69
+ )
70
+ .setParameter('roles', roles)
71
+ .getManyAndCount()
57
72
 
58
- for (let item of items) {
59
- if (await checkPermission(item.privilege, user, domain, unsafeIP, prohibitedPrivileges)) {
60
- filtered.push(item)
61
- }
62
- }
63
-
64
- return { items: filtered, total: filtered.length }
73
+ return { items, total }
65
74
  }
66
75
 
67
76
  @FieldResolver(type => String)
@@ -79,18 +88,23 @@ export class LiteMenuQuery {
79
88
  }
80
89
  }
81
90
 
91
+ @FieldResolver(type => Role)
92
+ async role(@Root() liteMenu: LiteMenu) {
93
+ return liteMenu.roleId && (await getRepository(Role).findOneBy({ id: liteMenu.roleId }))
94
+ }
95
+
82
96
  @FieldResolver(type => Domain)
83
97
  async domain(@Root() liteMenu: LiteMenu) {
84
- return await getRepository(Domain).findOneBy({ id: liteMenu.domainId })
98
+ return liteMenu.domainId && (await getRepository(Domain).findOneBy({ id: liteMenu.domainId }))
85
99
  }
86
100
 
87
101
  @FieldResolver(type => User)
88
102
  async updater(@Root() liteMenu: LiteMenu): Promise<User> {
89
- return await getRepository(User).findOneBy({ id: liteMenu.updaterId })
103
+ return liteMenu.updaterId && (await getRepository(User).findOneBy({ id: liteMenu.updaterId }))
90
104
  }
91
105
 
92
106
  @FieldResolver(type => User)
93
107
  async creator(@Root() liteMenu: LiteMenu): Promise<User> {
94
- return await getRepository(User).findOneBy({ id: liteMenu.creatorId })
108
+ return liteMenu.creatorId && (await getRepository(User).findOneBy({ id: liteMenu.creatorId }))
95
109
  }
96
110
  }
@@ -1,7 +1,6 @@
1
1
  import { Field, InputType, Int, ObjectType } from 'type-graphql'
2
2
 
3
- import { ScalarObject } from '@things-factory/shell'
4
- import { Privilege, PrivilegeInput } from '@things-factory/auth-base'
3
+ import { ScalarObject, ObjectRef } from '@things-factory/shell'
5
4
 
6
5
  import { LiteMenu } from './lite-menu'
7
6
 
@@ -34,11 +33,14 @@ export class NewLiteMenu {
34
33
  @Field({ nullable: true })
35
34
  active?: boolean
36
35
 
37
- @Field(type => PrivilegeInput, { nullable: true })
38
- privilege?: PrivilegeInput
36
+ @Field(type => ObjectRef, { nullable: true })
37
+ role?: ObjectRef
39
38
 
40
39
  @Field(type => ScalarObject, { nullable: true })
41
40
  labels?: any // { [lng: string]: string }
41
+
42
+ @Field({ nullable: true })
43
+ help?: string
42
44
  }
43
45
 
44
46
  @InputType()
@@ -70,11 +72,14 @@ export class LiteMenuPatch {
70
72
  @Field({ nullable: true })
71
73
  active?: boolean
72
74
 
73
- @Field(type => PrivilegeInput, { nullable: true })
74
- privilege?: PrivilegeInput
75
+ @Field(type => ObjectRef, { nullable: true })
76
+ role?: ObjectRef
75
77
 
76
78
  @Field(type => ScalarObject, { nullable: true })
77
79
  labels?: any // { [lng: string]: string }
80
+
81
+ @Field({ nullable: true })
82
+ help?: string
78
83
  }
79
84
 
80
85
  @ObjectType()
@@ -10,9 +10,13 @@ import {
10
10
  UpdateDateColumn
11
11
  } from 'typeorm'
12
12
 
13
- import { PrivilegeObject, User } from '@things-factory/auth-base'
13
+ import { User, Role } from '@things-factory/auth-base'
14
14
  import { Board } from '@things-factory/board-service'
15
15
  import { Domain, ScalarObject } from '@things-factory/shell'
16
+ import { config } from '@things-factory/env'
17
+
18
+ const ORMCONFIG = config.get('ormconfig', {})
19
+ const DATABASE_TYPE = ORMCONFIG.type
16
20
 
17
21
  @Entity()
18
22
  @Index('ix_lite_menus_0', (liteMenu: LiteMenu) => [liteMenu.domain, liteMenu.name, liteMenu.type, liteMenu.appName], {
@@ -91,16 +95,34 @@ export class LiteMenu {
91
95
  @Field(type => Board, { nullable: true })
92
96
  board?: Board
93
97
 
94
- @Column({ type: 'simple-json', nullable: true })
95
- @Field(type => PrivilegeObject, { nullable: true })
96
- privilege?: PrivilegeObject
98
+ @ManyToOne(type => Role)
99
+ @Field(type => Role, { nullable: true })
100
+ role?: Role
101
+
102
+ @RelationId((liteMenu: LiteMenu) => liteMenu.role)
103
+ roleId?: string
97
104
 
98
105
  @Column('simple-json', { nullable: true })
99
- @Field(type => ScalarObject, { nullable: true })
106
+ @Field(type => ScalarObject, { nullable: true, description: 'Settings for multilingual titles' })
100
107
  labels?: any // { [lng: string]: string }
101
108
 
102
- @CreateDateColumn()
109
+ @Column({
110
+ nullable: true,
111
+ type:
112
+ DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb'
113
+ ? 'longtext'
114
+ : DATABASE_TYPE == 'oracle'
115
+ ? 'clob'
116
+ : DATABASE_TYPE == 'mssql'
117
+ ? 'nvarchar'
118
+ : 'varchar',
119
+ length: DATABASE_TYPE == 'mssql' ? 'MAX' : undefined
120
+ })
103
121
  @Field({ nullable: true })
122
+ help?: string
123
+
124
+ @CreateDateColumn()
125
+ @Field({ nullable: true, description: 'Settings for help contents' })
104
126
  createdAt?: Date
105
127
 
106
128
  @UpdateDateColumn()
@@ -3,6 +3,7 @@
3
3
  "button.reload": "reload",
4
4
  "button.save": "save",
5
5
  "field.app-name": "app name",
6
+ "field.help": "help",
6
7
  "field.i18n-label": "multi-lingual label",
7
8
  "field.icon": "icon",
8
9
  "field.parent-menu": "parent menu",
@@ -2,6 +2,7 @@
2
2
  "button.delete": "削除",
3
3
  "button.reload": "再照会",
4
4
  "button.save": "保存",
5
+ "field.help": "ヘルプ",
5
6
  "field.app-name": "アプリケーション",
6
7
  "field.i18n-label": "多言語ラベル",
7
8
  "field.icon": "イメージ",
@@ -3,6 +3,7 @@
3
3
  "button.reload": "재조회",
4
4
  "button.save": "저장",
5
5
  "field.app-name": "어플리케이션",
6
+ "field.help": "도움말",
6
7
  "field.i18n-label": "다국어 라벨",
7
8
  "field.icon": "이미지",
8
9
  "field.parent-menu": "부모메뉴",
@@ -3,6 +3,7 @@
3
3
  "button.reload": "muat semula",
4
4
  "button.save": "simpan",
5
5
  "field.app-name": "aplikasi",
6
+ "field.help": "bantuan",
6
7
  "field.i18n-label": "label pelbagai bahasa",
7
8
  "field.icon": "imej",
8
9
  "field.parent-menu": "menu induk",
@@ -3,6 +3,7 @@
3
3
  "button.reload": "重新加载",
4
4
  "button.save": "储存",
5
5
  "field.app-name": "应用名称",
6
+ "field.help": "帮助",
6
7
  "field.i18n-label": "多语言标签",
7
8
  "field.icon": "图标",
8
9
  "field.parent-menu": "上级菜单",