@operato/dataset 1.0.0-alpha.8 → 1.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 (56) hide show
  1. package/CHANGELOG.md +420 -0
  2. package/demo/index.html +8 -90
  3. package/demo/ox-data-entry-form.html +118 -0
  4. package/demo/ox-data-item-spec.html +152 -0
  5. package/demo/ox-data-ooc-view.html +185 -0
  6. package/demo/ox-data-sample-view.html +150 -0
  7. package/demo/ox-grist-editor-data-item-spec.html +476 -0
  8. package/dist/src/grist-editor/index.d.ts +1 -0
  9. package/dist/src/grist-editor/index.js +7 -0
  10. package/dist/src/grist-editor/index.js.map +1 -0
  11. package/dist/src/grist-editor/ox-grist-editor-data-item-spec.d.ts +11 -0
  12. package/dist/src/grist-editor/ox-grist-editor-data-item-spec.js +77 -0
  13. package/dist/src/grist-editor/ox-grist-editor-data-item-spec.js.map +1 -0
  14. package/dist/src/grist-editor/ox-popup-data-item-spec.d.ts +13 -0
  15. package/dist/src/grist-editor/ox-popup-data-item-spec.js +90 -0
  16. package/dist/src/grist-editor/ox-popup-data-item-spec.js.map +1 -0
  17. package/dist/src/index.d.ts +6 -1
  18. package/dist/src/index.js +6 -1
  19. package/dist/src/index.js.map +1 -1
  20. package/dist/src/ox-data-entry-form.d.ts +1 -24
  21. package/dist/src/ox-data-entry-form.js +12 -16
  22. package/dist/src/ox-data-entry-form.js.map +1 -1
  23. package/dist/src/ox-data-item-spec.d.ts +18 -0
  24. package/dist/src/ox-data-item-spec.js +77 -0
  25. package/dist/src/ox-data-item-spec.js.map +1 -0
  26. package/dist/src/ox-data-ooc-view.d.ts +10 -0
  27. package/dist/src/ox-data-ooc-view.js +69 -0
  28. package/dist/src/ox-data-ooc-view.js.map +1 -0
  29. package/dist/src/ox-data-sample-view.d.ts +13 -0
  30. package/dist/src/ox-data-sample-view.js +168 -0
  31. package/dist/src/ox-data-sample-view.js.map +1 -0
  32. package/dist/src/ox-data-use-case.d.ts +16 -0
  33. package/dist/src/ox-data-use-case.js +111 -0
  34. package/dist/src/ox-data-use-case.js.map +1 -0
  35. package/dist/src/types.d.ts +78 -0
  36. package/dist/src/types.js +2 -0
  37. package/dist/src/types.js.map +1 -0
  38. package/dist/tsconfig.tsbuildinfo +1 -1
  39. package/package.json +20 -12
  40. package/src/grist-editor/index.ts +10 -0
  41. package/src/grist-editor/ox-grist-editor-data-item-spec.ts +92 -0
  42. package/src/grist-editor/ox-popup-data-item-spec.ts +90 -0
  43. package/src/index.ts +6 -1
  44. package/src/ox-data-entry-form.ts +13 -37
  45. package/src/ox-data-item-spec.ts +74 -0
  46. package/src/ox-data-ooc-view.ts +67 -0
  47. package/src/ox-data-sample-view.ts +175 -0
  48. package/src/ox-data-use-case.ts +147 -0
  49. package/src/types.ts +72 -0
  50. package/themes/grist-theme.css +194 -0
  51. package/themes/oops-theme.css +26 -0
  52. package/themes/report-theme.css +47 -0
  53. package/translations/en.json +1 -0
  54. package/translations/ko.json +1 -0
  55. package/translations/ms.json +1 -0
  56. package/translations/zh.json +1 -0
@@ -0,0 +1,147 @@
1
+ import { DataItem, DataItemSpecSet, DataSet, EvaluationResult } from './types'
2
+
3
+ export abstract class OxDataUseCase {
4
+ static registry: { [name: string]: OxDataUseCase } = {}
5
+
6
+ public static registerUseCase(name: string, useCase: OxDataUseCase) {
7
+ OxDataUseCase.registry[name] = useCase
8
+ }
9
+
10
+ public static getUseCaseNames() {
11
+ return Object.keys(OxDataUseCase.registry)
12
+ }
13
+
14
+ public static getUseCases(): OxDataUseCase[] {
15
+ return Object.values(OxDataUseCase.registry)
16
+ }
17
+
18
+ public static getUseCase(name: string): OxDataUseCase | undefined {
19
+ return OxDataUseCase.registry[name]
20
+ }
21
+
22
+ public static elaborateDataItemSpec(dataSet: DataSet, dataItem: DataItem): string {
23
+ if (!dataSet.useCase) {
24
+ return ''
25
+ }
26
+
27
+ const useCaseNames = dataSet.useCase.split(',').map(useCaseName => useCaseName.trim())
28
+ const useCases = useCaseNames.map(useCaseName => OxDataUseCase.getUseCase(useCaseName)).filter(useCase => !!useCase)
29
+
30
+ var texts = []
31
+
32
+ for (let j = 0; j < useCases.length; j++) {
33
+ const useCase = useCases[j]
34
+ if (!useCase) {
35
+ continue
36
+ }
37
+
38
+ const specs = dataItem.spec?.[dataSet.useCase]
39
+ if (!specs) {
40
+ continue
41
+ }
42
+
43
+ const result = useCase.elaborateUseCaseSpec(dataItem.spec)
44
+ if (!result) {
45
+ continue
46
+ }
47
+
48
+ texts.push(result)
49
+ }
50
+
51
+ return texts.join('\n')
52
+ }
53
+
54
+ public static evaluate(dataSet: DataSet, dataItems: DataItem[], data: any): EvaluationResult | undefined {
55
+ var ooc = false
56
+ var oos = false
57
+
58
+ if (!dataSet.useCase) {
59
+ return { ooc, oos }
60
+ }
61
+
62
+ const useCaseNames = dataSet.useCase.split(',').map(useCaseName => useCaseName.trim())
63
+ const useCases = useCaseNames.map(useCaseName => OxDataUseCase.getUseCase(useCaseName)).filter(useCase => !!useCase)
64
+
65
+ for (let i = 0; i < dataItems.length; i++) {
66
+ const dataItem = dataItems[i]
67
+ const { active, tag } = dataItem
68
+ if (!active || !tag) {
69
+ continue
70
+ }
71
+
72
+ let values: any | any[] = data[tag]
73
+ if (typeof values === 'undefined') {
74
+ continue // TODO what if in case no value ?
75
+ }
76
+
77
+ if (!(values instanceof Array)) {
78
+ values = [values]
79
+ }
80
+
81
+ for (let j = 0; j < useCases.length; j++) {
82
+ const useCase = useCases[j]
83
+
84
+ const specs = dataItem.spec?.[dataSet.useCase]
85
+ if (!specs) {
86
+ continue
87
+ }
88
+
89
+ const result = useCase?.evaluate(specs, values)
90
+
91
+ if (result) {
92
+ ooc ||= result.ooc
93
+ oos ||= result.oos
94
+ }
95
+ }
96
+ }
97
+
98
+ return { ooc, oos }
99
+ }
100
+
101
+ public static evaluateItem(dataSet: DataSet, dataItem: DataItem, values: any | any[]): EvaluationResult | undefined {
102
+ var ooc = false
103
+ var oos = false
104
+
105
+ if (!dataSet.useCase) {
106
+ return { ooc, oos }
107
+ }
108
+
109
+ const useCaseNames = dataSet.useCase.split(',').map(useCaseName => useCaseName.trim())
110
+ const useCases = useCaseNames.map(useCaseName => OxDataUseCase.getUseCase(useCaseName)).filter(useCase => !!useCase)
111
+
112
+ const { active, tag } = dataItem
113
+ if (!active || !tag) {
114
+ return
115
+ }
116
+
117
+ if (typeof values === 'undefined') {
118
+ return // TODO what if in case no value ?
119
+ }
120
+
121
+ if (!(values instanceof Array)) {
122
+ values = [values]
123
+ }
124
+
125
+ for (let j = 0; j < useCases.length; j++) {
126
+ const useCase = useCases[j]
127
+
128
+ const specs = dataItem.spec?.[dataSet.useCase]
129
+ if (!specs) {
130
+ return
131
+ }
132
+
133
+ const result = useCase?.evaluate(specs, values)
134
+
135
+ if (result) {
136
+ ooc ||= result.ooc
137
+ oos ||= result.oos
138
+ }
139
+ }
140
+
141
+ return { ooc, oos }
142
+ }
143
+
144
+ public abstract evaluate(specs: any, values: any[]): EvaluationResult | undefined
145
+ public abstract elaborateUseCaseSpec(spec: any): string | undefined
146
+ public abstract getSpecification(dataItem: DataItem): DataItemSpecSet
147
+ }
package/src/types.ts ADDED
@@ -0,0 +1,72 @@
1
+ export type SelectOption = { text: string; value: string }
2
+ export type SelectOptions = SelectOption[]
3
+ export type TypeOptions = {
4
+ options?: SelectOptions
5
+ [prop: string]: any
6
+ }
7
+
8
+ export type DataItem = {
9
+ name: string
10
+ description: string
11
+ sequence: number
12
+ tag: string
13
+ type: string
14
+ active: boolean
15
+ options: TypeOptions
16
+ unit: string
17
+ quota: number
18
+ spec: { [useCase: string]: any }
19
+ }
20
+
21
+ export type DataSet = {
22
+ name: string
23
+ description: string
24
+ type: 'manual' | 'automatic'
25
+ useCase: string
26
+ active: boolean
27
+ dataItems: DataItem[]
28
+ spec: { [dataItem: string]: { [useCase: string]: any } }
29
+ }
30
+
31
+ export type DataItemSpec = {
32
+ type: string
33
+ label: string
34
+ name: string
35
+ property?: { [option: string]: any }
36
+ }
37
+
38
+ export type DataItemSpecSet = {
39
+ name: string
40
+ description: string
41
+ help: string
42
+ specs: DataItemSpec[]
43
+ }
44
+
45
+ export type DataSample = {
46
+ name: string
47
+ description: string
48
+ data: any
49
+ spec: any
50
+ quota: number
51
+ workDate: string
52
+ workShift: string
53
+ collectedAt: Date
54
+ }
55
+
56
+ export type DataOocState = 'CREATED' | 'REVIEWED' | 'CORRECTED'
57
+
58
+ export type DataOoc = DataSample & {
59
+ state: DataOocState
60
+ correctiveAction: string
61
+ history: {
62
+ user: {
63
+ id: string
64
+ name: string
65
+ }
66
+ state: DataOocState
67
+ comment: string
68
+ timestamp: number
69
+ }[]
70
+ }
71
+
72
+ export type EvaluationResult = { oos: boolean; ooc: boolean }
@@ -0,0 +1,194 @@
1
+ body {
2
+ --grid-container-border-color: 1px solid rgba(0, 0, 0, 0.09);
3
+ --grid-container-border-width: 1px 0;
4
+
5
+ --grist-background-color: var(--main-section-background-color);
6
+ --grist-title-margin: 0 0 0 10px;
7
+ --grist-title-border: none;
8
+ --grist-title-font: bold 16px var(--theme-font);
9
+ --grist-title-color: var(--secondary-color);
10
+ --grist-title-font: bold 16px var(--theme-font);
11
+ --grist-title-icon-color: var(--primary-color);
12
+ --grist-title-icon-margin: 0 3px 2px 0;
13
+ --grist-title-icon-size: var(--fontsize-default);
14
+ --grist-title-with-grid-padding: 0;
15
+
16
+ --grist-object-editor-font: normal 1em var(--theme-font);
17
+ --grist-object-editor-color: var(--secondary-color);
18
+
19
+ --grist-input-zoom: 1;
20
+ --grist-input-progress-border: 1px solid rgba(255, 255, 255, 0.5);
21
+ --grist-input-progress-background: rgba(121, 110, 110, 0.1);
22
+ --grist-input-progress-bar-background: #4ac5fd;
23
+ --grist-input-progress-bar-color: var(--theme-white-color);
24
+
25
+ --grid-header-background-color: transparent;
26
+ --grid-header-top-border: 2px solid rgba(var(--secondary-color-rgb), 0.7);
27
+ --grid-header-bottom-border: var(--grid-container-border-color);
28
+ --grid-header-border-color: rgba(var(--primary-color-rgb), 0.3);
29
+ --grid-header-padding: var(--padding-default) 0 var(--padding-narrow) var(--padding-default);
30
+ --grid-header-sorter-size: 18px;
31
+ --grid-header-splitter-border: var(--grid-container-border-color);
32
+ --grid-header-splitter-border-hover: 1px solid var(--primary-color);
33
+ --grid-header-color: rgba(var(--secondary-color-rgb), 0.8);
34
+ --grid-header-font: bold var(--fontsize-small) var(--theme-font);
35
+ --grid-header-filter-title-color: var(--primary-text-color);
36
+ --grid-header-filter-title-font: normal 12px var(--theme-font);
37
+ --grid-header-filter-title-icon-color: var(--primary-color);
38
+
39
+ --grid-record-background-color: var(--theme-white-color);
40
+ --grid-record-odd-background-color: rgba(255, 255, 255, 0.4);
41
+ --grid-record-padding: var(--padding-default) 0 var(--padding-default) var(--padding-default);
42
+ --grid-record-color: var(--secondary-color);
43
+ --grid-record-color-hover: var(--primary-color);
44
+ --grid-record-wide-fontsize: var(--fontsize-small);
45
+ --grid-record-selected-background-color: #f1f8e9;
46
+ --grid-record-selected-color: var(--grid-record-color);
47
+ --grid-record-focused-background-color: rgba(var(--primary-color-rgb), 0.2);
48
+ --grid-record-focused-border: 1px solid var(--primary-color);
49
+ --grid-record-focused-cell-background-color: rgba(var(--primary-color-rgb), 0.25);
50
+ --grid-record-focused-cell-border: 1px dashed var(--primary-color);
51
+ --grid-record-focused-color: var(--grid-record-color);
52
+ --grid-record-focused-box-shadow: 0px 2px 0px 0px rgb(0 0 0 / 10%);
53
+ --grid-record-emphasized-background-color: var(--primary-color);
54
+ --grid-record-emphasized-color: var(--theme-white-color);
55
+ --grid-record-editing-background-color: var(--theme-white-color);
56
+ --grid-record-editing-border: 1px dashed rgba(var(--primary-color-rgb), 0.4);
57
+ --grid-record-fontsize: var(--fontsize-large);
58
+ --grid-record-border-bottom: var(--grid-container-border-color);
59
+
60
+ --grid-record-dirty-border-top: 24px solid rgba(var(--primary-color-rgb), 0.6);
61
+ --grid-record-dirty-border-left: 24px solid transparent;
62
+ --grid-record-dirty-icon-font: bold 10px/12px var(--mdc-icon-font, 'Material Icons');
63
+ --grid-record-dirty-icon-size: var(--fontsize-large);
64
+ --grid-record-dirty-color: var(--theme-white-color);
65
+
66
+ --grid-footer-background-color: transparent;
67
+ --grid-footer-font-size: var(--fontsize-default);
68
+ --grid-footer-color: var(--secondary-color);
69
+ --grid-footer-limit-color: rgba(var(--secondary-color-rgb), 0.6);
70
+ --grid-footer-inactive-color: var(--grid-footer-limit-color);
71
+ --grid-footer-padding: var(--padding-default) var(--padding-narrow);
72
+
73
+ --data-list-background-color: var(--main-section-background-color);
74
+ --data-list-item-margin: var(--margin-default) 0 var(--margin-default) var(--margin-wide);
75
+ --data-list-item-padding: var(--padding-default) var(--padding-wide);
76
+ --data-list-item-border-bottom: var(--grid-container-border-color);
77
+ --data-list-item-name-font: bold 1em/1em var(--theme-font);
78
+ --data-list-item-name-color: var(--secondary-color);
79
+ --data-list-item-disc-font: normal 0.9em/1em var(--theme-font);
80
+ --data-list-item-disc-color: var(--secondary-text-color);
81
+ --data-list-item-etc-label-font: bold 1em/1em var(--theme-font);
82
+ --data-list-item-etc-font: normal 0.8em/1em var(--theme-font);
83
+ --data-list-item-etc-color: #585858;
84
+ --data-list-item-icon-font: normal 1em/1em;
85
+ --data-list-item-icon-color: var(--secondary-text-color);
86
+ --data-list-selected-background-color: var(--grid-record-selected-background-color);
87
+ --data-list-fab-position-horizontal: 15px;
88
+ --data-list-fab-position-vertical: 15px;
89
+ --data-list-fab-color: var(--primary-color);
90
+ --data-list-fab-shadow: var(--box-shadow);
91
+
92
+ --data-card-background-color: var(--main-section-background-color);
93
+ --data-card-record-card-background-color: var(--theme-white-color);
94
+ --data-card-record-card-border: var(--border-dark-color);
95
+ --data-card-record-card-border-hover: 1px solid var(--primary-color);
96
+ --data-card-record-card-boxshadow-hover: 1px 1px 2px 1px rgba(0, 0, 0, 0.15);
97
+ --data-card-record-card-selected-border: 1px solid var(--primary-color);
98
+ --data-card-record-card-border-radius: var(--border-radius);
99
+ --data-card-item-margin: var(--margin-default) 0 var(--margin-default) var(--margin-wide);
100
+ --data-card-item-padding: var(--padding-default) var(--padding-wide);
101
+ --data-card-item-border-bottom: var(--grid-container-border-color);
102
+ --data-card-item-name-font: bold 1.2em/1em var(--theme-font);
103
+ --data-card-item-name-color: var(--secondary-text-color);
104
+ --data-card-item-name-label-font: normal 0.65em/0.8em var(--theme-font);
105
+ --data-card-item-name-label-color: rgba(var(--secondary-color-rgb), 0.8);
106
+ --data-card-item-disc-font: normal 0.9em/1em var(--theme-font);
107
+ --data-card-item-disc-color: var(--primary-color);
108
+ --data-card-item-etc-label-font: normal 1em/1em var(--theme-font);
109
+ --data-card-item-etc-font: bold 0.8em/1em var(--theme-font);
110
+ --data-card-item-etc-color: var(--secondary-color);
111
+ --data-card-item-icon-font: normal 1em/1em;
112
+ --data-card-item-icon-color: var(--secondary-text-color);
113
+ --data-card-item-btn-border: var(--border-dark-color);
114
+ --data-card-item-btn-border-radius: var(--border-radius);
115
+ --data-card-item-btn-padding: var(--padding-narrow);
116
+ --data-card-selected-background-color: var(--grid-record-selected-background-color);
117
+ --data-card-fab-position-horizontal: 15px;
118
+ --data-card-fab-position-vertical: 15px;
119
+ --data-card-fab-color: var(--primary-color);
120
+ --data-card-fab-shadow: var(--box-shadow);
121
+ --data-card-template: repeat(3, minmax(auto, 100%));
122
+ --data-card-thumbnail-height: 140px;
123
+ --data-card-thumbnail-border-bottom: var(--border-dark-color);
124
+ --data-card-attachimg-height: 70px;
125
+
126
+ --record-view-background-color: var(--main-section-background-color);
127
+ --record-view-gap: var(--margin-narrow) 0;
128
+ --record-view-padding: var(--padding-default);
129
+ --record-view-label-font: bold 15px var(--theme-font);
130
+ --record-view-label-color: var(--secondary-color);
131
+ --record-view-label-icon-size: var(--fontsize-small);
132
+ --record-view-font: normal 15px var(--theme-font);
133
+ --record-view-color: var(--secondary-color);
134
+ --record-view-focus-color: var(--primary-color);
135
+ --record-view-border-bottom: 1px solid rgba(0, 0, 0, 0.1);
136
+ --record-view-edit-border-bottom: 2px solid var(--primary-color);
137
+ --record-view-item-padding: var(--padding-default);
138
+
139
+ --record-view-footer-background: #586272;
140
+ --record-view-footer-button-border: 1px solid rgba(0, 0, 0, 0.3);
141
+ --record-view-footer-button-border-width: 0 0 0 1px;
142
+ --record-view-footer-button-font: 17px;
143
+ --record-view-footer-button-color: var(--theme-white-color);
144
+ --record-view-footer-iconbutton-size: 35px;
145
+ --record-view-footer-focus-background: var(--primary-color);
146
+
147
+ --ox-grist-padding: var(--padding-default) var(--padding-default) 0 var(--padding-default);
148
+ }
149
+
150
+ @media print {
151
+ body {
152
+ --grist-input-zoom: 0.7;
153
+ }
154
+ }
155
+
156
+ @media only screen and (max-width: 460px) {
157
+ body {
158
+ --record-view-label-font: bold 15px/32px var(--theme-font);
159
+ --record-view-font: normal 15px/32px var(--theme-font);
160
+ --data-card-template: repeat(1, minmax(auto, 100%));
161
+ --ox-grist-padding: 0;
162
+ }
163
+ }
164
+ @media (min-width: 461px) and (max-width: 700px) {
165
+ body {
166
+ --data-card-template: repeat(2, minmax(auto, 100%));
167
+ --ox-grist-padding: 0;
168
+ }
169
+ }
170
+ @media (min-width: 461px) and (max-width: 1024px) {
171
+ body {
172
+ --data-card-create-form-padding: 7px;
173
+ }
174
+ }
175
+ @media (min-width: 1025px) and (max-width: 1400px) {
176
+ body {
177
+ --data-card-template: repeat(4, minmax(auto, 100%));
178
+ }
179
+ }
180
+ @media (min-width: 1401px) and (max-width: 1800px) {
181
+ body {
182
+ --data-card-template: repeat(5, minmax(auto, 100%));
183
+ }
184
+ }
185
+ @media (min-width: 1801px) and (max-width: 2200px) {
186
+ body {
187
+ --data-card-template: repeat(6, minmax(auto, 100%));
188
+ }
189
+ }
190
+ @media only screen and (min-width: 2201px) {
191
+ body {
192
+ --data-card-template: repeat(7, minmax(auto, 100%));
193
+ }
194
+ }
@@ -0,0 +1,26 @@
1
+ body {
2
+ /* oops spinner style */
3
+
4
+ --oops-spinner-image: url(/assets/images/spinner.png);
5
+
6
+ /* oops note style */
7
+ --oops-note-icon-font: normal 24px var(--mdc-icon-font, 'Material Icons');
8
+ --oops-note-icon-color: rgba(var(--secondary-color-rgb), 0.3);
9
+ --oops-note-icon-border: 2px solid rgba(var(--secondary-color-rgb), 0.3);
10
+ --oops-note-icon-border-radius: 50px;
11
+ --oops-note-icon-padding: var(--padding-default);
12
+ --oops-note-title-margin: 7px 0 2px 0;
13
+ --oops-note-title-font: bold 14px var(--theme-font);
14
+ --oops-note-title-color: var(--secondary-color);
15
+ --oops-note-description-font: normal 12px var(--theme-font);
16
+ --oops-note-description-color: var(--primary-color);
17
+ }
18
+ @media only screen and (max-width: 460px) {
19
+ body {
20
+ --oops-note-icon-padding: var(--padding-narrow);
21
+ --oops-note-icon-font: normal 18px var(--mdc-icon-font, 'Material Icons');
22
+ --oops-note-title-font: bold 13px var(--theme-font);
23
+ --oops-note-title-margin: var(--margin-narrow) 0 2px 0;
24
+ --oops-note-description-font: normal 0px var(--theme-font);
25
+ }
26
+ }
@@ -0,0 +1,47 @@
1
+ body {
2
+ --report-background-color: var(--main-section-background-color);
3
+ --report-padding: 15px;
4
+ --report-title-margin: 0 0 0 10px;
5
+ --report-title-border: none;
6
+ --report-title-color: var(--secondary-color);
7
+ --report-title-icon-color: var(--primary-color);
8
+ --report-title-icon-margin: 0 3px 2px 0;
9
+ --report-title-icon-size: 14px;
10
+ --report-title-with-grid-padding: 0;
11
+ --report-component-border-radius: var(--border-radius);
12
+
13
+ --report-header-background-color: rgba(var(--primary-color-rgb), 0.05);
14
+ --report-header-border: 1px solid var(--report-header-border-color);
15
+ --report-header-border-color: rgba(var(--primary-color-rgb), 0.3);
16
+ --report-header-padding: 5px 0 5px 5px;
17
+ --report-header-color: var(--secondary-text-color);
18
+ --report-header-font: normal 1em/1.5 var(--theme-font);
19
+ --report-header-fontsize: 13px;
20
+
21
+ --report-record-background-color: #fff;
22
+ --report-record-odd-background-color: #f6f6f6;
23
+ --report-record-field-padding: 7px 10px;
24
+ --report-record-field-border-bottom: 1px solid rgba(0, 0, 0, 0.1);
25
+ --report-record-wide-fontsize: 13px;
26
+ --report-record-focused-background-color: #ffde3b47;
27
+ --report-record-focused-border: 1px dashed rgba(0, 0, 0, 0.5);
28
+
29
+ --report-totalized-background-color: #efefef;
30
+ --report-totalized-border: 1px solid rgba(0, 0, 0, 0.1);
31
+ --report-totalized-color: var(--secondary-text-color);
32
+
33
+ --report-grouped-background-color: #607d8bbf;
34
+ --report-grouped-border: 1px solid rgba(0, 0, 0, 0.2);
35
+ --report-grouped-color: #fff;
36
+ }
37
+
38
+ @media print {
39
+ body {
40
+ --report-header-padding: 5px;
41
+ --report-record-field-padding: 5px;
42
+ --report-record-wide-fontsize: 10px;
43
+ --report-grouped-background-color: #d7d7d7;
44
+ --report-grouped-color: #000;
45
+ --report-totalized-color: #000;
46
+ }
47
+ }
@@ -0,0 +1 @@
1
+ {}
@@ -0,0 +1 @@
1
+ {}
@@ -0,0 +1 @@
1
+ {}
@@ -0,0 +1 @@
1
+ {}