js-spread-grid 0.1.19 → 0.2.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.
Files changed (76) hide show
  1. package/dist/index.js +1 -1
  2. package/jsconfig.json +5 -1
  3. package/package.json +1 -1
  4. package/src/core/render.js +61 -4
  5. package/src/core/state.js +35 -15
  6. package/src/core-utils/rect.js +24 -0
  7. package/src/core-utils/roundToPixels.js +5 -0
  8. package/src/core-utils/stringifyId.js +21 -8
  9. package/src/index.js +188 -122
  10. package/src/state-utils/getActive.js +13 -0
  11. package/src/state-utils/getCellEditType.js +5 -0
  12. package/src/state-utils/getCellPlacement.js +9 -1
  13. package/src/state-utils/getCellSection.js +13 -0
  14. package/src/state-utils/getClipboardData.js +7 -0
  15. package/src/state-utils/getColumnIndex.js +4 -0
  16. package/src/state-utils/getCombinedCells.js +6 -0
  17. package/src/state-utils/getContextFormatting.js +4 -0
  18. package/src/state-utils/getDataFormatting.js +11 -1
  19. package/src/state-utils/getEditableCells.js +7 -0
  20. package/src/state-utils/getEditedCellsAndFilters.js +5 -1
  21. package/src/state-utils/getEdition.js +4 -1
  22. package/src/state-utils/getFilterFormatting.js +4 -0
  23. package/src/state-utils/getFiltered.js +27 -0
  24. package/src/state-utils/getFilteringRules.js +4 -0
  25. package/src/state-utils/getFixedSize.js +7 -0
  26. package/src/state-utils/getFormatResolver.js +8 -0
  27. package/src/state-utils/getFormattingRules.js +4 -0
  28. package/src/state-utils/getGenerated.js +21 -0
  29. package/src/state-utils/getHighlightedCells.js +11 -0
  30. package/src/state-utils/getHoveredCell.js +9 -0
  31. package/src/state-utils/getInputFormatting.js +4 -0
  32. package/src/state-utils/getInputPlacement.js +8 -0
  33. package/src/state-utils/getInternalPosition.js +34 -27
  34. package/src/state-utils/getIsTextValid.js +5 -0
  35. package/src/state-utils/getKeys.js +4 -0
  36. package/src/state-utils/getLookup.js +5 -0
  37. package/src/state-utils/getMeasureFormatting.js +4 -0
  38. package/src/state-utils/getMeasured.js +28 -4
  39. package/src/state-utils/getMousePosition.js +9 -0
  40. package/src/state-utils/getNewSortBy.js +10 -0
  41. package/src/state-utils/getOrder.js +4 -0
  42. package/src/state-utils/getOrdered.js +6 -0
  43. package/src/state-utils/getPinned.js +6 -1
  44. package/src/state-utils/getPlaced.js +12 -0
  45. package/src/state-utils/getReducedCells.js +6 -0
  46. package/src/state-utils/getReducedFormatting.js +17 -1
  47. package/src/state-utils/getRenderFormatting.js +35 -2
  48. package/src/state-utils/getReordered.js +17 -0
  49. package/src/state-utils/getResizable.js +24 -0
  50. package/src/state-utils/getResolved.js +23 -1
  51. package/src/state-utils/getResolvedFilters.js +4 -0
  52. package/src/state-utils/getResolvedSortBy.js +4 -0
  53. package/src/state-utils/getRowIndex.js +4 -0
  54. package/src/state-utils/getScrollRect.js +7 -0
  55. package/src/state-utils/getSections.js +14 -0
  56. package/src/state-utils/getSelection.js +4 -0
  57. package/src/state-utils/getSorted.js +43 -0
  58. package/src/state-utils/getSortingFormatting.js +4 -0
  59. package/src/state-utils/getSortingRules.js +4 -0
  60. package/src/state-utils/getToggledValue.js +7 -1
  61. package/src/state-utils/getTooltip.js +7 -0
  62. package/src/state-utils/getTooltipPlacement.js +8 -10
  63. package/src/state-utils/getTotalSize.js +5 -0
  64. package/src/state-utils/getUnfolded.js +28 -4
  65. package/src/state-utils/getWithAssumedId.js +6 -0
  66. package/src/types/Edition.js +4 -0
  67. package/src/types/FilteringRules.js +16 -1
  68. package/src/types/FormattingRules.js +20 -2
  69. package/src/types/FormattingRules.test.js +29 -28
  70. package/src/types/RulesLookup.js +31 -3
  71. package/src/types/Selection.js +14 -0
  72. package/src/types/SortingRules.js +29 -0
  73. package/src/types/TextResolver.js +16 -1
  74. package/src/typings.js +806 -11
  75. package/src/state-utils/getInvoked.js +0 -5
  76. package/src/types/VisibilityResolver.js +0 -61
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.SpreadGrid=t():e.SpreadGrid=t()}(self,(()=>(()=>{"use strict";var e={d:(t,o)=>{for(var n in o)e.o(o,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:o[n]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t)},t={};function o(e){return null===e?"null":Array.isArray(e)?`[${e.map(o).join(",")}]`:"object"==typeof e?(t=e,`{${Object.keys(t).sort().map((e=>`${e}:${o(t[e])}`)).join(",")}}`):JSON.stringify(e);var t}function n(e,t){const o="FILTER"===e.type,n="FILTER"===t.type;return o&&!n||!o&&n?"FILTER":"DATA"}function r(e,t,r,i){return e.map((e=>{const l=o(e.columnId),s=o(e.rowId);if(!r.has(l))return null;if(!i.has(s))return null;const d=r.get(l),u=i.get(s);return{edit:t.resolve(u,d).edit,cell:e,type:n(d,u)}})).filter((e=>e?.edit))}function i(e,t){return Math.round(e*t)/t}function l(e,t,o){const n=e.state,r=e.canvases[`${t}-${o}`],l=n.sections[t],s=n.sections[o],d=s.columns,u=l.rows;if(0===u.length||0===d.length)return void(r.parentElement&&r.parentElement.removeChild(r));r.parentElement||e.element.appendChild(r);const a=r.getContext("2d",{alpha:!1}),c=n.scrollRect,h=n.textResolver,f=n.renderFormatResolver,p=n.borderWidth,m=l.showTopBorder,g=l.showBottomBorder,y=s.showLeftBorder,w=s.showRightBorder,x=p/2,b=u.length-1+(m?1:0)+(g?1:0),v=d.length-1+(y?1:0)+(w?1:0),R=u.map((e=>e.height)),C=d.map((e=>e.width)),A=C.reduce(((e,t)=>e+t),0)+v*p,k=R.reduce(((e,t)=>e+t),0)+b*p,E="center"===o?c.left:0,I="middle"===t?c.top:0,L="center"===o?c.width:s.width,T="middle"===t?c.height:l.height,B=C.reduce(((e,t,o)=>{const n=e[o]+t+p;return e.push(n),e}),[y?p:0]),D=R.reduce(((e,t,o)=>{const n=e[o]+t+p;return e.push(n),e}),[m?p:0]),M=B.slice(0,-1),F=D.slice(0,-1),S=Math.max(M.findLastIndex((e=>e<=E)),0),z=M.findLastIndex((e=>e<=E+L)),O=Math.max(F.findLastIndex((e=>e<=I)),0),N=F.findLastIndex((e=>e<=I+T)),K=Math.max(S,y?0:1),H=z+(w?1:0),P=Math.max(O,m?0:1),W=N+(g?1:0),$=Array.from({length:N-O+1},((e,t)=>{const o=u[t+O];return Array.from({length:z-S+1},((e,t)=>{const n=d[t+S];return f.resolve(o,n)}))})),q=(e,t)=>$[e-O][t-S];r.width=Math.round(L*devicePixelRatio),r.height=Math.round(T*devicePixelRatio),r.style.width=`${L}px`,r.style.height=`${T}px`,r.style.marginLeft=`${E}px`,r.style.marginTop=`${I}px`,r.style.marginRight=A-L-E+"px",r.style.marginBottom=k-T-I+"px",a.fillStyle="#E9E9E9",a.fillRect(0,0,r.width,r.height);const V=(e,t)=>{a.setTransform(devicePixelRatio,0,0,devicePixelRatio,(e-E)*devicePixelRatio,(t-I)*devicePixelRatio)},Y=(e,t,o,n)=>{a.beginPath(),a.rect(e,t,o,n),a.clip()};for(let e=S;e<=z;e++)for(let t=O;t<=N;t++){const o=q(t,e),n=o.style,r=D[t],l=B[e],s=C[e],d=R[t],u=o.text,c=n.textBaseline||"middle",f=o.padding;if(V(l,r),a.fillStyle=n.background||"white",a.fillRect(0,0,s,d),"draw"in o&&o.draw(a),n.highlight&&(a.fillStyle=n.highlight,a.fillRect(0,0,s,d)),n.corner&&(a.fillStyle=n.corner,a.beginPath(),a.moveTo(s-7,d),a.lineTo(s,d),a.lineTo(s,d-7),a.fill()),u){a.fillStyle=n.foreground||"black",a.font=o.font;const e=h.getFontMetrics(o.font),t="center"==n.textAlign&&h.measureWidth(u,o.font)>s-f.left-f.right?"left":n.textAlign||"left";a.textAlign=t;const r=i("left"===t?f.left:"center"===t?s/2:"right"===t?s-f.right:0,devicePixelRatio),l=i("top"===c?e.middle+e.topOffset+f.top:"middle"===c?d/2+e.middle:"bottom"===c?d+e.middle-e.bottomOffset-f.bottom:0,devicePixelRatio);a.save(),Y(0,2*p,s,d-4*p),a.fillText(u,r,l),a.restore()}}V(0,0);const G=(e,t,o,n,r)=>{if(!r)return;if(0===r.width)return;const i=r.width/devicePixelRatio,l=t===n,s=e-(l?i/2:0),d=t-(l?0:i/2),u=o+(l?i/2:0),c=n+(l?0:i/2);a.strokeStyle=r.color||"black",a.lineWidth=i,r.dash?(a.setLineDash(r.dash.map((e=>e/devicePixelRatio))),a.lineDashOffset=l?s:d):a.setLineDash([]),a.beginPath(),a.moveTo(s,d),a.lineTo(u,c),a.stroke()},j=(e,t)=>e?t?e.index>t.index?e:t:e:t;for(let e=P;e<=W;e++){const t=e-1,o=e;for(let e=S;e<=z;e++){const n=j(t>=O?q(t,e).style.borderBottom:null,o<=N?q(o,e).style.borderTop:null);G(B[e]-x,D[o]-x,B[e+1]-x,D[o]-x,n)}}for(let e=K;e<=H;e++){const t=e-1,o=e;for(let e=O;e<=N;e++){const n=j(t>=S?q(e,t).style.borderRight:null,o<=z?q(e,o).style.borderLeft:null);G(B[o]-x,D[e]-x,B[o]-x,D[e+1]-x,n)}}}function s(e){if(!e.error)try{!function(e){l(e,"top","left"),l(e,"top","center"),l(e,"top","right"),l(e,"middle","left"),l(e,"middle","center"),l(e,"middle","right"),l(e,"bottom","left"),l(e,"bottom","center"),l(e,"bottom","right"),function(e){const t=e.element,o=e.input,n=e.state,r=n.inputPlacement;if(!r){if(o.parentElement){const e=document.activeElement===o;o.parentElement.removeChild(o),e&&t.focus({preventScroll:!0})}return}const i=e.canvases[r.section];if(o.style.left="left"in r?`${r.left}px`:"0",o.style.top="top"in r?`${r.top}px`:"0",o.style.right="right"in r?`${r.right}px`:"0",o.style.bottom="bottom"in r?`${r.bottom}px`:"0",o.style.marginLeft="marginLeft"in r?`${r.marginLeft}px`:"0",o.style.marginTop="marginTop"in r?`${r.marginTop}px`:"0",o.style.width=`${r.width}px`,o.style.height=`${r.height}px`,o.style.gridArea=i.style.gridArea,o.style.zIndex=i.style.zIndex,o.style.backgroundColor=n.isTextValid?"white":"#eb3434",!o.parentElement){const e=document.activeElement===t;t.appendChild(o),e&&o.focus({preventScroll:!0})}}(e),function(e){const t=e.element,o=e.state;e.isReordering?t.style.cursor="move":o.resizableColumn&&o.resizableRow?t.style.cursor="nwse-resize":o.resizableColumn?t.style.cursor="col-resize":o.resizableRow?t.style.cursor="row-resize":t.style.cursor="default"}(e),function(e){const t=e.element,o=e.tooltip,n=e.state.tooltip,r=e.state.tooltipPlacement;r?(o.innerHTML=n,o.style.left=`${r.left}px`,o.style.top=`${r.top}px`,o.parentElement||(t.appendChild(o),o.showPopover())):o.parentElement&&o.parentElement.removeChild(o)}(e)}(e)}catch(t){e.error=t}e.error&&function(e){if(e.errorRendered)return;e.errorRendered=!0;const t=e.element,o=e.error;t.style.backgroundColor="#9f0000",t.style.color="white",t.style.padding="20px",t.style.display="flex",t.style.flexDirection="column",t.style.userSelect="text",t.innerHTML=`\n <div style="font-size: 16px;">\n An error occurred while rendering the grid, please contact the support.\n </div>\n <div style="font-size: 20px; font-weight: bold; padding: 20px 0;">\n ${o.message}\n </div>\n <div style="font-size: 16px; white-space: pre-wrap;">${o.stack}</div>\n `}(e)}e.d(t,{default:()=>et});const d={value:({newValue:e})=>e||"",text:({newValue:e})=>e||"Search...",edit:{validate:()=>!0,parse:({string:e})=>e,autoCommit:!0}};function u(e,t,o){return[{column:{type:"DATA"},row:{type:"HEADER"},value:({column:e})=>void 0===e.header?e.id:e.header},{column:{type:"HEADER"},row:{type:"DATA"},value:({row:e})=>void 0===e.header?e.id:e.header},{column:{type:"HEADER"},row:{type:"SPECIAL"},value:""},{column:{type:"SPECIAL"},row:{type:"HEADER"},value:""},{column:{type:"DATA"},row:{type:"FILTER"},...d},{column:{type:"FILTER"},row:{type:"DATA"},...d},{column:{type:"DATA"},row:{type:"DATA"},value:t},...e,...o.map((({columnId:e,rowId:t,direction:n},r)=>({column:{id:e},row:{id:t},text:({value:e,text:t})=>`${o.length>1?r+1:""}${"ASC"===n?"⇣":"⇡"} ${t||e}`})))]}const a=["column","row","condition"];function c(e){return Object.keys(e).length>Object.keys(e).filter((e=>a.includes(e))).length}function h(e,t){const o=[...a,...t];return e.map((e=>function(e,t){const o={};for(const n of t)n in e&&(o[n]=e[n]);return o}(e,o))).filter(c)}function f(e){return h(e,["value","text","edit"])}function p(e,t){return t?e+"99":e+"33"}function m(e,t,n,r,i,l,s,d,u,a,c,h,f){const m=n?o(n.columnId):null,g=n?o(n.rowId):null,y=null!==u,w=null!==d||y,x=a+2,b=a+4,v=(e,t,o,n)=>{if(o<0||o>=e.length)return!1;if(n<0||n>=t.length)return!1;const i=e[o].key,l=t[n].key;return r.isKeySelected(i,l)},R=(e,t)=>e?[t]:[];return[{column:{type:"DATA"},row:{type:"FILTER"},style:({newValue:e})=>({background:"#FBFBFB",foreground:e?"black":"#cccccc",border:{width:1,color:"gray"}})},{column:{type:"FILTER"},row:{type:"DATA"},style:({newValue:e})=>({background:"#FBFBFB",foreground:e?"black":"#cccccc",border:{width:1,color:"gray"}})},{column:{type:"ANY"},row:{type:"HEADER"},style:{background:"#F5F5F5",border:{width:a,color:"gray"}}},{column:{type:"HEADER"},row:{type:"ANY"},style:{background:"#F5F5F5",border:{width:a,color:"gray"}}},{column:{type:"HEADER"},row:{type:"HEADER"},style:{background:"#E0E0E0"}},...e,...R(t&&!y,{column:{type:"ANY"},row:{id:t?.rowId},style:{highlight:"#81948133"}}),...R(t&&!w,{column:{id:t?.columnId},row:{id:t?.rowId},style:{highlight:"#81948188"}}),{column:{type:"ANY"},row:{type:"ANY"},condition:({rows:e,columns:t,row:o,column:n})=>v(e,t,o.index,n.index),style:({rows:e,columns:t,row:o,column:n,edit:r})=>({...v(e,t,o.index-1,n.index)?{}:{borderTop:{width:x,color:"#596959",index:Number.MAX_SAFE_INTEGER}},...v(e,t,o.index+1,n.index)?{}:{borderBottom:{width:x,color:"#596959",index:Number.MAX_SAFE_INTEGER}},...v(e,t,o.index,n.index-1)?{}:{borderLeft:{width:x,color:"#596959",index:Number.MAX_SAFE_INTEGER}},...v(e,t,o.index,n.index+1)?{}:{borderRight:{width:x,color:"#596959",index:Number.MAX_SAFE_INTEGER}},highlight:p(r?"#798d9c":"#819481",m!==n.key||g!==o.key)})},{column:{type:"ANY"},row:{type:"ANY"},condition:({row:e,column:t})=>i.isKeySelected(e.key,t.key),style:({row:e,column:t})=>({highlight:p("#93a8b8",m!==t.key||g!==e.key)})},...R(n,{column:{id:n?.columnId},row:{id:n?.rowId},style:{highlight:"#ffffffaa"}}),...s.map((({columnId:e,rowId:t,direction:o},n)=>({column:{id:e},row:{id:t},style:{highlight:"#0377fc44"}}))),{column:{type:"ANY"},row:{type:"ANY"},condition:({edit:e})=>e,style:{corner:"#77777720"}},{column:{type:"ANY"},row:{type:"ANY"},condition:({row:e,column:t})=>l.hasValueByKey(e.key,t.key),style:{corner:"darkgreen"}},...R(d,{column:{id:d},row:{type:"HEADER"},style:{borderRight:{width:b,color:"cornflowerblue"}}}),...R(u,{column:{type:"HEADER"},row:{id:u},style:{borderBottom:{width:b,color:"cornflowerblue"}}}),...R(c&&h,{column:{id:h},row:{type:"ANY"},style:{highlight:"#3a74e055"}}),...R(c&&f,{column:{type:"ANY"},row:{id:f},style:{highlight:"#3a74e055"}})]}function g(e,t){const o=t.filter((e=>"BEGIN"===e.pinned)).length,n=t.filter((e=>"END"===e.pinned)).length,r=t.length-o-n,i=e.filter((e=>"BEGIN"===e.pinned)).length,l=e.filter((e=>"END"===e.pinned)).length,s=e.length-i-l,d=t.slice(0,o),u=t.slice(t.length-n,t.length),a=t.slice(o,t.length-n),c=e.slice(0,i),h=e.slice(e.length-l,e.length),f=e.slice(i,e.length-l),p=o>0,m=i>0,g=!0,y=!0,w=r>0||!p,x=!0,b=!p,v=!(n>0),R=!0,C=!0,A=s>0||!m,k=!0,E=!m,I=!(l>0),L=(e,t,o)=>{if(0===e.length)return 0;const n=t?e.at(0).topWithBorder:e.at(0).top;return(o?e.at(-1).bottomWithBorder:e.at(-1).bottom)-n},T=(e,t,o)=>{if(0===e.length)return 0;const n=t?e.at(0).leftWithBorder:e.at(0).left;return(o?e.at(-1).rightWithBorder:e.at(-1).right)-n};return{top:{rows:d,showTopBorder:g,showBottomBorder:y,height:L(d,g,y)},bottom:{rows:u,showTopBorder:w,showBottomBorder:x,height:L(u,w,x)},middle:{rows:a,showTopBorder:b,showBottomBorder:v,height:L(a,b,v)},left:{columns:c,showLeftBorder:R,showRightBorder:C,width:T(c,R,C)},right:{columns:h,showLeftBorder:A,showRightBorder:k,width:T(h,A,k)},center:{columns:f,showLeftBorder:E,showRightBorder:I,width:T(f,E,I)}}}function y(e,t){return[...e,...t.map((e=>({columnId:e.columnId,rowId:e.rowId,value:e.expression})))]}class w{constructor(e){this.lookup=new Map,e.forEach((e=>{const t=o(e.rowId),n=o(e.columnId);this.lookup.has(t)||this.lookup.set(t,new Map),this.lookup.get(t).set(n,e.value)}))}hasValueByKey(e,t){return this.lookup.has(e)&&this.lookup.get(e).has(t)}getValueByKey(e,t){if(this.hasValueByKey(e,t))return this.lookup.get(e).get(t)}hasValueById(e,t){return this.hasValueByKey(o(e),o(t))}getValueById(e,t){return this.getValueByKey(o(e),o(t))}}function x(e){return new w(e)}class b{constructor(e){this.lookup=new Map,e.forEach((e=>{const t=o(e.rowId),n=o(e.columnId);this.lookup.has(t)||this.lookup.set(t,new Set),this.lookup.get(t).add(n)}))}isKeySelected(e,t){return this.lookup.has(e)&&this.lookup.get(e).has(t)}isIdSelected(e,t){return this.isKeySelected(o(e),o(t))}}function v(e){return new b(e)}function R(e,t){return"function"==typeof e?e(t):e}function C(e,t,o,n){return e<o?"BEGIN":e>=t-n?"END":void 0}function A(e,t,n){return e.map(((r,i)=>{const l="id"in r?r.id:r.type;return{...r,id:l,type:r.type||"DATA",key:o(l),pinned:C(i,e.length,t,n),header:"header"in r?r.header:l,labels:r.labels||[]}}))}function k(e,t,n,r){const i=new Map(r.map((({columnId:e,width:t})=>[o(e),t])));return A(e,t,n).map((e=>({...e,width:i.has(e.key)?i.get(e.key):"width"in e?e.width:"fit"})))}function E(e,t,n,r){const i=new Map(r.map((({rowId:e,height:t})=>[o(e),t])));return A(e,t,n).map((e=>({...e,height:i.has(e.key)?i.get(e.key):"height"in e?e.height:"fit"})))}function I(e,t,o){let n=o;return e.map(((e,r)=>{const l=i("width"in e?e.width:100,t),s={...e,index:r,width:l,leftWithBorder:n-o,left:n,right:n+l,rightWithBorder:n+l+o};return n+=s.width+o,s}))}function L(e,t,o){let n=o;return e.map(((e,r)=>{const l=i("height"in e?e.height:20,t),s={...e,index:r,height:l,topWithBorder:n-o,top:n,bottom:n+l,bottomWithBorder:n+l+o};return n+=s.height+o,s}))}const T="12px Calibri",B={top:2,right:5,bottom:2,left:5};function D(e){return"function"==typeof e?e:()=>e}const M={HEADER:["HEADER"],FILTER:["FILTER"],DATA:["DATA"],CUSTOM:["CUSTOM"],ANY:["HEADER","DATA","FILTER","CUSTOM"],SPECIAL:["HEADER","FILTER","CUSTOM"],undefined:[]};class F{byKey=new Map;byIndex=new Map;byLabel=new Map;byType=new Map}class S{lookup=new F;hasRules=!1;addRule(e,t,n){if(this.hasRules=!0,Array.isArray(e)){for(const o of e)this.addRule(o,t,n);return}if(Array.isArray(t)){for(const o of t)this.addRule(e,o,n);return}const r=e?"id"in e?{key:o(e.id)}:e:{type:"DATA"},i=t?"id"in t?{key:o(t.id)}:t:{type:"DATA"};function l(e,t){e.has(t)||e.set(t,[]),e.get(t).push(n)}function s(e,t){if(e.has(t)||e.set(t,new F),"key"in i)l(e.get(t).byKey,i.key);else if("index"in i)l(e.get(t).byIndex,i.index);else if("label"in i)l(e.get(t).byLabel,i.label);else for(const o of M[i.type])l(e.get(t).byType,o)}if("key"in r)s(this.lookup.byKey,r.key);else if("index"in r)s(this.lookup.byIndex,r.index);else if("label"in r)s(this.lookup.byLabel,r.label);else for(const e of M[r.type])s(this.lookup.byType,e)}getRules(e,t){const o=[];if(!this.hasRules)return o;function n(e){for(const t of e)o.push(t)}function r(e){e.byKey.has(t.key)&&n(e.byKey.get(t.key)),e.byIndex.has(t.index)&&n(e.byIndex.get(t.index)),e.byType.has(t.type)&&n(e.byType.get(t.type));for(const o of t.labels)e.byLabel.has(o)&&n(e.byLabel.get(o))}this.lookup.byKey.has(e.key)&&r(this.lookup.byKey.get(e.key)),this.lookup.byIndex.has(e.index)&&r(this.lookup.byIndex.get(e.index)),this.lookup.byType.has(e.type)&&r(this.lookup.byType.get(e.type));for(const t of e.labels)this.lookup.byLabel.has(t)&&r(this.lookup.byLabel.get(t));return o}}const z=["borderTop","borderRight","borderBottom","borderLeft"],O={validate:()=>!0,parse:({string:e})=>e};function N(e,t){const o={...e};if("border"in o){for(const e of z)o[e]=o.border;delete o.border}for(const e of z)e in o&&(o[e]={...o[e],index:t});return o}function K(e,t){if(!1!==e.edit)return!0===e.edit?"edit"in t?t.edit:O:"edit"in t?{...t.edit,...e.edit}:{...O,...e.edit}}class H{constructor(e){this.rulesLookup=new S;for(const[t,o]of e.entries()){const e={index:t};"condition"in o&&(e.condition=o.condition),"style"in o&&(e.style=D(o.style)),"value"in o&&(e.value=D(o.value)),"text"in o&&(e.text=D(o.text)),"font"in o&&(e.font=D(o.font)),"padding"in o&&(e.padding=D(o.padding)),"edit"in o&&(e.edit=o.edit),"tooltip"in o&&(e.tooltip=D(o.tooltip)),"draw"in o&&(e.draw=o.draw),this.rulesLookup.addRule(o.column,o.row,e)}}resolve(e,t,o,n,r,i){const l=this.rulesLookup.getRules(r,n).sort(((e,t)=>e.index-t.index)).filter(((e,t,o)=>e.index!==o[t-1]?.index));let s,d,u={data:e,rows:t,columns:o,row:n,column:r},a={},c=B,h=T;i.hasValueByKey(n.key,r.key)&&(u={...u,newValue:i.getValueByKey(n.key,r.key)});for(const e of l)if((!("condition"in e)||e.condition(u))&&("value"in e&&(u={...u,value:e.value(u)}),"style"in e&&(a={...a,...N(e.style(u),e.index)}),"text"in e&&(u={...u,text:e.text(u)}),"font"in e&&(h=e.font(u)),"padding"in e&&(c={...c,...e.padding(u)}),"edit"in e&&(u={...u,edit:K(e,u)}),"tooltip"in e&&(d=e.tooltip(u)),"draw"in e)){const t=u;s=o=>e.draw({...t,ctx:o})}const f=function(e){return"text"in e?`${e.text}`:"newValue"in e?`${e.newValue}`:void 0!==e.value?`${e.value}`:""}(u),p={style:a,visible:!0,text:f,padding:c,font:h};return"value"in u&&(p.value=u.value),"edit"in u&&void 0!==u.edit&&(p.edit=u.edit),void 0!==d&&(p.tooltip=d),void 0!==s&&(p.draw=s),p}}function P(e){return new H(e)}class W{constructor(e,t,o,n,r){this.formattingRules=e,this.data=t,this.rows=o,this.columns=n,this.edition=r}resolve(e,t){return this.formattingRules.resolve(this.data,this.rows,this.columns,e,t,this.edition)}}function $(e,t,o,n,r){return new W(e,t,o,n,r)}function q(e,t,n){const r=new Map;for(const i of e){const e=o(i[t]),l=o(i[n]);r.has(e)||r.set(e,new Map),r.get(e).set(l,i.expression)}return r}function V(e,t,o,n,r,i,l){if(0===e.length)return r;const s=q(e,"columnId","rowId"),d=i.filter((e=>"FILTER"!==e.type&&s.has(e.key)));return 0===d.length?r:r.filter((e=>{for(const u of d){const d=o.resolve(n,r,i,e,u,l),a=s.get(u.key);if(!t.resolve(n,r,i,e,u,d.value,d.text,a))return!1}return!0}))}function Y(e,t,o,n,r,i,l){if(0===e.length)return i;const s=q(e,"rowId","columnId"),d=r.filter((e=>"FILTER"!==e.type&&s.has(e.key)));return 0===d.length?i:i.filter((e=>{for(const u of d){const d=o.resolve(n,r,i,u,e,l),a=s.get(u.key);if(!t.resolve(n,r,i,u,e,d.value,d.text,a))return!1}return!0}))}function G(e,t,o,n){return{top:e,bottom:t,left:o,right:n}}function j(e,t){return{width:e.length?e.at(-1).rightWithBorder:0,height:t.length?t.at(-1).bottomWithBorder:0}}class U{constructor(){this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d"),this.fontMetrics=new Map}measureWidth(e,t){if(!e)return 0;const o=this.context;return o.font=t||T,o.measureText(e).width}measureHeight(e,t){let o=1;for(const t of e)"\n"===t&&o++;return o*this.getFontMetrics(t).height}getFontMetrics(e){const t=e;if(this.fontMetrics.has(t))return this.fontMetrics.get(t);const o=this.context;o.font=e||T;const n=o.measureText("X"),r=(n.actualBoundingBoxDescent-n.actualBoundingBoxAscent)/2,i={topOffset:r+n.fontBoundingBoxAscent,middle:-r,bottomOffset:n.fontBoundingBoxDescent-r,height:n.fontBoundingBoxAscent+n.fontBoundingBoxDescent};return this.fontMetrics.set(t,i),i}}function _(){return new U}function X(e,t){return t.top>=e.top&&t.left>=e.left&&t.top+t.height<=e.top+e.height&&t.left+t.width<=e.left+e.width}function J(e,t){const o={top:Math.max(e.top,t.top),left:Math.max(e.left,t.left),width:Math.min(e.left+e.width,t.left+t.width)-Math.max(e.left,t.left),height:Math.min(e.top+e.height,t.top+t.height)-Math.max(e.top,t.top)};return o.width>=0&&o.height>=0?o:{top:e.top,left:e.left,width:0,height:0}}function Q(e,t){return{top:e.top-t,left:e.left-t,width:e.width+2*t,height:e.height+2*t}}function Z(e){return e.width*e.height}function ee(e,t){return{top:e.top,left:e.left,width:Math.max(0,e.width-t.left-t.right),height:Math.max(0,e.height-t.top-t.bottom)}}const te=200,oe=400,ne={left:0,top:0,width:0,height:0};function re(e,t,o,n){const r=t.x,i=t.y,l=e.scrollLeft,s=e.scrollTop,d=e.clientWidth,u=e.clientHeight;return{x:r<=o.left?r:r>=d?r+l:r>=d-o.right?n.width-d+r:r+l,y:i<=o.top?i:i>=u?i+s:i>=u-o.bottom?n.height-u+i:i+s}}function ie(e){return e.reduce(((e,t)=>e.set(t.key,t)),new Map)}function le(e,t,n,r,i,l,s,d){if(!e)return[];if(!t)return[];if(!r)return[];if(!n)return[];const u=o(n.columnId),a=o(n.rowId),c=o(r.columnId),h=o(r.rowId);if(!s.has(u))return[];if(!d.has(a))return[];if(!s.has(c))return[];if(!d.has(h))return[];const f=Math.min(s.get(u).index,s.get(c).index),p=Math.max(s.get(u).index,s.get(c).index),m=Math.min(d.get(a).index,d.get(h).index),g=Math.max(d.get(a).index,d.get(h).index);return i.slice(f,p+1).flatMap((e=>l.slice(m,g+1).map((t=>({rowId:t.id,columnId:e.id})))))}function se(e,t){const o=function(e){return"BEGIN"===e.pinned?"top":"END"===e.pinned?"bottom":"middle"}(t),n=function(e){return"BEGIN"===e.pinned?"left":"END"===e.pinned?"right":"center"}(e);return`${o}-${n}`}function de(e,t,n,r){if(!e)return null;const i=o(e.columnId),l=o(e.rowId);if(!t.has(i))return null;if(!n.has(l))return null;const s=t.get(i),d=n.get(l),u={width:s.width,height:d.height,section:se(s,d)};switch(d.pinned){case"BEGIN":u.top=d.top;break;case"END":u.bottom=r.top.height+r.middle.height+r.bottom.height-d.top-d.height;break;default:u.marginTop=d.top-r.top.height}switch(s.pinned){case"BEGIN":u.left=s.left;break;case"END":u.right=r.left.width+r.center.width+r.right.width-s.left-s.width;break;default:u.marginLeft=s.left-r.left.width}return u}function ue(e,t,o,n,r){return 0===e.length?null:de(t,o,n,r)}function ae(e,t){return t.every((t=>t.edit.validate({string:e})))}function ce(e){return Array.isArray(e)?e.map(((e,t)=>t)):Object.keys(e)}function he(e){return ce(e)}function fe(e){const t=new Set;if(Array.isArray(e))for(const o of e)for(const e of ce(o))t.add(e);else for(const o in e)for(const n of ce(e[o]))t.add(n);return Array.from(t)}function pe(e,t){if(!e.some((e=>"DATA-BLOCK"===e.type)))return e;const o=[];for(const n of e)if("DATA-BLOCK"===n.type){const e="selector"in n?n.selector(t):fe(t);for(const t of e)o.push({...n,id:t,type:"DATA"})}else o.push(n);return o}function me(e,t){if(!e.some((e=>"DATA-BLOCK"===e.type)))return e;const o=[];for(const n of e)if("DATA-BLOCK"===n.type){const e="selector"in n?n.selector(t):he(t);for(const t of e)o.push({...n,id:t,type:"DATA"})}else o.push(n);return o}const ge=({text:e,expression:t})=>e.includes(t);class ye{constructor(e){this.rulesLookup=new S;for(const t of e){const e={by:o("by"in t?t.by:"FILTER"),condition:t.condition||ge};this.rulesLookup.addRule(t.column,t.row,e)}}resolve(e,t,o,n,r,i,l,s){const d=this.rulesLookup.getRules(r,n);if(0===d.length)return"DATA"!==n.type||"DATA"!==r.type||!s.has('"FILTER"')||ge({text:l,expression:s.get('"FILTER"')});let u={data:e,rows:t,columns:o,row:n,column:r,value:i,text:l};for(const e of d){if(!s.has(e.by))continue;const t={...u,expression:s.get(e.by)};if(!e.condition(t))return!1}return!0}}function we(e){return new ye(e)}function xe(e){return h(e,["value","text"])}function be(e){return h(e,["value","text","font","padding"])}function ve(e,t,o,n,r,i){if(e.every((e=>"number"==typeof e.width)))return e;const l=e=>{const i=e.width;if("number"==typeof i)return i;if(r.has(e.key)){const t=r.get(e.key);if("fit-once"===i&&!t.dataOnly)return t.width;if("fit-data-once"===i&&t.dataOnly)return t.width}let l=0;for(const r of t){if("DATA"!==r.type&&"fit-data-once"===i)continue;if("DATA"!==r.type&&"fit-data"===i)continue;const t=n.resolve(r,e),s=t.text,d=t.font,u=t.padding.left+t.padding.right,a=o.measureWidth(s,d)+u;l=Math.max(l,a)}return r.set(e.key,{width:l,dataOnly:"fit-data-once"===i}),l};for(const e of r.keys())i.has(e)||r.delete(e);return e.map((e=>({...e,width:l(e)})))}function Re(e,t,o,n,r,i){if(t.every((e=>"number"==typeof e.height)))return t;const l=t=>{const i=t.height;if("number"==typeof i)return i;if(r.has(t.key)){const e=r.get(t.key);if("fit-once"===i&&!e.dataOnly)return e.height;if("fit-data-once"===i&&e.dataOnly)return e.height}let l=0;for(const r of e){if("DATA"!==r.type&&"fit-data-once"===i)continue;if("DATA"!==r.type&&"fit-data"===i)continue;const e=n.resolve(t,r),s=e.text,d=e.font,u=e.padding.top+e.padding.bottom,a=o.measureHeight(s,d)+u;l=Math.max(l,a)}return r.set(t.key,{height:l,dataOnly:"fit-data-once"===i}),l};for(const e of r.keys())i.has(e)||r.delete(e);return t.map((e=>({...e,height:l(e)})))}function Ce(e){return new Set(e.map((e=>e.key)))}function Ae(e){return h(e,["value","text"])}function ke(e,t){return null!=e.value&&(null==t.value||e.value<t.value)}function Ee(e,t){return null!=e.value&&(null==t.value||e.value>t.value)}class Ie{constructor(e){this.rulesLookup=new S;for(const t of e){const e=t.comparator?(e,o)=>t.comparator(e,o):(e,t)=>ke(e,t),n=t.comparator?(e,o)=>!t.comparator(e,o):(e,t)=>Ee(e,t),r={by:o("by"in t?t.by:"HEADER"),comparatorAsc:e,comparatorDesc:n};this.rulesLookup.addRule(t.column,t.row,r)}}resolve(e,t,o){const n=this.rulesLookup.getRules(e,t);if(0===n.length)return"DATA"!==t.type||"DATA"!==e.type?null:o.has('"HEADER"')?"ASC"===o.get('"HEADER"')?ke:Ee:null;if(n.length>1)throw new Error("Multiple sorting rules for the same cell");const r=n[0];return o.has(r.by)?"ASC"===o.get(r.by)?r.comparatorAsc:r.comparatorDesc:null}}function Le(e){return"manual"===e?null:new Ie(e)}function Te(e,t,n){const r=new Map;for(const i of e){const e=o(i[t]),l=o(i[n]);r.has(e)||r.set(e,new Map),r.get(e).set(l,i.direction)}return r}function Be(e,t){e.sort(((e,t)=>{const o=e.comparator(e.cell,t.cell);return"number"==typeof o?o:o?-1:1})),t.push(...e.map((e=>e.entity))),e.length=0}function De(e,t,n,r,i,l,s){if(0===e.length)return i;if(null===t)return i;const d=Te(e,"columnId","rowId"),u=new Map(l.map((e=>[e.key,e]))),a=e.map((e=>o(e.columnId))).filter((e=>u.has(e))).map((e=>u.get(e))).reverse();if(0===a.length)return i;for(const e of a){const o=[],u=[];for(const a of i){const c=t.resolve(e,a,d.get(e.key));if(!c){Be(u,o),o.push(a);continue}const h={entity:a,comparator:c,cell:n.resolve(r,i,l,a,e,s)};0!==u.length&&u[0].comparator!==c?(Be(u,o),u.push(h)):u.push(h)}Be(u,o),i=o}return i}function Me(e,t,n,r,i,l,s){if(0===e.length)return l;if(null===t)return l;const d=Te(e,"rowId","columnId"),u=new Map(i.map((e=>[e.key,e]))),a=e.map((e=>o(e.rowId))).filter((e=>u.has(e))).map((e=>u.get(e))).reverse();if(0===a.length)return l;for(const e of a){const o=[],u=[];for(const a of l){const c=t.resolve(a,e,d.get(e.key));if(!c){Be(u,o),o.push(a);continue}const h={entity:a,comparator:c,cell:n.resolve(r,i,l,e,a,s)};0!==u.length&&u[0].comparator!==c?(Be(u,o),u.push(h)):u.push(h)}Be(u,o),l=o}return l}const Fe=5;function Se(e,t,n,r,i,l,s,d,u){if(!r)return null;if(s)return null;const a=t.get(o(r.columnId));if("HEADER"!==n.get(o(r.rowId)).type)return null;const c=re(i,l,d,u);if(!c)return null;const h=c.x;return h>=a.right-Fe&&h<=a.right+Fe?a.id:0===a.index||h<a.left-Fe||h>a.left+Fe?null:e[a.index-1].id}function ze(e,t,n,r,i,l,s,d,u){if(!r)return null;if(s)return null;const a=t.get(o(r.columnId)),c=n.get(o(r.rowId));if("HEADER"!==a.type)return null;const h=re(i,l,d,u);if(!h)return null;const f=h.y;return f>=c.bottom-Fe&&f<=c.bottom+Fe?c.id:0===c.index||f<c.top-Fe||f>c.top+Fe?null:e[c.index-1].id}function Oe(e){return e.map((e=>({columnId:"columnId"in e?e.columnId:"HEADER",rowId:"rowId"in e?e.rowId:"HEADER",direction:e.direction})))}function Ne(e){return e.map((e=>({columnId:"columnId"in e?e.columnId:"FILTER",rowId:"rowId"in e?e.rowId:"FILTER",expression:e.expression})))}function Ke(e){return e.filter((e=>"DATA"===e.type)).map((e=>e.id))}function He(e){return Ke(e)}function Pe(e){return Ke(e)}function We(e){return h(e,["value","text","tooltip"])}function $e(e,t,n,r){if(!e)return null;const i=o(e.columnId),l=o(e.rowId);if(!n.has(i))return null;if(!r.has(l))return null;const s=r.get(l),d=n.get(i);return t.resolve(s,d).tooltip}function qe(e,t,o,n,r){if(!e)return null;const i=de(t,o,n,r);return i?{top:i.top,left:i.left}:null}function Ve(e){return e.map((e=>o(e)))}function Ye(e,t){if(!t)return e;const o=new Map;for(const t of e)o.set(t.key,t);const n=[];for(const e of t)o.has(e)&&(n.push(o.get(e)),o.delete(e));for(const t of e)o.has(t.key)&&n.push(o.get(t.key));return[...n.filter((e=>"BEGIN"===e.pinned)),...n.filter((e=>!e.pinned)),...n.filter((e=>"END"===e.pinned))]}function Ge(e){const t={...e.localOptions,...e.externalOptions},o=e.memory,n=e.state,i=e.element,l=[];function s(e,t,n){const r=o[e]&&o[e].dependencies;return r&&!n.some(((e,t)=>e!==r[t]))||(o[e]={value:t(...n),dependencies:n},l.push(e)),o[e].value}function d(e,t){const n=o[e]&&o[e].value;return JSON.stringify(n)!==JSON.stringify(t)&&(o[e]={value:t},l.push(e)),o[e].value}function a(e,t,n){(o[e]&&o[e].value)!==t&&(o[e]={value:t},n(t))}const c=window.devicePixelRatio,h=t.borderWidth/c,p=t.data,w=e.input.value,b=s("sortBy",Oe,[t.sortBy]),C=s("filters",Ne,[t.filters]),A=s("textResolver",_,[]),T=s("dataFormatting",u,[t.formatting,t.dataSelector,b]),B=s("editedCellsAndFilters",y,[t.editedCells,C]),D=s("edition",x,[B]),M=s("invokedColumns",R,[t.columns,p]),F=s("invokedRows",R,[t.rows,p]),S=s("unfoldedColumns",pe,[M,p]),z=s("unfoldedRows",me,[F,p]),O=s("unfilteredColumns",k,[S,t.pinnedLeft,t.pinnedRight,t.columnWidths]),N=s("unfilteredRows",E,[z,t.pinnedTop,t.pinnedBottom,t.rowHeights]),K=s("unfilteredColumnKeys",Ce,[O]),H=s("unfilteredRowKeys",Ce,[N]),W=s("columnsOrder",Ve,[t.columnsOrder]),q=s("rowsOrder",Ve,[t.rowsOrder]),U=s("orderedColumns",Ye,[O,W]),se=s("orderedRows",Ye,[N,q]),de=s("filterFormatting",xe,[T]),ce=s("filterFormattingRules",P,[de]),he=s("filteringRules",we,[t.filtering]),fe=s("filteredColumns",Y,[C,he,ce,p,se,U,D]),ge=s("filteredRows",V,[C,he,ce,p,se,U,D]),ye=s("sortingFormatting",Ae,[T]),ke=s("sortingFormattingRules",P,[ye]),Ee=s("sortingRules",Le,[t.sorting]),Ie=s("sortedColumns",Me,[b,Ee,ke,p,ge,fe,D]),Te=s("sortedRows",De,[b,Ee,ke,p,ge,fe,D]),Be=s("measureFormatting",be,[T]),Fe=s("measureFormattingRules",P,[Be]),Ke=s("measureFormatResolver",$,[Fe,p,Te,Ie,D]),Ge=e.columnWidthCache,je=e.rowHeightCache,Ue=s("measuredColumns",ve,[Ie,Te,A,Ke,Ge,K]),_e=s("measuredRows",Re,[Ie,Te,A,Ke,je,H]),Xe=s("columns",I,[Ue,c,h]),Je=s("rows",L,[_e,c,h]),Qe=s("columnLookup",ie,[Xe]),Ze=s("rowLookup",ie,[Je]),et=t.focusedCell,tt=s("sections",g,[Xe,Je]),ot=t.selectedCells,nt=s("fixedSize",G,[tt.top.height,tt.bottom.height,tt.left.width,tt.right.width]),rt=s("totalSize",j,[Xe,Je]),it=d("hoveredCell",function(e,t,o,n,r,i){if(!t)return null;if(t.x<0||t.y<0||t.x>i.width||t.y>i.height)return null;const l=re(e,t,r,i),s=function(e,t){if(0===e.length)return-1;if(t<e[0].topWithBorder)return-1;if(t>e[e.length-1].bottomWithBorder)return-1;let o=0,n=e.length-1;for(;o<=n;){const r=Math.floor((o+n)/2);if(t<e[r].topWithBorder)n=r-1;else{if(!(t>e[r].bottomWithBorder))return r;o=r+1}}return-1}(o,l.y),d=function(e,t){if(0===e.length)return-1;if(t<e[0].leftWithBorder)return-1;if(t>e[e.length-1].rightWithBorder)return-1;let o=0,n=e.length-1;for(;o<=n;){const r=Math.floor((o+n)/2);if(t<e[r].leftWithBorder)n=r-1;else{if(!(t>e[r].rightWithBorder))return r;o=r+1}}return-1}(n,l.x);return-1===s||-1===d?null:{rowId:o[s].id,columnId:n[d].id}}(i,e.mousePosition,Je,Xe,nt,rt)),lt=e.isReordering,st=e.resizingColumn||s("resizableColumn",Se,[Xe,Qe,Ze,it,i,e.mousePosition,lt,nt,rt]),dt=e.resizingRow||s("resizableRow",ze,[Je,Qe,Ze,it,i,e.mousePosition,lt,nt,rt]),ut=s("highlightedCells",le,[e.isMouseDown,!st&&!dt&&!e.didReorder,et,it,Xe,Je,Qe,Ze]),at=s("selection",v,[ot]),ct=s("highlight",v,[ut]),ht=s("renderFormatting",m,[T,it,et,at,ct,D,b,st,dt,t.borderWidth,lt,e.reorderedColumn,e.reorderedRow]),ft=s("renderFormattingRules",P,[ht]),pt=s("renderFormatResolver",$,[ft,p,Je,Xe,D]),mt=s("inputFormatting",f,[T]),gt=s("inputFormattingRules",P,[mt]),yt=s("inputFormatResolver",$,[gt,p,Je,Xe,D]),wt=s("editableCells",r,[ot,yt,Qe,Ze]),xt=s("inputPlacement",ue,[wt,et,Qe,Ze,tt]),bt=s("isTextValid",ae,[w,wt]),vt=s("contextFormatting",We,[T]),Rt=s("contextFormattingRules",P,[vt]),Ct=s("contextFormatResolver",$,[Rt,p,Je,Xe,D]),At=s("tooltip",$e,[it,Ct,Qe,Ze]),kt=s("tooltipPlacement",qe,[At,it,Qe,Ze,tt]),Et=d("scrollRect",function(e,t,o,n){const r={width:n.getBoundingClientRect().width,height:n.getBoundingClientRect().height},i={left:n.scrollLeft,top:n.scrollTop},l=e||ne,s=ee({left:0,top:0,...t},o),d=ee({...i,...r},o),u=J(s,Q(d,te)),a=J(s,Q(d,oe));return X(s,l)&&X(l,u)?Z(l)>2*Z(a)?a:l:a}(n?.scrollRect,rt,nt,i)),It=s("activeColumns",He,[Xe]),Lt=s("activeRows",Pe,[Je]);a("activeColumnsCallback",It,t.onActiveColumnsChange),a("activeRowsCallback",Lt,t.onActiveRowsChange),a("hoveredCellCallback",it,t.onHoveredCellChange),t.onStateChange(l),e.state={options:t,devicePixelRatio:c,borderWidth:h,data:p,edition:D,filteredColumns:fe,filteredRows:ge,columns:Xe,rows:Je,sections:tt,selectedCells:ot,selection:at,highlight:ct,hoveredCell:it,focusedCell:et,renderFormatting:ht,renderFormatResolver:pt,inputFormatting:mt,inputFormatResolver:yt,fixedSize:nt,totalSize:rt,textResolver:A,scrollRect:Et,highlightedCells:ut,inputPlacement:xt,columnLookup:Qe,rowLookup:Ze,text:w,isTextValid:bt,resizableColumn:st,resizableRow:dt,tooltip:At,tooltipPlacement:kt}}function je(e){if(!e.error)try{Ge(e)}catch(t){e.error=t}}function Ue(e,t){const o=new b(t);return[...t,...e.filter((e=>!o.isIdSelected(e.rowId,e.columnId)))]}function _e(e,t){const o=new b(t);return e.filter((e=>!o.isIdSelected(e.rowId,e.columnId)))}function Xe(e){const t=e.currentTarget.getBoundingClientRect();return{x:e.clientX-t.left,y:e.clientY-t.top}}function Je(e,t){return e.map((e=>({...e,columnId:"columnId"in e?e.columnId:t,rowId:"rowId"in e?e.rowId:t})))}function Qe(e,t,n){const r=o(t),i=o(n);if(r===i)return null;const l=e.findIndex((e=>e.key===r)),s=e.findIndex((e=>e.key===i));return-1===l||-1===s||l===s?null:[l,s]}function Ze(e){if("spread-grid-context"in e)return;const t={"top-left":document.createElement("canvas"),"top-center":document.createElement("canvas"),"top-right":document.createElement("canvas"),"middle-left":document.createElement("canvas"),"middle-center":document.createElement("canvas"),"middle-right":document.createElement("canvas"),"bottom-left":document.createElement("canvas"),"bottom-center":document.createElement("canvas"),"bottom-right":document.createElement("canvas")},i=document.createElement("input"),l=document.createElement("div");e.setAttribute("tabindex","0"),e.setAttribute("style","max-width: 100vw; max-height: 100vh; overflow: auto; display: grid; position: relative; grid-template-columns: fit-content(0) fit-content(0) fit-content(0); grid-template-rows: fit-content(0) fit-content(0) fit-content(0); outline: none; user-select: none;"),e.classList.add("spread-grid"),t["top-left"].setAttribute("style","position: sticky; left: 0; top: 0; z-index: 2; grid-row: 1; grid-column: 1;"),t["top-center"].setAttribute("style","position: sticky; top: 0; z-index: 1; grid-row: 1; grid-column: 2;"),t["top-right"].setAttribute("style","position: sticky; right: 0; top: 0; z-index: 2; grid-row: 1; grid-column: 3;"),t["middle-left"].setAttribute("style","position: sticky; left: 0; z-index: 1; grid-row: 2; grid-column: 1;"),t["middle-center"].setAttribute("style","grid-row: 2; grid-column: 2; z-index: 0;"),t["middle-right"].setAttribute("style","position: sticky; right: 0; z-index: 1; grid-row: 2; grid-column: 3;"),t["bottom-left"].setAttribute("style","position: sticky; left: 0; bottom: 0; z-index: 2; grid-row: 3; grid-column: 1;"),t["bottom-center"].setAttribute("style","position: sticky; bottom: 0; z-index: 1; grid-row: 3; grid-column: 2;"),t["bottom-right"].setAttribute("style","position: sticky; right: 0; bottom: 0; z-index: 2; grid-row: 3; grid-column: 3;"),i.setAttribute("style","position: sticky; z-index: 3; outline: none; border: none; box-shadow: none; padding: 0 5px; font-size: 12px; font-family: Calibri; background-color: white; box-sizing: border-box; opacity: 0; pointer-events: none;"),l.setAttribute("style","pointer-events: none; background-color: white; color: black; border: 1px solid black; padding: 5px;"),l.setAttribute("popover","");const d={externalOptions:{},state:null,memory:{},element:e,canvases:t,input:i,tooltip:l,renderRequested:!1,mousePosition:null,isMouseDown:!1,columnWidthCache:new Map,rowHeightCache:new Map,requestNewRender:()=>{d.renderRequested||(d.renderRequested=!0,requestAnimationFrame((()=>{d.renderRequested=!1,je(d),s(d)})))},addEventListener:(e,t,o)=>{e.addEventListener(t,(e=>{try{o(e)}catch(e){e.message=`[${t} event]: ${e.message}`,d.error=e,d.requestNewRender()}}))}};d.localOptions={data:[],columns:[{type:"DATA-BLOCK"}],rows:[{type:"HEADER"},{type:"DATA-BLOCK"}],formatting:[],filtering:[],sorting:[],dataSelector:({data:e,row:t,column:o})=>e?.[t.id]?.[o.id],pinnedTop:0,pinnedBottom:0,pinnedLeft:0,pinnedRight:0,borderWidth:1,focusedCell:null,onFocusedCellChange:e=>{d.localOptions.focusedCell=e,d.requestNewRender()},selectedCells:[],onSelectedCellsChange:e=>{d.localOptions.selectedCells=e,d.requestNewRender()},highlightedCells:[],editedCells:[],onEditedCellsChange:e=>{d.localOptions.editedCells=e,d.requestNewRender()},filters:[],onFiltersChange:e=>{d.localOptions.filters=e,d.requestNewRender()},sortBy:[],onSortByChange:e=>{d.localOptions.sortBy=e,d.requestNewRender()},onCellClick:()=>{},onCustomCellClick:()=>{},columnWidths:[],onColumnWidthsChange:e=>{d.localOptions.columnWidths=e,d.requestNewRender()},rowHeights:[],onRowHeightsChange:e=>{d.localOptions.rowHeights=e,d.requestNewRender()},columnsOrder:[],onColumnsOrderChange:e=>{d.localOptions.columnsOrder=e,d.requestNewRender()},rowsOrder:[],onRowsOrderChange:e=>{d.localOptions.rowsOrder=e,d.requestNewRender()},onActiveColumnsChange:()=>{},onActiveRowsChange:()=>{},onHoveredCellChange:()=>{},onStateChange:()=>{}},e["spread-grid-context"]=d;const u=e=>{i.value=e,i.dispatchEvent(new Event("input"))},a=e=>{const t=d.state.options.selectedCells,o=d.state.inputFormatResolver,n=d.state.columnLookup,i=d.state.rowLookup,l=d.state.text,s=d.state.isTextValid,a=d.state.options.onEditedCellsChange,c=d.state.options.onFiltersChange,h=r(t,o,n,i);if(""===l)return;if(!s)return;if(e&&!h.every((e=>e.edit.autoCommit)))return;const f=h.filter((e=>"DATA"===e.type)),p=h.filter((e=>"FILTER"===e.type));var m;m=f.map((e=>({...e.cell,value:e.edit.parse({string:l})}))),a(Ue(d.state.options.editedCells,m)),(e=>{c(Ue(Je(d.state.options.filters,"FILTER"),e))})(p.map((e=>({...e.cell,expression:e.edit.parse({string:l})})))),e||u("")},c=e=>{const t=d.state.options.selectedCells,o=d.state.options.onEditedCellsChange,n=d.state.options.onFiltersChange,i=r(t,d.state.inputFormatResolver,d.state.columnLookup,d.state.rowLookup);var l;e&&!i.every((e=>e.edit.autoCommit))||(l=t,o(_e(d.state.options.editedCells,l)),(e=>{n(_e(Je(d.state.options.filters,"FILTER"),e))})(t))};d.addEventListener(e,"scroll",(e=>{d.requestNewRender()})),d.addEventListener(e,"mouseenter",(e=>{d.mousePosition=Xe(e),d.requestNewRender()})),d.addEventListener(e,"mousemove",(t=>{if(d.mousePosition=Xe(t),d.resizingColumn){const t=d.state.columnLookup.get(o(d.resizingColumn)),n=t.width,r=t.right,i=re(e,d.mousePosition,d.state.fixedSize,d.state.totalSize),l=Math.max(10,i.x-r+n),s=d.state.options.columnWidths.filter((e=>o(e.columnId)!==t.key)).concat([{columnId:t.id,width:l}]);d.state.options.onColumnWidthsChange(s)}if(d.resizingRow){const t=d.state.rowLookup.get(o(d.resizingRow)),n=t.height,r=t.bottom,i=re(e,d.mousePosition,d.state.fixedSize,d.state.totalSize),l=Math.max(10,i.y-r+n),s=d.state.options.rowHeights.filter((e=>o(e.rowId)!==t.key)).concat([{rowId:t.id,height:l}]);d.state.options.onRowHeightsChange(s)}if(d.reorderedColumn){const t=d.state.columns,o=d.state.hoveredCell,n=re(e,d.mousePosition,d.state.fixedSize,d.state.totalSize),r=function(e,t,o,n){if(!o)return null;const r=Qe(e,t,o.columnId);if(!r)return null;const[i,l]=r,s=l<=i?n.x<e[l].leftWithBorder+e[i].width?l:l+1:n.x>e[l].rightWithBorder-e[i].width?l:l-1;if(s===i)return null;const d=e.map((e=>e.id));return d.splice(i,1),d.splice(s,0,t),d}(t,d.reorderedColumn,o,n);r&&(d.didReorder=!0,d.isReordering=!0,d.state.options.onColumnsOrderChange(r))}if(d.reorderedRow){const t=d.state.rows,o=d.state.hoveredCell,n=re(e,d.mousePosition,d.state.fixedSize,d.state.totalSize),r=function(e,t,o,n){if(!o)return null;const r=Qe(e,t,o.rowId);if(!r)return null;const[i,l]=r,s=l<=i?n.y<e[l].topWithBorder+e[i].height?l:l+1:n.y>e[l].bottomWithBorder-e[i].height?l:l-1;if(s===i)return null;const d=e.map((e=>e.id));return d.splice(i,1),d.splice(s,0,t),d}(t,d.reorderedRow,o,n);r&&(d.didReorder=!0,d.isReordering=!0,d.state.options.onRowsOrderChange(r))}d.requestNewRender()})),d.addEventListener(e,"mouseleave",(()=>{d.mousePosition=null,d.requestNewRender()})),d.addEventListener(e,"mousedown",(e=>{je(d),u("");const t=d.state.hoveredCell;if(d.isMouseDown=!0,d.didReorder=!1,d.mouseDownPosition=d.mousePosition,d.mouseDownCell=t,d.state.resizableColumn&&(d.resizingColumn=d.state.resizableColumn),d.state.resizableRow&&(d.resizingRow=d.state.resizableRow),!d.resizingColumn&&t){const e=d.state.rowLookup.get(o(t.rowId));d.reorderedColumn="HEADER"===e.type?t.columnId:null}if(!d.resizingRow&&t){const e=d.state.columnLookup.get(o(t.columnId));d.reorderedRow="HEADER"===e.type?t.rowId:null}d.resizingColumn||d.resizingRow||d.state.options.onFocusedCellChange(t),e.ctrlKey||d.state.options.onSelectedCellsChange([]),d.requestNewRender()})),d.addEventListener(e,"mouseup",(e=>{je(d),d.isMouseDown=!1,d.isReordering=!1,d.resizingColumn=null,d.resizingRow=null,d.reorderedColumn=null,d.reorderedRow=null,d.state.options.onSelectedCellsChange(Ue(d.state.options.selectedCells,d.state.highlightedCells)),d.requestNewRender()})),d.addEventListener(e,"pointerdown",(e=>{d.element.setPointerCapture(e.pointerId)})),d.addEventListener(e,"pointerup",(e=>{d.element.releasePointerCapture(e.pointerId)})),d.addEventListener(e,"click",(e=>{je(d);const t=d.state.hoveredCell,r=d.mouseDownCell;if(d.state.resizableColumn||d.state.resizableRow)return;if(d.didReorder)return;if(null===t)return;if(o(t.columnId)!==o(r.columnId))return;if(o(t.rowId)!==o(r.rowId))return;const i=d.state.columnLookup.get(o(t.columnId)),l=d.state.rowLookup.get(o(t.rowId)),s=d.state.options.sortBy,u=d.state.inputFormatResolver.resolve(l,i),a={ctrlKey:e.ctrlKey,shiftKey:e.shiftKey,button:e.button,buttons:e.buttons,detail:e.detail};if(u.edit?.toggle){const e=function(e,t,o,n){const r=n.hasValueByKey(o.key,t.key)?n.getValueByKey(o.key,t.key):e.value,i=e.edit.toggle;return"function"==typeof i?i({value:r}):i[(i.indexOf(r)+1)%i.length]}(u,i,l,d.state.edition),o=n(i,l);"DATA"===o&&d.state.options.onEditedCellsChange(Ue(d.state.options.editedCells,[{...t,value:e}])),"FILTER"===o&&d.state.options.onFiltersChange(Ue(d.state.options.filters,[{...t,expression:e}]))}else if("DATA"===i.type&&"DATA"===l.type)d.state.options.onCellClick({...d.state.hoveredCell,...a});else if("CUSTOM"===i.type||"CUSTOM"===l.type)d.state.options.onCustomCellClick({...d.state.hoveredCell,...a});else if("HEADER"===i.type||"HEADER"===l.type){const t=function(e,t,n,r){function i(e){const r="columnId"in e?e.columnId:"HEADER",i="rowId"in e?e.rowId:"HEADER";return t.key===o(r)&&n.key===o(i)}const l=["ASC","DESC",void 0],s=e.find(i),d=l.indexOf(s?.direction),u=l[(d+1)%l.length],a=e.indexOf(s)===e.length-1;return[...!r||!a&&s?e.filter((e=>!function(e){const r="columnId"in e?e.columnId:"HEADER",i="rowId"in e?e.rowId:"HEADER";return"HEADER"===t.type&&t.key===o(r)||"HEADER"===n.type&&n.key===o(i)}(e))):e.filter((e=>!i(e))),...u?[{columnId:t.id,rowId:n.id,direction:u}]:[]]}(s,i,l,e.ctrlKey);d.state.options.onSortByChange(t),d.state.options.onSelectedCellsChange([])}})),d.addEventListener(e,"dblclick",(e=>{if(je(d),d.state.resizableColumn){const e=o(d.state.resizableColumn),t=d.state.options.columnWidths.filter((t=>o(t.columnId)!==e));d.state.options.onColumnWidthsChange(t),d.columnWidthCache.delete(e)}if(d.state.resizableRow){const e=o(d.state.resizableRow),t=d.state.options.rowHeights.filter((t=>o(t.rowId)!==e));d.state.options.onRowHeightsChange(t),d.rowHeightCache.delete(e)}const t=d.state.focusedCell;if(null===t)return;const n=o(t.columnId),r=o(t.rowId),l=d.state.columnLookup,s=d.state.rowLookup,a=d.state.inputFormatResolver;if(!l.has(n))return;if(!s.has(r))return;const c=l.get(n),h=s.get(r),f=a.resolve(h,c),p=f.text;f.edit&&(f.edit.toggle||(u(p),i?.select()))})),d.addEventListener(e,"focus",(()=>{i.parentElement&&i.focus({preventScroll:!0})})),d.addEventListener(e,"keydown",(e=>{je(d);const t=d.state.focusedCell,n=d.state.columnLookup,r=d.state.rowLookup,i=d.state.options.selectedCells,l=d.state.options.onSelectedCellsChange,s=d.state.options.onFocusedCellChange,h=d.state.options.editedCells,f=d.state.options.onEditedCellsChange,p=d.state.columns,m=d.state.rows,g=d.state.text,y=d.state.inputFormatResolver,w=(e,t)=>{s(e),t.shiftKey?l(Ue(i,[e])):l([e])},x=(e,r)=>{if(!t)return;const i=o(t.columnId);if(!n.has(i))return;const l=n.get(i).index,s=Math.max(0,Math.min(p.length-1,l+e));if(s===l)return;const d={rowId:t.rowId,columnId:p[s].id};w(d,r)},v=(e,n)=>{if(!t)return;const i=o(t.rowId);if(!r.has(i))return;const l=r.get(i).index,s=Math.max(0,Math.min(m.length-1,l+e));if(s===l)return;const d={rowId:m[s].id,columnId:t.columnId};w(d,n)},R=()=>{e.preventDefault(),e.stopPropagation()};switch(e.key){case"Escape":""!==g?u(""):i.length>1?l([t]):h.length>0?f([]):(s(null),l([]));break;case"Enter":a();break;case"ArrowUp":R(),v(e.ctrlKey?-m.length:-1,e);break;case"ArrowDown":R(),v(e.ctrlKey?m.length:1,e);break;case"ArrowLeft":R(),x(e.ctrlKey?-p.length:-1,e);break;case"ArrowRight":R(),x(e.ctrlKey?p.length:1,e);break;case"Delete":case"Backspace":c();break;case"c":(e=>{if(!e.ctrlKey)return;const t=function(e,t,n,r){const i=new Map(t.map((e=>[e.key,e]))),l=new Map(n.map((e=>[e.key,e]))),s=e.map((e=>({columnKey:o(e.columnId),rowKey:o(e.rowId)}))).filter((e=>i.has(e.columnKey)&&l.has(e.rowKey))),d=new Set(s.map((e=>e.columnKey))),u=new Set(s.map((e=>e.rowKey)));if(0===s.length)return"";const a=new b(e),c=Math.min(...s.map((e=>i.get(e.columnKey).index))),h=Math.max(...s.map((e=>i.get(e.columnKey).index))),f=Math.min(...s.map((e=>l.get(e.rowKey).index))),p=Math.max(...s.map((e=>l.get(e.rowKey).index))),m=[];for(let e=f;e<=p;e++){const o=n[e],i=o.key;if(u.has(i)){for(let e=c;e<=h;e++){const n=t[e],l=n.key;if(d.has(l)){if(a.isKeySelected(i,l)){const e=r.resolve(o,n).text;m.push(e)}e<h&&m.push("\t")}}e<p&&m.push("\n")}}return m.join("")}(i,p,m,y);if(navigator.clipboard)navigator.clipboard.writeText(t);else{const e=document.createElement("textarea");e.value=t,document.body.appendChild(e),e.select(),document.execCommand("copy"),document.body.removeChild(e)}})(e)}})),new ResizeObserver((()=>{d.requestNewRender()})).observe(e),d.addEventListener(i,"input",(e=>{je(d),e.target.value?(a(!0),i.style.opacity="1",i.style.pointerEvents="auto"):(e.isTrusted&&c(!0),i.style.opacity="0",i.style.pointerEvents="none")})),d.addEventListener(i,"click",(e=>{e.stopPropagation()})),d.addEventListener(i,"dblclick",(e=>{e.stopPropagation()})),d.addEventListener(i,"mousedown",(e=>{e.stopPropagation()})),d.addEventListener(i,"keydown",(e=>{switch(e.key){case"Enter":case"Escape":break;case"Delete":case"Backspace":case"ArrowUp":case"ArrowDown":case"ArrowLeft":case"ArrowRight":""!==i.value&&(e.stopPropagation(),d.requestNewRender());break;default:e.stopPropagation(),d.requestNewRender()}}))}function et(e,t){Ze(e);const o=e["spread-grid-context"];o.externalOptions=t,null===o.state?(je(o),s(o)):o.requestNewRender()}return t.default})()));
1
+ !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.SpreadGrid=t():e.SpreadGrid=t()}(self,(()=>(()=>{"use strict";var e={d:(t,o)=>{for(var n in o)e.o(o,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:o[n]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t)},t={};function o(e){return null===e?"null":Array.isArray(e)?`[${e.map(o).join(",")}]`:"object"==typeof e?(t=e,`{${Object.keys(t).sort().map((e=>`${e}:${o(t[e])}`)).join(",")}}`):JSON.stringify(e);var t}function n(e,t){const o="FILTER"===e.type,n="FILTER"===t.type;return o&&!n||!o&&n?"FILTER":"DATA"}function r(e,t,r,i){return e.map((e=>{const s=o(e.columnId),l=o(e.rowId);if(!r.has(s))return null;if(!i.has(l))return null;const u=r.get(s),d=i.get(l);return{edit:t.resolve(d,u).edit,cell:e,type:n(u,d)}})).filter((e=>e?.edit))}function i(e,t){return Math.round(e*t)/t}function s(e,t,o){const n=e.state,r=e.canvases[`${t}-${o}`],s=n.sections[t],l=n.sections[o],u=l.columns,d=s.rows,c=n.devicePixelRatio;if(0===d.length||0===u.length)return void(r.parentElement&&r.parentElement.removeChild(r));r.parentElement||e.element.appendChild(r);const a=r.getContext("2d",{alpha:!1}),h=n.scrollRect,f=n.textResolver,p=n.renderFormatResolver,m=n.borderWidth,g=s.showTopBorder,y=s.showBottomBorder,w=l.showLeftBorder,x=l.showRightBorder,b=m/2,R=d.length-1+(g?1:0)+(y?1:0),C=u.length-1+(w?1:0)+(x?1:0),v=d.map((e=>e.height)),A=u.map((e=>e.width)),k=A.reduce(((e,t)=>e+t),0)+C*m,E=v.reduce(((e,t)=>e+t),0)+R*m,I="center"===o?h.left:0,T="middle"===t?h.top:0,B="center"===o?h.width:l.width,D="middle"===t?h.height:s.height,L=A.reduce(((e,t,o)=>{const n=e[o]+t+m;return e.push(n),e}),[w?m:0]),M=v.reduce(((e,t,o)=>{const n=e[o]+t+m;return e.push(n),e}),[g?m:0]),F=L.slice(0,-1),S=M.slice(0,-1),z=Math.max(F.findLastIndex((e=>e<=I)),0),N=F.findLastIndex((e=>e<=I+B)),O=Math.max(S.findLastIndex((e=>e<=T)),0),H=S.findLastIndex((e=>e<=T+D)),K=Math.max(z,w?0:1),W=N+(x?1:0),P=Math.max(O,g?0:1),$=H+(y?1:0),q=Array.from({length:H-O+1},((e,t)=>{const o=d[t+O];return Array.from({length:N-z+1},((e,t)=>{const n=u[t+z];return p.resolve(o,n)}))})),V=(e,t)=>q[e-O][t-z];r.width=Math.round(B*c),r.height=Math.round(D*c),r.style.width=`${B}px`,r.style.height=`${D}px`,r.style.marginLeft=`${I}px`,r.style.marginTop=`${T}px`,r.style.marginRight=k-B-I+"px",r.style.marginBottom=E-D-T+"px",a.fillStyle="#E9E9E9",a.fillRect(0,0,r.width,r.height);const Y=(e,t)=>{a.setTransform(c,0,0,c,(e-I)*c,(t-T)*c)},G=(e,t,o,n)=>{a.beginPath(),a.rect(e,t,o,n),a.clip()};for(let e=z;e<=N;e++)for(let t=O;t<=H;t++){const o=V(t,e),n=o.style,r=M[t],s=L[e],l=A[e],u=v[t],d=o.text,h=n.textBaseline||"middle",p=o.padding;if(Y(s,r),a.fillStyle=n.background||"white",a.fillRect(0,0,l,u),"draw"in o&&o.draw(a),n.highlight&&(a.fillStyle=n.highlight,a.fillRect(0,0,l,u)),n.corner&&(a.fillStyle=n.corner,a.beginPath(),a.moveTo(l-7,u),a.lineTo(l,u),a.lineTo(l,u-7),a.fill()),d){a.fillStyle=n.foreground||"black",a.font=o.font;const e=f.getFontMetrics(o.font),t="center"==n.textAlign&&f.measureWidth(d,o.font)>l-p.left-p.right?"left":n.textAlign||"left";a.textAlign=t;const r=i("left"===t?p.left:"center"===t?l/2:"right"===t?l-p.right:0,c),s=i("top"===h?e.middle+e.topOffset+p.top:"middle"===h?u/2+e.middle:"bottom"===h?u+e.middle-e.bottomOffset-p.bottom:0,c);a.save(),G(0,2*m,l,u-4*m),a.fillText(d,r,s),a.restore()}}Y(0,0);const j=(e,t,o,n,r)=>{if(!r)return;if(0===r.width)return;const i=r.width/c,s=t===n,l=e-(s?i/2:0),u=t-(s?0:i/2),d=o+(s?i/2:0),h=n+(s?0:i/2);a.strokeStyle=r.color||"black",a.lineWidth=i,r.dash?(a.setLineDash(r.dash.map((e=>e/c))),a.lineDashOffset=s?l:u):a.setLineDash([]),a.beginPath(),a.moveTo(l,u),a.lineTo(d,h),a.stroke()},U=(e,t)=>e?t?e.index>t.index?e:t:e:t;for(let e=P;e<=$;e++){const t=e-1,o=e;for(let e=z;e<=N;e++){const n=U(t>=O?V(t,e).style.borderBottom:null,o<=H?V(o,e).style.borderTop:null);j(L[e]-b,M[o]-b,L[e+1]-b,M[o]-b,n)}}for(let e=K;e<=W;e++){const t=e-1,o=e;for(let e=O;e<=H;e++){const n=U(t>=z?V(e,t).style.borderRight:null,o<=N?V(e,o).style.borderLeft:null);j(L[o]-b,M[e]-b,L[o]-b,M[e+1]-b,n)}}}function l(e){if(!e.error)try{!function(e){s(e,"top","left"),s(e,"top","center"),s(e,"top","right"),s(e,"middle","left"),s(e,"middle","center"),s(e,"middle","right"),s(e,"bottom","left"),s(e,"bottom","center"),s(e,"bottom","right"),function(e){const t=e.element,o=e.input,n=e.state,r=n.inputPlacement;if(!r){if(o.parentElement){const e=document.activeElement===o;o.parentElement.removeChild(o),e&&t.focus({preventScroll:!0})}return}const i=e.canvases[r.section];if(o.style.left="left"in r?`${r.left}px`:"0",o.style.top="top"in r?`${r.top}px`:"0",o.style.right="right"in r?`${r.right}px`:"0",o.style.bottom="bottom"in r?`${r.bottom}px`:"0",o.style.marginLeft="marginLeft"in r?`${r.marginLeft}px`:"0",o.style.marginTop="marginTop"in r?`${r.marginTop}px`:"0",o.style.width=`${r.width}px`,o.style.height=`${r.height}px`,o.style.gridArea=i.style.gridArea,o.style.zIndex=i.style.zIndex,o.style.backgroundColor=n.isTextValid?"white":"#eb3434",!o.parentElement){const e=document.activeElement===t;t.appendChild(o),e&&o.focus({preventScroll:!0})}}(e),function(e){const t=e.element,o=e.state;e.isReordering?t.style.cursor="move":o.resizableColumn&&o.resizableRow?t.style.cursor="nwse-resize":o.resizableColumn?t.style.cursor="col-resize":o.resizableRow?t.style.cursor="row-resize":t.style.cursor="default"}(e),function(e){const t=e.element,o=e.tooltip,n=e.state.tooltip,r=e.state.tooltipPlacement;r?(o.innerHTML!==n&&(o.innerHTML=n),o.style.left=`calc(anchor(left) + ${r.left}px)`,o.style.top=`calc(anchor(top) + ${r.top}px)`,o.parentElement||(t.appendChild(o),o.showPopover({source:t}))):o.parentElement&&o.parentElement.removeChild(o)}(e)}(e)}catch(t){e.error=t}e.error&&function(e){if(e.errorRendered)return;e.errorRendered=!0;const t=e.element,o=e.error;t.style.backgroundColor="#9f0000",t.style.color="white",t.style.padding="20px",t.style.display="flex",t.style.flexDirection="column",t.style.userSelect="text",t.innerHTML=`\n <div style="font-size: 16px;">\n An error occurred while rendering the grid, please contact the support.\n </div>\n <div style="font-size: 20px; font-weight: bold; padding: 20px 0;">\n ${o.message}\n </div>\n <div style="font-size: 16px; white-space: pre-wrap;">${o.stack}</div>\n `}(e)}e.d(t,{default:()=>tt});const u={value:({newValue:e})=>e||"",text:({newValue:e})=>e||"Search...",edit:{validate:()=>!0,parse:({string:e})=>e,autoCommit:!0}};function d(e,t,o){return[{column:{type:"DATA"},row:{type:"HEADER"},value:({column:e})=>void 0===e.header?e.id:e.header},{column:{type:"HEADER"},row:{type:"DATA"},value:({row:e})=>void 0===e.header?e.id:e.header},{column:{type:"HEADER"},row:{type:"SPECIAL"},value:""},{column:{type:"SPECIAL"},row:{type:"HEADER"},value:""},{column:{type:"DATA"},row:{type:"FILTER"},...u},{column:{type:"FILTER"},row:{type:"DATA"},...u},{column:{type:"DATA"},row:{type:"DATA"},value:t},...e,...o.map((({columnId:e,rowId:t,direction:n},r)=>({column:{id:e},row:{id:t},text:({value:e,text:t})=>`${o.length>1?r+1:""}${"ASC"===n?"⇣":"⇡"} ${t||e}`})))]}const c=["column","row","condition"];function a(e){return Object.keys(e).length>Object.keys(e).filter((e=>c.includes(e))).length}function h(e,t){const o=[...c,...t];return e.map((e=>function(e,t){const o={};for(const n of t)n in e&&(o[n]=e[n]);return o}(e,o))).filter(a)}function f(e){return h(e,["value","text","edit"])}function p(e,t){return t?e+"99":e+"33"}function m(e,t,n,r,i,s,l,u,d,c,a,h,f){const m=n?o(n.columnId):null,g=n?o(n.rowId):null,y=null!==d,w=null!==u||y,x=c+2,b=c+4,R=(e,t,o,n)=>{if(o<0||o>=e.length)return!1;if(n<0||n>=t.length)return!1;const i=e[o].key,s=t[n].key;return r.isKeySelected(i,s)},C=(e,t)=>e?[t]:[];return[{column:{type:"DATA"},row:{type:"FILTER"},style:({newValue:e})=>({background:"#FBFBFB",foreground:e?"black":"#cccccc",border:{width:1,color:"gray"}})},{column:{type:"FILTER"},row:{type:"DATA"},style:({newValue:e})=>({background:"#FBFBFB",foreground:e?"black":"#cccccc",border:{width:1,color:"gray"}})},{column:{type:"ANY"},row:{type:"HEADER"},style:{background:"#F5F5F5",border:{width:c,color:"gray"}}},{column:{type:"HEADER"},row:{type:"ANY"},style:{background:"#F5F5F5",border:{width:c,color:"gray"}}},{column:{type:"HEADER"},row:{type:"HEADER"},style:{background:"#E0E0E0"}},...e,...C(t&&!y,{column:{type:"ANY"},row:{id:t?.rowId},style:{highlight:"#81948133"}}),...C(t&&!w,{column:{id:t?.columnId},row:{id:t?.rowId},style:{highlight:"#81948188"}}),{column:{type:"ANY"},row:{type:"ANY"},condition:({rows:e,columns:t,row:o,column:n})=>R(e,t,o.index,n.index),style:({rows:e,columns:t,row:o,column:n,edit:r})=>({...R(e,t,o.index-1,n.index)?{}:{borderTop:{width:x,color:"#596959",index:Number.MAX_SAFE_INTEGER}},...R(e,t,o.index+1,n.index)?{}:{borderBottom:{width:x,color:"#596959",index:Number.MAX_SAFE_INTEGER}},...R(e,t,o.index,n.index-1)?{}:{borderLeft:{width:x,color:"#596959",index:Number.MAX_SAFE_INTEGER}},...R(e,t,o.index,n.index+1)?{}:{borderRight:{width:x,color:"#596959",index:Number.MAX_SAFE_INTEGER}},highlight:p(r?"#798d9c":"#819481",m!==n.key||g!==o.key)})},{column:{type:"ANY"},row:{type:"ANY"},condition:({row:e,column:t})=>i.isKeySelected(e.key,t.key),style:({row:e,column:t})=>({highlight:p("#93a8b8",m!==t.key||g!==e.key)})},...C(!!n,{column:{id:n?.columnId},row:{id:n?.rowId},style:{highlight:"#ffffffaa"}}),...l.map((({columnId:e,rowId:t,direction:o},n)=>({column:{id:e},row:{id:t},style:{highlight:"#0377fc44"}}))),{column:{type:"ANY"},row:{type:"ANY"},condition:({edit:e})=>!!e,style:{corner:"#77777720"}},{column:{type:"ANY"},row:{type:"ANY"},condition:({row:e,column:t})=>s.hasValueByKey(e.key,t.key),style:{corner:"darkgreen"}},...C(u,{column:{id:u},row:{type:"HEADER"},style:{borderRight:{width:b,color:"cornflowerblue"}}}),...C(d,{column:{type:"HEADER"},row:{id:d},style:{borderBottom:{width:b,color:"cornflowerblue"}}}),...C(a&&h,{column:{id:h},row:{type:"ANY"},style:{highlight:"#3a74e055"}}),...C(a&&f,{column:{type:"ANY"},row:{id:f},style:{highlight:"#3a74e055"}})]}function g(e,t){const o=t.filter((e=>"BEGIN"===e.pinned)).length,n=t.filter((e=>"END"===e.pinned)).length,r=t.length-o-n,i=e.filter((e=>"BEGIN"===e.pinned)).length,s=e.filter((e=>"END"===e.pinned)).length,l=e.length-i-s,u=t.slice(0,o),d=t.slice(t.length-n,t.length),c=t.slice(o,t.length-n),a=e.slice(0,i),h=e.slice(e.length-s,e.length),f=e.slice(i,e.length-s),p=o>0,m=i>0,g=!0,y=!0,w=r>0||!p,x=!0,b=!p,R=!(n>0),C=!0,v=!0,A=l>0||!m,k=!0,E=!m,I=!(s>0),T=(e,t,o)=>{if(0===e.length)return 0;const n=t?e.at(0).topWithBorder:e.at(0).top;return(o?e.at(-1).bottomWithBorder:e.at(-1).bottom)-n},B=(e,t,o)=>{if(0===e.length)return 0;const n=t?e.at(0).leftWithBorder:e.at(0).left;return(o?e.at(-1).rightWithBorder:e.at(-1).right)-n};return{top:{rows:u,showTopBorder:g,showBottomBorder:y,height:T(u,g,y)},bottom:{rows:d,showTopBorder:w,showBottomBorder:x,height:T(d,w,x)},middle:{rows:c,showTopBorder:b,showBottomBorder:R,height:T(c,b,R)},left:{columns:a,showLeftBorder:C,showRightBorder:v,width:B(a,C,v)},right:{columns:h,showLeftBorder:A,showRightBorder:k,width:B(h,A,k)},center:{columns:f,showLeftBorder:E,showRightBorder:I,width:B(f,E,I)}}}function y(e,t){return[...e,...t.map((e=>({columnId:e.columnId,rowId:e.rowId,value:e.expression})))]}class w{constructor(e){this.lookup=new Map,e.forEach((e=>{const t=o(e.rowId),n=o(e.columnId);this.lookup.has(t)||this.lookup.set(t,new Map),this.lookup.get(t).set(n,e.value)}))}hasValueByKey(e,t){return this.lookup.has(e)&&this.lookup.get(e).has(t)}getValueByKey(e,t){if(this.hasValueByKey(e,t))return this.lookup.get(e).get(t)}hasValueById(e,t){return this.hasValueByKey(o(e),o(t))}getValueById(e,t){return this.getValueByKey(o(e),o(t))}}function x(e){return new w(e)}class b{constructor(e){this.lookup=new Map,e.forEach((e=>{const t=o(e.rowId),n=o(e.columnId);this.lookup.has(t)||this.lookup.set(t,new Set),this.lookup.get(t).add(n)}))}isKeySelected(e,t){return this.lookup.has(e)&&this.lookup.get(e).has(t)}isIdSelected(e,t){return this.isKeySelected(o(e),o(t))}}function R(e){return new b(e)}function C(e,t){return"function"==typeof e?e(t):e}function v(e,t){return"function"==typeof e?e(t):e}function A(e,t,o,n){return e<o?"BEGIN":e>=t-n?"END":void 0}function k(e,t,n){return e.map(((r,i)=>{const s="id"in r?r.id:r.type;return{...r,id:s,type:r.type||"DATA",key:o(s),pinned:A(i,e.length,t,n),header:"header"in r?r.header:s,labels:r.labels||[],index:i}}))}function E(e,t,n,r){const i=new Map(r.map((({columnId:e,width:t})=>[o(e),t])));return k(e,t,n).map((e=>({...e,width:i.has(e.key)?i.get(e.key):"width"in e?e.width:"fit"})))}function I(e,t,n,r){const i=new Map(r.map((({rowId:e,height:t})=>[o(e),t])));return k(e,t,n).map((e=>({...e,height:i.has(e.key)?i.get(e.key):"height"in e?e.height:"fit"})))}function T(e,t,o){let n=o;return e.map(((e,r)=>{const s=i("width"in e?e.width:100,t),l={...e,index:r,width:s,leftWithBorder:n-o,left:n,right:n+s,rightWithBorder:n+s+o};return n+=l.width+o,l}))}function B(e,t,o){let n=o;return e.map(((e,r)=>{const s=i("height"in e?e.height:20,t),l={...e,index:r,height:s,topWithBorder:n-o,top:n,bottom:n+s,bottomWithBorder:n+s+o};return n+=l.height+o,l}))}const D="12px Calibri",L={top:2,right:5,bottom:2,left:5};function M(e){return"function"==typeof e?e:()=>e}const F={HEADER:["HEADER"],FILTER:["FILTER"],DATA:["DATA"],CUSTOM:["CUSTOM"],ANY:["HEADER","DATA","FILTER","CUSTOM"],SPECIAL:["HEADER","FILTER","CUSTOM"],NONE:[]};class S{byKey=new Map;byIndex=new Map;byLabel=new Map;byType=new Map}class z{lookup=new S;hasRules=!1;addRule(e,t,n){if(this.hasRules=!0,Array.isArray(e)){for(const o of e)this.addRule(o,t,n);return}if(Array.isArray(t)){for(const o of t)this.addRule(e,o,n);return}const r=e?"id"in e?{key:o(e.id)}:e:{type:"DATA"},i=t?"id"in t?{key:o(t.id)}:t:{type:"DATA"};function s(e,t){e.has(t)||e.set(t,[]),e.get(t).push(n)}function l(e,t){if(e.has(t)||e.set(t,new S),"key"in i)s(e.get(t).byKey,i.key);else if("index"in i)s(e.get(t).byIndex,i.index);else if("label"in i)s(e.get(t).byLabel,i.label);else for(const o of F[i.type||"NONE"])s(e.get(t).byType,o)}if("key"in r)l(this.lookup.byKey,r.key);else if("index"in r)l(this.lookup.byIndex,r.index);else if("label"in r)l(this.lookup.byLabel,r.label);else for(const e of F[r.type||"NONE"])l(this.lookup.byType,e)}getRules(e,t){const o=[];if(!this.hasRules)return o;function n(e){for(const t of e)o.push(t)}function r(e){e.byKey.has(t.key)&&n(e.byKey.get(t.key)),e.byIndex.has(t.index)&&n(e.byIndex.get(t.index)),e.byType.has(t.type)&&n(e.byType.get(t.type));for(const o of t.labels)e.byLabel.has(o)&&n(e.byLabel.get(o))}this.lookup.byKey.has(e.key)&&r(this.lookup.byKey.get(e.key)),this.lookup.byIndex.has(e.index)&&r(this.lookup.byIndex.get(e.index)),this.lookup.byType.has(e.type)&&r(this.lookup.byType.get(e.type));for(const t of e.labels)this.lookup.byLabel.has(t)&&r(this.lookup.byLabel.get(t));return o}}const N=["borderTop","borderRight","borderBottom","borderLeft"],O={validate:()=>!0,parse:({string:e})=>e};function H(e,t){const o={...e};if("border"in o){for(const e of N)o[e]=o.border;delete o.border}for(const e of N)e in o&&(o[e]={...o[e],index:t});return o}function K(e,t){if(!1!==e.edit)return!0===e.edit?"edit"in t?t.edit:O:"edit"in t?{...t.edit,...e.edit}:{...O,...e.edit}}class W{constructor(e){this.rulesLookup=new z;for(const[t,o]of e.entries()){const e={index:t};"condition"in o&&(e.condition=o.condition),"style"in o&&(e.style=M(o.style)),"value"in o&&(e.value=M(o.value)),"text"in o&&(e.text=M(o.text)),"font"in o&&(e.font=M(o.font)),"padding"in o&&(e.padding=M(o.padding)),"edit"in o&&(e.edit=o.edit),"tooltip"in o&&(e.tooltip=M(o.tooltip)),"draw"in o&&(e.draw=o.draw),this.rulesLookup.addRule(o.column,o.row,e)}}resolve(e,t,o,n,r,i){const s=this.rulesLookup.getRules(r,n).sort(((e,t)=>e.index-t.index)).filter(((e,t,o)=>e.index!==o[t-1]?.index));let l,u,d={data:e,rows:t,columns:o,row:n,column:r},c={},a=L,h=D;i.hasValueByKey(n.key,r.key)&&(d={...d,newValue:i.getValueByKey(n.key,r.key)});for(const e of s)if((!("condition"in e)||e.condition(d))&&("value"in e&&(d={...d,value:e.value(d)}),"style"in e&&(c={...c,...H(e.style(d),e.index)}),"text"in e&&(d={...d,text:e.text(d)}),"font"in e&&(h=e.font(d)),"padding"in e&&(a={...a,...e.padding(d)}),"edit"in e&&(d={...d,edit:K(e,d)}),"tooltip"in e&&(u=e.tooltip(d)),"draw"in e)){const t=d;l=o=>e.draw({...t,ctx:o})}const f=function(e){return"text"in e?`${e.text}`:"newValue"in e?`${e.newValue}`:void 0!==e.value?`${e.value}`:""}(d),p={style:c,text:f,padding:a,font:h};return"value"in d&&(p.value=d.value),"edit"in d&&void 0!==d.edit&&(p.edit=d.edit),void 0!==u&&(p.tooltip=u),void 0!==l&&(p.draw=l),p}}function P(e){return new W(e)}class ${constructor(e,t,o,n,r){this.formattingRules=e,this.data=t,this.rows=o,this.columns=n,this.edition=r}resolve(e,t){return this.formattingRules.resolve(this.data,this.rows,this.columns,e,t,this.edition)}}function q(e,t,o,n,r){return new $(e,t,o,n,r)}function V(e,t,n){const r=new Map;for(const i of e){const e=o(i[t]),s=o(i[n]);r.has(e)||r.set(e,new Map),r.get(e).set(s,i.expression)}return r}function Y(e,t,o,n,r,i,s){if(0===e.length)return r;const l=V(e,"columnId","rowId"),u=i.filter((e=>"FILTER"!==e.type&&l.has(e.key)));return 0===u.length?r:r.filter((e=>{for(const d of u){const u=o.resolve(n,r,i,e,d,s),c=l.get(d.key);if(!t.resolve(n,r,i,e,d,u.value,u.text,c))return!1}return!0}))}function G(e,t,o,n,r,i,s){if(0===e.length)return i;const l=V(e,"rowId","columnId"),u=r.filter((e=>"FILTER"!==e.type&&l.has(e.key)));return 0===u.length?i:i.filter((e=>{for(const d of u){const u=o.resolve(n,r,i,d,e,s),c=l.get(d.key);if(!t.resolve(n,r,i,d,e,u.value,u.text,c))return!1}return!0}))}function j(e,t,o,n){return{top:e,bottom:t,left:o,right:n}}function U(e,t){return{width:e.length?e.at(-1).rightWithBorder:0,height:t.length?t.at(-1).bottomWithBorder:0}}class _{constructor(){this.fontMetrics=new Map,this.canvas=document.createElement("canvas"),this.context=this.canvas.getContext("2d")}measureWidth(e,t){if(!e)return 0;const o=this.context;return o.font=t||D,o.measureText(e).width}measureHeight(e,t){let o=1;for(const t of e)"\n"===t&&o++;return o*this.getFontMetrics(t).height}getFontMetrics(e){const t=e;if(this.fontMetrics.has(t))return this.fontMetrics.get(t);const o=this.context;o.font=e||D;const n=o.measureText("X"),r=(n.actualBoundingBoxDescent-n.actualBoundingBoxAscent)/2,i={topOffset:r+n.fontBoundingBoxAscent,middle:-r,bottomOffset:n.fontBoundingBoxDescent-r,height:n.fontBoundingBoxAscent+n.fontBoundingBoxDescent};return this.fontMetrics.set(t,i),i}}function X(){return new _}function J(e,t){return t.top>=e.top&&t.left>=e.left&&t.top+t.height<=e.top+e.height&&t.left+t.width<=e.left+e.width}function Q(e,t){const o={top:Math.max(e.top,t.top),left:Math.max(e.left,t.left),width:Math.min(e.left+e.width,t.left+t.width)-Math.max(e.left,t.left),height:Math.min(e.top+e.height,t.top+t.height)-Math.max(e.top,t.top)};return o.width>=0&&o.height>=0?o:{top:e.top,left:e.left,width:0,height:0}}function Z(e,t){return{top:e.top-t,left:e.left-t,width:e.width+2*t,height:e.height+2*t}}function ee(e){return e.width*e.height}function te(e,t){return{top:e.top,left:e.left,width:Math.max(0,e.width-t.left-t.right),height:Math.max(0,e.height-t.top-t.bottom)}}const oe=200,ne=400,re={left:0,top:0,width:0,height:0};function ie(e,t,o,n){const r=t.x,i=t.y,s=e.scrollLeft,l=e.scrollTop,u=e.clientWidth,d=e.clientHeight;return{x:r<=o.left?r:r>=u?r+s:r>=u-o.right?n.width-u+r:r+s,y:i<=o.top?i:i>=d?i+l:i>=d-o.bottom?n.height-d+i:i+l}}function se(e){return e.reduce(((e,t)=>e.set(t.key,t)),new Map)}function le(e,t,n,r,i,s,l,u){if(!e)return[];if(!t)return[];if(!r)return[];if(!n)return[];const d=o(n.columnId),c=o(n.rowId),a=o(r.columnId),h=o(r.rowId);if(!l.has(d))return[];if(!u.has(c))return[];if(!l.has(a))return[];if(!u.has(h))return[];const f=Math.min(l.get(d).index,l.get(a).index),p=Math.max(l.get(d).index,l.get(a).index),m=Math.min(u.get(c).index,u.get(h).index),g=Math.max(u.get(c).index,u.get(h).index);return i.slice(f,p+1).flatMap((e=>s.slice(m,g+1).map((t=>({rowId:t.id,columnId:e.id})))))}function ue(e,t){const o=function(e){return"BEGIN"===e.pinned?"top":"END"===e.pinned?"bottom":"middle"}(t),n=function(e){return"BEGIN"===e.pinned?"left":"END"===e.pinned?"right":"center"}(e);return`${o}-${n}`}function de(e,t,n,r,i){return 0===e.length?null:function(e,t,n,r){if(!e)return null;const i=o(e.columnId),s=o(e.rowId);if(!t.has(i))return null;if(!n.has(s))return null;const l=t.get(i),u=n.get(s),d={width:l.width,height:u.height,section:ue(l,u)};switch(u.pinned){case"BEGIN":d.top=u.top;break;case"END":d.bottom=r.top.height+r.middle.height+r.bottom.height-u.top-u.height;break;default:d.marginTop=u.top-r.top.height}switch(l.pinned){case"BEGIN":d.left=l.left;break;case"END":d.right=r.left.width+r.center.width+r.right.width-l.left-l.width;break;default:d.marginLeft=l.left-r.left.width}return d}(t,n,r,i)}function ce(e,t){return t.every((t=>t.edit.validate({string:e})))}function ae(e){return Array.isArray(e)?e.map(((e,t)=>t)):Object.keys(e)}function he(e){return ae(e)}function fe(e){const t=new Set;if(Array.isArray(e))for(const o of e)for(const e of ae(o))t.add(e);else for(const o in e)for(const n of ae(e[o]))t.add(n);return Array.from(t)}function pe(e,t){if(!e.some((e=>"DATA-BLOCK"===e.type)))return e;const o=[];for(const n of e)if("DATA-BLOCK"===n.type){const e="selector"in n?n.selector(t):fe(t);for(const t of e)o.push({...n,id:t,type:"DATA"})}else o.push(n);return o}function me(e,t){if(!e.some((e=>"DATA-BLOCK"===e.type)))return e;const o=[];for(const n of e)if("DATA-BLOCK"===n.type){const e="selector"in n?n.selector(t):he(t);for(const t of e)o.push({...n,id:t,type:"DATA"})}else o.push(n);return o}const ge=({text:e,expression:t})=>e.includes(t);class ye{constructor(e){this.rulesLookup=new z;for(const t of e){const e={by:o("by"in t?t.by:"FILTER"),condition:t.condition||ge};this.rulesLookup.addRule(t.column,t.row,e)}}resolve(e,t,o,n,r,i,s,l){const u=this.rulesLookup.getRules(r,n);if(0===u.length)return"DATA"!==n.type||"DATA"!==r.type||!l.has('"FILTER"')||ge({text:s,expression:l.get('"FILTER"')});let d={data:e,rows:t,columns:o,row:n,column:r,value:i,text:s};for(const e of u){if(!l.has(e.by))continue;const t={...d,expression:l.get(e.by)};if(!e.condition(t))return!1}return!0}}function we(e){return new ye(e)}function xe(e){return h(e,["value","text"])}function be(e){return h(e,["value","text","font","padding"])}function Re(e,t,o,n,r,i){if(e.every((e=>"number"==typeof e.width)))return e;const s=e=>{const i=e.width;if("number"==typeof i)return i;if(r.has(e.key)){const t=r.get(e.key);if("fit-once"===i&&!t.dataOnly)return t.width;if("fit-data-once"===i&&t.dataOnly)return t.width}let s=0;for(const r of t){if("DATA"!==r.type&&"fit-data-once"===i)continue;if("DATA"!==r.type&&"fit-data"===i)continue;const t=n.resolve(r,e),l=t.text,u=t.font,d=t.padding.left+t.padding.right,c=o.measureWidth(l,u)+d;s=Math.max(s,c)}return r.set(e.key,{width:s,dataOnly:"fit-data-once"===i}),s};for(const e of r.keys())i.has(e)||r.delete(e);return e.map((e=>({...e,width:s(e)})))}function Ce(e,t,o,n,r,i){if(t.every((e=>"number"==typeof e.height)))return t;const s=t=>{const i=t.height;if("number"==typeof i)return i;if(r.has(t.key)){const e=r.get(t.key);if("fit-once"===i&&!e.dataOnly)return e.height;if("fit-data-once"===i&&e.dataOnly)return e.height}let s=0;for(const r of e){if("DATA"!==r.type&&"fit-data-once"===i)continue;if("DATA"!==r.type&&"fit-data"===i)continue;const e=n.resolve(t,r),l=e.text,u=e.font,d=e.padding.top+e.padding.bottom,c=o.measureHeight(l,u)+d;s=Math.max(s,c)}return r.set(t.key,{height:s,dataOnly:"fit-data-once"===i}),s};for(const e of r.keys())i.has(e)||r.delete(e);return t.map((e=>({...e,height:s(e)})))}function ve(e){return new Set(e.map((e=>e.key)))}function Ae(e){return h(e,["value","text"])}function ke(e,t){return null!=e.value&&(null==t.value||e.value<t.value)}function Ee(e,t){return null!=e.value&&(null==t.value||e.value>t.value)}class Ie{constructor(e){this.rulesLookup=new z;for(const t of e){const e=t.comparator?(e,o)=>t.comparator(e,o):(e,t)=>ke(e,t),n=t.comparator?(e,o)=>!t.comparator(e,o):(e,t)=>Ee(e,t),r={by:o("by"in t?t.by:"HEADER"),comparatorAsc:e,comparatorDesc:n};this.rulesLookup.addRule(t.column,t.row,r)}}resolve(e,t,o){const n=this.rulesLookup.getRules(e,t);if(0===n.length)return"DATA"!==t.type||"DATA"!==e.type?null:o.has('"HEADER"')?"ASC"===o.get('"HEADER"')?ke:Ee:null;if(n.length>1)throw new Error("Multiple sorting rules for the same cell");const r=n[0];return o.has(r.by)?"ASC"===o.get(r.by)?r.comparatorAsc:r.comparatorDesc:null}}function Te(e){return"manual"===e?null:new Ie(e)}function Be(e,t,n){const r=new Map;for(const i of e){const e=o(i[t]),s=o(i[n]);r.has(e)||r.set(e,new Map),r.get(e).set(s,i.direction)}return r}function De(e,t){e.sort(((e,t)=>{const o=e.comparator(e.cell,t.cell);return"number"==typeof o?o:o?-1:1})),t.push(...e.map((e=>e.entity))),e.length=0}function Le(e,t,n,r,i,s,l){if(0===e.length)return i;if(null===t)return i;const u=Be(e,"columnId","rowId"),d=new Map(s.map((e=>[e.key,e]))),c=e.map((e=>o(e.columnId))).filter((e=>d.has(e))).map((e=>d.get(e))).reverse();if(0===c.length)return i;for(const e of c){const o=[],d=[];for(const c of i){const a=t.resolve(e,c,u.get(e.key));if(!a){De(d,o),o.push(c);continue}const h={entity:c,comparator:a,cell:n.resolve(r,i,s,c,e,l)};0!==d.length&&d[0].comparator!==a?(De(d,o),d.push(h)):d.push(h)}De(d,o),i=o}return i}function Me(e,t,n,r,i,s,l){if(0===e.length)return s;if(null===t)return s;const u=Be(e,"rowId","columnId"),d=new Map(i.map((e=>[e.key,e]))),c=e.map((e=>o(e.rowId))).filter((e=>d.has(e))).map((e=>d.get(e))).reverse();if(0===c.length)return s;for(const e of c){const o=[],d=[];for(const c of s){const a=t.resolve(c,e,u.get(e.key));if(!a){De(d,o),o.push(c);continue}const h={entity:c,comparator:a,cell:n.resolve(r,i,s,e,c,l)};0!==d.length&&d[0].comparator!==a?(De(d,o),d.push(h)):d.push(h)}De(d,o),s=o}return s}const Fe=5;function Se(e,t,n,r,i,s,l,u,d){if(!r)return null;if(l)return null;const c=t.get(o(r.columnId));if("HEADER"!==n.get(o(r.rowId)).type)return null;const a=ie(i,s,u,d);if(!a)return null;const h=a.x;return h>=c.right-Fe&&h<=c.right+Fe?c.id:0===c.index||h<c.left-Fe||h>c.left+Fe?null:e[c.index-1].id}function ze(e,t,n,r,i,s,l,u,d){if(!r)return null;if(l)return null;const c=t.get(o(r.columnId)),a=n.get(o(r.rowId));if("HEADER"!==c.type)return null;const h=ie(i,s,u,d);if(!h)return null;const f=h.y;return f>=a.bottom-Fe&&f<=a.bottom+Fe?a.id:0===a.index||f<a.top-Fe||f>a.top+Fe?null:e[a.index-1].id}function Ne(e){return e.map((e=>({columnId:"columnId"in e?e.columnId:"HEADER",rowId:"rowId"in e?e.rowId:"HEADER",direction:e.direction})))}function Oe(e){return e.map((e=>({columnId:"columnId"in e?e.columnId:"FILTER",rowId:"rowId"in e?e.rowId:"FILTER",expression:e.expression})))}function He(e){return e.filter((e=>"DATA"===e.type)).map((e=>e.id))}function Ke(e){return He(e)}function We(e){return He(e)}function Pe(e){return h(e,["value","text","tooltip"])}function $e(e,t,n,r){if(!e)return null;const i=o(e.columnId),s=o(e.rowId);if(!n.has(i))return null;if(!r.has(s))return null;const l=r.get(s),u=n.get(i);return t.resolve(l,u).tooltip}function qe(e,t){return e?{left:t.x+8,top:t.y+20}:null}function Ve(e){return e.map((e=>o(e)))}function Ye(e,t){if(!t)return e;const o=new Map;for(const t of e)o.set(t.key,t);const n=[];for(const e of t)o.has(e)&&(n.push(o.get(e)),o.delete(e));for(const t of e)o.has(t.key)&&n.push(o.get(t.key));return[...n.filter((e=>"BEGIN"===e.pinned)),...n.filter((e=>!e.pinned)),...n.filter((e=>"END"===e.pinned))]}function Ge(e){const t={...e.localOptions,...e.externalOptions},o=e.memory,n=e.state,i=e.element,s=[];function l(e,t,n){const r=o[e]&&o[e].dependencies;return r&&!n.some(((e,t)=>e!==r[t]))||(o[e]={value:t(...n),dependencies:n},s.push(e)),o[e].value}function u(e,t){const n=o[e]&&o[e].value;return JSON.stringify(n)!==JSON.stringify(t)&&(o[e]={value:t},s.push(e)),o[e].value}function c(e,t,n){(o[e]&&o[e].value)!==t&&(o[e]={value:t},n(t))}const a=window.devicePixelRatio,h=t.borderWidth/a,p=t.data,w=e.input.value,b=l("sortBy",Ne,[t.sortBy]),A=l("filters",Oe,[t.filters]),k=l("textResolver",X,[]),D=l("dataFormatting",d,[t.formatting,t.dataSelector,b]),L=l("editedCellsAndFilters",y,[t.editedCells,A]),M=l("edition",x,[L]),F=l("invokedColumns",C,[t.columns,p]),S=l("invokedRows",v,[t.rows,p]),z=l("unfoldedColumns",pe,[F,p]),N=l("unfoldedRows",me,[S,p]),O=l("unfilteredColumns",E,[z,t.pinnedLeft,t.pinnedRight,t.columnWidths]),H=l("unfilteredRows",I,[N,t.pinnedTop,t.pinnedBottom,t.rowHeights]),K=l("unfilteredColumnKeys",ve,[O]),W=l("unfilteredRowKeys",ve,[H]),$=l("columnsOrder",Ve,[t.columnsOrder]),V=l("rowsOrder",Ve,[t.rowsOrder]),_=l("orderedColumns",Ye,[O,$]),ue=l("orderedRows",Ye,[H,V]),ae=l("filterFormatting",xe,[D]),he=l("filterFormattingRules",P,[ae]),fe=l("filteringRules",we,[t.filtering]),ge=l("filteredColumns",G,[A,fe,he,p,ue,_,M]),ye=l("filteredRows",Y,[A,fe,he,p,ue,_,M]),ke=l("sortingFormatting",Ae,[D]),Ee=l("sortingFormattingRules",P,[ke]),Ie=l("sortingRules",Te,[t.sorting]),Be=l("sortedColumns",Me,[b,Ie,Ee,p,ye,ge,M]),De=l("sortedRows",Le,[b,Ie,Ee,p,ye,ge,M]),Fe=l("measureFormatting",be,[D]),He=l("measureFormattingRules",P,[Fe]),Ge=l("measureFormatResolver",q,[He,p,De,Be,M]),je=e.columnWidthCache,Ue=e.rowHeightCache,_e=l("measuredColumns",Re,[Be,De,k,Ge,je,K]),Xe=l("measuredRows",Ce,[Be,De,k,Ge,Ue,W]),Je=l("columns",T,[_e,a,h]),Qe=l("rows",B,[Xe,a,h]),Ze=l("columnLookup",se,[Je]),et=l("rowLookup",se,[Qe]),tt=t.focusedCell,ot=l("sections",g,[Je,Qe]),nt=t.selectedCells,rt=l("fixedSize",j,[ot.top.height,ot.bottom.height,ot.left.width,ot.right.width]),it=l("totalSize",U,[Je,Qe]),st=u("hoveredCell",function(e,t,o,n,r,i){if(!t)return null;if(t.x<0||t.y<0||t.x>i.width||t.y>i.height)return null;const s=ie(e,t,r,i),l=function(e,t){if(0===e.length)return-1;if(t<e[0].topWithBorder)return-1;if(t>e[e.length-1].bottomWithBorder)return-1;let o=0,n=e.length-1;for(;o<=n;){const r=Math.floor((o+n)/2);if(t<e[r].topWithBorder)n=r-1;else{if(!(t>e[r].bottomWithBorder))return r;o=r+1}}return-1}(o,s.y),u=function(e,t){if(0===e.length)return-1;if(t<e[0].leftWithBorder)return-1;if(t>e[e.length-1].rightWithBorder)return-1;let o=0,n=e.length-1;for(;o<=n;){const r=Math.floor((o+n)/2);if(t<e[r].leftWithBorder)n=r-1;else{if(!(t>e[r].rightWithBorder))return r;o=r+1}}return-1}(n,s.x);return-1===l||-1===u?null:{rowId:o[l].id,columnId:n[u].id}}(i,e.mousePosition,Qe,Je,rt,it)),lt=e.isReordering,ut=e.resizingColumn||l("resizableColumn",Se,[Je,Ze,et,st,i,e.mousePosition,lt,rt,it]),dt=e.resizingRow||l("resizableRow",ze,[Qe,Ze,et,st,i,e.mousePosition,lt,rt,it]),ct=l("highlightedCells",le,[e.isMouseDown,!ut&&!dt&&!e.didReorder,tt,st,Je,Qe,Ze,et]),at=l("selection",R,[nt]),ht=l("highlight",R,[ct]),ft=l("renderFormatting",m,[D,st,tt,at,ht,M,b,ut,dt,t.borderWidth,lt,e.reorderedColumn,e.reorderedRow]),pt=l("renderFormattingRules",P,[ft]),mt=l("renderFormatResolver",q,[pt,p,Qe,Je,M]),gt=l("inputFormatting",f,[D]),yt=l("inputFormattingRules",P,[gt]),wt=l("inputFormatResolver",q,[yt,p,Qe,Je,M]),xt=l("editableCells",r,[nt,wt,Ze,et]),bt=l("inputPlacement",de,[xt,tt,Ze,et,ot]),Rt=l("isTextValid",ce,[w,xt]),Ct=l("contextFormatting",Pe,[D]),vt=l("contextFormattingRules",P,[Ct]),At=l("contextFormatResolver",q,[vt,p,Qe,Je,M]),kt=l("tooltip",$e,[st,At,Ze,et]),Et=l("tooltipPlacement",qe,[kt,e.mousePosition]),It=u("scrollRect",function(e,t,o,n){const r={width:n.getBoundingClientRect().width,height:n.getBoundingClientRect().height},i={left:n.scrollLeft,top:n.scrollTop},s=e||re,l=te({left:0,top:0,...t},o),u=te({...i,...r},o),d=Q(l,Z(u,oe)),c=Q(l,Z(u,ne));return J(l,s)&&J(s,d)?ee(s)>2*ee(c)?c:s:c}(n?.scrollRect,it,rt,i)),Tt=l("activeColumns",Ke,[Je]),Bt=l("activeRows",We,[Qe]);c("activeColumnsCallback",Tt,t.onActiveColumnsChange),c("activeRowsCallback",Bt,t.onActiveRowsChange),c("hoveredCellCallback",st,t.onHoveredCellChange),t.onStateChange(s),e.state={options:t,devicePixelRatio:a,borderWidth:h,edition:M,columns:Je,rows:Qe,sections:ot,hoveredCell:st,focusedCell:tt,renderFormatResolver:mt,inputFormatResolver:wt,fixedSize:rt,totalSize:it,textResolver:k,scrollRect:It,highlightedCells:ct,inputPlacement:bt,columnLookup:Ze,rowLookup:et,text:w,isTextValid:Rt,resizableColumn:ut,resizableRow:dt,tooltip:kt,tooltipPlacement:Et}}function je(e){if(!e.error)try{Ge(e)}catch(t){e.error=t}}function Ue(e,t){const o=new b(t);return[...t,...e.filter((e=>!o.isIdSelected(e.rowId,e.columnId)))]}function _e(e,t){const o=new b(t);return e.filter((e=>!o.isIdSelected(e.rowId,e.columnId)))}function Xe(e){const t=e.currentTarget;if(!(t instanceof HTMLElement))throw new Error("Element is not an HTMLElement");const o=t.getBoundingClientRect();return{x:e.clientX-o.left,y:e.clientY-o.top}}function Je(e,t){return e.map((e=>({...e,columnId:"columnId"in e?e.columnId:t,rowId:"rowId"in e?e.rowId:t})))}function Qe(e,t,n){const r=o(t),i=o(n);if(r===i)return null;const s=e.findIndex((e=>e.key===r)),l=e.findIndex((e=>e.key===i));return-1===s||-1===l||s===l?null:[s,l]}class Ze{constructor(e,t,o,n){this.element=e,this.canvases=t,this.input=o,this.tooltip=n,this.localOptions={data:[],columns:[{type:"DATA-BLOCK"}],rows:[{type:"HEADER"},{type:"DATA-BLOCK"}],formatting:[],filtering:[],sorting:[],dataSelector:({data:e,row:t,column:o})=>e?.[t.id]?.[o.id],pinnedTop:0,pinnedBottom:0,pinnedLeft:0,pinnedRight:0,borderWidth:1,focusedCell:null,onFocusedCellChange:e=>{this.localOptions.focusedCell=e,this.requestNewRender()},selectedCells:[],onSelectedCellsChange:e=>{this.localOptions.selectedCells=e,this.requestNewRender()},highlightedCells:[],editedCells:[],onEditedCellsChange:e=>{this.localOptions.editedCells=e,this.requestNewRender()},filters:[],onFiltersChange:e=>{this.localOptions.filters=e,this.requestNewRender()},sortBy:[],onSortByChange:e=>{this.localOptions.sortBy=e,this.requestNewRender()},onCellClick:()=>{},onCustomCellClick:()=>{},columnWidths:[],onColumnWidthsChange:e=>{this.localOptions.columnWidths=e,this.requestNewRender()},rowHeights:[],onRowHeightsChange:e=>{this.localOptions.rowHeights=e,this.requestNewRender()},columnsOrder:[],onColumnsOrderChange:e=>{this.localOptions.columnsOrder=e,this.requestNewRender()},rowsOrder:[],onRowsOrderChange:e=>{this.localOptions.rowsOrder=e,this.requestNewRender()},onActiveColumnsChange:()=>{},onActiveRowsChange:()=>{},onHoveredCellChange:()=>{},onStateChange:()=>{}}}externalOptions={};state=null;memory={};renderRequested=!1;mousePosition=null;isMouseDown=!1;columnWidthCache=new Map;rowHeightCache=new Map;isReordering=!1;errorRendered=!1;error=null;resizingColumn=null;resizingRow=null;reorderedColumn=null;reorderedRow=null;didReorder=!1;mouseDownPosition=null;mouseDownCell=null;requestNewRender(){this.renderRequested||(this.renderRequested=!0,requestAnimationFrame((()=>{this.renderRequested=!1,je(this),l(this)})))}}function et(e){if("spread-grid-context"in e)return;const t={"top-left":document.createElement("canvas"),"top-center":document.createElement("canvas"),"top-right":document.createElement("canvas"),"middle-left":document.createElement("canvas"),"middle-center":document.createElement("canvas"),"middle-right":document.createElement("canvas"),"bottom-left":document.createElement("canvas"),"bottom-center":document.createElement("canvas"),"bottom-right":document.createElement("canvas")},i=document.createElement("input"),s=document.createElement("div");e.setAttribute("tabindex","0"),e.setAttribute("style","max-width: 100vw; max-height: 100vh; overflow: auto; display: grid; position: relative; grid-template-columns: fit-content(0) fit-content(0) fit-content(0); grid-template-rows: fit-content(0) fit-content(0) fit-content(0); outline: none; user-select: none;"),e.classList.add("spread-grid"),t["top-left"].setAttribute("style","position: sticky; left: 0; top: 0; z-index: 2; grid-row: 1; grid-column: 1;"),t["top-center"].setAttribute("style","position: sticky; top: 0; z-index: 1; grid-row: 1; grid-column: 2;"),t["top-right"].setAttribute("style","position: sticky; right: 0; top: 0; z-index: 2; grid-row: 1; grid-column: 3;"),t["middle-left"].setAttribute("style","position: sticky; left: 0; z-index: 1; grid-row: 2; grid-column: 1;"),t["middle-center"].setAttribute("style","grid-row: 2; grid-column: 2; z-index: 0;"),t["middle-right"].setAttribute("style","position: sticky; right: 0; z-index: 1; grid-row: 2; grid-column: 3;"),t["bottom-left"].setAttribute("style","position: sticky; left: 0; bottom: 0; z-index: 2; grid-row: 3; grid-column: 1;"),t["bottom-center"].setAttribute("style","position: sticky; bottom: 0; z-index: 1; grid-row: 3; grid-column: 2;"),t["bottom-right"].setAttribute("style","position: sticky; right: 0; bottom: 0; z-index: 2; grid-row: 3; grid-column: 3;"),i.setAttribute("style","position: sticky; z-index: 3; outline: none; border: none; box-shadow: none; padding: 0 5px; font-size: 12px; font-family: Calibri; background-color: white; box-sizing: border-box; opacity: 0; pointer-events: none;"),s.setAttribute("style","pointer-events: none; background-color: white; color: black; border: 1px solid black; padding: 3px 7px; inset: unset; position: absolute; font-size: 12px; font-family: Calibri; "),s.setAttribute("popover","manual"),s.classList.add("spread-grid-tooltip");const l=new Ze(e,t,i,s);function u(e,t,o){e.addEventListener(t,(e=>{try{o(e)}catch(e){e.message=`[${t} event]: ${e.message}`,l.error=e,l.requestNewRender()}}))}e["spread-grid-context"]=l;const d=e=>{i.value=e,i.dispatchEvent(new Event("input"))},c=e=>{const t=l.state.options.selectedCells,o=l.state.inputFormatResolver,n=l.state.columnLookup,i=l.state.rowLookup,s=l.state.text,u=l.state.isTextValid,c=l.state.options.onEditedCellsChange,a=l.state.options.onFiltersChange,h=r(t,o,n,i);if(""===s)return;if(!u)return;if(e&&!h.every((e=>e.edit.autoCommit)))return;const f=h.filter((e=>"DATA"===e.type)),p=h.filter((e=>"FILTER"===e.type));var m;m=f.map((e=>({...e.cell,value:e.edit.parse({string:s})}))),c(Ue(l.state.options.editedCells,m)),(e=>{a(Ue(Je(l.state.options.filters,"FILTER"),e))})(p.map((e=>({...e.cell,expression:e.edit.parse({string:s})})))),e||d("")},a=e=>{const t=l.state.options.selectedCells,o=l.state.options.onEditedCellsChange,n=l.state.options.onFiltersChange,i=r(t,l.state.inputFormatResolver,l.state.columnLookup,l.state.rowLookup);var s;e&&!i.every((e=>e.edit.autoCommit))||(s=t,o(_e(l.state.options.editedCells,s)),(e=>{n(_e(Je(l.state.options.filters,"FILTER"),e))})(t))};u(e,"scroll",(e=>{l.requestNewRender()})),u(e,"mouseenter",(e=>{l.mousePosition=Xe(e),l.requestNewRender()})),u(e,"mousemove",(t=>{if(l.mousePosition=Xe(t),l.resizingColumn){const t=l.state.columnLookup.get(o(l.resizingColumn)),n=t.width,r=t.right,i=ie(e,l.mousePosition,l.state.fixedSize,l.state.totalSize),s=Math.max(10,i.x-r+n),u=l.state.options.columnWidths.filter((e=>o(e.columnId)!==t.key)).concat([{columnId:t.id,width:s}]);l.state.options.onColumnWidthsChange(u)}if(l.resizingRow){const t=l.state.rowLookup.get(o(l.resizingRow)),n=t.height,r=t.bottom,i=ie(e,l.mousePosition,l.state.fixedSize,l.state.totalSize),s=Math.max(10,i.y-r+n),u=l.state.options.rowHeights.filter((e=>o(e.rowId)!==t.key)).concat([{rowId:t.id,height:s}]);l.state.options.onRowHeightsChange(u)}if(l.reorderedColumn){const t=l.state.columns,o=l.state.hoveredCell,n=ie(e,l.mousePosition,l.state.fixedSize,l.state.totalSize),r=function(e,t,o,n){if(!o)return null;const r=Qe(e,t,o.columnId);if(!r)return null;const[i,s]=r,l=s<=i?n.x<e[s].leftWithBorder+e[i].width?s:s+1:n.x>e[s].rightWithBorder-e[i].width?s:s-1;if(l===i)return null;const u=e.map((e=>e.id));return u.splice(i,1),u.splice(l,0,t),u}(t,l.reorderedColumn,o,n);r&&(l.didReorder=!0,l.isReordering=!0,l.state.options.onColumnsOrderChange(r))}if(l.reorderedRow){const t=l.state.rows,o=l.state.hoveredCell,n=ie(e,l.mousePosition,l.state.fixedSize,l.state.totalSize),r=function(e,t,o,n){if(!o)return null;const r=Qe(e,t,o.rowId);if(!r)return null;const[i,s]=r,l=s<=i?n.y<e[s].topWithBorder+e[i].height?s:s+1:n.y>e[s].bottomWithBorder-e[i].height?s:s-1;if(l===i)return null;const u=e.map((e=>e.id));return u.splice(i,1),u.splice(l,0,t),u}(t,l.reorderedRow,o,n);r&&(l.didReorder=!0,l.isReordering=!0,l.state.options.onRowsOrderChange(r))}l.requestNewRender()})),u(e,"mouseleave",(()=>{l.mousePosition=null,l.requestNewRender()})),u(e,"mousedown",(e=>{je(l),d("");const t=l.state.hoveredCell;if(l.isMouseDown=!0,l.didReorder=!1,l.mouseDownPosition=l.mousePosition,l.mouseDownCell=t,l.state.resizableColumn&&(l.resizingColumn=l.state.resizableColumn),l.state.resizableRow&&(l.resizingRow=l.state.resizableRow),!l.resizingColumn&&t){const e=l.state.rowLookup.get(o(t.rowId));l.reorderedColumn="HEADER"===e.type?t.columnId:null}if(!l.resizingRow&&t){const e=l.state.columnLookup.get(o(t.columnId));l.reorderedRow="HEADER"===e.type?t.rowId:null}l.resizingColumn||l.resizingRow||l.state.options.onFocusedCellChange(t),e.ctrlKey||l.state.options.onSelectedCellsChange([]),l.requestNewRender()})),u(e,"mouseup",(e=>{je(l),l.isMouseDown=!1,l.isReordering=!1,l.resizingColumn=null,l.resizingRow=null,l.reorderedColumn=null,l.reorderedRow=null,l.state.options.onSelectedCellsChange(Ue(l.state.options.selectedCells,l.state.highlightedCells)),l.requestNewRender()})),u(e,"pointerdown",(e=>{l.element.setPointerCapture(e.pointerId)})),u(e,"pointerup",(e=>{l.element.releasePointerCapture(e.pointerId)})),u(e,"click",(e=>{je(l);const t=l.state.hoveredCell,r=l.mouseDownCell;if(l.state.resizableColumn||l.state.resizableRow)return;if(l.didReorder)return;if(null===t)return;if(o(t.columnId)!==o(r.columnId))return;if(o(t.rowId)!==o(r.rowId))return;const i=l.state.columnLookup.get(o(t.columnId)),s=l.state.rowLookup.get(o(t.rowId)),u=l.state.options.sortBy,d=l.state.inputFormatResolver.resolve(s,i),c={ctrlKey:e.ctrlKey,shiftKey:e.shiftKey,button:e.button,buttons:e.buttons,detail:e.detail};if(d.edit?.toggle){const e=function(e,t,o,n){const r=n.hasValueByKey(o.key,t.key)?n.getValueByKey(o.key,t.key):e.value,i=e.edit.toggle;return"function"==typeof i?i({value:r}):i[(i.indexOf(r)+1)%i.length]}(d,i,s,l.state.edition),o=n(i,s);"DATA"===o&&l.state.options.onEditedCellsChange(Ue(l.state.options.editedCells,[{...t,value:e}])),"FILTER"===o&&l.state.options.onFiltersChange(Ue(Je(l.state.options.filters,"FILTER"),[{...t,expression:e}]))}else if("DATA"===i.type&&"DATA"===s.type)l.state.options.onCellClick({...l.state.hoveredCell,...c});else if("CUSTOM"===i.type||"CUSTOM"===s.type)l.state.options.onCustomCellClick({...l.state.hoveredCell,...c});else if("HEADER"===i.type||"HEADER"===s.type){const t=function(e,t,n,r){function i(e){const r="columnId"in e?e.columnId:"HEADER",i="rowId"in e?e.rowId:"HEADER";return t.key===o(r)&&n.key===o(i)}const s=["ASC","DESC",void 0],l=e.find(i),u=s.indexOf(l?.direction),d=s[(u+1)%s.length],c=e.indexOf(l)===e.length-1;return[...!r||!c&&l?e.filter((e=>!function(e){const r="columnId"in e?e.columnId:"HEADER",i="rowId"in e?e.rowId:"HEADER";return"HEADER"===t.type&&t.key===o(r)||"HEADER"===n.type&&n.key===o(i)}(e))):e.filter((e=>!i(e))),...d?[{columnId:t.id,rowId:n.id,direction:d}]:[]]}(u,i,s,e.ctrlKey);l.state.options.onSortByChange(t),l.state.options.onSelectedCellsChange([])}})),u(e,"dblclick",(e=>{if(je(l),l.state.resizableColumn){const e=o(l.state.resizableColumn),t=l.state.options.columnWidths.filter((t=>o(t.columnId)!==e));l.state.options.onColumnWidthsChange(t),l.columnWidthCache.delete(e)}if(l.state.resizableRow){const e=o(l.state.resizableRow),t=l.state.options.rowHeights.filter((t=>o(t.rowId)!==e));l.state.options.onRowHeightsChange(t),l.rowHeightCache.delete(e)}const t=l.state.focusedCell;if(null===t)return;const n=o(t.columnId),r=o(t.rowId),s=l.state.columnLookup,u=l.state.rowLookup,c=l.state.inputFormatResolver;if(!s.has(n))return;if(!u.has(r))return;const a=s.get(n),h=u.get(r),f=c.resolve(h,a),p=f.text;f.edit&&(f.edit.toggle||(d(p),i?.select()))})),u(e,"focus",(()=>{i.parentElement&&i.focus({preventScroll:!0})})),u(e,"keydown",(e=>{je(l);const t=l.state.focusedCell,n=l.state.columnLookup,r=l.state.rowLookup,i=l.state.options.selectedCells,s=l.state.options.onSelectedCellsChange,u=l.state.options.onFocusedCellChange,h=l.state.options.editedCells,f=l.state.options.onEditedCellsChange,p=l.state.columns,m=l.state.rows,g=l.state.text,y=l.state.inputFormatResolver,w=(e,t)=>{u(e),t.shiftKey?s(Ue(i,[e])):s([e])},x=(e,r)=>{if(!t)return;const i=o(t.columnId);if(!n.has(i))return;const s=n.get(i).index,l=Math.max(0,Math.min(p.length-1,s+e));if(l===s)return;const u={rowId:t.rowId,columnId:p[l].id};w(u,r)},R=(e,n)=>{if(!t)return;const i=o(t.rowId);if(!r.has(i))return;const s=r.get(i).index,l=Math.max(0,Math.min(m.length-1,s+e));if(l===s)return;const u={rowId:m[l].id,columnId:t.columnId};w(u,n)},C=()=>{e.preventDefault(),e.stopPropagation()};switch(e.key){case"Escape":""!==g?d(""):i.length>1?s([t]):h.length>0?f([]):(u(null),s([]));break;case"Enter":c(!1);break;case"ArrowUp":C(),R(e.ctrlKey?-m.length:-1,e);break;case"ArrowDown":C(),R(e.ctrlKey?m.length:1,e);break;case"ArrowLeft":C(),x(e.ctrlKey?-p.length:-1,e);break;case"ArrowRight":C(),x(e.ctrlKey?p.length:1,e);break;case"Delete":case"Backspace":a(!1);break;case"c":(e=>{if(!e.ctrlKey)return;const t=function(e,t,n,r){const i=new Map(t.map((e=>[e.key,e]))),s=new Map(n.map((e=>[e.key,e]))),l=e.map((e=>({columnKey:o(e.columnId),rowKey:o(e.rowId)}))).filter((e=>i.has(e.columnKey)&&s.has(e.rowKey))),u=new Set(l.map((e=>e.columnKey))),d=new Set(l.map((e=>e.rowKey)));if(0===l.length)return"";const c=new b(e),a=Math.min(...l.map((e=>i.get(e.columnKey).index))),h=Math.max(...l.map((e=>i.get(e.columnKey).index))),f=Math.min(...l.map((e=>s.get(e.rowKey).index))),p=Math.max(...l.map((e=>s.get(e.rowKey).index))),m=[];for(let e=f;e<=p;e++){const o=n[e],i=o.key;if(d.has(i)){for(let e=a;e<=h;e++){const n=t[e],s=n.key;if(u.has(s)){if(c.isKeySelected(i,s)){const e=r.resolve(o,n).text;m.push(e)}e<h&&m.push("\t")}}e<p&&m.push("\n")}}return m.join("")}(i,p,m,y);if(navigator.clipboard)navigator.clipboard.writeText(t);else{const e=document.createElement("textarea");e.value=t,document.body.appendChild(e),e.select(),document.execCommand("copy"),document.body.removeChild(e)}})(e)}})),new ResizeObserver((()=>{l.requestNewRender()})).observe(e),u(i,"input",(e=>{je(l),i.value?(c(!0),i.style.opacity="1",i.style.pointerEvents="auto"):(e.isTrusted&&a(!0),i.style.opacity="0",i.style.pointerEvents="none")})),u(i,"click",(e=>{e.stopPropagation()})),u(i,"dblclick",(e=>{e.stopPropagation()})),u(i,"mousedown",(e=>{e.stopPropagation()})),u(i,"keydown",(e=>{switch(e.key){case"Enter":case"Escape":break;case"Delete":case"Backspace":case"ArrowUp":case"ArrowDown":case"ArrowLeft":case"ArrowRight":""!==i.value&&(e.stopPropagation(),l.requestNewRender());break;default:e.stopPropagation(),l.requestNewRender()}}))}function tt(e,t){et(e);const o=e["spread-grid-context"];o.externalOptions=t,null===o.state?(je(o),l(o)):o.requestNewRender()}return t.default})()));
package/jsconfig.json CHANGED
@@ -3,8 +3,12 @@
3
3
  "checkJs": true,
4
4
  "noEmit": true,
5
5
  "downlevelIteration": true,
6
+ "lib": [
7
+ "ES2023",
8
+ "DOM"
9
+ ],
6
10
  // "strict": true
7
- // "noImplicitAny": true - once all typings are added, this option needs to be enabled
11
+ "noImplicitAny": true
8
12
  },
9
13
  "exclude": [
10
14
  "node_modules",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "js-spread-grid",
3
- "version": "0.1.19",
3
+ "version": "0.2.0",
4
4
  "description": "Fast grid for js applications",
5
5
  "author": "Tomasz Rewak <tomasz.rewak@gmail.com>",
6
6
  "license": "MIT",
@@ -1,5 +1,10 @@
1
1
  import roundToPixels from "../core-utils/roundToPixels.js";
2
2
 
3
+ /**
4
+ * @param {Context} context
5
+ * @param {VerticalSectionName} vertical
6
+ * @param {HorizontalSectionName} horizontal
7
+ */
3
8
  function renderSection(context, vertical, horizontal) {
4
9
  const state = context.state;
5
10
  const canvas = context.canvases[`${vertical}-${horizontal}`];
@@ -7,6 +12,7 @@ function renderSection(context, vertical, horizontal) {
7
12
  const horizontalSection = state.sections[horizontal];
8
13
  const columns = horizontalSection.columns;
9
14
  const rows = verticalSection.rows;
15
+ const devicePixelRatio = state.devicePixelRatio;
10
16
 
11
17
  if (rows.length === 0 || columns.length === 0) {
12
18
  if (canvas.parentElement)
@@ -92,6 +98,12 @@ function renderSection(context, vertical, horizontal) {
92
98
  return formatResolver.resolve(row, column);
93
99
  });
94
100
  });
101
+
102
+ /**
103
+ * @param {number} rowIndex
104
+ * @param {number} columnIndex
105
+ * @returns {Cell}
106
+ */
95
107
  const getCell = (rowIndex, columnIndex) => cells[rowIndex - minVisibleRowIndex][columnIndex - minVisibleColumnIndex];
96
108
 
97
109
  canvas.width = Math.round(width * devicePixelRatio);
@@ -106,9 +118,20 @@ function renderSection(context, vertical, horizontal) {
106
118
  ctx.fillStyle = "#E9E9E9";
107
119
  ctx.fillRect(0, 0, canvas.width, canvas.height);
108
120
 
121
+ /**
122
+ * @param {number} x
123
+ * @param {number} y
124
+ */
109
125
  const setTransform = (x, y) => {
110
126
  ctx.setTransform(devicePixelRatio, 0, 0, devicePixelRatio, (x - left) * devicePixelRatio, (y - top) * devicePixelRatio);
111
127
  };
128
+
129
+ /**
130
+ * @param {number} x
131
+ * @param {number} y
132
+ * @param {number} width
133
+ * @param {number} height
134
+ */
112
135
  const setClip = (x, y, width, height) => {
113
136
  ctx.beginPath();
114
137
  ctx.rect(x, y, width, height);
@@ -192,6 +215,13 @@ function renderSection(context, vertical, horizontal) {
192
215
 
193
216
  // TODO: clip drawing area to the middle of neighboring columns/rows (might be useful for redrawing only the changed cells)
194
217
  // TODO: move somewhere (?)
218
+ /**
219
+ * @param {number} x1
220
+ * @param {number} y1
221
+ * @param {number} x2
222
+ * @param {number} y2
223
+ * @param {Border} style
224
+ */
195
225
  const drawBorder = (x1, y1, x2, y2, style) => {
196
226
  if (!style)
197
227
  return;
@@ -225,6 +255,11 @@ function renderSection(context, vertical, horizontal) {
225
255
  ctx.stroke();
226
256
  }
227
257
 
258
+ /**
259
+ * @param {Border} borderStyleA
260
+ * @param {Border} borderStyleB
261
+ * @returns {Border}
262
+ */
228
263
  const selectBorder = (borderStyleA, borderStyleB) => {
229
264
  if (!borderStyleA)
230
265
  return borderStyleB;
@@ -278,6 +313,9 @@ function renderSection(context, vertical, horizontal) {
278
313
  }
279
314
  }
280
315
 
316
+ /**
317
+ * @param {Context} context
318
+ */
281
319
  function renderInput(context) {
282
320
  const element = context.element;
283
321
  const input = context.input;
@@ -316,6 +354,9 @@ function renderInput(context) {
316
354
  }
317
355
  }
318
356
 
357
+ /**
358
+ * @param {Context} context
359
+ */
319
360
  function renderCursor(context) {
320
361
  const element = context.element;
321
362
  const state = context.state;
@@ -332,6 +373,7 @@ function renderCursor(context) {
332
373
  element.style.cursor = 'default';
333
374
  }
334
375
 
376
+ /** @param {Context} context */
335
377
  function renderTooltip(context) {
336
378
  const element = context.element;
337
379
  const tooltip = context.tooltip;
@@ -344,16 +386,25 @@ function renderTooltip(context) {
344
386
  return;
345
387
  }
346
388
 
347
- tooltip.innerHTML = content;
348
- tooltip.style.left = `${placement.left}px`;
349
- tooltip.style.top = `${placement.top}px`;
389
+ if (tooltip.innerHTML !== content) {
390
+ tooltip.innerHTML = content;
391
+ }
392
+
393
+ tooltip.style.left = `calc(anchor(left) + ${placement.left}px)`;
394
+ tooltip.style.top = `calc(anchor(top) + ${placement.top}px)`;
350
395
 
351
396
  if (!tooltip.parentElement) {
352
397
  element.appendChild(tooltip);
353
- tooltip.showPopover();
398
+ // @ts-ignore
399
+ tooltip.showPopover({
400
+ source: element,
401
+ });
354
402
  }
355
403
  }
356
404
 
405
+ /**
406
+ * @param {Context} context
407
+ */
357
408
  function renderInternal(context) {
358
409
  renderSection(context, 'top', 'left');
359
410
  renderSection(context, 'top', 'center');
@@ -370,6 +421,9 @@ function renderInternal(context) {
370
421
  renderTooltip(context);
371
422
  }
372
423
 
424
+ /**
425
+ * @param {Context} context
426
+ */
373
427
  function renderError(context) {
374
428
  if (context.errorRendered)
375
429
  return;
@@ -396,6 +450,9 @@ function renderError(context) {
396
450
  `;
397
451
  }
398
452
 
453
+ /**
454
+ * @param {Context} context
455
+ */
399
456
  export default function render(context) {
400
457
  if (!context.error) {
401
458
  try {
package/src/core/state.js CHANGED
@@ -6,7 +6,7 @@ import getSections from "../state-utils/getSections.js";
6
6
  import getEditedCellsAndFilters from "../state-utils/getEditedCellsAndFilters.js";
7
7
  import getEdition from "../state-utils/getEdition.js";
8
8
  import getSelection from "../state-utils/getSelection.js";
9
- import getInvoked from "../state-utils/getInvoked.js";
9
+ import { getGeneratedColumns, getGeneratedRows } from "../state-utils/getGenerated.js";
10
10
  import { getResolvedColumns, getResolvedRows } from "../state-utils/getResolved.js";
11
11
  import { getPlacedColumns, getPlacedRows } from "../state-utils/getPlaced.js";
12
12
  import getFormattingRules from "../state-utils/getFormattingRules.js";
@@ -41,6 +41,9 @@ import getOrder from "../state-utils/getOrder.js";
41
41
  import getOrdered from "../state-utils/getOrdered.js";
42
42
 
43
43
  // TODO: write some test to check if the cache is working properly
44
+ /**
45
+ * @param {Context} context
46
+ */
44
47
  function updateStateInternal(context) {
45
48
  // console.count('updateState');
46
49
 
@@ -48,31 +51,53 @@ function updateStateInternal(context) {
48
51
  const memory = context.memory;
49
52
  const previousState = context.state;
50
53
  const element = context.element;
54
+
55
+ /** @type {string[]} */
51
56
  const stateChanges = [];
52
57
 
53
58
  // TODO: Move to utils
59
+ /**
60
+ * @template {keyof Memory} K
61
+ * @template {Array<*>} U
62
+ * @param {K} key
63
+ * @param {(...args: U) => Memory[K]['value']} func
64
+ * @param {U} dependencies
65
+ * @returns {Memory[K]['value']}
66
+ */
54
67
  function cache(key, func, dependencies) {
55
68
  const previousDependencies = memory[key] && memory[key].dependencies;
56
69
  if (!previousDependencies || dependencies.some((dependency, index) => dependency !== previousDependencies[index])) {
57
- memory[key] = { value: func(...dependencies), dependencies };
70
+ memory[key] = /** @type {Memory[K]} */ ({ value: func(...dependencies), dependencies });
58
71
  stateChanges.push(key);
59
72
  }
60
73
  return memory[key].value;
61
74
  }
62
75
 
76
+ /**
77
+ * @template {keyof Memory} K
78
+ * @param {K} key
79
+ * @param {Memory[K]['value']} value
80
+ * @returns {Memory[K]['value']}
81
+ */
63
82
  function cache_value_deep(key, value) {
64
83
  const previousValue = memory[key] && memory[key].value;
65
84
  if (JSON.stringify(previousValue) !== JSON.stringify(value)) {
66
- memory[key] = { value };
85
+ memory[key] = /** @type {Memory[K]} */ ({ value });
67
86
  stateChanges.push(key);
68
87
  }
69
88
  return memory[key].value;
70
89
  }
71
90
 
91
+ /**
92
+ * @template {keyof Memory} K
93
+ * @param {K} key
94
+ * @param {Memory[K]['value']} value
95
+ * @param {(value: Memory[K]['value']) => void} callback
96
+ */
72
97
  function invoke_change_callback(key, value, callback) {
73
98
  const previousValue = memory[key] && memory[key].value;
74
99
  if (previousValue !== value) {
75
- memory[key] = { value };
100
+ memory[key] = /** @type {Memory[K]} */ ({ value });
76
101
  callback(value);
77
102
  }
78
103
  }
@@ -87,8 +112,8 @@ function updateStateInternal(context) {
87
112
  const dataFormatting = cache('dataFormatting', getDataFormatting, [options.formatting, options.dataSelector, sortBy]);
88
113
  const editedCellsAndFilters = cache('editedCellsAndFilters', getEditedCellsAndFilters, [options.editedCells, filters]);
89
114
  const edition = cache('edition', getEdition, [editedCellsAndFilters]);
90
- const invokedColumns = cache('invokedColumns', getInvoked, [options.columns, data]);
91
- const invokedRows = cache('invokedRows', getInvoked, [options.rows, data]);
115
+ const invokedColumns = cache('invokedColumns', getGeneratedColumns, [options.columns, data]);
116
+ const invokedRows = cache('invokedRows', getGeneratedRows, [options.rows, data]);
92
117
  // TODO: throw on duplicate ids
93
118
  // TODO: throw on duplicate row/column filter ids
94
119
 
@@ -167,7 +192,7 @@ function updateStateInternal(context) {
167
192
  const contextFormattingRules = cache('contextFormattingRules', getFormattingRules, [contextFormatting]);
168
193
  const contextFormatResolver = cache('contextFormatResolver', getFormatResolver, [contextFormattingRules, data, rows, columns, edition]);
169
194
  const tooltip = cache('tooltip', getTooltip, [hoveredCell, contextFormatResolver, columnLookup, rowLookup]);
170
- const tooltipPlacement = cache('tooltipPlacement', getTooltipPlacement, [tooltip, hoveredCell, columnLookup, rowLookup, sections]);
195
+ const tooltipPlacement = cache('tooltipPlacement', getTooltipPlacement, [tooltip, context.mousePosition]);
171
196
  const scrollRect = cache_value_deep('scrollRect', getScrollRect(previousState?.scrollRect, totalSize, fixedSize, element));
172
197
 
173
198
  // callbacks
@@ -184,21 +209,13 @@ function updateStateInternal(context) {
184
209
  options,
185
210
  devicePixelRatio,
186
211
  borderWidth,
187
- data,
188
212
  edition,
189
- filteredColumns,
190
- filteredRows,
191
213
  columns,
192
214
  rows,
193
215
  sections,
194
- selectedCells,
195
- selection,
196
- highlight,
197
216
  hoveredCell,
198
217
  focusedCell,
199
- renderFormatting,
200
218
  renderFormatResolver,
201
- inputFormatting,
202
219
  inputFormatResolver,
203
220
  fixedSize,
204
221
  totalSize,
@@ -217,6 +234,9 @@ function updateStateInternal(context) {
217
234
  };
218
235
  }
219
236
 
237
+ /**
238
+ * @param {Context} context
239
+ */
220
240
  export default function updateState(context) {
221
241
  if (!context.error) {
222
242
  try {
@@ -1,3 +1,8 @@
1
+ /**
2
+ * @param {Rect} bounds
3
+ * @param {Rect} rect
4
+ * @returns {boolean}
5
+ */
1
6
  export function contains(bounds, rect) {
2
7
  return (
3
8
  rect.top >= bounds.top &&
@@ -7,6 +12,11 @@ export function contains(bounds, rect) {
7
12
  );
8
13
  }
9
14
 
15
+ /**
16
+ * @param {Rect} bounds
17
+ * @param {Rect} rect
18
+ * @returns {Rect}
19
+ */
10
20
  export function clip(bounds, rect) {
11
21
  const newRect = {
12
22
  top: Math.max(bounds.top, rect.top),
@@ -26,6 +36,11 @@ export function clip(bounds, rect) {
26
36
  }
27
37
  }
28
38
 
39
+ /**
40
+ * @param {Rect} rect
41
+ * @param {number} margin
42
+ * @returns {Rect}
43
+ */
29
44
  export function expand(rect, margin) {
30
45
  return {
31
46
  top: rect.top - margin,
@@ -35,10 +50,19 @@ export function expand(rect, margin) {
35
50
  };
36
51
  }
37
52
 
53
+ /**
54
+ * @param {Rect} rect
55
+ * @returns {number}
56
+ */
38
57
  export function area(rect) {
39
58
  return rect.width * rect.height;
40
59
  }
41
60
 
61
+ /**
62
+ * @param {Rect} rect
63
+ * @param {Margin} margin
64
+ * @returns {Rect}
65
+ */
42
66
  export function subtract(rect, margin) {
43
67
  return {
44
68
  top: rect.top,
@@ -1,3 +1,8 @@
1
+ /**
2
+ * @param {number} value
3
+ * @param {number} devicePixelRatio
4
+ * @returns {number}
5
+ */
1
6
  export default function roundToPixels(value, devicePixelRatio) {
2
7
  return Math.round(value * devicePixelRatio) / devicePixelRatio;
3
8
  }