@cronocode/react-box 3.1.3 → 3.1.6

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.
@@ -0,0 +1,11 @@
1
+ import { default as ColumnModel } from '../models/columnModel';
2
+ import { default as GridModel } from '../models/gridModel';
3
+ interface Props<TRow> {
4
+ column: ColumnModel<TRow>;
5
+ grid: GridModel<TRow>;
6
+ }
7
+ /**
8
+ * Main column filter component that renders the appropriate filter type
9
+ */
10
+ export default function DataGridColumnFilter<TRow>(props: Props<TRow>): import("react/jsx-runtime").JSX.Element | null;
11
+ export {};
@@ -0,0 +1,8 @@
1
+ import { default as ColumnModel } from '../models/columnModel';
2
+ import { default as GridModel } from '../models/gridModel';
3
+ interface Props<TRow> {
4
+ column: ColumnModel<TRow>;
5
+ grid: GridModel<TRow>;
6
+ }
7
+ export default function DataGridFilterCell<TRow>(props: Props<TRow>): import("react/jsx-runtime").JSX.Element;
8
+ export {};
@@ -0,0 +1,6 @@
1
+ import { default as GridModel } from '../models/gridModel';
2
+ interface Props<TRow> {
3
+ grid: GridModel<TRow>;
4
+ }
5
+ export default function DataGridFilterRow<TRow>(props: Props<TRow>): import("react/jsx-runtime").JSX.Element[] | null;
6
+ export {};
@@ -0,0 +1,6 @@
1
+ import { default as GridModel } from '../models/gridModel';
2
+ interface Props<TRow> {
3
+ grid: GridModel<TRow>;
4
+ }
5
+ export default function DataGridGlobalFilter<TRow>(props: Props<TRow>): import("react/jsx-runtime").JSX.Element;
6
+ export {};
@@ -18,6 +18,46 @@ export interface PaginationState {
18
18
  export type Pagination = boolean | {
19
19
  pageSize: number;
20
20
  };
21
+ /** Filter type for column-level filtering */
22
+ export type ColumnFilterType = 'text' | 'number' | 'multiselect';
23
+ /** Text filter configuration (fuzzy search) */
24
+ export interface TextFilterValue {
25
+ type: 'text';
26
+ value: string;
27
+ }
28
+ /** Number filter configuration with comparison operators */
29
+ export interface NumberFilterValue {
30
+ type: 'number';
31
+ operator: 'eq' | 'ne' | 'gt' | 'gte' | 'lt' | 'lte' | 'between';
32
+ value: number;
33
+ valueTo?: number;
34
+ }
35
+ /** Multi-select filter configuration */
36
+ export interface MultiselectFilterValue {
37
+ type: 'multiselect';
38
+ values: (string | number | boolean | null)[];
39
+ }
40
+ /** Union type for all filter values */
41
+ export type FilterValue = TextFilterValue | NumberFilterValue | MultiselectFilterValue;
42
+ /** Column filters record - maps column key to filter value */
43
+ export type ColumnFilters<TRow> = Partial<Record<keyof TRow | Key, FilterValue>>;
44
+ /** Filter configuration for a column */
45
+ export interface ColumnFilterConfig {
46
+ type: ColumnFilterType;
47
+ /** Placeholder text for input */
48
+ placeholder?: string;
49
+ /** For multiselect: custom options. If not provided, unique values are computed from data */
50
+ options?: {
51
+ label: string;
52
+ value: string | number | boolean | null;
53
+ }[];
54
+ /** For number: step value for input */
55
+ step?: number;
56
+ /** For number: min value */
57
+ min?: number;
58
+ /** For number: max value */
59
+ max?: number;
60
+ }
21
61
  export interface ColumnType<TRow> {
22
62
  key: Key;
23
63
  header?: string;
@@ -28,6 +68,8 @@ export interface ColumnType<TRow> {
28
68
  Cell?: React.ComponentType<{
29
69
  cell: CellModel<TRow>;
30
70
  }>;
71
+ /** Enable filtering for this column. Set to true for default text filter, or provide config */
72
+ filterable?: boolean | ColumnFilterConfig;
31
73
  }
32
74
  export interface GridDefinition<TRow> {
33
75
  rowKey?: KeysMatching<TRow, Key> | ((rowData: TRow) => Key);
@@ -43,12 +85,24 @@ export interface GridDefinition<TRow> {
43
85
  visibleRowsCount?: number;
44
86
  topBar?: boolean;
45
87
  bottomBar?: boolean;
88
+ /** Enable global filter with fuzzy search */
89
+ globalFilter?: boolean;
90
+ /** Keys of columns to search in global filter. If not provided, all columns are searched */
91
+ globalFilterKeys?: (keyof TRow | Key)[];
46
92
  }
47
93
  export interface DataGridProps<TRow> {
48
94
  data: TRow[];
49
95
  def: GridDefinition<TRow>;
50
96
  loading?: boolean;
51
97
  onSelectionChange?: (event: SelectionChangeEvent<TRow>) => void;
98
+ /** Controlled global filter value */
99
+ globalFilterValue?: string;
100
+ /** Callback when global filter changes */
101
+ onGlobalFilterChange?: (value: string) => void;
102
+ /** Controlled column filters */
103
+ columnFilters?: ColumnFilters<TRow>;
104
+ /** Callback when column filters change */
105
+ onColumnFiltersChange?: (filters: ColumnFilters<TRow>) => void;
52
106
  }
53
107
  interface SelectionChangeEvent<TRow, TKey = TRow[keyof TRow] | number | string> {
54
108
  action: 'select' | 'deselect';
@@ -14,6 +14,7 @@ export default class ColumnModel<TRow> {
14
14
  get Cell(): import('react').ComponentType<{
15
15
  cell: import('./cellModel').default<TRow>;
16
16
  }> | undefined;
17
+ get filterable(): boolean | import('../contracts/dataGridContract').ColumnFilterConfig | undefined;
17
18
  private _pin?;
18
19
  get pin(): PinPosition | undefined;
19
20
  get uniqueKey(): string;
@@ -1,4 +1,4 @@
1
- import { DataGridProps, Key, PinPosition } from '../contracts/dataGridContract';
1
+ import { ColumnFilters, DataGridProps, FilterValue, Key, PinPosition } from '../contracts/dataGridContract';
2
2
  import { default as ColumnModel } from './columnModel';
3
3
  import { default as GroupRowModel } from './groupRowModel';
4
4
  import { default as RowModel } from './rowModel';
@@ -23,6 +23,57 @@ export default class GridModel<TRow> {
23
23
  }>;
24
24
  readonly headerRows: import('../../../utils/memo').Memo<ColumnModel<TRow>[][]>;
25
25
  readonly gridTemplateColumns: import('../../../utils/memo').Memo<string>;
26
+ private _globalFilterValue;
27
+ get globalFilterValue(): string;
28
+ private _columnFilters;
29
+ get columnFilters(): ColumnFilters<TRow>;
30
+ /**
31
+ * Apply global filter (fuzzy search across all or specified columns)
32
+ */
33
+ private applyGlobalFilter;
34
+ /**
35
+ * Apply column-level filters
36
+ */
37
+ private applyColumnFilters;
38
+ /**
39
+ * Check if a cell value matches a filter
40
+ */
41
+ private matchesFilter;
42
+ /**
43
+ * Get filtered data (applies global filter then column filters)
44
+ */
45
+ get filteredData(): TRow[];
46
+ /**
47
+ * Set global filter value
48
+ */
49
+ setGlobalFilter: (value: string) => void;
50
+ /**
51
+ * Set a single column filter
52
+ */
53
+ setColumnFilter: (columnKey: Key, filter: FilterValue | undefined) => void;
54
+ /**
55
+ * Clear all column filters
56
+ */
57
+ clearColumnFilters: () => void;
58
+ /**
59
+ * Clear all filters (global + column)
60
+ */
61
+ clearAllFilters: () => void;
62
+ /**
63
+ * Get unique values for a column (used for multiselect filter options)
64
+ */
65
+ getColumnUniqueValues: (columnKey: Key) => (string | number | boolean | null)[];
66
+ /**
67
+ * Check if any filter is active
68
+ */
69
+ get hasActiveFilters(): boolean;
70
+ /**
71
+ * Get count of filtered rows vs total rows
72
+ */
73
+ get filterStats(): {
74
+ filtered: number;
75
+ total: number;
76
+ };
26
77
  readonly rows: import('../../../utils/memo').Memo<GroupRowModel<TRow>[] | RowModel<TRow>[]>;
27
78
  readonly flatRows: import('../../../utils/memo').Memo<(GroupRowModel<TRow> | RowModel<TRow>)[]>;
28
79
  get rowHeight(): number;
@@ -1 +1 @@
1
- "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const s=require("react/jsx-runtime"),p=require("../box.cjs"),f=require("./flex.cjs"),g=require("react"),h=require("../core.cjs"),ee=require("./grid.cjs"),U=require("./checkbox.cjs"),C=require("./button.cjs"),_=require("./semantics.cjs"),te=require("./tooltip.cjs"),Re=require("./baseSvg.cjs");function ye(l){const{grid:e}=l;return s.jsxs(f.default,{component:"datagrid.bottomBar",children:[s.jsxs(p.default,{children:["Rows: ",e.props.data.length]}),e.props.def.rowSelection&&s.jsxs(p.default,{children:["Selected: ",e.selectedRows.size]})]})}function ie(l){const{cell:e}=l,t=g.useCallback(()=>{e.grid.toggleRowSelection(e.row.key)},[e.grid,e.row.key]);return s.jsx(U.default,{variant:"datagrid",checked:e.row.selected,onChange:t})}ie.displayName="DataGridCellRowSelection";const ve="NO_PIN";class D{constructor(e,t,i){this.def=e,this.grid=t,this.parent=i,this.columns=e.columns?.map(n=>new D(e.pin?{...n,pin:e.pin}:n,t,this))??[],this.isLeaf&&(this._inlineWidth=this.key==E?void 0:this.def.width??this.grid.DEFAULT_COLUMN_WIDTH_PX,this._pin=e.pin)}columns=[];get visibleColumns(){return this.columns.filter(e=>e.isVisible)}get key(){return this.def.key}get header(){return this.def.header}get align(){return this.def.align}get isLeaf(){return this.columns.length===0}get Cell(){return this.def.Cell}_pin;get pin(){if(this.isLeaf)return this._pin;const e=[...new Set(this.columns.flatMap(t=>t.pin))];if(e.length===1)return e[0]}get uniqueKey(){return`${this.key}${this.pin??""}`}getPinnedColumn(e){if(this.hasPin(e)){if(this.isLeaf)return this;const t=new D({...this.def,pin:e},this.grid,this.parent);return t.columns=this.columns.filter(i=>i.hasPin(e)).map(i=>{const n=i.getPinnedColumn(e);return n.parent=t,n}).filter(i=>!!i),t}}hasPin(e){return this.isLeaf?this._pin===e:this.columns.some(t=>t.hasPin(e))}get death(){return this.parent?this.parent.death+1:0}get flatColumns(){const e=[this];return e.push(...this.columns.flatMap(t=>t.flatColumns)),e}_inlineWidth;get inlineWidth(){if(this.isLeaf)return this._inlineWidth;const e=this.visibleColumns.map(t=>t.inlineWidth).filter(t=>typeof t=="number");if(e.length!==0)return e.sumBy(t=>t)}get left(){let e=0;if(this.parent){const{visibleColumns:t,left:i}=this.parent,n=t.findIndex(o=>o===this);e+=t.sumBy((o,r)=>r<n?o.inlineWidth??0:0),e+=i}else{const t=this.grid.columns.value.left.filter(n=>n.isVisible),i=t.findIndex(n=>n===this);e+=t.sumBy((n,o)=>o<i?n.inlineWidth??0:0)}return e}get right(){let e=0;if(this.parent){const{visibleColumns:t}=this.parent,i=t.reverse(),n=i.findIndex(o=>o===this);e+=i.sumBy((o,r)=>r<n?o.inlineWidth??0:0),e+=this.parent.right}else{const i=this.grid.columns.value.right.filter(o=>o.isVisible).reverse(),n=i.findIndex(o=>o===this);e+=i.sumBy((o,r)=>r<n?o.inlineWidth??0:0)}return e}get isEdge(){if(!this.pin)return!1;if(this.parent){const{visibleColumns:t}=this.parent;return(this.pin==="LEFT"?t.at(-1):t.at(0))===this&&this.parent.isEdge}return(this.pin==="LEFT"?this.grid.columns.value.left.filter(t=>t.isVisible).at(-1):this.grid.columns.value.right.filter(t=>t.isVisible).at(0))===this}get isVisible(){return this.isLeaf?!this.grid.hiddenColumns.has(this.key):this.leafs.some(e=>e.isVisible)}get leafs(){return this.isLeaf?[this]:this.visibleColumns.flatMap(e=>e.leafs)}get groupColumnWidthVarName(){return`--${this.uniqueKey}-group-width`}get widthVarName(){return`--${this.uniqueKey}-width`}get leftVarName(){return`--${this.uniqueKey}-left`}get rightVarName(){return`--${this.uniqueKey}-right`}get gridRows(){return this.isLeaf?this.grid.columns.value.maxDeath-this.death:1}resizeColumn=e=>{this.grid.isResizeMode=!0;const t=e.pageX,{MIN_COLUMN_WIDTH_PX:i,update:n}=this.grid,o=this.leafs.sumBy(d=>d.inlineWidth)-this.leafs.length*i,r=this.leafs.toRecord(d=>[d.key,d.inlineWidth]),c=h.FnUtils.throttle(d=>{const m=(d.pageX-t)*(this.pin==="RIGHT"?-1:1);this.leafs.forEach(w=>{const y=r[w.key],v=o>0?(y-i)/o*m:m/this.leafs.length,L=Math.round(y+v);w.setWidth(L<i?i:L)}),this.grid.sizes.clear(),n()},40),a=new AbortController,u=d=>{a.abort(),this.grid.isResizeMode=!1,n()};window.addEventListener("mousemove",c,a),window.addEventListener("mouseup",u,a)};pinColumn=e=>{this.isLeaf?this._pin=e:this.columns.forEach(t=>t.pinColumn(e)),this.grid.pinColumn(this.uniqueKey,e)};toggleGrouping=()=>{this.grid.toggleGrouping(this.key)};sortColumn=(...e)=>{this.grid.setSortColumn(this.key,...e)};setWidth=e=>{if(!this.isLeaf)throw new Error("Cannot set width for a parent column.");this._inlineWidth!==e&&(this._inlineWidth=e,this.grid.setWidth(this.key,e))};toggleVisibility=()=>{this.grid.toggleColumnVisibility(this.key)}}class be{constructor(e,t,i){this.grid=e,this.row=t,this.column=i}get value(){return this.column.key===R?this.row.rowIndex+1:this.row.data[this.column.key]}}class J{constructor(e,t,i){this.grid=e,this.data=t,this.rowIndex=i,this.grid=e,this.data=t,this.key=this.grid.getRowKey(t)}key;parentRow;count=1;get cells(){return this.grid.columns.value.visibleLeafs.map(e=>new be(this.grid,this,e))}get selected(){return this.grid.selectedRows.has(this.key)}get flatRows(){return this}get allRows(){return this}}const E="empty-cell",R="row-number-cell",Q=70,M="row-selection-cell",j="grouping-cell";class je{constructor(e,t){this.props=e,this.update=t,console.debug("\x1B[32m%s\x1B[0m","[react-box]: DataGrid GridModel ctor")}sourceColumns=h.memo(()=>{const{def:e}=this.props,t=[];if(this.groupColumns.size>0&&t.push(new D({key:j},this)),t.push(...e.columns.map(i=>new D(i,this))),t.push(new D({key:E,Cell:()=>null},this)),e.rowSelection){const i=typeof e.rowSelection=="object"&&e.rowSelection.pinned?"LEFT":void 0;t.unshift(new D({key:M,pin:i,width:50,align:"center",Cell:ie},this))}if(e.showRowNumber){let i,n=Q;typeof e.showRowNumber=="object"&&(e.showRowNumber.pinned&&(i="LEFT"),n=e.showRowNumber.width??Q),t.unshift(new D({key:R,pin:i,width:n,align:"right"},this))}return t});columns=h.memo(()=>{console.debug("\x1B[36m%s\x1B[0m","[react-box]: DataGrid columns memo");const e=this.sourceColumns.value.map(a=>a.getPinnedColumn("LEFT")).filter(a=>!!a),t=this.sourceColumns.value.map(a=>a.getPinnedColumn()).filter(a=>!!a),i=this.sourceColumns.value.map(a=>a.getPinnedColumn("RIGHT")).filter(a=>!!a),n=[...e,...t,...i].flatMap(a=>a.flatColumns),o=n.filter(a=>a.isLeaf),r=n.filter(a=>a.isLeaf&&a.isVisible),c=n.maxBy(a=>a.death)+1;return{left:e,middle:t,right:i,flat:n,leafs:o,visibleLeafs:r,maxDeath:c}});headerRows=h.memo(()=>(console.debug("\x1B[36m%s\x1B[0m","[react-box]: DataGrid headerRows memo"),this.columns.value.flat.groupBy(t=>t.death).sortBy(t=>t.key).map(t=>{const i=t.values.groupBy(n=>n.pin??ve).toRecord(n=>[n.key,n.values]);return[...i.LEFT?.filter(n=>n.isVisible)??[],...i.NO_PIN?.filter(n=>n.isVisible)??[],...i.RIGHT?.filter(n=>n.isVisible)??[]]})));gridTemplateColumns=h.memo(()=>{console.debug("\x1B[36m%s\x1B[0m","[react-box]: DataGrid gridTemplateColumns memo");const{visibleLeafs:e}=this.columns.value,t=e.sumBy(r=>r.pin==="RIGHT"?1:0),i=e.length-t-1,n=i>0?`repeat(${i}, max-content)`:"",o=t>0?`repeat(${t}, max-content)`:"";return`${n} auto ${o}`});rows=h.memo(()=>{console.debug("\x1B[36m%s\x1B[0m","[react-box]: DataGrid rows memo");let e=this.props.data;if(this._sortColumn&&(e=e.sortBy(t=>t[this._sortColumn],this._sortDirection)),this.groupColumns.size>0){const t=(i,n,o)=>{const r=n.values().next().value;n.delete(r);const c=this.columns.value.leafs.findOrThrow(a=>a.key===r);return this._sortColumn===j&&(i=i.sortBy(a=>a[r],this._sortDirection)),i.groupBy(a=>a[r]).map(a=>{let u;n.size>0?u=t(a.values,new Set(n),o+1):u=a.values.map((m,w)=>new J(this,m,o+1+w));const d=new se(this,c,u,o,a.key);return o+=1,d.expanded&&(o+=u.length),d})};return t(e,new Set(this.groupColumns),0)}return e.map((t,i)=>new J(this,t,i))});flatRows=h.memo(()=>(console.debug("\x1B[36m%s\x1B[0m","[react-box]: DataGrid flatRows memo"),this.rows.value.flatMap(e=>e.flatRows)));get rowHeight(){return this.props.def.rowHeight??this.DEFAULT_ROW_HEIGHT_PX}sizes=h.memo(()=>{console.debug("\x1B[36m%s\x1B[0m","[react-box]: DataGrid sizes memo");const e=this.columns.value.flat.reduce((n,o)=>{const{inlineWidth:r}=o;return typeof r=="number"&&(n[o.widthVarName]=`${o.inlineWidth}px`),o.pin==="LEFT"&&(n[o.leftVarName]=`${o.left}px`),o.pin==="RIGHT"&&(n[o.rightVarName]=`${o.right}px`),n},{});e[this.rowHeightVarName]=`${this.rowHeight}px`,e[this.leftEdgeVarName]=`${this.leftEdge}px`;const{visibleLeafs:t}=this.columns.value,i=t.find(n=>n.key===j);if(i){const n=t.sumBy(o=>o.pin===i.pin&&o.key!==R&&o.key!==M?o.inlineWidth??0:0);e[i.groupColumnWidthVarName]=`${n}px`}return this.groupColumns.forEach(n=>{const o=this.columns.value.leafs.findOrThrow(r=>r.key===n);e[o.groupColumnWidthVarName]=`${t.sumBy(r=>r.pin===o.pin?r.inlineWidth??0:0)}px`}),e});DEFAULT_ROW_HEIGHT_PX=48;MIN_COLUMN_WIDTH_PX=48;DEFAULT_COLUMN_WIDTH_PX=200;isResizeMode=!1;expandedGroupRow=new Set;selectedRows=new Set;get leftEdge(){return this.columns.value.left.sumBy(e=>e.inlineWidth??0)}get rightEdge(){return this.columns.value.right.sumBy(e=>e.inlineWidth??0)}leftEdgeVarName="--left-edge";rowHeightVarName="--row-height";_idMap=new WeakMap;getRowKey(e){const{rowKey:t}=this.props.def;return t?typeof t=="function"?t(e):e[t]:(this._idMap.has(e)||this._idMap.set(e,crypto.randomUUID()),this._idMap.get(e))}setSortColumn=(e,...t)=>{if(t.length>0)[this._sortDirection]=t,this._sortColumn=this._sortDirection?e:void 0;else{const{_sortColumn:i,_sortDirection:n}=this;this._sortColumn=i===e&&n==="DESC"?void 0:e,this._sortDirection=i===e&&n==="ASC"?"DESC":"ASC"}this.headerRows.clear(),this.rows.clear(),this.flatRows.clear(),this.update()};pinColumn=(e,t)=>{const i=this.columns.value.flat.findOrThrow(n=>n.uniqueKey===e);i.pin!==t&&i.pinColumn(t),this.columns.clear(),this.headerRows.clear(),this.gridTemplateColumns.clear(),this.rows.clear(),this.flatRows.clear(),this.sizes.clear(),this.update()};toggleGrouping=e=>{this.groupColumns=new Set(this.groupColumns),this.hiddenColumns=new Set(this.hiddenColumns),this.groupColumns.has(e)?(this.groupColumns.delete(e),this.hiddenColumns.delete(e)):(this.groupColumns.add(e),this.hiddenColumns.add(e)),this.sourceColumns.clear(),this.columns.clear(),this.headerRows.clear(),this.gridTemplateColumns.clear(),this.rows.clear(),this.flatRows.clear(),this.sizes.clear(),this.update()};unGroupAll=()=>{this.groupColumns=new Set,this.sourceColumns.clear(),this.columns.clear(),this.headerRows.clear(),this.gridTemplateColumns.clear(),this.rows.clear(),this.flatRows.clear(),this.sizes.clear(),this.update()};toggleGroupRow=e=>{this.expandedGroupRow=new Set(this.expandedGroupRow),this.expandedGroupRow.has(e)?this.expandedGroupRow.delete(e):this.expandedGroupRow.add(e),this.rows.clear(),this.flatRows.clear(),this.update()};toggleRowSelection=e=>{this.toggleRowsSelection([e])};toggleRowsSelection=e=>{this.selectedRows=new Set(this.selectedRows);const t=e.every(i=>this.selectedRows.has(i));t?e.forEach(i=>this.selectedRows.delete(i)):e.forEach(i=>this.selectedRows.add(i)),this.flatRows.clear(),this.update(),this.props.onSelectionChange?.({action:t?"deselect":"select",affectedRowKeys:e,selectedRowKeys:Array.from(this.selectedRows),isAllSelected:this.selectedRows.size===this.props.data.length})};toggleSelectAllRows=()=>{this.toggleRowsSelection(this.props.data.map(e=>this.getRowKey(e)))};toggleColumnVisibility=e=>{this.hiddenColumns=new Set(this.hiddenColumns),this.hiddenColumns.has(e)?this.hiddenColumns.delete(e):this.hiddenColumns.add(e),this.columns.clear(),this.headerRows.clear(),this.gridTemplateColumns.clear(),this.rows.clear(),this.flatRows.clear(),this.sizes.clear(),this.update()};setWidth=(e,t)=>{const i=this.columns.value.leafs.find(o=>o.key===e);if(!i)throw new Error("Leaf column not found.");i.setWidth(t),this.sourceColumns.value.flatMap(o=>o.flatColumns).findOrThrow(o=>o.key===e).setWidth(t)};groupColumns=new Set;hiddenColumns=new Set;_sortColumn;get sortColumn(){return this._sortColumn}_sortDirection="ASC";get sortDirection(){return this._sortDirection}}class Ge{constructor(e,t,i){this.grid=e,this.row=t,this.column=i}get value(){return this.column.key===R?this.row.rowIndex+1:this.column.key===j?`${this.row.groupValue} (${this.row.count})`:null}}class se{constructor(e,t,i,n,o){this.grid=e,this.groupColumn=t,this.rows=i,this.rowIndex=n,this.groupValue=o,i.forEach(r=>r.parentRow=this)}get key(){return`${this.parentRow?.key??""}${this.groupColumn.key}${this.groupValue}`}parentRow;get cells(){return this.grid.columns.value.visibleLeafs.map(e=>new Ge(this.grid,this,e))}get selected(){return this.allRows.every(e=>e.selected)}get indeterminate(){return!this.selected&&this.allRows.some(e=>e.selected)}get expanded(){return this.grid.expandedGroupRow.has(this.key)}get depth(){return this.parentRow?this.parentRow.depth+1:0}get count(){return this.rows.sumBy(e=>e.count,0)}get flatRows(){return this.expanded?[this,...this.rows.flatMap(e=>e.flatRows)]:[this]}get allRows(){return this.rows.flatMap(e=>e.allRows)}get groupingColumn(){return this.grid.columns.value.leafs.findOrThrow(e=>e.key===j)}get groupingColumnGridColumn(){const{visibleLeafs:e}=this.grid.columns.value,{groupingColumn:t}=this;return e.sumBy(n=>n.pin===t.pin&&n.key!==E&&n.key!==M&&n.key!==R?1:0)}toggleRow(){this.grid.toggleGroupRow(this.key)}}function A(l){const{children:e,column:t,style:i,...n}=l,{key:o,pin:r,left:c,right:a,isEdge:u,align:d,widthVarName:m,leftVarName:w,rightVarName:y}=t;"align"in t.def&&(n.jc=d);const v=o===R,L=o===M,G=r==="LEFT",k=r==="RIGHT",b=G||k,x=G&&c===0,S=G&&u,T=k&&u,N=k&&a===0;return s.jsx(f.default,{component:"datagrid.body.cell",props:{role:"cell"},variant:{isPinned:b,isFirstLeftPinned:x,isLastLeftPinned:S,isFirstRightPinned:T,isLastRightPinned:N,isRowSelection:L,isRowNumber:v},style:{width:`var(${m})`,height:`var(${t.grid.rowHeightVarName})`,left:G?`var(${w})`:void 0,right:k?`var(${y})`:void 0,...i},...n,children:e})}A.displayName="DataGridCell";function ne(l){const{row:e}=l,{selected:t,indeterminate:i,cells:n,groupingColumn:o,groupingColumnGridColumn:r,depth:c,expanded:a}=e,u=g.useCallback(()=>{e.grid.toggleRowsSelection(e.allRows.map(d=>d.key))},[]);return s.jsx(f.default,{className:"grid-row",selected:t,display:"contents",props:{role:"rowgroup"},children:n.map(d=>{const{key:m,pin:w,groupColumnWidthVarName:y}=d.column,v=w==="RIGHT";if(m===j)return s.jsx(A,{column:d.column,style:{width:`var(${y})`,right:v?"0":void 0},br:o.pin==="LEFT"?1:void 0,gridColumn:r,pl:4*c,overflow:"auto",children:s.jsx(p.default,{textWrap:"nowrap",px:3,children:s.jsxs(C.default,{clean:!0,onClick:()=>e.toggleRow(),cursor:"pointer",display:"flex",gap:1,ai:"center",children:[s.jsx(h.ExpandIcon,{fill:"currentColor",width:"14px",height:"14px",rotate:a?0:-90}),d.value]})})},m);if(m===M)return s.jsx(A,{column:d.column,children:s.jsx(U.default,{variant:"datagrid",m:1,checked:t,indeterminate:i,onChange:u})},m);if(w!==o.pin||m===R||m===E)return s.jsx(A,{column:d.column,px:m===R?3:void 0,children:d.value},m)})})}ne.displayName="DataGridGroupRow";function oe(l){const{cell:e}=l;return s.jsx(f.default,{height:"fit",width:"fit",overflow:"auto",ai:"center",jc:e.column.align,children:s.jsx(p.default,{px:3,textOverflow:"ellipsis",overflow:"hidden",textWrap:"nowrap",children:e.value})})}oe.displayName="DataGridCellText";function re(l){const{row:e}=l,{selected:t}=e;return s.jsx(f.default,{className:"grid-row",selected:t,display:"contents",props:{role:"row"},children:e.cells.map(i=>s.jsx(A,{column:i.column,children:i.column.Cell?s.jsx(i.column.Cell,{cell:i}):s.jsx(oe,{cell:i})},i.column.key))})}re.displayName="DataGridRow";const ke=10,Z=20;function le(l){const{grid:e,scrollTop:t}=l,i=e.flatRows.value.length,n=Math.max(0,Math.floor(t/e.rowHeight)-Z),o=e.props.def.visibleRowsCount??ke,r=e.rowHeight*o+e.rowHeight/5,c=g.useMemo(()=>{if(console.debug("\x1B[36m%s\x1B[0m","[react-box]: DataGrid render rows"),e.props.data.length===0)return s.jsx(f.default,{jc:"center",ai:"center",gridColumn:"full-row",style:{height:r},children:e.props.loading?"loading...":"empty"});const a=o+Z*2;return e.flatRows.value.take(a,n).map(d=>d instanceof se?s.jsx(ne,{row:d},d.key):s.jsx(re,{row:d},d.key))},[e.flatRows.value,e.props.data.length,e.props.loading,n,r,o]);return console.debug("\x1B[36m%s\x1B[0m","[react-box]: DataGrid render DataGridBody"),s.jsx(p.default,{style:{height:r},children:s.jsx(p.default,{style:{height:`${i*e.rowHeight}px`},children:s.jsx(ee.default,{component:"datagrid.body",width:"max-content",minWidth:"fit",transition:"none",style:{transform:`translateY(${n*e.rowHeight}px)`,gridTemplateColumns:e.gridTemplateColumns.value},children:c})})})}le.displayName="DataGridBody";function ae(l){const{column:e}=l,{key:t,pin:i,left:n,right:o,isEdge:r,isLeaf:c,align:a,header:u,grid:d}=e,[m,w,y]=h.useVisibility({hideOnScroll:!0,event:"mousedown"}),[v,L]=g.useState({top:0,left:0}),G=g.useMemo(()=>v.left>window.innerWidth/2,[v.left]),k=c&&(d.sortColumn!==t||d.sortDirection==="DESC"),b=c&&(d.sortColumn!==t||d.sortDirection==="ASC"),x=c&&d.sortColumn===t,S=i!=="LEFT",T=i!=="RIGHT",N=!!i,P=c&&t!==j,I=c&&t===j,O=k||b||x,$=S||T||N,F=a==="right"?2:void 0,q=a==="right"?void 0:i==="RIGHT"?2.5:4,X=t===E,W=t===R,Y=t===M,H=i==="LEFT",V=i==="RIGHT",K=H||i==="RIGHT",B=H&&n===0,z=H&&r,we=V&&r,Ce=V&&o===0,xe=c&&!X&&!W&&!Y;return s.jsx(f.default,{position:"absolute",left:F,right:q,top:"1/2",translateY:-3,ai:"center",children:s.jsxs(C.default,{component:"datagrid.header.cell.contextMenu",onClick:()=>w(!m),variant:{isPinned:K,isFirstLeftPinned:B,isLastLeftPinned:z,isFirstRightPinned:we,isLastRightPinned:Ce,isSortable:xe,isRowNumber:W},children:[s.jsx(_.Span,{component:"datagrid.header.cell.contextMenu.icon",children:s.jsx(h.DotsIcon,{fill:"currentColor"})}),m&&s.jsxs(te.default,{component:"datagrid.header.cell.contextMenu.tooltip",variant:{openLeft:G},onPositionChange:L,ref:y,children:[k&&s.jsxs(C.default,{component:"datagrid.header.cell.contextMenu.tooltip.item",onClick:()=>e.sortColumn("ASC"),children:[s.jsx(_.Span,{component:"datagrid.header.cell.contextMenu.tooltip.item.icon",children:s.jsx(h.SortIcon,{width:"100%",fill:"currentColor"})}),"Sort Ascending"]}),b&&s.jsxs(C.default,{component:"datagrid.header.cell.contextMenu.tooltip.item",onClick:()=>e.sortColumn("DESC"),children:[s.jsx(_.Span,{component:"datagrid.header.cell.contextMenu.tooltip.item.icon",children:s.jsx(h.SortIcon,{width:"100%",fill:"currentColor",rotate:180})}),"Sort Descending"]}),x&&s.jsxs(C.default,{component:"datagrid.header.cell.contextMenu.tooltip.item",onClick:()=>e.sortColumn(void 0),children:[s.jsx(p.default,{width:4}),"Clear Sort"]}),O&&($||P||I)&&s.jsx(p.default,{bb:1,my:2,borderColor:"gray-300"}),S&&s.jsxs(C.default,{component:"datagrid.header.cell.contextMenu.tooltip.item",onClick:()=>e.pinColumn("LEFT"),children:[s.jsx(_.Span,{component:"datagrid.header.cell.contextMenu.tooltip.item.icon",children:s.jsx(h.PinIcon,{width:"100%",fill:"currentColor"})}),"Pin Left"]}),T&&s.jsxs(C.default,{component:"datagrid.header.cell.contextMenu.tooltip.item",onClick:()=>e.pinColumn("RIGHT"),children:[s.jsx(_.Span,{component:"datagrid.header.cell.contextMenu.tooltip.item.icon",children:s.jsx(h.PinIcon,{width:"100%",fill:"currentColor",rotate:-90})}),"Pin Right"]}),N&&s.jsxs(C.default,{component:"datagrid.header.cell.contextMenu.tooltip.item",onClick:()=>e.pinColumn(),children:[s.jsx(p.default,{width:4}),"Unpin"]}),O&&$&&(P||I)&&s.jsx(p.default,{bb:1,my:2,borderColor:"gray-300"}),P&&s.jsxs(C.default,{component:"datagrid.header.cell.contextMenu.tooltip.item",onClick:e.toggleGrouping,children:[s.jsx(_.Span,{component:"datagrid.header.cell.contextMenu.tooltip.item.icon",children:s.jsx(h.GroupingIcon,{width:"100%",fill:"currentColor"})}),s.jsxs(p.default,{textWrap:"nowrap",children:["Group by ",u??t]})]}),I&&s.jsxs(C.default,{component:"datagrid.header.cell.contextMenu.tooltip.item",onClick:d.unGroupAll,children:[s.jsx(_.Span,{component:"datagrid.header.cell.contextMenu.tooltip.item.icon",children:s.jsx(h.GroupingIcon,{width:"100%",fill:"currentColor"})}),s.jsx(p.default,{textWrap:"nowrap",children:"Un-Group All"})]})]})]})})}ae.displayName="DataGridHeaderCellContextMenu";function de(l){const{column:e}=l;return s.jsx(f.default,{height:"fit",ai:"center",position:"absolute",right:e.pin==="RIGHT"?void 0:0,left:e.pin!=="RIGHT"?void 0:0,py:3,children:s.jsx(p.default,{cursor:"col-resize",px:.75,className:"resizer",height:"fit",props:{onMouseDown:e.resizeColumn,onTouchStart:e.resizeColumn},children:s.jsx(p.default,{component:"datagrid.header.cell.resizer"})})})}de.displayName="DataGridHeaderCellResizer";function ue(l){const{column:e}=l,{key:t,pin:i,left:n,right:o,isEdge:r,isLeaf:c,leafs:a,grid:u,header:d,gridRows:m,widthVarName:w,leftVarName:y,rightVarName:v,inlineWidth:L}=e,G=t===E,k=t===j,b=t===R,x=t===M,S=i==="LEFT",T=i==="RIGHT",N=S||i==="RIGHT",P=S&&n===0,I=S&&r,O=T&&r,$=T&&o===0,F=c&&!G&&!b&&!x,q=c?1:a.length,X=!b&&!x,W=!b&&!x,Y=x?void 0:e.align==="right"?10:3,H=x?void 0:e.align==="center"?3:void 0,V=g.useCallback(()=>{u.toggleSelectAllRows()},[]),K=g.useMemo(()=>{if(b)return null;if(x){const B=u.selectedRows.size===u.props.data.length,z=!B&&u.selectedRows.size>0;return s.jsx(U.default,{variant:"datagrid",m:1,indeterminate:z,checked:B,onChange:V})}if(k){if(u.groupColumns.size===1){const B=u.columns.value.leafs.findOrThrow(z=>z.key===u.groupColumns.values().next().value);return B.header??B.key}return"Group"}return d??t},[u.groupColumns,u.selectedRows,V]);return s.jsx(f.default,{props:{role:"columnheader"},component:"datagrid.header.cell",variant:{isPinned:N,isFirstLeftPinned:P,isLastLeftPinned:I,isFirstRightPinned:O,isLastRightPinned:$,isSortable:F,isRowNumber:b},gridRow:m,gridColumn:q,style:{width:`var(${w})`,left:S?`var(${y})`:void 0,right:T?`var(${v})`:void 0},children:!G&&s.jsxs(s.Fragment,{children:[s.jsx(f.default,{width:"fit",height:"fit",jc:e.align,props:{onClick:F?()=>e.sortColumn():void 0},children:s.jsxs(f.default,{overflow:"hidden",position:c?void 0:"sticky",ai:"center",transition:"none",pl:Y,pr:H,style:{left:i?void 0:`var(${u.leftEdgeVarName})`},children:[s.jsx(p.default,{overflow:"hidden",textOverflow:"ellipsis",textWrap:"nowrap",children:K}),t===u.sortColumn&&s.jsx(p.default,{pl:(L??0)<58?0:2,children:s.jsx(h.SortIcon,{width:"16px",rotate:u.sortDirection==="ASC"?0:180,fill:"currentColor"})}),W&&s.jsx(p.default,{minWidth:e.align==="right"?4:10})]})}),X&&s.jsx(de,{column:e}),W&&s.jsx(ae,{column:e})]})})}ue.displayName="DataGridHeaderCell";function ce(l){const{grid:e}=l,{isResizeMode:t}=e;return s.jsx(ee.default,{component:"datagrid.header",variant:{isResizeMode:t},style:{gridTemplateColumns:e.gridTemplateColumns.value},children:e.headerRows.value.map(i=>i.map(n=>s.jsx(ue,{column:n},n.uniqueKey)))})}ce.displayName="DataGridHeader";function he(l){const{grid:e}=l,[t,i]=g.useState(0),n=g.useCallback(h.FnUtils.throttle(o=>{i(o.target.scrollTop)},100),[]);return s.jsxs(p.default,{overflowX:"scroll",props:{onScroll:n},children:[s.jsx(ce,{grid:e}),s.jsx(le,{grid:e,scrollTop:t})]})}he.displayName="DataGridContent";function me(l){const{grid:e}=l;return e.groupColumns.size===0?null:s.jsxs(f.default,{component:"datagrid.topBar.columnGroups",children:[s.jsx(_.Span,{component:"datagrid.topBar.columnGroups.icon",children:s.jsx(h.GroupingIcon,{width:"100%",fill:"currentColor"})}),Array.from(e.groupColumns,t=>{const i=e.columns.value.leafs.findOrThrow(n=>n.key===t);return s.jsxs(g.Fragment,{children:[s.jsx(h.ExpandIcon,{fill:"currentColor",width:"14px",height:"14px",rotate:-90}),s.jsxs(f.default,{component:"datagrid.topBar.columnGroups.item",children:[i.header??i.key,s.jsx(C.default,{component:"datagrid.topBar.columnGroups.item.icon",onClick:()=>e.toggleGrouping(i.key),children:s.jsx(h.CloseSvg,{fill:"currentColor",width:"100%"})})]})]},t)})]})}me.displayName="DataGridColumnGroups";function pe(l){const{grid:e}=l,[t,i,n]=h.useVisibility({event:"mousedown"}),o=g.useMemo(()=>e.columns.value.leafs.filter(r=>![E,R,M,j].includes(r.key)),[e.columns.value.leafs]);return s.jsxs(C.default,{component:"datagrid.topBar.contextMenu",onClick:()=>i(!t),children:[s.jsx(Re.default,{viewBox:"0 0 24 24",width:"20",fill:"currentColor",...l,children:s.jsx("path",{d:"M5 6h14M5 12h14M5 18h14",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round"})}),t&&s.jsx(te.default,{component:"datagrid.topBar.contextMenu.tooltip",ref:n,children:o.map(r=>s.jsxs(C.default,{component:"datagrid.topBar.contextMenu.tooltip.item",onClick:c=>{c.stopPropagation(),r.toggleVisibility()},children:[s.jsx(U.default,{variant:"datagrid",checked:r.isVisible,onChange:()=>{},focus:{outline:0}}),r.header??r.key]},r.key))})]})}pe.displayName="DataGridTopBarContextMenu";function ge(l){const{grid:e}=l;return s.jsxs(f.default,{component:"datagrid.topBar",position:"relative",children:[s.jsx(pe,{grid:e}),s.jsx(me,{grid:e})]})}ge.displayName="DataGridTopBar";function Se(l){const[e,t]=g.useState(0),i=g.useRef();return i.current||(i.current=new je(l,()=>t(n=>n+1))),g.useEffect(()=>{i.current.props=l,i.current.rows.clear(),i.current.flatRows.clear(),i.current.update()},[l.data]),g.useEffect(()=>{i.current.props=l,i.current.sourceColumns.clear(),i.current.columns.clear(),i.current.headerRows.clear(),i.current.gridTemplateColumns.clear(),i.current.rows.clear(),i.current.flatRows.clear(),i.current.sizes.clear(),i.current.update()},[l.def]),g.useEffect(()=>{i.current.props=l,i.current.update()},[l.loading]),i.current}function fe(l){const e=Se(l);return console.debug("\x1B[36m%s\x1B[0m","[react-box]: DataGrid render"),s.jsxs(p.default,{component:"datagrid",style:e.sizes.value,props:{role:"presentation"},children:[e.props.def.topBar&&s.jsx(ge,{grid:e}),s.jsx(he,{grid:e}),e.props.def.bottomBar&&s.jsx(ye,{grid:e})]})}fe.displayName="DataGrid";exports.default=fe;
1
+ "use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});const n=require("react/jsx-runtime"),f=require("../box.cjs"),m=require("./flex.cjs"),d=require("react"),ne=require("./grid.cjs"),C=require("../core.cjs"),X=require("./checkbox.cjs"),S=require("./button.cjs"),L=require("./dropdown.cjs"),O=require("./textbox.cjs"),M=require("./semantics.cjs"),se=require("./tooltip.cjs"),Ge=require("./baseSvg.cjs");function Fe(o){const{grid:e}=o,{filtered:t,total:i}=e.filterStats,s=e.hasActiveFilters;return n.jsxs(m.default,{component:"datagrid.bottomBar",children:[n.jsxs(f.default,{children:["Rows: ",s?`${t} / ${i}`:i]}),e.props.def.rowSelection&&n.jsxs(f.default,{children:["Selected: ",e.selectedRows.size]}),s&&n.jsx(f.default,{color:"blue-600",cursor:"pointer",hover:{textDecoration:"underline"},props:{onClick:e.clearAllFilters},children:"Clear filters"})]})}function re(o){const{cell:e}=o,t=d.useCallback(()=>{e.grid.toggleRowSelection(e.row.key)},[e.grid,e.row.key]);return n.jsx(X.default,{variant:"datagrid",checked:e.row.selected,onChange:t})}re.displayName="DataGridCellRowSelection";const Se="NO_PIN";class B{constructor(e,t,i){this.def=e,this.grid=t,this.parent=i,this.columns=e.columns?.map(s=>new B(e.pin?{...s,pin:e.pin}:s,t,this))??[],this.isLeaf&&(this._inlineWidth=this.key==E?void 0:this.def.width??this.grid.DEFAULT_COLUMN_WIDTH_PX,this._pin=e.pin)}columns=[];get visibleColumns(){return this.columns.filter(e=>e.isVisible)}get key(){return this.def.key}get header(){return this.def.header}get align(){return this.def.align}get isLeaf(){return this.columns.length===0}get Cell(){return this.def.Cell}get filterable(){return this.def.filterable}_pin;get pin(){if(this.isLeaf)return this._pin;const e=[...new Set(this.columns.flatMap(t=>t.pin))];if(e.length===1)return e[0]}get uniqueKey(){return`${this.key}${this.pin??""}`}getPinnedColumn(e){if(this.hasPin(e)){if(this.isLeaf)return this;const t=new B({...this.def,pin:e},this.grid,this.parent);return t.columns=this.columns.filter(i=>i.hasPin(e)).map(i=>{const s=i.getPinnedColumn(e);return s.parent=t,s}).filter(i=>!!i),t}}hasPin(e){return this.isLeaf?this._pin===e:this.columns.some(t=>t.hasPin(e))}get death(){return this.parent?this.parent.death+1:0}get flatColumns(){const e=[this];return e.push(...this.columns.flatMap(t=>t.flatColumns)),e}_inlineWidth;get inlineWidth(){if(this.isLeaf)return this._inlineWidth;const e=this.visibleColumns.map(t=>t.inlineWidth).filter(t=>typeof t=="number");if(e.length!==0)return e.sumBy(t=>t)}get left(){let e=0;if(this.parent){const{visibleColumns:t,left:i}=this.parent,s=t.findIndex(r=>r===this);e+=t.sumBy((r,l)=>l<s?r.inlineWidth??0:0),e+=i}else{const t=this.grid.columns.value.left.filter(s=>s.isVisible),i=t.findIndex(s=>s===this);e+=t.sumBy((s,r)=>r<i?s.inlineWidth??0:0)}return e}get right(){let e=0;if(this.parent){const{visibleColumns:t}=this.parent,i=t.reverse(),s=i.findIndex(r=>r===this);e+=i.sumBy((r,l)=>l<s?r.inlineWidth??0:0),e+=this.parent.right}else{const i=this.grid.columns.value.right.filter(r=>r.isVisible).reverse(),s=i.findIndex(r=>r===this);e+=i.sumBy((r,l)=>l<s?r.inlineWidth??0:0)}return e}get isEdge(){if(!this.pin)return!1;if(this.parent){const{visibleColumns:t}=this.parent;return(this.pin==="LEFT"?t.at(-1):t.at(0))===this&&this.parent.isEdge}return(this.pin==="LEFT"?this.grid.columns.value.left.filter(t=>t.isVisible).at(-1):this.grid.columns.value.right.filter(t=>t.isVisible).at(0))===this}get isVisible(){return this.isLeaf?!this.grid.hiddenColumns.has(this.key):this.leafs.some(e=>e.isVisible)}get leafs(){return this.isLeaf?[this]:this.visibleColumns.flatMap(e=>e.leafs)}get groupColumnWidthVarName(){return`--${this.uniqueKey}-group-width`}get widthVarName(){return`--${this.uniqueKey}-width`}get leftVarName(){return`--${this.uniqueKey}-left`}get rightVarName(){return`--${this.uniqueKey}-right`}get gridRows(){return this.isLeaf?this.grid.columns.value.maxDeath-this.death:1}resizeColumn=e=>{this.grid.isResizeMode=!0;const t=e.pageX,{MIN_COLUMN_WIDTH_PX:i,update:s}=this.grid,r=this.leafs.sumBy(u=>u.inlineWidth)-this.leafs.length*i,l=this.leafs.toRecord(u=>[u.key,u.inlineWidth]),c=C.FnUtils.throttle(u=>{const p=(u.pageX-t)*(this.pin==="RIGHT"?-1:1);this.leafs.forEach(w=>{const y=l[w.key],v=r>0?(y-i)/r*p:p/this.leafs.length,R=Math.round(y+v);w.setWidth(R<i?i:R)}),this.grid.sizes.clear(),s()},40),a=new AbortController,h=u=>{a.abort(),this.grid.isResizeMode=!1,s()};window.addEventListener("mousemove",c,a),window.addEventListener("mouseup",h,a)};pinColumn=e=>{this.isLeaf?this._pin=e:this.columns.forEach(t=>t.pinColumn(e)),this.grid.pinColumn(this.uniqueKey,e)};toggleGrouping=()=>{this.grid.toggleGrouping(this.key)};sortColumn=(...e)=>{this.grid.setSortColumn(this.key,...e)};setWidth=e=>{if(!this.isLeaf)throw new Error("Cannot set width for a parent column.");this._inlineWidth!==e&&(this._inlineWidth=e,this.grid.setWidth(this.key,e))};toggleVisibility=()=>{this.grid.toggleColumnVisibility(this.key)}}class Te{constructor(e,t,i){this.grid=e,this.row=t,this.column=i}get value(){return this.column.key===T?this.row.rowIndex+1:this.row.data[this.column.key]}}class Z{constructor(e,t,i){this.grid=e,this.data=t,this.rowIndex=i,this.grid=e,this.data=t,this.key=this.grid.getRowKey(t)}key;parentRow;count=1;get cells(){return this.grid.columns.value.visibleLeafs.map(e=>new Te(this.grid,this,e))}get selected(){return this.grid.selectedRows.has(this.key)}get flatRows(){return this}get allRows(){return this}}const E="empty-cell",T="row-number-cell",ee=70,N="row-selection-cell",_="grouping-cell";class Le{constructor(e,t){this.props=e,this.update=t,console.debug("\x1B[32m%s\x1B[0m","[react-box]: DataGrid GridModel ctor")}sourceColumns=C.memo(()=>{const{def:e}=this.props,t=[];if(this.groupColumns.size>0&&t.push(new B({key:_},this)),t.push(...e.columns.map(i=>new B(i,this))),t.push(new B({key:E,Cell:()=>null},this)),e.rowSelection){const i=typeof e.rowSelection=="object"&&e.rowSelection.pinned?"LEFT":void 0;t.unshift(new B({key:N,pin:i,width:50,align:"center",Cell:re},this))}if(e.showRowNumber){let i,s=ee;typeof e.showRowNumber=="object"&&(e.showRowNumber.pinned&&(i="LEFT"),s=e.showRowNumber.width??ee),t.unshift(new B({key:T,pin:i,width:s,align:"right"},this))}return t});columns=C.memo(()=>{console.debug("\x1B[36m%s\x1B[0m","[react-box]: DataGrid columns memo");const e=this.sourceColumns.value.map(a=>a.getPinnedColumn("LEFT")).filter(a=>!!a),t=this.sourceColumns.value.map(a=>a.getPinnedColumn()).filter(a=>!!a),i=this.sourceColumns.value.map(a=>a.getPinnedColumn("RIGHT")).filter(a=>!!a),s=[...e,...t,...i].flatMap(a=>a.flatColumns),r=s.filter(a=>a.isLeaf),l=s.filter(a=>a.isLeaf&&a.isVisible),c=s.maxBy(a=>a.death)+1;return{left:e,middle:t,right:i,flat:s,leafs:r,visibleLeafs:l,maxDeath:c}});headerRows=C.memo(()=>(console.debug("\x1B[36m%s\x1B[0m","[react-box]: DataGrid headerRows memo"),this.columns.value.flat.groupBy(t=>t.death).sortBy(t=>t.key).map(t=>{const i=t.values.groupBy(s=>s.pin??Se).toRecord(s=>[s.key,s.values]);return[...i.LEFT?.filter(s=>s.isVisible)??[],...i.NO_PIN?.filter(s=>s.isVisible)??[],...i.RIGHT?.filter(s=>s.isVisible)??[]]})));gridTemplateColumns=C.memo(()=>{console.debug("\x1B[36m%s\x1B[0m","[react-box]: DataGrid gridTemplateColumns memo");const{visibleLeafs:e}=this.columns.value,t=e.sumBy(l=>l.pin==="RIGHT"?1:0),i=e.length-t-1,s=i>0?`repeat(${i}, max-content)`:"",r=t>0?`repeat(${t}, max-content)`:"";return`${s} auto ${r}`});_globalFilterValue="";get globalFilterValue(){return this.props.globalFilterValue??this._globalFilterValue}_columnFilters={};get columnFilters(){return this.props.columnFilters??this._columnFilters}applyGlobalFilter(e){const t=this.globalFilterValue.trim();if(!t)return e;const{globalFilterKeys:i}=this.props.def,s=i??this.columns.value.leafs.filter(r=>r.key!==E&&r.key!==T&&r.key!==N&&r.key!==_).map(r=>r.key);return e.filter(r=>s.some(l=>{const c=r[l];return c==null?!1:C.fuzzySearch(t,String(c))}))}applyColumnFilters(e){const t=this.columnFilters,i=Object.keys(t);return i.length===0?e:e.filter(s=>i.every(r=>{const l=t[r];if(!l)return!0;const c=s[r];return this.matchesFilter(c,l)}))}matchesFilter(e,t){switch(t.type){case"text":return t.value.trim()?e==null?!1:C.fuzzySearch(t.value,String(e)):!0;case"number":{if(e==null)return!1;const i=typeof e=="number"?e:parseFloat(String(e));if(isNaN(i))return!1;switch(t.operator){case"eq":return i===t.value;case"ne":return i!==t.value;case"gt":return i>t.value;case"gte":return i>=t.value;case"lt":return i<t.value;case"lte":return i<=t.value;case"between":return t.valueTo!==void 0?i>=t.value&&i<=t.valueTo:i>=t.value;default:return!0}}case"multiselect":return t.values.length===0?!0:t.values.includes(e);default:return!0}}get filteredData(){let e=this.props.data;return this.props.def.globalFilter&&(e=this.applyGlobalFilter(e)),e=this.applyColumnFilters(e),e}setGlobalFilter=e=>{this.props.onGlobalFilterChange?this.props.onGlobalFilterChange(e):this._globalFilterValue=e,this.rows.clear(),this.flatRows.clear(),this.update()};setColumnFilter=(e,t)=>{const i={...this.columnFilters};t===void 0?delete i[e]:i[e]=t,this.props.onColumnFiltersChange?this.props.onColumnFiltersChange(i):this._columnFilters=i,this.rows.clear(),this.flatRows.clear(),this.update()};clearColumnFilters=()=>{this.props.onColumnFiltersChange?this.props.onColumnFiltersChange({}):this._columnFilters={},this.rows.clear(),this.flatRows.clear(),this.update()};clearAllFilters=()=>{this.setGlobalFilter(""),this.clearColumnFilters()};getColumnUniqueValues=e=>{const t=new Set;return this.props.data.forEach(i=>{const s=i[e];s!==void 0&&t.add(s)}),Array.from(t).sort((i,s)=>i===null?1:s===null?-1:typeof i=="string"&&typeof s=="string"?i.localeCompare(s):typeof i=="number"&&typeof s=="number"?i-s:String(i).localeCompare(String(s)))};get hasActiveFilters(){return this.globalFilterValue.trim()!==""||Object.keys(this.columnFilters).length>0}get filterStats(){return{filtered:this.filteredData.length,total:this.props.data.length}}rows=C.memo(()=>{console.debug("\x1B[36m%s\x1B[0m","[react-box]: DataGrid rows memo");let e=this.filteredData;if(this._sortColumn&&(e=e.sortBy(t=>t[this._sortColumn],this._sortDirection)),this.groupColumns.size>0){const t=(i,s,r)=>{const l=s.values().next().value;s.delete(l);const c=this.columns.value.leafs.findOrThrow(a=>a.key===l);return this._sortColumn===_&&(i=i.sortBy(a=>a[l],this._sortDirection)),i.groupBy(a=>a[l]).map(a=>{let h;s.size>0?h=t(a.values,new Set(s),r+1):h=a.values.map((p,w)=>new Z(this,p,r+1+w));const u=new oe(this,c,h,r,a.key);return r+=1,u.expanded&&(r+=h.length),u})};return t(e,new Set(this.groupColumns),0)}return e.map((t,i)=>new Z(this,t,i))});flatRows=C.memo(()=>(console.debug("\x1B[36m%s\x1B[0m","[react-box]: DataGrid flatRows memo"),this.rows.value.flatMap(e=>e.flatRows)));get rowHeight(){return this.props.def.rowHeight??this.DEFAULT_ROW_HEIGHT_PX}sizes=C.memo(()=>{console.debug("\x1B[36m%s\x1B[0m","[react-box]: DataGrid sizes memo");const e=this.columns.value.flat.reduce((s,r)=>{const{inlineWidth:l}=r;return typeof l=="number"&&(s[r.widthVarName]=`${r.inlineWidth}px`),r.pin==="LEFT"&&(s[r.leftVarName]=`${r.left}px`),r.pin==="RIGHT"&&(s[r.rightVarName]=`${r.right}px`),s},{});e[this.rowHeightVarName]=`${this.rowHeight}px`,e[this.leftEdgeVarName]=`${this.leftEdge}px`;const{visibleLeafs:t}=this.columns.value,i=t.find(s=>s.key===_);if(i){const s=t.sumBy(r=>r.pin===i.pin&&r.key!==T&&r.key!==N?r.inlineWidth??0:0);e[i.groupColumnWidthVarName]=`${s}px`}return this.groupColumns.forEach(s=>{const r=this.columns.value.leafs.findOrThrow(l=>l.key===s);e[r.groupColumnWidthVarName]=`${t.sumBy(l=>l.pin===r.pin?l.inlineWidth??0:0)}px`}),e});DEFAULT_ROW_HEIGHT_PX=48;MIN_COLUMN_WIDTH_PX=48;DEFAULT_COLUMN_WIDTH_PX=200;isResizeMode=!1;expandedGroupRow=new Set;selectedRows=new Set;get leftEdge(){return this.columns.value.left.sumBy(e=>e.inlineWidth??0)}get rightEdge(){return this.columns.value.right.sumBy(e=>e.inlineWidth??0)}leftEdgeVarName="--left-edge";rowHeightVarName="--row-height";_idMap=new WeakMap;getRowKey(e){const{rowKey:t}=this.props.def;return t?typeof t=="function"?t(e):e[t]:(this._idMap.has(e)||this._idMap.set(e,crypto.randomUUID()),this._idMap.get(e))}setSortColumn=(e,...t)=>{if(t.length>0)[this._sortDirection]=t,this._sortColumn=this._sortDirection?e:void 0;else{const{_sortColumn:i,_sortDirection:s}=this;this._sortColumn=i===e&&s==="DESC"?void 0:e,this._sortDirection=i===e&&s==="ASC"?"DESC":"ASC"}this.headerRows.clear(),this.rows.clear(),this.flatRows.clear(),this.update()};pinColumn=(e,t)=>{const i=this.columns.value.flat.findOrThrow(s=>s.uniqueKey===e);i.pin!==t&&i.pinColumn(t),this.columns.clear(),this.headerRows.clear(),this.gridTemplateColumns.clear(),this.rows.clear(),this.flatRows.clear(),this.sizes.clear(),this.update()};toggleGrouping=e=>{this.groupColumns=new Set(this.groupColumns),this.hiddenColumns=new Set(this.hiddenColumns),this.groupColumns.has(e)?(this.groupColumns.delete(e),this.hiddenColumns.delete(e)):(this.groupColumns.add(e),this.hiddenColumns.add(e)),this.sourceColumns.clear(),this.columns.clear(),this.headerRows.clear(),this.gridTemplateColumns.clear(),this.rows.clear(),this.flatRows.clear(),this.sizes.clear(),this.update()};unGroupAll=()=>{const e=new Set(this.groupColumns);this.groupColumns=new Set,this.hiddenColumns=new Set(Array.from(this.hiddenColumns).filter(t=>!e.has(t))),this.sourceColumns.clear(),this.columns.clear(),this.headerRows.clear(),this.gridTemplateColumns.clear(),this.rows.clear(),this.flatRows.clear(),this.sizes.clear(),this.update()};toggleGroupRow=e=>{this.expandedGroupRow=new Set(this.expandedGroupRow),this.expandedGroupRow.has(e)?this.expandedGroupRow.delete(e):this.expandedGroupRow.add(e),this.rows.clear(),this.flatRows.clear(),this.update()};toggleRowSelection=e=>{this.toggleRowsSelection([e])};toggleRowsSelection=e=>{this.selectedRows=new Set(this.selectedRows);const t=e.every(i=>this.selectedRows.has(i));t?e.forEach(i=>this.selectedRows.delete(i)):e.forEach(i=>this.selectedRows.add(i)),this.flatRows.clear(),this.update(),this.props.onSelectionChange?.({action:t?"deselect":"select",affectedRowKeys:e,selectedRowKeys:Array.from(this.selectedRows),isAllSelected:this.selectedRows.size===this.props.data.length})};toggleSelectAllRows=()=>{this.toggleRowsSelection(this.props.data.map(e=>this.getRowKey(e)))};toggleColumnVisibility=e=>{this.hiddenColumns=new Set(this.hiddenColumns),this.hiddenColumns.has(e)?this.hiddenColumns.delete(e):this.hiddenColumns.add(e),this.columns.clear(),this.headerRows.clear(),this.gridTemplateColumns.clear(),this.rows.clear(),this.flatRows.clear(),this.sizes.clear(),this.update()};setWidth=(e,t)=>{const i=this.columns.value.leafs.find(r=>r.key===e);if(!i)throw new Error("Leaf column not found.");i.setWidth(t),this.sourceColumns.value.flatMap(r=>r.flatColumns).findOrThrow(r=>r.key===e).setWidth(t)};groupColumns=new Set;hiddenColumns=new Set;_sortColumn;get sortColumn(){return this._sortColumn}_sortDirection="ASC";get sortDirection(){return this._sortDirection}}class _e{constructor(e,t,i){this.grid=e,this.row=t,this.column=i}get value(){return this.column.key===T?this.row.rowIndex+1:this.column.key===_?`${this.row.groupValue} (${this.row.count})`:null}}class oe{constructor(e,t,i,s,r){this.grid=e,this.groupColumn=t,this.rows=i,this.rowIndex=s,this.groupValue=r,i.forEach(l=>l.parentRow=this)}get key(){return`${this.parentRow?.key??""}${this.groupColumn.key}${this.groupValue}`}parentRow;get cells(){return this.grid.columns.value.visibleLeafs.map(e=>new _e(this.grid,this,e))}get selected(){return this.allRows.every(e=>e.selected)}get indeterminate(){return!this.selected&&this.allRows.some(e=>e.selected)}get expanded(){return this.grid.expandedGroupRow.has(this.key)}get depth(){return this.parentRow?this.parentRow.depth+1:0}get count(){return this.rows.sumBy(e=>e.count,0)}get flatRows(){return this.expanded?[this,...this.rows.flatMap(e=>e.flatRows)]:[this]}get allRows(){return this.rows.flatMap(e=>e.allRows)}get groupingColumn(){return this.grid.columns.value.leafs.findOrThrow(e=>e.key===_)}get groupingColumnGridColumn(){const{visibleLeafs:e}=this.grid.columns.value,{groupingColumn:t}=this;return e.sumBy(s=>s.pin===t.pin&&s.key!==E&&s.key!==N&&s.key!==T?1:0)}toggleRow(){this.grid.toggleGroupRow(this.key)}}function $(o){const{children:e,column:t,style:i,...s}=o,{key:r,pin:l,left:c,right:a,isEdge:h,align:u,widthVarName:p,leftVarName:w,rightVarName:y}=t;"align"in t.def&&(s.jc=u);const v=r===T,R=r===N,G=l==="LEFT",j=l==="RIGHT",b=G||j,k=G&&c===0,g=G&&h,x=j&&h,F=j&&a===0;return n.jsx(m.default,{component:"datagrid.body.cell",props:{role:"cell"},variant:{isPinned:b,isFirstLeftPinned:k,isLastLeftPinned:g,isFirstRightPinned:x,isLastRightPinned:F,isRowSelection:R,isRowNumber:v},style:{width:`var(${p})`,height:`var(${t.grid.rowHeightVarName})`,left:G?`var(${w})`:void 0,right:j?`var(${y})`:void 0,...i},...s,children:e})}$.displayName="DataGridCell";function le(o){const{row:e}=o,{selected:t,indeterminate:i,cells:s,groupingColumn:r,groupingColumnGridColumn:l,depth:c,expanded:a}=e,h=d.useCallback(()=>{e.grid.toggleRowsSelection(e.allRows.map(u=>u.key))},[]);return n.jsx(m.default,{className:"grid-row",selected:t,display:"contents",props:{role:"rowgroup"},children:s.map(u=>{const{key:p,pin:w,groupColumnWidthVarName:y}=u.column,v=w==="RIGHT";if(p===_)return n.jsx($,{column:u.column,style:{width:`var(${y})`,right:v?"0":void 0},br:r.pin==="LEFT"?1:void 0,gridColumn:l,pl:4*c,overflow:"auto",children:n.jsx(f.default,{textWrap:"nowrap",px:3,children:n.jsxs(S.default,{clean:!0,onClick:()=>e.toggleRow(),cursor:"pointer",display:"flex",gap:1,ai:"center",children:[n.jsx(C.ExpandIcon,{fill:"currentColor",width:"14px",height:"14px",rotate:a?0:-90}),u.value]})})},p);if(p===N)return n.jsx($,{column:u.column,children:n.jsx(X.default,{variant:"datagrid",m:1,checked:t,indeterminate:i,onChange:h})},p);if(w!==r.pin||p===T||p===E)return n.jsx($,{column:u.column,px:p===T?3:void 0,children:u.value},p)})})}le.displayName="DataGridGroupRow";function ae(o){const{cell:e}=o;return n.jsx(m.default,{height:"fit",width:"fit",overflow:"auto",ai:"center",jc:e.column.align,children:n.jsx(f.default,{px:3,textOverflow:"ellipsis",overflow:"hidden",textWrap:"nowrap",children:e.value})})}ae.displayName="DataGridCellText";function ue(o){const{row:e}=o,{selected:t}=e;return n.jsx(m.default,{className:"grid-row",selected:t,display:"contents",props:{role:"row"},children:e.cells.map(i=>n.jsx($,{column:i.column,children:i.column.Cell?n.jsx(i.column.Cell,{cell:i}):n.jsx(ae,{cell:i})},i.column.key))})}ue.displayName="DataGridRow";const De=10,te=20;function ce(o){const{grid:e,scrollTop:t}=o,i=e.flatRows.value.length,s=Math.max(0,Math.floor(t/e.rowHeight)-te),r=e.props.def.visibleRowsCount??De,l=e.rowHeight*r+e.rowHeight/5,c=d.useMemo(()=>{if(console.debug("\x1B[36m%s\x1B[0m","[react-box]: DataGrid render rows"),e.props.data.length===0)return n.jsx(m.default,{jc:"center",ai:"center",gridColumn:"full-row",style:{height:l},children:e.props.loading?"loading...":"empty"});const a=r+te*2;return e.flatRows.value.take(a,s).map(u=>u instanceof oe?n.jsx(le,{row:u},u.key):n.jsx(ue,{row:u},u.key))},[e.flatRows.value,e.props.data.length,e.props.loading,s,l,r]);return console.debug("\x1B[36m%s\x1B[0m","[react-box]: DataGrid render DataGridBody"),n.jsx(f.default,{style:{height:l},children:n.jsx(f.default,{style:{height:`${i*e.rowHeight}px`},children:n.jsx(ne.default,{component:"datagrid.body",width:"max-content",minWidth:"fit",transition:"none",style:{transform:`translate3d(0, ${s*e.rowHeight}px, 0)`,willChange:"transform",gridTemplateColumns:e.gridTemplateColumns.value},children:c})})})}ce.displayName="DataGridBody";function ie({column:o,grid:e}){const t=e.columnFilters[o.key],i=t?.type==="text"?t.value:"",[s,r]=d.useState(i),l=d.useRef(null);d.useEffect(()=>()=>{l.current&&clearTimeout(l.current)},[]);const c=d.useCallback(u=>{const p=u.target.value;r(p),l.current&&clearTimeout(l.current),l.current=setTimeout(()=>{p.trim()?e.setColumnFilter(o.key,{type:"text",value:p}):e.setColumnFilter(o.key,void 0),l.current=null},300)},[e,o.key]),a=d.useCallback(()=>{r(""),e.setColumnFilter(o.key,void 0)},[e,o.key]),h=typeof o.def.filterable=="object"?o.def.filterable:{};return n.jsxs(m.default,{ai:"center",position:"relative",width:"fit",children:[n.jsx(O.default,{width:"fit",variant:"compact",placeholder:h.placeholder??"Filter...",value:s,onChange:c}),s&&n.jsx(m.default,{position:"absolute",right:2,top:"1/2",translateY:"-1/2",cursor:"pointer",props:{onClick:a},children:n.jsx(f.default,{fontSize:10,color:"gray-400",hover:{color:"gray-600"},children:"✕"})})]})}function Ne({column:o,grid:e}){const t=e.columnFilters[o.key],i=t?.type==="number"?t.value:"",s=t?.type==="number"?t.operator:"eq",r=t?.type==="number"?t.valueTo:"",[l,c]=d.useState(i),[a,h]=d.useState(s),[u,p]=d.useState(r??""),w=d.useRef(null),y=d.useRef(null);d.useEffect(()=>()=>{w.current&&clearTimeout(w.current),y.current&&clearTimeout(y.current)},[]);const v=typeof o.def.filterable=="object"?o.def.filterable:{},R=d.useCallback((g,x,F)=>{const D=typeof x=="number"?x:parseFloat(x);if(isNaN(D)||x===""){e.setColumnFilter(o.key,void 0);return}const V={type:"number",operator:g,value:D};if(g==="between"&&F!==void 0&&F!==""){const P=typeof F=="number"?F:parseFloat(String(F));isNaN(P)||(V.valueTo=P)}e.setColumnFilter(o.key,V)},[e,o.key]),G=d.useCallback(g=>{const x=g.target.value;c(x),w.current&&clearTimeout(w.current),w.current=setTimeout(()=>{R(a,x,u),w.current=null},300)},[a,u,R]),j=d.useCallback(g=>{h(g),R(g,l,u)},[l,u,R]),b=d.useCallback(g=>{const x=g.target.value;p(x),y.current&&clearTimeout(y.current),y.current=setTimeout(()=>{R(a,l,x),y.current=null},300)},[a,l,R]),k=d.useCallback(()=>{c(""),p(""),h("eq"),e.setColumnFilter(o.key,void 0)},[e,o.key]);return n.jsxs(m.default,{ai:a==="between"?"start":"center",gap:1,width:"fit",children:[n.jsxs(L.default,{value:a,variant:"compact",onChange:g=>g&&j(g),minWidth:6,hideIcon:!0,children:[n.jsx(L.default.Item,{value:"eq",children:"="}),n.jsx(L.default.Item,{value:"ne",children:"≠"}),n.jsx(L.default.Item,{value:"gt",children:">"}),n.jsx(L.default.Item,{value:"gte",children:"≥"}),n.jsx(L.default.Item,{value:"lt",children:"<"}),n.jsx(L.default.Item,{value:"lte",children:"≤"}),n.jsx(L.default.Item,{value:"between",children:"↔"})]}),a==="between"?n.jsxs(m.default,{d:"column",gap:1,flex1:!0,children:[n.jsxs(m.default,{ai:"center",position:"relative",flex1:!0,children:[n.jsx(O.default,{type:"number",variant:"compact",placeholder:v.placeholder??"From",value:l,onChange:G,width:"fit",step:v.step}),(l!==""||u!=="")&&n.jsx(m.default,{position:"absolute",right:2,top:"1/2",translateY:"-1/2",cursor:"pointer",props:{onClick:k},children:n.jsx(f.default,{fontSize:10,color:"gray-400",hover:{color:"gray-600"},children:"✕"})})]}),n.jsx(m.default,{ai:"center",flex1:!0,children:n.jsx(O.default,{type:"number",variant:"compact",placeholder:"To",value:u,onChange:b,width:"fit",step:v.step})})]}):n.jsxs(m.default,{ai:"center",position:"relative",flex1:!0,children:[n.jsx(O.default,{type:"number",variant:"compact",placeholder:v.placeholder??"Value",value:l,onChange:G,width:"fit",step:v.step}),l!==""&&n.jsx(m.default,{position:"absolute",right:2,top:"1/2",translateY:"-1/2",cursor:"pointer",props:{onClick:k},children:n.jsx(f.default,{fontSize:10,color:"gray-400",hover:{color:"gray-600"},children:"✕"})})]})]})}function Ee({column:o,grid:e}){const t=e.columnFilters[o.key],i=t?.type==="multiselect"?t.values:[],s=typeof o.def.filterable=="object"?o.def.filterable:{},r=d.useMemo(()=>s.options?s.options:e.getColumnUniqueValues(o.key).map(a=>({label:a===null?"(empty)":String(a),value:a})),[s.options,e,o.key]),l=d.useCallback((c,a)=>{a.length===0?e.setColumnFilter(o.key,void 0):e.setColumnFilter(o.key,{type:"multiselect",values:a})},[e,o.key]);return n.jsxs(L.default,{multiple:!0,showCheckbox:!0,isSearchable:!0,searchPlaceholder:"Search...",value:i,width:"fit",minWidth:0,onChange:l,variant:"compact",children:[n.jsx(L.default.Unselect,{children:"Clear"}),n.jsx(L.default.SelectAll,{children:"Select All"}),r.map(c=>n.jsx(L.default.Item,{value:c.value,ai:"center",gap:2,children:c.label},String(c.value)))]})}function de(o){const{column:e,grid:t}=o,{filterable:i}=e.def;if(!i)return null;switch((typeof i=="object"?i:{type:"text"}).type){case"text":return n.jsx(ie,{column:e,grid:t});case"number":return n.jsx(Ne,{column:e,grid:t});case"multiselect":return n.jsx(Ee,{column:e,grid:t});default:return n.jsx(ie,{column:e,grid:t})}}de.displayName="DataGridColumnFilter";function he(o){const{column:e,grid:t}=o,{key:i,pin:s,left:r,right:l,isEdge:c,widthVarName:a,leftVarName:h,rightVarName:u,filterable:p}=e,w=i===E,G=w||i===_||i===T||i===N,j=s==="LEFT",b=s==="RIGHT",k=j||b,g=j&&r===0,x=j&&c,F=b&&c,D=b&&l===0;return n.jsx(m.default,{component:"datagrid.filter.cell",variant:{isPinned:k,isFirstLeftPinned:g,isLastLeftPinned:x,isFirstRightPinned:F,isLastRightPinned:D},px:w?0:2,style:{width:`var(${a})`,left:j?`var(${h})`:void 0,right:b?`var(${u})`:void 0},children:!G&&p&&n.jsx(de,{column:e,grid:t})})}he.displayName="DataGridFilterCell";function pe(o){const{grid:e}=o,{visibleLeafs:t}=e.columns.value;return t.some(s=>s.filterable)?t.map(s=>n.jsx(he,{column:s,grid:e},s.uniqueKey)):null}pe.displayName="DataGridFilterRow";function me(o){const{column:e}=o,{key:t,pin:i,left:s,right:r,isEdge:l,isLeaf:c,align:a,header:h,grid:u}=e,[p,w,y]=C.useVisibility({hideOnScroll:!0,event:"mousedown"}),[v,R]=d.useState({top:0,left:0}),G=d.useMemo(()=>v.left>window.innerWidth/2,[v.left]),j=c&&(u.sortColumn!==t||u.sortDirection==="DESC"),b=c&&(u.sortColumn!==t||u.sortDirection==="ASC"),k=c&&u.sortColumn===t,g=i!=="LEFT",x=i!=="RIGHT",F=!!i,D=c&&t!==_,V=c&&t===_,P=j||b||k,q=g||x||F,U=a==="right"?2:void 0,Y=a==="right"?void 0:i==="RIGHT"?2.5:4,K=t===E,W=t===T,J=t===N,H=i==="LEFT",A=i==="RIGHT",Q=H||i==="RIGHT",I=H&&s===0,z=H&&l,Re=A&&l,je=A&&r===0,ke=c&&!K&&!W&&!J;return n.jsx(m.default,{position:"absolute",left:U,right:Y,top:"1/2",translateY:-3,ai:"center",children:n.jsxs(S.default,{component:"datagrid.header.cell.contextMenu",onClick:()=>w(!p),variant:{isPinned:Q,isFirstLeftPinned:I,isLastLeftPinned:z,isFirstRightPinned:Re,isLastRightPinned:je,isSortable:ke,isRowNumber:W},children:[n.jsx(M.Span,{component:"datagrid.header.cell.contextMenu.icon",children:n.jsx(C.DotsIcon,{fill:"currentColor"})}),p&&n.jsxs(se.default,{component:"datagrid.header.cell.contextMenu.tooltip",onPositionChange:R,ref:y,adjustTranslateX:G?"-100%":"-21px",adjustTranslateY:"16px",children:[j&&n.jsxs(S.default,{component:"datagrid.header.cell.contextMenu.tooltip.item",onClick:()=>e.sortColumn("ASC"),children:[n.jsx(M.Span,{component:"datagrid.header.cell.contextMenu.tooltip.item.icon",children:n.jsx(C.SortIcon,{width:"100%",fill:"currentColor"})}),"Sort Ascending"]}),b&&n.jsxs(S.default,{component:"datagrid.header.cell.contextMenu.tooltip.item",onClick:()=>e.sortColumn("DESC"),children:[n.jsx(M.Span,{component:"datagrid.header.cell.contextMenu.tooltip.item.icon",children:n.jsx(C.SortIcon,{width:"100%",fill:"currentColor",rotate:180})}),"Sort Descending"]}),k&&n.jsxs(S.default,{component:"datagrid.header.cell.contextMenu.tooltip.item",onClick:()=>e.sortColumn(void 0),children:[n.jsx(f.default,{width:4}),"Clear Sort"]}),P&&(q||D||V)&&n.jsx(f.default,{bb:1,my:2,borderColor:"gray-300",component:"datagrid.header.cell.contextMenu.tooltip.item.separator"}),g&&n.jsxs(S.default,{component:"datagrid.header.cell.contextMenu.tooltip.item",onClick:()=>e.pinColumn("LEFT"),children:[n.jsx(M.Span,{component:"datagrid.header.cell.contextMenu.tooltip.item.icon",children:n.jsx(C.PinIcon,{width:"100%",fill:"currentColor"})}),"Pin Left"]}),x&&n.jsxs(S.default,{component:"datagrid.header.cell.contextMenu.tooltip.item",onClick:()=>e.pinColumn("RIGHT"),children:[n.jsx(M.Span,{component:"datagrid.header.cell.contextMenu.tooltip.item.icon",children:n.jsx(C.PinIcon,{width:"100%",fill:"currentColor",rotate:-90})}),"Pin Right"]}),F&&n.jsxs(S.default,{component:"datagrid.header.cell.contextMenu.tooltip.item",onClick:()=>e.pinColumn(),children:[n.jsx(f.default,{width:4}),"Unpin"]}),P&&q&&(D||V)&&n.jsx(f.default,{component:"datagrid.header.cell.contextMenu.tooltip.item.separator"}),D&&n.jsxs(S.default,{component:"datagrid.header.cell.contextMenu.tooltip.item",onClick:e.toggleGrouping,children:[n.jsx(M.Span,{component:"datagrid.header.cell.contextMenu.tooltip.item.icon",children:n.jsx(C.GroupingIcon,{width:"100%",fill:"currentColor"})}),n.jsxs(f.default,{textWrap:"nowrap",children:["Group by ",h??t]})]}),V&&n.jsxs(S.default,{component:"datagrid.header.cell.contextMenu.tooltip.item",onClick:u.unGroupAll,children:[n.jsx(M.Span,{component:"datagrid.header.cell.contextMenu.tooltip.item.icon",children:n.jsx(C.GroupingIcon,{width:"100%",fill:"currentColor"})}),n.jsx(f.default,{textWrap:"nowrap",children:"Un-Group All"})]})]})]})})}me.displayName="DataGridHeaderCellContextMenu";function fe(o){const{column:e}=o;return n.jsx(m.default,{height:"fit",ai:"center",position:"absolute",right:e.pin==="RIGHT"?void 0:0,left:e.pin!=="RIGHT"?void 0:0,py:3,children:n.jsx(f.default,{cursor:"col-resize",px:.75,mt:-6,className:"resizer",height:"fit",props:{onMouseDown:e.resizeColumn,onTouchStart:e.resizeColumn},children:n.jsx(f.default,{component:"datagrid.header.cell.resizer"})})})}fe.displayName="DataGridHeaderCellResizer";function ge(o){const{column:e}=o,{key:t,pin:i,left:s,right:r,isEdge:l,isLeaf:c,leafs:a,grid:h,header:u,gridRows:p,widthVarName:w,leftVarName:y,rightVarName:v,inlineWidth:R}=e,G=t===E,j=t===_,b=t===T,k=t===N,g=i==="LEFT",x=i==="RIGHT",F=g||i==="RIGHT",D=g&&s===0,V=g&&l,P=x&&l,q=x&&r===0,U=c&&!G&&!b&&!k,Y=c?1:a.length,K=!b&&!k,W=!b&&!k,J=k?void 0:e.align==="right"?10:3,H=k?void 0:e.align==="center"?3:void 0,A=d.useCallback(()=>{h.toggleSelectAllRows()},[]),Q=d.useMemo(()=>{if(b)return null;if(k){const I=h.selectedRows.size===h.props.data.length,z=!I&&h.selectedRows.size>0;return n.jsx(X.default,{variant:"datagrid",m:1,indeterminate:z,checked:I,onChange:A})}if(j){if(h.groupColumns.size===1){const I=h.columns.value.leafs.findOrThrow(z=>z.key===h.groupColumns.values().next().value);return I.header??I.key}return"Group"}return u??t},[h.groupColumns,h.selectedRows,A]);return n.jsx(m.default,{props:{role:"columnheader"},component:"datagrid.header.cell",variant:{isPinned:F,isFirstLeftPinned:D,isLastLeftPinned:V,isFirstRightPinned:P,isLastRightPinned:q,isSortable:U,isRowNumber:b},gridRow:p,gridColumn:Y,style:{width:`var(${w})`,left:g?`var(${y})`:void 0,right:x?`var(${v})`:void 0},children:!G&&n.jsxs(n.Fragment,{children:[n.jsx(m.default,{width:"fit",height:"fit",jc:e.align,props:{onClick:U?()=>e.sortColumn():void 0},children:n.jsxs(m.default,{overflow:"hidden",position:c?void 0:"sticky",ai:"center",transition:"none",pl:J,pr:H,style:{left:i?void 0:`var(${h.leftEdgeVarName})`},children:[n.jsx(f.default,{overflow:"hidden",textOverflow:"ellipsis",textWrap:"nowrap",children:Q}),t===h.sortColumn&&n.jsx(f.default,{pl:(R??0)<58?0:2,children:n.jsx(C.SortIcon,{width:"16px",rotate:h.sortDirection==="ASC"?0:180,fill:"currentColor"})}),W&&n.jsx(f.default,{minWidth:e.align==="right"?4:10})]})}),K&&n.jsx(fe,{column:e}),W&&n.jsx(me,{column:e})]})})}ge.displayName="DataGridHeaderCell";function Ce(o){const{grid:e}=o,{isResizeMode:t}=e;return n.jsxs(ne.default,{component:"datagrid.header",variant:{isResizeMode:t},style:{gridTemplateColumns:e.gridTemplateColumns.value},children:[e.headerRows.value.map(i=>i.map(s=>n.jsx(ge,{column:s},s.uniqueKey))),n.jsx(pe,{grid:e})]})}Ce.displayName="DataGridHeader";function we(o){const{grid:e}=o,[t,i]=d.useState(0),s=d.useRef(null),r=d.useCallback(l=>{s.current!==null&&cancelAnimationFrame(s.current),s.current=requestAnimationFrame(()=>{i(l.target.scrollTop),s.current=null})},[]);return n.jsxs(f.default,{overflowX:"scroll",style:{willChange:"scroll-position"},props:{onScroll:r},children:[n.jsx(Ce,{grid:e}),n.jsx(ce,{grid:e,scrollTop:t})]})}we.displayName="DataGridContent";function xe(o){const{grid:e}=o;return e.groupColumns.size===0?null:n.jsxs(m.default,{component:"datagrid.topBar.columnGroups",children:[n.jsx(M.Span,{component:"datagrid.topBar.columnGroups.icon",children:n.jsx(C.GroupingIcon,{width:"100%",fill:"currentColor"})}),Array.from(e.groupColumns,t=>{const i=e.columns.value.leafs.findOrThrow(s=>s.key===t);return n.jsxs(d.Fragment,{children:[n.jsx(C.ExpandIcon,{fill:"currentColor",width:"14px",height:"14px",rotate:-90}),n.jsxs(m.default,{component:"datagrid.topBar.columnGroups.item",children:[i.header??i.key,n.jsx(S.default,{component:"datagrid.topBar.columnGroups.item.icon",onClick:()=>e.toggleGrouping(i.key),children:n.jsx(f.default,{fontSize:10,color:"gray-400",hover:{color:"gray-600"},children:"✕"})})]})]},t)})]})}xe.displayName="DataGridColumnGroups";function Ve(o){const{grid:e}=o,[t,i]=d.useState(e.globalFilterValue),s=d.useRef(null);d.useEffect(()=>()=>{s.current&&clearTimeout(s.current)},[]);const r=d.useCallback(u=>{const p=u.target.value;i(p),s.current&&clearTimeout(s.current),s.current=setTimeout(()=>{e.setGlobalFilter(p),s.current=null},300)},[e]),l=d.useCallback(()=>{i(""),e.setGlobalFilter("")},[e]),{filtered:c,total:a}=e.filterStats,h=e.hasActiveFilters&&c!==a;return n.jsxs(m.default,{component:"datagrid.topBar.globalFilter",children:[h&&n.jsxs(f.default,{component:"datagrid.topBar.globalFilter.stats",children:[c," / ",a]}),n.jsxs(m.default,{component:"datagrid.topBar.globalFilter.inputWrapper",children:[n.jsx(m.default,{component:"datagrid.topBar.globalFilter.inputWrapper.icon",children:n.jsx(C.SearchIcon,{fill:"currentColor",width:"1rem"})}),n.jsx(O.default,{component:"datagrid.topBar.globalFilter.inputWrapper.input",placeholder:"Search...",value:t,onChange:r,pl:8,pr:t?8:3,height:8,width:50}),t&&n.jsx(f.default,{component:"datagrid.topBar.globalFilter.inputWrapper.clear",props:{onClick:l},children:"✕"})]})]})}function ye(o){const{grid:e}=o,[t,i,s]=C.useVisibility({event:"mousedown"}),r=d.useMemo(()=>e.columns.value.leafs.filter(l=>![E,T,N,_].includes(l.key)),[e.columns.value.leafs]);return n.jsxs(S.default,{component:"datagrid.topBar.contextMenu",onClick:()=>i(!t),children:[n.jsx(Ge.default,{viewBox:"0 0 24 24",width:"20",fill:"currentColor",...o,children:n.jsx("path",{d:"M5 6h14M5 12h14M5 18h14",fill:"none",stroke:"currentColor",strokeWidth:"2",strokeLinecap:"round"})}),t&&n.jsx(se.default,{component:"datagrid.topBar.contextMenu.tooltip",ref:s,children:r.map(l=>n.jsxs(S.default,{component:"datagrid.topBar.contextMenu.tooltip.item",onClick:c=>{c.stopPropagation(),l.toggleVisibility()},children:[n.jsx(X.default,{variant:"datagrid",checked:l.isVisible,onChange:()=>{},focus:{outline:0}}),l.header??l.key]},l.key))})]})}ye.displayName="DataGridTopBarContextMenu";function ve(o){const{grid:e}=o;return n.jsxs(m.default,{component:"datagrid.topBar",position:"relative",ai:"center",jc:"space-between",children:[n.jsxs(m.default,{ai:"center",gap:2,children:[n.jsx(ye,{grid:e}),n.jsx(xe,{grid:e})]}),e.props.def.globalFilter&&n.jsx(m.default,{position:"relative",pr:2,children:n.jsx(Ve,{grid:e})})]})}ve.displayName="DataGridTopBar";function Me(o){const[e,t]=d.useState(0),i=d.useRef();return i.current||(i.current=new Le(o,()=>t(s=>s+1))),d.useEffect(()=>{i.current.props=o,i.current.rows.clear(),i.current.flatRows.clear(),i.current.update()},[o.data]),d.useEffect(()=>{i.current.props=o,i.current.sourceColumns.clear(),i.current.columns.clear(),i.current.headerRows.clear(),i.current.gridTemplateColumns.clear(),i.current.rows.clear(),i.current.flatRows.clear(),i.current.sizes.clear(),i.current.update()},[o.def]),d.useEffect(()=>{i.current.props=o,i.current.update()},[o.loading]),d.useEffect(()=>{i.current.props=o,i.current.rows.clear(),i.current.flatRows.clear(),i.current.update()},[o.globalFilterValue,o.columnFilters]),i.current}function be(o){const e=Me(o);return console.debug("\x1B[36m%s\x1B[0m","[react-box]: DataGrid render"),n.jsxs(f.default,{component:"datagrid",style:e.sizes.value,props:{role:"presentation"},children:[e.props.def.topBar&&n.jsx(ve,{grid:e}),n.jsx(we,{grid:e}),e.props.def.bottomBar&&n.jsx(Fe,{grid:e})]})}be.displayName="DataGrid";exports.default=be;