@koeroesi86/canvas-grid 1.0.15 → 26.11.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +238 -0
- package/build/types/cell-background/index.d.ts +25 -0
- package/build/types/cell-value/index.d.ts +21 -0
- package/build/types/character/index.d.ts +21 -0
- package/build/types/header/index.d.ts +25 -0
- package/build/types/rectangle/index.d.ts +12 -0
- package/build/types/text/index.d.ts +31 -0
- package/build/types/types.d.ts +87 -0
- package/build/types/utils/canvas.d.ts +1 -0
- package/build/types/utils/collection.d.ts +18 -0
- package/build/types/utils/column-store.d.ts +16 -0
- package/build/types/utils/data-store.d.ts +49 -0
- package/build/types/utils/jsx.d.ts +40 -0
- package/build/types/utils/layer.d.ts +24 -0
- package/build/types/utils/loading.d.ts +17 -0
- package/build/types/utils/lru-cache.d.ts +11 -0
- package/build/types/utils/renderer-registry.d.ts +13 -0
- package/build/types/utils/renderer.d.ts +26 -0
- package/build/types/utils/row-store.d.ts +37 -0
- package/build/types/utils/selectors.d.ts +3 -0
- package/build/types/web-component.d.ts +189 -0
- package/build/web-component.js +1 -732
- package/build/web-component.js.map +1 -1
- package/build/web-component.mjs +1220 -0
- package/build/web-component.mjs.map +1 -0
- package/package.json +31 -32
- package/.babelrc +0 -14
- package/.eslintrc +0 -7
- package/.github/CODEOWNERS +0 -1
- package/.github/SECURITY.md +0 -9
- package/.github/dependabot.yml +0 -11
- package/.github/workflows/ci.yml +0 -32
- package/.github/workflows/codeql.yml +0 -26
- package/.github/workflows/publish.yml +0 -51
- package/components/cellBackground/index.jsx +0 -86
- package/components/cellValue/index.jsx +0 -80
- package/components/character/index.jsx +0 -82
- package/components/component.scss +0 -45
- package/components/example.js +0 -56
- package/components/header/index.jsx +0 -100
- package/components/rectangle/index.jsx +0 -65
- package/components/text/index.jsx +0 -131
- package/components/utils/collection.js +0 -58
- package/components/utils/drawingLayer.js +0 -66
- package/components/utils/jsx.js +0 -57
- package/components/utils/loading.js +0 -58
- package/components/utils/renderer.js +0 -45
- package/components/utils/selectors.js +0 -13
- package/components/web-component.js +0 -582
- package/config/htmlGenerator.js +0 -36
- package/nodemon.json +0 -5
- package/public/index.html +0 -29
- package/scripts/build.js +0 -30
- package/scripts/dev.js +0 -64
- package/server/example.js +0 -59
- package/server/exampleServe.js +0 -3
- package/webpack.config.js +0 -151
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { RenderProps } from '../types';
|
|
2
|
+
declare abstract class Renderer<Options extends object> {
|
|
3
|
+
readonly options: Options;
|
|
4
|
+
protected constructor(options: Options);
|
|
5
|
+
/** Applies the given options and notifies `optionsUpdated` with the previous ones. */
|
|
6
|
+
update(options: Partial<Options>): void;
|
|
7
|
+
optionsUpdated(_previous: Options): void;
|
|
8
|
+
clearCache(): void;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Renderer producing a bitmap from props; usable as a JSX tag through `element`.
|
|
12
|
+
* Bitmaps are reused through a bounded LRU cache whenever `cacheKey` returns a key.
|
|
13
|
+
*/
|
|
14
|
+
export declare abstract class CanvasRenderer<Options extends object> extends Renderer<Options> {
|
|
15
|
+
private readonly bitmaps;
|
|
16
|
+
abstract render(props: RenderProps): HTMLCanvasElement;
|
|
17
|
+
/** Props with the same key must render the same pixels. Undefined disables caching. */
|
|
18
|
+
protected cacheKey(_props: RenderProps): string | undefined;
|
|
19
|
+
/** Device pixels per CSS pixel of the layer being drawn to; bitmaps are rendered at this scale to stay sharp. */
|
|
20
|
+
pixelRatio: number;
|
|
21
|
+
clearCache(): void;
|
|
22
|
+
paint(ctx: CanvasRenderingContext2D, props: RenderProps, x: number, y: number): void;
|
|
23
|
+
readonly element: import("./jsx").Component<RenderProps>;
|
|
24
|
+
private renderBitmap;
|
|
25
|
+
}
|
|
26
|
+
export default Renderer;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { Key, RowData, RowId } from '../types';
|
|
2
|
+
export type Row = RowData;
|
|
3
|
+
/**
|
|
4
|
+
* Rows in display order: a dense array with an id lookup and each row's top offset,
|
|
5
|
+
* so appends, lookups and finding the row at a scroll offset never scan every row.
|
|
6
|
+
* Removing rows renumbers the rows after the first removed one (once per call).
|
|
7
|
+
* Rows keep a `slot` into the column stores that does not change when the rows are sorted.
|
|
8
|
+
*/
|
|
9
|
+
declare class RowStore {
|
|
10
|
+
private items;
|
|
11
|
+
private readonly indexById;
|
|
12
|
+
/** `tops[i]` is the offset of row `i` from the top of the first row. */
|
|
13
|
+
private tops;
|
|
14
|
+
private end;
|
|
15
|
+
get length(): number;
|
|
16
|
+
/** Sum of all row heights. */
|
|
17
|
+
get totalHeight(): number;
|
|
18
|
+
get keys(): RowId[];
|
|
19
|
+
get(id: Key): Row | undefined;
|
|
20
|
+
at(index: number): Row | undefined;
|
|
21
|
+
topOf(index: number): number;
|
|
22
|
+
/** Index of the first row that ends below `offset`; `length` when the offset is past the last row. */
|
|
23
|
+
indexAt(offset: number): number;
|
|
24
|
+
/** Appends the row, or replaces the row with the same id in place. */
|
|
25
|
+
set(row: Omit<Row, 'index' | 'slot'>): void;
|
|
26
|
+
/**
|
|
27
|
+
* Removes the rows with the given ids, ignoring unknown ones.
|
|
28
|
+
* Returns the slots of the removed rows in ascending order, which the column stores must drop too.
|
|
29
|
+
*/
|
|
30
|
+
removeMany(ids: Key[]): number[];
|
|
31
|
+
/** Reorders the rows; the sort is stable, so equal rows keep their relative order. */
|
|
32
|
+
sort(compare: (a: Row, b: Row) => number): void;
|
|
33
|
+
clear(): void;
|
|
34
|
+
/** Recomputes positions and offsets from `from` onwards. */
|
|
35
|
+
private reindexFrom;
|
|
36
|
+
}
|
|
37
|
+
export default RowStore;
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import Collection from './utils/collection';
|
|
2
|
+
import DataStore from './utils/data-store';
|
|
3
|
+
import LruCache from './utils/lru-cache';
|
|
4
|
+
import Loading from './utils/loading';
|
|
5
|
+
import Layer from './utils/layer';
|
|
6
|
+
import RendererRegistry from './utils/renderer-registry';
|
|
7
|
+
import CellBackground from './cell-background';
|
|
8
|
+
import HeaderRenderer from './header';
|
|
9
|
+
import CellValueRenderer from './cell-value';
|
|
10
|
+
import type { LayerOptions } from './utils/layer';
|
|
11
|
+
import type { CellContext, CellRenderer, CellState, Key, RendererRef, RowId, RowInput, SortDirection, SortKey } from './types';
|
|
12
|
+
import type { RowIdGetter } from './utils/data-store';
|
|
13
|
+
/** What the grid remembers about a cell between frames. */
|
|
14
|
+
interface CellEntry {
|
|
15
|
+
/** The raw value last drawn, and its formatted text; formatting only runs when the value differs. */
|
|
16
|
+
value: unknown;
|
|
17
|
+
formatted: string | undefined;
|
|
18
|
+
animating: boolean;
|
|
19
|
+
state: CellState;
|
|
20
|
+
}
|
|
21
|
+
export interface ColumnHeader {
|
|
22
|
+
index: number;
|
|
23
|
+
id: Key;
|
|
24
|
+
displayName?: string;
|
|
25
|
+
width: number;
|
|
26
|
+
/** Renderers drawing a cell of this column, in order. Defaults to the grid's `cellRenderers`. */
|
|
27
|
+
renderers?: RendererRef[];
|
|
28
|
+
valueFormatter: (value: unknown) => string;
|
|
29
|
+
/** Renderer drawing the header of this column. */
|
|
30
|
+
headerRenderer: RendererRef;
|
|
31
|
+
}
|
|
32
|
+
export type ColumnDefinition = Key | (Partial<ColumnHeader> & {
|
|
33
|
+
id: Key;
|
|
34
|
+
});
|
|
35
|
+
export interface Transaction {
|
|
36
|
+
add?: RowInput[];
|
|
37
|
+
remove?: RowInput[];
|
|
38
|
+
update?: RowInput[];
|
|
39
|
+
}
|
|
40
|
+
interface AgApi {
|
|
41
|
+
setRowData: (data: RowInput[]) => void;
|
|
42
|
+
updateRowData: (transaction: Transaction) => void;
|
|
43
|
+
setColumnDefs: (columns: ColumnDefinition[]) => void;
|
|
44
|
+
getRowNodeId: RowIdGetter;
|
|
45
|
+
}
|
|
46
|
+
export type { CellContext, CellRenderer, CellState, LayerOptions, RendererRef, SortDirection, SortKey };
|
|
47
|
+
declare global {
|
|
48
|
+
interface HTMLElementTagNameMap {
|
|
49
|
+
'canvas-grid': CanvasGridComponent;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
declare class CanvasGridComponent extends HTMLElement {
|
|
53
|
+
fps: number;
|
|
54
|
+
_font: string;
|
|
55
|
+
_headerFont: string;
|
|
56
|
+
headerHeight: number;
|
|
57
|
+
cellHeight: number;
|
|
58
|
+
cellPadding: {
|
|
59
|
+
top: number;
|
|
60
|
+
right: number;
|
|
61
|
+
bottom: number;
|
|
62
|
+
left: number;
|
|
63
|
+
};
|
|
64
|
+
showRowNumbers: boolean;
|
|
65
|
+
showHeaders: boolean;
|
|
66
|
+
rowNumbersWidth: number;
|
|
67
|
+
ellipsis: string;
|
|
68
|
+
_backgroundColor: string;
|
|
69
|
+
_headerBackgroundColor: string;
|
|
70
|
+
textColor: string;
|
|
71
|
+
dataStore: DataStore;
|
|
72
|
+
_dataCollection: import("./utils/row-store").default;
|
|
73
|
+
/** Per-cell memory of the rows drawn recently; bounded, since only the rows in view need it. */
|
|
74
|
+
cellEntries: LruCache<Record<string, CellEntry>>;
|
|
75
|
+
getRowId: RowIdGetter;
|
|
76
|
+
headers: Collection<ColumnHeader>;
|
|
77
|
+
animationFrame: number | undefined;
|
|
78
|
+
scrollYOffset: number;
|
|
79
|
+
prevScrollYOffset: number;
|
|
80
|
+
scrollXOffset: number;
|
|
81
|
+
prevScrollXOffset: number;
|
|
82
|
+
lastRender: number;
|
|
83
|
+
lastDraw: number;
|
|
84
|
+
isScrolling: boolean;
|
|
85
|
+
scrollHelper: HTMLDivElement;
|
|
86
|
+
scrollArea: HTMLDivElement;
|
|
87
|
+
/** Canvases from bottom to top. */
|
|
88
|
+
layers: Layer[];
|
|
89
|
+
private readonly layersByName;
|
|
90
|
+
private readonly warnedLayers;
|
|
91
|
+
renderers: RendererRegistry;
|
|
92
|
+
/** Renderers drawing a cell when its column does not name its own. */
|
|
93
|
+
cellRenderers: RendererRef[];
|
|
94
|
+
cellBackgroundRenderer: CellBackground;
|
|
95
|
+
cellValueRenderer: CellValueRenderer;
|
|
96
|
+
headerCellRenderer: HeaderRenderer;
|
|
97
|
+
loadingIndicator: Loading;
|
|
98
|
+
/** Reused for every cell drawn; see CellContext. */
|
|
99
|
+
private readonly cell;
|
|
100
|
+
private readonly placeholderState;
|
|
101
|
+
throttleTransation: import("lodash").DebouncedFuncLeading<() => void>;
|
|
102
|
+
agApi: AgApi;
|
|
103
|
+
constructor();
|
|
104
|
+
/** Canvas of the content layer, which also defines the viewport size. */
|
|
105
|
+
get canvas(): HTMLCanvasElement;
|
|
106
|
+
get flashInDuration(): number;
|
|
107
|
+
set flashInDuration(flashInDuration: number);
|
|
108
|
+
get flashOutDuration(): number;
|
|
109
|
+
set flashOutDuration(flashOutDuration: number);
|
|
110
|
+
getLayer(name: string): Layer | undefined;
|
|
111
|
+
private requireLayer;
|
|
112
|
+
/** Adds a canvas on top of the existing layers, or below the layer named in `before`. */
|
|
113
|
+
addLayer(name: string, { alpha, before }?: LayerOptions): Layer;
|
|
114
|
+
removeLayer(name: string): void;
|
|
115
|
+
/** Makes a renderer available to columns under `name`; registering an existing name replaces it. */
|
|
116
|
+
registerRenderer(name: string, renderer: CellRenderer): void;
|
|
117
|
+
unregisterRenderer(name: string): void;
|
|
118
|
+
createScrollArea(): HTMLDivElement;
|
|
119
|
+
set font(font: string);
|
|
120
|
+
get font(): string;
|
|
121
|
+
set headerFont(font: string);
|
|
122
|
+
get headerFont(): string;
|
|
123
|
+
connectedCallback(): void;
|
|
124
|
+
private fontsTimeout;
|
|
125
|
+
private readonly onVisibilityChange;
|
|
126
|
+
private readonly onFontsLoaded;
|
|
127
|
+
cancelRender(): void;
|
|
128
|
+
/**
|
|
129
|
+
* Schedules a draw for the next animation frame. Nothing is drawn while the grid is idle:
|
|
130
|
+
* scrolling, data changes and resizes request a draw, and `draw` requests the next one itself while a cell animates.
|
|
131
|
+
*/
|
|
132
|
+
requestRender(): void;
|
|
133
|
+
updateLastRender(): void;
|
|
134
|
+
render(): void;
|
|
135
|
+
hasScrolled(): boolean;
|
|
136
|
+
hasYScrolled(): boolean;
|
|
137
|
+
hasXScrolled(): boolean;
|
|
138
|
+
isInViewport(x?: number, y?: number, width?: number, height?: number): boolean;
|
|
139
|
+
/** Fills the shared context for something that is not a data cell: a header, row number or placeholder. */
|
|
140
|
+
private describe;
|
|
141
|
+
private paint;
|
|
142
|
+
private paintAll;
|
|
143
|
+
private isAnimating;
|
|
144
|
+
draw(forced?: boolean): void;
|
|
145
|
+
/** The columns overlapping the viewport horizontally, with their x position and values; found once per draw, not per row. */
|
|
146
|
+
private getVisibleColumns;
|
|
147
|
+
renderRowNumber(row: {
|
|
148
|
+
index: number;
|
|
149
|
+
height?: number;
|
|
150
|
+
}, y: number): void;
|
|
151
|
+
forceDraw(): void;
|
|
152
|
+
/** Viewport size in CSS pixels as of the last resize; cached because reading `clientWidth` per cell is slow. */
|
|
153
|
+
viewportWidth: number;
|
|
154
|
+
viewportHeight: number;
|
|
155
|
+
/** Device pixels per CSS pixel; canvases are scaled by it to stay sharp on HiDPI screens. */
|
|
156
|
+
get pixelRatio(): number;
|
|
157
|
+
/** Resizes the layers when the size or pixel ratio changed, then redraws everything. */
|
|
158
|
+
resize(): void;
|
|
159
|
+
/** Redraws when the element changes size, instead of checking on every frame. */
|
|
160
|
+
private observeSize;
|
|
161
|
+
/** The pixel ratio changes with browser zoom or when the window moves to another screen. */
|
|
162
|
+
private watchPixelRatio;
|
|
163
|
+
private resizeObserver;
|
|
164
|
+
private pixelRatioQuery;
|
|
165
|
+
/** A row's position and height along with its values by column id, or undefined for an unknown row. */
|
|
166
|
+
getRowData(rowId: RowId): {
|
|
167
|
+
id: Key;
|
|
168
|
+
index: number;
|
|
169
|
+
height: number;
|
|
170
|
+
values: Record<string, unknown>;
|
|
171
|
+
} | undefined;
|
|
172
|
+
/** Orders the rows by the given columns, in priority order; an empty list restores the original order. */
|
|
173
|
+
setSortModel(model: readonly SortKey[]): void;
|
|
174
|
+
getSortModel(): readonly SortKey[];
|
|
175
|
+
renderBrick(): void;
|
|
176
|
+
renderHeaders(): void;
|
|
177
|
+
getColumnHeader(key: Key): ColumnHeader | undefined;
|
|
178
|
+
get totalHeight(): number;
|
|
179
|
+
refreshScrollbar(): void;
|
|
180
|
+
queueUpdate(row: RowInput): void;
|
|
181
|
+
queueRemove(row: RowInput): void;
|
|
182
|
+
transaction({ add, remove, update }: Transaction): void;
|
|
183
|
+
clearValues(): void;
|
|
184
|
+
formatValue(key: Key, value: unknown): string;
|
|
185
|
+
setValues(data: RowInput[]): void;
|
|
186
|
+
setColumns(columns: ColumnDefinition[]): void;
|
|
187
|
+
disconnectedCallback(): void;
|
|
188
|
+
}
|
|
189
|
+
export default CanvasGridComponent;
|