@things-factory/lite-menu 8.0.0-beta.9 → 8.0.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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@things-factory/lite-menu",
3
- "version": "8.0.0-beta.9",
3
+ "version": "8.0.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-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.9",
44
- "@things-factory/auth-base": "^8.0.0-beta.9",
45
- "@things-factory/board-service": "^8.0.0-beta.9",
46
- "@things-factory/board-ui": "^8.0.0-beta.9",
47
- "@things-factory/more-base": "^8.0.0-beta.9",
48
- "@things-factory/personalization": "^8.0.0-beta.9",
49
- "@things-factory/setting-base": "^8.0.0-beta.9",
50
- "@things-factory/utils": "^8.0.0-beta.4"
31
+ "@operato/data-grist": "^8.0.0",
32
+ "@operato/graphql": "^8.0.0",
33
+ "@operato/grist-editor": "^8.0.0",
34
+ "@operato/i18n": "^8.0.0",
35
+ "@operato/input": "^8.0.0",
36
+ "@operato/layout": "^8.0.0",
37
+ "@operato/menu": "^8.0.0",
38
+ "@operato/p13n": "^8.0.0",
39
+ "@operato/popup": "^8.0.0",
40
+ "@operato/shell": "^8.0.0",
41
+ "@operato/styles": "^8.0.0",
42
+ "@operato/utils": "^8.0.0",
43
+ "@things-factory/apptool-base": "^8.0.0",
44
+ "@things-factory/auth-base": "^8.0.0",
45
+ "@things-factory/board-service": "^8.0.0",
46
+ "@things-factory/board-ui": "^8.0.0",
47
+ "@things-factory/more-base": "^8.0.0",
48
+ "@things-factory/personalization": "^8.0.0",
49
+ "@things-factory/setting-base": "^8.0.0",
50
+ "@things-factory/utils": "^8.0.0"
51
51
  },
52
- "gitHead": "86b1dfa26292926a2d5447fdc23bfa5a9e983245"
52
+ "gitHead": "07ef27d272dd9a067a9648ac7013748510556a18"
53
53
  }
@@ -0,0 +1 @@
1
+ export * from './service'
@@ -0,0 +1,18 @@
1
+ /* EXPORT ENTITY TYPES */
2
+ export * from './lite-menu/lite-menu'
3
+
4
+ /* IMPORT ENTITIES AND RESOLVERS */
5
+ import { entities as LiteMenuEntities, resolvers as LiteMenuResolvers } from './lite-menu'
6
+
7
+ export const entities = [
8
+ /* ENTITIES */
9
+ ...LiteMenuEntities,
10
+ ]
11
+
12
+
13
+ export const schema = {
14
+ resolverClasses: [
15
+ /* RESOLVER CLASSES */
16
+ ...LiteMenuResolvers,
17
+ ]
18
+ }
@@ -0,0 +1,6 @@
1
+ import { LiteMenu } from './lite-menu'
2
+ import { LiteMenuQuery } from './lite-menu-query'
3
+ import { LiteMenuMutation } from './lite-menu-mutation'
4
+
5
+ export const entities = [LiteMenu]
6
+ export const resolvers = [LiteMenuQuery, LiteMenuMutation]
@@ -0,0 +1,54 @@
1
+ import { Arg, Ctx, Directive, Mutation, Resolver } from 'type-graphql'
2
+
3
+ import { getRepository } from '@things-factory/shell'
4
+
5
+ import { LiteMenu } from './lite-menu'
6
+ import { LiteMenuPatch, NewLiteMenu } from './lite-menu-type'
7
+
8
+ @Resolver(LiteMenu)
9
+ export class LiteMenuMutation {
10
+ @Directive('@privilege(category: "menu", privilege: "mutation", domainOwnerGranted: true)')
11
+ @Mutation(returns => LiteMenu, { description: 'To create new LiteMenu' })
12
+ async createLiteMenu(@Arg('liteMenu') liteMenu: NewLiteMenu, @Ctx() context: ResolverContext): Promise<LiteMenu> {
13
+ const { domain, user } = context.state
14
+
15
+ return await getRepository(LiteMenu).save({
16
+ domain,
17
+ creator: user,
18
+ updater: user,
19
+ ...liteMenu
20
+ })
21
+ }
22
+
23
+ @Directive('@privilege(category: "menu", privilege: "mutation", domainOwnerGranted: true)')
24
+ @Mutation(returns => LiteMenu, { description: 'To modify LiteMenu information' })
25
+ async updateLiteMenu(
26
+ @Arg('id') id: string,
27
+ @Arg('patch') patch: LiteMenuPatch,
28
+ @Ctx() context: ResolverContext
29
+ ): Promise<LiteMenu> {
30
+ const { domain, user } = context.state
31
+
32
+ const repository = getRepository(LiteMenu)
33
+ const liteMenu = await repository.findOne({
34
+ where: { domain: { id: domain.id }, id }
35
+ })
36
+
37
+ return await repository.save({
38
+ domain,
39
+ creater: user,
40
+ ...liteMenu,
41
+ ...patch,
42
+ updater: user
43
+ })
44
+ }
45
+
46
+ @Directive('@privilege(category: "menu", privilege: "mutation", domainOwnerGranted: true)')
47
+ @Mutation(returns => Boolean, { description: 'To delete LiteMenu' })
48
+ async deleteLiteMenu(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<boolean> {
49
+ const { domain } = context.state
50
+
51
+ await getRepository(LiteMenu).delete({ domain: { id: domain.id }, id })
52
+ return true
53
+ }
54
+ }
@@ -0,0 +1,114 @@
1
+ import { In, Brackets } from 'typeorm'
2
+ import { Arg, Args, Ctx, FieldResolver, Query, Resolver, Root } from 'type-graphql'
3
+
4
+ import { Domain, getQueryBuilderFromListParams, getRepository, ListParam } from '@things-factory/shell'
5
+ import { User, Role } from '@things-factory/auth-base'
6
+ import { Board } from '@things-factory/board-service'
7
+
8
+ import { LiteMenu } from './lite-menu'
9
+ import { LiteMenuList } from './lite-menu-type'
10
+
11
+ @Resolver(LiteMenu)
12
+ export class LiteMenuQuery {
13
+ @Query(returns => LiteMenu, { description: 'To fetch a LiteMenu' })
14
+ async liteMenu(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<LiteMenu> {
15
+ const { domain } = context.state
16
+ const repository = getRepository(LiteMenu)
17
+
18
+ var liteMenu: any = repository.findOne({
19
+ where: { domain: { id: In([domain.id, domain.parentId].filter(Boolean)) }, id },
20
+ relations: ['domain', 'creator', 'updater']
21
+ })
22
+
23
+ return liteMenu
24
+ }
25
+
26
+ @Query(returns => LiteMenuList, { description: 'To fetch multiple LiteMenus' })
27
+ async liteMenus(@Args(type => ListParam) params: ListParam, @Ctx() context: ResolverContext): Promise<LiteMenuList> {
28
+ const { domain } = context.state
29
+
30
+ const queryBuilder = getQueryBuilderFromListParams({
31
+ repository: getRepository(LiteMenu),
32
+ params,
33
+ domain,
34
+ searchables: ['name', 'description']
35
+ })
36
+ var [items, total] = await queryBuilder.getManyAndCount()
37
+
38
+ return { items, total }
39
+ }
40
+
41
+ @Query(returns => LiteMenuList, { description: 'To fetch my own LiteMenus' })
42
+ async myLiteMenus(
43
+ @Args(type => ListParam) params: ListParam,
44
+ @Ctx() context: ResolverContext
45
+ ): Promise<LiteMenuList> {
46
+ const { domain, user } = context.state
47
+
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 queryBuilder = getQueryBuilderFromListParams({
58
+ repository: getRepository(LiteMenu),
59
+ params,
60
+ domain,
61
+ alias: 'menu',
62
+ searchables: ['name', 'description']
63
+ }).andWhere('menu.active = :active', { active: true })
64
+
65
+ if (roles.length > 0) {
66
+ queryBuilder.andWhere(
67
+ new Brackets(qb => {
68
+ qb.where('menu.role IN (:...roles)', { roles }).orWhere('menu.role is null')
69
+ })
70
+ )
71
+ } else {
72
+ queryBuilder.andWhere('menu.role is null')
73
+ }
74
+
75
+ const [items, total] = await queryBuilder.getManyAndCount()
76
+
77
+ return { items, total }
78
+ }
79
+
80
+ @FieldResolver(type => String)
81
+ async label(@Root() liteMenu: LiteMenu, @Ctx() context: ResolverContext): Promise<String> {
82
+ const { lng } = context.state
83
+ const { labels, name } = liteMenu
84
+
85
+ return (lng && labels && labels[lng]) || name
86
+ }
87
+
88
+ @FieldResolver(type => Board)
89
+ async board(@Root() liteMenu: LiteMenu) {
90
+ if ((liteMenu.type === 'board' || liteMenu.type === 'interactive-board') && liteMenu.value) {
91
+ return await getRepository(Board).findOneBy({ id: liteMenu.value })
92
+ }
93
+ }
94
+
95
+ @FieldResolver(type => Role)
96
+ async role(@Root() liteMenu: LiteMenu) {
97
+ return liteMenu.roleId && (await getRepository(Role).findOneBy({ id: liteMenu.roleId }))
98
+ }
99
+
100
+ @FieldResolver(type => Domain)
101
+ async domain(@Root() liteMenu: LiteMenu) {
102
+ return liteMenu.domainId && (await getRepository(Domain).findOneBy({ id: liteMenu.domainId }))
103
+ }
104
+
105
+ @FieldResolver(type => User)
106
+ async updater(@Root() liteMenu: LiteMenu): Promise<User> {
107
+ return liteMenu.updaterId && (await getRepository(User).findOneBy({ id: liteMenu.updaterId }))
108
+ }
109
+
110
+ @FieldResolver(type => User)
111
+ async creator(@Root() liteMenu: LiteMenu): Promise<User> {
112
+ return liteMenu.creatorId && (await getRepository(User).findOneBy({ id: liteMenu.creatorId }))
113
+ }
114
+ }
@@ -0,0 +1,92 @@
1
+ import { Field, InputType, Int, ObjectType } from 'type-graphql'
2
+
3
+ import { ScalarObject, ObjectRef } from '@things-factory/shell'
4
+
5
+ import { LiteMenu } from './lite-menu'
6
+
7
+ @InputType()
8
+ export class NewLiteMenu {
9
+ @Field()
10
+ name: string
11
+
12
+ @Field({ nullable: true })
13
+ description?: string
14
+
15
+ @Field({ nullable: true })
16
+ appName?: string
17
+
18
+ @Field({ nullable: true })
19
+ parent?: string
20
+
21
+ @Field(type => Int, { nullable: true })
22
+ rank?: number
23
+
24
+ @Field({ nullable: true })
25
+ type?: string
26
+
27
+ @Field({ nullable: true })
28
+ icon?: string
29
+
30
+ @Field({ nullable: true })
31
+ value?: string
32
+
33
+ @Field({ nullable: true })
34
+ active?: boolean
35
+
36
+ @Field(type => ObjectRef, { nullable: true })
37
+ role?: ObjectRef
38
+
39
+ @Field(type => ScalarObject, { nullable: true })
40
+ labels?: any // { [lng: string]: string }
41
+
42
+ @Field({ nullable: true })
43
+ help?: string
44
+ }
45
+
46
+ @InputType()
47
+ export class LiteMenuPatch {
48
+ @Field({ nullable: true })
49
+ name: string
50
+
51
+ @Field({ nullable: true })
52
+ description?: string
53
+
54
+ @Field({ nullable: true })
55
+ appName?: string
56
+
57
+ @Field({ nullable: true })
58
+ parent?: string
59
+
60
+ @Field(type => Int, { nullable: true })
61
+ rank?: number
62
+
63
+ @Field({ nullable: true })
64
+ type?: string
65
+
66
+ @Field({ nullable: true })
67
+ icon?: string
68
+
69
+ @Field({ nullable: true })
70
+ value?: string
71
+
72
+ @Field({ nullable: true })
73
+ active?: boolean
74
+
75
+ @Field(type => ObjectRef, { nullable: true })
76
+ role?: ObjectRef
77
+
78
+ @Field(type => ScalarObject, { nullable: true })
79
+ labels?: any // { [lng: string]: string }
80
+
81
+ @Field({ nullable: true })
82
+ help?: string
83
+ }
84
+
85
+ @ObjectType()
86
+ export class LiteMenuList {
87
+ @Field(type => [LiteMenu])
88
+ items: LiteMenu[]
89
+
90
+ @Field(type => Int)
91
+ total: number
92
+ }
@@ -0,0 +1,149 @@
1
+ import { Field, ID, Int, ObjectType } from 'type-graphql'
2
+ import {
3
+ Column,
4
+ CreateDateColumn,
5
+ Entity,
6
+ Index,
7
+ ManyToOne,
8
+ PrimaryGeneratedColumn,
9
+ RelationId,
10
+ UpdateDateColumn
11
+ } from 'typeorm'
12
+
13
+ import { PrivilegeObject, User, Role } from '@things-factory/auth-base'
14
+ import { Board } from '@things-factory/board-service'
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
20
+
21
+ @Entity()
22
+ @Index('ix_lite_menus_0', (liteMenu: LiteMenu) => [liteMenu.domain, liteMenu.name, liteMenu.type, liteMenu.appName], {
23
+ unique: true
24
+ })
25
+ @Index('ix_lite_menus_1', (liteMenu: LiteMenu) => [liteMenu.domain, liteMenu.appName, liteMenu.parent, liteMenu.rank], {
26
+ unique: true
27
+ })
28
+ @ObjectType({ description: 'Entity for LiteMenu' })
29
+ export class LiteMenu {
30
+ @PrimaryGeneratedColumn('uuid')
31
+ @Field(type => ID)
32
+ readonly id: string
33
+
34
+ @ManyToOne(type => Domain)
35
+ @Field(type => Domain)
36
+ domain?: Domain
37
+
38
+ @RelationId((liteMenu: LiteMenu) => liteMenu.domain)
39
+ domainId?: string
40
+
41
+ @Column()
42
+ @Field()
43
+ name: string
44
+
45
+ @Column({
46
+ nullable: true
47
+ })
48
+ @Field({ nullable: true })
49
+ description?: string
50
+
51
+ @Column({
52
+ nullable: true,
53
+ default: ''
54
+ })
55
+ @Field({ nullable: true })
56
+ appName?: string
57
+
58
+ @Column({
59
+ nullable: true,
60
+ default: ''
61
+ })
62
+ @Field({ nullable: true })
63
+ parent?: string
64
+
65
+ @Column({
66
+ nullable: true
67
+ })
68
+ @Field(type => Int, { nullable: true })
69
+ rank?: number
70
+
71
+ @Column({
72
+ nullable: true
73
+ })
74
+ @Field({ nullable: true })
75
+ type?: string
76
+
77
+ @Column({
78
+ nullable: true
79
+ })
80
+ @Field({ nullable: true })
81
+ value?: string
82
+
83
+ @Column({
84
+ nullable: true
85
+ })
86
+ @Field({ nullable: true })
87
+ icon?: string
88
+
89
+ @Column({
90
+ nullable: true
91
+ })
92
+ @Field({ nullable: true })
93
+ active?: boolean
94
+
95
+ @Field(type => Board, { nullable: true })
96
+ board?: Board
97
+
98
+ @ManyToOne(type => Role)
99
+ @Field(type => Role, { nullable: true })
100
+ role?: Role
101
+
102
+ @RelationId((liteMenu: LiteMenu) => liteMenu.role)
103
+ roleId?: string
104
+
105
+ @Column('simple-json', { nullable: true })
106
+ @Field(type => ScalarObject, { nullable: true, description: 'Settings for multilingual titles' })
107
+ labels?: any // { [lng: string]: string }
108
+
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
+ })
121
+ @Field({ nullable: true })
122
+ help?: string
123
+
124
+ @CreateDateColumn()
125
+ @Field({ nullable: true, description: 'Settings for help contents' })
126
+ createdAt?: Date
127
+
128
+ @UpdateDateColumn()
129
+ @Field({ nullable: true })
130
+ updatedAt?: Date
131
+
132
+ @ManyToOne(type => User, {
133
+ nullable: true
134
+ })
135
+ @Field(type => User, { nullable: true })
136
+ creator?: User
137
+
138
+ @RelationId((liteMenu: LiteMenu) => liteMenu.creator)
139
+ creatorId?: string
140
+
141
+ @ManyToOne(type => User, {
142
+ nullable: true
143
+ })
144
+ @Field(type => User, { nullable: true })
145
+ updater?: User
146
+
147
+ @RelationId((liteMenu: LiteMenu) => liteMenu.updater)
148
+ updaterId?: string
149
+ }
@@ -0,0 +1,10 @@
1
+ {
2
+ "extends": "../../tsconfig-base.json",
3
+ "compilerOptions": {
4
+ "strict": false,
5
+ "module": "commonjs",
6
+ "outDir": "../dist-server",
7
+ "baseUrl": "./"
8
+ },
9
+ "include": ["./**/*"]
10
+ }