@operato/dataset 2.0.0-alpha.3 → 2.0.0-alpha.30

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 (75) hide show
  1. package/CHANGELOG.md +214 -0
  2. package/demo/favicon.ico +0 -0
  3. package/demo/index.html +338 -0
  4. package/demo/ox-data-ooc-brief-view-test.html +338 -0
  5. package/dist/src/ox-data-entry-form.js +48 -36
  6. package/dist/src/ox-data-entry-form.js.map +1 -1
  7. package/dist/src/ox-data-entry-subgroup-form.js +2 -0
  8. package/dist/src/ox-data-entry-subgroup-form.js.map +1 -1
  9. package/dist/src/ox-data-entry-view.d.ts +2 -2
  10. package/dist/src/ox-data-entry-view.js +12 -2
  11. package/dist/src/ox-data-entry-view.js.map +1 -1
  12. package/dist/src/ox-data-ooc-badge.d.ts +9 -0
  13. package/dist/src/ox-data-ooc-badge.js +66 -0
  14. package/dist/src/ox-data-ooc-badge.js.map +1 -0
  15. package/dist/src/ox-data-ooc-brief-view.d.ts +2 -0
  16. package/dist/src/ox-data-ooc-brief-view.js +8 -110
  17. package/dist/src/ox-data-ooc-brief-view.js.map +1 -1
  18. package/dist/src/ox-data-ooc-correction-part.d.ts +9 -0
  19. package/dist/src/ox-data-ooc-correction-part.js +99 -0
  20. package/dist/src/ox-data-ooc-correction-part.js.map +1 -0
  21. package/dist/src/ox-data-ooc-history.d.ts +10 -0
  22. package/dist/src/ox-data-ooc-history.js +72 -0
  23. package/dist/src/ox-data-ooc-history.js.map +1 -0
  24. package/dist/src/ox-data-ooc-view.d.ts +1 -0
  25. package/dist/src/ox-data-ooc-view.js +6 -89
  26. package/dist/src/ox-data-ooc-view.js.map +1 -1
  27. package/dist/src/ox-data-sample-subgroup-view.js +1 -1
  28. package/dist/src/ox-data-sample-subgroup-view.js.map +1 -1
  29. package/dist/src/ox-data-sample-view.js +47 -30
  30. package/dist/src/ox-data-sample-view.js.map +1 -1
  31. package/dist/src/ox-data-summary-view.js +7 -1
  32. package/dist/src/ox-data-summary-view.js.map +1 -1
  33. package/dist/src/types.d.ts +57 -9
  34. package/dist/src/types.js.map +1 -1
  35. package/dist/src/usecase/spc/index.d.ts +1 -0
  36. package/dist/src/usecase/spc/index.js +8 -0
  37. package/dist/src/usecase/spc/index.js.map +1 -0
  38. package/dist/src/usecase/spc/ox-data-use-case-spc.d.ts +7 -0
  39. package/dist/src/usecase/spc/ox-data-use-case-spc.js +102 -0
  40. package/dist/src/usecase/spc/ox-data-use-case-spc.js.map +1 -0
  41. package/dist/src/usecase/spc/ox-input-spc-limits.d.ts +44 -0
  42. package/dist/src/usecase/spc/ox-input-spc-limits.js +193 -0
  43. package/dist/src/usecase/spc/ox-input-spc-limits.js.map +1 -0
  44. package/dist/src/usecase/spc/ox-property-editor-spc-limits.d.ts +6 -0
  45. package/dist/src/usecase/spc/ox-property-editor-spc-limits.js +24 -0
  46. package/dist/src/usecase/spc/ox-property-editor-spc-limits.js.map +1 -0
  47. package/dist/stories/ox-data-entry-form.stories.js +43 -0
  48. package/dist/stories/ox-data-entry-form.stories.js.map +1 -1
  49. package/dist/stories/ox-data-ooc-view.stories.js +2 -0
  50. package/dist/stories/ox-data-ooc-view.stories.js.map +1 -1
  51. package/dist/tsconfig.tsbuildinfo +1 -1
  52. package/package.json +37 -22
  53. package/src/ox-data-entry-form.ts +65 -46
  54. package/src/ox-data-entry-subgroup-form.ts +2 -0
  55. package/src/ox-data-entry-view.ts +13 -2
  56. package/src/ox-data-ooc-badge.ts +64 -0
  57. package/src/ox-data-ooc-brief-view.ts +9 -120
  58. package/src/ox-data-ooc-correction-part.ts +107 -0
  59. package/src/ox-data-ooc-history.ts +74 -0
  60. package/src/ox-data-ooc-view.ts +6 -91
  61. package/src/ox-data-sample-subgroup-view.ts +1 -1
  62. package/src/ox-data-sample-view.ts +47 -30
  63. package/src/ox-data-summary-view.ts +7 -1
  64. package/src/types.ts +76 -27
  65. package/src/usecase/spc/index.ts +10 -0
  66. package/src/usecase/spc/ox-data-use-case-spc.ts +147 -0
  67. package/src/usecase/spc/ox-input-spc-limits.ts +182 -0
  68. package/src/usecase/spc/ox-property-editor-spc-limits.ts +23 -0
  69. package/stories/ox-data-entry-form.stories.ts +44 -0
  70. package/stories/ox-data-ooc-view.stories.ts +2 -0
  71. package/themes/grist-theme.css +1 -1
  72. package/translations/en.json +1 -0
  73. package/translations/ko.json +1 -0
  74. package/translations/ms.json +142 -70
  75. package/translations/zh.json +146 -75
@@ -0,0 +1,147 @@
1
+ import i18next from 'i18next' // Since this is a common module, @operato/i18n was deliberately avoided.
2
+
3
+ import { DataItem, EvaluationResult, UseCaseDefinition } from '../../types'
4
+ import { OxDataUseCase } from '../ox-data-use-case.js'
5
+
6
+ export class OxDataUseCaseSPC extends OxDataUseCase {
7
+ getSpecification(dataItem: DataItem): UseCaseDefinition {
8
+ return {
9
+ name: 'SPC',
10
+ description: 'Critical Control Point Data Spec',
11
+ help: '',
12
+ specs: [
13
+ {
14
+ type: 'spc-limits' /* A value which seperates acceptability from unacceptability */,
15
+ label: 'critical-limits',
16
+ name: 'criticalLimits',
17
+ property: dataItem
18
+ },
19
+ {
20
+ type: 'spc-limits',
21
+ label: 'target-limits',
22
+ name: 'targetLimits',
23
+ property: dataItem
24
+ }
25
+ ]
26
+ }
27
+ }
28
+
29
+ evaluate(spec: any, values: any | any[]): EvaluationResult | undefined {
30
+ if (!spec || typeof values === 'undefined') {
31
+ return
32
+ }
33
+
34
+ if (!(values instanceof Array)) {
35
+ values = [values]
36
+ }
37
+
38
+ const {
39
+ minimum: criticalMinimum,
40
+ maximum: criticalMaximum,
41
+ acceptables: criticalAcceptables
42
+ } = spec['criticalLimits'] || {}
43
+
44
+ const {
45
+ minimum: targetMinimum,
46
+ maximum: targetMaximum,
47
+ acceptables: targetAcceptables
48
+ } = spec['targetLimits'] || {}
49
+
50
+ var oos = false
51
+ var ooc = false
52
+
53
+ for (let i = 0; i < values.length; i++) {
54
+ const value = values[i]
55
+
56
+ if (criticalMinimum != null && value < criticalMinimum) {
57
+ oos = true
58
+ break
59
+ }
60
+
61
+ if (criticalMaximum != null && value > criticalMaximum) {
62
+ oos = true
63
+ break
64
+ }
65
+
66
+ if (criticalAcceptables != null && !criticalAcceptables.includes(value)) {
67
+ oos = true
68
+ break
69
+ }
70
+ }
71
+
72
+ for (let i = 0; i < values.length; i++) {
73
+ const value = values[i]
74
+
75
+ if (targetMinimum != null && value < targetMinimum) {
76
+ ooc = true
77
+ break
78
+ }
79
+
80
+ if (targetMaximum != null && value > targetMaximum) {
81
+ ooc = true
82
+ break
83
+ }
84
+
85
+ if (targetAcceptables != null && !targetAcceptables.includes(value)) {
86
+ ooc = true
87
+ break
88
+ }
89
+ }
90
+
91
+ return { oos, ooc }
92
+ }
93
+
94
+ elaborateUseCaseSpec(limits: any): string | undefined {
95
+ if (!limits) {
96
+ return
97
+ }
98
+
99
+ var text = ''
100
+
101
+ const {
102
+ minimum: criticalMinimum,
103
+ maximum: criticalMaximum,
104
+ acceptables: criticalAcceptables
105
+ } = limits['criticalLimits'] || {}
106
+
107
+ if (criticalMinimum != null || criticalMaximum != null || criticalAcceptables != null) {
108
+ text += `${i18next.t('label.critical-limits')}\n`
109
+ }
110
+
111
+ if (criticalMinimum != null) {
112
+ text += `\t${i18next.t('label.minimum value')} : ${criticalMinimum}\n`
113
+ }
114
+ if (criticalMaximum != null) {
115
+ text += `\t${i18next.t('label.maximum value')} : ${criticalMaximum}\n`
116
+ }
117
+ if (criticalAcceptables != null) {
118
+ text += `\t${i18next.t('label.acceptables')} : ${
119
+ criticalAcceptables instanceof Array ? criticalAcceptables.join(', ') : criticalAcceptables
120
+ }\n`
121
+ }
122
+
123
+ const {
124
+ minimum: targetMinimum,
125
+ maximum: targetMaximum,
126
+ acceptables: targetAcceptables
127
+ } = limits['targetLimits'] || {}
128
+
129
+ if (targetMinimum != null || targetMaximum != null || targetAcceptables != null) {
130
+ text += `${i18next.t('label.target-limits')}\n`
131
+ }
132
+
133
+ if (targetMinimum != null) {
134
+ text += `\t${i18next.t('label.minimum value')} : ${targetMinimum}\n`
135
+ }
136
+ if (targetMaximum != null) {
137
+ text += `\t${i18next.t('label.maximum value')} : ${targetMaximum}\n`
138
+ }
139
+ if (targetAcceptables != null) {
140
+ text += `\t${i18next.t('label.acceptables')} : ${
141
+ targetAcceptables instanceof Array ? targetAcceptables.join(', ') : targetAcceptables
142
+ }\n`
143
+ }
144
+
145
+ return text
146
+ }
147
+ }
@@ -0,0 +1,182 @@
1
+ /**
2
+ * @license Copyright © HatioLab Inc. All rights reserved.
3
+ */
4
+
5
+ import { css, html, LitElement } from 'lit'
6
+ import { customElement, property, query, queryAll } from 'lit/decorators.js'
7
+
8
+ import { i18next } from '@operato/i18n'
9
+
10
+ export enum DataItemType {
11
+ number = 'number',
12
+ text = 'text',
13
+ boolean = 'boolean',
14
+ select = 'select',
15
+ file = 'file'
16
+ }
17
+
18
+ export type SpcLimitValue = {
19
+ minimum?: number
20
+ maximum?: number
21
+ acceptables?: string[] | boolean[]
22
+ }
23
+
24
+ /**
25
+ element for SPC limits
26
+
27
+ Example:
28
+
29
+ <ox-input-spc-limits
30
+ .value=${value}
31
+ .type=${type}>
32
+ </ox-input-spc-limits>
33
+ */
34
+ @customElement('ox-input-spc-limits')
35
+ export class OxInputSpcLimits extends LitElement {
36
+ static styles = css`
37
+ :host {
38
+ display: flex;
39
+ flex-direction: column;
40
+ align-content: center;
41
+ }
42
+
43
+ label {
44
+ margin: 0 var(--margin-default) var(--margin-default) 0;
45
+ }
46
+
47
+ label div > * {
48
+ vertical-align: middle;
49
+ }
50
+
51
+ button {
52
+ width: 20px;
53
+ text-align: center;
54
+ }
55
+
56
+ div[name],
57
+ input[type='checkbox'] + span {
58
+ display: inline-block;
59
+ font: var(--label-font);
60
+ color: var(--label-color);
61
+ text-align: right;
62
+ }
63
+ input,
64
+ select {
65
+ border: var(--input-field-border);
66
+ border-radius: var(--input-field-border-radius);
67
+ padding: var(--input-field-padding);
68
+ font: var(--input-field-font);
69
+ }
70
+
71
+ input[type='checkbox'] {
72
+ width: initial;
73
+ }
74
+ input[checked] + span {
75
+ font-weight: bold;
76
+ }
77
+ [unit],
78
+ [value] {
79
+ display: inline-block;
80
+ opacity: 0.7;
81
+ font: var(--form-sublabel-font);
82
+ }
83
+ [properties] {
84
+ font: var(--input-field-font);
85
+ color: var(--label-color);
86
+ }
87
+ `
88
+
89
+ @property({ type: Object }) value: SpcLimitValue = {}
90
+ @property({ type: String }) type: DataItemType = DataItemType.number
91
+ @property({ type: String }) unit?: string
92
+ @property({ type: Object }) options: { options?: { text: string; value: string }[] } = {}
93
+
94
+ @query('[name=minimum]') minimum!: HTMLInputElement
95
+ @query('[name=maximum]') maximum!: HTMLInputElement
96
+ @queryAll('[type=checkbox]:checked') checkedAll!: NodeListOf<HTMLInputElement>
97
+
98
+ firstUpdated() {
99
+ this.renderRoot.addEventListener('change', this.onChange.bind(this))
100
+ }
101
+
102
+ render() {
103
+ const { minimum, maximum, acceptables = [] } = this.value || {}
104
+
105
+ return html`
106
+ <div>
107
+ ${this.type === DataItemType.number
108
+ ? html`
109
+ <label>
110
+ <div name>${i18next.t('text.minimum value')}</div>
111
+ <input type="number" name="minimum" .value=${String(minimum)} />
112
+ <div unit>${this.unit}</div>
113
+ </select>
114
+ </label>
115
+ <label>
116
+ <div name>${i18next.t('text.maximum value')}</div>
117
+ <input type="number" name="maximum" .value=${String(maximum)} />
118
+ <div unit>${this.unit}</div>
119
+ </label>
120
+ `
121
+ : this.type === DataItemType.select
122
+ ? html`
123
+ <!-- <div>Acceptables</div> -->
124
+ ${this.options?.options?.map(
125
+ option => html`
126
+ <div>
127
+ <input
128
+ type="checkbox"
129
+ data-value=${option.value}
130
+ ?checked=${(acceptables as string[]).includes(option.value)}
131
+ />
132
+ <span>${option.text}</span>
133
+ <span value>(${option.value})</span>
134
+ </div>
135
+ `
136
+ )}
137
+ `
138
+ : this.type === DataItemType.boolean
139
+ ? html`
140
+ <div>
141
+ <input type="checkbox" data-value=${true} ?checked=${(acceptables as boolean[]).includes(true)} />
142
+ <span value>true</span>
143
+ </div>
144
+ <div>
145
+ <input type="checkbox" data-value=${false} ?checked=${(acceptables as boolean[]).includes(false)} />
146
+ <span value>false</span>
147
+ </div>
148
+ `
149
+ : html` <div properties>${i18next.t('text.no properties to set')}</div> `}
150
+ </div>
151
+ `
152
+ }
153
+
154
+ private onChange(e: Event) {
155
+ if (this.type === DataItemType.number) {
156
+ this.value = {
157
+ minimum: this.minimum.valueAsNumber,
158
+ maximum: this.maximum.valueAsNumber
159
+ }
160
+ } else if (this.type === DataItemType.select) {
161
+ this.value = {
162
+ acceptables: Array.from(this.checkedAll).map(checked => {
163
+ const x = checked.getAttribute('data-value')!
164
+ console.log(x)
165
+ return x
166
+ })
167
+ }
168
+ } else if (this.type === DataItemType.boolean) {
169
+ this.value = {
170
+ acceptables: Array.from(this.checkedAll).map(checked => {
171
+ const x = checked.getAttribute('data-value')! === 'true'
172
+ console.log(x)
173
+ return x
174
+ })
175
+ }
176
+ } else {
177
+ this.value = {}
178
+ }
179
+
180
+ this.dispatchEvent(new CustomEvent('change', { bubbles: true, composed: true, detail: this.value }))
181
+ }
182
+ }
@@ -0,0 +1,23 @@
1
+ import './ox-input-spc-limits.js'
2
+
3
+ import { html, TemplateResult } from 'lit'
4
+ import { customElement } from 'lit/decorators.js'
5
+
6
+ import { OxPropertyEditor, PropertySpec } from '@operato/property-editor'
7
+
8
+ @customElement('ox-property-editor-spc-limits')
9
+ export class OxPropertyEditorSpcLimits extends OxPropertyEditor {
10
+ editorTemplate(value: any, spec: PropertySpec): TemplateResult {
11
+ const { type, options, unit } = spec.property || {}
12
+
13
+ return html`
14
+ <ox-input-spc-limits
15
+ id="editor"
16
+ .value=${value}
17
+ .type=${type}
18
+ .unit=${unit}
19
+ .options=${options}
20
+ ></ox-input-spc-limits>
21
+ `
22
+ }
23
+ }
@@ -127,6 +127,50 @@ const dataSet = {
127
127
  quota: 1,
128
128
  active: true
129
129
  },
130
+ {
131
+ name: '라디오',
132
+ description: '라디오 그룹',
133
+
134
+ group: '측정데이타',
135
+ sequence: 5,
136
+ tag: 'check1',
137
+ type: 'radio',
138
+ options: {
139
+ options: [
140
+ {
141
+ text: '예',
142
+ value: 'Y'
143
+ },
144
+ {
145
+ text: '아니오',
146
+ value: 'N'
147
+ }
148
+ ]
149
+ },
150
+ quota: 3,
151
+ active: true
152
+ },
153
+ {
154
+ name: '라디오2',
155
+ description: '라디오 그룹2',
156
+ sequence: 5,
157
+ tag: 'check2',
158
+ type: 'radio',
159
+ options: {
160
+ options: [
161
+ {
162
+ text: '예',
163
+ value: 'Y'
164
+ },
165
+ {
166
+ text: '아니오',
167
+ value: 'N'
168
+ }
169
+ ]
170
+ },
171
+ quota: 1,
172
+ active: true
173
+ },
130
174
  {
131
175
  name: '첨부파일',
132
176
  description: '참조 첨부 파일.',
@@ -144,6 +144,7 @@ var dataOoc = {
144
144
  name: 'Data Sample Name',
145
145
  description: 'Data Sample이 어쩌구 저쩌구 그래서 중요합니다. 당연히 그래야죠.',
146
146
  useCase: 'CCP',
147
+ state: 'REVIEWED',
147
148
  judgment: {
148
149
  temp: {
149
150
  ooc: true,
@@ -247,6 +248,7 @@ var dataOoc = {
247
248
  name: 'shnam'
248
249
  },
249
250
  state: 'CORRECTED',
251
+ comment: '전량 폐기하였습니다',
250
252
  timestamp: Date.now()
251
253
  }
252
254
  ]
@@ -37,7 +37,7 @@ body {
37
37
 
38
38
  --grid-record-background-color: var(--theme-white-color);
39
39
  --grid-record-odd-background-color: #f9f7f5;
40
- --grid-record-padding: var(--padding-default) 0 var(--padding-default) var(--padding-default);
40
+ --grid-record-padding: 0 5px 0 5px;
41
41
  --grid-record-color: var(--secondary-color);
42
42
  --grid-record-color-hover: var(--primary-color);
43
43
  --grid-record-wide-fontsize: var(--fontsize-small);
@@ -17,6 +17,7 @@
17
17
  "field.entry-role": "entry role",
18
18
  "field.entry-type": "entry type",
19
19
  "field.entry-view": "entry view",
20
+ "field.finalizing-function": "finalizing func.",
20
21
  "field.hidden": "hidden",
21
22
  "field.item": "item",
22
23
  "field.latest-collected-at": "latest collected at",
@@ -17,6 +17,7 @@
17
17
  "field.entry-role": "입력담당 역할",
18
18
  "field.entry-type": "입력용 화면종류",
19
19
  "field.entry-view": "입력용 화면",
20
+ "field.finalizing-function": "마감 함수",
20
21
  "field.hidden": "숨기기",
21
22
  "field.item": "항목",
22
23
  "field.latest-collected-at": "최근 수집 시간",
@@ -1,77 +1,149 @@
1
1
  {
2
- "button.corrected": "corrected",
3
- "button.reviewed": "reviewed",
4
- "field.appliance": "appliance",
5
- "field.collected_at": "collected at",
6
- "field.collected-at": "collected at",
7
- "field.corrected-at": "corrected at",
8
- "field.corrective action": "corrective action",
9
- "field.corrective-action": "corrective action",
10
- "field.corrector": "corrector",
11
- "field.critical control point": "critical control point",
12
- "field.data-sample": "data sample",
13
- "field.data-set": "data set",
2
+ "button.corrected": "diperbetulkan",
3
+ "button.request-archive": "permintaan arkib",
4
+ "button.reviewed": "disemak",
5
+ "error.dataset not found": "Tidak dapat mencari dataSet dengan nama yang diberi({dataSetName})",
6
+ "error.summary not supported": "DataSet yang diberi({dataSetName}) tidak menyokong laporan untuk {period}",
7
+ "field.agg-function": "fungsi agregasi",
8
+ "field.appliance": "peralatan",
9
+ "field.assignees": "penugasan",
10
+ "field.collected-at": "dikumpulkan pada",
11
+ "field.corrected-at": "diperbetulkan pada",
12
+ "field.corrective-action": "tindakan pembetulan",
13
+ "field.corrector": "pembetul",
14
+ "field.count": "jumlah",
15
+ "field.count-ooc": "jumlah ooc",
16
+ "field.count-oos": "jumlah oos",
14
17
  "field.data": "data",
15
- "field.device-id": "device id",
16
- "field.entry-role": "entry role",
17
- "field.entry-type": "entry type",
18
- "field.entry-view": "entry view",
19
- "field.hidden": "hidden",
18
+ "field.data-01": "data 1",
19
+ "field.data-02": "data 2",
20
+ "field.data-03": "data 3",
21
+ "field.data-04": "data 4",
22
+ "field.data-05": "data 5",
23
+ "field.data-key": "kunci data",
24
+ "field.data-key-set": "set kunci data",
25
+ "field.data-sample": "sampel data",
26
+ "field.data-set": "set data",
27
+ "field.date": "tarikh",
28
+ "field.device-id": "id peranti",
29
+ "field.download-url": "url muat turun",
30
+ "field.entry-role": "peranan masukan",
31
+ "field.entry-type": "jenis masukan",
32
+ "field.entry-view": "paparan masukan",
33
+ "field.finalizing-function": "fungsi penyempurnaan",
34
+ "field.hidden": "tersembunyi",
20
35
  "field.item": "item",
21
- "field.latest-collected-at": "latest collected at",
22
- "field.monitor-type": "monitor type",
23
- "field.monitor-view": "monitor view",
24
- "field.netmask": "network mask",
25
- "field.next-schedule": "next schedule",
26
- "field.ooc": "out of control limit",
27
- "field.oos": "out of critical limit",
28
- "field.options": "options",
29
- "field.partition-keys": "partition keys",
30
- "field.prev-schedule": "previous schedule",
31
- "field.quota": "sampling #",
32
- "field.raw-data": "raw data",
33
- "field.ref-by": "ref. by",
34
- "field.report-type": "report type",
35
- "field.report-view": "report view",
36
- "field.serial-no": "serial #",
37
- "field.spec": "spec",
38
- "field.state": "keadaan",
39
- "field.supervisory-role": "supervisory role",
40
- "field.tag": "tag name",
36
+ "field.key": "kunci",
37
+ "field.key-01": "kunci 1",
38
+ "field.key-02": "kunci 2",
39
+ "field.key-03": "kunci 3",
40
+ "field.key-04": "kunci 4",
41
+ "field.key-05": "kunci 5",
42
+ "field.latest-collected-at": "terakhir dikumpulkan pada",
43
+ "field.monitor-type": "jenis pemantau",
44
+ "field.monitor-view": "paparan pemantau",
45
+ "field.month": "bulan",
46
+ "field.netmask": "topeng rangkaian",
47
+ "field.next-schedule": "jadual seterusnya",
48
+ "field.next-summary-schedule": "jadual ringkasan seterusnya",
49
+ "field.normal-scenario": "skenario data normal",
50
+ "field.ooc": "di luar had kawalan",
51
+ "field.oos": "di luar had kritikal",
52
+ "field.options": "pilihan",
53
+ "field.outlier-approval-line": "baris kelulusan luar biasa",
54
+ "field.outlier-scenario": "skenario data luar biasa",
55
+ "field.partition-keys": "kunci pembahagian",
56
+ "field.prev-schedule": "jadual sebelumnya",
57
+ "field.quota": "kuota sampel",
58
+ "field.raw-data": "data mentah",
59
+ "field.ref-by": "dirujuk oleh",
60
+ "field.report-template": "templat laporan",
61
+ "field.report-type": "jenis laporan",
62
+ "field.report-view": "paparan laporan",
63
+ "field.request-params": "parameter permintaan",
64
+ "field.requires-review": "memerlukan semakan",
65
+ "field.review-approval-line": "baris kelulusan",
66
+ "field.role": "peranan",
67
+ "field.serial-no": "no. siri",
68
+ "field.spec": "spesifikasi",
69
+ "field.status": "status",
70
+ "field.subgroup": "Nama subkumpulan",
71
+ "field.summary": "ringkasan",
72
+ "field.summary-period": "tempoh ringkasan",
73
+ "field.supervisory-role": "peranan pengawasan",
74
+ "field.t-key": "kunci terjemahan",
75
+ "field.tag": "nama tag",
76
+ "field.time-period": "tempoh masa",
41
77
  "field.unit": "unit",
42
- "field.use-case": "use case",
43
- "field.work-date": "work date",
44
- "field.work-shift": "work shift",
45
- "label.acceptables": "acceptables",
46
- "label.critical-limits": "critical limits",
47
- "label.maximum value": "maximum value",
48
- "label.minimum value": "minimum value",
49
- "label.pass-limits": "pass limits",
50
- "label.target-limits": "target limits",
51
- "text.automatically collected": "automatically collected",
52
- "text.control limit": "control limit",
53
- "text.data ooc updated successfully": "a data ooc updated successfully",
54
- "text.data sample created successfully": "a data sample created successfully",
55
- "text.manually collected": "manually collected",
56
- "text.maximum value": "maximum value",
57
- "text.measurement": "measurement",
58
- "text.minimum value": "minimum value",
59
- "text.observation": "observation",
60
- "text.operating limit": "operating limit",
61
- "text.target limit": "target limit",
62
- "title.data-entry-form": "data entry form",
63
- "title.data-item list": "data item list",
64
- "title.data-monitor-view": "data monitor view",
65
- "title.data-ooc list": "data OOC list",
66
- "title.data-ooc view": "data OOC view",
67
- "title.data-report-view": "data report view",
68
- "title.data-sample list": "data sample list",
69
- "title.data-sample view": "data sample view",
70
- "title.data-sensor list": "data sensor list",
71
- "title.data-set list": "data set list",
72
- "title.edit code": "edit code",
73
- "title.edit duration": "edit duration",
78
+ "field.use-case": "kes penggunaan",
79
+ "field.view": "skrin",
80
+ "field.work-date": "tarikh kerja",
81
+ "field.work-shift": "shift kerja",
82
+ "label.acceptables": "boleh diterima",
83
+ "label.corrective action": "tindakan pembetulan",
84
+ "label.corrective instruction": "instruksi pembetulan",
85
+ "label.critical-limits": "had kritikal",
86
+ "label.data-set-type": "jenis",
87
+ "label.end-date": "tarikh tamat",
88
+ "label.group-by data-keys": "kumpulkan mengikut setiap data-keys",
89
+ "label.maximum value": "nilai maksimum",
90
+ "label.minimum value": "nilai minimum",
91
+ "label.pass-limits": "had lulus",
92
+ "label.period-12-months": "12 bulan",
93
+ "label.period-30-days": "30 hari",
94
+ "label.period-this-month": "bulan ini",
95
+ "label.period-this-year": "tahun ini",
96
+ "label.period-today": "hari ini",
97
+ "label.start-date": "tarikh mula",
98
+ "label.state-corrected": "diperbetulkan",
99
+ "label.state-issued": "dikeluarkan",
100
+ "label.state-reviewed": "disemak",
101
+ "label.target-limits": "had sasaran",
102
+ "text.automatically collected": "dikumpulkan secara automatik",
103
+ "text.corrective action placeholder": "Sila masukkan butiran pelaksanaan tindakan pembetulan dan pencegahan",
104
+ "text.corrective instruction placeholder": "Sila masukkan arahan tindakan pembetulan dan pencegahan",
105
+ "text.data ooc updated successfully": "data ooc dikemas kini dengan jayanya",
106
+ "text.data sample created successfully": "sampel data dicipta dengan jayanya",
107
+ "text.data-archive request failed": "permintaan arkib data gagal",
108
+ "text.data-archive waits": "Ia akan mengambil masa beberapa minit, Anda boleh mencari mesej push bila siap",
109
+ "text.manually collected": "dikumpulkan secara manual",
110
+ "text.presigned_url_created": "url arkib yang ditandatangani sebelumnya dicipta",
111
+ "title.data collecting editor": "editor pengumpulan data",
112
+ "title.data collecting schedule (un)register": "(tidak) mendaftar jadual pengumpulan data",
113
+ "title.data-archive downloads ready": "muat turun arkib data sedia",
114
+ "title.data-archive list": "senarai arkib data",
115
+ "title.data-archive request failed": "gagal permintaan arkib data",
116
+ "title.data-archive request popup": "permintaan arkib data",
117
+ "title.data-entry list": "senarai masukan data",
118
+ "title.data-entry-form": "borang masukan data",
119
+ "title.data-item list": "senarai item data",
120
+ "title.data-key-item list": "senarai item kunci data",
121
+ "title.data-key-set list": "senarai set kunci data",
122
+ "title.data-monitor-view": "paparan pemantau data",
123
+ "title.data-ooc list": "senarai data OOC",
124
+ "title.data-ooc view": "paparan data OOC",
125
+ "title.data-report list": "senarai laporan data",
126
+ "title.data-report samples": "contoh laporan data",
127
+ "title.data-report-view": "paparan laporan data",
128
+ "title.data-sample list": "senarai sampel data",
129
+ "title.data-sample search": "pencarian sampel data",
130
+ "title.data-sample view": "paparan sampel data",
131
+ "title.data-sensor list": "senarai sensor data",
132
+ "title.data-set list": "senarai set data",
133
+ "title.data-set model": "model set data",
134
+ "title.data-summary list": "senarai ringkasan data",
135
+ "title.data-summary period": "tempoh ringkasan data",
136
+ "title.data-summary search": "pencarian ringkasan data",
137
+ "title.data-summary view": "paparan ringkasan data",
138
+ "title.edit code": "edit kod",
139
+ "title.edit data-key items": "edit item kunci data",
140
+ "title.edit duration": "edit tempoh",
74
141
  "title.edit hashtag": "edit hashtag",
75
142
  "title.edit json": "edit json",
76
- "title.history": "history"
143
+ "title.open data sample report page": "buka laman laporan sampel data",
144
+ "title.open data sample search page": "buka laman pencarian sampel data",
145
+ "title.open data sample view": "buka paparan sampel data",
146
+ "title.open data summary view": "buka paparan ringkasan data",
147
+ "title.ready": "sedia",
148
+ "title.view detail ooc data": "lihat butiran data ooc"
77
149
  }