apex-grid 3.0.0 → 3.0.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/CHANGELOG.md ADDED
@@ -0,0 +1,51 @@
1
+ # Changelog — apex-grid
2
+
3
+ All notable changes to the `apex-grid` (community) package are documented here.
4
+ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html)
5
+ and the format is based on [Keep a Changelog](https://keepachangelog.com/).
6
+
7
+ ## [3.0.1] — unreleased
8
+
9
+ Documentation-only patch (no runtime or API changes).
10
+
11
+ ### Documentation
12
+ - Documented the `--ag-grid-shadow` theming hook and the flat-by-default grid
13
+ edge (1px hairline ring; opt back into the elevated card with
14
+ `--ag-grid-shadow: var(--ag-shadow-card)`, or remove it with `none`).
15
+ - Added `@cssprop` JSDoc for the public `--ag-*` design tokens (incl.
16
+ `--ag-grid-shadow`) and a `@csspart` entry on the grid root, so the generated
17
+ Custom Elements Manifest / API reference list the theming surface.
18
+ - Completed the class `@fires` list — added the row- and tree-expansion events
19
+ (`rowExpanding`, `rowExpanded`, `treeRowExpanding`, `treeRowExpanded`) and
20
+ attached the missing `rowSelecting` event description.
21
+ - Corrected the stale "getting started" block in the `ApexGrid` JSDoc: theming
22
+ is via `--ag-*` CSS custom properties (no `configureTheme()` / theme-CSS
23
+ import required).
24
+ - Fixed an incorrect package name (`@apexcharts/grid-enterprise` →
25
+ `apex-grid-enterprise`) in export JSDoc.
26
+
27
+ ## [3.0.0] — 2026-06-09
28
+
29
+ ### Changed
30
+ - **BREAKING: Excel (XLSX) export removed from core.** It now lives in
31
+ [`apex-grid-enterprise`](https://www.npmjs.com/package/apex-grid-enterprise).
32
+ Core keeps **CSV export** (`exportToCSV`). The toolbar export menu is now
33
+ driven by a generic seam — `exportFormats` getter + `exportAs(formatId, opts)`
34
+ — so derived grids can add formats. Migrate `grid.exportToXLSX(...)` calls by
35
+ switching to `<apex-grid-enterprise>` (see its README).
36
+ - **Theming is now CSS-variable based.** The grid styles itself out of the box
37
+ through `--ag-*` custom properties — no theme import or `configureTheme()`
38
+ call is required. When `igniteui-webcomponents` is present, brand tokens
39
+ auto-tint from its palette.
40
+ - **Neutral restyle**: grayscale chrome with brand color reserved for state and
41
+ accents.
42
+ - **Flat grid edge by default.** The host no longer paints a heavy floating-card
43
+ shadow; it shows a flat 1px hairline edge. Restore the prior look with
44
+ `--ag-grid-shadow: var(--ag-shadow-card)`.
45
+
46
+ ### Project
47
+ - Repository converted to an npm-workspaces monorepo; this package publishes
48
+ from `packages/core`.
49
+
50
+ [3.0.1]: https://github.com/apexcharts/apex-grid/releases
51
+ [3.0.0]: https://github.com/apexcharts/apex-grid/releases
package/README.md CHANGED
@@ -119,6 +119,13 @@ apex-grid {
119
119
 
120
120
  See [`src/styles/_tokens.scss`](src/styles/_tokens.scss) for the full token list (brand, surfaces, text, semantic state colors, typography, spacing, motion).
121
121
 
122
+ **Grid edge / shadow.** By default the grid shows a flat 1px hairline edge (no drop shadow). Control it with the `--ag-grid-shadow` hook — this is an opt-in override, not one of the `_tokens.scss` defaults:
123
+
124
+ ```css
125
+ apex-grid { --ag-grid-shadow: var(--ag-shadow-card); } /* elevated floating-card look */
126
+ apex-grid { --ag-grid-shadow: none; } /* remove the edge entirely */
127
+ ```
128
+
122
129
  If you embed the grid alongside `igniteui-webcomponents`, the brand tokens automatically re-tint from the igniteui palette (`--ig-primary-500`) — no configuration needed.
123
130
 
124
131
  ### 4. Size the host
@@ -463,16 +463,6 @@ export interface ApexGridEventMap<T extends object> {
463
463
  * @event
464
464
  */
465
465
  rowEditEnded: CustomEvent<ApexRowEditEndedEvent>;
466
- /**
467
- * Emitted before the row selection set changes.
468
- *
469
- * @remarks
470
- * Cancellable — calling `preventDefault()` aborts the selection change.
471
- * Fires for every selection-mutating call (toggle, range select, select-all,
472
- * programmatic `selectedRows = ...`).
473
- *
474
- * @event
475
- */
476
466
  /**
477
467
  * Emitted before the tree-row expansion set changes.
478
468
  *
@@ -507,6 +497,16 @@ export interface ApexGridEventMap<T extends object> {
507
497
  * @event
508
498
  */
509
499
  rowExpanded: CustomEvent<ApexRowExpandedEvent<T>>;
500
+ /**
501
+ * Emitted before the row selection set changes.
502
+ *
503
+ * @remarks
504
+ * Cancellable — calling `preventDefault()` aborts the selection change.
505
+ * Fires for every selection-mutating call (toggle, range select, select-all,
506
+ * programmatic `selectedRows = ...`).
507
+ *
508
+ * @event
509
+ */
510
510
  rowSelecting: CustomEvent<ApexRowSelectingEvent<T>>;
511
511
  /**
512
512
  * Emitted after a row-selection change has been applied.
@@ -522,18 +522,18 @@ export interface ApexGridEventMap<T extends object> {
522
522
  * the ability to template cells and headers and column hiding.
523
523
  *
524
524
  * @remarks
525
- * A working, styled grid requires four setup steps:
525
+ * A working, styled grid requires three things:
526
526
  * 1. Register the element: `import 'apex-grid/define'` (or `ApexGrid.register()`).
527
- * 2. Configure an Ignite UI theme + import the matching CSS, e.g.
528
- * `import { configureTheme } from 'igniteui-webcomponents';`
529
- * `import 'igniteui-webcomponents/themes/light/bootstrap.css';`
530
- * `configureTheme('bootstrap');`
531
- * 3. Give the host element a bounded height, e.g. `apex-grid { height: 480px }` —
527
+ * 2. Give the host element a bounded height, e.g. `apex-grid { height: 480px }` —
532
528
  * the virtualizer collapses without one.
533
- * 4. Do NOT set `display` on the host — the component declares `:host { display: grid }`
529
+ * 3. Do NOT set `display` on the host — the component declares `:host { display: grid }`
534
530
  * internally and any override breaks the track layout.
535
531
  *
536
- * See the README "Getting Started" section for the full example.
532
+ * The grid is styled out of the box through `--ag-*` CSS custom properties —
533
+ * there is no theme to import and no `configureTheme()` call. Override `--ag-*`
534
+ * tokens on the host (or any ancestor) to rebrand; when `igniteui-webcomponents`
535
+ * is present, the brand tokens auto-tint from its palette. See the README
536
+ * "Getting Started" and "Theming" sections for the full example and token list.
537
537
  *
538
538
  * @element apex-grid
539
539
  *
@@ -555,7 +555,32 @@ export interface ApexGridEventMap<T extends object> {
555
555
  * @fires rowEditEnded - Emitted when a row leaves edit mode (row mode only).
556
556
  * @fires rowSelecting - Cancellable. Emitted before a selection-set change is applied.
557
557
  * @fires rowSelected - Emitted after a selection-set change has been applied.
558
+ * @fires rowExpanding - Cancellable. Emitted before the row-expansion set changes (master-detail).
559
+ * @fires rowExpanded - Emitted after a row-expansion change has been applied.
560
+ * @fires treeRowExpanding - Cancellable. Emitted before a tree-row expansion change (tree mode).
561
+ * @fires treeRowExpanded - Emitted after a tree-row expansion change has been applied.
562
+ *
563
+ * @csspart live-region - Visually-hidden ARIA live region used for screen-reader announcements.
564
+ *
565
+ * @cssprop [--ag-brand] - Brand color for selection, focus rings, and accents. Auto-tints from `--ig-primary-500` when igniteui is present.
566
+ * @cssprop [--ag-brand-strong] - Brand color for hover / pressed states.
567
+ * @cssprop [--ag-grid-shadow] - Grid edge/shadow override. Default is a flat 1px hairline edge; set to `var(--ag-shadow-card)` for the elevated card look, or `none` to remove it.
568
+ * @cssprop [--ag-surface] - Grid card background (must be opaque).
569
+ * @cssprop [--ag-surface-alt] - Alternating row tint.
570
+ * @cssprop [--ag-surface-elevated] - Header background.
571
+ * @cssprop [--ag-hairline] - Header / structural gridline color.
572
+ * @cssprop [--ag-border] - Row separator color.
573
+ * @cssprop [--ag-text] - Primary text color.
574
+ * @cssprop [--ag-text-body] - Row text color.
575
+ * @cssprop [--ag-text-muted] - Muted text (roles, labels).
576
+ * @cssprop [--ag-row-hover] - Row hover wash.
577
+ * @cssprop [--ag-row-h] - Row height.
578
+ * @cssprop [--ag-header-h] - Header height.
579
+ * @cssprop [--ag-radius] - Outer card corner radius.
580
+ * @cssprop [--ag-font] - Grid font family.
581
+ * @cssprop [--ag-fs-cell] - Cell font size.
558
582
  *
583
+ * @see {@link https://github.com/apexcharts/apex-grid/blob/main/packages/core/src/styles/_tokens.scss | _tokens.scss} for the complete `--ag-*` token list.
559
584
  */
560
585
  export declare class ApexGrid<T extends object> extends EventEmitterBase<ApexGridEventMap<T>> {
561
586
  static get tagName(): string;
@@ -1 +1 @@
1
- {"version":3,"file":"grid.js","sourceRoot":"","sources":["../../src/components/grid.ts"],"names":[],"mappings":"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","sourcesContent":["import { ContextProvider } from '@lit/context';\nimport { html, nothing } from 'lit';\nimport { eventOptions, property, query, queryAll, state } from 'lit/decorators.js';\nimport { styleMap } from 'lit/directives/style-map.js';\nimport { DataOperationsController } from '../controllers/data-operation.js';\nimport { GridDOMController } from '../controllers/dom.js';\nimport { gridStateContext, StateController } from '../controllers/state.js';\nimport { DEFAULT_COLUMN_CONFIG, PIPELINE } from '../internal/constants.js';\nimport {\n buildCSV,\n type CSVExportOptions,\n downloadBlob,\n type ExportFormat,\n type ExportOptions,\n} from '../internal/export.js';\nimport { EventEmitterBase } from '../internal/mixins/event-emitter.js';\nimport { registerComponent } from '../internal/register.js';\nimport { GRID_TAG } from '../internal/tags.js';\nimport type {\n ColumnConfiguration,\n DataPipelineConfiguration,\n GridEditingConfiguration,\n GridExpansionConfiguration,\n GridSelectionConfiguration,\n GridSortConfiguration,\n GridTreeConfiguration,\n Keys,\n PaginationConfiguration,\n PaginationState,\n PinPosition,\n} from '../internal/types.js';\nimport {\n asArray,\n autoGenerateColumns,\n getDisplayColumns,\n getFilterOperandsFor,\n} from '../internal/utils.js';\nimport { watch } from '../internal/watch.js';\nimport type { FilterExpression } from '../operations/filter/types.js';\nimport type { SortExpression } from '../operations/sort/types.js';\nimport { styles as gridStyles } from '../styles/grid/grid.css.js';\nimport ApexGridCell from './cell.js';\nimport ApexFilterRow from './filter-row.js';\nimport ApexGridHeaderRow from './header-row.js';\nimport ApexGridPaginator from './paginator.js';\nimport ApexGridRow from './row.js';\nimport ApexGridToolbar from './toolbar.js';\nimport ApexVirtualizer from './virtualizer.js';\n\n/**\n * Event object for the filtering event of the grid.\n */\nexport interface ApexFilteringEvent<T extends object> {\n /**\n * The target column for the filter operation.\n */\n key: Keys<T>;\n\n /**\n * The filter expression(s) to apply.\n */\n expressions: FilterExpression<T>[];\n\n /**\n * The type of modification which will be applied to the filter\n * state of the column.\n *\n * @remarks\n * `add` - a new filter expression will be added to the state of the column.\n * `modify` - an existing filter expression will be modified.\n * `remove` - the expression(s) will be removed from the state of the column.\n */\n type: 'add' | 'modify' | 'remove';\n}\n\n/**\n * Event object for the filtered event of the grid.\n */\nexport interface ApexFilteredEvent<T extends object> {\n /**\n * The target column for the filter operation.\n */\n key: Keys<T>;\n\n /**\n * The filter state of the column after the operation.\n */\n state: FilterExpression<T>[];\n}\n\n/**\n * Event payload for the cancellable `pageChanging` event.\n */\nexport interface ApexPageChangingEvent {\n /**\n * The current page (zero-based) before the change.\n */\n page: number;\n /**\n * The current page size before the change.\n */\n pageSize: number;\n /**\n * The proposed page (zero-based) the grid will navigate to.\n */\n nextPage: number;\n /**\n * The proposed page size after the change.\n */\n nextPageSize: number;\n}\n\n/**\n * Event payload for the `pageChanged` event. Mirrors {@link PaginationState}.\n */\nexport interface ApexPageChangedEvent extends PaginationState {}\n\n/**\n * Event payload for the cancellable `quickFilterChanging` event.\n */\nexport interface ApexQuickFilterChangingEvent {\n /**\n * The current quick-filter value before the change.\n */\n value: string;\n /**\n * The proposed quick-filter value.\n */\n nextValue: string;\n}\n\n/**\n * Event payload for the `quickFilterChanged` event.\n */\nexport interface ApexQuickFilterChangedEvent {\n /**\n * The resolved quick-filter value after the change.\n */\n value: string;\n}\n\n/**\n * Drop position relative to a target column when reordering.\n */\nexport type ColumnDropPosition = 'before' | 'after';\n\n/**\n * Event payload for the cancellable `cellValueChanging` event.\n */\nexport interface ApexCellValueChangingEvent<T extends object> {\n /**\n * The column key of the edited cell.\n */\n key: Keys<T>;\n /**\n * The view-relative row index (matches {@link ApexGrid.pageItems}).\n */\n rowIndex: number;\n /**\n * The data record being edited (a live reference to the row in\n * {@link ApexGrid.data}).\n */\n data: T;\n /**\n * The value before the edit.\n */\n oldValue: unknown;\n /**\n * The candidate new value.\n */\n newValue: unknown;\n}\n\n/**\n * Event payload for the `cellValueChanged` event.\n */\nexport interface ApexCellValueChangedEvent<T extends object> {\n /**\n * The column key of the edited cell.\n */\n key: Keys<T>;\n /**\n * The view-relative row index after the change.\n */\n rowIndex: number;\n /**\n * The data record after the change (a live reference to the row in\n * {@link ApexGrid.data}).\n */\n data: T;\n /**\n * The applied value.\n */\n value: unknown;\n}\n\n/**\n * Event payload for the `rowEditStarted` event.\n */\nexport interface ApexRowEditStartedEvent {\n /**\n * The view-relative row index entering edit mode.\n */\n rowIndex: number;\n}\n\n/**\n * Event payload for the `rowEditEnded` event.\n */\nexport interface ApexRowEditEndedEvent {\n /**\n * The view-relative row index that left edit mode.\n */\n rowIndex: number;\n /**\n * `true` when pending edits were applied, `false` when discarded.\n */\n committed: boolean;\n}\n\n/**\n * Event payload for the cancellable `columnMoving` event.\n */\nexport interface ApexColumnMovingEvent<T extends object> {\n /**\n * The column being moved.\n */\n key: Keys<T>;\n /**\n * The current index of the moving column in {@link ApexGrid.columns}.\n */\n fromIndex: number;\n /**\n * The target column key. The dragged column will be placed `position`\n * (before/after) this column.\n */\n toKey: Keys<T>;\n /**\n * Whether the dragged column is being placed before or after `toKey`.\n */\n position: ColumnDropPosition;\n}\n\n/**\n * Event payload for the `columnMoved` event.\n */\nexport interface ApexColumnMovedEvent<T extends object> {\n /**\n * The column that was moved.\n */\n key: Keys<T>;\n /**\n * The original index in {@link ApexGrid.columns}.\n */\n fromIndex: number;\n /**\n * The resolved index in {@link ApexGrid.columns} after the move.\n */\n toIndex: number;\n}\n\n/**\n * Event payload for the cancellable `rowSelecting` event.\n */\nexport interface ApexRowSelectingEvent<T extends object> {\n /**\n * The rows that will become selected by this change.\n */\n added: T[];\n /**\n * The rows that will become deselected by this change.\n */\n removed: T[];\n /**\n * The full current selection before this change is applied.\n */\n current: T[];\n /**\n * The full selection after this change would be applied. Listeners can\n * inspect this to decide whether to cancel.\n */\n next: T[];\n}\n\n/**\n * Event payload for the `rowSelected` event.\n */\nexport interface ApexRowSelectedEvent<T extends object> {\n /**\n * The rows that became selected in this change.\n */\n added: T[];\n /**\n * The rows that became deselected in this change.\n */\n removed: T[];\n /**\n * The full current selection after the change has been applied.\n */\n selected: T[];\n}\n\n/**\n * Event payload for the cancellable `treeRowExpanding` event.\n */\nexport interface ApexTreeRowExpandingEvent<T extends object> {\n /** Rows that will become expanded by this change. */\n added: T[];\n /** Rows that will become collapsed by this change. */\n removed: T[];\n /** The full current tree-expansion set before this change is applied. */\n current: T[];\n /** The full set after this change would be applied. */\n next: T[];\n}\n\n/**\n * Event payload for the `treeRowExpanded` event.\n */\nexport interface ApexTreeRowExpandedEvent<T extends object> {\n /** Rows that became expanded in this change. */\n added: T[];\n /** Rows that became collapsed in this change. */\n removed: T[];\n /** The full tree-expansion set after the change has been applied. */\n expanded: T[];\n}\n\n/**\n * Event payload for the cancellable `rowExpanding` event.\n */\nexport interface ApexRowExpandingEvent<T extends object> {\n /** The rows that will become expanded by this change. */\n added: T[];\n /** The rows that will become collapsed by this change. */\n removed: T[];\n /** The full current expansion set before this change is applied. */\n current: T[];\n /**\n * The full expansion set after this change would be applied. Listeners can\n * inspect this to decide whether to cancel.\n */\n next: T[];\n}\n\n/**\n * Event payload for the `rowExpanded` event.\n */\nexport interface ApexRowExpandedEvent<T extends object> {\n /** The rows that became expanded in this change. */\n added: T[];\n /** The rows that became collapsed in this change. */\n removed: T[];\n /** The full expansion set after the change has been applied. */\n expanded: T[];\n}\n\n/**\n * Event payload for the cancellable `columnPinning` event.\n */\nexport interface ApexColumnPinningEvent<T extends object> {\n /**\n * The target column key.\n */\n key: Keys<T>;\n /**\n * The current pin position before the change (`null` if unpinned).\n */\n previous: PinPosition;\n /**\n * The proposed pin position (`null` to unpin).\n */\n next: PinPosition;\n}\n\n/**\n * Event payload for the `columnPinned` event.\n */\nexport interface ApexColumnPinnedEvent<T extends object> {\n /**\n * The target column key.\n */\n key: Keys<T>;\n /**\n * The resolved pin position after the change.\n */\n pinned: PinPosition;\n}\n\n/**\n * Events for the apex-grid.\n */\nexport interface ApexGridEventMap<T extends object> {\n /**\n * Emitted when sorting is initiated through the UI.\n * Returns the sort expression which will be used for the operation.\n *\n * @remarks\n * The event is cancellable which prevents the operation from being applied.\n * The expression can be modified prior to the operation running.\n *\n * @event\n */\n sorting: CustomEvent<SortExpression<T>>;\n /**\n * Emitted when a sort operation initiated through the UI has completed.\n * Returns the sort expression used for the operation.\n *\n * @event\n */\n sorted: CustomEvent<SortExpression<T>>;\n /**\n * Emitted when filtering is initiated through the UI.\n *\n * @remarks\n * The event is cancellable which prevents the operation from being applied.\n * The expression can be modified prior to the operation running.\n *\n * @event\n */\n filtering: CustomEvent<ApexFilteringEvent<T>>;\n /**\n * Emitted when a filter operation initiated through the UI has completed.\n * Returns the filter state for the affected column.\n *\n * @event\n */\n filtered: CustomEvent<ApexFilteredEvent<T>>;\n /**\n * Emitted before the grid navigates to a new page or applies a new page size.\n *\n * @remarks\n * Cancellable — calling `preventDefault()` (or returning a falsy result from\n * `addEventListener` synchronously) aborts the page change.\n *\n * @event\n */\n pageChanging: CustomEvent<ApexPageChangingEvent>;\n /**\n * Emitted after a page or page-size change has been applied and the pipeline has run.\n *\n * @event\n */\n pageChanged: CustomEvent<ApexPageChangedEvent>;\n /**\n * Emitted before the quick-filter value is applied.\n *\n * @remarks\n * Cancellable — calling `preventDefault()` aborts the change. The value can\n * be replaced inside the listener by reassigning {@link ApexGrid.quickFilter}.\n *\n * @event\n */\n quickFilterChanging: CustomEvent<ApexQuickFilterChangingEvent>;\n /**\n * Emitted after a quick-filter change has been applied and the pipeline has run.\n *\n * @event\n */\n quickFilterChanged: CustomEvent<ApexQuickFilterChangedEvent>;\n /**\n * Emitted before a column's pin position changes.\n *\n * @remarks\n * Cancellable — calling `preventDefault()` aborts the change.\n *\n * @event\n */\n columnPinning: CustomEvent<ApexColumnPinningEvent<T>>;\n /**\n * Emitted after a column's pin position change has been applied.\n *\n * @event\n */\n columnPinned: CustomEvent<ApexColumnPinnedEvent<T>>;\n /**\n * Emitted before a column is moved through the UI or {@link ApexGrid.moveColumn}.\n *\n * @remarks\n * Cancellable — calling `preventDefault()` aborts the move. The event detail\n * carries the source column key, its current array index, the target column\n * key and the drop position.\n *\n * @event\n */\n columnMoving: CustomEvent<ApexColumnMovingEvent<T>>;\n /**\n * Emitted after a column has been moved.\n *\n * @event\n */\n columnMoved: CustomEvent<ApexColumnMovedEvent<T>>;\n /**\n * Emitted before a cell value is committed.\n *\n * @remarks\n * Cancellable — `preventDefault()` rolls back the candidate value. In row\n * edit mode the event still fires per-cell at commit time.\n *\n * @event\n */\n cellValueChanging: CustomEvent<ApexCellValueChangingEvent<T>>;\n /**\n * Emitted after a cell value has been committed.\n *\n * @event\n */\n cellValueChanged: CustomEvent<ApexCellValueChangedEvent<T>>;\n /**\n * Emitted when a row enters edit mode (row edit mode only).\n *\n * @event\n */\n rowEditStarted: CustomEvent<ApexRowEditStartedEvent>;\n /**\n * Emitted when a row leaves edit mode, with `committed` reporting whether\n * pending edits were applied (row edit mode only).\n *\n * @event\n */\n rowEditEnded: CustomEvent<ApexRowEditEndedEvent>;\n /**\n * Emitted before the row selection set changes.\n *\n * @remarks\n * Cancellable — calling `preventDefault()` aborts the selection change.\n * Fires for every selection-mutating call (toggle, range select, select-all,\n * programmatic `selectedRows = ...`).\n *\n * @event\n */\n /**\n * Emitted before the tree-row expansion set changes.\n *\n * @remarks\n * Fires only when {@link ApexGrid.tree} is enabled and a row's tree\n * expansion is toggled (via the chevron, the public API, or\n * `expand-all/collapse-all`). Cancellable.\n *\n * @event\n */\n treeRowExpanding: CustomEvent<ApexTreeRowExpandingEvent<T>>;\n /**\n * Emitted after a tree-row expansion change has been applied.\n *\n * @event\n */\n treeRowExpanded: CustomEvent<ApexTreeRowExpandedEvent<T>>;\n /**\n * Emitted before the row expansion set changes.\n *\n * @remarks\n * Cancellable — calling `preventDefault()` aborts the change. Fires for\n * every expansion-mutating call (toggle, expand-all, programmatic\n * `expandedRows = ...`).\n *\n * @event\n */\n rowExpanding: CustomEvent<ApexRowExpandingEvent<T>>;\n /**\n * Emitted after a row-expansion change has been applied.\n *\n * @event\n */\n rowExpanded: CustomEvent<ApexRowExpandedEvent<T>>;\n rowSelecting: CustomEvent<ApexRowSelectingEvent<T>>;\n /**\n * Emitted after a row-selection change has been applied.\n *\n * @event\n */\n rowSelected: CustomEvent<ApexRowSelectedEvent<T>>;\n}\n\n/**\n * Apex grid is a web component for displaying data in a tabular format quick and easy.\n *\n * Out of the box it provides row virtualization, sort and filter operations (client and server side),\n * the ability to template cells and headers and column hiding.\n *\n * @remarks\n * A working, styled grid requires four setup steps:\n * 1. Register the element: `import 'apex-grid/define'` (or `ApexGrid.register()`).\n * 2. Configure an Ignite UI theme + import the matching CSS, e.g.\n * `import { configureTheme } from 'igniteui-webcomponents';`\n * `import 'igniteui-webcomponents/themes/light/bootstrap.css';`\n * `configureTheme('bootstrap');`\n * 3. Give the host element a bounded height, e.g. `apex-grid { height: 480px }` —\n * the virtualizer collapses without one.\n * 4. Do NOT set `display` on the host — the component declares `:host { display: grid }`\n * internally and any override breaks the track layout.\n *\n * See the README \"Getting Started\" section for the full example.\n *\n * @element apex-grid\n *\n * @fires sorting - Emitted when sorting is initiated through the UI.\n * @fires sorted - Emitted when a sort operation initiated through the UI has completed.\n * @fires filtering - Emitted when filtering is initiated through the UI.\n * @fires filtered - Emitted when a filter operation initiated through the UI has completed.\n * @fires pageChanging - Cancellable. Emitted before page/page-size changes are applied.\n * @fires pageChanged - Emitted after a page/page-size change has been applied.\n * @fires quickFilterChanging - Cancellable. Emitted before a quick-filter value is applied.\n * @fires quickFilterChanged - Emitted after a quick-filter change has been applied.\n * @fires columnPinning - Cancellable. Emitted before a column's pin position changes.\n * @fires columnPinned - Emitted after a column's pin position has changed.\n * @fires columnMoving - Cancellable. Emitted before a column is moved.\n * @fires columnMoved - Emitted after a column has been moved.\n * @fires cellValueChanging - Cancellable. Emitted before a cell value is committed.\n * @fires cellValueChanged - Emitted after a cell value has been committed.\n * @fires rowEditStarted - Emitted when a row enters edit mode (row mode only).\n * @fires rowEditEnded - Emitted when a row leaves edit mode (row mode only).\n * @fires rowSelecting - Cancellable. Emitted before a selection-set change is applied.\n * @fires rowSelected - Emitted after a selection-set change has been applied.\n *\n */\nexport class ApexGrid<T extends object> extends EventEmitterBase<ApexGridEventMap<T>> {\n public static get tagName(): string {\n return GRID_TAG;\n }\n\n public static override styles = gridStyles;\n\n /**\n * Registers `<apex-grid>` and its internal dependencies with the custom-element\n * registry. Idempotent — safe to call more than once.\n *\n * @remarks\n * Registering the element is only step one of four required for a visible, styled\n * grid. You must also configure an Ignite UI theme + CSS, give the host a bounded\n * height, and avoid overriding `display` on the host. See the README\n * \"Getting Started\" section for the full setup.\n */\n public static register() {\n registerComponent(\n ApexGrid,\n ApexVirtualizer,\n ApexGridRow,\n ApexGridHeaderRow,\n ApexFilterRow,\n ApexGridPaginator,\n ApexGridToolbar\n );\n }\n\n protected stateController = this.createStateController();\n protected DOM = new GridDOMController<T>(this, this.stateController);\n protected dataController = new DataOperationsController<T>(this);\n\n /**\n * Builds the grid's {@link StateController}. This is the single construction\n * site for `stateController` — overriding it (rather than re-declaring the\n * field) is the supported seam for derived grids to inject optional\n * {@link GridFeatureModule}s while preserving field-initializer ordering.\n * The community grid registers no extra modules.\n */\n protected createStateController(): StateController<T> {\n return new StateController<T>(this);\n }\n\n protected stateProvider = new ContextProvider(this, {\n context: gridStateContext,\n initialValue: this.stateController,\n });\n\n @query(ApexVirtualizer.tagName)\n protected scrollContainer!: ApexVirtualizer;\n\n @query(ApexGridHeaderRow.tagName)\n protected headerRow!: ApexGridHeaderRow<T>;\n\n @query(ApexFilterRow.tagName)\n protected filterRow!: ApexFilterRow<T>;\n\n @query(ApexGridPaginator.tagName)\n protected paginator!: ApexGridPaginator<T>;\n\n @query(ApexGridToolbar.tagName)\n protected toolbar!: ApexGridToolbar<T>;\n\n @state()\n protected dataState: Array<T> = [];\n\n @queryAll(ApexGridRow.tagName)\n protected _rows!: NodeListOf<ApexGridRow<T>>;\n\n /** Column configuration for the grid. */\n @property({ attribute: false })\n public columns: Array<ColumnConfiguration<T>> = [];\n\n /** The data source for the grid. */\n @property({ attribute: false })\n public data: Array<T> = [];\n\n /**\n * Whether the grid will try to \"resolve\" its column configuration based on the passed\n * data source.\n *\n * @remarks\n * This is usually executed on initial rendering in the DOM. It depends on having an existing data source\n * to infer the column configuration for the grid.\n * Passing an empty data source or having a late bound data source (such as a HTTP request) will usually\n * result in empty column configuration for the grid.\n *\n * This property is ignored if any existing column configuration already exists in the grid.\n *\n * In a scenario where you want to bind a new data source and still keep the auto-generation behavior,\n * make sure to reset the column collection of the grid before passing in the new data source.\n *\n * @example\n * ```typescript\n * // assuming autoGenerate is set to true\n * grid.columns = [];\n * grid.data = [...];\n * ```\n *\n * @attr auto-generate\n */\n @property({ type: Boolean, attribute: 'auto-generate' })\n public autoGenerate = false;\n\n /** Sort configuration property for the grid. */\n @property({ attribute: false })\n public sortConfiguration: GridSortConfiguration = {\n multiple: true,\n triState: true,\n };\n\n /**\n * Configuration object which controls remote data operations for the grid.\n */\n @property({ attribute: false })\n public dataPipelineConfiguration!: DataPipelineConfiguration<T>;\n\n /**\n * Pagination configuration for the grid.\n *\n * @remarks\n * Pagination is disabled by default. Set `enabled: true` and (optionally) `pageSize`\n * to render the built-in `<apex-grid-paginator>` and slice the dataView. For\n * server-side pagination set `mode: 'remote'` and supply `totalItems`. The grid\n * emits the cancellable `pageChanging` event before applying a change and the\n * `pageChanged` event after the pipeline has run.\n *\n * @example\n * ```ts\n * grid.pagination = { enabled: true, pageSize: 25 };\n * grid.addEventListener('pageChanged', (event) => {\n * console.log('Now on page', event.detail.page, 'of', event.detail.pageCount);\n * });\n * ```\n */\n @property({ attribute: false })\n public pagination?: PaginationConfiguration;\n\n /**\n * The quick-filter (global search) value applied to the dataView.\n *\n * @remarks\n * When non-empty, the grid filters records whose visible-column values contain\n * the term (case-insensitive substring match). Customise by providing\n * {@link DataPipelineConfiguration.quickFilter}.\n *\n * @attr quick-filter\n */\n @property({ type: String, attribute: 'quick-filter' })\n public quickFilter = '';\n\n /**\n * Whether the built-in quick-filter input is rendered in the toolbar.\n *\n * @remarks\n * The {@link ApexGrid.quickFilter} value can be controlled programmatically\n * regardless of this flag; this only controls the toolbar input UI.\n *\n * @attr show-quick-filter\n */\n @property({ type: Boolean, attribute: 'show-quick-filter' })\n public showQuickFilter = false;\n\n /**\n * Whether the built-in export menu is rendered in the toolbar.\n *\n * @remarks\n * When `true`, the toolbar shows a download button on the trailing side;\n * clicking it opens a menu with one entry per {@link ApexGrid.exportFormats}\n * (CSV in the community grid) that calls {@link ApexGrid.exportAs}.\n * {@link ApexGrid.exportToCSV} remains callable programmatically regardless\n * of this flag.\n *\n * @attr show-export\n */\n @property({ type: Boolean, attribute: 'show-export' })\n public showExport = false;\n\n /**\n * Enables drag-and-drop column reordering on the column headers.\n *\n * @remarks\n * Per-column opt-out is available through {@link BaseColumnConfiguration.reorderable}.\n * Reordering is constrained to a column's own pinning group — start-pinned\n * columns can only swap with start-pinned, unpinned with unpinned, and\n * end-pinned with end-pinned.\n *\n * @attr column-reordering\n */\n @property({ type: Boolean, attribute: 'column-reordering' })\n public columnReordering = false;\n\n /**\n * Inline editing configuration for the grid.\n *\n * @remarks\n * Editing is disabled by default. Set `enabled: true` and (optionally) `mode`\n * (`'cell' | 'row'`) and `trigger` (`'click' | 'doubleClick'`) to opt in.\n * Per-column opt-in is required via {@link BaseColumnConfiguration.editable}.\n *\n * @example\n * ```ts\n * grid.editing = { enabled: true, mode: 'cell', trigger: 'doubleClick' };\n * ```\n */\n @property({ attribute: false })\n public editing?: GridEditingConfiguration;\n\n /**\n * Row selection configuration for the grid.\n *\n * @remarks\n * Selection is disabled by default. Set `enabled: true` and (optionally)\n * `mode` (`'single' | 'multiple'`) and `showCheckboxColumn` to opt in.\n *\n * @example\n * ```ts\n * grid.selection = { enabled: true, mode: 'multiple', showCheckboxColumn: true };\n * ```\n */\n @property({ attribute: false })\n public selection?: GridSelectionConfiguration;\n\n /**\n * The currently selected rows, in insertion order.\n *\n * @remarks\n * Returned as a plain array snapshot — mutating the returned array does\n * not change the grid's selection. Set this property to replace the\n * selection programmatically (goes through the cancellable\n * `rowSelecting` event).\n */\n public get selectedRows(): T[] {\n return this.stateController.selection.selectedRows();\n }\n\n public set selectedRows(rows: ReadonlyArray<T>) {\n void this.stateController.selection.replaceSelection(rows);\n }\n\n /**\n * Selects `row`, replacing the existing selection in `'single'` mode or\n * adding to it in `'multiple'` mode.\n *\n * @returns `true` if the selection changed, `false` if the change was\n * rejected by a `rowSelecting` listener or selection is disabled.\n */\n public selectRow(row: T): Promise<boolean> {\n return this.stateController.selection.selectRow(row);\n }\n\n /**\n * Deselects `row`. No-op if `row` is not currently selected.\n */\n public deselectRow(row: T): Promise<boolean> {\n return this.stateController.selection.deselectRow(row);\n }\n\n /**\n * Toggles selection of `row`.\n */\n public toggleRowSelection(row: T): Promise<boolean> {\n return this.stateController.selection.toggleRow(row);\n }\n\n /**\n * Selects every row in the current view ({@link dataView}). No-op in\n * `'single'` selection mode.\n */\n public selectAllRows(): Promise<boolean> {\n return this.stateController.selection.selectAll();\n }\n\n /**\n * Clears the row selection.\n */\n public clearSelection(): Promise<boolean> {\n return this.stateController.selection.clear();\n }\n\n /**\n * Whether `row` is currently selected.\n */\n public isRowSelected(row: T): boolean {\n return this.stateController.selection.isSelected(row);\n }\n\n /**\n * Row-expansion (master-detail) configuration for the grid.\n *\n * @remarks\n * Expansion is disabled by default. Set `enabled: true` and supply a\n * `detailTemplate` to opt in. The default UX renders a chevron toggle in a\n * dedicated leading column; set `showToggleColumn: false` to drive\n * expansion entirely through the public API or a custom cell template.\n *\n * @example\n * ```ts\n * grid.expansion = {\n * enabled: true,\n * detailTemplate: ({ data }) => html`<order-summary .order=${data}></order-summary>`,\n * };\n * ```\n */\n @property({ attribute: false })\n public expansion?: GridExpansionConfiguration<T>;\n\n /**\n * The currently expanded rows, in insertion order.\n *\n * @remarks\n * Returned as a plain array snapshot — mutating the returned array does\n * not change the grid's expansion state. Set this property to replace the\n * expansion set programmatically (goes through the cancellable\n * `rowExpanding` event).\n */\n public get expandedRows(): T[] {\n return this.stateController.expansion.expandedRows();\n }\n\n public set expandedRows(rows: ReadonlyArray<T>) {\n void this.stateController.expansion.replaceExpansion(rows);\n }\n\n /**\n * Expands `row`. No-op when the row is already expanded, expansion is\n * disabled, or the optional `isExpandable` predicate rejects it.\n */\n public expandRow(row: T): Promise<boolean> {\n return this.stateController.expansion.expandRow(row);\n }\n\n /**\n * Collapses `row`. No-op when the row is not currently expanded.\n */\n public collapseRow(row: T): Promise<boolean> {\n return this.stateController.expansion.collapseRow(row);\n }\n\n /**\n * Toggles expansion of `row`.\n */\n public toggleRowExpansion(row: T): Promise<boolean> {\n return this.stateController.expansion.toggleRow(row);\n }\n\n /**\n * Expands every row in {@link ApexGrid.dataView} that passes the optional\n * `isExpandable` predicate.\n */\n public expandAllRows(): Promise<boolean> {\n return this.stateController.expansion.expandAll();\n }\n\n /**\n * Collapses every currently expanded row.\n */\n public collapseAllRows(): Promise<boolean> {\n return this.stateController.expansion.collapseAll();\n }\n\n /**\n * Whether `row` is currently expanded.\n */\n public isRowExpanded(row: T): boolean {\n return this.stateController.expansion.isExpanded(row);\n }\n\n /**\n * Tree-data (nested rows) configuration for the grid.\n *\n * @remarks\n * Tree mode keeps {@link ApexGrid.data} flat; the grid derives the\n * hierarchy from a user-supplied `getDataPath(row)` callback (AG Grid's\n * \"tree data\" pattern). When enabled, the first visible data column (or\n * the column referenced by `groupColumnKey`) renders a chevron toggle\n * and depth-based indentation.\n *\n * @example\n * ```ts\n * grid.tree = {\n * enabled: true,\n * getDataPath: (row) => row.path, // e.g., ['Adrian'], ['Adrian', 'Bryan']\n * defaultExpanded: true,\n * };\n * ```\n */\n @property({ attribute: false })\n public tree?: GridTreeConfiguration<T>;\n\n /**\n * Toggles tree-expansion of `row`. No-op when tree mode is disabled or\n * the row has no children.\n */\n public toggleTreeRow(row: T): Promise<boolean> {\n return this.stateController.tree.toggleRow(row);\n }\n\n /**\n * Expands a tree row. No-op when the row is already expanded, has no\n * children, or tree mode is disabled.\n */\n public expandTreeRow(row: T): Promise<boolean> {\n return this.stateController.tree.expandRow(row);\n }\n\n /**\n * Collapses a tree row. No-op when the row is not currently expanded.\n */\n public collapseTreeRow(row: T): Promise<boolean> {\n return this.stateController.tree.collapseRow(row);\n }\n\n /** Expands every parent row in the current tree. */\n public expandAllTreeRows(): Promise<boolean> {\n return this.stateController.tree.expandAll();\n }\n\n /** Collapses every currently-expanded tree row. */\n public collapseAllTreeRows(): Promise<boolean> {\n return this.stateController.tree.collapseAll();\n }\n\n /** Whether `row` is currently expanded in the tree. */\n public isTreeRowExpanded(row: T): boolean {\n return this.stateController.tree.isExpanded(row);\n }\n\n /**\n * Set the sort state for the grid.\n */\n public set sortExpressions(expressions: SortExpression<T>[]) {\n if (expressions.length) {\n this.sort(expressions);\n }\n }\n\n /**\n * Get the sort state for the grid.\n */\n @property({ attribute: false })\n public get sortExpressions(): SortExpression<T>[] {\n return Array.from(this.stateController.sorting.state.values());\n }\n\n /**\n * Set the filter state for the grid.\n */\n public set filterExpressions(expressions: FilterExpression<T>[]) {\n if (expressions.length) {\n this.filter(expressions);\n }\n }\n\n /**\n * Get the filter state for the grid.\n */\n @property({ attribute: false })\n public get filterExpressions(): FilterExpression<T>[] {\n const expressions: FilterExpression<T>[] = [];\n\n for (const each of this.stateController.filtering.state.values) {\n expressions.push(...each.all);\n }\n\n return expressions;\n }\n\n /**\n * Returns the collection of rendered row elements in the grid.\n *\n * @remarks\n * Since the grid has virtualization, this property returns only the currently rendered\n * chunk of elements in the DOM.\n */\n public get rows() {\n return Array.from(this._rows);\n }\n\n /**\n * Returns the state of the data source after sort/filter operations\n * have been applied.\n */\n public get dataView(): ReadonlyArray<T> {\n return this.dataState;\n }\n\n /**\n * The columns in visual render order: `'start'`-pinned columns first, then\n * unpinned columns, then `'end'`-pinned columns.\n *\n * @remarks\n * Use this when you need to iterate the columns in the same order the grid\n * actually displays them (for example to build a column chooser). Public APIs\n * like {@link ApexGrid.getColumn} continue to operate on the user-supplied\n * {@link ApexGrid.columns} array.\n */\n public get displayColumns(): ReadonlyArray<ColumnConfiguration<T>> {\n return getDisplayColumns(this.columns);\n }\n\n /**\n * The total number of items in the {@link ApexGrid.dataView} collection.\n *\n * @remarks\n * This is always the post-filter, post-sort row count — pagination does not change it.\n * Use {@link ApexGrid.pageItems} to read the rows currently rendered into the body.\n */\n public get totalItems() {\n if (this.pagination?.mode === 'remote') {\n return Math.max(0, this.pagination?.totalItems ?? 0);\n }\n return this.dataState.length;\n }\n\n /**\n * The records currently rendered into the virtualized body.\n *\n * @remarks\n * Equal to {@link ApexGrid.dataView} when pagination is disabled. With pagination\n * enabled (`'local'` mode) this is the active page slice.\n */\n public get pageItems(): ReadonlyArray<T> {\n if (!this.stateController.pagination.enabled) return this.dataState;\n if (this.pagination?.mode === 'remote') return this.dataState;\n const { page, pageSize } = this.stateController.pagination;\n if (!pageSize) return this.dataState;\n const start = page * pageSize;\n return this.dataState.slice(start, start + pageSize);\n }\n\n /**\n * The current zero-based page index.\n */\n @property({ attribute: false })\n public get page(): number {\n return this.stateController.pagination.page;\n }\n\n public set page(value: number) {\n this.stateController.pagination.gotoPage(value);\n }\n\n /**\n * The current page size.\n */\n @property({ attribute: false })\n public get pageSize(): number {\n return this.stateController.pagination.pageSize;\n }\n\n public set pageSize(value: number) {\n this.stateController.pagination.setPageSize(value);\n }\n\n /**\n * The total number of pages computed from {@link ApexGrid.totalItems} and {@link ApexGrid.pageSize}.\n */\n public get pageCount(): number {\n return this.stateController.pagination.pageCount;\n }\n\n @watch('columns')\n protected watchColumns(_: ColumnConfiguration<T>[], newConfig: ColumnConfiguration<T>[] = []) {\n this.columns = newConfig.map((config) => ({ ...DEFAULT_COLUMN_CONFIG, ...config }));\n }\n\n @watch('data')\n protected dataChanged() {\n // Shallow copy of the array — items keep reference equality with\n // `this.data` so cell edits can write through to the source record.\n let next: T[] = [...this.data];\n autoGenerateColumns(this);\n // Tree controller needs to re-apply `defaultExpanded` against the new\n // record set when data is swapped wholesale.\n this.stateController?.tree?.resetForDataChange();\n // Tree mode applies its flatten step synchronously here so the first\n // paint shows the right shape. Sort/filter/quickFilter still run via\n // the async pipeline on subsequent updates — they take this dataState\n // as input and re-apply tree at the end. Running tree both here and\n // inside the pipeline is idempotent because `process` is pure.\n if (this.stateController?.tree?.enabled) {\n next = this.stateController.tree.process(next);\n }\n this.dataState = next;\n if (this.hasUpdated) {\n this.pipeline();\n }\n }\n\n @watch(PIPELINE)\n protected async pipeline() {\n this.dataState = await this.dataController.apply([...this.data], this.stateController);\n this.stateController.pagination.reclamp();\n }\n\n @watch('pagination')\n protected paginationChanged() {\n const ctrl = this.stateController?.pagination;\n if (!ctrl) return;\n const next = this.pagination ?? {};\n if (typeof next.pageSize === 'number' && next.pageSize > 0) {\n ctrl.pageSize = next.pageSize;\n }\n if (typeof next.page === 'number') {\n ctrl.page = next.page;\n }\n if (this.hasUpdated) {\n this.pipeline();\n }\n }\n\n @watch('quickFilter')\n protected quickFilterChanged() {\n if (this.hasUpdated) {\n this.pipeline();\n }\n }\n\n protected override updated(): void {\n // Expose ARIA grid semantics on the host so screen readers announce the\n // structure correctly. We do this in `updated()` (post-render) rather\n // than `willUpdate()` because `@watch('data')` runs *after* the original\n // willUpdate via decorator wrapping — reading `pageItems` earlier would\n // see a stale (empty) `dataState`.\n this.setAttribute('role', this.stateController.tree.enabled ? 'treegrid' : 'grid');\n const hasFilter = this.columns.some((column) => column.filter);\n const headerRows = hasFilter ? 2 : 1;\n this.setAttribute('aria-rowcount', String(headerRows + this.pageItems.length));\n const visibleColumns = this.columns.filter((column) => !column.hidden).length;\n const extras =\n (this.stateController.selection.showCheckboxColumn ? 1 : 0) +\n (this.stateController.expansion.showToggleColumn ? 1 : 0);\n this.setAttribute('aria-colcount', String(visibleColumns + extras));\n }\n\n protected override firstUpdated(): void {\n // The component declares `:host { display: grid }` for its internal track\n // layout (header / filter / virtualized body). If a consumer rule overrides\n // it, the virtualizer collapses and only a few rows render. Warn loudly so\n // the failure mode isn't silent.\n if (typeof getComputedStyle === 'function' && getComputedStyle(this).display !== 'grid') {\n // biome-ignore lint/suspicious/noConsole: intentional one-shot user diagnostic\n console.warn(\n '[apex-grid] Host `display` has been overridden. The grid requires ' +\n '`display: grid` for its internal track layout and will not render correctly. ' +\n 'Remove any CSS rule that sets `display` on <apex-grid>. ' +\n 'See: https://github.com/apexcharts/apexgrid#4-size-the-host'\n );\n }\n }\n\n /**\n * Performs a filter operation in the grid based on the passed expression(s).\n */\n public filter(config: FilterExpression<T> | FilterExpression<T>[]) {\n this.stateController.filtering.filter(\n asArray(config).map((each) =>\n typeof each.condition === 'string'\n ? // XXX: Types\n Object.assign(each, {\n condition: (getFilterOperandsFor(this.getColumn(each.key)!) as any)[each.condition],\n })\n : each\n )\n );\n }\n\n /**\n * Performs a sort operation in the grid based on the passed expression(s).\n */\n public sort(expressions: SortExpression<T> | SortExpression<T>[]) {\n this.stateController.sorting.sort(expressions);\n }\n\n /**\n * Resets the current sort state of the control.\n */\n public clearSort(key?: Keys<T>) {\n this.stateController.sorting.reset(key);\n this.requestUpdate(PIPELINE);\n }\n\n /**\n * Resets the current filter state of the control.\n */\n public clearFilter(key?: Keys<T>) {\n this.stateController.filtering.reset(key);\n this.requestUpdate(PIPELINE);\n }\n\n /**\n * Navigates the grid to the given zero-based `page` index.\n *\n * @remarks\n * Emits the cancellable `pageChanging` event before applying the change and the\n * `pageChanged` event after. Out-of-range values are clamped into `[0, pageCount - 1]`.\n *\n * @param page - The target zero-based page index.\n * @returns `true` if the change was applied, `false` if cancelled or a no-op.\n *\n * @example\n * ```ts\n * await grid.gotoPage(2);\n * ```\n */\n public gotoPage(page: number): Promise<boolean> {\n return this.stateController.pagination.gotoPage(page);\n }\n\n /**\n * Updates the grid's page size and returns to the first page.\n *\n * @remarks\n * Emits the cancellable `pageChanging` event before applying the change and the\n * `pageChanged` event after.\n *\n * @param size - The new page size (must be a positive integer).\n * @returns `true` if the change was applied, `false` if cancelled or a no-op.\n */\n public setPageSize(size: number): Promise<boolean> {\n return this.stateController.pagination.setPageSize(size);\n }\n\n /**\n * Navigates to the next page. No-op if already on the last page.\n */\n public nextPage() {\n return this.stateController.pagination.nextPage();\n }\n\n /**\n * Navigates to the previous page. No-op if already on the first page.\n */\n public previousPage() {\n return this.stateController.pagination.previousPage();\n }\n\n /**\n * Navigates to the first page.\n */\n public firstPage() {\n return this.stateController.pagination.firstPage();\n }\n\n /**\n * Navigates to the last page.\n */\n public lastPage() {\n return this.stateController.pagination.lastPage();\n }\n\n /**\n * Applies a new quick-filter (global search) value, emitting the cancellable\n * `quickFilterChanging` event first and the `quickFilterChanged` event after the\n * pipeline has run.\n *\n * @param value - The new quick-filter value. Pass `''` to clear.\n * @returns `true` if the change was applied, `false` if cancelled or a no-op.\n *\n * @example\n * ```ts\n * await grid.setQuickFilter('john');\n * ```\n */\n public async setQuickFilter(value: string): Promise<boolean> {\n const next = value ?? '';\n if (next === this.quickFilter) return false;\n\n const proceed = this.emitEvent('quickFilterChanging', {\n detail: { value: this.quickFilter, nextValue: next },\n cancelable: true,\n });\n if (!proceed) return false;\n\n this.quickFilter = next;\n this.stateController.pagination.page = 0;\n await this.updateComplete;\n this.emitEvent('quickFilterChanged', { detail: { value: this.quickFilter } });\n return true;\n }\n\n /**\n * Returns a {@link ColumnConfiguration} for a given column.\n */\n public getColumn(id: Keys<T> | number) {\n return typeof id === 'number'\n ? this.columns.at(id)\n : this.columns.find(({ key }) => key === id);\n }\n\n /**\n * Updates the column configuration of the grid.\n *\n * @remarks\n * Each updated column is replaced with a fresh object reference so that cells\n * and headers re-render with the new template / configuration. The\n * user-supplied `columns` array is also reassigned for Lit reactivity.\n */\n public updateColumns(columns: ColumnConfiguration<T> | ColumnConfiguration<T>[]) {\n const updates = new Map(asArray(columns).map((c) => [c.key, c]));\n if (updates.size === 0) return;\n\n let touched = false;\n const next = this.columns.map((column) => {\n const patch = updates.get(column.key);\n if (!patch) return column;\n touched = true;\n return { ...column, ...patch };\n });\n\n if (!touched) return;\n this.columns = next;\n this.requestUpdate(PIPELINE);\n }\n\n /**\n * Pins a column to one of the grid's edges, or unpins it when `position` is `null`.\n *\n * @remarks\n * Emits the cancellable `columnPinning` event first and the `columnPinned`\n * event after the update is applied. The user-supplied {@link ApexGrid.columns}\n * array is not reordered — only the visual render order changes.\n *\n * @param key - The target column key.\n * @param position - `'start'`, `'end'`, or `null` to unpin.\n * @returns `true` if the change was applied, `false` if cancelled or a no-op.\n *\n * @example\n * ```ts\n * await grid.pinColumn('name', 'start');\n * await grid.pinColumn('actions', 'end');\n * ```\n */\n public async pinColumn(key: Keys<T>, position: PinPosition): Promise<boolean> {\n const column = this.getColumn(key);\n if (!column) return false;\n\n const previous = column.pinned ?? null;\n const next = position ?? null;\n if (previous === next) return false;\n\n const proceed = this.emitEvent('columnPinning', {\n detail: { key, previous, next },\n cancelable: true,\n });\n if (!proceed) return false;\n\n column.pinned = next ?? undefined;\n this.columns = [...this.columns];\n await this.updateComplete;\n this.emitEvent('columnPinned', { detail: { key, pinned: next } });\n return true;\n }\n\n /**\n * Unpins a column. Equivalent to {@link ApexGrid.pinColumn}(`key`, `null`).\n *\n * @param key - The target column key.\n * @returns `true` if the change was applied, `false` if the column was already\n * unpinned or the operation was cancelled.\n */\n public unpinColumn(key: Keys<T>): Promise<boolean> {\n return this.pinColumn(key, null);\n }\n\n /**\n * The cell currently in edit mode, or `null`.\n */\n public get editingCell(): { rowIndex: number; columnKey: Keys<T> } | null {\n const active = this.stateController.editing.activeCell;\n return active ? { rowIndex: active.rowIndex, columnKey: active.columnKey } : null;\n }\n\n /**\n * The view-relative index of the row currently in edit mode (row edit mode\n * only), or `null`.\n */\n public get editingRow(): number | null {\n return this.stateController.editing.activeRow?.rowIndex ?? null;\n }\n\n /**\n * Begins editing the cell at `(rowIndex, columnKey)`.\n *\n * @remarks\n * `rowIndex` is the view-relative index (matches {@link ApexGrid.pageItems}).\n * Returns `false` when the column isn't editable, the row index is out of\n * range, or the request was rejected (for example in row mode with pending\n * changes that couldn't be committed).\n */\n public editCell(rowIndex: number, columnKey: Keys<T>): Promise<boolean> {\n return this.stateController.editing.editCell(rowIndex, columnKey);\n }\n\n /**\n * Begins editing the entire row at `rowIndex` (row edit mode only).\n *\n * @returns `false` when editing is disabled, the grid is in cell mode, or\n * the row index is out of range.\n */\n public editRow(rowIndex: number): Promise<boolean> {\n return this.stateController.editing.editRow(rowIndex);\n }\n\n /**\n * Commits the current edit.\n *\n * @remarks\n * In cell mode this writes the active cell's pending value. In row mode it\n * flushes all pending values for the active row. Emits `cellValueChanging`\n * per changed cell (cancellable) and `cellValueChanged` after, followed by\n * `rowEditEnded` in row mode.\n */\n public commitEdit(): Promise<boolean> {\n const editing = this.stateController.editing;\n return editing.mode === 'row' ? editing.commitRow() : editing.commitCell();\n }\n\n /**\n * Discards the current edit without writing back to {@link ApexGrid.data}.\n */\n public cancelEdit(): void {\n const editing = this.stateController.editing;\n if (editing.mode === 'row') {\n editing.cancelRow();\n } else {\n editing.cancelCell();\n }\n }\n\n /**\n * Exports the current grid contents as a CSV string and (in a browser\n * context) triggers a download.\n *\n * @remarks\n * By default the export uses the post-filter/post-sort `dataView`, includes\n * every visible column with `exportable !== false`, and prepends a UTF-8 BOM\n * so Excel opens the file with the right encoding. Pass `source: 'page'` to\n * export only the current page, `source: 'selected'` to export the current\n * row selection, or `source: 'all'` to export the raw `data` array. The\n * returned string is the same content written to the file — useful for\n * tests or routing the bytes elsewhere.\n *\n * @example\n * ```ts\n * grid.exportToCSV(); // download data.csv\n * grid.exportToCSV({ filename: 'users', source: 'selected' });\n * const text = grid.exportToCSV({ filename: '' }); // string only, no download\n * ```\n */\n public exportToCSV(options: CSVExportOptions<T> = {}): string {\n const csv = buildCSV(this, options);\n const filename = options.filename;\n if (filename) {\n downloadBlob(`${filename}.csv`, csv, 'text/csv;charset=utf-8;');\n } else if (filename === undefined) {\n downloadBlob('data.csv', csv, 'text/csv;charset=utf-8;');\n }\n return csv;\n }\n\n /**\n * The export formats offered in the toolbar's export menu, in order.\n *\n * @remarks\n * The community grid offers CSV only. This is the seam derived grids use to\n * contribute more formats: `@apexcharts/grid-enterprise` overrides it to add\n * `'xlsx'`. The toolbar renders one menu item per entry and dispatches the\n * chosen id to {@link ApexGrid.exportAs}.\n */\n public get exportFormats(): ReadonlyArray<ExportFormat> {\n return [{ id: 'csv', label: 'Export CSV' }];\n }\n\n /**\n * Exports the grid in the given format (one of {@link ApexGrid.exportFormats}).\n * Called by the toolbar's export menu. The community grid handles `'csv'`;\n * derived grids override to handle additional formats, delegating to `super`\n * for the ones they don't add.\n */\n public exportAs(formatId: string, options: ExportOptions<T> = {}): void {\n if (formatId === 'csv') {\n this.exportToCSV(options as CSVExportOptions<T>);\n }\n }\n\n /**\n * Moves a column relative to another column.\n *\n * @remarks\n * Emits the cancellable `columnMoving` event first and `columnMoved` after.\n * Reordering only succeeds when the source and target columns share the same\n * pinning group (start / unpinned / end) — cross-group moves return `false`.\n * Use {@link ApexGrid.pinColumn} to change a column's pinning group first.\n *\n * @param fromKey - The column to move.\n * @param toKey - The reference column.\n * @param position - Whether to place `fromKey` before or after `toKey`. Defaults to `'before'`.\n * @returns `true` if the move was applied, `false` if cancelled or a no-op.\n *\n * @example\n * ```ts\n * await grid.moveColumn('email', 'name', 'after');\n * ```\n */\n public async moveColumn(\n fromKey: Keys<T>,\n toKey: Keys<T>,\n position: ColumnDropPosition = 'before'\n ): Promise<boolean> {\n if (fromKey === toKey) return false;\n const fromIndex = this.columns.findIndex((column) => column.key === fromKey);\n const toIndex = this.columns.findIndex((column) => column.key === toKey);\n if (fromIndex < 0 || toIndex < 0) return false;\n\n const source = this.columns[fromIndex];\n const target = this.columns[toIndex];\n if ((source.pinned ?? null) !== (target.pinned ?? null)) return false;\n\n const proceed = this.emitEvent('columnMoving', {\n detail: { key: fromKey, fromIndex, toKey, position },\n cancelable: true,\n });\n if (!proceed) return false;\n\n const next = this.columns.slice();\n const [moved] = next.splice(fromIndex, 1);\n let insertIndex = next.findIndex((column) => column.key === toKey);\n if (insertIndex < 0) return false;\n if (position === 'after') insertIndex += 1;\n next.splice(insertIndex, 0, moved);\n\n if (next.every((column, index) => column === this.columns[index])) return false;\n\n this.columns = next;\n await this.updateComplete;\n const resolvedIndex = this.columns.findIndex((column) => column.key === fromKey);\n this.emitEvent('columnMoved', {\n detail: { key: fromKey, fromIndex, toIndex: resolvedIndex },\n });\n return true;\n }\n\n @eventOptions({ capture: true })\n protected bodyClickHandler(event: MouseEvent) {\n const target = event.composedPath().find((el) => el instanceof ApexGridCell) as ApexGridCell<T>;\n if (target) {\n this.stateController.active = {\n column: target.column.key,\n row: target.row.index,\n };\n }\n }\n\n protected bodyKeydownHandler(event: KeyboardEvent) {\n if (this.scrollContainer.isSameNode(event.target as HTMLElement)) {\n this.stateController.navigation.navigate(event);\n }\n }\n\n protected renderHeaderRow() {\n return html`\n <apex-grid-header-row\n style=${styleMap(this.DOM.columnSizes)}\n .columns=${this.DOM.displayColumns}\n .pinOffsets=${this.DOM.pinOffsets}\n ></apex-grid-header-row>\n `;\n }\n\n protected renderBody() {\n return html`\n <apex-virtualizer\n .items=${this.pageItems as T[]}\n .renderItem=${this.DOM.rowRenderer}\n @click=${this.bodyClickHandler}\n @keydown=${this.bodyKeydownHandler}\n ></apex-virtualizer>\n `;\n }\n\n protected renderFilterRow() {\n return this.columns.some((column) => column.filter)\n ? html`<apex-filter-row style=${styleMap(this.DOM.columnSizes)}></apex-filter-row>`\n : nothing;\n }\n\n protected renderToolbar() {\n // Toolbar is shared by all toolbar-housed features. Render it whenever\n // any one of them is enabled.\n if (!this.showQuickFilter && !this.showExport) return nothing;\n return html`<apex-grid-toolbar\n .value=${this.quickFilter}\n .showQuickFilter=${this.showQuickFilter}\n .showExport=${this.showExport}\n @apex-quick-filter=${(event: CustomEvent<string>) => {\n event.stopPropagation();\n this.setQuickFilter(event.detail);\n }}\n ></apex-grid-toolbar>`;\n }\n\n protected renderPaginator() {\n if (!this.stateController.pagination.enabled) return nothing;\n const options =\n this.pagination?.pageSizeOptions && this.pagination.pageSizeOptions.length > 0\n ? this.pagination.pageSizeOptions\n : [10, 25, 50, 100];\n return html`<apex-grid-paginator .pageSizeOptions=${options}></apex-grid-paginator>`;\n }\n\n /**\n * Renders a visually-hidden polite live region. Status messages set via\n * {@link announce} land here; screen readers will read them aloud without\n * stealing focus. We intentionally keep this in the shadow root so we\n * don't have to coordinate consumer DOM placement.\n */\n protected renderLiveRegion() {\n return html`<div\n part=\"live-region\"\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n style=\"position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0;\"\n >\n ${this.stateController.announcement}\n </div>`;\n }\n\n protected override render() {\n return html`\n ${this.stateController.resizing.renderIndicator()}\n ${this.renderToolbar()}\n ${this.renderHeaderRow()}\n ${this.renderFilterRow()}\n ${this.renderBody()}\n ${this.renderPaginator()}\n ${this.renderLiveRegion()}\n `;\n }\n\n /**\n * Sets the live region's announcement text. Screen readers configured to\n * read polite live updates will read the new value aloud.\n *\n * @remarks\n * Use this from custom UI affordances (e.g. an \"Apply filter\" button) so\n * the change is announced. Built-in operations (sort / filter / page /\n * select / expand) call this internally already.\n */\n public announce(message: string): void {\n this.stateController.setAnnouncement(message);\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n [ApexGrid.tagName]: ApexGrid<object>;\n }\n}\n"]}
1
+ {"version":3,"file":"grid.js","sourceRoot":"","sources":["../../src/components/grid.ts"],"names":[],"mappings":"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","sourcesContent":["import { ContextProvider } from '@lit/context';\nimport { html, nothing } from 'lit';\nimport { eventOptions, property, query, queryAll, state } from 'lit/decorators.js';\nimport { styleMap } from 'lit/directives/style-map.js';\nimport { DataOperationsController } from '../controllers/data-operation.js';\nimport { GridDOMController } from '../controllers/dom.js';\nimport { gridStateContext, StateController } from '../controllers/state.js';\nimport { DEFAULT_COLUMN_CONFIG, PIPELINE } from '../internal/constants.js';\nimport {\n buildCSV,\n type CSVExportOptions,\n downloadBlob,\n type ExportFormat,\n type ExportOptions,\n} from '../internal/export.js';\nimport { EventEmitterBase } from '../internal/mixins/event-emitter.js';\nimport { registerComponent } from '../internal/register.js';\nimport { GRID_TAG } from '../internal/tags.js';\nimport type {\n ColumnConfiguration,\n DataPipelineConfiguration,\n GridEditingConfiguration,\n GridExpansionConfiguration,\n GridSelectionConfiguration,\n GridSortConfiguration,\n GridTreeConfiguration,\n Keys,\n PaginationConfiguration,\n PaginationState,\n PinPosition,\n} from '../internal/types.js';\nimport {\n asArray,\n autoGenerateColumns,\n getDisplayColumns,\n getFilterOperandsFor,\n} from '../internal/utils.js';\nimport { watch } from '../internal/watch.js';\nimport type { FilterExpression } from '../operations/filter/types.js';\nimport type { SortExpression } from '../operations/sort/types.js';\nimport { styles as gridStyles } from '../styles/grid/grid.css.js';\nimport ApexGridCell from './cell.js';\nimport ApexFilterRow from './filter-row.js';\nimport ApexGridHeaderRow from './header-row.js';\nimport ApexGridPaginator from './paginator.js';\nimport ApexGridRow from './row.js';\nimport ApexGridToolbar from './toolbar.js';\nimport ApexVirtualizer from './virtualizer.js';\n\n/**\n * Event object for the filtering event of the grid.\n */\nexport interface ApexFilteringEvent<T extends object> {\n /**\n * The target column for the filter operation.\n */\n key: Keys<T>;\n\n /**\n * The filter expression(s) to apply.\n */\n expressions: FilterExpression<T>[];\n\n /**\n * The type of modification which will be applied to the filter\n * state of the column.\n *\n * @remarks\n * `add` - a new filter expression will be added to the state of the column.\n * `modify` - an existing filter expression will be modified.\n * `remove` - the expression(s) will be removed from the state of the column.\n */\n type: 'add' | 'modify' | 'remove';\n}\n\n/**\n * Event object for the filtered event of the grid.\n */\nexport interface ApexFilteredEvent<T extends object> {\n /**\n * The target column for the filter operation.\n */\n key: Keys<T>;\n\n /**\n * The filter state of the column after the operation.\n */\n state: FilterExpression<T>[];\n}\n\n/**\n * Event payload for the cancellable `pageChanging` event.\n */\nexport interface ApexPageChangingEvent {\n /**\n * The current page (zero-based) before the change.\n */\n page: number;\n /**\n * The current page size before the change.\n */\n pageSize: number;\n /**\n * The proposed page (zero-based) the grid will navigate to.\n */\n nextPage: number;\n /**\n * The proposed page size after the change.\n */\n nextPageSize: number;\n}\n\n/**\n * Event payload for the `pageChanged` event. Mirrors {@link PaginationState}.\n */\nexport interface ApexPageChangedEvent extends PaginationState {}\n\n/**\n * Event payload for the cancellable `quickFilterChanging` event.\n */\nexport interface ApexQuickFilterChangingEvent {\n /**\n * The current quick-filter value before the change.\n */\n value: string;\n /**\n * The proposed quick-filter value.\n */\n nextValue: string;\n}\n\n/**\n * Event payload for the `quickFilterChanged` event.\n */\nexport interface ApexQuickFilterChangedEvent {\n /**\n * The resolved quick-filter value after the change.\n */\n value: string;\n}\n\n/**\n * Drop position relative to a target column when reordering.\n */\nexport type ColumnDropPosition = 'before' | 'after';\n\n/**\n * Event payload for the cancellable `cellValueChanging` event.\n */\nexport interface ApexCellValueChangingEvent<T extends object> {\n /**\n * The column key of the edited cell.\n */\n key: Keys<T>;\n /**\n * The view-relative row index (matches {@link ApexGrid.pageItems}).\n */\n rowIndex: number;\n /**\n * The data record being edited (a live reference to the row in\n * {@link ApexGrid.data}).\n */\n data: T;\n /**\n * The value before the edit.\n */\n oldValue: unknown;\n /**\n * The candidate new value.\n */\n newValue: unknown;\n}\n\n/**\n * Event payload for the `cellValueChanged` event.\n */\nexport interface ApexCellValueChangedEvent<T extends object> {\n /**\n * The column key of the edited cell.\n */\n key: Keys<T>;\n /**\n * The view-relative row index after the change.\n */\n rowIndex: number;\n /**\n * The data record after the change (a live reference to the row in\n * {@link ApexGrid.data}).\n */\n data: T;\n /**\n * The applied value.\n */\n value: unknown;\n}\n\n/**\n * Event payload for the `rowEditStarted` event.\n */\nexport interface ApexRowEditStartedEvent {\n /**\n * The view-relative row index entering edit mode.\n */\n rowIndex: number;\n}\n\n/**\n * Event payload for the `rowEditEnded` event.\n */\nexport interface ApexRowEditEndedEvent {\n /**\n * The view-relative row index that left edit mode.\n */\n rowIndex: number;\n /**\n * `true` when pending edits were applied, `false` when discarded.\n */\n committed: boolean;\n}\n\n/**\n * Event payload for the cancellable `columnMoving` event.\n */\nexport interface ApexColumnMovingEvent<T extends object> {\n /**\n * The column being moved.\n */\n key: Keys<T>;\n /**\n * The current index of the moving column in {@link ApexGrid.columns}.\n */\n fromIndex: number;\n /**\n * The target column key. The dragged column will be placed `position`\n * (before/after) this column.\n */\n toKey: Keys<T>;\n /**\n * Whether the dragged column is being placed before or after `toKey`.\n */\n position: ColumnDropPosition;\n}\n\n/**\n * Event payload for the `columnMoved` event.\n */\nexport interface ApexColumnMovedEvent<T extends object> {\n /**\n * The column that was moved.\n */\n key: Keys<T>;\n /**\n * The original index in {@link ApexGrid.columns}.\n */\n fromIndex: number;\n /**\n * The resolved index in {@link ApexGrid.columns} after the move.\n */\n toIndex: number;\n}\n\n/**\n * Event payload for the cancellable `rowSelecting` event.\n */\nexport interface ApexRowSelectingEvent<T extends object> {\n /**\n * The rows that will become selected by this change.\n */\n added: T[];\n /**\n * The rows that will become deselected by this change.\n */\n removed: T[];\n /**\n * The full current selection before this change is applied.\n */\n current: T[];\n /**\n * The full selection after this change would be applied. Listeners can\n * inspect this to decide whether to cancel.\n */\n next: T[];\n}\n\n/**\n * Event payload for the `rowSelected` event.\n */\nexport interface ApexRowSelectedEvent<T extends object> {\n /**\n * The rows that became selected in this change.\n */\n added: T[];\n /**\n * The rows that became deselected in this change.\n */\n removed: T[];\n /**\n * The full current selection after the change has been applied.\n */\n selected: T[];\n}\n\n/**\n * Event payload for the cancellable `treeRowExpanding` event.\n */\nexport interface ApexTreeRowExpandingEvent<T extends object> {\n /** Rows that will become expanded by this change. */\n added: T[];\n /** Rows that will become collapsed by this change. */\n removed: T[];\n /** The full current tree-expansion set before this change is applied. */\n current: T[];\n /** The full set after this change would be applied. */\n next: T[];\n}\n\n/**\n * Event payload for the `treeRowExpanded` event.\n */\nexport interface ApexTreeRowExpandedEvent<T extends object> {\n /** Rows that became expanded in this change. */\n added: T[];\n /** Rows that became collapsed in this change. */\n removed: T[];\n /** The full tree-expansion set after the change has been applied. */\n expanded: T[];\n}\n\n/**\n * Event payload for the cancellable `rowExpanding` event.\n */\nexport interface ApexRowExpandingEvent<T extends object> {\n /** The rows that will become expanded by this change. */\n added: T[];\n /** The rows that will become collapsed by this change. */\n removed: T[];\n /** The full current expansion set before this change is applied. */\n current: T[];\n /**\n * The full expansion set after this change would be applied. Listeners can\n * inspect this to decide whether to cancel.\n */\n next: T[];\n}\n\n/**\n * Event payload for the `rowExpanded` event.\n */\nexport interface ApexRowExpandedEvent<T extends object> {\n /** The rows that became expanded in this change. */\n added: T[];\n /** The rows that became collapsed in this change. */\n removed: T[];\n /** The full expansion set after the change has been applied. */\n expanded: T[];\n}\n\n/**\n * Event payload for the cancellable `columnPinning` event.\n */\nexport interface ApexColumnPinningEvent<T extends object> {\n /**\n * The target column key.\n */\n key: Keys<T>;\n /**\n * The current pin position before the change (`null` if unpinned).\n */\n previous: PinPosition;\n /**\n * The proposed pin position (`null` to unpin).\n */\n next: PinPosition;\n}\n\n/**\n * Event payload for the `columnPinned` event.\n */\nexport interface ApexColumnPinnedEvent<T extends object> {\n /**\n * The target column key.\n */\n key: Keys<T>;\n /**\n * The resolved pin position after the change.\n */\n pinned: PinPosition;\n}\n\n/**\n * Events for the apex-grid.\n */\nexport interface ApexGridEventMap<T extends object> {\n /**\n * Emitted when sorting is initiated through the UI.\n * Returns the sort expression which will be used for the operation.\n *\n * @remarks\n * The event is cancellable which prevents the operation from being applied.\n * The expression can be modified prior to the operation running.\n *\n * @event\n */\n sorting: CustomEvent<SortExpression<T>>;\n /**\n * Emitted when a sort operation initiated through the UI has completed.\n * Returns the sort expression used for the operation.\n *\n * @event\n */\n sorted: CustomEvent<SortExpression<T>>;\n /**\n * Emitted when filtering is initiated through the UI.\n *\n * @remarks\n * The event is cancellable which prevents the operation from being applied.\n * The expression can be modified prior to the operation running.\n *\n * @event\n */\n filtering: CustomEvent<ApexFilteringEvent<T>>;\n /**\n * Emitted when a filter operation initiated through the UI has completed.\n * Returns the filter state for the affected column.\n *\n * @event\n */\n filtered: CustomEvent<ApexFilteredEvent<T>>;\n /**\n * Emitted before the grid navigates to a new page or applies a new page size.\n *\n * @remarks\n * Cancellable — calling `preventDefault()` (or returning a falsy result from\n * `addEventListener` synchronously) aborts the page change.\n *\n * @event\n */\n pageChanging: CustomEvent<ApexPageChangingEvent>;\n /**\n * Emitted after a page or page-size change has been applied and the pipeline has run.\n *\n * @event\n */\n pageChanged: CustomEvent<ApexPageChangedEvent>;\n /**\n * Emitted before the quick-filter value is applied.\n *\n * @remarks\n * Cancellable — calling `preventDefault()` aborts the change. The value can\n * be replaced inside the listener by reassigning {@link ApexGrid.quickFilter}.\n *\n * @event\n */\n quickFilterChanging: CustomEvent<ApexQuickFilterChangingEvent>;\n /**\n * Emitted after a quick-filter change has been applied and the pipeline has run.\n *\n * @event\n */\n quickFilterChanged: CustomEvent<ApexQuickFilterChangedEvent>;\n /**\n * Emitted before a column's pin position changes.\n *\n * @remarks\n * Cancellable — calling `preventDefault()` aborts the change.\n *\n * @event\n */\n columnPinning: CustomEvent<ApexColumnPinningEvent<T>>;\n /**\n * Emitted after a column's pin position change has been applied.\n *\n * @event\n */\n columnPinned: CustomEvent<ApexColumnPinnedEvent<T>>;\n /**\n * Emitted before a column is moved through the UI or {@link ApexGrid.moveColumn}.\n *\n * @remarks\n * Cancellable — calling `preventDefault()` aborts the move. The event detail\n * carries the source column key, its current array index, the target column\n * key and the drop position.\n *\n * @event\n */\n columnMoving: CustomEvent<ApexColumnMovingEvent<T>>;\n /**\n * Emitted after a column has been moved.\n *\n * @event\n */\n columnMoved: CustomEvent<ApexColumnMovedEvent<T>>;\n /**\n * Emitted before a cell value is committed.\n *\n * @remarks\n * Cancellable — `preventDefault()` rolls back the candidate value. In row\n * edit mode the event still fires per-cell at commit time.\n *\n * @event\n */\n cellValueChanging: CustomEvent<ApexCellValueChangingEvent<T>>;\n /**\n * Emitted after a cell value has been committed.\n *\n * @event\n */\n cellValueChanged: CustomEvent<ApexCellValueChangedEvent<T>>;\n /**\n * Emitted when a row enters edit mode (row edit mode only).\n *\n * @event\n */\n rowEditStarted: CustomEvent<ApexRowEditStartedEvent>;\n /**\n * Emitted when a row leaves edit mode, with `committed` reporting whether\n * pending edits were applied (row edit mode only).\n *\n * @event\n */\n rowEditEnded: CustomEvent<ApexRowEditEndedEvent>;\n /**\n * Emitted before the tree-row expansion set changes.\n *\n * @remarks\n * Fires only when {@link ApexGrid.tree} is enabled and a row's tree\n * expansion is toggled (via the chevron, the public API, or\n * `expand-all/collapse-all`). Cancellable.\n *\n * @event\n */\n treeRowExpanding: CustomEvent<ApexTreeRowExpandingEvent<T>>;\n /**\n * Emitted after a tree-row expansion change has been applied.\n *\n * @event\n */\n treeRowExpanded: CustomEvent<ApexTreeRowExpandedEvent<T>>;\n /**\n * Emitted before the row expansion set changes.\n *\n * @remarks\n * Cancellable — calling `preventDefault()` aborts the change. Fires for\n * every expansion-mutating call (toggle, expand-all, programmatic\n * `expandedRows = ...`).\n *\n * @event\n */\n rowExpanding: CustomEvent<ApexRowExpandingEvent<T>>;\n /**\n * Emitted after a row-expansion change has been applied.\n *\n * @event\n */\n rowExpanded: CustomEvent<ApexRowExpandedEvent<T>>;\n /**\n * Emitted before the row selection set changes.\n *\n * @remarks\n * Cancellable — calling `preventDefault()` aborts the selection change.\n * Fires for every selection-mutating call (toggle, range select, select-all,\n * programmatic `selectedRows = ...`).\n *\n * @event\n */\n rowSelecting: CustomEvent<ApexRowSelectingEvent<T>>;\n /**\n * Emitted after a row-selection change has been applied.\n *\n * @event\n */\n rowSelected: CustomEvent<ApexRowSelectedEvent<T>>;\n}\n\n/**\n * Apex grid is a web component for displaying data in a tabular format quick and easy.\n *\n * Out of the box it provides row virtualization, sort and filter operations (client and server side),\n * the ability to template cells and headers and column hiding.\n *\n * @remarks\n * A working, styled grid requires three things:\n * 1. Register the element: `import 'apex-grid/define'` (or `ApexGrid.register()`).\n * 2. Give the host element a bounded height, e.g. `apex-grid { height: 480px }` —\n * the virtualizer collapses without one.\n * 3. Do NOT set `display` on the host — the component declares `:host { display: grid }`\n * internally and any override breaks the track layout.\n *\n * The grid is styled out of the box through `--ag-*` CSS custom properties —\n * there is no theme to import and no `configureTheme()` call. Override `--ag-*`\n * tokens on the host (or any ancestor) to rebrand; when `igniteui-webcomponents`\n * is present, the brand tokens auto-tint from its palette. See the README\n * \"Getting Started\" and \"Theming\" sections for the full example and token list.\n *\n * @element apex-grid\n *\n * @fires sorting - Emitted when sorting is initiated through the UI.\n * @fires sorted - Emitted when a sort operation initiated through the UI has completed.\n * @fires filtering - Emitted when filtering is initiated through the UI.\n * @fires filtered - Emitted when a filter operation initiated through the UI has completed.\n * @fires pageChanging - Cancellable. Emitted before page/page-size changes are applied.\n * @fires pageChanged - Emitted after a page/page-size change has been applied.\n * @fires quickFilterChanging - Cancellable. Emitted before a quick-filter value is applied.\n * @fires quickFilterChanged - Emitted after a quick-filter change has been applied.\n * @fires columnPinning - Cancellable. Emitted before a column's pin position changes.\n * @fires columnPinned - Emitted after a column's pin position has changed.\n * @fires columnMoving - Cancellable. Emitted before a column is moved.\n * @fires columnMoved - Emitted after a column has been moved.\n * @fires cellValueChanging - Cancellable. Emitted before a cell value is committed.\n * @fires cellValueChanged - Emitted after a cell value has been committed.\n * @fires rowEditStarted - Emitted when a row enters edit mode (row mode only).\n * @fires rowEditEnded - Emitted when a row leaves edit mode (row mode only).\n * @fires rowSelecting - Cancellable. Emitted before a selection-set change is applied.\n * @fires rowSelected - Emitted after a selection-set change has been applied.\n * @fires rowExpanding - Cancellable. Emitted before the row-expansion set changes (master-detail).\n * @fires rowExpanded - Emitted after a row-expansion change has been applied.\n * @fires treeRowExpanding - Cancellable. Emitted before a tree-row expansion change (tree mode).\n * @fires treeRowExpanded - Emitted after a tree-row expansion change has been applied.\n *\n * @csspart live-region - Visually-hidden ARIA live region used for screen-reader announcements.\n *\n * @cssprop [--ag-brand] - Brand color for selection, focus rings, and accents. Auto-tints from `--ig-primary-500` when igniteui is present.\n * @cssprop [--ag-brand-strong] - Brand color for hover / pressed states.\n * @cssprop [--ag-grid-shadow] - Grid edge/shadow override. Default is a flat 1px hairline edge; set to `var(--ag-shadow-card)` for the elevated card look, or `none` to remove it.\n * @cssprop [--ag-surface] - Grid card background (must be opaque).\n * @cssprop [--ag-surface-alt] - Alternating row tint.\n * @cssprop [--ag-surface-elevated] - Header background.\n * @cssprop [--ag-hairline] - Header / structural gridline color.\n * @cssprop [--ag-border] - Row separator color.\n * @cssprop [--ag-text] - Primary text color.\n * @cssprop [--ag-text-body] - Row text color.\n * @cssprop [--ag-text-muted] - Muted text (roles, labels).\n * @cssprop [--ag-row-hover] - Row hover wash.\n * @cssprop [--ag-row-h] - Row height.\n * @cssprop [--ag-header-h] - Header height.\n * @cssprop [--ag-radius] - Outer card corner radius.\n * @cssprop [--ag-font] - Grid font family.\n * @cssprop [--ag-fs-cell] - Cell font size.\n *\n * @see {@link https://github.com/apexcharts/apex-grid/blob/main/packages/core/src/styles/_tokens.scss | _tokens.scss} for the complete `--ag-*` token list.\n */\nexport class ApexGrid<T extends object> extends EventEmitterBase<ApexGridEventMap<T>> {\n public static get tagName(): string {\n return GRID_TAG;\n }\n\n public static override styles = gridStyles;\n\n /**\n * Registers `<apex-grid>` and its internal dependencies with the custom-element\n * registry. Idempotent — safe to call more than once.\n *\n * @remarks\n * Registering the element is only step one of four required for a visible, styled\n * grid. You must also configure an Ignite UI theme + CSS, give the host a bounded\n * height, and avoid overriding `display` on the host. See the README\n * \"Getting Started\" section for the full setup.\n */\n public static register() {\n registerComponent(\n ApexGrid,\n ApexVirtualizer,\n ApexGridRow,\n ApexGridHeaderRow,\n ApexFilterRow,\n ApexGridPaginator,\n ApexGridToolbar\n );\n }\n\n protected stateController = this.createStateController();\n protected DOM = new GridDOMController<T>(this, this.stateController);\n protected dataController = new DataOperationsController<T>(this);\n\n /**\n * Builds the grid's {@link StateController}. This is the single construction\n * site for `stateController` — overriding it (rather than re-declaring the\n * field) is the supported seam for derived grids to inject optional\n * {@link GridFeatureModule}s while preserving field-initializer ordering.\n * The community grid registers no extra modules.\n */\n protected createStateController(): StateController<T> {\n return new StateController<T>(this);\n }\n\n protected stateProvider = new ContextProvider(this, {\n context: gridStateContext,\n initialValue: this.stateController,\n });\n\n @query(ApexVirtualizer.tagName)\n protected scrollContainer!: ApexVirtualizer;\n\n @query(ApexGridHeaderRow.tagName)\n protected headerRow!: ApexGridHeaderRow<T>;\n\n @query(ApexFilterRow.tagName)\n protected filterRow!: ApexFilterRow<T>;\n\n @query(ApexGridPaginator.tagName)\n protected paginator!: ApexGridPaginator<T>;\n\n @query(ApexGridToolbar.tagName)\n protected toolbar!: ApexGridToolbar<T>;\n\n @state()\n protected dataState: Array<T> = [];\n\n @queryAll(ApexGridRow.tagName)\n protected _rows!: NodeListOf<ApexGridRow<T>>;\n\n /** Column configuration for the grid. */\n @property({ attribute: false })\n public columns: Array<ColumnConfiguration<T>> = [];\n\n /** The data source for the grid. */\n @property({ attribute: false })\n public data: Array<T> = [];\n\n /**\n * Whether the grid will try to \"resolve\" its column configuration based on the passed\n * data source.\n *\n * @remarks\n * This is usually executed on initial rendering in the DOM. It depends on having an existing data source\n * to infer the column configuration for the grid.\n * Passing an empty data source or having a late bound data source (such as a HTTP request) will usually\n * result in empty column configuration for the grid.\n *\n * This property is ignored if any existing column configuration already exists in the grid.\n *\n * In a scenario where you want to bind a new data source and still keep the auto-generation behavior,\n * make sure to reset the column collection of the grid before passing in the new data source.\n *\n * @example\n * ```typescript\n * // assuming autoGenerate is set to true\n * grid.columns = [];\n * grid.data = [...];\n * ```\n *\n * @attr auto-generate\n */\n @property({ type: Boolean, attribute: 'auto-generate' })\n public autoGenerate = false;\n\n /** Sort configuration property for the grid. */\n @property({ attribute: false })\n public sortConfiguration: GridSortConfiguration = {\n multiple: true,\n triState: true,\n };\n\n /**\n * Configuration object which controls remote data operations for the grid.\n */\n @property({ attribute: false })\n public dataPipelineConfiguration!: DataPipelineConfiguration<T>;\n\n /**\n * Pagination configuration for the grid.\n *\n * @remarks\n * Pagination is disabled by default. Set `enabled: true` and (optionally) `pageSize`\n * to render the built-in `<apex-grid-paginator>` and slice the dataView. For\n * server-side pagination set `mode: 'remote'` and supply `totalItems`. The grid\n * emits the cancellable `pageChanging` event before applying a change and the\n * `pageChanged` event after the pipeline has run.\n *\n * @example\n * ```ts\n * grid.pagination = { enabled: true, pageSize: 25 };\n * grid.addEventListener('pageChanged', (event) => {\n * console.log('Now on page', event.detail.page, 'of', event.detail.pageCount);\n * });\n * ```\n */\n @property({ attribute: false })\n public pagination?: PaginationConfiguration;\n\n /**\n * The quick-filter (global search) value applied to the dataView.\n *\n * @remarks\n * When non-empty, the grid filters records whose visible-column values contain\n * the term (case-insensitive substring match). Customise by providing\n * {@link DataPipelineConfiguration.quickFilter}.\n *\n * @attr quick-filter\n */\n @property({ type: String, attribute: 'quick-filter' })\n public quickFilter = '';\n\n /**\n * Whether the built-in quick-filter input is rendered in the toolbar.\n *\n * @remarks\n * The {@link ApexGrid.quickFilter} value can be controlled programmatically\n * regardless of this flag; this only controls the toolbar input UI.\n *\n * @attr show-quick-filter\n */\n @property({ type: Boolean, attribute: 'show-quick-filter' })\n public showQuickFilter = false;\n\n /**\n * Whether the built-in export menu is rendered in the toolbar.\n *\n * @remarks\n * When `true`, the toolbar shows a download button on the trailing side;\n * clicking it opens a menu with one entry per {@link ApexGrid.exportFormats}\n * (CSV in the community grid) that calls {@link ApexGrid.exportAs}.\n * {@link ApexGrid.exportToCSV} remains callable programmatically regardless\n * of this flag.\n *\n * @attr show-export\n */\n @property({ type: Boolean, attribute: 'show-export' })\n public showExport = false;\n\n /**\n * Enables drag-and-drop column reordering on the column headers.\n *\n * @remarks\n * Per-column opt-out is available through {@link BaseColumnConfiguration.reorderable}.\n * Reordering is constrained to a column's own pinning group — start-pinned\n * columns can only swap with start-pinned, unpinned with unpinned, and\n * end-pinned with end-pinned.\n *\n * @attr column-reordering\n */\n @property({ type: Boolean, attribute: 'column-reordering' })\n public columnReordering = false;\n\n /**\n * Inline editing configuration for the grid.\n *\n * @remarks\n * Editing is disabled by default. Set `enabled: true` and (optionally) `mode`\n * (`'cell' | 'row'`) and `trigger` (`'click' | 'doubleClick'`) to opt in.\n * Per-column opt-in is required via {@link BaseColumnConfiguration.editable}.\n *\n * @example\n * ```ts\n * grid.editing = { enabled: true, mode: 'cell', trigger: 'doubleClick' };\n * ```\n */\n @property({ attribute: false })\n public editing?: GridEditingConfiguration;\n\n /**\n * Row selection configuration for the grid.\n *\n * @remarks\n * Selection is disabled by default. Set `enabled: true` and (optionally)\n * `mode` (`'single' | 'multiple'`) and `showCheckboxColumn` to opt in.\n *\n * @example\n * ```ts\n * grid.selection = { enabled: true, mode: 'multiple', showCheckboxColumn: true };\n * ```\n */\n @property({ attribute: false })\n public selection?: GridSelectionConfiguration;\n\n /**\n * The currently selected rows, in insertion order.\n *\n * @remarks\n * Returned as a plain array snapshot — mutating the returned array does\n * not change the grid's selection. Set this property to replace the\n * selection programmatically (goes through the cancellable\n * `rowSelecting` event).\n */\n public get selectedRows(): T[] {\n return this.stateController.selection.selectedRows();\n }\n\n public set selectedRows(rows: ReadonlyArray<T>) {\n void this.stateController.selection.replaceSelection(rows);\n }\n\n /**\n * Selects `row`, replacing the existing selection in `'single'` mode or\n * adding to it in `'multiple'` mode.\n *\n * @returns `true` if the selection changed, `false` if the change was\n * rejected by a `rowSelecting` listener or selection is disabled.\n */\n public selectRow(row: T): Promise<boolean> {\n return this.stateController.selection.selectRow(row);\n }\n\n /**\n * Deselects `row`. No-op if `row` is not currently selected.\n */\n public deselectRow(row: T): Promise<boolean> {\n return this.stateController.selection.deselectRow(row);\n }\n\n /**\n * Toggles selection of `row`.\n */\n public toggleRowSelection(row: T): Promise<boolean> {\n return this.stateController.selection.toggleRow(row);\n }\n\n /**\n * Selects every row in the current view ({@link dataView}). No-op in\n * `'single'` selection mode.\n */\n public selectAllRows(): Promise<boolean> {\n return this.stateController.selection.selectAll();\n }\n\n /**\n * Clears the row selection.\n */\n public clearSelection(): Promise<boolean> {\n return this.stateController.selection.clear();\n }\n\n /**\n * Whether `row` is currently selected.\n */\n public isRowSelected(row: T): boolean {\n return this.stateController.selection.isSelected(row);\n }\n\n /**\n * Row-expansion (master-detail) configuration for the grid.\n *\n * @remarks\n * Expansion is disabled by default. Set `enabled: true` and supply a\n * `detailTemplate` to opt in. The default UX renders a chevron toggle in a\n * dedicated leading column; set `showToggleColumn: false` to drive\n * expansion entirely through the public API or a custom cell template.\n *\n * @example\n * ```ts\n * grid.expansion = {\n * enabled: true,\n * detailTemplate: ({ data }) => html`<order-summary .order=${data}></order-summary>`,\n * };\n * ```\n */\n @property({ attribute: false })\n public expansion?: GridExpansionConfiguration<T>;\n\n /**\n * The currently expanded rows, in insertion order.\n *\n * @remarks\n * Returned as a plain array snapshot — mutating the returned array does\n * not change the grid's expansion state. Set this property to replace the\n * expansion set programmatically (goes through the cancellable\n * `rowExpanding` event).\n */\n public get expandedRows(): T[] {\n return this.stateController.expansion.expandedRows();\n }\n\n public set expandedRows(rows: ReadonlyArray<T>) {\n void this.stateController.expansion.replaceExpansion(rows);\n }\n\n /**\n * Expands `row`. No-op when the row is already expanded, expansion is\n * disabled, or the optional `isExpandable` predicate rejects it.\n */\n public expandRow(row: T): Promise<boolean> {\n return this.stateController.expansion.expandRow(row);\n }\n\n /**\n * Collapses `row`. No-op when the row is not currently expanded.\n */\n public collapseRow(row: T): Promise<boolean> {\n return this.stateController.expansion.collapseRow(row);\n }\n\n /**\n * Toggles expansion of `row`.\n */\n public toggleRowExpansion(row: T): Promise<boolean> {\n return this.stateController.expansion.toggleRow(row);\n }\n\n /**\n * Expands every row in {@link ApexGrid.dataView} that passes the optional\n * `isExpandable` predicate.\n */\n public expandAllRows(): Promise<boolean> {\n return this.stateController.expansion.expandAll();\n }\n\n /**\n * Collapses every currently expanded row.\n */\n public collapseAllRows(): Promise<boolean> {\n return this.stateController.expansion.collapseAll();\n }\n\n /**\n * Whether `row` is currently expanded.\n */\n public isRowExpanded(row: T): boolean {\n return this.stateController.expansion.isExpanded(row);\n }\n\n /**\n * Tree-data (nested rows) configuration for the grid.\n *\n * @remarks\n * Tree mode keeps {@link ApexGrid.data} flat; the grid derives the\n * hierarchy from a user-supplied `getDataPath(row)` callback (AG Grid's\n * \"tree data\" pattern). When enabled, the first visible data column (or\n * the column referenced by `groupColumnKey`) renders a chevron toggle\n * and depth-based indentation.\n *\n * @example\n * ```ts\n * grid.tree = {\n * enabled: true,\n * getDataPath: (row) => row.path, // e.g., ['Adrian'], ['Adrian', 'Bryan']\n * defaultExpanded: true,\n * };\n * ```\n */\n @property({ attribute: false })\n public tree?: GridTreeConfiguration<T>;\n\n /**\n * Toggles tree-expansion of `row`. No-op when tree mode is disabled or\n * the row has no children.\n */\n public toggleTreeRow(row: T): Promise<boolean> {\n return this.stateController.tree.toggleRow(row);\n }\n\n /**\n * Expands a tree row. No-op when the row is already expanded, has no\n * children, or tree mode is disabled.\n */\n public expandTreeRow(row: T): Promise<boolean> {\n return this.stateController.tree.expandRow(row);\n }\n\n /**\n * Collapses a tree row. No-op when the row is not currently expanded.\n */\n public collapseTreeRow(row: T): Promise<boolean> {\n return this.stateController.tree.collapseRow(row);\n }\n\n /** Expands every parent row in the current tree. */\n public expandAllTreeRows(): Promise<boolean> {\n return this.stateController.tree.expandAll();\n }\n\n /** Collapses every currently-expanded tree row. */\n public collapseAllTreeRows(): Promise<boolean> {\n return this.stateController.tree.collapseAll();\n }\n\n /** Whether `row` is currently expanded in the tree. */\n public isTreeRowExpanded(row: T): boolean {\n return this.stateController.tree.isExpanded(row);\n }\n\n /**\n * Set the sort state for the grid.\n */\n public set sortExpressions(expressions: SortExpression<T>[]) {\n if (expressions.length) {\n this.sort(expressions);\n }\n }\n\n /**\n * Get the sort state for the grid.\n */\n @property({ attribute: false })\n public get sortExpressions(): SortExpression<T>[] {\n return Array.from(this.stateController.sorting.state.values());\n }\n\n /**\n * Set the filter state for the grid.\n */\n public set filterExpressions(expressions: FilterExpression<T>[]) {\n if (expressions.length) {\n this.filter(expressions);\n }\n }\n\n /**\n * Get the filter state for the grid.\n */\n @property({ attribute: false })\n public get filterExpressions(): FilterExpression<T>[] {\n const expressions: FilterExpression<T>[] = [];\n\n for (const each of this.stateController.filtering.state.values) {\n expressions.push(...each.all);\n }\n\n return expressions;\n }\n\n /**\n * Returns the collection of rendered row elements in the grid.\n *\n * @remarks\n * Since the grid has virtualization, this property returns only the currently rendered\n * chunk of elements in the DOM.\n */\n public get rows() {\n return Array.from(this._rows);\n }\n\n /**\n * Returns the state of the data source after sort/filter operations\n * have been applied.\n */\n public get dataView(): ReadonlyArray<T> {\n return this.dataState;\n }\n\n /**\n * The columns in visual render order: `'start'`-pinned columns first, then\n * unpinned columns, then `'end'`-pinned columns.\n *\n * @remarks\n * Use this when you need to iterate the columns in the same order the grid\n * actually displays them (for example to build a column chooser). Public APIs\n * like {@link ApexGrid.getColumn} continue to operate on the user-supplied\n * {@link ApexGrid.columns} array.\n */\n public get displayColumns(): ReadonlyArray<ColumnConfiguration<T>> {\n return getDisplayColumns(this.columns);\n }\n\n /**\n * The total number of items in the {@link ApexGrid.dataView} collection.\n *\n * @remarks\n * This is always the post-filter, post-sort row count — pagination does not change it.\n * Use {@link ApexGrid.pageItems} to read the rows currently rendered into the body.\n */\n public get totalItems() {\n if (this.pagination?.mode === 'remote') {\n return Math.max(0, this.pagination?.totalItems ?? 0);\n }\n return this.dataState.length;\n }\n\n /**\n * The records currently rendered into the virtualized body.\n *\n * @remarks\n * Equal to {@link ApexGrid.dataView} when pagination is disabled. With pagination\n * enabled (`'local'` mode) this is the active page slice.\n */\n public get pageItems(): ReadonlyArray<T> {\n if (!this.stateController.pagination.enabled) return this.dataState;\n if (this.pagination?.mode === 'remote') return this.dataState;\n const { page, pageSize } = this.stateController.pagination;\n if (!pageSize) return this.dataState;\n const start = page * pageSize;\n return this.dataState.slice(start, start + pageSize);\n }\n\n /**\n * The current zero-based page index.\n */\n @property({ attribute: false })\n public get page(): number {\n return this.stateController.pagination.page;\n }\n\n public set page(value: number) {\n this.stateController.pagination.gotoPage(value);\n }\n\n /**\n * The current page size.\n */\n @property({ attribute: false })\n public get pageSize(): number {\n return this.stateController.pagination.pageSize;\n }\n\n public set pageSize(value: number) {\n this.stateController.pagination.setPageSize(value);\n }\n\n /**\n * The total number of pages computed from {@link ApexGrid.totalItems} and {@link ApexGrid.pageSize}.\n */\n public get pageCount(): number {\n return this.stateController.pagination.pageCount;\n }\n\n @watch('columns')\n protected watchColumns(_: ColumnConfiguration<T>[], newConfig: ColumnConfiguration<T>[] = []) {\n this.columns = newConfig.map((config) => ({ ...DEFAULT_COLUMN_CONFIG, ...config }));\n }\n\n @watch('data')\n protected dataChanged() {\n // Shallow copy of the array — items keep reference equality with\n // `this.data` so cell edits can write through to the source record.\n let next: T[] = [...this.data];\n autoGenerateColumns(this);\n // Tree controller needs to re-apply `defaultExpanded` against the new\n // record set when data is swapped wholesale.\n this.stateController?.tree?.resetForDataChange();\n // Tree mode applies its flatten step synchronously here so the first\n // paint shows the right shape. Sort/filter/quickFilter still run via\n // the async pipeline on subsequent updates — they take this dataState\n // as input and re-apply tree at the end. Running tree both here and\n // inside the pipeline is idempotent because `process` is pure.\n if (this.stateController?.tree?.enabled) {\n next = this.stateController.tree.process(next);\n }\n this.dataState = next;\n if (this.hasUpdated) {\n this.pipeline();\n }\n }\n\n @watch(PIPELINE)\n protected async pipeline() {\n this.dataState = await this.dataController.apply([...this.data], this.stateController);\n this.stateController.pagination.reclamp();\n }\n\n @watch('pagination')\n protected paginationChanged() {\n const ctrl = this.stateController?.pagination;\n if (!ctrl) return;\n const next = this.pagination ?? {};\n if (typeof next.pageSize === 'number' && next.pageSize > 0) {\n ctrl.pageSize = next.pageSize;\n }\n if (typeof next.page === 'number') {\n ctrl.page = next.page;\n }\n if (this.hasUpdated) {\n this.pipeline();\n }\n }\n\n @watch('quickFilter')\n protected quickFilterChanged() {\n if (this.hasUpdated) {\n this.pipeline();\n }\n }\n\n protected override updated(): void {\n // Expose ARIA grid semantics on the host so screen readers announce the\n // structure correctly. We do this in `updated()` (post-render) rather\n // than `willUpdate()` because `@watch('data')` runs *after* the original\n // willUpdate via decorator wrapping — reading `pageItems` earlier would\n // see a stale (empty) `dataState`.\n this.setAttribute('role', this.stateController.tree.enabled ? 'treegrid' : 'grid');\n const hasFilter = this.columns.some((column) => column.filter);\n const headerRows = hasFilter ? 2 : 1;\n this.setAttribute('aria-rowcount', String(headerRows + this.pageItems.length));\n const visibleColumns = this.columns.filter((column) => !column.hidden).length;\n const extras =\n (this.stateController.selection.showCheckboxColumn ? 1 : 0) +\n (this.stateController.expansion.showToggleColumn ? 1 : 0);\n this.setAttribute('aria-colcount', String(visibleColumns + extras));\n }\n\n protected override firstUpdated(): void {\n // The component declares `:host { display: grid }` for its internal track\n // layout (header / filter / virtualized body). If a consumer rule overrides\n // it, the virtualizer collapses and only a few rows render. Warn loudly so\n // the failure mode isn't silent.\n if (typeof getComputedStyle === 'function' && getComputedStyle(this).display !== 'grid') {\n // biome-ignore lint/suspicious/noConsole: intentional one-shot user diagnostic\n console.warn(\n '[apex-grid] Host `display` has been overridden. The grid requires ' +\n '`display: grid` for its internal track layout and will not render correctly. ' +\n 'Remove any CSS rule that sets `display` on <apex-grid>. ' +\n 'See: https://github.com/apexcharts/apexgrid#4-size-the-host'\n );\n }\n }\n\n /**\n * Performs a filter operation in the grid based on the passed expression(s).\n */\n public filter(config: FilterExpression<T> | FilterExpression<T>[]) {\n this.stateController.filtering.filter(\n asArray(config).map((each) =>\n typeof each.condition === 'string'\n ? // XXX: Types\n Object.assign(each, {\n condition: (getFilterOperandsFor(this.getColumn(each.key)!) as any)[each.condition],\n })\n : each\n )\n );\n }\n\n /**\n * Performs a sort operation in the grid based on the passed expression(s).\n */\n public sort(expressions: SortExpression<T> | SortExpression<T>[]) {\n this.stateController.sorting.sort(expressions);\n }\n\n /**\n * Resets the current sort state of the control.\n */\n public clearSort(key?: Keys<T>) {\n this.stateController.sorting.reset(key);\n this.requestUpdate(PIPELINE);\n }\n\n /**\n * Resets the current filter state of the control.\n */\n public clearFilter(key?: Keys<T>) {\n this.stateController.filtering.reset(key);\n this.requestUpdate(PIPELINE);\n }\n\n /**\n * Navigates the grid to the given zero-based `page` index.\n *\n * @remarks\n * Emits the cancellable `pageChanging` event before applying the change and the\n * `pageChanged` event after. Out-of-range values are clamped into `[0, pageCount - 1]`.\n *\n * @param page - The target zero-based page index.\n * @returns `true` if the change was applied, `false` if cancelled or a no-op.\n *\n * @example\n * ```ts\n * await grid.gotoPage(2);\n * ```\n */\n public gotoPage(page: number): Promise<boolean> {\n return this.stateController.pagination.gotoPage(page);\n }\n\n /**\n * Updates the grid's page size and returns to the first page.\n *\n * @remarks\n * Emits the cancellable `pageChanging` event before applying the change and the\n * `pageChanged` event after.\n *\n * @param size - The new page size (must be a positive integer).\n * @returns `true` if the change was applied, `false` if cancelled or a no-op.\n */\n public setPageSize(size: number): Promise<boolean> {\n return this.stateController.pagination.setPageSize(size);\n }\n\n /**\n * Navigates to the next page. No-op if already on the last page.\n */\n public nextPage() {\n return this.stateController.pagination.nextPage();\n }\n\n /**\n * Navigates to the previous page. No-op if already on the first page.\n */\n public previousPage() {\n return this.stateController.pagination.previousPage();\n }\n\n /**\n * Navigates to the first page.\n */\n public firstPage() {\n return this.stateController.pagination.firstPage();\n }\n\n /**\n * Navigates to the last page.\n */\n public lastPage() {\n return this.stateController.pagination.lastPage();\n }\n\n /**\n * Applies a new quick-filter (global search) value, emitting the cancellable\n * `quickFilterChanging` event first and the `quickFilterChanged` event after the\n * pipeline has run.\n *\n * @param value - The new quick-filter value. Pass `''` to clear.\n * @returns `true` if the change was applied, `false` if cancelled or a no-op.\n *\n * @example\n * ```ts\n * await grid.setQuickFilter('john');\n * ```\n */\n public async setQuickFilter(value: string): Promise<boolean> {\n const next = value ?? '';\n if (next === this.quickFilter) return false;\n\n const proceed = this.emitEvent('quickFilterChanging', {\n detail: { value: this.quickFilter, nextValue: next },\n cancelable: true,\n });\n if (!proceed) return false;\n\n this.quickFilter = next;\n this.stateController.pagination.page = 0;\n await this.updateComplete;\n this.emitEvent('quickFilterChanged', { detail: { value: this.quickFilter } });\n return true;\n }\n\n /**\n * Returns a {@link ColumnConfiguration} for a given column.\n */\n public getColumn(id: Keys<T> | number) {\n return typeof id === 'number'\n ? this.columns.at(id)\n : this.columns.find(({ key }) => key === id);\n }\n\n /**\n * Updates the column configuration of the grid.\n *\n * @remarks\n * Each updated column is replaced with a fresh object reference so that cells\n * and headers re-render with the new template / configuration. The\n * user-supplied `columns` array is also reassigned for Lit reactivity.\n */\n public updateColumns(columns: ColumnConfiguration<T> | ColumnConfiguration<T>[]) {\n const updates = new Map(asArray(columns).map((c) => [c.key, c]));\n if (updates.size === 0) return;\n\n let touched = false;\n const next = this.columns.map((column) => {\n const patch = updates.get(column.key);\n if (!patch) return column;\n touched = true;\n return { ...column, ...patch };\n });\n\n if (!touched) return;\n this.columns = next;\n this.requestUpdate(PIPELINE);\n }\n\n /**\n * Pins a column to one of the grid's edges, or unpins it when `position` is `null`.\n *\n * @remarks\n * Emits the cancellable `columnPinning` event first and the `columnPinned`\n * event after the update is applied. The user-supplied {@link ApexGrid.columns}\n * array is not reordered — only the visual render order changes.\n *\n * @param key - The target column key.\n * @param position - `'start'`, `'end'`, or `null` to unpin.\n * @returns `true` if the change was applied, `false` if cancelled or a no-op.\n *\n * @example\n * ```ts\n * await grid.pinColumn('name', 'start');\n * await grid.pinColumn('actions', 'end');\n * ```\n */\n public async pinColumn(key: Keys<T>, position: PinPosition): Promise<boolean> {\n const column = this.getColumn(key);\n if (!column) return false;\n\n const previous = column.pinned ?? null;\n const next = position ?? null;\n if (previous === next) return false;\n\n const proceed = this.emitEvent('columnPinning', {\n detail: { key, previous, next },\n cancelable: true,\n });\n if (!proceed) return false;\n\n column.pinned = next ?? undefined;\n this.columns = [...this.columns];\n await this.updateComplete;\n this.emitEvent('columnPinned', { detail: { key, pinned: next } });\n return true;\n }\n\n /**\n * Unpins a column. Equivalent to {@link ApexGrid.pinColumn}(`key`, `null`).\n *\n * @param key - The target column key.\n * @returns `true` if the change was applied, `false` if the column was already\n * unpinned or the operation was cancelled.\n */\n public unpinColumn(key: Keys<T>): Promise<boolean> {\n return this.pinColumn(key, null);\n }\n\n /**\n * The cell currently in edit mode, or `null`.\n */\n public get editingCell(): { rowIndex: number; columnKey: Keys<T> } | null {\n const active = this.stateController.editing.activeCell;\n return active ? { rowIndex: active.rowIndex, columnKey: active.columnKey } : null;\n }\n\n /**\n * The view-relative index of the row currently in edit mode (row edit mode\n * only), or `null`.\n */\n public get editingRow(): number | null {\n return this.stateController.editing.activeRow?.rowIndex ?? null;\n }\n\n /**\n * Begins editing the cell at `(rowIndex, columnKey)`.\n *\n * @remarks\n * `rowIndex` is the view-relative index (matches {@link ApexGrid.pageItems}).\n * Returns `false` when the column isn't editable, the row index is out of\n * range, or the request was rejected (for example in row mode with pending\n * changes that couldn't be committed).\n */\n public editCell(rowIndex: number, columnKey: Keys<T>): Promise<boolean> {\n return this.stateController.editing.editCell(rowIndex, columnKey);\n }\n\n /**\n * Begins editing the entire row at `rowIndex` (row edit mode only).\n *\n * @returns `false` when editing is disabled, the grid is in cell mode, or\n * the row index is out of range.\n */\n public editRow(rowIndex: number): Promise<boolean> {\n return this.stateController.editing.editRow(rowIndex);\n }\n\n /**\n * Commits the current edit.\n *\n * @remarks\n * In cell mode this writes the active cell's pending value. In row mode it\n * flushes all pending values for the active row. Emits `cellValueChanging`\n * per changed cell (cancellable) and `cellValueChanged` after, followed by\n * `rowEditEnded` in row mode.\n */\n public commitEdit(): Promise<boolean> {\n const editing = this.stateController.editing;\n return editing.mode === 'row' ? editing.commitRow() : editing.commitCell();\n }\n\n /**\n * Discards the current edit without writing back to {@link ApexGrid.data}.\n */\n public cancelEdit(): void {\n const editing = this.stateController.editing;\n if (editing.mode === 'row') {\n editing.cancelRow();\n } else {\n editing.cancelCell();\n }\n }\n\n /**\n * Exports the current grid contents as a CSV string and (in a browser\n * context) triggers a download.\n *\n * @remarks\n * By default the export uses the post-filter/post-sort `dataView`, includes\n * every visible column with `exportable !== false`, and prepends a UTF-8 BOM\n * so Excel opens the file with the right encoding. Pass `source: 'page'` to\n * export only the current page, `source: 'selected'` to export the current\n * row selection, or `source: 'all'` to export the raw `data` array. The\n * returned string is the same content written to the file — useful for\n * tests or routing the bytes elsewhere.\n *\n * @example\n * ```ts\n * grid.exportToCSV(); // download data.csv\n * grid.exportToCSV({ filename: 'users', source: 'selected' });\n * const text = grid.exportToCSV({ filename: '' }); // string only, no download\n * ```\n */\n public exportToCSV(options: CSVExportOptions<T> = {}): string {\n const csv = buildCSV(this, options);\n const filename = options.filename;\n if (filename) {\n downloadBlob(`${filename}.csv`, csv, 'text/csv;charset=utf-8;');\n } else if (filename === undefined) {\n downloadBlob('data.csv', csv, 'text/csv;charset=utf-8;');\n }\n return csv;\n }\n\n /**\n * The export formats offered in the toolbar's export menu, in order.\n *\n * @remarks\n * The community grid offers CSV only. This is the seam derived grids use to\n * contribute more formats: `@apexcharts/grid-enterprise` overrides it to add\n * `'xlsx'`. The toolbar renders one menu item per entry and dispatches the\n * chosen id to {@link ApexGrid.exportAs}.\n */\n public get exportFormats(): ReadonlyArray<ExportFormat> {\n return [{ id: 'csv', label: 'Export CSV' }];\n }\n\n /**\n * Exports the grid in the given format (one of {@link ApexGrid.exportFormats}).\n * Called by the toolbar's export menu. The community grid handles `'csv'`;\n * derived grids override to handle additional formats, delegating to `super`\n * for the ones they don't add.\n */\n public exportAs(formatId: string, options: ExportOptions<T> = {}): void {\n if (formatId === 'csv') {\n this.exportToCSV(options as CSVExportOptions<T>);\n }\n }\n\n /**\n * Moves a column relative to another column.\n *\n * @remarks\n * Emits the cancellable `columnMoving` event first and `columnMoved` after.\n * Reordering only succeeds when the source and target columns share the same\n * pinning group (start / unpinned / end) — cross-group moves return `false`.\n * Use {@link ApexGrid.pinColumn} to change a column's pinning group first.\n *\n * @param fromKey - The column to move.\n * @param toKey - The reference column.\n * @param position - Whether to place `fromKey` before or after `toKey`. Defaults to `'before'`.\n * @returns `true` if the move was applied, `false` if cancelled or a no-op.\n *\n * @example\n * ```ts\n * await grid.moveColumn('email', 'name', 'after');\n * ```\n */\n public async moveColumn(\n fromKey: Keys<T>,\n toKey: Keys<T>,\n position: ColumnDropPosition = 'before'\n ): Promise<boolean> {\n if (fromKey === toKey) return false;\n const fromIndex = this.columns.findIndex((column) => column.key === fromKey);\n const toIndex = this.columns.findIndex((column) => column.key === toKey);\n if (fromIndex < 0 || toIndex < 0) return false;\n\n const source = this.columns[fromIndex];\n const target = this.columns[toIndex];\n if ((source.pinned ?? null) !== (target.pinned ?? null)) return false;\n\n const proceed = this.emitEvent('columnMoving', {\n detail: { key: fromKey, fromIndex, toKey, position },\n cancelable: true,\n });\n if (!proceed) return false;\n\n const next = this.columns.slice();\n const [moved] = next.splice(fromIndex, 1);\n let insertIndex = next.findIndex((column) => column.key === toKey);\n if (insertIndex < 0) return false;\n if (position === 'after') insertIndex += 1;\n next.splice(insertIndex, 0, moved);\n\n if (next.every((column, index) => column === this.columns[index])) return false;\n\n this.columns = next;\n await this.updateComplete;\n const resolvedIndex = this.columns.findIndex((column) => column.key === fromKey);\n this.emitEvent('columnMoved', {\n detail: { key: fromKey, fromIndex, toIndex: resolvedIndex },\n });\n return true;\n }\n\n @eventOptions({ capture: true })\n protected bodyClickHandler(event: MouseEvent) {\n const target = event.composedPath().find((el) => el instanceof ApexGridCell) as ApexGridCell<T>;\n if (target) {\n this.stateController.active = {\n column: target.column.key,\n row: target.row.index,\n };\n }\n }\n\n protected bodyKeydownHandler(event: KeyboardEvent) {\n if (this.scrollContainer.isSameNode(event.target as HTMLElement)) {\n this.stateController.navigation.navigate(event);\n }\n }\n\n protected renderHeaderRow() {\n return html`\n <apex-grid-header-row\n style=${styleMap(this.DOM.columnSizes)}\n .columns=${this.DOM.displayColumns}\n .pinOffsets=${this.DOM.pinOffsets}\n ></apex-grid-header-row>\n `;\n }\n\n protected renderBody() {\n return html`\n <apex-virtualizer\n .items=${this.pageItems as T[]}\n .renderItem=${this.DOM.rowRenderer}\n @click=${this.bodyClickHandler}\n @keydown=${this.bodyKeydownHandler}\n ></apex-virtualizer>\n `;\n }\n\n protected renderFilterRow() {\n return this.columns.some((column) => column.filter)\n ? html`<apex-filter-row style=${styleMap(this.DOM.columnSizes)}></apex-filter-row>`\n : nothing;\n }\n\n protected renderToolbar() {\n // Toolbar is shared by all toolbar-housed features. Render it whenever\n // any one of them is enabled.\n if (!this.showQuickFilter && !this.showExport) return nothing;\n return html`<apex-grid-toolbar\n .value=${this.quickFilter}\n .showQuickFilter=${this.showQuickFilter}\n .showExport=${this.showExport}\n @apex-quick-filter=${(event: CustomEvent<string>) => {\n event.stopPropagation();\n this.setQuickFilter(event.detail);\n }}\n ></apex-grid-toolbar>`;\n }\n\n protected renderPaginator() {\n if (!this.stateController.pagination.enabled) return nothing;\n const options =\n this.pagination?.pageSizeOptions && this.pagination.pageSizeOptions.length > 0\n ? this.pagination.pageSizeOptions\n : [10, 25, 50, 100];\n return html`<apex-grid-paginator .pageSizeOptions=${options}></apex-grid-paginator>`;\n }\n\n /**\n * Renders a visually-hidden polite live region. Status messages set via\n * {@link announce} land here; screen readers will read them aloud without\n * stealing focus. We intentionally keep this in the shadow root so we\n * don't have to coordinate consumer DOM placement.\n */\n protected renderLiveRegion() {\n return html`<div\n part=\"live-region\"\n role=\"status\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n style=\"position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0;\"\n >\n ${this.stateController.announcement}\n </div>`;\n }\n\n protected override render() {\n return html`\n ${this.stateController.resizing.renderIndicator()}\n ${this.renderToolbar()}\n ${this.renderHeaderRow()}\n ${this.renderFilterRow()}\n ${this.renderBody()}\n ${this.renderPaginator()}\n ${this.renderLiveRegion()}\n `;\n }\n\n /**\n * Sets the live region's announcement text. Screen readers configured to\n * read polite live updates will read the new value aloud.\n *\n * @remarks\n * Use this from custom UI affordances (e.g. an \"Apply filter\" button) so\n * the change is announced. Built-in operations (sort / filter / page /\n * select / expand) call this internally already.\n */\n public announce(message: string): void {\n this.stateController.setAnnouncement(message);\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n [ApexGrid.tagName]: ApexGrid<object>;\n }\n}\n"]}
@@ -1306,6 +1306,82 @@
1306
1306
  "kind": "class",
1307
1307
  "description": "Apex grid is a web component for displaying data in a tabular format quick and easy.\n\nOut of the box it provides row virtualization, sort and filter operations (client and server side),\nthe ability to template cells and headers and column hiding.",
1308
1308
  "name": "ApexGrid",
1309
+ "cssProperties": [
1310
+ {
1311
+ "description": "Brand color for selection, focus rings, and accents. Auto-tints from `--ig-primary-500` when igniteui is present.",
1312
+ "name": "--ag-brand"
1313
+ },
1314
+ {
1315
+ "description": "Brand color for hover / pressed states.",
1316
+ "name": "--ag-brand-strong"
1317
+ },
1318
+ {
1319
+ "description": "Grid edge/shadow override. Default is a flat 1px hairline edge; set to `var(--ag-shadow-card)` for the elevated card look, or `none` to remove it.",
1320
+ "name": "--ag-grid-shadow"
1321
+ },
1322
+ {
1323
+ "description": "Grid card background (must be opaque).",
1324
+ "name": "--ag-surface"
1325
+ },
1326
+ {
1327
+ "description": "Alternating row tint.",
1328
+ "name": "--ag-surface-alt"
1329
+ },
1330
+ {
1331
+ "description": "Header background.",
1332
+ "name": "--ag-surface-elevated"
1333
+ },
1334
+ {
1335
+ "description": "Header / structural gridline color.",
1336
+ "name": "--ag-hairline"
1337
+ },
1338
+ {
1339
+ "description": "Row separator color.",
1340
+ "name": "--ag-border"
1341
+ },
1342
+ {
1343
+ "description": "Primary text color.",
1344
+ "name": "--ag-text"
1345
+ },
1346
+ {
1347
+ "description": "Row text color.",
1348
+ "name": "--ag-text-body"
1349
+ },
1350
+ {
1351
+ "description": "Muted text (roles, labels).",
1352
+ "name": "--ag-text-muted"
1353
+ },
1354
+ {
1355
+ "description": "Row hover wash.",
1356
+ "name": "--ag-row-hover"
1357
+ },
1358
+ {
1359
+ "description": "Row height.",
1360
+ "name": "--ag-row-h"
1361
+ },
1362
+ {
1363
+ "description": "Header height.",
1364
+ "name": "--ag-header-h"
1365
+ },
1366
+ {
1367
+ "description": "Outer card corner radius.",
1368
+ "name": "--ag-radius"
1369
+ },
1370
+ {
1371
+ "description": "Grid font family.",
1372
+ "name": "--ag-font"
1373
+ },
1374
+ {
1375
+ "description": "Cell font size.",
1376
+ "name": "--ag-fs-cell"
1377
+ }
1378
+ ],
1379
+ "cssParts": [
1380
+ {
1381
+ "description": "Visually-hidden ARIA live region used for screen-reader announcements.",
1382
+ "name": "live-region"
1383
+ }
1384
+ ],
1309
1385
  "members": [
1310
1386
  {
1311
1387
  "kind": "field",
@@ -2639,6 +2715,22 @@
2639
2715
  "description": "Emitted after a selection-set change has been applied.",
2640
2716
  "name": "rowSelected"
2641
2717
  },
2718
+ {
2719
+ "description": "Cancellable. Emitted before the row-expansion set changes (master-detail).",
2720
+ "name": "rowExpanding"
2721
+ },
2722
+ {
2723
+ "description": "Emitted after a row-expansion change has been applied.",
2724
+ "name": "rowExpanded"
2725
+ },
2726
+ {
2727
+ "description": "Cancellable. Emitted before a tree-row expansion change (tree mode).",
2728
+ "name": "treeRowExpanding"
2729
+ },
2730
+ {
2731
+ "description": "Emitted after a tree-row expansion change has been applied.",
2732
+ "name": "treeRowExpanded"
2733
+ },
2642
2734
  {
2643
2735
  "type": {
2644
2736
  "text": "CustomEvent"
@@ -1 +1 @@
1
- window.searchData = "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";
1
+ window.searchData = "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";
@@ -1,19 +1,19 @@
1
1
  <!DOCTYPE html><html class="default" lang="en" data-base="../"><head><meta charset="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>ApexGrid | apex-grid</title><meta name="description" content="Documentation for apex-grid"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script><script async src="../assets/icons.js" id="tsd-icons-script"></script><script async src="../assets/search.js" id="tsd-search-script"></script><script async src="../assets/navigation.js" id="tsd-nav-script"></script><script async src="../assets/hierarchy.js" id="tsd-hierarchy-script"></script></head><body><script>document.documentElement.dataset.theme = localStorage.getItem("tsd-theme") || "os";document.body.style.display="none";setTimeout(() => window.app?app.showPage():document.body.style.removeProperty("display"),500)</script><header class="tsd-page-toolbar"><div class="tsd-toolbar-contents container"><a href="../index.html" class="title">apex-grid</a><div id="tsd-toolbar-links"></div><button id="tsd-search-trigger" class="tsd-widget" aria-label="Search"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-search"></use></svg></button><dialog id="tsd-search" aria-label="Search"><input role="combobox" id="tsd-search-input" aria-controls="tsd-search-results" aria-autocomplete="list" aria-expanded="true" autocapitalize="off" autocomplete="off" placeholder="Search the docs" maxLength="100"/><ul role="listbox" id="tsd-search-results"></ul><div id="tsd-search-status" aria-live="polite" aria-atomic="true"><div>Preparing search index...</div></div></dialog><a href="#" class="tsd-widget menu" id="tsd-toolbar-menu-trigger" data-toggle="menu" aria-label="Menu"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-menu"></use></svg></a></div></header><div class="container container-main"><div class="col-content"><div class="tsd-page-title"><ul class="tsd-breadcrumb" aria-label="Breadcrumb"><li><a href="" aria-current="page">ApexGrid</a></li></ul><h1>Class ApexGrid&lt;T&gt;</h1></div><section class="tsd-panel tsd-comment"><div class="tsd-comment tsd-typography"><p>Apex grid is a web component for displaying data in a tabular format quick and easy.</p>
2
2
  <p>Out of the box it provides row virtualization, sort and filter operations (client and server side),
3
3
  the ability to template cells and headers and column hiding.</p>
4
- </div><div class="tsd-comment tsd-typography"><div class="tsd-tag-remarks"><h4 class="tsd-anchor-link" id="remarks">Remarks<a href="#remarks" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h4><p>A working, styled grid requires four setup steps:</p>
4
+ </div><div class="tsd-comment tsd-typography"><div class="tsd-tag-remarks"><h4 class="tsd-anchor-link" id="remarks">Remarks<a href="#remarks" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h4><p>A working, styled grid requires three things:</p>
5
5
  <ol>
6
6
  <li>Register the element: <code>import 'apex-grid/define'</code> (or <code>ApexGrid.register()</code>).</li>
7
- <li>Configure an Ignite UI theme + import the matching CSS, e.g.
8
- <code>import { configureTheme } from 'igniteui-webcomponents';</code>
9
- <code>import 'igniteui-webcomponents/themes/light/bootstrap.css';</code>
10
- <code>configureTheme('bootstrap');</code></li>
11
7
  <li>Give the host element a bounded height, e.g. <code>apex-grid { height: 480px }</code> —
12
8
  the virtualizer collapses without one.</li>
13
9
  <li>Do NOT set <code>display</code> on the host — the component declares <code>:host { display: grid }</code>
14
10
  internally and any override breaks the track layout.</li>
15
11
  </ol>
16
- <p>See the README &quot;Getting Started&quot; section for the full example.</p>
12
+ <p>The grid is styled out of the box through <code>--ag-*</code> CSS custom properties —
13
+ there is no theme to import and no <code>configureTheme()</code> call. Override <code>--ag-*</code>
14
+ tokens on the host (or any ancestor) to rebrand; when <code>igniteui-webcomponents</code>
15
+ is present, the brand tokens auto-tint from its palette. See the README
16
+ &quot;Getting Started&quot; and &quot;Theming&quot; sections for the full example and token list.</p>
17
17
  </div><div class="tsd-tag-element"><h4 class="tsd-anchor-link" id="element">Element<a href="#element" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h4><p>apex-grid</p>
18
18
  </div><div class="tsd-tag-fires"><h4 class="tsd-anchor-link" id="fires">Fires<a href="#fires" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h4><p>sorting - Emitted when sorting is initiated through the UI.</p>
19
19
  </div><div class="tsd-tag-fires"><h4 class="tsd-anchor-link" id="fires-1">Fires<a href="#fires-1" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h4><p>sorted - Emitted when a sort operation initiated through the UI has completed.</p>
@@ -33,6 +33,29 @@ internally and any override breaks the track layout.</li>
33
33
  </div><div class="tsd-tag-fires"><h4 class="tsd-anchor-link" id="fires-15">Fires<a href="#fires-15" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h4><p>rowEditEnded - Emitted when a row leaves edit mode (row mode only).</p>
34
34
  </div><div class="tsd-tag-fires"><h4 class="tsd-anchor-link" id="fires-16">Fires<a href="#fires-16" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h4><p>rowSelecting - Cancellable. Emitted before a selection-set change is applied.</p>
35
35
  </div><div class="tsd-tag-fires"><h4 class="tsd-anchor-link" id="fires-17">Fires<a href="#fires-17" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h4><p>rowSelected - Emitted after a selection-set change has been applied.</p>
36
+ </div><div class="tsd-tag-fires"><h4 class="tsd-anchor-link" id="fires-18">Fires<a href="#fires-18" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h4><p>rowExpanding - Cancellable. Emitted before the row-expansion set changes (master-detail).</p>
37
+ </div><div class="tsd-tag-fires"><h4 class="tsd-anchor-link" id="fires-19">Fires<a href="#fires-19" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h4><p>rowExpanded - Emitted after a row-expansion change has been applied.</p>
38
+ </div><div class="tsd-tag-fires"><h4 class="tsd-anchor-link" id="fires-20">Fires<a href="#fires-20" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h4><p>treeRowExpanding - Cancellable. Emitted before a tree-row expansion change (tree mode).</p>
39
+ </div><div class="tsd-tag-fires"><h4 class="tsd-anchor-link" id="fires-21">Fires<a href="#fires-21" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h4><p>treeRowExpanded - Emitted after a tree-row expansion change has been applied.</p>
40
+ </div><div class="tsd-tag-csspart"><h4 class="tsd-anchor-link" id="csspart">Csspart<a href="#csspart" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h4><p>live-region - Visually-hidden ARIA live region used for screen-reader announcements.</p>
41
+ </div><div class="tsd-tag-cssprop"><h4 class="tsd-anchor-link" id="cssprop">Cssprop<a href="#cssprop" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h4><p>[--ag-brand] - Brand color for selection, focus rings, and accents. Auto-tints from <code>--ig-primary-500</code> when igniteui is present.</p>
42
+ </div><div class="tsd-tag-cssprop"><h4 class="tsd-anchor-link" id="cssprop-1">Cssprop<a href="#cssprop-1" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h4><p>[--ag-brand-strong] - Brand color for hover / pressed states.</p>
43
+ </div><div class="tsd-tag-cssprop"><h4 class="tsd-anchor-link" id="cssprop-2">Cssprop<a href="#cssprop-2" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h4><p>[--ag-grid-shadow] - Grid edge/shadow override. Default is a flat 1px hairline edge; set to <code>var(--ag-shadow-card)</code> for the elevated card look, or <code>none</code> to remove it.</p>
44
+ </div><div class="tsd-tag-cssprop"><h4 class="tsd-anchor-link" id="cssprop-3">Cssprop<a href="#cssprop-3" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h4><p>[--ag-surface] - Grid card background (must be opaque).</p>
45
+ </div><div class="tsd-tag-cssprop"><h4 class="tsd-anchor-link" id="cssprop-4">Cssprop<a href="#cssprop-4" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h4><p>[--ag-surface-alt] - Alternating row tint.</p>
46
+ </div><div class="tsd-tag-cssprop"><h4 class="tsd-anchor-link" id="cssprop-5">Cssprop<a href="#cssprop-5" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h4><p>[--ag-surface-elevated] - Header background.</p>
47
+ </div><div class="tsd-tag-cssprop"><h4 class="tsd-anchor-link" id="cssprop-6">Cssprop<a href="#cssprop-6" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h4><p>[--ag-hairline] - Header / structural gridline color.</p>
48
+ </div><div class="tsd-tag-cssprop"><h4 class="tsd-anchor-link" id="cssprop-7">Cssprop<a href="#cssprop-7" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h4><p>[--ag-border] - Row separator color.</p>
49
+ </div><div class="tsd-tag-cssprop"><h4 class="tsd-anchor-link" id="cssprop-8">Cssprop<a href="#cssprop-8" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h4><p>[--ag-text] - Primary text color.</p>
50
+ </div><div class="tsd-tag-cssprop"><h4 class="tsd-anchor-link" id="cssprop-9">Cssprop<a href="#cssprop-9" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h4><p>[--ag-text-body] - Row text color.</p>
51
+ </div><div class="tsd-tag-cssprop"><h4 class="tsd-anchor-link" id="cssprop-10">Cssprop<a href="#cssprop-10" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h4><p>[--ag-text-muted] - Muted text (roles, labels).</p>
52
+ </div><div class="tsd-tag-cssprop"><h4 class="tsd-anchor-link" id="cssprop-11">Cssprop<a href="#cssprop-11" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h4><p>[--ag-row-hover] - Row hover wash.</p>
53
+ </div><div class="tsd-tag-cssprop"><h4 class="tsd-anchor-link" id="cssprop-12">Cssprop<a href="#cssprop-12" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h4><p>[--ag-row-h] - Row height.</p>
54
+ </div><div class="tsd-tag-cssprop"><h4 class="tsd-anchor-link" id="cssprop-13">Cssprop<a href="#cssprop-13" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h4><p>[--ag-header-h] - Header height.</p>
55
+ </div><div class="tsd-tag-cssprop"><h4 class="tsd-anchor-link" id="cssprop-14">Cssprop<a href="#cssprop-14" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h4><p>[--ag-radius] - Outer card corner radius.</p>
56
+ </div><div class="tsd-tag-cssprop"><h4 class="tsd-anchor-link" id="cssprop-15">Cssprop<a href="#cssprop-15" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h4><p>[--ag-font] - Grid font family.</p>
57
+ </div><div class="tsd-tag-cssprop"><h4 class="tsd-anchor-link" id="cssprop-16">Cssprop<a href="#cssprop-16" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h4><p>[--ag-fs-cell] - Cell font size.</p>
58
+ </div><div class="tsd-tag-see"><h4 class="tsd-anchor-link" id="see">See<a href="#see" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h4><p><a href="https://github.com/apexcharts/apex-grid/blob/main/packages/core/src/styles/_tokens.scss">_tokens.scss</a> for the complete <code>--ag-*</code> token list.</p>
36
59
  </div></div></section><section class="tsd-panel"><h4>Type Parameters</h4><ul class="tsd-type-parameter-list"><li><span id="t"><span class="tsd-kind-type-parameter">T</span> <span class="tsd-signature-keyword">extends</span> <span class="tsd-signature-type">object</span></span></li></ul></section><section class="tsd-panel tsd-hierarchy" data-refl="121"><h4>Hierarchy</h4><ul class="tsd-hierarchy"><li class="tsd-hierarchy-item"><span class="tsd-signature-type">EventEmitterBase</span><span class="tsd-signature-symbol">&lt;</span><a href="../interfaces/ApexGridEventMap.html" class="tsd-signature-type tsd-kind-interface">ApexGridEventMap</a><span class="tsd-signature-symbol">&lt;</span><a class="tsd-signature-type tsd-kind-type-parameter" href="#t">T</a><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">&gt;</span><ul class="tsd-hierarchy"><li class="tsd-hierarchy-item"><span class="tsd-hierarchy-target">ApexGrid</span></li></ul></li></ul></section><section class="tsd-panel-group tsd-index-group"><section class="tsd-panel tsd-index-panel"><details class="tsd-index-content tsd-accordion" open><summary class="tsd-accordion-summary tsd-index-summary"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-chevronDown"></use></svg><h5 class="tsd-index-heading uppercase">Index</h5></summary><div class="tsd-accordion-details"><section class="tsd-index-section"><h3 class="tsd-index-heading">Other</h3><div class="tsd-index-list"><a href="#autogenerate" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>auto<wbr/>Generate</span></a>
37
60
  <a href="#columnreordering" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>column<wbr/>Reordering</span></a>
38
61
  <a href="#columns" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>columns</span></a>
package/docs/index.html CHANGED
@@ -60,6 +60,10 @@
60
60
  </code><button type="button">Copy</button></pre>
61
61
 
62
62
  <p>See <a href="media/_tokens.scss"><code>src/styles/_tokens.scss</code></a> for the full token list (brand, surfaces, text, semantic state colors, typography, spacing, motion).</p>
63
+ <p><strong>Grid edge / shadow.</strong> By default the grid shows a flat 1px hairline edge (no drop shadow). Control it with the <code>--ag-grid-shadow</code> hook — this is an opt-in override, not one of the <code>_tokens.scss</code> defaults:</p>
64
+ <pre><code class="css"><span class="hl-10">apex-grid</span><span class="hl-1"> { </span><span class="hl-12">--ag-grid-shadow</span><span class="hl-1">: </span><span class="hl-4">var</span><span class="hl-1">(</span><span class="hl-12">--ag-shadow-card</span><span class="hl-1">); } </span><span class="hl-15">/* elevated floating-card look */</span><br/><span class="hl-10">apex-grid</span><span class="hl-1"> { </span><span class="hl-12">--ag-grid-shadow</span><span class="hl-1">: </span><span class="hl-14">none</span><span class="hl-1">; } </span><span class="hl-15">/* remove the edge entirely */</span>
65
+ </code><button type="button">Copy</button></pre>
66
+
63
67
  <p>If you embed the grid alongside <code>igniteui-webcomponents</code>, the brand tokens automatically re-tint from the igniteui palette (<code>--ig-primary-500</code>) — no configuration needed.</p>
64
68
  <h3 id="4-size-the-host" class="tsd-anchor-link">4. Size the host<a href="#4-size-the-host" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="assets/icons.svg#icon-anchor"></use></svg></a></h3>
65
69
  <p><code>@lit-labs/virtualizer</code> requires a <strong>bounded height</strong>. Without one, the virtualizer collapses to its natural content height (~150px) and only a few rows ever render.</p>
@@ -1,5 +1,5 @@
1
1
  <!DOCTYPE html><html class="default" lang="en" data-base="../"><head><meta charset="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>ApexGridEventMap | apex-grid</title><meta name="description" content="Documentation for apex-grid"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script><script async src="../assets/icons.js" id="tsd-icons-script"></script><script async src="../assets/search.js" id="tsd-search-script"></script><script async src="../assets/navigation.js" id="tsd-nav-script"></script><script async src="../assets/hierarchy.js" id="tsd-hierarchy-script"></script></head><body><script>document.documentElement.dataset.theme = localStorage.getItem("tsd-theme") || "os";document.body.style.display="none";setTimeout(() => window.app?app.showPage():document.body.style.removeProperty("display"),500)</script><header class="tsd-page-toolbar"><div class="tsd-toolbar-contents container"><a href="../index.html" class="title">apex-grid</a><div id="tsd-toolbar-links"></div><button id="tsd-search-trigger" class="tsd-widget" aria-label="Search"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-search"></use></svg></button><dialog id="tsd-search" aria-label="Search"><input role="combobox" id="tsd-search-input" aria-controls="tsd-search-results" aria-autocomplete="list" aria-expanded="true" autocapitalize="off" autocomplete="off" placeholder="Search the docs" maxLength="100"/><ul role="listbox" id="tsd-search-results"></ul><div id="tsd-search-status" aria-live="polite" aria-atomic="true"><div>Preparing search index...</div></div></dialog><a href="#" class="tsd-widget menu" id="tsd-toolbar-menu-trigger" data-toggle="menu" aria-label="Menu"><svg width="16" height="16" viewBox="0 0 16 16" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-menu"></use></svg></a></div></header><div class="container container-main"><div class="col-content"><div class="tsd-page-title"><ul class="tsd-breadcrumb" aria-label="Breadcrumb"><li><a href="" aria-current="page">ApexGridEventMap</a></li></ul><h1>Interface ApexGridEventMap&lt;T&gt;</h1></div><section class="tsd-panel tsd-comment"><div class="tsd-comment tsd-typography"><p>Events for the apex-grid.</p>
2
- </div></section><div class="tsd-signature"><span class="tsd-signature-keyword">interface</span> <span class="tsd-kind-interface">ApexGridEventMap</span><span class="tsd-signature-symbol">&lt;</span><a class="tsd-signature-type tsd-kind-type-parameter" href="#t">T</a> <span class="tsd-signature-keyword">extends</span> <span class="tsd-signature-type">object</span><span class="tsd-signature-symbol">&gt;</span> <span class="tsd-signature-symbol">{</span><br/>    <a class="tsd-kind-property" href="#cellvaluechanged">cellValueChanged</a><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">CustomEvent</span><span class="tsd-signature-symbol">&lt;</span><a href="ApexCellValueChangedEvent.html" class="tsd-signature-type tsd-kind-interface">ApexCellValueChangedEvent</a><span class="tsd-signature-symbol">&lt;</span><a class="tsd-signature-type tsd-kind-type-parameter" href="#t">T</a><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">;</span><br/>    <a class="tsd-kind-property" href="#cellvaluechanging">cellValueChanging</a><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">CustomEvent</span><span class="tsd-signature-symbol">&lt;</span><a href="ApexCellValueChangingEvent.html" class="tsd-signature-type tsd-kind-interface">ApexCellValueChangingEvent</a><span class="tsd-signature-symbol">&lt;</span><a class="tsd-signature-type tsd-kind-type-parameter" href="#t">T</a><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">;</span><br/>    <a class="tsd-kind-property" href="#columnmoved">columnMoved</a><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">CustomEvent</span><span class="tsd-signature-symbol">&lt;</span><a href="ApexColumnMovedEvent.html" class="tsd-signature-type tsd-kind-interface">ApexColumnMovedEvent</a><span class="tsd-signature-symbol">&lt;</span><a class="tsd-signature-type tsd-kind-type-parameter" href="#t">T</a><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">;</span><br/>    <a class="tsd-kind-property" href="#columnmoving">columnMoving</a><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">CustomEvent</span><span class="tsd-signature-symbol">&lt;</span><a href="ApexColumnMovingEvent.html" class="tsd-signature-type tsd-kind-interface">ApexColumnMovingEvent</a><span class="tsd-signature-symbol">&lt;</span><a class="tsd-signature-type tsd-kind-type-parameter" href="#t">T</a><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">;</span><br/>    <a class="tsd-kind-property" href="#columnpinned">columnPinned</a><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">CustomEvent</span><span class="tsd-signature-symbol">&lt;</span><a href="ApexColumnPinnedEvent.html" class="tsd-signature-type tsd-kind-interface">ApexColumnPinnedEvent</a><span class="tsd-signature-symbol">&lt;</span><a class="tsd-signature-type tsd-kind-type-parameter" href="#t">T</a><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">;</span><br/>    <a class="tsd-kind-property" href="#columnpinning">columnPinning</a><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">CustomEvent</span><span class="tsd-signature-symbol">&lt;</span><a href="ApexColumnPinningEvent.html" class="tsd-signature-type tsd-kind-interface">ApexColumnPinningEvent</a><span class="tsd-signature-symbol">&lt;</span><a class="tsd-signature-type tsd-kind-type-parameter" href="#t">T</a><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">;</span><br/>    <a class="tsd-kind-property" href="#filtered">filtered</a><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">CustomEvent</span><span class="tsd-signature-symbol">&lt;</span><a href="ApexFilteredEvent.html" class="tsd-signature-type tsd-kind-interface">ApexFilteredEvent</a><span class="tsd-signature-symbol">&lt;</span><a class="tsd-signature-type tsd-kind-type-parameter" href="#t">T</a><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">;</span><br/>    <a class="tsd-kind-property" href="#filtering">filtering</a><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">CustomEvent</span><span class="tsd-signature-symbol">&lt;</span><a href="ApexFilteringEvent.html" class="tsd-signature-type tsd-kind-interface">ApexFilteringEvent</a><span class="tsd-signature-symbol">&lt;</span><a class="tsd-signature-type tsd-kind-type-parameter" href="#t">T</a><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">;</span><br/>    <a class="tsd-kind-property" href="#pagechanged">pageChanged</a><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">CustomEvent</span><span class="tsd-signature-symbol">&lt;</span><a href="ApexPageChangedEvent.html" class="tsd-signature-type tsd-kind-interface">ApexPageChangedEvent</a><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">;</span><br/>    <a class="tsd-kind-property" href="#pagechanging">pageChanging</a><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">CustomEvent</span><span class="tsd-signature-symbol">&lt;</span><a href="ApexPageChangingEvent.html" class="tsd-signature-type tsd-kind-interface">ApexPageChangingEvent</a><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">;</span><br/>    <a class="tsd-kind-property" href="#quickfilterchanged">quickFilterChanged</a><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">CustomEvent</span><span class="tsd-signature-symbol">&lt;</span><a href="ApexQuickFilterChangedEvent.html" class="tsd-signature-type tsd-kind-interface">ApexQuickFilterChangedEvent</a><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">;</span><br/>    <a class="tsd-kind-property" href="#quickfilterchanging">quickFilterChanging</a><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">CustomEvent</span><span class="tsd-signature-symbol">&lt;</span><a href="ApexQuickFilterChangingEvent.html" class="tsd-signature-type tsd-kind-interface">ApexQuickFilterChangingEvent</a><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">;</span><br/>    <a class="tsd-kind-property" href="#roweditended">rowEditEnded</a><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">CustomEvent</span><span class="tsd-signature-symbol">&lt;</span><a href="ApexRowEditEndedEvent.html" class="tsd-signature-type tsd-kind-interface">ApexRowEditEndedEvent</a><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">;</span><br/>    <a class="tsd-kind-property" href="#roweditstarted">rowEditStarted</a><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">CustomEvent</span><span class="tsd-signature-symbol">&lt;</span><a href="ApexRowEditStartedEvent.html" class="tsd-signature-type tsd-kind-interface">ApexRowEditStartedEvent</a><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">;</span><br/>    <a class="tsd-kind-property" href="#rowexpanded">rowExpanded</a><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">CustomEvent</span><span class="tsd-signature-symbol">&lt;</span><a href="ApexRowExpandedEvent.html" class="tsd-signature-type tsd-kind-interface">ApexRowExpandedEvent</a><span class="tsd-signature-symbol">&lt;</span><a class="tsd-signature-type tsd-kind-type-parameter" href="#t">T</a><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">;</span><br/>    <a class="tsd-kind-property" href="#rowexpanding">rowExpanding</a><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">CustomEvent</span><span class="tsd-signature-symbol">&lt;</span><a href="ApexRowExpandingEvent.html" class="tsd-signature-type tsd-kind-interface">ApexRowExpandingEvent</a><span class="tsd-signature-symbol">&lt;</span><a class="tsd-signature-type tsd-kind-type-parameter" href="#t">T</a><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">;</span><br/>    <a class="tsd-kind-property" href="#rowselected">rowSelected</a><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">CustomEvent</span><span class="tsd-signature-symbol">&lt;</span><a href="ApexRowSelectedEvent.html" class="tsd-signature-type tsd-kind-interface">ApexRowSelectedEvent</a><span class="tsd-signature-symbol">&lt;</span><a class="tsd-signature-type tsd-kind-type-parameter" href="#t">T</a><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">;</span><br/>    <a class="tsd-kind-property" href="#sorted">sorted</a><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">CustomEvent</span><span class="tsd-signature-symbol">&lt;</span><a href="../types/SortExpression.html" class="tsd-signature-type tsd-kind-type-alias">SortExpression</a><span class="tsd-signature-symbol">&lt;</span><a class="tsd-signature-type tsd-kind-type-parameter" href="#t">T</a><span class="tsd-signature-symbol">,</span> <span class="tsd-signature-keyword">keyof</span> <a class="tsd-signature-type tsd-kind-type-parameter" href="#t">T</a><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">;</span><br/>    <a class="tsd-kind-property" href="#sorting">sorting</a><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">CustomEvent</span><span class="tsd-signature-symbol">&lt;</span><a href="../types/SortExpression.html" class="tsd-signature-type tsd-kind-type-alias">SortExpression</a><span class="tsd-signature-symbol">&lt;</span><a class="tsd-signature-type tsd-kind-type-parameter" href="#t">T</a><span class="tsd-signature-symbol">,</span> <span class="tsd-signature-keyword">keyof</span> <a class="tsd-signature-type tsd-kind-type-parameter" href="#t">T</a><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">;</span><br/>    <a class="tsd-kind-property" href="#treerowexpanded">treeRowExpanded</a><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">CustomEvent</span><span class="tsd-signature-symbol">&lt;</span><a href="ApexTreeRowExpandedEvent.html" class="tsd-signature-type tsd-kind-interface">ApexTreeRowExpandedEvent</a><span class="tsd-signature-symbol">&lt;</span><a class="tsd-signature-type tsd-kind-type-parameter" href="#t">T</a><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">;</span><br/>    <a class="tsd-kind-property" href="#treerowexpanding">treeRowExpanding</a><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">CustomEvent</span><span class="tsd-signature-symbol">&lt;</span><a href="ApexTreeRowExpandingEvent.html" class="tsd-signature-type tsd-kind-interface">ApexTreeRowExpandingEvent</a><span class="tsd-signature-symbol">&lt;</span><a class="tsd-signature-type tsd-kind-type-parameter" href="#t">T</a><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">;</span><br/><span class="tsd-signature-symbol">}</span></div><section class="tsd-panel"><h4>Type Parameters</h4><ul class="tsd-type-parameter-list"><li><span id="t"><span class="tsd-kind-type-parameter">T</span> <span class="tsd-signature-keyword">extends</span> <span class="tsd-signature-type">object</span></span></li></ul></section><section class="tsd-panel-group tsd-index-group"><section class="tsd-panel tsd-index-panel"><details class="tsd-index-content tsd-accordion" open><summary class="tsd-accordion-summary tsd-index-summary"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-chevronDown"></use></svg><h5 class="tsd-index-heading uppercase">Index</h5></summary><div class="tsd-accordion-details"><section class="tsd-index-section"><h3 class="tsd-index-heading">Events</h3><div class="tsd-index-list"><a href="#cellvaluechanged" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>cell<wbr/>Value<wbr/>Changed</span></a>
2
+ </div></section><div class="tsd-signature"><span class="tsd-signature-keyword">interface</span> <span class="tsd-kind-interface">ApexGridEventMap</span><span class="tsd-signature-symbol">&lt;</span><a class="tsd-signature-type tsd-kind-type-parameter" href="#t">T</a> <span class="tsd-signature-keyword">extends</span> <span class="tsd-signature-type">object</span><span class="tsd-signature-symbol">&gt;</span> <span class="tsd-signature-symbol">{</span><br/>    <a class="tsd-kind-property" href="#cellvaluechanged">cellValueChanged</a><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">CustomEvent</span><span class="tsd-signature-symbol">&lt;</span><a href="ApexCellValueChangedEvent.html" class="tsd-signature-type tsd-kind-interface">ApexCellValueChangedEvent</a><span class="tsd-signature-symbol">&lt;</span><a class="tsd-signature-type tsd-kind-type-parameter" href="#t">T</a><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">;</span><br/>    <a class="tsd-kind-property" href="#cellvaluechanging">cellValueChanging</a><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">CustomEvent</span><span class="tsd-signature-symbol">&lt;</span><a href="ApexCellValueChangingEvent.html" class="tsd-signature-type tsd-kind-interface">ApexCellValueChangingEvent</a><span class="tsd-signature-symbol">&lt;</span><a class="tsd-signature-type tsd-kind-type-parameter" href="#t">T</a><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">;</span><br/>    <a class="tsd-kind-property" href="#columnmoved">columnMoved</a><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">CustomEvent</span><span class="tsd-signature-symbol">&lt;</span><a href="ApexColumnMovedEvent.html" class="tsd-signature-type tsd-kind-interface">ApexColumnMovedEvent</a><span class="tsd-signature-symbol">&lt;</span><a class="tsd-signature-type tsd-kind-type-parameter" href="#t">T</a><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">;</span><br/>    <a class="tsd-kind-property" href="#columnmoving">columnMoving</a><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">CustomEvent</span><span class="tsd-signature-symbol">&lt;</span><a href="ApexColumnMovingEvent.html" class="tsd-signature-type tsd-kind-interface">ApexColumnMovingEvent</a><span class="tsd-signature-symbol">&lt;</span><a class="tsd-signature-type tsd-kind-type-parameter" href="#t">T</a><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">;</span><br/>    <a class="tsd-kind-property" href="#columnpinned">columnPinned</a><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">CustomEvent</span><span class="tsd-signature-symbol">&lt;</span><a href="ApexColumnPinnedEvent.html" class="tsd-signature-type tsd-kind-interface">ApexColumnPinnedEvent</a><span class="tsd-signature-symbol">&lt;</span><a class="tsd-signature-type tsd-kind-type-parameter" href="#t">T</a><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">;</span><br/>    <a class="tsd-kind-property" href="#columnpinning">columnPinning</a><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">CustomEvent</span><span class="tsd-signature-symbol">&lt;</span><a href="ApexColumnPinningEvent.html" class="tsd-signature-type tsd-kind-interface">ApexColumnPinningEvent</a><span class="tsd-signature-symbol">&lt;</span><a class="tsd-signature-type tsd-kind-type-parameter" href="#t">T</a><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">;</span><br/>    <a class="tsd-kind-property" href="#filtered">filtered</a><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">CustomEvent</span><span class="tsd-signature-symbol">&lt;</span><a href="ApexFilteredEvent.html" class="tsd-signature-type tsd-kind-interface">ApexFilteredEvent</a><span class="tsd-signature-symbol">&lt;</span><a class="tsd-signature-type tsd-kind-type-parameter" href="#t">T</a><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">;</span><br/>    <a class="tsd-kind-property" href="#filtering">filtering</a><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">CustomEvent</span><span class="tsd-signature-symbol">&lt;</span><a href="ApexFilteringEvent.html" class="tsd-signature-type tsd-kind-interface">ApexFilteringEvent</a><span class="tsd-signature-symbol">&lt;</span><a class="tsd-signature-type tsd-kind-type-parameter" href="#t">T</a><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">;</span><br/>    <a class="tsd-kind-property" href="#pagechanged">pageChanged</a><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">CustomEvent</span><span class="tsd-signature-symbol">&lt;</span><a href="ApexPageChangedEvent.html" class="tsd-signature-type tsd-kind-interface">ApexPageChangedEvent</a><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">;</span><br/>    <a class="tsd-kind-property" href="#pagechanging">pageChanging</a><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">CustomEvent</span><span class="tsd-signature-symbol">&lt;</span><a href="ApexPageChangingEvent.html" class="tsd-signature-type tsd-kind-interface">ApexPageChangingEvent</a><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">;</span><br/>    <a class="tsd-kind-property" href="#quickfilterchanged">quickFilterChanged</a><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">CustomEvent</span><span class="tsd-signature-symbol">&lt;</span><a href="ApexQuickFilterChangedEvent.html" class="tsd-signature-type tsd-kind-interface">ApexQuickFilterChangedEvent</a><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">;</span><br/>    <a class="tsd-kind-property" href="#quickfilterchanging">quickFilterChanging</a><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">CustomEvent</span><span class="tsd-signature-symbol">&lt;</span><a href="ApexQuickFilterChangingEvent.html" class="tsd-signature-type tsd-kind-interface">ApexQuickFilterChangingEvent</a><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">;</span><br/>    <a class="tsd-kind-property" href="#roweditended">rowEditEnded</a><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">CustomEvent</span><span class="tsd-signature-symbol">&lt;</span><a href="ApexRowEditEndedEvent.html" class="tsd-signature-type tsd-kind-interface">ApexRowEditEndedEvent</a><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">;</span><br/>    <a class="tsd-kind-property" href="#roweditstarted">rowEditStarted</a><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">CustomEvent</span><span class="tsd-signature-symbol">&lt;</span><a href="ApexRowEditStartedEvent.html" class="tsd-signature-type tsd-kind-interface">ApexRowEditStartedEvent</a><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">;</span><br/>    <a class="tsd-kind-property" href="#rowexpanded">rowExpanded</a><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">CustomEvent</span><span class="tsd-signature-symbol">&lt;</span><a href="ApexRowExpandedEvent.html" class="tsd-signature-type tsd-kind-interface">ApexRowExpandedEvent</a><span class="tsd-signature-symbol">&lt;</span><a class="tsd-signature-type tsd-kind-type-parameter" href="#t">T</a><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">;</span><br/>    <a class="tsd-kind-property" href="#rowexpanding">rowExpanding</a><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">CustomEvent</span><span class="tsd-signature-symbol">&lt;</span><a href="ApexRowExpandingEvent.html" class="tsd-signature-type tsd-kind-interface">ApexRowExpandingEvent</a><span class="tsd-signature-symbol">&lt;</span><a class="tsd-signature-type tsd-kind-type-parameter" href="#t">T</a><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">;</span><br/>    <a class="tsd-kind-property" href="#rowselected">rowSelected</a><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">CustomEvent</span><span class="tsd-signature-symbol">&lt;</span><a href="ApexRowSelectedEvent.html" class="tsd-signature-type tsd-kind-interface">ApexRowSelectedEvent</a><span class="tsd-signature-symbol">&lt;</span><a class="tsd-signature-type tsd-kind-type-parameter" href="#t">T</a><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">;</span><br/>    <a class="tsd-kind-property" href="#rowselecting">rowSelecting</a><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">CustomEvent</span><span class="tsd-signature-symbol">&lt;</span><a href="ApexRowSelectingEvent.html" class="tsd-signature-type tsd-kind-interface">ApexRowSelectingEvent</a><span class="tsd-signature-symbol">&lt;</span><a class="tsd-signature-type tsd-kind-type-parameter" href="#t">T</a><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">;</span><br/>    <a class="tsd-kind-property" href="#sorted">sorted</a><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">CustomEvent</span><span class="tsd-signature-symbol">&lt;</span><a href="../types/SortExpression.html" class="tsd-signature-type tsd-kind-type-alias">SortExpression</a><span class="tsd-signature-symbol">&lt;</span><a class="tsd-signature-type tsd-kind-type-parameter" href="#t">T</a><span class="tsd-signature-symbol">,</span> <span class="tsd-signature-keyword">keyof</span> <a class="tsd-signature-type tsd-kind-type-parameter" href="#t">T</a><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">;</span><br/>    <a class="tsd-kind-property" href="#sorting">sorting</a><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">CustomEvent</span><span class="tsd-signature-symbol">&lt;</span><a href="../types/SortExpression.html" class="tsd-signature-type tsd-kind-type-alias">SortExpression</a><span class="tsd-signature-symbol">&lt;</span><a class="tsd-signature-type tsd-kind-type-parameter" href="#t">T</a><span class="tsd-signature-symbol">,</span> <span class="tsd-signature-keyword">keyof</span> <a class="tsd-signature-type tsd-kind-type-parameter" href="#t">T</a><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">;</span><br/>    <a class="tsd-kind-property" href="#treerowexpanded">treeRowExpanded</a><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">CustomEvent</span><span class="tsd-signature-symbol">&lt;</span><a href="ApexTreeRowExpandedEvent.html" class="tsd-signature-type tsd-kind-interface">ApexTreeRowExpandedEvent</a><span class="tsd-signature-symbol">&lt;</span><a class="tsd-signature-type tsd-kind-type-parameter" href="#t">T</a><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">;</span><br/>    <a class="tsd-kind-property" href="#treerowexpanding">treeRowExpanding</a><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">CustomEvent</span><span class="tsd-signature-symbol">&lt;</span><a href="ApexTreeRowExpandingEvent.html" class="tsd-signature-type tsd-kind-interface">ApexTreeRowExpandingEvent</a><span class="tsd-signature-symbol">&lt;</span><a class="tsd-signature-type tsd-kind-type-parameter" href="#t">T</a><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">;</span><br/><span class="tsd-signature-symbol">}</span></div><section class="tsd-panel"><h4>Type Parameters</h4><ul class="tsd-type-parameter-list"><li><span id="t"><span class="tsd-kind-type-parameter">T</span> <span class="tsd-signature-keyword">extends</span> <span class="tsd-signature-type">object</span></span></li></ul></section><section class="tsd-panel-group tsd-index-group"><section class="tsd-panel tsd-index-panel"><details class="tsd-index-content tsd-accordion" open><summary class="tsd-accordion-summary tsd-index-summary"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-chevronDown"></use></svg><h5 class="tsd-index-heading uppercase">Index</h5></summary><div class="tsd-accordion-details"><section class="tsd-index-section"><h3 class="tsd-index-heading">Events</h3><div class="tsd-index-list"><a href="#cellvaluechanged" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>cell<wbr/>Value<wbr/>Changed</span></a>
3
3
  <a href="#cellvaluechanging" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>cell<wbr/>Value<wbr/>Changing</span></a>
4
4
  <a href="#columnmoved" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>column<wbr/>Moved</span></a>
5
5
  <a href="#columnmoving" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>column<wbr/>Moving</span></a>
@@ -16,6 +16,7 @@
16
16
  <a href="#rowexpanded" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>row<wbr/>Expanded</span></a>
17
17
  <a href="#rowexpanding" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>row<wbr/>Expanding</span></a>
18
18
  <a href="#rowselected" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>row<wbr/>Selected</span></a>
19
+ <a href="#rowselecting" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>row<wbr/>Selecting</span></a>
19
20
  <a href="#sorted" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>sorted</span></a>
20
21
  <a href="#sorting" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>sorting</span></a>
21
22
  <a href="#treerowexpanded" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>tree<wbr/>Row<wbr/>Expanded</span></a>
@@ -54,15 +55,19 @@ pending edits were applied (row edit mode only).</p>
54
55
  every expansion-mutating call (toggle, expand-all, programmatic
55
56
  <code>expandedRows = ...</code>).</p>
56
57
  </div></div></section><section class="tsd-panel tsd-member"><h3 class="tsd-anchor-link" id="rowselected"><span>row<wbr/>Selected</span><a href="#rowselected" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h3><div class="tsd-signature"><span class="tsd-kind-property">rowSelected</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">CustomEvent</span><span class="tsd-signature-symbol">&lt;</span><a href="ApexRowSelectedEvent.html" class="tsd-signature-type tsd-kind-interface">ApexRowSelectedEvent</a><span class="tsd-signature-symbol">&lt;</span><a class="tsd-signature-type tsd-kind-type-parameter" href="#t">T</a><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">&gt;</span></div><div class="tsd-comment tsd-typography"><p>Emitted after a row-selection change has been applied.</p>
57
- </div></section><section class="tsd-panel tsd-member"><h3 class="tsd-anchor-link" id="sorted"><span>sorted</span><a href="#sorted" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h3><div class="tsd-signature"><span class="tsd-kind-property">sorted</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">CustomEvent</span><span class="tsd-signature-symbol">&lt;</span><a href="../types/SortExpression.html" class="tsd-signature-type tsd-kind-type-alias">SortExpression</a><span class="tsd-signature-symbol">&lt;</span><a class="tsd-signature-type tsd-kind-type-parameter" href="#t">T</a><span class="tsd-signature-symbol">,</span> <span class="tsd-signature-keyword">keyof</span> <a class="tsd-signature-type tsd-kind-type-parameter" href="#t">T</a><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">&gt;</span></div><div class="tsd-comment tsd-typography"><p>Emitted when a sort operation initiated through the UI has completed.
58
+ </div></section><section class="tsd-panel tsd-member"><h3 class="tsd-anchor-link" id="rowselecting"><span>row<wbr/>Selecting</span><a href="#rowselecting" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h3><div class="tsd-signature"><span class="tsd-kind-property">rowSelecting</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">CustomEvent</span><span class="tsd-signature-symbol">&lt;</span><a href="ApexRowSelectingEvent.html" class="tsd-signature-type tsd-kind-interface">ApexRowSelectingEvent</a><span class="tsd-signature-symbol">&lt;</span><a class="tsd-signature-type tsd-kind-type-parameter" href="#t">T</a><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">&gt;</span></div><div class="tsd-comment tsd-typography"><p>Emitted before the row selection set changes.</p>
59
+ </div><div class="tsd-comment tsd-typography"><div class="tsd-tag-remarks"><h4 class="tsd-anchor-link" id="remarks-7">Remarks<a href="#remarks-7" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h4><p>Cancellable — calling <code>preventDefault()</code> aborts the selection change.
60
+ Fires for every selection-mutating call (toggle, range select, select-all,
61
+ programmatic <code>selectedRows = ...</code>).</p>
62
+ </div></div></section><section class="tsd-panel tsd-member"><h3 class="tsd-anchor-link" id="sorted"><span>sorted</span><a href="#sorted" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h3><div class="tsd-signature"><span class="tsd-kind-property">sorted</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">CustomEvent</span><span class="tsd-signature-symbol">&lt;</span><a href="../types/SortExpression.html" class="tsd-signature-type tsd-kind-type-alias">SortExpression</a><span class="tsd-signature-symbol">&lt;</span><a class="tsd-signature-type tsd-kind-type-parameter" href="#t">T</a><span class="tsd-signature-symbol">,</span> <span class="tsd-signature-keyword">keyof</span> <a class="tsd-signature-type tsd-kind-type-parameter" href="#t">T</a><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">&gt;</span></div><div class="tsd-comment tsd-typography"><p>Emitted when a sort operation initiated through the UI has completed.
58
63
  Returns the sort expression used for the operation.</p>
59
64
  </div></section><section class="tsd-panel tsd-member"><h3 class="tsd-anchor-link" id="sorting"><span>sorting</span><a href="#sorting" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h3><div class="tsd-signature"><span class="tsd-kind-property">sorting</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">CustomEvent</span><span class="tsd-signature-symbol">&lt;</span><a href="../types/SortExpression.html" class="tsd-signature-type tsd-kind-type-alias">SortExpression</a><span class="tsd-signature-symbol">&lt;</span><a class="tsd-signature-type tsd-kind-type-parameter" href="#t">T</a><span class="tsd-signature-symbol">,</span> <span class="tsd-signature-keyword">keyof</span> <a class="tsd-signature-type tsd-kind-type-parameter" href="#t">T</a><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">&gt;</span></div><div class="tsd-comment tsd-typography"><p>Emitted when sorting is initiated through the UI.
60
65
  Returns the sort expression which will be used for the operation.</p>
61
- </div><div class="tsd-comment tsd-typography"><div class="tsd-tag-remarks"><h4 class="tsd-anchor-link" id="remarks-7">Remarks<a href="#remarks-7" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h4><p>The event is cancellable which prevents the operation from being applied.
66
+ </div><div class="tsd-comment tsd-typography"><div class="tsd-tag-remarks"><h4 class="tsd-anchor-link" id="remarks-8">Remarks<a href="#remarks-8" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h4><p>The event is cancellable which prevents the operation from being applied.
62
67
  The expression can be modified prior to the operation running.</p>
63
68
  </div></div></section><section class="tsd-panel tsd-member"><h3 class="tsd-anchor-link" id="treerowexpanded"><span>tree<wbr/>Row<wbr/>Expanded</span><a href="#treerowexpanded" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h3><div class="tsd-signature"><span class="tsd-kind-property">treeRowExpanded</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">CustomEvent</span><span class="tsd-signature-symbol">&lt;</span><a href="ApexTreeRowExpandedEvent.html" class="tsd-signature-type tsd-kind-interface">ApexTreeRowExpandedEvent</a><span class="tsd-signature-symbol">&lt;</span><a class="tsd-signature-type tsd-kind-type-parameter" href="#t">T</a><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">&gt;</span></div><div class="tsd-comment tsd-typography"><p>Emitted after a tree-row expansion change has been applied.</p>
64
69
  </div></section><section class="tsd-panel tsd-member"><h3 class="tsd-anchor-link" id="treerowexpanding"><span>tree<wbr/>Row<wbr/>Expanding</span><a href="#treerowexpanding" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h3><div class="tsd-signature"><span class="tsd-kind-property">treeRowExpanding</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">CustomEvent</span><span class="tsd-signature-symbol">&lt;</span><a href="ApexTreeRowExpandingEvent.html" class="tsd-signature-type tsd-kind-interface">ApexTreeRowExpandingEvent</a><span class="tsd-signature-symbol">&lt;</span><a class="tsd-signature-type tsd-kind-type-parameter" href="#t">T</a><span class="tsd-signature-symbol">&gt;</span><span class="tsd-signature-symbol">&gt;</span></div><div class="tsd-comment tsd-typography"><p>Emitted before the tree-row expansion set changes.</p>
65
- </div><div class="tsd-comment tsd-typography"><div class="tsd-tag-remarks"><h4 class="tsd-anchor-link" id="remarks-8">Remarks<a href="#remarks-8" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h4><p>Fires only when <a href="../classes/ApexGrid.html#tree" class="tsd-kind-property">ApexGrid.tree</a> is enabled and a row's tree
70
+ </div><div class="tsd-comment tsd-typography"><div class="tsd-tag-remarks"><h4 class="tsd-anchor-link" id="remarks-9">Remarks<a href="#remarks-9" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h4><p>Fires only when <a href="../classes/ApexGrid.html#tree" class="tsd-kind-property">ApexGrid.tree</a> is enabled and a row's tree
66
71
  expansion is toggled (via the chevron, the public API, or
67
72
  <code>expand-all/collapse-all</code>). Cancellable.</p>
68
- </div></div></section></section></details></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-accordion"><summary class="tsd-accordion-summary"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-chevronDown"></use></svg><h3>Settings</h3></summary><div class="tsd-accordion-details"><div class="tsd-filter-visibility"><span class="settings-label">Member Visibility</span><ul id="tsd-filter-options"><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-inherited" name="inherited" checked/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Inherited</span></label></li></ul></div><div class="tsd-theme-toggle"><label class="settings-label" for="tsd-theme">Theme</label><select id="tsd-theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></div></div></details></div><details open class="tsd-accordion tsd-page-navigation"><summary class="tsd-accordion-summary"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-chevronDown"></use></svg><h3>On This Page</h3></summary><div class="tsd-accordion-details"><details open class="tsd-accordion tsd-page-navigation-section"><summary class="tsd-accordion-summary" data-key="section-Events"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>Events</summary><div><a href="#cellvaluechanged"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>cell<wbr/>Value<wbr/>Changed</span></a><a href="#cellvaluechanging"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>cell<wbr/>Value<wbr/>Changing</span></a><a href="#columnmoved"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>column<wbr/>Moved</span></a><a href="#columnmoving"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>column<wbr/>Moving</span></a><a href="#columnpinned"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>column<wbr/>Pinned</span></a><a href="#columnpinning"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>column<wbr/>Pinning</span></a><a href="#filtered"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>filtered</span></a><a href="#filtering"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>filtering</span></a><a href="#pagechanged"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>page<wbr/>Changed</span></a><a href="#pagechanging"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>page<wbr/>Changing</span></a><a href="#quickfilterchanged"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>quick<wbr/>Filter<wbr/>Changed</span></a><a href="#quickfilterchanging"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>quick<wbr/>Filter<wbr/>Changing</span></a><a href="#roweditended"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>row<wbr/>Edit<wbr/>Ended</span></a><a href="#roweditstarted"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>row<wbr/>Edit<wbr/>Started</span></a><a href="#rowexpanded"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>row<wbr/>Expanded</span></a><a href="#rowexpanding"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>row<wbr/>Expanding</span></a><a href="#rowselected"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>row<wbr/>Selected</span></a><a href="#sorted"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>sorted</span></a><a href="#sorting"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>sorting</span></a><a href="#treerowexpanded"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>tree<wbr/>Row<wbr/>Expanded</span></a><a href="#treerowexpanding"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>tree<wbr/>Row<wbr/>Expanding</span></a></div></details></div></details></div><div class="site-menu"><nav class="tsd-navigation"><a href="../modules.html">apex-grid</a><ul class="tsd-small-nested-navigation" id="tsd-nav-container"><li>Loading...</li></ul></nav></div></div></div><footer><p class="tsd-generator">Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></footer><div class="overlay"></div></body></html>
73
+ </div></div></section></section></details></div><div class="col-sidebar"><div class="page-menu"><div class="tsd-navigation settings"><details class="tsd-accordion"><summary class="tsd-accordion-summary"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-chevronDown"></use></svg><h3>Settings</h3></summary><div class="tsd-accordion-details"><div class="tsd-filter-visibility"><span class="settings-label">Member Visibility</span><ul id="tsd-filter-options"><li class="tsd-filter-item"><label class="tsd-filter-input"><input type="checkbox" id="tsd-filter-inherited" name="inherited" checked/><svg width="32" height="32" viewBox="0 0 32 32" aria-hidden="true"><rect class="tsd-checkbox-background" width="30" height="30" x="1" y="1" rx="6" fill="none"></rect><path class="tsd-checkbox-checkmark" d="M8.35422 16.8214L13.2143 21.75L24.6458 10.25" stroke="none" stroke-width="3.5" stroke-linejoin="round" fill="none"></path></svg><span>Inherited</span></label></li></ul></div><div class="tsd-theme-toggle"><label class="settings-label" for="tsd-theme">Theme</label><select id="tsd-theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></div></div></details></div><details open class="tsd-accordion tsd-page-navigation"><summary class="tsd-accordion-summary"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-chevronDown"></use></svg><h3>On This Page</h3></summary><div class="tsd-accordion-details"><details open class="tsd-accordion tsd-page-navigation-section"><summary class="tsd-accordion-summary" data-key="section-Events"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-chevronDown"></use></svg>Events</summary><div><a href="#cellvaluechanged"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>cell<wbr/>Value<wbr/>Changed</span></a><a href="#cellvaluechanging"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>cell<wbr/>Value<wbr/>Changing</span></a><a href="#columnmoved"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>column<wbr/>Moved</span></a><a href="#columnmoving"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>column<wbr/>Moving</span></a><a href="#columnpinned"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>column<wbr/>Pinned</span></a><a href="#columnpinning"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>column<wbr/>Pinning</span></a><a href="#filtered"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>filtered</span></a><a href="#filtering"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>filtering</span></a><a href="#pagechanged"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>page<wbr/>Changed</span></a><a href="#pagechanging"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>page<wbr/>Changing</span></a><a href="#quickfilterchanged"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>quick<wbr/>Filter<wbr/>Changed</span></a><a href="#quickfilterchanging"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>quick<wbr/>Filter<wbr/>Changing</span></a><a href="#roweditended"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>row<wbr/>Edit<wbr/>Ended</span></a><a href="#roweditstarted"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>row<wbr/>Edit<wbr/>Started</span></a><a href="#rowexpanded"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>row<wbr/>Expanded</span></a><a href="#rowexpanding"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>row<wbr/>Expanding</span></a><a href="#rowselected"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>row<wbr/>Selected</span></a><a href="#rowselecting"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>row<wbr/>Selecting</span></a><a href="#sorted"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>sorted</span></a><a href="#sorting"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>sorting</span></a><a href="#treerowexpanded"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>tree<wbr/>Row<wbr/>Expanded</span></a><a href="#treerowexpanding"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>tree<wbr/>Row<wbr/>Expanding</span></a></div></details></div></details></div><div class="site-menu"><nav class="tsd-navigation"><a href="../modules.html">apex-grid</a><ul class="tsd-small-nested-navigation" id="tsd-nav-container"><li>Loading...</li></ul></nav></div></div></div><footer><p class="tsd-generator">Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></footer><div class="overlay"></div></body></html>
@@ -2,7 +2,7 @@
2
2
  </div><div class="tsd-comment tsd-typography"><div class="tsd-tag-remarks"><h4 class="tsd-anchor-link" id="remarks">Remarks<a href="#remarks" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h4><p>The toolbar renders one menu item per entry returned by
3
3
  <a href="../classes/ApexGrid.html#exportformats" class="tsd-kind-accessor">ApexGrid.exportFormats</a> and dispatches the chosen <code>id</code> to
4
4
  <a href="../classes/ApexGrid.html#exportas" class="tsd-kind-method">ApexGrid.exportAs</a>. The community grid offers <code>'csv'</code>; derived grids
5
- (e.g. <code>@apexcharts/grid-enterprise</code>) extend the list (e.g. with <code>'xlsx'</code>).</p>
5
+ (e.g. <code>apex-grid-enterprise</code>) extend the list (e.g. with <code>'xlsx'</code>).</p>
6
6
  </div></div></section><div class="tsd-signature"><span class="tsd-signature-keyword">interface</span> <span class="tsd-kind-interface">ExportFormat</span> <span class="tsd-signature-symbol">{</span><br/>    <a class="tsd-kind-property" href="#id">id</a><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">;</span><br/>    <a class="tsd-kind-property" href="#label">label</a><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">;</span><br/><span class="tsd-signature-symbol">}</span></div><section class="tsd-panel-group tsd-index-group"><section class="tsd-panel tsd-index-panel"><details class="tsd-index-content tsd-accordion" open><summary class="tsd-accordion-summary tsd-index-summary"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-chevronDown"></use></svg><h5 class="tsd-index-heading uppercase">Index</h5></summary><div class="tsd-accordion-details"><section class="tsd-index-section"><h3 class="tsd-index-heading">Properties</h3><div class="tsd-index-list"><a href="#id" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>id</span></a>
7
7
  <a href="#label" class="tsd-index-link"><svg class="tsd-kind-icon" viewBox="0 0 24 24" aria-label="Property"><use href="../assets/icons.svg#icon-1024"></use></svg><span>label</span></a>
8
8
  </div></section></div></details></section></section><details class="tsd-panel-group tsd-member-group tsd-accordion" open><summary class="tsd-accordion-summary" data-key="section-Properties"><svg width="20" height="20" viewBox="0 0 24 24" fill="none" aria-hidden="true"><use href="../assets/icons.svg#icon-chevronDown"></use></svg><h2>Properties</h2></summary><section><section class="tsd-panel tsd-member"><h3 class="tsd-anchor-link" id="id"><span>id</span><a href="#id" aria-label="Permalink" class="tsd-anchor-icon"><svg viewBox="0 0 24 24" aria-hidden="true"><use href="../assets/icons.svg#icon-anchor"></use></svg></a></h3><div class="tsd-signature"><span class="tsd-kind-property">id</span><span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">string</span></div><div class="tsd-comment tsd-typography"><p>Stable format identifier, e.g. <code>'csv'</code>.</p>
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "apex-grid",
3
- "version": "3.0.0",
3
+ "version": "3.0.1",
4
4
  "description": "Web component data grid following open-wc recommendations",
5
5
  "keywords": [
6
6
  "lit",
@@ -61,7 +61,7 @@ export interface CSVExportOptions<T extends object> extends ExportOptions<T> {
61
61
  * The toolbar renders one menu item per entry returned by
62
62
  * {@link ApexGrid.exportFormats} and dispatches the chosen `id` to
63
63
  * {@link ApexGrid.exportAs}. The community grid offers `'csv'`; derived grids
64
- * (e.g. `@apexcharts/grid-enterprise`) extend the list (e.g. with `'xlsx'`).
64
+ * (e.g. `apex-grid-enterprise`) extend the list (e.g. with `'xlsx'`).
65
65
  */
66
66
  export interface ExportFormat {
67
67
  /** Stable format identifier, e.g. `'csv'`. */
@@ -1 +1 @@
1
- {"version":3,"file":"export.js","sourceRoot":"","sources":["../../src/internal/export.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AA+E/C,MAAM,UAAU,oBAAoB,CAClC,IAAiB,EACjB,IAAsB;IAEtB,MAAM,GAAG,GAAG,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,CAChD,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,UAAU,KAAK,KAAK,CAC1D,CAAC;IACF,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM;QAAE,OAAO,GAAG,CAAC;IACtC,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,OAAoB,CAAC,CAAC;IAChD,OAAO,GAAG,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;AACtD,CAAC;AAKD,MAAM,UAAU,iBAAiB,CAC/B,IAAiB,EACjB,SAAuB,MAAM;IAE7B,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,KAAK;YACR,OAAO,IAAI,CAAC,IAAI,CAAC;QACnB,KAAK,MAAM;YACT,OAAO,IAAI,CAAC,SAAS,CAAC;QACxB,KAAK,UAAU;YACb,OAAO,IAAI,CAAC,YAAY,CAAC;QAC3B;YACE,OAAO,IAAI,CAAC,QAAQ,CAAC;IACzB,CAAC;AACH,CAAC;AAKD,MAAM,UAAU,cAAc,CAAmB,MAA8B;IAC7E,OAAO,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,cAAc,GAAsE;IACxF,KAAK,EAAE,OAAO;IACd,MAAM,EAAE,QAAQ;IAChB,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;CACb,CAAC;AAOF,MAAM,UAAU,mBAAmB,CACjC,MAA8B,EAC9B,KAAc;IAEd,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS;QAAE,OAAO,EAAE,CAAC;IACrD,QAAQ,MAAM,CAAC,IAAI,EAAE,CAAC;QACpB,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;gBAC5C,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,OAAO,IAAI,MAAM,EAAE,CAAC;oBAC9D,OAAQ,MAA6B,CAAC,KAAK,KAAK,KAAK,CAAC;gBACxD,CAAC;gBACD,OAAO,MAAM,KAAK,KAAK,CAAC;YAC1B,CAAC,CAAC,CAAC;YACH,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,IAAI,KAAK,EAAE,CAAC;gBAC3D,MAAM,KAAK,GAAI,KAA6B,CAAC,KAAK,CAAC;gBACnD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;oBAAE,OAAO,KAAK,CAAC;YAClE,CAAC;YACD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACzF,CAAC;QACD,KAAK,MAAM,CAAC,CAAC,CAAC;YACZ,IAAI,KAAK,YAAY,IAAI;gBAAE,OAAO,KAAK,CAAC;YACxC,MAAM,MAAM,GAAG,IAAI,IAAI,CAAC,KAAwB,CAAC,CAAC;YAClD,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;QACjE,CAAC;QACD,KAAK,SAAS;YACZ,OAAO,OAAO,CAAC,KAAK,CAAC,CAAC;QACxB,KAAK,QAAQ,CAAC;QACd,KAAK,QAAQ,CAAC,CAAC,CAAC;YACd,MAAM,CAAC,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;YACxB,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACrC,CAAC;QACD;YACE,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC3F,CAAC;AACH,CAAC;AAMD,MAAM,UAAU,kBAAkB,CAChC,MAA8B,EAC9B,GAAM,EACN,IAAsB;IAEtB,MAAM,GAAG,GAAI,GAA+B,CAAC,MAAM,CAAC,GAAa,CAAC,CAAC;IACnE,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,mBAAmB,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAC9F,CAAC;AAGD,MAAM,UAAU,gBAAgB,CAC9B,MAA8B,EAC9B,KAAW;IAEX,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,CAAC,MAAM,IAAI,QAAQ,CAAC,CAAC;IACxD,IAAI,CAAC;QACH,OAAO,IAAI,IAAI,CAAC,cAAc,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAChF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC;IAC7B,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,KAAsB,EAAE,SAAiB;IAC9D,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,IAAI,KAAK,KAAK,EAAE;QAAE,OAAO,EAAE,CAAC;IACrE,MAAM,IAAI,GAAG,KAAK,YAAY,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACzE,MAAM,YAAY,GAChB,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC/F,OAAO,YAAY,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;AAC/D,CAAC;AAUD,MAAM,UAAU,QAAQ,CACtB,IAAiB,EACjB,OAA4B,EAAE;IAE9B,MAAM,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,GAAG,CAAC;IACxC,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC;IACvC,MAAM,aAAa,GAAG,IAAI,CAAC,aAAa,IAAI,IAAI,CAAC;IACjD,MAAM,OAAO,GAAG,oBAAoB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACjD,MAAM,IAAI,GAAG,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAElD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,aAAa,EAAE,CAAC;QAClB,KAAK,CAAC,IAAI,CACR,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,aAAa,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAC1F,CAAC;IACJ,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE;YACnC,IAAI,KAAK,GAAG,kBAAkB,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;YAClD,IAAI,KAAK,YAAY,IAAI,EAAE,CAAC;gBAC1B,KAAK,GAAG,gBAAgB,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;YAC1C,CAAC;YACD,OAAO,aAAa,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QACzC,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC;IACpC,CAAC;IAED,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACjC,OAAO,IAAI,CAAC,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC;AACrD,CAAC;AAUD,MAAM,UAAU,YAAY,CAC1B,QAAgB,EAChB,OAA4B,EAC5B,QAAgB;IAEhB,IAAI,OAAO,QAAQ,KAAK,WAAW,IAAI,OAAO,GAAG,EAAE,eAAe,KAAK,UAAU;QAAE,OAAO;IAG1F,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,OAAmB,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;IACjE,MAAM,GAAG,GAAG,GAAG,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;IAC3C,MAAM,CAAC,IAAI,GAAG,GAAG,CAAC;IAClB,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,MAAM,CAAC,KAAK,CAAC,OAAO,GAAG,MAAM,CAAC;IAC9B,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAClC,MAAM,CAAC,KAAK,EAAE,CAAC;IACf,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAClC,UAAU,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,eAAe,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;AAChD,CAAC","sourcesContent":["import type { ApexGrid } from '../components/grid.js';\nimport type { ColumnConfiguration, ColumnDateFormat, Keys } from './types.js';\nimport { getDisplayColumns } from './utils.js';\n\n/**\n * Primitive cell values supported by the export pipeline.\n *\n * @remarks\n * Returned by the default formatter and accepted from user-supplied formatters.\n * `Date` is preserved (not stringified) so that XLSX export can write it as a\n * native date cell instead of inline text.\n */\nexport type ExportCellValue = string | number | boolean | Date | null | undefined;\n\n/**\n * Which row set should drive the export.\n *\n * - `'view'` (default) — post-filter, post-sort rows across all pages.\n * - `'all'` — the raw `data` array as supplied by the consumer.\n * - `'page'` — only the rows in the current page slice.\n * - `'selected'` — the current row selection (insertion order).\n */\nexport type ExportSource = 'view' | 'all' | 'page' | 'selected';\n\n/**\n * Options shared by all export targets.\n */\nexport interface ExportOptions<T extends object> {\n /** Output filename, without extension. Defaults to `'data'`. */\n filename?: string;\n /** Row set to export. Defaults to `'view'`. */\n source?: ExportSource;\n /**\n * Column keys to include. When omitted, every visible non-hidden column with\n * `exportable !== false` is exported, in display order.\n */\n columns?: ReadonlyArray<Keys<T>>;\n /** Whether to emit a header row. Defaults to `true`. */\n includeHeader?: boolean;\n /**\n * Per-cell value formatter. Receives the column configuration, the raw value\n * from the record, and the record itself. Return one of {@link ExportCellValue}\n * (return a `Date` to keep date typing in XLSX).\n */\n formatter?: (column: ColumnConfiguration<T>, value: unknown, row: T) => ExportCellValue;\n}\n\n/**\n * Options for {@link ApexGrid.exportToCSV}.\n */\nexport interface CSVExportOptions<T extends object> extends ExportOptions<T> {\n /** Field delimiter. Defaults to `','`. */\n delimiter?: string;\n /**\n * Prepend a UTF-8 byte-order mark so Excel auto-detects the encoding when\n * opening the file. Defaults to `true`.\n */\n bom?: boolean;\n /** Line separator. Defaults to `'\\r\\n'` (RFC 4180). */\n newline?: string;\n}\n\n/**\n * Describes an export format offered by the grid's toolbar menu.\n *\n * @remarks\n * The toolbar renders one menu item per entry returned by\n * {@link ApexGrid.exportFormats} and dispatches the chosen `id` to\n * {@link ApexGrid.exportAs}. The community grid offers `'csv'`; derived grids\n * (e.g. `@apexcharts/grid-enterprise`) extend the list (e.g. with `'xlsx'`).\n */\nexport interface ExportFormat {\n /** Stable format identifier, e.g. `'csv'`. */\n id: string;\n /** Menu item label, e.g. `'Export CSV'`. */\n label: string;\n}\n\n/**\n * Resolves the columns that should appear in the export, in display order.\n */\nexport function resolveExportColumns<T extends object>(\n grid: ApexGrid<T>,\n opts: ExportOptions<T>\n): Array<ColumnConfiguration<T>> {\n const all = getDisplayColumns(grid.columns).filter(\n (column) => !column.hidden && column.exportable !== false\n );\n if (!opts.columns?.length) return all;\n const keys = new Set(opts.columns as Keys<T>[]);\n return all.filter((column) => keys.has(column.key));\n}\n\n/**\n * Resolves the rows that should appear in the export.\n */\nexport function resolveExportRows<T extends object>(\n grid: ApexGrid<T>,\n source: ExportSource = 'view'\n): ReadonlyArray<T> {\n switch (source) {\n case 'all':\n return grid.data;\n case 'page':\n return grid.pageItems;\n case 'selected':\n return grid.selectedRows;\n default:\n return grid.dataView;\n }\n}\n\n/**\n * Returns the column's display label, used as the header cell value.\n */\nexport function getColumnLabel<T extends object>(column: ColumnConfiguration<T>): string {\n return column.headerText ?? String(column.key);\n}\n\nconst DATE_STYLE_MAP: Record<ColumnDateFormat, Intl.DateTimeFormatOptions['dateStyle']> = {\n short: 'short',\n medium: 'medium',\n long: 'long',\n full: 'full',\n};\n\n/**\n * Default cell-value formatter. Mirrors the on-screen rendering for each\n * column type while keeping primitive types primitive (so number/boolean/date\n * survive into XLSX as native cells instead of strings).\n */\nexport function defaultExportFormat<T extends object>(\n column: ColumnConfiguration<T>,\n value: unknown\n): ExportCellValue {\n if (value === null || value === undefined) return '';\n switch (column.type) {\n case 'select': {\n const found = column.options?.find((option) => {\n if (option && typeof option === 'object' && 'value' in option) {\n return (option as { value: unknown }).value === value;\n }\n return option === value;\n });\n if (found && typeof found === 'object' && 'label' in found) {\n const label = (found as { label?: unknown }).label;\n if (typeof label === 'string' && label.length > 0) return label;\n }\n return typeof value === 'number' || typeof value === 'boolean' ? value : String(value);\n }\n case 'date': {\n if (value instanceof Date) return value;\n const parsed = new Date(value as string | number);\n return Number.isNaN(parsed.getTime()) ? String(value) : parsed;\n }\n case 'boolean':\n return Boolean(value);\n case 'number':\n case 'rating': {\n const n = Number(value);\n return Number.isFinite(n) ? n : '';\n }\n default:\n return typeof value === 'number' || typeof value === 'boolean' ? value : String(value);\n }\n}\n\n/**\n * Resolves the export value for a single cell, applying the user-supplied\n * formatter when present and falling back to {@link defaultExportFormat}.\n */\nexport function resolveExportValue<T extends object>(\n column: ColumnConfiguration<T>,\n row: T,\n opts: ExportOptions<T>\n): ExportCellValue {\n const raw = (row as Record<string, unknown>)[column.key as string];\n return opts.formatter ? opts.formatter(column, raw, row) : defaultExportFormat(column, raw);\n}\n\n/** Formats a `Date` into the configured date style for CSV output. */\nexport function formatDateForCSV<T extends object>(\n column: ColumnConfiguration<T>,\n value: Date\n): string {\n const style = DATE_STYLE_MAP[column.format ?? 'medium'];\n try {\n return new Intl.DateTimeFormat(undefined, { dateStyle: style }).format(value);\n } catch {\n return value.toISOString();\n }\n}\n\nfunction escapeCSVCell(value: ExportCellValue, delimiter: string): string {\n if (value === null || value === undefined || value === '') return '';\n const text = value instanceof Date ? value.toISOString() : String(value);\n const needsQuoting =\n text.includes(delimiter) || text.includes('\"') || text.includes('\\n') || text.includes('\\r');\n return needsQuoting ? `\"${text.replace(/\"/g, '\"\"')}\"` : text;\n}\n\n/**\n * Builds the CSV string for the grid without triggering a download.\n *\n * @remarks\n * Useful when consumers want to ship the bytes through their own transport\n * (clipboard, HTTP upload). The {@link ApexGrid.exportToCSV} method calls\n * this and then triggers a browser download.\n */\nexport function buildCSV<T extends object>(\n grid: ApexGrid<T>,\n opts: CSVExportOptions<T> = {}\n): string {\n const delimiter = opts.delimiter ?? ',';\n const newline = opts.newline ?? '\\r\\n';\n const includeHeader = opts.includeHeader ?? true;\n const columns = resolveExportColumns(grid, opts);\n const rows = resolveExportRows(grid, opts.source);\n\n const lines: string[] = [];\n if (includeHeader) {\n lines.push(\n columns.map((column) => escapeCSVCell(getColumnLabel(column), delimiter)).join(delimiter)\n );\n }\n for (const row of rows) {\n const cells = columns.map((column) => {\n let value = resolveExportValue(column, row, opts);\n if (value instanceof Date) {\n value = formatDateForCSV(column, value);\n }\n return escapeCSVCell(value, delimiter);\n });\n lines.push(cells.join(delimiter));\n }\n\n const body = lines.join(newline);\n return opts.bom === false ? body : `\\uFEFF${body}`;\n}\n\n/**\n * Triggers a browser download for the given payload.\n *\n * @remarks\n * Falls back to a no-op when called outside the browser (during SSR or unit\n * tests on JSDOM without a body), so consumers can still call the public\n * export API safely.\n */\nexport function downloadBlob(\n filename: string,\n content: string | Uint8Array,\n mimeType: string\n): void {\n if (typeof document === 'undefined' || typeof URL?.createObjectURL !== 'function') return;\n // BlobPart accepts both string and Uint8Array; the cast quiets TS' strict\n // overload resolution which prefers ArrayBufferView only.\n const blob = new Blob([content as BlobPart], { type: mimeType });\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement('a');\n anchor.href = url;\n anchor.download = filename;\n anchor.style.display = 'none';\n document.body.appendChild(anchor);\n anchor.click();\n document.body.removeChild(anchor);\n setTimeout(() => URL.revokeObjectURL(url), 0);\n}\n"]}
1
+ {"version":3,"file":"export.js","sourceRoot":"","sources":["../../src/internal/export.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ApexGrid } from '../components/grid.js';\nimport type { ColumnConfiguration, ColumnDateFormat, Keys } from './types.js';\nimport { getDisplayColumns } from './utils.js';\n\n/**\n * Primitive cell values supported by the export pipeline.\n *\n * @remarks\n * Returned by the default formatter and accepted from user-supplied formatters.\n * `Date` is preserved (not stringified) so that XLSX export can write it as a\n * native date cell instead of inline text.\n */\nexport type ExportCellValue = string | number | boolean | Date | null | undefined;\n\n/**\n * Which row set should drive the export.\n *\n * - `'view'` (default) — post-filter, post-sort rows across all pages.\n * - `'all'` — the raw `data` array as supplied by the consumer.\n * - `'page'` — only the rows in the current page slice.\n * - `'selected'` — the current row selection (insertion order).\n */\nexport type ExportSource = 'view' | 'all' | 'page' | 'selected';\n\n/**\n * Options shared by all export targets.\n */\nexport interface ExportOptions<T extends object> {\n /** Output filename, without extension. Defaults to `'data'`. */\n filename?: string;\n /** Row set to export. Defaults to `'view'`. */\n source?: ExportSource;\n /**\n * Column keys to include. When omitted, every visible non-hidden column with\n * `exportable !== false` is exported, in display order.\n */\n columns?: ReadonlyArray<Keys<T>>;\n /** Whether to emit a header row. Defaults to `true`. */\n includeHeader?: boolean;\n /**\n * Per-cell value formatter. Receives the column configuration, the raw value\n * from the record, and the record itself. Return one of {@link ExportCellValue}\n * (return a `Date` to keep date typing in XLSX).\n */\n formatter?: (column: ColumnConfiguration<T>, value: unknown, row: T) => ExportCellValue;\n}\n\n/**\n * Options for {@link ApexGrid.exportToCSV}.\n */\nexport interface CSVExportOptions<T extends object> extends ExportOptions<T> {\n /** Field delimiter. Defaults to `','`. */\n delimiter?: string;\n /**\n * Prepend a UTF-8 byte-order mark so Excel auto-detects the encoding when\n * opening the file. Defaults to `true`.\n */\n bom?: boolean;\n /** Line separator. Defaults to `'\\r\\n'` (RFC 4180). */\n newline?: string;\n}\n\n/**\n * Describes an export format offered by the grid's toolbar menu.\n *\n * @remarks\n * The toolbar renders one menu item per entry returned by\n * {@link ApexGrid.exportFormats} and dispatches the chosen `id` to\n * {@link ApexGrid.exportAs}. The community grid offers `'csv'`; derived grids\n * (e.g. `apex-grid-enterprise`) extend the list (e.g. with `'xlsx'`).\n */\nexport interface ExportFormat {\n /** Stable format identifier, e.g. `'csv'`. */\n id: string;\n /** Menu item label, e.g. `'Export CSV'`. */\n label: string;\n}\n\n/**\n * Resolves the columns that should appear in the export, in display order.\n */\nexport function resolveExportColumns<T extends object>(\n grid: ApexGrid<T>,\n opts: ExportOptions<T>\n): Array<ColumnConfiguration<T>> {\n const all = getDisplayColumns(grid.columns).filter(\n (column) => !column.hidden && column.exportable !== false\n );\n if (!opts.columns?.length) return all;\n const keys = new Set(opts.columns as Keys<T>[]);\n return all.filter((column) => keys.has(column.key));\n}\n\n/**\n * Resolves the rows that should appear in the export.\n */\nexport function resolveExportRows<T extends object>(\n grid: ApexGrid<T>,\n source: ExportSource = 'view'\n): ReadonlyArray<T> {\n switch (source) {\n case 'all':\n return grid.data;\n case 'page':\n return grid.pageItems;\n case 'selected':\n return grid.selectedRows;\n default:\n return grid.dataView;\n }\n}\n\n/**\n * Returns the column's display label, used as the header cell value.\n */\nexport function getColumnLabel<T extends object>(column: ColumnConfiguration<T>): string {\n return column.headerText ?? String(column.key);\n}\n\nconst DATE_STYLE_MAP: Record<ColumnDateFormat, Intl.DateTimeFormatOptions['dateStyle']> = {\n short: 'short',\n medium: 'medium',\n long: 'long',\n full: 'full',\n};\n\n/**\n * Default cell-value formatter. Mirrors the on-screen rendering for each\n * column type while keeping primitive types primitive (so number/boolean/date\n * survive into XLSX as native cells instead of strings).\n */\nexport function defaultExportFormat<T extends object>(\n column: ColumnConfiguration<T>,\n value: unknown\n): ExportCellValue {\n if (value === null || value === undefined) return '';\n switch (column.type) {\n case 'select': {\n const found = column.options?.find((option) => {\n if (option && typeof option === 'object' && 'value' in option) {\n return (option as { value: unknown }).value === value;\n }\n return option === value;\n });\n if (found && typeof found === 'object' && 'label' in found) {\n const label = (found as { label?: unknown }).label;\n if (typeof label === 'string' && label.length > 0) return label;\n }\n return typeof value === 'number' || typeof value === 'boolean' ? value : String(value);\n }\n case 'date': {\n if (value instanceof Date) return value;\n const parsed = new Date(value as string | number);\n return Number.isNaN(parsed.getTime()) ? String(value) : parsed;\n }\n case 'boolean':\n return Boolean(value);\n case 'number':\n case 'rating': {\n const n = Number(value);\n return Number.isFinite(n) ? n : '';\n }\n default:\n return typeof value === 'number' || typeof value === 'boolean' ? value : String(value);\n }\n}\n\n/**\n * Resolves the export value for a single cell, applying the user-supplied\n * formatter when present and falling back to {@link defaultExportFormat}.\n */\nexport function resolveExportValue<T extends object>(\n column: ColumnConfiguration<T>,\n row: T,\n opts: ExportOptions<T>\n): ExportCellValue {\n const raw = (row as Record<string, unknown>)[column.key as string];\n return opts.formatter ? opts.formatter(column, raw, row) : defaultExportFormat(column, raw);\n}\n\n/** Formats a `Date` into the configured date style for CSV output. */\nexport function formatDateForCSV<T extends object>(\n column: ColumnConfiguration<T>,\n value: Date\n): string {\n const style = DATE_STYLE_MAP[column.format ?? 'medium'];\n try {\n return new Intl.DateTimeFormat(undefined, { dateStyle: style }).format(value);\n } catch {\n return value.toISOString();\n }\n}\n\nfunction escapeCSVCell(value: ExportCellValue, delimiter: string): string {\n if (value === null || value === undefined || value === '') return '';\n const text = value instanceof Date ? value.toISOString() : String(value);\n const needsQuoting =\n text.includes(delimiter) || text.includes('\"') || text.includes('\\n') || text.includes('\\r');\n return needsQuoting ? `\"${text.replace(/\"/g, '\"\"')}\"` : text;\n}\n\n/**\n * Builds the CSV string for the grid without triggering a download.\n *\n * @remarks\n * Useful when consumers want to ship the bytes through their own transport\n * (clipboard, HTTP upload). The {@link ApexGrid.exportToCSV} method calls\n * this and then triggers a browser download.\n */\nexport function buildCSV<T extends object>(\n grid: ApexGrid<T>,\n opts: CSVExportOptions<T> = {}\n): string {\n const delimiter = opts.delimiter ?? ',';\n const newline = opts.newline ?? '\\r\\n';\n const includeHeader = opts.includeHeader ?? true;\n const columns = resolveExportColumns(grid, opts);\n const rows = resolveExportRows(grid, opts.source);\n\n const lines: string[] = [];\n if (includeHeader) {\n lines.push(\n columns.map((column) => escapeCSVCell(getColumnLabel(column), delimiter)).join(delimiter)\n );\n }\n for (const row of rows) {\n const cells = columns.map((column) => {\n let value = resolveExportValue(column, row, opts);\n if (value instanceof Date) {\n value = formatDateForCSV(column, value);\n }\n return escapeCSVCell(value, delimiter);\n });\n lines.push(cells.join(delimiter));\n }\n\n const body = lines.join(newline);\n return opts.bom === false ? body : `\\uFEFF${body}`;\n}\n\n/**\n * Triggers a browser download for the given payload.\n *\n * @remarks\n * Falls back to a no-op when called outside the browser (during SSR or unit\n * tests on JSDOM without a body), so consumers can still call the public\n * export API safely.\n */\nexport function downloadBlob(\n filename: string,\n content: string | Uint8Array,\n mimeType: string\n): void {\n if (typeof document === 'undefined' || typeof URL?.createObjectURL !== 'function') return;\n // BlobPart accepts both string and Uint8Array; the cast quiets TS' strict\n // overload resolution which prefers ArrayBufferView only.\n const blob = new Blob([content as BlobPart], { type: mimeType });\n const url = URL.createObjectURL(blob);\n const anchor = document.createElement('a');\n anchor.href = url;\n anchor.download = filename;\n anchor.style.display = 'none';\n document.body.appendChild(anchor);\n anchor.click();\n document.body.removeChild(anchor);\n setTimeout(() => URL.revokeObjectURL(url), 0);\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "apex-grid",
3
- "version": "3.0.0",
3
+ "version": "3.0.1",
4
4
  "description": "Web component data grid following open-wc recommendations",
5
5
  "keywords": [
6
6
  "lit",