@operato/dataset 1.0.0-beta.40 → 1.0.0-beta.44
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +33 -0
- package/dist/src/ox-data-sample-view.d.ts +0 -1
- package/dist/src/ox-data-sample-view.js +6 -8
- package/dist/src/ox-data-sample-view.js.map +1 -1
- package/dist/src/types.d.ts +8 -1
- package/dist/src/types.js.map +1 -1
- package/dist/src/usecase/ccp/ox-data-use-case-ccp.js +14 -14
- package/dist/src/usecase/ccp/ox-data-use-case-ccp.js.map +1 -1
- package/dist/src/usecase/ox-data-use-case.d.ts +1 -1
- package/dist/src/usecase/ox-data-use-case.js +1 -2
- package/dist/src/usecase/ox-data-use-case.js.map +1 -1
- package/dist/src/usecase/qc/ox-data-use-case-qc.js +7 -7
- package/dist/src/usecase/qc/ox-data-use-case-qc.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +12 -12
- package/src/ox-data-sample-view.ts +6 -9
- package/src/types.ts +9 -1
- package/src/usecase/ccp/ox-data-use-case-ccp.ts +14 -14
- package/src/usecase/ox-data-use-case.ts +1 -3
- package/src/usecase/qc/ox-data-use-case-qc.ts +7 -7
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,39 @@
|
|
|
3
3
|
All notable changes to this project will be documented in this file.
|
|
4
4
|
See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
|
|
5
5
|
|
|
6
|
+
## [1.0.0-beta.44](https://github.com/hatiolab/operato/compare/v1.0.0-beta.43...v1.0.0-beta.44) (2022-07-07)
|
|
7
|
+
|
|
8
|
+
**Note:** Version bump only for package @operato/dataset
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
## [1.0.0-beta.43](https://github.com/hatiolab/operato/compare/v1.0.0-beta.42...v1.0.0-beta.43) (2022-07-03)
|
|
15
|
+
|
|
16
|
+
**Note:** Version bump only for package @operato/dataset
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
## [1.0.0-beta.42](https://github.com/hatiolab/operato/compare/v1.0.0-beta.41...v1.0.0-beta.42) (2022-07-03)
|
|
23
|
+
|
|
24
|
+
**Note:** Version bump only for package @operato/dataset
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
## [1.0.0-beta.41](https://github.com/hatiolab/operato/compare/v1.0.0-beta.40...v1.0.0-beta.41) (2022-06-30)
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
### :bug: Bug Fix
|
|
34
|
+
|
|
35
|
+
* dataset ([44ee34a](https://github.com/hatiolab/operato/commit/44ee34a52b9d7597061e624067aaf3f7cde703c1))
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
|
|
6
39
|
## [1.0.0-beta.40](https://github.com/hatiolab/operato/compare/v1.0.0-beta.39...v1.0.0-beta.40) (2022-06-29)
|
|
7
40
|
|
|
8
41
|
|
|
@@ -6,8 +6,9 @@ import { i18next } from '@operato/i18n';
|
|
|
6
6
|
import { OxDataUseCase } from './usecase/ox-data-use-case.js';
|
|
7
7
|
let OxDataSampleView = class OxDataSampleView extends LitElement {
|
|
8
8
|
render() {
|
|
9
|
-
var { data = {},
|
|
9
|
+
var { useCase, data = {}, judgment, dataItems = [] } = this.dataSample || {};
|
|
10
10
|
const formatter = new Intl.DateTimeFormat(navigator.language, { dateStyle: 'full', timeStyle: 'short' });
|
|
11
|
+
const useCaseNames = (useCase === null || useCase === void 0 ? void 0 : useCase.split(',').filter(useCase => useCase.trim())) || [];
|
|
11
12
|
const { name, description, collectedAt, workDate, workShift } = this.dataSample || {};
|
|
12
13
|
/* TODO below converting logic should be removed after dataset migration */
|
|
13
14
|
if (!(dataItems instanceof Array)) {
|
|
@@ -39,14 +40,14 @@ let OxDataSampleView = class OxDataSampleView extends LitElement {
|
|
|
39
40
|
${dataItems.map(dataItem => {
|
|
40
41
|
const { name = '', tag = '', description = '', unit = '', spec = {} } = dataItem;
|
|
41
42
|
const value = data[tag];
|
|
42
|
-
const { ooc, oos } =
|
|
43
|
+
const { ooc, oos } = (judgment === null || judgment === void 0 ? void 0 : judgment[tag]) || {};
|
|
43
44
|
return html `
|
|
44
45
|
<tr ?ooc=${ooc} ?oos=${oos}>
|
|
45
46
|
<td name>${name}</td>
|
|
46
47
|
<td>${description}</td>
|
|
47
48
|
<td>${unit}</td>
|
|
48
49
|
<td>${this.buildValue(value)}</td>
|
|
49
|
-
<td><pre>${this.buildSpec(spec)}</pre></td>
|
|
50
|
+
<td><pre>${this.buildSpec(useCaseNames, spec)}</pre></td>
|
|
50
51
|
<td>${ooc ? html `<mwc-icon>done</mwc-icon>` : ''}</td>
|
|
51
52
|
<td>${oos ? html `<mwc-icon>done</mwc-icon>` : ''}</td>
|
|
52
53
|
</tr>
|
|
@@ -56,8 +57,8 @@ let OxDataSampleView = class OxDataSampleView extends LitElement {
|
|
|
56
57
|
</form>`;
|
|
57
58
|
}
|
|
58
59
|
onChange(e) { }
|
|
59
|
-
buildSpec(spec) {
|
|
60
|
-
return OxDataUseCase.elaborateDataItemSpec(spec);
|
|
60
|
+
buildSpec(useCaseNames, spec) {
|
|
61
|
+
return OxDataUseCase.elaborateDataItemSpec(useCaseNames, spec);
|
|
61
62
|
}
|
|
62
63
|
buildValue(value) {
|
|
63
64
|
if (value === undefined) {
|
|
@@ -75,9 +76,6 @@ let OxDataSampleView = class OxDataSampleView extends LitElement {
|
|
|
75
76
|
});
|
|
76
77
|
return typeof values[0] === 'boolean' ? elements : elements.join(', ');
|
|
77
78
|
}
|
|
78
|
-
evaluateOOC(spec, value) {
|
|
79
|
-
return OxDataUseCase.evaluateItem(spec, value);
|
|
80
|
-
}
|
|
81
79
|
};
|
|
82
80
|
OxDataSampleView.styles = css `
|
|
83
81
|
:host {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ox-data-sample-view.js","sourceRoot":"","sources":["../../src/ox-data-sample-view.ts"],"names":[],"mappings":";AAAA,OAAO,iCAAiC,CAAA;AAExC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,KAAK,CAAA;AAC3C,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAA;AAE3D,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAA;AAGvC,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAA;AAG7D,IAAa,gBAAgB,GAA7B,MAAa,gBAAiB,SAAQ,UAAU;IAwF9C,MAAM;QACJ,IAAI,EAAE,IAAI,GAAG,EAAE,EAAE,
|
|
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 { i18next } from '@operato/i18n'\n\nimport { DataSample, DataSpecLimitSet } from './types.js'\nimport { OxDataUseCase } from './usecase/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 }\n\n form {\n flex: 1;\n\n display: flex;\n flex-direction: column;\n }\n\n h2 {\n margin: var(--title-margin);\n font: var(--title-font);\n color: var(--title-text-color);\n text-transform: capitalize;\n }\n [page-description] {\n margin: var(--page-description-margin);\n opacity: 0.7;\n font: var(--page-description-font);\n color: var(--secondary-color);\n text-transform: capitalize;\n }\n [page-description] * {\n vertical-align: middle;\n }\n [page-description] mwc-icon {\n margin-top: -2px;\n font-size: 0.9rem;\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 }) dataSample?: DataSample\n\n render() {\n var { useCase, data = {}, judgment, dataItems = [] } = this.dataSample || {}\n const formatter = new Intl.DateTimeFormat(navigator.language, { dateStyle: 'full', timeStyle: 'short' })\n const useCaseNames = useCase?.split(',').filter(useCase => useCase.trim()) || []\n\n const { name, description, collectedAt, workDate, workShift } = this.dataSample || {}\n\n /* TODO below converting logic should be removed after dataset migration */\n if (!(dataItems instanceof Array)) {\n dataItems = Object.keys(dataItems).map(tag => {\n var dataItem = (dataItems as any)[tag]\n dataItem.tag = tag\n return dataItem\n })\n }\n\n return html` <h2>${name}</h2>\n <p page-description>\n <mwc-icon>info_outline</mwc-icon> ${description}<br />\n <mwc-icon>alarm</mwc-icon> ${i18next.t('field.work-date')}: ${workDate} ${workShift} |\n <mwc-icon>pending_actions</mwc-icon> ${i18next.t('field.collected-at')}:\n ${formatter.format(new Date(collectedAt!))}\n </p>\n\n <form @change=${(e: Event) => this.onChange(e)}>\n <table>\n <tr>\n <th item>${i18next.t('field.item')}</th>\n <th>${i18next.t('field.description')}</th>\n <th>${i18next.t('field.unit')}</th>\n <th value>${i18next.t('field.value')}</th>\n <th>${i18next.t('field.spec')}</th>\n <th>${i18next.t('field.ooc')}</th>\n <th>${i18next.t('field.oos')}</th>\n </tr>\n ${dataItems.map(dataItem => {\n const { name = '', tag = '', description = '', unit = '', spec = {} } = dataItem\n const value = data[tag]\n const { ooc, oos } = judgment?.[tag] || {}\n\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(value)}</td>\n <td><pre>${this.buildSpec(useCaseNames, spec)}</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(useCaseNames: string[], spec: DataSpecLimitSet): string {\n return OxDataUseCase.elaborateDataItemSpec(useCaseNames, spec)\n }\n\n private buildValue(value: any | any[]) {\n if (value === undefined) {\n return ''\n }\n const values = value instanceof Array ? value : [value]\n\n const elements = values.map((v: any, idx) => {\n switch (typeof v) {\n case 'boolean':\n return html` <input type=\"checkbox\" .checked=${v} disabled />`\n break\n\n default:\n return v === undefined ? '' : v\n }\n })\n\n return typeof values[0] === 'boolean' ? elements : elements.join(', ')\n }\n}\n"]}
|
package/dist/src/types.d.ts
CHANGED
|
@@ -59,12 +59,19 @@ export declare type DataSpecLimitSet = {
|
|
|
59
59
|
export declare type DataCollection = {
|
|
60
60
|
[tag: string]: any;
|
|
61
61
|
};
|
|
62
|
+
export declare type Judgment = {
|
|
63
|
+
[tag: string]: {
|
|
64
|
+
ooc: boolean;
|
|
65
|
+
oos: boolean;
|
|
66
|
+
};
|
|
67
|
+
};
|
|
62
68
|
export declare type DataSample = {
|
|
63
69
|
name: string;
|
|
64
70
|
description: string;
|
|
65
71
|
useCase: string;
|
|
66
72
|
data?: DataCollection;
|
|
67
|
-
|
|
73
|
+
judgment?: Judgment;
|
|
74
|
+
dataItems?: DataItem[];
|
|
68
75
|
quota: number;
|
|
69
76
|
workDate: string;
|
|
70
77
|
workShift: string;
|
package/dist/src/types.js.map
CHANGED
|
@@ -1 +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: {\n [useCase: string]: {\n [limit: string]: number | string | string[] | boolean\n }\n }\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 DataSpecDefinition = {\n type: string\n label: string\n name: string\n property?: { [option: string]: any }\n}\n\nexport type UseCaseDefinition = {\n name: string\n description: string\n help: string\n specs: DataSpecDefinition[]\n}\n\nexport type DataSpecLimit = {\n [limit: string]: number | string | string[] | boolean\n}\n\nexport type DataSpecLimitSet = {\n [useCase: string]: DataSpecLimit\n}\n\nexport type DataCollection = {\n [tag: string]: any\n}\n\nexport type DataSample = {\n name: string\n description: string\n useCase: string\n data?: DataCollection\n
|
|
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: {\n [useCase: string]: {\n [limit: string]: number | string | string[] | boolean\n }\n }\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 DataSpecDefinition = {\n type: string\n label: string\n name: string\n property?: { [option: string]: any }\n}\n\nexport type UseCaseDefinition = {\n name: string\n description: string\n help: string\n specs: DataSpecDefinition[]\n}\n\nexport type DataSpecLimit = {\n [limit: string]: number | string | string[] | boolean\n}\n\nexport type DataSpecLimitSet = {\n [useCase: string]: DataSpecLimit\n}\n\nexport type DataCollection = {\n [tag: string]: any\n}\n\nexport type Judgment = {\n [tag: string]: {\n ooc: boolean\n oos: boolean\n }\n}\n\nexport type DataSample = {\n name: string\n description: string\n useCase: string\n data?: DataCollection\n judgment?: Judgment\n dataItems?: DataItem[]\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"]}
|
|
@@ -35,30 +35,30 @@ export class OxDataUseCaseCCP extends OxDataUseCase {
|
|
|
35
35
|
var ooc = false;
|
|
36
36
|
for (let i = 0; i < values.length; i++) {
|
|
37
37
|
const value = values[i];
|
|
38
|
-
if (
|
|
38
|
+
if (criticalMinimum != null && value < criticalMinimum) {
|
|
39
39
|
oos = true;
|
|
40
40
|
break;
|
|
41
41
|
}
|
|
42
|
-
if (
|
|
42
|
+
if (criticalMaximum != null && value > criticalMaximum) {
|
|
43
43
|
oos = true;
|
|
44
44
|
break;
|
|
45
45
|
}
|
|
46
|
-
if (
|
|
46
|
+
if (criticalAcceptables != null && !criticalAcceptables.includes(value)) {
|
|
47
47
|
oos = true;
|
|
48
48
|
break;
|
|
49
49
|
}
|
|
50
50
|
}
|
|
51
51
|
for (let i = 0; i < values.length; i++) {
|
|
52
52
|
const value = values[i];
|
|
53
|
-
if (
|
|
53
|
+
if (targetMinimum != null && value < targetMinimum) {
|
|
54
54
|
ooc = true;
|
|
55
55
|
break;
|
|
56
56
|
}
|
|
57
|
-
if (
|
|
57
|
+
if (targetMaximum != null && value > targetMaximum) {
|
|
58
58
|
ooc = true;
|
|
59
59
|
break;
|
|
60
60
|
}
|
|
61
|
-
if (
|
|
61
|
+
if (targetAcceptables != null && !targetAcceptables.includes(value)) {
|
|
62
62
|
ooc = true;
|
|
63
63
|
break;
|
|
64
64
|
}
|
|
@@ -71,29 +71,29 @@ export class OxDataUseCaseCCP extends OxDataUseCase {
|
|
|
71
71
|
}
|
|
72
72
|
var text = '';
|
|
73
73
|
const { minimum: criticalMinimum, maximum: criticalMaximum, acceptables: criticalAcceptables } = limits['criticalLimits'] || {};
|
|
74
|
-
if (criticalMinimum
|
|
74
|
+
if (criticalMinimum != null || criticalMaximum != null || criticalAcceptables != null) {
|
|
75
75
|
text += `${i18next.t('label.critical-limits')}\n`;
|
|
76
76
|
}
|
|
77
|
-
if (criticalMinimum
|
|
77
|
+
if (criticalMinimum != null) {
|
|
78
78
|
text += `\t${i18next.t('label.minimum value')} : ${criticalMinimum}\n`;
|
|
79
79
|
}
|
|
80
|
-
if (criticalMaximum
|
|
80
|
+
if (criticalMaximum != null) {
|
|
81
81
|
text += `\t${i18next.t('label.maximum value')} : ${criticalMaximum}\n`;
|
|
82
82
|
}
|
|
83
|
-
if (criticalAcceptables
|
|
83
|
+
if (criticalAcceptables != null) {
|
|
84
84
|
text += `\t${i18next.t('label.acceptables')} : ${criticalAcceptables instanceof Array ? criticalAcceptables.join(', ') : criticalAcceptables}\n`;
|
|
85
85
|
}
|
|
86
86
|
const { minimum: targetMinimum, maximum: targetMaximum, acceptables: targetAcceptables } = limits['targetLimits'] || {};
|
|
87
|
-
if (targetMinimum
|
|
87
|
+
if (targetMinimum != null || targetMaximum != null || targetAcceptables != null) {
|
|
88
88
|
text += `${i18next.t('label.target-limits')}\n`;
|
|
89
89
|
}
|
|
90
|
-
if (targetMinimum
|
|
90
|
+
if (targetMinimum != null) {
|
|
91
91
|
text += `\t${i18next.t('label.minimum value')} : ${targetMinimum}\n`;
|
|
92
92
|
}
|
|
93
|
-
if (targetMaximum
|
|
93
|
+
if (targetMaximum != null) {
|
|
94
94
|
text += `\t${i18next.t('label.maximum value')} : ${targetMaximum}\n`;
|
|
95
95
|
}
|
|
96
|
-
if (targetAcceptables
|
|
96
|
+
if (targetAcceptables != null) {
|
|
97
97
|
text += `\t${i18next.t('label.acceptables')} : ${targetAcceptables instanceof Array ? targetAcceptables.join(', ') : targetAcceptables}\n`;
|
|
98
98
|
}
|
|
99
99
|
return text;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ox-data-use-case-ccp.js","sourceRoot":"","sources":["../../../../src/usecase/ccp/ox-data-use-case-ccp.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAA,CAAC,yEAAyE;AAGvG,OAAO,EAAE,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAEtD,MAAM,OAAO,gBAAiB,SAAQ,aAAa;IACjD,gBAAgB,CAAC,QAAkB;QACjC,OAAO;YACL,IAAI,EAAE,KAAK;YACX,WAAW,EAAE,kCAAkC;YAC/C,IAAI,EAAE,EAAE;YACR,KAAK,EAAE;gBACL;oBACE,IAAI,EAAE,YAAY,CAAC,gEAAgE;oBACnF,KAAK,EAAE,iBAAiB;oBACxB,IAAI,EAAE,gBAAgB;oBACtB,QAAQ,EAAE,QAAQ;iBACnB;gBACD;oBACE,IAAI,EAAE,YAAY;oBAClB,KAAK,EAAE,eAAe;oBACtB,IAAI,EAAE,cAAc;oBACpB,QAAQ,EAAE,QAAQ;iBACnB;aACF;SACF,CAAA;IACH,CAAC;IAED,QAAQ,CAAC,IAAS,EAAE,MAAmB;QACrC,IAAI,CAAC,IAAI,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;YAC1C,OAAM;SACP;QAED,IAAI,CAAC,CAAC,MAAM,YAAY,KAAK,CAAC,EAAE;YAC9B,MAAM,GAAG,CAAC,MAAM,CAAC,CAAA;SAClB;QAED,MAAM,EACJ,OAAO,EAAE,eAAe,EACxB,OAAO,EAAE,eAAe,EACxB,WAAW,EAAE,mBAAmB,EACjC,GAAG,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAA;QAEhC,MAAM,EACJ,OAAO,EAAE,aAAa,EACtB,OAAO,EAAE,aAAa,EACtB,WAAW,EAAE,iBAAiB,EAC/B,GAAG,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,CAAA;QAE9B,IAAI,GAAG,GAAG,KAAK,CAAA;QACf,IAAI,GAAG,GAAG,KAAK,CAAA;QAEf,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACtC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;YAEvB,IAAI,
|
|
1
|
+
{"version":3,"file":"ox-data-use-case-ccp.js","sourceRoot":"","sources":["../../../../src/usecase/ccp/ox-data-use-case-ccp.ts"],"names":[],"mappings":"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","sourcesContent":["import i18next from 'i18next' // Since this is a common module, @operato/i18n was deliberately avoided.\n\nimport { DataItem, EvaluationResult, UseCaseDefinition } from '../../types'\nimport { OxDataUseCase } from '../ox-data-use-case.js'\n\nexport class OxDataUseCaseCCP extends OxDataUseCase {\n getSpecification(dataItem: DataItem): UseCaseDefinition {\n return {\n name: 'CCP',\n description: 'Critical Control Point Data Spec',\n help: '',\n specs: [\n {\n type: 'ccp-limits' /* A value which seperates acceptability from unacceptability */,\n label: 'critical-limits',\n name: 'criticalLimits',\n property: dataItem\n },\n {\n type: 'ccp-limits',\n label: 'target-limits',\n name: 'targetLimits',\n property: dataItem\n }\n ]\n }\n }\n\n evaluate(spec: any, values: any | any[]): EvaluationResult | undefined {\n if (!spec || typeof values === 'undefined') {\n return\n }\n\n if (!(values instanceof Array)) {\n values = [values]\n }\n\n const {\n minimum: criticalMinimum,\n maximum: criticalMaximum,\n acceptables: criticalAcceptables\n } = spec['criticalLimits'] || {}\n\n const {\n minimum: targetMinimum,\n maximum: targetMaximum,\n acceptables: targetAcceptables\n } = spec['targetLimits'] || {}\n\n var oos = false\n var ooc = false\n\n for (let i = 0; i < values.length; i++) {\n const value = values[i]\n\n if (criticalMinimum != null && value < criticalMinimum) {\n oos = true\n break\n }\n\n if (criticalMaximum != null && value > criticalMaximum) {\n oos = true\n break\n }\n\n if (criticalAcceptables != null && !criticalAcceptables.includes(value)) {\n oos = true\n break\n }\n }\n\n for (let i = 0; i < values.length; i++) {\n const value = values[i]\n\n if (targetMinimum != null && value < targetMinimum) {\n ooc = true\n break\n }\n\n if (targetMaximum != null && value > targetMaximum) {\n ooc = true\n break\n }\n\n if (targetAcceptables != null && !targetAcceptables.includes(value)) {\n ooc = true\n break\n }\n }\n\n return { oos, ooc }\n }\n\n elaborateUseCaseSpec(limits: any): string | undefined {\n if (!limits) {\n return\n }\n\n var text = ''\n\n const {\n minimum: criticalMinimum,\n maximum: criticalMaximum,\n acceptables: criticalAcceptables\n } = limits['criticalLimits'] || {}\n\n if (criticalMinimum != null || criticalMaximum != null || criticalAcceptables != null) {\n text += `${i18next.t('label.critical-limits')}\\n`\n }\n\n if (criticalMinimum != null) {\n text += `\\t${i18next.t('label.minimum value')} : ${criticalMinimum}\\n`\n }\n if (criticalMaximum != null) {\n text += `\\t${i18next.t('label.maximum value')} : ${criticalMaximum}\\n`\n }\n if (criticalAcceptables != null) {\n text += `\\t${i18next.t('label.acceptables')} : ${\n criticalAcceptables instanceof Array ? criticalAcceptables.join(', ') : criticalAcceptables\n }\\n`\n }\n\n const {\n minimum: targetMinimum,\n maximum: targetMaximum,\n acceptables: targetAcceptables\n } = limits['targetLimits'] || {}\n\n if (targetMinimum != null || targetMaximum != null || targetAcceptables != null) {\n text += `${i18next.t('label.target-limits')}\\n`\n }\n\n if (targetMinimum != null) {\n text += `\\t${i18next.t('label.minimum value')} : ${targetMinimum}\\n`\n }\n if (targetMaximum != null) {\n text += `\\t${i18next.t('label.maximum value')} : ${targetMaximum}\\n`\n }\n if (targetAcceptables != null) {\n text += `\\t${i18next.t('label.acceptables')} : ${\n targetAcceptables instanceof Array ? targetAcceptables.join(', ') : targetAcceptables\n }\\n`\n }\n\n return text\n }\n}\n"]}
|
|
@@ -7,7 +7,7 @@ export declare abstract class OxDataUseCase {
|
|
|
7
7
|
static getUseCaseNames(): string[];
|
|
8
8
|
static getUseCases(): OxDataUseCase[];
|
|
9
9
|
static getUseCase(name: string): OxDataUseCase | undefined;
|
|
10
|
-
static elaborateDataItemSpec(spec: DataSpecLimitSet): string;
|
|
10
|
+
static elaborateDataItemSpec(useCaseNames: string[], spec: DataSpecLimitSet): string;
|
|
11
11
|
static evaluate(dataSet: DataSet, dataItems: DataItem[], data: any): EvaluationResult;
|
|
12
12
|
static evaluateItem(spec: DataSpecLimitSet, values: any | any[]): EvaluationResult | undefined;
|
|
13
13
|
abstract evaluate(specs: any, values: any[]): EvaluationResult | undefined;
|
|
@@ -11,8 +11,7 @@ export class OxDataUseCase {
|
|
|
11
11
|
static getUseCase(name) {
|
|
12
12
|
return OxDataUseCase.registry[name];
|
|
13
13
|
}
|
|
14
|
-
static elaborateDataItemSpec(spec) {
|
|
15
|
-
const useCaseNames = Object.keys(spec || {});
|
|
14
|
+
static elaborateDataItemSpec(useCaseNames, spec) {
|
|
16
15
|
var texts = [];
|
|
17
16
|
useCaseNames.forEach(useCaseName => {
|
|
18
17
|
const useCase = OxDataUseCase.getUseCase(useCaseName);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ox-data-use-case.js","sourceRoot":"","sources":["../../../src/usecase/ox-data-use-case.ts"],"names":[],"mappings":"AAEA,MAAM,OAAgB,aAAa;IAG1B,MAAM,CAAC,eAAe,CAAC,IAAY,EAAE,OAAsB;QAChE,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,OAAO,CAAA;IACxC,CAAC;IAEM,MAAM,CAAC,eAAe;QAC3B,OAAO,MAAM,CAAC,IAAI,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAA;IAC5C,CAAC;IAEM,MAAM,CAAC,WAAW;QACvB,OAAO,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAA;IAC9C,CAAC;IAEM,MAAM,CAAC,UAAU,CAAC,IAAY;QACnC,OAAO,aAAa,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;IACrC,CAAC;IAEM,MAAM,CAAC,qBAAqB,CAAC,
|
|
1
|
+
{"version":3,"file":"ox-data-use-case.js","sourceRoot":"","sources":["../../../src/usecase/ox-data-use-case.ts"],"names":[],"mappings":"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","sourcesContent":["import { DataItem, DataSet, DataSpecLimitSet, EvaluationResult, UseCaseDefinition } 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(useCaseNames: string[], spec: DataSpecLimitSet): string {\n var texts: string[] = []\n\n useCaseNames.forEach(useCaseName => {\n const useCase = OxDataUseCase.getUseCase(useCaseName)\n if (!useCase) {\n return\n }\n\n const limits = spec?.[useCaseName]\n if (!limits) {\n return\n }\n\n const result = useCase.elaborateUseCaseSpec(limits)\n if (!result) {\n return\n }\n\n texts.push(`[ ${useCaseName} ]`)\n texts.push(result)\n })\n\n return texts.join('\\n')\n }\n\n public static evaluate(dataSet: DataSet, dataItems: DataItem[], data: any): EvaluationResult {\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(spec: DataSpecLimitSet, values: any | any[]): EvaluationResult | undefined {\n var ooc = false\n var oos = false\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 const useCaseNames = Object.keys(spec || {})\n\n if (useCaseNames.length === 0) {\n return { ooc, oos }\n }\n\n useCaseNames.forEach(useCaseName => {\n const useCase = OxDataUseCase.getUseCase(useCaseName)\n if (!useCase) {\n return\n }\n\n const result = useCase?.evaluate(spec[useCaseName], 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): UseCaseDefinition\n}\n"]}
|
|
@@ -19,13 +19,13 @@ export class OxDataUseCaseQC {
|
|
|
19
19
|
const { minimum, maximum, acceptables } = spec['passLimits'];
|
|
20
20
|
for (let i = 0; i < values.length; i++) {
|
|
21
21
|
const value = values[i];
|
|
22
|
-
if (
|
|
22
|
+
if (minimum != null && value < minimum) {
|
|
23
23
|
return { oos: true, ooc: true };
|
|
24
24
|
}
|
|
25
|
-
if (
|
|
25
|
+
if (maximum != null && value > maximum) {
|
|
26
26
|
return { oos: true, ooc: true };
|
|
27
27
|
}
|
|
28
|
-
if (
|
|
28
|
+
if (acceptables != null && !acceptables.includes(value)) {
|
|
29
29
|
return { oos: true, ooc: true };
|
|
30
30
|
}
|
|
31
31
|
}
|
|
@@ -37,16 +37,16 @@ export class OxDataUseCaseQC {
|
|
|
37
37
|
}
|
|
38
38
|
var text = '';
|
|
39
39
|
const { minimum, maximum, acceptables } = limits['passLimits'] || {};
|
|
40
|
-
if (minimum
|
|
40
|
+
if (minimum != null || maximum != null || acceptables != null) {
|
|
41
41
|
text += `${i18next.t('label.pass-limits')}\n`;
|
|
42
42
|
}
|
|
43
|
-
if (minimum
|
|
43
|
+
if (minimum != null) {
|
|
44
44
|
text += `\t${i18next.t('label.minimum value')} : ${minimum}\n`;
|
|
45
45
|
}
|
|
46
|
-
if (maximum
|
|
46
|
+
if (maximum != null) {
|
|
47
47
|
text += `\t${i18next.t('label.maximum value')} : ${maximum}\n`;
|
|
48
48
|
}
|
|
49
|
-
if (acceptables
|
|
49
|
+
if (acceptables != null) {
|
|
50
50
|
text += `\t${i18next.t('label.acceptables')} : ${acceptables instanceof Array ? acceptables.join(', ') : acceptables}\n`;
|
|
51
51
|
}
|
|
52
52
|
return text;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ox-data-use-case-qc.js","sourceRoot":"","sources":["../../../../src/usecase/qc/ox-data-use-case-qc.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAA,CAAC,yEAAyE;AAKvG,MAAM,OAAO,eAAe;IAC1B,gBAAgB,CAAC,QAAkB;QACjC,OAAO;YACL,IAAI,EAAE,IAAI;YACV,WAAW,EAAE,2BAA2B;YACxC,IAAI,EAAE,EAAE;YACR,KAAK,EAAE;gBACL;oBACE,IAAI,EAAE,WAAW,CAAC,kEAAkE;oBACpF,KAAK,EAAE,aAAa;oBACpB,IAAI,EAAE,YAAY;oBAClB,QAAQ,EAAE,QAAQ;iBACnB;aACF;SACF,CAAA;IACH,CAAC;IAED,QAAQ,CAAC,IAAS,EAAE,MAAa;QAC/B,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,CAAA;QAE5D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACtC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;YAEvB,IAAI,OAAO,
|
|
1
|
+
{"version":3,"file":"ox-data-use-case-qc.js","sourceRoot":"","sources":["../../../../src/usecase/qc/ox-data-use-case-qc.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,SAAS,CAAA,CAAC,yEAAyE;AAKvG,MAAM,OAAO,eAAe;IAC1B,gBAAgB,CAAC,QAAkB;QACjC,OAAO;YACL,IAAI,EAAE,IAAI;YACV,WAAW,EAAE,2BAA2B;YACxC,IAAI,EAAE,EAAE;YACR,KAAK,EAAE;gBACL;oBACE,IAAI,EAAE,WAAW,CAAC,kEAAkE;oBACpF,KAAK,EAAE,aAAa;oBACpB,IAAI,EAAE,YAAY;oBAClB,QAAQ,EAAE,QAAQ;iBACnB;aACF;SACF,CAAA;IACH,CAAC;IAED,QAAQ,CAAC,IAAS,EAAE,MAAa;QAC/B,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC,YAAY,CAAC,CAAA;QAE5D,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;YACtC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,CAAA;YAEvB,IAAI,OAAO,IAAI,IAAI,IAAI,KAAK,GAAG,OAAO,EAAE;gBACtC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,CAAA;aAChC;YAED,IAAI,OAAO,IAAI,IAAI,IAAI,KAAK,GAAG,OAAO,EAAE;gBACtC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,CAAA;aAChC;YAED,IAAI,WAAW,IAAI,IAAI,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE;gBACvD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,EAAE,CAAA;aAChC;SACF;QAED,OAAO,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,CAAA;IACnC,CAAC;IAED,oBAAoB,CAAC,MAAW;QAC9B,IAAI,CAAC,MAAM,EAAE;YACX,OAAM;SACP;QAED,IAAI,IAAI,GAAG,EAAE,CAAA;QAEb,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,CAAA;QAEpE,IAAI,OAAO,IAAI,IAAI,IAAI,OAAO,IAAI,IAAI,IAAI,WAAW,IAAI,IAAI,EAAE;YAC7D,IAAI,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC,IAAI,CAAA;SAC9C;QAED,IAAI,OAAO,IAAI,IAAI,EAAE;YACnB,IAAI,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,qBAAqB,CAAC,MAAM,OAAO,IAAI,CAAA;SAC/D;QACD,IAAI,OAAO,IAAI,IAAI,EAAE;YACnB,IAAI,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,qBAAqB,CAAC,MAAM,OAAO,IAAI,CAAA;SAC/D;QACD,IAAI,WAAW,IAAI,IAAI,EAAE;YACvB,IAAI,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,mBAAmB,CAAC,MACzC,WAAW,YAAY,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,WAC1D,IAAI,CAAA;SACL;QAED,OAAO,IAAI,CAAA;IACb,CAAC;CACF","sourcesContent":["import i18next from 'i18next' // Since this is a common module, @operato/i18n was deliberately avoided.\n\nimport { DataItem, EvaluationResult, UseCaseDefinition } from '../../types.js'\nimport { OxDataUseCase } from '../ox-data-use-case.js'\n\nexport class OxDataUseCaseQC implements OxDataUseCase {\n getSpecification(dataItem: DataItem): UseCaseDefinition {\n return {\n name: 'QC',\n description: 'Quality Control Data Spec',\n help: '',\n specs: [\n {\n type: 'qc-limits' /* 'A value which seperates acceptability from unacceptability' */,\n label: 'pass-limits',\n name: 'passLimits',\n property: dataItem\n }\n ]\n }\n }\n\n evaluate(spec: any, values: any[]): EvaluationResult {\n const { minimum, maximum, acceptables } = spec['passLimits']\n\n for (let i = 0; i < values.length; i++) {\n const value = values[i]\n\n if (minimum != null && value < minimum) {\n return { oos: true, ooc: true }\n }\n\n if (maximum != null && value > maximum) {\n return { oos: true, ooc: true }\n }\n\n if (acceptables != null && !acceptables.includes(value)) {\n return { oos: true, ooc: true }\n }\n }\n\n return { oos: false, ooc: false }\n }\n\n elaborateUseCaseSpec(limits: any): string | undefined {\n if (!limits) {\n return\n }\n\n var text = ''\n\n const { minimum, maximum, acceptables } = limits['passLimits'] || {}\n\n if (minimum != null || maximum != null || acceptables != null) {\n text += `${i18next.t('label.pass-limits')}\\n`\n }\n\n if (minimum != null) {\n text += `\\t${i18next.t('label.minimum value')} : ${minimum}\\n`\n }\n if (maximum != null) {\n text += `\\t${i18next.t('label.maximum value')} : ${maximum}\\n`\n }\n if (acceptables != null) {\n text += `\\t${i18next.t('label.acceptables')} : ${\n acceptables instanceof Array ? acceptables.join(', ') : acceptables\n }\\n`\n }\n\n return text\n }\n}\n"]}
|