@operato/dataset 0.4.4

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 (44) hide show
  1. package/.editorconfig +29 -0
  2. package/.storybook/main.js +3 -0
  3. package/.storybook/server.mjs +8 -0
  4. package/CHANGELOG.md +11 -0
  5. package/LICENSE +21 -0
  6. package/README.md +75 -0
  7. package/demo/index.html +102 -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 +1 -0
  18. package/dist/src/index.js +2 -0
  19. package/dist/src/index.js.map +1 -0
  20. package/dist/src/ox-data-entry-form.d.ts +31 -0
  21. package/dist/src/ox-data-entry-form.js +83 -0
  22. package/dist/src/ox-data-entry-form.js.map +1 -0
  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 +11 -0
  27. package/dist/src/ox-data-ooc-view.js +75 -0
  28. package/dist/src/ox-data-ooc-view.js.map +1 -0
  29. package/dist/src/ox-data-sample-view.d.ts +13 -0
  30. package/dist/src/ox-data-sample-view.js +169 -0
  31. package/dist/src/ox-data-sample-view.js.map +1 -0
  32. package/dist/src/ox-data-use-case.d.ts +16 -0
  33. package/dist/src/ox-data-use-case.js +111 -0
  34. package/dist/src/ox-data-use-case.js.map +1 -0
  35. package/dist/src/types.d.ts +78 -0
  36. package/dist/src/types.js +2 -0
  37. package/dist/src/types.js.map +1 -0
  38. package/dist/tsconfig.tsbuildinfo +1 -0
  39. package/package.json +80 -0
  40. package/src/index.ts +1 -0
  41. package/src/ox-data-entry-form.ts +117 -0
  42. package/tsconfig.json +23 -0
  43. package/web-dev-server.config.mjs +27 -0
  44. package/web-test-runner.config.mjs +41 -0
@@ -0,0 +1,77 @@
1
+ import { __decorate } from "tslib";
2
+ import '@operato/property-editor/ox-properties-dynamic-view.js';
3
+ import { css, html, LitElement } from 'lit';
4
+ import { customElement, property, queryAll, state } from 'lit/decorators.js';
5
+ import { OxDataUseCase } from './ox-data-use-case.js';
6
+ let OxDataItemSpec = class OxDataItemSpec extends LitElement {
7
+ constructor() {
8
+ super(...arguments);
9
+ this.dataItemSpecSets = [];
10
+ }
11
+ render() {
12
+ return html `<form @property-change=${(e) => this.onChange(e)}>
13
+ ${this.dataItemSpecSets.map(({ name, description, specs }) => {
14
+ var _a;
15
+ return html ` <div specName>${name}</div>
16
+ <div description>${description}</div>
17
+ <ox-properties-dynamic-view data-name=${name} .props=${specs} .value=${(_a = this.value) === null || _a === void 0 ? void 0 : _a[name]}>
18
+ </ox-properties-dynamic-view>`;
19
+ })}
20
+ </form>`;
21
+ }
22
+ updated(changes) {
23
+ if (changes.has('dataItem')) {
24
+ this.dataItemSpecSets = OxDataUseCase.getUseCases().map(useCase => useCase.getSpecification(this.dataItem));
25
+ }
26
+ }
27
+ onChange(e) {
28
+ this.value = this.buildValue();
29
+ this.dispatchEvent(new CustomEvent('change', {
30
+ bubbles: true,
31
+ composed: true,
32
+ detail: { ...this.value }
33
+ }));
34
+ }
35
+ buildValue() {
36
+ var value = {};
37
+ this.specSetViews.forEach(view => (value[view.getAttribute('data-name')] = view.value));
38
+ return value;
39
+ }
40
+ };
41
+ OxDataItemSpec.styles = css `
42
+ :host {
43
+ display: flex;
44
+ flex-direction: row;
45
+ border-bottom: var(--border-dark-color);
46
+ padding: var(--margin-default) 0;
47
+ }
48
+ [specName] {
49
+ font: var(--legend-font);
50
+ color: var(--legend-text-color);
51
+ }
52
+ [description] {
53
+ font: var(--form-sublabel-font);
54
+ opacity: 0.8;
55
+ }
56
+
57
+ form {
58
+ flex: 1;
59
+ }
60
+ `;
61
+ __decorate([
62
+ property({ type: Object })
63
+ ], OxDataItemSpec.prototype, "value", void 0);
64
+ __decorate([
65
+ property({ type: Object })
66
+ ], OxDataItemSpec.prototype, "dataItem", void 0);
67
+ __decorate([
68
+ state()
69
+ ], OxDataItemSpec.prototype, "dataItemSpecSets", void 0);
70
+ __decorate([
71
+ queryAll('ox-properties-dynamic-view')
72
+ ], OxDataItemSpec.prototype, "specSetViews", void 0);
73
+ OxDataItemSpec = __decorate([
74
+ customElement('ox-data-item-spec')
75
+ ], OxDataItemSpec);
76
+ export { OxDataItemSpec };
77
+ //# sourceMappingURL=ox-data-item-spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ox-data-item-spec.js","sourceRoot":"","sources":["../../src/ox-data-item-spec.ts"],"names":[],"mappings":";AAAA,OAAO,wDAAwD,CAAA;AAE/D,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,UAAU,EAAkB,MAAM,KAAK,CAAA;AAC3D,OAAO,EAAE,aAAa,EAAE,QAAQ,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAA;AAE5E,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAA;AAIrD,IAAa,cAAc,GAA3B,MAAa,cAAe,SAAQ,UAAU;IAA9C;;QAyBW,qBAAgB,GAAsB,EAAE,CAAA;IAuCnD,CAAC;IAnCC,MAAM;QACJ,OAAO,IAAI,CAAA,0BAA0B,CAAC,CAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC/D,IAAI,CAAC,gBAAgB,CAAC,GAAG,CACzB,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,EAAE,EAAE;;YAAC,OAAA,IAAI,CAAA,kBAAkB,IAAI;6BACvC,WAAW;kDACU,IAAI,WAAW,KAAK,WAAW,MAAA,IAAI,CAAC,KAAK,0CAAG,IAAI,CAAC;wCAC3D,CAAA;SAAA,CACjC;YACK,CAAA;IACV,CAAC;IAED,OAAO,CAAC,OAA6B;QACnC,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE;YAC3B,IAAI,CAAC,gBAAgB,GAAG,aAAa,CAAC,WAAW,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,CAAC,QAAS,CAAC,CAAC,CAAA;SAC7G;IACH,CAAC;IAEO,QAAQ,CAAC,CAAQ;QACvB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,UAAU,EAAE,CAAA;QAE9B,IAAI,CAAC,aAAa,CAChB,IAAI,WAAW,CAAC,QAAQ,EAAE;YACxB,OAAO,EAAE,IAAI;YACb,QAAQ,EAAE,IAAI;YACd,MAAM,EAAE,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE;SAC1B,CAAC,CACH,CAAA;IACH,CAAC;IAEO,UAAU;QAChB,IAAI,KAAK,GAAG,EAAS,CAAA;QACrB,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,WAAW,CAAE,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;QAExF,OAAO,KAAK,CAAA;IACd,CAAC;CACF,CAAA;AA/DQ,qBAAM,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;GAmBlB,CAAA;AAE2B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;6CAAuC;AACtC;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;gDAAoB;AAEtC;IAAR,KAAK,EAAE;wDAAyC;AAET;IAAvC,QAAQ,CAAC,4BAA4B,CAAC;oDAAwD;AA3BpF,cAAc;IAD1B,aAAa,CAAC,mBAAmB,CAAC;GACtB,cAAc,CAgE1B;SAhEY,cAAc","sourcesContent":["import '@operato/property-editor/ox-properties-dynamic-view.js'\n\nimport { css, html, LitElement, PropertyValues } from 'lit'\nimport { customElement, property, queryAll, state } from 'lit/decorators.js'\n\nimport { OxDataUseCase } from './ox-data-use-case.js'\nimport { DataItem, DataItemSpecSet } from './types.js'\n\n@customElement('ox-data-item-spec')\nexport class OxDataItemSpec extends LitElement {\n static styles = css`\n :host {\n display: flex;\n flex-direction: row;\n border-bottom: var(--border-dark-color);\n padding: var(--margin-default) 0;\n }\n [specName] {\n font: var(--legend-font);\n color: var(--legend-text-color);\n }\n [description] {\n font: var(--form-sublabel-font);\n opacity: 0.8;\n }\n\n form {\n flex: 1;\n }\n `\n\n @property({ type: Object }) value?: { [specSetName: string]: any }\n @property({ type: Object }) dataItem?: DataItem\n\n @state() dataItemSpecSets: DataItemSpecSet[] = []\n\n @queryAll('ox-properties-dynamic-view') specSetViews!: NodeListOf<HTMLElement & { value: any }>\n\n render() {\n return html`<form @property-change=${(e: Event) => this.onChange(e)}>\n ${this.dataItemSpecSets.map(\n ({ name, description, specs }) => html` <div specName>${name}</div>\n <div description>${description}</div>\n <ox-properties-dynamic-view data-name=${name} .props=${specs} .value=${this.value?.[name]}>\n </ox-properties-dynamic-view>`\n )}\n </form>`\n }\n\n updated(changes: PropertyValues<this>) {\n if (changes.has('dataItem')) {\n this.dataItemSpecSets = OxDataUseCase.getUseCases().map(useCase => useCase.getSpecification(this.dataItem!))\n }\n }\n\n private onChange(e: Event) {\n this.value = this.buildValue()\n\n this.dispatchEvent(\n new CustomEvent('change', {\n bubbles: true,\n composed: true,\n detail: { ...this.value }\n })\n )\n }\n\n private buildValue() {\n var value = {} as any\n this.specSetViews.forEach(view => (value[view.getAttribute('data-name')!] = view.value))\n\n return value\n }\n}\n"]}
@@ -0,0 +1,11 @@
1
+ import '@operato/input/ox-input-file.js';
2
+ import './ox-data-sample-view';
3
+ import '@material/mwc-icon';
4
+ import { LitElement } from 'lit';
5
+ import { DataOoc, DataSet } from './types.js';
6
+ export declare class OxDataOocView extends LitElement {
7
+ static styles: import("lit").CSSResult;
8
+ dataSet?: DataSet;
9
+ dataOoc?: DataOoc;
10
+ render(): import("lit-html").TemplateResult<1>;
11
+ }
@@ -0,0 +1,75 @@
1
+ import { __decorate } from "tslib";
2
+ import '@operato/input/ox-input-file.js';
3
+ import './ox-data-sample-view';
4
+ import '@material/mwc-icon';
5
+ import { css, html, LitElement } from 'lit';
6
+ import { customElement, property } from 'lit/decorators.js';
7
+ import { i18next } from '@operato/i18n';
8
+ let OxDataOocView = class OxDataOocView extends LitElement {
9
+ render() {
10
+ var _a, _b;
11
+ const history = ((_a = this.dataOoc) === null || _a === void 0 ? void 0 : _a.history) || [];
12
+ const formatter = new Intl.DateTimeFormat(navigator.language, { dateStyle: 'full', timeStyle: 'short' });
13
+ return html `
14
+ <ox-data-sample-view .dataSample=${this.dataOoc} .dataSet=${this.dataSet}></ox-data-sample-view>
15
+
16
+ <h3 state>${((_b = this.dataOoc) === null || _b === void 0 ? void 0 : _b.state) || ''}</h3>
17
+
18
+ <h3>${i18next.t('title.history')}</h3>
19
+ ${history.map(({ user, state, comment, timestamp }) => html `
20
+ <p page-description>
21
+ ${formatter.format(new Date(timestamp))}
22
+ <br />
23
+ ${state} <mwc-icon>account_circle</mwc-icon> ${user.name}
24
+ <br />
25
+ ${comment}
26
+ </p>
27
+ `)}
28
+ `;
29
+ }
30
+ };
31
+ OxDataOocView.styles = css `
32
+ :host {
33
+ display: flex;
34
+ flex-direction: column;
35
+ background-color: var(--main-section-background-color);
36
+ padding: var(--padding-wide);
37
+
38
+ position: relative;
39
+ }
40
+
41
+ h3 {
42
+ margin: var(--title-margin);
43
+ padding-top: 12px;
44
+ font: var(--title-font);
45
+ color: var(--title-text-color);
46
+ }
47
+
48
+ h3[state] {
49
+ position: absolute;
50
+
51
+ right: 20px;
52
+ top: 25px;
53
+ }
54
+
55
+ mwc-icon {
56
+ font-size: 16px;
57
+ }
58
+
59
+ [page-description] {
60
+ margin: var(--page-description-margin);
61
+ font: var(--page-description-font);
62
+ color: var(--page-description-color);
63
+ }
64
+ `;
65
+ __decorate([
66
+ property({ type: Object })
67
+ ], OxDataOocView.prototype, "dataSet", void 0);
68
+ __decorate([
69
+ property({ type: Object })
70
+ ], OxDataOocView.prototype, "dataOoc", void 0);
71
+ OxDataOocView = __decorate([
72
+ customElement('ox-data-ooc-view')
73
+ ], OxDataOocView);
74
+ export { OxDataOocView };
75
+ //# sourceMappingURL=ox-data-ooc-view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ox-data-ooc-view.js","sourceRoot":"","sources":["../../src/ox-data-ooc-view.ts"],"names":[],"mappings":";AAAA,OAAO,iCAAiC,CAAA;AACxC,OAAO,uBAAuB,CAAA;AAC9B,OAAO,oBAAoB,CAAA;AAE3B,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;AAKvC,IAAa,aAAa,GAA1B,MAAa,aAAc,SAAQ,UAAU;IAuC3C,MAAM;;QACJ,MAAM,OAAO,GAAG,CAAA,MAAA,IAAI,CAAC,OAAO,0CAAE,OAAO,KAAI,EAAE,CAAA;QAC3C,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;yCAC0B,IAAI,CAAC,OAAO,aAAa,IAAI,CAAC,OAAO;;kBAE5D,CAAA,MAAA,IAAI,CAAC,OAAO,0CAAE,KAAK,KAAI,EAAE;;YAE/B,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;QAC9B,OAAO,CAAC,GAAG,CACX,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,IAAI,CAAA;;cAEvC,SAAS,CAAC,MAAM,CAAC,IAAI,IAAI,CAAC,SAAS,CAAC,CAAC;;cAErC,KAAK,wCAAwC,IAAI,CAAC,IAAI;;cAEtD,OAAO;;SAEZ,CACF;KACF,CAAA;IACH,CAAC;CACF,CAAA;AA7DQ,oBAAM,GAAG,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiClB,CAAA;AAE2B;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;8CAAkB;AACjB;IAA3B,QAAQ,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;8CAAkB;AArClC,aAAa;IADzB,aAAa,CAAC,kBAAkB,CAAC;GACrB,aAAa,CA8DzB;SA9DY,aAAa","sourcesContent":["import '@operato/input/ox-input-file.js'\nimport './ox-data-sample-view'\nimport '@material/mwc-icon'\n\nimport { css, html, LitElement } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\n\nimport { i18next } from '@operato/i18n'\n\nimport { DataOoc, DataSet } from './types.js'\n\n@customElement('ox-data-ooc-view')\nexport class OxDataOocView 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 position: relative;\n }\n\n h3 {\n margin: var(--title-margin);\n padding-top: 12px;\n font: var(--title-font);\n color: var(--title-text-color);\n }\n\n h3[state] {\n position: absolute;\n\n right: 20px;\n top: 25px;\n }\n\n mwc-icon {\n font-size: 16px;\n }\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\n @property({ type: Object }) dataSet?: DataSet\n @property({ type: Object }) dataOoc?: DataOoc\n\n render() {\n const history = this.dataOoc?.history || []\n const formatter = new Intl.DateTimeFormat(navigator.language, { dateStyle: 'full', timeStyle: 'short' })\n\n return html`\n <ox-data-sample-view .dataSample=${this.dataOoc} .dataSet=${this.dataSet}></ox-data-sample-view>\n\n <h3 state>${this.dataOoc?.state || ''}</h3>\n\n <h3>${i18next.t('title.history')}</h3>\n ${history.map(\n ({ user, state, comment, timestamp }) => html`\n <p page-description>\n ${formatter.format(new Date(timestamp))}\n <br />\n ${state} <mwc-icon>account_circle</mwc-icon> ${user.name}\n <br />\n ${comment}\n </p>\n `\n )}\n `\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,169 @@
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 { i18next } from '@operato/i18n';
6
+ import { OxDataUseCase } from './ox-data-use-case.js';
7
+ let OxDataSampleView = class OxDataSampleView extends LitElement {
8
+ render() {
9
+ var _a, _b;
10
+ const dataItems = ((_a = this.dataSet) === null || _a === void 0 ? void 0 : _a.dataItems.filter(item => item.active)) || [];
11
+ const data = ((_b = this.dataSample) === null || _b === void 0 ? void 0 : _b.data) || {};
12
+ const formatter = new Intl.DateTimeFormat(navigator.language, { dateStyle: 'full', timeStyle: 'short' });
13
+ const { name, description, collectedAt, workDate, workShift } = this.dataSample || {};
14
+ return html ` <h2>${i18next.t('field.name')}</h2>
15
+ <p page-description>
16
+ ${i18next.t('field.description')}<br /><br />
17
+ ${i18next.t('field.work-date')}: ${workDate} ${workShift}<br />
18
+ ${i18next.t('field.collected-at')}: ${formatter.format(new Date(collectedAt))}
19
+ </p>
20
+
21
+ <form @change=${(e) => this.onChange(e)}>
22
+ <table>
23
+ <tr>
24
+ <th item>${i18next.t('field.item')}</th>
25
+ <th>${i18next.t('field.description')}</th>
26
+ <th>${i18next.t('field.unit')}</th>
27
+ <th value>${i18next.t('field.value')}</th>
28
+ <th>${i18next.t('field.spec')}</th>
29
+ <th>${i18next.t('field.ooc')}</th>
30
+ <th>${i18next.t('field.oos')}</th>
31
+ </tr>
32
+ ${dataItems.map(dataItem => {
33
+ const { ooc, oos } = this.evaluateOOC(dataItem, data === null || data === void 0 ? void 0 : data[dataItem.tag]) || {};
34
+ const { name, description, unit } = dataItem;
35
+ return html `
36
+ <tr ?ooc=${ooc} ?oos=${oos}>
37
+ <td name>${name}</td>
38
+ <td>${description}</td>
39
+ <td>${unit}</td>
40
+ <td>${this.buildValue(dataItem)}</td>
41
+ <td><pre>${this.buildSpec(dataItem)}</pre></td>
42
+ <td>${ooc ? html `<mwc-icon>done</mwc-icon>` : ''}</td>
43
+ <td>${oos ? html `<mwc-icon>done</mwc-icon>` : ''}</td>
44
+ </tr>
45
+ `;
46
+ })}
47
+ </table>
48
+ </form>`;
49
+ }
50
+ onChange(e) { }
51
+ buildSpec(dataItem) {
52
+ return OxDataUseCase.elaborateDataItemSpec(this.dataSet, dataItem);
53
+ }
54
+ buildValue(dataItem) {
55
+ var _a;
56
+ const { tag, type } = dataItem;
57
+ if (!this.dataSample) {
58
+ return '';
59
+ }
60
+ const value = (_a = this.dataSample) === null || _a === void 0 ? void 0 : _a.data[dataItem.tag];
61
+ if (value === undefined) {
62
+ return '';
63
+ }
64
+ const values = value instanceof Array ? value : [value];
65
+ const elements = values.map((_, idx) => {
66
+ const v = value[idx];
67
+ switch (type) {
68
+ case 'boolean':
69
+ return html ` <input type="checkbox" name=${tag} .checked=${v} disabled />`;
70
+ break;
71
+ case 'select':
72
+ case 'number':
73
+ case 'string':
74
+ default:
75
+ return String(v === undefined ? '' : v);
76
+ }
77
+ });
78
+ return type === 'boolean' ? elements : elements.join(', ');
79
+ }
80
+ evaluateOOC(dataItem, value) {
81
+ return OxDataUseCase.evaluateItem(this.dataSet, dataItem, value);
82
+ }
83
+ };
84
+ OxDataSampleView.styles = css `
85
+ :host {
86
+ display: flex;
87
+ flex-direction: column;
88
+ background-color: var(--main-section-background-color);
89
+ }
90
+
91
+ form {
92
+ flex: 1;
93
+
94
+ display: flex;
95
+ flex-direction: column;
96
+ }
97
+
98
+ h2 {
99
+ margin: var(--title-margin);
100
+ padding-top: 25px;
101
+ font: var(--title-font);
102
+ color: var(--title-text-color);
103
+ }
104
+ [page-description] {
105
+ margin: var(--page-description-margin);
106
+ font: var(--page-description-font);
107
+ color: var(--page-description-color);
108
+ }
109
+
110
+ table {
111
+ border-collapse: collapse;
112
+ margin-bottom: var(--margin-default);
113
+ }
114
+ th {
115
+ padding: var(--th-padding);
116
+ border-top: var(--th-border-top);
117
+ border-bottom: var(--td-border-bottom);
118
+ text-transform: var(--th-text-transform);
119
+ font: var(--th-font);
120
+ color: var(--th-color);
121
+ text-align: left;
122
+ }
123
+ th[item] {
124
+ min-width: 100px;
125
+ }
126
+ th[value] {
127
+ min-width: 100px;
128
+ }
129
+ tr {
130
+ background-color: var(--tr-background-color);
131
+ }
132
+ tr:nth-child(odd) {
133
+ background-color: var(--tr-background-odd-color);
134
+ }
135
+ tr:hover {
136
+ background-color: var(--tr-background-hover-color);
137
+ }
138
+ tr[ooc],
139
+ tr[oos] {
140
+ background-color: #fefbdf;
141
+ }
142
+ td {
143
+ border-bottom: var(--td-border-bottom);
144
+ padding: var(--td-padding);
145
+ font: var(--td-font);
146
+ color: var(--td-color);
147
+ }
148
+ td[name] {
149
+ font-weight: bold;
150
+ }
151
+ td mwc-icon {
152
+ color: var(--status-danger-color);
153
+ }
154
+
155
+ pre {
156
+ tab-size: 2;
157
+ }
158
+ `;
159
+ __decorate([
160
+ property({ type: Object })
161
+ ], OxDataSampleView.prototype, "dataSet", void 0);
162
+ __decorate([
163
+ property({ type: Object })
164
+ ], OxDataSampleView.prototype, "dataSample", void 0);
165
+ OxDataSampleView = __decorate([
166
+ customElement('ox-data-sample-view')
167
+ ], OxDataSampleView);
168
+ export { OxDataSampleView };
169
+ //# 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 { i18next } from '@operato/i18n'\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>${i18next.t('field.name')}</h2>\n <p page-description>\n ${i18next.t('field.description')}<br /><br />\n ${i18next.t('field.work-date')}: ${workDate} ${workShift}<br />\n ${i18next.t('field.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>${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 { 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"]}