decidim-friendly_signup 0.4 → 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: df7a2d3137cd72541b5d7e63878f022eebb44e0b115044425e727c4f0fe68d59
4
- data.tar.gz: dd63fddf8a154b335369dcf87cae2aaff1c9b28c9bd58ad1910a97088283b75f
3
+ metadata.gz: 4759703c0e6890c53f828d2db7be0ab349ca526cbe6d064d9d5b809e9429aea7
4
+ data.tar.gz: 6854425281b3d148d6cba8e8ed8d3b91ba3ae462a32b08d4b51540ac995c676f
5
5
  SHA512:
6
- metadata.gz: a03470e2cb20fec61fe7106cd59d96293d9c9e490cd132570aa514a841c43587cbcf675ba25bfd272c5dec497db6c3f6a1922c170effb21f1ddeadeec252f331
7
- data.tar.gz: 36919447d408e1a91f22b8d650b12db69ac00c08282fd5b07862bc074a344e9d99075d53fe53436af12ba80dc209b25e9085d3ca2bc0a219a1f47061d91566be
6
+ metadata.gz: aca757d63345ea7c3e0207809ccbe744dc976d056ff8f2c860b49af82842f7610ec5f4e5b381d1fd3e8355b0c461995c3f4dc054d5adb1f9fae987fd994fb409
7
+ data.tar.gz: 975dae306e8db7c651e597c7c83aa2bc59c5ae7b16109cc2e0969a307aa9bc575e01a17fe35249cfe772b97e01115871539688e6e9059db5bfdbdc5e1bf89c98
data/README.md CHANGED
@@ -90,6 +90,41 @@ Decidim::FriendlySignup.configure do |config|
90
90
  end
91
91
  ```
92
92
 
93
+ ### Customize error messages in instant validation
94
+
95
+ You can customize any message either overriding in your application the files in `config/locales/*.yml` or by using a module like Term Customizer.
96
+
97
+ This plugin uses a cascade-style fallback looking for a series of I18n keys and returns the first available. For instance, for the attribute `email` and the validation key `blank` it will look for these 3 possibilities, returning the first matching one:
98
+
99
+ Specific attribute error:
100
+ ```yaml
101
+ en:
102
+ decidim:
103
+ friendly_signup:
104
+ errors:
105
+ messages:
106
+ email:
107
+ blank: Please enter an email address
108
+ ```
109
+
110
+ Generic error:
111
+ ```yaml
112
+ en:
113
+ decidim:
114
+ friendly_signup:
115
+ errors:
116
+ messages:
117
+ blank: Looks like you haven’t entered anything in this field
118
+ ```
119
+
120
+ Rails' default error:
121
+ ```yaml
122
+ en:
123
+ errors:
124
+ messages:
125
+ blank: can't be blank
126
+ ```
127
+
93
128
  ## Contributing
94
129
 
95
130
  Bug reports and pull requests are welcome on GitHub at https://github.com/OpenSourcePolitics/decidim-module-friendly_signup.
@@ -53,10 +53,15 @@ export default class InstantValidator {
53
53
  }
54
54
 
55
55
  validate($input) {
56
+ let $recheck = $($input.data("instantRecheck"));
56
57
  this.tamper($input);
57
58
  this.post($input).done((response) => {
58
59
  this.setFeedback(response, $input);
59
60
  });
61
+
62
+ if ($recheck.length && this.isTampered($recheck)) {
63
+ this.validate($recheck)
64
+ }
60
65
  }
61
66
 
62
67
  setFeedback(data, $input) {
@@ -76,13 +81,14 @@ export default class InstantValidator {
76
81
  }
77
82
 
78
83
  addErrors($dest, msg) {
84
+ console.log("$dest", $dest, "%form", this.$form)
79
85
  if ($dest.closest("label").find(".form-error").length > 1) {
80
86
  // Decidim may add and additional error class that does not play well with abide
81
87
  $dest.closest("label").find(".form-error:last").remove();
82
88
  }
83
89
  this.$form.foundation("addErrorClasses", $dest);
84
90
  if (msg) {
85
- $dest.closest("label").find(".form-error").text(msg);
91
+ $dest.closest("label").find(".form-error").html(msg);
86
92
  }
87
93
  }
88
94
 
@@ -10,7 +10,7 @@
10
10
 
11
11
  <div class="row">
12
12
  <div class="columns large-6 medium-10 medium-centered">
13
- <%= decidim_form_for resource, namespace: "invitation", as: resource_name, url: invitation_path(resource_name, invite_redirect: params[:invite_redirect]), html: { method: :put, class: "register-form new_user" } do |f| %>
13
+ <%= decidim_form_for(resource, namespace: "invitation", as: resource_name, url: invitation_path(resource_name, invite_redirect: params[:invite_redirect]), html: { method: :put, class: "register-form new_user#{friendly_override_activated?(:use_instant_validation) ? ' instant-validation' : ''}" } , data: { "validation-url" => decidim_friendly_signup.validate_path }) do |f| %>
14
14
  <div class="card">
15
15
  <div class="card__content">
16
16
  <legend><%= t("sign_up_as.legend", scope: "decidim.devise.registrations.new") %></legend>
@@ -19,14 +19,16 @@
19
19
 
20
20
  <%= f.hidden_field :invitation_token %>
21
21
 
22
- <div class="user-nickname">
23
- <div class="field">
24
- <%= f.text_field :nickname, help_text: t("devise.invitations.edit.nickname_help", organization: current_organization.name), required: "required", prefix: { value: "@", small: 1, large: 1 } %>
22
+ <% unless friendly_override_activated?(:hide_nickname) %>
23
+ <div class="user-nickname">
24
+ <div class="field">
25
+ <%= f.text_field :nickname, help_text: t("devise.invitations.edit.nickname_help", organization: current_organization.name), required: "required", prefix: { value: "@", small: 1, large: 1 }, data: { "instant-attribute" => "nickname", "instant-recheck" => "password" } %>
26
+ </div>
25
27
  </div>
26
- </div>
28
+ <% end %>
27
29
 
28
30
  <% if f.object.class.require_password_on_accepting %>
29
- <%= render("decidim/friendly_signup/shared/password_fields", form: f, options: { required: "required", minlength: ::PasswordValidator::MINIMUM_LENGTH, maxlength: ::PasswordValidator::MAX_LENGTH }) %>
31
+ <%= render("decidim/friendly_signup/shared/password_fields", form: f, options: { required: true, autocomplete: "off", help_text: t("devise.passwords.edit.password_help", minimun_characters: ::PasswordValidator::MINIMUM_LENGTH), minlength: ::PasswordValidator::MINIMUM_LENGTH, maxlength: ::PasswordValidator::MAX_LENGTH, data: { "instant-attribute" => "password" } }) %>
30
32
  <% end %>
31
33
  </div>
32
34
  </div>
@@ -10,12 +10,12 @@
10
10
  <div class="columns medium-7 large-5 medium-centered">
11
11
  <div class="card">
12
12
  <div class="card__content">
13
- <%= decidim_form_for(resource, namespace: "password", as: resource_name, url: password_path(resource_name), html: { method: :put, class: "register-form new_user" }) do |f| %>
13
+ <%= decidim_form_for(resource, namespace: "password", as: resource_name, url: password_path(resource_name), html: { method: :put, class: "register-form new_user#{friendly_override_activated?(:use_instant_validation) ? ' instant-validation' : ''}" } , data: { "validation-url" => decidim_friendly_signup.validate_path }) do |f| %>
14
14
  <%= form_required_explanation %>
15
15
 
16
16
  <%= f.hidden_field :reset_password_token %>
17
17
 
18
- <%= render("decidim/friendly_signup/shared/password_fields", form: f, options: { autocomplete: "off", help_text: t("devise.passwords.edit.password_help", minimun_characters: ::PasswordValidator::MINIMUM_LENGTH) }) %>
18
+ <%= render("decidim/friendly_signup/shared/password_fields", form: f, options: { required: true, autocomplete: "off", help_text: t("devise.passwords.edit.password_help", minimun_characters: ::PasswordValidator::MINIMUM_LENGTH), minlength: ::PasswordValidator::MINIMUM_LENGTH, maxlength: ::PasswordValidator::MAX_LENGTH, data: { "instant-attribute" => "password" } }) %>
19
19
 
20
20
  <div class="actions">
21
21
  <%= f.submit t("devise.passwords.edit.change_my_password"), class: "button expanded" %>
@@ -26,7 +26,7 @@
26
26
  <div class="row">
27
27
  <div class="columns large-6 medium-10 medium-centered">
28
28
 
29
- <%= decidim_form_for(@form, namespace: "registration", as: resource_name, url: registration_path(resource_name), html: { class: "register-form new_user#{friendly_override_activated?(:use_instant_validation) && ' instant-validation'}", id: "register-form" }, data: { "validation-url": decidim_friendly_signup.validate_path }) do |f| %>
29
+ <%= decidim_form_for(@form, namespace: "registration", as: resource_name, url: registration_path(resource_name), html: { class: "register-form new_user#{friendly_override_activated?(:use_instant_validation) ? ' instant-validation' : ''}", id: "register-form" }, data: { "validation-url" => decidim_friendly_signup.validate_path }) do |f| %>
30
30
  <%= invisible_captcha %>
31
31
  <div class="card">
32
32
  <div class="card__content">
@@ -34,23 +34,23 @@
34
34
 
35
35
  <div class="user-person">
36
36
  <div class="field">
37
- <%= f.text_field :name, help_text: t(".username_help"), autocomplete: "off", data: { "instant-attribute": "nickname" } %>
37
+ <%= f.text_field :name, help_text: t(".username_help"), autocomplete: "off", data: { "instant-attribute" => "name", "instant-recheck" => "#registration_user_password" } %>
38
38
  </div>
39
39
  </div>
40
40
 
41
41
  <% unless friendly_override_activated?(:hide_nickname) %>
42
42
  <div class="user-nickname">
43
43
  <div class="field">
44
- <%= f.text_field :nickname, help_text: t(".nickname_help", organization: current_organization.name), prefix: { value: "@", small: 1, large: 1 }, autocomplete: "off", data: { "instant-attribute": "nickname" } %>
44
+ <%= f.text_field :nickname, help_text: t(".nickname_help", organization: current_organization.name), prefix: { value: "@", small: 1, large: 1 }, autocomplete: "off", data: { "instant-attribute" => "nickname", "instant-recheck" => "#registration_user_password" } %>
45
45
  </div>
46
46
  </div>
47
47
  <% end %>
48
48
 
49
49
  <div class="field">
50
- <%= f.email_field :email, autocomplete: "email", data: { "instant-attribute": "email" } %>
50
+ <%= f.email_field :email, autocomplete: "email", data: { "instant-attribute" => "email", "instant-recheck" => "#registration_user_password" } %>
51
51
  </div>
52
52
 
53
- <%= render("decidim/friendly_signup/shared/password_fields", form: f, options: { required: true, help_text: t(".password_help", minimun_characters: ::PasswordValidator::MINIMUM_LENGTH), autocomplete: "off", data: { "instant-attribute": "password" } }) %>
53
+ <%= render("decidim/friendly_signup/shared/password_fields", form: f, options: { required: true, help_text: t(".password_help", minimun_characters: ::PasswordValidator::MINIMUM_LENGTH), autocomplete: "off", data: { "instant-attribute" => "password" } }) %>
54
54
  </div>
55
55
  </div>
56
56
 
@@ -0,0 +1,58 @@
1
+ <% add_decidim_page_title(t("devise.sessions.new.sign_in")) %>
2
+
3
+ <div class="wrapper">
4
+ <div class="row collapse">
5
+ <div class="row collapse">
6
+ <div class="columns large-8 large-centered text-center page-title">
7
+ <h1><%= t("devise.sessions.new.sign_in") %></h1>
8
+ <% if current_organization.sign_up_enabled? %>
9
+ <p>
10
+ <%= t(".are_you_new?") %>
11
+ <%= link_to t(".register"), new_user_registration_path %>
12
+ </p>
13
+ <% elsif current_organization.sign_in_enabled? %>
14
+ <p>
15
+ <%= t(".sign_up_disabled") %>
16
+ </p>
17
+ <% else %>
18
+ <p>
19
+ <%= t(".sign_in_disabled") %>
20
+ </p>
21
+ <% end %>
22
+ </div>
23
+ </div>
24
+ <% cache current_organization do %>
25
+ <%= render "decidim/devise/shared/omniauth_buttons" %>
26
+ <% end %>
27
+
28
+ <% if current_organization.sign_in_enabled? %>
29
+ <div class="row">
30
+ <div class="columns large-6 medium-centered">
31
+ <div class="card">
32
+ <div class="card__content">
33
+ <%= decidim_form_for(resource, namespace: "session", as: resource_name, url: session_path(resource_name), html: { class: "register-form new_user" }) do |f| %>
34
+ <div>
35
+ <div class="field">
36
+ <%= f.email_field :email %>
37
+ </div>
38
+ <div class="field">
39
+ <%= render("decidim/friendly_signup/shared/password_fields", form: f, options: { autocomplete: "off" }) %>
40
+ </div>
41
+ </div>
42
+ <% if devise_mapping.rememberable? %>
43
+ <div class="field">
44
+ <%= f.check_box :remember_me %>
45
+ </div>
46
+ <% end %>
47
+ <div class="actions">
48
+ <%= f.submit t("devise.sessions.new.sign_in"), class: "button expanded" %>
49
+ </div>
50
+ <% end %>
51
+ <%= render "decidim/devise/shared/links" %>
52
+ </div>
53
+ </div>
54
+ </div>
55
+ </div>
56
+ <% end %>
57
+ </div>
58
+ </div>
@@ -28,7 +28,7 @@
28
28
  <% end %>
29
29
 
30
30
  <p class="text-center">
31
- <%= link_to t(".code_not_received"), decidim.user_confirmation_path(confirmation_token: confirmation_form.confirmation_token, "user[email]": user.email), method: :post, data: { confirm: t(".confirm_send_code", email: user.email) } %>
31
+ <%= link_to t(".code_not_received"), decidim.user_confirmation_path(confirmation_token: confirmation_form.confirmation_token, "user[email]" => user.email), method: :post, data: { confirm: t(".confirm_send_code", email: user.email) } %>
32
32
  </p>
33
33
  </div>
34
34
  </div>
@@ -4,10 +4,10 @@
4
4
 
5
5
  <h3 class="email-instruction text-center" style="margin:1em 0 0.2em 0;"><%= t(".copy") %></h3>
6
6
 
7
+ <p class="stat text-center" style="margin:1em 0 0.5em 0;"><b style="font-size: 2em"><%= @code %></b></p>
8
+
7
9
  <% if @expires_at %>
8
- <p class="email-small text-center"><%= t(".expires_in", time: distance_of_time_in_words(Time.now, @expires_at, scope: "decidim.friendly_signup.datetime.distance_in_words")) %></p>
10
+ <p class="email-small text-center" style="margin-bottom: 2em;"><%= t(".expires_in", time: distance_of_time_in_words(Time.now, @expires_at, scope: "decidim.friendly_signup.datetime.distance_in_words")) %></p>
9
11
  <% end %>
10
12
 
11
- <p class="stat text-center" style="margin:1em 0;"><b style="font-size: 2em"><%= @code %></b></p>
12
-
13
13
  <p class="email-small email-closing text-center"><%= t(".ignore").html_safe %></p>
@@ -74,6 +74,26 @@ en:
74
74
  x_seconds:
75
75
  one: 1 second
76
76
  other: "%{count} seconds"
77
+ errors:
78
+ messages:
79
+ blank: Looks like you haven’t entered anything in this field
80
+ email:
81
+ blank: Please enter an email address
82
+ invalid: The email address looks incomplete
83
+ taken: This email is already in use for another account. Try signing in
84
+ or use another email
85
+ password:
86
+ email_included_in_password: The password you have entered is too similar
87
+ to your email
88
+ name_included_in_password: The password you have entered is too similar
89
+ to your name
90
+ nickname_included_in_password: The password you have entered is too similar
91
+ to your nickname
92
+ not_enough_unique_characters: The password you have entered does not have
93
+ enough different characters
94
+ password_too_common: The password you have entered is very common - we
95
+ suggest using a different password
96
+ password_too_short: The password you have entered is too short
77
97
  shared:
78
98
  password_fields:
79
99
  hidden_password: Your password is hidden
@@ -15,17 +15,19 @@ module Decidim
15
15
  resources :confirmation_codes, only: [:index, :create]
16
16
  end
17
17
  post :validate, to: "validator#validate"
18
+ put :validate, to: "validator#validate"
18
19
  end
19
20
 
20
21
  # Prepare a zone to create overrides
21
22
  # https://edgeguides.rubyonrails.org/engines.html#overriding-models-and-controllers
22
23
  # overrides
23
24
  config.after_initialize do
25
+ Decidim::Devise::SessionsController.include(Decidim::FriendlySignup::NeedsHeaderSnippets)
24
26
  Decidim::Devise::RegistrationsController.include(Decidim::FriendlySignup::NeedsHeaderSnippets)
27
+ Decidim::Devise::PasswordsController.include(Decidim::FriendlySignup::NeedsHeaderSnippets)
28
+ Decidim::Devise::InvitationsController.include(Decidim::FriendlySignup::NeedsHeaderSnippets)
25
29
  Decidim::Devise::RegistrationsController.include(Decidim::FriendlySignup::RegistrationsRedirect)
26
30
  Decidim::Devise::ConfirmationsController.include(Decidim::FriendlySignup::RegistrationsRedirect)
27
- Decidim::Devise::InvitationsController.include(Decidim::FriendlySignup::NeedsHeaderSnippets)
28
- Decidim::Devise::PasswordsController.include(Decidim::FriendlySignup::NeedsHeaderSnippets)
29
31
  Decidim::AccountController.include(Decidim::FriendlySignup::NeedsHeaderSnippets)
30
32
  Decidim::RegistrationForm.include(Decidim::FriendlySignup::AutoNickname)
31
33
  Decidim::User.include(Decidim::FriendlySignup::NeedsRegistrationCodes)
@@ -28,11 +28,44 @@ module Decidim
28
28
  end
29
29
 
30
30
  def error
31
- errors.flatten.map(&:upcase_first).join(". ") unless valid?
31
+ return if valid?
32
+
33
+ errors.map do |msg|
34
+ key = find_key(msg)
35
+ next if key == :nickname_included_in_password && FriendlySignup.hide_nickname.present?
36
+
37
+ custom_error(key).presence || msg.upcase_first
38
+ end.join(".<br>")
32
39
  end
33
40
 
34
41
  private
35
42
 
43
+ def custom_error(key)
44
+ return if key.blank?
45
+
46
+ generic = I18n.t(key, scope: "decidim.friendly_signup.errors.messages", default: "")
47
+ I18n.t("#{attribute}.#{key}", scope: "decidim.friendly_signup.errors.messages", default: generic)
48
+ end
49
+
50
+ def find_key(msg)
51
+ case attribute
52
+ when "password"
53
+ [:blacklisted,
54
+ :domain_included_in_password,
55
+ :email_included_in_password,
56
+ :fallback,
57
+ :name_included_in_password,
58
+ :nickname_included_in_password,
59
+ :not_enough_unique_characters,
60
+ :password_not_allowed,
61
+ :password_too_common,
62
+ :password_too_long,
63
+ :password_too_short].find { |key| msg == I18n.t(key, scope: "password_validator") }
64
+ else
65
+ [:blank, :invalid, :taken].find { |key| msg == I18n.t(key, scope: "errors.messages") }
66
+ end
67
+ end
68
+
36
69
  def valid_attribute?
37
70
  %w(nickname email name password).include? attribute.to_s
38
71
  end
@@ -40,10 +73,6 @@ module Decidim
40
73
  def valid_suggestor?
41
74
  ["nickname"].include? attribute.to_s
42
75
  end
43
-
44
- def valid_users
45
- Decidim::UserBaseEntity.where(invitation_token: nil, organization: current_organization)
46
- end
47
76
  end
48
77
  end
49
78
  end
@@ -5,6 +5,6 @@ module Decidim
5
5
  module FriendlySignup
6
6
  DECIDIM_VERSION = "0.26.2"
7
7
  COMPAT_DECIDIM_VERSION = "~> 0.26.0"
8
- VERSION = "0.4"
8
+ VERSION = "0.4.1"
9
9
  end
10
10
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: decidim-friendly_signup
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.4'
4
+ version: 0.4.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ivan Vergés
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-07-22 00:00:00.000000000 Z
11
+ date: 2022-07-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: decidim-core
@@ -71,6 +71,7 @@ files:
71
71
  - app/views/decidim/devise/invitations/edit.html.erb
72
72
  - app/views/decidim/devise/passwords/edit.html.erb
73
73
  - app/views/decidim/devise/registrations/new.html.erb
74
+ - app/views/decidim/devise/sessions/new.html.erb
74
75
  - app/views/decidim/friendly_signup/confirmation_codes/index.html.erb
75
76
  - app/views/decidim/friendly_signup/confirmation_codes_mailer/confirmation_instructions.html.erb
76
77
  - app/views/decidim/friendly_signup/shared/_password_fields.html.erb