datatables.net-datetime
Version:
DateTime picker for DataTables.net
4 lines • 18.7 kB
JavaScript
/*! DateTime 2.0.0 for DataTables.net
* Copyright (c) SpryMedia Ltd - datatables.net/license
*/
import DataTable,{Dom,util}from"datatables.net";var dateLib;class DateTime{static use(t){dateLib=t}destroy(){var t=this.s.namespace;clearTimeout(this.s.showTo),this._hide(!0),this.dom.container.off().empty(),this.dom.input.classRemove("dt-datetime").attrRemove("autocomplete").off(".datetime"),Dom.s(document).off("."+t),Dom.w.off("."+t)}display(t,e){return void 0!==t&&this.s.display.setUTCFullYear(t),void 0!==e&&this.s.display.setUTCMonth(e-1),void 0!==t||void 0!==e?(this._setTitle(),this._setCalander(),this):this.s.display?{month:this.s.display.getUTCMonth()+1,year:this.s.display.getUTCFullYear()}:{month:null,year:null}}errorMsg(t){var e=this.dom.error;return t?e.html(t):e.empty(),this}hide(){return this._hide(),this}max(t){return this.c.maxDate="string"==typeof t?new Date(t):t,this._optionsTitle(),this._setCalander(),this}min(t){return this.c.minDate="string"==typeof t?new Date(t):t,this._optionsTitle(),this._setCalander(),this}owns(t){return 0<Dom.s(t).closest(this.dom.container.get(0)).count()}val(t,e=!0){var s;return void 0===t?this.s.d:(s=this.s.d,t instanceof Date?this.s.d=this._dateToUtc(t):null===t||""===t?this.s.d=null:"--now"===t?this.s.d=this._dateToUtc(new Date):"string"==typeof t&&(this.s.d=this._dateToUtc(this._convert(t,this.c.format,null))),!e&&void 0!==e||(this.s.d?this._writeOutput(!1,null===s&&null!==this.s.d||null!==s&&null===this.s.d||s.toString()!==this.s.d.toString()):this.dom.input.val(t)),this.s.d?this.s.display=new Date(this.s.d.toString()):this.c.display?(this.s.display=new Date,this.s.display.setUTCDate(1),this.display(this.c.display.year,this.c.display.month)):this.s.display=new Date,this.s.display.setUTCDate(1),this._setTitle(),this._setCalander(),this._setTime(),this)}valFormat(t,e){return e?(this.val(this._convert(e,t,null)),this):this._convert(this.val(),null,t)}constructor(t,e){var s=window,s=(void 0===dateLib&&(dateLib=s.moment||s.dayjs||s.luxon||null),this.c=util.object.assignDeep({},DateTime.defaults,e),this.c.classPrefix);if(!dateLib&&"YYYY-MM-DD"!==this.c.format)throw"DateTime: Without momentjs, dayjs or luxon only the format 'YYYY-MM-DD' can be used";this._isLuxon()&&"YYYY-MM-DD"==this.c.format&&(this.c.format="yyyy-MM-dd"),"string"==typeof this.c.minDate&&(this.c.minDate=new Date(this.c.minDate)),"string"==typeof this.c.maxDate&&(this.c.maxDate=new Date(this.c.maxDate));e=Dom.c("div").classAdd(s).html('<div class="'+s+'-date"><div class="'+s+'-title"><div class="'+s+'-iconLeft"><button type="button"></button></div><div class="'+s+'-iconRight"><button type="button"></button></div><div class="'+s+'-label"><span></span><select class="'+s+'-month"></select></div><div class="'+s+'-label"><span></span><select class="'+s+'-year"></select></div></div><div class="'+s+'-buttons"><a class="'+s+'-clear"></a><a class="'+s+'-today"></a><a class="'+s+'-selected"></a></div><div class="'+s+'-calendar"></div></div><div class="'+s+'-time"><div class="'+s+'-hours"></div><div class="'+s+'-minutes"></div><div class="'+s+'-seconds"></div></div><div class="'+s+'-error"></div>');this.dom={container:e,date:e.find("."+s+"-date"),title:e.find("."+s+"-title"),calendar:e.find("."+s+"-calendar"),time:e.find("."+s+"-time"),error:e.find("."+s+"-error"),buttons:e.find("."+s+"-buttons"),clear:e.find("."+s+"-clear"),today:e.find("."+s+"-today"),selected:e.find("."+s+"-selected"),previous:e.find("."+s+"-iconLeft"),next:e.find("."+s+"-iconRight"),input:Dom.s(t)},this.s={d:null,display:null,minutesRange:null,secondsRange:null,namespace:"datetime-"+DateTime._instance++,parts:{date:null!==this.c.format.match(/[yYMDd]|L(?!T)|l/),time:null!==this.c.format.match(/[Hhm]|LT|LTS/),seconds:-1!==this.c.format.indexOf("s"),hours12:null!==this.c.format.match(/[haA]/)},showTo:null},this.dom.container.append(this.dom.date).append(this.dom.time).append(this.dom.error),this.dom.date.append(this.dom.title).append(this.dom.buttons).append(this.dom.calendar),this.dom.input.classAdd("dt-datetime"),this._init()}_init(){function n(){var t=o.dom.input.val();t!==e&&(o.c.onChange.call(o,t,o.s.d,o.dom.input.get(0)),e=t)}var o=this,d=this.c.classPrefix,e=this.dom.input.val(),t=this.s.namespace;this.s.parts.date||this.dom.date.css("display","none"),this.s.parts.time||this.dom.time.css("display","none"),this.s.parts.seconds||(this.dom.time.children("div."+d+"-seconds").remove(),this.dom.time.children("span").eq(1).remove()),this.c.buttons.clear||this.dom.clear.css("display","none"),this.c.buttons.today||this.dom.today.css("display","none"),this.c.buttons.selected||this.dom.selected.css("display","none"),this._optionsTitle(),Dom.s(document).on("i18n.dt."+t,function(t,e){e.language.datetime&&(util.object.assignDeep(o.c.i18n,e.language.datetime),o._optionsTitle())}),"hidden"!==this.dom.input.attr("type")&&!this.c.alwaysVisible||(this.dom.container.classAdd("inline"),this.c.attachTo="input",this.val(this.dom.input.val(),!1),this._show()),e&&this.val(e,!1),this.dom.input.attr("autocomplete","off").on("focus.datetime click.datetime",function(){o.dom.container.isVisible()||o.dom.input.is(":disabled")||(e=o.dom.input.val(),o.val(e,!1),o._show())}).on("keyup.datetime",function(){o.val(o.dom.input.val(),!1)}),this.dom.container.get(0).addEventListener("focusin",function(t){t.stopPropagation()}),this.dom.container.on("change","select",function(){var t,e,s=Dom.s(this),i=parseInt(s.val());s.classHas(d+"-month")?(o._correctMonth(o.s.display,i),o._setTitle(),o._setCalander()):s.classHas(d+"-year")?(o.s.display.setUTCFullYear(i),o._setTitle(),o._setCalander()):s.classHas(d+"-hours")||s.classHas(d+"-ampm")?(o.s.parts.hours12?(t=parseInt(o.dom.container.find("."+d+"-hours").val(),10),e="pm"===o.dom.container.find("."+d+"-ampm").val(),o.s.d.setUTCHours(12!==t||e?e&&12!==t?t+12:t:0)):o.s.d.setUTCHours(i),o._setTime(),o._writeOutput(!0),n()):s.classHas(d+"-minutes")?(o.s.d.setUTCMinutes(i),o._setTime(),o._writeOutput(!0),n()):s.classHas(d+"-seconds")&&(o.s.d.setSeconds(i),o._setTime(),o._writeOutput(!0),n()),o.dom.input.focus(),o._position()}).on("click",function(t){var e=o.s.d,s="span"===t.target.nodeName.toLowerCase()?t.target.parentNode:t.target,i=s.nodeName.toLowerCase();if("select"!==i)if(t.stopPropagation(),"a"===i&&(t.preventDefault(),Dom.s(s).classHas(d+"-clear")?(o.s.d=null,o.dom.input.val(""),o._writeOutput(),o._setCalander(),o._setTime(),n()):Dom.s(s).classHas(d+"-today")?(o.s.display=new Date,o._setTitle(),o._setCalander()):Dom.s(s).classHas(d+"-selected")&&(o.s.display=new Date(o.s.d.getTime()),o._setTitle(),o._setCalander())),"button"===i){t=Dom.s(s),i=t.parent();if(i.classHas("disabled")&&!i.classHas("range"))t.blur();else if(i.classHas(d+"-iconLeft"))o.s.display.setUTCMonth(o.s.display.getUTCMonth()-1),o._setTitle(),o._setCalander(),o.dom.input.focus();else if(i.classHas(d+"-iconRight"))o._correctMonth(o.s.display,o.s.display.getUTCMonth()+1),o._setTitle(),o._setCalander(),o.dom.input.focus();else{if(t.closest("."+d+"-time").count()){var s=t.data("value"),a=t.data("unit"),e=o._needValue();if("minutes"===a){if(i.classHas("disabled")&&i.classHas("range"))return o.s.minutesRange=s,void o._setTime();o.s.minutesRange=null}if("seconds"===a){if(i.classHas("disabled")&&i.classHas("range"))return o.s.secondsRange=s,void o._setTime();o.s.secondsRange=null}if("am"===s){if(!(12<=e.getUTCHours()))return;s=e.getUTCHours()-12}else if("pm"===s){if(!(e.getUTCHours()<12))return;s=e.getUTCHours()+12}e["hours"===a?"setUTCHours":"minutes"===a?"setUTCMinutes":"setSeconds"](s),o._setCalander(),o._setTime(),o._writeOutput(!0)}else(e=o._needValue()).setUTCDate(1),e.setUTCFullYear(t.data("year")),e.setUTCMonth(t.data("month")),e.setUTCDate(t.data("day")),o._writeOutput(!0),o.s.parts.time?(o._setCalander(),o._setTime()):setTimeout(function(){o._hide()},10);n()}}else o.dom.input.focus()})}_compareDates(t,e){return this._isLuxon()?dateLib.DateTime.fromJSDate(t).toUTC().toISODate()===dateLib.DateTime.fromJSDate(e).toUTC().toISODate():this._dateToUtcString(t)===this._dateToUtcString(e)}_convert(t,e,s){var i;return t&&(dateLib?this._isLuxon()?(i=t instanceof Date?dateLib.DateTime.fromJSDate(t).toUTC():dateLib.DateTime.fromFormat(t,e)).isValid?s?i.toFormat(s):i.toJSDate():null:(i=t instanceof Date?dateLib.utc(t,void 0,this.c.locale,this.c.strict):dateLib(t,e,this.c.locale,this.c.strict)).isValid()?s?i.format(s):i.toDate():null:!e&&!s||e&&s?t:!e&&t instanceof Date?t.getUTCFullYear()+"-"+this._pad(t.getUTCMonth()+1)+"-"+this._pad(t.getUTCDate()):"string"==typeof t?(i=t.match(/(\d{4})\-(\d{2})\-(\d{2})/))?new Date(parseInt(i[1]),parseInt(i[2])-1,parseInt(i[3])):null:void 0)}_correctMonth(t,e){var s=this._daysInMonth(t.getUTCFullYear(),e),i=t.getUTCDate()>s;t.setUTCMonth(e),i&&(t.setUTCDate(s),t.setUTCMonth(e))}_daysInMonth(t,e){return[31,t%4==0&&(t%100!=0||t%400==0)?29:28,31,30,31,30,31,31,30,31,30,31][e]}_dateToUtc(t){return t&&new Date(Date.UTC(t.getFullYear(),t.getMonth(),t.getDate(),t.getHours(),t.getMinutes(),t.getSeconds()))}_dateToUtcString(t){return this._isLuxon()?dateLib.DateTime.fromJSDate(t).toUTC().toISODate():t.getUTCFullYear()+"-"+this._pad(t.getUTCMonth()+1)+"-"+this._pad(t.getUTCDate())}_hide(t=!1){t||"hidden"!==this.dom.input.attr("type")&&!this.c.alwaysVisible?(t=this.s.namespace,this.dom.container.detach(),Dom.w.off("."+t),Dom.s(document).off("keydown."+t).off("keyup."+t).off("click."+t),Dom.s("div.dt-scroll").off("scroll."+t),Dom.s("div.DTE_Body_Content").off("scroll."+t),Dom.s(this.dom.input.get(0).offsetParent).off("."+t)):(this._setCalander(),this._setTime())}_hours24To12(t){return 0===t?12:12<t?t-12:t}_htmlDay(t){var e,s=this.c.classPrefix;return t.empty?'<td class="'+s+'-empty"></td>':(e=["selectable"],t.disabled&&e.push("disabled"),t.today&&e.push("now"),t.selected&&e.push("selected"),'<td data-day="'+t.day+'" class="'+e.join(" ")+'"><button class="'+s+"-button "+s+'-day" type="button" data-year="'+t.year+'" data-month="'+t.month+'" data-day="'+t.day+'"><span>'+t.day+"</span></button></td>")}_htmlMonth(t,e){for(var s=this._dateToUtc(new Date),i=this._daysInMonth(t,e),a=new Date(Date.UTC(t,e,1)).getUTCDay(),n=[],o=[],d=(null===this.c.firstDay&&(this.c.firstDay=this._localeFirstDay()),0<this.c.firstDay&&(a-=this.c.firstDay)<0&&(a+=7),i+a),l=d;7<l;)l-=7;d+=7-l;var r=this.c.minDate,c=this.c.maxDate;r&&(r.setUTCHours(0),r.setUTCMinutes(0),r.setSeconds(0)),c&&(c.setUTCHours(23),c.setUTCMinutes(59),c.setSeconds(59));for(var h=0,u=0;h<d;h++){var m=new Date(Date.UTC(t,e,h-a+1)),p=!!this.s.d&&this._compareDates(m,this.s.d),f=this._compareDates(m,s),D=h<a||i+a<=h,y=r&&m<r||c&&c<m,T=this.c.disableDays,p={day:h-a+1,month:e,year:t,selected:p,today:f,disabled:y=Array.isArray(T)&&T.includes(m.getUTCDay())||"function"==typeof T&&!0===T(m)?!0:y,empty:D};o.push(this._htmlDay(p)),7==++u&&(this.c.showWeekNumber&&o.unshift(this._htmlWeekOfYear(h-a,e,t)),n.push("<tr>"+o.join("")+"</tr>"),o=[],u=0)}var v,_=this.c.classPrefix,b=_+"-table";return this.c.showWeekNumber&&(b+=" weekNumber"),r&&(v=r>=new Date(Date.UTC(t,e,1,0,0,0)),this.dom.title.find("div."+_+"-iconLeft").css("display",v?"none":"block")),c&&(v=c<new Date(Date.UTC(t,e+1,1,0,0,0)),this.dom.title.find("div."+_+"-iconRight").css("display",v?"none":"block")),'<table class="'+b+'"><thead>'+this._htmlMonthHead()+"</thead><tbody>"+n.join("")+"</tbody></table>"}_htmlMonthHead(){var t=[],e=this.c.firstDay,s=this.c.i18n;this.c.showWeekNumber&&t.push("<th></th>");for(var i=0;i<7;i++)t.push("<th>"+(t=>{for(t+=e;7<=t;)t-=7;return s.weekdays[t]})(i)+"</th>");return t.join("")}_htmlWeekOfYear(t,e,s){e=new Date(s,e,t,0,0,0,0),e.setDate(e.getDate()+4-(e.getDay()||7)),t=new Date(s,0,1),s=Math.ceil(((e-t)/864e5+1)/7);return'<td class="'+this.c.classPrefix+'-week">'+s+"</td>"}_isLuxon(){return!!(dateLib&&dateLib.DateTime&&dateLib.Duration&&dateLib.Settings)}_isMoment(){return!(!dateLib||"function"!=typeof dateLib.isDate||"function"!=typeof dateLib.weekdays)}_localeFirstDay(){if("en"===this.c.locale){var t=(new Intl.NumberFormat).resolvedOptions().locale;if(Intl.Locale){t=new Intl.Locale(t);if(t.getWeekInfo){t=t.getWeekInfo();if("function"==typeof t.firstDay)return t.firstDay();if("number"==typeof t.firstDay)return t.firstDay}}}return this._isMoment()?dateLib.localeData(this.c.locale).firstDayOfWeek():1}_needValue(){return this.s.d||(this.s.d=this._dateToUtc(new Date),this.s.parts.time)||(this.s.d.setUTCHours(0),this.s.d.setUTCMinutes(0),this.s.d.setSeconds(0),this.s.d.setMilliseconds(0)),this.s.d}_options(t,e,s){s=s||e;var i=this.dom.container.find("select."+this.c.classPrefix+"-"+t);i.empty();for(var a=0,n=e.length;a<n;a++)i.append(Dom.c("option").attr("value",e[a]).text(s[a]))}_optionSet(t,e){var t=this.dom.container.find("select."+this.c.classPrefix+"-"+t),s=t.parent().children("span"),e=(t.val(e),t.find("option").filter(t=>t.selected));s.html(0!==e.count()?e.text():this.c.i18n.unknown)}_optionsTime(a,n,o,d,t){var e,l=this.c.classPrefix,s=this.dom.container.find("div."+l+"-"+a),i=12===n?function(t){return t}:this._pad,r=l+"-table",c=this.c.i18n;if(s.count()){var h="",u=10,m=function(t,e,s=null){12===n&&"number"==typeof t&&(12<=o&&(t+=12),12==t?t=0:24==t&&(t=12));var i=o===t||"am"===t&&o<12||"pm"===t&&12<=o?"selected":"";return"number"==typeof t&&d&&!d.includes(t)&&(i+=" disabled"),s&&(i+=" "+s),'<td class="selectable '+i+'"><button class="'+l+"-button "+l+'-day" type="button" data-unit="'+a+'" data-value="'+t+'"><span>'+e+"</span></button></td>"};if(12===n){for(h+="<tr>",e=1;e<=6;e++)h+=m(e,i(e));for(h=(h+=m("am",c.amPm[0]))+"</tr>"+"<tr>",e=7;e<=12;e++)h+=m(e,i(e));h=h+m("pm",c.amPm[1])+"</tr>",u=7}else{if(24===n)for(var p=0,f=0;f<4;f++){for(h+="<tr>",e=0;e<6;e++)h+=m(p,i(p)),p++;h+="</tr>"}else{for(h+="<tr>",f=0;f<60;f+=10)h+=m(f,i(f),"range");var h=h+"</tr>"+('</tbody></thead><table class="'+r+" "+r+'-nospace"><tbody>'),D=null!==t?t:-1===o?0:10*Math.floor(o/10);for(h+="<tr>",f=D+1;f<D+10;f++)h+=m(f,i(f));h+="</tr>"}u=6}s.empty().html('<table class="'+r+'"><thead><tr><th colspan="'+u+'">'+c[a]+"</th></tr></thead><tbody>"+h+"</tbody></table>")}}_optionsTitle(){var t=this.c.i18n,e=this.c.minDate,s=this.c.maxDate,e=e?e.getFullYear():null,s=s?s.getFullYear():null,e=null!==e?e:(new Date).getFullYear()-this.c.yearRange,s=null!==s?s:(new Date).getFullYear()+this.c.yearRange;this._options("month",this._range(0,11),t.months),this._options("year",this._range(e,s)),this.dom.today.text(t.today).text(t.today),this.dom.selected.text(t.selected).text(t.selected),this.dom.clear.text(t.clear).text(t.clear),this.dom.previous.attr("title",t.previous).children("button").text(t.previous),this.dom.next.attr("title",t.next).children("button").text(t.next)}_pad(t){return t<10?"0"+t:t}_position(){var t,e,s,i="input"===this.c.attachTo?this.dom.input.position():this.dom.input.offset(),a=this.dom.container,n=this.dom.input.height("outer");a.classHas("inline")?a.insertAfter(this.dom.input):(this.s.parts.date&&this.s.parts.time&&550<Dom.w.width()?a.classAdd("horizontal"):a.classRemove("horizontal"),"input"===this.c.attachTo?a.css({top:i.top+n+"px",left:i.left+"px"}).insertAfter(this.dom.input):a.css({top:i.top+n+"px",left:i.left+"px"}).appendTo("body"),t=a.height("outer"),e=a.width("outer"),s=Dom.w.scrollTop(),i.top+n+t-s>Dom.w.height()&&(n=i.top-t,a.css("top",n<0?"0":n+"px")),e+i.left>Dom.w.width()&&(s=Dom.w.width()-e-5,"input"===this.c.attachTo&&(s-=a.map(t=>t.offsetParent).offset().left),a.css("left",s<0?"0":s+"px")))}_range(t,e,s=1){for(var i=[],a=t;a<=e;a+=s)i.push(a);return i}_setCalander(){this.s.display&&this.dom.calendar.empty().html(this._htmlMonth(this.s.display.getUTCFullYear(),this.s.display.getUTCMonth()))}_setTitle(){this._optionSet("month",this.s.display.getUTCMonth()),this._optionSet("year",this.s.display.getUTCFullYear())}_setTime(){function t(t){return e.c[t+"Available"]||e._range(0,59,e.c[t+"Increment"])}var e=this,s=this.s.d,i=null,a=null!=(i=this._isLuxon()?dateLib.DateTime.fromJSDate(s).toUTC():i)?i.hour:s?s.getUTCHours():-1;this._optionsTime("hours",this.s.parts.hours12?12:24,a,this.c.hoursAvailable),this._optionsTime("minutes",60,null!=i?i.minute:s?s.getUTCMinutes():-1,t("minutes"),this.s.minutesRange),this._optionsTime("seconds",60,null!=i?i.second:s?s.getSeconds():-1,t("seconds"),this.s.secondsRange)}_show(){var e=this,t=this.s.namespace,s=(this._position(),Dom.w.on("scroll."+t+" resize."+t,function(){e._position()}),Dom.s("div.DTE_Body_Content").on("scroll."+t,function(){e._position()}),Dom.s("div.dt-scroll").on("scroll."+t,function(){e._position()}),this.dom.input.get(0).offsetParent);s!==document.body&&Dom.s(s).on("scroll."+t,function(){e._position()}),Dom.s(document).on("keydown."+t,function(t){!e.dom.container.isVisible()||9!==t.keyCode&&13!==t.keyCode||e._hide()}),Dom.s(document).on("keyup."+t,function(t){e.dom.container.isVisible()&&27===t.keyCode&&(t.preventDefault(),e._hide())}),clearTimeout(this.s.showTo),this.dom.input.on("blur",function(t){e.s.showTo=setTimeout(function(){var t=document.activeElement.tagName.toLowerCase();document.activeElement===e.dom.input.get(0)||e.dom.container.find(document.activeElement).count()||["input","select","button"].includes(t)&&e.hide()},10)}),setTimeout(function(){Dom.s(document).on("click."+t,function(t){Dom.s(t.target).closest(e.dom.container.get(0)).count()||t.target===e.dom.input.get(0)||e._hide()})},10)}_writeOutput(t=!1,e=!0){var s=this.s.d,i="",a=this.dom.input;s&&(i=this._convert(s,null,this.c.format)),a.val(i),e&&(s=new Event("change",{bubbles:!0}),a.get(0).dispatchEvent(s)),"hidden"===a.attr("type")&&this.val(i,!1),t&&a.focus()}}DateTime._instance=0,DateTime.type="DateTime",DateTime.defaults={alwaysVisible:!1,attachTo:"body",buttons:{clear:!1,selected:!1,today:!1},classPrefix:"dt-datetime",disableDays:null,display:null,firstDay:null,format:"YYYY-MM-DD",hoursAvailable:null,i18n:{clear:"Clear",previous:"Previous",next:"Next",months:["January","February","March","April","May","June","July","August","September","October","November","December"],weekdays:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],amPm:["am","pm"],hours:"Hour",minutes:"Minute",seconds:"Second",unknown:"-",today:"Today",selected:"Selected"},maxDate:null,minDate:null,minutesAvailable:null,minutesIncrement:1,strict:!0,locale:"en",onChange:()=>{},secondsAvailable:null,secondsIncrement:1,showWeekNumber:!1,yearRange:25},DateTime.version="2.0.0",window.DateTime||(window.DateTime=DateTime),window.jQuery&&(window.jQuery.fn.dtDateTime=function(t){return this.each(function(){new DateTime(this,t)})}),DataTable.DateTime=DateTime,DataTable.use("datetime",DateTime),DataTable.Editor&&(DataTable.Editor.DateTime=DateTime);export default DateTime;