UNPKG

@revolist/revogrid

Version:

Virtual reactive data grid spreadsheet component - RevoGrid.

4 lines 5.14 kB
/*! * Built by Revolist OU ❤️ */ const t=16e6,i=1e6;let e;function o(o=("undefined"==typeof document?void 0:document)){if("number"==typeof e)return e;const s=null==o?void 0:o.body;if(s){const o=s.ownerDocument,n=o.createElement("div");n.style.cssText=["height:1px","left:-10000px","overflow:scroll","position:absolute","top:-10000px","visibility:hidden","width:1px"].join(";");const r=o.createElement("div");return r.style.height="64000000px",n.appendChild(r),s.appendChild(n),e=Math.max(0,Math.min(n.scrollHeight,64e6)-i),n.remove(),e>i||(e=t),e}return t}function s({contentSize:t,clientSize:e,virtualSize:s=0,maxScrollSize:n=o()}){const r=Math.max(0,n-i),l=Math.max(0,t),a=Math.max(0,e),h=Math.max(0,s||a),c=Math.max(0,l-h),u=Math.max(0,r-a),d=Math.min(c,u),v=c>d&&d>0,S=t=>Math.min(Math.max(0,t||0),c),g=t=>Math.min(Math.max(0,t||0),d),p=t=>c&&d?g(v?S(t)/c*d:t):0;return{contentSize:l,clientSize:a,viewportSize:h,physicalContentSize:a+d,logicalScrollSize:c,physicalScrollSize:d,isCompressed:v,toLogicalCoordinate:t=>c&&d?S(v?g(t)/d*c:t):0,toPhysicalCoordinate:p,getRenderOffset(t){const i=S(t);return i-p(i)}}}const n={contentSize:0,clientSize:0,virtualSize:0,maxSize:0},r=-1;function l(t,i,e=0){return s({contentSize:t,clientSize:i,virtualSize:e}).physicalContentSize}class a{constructor(t){this.cfg=t,this.preventArtificialScroll={rgRow:null,rgCol:null},this.previousScroll={rgRow:r,rgCol:r},this.previousLogicalScroll={rgRow:0,rgCol:0},this.params={rgRow:Object.assign({},n),rgCol:Object.assign({},n)}}setParams(t,i){const e=s(t),o=e.physicalContentSize;this.params[i]=Object.assign(Object.assign({},t),{maxSize:o-t.clientSize,virtualContentSize:o,scrollDimension:e})}async setScroll(t){this.cancelScroll(t.dimension);const i=new Promise(((i,e)=>{if(this.cfg.skipAnimationFrame)return i();const o=window.requestAnimationFrame((()=>{i()}));this.preventArtificialScroll[t.dimension]=e.bind(null,o)}));try{await i;const e=this.getParams(t.dimension);t.coordinate=Math.ceil(t.coordinate),this.previousLogicalScroll[t.dimension]=this.wrapLogicalCoordinate(t.coordinate,e);const o=this.toPhysicalCoordinate(t.coordinate,e);this.previousScroll[t.dimension]=this.wrapPhysicalCoordinate(o,e),this.preventArtificialScroll[t.dimension]=null,this.cfg.applyScroll(Object.assign(Object.assign({},t),{coordinate:o}))}catch(t){window.cancelAnimationFrame(t)}}async setScrollByDelta(t,i){var e;const o=this.getParams(t.dimension),s=this.previousScroll[t.dimension]===r?this.toLogicalCoordinate(i,o):this.previousLogicalScroll[t.dimension],n=this.wrapLogicalCoordinate(s+(null!==(e=t.delta)&&void 0!==e?e:0),o),l=Object.assign(Object.assign({},t),{coordinate:n});return await this.setScroll(l),l}scroll(t,i,e=!1,o,s=!1){if(this.cancelScroll(i),!e&&this.previousScroll[i]===t)return void(this.previousScroll[i]=r);const n=this.getParams(i),l=this.toLogicalScrollCoordinate(t,i,n,o);this.cfg.runScroll({dimension:i,coordinate:l,delta:o,outside:s}),this.previousLogicalScroll[i]=l}getParams(t){return this.params[t]}wrapPhysicalCoordinate(t,i){return t<0?r:"number"==typeof i.maxSize&&t>i.maxSize?i.maxSize:t}wrapLogicalCoordinate(t,i){var e,o;return t<0?0:Math.min(t,null!==(o=null===(e=i.scrollDimension)||void 0===e?void 0:e.logicalScrollSize)&&void 0!==o?o:t)}cancelScroll(t){var i,e;null===(e=(i=this.preventArtificialScroll)[t])||void 0===e||e.call(i),this.preventArtificialScroll[t]=null}toLogicalScrollCoordinate(t,i,e,o){const s=e.scrollDimension;if(!s)return t;if("number"==typeof o&&s.isCompressed){const e=this.previousScroll[i]===r?s.toLogicalCoordinate(t-o):this.previousLogicalScroll[i];return s.toLogicalCoordinate(s.toPhysicalCoordinate(e+o))}return s.toLogicalCoordinate(t)}toPhysicalCoordinate(t,i){var e,o;return null!==(o=null===(e=i.scrollDimension)||void 0===e?void 0:e.toPhysicalCoordinate(t))&&void 0!==o?o:t}toLogicalCoordinate(t,i){var e,o;return null!==(o=null===(e=i.scrollDimension)||void 0===e?void 0:e.toLogicalCoordinate(t))&&void 0!==o?o:t}}class h{constructor(t=10){this.scrollThrottling=t,this.mouseWheelScrollTimestamp={rgCol:0,rgRow:0},this.lastKnownScrollCoordinate={rgCol:0,rgRow:0},this.lastScrollUpdateCallbacks={}}setCoordinate(t){this.lastKnownScrollCoordinate[t.dimension]=t.coordinate}latestScrollUpdate(t){this.mouseWheelScrollTimestamp[t]=(new Date).getTime()}isReady(t,i){return this.lastScrollUpdateCallbacks[t]&&this.clearLastScrollUpdate(t),this.verifyChange(t,i)}verifyChange(t,i){return(new Date).getTime()-this.mouseWheelScrollTimestamp[t]>this.scrollThrottling&&i!==this.lastKnownScrollCoordinate[t]}clearLastScrollUpdate(t){var i,e;clearTimeout(null!==(e=null===(i=this.lastScrollUpdateCallbacks[t])||void 0===i?void 0:i.timeout)&&void 0!==e?e:0),delete this.lastScrollUpdateCallbacks[t]}throttleLastScrollUpdate(t,i,e){if(this.scrollThrottling){this.clearLastScrollUpdate(t);const o=this.lastScrollUpdateCallbacks[t]={callback:e,timestamp:(new Date).getTime(),coordinate:i,timeout:0};o.timeout=setTimeout((()=>{this.clearLastScrollUpdate(t),this.mouseWheelScrollTimestamp[t]<o.timestamp&&this.verifyChange(t,o.coordinate)&&o.callback()}),this.scrollThrottling+50)}}}export{h as L,a,l as b,s as g}