bullet_train 1.0.5 → 1.0.9
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/controllers/account/two_factors_controller.rb +18 -0
- data/app/controllers/concerns/account/controllers/base.rb +118 -0
- data/app/controllers/concerns/account/users/controller_base.rb +1 -1
- data/app/controllers/concerns/controllers/base.rb +119 -0
- data/app/controllers/concerns/devise_current_attributes.rb +13 -0
- data/app/controllers/concerns/registrations/controller_base.rb +39 -0
- data/app/controllers/concerns/sessions/controller_base.rb +15 -0
- data/app/controllers/registrations_controller.rb +9 -0
- data/app/controllers/sessions_controller.rb +3 -0
- data/app/helpers/account/buttons_helper.rb +12 -0
- data/app/helpers/account/dates_helper.rb +38 -0
- data/app/helpers/account/forms_helper.rb +67 -0
- data/app/helpers/account/locale_helper.rb +51 -0
- data/app/helpers/account/markdown_helper.rb +5 -0
- data/app/helpers/account/role_helper.rb +5 -0
- data/app/helpers/attributes_helper.rb +32 -0
- data/app/helpers/email_helper.rb +7 -0
- data/app/helpers/images_helper.rb +7 -0
- data/app/mailers/concerns/mailers/base.rb +16 -0
- data/app/mailers/devise_mailer.rb +10 -0
- data/app/mailers/user_mailer.rb +24 -0
- data/app/models/concerns/records/base.rb +60 -0
- data/app/views/account/two_factors/create.js.erb +1 -0
- data/app/views/account/two_factors/destroy.js.erb +1 -0
- data/app/views/devise/confirmations/new.html.erb +16 -0
- data/app/views/devise/mailer/confirmation_instructions.html.erb +5 -0
- data/app/views/devise/mailer/password_change.html.erb +3 -0
- data/app/views/devise/mailer/reset_password_instructions.html.erb +30 -0
- data/app/views/devise/mailer/unlock_instructions.html.erb +7 -0
- data/app/views/devise/passwords/edit.html.erb +17 -0
- data/app/views/devise/passwords/new.html.erb +20 -0
- data/app/views/devise/registrations/_two_factor.html.erb +42 -0
- data/app/views/devise/registrations/edit.html.erb +43 -0
- data/app/views/devise/registrations/new.html.erb +30 -0
- data/app/views/devise/sessions/new.html.erb +59 -0
- data/app/views/devise/sessions/pre_otp.js.erb +11 -0
- data/app/views/devise/shared/_links.html.erb +21 -0
- data/app/views/devise/shared/_oauth.html.erb +9 -0
- data/app/views/devise/unlocks/new.html.erb +16 -0
- data/app/views/layouts/account.html.erb +1 -0
- data/app/views/layouts/devise.html.erb +1 -0
- data/config/locales/en/devise.en.yml +110 -0
- data/lib/bullet_train/version.rb +1 -1
- metadata +43 -2
@@ -0,0 +1,60 @@
|
|
1
|
+
module Records::Base
|
2
|
+
extend ActiveSupport::Concern
|
3
|
+
|
4
|
+
included do
|
5
|
+
if defined?(Webhooks::Outgoing::IssuingModel)
|
6
|
+
include Webhooks::Outgoing::IssuingModel
|
7
|
+
end
|
8
|
+
|
9
|
+
if defined?(ObfuscatesId)
|
10
|
+
include ObfuscatesId
|
11
|
+
end
|
12
|
+
|
13
|
+
if defined?(QuestionMethodsFromScopes)
|
14
|
+
include QuestionMethodsFromScopes
|
15
|
+
end
|
16
|
+
|
17
|
+
include CableReady::Updatable
|
18
|
+
enable_updates
|
19
|
+
|
20
|
+
extend ActiveHash::Associations::ActiveRecordExtensions
|
21
|
+
|
22
|
+
# 🏚 i'd like to deprecate these. they're not descriptive enough.
|
23
|
+
scope :newest, -> { order("created_at DESC") }
|
24
|
+
scope :oldest, -> { order("created_at ASC") }
|
25
|
+
|
26
|
+
scope :newest_created, -> { order("created_at DESC") }
|
27
|
+
scope :oldest_created, -> { order("created_at ASC") }
|
28
|
+
scope :newest_updated, -> { order("updated_at DESC") }
|
29
|
+
scope :oldest_updated, -> { order("updated_at ASC") }
|
30
|
+
|
31
|
+
# Microscope adds useful scopes targeting ActiveRecord `boolean`, `date` and `datetime` attributes.
|
32
|
+
# https://github.com/mirego/microscope
|
33
|
+
acts_as_microscope
|
34
|
+
end
|
35
|
+
|
36
|
+
class_methods do
|
37
|
+
# by default we represent methods by their first string attribute.
|
38
|
+
def label_attribute
|
39
|
+
columns_hash.values.find { |column| column.sql_type_metadata.type == :string }&.name
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
# this is a template method you can override in activerecord models if we shouldn't just use their first string to
|
44
|
+
# identify them.
|
45
|
+
def label_string
|
46
|
+
if (label_attribute = self.class.label_attribute)
|
47
|
+
send("#{label_attribute}_was")
|
48
|
+
else
|
49
|
+
self.class.name.underscore.split("/").last.titleize
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def parent_collection
|
54
|
+
# TODO Try to suggest what the entire method definition should actually be
|
55
|
+
# using parent_key below to do so.
|
56
|
+
model_name = self.class
|
57
|
+
# parent_key = model_name.reflect_on_all_associations(:belongs_to).first.name
|
58
|
+
raise "You're trying to use a feature that requires #{model_name} to have a `collection` method defined that returns the Active Record association that this model belongs to within its parent object."
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
$("#two-factor").html("<%= j render partial: "devise/registrations/two_factor"%>");
|
@@ -0,0 +1 @@
|
|
1
|
+
$("#two-factor").html("<%= j render partial: "devise/registrations/two_factor"%>");
|
@@ -0,0 +1,16 @@
|
|
1
|
+
<h2><%= t('device.headers.resend_confirm') %></h2>
|
2
|
+
|
3
|
+
<%= form_for(resource, as: resource_name, url: confirmation_path(resource_name), html: { method: :post }) do |f| %>
|
4
|
+
<%= devise_error_messages! %>
|
5
|
+
|
6
|
+
<div class="field">
|
7
|
+
<%= f.label :email %><br />
|
8
|
+
<%= f.email_field :email, autofocus: true, value: (resource.pending_reconfirmation? ? resource.unconfirmed_email : resource.email) %>
|
9
|
+
</div>
|
10
|
+
|
11
|
+
<div class="actions">
|
12
|
+
<%= f.submit t('devise.buttons.resend_confirm') %>
|
13
|
+
</div>
|
14
|
+
<% end %>
|
15
|
+
|
16
|
+
<%= render "devise/shared/links" %>
|
@@ -0,0 +1,30 @@
|
|
1
|
+
<p><%= t('.hello', email: @resource.first_name || @resource.email) %></p>
|
2
|
+
|
3
|
+
<p><%= t('.requested_change') %></p>
|
4
|
+
|
5
|
+
<!-- Action -->
|
6
|
+
<table class="body-action" align="center" width="100%" cellpadding="0" cellspacing="0">
|
7
|
+
<tr>
|
8
|
+
<td align="center">
|
9
|
+
<!-- Border based button https://litmus.com/blog/a-guide-to-bulletproof-buttons-in-email-design -->
|
10
|
+
<table width="100%" border="0" cellspacing="0" cellpadding="0">
|
11
|
+
<tr>
|
12
|
+
<td align="center">
|
13
|
+
<table border="0" cellspacing="0" cellpadding="0">
|
14
|
+
<tr>
|
15
|
+
<td>
|
16
|
+
<%= link_to t('.change_password'), edit_password_url(@resource, reset_password_token: @token), class: 'button button--', target: '_blank' %>
|
17
|
+
</td>
|
18
|
+
</tr>
|
19
|
+
</table>
|
20
|
+
</td>
|
21
|
+
</tr>
|
22
|
+
</table>
|
23
|
+
</td>
|
24
|
+
</tr>
|
25
|
+
</table>
|
26
|
+
|
27
|
+
<p><%= t('.ignore') %></p>
|
28
|
+
<p><%= t('.access_change') %></p>
|
29
|
+
|
30
|
+
<%= t('user_mailer.signature.html', support_email: t('application.support_email')) %>
|
@@ -0,0 +1,17 @@
|
|
1
|
+
<% @title = t('devise.headers.change_password') %>
|
2
|
+
<%= render 'account/shared/workflow/box' do |p| %>
|
3
|
+
<% p.content_for :title, @title %>
|
4
|
+
<% p.content_for :body do %>
|
5
|
+
<% within_fields_namespace(:update_self) do %>
|
6
|
+
<%= form_for(resource, as: resource_name, url: password_path(resource_name), class: 'form', html: { method: :put }) do |f| %>
|
7
|
+
<%= f.hidden_field :reset_password_token %>
|
8
|
+
<%= render 'account/shared/forms/errors', form: f, attributes: [:reset_password_token] %>
|
9
|
+
<%= render 'shared/fields/password_field', form: f, method: :password, options: {autofocus: true, autocomplete: "off"} %>
|
10
|
+
<%= render 'shared/fields/password_field', form: f, method: :password_confirmation, options: {autocomplete: "off"} %>
|
11
|
+
<div class="buttons">
|
12
|
+
<%= f.submit t('devise.buttons.change_password'), class: "button" %>
|
13
|
+
</div>
|
14
|
+
<% end %>
|
15
|
+
<% end %>
|
16
|
+
<% end %>
|
17
|
+
<% end %>
|
@@ -0,0 +1,20 @@
|
|
1
|
+
<%= render 'account/shared/workflow/box' do |p| %>
|
2
|
+
<% p.content_for :title, t('devise.titles.reset_password') %>
|
3
|
+
<% p.content_for :body do %>
|
4
|
+
<% within_fields_namespace(:sign_up) do %>
|
5
|
+
<%= form_for resource, as: resource_name, url: password_path(resource_name), html: {method: :post, class: 'form'} do |f| %>
|
6
|
+
<%= render 'account/shared/forms/errors', form: f %>
|
7
|
+
|
8
|
+
<%= render 'shared/fields/email_field', form: f, method: :email, options: {autofocus: true} do %>
|
9
|
+
<% if show_sign_up_options? %>
|
10
|
+
<% content_for :help do %>
|
11
|
+
<%= link_to t('devise.links.account'), new_user_registration_path %>
|
12
|
+
<% end %>
|
13
|
+
<% end %>
|
14
|
+
<% end %>
|
15
|
+
|
16
|
+
<%= f.submit t('devise.buttons.reset_password'), class: 'button full' %>
|
17
|
+
<% end %>
|
18
|
+
<% end %>
|
19
|
+
<% end %>
|
20
|
+
<% end %>
|
@@ -0,0 +1,42 @@
|
|
1
|
+
<%= render 'account/shared/box', divider: @backup_codes do |p| %>
|
2
|
+
<% p.content_for :title, t("users.edit.two_factor.header") %>
|
3
|
+
<% p.content_for :description, t("users.edit.two_factor.description_#{@user.otp_required_for_login? ? 'enabled' : 'disabled'}") %>
|
4
|
+
<% p.content_for :body do %>
|
5
|
+
<% if current_user.otp_required_for_login? %>
|
6
|
+
<% if @backup_codes %>
|
7
|
+
|
8
|
+
<%= render 'account/shared/alert' do %>
|
9
|
+
<%= t('users.edit.two_factor.warning').html_safe %>
|
10
|
+
<% end %>
|
11
|
+
|
12
|
+
<p><%= t('users.edit.two_factor.instructions').html_safe %></p>
|
13
|
+
|
14
|
+
<center class="py-4">
|
15
|
+
<%= current_user.otp_qr_code.as_svg(
|
16
|
+
offset: 0,
|
17
|
+
color: '000',
|
18
|
+
shape_rendering: 'crispEdges',
|
19
|
+
module_size: 4,
|
20
|
+
standalone: true
|
21
|
+
).html_safe %>
|
22
|
+
</center>
|
23
|
+
|
24
|
+
<p><%= t('users.edit.two_factor.recovery_codes').html_safe %></p>
|
25
|
+
|
26
|
+
<center>
|
27
|
+
<% @backup_codes.each do |code| %>
|
28
|
+
<p><code><%= code %></code></p>
|
29
|
+
<% end %>
|
30
|
+
</center>
|
31
|
+
|
32
|
+
<% end %>
|
33
|
+
<% end %>
|
34
|
+
<% end %>
|
35
|
+
<% p.content_for :actions do %>
|
36
|
+
<% if current_user.otp_required_for_login? %>
|
37
|
+
<%= link_to t('users.edit.two_factor.buttons.disable'), account_two_factor_path, method: :delete, remote: true, class: "button" %>
|
38
|
+
<% else %>
|
39
|
+
<%= link_to t('users.edit.two_factor.buttons.enable'), account_two_factor_path, method: :post, remote: true, class: "button" %>
|
40
|
+
<% end %>
|
41
|
+
<% end %>
|
42
|
+
<% end %>
|
@@ -0,0 +1,43 @@
|
|
1
|
+
<h2><%= t('devise.headers.edit_registration', resource_name: resource_name.to_s.humanize) %></h2>
|
2
|
+
|
3
|
+
<%= form_for(resource, as: resource_name, url: registration_path(resource_name), html: { method: :put }) do |f| %>
|
4
|
+
<%= devise_error_messages! %>
|
5
|
+
|
6
|
+
<div class="field">
|
7
|
+
<%= f.label :email %><br />
|
8
|
+
<%= f.email_field :email, autofocus: true %>
|
9
|
+
</div>
|
10
|
+
|
11
|
+
<% if devise_mapping.confirmable? && resource.pending_reconfirmation? %>
|
12
|
+
<div><%= t('devise.labels.wait_confirm', unconfirmed_email: resource.unconfirmed_email) %></div>
|
13
|
+
<% end %>
|
14
|
+
|
15
|
+
<div class="field">
|
16
|
+
<%= f.label :password %> <i><%= t('devise.hints.leave_blank') %></i><br />
|
17
|
+
<%= f.password_field :password, autocomplete: "off" %>
|
18
|
+
<% if @minimum_password_length %>
|
19
|
+
<br />
|
20
|
+
<em><%= t('devise.hints.password_length', length: @minimum_password_length) %></em>
|
21
|
+
<% end %>
|
22
|
+
</div>
|
23
|
+
|
24
|
+
<div class="field">
|
25
|
+
<%= f.label :password_confirmation %><br />
|
26
|
+
<%= f.password_field :password_confirmation, autocomplete: "off" %>
|
27
|
+
</div>
|
28
|
+
|
29
|
+
<div class="field">
|
30
|
+
<%= f.label :current_password %> <i><%= t('devise.hints.need_password') %></i><br />
|
31
|
+
<%= f.password_field :current_password, autocomplete: "off" %>
|
32
|
+
</div>
|
33
|
+
|
34
|
+
<div class="actions">
|
35
|
+
<%= f.submit t('global.buttons.update') %>
|
36
|
+
</div>
|
37
|
+
<% end %>
|
38
|
+
|
39
|
+
<h3><%= t('devise.headers.cancel_account') %></h3>
|
40
|
+
|
41
|
+
<p>Unhappy? <%= button_to t('devise.buttons.cancel_account'), registration_path(resource_name), data: { confirm: t('global.confirm_message') }, method: :delete %></p>
|
42
|
+
|
43
|
+
<%= link_to t('global.buttons.back'), :back %>
|
@@ -0,0 +1,30 @@
|
|
1
|
+
<%= render 'account/shared/workflow/box' do |p| %>
|
2
|
+
<% p.content_for :title, t('devise.headers.create_account') %>
|
3
|
+
<% p.content_for :body do %>
|
4
|
+
<% within_fields_namespace(:sign_up) do %>
|
5
|
+
<%= form_for resource, as: resource_name, url: registration_path(resource_name), html: {class: 'form'} do |f| %>
|
6
|
+
<%= render 'account/shared/notices' %>
|
7
|
+
<%= render 'account/shared/forms/errors', form: f %>
|
8
|
+
|
9
|
+
<%= render 'shared/fields/email_field', form: f, method: :email, options: {autofocus: true} do %>
|
10
|
+
<% content_for :help do %>
|
11
|
+
<%= link_to t('devise.links.have_account'), new_user_session_path %>
|
12
|
+
<% end %>
|
13
|
+
<% end %>
|
14
|
+
|
15
|
+
<div class="grid grid-cols-2 gap-5">
|
16
|
+
<div>
|
17
|
+
<%= render 'shared/fields/password_field', form: f, method: :password %>
|
18
|
+
</div>
|
19
|
+
<div>
|
20
|
+
<%= render 'shared/fields/password_field', form: f, method: :password_confirmation, other_options: {error: f.object.errors.full_messages_for(:password).first, hide_custom_error: true} %>
|
21
|
+
</div>
|
22
|
+
</div>
|
23
|
+
|
24
|
+
<%= f.submit t('global.buttons.sign_up'), class: 'button full' %>
|
25
|
+
|
26
|
+
<%= render 'devise/shared/oauth', verb: 'Sign Up' %>
|
27
|
+
<% end %>
|
28
|
+
<% end %>
|
29
|
+
<% end %>
|
30
|
+
<% end %>
|
@@ -0,0 +1,59 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
<%= render 'account/shared/workflow/box' do |p| %>
|
4
|
+
<% p.content_for :title, t('devise.headers.sign_in') %>
|
5
|
+
<% p.content_for :body do %>
|
6
|
+
<% within_fields_namespace(:self) do %>
|
7
|
+
<%= form_for resource, as: resource_name, url: two_factor_authentication_enabled? ? users_pre_otp_path : session_path(resource_name), remote: two_factor_authentication_enabled?, html: {class: 'form'}, authenticity_token: true do |form| %>
|
8
|
+
<% with_field_settings form: form do %>
|
9
|
+
<%= render 'account/shared/notices', form: form %>
|
10
|
+
<%= render 'account/shared/forms/errors', form: form %>
|
11
|
+
|
12
|
+
<% email_field = capture do %>
|
13
|
+
<%= render 'shared/fields/email_field', method: :email, options: {autofocus: true} do %>
|
14
|
+
<% if show_sign_up_options? %>
|
15
|
+
<% content_for :help do %>
|
16
|
+
<%= link_to t('devise.links.account'), new_user_registration_path %>
|
17
|
+
<% end %>
|
18
|
+
<% end %>
|
19
|
+
<% end %>
|
20
|
+
<% end %>
|
21
|
+
|
22
|
+
<% if two_factor_authentication_enabled? %>
|
23
|
+
<div id="step-1" class="space-y">
|
24
|
+
<%= email_field %>
|
25
|
+
<%= form.submit t('global.buttons.next'), class: 'button full' %>
|
26
|
+
</div>
|
27
|
+
<% else %>
|
28
|
+
<%= email_field %>
|
29
|
+
<% end %>
|
30
|
+
|
31
|
+
<div id="step-2" class="<%= 'hidden' if two_factor_authentication_enabled? %> space-y">
|
32
|
+
<%= render 'shared/fields/password_field', method: :password do %>
|
33
|
+
<% content_for :help do %>
|
34
|
+
<%= link_to t('devise.links.forgot_password'), new_user_password_path %>
|
35
|
+
<% end %>
|
36
|
+
<% end %>
|
37
|
+
|
38
|
+
<% if two_factor_authentication_enabled? %>
|
39
|
+
<div id="step-2-otp" class="hidden">
|
40
|
+
<%= render 'shared/fields/text_field', method: :otp_attempt %>
|
41
|
+
</div>
|
42
|
+
<% end %>
|
43
|
+
|
44
|
+
<%= form.submit t('global.buttons.sign_in'), class: 'button full' %>
|
45
|
+
</div>
|
46
|
+
|
47
|
+
<div class="flex items-center">
|
48
|
+
<input id="remember_me" name="remember_me" type="checkbox" class="h-4 w-4 text-blue focus:ring-blue-dark border-gray-300 rounded">
|
49
|
+
<label for="remember_me" class="ml-2 block">
|
50
|
+
Remember me
|
51
|
+
</label>
|
52
|
+
</div>
|
53
|
+
<% end %>
|
54
|
+
<% end %>
|
55
|
+
<% end %>
|
56
|
+
|
57
|
+
<%= render 'devise/shared/oauth' %>
|
58
|
+
<% end %>
|
59
|
+
<% end %>
|
@@ -0,0 +1,11 @@
|
|
1
|
+
<% if @email %>
|
2
|
+
$("#step-1").addClass("hidden");
|
3
|
+
$("#step-2").removeClass("hidden");
|
4
|
+
<% if @user&.otp_required_for_login %>
|
5
|
+
$("#step-2-otp").removeClass("hidden");
|
6
|
+
<% end %>
|
7
|
+
setTimeout(function() {
|
8
|
+
$("#user_password").focus();
|
9
|
+
$("#new_user").attr('action', '/users/sign_in').attr('data-remote', 'false');
|
10
|
+
}, 1);
|
11
|
+
<% end %>
|
@@ -0,0 +1,21 @@
|
|
1
|
+
<%- if controller_name != 'sessions' %>
|
2
|
+
<%= link_to t('devise.links.log_in'), new_session_path(resource_name) %><br />
|
3
|
+
<% end -%>
|
4
|
+
|
5
|
+
<%- if devise_mapping.registerable? && controller_name != 'registrations' %>
|
6
|
+
<%= link_to t('devise.links.sign_up'), new_registration_path(resource_name) %><br />
|
7
|
+
<% end -%>
|
8
|
+
|
9
|
+
<%- if devise_mapping.confirmable? && controller_name != 'confirmations' %>
|
10
|
+
<%= link_to t('devise.links.new_confirm'), new_confirmation_path(resource_name) %><br />
|
11
|
+
<% end -%>
|
12
|
+
|
13
|
+
<%- if devise_mapping.lockable? && resource_class.unlock_strategy_enabled?(:email) && controller_name != 'unlocks' %>
|
14
|
+
<%= link_to t('devise.links.new_unlock'), new_unlock_path(resource_name) %><br />
|
15
|
+
<% end -%>
|
16
|
+
|
17
|
+
<%- if devise_mapping.omniauthable? %>
|
18
|
+
<%- resource_class.omniauth_providers.each do |provider| %>
|
19
|
+
<%= link_to t('devise.links.sign_in_with', provider: OmniAuth::Utils.camelize(provider)), omniauth_authorize_path(resource_name, provider) %><br />
|
20
|
+
<% end -%>
|
21
|
+
<% end -%>
|
@@ -0,0 +1,9 @@
|
|
1
|
+
<% if any_oauth_enabled? %>
|
2
|
+
<% verb ||= 'Sign In' %>
|
3
|
+
|
4
|
+
<%= render 'account/shared/decision_line' %>
|
5
|
+
<div class="grid grid-cols-1 gap-2">
|
6
|
+
<%= render 'devise/shared/oauth/stripe', verb: verb if stripe_enabled? %>
|
7
|
+
<%# 🚅 super scaffolding will insert new oauth providers above this line. %>
|
8
|
+
</div>
|
9
|
+
<% end %>
|
@@ -0,0 +1,16 @@
|
|
1
|
+
<h2><%= t('devise.headers.resend_unlock') %></h2>
|
2
|
+
|
3
|
+
<%= form_for(resource, as: resource_name, url: unlock_path(resource_name), html: { method: :post }) do |f| %>
|
4
|
+
<%= devise_error_messages! %>
|
5
|
+
|
6
|
+
<div class="field">
|
7
|
+
<%= f.label :email %><br />
|
8
|
+
<%= f.email_field :email, autofocus: true %>
|
9
|
+
</div>
|
10
|
+
|
11
|
+
<div class="actions">
|
12
|
+
<%= f.submit t('devise.buttons.resend_unlock') %>
|
13
|
+
</div>
|
14
|
+
<% end %>
|
15
|
+
|
16
|
+
<%= render "devise/shared/links" %>
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= render "themes/#{current_theme}/layouts/account" %>
|
@@ -0,0 +1 @@
|
|
1
|
+
<%= render "themes/#{current_theme}/layouts/devise" %>
|
@@ -0,0 +1,110 @@
|
|
1
|
+
# Additional translations at https://github.com/plataformatec/devise/wiki/I18n
|
2
|
+
|
3
|
+
en:
|
4
|
+
devise:
|
5
|
+
titles:
|
6
|
+
reset_password: Reset Your Password
|
7
|
+
sign_in: Sign In
|
8
|
+
headers:
|
9
|
+
resend_confirm: Resend Confirmation Instructions
|
10
|
+
change_password: Change Your Password
|
11
|
+
reset_password: Reset Password
|
12
|
+
edit_registration: Edit %{resource_name}
|
13
|
+
cancel_account: Cancel My Account
|
14
|
+
create_account: Create Your Account
|
15
|
+
sign_in: Sign In
|
16
|
+
resend_unlock: Resend Unlock Instructions
|
17
|
+
labels:
|
18
|
+
wait_confirm: "Currently waiting confirmation for: %{unconfirmed_email}"
|
19
|
+
hints:
|
20
|
+
leave_blank: (leave blank if you don't want to change it)
|
21
|
+
length: '%{password_length} characters minimum'
|
22
|
+
need_password: (we need your current password to confirm your changes)
|
23
|
+
buttons:
|
24
|
+
resend_confirm: Resend Confirmation Instructions
|
25
|
+
change_password: Change My Password
|
26
|
+
reset_password: Reset Password by Email
|
27
|
+
cancel_account: Cancel My Account
|
28
|
+
resend_unlock: Resend Unlock Instructions
|
29
|
+
links:
|
30
|
+
account: Don't have an account?
|
31
|
+
have_account: Already have an account?
|
32
|
+
forgot_password: Forgot your password?
|
33
|
+
log_in: Log In
|
34
|
+
sign_up: Sign Up
|
35
|
+
new_confirm: Didn't receive confirmation instructions?
|
36
|
+
new_unlock: Didn't receive unlock instructions?
|
37
|
+
sign_in_with: Sign in with %{provider}
|
38
|
+
|
39
|
+
confirmations:
|
40
|
+
confirmed: "Your email address has been successfully confirmed."
|
41
|
+
send_instructions: "You will receive an email with instructions for how to confirm your email address in a few minutes."
|
42
|
+
send_paranoid_instructions: "If your email address exists in our database, you will receive an email with instructions for how to confirm your email address in a few minutes."
|
43
|
+
failure:
|
44
|
+
already_authenticated: "You are already signed in."
|
45
|
+
inactive: "Your account is not activated yet."
|
46
|
+
invalid: "Invalid %{authentication_keys} or Password."
|
47
|
+
locked: "Your account is locked."
|
48
|
+
last_attempt: "You have one more attempt before your account is locked."
|
49
|
+
not_found_in_database: "Invalid %{authentication_keys} or Password."
|
50
|
+
timeout: "Your session expired. Please sign in again to continue."
|
51
|
+
unauthenticated: "You need to sign in or sign up before continuing."
|
52
|
+
unconfirmed: "You have to confirm your email address before continuing."
|
53
|
+
mailer:
|
54
|
+
confirmation_instructions:
|
55
|
+
subject: "Confirmation instructions"
|
56
|
+
welcome: Welcome %{email}!
|
57
|
+
description: 'You can confirm your account email through the link below:'
|
58
|
+
confirm_account: Confirm my account
|
59
|
+
reset_password_instructions:
|
60
|
+
subject: "Reset password instructions"
|
61
|
+
hello: Hello %{email}!
|
62
|
+
requested_change: Someone has requested a link to change your password. You can do this through the link below.
|
63
|
+
ignore: If you didn't request this, please ignore this email.
|
64
|
+
access_change: Your password won't change until you access the link above and create a new one.
|
65
|
+
change_password: Change my password
|
66
|
+
unlock_instructions:
|
67
|
+
subject: "Unlock instructions"
|
68
|
+
hello: Hello %{email}!
|
69
|
+
account_blocked: Your account has been locked due to an excessive number of unsuccessful sign in attempts.
|
70
|
+
click_link: 'Click the link below to unlock your account:'
|
71
|
+
unlock: Unlock my account
|
72
|
+
password_change:
|
73
|
+
subject: "Password Changed"
|
74
|
+
hello: Hello %{email}!
|
75
|
+
description: We're contacting you to notify you that your password has been changed.
|
76
|
+
omniauth_callbacks:
|
77
|
+
failure: "Could not authenticate you from %{kind} because \"%{reason}\"."
|
78
|
+
success: "Successfully authenticated from %{kind} account."
|
79
|
+
passwords:
|
80
|
+
no_token: "You can't access this page without coming from a password reset email. If you do come from a password reset email, please make sure you used the full URL provided."
|
81
|
+
send_instructions: "You will receive an email with instructions on how to reset your password in a few minutes."
|
82
|
+
send_paranoid_instructions: "If your email address exists in our database, you will receive a password recovery link at your email address in a few minutes."
|
83
|
+
updated: "Your password has been changed successfully. You are now signed in."
|
84
|
+
updated_not_active: "Your password has been changed successfully."
|
85
|
+
registrations:
|
86
|
+
destroyed: "Bye! Your account has been successfully cancelled. We hope to see you again soon."
|
87
|
+
signed_up: "Welcome! You have signed up successfully."
|
88
|
+
signed_up_but_inactive: "You have signed up successfully. However, we could not sign you in because your account is not yet activated."
|
89
|
+
signed_up_but_locked: "You have signed up successfully. However, we could not sign you in because your account is locked."
|
90
|
+
signed_up_but_unconfirmed: "A message with a confirmation link has been sent to your email address. Please follow the link to activate your account."
|
91
|
+
update_needs_confirmation: "You updated your account successfully, but we need to verify your new email address. Please check your email and follow the confirm link to confirm your new email address."
|
92
|
+
updated: "Your account has been updated successfully."
|
93
|
+
sessions:
|
94
|
+
signed_in: "Signed in successfully."
|
95
|
+
signed_out: "Signed out successfully."
|
96
|
+
already_signed_out: "Signed out successfully."
|
97
|
+
unlocks:
|
98
|
+
send_instructions: "You will receive an email with instructions for how to unlock your account in a few minutes."
|
99
|
+
send_paranoid_instructions: "If your account exists, you will receive an email with instructions for how to unlock it in a few minutes."
|
100
|
+
unlocked: "Your account has been unlocked successfully. Please sign in to continue."
|
101
|
+
errors:
|
102
|
+
messages:
|
103
|
+
already_confirmed: "was already confirmed, please try signing in"
|
104
|
+
confirmation_period_expired: "needs to be confirmed within %{period}, please request a new one"
|
105
|
+
expired: "has expired, please request a new one"
|
106
|
+
not_found: "not found"
|
107
|
+
not_locked: "was not locked"
|
108
|
+
not_saved:
|
109
|
+
one: "1 error prohibited this %{resource} from being saved:"
|
110
|
+
other: "%{count} errors prohibited this %{resource} from being saved:"
|
data/lib/bullet_train/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: bullet_train
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.0.
|
4
|
+
version: 1.0.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Culver
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-01-
|
11
|
+
date: 2022-01-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rails
|
@@ -40,21 +40,42 @@ files:
|
|
40
40
|
- app/controllers/account/onboarding/user_details_controller.rb
|
41
41
|
- app/controllers/account/onboarding/user_email_controller.rb
|
42
42
|
- app/controllers/account/teams_controller.rb
|
43
|
+
- app/controllers/account/two_factors_controller.rb
|
43
44
|
- app/controllers/account/users_controller.rb
|
45
|
+
- app/controllers/concerns/account/controllers/base.rb
|
44
46
|
- app/controllers/concerns/account/invitations/controller_base.rb
|
45
47
|
- app/controllers/concerns/account/memberships/controller_base.rb
|
46
48
|
- app/controllers/concerns/account/onboarding/user_details/controller_base.rb
|
47
49
|
- app/controllers/concerns/account/onboarding/user_email/controller_base.rb
|
48
50
|
- app/controllers/concerns/account/teams/controller_base.rb
|
49
51
|
- app/controllers/concerns/account/users/controller_base.rb
|
52
|
+
- app/controllers/concerns/controllers/base.rb
|
53
|
+
- app/controllers/concerns/devise_current_attributes.rb
|
54
|
+
- app/controllers/concerns/registrations/controller_base.rb
|
55
|
+
- app/controllers/concerns/sessions/controller_base.rb
|
56
|
+
- app/controllers/registrations_controller.rb
|
57
|
+
- app/controllers/sessions_controller.rb
|
58
|
+
- app/helpers/account/buttons_helper.rb
|
59
|
+
- app/helpers/account/dates_helper.rb
|
60
|
+
- app/helpers/account/forms_helper.rb
|
50
61
|
- app/helpers/account/invitations_helper.rb
|
62
|
+
- app/helpers/account/locale_helper.rb
|
63
|
+
- app/helpers/account/markdown_helper.rb
|
51
64
|
- app/helpers/account/memberships_helper.rb
|
65
|
+
- app/helpers/account/role_helper.rb
|
52
66
|
- app/helpers/account/teams_helper.rb
|
53
67
|
- app/helpers/account/users_helper.rb
|
68
|
+
- app/helpers/attributes_helper.rb
|
69
|
+
- app/helpers/email_helper.rb
|
70
|
+
- app/helpers/images_helper.rb
|
54
71
|
- app/helpers/invitation_only_helper.rb
|
55
72
|
- app/helpers/invitations_helper.rb
|
73
|
+
- app/mailers/concerns/mailers/base.rb
|
74
|
+
- app/mailers/devise_mailer.rb
|
75
|
+
- app/mailers/user_mailer.rb
|
56
76
|
- app/models/concerns/invitations/base.rb
|
57
77
|
- app/models/concerns/memberships/base.rb
|
78
|
+
- app/models/concerns/records/base.rb
|
58
79
|
- app/models/concerns/teams/base.rb
|
59
80
|
- app/models/concerns/users/base.rb
|
60
81
|
- app/models/invitation.rb
|
@@ -93,10 +114,30 @@ files:
|
|
93
114
|
- app/views/account/teams/new.html.erb
|
94
115
|
- app/views/account/teams/show.html.erb
|
95
116
|
- app/views/account/teams/show.json.jbuilder
|
117
|
+
- app/views/account/two_factors/create.js.erb
|
118
|
+
- app/views/account/two_factors/destroy.js.erb
|
96
119
|
- app/views/account/users/_breadcrumbs.html.erb
|
97
120
|
- app/views/account/users/_form.html.erb
|
98
121
|
- app/views/account/users/edit.html.erb
|
99
122
|
- app/views/account/users/show.html.erb
|
123
|
+
- app/views/devise/confirmations/new.html.erb
|
124
|
+
- app/views/devise/mailer/confirmation_instructions.html.erb
|
125
|
+
- app/views/devise/mailer/password_change.html.erb
|
126
|
+
- app/views/devise/mailer/reset_password_instructions.html.erb
|
127
|
+
- app/views/devise/mailer/unlock_instructions.html.erb
|
128
|
+
- app/views/devise/passwords/edit.html.erb
|
129
|
+
- app/views/devise/passwords/new.html.erb
|
130
|
+
- app/views/devise/registrations/_two_factor.html.erb
|
131
|
+
- app/views/devise/registrations/edit.html.erb
|
132
|
+
- app/views/devise/registrations/new.html.erb
|
133
|
+
- app/views/devise/sessions/new.html.erb
|
134
|
+
- app/views/devise/sessions/pre_otp.js.erb
|
135
|
+
- app/views/devise/shared/_links.html.erb
|
136
|
+
- app/views/devise/shared/_oauth.html.erb
|
137
|
+
- app/views/devise/unlocks/new.html.erb
|
138
|
+
- app/views/layouts/account.html.erb
|
139
|
+
- app/views/layouts/devise.html.erb
|
140
|
+
- config/locales/en/devise.en.yml
|
100
141
|
- config/locales/en/invitations.en.yml
|
101
142
|
- config/locales/en/memberships.en.yml
|
102
143
|
- config/locales/en/onboarding/user_details.en.yml
|