@aurum-grid/enterprise 0.0.0-stage → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/extras.js ADDED
@@ -0,0 +1,251 @@
1
+ export const ContextMenuModule = {
2
+ name: 'ContextMenuModule',
3
+ install(grid) {
4
+ const provider = (params) => {
5
+ const g = grid;
6
+ // Excel and PDF join the core "Export" submenu so related actions stay together.
7
+ const exportMenu = params.defaultItems.find((i) => i.name === 'Export' && i.subMenu);
8
+ if (exportMenu?.subMenu) {
9
+ if (typeof g.exportDataAsExcel === 'function')
10
+ exportMenu.subMenu.splice(1, 0, { name: 'Excel (.xlsx)', action: () => g.exportDataAsExcel() });
11
+ if (typeof g.exportDataAsPdf === 'function')
12
+ exportMenu.subMenu.push({ name: '', separator: true }, { name: 'Print / Save as PDF', action: () => g.exportDataAsPdf() });
13
+ }
14
+ const items = [];
15
+ if (grid.options.onChartRequest) {
16
+ const ranged = typeof g.getCellRanges === 'function' && g.getCellRanges().some((r) => r.endRow !== r.startRow || r.columns.length > 1);
17
+ const selected = grid.getSelectedNodes().length;
18
+ const source = ranged ? 'range' : selected ? 'selection' : 'rows';
19
+ const req = (chartType) => () => grid.options.onChartRequest({ api: grid, source, chartType });
20
+ const sub = (pairs) => pairs.map(([name, t]) => ({ name, action: req(t) }));
21
+ items.push({
22
+ name: ranged ? 'Chart range' : selected ? `Chart ${selected} selected row${selected === 1 ? '' : 's'}` : 'Chart rows in view', icon: 'chart',
23
+ subMenu: [
24
+ { name: 'Open integrated chart…', icon: 'chart', action: req() },
25
+ { name: '', separator: true },
26
+ { name: 'Column', subMenu: sub([['Grouped', 'column'], ['Stacked', 'stackedColumn'], ['100% stacked', 'normalizedColumn']]) },
27
+ { name: 'Bar', subMenu: sub([['Grouped', 'bar'], ['Stacked', 'stackedBar'], ['100% stacked', 'normalizedBar']]) },
28
+ { name: 'Pie', subMenu: sub([['Pie', 'pie'], ['Donut', 'donut'], ['Nightingale rose', 'nightingale']]) },
29
+ { name: 'Line', action: req('line') },
30
+ { name: 'Area', subMenu: sub([['Area', 'area'], ['Stacked', 'stackedArea'], ['100% stacked', 'normalizedArea']]) },
31
+ { name: 'X Y (scatter)', subMenu: sub([['Scatter', 'scatter'], ['Bubble', 'bubble']]) },
32
+ { name: 'Polar', subMenu: sub([['Radar line', 'radar'], ['Radar area', 'radarArea'], ['Radial bar', 'radialBar']]) },
33
+ { name: 'Statistical', subMenu: sub([['Histogram', 'histogram'], ['Box plot', 'boxPlot'], ['Range bar', 'rangeBar']]) },
34
+ { name: 'Hierarchical', subMenu: sub([['Treemap', 'treemap'], ['Sunburst', 'sunburst']]) },
35
+ { name: 'Specialized', subMenu: sub([['Heatmap', 'heatmap'], ['Waterfall', 'waterfall'], ['Gauge', 'gauge']]) },
36
+ { name: 'Funnel', subMenu: sub([['Funnel', 'funnel'], ['Pyramid', 'pyramid']]) },
37
+ { name: 'Combination', action: req('combo') },
38
+ ],
39
+ });
40
+ }
41
+ const view = [];
42
+ if (grid.getRowGroupColumns().length || grid.options.treeData) {
43
+ view.push({ name: 'Expand all', icon: 'expand', action: () => grid.expandAll() }, { name: 'Collapse all', icon: 'collapse', action: () => grid.collapseAll() });
44
+ }
45
+ view.push({ name: 'Autosize all columns', action: () => grid.autoSizeAllColumns() }, { name: 'Size columns to fit', action: () => grid.sizeColumnsToFit() });
46
+ items.push({ name: 'View', icon: 'columns', subMenu: view });
47
+ if (grid.getCurrentUndoSize())
48
+ items.push({ name: 'Undo edit', icon: 'undo', shortcut: 'Ctrl+Z', action: () => grid.undoCellEditing() });
49
+ return items.length ? [{ name: '', separator: true }, ...items] : [];
50
+ };
51
+ grid.hooks.contextMenuItems.add(provider);
52
+ return () => grid.hooks.contextMenuItems.delete(provider);
53
+ },
54
+ };
55
+ function memoryStorage() {
56
+ const m = new Map();
57
+ return { getItem: (k) => m.get(k) ?? null, setItem: (k, v) => void m.set(k, v) };
58
+ }
59
+ export const SavedViewsModule = {
60
+ name: 'SavedViewsModule',
61
+ install(grid) {
62
+ let storage;
63
+ try {
64
+ storage = grid.options.viewStorage ?? globalThis.localStorage ?? memoryStorage();
65
+ storage.getItem('__probe__');
66
+ }
67
+ catch {
68
+ storage = memoryStorage();
69
+ }
70
+ const key = () => `aurum-grid.views.${grid.options.gridKey ?? 'default'}`;
71
+ const read = () => {
72
+ try {
73
+ const raw = storage.getItem(key());
74
+ const parsed = raw ? JSON.parse(raw) : [];
75
+ return Array.isArray(parsed) ? parsed.filter((v) => v && typeof v.name === 'string' && v.state) : [];
76
+ }
77
+ catch {
78
+ return [];
79
+ }
80
+ };
81
+ const write = (views) => {
82
+ try {
83
+ storage.setItem(key(), JSON.stringify(views));
84
+ }
85
+ catch (err) {
86
+ console.warn('Aurum Grid: could not persist saved views', err);
87
+ }
88
+ };
89
+ const api = {
90
+ saveView(name) {
91
+ const clean = name.trim().slice(0, 80);
92
+ if (!clean)
93
+ throw new Error('View name is required');
94
+ const state = grid.getState();
95
+ state.selectedRowIds = [];
96
+ state.focusedCell = null;
97
+ const view = { name: clean, savedAt: new Date().toISOString(), state };
98
+ write([...read().filter((v) => v.name !== clean), view]);
99
+ grid.announce(`Saved view "${clean}"`);
100
+ return view;
101
+ },
102
+ listViews: () => read(),
103
+ applyView(name) {
104
+ const v = read().find((x) => x.name === name);
105
+ if (!v)
106
+ return false;
107
+ grid.setState(v.state);
108
+ grid.announce(`Applied view "${name}"`);
109
+ return true;
110
+ },
111
+ deleteView(name) {
112
+ const views = read();
113
+ const next = views.filter((v) => v.name !== name);
114
+ write(next);
115
+ return next.length !== views.length;
116
+ },
117
+ };
118
+ Object.assign(grid, api);
119
+ return () => {
120
+ for (const k of Object.keys(api))
121
+ delete grid[k];
122
+ };
123
+ },
124
+ };
125
+ /**
126
+ * Batches high-frequency updates into async transactions.
127
+ * `push` accepts upserts; call `dispose` when done.
128
+ */
129
+ export function createStreamBuffer(grid, opts) {
130
+ let pending = { add: [], update: [], remove: [] };
131
+ let disposed = false;
132
+ let received = 0;
133
+ const flush = () => {
134
+ if (disposed)
135
+ return;
136
+ const tx = { add: pending.add, update: pending.update, remove: pending.remove };
137
+ pending = { add: [], update: [], remove: [] };
138
+ if (tx.add.length || tx.update.length || tx.remove.length)
139
+ grid.applyTransactionAsync(tx);
140
+ };
141
+ return {
142
+ push(msg) {
143
+ if (disposed)
144
+ return;
145
+ received++;
146
+ for (const row of msg.upsert ?? []) {
147
+ if (grid.getRowNode(opts.getId(row)))
148
+ pending.update.push(row);
149
+ else
150
+ pending.add.push(row);
151
+ }
152
+ pending.add.push(...(msg.add ?? []));
153
+ pending.update.push(...(msg.update ?? []));
154
+ pending.remove.push(...(msg.remove ?? []));
155
+ if ((pending.update.length + pending.add.length) >= (opts.maxBatch ?? 500))
156
+ flush();
157
+ else
158
+ queueMicrotask(flush);
159
+ },
160
+ get received() {
161
+ return received;
162
+ },
163
+ dispose() {
164
+ disposed = true;
165
+ },
166
+ };
167
+ }
168
+ /** wss:// is required; ws:// is accepted only for localhost development. */
169
+ export function validateStreamUrl(raw) {
170
+ let url;
171
+ try {
172
+ url = new URL(raw.trim());
173
+ }
174
+ catch {
175
+ return { ok: false, error: 'Enter a full WebSocket URL, e.g. wss://feed.example.com/trades.' };
176
+ }
177
+ const local = ['localhost', '127.0.0.1', '[::1]'].includes(url.hostname);
178
+ if (url.username || url.password)
179
+ return { ok: false, error: 'Remove credentials from the URL.' };
180
+ if (url.protocol === 'ws:' && !local)
181
+ return { ok: false, error: 'Insecure endpoint: use wss:// (ws:// is only allowed for localhost).' };
182
+ if (url.protocol !== 'wss:' && url.protocol !== 'ws:')
183
+ return { ok: false, error: 'WebSocket URLs must start with wss://.' };
184
+ return { ok: true, url };
185
+ }
186
+ /**
187
+ * Connect a grid to a WebSocket that sends JSON StreamMessage payloads.
188
+ * Only ws:// or wss:// URLs are accepted. Messages that fail to parse are counted and dropped.
189
+ */
190
+ export function connectWebSocketStream(grid, url, opts) {
191
+ const check = validateStreamUrl(url);
192
+ if (!check.ok) {
193
+ opts.onStatus?.('error', check.error);
194
+ return { close: () => { }, stats: () => ({ messages: 0, errors: 0 }) };
195
+ }
196
+ const parsed = check.url;
197
+ const buf = createStreamBuffer(grid, { getId: opts.getId });
198
+ let errors = 0;
199
+ opts.onStatus?.('connecting');
200
+ const ws = new WebSocket(parsed.toString());
201
+ ws.onopen = () => opts.onStatus?.('live');
202
+ ws.onerror = () => opts.onStatus?.('error', 'Connection error');
203
+ ws.onclose = () => opts.onStatus?.('disconnected');
204
+ ws.onmessage = (ev) => {
205
+ if (typeof ev.data !== 'string' || ev.data.length > 5_000_000) {
206
+ errors++;
207
+ return;
208
+ }
209
+ try {
210
+ const msg = opts.parse ? opts.parse(String(ev.data)) : JSON.parse(String(ev.data));
211
+ buf.push(msg);
212
+ }
213
+ catch {
214
+ errors++;
215
+ }
216
+ };
217
+ return {
218
+ close: () => {
219
+ buf.dispose();
220
+ ws.close();
221
+ },
222
+ stats: () => ({ messages: buf.received, errors }),
223
+ };
224
+ }
225
+ /**
226
+ * Builds an infinite-row-model datasource from an async fetcher. The fetcher
227
+ * receives sort/filter state so the server can do the heavy lifting.
228
+ */
229
+ export function createServerSideDatasource(fetcher, opts = {}) {
230
+ const controllers = new Set();
231
+ return {
232
+ getRows(p) {
233
+ const ctrl = new AbortController();
234
+ controllers.add(ctrl);
235
+ const timer = setTimeout(() => ctrl.abort(), opts.timeoutMs ?? 30_000);
236
+ fetcher({ startRow: p.startRow, endRow: p.endRow, sortModel: p.sortModel, filterModel: p.filterModel, quickFilterText: p.quickFilterText, signal: ctrl.signal })
237
+ .then((res) => p.successCallback(res.rows, res.lastRow))
238
+ .catch((err) => p.failCallback(ctrl.signal.aborted ? new Error('Request timed out') : err))
239
+ .finally(() => {
240
+ clearTimeout(timer);
241
+ controllers.delete(ctrl);
242
+ });
243
+ },
244
+ destroy() {
245
+ for (const c of controllers)
246
+ c.abort();
247
+ controllers.clear();
248
+ },
249
+ };
250
+ }
251
+ //# sourceMappingURL=extras.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extras.js","sourceRoot":"","sources":["../src/extras.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,86 @@
1
+ import type { ColDef } from '@aurum-grid/core';
2
+ import { type WorkbookSheet, type XlsxCell } from './excel.js';
3
+ export declare const IMPORT_LIMITS: {
4
+ maxBytes: number;
5
+ maxRows: number;
6
+ maxColumns: number;
7
+ };
8
+ export type ImportedType = 'number' | 'text' | 'date' | 'boolean';
9
+ export type ImportFileType = 'csv' | 'xlsx';
10
+ export interface ImportedColumn {
11
+ field: string;
12
+ headerName: string;
13
+ sourceHeader: string;
14
+ type: ImportedType;
15
+ }
16
+ export interface GridPayload {
17
+ schemaVersion: 1;
18
+ gridName: string;
19
+ source: {
20
+ fileName: string;
21
+ fileType: ImportFileType;
22
+ sheet: string | null;
23
+ uploadedAt: string;
24
+ };
25
+ rowCount: number;
26
+ columnCount: number;
27
+ columns: ImportedColumn[];
28
+ rows: Array<Record<string, string | number | boolean | null>>;
29
+ }
30
+ export interface ImportedGrid {
31
+ payload: GridPayload;
32
+ columnDefs: ColDef[];
33
+ rowData: Array<Record<string, string | number | boolean | null>>;
34
+ warnings: string[];
35
+ }
36
+ export declare class ImportError extends Error {
37
+ }
38
+ /**
39
+ * Turn arbitrary header cells into unique, safe field names while keeping readable labels.
40
+ * "Unit price ($)" → unitPrice, "" → column3, "2024" → c2024, "__proto__" → proto_, duplicates → name_2.
41
+ */
42
+ export declare function sanitizeHeaders(headers: unknown[]): Array<{
43
+ field: string;
44
+ headerName: string;
45
+ sourceHeader: string;
46
+ }>;
47
+ export declare function parseNumberLike(v: unknown): number | null;
48
+ /** Infer a column type from its values (blank values are ignored). */
49
+ export declare function inferColumnType(values: unknown[]): {
50
+ type: ImportedType;
51
+ dayFirst: boolean;
52
+ };
53
+ /** RFC 4180 CSV/TSV parser with delimiter detection (comma, semicolon, tab, pipe). */
54
+ export declare function parseDelimited(text: string, delimiter?: string): string[][];
55
+ /** Blob → ArrayBuffer/text that also works where Blob#arrayBuffer is missing (older browsers, jsdom). */
56
+ export declare function blobToArrayBuffer(b: Blob): Promise<ArrayBuffer>;
57
+ export declare function blobToText(b: Blob): Promise<string>;
58
+ /** Decide the file type from its name and first bytes; rejects anything else. */
59
+ export declare function detectFileType(file: Blob & {
60
+ name?: string;
61
+ }): Promise<ImportFileType>;
62
+ export interface InspectedFile {
63
+ fileName: string;
64
+ fileType: ImportFileType;
65
+ sheets: WorkbookSheet[];
66
+ }
67
+ /** Read a CSV or XLSX upload. CSV is returned as a single sheet named after the file. */
68
+ export declare function inspectFile(file: Blob & {
69
+ name?: string;
70
+ }, limits?: {
71
+ maxBytes: number;
72
+ maxRows: number;
73
+ maxColumns: number;
74
+ }): Promise<InspectedFile>;
75
+ export interface BuildOptions {
76
+ fileName: string;
77
+ fileType: ImportFileType;
78
+ sheet?: string | null;
79
+ gridName?: string;
80
+ limits?: typeof IMPORT_LIMITS;
81
+ now?: Date;
82
+ }
83
+ /** Build column definitions, typed rows and the backend payload from a header row + data rows. */
84
+ export declare function buildImportedGrid(header: unknown[], rows: XlsxCell[][] | string[][], o: BuildOptions): ImportedGrid;
85
+ /** Refresh the payload rows (after edits) without changing schema metadata. */
86
+ export declare function withRows(payload: GridPayload, rows: Array<Record<string, unknown>>): GridPayload;