+ResizableTableColumns requires that the table element is a not null HTMLTableElement object!`;if(n[e.dataPropertyName]!==void 0)throw`Existing "${e.dataPropertyName}" property.\nTable element already has a '${e.dataPropertyName}' attached object!`;this.id=t.getInstanceId(),this.table=n,this.options=new o(r,n),this.wrapper=null,this.ownerDocument=n.ownerDocument,this.tableHeaders=[],this.dragHandlesContainer=null,this.originalWidths=[],this.eventData=null,this.lastPointerDown=0,this.init(),this.table[e.dataPropertyName]=this}init(){this.validateMarkup(),this.createHandlerReferences(),this.wrapTable(),this.assignTableHeaders(),this.storeOriginalWidths(),this.setHeaderWidths(),this.createDragHandles(),this.restoreColumnWidths(),this.checkTableWidth(),this.syncHandleWidths(),this.registerWindowResizeHandler()}dispose(){this.destroyDragHandles(),this.restoreOriginalWidths(),this.unwrapTable(),this.onPointerDownRef=null,this.onPointerMoveRef=null,this.onPointerUpRef=null,this.table[e.dataPropertyName]=void 0}validateMarkup(){let e=0,t=0,n=null;for(let r=0;r<this.table.childNodes.length;r++){let i=this.table.childNodes[r];i.nodeName===`THEAD`?(e++,n=i):i.nodeName===`TBODY`&&t++}if(n===null||e!==1)throw`Markup validation: thead count.\nResizableTableColumns requires that the table element has one(1) table head element. Current count: ${e}`;if(t!==1)throw`Markup validation: tbody count.\nResizableTableColumns requires that the table element has one(1) table body element. Current count: ${t}`;let r=0,i=null;for(let e=0;e<n.childNodes.length;e++){let t=n.childNodes[e];t.nodeName===`TR`&&(r++,i===null&&(i=t))}if(i===null||r<1)throw`Markup validation: thead row count.\nResizableTableColumns requires that the table head element has at least one(1) table row element. Current count: ${r}`;let a=0,o=0;for(let e=0;e<i.childNodes.length;e++){let t=i.childNodes[e];t.nodeName===`TH`?a++:t.nodeName===`TD`&&o++}if(a<1)throw`Markup validation: thead first row cells count.\nResizableTableColumns requires that the table head's first row element has at least one(1) table header cell element. Current count: ${a}`;if(o!==0)throw`Markup validation: thead first row invalid.\nResizableTableColumns requires that the table head's first row element has no(0) table cell(TD) elements. Current count: ${o}`}wrapTable(){if(this.wrapper)return;this.wrapper=this.ownerDocument.createElement(`div`),this.wrapper.classList.add(e.classes.wrapper);let t=this.table.parentNode;t.insertBefore(this.wrapper,this.table),t.removeChild(this.table),this.wrapper.appendChild(this.table),this.table.classList.add(e.classes.table)}unwrapTable(){if(this.table.classList.remove(e.classes.table),!this.wrapper)return;let t=this.wrapper.parentNode;t.insertBefore(this.table,this.wrapper),t.removeChild(this.wrapper),this.wrapper=null}assignTableHeaders(){let e,t;for(let t=0;t<this.table.childNodes.length;t++){let n=this.table.childNodes[t];if(n.nodeName===`THEAD`){e=n;break}}if(e){for(let n=0;n<e.childNodes.length;n++){let r=e.childNodes[n];if(r.nodeName===`TR`){t=r;break}}if(t)for(let e=0;e<t.childNodes.length;e++){let n=t.childNodes[e];n.nodeName===`TH`&&this.tableHeaders.push(n)}}}storeOriginalWidths(){this.tableHeaders.forEach(e=>{this.originalWidths.push({el:e,detail:e.style.width})}),this.originalWidths.push({el:this.table,detail:this.table.style.width})}restoreOriginalWidths(){this.originalWidths.forEach(e=>{e.el.style.width=e.detail})}setHeaderWidths(){this.tableHeaders.forEach(e=>{let t=e.offsetWidth,n=this.constrainWidth(e,t);typeof this.options.maxInitialWidthHint==`number`&&(n=Math.min(n,this.options.maxInitialWidthHint)),this.updateWidth(e,n,!0,!1)})}constrainWidth(e,t){let n=t;return n=Math.max(n,this.options.minWidth||-1/0),n=Math.min(n,this.options.maxWidth||1/0),n}createDragHandles(){if(this.dragHandlesContainer!=null)throw`Drag handlers already created. Call <destroyDragHandles> if you wish to recreate them`;this.dragHandlesContainer=this.ownerDocument.createElement(`div`),this.wrapper?.insertBefore(this.dragHandlesContainer,this.table),this.dragHandlesContainer.classList.add(e.classes.handleContainer),this.getResizableHeaders().forEach(()=>{let t=this.ownerDocument.createElement(`div`);t.classList.add(e.classes.handle),this.dragHandlesContainer?.appendChild(t)}),e.events.pointerDown.forEach((e,t)=>{this.dragHandlesContainer?.addEventListener(e,this.onPointerDownRef,!1)})}destroyDragHandles(){this.dragHandlesContainer!==null&&(e.events.pointerDown.forEach((e,t)=>{this.dragHandlesContainer?.removeEventListener(e,this.onPointerDownRef,!1)}),this.dragHandlesContainer?.parentElement?.removeChild(this.dragHandlesContainer))}getDragHandlers(){let t=this.dragHandlesContainer==null?null:this.dragHandlesContainer.querySelectorAll(`.${e.classes.handle}`);return t?Array.prototype.slice.call(t).filter(e=>e.nodeName===`DIV`):[]}restoreColumnWidths(){if(!this.options.store)return;let e=t.generateTableId(this.table);if(e.length===0)return;let n=this.options.store.get(e);n&&(this.getResizableHeaders().forEach(e=>{let r=n.columns[t.generateColumnId(e)];r!==void 0&&t.setWidth(e,r)}),n.table!==void 0&&t.setWidth(this.table,n.table))}checkTableWidth(){let n=this.wrapper.clientWidth,r=n-this.table.offsetWidth;if(r<=0)return;let i=0,a=0,o=[];this.tableHeaders.forEach((t,n)=>{if(t.hasAttribute(e.attributes.dataResizable)){let e={el:t,detail:t.offsetWidth};o.push(e),i+=e.detail}});let s=0,c=null,l;for(;o.length>0;){l=o.shift(),s=r-a,c=l.el;let e=Math.floor(l.detail/i*r);e=Math.min(e,s);let t=this.updateWidth(l.el,l.detail+e,!1,!0);if(a+=t-l.detail,a>=r)break}if(s=r-a,s>0){let e=o[0]?.el||c||this.tableHeaders[this.tableHeaders.length-1],t=e.offsetWidth;this.updateWidth(e,t,!0,!0)}t.setWidth(this.table,n)}syncHandleWidths(){let e=this.table.clientWidth;t.setWidth(this.dragHandlesContainer,e),this.dragHandlesContainer.style.minWidth=`${e}px`;let n=this.getResizableHeaders();this.getDragHandlers().forEach((e,r)=>{let i=(this.options.resizeFromBody?this.table:this.table.tHead).clientHeight;if(r<n.length){let a=n[r],o=a.offsetWidth;o+=t.getOffset(a).left,o-=t.getOffset(this.dragHandlesContainer).left,e.style.left=`${o}px`,e.style.height=`${i}px`}})}getResizableHeaders(){return this.tableHeaders.filter((t,n)=>t.hasAttribute(e.attributes.dataResizable))}handlePointerDown(n){this.handlePointerUp();let i=n?n.target:null;if(i==null||i.nodeName!==`DIV`||!i.classList.contains(e.classes.handle)||typeof n.button==`number`&&n.button!==0)return;let a=i,o=this.getDragHandlers().indexOf(a),s=this.getResizableHeaders();if(o>=s.length)return;let c=Date.now(),l=c-this.lastPointerDown<this.options.doubleClickDelay,u=s[o],d=u.offsetWidth,f={column:d,table:this.table.offsetWidth},p=new r(u,a);p.pointer={x:t.getPointerX(n),isDoubleClick:l},p.originalWidths=f,p.newWidths=f,this.detachHandlers(),this.attachHandlers(),this.table.classList.add(e.classes.tableResizing),this.wrapper.classList.add(e.classes.tableResizing),a.classList.add(e.classes.columnResizing),u.classList.add(e.classes.columnResizing),this.lastPointerDown=c,this.eventData=p;var m=new CustomEvent(e.events.eventResizeStart,{detail:{column:u,columnWidth:d,table:this.table,tableWidth:this.table.clientWidth}});this.table.dispatchEvent(m),n.preventDefault()}handlePointerMove(n){if(!this.eventData||!n)return;let r=(t.getPointerX(n)||0)-(this.eventData.pointer.x||0);if(r===0)return;let i=this.eventData.originalWidths.table+r,a=this.constrainWidth(this.eventData.column,this.eventData.originalWidths.column+r);t.setWidth(this.table,i),t.setWidth(this.eventData.column,a),this.eventData.newWidths={column:a,table:i};var o=new CustomEvent(e.events.eventResize,{detail:{column:this.eventData.column,columnWidth:a,table:this.table,tableWidth:i}});this.table.dispatchEvent(o)}handlePointerUp(){if(this.detachHandlers(),!this.eventData)return;this.eventData.pointer.isDoubleClick&&this.handleDoubleClick(),this.table.classList.remove(e.classes.tableResizing),this.wrapper.classList.remove(e.classes.tableResizing),this.eventData.dragHandler.classList.remove(e.classes.columnResizing),this.eventData.column.classList.remove(e.classes.columnResizing),this.checkTableWidth(),this.syncHandleWidths(),this.refreshWrapperStyle(),this.saveColumnWidths();let t=this.eventData.newWidths||this.eventData.originalWidths;var n=new CustomEvent(e.events.eventResizeStop,{detail:{column:this.eventData.column,columnWidth:t.column,table:this.table,tableWidth:t.table}});this.table.dispatchEvent(n),this.eventData=null}handleDoubleClick(){if(!this.eventData?.column)return;let n=this.eventData.column,r=this.tableHeaders.indexOf(n),i=0,a=[];this.tableHeaders.forEach((t,n)=>{t.hasAttribute(e.attributes.dataResizable)||a.push(n)});let o=this.ownerDocument.createElement(`span`);o.style.position=`absolute`,o.style.left=`-99999px`,o.style.top=`-99999px`,o.style.visibility=`hidden`,this.ownerDocument.body.appendChild(o);let s=this.table.querySelectorAll(`tr`);for(let e=0;e<s.length;e++){let n=s[e].querySelectorAll(`td, th`),c=0;for(let e=0;e<n.length;e++){let s=n[e],l=1;if(s.hasAttribute(`colspan`)){let e=s.getAttribute(`colspan`)||`1`,t=parseInt(e,10);l=Number.isNaN(t)?1:t}if(a.indexOf(e)===-1&&l===1&&c===r){i=Math.max(i,t.getTextWidth(s,o));break}c+=l}}this.ownerDocument.body.removeChild(o);let c=i-n.offsetWidth;if(c===0)return;let l=this.eventData.originalWidths.table+c,u=this.constrainWidth(this.eventData.column,this.eventData.originalWidths.column+c);t.setWidth(this.table,l),t.setWidth(this.eventData.column,u),this.eventData.newWidths={column:u,table:l};var d=new CustomEvent(e.events.eventResize,{detail:{column:this.eventData.column,columnWidth:u,table:this.table,tableWidth:l}});this.table.dispatchEvent(d),this.checkTableWidth(),this.syncHandleWidths(),this.saveColumnWidths()}attachHandlers(){e.events.pointerMove.forEach((e,t)=>{this.ownerDocument.addEventListener(e,this.onPointerMoveRef,!1)}),e.events.pointerUp.forEach((e,t)=>{this.ownerDocument.addEventListener(e,this.onPointerUpRef,!1)})}detachHandlers(){e.events.pointerMove.forEach((e,t)=>{this.ownerDocument.removeEventListener(e,this.onPointerMoveRef,!1)}),e.events.pointerUp.forEach((e,t)=>{this.ownerDocument.removeEventListener(e,this.onPointerUpRef,!1)})}refreshWrapperStyle(){if(this.wrapper==null)return;let e=this.wrapper.style.overflowX;this.wrapper.style.overflowX=`hidden`,this.wrapper.style.overflowX=e}saveColumnWidths(){if(!this.options.store)return;let e=t.generateTableId(this.table);if(e.length===0)return;let n={table:this.table.offsetWidth,columns:{}};this.getResizableHeaders().forEach(e=>{n.columns[t.generateColumnId(e)]=e.offsetWidth}),this.options.store.set(e,n)}createHandlerReferences(){this.onPointerDownRef||=t.debounce(e=>{this.handlePointerDown(e)},100,!0),this.onPointerMoveRef||=t.debounce(e=>{this.handlePointerMove(e)},5,!1),this.onPointerUpRef||=t.debounce(e=>{this.handlePointerUp()},100,!0)}registerWindowResizeHandler(){let n=this.ownerDocument.defaultView;t.windowResizeHandlerRef||(t.windowResizeHandlerRef=t.debounce(t.onWindowResize,50,!1),e.events.windowResize.forEach((e,r)=>{n?.addEventListener(e,t.windowResizeHandlerRef,!1)}))}handleWindowResize(){this.checkTableWidth(),this.syncHandleWidths(),this.saveColumnWidths()}updateWidth(e,n,r,i){let a=e.offsetWidth,o=r?n:this.constrainWidth(e,n);if(t.setWidth(e,o),!i){let e=o-a,n=this.table.offsetWidth+e;t.setWidth(this.table,n)}return o}static onWindowResize(t){let n=t?t.target:null;if(n==null)return;let r=n.document.querySelectorAll(`.${e.classes.table}`);for(let t=0;t<r.length;t++){let n=r[t];typeof n[e.dataPropertyName]==`object`&&n[e.dataPropertyName].handleWindowResize()}}static generateColumnId(t){return(t.getAttribute(e.attributes.dataResizable)||``).trim().replace(/\./g,`_`)}static generateTableId(t){let n=(t.getAttribute(e.attributes.dataResizableTable)||``).trim().replace(/\./g,`_`);return n.length?`rtc/${n}`:n}static setWidth(e,t){let n=t.toFixed(2);n=t>0?n:`0`,e.style.width=`${n}px`}static getInstanceId(){return t.instancesCount++}static debounce=(e,t,n)=>{let r=null;return i=>{let a=()=>{r=null,n||e(i)},o=n&&!r;r&&clearTimeout(r),r=setTimeout(a,t),o&&e(i)}};static getPointerX(e){if(e.type.indexOf(`touch`)===0){let t=e;if(t.touches?.length)return t.touches[0].pageX;if(t.changedTouches?.length)return t.changedTouches[0].pageX}return e.pageX}static getTextWidth(e,t){if(!e||!t)return 0;var n=`${e.textContent?.trim().replace(/\s/g,` `)} `;let r=e.ownerDocument.defaultView?.getComputedStyle(e);return[`fontFamily`,`fontSize`,`fontWeight`,`padding`,`border`,`boxSizing`].forEach(e=>{t.style[e]=r[e]}),t.innerHTML=n,t.offsetWidth}static getOffset(e){if(!e)return{top:0,left:0};let t=e.getBoundingClientRect();return{top:t.top+e.ownerDocument.body.scrollTop,left:t.left+e.ownerDocument.body.scrollLeft}}};exports.PointerData=n,exports.ResizableConstants=e,exports.ResizableEventData=r,exports.ResizableOptions=o,exports.ResizableTableColumns=s,exports.Utilities=i,exports.UtilitiesDOM=a,exports.WidthsData=t;
0 commit comments