@alaarab/ogrid-core 1.3.2 → 1.4.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.
Files changed (44) hide show
  1. package/dist/esm/components/OGridLayout.js +73 -7
  2. package/dist/esm/components/SideBar.js +98 -0
  3. package/dist/esm/hooks/index.js +2 -0
  4. package/dist/esm/hooks/useCellSelection.js +84 -0
  5. package/dist/esm/hooks/useColumnHeaderFilterState.js +25 -3
  6. package/dist/esm/hooks/useColumnResize.js +9 -2
  7. package/dist/esm/hooks/useDataGridState.js +43 -6
  8. package/dist/esm/hooks/useKeyboardNavigation.js +56 -4
  9. package/dist/esm/hooks/useOGrid.js +132 -4
  10. package/dist/esm/hooks/useRichSelectState.js +53 -0
  11. package/dist/esm/hooks/useSideBarState.js +34 -0
  12. package/dist/esm/index.js +3 -2
  13. package/dist/esm/types/dataGridTypes.js +9 -2
  14. package/dist/esm/utils/aggregationUtils.js +39 -0
  15. package/dist/esm/utils/columnUtils.js +97 -0
  16. package/dist/esm/utils/dataGridViewModel.js +105 -6
  17. package/dist/esm/utils/index.js +3 -2
  18. package/dist/esm/utils/ogridHelpers.js +4 -2
  19. package/dist/esm/utils/paginationHelpers.js +1 -1
  20. package/dist/esm/utils/statusBarHelpers.js +8 -1
  21. package/dist/esm/utils/valueParsers.js +15 -1
  22. package/dist/types/components/OGridLayout.d.ts +22 -5
  23. package/dist/types/components/SideBar.d.ts +34 -0
  24. package/dist/types/components/StatusBar.d.ts +8 -0
  25. package/dist/types/hooks/index.d.ts +5 -1
  26. package/dist/types/hooks/useColumnHeaderFilterState.d.ts +9 -1
  27. package/dist/types/hooks/useColumnResize.d.ts +3 -1
  28. package/dist/types/hooks/useDataGridState.d.ts +3 -0
  29. package/dist/types/hooks/useInlineCellEditorState.d.ts +1 -1
  30. package/dist/types/hooks/useOGrid.d.ts +7 -0
  31. package/dist/types/hooks/useRichSelectState.d.ts +17 -0
  32. package/dist/types/hooks/useSideBarState.d.ts +15 -0
  33. package/dist/types/index.d.ts +7 -5
  34. package/dist/types/types/columnTypes.d.ts +26 -2
  35. package/dist/types/types/dataGridTypes.d.ts +56 -6
  36. package/dist/types/types/index.d.ts +2 -2
  37. package/dist/types/utils/aggregationUtils.d.ts +15 -0
  38. package/dist/types/utils/columnUtils.d.ts +16 -1
  39. package/dist/types/utils/dataGridViewModel.d.ts +67 -2
  40. package/dist/types/utils/index.d.ts +5 -3
  41. package/dist/types/utils/ogridHelpers.d.ts +2 -2
  42. package/dist/types/utils/paginationHelpers.d.ts +1 -1
  43. package/dist/types/utils/statusBarHelpers.d.ts +8 -0
  44. package/package.json +1 -1
@@ -1,7 +1,8 @@
1
1
  /**
2
2
  * View model helpers for DataGridTable. Core owns the logic; UI packages only render.
3
3
  */
4
- import type { ColumnFilterType } from '../types/columnTypes';
4
+ import type * as React from 'react';
5
+ import type { ColumnFilterType, ICellEditorProps, IDateFilterValue } from '../types/columnTypes';
5
6
  import type { IColumnDef } from '../types/columnTypes';
6
7
  import type { RowId, UserLike } from '../types/dataGridTypes';
7
8
  export interface HeaderFilterConfigInput {
@@ -17,6 +18,8 @@ export interface HeaderFilterConfigInput {
17
18
  loadingFilterOptions: Record<string, boolean>;
18
19
  multiSelectFilters: Record<string, string[]>;
19
20
  onMultiSelectFilterChange: (key: string, values: string[]) => void;
21
+ dateFilters?: Record<string, IDateFilterValue>;
22
+ onDateFilterChange?: (key: string, value: IDateFilterValue | undefined) => void;
20
23
  }
21
24
  /** Props to pass to ColumnHeaderFilter. Matches IColumnHeaderFilterProps. */
22
25
  export interface HeaderFilterConfig {
@@ -35,6 +38,8 @@ export interface HeaderFilterConfig {
35
38
  selectedUser?: UserLike;
36
39
  onUserChange?: (user: UserLike | undefined) => void;
37
40
  peopleSearch?: (query: string) => Promise<UserLike[]>;
41
+ dateValue?: IDateFilterValue;
42
+ onDateChange?: (value: IDateFilterValue | undefined) => void;
38
43
  }
39
44
  /**
40
45
  * Returns ColumnHeaderFilter props from column def and grid filter/sort state.
@@ -79,7 +84,7 @@ export interface CellRenderDescriptorInput<T> {
79
84
  }
80
85
  export interface CellRenderDescriptor {
81
86
  mode: CellRenderMode;
82
- editorType?: 'text' | 'select' | 'checkbox';
87
+ editorType?: 'text' | 'select' | 'checkbox' | 'richSelect' | 'date';
83
88
  value?: unknown;
84
89
  isActive: boolean;
85
90
  isInRange: boolean;
@@ -100,3 +105,63 @@ export interface CellRenderDescriptor {
100
105
  * and to apply isActive, isInRange, etc. without duplicating the boolean logic.
101
106
  */
102
107
  export declare function getCellRenderDescriptor<T>(item: T, col: IColumnDef<T>, rowIndex: number, colIdx: number, input: CellRenderDescriptorInput<T>): CellRenderDescriptor;
108
+ /**
109
+ * Resolves display content for a cell in display mode.
110
+ * Handles the renderCell → valueFormatter → String() fallback chain.
111
+ */
112
+ export declare function resolveCellDisplayContent<T>(col: IColumnDef<T>, item: T, displayValue: unknown): React.ReactNode;
113
+ /**
114
+ * Resolves the cellStyle from a column def, handling both function and static values.
115
+ */
116
+ export declare function resolveCellStyle<T>(col: IColumnDef<T>, item: T): React.CSSProperties | undefined;
117
+ /**
118
+ * Builds props for InlineCellEditor. Shared across all UI packages.
119
+ */
120
+ export declare function buildInlineEditorProps<T>(item: T, col: IColumnDef<T>, descriptor: CellRenderDescriptor, callbacks: {
121
+ commitCellEdit: (item: T, columnId: string, oldValue: unknown, newValue: unknown, rowIndex: number, globalColIndex: number) => void;
122
+ setEditingCell: (cell: null) => void;
123
+ }): {
124
+ value: unknown;
125
+ item: T;
126
+ column: IColumnDef<T>;
127
+ rowIndex: number;
128
+ editorType: "text" | "select" | "checkbox" | "richSelect" | "date";
129
+ onCommit: (newValue: unknown) => void;
130
+ onCancel: () => void;
131
+ };
132
+ /**
133
+ * Builds ICellEditorProps for custom popover editors. Shared across all UI packages.
134
+ */
135
+ export declare function buildPopoverEditorProps<T>(item: T, col: IColumnDef<T>, descriptor: CellRenderDescriptor, pendingEditorValue: unknown, callbacks: {
136
+ setPendingEditorValue: (value: unknown) => void;
137
+ commitCellEdit: (item: T, columnId: string, oldValue: unknown, newValue: unknown, rowIndex: number, globalColIndex: number) => void;
138
+ cancelPopoverEdit: () => void;
139
+ }): ICellEditorProps<T>;
140
+ /**
141
+ * Common interaction props for cell wrapper elements.
142
+ * Includes data attributes, event handlers, and accessibility props.
143
+ * Spread onto the cell wrapper div/Box in each UI package.
144
+ */
145
+ export interface CellInteractionHandlers {
146
+ handleCellMouseDown: (e: React.MouseEvent, rowIndex: number, colIndex: number) => void;
147
+ setActiveCell: (cell: {
148
+ rowIndex: number;
149
+ columnIndex: number;
150
+ }) => void;
151
+ setEditingCell: (cell: {
152
+ rowId: RowId;
153
+ columnId: string;
154
+ } | null) => void;
155
+ handleCellContextMenu: (e: React.MouseEvent) => void;
156
+ }
157
+ export declare function getCellInteractionProps(descriptor: CellRenderDescriptor, columnId: string, handlers: CellInteractionHandlers): {
158
+ role?: "button" | undefined;
159
+ onDoubleClick?: (() => void) | undefined;
160
+ tabIndex: number;
161
+ onMouseDown: (e: React.MouseEvent) => void;
162
+ onClick: () => void;
163
+ onContextMenu: (e: React.MouseEvent) => void;
164
+ 'data-in-range'?: "true" | undefined;
165
+ 'data-row-index': number;
166
+ 'data-col-index': number;
167
+ };
@@ -1,16 +1,18 @@
1
1
  export { escapeCsvValue, buildCsvHeader, buildCsvRows, exportToCsv, triggerCsvDownload, } from './exportToCsv';
2
2
  export { getCellValue } from './cellValue';
3
- export { flattenColumns } from './columnUtils';
3
+ export { flattenColumns, buildHeaderRows } from './columnUtils';
4
4
  export { getFilterField, mergeFilter, deriveFilterOptionsFromData, getMultiSelectFilterFields, } from './ogridHelpers';
5
5
  export { getStatusBarParts } from './statusBarHelpers';
6
6
  export { getDataGridStatusBarConfig } from './dataGridStatusBar';
7
7
  export { getPaginationViewModel, PAGE_SIZE_OPTIONS, MAX_PAGE_BUTTONS, } from './paginationHelpers';
8
8
  export type { PaginationViewModel } from './paginationHelpers';
9
9
  export { GRID_CONTEXT_MENU_ITEMS, getContextMenuHandlers, formatShortcut } from './gridContextMenuHelpers';
10
- export { getHeaderFilterConfig, getCellRenderDescriptor, } from './dataGridViewModel';
11
- export type { HeaderFilterConfigInput, HeaderFilterConfig, CellRenderDescriptorInput, CellRenderDescriptor, CellRenderMode, } from './dataGridViewModel';
10
+ export { getHeaderFilterConfig, getCellRenderDescriptor, resolveCellDisplayContent, resolveCellStyle, buildInlineEditorProps, buildPopoverEditorProps, getCellInteractionProps, } from './dataGridViewModel';
11
+ export type { HeaderFilterConfigInput, HeaderFilterConfig, CellRenderDescriptorInput, CellRenderDescriptor, CellRenderMode, CellInteractionHandlers, } from './dataGridViewModel';
12
12
  export type { CsvColumn } from './exportToCsv';
13
13
  export type { StatusBarPart, StatusBarPartsInput } from './statusBarHelpers';
14
14
  export type { GridContextMenuItem, GridContextMenuHandlerProps } from './gridContextMenuHelpers';
15
15
  export { parseValue, numberParser, currencyParser, dateParser, emailParser, booleanParser, } from './valueParsers';
16
16
  export type { ParseValueResult } from './valueParsers';
17
+ export { computeAggregations } from './aggregationUtils';
18
+ export type { AggregationResult } from './aggregationUtils';
@@ -1,8 +1,8 @@
1
- import type { IColumnDef, UserLike, IFilters } from '../types';
1
+ import type { IColumnDef, IFilters, FilterValue } from '../types';
2
2
  /** Resolve the filter field key for a column (filterField or columnId). */
3
3
  export declare function getFilterField<T>(col: IColumnDef<T>): string;
4
4
  /** Merge a single filter change into a full IFilters object. */
5
- export declare function mergeFilter(prev: IFilters, key: string, value: string | string[] | UserLike | undefined): IFilters;
5
+ export declare function mergeFilter(prev: IFilters, key: string, value: FilterValue | undefined): IFilters;
6
6
  /** Derive filter options for multiSelect columns from client-side data. */
7
7
  export declare function deriveFilterOptionsFromData<T>(items: T[], columns: IColumnDef<T>[]): Record<string, string[]>;
8
8
  /** Get list of filter fields that use multiSelect (for useFilterOptions). */
@@ -2,7 +2,7 @@
2
2
  * Shared pagination view model for Fluent, Material, and Radix PaginationControls.
3
3
  * UI packages use this and render only presentation.
4
4
  */
5
- export declare const PAGE_SIZE_OPTIONS: readonly [10, 20, 50, 100];
5
+ export declare const PAGE_SIZE_OPTIONS: readonly [10, 25, 50, 100];
6
6
  export declare const MAX_PAGE_BUTTONS = 5;
7
7
  export interface PaginationViewModel {
8
8
  totalPages: number;
@@ -11,6 +11,14 @@ export interface StatusBarPartsInput {
11
11
  filteredCount?: number;
12
12
  selectedCount?: number;
13
13
  selectedCellCount?: number;
14
+ /** Aggregation of selected numeric cells. */
15
+ aggregation?: {
16
+ sum: number;
17
+ avg: number;
18
+ min: number;
19
+ max: number;
20
+ count: number;
21
+ } | null;
14
22
  }
15
23
  /**
16
24
  * Returns an array of status bar parts (Rows, Filtered, Selected) for consistent rendering across packages.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@alaarab/ogrid-core",
3
- "version": "1.3.2",
3
+ "version": "1.4.0",
4
4
  "description": "OGrid core – framework-agnostic types, hooks, and utilities for OGrid data tables.",
5
5
  "main": "dist/esm/index.js",
6
6
  "module": "dist/esm/index.js",