Skip to content

Commit 0607878

Browse files
authored
Merge pull request DSpace#2640 from hutattedonmyarm/regex-error-messages
More meaningful regex error messages
2 parents 8c5fe13 + 0c6dc89 commit 0607878

20 files changed

Lines changed: 127 additions & 59 deletions

src/app/shared/form/builder/form-builder.service.spec.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,12 +31,14 @@ import {
3131
DynamicTextAreaModel,
3232
DynamicTimePickerModel,
3333
} from '@ng-dynamic-forms/core';
34+
import { TranslateService } from '@ngx-translate/core';
3435

3536
import { FormRowModel } from '../../../core/config/models/config-submission-form.model';
3637
import { SubmissionFormsModel } from '../../../core/config/models/config-submission-forms.model';
3738
import { ConfigurationDataService } from '../../../core/data/configuration-data.service';
3839
import { ConfigurationProperty } from '../../../core/shared/configuration-property.model';
3940
import { VocabularyOptions } from '../../../core/submission/vocabularies/models/vocabulary-options.model';
41+
import { getMockTranslateService } from '../../mocks/translate.service.mock';
4042
import { createSuccessfulRemoteDataObject$ } from '../../remote-data.utils';
4143
import { DynamicDsDatePickerModel } from './ds-dynamic-form-ui/models/date-picker/date-picker.model';
4244
import { DynamicConcatModel } from './ds-dynamic-form-ui/models/ds-dynamic-concat.model';
@@ -85,6 +87,7 @@ describe('FormBuilderService test suite', () => {
8587

8688
beforeEach(() => {
8789
configSpy = createConfigSuccessSpy(typeFieldTestValue);
90+
let translateService = getMockTranslateService();
8891
TestBed.configureTestingModule({
8992
imports: [ReactiveFormsModule],
9093
providers: [
@@ -93,6 +96,7 @@ describe('FormBuilderService test suite', () => {
9396
{ provide: NG_VALIDATORS, useValue: testValidator, multi: true },
9497
{ provide: NG_ASYNC_VALIDATORS, useValue: testAsyncValidator, multi: true },
9598
{ provide: ConfigurationDataService, useValue: configSpy },
99+
{ provide: TranslateService, useValue: translateService },
96100
],
97101
});
98102

src/app/shared/form/builder/parsers/concat-field-parser.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { Inject } from '@angular/core';
2+
import { TranslateService } from '@ngx-translate/core';
23

34
import {
45
hasNoValue,
@@ -34,10 +35,11 @@ export class ConcatFieldParser extends FieldParser {
3435
@Inject(CONFIG_DATA) configData: FormFieldModel,
3536
@Inject(INIT_FORM_VALUES) initFormValues,
3637
@Inject(PARSER_OPTIONS) parserOptions: ParserOptions,
38+
translate: TranslateService,
3739
protected separator: string,
3840
protected firstPlaceholder: string = null,
3941
protected secondPlaceholder: string = null) {
40-
super(submissionId, configData, initFormValues, parserOptions);
42+
super(submissionId, configData, initFormValues, parserOptions, translate);
4143

4244
this.separator = separator;
4345
this.firstPlaceholder = firstPlaceholder;

src/app/shared/form/builder/parsers/date-field-parser.spec.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,17 @@
1+
import { getMockTranslateService } from 'src/app/shared/mocks/translate.service.mock';
2+
13
import { DynamicDsDatePickerModel } from '../ds-dynamic-form-ui/models/date-picker/date-picker.model';
24
import { FormFieldModel } from '../models/form-field.model';
35
import { FormFieldMetadataValueObject } from '../models/form-field-metadata-value.model';
46
import { DateFieldParser } from './date-field-parser';
57
import { ParserOptions } from './parser-options';
68

9+
10+
711
describe('DateFieldParser test suite', () => {
812
let field: FormFieldModel;
913
let initFormValues: any = {};
14+
let translateService = getMockTranslateService();
1015

1116
const submissionId = '1234';
1217
const parserOptions: ParserOptions = {
@@ -37,13 +42,13 @@ describe('DateFieldParser test suite', () => {
3742
});
3843

3944
it('should init parser properly', () => {
40-
const parser = new DateFieldParser(submissionId, field, initFormValues, parserOptions);
45+
const parser = new DateFieldParser(submissionId, field, initFormValues, parserOptions, translateService);
4146

4247
expect(parser instanceof DateFieldParser).toBe(true);
4348
});
4449

4550
it('should return a DynamicDsDatePickerModel object when repeatable option is false', () => {
46-
const parser = new DateFieldParser(submissionId, field, initFormValues, parserOptions);
51+
const parser = new DateFieldParser(submissionId, field, initFormValues, parserOptions, translateService);
4752

4853
const fieldModel = parser.parse();
4954

@@ -56,7 +61,7 @@ describe('DateFieldParser test suite', () => {
5661
};
5762
const expectedValue = '1983-11-18';
5863

59-
const parser = new DateFieldParser(submissionId, field, initFormValues, parserOptions);
64+
const parser = new DateFieldParser(submissionId, field, initFormValues, parserOptions, translateService);
6065

6166
const fieldModel = parser.parse();
6267

src/app/shared/form/builder/parsers/disabled-field-parser.spec.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import { getMockTranslateService } from 'src/app/shared/mocks/translate.service.mock';
2+
13
import { DynamicDisabledModel } from '../ds-dynamic-form-ui/models/disabled/dynamic-disabled.model';
24
import { FormFieldModel } from '../models/form-field.model';
35
import { DisabledFieldParser } from './disabled-field-parser';
@@ -6,6 +8,7 @@ import { ParserOptions } from './parser-options';
68
describe('DisabledFieldParser test suite', () => {
79
let field: FormFieldModel;
810
let initFormValues: any = {};
11+
let translateService = getMockTranslateService();
912

1013
const submissionId = '1234';
1114
const parserOptions: ParserOptions = {
@@ -35,13 +38,13 @@ describe('DisabledFieldParser test suite', () => {
3538
});
3639

3740
it('should init parser properly', () => {
38-
const parser = new DisabledFieldParser(submissionId, field, initFormValues, parserOptions);
41+
const parser = new DisabledFieldParser(submissionId, field, initFormValues, parserOptions, translateService);
3942

4043
expect(parser instanceof DisabledFieldParser).toBe(true);
4144
});
4245

4346
it('should return a DynamicDisabledModel object when repeatable option is false', () => {
44-
const parser = new DisabledFieldParser(submissionId, field, initFormValues, parserOptions);
47+
const parser = new DisabledFieldParser(submissionId, field, initFormValues, parserOptions, translateService);
4548

4649
const fieldModel = parser.parse();
4750

@@ -56,7 +59,7 @@ describe('DisabledFieldParser test suite', () => {
5659
};
5760
const expectedValue = 'test description';
5861

59-
const parser = new DisabledFieldParser(submissionId, field, initFormValues, parserOptions);
62+
const parser = new DisabledFieldParser(submissionId, field, initFormValues, parserOptions, translateService);
6063

6164
const fieldModel = parser.parse();
6265
expect(fieldModel.value.value).toEqual(expectedValue);

src/app/shared/form/builder/parsers/dropdown-field-parser.spec.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
1+
import { getMockTranslateService } from 'src/app/shared/mocks/translate.service.mock';
2+
13
import { DynamicScrollableDropdownModel } from '../ds-dynamic-form-ui/models/scrollable-dropdown/dynamic-scrollable-dropdown.model';
24
import { FormFieldModel } from '../models/form-field.model';
35
import { DropdownFieldParser } from './dropdown-field-parser';
46
import { ParserOptions } from './parser-options';
57

68
describe('DropdownFieldParser test suite', () => {
79
let field: FormFieldModel;
10+
let translateService = getMockTranslateService();
811

912
const submissionId = '1234';
1013
const initFormValues = {};
@@ -37,13 +40,13 @@ describe('DropdownFieldParser test suite', () => {
3740
});
3841

3942
it('should init parser properly', () => {
40-
const parser = new DropdownFieldParser(submissionId, field, initFormValues, parserOptions);
43+
const parser = new DropdownFieldParser(submissionId, field, initFormValues, parserOptions, translateService);
4144

4245
expect(parser instanceof DropdownFieldParser).toBe(true);
4346
});
4447

4548
it('should return a DynamicScrollableDropdownModel object when repeatable option is false', () => {
46-
const parser = new DropdownFieldParser(submissionId, field, initFormValues, parserOptions);
49+
const parser = new DropdownFieldParser(submissionId, field, initFormValues, parserOptions, translateService);
4750

4851
const fieldModel = parser.parse();
4952

@@ -52,7 +55,7 @@ describe('DropdownFieldParser test suite', () => {
5255

5356
it('should throw when authority is not passed', () => {
5457
field.selectableMetadata[0].controlledVocabulary = null;
55-
const parser = new DropdownFieldParser(submissionId, field, initFormValues, parserOptions);
58+
const parser = new DropdownFieldParser(submissionId, field, initFormValues, parserOptions, translateService);
5659

5760
expect(() => parser.parse())
5861
.toThrow();

src/app/shared/form/builder/parsers/dropdown-field-parser.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { Inject } from '@angular/core';
22
import { DynamicFormControlLayout } from '@ng-dynamic-forms/core';
3+
import { TranslateService } from '@ngx-translate/core';
34

45
import { isNotEmpty } from '../../../empty.util';
56
import {
@@ -24,8 +25,9 @@ export class DropdownFieldParser extends FieldParser {
2425
@Inject(CONFIG_DATA) configData: FormFieldModel,
2526
@Inject(INIT_FORM_VALUES) initFormValues,
2627
@Inject(PARSER_OPTIONS) parserOptions: ParserOptions,
28+
translate: TranslateService,
2729
) {
28-
super(submissionId, configData, initFormValues, parserOptions);
30+
super(submissionId, configData, initFormValues, parserOptions, translate);
2931
}
3032

3133
public modelFactory(fieldValue?: FormFieldMetadataValueObject, label?: boolean): any {

src/app/shared/form/builder/parsers/field-parser.ts

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {
88
MATCH_VISIBLE,
99
OR_OPERATOR,
1010
} from '@ng-dynamic-forms/core';
11+
import { TranslateService } from '@ngx-translate/core';
1112
import uniqueId from 'lodash/uniqueId';
1213

1314
import { SubmissionScopeType } from '../../../../core/submission/submission-scope-type';
@@ -61,6 +62,7 @@ export abstract class FieldParser {
6162
@Inject(CONFIG_DATA) protected configData: FormFieldModel,
6263
@Inject(INIT_FORM_VALUES) protected initFormValues: any,
6364
@Inject(PARSER_OPTIONS) protected parserOptions: ParserOptions,
65+
protected translate: TranslateService,
6466
) {
6567
}
6668

@@ -405,11 +407,14 @@ export abstract class FieldParser {
405407
} else {
406408
regex = new RegExp(this.configData.input.regex);
407409
}
410+
const baseTranslationKey = 'error.validation.pattern';
411+
const fieldranslationKey = `${baseTranslationKey}.${controlModel.id}`;
412+
const fieldTranslationExists = this.translate.instant(fieldranslationKey) !== fieldranslationKey;
408413
controlModel.validators = Object.assign({}, controlModel.validators, { pattern: regex });
409414
controlModel.errorMessages = Object.assign(
410415
{},
411416
controlModel.errorMessages,
412-
{ pattern: 'error.validation.pattern' });
417+
{ pattern: fieldTranslationExists ? fieldranslationKey : baseTranslationKey });
413418
}
414419

415420
protected markAsRequired(controlModel) {

src/app/shared/form/builder/parsers/list-field-parser.spec.ts

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import { getMockTranslateService } from 'src/app/shared/mocks/translate.service.mock';
2+
13
import { DynamicListCheckboxGroupModel } from '../ds-dynamic-form-ui/models/list/dynamic-list-checkbox-group.model';
24
import { DynamicListRadioGroupModel } from '../ds-dynamic-form-ui/models/list/dynamic-list-radio-group.model';
35
import { FormFieldModel } from '../models/form-field.model';
@@ -8,6 +10,7 @@ import { ParserOptions } from './parser-options';
810
describe('ListFieldParser test suite', () => {
911
let field: FormFieldModel;
1012
let initFormValues = {};
13+
let translateService = getMockTranslateService();
1114

1215
const submissionId = '1234';
1316
const parserOptions: ParserOptions = {
@@ -39,13 +42,13 @@ describe('ListFieldParser test suite', () => {
3942
});
4043

4144
it('should init parser properly', () => {
42-
const parser = new ListFieldParser(submissionId, field, initFormValues, parserOptions);
45+
const parser = new ListFieldParser(submissionId, field, initFormValues, parserOptions, translateService);
4346

4447
expect(parser instanceof ListFieldParser).toBe(true);
4548
});
4649

4750
it('should return a DynamicListCheckboxGroupModel object when repeatable option is true', () => {
48-
const parser = new ListFieldParser(submissionId, field, initFormValues, parserOptions);
51+
const parser = new ListFieldParser(submissionId, field, initFormValues, parserOptions, translateService);
4952

5053
const fieldModel = parser.parse();
5154

@@ -54,7 +57,7 @@ describe('ListFieldParser test suite', () => {
5457

5558
it('should return a DynamicListRadioGroupModel object when repeatable option is false', () => {
5659
field.repeatable = false;
57-
const parser = new ListFieldParser(submissionId, field, initFormValues, parserOptions);
60+
const parser = new ListFieldParser(submissionId, field, initFormValues, parserOptions, translateService);
5861

5962
const fieldModel = parser.parse();
6063

@@ -67,7 +70,7 @@ describe('ListFieldParser test suite', () => {
6770
};
6871
const expectedValue = [new FormFieldMetadataValueObject('test type')];
6972

70-
const parser = new ListFieldParser(submissionId, field, initFormValues, parserOptions);
73+
const parser = new ListFieldParser(submissionId, field, initFormValues, parserOptions, translateService);
7174

7275
const fieldModel = parser.parse();
7376

src/app/shared/form/builder/parsers/lookup-field-parser.spec.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import { getMockTranslateService } from 'src/app/shared/mocks/translate.service.mock';
2+
13
import { DynamicLookupModel } from '../ds-dynamic-form-ui/models/lookup/dynamic-lookup.model';
24
import { FormFieldModel } from '../models/form-field.model';
35
import { FormFieldMetadataValueObject } from '../models/form-field-metadata-value.model';
@@ -7,6 +9,7 @@ import { ParserOptions } from './parser-options';
79
describe('LookupFieldParser test suite', () => {
810
let field: FormFieldModel;
911
let initFormValues = {};
12+
let translateService = getMockTranslateService();
1013

1114
const submissionId = '1234';
1215
const parserOptions: ParserOptions = {
@@ -38,13 +41,13 @@ describe('LookupFieldParser test suite', () => {
3841
});
3942

4043
it('should init parser properly', () => {
41-
const parser = new LookupFieldParser(submissionId, field, initFormValues, parserOptions);
44+
const parser = new LookupFieldParser(submissionId, field, initFormValues, parserOptions, translateService);
4245

4346
expect(parser instanceof LookupFieldParser).toBe(true);
4447
});
4548

4649
it('should return a DynamicLookupModel object when repeatable option is false', () => {
47-
const parser = new LookupFieldParser(submissionId, field, initFormValues, parserOptions);
50+
const parser = new LookupFieldParser(submissionId, field, initFormValues, parserOptions, translateService);
4851

4952
const fieldModel = parser.parse();
5053

@@ -57,7 +60,7 @@ describe('LookupFieldParser test suite', () => {
5760
};
5861
const expectedValue = new FormFieldMetadataValueObject('test journal');
5962

60-
const parser = new LookupFieldParser(submissionId, field, initFormValues, parserOptions);
63+
const parser = new LookupFieldParser(submissionId, field, initFormValues, parserOptions, translateService);
6164

6265
const fieldModel = parser.parse();
6366

src/app/shared/form/builder/parsers/lookup-name-field-parser.spec.ts

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import { getMockTranslateService } from 'src/app/shared/mocks/translate.service.mock';
2+
13
import { DynamicLookupNameModel } from '../ds-dynamic-form-ui/models/lookup/dynamic-lookup-name.model';
24
import { FormFieldModel } from '../models/form-field.model';
35
import { FormFieldMetadataValueObject } from '../models/form-field-metadata-value.model';
@@ -7,6 +9,7 @@ import { ParserOptions } from './parser-options';
79
describe('LookupNameFieldParser test suite', () => {
810
let field: FormFieldModel;
911
let initFormValues = {};
12+
let translateService = getMockTranslateService();
1013

1114
const submissionId = '1234';
1215
const parserOptions: ParserOptions = {
@@ -38,13 +41,13 @@ describe('LookupNameFieldParser test suite', () => {
3841
});
3942

4043
it('should init parser properly', () => {
41-
const parser = new LookupNameFieldParser(submissionId, field, initFormValues, parserOptions);
44+
const parser = new LookupNameFieldParser(submissionId, field, initFormValues, parserOptions, translateService);
4245

4346
expect(parser instanceof LookupNameFieldParser).toBe(true);
4447
});
4548

4649
it('should return a DynamicLookupNameModel object when repeatable option is false', () => {
47-
const parser = new LookupNameFieldParser(submissionId, field, initFormValues, parserOptions);
50+
const parser = new LookupNameFieldParser(submissionId, field, initFormValues, parserOptions, translateService);
4851

4952
const fieldModel = parser.parse();
5053

@@ -57,7 +60,7 @@ describe('LookupNameFieldParser test suite', () => {
5760
};
5861
const expectedValue = new FormFieldMetadataValueObject('test author');
5962

60-
const parser = new LookupNameFieldParser(submissionId, field, initFormValues, parserOptions);
63+
const parser = new LookupNameFieldParser(submissionId, field, initFormValues, parserOptions, translateService);
6164

6265
const fieldModel = parser.parse();
6366

0 commit comments

Comments
 (0)