rails_base 0.51.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +32 -0
- data/Rakefile +32 -0
- data/app/assets/config/rails_base/manifest.js +3 -0
- data/app/assets/images/rails_base/favicon.ico +0 -0
- data/app/assets/javascripts/rails_base/admin.js +2 -0
- data/app/assets/javascripts/rails_base/application.js +22 -0
- data/app/assets/javascripts/rails_base/cable.js +13 -0
- data/app/assets/javascripts/rails_base/mfa_auth.coffee +3 -0
- data/app/assets/javascripts/rails_base/secondary_authentication.coffee +3 -0
- data/app/assets/javascripts/rails_base/sessions.js +152 -0
- data/app/assets/javascripts/rails_base/user_settings.coffee +3 -0
- data/app/assets/stylesheets/rails_base/admin.css +4 -0
- data/app/assets/stylesheets/rails_base/application.scss +15 -0
- data/app/assets/stylesheets/rails_base/mfa_auth.scss +3 -0
- data/app/assets/stylesheets/rails_base/scaffolds.scss +84 -0
- data/app/assets/stylesheets/rails_base/secondary_authentication.scss +3 -0
- data/app/assets/stylesheets/rails_base/user_settings.scss +3 -0
- data/app/controllers/rails_base/admin_controller.rb +315 -0
- data/app/controllers/rails_base/application_controller.rb +153 -0
- data/app/controllers/rails_base/errors_controller.rb +29 -0
- data/app/controllers/rails_base/mfa_auth_controller.rb +50 -0
- data/app/controllers/rails_base/secondary_authentication_controller.rb +224 -0
- data/app/controllers/rails_base/switch_user_controller.rb +29 -0
- data/app/controllers/rails_base/user_settings_controller.rb +81 -0
- data/app/controllers/rails_base/users/passwords_controller.rb +19 -0
- data/app/controllers/rails_base/users/registrations_controller.rb +80 -0
- data/app/controllers/rails_base/users/sessions_controller.rb +108 -0
- data/app/helpers/rails_base/admin_helper.rb +107 -0
- data/app/helpers/rails_base/appearance_helper.rb +58 -0
- data/app/helpers/rails_base/application_helper.rb +26 -0
- data/app/helpers/rails_base/capture_reference_helper.rb +57 -0
- data/app/helpers/rails_base/mfa_auth_helper.rb +2 -0
- data/app/helpers/rails_base/secondary_authentication_helper.rb +2 -0
- data/app/helpers/rails_base/user_field_validators.rb +108 -0
- data/app/helpers/rails_base/user_settings_helper.rb +22 -0
- data/app/jobs/rails_base/application_job.rb +10 -0
- data/app/jobs/twilio_job.rb +9 -0
- data/app/mailers/rails_base/application_mailer.rb +9 -0
- data/app/mailers/rails_base/email_verification_mailer.rb +22 -0
- data/app/mailers/rails_base/event_mailer.rb +16 -0
- data/app/models/admin_action.rb +119 -0
- data/app/models/rails_base/application_record.rb +22 -0
- data/app/models/rails_base/user_constants.rb +28 -0
- data/app/models/secret.rb +37 -0
- data/app/models/short_lived_data.rb +132 -0
- data/app/models/user.rb +143 -0
- data/app/services/rails_base/admin_risky_mfa_send.rb +80 -0
- data/app/services/rails_base/admin_update_attribute.rb +100 -0
- data/app/services/rails_base/authentication/authenticate_user.rb +28 -0
- data/app/services/rails_base/authentication/constants.rb +60 -0
- data/app/services/rails_base/authentication/decision_twofa_type.rb +76 -0
- data/app/services/rails_base/authentication/destroy_user.rb +45 -0
- data/app/services/rails_base/authentication/mfa_set_encrypt_token.rb +32 -0
- data/app/services/rails_base/authentication/mfa_validator.rb +88 -0
- data/app/services/rails_base/authentication/modify_password.rb +67 -0
- data/app/services/rails_base/authentication/send_forgot_password.rb +26 -0
- data/app/services/rails_base/authentication/send_login_mfa_to_user.rb +77 -0
- data/app/services/rails_base/authentication/send_verification_email.rb +103 -0
- data/app/services/rails_base/authentication/session_token_verifier.rb +31 -0
- data/app/services/rails_base/authentication/single_sign_on_create.rb +44 -0
- data/app/services/rails_base/authentication/single_sign_on_send.rb +101 -0
- data/app/services/rails_base/authentication/single_sign_on_verify.rb +42 -0
- data/app/services/rails_base/authentication/sso_verify_email.rb +43 -0
- data/app/services/rails_base/authentication/update_phone_send_verification.rb +46 -0
- data/app/services/rails_base/authentication/verify_forgot_password.rb +46 -0
- data/app/services/rails_base/email_change.rb +20 -0
- data/app/services/rails_base/encryption.rb +87 -0
- data/app/services/rails_base/name_change.rb +71 -0
- data/app/services/rails_base/service_base.rb +65 -0
- data/app/services/rails_base/service_logging.rb +23 -0
- data/app/views/layouts/rails_base/application.html.erb +185 -0
- data/app/views/layouts/rails_base/mailer.html.erb +13 -0
- data/app/views/layouts/rails_base/mailer.text.erb +1 -0
- data/app/views/new.html.erb +4 -0
- data/app/views/rails_base/admin/history.html.erb +26 -0
- data/app/views/rails_base/admin/index.html.erb +149 -0
- data/app/views/rails_base/admin/show_config.html.erb +18 -0
- data/app/views/rails_base/devise/confirmations/new.html.erb +16 -0
- data/app/views/rails_base/devise/mailer/confirmation_instructions.html.erb +5 -0
- data/app/views/rails_base/devise/mailer/email_changed.html.erb +7 -0
- data/app/views/rails_base/devise/mailer/password_change.html.erb +3 -0
- data/app/views/rails_base/devise/mailer/reset_password_instructions.html.erb +8 -0
- data/app/views/rails_base/devise/mailer/unlock_instructions.html.erb +7 -0
- data/app/views/rails_base/devise/passwords/edit.html.erb +25 -0
- data/app/views/rails_base/devise/passwords/new.html.erb +27 -0
- data/app/views/rails_base/devise/registrations/edit.html.erb +43 -0
- data/app/views/rails_base/devise/registrations/new.html.erb +123 -0
- data/app/views/rails_base/devise/sessions/new.html.erb +4 -0
- data/app/views/rails_base/devise/shared/_error_messages.html.erb +15 -0
- data/app/views/rails_base/devise/shared/_links.html.erb +25 -0
- data/app/views/rails_base/devise/unlocks/new.html.erb +16 -0
- data/app/views/rails_base/email_verification_mailer/email_verification.html.erb +25 -0
- data/app/views/rails_base/email_verification_mailer/event.html.erb +20 -0
- data/app/views/rails_base/email_verification_mailer/forgot_password.html.erb +22 -0
- data/app/views/rails_base/errors/internal_error.html.erb +1 -0
- data/app/views/rails_base/errors/not_found.html.erb +1 -0
- data/app/views/rails_base/errors/unacceptable.html.erb +1 -0
- data/app/views/rails_base/event_mailer/event.html.erb +10 -0
- data/app/views/rails_base/mfa_auth/mfa_code.html.erb +10 -0
- data/app/views/rails_base/secondary_authentication/after_email_login_session_new.html.erb +3 -0
- data/app/views/rails_base/secondary_authentication/forgot_password.html.erb +9 -0
- data/app/views/rails_base/secondary_authentication/remove_me.html.erb +1 -0
- data/app/views/rails_base/secondary_authentication/static.html.erb +5 -0
- data/app/views/rails_base/shared/_admin_actions_modal.html.erb +65 -0
- data/app/views/rails_base/shared/_admin_config_class.html.erb +52 -0
- data/app/views/rails_base/shared/_admin_history.html.erb +86 -0
- data/app/views/rails_base/shared/_admin_modify_email.html.erb +78 -0
- data/app/views/rails_base/shared/_admin_modify_name.html.erb +107 -0
- data/app/views/rails_base/shared/_admin_modify_phone.html.erb +87 -0
- data/app/views/rails_base/shared/_admin_modify_text.html.erb +35 -0
- data/app/views/rails_base/shared/_admin_risky_change.html.erb +57 -0
- data/app/views/rails_base/shared/_admin_risky_mfa.html.erb +74 -0
- data/app/views/rails_base/shared/_admin_selector_dropdown.html.erb +70 -0
- data/app/views/rails_base/shared/_admin_toggle_button.html.erb +72 -0
- data/app/views/rails_base/shared/_admin_warning_alert.html.erb +7 -0
- data/app/views/rails_base/shared/_appearance_mode_selector.html.erb +183 -0
- data/app/views/rails_base/shared/_custom_form_validation_javascript.html.erb +129 -0
- data/app/views/rails_base/shared/_enable_mfa_auth_modal.html.erb +105 -0
- data/app/views/rails_base/shared/_error_pages.html.erb +123 -0
- data/app/views/rails_base/shared/_logged_in_header.html.erb +123 -0
- data/app/views/rails_base/shared/_logged_out_header.html.erb +14 -0
- data/app/views/rails_base/shared/_mfa_input_layout.html.erb +5 -0
- data/app/views/rails_base/shared/_mfa_input_layout_default.html.erb +97 -0
- data/app/views/rails_base/shared/_mfa_input_layout_fallback.html.erb +55 -0
- data/app/views/rails_base/shared/_modify_mfa_auth_modal.html.erb +20 -0
- data/app/views/rails_base/shared/_password_confirm_javascript.html.erb +71 -0
- data/app/views/rails_base/shared/_reset_password_form.html.erb +111 -0
- data/app/views/rails_base/shared/_session_create_form.html.erb +32 -0
- data/app/views/rails_base/shared/_session_timeout_modal.html.erb +76 -0
- data/app/views/rails_base/switch_user/_widget.html.erb +5 -0
- data/app/views/rails_base/user_settings/_confirm_destroy_user.html.erb +42 -0
- data/app/views/rails_base/user_settings/_destroy_user.html.erb +106 -0
- data/app/views/rails_base/user_settings/_modify_name.html.erb +71 -0
- data/app/views/rails_base/user_settings/_modify_password.html.erb +101 -0
- data/app/views/rails_base/user_settings/_modify_password_update_password.html.erb +2 -0
- data/app/views/rails_base/user_settings/index.html.erb +54 -0
- data/config/initializers/01_rails_config.rb +19 -0
- data/config/initializers/admin_action_helper.rb +88 -0
- data/config/initializers/browser.rb +4 -0
- data/config/initializers/default_logged_in_headers.rb +23 -0
- data/config/initializers/devise.rb +314 -0
- data/config/initializers/encryption.rb +2 -0
- data/config/initializers/switch_user.rb +58 -0
- data/config/initializers/switch_user_helper.rb +29 -0
- data/config/locales/devise.en.yml +65 -0
- data/config/locales/en.yml +58 -0
- data/config/routes.rb +114 -0
- data/db/migrate/20210212175453_devise_create_rails_base_users.rb +56 -0
- data/db/migrate/20210212190537_create_rails_base_short_lived_data.rb +19 -0
- data/db/migrate/20210212192645_create_rails_base_secrets.rb +11 -0
- data/db/migrate/20210406015744_create_rails_base_admin_actions.rb +17 -0
- data/db/seeds.rb +23 -0
- data/lib/link_decision_helper.rb +71 -0
- data/lib/rails_base.rb +50 -0
- data/lib/rails_base/admin/action_cache.rb +99 -0
- data/lib/rails_base/admin/action_helper.rb +134 -0
- data/lib/rails_base/admin/default_index_tile.rb +176 -0
- data/lib/rails_base/admin/index_tile.rb +186 -0
- data/lib/rails_base/config.rb +52 -0
- data/lib/rails_base/configuration/active_job.rb +38 -0
- data/lib/rails_base/configuration/admin.rb +231 -0
- data/lib/rails_base/configuration/app.rb +52 -0
- data/lib/rails_base/configuration/appearance.rb +131 -0
- data/lib/rails_base/configuration/authentication.rb +37 -0
- data/lib/rails_base/configuration/base.rb +209 -0
- data/lib/rails_base/configuration/display/background_color.rb +25 -0
- data/lib/rails_base/configuration/display/btn_danger.rb +25 -0
- data/lib/rails_base/configuration/display/btn_dark.rb +25 -0
- data/lib/rails_base/configuration/display/btn_info.rb +25 -0
- data/lib/rails_base/configuration/display/btn_light.rb +25 -0
- data/lib/rails_base/configuration/display/btn_primary.rb +25 -0
- data/lib/rails_base/configuration/display/btn_secondary.rb +25 -0
- data/lib/rails_base/configuration/display/btn_success.rb +25 -0
- data/lib/rails_base/configuration/display/btn_warning.rb +25 -0
- data/lib/rails_base/configuration/display/footer.rb +54 -0
- data/lib/rails_base/configuration/display/navbar.rb +25 -0
- data/lib/rails_base/configuration/display/table_body.rb +25 -0
- data/lib/rails_base/configuration/display/table_header.rb +25 -0
- data/lib/rails_base/configuration/display/text.rb +26 -0
- data/lib/rails_base/configuration/exceptions_app.rb +25 -0
- data/lib/rails_base/configuration/login_behavior.rb +17 -0
- data/lib/rails_base/configuration/mailer.rb +116 -0
- data/lib/rails_base/configuration/mfa.rb +84 -0
- data/lib/rails_base/configuration/owner.rb +17 -0
- data/lib/rails_base/configuration/redis.rb +29 -0
- data/lib/rails_base/configuration/user.rb +43 -0
- data/lib/rails_base/engine.rb +51 -0
- data/lib/rails_base/version.rb +10 -0
- data/lib/tasks/rails_base_tasks.rake +4 -0
- data/lib/twilio_helper.rb +26 -0
- data/lib/velocity_limiter.rb +91 -0
- metadata +619 -0
@@ -0,0 +1,7 @@
|
|
1
|
+
<h4 class="alert-heading text-center">!¡ Warning !¡</h4>
|
2
|
+
<hr>
|
3
|
+
|
4
|
+
<p class="mb-0 text-center">
|
5
|
+
You are using admin privaleges (id: <%= session[RailsBase::Authentication::Constants::ADMIN_REMEMBER_USERID_KEY] %>) to impersonate a user. You are curently logged in as [<%= current_user.full_name%>] (user id:<%= current_user.id%>)
|
6
|
+
</p>
|
7
|
+
<%= button_to 'Return to my account', RailsBase.url_routes.admin_stop_impersonation_path, method: :post, class: 'btn btn_warning btn-block' %>
|
@@ -0,0 +1,183 @@
|
|
1
|
+
<% if RailsBase.appearance.enabled %>
|
2
|
+
<% if display %>
|
3
|
+
<!-- Button trigger modal -->
|
4
|
+
<button type="button" class="btn btn_info <%= btn%> close-me" data-toggle="modal" data-target="#appearance_mode_selector">
|
5
|
+
Dark/Lite Mode
|
6
|
+
</button>
|
7
|
+
|
8
|
+
<!-- Modal -->
|
9
|
+
<div class="modal fade" id="appearance_mode_selector" tabindex="-1" role="dialog" aria-labelledby="appearance_mode_selectorTitle" aria-hidden="true">
|
10
|
+
<div class="modal-dialog modal-dialog-centered" role="document">
|
11
|
+
<div class="modal-content">
|
12
|
+
<div class="modal-header">
|
13
|
+
<h5 class="modal-title" id="appearance_mode_selectorTitle">Select Appearance Mode</h5>
|
14
|
+
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
|
15
|
+
<span aria-hidden="true">×</span>
|
16
|
+
</button>
|
17
|
+
</div>
|
18
|
+
<div class="modal-body">
|
19
|
+
<h5> Currently using <span id='appearance_mode_text'><%= appearance_mode_drop_down[:current] %> <span> </h5>
|
20
|
+
<%= select_tag 'appearance_mode_selector_id', options_for_select(appearance_mode_drop_down[:types_a]), class: 'form-control', include_blank: 'Select Appearance Mode' %>
|
21
|
+
</div>
|
22
|
+
<div class="modal-footer">
|
23
|
+
<button type="button" class="btn btn-block btn_secondary" data-dismiss="modal">Close</button>
|
24
|
+
</div>
|
25
|
+
</div>
|
26
|
+
</div>
|
27
|
+
</div>
|
28
|
+
<% end %>
|
29
|
+
<style type="text/css">
|
30
|
+
.modal .modal-content.bg-dark {
|
31
|
+
background: black;
|
32
|
+
color: gray ;
|
33
|
+
}
|
34
|
+
select.bg-dark, select.bg-secondary {
|
35
|
+
background-color: black !important;
|
36
|
+
color: white ;
|
37
|
+
}
|
38
|
+
input.bg-dark:not([type='submit']), input.bg-secondary:not([type='submit']) {
|
39
|
+
background-color: black !important;
|
40
|
+
color: white ;
|
41
|
+
}
|
42
|
+
nav li p.bg-dark, nav p.bg-secondary {
|
43
|
+
background-color: black !important;
|
44
|
+
color: white ;
|
45
|
+
}
|
46
|
+
.input-group-text.bg-dark, .input-group-text.bg-secondary {
|
47
|
+
background-color: black !important;
|
48
|
+
color: white ;
|
49
|
+
}
|
50
|
+
</style>
|
51
|
+
<script type="text/javascript">
|
52
|
+
<% dark = RailsBase::Configuration::Appearance::DARK_MODE %>
|
53
|
+
<% light = RailsBase::Configuration::Appearance::LIGHT_MODE %>
|
54
|
+
var type_mapping = JSON.parse('<%= raw RailsBase::Configuration::Appearance::APPEARANCE_TYPES.to_json %>')
|
55
|
+
|
56
|
+
var cookie_name = `<%= RailsBase::ApplicationController::APPEARANCE_MODE_COOKIE %>`;
|
57
|
+
var cookie_actual_name = `<%= RailsBase::ApplicationController::APPEARANCE_MODE_ACTUAL_COOKIE %>`;
|
58
|
+
var dark_mode_changes = [
|
59
|
+
{
|
60
|
+
'descriptor': 'thead',
|
61
|
+
'<%= dark %>': '<%= RailsBase.appearance.t_header.dark_mode %>',
|
62
|
+
'<%= light %>': '<%= RailsBase.appearance.t_header.light_mode %>'
|
63
|
+
},
|
64
|
+
{
|
65
|
+
'descriptor': 'tbody',
|
66
|
+
'<%= dark %>': '<%= RailsBase.appearance.t_body.dark_mode %>',
|
67
|
+
'<%= light %>': '<%= RailsBase.appearance.t_body.light_mode %>'
|
68
|
+
},
|
69
|
+
{
|
70
|
+
'descriptor': 'body',
|
71
|
+
'<%= dark %>': '<%= RailsBase.appearance.bg_color.dark_mode %>',
|
72
|
+
'<%= light %>': '<%= RailsBase.appearance.bg_color.light_mode %>'
|
73
|
+
},
|
74
|
+
{
|
75
|
+
'descriptor': 'input:not(.btn)', // inputs but not button inputs
|
76
|
+
'<%= dark %>': '<%= RailsBase.appearance.bg_color.dark_mode %>',
|
77
|
+
'<%= light %>': '<%= RailsBase.appearance.bg_color.light_mode %>'
|
78
|
+
},
|
79
|
+
{
|
80
|
+
'descriptor': '.modal-content',
|
81
|
+
'<%= dark %>': '<%= RailsBase.appearance.bg_color.dark_mode %>',
|
82
|
+
'<%= light %>': '<%= RailsBase.appearance.bg_color.light_mode %>'
|
83
|
+
},
|
84
|
+
{
|
85
|
+
'descriptor': 'select',
|
86
|
+
'<%= dark %>': '<%= RailsBase.appearance.bg_color.dark_mode %>',
|
87
|
+
'<%= light %>': '<%= RailsBase.appearance.bg_color.light_mode %>'
|
88
|
+
},
|
89
|
+
{
|
90
|
+
'descriptor': 'nav li p',
|
91
|
+
'<%= dark %>': '<%= RailsBase.appearance.bg_color.dark_mode %>',
|
92
|
+
'<%= light %>': '<%= RailsBase.appearance.bg_color.light_mode %>'
|
93
|
+
},
|
94
|
+
{
|
95
|
+
'descriptor': '.navbar',
|
96
|
+
'<%= dark %>': '<%= RailsBase.appearance.navbar.dark_mode %>',
|
97
|
+
'<%= light %>': '<%= RailsBase.appearance.navbar.light_mode %>'
|
98
|
+
},
|
99
|
+
{
|
100
|
+
'descriptor': 'footer',
|
101
|
+
'<%= dark %>': '<%= RailsBase.appearance.navbar.dark_mode %>',
|
102
|
+
'<%= light %>': '<%= RailsBase.appearance.navbar.light_mode %>'
|
103
|
+
},
|
104
|
+
{
|
105
|
+
'descriptor': '.input-group-text',
|
106
|
+
'<%= dark %>': '<%= RailsBase.appearance.navbar.dark_mode %>',
|
107
|
+
'<%= light %>': '<%= RailsBase.appearance.navbar.light_mode %>'
|
108
|
+
},
|
109
|
+
{
|
110
|
+
'descriptor': '.<%= appearance_text_class %>',
|
111
|
+
'<%= dark %>': '<%= RailsBase.appearance.text.dark_mode %>',
|
112
|
+
'<%= light %>': '<%= RailsBase.appearance.text.light_mode %>'
|
113
|
+
},
|
114
|
+
// buttons
|
115
|
+
<% RailsBase.appearance.class::BUTTONS.each do |klass| %>
|
116
|
+
{
|
117
|
+
'descriptor': '.<%= klass %>',
|
118
|
+
'<%= dark %>': '<%= RailsBase.appearance.dig(klass, :dark_mode) %>',
|
119
|
+
'<%= light %>': '<%= RailsBase.appearance.dig(klass, :light_mode) %>'
|
120
|
+
},
|
121
|
+
<% end %>
|
122
|
+
|
123
|
+
]
|
124
|
+
|
125
|
+
function toggle_dark_mode(set_key){
|
126
|
+
set_key ||= get_cookie(cookie_name)
|
127
|
+
var remove_keys = Object.keys(type_mapping)
|
128
|
+
remove_keys.splice( $.inArray(set_key, remove_keys),1 );
|
129
|
+
for (i = 0; i < dark_mode_changes.length; ++i) {
|
130
|
+
var descriptor = dark_mode_changes[i]['descriptor']
|
131
|
+
elements = $(`${descriptor}`)
|
132
|
+
for (s = 0; s < remove_keys.length; ++s) {
|
133
|
+
elements.removeClass(dark_mode_changes[i][remove_keys[s]])
|
134
|
+
}
|
135
|
+
var insert = dark_mode_changes[i][set_key]
|
136
|
+
elements.addClass(insert)
|
137
|
+
}
|
138
|
+
}
|
139
|
+
|
140
|
+
$('#appearance_mode_selector_id').change(function() {
|
141
|
+
var value = $("#appearance_mode_selector_id").val();
|
142
|
+
if(!value){
|
143
|
+
return
|
144
|
+
}
|
145
|
+
set_cookie(cookie_name, '')
|
146
|
+
set_and_toggle_mode(value)
|
147
|
+
})
|
148
|
+
// This function MUST be called outside of document ready
|
149
|
+
// to ensure dark mode does not activate after docuemnt is loaded
|
150
|
+
set_and_toggle_mode( `<%= cookies[RailsBase::ApplicationController::APPEARANCE_MODE_COOKIE] || RailsBase.appearance.default_mode %>`)
|
151
|
+
$('#appearance_mode_selector').appendTo('body');
|
152
|
+
$(document).ready(function(){
|
153
|
+
// differentiation of load order means we need to call this twice
|
154
|
+
set_and_toggle_mode( `<%= cookies[RailsBase::ApplicationController::APPEARANCE_MODE_COOKIE] || RailsBase.appearance.default_mode %>`)
|
155
|
+
$(document).ajaxComplete(function () {
|
156
|
+
set_and_toggle_mode()
|
157
|
+
});
|
158
|
+
});
|
159
|
+
|
160
|
+
function set_and_toggle_mode(value) {
|
161
|
+
if(value){
|
162
|
+
set_cookie(cookie_name, value);
|
163
|
+
set_cookie(cookie_actual_name, value);
|
164
|
+
}
|
165
|
+
$('#appearance_mode_text').text(type_mapping[value])
|
166
|
+
if(get_cookie(cookie_name)=='<%= RailsBase::Configuration::Appearance::MATCH_OS%>'){
|
167
|
+
if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
|
168
|
+
toggle_dark_mode('<%= dark %>');
|
169
|
+
set_cookie(cookie_actual_name, '<%= dark %>');
|
170
|
+
} else {
|
171
|
+
toggle_dark_mode('<%= light %>');
|
172
|
+
set_cookie(cookie_actual_name, '<%= light %>');
|
173
|
+
}
|
174
|
+
} else {
|
175
|
+
toggle_dark_mode();
|
176
|
+
}
|
177
|
+
}
|
178
|
+
|
179
|
+
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', e => {
|
180
|
+
set_and_toggle_mode(get_cookie(cookie_name))
|
181
|
+
});
|
182
|
+
</script>
|
183
|
+
<% end %>
|
@@ -0,0 +1,129 @@
|
|
1
|
+
<% if false %>
|
2
|
+
I wanted to display what this file is supposed to do. Regular comments dont show syntax and are outward facing.
|
3
|
+
|
4
|
+
fwiw, this was mostly an experiment to see if metaprograming from a partial would work with jquery. The hackery that is done here is probably pretty slow
|
5
|
+
|
6
|
+
This is expected to help with validation
|
7
|
+
Expected to be rendered as a partion: ex
|
8
|
+
<%= render partial: 'shared/custom_form_validation_javascript', locals: { function_name: function_name, values: values } %>
|
9
|
+
|
10
|
+
params:
|
11
|
+
function_name: String -- no special characters or spaces; Needs to be unique for the page otherwse metaprogramming will overwrite functions
|
12
|
+
|
13
|
+
values: Array - Array of hashes
|
14
|
+
|
15
|
+
Hash structure
|
16
|
+
name: 'class or id of input element'
|
17
|
+
criteria: hash
|
18
|
+
required: (true | false) If the value is expected to not be empty (same as min_length: 1)
|
19
|
+
min_length: numeric of the minimum length allowed
|
20
|
+
max_length: numeric of the maximum length allowed
|
21
|
+
pattern: 'regex pattern of what is expected in the value'
|
22
|
+
enforce_blur: (true | false) if element should enforce validity when blurred out : Default true
|
23
|
+
|
24
|
+
Sample params
|
25
|
+
<%
|
26
|
+
values = [
|
27
|
+
{ name: '#user_first_name', criteria: { required: true, min_length: 2 }},
|
28
|
+
{ name: '#user_last_name', criteria: { required: true, min_length: 2 }},
|
29
|
+
{ name: '#user_email', criteria: { required: true, pattern: Authentication::Constants::EMAIL_PATTERN }}
|
30
|
+
]
|
31
|
+
# enforce_blur this is used when validation should only be run on submit
|
32
|
+
# and not when div looses focuse
|
33
|
+
enforce_blur = true || false
|
34
|
+
function_name = 'new_registration'
|
35
|
+
%>
|
36
|
+
|
37
|
+
<% end %>
|
38
|
+
|
39
|
+
<script type="text/javascript">
|
40
|
+
<% default_blur = true unless defined?(enforce_blur) %>
|
41
|
+
function <%= function_name %>_validation_event(){
|
42
|
+
var valid = true
|
43
|
+
console.log('starting validation')
|
44
|
+
<% values.each do |value| %>
|
45
|
+
valid = valid && <%= function_name %>_<%= value[:name][1..-1]%>_valid();
|
46
|
+
console.log(`validating <%= function_name %>_<%= value[:name][1..-1]%>_valid`)
|
47
|
+
<% end %>
|
48
|
+
console.log('finished validation')
|
49
|
+
return valid
|
50
|
+
};
|
51
|
+
|
52
|
+
function <%= function_name %>(){
|
53
|
+
var final_criteria = true
|
54
|
+
<% values.each do |value| %>
|
55
|
+
|
56
|
+
var criteria_met = <%= function_name %>_<%= value[:name][1..-1]%>_valid()
|
57
|
+
<%= function_name %>_manipulator($('<%= value[:name]%>'), criteria_met, false);
|
58
|
+
final_criteria = final_criteria && criteria_met;
|
59
|
+
<% end %>
|
60
|
+
return final_criteria;
|
61
|
+
};
|
62
|
+
|
63
|
+
function <%= function_name %>_manipulator(element, criteria_met, focus){
|
64
|
+
if(criteria_met) {
|
65
|
+
element.removeClass('is-invalid');
|
66
|
+
} else {
|
67
|
+
if(focus) {
|
68
|
+
element.focus();
|
69
|
+
element.val('');
|
70
|
+
};
|
71
|
+
element.addClass('is-invalid');
|
72
|
+
};
|
73
|
+
};
|
74
|
+
|
75
|
+
<% values.each do |value| %>
|
76
|
+
<% unless value[:criteria][:enforce_blur] == false %>
|
77
|
+
$('<%= value[:name]%>').blur(function() {
|
78
|
+
var criteria_met = <%= function_name %>_<%= value[:name][1..-1]%>_valid()
|
79
|
+
<%= function_name %>_manipulator($('<%= value[:name]%>'), criteria_met, true);
|
80
|
+
});
|
81
|
+
<% end %>
|
82
|
+
|
83
|
+
function <%= function_name %>_<%= value[:name][1..-1]%>_valid(){
|
84
|
+
var criteria_met = true
|
85
|
+
|
86
|
+
<% if value[:criteria].dig(:required) %>
|
87
|
+
if ($('<%= value[:name]%>').val().length === 0){
|
88
|
+
console.log(`<%= value[:name]%> failed criteria required of <%= value[:criteria][:required] %>`)
|
89
|
+
criteria_met = false;
|
90
|
+
};
|
91
|
+
<% end %>
|
92
|
+
|
93
|
+
<% if value[:criteria].dig(:min_length) %>
|
94
|
+
if ($('<%= value[:name]%>').val().length < <%= value[:criteria][:min_length] %>){
|
95
|
+
console.log(`<%= value[:name]%> failed criteria min_length of <%= value[:criteria][:min_length] %>`)
|
96
|
+
|
97
|
+
criteria_met = false;
|
98
|
+
};
|
99
|
+
<% end %>
|
100
|
+
|
101
|
+
<% if value[:criteria].dig(:max_length) %>
|
102
|
+
if ($('<%= value[:name]%>').val().length > <%= value[:criteria][:max_length] %>){
|
103
|
+
console.log(`<%= value[:name]%> failed criteria max_length of <%= value[:criteria][:max_length] %>`)
|
104
|
+
criteria_met = false;
|
105
|
+
};
|
106
|
+
<% end %>
|
107
|
+
|
108
|
+
<% if value[:criteria].dig(:pattern) %>
|
109
|
+
<% case value[:criteria][:pattern] %>
|
110
|
+
<% when :name %>
|
111
|
+
var pattern = /^[a-zA-Z ']+$/
|
112
|
+
<% when :numeric %>
|
113
|
+
var pattern = /^[0-9]+$/
|
114
|
+
<% when :alpha %>
|
115
|
+
var pattern = /^[a-zA-Z]+$/
|
116
|
+
<% when :email %>
|
117
|
+
var pattern = /^(([^<>()[\]\\.,;:\s@\"]+(\.[^<>()[\]\\.,;:\s@\"]+)*)|(\".+\"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/;
|
118
|
+
<% else %>
|
119
|
+
var pattern = /<%= value[:criteria][:pattern] %>/
|
120
|
+
<% end %>
|
121
|
+
if (pattern.test($('<%= value[:name]%>').val()) === false ){
|
122
|
+
console.log(`<%= value[:name]%> failed criteria pattern of <%= value[:criteria][:pattern]%>`)
|
123
|
+
criteria_met = false;
|
124
|
+
};
|
125
|
+
<% end %>
|
126
|
+
return criteria_met
|
127
|
+
};
|
128
|
+
<% end %>
|
129
|
+
</script>
|
@@ -0,0 +1,105 @@
|
|
1
|
+
<div class="modal fade" id="enableMfamodal" tabindex="-1" role="dialog" aria-labelledby="exampleModalLabel" aria-hidden="true">
|
2
|
+
<div class="modal-dialog modal-lg" role="document">
|
3
|
+
<div class="modal-content">
|
4
|
+
<div class="modal-header">
|
5
|
+
<h5 class="modal-title" id="exampleModalLabel">Enable 2FA via SMS</h5>
|
6
|
+
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
|
7
|
+
<span aria-hidden="true">×</span>
|
8
|
+
</button>
|
9
|
+
</div>
|
10
|
+
<div class="modal-body form-horizontal row">
|
11
|
+
<div class="col-md-10 col-md-offset-1">
|
12
|
+
<div class="form-row phone_number_input_stage">
|
13
|
+
<div class="modal_phone_number_input">
|
14
|
+
<div class="input-group input-group-lg mx-auto">
|
15
|
+
<div class="input-group-prepend">
|
16
|
+
<span class="input-group-text">
|
17
|
+
US Phone Number
|
18
|
+
</span>
|
19
|
+
</div>
|
20
|
+
<%= phone_field_tag(:user_phone_number, nil, style: "font-size:25px;", class: 'phone_us', maxlength: 14, size: 15)%>
|
21
|
+
<button type="button" class="btn btn_success submit-phone-number" id="submit-phone-number" disabled>Submit Phone</button>
|
22
|
+
<button id="loading-phone-number" class="btn btn_success" type="button" disabled style="display: none;">
|
23
|
+
<span class="spinner-grow spinner-grow-sm" role="status" aria-hidden="true"></span>
|
24
|
+
Loading...
|
25
|
+
</button>
|
26
|
+
</div>
|
27
|
+
</div>
|
28
|
+
</div>
|
29
|
+
|
30
|
+
<div class="modal_mfa_input" style="display: none;">
|
31
|
+
<%= render partial: 'rails_base/shared/mfa_input_layout', locals: { url: RailsBase.url_routes.phone_registration_mfa_code_path, size: 25, masked_phone: current_user&.masked_phone || '<n\a>' }%>
|
32
|
+
</div>
|
33
|
+
</div>
|
34
|
+
</div>
|
35
|
+
<div class="modal-footer">
|
36
|
+
<button type="button" class="mr-auto btn btn_secondary" data-dismiss="modal">Close</button>
|
37
|
+
</div>
|
38
|
+
</div>
|
39
|
+
</div>
|
40
|
+
</div>
|
41
|
+
|
42
|
+
<script type="text/javascript">
|
43
|
+
$(document).ready(function(){
|
44
|
+
$('.phone_us').mask('(000) 000-0000', {placeholder: '(___) ___-____'});
|
45
|
+
});
|
46
|
+
|
47
|
+
function close_modal_actions(){
|
48
|
+
$("#loading-phone-number").hide();
|
49
|
+
$("#submit-phone-number").prop("disabled", true);
|
50
|
+
$("#submit-phone-number").show();
|
51
|
+
$("#user_phone_number").val('');
|
52
|
+
$('.modal_mfa_input').hide();
|
53
|
+
$('.phone_number_input_stage').show();
|
54
|
+
clear_mfa_inputs();
|
55
|
+
}
|
56
|
+
|
57
|
+
$('#enableMfamodal').on('hidden.bs.modal', function () {
|
58
|
+
close_modal_actions
|
59
|
+
});
|
60
|
+
|
61
|
+
$('#enableMfamodal').on('shown.bs.modal', function (e) {
|
62
|
+
$("#user_phone_number").focus();
|
63
|
+
})
|
64
|
+
|
65
|
+
$("input[name='user_phone_number']").keypress(function (e) {
|
66
|
+
var key = e.which;
|
67
|
+
var modal_open = $('#enableMfamodal').hasClass('show')
|
68
|
+
if((key == 13) && modal_open) { // the enter key code
|
69
|
+
$("#submit-phone-number").click();
|
70
|
+
}
|
71
|
+
});
|
72
|
+
|
73
|
+
$("input[name='user_phone_number']").keyup(function() {
|
74
|
+
if ($(this).val().length === 14) {
|
75
|
+
$(".submit-phone-number").prop("disabled", false)
|
76
|
+
} else {
|
77
|
+
$(".submit-phone-number").prop("disabled", true)
|
78
|
+
}
|
79
|
+
});
|
80
|
+
|
81
|
+
$(".submit-phone-number").click(function(){
|
82
|
+
$("#submit-phone-number").prop("disabled", true)
|
83
|
+
$("#submit-phone-number").hide();
|
84
|
+
$("#loading-phone-number").show();
|
85
|
+
var number = $("#user_phone_number").val()
|
86
|
+
var data = { 'phone_number': number}
|
87
|
+
$.ajax({
|
88
|
+
type: "POST",
|
89
|
+
url: "<%= RailsBase.url_routes.phone_registration_path%>",
|
90
|
+
headers: { 'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content') },
|
91
|
+
dataType: 'json',
|
92
|
+
data: data,
|
93
|
+
success: function(data) {
|
94
|
+
$('.modal_mfa_input').show();
|
95
|
+
$('.phone_number_input_stage').hide();
|
96
|
+
$("#mfa_mfa_pos_0").focus();
|
97
|
+
},
|
98
|
+
error: function(xhr, status, error) {
|
99
|
+
alert(xhr.responseJSON.msg)
|
100
|
+
close_modal_actions();
|
101
|
+
$('#enableMfamodal').modal('hide');
|
102
|
+
}
|
103
|
+
})
|
104
|
+
});
|
105
|
+
</script>
|
@@ -0,0 +1,123 @@
|
|
1
|
+
<div id="notfound">
|
2
|
+
<div class="notfound">
|
3
|
+
<div class="notfound-404">
|
4
|
+
<h1>Oops!</h1>
|
5
|
+
<h2><%=status%> - <%= msg %> </h2>
|
6
|
+
</div>
|
7
|
+
<a href=<%=RailsBase.url_routes.authenticated_root_path%>>Go Home</a>
|
8
|
+
<a href=# onclick="goBack()">Go Back</a>
|
9
|
+
</div>
|
10
|
+
</div>
|
11
|
+
<style type="text/css">
|
12
|
+
* {
|
13
|
+
-webkit-box-sizing: border-box;
|
14
|
+
box-sizing: border-box;
|
15
|
+
}
|
16
|
+
|
17
|
+
body {
|
18
|
+
padding: 0;
|
19
|
+
margin: 0;
|
20
|
+
}
|
21
|
+
|
22
|
+
#notfound {
|
23
|
+
position: relative;
|
24
|
+
height: 100vh;
|
25
|
+
}
|
26
|
+
|
27
|
+
#notfound .notfound {
|
28
|
+
position: absolute;
|
29
|
+
left: 50%;
|
30
|
+
top: 50%;
|
31
|
+
-webkit-transform: translate(-50%, -50%);
|
32
|
+
-ms-transform: translate(-50%, -50%);
|
33
|
+
transform: translate(-50%, -50%);
|
34
|
+
}
|
35
|
+
|
36
|
+
.notfound {
|
37
|
+
max-width: 520px;
|
38
|
+
width: 100%;
|
39
|
+
line-height: 1.4;
|
40
|
+
text-align: center;
|
41
|
+
}
|
42
|
+
|
43
|
+
.notfound .notfound-404 {
|
44
|
+
position: relative;
|
45
|
+
height: 200px;
|
46
|
+
margin: 0px auto 20px;
|
47
|
+
z-index: -1;
|
48
|
+
}
|
49
|
+
|
50
|
+
.notfound .notfound-404 h1 {
|
51
|
+
font-family: 'Montserrat', sans-serif;
|
52
|
+
font-size: 236px;
|
53
|
+
font-weight: 200;
|
54
|
+
margin: 0px;
|
55
|
+
color: #211b19;
|
56
|
+
text-transform: uppercase;
|
57
|
+
position: absolute;
|
58
|
+
left: 50%;
|
59
|
+
top: 50%;
|
60
|
+
-webkit-transform: translate(-50%, -50%);
|
61
|
+
-ms-transform: translate(-50%, -50%);
|
62
|
+
transform: translate(-50%, -50%);
|
63
|
+
}
|
64
|
+
|
65
|
+
.notfound .notfound-404 h2 {
|
66
|
+
font-family: 'Montserrat', sans-serif;
|
67
|
+
font-size: 28px;
|
68
|
+
font-weight: 400;
|
69
|
+
text-transform: uppercase;
|
70
|
+
color: #211b19;
|
71
|
+
background: #fff;
|
72
|
+
padding: 10px 5px;
|
73
|
+
margin: auto;
|
74
|
+
display: inline-block;
|
75
|
+
position: absolute;
|
76
|
+
bottom: 0px;
|
77
|
+
left: 0;
|
78
|
+
right: 0;
|
79
|
+
}
|
80
|
+
|
81
|
+
.notfound a {
|
82
|
+
font-family: 'Montserrat', sans-serif;
|
83
|
+
display: inline-block;
|
84
|
+
font-weight: 700;
|
85
|
+
text-decoration: none;
|
86
|
+
color: #fff;
|
87
|
+
text-transform: uppercase;
|
88
|
+
padding: 13px 23px;
|
89
|
+
background: #ff6300;
|
90
|
+
font-size: 18px;
|
91
|
+
-webkit-transition: 0.2s all;
|
92
|
+
transition: 0.2s all;
|
93
|
+
}
|
94
|
+
|
95
|
+
.notfound a:hover {
|
96
|
+
color: #ff6300;
|
97
|
+
background: #211b19;
|
98
|
+
}
|
99
|
+
|
100
|
+
@media only screen and (max-width: 767px) {
|
101
|
+
.notfound .notfound-404 h1 {
|
102
|
+
font-size: 148px;
|
103
|
+
}
|
104
|
+
}
|
105
|
+
|
106
|
+
@media only screen and (max-width: 480px) {
|
107
|
+
.notfound .notfound-404 {
|
108
|
+
height: 148px;
|
109
|
+
margin: 0px auto 10px;
|
110
|
+
}
|
111
|
+
.notfound .notfound-404 h1 {
|
112
|
+
font-size: 86px;
|
113
|
+
}
|
114
|
+
.notfound .notfound-404 h2 {
|
115
|
+
font-size: 16px;
|
116
|
+
}
|
117
|
+
.notfound a {
|
118
|
+
padding: 7px 15px;
|
119
|
+
font-size: 14px;
|
120
|
+
}
|
121
|
+
}
|
122
|
+
</style>
|
123
|
+
|