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.
Files changed (194) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +32 -0
  4. data/Rakefile +32 -0
  5. data/app/assets/config/rails_base/manifest.js +3 -0
  6. data/app/assets/images/rails_base/favicon.ico +0 -0
  7. data/app/assets/javascripts/rails_base/admin.js +2 -0
  8. data/app/assets/javascripts/rails_base/application.js +22 -0
  9. data/app/assets/javascripts/rails_base/cable.js +13 -0
  10. data/app/assets/javascripts/rails_base/mfa_auth.coffee +3 -0
  11. data/app/assets/javascripts/rails_base/secondary_authentication.coffee +3 -0
  12. data/app/assets/javascripts/rails_base/sessions.js +152 -0
  13. data/app/assets/javascripts/rails_base/user_settings.coffee +3 -0
  14. data/app/assets/stylesheets/rails_base/admin.css +4 -0
  15. data/app/assets/stylesheets/rails_base/application.scss +15 -0
  16. data/app/assets/stylesheets/rails_base/mfa_auth.scss +3 -0
  17. data/app/assets/stylesheets/rails_base/scaffolds.scss +84 -0
  18. data/app/assets/stylesheets/rails_base/secondary_authentication.scss +3 -0
  19. data/app/assets/stylesheets/rails_base/user_settings.scss +3 -0
  20. data/app/controllers/rails_base/admin_controller.rb +315 -0
  21. data/app/controllers/rails_base/application_controller.rb +153 -0
  22. data/app/controllers/rails_base/errors_controller.rb +29 -0
  23. data/app/controllers/rails_base/mfa_auth_controller.rb +50 -0
  24. data/app/controllers/rails_base/secondary_authentication_controller.rb +224 -0
  25. data/app/controllers/rails_base/switch_user_controller.rb +29 -0
  26. data/app/controllers/rails_base/user_settings_controller.rb +81 -0
  27. data/app/controllers/rails_base/users/passwords_controller.rb +19 -0
  28. data/app/controllers/rails_base/users/registrations_controller.rb +80 -0
  29. data/app/controllers/rails_base/users/sessions_controller.rb +108 -0
  30. data/app/helpers/rails_base/admin_helper.rb +107 -0
  31. data/app/helpers/rails_base/appearance_helper.rb +58 -0
  32. data/app/helpers/rails_base/application_helper.rb +26 -0
  33. data/app/helpers/rails_base/capture_reference_helper.rb +57 -0
  34. data/app/helpers/rails_base/mfa_auth_helper.rb +2 -0
  35. data/app/helpers/rails_base/secondary_authentication_helper.rb +2 -0
  36. data/app/helpers/rails_base/user_field_validators.rb +108 -0
  37. data/app/helpers/rails_base/user_settings_helper.rb +22 -0
  38. data/app/jobs/rails_base/application_job.rb +10 -0
  39. data/app/jobs/twilio_job.rb +9 -0
  40. data/app/mailers/rails_base/application_mailer.rb +9 -0
  41. data/app/mailers/rails_base/email_verification_mailer.rb +22 -0
  42. data/app/mailers/rails_base/event_mailer.rb +16 -0
  43. data/app/models/admin_action.rb +119 -0
  44. data/app/models/rails_base/application_record.rb +22 -0
  45. data/app/models/rails_base/user_constants.rb +28 -0
  46. data/app/models/secret.rb +37 -0
  47. data/app/models/short_lived_data.rb +132 -0
  48. data/app/models/user.rb +143 -0
  49. data/app/services/rails_base/admin_risky_mfa_send.rb +80 -0
  50. data/app/services/rails_base/admin_update_attribute.rb +100 -0
  51. data/app/services/rails_base/authentication/authenticate_user.rb +28 -0
  52. data/app/services/rails_base/authentication/constants.rb +60 -0
  53. data/app/services/rails_base/authentication/decision_twofa_type.rb +76 -0
  54. data/app/services/rails_base/authentication/destroy_user.rb +45 -0
  55. data/app/services/rails_base/authentication/mfa_set_encrypt_token.rb +32 -0
  56. data/app/services/rails_base/authentication/mfa_validator.rb +88 -0
  57. data/app/services/rails_base/authentication/modify_password.rb +67 -0
  58. data/app/services/rails_base/authentication/send_forgot_password.rb +26 -0
  59. data/app/services/rails_base/authentication/send_login_mfa_to_user.rb +77 -0
  60. data/app/services/rails_base/authentication/send_verification_email.rb +103 -0
  61. data/app/services/rails_base/authentication/session_token_verifier.rb +31 -0
  62. data/app/services/rails_base/authentication/single_sign_on_create.rb +44 -0
  63. data/app/services/rails_base/authentication/single_sign_on_send.rb +101 -0
  64. data/app/services/rails_base/authentication/single_sign_on_verify.rb +42 -0
  65. data/app/services/rails_base/authentication/sso_verify_email.rb +43 -0
  66. data/app/services/rails_base/authentication/update_phone_send_verification.rb +46 -0
  67. data/app/services/rails_base/authentication/verify_forgot_password.rb +46 -0
  68. data/app/services/rails_base/email_change.rb +20 -0
  69. data/app/services/rails_base/encryption.rb +87 -0
  70. data/app/services/rails_base/name_change.rb +71 -0
  71. data/app/services/rails_base/service_base.rb +65 -0
  72. data/app/services/rails_base/service_logging.rb +23 -0
  73. data/app/views/layouts/rails_base/application.html.erb +185 -0
  74. data/app/views/layouts/rails_base/mailer.html.erb +13 -0
  75. data/app/views/layouts/rails_base/mailer.text.erb +1 -0
  76. data/app/views/new.html.erb +4 -0
  77. data/app/views/rails_base/admin/history.html.erb +26 -0
  78. data/app/views/rails_base/admin/index.html.erb +149 -0
  79. data/app/views/rails_base/admin/show_config.html.erb +18 -0
  80. data/app/views/rails_base/devise/confirmations/new.html.erb +16 -0
  81. data/app/views/rails_base/devise/mailer/confirmation_instructions.html.erb +5 -0
  82. data/app/views/rails_base/devise/mailer/email_changed.html.erb +7 -0
  83. data/app/views/rails_base/devise/mailer/password_change.html.erb +3 -0
  84. data/app/views/rails_base/devise/mailer/reset_password_instructions.html.erb +8 -0
  85. data/app/views/rails_base/devise/mailer/unlock_instructions.html.erb +7 -0
  86. data/app/views/rails_base/devise/passwords/edit.html.erb +25 -0
  87. data/app/views/rails_base/devise/passwords/new.html.erb +27 -0
  88. data/app/views/rails_base/devise/registrations/edit.html.erb +43 -0
  89. data/app/views/rails_base/devise/registrations/new.html.erb +123 -0
  90. data/app/views/rails_base/devise/sessions/new.html.erb +4 -0
  91. data/app/views/rails_base/devise/shared/_error_messages.html.erb +15 -0
  92. data/app/views/rails_base/devise/shared/_links.html.erb +25 -0
  93. data/app/views/rails_base/devise/unlocks/new.html.erb +16 -0
  94. data/app/views/rails_base/email_verification_mailer/email_verification.html.erb +25 -0
  95. data/app/views/rails_base/email_verification_mailer/event.html.erb +20 -0
  96. data/app/views/rails_base/email_verification_mailer/forgot_password.html.erb +22 -0
  97. data/app/views/rails_base/errors/internal_error.html.erb +1 -0
  98. data/app/views/rails_base/errors/not_found.html.erb +1 -0
  99. data/app/views/rails_base/errors/unacceptable.html.erb +1 -0
  100. data/app/views/rails_base/event_mailer/event.html.erb +10 -0
  101. data/app/views/rails_base/mfa_auth/mfa_code.html.erb +10 -0
  102. data/app/views/rails_base/secondary_authentication/after_email_login_session_new.html.erb +3 -0
  103. data/app/views/rails_base/secondary_authentication/forgot_password.html.erb +9 -0
  104. data/app/views/rails_base/secondary_authentication/remove_me.html.erb +1 -0
  105. data/app/views/rails_base/secondary_authentication/static.html.erb +5 -0
  106. data/app/views/rails_base/shared/_admin_actions_modal.html.erb +65 -0
  107. data/app/views/rails_base/shared/_admin_config_class.html.erb +52 -0
  108. data/app/views/rails_base/shared/_admin_history.html.erb +86 -0
  109. data/app/views/rails_base/shared/_admin_modify_email.html.erb +78 -0
  110. data/app/views/rails_base/shared/_admin_modify_name.html.erb +107 -0
  111. data/app/views/rails_base/shared/_admin_modify_phone.html.erb +87 -0
  112. data/app/views/rails_base/shared/_admin_modify_text.html.erb +35 -0
  113. data/app/views/rails_base/shared/_admin_risky_change.html.erb +57 -0
  114. data/app/views/rails_base/shared/_admin_risky_mfa.html.erb +74 -0
  115. data/app/views/rails_base/shared/_admin_selector_dropdown.html.erb +70 -0
  116. data/app/views/rails_base/shared/_admin_toggle_button.html.erb +72 -0
  117. data/app/views/rails_base/shared/_admin_warning_alert.html.erb +7 -0
  118. data/app/views/rails_base/shared/_appearance_mode_selector.html.erb +183 -0
  119. data/app/views/rails_base/shared/_custom_form_validation_javascript.html.erb +129 -0
  120. data/app/views/rails_base/shared/_enable_mfa_auth_modal.html.erb +105 -0
  121. data/app/views/rails_base/shared/_error_pages.html.erb +123 -0
  122. data/app/views/rails_base/shared/_logged_in_header.html.erb +123 -0
  123. data/app/views/rails_base/shared/_logged_out_header.html.erb +14 -0
  124. data/app/views/rails_base/shared/_mfa_input_layout.html.erb +5 -0
  125. data/app/views/rails_base/shared/_mfa_input_layout_default.html.erb +97 -0
  126. data/app/views/rails_base/shared/_mfa_input_layout_fallback.html.erb +55 -0
  127. data/app/views/rails_base/shared/_modify_mfa_auth_modal.html.erb +20 -0
  128. data/app/views/rails_base/shared/_password_confirm_javascript.html.erb +71 -0
  129. data/app/views/rails_base/shared/_reset_password_form.html.erb +111 -0
  130. data/app/views/rails_base/shared/_session_create_form.html.erb +32 -0
  131. data/app/views/rails_base/shared/_session_timeout_modal.html.erb +76 -0
  132. data/app/views/rails_base/switch_user/_widget.html.erb +5 -0
  133. data/app/views/rails_base/user_settings/_confirm_destroy_user.html.erb +42 -0
  134. data/app/views/rails_base/user_settings/_destroy_user.html.erb +106 -0
  135. data/app/views/rails_base/user_settings/_modify_name.html.erb +71 -0
  136. data/app/views/rails_base/user_settings/_modify_password.html.erb +101 -0
  137. data/app/views/rails_base/user_settings/_modify_password_update_password.html.erb +2 -0
  138. data/app/views/rails_base/user_settings/index.html.erb +54 -0
  139. data/config/initializers/01_rails_config.rb +19 -0
  140. data/config/initializers/admin_action_helper.rb +88 -0
  141. data/config/initializers/browser.rb +4 -0
  142. data/config/initializers/default_logged_in_headers.rb +23 -0
  143. data/config/initializers/devise.rb +314 -0
  144. data/config/initializers/encryption.rb +2 -0
  145. data/config/initializers/switch_user.rb +58 -0
  146. data/config/initializers/switch_user_helper.rb +29 -0
  147. data/config/locales/devise.en.yml +65 -0
  148. data/config/locales/en.yml +58 -0
  149. data/config/routes.rb +114 -0
  150. data/db/migrate/20210212175453_devise_create_rails_base_users.rb +56 -0
  151. data/db/migrate/20210212190537_create_rails_base_short_lived_data.rb +19 -0
  152. data/db/migrate/20210212192645_create_rails_base_secrets.rb +11 -0
  153. data/db/migrate/20210406015744_create_rails_base_admin_actions.rb +17 -0
  154. data/db/seeds.rb +23 -0
  155. data/lib/link_decision_helper.rb +71 -0
  156. data/lib/rails_base.rb +50 -0
  157. data/lib/rails_base/admin/action_cache.rb +99 -0
  158. data/lib/rails_base/admin/action_helper.rb +134 -0
  159. data/lib/rails_base/admin/default_index_tile.rb +176 -0
  160. data/lib/rails_base/admin/index_tile.rb +186 -0
  161. data/lib/rails_base/config.rb +52 -0
  162. data/lib/rails_base/configuration/active_job.rb +38 -0
  163. data/lib/rails_base/configuration/admin.rb +231 -0
  164. data/lib/rails_base/configuration/app.rb +52 -0
  165. data/lib/rails_base/configuration/appearance.rb +131 -0
  166. data/lib/rails_base/configuration/authentication.rb +37 -0
  167. data/lib/rails_base/configuration/base.rb +209 -0
  168. data/lib/rails_base/configuration/display/background_color.rb +25 -0
  169. data/lib/rails_base/configuration/display/btn_danger.rb +25 -0
  170. data/lib/rails_base/configuration/display/btn_dark.rb +25 -0
  171. data/lib/rails_base/configuration/display/btn_info.rb +25 -0
  172. data/lib/rails_base/configuration/display/btn_light.rb +25 -0
  173. data/lib/rails_base/configuration/display/btn_primary.rb +25 -0
  174. data/lib/rails_base/configuration/display/btn_secondary.rb +25 -0
  175. data/lib/rails_base/configuration/display/btn_success.rb +25 -0
  176. data/lib/rails_base/configuration/display/btn_warning.rb +25 -0
  177. data/lib/rails_base/configuration/display/footer.rb +54 -0
  178. data/lib/rails_base/configuration/display/navbar.rb +25 -0
  179. data/lib/rails_base/configuration/display/table_body.rb +25 -0
  180. data/lib/rails_base/configuration/display/table_header.rb +25 -0
  181. data/lib/rails_base/configuration/display/text.rb +26 -0
  182. data/lib/rails_base/configuration/exceptions_app.rb +25 -0
  183. data/lib/rails_base/configuration/login_behavior.rb +17 -0
  184. data/lib/rails_base/configuration/mailer.rb +116 -0
  185. data/lib/rails_base/configuration/mfa.rb +84 -0
  186. data/lib/rails_base/configuration/owner.rb +17 -0
  187. data/lib/rails_base/configuration/redis.rb +29 -0
  188. data/lib/rails_base/configuration/user.rb +43 -0
  189. data/lib/rails_base/engine.rb +51 -0
  190. data/lib/rails_base/version.rb +10 -0
  191. data/lib/tasks/rails_base_tasks.rake +4 -0
  192. data/lib/twilio_helper.rb +26 -0
  193. data/lib/velocity_limiter.rb +91 -0
  194. metadata +619 -0
@@ -0,0 +1,7 @@
1
+ <h4 class="alert-heading text-center">!&iexcl; Warning !&iexcl;</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">&times;</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">&times;</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
+