@framesquared/grid 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -139,7 +139,7 @@ interface GridStore {
139
139
  /** Subscribe to store events. */
140
140
  on(event: string, fn: Function, ...args: any[]): any;
141
141
  /** Iterate all records. */
142
- each?(fn: (record: GridRecord, index: number) => boolean | void): void;
142
+ each?(fn: (record: GridRecord, index: number) => boolean | undefined): void;
143
143
  }
144
144
 
145
145
  /**
@@ -420,7 +420,7 @@ declare class RowSelectionModel {
420
420
  private selected;
421
421
  private listeners;
422
422
  constructor(config?: RowSelectionModelConfig);
423
- on(event: string, fn: Function): void;
423
+ on(event: string, fn: (...args: any[]) => void): void;
424
424
  private fire;
425
425
  init(grid: SelectableGrid): void;
426
426
  select(record: GridRecord, keepExisting?: boolean): void;
@@ -459,7 +459,7 @@ declare class CellSelectionModel {
459
459
  private listeners;
460
460
  private maxRow;
461
461
  private maxCol;
462
- on(event: string, fn: Function): void;
462
+ on(event: string, fn: (...args: any[]) => void): void;
463
463
  private fire;
464
464
  init(grid: CellSelectableGrid): void;
465
465
  getCurrentPosition(): CellPosition | null;
@@ -485,7 +485,7 @@ declare class SpreadsheetSelectionModel {
485
485
  private grid;
486
486
  private range;
487
487
  private listeners;
488
- on(event: string, fn: Function): void;
488
+ on(event: string, fn: (...args: any[]) => void): void;
489
489
  private fire;
490
490
  init(grid: any): void;
491
491
  getSelectedRange(): SelectionRange | null;
@@ -588,7 +588,7 @@ declare class TreeStore {
588
588
  getCount(): number;
589
589
  getAt(i: number): any;
590
590
  get(field: string): unknown;
591
- on(_evt: string, _fn: Function): void;
591
+ on(_evt: string, _fn: (...args: any[]) => void): void;
592
592
  sort(): void;
593
593
  isLoading(): boolean;
594
594
  getTotalCount(): number;
package/dist/index.js CHANGED
@@ -116,7 +116,14 @@ var ActionColumn = class extends Column {
116
116
  };
117
117
  var RowNumbererColumn = class extends Column {
118
118
  constructor(config = {}) {
119
- super({ text: "#", width: 40, sortable: false, ...config, xtype: "rownumberer", dataIndex: "" });
119
+ super({
120
+ text: "#",
121
+ width: 40,
122
+ sortable: false,
123
+ ...config,
124
+ xtype: "rownumberer",
125
+ dataIndex: ""
126
+ });
120
127
  }
121
128
  renderCellHtml(_value, _metaData, _record, rowIndex, _colIndex) {
122
129
  return String(rowIndex + 1);
@@ -261,7 +268,9 @@ var GridView = class {
261
268
  td.innerHTML = html;
262
269
  if (col instanceof ActionColumn) {
263
270
  td.addEventListener("click", (e) => {
264
- const target = e.target.closest(".x-action-col-icon");
271
+ const target = e.target.closest(
272
+ ".x-action-col-icon"
273
+ );
265
274
  if (!target) return;
266
275
  const actionIdx = parseInt(target.getAttribute("data-action") ?? "0", 10);
267
276
  const action = col.actions[actionIdx];
@@ -1019,11 +1028,13 @@ var RowSelectionModel = class {
1019
1028
  mode;
1020
1029
  checkboxSelect;
1021
1030
  selected = /* @__PURE__ */ new Set();
1031
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1022
1032
  listeners = {};
1023
1033
  constructor(config = {}) {
1024
1034
  this.mode = config.mode ?? "SINGLE";
1025
1035
  this.checkboxSelect = config.checkboxSelect ?? false;
1026
1036
  }
1037
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1027
1038
  on(event, fn) {
1028
1039
  (this.listeners[event] ??= []).push(fn);
1029
1040
  }
@@ -1220,9 +1231,11 @@ var RowSelectionModel = class {
1220
1231
  var CellSelectionModel = class {
1221
1232
  grid = null;
1222
1233
  position = null;
1234
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1223
1235
  listeners = {};
1224
1236
  maxRow = 0;
1225
1237
  maxCol = 0;
1238
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
1226
1239
  on(event, fn) {
1227
1240
  (this.listeners[event] ??= []).push(fn);
1228
1241
  }
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/grid/Grid.ts","../src/grid/column/Column.ts","../src/grid/HeaderContainer.ts","../src/grid/GridView.ts","../src/grid/feature/Grouping.ts","../src/grid/feature/Summary.ts","../src/grid/feature/GroupingSummary.ts","../src/grid/feature/RowBody.ts","../src/grid/plugin/CellEditing.ts","../src/grid/plugin/RowEditing.ts","../src/grid/plugin/RowExpander.ts","../src/grid/plugin/Clipboard.ts","../src/grid/plugin/DragDrop.ts","../src/grid/selection/RowSelectionModel.ts","../src/grid/selection/CellSelectionModel.ts","../src/grid/selection/SpreadsheetSelectionModel.ts","../src/grid/Lockable.ts","../src/grid/state/GridState.ts","../src/tree/TreePanel.ts","../src/tree/TreeStore.ts"],"sourcesContent":["/**\n * @framesquared/grid – Grid\n *\n * The main grid panel. Extends Panel to display tabular data from\n * a Store with configurable columns, sorting, column visibility,\n * row striping, and item events.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { Panel } from '@framesquared/ui';\nimport type { PanelConfig } from '@framesquared/ui';\nimport { Column, createColumn } from './column/Column.js';\nimport type { ColumnConfig } from './column/Column.js';\nimport { GridView } from './GridView.js';\nimport type { GridStore } from './GridStore.js';\n\n// ---------------------------------------------------------------------------\n// Config\n// ---------------------------------------------------------------------------\n\nexport interface GridConfig extends PanelConfig {\n store?: GridStore;\n columns?: ColumnConfig[];\n sortableColumns?: boolean;\n enableColumnHide?: boolean;\n enableColumnResize?: boolean;\n emptyText?: string;\n scroll?: 'both' | 'horizontal' | 'vertical' | 'none';\n}\n\n// ---------------------------------------------------------------------------\n// Grid\n// ---------------------------------------------------------------------------\n\nexport class Grid extends Panel {\n static override $className = 'Ext.grid.Grid';\n\n declare _store: GridStore | null;\n declare private _columns: Column[];\n declare private _gridView: GridView | null;\n declare private _sortableColumns: boolean;\n declare private _sortDirection: 'ASC' | 'DESC';\n declare private _sortColumnIndex: number;\n\n constructor(config: GridConfig = {}) {\n super({ xtype: 'grid', ...config });\n }\n\n protected override initialize(): void {\n super.initialize();\n const cfg = this._config as GridConfig;\n this._store = cfg.store ?? null;\n this._columns = (cfg.columns ?? []).map(c => c instanceof Column ? c : createColumn(c));\n this._gridView = null;\n this._sortableColumns = cfg.sortableColumns ?? true;\n this._sortDirection = 'ASC';\n this._sortColumnIndex = -1;\n }\n\n protected override afterRender(): void {\n super.afterRender();\n const cfg = this._config as GridConfig;\n this.el!.classList.add('x-grid');\n\n // Create the grid view (requires a store)\n if (!this._store) return;\n\n this._gridView = new GridView({\n store: this._store,\n columns: this._columns,\n emptyText: cfg.emptyText,\n });\n\n // Wire item events\n this._gridView.onItemClick = (record, rowIndex, event) => {\n this.fire('itemclick', this, record, rowIndex, event);\n };\n this._gridView.onItemDblClick = (record, rowIndex, event) => {\n this.fire('itemdblclick', this, record, rowIndex, event);\n };\n\n // Render table into panel body\n const body = this.getBodyEl();\n const table = this._gridView.render();\n body.appendChild(table);\n\n // Setup header click for sorting\n if (this._sortableColumns) {\n this.setupSortableHeaders();\n }\n\n // Store event binding\n if (this._store?.on) {\n this._store.on('datachanged', () => this.onStoreDataChanged());\n this._store.on('sort', () => this.onStoreDataChanged());\n this._store.on('filter', () => this.onStoreDataChanged());\n }\n }\n\n // -----------------------------------------------------------------------\n // Sorting\n // -----------------------------------------------------------------------\n\n private setupSortableHeaders(): void {\n const ths = this._gridView!.headerContainer.getThElements();\n for (let i = 0; i < ths.length; i++) {\n const col = this._columns[i];\n if (!col.sortable) continue;\n\n ths[i].style.cursor = 'pointer';\n ths[i].addEventListener('click', () => {\n this.onHeaderClick(i);\n });\n }\n }\n\n private onHeaderClick(colIndex: number): void {\n const col = this._columns[colIndex];\n if (!col.sortable || !col.dataIndex) return;\n\n // Toggle direction\n if (this._sortColumnIndex === colIndex) {\n this._sortDirection = this._sortDirection === 'ASC' ? 'DESC' : 'ASC';\n } else {\n this._sortDirection = 'ASC';\n this._sortColumnIndex = colIndex;\n }\n\n this._gridView!.headerContainer.setSortIndicator(colIndex, this._sortDirection);\n\n if (this._store?.sort) {\n this._store.sort(col.dataIndex, this._sortDirection);\n }\n }\n\n // -----------------------------------------------------------------------\n // Column visibility\n // -----------------------------------------------------------------------\n\n hideColumn(index: number): void {\n if (this._gridView) {\n this._gridView.setColumnHidden(index, true);\n }\n }\n\n showColumn(index: number): void {\n if (this._gridView) {\n this._gridView.setColumnHidden(index, false);\n }\n }\n\n // -----------------------------------------------------------------------\n // Store data changed\n // -----------------------------------------------------------------------\n\n private onStoreDataChanged(): void {\n if (this._gridView) {\n this._gridView.refresh();\n }\n }\n\n // -----------------------------------------------------------------------\n // Accessors\n // -----------------------------------------------------------------------\n\n getStore(): GridStore | null {\n return this._store;\n }\n\n getColumns(): Column[] {\n return [...this._columns];\n }\n\n getView(): GridView | null {\n return this._gridView;\n }\n}\n","/**\n * @framesquared/grid – Column types\n *\n * Column (base), NumberColumn, DateColumn, BooleanColumn,\n * CheckColumn, ActionColumn, RowNumbererColumn.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\n// ---------------------------------------------------------------------------\n// Column config\n// ---------------------------------------------------------------------------\n\nexport interface ColumnConfig {\n text?: string;\n dataIndex?: string;\n width?: number;\n flex?: number;\n minWidth?: number;\n maxWidth?: number;\n sortable?: boolean;\n hideable?: boolean;\n hidden?: boolean;\n align?: 'left' | 'center' | 'right';\n renderer?: (value: unknown, metaData: any, record: any, rowIndex: number, colIndex: number) => string;\n menuDisabled?: boolean;\n resizable?: boolean;\n draggable?: boolean;\n tdCls?: string;\n xtype?: string;\n // Number\n format?: string;\n // Boolean\n trueText?: string;\n falseText?: string;\n // Action\n actions?: ActionConfig[];\n}\n\nexport interface ActionConfig {\n iconCls?: string;\n tooltip?: string;\n handler?: (record: any, rowIndex: number) => void;\n}\n\n// ---------------------------------------------------------------------------\n// Column (base)\n// ---------------------------------------------------------------------------\n\nexport class Column {\n readonly text: string;\n readonly dataIndex: string;\n readonly width: number;\n readonly flex: number;\n readonly minWidth: number;\n readonly maxWidth: number;\n readonly sortable: boolean;\n readonly hidden: boolean;\n readonly align: string;\n readonly config: ColumnConfig;\n\n private _renderer: ColumnConfig['renderer'] | null;\n\n constructor(config: ColumnConfig = {}) {\n this.config = config;\n this.text = config.text ?? '';\n this.dataIndex = config.dataIndex ?? '';\n this.width = config.width ?? 0;\n this.flex = config.flex ?? 0;\n this.minWidth = config.minWidth ?? 40;\n this.maxWidth = config.maxWidth ?? 0;\n this.sortable = config.sortable ?? true;\n this.hidden = config.hidden ?? false;\n this.align = config.align ?? 'left';\n this._renderer = config.renderer ?? null;\n }\n\n getCellValue(record: any): unknown {\n return record.get ? record.get(this.dataIndex) : record.data?.[this.dataIndex];\n }\n\n renderCell(value: unknown, metaData: any, record: any, rowIndex: number, colIndex: number): string {\n if (this._renderer) {\n return this._renderer(value, metaData, record, rowIndex, colIndex);\n }\n return this.formatValue(value);\n }\n\n formatValue(value: unknown): string {\n if (value === null || value === undefined) return '';\n return String(value);\n }\n\n /** Create the TD content — override in special columns. */\n renderCellHtml(value: unknown, _metaData: any, record: any, rowIndex: number, colIndex: number): string {\n return this.renderCell(value, _metaData, record, rowIndex, colIndex);\n }\n}\n\n// ---------------------------------------------------------------------------\n// NumberColumn\n// ---------------------------------------------------------------------------\n\nexport class NumberColumn extends Column {\n private _format: string;\n\n constructor(config: ColumnConfig = {}) {\n super({ ...config, xtype: 'numbercolumn' });\n this._format = config.format ?? '0';\n }\n\n override formatValue(value: unknown): string {\n if (value === null || value === undefined) return '';\n const n = Number(value);\n if (isNaN(n)) return String(value);\n\n // Simple format: '0.00' → toFixed(2), '0.0' → toFixed(1)\n const match = this._format.match(/0\\.(0+)/);\n if (match) {\n return n.toFixed(match[1].length);\n }\n return String(n);\n }\n}\n\n// ---------------------------------------------------------------------------\n// DateColumn\n// ---------------------------------------------------------------------------\n\nexport class DateColumn extends Column {\n private _format: string;\n\n constructor(config: ColumnConfig = {}) {\n super({ ...config, xtype: 'datecolumn' });\n this._format = config.format ?? 'Y-m-d';\n }\n\n override formatValue(value: unknown): string {\n if (!value) return '';\n const d = value instanceof Date ? value : new Date(String(value));\n if (isNaN(d.getTime())) return String(value);\n\n // Simple format implementation\n const Y = d.getFullYear();\n const m = String(d.getMonth() + 1).padStart(2, '0');\n const day = String(d.getDate()).padStart(2, '0');\n\n return this._format\n .replace('Y', String(Y))\n .replace('m', m)\n .replace('d', day);\n }\n}\n\n// ---------------------------------------------------------------------------\n// BooleanColumn\n// ---------------------------------------------------------------------------\n\nexport class BooleanColumn extends Column {\n private _trueText: string;\n private _falseText: string;\n\n constructor(config: ColumnConfig = {}) {\n super({ ...config, xtype: 'booleancolumn' });\n this._trueText = config.trueText ?? 'true';\n this._falseText = config.falseText ?? 'false';\n }\n\n override formatValue(value: unknown): string {\n return value ? this._trueText : this._falseText;\n }\n}\n\n// ---------------------------------------------------------------------------\n// CheckColumn\n// ---------------------------------------------------------------------------\n\nexport class CheckColumn extends Column {\n constructor(config: ColumnConfig = {}) {\n super({ ...config, xtype: 'checkcolumn' });\n }\n\n override renderCellHtml(value: unknown, _metaData: any, _record: any, _rowIndex: number, _colIndex: number): string {\n const checked = value ? ' checked' : '';\n return `<input type=\"checkbox\"${checked} class=\"x-check-col-input\" />`;\n }\n}\n\n// ---------------------------------------------------------------------------\n// ActionColumn\n// ---------------------------------------------------------------------------\n\nexport class ActionColumn extends Column {\n private _actions: ActionConfig[];\n\n constructor(config: ColumnConfig = {}) {\n super({ ...config, xtype: 'actioncolumn', sortable: false });\n this._actions = config.actions ?? [];\n }\n\n get actions(): ActionConfig[] { return this._actions; }\n\n override renderCellHtml(_value: unknown, _metaData: any, _record: any, rowIndex: number, _colIndex: number): string {\n return this._actions.map((a, ai) =>\n `<span class=\"x-action-col-icon ${a.iconCls ?? ''}\" ` +\n `title=\"${a.tooltip ?? ''}\" data-action=\"${ai}\" data-row=\"${rowIndex}\"></span>`\n ).join('');\n }\n}\n\n// ---------------------------------------------------------------------------\n// RowNumbererColumn\n// ---------------------------------------------------------------------------\n\nexport class RowNumbererColumn extends Column {\n constructor(config: ColumnConfig = {}) {\n super({ text: '#', width: 40, sortable: false, ...config, xtype: 'rownumberer', dataIndex: '' });\n }\n\n override renderCellHtml(_value: unknown, _metaData: any, _record: any, rowIndex: number, _colIndex: number): string {\n return String(rowIndex + 1);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\nexport function createColumn(config: ColumnConfig): Column {\n switch (config.xtype) {\n case 'numbercolumn': return new NumberColumn(config);\n case 'datecolumn': return new DateColumn(config);\n case 'booleancolumn': return new BooleanColumn(config);\n case 'checkcolumn': return new CheckColumn(config);\n case 'actioncolumn': return new ActionColumn(config);\n case 'rownumberer': return new RowNumbererColumn(config);\n default: return new Column(config);\n }\n}\n","/**\n * @framesquared/grid – HeaderContainer\n *\n * Renders and manages the <thead> <tr> of column headers.\n * Applies width, hidden state, and sort indicator classes.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport type { Column } from './column/Column.js';\n\nexport interface HeaderContainerConfig {\n columns: Column[];\n}\n\nexport class HeaderContainer {\n private columns: Column[];\n private headerRow: HTMLTableRowElement | null = null;\n private thElements: HTMLTableCellElement[] = [];\n\n constructor(config: HeaderContainerConfig) {\n this.columns = config.columns;\n }\n\n render(): HTMLTableRowElement {\n this.headerRow = document.createElement('tr');\n this.headerRow.classList.add('x-grid-header-row');\n this.thElements = [];\n\n for (const col of this.columns) {\n const th = document.createElement('th');\n th.classList.add('x-column-header');\n th.textContent = col.text;\n\n if (col.width > 0) th.style.width = `${col.width}px`;\n if (col.hidden) th.style.display = 'none';\n if (col.align) th.style.textAlign = col.align;\n\n th.setAttribute('data-dataindex', col.dataIndex);\n this.thElements.push(th);\n this.headerRow.appendChild(th);\n }\n\n return this.headerRow;\n }\n\n getColumns(): Column[] {\n return this.columns;\n }\n\n getThElements(): HTMLTableCellElement[] {\n return this.thElements;\n }\n\n setColumnHidden(index: number, hidden: boolean): void {\n const th = this.thElements[index];\n if (th) th.style.display = hidden ? 'none' : '';\n }\n\n setSortIndicator(index: number, direction: 'ASC' | 'DESC' | null): void {\n // Clear all\n for (const th of this.thElements) {\n th.classList.remove('x-column-header-sort-ASC', 'x-column-header-sort-DESC');\n }\n if (direction !== null && this.thElements[index]) {\n this.thElements[index].classList.add(`x-column-header-sort-${direction}`);\n }\n }\n}\n","/**\n * @framesquared/grid – GridView\n *\n * Renders the grid body using a <table> with <thead> and <tbody>.\n * Manages row rendering, striping, cell content, and item events.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport type { Column } from './column/Column.js';\nimport { ActionColumn } from './column/Column.js';\nimport { HeaderContainer } from './HeaderContainer.js';\nimport type { GridStore, GridRecord } from './GridStore.js';\n\nexport interface GridViewConfig {\n store: GridStore;\n columns: Column[];\n emptyText?: string;\n}\n\nexport class GridView {\n private store: GridStore;\n private columns: Column[];\n private emptyText: string;\n private tableEl: HTMLTableElement | null = null;\n private tbodyEl: HTMLTableSectionElement | null = null;\n private theadEl: HTMLTableSectionElement | null = null;\n headerContainer: HeaderContainer;\n\n /** Event listeners set by Grid */\n onItemClick?: (record: GridRecord, rowIndex: number, event: Event) => void;\n onItemDblClick?: (record: GridRecord, rowIndex: number, event: Event) => void;\n\n /** Set by RowSelectionModel so selection classes survive refresh() */\n isSelected?: (record: GridRecord) => boolean;\n\n constructor(config: GridViewConfig) {\n this.store = config.store;\n this.columns = config.columns;\n this.emptyText = config.emptyText ?? '';\n this.headerContainer = new HeaderContainer({ columns: this.columns });\n }\n\n render(): HTMLTableElement {\n this.tableEl = document.createElement('table');\n this.tableEl.classList.add('x-grid-table');\n this.tableEl.style.width = '100%';\n this.tableEl.style.borderCollapse = 'collapse';\n\n // Thead\n this.theadEl = document.createElement('thead');\n const headerRow = this.headerContainer.render();\n this.theadEl.appendChild(headerRow);\n this.tableEl.appendChild(this.theadEl);\n\n // Tbody\n this.tbodyEl = document.createElement('tbody');\n this.tableEl.appendChild(this.tbodyEl);\n\n this.renderRows();\n return this.tableEl;\n }\n\n refresh(): void {\n this.renderRows();\n }\n\n private renderRows(): void {\n if (!this.tbodyEl) return;\n this.tbodyEl.innerHTML = '';\n\n const records = this.store.getRange();\n\n if (records.length === 0 && this.emptyText) {\n const emptyRow = document.createElement('tr');\n const emptyTd = document.createElement('td');\n emptyTd.colSpan = this.columns.length;\n emptyTd.classList.add('x-grid-empty');\n emptyTd.textContent = this.emptyText;\n emptyRow.appendChild(emptyTd);\n this.tbodyEl.appendChild(emptyRow);\n return;\n }\n\n for (let rowIdx = 0; rowIdx < records.length; rowIdx++) {\n const record = records[rowIdx];\n const tr = this.createRow(record, rowIdx);\n this.tbodyEl.appendChild(tr);\n }\n }\n\n private createRow(record: GridRecord, rowIndex: number): HTMLTableRowElement {\n const tr = document.createElement('tr');\n tr.classList.add('x-grid-row');\n if (rowIndex % 2 === 1) tr.classList.add('x-grid-row-alt');\n if (this.isSelected?.(record)) tr.classList.add('x-grid-row-selected');\n tr.setAttribute('data-rowindex', String(rowIndex));\n\n for (let colIdx = 0; colIdx < this.columns.length; colIdx++) {\n const col = this.columns[colIdx];\n const td = document.createElement('td');\n td.classList.add('x-grid-cell');\n\n if (col.hidden) td.style.display = 'none';\n if (col.align) td.style.textAlign = col.align;\n if (col.config.tdCls) td.classList.add(col.config.tdCls);\n\n const value = col.getCellValue(record);\n const html = col.renderCellHtml(value, {}, record, rowIndex, colIdx);\n td.innerHTML = html;\n\n // Action column click delegation\n if (col instanceof ActionColumn) {\n td.addEventListener('click', (e) => {\n const target = (e.target as HTMLElement).closest('.x-action-col-icon') as HTMLElement | null;\n if (!target) return;\n const actionIdx = parseInt(target.getAttribute('data-action') ?? '0', 10);\n const action = col.actions[actionIdx];\n if (action?.handler) action.handler(record, rowIndex);\n });\n }\n\n // CheckColumn click\n if (col.config.xtype === 'checkcolumn') {\n const input = td.querySelector('input[type=\"checkbox\"]') as HTMLInputElement | null;\n if (input) {\n input.addEventListener('change', () => {\n record.set?.(col.dataIndex, input.checked);\n });\n }\n }\n\n tr.appendChild(td);\n }\n\n // Item events\n tr.addEventListener('click', (e) => {\n this.onItemClick?.(record, rowIndex, e);\n });\n tr.addEventListener('dblclick', (e) => {\n this.onItemDblClick?.(record, rowIndex, e);\n });\n\n return tr;\n }\n\n setColumnHidden(index: number, hidden: boolean): void {\n this.headerContainer.setColumnHidden(index, hidden);\n // Also hide/show cells in existing rows\n if (this.tbodyEl) {\n for (const row of this.tbodyEl.rows) {\n if (row.cells[index]) {\n (row.cells[index] as HTMLElement).style.display = hidden ? 'none' : '';\n }\n }\n }\n }\n\n getTable(): HTMLTableElement | null {\n return this.tableEl;\n }\n}\n","/**\n * @framesquared/grid – Grouping feature\n *\n * Groups rows by a field value. Renders group header rows with\n * expand/collapse behavior.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nexport interface GroupingConfig {\n groupField: string;\n startCollapsed?: boolean;\n groupHeaderTpl?: (groupValue: string, records: any[]) => string;\n}\n\nexport class Grouping {\n private grid: any = null;\n private groupField: string;\n private startCollapsed: boolean;\n private collapsedGroups = new Set<string>();\n private groupHeaderTpl: (gv: string, recs: any[]) => string;\n\n constructor(config: GroupingConfig) {\n this.groupField = config.groupField;\n this.startCollapsed = config.startCollapsed ?? false;\n this.groupHeaderTpl = config.groupHeaderTpl ?? ((gv) => gv);\n }\n\n init(grid: any): void {\n this.grid = grid;\n this.rebuildGroupedView();\n }\n\n collapse(groupValue: string): void {\n this.collapsedGroups.add(groupValue);\n this.setGroupRowsVisible(groupValue, false);\n this.grid?.fire?.('groupcollapse', this.grid, groupValue);\n }\n\n expand(groupValue: string): void {\n this.collapsedGroups.delete(groupValue);\n this.setGroupRowsVisible(groupValue, true);\n this.grid?.fire?.('groupexpand', this.grid, groupValue);\n }\n\n isCollapsed(groupValue: string): boolean {\n return this.collapsedGroups.has(groupValue);\n }\n\n private rebuildGroupedView(): void {\n const view = this.grid?.getView?.();\n if (!view) return;\n const table = view.getTable?.();\n if (!table) return;\n const tbody = table.querySelector('tbody');\n if (!tbody) return;\n\n const store = this.grid.getStore();\n const records = store.getRange();\n const columns = this.grid.getColumns();\n const groups = this.groupRecords(records);\n\n tbody.innerHTML = '';\n\n for (const [groupValue, groupRecords] of groups) {\n if (this.startCollapsed) this.collapsedGroups.add(groupValue);\n\n const groupEl = document.createElement('tbody');\n groupEl.classList.add('x-grid-group');\n groupEl.setAttribute('data-group', groupValue);\n\n // Group header row\n const headerRow = document.createElement('tr');\n headerRow.classList.add('x-grid-group-hd');\n const headerTd = document.createElement('td');\n headerTd.colSpan = columns.length;\n headerTd.classList.add('x-grid-group-title');\n headerTd.textContent = this.groupHeaderTpl(groupValue, groupRecords);\n headerRow.appendChild(headerTd);\n\n headerRow.style.cursor = 'pointer';\n headerRow.addEventListener('click', () => {\n if (this.isCollapsed(groupValue)) this.expand(groupValue);\n else this.collapse(groupValue);\n });\n\n groupEl.appendChild(headerRow);\n\n // Data rows\n for (let i = 0; i < groupRecords.length; i++) {\n const rec = groupRecords[i];\n const tr = document.createElement('tr');\n tr.classList.add('x-grid-row');\n if (this.collapsedGroups.has(groupValue)) tr.style.display = 'none';\n\n for (let ci = 0; ci < columns.length; ci++) {\n const col = columns[ci];\n const td = document.createElement('td');\n td.classList.add('x-grid-cell');\n const val = col.getCellValue(rec);\n td.innerHTML = col.renderCellHtml(val, {}, rec, i, ci);\n tr.appendChild(td);\n }\n groupEl.appendChild(tr);\n }\n\n // Replace original tbody with group tbodies\n table.appendChild(groupEl);\n }\n\n // Remove original tbody\n tbody.remove();\n }\n\n private groupRecords(records: any[]): Map<string, any[]> {\n const groups = new Map<string, any[]>();\n for (const rec of records) {\n const val = String(rec.get(this.groupField));\n if (!groups.has(val)) groups.set(val, []);\n groups.get(val)!.push(rec);\n }\n return groups;\n }\n\n private setGroupRowsVisible(groupValue: string, visible: boolean): void {\n const groupEl = this.grid?.el?.querySelector(`.x-grid-group[data-group=\"${groupValue}\"]`);\n if (!groupEl) return;\n const rows = groupEl.querySelectorAll('.x-grid-row');\n for (const row of rows) {\n (row as HTMLElement).style.display = visible ? '' : 'none';\n }\n }\n}\n","/**\n * @framesquared/grid – Summary feature\n *\n * Adds a summary row at the bottom of the grid with aggregate\n * calculations per column (sum, count, average, min, max, custom).\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nexport type SummaryType = 'sum' | 'count' | 'average' | 'min' | 'max' | ((records: any[]) => unknown);\n\nexport interface SummaryConfig {\n summaryTypes: Record<string, SummaryType>;\n}\n\nexport class Summary {\n private grid: any = null;\n private summaryTypes: Record<string, SummaryType>;\n\n constructor(config: SummaryConfig) {\n this.summaryTypes = config.summaryTypes;\n }\n\n init(grid: any): void {\n this.grid = grid;\n this.renderSummary();\n }\n\n private renderSummary(): void {\n const view = this.grid?.getView?.();\n if (!view) return;\n const table = view.getTable?.();\n if (!table) return;\n\n const store = this.grid.getStore();\n const records = store.getRange();\n const columns = this.grid.getColumns();\n\n const tr = this.buildSummaryRow(records, columns);\n const tbody = table.querySelector('tbody');\n if (tbody) tbody.appendChild(tr);\n }\n\n protected buildSummaryRow(records: any[], columns: any[]): HTMLTableRowElement {\n const tr = document.createElement('tr');\n tr.classList.add('x-grid-summary-row');\n\n for (const col of columns) {\n const td = document.createElement('td');\n td.classList.add('x-grid-cell', 'x-grid-summary-cell');\n const type = this.summaryTypes[col.dataIndex];\n if (type) {\n td.textContent = String(this.calculate(records, col.dataIndex, type));\n }\n tr.appendChild(td);\n }\n return tr;\n }\n\n protected calculate(records: any[], field: string, type: SummaryType): unknown {\n if (typeof type === 'function') return type(records);\n\n const values = records.map(r => Number(r.get(field))).filter(n => !isNaN(n));\n switch (type) {\n case 'sum': return values.reduce((a, b) => a + b, 0);\n case 'count': return records.length;\n case 'average': return values.length ? Math.round(values.reduce((a, b) => a + b, 0) / values.length) : 0;\n case 'min': return values.length ? Math.min(...values) : 0;\n case 'max': return values.length ? Math.max(...values) : 0;\n default: return '';\n }\n }\n}\n","/**\n * @framesquared/grid – GroupingSummary feature\n *\n * Combines grouping with per-group summary rows. Each group gets\n * a header and a summary row at the bottom.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport type { SummaryType } from './Summary.js';\n\nexport interface GroupingSummaryConfig {\n groupField: string;\n summaryTypes: Record<string, SummaryType>;\n startCollapsed?: boolean;\n}\n\nexport class GroupingSummary {\n private grid: any = null;\n private groupField: string;\n private summaryTypes: Record<string, SummaryType>;\n\n constructor(config: GroupingSummaryConfig) {\n this.groupField = config.groupField;\n this.summaryTypes = config.summaryTypes;\n }\n\n init(grid: any): void {\n this.grid = grid;\n this.rebuild();\n }\n\n private rebuild(): void {\n const view = this.grid?.getView?.();\n if (!view) return;\n const table = view.getTable?.();\n if (!table) return;\n const tbody = table.querySelector('tbody');\n if (!tbody) return;\n\n const store = this.grid.getStore();\n const records = store.getRange();\n const columns = this.grid.getColumns();\n const groups = this.groupRecords(records);\n\n tbody.innerHTML = '';\n\n for (const [groupValue, groupRecords] of groups) {\n const groupEl = document.createElement('tbody');\n groupEl.classList.add('x-grid-group');\n groupEl.setAttribute('data-group', groupValue);\n\n // Group header\n const headerRow = document.createElement('tr');\n headerRow.classList.add('x-grid-group-hd');\n const headerTd = document.createElement('td');\n headerTd.colSpan = columns.length;\n headerTd.textContent = groupValue;\n headerRow.appendChild(headerTd);\n groupEl.appendChild(headerRow);\n\n // Data rows\n for (let i = 0; i < groupRecords.length; i++) {\n const rec = groupRecords[i];\n const tr = document.createElement('tr');\n tr.classList.add('x-grid-row');\n for (let ci = 0; ci < columns.length; ci++) {\n const col = columns[ci];\n const td = document.createElement('td');\n td.classList.add('x-grid-cell');\n td.innerHTML = col.renderCellHtml(col.getCellValue(rec), {}, rec, i, ci);\n tr.appendChild(td);\n }\n groupEl.appendChild(tr);\n }\n\n // Group summary row\n const sumRow = document.createElement('tr');\n sumRow.classList.add('x-grid-group-summary');\n for (const col of columns) {\n const td = document.createElement('td');\n td.classList.add('x-grid-cell');\n const type = this.summaryTypes[col.dataIndex];\n if (type) td.textContent = String(this.calculate(groupRecords, col.dataIndex, type));\n sumRow.appendChild(td);\n }\n groupEl.appendChild(sumRow);\n\n table.appendChild(groupEl);\n }\n\n tbody.remove();\n }\n\n private groupRecords(records: any[]): Map<string, any[]> {\n const groups = new Map<string, any[]>();\n for (const rec of records) {\n const val = String(rec.get(this.groupField));\n if (!groups.has(val)) groups.set(val, []);\n groups.get(val)!.push(rec);\n }\n return groups;\n }\n\n private calculate(records: any[], field: string, type: SummaryType): unknown {\n if (typeof type === 'function') return type(records);\n const values = records.map(r => Number(r.get(field))).filter(n => !isNaN(n));\n switch (type) {\n case 'sum': return values.reduce((a, b) => a + b, 0);\n case 'count': return records.length;\n case 'average': return values.length ? Math.round(values.reduce((a, b) => a + b, 0) / values.length) : 0;\n case 'min': return values.length ? Math.min(...values) : 0;\n case 'max': return values.length ? Math.max(...values) : 0;\n default: return '';\n }\n }\n}\n","/**\n * @framesquared/grid – RowBody feature\n *\n * Adds an expandable body row below each data row with\n * custom content generated by getAdditionalData.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nexport interface RowBodyConfig {\n getAdditionalData: (data: any, rowIndex: number, record: any) => { rowBody: string; rowBodyCls?: string };\n}\n\nexport class RowBody {\n private grid: any = null;\n private getAdditionalData: RowBodyConfig['getAdditionalData'];\n\n constructor(config: RowBodyConfig) {\n this.getAdditionalData = config.getAdditionalData;\n }\n\n init(grid: any): void {\n this.grid = grid;\n this.addRowBodies();\n }\n\n private addRowBodies(): void {\n const view = this.grid?.getView?.();\n if (!view) return;\n const table = view.getTable?.();\n if (!table) return;\n const tbody = table.querySelector('tbody');\n if (!tbody) return;\n\n const store = this.grid.getStore();\n const records = store.getRange();\n const columns = this.grid.getColumns();\n const rows = Array.from(tbody.querySelectorAll('tr.x-grid-row')) as HTMLElement[];\n\n for (let i = 0; i < rows.length && i < records.length; i++) {\n const rec = records[i];\n const result = this.getAdditionalData(rec.data, i, rec);\n const bodyRow = document.createElement('tr');\n bodyRow.classList.add('x-grid-rowbody');\n if (result.rowBodyCls) bodyRow.classList.add(result.rowBodyCls);\n const td = document.createElement('td');\n td.colSpan = columns.length;\n td.innerHTML = result.rowBody;\n bodyRow.appendChild(td);\n rows[i].after(bodyRow);\n }\n }\n}\n","/**\n * @framesquared/grid – CellEditing plugin\n *\n * Double-click a cell to start inline editing. The cell content\n * is replaced with an input field. Enter completes; Escape cancels.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nexport class CellEditing {\n private grid: any = null;\n private activeEditor: HTMLElement | null = null;\n private activeInput: HTMLInputElement | null = null;\n private activeRecord: any = null;\n private activeColumn: any = null;\n private activeCell: HTMLElement | null = null;\n private originalValue: string = '';\n\n init(grid: any): void {\n this.grid = grid;\n this.attachCellListeners();\n }\n\n private attachCellListeners(): void {\n const view = this.grid?.getView?.();\n if (!view) return;\n const table = view.getTable?.();\n if (!table) return;\n\n table.addEventListener('dblclick', (e: MouseEvent) => {\n const td = (e.target as HTMLElement).closest('td.x-grid-cell') as HTMLElement | null;\n if (!td) return;\n const tr = td.closest('tr.x-grid-row') as HTMLElement | null;\n if (!tr) return;\n\n const rowIdx = parseInt(tr.getAttribute('data-rowindex') ?? '0', 10);\n const colIdx = Array.from(tr.children).indexOf(td);\n const columns = this.grid.getColumns();\n const col = columns[colIdx];\n if (!col?.config?.editor) return;\n\n const store = this.grid.getStore();\n const record = store.getAt(rowIdx);\n if (!record) return;\n\n this.startEdit(record, col, td);\n });\n }\n\n private startEdit(record: any, column: any, cell: HTMLElement): void {\n if (this.activeEditor) this.cancelEdit();\n\n this.grid?.fire?.('beforeedit', this.grid, { record, column });\n\n this.activeRecord = record;\n this.activeColumn = column;\n this.activeCell = cell;\n this.originalValue = String(record.get(column.dataIndex) ?? '');\n\n // Create editor\n const editor = document.createElement('div');\n editor.classList.add('x-grid-cell-editor');\n\n const input = document.createElement('input');\n input.type = 'text';\n input.value = this.originalValue;\n input.classList.add('x-grid-editor-input');\n\n input.addEventListener('keydown', (e: KeyboardEvent) => {\n if (e.key === 'Enter') { e.preventDefault(); this.completeEdit(); }\n else if (e.key === 'Escape') { e.preventDefault(); this.cancelEdit(); }\n });\n\n editor.appendChild(input);\n cell.innerHTML = '';\n cell.appendChild(editor);\n this.activeEditor = editor;\n this.activeInput = input;\n input.focus();\n input.select();\n }\n\n completeEdit(): void {\n if (!this.activeInput || !this.activeRecord || !this.activeColumn || !this.activeCell) return;\n\n const newValue = this.activeInput.value;\n this.activeRecord.set(this.activeColumn.dataIndex, newValue);\n this.activeCell.innerHTML = newValue;\n\n this.grid?.fire?.('edit', this.grid, {\n record: this.activeRecord,\n column: this.activeColumn,\n value: newValue,\n originalValue: this.originalValue,\n });\n\n this.cleanup();\n }\n\n cancelEdit(): void {\n if (!this.activeCell) return;\n this.activeCell.innerHTML = this.originalValue;\n this.grid?.fire?.('canceledit', this.grid);\n this.cleanup();\n }\n\n private cleanup(): void {\n this.activeEditor = null;\n this.activeInput = null;\n this.activeRecord = null;\n this.activeColumn = null;\n this.activeCell = null;\n this.originalValue = '';\n }\n}\n","/**\n * @framesquared/grid – RowEditing plugin\n *\n * Row-level editing: shows input fields for all editable columns\n * in the selected row. Update saves all; Cancel reverts.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nexport class RowEditing {\n private grid: any = null;\n private activeRowIndex = -1;\n private editorRow: HTMLElement | null = null;\n private inputs: Map<string, HTMLInputElement> = new Map();\n private originalValues: Map<string, string> = new Map();\n\n init(grid: any): void {\n this.grid = grid;\n }\n\n startEdit(rowIndex: number): void {\n if (this.editorRow) this.cancelEdit();\n\n const store = this.grid.getStore();\n const record = store.getAt(rowIndex);\n if (!record) return;\n\n this.activeRowIndex = rowIndex;\n const columns = this.grid.getColumns();\n\n // Find the data row\n const table = this.grid.getView()?.getTable?.();\n if (!table) return;\n const rows = table.querySelectorAll('tbody tr.x-grid-row');\n const targetRow = rows[rowIndex] as HTMLElement;\n if (!targetRow) return;\n\n // Create editor row\n this.editorRow = document.createElement('tr');\n this.editorRow.classList.add('x-grid-row-editor');\n this.inputs.clear();\n this.originalValues.clear();\n\n for (const col of columns) {\n const td = document.createElement('td');\n td.classList.add('x-grid-cell');\n\n if (col.config?.editor) {\n const input = document.createElement('input');\n input.type = 'text';\n const val = String(record.get(col.dataIndex) ?? '');\n input.value = val;\n this.inputs.set(col.dataIndex, input);\n this.originalValues.set(col.dataIndex, val);\n td.appendChild(input);\n } else {\n td.textContent = String(col.getCellValue(record) ?? '');\n }\n\n this.editorRow.appendChild(td);\n }\n\n // Replace the data row with editor row\n targetRow.style.display = 'none';\n targetRow.after(this.editorRow);\n\n this.grid?.fire?.('beforeedit', this.grid, { record, rowIndex });\n }\n\n completeEdit(): void {\n if (this.activeRowIndex < 0 || !this.grid) return;\n\n const store = this.grid.getStore();\n const record = store.getAt(this.activeRowIndex);\n if (!record) return;\n\n for (const [field, input] of this.inputs) {\n record.set(field, input.value);\n }\n\n this.grid.fire?.('edit', this.grid, { record, rowIndex: this.activeRowIndex });\n this.teardown();\n\n // Refresh the view\n this.grid.getView()?.refresh?.();\n }\n\n cancelEdit(): void {\n this.grid?.fire?.('canceledit', this.grid);\n this.teardown();\n }\n\n private teardown(): void {\n if (this.editorRow?.parentNode) {\n // Show original row again\n const prev = this.editorRow.previousElementSibling as HTMLElement;\n if (prev) prev.style.display = '';\n this.editorRow.remove();\n }\n this.editorRow = null;\n this.inputs.clear();\n this.originalValues.clear();\n this.activeRowIndex = -1;\n }\n}\n","/**\n * @framesquared/grid – RowExpander plugin\n *\n * Adds an expand button to each row. Clicking toggles a body\n * row below with custom content.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nexport interface RowExpanderConfig {\n rowBodyTpl: (record: any) => string;\n singleExpand?: boolean;\n}\n\nexport class RowExpander {\n private grid: any = null;\n private rowBodyTpl: (record: any) => string;\n private singleExpand: boolean;\n private expandedRows = new Set<number>();\n\n constructor(config: RowExpanderConfig) {\n this.rowBodyTpl = config.rowBodyTpl;\n this.singleExpand = config.singleExpand ?? false;\n }\n\n init(grid: any): void {\n this.grid = grid;\n this.addExpanders();\n }\n\n private addExpanders(): void {\n const view = this.grid?.getView?.();\n if (!view) return;\n const table = view.getTable?.();\n if (!table) return;\n\n const store = this.grid.getStore();\n const records = store.getRange();\n const columns = this.grid.getColumns();\n const rows = table.querySelectorAll('tbody tr.x-grid-row');\n\n for (let i = 0; i < rows.length && i < records.length; i++) {\n const row = rows[i] as HTMLElement;\n const record = records[i];\n\n // Insert expander cell at beginning\n const expanderTd = document.createElement('td');\n expanderTd.classList.add('x-grid-cell');\n const btn = document.createElement('span');\n btn.classList.add('x-grid-row-expander');\n btn.textContent = '+';\n btn.style.cursor = 'pointer';\n expanderTd.appendChild(btn);\n row.insertBefore(expanderTd, row.firstChild);\n\n btn.addEventListener('click', () => {\n this.toggle(i, record, row, columns.length + 1);\n });\n }\n }\n\n private toggle(rowIndex: number, record: any, row: HTMLElement, colSpan: number): void {\n if (this.expandedRows.has(rowIndex)) {\n this.collapseRow(rowIndex, row);\n } else {\n if (this.singleExpand) this.collapseAll();\n this.expandRow(rowIndex, record, row, colSpan);\n }\n }\n\n private expandRow(rowIndex: number, record: any, row: HTMLElement, colSpan: number): void {\n this.expandedRows.add(rowIndex);\n const bodyRow = document.createElement('tr');\n bodyRow.classList.add('x-grid-rowexpand-body');\n bodyRow.setAttribute('data-expand-row', String(rowIndex));\n const td = document.createElement('td');\n td.colSpan = colSpan;\n td.innerHTML = this.rowBodyTpl(record);\n bodyRow.appendChild(td);\n row.after(bodyRow);\n }\n\n private collapseRow(rowIndex: number, _row: HTMLElement): void {\n this.expandedRows.delete(rowIndex);\n const table = this.grid?.getView?.()?.getTable?.();\n if (!table) return;\n const bodyRow = table.querySelector(`tr[data-expand-row=\"${rowIndex}\"]`);\n bodyRow?.remove();\n }\n\n private collapseAll(): void {\n const table = this.grid?.getView?.()?.getTable?.();\n if (!table) return;\n for (const idx of this.expandedRows) {\n const bodyRow = table.querySelector(`tr[data-expand-row=\"${idx}\"]`);\n bodyRow?.remove();\n }\n this.expandedRows.clear();\n }\n}\n","/**\n * @framesquared/grid – Clipboard plugin\n *\n * Copies grid data to the clipboard in TSV (tab-separated) format\n * for spreadsheet compatibility.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nexport class GridClipboard {\n private grid: any = null;\n\n init(grid: any): void {\n this.grid = grid;\n }\n\n getGridText(): string {\n if (!this.grid) return '';\n const store = this.grid.getStore();\n const records = store.getRange();\n const columns = this.grid.getColumns();\n\n const lines: string[] = [];\n\n // Header\n lines.push(columns.map((c: any) => c.text).join('\\t'));\n\n // Data\n for (const rec of records) {\n const cells = columns.map((c: any) => {\n const val = c.getCellValue(rec);\n return val === null || val === undefined ? '' : String(val);\n });\n lines.push(cells.join('\\t'));\n }\n\n return lines.join('\\n');\n }\n\n async doCopy(): Promise<void> {\n const text = this.getGridText();\n this.grid?.fire?.('beforecopy', this.grid, text);\n\n try {\n if (navigator?.clipboard?.writeText) {\n await navigator.clipboard.writeText(text);\n }\n } catch {\n // Clipboard API may not be available\n }\n\n this.grid?.fire?.('copy', this.grid, text);\n }\n}\n","/**\n * @framesquared/grid – DragDrop plugin\n *\n * Enables row reordering via drag and drop. Adds draggable\n * attributes to rows and provides a moveRow method.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nexport class GridDragDrop {\n private grid: any = null;\n\n init(grid: any): void {\n this.grid = grid;\n this.setupDrag();\n }\n\n private setupDrag(): void {\n const view = this.grid?.getView?.();\n if (!view) return;\n const table = view.getTable?.();\n if (!table) return;\n\n const rows = table.querySelectorAll('tbody tr.x-grid-row');\n for (const row of rows) {\n row.setAttribute('draggable', 'true');\n\n row.addEventListener('dragstart', (e: DragEvent) => {\n const idx = row.getAttribute('data-rowindex');\n e.dataTransfer?.setData('text/plain', idx ?? '');\n this.grid?.fire?.('beforedrop', this.grid, parseInt(idx ?? '0', 10));\n });\n\n row.addEventListener('dragover', (e: DragEvent) => {\n e.preventDefault();\n });\n\n row.addEventListener('drop', (e: DragEvent) => {\n e.preventDefault();\n const fromIdx = parseInt(e.dataTransfer?.getData('text/plain') ?? '0', 10);\n const toIdx = parseInt(row.getAttribute('data-rowindex') ?? '0', 10);\n if (fromIdx !== toIdx) this.moveRow(fromIdx, toIdx);\n });\n }\n }\n\n moveRow(fromIndex: number, toIndex: number): void {\n const store = this.grid?.getStore?.();\n if (!store) return;\n\n const records = store.data?.items;\n if (!records || fromIndex >= records.length) return;\n\n const [moved] = records.splice(fromIndex, 1);\n records.splice(toIndex, 0, moved);\n\n this.grid?.fire?.('drop', this.grid, moved, fromIndex, toIndex);\n\n // Refresh grid\n this.grid?.getView?.()?.refresh?.();\n }\n}\n","/**\n * @framesquared/grid – RowSelectionModel\n *\n * Row-level selection model supporting SINGLE, SIMPLE, and MULTI modes.\n * Optional checkbox column for visual selection.\n *\n * Works with any Grid that implements getStore()/getView() and any Store\n * that implements the GridStore interface.\n */\n\nimport type { GridStore, GridRecord } from '../GridStore.js';\nimport type { GridView } from '../GridView.js';\n\nexport interface RowSelectionModelConfig {\n mode?: 'SINGLE' | 'SIMPLE' | 'MULTI';\n checkboxSelect?: boolean;\n}\n\nexport interface SelectableGrid {\n getStore(): GridStore | null;\n getView(): GridView | null;\n}\n\nexport class RowSelectionModel {\n private grid: SelectableGrid | null = null;\n private mode: string;\n private checkboxSelect: boolean;\n private selected = new Set<GridRecord>();\n private listeners: Record<string, Function[]> = {};\n\n constructor(config: RowSelectionModelConfig = {}) {\n this.mode = config.mode ?? 'SINGLE';\n this.checkboxSelect = config.checkboxSelect ?? false;\n }\n\n on(event: string, fn: Function): void {\n (this.listeners[event] ??= []).push(fn);\n }\n\n private fire(event: string, ...args: unknown[]): void {\n (this.listeners[event] ?? []).forEach(fn => fn(...args));\n }\n\n init(grid: SelectableGrid): void {\n this.grid = grid;\n this.attachRowListeners();\n const view = grid.getView();\n if (view) view.isSelected = (record) => this.selected.has(record);\n if (this.checkboxSelect) this.addCheckboxColumn();\n }\n\n // -----------------------------------------------------------------------\n // Selection API\n // -----------------------------------------------------------------------\n\n select(record: GridRecord, keepExisting = false): void {\n if (!record) return;\n this.fire('beforeselect', this, record);\n\n if (this.mode === 'SINGLE') {\n for (const r of this.selected) {\n if (r !== record) this.doDeselect(r);\n }\n if (this.selected.has(record)) return;\n this.doSelect(record);\n } else if (this.mode === 'SIMPLE') {\n if (this.selected.has(record)) {\n this.doDeselect(record);\n } else {\n this.doSelect(record);\n }\n } else {\n // MULTI\n if (keepExisting) {\n if (this.selected.has(record)) {\n this.doDeselect(record);\n return;\n }\n this.doSelect(record);\n } else {\n for (const r of this.selected) {\n if (r !== record) this.doDeselect(r);\n }\n this.doSelect(record);\n }\n }\n }\n\n deselect(record: GridRecord): void {\n if (this.selected.has(record)) {\n this.doDeselect(record);\n }\n }\n\n selectRange(start: GridRecord, end: GridRecord): void {\n const store = this.grid?.getStore();\n if (!store) return;\n const records = store.getRange();\n const startIdx = records.indexOf(start);\n const endIdx = records.indexOf(end);\n if (startIdx < 0 || endIdx < 0) return;\n\n const low = Math.min(startIdx, endIdx);\n const high = Math.max(startIdx, endIdx);\n for (let i = low; i <= high; i++) {\n this.doSelect(records[i]);\n }\n }\n\n selectAll(): void {\n const store = this.grid?.getStore();\n if (!store) return;\n for (const rec of store.getRange()) {\n this.doSelect(rec);\n }\n }\n\n deselectAll(): void {\n for (const rec of [...this.selected]) {\n this.doDeselect(rec);\n }\n }\n\n getSelection(): GridRecord[] {\n return [...this.selected];\n }\n\n isSelected(record: GridRecord): boolean {\n return this.selected.has(record);\n }\n\n getCount(): number {\n return this.selected.size;\n }\n\n // -----------------------------------------------------------------------\n // Internal\n // -----------------------------------------------------------------------\n\n private doSelect(record: GridRecord): void {\n if (this.selected.has(record)) return;\n this.selected.add(record);\n this.updateRowClass(record, true);\n this.fire('select', this, record);\n this.fire('selectionchange', this, this.getSelection());\n }\n\n private doDeselect(record: GridRecord): void {\n this.selected.delete(record);\n this.updateRowClass(record, false);\n this.fire('deselect', this, record);\n this.fire('selectionchange', this, this.getSelection());\n }\n\n private updateRowClass(record: GridRecord, selected: boolean): void {\n const store = this.grid?.getStore();\n if (!store) return;\n const records = store.getRange();\n const idx = records.indexOf(record);\n if (idx < 0) return;\n\n const view = this.grid!.getView();\n const table = view?.getTable();\n if (!table) return;\n const row = table.querySelector(`tbody tr[data-rowindex=\"${idx}\"]`) as HTMLElement;\n if (row) {\n row.classList.toggle('x-grid-row-selected', selected);\n }\n }\n\n // -----------------------------------------------------------------------\n // Row click listener\n // -----------------------------------------------------------------------\n\n private attachRowListeners(): void {\n const view = this.grid?.getView();\n const table = view?.getTable();\n if (!table) return;\n\n table.addEventListener('click', (e: MouseEvent) => {\n const tr = (e.target as HTMLElement).closest('tr.x-grid-row') as HTMLElement;\n if (!tr) return;\n\n if ((e.target as HTMLElement).closest('.x-grid-row-checker')) return;\n\n const rowIdx = parseInt(tr.getAttribute('data-rowindex') ?? '-1', 10);\n const store = this.grid!.getStore();\n if (!store) return;\n const record = store.getAt(rowIdx);\n if (!record) return;\n\n if (this.mode === 'MULTI' && e.ctrlKey) {\n this.select(record, true);\n } else if (this.mode === 'MULTI' && e.shiftKey) {\n const sel = this.getSelection();\n const anchor = sel.length > 0 ? sel[sel.length - 1] : record;\n this.deselectAll();\n this.selectRange(anchor, record);\n } else if (this.mode === 'SIMPLE') {\n this.select(record);\n } else {\n this.select(record);\n }\n });\n }\n\n // -----------------------------------------------------------------------\n // Checkbox column\n // -----------------------------------------------------------------------\n\n private addCheckboxColumn(): void {\n const view = this.grid?.getView();\n const table = view?.getTable();\n if (!table) return;\n\n const store = this.grid!.getStore();\n if (!store) return;\n const records = store.getRange();\n\n // Header checkbox\n const thead = table.querySelector('thead tr');\n if (thead) {\n const th = document.createElement('th');\n th.classList.add('x-column-header');\n const headerCb = document.createElement('input');\n headerCb.type = 'checkbox';\n headerCb.classList.add('x-grid-header-checker');\n headerCb.addEventListener('click', () => {\n if (headerCb.checked) this.selectAll();\n else this.deselectAll();\n });\n th.appendChild(headerCb);\n thead.insertBefore(th, thead.firstChild);\n }\n\n // Row checkboxes\n const rows = table.querySelectorAll('tbody tr.x-grid-row');\n for (let i = 0; i < rows.length && i < records.length; i++) {\n const row = rows[i];\n const record = records[i];\n const td = document.createElement('td');\n td.classList.add('x-grid-cell');\n const cb = document.createElement('input');\n cb.type = 'checkbox';\n cb.classList.add('x-grid-row-checker');\n cb.addEventListener('click', (e) => {\n e.stopPropagation();\n if (cb.checked) {\n this.doSelect(record);\n } else {\n this.doDeselect(record);\n }\n });\n td.appendChild(cb);\n row.insertBefore(td, row.firstChild);\n }\n }\n}\n","/**\n * @framesquared/grid – CellSelectionModel\n *\n * Selects individual cells. Supports navigation via arrow keys\n * and Tab/Shift+Tab. Selected cell gets x-grid-cell-selected class.\n */\n\nimport type { SelectableGrid } from './RowSelectionModel.js';\nimport type { Column } from '../column/Column.js';\n\nexport interface CellPosition {\n row: number;\n column: number;\n}\n\ninterface CellSelectableGrid extends SelectableGrid {\n getColumns(): Column[];\n el: HTMLElement | null;\n}\n\nexport class CellSelectionModel {\n private grid: CellSelectableGrid | null = null;\n private position: CellPosition | null = null;\n private listeners: Record<string, Function[]> = {};\n private maxRow = 0;\n private maxCol = 0;\n\n on(event: string, fn: Function): void {\n (this.listeners[event] ??= []).push(fn);\n }\n\n private fire(event: string, ...args: unknown[]): void {\n (this.listeners[event] ?? []).forEach(fn => fn(...args));\n }\n\n init(grid: CellSelectableGrid): void {\n this.grid = grid;\n const store = grid.getStore();\n this.maxRow = (store?.getCount() ?? 1) - 1;\n this.maxCol = grid.getColumns().length - 1;\n this.attachListeners();\n }\n\n getCurrentPosition(): CellPosition | null {\n return this.position ? { ...this.position } : null;\n }\n\n // -----------------------------------------------------------------------\n // Internal\n // -----------------------------------------------------------------------\n\n private selectCell(row: number, col: number): void {\n this.clearSelection();\n\n row = Math.max(0, Math.min(row, this.maxRow));\n col = Math.max(0, Math.min(col, this.maxCol));\n this.position = { row, column: col };\n\n const cell = this.getCellElement(row, col);\n if (cell) cell.classList.add('x-grid-cell-selected');\n\n this.fire('selectionchange', this, this.position);\n }\n\n private clearSelection(): void {\n if (!this.grid) return;\n const table = this.grid.getView()?.getTable();\n if (!table) return;\n const selected = table.querySelectorAll('.x-grid-cell-selected');\n for (const el of selected) el.classList.remove('x-grid-cell-selected');\n }\n\n private getCellElement(row: number, col: number): HTMLElement | null {\n const table = this.grid?.getView()?.getTable();\n if (!table) return null;\n const tr = table.querySelector(`tbody tr[data-rowindex=\"${row}\"]`);\n if (!tr) return null;\n return tr.children[col] as HTMLElement ?? null;\n }\n\n private attachListeners(): void {\n const view = this.grid?.getView();\n const table = view?.getTable();\n if (!table) return;\n\n // Cell click\n table.addEventListener('click', (e: MouseEvent) => {\n const td = (e.target as HTMLElement).closest('td.x-grid-cell') as HTMLElement;\n if (!td) return;\n const tr = td.closest('tr.x-grid-row') as HTMLElement;\n if (!tr) return;\n const rowIdx = parseInt(tr.getAttribute('data-rowindex') ?? '0', 10);\n const colIdx = Array.from(tr.children).indexOf(td);\n this.selectCell(rowIdx, colIdx);\n });\n\n // Keyboard navigation\n if (this.grid!.el) {\n this.grid!.el.setAttribute('tabindex', '0');\n this.grid!.el.addEventListener('keydown', (e: KeyboardEvent) => {\n if (!this.position) return;\n let { row, column } = this.position;\n\n switch (e.key) {\n case 'ArrowRight': column++; break;\n case 'ArrowLeft': column--; break;\n case 'ArrowDown': row++; break;\n case 'ArrowUp': row--; break;\n case 'Tab':\n e.preventDefault();\n if (e.shiftKey) column--;\n else column++;\n break;\n default: return;\n }\n\n this.selectCell(row, column);\n });\n }\n }\n}\n","/**\n * @framesquared/grid – SpreadsheetSelectionModel\n *\n * Spreadsheet-like selection: click selects a cell, Shift+click\n * extends to a range. Selected cells get x-grid-cell-selected class.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nexport interface SelectionRange {\n startRow: number;\n startCol: number;\n endRow: number;\n endCol: number;\n}\n\nexport class SpreadsheetSelectionModel {\n private grid: any = null;\n private range: SelectionRange | null = null;\n private listeners: Record<string, Function[]> = {};\n\n on(event: string, fn: Function): void {\n (this.listeners[event] ??= []).push(fn);\n }\n\n private fire(event: string, ...args: unknown[]): void {\n (this.listeners[event] ?? []).forEach(fn => fn(...args));\n }\n\n init(grid: any): void {\n this.grid = grid;\n this.attachListeners();\n }\n\n getSelectedRange(): SelectionRange | null {\n return this.range ? { ...this.range } : null;\n }\n\n // -----------------------------------------------------------------------\n // Internal\n // -----------------------------------------------------------------------\n\n private attachListeners(): void {\n const view = this.grid?.getView?.();\n const table = view?.getTable?.();\n if (!table) return;\n\n table.addEventListener('click', (e: MouseEvent) => {\n const td = (e.target as HTMLElement).closest('td.x-grid-cell') as HTMLElement;\n if (!td) return;\n const tr = td.closest('tr.x-grid-row') as HTMLElement;\n if (!tr) return;\n const rowIdx = parseInt(tr.getAttribute('data-rowindex') ?? '0', 10);\n const colIdx = Array.from(tr.children).indexOf(td);\n\n if (e.shiftKey && this.range) {\n // Extend range\n this.range = {\n startRow: this.range.startRow,\n startCol: this.range.startCol,\n endRow: rowIdx,\n endCol: colIdx,\n };\n } else {\n // New single-cell selection\n this.range = {\n startRow: rowIdx,\n startCol: colIdx,\n endRow: rowIdx,\n endCol: colIdx,\n };\n }\n\n this.highlightRange();\n this.fire('selectionchange', this, this.range);\n });\n }\n\n private highlightRange(): void {\n const table = this.grid?.getView()?.getTable?.();\n if (!table || !this.range) return;\n\n // Clear previous\n const prev = table.querySelectorAll('.x-grid-cell-selected');\n for (const el of prev) el.classList.remove('x-grid-cell-selected');\n\n const { startRow, startCol, endRow, endCol } = this.range;\n const minRow = Math.min(startRow, endRow);\n const maxRow = Math.max(startRow, endRow);\n const minCol = Math.min(startCol, endCol);\n const maxCol = Math.max(startCol, endCol);\n\n const rows = table.querySelectorAll('tbody tr.x-grid-row');\n for (let r = minRow; r <= maxRow && r < rows.length; r++) {\n const row = rows[r];\n for (let c = minCol; c <= maxCol && c < row.children.length; c++) {\n (row.children[c] as HTMLElement).classList.add('x-grid-cell-selected');\n }\n }\n }\n}\n","/**\n * @framesquared/grid – Lockable\n *\n * Splits a grid into locked (frozen left) and normal (scrollable right)\n * panels. Columns with config.locked=true go into the locked panel.\n * Locked panel does not scroll horizontally.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nexport class Lockable {\n private grid: any = null;\n\n init(grid: any): void {\n this.grid = grid;\n this.rebuild();\n }\n\n private rebuild(): void {\n const grid = this.grid;\n const view = grid?.getView?.();\n const table = view?.getTable?.();\n if (!table || !grid.el) return;\n\n const store = grid.getStore();\n const records = store.getRange();\n const columns = grid.getColumns();\n\n const lockedCols = columns.filter((c: any) => c.config?.locked);\n const normalCols = columns.filter((c: any) => !c.config?.locked);\n\n if (lockedCols.length === 0) return; // nothing to lock\n\n // Get the panel body\n const body = grid.getBodyEl();\n\n // Remove the original table\n table.remove();\n\n // Container: flex row\n const container = document.createElement('div');\n container.classList.add('x-grid-lock-container');\n container.style.display = 'flex';\n container.style.width = '100%';\n container.style.overflow = 'hidden';\n\n // Locked panel\n const lockedPanel = document.createElement('div');\n lockedPanel.classList.add('x-grid-locked');\n lockedPanel.style.overflowX = 'hidden';\n lockedPanel.style.overflowY = 'auto';\n lockedPanel.style.flexShrink = '0';\n lockedPanel.appendChild(this.buildTable(lockedCols, records));\n\n // Normal panel\n const normalPanel = document.createElement('div');\n normalPanel.classList.add('x-grid-normal');\n normalPanel.style.overflowX = 'auto';\n normalPanel.style.overflowY = 'auto';\n normalPanel.style.flexGrow = '1';\n normalPanel.appendChild(this.buildTable(normalCols, records));\n\n // Sync vertical scroll\n lockedPanel.addEventListener('scroll', () => {\n normalPanel.scrollTop = lockedPanel.scrollTop;\n });\n normalPanel.addEventListener('scroll', () => {\n lockedPanel.scrollTop = normalPanel.scrollTop;\n });\n\n container.appendChild(lockedPanel);\n container.appendChild(normalPanel);\n body.appendChild(container);\n }\n\n private buildTable(columns: any[], records: any[]): HTMLTableElement {\n const table = document.createElement('table');\n table.classList.add('x-grid-table');\n table.style.width = '100%';\n table.style.borderCollapse = 'collapse';\n\n // Thead\n const thead = document.createElement('thead');\n const headerRow = document.createElement('tr');\n for (const col of columns) {\n const th = document.createElement('th');\n th.classList.add('x-column-header');\n th.textContent = col.text;\n if (col.width > 0) th.style.width = `${col.width}px`;\n headerRow.appendChild(th);\n }\n thead.appendChild(headerRow);\n table.appendChild(thead);\n\n // Tbody\n const tbody = document.createElement('tbody');\n for (let ri = 0; ri < records.length; ri++) {\n const rec = records[ri];\n const tr = document.createElement('tr');\n tr.classList.add('x-grid-row');\n tr.setAttribute('data-rowindex', String(ri));\n if (ri % 2 === 1) tr.classList.add('x-grid-row-alt');\n\n for (let ci = 0; ci < columns.length; ci++) {\n const col = columns[ci];\n const td = document.createElement('td');\n td.classList.add('x-grid-cell');\n const val = col.getCellValue(rec);\n td.innerHTML = col.renderCellHtml(val, {}, rec, ri, ci);\n tr.appendChild(td);\n }\n tbody.appendChild(tr);\n }\n table.appendChild(tbody);\n\n return table;\n }\n}\n","/**\n * @framesquared/grid – GridState\n *\n * Saves and restores grid column state (widths, hidden, order)\n * and sort state to localStorage.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nexport interface GridStateConfig {\n stateId: string;\n}\n\ninterface ColumnState {\n dataIndex: string;\n width: number;\n hidden: boolean;\n}\n\ninterface SavedState {\n columns: ColumnState[];\n sort?: { field: string; direction: string };\n}\n\nexport class GridState {\n private grid: any = null;\n private stateId: string;\n\n constructor(config: GridStateConfig) {\n this.stateId = config.stateId;\n }\n\n init(grid: any): void {\n this.grid = grid;\n }\n\n private get storageKey(): string {\n return `ext-grid-state-${this.stateId}`;\n }\n\n save(): void {\n if (!this.grid) return;\n\n const columns = this.grid.getColumns();\n const view = this.grid.getView?.();\n const ths = view?.headerContainer?.getThElements?.() ?? [];\n\n const colState: ColumnState[] = columns.map((col: any, i: number) => ({\n dataIndex: col.dataIndex,\n width: col.width,\n hidden: ths[i] ? ths[i].style.display === 'none' : col.hidden,\n }));\n\n const state: SavedState = { columns: colState };\n\n // Sort state\n const sortIdx = (this.grid as any)._sortColumnIndex;\n const sortDir = (this.grid as any)._sortDirection;\n if (sortIdx >= 0 && columns[sortIdx]) {\n state.sort = {\n field: columns[sortIdx].dataIndex,\n direction: sortDir,\n };\n }\n\n localStorage.setItem(this.storageKey, JSON.stringify(state));\n }\n\n restore(): void {\n if (!this.grid) return;\n const raw = localStorage.getItem(this.storageKey);\n if (!raw) return;\n\n let state: SavedState;\n try { state = JSON.parse(raw); } catch { return; }\n\n const columns = this.grid.getColumns();\n\n if (state.columns) {\n for (const saved of state.columns) {\n const idx = columns.findIndex((c: any) => c.dataIndex === saved.dataIndex);\n if (idx < 0) continue;\n if (saved.hidden) {\n this.grid.hideColumn(idx);\n } else {\n this.grid.showColumn(idx);\n }\n }\n }\n }\n\n clear(): void {\n localStorage.removeItem(this.storageKey);\n }\n}\n","/**\n * @framesquared/grid – TreePanel\n *\n * Displays hierarchical data from a TreeStore. Each node is\n * rendered with depth-based indentation, expand/collapse icons,\n * folder/leaf icons, and optional checkboxes with cascade behavior.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { Panel } from '@framesquared/ui';\nimport type { PanelConfig } from '@framesquared/ui';\nimport type { TreeStore, TreeNode } from './TreeStore.js';\n\n// ---------------------------------------------------------------------------\n// Config\n// ---------------------------------------------------------------------------\n\nexport interface TreePanelConfig extends PanelConfig {\n store?: TreeStore;\n rootVisible?: boolean;\n singleExpand?: boolean;\n useArrows?: boolean;\n lines?: boolean;\n animate?: boolean;\n checkable?: boolean;\n cascadeCheck?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// TreePanel\n// ---------------------------------------------------------------------------\n\nexport class TreePanel extends Panel {\n static override $className = 'Ext.tree.Panel';\n\n declare private _treeStore: TreeStore;\n declare private _rootVisible: boolean;\n declare private _singleExpand: boolean;\n declare private _checkable: boolean;\n declare private _cascadeCheck: boolean;\n declare private _treeBody: HTMLElement | null;\n declare private _checkedSet: Set<string>;\n\n constructor(config: TreePanelConfig = {}) {\n super({ xtype: 'treepanel', ...config });\n }\n\n protected override initialize(): void {\n super.initialize();\n const cfg = this._config as TreePanelConfig;\n this._treeStore = cfg.store as TreeStore;\n this._rootVisible = cfg.rootVisible ?? true;\n this._singleExpand = cfg.singleExpand ?? false;\n this._checkable = cfg.checkable ?? false;\n this._cascadeCheck = cfg.cascadeCheck ?? false;\n this._treeBody = null;\n this._checkedSet = new Set();\n }\n\n protected override afterRender(): void {\n super.afterRender();\n const cfg = this._config as TreePanelConfig;\n this.el!.classList.add('x-treepanel');\n if (cfg.useArrows) this.el!.classList.add('x-tree-arrows');\n if (cfg.lines) this.el!.classList.add('x-tree-lines');\n\n this._treeBody = document.createElement('div');\n this._treeBody.classList.add('x-tree-body');\n this.getBodyEl().appendChild(this._treeBody);\n\n this.renderTree();\n }\n\n // -----------------------------------------------------------------------\n // Rendering\n // -----------------------------------------------------------------------\n\n refresh(): void {\n this.renderTree();\n }\n\n private renderTree(): void {\n if (!this._treeBody || !this._treeStore) return;\n this._treeBody.innerHTML = '';\n\n const nodes = this._treeStore.getVisibleNodes(this._rootVisible);\n for (const node of nodes) {\n this._treeBody.appendChild(this.createNodeElement(node));\n }\n }\n\n private createNodeElement(node: TreeNode): HTMLElement {\n const row = document.createElement('div');\n row.classList.add('x-tree-node');\n row.setAttribute('data-node-id', node.id);\n\n // Indent\n const indent = document.createElement('span');\n indent.classList.add('x-tree-indent');\n const indentLevel = this._rootVisible ? node.depth : Math.max(0, node.depth - 1);\n indent.style.paddingLeft = `${indentLevel * 20}px`;\n row.appendChild(indent);\n\n // Expander\n if (!node.leaf) {\n const expander = document.createElement('span');\n expander.classList.add('x-tree-expander');\n expander.textContent = node.expanded ? '▾' : '▸';\n expander.style.cursor = 'pointer';\n expander.addEventListener('click', (e) => {\n e.stopPropagation();\n this.toggleNode(node);\n });\n row.appendChild(expander);\n } else {\n // Spacer for leaf alignment\n const spacer = document.createElement('span');\n spacer.classList.add('x-tree-expander-spacer');\n spacer.textContent = ' ';\n row.appendChild(spacer);\n }\n\n // Checkbox\n if (this._checkable) {\n const cb = document.createElement('input');\n cb.type = 'checkbox';\n cb.classList.add('x-tree-checkbox');\n cb.checked = node.checked;\n cb.addEventListener('click', (e) => {\n e.stopPropagation();\n const checked = cb.checked;\n node.checked = checked;\n if (this._cascadeCheck) {\n this._treeStore.cascadeCheck(node, checked);\n }\n this.fire('checkchange', this, node, checked);\n // Re-render to update child checkboxes\n this.renderTree();\n });\n row.appendChild(cb);\n }\n\n // Icon\n const icon = document.createElement('span');\n icon.classList.add('x-tree-icon', node.leaf ? 'x-tree-icon-leaf' : 'x-tree-icon-folder');\n row.appendChild(icon);\n\n // Text\n const text = document.createElement('span');\n text.classList.add('x-tree-node-text');\n text.textContent = node.text;\n row.appendChild(text);\n\n return row;\n }\n\n // -----------------------------------------------------------------------\n // Expand / Collapse\n // -----------------------------------------------------------------------\n\n private toggleNode(node: TreeNode): void {\n if (node.expanded) {\n this.collapseNode(node);\n } else {\n this.expandNode(node);\n }\n }\n\n private expandNode(node: TreeNode): void {\n this.fire('beforeitemexpand', this, node);\n\n if (this._singleExpand && node.parent) {\n // Collapse siblings\n for (const sibling of node.parent.children) {\n if (sibling !== node && sibling.expanded) {\n this._treeStore.collapseAll(sibling);\n }\n }\n }\n\n node.expanded = true;\n this.fire('itemexpand', this, node);\n this.renderTree();\n }\n\n private collapseNode(node: TreeNode): void {\n this.fire('beforeitemcollapse', this, node);\n node.expanded = false;\n this.fire('itemcollapse', this, node);\n this.renderTree();\n }\n\n expandAll(): void {\n this._treeStore.expandAll();\n this.renderTree();\n }\n\n collapseAll(): void {\n this._treeStore.collapseAll();\n this.renderTree();\n }\n\n async expandPath(path: string): Promise<void> {\n const node = this._treeStore.findByPath(path);\n if (!node) return;\n this._treeStore.expandToNode(node);\n this.renderTree();\n }\n\n // -----------------------------------------------------------------------\n // Checkbox\n // -----------------------------------------------------------------------\n\n getChecked(): TreeNode[] {\n return this._treeStore.getChecked();\n }\n\n // -----------------------------------------------------------------------\n // Accessors\n // -----------------------------------------------------------------------\n\n getStore(): TreeStore {\n return this._treeStore;\n }\n}\n","/**\n * @framesquared/grid – TreeStore\n *\n * Manages hierarchical data. Each node has text, children, id,\n * leaf/expanded state, and optional checked state. Provides\n * traversal, path resolution, and mutation helpers.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\n// ---------------------------------------------------------------------------\n// TreeNode\n// ---------------------------------------------------------------------------\n\nexport interface TreeNodeConfig {\n id?: string;\n text: string;\n leaf?: boolean;\n expanded?: boolean;\n checked?: boolean;\n children?: TreeNodeConfig[];\n [key: string]: unknown;\n}\n\nexport interface TreeNode {\n id: string;\n text: string;\n leaf: boolean;\n expanded: boolean;\n checked: boolean;\n children: TreeNode[];\n parent: TreeNode | null;\n depth: number;\n data: Record<string, unknown>;\n}\n\n// ---------------------------------------------------------------------------\n// TreeStore\n// ---------------------------------------------------------------------------\n\nexport interface TreeStoreConfig {\n root: TreeNodeConfig;\n}\n\nlet nodeCounter = 0;\n\nfunction buildNode(cfg: TreeNodeConfig, parent: TreeNode | null, depth: number): TreeNode {\n const node: TreeNode = {\n id: cfg.id ?? `tree-node-${nodeCounter++}`,\n text: cfg.text,\n leaf: cfg.leaf ?? (!cfg.children || cfg.children.length === 0),\n expanded: cfg.expanded ?? false,\n checked: cfg.checked ?? false,\n children: [],\n parent,\n depth,\n data: { ...cfg },\n };\n if (cfg.children) {\n node.children = cfg.children.map(c => buildNode(c, node, depth + 1));\n }\n return node;\n}\n\nexport class TreeStore {\n private root: TreeNode;\n private nodeMap = new Map<string, TreeNode>();\n\n constructor(config: TreeStoreConfig) {\n nodeCounter = 0;\n this.root = buildNode(config.root, null, 0);\n this.buildMap(this.root);\n }\n\n private buildMap(node: TreeNode): void {\n this.nodeMap.set(node.id, node);\n for (const child of node.children) this.buildMap(child);\n }\n\n getRoot(): TreeNode {\n return this.root;\n }\n\n getNodeById(id: string): TreeNode | null {\n return this.nodeMap.get(id) ?? null;\n }\n\n /**\n * Returns visible nodes in display order (respecting expanded state).\n * If rootVisible is true, the root is included.\n */\n getVisibleNodes(rootVisible = true): TreeNode[] {\n const result: TreeNode[] = [];\n const walk = (node: TreeNode, include: boolean) => {\n if (include) result.push(node);\n if (node.expanded || node === this.root && !include) {\n // If this is the invisible root, still walk children\n }\n if (node.expanded) {\n for (const child of node.children) walk(child, true);\n }\n };\n\n if (rootVisible) {\n walk(this.root, true);\n } else {\n // Root not visible — walk root's children as top level\n for (const child of this.root.children) walk(child, true);\n }\n\n return result;\n }\n\n appendChild(parent: TreeNode, childCfg: TreeNodeConfig): TreeNode {\n const child = buildNode(childCfg, parent, parent.depth + 1);\n parent.children.push(child);\n parent.leaf = false;\n this.buildMap(child);\n return child;\n }\n\n removeNode(id: string): boolean {\n const node = this.nodeMap.get(id);\n if (!node || !node.parent) return false;\n const parent = node.parent;\n const idx = parent.children.indexOf(node);\n if (idx >= 0) parent.children.splice(idx, 1);\n this.removeFromMap(node);\n return true;\n }\n\n private removeFromMap(node: TreeNode): void {\n this.nodeMap.delete(node.id);\n for (const child of node.children) this.removeFromMap(child);\n }\n\n getPath(node: TreeNode): string {\n const parts: string[] = [];\n let current: TreeNode | null = node;\n while (current) {\n parts.unshift(current.text);\n current = current.parent;\n }\n return '/' + parts.join('/');\n }\n\n findByPath(path: string): TreeNode | null {\n const parts = path.split('/').filter(Boolean);\n let current = this.root;\n // First part should match root\n if (parts[0] !== current.text) return null;\n for (let i = 1; i < parts.length; i++) {\n const child = current.children.find(c => c.text === parts[i]);\n if (!child) return null;\n current = child;\n }\n return current;\n }\n\n /** Expand all ancestors of a node so it becomes visible. */\n expandToNode(node: TreeNode): void {\n let current = node.parent;\n while (current) {\n current.expanded = true;\n current = current.parent;\n }\n }\n\n /** Set expanded=true on all non-leaf nodes. */\n expandAll(node?: TreeNode): void {\n const target = node ?? this.root;\n if (!target.leaf) target.expanded = true;\n for (const child of target.children) this.expandAll(child);\n }\n\n /** Set expanded=false on all nodes. */\n collapseAll(node?: TreeNode): void {\n const target = node ?? this.root;\n target.expanded = false;\n for (const child of target.children) this.collapseAll(child);\n }\n\n /** Cascade checked state to all descendants. */\n cascadeCheck(node: TreeNode, checked: boolean): void {\n node.checked = checked;\n for (const child of node.children) this.cascadeCheck(child, checked);\n }\n\n /** Get all checked nodes. */\n getChecked(node?: TreeNode): TreeNode[] {\n const result: TreeNode[] = [];\n const walk = (n: TreeNode) => {\n if (n.checked) result.push(n);\n for (const child of n.children) walk(child);\n };\n walk(node ?? this.root);\n return result;\n }\n\n // Store-like interface for Grid compatibility\n getRange(): any[] { return this.getVisibleNodes(true); }\n getCount(): number { return this.getRange().length; }\n getAt(i: number): any { return this.getRange()[i]; }\n get(field: string): unknown { return (this.root as any)[field]; }\n on(_evt: string, _fn: Function): void { /* placeholder */ }\n sort(): void { /* placeholder */ }\n isLoading(): boolean { return false; }\n getTotalCount(): number { return this.getCount(); }\n}\n"],"mappings":"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","names":["Panel"]}
1
+ {"version":3,"sources":["../src/grid/Grid.ts","../src/grid/column/Column.ts","../src/grid/HeaderContainer.ts","../src/grid/GridView.ts","../src/grid/feature/Grouping.ts","../src/grid/feature/Summary.ts","../src/grid/feature/GroupingSummary.ts","../src/grid/feature/RowBody.ts","../src/grid/plugin/CellEditing.ts","../src/grid/plugin/RowEditing.ts","../src/grid/plugin/RowExpander.ts","../src/grid/plugin/Clipboard.ts","../src/grid/plugin/DragDrop.ts","../src/grid/selection/RowSelectionModel.ts","../src/grid/selection/CellSelectionModel.ts","../src/grid/selection/SpreadsheetSelectionModel.ts","../src/grid/Lockable.ts","../src/grid/state/GridState.ts","../src/tree/TreePanel.ts","../src/tree/TreeStore.ts"],"sourcesContent":["/**\n * @framesquared/grid – Grid\n *\n * The main grid panel. Extends Panel to display tabular data from\n * a Store with configurable columns, sorting, column visibility,\n * row striping, and item events.\n */\n\nimport { Panel } from '@framesquared/ui';\nimport type { PanelConfig } from '@framesquared/ui';\nimport { Column, createColumn } from './column/Column.js';\nimport type { ColumnConfig } from './column/Column.js';\nimport { GridView } from './GridView.js';\nimport type { GridStore } from './GridStore.js';\n\n// ---------------------------------------------------------------------------\n// Config\n// ---------------------------------------------------------------------------\n\nexport interface GridConfig extends PanelConfig {\n store?: GridStore;\n columns?: ColumnConfig[];\n sortableColumns?: boolean;\n enableColumnHide?: boolean;\n enableColumnResize?: boolean;\n emptyText?: string;\n scroll?: 'both' | 'horizontal' | 'vertical' | 'none';\n}\n\n// ---------------------------------------------------------------------------\n// Grid\n// ---------------------------------------------------------------------------\n\nexport class Grid extends Panel {\n static override $className = 'Ext.grid.Grid';\n\n declare _store: GridStore | null;\n declare private _columns: Column[];\n declare private _gridView: GridView | null;\n declare private _sortableColumns: boolean;\n declare private _sortDirection: 'ASC' | 'DESC';\n declare private _sortColumnIndex: number;\n\n constructor(config: GridConfig = {}) {\n super({ xtype: 'grid', ...config });\n }\n\n protected override initialize(): void {\n super.initialize();\n const cfg = this._config as GridConfig;\n this._store = cfg.store ?? null;\n this._columns = (cfg.columns ?? []).map((c) => (c instanceof Column ? c : createColumn(c)));\n this._gridView = null;\n this._sortableColumns = cfg.sortableColumns ?? true;\n this._sortDirection = 'ASC';\n this._sortColumnIndex = -1;\n }\n\n protected override afterRender(): void {\n super.afterRender();\n const cfg = this._config as GridConfig;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.el!.classList.add('x-grid');\n\n // Create the grid view (requires a store)\n if (!this._store) return;\n\n this._gridView = new GridView({\n store: this._store,\n columns: this._columns,\n emptyText: cfg.emptyText,\n });\n\n // Wire item events\n this._gridView.onItemClick = (record, rowIndex, event) => {\n this.fire('itemclick', this, record, rowIndex, event);\n };\n this._gridView.onItemDblClick = (record, rowIndex, event) => {\n this.fire('itemdblclick', this, record, rowIndex, event);\n };\n\n // Render table into panel body\n const body = this.getBodyEl();\n const table = this._gridView.render();\n body.appendChild(table);\n\n // Setup header click for sorting\n if (this._sortableColumns) {\n this.setupSortableHeaders();\n }\n\n // Store event binding\n if (this._store?.on) {\n this._store.on('datachanged', () => this.onStoreDataChanged());\n this._store.on('sort', () => this.onStoreDataChanged());\n this._store.on('filter', () => this.onStoreDataChanged());\n }\n }\n\n // -----------------------------------------------------------------------\n // Sorting\n // -----------------------------------------------------------------------\n\n private setupSortableHeaders(): void {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const ths = this._gridView!.headerContainer.getThElements();\n for (let i = 0; i < ths.length; i++) {\n const col = this._columns[i];\n if (!col.sortable) continue;\n\n ths[i].style.cursor = 'pointer';\n ths[i].addEventListener('click', () => {\n this.onHeaderClick(i);\n });\n }\n }\n\n private onHeaderClick(colIndex: number): void {\n const col = this._columns[colIndex];\n if (!col.sortable || !col.dataIndex) return;\n\n // Toggle direction\n if (this._sortColumnIndex === colIndex) {\n this._sortDirection = this._sortDirection === 'ASC' ? 'DESC' : 'ASC';\n } else {\n this._sortDirection = 'ASC';\n this._sortColumnIndex = colIndex;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this._gridView!.headerContainer.setSortIndicator(colIndex, this._sortDirection);\n\n if (this._store?.sort) {\n this._store.sort(col.dataIndex, this._sortDirection);\n }\n }\n\n // -----------------------------------------------------------------------\n // Column visibility\n // -----------------------------------------------------------------------\n\n hideColumn(index: number): void {\n if (this._gridView) {\n this._gridView.setColumnHidden(index, true);\n }\n }\n\n showColumn(index: number): void {\n if (this._gridView) {\n this._gridView.setColumnHidden(index, false);\n }\n }\n\n // -----------------------------------------------------------------------\n // Store data changed\n // -----------------------------------------------------------------------\n\n private onStoreDataChanged(): void {\n if (this._gridView) {\n this._gridView.refresh();\n }\n }\n\n // -----------------------------------------------------------------------\n // Accessors\n // -----------------------------------------------------------------------\n\n getStore(): GridStore | null {\n return this._store;\n }\n\n getColumns(): Column[] {\n return [...this._columns];\n }\n\n getView(): GridView | null {\n return this._gridView;\n }\n}\n","/**\n * @framesquared/grid – Column types\n *\n * Column (base), NumberColumn, DateColumn, BooleanColumn,\n * CheckColumn, ActionColumn, RowNumbererColumn.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\n// ---------------------------------------------------------------------------\n// Column config\n// ---------------------------------------------------------------------------\n\nexport interface ColumnConfig {\n text?: string;\n dataIndex?: string;\n width?: number;\n flex?: number;\n minWidth?: number;\n maxWidth?: number;\n sortable?: boolean;\n hideable?: boolean;\n hidden?: boolean;\n align?: 'left' | 'center' | 'right';\n renderer?: (\n value: unknown,\n metaData: any,\n record: any,\n rowIndex: number,\n colIndex: number,\n ) => string;\n menuDisabled?: boolean;\n resizable?: boolean;\n draggable?: boolean;\n tdCls?: string;\n xtype?: string;\n // Number\n format?: string;\n // Boolean\n trueText?: string;\n falseText?: string;\n // Action\n actions?: ActionConfig[];\n}\n\nexport interface ActionConfig {\n iconCls?: string;\n tooltip?: string;\n handler?: (record: any, rowIndex: number) => void;\n}\n\n// ---------------------------------------------------------------------------\n// Column (base)\n// ---------------------------------------------------------------------------\n\nexport class Column {\n readonly text: string;\n readonly dataIndex: string;\n readonly width: number;\n readonly flex: number;\n readonly minWidth: number;\n readonly maxWidth: number;\n readonly sortable: boolean;\n readonly hidden: boolean;\n readonly align: string;\n readonly config: ColumnConfig;\n\n private _renderer: ColumnConfig['renderer'] | null;\n\n constructor(config: ColumnConfig = {}) {\n this.config = config;\n this.text = config.text ?? '';\n this.dataIndex = config.dataIndex ?? '';\n this.width = config.width ?? 0;\n this.flex = config.flex ?? 0;\n this.minWidth = config.minWidth ?? 40;\n this.maxWidth = config.maxWidth ?? 0;\n this.sortable = config.sortable ?? true;\n this.hidden = config.hidden ?? false;\n this.align = config.align ?? 'left';\n this._renderer = config.renderer ?? null;\n }\n\n getCellValue(record: any): unknown {\n return record.get ? record.get(this.dataIndex) : record.data?.[this.dataIndex];\n }\n\n renderCell(\n value: unknown,\n metaData: any,\n record: any,\n rowIndex: number,\n colIndex: number,\n ): string {\n if (this._renderer) {\n return this._renderer(value, metaData, record, rowIndex, colIndex);\n }\n return this.formatValue(value);\n }\n\n formatValue(value: unknown): string {\n if (value === null || value === undefined) return '';\n return String(value);\n }\n\n /** Create the TD content — override in special columns. */\n renderCellHtml(\n value: unknown,\n _metaData: any,\n record: any,\n rowIndex: number,\n colIndex: number,\n ): string {\n return this.renderCell(value, _metaData, record, rowIndex, colIndex);\n }\n}\n\n// ---------------------------------------------------------------------------\n// NumberColumn\n// ---------------------------------------------------------------------------\n\nexport class NumberColumn extends Column {\n private _format: string;\n\n constructor(config: ColumnConfig = {}) {\n super({ ...config, xtype: 'numbercolumn' });\n this._format = config.format ?? '0';\n }\n\n override formatValue(value: unknown): string {\n if (value === null || value === undefined) return '';\n const n = Number(value);\n if (isNaN(n)) return String(value);\n\n // Simple format: '0.00' → toFixed(2), '0.0' → toFixed(1)\n const match = this._format.match(/0\\.(0+)/);\n if (match) {\n return n.toFixed(match[1].length);\n }\n return String(n);\n }\n}\n\n// ---------------------------------------------------------------------------\n// DateColumn\n// ---------------------------------------------------------------------------\n\nexport class DateColumn extends Column {\n private _format: string;\n\n constructor(config: ColumnConfig = {}) {\n super({ ...config, xtype: 'datecolumn' });\n this._format = config.format ?? 'Y-m-d';\n }\n\n override formatValue(value: unknown): string {\n if (!value) return '';\n const d = value instanceof Date ? value : new Date(String(value));\n if (isNaN(d.getTime())) return String(value);\n\n // Simple format implementation\n const Y = d.getFullYear();\n const m = String(d.getMonth() + 1).padStart(2, '0');\n const day = String(d.getDate()).padStart(2, '0');\n\n return this._format.replace('Y', String(Y)).replace('m', m).replace('d', day);\n }\n}\n\n// ---------------------------------------------------------------------------\n// BooleanColumn\n// ---------------------------------------------------------------------------\n\nexport class BooleanColumn extends Column {\n private _trueText: string;\n private _falseText: string;\n\n constructor(config: ColumnConfig = {}) {\n super({ ...config, xtype: 'booleancolumn' });\n this._trueText = config.trueText ?? 'true';\n this._falseText = config.falseText ?? 'false';\n }\n\n override formatValue(value: unknown): string {\n return value ? this._trueText : this._falseText;\n }\n}\n\n// ---------------------------------------------------------------------------\n// CheckColumn\n// ---------------------------------------------------------------------------\n\nexport class CheckColumn extends Column {\n constructor(config: ColumnConfig = {}) {\n super({ ...config, xtype: 'checkcolumn' });\n }\n\n override renderCellHtml(\n value: unknown,\n _metaData: any,\n _record: any,\n _rowIndex: number,\n _colIndex: number,\n ): string {\n const checked = value ? ' checked' : '';\n return `<input type=\"checkbox\"${checked} class=\"x-check-col-input\" />`;\n }\n}\n\n// ---------------------------------------------------------------------------\n// ActionColumn\n// ---------------------------------------------------------------------------\n\nexport class ActionColumn extends Column {\n private _actions: ActionConfig[];\n\n constructor(config: ColumnConfig = {}) {\n super({ ...config, xtype: 'actioncolumn', sortable: false });\n this._actions = config.actions ?? [];\n }\n\n get actions(): ActionConfig[] {\n return this._actions;\n }\n\n override renderCellHtml(\n _value: unknown,\n _metaData: any,\n _record: any,\n rowIndex: number,\n _colIndex: number,\n ): string {\n return this._actions\n .map(\n (a, ai) =>\n `<span class=\"x-action-col-icon ${a.iconCls ?? ''}\" ` +\n `title=\"${a.tooltip ?? ''}\" data-action=\"${ai}\" data-row=\"${rowIndex}\"></span>`,\n )\n .join('');\n }\n}\n\n// ---------------------------------------------------------------------------\n// RowNumbererColumn\n// ---------------------------------------------------------------------------\n\nexport class RowNumbererColumn extends Column {\n constructor(config: ColumnConfig = {}) {\n super({\n text: '#',\n width: 40,\n sortable: false,\n ...config,\n xtype: 'rownumberer',\n dataIndex: '',\n });\n }\n\n override renderCellHtml(\n _value: unknown,\n _metaData: any,\n _record: any,\n rowIndex: number,\n _colIndex: number,\n ): string {\n return String(rowIndex + 1);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Factory\n// ---------------------------------------------------------------------------\n\nexport function createColumn(config: ColumnConfig): Column {\n switch (config.xtype) {\n case 'numbercolumn':\n return new NumberColumn(config);\n case 'datecolumn':\n return new DateColumn(config);\n case 'booleancolumn':\n return new BooleanColumn(config);\n case 'checkcolumn':\n return new CheckColumn(config);\n case 'actioncolumn':\n return new ActionColumn(config);\n case 'rownumberer':\n return new RowNumbererColumn(config);\n default:\n return new Column(config);\n }\n}\n","/**\n * @framesquared/grid – HeaderContainer\n *\n * Renders and manages the <thead> <tr> of column headers.\n * Applies width, hidden state, and sort indicator classes.\n */\n\nimport type { Column } from './column/Column.js';\n\nexport interface HeaderContainerConfig {\n columns: Column[];\n}\n\nexport class HeaderContainer {\n private columns: Column[];\n private headerRow: HTMLTableRowElement | null = null;\n private thElements: HTMLTableCellElement[] = [];\n\n constructor(config: HeaderContainerConfig) {\n this.columns = config.columns;\n }\n\n render(): HTMLTableRowElement {\n this.headerRow = document.createElement('tr');\n this.headerRow.classList.add('x-grid-header-row');\n this.thElements = [];\n\n for (const col of this.columns) {\n const th = document.createElement('th');\n th.classList.add('x-column-header');\n th.textContent = col.text;\n\n if (col.width > 0) th.style.width = `${col.width}px`;\n if (col.hidden) th.style.display = 'none';\n if (col.align) th.style.textAlign = col.align;\n\n th.setAttribute('data-dataindex', col.dataIndex);\n this.thElements.push(th);\n this.headerRow.appendChild(th);\n }\n\n return this.headerRow;\n }\n\n getColumns(): Column[] {\n return this.columns;\n }\n\n getThElements(): HTMLTableCellElement[] {\n return this.thElements;\n }\n\n setColumnHidden(index: number, hidden: boolean): void {\n const th = this.thElements[index];\n if (th) th.style.display = hidden ? 'none' : '';\n }\n\n setSortIndicator(index: number, direction: 'ASC' | 'DESC' | null): void {\n // Clear all\n for (const th of this.thElements) {\n th.classList.remove('x-column-header-sort-ASC', 'x-column-header-sort-DESC');\n }\n if (direction !== null && this.thElements[index]) {\n this.thElements[index].classList.add(`x-column-header-sort-${direction}`);\n }\n }\n}\n","/**\n * @framesquared/grid – GridView\n *\n * Renders the grid body using a <table> with <thead> and <tbody>.\n * Manages row rendering, striping, cell content, and item events.\n */\n\nimport type { Column } from './column/Column.js';\nimport { ActionColumn } from './column/Column.js';\nimport { HeaderContainer } from './HeaderContainer.js';\nimport type { GridStore, GridRecord } from './GridStore.js';\n\nexport interface GridViewConfig {\n store: GridStore;\n columns: Column[];\n emptyText?: string;\n}\n\nexport class GridView {\n private store: GridStore;\n private columns: Column[];\n private emptyText: string;\n private tableEl: HTMLTableElement | null = null;\n private tbodyEl: HTMLTableSectionElement | null = null;\n private theadEl: HTMLTableSectionElement | null = null;\n headerContainer: HeaderContainer;\n\n /** Event listeners set by Grid */\n onItemClick?: (record: GridRecord, rowIndex: number, event: Event) => void;\n onItemDblClick?: (record: GridRecord, rowIndex: number, event: Event) => void;\n\n /** Set by RowSelectionModel so selection classes survive refresh() */\n isSelected?: (record: GridRecord) => boolean;\n\n constructor(config: GridViewConfig) {\n this.store = config.store;\n this.columns = config.columns;\n this.emptyText = config.emptyText ?? '';\n this.headerContainer = new HeaderContainer({ columns: this.columns });\n }\n\n render(): HTMLTableElement {\n this.tableEl = document.createElement('table');\n this.tableEl.classList.add('x-grid-table');\n this.tableEl.style.width = '100%';\n this.tableEl.style.borderCollapse = 'collapse';\n\n // Thead\n this.theadEl = document.createElement('thead');\n const headerRow = this.headerContainer.render();\n this.theadEl.appendChild(headerRow);\n this.tableEl.appendChild(this.theadEl);\n\n // Tbody\n this.tbodyEl = document.createElement('tbody');\n this.tableEl.appendChild(this.tbodyEl);\n\n this.renderRows();\n return this.tableEl;\n }\n\n refresh(): void {\n this.renderRows();\n }\n\n private renderRows(): void {\n if (!this.tbodyEl) return;\n this.tbodyEl.innerHTML = '';\n\n const records = this.store.getRange();\n\n if (records.length === 0 && this.emptyText) {\n const emptyRow = document.createElement('tr');\n const emptyTd = document.createElement('td');\n emptyTd.colSpan = this.columns.length;\n emptyTd.classList.add('x-grid-empty');\n emptyTd.textContent = this.emptyText;\n emptyRow.appendChild(emptyTd);\n this.tbodyEl.appendChild(emptyRow);\n return;\n }\n\n for (let rowIdx = 0; rowIdx < records.length; rowIdx++) {\n const record = records[rowIdx];\n const tr = this.createRow(record, rowIdx);\n this.tbodyEl.appendChild(tr);\n }\n }\n\n private createRow(record: GridRecord, rowIndex: number): HTMLTableRowElement {\n const tr = document.createElement('tr');\n tr.classList.add('x-grid-row');\n if (rowIndex % 2 === 1) tr.classList.add('x-grid-row-alt');\n if (this.isSelected?.(record)) tr.classList.add('x-grid-row-selected');\n tr.setAttribute('data-rowindex', String(rowIndex));\n\n for (let colIdx = 0; colIdx < this.columns.length; colIdx++) {\n const col = this.columns[colIdx];\n const td = document.createElement('td');\n td.classList.add('x-grid-cell');\n\n if (col.hidden) td.style.display = 'none';\n if (col.align) td.style.textAlign = col.align;\n if (col.config.tdCls) td.classList.add(col.config.tdCls);\n\n const value = col.getCellValue(record);\n const html = col.renderCellHtml(value, {}, record, rowIndex, colIdx);\n td.innerHTML = html;\n\n // Action column click delegation\n if (col instanceof ActionColumn) {\n td.addEventListener('click', (e) => {\n const target = (e.target as HTMLElement).closest(\n '.x-action-col-icon',\n ) as HTMLElement | null;\n if (!target) return;\n const actionIdx = parseInt(target.getAttribute('data-action') ?? '0', 10);\n const action = col.actions[actionIdx];\n if (action?.handler) action.handler(record, rowIndex);\n });\n }\n\n // CheckColumn click\n if (col.config.xtype === 'checkcolumn') {\n const input = td.querySelector('input[type=\"checkbox\"]') as HTMLInputElement | null;\n if (input) {\n input.addEventListener('change', () => {\n record.set?.(col.dataIndex, input.checked);\n });\n }\n }\n\n tr.appendChild(td);\n }\n\n // Item events\n tr.addEventListener('click', (e) => {\n this.onItemClick?.(record, rowIndex, e);\n });\n tr.addEventListener('dblclick', (e) => {\n this.onItemDblClick?.(record, rowIndex, e);\n });\n\n return tr;\n }\n\n setColumnHidden(index: number, hidden: boolean): void {\n this.headerContainer.setColumnHidden(index, hidden);\n // Also hide/show cells in existing rows\n if (this.tbodyEl) {\n for (const row of this.tbodyEl.rows) {\n if (row.cells[index]) {\n (row.cells[index] as HTMLElement).style.display = hidden ? 'none' : '';\n }\n }\n }\n }\n\n getTable(): HTMLTableElement | null {\n return this.tableEl;\n }\n}\n","/**\n * @framesquared/grid – Grouping feature\n *\n * Groups rows by a field value. Renders group header rows with\n * expand/collapse behavior.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nexport interface GroupingConfig {\n groupField: string;\n startCollapsed?: boolean;\n groupHeaderTpl?: (groupValue: string, records: any[]) => string;\n}\n\nexport class Grouping {\n private grid: any = null;\n private groupField: string;\n private startCollapsed: boolean;\n private collapsedGroups = new Set<string>();\n private groupHeaderTpl: (gv: string, recs: any[]) => string;\n\n constructor(config: GroupingConfig) {\n this.groupField = config.groupField;\n this.startCollapsed = config.startCollapsed ?? false;\n this.groupHeaderTpl = config.groupHeaderTpl ?? ((gv) => gv);\n }\n\n init(grid: any): void {\n this.grid = grid;\n this.rebuildGroupedView();\n }\n\n collapse(groupValue: string): void {\n this.collapsedGroups.add(groupValue);\n this.setGroupRowsVisible(groupValue, false);\n this.grid?.fire?.('groupcollapse', this.grid, groupValue);\n }\n\n expand(groupValue: string): void {\n this.collapsedGroups.delete(groupValue);\n this.setGroupRowsVisible(groupValue, true);\n this.grid?.fire?.('groupexpand', this.grid, groupValue);\n }\n\n isCollapsed(groupValue: string): boolean {\n return this.collapsedGroups.has(groupValue);\n }\n\n private rebuildGroupedView(): void {\n const view = this.grid?.getView?.();\n if (!view) return;\n const table = view.getTable?.();\n if (!table) return;\n const tbody = table.querySelector('tbody');\n if (!tbody) return;\n\n const store = this.grid.getStore();\n const records = store.getRange();\n const columns = this.grid.getColumns();\n const groups = this.groupRecords(records);\n\n tbody.innerHTML = '';\n\n for (const [groupValue, groupRecords] of groups) {\n if (this.startCollapsed) this.collapsedGroups.add(groupValue);\n\n const groupEl = document.createElement('tbody');\n groupEl.classList.add('x-grid-group');\n groupEl.setAttribute('data-group', groupValue);\n\n // Group header row\n const headerRow = document.createElement('tr');\n headerRow.classList.add('x-grid-group-hd');\n const headerTd = document.createElement('td');\n headerTd.colSpan = columns.length;\n headerTd.classList.add('x-grid-group-title');\n headerTd.textContent = this.groupHeaderTpl(groupValue, groupRecords);\n headerRow.appendChild(headerTd);\n\n headerRow.style.cursor = 'pointer';\n headerRow.addEventListener('click', () => {\n if (this.isCollapsed(groupValue)) this.expand(groupValue);\n else this.collapse(groupValue);\n });\n\n groupEl.appendChild(headerRow);\n\n // Data rows\n for (let i = 0; i < groupRecords.length; i++) {\n const rec = groupRecords[i];\n const tr = document.createElement('tr');\n tr.classList.add('x-grid-row');\n if (this.collapsedGroups.has(groupValue)) tr.style.display = 'none';\n\n for (let ci = 0; ci < columns.length; ci++) {\n const col = columns[ci];\n const td = document.createElement('td');\n td.classList.add('x-grid-cell');\n const val = col.getCellValue(rec);\n td.innerHTML = col.renderCellHtml(val, {}, rec, i, ci);\n tr.appendChild(td);\n }\n groupEl.appendChild(tr);\n }\n\n // Replace original tbody with group tbodies\n table.appendChild(groupEl);\n }\n\n // Remove original tbody\n tbody.remove();\n }\n\n private groupRecords(records: any[]): Map<string, any[]> {\n const groups = new Map<string, any[]>();\n for (const rec of records) {\n const val = String(rec.get(this.groupField));\n if (!groups.has(val)) groups.set(val, []);\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n groups.get(val)!.push(rec);\n }\n return groups;\n }\n\n private setGroupRowsVisible(groupValue: string, visible: boolean): void {\n const groupEl = this.grid?.el?.querySelector(`.x-grid-group[data-group=\"${groupValue}\"]`);\n if (!groupEl) return;\n const rows = groupEl.querySelectorAll('.x-grid-row');\n for (const row of rows) {\n (row as HTMLElement).style.display = visible ? '' : 'none';\n }\n }\n}\n","/**\n * @framesquared/grid – Summary feature\n *\n * Adds a summary row at the bottom of the grid with aggregate\n * calculations per column (sum, count, average, min, max, custom).\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nexport type SummaryType =\n | 'sum'\n | 'count'\n | 'average'\n | 'min'\n | 'max'\n | ((records: any[]) => unknown);\n\nexport interface SummaryConfig {\n summaryTypes: Record<string, SummaryType>;\n}\n\nexport class Summary {\n private grid: any = null;\n private summaryTypes: Record<string, SummaryType>;\n\n constructor(config: SummaryConfig) {\n this.summaryTypes = config.summaryTypes;\n }\n\n init(grid: any): void {\n this.grid = grid;\n this.renderSummary();\n }\n\n private renderSummary(): void {\n const view = this.grid?.getView?.();\n if (!view) return;\n const table = view.getTable?.();\n if (!table) return;\n\n const store = this.grid.getStore();\n const records = store.getRange();\n const columns = this.grid.getColumns();\n\n const tr = this.buildSummaryRow(records, columns);\n const tbody = table.querySelector('tbody');\n if (tbody) tbody.appendChild(tr);\n }\n\n protected buildSummaryRow(records: any[], columns: any[]): HTMLTableRowElement {\n const tr = document.createElement('tr');\n tr.classList.add('x-grid-summary-row');\n\n for (const col of columns) {\n const td = document.createElement('td');\n td.classList.add('x-grid-cell', 'x-grid-summary-cell');\n const type = this.summaryTypes[col.dataIndex];\n if (type) {\n td.textContent = String(this.calculate(records, col.dataIndex, type));\n }\n tr.appendChild(td);\n }\n return tr;\n }\n\n protected calculate(records: any[], field: string, type: SummaryType): unknown {\n if (typeof type === 'function') return type(records);\n\n const values = records.map((r) => Number(r.get(field))).filter((n) => !isNaN(n));\n switch (type) {\n case 'sum':\n return values.reduce((a, b) => a + b, 0);\n case 'count':\n return records.length;\n case 'average':\n return values.length ? Math.round(values.reduce((a, b) => a + b, 0) / values.length) : 0;\n case 'min':\n return values.length ? Math.min(...values) : 0;\n case 'max':\n return values.length ? Math.max(...values) : 0;\n default:\n return '';\n }\n }\n}\n","/**\n * @framesquared/grid – GroupingSummary feature\n *\n * Combines grouping with per-group summary rows. Each group gets\n * a header and a summary row at the bottom.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport type { SummaryType } from './Summary.js';\n\nexport interface GroupingSummaryConfig {\n groupField: string;\n summaryTypes: Record<string, SummaryType>;\n startCollapsed?: boolean;\n}\n\nexport class GroupingSummary {\n private grid: any = null;\n private groupField: string;\n private summaryTypes: Record<string, SummaryType>;\n\n constructor(config: GroupingSummaryConfig) {\n this.groupField = config.groupField;\n this.summaryTypes = config.summaryTypes;\n }\n\n init(grid: any): void {\n this.grid = grid;\n this.rebuild();\n }\n\n private rebuild(): void {\n const view = this.grid?.getView?.();\n if (!view) return;\n const table = view.getTable?.();\n if (!table) return;\n const tbody = table.querySelector('tbody');\n if (!tbody) return;\n\n const store = this.grid.getStore();\n const records = store.getRange();\n const columns = this.grid.getColumns();\n const groups = this.groupRecords(records);\n\n tbody.innerHTML = '';\n\n for (const [groupValue, groupRecords] of groups) {\n const groupEl = document.createElement('tbody');\n groupEl.classList.add('x-grid-group');\n groupEl.setAttribute('data-group', groupValue);\n\n // Group header\n const headerRow = document.createElement('tr');\n headerRow.classList.add('x-grid-group-hd');\n const headerTd = document.createElement('td');\n headerTd.colSpan = columns.length;\n headerTd.textContent = groupValue;\n headerRow.appendChild(headerTd);\n groupEl.appendChild(headerRow);\n\n // Data rows\n for (let i = 0; i < groupRecords.length; i++) {\n const rec = groupRecords[i];\n const tr = document.createElement('tr');\n tr.classList.add('x-grid-row');\n for (let ci = 0; ci < columns.length; ci++) {\n const col = columns[ci];\n const td = document.createElement('td');\n td.classList.add('x-grid-cell');\n td.innerHTML = col.renderCellHtml(col.getCellValue(rec), {}, rec, i, ci);\n tr.appendChild(td);\n }\n groupEl.appendChild(tr);\n }\n\n // Group summary row\n const sumRow = document.createElement('tr');\n sumRow.classList.add('x-grid-group-summary');\n for (const col of columns) {\n const td = document.createElement('td');\n td.classList.add('x-grid-cell');\n const type = this.summaryTypes[col.dataIndex];\n if (type) td.textContent = String(this.calculate(groupRecords, col.dataIndex, type));\n sumRow.appendChild(td);\n }\n groupEl.appendChild(sumRow);\n\n table.appendChild(groupEl);\n }\n\n tbody.remove();\n }\n\n private groupRecords(records: any[]): Map<string, any[]> {\n const groups = new Map<string, any[]>();\n for (const rec of records) {\n const val = String(rec.get(this.groupField));\n if (!groups.has(val)) groups.set(val, []);\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n groups.get(val)!.push(rec);\n }\n return groups;\n }\n\n private calculate(records: any[], field: string, type: SummaryType): unknown {\n if (typeof type === 'function') return type(records);\n const values = records.map((r) => Number(r.get(field))).filter((n) => !isNaN(n));\n switch (type) {\n case 'sum':\n return values.reduce((a, b) => a + b, 0);\n case 'count':\n return records.length;\n case 'average':\n return values.length ? Math.round(values.reduce((a, b) => a + b, 0) / values.length) : 0;\n case 'min':\n return values.length ? Math.min(...values) : 0;\n case 'max':\n return values.length ? Math.max(...values) : 0;\n default:\n return '';\n }\n }\n}\n","/**\n * @framesquared/grid – RowBody feature\n *\n * Adds an expandable body row below each data row with\n * custom content generated by getAdditionalData.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nexport interface RowBodyConfig {\n getAdditionalData: (\n data: any,\n rowIndex: number,\n record: any,\n ) => { rowBody: string; rowBodyCls?: string };\n}\n\nexport class RowBody {\n private grid: any = null;\n private getAdditionalData: RowBodyConfig['getAdditionalData'];\n\n constructor(config: RowBodyConfig) {\n this.getAdditionalData = config.getAdditionalData;\n }\n\n init(grid: any): void {\n this.grid = grid;\n this.addRowBodies();\n }\n\n private addRowBodies(): void {\n const view = this.grid?.getView?.();\n if (!view) return;\n const table = view.getTable?.();\n if (!table) return;\n const tbody = table.querySelector('tbody');\n if (!tbody) return;\n\n const store = this.grid.getStore();\n const records = store.getRange();\n const columns = this.grid.getColumns();\n const rows = Array.from(tbody.querySelectorAll('tr.x-grid-row')) as HTMLElement[];\n\n for (let i = 0; i < rows.length && i < records.length; i++) {\n const rec = records[i];\n const result = this.getAdditionalData(rec.data, i, rec);\n const bodyRow = document.createElement('tr');\n bodyRow.classList.add('x-grid-rowbody');\n if (result.rowBodyCls) bodyRow.classList.add(result.rowBodyCls);\n const td = document.createElement('td');\n td.colSpan = columns.length;\n td.innerHTML = result.rowBody;\n bodyRow.appendChild(td);\n rows[i].after(bodyRow);\n }\n }\n}\n","/**\n * @framesquared/grid – CellEditing plugin\n *\n * Double-click a cell to start inline editing. The cell content\n * is replaced with an input field. Enter completes; Escape cancels.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nexport class CellEditing {\n private grid: any = null;\n private activeEditor: HTMLElement | null = null;\n private activeInput: HTMLInputElement | null = null;\n private activeRecord: any = null;\n private activeColumn: any = null;\n private activeCell: HTMLElement | null = null;\n private originalValue = '';\n\n init(grid: any): void {\n this.grid = grid;\n this.attachCellListeners();\n }\n\n private attachCellListeners(): void {\n const view = this.grid?.getView?.();\n if (!view) return;\n const table = view.getTable?.();\n if (!table) return;\n\n table.addEventListener('dblclick', (e: MouseEvent) => {\n const td = (e.target as HTMLElement).closest('td.x-grid-cell') as HTMLElement | null;\n if (!td) return;\n const tr = td.closest('tr.x-grid-row') as HTMLElement | null;\n if (!tr) return;\n\n const rowIdx = parseInt(tr.getAttribute('data-rowindex') ?? '0', 10);\n const colIdx = Array.from(tr.children).indexOf(td);\n const columns = this.grid.getColumns();\n const col = columns[colIdx];\n if (!col?.config?.editor) return;\n\n const store = this.grid.getStore();\n const record = store.getAt(rowIdx);\n if (!record) return;\n\n this.startEdit(record, col, td);\n });\n }\n\n private startEdit(record: any, column: any, cell: HTMLElement): void {\n if (this.activeEditor) this.cancelEdit();\n\n this.grid?.fire?.('beforeedit', this.grid, { record, column });\n\n this.activeRecord = record;\n this.activeColumn = column;\n this.activeCell = cell;\n this.originalValue = String(record.get(column.dataIndex) ?? '');\n\n // Create editor\n const editor = document.createElement('div');\n editor.classList.add('x-grid-cell-editor');\n\n const input = document.createElement('input');\n input.type = 'text';\n input.value = this.originalValue;\n input.classList.add('x-grid-editor-input');\n\n input.addEventListener('keydown', (e: KeyboardEvent) => {\n if (e.key === 'Enter') {\n e.preventDefault();\n this.completeEdit();\n } else if (e.key === 'Escape') {\n e.preventDefault();\n this.cancelEdit();\n }\n });\n\n editor.appendChild(input);\n cell.innerHTML = '';\n cell.appendChild(editor);\n this.activeEditor = editor;\n this.activeInput = input;\n input.focus();\n input.select();\n }\n\n completeEdit(): void {\n if (!this.activeInput || !this.activeRecord || !this.activeColumn || !this.activeCell) return;\n\n const newValue = this.activeInput.value;\n this.activeRecord.set(this.activeColumn.dataIndex, newValue);\n this.activeCell.innerHTML = newValue;\n\n this.grid?.fire?.('edit', this.grid, {\n record: this.activeRecord,\n column: this.activeColumn,\n value: newValue,\n originalValue: this.originalValue,\n });\n\n this.cleanup();\n }\n\n cancelEdit(): void {\n if (!this.activeCell) return;\n this.activeCell.innerHTML = this.originalValue;\n this.grid?.fire?.('canceledit', this.grid);\n this.cleanup();\n }\n\n private cleanup(): void {\n this.activeEditor = null;\n this.activeInput = null;\n this.activeRecord = null;\n this.activeColumn = null;\n this.activeCell = null;\n this.originalValue = '';\n }\n}\n","/**\n * @framesquared/grid – RowEditing plugin\n *\n * Row-level editing: shows input fields for all editable columns\n * in the selected row. Update saves all; Cancel reverts.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nexport class RowEditing {\n private grid: any = null;\n private activeRowIndex = -1;\n private editorRow: HTMLElement | null = null;\n private inputs = new Map<string, HTMLInputElement>();\n private originalValues = new Map<string, string>();\n\n init(grid: any): void {\n this.grid = grid;\n }\n\n startEdit(rowIndex: number): void {\n if (this.editorRow) this.cancelEdit();\n\n const store = this.grid.getStore();\n const record = store.getAt(rowIndex);\n if (!record) return;\n\n this.activeRowIndex = rowIndex;\n const columns = this.grid.getColumns();\n\n // Find the data row\n const table = this.grid.getView()?.getTable?.();\n if (!table) return;\n const rows = table.querySelectorAll('tbody tr.x-grid-row');\n const targetRow = rows[rowIndex] as HTMLElement;\n if (!targetRow) return;\n\n // Create editor row\n this.editorRow = document.createElement('tr');\n this.editorRow.classList.add('x-grid-row-editor');\n this.inputs.clear();\n this.originalValues.clear();\n\n for (const col of columns) {\n const td = document.createElement('td');\n td.classList.add('x-grid-cell');\n\n if (col.config?.editor) {\n const input = document.createElement('input');\n input.type = 'text';\n const val = String(record.get(col.dataIndex) ?? '');\n input.value = val;\n this.inputs.set(col.dataIndex, input);\n this.originalValues.set(col.dataIndex, val);\n td.appendChild(input);\n } else {\n td.textContent = String(col.getCellValue(record) ?? '');\n }\n\n this.editorRow.appendChild(td);\n }\n\n // Replace the data row with editor row\n targetRow.style.display = 'none';\n targetRow.after(this.editorRow);\n\n this.grid?.fire?.('beforeedit', this.grid, { record, rowIndex });\n }\n\n completeEdit(): void {\n if (this.activeRowIndex < 0 || !this.grid) return;\n\n const store = this.grid.getStore();\n const record = store.getAt(this.activeRowIndex);\n if (!record) return;\n\n for (const [field, input] of this.inputs) {\n record.set(field, input.value);\n }\n\n this.grid.fire?.('edit', this.grid, { record, rowIndex: this.activeRowIndex });\n this.teardown();\n\n // Refresh the view\n this.grid.getView()?.refresh?.();\n }\n\n cancelEdit(): void {\n this.grid?.fire?.('canceledit', this.grid);\n this.teardown();\n }\n\n private teardown(): void {\n if (this.editorRow?.parentNode) {\n // Show original row again\n const prev = this.editorRow.previousElementSibling as HTMLElement;\n if (prev) prev.style.display = '';\n this.editorRow.remove();\n }\n this.editorRow = null;\n this.inputs.clear();\n this.originalValues.clear();\n this.activeRowIndex = -1;\n }\n}\n","/**\n * @framesquared/grid – RowExpander plugin\n *\n * Adds an expand button to each row. Clicking toggles a body\n * row below with custom content.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nexport interface RowExpanderConfig {\n rowBodyTpl: (record: any) => string;\n singleExpand?: boolean;\n}\n\nexport class RowExpander {\n private grid: any = null;\n private rowBodyTpl: (record: any) => string;\n private singleExpand: boolean;\n private expandedRows = new Set<number>();\n\n constructor(config: RowExpanderConfig) {\n this.rowBodyTpl = config.rowBodyTpl;\n this.singleExpand = config.singleExpand ?? false;\n }\n\n init(grid: any): void {\n this.grid = grid;\n this.addExpanders();\n }\n\n private addExpanders(): void {\n const view = this.grid?.getView?.();\n if (!view) return;\n const table = view.getTable?.();\n if (!table) return;\n\n const store = this.grid.getStore();\n const records = store.getRange();\n const columns = this.grid.getColumns();\n const rows = table.querySelectorAll('tbody tr.x-grid-row');\n\n for (let i = 0; i < rows.length && i < records.length; i++) {\n const row = rows[i] as HTMLElement;\n const record = records[i];\n\n // Insert expander cell at beginning\n const expanderTd = document.createElement('td');\n expanderTd.classList.add('x-grid-cell');\n const btn = document.createElement('span');\n btn.classList.add('x-grid-row-expander');\n btn.textContent = '+';\n btn.style.cursor = 'pointer';\n expanderTd.appendChild(btn);\n row.insertBefore(expanderTd, row.firstChild);\n\n btn.addEventListener('click', () => {\n this.toggle(i, record, row, columns.length + 1);\n });\n }\n }\n\n private toggle(rowIndex: number, record: any, row: HTMLElement, colSpan: number): void {\n if (this.expandedRows.has(rowIndex)) {\n this.collapseRow(rowIndex, row);\n } else {\n if (this.singleExpand) this.collapseAll();\n this.expandRow(rowIndex, record, row, colSpan);\n }\n }\n\n private expandRow(rowIndex: number, record: any, row: HTMLElement, colSpan: number): void {\n this.expandedRows.add(rowIndex);\n const bodyRow = document.createElement('tr');\n bodyRow.classList.add('x-grid-rowexpand-body');\n bodyRow.setAttribute('data-expand-row', String(rowIndex));\n const td = document.createElement('td');\n td.colSpan = colSpan;\n td.innerHTML = this.rowBodyTpl(record);\n bodyRow.appendChild(td);\n row.after(bodyRow);\n }\n\n private collapseRow(rowIndex: number, _row: HTMLElement): void {\n this.expandedRows.delete(rowIndex);\n const table = this.grid?.getView?.()?.getTable?.();\n if (!table) return;\n const bodyRow = table.querySelector(`tr[data-expand-row=\"${rowIndex}\"]`);\n bodyRow?.remove();\n }\n\n private collapseAll(): void {\n const table = this.grid?.getView?.()?.getTable?.();\n if (!table) return;\n for (const idx of this.expandedRows) {\n const bodyRow = table.querySelector(`tr[data-expand-row=\"${idx}\"]`);\n bodyRow?.remove();\n }\n this.expandedRows.clear();\n }\n}\n","/**\n * @framesquared/grid – Clipboard plugin\n *\n * Copies grid data to the clipboard in TSV (tab-separated) format\n * for spreadsheet compatibility.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nexport class GridClipboard {\n private grid: any = null;\n\n init(grid: any): void {\n this.grid = grid;\n }\n\n getGridText(): string {\n if (!this.grid) return '';\n const store = this.grid.getStore();\n const records = store.getRange();\n const columns = this.grid.getColumns();\n\n const lines: string[] = [];\n\n // Header\n lines.push(columns.map((c: any) => c.text).join('\\t'));\n\n // Data\n for (const rec of records) {\n const cells = columns.map((c: any) => {\n const val = c.getCellValue(rec);\n return val === null || val === undefined ? '' : String(val);\n });\n lines.push(cells.join('\\t'));\n }\n\n return lines.join('\\n');\n }\n\n async doCopy(): Promise<void> {\n const text = this.getGridText();\n this.grid?.fire?.('beforecopy', this.grid, text);\n\n try {\n if (navigator?.clipboard?.writeText) {\n await navigator.clipboard.writeText(text);\n }\n } catch {\n // Clipboard API may not be available\n }\n\n this.grid?.fire?.('copy', this.grid, text);\n }\n}\n","/**\n * @framesquared/grid – DragDrop plugin\n *\n * Enables row reordering via drag and drop. Adds draggable\n * attributes to rows and provides a moveRow method.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nexport class GridDragDrop {\n private grid: any = null;\n\n init(grid: any): void {\n this.grid = grid;\n this.setupDrag();\n }\n\n private setupDrag(): void {\n const view = this.grid?.getView?.();\n if (!view) return;\n const table = view.getTable?.();\n if (!table) return;\n\n const rows = table.querySelectorAll('tbody tr.x-grid-row');\n for (const row of rows) {\n row.setAttribute('draggable', 'true');\n\n row.addEventListener('dragstart', (e: DragEvent) => {\n const idx = row.getAttribute('data-rowindex');\n e.dataTransfer?.setData('text/plain', idx ?? '');\n this.grid?.fire?.('beforedrop', this.grid, parseInt(idx ?? '0', 10));\n });\n\n row.addEventListener('dragover', (e: DragEvent) => {\n e.preventDefault();\n });\n\n row.addEventListener('drop', (e: DragEvent) => {\n e.preventDefault();\n const fromIdx = parseInt(e.dataTransfer?.getData('text/plain') ?? '0', 10);\n const toIdx = parseInt(row.getAttribute('data-rowindex') ?? '0', 10);\n if (fromIdx !== toIdx) this.moveRow(fromIdx, toIdx);\n });\n }\n }\n\n moveRow(fromIndex: number, toIndex: number): void {\n const store = this.grid?.getStore?.();\n if (!store) return;\n\n const records = store.data?.items;\n if (!records || fromIndex >= records.length) return;\n\n const [moved] = records.splice(fromIndex, 1);\n records.splice(toIndex, 0, moved);\n\n this.grid?.fire?.('drop', this.grid, moved, fromIndex, toIndex);\n\n // Refresh grid\n this.grid?.getView?.()?.refresh?.();\n }\n}\n","/**\n * @framesquared/grid – RowSelectionModel\n *\n * Row-level selection model supporting SINGLE, SIMPLE, and MULTI modes.\n * Optional checkbox column for visual selection.\n *\n * Works with any Grid that implements getStore()/getView() and any Store\n * that implements the GridStore interface.\n */\n\nimport type { GridStore, GridRecord } from '../GridStore.js';\nimport type { GridView } from '../GridView.js';\n\nexport interface RowSelectionModelConfig {\n mode?: 'SINGLE' | 'SIMPLE' | 'MULTI';\n checkboxSelect?: boolean;\n}\n\nexport interface SelectableGrid {\n getStore(): GridStore | null;\n getView(): GridView | null;\n}\n\nexport class RowSelectionModel {\n private grid: SelectableGrid | null = null;\n private mode: string;\n private checkboxSelect: boolean;\n private selected = new Set<GridRecord>();\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private listeners: Record<string, ((...args: any[]) => void)[]> = {};\n\n constructor(config: RowSelectionModelConfig = {}) {\n this.mode = config.mode ?? 'SINGLE';\n this.checkboxSelect = config.checkboxSelect ?? false;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n on(event: string, fn: (...args: any[]) => void): void {\n (this.listeners[event] ??= []).push(fn);\n }\n\n private fire(event: string, ...args: unknown[]): void {\n (this.listeners[event] ?? []).forEach((fn) => fn(...args));\n }\n\n init(grid: SelectableGrid): void {\n this.grid = grid;\n this.attachRowListeners();\n const view = grid.getView();\n if (view) view.isSelected = (record) => this.selected.has(record);\n if (this.checkboxSelect) this.addCheckboxColumn();\n }\n\n // -----------------------------------------------------------------------\n // Selection API\n // -----------------------------------------------------------------------\n\n select(record: GridRecord, keepExisting = false): void {\n if (!record) return;\n this.fire('beforeselect', this, record);\n\n if (this.mode === 'SINGLE') {\n for (const r of this.selected) {\n if (r !== record) this.doDeselect(r);\n }\n if (this.selected.has(record)) return;\n this.doSelect(record);\n } else if (this.mode === 'SIMPLE') {\n if (this.selected.has(record)) {\n this.doDeselect(record);\n } else {\n this.doSelect(record);\n }\n } else {\n // MULTI\n if (keepExisting) {\n if (this.selected.has(record)) {\n this.doDeselect(record);\n return;\n }\n this.doSelect(record);\n } else {\n for (const r of this.selected) {\n if (r !== record) this.doDeselect(r);\n }\n this.doSelect(record);\n }\n }\n }\n\n deselect(record: GridRecord): void {\n if (this.selected.has(record)) {\n this.doDeselect(record);\n }\n }\n\n selectRange(start: GridRecord, end: GridRecord): void {\n const store = this.grid?.getStore();\n if (!store) return;\n const records = store.getRange();\n const startIdx = records.indexOf(start);\n const endIdx = records.indexOf(end);\n if (startIdx < 0 || endIdx < 0) return;\n\n const low = Math.min(startIdx, endIdx);\n const high = Math.max(startIdx, endIdx);\n for (let i = low; i <= high; i++) {\n this.doSelect(records[i]);\n }\n }\n\n selectAll(): void {\n const store = this.grid?.getStore();\n if (!store) return;\n for (const rec of store.getRange()) {\n this.doSelect(rec);\n }\n }\n\n deselectAll(): void {\n for (const rec of [...this.selected]) {\n this.doDeselect(rec);\n }\n }\n\n getSelection(): GridRecord[] {\n return [...this.selected];\n }\n\n isSelected(record: GridRecord): boolean {\n return this.selected.has(record);\n }\n\n getCount(): number {\n return this.selected.size;\n }\n\n // -----------------------------------------------------------------------\n // Internal\n // -----------------------------------------------------------------------\n\n private doSelect(record: GridRecord): void {\n if (this.selected.has(record)) return;\n this.selected.add(record);\n this.updateRowClass(record, true);\n this.fire('select', this, record);\n this.fire('selectionchange', this, this.getSelection());\n }\n\n private doDeselect(record: GridRecord): void {\n this.selected.delete(record);\n this.updateRowClass(record, false);\n this.fire('deselect', this, record);\n this.fire('selectionchange', this, this.getSelection());\n }\n\n private updateRowClass(record: GridRecord, selected: boolean): void {\n const store = this.grid?.getStore();\n if (!store) return;\n const records = store.getRange();\n const idx = records.indexOf(record);\n if (idx < 0) return;\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const view = this.grid!.getView();\n const table = view?.getTable();\n if (!table) return;\n const row = table.querySelector(`tbody tr[data-rowindex=\"${idx}\"]`) as HTMLElement;\n if (row) {\n row.classList.toggle('x-grid-row-selected', selected);\n }\n }\n\n // -----------------------------------------------------------------------\n // Row click listener\n // -----------------------------------------------------------------------\n\n private attachRowListeners(): void {\n const view = this.grid?.getView();\n const table = view?.getTable();\n if (!table) return;\n\n table.addEventListener('click', (e: MouseEvent) => {\n const tr = (e.target as HTMLElement).closest('tr.x-grid-row') as HTMLElement;\n if (!tr) return;\n\n if ((e.target as HTMLElement).closest('.x-grid-row-checker')) return;\n\n const rowIdx = parseInt(tr.getAttribute('data-rowindex') ?? '-1', 10);\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const store = this.grid!.getStore();\n if (!store) return;\n const record = store.getAt(rowIdx);\n if (!record) return;\n\n if (this.mode === 'MULTI' && e.ctrlKey) {\n this.select(record, true);\n } else if (this.mode === 'MULTI' && e.shiftKey) {\n const sel = this.getSelection();\n const anchor = sel.length > 0 ? sel[sel.length - 1] : record;\n this.deselectAll();\n this.selectRange(anchor, record);\n } else if (this.mode === 'SIMPLE') {\n this.select(record);\n } else {\n this.select(record);\n }\n });\n }\n\n // -----------------------------------------------------------------------\n // Checkbox column\n // -----------------------------------------------------------------------\n\n private addCheckboxColumn(): void {\n const view = this.grid?.getView();\n const table = view?.getTable();\n if (!table) return;\n\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n const store = this.grid!.getStore();\n if (!store) return;\n const records = store.getRange();\n\n // Header checkbox\n const thead = table.querySelector('thead tr');\n if (thead) {\n const th = document.createElement('th');\n th.classList.add('x-column-header');\n const headerCb = document.createElement('input');\n headerCb.type = 'checkbox';\n headerCb.classList.add('x-grid-header-checker');\n headerCb.addEventListener('click', () => {\n if (headerCb.checked) this.selectAll();\n else this.deselectAll();\n });\n th.appendChild(headerCb);\n thead.insertBefore(th, thead.firstChild);\n }\n\n // Row checkboxes\n const rows = table.querySelectorAll('tbody tr.x-grid-row');\n for (let i = 0; i < rows.length && i < records.length; i++) {\n const row = rows[i];\n const record = records[i];\n const td = document.createElement('td');\n td.classList.add('x-grid-cell');\n const cb = document.createElement('input');\n cb.type = 'checkbox';\n cb.classList.add('x-grid-row-checker');\n cb.addEventListener('click', (e) => {\n e.stopPropagation();\n if (cb.checked) {\n this.doSelect(record);\n } else {\n this.doDeselect(record);\n }\n });\n td.appendChild(cb);\n row.insertBefore(td, row.firstChild);\n }\n }\n}\n","/**\n * @framesquared/grid – CellSelectionModel\n *\n * Selects individual cells. Supports navigation via arrow keys\n * and Tab/Shift+Tab. Selected cell gets x-grid-cell-selected class.\n */\n\nimport type { SelectableGrid } from './RowSelectionModel.js';\nimport type { Column } from '../column/Column.js';\n\nexport interface CellPosition {\n row: number;\n column: number;\n}\n\ninterface CellSelectableGrid extends SelectableGrid {\n getColumns(): Column[];\n el: HTMLElement | null;\n}\n\nexport class CellSelectionModel {\n private grid: CellSelectableGrid | null = null;\n private position: CellPosition | null = null;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private listeners: Record<string, ((...args: any[]) => void)[]> = {};\n private maxRow = 0;\n private maxCol = 0;\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n on(event: string, fn: (...args: any[]) => void): void {\n (this.listeners[event] ??= []).push(fn);\n }\n\n private fire(event: string, ...args: unknown[]): void {\n (this.listeners[event] ?? []).forEach((fn) => fn(...args));\n }\n\n init(grid: CellSelectableGrid): void {\n this.grid = grid;\n const store = grid.getStore();\n this.maxRow = (store?.getCount() ?? 1) - 1;\n this.maxCol = grid.getColumns().length - 1;\n this.attachListeners();\n }\n\n getCurrentPosition(): CellPosition | null {\n return this.position ? { ...this.position } : null;\n }\n\n // -----------------------------------------------------------------------\n // Internal\n // -----------------------------------------------------------------------\n\n private selectCell(row: number, col: number): void {\n this.clearSelection();\n\n row = Math.max(0, Math.min(row, this.maxRow));\n col = Math.max(0, Math.min(col, this.maxCol));\n this.position = { row, column: col };\n\n const cell = this.getCellElement(row, col);\n if (cell) cell.classList.add('x-grid-cell-selected');\n\n this.fire('selectionchange', this, this.position);\n }\n\n private clearSelection(): void {\n if (!this.grid) return;\n const table = this.grid.getView()?.getTable();\n if (!table) return;\n const selected = table.querySelectorAll('.x-grid-cell-selected');\n for (const el of selected) el.classList.remove('x-grid-cell-selected');\n }\n\n private getCellElement(row: number, col: number): HTMLElement | null {\n const table = this.grid?.getView()?.getTable();\n if (!table) return null;\n const tr = table.querySelector(`tbody tr[data-rowindex=\"${row}\"]`);\n if (!tr) return null;\n return (tr.children[col] as HTMLElement) ?? null;\n }\n\n private attachListeners(): void {\n const view = this.grid?.getView();\n const table = view?.getTable();\n if (!table) return;\n\n // Cell click\n table.addEventListener('click', (e: MouseEvent) => {\n const td = (e.target as HTMLElement).closest('td.x-grid-cell') as HTMLElement;\n if (!td) return;\n const tr = td.closest('tr.x-grid-row') as HTMLElement;\n if (!tr) return;\n const rowIdx = parseInt(tr.getAttribute('data-rowindex') ?? '0', 10);\n const colIdx = Array.from(tr.children).indexOf(td);\n this.selectCell(rowIdx, colIdx);\n });\n\n // Keyboard navigation\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n if (this.grid!.el) {\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.grid!.el.setAttribute('tabindex', '0');\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.grid!.el.addEventListener('keydown', (e: KeyboardEvent) => {\n if (!this.position) return;\n let { row, column } = this.position;\n\n switch (e.key) {\n case 'ArrowRight':\n column++;\n break;\n case 'ArrowLeft':\n column--;\n break;\n case 'ArrowDown':\n row++;\n break;\n case 'ArrowUp':\n row--;\n break;\n case 'Tab':\n e.preventDefault();\n if (e.shiftKey) column--;\n else column++;\n break;\n default:\n return;\n }\n\n this.selectCell(row, column);\n });\n }\n }\n}\n","/**\n * @framesquared/grid – SpreadsheetSelectionModel\n *\n * Spreadsheet-like selection: click selects a cell, Shift+click\n * extends to a range. Selected cells get x-grid-cell-selected class.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nexport interface SelectionRange {\n startRow: number;\n startCol: number;\n endRow: number;\n endCol: number;\n}\n\nexport class SpreadsheetSelectionModel {\n private grid: any = null;\n private range: SelectionRange | null = null;\n\n private listeners: Record<string, ((...args: any[]) => void)[]> = {};\n\n on(event: string, fn: (...args: any[]) => void): void {\n (this.listeners[event] ??= []).push(fn);\n }\n\n private fire(event: string, ...args: unknown[]): void {\n (this.listeners[event] ?? []).forEach((fn) => fn(...args));\n }\n\n init(grid: any): void {\n this.grid = grid;\n this.attachListeners();\n }\n\n getSelectedRange(): SelectionRange | null {\n return this.range ? { ...this.range } : null;\n }\n\n // -----------------------------------------------------------------------\n // Internal\n // -----------------------------------------------------------------------\n\n private attachListeners(): void {\n const view = this.grid?.getView?.();\n const table = view?.getTable?.();\n if (!table) return;\n\n table.addEventListener('click', (e: MouseEvent) => {\n const td = (e.target as HTMLElement).closest('td.x-grid-cell') as HTMLElement;\n if (!td) return;\n const tr = td.closest('tr.x-grid-row') as HTMLElement;\n if (!tr) return;\n const rowIdx = parseInt(tr.getAttribute('data-rowindex') ?? '0', 10);\n const colIdx = Array.from(tr.children).indexOf(td);\n\n if (e.shiftKey && this.range) {\n // Extend range\n this.range = {\n startRow: this.range.startRow,\n startCol: this.range.startCol,\n endRow: rowIdx,\n endCol: colIdx,\n };\n } else {\n // New single-cell selection\n this.range = {\n startRow: rowIdx,\n startCol: colIdx,\n endRow: rowIdx,\n endCol: colIdx,\n };\n }\n\n this.highlightRange();\n this.fire('selectionchange', this, this.range);\n });\n }\n\n private highlightRange(): void {\n const table = this.grid?.getView()?.getTable?.();\n if (!table || !this.range) return;\n\n // Clear previous\n const prev = table.querySelectorAll('.x-grid-cell-selected');\n for (const el of prev) el.classList.remove('x-grid-cell-selected');\n\n const { startRow, startCol, endRow, endCol } = this.range;\n const minRow = Math.min(startRow, endRow);\n const maxRow = Math.max(startRow, endRow);\n const minCol = Math.min(startCol, endCol);\n const maxCol = Math.max(startCol, endCol);\n\n const rows = table.querySelectorAll('tbody tr.x-grid-row');\n for (let r = minRow; r <= maxRow && r < rows.length; r++) {\n const row = rows[r];\n for (let c = minCol; c <= maxCol && c < row.children.length; c++) {\n (row.children[c] as HTMLElement).classList.add('x-grid-cell-selected');\n }\n }\n }\n}\n","/**\n * @framesquared/grid – Lockable\n *\n * Splits a grid into locked (frozen left) and normal (scrollable right)\n * panels. Columns with config.locked=true go into the locked panel.\n * Locked panel does not scroll horizontally.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nexport class Lockable {\n private grid: any = null;\n\n init(grid: any): void {\n this.grid = grid;\n this.rebuild();\n }\n\n private rebuild(): void {\n const grid = this.grid;\n const view = grid?.getView?.();\n const table = view?.getTable?.();\n if (!table || !grid.el) return;\n\n const store = grid.getStore();\n const records = store.getRange();\n const columns = grid.getColumns();\n\n const lockedCols = columns.filter((c: any) => c.config?.locked);\n const normalCols = columns.filter((c: any) => !c.config?.locked);\n\n if (lockedCols.length === 0) return; // nothing to lock\n\n // Get the panel body\n const body = grid.getBodyEl();\n\n // Remove the original table\n table.remove();\n\n // Container: flex row\n const container = document.createElement('div');\n container.classList.add('x-grid-lock-container');\n container.style.display = 'flex';\n container.style.width = '100%';\n container.style.overflow = 'hidden';\n\n // Locked panel\n const lockedPanel = document.createElement('div');\n lockedPanel.classList.add('x-grid-locked');\n lockedPanel.style.overflowX = 'hidden';\n lockedPanel.style.overflowY = 'auto';\n lockedPanel.style.flexShrink = '0';\n lockedPanel.appendChild(this.buildTable(lockedCols, records));\n\n // Normal panel\n const normalPanel = document.createElement('div');\n normalPanel.classList.add('x-grid-normal');\n normalPanel.style.overflowX = 'auto';\n normalPanel.style.overflowY = 'auto';\n normalPanel.style.flexGrow = '1';\n normalPanel.appendChild(this.buildTable(normalCols, records));\n\n // Sync vertical scroll\n lockedPanel.addEventListener('scroll', () => {\n normalPanel.scrollTop = lockedPanel.scrollTop;\n });\n normalPanel.addEventListener('scroll', () => {\n lockedPanel.scrollTop = normalPanel.scrollTop;\n });\n\n container.appendChild(lockedPanel);\n container.appendChild(normalPanel);\n body.appendChild(container);\n }\n\n private buildTable(columns: any[], records: any[]): HTMLTableElement {\n const table = document.createElement('table');\n table.classList.add('x-grid-table');\n table.style.width = '100%';\n table.style.borderCollapse = 'collapse';\n\n // Thead\n const thead = document.createElement('thead');\n const headerRow = document.createElement('tr');\n for (const col of columns) {\n const th = document.createElement('th');\n th.classList.add('x-column-header');\n th.textContent = col.text;\n if (col.width > 0) th.style.width = `${col.width}px`;\n headerRow.appendChild(th);\n }\n thead.appendChild(headerRow);\n table.appendChild(thead);\n\n // Tbody\n const tbody = document.createElement('tbody');\n for (let ri = 0; ri < records.length; ri++) {\n const rec = records[ri];\n const tr = document.createElement('tr');\n tr.classList.add('x-grid-row');\n tr.setAttribute('data-rowindex', String(ri));\n if (ri % 2 === 1) tr.classList.add('x-grid-row-alt');\n\n for (let ci = 0; ci < columns.length; ci++) {\n const col = columns[ci];\n const td = document.createElement('td');\n td.classList.add('x-grid-cell');\n const val = col.getCellValue(rec);\n td.innerHTML = col.renderCellHtml(val, {}, rec, ri, ci);\n tr.appendChild(td);\n }\n tbody.appendChild(tr);\n }\n table.appendChild(tbody);\n\n return table;\n }\n}\n","/**\n * @framesquared/grid – GridState\n *\n * Saves and restores grid column state (widths, hidden, order)\n * and sort state to localStorage.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nexport interface GridStateConfig {\n stateId: string;\n}\n\ninterface ColumnState {\n dataIndex: string;\n width: number;\n hidden: boolean;\n}\n\ninterface SavedState {\n columns: ColumnState[];\n sort?: { field: string; direction: string };\n}\n\nexport class GridState {\n private grid: any = null;\n private stateId: string;\n\n constructor(config: GridStateConfig) {\n this.stateId = config.stateId;\n }\n\n init(grid: any): void {\n this.grid = grid;\n }\n\n private get storageKey(): string {\n return `ext-grid-state-${this.stateId}`;\n }\n\n save(): void {\n if (!this.grid) return;\n\n const columns = this.grid.getColumns();\n const view = this.grid.getView?.();\n const ths = view?.headerContainer?.getThElements?.() ?? [];\n\n const colState: ColumnState[] = columns.map((col: any, i: number) => ({\n dataIndex: col.dataIndex,\n width: col.width,\n hidden: ths[i] ? ths[i].style.display === 'none' : col.hidden,\n }));\n\n const state: SavedState = { columns: colState };\n\n // Sort state\n const sortIdx = (this.grid as any)._sortColumnIndex;\n const sortDir = (this.grid as any)._sortDirection;\n if (sortIdx >= 0 && columns[sortIdx]) {\n state.sort = {\n field: columns[sortIdx].dataIndex,\n direction: sortDir,\n };\n }\n\n localStorage.setItem(this.storageKey, JSON.stringify(state));\n }\n\n restore(): void {\n if (!this.grid) return;\n const raw = localStorage.getItem(this.storageKey);\n if (!raw) return;\n\n let state: SavedState;\n try {\n state = JSON.parse(raw);\n } catch {\n return;\n }\n\n const columns = this.grid.getColumns();\n\n if (state.columns) {\n for (const saved of state.columns) {\n const idx = columns.findIndex((c: any) => c.dataIndex === saved.dataIndex);\n if (idx < 0) continue;\n if (saved.hidden) {\n this.grid.hideColumn(idx);\n } else {\n this.grid.showColumn(idx);\n }\n }\n }\n }\n\n clear(): void {\n localStorage.removeItem(this.storageKey);\n }\n}\n","/**\n * @framesquared/grid – TreePanel\n *\n * Displays hierarchical data from a TreeStore. Each node is\n * rendered with depth-based indentation, expand/collapse icons,\n * folder/leaf icons, and optional checkboxes with cascade behavior.\n */\n\nimport { Panel } from '@framesquared/ui';\nimport type { PanelConfig } from '@framesquared/ui';\nimport type { TreeStore, TreeNode } from './TreeStore.js';\n\n// ---------------------------------------------------------------------------\n// Config\n// ---------------------------------------------------------------------------\n\nexport interface TreePanelConfig extends PanelConfig {\n store?: TreeStore;\n rootVisible?: boolean;\n singleExpand?: boolean;\n useArrows?: boolean;\n lines?: boolean;\n animate?: boolean;\n checkable?: boolean;\n cascadeCheck?: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// TreePanel\n// ---------------------------------------------------------------------------\n\nexport class TreePanel extends Panel {\n static override $className = 'Ext.tree.Panel';\n\n declare private _treeStore: TreeStore;\n declare private _rootVisible: boolean;\n declare private _singleExpand: boolean;\n declare private _checkable: boolean;\n declare private _cascadeCheck: boolean;\n declare private _treeBody: HTMLElement | null;\n declare private _checkedSet: Set<string>;\n\n constructor(config: TreePanelConfig = {}) {\n super({ xtype: 'treepanel', ...config });\n }\n\n protected override initialize(): void {\n super.initialize();\n const cfg = this._config as TreePanelConfig;\n this._treeStore = cfg.store as TreeStore;\n this._rootVisible = cfg.rootVisible ?? true;\n this._singleExpand = cfg.singleExpand ?? false;\n this._checkable = cfg.checkable ?? false;\n this._cascadeCheck = cfg.cascadeCheck ?? false;\n this._treeBody = null;\n this._checkedSet = new Set();\n }\n\n protected override afterRender(): void {\n super.afterRender();\n const cfg = this._config as TreePanelConfig;\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n this.el!.classList.add('x-treepanel');\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n if (cfg.useArrows) this.el!.classList.add('x-tree-arrows');\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n if (cfg.lines) this.el!.classList.add('x-tree-lines');\n\n this._treeBody = document.createElement('div');\n this._treeBody.classList.add('x-tree-body');\n this.getBodyEl().appendChild(this._treeBody);\n\n this.renderTree();\n }\n\n // -----------------------------------------------------------------------\n // Rendering\n // -----------------------------------------------------------------------\n\n refresh(): void {\n this.renderTree();\n }\n\n private renderTree(): void {\n if (!this._treeBody || !this._treeStore) return;\n this._treeBody.innerHTML = '';\n\n const nodes = this._treeStore.getVisibleNodes(this._rootVisible);\n for (const node of nodes) {\n this._treeBody.appendChild(this.createNodeElement(node));\n }\n }\n\n private createNodeElement(node: TreeNode): HTMLElement {\n const row = document.createElement('div');\n row.classList.add('x-tree-node');\n row.setAttribute('data-node-id', node.id);\n\n // Indent\n const indent = document.createElement('span');\n indent.classList.add('x-tree-indent');\n const indentLevel = this._rootVisible ? node.depth : Math.max(0, node.depth - 1);\n indent.style.paddingLeft = `${indentLevel * 20}px`;\n row.appendChild(indent);\n\n // Expander\n if (!node.leaf) {\n const expander = document.createElement('span');\n expander.classList.add('x-tree-expander');\n expander.textContent = node.expanded ? '▾' : '▸';\n expander.style.cursor = 'pointer';\n expander.addEventListener('click', (e) => {\n e.stopPropagation();\n this.toggleNode(node);\n });\n row.appendChild(expander);\n } else {\n // Spacer for leaf alignment\n const spacer = document.createElement('span');\n spacer.classList.add('x-tree-expander-spacer');\n spacer.textContent = ' ';\n row.appendChild(spacer);\n }\n\n // Checkbox\n if (this._checkable) {\n const cb = document.createElement('input');\n cb.type = 'checkbox';\n cb.classList.add('x-tree-checkbox');\n cb.checked = node.checked;\n cb.addEventListener('click', (e) => {\n e.stopPropagation();\n const checked = cb.checked;\n node.checked = checked;\n if (this._cascadeCheck) {\n this._treeStore.cascadeCheck(node, checked);\n }\n this.fire('checkchange', this, node, checked);\n // Re-render to update child checkboxes\n this.renderTree();\n });\n row.appendChild(cb);\n }\n\n // Icon\n const icon = document.createElement('span');\n icon.classList.add('x-tree-icon', node.leaf ? 'x-tree-icon-leaf' : 'x-tree-icon-folder');\n row.appendChild(icon);\n\n // Text\n const text = document.createElement('span');\n text.classList.add('x-tree-node-text');\n text.textContent = node.text;\n row.appendChild(text);\n\n return row;\n }\n\n // -----------------------------------------------------------------------\n // Expand / Collapse\n // -----------------------------------------------------------------------\n\n private toggleNode(node: TreeNode): void {\n if (node.expanded) {\n this.collapseNode(node);\n } else {\n this.expandNode(node);\n }\n }\n\n private expandNode(node: TreeNode): void {\n this.fire('beforeitemexpand', this, node);\n\n if (this._singleExpand && node.parent) {\n // Collapse siblings\n for (const sibling of node.parent.children) {\n if (sibling !== node && sibling.expanded) {\n this._treeStore.collapseAll(sibling);\n }\n }\n }\n\n node.expanded = true;\n this.fire('itemexpand', this, node);\n this.renderTree();\n }\n\n private collapseNode(node: TreeNode): void {\n this.fire('beforeitemcollapse', this, node);\n node.expanded = false;\n this.fire('itemcollapse', this, node);\n this.renderTree();\n }\n\n expandAll(): void {\n this._treeStore.expandAll();\n this.renderTree();\n }\n\n collapseAll(): void {\n this._treeStore.collapseAll();\n this.renderTree();\n }\n\n async expandPath(path: string): Promise<void> {\n const node = this._treeStore.findByPath(path);\n if (!node) return;\n this._treeStore.expandToNode(node);\n this.renderTree();\n }\n\n // -----------------------------------------------------------------------\n // Checkbox\n // -----------------------------------------------------------------------\n\n getChecked(): TreeNode[] {\n return this._treeStore.getChecked();\n }\n\n // -----------------------------------------------------------------------\n // Accessors\n // -----------------------------------------------------------------------\n\n getStore(): TreeStore {\n return this._treeStore;\n }\n}\n","/**\n * @framesquared/grid – TreeStore\n *\n * Manages hierarchical data. Each node has text, children, id,\n * leaf/expanded state, and optional checked state. Provides\n * traversal, path resolution, and mutation helpers.\n */\n\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\n// ---------------------------------------------------------------------------\n// TreeNode\n// ---------------------------------------------------------------------------\n\nexport interface TreeNodeConfig {\n id?: string;\n text: string;\n leaf?: boolean;\n expanded?: boolean;\n checked?: boolean;\n children?: TreeNodeConfig[];\n [key: string]: unknown;\n}\n\nexport interface TreeNode {\n id: string;\n text: string;\n leaf: boolean;\n expanded: boolean;\n checked: boolean;\n children: TreeNode[];\n parent: TreeNode | null;\n depth: number;\n data: Record<string, unknown>;\n}\n\n// ---------------------------------------------------------------------------\n// TreeStore\n// ---------------------------------------------------------------------------\n\nexport interface TreeStoreConfig {\n root: TreeNodeConfig;\n}\n\nlet nodeCounter = 0;\n\nfunction buildNode(cfg: TreeNodeConfig, parent: TreeNode | null, depth: number): TreeNode {\n const node: TreeNode = {\n id: cfg.id ?? `tree-node-${nodeCounter++}`,\n text: cfg.text,\n leaf: cfg.leaf ?? (!cfg.children || cfg.children.length === 0),\n expanded: cfg.expanded ?? false,\n checked: cfg.checked ?? false,\n children: [],\n parent,\n depth,\n data: { ...cfg },\n };\n if (cfg.children) {\n node.children = cfg.children.map((c) => buildNode(c, node, depth + 1));\n }\n return node;\n}\n\nexport class TreeStore {\n private root: TreeNode;\n private nodeMap = new Map<string, TreeNode>();\n\n constructor(config: TreeStoreConfig) {\n nodeCounter = 0;\n this.root = buildNode(config.root, null, 0);\n this.buildMap(this.root);\n }\n\n private buildMap(node: TreeNode): void {\n this.nodeMap.set(node.id, node);\n for (const child of node.children) this.buildMap(child);\n }\n\n getRoot(): TreeNode {\n return this.root;\n }\n\n getNodeById(id: string): TreeNode | null {\n return this.nodeMap.get(id) ?? null;\n }\n\n /**\n * Returns visible nodes in display order (respecting expanded state).\n * If rootVisible is true, the root is included.\n */\n getVisibleNodes(rootVisible = true): TreeNode[] {\n const result: TreeNode[] = [];\n const walk = (node: TreeNode, include: boolean) => {\n if (include) result.push(node);\n if (node.expanded || (node === this.root && !include)) {\n // If this is the invisible root, still walk children\n }\n if (node.expanded) {\n for (const child of node.children) walk(child, true);\n }\n };\n\n if (rootVisible) {\n walk(this.root, true);\n } else {\n // Root not visible — walk root's children as top level\n for (const child of this.root.children) walk(child, true);\n }\n\n return result;\n }\n\n appendChild(parent: TreeNode, childCfg: TreeNodeConfig): TreeNode {\n const child = buildNode(childCfg, parent, parent.depth + 1);\n parent.children.push(child);\n parent.leaf = false;\n this.buildMap(child);\n return child;\n }\n\n removeNode(id: string): boolean {\n const node = this.nodeMap.get(id);\n if (!node || !node.parent) return false;\n const parent = node.parent;\n const idx = parent.children.indexOf(node);\n if (idx >= 0) parent.children.splice(idx, 1);\n this.removeFromMap(node);\n return true;\n }\n\n private removeFromMap(node: TreeNode): void {\n this.nodeMap.delete(node.id);\n for (const child of node.children) this.removeFromMap(child);\n }\n\n getPath(node: TreeNode): string {\n const parts: string[] = [];\n let current: TreeNode | null = node;\n while (current) {\n parts.unshift(current.text);\n current = current.parent;\n }\n return '/' + parts.join('/');\n }\n\n findByPath(path: string): TreeNode | null {\n const parts = path.split('/').filter(Boolean);\n let current = this.root;\n // First part should match root\n if (parts[0] !== current.text) return null;\n for (let i = 1; i < parts.length; i++) {\n const child = current.children.find((c) => c.text === parts[i]);\n if (!child) return null;\n current = child;\n }\n return current;\n }\n\n /** Expand all ancestors of a node so it becomes visible. */\n expandToNode(node: TreeNode): void {\n let current = node.parent;\n while (current) {\n current.expanded = true;\n current = current.parent;\n }\n }\n\n /** Set expanded=true on all non-leaf nodes. */\n expandAll(node?: TreeNode): void {\n const target = node ?? this.root;\n if (!target.leaf) target.expanded = true;\n for (const child of target.children) this.expandAll(child);\n }\n\n /** Set expanded=false on all nodes. */\n collapseAll(node?: TreeNode): void {\n const target = node ?? this.root;\n target.expanded = false;\n for (const child of target.children) this.collapseAll(child);\n }\n\n /** Cascade checked state to all descendants. */\n cascadeCheck(node: TreeNode, checked: boolean): void {\n node.checked = checked;\n for (const child of node.children) this.cascadeCheck(child, checked);\n }\n\n /** Get all checked nodes. */\n getChecked(node?: TreeNode): TreeNode[] {\n const result: TreeNode[] = [];\n const walk = (n: TreeNode) => {\n if (n.checked) result.push(n);\n for (const child of n.children) walk(child);\n };\n walk(node ?? this.root);\n return result;\n }\n\n // Store-like interface for Grid compatibility\n getRange(): any[] {\n return this.getVisibleNodes(true);\n }\n getCount(): number {\n return this.getRange().length;\n }\n getAt(i: number): any {\n return this.getRange()[i];\n }\n get(field: string): unknown {\n return (this.root as any)[field];\n }\n\n on(_evt: string, _fn: (...args: any[]) => void): void {\n /* placeholder */\n }\n sort(): void {\n /* placeholder */\n }\n isLoading(): boolean {\n return false;\n }\n getTotalCount(): number {\n return this.getCount();\n }\n}\n"],"mappings":"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","names":["Panel"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@framesquared/grid",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "Grid/table component",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -15,9 +15,14 @@
15
15
  "dist"
16
16
  ],
17
17
  "dependencies": {
18
- "@framesquared/core": "0.1.0",
19
- "@framesquared/component": "0.1.0",
20
- "@framesquared/ui": "0.1.0"
18
+ "@framesquared/core": "0.2.0",
19
+ "@framesquared/component": "0.2.0",
20
+ "@framesquared/ui": "0.2.0"
21
+ },
22
+ "license": "MIT",
23
+ "publishConfig": {
24
+ "access": "public",
25
+ "registry": "https://registry.npmjs.org"
21
26
  },
22
27
  "scripts": {
23
28
  "build": "tsup",