budgit/assets/js/timepicker.min.js
2026-01-18 22:23:21 +00:00

1 line
5.4 KiB
JavaScript

(()=>{(function(){"use strict";function I(i){if(i._tui)return;i._tui=!0;let t=Object.getOwnPropertyDescriptor(HTMLInputElement.prototype,"value");t?.set&&Object.defineProperty(i,"value",{get:t.get,set(u){let e=this.value;t.set.call(this,u),e!==u&&this.dispatchEvent(new Event("input",{bubbles:!0}))},configurable:!0})}function s(i){let t=i?.match(/^(\d{1,2}):(\d{2})$/);if(!t)return null;let[u,e,r]=t.map(Number);return e>=0&&e<=23&&r>=0&&r<=59?{hour:e,minute:r}:null}function h(i,t,u){if(i===null||t===null)return null;let e=r=>r.toString().padStart(2,"0");if(u){let r=i===0?12:i>12?i-12:i;return`${e(r)}:${e(t)} ${i>=12?"PM":"AM"}`}return`${e(i)}:${e(t)}`}function l(i,t,u,e){if(!u&&!e)return!0;let r=i*60+t;if(u){let n=u.hour*60+u.minute;if(r<n)return!1}if(e){let n=e.hour*60+e.minute;if(r>n)return!1}return!0}function d(i){let t=i.closest("[data-tui-timepicker-popup]");if(!t)return null;let u=t.closest("[id]")?.id;return u?document.getElementById(u.replace("-content","")):null}function k(i){let t=i.id+"-content",u=document.getElementById(t)?.querySelector("[data-tui-timepicker-popup]");return u?{popup:u,hourList:u.querySelector("[data-tui-timepicker-hour-list]"),minuteList:u.querySelector("[data-tui-timepicker-minute-list]"),hiddenInput:document.getElementById(i.id+"-hidden")||i.parentElement?.querySelector("[data-tui-timepicker-hidden-input]")}:null}function m(i){return{hour:i.dataset.tuiTimepickerCurrentHour?parseInt(i.dataset.tuiTimepickerCurrentHour):null,minute:i.dataset.tuiTimepickerCurrentMinute?parseInt(i.dataset.tuiTimepickerCurrentMinute):null,use12Hours:i.getAttribute("data-tui-timepicker-use12hours")==="true",step:parseInt(i.getAttribute("data-tui-timepicker-step")||"1"),minTime:s(i.getAttribute("data-tui-timepicker-min-time")),maxTime:s(i.getAttribute("data-tui-timepicker-max-time")),placeholder:i.getAttribute("data-tui-timepicker-placeholder")||"Select time"}}function a(i,t,u){t!==null?i.dataset.tuiTimepickerCurrentHour=t:delete i.dataset.tuiTimepickerCurrentHour,u!==null?i.dataset.tuiTimepickerCurrentMinute=u:delete i.dataset.tuiTimepickerCurrentMinute,y(i)}function y(i){let t=m(i),u=k(i),e=i.querySelector("[data-tui-timepicker-display]");if(e){let r=h(t.hour,t.minute,t.use12Hours);e.textContent=r||t.placeholder,e.classList.toggle("text-muted-foreground",!r)}u?.hiddenInput&&(u.hiddenInput.value=t.hour!==null&&t.minute!==null?h(t.hour,t.minute,!1):""),u?.hourList&&u?.minuteList&&T(u,t)}function T(i,t){i.hourList.querySelectorAll("[data-tui-timepicker-hour]").forEach(r=>{let n=parseInt(r.getAttribute("data-tui-timepicker-hour")),o=!1;t.hour!==null&&(t.use12Hours?o=n===t.hour||n===0&&t.hour===12||n===t.hour-12&&t.hour>12:o=n===t.hour),r.setAttribute("data-tui-timepicker-selected",o);let c=!1;for(let f=0;f<60;f++)if(l(n,f,t.minTime,t.maxTime)){c=!0;break}r.disabled=!c,r.classList.toggle("opacity-50",!c),r.classList.toggle("cursor-not-allowed",!c)}),i.minuteList.querySelectorAll("[data-tui-timepicker-minute]").forEach(r=>{let n=parseInt(r.getAttribute("data-tui-timepicker-minute")),o=n===t.minute,c=t.hour===null||l(t.hour,n,t.minTime,t.maxTime);r.setAttribute("data-tui-timepicker-selected",o),r.disabled=!c,r.classList.toggle("opacity-50",!c),r.classList.toggle("cursor-not-allowed",!c)});let u=i.popup.querySelector('[data-tui-timepicker-period="AM"]'),e=i.popup.querySelector('[data-tui-timepicker-period="PM"]');if(u&&e){let r=t.hour===null||t.hour<12;u.setAttribute("data-tui-timepicker-active",r),e.setAttribute("data-tui-timepicker-active",!r)}}document.addEventListener("click",i=>{let t=i.target;if(t.matches("[data-tui-timepicker-hour]")&&!t.disabled){let u=d(t);if(!u)return;let e=m(u),r=parseInt(t.getAttribute("data-tui-timepicker-hour"));if(e.use12Hours){let n=e.hour!==null&&e.hour>=12;r=r===0?n?12:0:n?r+12:r}if(l(r,e.minute,e.minTime,e.maxTime))a(u,r,e.minute);else for(let n=0;n<60;n+=e.step)if(l(r,n,e.minTime,e.maxTime)){a(u,r,n);return}return}if(t.matches("[data-tui-timepicker-minute]")&&!t.disabled){let u=d(t);if(!u)return;let e=m(u),r=parseInt(t.getAttribute("data-tui-timepicker-minute"));(e.hour===null||l(e.hour,r,e.minTime,e.maxTime))&&a(u,e.hour,r);return}if(t.matches("[data-tui-timepicker-period]")){let u=d(t);if(!u)return;let e=m(u);if(e.hour===null)return;let r=t.getAttribute("data-tui-timepicker-period"),n=e.hour;if(r==="AM"&&e.hour>=12?n=e.hour===12?0:e.hour-12:r==="PM"&&e.hour<12&&(n=e.hour===0?12:e.hour+12),n!==e.hour){if(l(n,e.minute,e.minTime,e.maxTime))a(u,n,e.minute);else for(let o=0;o<60;o+=e.step)if(l(n,o,e.minTime,e.maxTime)){a(u,n,o);return}}return}if(t.matches("[data-tui-timepicker-done]")){let u=d(t);u&&window.closePopover&&window.closePopover(u.id+"-content");return}}),document.addEventListener("input",i=>{if(!i.target.matches("[data-tui-timepicker-hidden-input]"))return;let t=document.getElementById(i.target.id.replace("-hidden",""));if(t){let u=s(i.target.value);u?a(t,u.hour,u.minute):a(t,null,null)}}),document.addEventListener("reset",i=>{i.target.matches("form")&&i.target.querySelectorAll('[data-tui-timepicker="true"]').forEach(t=>{a(t,null,null);let u=k(t);u?.hiddenInput&&(u.hiddenInput.value="")})});function p(){document.querySelectorAll('[data-tui-timepicker="true"]').forEach(i=>{let t=document.getElementById(i.id+"-hidden");if(!t||t._tui)return;let u=t.value;if(u){let e=s(u);e&&a(i,e.hour,e.minute)}I(t),y(i)})}document.readyState==="loading"?document.addEventListener("DOMContentLoaded",p):p(),new MutationObserver(p).observe(document.body,{childList:!0,subtree:!0})})();})();