budgit/assets/js/calendar.min.js
2025-12-10 16:05:30 -05:00

1 line
6 KiB
JavaScript

(()=>{(function(){"use strict";function m(t){if(!t)return null;let a=t.split("-");if(a.length!==3)return null;let n=parseInt(a[0],10),e=parseInt(a[1],10)-1,r=parseInt(a[2],10),s=new Date(Date.UTC(n,e,r));return s.getUTCFullYear()===n&&s.getUTCMonth()===e&&s.getUTCDate()===r?s:null}function y(t){try{return Array.from({length:12},(a,n)=>new Intl.DateTimeFormat(t,{month:"short",timeZone:"UTC"}).format(new Date(Date.UTC(2e3,n,1))))}catch{return["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"]}}function v(t,a){try{return Array.from({length:7},(n,e)=>new Intl.DateTimeFormat(t,{weekday:"short",timeZone:"UTC"}).format(new Date(Date.UTC(2e3,0,e+2+a))))}catch{return["Su","Mo","Tu","We","Th","Fr","Sa"]}}function p(t){let n=t.closest("[data-tui-calendar-wrapper]")?.querySelector("[data-tui-calendar-hidden-input]");if(!n&&t.id){let e=t.id.replace("-calendar-instance","");n=document.getElementById(e+"-hidden")}return n}function u(t){let a=t.querySelector("[data-tui-calendar-weekdays]"),n=t.querySelector("[data-tui-calendar-days]");if(!a||!n)return;let e=parseInt(t.dataset.tuiCalendarCurrentMonth),r=parseInt(t.dataset.tuiCalendarCurrentYear);if(isNaN(e)||isNaN(r)){let d=parseInt(t.getAttribute("data-tui-calendar-initial-month")),l=parseInt(t.getAttribute("data-tui-calendar-initial-year")),h=t.getAttribute("data-tui-calendar-selected-date");if(h){let f=m(h);f&&(e=f.getUTCMonth(),r=f.getUTCFullYear())}isNaN(e)&&(e=isNaN(d)?new Date().getMonth():d),isNaN(r)&&(r=!isNaN(l)&&l>0?l:new Date().getFullYear()),t.dataset.tuiCalendarCurrentMonth=e,t.dataset.tuiCalendarCurrentYear=r}let s=t.getAttribute("data-tui-calendar-locale-tag")||"en-US",i=parseInt(t.getAttribute("data-tui-calendar-start-of-week"))||1,o=t.getAttribute("data-tui-calendar-selected-date"),c=o?m(o):null,M=y(s),w=t.querySelector(`#${t.id}-month-value`),T=t.querySelector(`#${t.id}-year-value`);if(w&&(w.textContent=M[e]),T&&(T.textContent=r),!a.children.length){let d=v(s,i);a.innerHTML=d.map(l=>`<div class="text-center text-xs text-muted-foreground font-medium">${l}</div>`).join("")}n.innerHTML="";let I=((new Date(Date.UTC(r,e,1)).getUTCDay()-i)%7+7)%7,S=new Date(Date.UTC(r,e+1,0)).getUTCDate(),C=new Date,b=new Date(Date.UTC(C.getFullYear(),C.getMonth(),C.getDate()));for(let d=0;d<I;d++)n.innerHTML+='<div class="h-8 w-8"></div>';for(let d=1;d<=S;d++){let l=new Date(Date.UTC(r,e,d)),h=c&&l.getTime()===c.getTime(),f=l.getTime()===b.getTime(),g="inline-flex h-8 w-8 items-center justify-center rounded-md text-sm font-medium focus:outline-none focus:ring-1 focus:ring-ring";h?g+=" bg-primary text-primary-foreground hover:bg-primary/90":f?g+=" bg-accent text-accent-foreground":g+=" hover:bg-accent hover:text-accent-foreground";let Y=[`data-tui-calendar-day="${d}"`,f?'data-tui-calendar-today="true"':"",h?'data-tui-calendar-selected="true"':""].filter(Boolean).join(" ");n.innerHTML+=`<button type="button" class="${g}" ${Y}>${d}</button>`}}document.addEventListener("change",t=>{if(t.target.matches("[data-tui-calendar-month-select]")){let a=t.target.closest("[data-tui-calendar-container]");if(!a)return;let n=parseInt(t.target.value,10);if(isNaN(n))return;a.dataset.tuiCalendarCurrentMonth=n,u(a);return}if(t.target.matches("[data-tui-calendar-year-select]")){let a=t.target.closest("[data-tui-calendar-container]");if(!a)return;let n=parseInt(t.target.value,10);if(isNaN(n))return;a.dataset.tuiCalendarCurrentYear=n,u(a);return}}),document.addEventListener("click",t=>{let a=t.target.closest("[data-tui-calendar-prev]");if(a){let e=a.closest("[data-tui-calendar-container]");if(!e)return;let r=parseInt(e.dataset.tuiCalendarCurrentMonth,10),s=parseInt(e.dataset.tuiCalendarCurrentYear,10);isNaN(r)&&(r=new Date().getMonth()),isNaN(s)&&(s=new Date().getFullYear()),r--,r<0&&(r=11,s--),e.dataset.tuiCalendarCurrentMonth=r,e.dataset.tuiCalendarCurrentYear=s,u(e),D(e);return}let n=t.target.closest("[data-tui-calendar-next]");if(n){let e=n.closest("[data-tui-calendar-container]");if(!e)return;let r=parseInt(e.dataset.tuiCalendarCurrentMonth,10),s=parseInt(e.dataset.tuiCalendarCurrentYear,10);isNaN(r)&&(r=new Date().getMonth()),isNaN(s)&&(s=new Date().getFullYear()),r++,r>11&&(r=0,s++),e.dataset.tuiCalendarCurrentMonth=r,e.dataset.tuiCalendarCurrentYear=s,u(e),D(e);return}if(t.target.matches("[data-tui-calendar-day]")){let e=t.target.closest("[data-tui-calendar-container]");if(!e)return;let r=parseInt(t.target.dataset.tuiCalendarDay),s=parseInt(e.dataset.tuiCalendarCurrentMonth,10),i=parseInt(e.dataset.tuiCalendarCurrentYear,10);isNaN(s)&&(s=new Date().getMonth()),isNaN(i)&&(i=new Date().getFullYear());let o=new Date(Date.UTC(i,s,r));e.setAttribute("data-tui-calendar-selected-date",o.toISOString().split("T")[0]);let c=p(e);c&&(c.value=o.toISOString().split("T")[0],c.dispatchEvent(new Event("change",{bubbles:!0}))),e.dispatchEvent(new CustomEvent("calendar-date-selected",{bubbles:!0,detail:{date:o}})),u(e)}});function D(t){let a=parseInt(t.dataset.tuiCalendarCurrentMonth,10),n=parseInt(t.dataset.tuiCalendarCurrentYear,10);if(isNaN(a)||isNaN(n))return;let e=t.querySelector("[data-tui-calendar-month-select]");e&&(e.value=a.toString());let r=t.querySelector("[data-tui-calendar-year-select]");r&&(r.value=n.toString())}document.addEventListener("reset",t=>{t.target.matches("form")&&t.target.querySelectorAll("[data-tui-calendar-container]").forEach(a=>{let n=p(a);n&&(n.value=""),a.removeAttribute("data-tui-calendar-selected-date");let e=new Date;a.dataset.tuiCalendarCurrentMonth=e.getMonth(),a.dataset.tuiCalendarCurrentYear=e.getFullYear(),u(a)})}),new MutationObserver(()=>{document.querySelectorAll("[data-tui-calendar-container]").forEach(t=>{let a=t.querySelector("[data-tui-calendar-days]");a&&!a.children.length&&u(t)})}).observe(document.body,{childList:!0,subtree:!0});function N(){document.querySelectorAll("[data-tui-calendar-container]").forEach(t=>{let a=t.getAttribute("data-tui-calendar-locale-tag")||"en-US",n=y(a),e=t.querySelector("[data-tui-calendar-month-select]");e&&e.querySelectorAll("option").forEach((s,i)=>{n[i]&&(s.textContent=n[i])}),u(t)})}document.readyState==="loading"?document.addEventListener("DOMContentLoaded",N):N()})();})();