Skip to content

Commit

Permalink
feat(ValidationMessageProvider): include displayName arg
Browse files Browse the repository at this point in the history
fixes #328

Now the getDisplayName method will be called for all properties, even those that have a display name already configured via the fluent rule API's displayName method.
  • Loading branch information
jdanyow committed Dec 4, 2016
1 parent cd68315 commit 4120e25
Show file tree
Hide file tree
Showing 3 changed files with 33 additions and 5 deletions.
4 changes: 2 additions & 2 deletions src/implementation/standard-validator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -63,8 +63,8 @@ export class StandardValidator extends Validator {
private getMessage(rule: Rule<any, any>, object: any, value: any): string {
const expression: Expression = rule.message || this.messageProvider.getMessage(rule.messageKey);
let { name: propertyName, displayName } = rule.property;
if (displayName === null && propertyName !== null) {
displayName = this.messageProvider.getDisplayName(propertyName);
if (propertyName !== null) {
displayName = this.messageProvider.getDisplayName(propertyName, displayName);
}
const overrideContext: any = {
$displayName: displayName,
Expand Down
10 changes: 7 additions & 3 deletions src/implementation/validation-messages.ts
Original file line number Diff line number Diff line change
Expand Up @@ -46,12 +46,16 @@ export class ValidationMessageProvider {
}

/**
* When a display name is not provided, this method is used to formulate
* a display name using the property name.
* Formulates a property display name using the property name and the configured
* displayName (if provided).
* Override this with your own custom logic.
* @param propertyName The property name.
*/
public getDisplayName(propertyName: string): string {
public getDisplayName(propertyName: string, displayName: string|null|undefined): string {
if (displayName !== null && displayName !== undefined) {
return displayName;
}

// split on upper-case letters.
const words = propertyName.split(/(?=[A-Z])/).join(' ');
// capitalize first letter.
Expand Down
24 changes: 24 additions & 0 deletions test/validation-messages.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import { Container } from 'aurelia-dependency-injection';
import { BindingLanguage } from 'aurelia-templating';
import { TemplatingBindingLanguage } from 'aurelia-templating-binding';
import { ValidationMessageProvider } from '../src/aurelia-validation';

describe('ValidationMessageProvider', () => {
let messageProvider: ValidationMessageProvider;

beforeAll(() => {
const container = new Container();
container.registerInstance(BindingLanguage, container.get(TemplatingBindingLanguage));
messageProvider = container.get(ValidationMessageProvider);
});

it('computes display name', () => {
expect(messageProvider.getDisplayName('foo', null)).toBe('Foo');
expect(messageProvider.getDisplayName('fooBar', null)).toBe('Foo Bar');
expect(messageProvider.getDisplayName('foo bar', null)).toBe('Foo bar');
expect(messageProvider.getDisplayName('foo', undefined)).toBe('Foo');
expect(messageProvider.getDisplayName('fooBar', undefined)).toBe('Foo Bar');
expect(messageProvider.getDisplayName('foo bar', undefined)).toBe('Foo bar');
expect(messageProvider.getDisplayName('foo', 'hello')).toBe('hello');
});
});

0 comments on commit 4120e25

Please sign in to comment.