@things-factory/dataset 6.0.25 → 6.0.28

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 (193) hide show
  1. package/README.md +26 -11
  2. package/assets/images/data-collect.png +0 -0
  3. package/assets/images/ooc.png +0 -0
  4. package/assets/images/oos.png +0 -0
  5. package/client/{bootstrap.js → bootstrap.ts} +5 -1
  6. package/client/components/data-collect-activity-view.ts +100 -0
  7. package/client/components/{data-entry-form.js → data-entry-form.ts} +30 -33
  8. package/client/components/ooc-resolve-activity-view.ts +174 -0
  9. package/client/components/ooc-review-activity-view.ts +153 -0
  10. package/client/pages/data-archive/{data-archive-list-page.js → data-archive-list-page.ts} +67 -53
  11. package/client/pages/data-archive/{data-archive-request-popup.js → data-archive-request-popup.ts} +41 -39
  12. package/client/pages/data-entry/{data-entry-list-page.js → data-entry-list-page.ts} +41 -38
  13. package/client/pages/data-key-set/{data-key-item-list.js → data-key-item-list.ts} +31 -39
  14. package/client/pages/data-key-set/data-key-set-importer.ts +95 -0
  15. package/client/pages/data-key-set/{data-key-set-list-page.js → data-key-set-list-page.ts} +54 -35
  16. package/client/pages/data-ooc/{data-ooc-list-page.js → data-ooc-list-page.ts} +56 -36
  17. package/client/pages/data-ooc/data-ooc-view-page.ts +115 -0
  18. package/client/pages/data-ooc/data-ooc-view.ts +124 -0
  19. package/client/pages/data-report/{data-report-embed-page.js → data-report-embed-page.ts} +25 -34
  20. package/client/pages/data-report/{data-report-list-page.js → data-report-list-page.ts} +49 -43
  21. package/client/pages/data-report/{data-report-samples-page.js → data-report-samples-page.ts} +29 -43
  22. package/client/pages/data-report/{jasper-report-oocs-page.js → jasper-report-oocs-page.ts} +22 -34
  23. package/client/pages/data-report/{jasper-report-samples-crosstab-page.js → jasper-report-samples-crosstab-page.ts} +22 -34
  24. package/client/pages/data-report/{jasper-report-samples-page.js → jasper-report-samples-page.ts} +22 -34
  25. package/client/pages/data-sample/{data-sample-list-page.js → data-sample-list-page.ts} +49 -36
  26. package/client/pages/data-sample/{data-sample-search-page.js → data-sample-search-page.ts} +53 -39
  27. package/client/pages/data-sample/{data-sample-view.js → data-sample-view.ts} +29 -33
  28. package/client/pages/data-sensor/{data-sensor-list-page.js → data-sensor-list-page.ts} +41 -35
  29. package/client/pages/data-set/{data-item-list.js → data-item-list.ts} +31 -37
  30. package/client/pages/data-set/data-set-importer.ts +96 -0
  31. package/client/pages/data-set/{data-set-list-page.js → data-set-list-page.ts} +173 -40
  32. package/client/{route.js → route.ts} +5 -1
  33. package/client/tsconfig.json +11 -0
  34. package/config/config.development.js +30 -30
  35. package/config/config.production.js +31 -31
  36. package/dist-client/bootstrap.d.ts +5 -0
  37. package/dist-client/bootstrap.js +16 -0
  38. package/dist-client/bootstrap.js.map +1 -0
  39. package/dist-client/components/data-collect-activity-view.d.ts +19 -0
  40. package/dist-client/components/data-collect-activity-view.js +101 -0
  41. package/dist-client/components/data-collect-activity-view.js.map +1 -0
  42. package/dist-client/components/data-entry-form.d.ts +15 -0
  43. package/dist-client/components/data-entry-form.js +83 -0
  44. package/dist-client/components/data-entry-form.js.map +1 -0
  45. package/dist-client/components/data-ooc-activity-view.d.ts +1 -0
  46. package/dist-client/components/data-ooc-activity-view.js +154 -0
  47. package/dist-client/components/data-ooc-activity-view.js.map +1 -0
  48. package/dist-client/components/ooc-resolve-activity-view.d.ts +1 -0
  49. package/dist-client/components/ooc-resolve-activity-view.js +175 -0
  50. package/dist-client/components/ooc-resolve-activity-view.js.map +1 -0
  51. package/dist-client/components/ooc-review-activity-view.d.ts +1 -0
  52. package/dist-client/components/ooc-review-activity-view.js +155 -0
  53. package/dist-client/components/ooc-review-activity-view.js.map +1 -0
  54. package/dist-client/index.d.ts +1 -0
  55. package/dist-client/index.js +2 -0
  56. package/dist-client/index.js.map +1 -0
  57. package/dist-client/pages/data-archive/data-archive-list-page.d.ts +71 -0
  58. package/dist-client/pages/data-archive/data-archive-list-page.js +287 -0
  59. package/dist-client/pages/data-archive/data-archive-list-page.js.map +1 -0
  60. package/dist-client/pages/data-archive/data-archive-request-popup.d.ts +1 -0
  61. package/dist-client/pages/data-archive/data-archive-request-popup.js +161 -0
  62. package/dist-client/pages/data-archive/data-archive-request-popup.js.map +1 -0
  63. package/dist-client/pages/data-entry/data-entry-list-page.d.ts +36 -0
  64. package/dist-client/pages/data-entry/data-entry-list-page.js +383 -0
  65. package/dist-client/pages/data-entry/data-entry-list-page.js.map +1 -0
  66. package/dist-client/pages/data-key-set/data-key-item-list.d.ts +18 -0
  67. package/dist-client/pages/data-key-set/data-key-item-list.js +188 -0
  68. package/dist-client/pages/data-key-set/data-key-item-list.js.map +1 -0
  69. package/dist-client/pages/data-key-set/data-key-set-importer.d.ts +9 -0
  70. package/dist-client/pages/data-key-set/data-key-set-importer.js +100 -0
  71. package/dist-client/pages/data-key-set/data-key-set-importer.js.map +1 -0
  72. package/dist-client/pages/data-key-set/data-key-set-list-page.d.ts +60 -0
  73. package/dist-client/pages/data-key-set/data-key-set-list-page.js +450 -0
  74. package/dist-client/pages/data-key-set/data-key-set-list-page.js.map +1 -0
  75. package/dist-client/pages/data-ooc/data-ooc-list-page.d.ts +58 -0
  76. package/dist-client/pages/data-ooc/data-ooc-list-page.js +479 -0
  77. package/dist-client/pages/data-ooc/data-ooc-list-page.js.map +1 -0
  78. package/dist-client/pages/data-ooc/data-ooc-view-page.d.ts +18 -0
  79. package/dist-client/pages/data-ooc/data-ooc-view-page.js +114 -0
  80. package/dist-client/pages/data-ooc/data-ooc-view-page.js.map +1 -0
  81. package/dist-client/pages/data-ooc/data-ooc-view.d.ts +15 -0
  82. package/dist-client/pages/data-ooc/data-ooc-view.js +130 -0
  83. package/dist-client/pages/data-ooc/data-ooc-view.js.map +1 -0
  84. package/dist-client/pages/data-report/data-report-embed-page.d.ts +36 -0
  85. package/dist-client/pages/data-report/data-report-embed-page.js +101 -0
  86. package/dist-client/pages/data-report/data-report-embed-page.js.map +1 -0
  87. package/dist-client/pages/data-report/data-report-list-page.d.ts +36 -0
  88. package/dist-client/pages/data-report/data-report-list-page.js +431 -0
  89. package/dist-client/pages/data-report/data-report-list-page.js.map +1 -0
  90. package/dist-client/pages/data-report/data-report-samples-page.d.ts +32 -0
  91. package/dist-client/pages/data-report/data-report-samples-page.js +164 -0
  92. package/dist-client/pages/data-report/data-report-samples-page.js.map +1 -0
  93. package/dist-client/pages/data-report/jasper-report-oocs-page.d.ts +2 -0
  94. package/dist-client/pages/data-report/jasper-report-oocs-page.js +101 -0
  95. package/dist-client/pages/data-report/jasper-report-oocs-page.js.map +1 -0
  96. package/dist-client/pages/data-report/jasper-report-samples-crosstab-page.d.ts +2 -0
  97. package/dist-client/pages/data-report/jasper-report-samples-crosstab-page.js +101 -0
  98. package/dist-client/pages/data-report/jasper-report-samples-crosstab-page.js.map +1 -0
  99. package/dist-client/pages/data-report/jasper-report-samples-page.d.ts +2 -0
  100. package/dist-client/pages/data-report/jasper-report-samples-page.js +101 -0
  101. package/dist-client/pages/data-report/jasper-report-samples-page.js.map +1 -0
  102. package/dist-client/pages/data-sample/data-sample-list-page.d.ts +58 -0
  103. package/dist-client/pages/data-sample/data-sample-list-page.js +412 -0
  104. package/dist-client/pages/data-sample/data-sample-list-page.js.map +1 -0
  105. package/dist-client/pages/data-sample/data-sample-search-page.d.ts +63 -0
  106. package/dist-client/pages/data-sample/data-sample-search-page.js +413 -0
  107. package/dist-client/pages/data-sample/data-sample-search-page.js.map +1 -0
  108. package/dist-client/pages/data-sample/data-sample-view.d.ts +1 -0
  109. package/dist-client/pages/data-sample/data-sample-view.js +109 -0
  110. package/dist-client/pages/data-sample/data-sample-view.js.map +1 -0
  111. package/dist-client/pages/data-sensor/data-sensor-list-page.d.ts +49 -0
  112. package/dist-client/pages/data-sensor/data-sensor-list-page.js +419 -0
  113. package/dist-client/pages/data-sensor/data-sensor-list-page.js.map +1 -0
  114. package/dist-client/pages/data-set/data-item-list.d.ts +1 -0
  115. package/dist-client/pages/data-set/data-item-list.js +267 -0
  116. package/dist-client/pages/data-set/data-item-list.js.map +1 -0
  117. package/dist-client/pages/data-set/data-set-importer.d.ts +10 -0
  118. package/dist-client/pages/data-set/data-set-importer.js +103 -0
  119. package/dist-client/pages/data-set/data-set-importer.js.map +1 -0
  120. package/dist-client/pages/data-set/data-set-list-page.d.ts +73 -0
  121. package/dist-client/pages/data-set/data-set-list-page.js +861 -0
  122. package/dist-client/pages/data-set/data-set-list-page.js.map +1 -0
  123. package/dist-client/route.d.ts +1 -0
  124. package/dist-client/route.js +50 -0
  125. package/dist-client/route.js.map +1 -0
  126. package/dist-client/tsconfig.tsbuildinfo +1 -0
  127. package/dist-server/controllers/activity-template/activity-data-collect.js +82 -0
  128. package/dist-server/controllers/activity-template/activity-data-collect.js.map +1 -0
  129. package/dist-server/controllers/activity-template/activity-ooc-resolve.js +100 -0
  130. package/dist-server/controllers/activity-template/activity-ooc-resolve.js.map +1 -0
  131. package/dist-server/controllers/activity-template/activity-ooc-review.js +107 -0
  132. package/dist-server/controllers/activity-template/activity-ooc-review.js.map +1 -0
  133. package/dist-server/controllers/activity-template/activity-ooc.js +59 -0
  134. package/dist-server/controllers/activity-template/activity-ooc.js.map +1 -0
  135. package/dist-server/controllers/create-data-sample.js +53 -14
  136. package/dist-server/controllers/create-data-sample.js.map +1 -1
  137. package/dist-server/controllers/data-use-case.js +1 -1
  138. package/dist-server/controllers/data-use-case.js.map +1 -1
  139. package/dist-server/controllers/index.js +7 -0
  140. package/dist-server/controllers/index.js.map +1 -1
  141. package/dist-server/index.js +1 -2
  142. package/dist-server/index.js.map +1 -1
  143. package/dist-server/routes.js +47 -3
  144. package/dist-server/routes.js.map +1 -1
  145. package/dist-server/service/data-ooc/data-ooc-query.js +22 -2
  146. package/dist-server/service/data-ooc/data-ooc-query.js.map +1 -1
  147. package/dist-server/service/data-ooc/data-ooc.js +26 -0
  148. package/dist-server/service/data-ooc/data-ooc.js.map +1 -1
  149. package/dist-server/service/data-set/data-set-mutation.js +88 -0
  150. package/dist-server/service/data-set/data-set-mutation.js.map +1 -1
  151. package/dist-server/service/data-set/data-set-query.js +38 -4
  152. package/dist-server/service/data-set/data-set-query.js.map +1 -1
  153. package/dist-server/service/data-set/data-set-type.js +16 -0
  154. package/dist-server/service/data-set/data-set-type.js.map +1 -1
  155. package/dist-server/service/data-set/data-set.js +55 -3
  156. package/dist-server/service/data-set/data-set.js.map +1 -1
  157. package/dist-server/service/data-set-history/data-set-history-query.js +4 -3
  158. package/dist-server/service/data-set-history/data-set-history-query.js.map +1 -1
  159. package/dist-server/tsconfig.tsbuildinfo +1 -1
  160. package/helps/dataset/data-ooc.md +5 -4
  161. package/package.json +17 -12
  162. package/server/controllers/activity-template/activity-data-collect.ts +84 -0
  163. package/server/controllers/activity-template/activity-ooc-resolve.ts +114 -0
  164. package/server/controllers/activity-template/activity-ooc-review.ts +118 -0
  165. package/server/controllers/create-data-sample.ts +61 -21
  166. package/server/controllers/data-use-case.ts +1 -1
  167. package/server/controllers/index.ts +11 -0
  168. package/server/index.ts +1 -2
  169. package/server/routes.ts +62 -5
  170. package/server/service/data-ooc/data-ooc-query.ts +12 -2
  171. package/server/service/data-ooc/data-ooc.ts +23 -0
  172. package/server/service/data-set/data-set-mutation.ts +99 -0
  173. package/server/service/data-set/data-set-query.ts +39 -5
  174. package/server/service/data-set/data-set-type.ts +14 -0
  175. package/server/service/data-set/data-set.ts +43 -2
  176. package/server/service/data-set-history/data-set-history-query.ts +4 -3
  177. package/server/tsconfig.json +10 -0
  178. package/things-factory.config.js +6 -2
  179. package/translations/en.json +3 -1
  180. package/translations/ko.json +3 -1
  181. package/translations/ms.json +3 -0
  182. package/translations/zh.json +3 -0
  183. package/client/pages/data-key-set/data-key-set-importer.js +0 -105
  184. package/client/pages/data-ooc/data-ooc-view.js +0 -188
  185. package/client/pages/data-set/data-set-importer.js +0 -103
  186. package/server/middlewares/index.ts +0 -3
  187. package/server/migrations/index.ts +0 -9
  188. package/tsconfig.json +0 -9
  189. /package/assets/{data-report.jpg → images/data-report.jpg} +0 -0
  190. /package/assets/{data-samples.jpg → images/data-samples.jpg} +0 -0
  191. /package/assets/{diagram.jpg → images/dataset-diagram.jpg} +0 -0
  192. /package/assets/{glue-table-indices.png → images/glue-table-indices-for-dataset.png} +0 -0
  193. /package/client/{index.js → index.ts} +0 -0
@@ -85,6 +85,18 @@ export class DataOoc {
85
85
  @Field({ nullable: true })
86
86
  state?: DataOocStatus
87
87
 
88
+ @Column({
89
+ nullable: true,
90
+ type:
91
+ DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb'
92
+ ? 'longtext'
93
+ : DATABASE_TYPE == 'oracle'
94
+ ? 'clob'
95
+ : 'varchar'
96
+ })
97
+ @Field({ nullable: true })
98
+ correctiveInstruction?: string
99
+
88
100
  @Column({
89
101
  nullable: true,
90
102
  type:
@@ -178,6 +190,10 @@ export class DataOoc {
178
190
  @Field({ nullable: true })
179
191
  collectedAt?: Date
180
192
 
193
+ @Column({ nullable: true })
194
+ @Field({ nullable: true })
195
+ reviewedAt?: Date
196
+
181
197
  @Column({ nullable: true })
182
198
  @Field({ nullable: true })
183
199
  correctedAt?: Date
@@ -190,6 +206,13 @@ export class DataOoc {
190
206
  @Field({ nullable: true })
191
207
  updatedAt?: Date
192
208
 
209
+ @ManyToOne(type => User, { nullable: true })
210
+ @Field({ nullable: true })
211
+ reviewer?: User
212
+
213
+ @RelationId((dataOoc: DataOoc) => dataOoc.reviewer)
214
+ reviewerId?: string
215
+
193
216
  @ManyToOne(type => User, { nullable: true })
194
217
  @Field({ nullable: true })
195
218
  corrector?: User
@@ -2,6 +2,7 @@ import { Arg, Ctx, Directive, Mutation, Resolver } from 'type-graphql'
2
2
  import { In } from 'typeorm'
3
3
 
4
4
  import { createAttachment, deleteAttachmentsByRef } from '@things-factory/attachment-base'
5
+ import { registerSchedule, unregisterSchedule } from '@things-factory/scheduler-client'
5
6
 
6
7
  import { DataSet } from './data-set'
7
8
  import { DataSetPatch, NewDataSet } from './data-set-type'
@@ -129,6 +130,7 @@ export class DataSetMutation {
129
130
 
130
131
  await tx.getRepository(DataSet).delete({ domain: { id: domain.id }, id })
131
132
  await deleteAttachmentsByRef(null, { refBys: [`report-${id}`] }, context)
133
+
132
134
  return true
133
135
  }
134
136
 
@@ -148,6 +150,103 @@ export class DataSetMutation {
148
150
  return true
149
151
  }
150
152
 
153
+ @Directive('@transaction')
154
+ @Mutation(returns => DataSet, { description: 'To start data collection schedule for the given dataset' })
155
+ async startDataCollectionSchedule(
156
+ @Arg('dataSetId') dataSetId: string,
157
+ @Ctx() context: ResolverContext
158
+ ): Promise<DataSet> {
159
+ const { domain, tx } = context.state
160
+
161
+ var repository = tx.getRepository(DataSet)
162
+ var dataSet = await repository.findOne({
163
+ where: { domain: { id: domain.id }, id: dataSetId }
164
+ })
165
+
166
+ if (!dataSet) {
167
+ throw new Error(
168
+ context.t('error.data-set not found', {
169
+ dataSet: dataSetId
170
+ })
171
+ )
172
+ }
173
+
174
+ try {
175
+ var handle = await registerSchedule({
176
+ name: dataSet.name,
177
+ client: {
178
+ application: 'operato-dataset',
179
+ group: `${domain.id}`,
180
+ key: dataSet.id
181
+ },
182
+ type: 'cron',
183
+ schedule: dataSet.schedule,
184
+ task: {
185
+ type: 'rest',
186
+ connection: {
187
+ host: 'http://localhost:3000/callback-schedule-for-dataset',
188
+ headers: {
189
+ 'Content-Type': 'application/json',
190
+ accept: '*/*'
191
+ }
192
+ },
193
+ data: {
194
+ application: 'dataset',
195
+ id: dataSet.id
196
+ },
197
+ history_check: true,
198
+ failed_policy: 'retry_dlq',
199
+ max_retry_count: 3
200
+ }
201
+ })
202
+
203
+ return await repository.save({
204
+ ...dataSet,
205
+ schedulerHandle: handle
206
+ })
207
+ } catch (err) {
208
+ console.error('stopDataCollectionSchedule', err)
209
+ }
210
+ }
211
+
212
+ @Directive('@transaction')
213
+ @Mutation(returns => DataSet, {
214
+ nullable: true,
215
+ description: 'To stop data collection schedule for the given dataset'
216
+ })
217
+ async stopDataCollectionSchedule(
218
+ @Arg('dataSetId') dataSetId: string,
219
+ @Ctx() context: ResolverContext
220
+ ): Promise<DataSet | undefined> {
221
+ const { domain, tx } = context.state
222
+
223
+ var repository = tx.getRepository(DataSet)
224
+ var dataSet = await repository.findOne({
225
+ where: { domain: { id: domain.id }, id: dataSetId }
226
+ })
227
+
228
+ if (!dataSet) {
229
+ throw new Error(
230
+ context.t('error.data-set not found', {
231
+ dataSet: dataSetId
232
+ })
233
+ )
234
+ }
235
+
236
+ try {
237
+ const handle = await unregisterSchedule({
238
+ resp_id: dataSet.schedulerHandle
239
+ })
240
+
241
+ return await repository.save({
242
+ ...dataSet,
243
+ schedulerHandle: null
244
+ })
245
+ } catch (err) {
246
+ console.error('stopDataCollectionSchedule', err)
247
+ }
248
+ }
249
+
151
250
  @Directive('@privilege(category: "data-set", privilege: "mutation", domainOwnerGranted: true)')
152
251
  @Directive('@transaction')
153
252
  @Mutation(returns => Boolean, { description: 'To import multiple data-sets' })
@@ -8,7 +8,7 @@ import { Domain, getQueryBuilderFromListParams, getRepository, ListParam } from
8
8
  import { DataKeySet } from '../data-key-set/data-key-set'
9
9
  import { DataSample } from '../data-sample/data-sample'
10
10
  import { DataItem } from './data-item-type'
11
- import { DataSet } from './data-set'
11
+ import { DataSet, DataSetState } from './data-set'
12
12
  import { DataSetList } from './data-set-type'
13
13
 
14
14
  var parser = require('cron-parser')
@@ -43,6 +43,27 @@ export class DataSetQuery {
43
43
  return { items, total }
44
44
  }
45
45
 
46
+ // @Directive('@privilege(category: "data-set", privilege: "query", domainOwnerGranted: true)')
47
+ // @Query(returns => DataSetStateList, { description: 'To fetch multiple status of DataSets' })
48
+ // async dataSetsStatus(@Args() params: ListParam, @Ctx() context: ResolverContext): Promise<DataSetStateList> {
49
+ // const { domain } = context.state
50
+
51
+ // // scheduler server에 group내 schedule list를 조회한다.
52
+ // const queryBuilder = getQueryBuilderFromListParams({
53
+ // repository: getRepository(DataSet),
54
+ // params,
55
+ // domain,
56
+ // alias: 'dataset',
57
+ // searchables: ['name', 'description', 'supervisoryRole']
58
+ // })
59
+
60
+ // const [items, total] = await queryBuilder.getManyAndCount()
61
+
62
+ // return { items: [{
63
+
64
+ // }], total }
65
+ // }
66
+
46
67
  @Query(returns => DataSetList, { description: 'To fetch multiple DataSets for data entry manually' })
47
68
  async dataSetsForEntry(@Args() params: ListParam, @Ctx() context: ResolverContext): Promise<DataSetList> {
48
69
  var { domain, user } = context.state
@@ -101,6 +122,18 @@ export class DataSetQuery {
101
122
  return { items, total }
102
123
  }
103
124
 
125
+ @FieldResolver(type => DataSetState)
126
+ async status(@Root() dataSet: DataSet): Promise<DataSetState> {
127
+ // get information from scheduler service
128
+ return {
129
+ id: '',
130
+ schedulerHandle: '',
131
+ state: '',
132
+ startedAt: new Date(),
133
+ nextSchedule: new Date()
134
+ }
135
+ }
136
+
104
137
  @FieldResolver(type => [DataItem])
105
138
  async dataItems(@Root() dataSet: DataSet): Promise<DataItem[]> {
106
139
  if (dataSet.dataItems instanceof Array) {
@@ -150,9 +183,10 @@ export class DataSetQuery {
150
183
  async dataKeySet(@Root() dataSet: DataSet) {
151
184
  return (
152
185
  dataSet.dataKeySet ||
153
- (await getRepository(DataKeySet).findOneBy({
154
- id: dataSet.dataKeySetId
155
- }))
186
+ (dataSet.dataKeySetId &&
187
+ (await getRepository(DataKeySet).findOneBy({
188
+ id: dataSet.dataKeySetId
189
+ })))
156
190
  )
157
191
  }
158
192
 
@@ -174,7 +208,7 @@ export class DataSetQuery {
174
208
  @FieldResolver(type => Date, { nullable: true })
175
209
  async latestCollectedAt(@Root() dataSet: DataSet): Promise<Date> {
176
210
  const sample = await getRepository(DataSample).findOne({
177
- select: ['collectedAt'],
211
+ select: ['id', 'collectedAt'],
178
212
  where: { dataSet: { id: dataSet.id } },
179
213
  order: { collectedAt: 'DESC' }
180
214
  })
@@ -3,6 +3,8 @@ import GraphQLUpload from 'graphql-upload/GraphQLUpload.js'
3
3
  import { Field, ID, InputType, Int, ObjectType } from 'type-graphql'
4
4
 
5
5
  import { ObjectRef, ScalarObject } from '@things-factory/shell'
6
+ import { ApprovalLineItem } from '@things-factory/organization'
7
+ import { AssigneeItem } from '@things-factory/worklist'
6
8
 
7
9
  import { DataItemPatch } from './data-item-type'
8
10
  import { DataSet, DataSetEntryType, DataSetMonitorType, DataSetReportType } from './data-set'
@@ -24,6 +26,12 @@ export class NewDataSet {
24
26
  @Field(type => ObjectRef, { nullable: true })
25
27
  supervisoryRole?: ObjectRef
26
28
 
29
+ @Field(type => ScalarObject, { nullable: true })
30
+ assignees?: AssigneeItem[]
31
+
32
+ @Field(type => ScalarObject, { nullable: true })
33
+ approvalLine?: ApprovalLineItem[]
34
+
27
35
  @Field({ nullable: true })
28
36
  active?: boolean
29
37
 
@@ -87,6 +95,12 @@ export class DataSetPatch {
87
95
  @Field(type => ObjectRef, { nullable: true })
88
96
  entryRole?: ObjectRef
89
97
 
98
+ @Field(type => ScalarObject, { nullable: true })
99
+ assignees?: AssigneeItem[]
100
+
101
+ @Field(type => ScalarObject, { nullable: true })
102
+ approvalLine?: ApprovalLineItem[]
103
+
90
104
  @Field({ nullable: true })
91
105
  active?: boolean
92
106
 
@@ -13,6 +13,8 @@ import {
13
13
 
14
14
  import { Role, User } from '@things-factory/auth-base'
15
15
  import { Domain, ScalarObject } from '@things-factory/shell'
16
+ import { ApprovalLineItem } from '@things-factory/organization'
17
+ import { AssigneeItem } from '@things-factory/worklist'
16
18
 
17
19
  import { DataKeySet } from '../data-key-set/data-key-set'
18
20
  import { DataItem } from './data-item-type'
@@ -20,6 +22,7 @@ import { DataItem } from './data-item-type'
20
22
  export enum DataSetEntryType {
21
23
  Generated = 'generated',
22
24
  Board = 'board',
25
+ CustomElement = 'custom-element',
23
26
  Page = 'page',
24
27
  ExternalURL = 'external',
25
28
  Jasper = 'jasper',
@@ -34,6 +37,7 @@ registerEnumType(DataSetEntryType, {
34
37
  export enum DataSetMonitorType {
35
38
  Generated = 'generated',
36
39
  Board = 'board',
40
+ CustomElement = 'custom-element',
37
41
  Page = 'page',
38
42
  ExternalURL = 'external'
39
43
  }
@@ -46,6 +50,7 @@ registerEnumType(DataSetMonitorType, {
46
50
  export enum DataSetReportType {
47
51
  Generated = 'generated',
48
52
  Board = 'board',
53
+ CustomElement = 'custom-element',
49
54
  Page = 'page',
50
55
  ExternalURL = 'external'
51
56
  }
@@ -55,6 +60,24 @@ registerEnumType(DataSetReportType, {
55
60
  description: 'report type enumeration for data-set'
56
61
  })
57
62
 
63
+ @ObjectType()
64
+ export class DataSetState {
65
+ @Field()
66
+ id: string
67
+
68
+ @Field()
69
+ schedulerHandle: string
70
+
71
+ @Field()
72
+ state: string
73
+
74
+ @Field()
75
+ startedAt: Date
76
+
77
+ @Field()
78
+ nextSchedule: Date
79
+ }
80
+
58
81
  @Entity()
59
82
  @Index('ix_data_set_0', (dataSet: DataSet) => [dataSet.domain, dataSet.name], { unique: true })
60
83
  @ObjectType({ description: 'Entity for DataSet' })
@@ -94,19 +117,33 @@ export class DataSet {
94
117
  dataKeySetId?: string
95
118
 
96
119
  @ManyToOne(type => Role, { nullable: true })
97
- @Field(type => Role, { nullable: true })
120
+ @Field(type => Role, {
121
+ nullable: true,
122
+ description: 'The person responsible for manually entering the data for that dataset'
123
+ })
98
124
  entryRole?: Role
99
125
 
100
126
  @RelationId((dataSet: DataSet) => dataSet.entryRole)
101
127
  entryRoleId?: string
102
128
 
103
129
  @ManyToOne(type => Role, { nullable: true })
104
- @Field(type => Role, { nullable: true })
130
+ @Field(type => Role, { nullable: true, description: 'The final authority on issues related to that dataset.' })
105
131
  supervisoryRole?: Role
106
132
 
107
133
  @RelationId((dataSet: DataSet) => dataSet.supervisoryRole)
108
134
  supervisoryRoleId?: string
109
135
 
136
+ @Column('simple-json', { nullable: true })
137
+ @Field(type => [AssigneeItem], { nullable: true, description: 'Who to contact for OOC issues' })
138
+ assignees?: AssigneeItem[]
139
+
140
+ @Column('simple-json', { nullable: true })
141
+ @Field(type => [ApprovalLineItem], {
142
+ nullable: true,
143
+ description: 'Approval line for handling OOC issues for that dataset'
144
+ })
145
+ approvalLine?: ApprovalLineItem[]
146
+
110
147
  @Column({ nullable: true })
111
148
  @Field({ nullable: true })
112
149
  type?: 'manual' | 'automatic' | string
@@ -158,6 +195,10 @@ export class DataSet {
158
195
  @Field({ nullable: true })
159
196
  timezone?: string
160
197
 
198
+ @Column({ nullable: true })
199
+ @Field({ nullable: true })
200
+ schedulerHandle?: string
201
+
161
202
  @CreateDateColumn()
162
203
  @Field({ nullable: true })
163
204
  createdAt?: Date
@@ -83,9 +83,10 @@ export class DataSetHistoryQuery {
83
83
  async dataKeySet(@Root() dataSet: DataSet) {
84
84
  return (
85
85
  dataSet.dataKeySet ||
86
- (await getRepository(DataKeySet).findOneBy({
87
- id: dataSet.dataKeySetId
88
- }))
86
+ (dataSet.dataKeySetId &&
87
+ (await getRepository(DataKeySet).findOneBy({
88
+ id: dataSet.dataKeySetId
89
+ })))
89
90
  )
90
91
  }
91
92
 
@@ -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
+ }
@@ -1,5 +1,5 @@
1
- import bootstrap from './client/bootstrap'
2
- import route from './client/route'
1
+ import bootstrap from './dist-client/bootstrap'
2
+ import route from './dist-client/route'
3
3
 
4
4
  export default {
5
5
  route,
@@ -20,6 +20,10 @@ export default {
20
20
  tagname: 'data-sample-search-page',
21
21
  page: 'data-sample-search'
22
22
  },
23
+ {
24
+ tagname: 'data-ooc-view-page',
25
+ page: 'data-ooc'
26
+ },
23
27
  {
24
28
  tagname: 'data-ooc-list-page',
25
29
  page: 'data-ooc-list'
@@ -1,8 +1,10 @@
1
1
  {
2
2
  "button.corrected": "corrected",
3
- "button.request": "request",
3
+ "button.request-archive": "request archive",
4
4
  "button.reviewed": "reviewed",
5
5
  "field.appliance": "appliance",
6
+ "field.approval-line": "approval line",
7
+ "field.assignees": "assignees",
6
8
  "field.collected_at": "collected at",
7
9
  "field.corrective-action": "corrective action",
8
10
  "field.corrector": "corrector",
@@ -1,8 +1,10 @@
1
1
  {
2
2
  "button.corrected": "조치완료",
3
3
  "button.reviewed": "검토완료",
4
- "button.request": "요청",
4
+ "button.request-archive": "자료보관 신규 요청",
5
5
  "field.appliance": "어플라이언스",
6
+ "field.approval-line": "결재라인",
7
+ "field.assignees": "할당자 목록",
6
8
  "field.collected_at": "수집일시",
7
9
  "field.corrected-at": "조치 시간",
8
10
  "field.corrective-action": "조치 활동",
@@ -1,7 +1,10 @@
1
1
  {
2
2
  "button.corrected": "corrected",
3
+ "button.request-archive": "request archive",
3
4
  "button.reviewed": "reviewed",
4
5
  "field.appliance": "appliance",
6
+ "field.approval-line": "approval line",
7
+ "field.assignees": "assignees",
5
8
  "field.collected_at": "collected at",
6
9
  "field.corrective-action": "corrective action",
7
10
  "field.corrector": "corrector",
@@ -1,7 +1,10 @@
1
1
  {
2
2
  "button.corrected": "corrected",
3
+ "button.request-archive": "request archive",
3
4
  "button.reviewed": "reviewed",
4
5
  "field.appliance": "appliance",
6
+ "field.approval-line": "approval line",
7
+ "field.assignees": "assignees",
5
8
  "field.collected_at": "collected at",
6
9
  "field.corrective-action": "corrective action",
7
10
  "field.corrector": "corrector",
@@ -1,105 +0,0 @@
1
- import '@operato/data-grist'
2
-
3
- import gql from 'graphql-tag'
4
- import { css, html, LitElement } from 'lit'
5
-
6
- import { client } from '@operato/graphql'
7
- import { i18next } from '@operato/i18n'
8
- import { isMobileDevice } from '@operato/utils'
9
-
10
- export class DataKeySetImporter extends LitElement {
11
- static get properties() {
12
- return {
13
- columns: Object,
14
- dataKeySets: Array
15
- }
16
- }
17
-
18
- constructor() {
19
- super()
20
- this.columns = {
21
- list: { fields: ['name', 'description'] },
22
- pagination: { infinite: true },
23
- columns: [
24
- {
25
- type: 'string',
26
- name: 'name',
27
- header: i18next.t('field.name'),
28
- width: 150
29
- },
30
- {
31
- type: 'string',
32
- name: 'description',
33
- header: i18next.t('field.description'),
34
- width: 200
35
- },
36
- {
37
- type: 'checkbox',
38
- name: 'active',
39
- header: i18next.t('field.active'),
40
- width: 60
41
- }
42
- ]
43
- }
44
- }
45
-
46
- static get styles() {
47
- return [
48
- css`
49
- :host {
50
- display: flex;
51
- flex-direction: column;
52
-
53
- background-color: #fff;
54
- }
55
-
56
- ox-grist {
57
- flex: 1;
58
- }
59
-
60
- .button-container {
61
- display: flex;
62
- margin-left: auto;
63
- padding: var(--padding-default);
64
- }
65
-
66
- mwc-button {
67
- margin-left: var(--margin-default);
68
- }
69
- `
70
- ]
71
- }
72
-
73
- render() {
74
- return html`
75
- <ox-grist
76
- .mode=${isMobileDevice() ? 'LIST' : 'GRID'}
77
- .config=${this.columns}
78
- .data=${{
79
- records: this.dataKeySets
80
- }}
81
- ></ox-grist>
82
-
83
- <div class="button-container">
84
- <mwc-button raised @click="${this.save.bind(this)}">${i18next.t('button.save')}</mwc-button>
85
- </div>
86
- `
87
- }
88
-
89
- async save() {
90
- const response = await client.mutate({
91
- mutation: gql`
92
- mutation importDataKeySets($dataKeySets: [DataKeySetPatch!]!) {
93
- importDataKeySets(dataKeySets: $dataKeySets)
94
- }
95
- `,
96
- variables: { dataKeySets: this.dataKeySets }
97
- })
98
-
99
- if (response.errors?.length) return
100
-
101
- this.dispatchEvent(new CustomEvent('imported'))
102
- }
103
- }
104
-
105
- window.customElements.define('data-key-set-importer', DataKeySetImporter)