@things-factory/dataset 8.0.0-beta.8 → 9.0.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (30) hide show
  1. package/dist-client/activities/activity-data-review-edit.d.ts +5 -1
  2. package/dist-client/activities/activity-data-review-edit.js +143 -5
  3. package/dist-client/activities/activity-data-review-edit.js.map +1 -1
  4. package/dist-client/tsconfig.tsbuildinfo +1 -1
  5. package/dist-server/activities/activity-data-review.js +18 -5
  6. package/dist-server/activities/activity-data-review.js.map +1 -1
  7. package/dist-server/activities/activity-ooc-review.js +13 -52
  8. package/dist-server/activities/activity-ooc-review.js.map +1 -1
  9. package/dist-server/controllers/create-data-ooc.d.ts +4 -0
  10. package/dist-server/controllers/create-data-ooc.js +65 -0
  11. package/dist-server/controllers/create-data-ooc.js.map +1 -0
  12. package/dist-server/controllers/create-data-sample.js +4 -94
  13. package/dist-server/controllers/create-data-sample.js.map +1 -1
  14. package/dist-server/controllers/index.d.ts +3 -0
  15. package/dist-server/controllers/index.js +3 -0
  16. package/dist-server/controllers/index.js.map +1 -1
  17. package/dist-server/controllers/issue-ooc-resolve.d.ts +3 -0
  18. package/dist-server/controllers/issue-ooc-resolve.js +49 -0
  19. package/dist-server/controllers/issue-ooc-resolve.js.map +1 -0
  20. package/dist-server/controllers/issue-ooc-review.d.ts +3 -0
  21. package/dist-server/controllers/issue-ooc-review.js +47 -0
  22. package/dist-server/controllers/issue-ooc-review.js.map +1 -0
  23. package/dist-server/service/index.d.ts +1 -1
  24. package/dist-server/tsconfig.tsbuildinfo +1 -1
  25. package/package.json +25 -25
  26. package/translations/en.json +3 -0
  27. package/translations/ja.json +3 -0
  28. package/translations/ko.json +3 -0
  29. package/translations/ms.json +3 -0
  30. package/translations/zh.json +3 -0
@@ -1,3 +1,5 @@
1
+ import '@material/web/icon/icon.js';
2
+ import '@material/web/radio/radio.js';
1
3
  import '@operato/dataset/ox-data-entry-form.js';
2
4
  import { LitElement } from 'lit';
3
5
  declare const DataReviewActivityEdit_base: (new (...args: any[]) => LitElement) & typeof LitElement;
@@ -5,10 +7,12 @@ export declare class DataReviewActivityEdit extends DataReviewActivityEdit_base
5
7
  static styles: import("lit").CSSResult[];
6
8
  input?: any;
7
9
  output?: any;
10
+ activityThread?: any;
8
11
  dataSample?: any;
12
+ form: HTMLFormElement;
9
13
  render(): import("lit-html").TemplateResult<1>;
10
14
  onChangeInstruction(e: Event): void;
11
15
  updated(changes: any): void;
12
- fetchDataAssign(): Promise<void>;
16
+ fetchDataSample(): Promise<void>;
13
17
  }
14
18
  export {};
@@ -1,32 +1,109 @@
1
1
  import { __decorate, __metadata } from "tslib";
2
+ import '@material/web/icon/icon.js';
3
+ import '@material/web/radio/radio.js';
2
4
  import '@operato/dataset/ox-data-entry-form.js';
3
5
  import gql from 'graphql-tag';
4
6
  import { css, html, LitElement } from 'lit';
5
- import { customElement, property, state } from 'lit/decorators.js';
7
+ import { customElement, property, query, state } from 'lit/decorators.js';
6
8
  import { i18next, localize } from '@operato/i18n';
7
9
  import { ScrollbarStyles } from '@operato/styles';
8
10
  import { client } from '@operato/graphql';
9
11
  let DataReviewActivityEdit = class DataReviewActivityEdit extends localize(i18next)(LitElement) {
10
12
  render() {
13
+ const { instruction, judgment } = this.output || {};
14
+ const { state } = this.activityThread || {};
15
+ const editable = state == 'unassigned' || state == 'assigned' || state == 'started' || state == 'submitted';
11
16
  return html `
12
17
  <div content>
13
18
  <ox-data-sample-view .dataSample=${this.dataSample}></ox-data-sample-view>
14
19
  </div>
20
+
21
+ <form @change=${this.onChangeInstruction}>
22
+ ${editable
23
+ ? html `
24
+ <label judgment>
25
+ <h2><md-icon>build_circle</md-icon>&nbsp;<span>${i18next.t('label.judgment')}</span></h2>
26
+ <div role="radiogroup" aria-label="An example group of radio buttons">
27
+ <label>
28
+ <md-radio
29
+ name="judgment"
30
+ value="normal"
31
+ ?checked=${judgment == 'normal'}
32
+ aria-label=${i18next.t('label.judgment-normal')}
33
+ ></md-radio>
34
+ ${i18next.t('label.judgment-normal')}
35
+ </label>
36
+ <label>
37
+ <md-radio
38
+ name="judgment"
39
+ value="abnormal"
40
+ ?checked=${judgment == 'abnormal'}
41
+ aria-label=${i18next.t('label.judgment-abnormal')}
42
+ ></md-radio
43
+ >${i18next.t('label.judgment-abnormal')}
44
+ </label>
45
+ </div>
46
+ </label>
47
+
48
+ <label instruction>
49
+ <h2><md-icon>build_circle</md-icon>&nbsp;<span>${i18next.t('label.corrective instruction')}</span></h2>
50
+ <textarea
51
+ name="instruction"
52
+ placeholder=${String(i18next.t('text.corrective instruction placeholder'))}
53
+ .value=${instruction || ''}
54
+ ></textarea>
55
+ </label>
56
+ `
57
+ : html `
58
+ <label judgment>
59
+ <h2><md-icon>build_circle</md-icon>&nbsp;<span>${i18next.t('label.judgment')}</span></h2>
60
+ <div role="radiogroup" aria-label="An example group of radio buttons">
61
+ <label>
62
+ <md-radio
63
+ value="normal"
64
+ ?checked=${judgment == 'normal'}
65
+ aria-label=${i18next.t('label.judgment-normal')}
66
+ readonly
67
+ ></md-radio>
68
+ ${i18next.t('label.judgment-normal')}
69
+ </label>
70
+ <label>
71
+ <md-radio
72
+ value="abnormal"
73
+ ?checked=${judgment == 'abnormal'}
74
+ aria-label=${i18next.t('label.judgment-abnormal')}
75
+ readonly
76
+ ></md-radio
77
+ >${i18next.t('label.judgment-abnormal')}
78
+ </label>
79
+ </div>
80
+ </label>
81
+
82
+ <label instruction>
83
+ <h2><md-icon>build_circle</md-icon>&nbsp;<span>${i18next.t('label.corrective instruction')}</span></h2>
84
+ <div>${instruction}</div>
85
+ </label>
86
+ `}
87
+ </form>
15
88
  `;
16
89
  }
17
90
  onChangeInstruction(e) {
18
- this.output || (this.output = {});
19
- this.output.instruction = e.target.value;
91
+ var output = {};
92
+ const formData = new FormData(this.form);
93
+ formData.forEach((value, key) => {
94
+ output[key] = value;
95
+ });
96
+ this.output = output;
20
97
  this.dispatchEvent(new CustomEvent('change', {
21
98
  detail: this.output
22
99
  }));
23
100
  }
24
101
  updated(changes) {
25
102
  if (changes.has('input')) {
26
- this.fetchDataAssign();
103
+ this.fetchDataSample();
27
104
  }
28
105
  }
29
- async fetchDataAssign() {
106
+ async fetchDataSample() {
30
107
  const { dataSampleId, dataSample } = this.input || {};
31
108
  if (dataSample) {
32
109
  /* only for backwards compatibility - should be deleted later */
@@ -111,6 +188,59 @@ DataReviewActivityEdit.styles = [
111
188
  padding: var(--spacing-large);
112
189
  overflow: auto;
113
190
  }
191
+
192
+ div[role='radiogroup'] {
193
+ display: flex;
194
+ flex-direction: row;
195
+ gap: var(--spacing-medium);
196
+
197
+ label {
198
+ display: flex;
199
+ flex-direction: row;
200
+
201
+ gap: var(--spacing-small);
202
+ align-items: center;
203
+ }
204
+ }
205
+
206
+ label {
207
+ display: flex;
208
+ flex-direction: column;
209
+
210
+ padding: var(--spacing-large);
211
+
212
+ h2 {
213
+ display: flex;
214
+
215
+ color: var(--title-text-color);
216
+ text-transform: capitalize;
217
+ margin: var(--title-margin);
218
+ align-items: center;
219
+ }
220
+
221
+ div {
222
+ padding: var(--spacing-large);
223
+ font: var(--input-field-font);
224
+ }
225
+
226
+ md-icon {
227
+ color: var(--status-danger-color);
228
+ }
229
+
230
+ textarea {
231
+ border: var(--input-field-border);
232
+ border-radius: var(--spacing-small);
233
+ margin: var(--spacing-medium);
234
+ padding: var(--spacing-medium);
235
+ font: var(--input-field-font);
236
+ color: var(--md-sys-color-on-surface);
237
+ background: var(--md-sys-color-surface-variant);
238
+
239
+ resize: none;
240
+ outline: none;
241
+ min-height: 200px;
242
+ }
243
+ }
114
244
  `
115
245
  ];
116
246
  __decorate([
@@ -121,10 +251,18 @@ __decorate([
121
251
  property({ type: Object }),
122
252
  __metadata("design:type", Object)
123
253
  ], DataReviewActivityEdit.prototype, "output", void 0);
254
+ __decorate([
255
+ property({ type: Object }),
256
+ __metadata("design:type", Object)
257
+ ], DataReviewActivityEdit.prototype, "activityThread", void 0);
124
258
  __decorate([
125
259
  state(),
126
260
  __metadata("design:type", Object)
127
261
  ], DataReviewActivityEdit.prototype, "dataSample", void 0);
262
+ __decorate([
263
+ query('form'),
264
+ __metadata("design:type", HTMLFormElement)
265
+ ], DataReviewActivityEdit.prototype, "form", void 0);
128
266
  DataReviewActivityEdit = __decorate([
129
267
  customElement('activity-data-review-edit')
130
268
  ], DataReviewActivityEdit);
@@ -1 +1 @@
1
- {"version":3,"file":"activity-data-review-edit.js","sourceRoot":"","sources":["../../client/activities/activity-data-review-edit.ts"],"names":[],"mappings":";AAAA,OAAO,wCAAwC,CAAA;AAE/C,OAAO,GAAG,MAAM,aAAa,CAAA;AAC7B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,KAAK,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAElE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAA;AAGlC,IAAM,sBAAsB,GAA5B,MAAM,sBAAuB,SAAQ,QAAQ,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC;IAgCvE,MAAM;QACJ,OAAO,IAAI,CAAA;;2CAE4B,IAAI,CAAC,UAAU;;KAErD,CAAA;IACH,CAAC;IAED,mBAAmB,CAAC,CAAQ;QAC1B,IAAI,CAAC,MAAM,KAAX,IAAI,CAAC,MAAM,GAAK,EAAE,EAAA;QAClB,IAAI,CAAC,MAAM,CAAC,WAAW,GAAI,CAAC,CAAC,MAA8B,CAAC,KAAK,CAAA;QAEjE,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,QAAQ,EAAE;YACxB,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC,CACH,CAAA;IACH,CAAC;IAED,OAAO,CAAC,OAAO;QACb,IAAI,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;YACzB,IAAI,CAAC,eAAe,EAAE,CAAA;QACxB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,eAAe;QACnB,MAAM,EAAE,YAAY,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAA;QAErD,IAAI,UAAU,EAAE,CAAC;YACf,gEAAgE;YAChE,IAAI,CAAC,UAAU,GAAG,UAAU,CAAA;QAC9B,CAAC;aAAM,IAAI,YAAY,EAAE,CAAC;YACxB,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,KAAK,CAAC;gBAClC,KAAK,EAAE,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;SA6CT;gBACD,SAAS,EAAE;oBACT,EAAE,EAAE,YAAY;iBACjB;aACF,CAAC,CAAA;YAEF,IAAI,CAAC,UAAU,qBACV,QAAQ,CAAC,IAAI,CAAC,UAAU,CAC5B,CAAA;QACH,CAAC;IACH,CAAC;;AAvHM,6BAAM,GAAG;IACd,eAAe;IACf,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;KAqBF;CACF,AAxBY,CAwBZ;AAE2B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;qDAAY;AACX;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;;sDAAa;AAE/B;IAAR,KAAK,EAAE;;0DAAiB;AA9Bd,sBAAsB;IADlC,aAAa,CAAC,2BAA2B,CAAC;GAC9B,sBAAsB,CAyHlC","sourcesContent":["import '@operato/dataset/ox-data-entry-form.js'\n\nimport gql from 'graphql-tag'\nimport { css, html, LitElement } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\n\nimport { i18next, localize } from '@operato/i18n'\nimport { ScrollbarStyles } from '@operato/styles'\nimport { client } from '@operato/graphql'\n\n@customElement('activity-data-review-edit')\nexport class DataReviewActivityEdit extends localize(i18next)(LitElement) {\n static styles = [\n ScrollbarStyles,\n css`\n :host {\n display: flex;\n flex-direction: column;\n\n background-color: var(--md-sys-color-surface);\n }\n\n div[content] {\n flex: 1;\n flex-direction: column;\n\n display: flex;\n overflow: auto;\n }\n\n ox-data-sample-view {\n flex: 1;\n padding: var(--spacing-large);\n overflow: auto;\n }\n `\n ]\n\n @property({ type: Object }) input?: any\n @property({ type: Object }) output?: any\n\n @state() dataSample?: any\n\n render() {\n return html`\n <div content>\n <ox-data-sample-view .dataSample=${this.dataSample}></ox-data-sample-view>\n </div>\n `\n }\n\n onChangeInstruction(e: Event) {\n this.output ||= {}\n this.output.instruction = (e.target as HTMLTextAreaElement).value\n\n this.dispatchEvent(\n new CustomEvent('change', {\n detail: this.output\n })\n )\n }\n\n updated(changes) {\n if (changes.has('input')) {\n this.fetchDataAssign()\n }\n }\n\n async fetchDataAssign() {\n const { dataSampleId, dataSample } = this.input || {}\n\n if (dataSample) {\n /* only for backwards compatibility - should be deleted later */\n this.dataSample = dataSample\n } else if (dataSampleId) {\n const response = await client.query({\n query: gql`\n query ($id: String!) {\n dataSample(id: $id) {\n id\n name\n description\n useCase\n key01\n key02\n key03\n key04\n key05\n data\n ooc\n oos\n dataSet {\n id\n name\n description\n }\n dataItems {\n name\n description\n active\n hidden\n tag\n group\n type\n unit\n options\n quota\n spec\n stat\n }\n judgment\n workDate\n workShift\n updater {\n id\n name\n }\n updatedAt\n collectedAt\n }\n }\n `,\n variables: {\n id: dataSampleId\n }\n })\n\n this.dataSample = {\n ...response.data.dataSample\n }\n }\n }\n}\n"]}
1
+ {"version":3,"file":"activity-data-review-edit.js","sourceRoot":"","sources":["../../client/activities/activity-data-review-edit.ts"],"names":[],"mappings":"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","sourcesContent":["import '@material/web/icon/icon.js'\nimport '@material/web/radio/radio.js'\nimport '@operato/dataset/ox-data-entry-form.js'\n\nimport gql from 'graphql-tag'\nimport { css, html, LitElement } from 'lit'\nimport { customElement, property, query, state } from 'lit/decorators.js'\n\nimport { i18next, localize } from '@operato/i18n'\nimport { ScrollbarStyles } from '@operato/styles'\nimport { client } from '@operato/graphql'\n\n@customElement('activity-data-review-edit')\nexport class DataReviewActivityEdit extends localize(i18next)(LitElement) {\n static styles = [\n ScrollbarStyles,\n css`\n :host {\n display: flex;\n flex-direction: column;\n\n background-color: var(--md-sys-color-surface);\n }\n\n div[content] {\n flex: 1;\n flex-direction: column;\n\n display: flex;\n overflow: auto;\n }\n\n ox-data-sample-view {\n flex: 1;\n padding: var(--spacing-large);\n overflow: auto;\n }\n\n div[role='radiogroup'] {\n display: flex;\n flex-direction: row;\n gap: var(--spacing-medium);\n\n label {\n display: flex;\n flex-direction: row;\n\n gap: var(--spacing-small);\n align-items: center;\n }\n }\n\n label {\n display: flex;\n flex-direction: column;\n\n padding: var(--spacing-large);\n\n h2 {\n display: flex;\n\n color: var(--title-text-color);\n text-transform: capitalize;\n margin: var(--title-margin);\n align-items: center;\n }\n\n div {\n padding: var(--spacing-large);\n font: var(--input-field-font);\n }\n\n md-icon {\n color: var(--status-danger-color);\n }\n\n textarea {\n border: var(--input-field-border);\n border-radius: var(--spacing-small);\n margin: var(--spacing-medium);\n padding: var(--spacing-medium);\n font: var(--input-field-font);\n color: var(--md-sys-color-on-surface);\n background: var(--md-sys-color-surface-variant);\n\n resize: none;\n outline: none;\n min-height: 200px;\n }\n }\n `\n ]\n\n @property({ type: Object }) input?: any\n @property({ type: Object }) output?: any\n @property({ type: Object }) activityThread?: any\n\n @state() dataSample?: any\n\n @query('form') form!: HTMLFormElement\n\n render() {\n const { instruction, judgment } = this.output || {}\n const { state } = this.activityThread || {}\n const editable = state == 'unassigned' || state == 'assigned' || state == 'started' || state == 'submitted'\n\n return html`\n <div content>\n <ox-data-sample-view .dataSample=${this.dataSample}></ox-data-sample-view>\n </div>\n\n <form @change=${this.onChangeInstruction}>\n ${editable\n ? html`\n <label judgment>\n <h2><md-icon>build_circle</md-icon>&nbsp;<span>${i18next.t('label.judgment')}</span></h2>\n <div role=\"radiogroup\" aria-label=\"An example group of radio buttons\">\n <label>\n <md-radio\n name=\"judgment\"\n value=\"normal\"\n ?checked=${judgment == 'normal'}\n aria-label=${i18next.t('label.judgment-normal')}\n ></md-radio>\n ${i18next.t('label.judgment-normal')}\n </label>\n <label>\n <md-radio\n name=\"judgment\"\n value=\"abnormal\"\n ?checked=${judgment == 'abnormal'}\n aria-label=${i18next.t('label.judgment-abnormal')}\n ></md-radio\n >${i18next.t('label.judgment-abnormal')}\n </label>\n </div>\n </label>\n\n <label instruction>\n <h2><md-icon>build_circle</md-icon>&nbsp;<span>${i18next.t('label.corrective instruction')}</span></h2>\n <textarea\n name=\"instruction\"\n placeholder=${String(i18next.t('text.corrective instruction placeholder'))}\n .value=${instruction || ''}\n ></textarea>\n </label>\n `\n : html`\n <label judgment>\n <h2><md-icon>build_circle</md-icon>&nbsp;<span>${i18next.t('label.judgment')}</span></h2>\n <div role=\"radiogroup\" aria-label=\"An example group of radio buttons\">\n <label>\n <md-radio\n value=\"normal\"\n ?checked=${judgment == 'normal'}\n aria-label=${i18next.t('label.judgment-normal')}\n readonly\n ></md-radio>\n ${i18next.t('label.judgment-normal')}\n </label>\n <label>\n <md-radio\n value=\"abnormal\"\n ?checked=${judgment == 'abnormal'}\n aria-label=${i18next.t('label.judgment-abnormal')}\n readonly\n ></md-radio\n >${i18next.t('label.judgment-abnormal')}\n </label>\n </div>\n </label>\n\n <label instruction>\n <h2><md-icon>build_circle</md-icon>&nbsp;<span>${i18next.t('label.corrective instruction')}</span></h2>\n <div>${instruction}</div>\n </label>\n `}\n </form>\n `\n }\n\n onChangeInstruction(e: Event) {\n var output = {}\n\n const formData = new FormData(this.form)\n formData.forEach((value, key) => {\n output[key] = value\n })\n\n this.output = output\n\n this.dispatchEvent(\n new CustomEvent('change', {\n detail: this.output\n })\n )\n }\n\n updated(changes) {\n if (changes.has('input')) {\n this.fetchDataSample()\n }\n }\n\n async fetchDataSample() {\n const { dataSampleId, dataSample } = this.input || {}\n\n if (dataSample) {\n /* only for backwards compatibility - should be deleted later */\n this.dataSample = dataSample\n } else if (dataSampleId) {\n const response = await client.query({\n query: gql`\n query ($id: String!) {\n dataSample(id: $id) {\n id\n name\n description\n useCase\n key01\n key02\n key03\n key04\n key05\n data\n ooc\n oos\n dataSet {\n id\n name\n description\n }\n dataItems {\n name\n description\n active\n hidden\n tag\n group\n type\n unit\n options\n quota\n spec\n stat\n }\n judgment\n workDate\n workShift\n updater {\n id\n name\n }\n updatedAt\n collectedAt\n }\n }\n `,\n variables: {\n id: dataSampleId\n }\n })\n\n this.dataSample = {\n ...response.data.dataSample\n }\n }\n }\n}\n"]}