diff --git a/app/controllers/poll/participation.js b/app/controllers/poll/participation.js index b90b845..c39f5fb 100644 --- a/app/controllers/poll/participation.js +++ b/app/controllers/poll/participation.js @@ -12,18 +12,29 @@ const validCollection = function(collection) { }); }; const Validations = buildValidations({ - name: validator('presence', { - presence() { - // only force presence if anonymousUser poll setting is false - if (!this.get('model.anonymousUser')) { - return true; - } else { - // disable presence validation - return null; - } - }, - dependentKeys: ['anonymousUser', 'i18n.locale'] - }), + name: [ + validator('presence', { + presence() { + // only force presence if anonymousUser poll setting is false + if (!this.get('model.anonymousUser')) { + return true; + } else { + // disable presence validation + return null; + } + }, + dependentKeys: ['anonymousUser', 'i18n.locale'] + }), + validator('unique', { + parent: 'pollController.model', + attributeInParent: 'users', + dependentKeys: ['poll.users.[]', 'poll.users.@each.name', 'i18n.locale'], + disable() { + return this.get('model.anonymousUser'); + }, + messageKey: 'unique.name' + }) + ], selections: [ validator('collection', true), diff --git a/app/locales/de/translations.js b/app/locales/de/translations.js index 745d17f..a03fa61 100644 --- a/app/locales/de/translations.js +++ b/app/locales/de/translations.js @@ -125,6 +125,7 @@ export default { phone: '{{description}} muss eine gültige Telefonnummer sein', url: '{{description}} muss eine gültige URL sein', time: '{{value}} muss eine gültige Zeit sein', - unique: '{{description}} muss eindeutig sein' + unique: '{{description}} muss eindeutig sein', + 'unique.name': 'Dieser Namen wurde bereits genutzt' } }; diff --git a/app/locales/en/translations.js b/app/locales/en/translations.js index 64a0a8e..9c6ab05 100644 --- a/app/locales/en/translations.js +++ b/app/locales/en/translations.js @@ -125,6 +125,7 @@ export default { phone: '{{description}} must be a valid phone mumber', url: '{{description}} must be a valid URL ', time: '{{value}} must be a valid number', - unique: '{{description}} must be explicit' + unique: '{{description}} must be explicit', + 'unique.name': 'This name has already been used' } }; diff --git a/app/locales/es/translations.js b/app/locales/es/translations.js index 8fd7d2d..f724c7b 100644 --- a/app/locales/es/translations.js +++ b/app/locales/es/translations.js @@ -125,6 +125,7 @@ export default { phone: '{{description}} must be a valid phone number', url: '{{description}} must be a valid url', time: '{{value}} must be a valid time', - unique: '{{description}} must be unique' + unique: '{{description}} must be unique', + 'unique.name': 'This name has already been used' } }; diff --git a/app/validators/unique.js b/app/validators/unique.js index c80e473..9360bde 100644 --- a/app/validators/unique.js +++ b/app/validators/unique.js @@ -16,20 +16,25 @@ export default BaseValidator.extend({ Ember.isArray(options.dependentKeys) && options.dependentKeys.length > 0 ); + if (options.disable) { + return true; + } + // ignore empty values if (Ember.isEmpty(value)) { return true; } + const messageKey = options.messageKey || 'unique'; const parent = model.get(options.parent); const collection = parent.get(options.attributeInParent); const positionInCollection = collection.indexOf(model); - const elementsBefore = collection.slice(0, positionInCollection); + const elementsBefore = positionInCollection !== -1 ? collection.slice(0, positionInCollection) : collection; const matches = elementsBefore.findBy(attribute, value); if (matches) { // ToDo: translateable error message - return this.createErrorMessage('unique'); + return this.createErrorMessage(messageKey); } else { return true; }