tb_core 1.4.5 → 1.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +2 -2
  3. data/Rakefile +1 -1
  4. data/app/controllers/admin/password_resets_controller.rb +1 -0
  5. data/app/controllers/admin/roles_controller.rb +1 -3
  6. data/app/controllers/admin/settings_controller.rb +2 -2
  7. data/app/controllers/admin/setup_controller.rb +1 -1
  8. data/app/controllers/admin/users_controller.rb +4 -4
  9. data/app/controllers/concerns/tb_core/error_handling.rb +5 -4
  10. data/app/controllers/concerns/tb_core/redirection.rb +1 -0
  11. data/app/controllers/concerns/tb_core/user_authentication.rb +5 -0
  12. data/app/controllers/user_sessions_controller.rb +2 -2
  13. data/app/helpers/forgot_password_mailer_helper.rb +9 -0
  14. data/app/helpers/tb_core/application_helper.rb +17 -0
  15. data/app/mailers/tb_core_mailer.rb +2 -0
  16. data/app/models/concerns/tb_core/user_model.rb +55 -8
  17. data/app/models/spud_role.rb +2 -7
  18. data/app/views/layouts/admin/application.html.erb +1 -1
  19. data/app/views/tb_core_mailer/forgot_password_notification.html.erb +5 -1
  20. data/lib/generators/spud/controller_spec_generator.rb +1 -1
  21. data/lib/generators/spud/module_generator.rb +4 -4
  22. data/lib/generators/spud/setup_generator.rb +3 -5
  23. data/lib/tb_core/belongs_to_app.rb +2 -1
  24. data/lib/tb_core/engine.rb +1 -3
  25. data/lib/tb_core/form_builder.rb +1 -1
  26. data/lib/tb_core/test_files.rb +3 -3
  27. data/lib/tb_core/test_helper.rb +25 -25
  28. data/lib/tb_core/version.rb +1 -1
  29. data/spec/controllers/admin/application_controller_spec.rb +3 -3
  30. data/spec/controllers/admin/dashboard_controller_spec.rb +1 -1
  31. data/spec/controllers/admin/password_reset_controller_spec.rb +2 -2
  32. data/spec/controllers/admin/settings_controller_spec.rb +1 -1
  33. data/spec/controllers/admin/setup_controller_spec.rb +1 -1
  34. data/spec/controllers/admin/user_sessions_controller_spec.rb +1 -1
  35. data/spec/controllers/admin/users_controller_spec.rb +3 -3
  36. data/spec/dummy/app/assets/config/manifest.js +3 -0
  37. data/spec/dummy/config/application.rb +1 -46
  38. data/spec/dummy/config/initializers/secret_token.rb +0 -1
  39. data/spec/factories/spud_admin_permission_factories.rb +1 -1
  40. data/spec/factories/spud_user_factories.rb +2 -2
  41. data/spec/models/spud_user_spec.rb +2 -2
  42. data/spec/rails_helper.rb +1 -1
  43. data/vendor/assets/rails-validator/rails-validator.js +534 -0
  44. data/vendor/assets/rails-validator/rails-validator.js.map +1 -0
  45. data/vendor/assets/rails-validator/rails-validator.min.js +3 -0
  46. metadata +44 -11
@@ -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.5.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Greg Woods
8
- autorequire:
8
+ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-03-13 00:00:00.000000000 Z
11
+ date: 2020-12-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: authlogic
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: 3.4.3
19
+ version: '5.0'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: 3.4.3
26
+ version: '5.0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: bootstrap-sass
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -236,6 +236,20 @@ dependencies:
236
236
  version: '0'
237
237
  - !ruby/object:Gem::Dependency
238
238
  name: rspec-rails
239
+ requirement: !ruby/object:Gem::Requirement
240
+ requirements:
241
+ - - ">="
242
+ - !ruby/object:Gem::Version
243
+ version: 4.0.0.beta2
244
+ type: :development
245
+ prerelease: false
246
+ version_requirements: !ruby/object:Gem::Requirement
247
+ requirements:
248
+ - - ">="
249
+ - !ruby/object:Gem::Version
250
+ version: 4.0.0.beta2
251
+ - !ruby/object:Gem::Dependency
252
+ name: rubocop
239
253
  requirement: !ruby/object:Gem::Requirement
240
254
  requirements:
241
255
  - - ">="
@@ -249,7 +263,21 @@ dependencies:
249
263
  - !ruby/object:Gem::Version
250
264
  version: '0'
251
265
  - !ruby/object:Gem::Dependency
252
- name: rubocop
266
+ name: rubocop-performance
267
+ requirement: !ruby/object:Gem::Requirement
268
+ requirements:
269
+ - - ">="
270
+ - !ruby/object:Gem::Version
271
+ version: '0'
272
+ type: :development
273
+ prerelease: false
274
+ version_requirements: !ruby/object:Gem::Requirement
275
+ requirements:
276
+ - - ">="
277
+ - !ruby/object:Gem::Version
278
+ version: '0'
279
+ - !ruby/object:Gem::Dependency
280
+ name: rubocop-rails
253
281
  requirement: !ruby/object:Gem::Requirement
254
282
  requirements:
255
283
  - - ">="
@@ -324,6 +352,7 @@ files:
324
352
  - app/controllers/user_sessions_controller.rb
325
353
  - app/helpers/admin/application_helper.rb
326
354
  - app/helpers/admin/roles_helper.rb
355
+ - app/helpers/forgot_password_mailer_helper.rb
327
356
  - app/helpers/tb_core/application_helper.rb
328
357
  - app/mailers/tb_core_mailer.rb
329
358
  - app/models/concerns/tb_core/user_model.rb
@@ -435,6 +464,7 @@ files:
435
464
  - spec/controllers/tb_core/application_controller_spec.rb
436
465
  - spec/dummy/README.rdoc
437
466
  - spec/dummy/Rakefile
467
+ - spec/dummy/app/assets/config/manifest.js
438
468
  - spec/dummy/app/assets/javascripts/admin/application.js
439
469
  - spec/dummy/app/assets/javascripts/application.js
440
470
  - spec/dummy/app/assets/stylesheets/admin/application.scss
@@ -475,10 +505,13 @@ files:
475
505
  - spec/models/spud_user_spec.rb
476
506
  - spec/rails_helper.rb
477
507
  - spec/spec_helper.rb
508
+ - vendor/assets/rails-validator/rails-validator.js
509
+ - vendor/assets/rails-validator/rails-validator.js.map
510
+ - vendor/assets/rails-validator/rails-validator.min.js
478
511
  homepage: http://bitbucket.org/moser-inc/tb_core
479
512
  licenses: []
480
513
  metadata: {}
481
- post_install_message:
514
+ post_install_message:
482
515
  rdoc_options: []
483
516
  require_paths:
484
517
  - lib
@@ -486,22 +519,22 @@ required_ruby_version: !ruby/object:Gem::Requirement
486
519
  requirements:
487
520
  - - ">="
488
521
  - !ruby/object:Gem::Version
489
- version: '2.1'
522
+ version: 2.4.2
490
523
  required_rubygems_version: !ruby/object:Gem::Requirement
491
524
  requirements:
492
525
  - - ">="
493
526
  - !ruby/object:Gem::Version
494
527
  version: '0'
495
528
  requirements: []
496
- rubyforge_project:
497
- rubygems_version: 2.5.1
498
- signing_key:
529
+ rubygems_version: 3.0.3
530
+ signing_key:
499
531
  specification_version: 4
500
532
  summary: Twice Baked Core Engine
501
533
  test_files:
502
534
  - spec/spec_helper.rb
503
535
  - spec/dummy/app/controllers/application_controller.rb
504
536
  - spec/dummy/app/views/layouts/application.html.erb
537
+ - spec/dummy/app/assets/config/manifest.js
505
538
  - spec/dummy/app/assets/javascripts/admin/application.js
506
539
  - spec/dummy/app/assets/javascripts/application.js
507
540
  - spec/dummy/app/assets/stylesheets/application.scss