diff --git a/demo/css/main.css.map b/demo/css/main.css.map index 673fc73..b1095e7 100644 --- a/demo/css/main.css.map +++ b/demo/css/main.css.map @@ -1 +1 @@ -{"version":3,"sources":["main.scss"],"names":[],"mappings":"AAAA;EACE,aAAa,EACd;;AAED;EACE,qBAAc;EAAd,qBAAc;EAAd,cAAc;EACd,yBAAwB;MAAxB,sBAAwB;UAAxB,wBAAwB;EACxB,0BAAoB;MAApB,uBAAoB;UAApB,oBAAoB;EACpB,iBAAiB;EACjB,wBAAwB,EACzB;;AAED;EACE,cAAc,EACf","file":"main.css","sourcesContent":["html, body {\r\n height: 100%;\r\n}\r\n\r\nbody{\r\n display: flex;\r\n justify-content: center;\r\n align-items: center;\r\n font-size: 100px;\r\n font-family: sans-serif;\r\n}\r\n\r\ninput, button{\r\n font: inherit;\r\n}"]} \ No newline at end of file +{"version":3,"sources":["main.scss"],"names":[],"mappings":"AAAA;EACE,aAAa,EACd;;AAED;EACE,qBAAc;EAAd,qBAAc;EAAd,cAAc;EACd,yBAAwB;MAAxB,sBAAwB;UAAxB,wBAAwB;EACxB,0BAAoB;MAApB,uBAAoB;UAApB,oBAAoB;EACpB,iBAAiB;EACjB,wBAAwB,EACzB;;AAED;EACE,cAAc,EACf","file":"main.css","sourcesContent":["html, body {\n height: 100%;\n}\n\nbody{\n display: flex;\n justify-content: center;\n align-items: center;\n font-size: 100px;\n font-family: sans-serif;\n}\n\ninput, button{\n font: inherit;\n}"]} \ No newline at end of file diff --git a/dest/stepper.js b/dest/stepper.js index 215647c..505a0f6 100644 --- a/dest/stepper.js +++ b/dest/stepper.js @@ -110,9 +110,15 @@ */ $.fn.stepper.increase = function () { var current = parseFloat(getValue.call(this)); + var newValue = void 0; this.settings = $(this).data('settings'); var decimals = findDecimals(this.settings.step); - var newValue = (current + parseFloat(this.settings.step)).toFixed(decimals); + var x = current / parseFloat(this.settings.step); + if (this.settings.step !== 1 && x % 1 !== 0) { + newValue = ((Math.floor(x) + 1) * parseFloat(this.settings.step)).toFixed(decimals); + } else { + newValue = (current + parseFloat(this.settings.step)).toFixed(decimals); + } var currentValue = $(this).val(); updateValue.call(this, newValue, currentValue); }; @@ -122,9 +128,15 @@ */ $.fn.stepper.decrease = function () { var current = parseFloat(getValue.call(this)); + var newValue = void 0; this.settings = $(this).data('settings'); var decimals = findDecimals(this.settings.step); - var newValue = (current - parseFloat(this.settings.step)).toFixed(decimals); + var x = current / parseFloat(this.settings.step); + if (this.settings.step !== 1 && x % 1 !== 0) { + newValue = (Math.floor(x) * parseFloat(this.settings.step)).toFixed(decimals); + } else { + newValue = (current - parseFloat(this.settings.step)).toFixed(decimals); + } var currentValue = $(this).val(); updateValue.call(this, newValue, currentValue); }; diff --git a/dest/stepper.js.map b/dest/stepper.js.map index 8ff0215..9b33c98 100644 --- a/dest/stepper.js.map +++ b/dest/stepper.js.map @@ -1 +1 @@ -{"version":3,"sources":["stepper.js"],"names":["$","fn","stepper","options","timeout","debounce","func","wait","immediate","context","args","arguments","later","apply","callNow","clearTimeout","setTimeout","is_touch_device","document","createEvent","e","findDecimals","num","split","length","getValue","val","bindEvents","spinner","closest","events","_this","find","on","type","attr","increase","call","decrease","data","setInterval","settings","mouseup","clearInterval","current","parseFloat","decimals","step","newValue","toFixed","currentValue","updateValue","max","min","focus","triggerChange","trigger","each","extend","is","undefined","parseInt","init","jQuery"],"mappings":"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","file":"stepper.js","sourcesContent":["/*jshint esversion: 6 */\r\n(function ($) {\r\n\r\n \"use strict\";\r\n\r\n\r\n $.fn.stepper = function (options) {\r\n\r\n let timeout;\r\n\r\n /**\r\n * Debounce\r\n *\r\n * @returns {Function}\r\n * @param func\r\n * @param wait\r\n * @param immediate\r\n *\r\n * Source: https://davidwalsh.name/javascript-debounce-function\r\n */\r\n const debounce = function (func, wait, immediate) {\r\n let timeout;\r\n return function () {\r\n let context = this, args = arguments;\r\n let later = function () {\r\n timeout = null;\r\n if (!immediate) func.apply(context, args);\r\n };\r\n let callNow = immediate && !timeout;\r\n clearTimeout(timeout);\r\n timeout = setTimeout(later, wait);\r\n if (callNow) func.apply(context, args);\r\n };\r\n };\r\n\r\n /**\r\n * Check if its a touch base device\r\n *\r\n * @returns {boolean}\r\n */\r\n const is_touch_device = function() {\r\n try {\r\n document.createEvent(\"TouchEvent\");\r\n return true;\r\n } catch (e) {\r\n return false;\r\n }\r\n };\r\n\r\n\r\n /**\r\n * Find the amount of decimals in a number\r\n *\r\n * @param num\r\n * @returns {Number}\r\n *\r\n * Source: http://stackoverflow.com/a/10454534\r\n */\r\n const findDecimals = function (num) {\r\n return (num.split('.')[1] || []).length;\r\n };\r\n\r\n /**\r\n * Get current value\r\n *\r\n * @returns {number}\r\n */\r\n const getValue = function () {\r\n return $(this).val() === '' ? 0 : $(this).val();\r\n };\r\n\r\n /**\r\n * bindEvents\r\n */\r\n const bindEvents = function () {\r\n const spinner = $(this).closest('.js-spinner');\r\n const events = is_touch_device() ? 'touchstart' : 'mousedown';\r\n var _this = this;\r\n\r\n spinner.find('[spinner-button]')\r\n .on(events, function () {\r\n const type = $(this).attr('spinner-button');\r\n if (type === 'up') {\r\n $.fn.stepper.increase.call(_this);\r\n } else {\r\n $.fn.stepper.decrease.call(_this);\r\n }\r\n })\r\n .on('mousedown', function () {\r\n const type = $(this).attr('spinner-button');\r\n $(this).data('timer', setTimeout(() => {\r\n timeout = setInterval(() => {\r\n if (type === 'up') {\r\n $.fn.stepper.increase.call(_this);\r\n } else {\r\n $.fn.stepper.decrease.call(_this);\r\n }\r\n }, 60);\r\n }, _this.settings.debounce));\r\n })\r\n .on('mouseup', function () {\r\n clearTimeout($(this).data('timer'));\r\n });\r\n\r\n $(document).mouseup(function () {\r\n clearInterval(timeout);\r\n });\r\n };\r\n\r\n /**\r\n * Increase\r\n */\r\n $.fn.stepper.increase = function () {\r\n let current = parseFloat(getValue.call(this));\r\n this.settings = $(this).data('settings');\r\n const decimals = findDecimals(this.settings.step);\r\n const newValue = (current + parseFloat(this.settings.step)).toFixed(decimals);\r\n const currentValue = $(this).val();\r\n updateValue.call(this, newValue, currentValue);\r\n };\r\n\r\n /**\r\n * Decrease\r\n */\r\n $.fn.stepper.decrease = function () {\r\n let current = parseFloat(getValue.call(this));\r\n this.settings = $(this).data('settings');\r\n const decimals = findDecimals(this.settings.step);\r\n const newValue = (current - parseFloat(this.settings.step)).toFixed(decimals);\r\n const currentValue = $(this).val();\r\n updateValue.call(this, newValue, currentValue);\r\n };\r\n\r\n /**\r\n * Update stepper element\r\n * @param newValue\r\n * @param currentValue\r\n */\r\n const updateValue = function (newValue, currentValue) {\r\n if ((newValue <= this.settings.max || typeof this.settings.max === \"undefined\") && (newValue >= this.settings.min || typeof this.settings.min === \"undefined\")) {\r\n if(!is_touch_device()){\r\n $(this).val(newValue).focus();\r\n }else{\r\n $(this).val(newValue);\r\n }\r\n triggerChange.call(this);\r\n }else if(currentValue > this.settings.max){\r\n $(this).val(this.settings.max);\r\n }else if(currentValue < this.settings.min){\r\n $(this).val(this.settings.min);\r\n }\r\n };\r\n\r\n /**\r\n * Trigger change event on number field for third party hooks\r\n *\r\n * @type {Function}\r\n */\r\n const triggerChange = debounce(function () {\r\n $(this).trigger('change');\r\n }, 400);\r\n\r\n /**\r\n * Loop every instance\r\n */\r\n return this.each(function () {\r\n\r\n /**\r\n * Default settings merged with user settings\r\n * Can be set trough data attributes or as parameter.\r\n * @type {*}\r\n */\r\n this.settings = $.extend({\r\n step: $(this).is('[step]') ? $(this).attr('step') : '1',\r\n min: $(this).is('[min]') ? parseFloat($(this).attr('min')) : undefined,\r\n max: $(this).is('[max]') ? parseFloat($(this).attr('max')) : undefined,\r\n debounce: $(this).is('[data-stepper-debounce]') ? parseInt($(this).attr('data-stepper-debounce')) : 400,\r\n }, options);\r\n\r\n\r\n this.init = () => {\r\n // Store settings\r\n $(this).data('settings', this.settings);\r\n\r\n // Bind events\r\n bindEvents.call(this);\r\n };\r\n\r\n // Init\r\n this.init();\r\n\r\n });\r\n };\r\n\r\n /**\r\n * Auto load\r\n */\r\n $('input[type=\"number\"]').stepper();\r\n\r\n}(jQuery));"]} \ No newline at end of file +{"version":3,"sources":["stepper.js"],"names":["$","fn","stepper","options","timeout","debounce","func","wait","immediate","context","args","arguments","later","apply","callNow","clearTimeout","setTimeout","is_touch_device","document","createEvent","e","findDecimals","num","split","length","getValue","val","bindEvents","spinner","closest","events","_this","find","on","type","attr","increase","call","decrease","data","setInterval","settings","mouseup","clearInterval","current","parseFloat","newValue","decimals","step","x","Math","floor","toFixed","currentValue","updateValue","max","min","focus","triggerChange","trigger","each","extend","is","undefined","parseInt","init","jQuery"],"mappings":"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","file":"stepper.js","sourcesContent":["/*jshint esversion: 6 */\n(function ($) {\n\n \"use strict\";\n\n\n $.fn.stepper = function (options) {\n\n let timeout;\n\n /**\n * Debounce\n *\n * @returns {Function}\n * @param func\n * @param wait\n * @param immediate\n *\n * Source: https://davidwalsh.name/javascript-debounce-function\n */\n const debounce = function (func, wait, immediate) {\n let timeout;\n return function () {\n let context = this, args = arguments;\n let later = function () {\n timeout = null;\n if (!immediate) func.apply(context, args);\n };\n let callNow = immediate && !timeout;\n clearTimeout(timeout);\n timeout = setTimeout(later, wait);\n if (callNow) func.apply(context, args);\n };\n };\n\n /**\n * Check if its a touch base device\n *\n * @returns {boolean}\n */\n const is_touch_device = function() {\n try {\n document.createEvent(\"TouchEvent\");\n return true;\n } catch (e) {\n return false;\n }\n };\n\n\n /**\n * Find the amount of decimals in a number\n *\n * @param num\n * @returns {Number}\n *\n * Source: http://stackoverflow.com/a/10454534\n */\n const findDecimals = function (num) {\n return (num.split('.')[1] || []).length;\n };\n\n /**\n * Get current value\n *\n * @returns {number}\n */\n const getValue = function () {\n return $(this).val() === '' ? 0 : $(this).val();\n };\n\n /**\n * bindEvents\n */\n const bindEvents = function () {\n const spinner = $(this).closest('.js-spinner');\n const events = is_touch_device() ? 'touchstart' : 'mousedown';\n var _this = this;\n\n spinner.find('[spinner-button]')\n .on(events, function () {\n const type = $(this).attr('spinner-button');\n if (type === 'up') {\n $.fn.stepper.increase.call(_this);\n } else {\n $.fn.stepper.decrease.call(_this);\n }\n })\n .on('mousedown', function () {\n const type = $(this).attr('spinner-button');\n $(this).data('timer', setTimeout(() => {\n timeout = setInterval(() => {\n if (type === 'up') {\n $.fn.stepper.increase.call(_this);\n } else {\n $.fn.stepper.decrease.call(_this);\n }\n }, 60);\n }, _this.settings.debounce));\n })\n .on('mouseup', function () {\n clearTimeout($(this).data('timer'));\n });\n\n $(document).mouseup(function () {\n clearInterval(timeout);\n });\n };\n\n /**\n * Increase\n */\n $.fn.stepper.increase = function () {\n let current = parseFloat(getValue.call(this));\n let newValue;\n this.settings = $(this).data('settings');\n const decimals = findDecimals(this.settings.step);\n let x = current / parseFloat(this.settings.step);\n if (this.settings.step !== 1 && x % 1 !== 0) {\n newValue = ((Math.floor(x) + 1) * parseFloat(this.settings.step)).toFixed(decimals);\n } else {\n newValue = (current + parseFloat(this.settings.step)).toFixed(decimals);\n }\n const currentValue = $(this).val();\n updateValue.call(this, newValue, currentValue);\n };\n\n /**\n * Decrease\n */\n $.fn.stepper.decrease = function () {\n let current = parseFloat(getValue.call(this));\n let newValue;\n this.settings = $(this).data('settings');\n const decimals = findDecimals(this.settings.step);\n let x = current / parseFloat(this.settings.step);\n if (this.settings.step !== 1 && x % 1 !== 0) {\n newValue = (Math.floor(x) * parseFloat(this.settings.step)).toFixed(decimals);\n } else {\n newValue = (current - parseFloat(this.settings.step)).toFixed(decimals);\n }\n const currentValue = $(this).val();\n updateValue.call(this, newValue, currentValue);\n };\n\n /**\n * Update stepper element\n * @param newValue\n * @param currentValue\n */\n const updateValue = function (newValue, currentValue) {\n if ((newValue <= this.settings.max || typeof this.settings.max === \"undefined\") && (newValue >= this.settings.min || typeof this.settings.min === \"undefined\")) {\n if(!is_touch_device()){\n $(this).val(newValue).focus();\n }else{\n $(this).val(newValue);\n }\n triggerChange.call(this);\n }else if(currentValue > this.settings.max){\n $(this).val(this.settings.max);\n }else if(currentValue < this.settings.min){\n $(this).val(this.settings.min);\n }\n };\n\n /**\n * Trigger change event on number field for third party hooks\n *\n * @type {Function}\n */\n const triggerChange = debounce(function () {\n $(this).trigger('change');\n }, 400);\n\n /**\n * Loop every instance\n */\n return this.each(function () {\n\n /**\n * Default settings merged with user settings\n * Can be set trough data attributes or as parameter.\n * @type {*}\n */\n this.settings = $.extend({\n step: $(this).is('[step]') ? $(this).attr('step') : '1',\n min: $(this).is('[min]') ? parseFloat($(this).attr('min')) : undefined,\n max: $(this).is('[max]') ? parseFloat($(this).attr('max')) : undefined,\n debounce: $(this).is('[data-stepper-debounce]') ? parseInt($(this).attr('data-stepper-debounce')) : 400,\n }, options);\n\n\n this.init = () => {\n // Store settings\n $(this).data('settings', this.settings);\n\n // Bind events\n bindEvents.call(this);\n };\n\n // Init\n this.init();\n\n });\n };\n\n /**\n * Auto load\n */\n $('input[type=\"number\"]').stepper();\n\n}(jQuery));\n"]} \ No newline at end of file diff --git a/dest/stepper.min.js b/dest/stepper.min.js index 1b50aec..6538f89 100644 --- a/dest/stepper.min.js +++ b/dest/stepper.min.js @@ -1 +1 @@ -"use strict";!function(t){t.fn.stepper=function(s){var i=void 0,e=function(t,s,i){var e=void 0;return function(){var n=this,a=arguments,r=function(){e=null,i||t.apply(n,a)},o=i&&!e;clearTimeout(e),e=setTimeout(r,s),o&&t.apply(n,a)}},n=function(){try{return document.createEvent("TouchEvent"),!0}catch(t){return!1}},a=function(t){return(t.split(".")[1]||[]).length},r=function(){return""===t(this).val()?0:t(this).val()},o=function(){var s=t(this).closest(".js-spinner"),e=n()?"touchstart":"mousedown",a=this;s.find("[spinner-button]").on(e,function(){var s=t(this).attr("spinner-button");"up"===s?t.fn.stepper.increase.call(a):t.fn.stepper.decrease.call(a)}).on("mousedown",function(){var s=t(this).attr("spinner-button");t(this).data("timer",setTimeout(function(){i=setInterval(function(){"up"===s?t.fn.stepper.increase.call(a):t.fn.stepper.decrease.call(a)},60)},a.settings.debounce))}).on("mouseup",function(){clearTimeout(t(this).data("timer"))}),t(document).mouseup(function(){clearInterval(i)})};t.fn.stepper.increase=function(){var s=parseFloat(r.call(this));this.settings=t(this).data("settings");var i=a(this.settings.step),e=(s+parseFloat(this.settings.step)).toFixed(i),n=t(this).val();u.call(this,e,n)},t.fn.stepper.decrease=function(){var s=parseFloat(r.call(this));this.settings=t(this).data("settings");var i=a(this.settings.step),e=(s-parseFloat(this.settings.step)).toFixed(i),n=t(this).val();u.call(this,e,n)};var u=function(s,i){(s<=this.settings.max||"undefined"==typeof this.settings.max)&&(s>=this.settings.min||"undefined"==typeof this.settings.min)?(n()?t(this).val(s):t(this).val(s).focus(),c.call(this)):i>this.settings.max?t(this).val(this.settings.max):i=this.settings.min||void 0===this.settings.min)?(e()?t(this).val(s):t(this).val(s).focus(),h.call(this)):i>this.settings.max?t(this).val(this.settings.max):i