tb_core 1.4.5 → 1.5.1

Sign up to get free protection for your applications and to get access to all the features.
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