Skip to content

Commit f53de82

Browse files
committed
Clean-up code. Move multi-language error messages to 'locale' folder.
1 parent 837bfb9 commit f53de82

14 files changed

+142
-206
lines changed

src/demo/app/demo.component.html

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,7 @@ <h4 class="default-cursor" (click)="toggleVisible('form')">
154154
[form]="jsonFormObject"
155155
[options]="jsonFormOptions"
156156
[framework]="selectedFramework"
157+
[language]="selectedLanguage"
157158
(onChanges)="onChanges($event)"
158159
(onSubmit)="onSubmit($event)"
159160
(isValid)="isValid($event)"

src/demo/app/demo.component.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -190,13 +190,11 @@ export class DemoComponent implements OnInit {
190190
}
191191

192192
loadSelectedLanguage() {
193-
console.log('loadSelectedLanguage');
194193
window.location.href =
195194
'/?set=' + this.selectedSet +
196195
'&example=' + this.selectedExample +
197196
'&framework=' + this.selectedFramework +
198197
'&language=' + this.selectedLanguage;
199-
// this.generateForm(this.jsonFormSchema);
200198
}
201199

202200
// Display the form entered by the user

src/demo/assets/example-schemas/jsf-previousvalues.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,9 @@
2626
},
2727
"value": {
2828
"friends": [
29-
{ "nick": "tidoust", "gender": "male", "age": 34 },
30-
{ "nick": "titine", "gender": "female", "age": 6 },
31-
{ "nick": "E.T.", "gender": "alien" }
29+
{ "nick": "tidoust", "gender": "male", "age": 34 },
30+
{ "nick": "titine", "gender": "female", "age": 6 },
31+
{ "nick": "E.T.", "gender": "alien" }
3232
]
3333
}
3434
}

src/demo/assets/example-schemas/jsf-templating-values.json

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,8 @@
11
{
22
"schema": {
3-
"firstname": {
4-
"type": "string",
5-
"title": "First name"
6-
},
7-
"lastname": {
8-
"type": "string",
9-
"title": "Last name"
10-
},
11-
"fullname": {
12-
"type": "string",
13-
"title": "Full name"
14-
}
3+
"firstname": { "type": "string", "title": "First name" },
4+
"lastname": { "type": "string", "title": "Last name" },
5+
"fullname": { "type": "string", "title": "Full name" }
156
},
167
"form": [
178
"firstname",

src/demo/index.html

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,11 @@
22
<html>
33
<head>
44
<meta charset="utf-8">
5-
<title>Angular JSON Schema Form Demonstration Playground</title>
5+
<title>Angular JSON Schema FormDemonstration Playground</title>
66
<base href="/">
77
<meta name="viewport" content="width=device-width, initial-scale=1">
8-
<!-- Material Design -->
98
<link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
109
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700">
11-
<!-- Bootstrap 3 -->
12-
<!-- <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css"> -->
13-
<!-- <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/2.2.4/jquery.min.js"></script> -->
1410
<link rel="icon" type="image/x-icon" href="favicon.ico">
1511
</head>
1612
<body>

src/demo/styles.scss

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ body {
6060

6161
.data-bad { background-color: #fcc; }
6262

63-
.defualt-cursor:hover { cursor: default; }
63+
.default-cursor:hover { cursor: default; }
6464

6565
.check-row { margin-top: 8px; }
6666

src/lib/src/framework-library/framework.bootstrap4.ts

Lines changed: 0 additions & 22 deletions
This file was deleted.

src/lib/src/framework-library/no-framework.component.ts

Lines changed: 0 additions & 15 deletions
This file was deleted.

src/lib/src/i18n/json-schema-form-intl-fr.ts

Lines changed: 0 additions & 68 deletions
This file was deleted.

src/lib/src/json-schema-form-intl.ts

Lines changed: 0 additions & 72 deletions
This file was deleted.

src/lib/src/json-schema-form.service.ts

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ import {
2121
buildFormGroup, buildFormGroupTemplate, formatFormData, getControl
2222
} from './shared/form-group.functions';
2323
import { buildLayout, getLayoutNode } from './shared/layout.functions';
24-
import { JsonSchemaFormIntl } from './json-schema-form-intl';
24+
import { enValidationMessages } from './locale/en-validation-messages';
25+
import { frValidationMessages } from './locale/fr-validation-messages';
2526

2627
export interface TitleMapItem {
2728
name?: string, value?: any, checked?: boolean, group?: string, items?: TitleMapItem[]
@@ -70,6 +71,8 @@ export class JsonSchemaFormService {
7071
templateRefLibrary: any = {}; // Library of formGroup templates for adding to form
7172
hasRootReference = false; // Does the form include a recursive reference to itself?
7273

74+
language = 'en-US'; // Does the form include a recursive reference to itself?
75+
7376
// Default global form options
7477
defaultFormOptions: any = {
7578
addSubmit: 'auto', // Add a submit button if layout does not have one?
@@ -112,14 +115,22 @@ export class JsonSchemaFormService {
112115
disabled: false, // Set control as disabled? (not editable, and excluded from output)
113116
readonly: false, // Set control as read only? (not editable, but included in output)
114117
returnEmptyFields: true, // return values for fields that contain no data?
115-
validationMessages: {} // injected
118+
validationMessages: {} // set by setLanguage()
116119
},
117120
};
118121

119-
constructor(public _intl: JsonSchemaFormIntl) {
120-
// inject translation
121-
this.defaultFormOptions.defautWidgetOptions.validationMessages = _.cloneDeep(_intl.validationMessages);
122+
constructor() {
123+
this.setLanguage(this.language);
124+
}
125+
126+
setLanguage(language: string = 'en-US') {
127+
this.language = language;
128+
const validationMessages = language.slice(0, 2) === 'fr' ?
129+
frValidationMessages : enValidationMessages;
130+
this.defaultFormOptions.defautWidgetOptions.validationMessages =
131+
_.cloneDeep(validationMessages);
122132
}
133+
123134
getData() { return this.data; }
124135

125136
getSchema() { return this.schema; }
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
export const enValidationMessages: any = { // Default English error messages
2+
required: 'This field is required.',
3+
minLength: 'Must be {{minimumLength}} characters or longer (current length: {{currentLength}})',
4+
maxLength: 'Must be {{maximumLength}} characters or shorter (current length: {{currentLength}})',
5+
pattern: 'Must match pattern: {{requiredPattern}}',
6+
format: function (error) {
7+
switch (error.requiredFormat) {
8+
case 'date':
9+
return 'Must be a date, like "2000-12-31"';
10+
case 'time':
11+
return 'Must be a time, like "16:20" or "03:14:15.9265"';
12+
case 'date-time':
13+
return 'Must be a date-time, like "2000-03-14T01:59" or "2000-03-14T01:59:26.535Z"';
14+
case 'email':
15+
return 'Must be an email address, like "[email protected]"';
16+
case 'hostname':
17+
return 'Must be a hostname, like "example.com"';
18+
case 'ipv4':
19+
return 'Must be an IPv4 address, like "127.0.0.1"';
20+
case 'ipv6':
21+
return 'Must be an IPv6 address, like "1234:5678:9ABC:DEF0:1234:5678:9ABC:DEF0"';
22+
// TODO: add examples for 'uri', 'uri-reference', and 'uri-template'
23+
// case 'uri': case 'uri-reference': case 'uri-template':
24+
case 'url':
25+
return 'Must be a url, like "http://www.example.com/page.html"';
26+
case 'uuid':
27+
return 'Must be a uuid, like "12345678-9ABC-DEF0-1234-56789ABCDEF0"';
28+
case 'color':
29+
return 'Must be a color, like "#FFFFFF" or "rgb(255, 255, 255)"';
30+
case 'json-pointer':
31+
return 'Must be a JSON Pointer, like "/pointer/to/something"';
32+
case 'relative-json-pointer':
33+
return 'Must be a relative JSON Pointer, like "2/pointer/to/something"';
34+
case 'regex':
35+
return 'Must be a regular expression, like "(1-)?\\d{3}-\\d{3}-\\d{4}"';
36+
default:
37+
return 'Must be a correctly formatted ' + error.requiredFormat;
38+
}
39+
},
40+
minimum: 'Must be {{minimumValue}} or more',
41+
exclusiveMinimum: 'Must be more than {{exclusiveMinimumValue}}',
42+
maximum: 'Must be {{maximumValue}} or less',
43+
exclusiveMaximum: 'Must be less than {{exclusiveMaximumValue}}',
44+
multipleOf: function (error) {
45+
if ((1 / error.multipleOfValue) % 10 === 0) {
46+
const decimals = Math.log10(1 / error.multipleOfValue);
47+
return `Must have ${decimals} or fewer decimal places.`;
48+
} else {
49+
return `Must be a multiple of ${error.multipleOfValue}.`;
50+
}
51+
},
52+
minProperties: 'Must have {{minimumProperties}} or more items (current items: {{currentProperties}})',
53+
maxProperties: 'Must have {{maximumProperties}} or fewer items (current items: {{currentProperties}})',
54+
minItems: 'Must have {{minimumItems}} or more items (current items: {{currentItems}})',
55+
maxItems: 'Must have {{maximumItems}} or fewer items (current items: {{currentItems}})',
56+
uniqueItems: 'All items must be unique',
57+
// Note: No default error messages for 'type', 'const', 'enum', or 'dependencies'
58+
};

0 commit comments

Comments
 (0)