@agile-team/mach-table 0.19.0 → 0.23.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.
@@ -651,6 +651,8 @@ interface GridOptions<TData = any> extends EventHandlers<TData> {
651
651
  infiniteBufferRows?: number;
652
652
  /** Maximum retained blocks in random-access mode. */
653
653
  maxBlocksInCache?: number;
654
+ /** Upper bound for active random-access datasource requests. Defaults to 4. */
655
+ datasourceMaxConcurrentRequests?: number;
654
656
  /** Number of adjacent blocks prefetched around a requested viewport. */
655
657
  blockPrefetch?: number;
656
658
  /** Optional initial total enables immediate scrollbar range before the first response. */
@@ -663,6 +665,8 @@ interface GridOptions<TData = any> extends EventHandlers<TData> {
663
665
  datasourceRetryCount?: number;
664
666
  /** Base retry delay in milliseconds. Retries use capped exponential backoff. */
665
667
  datasourceRetryDelay?: number;
668
+ /** Symmetric retry jitter ratio in the 0..1 range. Defaults to 0.15. */
669
+ datasourceRetryJitter?: number;
666
670
  suppressCellFocus?: boolean;
667
671
  suppressRowHoverHighlight?: boolean;
668
672
  suppressNoRowsOverlay?: boolean;
@@ -772,12 +776,14 @@ interface ResolvedGridOptions<TData = any> extends EventHandlers<TData> {
772
776
  blockSize: number;
773
777
  infiniteBufferRows: number;
774
778
  maxBlocksInCache: number;
779
+ datasourceMaxConcurrentRequests: number;
775
780
  blockPrefetch: number;
776
781
  datasourceRowCount: number | null;
777
782
  dataProcessor?: GridDataProcessor<TData>;
778
783
  dataProcessorMinRows: number;
779
784
  datasourceRetryCount: number;
780
785
  datasourceRetryDelay: number;
786
+ datasourceRetryJitter: number;
781
787
  suppressCellFocus: boolean;
782
788
  suppressRowHoverHighlight: boolean;
783
789
  suppressNoRowsOverlay: boolean;
@@ -870,6 +876,8 @@ interface GridUpdateSchedulerSnapshot {
870
876
  interface RemoteBlockCacheSnapshot {
871
877
  cachedBlockCount: number;
872
878
  loadingBlockCount: number;
879
+ activeRequestCount: number;
880
+ queuedRequestCount: number;
873
881
  cachedRowCount: number;
874
882
  hitCount: number;
875
883
  missCount: number;
@@ -957,6 +965,27 @@ interface GridDiagnosticsApi {
957
965
  getPerformance(): GridPerformanceSnapshot;
958
966
  resetPerformance(): void;
959
967
  }
968
+ /** Filtering owns filter state only; server requests remain in the host query layer. */
969
+ interface GridFilteringApi {
970
+ getModel(): FilterModel;
971
+ setModel(model: FilterModel | null): void;
972
+ getAdvancedModel(): AdvancedFilterModel | null;
973
+ setAdvancedModel(model: AdvancedFilterModel | null): void;
974
+ getQuickText(): string | null;
975
+ setQuickText(text: string | null | undefined): void;
976
+ isPresent(colId?: string): boolean;
977
+ }
978
+ /** Pagination is a bounded facade over the existing flat compatibility methods. */
979
+ interface GridPaginationApi {
980
+ isEnabled(): boolean;
981
+ setEnabled(enabled: boolean): void;
982
+ getPage(): number;
983
+ setPage(page: number): void;
984
+ getPageSize(): number;
985
+ setPageSize(size: number): void;
986
+ getPageCount(): number;
987
+ getTotalRowCount(): number;
988
+ }
960
989
  interface SaveChangeIssue {
961
990
  rowId: string;
962
991
  code?: string;
@@ -989,6 +1018,8 @@ interface GridApi<TData = any> {
989
1018
  readonly editing: GridEditingApi<TData>;
990
1019
  readonly state: GridStateApi;
991
1020
  readonly diagnostics: GridDiagnosticsApi;
1021
+ readonly filtering: GridFilteringApi;
1022
+ readonly pagination: GridPaginationApi;
992
1023
  /** Coalesces model/layout/render work from nested synchronous API calls. */
993
1024
  batch<TResult>(callback: (api: GridApi<TData>) => TResult): TResult;
994
1025
  /** Flushes deferred work; normally only needed by tests and imperative measurements. */
@@ -651,6 +651,8 @@ interface GridOptions<TData = any> extends EventHandlers<TData> {
651
651
  infiniteBufferRows?: number;
652
652
  /** Maximum retained blocks in random-access mode. */
653
653
  maxBlocksInCache?: number;
654
+ /** Upper bound for active random-access datasource requests. Defaults to 4. */
655
+ datasourceMaxConcurrentRequests?: number;
654
656
  /** Number of adjacent blocks prefetched around a requested viewport. */
655
657
  blockPrefetch?: number;
656
658
  /** Optional initial total enables immediate scrollbar range before the first response. */
@@ -663,6 +665,8 @@ interface GridOptions<TData = any> extends EventHandlers<TData> {
663
665
  datasourceRetryCount?: number;
664
666
  /** Base retry delay in milliseconds. Retries use capped exponential backoff. */
665
667
  datasourceRetryDelay?: number;
668
+ /** Symmetric retry jitter ratio in the 0..1 range. Defaults to 0.15. */
669
+ datasourceRetryJitter?: number;
666
670
  suppressCellFocus?: boolean;
667
671
  suppressRowHoverHighlight?: boolean;
668
672
  suppressNoRowsOverlay?: boolean;
@@ -772,12 +776,14 @@ interface ResolvedGridOptions<TData = any> extends EventHandlers<TData> {
772
776
  blockSize: number;
773
777
  infiniteBufferRows: number;
774
778
  maxBlocksInCache: number;
779
+ datasourceMaxConcurrentRequests: number;
775
780
  blockPrefetch: number;
776
781
  datasourceRowCount: number | null;
777
782
  dataProcessor?: GridDataProcessor<TData>;
778
783
  dataProcessorMinRows: number;
779
784
  datasourceRetryCount: number;
780
785
  datasourceRetryDelay: number;
786
+ datasourceRetryJitter: number;
781
787
  suppressCellFocus: boolean;
782
788
  suppressRowHoverHighlight: boolean;
783
789
  suppressNoRowsOverlay: boolean;
@@ -870,6 +876,8 @@ interface GridUpdateSchedulerSnapshot {
870
876
  interface RemoteBlockCacheSnapshot {
871
877
  cachedBlockCount: number;
872
878
  loadingBlockCount: number;
879
+ activeRequestCount: number;
880
+ queuedRequestCount: number;
873
881
  cachedRowCount: number;
874
882
  hitCount: number;
875
883
  missCount: number;
@@ -957,6 +965,27 @@ interface GridDiagnosticsApi {
957
965
  getPerformance(): GridPerformanceSnapshot;
958
966
  resetPerformance(): void;
959
967
  }
968
+ /** Filtering owns filter state only; server requests remain in the host query layer. */
969
+ interface GridFilteringApi {
970
+ getModel(): FilterModel;
971
+ setModel(model: FilterModel | null): void;
972
+ getAdvancedModel(): AdvancedFilterModel | null;
973
+ setAdvancedModel(model: AdvancedFilterModel | null): void;
974
+ getQuickText(): string | null;
975
+ setQuickText(text: string | null | undefined): void;
976
+ isPresent(colId?: string): boolean;
977
+ }
978
+ /** Pagination is a bounded facade over the existing flat compatibility methods. */
979
+ interface GridPaginationApi {
980
+ isEnabled(): boolean;
981
+ setEnabled(enabled: boolean): void;
982
+ getPage(): number;
983
+ setPage(page: number): void;
984
+ getPageSize(): number;
985
+ setPageSize(size: number): void;
986
+ getPageCount(): number;
987
+ getTotalRowCount(): number;
988
+ }
960
989
  interface SaveChangeIssue {
961
990
  rowId: string;
962
991
  code?: string;
@@ -989,6 +1018,8 @@ interface GridApi<TData = any> {
989
1018
  readonly editing: GridEditingApi<TData>;
990
1019
  readonly state: GridStateApi;
991
1020
  readonly diagnostics: GridDiagnosticsApi;
1021
+ readonly filtering: GridFilteringApi;
1022
+ readonly pagination: GridPaginationApi;
992
1023
  /** Coalesces model/layout/render work from nested synchronous API calls. */
993
1024
  batch<TResult>(callback: (api: GridApi<TData>) => TResult): TResult;
994
1025
  /** Flushes deferred work; normally only needed by tests and imperative measurements. */
package/dist/worker.cjs CHANGED
@@ -1,2 +1 @@
1
1
  "use strict";var D=Object.defineProperty;var R=Object.getOwnPropertyDescriptor;var x=Object.getOwnPropertyNames;var N=Object.prototype.hasOwnProperty;var C=(e,r)=>{for(var n in r)D(e,n,{get:r[n],enumerable:!0})},I=(e,r,n,o)=>{if(r&&typeof r=="object"||typeof r=="function")for(let t of x(r))!N.call(e,t)&&t!==n&&D(e,t,{get:()=>r[t],enumerable:!(o=R(r,t))||o.enumerable});return e};var S=e=>I(D({},"__esModule",{value:!0}),e);var K={};C(K,{createWorkerDataProcessor:()=>v,installGridDataWorker:()=>G,processFieldDataRequest:()=>k});module.exports=S(K);var O=new Set(["__proto__","prototype","constructor"]);function L(e){return typeof e!="string"||e.length===0?!1:e.split(".").every(n=>n.length>0&&!O.has(n))}function f(e,r){if(e==null||!L(r))return;if(r.indexOf(".")<0)return e[r];let o=e,t=0;for(;t<r.length;){if(o==null)return;let a=r.indexOf(".",t);if(a<0){o=o[r.slice(t)];break}o=o[r.slice(t,a)],t=a+1}return o}var T=typeof Intl<"u"?new Intl.Collator(void 0,{numeric:!0,sensitivity:"base"}):null;function M(e,r){let n=e==null||e==="",o=r==null||r==="";if(n&&o)return 0;if(n)return 1;if(o)return-1;if(typeof e=="number"&&typeof r=="number")return isNaN(e)&&isNaN(r)?0:isNaN(e)?1:isNaN(r)?-1:e-r;if(e instanceof Date&&r instanceof Date)return e.getTime()-r.getTime();if(typeof e=="boolean"&&typeof r=="boolean")return e===r?0:e?1:-1;let t=String(e),a=String(r);return T?T.compare(t,a):t.localeCompare(a)}function q(e){return e==null?"":String(e).toLowerCase()}function _(e,r,n){let o=q(e),t=r.map(a=>{let s=(a.value??"").toLowerCase();switch(a.match){case"contains":return o.includes(s);case"notContains":return!o.includes(s);case"equals":return o===s;case"notEquals":return o!==s;case"startsWith":return o.startsWith(s);case"endsWith":return o.endsWith(s);case"blank":return o==="";case"notBlank":return o!=="";default:return!0}});return t.length===0?!0:n==="or"?t.some(Boolean):t.every(Boolean)}function A(e,r,n){let o=r.map(t=>{let a=e==null||e==="";if(t.match==="blank")return a;if(t.match==="notBlank")return!a;if(a)return!1;let s=typeof e=="number"?e:Number(e);if(isNaN(s))return!1;let i=t.value;if(i==null||isNaN(i))return!1;switch(t.match){case"equals":return s===i;case"notEquals":return s!==i;case"lessThan":return s<i;case"lessThanOrEqual":return s<=i;case"greaterThan":return s>i;case"greaterThanOrEqual":return s>=i;case"inRange":return s>=i&&s<=(t.value2??i);default:return!0}});return o.length===0?!0:n==="or"?o.some(Boolean):o.every(Boolean)}function m(e){if(e==null||e==="")return null;if(e instanceof Date)return isNaN(e.getTime())?null:e.getTime();if(typeof e=="number")return e;let r=Date.parse(String(e));return isNaN(r)?null:r}function B(e,r,n){let o=r.map(t=>{let a=m(e)==null;if(t.match==="blank")return a;if(t.match==="notBlank")return!a;if(a)return!1;let s=m(e),i=t.value!=null?m(t.value):null;if(i==null)return!1;switch(t.match){case"equals":return s===i;case"notEquals":return s!==i;case"lessThan":return s<i;case"greaterThan":return s>i;case"inRange":{let d=t.value2!=null?m(t.value2):null;return d!=null?s>=i&&s<=d:s>=i}default:return!0}});return o.length===0?!0:n==="or"?o.some(Boolean):o.every(Boolean)}function j(e,r){return r.length===0?!0:r.some(n=>n==null&&e==null||n===e)}function b(e,r){let n=r.type!=="set"&&r.operator==="or"?"or":"and";switch(r.type){case"text":return _(e,r.conditions,n);case"number":return A(e,r.conditions,n);case"date":return B(e,r.conditions,n);case"set":return j(e,r.values);default:return!0}}function w(e,r,n){if(e.kind==="condition"){let t=n.get(e.colId);return t==null||b(f(r,t),e.filter)}let o=e.operator==="or"?e.children.some(t=>w(t,r,n)):e.children.every(t=>w(t,r,n));return e.not?!o:o}function H(e,r,n){for(let[o,t]of Object.entries(r.filterModel)){let a=n.get(o);if(a!=null&&!b(f(e,a),t))return!1}return!0}function Q(e,r,n){return n.every(o=>r.columns.some(t=>{let a=t.field==null?null:f(e,t.field);return String(a??"").toLowerCase().includes(o)}))}function U(e,r,n,o){return!H(e,r,n)||r.advancedFilterModel&&!w(r.advancedFilterModel.root,e,n)?!1:Q(e,r,o)}function z(e,r,n){r.sortModel.length!==0&&e.sort((o,t)=>{for(let a of r.sortModel){let s=n.get(a.colId);if(!s)continue;let i=M(f(o.data,s),f(t.data,s));if(i!==0)return a.direction==="desc"?-i:i}return o.order-t.order})}function J(e){if(!e?.())return;let r=new Error("Data processing aborted");throw r.name="AbortError",r}async function k(e,r={}){let n=new Map(e.columns.flatMap(s=>s.field?[[s.colId,s.field]]:[])),o=e.quickFilterText?.trim().toLowerCase().split(/\s+/).filter(Boolean)??[],t=Math.max(100,Math.trunc(r.yieldEvery??2e3)),a=[];for(let s=0;s<e.rows.length;s++){J(r.isCancelled),s>0&&s%t===0&&await new Promise(d=>setTimeout(d,0));let i=e.rows[s];U(i.data,e,n,o)&&a.push({id:i.id,data:i.data,order:s})}return z(a,e,n),{rowIds:a.map(s=>s.id)}}function G(e){let r=new Set;e.addEventListener("message",n=>{let o=n.data;if(o.type==="mach-table:cancel"){r.add(o.requestId);return}let{requestId:t}=o;r.delete(t),k(o.payload,{isCancelled:()=>r.has(t)}).then(a=>{r.has(t)||e.postMessage({type:"mach-table:result",requestId:t,rowIds:a.rowIds})}).catch(a=>{r.has(t)||e.postMessage({type:"mach-table:error",requestId:t,message:a instanceof Error?a.message:String(a)})}).finally(()=>r.delete(t))})}function h(e){if(e instanceof Error)return e;let r=new Error(typeof e=="string"?e:"Data processing aborted");return r.name="AbortError",r}function v(e,r={}){let n=null,o=0,t=!1,a=new Map,s=c=>{for(let l of a.values())l.signal.removeEventListener("abort",l.abort),l.reject(c);a.clear()},i=c=>{let l=c.data;if(!l||l.type!=="mach-table:result"&&l.type!=="mach-table:error")return;let u=a.get(l.requestId);u&&(a.delete(l.requestId),u.signal.removeEventListener("abort",u.abort),l.type==="mach-table:result"?u.resolve({rowIds:l.rowIds}):u.reject(new Error(l.message)))},d=c=>{c.removeEventListener("message",i),c.removeEventListener("error",P)},P=c=>{let l=n;n=null,l&&(d(l),l.terminate()),s(c.error??new Error(c.message||"Grid data worker failed"))},E=()=>{if(n)return n;if(t)throw new Error("Worker data processor has been destroyed");return n=e(),n.addEventListener("message",i),n.addEventListener("error",P),n};return{process(c){if(c.signal.aborted)return Promise.reject(h(c.signal.reason));let l=++o;return new Promise((u,y)=>{let g=()=>{a.get(l)&&(a.delete(l),n?.postMessage({type:"mach-table:cancel",requestId:l}),y(h(c.signal.reason)))};a.set(l,{resolve:u,reject:y,signal:c.signal,abort:g}),c.signal.addEventListener("abort",g,{once:!0});let{signal:W,...F}=c;try{E().postMessage({type:"mach-table:process",requestId:l,payload:F})}catch(p){a.delete(l),c.signal.removeEventListener("abort",g),y(p instanceof Error?p:new Error(String(p)))}})},destroy(){if(!t){if(t=!0,s(h("Worker data processor destroyed")),n){let c=n;d(c),r.terminateOnDestroy!==!1&&c.terminate()}n=null}}}}0&&(module.exports={createWorkerDataProcessor,installGridDataWorker,processFieldDataRequest});
2
- //# sourceMappingURL=worker.cjs.map
package/dist/worker.d.cts CHANGED
@@ -1 +1 @@
1
- export { ap as FieldDataProcessorOptions, ay as GridDataProcessor, az as GridDataProcessorColumn, aA as GridDataProcessorPayload, aB as GridDataProcessorRequest, aC as GridDataProcessorResult, aD as GridDataProcessorRow, aE as GridDataWorkerScope, aU as GridWorkerCancelMessage, aV as GridWorkerProcessMessage, aW as GridWorkerRequestMessage, aX as GridWorkerResponseMessage, bF as WorkerDataProcessorOptions, bK as createWorkerDataProcessor, bL as installGridDataWorker, bM as processFieldDataRequest } from './worker-P1ks_WSx.cjs';
1
+ export { ap as FieldDataProcessorOptions, ay as GridDataProcessor, az as GridDataProcessorColumn, aA as GridDataProcessorPayload, aB as GridDataProcessorRequest, aC as GridDataProcessorResult, aD as GridDataProcessorRow, aE as GridDataWorkerScope, aU as GridWorkerCancelMessage, aV as GridWorkerProcessMessage, aW as GridWorkerRequestMessage, aX as GridWorkerResponseMessage, bF as WorkerDataProcessorOptions, bK as createWorkerDataProcessor, bL as installGridDataWorker, bM as processFieldDataRequest } from './worker-DsFc5zec.cjs';
package/dist/worker.d.ts CHANGED
@@ -1 +1 @@
1
- export { ap as FieldDataProcessorOptions, ay as GridDataProcessor, az as GridDataProcessorColumn, aA as GridDataProcessorPayload, aB as GridDataProcessorRequest, aC as GridDataProcessorResult, aD as GridDataProcessorRow, aE as GridDataWorkerScope, aU as GridWorkerCancelMessage, aV as GridWorkerProcessMessage, aW as GridWorkerRequestMessage, aX as GridWorkerResponseMessage, bF as WorkerDataProcessorOptions, bK as createWorkerDataProcessor, bL as installGridDataWorker, bM as processFieldDataRequest } from './worker-P1ks_WSx.js';
1
+ export { ap as FieldDataProcessorOptions, ay as GridDataProcessor, az as GridDataProcessorColumn, aA as GridDataProcessorPayload, aB as GridDataProcessorRequest, aC as GridDataProcessorResult, aD as GridDataProcessorRow, aE as GridDataWorkerScope, aU as GridWorkerCancelMessage, aV as GridWorkerProcessMessage, aW as GridWorkerRequestMessage, aX as GridWorkerResponseMessage, bF as WorkerDataProcessorOptions, bK as createWorkerDataProcessor, bL as installGridDataWorker, bM as processFieldDataRequest } from './worker-DsFc5zec.js';
package/dist/worker.js CHANGED
@@ -1,2 +1 @@
1
1
  var E=new Set(["__proto__","prototype","constructor"]);function W(e){return typeof e!="string"||e.length===0?!1:e.split(".").every(n=>n.length>0&&!E.has(n))}function f(e,r){if(e==null||!W(r))return;if(r.indexOf(".")<0)return e[r];let o=e,t=0;for(;t<r.length;){if(o==null)return;let a=r.indexOf(".",t);if(a<0){o=o[r.slice(t)];break}o=o[r.slice(t,a)],t=a+1}return o}var k=typeof Intl<"u"?new Intl.Collator(void 0,{numeric:!0,sensitivity:"base"}):null;function P(e,r){let n=e==null||e==="",o=r==null||r==="";if(n&&o)return 0;if(n)return 1;if(o)return-1;if(typeof e=="number"&&typeof r=="number")return isNaN(e)&&isNaN(r)?0:isNaN(e)?1:isNaN(r)?-1:e-r;if(e instanceof Date&&r instanceof Date)return e.getTime()-r.getTime();if(typeof e=="boolean"&&typeof r=="boolean")return e===r?0:e?1:-1;let t=String(e),a=String(r);return k?k.compare(t,a):t.localeCompare(a)}function F(e){return e==null?"":String(e).toLowerCase()}function R(e,r,n){let o=F(e),t=r.map(a=>{let s=(a.value??"").toLowerCase();switch(a.match){case"contains":return o.includes(s);case"notContains":return!o.includes(s);case"equals":return o===s;case"notEquals":return o!==s;case"startsWith":return o.startsWith(s);case"endsWith":return o.endsWith(s);case"blank":return o==="";case"notBlank":return o!=="";default:return!0}});return t.length===0?!0:n==="or"?t.some(Boolean):t.every(Boolean)}function x(e,r,n){let o=r.map(t=>{let a=e==null||e==="";if(t.match==="blank")return a;if(t.match==="notBlank")return!a;if(a)return!1;let s=typeof e=="number"?e:Number(e);if(isNaN(s))return!1;let i=t.value;if(i==null||isNaN(i))return!1;switch(t.match){case"equals":return s===i;case"notEquals":return s!==i;case"lessThan":return s<i;case"lessThanOrEqual":return s<=i;case"greaterThan":return s>i;case"greaterThanOrEqual":return s>=i;case"inRange":return s>=i&&s<=(t.value2??i);default:return!0}});return o.length===0?!0:n==="or"?o.some(Boolean):o.every(Boolean)}function m(e){if(e==null||e==="")return null;if(e instanceof Date)return isNaN(e.getTime())?null:e.getTime();if(typeof e=="number")return e;let r=Date.parse(String(e));return isNaN(r)?null:r}function N(e,r,n){let o=r.map(t=>{let a=m(e)==null;if(t.match==="blank")return a;if(t.match==="notBlank")return!a;if(a)return!1;let s=m(e),i=t.value!=null?m(t.value):null;if(i==null)return!1;switch(t.match){case"equals":return s===i;case"notEquals":return s!==i;case"lessThan":return s<i;case"greaterThan":return s>i;case"inRange":{let d=t.value2!=null?m(t.value2):null;return d!=null?s>=i&&s<=d:s>=i}default:return!0}});return o.length===0?!0:n==="or"?o.some(Boolean):o.every(Boolean)}function C(e,r){return r.length===0?!0:r.some(n=>n==null&&e==null||n===e)}function D(e,r){let n=r.type!=="set"&&r.operator==="or"?"or":"and";switch(r.type){case"text":return R(e,r.conditions,n);case"number":return x(e,r.conditions,n);case"date":return N(e,r.conditions,n);case"set":return C(e,r.values);default:return!0}}function h(e,r,n){if(e.kind==="condition"){let t=n.get(e.colId);return t==null||D(f(r,t),e.filter)}let o=e.operator==="or"?e.children.some(t=>h(t,r,n)):e.children.every(t=>h(t,r,n));return e.not?!o:o}function I(e,r,n){for(let[o,t]of Object.entries(r.filterModel)){let a=n.get(o);if(a!=null&&!D(f(e,a),t))return!1}return!0}function S(e,r,n){return n.every(o=>r.columns.some(t=>{let a=t.field==null?null:f(e,t.field);return String(a??"").toLowerCase().includes(o)}))}function O(e,r,n,o){return!I(e,r,n)||r.advancedFilterModel&&!h(r.advancedFilterModel.root,e,n)?!1:S(e,r,o)}function L(e,r,n){r.sortModel.length!==0&&e.sort((o,t)=>{for(let a of r.sortModel){let s=n.get(a.colId);if(!s)continue;let i=P(f(o.data,s),f(t.data,s));if(i!==0)return a.direction==="desc"?-i:i}return o.order-t.order})}function q(e){if(!e?.())return;let r=new Error("Data processing aborted");throw r.name="AbortError",r}async function T(e,r={}){let n=new Map(e.columns.flatMap(s=>s.field?[[s.colId,s.field]]:[])),o=e.quickFilterText?.trim().toLowerCase().split(/\s+/).filter(Boolean)??[],t=Math.max(100,Math.trunc(r.yieldEvery??2e3)),a=[];for(let s=0;s<e.rows.length;s++){q(r.isCancelled),s>0&&s%t===0&&await new Promise(d=>setTimeout(d,0));let i=e.rows[s];O(i.data,e,n,o)&&a.push({id:i.id,data:i.data,order:s})}return L(a,e,n),{rowIds:a.map(s=>s.id)}}function _(e){let r=new Set;e.addEventListener("message",n=>{let o=n.data;if(o.type==="mach-table:cancel"){r.add(o.requestId);return}let{requestId:t}=o;r.delete(t),T(o.payload,{isCancelled:()=>r.has(t)}).then(a=>{r.has(t)||e.postMessage({type:"mach-table:result",requestId:t,rowIds:a.rowIds})}).catch(a=>{r.has(t)||e.postMessage({type:"mach-table:error",requestId:t,message:a instanceof Error?a.message:String(a)})}).finally(()=>r.delete(t))})}function b(e){if(e instanceof Error)return e;let r=new Error(typeof e=="string"?e:"Data processing aborted");return r.name="AbortError",r}function A(e,r={}){let n=null,o=0,t=!1,a=new Map,s=c=>{for(let l of a.values())l.signal.removeEventListener("abort",l.abort),l.reject(c);a.clear()},i=c=>{let l=c.data;if(!l||l.type!=="mach-table:result"&&l.type!=="mach-table:error")return;let u=a.get(l.requestId);u&&(a.delete(l.requestId),u.signal.removeEventListener("abort",u.abort),l.type==="mach-table:result"?u.resolve({rowIds:l.rowIds}):u.reject(new Error(l.message)))},d=c=>{c.removeEventListener("message",i),c.removeEventListener("error",w)},w=c=>{let l=n;n=null,l&&(d(l),l.terminate()),s(c.error??new Error(c.message||"Grid data worker failed"))},M=()=>{if(n)return n;if(t)throw new Error("Worker data processor has been destroyed");return n=e(),n.addEventListener("message",i),n.addEventListener("error",w),n};return{process(c){if(c.signal.aborted)return Promise.reject(b(c.signal.reason));let l=++o;return new Promise((u,y)=>{let g=()=>{a.get(l)&&(a.delete(l),n?.postMessage({type:"mach-table:cancel",requestId:l}),y(b(c.signal.reason)))};a.set(l,{resolve:u,reject:y,signal:c.signal,abort:g}),c.signal.addEventListener("abort",g,{once:!0});let{signal:G,...v}=c;try{M().postMessage({type:"mach-table:process",requestId:l,payload:v})}catch(p){a.delete(l),c.signal.removeEventListener("abort",g),y(p instanceof Error?p:new Error(String(p)))}})},destroy(){if(!t){if(t=!0,s(b("Worker data processor destroyed")),n){let c=n;d(c),r.terminateOnDestroy!==!1&&c.terminate()}n=null}}}}export{A as createWorkerDataProcessor,_ as installGridDataWorker,T as processFieldDataRequest};
2
- //# sourceMappingURL=worker.js.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agile-team/mach-table",
3
- "version": "0.19.0",
3
+ "version": "0.23.0",
4
4
  "description": "Enterprise-grade, framework-agnostic TypeScript data grid with virtualization, editing, grouping and extensibility",
5
5
  "keywords": [
6
6
  "data-grid",
@@ -70,5 +70,6 @@
70
70
  "typecheck": "tsc --noEmit",
71
71
  "test": "vitest run",
72
72
  "test:coverage": "vitest run --coverage"
73
- }
73
+ },
74
+ "readme": "<p align=\"center\">\n <img src=\"https://raw.githubusercontent.com/ChenyCHENYU/MachTable/main/assets/mach-table-logo.svg\" alt=\"MachTable\" width=\"760\" />\n</p>\n\n# @agile-team/mach-table\n\nEnterprise-grade, framework-independent TypeScript data grid. Zero runtime dependencies, virtualized rows and columns, polished cell/full-row editing, async validation, action columns, change tracking, versioned state and resilient infinite loading.\n\n```bash\npnpm add @agile-team/mach-table\n```\n\n```ts\nimport { createGrid } from \"@agile-team/mach-table\";\nimport \"@agile-team/mach-table/styles/mach-table.css\";\n\nconst api = createGrid(document.querySelector(\"#grid\")!, {\n columnDefs: [\n { field: \"id\", headerName: \"ID\", width: 120 },\n { field: \"name\", headerName: \"Name\", flex: 1, editable: true }\n ],\n rowData: [{ id: \"1\", name: \"MachTable\" }],\n rowKey: \"id\",\n enableColumnResize: true,\n stateKey: \"customer-list\"\n});\n\n// Required for native integrations when the host is removed.\napi.destroy();\n```\n\nComplex business workflows use first-class APIs instead of adapter-specific glue:\n\n```ts\nconst state = api.getState();\nawait api.saveChanges((changes) => orderApi.save(changes));\napi.rollbackChanges();\nconsole.info(api.getDiagnostics());\n\nawait api.applyTransactionAsync({ update: realtimeRows });\napi.applyState(state);\n```\n\n0.23 adds governed domain APIs, incremental update invalidation and bounded remote-resource scheduling without removing the flat 0.x API:\n\n```ts\napi.batch((grid) => {\n grid.rows.apply({ update: changedRows });\n grid.columns.setVisible(\"internalNote\", false);\n grid.refreshCells({ rowIds: changedIds, columns: [\"status\"] });\n});\n\nconsole.info(api.diagnostics.get().updates);\n```\n\nFor very large remote datasets, opt into random-access blocks. Sequential infinite loading remains the compatibility default:\n\n```ts\nconst options = {\n datasource,\n datasourceMode: \"block\" as const,\n datasourceRowCount: 1_000_000,\n blockSize: 200,\n maxBlocksInCache: 12,\n blockPrefetch: 1\n};\n\nawait api.rows.ensureLoaded(40_000, 40_200, { signal });\nconsole.info(api.rows.getCacheSnapshot());\n```\n\nWorker runtime helpers are intentionally split from the default entry:\n\n```ts\nimport { createWorkerDataProcessor, installGridDataWorker } from \"@agile-team/mach-table/worker\";\n```\n\n0.18 added governed runtime APIs, nested filters, named views, conflict-aware saves and performance evidence:\n\n```ts\nconst views = createGridViewManager(api, { scope: \"tenant:user:orders\" });\nawait views.save(\"My pending orders\");\n\nconst result = await api.saveChangesDetailed(orderApi.saveChanges);\nconsole.table(result.failures);\nconsole.table(result.conflicts);\nconsole.info(api.getDiagnostics().performance);\n```\n\n`GridState` v1 inputs migrate to v2 automatically. `GridFeature` manifests can declare `version`, `requires` and `conflicts`; invalid graphs are isolated before setup side effects run. JavaScript/JSON option patches are sanitized from the same metadata registry used by Core and framework adapters.\n\n0.13 added a built-in/headless column workbench and cancellable lazy trees:\n\n```ts\napi.openColumnWorkbench();\nconst columns = api.getColumnWorkbenchItems();\n\nconst treeOptions = {\n treeData: true,\n isTreeRowExpandable: ({ data }) => data.hasChildren,\n loadTreeChildren: ({ data, signal }) => catalogApi.children(data.id, { signal })\n};\n```\n\nXLSX stays outside Core; install `@agile-team/mach-table-xlsx` only on Excel routes.\n\nPolished editing and row actions are built in rather than adapter-specific:\n\n```ts\nimport { rowActionsColumn } from \"@agile-team/mach-table\";\n\nconst options = {\n editType: \"fullRow\" as const,\n columnDefs: [\n { field: \"name\", editable: true },\n { field: \"age\", editable: true, cellEditor: \"number\" },\n rowActionsColumn({ onView, onDelete, overflow: \"drawer\" })\n ]\n};\n```\n\nCell mode remains the default and renders a subtle pencil plus inline confirm/cancel controls. Use `editableIndicator: \"always\" | \"hover\" | \"none\"` to match the page density.\n\n0.14 removes common page glue with automatic GridState persistence, an explicit error overlay, compact row keys and framework-neutral toolbar commands:\n\n```ts\nimport { createMachTableCommands } from \"@agile-team/mach-table\";\n\nconst commands = createMachTableCommands({ getApi: () => api });\ncommands.search(\"pending\");\nawait commands.refresh();\n\napi.setOverlay(\"error\", () => \"Request failed. Please retry.\");\n```\n\n`rowKey: \"id\"` is shorthand for a stable field path; `getRowId` remains available for derived IDs and wins when both are present. `domLayout: \"autoHeight\"` is intended only for small client-side tables—normal virtual layout remains the large-data default.\n\nColumn resizing is deliberately opt-in. Set `enableColumnResize: true`; add `stateKey` to remember the complete workspace, or `columnStateKey` to remember only widths/order/visibility/pinning/sort. Pointer cancellation rolls back, completed drags persist once, and untouched automatic/flex columns remain responsive.\n\nFor framework applications use the official adapters:\n\n- Vue 3: [`@agile-team/mach-table-vue`](https://www.npmjs.com/package/@agile-team/mach-table-vue)\n- React 18+: [`@agile-team/mach-table-react`](https://www.npmjs.com/package/@agile-team/mach-table-react)\n\nDocumentation: [Quick start](https://github.com/ChenyCHENYU/MachTable/blob/main/docs/guide/getting-started.md) · [Enterprise integration](https://github.com/ChenyCHENYU/MachTable/blob/main/docs/guide/enterprise-integration.md) · [API](https://github.com/ChenyCHENYU/MachTable/tree/main/docs/api)\n\n> Overlay strings render as text by default. Prefer HTMLElement factories for rich content; enable `allowUnsafeOverlayHtml` only for fully trusted static markup.\n\nSource-available © ChenyCHENYU (Agile Team). Any use requires prior written authorization. See the [license](https://github.com/ChenyCHENYU/MachTable/blob/main/LICENSE) and [authorization process](https://github.com/ChenyCHENYU/MachTable/blob/main/LICENSING.md).\n"
74
75
  }