@operato/dataset 1.0.0-alpha.9 → 1.0.0-beta.10
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 +735 -0
- package/demo/index.html +8 -90
- package/demo/ox-data-entry-form.html +118 -0
- package/demo/ox-data-item-spec.html +152 -0
- package/demo/ox-data-ooc-view.html +185 -0
- package/demo/ox-data-sample-view.html +150 -0
- package/demo/ox-grist-editor-data-item-spec.html +476 -0
- package/dist/src/grist-editor/index.d.ts +1 -0
- package/dist/src/grist-editor/index.js +7 -0
- package/dist/src/grist-editor/index.js.map +1 -0
- package/dist/src/grist-editor/ox-grist-editor-data-item-spec.d.ts +11 -0
- package/dist/src/grist-editor/ox-grist-editor-data-item-spec.js +77 -0
- package/dist/src/grist-editor/ox-grist-editor-data-item-spec.js.map +1 -0
- package/dist/src/grist-editor/ox-popup-data-item-spec.d.ts +13 -0
- package/dist/src/grist-editor/ox-popup-data-item-spec.js +91 -0
- package/dist/src/grist-editor/ox-popup-data-item-spec.js.map +1 -0
- package/dist/src/index.d.ts +6 -1
- package/dist/src/index.js +6 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/ox-data-entry-form.d.ts +1 -24
- package/dist/src/ox-data-entry-form.js +52 -26
- package/dist/src/ox-data-entry-form.js.map +1 -1
- package/dist/src/ox-data-item-spec.d.ts +18 -0
- package/dist/src/ox-data-item-spec.js +77 -0
- package/dist/src/ox-data-item-spec.js.map +1 -0
- package/dist/src/ox-data-ooc-view.d.ts +11 -0
- package/dist/src/ox-data-ooc-view.js +75 -0
- package/dist/src/ox-data-ooc-view.js.map +1 -0
- package/dist/src/ox-data-sample-view copy.d.ts +13 -0
- package/dist/src/ox-data-sample-view copy.js +214 -0
- package/dist/src/ox-data-sample-view copy.js.map +1 -0
- package/dist/src/ox-data-sample-view.d.ts +13 -0
- package/dist/src/ox-data-sample-view.js +169 -0
- package/dist/src/ox-data-sample-view.js.map +1 -0
- package/dist/src/ox-data-use-case.d.ts +16 -0
- package/dist/src/ox-data-use-case.js +111 -0
- package/dist/src/ox-data-use-case.js.map +1 -0
- package/dist/src/types.d.ts +78 -0
- package/dist/src/types.js +2 -0
- package/dist/src/types.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +20 -12
- package/src/grist-editor/index.ts +10 -0
- package/src/grist-editor/ox-grist-editor-data-item-spec.ts +92 -0
- package/src/grist-editor/ox-popup-data-item-spec.ts +92 -0
- package/src/index.ts +6 -1
- package/src/ox-data-entry-form.ts +52 -47
- package/src/ox-data-item-spec.ts +74 -0
- package/src/ox-data-ooc-view.ts +75 -0
- package/src/ox-data-sample-view.ts +177 -0
- package/src/ox-data-use-case.ts +147 -0
- package/src/types.ts +72 -0
- package/themes/grist-theme.css +194 -0
- package/themes/oops-theme.css +26 -0
- package/themes/report-theme.css +47 -0
- package/translations/en.json +57 -0
- package/translations/ko.json +56 -0
- package/translations/ms.json +56 -0
- package/translations/zh.json +56 -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,57 @@
|
|
|
1
|
+
{
|
|
2
|
+
"button.corrected": "corrected",
|
|
3
|
+
"button.reviewed": "reviewed",
|
|
4
|
+
"field.appliance": "appliance",
|
|
5
|
+
"field.collected_at": "collected at",
|
|
6
|
+
"field.corrective-action": "corrective action",
|
|
7
|
+
"field.corrector": "corrector",
|
|
8
|
+
"field.corrected-at": "corrected at",
|
|
9
|
+
"field.data": "data",
|
|
10
|
+
"field.data-sample": "data sample",
|
|
11
|
+
"field.data-set": "data set",
|
|
12
|
+
"field.device-id": "device id",
|
|
13
|
+
"field.entry-role": "entry role",
|
|
14
|
+
"field.entry-type": "entry type",
|
|
15
|
+
"field.entry-view": "entry view",
|
|
16
|
+
"field.hidden": "hidden",
|
|
17
|
+
"field.latest-collected-at": "latest collected at",
|
|
18
|
+
"field.monitor-type": "monitor type",
|
|
19
|
+
"field.monitor-view": "monitor view",
|
|
20
|
+
"field.netmask": "network mask",
|
|
21
|
+
"field.next-schedule": "next schedule",
|
|
22
|
+
"field.oos": "out of critical limit",
|
|
23
|
+
"field.ooc": "out of control limit",
|
|
24
|
+
"field.options": "options",
|
|
25
|
+
"field.partition-keys": "partition keys",
|
|
26
|
+
"field.prev-schedule": "previous schedule",
|
|
27
|
+
"field.quota": "sampling #",
|
|
28
|
+
"field.raw-data": "raw data",
|
|
29
|
+
"field.ref-by": "ref. by",
|
|
30
|
+
"field.report-type": "report type",
|
|
31
|
+
"field.report-view": "report view",
|
|
32
|
+
"field.serial-no": "serial #",
|
|
33
|
+
"field.spec": "spec",
|
|
34
|
+
"field.state": "state",
|
|
35
|
+
"field.supervisory-role": "supervisory role",
|
|
36
|
+
"field.tag": "tag name",
|
|
37
|
+
"field.unit": "unit",
|
|
38
|
+
"field.use-case": "use case",
|
|
39
|
+
"field.work-date": "work date",
|
|
40
|
+
"field.work-shift": "work shift",
|
|
41
|
+
"text.automatically collected": "automatically collected",
|
|
42
|
+
"text.data sample created successfully": "a data sample created successfully",
|
|
43
|
+
"text.data ooc updated successfully": "a data ooc updated successfully",
|
|
44
|
+
"text.manually collected": "manually collected",
|
|
45
|
+
"title.data-entry-form": "data entry form",
|
|
46
|
+
"title.data-entry list": "data entry list",
|
|
47
|
+
"title.data-item list": "data item list",
|
|
48
|
+
"title.data-monitor-view": "data monitor view",
|
|
49
|
+
"title.data-report-view": "data report view",
|
|
50
|
+
"title.data-ooc list": "data OOC list",
|
|
51
|
+
"title.data-ooc view": "data OOC view",
|
|
52
|
+
"title.data-sample list": "data sample list",
|
|
53
|
+
"title.data-sample view": "data sample view",
|
|
54
|
+
"title.data-sensor list": "data sensor list",
|
|
55
|
+
"title.data-set list": "data set list",
|
|
56
|
+
"title.edit code": "edit code"
|
|
57
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
{
|
|
2
|
+
"button.corrected": "조치완료",
|
|
3
|
+
"button.reviewed": "검토완료",
|
|
4
|
+
"field.appliance": "어플라이언스",
|
|
5
|
+
"field.collected_at": "수집일시",
|
|
6
|
+
"field.corrective-action": "조치 활동",
|
|
7
|
+
"field.corrector": "조치자",
|
|
8
|
+
"field.corrected-at": "조치 시간",
|
|
9
|
+
"field.data": "데이타",
|
|
10
|
+
"field.data-sample": "데이타 샘플",
|
|
11
|
+
"field.data-set": "데이타셋",
|
|
12
|
+
"field.device-id": "디바이스 아이디",
|
|
13
|
+
"field.entry-role": "입력담당 역할",
|
|
14
|
+
"field.entry-type": "입력용 화면종류",
|
|
15
|
+
"field.entry-view": "입력용 화면",
|
|
16
|
+
"field.hidden": "숨기기",
|
|
17
|
+
"field.latest-collected-at": "최근 수집 시간",
|
|
18
|
+
"field.monitor-type": "모니터용 화면종류",
|
|
19
|
+
"field.monitor-view": "모니터용 화면",
|
|
20
|
+
"field.netmask": "네트워크마스크",
|
|
21
|
+
"field.next-schedule": "다음 수집계획",
|
|
22
|
+
"field.oos": "허용한계 이탈여부",
|
|
23
|
+
"field.ooc": "관리한계 이탈여부",
|
|
24
|
+
"field.options": "선택옵션",
|
|
25
|
+
"field.partition-keys": "파티션 키",
|
|
26
|
+
"field.prev-schedule": "이전 수집계획",
|
|
27
|
+
"field.quota": "샘플수",
|
|
28
|
+
"field.raw-data": "데이타 원본",
|
|
29
|
+
"field.ref-by": "참조아이템",
|
|
30
|
+
"field.report-type": "리포트용 화면종류",
|
|
31
|
+
"field.report-view": "리포트용 화면",
|
|
32
|
+
"field.serial-no": "시리얼번호",
|
|
33
|
+
"field.spec": "명세",
|
|
34
|
+
"field.state": "상태",
|
|
35
|
+
"field.supervisory-role": "관리자 역할",
|
|
36
|
+
"field.tag": "태그이름",
|
|
37
|
+
"field.unit": "단위",
|
|
38
|
+
"field.use-case": "사용 사례",
|
|
39
|
+
"field.work-date": "작업기준일",
|
|
40
|
+
"field.work-shift": "교대근무조",
|
|
41
|
+
"text.automatically collected": "자동 수집",
|
|
42
|
+
"text.data sample created successfully": "데이타 샘플이 성공적으로 생성되었습니다",
|
|
43
|
+
"text.data ooc updated successfully": "이탈데이타 내용이 수정되었습니다",
|
|
44
|
+
"text.manually collected": "수동 수집",
|
|
45
|
+
"title.data-entry-form": "데이타 입력",
|
|
46
|
+
"title.data-item list": "데이타 아이템 조회",
|
|
47
|
+
"title.data-monitor-view": "데이타 모니터",
|
|
48
|
+
"title.data-report-view": "데이타 리포트",
|
|
49
|
+
"title.data-ooc list": "데이타 이탈점 조회",
|
|
50
|
+
"title.data-ooc view": "데이타 이탈점 상세",
|
|
51
|
+
"title.data-sample list": "데이타 샘플 조회",
|
|
52
|
+
"title.data-sample view": "데이타 샘플 상세",
|
|
53
|
+
"title.data-sensor list": "데이타 센서 조회",
|
|
54
|
+
"title.data-set list": "데이타 셋 조회",
|
|
55
|
+
"title.edit code": "코드 편집"
|
|
56
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
{
|
|
2
|
+
"button.corrected": "corrected",
|
|
3
|
+
"button.reviewed": "reviewed",
|
|
4
|
+
"field.appliance": "appliance",
|
|
5
|
+
"field.collected_at": "collected at",
|
|
6
|
+
"field.corrective-action": "corrective action",
|
|
7
|
+
"field.corrector": "corrector",
|
|
8
|
+
"field.corrected-at": "corrected at",
|
|
9
|
+
"field.data": "data",
|
|
10
|
+
"field.data-sample": "data sample",
|
|
11
|
+
"field.data-set": "data set",
|
|
12
|
+
"field.device-id": "device id",
|
|
13
|
+
"field.entry-role": "entry role",
|
|
14
|
+
"field.entry-type": "entry type",
|
|
15
|
+
"field.entry-view": "entry view",
|
|
16
|
+
"field.latest-collected-at": "latest collected at",
|
|
17
|
+
"field.monitor-type": "monitor type",
|
|
18
|
+
"field.monitor-view": "monitor view",
|
|
19
|
+
"field.netmask": "network mask",
|
|
20
|
+
"field.next-schedule": "next schedule",
|
|
21
|
+
"field.oos": "out of critical limit",
|
|
22
|
+
"field.ooc": "out of control limit",
|
|
23
|
+
"field.options": "options",
|
|
24
|
+
"field.hidden": "hidden",
|
|
25
|
+
"field.partition-keys": "partition keys",
|
|
26
|
+
"field.prev-schedule": "previous schedule",
|
|
27
|
+
"field.quota": "sampling #",
|
|
28
|
+
"field.raw-data": "raw data",
|
|
29
|
+
"field.ref-by": "ref. by",
|
|
30
|
+
"field.report-type": "report type",
|
|
31
|
+
"field.report-view": "report view",
|
|
32
|
+
"field.serial-no": "serial #",
|
|
33
|
+
"field.spec": "spec",
|
|
34
|
+
"field.state": "keadaan",
|
|
35
|
+
"field.supervisory-role": "supervisory role",
|
|
36
|
+
"field.tag": "tag name",
|
|
37
|
+
"field.unit": "unit",
|
|
38
|
+
"field.use-case": "use case",
|
|
39
|
+
"field.work-date": "work date",
|
|
40
|
+
"field.work-shift": "work shift",
|
|
41
|
+
"text.automatically collected": "automatically collected",
|
|
42
|
+
"text.data sample created successfully": "a data sample created successfully",
|
|
43
|
+
"text.data ooc updated successfully": "a data ooc updated successfully",
|
|
44
|
+
"text.manually collected": "manually collected",
|
|
45
|
+
"title.data-entry-form": "data entry form",
|
|
46
|
+
"title.data-item list": "data item list",
|
|
47
|
+
"title.data-monitor-view": "data monitor view",
|
|
48
|
+
"title.data-report-view": "data report view",
|
|
49
|
+
"title.data-ooc list": "data OOC list",
|
|
50
|
+
"title.data-ooc view": "data OOC view",
|
|
51
|
+
"title.data-sample list": "data sample list",
|
|
52
|
+
"title.data-sample view": "data sample view",
|
|
53
|
+
"title.data-sensor list": "data sensor list",
|
|
54
|
+
"title.data-set list": "data set list",
|
|
55
|
+
"title.edit code": "edit code"
|
|
56
|
+
}
|