@forcecalendar/interface 1.4.0 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/force-calendar-interface.esm.js +66 -41
- package/dist/force-calendar-interface.esm.js.map +1 -1
- package/dist/force-calendar-interface.umd.js +16 -16
- package/dist/force-calendar-interface.umd.js.map +1 -1
- package/package.json +1 -1
- package/src/components/ForceCalendar.js +20 -2
- package/src/utils/StyleUtils.js +28 -0
- package/types/components/ForceCalendar.d.ts +6 -0
- package/types/utils/StyleUtils.d.ts +26 -0
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
box-sizing: inherit;
|
|
9
9
|
}
|
|
10
10
|
`}render(){this.cleanup();let e=this.template();this._styleEl||(this._styleEl=document.createElement(`style`),this.shadowRoot.appendChild(this._styleEl),this._contentWrapper=document.createElement(`div`),this._contentWrapper.setAttribute(`id`,`fc-root`),this._contentWrapper.style.display=`contents`,this.shadowRoot.appendChild(this._contentWrapper)),this._styleEl.textContent=this.getBaseStyles()+`
|
|
11
|
-
`+this.getStyles();let t=this._saveScrollPositions(),n=this._getActiveElementSelector();this._contentWrapper.innerHTML=e,this._restoreScrollPositions(t),this._restoreFocus(n),this.afterRender()}_saveScrollPositions(){let e=new Map;return this._contentWrapper&&this._contentWrapper.querySelectorAll(`[id]`).forEach(t=>{(t.scrollTop!==0||t.scrollLeft!==0)&&e.set(t.id,{top:t.scrollTop,left:t.scrollLeft})}),e}_restoreScrollPositions(e){if(!this._contentWrapper||e.size===0)return;let t=typeof CSS<`u`&&typeof CSS.escape==`function`?CSS.escape:e=>String(e).replace(/["\\]/g,`\\$&`);e.forEach((e,n)=>{let r=this._contentWrapper.querySelector(`[id="${t(n)}"]`);r&&(r.scrollTop=e.top,r.scrollLeft=e.left)})}_getActiveElementSelector(){let e=this.shadowRoot.activeElement;return!e||e===this._contentWrapper?null:e.id?`[id="${CSS.escape(e.id)}"]`:e.dataset&&e.dataset.action?`[data-action="${CSS.escape(e.dataset.action)}"]`:e.dataset&&e.dataset.view?`[data-view="${CSS.escape(e.dataset.view)}"]`:e.tagName?e.tagName.toLowerCase():null}_restoreFocus(e){if(!(!e||!this._contentWrapper))try{let t=this._contentWrapper.querySelector(e);t&&typeof t.focus==`function`&&t.focus()}catch{}}template(){return``}afterRender(){}$(e){return this.shadowRoot.querySelector(e)}$$(e){return this.shadowRoot.querySelectorAll(e)}static get observedAttributes(){return[]}attributeChangedCallback(e,t,n){this.setProp(e,n),this._initialized&&this.render()}},r=class{constructor(){this.events=new Map,this.wildcardHandlers=new Set}on(e,t,n={}){let{once:r=!1,priority:i=0}=n;if(e.includes(`*`)){let n={pattern:e,handler:t,once:r,priority:i};return this.wildcardHandlers.add(n),()=>this.wildcardHandlers.delete(n)}this.events.has(e)||this.events.set(e,[]);let a={handler:t,once:r,priority:i},o=this.events.get(e);return o.push(a),o.sort((e,t)=>t.priority-e.priority),()=>{let e=o.indexOf(a);e>-1&&o.splice(e,1)}}once(e,t,n={}){return this.on(e,t,{...n,once:!0})}off(e,t){if(e.includes(`*`)){for(let n of this.wildcardHandlers)if(n.pattern===e&&n.handler===t){this.wildcardHandlers.delete(n);return}return}if(!this.events.has(e))return;let n=this.events.get(e),r=n.findIndex(e=>e.handler===t);r>-1&&n.splice(r,1),n.length===0&&this.events.delete(e)}offWildcard(e){for(let t of[...this.wildcardHandlers])t.pattern===e&&this.wildcardHandlers.delete(t)}offAll(e){for(let[t,n]of this.events){let r=n.findIndex(t=>t.handler===e);r>-1&&n.splice(r,1),n.length===0&&this.events.delete(t)}for(let t of[...this.wildcardHandlers])t.handler===e&&this.wildcardHandlers.delete(t)}emit(e,t){if(this.events.has(e)){let n=[...this.events.get(e)];for(let r of n){let{handler:n,once:i}=r;i&&this.off(e,n);try{n(t,e)}catch(t){console.error(`Error in event handler for ${e}:`,t)}}}let n=[];for(let r of[...this.wildcardHandlers])if(this.matchesPattern(e,r.pattern)){let{handler:i,once:a}=r;a&&n.push(r);try{i(t,e)}catch(t){console.error(`Error in wildcard handler for ${e}:`,t)}}n.forEach(e=>this.wildcardHandlers.delete(e))}matchesPattern(e,t){let n=t.replace(/[.+?^${}()|[\]\\]/g,`\\$&`);return RegExp(`^`+n.replace(/\*/g,`.*`)+`$`).test(e)}clear(){this.events.clear(),this.wildcardHandlers.clear()}getEventNames(){return Array.from(this.events.keys())}getHandlerCount(e){return this.events.has(e)?this.events.get(e).length:0}getWildcardHandlerCount(){return this.wildcardHandlers.size}getTotalHandlerCount(){let e=this.wildcardHandlers.size;for(let t of this.events.values())e+=t.length;return e}},i=new r,a=class{constructor(e={}){this.eventBus=new r,this.calendar=new t.Calendar({view:e.view||`month`,date:e.date||new Date,weekStartsOn:e.weekStartsOn??0,locale:e.locale||`en-US`,timeZone:e.timeZone||Intl.DateTimeFormat().resolvedOptions().timeZone,...e}),this.state={view:this.calendar.getView(),currentDate:this.calendar.getCurrentDate(),events:[],selectedEvent:null,selectedDate:null,loading:!1,error:null,config:{...e}},this.subscribers=new Set,this.subscribe=this.subscribe.bind(this),this.unsubscribe=this.unsubscribe.bind(this),this.setState=this.setState.bind(this),this._syncEventsFromCore({silent:!0})}_syncEventsFromCore(e={}){let{force:t=!1}=e,n=this.calendar.getEvents()||[];return(t||this.state.events.length!==n.length||!this._eventsMatch(this.state.events,n))&&this.setState({events:[...n]},e),n}_eventsMatch(e,t){if(e.length!==t.length)return!1;let n=new Set(e.map(e=>e.id));return t.every(e=>n.has(e.id))}getState(){return{...this.state,config:{...this.state.config},events:[...this.state.events]}}setState(e,t={}){let{silent:n=!1}=t,r={...this.state};return this.state={...this.state,...e},n||(this.notifySubscribers(r,this.state),this.emitStateChange(r,this.state)),this.state}subscribe(e,t=null){return this.subscribers.add(e),t&&(this._subscriberIds||=new Map,this._subscriberIds.set(t,e)),()=>this.unsubscribe(e,t)}unsubscribe(e,t=null){this.subscribers.delete(e),t&&this._subscriberIds&&this._subscriberIds.delete(t)}unsubscribeById(e){if(!this._subscriberIds)return!1;let t=this._subscriberIds.get(e);return t?(this.subscribers.delete(t),this._subscriberIds.delete(e),!0):!1}getSubscriberCount(){return this.subscribers.size}notifySubscribers(e,t){this.subscribers.forEach(n=>{try{n(t,e)}catch(e){console.error(`Error in state subscriber:`,e)}})}emitStateChange(e,t){let n=Object.keys(t).filter(n=>e[n]!==t[n]);n.forEach(n=>{this.eventBus.emit(`state:${n}:changed`,{oldValue:e[n],newValue:t[n],state:t})}),n.length>0&&this.eventBus.emit(`state:changed`,{oldState:e,newState:t,changedKeys:n})}setView(e){this.calendar.setView(e),this.setState({view:e}),this.eventBus.emit(`view:changed`,{view:e})}getView(){return this.state.view}setDate(e){this.calendar.goToDate(e),this.setState({currentDate:this.calendar.getCurrentDate()}),this.eventBus.emit(`date:changed`,{date:this.state.currentDate})}getCurrentDate(){return this.state.currentDate}next(){this.calendar.next(),this.setState({currentDate:this.calendar.getCurrentDate()}),this.eventBus.emit(`navigation:next`,{date:this.state.currentDate})}previous(){this.calendar.previous(),this.setState({currentDate:this.calendar.getCurrentDate()}),this.eventBus.emit(`navigation:previous`,{date:this.state.currentDate})}today(){this.calendar.today(),this.setState({currentDate:this.calendar.getCurrentDate()}),this.eventBus.emit(`navigation:today`,{date:this.state.currentDate})}goToDate(e){this.calendar.goToDate(e),this.setState({currentDate:this.calendar.getCurrentDate()}),this.eventBus.emit(`navigation:goto`,{date:this.state.currentDate})}addEvent(e){let t=this.calendar.addEvent(e);return t?(this._syncEventsFromCore(),this.eventBus.emit(`event:add`,{event:t}),this.eventBus.emit(`event:added`,{event:t}),t):(console.error(`Failed to add event to calendar`),this.eventBus.emit(`event:error`,{action:`add`,event:e,error:`Failed to add event`}),null)}updateEvent(e,t){this._syncEventsFromCore({silent:!0});let n=this.calendar.updateEvent(e,t);return n?(this._syncEventsFromCore({force:!0}),this.eventBus.emit(`event:update`,{event:n}),this.eventBus.emit(`event:updated`,{event:n}),n):(console.error(`Failed to update event: ${e}`),this.eventBus.emit(`event:error`,{action:`update`,eventId:e,updates:t,error:`Event not found in calendar`}),null)}deleteEvent(e){return this._syncEventsFromCore({silent:!0}),this.calendar.removeEvent(e)?(this._syncEventsFromCore(),this.eventBus.emit(`event:remove`,{eventId:e}),this.eventBus.emit(`event:deleted`,{eventId:e}),!0):(console.error(`Failed to delete event: ${e}`),this.eventBus.emit(`event:error`,{action:`delete`,eventId:e,error:`Event not found`}),!1)}getEvents(){return this.calendar.getEvents()||[]}syncEvents(){return this._syncEventsFromCore()}getEventsForDate(e){return this.calendar.getEventsForDate(e)}getEventsInRange(e,t){return this.calendar.getEventsInRange(e,t)}getViewData(){let e=this.calendar.getViewData();return this.enrichViewData(e)}enrichViewData(e){let t={...e},n=this.state.selectedDate?.toDateString();if(t.weeks&&=t.weeks.map(e=>({...e,days:e.days.map(e=>{let t=new Date(e.date);return{...e,isSelected:t.toDateString()===n,events:e.events||this.getEventsForDate(t)}})})),t.days&&=t.days.map(e=>{let t=new Date(e.date);return{...e,isSelected:t.toDateString()===n,events:e.events||this.getEventsForDate(t)}}),t.date&&!t.days&&!t.weeks){let e=new Date(t.date);t.isSelected=e.toDateString()===n,t.events=t.events||this.getEventsForDate(e)}return t}selectEvent(e){this.setState({selectedEvent:e}),this.eventBus.emit(`event:selected`,{event:e})}selectEventById(e){let t=this.state.events.find(t=>t.id===e);t&&this.selectEvent(t)}deselectEvent(){this.setState({selectedEvent:null}),this.eventBus.emit(`event:deselected`,{})}selectDate(e){this.setState({selectedDate:e}),this.eventBus.emit(`date:selected`,{date:e})}deselectDate(){this.setState({selectedDate:null}),this.eventBus.emit(`date:deselected`,{})}isToday(e){let t=new Date;return e.toDateString()===t.toDateString()}isSelectedDate(e){return this.state.selectedDate&&e.toDateString()===this.state.selectedDate.toDateString()}isWeekend(e){let t=e.getDay();return t===0||t===6}setLoading(e){this.setState({loading:e})}setError(e){this.setState({error:e}),e&&this.eventBus.emit(`error`,{error:e})}clearError(){this.setState({error:null})}updateConfig(e){this.setState({config:{...this.state.config,...e}}),e.weekStartsOn!==void 0&&this.calendar.setWeekStartsOn(e.weekStartsOn),e.locale!==void 0&&this.calendar.setLocale(e.locale),e.timeZone!==void 0&&this.calendar.setTimezone(e.timeZone)}destroy(){this.subscribers.clear(),this._subscriberIds&&=(this._subscriberIds.clear(),null),this.eventBus&&=(this.eventBus.clear(),null),this.state=null,this.calendar=null}},o=class extends t.DateUtils{static formatDate(e,t=`default`,n=`en-US`){if(!e)return``;let r={default:{year:`numeric`,month:`long`,day:`numeric`},short:{year:`numeric`,month:`short`,day:`numeric`},long:{weekday:`long`,year:`numeric`,month:`long`,day:`numeric`},month:{year:`numeric`,month:`long`},monthShort:{year:`numeric`,month:`short`},day:{weekday:`long`,day:`numeric`},dayShort:{weekday:`short`,day:`numeric`},time:{hour:`numeric`,minute:`2-digit`},timeShort:{hour:`numeric`},datetime:{year:`numeric`,month:`short`,day:`numeric`,hour:`numeric`,minute:`2-digit`}},i=r[t]||r.default;return new Intl.DateTimeFormat(n,i).format(e)}static formatTime(e,t=!0,n=!1,r=`en-US`){if(!e)return``;let i={hour:`numeric`,minute:t?`2-digit`:void 0,hour12:!n};return new Intl.DateTimeFormat(r,i).format(e)}static formatDateRange(e,t,n=`en-US`){if(!e)return``;if(!t||this.isSameDay(e,t))return this.formatDate(e,`default`,n);let r=this.isSameYear(e,t)?`short`:`default`;return`${this.formatDate(e,r,n)} - ${this.formatDate(t,`default`,n)}`}static formatTimeRange(e,t,n=`en-US`){if(!e)return``;let r=this.formatTime(e,!0,!1,n);return t?`${r} - ${this.formatTime(t,!0,!1,n)}`:r}static getRelativeTime(e,t=new Date,n=`en-US`){let r=new Intl.RelativeTimeFormat(n,{numeric:`auto`}),i=e-t,a=Math.floor(i/1e3),o=Math.floor(a/60),s=Math.floor(o/60),c=Math.floor(s/24),l=Math.floor(c/7),u=Math.floor(c/30),d=Math.floor(c/365);return Math.abs(a)<60?r.format(a,`second`):Math.abs(o)<60?r.format(o,`minute`):Math.abs(s)<24?r.format(s,`hour`):Math.abs(c)<7?r.format(c,`day`):Math.abs(l)<4?r.format(l,`week`):Math.abs(u)<12?r.format(u,`month`):r.format(d,`year`)}static isToday(e){let t=new Date;return this.isSameDay(e,t)}static isPast(e){return e<new Date}static isFuture(e){return e>new Date}static getWeekNumber(e){let t=new Date(e.getFullYear(),0,1),n=(e-t)/864e5;return Math.ceil((n+t.getDay()+1)/7)}static getDayAbbreviation(e,t=`en-US`){let n=new Date(2024,0,7+e);return new Intl.DateTimeFormat(t,{weekday:`short`}).format(n)}static getDayName(e,t=`en-US`){let n=new Date(2024,0,7+e);return new Intl.DateTimeFormat(t,{weekday:`long`}).format(n)}static getMonthName(e,t=`long`,n=`en-US`){let r=new Date(2024,e,1);return new Intl.DateTimeFormat(n,{month:t}).format(r)}static parseTimeString(e,t=new Date){let n=new Date(t),[r,i]=e.split(/\s+/),[a,o]=r.split(`:`).map(Number),s=a;return i&&(i.toLowerCase()===`pm`&&a<12?s=a+12:i.toLowerCase()===`am`&&a===12&&(s=0)),n.setHours(s,o||0,0,0),n}},s=class{static createElement(e,t={},n=[]){let r=document.createElement(e);return Object.entries(t).forEach(([e,t])=>{if(e===`className`)r.className=t;else if(e===`style`&&typeof t==`object`)Object.assign(r.style,t);else if(e.startsWith(`data-`))r.setAttribute(e,t);else if(e.startsWith(`on`)&&typeof t==`function`){let n=e.slice(2).toLowerCase();r.addEventListener(n,t)}else r[e]=t}),n.forEach(e=>{typeof e==`string`?r.appendChild(document.createTextNode(e)):e instanceof Node&&r.appendChild(e)}),r}static addEventListeners(e,t){return Object.entries(t).forEach(([t,n])=>{e.addEventListener(t,n)}),()=>{Object.entries(t).forEach(([t,n])=>{e.removeEventListener(t,n)})}}static delegate(e,t,n,r){let i=n=>{let i=n.target.closest(t);i&&e.contains(i)&&r.call(i,n)};return e.addEventListener(n,i),()=>e.removeEventListener(n,i)}static getPosition(e){let t=e.getBoundingClientRect();return{top:t.top+window.scrollY,left:t.left+window.scrollX,bottom:t.bottom+window.scrollY,right:t.right+window.scrollX,width:t.width,height:t.height}}static isInViewport(e,t=0){let n=e.getBoundingClientRect();return n.top>=-t&&n.left>=-t&&n.bottom<=(window.innerHeight||document.documentElement.clientHeight)+t&&n.right<=(window.innerWidth||document.documentElement.clientWidth)+t}static scrollToElement(e,t={}){let{behavior:n=`smooth`,block:r=`start`,inline:i=`nearest`}=t;e.scrollIntoView({behavior:n,block:r,inline:i})}static getStyle(e,t){return window.getComputedStyle(e).getPropertyValue(t)}static setStyles(e,t){Object.assign(e.style,t)}static async animateClass(e,t,n=300){e.classList.add(t),await this.wait(n),e.classList.remove(t)}static waitForAnimation(e,t=`animationend`,n=3e3){return new Promise(r=>{let i=null,a=()=>{i!==null&&clearTimeout(i),e.removeEventListener(t,a),r()};e.addEventListener(t,a),n>0&&(i=setTimeout(a,n))})}static wait(e){return new Promise(t=>setTimeout(t,e))}static parseHTML(e,{sanitize:t=!0}={}){let n=document.createElement(`template`);return n.innerHTML=e.trim(),t&&this._sanitizeNode(n.content),n.content.firstChild}static _sanitizeNode(e){e.querySelectorAll(`script, iframe, object, embed, link, meta, base`).forEach(e=>e.remove());let t=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT),n=t.nextNode();for(;n;){for(let e of Array.from(n.attributes)){let t=e.name.toLowerCase(),r=e.value.replace(/[\u0000-\u0020]/g,``).toLowerCase();(t.startsWith(`on`)||r.startsWith(`javascript:`)||r.startsWith(`data:text/html`))&&n.removeAttribute(e.name)}n=t.nextNode()}}static escapeHTML(e){let t=document.createElement(`div`);return t.textContent=e,t.innerHTML}static debounce(e,t=250){let n;return function(...r){clearTimeout(n),n=setTimeout(()=>e.apply(this,r),t)}}static throttle(e,t=250){let n;return function(...r){n||(e.apply(this,r),n=!0,setTimeout(()=>n=!1,t))}}static closest(e,t){return e.closest(t)}static parents(e,t){let n=[],r=e.parentElement;for(;r;)r.matches(t)&&n.push(r),r=r.parentElement;return n}static getOuterDimensions(e){let t=window.getComputedStyle(e),n={top:parseInt(t.marginTop),right:parseInt(t.marginRight),bottom:parseInt(t.marginBottom),left:parseInt(t.marginLeft)};return{width:e.offsetWidth+n.left+n.right,height:e.offsetHeight+n.top+n.bottom,margin:n}}static cloneWithEvents(e,t=!0){return e.cloneNode(t)}static trapFocus(e){let t=e.querySelectorAll(`button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])`);if(t.length===0)return e.setAttribute(`tabindex`,`-1`),e.focus(),()=>e.removeAttribute(`tabindex`);let n=t[0],r=t[t.length-1],i=t=>{if(t.key!==`Tab`)return;let i=e.getRootNode().activeElement??document.activeElement;t.shiftKey?i===n&&(r?.focus(),t.preventDefault()):i===r&&(n?.focus(),t.preventDefault())};return e.addEventListener(`keydown`,i),n?.focus(),()=>e.removeEventListener(`keydown`,i)}},c=class{static colors={primary:`#3B82F6`,secondary:`#64748B`,accent:`#F59E0B`,danger:`#EF4444`,warning:`#F97316`,info:`#06B6D4`,success:`#22C55E`,light:`#F8FAFC`,dark:`#0F172A`,white:`#FFFFFF`,gray:{50:`#F8FAFC`,100:`#F1F5F9`,200:`#E2E8F0`,300:`#CBD5E1`,400:`#94A3B8`,500:`#64748B`,600:`#475569`,700:`#334155`,800:`#1E293B`,900:`#0F172A`}};static cssVariables={"--fc-primary-color":`#2563EB`,"--fc-primary-hover":`#1D4ED8`,"--fc-primary-light":`#EFF6FF`,"--fc-text-color":`#111827`,"--fc-text-secondary":`#6B7280`,"--fc-text-light":`#9CA3AF`,"--fc-border-color":`#E5E7EB`,"--fc-border-color-hover":`#D1D5DB`,"--fc-background":`#FFFFFF`,"--fc-background-alt":`#FAFAFA`,"--fc-background-hover":`#F3F4F6`,"--fc-background-active":`#E5E7EB`,"--fc-accent-color":`#F59E0B`,"--fc-danger-color":`#EF4444`,"--fc-success-color":`#10B981`,"--fc-font-family":`Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif`,"--fc-font-size-xs":`11px`,"--fc-font-size-sm":`12px`,"--fc-font-size-base":`13px`,"--fc-font-size-lg":`15px`,"--fc-font-size-xl":`18px`,"--fc-font-size-2xl":`24px`,"--fc-line-height":`1.4`,"--fc-font-weight-normal":`400`,"--fc-font-weight-medium":`500`,"--fc-font-weight-semibold":`600`,"--fc-font-weight-bold":`700`,"--fc-spacing-xs":`2px`,"--fc-spacing-sm":`6px`,"--fc-spacing-md":`10px`,"--fc-spacing-lg":`14px`,"--fc-spacing-xl":`20px`,"--fc-spacing-2xl":`28px`,"--fc-border-width":`1px`,"--fc-border-radius-sm":`3px`,"--fc-border-radius":`5px`,"--fc-border-radius-lg":`8px`,"--fc-border-radius-full":`9999px`,"--fc-shadow-sm":`0 1px 1px rgba(0,0,0,0.05)`,"--fc-shadow":`0 1px 3px rgba(0,0,0,0.1), 0 1px 2px rgba(0,0,0,0.06)`,"--fc-shadow-md":`0 4px 6px -1px rgba(0, 0, 0, 0.1)`,"--fc-shadow-lg":`0 10px 15px -3px rgba(0, 0, 0, 0.1)`,"--fc-transition-fast":`100ms ease-out`,"--fc-transition":`150ms ease-out`,"--fc-transition-slow":`250ms ease-out`,"--fc-z-dropdown":`1000`,"--fc-z-modal":`2000`,"--fc-z-tooltip":`3000`};static getCSSVariable(e,t=document.documentElement){return getComputedStyle(t).getPropertyValue(e).trim()}static setCSSVariables(e,t=document.documentElement){Object.entries(e).forEach(([e,n])=>{t.style.setProperty(e,n)})}static getBaseStyles(){return`
|
|
11
|
+
`+this.getStyles();let t=this._saveScrollPositions(),n=this._getActiveElementSelector();this._contentWrapper.innerHTML=e,this._restoreScrollPositions(t),this._restoreFocus(n),this.afterRender()}_saveScrollPositions(){let e=new Map;return this._contentWrapper&&this._contentWrapper.querySelectorAll(`[id]`).forEach(t=>{(t.scrollTop!==0||t.scrollLeft!==0)&&e.set(t.id,{top:t.scrollTop,left:t.scrollLeft})}),e}_restoreScrollPositions(e){if(!this._contentWrapper||e.size===0)return;let t=typeof CSS<`u`&&typeof CSS.escape==`function`?CSS.escape:e=>String(e).replace(/["\\]/g,`\\$&`);e.forEach((e,n)=>{let r=this._contentWrapper.querySelector(`[id="${t(n)}"]`);r&&(r.scrollTop=e.top,r.scrollLeft=e.left)})}_getActiveElementSelector(){let e=this.shadowRoot.activeElement;return!e||e===this._contentWrapper?null:e.id?`[id="${CSS.escape(e.id)}"]`:e.dataset&&e.dataset.action?`[data-action="${CSS.escape(e.dataset.action)}"]`:e.dataset&&e.dataset.view?`[data-view="${CSS.escape(e.dataset.view)}"]`:e.tagName?e.tagName.toLowerCase():null}_restoreFocus(e){if(!(!e||!this._contentWrapper))try{let t=this._contentWrapper.querySelector(e);t&&typeof t.focus==`function`&&t.focus()}catch{}}template(){return``}afterRender(){}$(e){return this.shadowRoot.querySelector(e)}$$(e){return this.shadowRoot.querySelectorAll(e)}static get observedAttributes(){return[]}attributeChangedCallback(e,t,n){this.setProp(e,n),this._initialized&&this.render()}},r=class{constructor(){this.events=new Map,this.wildcardHandlers=new Set}on(e,t,n={}){let{once:r=!1,priority:i=0}=n;if(e.includes(`*`)){let n={pattern:e,handler:t,once:r,priority:i};return this.wildcardHandlers.add(n),()=>this.wildcardHandlers.delete(n)}this.events.has(e)||this.events.set(e,[]);let a={handler:t,once:r,priority:i},o=this.events.get(e);return o.push(a),o.sort((e,t)=>t.priority-e.priority),()=>{let e=o.indexOf(a);e>-1&&o.splice(e,1)}}once(e,t,n={}){return this.on(e,t,{...n,once:!0})}off(e,t){if(e.includes(`*`)){for(let n of this.wildcardHandlers)if(n.pattern===e&&n.handler===t){this.wildcardHandlers.delete(n);return}return}if(!this.events.has(e))return;let n=this.events.get(e),r=n.findIndex(e=>e.handler===t);r>-1&&n.splice(r,1),n.length===0&&this.events.delete(e)}offWildcard(e){for(let t of[...this.wildcardHandlers])t.pattern===e&&this.wildcardHandlers.delete(t)}offAll(e){for(let[t,n]of this.events){let r=n.findIndex(t=>t.handler===e);r>-1&&n.splice(r,1),n.length===0&&this.events.delete(t)}for(let t of[...this.wildcardHandlers])t.handler===e&&this.wildcardHandlers.delete(t)}emit(e,t){if(this.events.has(e)){let n=[...this.events.get(e)];for(let r of n){let{handler:n,once:i}=r;i&&this.off(e,n);try{n(t,e)}catch(t){console.error(`Error in event handler for ${e}:`,t)}}}let n=[];for(let r of[...this.wildcardHandlers])if(this.matchesPattern(e,r.pattern)){let{handler:i,once:a}=r;a&&n.push(r);try{i(t,e)}catch(t){console.error(`Error in wildcard handler for ${e}:`,t)}}n.forEach(e=>this.wildcardHandlers.delete(e))}matchesPattern(e,t){let n=t.replace(/[.+?^${}()|[\]\\]/g,`\\$&`);return RegExp(`^`+n.replace(/\*/g,`.*`)+`$`).test(e)}clear(){this.events.clear(),this.wildcardHandlers.clear()}getEventNames(){return Array.from(this.events.keys())}getHandlerCount(e){return this.events.has(e)?this.events.get(e).length:0}getWildcardHandlerCount(){return this.wildcardHandlers.size}getTotalHandlerCount(){let e=this.wildcardHandlers.size;for(let t of this.events.values())e+=t.length;return e}},i=new r,a=class{constructor(e={}){this.eventBus=new r,this.calendar=new t.Calendar({view:e.view||`month`,date:e.date||new Date,weekStartsOn:e.weekStartsOn??0,locale:e.locale||`en-US`,timeZone:e.timeZone||Intl.DateTimeFormat().resolvedOptions().timeZone,...e}),this.state={view:this.calendar.getView(),currentDate:this.calendar.getCurrentDate(),events:[],selectedEvent:null,selectedDate:null,loading:!1,error:null,config:{...e}},this.subscribers=new Set,this.subscribe=this.subscribe.bind(this),this.unsubscribe=this.unsubscribe.bind(this),this.setState=this.setState.bind(this),this._syncEventsFromCore({silent:!0})}_syncEventsFromCore(e={}){let{force:t=!1}=e,n=this.calendar.getEvents()||[];return(t||this.state.events.length!==n.length||!this._eventsMatch(this.state.events,n))&&this.setState({events:[...n]},e),n}_eventsMatch(e,t){if(e.length!==t.length)return!1;let n=new Set(e.map(e=>e.id));return t.every(e=>n.has(e.id))}getState(){return{...this.state,config:{...this.state.config},events:[...this.state.events]}}setState(e,t={}){let{silent:n=!1}=t,r={...this.state};return this.state={...this.state,...e},n||(this.notifySubscribers(r,this.state),this.emitStateChange(r,this.state)),this.state}subscribe(e,t=null){return this.subscribers.add(e),t&&(this._subscriberIds||=new Map,this._subscriberIds.set(t,e)),()=>this.unsubscribe(e,t)}unsubscribe(e,t=null){this.subscribers.delete(e),t&&this._subscriberIds&&this._subscriberIds.delete(t)}unsubscribeById(e){if(!this._subscriberIds)return!1;let t=this._subscriberIds.get(e);return t?(this.subscribers.delete(t),this._subscriberIds.delete(e),!0):!1}getSubscriberCount(){return this.subscribers.size}notifySubscribers(e,t){this.subscribers.forEach(n=>{try{n(t,e)}catch(e){console.error(`Error in state subscriber:`,e)}})}emitStateChange(e,t){let n=Object.keys(t).filter(n=>e[n]!==t[n]);n.forEach(n=>{this.eventBus.emit(`state:${n}:changed`,{oldValue:e[n],newValue:t[n],state:t})}),n.length>0&&this.eventBus.emit(`state:changed`,{oldState:e,newState:t,changedKeys:n})}setView(e){this.calendar.setView(e),this.setState({view:e}),this.eventBus.emit(`view:changed`,{view:e})}getView(){return this.state.view}setDate(e){this.calendar.goToDate(e),this.setState({currentDate:this.calendar.getCurrentDate()}),this.eventBus.emit(`date:changed`,{date:this.state.currentDate})}getCurrentDate(){return this.state.currentDate}next(){this.calendar.next(),this.setState({currentDate:this.calendar.getCurrentDate()}),this.eventBus.emit(`navigation:next`,{date:this.state.currentDate})}previous(){this.calendar.previous(),this.setState({currentDate:this.calendar.getCurrentDate()}),this.eventBus.emit(`navigation:previous`,{date:this.state.currentDate})}today(){this.calendar.today(),this.setState({currentDate:this.calendar.getCurrentDate()}),this.eventBus.emit(`navigation:today`,{date:this.state.currentDate})}goToDate(e){this.calendar.goToDate(e),this.setState({currentDate:this.calendar.getCurrentDate()}),this.eventBus.emit(`navigation:goto`,{date:this.state.currentDate})}addEvent(e){let t=this.calendar.addEvent(e);return t?(this._syncEventsFromCore(),this.eventBus.emit(`event:add`,{event:t}),this.eventBus.emit(`event:added`,{event:t}),t):(console.error(`Failed to add event to calendar`),this.eventBus.emit(`event:error`,{action:`add`,event:e,error:`Failed to add event`}),null)}updateEvent(e,t){this._syncEventsFromCore({silent:!0});let n=this.calendar.updateEvent(e,t);return n?(this._syncEventsFromCore({force:!0}),this.eventBus.emit(`event:update`,{event:n}),this.eventBus.emit(`event:updated`,{event:n}),n):(console.error(`Failed to update event: ${e}`),this.eventBus.emit(`event:error`,{action:`update`,eventId:e,updates:t,error:`Event not found in calendar`}),null)}deleteEvent(e){return this._syncEventsFromCore({silent:!0}),this.calendar.removeEvent(e)?(this._syncEventsFromCore(),this.eventBus.emit(`event:remove`,{eventId:e}),this.eventBus.emit(`event:deleted`,{eventId:e}),!0):(console.error(`Failed to delete event: ${e}`),this.eventBus.emit(`event:error`,{action:`delete`,eventId:e,error:`Event not found`}),!1)}getEvents(){return this.calendar.getEvents()||[]}syncEvents(){return this._syncEventsFromCore()}getEventsForDate(e){return this.calendar.getEventsForDate(e)}getEventsInRange(e,t){return this.calendar.getEventsInRange(e,t)}getViewData(){let e=this.calendar.getViewData();return this.enrichViewData(e)}enrichViewData(e){let t={...e},n=this.state.selectedDate?.toDateString();if(t.weeks&&=t.weeks.map(e=>({...e,days:e.days.map(e=>{let t=new Date(e.date);return{...e,isSelected:t.toDateString()===n,events:e.events||this.getEventsForDate(t)}})})),t.days&&=t.days.map(e=>{let t=new Date(e.date);return{...e,isSelected:t.toDateString()===n,events:e.events||this.getEventsForDate(t)}}),t.date&&!t.days&&!t.weeks){let e=new Date(t.date);t.isSelected=e.toDateString()===n,t.events=t.events||this.getEventsForDate(e)}return t}selectEvent(e){this.setState({selectedEvent:e}),this.eventBus.emit(`event:selected`,{event:e})}selectEventById(e){let t=this.state.events.find(t=>t.id===e);t&&this.selectEvent(t)}deselectEvent(){this.setState({selectedEvent:null}),this.eventBus.emit(`event:deselected`,{})}selectDate(e){this.setState({selectedDate:e}),this.eventBus.emit(`date:selected`,{date:e})}deselectDate(){this.setState({selectedDate:null}),this.eventBus.emit(`date:deselected`,{})}isToday(e){let t=new Date;return e.toDateString()===t.toDateString()}isSelectedDate(e){return this.state.selectedDate&&e.toDateString()===this.state.selectedDate.toDateString()}isWeekend(e){let t=e.getDay();return t===0||t===6}setLoading(e){this.setState({loading:e})}setError(e){this.setState({error:e}),e&&this.eventBus.emit(`error`,{error:e})}clearError(){this.setState({error:null})}updateConfig(e){this.setState({config:{...this.state.config,...e}}),e.weekStartsOn!==void 0&&this.calendar.setWeekStartsOn(e.weekStartsOn),e.locale!==void 0&&this.calendar.setLocale(e.locale),e.timeZone!==void 0&&this.calendar.setTimezone(e.timeZone)}destroy(){this.subscribers.clear(),this._subscriberIds&&=(this._subscriberIds.clear(),null),this.eventBus&&=(this.eventBus.clear(),null),this.state=null,this.calendar=null}},o=class extends t.DateUtils{static formatDate(e,t=`default`,n=`en-US`){if(!e)return``;let r={default:{year:`numeric`,month:`long`,day:`numeric`},short:{year:`numeric`,month:`short`,day:`numeric`},long:{weekday:`long`,year:`numeric`,month:`long`,day:`numeric`},month:{year:`numeric`,month:`long`},monthShort:{year:`numeric`,month:`short`},day:{weekday:`long`,day:`numeric`},dayShort:{weekday:`short`,day:`numeric`},time:{hour:`numeric`,minute:`2-digit`},timeShort:{hour:`numeric`},datetime:{year:`numeric`,month:`short`,day:`numeric`,hour:`numeric`,minute:`2-digit`}},i=r[t]||r.default;return new Intl.DateTimeFormat(n,i).format(e)}static formatTime(e,t=!0,n=!1,r=`en-US`){if(!e)return``;let i={hour:`numeric`,minute:t?`2-digit`:void 0,hour12:!n};return new Intl.DateTimeFormat(r,i).format(e)}static formatDateRange(e,t,n=`en-US`){if(!e)return``;if(!t||this.isSameDay(e,t))return this.formatDate(e,`default`,n);let r=this.isSameYear(e,t)?`short`:`default`;return`${this.formatDate(e,r,n)} - ${this.formatDate(t,`default`,n)}`}static formatTimeRange(e,t,n=`en-US`){if(!e)return``;let r=this.formatTime(e,!0,!1,n);return t?`${r} - ${this.formatTime(t,!0,!1,n)}`:r}static getRelativeTime(e,t=new Date,n=`en-US`){let r=new Intl.RelativeTimeFormat(n,{numeric:`auto`}),i=e-t,a=Math.floor(i/1e3),o=Math.floor(a/60),s=Math.floor(o/60),c=Math.floor(s/24),l=Math.floor(c/7),u=Math.floor(c/30),d=Math.floor(c/365);return Math.abs(a)<60?r.format(a,`second`):Math.abs(o)<60?r.format(o,`minute`):Math.abs(s)<24?r.format(s,`hour`):Math.abs(c)<7?r.format(c,`day`):Math.abs(l)<4?r.format(l,`week`):Math.abs(u)<12?r.format(u,`month`):r.format(d,`year`)}static isToday(e){let t=new Date;return this.isSameDay(e,t)}static isPast(e){return e<new Date}static isFuture(e){return e>new Date}static getWeekNumber(e){let t=new Date(e.getFullYear(),0,1),n=(e-t)/864e5;return Math.ceil((n+t.getDay()+1)/7)}static getDayAbbreviation(e,t=`en-US`){let n=new Date(2024,0,7+e);return new Intl.DateTimeFormat(t,{weekday:`short`}).format(n)}static getDayName(e,t=`en-US`){let n=new Date(2024,0,7+e);return new Intl.DateTimeFormat(t,{weekday:`long`}).format(n)}static getMonthName(e,t=`long`,n=`en-US`){let r=new Date(2024,e,1);return new Intl.DateTimeFormat(n,{month:t}).format(r)}static parseTimeString(e,t=new Date){let n=new Date(t),[r,i]=e.split(/\s+/),[a,o]=r.split(`:`).map(Number),s=a;return i&&(i.toLowerCase()===`pm`&&a<12?s=a+12:i.toLowerCase()===`am`&&a===12&&(s=0)),n.setHours(s,o||0,0,0),n}},s=class{static createElement(e,t={},n=[]){let r=document.createElement(e);return Object.entries(t).forEach(([e,t])=>{if(e===`className`)r.className=t;else if(e===`style`&&typeof t==`object`)Object.assign(r.style,t);else if(e.startsWith(`data-`))r.setAttribute(e,t);else if(e.startsWith(`on`)&&typeof t==`function`){let n=e.slice(2).toLowerCase();r.addEventListener(n,t)}else r[e]=t}),n.forEach(e=>{typeof e==`string`?r.appendChild(document.createTextNode(e)):e instanceof Node&&r.appendChild(e)}),r}static addEventListeners(e,t){return Object.entries(t).forEach(([t,n])=>{e.addEventListener(t,n)}),()=>{Object.entries(t).forEach(([t,n])=>{e.removeEventListener(t,n)})}}static delegate(e,t,n,r){let i=n=>{let i=n.target.closest(t);i&&e.contains(i)&&r.call(i,n)};return e.addEventListener(n,i),()=>e.removeEventListener(n,i)}static getPosition(e){let t=e.getBoundingClientRect();return{top:t.top+window.scrollY,left:t.left+window.scrollX,bottom:t.bottom+window.scrollY,right:t.right+window.scrollX,width:t.width,height:t.height}}static isInViewport(e,t=0){let n=e.getBoundingClientRect();return n.top>=-t&&n.left>=-t&&n.bottom<=(window.innerHeight||document.documentElement.clientHeight)+t&&n.right<=(window.innerWidth||document.documentElement.clientWidth)+t}static scrollToElement(e,t={}){let{behavior:n=`smooth`,block:r=`start`,inline:i=`nearest`}=t;e.scrollIntoView({behavior:n,block:r,inline:i})}static getStyle(e,t){return window.getComputedStyle(e).getPropertyValue(t)}static setStyles(e,t){Object.assign(e.style,t)}static async animateClass(e,t,n=300){e.classList.add(t),await this.wait(n),e.classList.remove(t)}static waitForAnimation(e,t=`animationend`,n=3e3){return new Promise(r=>{let i=null,a=()=>{i!==null&&clearTimeout(i),e.removeEventListener(t,a),r()};e.addEventListener(t,a),n>0&&(i=setTimeout(a,n))})}static wait(e){return new Promise(t=>setTimeout(t,e))}static parseHTML(e,{sanitize:t=!0}={}){let n=document.createElement(`template`);return n.innerHTML=e.trim(),t&&this._sanitizeNode(n.content),n.content.firstChild}static _sanitizeNode(e){e.querySelectorAll(`script, iframe, object, embed, link, meta, base`).forEach(e=>e.remove());let t=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT),n=t.nextNode();for(;n;){for(let e of Array.from(n.attributes)){let t=e.name.toLowerCase(),r=e.value.replace(/[\u0000-\u0020]/g,``).toLowerCase();(t.startsWith(`on`)||r.startsWith(`javascript:`)||r.startsWith(`data:text/html`))&&n.removeAttribute(e.name)}n=t.nextNode()}}static escapeHTML(e){let t=document.createElement(`div`);return t.textContent=e,t.innerHTML}static debounce(e,t=250){let n;return function(...r){clearTimeout(n),n=setTimeout(()=>e.apply(this,r),t)}}static throttle(e,t=250){let n;return function(...r){n||(e.apply(this,r),n=!0,setTimeout(()=>n=!1,t))}}static closest(e,t){return e.closest(t)}static parents(e,t){let n=[],r=e.parentElement;for(;r;)r.matches(t)&&n.push(r),r=r.parentElement;return n}static getOuterDimensions(e){let t=window.getComputedStyle(e),n={top:parseInt(t.marginTop),right:parseInt(t.marginRight),bottom:parseInt(t.marginBottom),left:parseInt(t.marginLeft)};return{width:e.offsetWidth+n.left+n.right,height:e.offsetHeight+n.top+n.bottom,margin:n}}static cloneWithEvents(e,t=!0){return e.cloneNode(t)}static trapFocus(e){let t=e.querySelectorAll(`button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])`);if(t.length===0)return e.setAttribute(`tabindex`,`-1`),e.focus(),()=>e.removeAttribute(`tabindex`);let n=t[0],r=t[t.length-1],i=t=>{if(t.key!==`Tab`)return;let i=e.getRootNode().activeElement??document.activeElement;t.shiftKey?i===n&&(r?.focus(),t.preventDefault()):i===r&&(n?.focus(),t.preventDefault())};return e.addEventListener(`keydown`,i),n?.focus(),()=>e.removeEventListener(`keydown`,i)}},c={slds:{"--fc-primary-color":`#0176d3`,"--fc-primary-hover":`#014486`,"--fc-primary-light":`#eef4ff`,"--fc-accent-color":`#0b5cab`,"--fc-text-color":`#181818`,"--fc-text-secondary":`#706e6b`,"--fc-text-light":`#939393`,"--fc-border-color":`#e5e5e5`,"--fc-border-color-hover":`#c9c9c9`,"--fc-background":`#ffffff`,"--fc-background-alt":`#f3f3f3`,"--fc-background-hover":`#f3f3f3`,"--fc-background-active":`#d8e6fe`,"--fc-danger-color":`#ea001e`,"--fc-success-color":`#2e844a`,"--fc-border-radius":`0.25rem`,"--fc-border-radius-sm":`0.125rem`,"--fc-font-family":`'Salesforce Sans', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif`}},l=class{static colors={primary:`#3B82F6`,secondary:`#64748B`,accent:`#F59E0B`,danger:`#EF4444`,warning:`#F97316`,info:`#06B6D4`,success:`#22C55E`,light:`#F8FAFC`,dark:`#0F172A`,white:`#FFFFFF`,gray:{50:`#F8FAFC`,100:`#F1F5F9`,200:`#E2E8F0`,300:`#CBD5E1`,400:`#94A3B8`,500:`#64748B`,600:`#475569`,700:`#334155`,800:`#1E293B`,900:`#0F172A`}};static cssVariables={"--fc-primary-color":`#2563EB`,"--fc-primary-hover":`#1D4ED8`,"--fc-primary-light":`#EFF6FF`,"--fc-text-color":`#111827`,"--fc-text-secondary":`#6B7280`,"--fc-text-light":`#9CA3AF`,"--fc-border-color":`#E5E7EB`,"--fc-border-color-hover":`#D1D5DB`,"--fc-background":`#FFFFFF`,"--fc-background-alt":`#FAFAFA`,"--fc-background-hover":`#F3F4F6`,"--fc-background-active":`#E5E7EB`,"--fc-accent-color":`#F59E0B`,"--fc-danger-color":`#EF4444`,"--fc-success-color":`#10B981`,"--fc-font-family":`Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif`,"--fc-font-size-xs":`11px`,"--fc-font-size-sm":`12px`,"--fc-font-size-base":`13px`,"--fc-font-size-lg":`15px`,"--fc-font-size-xl":`18px`,"--fc-font-size-2xl":`24px`,"--fc-line-height":`1.4`,"--fc-font-weight-normal":`400`,"--fc-font-weight-medium":`500`,"--fc-font-weight-semibold":`600`,"--fc-font-weight-bold":`700`,"--fc-spacing-xs":`2px`,"--fc-spacing-sm":`6px`,"--fc-spacing-md":`10px`,"--fc-spacing-lg":`14px`,"--fc-spacing-xl":`20px`,"--fc-spacing-2xl":`28px`,"--fc-border-width":`1px`,"--fc-border-radius-sm":`3px`,"--fc-border-radius":`5px`,"--fc-border-radius-lg":`8px`,"--fc-border-radius-full":`9999px`,"--fc-shadow-sm":`0 1px 1px rgba(0,0,0,0.05)`,"--fc-shadow":`0 1px 3px rgba(0,0,0,0.1), 0 1px 2px rgba(0,0,0,0.06)`,"--fc-shadow-md":`0 4px 6px -1px rgba(0, 0, 0, 0.1)`,"--fc-shadow-lg":`0 10px 15px -3px rgba(0, 0, 0, 0.1)`,"--fc-transition-fast":`100ms ease-out`,"--fc-transition":`150ms ease-out`,"--fc-transition-slow":`250ms ease-out`,"--fc-z-dropdown":`1000`,"--fc-z-modal":`2000`,"--fc-z-tooltip":`3000`};static getCSSVariable(e,t=document.documentElement){return getComputedStyle(t).getPropertyValue(e).trim()}static setCSSVariables(e,t=document.documentElement){Object.entries(e).forEach(([e,n])=>{t.style.setProperty(e,n)})}static getBaseStyles(){return`
|
|
12
12
|
:host {
|
|
13
13
|
/* Apply CSS variables */
|
|
14
14
|
${Object.entries(this.cssVariables).map(([e,t])=>`${e}: ${t};`).join(`
|
|
@@ -231,7 +231,7 @@
|
|
|
231
231
|
.fc-scale-in {
|
|
232
232
|
animation: fc-scale-in var(--fc-transition);
|
|
233
233
|
}
|
|
234
|
-
`}},
|
|
234
|
+
`}},u=class{constructor(e,t){this.container=e,this.stateManager=t,this._listeners=[],this._scrolled=!1,this._nowIndicatorTimer=null}render(){throw Error(`render() must be implemented by subclass`)}cleanup(){this._listeners.forEach(({element:e,event:t,handler:n})=>{e.removeEventListener(t,n)}),this._listeners=[],this._nowIndicatorTimer&&=(clearInterval(this._nowIndicatorTimer),null)}addListener(e,t,n){let r=n.bind(this);e.addEventListener(t,r),this._listeners.push({element:e,event:t,handler:r})}escapeHTML(e){return e==null?``:s.escapeHTML(String(e))}isToday(e){let t=new Date;return e.getDate()===t.getDate()&&e.getMonth()===t.getMonth()&&e.getFullYear()===t.getFullYear()}isSameDay(e,t){return e.getDate()===t.getDate()&&e.getMonth()===t.getMonth()&&e.getFullYear()===t.getFullYear()}formatHour(e){let t=e>=12?`PM`:`AM`;return`${e%12||12} ${t}`}formatTime(e){let t=e.getHours(),n=e.getMinutes(),r=t>=12?`PM`:`AM`,i=t%12||12;return n===0?`${i} ${r}`:`${i}:${n.toString().padStart(2,`0`)} ${r}`}getContrastingTextColor(e){return!e||typeof e!=`string`||e.charAt(0)!==`#`?`white`:l.getContrastColor(e)}renderNowIndicator(){let e=new Date;return`<div class="fc-now-indicator" style="position: absolute; left: 0; right: 0; top: ${e.getHours()*60+e.getMinutes()}px; height: 2px; background: var(--fc-danger-color); z-index: 15; pointer-events: none;"></div>`}startNowIndicatorTimer(){this._nowIndicatorTimer&&clearInterval(this._nowIndicatorTimer),this._nowIndicatorTimer=setInterval(()=>{let e=this.container.querySelector(`.fc-now-indicator`);if(e){let t=new Date;e.style.top=`${t.getHours()*60+t.getMinutes()}px`}},6e4)}computeOverlapLayout(e){if(!e||e.length===0)return new Map;let t=e.map(e=>{let t=new Date(e.start),n=new Date(e.end),r=t.getHours()*60+t.getMinutes(),i=Math.max(r+1,n.getHours()*60+n.getMinutes());return{id:e.id,startMin:r,endMin:i}});t.sort((e,t)=>e.startMin-t.startMin||t.endMin-t.startMin-(e.endMin-e.startMin));let n=[],r=new Map;for(let e of t){let t=!1;for(let i=0;i<n.length;i++)if(n[i]<=e.startMin){n[i]=e.endMin,r.set(e.id,{column:i,totalColumns:0}),t=!0;break}t||(r.set(e.id,{column:n.length,totalColumns:0}),n.push(e.endMin))}let i=[],a=[],o=0;for(let e of t)a.length===0||e.startMin<o?(a.push(e),o=Math.max(o,e.endMin)):(i.push(a),a=[e],o=e.endMin);a.length>0&&i.push(a);for(let e of i){let t=Math.max(...e.map(e=>r.get(e.id).column))+1;for(let n of e)r.get(n.id).totalColumns=t}return r}renderTimedEvent(e,t={}){let{compact:n=!0,overlapLayout:r=null}=t,i=new Date(e.start),a=new Date(e.end),o=i.getHours()*60+i.getMinutes(),s=Math.max((a-i)/(1e3*60),n?20:30),c=this.getEventColor(e),l=this.getContrastingTextColor(c),u=n?`4px 8px`:`8px 12px`,d=n?`11px`:`13px`,f=n?2:12,p=n?2:24,m=n?`4px`:`6px`,h,g;if(r&&r.has(e.id)){let{column:t,totalColumns:n}=r.get(e.id),i=`(100% - ${f+p}px)`;h=`calc(${f}px + ${t} * ${i} / ${n})`,g=`calc(${i} / ${n})`}else h=`${f}px`,g=`calc(100% - ${f+p}px)`;return`
|
|
235
235
|
<div class="fc-event fc-timed-event" data-event-id="${this.escapeHTML(e.id)}"
|
|
236
236
|
style="position: absolute; top: ${o}px; height: ${s}px;
|
|
237
237
|
left: ${h}; width: ${g};
|
|
@@ -247,7 +247,7 @@
|
|
|
247
247
|
${this.formatTime(i)}${n?``:` - `+this.formatTime(a)}
|
|
248
248
|
</div>
|
|
249
249
|
</div>
|
|
250
|
-
`}getEventColor(e){return c.sanitizeColor(e?.backgroundColor,`#2563eb`)}attachCommonEventHandlers(){this.addListener(this.container,`click`,e=>{let t=e.target.closest(`.fc-event`);!t||!this.container.contains(t)||(e.stopPropagation(),this._selectEventFromElement(t))}),this.addListener(this.container,`keydown`,e=>{if(e.key!==`Enter`&&e.key!==` `)return;let t=e.target.closest(`.fc-event`);!t||!this.container.contains(t)||(e.preventDefault(),e.stopPropagation(),this._selectEventFromElement(t))}),this._enhanceEventAccessibility()}_selectEventFromElement(e){let t=e.dataset.eventId,n=this.stateManager.getEvents().find(e=>e.id===t);n&&this.stateManager.selectEvent(n)}_enhanceTimeGridAccessibility(e,t){let n=this.container.querySelector(`.fc-time-grid`);if(!n)return;n.setAttribute(`role`,`grid`),n.setAttribute(`aria-label`,t);let r=this.container.querySelector(`.fc-time-gutter`);r&&r.setAttribute(`aria-hidden`,`true`);let i=this.stateManager.getState().config.locale||`en-US`,a=new Intl.DateTimeFormat(i,{weekday:`long`,month:`long`,day:`numeric`}),o=Array.from(this.container.querySelectorAll(e));for(let e of o){e.setAttribute(`role`,`row`);let t=new Date(e.dataset.date),n=a.format(t);e.setAttribute(`aria-label`,n);for(let t of e.querySelectorAll(`.fc-hour-slot`))t.setAttribute(`role`,`gridcell`),t.setAttribute(`tabindex`,`-1`),t.setAttribute(`aria-label`,`${n}, ${this.formatHour(Number(t.dataset.hour))}`)}if(this._applySlotRovingTabindex(o),this._pendingSlotFocus){let{colIndex:e,hour:t}=this._pendingSlotFocus;this._pendingSlotFocus=null;let n=this._slotAt(o,e,t);n&&(this._applySlotRovingTabindex(o,n),n.focus())}this.addListener(this.container,`keydown`,t=>{let n=t.target.closest(`.fc-hour-slot`);if(!n||!this.container.contains(n))return;let r=n.closest(e),i=o.indexOf(r),a=Number(n.dataset.hour),s=null;switch(t.key){case`ArrowDown`:s=this._slotAt(o,i,a+1);break;case`ArrowUp`:s=this._slotAt(o,i,a-1);break;case`ArrowRight`:s=this._slotAt(o,i+1,a);break;case`ArrowLeft`:s=this._slotAt(o,i-1,a);break;case`Home`:s=this._slotAt(o,i,0);break;case`End`:s=this._slotAt(o,i,23);break;case`PageUp`:case`PageDown`:t.preventDefault(),this._pendingSlotFocus={colIndex:i,hour:a},t.key===`PageDown`?this.stateManager.next():this.stateManager.previous();return;case`Enter`:case` `:{t.preventDefault();let e=new Date(r.dataset.date);e.setHours(a,0,0,0),this._pendingSlotFocus={colIndex:i,hour:a},this.stateManager.selectDate(e);return}default:return}t.preventDefault(),s&&(this._applySlotRovingTabindex(o,s),s.scrollIntoView?.({block:`nearest`}),s.focus())})}_slotAt(e,t,n){return t<0||t>=e.length||n<0||n>23?null:e[t].querySelector(`.fc-hour-slot[data-hour="${n}"]`)}_applySlotRovingTabindex(e,t=null){let n=this.container.querySelectorAll(`.fc-hour-slot`);if(n.length!==0){if(!t){let r=e.find(e=>this.isToday(new Date(e.dataset.date)))||e[0];t=r&&r.querySelector(`.fc-hour-slot[data-hour="9"]`),t||=n[0]}for(let e of n)e.setAttribute(`tabindex`,e===t?`0`:`-1`)}}_enhanceEventAccessibility(){for(let e of this.container.querySelectorAll(`.fc-event`))if(e.setAttribute(`role`,`button`),e.setAttribute(`tabindex`,`0`),!e.hasAttribute(`aria-label`)){let t=(e.getAttribute(`title`)||e.textContent||``).trim();t&&e.setAttribute(`aria-label`,`Event: ${t}`)}}},u=4,d=15,f=1;function p(e,t=d){return Math.round(e/t)*t}function m(e,t){return Math.max(0,Math.min(e,1440-t))}function h(e,t){let n=new Date(e);return n.setHours(t.getHours(),t.getMinutes(),t.getSeconds(),t.getMilliseconds()),n}var g=class{constructor(e){this.renderer=e,this.container=e.container,this.stateManager=e.stateManager,this._active=null,this._docListeners=[]}enableMonthMove(){this.renderer.addListener(this.container,`pointerdown`,e=>{if(e.button!==0)return;let t=e.target.closest(`.fc-event`);!t||!this.container.contains(t)||t.closest(`.fc-month-day`)&&this._arm(e,{mode:`month-move`,eventEl:t,eventId:t.dataset.eventId,onDragMove:e=>this._monthDragMove(e),onDrop:e=>this._monthDrop(e)})})}enableTimeGrid(e){this._columnSelector=e,this._injectResizeHandles(),this.renderer.addListener(this.container,`pointerdown`,t=>{if(t.button!==0)return;let n=t.target.closest(`.fc-resize-handle`);if(n){let e=n.closest(`.fc-timed-event`);if(!e)return;t.preventDefault(),this._arm(t,{mode:`resize`,eventEl:e,eventId:e.dataset.eventId,originTop:parseFloat(e.style.top)||0,originHeight:parseFloat(e.style.height)||30,onDragMove:e=>this._resizeDragMove(e),onDrop:()=>this._resizeDrop()});return}let r=t.target.closest(`.fc-timed-event`);if(r&&this.container.contains(r)){this._arm(t,{mode:`time-move`,eventEl:r,eventId:r.dataset.eventId,originTop:parseFloat(r.style.top)||0,originColumn:r.closest(e),onDragMove:e=>this._timeMoveDragMove(e),onDrop:()=>this._timeMoveDrop()});return}let i=t.target.closest(e);i&&!t.target.closest(`.fc-event`)&&this._arm(t,{mode:`create`,column:i,onDragMove:e=>this._createDragMove(e),onDrop:()=>this._createDrop()})})}_arm(e,t){this._active={...t,startX:e.clientX,startY:e.clientY,dragging:!1};let n=e=>this._onPointerMove(e),r=e=>this._onPointerUp(e),i=()=>this._cancel(),a=e=>{e.key===`Escape`&&this._cancel()},o=this.container.ownerDocument;o.addEventListener(`pointermove`,n),o.addEventListener(`pointerup`,r),o.addEventListener(`pointercancel`,i),o.addEventListener(`keydown`,a),this._docListeners=[[`pointermove`,n],[`pointerup`,r],[`pointercancel`,i],[`keydown`,a]]}_onPointerMove(e){let t=this._active;if(t){if(!t.dragging){if(Math.abs(e.clientX-t.startX)<u&&Math.abs(e.clientY-t.startY)<u)return;t.dragging=!0,t.eventEl&&t.eventEl.classList.add(`fc-dragging`)}e.preventDefault(),t.onDragMove(e)}}_onPointerUp(e){let t=this._active;if(this._teardownDocListeners(),t){if(t.dragging){let n=this.container.ownerDocument,r=e=>{e.stopPropagation(),e.preventDefault()};n.addEventListener(`click`,r,{capture:!0,once:!0}),setTimeout(()=>n.removeEventListener(`click`,r,{capture:!0}),0),t.onDrop(e)}this._cleanupVisuals(t),this._active=null}}_cancel(){let e=this._active;this._teardownDocListeners(),this._active=null,e&&this._cleanupVisuals(e)}_teardownDocListeners(){let e=this.container.ownerDocument;for(let[t,n]of this._docListeners)e.removeEventListener(t,n);this._docListeners=[]}_cleanupVisuals(e){e.eventEl&&(e.eventEl.classList.remove(`fc-dragging`),e.eventEl.style.transform=``),this.container.querySelectorAll(`.fc-drop-target`).forEach(e=>e.classList.remove(`fc-drop-target`)),this._selectionEl?.remove(),this._selectionEl=null}_cellAtPoint(e,t){for(let n of this.container.querySelectorAll(`.fc-month-day`)){let r=n.getBoundingClientRect();if(e>=r.left&&e<r.right&&t>=r.top&&t<r.bottom)return n}return null}_monthDragMove(e){let t=this._active;t.eventEl.style.transform=`translate(${e.clientX-t.startX}px, ${e.clientY-t.startY}px)`;let n=this._cellAtPoint(e.clientX,e.clientY);n!==t.dropCell&&(t.dropCell?.classList.remove(`fc-drop-target`),n?.classList.add(`fc-drop-target`),t.dropCell=n)}_monthDrop(){let e=this._active??{},t=e.dropCell;if(!t)return;let n=this.stateManager.getEvents().find(t=>t.id===e.eventId);if(!n)return;let r=new Date(n.start),i=h(new Date(t.dataset.date),r),a=i.getTime()-r.getTime();a!==0&&this.stateManager.updateEvent(e.eventId,{start:i,end:new Date(new Date(n.end).getTime()+a)})}_columnAtPoint(e){for(let t of this.container.querySelectorAll(this._columnSelector)){let n=t.getBoundingClientRect();if(e>=n.left&&e<n.right)return t}return null}_timeMoveDragMove(e){let t=this._active,n=this._columnAtPoint(e.clientX)||t.originColumn;t.dropColumn=n,t.deltaMinutes=p((e.clientY-t.startY)/f);let r=t.originColumn.getBoundingClientRect(),i=n.getBoundingClientRect();t.eventEl.style.transform=`translate(${i.left-r.left}px, ${t.deltaMinutes*f}px)`}_timeMoveDrop(){let e=this._active??{},t=this.stateManager.getEvents().find(t=>t.id===e.eventId);if(!t||!e.deltaMinutes&&e.dropColumn===e.originColumn)return;let n=new Date(t.start),r=new Date(t.end).getTime()-n.getTime(),i=h(e.dropColumn?new Date(e.dropColumn.dataset.date):n,n),a=m(i.getHours()*60+i.getMinutes()+(e.deltaMinutes||0),Math.round(r/6e4)),o=new Date(i);o.setHours(Math.floor(a/60),a%60,0,0),o.getTime()!==n.getTime()&&this.stateManager.updateEvent(e.eventId,{start:o,end:new Date(o.getTime()+r)})}_resizeDragMove(e){let t=this._active,n=p((e.clientY-t.startY)/f);t.newHeight=Math.max(d,t.originHeight+n),t.newHeight=Math.min(t.newHeight,1440-t.originTop),t.eventEl.style.height=`${t.newHeight}px`}_resizeDrop(){let e=this._active??{};if(!e.newHeight||e.newHeight===e.originHeight)return;let t=this.stateManager.getEvents().find(t=>t.id===e.eventId);if(!t)return;let n=new Date(new Date(t.start).getTime()+e.newHeight*6e4);this.stateManager.updateEvent(e.eventId,{end:n})}_createDragMove(e){let t=this._active,n=t.column.getBoundingClientRect(),r=t.startY-n.top,i=e.clientY-n.top;t.fromMinutes=p(Math.min(r,i)/f),t.toMinutes=p(Math.max(r,i)/f),t.fromMinutes=Math.max(0,t.fromMinutes),t.toMinutes=Math.min(1440,Math.max(t.toMinutes,t.fromMinutes+d)),this._selectionEl||(this._selectionEl=this.container.ownerDocument.createElement(`div`),this._selectionEl.className=`fc-drag-selection`,t.column.appendChild(this._selectionEl)),this._selectionEl.style.top=`${t.fromMinutes*f}px`,this._selectionEl.style.height=`${(t.toMinutes-t.fromMinutes)*f}px`}_createDrop(){let e=this._active??{};if(e.fromMinutes==null)return;let t=new Date(e.column.dataset.date);t.setHours(Math.floor(e.fromMinutes/60),e.fromMinutes%60,0,0);let n=new Date(e.column.dataset.date);n.setHours(Math.floor(e.toMinutes/60),e.toMinutes%60,0,0),this.container.dispatchEvent(new CustomEvent(`range-select`,{detail:{start:t,end:n},bubbles:!0,composed:!0}))}_injectResizeHandles(){for(let e of this.container.querySelectorAll(`.fc-timed-event`)){if(e.querySelector(`.fc-resize-handle`))continue;let t=this.container.ownerDocument.createElement(`div`);t.className=`fc-resize-handle`,t.setAttribute(`aria-hidden`,`true`),e.appendChild(t)}}},_=class extends l{constructor(e,t){super(e,t),this.maxEventsToShow=3}render(){if(!this.container||!this.stateManager)return;let e=this.stateManager.getViewData();if(!e||!e.weeks){this.container.innerHTML=`<div style="padding: 20px; text-align: center; color: var(--fc-text-secondary);">No data available for month view.</div>`;return}this.cleanup();let t=this.stateManager.getState().config,n=this._renderMonthView(e,t);this.container.innerHTML=n,this._attachEventHandlers();let r=this._applyRovingTabindex(this._pendingFocusMs??null);this._pendingFocusMs!=null&&(this._pendingFocusMs=null,r&&r.focus())}_renderMonthView(e,t){let n=t.weekStartsOn||0,r=this._getDayNames(n),i=t.locale||`en-US`;this._dayLabelFormatter=new Intl.DateTimeFormat(i,{weekday:`long`,year:`numeric`,month:`long`,day:`numeric`});let a=this.stateManager.getState().currentDate,o=new Intl.DateTimeFormat(i,{month:`long`,year:`numeric`}).format(a||new Date),s=`
|
|
250
|
+
`}getEventColor(e){return l.sanitizeColor(e?.backgroundColor,`#2563eb`)}attachCommonEventHandlers(){this.addListener(this.container,`click`,e=>{let t=e.target.closest(`.fc-event`);!t||!this.container.contains(t)||(e.stopPropagation(),this._selectEventFromElement(t))}),this.addListener(this.container,`keydown`,e=>{if(e.key!==`Enter`&&e.key!==` `)return;let t=e.target.closest(`.fc-event`);!t||!this.container.contains(t)||(e.preventDefault(),e.stopPropagation(),this._selectEventFromElement(t))}),this._enhanceEventAccessibility()}_selectEventFromElement(e){let t=e.dataset.eventId,n=this.stateManager.getEvents().find(e=>e.id===t);n&&this.stateManager.selectEvent(n)}_enhanceTimeGridAccessibility(e,t){let n=this.container.querySelector(`.fc-time-grid`);if(!n)return;n.setAttribute(`role`,`grid`),n.setAttribute(`aria-label`,t);let r=this.container.querySelector(`.fc-time-gutter`);r&&r.setAttribute(`aria-hidden`,`true`);let i=this.stateManager.getState().config.locale||`en-US`,a=new Intl.DateTimeFormat(i,{weekday:`long`,month:`long`,day:`numeric`}),o=Array.from(this.container.querySelectorAll(e));for(let e of o){e.setAttribute(`role`,`row`);let t=new Date(e.dataset.date),n=a.format(t);e.setAttribute(`aria-label`,n);for(let t of e.querySelectorAll(`.fc-hour-slot`))t.setAttribute(`role`,`gridcell`),t.setAttribute(`tabindex`,`-1`),t.setAttribute(`aria-label`,`${n}, ${this.formatHour(Number(t.dataset.hour))}`)}if(this._applySlotRovingTabindex(o),this._pendingSlotFocus){let{colIndex:e,hour:t}=this._pendingSlotFocus;this._pendingSlotFocus=null;let n=this._slotAt(o,e,t);n&&(this._applySlotRovingTabindex(o,n),n.focus())}this.addListener(this.container,`keydown`,t=>{let n=t.target.closest(`.fc-hour-slot`);if(!n||!this.container.contains(n))return;let r=n.closest(e),i=o.indexOf(r),a=Number(n.dataset.hour),s=null;switch(t.key){case`ArrowDown`:s=this._slotAt(o,i,a+1);break;case`ArrowUp`:s=this._slotAt(o,i,a-1);break;case`ArrowRight`:s=this._slotAt(o,i+1,a);break;case`ArrowLeft`:s=this._slotAt(o,i-1,a);break;case`Home`:s=this._slotAt(o,i,0);break;case`End`:s=this._slotAt(o,i,23);break;case`PageUp`:case`PageDown`:t.preventDefault(),this._pendingSlotFocus={colIndex:i,hour:a},t.key===`PageDown`?this.stateManager.next():this.stateManager.previous();return;case`Enter`:case` `:{t.preventDefault();let e=new Date(r.dataset.date);e.setHours(a,0,0,0),this._pendingSlotFocus={colIndex:i,hour:a},this.stateManager.selectDate(e);return}default:return}t.preventDefault(),s&&(this._applySlotRovingTabindex(o,s),s.scrollIntoView?.({block:`nearest`}),s.focus())})}_slotAt(e,t,n){return t<0||t>=e.length||n<0||n>23?null:e[t].querySelector(`.fc-hour-slot[data-hour="${n}"]`)}_applySlotRovingTabindex(e,t=null){let n=this.container.querySelectorAll(`.fc-hour-slot`);if(n.length!==0){if(!t){let r=e.find(e=>this.isToday(new Date(e.dataset.date)))||e[0];t=r&&r.querySelector(`.fc-hour-slot[data-hour="9"]`),t||=n[0]}for(let e of n)e.setAttribute(`tabindex`,e===t?`0`:`-1`)}}_enhanceEventAccessibility(){for(let e of this.container.querySelectorAll(`.fc-event`))if(e.setAttribute(`role`,`button`),e.setAttribute(`tabindex`,`0`),!e.hasAttribute(`aria-label`)){let t=(e.getAttribute(`title`)||e.textContent||``).trim();t&&e.setAttribute(`aria-label`,`Event: ${t}`)}}},d=4,f=15,p=1;function m(e,t=f){return Math.round(e/t)*t}function h(e,t){return Math.max(0,Math.min(e,1440-t))}function g(e,t){let n=new Date(e);return n.setHours(t.getHours(),t.getMinutes(),t.getSeconds(),t.getMilliseconds()),n}var _=class{constructor(e){this.renderer=e,this.container=e.container,this.stateManager=e.stateManager,this._active=null,this._docListeners=[]}enableMonthMove(){this.renderer.addListener(this.container,`pointerdown`,e=>{if(e.button!==0)return;let t=e.target.closest(`.fc-event`);!t||!this.container.contains(t)||t.closest(`.fc-month-day`)&&this._arm(e,{mode:`month-move`,eventEl:t,eventId:t.dataset.eventId,onDragMove:e=>this._monthDragMove(e),onDrop:e=>this._monthDrop(e)})})}enableTimeGrid(e){this._columnSelector=e,this._injectResizeHandles(),this.renderer.addListener(this.container,`pointerdown`,t=>{if(t.button!==0)return;let n=t.target.closest(`.fc-resize-handle`);if(n){let e=n.closest(`.fc-timed-event`);if(!e)return;t.preventDefault(),this._arm(t,{mode:`resize`,eventEl:e,eventId:e.dataset.eventId,originTop:parseFloat(e.style.top)||0,originHeight:parseFloat(e.style.height)||30,onDragMove:e=>this._resizeDragMove(e),onDrop:()=>this._resizeDrop()});return}let r=t.target.closest(`.fc-timed-event`);if(r&&this.container.contains(r)){this._arm(t,{mode:`time-move`,eventEl:r,eventId:r.dataset.eventId,originTop:parseFloat(r.style.top)||0,originColumn:r.closest(e),onDragMove:e=>this._timeMoveDragMove(e),onDrop:()=>this._timeMoveDrop()});return}let i=t.target.closest(e);i&&!t.target.closest(`.fc-event`)&&this._arm(t,{mode:`create`,column:i,onDragMove:e=>this._createDragMove(e),onDrop:()=>this._createDrop()})})}_arm(e,t){this._active={...t,startX:e.clientX,startY:e.clientY,dragging:!1};let n=e=>this._onPointerMove(e),r=e=>this._onPointerUp(e),i=()=>this._cancel(),a=e=>{e.key===`Escape`&&this._cancel()},o=this.container.ownerDocument;o.addEventListener(`pointermove`,n),o.addEventListener(`pointerup`,r),o.addEventListener(`pointercancel`,i),o.addEventListener(`keydown`,a),this._docListeners=[[`pointermove`,n],[`pointerup`,r],[`pointercancel`,i],[`keydown`,a]]}_onPointerMove(e){let t=this._active;if(t){if(!t.dragging){if(Math.abs(e.clientX-t.startX)<d&&Math.abs(e.clientY-t.startY)<d)return;t.dragging=!0,t.eventEl&&t.eventEl.classList.add(`fc-dragging`)}e.preventDefault(),t.onDragMove(e)}}_onPointerUp(e){let t=this._active;if(this._teardownDocListeners(),t){if(t.dragging){let n=this.container.ownerDocument,r=e=>{e.stopPropagation(),e.preventDefault()};n.addEventListener(`click`,r,{capture:!0,once:!0}),setTimeout(()=>n.removeEventListener(`click`,r,{capture:!0}),0),t.onDrop(e)}this._cleanupVisuals(t),this._active=null}}_cancel(){let e=this._active;this._teardownDocListeners(),this._active=null,e&&this._cleanupVisuals(e)}_teardownDocListeners(){let e=this.container.ownerDocument;for(let[t,n]of this._docListeners)e.removeEventListener(t,n);this._docListeners=[]}_cleanupVisuals(e){e.eventEl&&(e.eventEl.classList.remove(`fc-dragging`),e.eventEl.style.transform=``),this.container.querySelectorAll(`.fc-drop-target`).forEach(e=>e.classList.remove(`fc-drop-target`)),this._selectionEl?.remove(),this._selectionEl=null}_cellAtPoint(e,t){for(let n of this.container.querySelectorAll(`.fc-month-day`)){let r=n.getBoundingClientRect();if(e>=r.left&&e<r.right&&t>=r.top&&t<r.bottom)return n}return null}_monthDragMove(e){let t=this._active;t.eventEl.style.transform=`translate(${e.clientX-t.startX}px, ${e.clientY-t.startY}px)`;let n=this._cellAtPoint(e.clientX,e.clientY);n!==t.dropCell&&(t.dropCell?.classList.remove(`fc-drop-target`),n?.classList.add(`fc-drop-target`),t.dropCell=n)}_monthDrop(){let e=this._active??{},t=e.dropCell;if(!t)return;let n=this.stateManager.getEvents().find(t=>t.id===e.eventId);if(!n)return;let r=new Date(n.start),i=g(new Date(t.dataset.date),r),a=i.getTime()-r.getTime();a!==0&&this.stateManager.updateEvent(e.eventId,{start:i,end:new Date(new Date(n.end).getTime()+a)})}_columnAtPoint(e){for(let t of this.container.querySelectorAll(this._columnSelector)){let n=t.getBoundingClientRect();if(e>=n.left&&e<n.right)return t}return null}_timeMoveDragMove(e){let t=this._active,n=this._columnAtPoint(e.clientX)||t.originColumn;t.dropColumn=n,t.deltaMinutes=m((e.clientY-t.startY)/p);let r=t.originColumn.getBoundingClientRect(),i=n.getBoundingClientRect();t.eventEl.style.transform=`translate(${i.left-r.left}px, ${t.deltaMinutes*p}px)`}_timeMoveDrop(){let e=this._active??{},t=this.stateManager.getEvents().find(t=>t.id===e.eventId);if(!t||!e.deltaMinutes&&e.dropColumn===e.originColumn)return;let n=new Date(t.start),r=new Date(t.end).getTime()-n.getTime(),i=g(e.dropColumn?new Date(e.dropColumn.dataset.date):n,n),a=h(i.getHours()*60+i.getMinutes()+(e.deltaMinutes||0),Math.round(r/6e4)),o=new Date(i);o.setHours(Math.floor(a/60),a%60,0,0),o.getTime()!==n.getTime()&&this.stateManager.updateEvent(e.eventId,{start:o,end:new Date(o.getTime()+r)})}_resizeDragMove(e){let t=this._active,n=m((e.clientY-t.startY)/p);t.newHeight=Math.max(f,t.originHeight+n),t.newHeight=Math.min(t.newHeight,1440-t.originTop),t.eventEl.style.height=`${t.newHeight}px`}_resizeDrop(){let e=this._active??{};if(!e.newHeight||e.newHeight===e.originHeight)return;let t=this.stateManager.getEvents().find(t=>t.id===e.eventId);if(!t)return;let n=new Date(new Date(t.start).getTime()+e.newHeight*6e4);this.stateManager.updateEvent(e.eventId,{end:n})}_createDragMove(e){let t=this._active,n=t.column.getBoundingClientRect(),r=t.startY-n.top,i=e.clientY-n.top;t.fromMinutes=m(Math.min(r,i)/p),t.toMinutes=m(Math.max(r,i)/p),t.fromMinutes=Math.max(0,t.fromMinutes),t.toMinutes=Math.min(1440,Math.max(t.toMinutes,t.fromMinutes+f)),this._selectionEl||(this._selectionEl=this.container.ownerDocument.createElement(`div`),this._selectionEl.className=`fc-drag-selection`,t.column.appendChild(this._selectionEl)),this._selectionEl.style.top=`${t.fromMinutes*p}px`,this._selectionEl.style.height=`${(t.toMinutes-t.fromMinutes)*p}px`}_createDrop(){let e=this._active??{};if(e.fromMinutes==null)return;let t=new Date(e.column.dataset.date);t.setHours(Math.floor(e.fromMinutes/60),e.fromMinutes%60,0,0);let n=new Date(e.column.dataset.date);n.setHours(Math.floor(e.toMinutes/60),e.toMinutes%60,0,0),this.container.dispatchEvent(new CustomEvent(`range-select`,{detail:{start:t,end:n},bubbles:!0,composed:!0}))}_injectResizeHandles(){for(let e of this.container.querySelectorAll(`.fc-timed-event`)){if(e.querySelector(`.fc-resize-handle`))continue;let t=this.container.ownerDocument.createElement(`div`);t.className=`fc-resize-handle`,t.setAttribute(`aria-hidden`,`true`),e.appendChild(t)}}},v=class extends u{constructor(e,t){super(e,t),this.maxEventsToShow=3}render(){if(!this.container||!this.stateManager)return;let e=this.stateManager.getViewData();if(!e||!e.weeks){this.container.innerHTML=`<div style="padding: 20px; text-align: center; color: var(--fc-text-secondary);">No data available for month view.</div>`;return}this.cleanup();let t=this.stateManager.getState().config,n=this._renderMonthView(e,t);this.container.innerHTML=n,this._attachEventHandlers();let r=this._applyRovingTabindex(this._pendingFocusMs??null);this._pendingFocusMs!=null&&(this._pendingFocusMs=null,r&&r.focus())}_renderMonthView(e,t){let n=t.weekStartsOn||0,r=this._getDayNames(n),i=t.locale||`en-US`;this._dayLabelFormatter=new Intl.DateTimeFormat(i,{weekday:`long`,year:`numeric`,month:`long`,day:`numeric`});let a=this.stateManager.getState().currentDate,o=new Intl.DateTimeFormat(i,{month:`long`,year:`numeric`}).format(a||new Date),s=`
|
|
251
251
|
<div class="fc-month-view" role="grid" aria-label="${this.escapeHTML(o)}" style="display: flex; flex-direction: column; height: 100%; min-height: 400px; background: var(--fc-background); border: 1px solid var(--fc-border-color);">
|
|
252
252
|
<div class="fc-month-header" role="row" style="display: grid; grid-template-columns: repeat(7, 1fr); border-bottom: 1px solid var(--fc-border-color); background: var(--fc-background-alt);">
|
|
253
253
|
${r.map(e=>`<div class="fc-month-header-cell" role="columnheader" style="padding: 12px 8px; text-align: center; font-size: 11px; font-weight: 600; color: var(--fc-text-light); text-transform: uppercase;">${this.escapeHTML(e)}</div>`).join(``)}
|
|
@@ -274,7 +274,7 @@
|
|
|
274
274
|
style="background-color: ${t}; font-size: 11px; padding: 2px 6px; border-radius: 3px; color: ${n}; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; cursor: pointer;">
|
|
275
275
|
${this.escapeHTML(e.title)}
|
|
276
276
|
</div>
|
|
277
|
-
`}_attachEventHandlers(){this.addListener(this.container,`click`,e=>{let t=e.target.closest(`.fc-month-day`);if(!t||!this.container.contains(t)||e.target.closest(`.fc-event`))return;let n=new Date(t.dataset.date);this.stateManager.selectDate(n)}),this.addListener(this.container,`keydown`,e=>{if(e.target.closest(`.fc-event`))return;let t=e.target.closest(`.fc-month-day`);if(!t||!this.container.contains(t))return;let n=Array.from(this.container.querySelectorAll(`.fc-month-day`)),r=n.indexOf(t),i;switch(e.key){case`ArrowRight`:i=r+1;break;case`ArrowLeft`:i=r-1;break;case`ArrowDown`:i=r+7;break;case`ArrowUp`:i=r-7;break;case`Home`:i=r-r%7;break;case`End`:i=r-r%7+6;break;case`PageUp`:case`PageDown`:{e.preventDefault();let n=new Date(t.dataset.date);n.setMonth(n.getMonth()+(e.key===`PageDown`?1:-1)),this._pendingFocusMs=n.getTime(),e.key===`PageDown`?this.stateManager.next():this.stateManager.previous();return}case`Enter`:case` `:{e.preventDefault();let n=new Date(t.dataset.date);this._pendingFocusMs=n.getTime(),this.stateManager.selectDate(n);return}default:return}if(e.preventDefault(),i>=0&&i<n.length)this._applyRovingTabindex(new Date(n[i].dataset.date).getTime()),n[i].focus();else{let e=new Date(t.dataset.date);e.setDate(e.getDate()+(i-r)),this._pendingFocusMs=e.getTime(),i<0?this.stateManager.previous():this.stateManager.next()}}),this.attachCommonEventHandlers(),new
|
|
277
|
+
`}_attachEventHandlers(){this.addListener(this.container,`click`,e=>{let t=e.target.closest(`.fc-month-day`);if(!t||!this.container.contains(t)||e.target.closest(`.fc-event`))return;let n=new Date(t.dataset.date);this.stateManager.selectDate(n)}),this.addListener(this.container,`keydown`,e=>{if(e.target.closest(`.fc-event`))return;let t=e.target.closest(`.fc-month-day`);if(!t||!this.container.contains(t))return;let n=Array.from(this.container.querySelectorAll(`.fc-month-day`)),r=n.indexOf(t),i;switch(e.key){case`ArrowRight`:i=r+1;break;case`ArrowLeft`:i=r-1;break;case`ArrowDown`:i=r+7;break;case`ArrowUp`:i=r-7;break;case`Home`:i=r-r%7;break;case`End`:i=r-r%7+6;break;case`PageUp`:case`PageDown`:{e.preventDefault();let n=new Date(t.dataset.date);n.setMonth(n.getMonth()+(e.key===`PageDown`?1:-1)),this._pendingFocusMs=n.getTime(),e.key===`PageDown`?this.stateManager.next():this.stateManager.previous();return}case`Enter`:case` `:{e.preventDefault();let n=new Date(t.dataset.date);this._pendingFocusMs=n.getTime(),this.stateManager.selectDate(n);return}default:return}if(e.preventDefault(),i>=0&&i<n.length)this._applyRovingTabindex(new Date(n[i].dataset.date).getTime()),n[i].focus();else{let e=new Date(t.dataset.date);e.setDate(e.getDate()+(i-r)),this._pendingFocusMs=e.getTime(),i<0?this.stateManager.previous():this.stateManager.next()}}),this.attachCommonEventHandlers(),new _(this).enableMonthMove()}_applyRovingTabindex(e=null){let t=Array.from(this.container.querySelectorAll(`.fc-month-day`));if(t.length===0)return null;let n=null;e!=null&&(n=t.find(t=>new Date(t.dataset.date).getTime()===e)),n||=t.find(e=>e.getAttribute(`aria-selected`)===`true`),n||=t.find(e=>e.hasAttribute(`aria-current`)),n||=t.find(e=>!e.dataset.otherMonth)||t[0];for(let e of t)e.setAttribute(`tabindex`,e===n?`0`:`-1`);return n}},y=class extends u{constructor(e,t){super(e,t),this.hourHeight=60,this.totalHeight=24*this.hourHeight}render(){if(!this.container||!this.stateManager)return;let e=this.stateManager.getViewData();if(!e||!e.days||e.days.length===0){this.container.innerHTML=`<div style="padding: 20px; text-align: center; color: var(--fc-text-secondary);">No data available for week view.</div>`;return}this.cleanup(),this._scrolled=!1;let t=this.stateManager.getState().config,n=this._renderWeekView(e,t);this.container.innerHTML=n,this._attachEventHandlers(),this._scrollToCurrentTime(),this.startNowIndicatorTimer()}_renderWeekView(e,t){let n=e.days,r=this.stateManager.getState().config.locale||`en-US`,i=Array.from({length:24},(e,t)=>t),a=n.map(e=>{let t=new Date(e.date),n=e.events||[];return{...e,date:t,dayName:o.getDayAbbreviation(t.getDay(),r),dayOfMonth:t.getDate(),isToday:this.isToday(t),timedEvents:n.filter(e=>!e.allDay),allDayEvents:n.filter(e=>e.allDay)}});return`
|
|
278
278
|
<div class="fc-week-view" style="display: flex; flex-direction: column; height: 100%; background: var(--fc-background); overflow: hidden;">
|
|
279
279
|
${this._renderHeader(a)}
|
|
280
280
|
${this._renderAllDayRow(a)}
|
|
@@ -336,7 +336,7 @@
|
|
|
336
336
|
<!-- Timed events -->
|
|
337
337
|
${(()=>{let t=this.computeOverlapLayout(e.timedEvents);return e.timedEvents.map(e=>this.renderTimedEvent(e,{compact:!0,overlapLayout:t})).join(``)})()}
|
|
338
338
|
</div>
|
|
339
|
-
`}_attachEventHandlers(){this.addListener(this.container,`click`,e=>{let t=e.target.closest(`.fc-week-day-column`);if(!t||!this.container.contains(t)||e.target.closest(`.fc-event`))return;let n=new Date(t.dataset.date),r=this.container.querySelector(`#week-scroll-container`),i=t.offsetTop,a=e.clientY-t.getBoundingClientRect().top+(r?r.scrollTop:0)-i,o=Math.max(0,Math.min(a+i,this.totalHeight));n.setHours(Math.floor(o/this.hourHeight),Math.floor(o%this.hourHeight/(this.hourHeight/60)),0,0),this.stateManager.selectDate(n)}),this.attachCommonEventHandlers();let e=this.stateManager.getViewData()?.days||[],t=this.stateManager.getState().config.locale||`en-US`,n=e[0]?new Date(e[0].date):new Date,r=`Week of ${new Intl.DateTimeFormat(t,{month:`long`,day:`numeric`,year:`numeric`}).format(n)}`;this._enhanceTimeGridAccessibility(`.fc-week-day-column`,r),new
|
|
339
|
+
`}_attachEventHandlers(){this.addListener(this.container,`click`,e=>{let t=e.target.closest(`.fc-week-day-column`);if(!t||!this.container.contains(t)||e.target.closest(`.fc-event`))return;let n=new Date(t.dataset.date),r=this.container.querySelector(`#week-scroll-container`),i=t.offsetTop,a=e.clientY-t.getBoundingClientRect().top+(r?r.scrollTop:0)-i,o=Math.max(0,Math.min(a+i,this.totalHeight));n.setHours(Math.floor(o/this.hourHeight),Math.floor(o%this.hourHeight/(this.hourHeight/60)),0,0),this.stateManager.selectDate(n)}),this.attachCommonEventHandlers();let e=this.stateManager.getViewData()?.days||[],t=this.stateManager.getState().config.locale||`en-US`,n=e[0]?new Date(e[0].date):new Date,r=`Week of ${new Intl.DateTimeFormat(t,{month:`long`,day:`numeric`,year:`numeric`}).format(n)}`;this._enhanceTimeGridAccessibility(`.fc-week-day-column`,r),new _(this).enableTimeGrid(`.fc-week-day-column`)}_scrollToCurrentTime(){if(this._scrolled)return;let e=this.container.querySelector(`#week-scroll-container`);e&&(e.scrollTop=8*this.hourHeight-50,this._scrolled=!0)}},b=class extends u{constructor(e,t){super(e,t),this.hourHeight=60,this.totalHeight=24*this.hourHeight}render(){if(!this.container||!this.stateManager)return;let e=this.stateManager.getViewData();if(!e){this.container.innerHTML=`<div style="padding: 20px; text-align: center; color: var(--fc-text-secondary);">No data available for day view.</div>`;return}this.cleanup(),this._scrolled=!1;let t=this.stateManager.getState().config,n=this._renderDayView(e,t);this.container.innerHTML=n,this._attachEventHandlers(),this._scrollToCurrentTime(),this.startNowIndicatorTimer()}_renderDayView(e,t){let n=this.stateManager?.getState()?.currentDate||new Date,r=this._extractDayData(e,n);if(!r)return`<div style="padding: 20px; text-align: center; color: var(--fc-text-secondary);">No data available for day view.</div>`;let{dayDate:i,dayName:a,isToday:o,allDayEvents:s,timedEvents:c}=r,l=Array.from({length:24},(e,t)=>t);return`
|
|
340
340
|
<div class="fc-day-view" style="display: flex; flex-direction: column; height: 100%; background: var(--fc-background); overflow: hidden;">
|
|
341
341
|
${this._renderHeader(i,a,o)}
|
|
342
342
|
${this._renderAllDayRow(s,i)}
|
|
@@ -394,9 +394,9 @@
|
|
|
394
394
|
<!-- Timed events -->
|
|
395
395
|
${(()=>{let t=this.computeOverlapLayout(e);return e.map(e=>this.renderTimedEvent(e,{compact:!1,overlapLayout:t})).join(``)})()}
|
|
396
396
|
</div>
|
|
397
|
-
`}_attachEventHandlers(){this.addListener(this.container,`click`,e=>{let t=e.target.closest(`.fc-day-column`);if(!t||!this.container.contains(t)||e.target.closest(`.fc-event`))return;let n=new Date(t.dataset.date),r=this.container.querySelector(`#day-scroll-container`),i=t.offsetTop,a=e.clientY-t.getBoundingClientRect().top+(r?r.scrollTop:0)-i,o=Math.max(0,Math.min(a+i,this.totalHeight));n.setHours(Math.floor(o/this.hourHeight),Math.floor(o%this.hourHeight/(this.hourHeight/60)),0,0),this.stateManager.selectDate(n)}),this.attachCommonEventHandlers();let e=this.stateManager.getState().config.locale||`en-US`,t=this.stateManager.getState().currentDate||new Date,n=new Intl.DateTimeFormat(e,{weekday:`long`,month:`long`,day:`numeric`,year:`numeric`}).format(t);this._enhanceTimeGridAccessibility(`.fc-day-column`,n),new
|
|
398
|
-
${
|
|
399
|
-
${
|
|
397
|
+
`}_attachEventHandlers(){this.addListener(this.container,`click`,e=>{let t=e.target.closest(`.fc-day-column`);if(!t||!this.container.contains(t)||e.target.closest(`.fc-event`))return;let n=new Date(t.dataset.date),r=this.container.querySelector(`#day-scroll-container`),i=t.offsetTop,a=e.clientY-t.getBoundingClientRect().top+(r?r.scrollTop:0)-i,o=Math.max(0,Math.min(a+i,this.totalHeight));n.setHours(Math.floor(o/this.hourHeight),Math.floor(o%this.hourHeight/(this.hourHeight/60)),0,0),this.stateManager.selectDate(n)}),this.attachCommonEventHandlers();let e=this.stateManager.getState().config.locale||`en-US`,t=this.stateManager.getState().currentDate||new Date,n=new Intl.DateTimeFormat(e,{weekday:`long`,month:`long`,day:`numeric`,year:`numeric`}).format(t);this._enhanceTimeGridAccessibility(`.fc-day-column`,n),new _(this).enableTimeGrid(`.fc-day-column`)}_scrollToCurrentTime(){if(this._scrolled)return;let e=this.container.querySelector(`#day-scroll-container`);e&&(e.scrollTop=8*this.hourHeight-50,this._scrolled=!0)}},x=class extends n{constructor(){super(),this._isVisible=!1,this._cleanupFocusTrap=null,this.config={title:`New Event`,defaultDuration:60,colors:[{color:`#2563EB`,label:`Blue`},{color:`#10B981`,label:`Green`},{color:`#F59E0B`,label:`Amber`},{color:`#EF4444`,label:`Red`},{color:`#8B5CF6`,label:`Purple`},{color:`#6B7280`,label:`Gray`}]},this._formData={title:``,start:new Date,end:new Date,allDay:!1,color:this.config.colors[0].color}}static get observedAttributes(){return[`open`]}attributeChangedCallback(e,t,n){e===`open`&&(n===null?this.close():this.open())}getStyles(){return`
|
|
398
|
+
${l.getBaseStyles()}
|
|
399
|
+
${l.getButtonStyles()}
|
|
400
400
|
|
|
401
401
|
:host {
|
|
402
402
|
display: none;
|
|
@@ -600,7 +600,7 @@
|
|
|
600
600
|
${this.config.colors.map(e=>`
|
|
601
601
|
<button type="button"
|
|
602
602
|
class="color-btn ${e.color===this._formData.color?`selected`:``}"
|
|
603
|
-
style="background-color: ${
|
|
603
|
+
style="background-color: ${l.sanitizeColor(e.color)}"
|
|
604
604
|
data-color="${s.escapeHTML(e.color)}"
|
|
605
605
|
title="${s.escapeHTML(e.label)}"
|
|
606
606
|
aria-label="${s.escapeHTML(e.label)}"
|
|
@@ -616,11 +616,11 @@
|
|
|
616
616
|
<button class="fc-btn fc-btn-primary" id="save-btn">Save Event</button>
|
|
617
617
|
</footer>
|
|
618
618
|
</div>
|
|
619
|
-
`}afterRender(){this.modalContent=this.$(`.modal-content`),this.titleInput=this.$(`#event-title`),this.startInput=this.$(`#event-start`),this.endInput=this.$(`#event-end`),this.colorContainer=this.$(`#color-picker`),this.titleGroup=this.$(`#title-group`),this.endGroup=this.$(`#end-group`),this.addListener(this.$(`#close-x`),`click`,()=>this.close()),this.addListener(this.$(`#cancel-btn`),`click`,()=>this.close()),this.addListener(this.$(`#save-btn`),`click`,()=>this.save()),this.colorContainer.querySelectorAll(`.color-btn`).forEach(e=>{this.addListener(e,`click`,e=>{this._formData.color=e.currentTarget.dataset.color,this.updateColorSelection()})}),this.addListener(this,`click`,e=>{e.target===this&&this.close()}),this._keydownListenerAdded||=(this._handleKeyDown=e=>{e.key===`Escape`&&this.hasAttribute(`open`)&&this.close()},window.addEventListener(`keydown`,this._handleKeyDown),!0)}updateColorSelection(){this.colorContainer.querySelectorAll(`.color-btn`).forEach(e=>{let t=e.dataset.color===this._formData.color;e.classList.toggle(`selected`,t),e.setAttribute(`aria-checked`,t?`true`:`false`)})}open(e=new Date){this.hasAttribute(`open`)||this.setAttribute(`open`,``),this.titleGroup.classList.remove(`has-error`),this.endGroup.classList.remove(`has-error`),this._formData.start=e,this._formData.end=new Date(e.getTime()+this.config.defaultDuration*60*1e3),this._formData.title=``,this._formData.color=this.config.colors[0].color,this.startInput&&(this.titleInput.value=``,this.startInput.value=this.formatDateForInput(this._formData.start),this.endInput.value=this.formatDateForInput(this._formData.end),this.updateColorSelection(),this._cleanupFocusTrap&&this._cleanupFocusTrap(),this._cleanupFocusTrap=s.trapFocus(this.modalContent))}close(){this.removeAttribute(`open`),this._cleanupFocusTrap&&=(this._cleanupFocusTrap(),null)}validate(){let e=!0;this.titleGroup.classList.remove(`has-error`),this.endGroup.classList.remove(`has-error`),this.titleInput.value.trim()||(this.titleGroup.classList.add(`has-error`),e=!1);let t=new Date(this.startInput.value);return new Date(this.endInput.value)<=t&&(this.endGroup.classList.add(`has-error`),e=!1),e}save(){if(!this.validate())return;let e={title:this.titleInput.value.trim(),start:new Date(this.startInput.value),end:new Date(this.endInput.value),backgroundColor:this._formData.color};this.emit(`save`,e),this.close()}formatDateForInput(e){let t=e=>String(e).padStart(2,`0`);return`${e.getFullYear()}-${t(e.getMonth()+1)}-${t(e.getDate())}T${t(e.getHours())}:${t(e.getMinutes())}`}unmount(){this._cleanupFocusTrap&&this._cleanupFocusTrap(),this._handleKeyDown&&(window.removeEventListener(`keydown`,this._handleKeyDown),this._handleKeyDown=null,this._keydownListenerAdded=!1)}};customElements.get(`forcecal-event-form`)||customElements.define(`forcecal-event-form`,
|
|
620
|
-
${
|
|
621
|
-
${
|
|
622
|
-
${
|
|
623
|
-
${
|
|
619
|
+
`}afterRender(){this.modalContent=this.$(`.modal-content`),this.titleInput=this.$(`#event-title`),this.startInput=this.$(`#event-start`),this.endInput=this.$(`#event-end`),this.colorContainer=this.$(`#color-picker`),this.titleGroup=this.$(`#title-group`),this.endGroup=this.$(`#end-group`),this.addListener(this.$(`#close-x`),`click`,()=>this.close()),this.addListener(this.$(`#cancel-btn`),`click`,()=>this.close()),this.addListener(this.$(`#save-btn`),`click`,()=>this.save()),this.colorContainer.querySelectorAll(`.color-btn`).forEach(e=>{this.addListener(e,`click`,e=>{this._formData.color=e.currentTarget.dataset.color,this.updateColorSelection()})}),this.addListener(this,`click`,e=>{e.target===this&&this.close()}),this._keydownListenerAdded||=(this._handleKeyDown=e=>{e.key===`Escape`&&this.hasAttribute(`open`)&&this.close()},window.addEventListener(`keydown`,this._handleKeyDown),!0)}updateColorSelection(){this.colorContainer.querySelectorAll(`.color-btn`).forEach(e=>{let t=e.dataset.color===this._formData.color;e.classList.toggle(`selected`,t),e.setAttribute(`aria-checked`,t?`true`:`false`)})}open(e=new Date){this.hasAttribute(`open`)||this.setAttribute(`open`,``),this.titleGroup.classList.remove(`has-error`),this.endGroup.classList.remove(`has-error`),this._formData.start=e,this._formData.end=new Date(e.getTime()+this.config.defaultDuration*60*1e3),this._formData.title=``,this._formData.color=this.config.colors[0].color,this.startInput&&(this.titleInput.value=``,this.startInput.value=this.formatDateForInput(this._formData.start),this.endInput.value=this.formatDateForInput(this._formData.end),this.updateColorSelection(),this._cleanupFocusTrap&&this._cleanupFocusTrap(),this._cleanupFocusTrap=s.trapFocus(this.modalContent))}close(){this.removeAttribute(`open`),this._cleanupFocusTrap&&=(this._cleanupFocusTrap(),null)}validate(){let e=!0;this.titleGroup.classList.remove(`has-error`),this.endGroup.classList.remove(`has-error`),this.titleInput.value.trim()||(this.titleGroup.classList.add(`has-error`),e=!1);let t=new Date(this.startInput.value);return new Date(this.endInput.value)<=t&&(this.endGroup.classList.add(`has-error`),e=!1),e}save(){if(!this.validate())return;let e={title:this.titleInput.value.trim(),start:new Date(this.startInput.value),end:new Date(this.endInput.value),backgroundColor:this._formData.color};this.emit(`save`,e),this.close()}formatDateForInput(e){let t=e=>String(e).padStart(2,`0`);return`${e.getFullYear()}-${t(e.getMonth()+1)}-${t(e.getDate())}T${t(e.getHours())}:${t(e.getMinutes())}`}unmount(){this._cleanupFocusTrap&&this._cleanupFocusTrap(),this._handleKeyDown&&(window.removeEventListener(`keydown`,this._handleKeyDown),this._handleKeyDown=null,this._keydownListenerAdded=!1)}};customElements.get(`forcecal-event-form`)||customElements.define(`forcecal-event-form`,x);var S=class e extends n{static RENDERERS={month:v,week:y,day:b};static get observedAttributes(){return[`view`,`date`,`locale`,`timezone`,`week-starts-on`,`height`,`theme`]}constructor(){super(),this.stateManager=null,this.currentView=null,this._hasRendered=!1,this._busUnsubscribers=[]}propChanged(e,t,n){if(!(!this.stateManager||t===n))switch(e){case`view`:n&&this.stateManager.setView(n);break;case`date`:{let e=n?new Date(n):null;e&&!isNaN(e.getTime())&&this.stateManager.setDate(e);break}case`locale`:n&&this.stateManager.updateConfig({locale:n});break;case`timezone`:n&&this.stateManager.updateConfig({timeZone:n});break;case`week-starts-on`:{let e=parseInt(n,10);Number.isNaN(e)||this.stateManager.updateConfig({weekStartsOn:e});break}}}initialize(){let e={view:this.getAttribute(`view`)||`month`,date:this.getAttribute(`date`)?new Date(this.getAttribute(`date`)):new Date,locale:this.getAttribute(`locale`)||`en-US`,timeZone:this.getAttribute(`timezone`)||Intl.DateTimeFormat().resolvedOptions().timeZone,weekStartsOn:parseInt(this.getAttribute(`week-starts-on`)||`0`)};this.stateManager=new a(e),this._stateUnsubscribe=this.stateManager.subscribe(this.handleStateChange.bind(this)),this.setupEventListeners()}setupEventListeners(){this._busUnsubscribers.forEach(e=>e()),this._busUnsubscribers=[];let e=this.stateManager.eventBus;this._busUnsubscribers.push(e.on(`navigation:*`,(e,t)=>{this.emit(`calendar-navigate`,{action:t.split(`:`)[1],...e})})),this._busUnsubscribers.push(e.on(`view:changed`,e=>{this.emit(`calendar-view-change`,e)}));let t=(e,t)=>{this.emit(`calendar-event-${e}`,t)};this._busUnsubscribers.push(e.on(`event:add`,e=>{t(`add`,e)})),this._busUnsubscribers.push(e.on(`event:update`,e=>{t(`update`,e)})),this._busUnsubscribers.push(e.on(`event:remove`,e=>{t(`remove`,e)})),this._busUnsubscribers.push(e.on(`event:added`,e=>{this.emit(`calendar-event-added`,e)})),this._busUnsubscribers.push(e.on(`event:updated`,e=>{this.emit(`calendar-event-updated`,e)})),this._busUnsubscribers.push(e.on(`event:deleted`,e=>{this.emit(`calendar-event-deleted`,e)})),this._busUnsubscribers.push(e.on(`date:selected`,e=>{this.emit(`calendar-date-select`,e)}))}handleStateChange(e,t){if(!this._hasRendered)return;let n=e.view!==t?.view,r=e.currentDate?.getTime()!==t?.currentDate?.getTime(),i=e.events!==t?.events,a=e.loading!==t?.loading;if(e.error!==t?.error){this.render();return}if(a){this._updateLoadingState(e.loading);return}n&&(this.currentView=e.view),n?(this._updateTitle(),this._updateViewButtons(),this._switchView()):r?(this._updateTitle(),this._updateViewContent()):i&&this._updateViewContent()}_updateTitle(){let e=this.$(`.fc-title`);if(e){let t=this.stateManager.getState();e.textContent=this.getTitle(t.currentDate,t.view)}}_updateViewButtons(){let e=this.stateManager.getState();this.$$(`[data-view]`).forEach(t=>{let n=t.dataset.view===e.view;t.classList.toggle(`active`,n)})}_switchView(){let t=this.$(`#calendar-view-container`);if(t){this._currentViewInstance&&this._currentViewInstance.cleanup&&this._currentViewInstance.cleanup();try{let n=new(e.RENDERERS[this.currentView]||v)(t,this.stateManager);n._viewType=this.currentView,this._currentViewInstance=n,n.render()}catch(e){console.error(`[ForceCalendar] Error switching view:`,e)}}}_updateViewContent(){this._currentViewInstance&&this._currentViewInstance.render&&this._currentViewInstance.render()}_updateLoadingState(e){let t=this.$(`.fc-loading`),n=this.$(`.fc-view-container`);t&&(t.style.display=e?`flex`:`none`),n&&(n.style.display=e?`none`:`flex`)}mount(){this.currentView=this.stateManager.getView(),super.mount()}loadView(e){!e||this.currentView===e||(this.currentView=e,this._switchView(),this._updateViewButtons(),this._updateTitle())}getStyles(){let e=this.getAttribute(`height`)||`800px`;return`
|
|
620
|
+
${l.getBaseStyles()}
|
|
621
|
+
${l.getButtonStyles()}
|
|
622
|
+
${l.getGridStyles()}
|
|
623
|
+
${l.getAnimations()}
|
|
624
624
|
|
|
625
625
|
:host {
|
|
626
626
|
--calendar-height: ${e};
|
|
@@ -1104,7 +1104,7 @@
|
|
|
1104
1104
|
|
|
1105
1105
|
<forcecal-event-form id="event-modal"></forcecal-event-form>
|
|
1106
1106
|
</div>
|
|
1107
|
-
`}renderView(){return`<div id="calendar-view-container"></div>`}afterRender(){let t=this.$(`#calendar-view-container`);if(t&&this.stateManager&&this.currentView){if(this._currentViewInstance&&this._currentViewInstance._viewType===this.currentView&&t.children.length>0)return;this._currentViewInstance&&(this._currentViewInstance.cleanup&&this._currentViewInstance.cleanup(),this._viewUnsubscribe&&=(this._viewUnsubscribe(),null));try{let n=new(e.RENDERERS[this.currentView]||
|
|
1107
|
+
`}renderView(){return`<div id="calendar-view-container"></div>`}_applyTheme(e){let t=c[e];for(let e of Object.keys(c.slds))t&&t[e]?this.style.setProperty(e,t[e]):this.style.removeProperty(e)}afterRender(){this._applyTheme(this.getAttribute(`theme`));let t=this.$(`#calendar-view-container`);if(t&&this.stateManager&&this.currentView){if(this._currentViewInstance&&this._currentViewInstance._viewType===this.currentView&&t.children.length>0)return;this._currentViewInstance&&(this._currentViewInstance.cleanup&&this._currentViewInstance.cleanup(),this._viewUnsubscribe&&=(this._viewUnsubscribe(),null));try{let n=new(e.RENDERERS[this.currentView]||v)(t,this.stateManager);n._viewType=this.currentView,this._currentViewInstance=n,n.render()}catch(e){console.error(`[ForceCalendar] Error creating/rendering view:`,e)}}this.$$(`[data-action]`).forEach(e=>{this.addListener(e,`click`,this.handleNavigation)}),this.$$(`[data-view]`).forEach(e=>{this.addListener(e,`click`,this.handleViewChange)});let n=this.$(`#event-modal`),r=this.$(`#create-event-btn`);r&&n&&this.addListener(r,`click`,()=>{n.open(new Date)}),this.addListener(this.shadowRoot,`day-click`,e=>{n&&n.open(e.detail.date)}),this.addListener(this.shadowRoot,`range-select`,e=>{this.emit(`calendar-range-select`,e.detail),n&&n.open(e.detail.start)}),n&&this.addListener(n,`save`,e=>{let t=e.detail,n=window.crypto&&typeof window.crypto.randomUUID==`function`?window.crypto.randomUUID():Math.random().toString(36).substring(2,15);this.stateManager.addEvent({id:n,...t})}),this._hasRendered=!0}handleNavigation(e){switch(e.currentTarget.dataset.action){case`today`:this.stateManager.today();break;case`previous`:this.stateManager.previous();break;case`next`:this.stateManager.next();break}}handleViewChange(e){let t=e.currentTarget.dataset.view;this.stateManager.setView(t)}getTitle(e,t){let n=this.stateManager.getState().config.locale;switch(t){case`month`:return o.formatDate(e,`month`,n);case`week`:{let t=o.startOfWeek(e),r=o.endOfWeek(e);return o.formatDateRange(t,r,n)}case`day`:return o.formatDate(e,`long`,n);default:return o.formatDate(e,`month`,n)}}getIcon(e){return{"chevron-left":`
|
|
1108
1108
|
<svg class="fc-icon" viewBox="0 0 24 24">
|
|
1109
1109
|
<path d="M15.41 7.41L14 6l-6 6 6 6 1.41-1.41L10.83 12z"/>
|
|
1110
1110
|
</svg>
|
|
@@ -1116,5 +1116,5 @@
|
|
|
1116
1116
|
<svg class="fc-icon" viewBox="0 0 24 24">
|
|
1117
1117
|
<path d="M19 3h-1V1h-2v2H8V1H6v2H5c-1.11 0-1.99.9-1.99 2L3 19c0 1.1.89 2 2 2h14c1.1 0 2-.9 2-2V5c0-1.1-.9-2-2-2zm0 16H5V8h14v11zM7 10h5v5H7z"/>
|
|
1118
1118
|
</svg>
|
|
1119
|
-
`}[e]||``}addEvent(e){return this.stateManager.addEvent(e)}updateEvent(e,t){return this.stateManager.updateEvent(e,t)}deleteEvent(e){return this.stateManager.deleteEvent(e)}getEvents(){return this.stateManager.getEvents()}setView(e){this.stateManager.setView(e)}setDate(e){this.stateManager.setDate(e)}next(){this.stateManager.next()}previous(){this.stateManager.previous()}today(){this.stateManager.today()}unmount(){this.destroy()}destroy(){this._busUnsubscribers.forEach(e=>e()),this._busUnsubscribers=[],this._stateUnsubscribe&&=(this._stateUnsubscribe(),null),this._currentViewInstance&&this._currentViewInstance.cleanup&&(this._currentViewInstance.cleanup(),this._currentViewInstance=null),this.stateManager&&this.stateManager.destroy(),super.cleanup()}};customElements.get(`forcecal-main`)||customElements.define(`forcecal-main`,
|
|
1119
|
+
`}[e]||``}addEvent(e){return this.stateManager.addEvent(e)}updateEvent(e,t){return this.stateManager.updateEvent(e,t)}deleteEvent(e){return this.stateManager.deleteEvent(e)}getEvents(){return this.stateManager.getEvents()}setView(e){this.stateManager.setView(e)}setDate(e){this.stateManager.setDate(e)}next(){this.stateManager.next()}previous(){this.stateManager.previous()}today(){this.stateManager.today()}unmount(){this.destroy()}destroy(){this._busUnsubscribers.forEach(e=>e()),this._busUnsubscribers=[],this._stateUnsubscribe&&=(this._stateUnsubscribe(),null),this._currentViewInstance&&this._currentViewInstance.cleanup&&(this._currentViewInstance.cleanup(),this._currentViewInstance=null),this.stateManager&&this.stateManager.destroy(),super.cleanup()}};customElements.get(`forcecal-main`)||customElements.define(`forcecal-main`,S),e.BaseComponent=n,e.BaseViewRenderer=u,e.DOMUtils=s,e.DateUtils=o,e.DayViewRenderer=b,e.EventBus=r,e.ForceCalendar=S,e.MonthViewRenderer=v,e.StateManager=a,e.StyleUtils=l,e.WeekViewRenderer=y,e.eventBus=i});
|
|
1120
1120
|
//# sourceMappingURL=force-calendar-interface.umd.js.map
|