From 1ab337d015a341efebfa9f164ee922d607f236e3 Mon Sep 17 00:00:00 2001 From: jelhan Date: Tue, 21 Jun 2016 01:13:09 +0200 Subject: [PATCH] Fixes: Force names of participants to be unique if anonymous participation is not allowed. --- app/controllers/poll/participation.js | 35 ++++++++++++++++++--------- app/locales/de/translations.js | 3 ++- app/locales/en/translations.js | 3 ++- app/locales/es/translations.js | 3 ++- app/validators/unique.js | 9 +++++-- 5 files changed, 36 insertions(+), 17 deletions(-) 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; }