@toclocoinc/lattice-grid 1.88.2 → 1.88.3
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/CHANGELOG.md +6 -0
- package/README.md +1 -1
- package/angular/fesm2022/toclocoinc-lattice-grid-angular.mjs +6 -2
- package/angular/package.json +1 -1
- package/angular/types/toclocoinc-lattice-grid-angular.d.ts +3 -1
- package/docs/API.html +62 -6
- package/docs/api/adapters.html +1 -1
- package/docs/api/ai.html +1 -1
- package/docs/api/alarms.html +1 -1
- package/docs/api/calendar.html +1 -1
- package/docs/api/charts.html +1 -1
- package/docs/api/dashboard.html +1 -1
- package/docs/api/data-router.html +1 -1
- package/docs/api/deckgl.html +1 -1
- package/docs/api/gantt.html +58 -2
- package/docs/api/geometry.html +1 -1
- package/docs/api/grid.html +2 -2
- package/docs/api/index.html +2 -2
- package/docs/api/kanban.html +1 -1
- package/docs/api/kpi.html +1 -1
- package/docs/api/layout.html +1 -1
- package/docs/api/leaflet.html +1 -1
- package/docs/api/list.html +1 -1
- package/docs/api/mapview.html +1 -1
- package/docs/api/mock-socket.html +1 -1
- package/docs/api/presets.html +1 -1
- package/docs/api/tabs.html +1 -1
- package/docs/api/types.html +2 -2
- package/docs/api-detail.html +4 -4
- package/docs/warnings.json +1 -1
- package/lattice-grid.d.ts +1 -1
- package/lattice-grid.esm.min.js +3 -3
- package/lattice-grid.min.cjs +3 -3
- package/lattice-grid.min.js +3 -3
- package/modules/ai.d.ts +1 -1
- package/modules/ai.esm.min.js +2 -2
- package/modules/ai.min.cjs +2 -2
- package/modules/ai.min.js +2 -2
- package/modules/alarms.d.ts +1 -1
- package/modules/alarms.esm.min.js +2 -2
- package/modules/alarms.min.cjs +2 -2
- package/modules/alarms.min.js +2 -2
- package/modules/angular.d.ts +1 -1
- package/modules/angular.esm.min.js +2 -2
- package/modules/angular.min.cjs +2 -2
- package/modules/angular.min.js +2 -2
- package/modules/calendar.d.ts +1 -1
- package/modules/calendar.esm.min.js +2 -2
- package/modules/calendar.min.cjs +2 -2
- package/modules/calendar.min.js +2 -2
- 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-barrace.d.ts +1 -1
- package/modules/chart-barrace.esm.min.js +1 -1
- package/modules/chart-barrace.min.cjs +1 -1
- package/modules/chart-barrace.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-choropleth.d.ts +1 -1
- package/modules/chart-choropleth.esm.min.js +1 -1
- package/modules/chart-choropleth.min.cjs +1 -1
- package/modules/chart-choropleth.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-forcetree.d.ts +1 -1
- package/modules/chart-forcetree.esm.min.js +1 -1
- package/modules/chart-forcetree.min.cjs +1 -1
- package/modules/chart-forcetree.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-motion.d.ts +1 -1
- package/modules/chart-motion.esm.min.js +1 -1
- package/modules/chart-motion.min.cjs +1 -1
- package/modules/chart-motion.min.js +1 -1
- package/modules/chart-pack.d.ts +1 -1
- package/modules/chart-pack.esm.min.js +1 -1
- package/modules/chart-pack.min.cjs +1 -1
- package/modules/chart-pack.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-pictorial.d.ts +1 -1
- package/modules/chart-pictorial.esm.min.js +1 -1
- package/modules/chart-pictorial.min.cjs +1 -1
- package/modules/chart-pictorial.min.js +1 -1
- package/modules/chart-polararea.d.ts +1 -1
- package/modules/chart-polararea.esm.min.js +1 -1
- package/modules/chart-polararea.min.cjs +1 -1
- package/modules/chart-polararea.min.js +1 -1
- package/modules/chart-polarscatter.d.ts +1 -1
- package/modules/chart-polarscatter.esm.min.js +1 -1
- package/modules/chart-polarscatter.min.cjs +1 -1
- package/modules/chart-polarscatter.min.js +1 -1
- package/modules/chart-pyramid.d.ts +1 -1
- package/modules/chart-pyramid.esm.min.js +1 -1
- package/modules/chart-pyramid.min.cjs +1 -1
- package/modules/chart-pyramid.min.js +1 -1
- package/modules/chart-radialbar.d.ts +1 -1
- package/modules/chart-radialbar.esm.min.js +1 -1
- package/modules/chart-radialbar.min.cjs +1 -1
- package/modules/chart-radialbar.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-serpentine.d.ts +1 -1
- package/modules/chart-serpentine.esm.min.js +1 -1
- package/modules/chart-serpentine.min.cjs +1 -1
- package/modules/chart-serpentine.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-spiral.d.ts +1 -1
- package/modules/chart-spiral.esm.min.js +1 -1
- package/modules/chart-spiral.min.cjs +1 -1
- package/modules/chart-spiral.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-tree.d.ts +1 -1
- package/modules/chart-tree.esm.min.js +1 -1
- package/modules/chart-tree.min.cjs +1 -1
- package/modules/chart-tree.min.js +1 -1
- package/modules/chart-venn.d.ts +1 -1
- package/modules/chart-venn.esm.min.js +1 -1
- package/modules/chart-venn.min.cjs +1 -1
- package/modules/chart-venn.min.js +1 -1
- package/modules/chart-voronoi.d.ts +1 -1
- package/modules/chart-voronoi.esm.min.js +1 -1
- package/modules/chart-voronoi.min.cjs +1 -1
- package/modules/chart-voronoi.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/chart-wordcloud.d.ts +1 -1
- package/modules/chart-wordcloud.esm.min.js +1 -1
- package/modules/chart-wordcloud.min.cjs +1 -1
- package/modules/chart-wordcloud.min.js +1 -1
- package/modules/charts.d.ts +1 -1
- package/modules/charts.esm.min.js +2 -2
- package/modules/charts.min.cjs +2 -2
- package/modules/charts.min.js +2 -2
- package/modules/dashboard.d.ts +1 -1
- package/modules/dashboard.esm.min.js +2 -2
- package/modules/dashboard.min.cjs +2 -2
- package/modules/dashboard.min.js +2 -2
- package/modules/data-router.d.ts +1 -1
- package/modules/data-router.esm.min.js +2 -2
- package/modules/data-router.min.cjs +2 -2
- package/modules/data-router.min.js +2 -2
- package/modules/deckgl.d.ts +1 -1
- package/modules/deckgl.esm.min.js +2 -2
- package/modules/deckgl.min.cjs +2 -2
- package/modules/deckgl.min.js +2 -2
- 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 +2 -2
- package/modules/dhtmlx-compat.min.cjs +2 -2
- package/modules/dhtmlx-compat.min.js +2 -2
- package/modules/gantt.d.ts +58 -3
- package/modules/gantt.esm.min.js +223 -217
- package/modules/gantt.esm.min.js.map +2 -2
- package/modules/gantt.min.cjs +222 -216
- package/modules/gantt.min.js +222 -216
- package/modules/gantt.min.js.map +2 -2
- package/modules/geo-europe-nuts.d.ts +1 -1
- package/modules/geo-europe-nuts.esm.min.js +1 -1
- package/modules/geo-europe-nuts.min.cjs +1 -1
- package/modules/geo-europe-nuts.min.js +1 -1
- package/modules/geo-uk.d.ts +1 -1
- package/modules/geo-uk.esm.min.js +1 -1
- package/modules/geo-uk.min.cjs +1 -1
- package/modules/geo-uk.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-us-states.min.cjs +1 -1
- package/modules/geo-us-states.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-110m.min.cjs +1 -1
- package/modules/geo-world-110m.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/geo-world-50m.min.cjs +1 -1
- package/modules/geo-world-50m.min.js +1 -1
- package/modules/geometry.d.ts +1 -1
- package/modules/geometry.esm.min.js +2 -2
- package/modules/geometry.min.cjs +2 -2
- package/modules/geometry.min.js +2 -2
- package/modules/htmx.d.ts +1 -1
- package/modules/htmx.esm.min.js +3 -3
- package/modules/htmx.min.cjs +3 -3
- package/modules/htmx.min.js +3 -3
- package/modules/kanban.d.ts +1 -1
- package/modules/kanban.esm.min.js +2 -2
- package/modules/kanban.min.cjs +2 -2
- package/modules/kanban.min.js +2 -2
- package/modules/kpi.d.ts +1 -1
- package/modules/kpi.esm.min.js +2 -2
- package/modules/kpi.min.cjs +2 -2
- package/modules/kpi.min.js +2 -2
- package/modules/layout.d.ts +1 -1
- package/modules/layout.esm.min.js +2 -2
- package/modules/layout.min.cjs +2 -2
- package/modules/layout.min.js +2 -2
- package/modules/leaflet.d.ts +1 -1
- package/modules/leaflet.esm.min.js +2 -2
- package/modules/leaflet.min.cjs +2 -2
- package/modules/leaflet.min.js +2 -2
- package/modules/list.d.ts +1 -1
- package/modules/list.esm.min.js +2 -2
- package/modules/list.min.cjs +2 -2
- package/modules/list.min.js +2 -2
- package/modules/mapview.d.ts +1 -1
- package/modules/mapview.esm.min.js +2 -2
- package/modules/mapview.min.cjs +2 -2
- package/modules/mapview.min.js +2 -2
- 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/presets.d.ts +1 -1
- package/modules/presets.esm.min.js +2 -2
- package/modules/presets.min.cjs +2 -2
- package/modules/presets.min.js +2 -2
- package/modules/react.d.ts +1 -1
- package/modules/react.esm.min.js +2 -2
- package/modules/react.esm.min.js.map +1 -1
- package/modules/react.min.cjs +2 -2
- package/modules/react.min.js +2 -2
- package/modules/react.min.js.map +1 -1
- package/modules/svelte.d.ts +1 -1
- package/modules/svelte.esm.min.js +3 -3
- package/modules/svelte.esm.min.js.map +1 -1
- package/modules/svelte.min.cjs +2 -2
- package/modules/svelte.min.js +2 -2
- package/modules/svelte.min.js.map +1 -1
- package/modules/tabs.d.ts +1 -1
- package/modules/tabs.esm.min.js +2 -2
- package/modules/tabs.min.cjs +2 -2
- package/modules/tabs.min.js +2 -2
- package/modules/vue.d.ts +1 -1
- package/modules/vue.esm.min.js +2 -2
- package/modules/vue.esm.min.js.map +1 -1
- package/modules/vue.min.cjs +2 -2
- package/modules/vue.min.js +2 -2
- package/modules/vue.min.js.map +1 -1
- package/modules/webcomponent.d.ts +1 -1
- package/modules/webcomponent.esm.min.js +4 -4
- package/modules/webcomponent.esm.min.js.map +1 -1
- package/modules/webcomponent.min.cjs +4 -4
- package/modules/webcomponent.min.js +4 -4
- package/modules/webcomponent.min.js.map +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -9,6 +9,12 @@ and what it means for a grid already in production.
|
|
|
9
9
|
|
|
10
10
|
## [Unreleased]
|
|
11
11
|
|
|
12
|
+
## [1.88.3] - 2026-10-07
|
|
13
|
+
|
|
14
|
+
### Added
|
|
15
|
+
|
|
16
|
+
- **The Gantt split view's table columns, and the table/timeline divider, are now resizable** (BACKLOG-0001924). Each `__colhead` carries a draggable right border with a col-resize cursor; once focused (by pointer or Tab), the arrow keys step it 8px a press, 32px with Shift. `minWidth`/`maxWidth` on a column spec clamp how far it goes, and `resizable: false` omits its border entirely. The table/timeline divider (`gridWidth`) is the same gesture. A settled drag or keystroke on either fires exactly one `columnResize` event (`{ key, width, widths }`, the divider reporting `key: 'grid'`), and every width — the divider's included — round-trips through the controller's `getState`/`setState` via the view's new `getColumnWidths()`/`setColumnWidths()`, so a host can persist a resize across a reload. Rows, bars and the workload/histogram bands stay aligned throughout, since both panels and both bands size off the same column widths the drag is updating. Declared in every framework adapter (React, Vue, Svelte, Angular).
|
|
17
|
+
|
|
12
18
|
## [1.88.2] - 2026-10-06
|
|
13
19
|
|
|
14
20
|
### Added
|
package/README.md
CHANGED
|
@@ -5,7 +5,7 @@ dependencies, no build step required. Optional adapters for React, Vue, Svelte
|
|
|
5
5
|
and Web Components ship alongside it, and Angular has compiled components of its
|
|
6
6
|
own at `@toclocoinc/lattice-grid/angular` — inside this package, not beside it.
|
|
7
7
|
|
|
8
|
-
Version 1.88.
|
|
8
|
+
Version 1.88.3 · [latticegrid.dev](https://www.latticegrid.dev) · TOCLOCO Inc
|
|
9
9
|
|
|
10
10
|
---
|
|
11
11
|
|
|
@@ -809,7 +809,7 @@ const VIEWER_EVENTS$1 = Object.freeze({
|
|
|
809
809
|
|
|
810
810
|
chart: Object.freeze(['click', 'hover', 'leave', 'draw', 'legend']),
|
|
811
811
|
|
|
812
|
-
gantt: Object.freeze(['schedule', 'error', 'history']),
|
|
812
|
+
gantt: Object.freeze(['schedule', 'error', 'history', 'columnResize']),
|
|
813
813
|
layout: Object.freeze([
|
|
814
814
|
'layout:changed', 'window:moved', 'window:resized', 'window:closed',
|
|
815
815
|
'beforeWindowClose', 'windowClose:cancelled',
|
|
@@ -2711,6 +2711,8 @@ class LatticeGanttComponent extends LatticeViewerBase {
|
|
|
2711
2711
|
this.error = new EventEmitter();
|
|
2712
2712
|
|
|
2713
2713
|
this.history = new EventEmitter();
|
|
2714
|
+
|
|
2715
|
+
this.columnResize = new EventEmitter();
|
|
2714
2716
|
}
|
|
2715
2717
|
|
|
2716
2718
|
liveProps() {
|
|
@@ -2727,7 +2729,7 @@ class LatticeGanttComponent extends LatticeViewerBase {
|
|
|
2727
2729
|
return createGantt({ ...config, element });
|
|
2728
2730
|
}
|
|
2729
2731
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: LatticeGanttComponent, deps: null, target: i0.ɵɵFactoryTarget.Component }); }
|
|
2730
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.1.7", type: LatticeGanttComponent, isStandalone: true, selector: "lattice-gantt", inputs: { config: "config", tasks: "tasks", dependencies: "dependencies" }, outputs: { schedule: "schedule", error: "error", history: "history" }, usesInheritance: true, ngImport: i0, template: '', isInline: true, styles: [":host{display:block}\n"] }); }
|
|
2732
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "22.1.7", type: LatticeGanttComponent, isStandalone: true, selector: "lattice-gantt", inputs: { config: "config", tasks: "tasks", dependencies: "dependencies" }, outputs: { schedule: "schedule", error: "error", history: "history", columnResize: "columnResize" }, usesInheritance: true, ngImport: i0, template: '', isInline: true, styles: [":host{display:block}\n"] }); }
|
|
2731
2733
|
}
|
|
2732
2734
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImport: i0, type: LatticeGanttComponent, decorators: [{
|
|
2733
2735
|
type: Component,
|
|
@@ -2744,6 +2746,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.7", ngImpor
|
|
|
2744
2746
|
type: Output
|
|
2745
2747
|
}], history: [{
|
|
2746
2748
|
type: Output
|
|
2749
|
+
}], columnResize: [{
|
|
2750
|
+
type: Output
|
|
2747
2751
|
}] } });
|
|
2748
2752
|
|
|
2749
2753
|
class LatticeLayoutComponent extends LatticeViewerBase {
|
package/angular/package.json
CHANGED
|
@@ -1186,6 +1186,8 @@ declare class LatticeGanttComponent extends LatticeViewerBase<Gantt> {
|
|
|
1186
1186
|
readonly error: EventEmitter<any>;
|
|
1187
1187
|
/** The viewer's `history` event: undo/redo availability after each change (BACKLOG-0001864). */
|
|
1188
1188
|
readonly history: EventEmitter<any>;
|
|
1189
|
+
/** The split view's `columnResize` event: a column border or the table/timeline divider settled a drag or keyboard resize (BACKLOG-0001924). */
|
|
1190
|
+
readonly columnResize: EventEmitter<any>;
|
|
1189
1191
|
/**
|
|
1190
1192
|
* The live inputs, by the names the viewer tables use.
|
|
1191
1193
|
* @returns the live props that are set
|
|
@@ -1200,7 +1202,7 @@ declare class LatticeGanttComponent extends LatticeViewerBase<Gantt> {
|
|
|
1200
1202
|
*/
|
|
1201
1203
|
protected mount(element: HTMLElement, config: Props): Gantt;
|
|
1202
1204
|
static ɵfac: i0.ɵɵFactoryDeclaration<LatticeGanttComponent, never>;
|
|
1203
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<LatticeGanttComponent, "lattice-gantt", never, { "config": { "alias": "config"; "required": false; }; "tasks": { "alias": "tasks"; "required": false; }; "dependencies": { "alias": "dependencies"; "required": false; }; }, { "schedule": "schedule"; "error": "error"; "history": "history"; }, never, never, true, never>;
|
|
1205
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<LatticeGanttComponent, "lattice-gantt", never, { "config": { "alias": "config"; "required": false; }; "tasks": { "alias": "tasks"; "required": false; }; "dependencies": { "alias": "dependencies"; "required": false; }; }, { "schedule": "schedule"; "error": "error"; "history": "history"; "columnResize": "columnResize"; }, never, never, true, never>;
|
|
1204
1206
|
}
|
|
1205
1207
|
|
|
1206
1208
|
/**
|
package/docs/API.html
CHANGED
|
@@ -382,7 +382,7 @@
|
|
|
382
382
|
<div class="shell">
|
|
383
383
|
<aside class="rail">
|
|
384
384
|
<p class="rail__brand">Lattice Grid</p>
|
|
385
|
-
<p class="rail__sub">API reference · v1.88.
|
|
385
|
+
<p class="rail__sub">API reference · v1.88.3</p>
|
|
386
386
|
<nav>
|
|
387
387
|
<div class="rail__group">
|
|
388
388
|
<span class="rail__label">Start</span>
|
|
@@ -570,7 +570,7 @@
|
|
|
570
570
|
</header>
|
|
571
571
|
|
|
572
572
|
<p class="chips">
|
|
573
|
-
<span class="chip">Version 1.88.
|
|
573
|
+
<span class="chip">Version 1.88.3</span>
|
|
574
574
|
<span class="chip">Zero dependencies</span>
|
|
575
575
|
<span class="chip"><a href="api-detail.html">Developer guide →</a></span>
|
|
576
576
|
</p>
|
|
@@ -3150,7 +3150,7 @@ grid.destroy();
|
|
|
3150
3150
|
<table>
|
|
3151
3151
|
<thead><tr><th>Member</th><th>Returns</th><th>Description</th></tr></thead>
|
|
3152
3152
|
<tbody>
|
|
3153
|
-
<tr><td class="sig">getVersion()</td><td class="type">string</td><td class="desc">The version this grid came from, e.g. <code>'1.88.
|
|
3153
|
+
<tr><td class="sig">getVersion()</td><td class="type">string</td><td class="desc">The version this grid came from, e.g. <code>'1.88.3'</code>. Also on the module as <code>getVersion()</code>, for when you have no grid to hand.</td></tr>
|
|
3154
3154
|
<tr><td class="sig">get(key)</td><td class="type">unknown</td><td class="desc">Read any configuration key.</td></tr>
|
|
3155
3155
|
<tr><td class="sig">set(key, value)</td><td class="type">void</td><td class="desc">Write one key. Every key is live; nothing needs a rebuild.</td></tr>
|
|
3156
3156
|
<tr><td class="sig">setAll(values)</td><td class="type">void</td><td class="desc">Write several in one pass. Emits one <code>config:changed</code> for the batch, not one per key.</td></tr>
|
|
@@ -11917,6 +11917,46 @@ view.setWorkloadUnit('hours'); // the same toggle the band's own switch drives
|
|
|
11917
11917
|
const after = cellText(); // the identical booking, read back as hours: 8
|
|
11918
11918
|
view.destroy();
|
|
11919
11919
|
return [before, after].join(' | ');</code></pre>
|
|
11920
|
+
<p id="split-column-resize"><strong>Split view: resizable columns and divider (BACKLOG-0001924).</strong> Every left-table column header (<code>__colhead</code>) carries a draggable right border with a col-resize cursor; once it is focused (by pointer or Tab), the arrow keys step it 8px a press, 32px with Shift. A column's own <code>minWidth</code>/<code>maxWidth</code> clamp how far it goes, and <code>resizable: false</code> omits the border entirely. The table/timeline divider (<code>gridWidth</code>) is the same gesture — a thin strip between the two panels, focusable and keyed the same way. A settled drag or keystroke on either — never mid-drag — fires exactly one <code>columnResize</code> event: <code>{ key, width, widths }</code>, the divider reporting <code>key: 'grid'</code> and <code>widths</code> carrying every column's current width plus the divider's own. The same widths are reachable any time off the view as <code>view.getColumnWidths()</code>, and round-trip through <code>gantt.getState()</code>/<code>setState()</code> — restoring a saved state calls <code>view.setColumnWidths()</code> for you.</p>
|
|
11921
|
+
<pre data-run="js" data-expect="2 | grid | 90px | none | 332 | 90" data-covers="method:gantt.mountSplit"><code>const { createTestDom } = await import('../packages/dom/src/renderer/testdom.js');
|
|
11922
|
+
const { createGantt } = await import('../packages/modules/gantt/index.js');
|
|
11923
|
+
|
|
11924
|
+
const { root, document } = createTestDom();
|
|
11925
|
+
const columns = [
|
|
11926
|
+
{ key: 'name', title: 'Task', width: 0, kind: 'name' },
|
|
11927
|
+
{ key: 'duration', title: 'Days', width: 60, kind: 'duration', minWidth: 50, maxWidth: 90 },
|
|
11928
|
+
{ key: 'locked', title: 'Locked', width: 40, resizable: false },
|
|
11929
|
+
];
|
|
11930
|
+
const gantt = createGantt({ projectStart: '2027-01-04', tasks: [{ id: 'design', name: 'Design', duration: 5 }] });
|
|
11931
|
+
const view = gantt.mountSplit(root, { gridWidth: 300, columns });
|
|
11932
|
+
const NS = 'lat-gantt-split';
|
|
11933
|
+
|
|
11934
|
+
let events = 0;
|
|
11935
|
+
let lastKey = null;
|
|
11936
|
+
gantt.on('columnResize', (e) => { events += 1; lastKey = e.key; });
|
|
11937
|
+
|
|
11938
|
+
// Drag the "Days" column's border 50px right — past its own 90px maxWidth.
|
|
11939
|
+
const handle = root.querySelector('.' + NS + '__colresize[data-resize-key="duration"]');
|
|
11940
|
+
handle.dispatchEvent({ type: 'pointerdown', target: handle, clientX: 0, clientY: 0, button: 0, bubbles: true });
|
|
11941
|
+
document.documentElement.dispatchEvent({ type: 'pointermove', target: document.documentElement, clientX: 50, clientY: 0 });
|
|
11942
|
+
document.documentElement.dispatchEvent({ type: 'pointerup', target: document.documentElement, clientX: 50, clientY: 0 });
|
|
11943
|
+
const daysWidth = root.querySelectorAll('.' + NS + '__colhead')[1].style.width;
|
|
11944
|
+
|
|
11945
|
+
// `resizable: false` grows no border to drag at all.
|
|
11946
|
+
const lockedHandle = root.querySelector('.' + NS + '__colresize[data-resize-key="locked"]');
|
|
11947
|
+
|
|
11948
|
+
// Shift+ArrowRight on the focused divider steps it 32px.
|
|
11949
|
+
const divider = root.querySelector('.' + NS + '__divider--resize');
|
|
11950
|
+
divider.dispatchEvent({ type: 'keydown', target: divider, key: 'ArrowRight', shiftKey: true, bubbles: true });
|
|
11951
|
+
|
|
11952
|
+
// Persist the resize, remount fresh, and restore it.
|
|
11953
|
+
const saved = gantt.getState();
|
|
11954
|
+
gantt.mountSplit(root, { gridWidth: 300, columns });
|
|
11955
|
+
gantt.setState(saved);
|
|
11956
|
+
const restored = gantt.getState();
|
|
11957
|
+
|
|
11958
|
+
view.destroy();
|
|
11959
|
+
return [events, lastKey, daysWidth, lockedHandle ? 'handle' : 'none', restored.gridWidth, restored.columnWidths.duration].join(' | ');</code></pre>
|
|
11920
11960
|
<p><strong>Live data.</strong> The Gantt exposes the same consumer surface as the grid — <code>gantt.rows.apply({ add, update, remove })</code>, keyed by its <code>rowKey</code> (default <code>id</code>) — so a <a href="#datarouter">Data Router</a> attaches to it exactly as it does a grid, a board or a chart. One arriving stream can hydrate and update a whole screen, the Gantt included; each change recomputes the schedule and redraws.</p>
|
|
11921
11961
|
<pre><code>import { createDataRouter } from '@toclocoinc/lattice-grid/modules/data-router';
|
|
11922
11962
|
|
|
@@ -23426,6 +23466,19 @@ return `next ${p.mean.toFixed(1)}; r2 ${f.r2.toFixed(1)}; band ${p.upper - p.low
|
|
|
23426
23466
|
<tr><td class="name">dependencyCreate:cancelled</td><td class="type"><a href="#type-GanttDependencyCreateCancelledEvent">GanttDependencyCreateCancelledEvent</a></td><td class="desc">The links that were not created, and why.</td></tr>
|
|
23427
23467
|
<tr><td class="name">taskDelete:cancelled</td><td class="type"><a href="#type-GanttTaskDeleteCancelledEvent">GanttTaskDeleteCancelledEvent</a></td><td class="desc">The task that was not deleted, and why.</td></tr>
|
|
23428
23468
|
<tr><td class="name">history</td><td class="type"><a href="#type-GanttHistoryEvent">GanttHistoryEvent</a></td><td class="desc">The undo/redo timeline's new state (BACKLOG-0001864).</td></tr>
|
|
23469
|
+
<tr><td class="name">columnResize</td><td class="type"><a href="#type-GanttColumnResizeEvent">GanttColumnResizeEvent</a></td><td class="desc">The settled column/divider width, and a snapshot of every width (BACKLOG-0001924).</td></tr>
|
|
23470
|
+
</tbody>
|
|
23471
|
+
</table>
|
|
23472
|
+
</div>
|
|
23473
|
+
<h4 id="type-GanttColumnResizeEvent">GanttColumnResizeEvent</h4>
|
|
23474
|
+
<p class="section-note">The payload of the `columnResize` event (BACKLOG-0001924), fired once a split-view column-border or table/timeline-divider drag or keyboard resize settles — never mid-drag, so one gesture is exactly one event.</p>
|
|
23475
|
+
<div class="table-wrap">
|
|
23476
|
+
<table>
|
|
23477
|
+
<thead><tr><th>Property</th><th>Type</th><th>Description</th></tr></thead>
|
|
23478
|
+
<tbody>
|
|
23479
|
+
<tr><td class="name">key</td><td class="type">string</td><td class="desc">The column `key` that was resized, or `'grid'` for the table/timeline divider.</td></tr>
|
|
23480
|
+
<tr><td class="name">width</td><td class="type">number</td><td class="desc">The settled width, in pixels, after the column's/divider's own `minWidth`/`maxWidth` clamp.</td></tr>
|
|
23481
|
+
<tr><td class="name">widths</td><td class="type">Record<string, number></td><td class="desc">Every left-panel column's current rendered width, keyed by its own `key`, plus the divider's own width under `'grid'` — a full snapshot a host can persist directly, e.g. alongside `gantt.getState()`'s own `columnWidths` (which carries the same shape, minus `grid`).</td></tr>
|
|
23429
23482
|
</tbody>
|
|
23430
23483
|
</table>
|
|
23431
23484
|
</div>
|
|
@@ -23464,6 +23517,8 @@ return `next ${p.mean.toFixed(1)}; r2 ${f.r2.toFixed(1)}; band ${p.upper - p.low
|
|
|
23464
23517
|
<tr><td class="name">toggleResource</td><td class="type">(resource: string): void</td><td class="desc"><code>resource: string</code></td><td class="type"><code>void</code></td><td class="desc">Expand or collapse a resource's per-task sub-rows in the workload band, and redraw.</td></tr>
|
|
23465
23518
|
<tr><td class="name">getWorkloadUnit</td><td class="type">(): 'hours' | 'percent' | 'cost'</td><td class="desc">—</td><td class="type"><code>'hours' | 'percent' | 'cost'</code></td><td class="desc">The unit the workload band (and, when mounted, the histogram band) is currently drawing in (BACKLOG-0001879, BACKLOG-0001866).</td></tr>
|
|
23466
23519
|
<tr><td class="name">setWorkloadUnit</td><td class="type">(unit: 'hours' | 'percent' | 'cost'): void</td><td class="desc"><code>unit: 'hours' | 'percent' | 'cost'</code></td><td class="type"><code>void</code></td><td class="desc">Switch the workload and histogram bands to hours, percent-of-capacity or cost (BACKLOG-0001879, BACKLOG-0001866), redraw, and announce the change in the live region. Round-trips through the controller's `getState`/`setState`. A no-op when neither band is mounted.</td></tr>
|
|
23520
|
+
<tr><td class="name">getColumnWidths</td><td class="type">(): Record<string, number></td><td class="desc">—</td><td class="type"><code>Record<string, number></code></td><td class="desc">Every left-panel column's current rendered width, keyed by column `key` (BACKLOG-0001924) — every column, not merely a resized one, so restoring this exact snapshot reproduces the layout on screen. Round-trips through the controller's `getState`/`setState`.</td></tr>
|
|
23521
|
+
<tr><td class="name">setColumnWidths</td><td class="type">(widths: Record<string, number>): void</td><td class="desc"><code>widths: Record<string, number></code></td><td class="type"><code>void</code></td><td class="desc">Restore column widths from {@link getColumnWidths} (BACKLOG-0001924). Each is clamped to that column's own `minWidth`/`maxWidth` and skipped for an unknown key or a `resizable: false` column, then the view redraws.</td></tr>
|
|
23467
23522
|
<tr><td class="name">toSVG</td><td class="type">(svgOpts?: { range?: { from?: number | string | Date; to?: number | string | Date } }): string</td><td class="desc"><code>svgOpts?: { range?: { from?: number | string | Date; to?: number | string | Date } }</code></td><td class="type"><code>string</code></td><td class="desc">Serialise this split view — the left panel, the timeline and whichever bands are mounted — to a standalone SVG string (BACKLOG-0001863), drawn with a fixed palette independent of the mounted theme. `''` before anything has been drawn.</td></tr>
|
|
23468
23523
|
<tr><td class="name">toPNG</td><td class="type">(pngOpts?: { range?: { from?: number | string | Date; to?: number | string | Date }; scale?: number; background?: string; }): Promise<Blob | null></td><td class="desc"><code>pngOpts?: { range?: { from?: number | string | Date; to?: number | string | Date }; scale?: number; background?: string; }</code></td><td class="type"><code>Promise<Blob | null></code></td><td class="desc">This split view as a PNG (BACKLOG-0001863): `toSVG` rasterised through a canvas. Makes no network request. `null` when nothing is drawn or there is no canvas to rasterise with.</td></tr>
|
|
23469
23524
|
<tr><td class="name">print</td><td class="type">(printOpts?: { paper?: 'A4' | 'Letter' | 'A3'; orientation?: 'landscape' | 'portrait'; fitToWidth?: boolean; scale?: number; title?: string | false; header?: string | ((page: number, pages: number) => string) | false; footer?: string | ((page: number, pages: number) => string) | false; }): boolean</td><td class="desc"><code>printOpts?: { paper?: 'A4' | 'Letter' | 'A3'; orientation?: 'landscape' | 'portrait'; fitToWidth?: boolean; scale?: number; title?: string | false; header?: string | ((page: number, pages: number) => string) | false; footer?: string | ((page: number, pages: number) => string) | false; }</code></td><td class="type"><code>boolean</code></td><td class="desc">Print this split view — the table, the timeline, and the workload and histogram bands when mounted — paged and scaled (BACKLOG-0001863): the table header and timeline header repeat on every page and no row is split across a page boundary. Opens the browser's own print path over a standalone document; "PDF" is whatever the browser's print dialog offers ("Save as PDF") — no server, no dependency. Always prints in a fixed, print-safe light palette, independent of the mounted theme.</td></tr>
|
|
@@ -23520,7 +23575,7 @@ return `next ${p.mean.toFixed(1)}; r2 ${f.r2.toFixed(1)}; band ${p.upper - p.low
|
|
|
23520
23575
|
<tr><td class="name">canRedo</td><td class="type">(): boolean</td><td class="desc">—</td><td class="type"><code>boolean</code></td><td class="desc">Whether there is an edit to redo (BACKLOG-0001864).</td></tr>
|
|
23521
23576
|
<tr><td class="name">clearHistory</td><td class="type">(): void</td><td class="desc">—</td><td class="type"><code>void</code></td><td class="desc">Forget the whole undo/redo timeline (BACKLOG-0001864) and emit `history`. History is also cleared by `setTasks`/`setState` and lost on reload; this is the explicit reset after loading a fresh plan through `rows.apply`.</td></tr>
|
|
23522
23577
|
<tr><td class="name">mount</td><td class="type">(container: unknown, options?: { /** * The plot width. `'container'` (the default) measures the element it was * mounted into and keeps following it, so a plan in a tab, drawer, * accordion or split pane fits without the host writing a * `ResizeObserver` (BACKLOG-0001079); a container with no box yet holds a * 720px fallback rather than drawing at zero. A number is honoured * exactly and installs no observer. Ignored under `zoom`, which warns. */ width?: number | 'container'; rowHeight?: number; labelWidth?: number; rowLabels?: boolean; showArrows?: boolean; showCritical?: boolean; showProgress?: boolean; dateAxis?: boolean; /** * The today line, as a plan day-number or a calendar date. A date is * converted into plan space through `projectEpoch` (BACKLOG-0001079), so * "put the line on the real today" is expressible for a relative plan. */ today?: number | string | Date; /** * The calendar date plan day 0 stands for (BACKLOG-0001079). * * Display-only: axis ticks, bar labels, tooltips, screen-reader text and * the built-in `'weekends'` shading move with it; the schedule, `getState` * and the CSV/MSPDI exports do not. Without it, the engine's contract makes * day 0 the Unix epoch, which is why a plan written as day offsets renders * as January 1970. A host-supplied `nonWorking` function still receives raw * plan days. */ projectEpoch?: number | string | Date | null; nonWorking?: 'weekends' | ((day: number) => boolean); label?: GanttBarLabel | ((task: GanttScheduledTask) => string); /** Whether bars can be dragged to move/resize (default true). */ editable?: boolean; /** Pixels from a bar's right edge that begin a resize rather than a move. */ resizeZone?: number; /** Time-scale zoom: a level, or raw pixels-per-day. Omit to fit the width. */ zoom?: <a href="#type-GanttZoom">GanttZoom</a> | number; /** Scroll so the today line is in view after drawing. */ scrollToToday?: boolean; /** * The task tooltip (BACKLOG-0001921): a positioned card on hover and * keyboard focus, anchored to the bar. Default true. See {@link <a href="#type-GanttTooltip">GanttTooltip</a>}. */ tooltip?: <a href="#type-GanttTooltip">GanttTooltip</a>; /** Group tasks into swimlanes by a task property name or `fn(task)`. */ groupBy?: string | ((task: <a href="#type-GanttTask">GanttTask</a>) => unknown); /** Keyboard editing + focusable bars + ARIA announcements (default true). */ keyboard?: boolean; /** Days a keyboard arrow moves/resizes a task (default 1). */ moveStep?: number; }): unknown</td><td class="desc"><code>container: unknown</code><br><code>options?: { /** * The plot width. `'container'` (the default) measures the element it was * mounted into and keeps following it, so a plan in a tab, drawer, * accordion or split pane fits without the host writing a * `ResizeObserver` (BACKLOG-0001079); a container with no box yet holds a * 720px fallback rather than drawing at zero. A number is honoured * exactly and installs no observer. Ignored under `zoom`, which warns. */ width?: number | 'container'; rowHeight?: number; labelWidth?: number; rowLabels?: boolean; showArrows?: boolean; showCritical?: boolean; showProgress?: boolean; dateAxis?: boolean; /** * The today line, as a plan day-number or a calendar date. A date is * converted into plan space through `projectEpoch` (BACKLOG-0001079), so * "put the line on the real today" is expressible for a relative plan. */ today?: number | string | Date; /** * The calendar date plan day 0 stands for (BACKLOG-0001079). * * Display-only: axis ticks, bar labels, tooltips, screen-reader text and * the built-in `'weekends'` shading move with it; the schedule, `getState` * and the CSV/MSPDI exports do not. Without it, the engine's contract makes * day 0 the Unix epoch, which is why a plan written as day offsets renders * as January 1970. A host-supplied `nonWorking` function still receives raw * plan days. */ projectEpoch?: number | string | Date | null; nonWorking?: 'weekends' | ((day: number) => boolean); label?: GanttBarLabel | ((task: GanttScheduledTask) => string); /** Whether bars can be dragged to move/resize (default true). */ editable?: boolean; /** Pixels from a bar's right edge that begin a resize rather than a move. */ resizeZone?: number; /** Time-scale zoom: a level, or raw pixels-per-day. Omit to fit the width. */ zoom?: <a href="#type-GanttZoom">GanttZoom</a> | number; /** Scroll so the today line is in view after drawing. */ scrollToToday?: boolean; /** * The task tooltip (BACKLOG-0001921): a positioned card on hover and * keyboard focus, anchored to the bar. Default true. See {@link <a href="#type-GanttTooltip">GanttTooltip</a>}. */ tooltip?: <a href="#type-GanttTooltip">GanttTooltip</a>; /** Group tasks into swimlanes by a task property name or `fn(task)`. */ groupBy?: string | ((task: <a href="#type-GanttTask">GanttTask</a>) => unknown); /** Keyboard editing + focusable bars + ARIA announcements (default true). */ keyboard?: boolean; /** Days a keyboard arrow moves/resizes a task (default 1). */ moveStep?: number; }</code></td><td class="type"><code>unknown</code></td><td class="desc">Render the plan into a container as an SVG timeline (bars, dependency arrows, critical-path highlight, today line, non-working shading, milestones, progress). The view redraws when the schedule recomputes.</td></tr>
|
|
23523
|
-
<tr><td class="name">mountSplit</td><td class="type">(container: unknown, options?: { height?: number; rowHeight?: number; headerHeight?: number; gridWidth?: number; indent?: number; zoom?: <a href="#type-GanttZoom">GanttZoom</a> | number; today?: number; nonWorking?: 'weekends' | ((day: number) => boolean); calendar?: <a href="#type-GanttCalendar">GanttCalendar</a> | null; showArrows?: boolean; showProgress?: boolean; showBaseline?: boolean; barLabel?: <a href="#type-GanttBarLabel">GanttBarLabel</a> | ((task: <a href="#type-GanttScheduledTask">GanttScheduledTask</a>) => string); /** * Surface earned-value metrics in `kind: 'evm'` columns (BACKLOG-0000958). * `true` computes EVM at the today line (or the project finish); an object * overrides the status date and the cost field names. */ evm?: boolean | { statusDate?: number | string | Date; costField?: string; actualCostField?: string }; /** * The S-curve status-date progress line (BACKLOG-0001867): a vertical line * at the status date that jogs, at each task row, to that task's actual * progress point (start + %complete × duration). `true` uses the today line * (or the project finish); an object sets the status date explicitly. The * same status date drives the `plannedPercentComplete` column. */ progressLine?: boolean | { statusDate?: number | string | Date }; /** * Whether the plan can be edited: pointer drags on the timeline and the * left panel's inline cell editors (default true). Same meaning and * default as `mount`'s. */ editable?: boolean; /** * Keyboard editing + focusable bars + ARIA announcements on the timeline * (default true). Same meaning and default as `mount`'s. */ keyboard?: boolean; /** * Pixels from a bar's right edge that begin a resize rather than a move * (default 6). Same meaning and default as `mount`'s. */ resizeZone?: number; /** * The task tooltip (BACKLOG-0001921): the SAME positioned card `mount` * draws, anchored to the hovered or keyboard-focused bar. Default true. * See {@link <a href="#type-GanttTooltip">GanttTooltip</a>}. */ tooltip?: <a href="#type-GanttTooltip">GanttTooltip</a>; /** * A `{ t(key, params) }` resolver for the view's own text — the live * region's edit announcements. Omit it and a gantt bound to a grid borrows * that grid's catalogue; a standalone plan falls back to English. */ messages?: { t: (key: string, params?: Record<string, unknown>) => string }; /** * The left panel's columns. `kind` decides what the cell shows and what a * double-click edits: `'name'` the WBS tree (edits the name), `'assignee'` * the avatars, `'progress'` the % ring (edits `percentComplete`), `'evm'` * an earned-value `metric`, and `'start'`/`'end'`/`'duration'` the * scheduled window — an ISO date, an ISO date, and a whole number of days, * each of which edits the plan through the same path a bar drag takes * (BACKLOG-0001280). `'effort'` (hours) and `'units'` (a percentage, 100 = * one full-time resource) are the optional effort-driven columns * (BACKLOG-0001868); each edits through `applyEdit`, so the task * reschedules per its `schedulingMode`. A bare string names a built-in * column, so `['name', 'duration', 'effort', 'units']` is enough. On an * editable plan the assignee cell opens the assignment picker. A column * with no `kind` shows the raw task's `key` and edits it only with * `editable: true`. */ columns?: Array<'name' | 'start' | 'end' | 'duration' | 'assignee' | 'progress' | 'effort' | 'units' | { key: string; title?: string; width?: number; kind?: 'name' | 'assignee' | 'progress' | 'evm' | 'plannedPercentComplete' | 'start' | 'end' | 'duration' | 'effort' | 'units' | 'number'; metric?: 'bac' | 'pv' | 'ev' | 'ac' | 'sv' | 'cv' | 'spi' | 'cpi'; digits?: number; editable?: boolean; editField?: string; render?: (task: GanttScheduledTask, ctx: { rawTask: GanttTask; depth: number }) => unknown }>; /** * A resource workload band beneath the split view (BACKLOG-0001281): * one row per resource on the left and, on the right, that resource's * hours per time bucket — aligned column-for-column with the timeline's * scale header, scroll-locked to it horizontally (vertically it scrolls * on its own), and redrawn in the same paint as the bars whenever the * plan changes. `true` takes the defaults below; an object overrides * them; omitted, no band is drawn. * * **Editing (BACKLOG-0001282).** A resource row expands (a disclosure * button, `aria-expanded`) into one sub-row per task it carries. The * resource's own cell is the read-only aggregate; a SUB-ROW cell accepts * a typed number of hours on a double-click whenever the view's * `editable` is on. What is typed is written to that task's `work` * contour through the same `applyEdit` choke point (and the same * `beforeTaskEdit` veto) a bar drag uses, so the bar, the table row and * the band all move in one paint — including the span, which follows the * contour: type into a column beyond the bar and the bar grows to reach * it. A bucket containing no working day declines the edit and says so. * * **Where the hours come from.** They are DERIVED from the tasks, never * supplied: a task's own `work` (or `hours`) field when it carries a * finite one, otherwise `working days × hoursPerDay × units`, divided * between the task's assignments in proportion to their units and spread * evenly over the working days the task spans. Working days are the days * this view already shades — pass the `calendar`/`nonWorking` option the * plan is scheduled with. Resources, units and capacities are the gantt's * existing vocabulary (`assignee`/`assignees`/`owner`/`assignments` on a * task; `resources`/`defaultCapacity` on `createGantt`); a task naming no * resource is carried on an "Unassigned" row rather than dropped. An * empty bucket is blank, not `0`, and a bucket over * `capacity × hoursPerDay × the bucket's working days` is marked with a * class and an accessible label. */ workload?: boolean | { /** Hours a full-time (`units: 1`) resource works in a working day; default 8. */ hoursPerDay?: number; /** The band's height in pixels, taken from the view's own `height`; default 160. */ height?: number; /** A band row's height in pixels; default 28. */ rowHeight?: number; /** Maximum decimal places in a cell, trailing zeros dropped; default 1. */ decimals?: number; /** Draw the totals row and totals column; default true. */ totals?: boolean; /** * `'hours'` (default; an existing page is unchanged) draws booked * hours; `'percent'` draws hours as a share of the resource's own * available hours that bucket — `booked ÷ available × 100`, the SAME * available-hours figure the over-capacity highlight already uses * (the per-resource calendar included), falling back to hours for a * resource with no known capacity; a bucket with a KNOWN zero (a * part-timer's non-working day, a week wholly on leave) reads "–", * never `Infinity`/`NaN` (BACKLOG-0001879). An `<button * aria-pressed>` switch in the band's header toggles it (and the * histogram band's, when one is mounted) live; the same switch is * reachable off the view as `setWorkloadUnit`/`getWorkloadUnit`. * Editing in percent mode writes HOURS: typing `50` books half the * resource's available hours in that bucket, through the identical * `applyEdit` path an hours edit uses. `'cost'` draws hours × the * resource's rate in force each day (BACKLOG-0001866), read off the * SAME `computeWorkload` pass, falling back to hours for a resource * with no rate data; cost has no capacity concept, so there is no * over-highlight or capacity line in this unit. */ unit?: 'hours' | 'percent' | 'cost'; }; /** * A resource histogram band beneath the split view, below the workload * band when both are mounted (BACKLOG-0001860): one row per resource, * drawn as bars per time bucket rather than a table of numbers, with a * capacity line and a hover/focus tooltip. `true` takes the defaults * below; an object overrides them; omitted, no band is drawn. * * The bars come from the SAME derivation the workload band uses * (`computeWorkload`, driven off `work`/`hours`/`assignments` exactly as * documented on `workload` above) — this is a second PICTURE of the same * numbers, not a second source of them. The non-stacked bar for a bucket * over capacity carries both the normal fill up to capacity and the * over-allocation fill above it; `stacked: 'task'` additionally splits * the within-capacity portion into one coloured segment per contributing * task, still capped by the one over-allocation segment on top. An * accessible table (resource, period, hours/percent, capacity, * over-allocated) is rebuilt alongside the bars on every redraw. * * Mounted alongside `workload` at a fixed `height`, the two bands share * it rather than squeezing the timeline: the timeline keeps at least * half the view, the bands shrink in proportion when both do not * otherwise fit, and — rather than ever reading as an unreadably thin * sliver of bars — the histogram collapses to its header strip (with a * console warning naming the height it needs) when even its * proportional share would leave too little room for the plot. */ histogram?: boolean | { /** Which resources to draw, and in what order; omitted draws every resource `computeWorkload` finds, Unassigned last. */ resources?: string[]; /** `'hours'` (default) draws raw hours; `'percent'` draws hours as a percentage of capacity, falling back to `'hours'` for a resource with no capacity; `'cost'` draws hours × rate (BACKLOG-0001866), falling back to `'hours'` for a resource with no rate data, with no capacity line in this unit. */ unit?: 'hours' | 'percent' | 'cost'; /** `'task'` stacks one segment per contributing task; `false` (default) draws one solid bar per bucket. */ stacked?: 'task' | false; /** The band's total height in pixels; default 160. */ height?: number; /** A band row's height in pixels; default 48. */ rowHeight?: number; }; }): <a href="#type-GanttSplitView">GanttSplitView</a></td><td class="desc"><code>container: unknown</code><br><code>options?: { height?: number; rowHeight?: number; headerHeight?: number; gridWidth?: number; indent?: number; zoom?: <a href="#type-GanttZoom">GanttZoom</a> | number; today?: number; nonWorking?: 'weekends' | ((day: number) => boolean); calendar?: <a href="#type-GanttCalendar">GanttCalendar</a> | null; showArrows?: boolean; showProgress?: boolean; showBaseline?: boolean; barLabel?: <a href="#type-GanttBarLabel">GanttBarLabel</a> | ((task: <a href="#type-GanttScheduledTask">GanttScheduledTask</a>) => string); /** * Surface earned-value metrics in `kind: 'evm'` columns (BACKLOG-0000958). * `true` computes EVM at the today line (or the project finish); an object * overrides the status date and the cost field names. */ evm?: boolean | { statusDate?: number | string | Date; costField?: string; actualCostField?: string }; /** * The S-curve status-date progress line (BACKLOG-0001867): a vertical line * at the status date that jogs, at each task row, to that task's actual * progress point (start + %complete × duration). `true` uses the today line * (or the project finish); an object sets the status date explicitly. The * same status date drives the `plannedPercentComplete` column. */ progressLine?: boolean | { statusDate?: number | string | Date }; /** * Whether the plan can be edited: pointer drags on the timeline and the * left panel's inline cell editors (default true). Same meaning and * default as `mount`'s. */ editable?: boolean; /** * Keyboard editing + focusable bars + ARIA announcements on the timeline * (default true). Same meaning and default as `mount`'s. */ keyboard?: boolean; /** * Pixels from a bar's right edge that begin a resize rather than a move * (default 6). Same meaning and default as `mount`'s. */ resizeZone?: number; /** * The task tooltip (BACKLOG-0001921): the SAME positioned card `mount` * draws, anchored to the hovered or keyboard-focused bar. Default true. * See {@link <a href="#type-GanttTooltip">GanttTooltip</a>}. */ tooltip?: <a href="#type-GanttTooltip">GanttTooltip</a>; /** * A `{ t(key, params) }` resolver for the view's own text — the live * region's edit announcements. Omit it and a gantt bound to a grid borrows * that grid's catalogue; a standalone plan falls back to English. */ messages?: { t: (key: string, params?: Record<string, unknown>) => string }; /** * The left panel's columns. `kind` decides what the cell shows and what a * double-click edits: `'name'` the WBS tree (edits the name), `'assignee'` * the avatars, `'progress'` the % ring (edits `percentComplete`), `'evm'` * an earned-value `metric`, and `'start'`/`'end'`/`'duration'` the * scheduled window — an ISO date, an ISO date, and a whole number of days, * each of which edits the plan through the same path a bar drag takes * (BACKLOG-0001280). `'effort'` (hours) and `'units'` (a percentage, 100 = * one full-time resource) are the optional effort-driven columns * (BACKLOG-0001868); each edits through `applyEdit`, so the task * reschedules per its `schedulingMode`. A bare string names a built-in * column, so `['name', 'duration', 'effort', 'units']` is enough. On an * editable plan the assignee cell opens the assignment picker. A column * with no `kind` shows the raw task's `key` and edits it only with * `editable: true`. */ columns?: Array<'name' | 'start' | 'end' | 'duration' | 'assignee' | 'progress' | 'effort' | 'units' | { key: string; title?: string; width?: number; kind?: 'name' | 'assignee' | 'progress' | 'evm' | 'plannedPercentComplete' | 'start' | 'end' | 'duration' | 'effort' | 'units' | 'number'; metric?: 'bac' | 'pv' | 'ev' | 'ac' | 'sv' | 'cv' | 'spi' | 'cpi'; digits?: number; editable?: boolean; editField?: string; render?: (task: GanttScheduledTask, ctx: { rawTask: GanttTask; depth: number }) => unknown }>; /** * A resource workload band beneath the split view (BACKLOG-0001281): * one row per resource on the left and, on the right, that resource's * hours per time bucket — aligned column-for-column with the timeline's * scale header, scroll-locked to it horizontally (vertically it scrolls * on its own), and redrawn in the same paint as the bars whenever the * plan changes. `true` takes the defaults below; an object overrides * them; omitted, no band is drawn. * * **Editing (BACKLOG-0001282).** A resource row expands (a disclosure * button, `aria-expanded`) into one sub-row per task it carries. The * resource's own cell is the read-only aggregate; a SUB-ROW cell accepts * a typed number of hours on a double-click whenever the view's * `editable` is on. What is typed is written to that task's `work` * contour through the same `applyEdit` choke point (and the same * `beforeTaskEdit` veto) a bar drag uses, so the bar, the table row and * the band all move in one paint — including the span, which follows the * contour: type into a column beyond the bar and the bar grows to reach * it. A bucket containing no working day declines the edit and says so. * * **Where the hours come from.** They are DERIVED from the tasks, never * supplied: a task's own `work` (or `hours`) field when it carries a * finite one, otherwise `working days × hoursPerDay × units`, divided * between the task's assignments in proportion to their units and spread * evenly over the working days the task spans. Working days are the days * this view already shades — pass the `calendar`/`nonWorking` option the * plan is scheduled with. Resources, units and capacities are the gantt's * existing vocabulary (`assignee`/`assignees`/`owner`/`assignments` on a * task; `resources`/`defaultCapacity` on `createGantt`); a task naming no * resource is carried on an "Unassigned" row rather than dropped. An * empty bucket is blank, not `0`, and a bucket over * `capacity × hoursPerDay × the bucket's working days` is marked with a * class and an accessible label. */ workload?: boolean | { /** Hours a full-time (`units: 1`) resource works in a working day; default 8. */ hoursPerDay?: number; /** The band's height in pixels, taken from the view's own `height`; default 160. */ height?: number; /** A band row's height in pixels; default 28. */ rowHeight?: number; /** Maximum decimal places in a cell, trailing zeros dropped; default 1. */ decimals?: number; /** Draw the totals row and totals column; default true. */ totals?: boolean; /** * `'hours'` (default; an existing page is unchanged) draws booked * hours; `'percent'` draws hours as a share of the resource's own * available hours that bucket — `booked ÷ available × 100`, the SAME * available-hours figure the over-capacity highlight already uses * (the per-resource calendar included), falling back to hours for a * resource with no known capacity; a bucket with a KNOWN zero (a * part-timer's non-working day, a week wholly on leave) reads "–", * never `Infinity`/`NaN` (BACKLOG-0001879). An `<button * aria-pressed>` switch in the band's header toggles it (and the * histogram band's, when one is mounted) live; the same switch is * reachable off the view as `setWorkloadUnit`/`getWorkloadUnit`. * Editing in percent mode writes HOURS: typing `50` books half the * resource's available hours in that bucket, through the identical * `applyEdit` path an hours edit uses. `'cost'` draws hours × the * resource's rate in force each day (BACKLOG-0001866), read off the * SAME `computeWorkload` pass, falling back to hours for a resource * with no rate data; cost has no capacity concept, so there is no * over-highlight or capacity line in this unit. */ unit?: 'hours' | 'percent' | 'cost'; }; /** * A resource histogram band beneath the split view, below the workload * band when both are mounted (BACKLOG-0001860): one row per resource, * drawn as bars per time bucket rather than a table of numbers, with a * capacity line and a hover/focus tooltip. `true` takes the defaults * below; an object overrides them; omitted, no band is drawn. * * The bars come from the SAME derivation the workload band uses * (`computeWorkload`, driven off `work`/`hours`/`assignments` exactly as * documented on `workload` above) — this is a second PICTURE of the same * numbers, not a second source of them. The non-stacked bar for a bucket * over capacity carries both the normal fill up to capacity and the * over-allocation fill above it; `stacked: 'task'` additionally splits * the within-capacity portion into one coloured segment per contributing * task, still capped by the one over-allocation segment on top. An * accessible table (resource, period, hours/percent, capacity, * over-allocated) is rebuilt alongside the bars on every redraw. * * Mounted alongside `workload` at a fixed `height`, the two bands share * it rather than squeezing the timeline: the timeline keeps at least * half the view, the bands shrink in proportion when both do not * otherwise fit, and — rather than ever reading as an unreadably thin * sliver of bars — the histogram collapses to its header strip (with a * console warning naming the height it needs) when even its * proportional share would leave too little room for the plot. */ histogram?: boolean | { /** Which resources to draw, and in what order; omitted draws every resource `computeWorkload` finds, Unassigned last. */ resources?: string[]; /** `'hours'` (default) draws raw hours; `'percent'` draws hours as a percentage of capacity, falling back to `'hours'` for a resource with no capacity; `'cost'` draws hours × rate (BACKLOG-0001866), falling back to `'hours'` for a resource with no rate data, with no capacity line in this unit. */ unit?: 'hours' | 'percent' | 'cost'; /** `'task'` stacks one segment per contributing task; `false` (default) draws one solid bar per bucket. */ stacked?: 'task' | false; /** The band's total height in pixels; default 160. */ height?: number; /** A band row's height in pixels; default 48. */ rowHeight?: number; }; }</code></td><td class="type"><code><a href="#type-GanttSplitView">GanttSplitView</a></code></td><td class="desc">Mount the JOINED split view (BACKLOG-0000938): one continuous, row-aligned surface with a left task-grid panel — by default the Task Name tree with expand/collapse, start, finish, duration, assignee avatars and a circular % ring (BACKLOG-0001285), plus any host columns — and the right timeline, sharing a single vertical scroll so every grid row lines up exactly with its bar row. The timeline scrolls horizontally on its own. Composes the controller's schedule; makes no change to grid core. The plan is editable from BOTH panes (BACKLOG-0001280): every gesture `mount` has — pointer drag to move, drag on the right edge to resize, arrow-key move, Shift+arrow resize, `l` to link, Delete — works on the timeline here, and a `start`/`end`/`duration`/`progress`/`name` column in the left panel is inline-editable on a double-click. Both routes commit through the same `applyEdit` choke point, so `beforeTaskMove`, `beforeTaskResize`, `beforeProgressChange` and `beforeTaskEdit` stay the single veto whichever pane the edit came from. The three switches that govern it carry the same meaning and the same defaults as `mount`'s: `editable` (default true) turns every edit on or off, both panes at once; `keyboard` (default true) turns off the focusable bars, the arrow-key gestures and the ARIA announcements while leaving pointer editing alone; and `resizeZone` (default 6) is how many pixels in from a bar's right edge begin a resize rather than a move. `workload` adds the resource band beneath the plan (BACKLOG-0001281), which is display-only — it reports hours, it does not accept them.</td></tr>
|
|
23578
|
+
<tr><td class="name">mountSplit</td><td class="type">(container: unknown, options?: { height?: number; rowHeight?: number; headerHeight?: number; gridWidth?: number; indent?: number; zoom?: <a href="#type-GanttZoom">GanttZoom</a> | number; today?: number; nonWorking?: 'weekends' | ((day: number) => boolean); calendar?: <a href="#type-GanttCalendar">GanttCalendar</a> | null; showArrows?: boolean; showProgress?: boolean; showBaseline?: boolean; barLabel?: <a href="#type-GanttBarLabel">GanttBarLabel</a> | ((task: <a href="#type-GanttScheduledTask">GanttScheduledTask</a>) => string); /** * Surface earned-value metrics in `kind: 'evm'` columns (BACKLOG-0000958). * `true` computes EVM at the today line (or the project finish); an object * overrides the status date and the cost field names. */ evm?: boolean | { statusDate?: number | string | Date; costField?: string; actualCostField?: string }; /** * The S-curve status-date progress line (BACKLOG-0001867): a vertical line * at the status date that jogs, at each task row, to that task's actual * progress point (start + %complete × duration). `true` uses the today line * (or the project finish); an object sets the status date explicitly. The * same status date drives the `plannedPercentComplete` column. */ progressLine?: boolean | { statusDate?: number | string | Date }; /** * Whether the plan can be edited: pointer drags on the timeline and the * left panel's inline cell editors (default true). Same meaning and * default as `mount`'s. */ editable?: boolean; /** * Keyboard editing + focusable bars + ARIA announcements on the timeline * (default true). Same meaning and default as `mount`'s. */ keyboard?: boolean; /** * Pixels from a bar's right edge that begin a resize rather than a move * (default 6). Same meaning and default as `mount`'s. */ resizeZone?: number; /** * The task tooltip (BACKLOG-0001921): the SAME positioned card `mount` * draws, anchored to the hovered or keyboard-focused bar. Default true. * See {@link <a href="#type-GanttTooltip">GanttTooltip</a>}. */ tooltip?: <a href="#type-GanttTooltip">GanttTooltip</a>; /** * A `{ t(key, params) }` resolver for the view's own text — the live * region's edit announcements. Omit it and a gantt bound to a grid borrows * that grid's catalogue; a standalone plan falls back to English. */ messages?: { t: (key: string, params?: Record<string, unknown>) => string }; /** * The left panel's columns. `kind` decides what the cell shows and what a * double-click edits: `'name'` the WBS tree (edits the name), `'assignee'` * the avatars, `'progress'` the % ring (edits `percentComplete`), `'evm'` * an earned-value `metric`, and `'start'`/`'end'`/`'duration'` the * scheduled window — an ISO date, an ISO date, and a whole number of days, * each of which edits the plan through the same path a bar drag takes * (BACKLOG-0001280). `'effort'` (hours) and `'units'` (a percentage, 100 = * one full-time resource) are the optional effort-driven columns * (BACKLOG-0001868); each edits through `applyEdit`, so the task * reschedules per its `schedulingMode`. A bare string names a built-in * column, so `['name', 'duration', 'effort', 'units']` is enough. On an * editable plan the assignee cell opens the assignment picker. A column * with no `kind` shows the raw task's `key` and edits it only with * `editable: true`. * * Every column header carries a draggable right border with a * col-resize cursor (BACKLOG-0001924): a pointer drag, or arrow keys * once the border itself is focused (8px a press, 32px with Shift). * `minWidth`/`maxWidth` clamp how far it goes; `resizable: false` omits * the border entirely. The table/timeline divider (`gridWidth`) is the * same gesture; a settled drag or keystroke on either fires exactly one * `columnResize`, and every width — the divider's included, under the * key `'grid'` — round-trips through `getState`/`setState`. */ columns?: Array<'name' | 'start' | 'end' | 'duration' | 'assignee' | 'progress' | 'effort' | 'units' | { key: string; title?: string; width?: number; kind?: 'name' | 'assignee' | 'progress' | 'evm' | 'plannedPercentComplete' | 'start' | 'end' | 'duration' | 'effort' | 'units' | 'number'; metric?: 'bac' | 'pv' | 'ev' | 'ac' | 'sv' | 'cv' | 'spi' | 'cpi'; digits?: number; editable?: boolean; editField?: string; /** The narrowest this column can be dragged/keyed to (BACKLOG-0001924); default 80 for `kind: 'name'`, 40 otherwise. */ minWidth?: number; /** The widest this column can be dragged/keyed to (BACKLOG-0001924); default unbounded. */ maxWidth?: number; /** `false` omits the resize border on this column's header (BACKLOG-0001924); default true. */ resizable?: boolean; render?: (task: GanttScheduledTask, ctx: { rawTask: GanttTask; depth: number }) => unknown; }>; /** * A resource workload band beneath the split view (BACKLOG-0001281): * one row per resource on the left and, on the right, that resource's * hours per time bucket — aligned column-for-column with the timeline's * scale header, scroll-locked to it horizontally (vertically it scrolls * on its own), and redrawn in the same paint as the bars whenever the * plan changes. `true` takes the defaults below; an object overrides * them; omitted, no band is drawn. * * **Editing (BACKLOG-0001282).** A resource row expands (a disclosure * button, `aria-expanded`) into one sub-row per task it carries. The * resource's own cell is the read-only aggregate; a SUB-ROW cell accepts * a typed number of hours on a double-click whenever the view's * `editable` is on. What is typed is written to that task's `work` * contour through the same `applyEdit` choke point (and the same * `beforeTaskEdit` veto) a bar drag uses, so the bar, the table row and * the band all move in one paint — including the span, which follows the * contour: type into a column beyond the bar and the bar grows to reach * it. A bucket containing no working day declines the edit and says so. * * **Where the hours come from.** They are DERIVED from the tasks, never * supplied: a task's own `work` (or `hours`) field when it carries a * finite one, otherwise `working days × hoursPerDay × units`, divided * between the task's assignments in proportion to their units and spread * evenly over the working days the task spans. Working days are the days * this view already shades — pass the `calendar`/`nonWorking` option the * plan is scheduled with. Resources, units and capacities are the gantt's * existing vocabulary (`assignee`/`assignees`/`owner`/`assignments` on a * task; `resources`/`defaultCapacity` on `createGantt`); a task naming no * resource is carried on an "Unassigned" row rather than dropped. An * empty bucket is blank, not `0`, and a bucket over * `capacity × hoursPerDay × the bucket's working days` is marked with a * class and an accessible label. */ workload?: boolean | { /** Hours a full-time (`units: 1`) resource works in a working day; default 8. */ hoursPerDay?: number; /** The band's height in pixels, taken from the view's own `height`; default 160. */ height?: number; /** A band row's height in pixels; default 28. */ rowHeight?: number; /** Maximum decimal places in a cell, trailing zeros dropped; default 1. */ decimals?: number; /** Draw the totals row and totals column; default true. */ totals?: boolean; /** * `'hours'` (default; an existing page is unchanged) draws booked * hours; `'percent'` draws hours as a share of the resource's own * available hours that bucket — `booked ÷ available × 100`, the SAME * available-hours figure the over-capacity highlight already uses * (the per-resource calendar included), falling back to hours for a * resource with no known capacity; a bucket with a KNOWN zero (a * part-timer's non-working day, a week wholly on leave) reads "–", * never `Infinity`/`NaN` (BACKLOG-0001879). An `<button * aria-pressed>` switch in the band's header toggles it (and the * histogram band's, when one is mounted) live; the same switch is * reachable off the view as `setWorkloadUnit`/`getWorkloadUnit`. * Editing in percent mode writes HOURS: typing `50` books half the * resource's available hours in that bucket, through the identical * `applyEdit` path an hours edit uses. `'cost'` draws hours × the * resource's rate in force each day (BACKLOG-0001866), read off the * SAME `computeWorkload` pass, falling back to hours for a resource * with no rate data; cost has no capacity concept, so there is no * over-highlight or capacity line in this unit. */ unit?: 'hours' | 'percent' | 'cost'; }; /** * A resource histogram band beneath the split view, below the workload * band when both are mounted (BACKLOG-0001860): one row per resource, * drawn as bars per time bucket rather than a table of numbers, with a * capacity line and a hover/focus tooltip. `true` takes the defaults * below; an object overrides them; omitted, no band is drawn. * * The bars come from the SAME derivation the workload band uses * (`computeWorkload`, driven off `work`/`hours`/`assignments` exactly as * documented on `workload` above) — this is a second PICTURE of the same * numbers, not a second source of them. The non-stacked bar for a bucket * over capacity carries both the normal fill up to capacity and the * over-allocation fill above it; `stacked: 'task'` additionally splits * the within-capacity portion into one coloured segment per contributing * task, still capped by the one over-allocation segment on top. An * accessible table (resource, period, hours/percent, capacity, * over-allocated) is rebuilt alongside the bars on every redraw. * * Mounted alongside `workload` at a fixed `height`, the two bands share * it rather than squeezing the timeline: the timeline keeps at least * half the view, the bands shrink in proportion when both do not * otherwise fit, and — rather than ever reading as an unreadably thin * sliver of bars — the histogram collapses to its header strip (with a * console warning naming the height it needs) when even its * proportional share would leave too little room for the plot. */ histogram?: boolean | { /** Which resources to draw, and in what order; omitted draws every resource `computeWorkload` finds, Unassigned last. */ resources?: string[]; /** `'hours'` (default) draws raw hours; `'percent'` draws hours as a percentage of capacity, falling back to `'hours'` for a resource with no capacity; `'cost'` draws hours × rate (BACKLOG-0001866), falling back to `'hours'` for a resource with no rate data, with no capacity line in this unit. */ unit?: 'hours' | 'percent' | 'cost'; /** `'task'` stacks one segment per contributing task; `false` (default) draws one solid bar per bucket. */ stacked?: 'task' | false; /** The band's total height in pixels; default 160. */ height?: number; /** A band row's height in pixels; default 48. */ rowHeight?: number; }; }): <a href="#type-GanttSplitView">GanttSplitView</a></td><td class="desc"><code>container: unknown</code><br><code>options?: { height?: number; rowHeight?: number; headerHeight?: number; gridWidth?: number; indent?: number; zoom?: <a href="#type-GanttZoom">GanttZoom</a> | number; today?: number; nonWorking?: 'weekends' | ((day: number) => boolean); calendar?: <a href="#type-GanttCalendar">GanttCalendar</a> | null; showArrows?: boolean; showProgress?: boolean; showBaseline?: boolean; barLabel?: <a href="#type-GanttBarLabel">GanttBarLabel</a> | ((task: <a href="#type-GanttScheduledTask">GanttScheduledTask</a>) => string); /** * Surface earned-value metrics in `kind: 'evm'` columns (BACKLOG-0000958). * `true` computes EVM at the today line (or the project finish); an object * overrides the status date and the cost field names. */ evm?: boolean | { statusDate?: number | string | Date; costField?: string; actualCostField?: string }; /** * The S-curve status-date progress line (BACKLOG-0001867): a vertical line * at the status date that jogs, at each task row, to that task's actual * progress point (start + %complete × duration). `true` uses the today line * (or the project finish); an object sets the status date explicitly. The * same status date drives the `plannedPercentComplete` column. */ progressLine?: boolean | { statusDate?: number | string | Date }; /** * Whether the plan can be edited: pointer drags on the timeline and the * left panel's inline cell editors (default true). Same meaning and * default as `mount`'s. */ editable?: boolean; /** * Keyboard editing + focusable bars + ARIA announcements on the timeline * (default true). Same meaning and default as `mount`'s. */ keyboard?: boolean; /** * Pixels from a bar's right edge that begin a resize rather than a move * (default 6). Same meaning and default as `mount`'s. */ resizeZone?: number; /** * The task tooltip (BACKLOG-0001921): the SAME positioned card `mount` * draws, anchored to the hovered or keyboard-focused bar. Default true. * See {@link <a href="#type-GanttTooltip">GanttTooltip</a>}. */ tooltip?: <a href="#type-GanttTooltip">GanttTooltip</a>; /** * A `{ t(key, params) }` resolver for the view's own text — the live * region's edit announcements. Omit it and a gantt bound to a grid borrows * that grid's catalogue; a standalone plan falls back to English. */ messages?: { t: (key: string, params?: Record<string, unknown>) => string }; /** * The left panel's columns. `kind` decides what the cell shows and what a * double-click edits: `'name'` the WBS tree (edits the name), `'assignee'` * the avatars, `'progress'` the % ring (edits `percentComplete`), `'evm'` * an earned-value `metric`, and `'start'`/`'end'`/`'duration'` the * scheduled window — an ISO date, an ISO date, and a whole number of days, * each of which edits the plan through the same path a bar drag takes * (BACKLOG-0001280). `'effort'` (hours) and `'units'` (a percentage, 100 = * one full-time resource) are the optional effort-driven columns * (BACKLOG-0001868); each edits through `applyEdit`, so the task * reschedules per its `schedulingMode`. A bare string names a built-in * column, so `['name', 'duration', 'effort', 'units']` is enough. On an * editable plan the assignee cell opens the assignment picker. A column * with no `kind` shows the raw task's `key` and edits it only with * `editable: true`. * * Every column header carries a draggable right border with a * col-resize cursor (BACKLOG-0001924): a pointer drag, or arrow keys * once the border itself is focused (8px a press, 32px with Shift). * `minWidth`/`maxWidth` clamp how far it goes; `resizable: false` omits * the border entirely. The table/timeline divider (`gridWidth`) is the * same gesture; a settled drag or keystroke on either fires exactly one * `columnResize`, and every width — the divider's included, under the * key `'grid'` — round-trips through `getState`/`setState`. */ columns?: Array<'name' | 'start' | 'end' | 'duration' | 'assignee' | 'progress' | 'effort' | 'units' | { key: string; title?: string; width?: number; kind?: 'name' | 'assignee' | 'progress' | 'evm' | 'plannedPercentComplete' | 'start' | 'end' | 'duration' | 'effort' | 'units' | 'number'; metric?: 'bac' | 'pv' | 'ev' | 'ac' | 'sv' | 'cv' | 'spi' | 'cpi'; digits?: number; editable?: boolean; editField?: string; /** The narrowest this column can be dragged/keyed to (BACKLOG-0001924); default 80 for `kind: 'name'`</code><br><code>40 otherwise. */ minWidth?: number; /** The widest this column can be dragged/keyed to (BACKLOG-0001924); default unbounded. */ maxWidth?: number; /** `false` omits the resize border on this column's header (BACKLOG-0001924); default true. */ resizable?: boolean; render?: (task: GanttScheduledTask, ctx: { rawTask: GanttTask; depth: number }) => unknown; }>; /** * A resource workload band beneath the split view (BACKLOG-0001281): * one row per resource on the left and, on the right, that resource's * hours per time bucket — aligned column-for-column with the timeline's * scale header, scroll-locked to it horizontally (vertically it scrolls * on its own), and redrawn in the same paint as the bars whenever the * plan changes. `true` takes the defaults below; an object overrides * them; omitted, no band is drawn. * * **Editing (BACKLOG-0001282).** A resource row expands (a disclosure * button, `aria-expanded`) into one sub-row per task it carries. The * resource's own cell is the read-only aggregate; a SUB-ROW cell accepts * a typed number of hours on a double-click whenever the view's * `editable` is on. What is typed is written to that task's `work` * contour through the same `applyEdit` choke point (and the same * `beforeTaskEdit` veto) a bar drag uses, so the bar, the table row and * the band all move in one paint — including the span, which follows the * contour: type into a column beyond the bar and the bar grows to reach * it. A bucket containing no working day declines the edit and says so. * * **Where the hours come from.** They are DERIVED from the tasks, never * supplied: a task's own `work` (or `hours`) field when it carries a * finite one, otherwise `working days × hoursPerDay × units`, divided * between the task's assignments in proportion to their units and spread * evenly over the working days the task spans. Working days are the days * this view already shades — pass the `calendar`/`nonWorking` option the * plan is scheduled with. Resources, units and capacities are the gantt's * existing vocabulary (`assignee`/`assignees`/`owner`/`assignments` on a * task; `resources`/`defaultCapacity` on `createGantt`); a task naming no * resource is carried on an "Unassigned" row rather than dropped. An * empty bucket is blank, not `0`, and a bucket over * `capacity × hoursPerDay × the bucket's working days` is marked with a * class and an accessible label. */ workload?: boolean | { /** Hours a full-time (`units: 1`) resource works in a working day; default 8. */ hoursPerDay?: number; /** The band's height in pixels, taken from the view's own `height`; default 160. */ height?: number; /** A band row's height in pixels; default 28. */ rowHeight?: number; /** Maximum decimal places in a cell, trailing zeros dropped; default 1. */ decimals?: number; /** Draw the totals row and totals column; default true. */ totals?: boolean; /** * `'hours'` (default; an existing page is unchanged) draws booked * hours; `'percent'` draws hours as a share of the resource's own * available hours that bucket — `booked ÷ available × 100`, the SAME * available-hours figure the over-capacity highlight already uses * (the per-resource calendar included), falling back to hours for a * resource with no known capacity; a bucket with a KNOWN zero (a * part-timer's non-working day, a week wholly on leave) reads "–", * never `Infinity`/`NaN` (BACKLOG-0001879). An `<button * aria-pressed>` switch in the band's header toggles it (and the * histogram band's, when one is mounted) live; the same switch is * reachable off the view as `setWorkloadUnit`/`getWorkloadUnit`. * Editing in percent mode writes HOURS: typing `50` books half the * resource's available hours in that bucket, through the identical * `applyEdit` path an hours edit uses. `'cost'` draws hours × the * resource's rate in force each day (BACKLOG-0001866), read off the * SAME `computeWorkload` pass, falling back to hours for a resource * with no rate data; cost has no capacity concept, so there is no * over-highlight or capacity line in this unit. */ unit?: 'hours' | 'percent' | 'cost'; }; /** * A resource histogram band beneath the split view, below the workload * band when both are mounted (BACKLOG-0001860): one row per resource, * drawn as bars per time bucket rather than a table of numbers, with a * capacity line and a hover/focus tooltip. `true` takes the defaults * below; an object overrides them; omitted, no band is drawn. * * The bars come from the SAME derivation the workload band uses * (`computeWorkload`, driven off `work`/`hours`/`assignments` exactly as * documented on `workload` above) — this is a second PICTURE of the same * numbers, not a second source of them. The non-stacked bar for a bucket * over capacity carries both the normal fill up to capacity and the * over-allocation fill above it; `stacked: 'task'` additionally splits * the within-capacity portion into one coloured segment per contributing * task, still capped by the one over-allocation segment on top. An * accessible table (resource, period, hours/percent, capacity, * over-allocated) is rebuilt alongside the bars on every redraw. * * Mounted alongside `workload` at a fixed `height`, the two bands share * it rather than squeezing the timeline: the timeline keeps at least * half the view, the bands shrink in proportion when both do not * otherwise fit, and — rather than ever reading as an unreadably thin * sliver of bars — the histogram collapses to its header strip (with a * console warning naming the height it needs) when even its * proportional share would leave too little room for the plot. */ histogram?: boolean | { /** Which resources to draw, and in what order; omitted draws every resource `computeWorkload` finds, Unassigned last. */ resources?: string[]; /** `'hours'` (default) draws raw hours; `'percent'` draws hours as a percentage of capacity, falling back to `'hours'` for a resource with no capacity; `'cost'` draws hours × rate (BACKLOG-0001866), falling back to `'hours'` for a resource with no rate data, with no capacity line in this unit. */ unit?: 'hours' | 'percent' | 'cost'; /** `'task'` stacks one segment per contributing task; `false` (default) draws one solid bar per bucket. */ stacked?: 'task' | false; /** The band's total height in pixels; default 160. */ height?: number; /** A band row's height in pixels; default 48. */ rowHeight?: number; }; }</code></td><td class="type"><code><a href="#type-GanttSplitView">GanttSplitView</a></code></td><td class="desc">Mount the JOINED split view (BACKLOG-0000938): one continuous, row-aligned surface with a left task-grid panel — by default the Task Name tree with expand/collapse, start, finish, duration, assignee avatars and a circular % ring (BACKLOG-0001285), plus any host columns — and the right timeline, sharing a single vertical scroll so every grid row lines up exactly with its bar row. The timeline scrolls horizontally on its own. Composes the controller's schedule; makes no change to grid core. The plan is editable from BOTH panes (BACKLOG-0001280): every gesture `mount` has — pointer drag to move, drag on the right edge to resize, arrow-key move, Shift+arrow resize, `l` to link, Delete — works on the timeline here, and a `start`/`end`/`duration`/`progress`/`name` column in the left panel is inline-editable on a double-click. Both routes commit through the same `applyEdit` choke point, so `beforeTaskMove`, `beforeTaskResize`, `beforeProgressChange` and `beforeTaskEdit` stay the single veto whichever pane the edit came from. The three switches that govern it carry the same meaning and the same defaults as `mount`'s: `editable` (default true) turns every edit on or off, both panes at once; `keyboard` (default true) turns off the focusable bars, the arrow-key gestures and the ARIA announcements while leaving pointer editing alone; and `resizeZone` (default 6) is how many pixels in from a bar's right edge begin a resize rather than a move. `workload` adds the resource band beneath the plan (BACKLOG-0001281), which is display-only — it reports hours, it does not accept them.</td></tr>
|
|
23524
23579
|
<tr><td class="name">captureBaseline</td><td class="type">(): Array<{ id: string; baselineStart: number; baselineEnd: number; baselineDuration: number }></td><td class="desc">—</td><td class="type"><code>Array<{ id: string; baselineStart: number; baselineEnd: number; baselineDuration: number }></code></td><td class="desc">Capture a baseline (planned) snapshot of the current schedule as HOST data (this does not mutate the tasks). Store it and feed it back as `baselineStart`/`baselineEnd` task fields to get variance and ghost bars.</td></tr>
|
|
23525
23580
|
<tr><td class="name">earnedValue</td><td class="type">(evmOpts?: { statusDate?: number | string | Date; costField?: string; actualCostField?: string }): <a href="#type-GanttEarnedValue">GanttEarnedValue</a></td><td class="desc"><code>evmOpts?: { statusDate?: number | string | Date; costField?: string; actualCostField?: string }</code></td><td class="type"><code><a href="#type-GanttEarnedValue">GanttEarnedValue</a></code></td><td class="desc">Compute earned-value (EVM) metrics for the current plan at a status date (BACKLOG-0000958): PV/EV/AC and the derived SV/CV/SPI/CPI per task, rolled up to summaries and the project. Budget (BAC) is the task's `cost`, or its duration when no cost is given; AC comes from `actualCost`.</td></tr>
|
|
23526
23581
|
<tr><td class="name">sCurve</td><td class="type">(scurveOpts?: { statusDate?: number | string | Date; bucket?: 'day' | 'week' | 'month'; costField?: string; actualCostField?: string }): <a href="#type-GanttSCurvePoint">GanttSCurvePoint</a>[]</td><td class="desc"><code>scurveOpts?: { statusDate?: number | string | Date; bucket?: 'day' | 'week' | 'month'; costField?: string; actualCostField?: string }</code></td><td class="type"><code><a href="#type-GanttSCurvePoint">GanttSCurvePoint</a>[]</code></td><td class="desc">Compute the cumulative S-curve for the current plan (BACKLOG-0001867) — one `{ date, pv, ev, ac }` point per time bucket from the project start to the project finish. The same arithmetic `earnedValue` performs, evaluated over time: PV climbs to the total budget at the finish, EV and AC stop at the status date.</td></tr>
|
|
@@ -23552,6 +23607,7 @@ return `next ${p.mean.toFixed(1)}; r2 ${f.r2.toFixed(1)}; band ${p.upper - p.low
|
|
|
23552
23607
|
<tr><td class="name">dependencyCreate:cancelled</td><td class="desc">A `beforeDependencyCreate` handler refused the links.</td><td class="type"><a href="#type-GanttDependencyCreateCancelledEvent">GanttDependencyCreateCancelledEvent</a></td><td class="desc">no</td></tr>
|
|
23553
23608
|
<tr><td class="name">taskDelete:cancelled</td><td class="desc">A `beforeTaskDelete` handler refused the delete.</td><td class="type"><a href="#type-GanttTaskDeleteCancelledEvent">GanttTaskDeleteCancelledEvent</a></td><td class="desc">no</td></tr>
|
|
23554
23609
|
<tr><td class="name">history</td><td class="desc">The undo/redo timeline changed — an edit was recorded, undone, redone or cleared (BACKLOG-0001864).</td><td class="type"><a href="#type-GanttHistoryEvent">GanttHistoryEvent</a></td><td class="desc">no</td></tr>
|
|
23610
|
+
<tr><td class="name">columnResize</td><td class="desc">A split-view column border or the table/timeline divider finished a drag or keyboard resize (BACKLOG-0001924). Fired once per gesture, never mid-drag.</td><td class="type"><a href="#type-GanttColumnResizeEvent">GanttColumnResizeEvent</a></td><td class="desc">no</td></tr>
|
|
23555
23611
|
</tbody>
|
|
23556
23612
|
</table>
|
|
23557
23613
|
</div>
|
|
@@ -27941,7 +27997,7 @@ return `next ${p.mean.toFixed(1)}; r2 ${f.r2.toFixed(1)}; band ${p.upper - p.low
|
|
|
27941
27997
|
<p class="section-note"><small>Declared in <code>lattice-grid/modules/gantt</code>.</small></p>
|
|
27942
27998
|
<h4 id="type-GanttEventName">GanttEventName</h4>
|
|
27943
27999
|
<p class="section-note">The events a Gantt controller raises. The controller's own, not a grid's: `grid.on` takes {@link EventName} and knows nothing about these, and a grid-bound Gantt follows the grid's events itself rather than re-publishing them. `on()` takes a name and a listener and warns about nothing, so a misspelt name is a subscription that never fires. The seven `before…` events are cancellable ({@link GanttBeforeEvent}); each has a matching `<action>:cancelled` that fires when a handler refuses, carrying the same context plus the reason. `schedule` and `error` are the recompute's own pair and are raised on every recompute, whatever caused it.</p>
|
|
27944
|
-
<p class="type-def"><code>type GanttEventName = 'schedule' | 'error' | 'beforeTaskEdit' | 'beforeTaskMove' | 'beforeTaskResize' | 'beforeProgressChange' | 'beforeMilestoneMove' | 'beforeDependencyCreate' | 'beforeTaskDelete' | 'taskEdit:cancelled' | 'taskMove:cancelled' | 'taskResize:cancelled' | 'progressChange:cancelled' | 'milestoneMove:cancelled' | 'dependencyCreate:cancelled' | 'taskDelete:cancelled' | 'history'</code></p>
|
|
28000
|
+
<p class="type-def"><code>type GanttEventName = 'schedule' | 'error' | 'beforeTaskEdit' | 'beforeTaskMove' | 'beforeTaskResize' | 'beforeProgressChange' | 'beforeMilestoneMove' | 'beforeDependencyCreate' | 'beforeTaskDelete' | 'taskEdit:cancelled' | 'taskMove:cancelled' | 'taskResize:cancelled' | 'progressChange:cancelled' | 'milestoneMove:cancelled' | 'dependencyCreate:cancelled' | 'taskDelete:cancelled' | 'history' | 'columnResize'</code></p>
|
|
27945
28001
|
<p class="section-note"><small>Declared in <code>lattice-grid/modules/gantt</code>.</small></p>
|
|
27946
28002
|
<h4 id="type-GanttLinkType">GanttLinkType</h4>
|
|
27947
28003
|
<p class="section-note">One of the four dependency link types (finish-to-start, start-to-start, finish-to-finish, start-to-finish).</p>
|
|
@@ -28543,7 +28599,7 @@ return `next ${p.mean.toFixed(1)}; r2 ${f.r2.toFixed(1)}; band ${p.upper - p.low
|
|
|
28543
28599
|
<!-- END GENERATED TYPE REFERENCE -->
|
|
28544
28600
|
|
|
28545
28601
|
<footer>
|
|
28546
|
-
Lattice Grid 1.88.
|
|
28602
|
+
Lattice Grid 1.88.3 · Copyright © 2026 TOCLOCO Inc. All rights reserved.
|
|
28547
28603
|
This document describes the behaviour of the shipped library. Where this guide and the code
|
|
28548
28604
|
disagree, the code wins: please <a href="https://www.latticegrid.dev">tell us</a>.
|
|
28549
28605
|
</footer>
|
package/docs/api/adapters.html
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
Self-contained: no stylesheet, script or font is fetched, so this opens from disk, from
|
|
14
14
|
a file share or from behind a firewall with nothing else present.
|
|
15
15
|
-->
|
|
16
|
-
<title>Adapters API Reference — Lattice Grid 1.88.
|
|
16
|
+
<title>Adapters API Reference — Lattice Grid 1.88.3</title>
|
|
17
17
|
<style>
|
|
18
18
|
/* ---------------------------------------------------------------
|
|
19
19
|
Palette lifted from the grid's own theme, so the reference reads as an
|
package/docs/api/ai.html
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
Self-contained: no stylesheet, script or font is fetched, so this opens from disk, from
|
|
14
14
|
a file share or from behind a firewall with nothing else present.
|
|
15
15
|
-->
|
|
16
|
-
<title>AI API Reference — Lattice Grid 1.88.
|
|
16
|
+
<title>AI API Reference — Lattice Grid 1.88.3</title>
|
|
17
17
|
<style>
|
|
18
18
|
/* ---------------------------------------------------------------
|
|
19
19
|
Palette lifted from the grid's own theme, so the reference reads as an
|
package/docs/api/alarms.html
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
Self-contained: no stylesheet, script or font is fetched, so this opens from disk, from
|
|
14
14
|
a file share or from behind a firewall with nothing else present.
|
|
15
15
|
-->
|
|
16
|
-
<title>Alarms API Reference — Lattice Grid 1.88.
|
|
16
|
+
<title>Alarms API Reference — Lattice Grid 1.88.3</title>
|
|
17
17
|
<style>
|
|
18
18
|
/* ---------------------------------------------------------------
|
|
19
19
|
Palette lifted from the grid's own theme, so the reference reads as an
|
package/docs/api/calendar.html
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
Self-contained: no stylesheet, script or font is fetched, so this opens from disk, from
|
|
14
14
|
a file share or from behind a firewall with nothing else present.
|
|
15
15
|
-->
|
|
16
|
-
<title>Calendar API Reference — Lattice Grid 1.88.
|
|
16
|
+
<title>Calendar API Reference — Lattice Grid 1.88.3</title>
|
|
17
17
|
<style>
|
|
18
18
|
/* ---------------------------------------------------------------
|
|
19
19
|
Palette lifted from the grid's own theme, so the reference reads as an
|
package/docs/api/charts.html
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
Self-contained: no stylesheet, script or font is fetched, so this opens from disk, from
|
|
14
14
|
a file share or from behind a firewall with nothing else present.
|
|
15
15
|
-->
|
|
16
|
-
<title>Charts API Reference — Lattice Grid 1.88.
|
|
16
|
+
<title>Charts API Reference — Lattice Grid 1.88.3</title>
|
|
17
17
|
<style>
|
|
18
18
|
/* ---------------------------------------------------------------
|
|
19
19
|
Palette lifted from the grid's own theme, so the reference reads as an
|
package/docs/api/dashboard.html
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
Self-contained: no stylesheet, script or font is fetched, so this opens from disk, from
|
|
14
14
|
a file share or from behind a firewall with nothing else present.
|
|
15
15
|
-->
|
|
16
|
-
<title>Dashboard API Reference — Lattice Grid 1.88.
|
|
16
|
+
<title>Dashboard API Reference — Lattice Grid 1.88.3</title>
|
|
17
17
|
<style>
|
|
18
18
|
/* ---------------------------------------------------------------
|
|
19
19
|
Palette lifted from the grid's own theme, so the reference reads as an
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
Self-contained: no stylesheet, script or font is fetched, so this opens from disk, from
|
|
14
14
|
a file share or from behind a firewall with nothing else present.
|
|
15
15
|
-->
|
|
16
|
-
<title>Data router API Reference — Lattice Grid 1.88.
|
|
16
|
+
<title>Data router API Reference — Lattice Grid 1.88.3</title>
|
|
17
17
|
<style>
|
|
18
18
|
/* ---------------------------------------------------------------
|
|
19
19
|
Palette lifted from the grid's own theme, so the reference reads as an
|
package/docs/api/deckgl.html
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
Self-contained: no stylesheet, script or font is fetched, so this opens from disk, from
|
|
14
14
|
a file share or from behind a firewall with nothing else present.
|
|
15
15
|
-->
|
|
16
|
-
<title>deck.gl API Reference — Lattice Grid 1.88.
|
|
16
|
+
<title>deck.gl API Reference — Lattice Grid 1.88.3</title>
|
|
17
17
|
<style>
|
|
18
18
|
/* ---------------------------------------------------------------
|
|
19
19
|
Palette lifted from the grid's own theme, so the reference reads as an
|