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"; } show(){ this.style.visibility = "visible"; } setInitialDate(){ let currentDate = new Date(); let dateInput = this.getElementsByClassName("input-date")[0]; let dateDayBefore = new Date(currentDate - DatesPopup.DAY); dateInput.valueAsDate = dateDayBefore; } connectedCallback(){ this.render(); this.setInitialDate(); this.hide(); this.getElementsByTagName("img")[0].onclick = () => {this.hide();}; this.getElementsByClassName("go-to-now-button")[0].onclick = () => {this.doGoToNowCallback();}; this.getElementsByClassName("input-date")[0].max = new Date().toISOString().split("T")[0]; // sets the max to today (set only at app start) 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);