Skip to content

Commit 971c076

Browse files
authored
Merge pull request DSpace#2641 from hutattedonmyarm/regex-error-messages-backport-dspace7x
[Port dspace-7_x] More meaningful regex error messages
2 parents 91d72c1 + ab23613 commit 971c076

20 files changed

Lines changed: 118 additions & 63 deletions

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

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ import { FormRowModel } from '../../../core/config/models/config-submission-form
5151
import {ConfigurationDataService} from '../../../core/data/configuration-data.service';
5252
import {createSuccessfulRemoteDataObject$} from '../../remote-data.utils';
5353
import {ConfigurationProperty} from '../../../core/shared/configuration-property.model';
54+
import { getMockTranslateService } from '../../mocks/translate.service.mock';
55+
import { TranslateService } from '@ngx-translate/core';
5456

5557
describe('FormBuilderService test suite', () => {
5658

@@ -81,14 +83,16 @@ describe('FormBuilderService test suite', () => {
8183

8284
beforeEach(() => {
8385
configSpy = createConfigSuccessSpy(typeFieldTestValue);
86+
let translateService = getMockTranslateService();
8487
TestBed.configureTestingModule({
8588
imports: [ReactiveFormsModule],
8689
providers: [
8790
{ provide: FormBuilderService, useClass: FormBuilderService },
8891
{ provide: DynamicFormValidationService, useValue: {} },
8992
{ provide: NG_VALIDATORS, useValue: testValidator, multi: true },
9093
{ provide: NG_ASYNC_VALIDATORS, useValue: testAsyncValidator, multi: true },
91-
{ provide: ConfigurationDataService, useValue: configSpy }
94+
{ provide: ConfigurationDataService, useValue: configSpy },
95+
{ provide: TranslateService, useValue: translateService },
9296
]
9397
});
9498

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import {
1919
SUBMISSION_ID
2020
} from './field-parser';
2121
import { DsDynamicInputModel, DsDynamicInputModelConfig } from '../ds-dynamic-form-ui/models/ds-dynamic-input.model';
22+
import { TranslateService } from '@ngx-translate/core';
2223

2324
export class ConcatFieldParser extends FieldParser {
2425

@@ -27,10 +28,11 @@ export class ConcatFieldParser extends FieldParser {
2728
@Inject(CONFIG_DATA) configData: FormFieldModel,
2829
@Inject(INIT_FORM_VALUES) initFormValues,
2930
@Inject(PARSER_OPTIONS) parserOptions: ParserOptions,
31+
translate: TranslateService,
3032
protected separator: string,
3133
protected firstPlaceholder: string = null,
3234
protected secondPlaceholder: string = null) {
33-
super(submissionId, configData, initFormValues, parserOptions);
35+
super(submissionId, configData, initFormValues, parserOptions, translate);
3436

3537
this.separator = separator;
3638
this.firstPlaceholder = firstPlaceholder;

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

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,14 @@ import { DateFieldParser } from './date-field-parser';
33
import { DynamicDsDatePickerModel } from '../ds-dynamic-form-ui/models/date-picker/date-picker.model';
44
import { FormFieldMetadataValueObject } from '../models/form-field-metadata-value.model';
55
import { ParserOptions } from './parser-options';
6+
import { getMockTranslateService } from 'src/app/shared/mocks/translate.service.mock';
7+
8+
69

710
describe('DateFieldParser test suite', () => {
811
let field: FormFieldModel;
912
let initFormValues: any = {};
13+
let translateService = getMockTranslateService();
1014

1115
const submissionId = '1234';
1216
const parserOptions: ParserOptions = {
@@ -37,13 +41,13 @@ describe('DateFieldParser test suite', () => {
3741
});
3842

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

4246
expect(parser instanceof DateFieldParser).toBe(true);
4347
});
4448

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

4852
const fieldModel = parser.parse();
4953

@@ -56,7 +60,7 @@ describe('DateFieldParser test suite', () => {
5660
};
5761
const expectedValue = '1983-11-18';
5862

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

6165
const fieldModel = parser.parse();
6266

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,12 @@ import { FormFieldModel } from '../models/form-field.model';
22
import { ParserOptions } from './parser-options';
33
import { DisabledFieldParser } from './disabled-field-parser';
44
import { DynamicDisabledModel } from '../ds-dynamic-form-ui/models/disabled/dynamic-disabled.model';
5+
import { getMockTranslateService } from 'src/app/shared/mocks/translate.service.mock';
56

67
describe('DisabledFieldParser test suite', () => {
78
let field: FormFieldModel;
89
let initFormValues: any = {};
10+
let translateService = getMockTranslateService();
911

1012
const submissionId = '1234';
1113
const parserOptions: ParserOptions = {
@@ -35,13 +37,13 @@ describe('DisabledFieldParser test suite', () => {
3537
});
3638

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

4042
expect(parser instanceof DisabledFieldParser).toBe(true);
4143
});
4244

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

4648
const fieldModel = parser.parse();
4749

@@ -56,7 +58,7 @@ describe('DisabledFieldParser test suite', () => {
5658
};
5759
const expectedValue = 'test description';
5860

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

6163
const fieldModel = parser.parse();
6264
expect(fieldModel.value.value).toEqual(expectedValue);

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,11 @@ import { FormFieldModel } from '../models/form-field.model';
22
import { DropdownFieldParser } from './dropdown-field-parser';
33
import { DynamicScrollableDropdownModel } from '../ds-dynamic-form-ui/models/scrollable-dropdown/dynamic-scrollable-dropdown.model';
44
import { ParserOptions } from './parser-options';
5+
import { getMockTranslateService } from 'src/app/shared/mocks/translate.service.mock';
56

67
describe('DropdownFieldParser test suite', () => {
78
let field: FormFieldModel;
9+
let translateService = getMockTranslateService();
810

911
const submissionId = '1234';
1012
const initFormValues = {};
@@ -37,13 +39,13 @@ describe('DropdownFieldParser test suite', () => {
3739
});
3840

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

4244
expect(parser instanceof DropdownFieldParser).toBe(true);
4345
});
4446

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

4850
const fieldModel = parser.parse();
4951

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

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

5759
expect(() => parser.parse())
5860
.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
@@ -15,6 +15,7 @@ import {
1515
import { isNotEmpty } from '../../../empty.util';
1616
import { FormFieldMetadataValueObject } from '../models/form-field-metadata-value.model';
1717
import { ParserOptions } from './parser-options';
18+
import { TranslateService } from '@ngx-translate/core';
1819

1920
export class DropdownFieldParser extends FieldParser {
2021

@@ -23,8 +24,9 @@ export class DropdownFieldParser extends FieldParser {
2324
@Inject(CONFIG_DATA) configData: FormFieldModel,
2425
@Inject(INIT_FORM_VALUES) initFormValues,
2526
@Inject(PARSER_OPTIONS) parserOptions: ParserOptions,
27+
translate: TranslateService
2628
) {
27-
super(submissionId, configData, initFormValues, parserOptions);
29+
super(submissionId, configData, initFormValues, parserOptions, translate);
2830
}
2931

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

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

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ import { VocabularyOptions } from '../../../../core/submission/vocabularies/mode
2525
import { ParserType } from './parser-type';
2626
import { isNgbDateStruct } from '../../../date.util';
2727
import { SubmissionScopeType } from '../../../../core/submission/submission-scope-type';
28+
import { TranslateService } from '@ngx-translate/core';
2829

2930
export const SUBMISSION_ID: InjectionToken<string> = new InjectionToken<string>('submissionId');
3031
export const CONFIG_DATA: InjectionToken<FormFieldModel> = new InjectionToken<FormFieldModel>('configData');
@@ -50,7 +51,8 @@ export abstract class FieldParser {
5051
@Inject(SUBMISSION_ID) protected submissionId: string,
5152
@Inject(CONFIG_DATA) protected configData: FormFieldModel,
5253
@Inject(INIT_FORM_VALUES) protected initFormValues: any,
53-
@Inject(PARSER_OPTIONS) protected parserOptions: ParserOptions
54+
@Inject(PARSER_OPTIONS) protected parserOptions: ParserOptions,
55+
protected translate: TranslateService
5456
) {
5557
}
5658

@@ -395,11 +397,14 @@ export abstract class FieldParser {
395397
} else {
396398
regex = new RegExp(this.configData.input.regex);
397399
}
400+
const baseTranslationKey = 'error.validation.pattern';
401+
const fieldranslationKey = `${baseTranslationKey}.${controlModel.id}`;
402+
const fieldTranslationExists = this.translate.instant(fieldranslationKey) !== fieldranslationKey;
398403
controlModel.validators = Object.assign({}, controlModel.validators, { pattern: regex });
399404
controlModel.errorMessages = Object.assign(
400405
{},
401406
controlModel.errorMessages,
402-
{ pattern: 'error.validation.pattern' });
407+
{ pattern: fieldTranslationExists ? fieldranslationKey : baseTranslationKey });
403408
}
404409

405410
protected markAsRequired(controlModel) {

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

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,12 @@ import { ListFieldParser } from './list-field-parser';
44
import { DynamicListCheckboxGroupModel } from '../ds-dynamic-form-ui/models/list/dynamic-list-checkbox-group.model';
55
import { DynamicListRadioGroupModel } from '../ds-dynamic-form-ui/models/list/dynamic-list-radio-group.model';
66
import { ParserOptions } from './parser-options';
7+
import { getMockTranslateService } from 'src/app/shared/mocks/translate.service.mock';
78

89
describe('ListFieldParser test suite', () => {
910
let field: FormFieldModel;
1011
let initFormValues = {};
12+
let translateService = getMockTranslateService();
1113

1214
const submissionId = '1234';
1315
const parserOptions: ParserOptions = {
@@ -39,13 +41,13 @@ describe('ListFieldParser test suite', () => {
3941
});
4042

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

4446
expect(parser instanceof ListFieldParser).toBe(true);
4547
});
4648

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

5052
const fieldModel = parser.parse();
5153

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

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

5961
const fieldModel = parser.parse();
6062

@@ -67,7 +69,7 @@ describe('ListFieldParser test suite', () => {
6769
};
6870
const expectedValue = [new FormFieldMetadataValueObject('test type')];
6971

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

7274
const fieldModel = parser.parse();
7375

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@ import { FormFieldMetadataValueObject } from '../models/form-field-metadata-valu
33
import { LookupFieldParser } from './lookup-field-parser';
44
import { DynamicLookupModel } from '../ds-dynamic-form-ui/models/lookup/dynamic-lookup.model';
55
import { ParserOptions } from './parser-options';
6+
import { getMockTranslateService } from 'src/app/shared/mocks/translate.service.mock';
67

78
describe('LookupFieldParser test suite', () => {
89
let field: FormFieldModel;
910
let initFormValues = {};
11+
let translateService = getMockTranslateService();
1012

1113
const submissionId = '1234';
1214
const parserOptions: ParserOptions = {
@@ -38,13 +40,13 @@ describe('LookupFieldParser test suite', () => {
3840
});
3941

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

4345
expect(parser instanceof LookupFieldParser).toBe(true);
4446
});
4547

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

4951
const fieldModel = parser.parse();
5052

@@ -57,7 +59,7 @@ describe('LookupFieldParser test suite', () => {
5759
};
5860
const expectedValue = new FormFieldMetadataValueObject('test journal');
5961

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

6264
const fieldModel = parser.parse();
6365

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@ import { FormFieldMetadataValueObject } from '../models/form-field-metadata-valu
33
import { LookupNameFieldParser } from './lookup-name-field-parser';
44
import { DynamicLookupNameModel } from '../ds-dynamic-form-ui/models/lookup/dynamic-lookup-name.model';
55
import { ParserOptions } from './parser-options';
6+
import { getMockTranslateService } from 'src/app/shared/mocks/translate.service.mock';
67

78
describe('LookupNameFieldParser test suite', () => {
89
let field: FormFieldModel;
910
let initFormValues = {};
11+
let translateService = getMockTranslateService();
1012

1113
const submissionId = '1234';
1214
const parserOptions: ParserOptions = {
@@ -38,13 +40,13 @@ describe('LookupNameFieldParser test suite', () => {
3840
});
3941

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

4345
expect(parser instanceof LookupNameFieldParser).toBe(true);
4446
});
4547

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

4951
const fieldModel = parser.parse();
5052

@@ -57,7 +59,7 @@ describe('LookupNameFieldParser test suite', () => {
5759
};
5860
const expectedValue = new FormFieldMetadataValueObject('test author');
5961

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

6264
const fieldModel = parser.parse();
6365

0 commit comments

Comments
 (0)