class DatesPopup extends HTMLElement{ static DAY = new Date(24*60*60*1000); constructor(goToNowCallback, jumpCallback){ super(); this.goToNowCallback = goToNowCallback; this.jumpCallback = jumpCallback; } getDateTimeInput(){ let dateInputValue = this.getElementsByClassName("input-date")[0].valueAsDate; let today = new Date(); if(dateInputValue > today){ dateInputValue = today; alertify.warning("Date in the future : using today"); } dateInputValue.setHours(0,0,0,0); let hours = this.getElementsByClassName("input-time-hour")[0].value; if(hours < 0 || hours > 23){ alertify.error("Invalid hours"); throw RangeError; } let minutes = this.getElementsByClassName("input-time-minute")[0].value; if(minutes < 0 || minutes > 59){ alertify.error("Invalid minutes"); throw RangeError; } let timeMs = this.convertTimeComponentsToTimestamp(hours, minutes); return [dateInputValue.getTime(), timeMs]; } doJumpCallback(){ try{ let dateTimeInput = this.getDateTimeInput(); this.hide(); this.jumpCallback(dateTimeInput[0], dateTimeInput[1]); } catch(e){} } convertTimeComponentsToTimestamp(hours, minutes){ return hours*60*60*1000 + minutes*60*1000; } doGoToNowCallback(){ this.hide(); this.goToNowCallback(); } hide(){ this.style.visibility = "hidden"; window.removeEventListener("click", this.backgroundClickCallback); } backgroundClickCallback = ({target}) => { if(target.id == "dates-popup"){ this.hide(); } } show(){ this.setMaxInputDate(); window.addEventListener("click", this.backgroundClickCallback); this.style.visibility = "visible"; } getCorrectedCurrentDate(){ let currentDate = new Date(); let correctedCurrentDate = new Date(Date.UTC(currentDate.getFullYear(), currentDate.getMonth(), currentDate.getDate())); return correctedCurrentDate; } setInitialInputDate(){ let dateInput = this.getElementsByClassName("input-date")[0]; let dateDayBefore = new Date(this.getCorrectedCurrentDate() - DatesPopup.DAY); dateInput.valueAsDate = dateDayBefore; } setMaxInputDate(){ let dateInput = this.getElementsByClassName("input-date")[0]; dateInput.max = this.getCorrectedCurrentDate().toISOString().split("T")[0]; // sets the max to today (set each time the pop up is displayed) } connectedCallback(){ this.render(); this.hide(); this.setInitialInputDate(); this.getElementsByTagName("img")[0].onclick = () => {this.hide();}; this.getElementsByClassName("go-to-now-button")[0].onclick = () => {this.doGoToNowCallback();}; this.getElementsByClassName("jump-button")[0].onclick = () => {this.doJumpCallback();}; } render(){ this.innerHTML = `
Select the date to jump to
Date :
Time :
`; } } customElements.define("sea-dates-popup", DatesPopup);