@toclocoinc/lattice-grid 1.66.0 → 1.68.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/angular/package.json +1 -1
- package/docs/API.html +87 -29
- package/docs/api-detail.html +40 -5
- package/lattice-grid.d.ts +20 -7
- package/lattice-grid.esm.min.js +35 -11
- package/lattice-grid.min.cjs +35 -11
- package/lattice-grid.min.js +35 -11
- package/modules/ai.d.ts +1 -1
- package/modules/ai.esm.min.js +3 -3
- package/modules/ai.min.cjs +3 -3
- package/modules/ai.min.js +3 -3
- package/modules/angular.d.ts +1 -1
- package/modules/angular.esm.min.js +3 -3
- package/modules/angular.min.cjs +3 -3
- package/modules/angular.min.js +3 -3
- package/modules/chart-alluvial.d.ts +1 -1
- package/modules/chart-alluvial.esm.min.js +1 -1
- package/modules/chart-alluvial.min.cjs +1 -1
- package/modules/chart-alluvial.min.js +1 -1
- package/modules/chart-arc.d.ts +1 -1
- package/modules/chart-arc.esm.min.js +1 -1
- package/modules/chart-arc.min.cjs +1 -1
- package/modules/chart-arc.min.js +1 -1
- package/modules/chart-bubblemap.d.ts +1 -1
- package/modules/chart-bubblemap.esm.min.js +1 -1
- package/modules/chart-bubblemap.min.cjs +1 -1
- package/modules/chart-bubblemap.min.js +1 -1
- package/modules/chart-bump.d.ts +1 -1
- package/modules/chart-bump.esm.min.js +1 -1
- package/modules/chart-bump.min.cjs +1 -1
- package/modules/chart-bump.min.js +1 -1
- package/modules/chart-calendar.d.ts +1 -1
- package/modules/chart-calendar.esm.min.js +1 -1
- package/modules/chart-calendar.min.cjs +1 -1
- package/modules/chart-calendar.min.js +1 -1
- package/modules/chart-decomposition.d.ts +1 -1
- package/modules/chart-decomposition.esm.min.js +1 -1
- package/modules/chart-decomposition.min.cjs +1 -1
- package/modules/chart-decomposition.min.js +1 -1
- package/modules/chart-diverging.d.ts +1 -1
- package/modules/chart-diverging.esm.min.js +1 -1
- package/modules/chart-diverging.min.cjs +1 -1
- package/modules/chart-diverging.min.js +1 -1
- package/modules/chart-dumbbell.d.ts +1 -1
- package/modules/chart-dumbbell.esm.min.js +1 -1
- package/modules/chart-dumbbell.min.cjs +1 -1
- package/modules/chart-dumbbell.min.js +1 -1
- package/modules/chart-fan.d.ts +1 -1
- package/modules/chart-fan.esm.min.js +1 -1
- package/modules/chart-fan.min.cjs +1 -1
- package/modules/chart-fan.min.js +1 -1
- package/modules/chart-hexbin.d.ts +1 -1
- package/modules/chart-hexbin.esm.min.js +1 -1
- package/modules/chart-hexbin.min.cjs +1 -1
- package/modules/chart-hexbin.min.js +1 -1
- package/modules/chart-hexmap.d.ts +1 -1
- package/modules/chart-hexmap.esm.min.js +1 -1
- package/modules/chart-hexmap.min.cjs +1 -1
- package/modules/chart-hexmap.min.js +1 -1
- package/modules/chart-icicle.d.ts +1 -1
- package/modules/chart-icicle.esm.min.js +1 -1
- package/modules/chart-icicle.min.cjs +1 -1
- package/modules/chart-icicle.min.js +1 -1
- package/modules/chart-markermap.d.ts +1 -1
- package/modules/chart-markermap.esm.min.js +1 -1
- package/modules/chart-markermap.min.cjs +1 -1
- package/modules/chart-markermap.min.js +1 -1
- package/modules/chart-parallel.d.ts +1 -1
- package/modules/chart-parallel.esm.min.js +1 -1
- package/modules/chart-parallel.min.cjs +1 -1
- package/modules/chart-parallel.min.js +1 -1
- package/modules/chart-ridgeline.d.ts +1 -1
- package/modules/chart-ridgeline.esm.min.js +1 -1
- package/modules/chart-ridgeline.min.cjs +1 -1
- package/modules/chart-ridgeline.min.js +1 -1
- package/modules/chart-roc.d.ts +1 -1
- package/modules/chart-roc.esm.min.js +1 -1
- package/modules/chart-roc.min.cjs +1 -1
- package/modules/chart-roc.min.js +1 -1
- package/modules/chart-slope.d.ts +1 -1
- package/modules/chart-slope.esm.min.js +1 -1
- package/modules/chart-slope.min.cjs +1 -1
- package/modules/chart-slope.min.js +1 -1
- package/modules/chart-splom.d.ts +1 -1
- package/modules/chart-splom.esm.min.js +1 -1
- package/modules/chart-splom.min.cjs +1 -1
- package/modules/chart-splom.min.js +1 -1
- package/modules/chart-waffle.d.ts +1 -1
- package/modules/chart-waffle.esm.min.js +1 -1
- package/modules/chart-waffle.min.cjs +1 -1
- package/modules/chart-waffle.min.js +1 -1
- package/modules/charts.d.ts +1 -1
- package/modules/charts.esm.min.js +1376 -1249
- package/modules/charts.min.cjs +1376 -1249
- package/modules/charts.min.js +1376 -1249
- package/modules/data-router.d.ts +8 -3
- package/modules/data-router.esm.min.js +229 -11
- package/modules/data-router.min.cjs +229 -11
- package/modules/data-router.min.js +229 -11
- package/modules/devtools.d.ts +1 -1
- package/modules/devtools.esm.min.js +1 -1
- package/modules/devtools.min.cjs +1 -1
- package/modules/devtools.min.js +1 -1
- package/modules/dhtmlx-compat.d.ts +1 -1
- package/modules/dhtmlx-compat.esm.min.js +3 -3
- package/modules/dhtmlx-compat.min.cjs +3 -3
- package/modules/dhtmlx-compat.min.js +3 -3
- package/modules/gantt.d.ts +8 -3
- package/modules/gantt.esm.min.js +56 -8
- package/modules/gantt.min.cjs +56 -8
- package/modules/gantt.min.js +56 -8
- package/modules/geo-europe-nuts.d.ts +1 -1
- package/modules/geo-europe-nuts.esm.min.js +1 -1
- package/modules/geo-uk.d.ts +1 -1
- package/modules/geo-uk.esm.min.js +1 -1
- package/modules/geo-us-states.d.ts +1 -1
- package/modules/geo-us-states.esm.min.js +1 -1
- package/modules/geo-world-110m.d.ts +1 -1
- package/modules/geo-world-110m.esm.min.js +1 -1
- package/modules/geo-world-50m.d.ts +1 -1
- package/modules/geo-world-50m.esm.min.js +1 -1
- package/modules/htmx.d.ts +1 -1
- package/modules/htmx.esm.min.js +35 -11
- package/modules/htmx.min.cjs +35 -11
- package/modules/htmx.min.js +35 -11
- package/modules/kanban.d.ts +10 -3
- package/modules/kanban.esm.min.js +24 -4
- package/modules/kanban.min.cjs +24 -4
- package/modules/kanban.min.js +24 -4
- package/modules/kpi.d.ts +35 -10
- package/modules/kpi.esm.min.js +55 -7
- package/modules/kpi.min.cjs +55 -7
- package/modules/kpi.min.js +55 -7
- package/modules/layout.d.ts +1 -1
- package/modules/layout.esm.min.js +3 -3
- package/modules/layout.min.cjs +3 -3
- package/modules/layout.min.js +3 -3
- package/modules/mock-socket.d.ts +1 -1
- package/modules/mock-socket.esm.min.js +1 -1
- package/modules/mock-socket.min.cjs +1 -1
- package/modules/mock-socket.min.js +1 -1
- package/modules/react.d.ts +1 -1
- package/modules/react.esm.min.js +3 -3
- package/modules/react.min.cjs +3 -3
- package/modules/react.min.js +3 -3
- package/modules/svelte.d.ts +1 -1
- package/modules/svelte.esm.min.js +3 -3
- package/modules/svelte.min.cjs +3 -3
- package/modules/svelte.min.js +3 -3
- package/modules/tabs.d.ts +1 -1
- package/modules/tabs.esm.min.js +13 -14
- package/modules/tabs.min.cjs +13 -14
- package/modules/tabs.min.js +13 -14
- package/modules/vue.d.ts +1 -1
- package/modules/vue.esm.min.js +3 -3
- package/modules/vue.min.cjs +3 -3
- package/modules/vue.min.js +3 -3
- package/modules/webcomponent.d.ts +1 -1
- package/modules/webcomponent.esm.min.js +35 -11
- package/modules/webcomponent.min.cjs +35 -11
- package/modules/webcomponent.min.js +35 -11
- package/package.json +1 -1
package/modules/data-router.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* Lattice Grid 1.
|
|
2
|
+
* Lattice Grid 1.68.0, data-router module type declarations
|
|
3
3
|
* Copyright (c) 2026 TOCLOCO Inc. All rights reserved.
|
|
4
4
|
* https://latticegrid.dev
|
|
5
5
|
*/
|
|
@@ -9,8 +9,13 @@
|
|
|
9
9
|
*/
|
|
10
10
|
type RouterRecord = Record<string, unknown>;
|
|
11
11
|
|
|
12
|
-
/**
|
|
13
|
-
|
|
12
|
+
/**
|
|
13
|
+
* A property name, or a function reading the value off a row, returning a
|
|
14
|
+
* string or number. Composite (`string[]`) keys are
|
|
15
|
+
* core-grid-only: a route (or an alert, or a group) keys its own partition
|
|
16
|
+
* by one value, so there is nothing for an array to join into here.
|
|
17
|
+
*/
|
|
18
|
+
type RouterKey = string | ((row: RouterRecord) => string | number);
|
|
14
19
|
|
|
15
20
|
/** A per-route diff summary returned by `load`. */
|
|
16
21
|
interface RouteDiff { added: number; updated: number; removed: number }
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* Lattice Grid 1.
|
|
2
|
+
* Lattice Grid 1.68.0, data-router module
|
|
3
3
|
* Copyright (c) 2026 TOCLOCO Inc. All rights reserved.
|
|
4
4
|
* https://latticegrid.dev
|
|
5
5
|
*/
|
|
@@ -52,12 +52,12 @@ Object.defineProperty(__exports,"frameBatched",{enumerable:true,get:function(){r
|
|
|
52
52
|
Object.defineProperty(__exports,"settleDebounce",{enumerable:true,get:function(){return settleDebounce;}});
|
|
53
53
|
Object.defineProperty(__exports,"whenIdle",{enumerable:true,get:function(){return whenIdle;}});
|
|
54
54
|
Object.defineProperty(__exports,"uid",{enumerable:true,get:function(){return uid;}});
|
|
55
|
-
const STAMPED_VERSION="1.
|
|
55
|
+
const STAMPED_VERSION="1.68.0";
|
|
56
56
|
async function resolveVersion(){
|
|
57
57
|
if(STAMPED_VERSION!=='0.0.0-source')return STAMPED_VERSION;
|
|
58
58
|
return STAMPED_VERSION;
|
|
59
59
|
}
|
|
60
|
-
const VERSION="1.
|
|
60
|
+
const VERSION="1.68.0";
|
|
61
61
|
const warned=new Set();
|
|
62
62
|
const WARNED_LIMIT=2000;
|
|
63
63
|
function rememberWarned(key){
|
|
@@ -1544,6 +1544,180 @@ grandTotals:()=>lastGrand,
|
|
|
1544
1544
|
};
|
|
1545
1545
|
}
|
|
1546
1546
|
});
|
|
1547
|
+
__def("packages/core/src/model/rowkey.js",function(__exports,__req){
|
|
1548
|
+
'use strict';
|
|
1549
|
+
Object.defineProperty(__exports,"KEY_DEPENDENT_FEATURES",{enumerable:true,get:function(){return KEY_DEPENDENT_FEATURES;}});
|
|
1550
|
+
Object.defineProperty(__exports,"compositeKey",{enumerable:true,get:function(){return compositeKey;}});
|
|
1551
|
+
Object.defineProperty(__exports,"createRowKey",{enumerable:true,get:function(){return createRowKey;}});
|
|
1552
|
+
Object.defineProperty(__exports,"warnMissingKeys",{enumerable:true,get:function(){return warnMissingKeys;}});
|
|
1553
|
+
Object.defineProperty(__exports,"groupPathKey",{enumerable:true,get:function(){return groupPathKey;}});
|
|
1554
|
+
Object.defineProperty(__exports,"splitPathKey",{enumerable:true,get:function(){return splitPathKey;}});
|
|
1555
|
+
const __m0=__req("packages/core/src/internal/util.js");
|
|
1556
|
+
const warnOnce=__m0["warnOnce"];
|
|
1557
|
+
const pathGetter=__m0["pathGetter"];
|
|
1558
|
+
const isFunction=__m0["isFunction"];
|
|
1559
|
+
const isBlank=__m0["isBlank"];
|
|
1560
|
+
const KEY_DEPENDENT_FEATURES=[
|
|
1561
|
+
'changes (rows.apply / rows.queue)',
|
|
1562
|
+
'streaming dedupe',
|
|
1563
|
+
'selection persistence',
|
|
1564
|
+
'remote reload',
|
|
1565
|
+
'cell comments',
|
|
1566
|
+
];
|
|
1567
|
+
const SEP='\u001f';
|
|
1568
|
+
function part(value){
|
|
1569
|
+
if(value===null)return'\u0000n';
|
|
1570
|
+
if(value===undefined)return'\u0000u';
|
|
1571
|
+
const t=typeof value;
|
|
1572
|
+
if(t==='string')return value;
|
|
1573
|
+
if(t==='number'||t==='bigint'||t==='boolean')return String(value);
|
|
1574
|
+
if(value instanceof Date)return`\u0000d${value.getTime()}`;
|
|
1575
|
+
try{
|
|
1576
|
+
return`\u0000o${JSON.stringify(value)}`;
|
|
1577
|
+
}catch{
|
|
1578
|
+
return'\u0000o?';
|
|
1579
|
+
}
|
|
1580
|
+
}
|
|
1581
|
+
function compositeKey(parts){
|
|
1582
|
+
if(parts.length===1)return part(parts[0]);
|
|
1583
|
+
let out='';
|
|
1584
|
+
for(let i=0;i<parts.length;i++){
|
|
1585
|
+
if(i)out+=SEP;
|
|
1586
|
+
out+=part(parts[i]);
|
|
1587
|
+
}
|
|
1588
|
+
return out;
|
|
1589
|
+
}
|
|
1590
|
+
function createRowKey(spec,opts={}){
|
|
1591
|
+
const warn=opts.warn!==false;
|
|
1592
|
+
if(isFunction(spec)){
|
|
1593
|
+
const fn=(spec);
|
|
1594
|
+
return{
|
|
1595
|
+
stable:true,
|
|
1596
|
+
fields:[],
|
|
1597
|
+
disabled:[],
|
|
1598
|
+
key(data,index){
|
|
1599
|
+
try{
|
|
1600
|
+
const value=fn(data);
|
|
1601
|
+
return Array.isArray(value)?compositeKey(value):part(value);
|
|
1602
|
+
}catch(err){
|
|
1603
|
+
warnOnce('rowKey.throw','rowKey function threw; falling back to index identity for the affected rows.',err);
|
|
1604
|
+
return`#${index??-1}`;
|
|
1605
|
+
}
|
|
1606
|
+
},
|
|
1607
|
+
keyEmpty(data){
|
|
1608
|
+
try{
|
|
1609
|
+
const value=fn(data);
|
|
1610
|
+
return Array.isArray(value)?value.length===0||value.some(isBlank):isBlank(value);
|
|
1611
|
+
}catch{
|
|
1612
|
+
return false;
|
|
1613
|
+
}
|
|
1614
|
+
},
|
|
1615
|
+
missingFields(){return[];},
|
|
1616
|
+
};
|
|
1617
|
+
}
|
|
1618
|
+
if(Array.isArray(spec)&&spec.length>0){
|
|
1619
|
+
const fields=spec.filter((f)=>typeof f==='string');
|
|
1620
|
+
const getters=fields.map((f)=>pathGetter(f));
|
|
1621
|
+
const n=getters.length;
|
|
1622
|
+
return{
|
|
1623
|
+
stable:true,
|
|
1624
|
+
fields,
|
|
1625
|
+
disabled:[],
|
|
1626
|
+
key(data){
|
|
1627
|
+
const parts=new Array(n);
|
|
1628
|
+
for(let i=0;i<n;i++)parts[i]=getters[i](data);
|
|
1629
|
+
return compositeKey(parts);
|
|
1630
|
+
},
|
|
1631
|
+
keyEmpty(data){
|
|
1632
|
+
for(let i=0;i<n;i++)if(isBlank(getters[i](data)))return true;
|
|
1633
|
+
return false;
|
|
1634
|
+
},
|
|
1635
|
+
missingFields(data){
|
|
1636
|
+
const out=[];
|
|
1637
|
+
for(let i=0;i<n;i++)if(isBlank(getters[i](data)))out.push(fields[i]);
|
|
1638
|
+
return out;
|
|
1639
|
+
},
|
|
1640
|
+
};
|
|
1641
|
+
}
|
|
1642
|
+
if(typeof spec==='string'&&spec.length>0){
|
|
1643
|
+
const get=pathGetter(spec);
|
|
1644
|
+
return{
|
|
1645
|
+
stable:true,
|
|
1646
|
+
fields:[spec],
|
|
1647
|
+
disabled:[],
|
|
1648
|
+
key(data){
|
|
1649
|
+
return part(get(data));
|
|
1650
|
+
},
|
|
1651
|
+
keyEmpty(data){
|
|
1652
|
+
return isBlank(get(data));
|
|
1653
|
+
},
|
|
1654
|
+
missingFields(data){
|
|
1655
|
+
return isBlank(get(data))?[spec]:[];
|
|
1656
|
+
},
|
|
1657
|
+
};
|
|
1658
|
+
}
|
|
1659
|
+
if(warn){
|
|
1660
|
+
warnOnce(
|
|
1661
|
+
'rowKey.missing',
|
|
1662
|
+
`no rowKey configured, so rows are identified by object identity. This disables: ${KEY_DEPENDENT_FEATURES.join(', ')}. Set rowKey to a field name, an array of field names, or a function.`,
|
|
1663
|
+
);
|
|
1664
|
+
}
|
|
1665
|
+
return{
|
|
1666
|
+
stable:false,
|
|
1667
|
+
fields:[],
|
|
1668
|
+
disabled:KEY_DEPENDENT_FEATURES.slice(),
|
|
1669
|
+
key(data,index){
|
|
1670
|
+
if(data===null||typeof data!=='object'){
|
|
1671
|
+
return`#${index??0}:${String(data)}`;
|
|
1672
|
+
}
|
|
1673
|
+
let assigned=autoKeys.get(data);
|
|
1674
|
+
if(assigned===undefined){
|
|
1675
|
+
assigned=`#${autoKeySeq++}`;
|
|
1676
|
+
autoKeys.set(data,assigned);
|
|
1677
|
+
}
|
|
1678
|
+
return assigned;
|
|
1679
|
+
},
|
|
1680
|
+
};
|
|
1681
|
+
}
|
|
1682
|
+
const autoKeys=new WeakMap();
|
|
1683
|
+
let autoKeySeq=0;
|
|
1684
|
+
function warnMissingKeys(resolver,rows){
|
|
1685
|
+
if(!resolver||resolver.stable===false||!isFunction(resolver.keyEmpty))return;
|
|
1686
|
+
if(!Array.isArray(rows)||rows.length===0)return;
|
|
1687
|
+
let missing=0;
|
|
1688
|
+
let sampleFields=null;
|
|
1689
|
+
let sampleData;
|
|
1690
|
+
for(let i=0;i<rows.length;i++){
|
|
1691
|
+
const data=rows[i];
|
|
1692
|
+
if(!resolver.keyEmpty(data))continue;
|
|
1693
|
+
missing++;
|
|
1694
|
+
if(sampleFields===null){
|
|
1695
|
+
sampleFields=isFunction(resolver.missingFields)?resolver.missingFields(data):[];
|
|
1696
|
+
sampleData=data;
|
|
1697
|
+
}
|
|
1698
|
+
}
|
|
1699
|
+
if(missing===0)return;
|
|
1700
|
+
const dedupFields=resolver.fields.length?resolver.fields.join(','):'(function)';
|
|
1701
|
+
const named=sampleFields&&sampleFields.length
|
|
1702
|
+
?sampleFields.join(', ')
|
|
1703
|
+
:(resolver.fields.length?resolver.fields.join(', '):'the rowKey function');
|
|
1704
|
+
const present=sampleData!==null&&typeof sampleData==='object'
|
|
1705
|
+
?(Object.keys((sampleData)).join(', ')||'(no fields)')
|
|
1706
|
+
:String(sampleData);
|
|
1707
|
+
warnOnce(
|
|
1708
|
+
`rowKey.emptyValue:${dedupFields}`,
|
|
1709
|
+
`rowKey ${named} is missing on ${missing} of ${rows.length} rows; the first such row has: ${present}. `
|
|
1710
|
+
+'Rows without a key value collapse onto one key, so selection, edits and rows.apply updates land on '
|
|
1711
|
+
+'whichever row now shares it. Set rowKey to a field present on every row, or fix the source data.',
|
|
1712
|
+
);
|
|
1713
|
+
}
|
|
1714
|
+
function groupPathKey(path){
|
|
1715
|
+
return compositeKey(path);
|
|
1716
|
+
}
|
|
1717
|
+
function splitPathKey(key){
|
|
1718
|
+
return key.split(SEP);
|
|
1719
|
+
}
|
|
1720
|
+
});
|
|
1547
1721
|
__def("packages/modules/data-router/devtools.js",function(__exports,__req){
|
|
1548
1722
|
'use strict';
|
|
1549
1723
|
Object.defineProperty(__exports,"mountRouterDevtools",{enumerable:true,get:function(){return mountRouterDevtools;}});
|
|
@@ -1629,13 +1803,37 @@ const warnOnce=__m0["warnOnce"];
|
|
|
1629
1803
|
const __m1=__req("packages/core/src/source/pushdown.js");
|
|
1630
1804
|
const planQuery=__m1["planQuery"];
|
|
1631
1805
|
const capabilitiesOf=__m1["capabilitiesOf"];
|
|
1632
|
-
const __m2=__req("packages/
|
|
1633
|
-
const
|
|
1806
|
+
const __m2=__req("packages/core/src/model/rowkey.js");
|
|
1807
|
+
const compositeKey=__m2["compositeKey"];
|
|
1808
|
+
const __m3=__req("packages/modules/data-router/devtools.js");
|
|
1809
|
+
const mountRouterDevtools=__m3["mountRouterDevtools"];
|
|
1634
1810
|
function resolver(spec,fallback){
|
|
1635
1811
|
if(typeof spec==='function')return spec;
|
|
1636
1812
|
if(typeof spec==='string')return(row)=>row[spec];
|
|
1637
1813
|
return fallback;
|
|
1638
1814
|
}
|
|
1815
|
+
function rowKeyTypeName(v){
|
|
1816
|
+
if(Array.isArray(v))return'array';
|
|
1817
|
+
if(v===null)return'null';
|
|
1818
|
+
return typeof v;
|
|
1819
|
+
}
|
|
1820
|
+
function assertRowKeySpec(spec,where){
|
|
1821
|
+
if(spec===undefined)return spec;
|
|
1822
|
+
if(typeof spec==='string'&&spec.length>0)return spec;
|
|
1823
|
+
if(typeof spec==='function'){
|
|
1824
|
+
return(row)=>{
|
|
1825
|
+
const key=spec(row);
|
|
1826
|
+
if(typeof key==='string')return key;
|
|
1827
|
+
if(typeof key==='number'&&Number.isFinite(key))return key;
|
|
1828
|
+
throw new Error(
|
|
1829
|
+
`lattice-data-router: rowKey function must return a string or number; got ${rowKeyTypeName(key)}.`,
|
|
1830
|
+
);
|
|
1831
|
+
};
|
|
1832
|
+
}
|
|
1833
|
+
throw new Error(
|
|
1834
|
+
`lattice-data-router: rowKey must be a property name or a function; composite keys are not supported on ${where}.`,
|
|
1835
|
+
);
|
|
1836
|
+
}
|
|
1639
1837
|
function comparator(sort){
|
|
1640
1838
|
if(typeof sort==='function')return sort;
|
|
1641
1839
|
if(sort&&typeof sort==='object'&&typeof sort.key==='string'){
|
|
@@ -1661,6 +1859,8 @@ const maxLag=(Number.isFinite(spec.maxLag)&&spec.maxLag>=0)?Math.floor(Number(sp
|
|
|
1661
1859
|
if(minInterval===0&&sample===1&&maxLag===null)return null;
|
|
1662
1860
|
return{minInterval,sample,maxLag};
|
|
1663
1861
|
}
|
|
1862
|
+
let routeSeq=0;
|
|
1863
|
+
function nextRouteId(){routeSeq+=1;return`r${routeSeq}`;}
|
|
1664
1864
|
function grouper(groupBy){
|
|
1665
1865
|
const specs=Array.isArray(groupBy)?groupBy:[groupBy];
|
|
1666
1866
|
const parts=specs.map((s)=>({name:typeof s==='string'?s:null,get:resolver(s,()=>undefined)}));
|
|
@@ -1672,7 +1872,7 @@ const v=part.get(row);
|
|
|
1672
1872
|
vals.push(v);
|
|
1673
1873
|
if(part.name)fields[part.name]=v;
|
|
1674
1874
|
}
|
|
1675
|
-
return{key:vals
|
|
1875
|
+
return{key:compositeKey(vals),fields};
|
|
1676
1876
|
};
|
|
1677
1877
|
}
|
|
1678
1878
|
function aggregateOne(spec,rows){
|
|
@@ -1748,7 +1948,7 @@ return evalCondition(node,row);
|
|
|
1748
1948
|
}
|
|
1749
1949
|
function createDataRouter(opts={}){
|
|
1750
1950
|
const partOf=resolver(opts.key,()=>undefined);
|
|
1751
|
-
const defaultKeyOf=resolver(opts.rowKey,(row)=>row.rowKey);
|
|
1951
|
+
const defaultKeyOf=resolver(assertRowKeySpec(opts.rowKey,'routes'),(row)=>row.rowKey);
|
|
1752
1952
|
const overlap=!!opts.overlap;
|
|
1753
1953
|
const onUnrouted=typeof opts.onUnrouted==='function'?opts.onUnrouted:null;
|
|
1754
1954
|
const debounceMs=Number.isFinite(opts.selectionDebounce)?Number(opts.selectionDebounce):16;
|
|
@@ -1841,10 +2041,25 @@ return fallbackRoute?[fallbackRoute]:[];
|
|
|
1841
2041
|
};
|
|
1842
2042
|
const applyChange=(route,change)=>{
|
|
1843
2043
|
if(change.add.length||change.update.length||change.remove.length){
|
|
1844
|
-
route.sink(change);
|
|
2044
|
+
const result=route.sink(change);
|
|
2045
|
+
warnRejectedRemovals(route,result);
|
|
1845
2046
|
}
|
|
1846
2047
|
return{added:change.add.length,updated:change.update.length,removed:change.remove.length};
|
|
1847
2048
|
};
|
|
2049
|
+
const warnRejectedRemovals=(route,result)=>{
|
|
2050
|
+
const rejected=(result)?.rejected;
|
|
2051
|
+
if(!Array.isArray(rejected)||!rejected.length)return;
|
|
2052
|
+
const removals=rejected.filter((r)=>r&&r.operation==='remove');
|
|
2053
|
+
if(!removals.length)return;
|
|
2054
|
+
const name=route.label||`route ${route.routeId}`;
|
|
2055
|
+
warnOnce(
|
|
2056
|
+
`data-router:remove-rejected:${route.routeId}`,
|
|
2057
|
+
`route "${name}" asked its target to remove ${removals.length} row(s) the target does not have`
|
|
2058
|
+
+` (for example ${JSON.stringify(String(removals[0].id))}). The rows are still on screen.`
|
|
2059
|
+
+' This is a key mismatch: the key the route derives for a row is not the key the grid derives'
|
|
2060
|
+
+' for it. Check that the route\'s `rowKey` names the same value as the grid\'s.',
|
|
2061
|
+
);
|
|
2062
|
+
};
|
|
1848
2063
|
const passes=(route,row)=>{
|
|
1849
2064
|
for(const link of links){
|
|
1850
2065
|
if(link.to!==route.grid)continue;
|
|
@@ -1882,7 +2097,9 @@ shown=new Map(summaries.map((s)=>[s.gkey,s.row]));
|
|
|
1882
2097
|
let rows=kept;
|
|
1883
2098
|
if(route.sort)rows=rows.slice().sort(route.sort);
|
|
1884
2099
|
shown=new Map();
|
|
1885
|
-
for(const row of rows)
|
|
2100
|
+
for(const row of rows){
|
|
2101
|
+
shown.set(compositeKey([route.keyOf(row)]),route.transform?route.transform(row):row);
|
|
2102
|
+
}
|
|
1886
2103
|
}
|
|
1887
2104
|
const add=[];
|
|
1888
2105
|
const update=[];
|
|
@@ -2031,9 +2248,10 @@ return()=>{};
|
|
|
2031
2248
|
};
|
|
2032
2249
|
const makeRoute=(grid,match,o)=>({
|
|
2033
2250
|
grid,
|
|
2251
|
+
routeId:nextRouteId(),
|
|
2034
2252
|
sink:targetSink(grid),
|
|
2035
2253
|
match,
|
|
2036
|
-
keyOf:resolver(o.rowKey,defaultKeyOf),
|
|
2254
|
+
keyOf:resolver(assertRowKeySpec(o.rowKey,'routes'),defaultKeyOf),
|
|
2037
2255
|
partition:new Map(),
|
|
2038
2256
|
keys:new Map(),
|
|
2039
2257
|
transform:typeof o.transform==='function'?o.transform:null,
|
|
@@ -2726,7 +2944,7 @@ const match=typeof predicate==='function'
|
|
|
2726
2944
|
:(row)=>partOf(row)===predicate;
|
|
2727
2945
|
const al={
|
|
2728
2946
|
match,
|
|
2729
|
-
keyOf:resolver(o.rowKey,defaultKeyOf),
|
|
2947
|
+
keyOf:resolver(assertRowKeySpec(o.rowKey,'alerts'),defaultKeyOf),
|
|
2730
2948
|
filter:typeof o.filter==='function'?o.filter:null,
|
|
2731
2949
|
condition:typeof condition==='function'?condition:()=>false,
|
|
2732
2950
|
handler:typeof handler==='function'?handler:()=>{},
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* Lattice Grid 1.
|
|
2
|
+
* Lattice Grid 1.68.0, data-router module
|
|
3
3
|
* Copyright (c) 2026 TOCLOCO Inc. All rights reserved.
|
|
4
4
|
* https://latticegrid.dev
|
|
5
5
|
*/
|
|
@@ -54,12 +54,12 @@ Object.defineProperty(__exports,"frameBatched",{enumerable:true,get:function(){r
|
|
|
54
54
|
Object.defineProperty(__exports,"settleDebounce",{enumerable:true,get:function(){return settleDebounce;}});
|
|
55
55
|
Object.defineProperty(__exports,"whenIdle",{enumerable:true,get:function(){return whenIdle;}});
|
|
56
56
|
Object.defineProperty(__exports,"uid",{enumerable:true,get:function(){return uid;}});
|
|
57
|
-
const STAMPED_VERSION="1.
|
|
57
|
+
const STAMPED_VERSION="1.68.0";
|
|
58
58
|
async function resolveVersion(){
|
|
59
59
|
if(STAMPED_VERSION!=='0.0.0-source')return STAMPED_VERSION;
|
|
60
60
|
return STAMPED_VERSION;
|
|
61
61
|
}
|
|
62
|
-
const VERSION="1.
|
|
62
|
+
const VERSION="1.68.0";
|
|
63
63
|
const warned=new Set();
|
|
64
64
|
const WARNED_LIMIT=2000;
|
|
65
65
|
function rememberWarned(key){
|
|
@@ -1546,6 +1546,180 @@ grandTotals:()=>lastGrand,
|
|
|
1546
1546
|
};
|
|
1547
1547
|
}
|
|
1548
1548
|
});
|
|
1549
|
+
__def("packages/core/src/model/rowkey.js",function(__exports,__req){
|
|
1550
|
+
'use strict';
|
|
1551
|
+
Object.defineProperty(__exports,"KEY_DEPENDENT_FEATURES",{enumerable:true,get:function(){return KEY_DEPENDENT_FEATURES;}});
|
|
1552
|
+
Object.defineProperty(__exports,"compositeKey",{enumerable:true,get:function(){return compositeKey;}});
|
|
1553
|
+
Object.defineProperty(__exports,"createRowKey",{enumerable:true,get:function(){return createRowKey;}});
|
|
1554
|
+
Object.defineProperty(__exports,"warnMissingKeys",{enumerable:true,get:function(){return warnMissingKeys;}});
|
|
1555
|
+
Object.defineProperty(__exports,"groupPathKey",{enumerable:true,get:function(){return groupPathKey;}});
|
|
1556
|
+
Object.defineProperty(__exports,"splitPathKey",{enumerable:true,get:function(){return splitPathKey;}});
|
|
1557
|
+
const __m0=__req("packages/core/src/internal/util.js");
|
|
1558
|
+
const warnOnce=__m0["warnOnce"];
|
|
1559
|
+
const pathGetter=__m0["pathGetter"];
|
|
1560
|
+
const isFunction=__m0["isFunction"];
|
|
1561
|
+
const isBlank=__m0["isBlank"];
|
|
1562
|
+
const KEY_DEPENDENT_FEATURES=[
|
|
1563
|
+
'changes (rows.apply / rows.queue)',
|
|
1564
|
+
'streaming dedupe',
|
|
1565
|
+
'selection persistence',
|
|
1566
|
+
'remote reload',
|
|
1567
|
+
'cell comments',
|
|
1568
|
+
];
|
|
1569
|
+
const SEP='\u001f';
|
|
1570
|
+
function part(value){
|
|
1571
|
+
if(value===null)return'\u0000n';
|
|
1572
|
+
if(value===undefined)return'\u0000u';
|
|
1573
|
+
const t=typeof value;
|
|
1574
|
+
if(t==='string')return value;
|
|
1575
|
+
if(t==='number'||t==='bigint'||t==='boolean')return String(value);
|
|
1576
|
+
if(value instanceof Date)return`\u0000d${value.getTime()}`;
|
|
1577
|
+
try{
|
|
1578
|
+
return`\u0000o${JSON.stringify(value)}`;
|
|
1579
|
+
}catch{
|
|
1580
|
+
return'\u0000o?';
|
|
1581
|
+
}
|
|
1582
|
+
}
|
|
1583
|
+
function compositeKey(parts){
|
|
1584
|
+
if(parts.length===1)return part(parts[0]);
|
|
1585
|
+
let out='';
|
|
1586
|
+
for(let i=0;i<parts.length;i++){
|
|
1587
|
+
if(i)out+=SEP;
|
|
1588
|
+
out+=part(parts[i]);
|
|
1589
|
+
}
|
|
1590
|
+
return out;
|
|
1591
|
+
}
|
|
1592
|
+
function createRowKey(spec,opts={}){
|
|
1593
|
+
const warn=opts.warn!==false;
|
|
1594
|
+
if(isFunction(spec)){
|
|
1595
|
+
const fn=(spec);
|
|
1596
|
+
return{
|
|
1597
|
+
stable:true,
|
|
1598
|
+
fields:[],
|
|
1599
|
+
disabled:[],
|
|
1600
|
+
key(data,index){
|
|
1601
|
+
try{
|
|
1602
|
+
const value=fn(data);
|
|
1603
|
+
return Array.isArray(value)?compositeKey(value):part(value);
|
|
1604
|
+
}catch(err){
|
|
1605
|
+
warnOnce('rowKey.throw','rowKey function threw; falling back to index identity for the affected rows.',err);
|
|
1606
|
+
return`#${index??-1}`;
|
|
1607
|
+
}
|
|
1608
|
+
},
|
|
1609
|
+
keyEmpty(data){
|
|
1610
|
+
try{
|
|
1611
|
+
const value=fn(data);
|
|
1612
|
+
return Array.isArray(value)?value.length===0||value.some(isBlank):isBlank(value);
|
|
1613
|
+
}catch{
|
|
1614
|
+
return false;
|
|
1615
|
+
}
|
|
1616
|
+
},
|
|
1617
|
+
missingFields(){return[];},
|
|
1618
|
+
};
|
|
1619
|
+
}
|
|
1620
|
+
if(Array.isArray(spec)&&spec.length>0){
|
|
1621
|
+
const fields=spec.filter((f)=>typeof f==='string');
|
|
1622
|
+
const getters=fields.map((f)=>pathGetter(f));
|
|
1623
|
+
const n=getters.length;
|
|
1624
|
+
return{
|
|
1625
|
+
stable:true,
|
|
1626
|
+
fields,
|
|
1627
|
+
disabled:[],
|
|
1628
|
+
key(data){
|
|
1629
|
+
const parts=new Array(n);
|
|
1630
|
+
for(let i=0;i<n;i++)parts[i]=getters[i](data);
|
|
1631
|
+
return compositeKey(parts);
|
|
1632
|
+
},
|
|
1633
|
+
keyEmpty(data){
|
|
1634
|
+
for(let i=0;i<n;i++)if(isBlank(getters[i](data)))return true;
|
|
1635
|
+
return false;
|
|
1636
|
+
},
|
|
1637
|
+
missingFields(data){
|
|
1638
|
+
const out=[];
|
|
1639
|
+
for(let i=0;i<n;i++)if(isBlank(getters[i](data)))out.push(fields[i]);
|
|
1640
|
+
return out;
|
|
1641
|
+
},
|
|
1642
|
+
};
|
|
1643
|
+
}
|
|
1644
|
+
if(typeof spec==='string'&&spec.length>0){
|
|
1645
|
+
const get=pathGetter(spec);
|
|
1646
|
+
return{
|
|
1647
|
+
stable:true,
|
|
1648
|
+
fields:[spec],
|
|
1649
|
+
disabled:[],
|
|
1650
|
+
key(data){
|
|
1651
|
+
return part(get(data));
|
|
1652
|
+
},
|
|
1653
|
+
keyEmpty(data){
|
|
1654
|
+
return isBlank(get(data));
|
|
1655
|
+
},
|
|
1656
|
+
missingFields(data){
|
|
1657
|
+
return isBlank(get(data))?[spec]:[];
|
|
1658
|
+
},
|
|
1659
|
+
};
|
|
1660
|
+
}
|
|
1661
|
+
if(warn){
|
|
1662
|
+
warnOnce(
|
|
1663
|
+
'rowKey.missing',
|
|
1664
|
+
`no rowKey configured, so rows are identified by object identity. This disables: ${KEY_DEPENDENT_FEATURES.join(', ')}. Set rowKey to a field name, an array of field names, or a function.`,
|
|
1665
|
+
);
|
|
1666
|
+
}
|
|
1667
|
+
return{
|
|
1668
|
+
stable:false,
|
|
1669
|
+
fields:[],
|
|
1670
|
+
disabled:KEY_DEPENDENT_FEATURES.slice(),
|
|
1671
|
+
key(data,index){
|
|
1672
|
+
if(data===null||typeof data!=='object'){
|
|
1673
|
+
return`#${index??0}:${String(data)}`;
|
|
1674
|
+
}
|
|
1675
|
+
let assigned=autoKeys.get(data);
|
|
1676
|
+
if(assigned===undefined){
|
|
1677
|
+
assigned=`#${autoKeySeq++}`;
|
|
1678
|
+
autoKeys.set(data,assigned);
|
|
1679
|
+
}
|
|
1680
|
+
return assigned;
|
|
1681
|
+
},
|
|
1682
|
+
};
|
|
1683
|
+
}
|
|
1684
|
+
const autoKeys=new WeakMap();
|
|
1685
|
+
let autoKeySeq=0;
|
|
1686
|
+
function warnMissingKeys(resolver,rows){
|
|
1687
|
+
if(!resolver||resolver.stable===false||!isFunction(resolver.keyEmpty))return;
|
|
1688
|
+
if(!Array.isArray(rows)||rows.length===0)return;
|
|
1689
|
+
let missing=0;
|
|
1690
|
+
let sampleFields=null;
|
|
1691
|
+
let sampleData;
|
|
1692
|
+
for(let i=0;i<rows.length;i++){
|
|
1693
|
+
const data=rows[i];
|
|
1694
|
+
if(!resolver.keyEmpty(data))continue;
|
|
1695
|
+
missing++;
|
|
1696
|
+
if(sampleFields===null){
|
|
1697
|
+
sampleFields=isFunction(resolver.missingFields)?resolver.missingFields(data):[];
|
|
1698
|
+
sampleData=data;
|
|
1699
|
+
}
|
|
1700
|
+
}
|
|
1701
|
+
if(missing===0)return;
|
|
1702
|
+
const dedupFields=resolver.fields.length?resolver.fields.join(','):'(function)';
|
|
1703
|
+
const named=sampleFields&&sampleFields.length
|
|
1704
|
+
?sampleFields.join(', ')
|
|
1705
|
+
:(resolver.fields.length?resolver.fields.join(', '):'the rowKey function');
|
|
1706
|
+
const present=sampleData!==null&&typeof sampleData==='object'
|
|
1707
|
+
?(Object.keys((sampleData)).join(', ')||'(no fields)')
|
|
1708
|
+
:String(sampleData);
|
|
1709
|
+
warnOnce(
|
|
1710
|
+
`rowKey.emptyValue:${dedupFields}`,
|
|
1711
|
+
`rowKey ${named} is missing on ${missing} of ${rows.length} rows; the first such row has: ${present}. `
|
|
1712
|
+
+'Rows without a key value collapse onto one key, so selection, edits and rows.apply updates land on '
|
|
1713
|
+
+'whichever row now shares it. Set rowKey to a field present on every row, or fix the source data.',
|
|
1714
|
+
);
|
|
1715
|
+
}
|
|
1716
|
+
function groupPathKey(path){
|
|
1717
|
+
return compositeKey(path);
|
|
1718
|
+
}
|
|
1719
|
+
function splitPathKey(key){
|
|
1720
|
+
return key.split(SEP);
|
|
1721
|
+
}
|
|
1722
|
+
});
|
|
1549
1723
|
__def("packages/modules/data-router/devtools.js",function(__exports,__req){
|
|
1550
1724
|
'use strict';
|
|
1551
1725
|
Object.defineProperty(__exports,"mountRouterDevtools",{enumerable:true,get:function(){return mountRouterDevtools;}});
|
|
@@ -1631,13 +1805,37 @@ const warnOnce=__m0["warnOnce"];
|
|
|
1631
1805
|
const __m1=__req("packages/core/src/source/pushdown.js");
|
|
1632
1806
|
const planQuery=__m1["planQuery"];
|
|
1633
1807
|
const capabilitiesOf=__m1["capabilitiesOf"];
|
|
1634
|
-
const __m2=__req("packages/
|
|
1635
|
-
const
|
|
1808
|
+
const __m2=__req("packages/core/src/model/rowkey.js");
|
|
1809
|
+
const compositeKey=__m2["compositeKey"];
|
|
1810
|
+
const __m3=__req("packages/modules/data-router/devtools.js");
|
|
1811
|
+
const mountRouterDevtools=__m3["mountRouterDevtools"];
|
|
1636
1812
|
function resolver(spec,fallback){
|
|
1637
1813
|
if(typeof spec==='function')return spec;
|
|
1638
1814
|
if(typeof spec==='string')return(row)=>row[spec];
|
|
1639
1815
|
return fallback;
|
|
1640
1816
|
}
|
|
1817
|
+
function rowKeyTypeName(v){
|
|
1818
|
+
if(Array.isArray(v))return'array';
|
|
1819
|
+
if(v===null)return'null';
|
|
1820
|
+
return typeof v;
|
|
1821
|
+
}
|
|
1822
|
+
function assertRowKeySpec(spec,where){
|
|
1823
|
+
if(spec===undefined)return spec;
|
|
1824
|
+
if(typeof spec==='string'&&spec.length>0)return spec;
|
|
1825
|
+
if(typeof spec==='function'){
|
|
1826
|
+
return(row)=>{
|
|
1827
|
+
const key=spec(row);
|
|
1828
|
+
if(typeof key==='string')return key;
|
|
1829
|
+
if(typeof key==='number'&&Number.isFinite(key))return key;
|
|
1830
|
+
throw new Error(
|
|
1831
|
+
`lattice-data-router: rowKey function must return a string or number; got ${rowKeyTypeName(key)}.`,
|
|
1832
|
+
);
|
|
1833
|
+
};
|
|
1834
|
+
}
|
|
1835
|
+
throw new Error(
|
|
1836
|
+
`lattice-data-router: rowKey must be a property name or a function; composite keys are not supported on ${where}.`,
|
|
1837
|
+
);
|
|
1838
|
+
}
|
|
1641
1839
|
function comparator(sort){
|
|
1642
1840
|
if(typeof sort==='function')return sort;
|
|
1643
1841
|
if(sort&&typeof sort==='object'&&typeof sort.key==='string'){
|
|
@@ -1663,6 +1861,8 @@ const maxLag=(Number.isFinite(spec.maxLag)&&spec.maxLag>=0)?Math.floor(Number(sp
|
|
|
1663
1861
|
if(minInterval===0&&sample===1&&maxLag===null)return null;
|
|
1664
1862
|
return{minInterval,sample,maxLag};
|
|
1665
1863
|
}
|
|
1864
|
+
let routeSeq=0;
|
|
1865
|
+
function nextRouteId(){routeSeq+=1;return`r${routeSeq}`;}
|
|
1666
1866
|
function grouper(groupBy){
|
|
1667
1867
|
const specs=Array.isArray(groupBy)?groupBy:[groupBy];
|
|
1668
1868
|
const parts=specs.map((s)=>({name:typeof s==='string'?s:null,get:resolver(s,()=>undefined)}));
|
|
@@ -1674,7 +1874,7 @@ const v=part.get(row);
|
|
|
1674
1874
|
vals.push(v);
|
|
1675
1875
|
if(part.name)fields[part.name]=v;
|
|
1676
1876
|
}
|
|
1677
|
-
return{key:vals
|
|
1877
|
+
return{key:compositeKey(vals),fields};
|
|
1678
1878
|
};
|
|
1679
1879
|
}
|
|
1680
1880
|
function aggregateOne(spec,rows){
|
|
@@ -1750,7 +1950,7 @@ return evalCondition(node,row);
|
|
|
1750
1950
|
}
|
|
1751
1951
|
function createDataRouter(opts={}){
|
|
1752
1952
|
const partOf=resolver(opts.key,()=>undefined);
|
|
1753
|
-
const defaultKeyOf=resolver(opts.rowKey,(row)=>row.rowKey);
|
|
1953
|
+
const defaultKeyOf=resolver(assertRowKeySpec(opts.rowKey,'routes'),(row)=>row.rowKey);
|
|
1754
1954
|
const overlap=!!opts.overlap;
|
|
1755
1955
|
const onUnrouted=typeof opts.onUnrouted==='function'?opts.onUnrouted:null;
|
|
1756
1956
|
const debounceMs=Number.isFinite(opts.selectionDebounce)?Number(opts.selectionDebounce):16;
|
|
@@ -1843,10 +2043,25 @@ return fallbackRoute?[fallbackRoute]:[];
|
|
|
1843
2043
|
};
|
|
1844
2044
|
const applyChange=(route,change)=>{
|
|
1845
2045
|
if(change.add.length||change.update.length||change.remove.length){
|
|
1846
|
-
route.sink(change);
|
|
2046
|
+
const result=route.sink(change);
|
|
2047
|
+
warnRejectedRemovals(route,result);
|
|
1847
2048
|
}
|
|
1848
2049
|
return{added:change.add.length,updated:change.update.length,removed:change.remove.length};
|
|
1849
2050
|
};
|
|
2051
|
+
const warnRejectedRemovals=(route,result)=>{
|
|
2052
|
+
const rejected=(result)?.rejected;
|
|
2053
|
+
if(!Array.isArray(rejected)||!rejected.length)return;
|
|
2054
|
+
const removals=rejected.filter((r)=>r&&r.operation==='remove');
|
|
2055
|
+
if(!removals.length)return;
|
|
2056
|
+
const name=route.label||`route ${route.routeId}`;
|
|
2057
|
+
warnOnce(
|
|
2058
|
+
`data-router:remove-rejected:${route.routeId}`,
|
|
2059
|
+
`route "${name}" asked its target to remove ${removals.length} row(s) the target does not have`
|
|
2060
|
+
+` (for example ${JSON.stringify(String(removals[0].id))}). The rows are still on screen.`
|
|
2061
|
+
+' This is a key mismatch: the key the route derives for a row is not the key the grid derives'
|
|
2062
|
+
+' for it. Check that the route\'s `rowKey` names the same value as the grid\'s.',
|
|
2063
|
+
);
|
|
2064
|
+
};
|
|
1850
2065
|
const passes=(route,row)=>{
|
|
1851
2066
|
for(const link of links){
|
|
1852
2067
|
if(link.to!==route.grid)continue;
|
|
@@ -1884,7 +2099,9 @@ shown=new Map(summaries.map((s)=>[s.gkey,s.row]));
|
|
|
1884
2099
|
let rows=kept;
|
|
1885
2100
|
if(route.sort)rows=rows.slice().sort(route.sort);
|
|
1886
2101
|
shown=new Map();
|
|
1887
|
-
for(const row of rows)
|
|
2102
|
+
for(const row of rows){
|
|
2103
|
+
shown.set(compositeKey([route.keyOf(row)]),route.transform?route.transform(row):row);
|
|
2104
|
+
}
|
|
1888
2105
|
}
|
|
1889
2106
|
const add=[];
|
|
1890
2107
|
const update=[];
|
|
@@ -2033,9 +2250,10 @@ return()=>{};
|
|
|
2033
2250
|
};
|
|
2034
2251
|
const makeRoute=(grid,match,o)=>({
|
|
2035
2252
|
grid,
|
|
2253
|
+
routeId:nextRouteId(),
|
|
2036
2254
|
sink:targetSink(grid),
|
|
2037
2255
|
match,
|
|
2038
|
-
keyOf:resolver(o.rowKey,defaultKeyOf),
|
|
2256
|
+
keyOf:resolver(assertRowKeySpec(o.rowKey,'routes'),defaultKeyOf),
|
|
2039
2257
|
partition:new Map(),
|
|
2040
2258
|
keys:new Map(),
|
|
2041
2259
|
transform:typeof o.transform==='function'?o.transform:null,
|
|
@@ -2728,7 +2946,7 @@ const match=typeof predicate==='function'
|
|
|
2728
2946
|
:(row)=>partOf(row)===predicate;
|
|
2729
2947
|
const al={
|
|
2730
2948
|
match,
|
|
2731
|
-
keyOf:resolver(o.rowKey,defaultKeyOf),
|
|
2949
|
+
keyOf:resolver(assertRowKeySpec(o.rowKey,'alerts'),defaultKeyOf),
|
|
2732
2950
|
filter:typeof o.filter==='function'?o.filter:null,
|
|
2733
2951
|
condition:typeof condition==='function'?condition:()=>false,
|
|
2734
2952
|
handler:typeof handler==='function'?handler:()=>{},
|