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.48 kB
JavaScript
!function(i,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((i="undefined"!=typeof globalThis?globalThis:i||self).GrabScroll={})}(this,function(i){"use strict";
/**
* 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 t="GrabScroll",e=`config.plugin.${t}`,s="config.templates.chart-timeline-items-row-item";class n{constructor(i,s){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)}(i),this.vido=s,this.state=s.state,this.api=s.api,this.destroy=this.destroy.bind(this),this.state.update(e,this.options),this.unsubscribe.push(this.state.subscribe(e,i=>{this.options=i,this.updateTimelineClass(),s.update()})),Promise.resolve().then(()=>this.updateTimelineClass()),this.api.pluginInitialized(t),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(t)}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,e=(this.lastX-this.pointerData.currentPositionOrigin.x)*this.options.multiplier.x,s=this.api.time.getTimeFromOffsetPx(i.scroll.horizontal.absolutePosPx+e,!1,t);this.lastSetTime!==s&&(this.api.scrollToTime(s,!1),this.lastSetTime=s),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}}i.Plugin=function(i={}){return function(s){if(!s.api.isPluginInitialized("TimelinePointer"))throw new Error(`TimelinePointer plugin must be initialized before ${t} plugin.`);const o=s.state.get(e);o&&(i=s.api.mergeDeep({},i,o));return new n(i,s).destroy}},i.pluginName=t,i.pluginPath=e,i.templatePath=s,Object.defineProperty(i,"__esModule",{value:!0})});