@simple-table/react 3.8.2 → 3.8.4

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.
package/dist/cjs/index.js CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react/jsx-runtime"),t=require("react"),n=require("simple-table-core"),r=require("react-dom/server"),s=require("react-dom");function o(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var i=o(t);function c(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var s=0;for(r=Object.getOwnPropertySymbols(e);s<r.length;s++)t.indexOf(r[s])<0&&Object.prototype.propertyIsEnumerable.call(e,r[s])&&(n[r[s]]=e[r[s]])}return n}function u({node:n}){const r=t.useRef(null);return t.useLayoutEffect(()=>{const e=r.current;if(e)return e.appendChild(n),()=>{n.parentNode===e&&e.removeChild(n)}},[n]),e.jsx("span",{ref:r,style:{display:"contents"}})}function a(t){if(null!=t)return"string"==typeof t?t:t instanceof Node?e.jsx(u,{node:t}):void 0}function d(e){return{sortIcon:a(null==e?void 0:e.sortIcon),filterIcon:a(null==e?void 0:e.filterIcon),collapseIcon:a(null==e?void 0:e.collapseIcon),labelContent:a(null==e?void 0:e.labelContent)}}function l(t){if(null!=t){if("string"==typeof t){if(""===t)return;return e.jsx("span",{style:{display:"contents"},dangerouslySetInnerHTML:{__html:t}})}return t instanceof Node?e.jsx(u,{node:t}):void 0}}function f(t,n){return r=>{const s=document.createElement("div");return t.register(e.jsx(n,Object.assign({},r)),s),s}}function h(t,n){return r=>{const s=document.createElement("div"),o=Object.assign(Object.assign({},r),{components:(i=r.components,{expandIcon:a(i.expandIcon),checkbox:a(i.checkbox),dragIcon:a(i.dragIcon),labelContent:a(i.labelContent),pinIcon:a(i.pinIcon)})});var i;return t.register(e.jsx(n,Object.assign({},o)),s),s}}function p(t,n){return r=>{const s=document.createElement("div"),o=Object.assign(Object.assign({},r),{searchSection:r.searchSection?a(r.searchSection):null,listSection:a(r.listSection),resetSection:r.resetSection?a(r.resetSection):null});return t.register(e.jsx(n,Object.assign({},o)),s),s}}function m(t){const n=document.createElement("div");return n.innerHTML=r.renderToStaticMarkup(e.jsx(e.Fragment,{children:t})),function(e){const t=Array.from(e.childNodes).filter(e=>e.nodeType!==Node.TEXT_NODE||null!=e.textContent&&""!==e.textContent.trim());return 1===t.length&&t[0]instanceof HTMLElement?(e.removeChild(t[0]),t[0]):e}(n)}function g(t){return r.renderToStaticMarkup(e.jsx(e.Fragment,{children:t}))}function b(e){return"function"==typeof e}function S(t,n){const{cellRenderer:r,headerRenderer:s,children:o,nestedTable:i}=t,u=c(t,["cellRenderer","headerRenderer","children","nestedTable"]),a=Object.assign({},u);if(r&&(a.cellRenderer=function(t,n){return r=>{const s=document.createElement("div");return s.style.display="contents",t.register(e.jsx(n,Object.assign({},r)),s),s}}(n,r)),s&&(a.headerRenderer=function(t,n){return r=>{const s=document.createElement("div"),o=Object.assign(Object.assign({},r),{components:d(r.components)});return t.register(e.jsx(n,Object.assign({},o)),s),s}}(n,s)),o&&(a.children=o.map(e=>S(e,n))),i){const e=Object.assign(Object.assign({},i),{rows:[]});a.nestedTable=j(e,n)}return a}function j(t,n){const{defaultHeaders:r,rows:s,footerRenderer:o,emptyStateRenderer:i,errorStateRenderer:u,loadingStateRenderer:a,tableEmptyStateRenderer:j,headerDropdown:y,columnEditorConfig:O,icons:v,onColumnOrderChange:R,onColumnWidthChange:E,onHeaderEdit:x,onColumnSelect:C}=t,I=c(t,["defaultHeaders","rows","footerRenderer","emptyStateRenderer","errorStateRenderer","loadingStateRenderer","tableEmptyStateRenderer","headerDropdown","columnEditorConfig","icons","onColumnOrderChange","onColumnWidthChange","onHeaderEdit","onColumnSelect"]),w=Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},I),{rows:s,defaultHeaders:r.map(e=>S(e,n))}),R?{onColumnOrderChange:e=>R(e)}:{}),E?{onColumnWidthChange:e=>E(e)}:{}),x?{onHeaderEdit:(e,t)=>x(e,t)}:{}),C?{onColumnSelect:e=>C(e)}:{});if(void 0!==o&&(w.footerRenderer=function(t,n){return r=>{const s=document.createElement("div"),o=Object.assign(Object.assign({},r),{nextIcon:l((i={nextIcon:r.nextIcon,prevIcon:r.prevIcon}).nextIcon),prevIcon:l(i.prevIcon)});var i;return t.register(e.jsx(n,Object.assign({},o)),s),s}}(n,o)),void 0!==i)if(b(i))w.emptyStateRenderer=f(n,i);else{const e=i;w.emptyStateRenderer=()=>m(e)}if(void 0!==u)if(b(u))w.errorStateRenderer=f(n,u);else{const e=u;w.errorStateRenderer=()=>m(e)}if(void 0!==a)if(b(a))w.loadingStateRenderer=f(n,a);else{const e=a;w.loadingStateRenderer=()=>m(e)}return void 0!==j&&(w.tableEmptyStateRenderer=null===j?null:m(j)),void 0!==y&&(w.headerDropdown=function(t,n){return r=>{const s=document.createElement("div"),o=Object.assign(Object.assign({},r),{components:d(r.components)});return t.register(e.jsx(n,Object.assign({},o)),s),s}}(n,y)),void 0!==O&&(w.columnEditorConfig=function(e,t){const{rowRenderer:n,customRenderer:r}=e,s=c(e,["rowRenderer","customRenderer"]);return Object.assign(Object.assign(Object.assign({},s),n?{rowRenderer:h(t,n)}:{}),r?{customRenderer:p(t,r)}:{})}(O,n)),void 0!==v&&(w.icons=function(e){const t={};for(const[n,r]of Object.entries(e))null!=r&&(t[n]="string"==typeof r||r instanceof HTMLElement||r instanceof SVGElement?r:g(r));return t}(v)),w}"function"==typeof SuppressedError&&SuppressedError;class y{constructor(){this.entries=new Map,this.listeners=new Set,this.nextId=0,this.cachedSnapshot=[],this.snapshotDirty=!0,this.emitScheduled=!1,this.pruneScheduled=!1,this.subscribe=e=>(this.listeners.add(e),()=>{this.listeners.delete(e)}),this.getSnapshot=()=>(this.snapshotDirty&&(this.cachedSnapshot=Array.from(this.entries.values()),this.snapshotDirty=!1),this.cachedSnapshot)}register(e,t){const n="st-portal-"+this.nextId++;return this.entries.set(n,{id:n,container:t,node:e}),this.scheduleEmit(),{id:n,unregister:()=>this.unregister(n)}}unregister(e){this.entries.delete(e)&&this.scheduleEmit()}attach(e){const t=new MutationObserver(()=>this.schedulePrune());return t.observe(e,{childList:!0,subtree:!0}),()=>t.disconnect()}clear(){0!==this.entries.size&&(this.entries.clear(),this.emit())}emit(){this.snapshotDirty=!0;for(const e of this.listeners)e()}scheduleEmit(){this.emitScheduled||(this.emitScheduled=!0,queueMicrotask(()=>{this.emitScheduled=!1,this.emit()}))}schedulePrune(){this.pruneScheduled||(this.pruneScheduled=!0,queueMicrotask(()=>{this.pruneScheduled=!1;let e=!1;for(const[t,n]of this.entries)n.container.isConnected||(this.entries.delete(t),e=!0);e&&this.emit()}))}}class O extends i.default.Component{constructor(){super(...arguments),this.state={hasError:!1}}static getDerivedStateFromError(){return{hasError:!0}}componentDidCatch(e){console.error("[simple-table] A custom renderer threw while rendering:",e)}render(){return this.state.hasError?null:this.props.children}}const v=i.default.forwardRef(function(r,o){const i=t.useRef(null),u=t.useRef(null);null===u.current&&(u.current=new y);const a=u.current,d=t.useRef(null),l=t.useRef(void 0),f=t.useRef(null),h=r;t.useLayoutEffect(()=>{const e=i.current;if(!e)return;const t=new n.SimpleTableVanilla(e,j(h,a));t.mount(),d.current=t,f.current=h,l.current=h.defaultHeaders;const r=a.attach(e);if(o){const e=t.getAPI();"function"==typeof o?o(e):o.current=e}return()=>{r(),t.destroy(),d.current=null,l.current=void 0,f.current=null,a.clear(),o&&"function"!=typeof o&&(o.current=null)}},[]),t.useLayoutEffect(()=>{const e=d.current;if(!e)return;if(null!==f.current&&!function(e,t){const n=new Set([...Object.keys(e),...Object.keys(t)]);for(const r of n)if(e[r]!==t[r])return!0;return!1}(f.current,h))return;f.current=h;const t=j(h,a);if(l.current!==h.defaultHeaders)return l.current=h.defaultHeaders,void e.update(t);const n=c(t,["defaultHeaders"]);e.update(n)},[h]);const p=function(n){return t.useSyncExternalStore(n.subscribe,n.getSnapshot,n.getSnapshot).map(t=>s.createPortal(e.jsx(O,{children:t.node}),t.container,t.id))}(a),m=t.useRef(!1);return t.useLayoutEffect(()=>{var e;if(m.current)return;const t=d.current;t&&Array.isArray(p)&&p.length>0&&(m.current=!0,null===(e=t.refitAutoSizeColumns)||void 0===e||e.call(t))},[p]),e.jsxs(e.Fragment,{children:[e.jsx("div",{ref:i}),p]})});v.displayName="SimpleTable",Object.defineProperty(exports,"asRows",{enumerable:!0,get:function(){return n.asRows}}),exports.SimpleTable=v;
1
+ "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e=require("react/jsx-runtime"),t=require("react"),n=require("simple-table-core"),r=require("react-dom/server"),s=require("react-dom");function o(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var i=o(t);function c(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var s=0;for(r=Object.getOwnPropertySymbols(e);s<r.length;s++)t.indexOf(r[s])<0&&Object.prototype.propertyIsEnumerable.call(e,r[s])&&(n[r[s]]=e[r[s]])}return n}function u({node:n}){const r=t.useRef(null);return t.useLayoutEffect(()=>{const e=r.current;if(e)return e.appendChild(n),()=>{n.parentNode===e&&e.removeChild(n)}},[n]),e.jsx("span",{ref:r,style:{display:"contents"}})}function a(t){if(null!=t)return"string"==typeof t?t:t instanceof Node?e.jsx(u,{node:t}):void 0}function d(e){return{sortIcon:a(null==e?void 0:e.sortIcon),filterIcon:a(null==e?void 0:e.filterIcon),collapseIcon:a(null==e?void 0:e.collapseIcon),labelContent:a(null==e?void 0:e.labelContent)}}function l(t){if(null!=t){if("string"==typeof t){if(""===t)return;return e.jsx("span",{style:{display:"contents"},dangerouslySetInnerHTML:{__html:t}})}return t instanceof Node?e.jsx(u,{node:t}):void 0}}function f(t,n){return r=>{const s=document.createElement("div");return t.register(e.jsx(n,Object.assign({},r)),s),s}}function h(t,n){return r=>{const s=document.createElement("div"),o=Object.assign(Object.assign({},r),{components:(i=r.components,{expandIcon:a(i.expandIcon),checkbox:a(i.checkbox),dragIcon:a(i.dragIcon),labelContent:a(i.labelContent),pinIcon:a(i.pinIcon)})});var i;return t.register(e.jsx(n,Object.assign({},o)),s),s}}function p(t,n){return r=>{const s=document.createElement("div"),o=Object.assign(Object.assign({},r),{searchSection:r.searchSection?a(r.searchSection):null,listSection:a(r.listSection),resetSection:r.resetSection?a(r.resetSection):null});return t.register(e.jsx(n,Object.assign({},o)),s),s}}function m(t){const n=document.createElement("div");return n.innerHTML=r.renderToStaticMarkup(e.jsx(e.Fragment,{children:t})),function(e){const t=Array.from(e.childNodes).filter(e=>e.nodeType!==Node.TEXT_NODE||null!=e.textContent&&""!==e.textContent.trim());return 1===t.length&&t[0]instanceof HTMLElement?(e.removeChild(t[0]),t[0]):e}(n)}function g(t){return r.renderToStaticMarkup(e.jsx(e.Fragment,{children:t}))}function b(e){return"function"==typeof e}function j(t,n){const{cellRenderer:r,headerRenderer:s,children:o,nestedTable:i}=t,u=c(t,["cellRenderer","headerRenderer","children","nestedTable"]),a=Object.assign({},u);if(r&&(a.cellRenderer=function(t,n){return r=>{const s=document.createElement("div");return s.style.display="contents",t.register(e.jsx(n,Object.assign({},r)),s),s}}(n,r)),s&&(a.headerRenderer=function(t,n){return r=>{const s=document.createElement("div"),o=Object.assign(Object.assign({},r),{components:d(r.components)});return t.register(e.jsx(n,Object.assign({},o)),s),s}}(n,s)),o&&(a.children=o.map(e=>j(e,n))),i){const e=Object.assign(Object.assign({},i),{rows:[]});a.nestedTable=S(e,n)}return a}function S(t,n){const{defaultHeaders:r,rows:s,footerRenderer:o,emptyStateRenderer:i,errorStateRenderer:u,loadingStateRenderer:a,tableEmptyStateRenderer:S,headerDropdown:y,columnEditorConfig:v,icons:O,rowButtons:R,onColumnOrderChange:E,onColumnWidthChange:x,onHeaderEdit:C,onColumnSelect:w}=t,I=c(t,["defaultHeaders","rows","footerRenderer","emptyStateRenderer","errorStateRenderer","loadingStateRenderer","tableEmptyStateRenderer","headerDropdown","columnEditorConfig","icons","rowButtons","onColumnOrderChange","onColumnWidthChange","onHeaderEdit","onColumnSelect"]),T=Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},I),{rows:s,defaultHeaders:r.map(e=>j(e,n))}),E?{onColumnOrderChange:e=>E(e)}:{}),x?{onColumnWidthChange:e=>x(e)}:{}),C?{onHeaderEdit:(e,t)=>C(e,t)}:{}),w?{onColumnSelect:e=>w(e)}:{});if(void 0!==o&&(T.footerRenderer=function(t,n){return r=>{const s=document.createElement("div"),o=Object.assign(Object.assign({},r),{nextIcon:l((i={nextIcon:r.nextIcon,prevIcon:r.prevIcon}).nextIcon),prevIcon:l(i.prevIcon)});var i;return t.register(e.jsx(n,Object.assign({},o)),s),s}}(n,o)),void 0!==i)if(b(i))T.emptyStateRenderer=f(n,i);else{const e=i;T.emptyStateRenderer=()=>m(e)}if(void 0!==u)if(b(u))T.errorStateRenderer=f(n,u);else{const e=u;T.errorStateRenderer=()=>m(e)}if(void 0!==a)if(b(a))T.loadingStateRenderer=f(n,a);else{const e=a;T.loadingStateRenderer=()=>m(e)}return void 0!==S&&(T.tableEmptyStateRenderer=null===S?null:m(S)),void 0!==y&&(T.headerDropdown=function(t,n){return r=>{const s=document.createElement("div"),o=Object.assign(Object.assign({},r),{components:d(r.components)});return t.register(e.jsx(n,Object.assign({},o)),s),s}}(n,y)),void 0!==v&&(T.columnEditorConfig=function(e,t){const{rowRenderer:n,customRenderer:r}=e,s=c(e,["rowRenderer","customRenderer"]);return Object.assign(Object.assign(Object.assign({},s),n?{rowRenderer:h(t,n)}:{}),r?{customRenderer:p(t,r)}:{})}(v,n)),void 0!==O&&(T.icons=function(e){const t={};for(const[n,r]of Object.entries(e))null!=r&&(t[n]="string"==typeof r||r instanceof HTMLElement||r instanceof SVGElement?r:g(r));return t}(O)),void 0!==R&&(T.rowButtons=R.map(t=>function(t,n){return r=>{const s=document.createElement("div");return s.style.display="contents",t.register(e.jsx(n,Object.assign({},r)),s),s}}(n,t))),T}"function"==typeof SuppressedError&&SuppressedError;class y{constructor(){this.entries=new Map,this.listeners=new Set,this.nextId=0,this.cachedSnapshot=[],this.snapshotDirty=!0,this.emitScheduled=!1,this.pruneScheduled=!1,this.subscribe=e=>(this.listeners.add(e),()=>{this.listeners.delete(e)}),this.getSnapshot=()=>(this.snapshotDirty&&(this.cachedSnapshot=Array.from(this.entries.values()),this.snapshotDirty=!1),this.cachedSnapshot)}register(e,t){const n="st-portal-"+this.nextId++;return this.entries.set(n,{id:n,container:t,node:e}),this.scheduleEmit(),{id:n,unregister:()=>this.unregister(n)}}unregister(e){this.entries.delete(e)&&this.scheduleEmit()}attach(e){const t=new MutationObserver(()=>this.schedulePrune());return t.observe(e,{childList:!0,subtree:!0}),()=>t.disconnect()}clear(){0!==this.entries.size&&(this.entries.clear(),this.emit())}emit(){this.snapshotDirty=!0;for(const e of this.listeners)e()}scheduleEmit(){this.emitScheduled||(this.emitScheduled=!0,queueMicrotask(()=>{this.emitScheduled=!1,this.emit()}))}schedulePrune(){this.pruneScheduled||(this.pruneScheduled=!0,queueMicrotask(()=>{this.pruneScheduled=!1;let e=!1;for(const[t,n]of this.entries)n.container.isConnected||(this.entries.delete(t),e=!0);e&&this.emit()}))}}class v extends i.default.Component{constructor(){super(...arguments),this.state={hasError:!1}}static getDerivedStateFromError(){return{hasError:!0}}componentDidCatch(e){console.error("[simple-table] A custom renderer threw while rendering:",e)}render(){return this.state.hasError?null:this.props.children}}const O=i.default.forwardRef(function(r,o){const i=t.useRef(null),u=t.useRef(null);null===u.current&&(u.current=new y);const a=u.current,d=t.useRef(null),l=t.useRef(void 0),f=t.useRef(null),h=r;t.useLayoutEffect(()=>{const e=i.current;if(!e)return;const t=new n.SimpleTableVanilla(e,S(h,a));t.mount(),d.current=t,f.current=h,l.current=h.defaultHeaders;const r=a.attach(e);if(o){const e=t.getAPI();"function"==typeof o?o(e):o.current=e}return()=>{r(),t.destroy(),d.current=null,l.current=void 0,f.current=null,a.clear(),o&&"function"!=typeof o&&(o.current=null)}},[]),t.useLayoutEffect(()=>{const e=d.current;if(!e)return;if(null!==f.current&&!function(e,t){const n=new Set([...Object.keys(e),...Object.keys(t)]);for(const r of n)if(e[r]!==t[r])return!0;return!1}(f.current,h))return;f.current=h;const t=S(h,a);if(l.current!==h.defaultHeaders)return l.current=h.defaultHeaders,void e.update(t);const n=c(t,["defaultHeaders"]);e.update(n)},[h]);const p=function(n){return t.useSyncExternalStore(n.subscribe,n.getSnapshot,n.getSnapshot).map(t=>s.createPortal(e.jsx(v,{children:t.node}),t.container,t.id))}(a),m=t.useRef(!1);return t.useLayoutEffect(()=>{var e;if(m.current)return;const t=d.current;t&&Array.isArray(p)&&p.length>0&&(m.current=!0,null===(e=t.refitAutoSizeColumns)||void 0===e||e.call(t))},[p]),e.jsxs(e.Fragment,{children:[e.jsx("div",{ref:i}),p]})});O.displayName="SimpleTable",Object.defineProperty(exports,"asRows",{enumerable:!0,get:function(){return n.asRows}}),exports.SimpleTable=O;
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.es.js CHANGED
@@ -1,2 +1,2 @@
1
- import{jsx as e,Fragment as t,jsxs as n}from"react/jsx-runtime";import r,{useRef as o,useLayoutEffect as s,useSyncExternalStore as i}from"react";import{SimpleTableVanilla as c}from"simple-table-core";export{asRows}from"simple-table-core";import{renderToStaticMarkup as d}from"react-dom/server";import{createPortal as u}from"react-dom";function l(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&Object.prototype.propertyIsEnumerable.call(e,r[o])&&(n[r[o]]=e[r[o]])}return n}function a({node:t}){const n=o(null);return s(()=>{const e=n.current;if(e)return e.appendChild(t),()=>{t.parentNode===e&&e.removeChild(t)}},[t]),e("span",{ref:n,style:{display:"contents"}})}function h(t){if(null!=t)return"string"==typeof t?t:t instanceof Node?e(a,{node:t}):void 0}function f(e){return{sortIcon:h(null==e?void 0:e.sortIcon),filterIcon:h(null==e?void 0:e.filterIcon),collapseIcon:h(null==e?void 0:e.collapseIcon),labelContent:h(null==e?void 0:e.labelContent)}}function m(t){if(null!=t){if("string"==typeof t){if(""===t)return;return e("span",{style:{display:"contents"},dangerouslySetInnerHTML:{__html:t}})}return t instanceof Node?e(a,{node:t}):void 0}}function p(t,n){return r=>{const o=document.createElement("div");return t.register(e(n,Object.assign({},r)),o),o}}function g(t,n){return r=>{const o=document.createElement("div"),s=Object.assign(Object.assign({},r),{components:(i=r.components,{expandIcon:h(i.expandIcon),checkbox:h(i.checkbox),dragIcon:h(i.dragIcon),labelContent:h(i.labelContent),pinIcon:h(i.pinIcon)})});var i;return t.register(e(n,Object.assign({},s)),o),o}}function b(t,n){return r=>{const o=document.createElement("div"),s=Object.assign(Object.assign({},r),{searchSection:r.searchSection?h(r.searchSection):null,listSection:h(r.listSection),resetSection:r.resetSection?h(r.resetSection):null});return t.register(e(n,Object.assign({},s)),o),o}}function S(n){const r=document.createElement("div");return r.innerHTML=d(e(t,{children:n})),function(e){const t=Array.from(e.childNodes).filter(e=>e.nodeType!==Node.TEXT_NODE||null!=e.textContent&&""!==e.textContent.trim());return 1===t.length&&t[0]instanceof HTMLElement?(e.removeChild(t[0]),t[0]):e}(r)}function O(n){return d(e(t,{children:n}))}function v(e){return"function"==typeof e}function y(t,n){const{cellRenderer:r,headerRenderer:o,children:s,nestedTable:i}=t,c=l(t,["cellRenderer","headerRenderer","children","nestedTable"]),d=Object.assign({},c);if(r&&(d.cellRenderer=function(t,n){return r=>{const o=document.createElement("div");return o.style.display="contents",t.register(e(n,Object.assign({},r)),o),o}}(n,r)),o&&(d.headerRenderer=function(t,n){return r=>{const o=document.createElement("div"),s=Object.assign(Object.assign({},r),{components:f(r.components)});return t.register(e(n,Object.assign({},s)),o),o}}(n,o)),s&&(d.children=s.map(e=>y(e,n))),i){const e=Object.assign(Object.assign({},i),{rows:[]});d.nestedTable=j(e,n)}return d}function j(t,n){const{defaultHeaders:r,rows:o,footerRenderer:s,emptyStateRenderer:i,errorStateRenderer:c,loadingStateRenderer:d,tableEmptyStateRenderer:u,headerDropdown:a,columnEditorConfig:h,icons:j,onColumnOrderChange:E,onColumnWidthChange:R,onHeaderEdit:C,onColumnSelect:I}=t,w=l(t,["defaultHeaders","rows","footerRenderer","emptyStateRenderer","errorStateRenderer","loadingStateRenderer","tableEmptyStateRenderer","headerDropdown","columnEditorConfig","icons","onColumnOrderChange","onColumnWidthChange","onHeaderEdit","onColumnSelect"]),x=Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},w),{rows:o,defaultHeaders:r.map(e=>y(e,n))}),E?{onColumnOrderChange:e=>E(e)}:{}),R?{onColumnWidthChange:e=>R(e)}:{}),C?{onHeaderEdit:(e,t)=>C(e,t)}:{}),I?{onColumnSelect:e=>I(e)}:{});if(void 0!==s&&(x.footerRenderer=function(t,n){return r=>{const o=document.createElement("div"),s=Object.assign(Object.assign({},r),{nextIcon:m((i={nextIcon:r.nextIcon,prevIcon:r.prevIcon}).nextIcon),prevIcon:m(i.prevIcon)});var i;return t.register(e(n,Object.assign({},s)),o),o}}(n,s)),void 0!==i)if(v(i))x.emptyStateRenderer=p(n,i);else{const e=i;x.emptyStateRenderer=()=>S(e)}if(void 0!==c)if(v(c))x.errorStateRenderer=p(n,c);else{const e=c;x.errorStateRenderer=()=>S(e)}if(void 0!==d)if(v(d))x.loadingStateRenderer=p(n,d);else{const e=d;x.loadingStateRenderer=()=>S(e)}return void 0!==u&&(x.tableEmptyStateRenderer=null===u?null:S(u)),void 0!==a&&(x.headerDropdown=function(t,n){return r=>{const o=document.createElement("div"),s=Object.assign(Object.assign({},r),{components:f(r.components)});return t.register(e(n,Object.assign({},s)),o),o}}(n,a)),void 0!==h&&(x.columnEditorConfig=function(e,t){const{rowRenderer:n,customRenderer:r}=e,o=l(e,["rowRenderer","customRenderer"]);return Object.assign(Object.assign(Object.assign({},o),n?{rowRenderer:g(t,n)}:{}),r?{customRenderer:b(t,r)}:{})}(h,n)),void 0!==j&&(x.icons=function(e){const t={};for(const[n,r]of Object.entries(e))null!=r&&(t[n]="string"==typeof r||r instanceof HTMLElement||r instanceof SVGElement?r:O(r));return t}(j)),x}"function"==typeof SuppressedError&&SuppressedError;class E{constructor(){this.entries=new Map,this.listeners=new Set,this.nextId=0,this.cachedSnapshot=[],this.snapshotDirty=!0,this.emitScheduled=!1,this.pruneScheduled=!1,this.subscribe=e=>(this.listeners.add(e),()=>{this.listeners.delete(e)}),this.getSnapshot=()=>(this.snapshotDirty&&(this.cachedSnapshot=Array.from(this.entries.values()),this.snapshotDirty=!1),this.cachedSnapshot)}register(e,t){const n="st-portal-"+this.nextId++;return this.entries.set(n,{id:n,container:t,node:e}),this.scheduleEmit(),{id:n,unregister:()=>this.unregister(n)}}unregister(e){this.entries.delete(e)&&this.scheduleEmit()}attach(e){const t=new MutationObserver(()=>this.schedulePrune());return t.observe(e,{childList:!0,subtree:!0}),()=>t.disconnect()}clear(){0!==this.entries.size&&(this.entries.clear(),this.emit())}emit(){this.snapshotDirty=!0;for(const e of this.listeners)e()}scheduleEmit(){this.emitScheduled||(this.emitScheduled=!0,queueMicrotask(()=>{this.emitScheduled=!1,this.emit()}))}schedulePrune(){this.pruneScheduled||(this.pruneScheduled=!0,queueMicrotask(()=>{this.pruneScheduled=!1;let e=!1;for(const[t,n]of this.entries)n.container.isConnected||(this.entries.delete(t),e=!0);e&&this.emit()}))}}class R extends r.Component{constructor(){super(...arguments),this.state={hasError:!1}}static getDerivedStateFromError(){return{hasError:!0}}componentDidCatch(e){console.error("[simple-table] A custom renderer threw while rendering:",e)}render(){return this.state.hasError?null:this.props.children}}const C=r.forwardRef(function(r,d){const a=o(null),h=o(null);null===h.current&&(h.current=new E);const f=h.current,m=o(null),p=o(void 0),g=o(null),b=r;s(()=>{const e=a.current;if(!e)return;const t=new c(e,j(b,f));t.mount(),m.current=t,g.current=b,p.current=b.defaultHeaders;const n=f.attach(e);if(d){const e=t.getAPI();"function"==typeof d?d(e):d.current=e}return()=>{n(),t.destroy(),m.current=null,p.current=void 0,g.current=null,f.clear(),d&&"function"!=typeof d&&(d.current=null)}},[]),s(()=>{const e=m.current;if(!e)return;if(null!==g.current&&!function(e,t){const n=new Set([...Object.keys(e),...Object.keys(t)]);for(const r of n)if(e[r]!==t[r])return!0;return!1}(g.current,b))return;g.current=b;const t=j(b,f);if(p.current!==b.defaultHeaders)return p.current=b.defaultHeaders,void e.update(t);const n=l(t,["defaultHeaders"]);e.update(n)},[b]);const S=function(t){return i(t.subscribe,t.getSnapshot,t.getSnapshot).map(t=>u(e(R,{children:t.node}),t.container,t.id))}(f),O=o(!1);return s(()=>{var e;if(O.current)return;const t=m.current;t&&Array.isArray(S)&&S.length>0&&(O.current=!0,null===(e=t.refitAutoSizeColumns)||void 0===e||e.call(t))},[S]),n(t,{children:[e("div",{ref:a}),S]})});C.displayName="SimpleTable";export{C as SimpleTable};
1
+ import{jsx as e,Fragment as t,jsxs as n}from"react/jsx-runtime";import r,{useRef as o,useLayoutEffect as s,useSyncExternalStore as i}from"react";import{SimpleTableVanilla as c}from"simple-table-core";export{asRows}from"simple-table-core";import{renderToStaticMarkup as u}from"react-dom/server";import{createPortal as d}from"react-dom";function l(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&Object.prototype.propertyIsEnumerable.call(e,r[o])&&(n[r[o]]=e[r[o]])}return n}function a({node:t}){const n=o(null);return s(()=>{const e=n.current;if(e)return e.appendChild(t),()=>{t.parentNode===e&&e.removeChild(t)}},[t]),e("span",{ref:n,style:{display:"contents"}})}function h(t){if(null!=t)return"string"==typeof t?t:t instanceof Node?e(a,{node:t}):void 0}function f(e){return{sortIcon:h(null==e?void 0:e.sortIcon),filterIcon:h(null==e?void 0:e.filterIcon),collapseIcon:h(null==e?void 0:e.collapseIcon),labelContent:h(null==e?void 0:e.labelContent)}}function m(t){if(null!=t){if("string"==typeof t){if(""===t)return;return e("span",{style:{display:"contents"},dangerouslySetInnerHTML:{__html:t}})}return t instanceof Node?e(a,{node:t}):void 0}}function p(t,n){return r=>{const o=document.createElement("div");return t.register(e(n,Object.assign({},r)),o),o}}function g(t,n){return r=>{const o=document.createElement("div"),s=Object.assign(Object.assign({},r),{components:(i=r.components,{expandIcon:h(i.expandIcon),checkbox:h(i.checkbox),dragIcon:h(i.dragIcon),labelContent:h(i.labelContent),pinIcon:h(i.pinIcon)})});var i;return t.register(e(n,Object.assign({},s)),o),o}}function b(t,n){return r=>{const o=document.createElement("div"),s=Object.assign(Object.assign({},r),{searchSection:r.searchSection?h(r.searchSection):null,listSection:h(r.listSection),resetSection:r.resetSection?h(r.resetSection):null});return t.register(e(n,Object.assign({},s)),o),o}}function S(n){const r=document.createElement("div");return r.innerHTML=u(e(t,{children:n})),function(e){const t=Array.from(e.childNodes).filter(e=>e.nodeType!==Node.TEXT_NODE||null!=e.textContent&&""!==e.textContent.trim());return 1===t.length&&t[0]instanceof HTMLElement?(e.removeChild(t[0]),t[0]):e}(r)}function O(n){return u(e(t,{children:n}))}function v(e){return"function"==typeof e}function y(t,n){const{cellRenderer:r,headerRenderer:o,children:s,nestedTable:i}=t,c=l(t,["cellRenderer","headerRenderer","children","nestedTable"]),u=Object.assign({},c);if(r&&(u.cellRenderer=function(t,n){return r=>{const o=document.createElement("div");return o.style.display="contents",t.register(e(n,Object.assign({},r)),o),o}}(n,r)),o&&(u.headerRenderer=function(t,n){return r=>{const o=document.createElement("div"),s=Object.assign(Object.assign({},r),{components:f(r.components)});return t.register(e(n,Object.assign({},s)),o),o}}(n,o)),s&&(u.children=s.map(e=>y(e,n))),i){const e=Object.assign(Object.assign({},i),{rows:[]});u.nestedTable=j(e,n)}return u}function j(t,n){const{defaultHeaders:r,rows:o,footerRenderer:s,emptyStateRenderer:i,errorStateRenderer:c,loadingStateRenderer:u,tableEmptyStateRenderer:d,headerDropdown:a,columnEditorConfig:h,icons:j,rowButtons:E,onColumnOrderChange:R,onColumnWidthChange:C,onHeaderEdit:w,onColumnSelect:I}=t,x=l(t,["defaultHeaders","rows","footerRenderer","emptyStateRenderer","errorStateRenderer","loadingStateRenderer","tableEmptyStateRenderer","headerDropdown","columnEditorConfig","icons","rowButtons","onColumnOrderChange","onColumnWidthChange","onHeaderEdit","onColumnSelect"]),H=Object.assign(Object.assign(Object.assign(Object.assign(Object.assign(Object.assign({},x),{rows:o,defaultHeaders:r.map(e=>y(e,n))}),R?{onColumnOrderChange:e=>R(e)}:{}),C?{onColumnWidthChange:e=>C(e)}:{}),w?{onHeaderEdit:(e,t)=>w(e,t)}:{}),I?{onColumnSelect:e=>I(e)}:{});if(void 0!==s&&(H.footerRenderer=function(t,n){return r=>{const o=document.createElement("div"),s=Object.assign(Object.assign({},r),{nextIcon:m((i={nextIcon:r.nextIcon,prevIcon:r.prevIcon}).nextIcon),prevIcon:m(i.prevIcon)});var i;return t.register(e(n,Object.assign({},s)),o),o}}(n,s)),void 0!==i)if(v(i))H.emptyStateRenderer=p(n,i);else{const e=i;H.emptyStateRenderer=()=>S(e)}if(void 0!==c)if(v(c))H.errorStateRenderer=p(n,c);else{const e=c;H.errorStateRenderer=()=>S(e)}if(void 0!==u)if(v(u))H.loadingStateRenderer=p(n,u);else{const e=u;H.loadingStateRenderer=()=>S(e)}return void 0!==d&&(H.tableEmptyStateRenderer=null===d?null:S(d)),void 0!==a&&(H.headerDropdown=function(t,n){return r=>{const o=document.createElement("div"),s=Object.assign(Object.assign({},r),{components:f(r.components)});return t.register(e(n,Object.assign({},s)),o),o}}(n,a)),void 0!==h&&(H.columnEditorConfig=function(e,t){const{rowRenderer:n,customRenderer:r}=e,o=l(e,["rowRenderer","customRenderer"]);return Object.assign(Object.assign(Object.assign({},o),n?{rowRenderer:g(t,n)}:{}),r?{customRenderer:b(t,r)}:{})}(h,n)),void 0!==j&&(H.icons=function(e){const t={};for(const[n,r]of Object.entries(e))null!=r&&(t[n]="string"==typeof r||r instanceof HTMLElement||r instanceof SVGElement?r:O(r));return t}(j)),void 0!==E&&(H.rowButtons=E.map(t=>function(t,n){return r=>{const o=document.createElement("div");return o.style.display="contents",t.register(e(n,Object.assign({},r)),o),o}}(n,t))),H}"function"==typeof SuppressedError&&SuppressedError;class E{constructor(){this.entries=new Map,this.listeners=new Set,this.nextId=0,this.cachedSnapshot=[],this.snapshotDirty=!0,this.emitScheduled=!1,this.pruneScheduled=!1,this.subscribe=e=>(this.listeners.add(e),()=>{this.listeners.delete(e)}),this.getSnapshot=()=>(this.snapshotDirty&&(this.cachedSnapshot=Array.from(this.entries.values()),this.snapshotDirty=!1),this.cachedSnapshot)}register(e,t){const n="st-portal-"+this.nextId++;return this.entries.set(n,{id:n,container:t,node:e}),this.scheduleEmit(),{id:n,unregister:()=>this.unregister(n)}}unregister(e){this.entries.delete(e)&&this.scheduleEmit()}attach(e){const t=new MutationObserver(()=>this.schedulePrune());return t.observe(e,{childList:!0,subtree:!0}),()=>t.disconnect()}clear(){0!==this.entries.size&&(this.entries.clear(),this.emit())}emit(){this.snapshotDirty=!0;for(const e of this.listeners)e()}scheduleEmit(){this.emitScheduled||(this.emitScheduled=!0,queueMicrotask(()=>{this.emitScheduled=!1,this.emit()}))}schedulePrune(){this.pruneScheduled||(this.pruneScheduled=!0,queueMicrotask(()=>{this.pruneScheduled=!1;let e=!1;for(const[t,n]of this.entries)n.container.isConnected||(this.entries.delete(t),e=!0);e&&this.emit()}))}}class R extends r.Component{constructor(){super(...arguments),this.state={hasError:!1}}static getDerivedStateFromError(){return{hasError:!0}}componentDidCatch(e){console.error("[simple-table] A custom renderer threw while rendering:",e)}render(){return this.state.hasError?null:this.props.children}}const C=r.forwardRef(function(r,u){const a=o(null),h=o(null);null===h.current&&(h.current=new E);const f=h.current,m=o(null),p=o(void 0),g=o(null),b=r;s(()=>{const e=a.current;if(!e)return;const t=new c(e,j(b,f));t.mount(),m.current=t,g.current=b,p.current=b.defaultHeaders;const n=f.attach(e);if(u){const e=t.getAPI();"function"==typeof u?u(e):u.current=e}return()=>{n(),t.destroy(),m.current=null,p.current=void 0,g.current=null,f.clear(),u&&"function"!=typeof u&&(u.current=null)}},[]),s(()=>{const e=m.current;if(!e)return;if(null!==g.current&&!function(e,t){const n=new Set([...Object.keys(e),...Object.keys(t)]);for(const r of n)if(e[r]!==t[r])return!0;return!1}(g.current,b))return;g.current=b;const t=j(b,f);if(p.current!==b.defaultHeaders)return p.current=b.defaultHeaders,void e.update(t);const n=l(t,["defaultHeaders"]);e.update(n)},[b]);const S=function(t){return i(t.subscribe,t.getSnapshot,t.getSnapshot).map(t=>d(e(R,{children:t.node}),t.container,t.id))}(f),O=o(!1);return s(()=>{var e;if(O.current)return;const t=m.current;t&&Array.isArray(S)&&S.length>0&&(O.current=!0,null===(e=t.refitAutoSizeColumns)||void 0===e||e.call(t))},[S]),n(t,{children:[e("div",{ref:a}),S]})});C.displayName="SimpleTable";export{C as SimpleTable};
2
2
  //# sourceMappingURL=index.es.js.map
@@ -70,6 +70,15 @@ export declare class SimpleTableVanilla {
70
70
  private externalParentResizeObserver;
71
71
  /** Cached visible viewport height of the table inside the external parent. Fed into virtualization. */
72
72
  private externalViewportHeight;
73
+ /**
74
+ * rAF handle for retrying resolution of a configured-but-not-yet-resolvable
75
+ * `scrollParent` (e.g. a getter pointing at a ref attached on a later commit
76
+ * than this table's mount). Null when no retry is pending.
77
+ */
78
+ private externalScrollRetryRaf;
79
+ /** Number of resolution retries attempted; bounded so we don't spin forever. */
80
+ private externalScrollRetryCount;
81
+ private static readonly EXTERNAL_SCROLL_MAX_RETRIES;
73
82
  /** True iff the body-container scroll listener is currently attached. */
74
83
  private bodyScrollListenerAttached;
75
84
  /** Bound mouseleave handler on the body container. */
@@ -180,6 +189,14 @@ export declare class SimpleTableVanilla {
180
189
  * `maxHeight`). Idempotent — safe to call repeatedly.
181
190
  */
182
191
  private syncExternalScrollWiring;
192
+ /**
193
+ * Retry resolving a configured `scrollParent` on the next animation frame.
194
+ * Used when the parent (typically a getter pointing at a ref) was not yet
195
+ * resolvable when external wiring last ran. Bounded by
196
+ * {@link SimpleTableVanilla.EXTERNAL_SCROLL_MAX_RETRIES} so a permanently
197
+ * unresolvable parent doesn't spin forever.
198
+ */
199
+ private scheduleExternalScrollParentRetry;
183
200
  private ensureBodyScrollListenerAttached;
184
201
  private ensureBodyScrollListenerDetached;
185
202
  private attachExternalScrollWiring;
@@ -19,7 +19,7 @@ import type { TableAPI, SetHeaderRenameProps, ExportToCSVProps } from "./types/T
19
19
  import type TableRowProps from "./types/TableRowProps";
20
20
  import type Theme from "./types/Theme";
21
21
  import type UpdateDataProps from "./types/UpdateCellProps";
22
- import type { FilterCondition, TableFilterState } from "./types/FilterTypes";
22
+ import type { FilterCondition, TableFilterState, FilterOperator, StringFilterOperator, NumberFilterOperator, BooleanFilterOperator, DateFilterOperator, EnumFilterOperator } from "./types/FilterTypes";
23
23
  import type { QuickFilterConfig, QuickFilterGetter, QuickFilterGetterProps, QuickFilterMode } from "./types/QuickFilterTypes";
24
24
  import type { ColumnVisibilityState } from "./types/ColumnVisibilityTypes";
25
25
  import type RowSelectionChangeProps from "./types/RowSelectionChangeProps";
@@ -48,4 +48,4 @@ import type { RowId } from "./types/RowId";
48
48
  import type { PinnedSectionsState } from "./types/PinnedSectionsState";
49
49
  export { SimpleTableVanilla };
50
50
  export { asRows } from "./utils/asRows";
51
- export type { Accessor, AggregationConfig, AggregationType, AnimationsConfig, BoundingBox, Cell, CellChangeProps, CellClickProps, CellRenderer, CellRendererProps, CellValue, ChartOptions, ColumnEditorConfig, ColumnEditorCustomRenderer, ColumnEditorCustomRendererProps, ColumnEditorRowRenderer, ColumnEditorRowRendererComponents, ColumnEditorRowRendererProps, ColumnEditorSearchFunction, ColumnType, ColumnVisibilityState, Comparator, ComparatorProps, CustomTheme, CustomThemeProps, DragHandlerProps, EmptyStateRenderer, EmptyStateRendererProps, EnumOption, ErrorStateRenderer, ErrorStateRendererProps, ExportToCSVProps, ExportValueGetter, ExportValueProps, FilterCondition, FooterRendererProps, FooterPosition, GetRowId, GetRowIdParams, IconsConfig, LoadingStateRenderer, LoadingStateRendererProps, HeaderDropdown, HeaderDropdownProps, HeaderObject, HeaderRenderer, HeaderRendererProps, HeaderRendererComponents, OnRowGroupExpandProps, OnSortProps, QuickFilterConfig, QuickFilterGetter, QuickFilterGetterProps, QuickFilterMode, Row, RowButtonProps, RowId, RowSelectionChangeProps, RowState, SetHeaderRenameProps, SharedTableProps, ShowWhen, SimpleTableConfig, SimpleTableProps, SortColumn, TableAPI, TableFilterState, TableHeaderProps, TableRowProps, Theme, PinnedSectionsState, UpdateDataProps, ValueFormatter, ValueFormatterProps, ValueGetter, ValueGetterProps, };
51
+ export type { Accessor, AggregationConfig, AggregationType, AnimationsConfig, BoundingBox, Cell, CellChangeProps, CellClickProps, CellRenderer, CellRendererProps, CellValue, ChartOptions, ColumnEditorConfig, ColumnEditorCustomRenderer, ColumnEditorCustomRendererProps, ColumnEditorRowRenderer, ColumnEditorRowRendererComponents, ColumnEditorRowRendererProps, ColumnEditorSearchFunction, ColumnType, ColumnVisibilityState, Comparator, ComparatorProps, CustomTheme, CustomThemeProps, DragHandlerProps, EmptyStateRenderer, EmptyStateRendererProps, EnumOption, ErrorStateRenderer, ErrorStateRendererProps, ExportToCSVProps, ExportValueGetter, ExportValueProps, FilterCondition, FilterOperator, StringFilterOperator, NumberFilterOperator, BooleanFilterOperator, DateFilterOperator, EnumFilterOperator, FooterRendererProps, FooterPosition, GetRowId, GetRowIdParams, IconsConfig, LoadingStateRenderer, LoadingStateRendererProps, HeaderDropdown, HeaderDropdownProps, HeaderObject, HeaderRenderer, HeaderRendererProps, HeaderRendererComponents, OnRowGroupExpandProps, OnSortProps, QuickFilterConfig, QuickFilterGetter, QuickFilterGetterProps, QuickFilterMode, Row, RowButtonProps, RowId, RowSelectionChangeProps, RowState, SetHeaderRenameProps, SharedTableProps, ShowWhen, SimpleTableConfig, SimpleTableProps, SortColumn, TableAPI, TableFilterState, TableHeaderProps, TableRowProps, Theme, PinnedSectionsState, UpdateDataProps, ValueFormatter, ValueFormatterProps, ValueGetter, ValueGetterProps, };
@@ -16,7 +16,16 @@ export interface TableFilterState {
16
16
  [accessor: Accessor]: FilterCondition;
17
17
  }
18
18
  export declare const FILTER_OPERATOR_LABELS: Record<FilterOperator, string>;
19
- export declare const getAvailableOperators: (columnType: "string" | "number" | "boolean" | "date" | "enum") => FilterOperator[];
19
+ /**
20
+ * Returns the list of operators a column should expose in its filter UI.
21
+ *
22
+ * When `allowedOperators` is provided, the result is restricted to that list,
23
+ * preserving the consumer-specified order. Operators that aren't valid for the
24
+ * given column type are ignored. If the restriction would leave no valid
25
+ * operators (e.g. a misconfiguration), the full default list for the column
26
+ * type is returned so the filter UI never renders an empty dropdown.
27
+ */
28
+ export declare const getAvailableOperators: (columnType: "string" | "number" | "boolean" | "date" | "enum", allowedOperators?: FilterOperator[]) => FilterOperator[];
20
29
  export declare const requiresSingleValue: (operator: FilterOperator) => boolean;
21
30
  export declare const requiresMultipleValues: (operator: FilterOperator) => boolean;
22
31
  export declare const requiresNoValue: (operator: FilterOperator) => boolean;
@@ -7,6 +7,7 @@ import { HeaderRenderer } from "./HeaderRendererProps";
7
7
  import CellValue from "./CellValue";
8
8
  import { SimpleTableProps } from "./SimpleTableProps";
9
9
  import { QuickFilterGetter } from "./QuickFilterTypes";
10
+ import type { FilterOperator } from "./FilterTypes";
10
11
  export type Accessor = keyof Row | string;
11
12
  export type ColumnType = "string" | "number" | "boolean" | "date" | "enum" | "lineAreaChart" | "barChart" | "other";
12
13
  export type ShowWhen = "parentCollapsed" | "parentExpanded" | "always";
@@ -81,6 +82,19 @@ type HeaderObject = {
81
82
  expandable?: boolean;
82
83
  exportValueGetter?: ExportValueGetter;
83
84
  filterable?: boolean;
85
+ /**
86
+ * Restricts which filter operators are shown in this column's filter dropdown.
87
+ * Only operators valid for the column's `type` are honored, and they appear in
88
+ * the order provided here. When omitted, all operators for the column type are
89
+ * shown. Has no effect on `enum` columns (which use a checkbox value picker
90
+ * instead of an operator dropdown).
91
+ *
92
+ * @example
93
+ * // String column limited to "contains" and "equals"
94
+ * { accessor: "name", type: "string", filterable: true,
95
+ * filterOperators: ["contains", "equals"] }
96
+ */
97
+ filterOperators?: FilterOperator[];
84
98
  headerRenderer?: HeaderRenderer;
85
99
  hide?: boolean;
86
100
  isEditable?: boolean;
@@ -83,8 +83,20 @@ export interface CellRenderContext {
83
83
  heightOffsets?: HeightOffsets;
84
84
  customTheme?: CustomTheme;
85
85
  containerWidth?: number;
86
- /** Main section viewport width (avoids clientWidth read when set); use for getVisibleBodyCells when !pinned */
86
+ /**
87
+ * Main section *content* width (sum of all non-pinned column widths). Drives
88
+ * the body section / row-separator width so the body is as wide as its
89
+ * content and scrolls horizontally. NOT the virtualization viewport — use
90
+ * `mainSectionViewportWidth` for getVisibleBodyCells.
91
+ */
87
92
  mainSectionContainerWidth?: number;
93
+ /**
94
+ * Main section *visible* viewport width (container minus pinned sections).
95
+ * Used by getVisibleBodyCells to decide which cells intersect the viewport
96
+ * (column virtualization). NOT the content width — using the content width
97
+ * here makes every column count as visible, disabling virtualization.
98
+ */
99
+ mainSectionViewportWidth?: number;
88
100
  onCellEdit?: (params: CellEditParams) => void;
89
101
  onCellClick?: (params: CellClickParams) => void;
90
102
  onRowGroupExpand?: (props: OnRowGroupExpandProps) => void | Promise<void>;
@@ -45,3 +45,14 @@ export declare const getExternalScrollMetrics: (parent: ResolvedScrollParent, ta
45
45
  * Returns the raw scroll-top of the parent (used for direction tracking only).
46
46
  */
47
47
  export declare const getParentScrollTop: (parent: ResolvedScrollParent) => number;
48
+ /**
49
+ * Height of the parent's own viewport (window.innerHeight, or the element's
50
+ * border-box height), independent of where the table sits inside it.
51
+ *
52
+ * Used as a provisional virtualization viewport before the table has been laid
53
+ * out: at that point the table∩viewport intersection is 0, which would disable
54
+ * virtualization and render every row at once. Seeding with the parent viewport
55
+ * keeps virtualization active on the first paint; a later precise recompute
56
+ * refines it. Returns 0 when the parent can't be measured.
57
+ */
58
+ export declare const getParentViewportHeight: (parent: ResolvedScrollParent) => number;
@@ -52,7 +52,8 @@ export interface HeaderRenderContext {
52
52
  icons: IconsConfig;
53
53
  lastHeaderIndex: number;
54
54
  mainBodyRef: RefObject<HTMLDivElement>;
55
- mainSectionContainerWidth?: number; /** Main section viewport width (avoids clientWidth read when set); use for getVisibleCells when !pinned */
55
+ mainSectionContainerWidth?: number; /** Main section *content* width (sum of all non-pinned column widths). NOT the virtualization viewport. */
56
+ mainSectionViewportWidth?: number; /** Main section *visible* viewport width (container minus pinned); use for getVisibleCells when !pinned */
56
57
  onColumnOrderChange?: (headers: HeaderObject[]) => void;
57
58
  onColumnSelect?: (header: HeaderObject) => void;
58
59
  onColumnWidthChange?: (headers: HeaderObject[]) => void;
@@ -1,4 +1,24 @@
1
1
  import type HeaderObject from "../../types/HeaderObject";
2
+ /**
3
+ * Width of the *visible* portion of the main (non-pinned) section: the container
4
+ * width minus the pinned section widths.
5
+ *
6
+ * This is the viewport used for column virtualization (getVisibleBodyCells /
7
+ * getVisibleCells) — NOT `mainWidth` from {@link recalculateAllSectionWidths},
8
+ * which is the full *content* width (sum of all main column widths). Passing the
9
+ * content width here makes every column count as "in viewport", disabling column
10
+ * virtualization (all columns render). See the column-virtualization regression
11
+ * tests.
12
+ *
13
+ * Returns `undefined` when the container has not been measured yet
14
+ * (`containerWidth` 0) so callers fall back to a live `clientWidth` read instead
15
+ * of virtualizing against a 0px viewport.
16
+ */
17
+ export declare const getMainSectionViewportWidth: ({ containerWidth, leftWidth, rightWidth, }: {
18
+ containerWidth: number;
19
+ leftWidth: number;
20
+ rightWidth: number;
21
+ }) => number | undefined;
2
22
  /**
3
23
  * Recalculate widths for all sections (left, right, main)
4
24
  * Returns both constrained widths (for display) and raw content widths (for scrolling)
@@ -1,4 +1,4 @@
1
1
  export { default as SimpleTable } from "./SimpleTable";
2
2
  export { asRows } from "simple-table-core";
3
3
  export type { SimpleTableReactProps, TableInstance, ReactHeaderObject, ReactColumnEditorConfig, ReactIconsConfig, ReactIconElement, ReactCellRenderer, ReactHeaderRenderer, ReactFooterRenderer, ReactHeaderDropdown, ReactColumnEditorRowRenderer, ReactColumnEditorCustomRenderer, ReactLoadingStateRenderer, ReactErrorStateRenderer, ReactEmptyStateRenderer, HeaderRendererComponents, HeaderRendererProps, ColumnEditorRowRendererComponents, ColumnEditorRowRendererProps, ColumnEditorCustomRendererProps, FooterRendererProps, HeaderDropdownProps, } from "./types";
4
- export type { Accessor, AggregationConfig, AggregationType, BoundingBox, Cell, CellChangeProps, CellClickProps, CellRenderer, CellRendererProps, CellValue, ChartOptions, ColumnEditorConfig, ColumnEditorRowRenderer, ColumnEditorCustomRenderer, ColumnEditorSearchFunction, ColumnType, ColumnVisibilityState, Comparator, ComparatorProps, CustomTheme, CustomThemeProps, DragHandlerProps, EmptyStateRenderer, EmptyStateRendererProps, EnumOption, ErrorStateRenderer, ErrorStateRendererProps, ExportToCSVProps, ExportValueGetter, ExportValueProps, FilterCondition, GetRowId, GetRowIdParams, HeaderDropdown, HeaderRenderer, IconsConfig, LoadingStateRenderer, LoadingStateRendererProps, OnRowGroupExpandProps, OnSortProps, QuickFilterConfig, QuickFilterGetter, QuickFilterGetterProps, QuickFilterMode, Row, RowButtonProps, RowId, RowSelectionChangeProps, RowState, SetHeaderRenameProps, SharedTableProps, ShowWhen, SimpleTableConfig, SimpleTableProps, SortColumn, TableAPI, TableFilterState, TableHeaderProps, TableRowProps, Theme, UpdateDataProps, ValueFormatter, ValueFormatterProps, ValueGetter, ValueGetterProps, } from "simple-table-core";
4
+ export type { Accessor, AggregationConfig, AggregationType, BoundingBox, Cell, CellChangeProps, CellClickProps, CellRenderer, CellRendererProps, CellValue, ChartOptions, ColumnEditorConfig, ColumnEditorRowRenderer, ColumnEditorCustomRenderer, ColumnEditorSearchFunction, ColumnType, ColumnVisibilityState, Comparator, ComparatorProps, CustomTheme, CustomThemeProps, DragHandlerProps, EmptyStateRenderer, EmptyStateRendererProps, EnumOption, ErrorStateRenderer, ErrorStateRendererProps, ExportToCSVProps, ExportValueGetter, ExportValueProps, FilterCondition, FilterOperator, StringFilterOperator, NumberFilterOperator, BooleanFilterOperator, DateFilterOperator, EnumFilterOperator, GetRowId, GetRowIdParams, HeaderDropdown, HeaderRenderer, IconsConfig, LoadingStateRenderer, LoadingStateRendererProps, OnRowGroupExpandProps, OnSortProps, QuickFilterConfig, QuickFilterGetter, QuickFilterGetterProps, QuickFilterMode, Row, RowButtonProps, RowId, RowSelectionChangeProps, RowState, SetHeaderRenameProps, SharedTableProps, ShowWhen, SimpleTableConfig, SimpleTableProps, SortColumn, TableAPI, TableFilterState, TableHeaderProps, TableRowProps, Theme, UpdateDataProps, ValueFormatter, ValueFormatterProps, ValueGetter, ValueGetterProps, } from "simple-table-core";
@@ -1,5 +1,5 @@
1
1
  import type React from "react";
2
- import type { SimpleTableProps, SimpleTableConfig, HeaderObject, TableAPI, Row, CellRendererProps, HeaderRendererProps as VanillaHeaderRendererProps, FooterRendererProps as VanillaFooterRendererProps, LoadingStateRendererProps, ErrorStateRendererProps, EmptyStateRendererProps, HeaderDropdownProps as VanillaHeaderDropdownProps, ColumnEditorRowRendererProps as VanillaColumnEditorRowRendererProps, ColumnEditorCustomRendererProps as VanillaColumnEditorCustomRendererProps, ColumnEditorConfig } from "simple-table-core";
2
+ import type { SimpleTableProps, SimpleTableConfig, HeaderObject, TableAPI, Row, CellRendererProps, HeaderRendererProps as VanillaHeaderRendererProps, FooterRendererProps as VanillaFooterRendererProps, LoadingStateRendererProps, ErrorStateRendererProps, EmptyStateRendererProps, HeaderDropdownProps as VanillaHeaderDropdownProps, ColumnEditorRowRendererProps as VanillaColumnEditorRowRendererProps, ColumnEditorCustomRendererProps as VanillaColumnEditorCustomRendererProps, ColumnEditorConfig, RowButtonProps } from "simple-table-core";
3
3
  /** Passed to React `headerRenderer` / `headerDropdown`; slots are React nodes. */
4
4
  export interface HeaderRendererComponents {
5
5
  sortIcon?: React.ReactNode;
@@ -62,6 +62,7 @@ export type ReactFooterRenderer = React.ComponentType<FooterRendererProps> | ((p
62
62
  export type ReactHeaderDropdown = React.ComponentType<HeaderDropdownProps> | ((props: HeaderDropdownProps) => React.ReactNode);
63
63
  export type ReactColumnEditorRowRenderer = React.ComponentType<ColumnEditorRowRendererProps> | ((props: ColumnEditorRowRendererProps) => React.ReactNode);
64
64
  export type ReactColumnEditorCustomRenderer = React.ComponentType<ColumnEditorCustomRendererProps> | ((props: ColumnEditorCustomRendererProps) => React.ReactNode);
65
+ export type ReactRowButton = React.ComponentType<RowButtonProps> | ((props: RowButtonProps) => React.ReactNode);
65
66
  export type ReactLoadingStateRenderer = React.ComponentType<LoadingStateRendererProps> | React.ReactNode;
66
67
  export type ReactErrorStateRenderer = React.ComponentType<ErrorStateRendererProps> | React.ReactNode;
67
68
  export type ReactEmptyStateRenderer = React.ComponentType<EmptyStateRendererProps> | React.ReactNode;
@@ -80,7 +81,7 @@ export interface ReactHeaderObject extends Omit<HeaderObject, "cellRenderer" | "
80
81
  /** Nested grid: React table props minus row data and inherited state renderers. */
81
82
  nestedTable?: Omit<SimpleTableReactProps, "rows" | "loadingStateRenderer" | "errorStateRenderer" | "emptyStateRenderer" | "tableEmptyStateRenderer">;
82
83
  }
83
- export interface SimpleTableReactProps extends Omit<SimpleTableProps, "defaultHeaders" | "footerRenderer" | "emptyStateRenderer" | "errorStateRenderer" | "loadingStateRenderer" | "tableEmptyStateRenderer" | "headerDropdown" | "columnEditorConfig" | "icons" | "rows" | "onColumnOrderChange" | "onColumnWidthChange" | "onHeaderEdit" | "onColumnSelect"> {
84
+ export interface SimpleTableReactProps extends Omit<SimpleTableProps, "defaultHeaders" | "footerRenderer" | "emptyStateRenderer" | "errorStateRenderer" | "loadingStateRenderer" | "tableEmptyStateRenderer" | "headerDropdown" | "columnEditorConfig" | "icons" | "rows" | "rowButtons" | "onColumnOrderChange" | "onColumnWidthChange" | "onHeaderEdit" | "onColumnSelect"> {
84
85
  defaultHeaders: ReadonlyArray<ReactHeaderObject>;
85
86
  onColumnOrderChange?: (newHeaders: ReactHeaderObject[]) => void;
86
87
  onColumnWidthChange?: (headers: ReactHeaderObject[]) => void;
@@ -96,5 +97,7 @@ export interface SimpleTableReactProps extends Omit<SimpleTableProps, "defaultHe
96
97
  headerDropdown?: ReactHeaderDropdown;
97
98
  columnEditorConfig?: ReactColumnEditorConfig;
98
99
  icons?: ReactIconsConfig;
100
+ /** Per-row action buttons; each entry returns JSX rendered into the row's selection column. */
101
+ rowButtons?: ReactRowButton[];
99
102
  }
100
103
  export type { CellRendererProps, LoadingStateRendererProps, ErrorStateRendererProps, EmptyStateRendererProps, };
@@ -1,5 +1,5 @@
1
1
  import React from "react";
2
- import type { ColumnEditorCustomRendererProps as VanillaColumnEditorCustomRendererProps, ColumnEditorRowRendererProps as VanillaColumnEditorRowRendererProps, HeaderRendererProps as VanillaHeaderRendererProps, HeaderDropdownProps as VanillaHeaderDropdownProps, FooterRendererProps as VanillaFooterRendererProps } from "simple-table-core";
2
+ import type { ColumnEditorCustomRendererProps as VanillaColumnEditorCustomRendererProps, ColumnEditorRowRendererProps as VanillaColumnEditorRowRendererProps, HeaderRendererProps as VanillaHeaderRendererProps, HeaderDropdownProps as VanillaHeaderDropdownProps, FooterRendererProps as VanillaFooterRendererProps, RowButtonProps as VanillaRowButtonProps } from "simple-table-core";
3
3
  import type { PortalBridge } from "../PortalBridge";
4
4
  /**
5
5
  * Wraps a React component into a function that returns an HTMLElement, matching
@@ -42,6 +42,15 @@ export declare function wrapReactColumnEditorRowRenderer(bridge: PortalBridge, C
42
42
  * `columnEditorConfig.customRenderer` the same way as row slots.
43
43
  */
44
44
  export declare function wrapReactColumnEditorCustomRenderer(bridge: PortalBridge, Component: React.ComponentType<object>): (props: VanillaColumnEditorCustomRendererProps) => HTMLElement;
45
+ /**
46
+ * Wraps a React row-button render function into the vanilla `RowButton`
47
+ * contract `(props) => HTMLElement`. Like {@link wrapReactRendererIntoFragment},
48
+ * it registers the element with the {@link PortalBridge} so the button renders
49
+ * inside the host React tree — preserving interactivity (onClick) and context —
50
+ * and uses `display: contents` so core's `st-row-button` wrapper styles the
51
+ * actual button rather than an extra box.
52
+ */
53
+ export declare function wrapReactRowButton(bridge: PortalBridge, Component: React.ComponentType<VanillaRowButtonProps>): (props: VanillaRowButtonProps) => HTMLElement;
45
54
  /**
46
55
  * Renders a static ReactNode into an HTMLElement using server-side static
47
56
  * rendering. Used for props like tableEmptyStateRenderer that are static markup
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@simple-table/react",
3
- "version": "3.8.2",
3
+ "version": "3.8.4",
4
4
  "main": "dist/cjs/index.js",
5
5
  "module": "dist/index.es.js",
6
6
  "types": "dist/types/react/src/index.d.ts",
@@ -29,7 +29,7 @@
29
29
  "react-dom": ">=18.0.0"
30
30
  },
31
31
  "dependencies": {
32
- "simple-table-core": "3.8.2"
32
+ "simple-table-core": "3.8.4"
33
33
  },
34
34
  "devDependencies": {
35
35
  "@rollup/plugin-alias": "^4.0.4",