@openmrs/esm-implementer-tools-app 6.3.1-pre.3234 → 6.3.1-pre.3244

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 (94) hide show
  1. package/.turbo/turbo-build.log +7 -7
  2. package/dist/1119.js +1 -1
  3. package/dist/1197.js +1 -1
  4. package/dist/2146.js +1 -1
  5. package/dist/2690.js +1 -1
  6. package/dist/3099.js +1 -1
  7. package/dist/3584.js +1 -1
  8. package/dist/4055.js +1 -1
  9. package/dist/4132.js +1 -1
  10. package/dist/4300.js +1 -1
  11. package/dist/4335.js +1 -1
  12. package/dist/4618.js +1 -1
  13. package/dist/4652.js +1 -1
  14. package/dist/4944.js +1 -1
  15. package/dist/5173.js +1 -1
  16. package/dist/5241.js +1 -1
  17. package/dist/5442.js +1 -1
  18. package/dist/5563.js +1 -1
  19. package/dist/5661.js +1 -1
  20. package/dist/6022.js +1 -1
  21. package/dist/6132.js +1 -0
  22. package/dist/6132.js.map +1 -0
  23. package/dist/6468.js +1 -1
  24. package/dist/6679.js +1 -1
  25. package/dist/6840.js +1 -1
  26. package/dist/6859.js +1 -1
  27. package/dist/7097.js +1 -1
  28. package/dist/7159.js +1 -1
  29. package/dist/723.js +1 -1
  30. package/dist/7617.js +1 -1
  31. package/dist/795.js +1 -1
  32. package/dist/8163.js +1 -1
  33. package/dist/8349.js +1 -1
  34. package/dist/8618.js +1 -1
  35. package/dist/890.js +1 -1
  36. package/dist/9214.js +1 -1
  37. package/dist/9538.js +1 -1
  38. package/dist/9569.js +1 -1
  39. package/dist/986.js +1 -1
  40. package/dist/9879.js +1 -1
  41. package/dist/9895.js +1 -1
  42. package/dist/9900.js +1 -1
  43. package/dist/9913.js +1 -1
  44. package/dist/main.js +1 -1
  45. package/dist/openmrs-esm-implementer-tools-app.js +1 -1
  46. package/dist/openmrs-esm-implementer-tools-app.js.buildmanifest.json +144 -144
  47. package/dist/routes.json +1 -1
  48. package/package.json +4 -4
  49. package/src/configuration/interactive-editor/editable-value.component.tsx +1 -1
  50. package/src/configuration/interactive-editor/validators.resource.ts +147 -0
  51. package/src/configuration/interactive-editor/{value-editor.scss → value-editor.styles.scss} +7 -0
  52. package/src/configuration/interactive-editor/value-editor.tsx +46 -18
  53. package/src/configuration/interactive-editor/value-editors/value-editor-field.tsx +21 -3
  54. package/translations/am.json +7 -0
  55. package/translations/ar.json +7 -0
  56. package/translations/ar_SY.json +7 -0
  57. package/translations/bn.json +7 -0
  58. package/translations/de.json +7 -0
  59. package/translations/en.json +7 -0
  60. package/translations/en_US.json +7 -0
  61. package/translations/es.json +7 -0
  62. package/translations/es_MX.json +7 -0
  63. package/translations/fr.json +7 -0
  64. package/translations/he.json +7 -0
  65. package/translations/hi.json +7 -0
  66. package/translations/hi_IN.json +7 -0
  67. package/translations/id.json +7 -0
  68. package/translations/it.json +7 -0
  69. package/translations/ka.json +7 -0
  70. package/translations/km.json +7 -0
  71. package/translations/ku.json +7 -0
  72. package/translations/ky.json +7 -0
  73. package/translations/lg.json +7 -0
  74. package/translations/ne.json +7 -0
  75. package/translations/pl.json +7 -0
  76. package/translations/pt.json +7 -0
  77. package/translations/pt_BR.json +7 -0
  78. package/translations/qu.json +7 -0
  79. package/translations/ro_RO.json +7 -0
  80. package/translations/ru_RU.json +7 -0
  81. package/translations/si.json +7 -0
  82. package/translations/sw.json +7 -0
  83. package/translations/sw_KE.json +7 -0
  84. package/translations/tr.json +7 -0
  85. package/translations/tr_TR.json +7 -0
  86. package/translations/uk.json +7 -0
  87. package/translations/uz.json +7 -0
  88. package/translations/uz@Latn.json +7 -0
  89. package/translations/uz_UZ.json +7 -0
  90. package/translations/vi.json +7 -0
  91. package/translations/zh.json +7 -0
  92. package/translations/zh_CN.json +7 -0
  93. package/dist/3150.js +0 -1
  94. package/dist/3150.js.map +0 -1
package/dist/routes.json CHANGED
@@ -1 +1 @@
1
- {"$schema":"https://json.openmrs.org/routes.schema.json","pages":[{"component":"implementerTools","route":true},{"component":"globalImplementerTools","route":true}],"extensions":[{"name":"implementer-tools-button","slot":"top-nav-actions-slot","component":"implementerToolsButton","order":20}],"version":"6.3.1-pre.3234"}
1
+ {"$schema":"https://json.openmrs.org/routes.schema.json","pages":[{"component":"implementerTools","route":true},{"component":"globalImplementerTools","route":true}],"extensions":[{"name":"implementer-tools-button","slot":"top-nav-actions-slot","component":"implementerToolsButton","order":20}],"version":"6.3.1-pre.3244"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@openmrs/esm-implementer-tools-app",
3
- "version": "6.3.1-pre.3234",
3
+ "version": "6.3.1-pre.3244",
4
4
  "license": "MPL-2.0",
5
5
  "description": "The admin interface for OpenMRS Frontend",
6
6
  "browser": "dist/openmrs-esm-implementer-tools-app.js",
@@ -17,7 +17,7 @@
17
17
  "analyze": "webpack --mode=production --env analyze=true",
18
18
  "typescript": "tsc",
19
19
  "lint": "eslint src --ext ts,tsx",
20
- "extract-translations": "i18next 'src/**/*.component.tsx' 'src/**/*.button.tsx' 'src/**/*.extension.tsx' 'src/**/*.modal.tsx' --config='../../../tools/i18next-parser.config.js'"
20
+ "extract-translations": "i18next 'src/**/*.component.tsx' 'src/**/*.button.tsx' 'src/**/*.extension.tsx' 'src/**/*.modal.tsx' 'src/**/*.resource.ts' --config='../../../tools/i18next-parser.config.js'"
21
21
  },
22
22
  "keywords": [
23
23
  "openmrs",
@@ -51,8 +51,8 @@
51
51
  "swr": "2.x"
52
52
  },
53
53
  "devDependencies": {
54
- "@openmrs/esm-framework": "6.3.1-pre.3234",
55
- "@openmrs/webpack-config": "6.3.1-pre.3234",
54
+ "@openmrs/esm-framework": "6.3.1-pre.3244",
55
+ "@openmrs/webpack-config": "6.3.1-pre.3244",
56
56
  "ace-builds": "^1.4.14",
57
57
  "react": "^18.1.0",
58
58
  "react-ace": "^9.5.0",
@@ -89,7 +89,7 @@ export default function EditableValue({ path, element, customType }: EditableVal
89
89
  customType={customType}
90
90
  path={path}
91
91
  handleClose={closeEditor}
92
- handleSave={(val) => {
92
+ handleSaveToConfiguration={(val) => {
93
93
  try {
94
94
  const result = JSON.parse(val);
95
95
  const tempConfigUpdate = set(cloneDeep(temporaryConfigStore.getState()), ['config', ...path], result);
@@ -0,0 +1,147 @@
1
+ import { type TOptions } from 'i18next';
2
+ import { Type, type ConfigValue, type ConfigSchema, type Validator, translateFrom } from '@openmrs/esm-framework';
3
+ import type { CustomValueType } from './value-editor';
4
+
5
+ const moduleName = '@openmrs/esm-implementer-tools-app';
6
+ const t = (key: string, fallback?: string, options?: Omit<TOptions, 'ns' | 'defaultValue'>) =>
7
+ translateFrom(moduleName, key, fallback, options);
8
+
9
+ const validateString = (value: ConfigValue, validators: Array<Validator>) => {
10
+ if (typeof value !== 'string') {
11
+ return t('stringValidationMessage', 'Value must be a string');
12
+ }
13
+ for (const validator of validators) {
14
+ const error = validator(value);
15
+ if (error) return error;
16
+ }
17
+ return null;
18
+ };
19
+
20
+ const validateNumber = (value: ConfigValue, validators: Array<Validator>) => {
21
+ if (typeof value !== 'number') {
22
+ return t('numberValidationMessage', 'Value must be a number');
23
+ }
24
+ for (const validator of validators) {
25
+ const error = validator(value);
26
+ if (error) return error;
27
+ }
28
+ return null;
29
+ };
30
+
31
+ const validateBoolean = (value: ConfigValue, validators: Array<Validator>) => {
32
+ if (typeof value !== 'boolean') {
33
+ return t('booleanValidationMessage', 'Value must be a boolean');
34
+ }
35
+ for (const validator of validators) {
36
+ const error = validator(value);
37
+ if (error) return error;
38
+ }
39
+ return null;
40
+ };
41
+
42
+ const validateArray = (value: ConfigValue, validators: Array<Validator>, elementSchema?: ConfigSchema) => {
43
+ if (!Array.isArray(value)) {
44
+ return t('arrayValidationMessage', 'Value must be an array');
45
+ }
46
+ for (const validator of validators) {
47
+ const error = validator(value);
48
+ if (error) return error;
49
+ }
50
+ if (elementSchema) {
51
+ for (let i = 0; i < value.length; i++) {
52
+ const element = value[i];
53
+ if (elementSchema._type === Type.Object) {
54
+ const error = validateObject(element, [], elementSchema);
55
+ if (error) return error;
56
+ } else {
57
+ const elementType = elementSchema._type;
58
+ const elementValidators = elementSchema._validators ?? [];
59
+ const error = validateValue(element, elementType, elementValidators, elementSchema._elements);
60
+ if (error) return error;
61
+ }
62
+ }
63
+ }
64
+ return null;
65
+ };
66
+
67
+ const validateObject = (value: ConfigValue, validators: Array<Validator>, elementSchema?: ConfigSchema) => {
68
+ if (!elementSchema || typeof value !== 'object' || value === null || Array.isArray(value)) {
69
+ return t('objectValidationMessage', 'Value must be an object');
70
+ }
71
+ for (const validator of validators) {
72
+ const error = validator(value);
73
+ if (error) return error;
74
+ }
75
+ for (const key of Object.keys(elementSchema)) {
76
+ if (key.startsWith('_')) continue;
77
+ const propSchema = elementSchema[key];
78
+ const propValue = value[key];
79
+ if (typeof propSchema === 'object' && propSchema !== null && '_type' in propSchema) {
80
+ if (propSchema._type === Type.Array) {
81
+ const error = validateArray(propValue, propSchema._validators ?? [], propSchema._elements);
82
+ if (error)
83
+ return t('objectPropertyValidationMessage', 'Property {{key}}: {{error}}', {
84
+ key,
85
+ error,
86
+ });
87
+ } else {
88
+ const propType = propSchema._type;
89
+ const propValidators = propSchema._validators ?? [];
90
+ const error = validateValue(propValue, propType, propValidators, propSchema._elements);
91
+ if (error)
92
+ return t('objectPropertyValidationMessage', 'Property {{key}}: {{error}}', {
93
+ key,
94
+ error,
95
+ });
96
+ }
97
+ } else if (typeof propSchema === 'object' && propSchema !== null) {
98
+ const error = validateObject(propValue, [], propSchema as ConfigSchema);
99
+ if (error)
100
+ return t('objectPropertyValidationMessage', 'Property {{key}}: {{error}}', {
101
+ key,
102
+ error,
103
+ });
104
+ }
105
+ }
106
+ return null;
107
+ };
108
+
109
+ const validateUuid = (value: ConfigValue, validators: Array<Validator>) => {
110
+ if (
111
+ typeof value !== 'string' ||
112
+ !/^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-5][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|[0-9A-Za-z]{11,36})$/i.test(
113
+ value,
114
+ )
115
+ ) {
116
+ return t('uuidValidationMessage', 'Value must be a valid UUID string');
117
+ }
118
+ for (const validator of validators) {
119
+ const error = validator(value);
120
+ if (error) return error;
121
+ }
122
+ return null;
123
+ };
124
+
125
+ export const validateValue = (
126
+ value: ConfigValue,
127
+ fieldType: Type | CustomValueType | undefined,
128
+ validators: Array<Validator>,
129
+ elementSchema?: ConfigSchema,
130
+ ) => {
131
+ switch (fieldType) {
132
+ case Type.String:
133
+ return validateString(value, validators);
134
+ case Type.Number:
135
+ return validateNumber(value, validators);
136
+ case Type.Boolean:
137
+ return validateBoolean(value, validators);
138
+ case Type.Array:
139
+ return validateArray(value, validators, elementSchema);
140
+ case Type.Object:
141
+ return validateObject(value, validators, elementSchema);
142
+ case Type.UUID || Type.ConceptUuid || Type.PersonAttributeTypeUuid || Type.PatientIdentifierTypeUuid:
143
+ return validateUuid(value, validators);
144
+ default:
145
+ return null;
146
+ }
147
+ };
@@ -1,5 +1,12 @@
1
1
  @use '@carbon/layout';
2
2
  @use '@carbon/styles/scss/components/button';
3
+ @use '@carbon/styles/scss/theme';
4
+
5
+ .errorMessage {
6
+ color: theme.$text-error;
7
+ font-size: layout.$spacing-04;
8
+ margin-top: layout.$spacing-02;
9
+ }
3
10
 
4
11
  .valueEditorButtons {
5
12
  margin-top: layout.$spacing-03;
@@ -1,10 +1,10 @@
1
- import React, { useEffect, useState, useRef } from 'react';
2
- import { useTranslation } from 'react-i18next';
1
+ import React, { useEffect, useState, useRef, useCallback } from 'react';
3
2
  import { Button } from '@carbon/react';
4
- import { CloseIcon, SaveIcon, type Type } from '@openmrs/esm-framework';
3
+ import { CloseIcon, type ConfigSchema, type Config, getCoreTranslation, SaveIcon, Type } from '@openmrs/esm-framework';
5
4
  import type { ConfigValueDescriptor } from './editable-value.component';
6
5
  import { ValueEditorField } from './value-editors/value-editor-field';
7
- import styles from './value-editor.scss';
6
+ import styles from './value-editor.styles.scss';
7
+ import { validateValue } from './validators.resource';
8
8
 
9
9
  export type CustomValueType = 'add' | 'remove' | 'order' | 'configure';
10
10
 
@@ -14,23 +14,41 @@ interface ValueEditorProps {
14
14
  element: ConfigValueDescriptor;
15
15
  customType?: CustomValueType;
16
16
  path: Array<string>;
17
- handleSave: (val: string) => void;
17
+ handleSaveToConfiguration: (val: string) => void;
18
18
  handleClose: () => void;
19
19
  }
20
20
 
21
- export function ValueEditor({ element, customType, path, handleSave, handleClose }: ValueEditorProps) {
21
+ export function ValueEditor({ element, customType, path, handleSaveToConfiguration, handleClose }: ValueEditorProps) {
22
22
  const ref = useRef<HTMLDivElement>(null);
23
23
  const [tmpValue, setTmpValue] = useState(element._value);
24
- const { t } = useTranslation();
24
+ const [error, setError] = useState<string | null>(null);
25
25
 
26
26
  const valueType = customType ?? element._type;
27
+ const validators = element._validators ?? [];
28
+
29
+ let elementSchema: ConfigValueDescriptor | Config | undefined = undefined;
30
+ if (valueType === Type.Object) {
31
+ elementSchema = element;
32
+ } else if (valueType === Type.Array) {
33
+ elementSchema = element._elements;
34
+ }
35
+
36
+ const handleSave = useCallback(() => {
37
+ const errorMessage = validateValue(tmpValue, valueType, validators, elementSchema as ConfigSchema);
38
+ if (errorMessage) {
39
+ setError(errorMessage);
40
+ } else {
41
+ setError(null);
42
+ handleSaveToConfiguration(JSON.stringify(tmpValue));
43
+ }
44
+ }, [tmpValue, valueType, validators, elementSchema, handleSaveToConfiguration]);
27
45
 
28
46
  useEffect(() => {
29
47
  const keyListener = (e: KeyboardEvent) => {
30
48
  if (e.key === 'Escape') {
31
49
  handleClose();
32
50
  } else if (e.key === 'Enter') {
33
- handleSave(JSON.stringify(tmpValue));
51
+ handleSave();
34
52
  }
35
53
  };
36
54
 
@@ -38,21 +56,31 @@ export function ValueEditor({ element, customType, path, handleSave, handleClose
38
56
  return () => {
39
57
  document.removeEventListener('keyup', keyListener);
40
58
  };
41
- }, [handleSave, handleClose, tmpValue]);
59
+ }, [handleSave, handleClose]);
42
60
 
43
61
  return (
44
- <div ref={ref} style={{ display: 'inherit' }}>
45
- <ValueEditorField element={element} path={path} value={tmpValue} onChange={setTmpValue} valueType={valueType} />
62
+ <div ref={ref}>
63
+ <ValueEditorField
64
+ element={element}
65
+ path={path}
66
+ value={tmpValue}
67
+ onChange={setTmpValue}
68
+ valueType={valueType}
69
+ error={error}
70
+ />
71
+ <div className={styles.errorMessage}>
72
+ {valueType !== Type.Number &&
73
+ valueType !== Type.String &&
74
+ valueType !== Type.UUID &&
75
+ valueType !== Type.Boolean &&
76
+ error}
77
+ </div>
46
78
  <div className={styles.valueEditorButtons}>
47
- <Button
48
- renderIcon={(props) => <SaveIcon {...props} size={16} />}
49
- kind="primary"
50
- onClick={() => handleSave(JSON.stringify(tmpValue))}
51
- >
52
- {t('saveValueButtonText', 'Save')}
79
+ <Button renderIcon={(props) => <SaveIcon {...props} size={16} />} kind="primary" onClick={handleSave}>
80
+ {getCoreTranslation('save')}
53
81
  </Button>
54
82
  <Button renderIcon={(props) => <CloseIcon {...props} size={16} />} kind="secondary" onClick={handleClose}>
55
- {t('cancelButtonText', 'Cancel')}
83
+ {getCoreTranslation('cancel')}
56
84
  </Button>
57
85
  </div>
58
86
  </div>
@@ -19,9 +19,10 @@ export interface ValueEditorFieldProps {
19
19
  valueType?: ValueType;
20
20
  value: any;
21
21
  onChange: (value: any) => void;
22
+ error?: string | null;
22
23
  }
23
24
 
24
- export function ValueEditorField({ element, path, valueType, value, onChange }: ValueEditorFieldProps) {
25
+ export function ValueEditorField({ element, path, valueType, value, onChange, error }: ValueEditorFieldProps) {
25
26
  const [id] = useState(uniqueId('value-editor-'));
26
27
 
27
28
  if (valueType === 'remove' && !path) {
@@ -31,7 +32,15 @@ export function ValueEditorField({ element, path, valueType, value, onChange }:
31
32
  return valueType === Type.Array ? (
32
33
  <ArrayEditor element={element} valueArray={value} setValue={onChange} />
33
34
  ) : valueType === Type.Boolean ? (
34
- <Checkbox id={id} checked={value} hideLabel labelText="" onChange={(event, { checked, id }) => onChange(checked)} />
35
+ <Checkbox
36
+ id={id}
37
+ checked={value}
38
+ hideLabel
39
+ labelText=""
40
+ onChange={(event, { checked, id }) => onChange(checked)}
41
+ invalid={Boolean(error)}
42
+ invalidText={error}
43
+ />
35
44
  ) : valueType === Type.ConceptUuid ? (
36
45
  <ConceptSearchBox value={value} setConcept={(concept) => onChange(concept.uuid)} />
37
46
  ) : valueType === Type.PersonAttributeTypeUuid ? (
@@ -47,9 +56,18 @@ export function ValueEditorField({ element, path, valueType, value, onChange }:
47
56
  value={value}
48
57
  onChange={(_, { value }) => onChange(value ? (typeof value === 'string' ? parseInt(value) : value) : 0)}
49
58
  hideSteppers
59
+ invalid={Boolean(error)}
60
+ invalidText={error}
50
61
  />
51
62
  ) : valueType === Type.String || valueType === Type.UUID ? (
52
- <TextInput id={id} value={value} labelText="" onChange={(e) => onChange(e.target.value)} />
63
+ <TextInput
64
+ id={id}
65
+ value={value}
66
+ labelText=""
67
+ onChange={(e) => onChange(e.target.value)}
68
+ invalid={Boolean(error)}
69
+ invalidText={error}
70
+ />
53
71
  ) : valueType === 'add' ? (
54
72
  <ExtensionSlotAdd value={value ?? element._value} setValue={onChange} />
55
73
  ) : valueType === 'remove' && path ? (
@@ -1,6 +1,8 @@
1
1
  {
2
2
  "activeItemSourceText": "The current value comes from ",
3
+ "arrayValidationMessage": "Value must be an array",
3
4
  "backendModules": "Backend modules",
5
+ "booleanValidationMessage": "Value must be a boolean",
4
6
  "checkImplementerToolsMessage": "Check the Backend Modules tab in the Implementer Tools for more details",
5
7
  "clearConfig": "Clear local config",
6
8
  "close": "Close",
@@ -21,12 +23,17 @@
21
23
  "missing": "Missing",
22
24
  "moduleName": "Module name",
23
25
  "modulesWithMissingDependenciesWarning": "Some modules have unresolved backend dependencies",
26
+ "numberValidationMessage": "Value must be a number",
27
+ "objectPropertyValidationMessage": "Property {{key}}: {{error}}",
28
+ "objectValidationMessage": "Value must be an object",
24
29
  "requiredVersion": "Required Version",
25
30
  "resetToDefaultValueButtonText": "Reset to default",
31
+ "stringValidationMessage": "Value must be a string",
26
32
  "toggleImplementerTools": "Toggle Implementer Tools",
27
33
  "uiEditor": "UI editor",
28
34
  "unknownVersion": "unknown",
29
35
  "updateConfig": "Update config",
36
+ "uuidValidationMessage": "Value must be a valid UUID string",
30
37
  "value": "Value",
31
38
  "viewModules": "View modules"
32
39
  }
@@ -1,6 +1,8 @@
1
1
  {
2
2
  "activeItemSourceText": "القيمة الحالية مأخوذة من ",
3
+ "arrayValidationMessage": "Value must be an array",
3
4
  "backendModules": "وحدات الخلفية",
5
+ "booleanValidationMessage": "Value must be a boolean",
4
6
  "checkImplementerToolsMessage": "تحقق من علامة التبويب وحدات الخلفية في أدوات المنفذ لمزيد من التفاصيل",
5
7
  "clearConfig": "مسح التكوين المحلي",
6
8
  "close": "إغلاق",
@@ -21,12 +23,17 @@
21
23
  "missing": "مفقود",
22
24
  "moduleName": "اسم الوحدة",
23
25
  "modulesWithMissingDependenciesWarning": "بعض الوحدات لديها اعتمادات خلفية غير محلولة",
26
+ "numberValidationMessage": "Value must be a number",
27
+ "objectPropertyValidationMessage": "Property {{key}}: {{error}}",
28
+ "objectValidationMessage": "Value must be an object",
24
29
  "requiredVersion": "الإصدار المطلوب",
25
30
  "resetToDefaultValueButtonText": "إعادة تعيين إلى القيمة الافتراضية",
31
+ "stringValidationMessage": "Value must be a string",
26
32
  "toggleImplementerTools": "Toggle Implementer Tools",
27
33
  "uiEditor": "محرر الواجهة",
28
34
  "unknownVersion": "غير معروف",
29
35
  "updateConfig": "Update config",
36
+ "uuidValidationMessage": "Value must be a valid UUID string",
30
37
  "value": "قيمة",
31
38
  "viewModules": "عرض الوحدات"
32
39
  }
@@ -1,6 +1,8 @@
1
1
  {
2
2
  "activeItemSourceText": "The current value comes from ",
3
+ "arrayValidationMessage": "Value must be an array",
3
4
  "backendModules": "Backend modules",
5
+ "booleanValidationMessage": "Value must be a boolean",
4
6
  "checkImplementerToolsMessage": "Check the Backend Modules tab in the Implementer Tools for more details",
5
7
  "clearConfig": "Clear local config",
6
8
  "close": "Close",
@@ -21,12 +23,17 @@
21
23
  "missing": "Missing",
22
24
  "moduleName": "Module name",
23
25
  "modulesWithMissingDependenciesWarning": "Some modules have unresolved backend dependencies",
26
+ "numberValidationMessage": "Value must be a number",
27
+ "objectPropertyValidationMessage": "Property {{key}}: {{error}}",
28
+ "objectValidationMessage": "Value must be an object",
24
29
  "requiredVersion": "Required Version",
25
30
  "resetToDefaultValueButtonText": "Reset to default",
31
+ "stringValidationMessage": "Value must be a string",
26
32
  "toggleImplementerTools": "Toggle Implementer Tools",
27
33
  "uiEditor": "UI editor",
28
34
  "unknownVersion": "unknown",
29
35
  "updateConfig": "Update config",
36
+ "uuidValidationMessage": "Value must be a valid UUID string",
30
37
  "value": "Value",
31
38
  "viewModules": "View modules"
32
39
  }
@@ -1,6 +1,8 @@
1
1
  {
2
2
  "activeItemSourceText": "The current value comes from ",
3
+ "arrayValidationMessage": "Value must be an array",
3
4
  "backendModules": "Backend modules",
5
+ "booleanValidationMessage": "Value must be a boolean",
4
6
  "checkImplementerToolsMessage": "Check the Backend Modules tab in the Implementer Tools for more details",
5
7
  "clearConfig": "Clear local config",
6
8
  "close": "Close",
@@ -21,12 +23,17 @@
21
23
  "missing": "Missing",
22
24
  "moduleName": "Module name",
23
25
  "modulesWithMissingDependenciesWarning": "Some modules have unresolved backend dependencies",
26
+ "numberValidationMessage": "Value must be a number",
27
+ "objectPropertyValidationMessage": "Property {{key}}: {{error}}",
28
+ "objectValidationMessage": "Value must be an object",
24
29
  "requiredVersion": "Required Version",
25
30
  "resetToDefaultValueButtonText": "Reset to default",
31
+ "stringValidationMessage": "Value must be a string",
26
32
  "toggleImplementerTools": "Toggle Implementer Tools",
27
33
  "uiEditor": "UI editor",
28
34
  "unknownVersion": "unknown",
29
35
  "updateConfig": "Update config",
36
+ "uuidValidationMessage": "Value must be a valid UUID string",
30
37
  "value": "Value",
31
38
  "viewModules": "View modules"
32
39
  }
@@ -1,6 +1,8 @@
1
1
  {
2
2
  "activeItemSourceText": "The current value comes from ",
3
+ "arrayValidationMessage": "Value must be an array",
3
4
  "backendModules": "Backend modules",
5
+ "booleanValidationMessage": "Value must be a boolean",
4
6
  "checkImplementerToolsMessage": "Check the Backend Modules tab in the Implementer Tools for more details",
5
7
  "clearConfig": "Clear local config",
6
8
  "close": "Close",
@@ -21,12 +23,17 @@
21
23
  "missing": "Missing",
22
24
  "moduleName": "Module name",
23
25
  "modulesWithMissingDependenciesWarning": "Some modules have unresolved backend dependencies",
26
+ "numberValidationMessage": "Value must be a number",
27
+ "objectPropertyValidationMessage": "Property {{key}}: {{error}}",
28
+ "objectValidationMessage": "Value must be an object",
24
29
  "requiredVersion": "Required Version",
25
30
  "resetToDefaultValueButtonText": "Reset to default",
31
+ "stringValidationMessage": "Value must be a string",
26
32
  "toggleImplementerTools": "Toggle Implementer Tools",
27
33
  "uiEditor": "UI editor",
28
34
  "unknownVersion": "unknown",
29
35
  "updateConfig": "Update config",
36
+ "uuidValidationMessage": "Value must be a valid UUID string",
30
37
  "value": "Value",
31
38
  "viewModules": "View modules"
32
39
  }
@@ -1,6 +1,8 @@
1
1
  {
2
2
  "activeItemSourceText": "The current value comes from ",
3
+ "arrayValidationMessage": "Value must be an array",
3
4
  "backendModules": "Backend modules",
5
+ "booleanValidationMessage": "Value must be a boolean",
4
6
  "checkImplementerToolsMessage": "Check the Backend Modules tab in the Implementer Tools for more details",
5
7
  "clearConfig": "Clear local config",
6
8
  "close": "Close",
@@ -21,12 +23,17 @@
21
23
  "missing": "Missing",
22
24
  "moduleName": "Module name",
23
25
  "modulesWithMissingDependenciesWarning": "Some modules have unresolved backend dependencies",
26
+ "numberValidationMessage": "Value must be a number",
27
+ "objectPropertyValidationMessage": "Property {{key}}: {{error}}",
28
+ "objectValidationMessage": "Value must be an object",
24
29
  "requiredVersion": "Required Version",
25
30
  "resetToDefaultValueButtonText": "Reset to default",
31
+ "stringValidationMessage": "Value must be a string",
26
32
  "toggleImplementerTools": "Toggle Implementer Tools",
27
33
  "uiEditor": "UI editor",
28
34
  "unknownVersion": "unknown",
29
35
  "updateConfig": "Update config",
36
+ "uuidValidationMessage": "Value must be a valid UUID string",
30
37
  "value": "Value",
31
38
  "viewModules": "View modules"
32
39
  }
@@ -1,6 +1,8 @@
1
1
  {
2
2
  "activeItemSourceText": "The current value comes from ",
3
+ "arrayValidationMessage": "Value must be an array",
3
4
  "backendModules": "Backend modules",
5
+ "booleanValidationMessage": "Value must be a boolean",
4
6
  "checkImplementerToolsMessage": "Check the Backend Modules tab in the Implementer Tools for more details",
5
7
  "clearConfig": "Clear local config",
6
8
  "close": "Close",
@@ -21,12 +23,17 @@
21
23
  "missing": "Missing",
22
24
  "moduleName": "Module name",
23
25
  "modulesWithMissingDependenciesWarning": "Some modules have unresolved backend dependencies",
26
+ "numberValidationMessage": "Value must be a number",
27
+ "objectPropertyValidationMessage": "Property {{key}}: {{error}}",
28
+ "objectValidationMessage": "Value must be an object",
24
29
  "requiredVersion": "Required Version",
25
30
  "resetToDefaultValueButtonText": "Reset to default",
31
+ "stringValidationMessage": "Value must be a string",
26
32
  "toggleImplementerTools": "Toggle Implementer Tools",
27
33
  "uiEditor": "UI editor",
28
34
  "unknownVersion": "unknown",
29
35
  "updateConfig": "Update config",
36
+ "uuidValidationMessage": "Value must be a valid UUID string",
30
37
  "value": "Value",
31
38
  "viewModules": "View modules"
32
39
  }
@@ -1,6 +1,8 @@
1
1
  {
2
2
  "activeItemSourceText": "El valor actual proviene de ",
3
+ "arrayValidationMessage": "Value must be an array",
3
4
  "backendModules": "Módulos Backend",
5
+ "booleanValidationMessage": "Value must be a boolean",
4
6
  "checkImplementerToolsMessage": "Consulte la pestaña Módulos Backend en las Herramientas del Implementador para más detalles",
5
7
  "clearConfig": "Borrar la configuración local",
6
8
  "close": "Cerrar",
@@ -21,12 +23,17 @@
21
23
  "missing": "Faltante",
22
24
  "moduleName": "Nombre del módulo",
23
25
  "modulesWithMissingDependenciesWarning": "Algunos módulos tienen dependencias no resueltas en el backend",
26
+ "numberValidationMessage": "Value must be a number",
27
+ "objectPropertyValidationMessage": "Property {{key}}: {{error}}",
28
+ "objectValidationMessage": "Value must be an object",
24
29
  "requiredVersion": "Versión Requerida",
25
30
  "resetToDefaultValueButtonText": "Restablecer a los valores predeterminados",
31
+ "stringValidationMessage": "Value must be a string",
26
32
  "toggleImplementerTools": "Activar/desactivar herramientas de implementador",
27
33
  "uiEditor": "Editor por UI",
28
34
  "unknownVersion": "desconocido",
29
35
  "updateConfig": "Actualizar configuración",
36
+ "uuidValidationMessage": "Value must be a valid UUID string",
30
37
  "value": "Valor",
31
38
  "viewModules": "Ver módulos"
32
39
  }
@@ -1,6 +1,8 @@
1
1
  {
2
2
  "activeItemSourceText": "The current value comes from ",
3
+ "arrayValidationMessage": "Value must be an array",
3
4
  "backendModules": "Backend modules",
5
+ "booleanValidationMessage": "Value must be a boolean",
4
6
  "checkImplementerToolsMessage": "Check the Backend Modules tab in the Implementer Tools for more details",
5
7
  "clearConfig": "Clear local config",
6
8
  "close": "Close",
@@ -21,12 +23,17 @@
21
23
  "missing": "Missing",
22
24
  "moduleName": "Module name",
23
25
  "modulesWithMissingDependenciesWarning": "Some modules have unresolved backend dependencies",
26
+ "numberValidationMessage": "Value must be a number",
27
+ "objectPropertyValidationMessage": "Property {{key}}: {{error}}",
28
+ "objectValidationMessage": "Value must be an object",
24
29
  "requiredVersion": "Required Version",
25
30
  "resetToDefaultValueButtonText": "Reset to default",
31
+ "stringValidationMessage": "Value must be a string",
26
32
  "toggleImplementerTools": "Toggle Implementer Tools",
27
33
  "uiEditor": "UI editor",
28
34
  "unknownVersion": "unknown",
29
35
  "updateConfig": "Update config",
36
+ "uuidValidationMessage": "Value must be a valid UUID string",
30
37
  "value": "Value",
31
38
  "viewModules": "View modules"
32
39
  }
@@ -1,6 +1,8 @@
1
1
  {
2
2
  "activeItemSourceText": "La valeur vient de",
3
+ "arrayValidationMessage": "Value must be an array",
3
4
  "backendModules": "Modules du backend",
5
+ "booleanValidationMessage": "Value must be a boolean",
4
6
  "checkImplementerToolsMessage": "Consultez l'onglet Modules backend dans les outils d'implémentation pour plus de détails",
5
7
  "clearConfig": "Effacer la configuration locale",
6
8
  "close": "Fermer",
@@ -21,12 +23,17 @@
21
23
  "missing": "Absent",
22
24
  "moduleName": "Nom du Module",
23
25
  "modulesWithMissingDependenciesWarning": "Certains modules ont des dépendances de backend non résolues",
26
+ "numberValidationMessage": "Value must be a number",
27
+ "objectPropertyValidationMessage": "Property {{key}}: {{error}}",
28
+ "objectValidationMessage": "Value must be an object",
24
29
  "requiredVersion": "Version Recommandée",
25
30
  "resetToDefaultValueButtonText": "Ramener à la valeur par défaut",
31
+ "stringValidationMessage": "Value must be a string",
26
32
  "toggleImplementerTools": "Toggle Implementer Tools",
27
33
  "uiEditor": "Editeur Interface Utilisateur",
28
34
  "unknownVersion": "Inconnu",
29
35
  "updateConfig": "Mise à jour de la configuration",
36
+ "uuidValidationMessage": "Value must be a valid UUID string",
30
37
  "value": "Valeur",
31
38
  "viewModules": "Voir les modules"
32
39
  }
@@ -1,6 +1,8 @@
1
1
  {
2
2
  "activeItemSourceText": "הערך הנוכחי מגיע מ",
3
+ "arrayValidationMessage": "Value must be an array",
3
4
  "backendModules": "מודולים בצד השרת",
5
+ "booleanValidationMessage": "Value must be a boolean",
4
6
  "checkImplementerToolsMessage": "Check the Backend Modules tab in the Implementer Tools for more details",
5
7
  "clearConfig": "נקה תצורה מקומית",
6
8
  "close": "Close",
@@ -21,12 +23,17 @@
21
23
  "missing": "חסר",
22
24
  "moduleName": "שם המודול",
23
25
  "modulesWithMissingDependenciesWarning": "Some modules have unresolved backend dependencies",
26
+ "numberValidationMessage": "Value must be a number",
27
+ "objectPropertyValidationMessage": "Property {{key}}: {{error}}",
28
+ "objectValidationMessage": "Value must be an object",
24
29
  "requiredVersion": "גרסה נדרשת",
25
30
  "resetToDefaultValueButtonText": "איפוס לברירת מחדל",
31
+ "stringValidationMessage": "Value must be a string",
26
32
  "toggleImplementerTools": "Toggle Implementer Tools",
27
33
  "uiEditor": "עורך ממשק משתמש",
28
34
  "unknownVersion": "לא ידוע",
29
35
  "updateConfig": "Update config",
36
+ "uuidValidationMessage": "Value must be a valid UUID string",
30
37
  "value": "ערך",
31
38
  "viewModules": "View modules"
32
39
  }