@dssp/project 0.0.2

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 (195) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/assets/images/hatiolab-logo.png +0 -0
  3. package/assets/images/o-mark.png +0 -0
  4. package/assets/images/x-mark.png +0 -0
  5. package/client/bootstrap.ts +0 -0
  6. package/client/index.ts +0 -0
  7. package/client/pages/checklist/checklist-importer.ts +96 -0
  8. package/client/pages/checklist/checklist-list-page.ts +355 -0
  9. package/client/pages/lib/waether.ts +159 -0
  10. package/client/pages/project/ox-progress-circle.ts +133 -0
  11. package/client/pages/project/project-create-popup.ts +148 -0
  12. package/client/pages/project/project-detail.ts +618 -0
  13. package/client/pages/project/project-list.ts +354 -0
  14. package/client/pages/project/project-plan-management.ts +437 -0
  15. package/client/pages/project/project-schedule-list.ts +280 -0
  16. package/client/pages/project/project-schedule.ts +248 -0
  17. package/client/pages/project/project-setting-list.ts +298 -0
  18. package/client/pages/project/project-update.ts +797 -0
  19. package/client/pages/resource/resource-importer.ts +96 -0
  20. package/client/pages/resource/resource-list-page.ts +355 -0
  21. package/client/pages/task/task-importer.ts +96 -0
  22. package/client/pages/task/task-list-page.ts +355 -0
  23. package/client/route.ts +39 -0
  24. package/client/tsconfig.json +11 -0
  25. package/dist-client/bootstrap.d.ts +0 -0
  26. package/dist-client/bootstrap.js +2 -0
  27. package/dist-client/bootstrap.js.map +1 -0
  28. package/dist-client/index.d.ts +0 -0
  29. package/dist-client/index.js +2 -0
  30. package/dist-client/index.js.map +1 -0
  31. package/dist-client/pages/checklist/checklist-importer.d.ts +9 -0
  32. package/dist-client/pages/checklist/checklist-importer.js +100 -0
  33. package/dist-client/pages/checklist/checklist-importer.js.map +1 -0
  34. package/dist-client/pages/checklist/checklist-list-page.d.ts +62 -0
  35. package/dist-client/pages/checklist/checklist-list-page.js +331 -0
  36. package/dist-client/pages/checklist/checklist-list-page.js.map +1 -0
  37. package/dist-client/pages/lib/waether.d.ts +6 -0
  38. package/dist-client/pages/lib/waether.js +152 -0
  39. package/dist-client/pages/lib/waether.js.map +1 -0
  40. package/dist-client/pages/project/ox-progress-circle.d.ts +41 -0
  41. package/dist-client/pages/project/ox-progress-circle.js +182 -0
  42. package/dist-client/pages/project/ox-progress-circle.js.map +1 -0
  43. package/dist-client/pages/project/project-create-popup.d.ts +14 -0
  44. package/dist-client/pages/project/project-create-popup.js +153 -0
  45. package/dist-client/pages/project/project-create-popup.js.map +1 -0
  46. package/dist-client/pages/project/project-detail.d.ts +35 -0
  47. package/dist-client/pages/project/project-detail.js +617 -0
  48. package/dist-client/pages/project/project-detail.js.map +1 -0
  49. package/dist-client/pages/project/project-list.d.ts +88 -0
  50. package/dist-client/pages/project/project-list.js +303 -0
  51. package/dist-client/pages/project/project-list.js.map +1 -0
  52. package/dist-client/pages/project/project-plan-management.d.ts +27 -0
  53. package/dist-client/pages/project/project-plan-management.js +438 -0
  54. package/dist-client/pages/project/project-plan-management.js.map +1 -0
  55. package/dist-client/pages/project/project-schedule-list.d.ts +18 -0
  56. package/dist-client/pages/project/project-schedule-list.js +292 -0
  57. package/dist-client/pages/project/project-schedule-list.js.map +1 -0
  58. package/dist-client/pages/project/project-schedule.d.ts +23 -0
  59. package/dist-client/pages/project/project-schedule.js +256 -0
  60. package/dist-client/pages/project/project-schedule.js.map +1 -0
  61. package/dist-client/pages/project/project-setting-list.d.ts +23 -0
  62. package/dist-client/pages/project/project-setting-list.js +307 -0
  63. package/dist-client/pages/project/project-setting-list.js.map +1 -0
  64. package/dist-client/pages/project/project-update.d.ts +24 -0
  65. package/dist-client/pages/project/project-update.js +797 -0
  66. package/dist-client/pages/project/project-update.js.map +1 -0
  67. package/dist-client/pages/resource/resource-importer.d.ts +9 -0
  68. package/dist-client/pages/resource/resource-importer.js +100 -0
  69. package/dist-client/pages/resource/resource-importer.js.map +1 -0
  70. package/dist-client/pages/resource/resource-list-page.d.ts +62 -0
  71. package/dist-client/pages/resource/resource-list-page.js +331 -0
  72. package/dist-client/pages/resource/resource-list-page.js.map +1 -0
  73. package/dist-client/pages/task/task-importer.d.ts +9 -0
  74. package/dist-client/pages/task/task-importer.js +100 -0
  75. package/dist-client/pages/task/task-importer.js.map +1 -0
  76. package/dist-client/pages/task/task-list-page.d.ts +62 -0
  77. package/dist-client/pages/task/task-list-page.js +331 -0
  78. package/dist-client/pages/task/task-list-page.js.map +1 -0
  79. package/dist-client/route.d.ts +1 -0
  80. package/dist-client/route.js +32 -0
  81. package/dist-client/route.js.map +1 -0
  82. package/dist-client/tsconfig.tsbuildinfo +1 -0
  83. package/dist-server/controllers/index.js +1 -0
  84. package/dist-server/controllers/index.js.map +1 -0
  85. package/dist-server/controllers/project-to-excel.js +30 -0
  86. package/dist-server/controllers/project-to-excel.js.map +1 -0
  87. package/dist-server/index.js +6 -0
  88. package/dist-server/index.js.map +1 -0
  89. package/dist-server/middlewares/index.js +8 -0
  90. package/dist-server/middlewares/index.js.map +1 -0
  91. package/dist-server/routes.js +105 -0
  92. package/dist-server/routes.js.map +1 -0
  93. package/dist-server/service/check-item/check-item-mutation.js +129 -0
  94. package/dist-server/service/check-item/check-item-mutation.js.map +1 -0
  95. package/dist-server/service/check-item/check-item-query.js +86 -0
  96. package/dist-server/service/check-item/check-item-query.js.map +1 -0
  97. package/dist-server/service/check-item/check-item-type.js +69 -0
  98. package/dist-server/service/check-item/check-item-type.js.map +1 -0
  99. package/dist-server/service/check-item/check-item.js +84 -0
  100. package/dist-server/service/check-item/check-item.js.map +1 -0
  101. package/dist-server/service/check-item/index.js +9 -0
  102. package/dist-server/service/check-item/index.js.map +1 -0
  103. package/dist-server/service/checklist/checklist-mutation.js +129 -0
  104. package/dist-server/service/checklist/checklist-mutation.js.map +1 -0
  105. package/dist-server/service/checklist/checklist-query.js +86 -0
  106. package/dist-server/service/checklist/checklist-query.js.map +1 -0
  107. package/dist-server/service/checklist/checklist-type.js +69 -0
  108. package/dist-server/service/checklist/checklist-type.js.map +1 -0
  109. package/dist-server/service/checklist/checklist.js +120 -0
  110. package/dist-server/service/checklist/checklist.js.map +1 -0
  111. package/dist-server/service/checklist/index.js +9 -0
  112. package/dist-server/service/checklist/index.js.map +1 -0
  113. package/dist-server/service/index.js +36 -0
  114. package/dist-server/service/index.js.map +1 -0
  115. package/dist-server/service/project/index.js +11 -0
  116. package/dist-server/service/project/index.js.map +1 -0
  117. package/dist-server/service/project/project-mutation.js +190 -0
  118. package/dist-server/service/project/project-mutation.js.map +1 -0
  119. package/dist-server/service/project/project-query.js +143 -0
  120. package/dist-server/service/project/project-query.js.map +1 -0
  121. package/dist-server/service/project/project-type.js +106 -0
  122. package/dist-server/service/project/project-type.js.map +1 -0
  123. package/dist-server/service/project/project.js +146 -0
  124. package/dist-server/service/project/project.js.map +1 -0
  125. package/dist-server/service/resource/index.js +9 -0
  126. package/dist-server/service/resource/index.js.map +1 -0
  127. package/dist-server/service/resource/resource-mutation.js +129 -0
  128. package/dist-server/service/resource/resource-mutation.js.map +1 -0
  129. package/dist-server/service/resource/resource-query.js +86 -0
  130. package/dist-server/service/resource/resource-query.js.map +1 -0
  131. package/dist-server/service/resource/resource-type.js +69 -0
  132. package/dist-server/service/resource/resource-type.js.map +1 -0
  133. package/dist-server/service/resource/resource.js +62 -0
  134. package/dist-server/service/resource/resource.js.map +1 -0
  135. package/dist-server/service/task/index.js +9 -0
  136. package/dist-server/service/task/index.js.map +1 -0
  137. package/dist-server/service/task/task-mutation.js +129 -0
  138. package/dist-server/service/task/task-mutation.js.map +1 -0
  139. package/dist-server/service/task/task-query.js +86 -0
  140. package/dist-server/service/task/task-query.js.map +1 -0
  141. package/dist-server/service/task/task-type.js +69 -0
  142. package/dist-server/service/task/task-type.js.map +1 -0
  143. package/dist-server/service/task/task.js +106 -0
  144. package/dist-server/service/task/task.js.map +1 -0
  145. package/dist-server/tsconfig.tsbuildinfo +1 -0
  146. package/helps/management/alarm.md +160 -0
  147. package/helps/management/alter-video.md +160 -0
  148. package/helps/management/cctv.md +160 -0
  149. package/helps/management/device.md +160 -0
  150. package/helps/management/parking.md +160 -0
  151. package/helps/management/site.md +160 -0
  152. package/helps/management/sun-pnl.md +160 -0
  153. package/helps/project/checklist.md +160 -0
  154. package/helps/project/project.md +160 -0
  155. package/helps/project/resource.md +160 -0
  156. package/helps/project/task.md +160 -0
  157. package/package.json +38 -0
  158. package/server/controllers/index.ts +0 -0
  159. package/server/controllers/project-to-excel.ts +40 -0
  160. package/server/index.ts +3 -0
  161. package/server/middlewares/index.ts +3 -0
  162. package/server/routes.ts +108 -0
  163. package/server/service/check-item/check-item-mutation.ts +142 -0
  164. package/server/service/check-item/check-item-query.ts +56 -0
  165. package/server/service/check-item/check-item-type.ts +49 -0
  166. package/server/service/check-item/check-item.ts +74 -0
  167. package/server/service/check-item/index.ts +6 -0
  168. package/server/service/checklist/checklist-mutation.ts +142 -0
  169. package/server/service/checklist/checklist-query.ts +56 -0
  170. package/server/service/checklist/checklist-type.ts +49 -0
  171. package/server/service/checklist/checklist.ts +105 -0
  172. package/server/service/checklist/index.ts +6 -0
  173. package/server/service/index.ts +35 -0
  174. package/server/service/project/index.ts +8 -0
  175. package/server/service/project/project-mutation.ts +201 -0
  176. package/server/service/project/project-query.ts +103 -0
  177. package/server/service/project/project-type.ts +71 -0
  178. package/server/service/project/project.ts +131 -0
  179. package/server/service/resource/index.ts +6 -0
  180. package/server/service/resource/resource-mutation.ts +139 -0
  181. package/server/service/resource/resource-query.ts +56 -0
  182. package/server/service/resource/resource-type.ts +49 -0
  183. package/server/service/resource/resource.ts +56 -0
  184. package/server/service/task/index.ts +6 -0
  185. package/server/service/task/task-mutation.ts +136 -0
  186. package/server/service/task/task-query.ts +56 -0
  187. package/server/service/task/task-type.ts +49 -0
  188. package/server/service/task/task.ts +97 -0
  189. package/server/tsconfig.json +10 -0
  190. package/things-factory.config.js +20 -0
  191. package/translations/en.json +1 -0
  192. package/translations/ja.json +1 -0
  193. package/translations/ko.json +9 -0
  194. package/translations/ms.json +1 -0
  195. package/translations/zh.json +1 -0
@@ -0,0 +1,56 @@
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 { Resource } from './resource'
6
+ import { ResourceList } from './resource-type'
7
+
8
+ @Resolver(Resource)
9
+ export class ResourceQuery {
10
+ @Query(returns => Resource!, { nullable: true, description: 'To fetch a Resource' })
11
+ async resource(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<Resource> {
12
+ const { domain } = context.state
13
+
14
+ return await getRepository(Resource).findOne({
15
+ where: { id }
16
+ })
17
+ }
18
+
19
+ @Query(returns => ResourceList, { description: 'To fetch multiple Resources' })
20
+ async resources(@Args() params: ListParam, @Ctx() context: ResolverContext): Promise<ResourceList> {
21
+ const { domain } = context.state
22
+
23
+ const queryBuilder = getQueryBuilderFromListParams({
24
+ domain,
25
+ params,
26
+ repository: await getRepository(Resource),
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 thumbnail(@Root() resource: Resource): Promise<string | undefined> {
37
+ const attachment: Attachment = await getRepository(Attachment).findOne({
38
+ where: {
39
+ refType: Resource.name,
40
+ refBy: resource.id
41
+ }
42
+ })
43
+
44
+ return attachment?.fullpath
45
+ }
46
+
47
+ @FieldResolver(type => User)
48
+ async updater(@Root() resource: Resource): Promise<User> {
49
+ return await getRepository(User).findOneBy({ id: resource.updaterId })
50
+ }
51
+
52
+ @FieldResolver(type => User)
53
+ async creator(@Root() resource: Resource): Promise<User> {
54
+ return await getRepository(User).findOneBy({ id: resource.creatorId })
55
+ }
56
+ }
@@ -0,0 +1,49 @@
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 { Resource } from './resource'
8
+
9
+ @InputType()
10
+ export class NewResource {
11
+ @Field()
12
+ name: string
13
+
14
+ @Field({ nullable: true })
15
+ description?: string
16
+
17
+ @Field({ nullable: true })
18
+ active?: boolean
19
+
20
+ @Field({ nullable: true })
21
+ params?: string
22
+ }
23
+
24
+ @InputType()
25
+ export class ResourcePatch {
26
+ @Field(type => ID, { nullable: true })
27
+ id?: string
28
+
29
+ @Field({ nullable: true })
30
+ name?: string
31
+
32
+ @Field({ nullable: true })
33
+ description?: string
34
+
35
+ @Field({ nullable: true })
36
+ active?: boolean
37
+
38
+ @Field({ nullable: true })
39
+ cuFlag?: string
40
+ }
41
+
42
+ @ObjectType()
43
+ export class ResourceList {
44
+ @Field(type => [Resource])
45
+ items: Resource[]
46
+
47
+ @Field(type => Int)
48
+ total: number
49
+ }
@@ -0,0 +1,56 @@
1
+ import {
2
+ CreateDateColumn,
3
+ UpdateDateColumn,
4
+ DeleteDateColumn,
5
+ Entity,
6
+ Index,
7
+ Column,
8
+ RelationId,
9
+ ManyToOne,
10
+ PrimaryGeneratedColumn
11
+ } from 'typeorm'
12
+ import { ObjectType, Field, ID } from 'type-graphql'
13
+
14
+ import { User } from '@things-factory/auth-base'
15
+
16
+ @Entity()
17
+ @Index('ix_resource_0', (resource: Resource) => [resource.name], {
18
+ unique: true,
19
+ where: '"deleted_at" IS NULL'
20
+ })
21
+ @ObjectType({ description: '리소스 관리 (작업자)' })
22
+ export class Resource {
23
+ @PrimaryGeneratedColumn('uuid')
24
+ @Field(type => ID)
25
+ readonly id: string
26
+
27
+ @Column({ nullable: true, comment: '직군' })
28
+ @Field({ nullable: true })
29
+ name?: string
30
+
31
+ @CreateDateColumn()
32
+ @Field({ nullable: true })
33
+ createdAt?: Date
34
+
35
+ @UpdateDateColumn()
36
+ @Field({ nullable: true })
37
+ updatedAt?: Date
38
+
39
+ @DeleteDateColumn()
40
+ @Field({ nullable: true })
41
+ deletedAt?: Date
42
+
43
+ @ManyToOne(type => User, { nullable: true })
44
+ @Field(type => User, { nullable: true })
45
+ creator?: User
46
+
47
+ @RelationId((resource: Resource) => resource.creator)
48
+ creatorId?: string
49
+
50
+ @ManyToOne(type => User, { nullable: true })
51
+ @Field(type => User, { nullable: true })
52
+ updater?: User
53
+
54
+ @RelationId((resource: Resource) => resource.updater)
55
+ updaterId?: string
56
+ }
@@ -0,0 +1,6 @@
1
+ import { Task } from './task'
2
+ import { TaskQuery } from './task-query'
3
+ import { TaskMutation } from './task-mutation'
4
+
5
+ export const entities = [Task]
6
+ export const resolvers = [TaskQuery, TaskMutation]
@@ -0,0 +1,136 @@
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 { Task } from './task'
7
+ import { NewTask, TaskPatch } from './task-type'
8
+
9
+ @Resolver(Task)
10
+ export class TaskMutation {
11
+ @Directive('@transaction')
12
+ @Mutation(returns => Task, { description: 'To create new Task' })
13
+ async createTask(@Arg('task') task: NewTask, @Ctx() context: ResolverContext): Promise<Task> {
14
+ const { domain, user, tx } = context.state
15
+
16
+ const result = await tx.getRepository(Task).save({
17
+ ...task,
18
+ domain,
19
+ creator: user,
20
+ updater: user
21
+ })
22
+
23
+ return result
24
+ }
25
+
26
+ @Directive('@transaction')
27
+ @Mutation(returns => Task, { description: 'To modify Task information' })
28
+ async updateTask(
29
+ @Arg('id') id: string,
30
+ @Arg('patch') patch: TaskPatch,
31
+ @Ctx() context: ResolverContext
32
+ ): Promise<Task> {
33
+ const { domain, user, tx } = context.state
34
+
35
+ const repository = tx.getRepository(Task)
36
+ const task = await repository.findOne({
37
+ where: { id }
38
+ })
39
+
40
+ const result = await repository.save({
41
+ ...task,
42
+ ...patch,
43
+ updater: user
44
+ })
45
+
46
+ return result
47
+ }
48
+
49
+ @Directive('@transaction')
50
+ @Mutation(returns => [Task], { description: "To modify multiple Tasks' information" })
51
+ async updateMultipleTask(
52
+ @Arg('patches', type => [TaskPatch]) patches: TaskPatch[],
53
+ @Ctx() context: ResolverContext
54
+ ): Promise<Task[]> {
55
+ const { domain, user, tx } = context.state
56
+
57
+ let results = []
58
+ const _createRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === '+')
59
+ const _updateRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === 'M')
60
+ const taskRepo = tx.getRepository(Task)
61
+
62
+ if (_createRecords.length > 0) {
63
+ for (let i = 0; i < _createRecords.length; i++) {
64
+ const newRecord = _createRecords[i]
65
+
66
+ const result = await taskRepo.save({
67
+ ...newRecord,
68
+ domain,
69
+ creator: user,
70
+ updater: user
71
+ })
72
+
73
+ results.push({ ...result, cuFlag: '+' })
74
+ }
75
+ }
76
+
77
+ if (_updateRecords.length > 0) {
78
+ for (let i = 0; i < _updateRecords.length; i++) {
79
+ const updateRecord = _updateRecords[i]
80
+ const task = await taskRepo.findOneBy({ id: updateRecord.id })
81
+
82
+ const result = await taskRepo.save({
83
+ ...task,
84
+ ...updateRecord,
85
+ updater: user
86
+ })
87
+
88
+ results.push({ ...result, cuFlag: 'M' })
89
+ }
90
+ }
91
+
92
+ return results
93
+ }
94
+
95
+ @Directive('@transaction')
96
+ @Mutation(returns => Boolean, { description: 'To delete Task' })
97
+ async deleteTask(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<boolean> {
98
+ const { domain, tx } = context.state
99
+
100
+ await tx.getRepository(Task).delete({ id })
101
+ await deleteAttachmentsByRef(null, { refBys: [id] }, context)
102
+
103
+ return true
104
+ }
105
+
106
+ @Directive('@transaction')
107
+ @Mutation(returns => Boolean, { description: 'To delete multiple Tasks' })
108
+ async deleteTasks(@Arg('ids', type => [String]) ids: string[], @Ctx() context: ResolverContext): Promise<boolean> {
109
+ const { domain, tx } = context.state
110
+
111
+ await tx.getRepository(Task).delete({
112
+ id: In(ids)
113
+ })
114
+
115
+ await deleteAttachmentsByRef(null, { refBys: ids }, context)
116
+
117
+ return true
118
+ }
119
+
120
+ @Directive('@transaction')
121
+ @Mutation(returns => Boolean, { description: 'To import multiple Tasks' })
122
+ async importTasks(
123
+ @Arg('tasks', type => [TaskPatch]) tasks: TaskPatch[],
124
+ @Ctx() context: ResolverContext
125
+ ): Promise<boolean> {
126
+ const { domain, tx } = context.state
127
+
128
+ await Promise.all(
129
+ tasks.map(async (task: TaskPatch) => {
130
+ const createdTask: Task = await tx.getRepository(Task).save({ domain, ...task })
131
+ })
132
+ )
133
+
134
+ return true
135
+ }
136
+ }
@@ -0,0 +1,56 @@
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 { Task } from './task'
6
+ import { TaskList } from './task-type'
7
+
8
+ @Resolver(Task)
9
+ export class TaskQuery {
10
+ @Query(returns => Task!, { nullable: true, description: 'To fetch a Task' })
11
+ async task(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<Task> {
12
+ const { domain } = context.state
13
+
14
+ return await getRepository(Task).findOne({
15
+ where: { id }
16
+ })
17
+ }
18
+
19
+ @Query(returns => TaskList, { description: 'To fetch multiple Tasks' })
20
+ async tasks(@Args() params: ListParam, @Ctx() context: ResolverContext): Promise<TaskList> {
21
+ const { domain } = context.state
22
+
23
+ const queryBuilder = getQueryBuilderFromListParams({
24
+ domain,
25
+ params,
26
+ repository: await getRepository(Task),
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 thumbnail(@Root() task: Task): Promise<string | undefined> {
37
+ const attachment: Attachment = await getRepository(Attachment).findOne({
38
+ where: {
39
+ refType: Task.name,
40
+ refBy: task.id
41
+ }
42
+ })
43
+
44
+ return attachment?.fullpath
45
+ }
46
+
47
+ @FieldResolver(type => User)
48
+ async updater(@Root() task: Task): Promise<User> {
49
+ return await getRepository(User).findOneBy({ id: task.updaterId })
50
+ }
51
+
52
+ @FieldResolver(type => User)
53
+ async creator(@Root() task: Task): Promise<User> {
54
+ return await getRepository(User).findOneBy({ id: task.creatorId })
55
+ }
56
+ }
@@ -0,0 +1,49 @@
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 { Task } from './task'
8
+
9
+ @InputType()
10
+ export class NewTask {
11
+ @Field()
12
+ name: string
13
+
14
+ @Field({ nullable: true })
15
+ description?: string
16
+
17
+ @Field({ nullable: true })
18
+ active?: boolean
19
+
20
+ @Field({ nullable: true })
21
+ params?: string
22
+ }
23
+
24
+ @InputType()
25
+ export class TaskPatch {
26
+ @Field(type => ID, { nullable: true })
27
+ id?: string
28
+
29
+ @Field({ nullable: true })
30
+ name?: string
31
+
32
+ @Field({ nullable: true })
33
+ description?: string
34
+
35
+ @Field({ nullable: true })
36
+ active?: boolean
37
+
38
+ @Field({ nullable: true })
39
+ cuFlag?: string
40
+ }
41
+
42
+ @ObjectType()
43
+ export class TaskList {
44
+ @Field(type => [Task])
45
+ items: Task[]
46
+
47
+ @Field(type => Int)
48
+ total: number
49
+ }
@@ -0,0 +1,97 @@
1
+ import {
2
+ CreateDateColumn,
3
+ UpdateDateColumn,
4
+ DeleteDateColumn,
5
+ Entity,
6
+ Index,
7
+ JoinTable,
8
+ Column,
9
+ RelationId,
10
+ ManyToMany,
11
+ ManyToOne,
12
+ OneToMany,
13
+ PrimaryGeneratedColumn
14
+ } from 'typeorm'
15
+ import { ObjectType, Field, ID, registerEnumType } from 'type-graphql'
16
+
17
+ import { User } from '@things-factory/auth-base'
18
+ import { Project } from '../project/project'
19
+ import { Checklist } from '../checklist/checklist'
20
+
21
+ export enum TaskType {
22
+ GROUP = 'GROUP',
23
+ TASK = 'TASK'
24
+ }
25
+
26
+ registerEnumType(TaskType, {
27
+ name: 'TaskType',
28
+ description: '작업 타입'
29
+ })
30
+
31
+ @Entity()
32
+ @Index('ix_task_0', (task: Task) => [task.project], { where: '"deleted_at" IS NULL' })
33
+ @ObjectType({ description: '공정표 작업 정보' })
34
+ export class Task {
35
+ @PrimaryGeneratedColumn('uuid')
36
+ @Field(type => ID)
37
+ readonly id: string
38
+
39
+ @Column({ nullable: true, comment: '작업 명' })
40
+ @Field({ nullable: true })
41
+ name?: string
42
+
43
+ @Column({ nullable: true, comment: '테스크 타입 (group: 공종, task: 세부 공종)' })
44
+ @Field({ nullable: true })
45
+ type?: TaskType
46
+
47
+ @Column({ nullable: true, comment: '테스크에 그룹(부모)가 있을 시 taskId' })
48
+ @Field({ nullable: true })
49
+ parentTaskId?: string
50
+
51
+ @Column({ nullable: true, comment: '시작일' })
52
+ @Field({ nullable: true })
53
+ startDate?: Date
54
+
55
+ @Column({ nullable: true, comment: '종료일' })
56
+ @Field({ nullable: true })
57
+ endDate?: Date
58
+
59
+ // 프로젝트 정보 (상위 테이블 참조)
60
+ @Field(() => Project)
61
+ @ManyToOne(() => Project, project => project.tasks)
62
+ project?: Project
63
+
64
+ @RelationId((task: Task) => task.project)
65
+ projectId?: string
66
+
67
+ // 체크리스트 정보 (하위 테이블 참조)
68
+ @Field(() => Checklist)
69
+ @OneToMany(() => Checklist, checklist => checklist.task)
70
+ checklists?: Checklist[]
71
+
72
+ @CreateDateColumn()
73
+ @Field({ nullable: true })
74
+ createdAt?: Date
75
+
76
+ @UpdateDateColumn()
77
+ @Field({ nullable: true })
78
+ updatedAt?: Date
79
+
80
+ @DeleteDateColumn()
81
+ @Field({ nullable: true })
82
+ deletedAt?: Date
83
+
84
+ @ManyToOne(type => User, { nullable: true })
85
+ @Field(type => User, { nullable: true })
86
+ creator?: User
87
+
88
+ @RelationId((task: Task) => task.creator)
89
+ creatorId?: string
90
+
91
+ @ManyToOne(type => User, { nullable: true })
92
+ @Field(type => User, { nullable: true })
93
+ updater?: User
94
+
95
+ @RelationId((task: Task) => task.updater)
96
+ updaterId?: string
97
+ }
@@ -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
+ }
@@ -0,0 +1,20 @@
1
+ import route from './dist-client/route'
2
+
3
+ export default {
4
+ route,
5
+ routes: [
6
+ 'project-list', // 진행중 리스트
7
+ 'project-detail', // 진행중 프로젝트 상세 정보
8
+ 'project-completed-list', // 완료 리스트
9
+ 'project-schedule-list', // 스케줄(공정표) 리스트
10
+ 'project-schedule', // 스케줄(공정표)
11
+ 'project-setting-list', // 셋팅 리스트
12
+ 'project-update', // 프로젝트 정보 관리
13
+ 'project-plan-management', // 프로젝트 도면 관리
14
+ ].map(page => {
15
+ return {
16
+ page,
17
+ tagname: page
18
+ }
19
+ })
20
+ }
@@ -0,0 +1 @@
1
+ {}
@@ -0,0 +1 @@
1
+ {}
@@ -0,0 +1,9 @@
1
+ {
2
+ "title.project_create": "프로젝트 생성",
3
+ "title.project_update": "프로젝트 수정",
4
+ "title.project_setting_list": "프로젝트 설정 리스트",
5
+
6
+ "label.project_name": "프로젝트 이름",
7
+
8
+ "button.project_create": "프로젝트 생성"
9
+ }
@@ -0,0 +1 @@
1
+ {}
@@ -0,0 +1 @@
1
+ {}