diff --git a/jquery.timepicker.js b/jquery.timepicker.js index 8044ad0..37d6ec4 100644 --- a/jquery.timepicker.js +++ b/jquery.timepicker.js @@ -242,6 +242,12 @@ hrs: "hrs" }; + var EVENT_DEFAULTS = { + bubbles: true, + cancelable: false, + detail: null + }; + var Timepicker = /*#__PURE__*/function () { function Timepicker(targetEl) { var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; @@ -272,7 +278,7 @@ } this.list.hide(); - var hideTimepickerEvent = new CustomEvent('hideTimepicker'); + var hideTimepickerEvent = new CustomEvent('hideTimepicker', EVENT_DEFAULTS); this.targetEl.dispatchEvent(hideTimepickerEvent); } }, { @@ -324,14 +330,14 @@ } } - var selectTimeEvent = new CustomEvent('selectTime'); + var selectTimeEvent = new CustomEvent('selectTime', EVENT_DEFAULTS); if (this.selectedValue != value) { this.selectedValue = value; - var changeTimeEvent = new CustomEvent('changeTime'); - var changeEvent = new CustomEvent('change', { + var changeTimeEvent = new CustomEvent('changeTime', EVENT_DEFAULTS); + var changeEvent = new CustomEvent('change', Object.assign(EVENT_DEFAULTS, { detail: 'timepicker' - }); + })); if (source == "select") { this.targetEl.dispatchEvent(selectTimeEvent); @@ -753,7 +759,7 @@ var seconds = this.time2int(this.targetEl.value); if (seconds === null) { - var timeFormatErrorEvent = new CustomEvent('timeFormatError'); + var timeFormatErrorEvent = new CustomEvent('timeFormatError', EVENT_DEFAULTS); this.targetEl.dispatchEvent(timeFormatErrorEvent); return; } @@ -797,7 +803,7 @@ if (rangeError) { this._setTimeValue(prettyTime); - var timeRangeErrorEvent = new CustomEvent('timeRangeError'); + var timeRangeErrorEvent = new CustomEvent('timeRangeError', EVENT_DEFAULTS); this.targetEl.dispatchEvent(timeRangeErrorEvent); } else { this._setTimeValue(prettyTime, origin); @@ -964,11 +970,11 @@ if (typeof window.CustomEvent === "function") return false; function CustomEvent(event, params) { - params = params || { - bubbles: false, - cancelable: false, - detail: null - }; + if (!params) { + params = {}; + } + + params = Object.assign(EVENT_DEFAULTS, params); var evt = document.createEvent('CustomEvent'); evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail); return evt; diff --git a/jquery.timepicker.min.js b/jquery.timepicker.min.js index 5e9daf2..db086f5 100644 --- a/jquery.timepicker.min.js +++ b/jquery.timepicker.min.js @@ -1 +1 @@ -!function(){"use strict";function e(t){return(e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(t)}function t(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){for(var i=0;ie.length)&&(t=e.length);for(var i=0,n=new Array(t);i=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(e){throw e},f:s}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var r,o=!0,l=!1;return{s:function(){i=e[Symbol.iterator]()},n:function(){var e=i.next();return o=e.done,e},e:function(e){l=!0,r=e},f:function(){try{o||null==i.return||i.return()}finally{if(l)throw r}}}}var l=86400,u=function(e,t){if(null===e)return null;if("number"!=typeof t.step)return e;var i=e%(60*t.step);return(i-=(t.minTime||0)%(60*t.step))>=30*t.step?e+=60*t.step-i:e-=i,function(e,t){if(e==l&&t.show2400)return e;return e%l}(e,t)};var c,m={appendTo:"body",className:null,closeOnWindowScroll:!1,disableTextInput:!1,disableTimeRanges:[],disableTouchKeyboard:!1,durationTime:null,forceRoundTime:!1,lang:{},listWidth:null,maxTime:null,minTime:null,noneOption:!1,orientation:"l",roundingFunction:u,scrollDefault:null,selectOnBlur:!1,show2400:!1,showDuration:!1,showOn:["click","focus"],showOnFocus:!0,step:30,stopScrollPropagation:!1,timeFormat:"g:ia",typeaheadHighlight:!0,useSelect:!1,wrapHours:!0},p={am:"am",pm:"pm",AM:"AM",PM:"PM",decimal:".",mins:"mins",hr:"hr",hrs:"hrs"},f=function(){function n(e){var i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};t(this,n),this._handleFormatValue=this._handleFormatValue.bind(this),this._handleKeyUp=this._handleKeyUp.bind(this),this.targetEl=e;var s=n.extractAttrOptions(e,Object.keys(m));this.settings=this.parseSettings(r(r(r({},m),i),s))}var s,a,u;return s=n,u=[{key:"extractAttrOptions",value:function(e,t){var i,n={},s=o(t);try{for(s.s();!(i=s.n()).done;){var r=i.value;r in e.dataset&&(n[r]=e.dataset[r])}}catch(e){s.e(e)}finally{s.f()}return n}},{key:"isVisible",value:function(e){var t=e[0];return t.offsetWidth>0&&t.offsetHeight>0}},{key:"hideAll",value:function(){var e,t=o(document.getElementsByClassName("ui-timepicker-input"));try{for(t.s();!(e=t.n()).done;){var i=e.value.timepickerObj;i&&i.hideMe()}}catch(e){t.e(e)}finally{t.f()}}}],(a=[{key:"hideMe",value:function(){if(this.settings.useSelect)this.targetEl.blur();else if(this.list&&n.isVisible(this.list)){this.settings.selectOnBlur&&this._selectValue(),this.list.hide();var e=new CustomEvent("hideTimepicker");this.targetEl.dispatchEvent(e)}}},{key:"_findRow",value:function(e){if(!e&&0!==e)return!1;var t=!1;return e=this.settings.roundingFunction(e,this.settings),!!this.list&&(this.list.find("li").each((function(i,n){var s=parseInt(n.dataset.time);if(!isNaN(s))return s==e?(t=n,!1):void 0})),t)}},{key:"_hideKeyboard",value:function(){return(window.navigator.msMaxTouchPoints||"ontouchstart"in document)&&this.settings.disableTouchKeyboard}},{key:"_setTimeValue",value:function(e,t){if("INPUT"===this.targetEl.nodeName){null===e&&""==this.targetEl.value||(this.targetEl.value=e);var i=this;i.settings.useSelect&&"select"!=t&&i.list&&i.list.val(i._roundAndFormatTime(i.time2int(e)))}var n=new CustomEvent("selectTime");if(this.selectedValue!=e){this.selectedValue=e;var s=new CustomEvent("changeTime"),r=new CustomEvent("change",{detail:"timepicker"});return"select"==t?(this.targetEl.dispatchEvent(n),this.targetEl.dispatchEvent(s),this.targetEl.dispatchEvent(r)):-1==["error","initial"].indexOf(t)&&this.targetEl.dispatchEvent(s),!0}return-1==["error","initial"].indexOf(t)&&this.targetEl.dispatchEvent(n),!1}},{key:"_getTimeValue",value:function(){return"INPUT"===this.targetEl.nodeName?this.targetEl.value:this.selectedValue}},{key:"_selectValue",value:function(){var e=this;e.settings;var t=e.list.find(".ui-timepicker-selected");if(t.hasClass("ui-timepicker-disabled"))return!1;if(!t.length)return!0;var i=t.get(0).dataset.time;if(i){var n=parseInt(i);isNaN(n)||(i=n)}return null!==i&&("string"!=typeof i&&(i=e._int2time(i)),e._setTimeValue(i,"select")),!0}},{key:"time2int",value:function(e){if(""===e||null==e)return null;if(e instanceof Date)return 3600*e.getHours()+60*e.getMinutes()+e.getSeconds();if("string"!=typeof e)return e;"a"!=(e=e.toLowerCase().replace(/[\s\.]/g,"")).slice(-1)&&"p"!=e.slice(-1)||(e+="m");var t=/^(([^0-9]*))?([0-9]?[0-9])(([0-5][0-9]))?(([0-5][0-9]))?(([^0-9]*))$/;e.match(/\W/)&&(t=/^(([^0-9]*))?([0-9]?[0-9])(\W+([0-5][0-9]?))?(\W+([0-5][0-9]))?(([^0-9]*))$/);var i=e.match(t);if(!i)return null;var n=parseInt(1*i[3],10),s=i[2]||i[9],r=n,a=1*i[5]||0,o=1*i[7]||0;if(s||2!=i[3].length||"0"!=i[3][0]||(s="am"),n<=12&&s){var u=(s=s.trim())==this.settings.lang.pm||s==this.settings.lang.PM;r=12==n?u?12:0:n+(u?12:0)}else if(3600*n+60*a+o>=l+(this.settings.show2400?1:0)){if(!1===this.settings.wrapHours)return null;r=n%24}var c=3600*r+60*a+o;if(n<12&&!s&&this.settings._twelveHourTime&&this.settings.scrollDefault){var m=c-this.settings.scrollDefault();m<0&&m>=-43200&&(c=(c+43200)%l)}return c}},{key:"parseSettings",value:function(e){var t=this;if(e.lang=r(r({},p),e.lang),this.settings=e,e.minTime&&(e.minTime=this.time2int(e.minTime)),e.maxTime&&(e.maxTime=this.time2int(e.maxTime)),e.listWidth&&(e.listWidth=this.time2int(e.listWidth)),e.durationTime&&"function"!=typeof e.durationTime&&(e.durationTime=this.time2int(e.durationTime)),"now"==e.scrollDefault)e.scrollDefault=function(){return e.roundingFunction(t.time2int(new Date),e)};else if(e.scrollDefault&&"function"!=typeof e.scrollDefault){var i=e.scrollDefault;e.scrollDefault=function(){return e.roundingFunction(t.time2int(i),e)}}else e.minTime&&(e.scrollDefault=function(){return e.roundingFunction(e.minTime,e)});if("string"==typeof e.timeFormat&&e.timeFormat.match(/[gh]/)&&(e._twelveHourTime=!0),!1===e.showOnFocus&&-1!=e.showOn.indexOf("focus")&&e.showOn.splice(e.showOn.indexOf("focus"),1),e.disableTimeRanges||(e.disableTimeRanges=[]),e.disableTimeRanges.length>0){for(var n in e.disableTimeRanges)e.disableTimeRanges[n]=[this.time2int(e.disableTimeRanges[n][0]),this.time2int(e.disableTimeRanges[n][1])];for(e.disableTimeRanges=e.disableTimeRanges.sort((function(e,t){return e[0]-t[0]})),n=e.disableTimeRanges.length-1;n>0;n--)e.disableTimeRanges[n][0]<=e.disableTimeRanges[n-1][1]&&(e.disableTimeRanges[n-1]=[Math.min(e.disableTimeRanges[n][0],e.disableTimeRanges[n-1][0]),Math.max(e.disableTimeRanges[n][1],e.disableTimeRanges[n-1][1])],e.disableTimeRanges.splice(n,1))}return e}},{key:"_disableTextInputHandler",value:function(e){switch(e.keyCode){case 13:case 9:return;default:e.preventDefault()}}},{key:"_int2duration",value:function(e,t){e=Math.abs(e);var i,n,s=Math.round(e/60),r=[];return s<60?r=[s,this.settings.lang.mins]:(i=Math.floor(s/60),n=s%60,30==t&&30==n&&(i+=this.settings.lang.decimal+5),r.push(i),r.push(1==i?this.settings.lang.hr:this.settings.lang.hrs),30!=t&&n&&(r.push(n),r.push(this.settings.lang.mins))),r.join(" ")}},{key:"_roundAndFormatTime",value:function(e){if(null!==(e=this.settings.roundingFunction(e,this.settings)))return this._int2time(e)}},{key:"_int2time",value:function(e){if("number"!=typeof e)return null;var t=parseInt(e%60),i=parseInt(e/60%60),n=parseInt(e/3600%24),s=new Date(1970,0,2,n,i,t,0);if(isNaN(s.getTime()))return null;if("function"==typeof this.settings.timeFormat)return this.settings.timeFormat(s);for(var r,a,o="",u=0;u11?this.settings.lang.pm:this.settings.lang.am;break;case"A":o+=s.getHours()>11?this.settings.lang.PM:this.settings.lang.AM;break;case"g":o+=0==(r=s.getHours()%12)?"12":r;break;case"G":r=s.getHours(),e===l&&(r=this.settings.show2400?24:0),o+=r;break;case"h":0!=(r=s.getHours()%12)&&r<10&&(r="0"+r),o+=0===r?"12":r;break;case"H":r=s.getHours(),e===l&&(r=this.settings.show2400?24:0),o+=r>9?r:"0"+r;break;case"i":o+=(i=s.getMinutes())>9?i:"0"+i;break;case"s":o+=(t=s.getSeconds())>9?t:"0"+t;break;case"\\":u++,o+=this.settings.timeFormat.charAt(u);break;default:o+=a}return o}},{key:"_setSelected",value:function(){var e=this.list;e.find("li").removeClass("ui-timepicker-selected");var t=this.time2int(this._getTimeValue());if(null!==t){var i=this._findRow(t);if(i){var n=i.getBoundingClientRect(),s=e.get(0).getBoundingClientRect(),r=n.top-s.top;if(r+n.height>s.height||r<0){var a=e.scrollTop()+(n.top-s.top)-n.height;e.scrollTop(a)}var o=parseInt(i.dataset.time);(this.settings.forceRoundTime||o===t)&&i.classList.add("ui-timepicker-selected")}}}},{key:"_isFocused",value:function(e){return e===document.activeElement}},{key:"_handleFormatValue",value:function(e){e&&"timepicker"==e.detail||this._formatValue(e)}},{key:"_formatValue",value:function(e,t){if(""!==this.targetEl.value){if(!this._isFocused(this.targetEl)||e&&"change"==e.type){var i=this.settings,n=this.time2int(this.targetEl.value);if(null!==n){var s=!1;null!==i.minTime&&null!==i.maxTime&&(ni.maxTime)&&(s=!0);var r,a=o(i.disableTimeRanges);try{for(a.s();!(r=a.n()).done;){var l=r.value;if(n>=l[0]&&nt(window).height()+t(window).scrollTop()?"t":"b")?(o.addClass("ui-timepicker-positioned-top"),l.top=i.offset().top-o.outerHeight()+parseInt(o.css("marginTop").replace("px",""),10)):(o.removeClass("ui-timepicker-positioned-top"),l.top=i.offset().top+i.outerHeight()+parseInt(o.css("marginTop").replace("px",""),10)),o.offset(l);var u=o.find(".ui-timepicker-selected");if(!u.length){var c=r.time2int(r._getTimeValue());null!==c?u=t(r._findRow(c)):a.scrollDefault&&(u=t(r._findRow(a.scrollDefault())))}if(u.length&&!u.hasClass("ui-timepicker-disabled")||(u=o.find("li:not(.ui-timepicker-disabled):first")),u&&u.length){var m=o.scrollTop()+u.position().top-u.outerHeight();o.scrollTop(m)}else o.scrollTop(0);return a.stopScrollPropagation&&t(document).on("wheel.ui-timepicker",".ui-timepicker-wrapper",(function(e){e.preventDefault();var i=t(this).scrollTop();t(this).scrollTop(i+e.originalEvent.deltaY)})),t(document).on("mousedown.ui-timepicker",s),window.addEventListener("resize",s),a.closeOnWindowScroll&&t(document).on("scroll.ui-timepicker",s),i.trigger("showTimepicker"),this}}},hide:function(e){var t=this[0].timepickerObj;return t&&t.hideMe(),f.hideAll(),this},option:function(i,s){return"string"==typeof i&&void 0===s?this[0].timepickerObj.settings[i]:this.each((function(){var r=t(this),a=r[0].timepickerObj,o=a.settings,l=a.list;"object"==e(i)?o=t.extend(o,i):"string"==typeof i&&(o[i]=s),o=a.parseSettings(o),a.settings=o,a._formatValue({type:"change"},"initial"),l&&(l.remove(),a.list=null),o.useSelect&&n(r)}))},getSecondsFromMidnight:function(){var e=this[0].timepickerObj;return e.time2int(e._getTimeValue())},getTime:function(e){var t=this[0].timepickerObj,i=t._getTimeValue();if(!i)return null;var n=t.time2int(i);if(null===n)return null;e||(e=new Date);var s=new Date(e);return s.setHours(n/3600),s.setMinutes(n%3600/60),s.setSeconds(n%60),s.setMilliseconds(0),s},isVisible:function(){var e=this[0].timepickerObj;return!!(e&&e.list&&f.isVisible(e.list))},setTime:function(e){var t=this[0].timepickerObj,i=t.settings;if(i.forceRoundTime)var n=t._roundAndFormatTime(t.time2int(e));else n=t._int2time(t.time2int(e));return e&&null===n&&i.noneOption&&(n=e),t._setTimeValue(n,"initial"),t._formatValue({type:"change"},"initial"),t&&t.list&&t._setSelected(),this},remove:function(){var e=this;if(e.hasClass("ui-timepicker-input")){var t=e[0].timepickerObj,i=t.settings;return e.removeAttr("autocomplete","off"),e.removeClass("ui-timepicker-input"),e.removeData("timepicker-obj"),e.off(".timepicker"),t.list&&t.list.remove(),i.useSelect&&e.show(),t.list=null,this}}};function n(e){var n=e[0].timepickerObj,s=n.list,r=n.settings;if(s&&s.length&&(s.remove(),n.list=null),r.useSelect){s=t("",{class:"ui-timepicker-select"}),e.attr("name")&&s.attr("name","ui-timepicker-"+e.attr("name"));var a=s}else s=t("
    ",{class:"ui-timepicker-list"}),(a=t("
    ",{class:"ui-timepicker-wrapper",tabindex:-1})).css({display:"none",position:"absolute"}).append(s);if(r.noneOption)if(!0===r.noneOption&&(r.noneOption=r.useSelect?"Time...":"None"),t.isArray(r.noneOption)){for(var o in r.noneOption)if(parseInt(o,10)==o){var c=n._generateNoneElement(r.noneOption[o],r.useSelect);s.append(c)}}else c=n._generateNoneElement(r.noneOption,r.useSelect),s.append(c);r.className&&a.addClass(r.className),null===r.minTime&&null===r.durationTime||!r.showDuration||("function"==typeof r.step||r.step,a.addClass("ui-timepicker-with-duration"),a.addClass("ui-timepicker-step-"+r.step));var m=r.minTime;"function"==typeof r.durationTime?m=n.time2int(r.durationTime()):null!==r.durationTime&&(m=r.durationTime);var p=null!==r.minTime?r.minTime:0,f=null!==r.maxTime?r.maxTime:p+l-1;f",{value:T})).text(T):((y=t("
  • ")).addClass(k%l<43200?"ui-timepicker-am":"ui-timepicker-pm"),y.attr("data-time",u(k,r)),y.text(T)),(null!==r.minTime||null!==r.durationTime)&&r.showDuration){var w=n._int2duration(o-m,r.step);if(r.useSelect)y.text(y.text()+" ("+w+")");else{var _=t("",{class:"ui-timepicker-duration"});_.text(" ("+w+")"),y.append(_)}}h=d[h][1]&&(h+=1),d[h]&&k>=d[h][0]&&k0)return a=t(i),!1})),a.addClass("ui-timepicker-selected")),!1;case 40:return 0===(a=r.find(".ui-timepicker-selected")).length?(r.find("li").each((function(e,i){if(t(i).position().top>0)return a=t(i),!1})),a.addClass("ui-timepicker-selected")):a.is(":last-child")||(a.removeClass("ui-timepicker-selected"),a.next().addClass("ui-timepicker-selected"),a.next().position().top+2*a.outerHeight()>r.outerHeight()&&r.scrollTop(r.scrollTop()+a.outerHeight())),!1;case 27:r.find("li").removeClass("ui-timepicker-selected"),s.hideMe();break;case 9:s.hideMe();break;default:return!0}}t.fn.timepicker=function(n){return this.length?i[n]?this.hasClass("ui-timepicker-input")?i[n].apply(this,Array.prototype.slice.call(arguments,1)):this:"object"!==e(n)&&n?void t.error("Method "+n+" does not exist on jQuery.timepicker"):i.init.apply(this,arguments):this},t.fn.timepicker.defaults=m},"object"===("undefined"==typeof exports?"undefined":e(exports))&&exports&&"object"===("undefined"==typeof module?"undefined":e(module))&&module&&module.exports===exports?c(require("jquery")):"function"==typeof define&&define.amd?define(["jquery"],c):c(jQuery)}(); +!function(){"use strict";function e(t){return(e="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e})(t)}function t(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function i(e,t){for(var i=0;ie.length)&&(t=e.length);for(var i=0,n=new Array(t);i=e.length?{done:!0}:{done:!1,value:e[n++]}},e:function(e){throw e},f:s}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var r,o=!0,l=!1;return{s:function(){i=e[Symbol.iterator]()},n:function(){var e=i.next();return o=e.done,e},e:function(e){l=!0,r=e},f:function(){try{o||null==i.return||i.return()}finally{if(l)throw r}}}}var l=86400,u=function(e,t){if(null===e)return null;if("number"!=typeof t.step)return e;var i=e%(60*t.step);return(i-=(t.minTime||0)%(60*t.step))>=30*t.step?e+=60*t.step-i:e-=i,function(e,t){if(e==l&&t.show2400)return e;return e%l}(e,t)};var c,m={appendTo:"body",className:null,closeOnWindowScroll:!1,disableTextInput:!1,disableTimeRanges:[],disableTouchKeyboard:!1,durationTime:null,forceRoundTime:!1,lang:{},listWidth:null,maxTime:null,minTime:null,noneOption:!1,orientation:"l",roundingFunction:u,scrollDefault:null,selectOnBlur:!1,show2400:!1,showDuration:!1,showOn:["click","focus"],showOnFocus:!0,step:30,stopScrollPropagation:!1,timeFormat:"g:ia",typeaheadHighlight:!0,useSelect:!1,wrapHours:!0},p={am:"am",pm:"pm",AM:"AM",PM:"PM",decimal:".",mins:"mins",hr:"hr",hrs:"hrs"},f={bubbles:!0,cancelable:!1,detail:null},d=function(){function n(e){var i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};t(this,n),this._handleFormatValue=this._handleFormatValue.bind(this),this._handleKeyUp=this._handleKeyUp.bind(this),this.targetEl=e;var s=n.extractAttrOptions(e,Object.keys(m));this.settings=this.parseSettings(r(r(r({},m),i),s))}var s,a,u;return s=n,u=[{key:"extractAttrOptions",value:function(e,t){var i,n={},s=o(t);try{for(s.s();!(i=s.n()).done;){var r=i.value;r in e.dataset&&(n[r]=e.dataset[r])}}catch(e){s.e(e)}finally{s.f()}return n}},{key:"isVisible",value:function(e){var t=e[0];return t.offsetWidth>0&&t.offsetHeight>0}},{key:"hideAll",value:function(){var e,t=o(document.getElementsByClassName("ui-timepicker-input"));try{for(t.s();!(e=t.n()).done;){var i=e.value.timepickerObj;i&&i.hideMe()}}catch(e){t.e(e)}finally{t.f()}}}],(a=[{key:"hideMe",value:function(){if(this.settings.useSelect)this.targetEl.blur();else if(this.list&&n.isVisible(this.list)){this.settings.selectOnBlur&&this._selectValue(),this.list.hide();var e=new CustomEvent("hideTimepicker",f);this.targetEl.dispatchEvent(e)}}},{key:"_findRow",value:function(e){if(!e&&0!==e)return!1;var t=!1;return e=this.settings.roundingFunction(e,this.settings),!!this.list&&(this.list.find("li").each((function(i,n){var s=parseInt(n.dataset.time);if(!isNaN(s))return s==e?(t=n,!1):void 0})),t)}},{key:"_hideKeyboard",value:function(){return(window.navigator.msMaxTouchPoints||"ontouchstart"in document)&&this.settings.disableTouchKeyboard}},{key:"_setTimeValue",value:function(e,t){if("INPUT"===this.targetEl.nodeName){null===e&&""==this.targetEl.value||(this.targetEl.value=e);var i=this;i.settings.useSelect&&"select"!=t&&i.list&&i.list.val(i._roundAndFormatTime(i.time2int(e)))}var n=new CustomEvent("selectTime",f);if(this.selectedValue!=e){this.selectedValue=e;var s=new CustomEvent("changeTime",f),r=new CustomEvent("change",Object.assign(f,{detail:"timepicker"}));return"select"==t?(this.targetEl.dispatchEvent(n),this.targetEl.dispatchEvent(s),this.targetEl.dispatchEvent(r)):-1==["error","initial"].indexOf(t)&&this.targetEl.dispatchEvent(s),!0}return-1==["error","initial"].indexOf(t)&&this.targetEl.dispatchEvent(n),!1}},{key:"_getTimeValue",value:function(){return"INPUT"===this.targetEl.nodeName?this.targetEl.value:this.selectedValue}},{key:"_selectValue",value:function(){var e=this;e.settings;var t=e.list.find(".ui-timepicker-selected");if(t.hasClass("ui-timepicker-disabled"))return!1;if(!t.length)return!0;var i=t.get(0).dataset.time;if(i){var n=parseInt(i);isNaN(n)||(i=n)}return null!==i&&("string"!=typeof i&&(i=e._int2time(i)),e._setTimeValue(i,"select")),!0}},{key:"time2int",value:function(e){if(""===e||null==e)return null;if(e instanceof Date)return 3600*e.getHours()+60*e.getMinutes()+e.getSeconds();if("string"!=typeof e)return e;"a"!=(e=e.toLowerCase().replace(/[\s\.]/g,"")).slice(-1)&&"p"!=e.slice(-1)||(e+="m");var t=/^(([^0-9]*))?([0-9]?[0-9])(([0-5][0-9]))?(([0-5][0-9]))?(([^0-9]*))$/;e.match(/\W/)&&(t=/^(([^0-9]*))?([0-9]?[0-9])(\W+([0-5][0-9]?))?(\W+([0-5][0-9]))?(([^0-9]*))$/);var i=e.match(t);if(!i)return null;var n=parseInt(1*i[3],10),s=i[2]||i[9],r=n,a=1*i[5]||0,o=1*i[7]||0;if(s||2!=i[3].length||"0"!=i[3][0]||(s="am"),n<=12&&s){var u=(s=s.trim())==this.settings.lang.pm||s==this.settings.lang.PM;r=12==n?u?12:0:n+(u?12:0)}else if(3600*n+60*a+o>=l+(this.settings.show2400?1:0)){if(!1===this.settings.wrapHours)return null;r=n%24}var c=3600*r+60*a+o;if(n<12&&!s&&this.settings._twelveHourTime&&this.settings.scrollDefault){var m=c-this.settings.scrollDefault();m<0&&m>=-43200&&(c=(c+43200)%l)}return c}},{key:"parseSettings",value:function(e){var t=this;if(e.lang=r(r({},p),e.lang),this.settings=e,e.minTime&&(e.minTime=this.time2int(e.minTime)),e.maxTime&&(e.maxTime=this.time2int(e.maxTime)),e.listWidth&&(e.listWidth=this.time2int(e.listWidth)),e.durationTime&&"function"!=typeof e.durationTime&&(e.durationTime=this.time2int(e.durationTime)),"now"==e.scrollDefault)e.scrollDefault=function(){return e.roundingFunction(t.time2int(new Date),e)};else if(e.scrollDefault&&"function"!=typeof e.scrollDefault){var i=e.scrollDefault;e.scrollDefault=function(){return e.roundingFunction(t.time2int(i),e)}}else e.minTime&&(e.scrollDefault=function(){return e.roundingFunction(e.minTime,e)});if("string"==typeof e.timeFormat&&e.timeFormat.match(/[gh]/)&&(e._twelveHourTime=!0),!1===e.showOnFocus&&-1!=e.showOn.indexOf("focus")&&e.showOn.splice(e.showOn.indexOf("focus"),1),e.disableTimeRanges||(e.disableTimeRanges=[]),e.disableTimeRanges.length>0){for(var n in e.disableTimeRanges)e.disableTimeRanges[n]=[this.time2int(e.disableTimeRanges[n][0]),this.time2int(e.disableTimeRanges[n][1])];for(e.disableTimeRanges=e.disableTimeRanges.sort((function(e,t){return e[0]-t[0]})),n=e.disableTimeRanges.length-1;n>0;n--)e.disableTimeRanges[n][0]<=e.disableTimeRanges[n-1][1]&&(e.disableTimeRanges[n-1]=[Math.min(e.disableTimeRanges[n][0],e.disableTimeRanges[n-1][0]),Math.max(e.disableTimeRanges[n][1],e.disableTimeRanges[n-1][1])],e.disableTimeRanges.splice(n,1))}return e}},{key:"_disableTextInputHandler",value:function(e){switch(e.keyCode){case 13:case 9:return;default:e.preventDefault()}}},{key:"_int2duration",value:function(e,t){e=Math.abs(e);var i,n,s=Math.round(e/60),r=[];return s<60?r=[s,this.settings.lang.mins]:(i=Math.floor(s/60),n=s%60,30==t&&30==n&&(i+=this.settings.lang.decimal+5),r.push(i),r.push(1==i?this.settings.lang.hr:this.settings.lang.hrs),30!=t&&n&&(r.push(n),r.push(this.settings.lang.mins))),r.join(" ")}},{key:"_roundAndFormatTime",value:function(e){if(null!==(e=this.settings.roundingFunction(e,this.settings)))return this._int2time(e)}},{key:"_int2time",value:function(e){if("number"!=typeof e)return null;var t=parseInt(e%60),i=parseInt(e/60%60),n=parseInt(e/3600%24),s=new Date(1970,0,2,n,i,t,0);if(isNaN(s.getTime()))return null;if("function"==typeof this.settings.timeFormat)return this.settings.timeFormat(s);for(var r,a,o="",u=0;u11?this.settings.lang.pm:this.settings.lang.am;break;case"A":o+=s.getHours()>11?this.settings.lang.PM:this.settings.lang.AM;break;case"g":o+=0==(r=s.getHours()%12)?"12":r;break;case"G":r=s.getHours(),e===l&&(r=this.settings.show2400?24:0),o+=r;break;case"h":0!=(r=s.getHours()%12)&&r<10&&(r="0"+r),o+=0===r?"12":r;break;case"H":r=s.getHours(),e===l&&(r=this.settings.show2400?24:0),o+=r>9?r:"0"+r;break;case"i":o+=(i=s.getMinutes())>9?i:"0"+i;break;case"s":o+=(t=s.getSeconds())>9?t:"0"+t;break;case"\\":u++,o+=this.settings.timeFormat.charAt(u);break;default:o+=a}return o}},{key:"_setSelected",value:function(){var e=this.list;e.find("li").removeClass("ui-timepicker-selected");var t=this.time2int(this._getTimeValue());if(null!==t){var i=this._findRow(t);if(i){var n=i.getBoundingClientRect(),s=e.get(0).getBoundingClientRect(),r=n.top-s.top;if(r+n.height>s.height||r<0){var a=e.scrollTop()+(n.top-s.top)-n.height;e.scrollTop(a)}var o=parseInt(i.dataset.time);(this.settings.forceRoundTime||o===t)&&i.classList.add("ui-timepicker-selected")}}}},{key:"_isFocused",value:function(e){return e===document.activeElement}},{key:"_handleFormatValue",value:function(e){e&&"timepicker"==e.detail||this._formatValue(e)}},{key:"_formatValue",value:function(e,t){if(""!==this.targetEl.value){if(!this._isFocused(this.targetEl)||e&&"change"==e.type){var i=this.settings,n=this.time2int(this.targetEl.value);if(null!==n){var s=!1;null!==i.minTime&&null!==i.maxTime&&(ni.maxTime)&&(s=!0);var r,a=o(i.disableTimeRanges);try{for(a.s();!(r=a.n()).done;){var l=r.value;if(n>=l[0]&&nt(window).height()+t(window).scrollTop()?"t":"b")?(o.addClass("ui-timepicker-positioned-top"),l.top=i.offset().top-o.outerHeight()+parseInt(o.css("marginTop").replace("px",""),10)):(o.removeClass("ui-timepicker-positioned-top"),l.top=i.offset().top+i.outerHeight()+parseInt(o.css("marginTop").replace("px",""),10)),o.offset(l);var u=o.find(".ui-timepicker-selected");if(!u.length){var c=r.time2int(r._getTimeValue());null!==c?u=t(r._findRow(c)):a.scrollDefault&&(u=t(r._findRow(a.scrollDefault())))}if(u.length&&!u.hasClass("ui-timepicker-disabled")||(u=o.find("li:not(.ui-timepicker-disabled):first")),u&&u.length){var m=o.scrollTop()+u.position().top-u.outerHeight();o.scrollTop(m)}else o.scrollTop(0);return a.stopScrollPropagation&&t(document).on("wheel.ui-timepicker",".ui-timepicker-wrapper",(function(e){e.preventDefault();var i=t(this).scrollTop();t(this).scrollTop(i+e.originalEvent.deltaY)})),t(document).on("mousedown.ui-timepicker",s),window.addEventListener("resize",s),a.closeOnWindowScroll&&t(document).on("scroll.ui-timepicker",s),i.trigger("showTimepicker"),this}}},hide:function(e){var t=this[0].timepickerObj;return t&&t.hideMe(),d.hideAll(),this},option:function(i,s){return"string"==typeof i&&void 0===s?this[0].timepickerObj.settings[i]:this.each((function(){var r=t(this),a=r[0].timepickerObj,o=a.settings,l=a.list;"object"==e(i)?o=t.extend(o,i):"string"==typeof i&&(o[i]=s),o=a.parseSettings(o),a.settings=o,a._formatValue({type:"change"},"initial"),l&&(l.remove(),a.list=null),o.useSelect&&n(r)}))},getSecondsFromMidnight:function(){var e=this[0].timepickerObj;return e.time2int(e._getTimeValue())},getTime:function(e){var t=this[0].timepickerObj,i=t._getTimeValue();if(!i)return null;var n=t.time2int(i);if(null===n)return null;e||(e=new Date);var s=new Date(e);return s.setHours(n/3600),s.setMinutes(n%3600/60),s.setSeconds(n%60),s.setMilliseconds(0),s},isVisible:function(){var e=this[0].timepickerObj;return!!(e&&e.list&&d.isVisible(e.list))},setTime:function(e){var t=this[0].timepickerObj,i=t.settings;if(i.forceRoundTime)var n=t._roundAndFormatTime(t.time2int(e));else n=t._int2time(t.time2int(e));return e&&null===n&&i.noneOption&&(n=e),t._setTimeValue(n,"initial"),t._formatValue({type:"change"},"initial"),t&&t.list&&t._setSelected(),this},remove:function(){var e=this;if(e.hasClass("ui-timepicker-input")){var t=e[0].timepickerObj,i=t.settings;return e.removeAttr("autocomplete","off"),e.removeClass("ui-timepicker-input"),e.removeData("timepicker-obj"),e.off(".timepicker"),t.list&&t.list.remove(),i.useSelect&&e.show(),t.list=null,this}}};function n(e){var n=e[0].timepickerObj,s=n.list,r=n.settings;if(s&&s.length&&(s.remove(),n.list=null),r.useSelect){s=t("",{class:"ui-timepicker-select"}),e.attr("name")&&s.attr("name","ui-timepicker-"+e.attr("name"));var a=s}else s=t("
      ",{class:"ui-timepicker-list"}),(a=t("
      ",{class:"ui-timepicker-wrapper",tabindex:-1})).css({display:"none",position:"absolute"}).append(s);if(r.noneOption)if(!0===r.noneOption&&(r.noneOption=r.useSelect?"Time...":"None"),t.isArray(r.noneOption)){for(var o in r.noneOption)if(parseInt(o,10)==o){var c=n._generateNoneElement(r.noneOption[o],r.useSelect);s.append(c)}}else c=n._generateNoneElement(r.noneOption,r.useSelect),s.append(c);r.className&&a.addClass(r.className),null===r.minTime&&null===r.durationTime||!r.showDuration||("function"==typeof r.step||r.step,a.addClass("ui-timepicker-with-duration"),a.addClass("ui-timepicker-step-"+r.step));var m=r.minTime;"function"==typeof r.durationTime?m=n.time2int(r.durationTime()):null!==r.durationTime&&(m=r.durationTime);var p=null!==r.minTime?r.minTime:0,f=null!==r.maxTime?r.maxTime:p+l-1;f",{value:T})).text(T):((y=t("
    • ")).addClass(k%l<43200?"ui-timepicker-am":"ui-timepicker-pm"),y.attr("data-time",u(k,r)),y.text(T)),(null!==r.minTime||null!==r.durationTime)&&r.showDuration){var w=n._int2duration(o-m,r.step);if(r.useSelect)y.text(y.text()+" ("+w+")");else{var _=t("",{class:"ui-timepicker-duration"});_.text(" ("+w+")"),y.append(_)}}h=d[h][1]&&(h+=1),d[h]&&k>=d[h][0]&&k0)return a=t(i),!1})),a.addClass("ui-timepicker-selected")),!1;case 40:return 0===(a=r.find(".ui-timepicker-selected")).length?(r.find("li").each((function(e,i){if(t(i).position().top>0)return a=t(i),!1})),a.addClass("ui-timepicker-selected")):a.is(":last-child")||(a.removeClass("ui-timepicker-selected"),a.next().addClass("ui-timepicker-selected"),a.next().position().top+2*a.outerHeight()>r.outerHeight()&&r.scrollTop(r.scrollTop()+a.outerHeight())),!1;case 27:r.find("li").removeClass("ui-timepicker-selected"),s.hideMe();break;case 9:s.hideMe();break;default:return!0}}t.fn.timepicker=function(n){return this.length?i[n]?this.hasClass("ui-timepicker-input")?i[n].apply(this,Array.prototype.slice.call(arguments,1)):this:"object"!==e(n)&&n?void t.error("Method "+n+" does not exist on jQuery.timepicker"):i.init.apply(this,arguments):this},t.fn.timepicker.defaults=m},"object"===("undefined"==typeof exports?"undefined":e(exports))&&exports&&"object"===("undefined"==typeof module?"undefined":e(module))&&module&&module.exports===exports?c(require("jquery")):"function"==typeof define&&define.amd?define(["jquery"],c):c(jQuery)}(); diff --git a/src/__tests__/integration-test.js b/src/__tests__/integration-test.js index 7ff41bd..9fee1d7 100644 --- a/src/__tests__/integration-test.js +++ b/src/__tests__/integration-test.js @@ -1,7 +1,7 @@ jest.dontMock("jquery").dontMock("../jquery.timepicker"); import $ from "jquery"; -import { _expectThrewEvent } from '../testHelpers.js' +import { _expectThrewEvent, _expectDidntThrowEvent } from '../testHelpers.js' require("../jquery.timepicker"); @@ -91,14 +91,27 @@ test("option works", () => { ); }); -// test("setTime doesn't throw a change event", () => { -// el.dispatchEvent = jest.fn(); +test("selecting throws a change event", () => { + el.dispatchEvent = jest.fn(); -// $(el).timepicker({}); -// $(el).timepicker('setTime', '3pm'); -// $(el).timepicker('setTime', '4pm'); -// expect($(el).val()).toEqual('4:00pm'); + $(el).timepicker({}); + const initialValue = $(el).val(); + $(el).timepicker("show"); + $(".ui-timepicker-list li:first-child").trigger("click"); + const afterValue = $(el).val(); + + expect(initialValue).not.toEqual(afterValue); + _expectThrewEvent(el.dispatchEvent.mock, 'change'); +}); -// _expectThrewEvent(el.dispatchEvent.mock, 'change'); -// }); +test("setTime doesn't throw a change event", () => { + el.dispatchEvent = jest.fn(); + + $(el).timepicker({}); + $(el).timepicker('setTime', '3pm'); + $(el).timepicker('setTime', '4pm'); + expect($(el).val()).toEqual('4:00pm'); + + _expectDidntThrowEvent(el.dispatchEvent.mock, 'change'); +}); diff --git a/src/timepicker/index.js b/src/timepicker/index.js index a2f9260..961b445 100644 --- a/src/timepicker/index.js +++ b/src/timepicker/index.js @@ -1,6 +1,12 @@ import { DEFAULT_SETTINGS, DEFAULT_LANG } from "./defaults"; import { ONE_DAY } from "./constants"; +const EVENT_DEFAULTS = { + bubbles: true, + cancelable: false, + detail: null +}; + class Timepicker { constructor(targetEl, options = {}) { this._handleFormatValue = this._handleFormatValue.bind(this); @@ -60,7 +66,7 @@ class Timepicker { this.list.hide(); - const hideTimepickerEvent = new CustomEvent('hideTimepicker'); + const hideTimepickerEvent = new CustomEvent('hideTimepicker', EVENT_DEFAULTS); this.targetEl.dispatchEvent(hideTimepickerEvent); } @@ -113,13 +119,14 @@ class Timepicker { } } - const selectTimeEvent = new CustomEvent('selectTime'); + const selectTimeEvent = new CustomEvent('selectTime', EVENT_DEFAULTS); if (this.selectedValue != value) { this.selectedValue = value; - const changeTimeEvent = new CustomEvent('changeTime'); - const changeEvent = new CustomEvent('change', { detail: 'timepicker'}); + const changeTimeEvent = new CustomEvent('changeTime', EVENT_DEFAULTS); + const changeEvent = new CustomEvent('change', + Object.assign(EVENT_DEFAULTS, { detail: 'timepicker'})); if (source == "select") { this.targetEl.dispatchEvent(selectTimeEvent); @@ -572,7 +579,7 @@ class Timepicker { var seconds = this.time2int(this.targetEl.value); if (seconds === null) { - const timeFormatErrorEvent = new CustomEvent('timeFormatError'); + const timeFormatErrorEvent = new CustomEvent('timeFormatError', EVENT_DEFAULTS); this.targetEl.dispatchEvent(timeFormatErrorEvent); return; } @@ -607,7 +614,7 @@ class Timepicker { if (rangeError) { this._setTimeValue(prettyTime); - const timeRangeErrorEvent = new CustomEvent('timeRangeError'); + const timeRangeErrorEvent = new CustomEvent('timeRangeError', EVENT_DEFAULTS); this.targetEl.dispatchEvent(timeRangeErrorEvent); } else { this._setTimeValue(prettyTime, origin); @@ -707,7 +714,11 @@ class Timepicker { if ( typeof window.CustomEvent === "function" ) return false; function CustomEvent ( event, params ) { - params = params || { bubbles: false, cancelable: false, detail: null }; + if (!params) { + params = {}; + } + + params = Object.assign(EVENT_DEFAULTS, params); var evt = document.createEvent( 'CustomEvent' ); evt.initCustomEvent( event, params.bubbles, params.cancelable, params.detail ); return evt;