@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.
- package/README.md +1 -1
- package/dist/index.cjs +5 -6
- package/dist/index.d.cts +33 -8
- package/dist/index.d.ts +33 -8
- package/dist/index.js +5 -6
- package/dist/{worker-P1ks_WSx.d.cts → worker-DsFc5zec.d.cts} +31 -0
- package/dist/{worker-P1ks_WSx.d.ts → worker-DsFc5zec.d.ts} +31 -0
- package/dist/worker.cjs +0 -1
- package/dist/worker.d.cts +1 -1
- package/dist/worker.d.ts +1 -1
- package/dist/worker.js +0 -1
- package/package.json +3 -2
- package/dist/index.cjs.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/worker.cjs.map +0 -1
- package/dist/worker.js.map +0 -1
|
@@ -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-
|
|
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-
|
|
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.
|
|
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
|
}
|