@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.
Files changed (51) hide show
  1. package/CHANGELOG.md +196 -0
  2. package/dist/src/ox-data-entry-form.d.ts +3 -2
  3. package/dist/src/ox-data-entry-form.js +66 -141
  4. package/dist/src/ox-data-entry-form.js.map +1 -1
  5. package/dist/src/ox-data-entry-subgroup-form.d.ts +23 -1
  6. package/dist/src/ox-data-entry-subgroup-form.js +20 -44
  7. package/dist/src/ox-data-entry-subgroup-form.js.map +1 -1
  8. package/dist/src/ox-data-input-factory.d.ts +53 -0
  9. package/dist/src/ox-data-input-factory.js +162 -0
  10. package/dist/src/ox-data-input-factory.js.map +1 -0
  11. package/dist/src/ox-data-sample-view.d.ts +3 -2
  12. package/dist/src/ox-data-sample-view.js +66 -44
  13. package/dist/src/ox-data-sample-view.js.map +1 -1
  14. package/dist/src/usecase/ccp/ox-input-ccp-limits.d.ts +1 -0
  15. package/dist/src/usecase/ccp/ox-input-ccp-limits.js +2 -1
  16. package/dist/src/usecase/ccp/ox-input-ccp-limits.js.map +1 -1
  17. package/dist/src/usecase/qc/ox-input-qc-limits.d.ts +1 -0
  18. package/dist/src/usecase/qc/ox-input-qc-limits.js +2 -1
  19. package/dist/src/usecase/qc/ox-input-qc-limits.js.map +1 -1
  20. package/dist/src/usecase/spc/ox-input-spc-limits.d.ts +1 -0
  21. package/dist/src/usecase/spc/ox-input-spc-limits.js +1 -0
  22. package/dist/src/usecase/spc/ox-input-spc-limits.js.map +1 -1
  23. package/dist/stories/ox-data-entry-form-subgroups.stories.d.ts +19 -0
  24. package/dist/stories/ox-data-entry-form-subgroups.stories.js +248 -0
  25. package/dist/stories/ox-data-entry-form-subgroups.stories.js.map +1 -0
  26. package/dist/stories/ox-data-entry-form.stories.js +52 -42
  27. package/dist/stories/ox-data-entry-form.stories.js.map +1 -1
  28. package/dist/stories/ox-data-item-spec.stories.js +87 -6
  29. package/dist/stories/ox-data-item-spec.stories.js.map +1 -1
  30. package/dist/stories/ox-data-ooc-brief-view.stories.js +18 -18
  31. package/dist/stories/ox-data-ooc-brief-view.stories.js.map +1 -1
  32. package/dist/stories/ox-data-ooc-view.stories.js +18 -18
  33. package/dist/stories/ox-data-ooc-view.stories.js.map +1 -1
  34. package/dist/stories/ox-data-sample-view.stories.js +18 -18
  35. package/dist/stories/ox-data-sample-view.stories.js.map +1 -1
  36. package/dist/tsconfig.tsbuildinfo +1 -1
  37. package/package.json +20 -20
  38. package/src/ox-data-entry-form.ts +77 -163
  39. package/src/ox-data-entry-subgroup-form.ts +20 -54
  40. package/src/ox-data-input-factory.ts +172 -0
  41. package/src/ox-data-sample-view.ts +71 -45
  42. package/src/usecase/ccp/ox-input-ccp-limits.ts +2 -1
  43. package/src/usecase/qc/ox-input-qc-limits.ts +2 -1
  44. package/src/usecase/spc/ox-input-spc-limits.ts +1 -0
  45. package/stories/ox-data-entry-form-subgroups.stories.ts +262 -0
  46. package/stories/ox-data-entry-form.stories.ts +52 -43
  47. package/stories/ox-data-item-spec.stories.ts +90 -6
  48. package/stories/ox-data-ooc-brief-view.stories.ts +18 -18
  49. package/stories/ox-data-ooc-view.stories.ts +18 -18
  50. package/stories/ox-data-sample-view.stories.ts +18 -18
  51. 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 buildInputs4Subgroup;
18
- private buildInputs4NonGrouped;
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 ` <form @change=${(e) => this.onChange(e)}>
11
- <h2>${((_a = this.dataSet) === null || _a === void 0 ? void 0 : _a.name) || ''}</h2>
12
- <h3>${((_b = this.dataSet) === null || _b === void 0 ? void 0 : _b.description) || ''}</h3>
13
- ${this.buildInputs()}
14
- </form>`;
15
- }
16
- onChange(e) {
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 nonGroupDataItems = dataItems.filter(dataItem => !dataItem.group);
28
- const dataItemSubgroups = Object.entries(this.groupDataItemsByGroup(dataItems)).map(([subgroup, dataItems]) => {
29
- const tags = dataItems.map(dataItem => dataItem.tag);
30
- const value = tags.reduce((partial, key) => {
31
- var _a;
32
- partial[key] = (_a = this.value) === null || _a === void 0 ? void 0 : _a[key];
33
- return partial;
34
- }, {});
35
- return this.buildInputs4Subgroup(subgroup, dataItems, value);
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
- buildInputs4Subgroup(subgroup, dataItems, value) {
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=${value}
48
- @change=${(e) => this.onChange(e)}
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
- buildInputs4NonGrouped(dataItems) {
55
- return (dataItems || []).map(dataItem => {
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 samples = new Array(quota).fill(0);
58
- const value = this.value && this.value[tag];
59
- const elements = samples.map((_, idx) => {
60
- const v = value instanceof Array ? value[idx] : idx === 0 ? value : undefined;
61
- switch (type) {
62
- case 'select':
63
- return html ` <select .name=${tag}>
64
- <option value=""></option>
65
- ${(options.options || []).map(option => html `<option value=${option.value} ?selected=${option.value === v}>${option.text}</option>`)}
66
- </select>`;
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 dataItems = this.dataSet.dataItems;
113
- const nonGroupDataItems = dataItems.filter(dataItem => !dataItem.group);
114
- const nonGroupValue = (nonGroupDataItems || []).reduce((sum, dataItem) => {
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.prototype.slice.call(this.renderRoot.querySelectorAll(`[name=${tag}]`));
89
+ const editors = Array.from(this.renderRoot.querySelectorAll(`[name=${tag}]`));
117
90
  if (editors.length > 0) {
118
- sum[tag] = editors.map(editor => (type === 'boolean' ? editor.checked : editor.value));
91
+ values[tag] = editors.map(editor => (type === 'boolean' ? editor.checked : editor.value));
119
92
  }
120
- return sum;
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
- const groupedDataItems = {};
131
- for (const dataItem of dataItems) {
132
- const { group } = dataItem;
133
- if (group) {
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
- return groupedDataItems;
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: any[];
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
  }