@operato/dataset 1.0.0-alpha.6 → 1.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 (59) hide show
  1. package/CHANGELOG.md +428 -0
  2. package/demo/index.html +8 -90
  3. package/demo/ox-data-entry-form.html +118 -0
  4. package/demo/ox-data-item-spec.html +152 -0
  5. package/demo/ox-data-ooc-view.html +185 -0
  6. package/demo/ox-data-sample-view.html +150 -0
  7. package/demo/ox-grist-editor-data-item-spec.html +476 -0
  8. package/dist/src/grist-editor/index.d.ts +1 -0
  9. package/dist/src/grist-editor/index.js +7 -0
  10. package/dist/src/grist-editor/index.js.map +1 -0
  11. package/dist/src/grist-editor/ox-grist-editor-data-item-spec.d.ts +11 -0
  12. package/dist/src/grist-editor/ox-grist-editor-data-item-spec.js +77 -0
  13. package/dist/src/grist-editor/ox-grist-editor-data-item-spec.js.map +1 -0
  14. package/dist/src/grist-editor/ox-popup-data-item-spec.d.ts +13 -0
  15. package/dist/src/grist-editor/ox-popup-data-item-spec.js +90 -0
  16. package/dist/src/grist-editor/ox-popup-data-item-spec.js.map +1 -0
  17. package/dist/src/index.d.ts +6 -1
  18. package/dist/src/index.js +6 -1
  19. package/dist/src/index.js.map +1 -1
  20. package/dist/src/ox-data-entry-form.d.ts +1 -24
  21. package/dist/src/ox-data-entry-form.js +12 -16
  22. package/dist/src/ox-data-entry-form.js.map +1 -1
  23. package/dist/src/ox-data-item-spec.d.ts +18 -0
  24. package/dist/src/ox-data-item-spec.js +77 -0
  25. package/dist/src/ox-data-item-spec.js.map +1 -0
  26. package/dist/src/ox-data-ooc-view.d.ts +10 -0
  27. package/dist/src/ox-data-ooc-view.js +69 -0
  28. package/dist/src/ox-data-ooc-view.js.map +1 -0
  29. package/dist/src/ox-data-sample-view copy.d.ts +13 -0
  30. package/dist/src/ox-data-sample-view copy.js +214 -0
  31. package/dist/src/ox-data-sample-view copy.js.map +1 -0
  32. package/dist/src/ox-data-sample-view.d.ts +13 -0
  33. package/dist/src/ox-data-sample-view.js +168 -0
  34. package/dist/src/ox-data-sample-view.js.map +1 -0
  35. package/dist/src/ox-data-use-case.d.ts +16 -0
  36. package/dist/src/ox-data-use-case.js +111 -0
  37. package/dist/src/ox-data-use-case.js.map +1 -0
  38. package/dist/src/types.d.ts +78 -0
  39. package/dist/src/types.js +2 -0
  40. package/dist/src/types.js.map +1 -0
  41. package/dist/tsconfig.tsbuildinfo +1 -1
  42. package/package.json +20 -12
  43. package/src/grist-editor/index.ts +10 -0
  44. package/src/grist-editor/ox-grist-editor-data-item-spec.ts +92 -0
  45. package/src/grist-editor/ox-popup-data-item-spec.ts +90 -0
  46. package/src/index.ts +6 -1
  47. package/src/ox-data-entry-form.ts +13 -37
  48. package/src/ox-data-item-spec.ts +74 -0
  49. package/src/ox-data-ooc-view.ts +67 -0
  50. package/src/ox-data-sample-view.ts +175 -0
  51. package/src/ox-data-use-case.ts +147 -0
  52. package/src/types.ts +72 -0
  53. package/themes/grist-theme.css +194 -0
  54. package/themes/oops-theme.css +26 -0
  55. package/themes/report-theme.css +47 -0
  56. package/translations/en.json +1 -0
  57. package/translations/ko.json +1 -0
  58. package/translations/ms.json +1 -0
  59. package/translations/zh.json +1 -0
@@ -0,0 +1,214 @@
1
+ import { __decorate } from "tslib";
2
+ import '@operato/input/ox-input-file.js';
3
+ import { LitElement, css, html } from 'lit';
4
+ import { customElement, property } from 'lit/decorators.js';
5
+ import { OxDataUseCase } from './ox-data-use-case.js';
6
+ let OxDataSampleView = class OxDataSampleView extends LitElement {
7
+ render() {
8
+ var _a, _b, _c, _d, _e;
9
+ const dataItems = ((_a = this.dataSet) === null || _a === void 0 ? void 0 : _a.dataItems.filter(item => item.active)) || [];
10
+ const data = ((_b = this.dataSample) === null || _b === void 0 ? void 0 : _b.data) || {};
11
+ const formatter = new Intl.DateTimeFormat(navigator.language, { dateStyle: 'full', timeStyle: 'short' });
12
+ return html ` <h2>${(_c = this.dataSample) === null || _c === void 0 ? void 0 : _c.name}</h2>
13
+ <p page-description>
14
+ ${(_d = this.dataSample) === null || _d === void 0 ? void 0 : _d.description}<br /><br />
15
+ collected at: ${formatter.format(new Date((_e = this.dataSample) === null || _e === void 0 ? void 0 : _e.collectedAt))}
16
+ </p>
17
+
18
+ <form @change=${(e) => this.onChange(e)}>
19
+ <table>
20
+ <tr>
21
+ <th>item</th>
22
+ <th>description</th>
23
+ <th>unit</th>
24
+ <th>value</th>
25
+ <th>specification</th>
26
+ <th>OOC</th>
27
+ <th>OOS</th>
28
+ </tr>
29
+ ${dataItems.map(dataItem => {
30
+ const { ooc, oos } = this.evaluateOOC(dataItem, data === null || data === void 0 ? void 0 : data[dataItem.tag]) || {};
31
+ return html `
32
+ <tr ?ooc=${ooc} ?oos=${oos}>
33
+ <td name>${dataItem.name}</td>
34
+ <td>${dataItem.description}</td>
35
+ <td>${dataItem.unit}</td>
36
+ <td>${this.buildValue(dataItem)}</td>
37
+ <td><pre>${this.buildSpec(dataItem)}</pre></td>
38
+ <td>${ooc ? html `<mwc-icon>done</mwc-icon>` : ''}</td>
39
+ <td>${oos ? html `<mwc-icon>done</mwc-icon>` : ''}</td>
40
+ </tr>
41
+ `;
42
+ })}
43
+ </table>
44
+
45
+ <label><mwc-icon>build_circle</mwc-icon> correction activity</label>
46
+ <textarea name="correctionActivity"> </textarea>
47
+ </form>`;
48
+ }
49
+ onChange(e) { }
50
+ buildSpec(dataItem) {
51
+ return OxDataUseCase.elaborateDataItemSpec(this.dataSet, dataItem);
52
+ }
53
+ buildValue(dataItem) {
54
+ var _a;
55
+ const { tag, type } = dataItem;
56
+ if (!this.dataSample) {
57
+ return '';
58
+ }
59
+ const value = (_a = this.dataSample) === null || _a === void 0 ? void 0 : _a.data[dataItem.tag];
60
+ if (value === undefined) {
61
+ return '';
62
+ }
63
+ const values = value instanceof Array ? value : [value];
64
+ const elements = values.map((_, idx) => {
65
+ const v = value[idx];
66
+ switch (type) {
67
+ case 'boolean':
68
+ return html ` <input type="checkbox" name=${tag} .checked=${v} disabled />`;
69
+ break;
70
+ case 'select':
71
+ case 'number':
72
+ case 'string':
73
+ default:
74
+ return String(v === undefined ? '' : v);
75
+ }
76
+ });
77
+ return type === 'boolean' ? elements : elements.join(', ');
78
+ }
79
+ evaluateOOC(dataItem, value) {
80
+ return OxDataUseCase.evaluateItem(this.dataSet, dataItem, value);
81
+ }
82
+ };
83
+ OxDataSampleView.styles = css `
84
+ :host {
85
+ display: flex;
86
+ flex-direction: column;
87
+ background-color: var(--main-section-background-color);
88
+ padding: var(--padding-wide);
89
+ }
90
+
91
+ form {
92
+ flex: 1;
93
+
94
+ display: flex;
95
+ flex-direction: column;
96
+ }
97
+ label {
98
+ font: var(--label-font);
99
+ color: var(--label-color);
100
+ }
101
+ label * {
102
+ text-align: middle;
103
+ }
104
+ label:nth-child(even) {
105
+ background-color: var(--main-section-background-color);
106
+ padding: var(--padding-default) 0;
107
+ }
108
+ label mwc-icon {
109
+ position: relative;
110
+ top: 4px;
111
+ font-size: 18px;
112
+ color: var(--status-danger-color);
113
+ }
114
+
115
+ div[name] {
116
+ grid-column: span 2 / auto;
117
+ font: var(--label-font);
118
+ color: var(--label-color);
119
+ text-align: right;
120
+ }
121
+ div[elements] {
122
+ grid-column: span 10 / auto;
123
+ display: flex;
124
+ flex-direction: row;
125
+ flex-wrap: wrap;
126
+ gap: 10px;
127
+ padding-right: var(--padding-default);
128
+ }
129
+ div[elements] * {
130
+ flex: 1;
131
+ }
132
+ div[elements] input,
133
+ div[elements] select {
134
+ border: var(--input-field-border);
135
+ border-radius: var(--input-field-border-radius);
136
+ padding: var(--input-field-padding);
137
+ font: var(--input-field-font);
138
+ }
139
+ h2 {
140
+ margin: var(--title-margin);
141
+ padding-top: 25px;
142
+ font: var(--title-font);
143
+ color: var(--title-text-color);
144
+ }
145
+ [page-description] {
146
+ margin: var(--page-description-margin);
147
+ font: var(--page-description-font);
148
+ color: var(--page-description-color);
149
+ }
150
+ table {
151
+ border-collapse: collapse;
152
+ margin-bottom: var(--margin-default);
153
+ }
154
+ th {
155
+ padding: var(--th-padding);
156
+ border-top: var(--th-border-top);
157
+ border-bottom: var(--td-border-bottom);
158
+ text-transform: var(--th-text-transform);
159
+ font: var(--th-font);
160
+ color: var(--th-color);
161
+ text-align: left;
162
+ }
163
+ tr {
164
+ background-color: var(--tr-background-color);
165
+ }
166
+ tr:nth-child(odd) {
167
+ background-color: var(--tr-background-odd-color);
168
+ }
169
+ tr:hover {
170
+ background-color: var(--tr-background-hover-color);
171
+ }
172
+ tr[ooc],
173
+ tr[oos] {
174
+ background-color: #fefbdf;
175
+ }
176
+ td {
177
+ border-bottom: var(--td-border-bottom);
178
+ padding: var(--td-padding);
179
+ font: var(--td-font);
180
+ color: var(--td-color);
181
+ }
182
+ td[name] {
183
+ font-weight: bold;
184
+ }
185
+ td mwc-icon {
186
+ color: var(--status-danger-color);
187
+ }
188
+ textarea {
189
+ border: var(--input-field-border);
190
+ border-radius: var(--input-border-radius);
191
+ padding: var(--input-field-padding);
192
+ font: var(--input-field-font);
193
+ }
194
+
195
+ @media only screen and (max-width: 460px) {
196
+ div[name] {
197
+ grid-column: span 3 / auto;
198
+ }
199
+ div[elements] {
200
+ grid-column: span 9 / auto;
201
+ }
202
+ }
203
+ `;
204
+ __decorate([
205
+ property({ type: Object })
206
+ ], OxDataSampleView.prototype, "dataSet", void 0);
207
+ __decorate([
208
+ property({ type: Object })
209
+ ], OxDataSampleView.prototype, "dataSample", void 0);
210
+ OxDataSampleView = __decorate([
211
+ customElement('ox-data-sample-view')
212
+ ], OxDataSampleView);
213
+ export { OxDataSampleView };
214
+ //# sourceMappingURL=ox-data-sample-view%20copy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ox-data-sample-view copy.js","sourceRoot":"","sources":["../../src/ox-data-sample-view copy.ts"],"names":[],"mappings":";AAAA,OAAO,iCAAiC,CAAA;AAGxC,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAE3D,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAGrD,IAAa,gBAAgB,GAA7B,MAAa,gBAAiB,SAAQ,UAAU;IA8H9C,MAAM;;QACJ,MAAM,SAAS,GAAG,CAAA,MAAA,IAAI,CAAC,OAAO,0CAAE,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,KAAI,EAAE,CAAA;QAC3E,MAAM,IAAI,GAAG,CAAA,MAAA,IAAI,CAAC,UAAU,0CAAE,IAAI,KAAI,EAAE,CAAA;QACxC,MAAM,SAAS,GAAG,IAAI,IAAI,CAAC,cAAc,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,CAAC,CAAA;QAExG,OAAO,IAAI,CAAA,QAAQ,MAAA,IAAI,CAAC,UAAU,0CAAE,IAAI;;UAElC,MAAA,IAAI,CAAC,UAAU,0CAAE,WAAW;wBACd,SAAS,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,MAAA,IAAI,CAAC,UAAU,0CAAE,WAAY,CAAC,CAAC;;;sBAG3D,CAAC,CAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;;;;;;;;;;;YAWxC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;YACzB,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAA;YAC3E,OAAO,IAAI,CAAA;yBACE,GAAG,SAAS,GAAG;2BACb,QAAQ,CAAC,IAAI;sBAClB,QAAQ,CAAC,WAAW;sBACpB,QAAQ,CAAC,IAAI;sBACb,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC;2BACpB,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;sBAC7B,GAAG,CAAC,CAAC,CAAC,IAAI,CAAA,2BAA2B,CAAC,CAAC,CAAC,EAAE;sBAC1C,GAAG,CAAC,CAAC,CAAC,IAAI,CAAA,2BAA2B,CAAC,CAAC,CAAC,EAAE;;aAEnD,CAAA;QACH,CAAC,CAAC;;;;;cAKE,CAAA;IACZ,CAAC;IAEO,QAAQ,CAAC,CAAQ,IAAG,CAAC;IAErB,SAAS,CAAC,QAAkB;QAClC,OAAO,aAAa,CAAC,qBAAqB,CAAC,IAAI,CAAC,OAAQ,EAAE,QAAQ,CAAC,CAAA;IACrE,CAAC;IAEO,UAAU,CAAC,QAAkB;;QACnC,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,QAAQ,CAAA;QAE9B,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE;YACpB,OAAO,EAAE,CAAA;SACV;QAED,MAAM,KAAK,GAAG,MAAA,IAAI,CAAC,UAAU,0CAAE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAA;QACjD,IAAI,KAAK,KAAK,SAAS,EAAE;YACvB,OAAO,EAAE,CAAA;SACV;QACD,MAAM,MAAM,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAA;QAEvD,MAAM,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,GAAG,EAAE,EAAE;YAC1C,MAAM,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,CAAA;YAEpB,QAAQ,IAAI,EAAE;gBACZ,KAAK,SAAS;oBACZ,OAAO,IAAI,CAAA,gCAAgC,GAAG,aAAa,CAAC,cAAc,CAAA;oBAC1E,MAAK;gBAEP,KAAK,QAAQ,CAAC;gBACd,KAAK,QAAQ,CAAC;gBACd,KAAK,QAAQ,CAAC;gBACd;oBACE,OAAO,MAAM,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;aAC1C;QACH,CAAC,CAAC,CAAA;QAEF,OAAO,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC5D,CAAC;IAEO,WAAW,CAAC,QAAkB,EAAE,KAAU;QAChD,OAAO,aAAa,CAAC,YAAY,CAAC,IAAI,CAAC,OAAQ,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAA;IACnE,CAAC;CACF,CAAA;AAjNQ,uBAAM,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwHlB,CAAA;AAE2B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;iDAAkB;AACjB;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;oDAAwB;AA5HxC,gBAAgB;IAD5B,aAAa,CAAC,qBAAqB,CAAC;GACxB,gBAAgB,CAkN5B;SAlNY,gBAAgB","sourcesContent":["import '@operato/input/ox-input-file.js'\n\nimport { DataItem, DataSample, DataSet } from './types.js'\nimport { LitElement, css, html } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\n\nimport { OxDataUseCase } from './ox-data-use-case.js'\n\n@customElement('ox-data-sample-view')\nexport class OxDataSampleView extends LitElement {\n static styles = css`\n :host {\n display: flex;\n flex-direction: column;\n background-color: var(--main-section-background-color);\n padding: var(--padding-wide);\n }\n\n form {\n flex: 1;\n\n display: flex;\n flex-direction: column;\n }\n label {\n font: var(--label-font);\n color: var(--label-color);\n }\n label * {\n text-align: middle;\n }\n label:nth-child(even) {\n background-color: var(--main-section-background-color);\n padding: var(--padding-default) 0;\n }\n label mwc-icon {\n position: relative;\n top: 4px;\n font-size: 18px;\n color: var(--status-danger-color);\n }\n\n div[name] {\n grid-column: span 2 / auto;\n font: var(--label-font);\n color: var(--label-color);\n text-align: right;\n }\n div[elements] {\n grid-column: span 10 / auto;\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n gap: 10px;\n padding-right: var(--padding-default);\n }\n div[elements] * {\n flex: 1;\n }\n div[elements] input,\n div[elements] select {\n border: var(--input-field-border);\n border-radius: var(--input-field-border-radius);\n padding: var(--input-field-padding);\n font: var(--input-field-font);\n }\n h2 {\n margin: var(--title-margin);\n padding-top: 25px;\n font: var(--title-font);\n color: var(--title-text-color);\n }\n [page-description] {\n margin: var(--page-description-margin);\n font: var(--page-description-font);\n color: var(--page-description-color);\n }\n table {\n border-collapse: collapse;\n margin-bottom: var(--margin-default);\n }\n th {\n padding: var(--th-padding);\n border-top: var(--th-border-top);\n border-bottom: var(--td-border-bottom);\n text-transform: var(--th-text-transform);\n font: var(--th-font);\n color: var(--th-color);\n text-align: left;\n }\n tr {\n background-color: var(--tr-background-color);\n }\n tr:nth-child(odd) {\n background-color: var(--tr-background-odd-color);\n }\n tr:hover {\n background-color: var(--tr-background-hover-color);\n }\n tr[ooc],\n tr[oos] {\n background-color: #fefbdf;\n }\n td {\n border-bottom: var(--td-border-bottom);\n padding: var(--td-padding);\n font: var(--td-font);\n color: var(--td-color);\n }\n td[name] {\n font-weight: bold;\n }\n td mwc-icon {\n color: var(--status-danger-color);\n }\n textarea {\n border: var(--input-field-border);\n border-radius: var(--input-border-radius);\n padding: var(--input-field-padding);\n font: var(--input-field-font);\n }\n\n @media only screen and (max-width: 460px) {\n div[name] {\n grid-column: span 3 / auto;\n }\n div[elements] {\n grid-column: span 9 / auto;\n }\n }\n `\n\n @property({ type: Object }) dataSet?: DataSet\n @property({ type: Object }) dataSample?: DataSample\n\n render() {\n const dataItems = this.dataSet?.dataItems.filter(item => item.active) || []\n const data = this.dataSample?.data || {}\n const formatter = new Intl.DateTimeFormat(navigator.language, { dateStyle: 'full', timeStyle: 'short' })\n\n return html` <h2>${this.dataSample?.name}</h2>\n <p page-description>\n ${this.dataSample?.description}<br /><br />\n collected at: ${formatter.format(new Date(this.dataSample?.collectedAt!))}\n </p>\n\n <form @change=${(e: Event) => this.onChange(e)}>\n <table>\n <tr>\n <th>item</th>\n <th>description</th>\n <th>unit</th>\n <th>value</th>\n <th>specification</th>\n <th>OOC</th>\n <th>OOS</th>\n </tr>\n ${dataItems.map(dataItem => {\n const { ooc, oos } = this.evaluateOOC(dataItem, data?.[dataItem.tag]) || {}\n return html`\n <tr ?ooc=${ooc} ?oos=${oos}>\n <td name>${dataItem.name}</td>\n <td>${dataItem.description}</td>\n <td>${dataItem.unit}</td>\n <td>${this.buildValue(dataItem)}</td>\n <td><pre>${this.buildSpec(dataItem)}</pre></td>\n <td>${ooc ? html`<mwc-icon>done</mwc-icon>` : ''}</td>\n <td>${oos ? html`<mwc-icon>done</mwc-icon>` : ''}</td>\n </tr>\n `\n })}\n </table>\n\n <label><mwc-icon>build_circle</mwc-icon> correction activity</label>\n <textarea name=\"correctionActivity\"> </textarea>\n </form>`\n }\n\n private onChange(e: Event) {}\n\n private buildSpec(dataItem: DataItem) {\n return OxDataUseCase.elaborateDataItemSpec(this.dataSet!, dataItem)\n }\n\n private buildValue(dataItem: DataItem) {\n const { tag, type } = dataItem\n\n if (!this.dataSample) {\n return ''\n }\n\n const value = this.dataSample?.data[dataItem.tag]\n if (value === undefined) {\n return ''\n }\n const values = value instanceof Array ? value : [value]\n\n const elements = values.map((_: any, idx) => {\n const v = value[idx]\n\n switch (type) {\n case 'boolean':\n return html` <input type=\"checkbox\" name=${tag} .checked=${v} disabled />`\n break\n\n case 'select':\n case 'number':\n case 'string':\n default:\n return String(v === undefined ? '' : v)\n }\n })\n\n return type === 'boolean' ? elements : elements.join(', ')\n }\n\n private evaluateOOC(dataItem: DataItem, value: any) {\n return OxDataUseCase.evaluateItem(this.dataSet!, dataItem, value)\n }\n}\n"]}
@@ -0,0 +1,13 @@
1
+ import '@operato/input/ox-input-file.js';
2
+ import { LitElement } from 'lit';
3
+ import { DataSample, DataSet } from './types.js';
4
+ export declare class OxDataSampleView extends LitElement {
5
+ static styles: import("lit").CSSResult;
6
+ dataSet?: DataSet;
7
+ dataSample?: DataSample;
8
+ render(): import("lit-html").TemplateResult<1>;
9
+ private onChange;
10
+ private buildSpec;
11
+ private buildValue;
12
+ private evaluateOOC;
13
+ }
@@ -0,0 +1,168 @@
1
+ import { __decorate } from "tslib";
2
+ import '@operato/input/ox-input-file.js';
3
+ import { css, html, LitElement } from 'lit';
4
+ import { customElement, property } from 'lit/decorators.js';
5
+ import { OxDataUseCase } from './ox-data-use-case.js';
6
+ let OxDataSampleView = class OxDataSampleView extends LitElement {
7
+ render() {
8
+ var _a, _b;
9
+ const dataItems = ((_a = this.dataSet) === null || _a === void 0 ? void 0 : _a.dataItems.filter(item => item.active)) || [];
10
+ const data = ((_b = this.dataSample) === null || _b === void 0 ? void 0 : _b.data) || {};
11
+ const formatter = new Intl.DateTimeFormat(navigator.language, { dateStyle: 'full', timeStyle: 'short' });
12
+ const { name, description, collectedAt, workDate, workShift } = this.dataSample || {};
13
+ return html ` <h2>${name}</h2>
14
+ <p page-description>
15
+ ${description}<br /><br />
16
+ work date: ${workDate} ${workShift}<br />
17
+ collected at: ${formatter.format(new Date(collectedAt))}
18
+ </p>
19
+
20
+ <form @change=${(e) => this.onChange(e)}>
21
+ <table>
22
+ <tr>
23
+ <th item>item</th>
24
+ <th>description</th>
25
+ <th>unit</th>
26
+ <th value>value</th>
27
+ <th>specification</th>
28
+ <th>OOC</th>
29
+ <th>OOS</th>
30
+ </tr>
31
+ ${dataItems.map(dataItem => {
32
+ const { ooc, oos } = this.evaluateOOC(dataItem, data === null || data === void 0 ? void 0 : data[dataItem.tag]) || {};
33
+ const { name, description, unit } = dataItem;
34
+ return html `
35
+ <tr ?ooc=${ooc} ?oos=${oos}>
36
+ <td name>${name}</td>
37
+ <td>${description}</td>
38
+ <td>${unit}</td>
39
+ <td>${this.buildValue(dataItem)}</td>
40
+ <td><pre>${this.buildSpec(dataItem)}</pre></td>
41
+ <td>${ooc ? html `<mwc-icon>done</mwc-icon>` : ''}</td>
42
+ <td>${oos ? html `<mwc-icon>done</mwc-icon>` : ''}</td>
43
+ </tr>
44
+ `;
45
+ })}
46
+ </table>
47
+ </form>`;
48
+ }
49
+ onChange(e) { }
50
+ buildSpec(dataItem) {
51
+ return OxDataUseCase.elaborateDataItemSpec(this.dataSet, dataItem);
52
+ }
53
+ buildValue(dataItem) {
54
+ var _a;
55
+ const { tag, type } = dataItem;
56
+ if (!this.dataSample) {
57
+ return '';
58
+ }
59
+ const value = (_a = this.dataSample) === null || _a === void 0 ? void 0 : _a.data[dataItem.tag];
60
+ if (value === undefined) {
61
+ return '';
62
+ }
63
+ const values = value instanceof Array ? value : [value];
64
+ const elements = values.map((_, idx) => {
65
+ const v = value[idx];
66
+ switch (type) {
67
+ case 'boolean':
68
+ return html ` <input type="checkbox" name=${tag} .checked=${v} disabled />`;
69
+ break;
70
+ case 'select':
71
+ case 'number':
72
+ case 'string':
73
+ default:
74
+ return String(v === undefined ? '' : v);
75
+ }
76
+ });
77
+ return type === 'boolean' ? elements : elements.join(', ');
78
+ }
79
+ evaluateOOC(dataItem, value) {
80
+ return OxDataUseCase.evaluateItem(this.dataSet, dataItem, value);
81
+ }
82
+ };
83
+ OxDataSampleView.styles = css `
84
+ :host {
85
+ display: flex;
86
+ flex-direction: column;
87
+ background-color: var(--main-section-background-color);
88
+ }
89
+
90
+ form {
91
+ flex: 1;
92
+
93
+ display: flex;
94
+ flex-direction: column;
95
+ }
96
+
97
+ h2 {
98
+ margin: var(--title-margin);
99
+ padding-top: 25px;
100
+ font: var(--title-font);
101
+ color: var(--title-text-color);
102
+ }
103
+ [page-description] {
104
+ margin: var(--page-description-margin);
105
+ font: var(--page-description-font);
106
+ color: var(--page-description-color);
107
+ }
108
+
109
+ table {
110
+ border-collapse: collapse;
111
+ margin-bottom: var(--margin-default);
112
+ }
113
+ th {
114
+ padding: var(--th-padding);
115
+ border-top: var(--th-border-top);
116
+ border-bottom: var(--td-border-bottom);
117
+ text-transform: var(--th-text-transform);
118
+ font: var(--th-font);
119
+ color: var(--th-color);
120
+ text-align: left;
121
+ }
122
+ th[item] {
123
+ min-width: 100px;
124
+ }
125
+ th[value] {
126
+ min-width: 100px;
127
+ }
128
+ tr {
129
+ background-color: var(--tr-background-color);
130
+ }
131
+ tr:nth-child(odd) {
132
+ background-color: var(--tr-background-odd-color);
133
+ }
134
+ tr:hover {
135
+ background-color: var(--tr-background-hover-color);
136
+ }
137
+ tr[ooc],
138
+ tr[oos] {
139
+ background-color: #fefbdf;
140
+ }
141
+ td {
142
+ border-bottom: var(--td-border-bottom);
143
+ padding: var(--td-padding);
144
+ font: var(--td-font);
145
+ color: var(--td-color);
146
+ }
147
+ td[name] {
148
+ font-weight: bold;
149
+ }
150
+ td mwc-icon {
151
+ color: var(--status-danger-color);
152
+ }
153
+
154
+ pre {
155
+ tab-size: 2;
156
+ }
157
+ `;
158
+ __decorate([
159
+ property({ type: Object })
160
+ ], OxDataSampleView.prototype, "dataSet", void 0);
161
+ __decorate([
162
+ property({ type: Object })
163
+ ], OxDataSampleView.prototype, "dataSample", void 0);
164
+ OxDataSampleView = __decorate([
165
+ customElement('ox-data-sample-view')
166
+ ], OxDataSampleView);
167
+ export { OxDataSampleView };
168
+ //# sourceMappingURL=ox-data-sample-view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ox-data-sample-view.js","sourceRoot":"","sources":["../../src/ox-data-sample-view.ts"],"names":[],"mappings":"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","sourcesContent":["import '@operato/input/ox-input-file.js'\n\nimport { css, html, LitElement } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\n\nimport { OxDataUseCase } from './ox-data-use-case.js'\nimport { DataItem, DataSample, DataSet } from './types.js'\n\n@customElement('ox-data-sample-view')\nexport class OxDataSampleView extends LitElement {\n static styles = css`\n :host {\n display: flex;\n flex-direction: column;\n background-color: var(--main-section-background-color);\n }\n\n form {\n flex: 1;\n\n display: flex;\n flex-direction: column;\n }\n\n h2 {\n margin: var(--title-margin);\n padding-top: 25px;\n font: var(--title-font);\n color: var(--title-text-color);\n }\n [page-description] {\n margin: var(--page-description-margin);\n font: var(--page-description-font);\n color: var(--page-description-color);\n }\n\n table {\n border-collapse: collapse;\n margin-bottom: var(--margin-default);\n }\n th {\n padding: var(--th-padding);\n border-top: var(--th-border-top);\n border-bottom: var(--td-border-bottom);\n text-transform: var(--th-text-transform);\n font: var(--th-font);\n color: var(--th-color);\n text-align: left;\n }\n th[item] {\n min-width: 100px;\n }\n th[value] {\n min-width: 100px;\n }\n tr {\n background-color: var(--tr-background-color);\n }\n tr:nth-child(odd) {\n background-color: var(--tr-background-odd-color);\n }\n tr:hover {\n background-color: var(--tr-background-hover-color);\n }\n tr[ooc],\n tr[oos] {\n background-color: #fefbdf;\n }\n td {\n border-bottom: var(--td-border-bottom);\n padding: var(--td-padding);\n font: var(--td-font);\n color: var(--td-color);\n }\n td[name] {\n font-weight: bold;\n }\n td mwc-icon {\n color: var(--status-danger-color);\n }\n\n pre {\n tab-size: 2;\n }\n `\n\n @property({ type: Object }) dataSet?: DataSet\n @property({ type: Object }) dataSample?: DataSample\n\n render() {\n const dataItems = this.dataSet?.dataItems.filter(item => item.active) || []\n const data = this.dataSample?.data || {}\n const formatter = new Intl.DateTimeFormat(navigator.language, { dateStyle: 'full', timeStyle: 'short' })\n\n const { name, description, collectedAt, workDate, workShift } = this.dataSample || {}\n\n return html` <h2>${name}</h2>\n <p page-description>\n ${description}<br /><br />\n work date: ${workDate} ${workShift}<br />\n collected at: ${formatter.format(new Date(collectedAt!))}\n </p>\n\n <form @change=${(e: Event) => this.onChange(e)}>\n <table>\n <tr>\n <th item>item</th>\n <th>description</th>\n <th>unit</th>\n <th value>value</th>\n <th>specification</th>\n <th>OOC</th>\n <th>OOS</th>\n </tr>\n ${dataItems.map(dataItem => {\n const { ooc, oos } = this.evaluateOOC(dataItem, data?.[dataItem.tag]) || {}\n const { name, description, unit } = dataItem\n return html`\n <tr ?ooc=${ooc} ?oos=${oos}>\n <td name>${name}</td>\n <td>${description}</td>\n <td>${unit}</td>\n <td>${this.buildValue(dataItem)}</td>\n <td><pre>${this.buildSpec(dataItem)}</pre></td>\n <td>${ooc ? html`<mwc-icon>done</mwc-icon>` : ''}</td>\n <td>${oos ? html`<mwc-icon>done</mwc-icon>` : ''}</td>\n </tr>\n `\n })}\n </table>\n </form>`\n }\n\n private onChange(e: Event) {}\n\n private buildSpec(dataItem: DataItem) {\n return OxDataUseCase.elaborateDataItemSpec(this.dataSet!, dataItem)\n }\n\n private buildValue(dataItem: DataItem) {\n const { tag, type } = dataItem\n\n if (!this.dataSample) {\n return ''\n }\n\n const value = this.dataSample?.data[dataItem.tag]\n if (value === undefined) {\n return ''\n }\n const values = value instanceof Array ? value : [value]\n\n const elements = values.map((_: any, idx) => {\n const v = value[idx]\n\n switch (type) {\n case 'boolean':\n return html` <input type=\"checkbox\" name=${tag} .checked=${v} disabled />`\n break\n\n case 'select':\n case 'number':\n case 'string':\n default:\n return String(v === undefined ? '' : v)\n }\n })\n\n return type === 'boolean' ? elements : elements.join(', ')\n }\n\n private evaluateOOC(dataItem: DataItem, value: any) {\n return OxDataUseCase.evaluateItem(this.dataSet!, dataItem, value)\n }\n}\n"]}
@@ -0,0 +1,16 @@
1
+ import { DataItem, DataItemSpecSet, DataSet, EvaluationResult } from './types';
2
+ export declare abstract class OxDataUseCase {
3
+ static registry: {
4
+ [name: string]: OxDataUseCase;
5
+ };
6
+ static registerUseCase(name: string, useCase: OxDataUseCase): void;
7
+ static getUseCaseNames(): string[];
8
+ static getUseCases(): OxDataUseCase[];
9
+ static getUseCase(name: string): OxDataUseCase | undefined;
10
+ static elaborateDataItemSpec(dataSet: DataSet, dataItem: DataItem): string;
11
+ static evaluate(dataSet: DataSet, dataItems: DataItem[], data: any): EvaluationResult | undefined;
12
+ static evaluateItem(dataSet: DataSet, dataItem: DataItem, values: any | any[]): EvaluationResult | undefined;
13
+ abstract evaluate(specs: any, values: any[]): EvaluationResult | undefined;
14
+ abstract elaborateUseCaseSpec(spec: any): string | undefined;
15
+ abstract getSpecification(dataItem: DataItem): DataItemSpecSet;
16
+ }
@@ -0,0 +1,111 @@
1
+ export class OxDataUseCase {
2
+ static registerUseCase(name, useCase) {
3
+ OxDataUseCase.registry[name] = useCase;
4
+ }
5
+ static getUseCaseNames() {
6
+ return Object.keys(OxDataUseCase.registry);
7
+ }
8
+ static getUseCases() {
9
+ return Object.values(OxDataUseCase.registry);
10
+ }
11
+ static getUseCase(name) {
12
+ return OxDataUseCase.registry[name];
13
+ }
14
+ static elaborateDataItemSpec(dataSet, dataItem) {
15
+ var _a;
16
+ if (!dataSet.useCase) {
17
+ return '';
18
+ }
19
+ const useCaseNames = dataSet.useCase.split(',').map(useCaseName => useCaseName.trim());
20
+ const useCases = useCaseNames.map(useCaseName => OxDataUseCase.getUseCase(useCaseName)).filter(useCase => !!useCase);
21
+ var texts = [];
22
+ for (let j = 0; j < useCases.length; j++) {
23
+ const useCase = useCases[j];
24
+ if (!useCase) {
25
+ continue;
26
+ }
27
+ const specs = (_a = dataItem.spec) === null || _a === void 0 ? void 0 : _a[dataSet.useCase];
28
+ if (!specs) {
29
+ continue;
30
+ }
31
+ const result = useCase.elaborateUseCaseSpec(dataItem.spec);
32
+ if (!result) {
33
+ continue;
34
+ }
35
+ texts.push(result);
36
+ }
37
+ return texts.join('\n');
38
+ }
39
+ static evaluate(dataSet, dataItems, data) {
40
+ var _a;
41
+ var ooc = false;
42
+ var oos = false;
43
+ if (!dataSet.useCase) {
44
+ return { ooc, oos };
45
+ }
46
+ const useCaseNames = dataSet.useCase.split(',').map(useCaseName => useCaseName.trim());
47
+ const useCases = useCaseNames.map(useCaseName => OxDataUseCase.getUseCase(useCaseName)).filter(useCase => !!useCase);
48
+ for (let i = 0; i < dataItems.length; i++) {
49
+ const dataItem = dataItems[i];
50
+ const { active, tag } = dataItem;
51
+ if (!active || !tag) {
52
+ continue;
53
+ }
54
+ let values = data[tag];
55
+ if (typeof values === 'undefined') {
56
+ continue; // TODO what if in case no value ?
57
+ }
58
+ if (!(values instanceof Array)) {
59
+ values = [values];
60
+ }
61
+ for (let j = 0; j < useCases.length; j++) {
62
+ const useCase = useCases[j];
63
+ const specs = (_a = dataItem.spec) === null || _a === void 0 ? void 0 : _a[dataSet.useCase];
64
+ if (!specs) {
65
+ continue;
66
+ }
67
+ const result = useCase === null || useCase === void 0 ? void 0 : useCase.evaluate(specs, values);
68
+ if (result) {
69
+ ooc || (ooc = result.ooc);
70
+ oos || (oos = result.oos);
71
+ }
72
+ }
73
+ }
74
+ return { ooc, oos };
75
+ }
76
+ static evaluateItem(dataSet, dataItem, values) {
77
+ var _a;
78
+ var ooc = false;
79
+ var oos = false;
80
+ if (!dataSet.useCase) {
81
+ return { ooc, oos };
82
+ }
83
+ const useCaseNames = dataSet.useCase.split(',').map(useCaseName => useCaseName.trim());
84
+ const useCases = useCaseNames.map(useCaseName => OxDataUseCase.getUseCase(useCaseName)).filter(useCase => !!useCase);
85
+ const { active, tag } = dataItem;
86
+ if (!active || !tag) {
87
+ return;
88
+ }
89
+ if (typeof values === 'undefined') {
90
+ return; // TODO what if in case no value ?
91
+ }
92
+ if (!(values instanceof Array)) {
93
+ values = [values];
94
+ }
95
+ for (let j = 0; j < useCases.length; j++) {
96
+ const useCase = useCases[j];
97
+ const specs = (_a = dataItem.spec) === null || _a === void 0 ? void 0 : _a[dataSet.useCase];
98
+ if (!specs) {
99
+ return;
100
+ }
101
+ const result = useCase === null || useCase === void 0 ? void 0 : useCase.evaluate(specs, values);
102
+ if (result) {
103
+ ooc || (ooc = result.ooc);
104
+ oos || (oos = result.oos);
105
+ }
106
+ }
107
+ return { ooc, oos };
108
+ }
109
+ }
110
+ OxDataUseCase.registry = {};
111
+ //# sourceMappingURL=ox-data-use-case.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ox-data-use-case.js","sourceRoot":"","sources":["../../src/ox-data-use-case.ts"],"names":[],"mappings":"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","sourcesContent":["import { DataItem, DataItemSpecSet, DataSet, EvaluationResult } from './types'\n\nexport abstract class OxDataUseCase {\n static registry: { [name: string]: OxDataUseCase } = {}\n\n public static registerUseCase(name: string, useCase: OxDataUseCase) {\n OxDataUseCase.registry[name] = useCase\n }\n\n public static getUseCaseNames() {\n return Object.keys(OxDataUseCase.registry)\n }\n\n public static getUseCases(): OxDataUseCase[] {\n return Object.values(OxDataUseCase.registry)\n }\n\n public static getUseCase(name: string): OxDataUseCase | undefined {\n return OxDataUseCase.registry[name]\n }\n\n public static elaborateDataItemSpec(dataSet: DataSet, dataItem: DataItem): string {\n if (!dataSet.useCase) {\n return ''\n }\n\n const useCaseNames = dataSet.useCase.split(',').map(useCaseName => useCaseName.trim())\n const useCases = useCaseNames.map(useCaseName => OxDataUseCase.getUseCase(useCaseName)).filter(useCase => !!useCase)\n\n var texts = []\n\n for (let j = 0; j < useCases.length; j++) {\n const useCase = useCases[j]\n if (!useCase) {\n continue\n }\n\n const specs = dataItem.spec?.[dataSet.useCase]\n if (!specs) {\n continue\n }\n\n const result = useCase.elaborateUseCaseSpec(dataItem.spec)\n if (!result) {\n continue\n }\n\n texts.push(result)\n }\n\n return texts.join('\\n')\n }\n\n public static evaluate(dataSet: DataSet, dataItems: DataItem[], data: any): EvaluationResult | undefined {\n var ooc = false\n var oos = false\n\n if (!dataSet.useCase) {\n return { ooc, oos }\n }\n\n const useCaseNames = dataSet.useCase.split(',').map(useCaseName => useCaseName.trim())\n const useCases = useCaseNames.map(useCaseName => OxDataUseCase.getUseCase(useCaseName)).filter(useCase => !!useCase)\n\n for (let i = 0; i < dataItems.length; i++) {\n const dataItem = dataItems[i]\n const { active, tag } = dataItem\n if (!active || !tag) {\n continue\n }\n\n let values: any | any[] = data[tag]\n if (typeof values === 'undefined') {\n continue // TODO what if in case no value ?\n }\n\n if (!(values instanceof Array)) {\n values = [values]\n }\n\n for (let j = 0; j < useCases.length; j++) {\n const useCase = useCases[j]\n\n const specs = dataItem.spec?.[dataSet.useCase]\n if (!specs) {\n continue\n }\n\n const result = useCase?.evaluate(specs, values)\n\n if (result) {\n ooc ||= result.ooc\n oos ||= result.oos\n }\n }\n }\n\n return { ooc, oos }\n }\n\n public static evaluateItem(dataSet: DataSet, dataItem: DataItem, values: any | any[]): EvaluationResult | undefined {\n var ooc = false\n var oos = false\n\n if (!dataSet.useCase) {\n return { ooc, oos }\n }\n\n const useCaseNames = dataSet.useCase.split(',').map(useCaseName => useCaseName.trim())\n const useCases = useCaseNames.map(useCaseName => OxDataUseCase.getUseCase(useCaseName)).filter(useCase => !!useCase)\n\n const { active, tag } = dataItem\n if (!active || !tag) {\n return\n }\n\n if (typeof values === 'undefined') {\n return // TODO what if in case no value ?\n }\n\n if (!(values instanceof Array)) {\n values = [values]\n }\n\n for (let j = 0; j < useCases.length; j++) {\n const useCase = useCases[j]\n\n const specs = dataItem.spec?.[dataSet.useCase]\n if (!specs) {\n return\n }\n\n const result = useCase?.evaluate(specs, values)\n\n if (result) {\n ooc ||= result.ooc\n oos ||= result.oos\n }\n }\n\n return { ooc, oos }\n }\n\n public abstract evaluate(specs: any, values: any[]): EvaluationResult | undefined\n public abstract elaborateUseCaseSpec(spec: any): string | undefined\n public abstract getSpecification(dataItem: DataItem): DataItemSpecSet\n}\n"]}
@@ -0,0 +1,78 @@
1
+ export declare type SelectOption = {
2
+ text: string;
3
+ value: string;
4
+ };
5
+ export declare type SelectOptions = SelectOption[];
6
+ export declare type TypeOptions = {
7
+ options?: SelectOptions;
8
+ [prop: string]: any;
9
+ };
10
+ export declare type DataItem = {
11
+ name: string;
12
+ description: string;
13
+ sequence: number;
14
+ tag: string;
15
+ type: string;
16
+ active: boolean;
17
+ options: TypeOptions;
18
+ unit: string;
19
+ quota: number;
20
+ spec: {
21
+ [useCase: string]: any;
22
+ };
23
+ };
24
+ export declare type DataSet = {
25
+ name: string;
26
+ description: string;
27
+ type: 'manual' | 'automatic';
28
+ useCase: string;
29
+ active: boolean;
30
+ dataItems: DataItem[];
31
+ spec: {
32
+ [dataItem: string]: {
33
+ [useCase: string]: any;
34
+ };
35
+ };
36
+ };
37
+ export declare type DataItemSpec = {
38
+ type: string;
39
+ label: string;
40
+ name: string;
41
+ property?: {
42
+ [option: string]: any;
43
+ };
44
+ };
45
+ export declare type DataItemSpecSet = {
46
+ name: string;
47
+ description: string;
48
+ help: string;
49
+ specs: DataItemSpec[];
50
+ };
51
+ export declare type DataSample = {
52
+ name: string;
53
+ description: string;
54
+ data: any;
55
+ spec: any;
56
+ quota: number;
57
+ workDate: string;
58
+ workShift: string;
59
+ collectedAt: Date;
60
+ };
61
+ export declare type DataOocState = 'CREATED' | 'REVIEWED' | 'CORRECTED';
62
+ export declare type DataOoc = DataSample & {
63
+ state: DataOocState;
64
+ correctiveAction: string;
65
+ history: {
66
+ user: {
67
+ id: string;
68
+ name: string;
69
+ };
70
+ state: DataOocState;
71
+ comment: string;
72
+ timestamp: number;
73
+ }[];
74
+ };
75
+ export declare type EvaluationResult = {
76
+ oos: boolean;
77
+ ooc: boolean;
78
+ };
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"","sourcesContent":["export type SelectOption = { text: string; value: string }\nexport type SelectOptions = SelectOption[]\nexport type TypeOptions = {\n options?: SelectOptions\n [prop: string]: any\n}\n\nexport type DataItem = {\n name: string\n description: string\n sequence: number\n tag: string\n type: string\n active: boolean\n options: TypeOptions\n unit: string\n quota: number\n spec: { [useCase: string]: any }\n}\n\nexport type DataSet = {\n name: string\n description: string\n type: 'manual' | 'automatic'\n useCase: string\n active: boolean\n dataItems: DataItem[]\n spec: { [dataItem: string]: { [useCase: string]: any } }\n}\n\nexport type DataItemSpec = {\n type: string\n label: string\n name: string\n property?: { [option: string]: any }\n}\n\nexport type DataItemSpecSet = {\n name: string\n description: string\n help: string\n specs: DataItemSpec[]\n}\n\nexport type DataSample = {\n name: string\n description: string\n data: any\n spec: any\n quota: number\n workDate: string\n workShift: string\n collectedAt: Date\n}\n\nexport type DataOocState = 'CREATED' | 'REVIEWED' | 'CORRECTED'\n\nexport type DataOoc = DataSample & {\n state: DataOocState\n correctiveAction: string\n history: {\n user: {\n id: string\n name: string\n }\n state: DataOocState\n comment: string\n timestamp: number\n }[]\n}\n\nexport type EvaluationResult = { oos: boolean; ooc: boolean }\n"]}