scanfile/server/web/assets/js/calendar.min.js

1 line
3.6 KiB
JavaScript

(()=>{(function(){function w(e){if(!e||e.hasAttribute("data-initialized"))return;e.setAttribute("data-initialized","true");let f=e.querySelector("[data-calendar-month-display]"),g=e.querySelector("[data-calendar-weekdays]"),h=e.querySelector("[data-calendar-days]"),v=e.querySelector("[data-calendar-prev]"),b=e.querySelector("[data-calendar-next]"),M=e.closest("[data-calendar-wrapper]"),y=M?M.querySelector("[data-calendar-hidden-input]"):null;if(!f||!g||!h||!v||!b||!y){console.error("Calendar init error: Missing required elements (or hidden input relative to wrapper).",e);return}let D=e.dataset.localeTag||"en-US",C;try{C=Array.from({length:12},(a,t)=>new Intl.DateTimeFormat(D,{month:"long",timeZone:"UTC"}).format(new Date(Date.UTC(2e3,t,1))))}catch(a){console.error(`Calendar: Error generating month names via Intl (locale: "${D}"). Falling back to English.`,a),C=["January","February","March","April","May","June","July","August","September","October","November","December"]}let U=["Su","Mo","Tu","We","Th","Fr","Sa"];try{U=Array.from({length:7},(a,t)=>new Intl.DateTimeFormat(D,{weekday:"short"}).format(new Date(Date.UTC(2e3,0,t))))}catch(a){console.error("Error generating calendar day names via Intl:",a)}let n=parseInt(e.dataset.initialMonth),l=parseInt(e.dataset.initialYear),u=null;e.dataset.selectedDate&&(u=E(e.dataset.selectedDate));function E(a){if(!a)return null;try{let t=a.split("-"),o=parseInt(t[0],10),i=parseInt(t[1],10)-1,c=parseInt(t[2],10),s=new Date(Date.UTC(o,i,c));if(!isNaN(s)&&s.getUTCFullYear()===o&&s.getUTCMonth()===i&&s.getUTCDate()===c)return s}catch{}return null}function p(){let a=Math.max(0,Math.min(11,n)),o=`${C[a]} ${l}`;f.textContent=o}function S(){g.innerHTML="",U.forEach(a=>{let t=document.createElement("div");t.className="text-center text-xs text-muted-foreground font-medium",t.textContent=a,g.appendChild(t)})}function m(){h.innerHTML="";let o=new Date(Date.UTC(l,n,1)).getUTCDay(),i=new Date(Date.UTC(l,n+1,0)).getUTCDate(),c=new Date,s=new Date(Date.UTC(c.getFullYear(),c.getMonth(),c.getDate()));for(let d=0;d<o;d++){let r=document.createElement("div");r.className="h-8 w-8",h.appendChild(r)}for(let d=1;d<=i;d++){let r=document.createElement("button");r.type="button",r.className="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",r.textContent=d,r.dataset.day=d;let x=new Date(Date.UTC(l,n,d)),F=u&&x.getTime()===u.getTime(),q=x.getTime()===s.getTime();F?r.classList.add("bg-primary","text-primary-foreground","hover:bg-primary/90"):q?r.classList.add("bg-accent","text-accent-foreground"):r.classList.add("hover:bg-accent","hover:text-accent-foreground"),r.addEventListener("click",N),h.appendChild(r)}}function k(){n--,n<0&&(n=11,l--),p(),m()}function L(){n++,n>11&&(n=0,l++),p(),m()}function N(a){let t=parseInt(a.target.dataset.day);if(!t)return;let o=new Date(Date.UTC(l,n,t));u=o;let i=o.toISOString().split("T")[0];y.value=i,y.dispatchEvent(new Event("change",{bubbles:!0})),e.dispatchEvent(new CustomEvent("calendar-date-selected",{bubbles:!0,detail:{date:o}})),m()}v.addEventListener("click",k),b.addEventListener("click",L),p(),S(),m();let I=e.closest("form");I&&I.addEventListener("reset",()=>{u=null,y.value="",n=new Date().getMonth(),l=new Date().getFullYear(),p(),m()}),e._calendarInitialized=!0}function T(e=document){e instanceof Element&&e.matches("[data-calendar-container]")&&w(e);for(let f of e.querySelectorAll("[data-calendar-container]:not([data-initialized])"))w(f)}window.templUI=window.templUI||{},window.templUI.calendar={init:T},document.addEventListener("DOMContentLoaded",()=>T())})();})();