@things-factory/organization 6.0.0-zeta.26
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/CHANGELOG.md +8 -0
- package/assets/images/hatiolab-logo.png +0 -0
- package/client/bootstrap.ts +1 -0
- package/client/index.ts +0 -0
- package/client/pages/department/department-importer.ts +97 -0
- package/client/pages/department/department-list-page.ts +348 -0
- package/client/pages/employee/employee-importer.ts +97 -0
- package/client/pages/employee/employee-list-page.ts +348 -0
- package/client/pages/main.ts +25 -0
- package/client/route.ts +11 -0
- package/client/tsconfig.json +11 -0
- package/dist-client/actions/main.d.ts +1 -0
- package/dist-client/actions/main.js +2 -0
- package/dist-client/actions/main.js.map +1 -0
- package/dist-client/bootstrap.d.ts +1 -0
- package/dist-client/bootstrap.js +2 -0
- package/dist-client/bootstrap.js.map +1 -0
- package/dist-client/index.d.ts +0 -0
- package/dist-client/index.js +2 -0
- package/dist-client/index.js.map +1 -0
- package/dist-client/pages/department/department-importer.d.ts +22 -0
- package/dist-client/pages/department/department-importer.js +100 -0
- package/dist-client/pages/department/department-importer.js.map +1 -0
- package/dist-client/pages/department/department-list-page.d.ts +62 -0
- package/dist-client/pages/department/department-list-page.js +326 -0
- package/dist-client/pages/department/department-list-page.js.map +1 -0
- package/dist-client/pages/employee/employee-importer.d.ts +22 -0
- package/dist-client/pages/employee/employee-importer.js +100 -0
- package/dist-client/pages/employee/employee-importer.js.map +1 -0
- package/dist-client/pages/employee/employee-list-page.d.ts +62 -0
- package/dist-client/pages/employee/employee-list-page.js +326 -0
- package/dist-client/pages/employee/employee-list-page.js.map +1 -0
- package/dist-client/pages/main.d.ts +1 -0
- package/dist-client/pages/main.js +27 -0
- package/dist-client/pages/main.js.map +1 -0
- package/dist-client/reducers/main.d.ts +6 -0
- package/dist-client/reducers/main.js +14 -0
- package/dist-client/reducers/main.js.map +1 -0
- package/dist-client/route.d.ts +1 -0
- package/dist-client/route.js +11 -0
- package/dist-client/route.js.map +1 -0
- package/dist-client/tsconfig.tsbuildinfo +1 -0
- package/dist-server/controllers/index.js +1 -0
- package/dist-server/controllers/index.js.map +1 -0
- package/dist-server/index.js +7 -0
- package/dist-server/index.js.map +1 -0
- package/dist-server/middlewares/index.js +8 -0
- package/dist-server/middlewares/index.js.map +1 -0
- package/dist-server/migrations/index.js +12 -0
- package/dist-server/migrations/index.js.map +1 -0
- package/dist-server/routes.js +25 -0
- package/dist-server/routes.js.map +1 -0
- package/dist-server/service/department/department-history.js +156 -0
- package/dist-server/service/department/department-history.js.map +1 -0
- package/dist-server/service/department/department-mutation.js +168 -0
- package/dist-server/service/department/department-mutation.js.map +1 -0
- package/dist-server/service/department/department-query.js +97 -0
- package/dist-server/service/department/department-query.js.map +1 -0
- package/dist-server/service/department/department-type.js +90 -0
- package/dist-server/service/department/department-type.js.map +1 -0
- package/dist-server/service/department/department.js +145 -0
- package/dist-server/service/department/department.js.map +1 -0
- package/dist-server/service/department/event-subscriber.js +21 -0
- package/dist-server/service/department/event-subscriber.js.map +1 -0
- package/dist-server/service/department/index.js +12 -0
- package/dist-server/service/department/index.js.map +1 -0
- package/dist-server/service/employee/employee-history.js +157 -0
- package/dist-server/service/employee/employee-history.js.map +1 -0
- package/dist-server/service/employee/employee-mutation.js +168 -0
- package/dist-server/service/employee/employee-mutation.js.map +1 -0
- package/dist-server/service/employee/employee-query.js +97 -0
- package/dist-server/service/employee/employee-query.js.map +1 -0
- package/dist-server/service/employee/employee-type.js +90 -0
- package/dist-server/service/employee/employee-type.js.map +1 -0
- package/dist-server/service/employee/employee.js +148 -0
- package/dist-server/service/employee/employee.js.map +1 -0
- package/dist-server/service/employee/event-subscriber.js +21 -0
- package/dist-server/service/employee/event-subscriber.js.map +1 -0
- package/dist-server/service/employee/index.js +12 -0
- package/dist-server/service/employee/index.js.map +1 -0
- package/dist-server/service/index.js +28 -0
- package/dist-server/service/index.js.map +1 -0
- package/dist-server/tsconfig.tsbuildinfo +1 -0
- package/helps/organization/department.md +160 -0
- package/helps/organization/employee.md +160 -0
- package/package.json +35 -0
- package/server/controllers/index.ts +0 -0
- package/server/index.ts +4 -0
- package/server/middlewares/index.ts +3 -0
- package/server/migrations/index.ts +9 -0
- package/server/routes.ts +28 -0
- package/server/service/department/department-history.ts +137 -0
- package/server/service/department/department-mutation.ts +201 -0
- package/server/service/department/department-query.ts +62 -0
- package/server/service/department/department-type.ts +64 -0
- package/server/service/department/department.ts +124 -0
- package/server/service/department/event-subscriber.ts +17 -0
- package/server/service/department/index.ts +9 -0
- package/server/service/employee/employee-history.ts +137 -0
- package/server/service/employee/employee-mutation.ts +198 -0
- package/server/service/employee/employee-query.ts +62 -0
- package/server/service/employee/employee-type.ts +64 -0
- package/server/service/employee/employee.ts +126 -0
- package/server/service/employee/event-subscriber.ts +17 -0
- package/server/service/employee/index.ts +9 -0
- package/server/service/index.ts +27 -0
- package/server/tsconfig.json +10 -0
- package/things-factory.config.js +11 -0
- package/translations/en.json +1 -0
- package/translations/ko.json +1 -0
- package/translations/ms.json +1 -0
- package/translations/zh.json +1 -0
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import { Resolver, Mutation, Arg, Ctx, Directive } from 'type-graphql'
|
|
2
|
+
import { In } from 'typeorm'
|
|
3
|
+
|
|
4
|
+
import { createAttachment, deleteAttachmentsByRef } from '@things-factory/attachment-base'
|
|
5
|
+
|
|
6
|
+
import { Employee } from './employee'
|
|
7
|
+
import { NewEmployee, EmployeePatch } from './employee-type'
|
|
8
|
+
|
|
9
|
+
@Resolver(Employee)
|
|
10
|
+
export class EmployeeMutation {
|
|
11
|
+
@Directive('@transaction')
|
|
12
|
+
@Mutation(returns => Employee, { description: 'To create new Employee' })
|
|
13
|
+
async createEmployee(@Arg('employee') employee: NewEmployee, @Ctx() context: ResolverContext): Promise<Employee> {
|
|
14
|
+
const { domain, user, tx } = context.state
|
|
15
|
+
|
|
16
|
+
const result = await tx.getRepository(Employee).save({
|
|
17
|
+
...employee,
|
|
18
|
+
domain,
|
|
19
|
+
creator: user,
|
|
20
|
+
updater: user
|
|
21
|
+
})
|
|
22
|
+
|
|
23
|
+
if (employee.photo) {
|
|
24
|
+
await createAttachment(
|
|
25
|
+
null,
|
|
26
|
+
{
|
|
27
|
+
attachment: {
|
|
28
|
+
file: employee.photo,
|
|
29
|
+
refType: Employee.name,
|
|
30
|
+
refBy: result.id
|
|
31
|
+
}
|
|
32
|
+
},
|
|
33
|
+
context
|
|
34
|
+
)
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
return result
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
@Directive('@transaction')
|
|
41
|
+
@Mutation(returns => Employee, { description: 'To modify Employee information' })
|
|
42
|
+
async updateEmployee(
|
|
43
|
+
@Arg('id') id: string,
|
|
44
|
+
@Arg('patch') patch: EmployeePatch,
|
|
45
|
+
@Ctx() context: ResolverContext
|
|
46
|
+
): Promise<Employee> {
|
|
47
|
+
const { domain, user, tx } = context.state
|
|
48
|
+
|
|
49
|
+
const repository = tx.getRepository(Employee)
|
|
50
|
+
const employee = await repository.findOne({
|
|
51
|
+
where: { domain: { id: domain.id }, id }
|
|
52
|
+
})
|
|
53
|
+
|
|
54
|
+
const result = await repository.save({
|
|
55
|
+
...employee,
|
|
56
|
+
...patch,
|
|
57
|
+
updater: user
|
|
58
|
+
})
|
|
59
|
+
|
|
60
|
+
if (patch.photo) {
|
|
61
|
+
await deleteAttachmentsByRef(null, { refBys: [result.id] }, context)
|
|
62
|
+
await createAttachment(
|
|
63
|
+
null,
|
|
64
|
+
{
|
|
65
|
+
attachment: {
|
|
66
|
+
file: patch.photo,
|
|
67
|
+
refType: Employee.name,
|
|
68
|
+
refBy: result.id
|
|
69
|
+
}
|
|
70
|
+
},
|
|
71
|
+
context
|
|
72
|
+
)
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
return result
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
@Directive('@transaction')
|
|
79
|
+
@Mutation(returns => [Employee], { description: "To modify multiple Employees' information" })
|
|
80
|
+
async updateMultipleEmployee(
|
|
81
|
+
@Arg('patches', type => [EmployeePatch]) patches: EmployeePatch[],
|
|
82
|
+
@Ctx() context: ResolverContext
|
|
83
|
+
): Promise<Employee[]> {
|
|
84
|
+
const { domain, user, tx } = context.state
|
|
85
|
+
|
|
86
|
+
let results = []
|
|
87
|
+
const _createRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === '+')
|
|
88
|
+
const _updateRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === 'M')
|
|
89
|
+
const employeeRepo = tx.getRepository(Employee)
|
|
90
|
+
|
|
91
|
+
if (_createRecords.length > 0) {
|
|
92
|
+
for (let i = 0; i < _createRecords.length; i++) {
|
|
93
|
+
const newRecord = _createRecords[i]
|
|
94
|
+
|
|
95
|
+
const result = await employeeRepo.save({
|
|
96
|
+
...newRecord,
|
|
97
|
+
domain,
|
|
98
|
+
creator: user,
|
|
99
|
+
updater: user
|
|
100
|
+
})
|
|
101
|
+
|
|
102
|
+
if (newRecord.photo) {
|
|
103
|
+
await createAttachment(
|
|
104
|
+
null,
|
|
105
|
+
{
|
|
106
|
+
attachment: {
|
|
107
|
+
file: newRecord.photo,
|
|
108
|
+
refType: Employee.name,
|
|
109
|
+
refBy: result.id
|
|
110
|
+
}
|
|
111
|
+
},
|
|
112
|
+
context
|
|
113
|
+
)
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
results.push({ ...result, cuFlag: '+' })
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
if (_updateRecords.length > 0) {
|
|
121
|
+
for (let i = 0; i < _updateRecords.length; i++) {
|
|
122
|
+
const updateRecord = _updateRecords[i]
|
|
123
|
+
const employee = await employeeRepo.findOneBy({ id: updateRecord.id })
|
|
124
|
+
|
|
125
|
+
const result = await employeeRepo.save({
|
|
126
|
+
...employee,
|
|
127
|
+
...updateRecord,
|
|
128
|
+
updater: user
|
|
129
|
+
})
|
|
130
|
+
|
|
131
|
+
if (updateRecord.photo) {
|
|
132
|
+
await deleteAttachmentsByRef(null, { refBys: [result.id] }, context)
|
|
133
|
+
await createAttachment(
|
|
134
|
+
null,
|
|
135
|
+
{
|
|
136
|
+
attachment: {
|
|
137
|
+
file: updateRecord.photo,
|
|
138
|
+
refType: Employee.name,
|
|
139
|
+
refBy: result.id
|
|
140
|
+
}
|
|
141
|
+
},
|
|
142
|
+
context
|
|
143
|
+
)
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
results.push({ ...result, cuFlag: 'M' })
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
return results
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
@Directive('@transaction')
|
|
154
|
+
@Mutation(returns => Boolean, { description: 'To delete Employee' })
|
|
155
|
+
async deleteEmployee(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<boolean> {
|
|
156
|
+
const { domain, tx } = context.state
|
|
157
|
+
|
|
158
|
+
await tx.getRepository(Employee).delete({ domain: { id: domain.id }, id })
|
|
159
|
+
await deleteAttachmentsByRef(null, { refBys: [id] }, context)
|
|
160
|
+
|
|
161
|
+
return true
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
@Directive('@transaction')
|
|
165
|
+
@Mutation(returns => Boolean, { description: 'To delete multiple Employees' })
|
|
166
|
+
async deleteEmployees(
|
|
167
|
+
@Arg('ids', type => [String]) ids: string[],
|
|
168
|
+
@Ctx() context: ResolverContext
|
|
169
|
+
): Promise<boolean> {
|
|
170
|
+
const { domain, tx } = context.state
|
|
171
|
+
|
|
172
|
+
await tx.getRepository(Employee).delete({
|
|
173
|
+
domain: { id: domain.id },
|
|
174
|
+
id: In(ids)
|
|
175
|
+
})
|
|
176
|
+
|
|
177
|
+
await deleteAttachmentsByRef(null, { refBys: ids }, context)
|
|
178
|
+
|
|
179
|
+
return true
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
@Directive('@transaction')
|
|
183
|
+
@Mutation(returns => Boolean, { description: 'To import multiple Employees' })
|
|
184
|
+
async importEmployees(
|
|
185
|
+
@Arg('employees', type => [EmployeePatch]) employees: EmployeePatch[],
|
|
186
|
+
@Ctx() context: ResolverContext
|
|
187
|
+
): Promise<boolean> {
|
|
188
|
+
const { domain, tx } = context.state
|
|
189
|
+
|
|
190
|
+
await Promise.all(
|
|
191
|
+
employees.map(async (employee: EmployeePatch) => {
|
|
192
|
+
const createdEmployee: Employee = await tx.getRepository(Employee).save({ domain, ...employee })
|
|
193
|
+
})
|
|
194
|
+
)
|
|
195
|
+
|
|
196
|
+
return true
|
|
197
|
+
}
|
|
198
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { Resolver, Query, FieldResolver, Root, Args, Arg, Ctx, Directive } from 'type-graphql'
|
|
2
|
+
import { Attachment } from '@things-factory/attachment-base'
|
|
3
|
+
import { Domain, getQueryBuilderFromListParams, getRepository, ListParam } from '@things-factory/shell'
|
|
4
|
+
import { User } from '@things-factory/auth-base'
|
|
5
|
+
import { Employee } from './employee'
|
|
6
|
+
import { EmployeeList } from './employee-type'
|
|
7
|
+
|
|
8
|
+
@Resolver(Employee)
|
|
9
|
+
export class EmployeeQuery {
|
|
10
|
+
@Query(returns => Employee!, { nullable: true, description: 'To fetch a Employee' })
|
|
11
|
+
async employee(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<Employee> {
|
|
12
|
+
const { domain } = context.state
|
|
13
|
+
|
|
14
|
+
return await getRepository(Employee).findOne({
|
|
15
|
+
where: { domain: { id: domain.id }, id }
|
|
16
|
+
})
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
@Query(returns => EmployeeList, { description: 'To fetch multiple Employees' })
|
|
20
|
+
async employees(@Args() params: ListParam, @Ctx() context: ResolverContext): Promise<EmployeeList> {
|
|
21
|
+
const { domain } = context.state
|
|
22
|
+
|
|
23
|
+
const queryBuilder = getQueryBuilderFromListParams({
|
|
24
|
+
domain,
|
|
25
|
+
params,
|
|
26
|
+
repository: await getRepository(Employee),
|
|
27
|
+
searchables: ['name', 'description']
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
const [items, total] = await queryBuilder.getManyAndCount()
|
|
31
|
+
|
|
32
|
+
return { items, total }
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
@FieldResolver(type => String)
|
|
36
|
+
async photo(@Root() employee: Employee): Promise<string | undefined> {
|
|
37
|
+
const attachment: Attachment = await getRepository(Attachment).findOne({
|
|
38
|
+
where: {
|
|
39
|
+
domain: { id: employee.domainId },
|
|
40
|
+
refType: Employee.name,
|
|
41
|
+
refBy: employee.id
|
|
42
|
+
}
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
return attachment?.fullpath
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
@FieldResolver(type => Domain)
|
|
49
|
+
async domain(@Root() employee: Employee): Promise<Domain> {
|
|
50
|
+
return await getRepository(Domain).findOneBy({ id: employee.domainId })
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
@FieldResolver(type => User)
|
|
54
|
+
async updater(@Root() employee: Employee): Promise<User> {
|
|
55
|
+
return await getRepository(User).findOneBy({ id: employee.updaterId })
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
@FieldResolver(type => User)
|
|
59
|
+
async creator(@Root() employee: Employee): Promise<User> {
|
|
60
|
+
return await getRepository(User).findOneBy({ id: employee.creatorId })
|
|
61
|
+
}
|
|
62
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import type { FileUpload } from 'graphql-upload/GraphQLUpload.js'
|
|
2
|
+
import GraphQLUpload from 'graphql-upload/GraphQLUpload.js'
|
|
3
|
+
import { ObjectType, Field, InputType, Int, ID, registerEnumType } from 'type-graphql'
|
|
4
|
+
|
|
5
|
+
import { ObjectRef, ScalarObject } from '@things-factory/shell'
|
|
6
|
+
|
|
7
|
+
import { Employee, EmployeeStatus } from './employee'
|
|
8
|
+
|
|
9
|
+
@InputType()
|
|
10
|
+
export class NewEmployee {
|
|
11
|
+
@Field()
|
|
12
|
+
controlNo: string
|
|
13
|
+
|
|
14
|
+
@Field()
|
|
15
|
+
name: string
|
|
16
|
+
|
|
17
|
+
@Field({ nullable: true })
|
|
18
|
+
description?: string
|
|
19
|
+
|
|
20
|
+
@Field(type => EmployeeStatus, { nullable: true })
|
|
21
|
+
state?: EmployeeStatus
|
|
22
|
+
|
|
23
|
+
@Field({ nullable: true })
|
|
24
|
+
active?: boolean
|
|
25
|
+
|
|
26
|
+
@Field({ nullable: true })
|
|
27
|
+
extension?: string
|
|
28
|
+
|
|
29
|
+
@Field(type => GraphQLUpload, { nullable: true })
|
|
30
|
+
photo?: FileUpload
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
@InputType()
|
|
34
|
+
export class EmployeePatch {
|
|
35
|
+
@Field(type => ID, { nullable: true })
|
|
36
|
+
id?: string
|
|
37
|
+
|
|
38
|
+
@Field({ nullable: true })
|
|
39
|
+
name?: string
|
|
40
|
+
|
|
41
|
+
@Field({ nullable: true })
|
|
42
|
+
description?: string
|
|
43
|
+
|
|
44
|
+
@Field(type => EmployeeStatus, { nullable: true })
|
|
45
|
+
state?: EmployeeStatus
|
|
46
|
+
|
|
47
|
+
@Field({ nullable: true })
|
|
48
|
+
active?: boolean
|
|
49
|
+
|
|
50
|
+
@Field(type => GraphQLUpload, { nullable: true })
|
|
51
|
+
photo?: FileUpload
|
|
52
|
+
|
|
53
|
+
@Field({ nullable: true })
|
|
54
|
+
cuFlag?: string
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
@ObjectType()
|
|
58
|
+
export class EmployeeList {
|
|
59
|
+
@Field(type => [Employee])
|
|
60
|
+
items: Employee[]
|
|
61
|
+
|
|
62
|
+
@Field(type => Int)
|
|
63
|
+
total: number
|
|
64
|
+
}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import {
|
|
2
|
+
CreateDateColumn,
|
|
3
|
+
UpdateDateColumn,
|
|
4
|
+
DeleteDateColumn,
|
|
5
|
+
Entity,
|
|
6
|
+
Index,
|
|
7
|
+
Column,
|
|
8
|
+
OneToMany,
|
|
9
|
+
RelationId,
|
|
10
|
+
ManyToOne,
|
|
11
|
+
PrimaryGeneratedColumn,
|
|
12
|
+
VersionColumn
|
|
13
|
+
} from 'typeorm'
|
|
14
|
+
import { ObjectType, Field, Int, ID, registerEnumType } from 'type-graphql'
|
|
15
|
+
|
|
16
|
+
import { Domain } from '@things-factory/shell'
|
|
17
|
+
import { User } from '@things-factory/auth-base'
|
|
18
|
+
import { Department } from '../department/department'
|
|
19
|
+
|
|
20
|
+
export enum EmployeeStatus {
|
|
21
|
+
STATUS_A = 'STATUS_A',
|
|
22
|
+
STATUS_B = 'STATUS_B'
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
registerEnumType(EmployeeStatus, {
|
|
26
|
+
name: 'EmployeeStatus',
|
|
27
|
+
description: 'state enumeration of a employee'
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
@Entity()
|
|
31
|
+
@Index('ix_employee_0', (employee: Employee) => [employee.domain, employee.name, employee.deletedAt], { unique: true })
|
|
32
|
+
@Index('ix_employee_1', (employee: Employee) => [employee.domain, employee.controlNo, employee.deletedAt], {
|
|
33
|
+
unique: true
|
|
34
|
+
})
|
|
35
|
+
@ObjectType({ description: 'Entity for Employee' })
|
|
36
|
+
export class Employee {
|
|
37
|
+
@PrimaryGeneratedColumn('uuid')
|
|
38
|
+
@Field(type => ID)
|
|
39
|
+
readonly id: string
|
|
40
|
+
|
|
41
|
+
@VersionColumn()
|
|
42
|
+
@Field({ nullable: true })
|
|
43
|
+
version?: number = 1
|
|
44
|
+
|
|
45
|
+
@ManyToOne(type => Domain)
|
|
46
|
+
@Field({ nullable: true })
|
|
47
|
+
domain?: Domain
|
|
48
|
+
|
|
49
|
+
@RelationId((employee: Employee) => employee.domain)
|
|
50
|
+
domainId?: string
|
|
51
|
+
|
|
52
|
+
@Column()
|
|
53
|
+
@Field()
|
|
54
|
+
controlNo: string
|
|
55
|
+
|
|
56
|
+
@Column()
|
|
57
|
+
@Field()
|
|
58
|
+
name: string
|
|
59
|
+
|
|
60
|
+
@Column({ nullable: true })
|
|
61
|
+
@Field({ nullable: true })
|
|
62
|
+
description?: string
|
|
63
|
+
|
|
64
|
+
@ManyToOne(type => Employee, supervisor => supervisor.supervises, { nullable: true })
|
|
65
|
+
@Field({ nullable: true })
|
|
66
|
+
supervisor?: Employee
|
|
67
|
+
|
|
68
|
+
@RelationId((employee: Employee) => employee.supervisor)
|
|
69
|
+
supervisorId?: string
|
|
70
|
+
|
|
71
|
+
@OneToMany(type => Employee, employee => employee.supervisor)
|
|
72
|
+
@Field(type => [Employee])
|
|
73
|
+
supervises?: Employee[]
|
|
74
|
+
|
|
75
|
+
@OneToMany(type => Department, department => department.manager)
|
|
76
|
+
@Field(type => [Department])
|
|
77
|
+
manages?: Department[]
|
|
78
|
+
|
|
79
|
+
@Column({ nullable: true })
|
|
80
|
+
@Field({ nullable: true })
|
|
81
|
+
active?: boolean
|
|
82
|
+
|
|
83
|
+
@Column({ nullable: true })
|
|
84
|
+
@Field({ nullable: true })
|
|
85
|
+
state?: EmployeeStatus
|
|
86
|
+
|
|
87
|
+
@Column({ nullable: true })
|
|
88
|
+
@Field({ nullable: true })
|
|
89
|
+
extension?: string
|
|
90
|
+
|
|
91
|
+
@Field(type => String, { nullable: true })
|
|
92
|
+
photo?: string
|
|
93
|
+
|
|
94
|
+
@ManyToOne(type => User, { nullable: true })
|
|
95
|
+
@Field({ nullable: true })
|
|
96
|
+
user?: User
|
|
97
|
+
|
|
98
|
+
@RelationId((employee: Employee) => employee.user)
|
|
99
|
+
userId?: string
|
|
100
|
+
|
|
101
|
+
@CreateDateColumn()
|
|
102
|
+
@Field({ nullable: true })
|
|
103
|
+
createdAt?: Date
|
|
104
|
+
|
|
105
|
+
@UpdateDateColumn()
|
|
106
|
+
@Field({ nullable: true })
|
|
107
|
+
updatedAt?: Date
|
|
108
|
+
|
|
109
|
+
@DeleteDateColumn()
|
|
110
|
+
@Field({ nullable: true })
|
|
111
|
+
deletedAt?: Date
|
|
112
|
+
|
|
113
|
+
@ManyToOne(type => User, { nullable: true })
|
|
114
|
+
@Field({ nullable: true })
|
|
115
|
+
creator?: User
|
|
116
|
+
|
|
117
|
+
@RelationId((employee: Employee) => employee.creator)
|
|
118
|
+
creatorId?: string
|
|
119
|
+
|
|
120
|
+
@ManyToOne(type => User, { nullable: true })
|
|
121
|
+
@Field({ nullable: true })
|
|
122
|
+
updater?: User
|
|
123
|
+
|
|
124
|
+
@RelationId((employee: Employee) => employee.updater)
|
|
125
|
+
updaterId?: string
|
|
126
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { EventSubscriber } from 'typeorm'
|
|
2
|
+
|
|
3
|
+
import { HistoryEntitySubscriber } from '@anchan828/typeorm-history'
|
|
4
|
+
|
|
5
|
+
import { Employee } from './employee'
|
|
6
|
+
import { EmployeeHistory } from './employee-history'
|
|
7
|
+
|
|
8
|
+
@EventSubscriber()
|
|
9
|
+
export class EmployeeHistoryEntitySubscriber extends HistoryEntitySubscriber<Employee, EmployeeHistory> {
|
|
10
|
+
public get entity() {
|
|
11
|
+
return Employee
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
public get historyEntity() {
|
|
15
|
+
return EmployeeHistory
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Employee } from './employee'
|
|
2
|
+
import { EmployeeHistory } from './employee-history'
|
|
3
|
+
import { EmployeeQuery } from './employee-query'
|
|
4
|
+
import { EmployeeMutation } from './employee-mutation'
|
|
5
|
+
import { EmployeeHistoryEntitySubscriber } from './event-subscriber'
|
|
6
|
+
|
|
7
|
+
export const entities = [Employee, EmployeeHistory]
|
|
8
|
+
export const resolvers = [EmployeeQuery, EmployeeMutation]
|
|
9
|
+
export const subscribers = [EmployeeHistoryEntitySubscriber]
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/* EXPORT ENTITY TYPES */
|
|
2
|
+
export * from './department/department'
|
|
3
|
+
export * from './employee/employee'
|
|
4
|
+
|
|
5
|
+
/* IMPORT ENTITIES AND RESOLVERS */
|
|
6
|
+
import { entities as DepartmentEntities, resolvers as DepartmentResolvers, subscribers as DepartmentSubscribers } from './department'
|
|
7
|
+
import { entities as EmployeeEntities, resolvers as EmployeeResolvers, subscribers as EmployeeSubscribers } from './employee'
|
|
8
|
+
|
|
9
|
+
export const entities = [
|
|
10
|
+
/* ENTITIES */
|
|
11
|
+
...DepartmentEntities,
|
|
12
|
+
...EmployeeEntities,
|
|
13
|
+
]
|
|
14
|
+
|
|
15
|
+
export const subscribers = [
|
|
16
|
+
/* SUBSCRIBERS */
|
|
17
|
+
...DepartmentSubscribers,
|
|
18
|
+
...EmployeeSubscribers,
|
|
19
|
+
]
|
|
20
|
+
|
|
21
|
+
export const schema = {
|
|
22
|
+
resolverClasses: [
|
|
23
|
+
/* RESOLVER CLASSES */
|
|
24
|
+
...DepartmentResolvers,
|
|
25
|
+
...EmployeeResolvers,
|
|
26
|
+
]
|
|
27
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import route from './dist-client/route'
|
|
2
|
+
import bootstrap from './dist-client/bootstrap'
|
|
3
|
+
|
|
4
|
+
export default {
|
|
5
|
+
route,
|
|
6
|
+
routes: [
|
|
7
|
+
{ tagname: 'employee-list-page', page: 'employee-list' },
|
|
8
|
+
{ tagname: 'department-list-page', page: 'department-list' }
|
|
9
|
+
],
|
|
10
|
+
bootstrap
|
|
11
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{}
|