@operato/dataset 8.0.0 → 9.0.0-beta.1

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 (28) hide show
  1. package/CHANGELOG.md +188 -32
  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-ooc-correction-part.js +10 -2
  12. package/dist/src/ox-data-ooc-correction-part.js.map +1 -1
  13. package/dist/src/ox-data-sample-view.d.ts +3 -2
  14. package/dist/src/ox-data-sample-view.js +66 -44
  15. package/dist/src/ox-data-sample-view.js.map +1 -1
  16. package/dist/stories/ox-data-entry-form-subgroups.stories.d.ts +19 -0
  17. package/dist/stories/ox-data-entry-form-subgroups.stories.js +248 -0
  18. package/dist/stories/ox-data-entry-form-subgroups.stories.js.map +1 -0
  19. package/dist/stories/ox-data-entry-form.stories.js +54 -42
  20. package/dist/stories/ox-data-entry-form.stories.js.map +1 -1
  21. package/dist/stories/ox-data-ooc-brief-view.stories.js +19 -18
  22. package/dist/stories/ox-data-ooc-brief-view.stories.js.map +1 -1
  23. package/dist/stories/ox-data-ooc-view.stories.js +19 -18
  24. package/dist/stories/ox-data-ooc-view.stories.js.map +1 -1
  25. package/dist/stories/ox-data-sample-view.stories.js +19 -18
  26. package/dist/stories/ox-data-sample-view.stories.js.map +1 -1
  27. package/dist/tsconfig.tsbuildinfo +1 -1
  28. package/package.json +20 -20
@@ -3,7 +3,7 @@ import '@material/web/icon/icon.js';
3
3
  import '@operato/input/ox-input-file.js';
4
4
  import '@operato/input/ox-input-signature.js';
5
5
  import './ox-data-sample-subgroup-view.js';
6
- import { css, html, LitElement, nothing } from 'lit';
6
+ import { css, html, LitElement } from 'lit';
7
7
  import { customElement, property } from 'lit/decorators.js';
8
8
  import { i18next } from '@operato/i18n';
9
9
  import { OxDataUseCase } from './usecase/ox-data-use-case.js';
@@ -15,9 +15,38 @@ let OxDataSampleView = class OxDataSampleView extends LitElement {
15
15
  const { name, description, collectedAt, workDate, workShift, useCase, data = {}, judgment, dataItems = [] } = this.dataSample;
16
16
  const formatter = new Intl.DateTimeFormat(navigator.language, { dateStyle: 'full', timeStyle: 'short' });
17
17
  const useCaseNames = (useCase === null || useCase === void 0 ? void 0 : useCase.split(',').filter(useCase => useCase.trim())) || [];
18
- const nonGroupDataItems = dataItems.filter(dataItem => !dataItem.group && !dataItem.hidden);
19
- const dataItemSubgroups = this.groupDataItemsByGroup(dataItems);
20
- return html ` <h2>${name}</h2>
18
+ const groupedItems = this.groupDataItemsByGroup(dataItems);
19
+ const renderedGroups = new Set(); // To track rendered subgroups
20
+ let currentTableItems = []; // To store items for the current table
21
+ const tables = []; // To store generated tables
22
+ dataItems.forEach((dataItem, index) => {
23
+ if (dataItem.group) {
24
+ // If we reach a subgroup, first store the existing non-grouped items as a table
25
+ if (currentTableItems.length > 0) {
26
+ tables.push(this.buildTable(currentTableItems, data, judgment, useCaseNames));
27
+ currentTableItems = []; // Reset for the next segment
28
+ }
29
+ // Render the subgroup **only if it's the first time being encountered**
30
+ if (!renderedGroups.has(dataItem.group)) {
31
+ renderedGroups.add(dataItem.group);
32
+ tables.push(html `
33
+ <ox-data-sample-subgroup-view
34
+ .subgroup=${dataItem.group}
35
+ .dataSample=${this.dataSample}
36
+ ></ox-data-sample-subgroup-view>
37
+ `);
38
+ }
39
+ }
40
+ else {
41
+ currentTableItems.push(dataItem);
42
+ }
43
+ });
44
+ // If there are any remaining non-grouped items, render them in a final table
45
+ if (currentTableItems.length > 0) {
46
+ tables.push(this.buildTable(currentTableItems, data, judgment, useCaseNames));
47
+ }
48
+ return html `
49
+ <h2>${name}</h2>
21
50
  <p page-description>
22
51
  <md-icon>info</md-icon> ${description}<br />
23
52
  <md-icon>alarm</md-icon> ${i18next.t('field.work-date')}: ${workDate} ${workShift} |
@@ -25,49 +54,42 @@ let OxDataSampleView = class OxDataSampleView extends LitElement {
25
54
  ${formatter.format(new Date(collectedAt))}
26
55
  </p>
27
56
 
28
- <form>
29
- ${nonGroupDataItems.length > 0
30
- ? html `
31
- <table>
32
- <tr>
33
- <th item>${i18next.t('field.item')}</th>
34
- <th>${i18next.t('field.description')}</th>
35
- <th>${i18next.t('field.finalizing-function')}</th>
36
- <th>${i18next.t('field.unit')}</th>
37
- <th value>${i18next.t('field.value')}</th>
38
- <th>${i18next.t('field.spec')}</th>
39
- <th>${i18next.t('field.ooc')}</th>
40
- <th>${i18next.t('field.oos')}</th>
41
- </tr>
42
- ${nonGroupDataItems.map(dataItem => {
43
- const { name = '', tag = '', description = '', stat, unit = '', spec = {}, type } = dataItem;
44
- const value = data[tag];
45
- const { ooc, oos } = (judgment === null || judgment === void 0 ? void 0 : judgment[tag]) || {};
46
- return html `
47
- <tr ?ooc=${ooc} ?oos=${oos}>
48
- <td name>${name}</td>
49
- <td>${description}</td>
50
- <td>${stat}</td>
51
- <td>${unit}</td>
52
- <td>${this.buildValue(type, value)}</td>
53
- <td><pre>${this.buildSpec(useCaseNames, spec)}</pre></td>
54
- <td>${ooc ? html `<md-icon>done</md-icon>` : ''}</td>
55
- <td>${oos ? html `<md-icon>done</md-icon>` : ''}</td>
56
- </tr>
57
- `;
58
- })}
59
- </table>
60
- `
61
- : nothing}
62
- ${Object.keys(dataItemSubgroups).map(subgroup => {
57
+ <form>${tables}</form>
58
+ `;
59
+ }
60
+ buildTable(dataItems, data, judgment, useCaseNames) {
61
+ return html `
62
+ <table>
63
+ <tr>
64
+ <th item>${i18next.t('field.item')}</th>
65
+ <th>${i18next.t('field.description')}</th>
66
+ <th>${i18next.t('field.finalizing-function')}</th>
67
+ <th>${i18next.t('field.unit')}</th>
68
+ <th value>${i18next.t('field.value')}</th>
69
+ <th>${i18next.t('field.spec')}</th>
70
+ <th>${i18next.t('field.ooc')}</th>
71
+ <th>${i18next.t('field.oos')}</th>
72
+ </tr>
73
+
74
+ ${dataItems.map(dataItem => {
75
+ const { name = '', tag = '', description = '', stat, unit = '', spec = {}, type } = dataItem;
76
+ const value = data[tag];
77
+ const { ooc, oos } = (judgment === null || judgment === void 0 ? void 0 : judgment[tag]) || {};
63
78
  return html `
64
- <ox-data-sample-subgroup-view
65
- .subgroup=${subgroup}
66
- .dataSample=${this.dataSample}
67
- ></ox-data-sample-subgroup-view>
79
+ <tr ?ooc=${ooc} ?oos=${oos}>
80
+ <td name>${name}</td>
81
+ <td>${description}</td>
82
+ <td>${stat}</td>
83
+ <td>${unit}</td>
84
+ <td>${this.buildValue(type, value)}</td>
85
+ <td><pre>${this.buildSpec(useCaseNames, spec)}</pre></td>
86
+ <td>${ooc ? html `<md-icon>done</md-icon>` : ''}</td>
87
+ <td>${oos ? html `<md-icon>done</md-icon>` : ''}</td>
88
+ </tr>
68
89
  `;
69
90
  })}
70
- </form>`;
91
+ </table>
92
+ `;
71
93
  }
72
94
  groupDataItemsByGroup(dataItems) {
73
95
  const groupedDataItems = {};
@@ -1 +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 '@material/web/icon/icon.js'\nimport '@operato/input/ox-input-file.js'\nimport '@operato/input/ox-input-signature.js'\nimport './ox-data-sample-subgroup-view.js'\n\nimport { css, html, LitElement, nothing } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\n\nimport { i18next } from '@operato/i18n'\n\nimport { DataItem, DataSample, DataSpecLimitSet } from './types.js'\nimport { OxDataUseCase } from './usecase/ox-data-use-case.js'\n\n@customElement('ox-data-sample-view')\nexport class OxDataSampleView extends LitElement {\n static styles = css`\n :host {\n display: flex;\n flex-direction: column;\n\n --signature-min-width: 100px;\n --signature-min-height: 60px;\n }\n\n form {\n flex: 1;\n\n display: flex;\n flex-direction: column;\n }\n\n h2 {\n margin: var(--title-margin);\n font: var(--title-font);\n color: var(--title-text-color);\n text-transform: capitalize;\n }\n [page-description] {\n margin: var(--page-description-margin);\n opacity: 0.7;\n font: var(--page-description-font);\n color: var(--md-sys-color-on-secondary-container);\n text-transform: capitalize;\n }\n [page-description] * {\n vertical-align: middle;\n }\n [page-description] md-icon {\n margin-top: -2px;\n font-size: 0.9rem;\n color: var(--page-description-color);\n }\n\n table {\n border-collapse: collapse;\n margin-bottom: var(--spacing-medium);\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 white-space: nowrap;\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 md-icon {\n color: var(--md-sys-color-error);\n }\n\n pre {\n tab-size: 2;\n }\n\n a[file] {\n display: flex;\n align-items: center;\n gap: var(--spacing-small);\n }\n\n a[file] md-icon {\n --md-icon-size: 16px;\n color: var(--md-sys-color-primary);\n }\n\n @media print {\n :host {\n display: block;\n }\n }\n\n @media screen and (max-width: 480px) {\n th {\n min-width: 50px;\n }\n }\n `\n\n @property({ type: Object }) dataSample?: DataSample\n\n render() {\n if (!this.dataSample) {\n return html``\n }\n\n const {\n name,\n description,\n collectedAt,\n workDate,\n workShift,\n useCase,\n data = {},\n judgment,\n dataItems = []\n } = this.dataSample\n const formatter = new Intl.DateTimeFormat(navigator.language, { dateStyle: 'full', timeStyle: 'short' })\n const useCaseNames = useCase?.split(',').filter(useCase => useCase.trim()) || []\n const nonGroupDataItems = dataItems.filter(dataItem => !dataItem.group && !dataItem.hidden)\n const dataItemSubgroups = this.groupDataItemsByGroup(dataItems)\n\n return html` <h2>${name}</h2>\n <p page-description>\n <md-icon>info</md-icon> ${description}<br />\n <md-icon>alarm</md-icon> ${i18next.t('field.work-date')}: ${workDate} ${workShift} |\n <md-icon>pending_actions</md-icon> ${i18next.t('field.collected-at')}:\n ${formatter.format(new Date(collectedAt!))}\n </p>\n\n <form>\n ${nonGroupDataItems.length > 0\n ? html`\n <table>\n <tr>\n <th item>${i18next.t('field.item')}</th>\n <th>${i18next.t('field.description')}</th>\n <th>${i18next.t('field.finalizing-function')}</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 ${nonGroupDataItems.map(dataItem => {\n const { name = '', tag = '', description = '', stat, unit = '', spec = {}, type } = dataItem\n const value = data[tag]\n const { ooc, oos } = judgment?.[tag] || {}\n\n return html`\n <tr ?ooc=${ooc} ?oos=${oos}>\n <td name>${name}</td>\n <td>${description}</td>\n <td>${stat}</td>\n <td>${unit}</td>\n <td>${this.buildValue(type, value)}</td>\n <td><pre>${this.buildSpec(useCaseNames, spec)}</pre></td>\n <td>${ooc ? html`<md-icon>done</md-icon>` : ''}</td>\n <td>${oos ? html`<md-icon>done</md-icon>` : ''}</td>\n </tr>\n `\n })}\n </table>\n `\n : nothing}\n ${Object.keys(dataItemSubgroups).map(subgroup => {\n return html`\n <ox-data-sample-subgroup-view\n .subgroup=${subgroup}\n .dataSample=${this.dataSample}\n ></ox-data-sample-subgroup-view>\n `\n })}\n </form>`\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, hidden } = dataItem\n\n if (group && !hidden) {\n if (!groupedDataItems[group]) {\n groupedDataItems[group] = []\n }\n\n groupedDataItems[group].push(dataItem)\n }\n }\n\n return groupedDataItems\n }\n\n private buildSpec(useCaseNames: string[], spec: DataSpecLimitSet): string {\n return OxDataUseCase.elaborateDataItemSpec(useCaseNames, spec)\n }\n\n private download(file: { mimetype: string; name: string; fullpath: string }) {\n const element = document.createElement('a')\n element.setAttribute('href', file.fullpath)\n element.setAttribute('download', file.name!)\n document.body.appendChild(element)\n element.click()\n }\n\n private buildValue(type: string, value: any | any[]) {\n if (value === undefined) {\n return ''\n }\n const values = value instanceof Array ? value : [value]\n\n if (type == 'file') {\n const files = values.flat() as { mimetype: string; name: string; fullpath: string }[]\n\n return files\n .filter(Boolean)\n .map(file => html`<a @click=${() => this.download(file)} file><md-icon>description</md-icon>${file.name}</a>`)\n }\n\n if (type == 'signature') {\n return html` <ox-input-signature .value=${value} disabled></ox-input-signature>`\n }\n\n const elements = values.map((v: any, idx) => {\n switch (typeof v) {\n case 'boolean':\n return html` <input type=\"checkbox\" .checked=${v} disabled />`\n break\n\n default:\n if (type == 'date') {\n return v ? new Date(v).toLocaleDateString() : ''\n } else if (type == 'datetime') {\n return v ? new Date(v).toLocaleString() : ''\n }\n return v ?? ''\n }\n })\n\n return typeof values[0] === 'boolean' ? elements : elements.join(', ')\n }\n}\n"]}
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 '@material/web/icon/icon.js'\nimport '@operato/input/ox-input-file.js'\nimport '@operato/input/ox-input-signature.js'\nimport './ox-data-sample-subgroup-view.js'\n\nimport { css, html, LitElement, TemplateResult } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\n\nimport { i18next } from '@operato/i18n'\n\nimport { DataItem, DataSample, DataSpecLimitSet } from './types.js'\nimport { OxDataUseCase } from './usecase/ox-data-use-case.js'\n\n@customElement('ox-data-sample-view')\nexport class OxDataSampleView extends LitElement {\n static styles = css`\n :host {\n display: flex;\n flex-direction: column;\n\n --signature-min-width: 100px;\n --signature-min-height: 60px;\n }\n\n form {\n flex: 1;\n\n display: flex;\n flex-direction: column;\n }\n\n h2 {\n margin: var(--title-margin);\n font: var(--title-font);\n color: var(--title-text-color);\n text-transform: capitalize;\n }\n [page-description] {\n margin: var(--page-description-margin);\n opacity: 0.7;\n font: var(--page-description-font);\n color: var(--md-sys-color-on-secondary-container);\n text-transform: capitalize;\n }\n [page-description] * {\n vertical-align: middle;\n }\n [page-description] md-icon {\n margin-top: -2px;\n font-size: 0.9rem;\n color: var(--page-description-color);\n }\n\n table {\n border-collapse: collapse;\n margin-bottom: var(--spacing-medium);\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 white-space: nowrap;\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 md-icon {\n color: var(--md-sys-color-error);\n }\n\n pre {\n tab-size: 2;\n }\n\n a[file] {\n display: flex;\n align-items: center;\n gap: var(--spacing-small);\n }\n\n a[file] md-icon {\n --md-icon-size: 16px;\n color: var(--md-sys-color-primary);\n }\n\n @media print {\n :host {\n display: block;\n }\n }\n\n @media screen and (max-width: 480px) {\n th {\n min-width: 50px;\n }\n }\n `\n\n @property({ type: Object }) dataSample?: DataSample\n\n render() {\n if (!this.dataSample) {\n return html``\n }\n\n const {\n name,\n description,\n collectedAt,\n workDate,\n workShift,\n useCase,\n data = {},\n judgment,\n dataItems = []\n } = this.dataSample\n const formatter = new Intl.DateTimeFormat(navigator.language, { dateStyle: 'full', timeStyle: 'short' })\n const useCaseNames = useCase?.split(',').filter(useCase => useCase.trim()) || []\n const groupedItems = this.groupDataItemsByGroup(dataItems)\n const renderedGroups = new Set<string>() // To track rendered subgroups\n\n let currentTableItems: DataItem[] = [] // To store items for the current table\n const tables: TemplateResult[] = [] // To store generated tables\n\n dataItems.forEach((dataItem, index) => {\n if (dataItem.group) {\n // If we reach a subgroup, first store the existing non-grouped items as a table\n if (currentTableItems.length > 0) {\n tables.push(this.buildTable(currentTableItems, data, judgment, useCaseNames))\n currentTableItems = [] // Reset for the next segment\n }\n\n // Render the subgroup **only if it's the first time being encountered**\n if (!renderedGroups.has(dataItem.group)) {\n renderedGroups.add(dataItem.group)\n tables.push(html`\n <ox-data-sample-subgroup-view\n .subgroup=${dataItem.group}\n .dataSample=${this.dataSample}\n ></ox-data-sample-subgroup-view>\n `)\n }\n } else {\n currentTableItems.push(dataItem)\n }\n })\n\n // If there are any remaining non-grouped items, render them in a final table\n if (currentTableItems.length > 0) {\n tables.push(this.buildTable(currentTableItems, data, judgment, useCaseNames))\n }\n\n return html`\n <h2>${name}</h2>\n <p page-description>\n <md-icon>info</md-icon> ${description}<br />\n <md-icon>alarm</md-icon> ${i18next.t('field.work-date')}: ${workDate} ${workShift} |\n <md-icon>pending_actions</md-icon> ${i18next.t('field.collected-at')}:\n ${formatter.format(new Date(collectedAt!))}\n </p>\n\n <form>${tables}</form>\n `\n }\n\n private buildTable(dataItems: DataItem[], data: any, judgment: any, useCaseNames: string[]): TemplateResult {\n return html`\n <table>\n <tr>\n <th item>${i18next.t('field.item')}</th>\n <th>${i18next.t('field.description')}</th>\n <th>${i18next.t('field.finalizing-function')}</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\n ${dataItems.map(dataItem => {\n const { name = '', tag = '', description = '', stat, unit = '', spec = {}, type } = dataItem\n const value = data[tag]\n const { ooc, oos } = judgment?.[tag] || {}\n\n return html`\n <tr ?ooc=${ooc} ?oos=${oos}>\n <td name>${name}</td>\n <td>${description}</td>\n <td>${stat}</td>\n <td>${unit}</td>\n <td>${this.buildValue(type, value)}</td>\n <td><pre>${this.buildSpec(useCaseNames, spec)}</pre></td>\n <td>${ooc ? html`<md-icon>done</md-icon>` : ''}</td>\n <td>${oos ? html`<md-icon>done</md-icon>` : ''}</td>\n </tr>\n `\n })}\n </table>\n `\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, hidden } = dataItem\n\n if (group && !hidden) {\n if (!groupedDataItems[group]) {\n groupedDataItems[group] = []\n }\n\n groupedDataItems[group].push(dataItem)\n }\n }\n\n return groupedDataItems\n }\n\n private buildSpec(useCaseNames: string[], spec: DataSpecLimitSet): string {\n return OxDataUseCase.elaborateDataItemSpec(useCaseNames, spec)\n }\n\n private download(file: { mimetype: string; name: string; fullpath: string }) {\n const element = document.createElement('a')\n element.setAttribute('href', file.fullpath)\n element.setAttribute('download', file.name!)\n document.body.appendChild(element)\n element.click()\n }\n\n private buildValue(type: string, value: any | any[]) {\n if (value === undefined) {\n return ''\n }\n const values = value instanceof Array ? value : [value]\n\n if (type == 'file') {\n const files = values.flat() as { mimetype: string; name: string; fullpath: string }[]\n\n return files\n .filter(Boolean)\n .map(file => html`<a @click=${() => this.download(file)} file><md-icon>description</md-icon>${file.name}</a>`)\n }\n\n if (type == 'signature') {\n return html` <ox-input-signature .value=${value} disabled></ox-input-signature>`\n }\n\n const elements = values.map((v: any, idx) => {\n switch (typeof v) {\n case 'boolean':\n return html` <input type=\"checkbox\" .checked=${v} disabled />`\n break\n\n default:\n if (type == 'date') {\n return v ? new Date(v).toLocaleDateString() : ''\n } else if (type == 'datetime') {\n return v ? new Date(v).toLocaleString() : ''\n }\n return v ?? ''\n }\n })\n\n return typeof values[0] === 'boolean' ? elements : elements.join(', ')\n }\n}\n"]}
@@ -0,0 +1,19 @@
1
+ import '@operato/i18n';
2
+ import '../src/ox-data-entry-form.js';
3
+ import '../src/usecase/ccp';
4
+ import '@material/web/icon/icon.js';
5
+ import { TemplateResult } from 'lit';
6
+ declare const _default: {
7
+ title: string;
8
+ component: string;
9
+ argTypes: {};
10
+ };
11
+ export default _default;
12
+ interface Story<T> {
13
+ (args: T): TemplateResult;
14
+ args?: Partial<T>;
15
+ argTypes?: Record<string, unknown>;
16
+ }
17
+ interface ArgTypes {
18
+ }
19
+ export declare const Regular: Story<ArgTypes>;
@@ -0,0 +1,248 @@
1
+ import '@operato/i18n';
2
+ import '../src/ox-data-entry-form.js';
3
+ import '../src/usecase/ccp'; /* register usecase CCP */
4
+ import '@material/web/icon/icon.js';
5
+ import { html } from 'lit';
6
+ export default {
7
+ title: 'ox-data-entry-form-subgroups',
8
+ component: 'ox-data-entry-form',
9
+ argTypes: {}
10
+ };
11
+ const dataSet = {
12
+ name: 'sample',
13
+ description: 'sample description',
14
+ useCase: 'CCP',
15
+ dataItems: [
16
+ {
17
+ name: '라디오 독립',
18
+ description: '라디오',
19
+ sequence: 5,
20
+ tag: 'check2',
21
+ type: 'radio',
22
+ options: {
23
+ options: [
24
+ {
25
+ text: '예',
26
+ value: 'Y'
27
+ },
28
+ {
29
+ text: '아니오',
30
+ value: 'N'
31
+ }
32
+ ]
33
+ },
34
+ quota: 1,
35
+ active: true
36
+ },
37
+ {
38
+ name: '첨부파일',
39
+ description: '참조 첨부 파일.',
40
+ sequence: 4,
41
+ tag: 'attachment',
42
+ type: 'file',
43
+ quota: 1,
44
+ active: true
45
+ },
46
+ {
47
+ name: '창고 온도',
48
+ description: '창고 온도는 섭씨 0도 이하로 유지되어야 합니다.',
49
+ sequence: 1,
50
+ tag: 'temp',
51
+ group: '측정데이타',
52
+ type: 'number',
53
+ quota: 1,
54
+ active: true,
55
+ unit: '℃',
56
+ spec: {
57
+ CCP: {
58
+ criticalLimits: {
59
+ minimum: 100,
60
+ maximum: 200
61
+ },
62
+ targetLimits: {
63
+ minimum: 120,
64
+ maximum: 180
65
+ }
66
+ }
67
+ }
68
+ },
69
+ {
70
+ name: '코멘트',
71
+ description: '특이사항을 기록함.',
72
+ sequence: 4,
73
+ tag: 'comment',
74
+ type: 'string',
75
+ quota: 1,
76
+ active: true
77
+ },
78
+ {
79
+ name: '창고 습도',
80
+ description: '창고 습도는 30% 이하로 유지되어야 합니다.',
81
+ sequence: 2,
82
+ tag: 'humid',
83
+ group: '측정데이타2',
84
+ type: 'number',
85
+ quota: 5,
86
+ active: true,
87
+ unit: '%',
88
+ spec: {
89
+ CCP: {
90
+ criticalLimits: {
91
+ minimum: 10,
92
+ maximum: 50
93
+ },
94
+ targetLimits: {
95
+ minimum: 20,
96
+ maximum: 40
97
+ }
98
+ }
99
+ }
100
+ },
101
+ {
102
+ name: '설명',
103
+ description: '설명',
104
+ sequence: 12,
105
+ tag: 'description',
106
+ type: 'string',
107
+ active: true,
108
+ group: '측정데이타2'
109
+ },
110
+ {
111
+ name: '육안 검사',
112
+ description: '육안 검사는 포장전 30분 내로 실행되어야 합니다.',
113
+ sequence: 3,
114
+ tag: 'inspection',
115
+ group: '측정데이타',
116
+ type: 'boolean',
117
+ quota: 3,
118
+ active: true,
119
+ spec: {
120
+ CCP: {
121
+ criticalLimits: {
122
+ acceptables: true
123
+ },
124
+ targetLimits: {
125
+ acceptables: true
126
+ }
127
+ }
128
+ }
129
+ },
130
+ {
131
+ name: '품평',
132
+ description: '품평은 최우수/우수/보통/미달을 포함하여 간단히 평가.',
133
+ sequence: 4,
134
+ tag: 'evaluation',
135
+ group: '측정데이타2',
136
+ type: 'select',
137
+ options: {
138
+ options: [
139
+ { text: '최우수', value: '최우수' },
140
+ { text: '우수', value: '우수' },
141
+ { text: '보통', value: '보통' },
142
+ { text: '미달', value: '미달' },
143
+ { text: '등외', value: '등외' }
144
+ ]
145
+ },
146
+ quota: 3,
147
+ active: true,
148
+ spec: {
149
+ CCP: {
150
+ criticalLimits: {
151
+ acceptables: ['최우수', '우수', '보통']
152
+ },
153
+ targetLimits: {
154
+ acceptables: ['최우수', '우수']
155
+ }
156
+ }
157
+ }
158
+ },
159
+ {
160
+ name: '라디오 측정',
161
+ description: '라디오 그룹',
162
+ group: '측정데이타',
163
+ sequence: 5,
164
+ tag: 'check1',
165
+ type: 'radio',
166
+ options: {
167
+ options: [
168
+ {
169
+ text: '예',
170
+ value: 'Y'
171
+ },
172
+ {
173
+ text: '아니오',
174
+ value: 'N'
175
+ }
176
+ ]
177
+ },
178
+ quota: 3,
179
+ active: true
180
+ },
181
+ {
182
+ name: '서명',
183
+ description: '품평가 서명.',
184
+ sequence: 4,
185
+ tag: 'sign',
186
+ group: '측정데이타',
187
+ type: 'signature',
188
+ quota: 3,
189
+ active: true
190
+ },
191
+ {
192
+ name: '서명',
193
+ description: '서명',
194
+ sequence: 5,
195
+ tag: 'signature',
196
+ type: 'signature',
197
+ quota: 1,
198
+ active: true
199
+ }
200
+ ]
201
+ };
202
+ var value = {
203
+ temp: 1000,
204
+ humid: [20, 23, 21, 26, 27],
205
+ inspection: [true, false, true],
206
+ evaluation: ['최우수', '보통', '우수'],
207
+ comment: '이것이 코멘트입니다.',
208
+ description: [''],
209
+ signature: 'data:image/png;base64,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'
210
+ };
211
+ const Template = ({}) => html `
212
+ <link
213
+ href="https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL@20..48,100..700,0..1"
214
+ rel="stylesheet"
215
+ />
216
+ <link
217
+ href="https://fonts.googleapis.com/css2?family=Material+Symbols+Rounded:opsz,wght,FILL@20..48,100..700,0..1"
218
+ rel="stylesheet"
219
+ />
220
+ <link
221
+ href="https://fonts.googleapis.com/css2?family=Material+Symbols+Sharp:opsz,wght,FILL@20..48,100..700,0..1"
222
+ rel="stylesheet"
223
+ />
224
+
225
+ <style>
226
+ body {
227
+ }
228
+ </style>
229
+
230
+ <link href="/themes/app-theme.css" rel="stylesheet" />
231
+ <link href="/themes/light.css" rel="stylesheet" />
232
+ <link href="/themes/dark.css" rel="stylesheet" />
233
+ <link href="/themes/spacing.css" rel="stylesheet" />
234
+ <link href="/themes/grist-theme.css" rel="stylesheet" />
235
+ <link href="/themes/form-theme.css" rel="stylesheet" />
236
+
237
+ <ox-data-entry-form
238
+ .dataSet=${dataSet}
239
+ .value=${value}
240
+ @change=${(e) => {
241
+ value = e.detail;
242
+ console.log('change', value);
243
+ }}
244
+ ></ox-data-entry-form>
245
+ `;
246
+ export const Regular = Template.bind({});
247
+ Regular.args = {};
248
+ //# sourceMappingURL=ox-data-entry-form-subgroups.stories.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ox-data-entry-form-subgroups.stories.js","sourceRoot":"","sources":["../../stories/ox-data-entry-form-subgroups.stories.ts"],"names":[],"mappings":"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","sourcesContent":["import '@operato/i18n'\nimport '../src/ox-data-entry-form.js'\nimport '../src/usecase/ccp' /* register usecase CCP */\nimport '@material/web/icon/icon.js'\n\nimport { html, TemplateResult } from 'lit'\n\nexport default {\n title: 'ox-data-entry-form-subgroups',\n component: 'ox-data-entry-form',\n argTypes: {}\n}\n\ninterface Story<T> {\n (args: T): TemplateResult\n args?: Partial<T>\n argTypes?: Record<string, unknown>\n}\n\ninterface ArgTypes {}\n\nconst dataSet = {\n name: 'sample',\n description: 'sample description',\n useCase: 'CCP',\n dataItems: [\n {\n name: '라디오 독립',\n description: '라디오',\n sequence: 5,\n tag: 'check2',\n type: 'radio',\n options: {\n options: [\n {\n text: '예',\n value: 'Y'\n },\n {\n text: '아니오',\n value: 'N'\n }\n ]\n },\n quota: 1,\n active: true\n },\n {\n name: '첨부파일',\n description: '참조 첨부 파일.',\n sequence: 4,\n tag: 'attachment',\n type: 'file',\n quota: 1,\n active: true\n },\n {\n name: '창고 온도',\n description: '창고 온도는 섭씨 0도 이하로 유지되어야 합니다.',\n sequence: 1,\n tag: 'temp',\n group: '측정데이타',\n type: 'number',\n quota: 1,\n active: true,\n unit: '℃',\n spec: {\n CCP: {\n criticalLimits: {\n minimum: 100,\n maximum: 200\n },\n targetLimits: {\n minimum: 120,\n maximum: 180\n }\n }\n }\n },\n {\n name: '코멘트',\n description: '특이사항을 기록함.',\n sequence: 4,\n tag: 'comment',\n type: 'string',\n quota: 1,\n active: true\n },\n {\n name: '창고 습도',\n description: '창고 습도는 30% 이하로 유지되어야 합니다.',\n sequence: 2,\n tag: 'humid',\n group: '측정데이타2',\n type: 'number',\n quota: 5,\n active: true,\n unit: '%',\n spec: {\n CCP: {\n criticalLimits: {\n minimum: 10,\n maximum: 50\n },\n targetLimits: {\n minimum: 20,\n maximum: 40\n }\n }\n }\n },\n {\n name: '설명',\n description: '설명',\n sequence: 12,\n tag: 'description',\n type: 'string',\n active: true,\n group: '측정데이타2'\n },\n {\n name: '육안 검사',\n description: '육안 검사는 포장전 30분 내로 실행되어야 합니다.',\n sequence: 3,\n tag: 'inspection',\n group: '측정데이타',\n type: 'boolean',\n quota: 3,\n active: true,\n spec: {\n CCP: {\n criticalLimits: {\n acceptables: true\n },\n targetLimits: {\n acceptables: true\n }\n }\n }\n },\n {\n name: '품평',\n description: '품평은 최우수/우수/보통/미달을 포함하여 간단히 평가.',\n sequence: 4,\n tag: 'evaluation',\n group: '측정데이타2',\n type: 'select',\n options: {\n options: [\n { text: '최우수', value: '최우수' },\n { text: '우수', value: '우수' },\n { text: '보통', value: '보통' },\n { text: '미달', value: '미달' },\n { text: '등외', value: '등외' }\n ]\n },\n quota: 3,\n active: true,\n spec: {\n CCP: {\n criticalLimits: {\n acceptables: ['최우수', '우수', '보통']\n },\n targetLimits: {\n acceptables: ['최우수', '우수']\n }\n }\n }\n },\n {\n name: '라디오 측정',\n description: '라디오 그룹',\n group: '측정데이타',\n sequence: 5,\n tag: 'check1',\n type: 'radio',\n options: {\n options: [\n {\n text: '예',\n value: 'Y'\n },\n {\n text: '아니오',\n value: 'N'\n }\n ]\n },\n quota: 3,\n active: true\n },\n {\n name: '서명',\n description: '품평가 서명.',\n sequence: 4,\n tag: 'sign',\n group: '측정데이타',\n type: 'signature',\n quota: 3,\n active: true\n },\n {\n name: '서명',\n description: '서명',\n sequence: 5,\n tag: 'signature',\n type: 'signature',\n quota: 1,\n active: true\n }\n ]\n}\n\nvar value = {\n temp: 1000,\n humid: [20, 23, 21, 26, 27],\n inspection: [true, false, true],\n evaluation: ['최우수', '보통', '우수'],\n comment: '이것이 코멘트입니다.',\n description: [''],\n signature:\n 'data:image/png;base64,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'\n}\n\nconst Template: Story<ArgTypes> = ({}: ArgTypes) => html`\n <link\n href=\"https://fonts.googleapis.com/css2?family=Material+Symbols+Outlined:opsz,wght,FILL@20..48,100..700,0..1\"\n rel=\"stylesheet\"\n />\n <link\n href=\"https://fonts.googleapis.com/css2?family=Material+Symbols+Rounded:opsz,wght,FILL@20..48,100..700,0..1\"\n rel=\"stylesheet\"\n />\n <link\n href=\"https://fonts.googleapis.com/css2?family=Material+Symbols+Sharp:opsz,wght,FILL@20..48,100..700,0..1\"\n rel=\"stylesheet\"\n />\n\n <style>\n body {\n }\n </style>\n\n <link href=\"/themes/app-theme.css\" rel=\"stylesheet\" />\n <link href=\"/themes/light.css\" rel=\"stylesheet\" />\n <link href=\"/themes/dark.css\" rel=\"stylesheet\" />\n <link href=\"/themes/spacing.css\" rel=\"stylesheet\" />\n <link href=\"/themes/grist-theme.css\" rel=\"stylesheet\" />\n <link href=\"/themes/form-theme.css\" rel=\"stylesheet\" />\n\n <ox-data-entry-form\n .dataSet=${dataSet}\n .value=${value}\n @change=${(e: CustomEvent) => {\n value = e.detail\n console.log('change', value)\n }}\n ></ox-data-entry-form>\n`\n\nexport const Regular = Template.bind({})\nRegular.args = {}\n"]}
@@ -13,6 +13,47 @@ const dataSet = {
13
13
  description: 'sample description',
14
14
  useCase: 'CCP',
15
15
  dataItems: [
16
+ {
17
+ name: '라디오 독립',
18
+ description: '라디오',
19
+ sequence: 5,
20
+ tag: 'check2',
21
+ type: 'radio',
22
+ options: {
23
+ options: [
24
+ {
25
+ text: '예',
26
+ value: 'Y'
27
+ },
28
+ {
29
+ text: '아니오',
30
+ value: 'N'
31
+ }
32
+ ]
33
+ },
34
+ // quota: 1,
35
+ quota: '', // intentionally set to empty string to test the default value
36
+ active: true
37
+ },
38
+ {
39
+ name: '첨부파일',
40
+ description: '참조 첨부 파일.',
41
+ sequence: 4,
42
+ tag: 'attachment',
43
+ type: 'file',
44
+ // quota: 1,
45
+ quota: '', // intentionally set to empty string to test the default value
46
+ active: true
47
+ },
48
+ {
49
+ name: '설명',
50
+ description: '설명',
51
+ sequence: 12,
52
+ tag: 'description',
53
+ type: 'string',
54
+ quota: 1,
55
+ active: true
56
+ },
16
57
  {
17
58
  name: '창고 온도',
18
59
  description: '창고 온도는 섭씨 0도 이하로 유지되어야 합니다.',
@@ -109,26 +150,7 @@ const dataSet = {
109
150
  }
110
151
  },
111
152
  {
112
- name: '서명',
113
- description: '품평가 서명.',
114
- sequence: 4,
115
- tag: 'sign',
116
- group: '측정데이타',
117
- type: 'signature',
118
- quota: 3,
119
- active: true
120
- },
121
- {
122
- name: '코멘트',
123
- description: '특이사항을 기록함.',
124
- sequence: 4,
125
- tag: 'comment',
126
- type: 'string',
127
- quota: 1,
128
- active: true
129
- },
130
- {
131
- name: '라디오',
153
+ name: '라디오 측정',
132
154
  description: '라디오 그룹',
133
155
  group: '측정데이타',
134
156
  sequence: 5,
@@ -150,32 +172,21 @@ const dataSet = {
150
172
  active: true
151
173
  },
152
174
  {
153
- name: '라디오2',
154
- description: '라디오 그룹2',
155
- sequence: 5,
156
- tag: 'check2',
157
- type: 'radio',
158
- options: {
159
- options: [
160
- {
161
- text: '예',
162
- value: 'Y'
163
- },
164
- {
165
- text: '아니오',
166
- value: 'N'
167
- }
168
- ]
169
- },
170
- quota: 1,
175
+ name: '서명',
176
+ description: '품평가 서명.',
177
+ sequence: 4,
178
+ tag: 'sign',
179
+ group: '측정데이타',
180
+ type: 'signature',
181
+ quota: 3,
171
182
  active: true
172
183
  },
173
184
  {
174
- name: '첨부파일',
175
- description: '참조 첨부 파일.',
185
+ name: '코멘트',
186
+ description: '특이사항을 기록함.',
176
187
  sequence: 4,
177
- tag: 'attachment',
178
- type: 'file',
188
+ tag: 'comment',
189
+ type: 'string',
179
190
  quota: 1,
180
191
  active: true
181
192
  },
@@ -192,6 +203,7 @@ const dataSet = {
192
203
  };
193
204
  var value = {
194
205
  temp: 1000,
206
+ description: '',
195
207
  humid: [20, 23, 21, 26, 27],
196
208
  inspection: [true, false, true],
197
209
  evaluation: ['최우수', '보통', '우수'],