@warkypublic/svelix 0.1.42 → 0.1.43

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.
@@ -157,6 +157,29 @@
157
157
  cancelEdit();
158
158
  }
159
159
 
160
+ function getSelectionRowData(sel: Selection): Record<string, unknown>[] | undefined {
161
+ if (!getRowData) return undefined;
162
+ if (sel.type === "cell") {
163
+ const d = getRowData(sel.item[1]);
164
+ return d ? [d] : undefined;
165
+ }
166
+ if (sel.type === "row") {
167
+ const items = sel.rows.map(getRowData).filter((r): r is Record<string, unknown> => r !== undefined);
168
+ return items.length > 0 ? items : undefined;
169
+ }
170
+ if (sel.type === "range") {
171
+ const minRow = Math.min(sel.start[1], sel.end[1]);
172
+ const maxRow = Math.max(sel.start[1], sel.end[1]);
173
+ const items: Record<string, unknown>[] = [];
174
+ for (let i = minRow; i <= maxRow; i++) {
175
+ const d = getRowData(i);
176
+ if (d) items.push(d);
177
+ }
178
+ return items.length > 0 ? items : undefined;
179
+ }
180
+ return undefined;
181
+ }
182
+
160
183
  // ── Row toggle (checkbox / number markers) ────────────────────────────────────
161
184
 
162
185
  function handleRowToggle(row: number) {
@@ -173,7 +196,7 @@
173
196
  }
174
197
  currentSelection = newSel;
175
198
  canvasComponent?.setCurrentSelection(newSel);
176
- onSelectionChange?.(newSel);
199
+ onSelectionChange?.(newSel, getSelectionRowData(newSel));
177
200
  }
178
201
 
179
202
  // ── Clipboard ────────────────────────────────────────────────────────────────
@@ -295,7 +318,7 @@
295
318
  };
296
319
  currentSelection = newSel;
297
320
  canvasComponent?.setCurrentSelection(newSel);
298
- onSelectionChange?.(newSel);
321
+ onSelectionChange?.(newSel, getSelectionRowData(newSel));
299
322
  canvasComponent?.setAnnouncement("All cells selected");
300
323
  }
301
324
  e.preventDefault();
@@ -386,7 +409,7 @@
386
409
  const newSel: Selection = { type: "cell", item: newFocusedCell };
387
410
  currentSelection = newSel;
388
411
  canvasComponent?.setCurrentSelection(newSel);
389
- onSelectionChange?.(newSel);
412
+ onSelectionChange?.(newSel, getSelectionRowData(newSel));
390
413
  canvasComponent?.setAnnouncement(
391
414
  `Row ${newRow + 1}, column ${columns[newCol]?.title ?? newCol + 1}`,
392
415
  );
@@ -445,7 +468,7 @@
445
468
  onVisibleRangeChange={handleVisibleRangeChange}
446
469
  onSelectionChange={(sel) => {
447
470
  currentSelection = sel;
448
- onSelectionChange?.(sel);
471
+ onSelectionChange?.(sel, getSelectionRowData(sel));
449
472
  onGridEvent?.("selection_changed");
450
473
  }}
451
474
  onCellDblClick={(item, cell) => {
@@ -758,7 +758,7 @@
758
758
  }
759
759
  internalSelectedItems = items;
760
760
  if (items.length > 0) onSelectedItemsChange?.(items);
761
- onSelectionChange?.(sel);
761
+ onSelectionChange?.(sel, items.length > 0 ? items : undefined);
762
762
  }
763
763
 
764
764
  // ── Settings change event ─────────────────────────────────────────────────
@@ -155,8 +155,8 @@ export interface GridlerProps extends GridCommonProps<Record<string, unknown>> {
155
155
  theme?: Partial<GridlerTheme>;
156
156
  /** Controlled selection state. */
157
157
  selection?: Selection;
158
- /** Called when the internal selection changes. */
159
- onSelectionChange?: (selection: Selection) => void;
158
+ /** Called when the internal selection changes. Row data for all selected rows is provided where available. */
159
+ onSelectionChange?: (selection: Selection, rowData?: Record<string, unknown>[]) => void;
160
160
  /** Called when the visible row/column range changes (e.g. on scroll). */
161
161
  onVisibleRangeChange?: (range: VisibleRange) => void;
162
162
  /** When true, all cells are read-only. Also settable via settings.readonly. */
@@ -41,6 +41,7 @@ This file now tracks the implemented state of the project rather than the origin
41
41
  ### Data and explorer components
42
42
  - `Gridler`
43
43
  - `GridlerFull`
44
+ - `onSelectionChange(selection, rowData?)` — second arg carries resolved row data for all selected rows (cell, row, range types)
44
45
  - `SvarkGrid`
45
46
  - `VTree`
46
47
  - shared generic grid types and supporting utilities
@@ -39,7 +39,7 @@ onGridEvent?: (
39
39
  | `sort_changed` | Sort order applied or cleared | — | — | — | `{ sortOrder: GridColumnSortOrder }` |
40
40
  | `filter_changed` | Filter applied or cleared | — | — | — | `{ filters: GridColumnFilters }` |
41
41
  | `search_changed` | Search input value changed | — | — | — | `{ searchValue: string }` |
42
- | `selection_changed` | Cell, row, range, or column selection changes | — | — | — | — |
42
+ | `selection_changed` | Cell, row, range, or column selection changes | — | — | — | — | (use `onSelectionChange` for the selection object + row data) |
43
43
  | `column_moved` | Column dragged to new position | — | — | — | `{ from: number, to: number }` |
44
44
  | `column_resized` | Column edge dragged to new width | — | moved column | — | `{ width: number }` |
45
45
  | `data_changed` | Cell edited and committed (local mode only) | updated row | edited column | — | `{ data: Row[] }` full new dataset |
@@ -47,6 +47,55 @@ onGridEvent?: (
47
47
 
48
48
  ---
49
49
 
50
+ ## `onSelectionChange`
51
+
52
+ Fired on every selection change — mouse clicks, arrow-key navigation, Ctrl+A, row-marker toggles.
53
+
54
+ ```ts
55
+ onSelectionChange?: (
56
+ selection: Selection,
57
+ rowData?: Record<string, unknown>[], // resolved row data for all selected rows
58
+ ) => void
59
+ ```
60
+
61
+ ### `Selection` type
62
+
63
+ ```ts
64
+ type Selection =
65
+ | { type: "none" }
66
+ | { type: "cell"; item: [col, row] }
67
+ | { type: "range"; start: [col, row]; end: [col, row] }
68
+ | { type: "row"; rows: number[] }
69
+ | { type: "column"; columns: number[] }
70
+ ```
71
+
72
+ ### `rowData` population
73
+
74
+ | Selection type | `rowData` |
75
+ |---|---|
76
+ | `cell` | single-element array with the row's data |
77
+ | `row` | array of data for each selected row |
78
+ | `range` | array of data for every row from `start[1]` to `end[1]` |
79
+ | `column` / `none` | `undefined` |
80
+
81
+ `rowData` is `undefined` when no row data can be resolved (column/none selections, or when `getRowData`/`data` is not provided).
82
+
83
+ ### Usage
84
+
85
+ ```svelte
86
+ <GridlerFull
87
+ {columns}
88
+ {data}
89
+ onSelectionChange={(sel, rowData) => {
90
+ if (sel.type === 'cell') {
91
+ console.log('Selected row:', rowData?.[0]);
92
+ }
93
+ }}
94
+ />
95
+ ```
96
+
97
+ ---
98
+
50
99
  ## `onCellEvent`
51
100
 
52
101
  ```ts
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@warkypublic/svelix",
3
- "version": "0.1.42",
3
+ "version": "0.1.43",
4
4
  "description": "Svelte 5 component library with Skeleton UI and Tailwind CSS",
5
5
  "license": "Apache-2.0",
6
6
  "exports": {