tb_core 1.4.5 → 1.4.6

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 119d2b18447e11794e3242645aacd697afa47258
4
- data.tar.gz: 90fa0a23e723b28b1a597bed200157783252ed43
3
+ metadata.gz: df57df79c7de9d2b469be1b10dbf13768c0618fc
4
+ data.tar.gz: dcfad21bb4faad94fa53f152d377fe8d894cb9a8
5
5
  SHA512:
6
- metadata.gz: 66144e84faacb6b62cb9ee33ea90342b6cb426238a7d41ab75aa09c2b644be8a5e3fe48a0a767d2add4c82fb0b4222127bcce70ed60d7b9cb4e5b671f90def8f
7
- data.tar.gz: 3fb79b93110d12782939307eee24776d1bc0f1cd7c424e7a90f2252aeb5bc9bdb345d6760a552afc1d5e086ff19f29af7ec4859d31a5349e6b4e5e4dfe16c5ae
6
+ metadata.gz: 6c0b426a055515c34d662e6275dc4b24f09ee6caec1d8e12587fd54c51ca360c437b3277daf43eb1422c0f706c017270eeab6ed697579a6760ac4145dca97c40
7
+ data.tar.gz: 334d22e9f1e97cf378d256b1fa34e28609589c311bba1b952d3aa526801060249830702582aa66a4610b1510418ee3f047203c047ed79c703b33c797e716ef40
data/Rakefile CHANGED
@@ -14,7 +14,7 @@ RDoc::Task.new(:rdoc) do |rdoc|
14
14
  rdoc.rdoc_files.include('lib/**/*.rb')
15
15
  end
16
16
 
17
- APP_RAKEFILE = File.expand_path('../spec/dummy/Rakefile', __FILE__)
17
+ APP_RAKEFILE = File.expand_path('spec/dummy/Rakefile', __dir__)
18
18
  load 'rails/tasks/engine.rake'
19
19
 
20
20
  load 'rails/tasks/statistics.rake'
@@ -34,9 +34,7 @@ class Admin::RolesController < Admin::ApplicationController
34
34
 
35
35
  def update
36
36
  #role_params[:permission_tags] ||= []
37
- if @role.update_attributes(role_params)
38
- flash[:notice] = 'SpudRole updated successfully'
39
- end
37
+ flash[:notice] = 'SpudRole updated successfully' if @role.update(role_params)
40
38
  respond_with @role, location: admin_roles_path
41
39
  end
42
40
 
@@ -13,14 +13,14 @@ class Admin::SettingsController < Admin::ApplicationController
13
13
  end
14
14
 
15
15
  def update
16
- if check_password && @current_user.update_attributes(user_params)
16
+ if check_password && @current_user.update(user_params)
17
17
  if user_params.include?(:password)
18
18
  SpudUserSession.create(@current_user)
19
19
  end
20
20
  flash[:notice] = 'User settings saved successfully.'
21
21
  respond_with @current_user, location: admin_settings_path
22
22
  else
23
- render 'edit', status: 401
23
+ render 'edit', status: :unauthorized
24
24
  end
25
25
  end
26
26
 
@@ -18,7 +18,7 @@ class Admin::SetupController < Admin::ApplicationController
18
18
  SpudUserSession.create(@spud_user)
19
19
  redirect_to admin_root_path
20
20
  else
21
- render 'new', status: 422
21
+ render 'new', status: :unprocessable_entity
22
22
  end
23
23
  end
24
24
 
@@ -63,7 +63,7 @@ class Admin::UsersController < Admin::ApplicationController
63
63
  end
64
64
 
65
65
  def update
66
- if @user.update_attributes(user_params)
66
+ if @user.update(user_params)
67
67
  if @user == current_user && user_params[:password].present?
68
68
  SpudUserSession.create(@user)
69
69
  end
@@ -75,7 +75,7 @@ class Admin::UsersController < Admin::ApplicationController
75
75
  @user.destroy
76
76
  respond_with @user, location: admin_users_path do |format|
77
77
  format.js{
78
- render nothing: true, status: 200
78
+ render nothing: true, status: :ok
79
79
  }
80
80
  end
81
81
  end
@@ -35,8 +35,8 @@ module TbCore
35
35
  end
36
36
  end
37
37
 
38
- def handle_record_not_found(e)
39
- error = NotFoundError.new(class_string(e.model))
38
+ def handle_record_not_found(exception)
39
+ error = NotFoundError.new(class_string(exception.model))
40
40
  handle_request_error(error)
41
41
  end
42
42
 
@@ -50,8 +50,8 @@ module TbCore
50
50
  string
51
51
  end
52
52
 
53
- def handle_unknown_format_error(_e)
54
- error = NotFoundError.new()
53
+ def handle_unknown_format_error(_exception)
54
+ error = NotFoundError.new
55
55
  handle_request_error(error)
56
56
  end
57
57
  end
@@ -14,7 +14,7 @@ class UserSessionsController < ApplicationController
14
14
  end
15
15
 
16
16
  def create
17
- @user_session = SpudUserSession.new(user_session_params)
17
+ @user_session = SpudUserSession.new(user_session_params.to_h)
18
18
  if @user_session.save()
19
19
  respond_with @user_session do |format|
20
20
  format.html{
@@ -50,7 +50,7 @@ class UserSessionsController < ApplicationController
50
50
  end
51
51
 
52
52
  def set_change_password
53
- current_user.update_attributes(change_password_params)
53
+ current_user.update(change_password_params)
54
54
  respond_with current_user do |format|
55
55
  format.html{
56
56
  if current_user.errors.any?
@@ -122,9 +122,7 @@ module TbCore
122
122
  end
123
123
 
124
124
  def unset_requires_password_change
125
- if password_changed? && !requires_password_change_changed?(to: true)
126
- self.requires_password_change = false
127
- end
125
+ self.requires_password_change = false if password_changed? && !requires_password_change_changed?(to: true)
128
126
  true
129
127
  end
130
128
  end
@@ -1,5 +1,5 @@
1
1
  class Spud::ControllerSpecGenerator < ::Rails::Generators::Base
2
- source_root File.expand_path('../templates', __FILE__)
2
+ source_root File.expand_path('templates', __dir__)
3
3
 
4
4
  argument :name, type: :string
5
5
  argument :string_attribute, type: :string
@@ -5,7 +5,7 @@ class Spud::ModuleGenerator < ::Rails::Generators::Base
5
5
  argument :module_name, type: :string
6
6
  argument :attributes, type: :array, default: [], banner: 'field[:type][:index] field[:type][:index]'
7
7
 
8
- source_root File.expand_path('../templates', __FILE__)
8
+ source_root File.expand_path('templates', __dir__)
9
9
 
10
10
  def create_module
11
11
  install_templates
@@ -1,6 +1,6 @@
1
1
  class Spud::SetupGenerator < ::Rails::Generators::Base
2
2
  desc 'Base setup for a new TB application'
3
- source_root File.expand_path('../templates', __FILE__)
3
+ source_root File.expand_path('templates', __dir__)
4
4
 
5
5
  def setup
6
6
  if ask(
@@ -16,9 +16,7 @@ class Spud::SetupGenerator < ::Rails::Generators::Base
16
16
  environment(spud_core_configs())
17
17
  rake('railties:install:migrations')
18
18
 
19
- if ask('Migrate the database?', limited_to: ['y', 'n']).downcase == 'y'
20
- rake('db:migrate')
21
- end
19
+ rake('db:migrate') if ask('Migrate the database?', limited_to: ['y', 'n']).downcase == 'y'
22
20
  end
23
21
 
24
22
  private
@@ -18,7 +18,7 @@ module TbCore
18
18
  # only: An array of controller actions you want this to apply to (optional)
19
19
  #
20
20
  def belongs_to_app(name, page_title: nil, only: nil)
21
- before_action ->(){
21
+ before_action ->{
22
22
  act_as_app(name, page_title: page_title)
23
23
  }, only: only
24
24
  end
@@ -49,9 +49,7 @@ module TbCore
49
49
 
50
50
  initializer 'tb_core.catch_all_route' do |config|
51
51
  # Handle 404 errors if Spud::Cms is not installed
52
- unless defined?(Spud::Cms)
53
- config.routes_reloader.paths << File.expand_path('../catch_all_route.rb', __FILE__)
54
- end
52
+ config.routes_reloader.paths << File.expand_path('catch_all_route.rb', __dir__) unless defined?(Spud::Cms)
55
53
  end
56
54
 
57
55
  initializer 'tb_core.assets' do
@@ -9,15 +9,15 @@ module Spud
9
9
  end
10
10
 
11
11
  def load_specs
12
- Dir[File.join(File.expand_path('../../../', __FILE__), 'spec/**/*_spec.rb')].each {|f| require f}
12
+ Dir[File.join(File.expand_path('../..', __dir__), 'spec/**/*_spec.rb')].each {|f| require f}
13
13
  end
14
14
 
15
15
  def load_factories
16
- Dir[File.join(File.expand_path('../../../', __FILE__), 'factories/*')].each {|f| require f}
16
+ Dir[File.join(File.expand_path('../..', __dir__), 'factories/*')].each {|f| require f}
17
17
  end
18
18
 
19
19
  def load_support
20
- Dir[File.join(File.expand_path('../../../', __FILE__), 'spec/support/**/*.rb')].each {|f| require f}
20
+ Dir[File.join(File.expand_path('../..', __dir__), 'spec/support/**/*.rb')].each {|f| require f}
21
21
  end
22
22
  end
23
23
  end
@@ -1,7 +1,7 @@
1
1
  require 'authlogic/test_case'
2
- include Authlogic::TestCase
3
2
 
4
3
  module TbCore::SessionHelper
4
+ include Authlogic::TestCase
5
5
 
6
6
  # Use this helper in controller specs to establish a login session
7
7
  # - admin: Set to true to create a super_admin
@@ -21,7 +21,7 @@ module TbCore::SessionHelper
21
21
  end
22
22
 
23
23
  # Returns the current user
24
- #
24
+ #
25
25
  def current_user
26
26
  return @user
27
27
  end
@@ -37,6 +37,4 @@ end
37
37
 
38
38
  # Auto load the spud_user factory if FactoryBot is in use
39
39
  #
40
- if defined?(FactoryBot)
41
- Dir[TbCore::Engine.root.join('spec/factories/spud_user_factories.rb')].each{ |f| require f }
42
- end
40
+ Dir[TbCore::Engine.root.join('spec/factories/spud_user_factories.rb')].each{ |f| require f } if defined?(FactoryBot)
@@ -1,3 +1,3 @@
1
1
  module TbCore
2
- VERSION = '1.4.5'.freeze
2
+ VERSION = '1.4.6'.freeze
3
3
  end
@@ -17,7 +17,7 @@ RSpec.describe Admin::ApplicationController, type: :controller do
17
17
  end
18
18
 
19
19
  it 'should respond successfully if the current user is a super admin' do
20
- @user.update_attributes(super_admin: true)
20
+ @user.update(super_admin: true)
21
21
  get :index
22
22
  expect(response).to be_success
23
23
  end
@@ -66,14 +66,14 @@ describe SpudUser, type: :model do
66
66
  it 'should not unset the requires_password_change flag' do
67
67
  u = FactoryBot.create(:spud_user, requires_password_change: true)
68
68
  expect{
69
- u.update_attributes(first_name: 'updated')
69
+ u.update(first_name: 'updated')
70
70
  }.to_not change(u, :requires_password_change)
71
71
  end
72
72
 
73
73
  it 'should unset the requires_password_change flag' do
74
74
  u = FactoryBot.create(:spud_user, requires_password_change: true)
75
75
  expect{
76
- u.update_attributes(password: 'new password', password_confirmation: 'new password')
76
+ u.update(password: 'new password', password_confirmation: 'new password')
77
77
  u.reload
78
78
  }.to change(u, :requires_password_change).from(true).to(false)
79
79
  end
data/spec/rails_helper.rb CHANGED
@@ -4,7 +4,7 @@ SimpleCov.start 'rails'
4
4
  # This file is copied to spec/ when you run 'rails generate rspec:install'
5
5
  ENV['RAILS_ENV'] ||= 'test'
6
6
 
7
- require File.expand_path('../dummy/config/environment.rb', __FILE__)
7
+ require File.expand_path('dummy/config/environment.rb', __dir__)
8
8
  require 'spec_helper'
9
9
  require 'tb_core/test_helper'
10
10
  require 'rails-controller-testing'
@@ -0,0 +1,534 @@
1
+ /******/ (function(modules) { // webpackBootstrap
2
+ /******/ // The module cache
3
+ /******/ var installedModules = {};
4
+ /******/
5
+ /******/ // The require function
6
+ /******/ function __webpack_require__(moduleId) {
7
+ /******/
8
+ /******/ // Check if module is in cache
9
+ /******/ if(installedModules[moduleId]) {
10
+ /******/ return installedModules[moduleId].exports;
11
+ /******/ }
12
+ /******/ // Create a new module (and put it into the cache)
13
+ /******/ var module = installedModules[moduleId] = {
14
+ /******/ i: moduleId,
15
+ /******/ l: false,
16
+ /******/ exports: {}
17
+ /******/ };
18
+ /******/
19
+ /******/ // Execute the module function
20
+ /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
21
+ /******/
22
+ /******/ // Flag the module as loaded
23
+ /******/ module.l = true;
24
+ /******/
25
+ /******/ // Return the exports of the module
26
+ /******/ return module.exports;
27
+ /******/ }
28
+ /******/
29
+ /******/
30
+ /******/ // expose the modules object (__webpack_modules__)
31
+ /******/ __webpack_require__.m = modules;
32
+ /******/
33
+ /******/ // expose the module cache
34
+ /******/ __webpack_require__.c = installedModules;
35
+ /******/
36
+ /******/ // define getter function for harmony exports
37
+ /******/ __webpack_require__.d = function(exports, name, getter) {
38
+ /******/ if(!__webpack_require__.o(exports, name)) {
39
+ /******/ Object.defineProperty(exports, name, {
40
+ /******/ configurable: false,
41
+ /******/ enumerable: true,
42
+ /******/ get: getter
43
+ /******/ });
44
+ /******/ }
45
+ /******/ };
46
+ /******/
47
+ /******/ // getDefaultExport function for compatibility with non-harmony modules
48
+ /******/ __webpack_require__.n = function(module) {
49
+ /******/ var getter = module && module.__esModule ?
50
+ /******/ function getDefault() { return module['default']; } :
51
+ /******/ function getModuleExports() { return module; };
52
+ /******/ __webpack_require__.d(getter, 'a', getter);
53
+ /******/ return getter;
54
+ /******/ };
55
+ /******/
56
+ /******/ // Object.prototype.hasOwnProperty.call
57
+ /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
58
+ /******/
59
+ /******/ // __webpack_public_path__
60
+ /******/ __webpack_require__.p = "";
61
+ /******/
62
+ /******/ // Load entry module and return exports
63
+ /******/ return __webpack_require__(__webpack_require__.s = 1);
64
+ /******/ })
65
+ /************************************************************************/
66
+ /******/ ([
67
+ /* 0 */
68
+ /***/ (function(module, exports, __webpack_require__) {
69
+
70
+ "use strict";
71
+
72
+
73
+ Object.defineProperty(exports, "__esModule", {
74
+ value: true
75
+ });
76
+ /*
77
+ * Build a path for redirection.
78
+ *
79
+ * - Adds a timestamp GET param for cache busting
80
+ * - Inserts an ID attribute if necessary
81
+ */
82
+ var buildSuccessPath = exports.buildSuccessPath = function buildSuccessPath(path, json) {
83
+ var timestamp = new Date().valueOf();
84
+ if (path.indexOf('?') > -1) {
85
+ path += '&t=' + timestamp;
86
+ } else {
87
+ path += '?t=' + timestamp;
88
+ }
89
+ if (json && json.id) {
90
+ path = path.replace(':id', json.id);
91
+ }
92
+ return path;
93
+ };
94
+
95
+ /*
96
+ * Remote element
97
+ */
98
+ var removeElement = exports.removeElement = function removeElement(element) {
99
+ element.parentElement.removeChild(element);
100
+ };
101
+
102
+ /*
103
+ * Create an error element
104
+ */
105
+ var createErrorParagraph = exports.createErrorParagraph = function createErrorParagraph(text, base) {
106
+ var p = document.createElement('p');
107
+ p.classList.add('form-error');
108
+ p.classList.add(base ? 'form-error-base' : 'form-error-inline');
109
+ p.innerText = text;
110
+ return p;
111
+ };
112
+
113
+ /*
114
+ * Convert a query into an array of elements
115
+ */
116
+ var querySelectorArray = exports.querySelectorArray = function querySelectorArray(parent, selector) {
117
+ var query = parent.querySelectorAll(selector);
118
+ var array = Array.prototype.slice.call(query);
119
+ return array;
120
+ };
121
+
122
+ /*
123
+ * Take a single error message and format it as if it were
124
+ * a json error coming from the server
125
+ */
126
+ var formatStringAsErrors = exports.formatStringAsErrors = function formatStringAsErrors(errorString) {
127
+ return { base: [errorString] };
128
+ };
129
+
130
+ /*
131
+ * Return true if the element is in view
132
+ */
133
+ var elementIsInView = exports.elementIsInView = function elementIsInView(el) {
134
+ var rect = el.getBoundingClientRect();
135
+ var w = window,
136
+ d = document;
137
+ return rect.top >= 0 && rect.left >= 0 && rect.bottom <= (w.innerHeight || d.documentElement.clientHeight) && rect.right <= (w.innerWidth || d.documentElement.clientWidth);
138
+ };
139
+
140
+ /***/ }),
141
+ /* 1 */
142
+ /***/ (function(module, exports, __webpack_require__) {
143
+
144
+ "use strict";
145
+
146
+
147
+ var _handlers = __webpack_require__(2);
148
+
149
+ var handlers = _interopRequireWildcard(_handlers);
150
+
151
+ function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
152
+
153
+ var MODULE_LOADED = '_rails_validator_loaded';
154
+
155
+ var init = function init() {
156
+ window[MODULE_LOADED] = true;
157
+ addListener('form', 'ajax:before', handlers.onRemoteFormBefore);
158
+ addListener('form[data-success], a[data-success]', 'ajax:success', handlers.onRemoteFormSuccess);
159
+ addListener('form[data-errors]', 'ajax:error', handlers.onRemoteFormErrors);
160
+ };
161
+
162
+ var addListener = function addListener(selector, event, fn) {
163
+ document.addEventListener(event, function (e) {
164
+ if (e.target.matches(selector)) {
165
+ e.stopPropagation();
166
+ fn.call(e.target, e);
167
+ }
168
+ });
169
+ };
170
+
171
+ if (!window[MODULE_LOADED]) {
172
+ init();
173
+ }
174
+
175
+ // https://developer.mozilla.org/en-US/docs/Web/API/Element/matches
176
+ if (!Element.prototype.matches) {
177
+ Element.prototype.matches = Element.prototype.msMatchesSelector || Element.prototype.webkitMatchesSelector;
178
+ }
179
+
180
+ /***/ }),
181
+ /* 2 */
182
+ /***/ (function(module, exports, __webpack_require__) {
183
+
184
+ "use strict";
185
+
186
+
187
+ Object.defineProperty(exports, "__esModule", {
188
+ value: true
189
+ });
190
+ exports.onRemoteFormErrors = exports.onRemoteFormSuccess = exports.onRemoteFormBefore = undefined;
191
+
192
+ var _errors = __webpack_require__(3);
193
+
194
+ var errors = _interopRequireWildcard(_errors);
195
+
196
+ var _helpers = __webpack_require__(0);
197
+
198
+ var helpers = _interopRequireWildcard(_helpers);
199
+
200
+ function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
201
+
202
+ /*
203
+ * Tell the server we want a json response
204
+ */
205
+ var onRemoteFormBefore = exports.onRemoteFormBefore = function onRemoteFormBefore(event) {
206
+ var form = event.target;
207
+ if (form.getAttribute('data-type') === null) {
208
+ form.setAttribute('data-type', 'json');
209
+ }
210
+ };
211
+
212
+ /*
213
+ * Called when a remote form is submitted with a data-success configured
214
+ * Redirects to the configured path, or reloads the page if "reload" is passed
215
+ *
216
+ * ie:
217
+ * <form action="..." data-remote="true" data-success="/path/for/success/:id">
218
+ */
219
+ var onRemoteFormSuccess = exports.onRemoteFormSuccess = function onRemoteFormSuccess(event) {
220
+ var form = event.target;
221
+ var successPath = form.getAttribute('data-success');
222
+ if (successPath === 'reload') {
223
+ window.location.reload(true);
224
+ } else {
225
+ var json = event.detail[0];
226
+ window.location = helpers.buildSuccessPath(successPath, json);
227
+ }
228
+ };
229
+
230
+ /*
231
+ * Called when a remote form is submitted and the server has returned an
232
+ * error, only if the form has a data-errors attribute
233
+ *
234
+ * ie:
235
+ * <form action="..." data-remote="true" data-errors="inline">
236
+ * - OR -
237
+ * <form action="..." data-remote="true" data-errors="alert">
238
+ */
239
+ var onRemoteFormErrors = exports.onRemoteFormErrors = function onRemoteFormErrors(event) {
240
+ var json = event.detail[0];
241
+ var xhr = event.detail[2];
242
+ var form = event.target;
243
+ var errorType = form.getAttribute('data-errors');
244
+
245
+ if (xhr.status === 422) {
246
+ if (errorType === 'inline') {
247
+ errors.displayErrorsInline(form, json);
248
+ } else {
249
+ errors.displayErrorsAlert(json);
250
+ }
251
+ } else if (xhr.status === 401 || xhr.status === 403) {
252
+ window.alert('Error: Access denied.');
253
+ } else {
254
+ var errorThrown = event.detail[1];
255
+ window.alert('An unexpected error occurred: ' + errorThrown);
256
+ }
257
+ };
258
+
259
+ /***/ }),
260
+ /* 3 */
261
+ /***/ (function(module, exports, __webpack_require__) {
262
+
263
+ "use strict";
264
+
265
+
266
+ Object.defineProperty(exports, "__esModule", {
267
+ value: true
268
+ });
269
+ exports.displayErrorsAlert = exports.displayErrorsInline = exports.clearErrors = undefined;
270
+
271
+ var _helpers = __webpack_require__(0);
272
+
273
+ var helpers = _interopRequireWildcard(_helpers);
274
+
275
+ var _case = __webpack_require__(4);
276
+
277
+ var _case2 = _interopRequireDefault(_case);
278
+
279
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
280
+
281
+ function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } }
282
+
283
+ /*
284
+ * Remove inline error messages
285
+ */
286
+ var clearErrors = exports.clearErrors = function clearErrors(form) {
287
+ helpers.querySelectorArray(form, '.form-error-inline, .form-error-base').forEach(helpers.removeElement);
288
+ };
289
+
290
+ /*
291
+ * Append error text to form input fields and scroll to the first error
292
+ */
293
+ var displayErrorsInline = exports.displayErrorsInline = function displayErrorsInline(form, json) {
294
+ if (typeof json === 'string') {
295
+ json = helpers.formatStringAsErrors(json);
296
+ }
297
+
298
+ clearErrors(form);
299
+ var errors = json.errors;
300
+
301
+ for (var key in errors) {
302
+ var messages = errors[key];
303
+ if (key === 'base') {
304
+ for (var i = 0; i < messages.length; i++) {
305
+ var p = helpers.createErrorParagraph(messages[i], true);
306
+ form.insertBefore(p, form.firstChild);
307
+ }
308
+ } else {
309
+ var input = void 0,
310
+ keyArr = void 0;
311
+ keyArr = key.split('.');
312
+
313
+ if (keyArr.length === 2) {
314
+ keyArr[0] += '_attributes';
315
+ input = form.querySelector('[name$=\'[' + keyArr.join('][') + ']\']');
316
+ } else {
317
+ var array = helpers.querySelectorArray(form, '[name$=\'[' + key + ']\']');
318
+ input = array.filter(function (input) {
319
+ // Filter out nested attribute inputs ie model[a][b]
320
+ return !input.name.match(/\]\[/);
321
+ })[0];
322
+ if (input === null && !key.match(/_id$/)) {
323
+ input = form.querySelector('[name$=\'[' + key + '_id]\']');
324
+ }
325
+ }
326
+
327
+ var message = messages[0];
328
+ if (input) {
329
+ input.parentNode.appendChild(helpers.createErrorParagraph(message));
330
+ } else {
331
+ // eslint-disable-next-line no-console
332
+ console.warn('Missing input field for key:', key);
333
+ form.insertBefore(helpers.createErrorParagraph(_case2.default.title(key) + ' ' + message), form.firstChild);
334
+ }
335
+ }
336
+ }
337
+
338
+ var firstError = form.querySelector('.form-error-inline, .form-error-base');
339
+ if (firstError && !helpers.elementIsInView(firstError) && typeof firstError.scrollIntoView === 'function') {
340
+ firstError.parentElement.scrollIntoView();
341
+ }
342
+ };
343
+
344
+ /*
345
+ * Display errors in a standard window.alert dialog
346
+ */
347
+ var displayErrorsAlert = exports.displayErrorsAlert = function displayErrorsAlert(json) {
348
+ if (typeof json === 'string') {
349
+ json = helpers.formatStringAsErrors(json);
350
+ }
351
+ var text = 'Please correct the following errors:\n';
352
+ var message = void 0,
353
+ errors = json.errors;
354
+ for (var key in errors) {
355
+ message = errors[key][0];
356
+ if (key === 'base') {
357
+ text += ' - ' + message + '\n';
358
+ } else {
359
+ text += ' - ' + _case2.default.title(key) + ' ' + message + '\n';
360
+ }
361
+ }
362
+ window.alert(text);
363
+ };
364
+
365
+ /***/ }),
366
+ /* 4 */
367
+ /***/ (function(module, exports) {
368
+
369
+ /*! Case - v1.5.3 - 2017-07-11
370
+ * Copyright (c) 2017 Nathan Bubna; Licensed MIT, GPL */
371
+ (function() {
372
+ "use strict";
373
+ var unicodes = function(s, prefix) {
374
+ prefix = prefix || '';
375
+ return s.replace(/(^|-)/g, '$1\\u'+prefix).replace(/,/g, '\\u'+prefix);
376
+ },
377
+ basicSymbols = unicodes('20-26,28-2F,3A-40,5B-60,7B-7E,A0-BF,D7,F7', '00'),
378
+ baseLowerCase = 'a-z'+unicodes('DF-F6,F8-FF', '00'),
379
+ baseUpperCase = 'A-Z'+unicodes('C0-D6,D8-DE', '00'),
380
+ improperInTitle = 'A|An|And|As|At|But|By|En|For|If|In|Of|On|Or|The|To|Vs?\\.?|Via',
381
+ regexps = function(symbols, lowers, uppers, impropers) {
382
+ symbols = symbols || basicSymbols;
383
+ lowers = lowers || baseLowerCase;
384
+ uppers = uppers || baseUpperCase;
385
+ impropers = impropers || improperInTitle;
386
+ return {
387
+ capitalize: new RegExp('(^|['+symbols+'])(['+lowers+'])', 'g'),
388
+ pascal: new RegExp('(^|['+symbols+'])+(['+lowers+uppers+'])', 'g'),
389
+ fill: new RegExp('['+symbols+']+(.|$)','g'),
390
+ sentence: new RegExp('(^\\s*|[\\?\\!\\.]+"?\\s+"?|,\\s+")(['+lowers+'])', 'g'),
391
+ improper: new RegExp('\\b('+impropers+')\\b', 'g'),
392
+ relax: new RegExp('([^'+uppers+'])(['+uppers+']*)(['+uppers+'])(?=['+lowers+']|$)', 'g'),
393
+ upper: new RegExp('^[^'+lowers+']+$'),
394
+ hole: /[^\s]\s[^\s]/,
395
+ apostrophe: /'/g,
396
+ room: new RegExp('['+symbols+']')
397
+ };
398
+ },
399
+ re = regexps(),
400
+ _ = {
401
+ re: re,
402
+ unicodes: unicodes,
403
+ regexps: regexps,
404
+ types: [],
405
+ up: String.prototype.toUpperCase,
406
+ low: String.prototype.toLowerCase,
407
+ cap: function(s) {
408
+ return _.up.call(s.charAt(0))+s.slice(1);
409
+ },
410
+ decap: function(s) {
411
+ return _.low.call(s.charAt(0))+s.slice(1);
412
+ },
413
+ deapostrophe: function(s) {
414
+ return s.replace(re.apostrophe, '');
415
+ },
416
+ fill: function(s, fill, deapostrophe) {
417
+ if (fill != null) {
418
+ s = s.replace(re.fill, function(m, next) {
419
+ return next ? fill + next : '';
420
+ });
421
+ }
422
+ if (deapostrophe) {
423
+ s = _.deapostrophe(s);
424
+ }
425
+ return s;
426
+ },
427
+ prep: function(s, fill, pascal, upper) {
428
+ s = s == null ? '' : s + '';// force to string
429
+ if (!upper && re.upper.test(s)) {
430
+ s = _.low.call(s);
431
+ }
432
+ if (!fill && !re.hole.test(s)) {
433
+ var holey = _.fill(s, ' ');
434
+ if (re.hole.test(holey)) {
435
+ s = holey;
436
+ }
437
+ }
438
+ if (!pascal && !re.room.test(s)) {
439
+ s = s.replace(re.relax, _.relax);
440
+ }
441
+ return s;
442
+ },
443
+ relax: function(m, before, acronym, caps) {
444
+ return before + ' ' + (acronym ? acronym+' ' : '') + caps;
445
+ }
446
+ },
447
+ Case = {
448
+ _: _,
449
+ of: function(s) {
450
+ for (var i=0,m=_.types.length; i<m; i++) {
451
+ if (Case[_.types[i]].apply(Case, arguments) === s){ return _.types[i]; }
452
+ }
453
+ },
454
+ flip: function(s) {
455
+ return s.replace(/\w/g, function(l) {
456
+ return (l == _.up.call(l) ? _.low : _.up).call(l);
457
+ });
458
+ },
459
+ random: function(s) {
460
+ return s.replace(/\w/g, function(l) {
461
+ return (Math.round(Math.random()) ? _.up : _.low).call(l);
462
+ });
463
+ },
464
+ type: function(type, fn) {
465
+ Case[type] = fn;
466
+ _.types.push(type);
467
+ }
468
+ },
469
+ types = {
470
+ lower: function(s, fill, deapostrophe) {
471
+ return _.fill(_.low.call(_.prep(s, fill)), fill, deapostrophe);
472
+ },
473
+ snake: function(s) {
474
+ return Case.lower(s, '_', true);
475
+ },
476
+ constant: function(s) {
477
+ return Case.upper(s, '_', true);
478
+ },
479
+ camel: function(s) {
480
+ return _.decap(Case.pascal(s));
481
+ },
482
+ kebab: function(s) {
483
+ return Case.lower(s, '-', true);
484
+ },
485
+ header: function(s) {
486
+ return Case.capital(s, '-', true);
487
+ },
488
+ upper: function(s, fill, deapostrophe) {
489
+ return _.fill(_.up.call(_.prep(s, fill, false, true)), fill, deapostrophe);
490
+ },
491
+ capital: function(s, fill, deapostrophe) {
492
+ return _.fill(_.prep(s).replace(re.capitalize, function(m, border, letter) {
493
+ return border+_.up.call(letter);
494
+ }), fill, deapostrophe);
495
+ },
496
+ pascal: function(s) {
497
+ return _.fill(_.prep(s, false, true).replace(re.pascal, function(m, border, letter) {
498
+ return _.up.call(letter);
499
+ }), '', true);
500
+ },
501
+ title: function(s) {
502
+ return Case.capital(s).replace(re.improper, function(small, p, i, s) {
503
+ return i > 0 && i < s.lastIndexOf(' ') ? _.low.call(small) : small;
504
+ });
505
+ },
506
+ sentence: function(s, names) {
507
+ s = Case.lower(s).replace(re.sentence, function(m, prelude, letter) {
508
+ return prelude + _.up.call(letter);
509
+ });
510
+ if (names) {
511
+ names.forEach(function(name) {
512
+ s = s.replace(new RegExp('\\b'+Case.lower(name)+'\\b', "g"), _.cap);
513
+ });
514
+ }
515
+ return s;
516
+ }
517
+ };
518
+
519
+ // TODO: Remove "squish" in a future breaking release.
520
+ types.squish = types.pascal;
521
+
522
+ for (var type in types) {
523
+ Case.type(type, types[type]);
524
+ }
525
+ // export Case (AMD, commonjs, or global)
526
+ var define = typeof define === "function" ? define : function(){};
527
+ define(typeof module === "object" && module.exports ? module.exports = Case : this.Case = Case);
528
+
529
+ }).call(this);
530
+
531
+
532
+ /***/ })
533
+ /******/ ]);
534
+ //# sourceMappingURL=rails-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["webpack:///webpack/bootstrap 54e2b37c7c9a37ac7b21","webpack:///./lib/helpers.js","webpack:///./lib/index.js","webpack:///./lib/handlers.js","webpack:///./lib/errors.js","webpack:///./node_modules/case/dist/Case.js"],"names":["buildSuccessPath","path","json","timestamp","Date","valueOf","indexOf","id","replace","removeElement","element","parentElement","removeChild","createErrorParagraph","text","base","p","document","createElement","classList","add","innerText","querySelectorArray","parent","selector","query","querySelectorAll","array","Array","prototype","slice","call","formatStringAsErrors","errorString","elementIsInView","el","rect","getBoundingClientRect","w","window","d","top","left","bottom","innerHeight","documentElement","clientHeight","right","innerWidth","clientWidth","handlers","MODULE_LOADED","init","addListener","onRemoteFormBefore","onRemoteFormSuccess","onRemoteFormErrors","event","fn","addEventListener","e","target","matches","stopPropagation","errors","helpers","form","getAttribute","setAttribute","successPath","location","reload","detail","xhr","errorType","status","displayErrorsInline","displayErrorsAlert","alert","errorThrown","clearErrors","forEach","key","messages","i","length","insertBefore","firstChild","input","keyArr","split","querySelector","join","filter","name","match","message","parentNode","appendChild","console","warn","title","firstError","scrollIntoView"],"mappings":"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AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA,wCAAwC;AACxC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,0CAA0C,KAAK;AAC/C,mEAAmE,mBAAmB;AACtF;AACA,SAAS;AACT;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA;AACA,KAAK;AACL;AACA;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA,SAAS;AACT;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA,aAAa;AACb,SAAS;AACT;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA;AACA;;AAEA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;;AAEA,CAAC","file":"rails-validator.js","sourcesContent":[" \t// The module cache\n \tvar installedModules = {};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"\";\n\n \t// Load entry module and return exports\n \treturn __webpack_require__(__webpack_require__.s = 1);\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 54e2b37c7c9a37ac7b21","/*\n* Build a path for redirection.\n*\n* - Adds a timestamp GET param for cache busting\n* - Inserts an ID attribute if necessary\n*/\nexport const buildSuccessPath = (path, json) => {\n let timestamp = (new Date()).valueOf();\n if(path.indexOf('?') > -1){\n path += ('&t=' + timestamp);\n }\n else{\n path += ('?t=' + timestamp);\n }\n if(json && json.id){\n path = path.replace(':id', json.id);\n }\n return path;\n};\n\n/*\n* Remote element\n*/\nexport const removeElement = (element) => {\n element.parentElement.removeChild(element);\n};\n\n/*\n* Create an error element\n*/\nexport const createErrorParagraph = (text, base) => {\n let p = document.createElement('p');\n p.classList.add('form-error');\n p.classList.add(base ? 'form-error-base' : 'form-error-inline');\n p.innerText = text;\n return p;\n};\n\n/*\n* Convert a query into an array of elements\n*/\nexport const querySelectorArray = (parent, selector) => {\n let query = parent.querySelectorAll(selector);\n let array = Array.prototype.slice.call(query);\n return array;\n};\n\n/*\n* Take a single error message and format it as if it were\n* a json error coming from the server\n*/\nexport const formatStringAsErrors = (errorString) => {\n return { base: [errorString] };\n};\n\n/*\n* Return true if the element is in view\n*/\nexport const elementIsInView = (el) => {\n let rect = el.getBoundingClientRect();\n let w = window, d = document;\n return (\n rect.top >= 0 &&\n rect.left >= 0 &&\n rect.bottom <= (w.innerHeight || d.documentElement.clientHeight) &&\n rect.right <= (w.innerWidth || d.documentElement.clientWidth)\n );\n};\n\n\n\n// WEBPACK FOOTER //\n// ./lib/helpers.js","import * as handlers from './handlers';\n\nconst MODULE_LOADED='_rails_validator_loaded';\n\nconst init = () => {\n window[MODULE_LOADED] = true;\n addListener('form',\n 'ajax:before',\n handlers.onRemoteFormBefore);\n addListener('form[data-success], a[data-success]',\n 'ajax:success',\n handlers.onRemoteFormSuccess);\n addListener('form[data-errors]',\n 'ajax:error',\n handlers.onRemoteFormErrors);\n};\n\nconst addListener = (selector, event, fn) => {\n document.addEventListener(event, (e) => {\n if(e.target.matches(selector)){\n e.stopPropagation();\n fn.call(e.target, e);\n }\n });\n};\n\nif(!window[MODULE_LOADED]) {\n init();\n}\n\n\n\n// WEBPACK FOOTER //\n// ./lib/index.js","import * as errors from './errors';\nimport * as helpers from './helpers';\n\n/*\n* Tell the server we want a json response\n*/\nexport const onRemoteFormBefore = (event) => {\n let form = event.target;\n if(form.getAttribute('data-type') === null){\n form.setAttribute('data-type', 'json');\n }\n};\n\n/*\n* Called when a remote form is submitted with a data-success configured\n* Redirects to the configured path, or reloads the page if \"reload\" is passed\n*\n* ie:\n* <form action=\"...\" data-remote=\"true\" data-success=\"/path/for/success/:id\">\n*/\nexport const onRemoteFormSuccess = (event) => {\n let form = event.target;\n let successPath = form.getAttribute('data-success');\n if(successPath === 'reload'){\n window.location.reload(true);\n }\n else{\n let json = event.detail[0];\n window.location = helpers.buildSuccessPath(successPath, json);\n }\n};\n\n/*\n* Called when a remote form is submitted and the server has returned an\n* error, only if the form has a data-errors attribute\n*\n* ie:\n* <form action=\"...\" data-remote=\"true\" data-errors=\"inline\">\n* - OR -\n* <form action=\"...\" data-remote=\"true\" data-errors=\"alert\">\n*/\nexport const onRemoteFormErrors = (event) => {\n let json = event.detail[0];\n let xhr = event.detail[2];\n let form = event.target;\n let errorType = form.getAttribute('data-errors');\n\n if(xhr.status === 422){\n if(errorType === 'inline'){\n errors.displayErrorsInline(form, json);\n }\n else{\n errors.displayErrorsAlert(json);\n }\n }\n else if(xhr.status === 401 || xhr.status === 403){\n window.alert('Error: Access denied.');\n }\n else{\n let errorThrown = event.detail[1];\n window.alert('An unexpected error occurred: ' + errorThrown);\n }\n};\n\n\n\n// WEBPACK FOOTER //\n// ./lib/handlers.js","import * as helpers from './helpers';\nimport Case from 'case';\n\n/*\n* Remove inline error messages\n*/\nexport const clearErrors = function(form) {\n helpers.querySelectorArray(form,\n '.form-error-inline, .form-error-base').forEach(helpers.removeElement);\n};\n\n/*\n* Append error text to form input fields and scroll to the first error\n*/\nexport const displayErrorsInline = function(form, json){\n if(typeof json === 'string') {\n json = helpers.formatStringAsErrors(json);\n }\n\n clearErrors(form);\n let errors = json.errors;\n\n for(let key in errors){\n let messages = errors[key];\n if(key === 'base'){\n for(let i=0; i<messages.length; i++){\n let p = helpers.createErrorParagraph(messages[i], true);\n form.insertBefore(p, form.firstChild);\n }\n }\n else{\n let input, keyArr;\n keyArr = key.split('.');\n\n if(keyArr.length === 2){\n keyArr[0] += '_attributes';\n input = form.querySelector(`[name$='[${keyArr.join('][')}]']`);\n }\n else{\n let array = helpers.querySelectorArray(form, `[name$='[${key}]']`);\n input = array.filter(function(input){\n // Filter out nested attribute inputs ie model[a][b]\n return !input.name.match(/\\]\\[/);\n })[0];\n if(input === null && !key.match(/_id$/)){\n input = form.querySelector(`[name$='[${key}_id]']`);\n }\n }\n\n let message = messages[0];\n if(input){\n input.parentNode.appendChild(helpers.createErrorParagraph(message));\n }\n else{\n // eslint-disable-next-line no-console\n console.warn('Missing input field for key:', key);\n form.insertBefore(\n helpers.createErrorParagraph(`${Case.title(key)} ${message}`),\n form.firstChild\n );\n }\n }\n }\n\n let firstError = form.querySelector('.form-error-inline, .form-error-base');\n if(firstError &&\n !helpers.elementIsInView(firstError) &&\n typeof(firstError.scrollIntoView) === 'function'){\n firstError.parentElement.scrollIntoView();\n }\n};\n\n/*\n* Display errors in a standard window.alert dialog\n*/\nexport const displayErrorsAlert = function(json){\n if(typeof json === 'string') {\n json = helpers.formatStringAsErrors(json);\n }\n let text = 'Please correct the following errors:\\n';\n let message, errors = json.errors;\n for(let key in errors){\n message = errors[key][0];\n if(key === 'base'){\n text += ` - ${message}\\n`;\n }\n else{\n text += ` - ${Case.title(key)} ${message}\\n`;\n }\n }\n window.alert(text);\n};\n\n\n\n// WEBPACK FOOTER //\n// ./lib/errors.js","/*! Case - v1.5.3 - 2017-07-11\n* Copyright (c) 2017 Nathan Bubna; Licensed MIT, GPL */\n(function() {\n \"use strict\";\n var unicodes = function(s, prefix) {\n prefix = prefix || '';\n return s.replace(/(^|-)/g, '$1\\\\u'+prefix).replace(/,/g, '\\\\u'+prefix);\n },\n basicSymbols = unicodes('20-26,28-2F,3A-40,5B-60,7B-7E,A0-BF,D7,F7', '00'),\n baseLowerCase = 'a-z'+unicodes('DF-F6,F8-FF', '00'),\n baseUpperCase = 'A-Z'+unicodes('C0-D6,D8-DE', '00'),\n improperInTitle = 'A|An|And|As|At|But|By|En|For|If|In|Of|On|Or|The|To|Vs?\\\\.?|Via',\n regexps = function(symbols, lowers, uppers, impropers) {\n symbols = symbols || basicSymbols;\n lowers = lowers || baseLowerCase;\n uppers = uppers || baseUpperCase;\n impropers = impropers || improperInTitle;\n return {\n capitalize: new RegExp('(^|['+symbols+'])(['+lowers+'])', 'g'),\n pascal: new RegExp('(^|['+symbols+'])+(['+lowers+uppers+'])', 'g'),\n fill: new RegExp('['+symbols+']+(.|$)','g'),\n sentence: new RegExp('(^\\\\s*|[\\\\?\\\\!\\\\.]+\"?\\\\s+\"?|,\\\\s+\")(['+lowers+'])', 'g'),\n improper: new RegExp('\\\\b('+impropers+')\\\\b', 'g'),\n relax: new RegExp('([^'+uppers+'])(['+uppers+']*)(['+uppers+'])(?=['+lowers+']|$)', 'g'),\n upper: new RegExp('^[^'+lowers+']+$'),\n hole: /[^\\s]\\s[^\\s]/,\n apostrophe: /'/g,\n room: new RegExp('['+symbols+']')\n };\n },\n re = regexps(),\n _ = {\n re: re,\n unicodes: unicodes,\n regexps: regexps,\n types: [],\n up: String.prototype.toUpperCase,\n low: String.prototype.toLowerCase,\n cap: function(s) {\n return _.up.call(s.charAt(0))+s.slice(1);\n },\n decap: function(s) {\n return _.low.call(s.charAt(0))+s.slice(1);\n },\n deapostrophe: function(s) {\n return s.replace(re.apostrophe, '');\n },\n fill: function(s, fill, deapostrophe) {\n if (fill != null) {\n s = s.replace(re.fill, function(m, next) {\n return next ? fill + next : '';\n });\n }\n if (deapostrophe) {\n s = _.deapostrophe(s);\n }\n return s;\n },\n prep: function(s, fill, pascal, upper) {\n s = s == null ? '' : s + '';// force to string\n if (!upper && re.upper.test(s)) {\n s = _.low.call(s);\n }\n if (!fill && !re.hole.test(s)) {\n var holey = _.fill(s, ' ');\n if (re.hole.test(holey)) {\n s = holey;\n }\n }\n if (!pascal && !re.room.test(s)) {\n s = s.replace(re.relax, _.relax);\n }\n return s;\n },\n relax: function(m, before, acronym, caps) {\n return before + ' ' + (acronym ? acronym+' ' : '') + caps;\n }\n },\n Case = {\n _: _,\n of: function(s) {\n for (var i=0,m=_.types.length; i<m; i++) {\n if (Case[_.types[i]].apply(Case, arguments) === s){ return _.types[i]; }\n }\n },\n flip: function(s) {\n return s.replace(/\\w/g, function(l) {\n return (l == _.up.call(l) ? _.low : _.up).call(l);\n });\n },\n random: function(s) {\n return s.replace(/\\w/g, function(l) {\n return (Math.round(Math.random()) ? _.up : _.low).call(l);\n });\n },\n type: function(type, fn) {\n Case[type] = fn;\n _.types.push(type);\n }\n },\n types = {\n lower: function(s, fill, deapostrophe) {\n return _.fill(_.low.call(_.prep(s, fill)), fill, deapostrophe);\n },\n snake: function(s) {\n return Case.lower(s, '_', true);\n },\n constant: function(s) {\n return Case.upper(s, '_', true);\n },\n camel: function(s) {\n return _.decap(Case.pascal(s));\n },\n kebab: function(s) {\n return Case.lower(s, '-', true);\n },\n header: function(s) {\n return Case.capital(s, '-', true);\n },\n upper: function(s, fill, deapostrophe) {\n return _.fill(_.up.call(_.prep(s, fill, false, true)), fill, deapostrophe);\n },\n capital: function(s, fill, deapostrophe) {\n return _.fill(_.prep(s).replace(re.capitalize, function(m, border, letter) {\n return border+_.up.call(letter);\n }), fill, deapostrophe);\n },\n pascal: function(s) {\n return _.fill(_.prep(s, false, true).replace(re.pascal, function(m, border, letter) {\n return _.up.call(letter);\n }), '', true);\n },\n title: function(s) {\n return Case.capital(s).replace(re.improper, function(small, p, i, s) {\n return i > 0 && i < s.lastIndexOf(' ') ? _.low.call(small) : small;\n });\n },\n sentence: function(s, names) {\n s = Case.lower(s).replace(re.sentence, function(m, prelude, letter) {\n return prelude + _.up.call(letter);\n });\n if (names) {\n names.forEach(function(name) {\n s = s.replace(new RegExp('\\\\b'+Case.lower(name)+'\\\\b', \"g\"), _.cap);\n });\n }\n return s;\n }\n };\n\n // TODO: Remove \"squish\" in a future breaking release.\n types.squish = types.pascal;\n\n for (var type in types) {\n Case.type(type, types[type]);\n }\n // export Case (AMD, commonjs, or global)\n var define = typeof define === \"function\" ? define : function(){};\n define(typeof module === \"object\" && module.exports ? module.exports = Case : this.Case = Case);\n\n}).call(this);\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/case/dist/Case.js\n// module id = 4\n// module chunks = 0 1"],"sourceRoot":""}
@@ -0,0 +1,3 @@
1
+ !function(e){function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}var t={};r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{configurable:!1,enumerable:!0,get:n})},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},r.p="",r(r.s=1)}([function(e,r,t){"use strict";Object.defineProperty(r,"__esModule",{value:!0});r.buildSuccessPath=function(e,r){var t=(new Date).valueOf();return e.indexOf("?")>-1?e+="&t="+t:e+="?t="+t,r&&r.id&&(e=e.replace(":id",r.id)),e},r.removeElement=function(e){e.parentElement.removeChild(e)},r.createErrorParagraph=function(e,r){var t=document.createElement("p");return t.classList.add("form-error"),t.classList.add(r?"form-error-base":"form-error-inline"),t.innerText=e,t},r.querySelectorArray=function(e,r){var t=e.querySelectorAll(r);return Array.prototype.slice.call(t)},r.formatStringAsErrors=function(e){return{base:[e]}},r.elementIsInView=function(e){var r=e.getBoundingClientRect(),t=window,n=document;return r.top>=0&&r.left>=0&&r.bottom<=(t.innerHeight||n.documentElement.clientHeight)&&r.right<=(t.innerWidth||n.documentElement.clientWidth)}},function(e,r,t){"use strict";var n=t(2),o=function(e){if(e&&e.__esModule)return e;var r={};if(null!=e)for(var t in e)Object.prototype.hasOwnProperty.call(e,t)&&(r[t]=e[t]);return r.default=e,r}(n),a=function(e,r,t){document.addEventListener(r,function(r){r.target.matches(e)&&(r.stopPropagation(),t.call(r.target,r))})};window._rails_validator_loaded||function(){window._rails_validator_loaded=!0,a("form","ajax:before",o.onRemoteFormBefore),a("form[data-success], a[data-success]","ajax:success",o.onRemoteFormSuccess),a("form[data-errors]","ajax:error",o.onRemoteFormErrors)}(),Element.prototype.matches||(Element.prototype.matches=Element.prototype.msMatchesSelector||Element.prototype.webkitMatchesSelector)},function(e,r,t){"use strict";function n(e){if(e&&e.__esModule)return e;var r={};if(null!=e)for(var t in e)Object.prototype.hasOwnProperty.call(e,t)&&(r[t]=e[t]);return r.default=e,r}Object.defineProperty(r,"__esModule",{value:!0}),r.onRemoteFormErrors=r.onRemoteFormSuccess=r.onRemoteFormBefore=void 0;var o=t(3),a=n(o),l=t(0),i=n(l);r.onRemoteFormBefore=function(e){var r=e.target;null===r.getAttribute("data-type")&&r.setAttribute("data-type","json")},r.onRemoteFormSuccess=function(e){var r=e.target,t=r.getAttribute("data-success");if("reload"===t)window.location.reload(!0);else{var n=e.detail[0];window.location=i.buildSuccessPath(t,n)}},r.onRemoteFormErrors=function(e){var r=e.detail[0],t=e.detail[2],n=e.target,o=n.getAttribute("data-errors");if(422===t.status)"inline"===o?a.displayErrorsInline(n,r):a.displayErrorsAlert(r);else if(401===t.status||403===t.status)window.alert("Error: Access denied.");else{var l=e.detail[1];window.alert("An unexpected error occurred: "+l)}}},function(e,r,t){"use strict";Object.defineProperty(r,"__esModule",{value:!0}),r.displayErrorsAlert=r.displayErrorsInline=r.clearErrors=void 0;var n=t(0),o=function(e){if(e&&e.__esModule)return e;var r={};if(null!=e)for(var t in e)Object.prototype.hasOwnProperty.call(e,t)&&(r[t]=e[t]);return r.default=e,r}(n),a=t(4),l=function(e){return e&&e.__esModule?e:{default:e}}(a),i=r.clearErrors=function(e){o.querySelectorArray(e,".form-error-inline, .form-error-base").forEach(o.removeElement)};r.displayErrorsInline=function(e,r){"string"==typeof r&&(r=o.formatStringAsErrors(r)),i(e);var t=r.errors;for(var n in t){var a=t[n];if("base"===n)for(var c=0;c<a.length;c++){var u=o.createErrorParagraph(a[c],!0);e.insertBefore(u,e.firstChild)}else{var s=void 0,p=void 0;if(p=n.split("."),2===p.length)p[0]+="_attributes",s=e.querySelector("[name$='["+p.join("][")+"]']");else{s=o.querySelectorArray(e,"[name$='["+n+"]']").filter(function(e){return!e.name.match(/\]\[/)})[0],null!==s||n.match(/_id$/)||(s=e.querySelector("[name$='["+n+"_id]']"))}var f=a[0];s?s.parentNode.appendChild(o.createErrorParagraph(f)):(console.warn("Missing input field for key:",n),e.insertBefore(o.createErrorParagraph(l.default.title(n)+" "+f),e.firstChild))}}var d=e.querySelector(".form-error-inline, .form-error-base");d&&!o.elementIsInView(d)&&"function"==typeof d.scrollIntoView&&d.parentElement.scrollIntoView()},r.displayErrorsAlert=function(e){"string"==typeof e&&(e=o.formatStringAsErrors(e));var r="Please correct the following errors:\n",t=void 0,n=e.errors;for(var a in n)t=n[a][0],r+="base"===a?" - "+t+"\n":" - "+l.default.title(a)+" "+t+"\n";window.alert(r)}},function(e,r){/*! Case - v1.5.3 - 2017-07-11
2
+ * Copyright (c) 2017 Nathan Bubna; Licensed MIT, GPL */
3
+ (function(){"use strict";var r=function(e,r){return r=r||"",e.replace(/(^|-)/g,"$1\\u"+r).replace(/,/g,"\\u"+r)},t=r("20-26,28-2F,3A-40,5B-60,7B-7E,A0-BF,D7,F7","00"),n="a-z"+r("DF-F6,F8-FF","00"),o="A-Z"+r("C0-D6,D8-DE","00"),a=function(e,r,a,l){return e=e||t,r=r||n,a=a||o,l=l||"A|An|And|As|At|But|By|En|For|If|In|Of|On|Or|The|To|Vs?\\.?|Via",{capitalize:new RegExp("(^|["+e+"])(["+r+"])","g"),pascal:new RegExp("(^|["+e+"])+(["+r+a+"])","g"),fill:new RegExp("["+e+"]+(.|$)","g"),sentence:new RegExp('(^\\s*|[\\?\\!\\.]+"?\\s+"?|,\\s+")(['+r+"])","g"),improper:new RegExp("\\b("+l+")\\b","g"),relax:new RegExp("([^"+a+"])(["+a+"]*)(["+a+"])(?=["+r+"]|$)","g"),upper:new RegExp("^[^"+r+"]+$"),hole:/[^\s]\s[^\s]/,apostrophe:/'/g,room:new RegExp("["+e+"]")}},l=a(),i={re:l,unicodes:r,regexps:a,types:[],up:String.prototype.toUpperCase,low:String.prototype.toLowerCase,cap:function(e){return i.up.call(e.charAt(0))+e.slice(1)},decap:function(e){return i.low.call(e.charAt(0))+e.slice(1)},deapostrophe:function(e){return e.replace(l.apostrophe,"")},fill:function(e,r,t){return null!=r&&(e=e.replace(l.fill,function(e,t){return t?r+t:""})),t&&(e=i.deapostrophe(e)),e},prep:function(e,r,t,n){if(e=null==e?"":e+"",!n&&l.upper.test(e)&&(e=i.low.call(e)),!r&&!l.hole.test(e)){var o=i.fill(e," ");l.hole.test(o)&&(e=o)}return t||l.room.test(e)||(e=e.replace(l.relax,i.relax)),e},relax:function(e,r,t,n){return r+" "+(t?t+" ":"")+n}},c={_:i,of:function(e){for(var r=0,t=i.types.length;r<t;r++)if(c[i.types[r]].apply(c,arguments)===e)return i.types[r]},flip:function(e){return e.replace(/\w/g,function(e){return(e==i.up.call(e)?i.low:i.up).call(e)})},random:function(e){return e.replace(/\w/g,function(e){return(Math.round(Math.random())?i.up:i.low).call(e)})},type:function(e,r){c[e]=r,i.types.push(e)}},u={lower:function(e,r,t){return i.fill(i.low.call(i.prep(e,r)),r,t)},snake:function(e){return c.lower(e,"_",!0)},constant:function(e){return c.upper(e,"_",!0)},camel:function(e){return i.decap(c.pascal(e))},kebab:function(e){return c.lower(e,"-",!0)},header:function(e){return c.capital(e,"-",!0)},upper:function(e,r,t){return i.fill(i.up.call(i.prep(e,r,!1,!0)),r,t)},capital:function(e,r,t){return i.fill(i.prep(e).replace(l.capitalize,function(e,r,t){return r+i.up.call(t)}),r,t)},pascal:function(e){return i.fill(i.prep(e,!1,!0).replace(l.pascal,function(e,r,t){return i.up.call(t)}),"",!0)},title:function(e){return c.capital(e).replace(l.improper,function(e,r,t,n){return t>0&&t<n.lastIndexOf(" ")?i.low.call(e):e})},sentence:function(e,r){return e=c.lower(e).replace(l.sentence,function(e,r,t){return r+i.up.call(t)}),r&&r.forEach(function(r){e=e.replace(new RegExp("\\b"+c.lower(r)+"\\b","g"),i.cap)}),e}};u.squish=u.pascal;for(var s in u)c.type(s,u[s]);var p="function"==typeof p?p:function(){};p("object"==typeof e&&e.exports?e.exports=c:this.Case=c)}).call(this)}]);
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tb_core
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.5
4
+ version: 1.4.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Greg Woods
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-03-13 00:00:00.000000000 Z
11
+ date: 2018-04-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: authlogic
@@ -475,6 +475,9 @@ files:
475
475
  - spec/models/spud_user_spec.rb
476
476
  - spec/rails_helper.rb
477
477
  - spec/spec_helper.rb
478
+ - vendor/assets/rails-validator/rails-validator.js
479
+ - vendor/assets/rails-validator/rails-validator.js.map
480
+ - vendor/assets/rails-validator/rails-validator.min.js
478
481
  homepage: http://bitbucket.org/moser-inc/tb_core
479
482
  licenses: []
480
483
  metadata: {}
@@ -486,7 +489,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
486
489
  requirements:
487
490
  - - ">="
488
491
  - !ruby/object:Gem::Version
489
- version: '2.1'
492
+ version: 2.4.2
490
493
  required_rubygems_version: !ruby/object:Gem::Requirement
491
494
  requirements:
492
495
  - - ">="
@@ -494,7 +497,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
494
497
  version: '0'
495
498
  requirements: []
496
499
  rubyforge_project:
497
- rubygems_version: 2.5.1
500
+ rubygems_version: 2.6.14
498
501
  signing_key:
499
502
  specification_version: 4
500
503
  summary: Twice Baked Core Engine