tb_core 1.4.5 → 1.4.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  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