@operato/dataset 8.0.0-alpha.8 → 8.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.
- package/CHANGELOG.md +196 -0
- package/dist/src/ox-data-entry-form.d.ts +3 -2
- package/dist/src/ox-data-entry-form.js +66 -141
- package/dist/src/ox-data-entry-form.js.map +1 -1
- package/dist/src/ox-data-entry-subgroup-form.d.ts +23 -1
- package/dist/src/ox-data-entry-subgroup-form.js +20 -44
- package/dist/src/ox-data-entry-subgroup-form.js.map +1 -1
- package/dist/src/ox-data-input-factory.d.ts +53 -0
- package/dist/src/ox-data-input-factory.js +162 -0
- package/dist/src/ox-data-input-factory.js.map +1 -0
- package/dist/src/ox-data-sample-view.d.ts +3 -2
- package/dist/src/ox-data-sample-view.js +66 -44
- package/dist/src/ox-data-sample-view.js.map +1 -1
- package/dist/src/usecase/ccp/ox-input-ccp-limits.d.ts +1 -0
- package/dist/src/usecase/ccp/ox-input-ccp-limits.js +2 -1
- package/dist/src/usecase/ccp/ox-input-ccp-limits.js.map +1 -1
- package/dist/src/usecase/qc/ox-input-qc-limits.d.ts +1 -0
- package/dist/src/usecase/qc/ox-input-qc-limits.js +2 -1
- package/dist/src/usecase/qc/ox-input-qc-limits.js.map +1 -1
- package/dist/src/usecase/spc/ox-input-spc-limits.d.ts +1 -0
- package/dist/src/usecase/spc/ox-input-spc-limits.js +1 -0
- package/dist/src/usecase/spc/ox-input-spc-limits.js.map +1 -1
- package/dist/stories/ox-data-entry-form-subgroups.stories.d.ts +19 -0
- package/dist/stories/ox-data-entry-form-subgroups.stories.js +248 -0
- package/dist/stories/ox-data-entry-form-subgroups.stories.js.map +1 -0
- package/dist/stories/ox-data-entry-form.stories.js +52 -42
- package/dist/stories/ox-data-entry-form.stories.js.map +1 -1
- package/dist/stories/ox-data-item-spec.stories.js +87 -6
- package/dist/stories/ox-data-item-spec.stories.js.map +1 -1
- package/dist/stories/ox-data-ooc-brief-view.stories.js +18 -18
- package/dist/stories/ox-data-ooc-brief-view.stories.js.map +1 -1
- package/dist/stories/ox-data-ooc-view.stories.js +18 -18
- package/dist/stories/ox-data-ooc-view.stories.js.map +1 -1
- package/dist/stories/ox-data-sample-view.stories.js +18 -18
- package/dist/stories/ox-data-sample-view.stories.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +20 -20
- package/src/ox-data-entry-form.ts +77 -163
- package/src/ox-data-entry-subgroup-form.ts +20 -54
- package/src/ox-data-input-factory.ts +172 -0
- package/src/ox-data-sample-view.ts +71 -45
- package/src/usecase/ccp/ox-input-ccp-limits.ts +2 -1
- package/src/usecase/qc/ox-input-qc-limits.ts +2 -1
- package/src/usecase/spc/ox-input-spc-limits.ts +1 -0
- package/stories/ox-data-entry-form-subgroups.stories.ts +262 -0
- package/stories/ox-data-entry-form.stories.ts +52 -43
- package/stories/ox-data-item-spec.stories.ts +90 -6
- package/stories/ox-data-ooc-brief-view.stories.ts +18 -18
- package/stories/ox-data-ooc-view.stories.ts +18 -18
- package/stories/ox-data-sample-view.stories.ts +18 -18
- package/themes/calendar-theme.css +3 -1
package/CHANGELOG.md
CHANGED
|
@@ -3,6 +3,202 @@
|
|
|
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
|
+
## [8.0.0-beta.0](https://github.com/hatiolab/operato/compare/v8.0.0-alpha.56...v8.0.0-beta.0) (2025-01-07)
|
|
7
|
+
|
|
8
|
+
**Note:** Version bump only for package @operato/dataset
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
## [8.0.0-alpha.56](https://github.com/hatiolab/operato/compare/v8.0.0-alpha.55...v8.0.0-alpha.56) (2025-01-05)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
### :bug: Bug Fix
|
|
18
|
+
|
|
19
|
+
* [dataset] muultiple tables, subgroups at first occurrence, structured and modular ([89179fc](https://github.com/hatiolab/operato/commit/89179fc43024d34fa6bff4b364ce56541cefe16b))
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
## [8.0.0-alpha.54](https://github.com/hatiolab/operato/compare/v8.0.0-alpha.53...v8.0.0-alpha.54) (2024-12-09)
|
|
24
|
+
|
|
25
|
+
**Note:** Version bump only for package @operato/dataset
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
## [8.0.0-alpha.52](https://github.com/hatiolab/operato/compare/v8.0.0-alpha.51...v8.0.0-alpha.52) (2024-12-03)
|
|
32
|
+
|
|
33
|
+
**Note:** Version bump only for package @operato/dataset
|
|
34
|
+
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
## [8.0.0-alpha.51](https://github.com/hatiolab/operato/compare/v8.0.0-alpha.50...v8.0.0-alpha.51) (2024-11-29)
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
### :bug: Bug Fix
|
|
43
|
+
|
|
44
|
+
* support radio type for dataset item spec ([8f6ba8f](https://github.com/hatiolab/operato/commit/8f6ba8f9929d6cfb94f2c8993a7d3dba37297954))
|
|
45
|
+
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
## [8.0.0-alpha.50](https://github.com/hatiolab/operato/compare/v8.0.0-alpha.49...v8.0.0-alpha.50) (2024-11-16)
|
|
49
|
+
|
|
50
|
+
**Note:** Version bump only for package @operato/dataset
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
## [8.0.0-alpha.49](https://github.com/hatiolab/operato/compare/v8.0.0-alpha.48...v8.0.0-alpha.49) (2024-11-13)
|
|
57
|
+
|
|
58
|
+
**Note:** Version bump only for package @operato/dataset
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
## [8.0.0-alpha.48](https://github.com/hatiolab/operato/compare/v8.0.0-alpha.47...v8.0.0-alpha.48) (2024-11-13)
|
|
65
|
+
|
|
66
|
+
**Note:** Version bump only for package @operato/dataset
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
## [8.0.0-alpha.46](https://github.com/hatiolab/operato/compare/v8.0.0-alpha.45...v8.0.0-alpha.46) (2024-10-23)
|
|
73
|
+
|
|
74
|
+
**Note:** Version bump only for package @operato/dataset
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
|
|
80
|
+
## [8.0.0-alpha.45](https://github.com/hatiolab/operato/compare/v8.0.0-alpha.44...v8.0.0-alpha.45) (2024-10-23)
|
|
81
|
+
|
|
82
|
+
**Note:** Version bump only for package @operato/dataset
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
|
|
88
|
+
## [8.0.0-alpha.44](https://github.com/hatiolab/operato/compare/v8.0.0-alpha.43...v8.0.0-alpha.44) (2024-10-23)
|
|
89
|
+
|
|
90
|
+
**Note:** Version bump only for package @operato/dataset
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
|
|
95
|
+
|
|
96
|
+
## [8.0.0-alpha.41](https://github.com/hatiolab/operato/compare/v8.0.0-alpha.40...v8.0.0-alpha.41) (2024-10-21)
|
|
97
|
+
|
|
98
|
+
**Note:** Version bump only for package @operato/dataset
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
## [8.0.0-alpha.37](https://github.com/hatiolab/operato/compare/v8.0.0-alpha.36...v8.0.0-alpha.37) (2024-10-20)
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
### :bug: Bug Fix
|
|
108
|
+
|
|
109
|
+
* update dev-dependencies version ([d6fe342](https://github.com/hatiolab/operato/commit/d6fe342de738c6bad3528550a862b5a1d2573161))
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
## [8.0.0-alpha.34](https://github.com/hatiolab/operato/compare/v8.0.0-alpha.33...v8.0.0-alpha.34) (2024-10-15)
|
|
114
|
+
|
|
115
|
+
**Note:** Version bump only for package @operato/dataset
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
|
|
120
|
+
|
|
121
|
+
## [8.0.0-alpha.33](https://github.com/hatiolab/operato/compare/v8.0.0-alpha.32...v8.0.0-alpha.33) (2024-10-14)
|
|
122
|
+
|
|
123
|
+
**Note:** Version bump only for package @operato/dataset
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
## [8.0.0-alpha.30](https://github.com/hatiolab/operato/compare/v8.0.0-alpha.29...v8.0.0-alpha.30) (2024-10-11)
|
|
130
|
+
|
|
131
|
+
**Note:** Version bump only for package @operato/dataset
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
|
|
136
|
+
|
|
137
|
+
## [8.0.0-alpha.29](https://github.com/hatiolab/operato/compare/v8.0.0-alpha.28...v8.0.0-alpha.29) (2024-10-10)
|
|
138
|
+
|
|
139
|
+
**Note:** Version bump only for package @operato/dataset
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
|
|
144
|
+
|
|
145
|
+
## [8.0.0-alpha.27](https://github.com/hatiolab/operato/compare/v8.0.0-alpha.26...v8.0.0-alpha.27) (2024-10-06)
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
### :bug: Bug Fix
|
|
149
|
+
|
|
150
|
+
* calendar css variables ([9ea1918](https://github.com/hatiolab/operato/commit/9ea191844c72de5f920a8da85ad50209ba77cc07))
|
|
151
|
+
|
|
152
|
+
|
|
153
|
+
|
|
154
|
+
## [8.0.0-alpha.26](https://github.com/hatiolab/operato/compare/v8.0.0-alpha.25...v8.0.0-alpha.26) (2024-10-06)
|
|
155
|
+
|
|
156
|
+
**Note:** Version bump only for package @operato/dataset
|
|
157
|
+
|
|
158
|
+
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
## [8.0.0-alpha.21](https://github.com/hatiolab/operato/compare/v8.0.0-alpha.20...v8.0.0-alpha.21) (2024-10-05)
|
|
163
|
+
|
|
164
|
+
**Note:** Version bump only for package @operato/dataset
|
|
165
|
+
|
|
166
|
+
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
## [8.0.0-alpha.20](https://github.com/hatiolab/operato/compare/v8.0.0-alpha.19...v8.0.0-alpha.20) (2024-10-04)
|
|
171
|
+
|
|
172
|
+
**Note:** Version bump only for package @operato/dataset
|
|
173
|
+
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
|
|
177
|
+
|
|
178
|
+
## [8.0.0-alpha.19](https://github.com/hatiolab/operato/compare/v8.0.0-alpha.18...v8.0.0-alpha.19) (2024-10-04)
|
|
179
|
+
|
|
180
|
+
**Note:** Version bump only for package @operato/dataset
|
|
181
|
+
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
|
|
185
|
+
|
|
186
|
+
## [8.0.0-alpha.10](https://github.com/hatiolab/operato/compare/v8.0.0-alpha.9...v8.0.0-alpha.10) (2024-09-18)
|
|
187
|
+
|
|
188
|
+
**Note:** Version bump only for package @operato/dataset
|
|
189
|
+
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
|
|
194
|
+
## [8.0.0-alpha.9](https://github.com/hatiolab/operato/compare/v8.0.0-alpha.8...v8.0.0-alpha.9) (2024-09-15)
|
|
195
|
+
|
|
196
|
+
**Note:** Version bump only for package @operato/dataset
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
|
|
6
202
|
## [8.0.0-alpha.8](https://github.com/hatiolab/operato/compare/v8.0.0-alpha.7...v8.0.0-alpha.8) (2024-09-15)
|
|
7
203
|
|
|
8
204
|
**Note:** Version bump only for package @operato/dataset
|
|
@@ -14,8 +14,9 @@ export declare class OxDataEntryForm extends LitElement {
|
|
|
14
14
|
render(): TemplateResult<1>;
|
|
15
15
|
private onChange;
|
|
16
16
|
private buildInputs;
|
|
17
|
-
private
|
|
18
|
-
private
|
|
17
|
+
private buildInputsForSubgroup;
|
|
18
|
+
private buildInputsForNonGrouped;
|
|
19
19
|
private buildValue;
|
|
20
|
+
private extractValuesFromInputs;
|
|
20
21
|
private groupDataItemsByGroup;
|
|
21
22
|
}
|
|
@@ -4,39 +4,50 @@ import '@operato/input/ox-input-signature.js';
|
|
|
4
4
|
import './ox-data-entry-subgroup-form.js';
|
|
5
5
|
import { css, html, LitElement } from 'lit';
|
|
6
6
|
import { customElement, property, queryAll } from 'lit/decorators.js';
|
|
7
|
+
import { OxDataInputFactory } from './ox-data-input-factory';
|
|
7
8
|
let OxDataEntryForm = class OxDataEntryForm extends LitElement {
|
|
9
|
+
constructor() {
|
|
10
|
+
super(...arguments);
|
|
11
|
+
this.onChange = (e) => {
|
|
12
|
+
this.value = this.buildValue();
|
|
13
|
+
this.dispatchEvent(new CustomEvent('change', {
|
|
14
|
+
bubbles: true,
|
|
15
|
+
composed: true,
|
|
16
|
+
detail: this.value
|
|
17
|
+
}));
|
|
18
|
+
};
|
|
19
|
+
}
|
|
8
20
|
render() {
|
|
9
21
|
var _a, _b;
|
|
10
|
-
return html `
|
|
11
|
-
<
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
this.value = this.buildValue();
|
|
18
|
-
this.dispatchEvent(new CustomEvent('change', {
|
|
19
|
-
bubbles: true,
|
|
20
|
-
composed: true,
|
|
21
|
-
detail: this.value
|
|
22
|
-
}));
|
|
22
|
+
return html `
|
|
23
|
+
<form @change=${this.onChange}>
|
|
24
|
+
<h2>${((_a = this.dataSet) === null || _a === void 0 ? void 0 : _a.name) || ''}</h2>
|
|
25
|
+
<h3>${((_b = this.dataSet) === null || _b === void 0 ? void 0 : _b.description) || ''}</h3>
|
|
26
|
+
${this.buildInputs()}
|
|
27
|
+
</form>
|
|
28
|
+
`;
|
|
23
29
|
}
|
|
24
30
|
buildInputs() {
|
|
25
31
|
var _a;
|
|
26
32
|
const dataItems = ((_a = this.dataSet) === null || _a === void 0 ? void 0 : _a.dataItems.filter(item => item.active)) || [];
|
|
27
|
-
const
|
|
28
|
-
const
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
33
|
+
const groupedItems = this.groupDataItemsByGroup(dataItems);
|
|
34
|
+
const renderedGroups = new Set();
|
|
35
|
+
return dataItems.flatMap(dataItem => {
|
|
36
|
+
if (dataItem.group) {
|
|
37
|
+
if (renderedGroups.has(dataItem.group))
|
|
38
|
+
return [];
|
|
39
|
+
renderedGroups.add(dataItem.group);
|
|
40
|
+
return this.buildInputsForSubgroup(dataItem.group, groupedItems[dataItem.group]);
|
|
41
|
+
}
|
|
42
|
+
return this.buildInputsForNonGrouped([dataItem]);
|
|
36
43
|
});
|
|
37
|
-
return [...this.buildInputs4NonGrouped(nonGroupDataItems), ...dataItemSubgroups];
|
|
38
44
|
}
|
|
39
|
-
|
|
45
|
+
buildInputsForSubgroup(subgroup, dataItems) {
|
|
46
|
+
const subgroupValues = dataItems.reduce((values, item) => {
|
|
47
|
+
var _a;
|
|
48
|
+
values[item.tag] = (_a = this.value) === null || _a === void 0 ? void 0 : _a[item.tag];
|
|
49
|
+
return values;
|
|
50
|
+
}, {});
|
|
40
51
|
return html `
|
|
41
52
|
<div label>
|
|
42
53
|
<div name>${subgroup}</div>
|
|
@@ -44,100 +55,52 @@ let OxDataEntryForm = class OxDataEntryForm extends LitElement {
|
|
|
44
55
|
<ox-data-entry-subgroup-form
|
|
45
56
|
.subgroup=${subgroup}
|
|
46
57
|
.dataItems=${dataItems}
|
|
47
|
-
.value=${
|
|
48
|
-
@change=${
|
|
58
|
+
.value=${subgroupValues}
|
|
59
|
+
@change=${this.onChange}
|
|
49
60
|
></ox-data-entry-subgroup-form>
|
|
50
61
|
</div>
|
|
51
62
|
</div>
|
|
52
63
|
`;
|
|
53
64
|
}
|
|
54
|
-
|
|
55
|
-
return
|
|
65
|
+
buildInputsForNonGrouped(dataItems) {
|
|
66
|
+
return dataItems.map(dataItem => {
|
|
67
|
+
var _a, _b;
|
|
56
68
|
const { name, description, tag, type, quota = 1, options = {}, unit } = dataItem;
|
|
57
|
-
const
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
case 'radio':
|
|
68
|
-
return html `<div
|
|
69
|
-
@change=${(e) => {
|
|
70
|
-
const div = e.currentTarget;
|
|
71
|
-
const inputHidden = div.querySelector(`input[name="${tag}"]`);
|
|
72
|
-
inputHidden.value = e.target.value;
|
|
73
|
-
}}
|
|
74
|
-
>
|
|
75
|
-
<input type="hidden" name=${tag} />
|
|
76
|
-
|
|
77
|
-
${(options.options || []).map(option => html `<label>
|
|
78
|
-
<input
|
|
79
|
-
type="radio"
|
|
80
|
-
name=${'$' + tag + '-' + idx}
|
|
81
|
-
.value=${option.value}
|
|
82
|
-
?checked=${option.value === v}
|
|
83
|
-
/>
|
|
84
|
-
${option.text}
|
|
85
|
-
</label>`)}
|
|
86
|
-
</div>`;
|
|
87
|
-
case 'boolean':
|
|
88
|
-
return html ` <input type="checkbox" name=${tag} .checked=${v} />`;
|
|
89
|
-
case 'number':
|
|
90
|
-
return html ` <input type="number" name=${tag} value=${v} />`;
|
|
91
|
-
case 'date':
|
|
92
|
-
return html ` <input type="date" name=${tag} value=${v} />`;
|
|
93
|
-
case 'datetime':
|
|
94
|
-
return html ` <input type="datetime-local" name=${tag} value=${v} />`;
|
|
95
|
-
case 'file':
|
|
96
|
-
return html `<ox-input-file name=${tag} multiple .value=${v}></ox-input-file>`;
|
|
97
|
-
case 'signature':
|
|
98
|
-
return html `<ox-input-signature name=${tag} value=${v}></ox-input-signature>`;
|
|
99
|
-
case 'string':
|
|
100
|
-
default:
|
|
101
|
-
return html ` <input type="text" name=${tag} value=${v} />`;
|
|
102
|
-
}
|
|
103
|
-
});
|
|
104
|
-
return html ` <div label>
|
|
105
|
-
<div name>${name}${unit ? `(${unit})` : ''}</div>
|
|
106
|
-
<div description><md-icon>info</md-icon> ${description}</div>
|
|
107
|
-
<div elements>${elements}</div>
|
|
108
|
-
</div>`;
|
|
69
|
+
const value = ((_a = this.value) === null || _a === void 0 ? void 0 : _a[tag]) === undefined ? [] : (_b = this.value) === null || _b === void 0 ? void 0 : _b[tag];
|
|
70
|
+
return html `
|
|
71
|
+
<div label>
|
|
72
|
+
<div name>${name}${unit ? ` (${unit})` : ''}</div>
|
|
73
|
+
<div description><md-icon>info</md-icon> ${description}</div>
|
|
74
|
+
<div elements>
|
|
75
|
+
${Array.from({ length: quota }, (_, idx) => OxDataInputFactory.createInputElement(type, tag, Array.isArray(value) ? value[idx] : idx === 0 ? value : undefined, options, idx))}
|
|
76
|
+
</div>
|
|
77
|
+
</div>
|
|
78
|
+
`;
|
|
109
79
|
});
|
|
110
80
|
}
|
|
111
81
|
buildValue() {
|
|
112
|
-
const
|
|
113
|
-
|
|
114
|
-
|
|
82
|
+
const nonGroupValues = this.extractValuesFromInputs();
|
|
83
|
+
return Array.from(this.subgroups).reduce((values, subgroup) => ({ ...values, ...subgroup.buildValue() }), nonGroupValues);
|
|
84
|
+
}
|
|
85
|
+
extractValuesFromInputs() {
|
|
86
|
+
var _a;
|
|
87
|
+
return (((_a = this.dataSet) === null || _a === void 0 ? void 0 : _a.dataItems.filter(item => !item.group)) || []).reduce((values, dataItem) => {
|
|
115
88
|
const { tag, type } = dataItem;
|
|
116
|
-
const editors = Array.
|
|
89
|
+
const editors = Array.from(this.renderRoot.querySelectorAll(`[name=${tag}]`));
|
|
117
90
|
if (editors.length > 0) {
|
|
118
|
-
|
|
91
|
+
values[tag] = editors.map(editor => (type === 'boolean' ? editor.checked : editor.value));
|
|
119
92
|
}
|
|
120
|
-
return
|
|
93
|
+
return values;
|
|
121
94
|
}, {});
|
|
122
|
-
return Array.from(this.subgroups).reduce((value, subgroup) => {
|
|
123
|
-
return {
|
|
124
|
-
...value,
|
|
125
|
-
...subgroup.buildValue()
|
|
126
|
-
};
|
|
127
|
-
}, nonGroupValue || {});
|
|
128
95
|
}
|
|
129
96
|
groupDataItemsByGroup(dataItems) {
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
if (!groupedDataItems[group]) {
|
|
135
|
-
groupedDataItems[group] = [];
|
|
136
|
-
}
|
|
137
|
-
groupedDataItems[group].push(dataItem);
|
|
97
|
+
return dataItems.reduce((groups, item) => {
|
|
98
|
+
if (item.group) {
|
|
99
|
+
;
|
|
100
|
+
(groups[item.group] = groups[item.group] || []).push(item);
|
|
138
101
|
}
|
|
139
|
-
|
|
140
|
-
|
|
102
|
+
return groups;
|
|
103
|
+
}, {});
|
|
141
104
|
}
|
|
142
105
|
};
|
|
143
106
|
OxDataEntryForm.styles = css `
|
|
@@ -170,19 +133,12 @@ OxDataEntryForm.styles = css `
|
|
|
170
133
|
|
|
171
134
|
form > div[label] {
|
|
172
135
|
display: grid;
|
|
173
|
-
|
|
174
136
|
grid-template-rows: auto 1fr;
|
|
175
137
|
grid-template-columns: 1fr 5fr;
|
|
176
138
|
grid-template-areas: 'name description' 'empty inputs';
|
|
177
|
-
|
|
178
139
|
grid-gap: 9px;
|
|
179
140
|
align-items: center;
|
|
180
141
|
margin-bottom: var(--spacing-medium);
|
|
181
|
-
|
|
182
|
-
&:nth-child(odd) {
|
|
183
|
-
background-color: var(--md-sys-color-background);
|
|
184
|
-
padding: var(--padding-default) 0;
|
|
185
|
-
}
|
|
186
142
|
}
|
|
187
143
|
|
|
188
144
|
div[name] {
|
|
@@ -191,17 +147,13 @@ OxDataEntryForm.styles = css `
|
|
|
191
147
|
color: var(--label-color, var(--md-sys-color-on-surface));
|
|
192
148
|
text-align: right;
|
|
193
149
|
}
|
|
150
|
+
|
|
194
151
|
div[description] {
|
|
195
152
|
grid-area: description;
|
|
196
153
|
opacity: 0.7;
|
|
197
154
|
font: var(--item-description-font);
|
|
198
155
|
color: var(--item-description-color);
|
|
199
156
|
text-align: left;
|
|
200
|
-
|
|
201
|
-
* {
|
|
202
|
-
vertical-align: middle;
|
|
203
|
-
}
|
|
204
|
-
|
|
205
157
|
md-icon {
|
|
206
158
|
font-size: 0.9rem;
|
|
207
159
|
}
|
|
@@ -214,42 +166,15 @@ OxDataEntryForm.styles = css `
|
|
|
214
166
|
flex-wrap: wrap;
|
|
215
167
|
gap: 10px;
|
|
216
168
|
padding-right: var(--padding-default);
|
|
217
|
-
|
|
218
169
|
* {
|
|
219
170
|
flex: 1;
|
|
220
171
|
}
|
|
221
|
-
|
|
222
|
-
input,
|
|
223
|
-
select {
|
|
224
|
-
border: var(--input-field-border);
|
|
225
|
-
border-radius: var(--input-field-border-radius);
|
|
226
|
-
padding: var(--input-field-padding);
|
|
227
|
-
font: var(--input-field-font);
|
|
228
|
-
}
|
|
229
172
|
}
|
|
230
173
|
|
|
231
174
|
div[subgroup] {
|
|
232
175
|
grid-column: 1 / 3;
|
|
233
176
|
grid-row: 2;
|
|
234
177
|
}
|
|
235
|
-
|
|
236
|
-
@media only screen and (max-width: 460px) {
|
|
237
|
-
form > div[label] {
|
|
238
|
-
display: grid;
|
|
239
|
-
|
|
240
|
-
grid-template-rows: auto auto 1fr;
|
|
241
|
-
grid-template-columns: 1fr;
|
|
242
|
-
grid-template-areas: 'name' 'description' 'inputs';
|
|
243
|
-
|
|
244
|
-
grid-gap: 9px;
|
|
245
|
-
align-items: center;
|
|
246
|
-
margin-bottom: var(--spacing-medium);
|
|
247
|
-
}
|
|
248
|
-
|
|
249
|
-
div[name] {
|
|
250
|
-
text-align: left;
|
|
251
|
-
}
|
|
252
|
-
}
|
|
253
178
|
`;
|
|
254
179
|
__decorate([
|
|
255
180
|
property({ type: Object })
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ox-data-entry-form.js","sourceRoot":"","sources":["../../src/ox-data-entry-form.ts"],"names":[],"mappings":"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","sourcesContent":["import '@operato/input/ox-input-file.js'\nimport '@operato/input/ox-input-signature.js'\nimport './ox-data-entry-subgroup-form.js'\n\nimport { css, html, LitElement, TemplateResult } from 'lit'\nimport { customElement, property, queryAll } from 'lit/decorators.js'\n\nimport { DataSet, DataItem, DataSample } from './types.js'\nimport { OxDataEntrySubgroupForm } from './ox-data-entry-subgroup-form.js'\n\n@customElement('ox-data-entry-form')\nexport class OxDataEntryForm extends LitElement {\n static styles = css`\n :host {\n --item-description-font: normal 0.8rem/1rem var(--theme-font);\n --item-description-color: var(--page-description-color);\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 text-align: center;\n }\n\n h3 {\n margin: var(--page-description-margin);\n font: var(--page-description-font);\n color: var(--page-description-color);\n text-transform: capitalize;\n text-align: center;\n }\n\n form {\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n\n form > div[label] {\n display: grid;\n\n grid-template-rows: auto 1fr;\n grid-template-columns: 1fr 5fr;\n grid-template-areas: 'name description' 'empty inputs';\n\n grid-gap: 9px;\n align-items: center;\n margin-bottom: var(--spacing-medium);\n\n &:nth-child(odd) {\n background-color: var(--md-sys-color-background);\n padding: var(--padding-default) 0;\n }\n }\n\n div[name] {\n grid-area: name;\n font: var(--label-font);\n color: var(--label-color, var(--md-sys-color-on-surface));\n text-align: right;\n }\n div[description] {\n grid-area: description;\n opacity: 0.7;\n font: var(--item-description-font);\n color: var(--item-description-color);\n text-align: left;\n\n * {\n vertical-align: middle;\n }\n\n md-icon {\n font-size: 0.9rem;\n }\n }\n\n div[elements] {\n grid-area: inputs;\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n gap: 10px;\n padding-right: var(--padding-default);\n\n * {\n flex: 1;\n }\n\n input,\n 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 }\n\n div[subgroup] {\n grid-column: 1 / 3;\n grid-row: 2;\n }\n\n @media only screen and (max-width: 460px) {\n form > div[label] {\n display: grid;\n\n grid-template-rows: auto auto 1fr;\n grid-template-columns: 1fr;\n grid-template-areas: 'name' 'description' 'inputs';\n\n grid-gap: 9px;\n align-items: center;\n margin-bottom: var(--spacing-medium);\n }\n\n div[name] {\n text-align: left;\n }\n }\n `\n\n @property({ type: Object }) dataSet?: DataSet\n @property({ type: Object }) value?: { [tag: string]: any }\n\n @queryAll('ox-data-entry-subgroup-form') subgroups!: NodeListOf<OxDataEntrySubgroupForm>\n\n render() {\n return html` <form @change=${(e: Event) => this.onChange(e)}>\n <h2>${this.dataSet?.name || ''}</h2>\n <h3>${this.dataSet?.description || ''}</h3>\n ${this.buildInputs()}\n </form>`\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 buildInputs() {\n const dataItems = this.dataSet?.dataItems.filter(item => item.active) || []\n const nonGroupDataItems = dataItems.filter(dataItem => !dataItem.group)\n const dataItemSubgroups = Object.entries(this.groupDataItemsByGroup(dataItems)).map(([subgroup, dataItems]) => {\n const tags = dataItems.map(dataItem => dataItem.tag)\n const value = tags.reduce((partial, key) => {\n partial[key] = this.value?.[key]\n return partial\n }, {} as any)\n\n return this.buildInputs4Subgroup(subgroup, dataItems, value)\n })\n\n return [...this.buildInputs4NonGrouped(nonGroupDataItems), ...dataItemSubgroups]\n }\n\n private buildInputs4Subgroup(subgroup: string, dataItems: DataItem[], value: { [tag: string]: any }): TemplateResult {\n return html`\n <div label>\n <div name>${subgroup}</div>\n <div subgroup>\n <ox-data-entry-subgroup-form\n .subgroup=${subgroup}\n .dataItems=${dataItems}\n .value=${value}\n @change=${(e: Event) => this.onChange(e)}\n ></ox-data-entry-subgroup-form>\n </div>\n </div>\n `\n }\n\n private buildInputs4NonGrouped(dataItems: DataItem[]): TemplateResult[] {\n return (dataItems || []).map(dataItem => {\n const { name, description, tag, type, quota = 1, options = {}, unit } = dataItem\n\n const samples = new Array(quota).fill(0)\n const value = this.value && this.value[tag]\n\n const elements = samples.map((_, idx) => {\n const v = value instanceof Array ? value[idx] : idx === 0 ? value : undefined\n\n switch (type) {\n case 'select':\n return html` <select .name=${tag}>\n <option value=\"\"></option>\n ${(options.options || []).map(\n option => html`<option value=${option.value} ?selected=${option.value === v}>${option.text}</option>`\n )}\n </select>`\n\n case 'radio':\n return html`<div\n @change=${(e: Event) => {\n const div = e.currentTarget as HTMLElement\n const inputHidden = div.querySelector(`input[name=\"${tag}\"]`) as HTMLInputElement\n inputHidden.value = (e.target as HTMLInputElement).value\n }}\n >\n <input type=\"hidden\" name=${tag} />\n\n ${(options.options || []).map(\n option =>\n html`<label>\n <input\n type=\"radio\"\n name=${'$' + tag + '-' + idx}\n .value=${option.value}\n ?checked=${option.value === v}\n />\n ${option.text}\n </label>`\n )}\n </div>`\n\n case 'boolean':\n return html` <input type=\"checkbox\" name=${tag} .checked=${v} />`\n\n case 'number':\n return html` <input type=\"number\" name=${tag} value=${v} />`\n\n case 'date':\n return html` <input type=\"date\" name=${tag} value=${v} />`\n\n case 'datetime':\n return html` <input type=\"datetime-local\" name=${tag} value=${v} />`\n\n case 'file':\n return html`<ox-input-file name=${tag} multiple .value=${v}></ox-input-file>`\n\n case 'signature':\n return html`<ox-input-signature name=${tag} value=${v}></ox-input-signature>`\n\n case 'string':\n default:\n return html` <input type=\"text\" name=${tag} value=${v} />`\n }\n })\n\n return html` <div label>\n <div name>${name}${unit ? `(${unit})` : ''}</div>\n <div description><md-icon>info</md-icon> ${description}</div>\n <div elements>${elements}</div>\n </div>`\n })\n }\n\n private buildValue() {\n const dataItems = this.dataSet!.dataItems\n const nonGroupDataItems = dataItems.filter(dataItem => !dataItem.group)\n\n const nonGroupValue = (nonGroupDataItems || []).reduce(\n (sum, dataItem) => {\n const { tag, type } = dataItem\n\n const editors = Array.prototype.slice.call(\n this.renderRoot.querySelectorAll(`[name=${tag}]`) as NodeListOf<HTMLInputElement>\n ) as HTMLInputElement[]\n\n if (editors.length > 0) {\n sum[tag] = editors.map(editor => (type === 'boolean' ? editor.checked : editor.value))\n }\n\n return sum\n },\n {} as { [tag: string]: any }\n )\n\n return Array.from(this.subgroups).reduce((value, subgroup) => {\n return {\n ...value,\n ...subgroup.buildValue()\n }\n }, nonGroupValue || {})\n }\n\n private groupDataItemsByGroup(dataItems: DataItem[]): { [group: string]: DataItem[] } {\n const groupedDataItems: { [group: string]: DataItem[] } = {}\n\n for (const dataItem of dataItems) {\n const { group } = dataItem\n\n if (group) {\n if (!groupedDataItems[group]) {\n groupedDataItems[group] = []\n }\n\n groupedDataItems[group].push(dataItem)\n }\n }\n\n return groupedDataItems\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ox-data-entry-form.js","sourceRoot":"","sources":["../../src/ox-data-entry-form.ts"],"names":[],"mappings":"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","sourcesContent":["import '@operato/input/ox-input-file.js'\nimport '@operato/input/ox-input-signature.js'\nimport './ox-data-entry-subgroup-form.js'\n\nimport { css, html, LitElement, TemplateResult } from 'lit'\nimport { customElement, property, queryAll } from 'lit/decorators.js'\n\nimport { DataSet, DataItem } from './types.js'\nimport { OxDataEntrySubgroupForm } from './ox-data-entry-subgroup-form.js'\nimport { OxDataInputFactory } from './ox-data-input-factory'\n\n@customElement('ox-data-entry-form')\nexport class OxDataEntryForm extends LitElement {\n static styles = css`\n :host {\n --item-description-font: normal 0.8rem/1rem var(--theme-font);\n --item-description-color: var(--page-description-color);\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 text-align: center;\n }\n\n h3 {\n margin: var(--page-description-margin);\n font: var(--page-description-font);\n color: var(--page-description-color);\n text-transform: capitalize;\n text-align: center;\n }\n\n form {\n display: flex;\n flex-direction: column;\n overflow: hidden;\n }\n\n form > div[label] {\n display: grid;\n grid-template-rows: auto 1fr;\n grid-template-columns: 1fr 5fr;\n grid-template-areas: 'name description' 'empty inputs';\n grid-gap: 9px;\n align-items: center;\n margin-bottom: var(--spacing-medium);\n }\n\n div[name] {\n grid-area: name;\n font: var(--label-font);\n color: var(--label-color, var(--md-sys-color-on-surface));\n text-align: right;\n }\n\n div[description] {\n grid-area: description;\n opacity: 0.7;\n font: var(--item-description-font);\n color: var(--item-description-color);\n text-align: left;\n md-icon {\n font-size: 0.9rem;\n }\n }\n\n div[elements] {\n grid-area: inputs;\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n gap: 10px;\n padding-right: var(--padding-default);\n * {\n flex: 1;\n }\n }\n\n div[subgroup] {\n grid-column: 1 / 3;\n grid-row: 2;\n }\n `\n\n @property({ type: Object }) dataSet?: DataSet\n @property({ type: Object }) value?: { [tag: string]: any }\n\n @queryAll('ox-data-entry-subgroup-form') subgroups!: NodeListOf<OxDataEntrySubgroupForm>\n\n render() {\n return html`\n <form @change=${this.onChange}>\n <h2>${this.dataSet?.name || ''}</h2>\n <h3>${this.dataSet?.description || ''}</h3>\n ${this.buildInputs()}\n </form>\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 buildInputs(): TemplateResult[] {\n const dataItems = this.dataSet?.dataItems.filter(item => item.active) || []\n const groupedItems = this.groupDataItemsByGroup(dataItems)\n\n const renderedGroups = new Set<string>()\n\n return dataItems.flatMap(dataItem => {\n if (dataItem.group) {\n if (renderedGroups.has(dataItem.group)) return []\n\n renderedGroups.add(dataItem.group)\n return this.buildInputsForSubgroup(dataItem.group, groupedItems[dataItem.group])\n }\n\n return this.buildInputsForNonGrouped([dataItem])\n })\n }\n\n private buildInputsForSubgroup(subgroup: string, dataItems: DataItem[]): TemplateResult {\n const subgroupValues = dataItems.reduce(\n (values, item) => {\n values[item.tag] = this.value?.[item.tag]\n return values\n },\n {} as { [tag: string]: any }\n )\n\n return html`\n <div label>\n <div name>${subgroup}</div>\n <div subgroup>\n <ox-data-entry-subgroup-form\n .subgroup=${subgroup}\n .dataItems=${dataItems}\n .value=${subgroupValues}\n @change=${this.onChange}\n ></ox-data-entry-subgroup-form>\n </div>\n </div>\n `\n }\n\n private buildInputsForNonGrouped(dataItems: DataItem[]): TemplateResult[] {\n return dataItems.map(dataItem => {\n const { name, description, tag, type, quota = 1, options = {}, unit } = dataItem\n const value = this.value?.[tag] === undefined ? [] : this.value?.[tag]\n\n return html`\n <div label>\n <div name>${name}${unit ? ` (${unit})` : ''}</div>\n <div description><md-icon>info</md-icon> ${description}</div>\n <div elements>\n ${Array.from({ length: quota }, (_, idx) =>\n OxDataInputFactory.createInputElement(\n type,\n tag,\n Array.isArray(value) ? value[idx] : idx === 0 ? value : undefined,\n options,\n idx\n )\n )}\n </div>\n </div>\n `\n })\n }\n\n private buildValue(): { [tag: string]: any } {\n const nonGroupValues = this.extractValuesFromInputs()\n return Array.from(this.subgroups).reduce(\n (values, subgroup) => ({ ...values, ...subgroup.buildValue() }),\n nonGroupValues\n )\n }\n\n private extractValuesFromInputs(): { [tag: string]: any } {\n return (this.dataSet?.dataItems.filter(item => !item.group) || []).reduce(\n (values, dataItem) => {\n const { tag, type } = dataItem\n const editors = Array.from(this.renderRoot.querySelectorAll(`[name=${tag}]`) as NodeListOf<HTMLInputElement>)\n\n if (editors.length > 0) {\n values[tag] = editors.map(editor => (type === 'boolean' ? editor.checked : editor.value))\n }\n\n return values\n },\n {} as { [tag: string]: any }\n )\n }\n\n private groupDataItemsByGroup(dataItems: DataItem[]): { [group: string]: DataItem[] } {\n return dataItems.reduce(\n (groups, item) => {\n if (item.group) {\n ;(groups[item.group] = groups[item.group] || []).push(item)\n }\n return groups\n },\n {} as { [group: string]: DataItem[] }\n )\n }\n}\n"]}
|
|
@@ -14,7 +14,16 @@ export declare class OxDataEntrySubgroupForm extends LitElement {
|
|
|
14
14
|
list: {
|
|
15
15
|
fields: string[];
|
|
16
16
|
};
|
|
17
|
-
columns:
|
|
17
|
+
columns: ({
|
|
18
|
+
type: string;
|
|
19
|
+
name: string;
|
|
20
|
+
header: string;
|
|
21
|
+
record: any;
|
|
22
|
+
width: number;
|
|
23
|
+
} | {
|
|
24
|
+
type: string;
|
|
25
|
+
gutterName: string;
|
|
26
|
+
})[];
|
|
18
27
|
rows: {
|
|
19
28
|
appendable: boolean;
|
|
20
29
|
};
|
|
@@ -24,11 +33,24 @@ export declare class OxDataEntrySubgroupForm extends LitElement {
|
|
|
24
33
|
};
|
|
25
34
|
grist: DataGrist;
|
|
26
35
|
render(): import("lit-html").TemplateResult<1>;
|
|
36
|
+
/**
|
|
37
|
+
* Builds the configuration for the Grist data grid.
|
|
38
|
+
* Uses OxDataInputFactory to determine column types.
|
|
39
|
+
*/
|
|
27
40
|
private buildGristConfiguration;
|
|
41
|
+
/**
|
|
42
|
+
* Fetches data for the Grist grid.
|
|
43
|
+
*/
|
|
28
44
|
fetchHandler({ page, limit, sortings, filters }: FetchOption): Promise<{
|
|
29
45
|
total: number;
|
|
30
46
|
records: any[];
|
|
31
47
|
}>;
|
|
48
|
+
/**
|
|
49
|
+
* Builds the value structure for form submission.
|
|
50
|
+
*/
|
|
32
51
|
buildValue(): any;
|
|
52
|
+
/**
|
|
53
|
+
* Handles field change events.
|
|
54
|
+
*/
|
|
33
55
|
onFieldChange(e: CustomEvent): void;
|
|
34
56
|
}
|