UNPKG

gantt-schedule-timeline-calendar

Version:

Gantt, Schedule, Timeline, Calendar components all in one. [gantt, timeline, schedule, scheduler, calendar, booking, gantt chart, reservation, javascript gantt, javascript timeline, javascript schedule, javascript scheduler, javascript calendar, javascrip

13 lines 5.2 kB
/** * GrabScroll plugin * * @copyright NEURONET - Rafal Pospiech * @author Rafal Pospiech <neuronet.io@gmail.com> * @module gantt-schedule-timeline-calendar * @link https://github.com/neuronetio/gantt-schedule-timeline-calendar * @link https://gantt-schedule-timeline-calendar.neuronet.io * @version 3.43.14 * @released 2026-06-11 * @license SEE LICENSE IN LICENSE FILE */ const i="GrabScroll",t=`config.plugin.${i}`,s="config.templates.chart-timeline-items-row-item";class e{constructor(s,e){this.unsubscribe=[],this.lastSetTime=0,this.lastSetY=0,this.lastX=0,this.lastY=0,this.options=function(i={}){return Object.assign({enabled:!0,multiplier:{x:1,y:1},bodyClassName:"gstc-cursor-grabbing",timelineClassName:"gstc-cursor-grab"},i)}(s),this.vido=e,this.state=e.state,this.api=e.api,this.destroy=this.destroy.bind(this),this.state.update(t,this.options),this.unsubscribe.push(this.state.subscribe(t,i=>{this.options=i,this.updateTimelineClass(),e.update()})),Promise.resolve().then(()=>this.updateTimelineClass()),this.api.pluginInitialized(i),this.unsubscribe.push(this.state.subscribe("config.scroll",i=>{if(this.options.enabled&&(!i.horizontal.precise||!i.vertical.precise))throw new Error("[gantt-schedule-timeline-calendar] GrabScroll plugin works only with precise scrolling.")})),this.unsubscribe.push(this.state.subscribe("config.plugin.Selection",i=>{if(i&&i.enabled&&this.options.enabled)throw new Error('[gantt-schedule-timeline-calendar] GrabScroll plugin was disabled due to Selection plugin interference. Disable selection plugin with `state.update("config.plugin.Selection.enabled", false);`.')})),this.unsubscribe.push(this.state.subscribe("config.plugin.ItemResizing",i=>{if(i&&i.enabled&&this.options.enabled)throw new Error('[gantt-schedule-timeline-calendar] GrabScroll plugin was disabled due to ItemResizing plugin interference. Disable ItemResizing plugin with `state.update("config.plugin.ItemResizing.enabled", false);`.')})),this.unsubscribe.push(this.state.subscribe("config.plugin.ItemMovement",i=>{if(i&&i.enabled&&this.options.enabled)throw new Error('[gantt-schedule-timeline-calendar] GrabScroll plugin was disabled due to ItemMovement plugin interference. Disable ItemMovement plugin with `state.update("config.plugin.ItemMovement.enabled", false);`.')})),this.unsubscribe.push(this.state.subscribe("config.plugin.TimelinePointer",i=>{this.pointerData=i,this.onPointerData()}))}destroy(){this.unsubscribe.forEach(i=>i()),this.state.update(s,null),this.vido.api.pluginDestroyed(i)}updateTimelineClass(){const i=this.state.get("$data.elements.chart-timeline");i&&this.options.timelineClassName&&(this.options.enabled?Array.isArray(this.options.timelineClassName)?i.classList.add(...this.options.timelineClassName):i.classList.add(this.options.timelineClassName):Array.isArray(this.options.timelineClassName)?i.classList.remove(...this.options.timelineClassName):i.classList.remove(this.options.timelineClassName))}onPointerData(){this.options.enabled&&("down"===this.pointerData.pointerState?this.api.plugins.TimelinePointer.isLocked("down")||this.onPointerDown():"move"===this.pointerData.pointerState?"grab-scroll"===this.api.plugins.TimelinePointer.isLocked("move")&&this.onPointerMove():"up"===this.pointerData.pointerState&&"grab-scroll"===this.api.plugins.TimelinePointer.isLocked("up")&&this.onPointerUp())}onPointerDown(){this.options.enabled&&(this.options.bodyClassName&&(Array.isArray(this.options.bodyClassName)?document.body.classList.add(...this.options.bodyClassName):document.body.classList.add(this.options.bodyClassName)),this.api.plugins.TimelinePointer.lock("down","grab-scroll"),this.api.plugins.TimelinePointer.lock("move","grab-scroll"),this.api.plugins.TimelinePointer.lock("up","grab-scroll"),this.lastX=this.pointerData.initialPositionOrigin.x,this.lastY=this.pointerData.initialPositionOrigin.y)}onPointerUp(){this.options.enabled&&(this.options.bodyClassName&&(Array.isArray(this.options.bodyClassName)?document.body.classList.remove(...this.options.bodyClassName):document.body.classList.remove(this.options.bodyClassName)),this.api.plugins.TimelinePointer.unlock("down"),this.api.plugins.TimelinePointer.unlock("move"),this.api.plugins.TimelinePointer.unlock("up"))}onPointerMove(){if(!this.options.enabled)return;const i=this.state.get("$data"),t=i.chart.time,s=(this.lastX-this.pointerData.currentPositionOrigin.x)*this.options.multiplier.x,e=this.api.time.getTimeFromOffsetPx(i.scroll.horizontal.absolutePosPx+s,!1,t);this.lastSetTime!==e&&(this.api.scrollToTime(e,!1),this.lastSetTime=e),this.lastX=this.pointerData.currentPositionOrigin.x;const n=(this.lastY-this.pointerData.currentPositionOrigin.y)*this.options.multiplier.y,o=i.scroll.vertical.absolutePosPx+n;this.lastSetY!==o&&(this.api.setScrollTopByPixels(o),this.lastSetY=o),this.lastY=this.pointerData.currentPositionOrigin.y}}function n(s={}){return function(n){if(!n.api.isPluginInitialized("TimelinePointer"))throw new Error(`TimelinePointer plugin must be initialized before ${i} plugin.`);const o=n.state.get(t);o&&(s=n.api.mergeDeep({},s,o));return new e(s,n).destroy}}export{n as Plugin,i as pluginName,t as pluginPath,s as templatePath};