diff --git a/packages/common/src/core/slickDataview.ts b/packages/common/src/core/slickDataview.ts index d0ed29846..dfcdcb704 100755 --- a/packages/common/src/core/slickDataview.ts +++ b/packages/common/src/core/slickDataview.ts @@ -7,6 +7,7 @@ import type { Grouping, GroupingFormatterItem, ItemMetadata, + ItemMetadataProvider, OnGroupCollapsedEventArgs, OnGroupExpandedEventArgs, OnRowCountChangedEventArgs, @@ -27,6 +28,9 @@ export interface DataViewOption { */ inlineFilters: boolean; + /** global override for all rows */ + globalItemMetadataProvider: ItemMetadataProvider | null; + /** Optionally provide a GroupItemMetadataProvider in order to use Grouping/DraggableGrouping features */ groupItemMetadataProvider: SlickGroupItemMetadataProvider | null; @@ -52,6 +56,7 @@ export type GroupGetterFn = (val: any) => string | number; */ export class SlickDataView implements CustomDataView { protected defaults: DataViewOption = { + globalItemMetadataProvider: null, groupItemMetadataProvider: null, inlineFilters: false, useCSPSafeFilter: false, @@ -749,20 +754,25 @@ export class SlickDataView implements CustomD return item; } - getItemMetadata(i: number): ItemMetadata | null { - const item = this.rows[i]; + getItemMetadata(row: number): ItemMetadata | null { + const item = this.rows[row]; if (item === undefined) { return null; } + // global override for all regular rows + if (this._options.globalItemMetadataProvider?.getRowMetadata) { + return this._options.globalItemMetadataProvider.getRowMetadata(item, row); + } + // overrides for grouping rows - if ((item as SlickGroup).__group) { - return this._options.groupItemMetadataProvider!.getGroupRowMetadata(item as GroupingFormatterItem); + if ((item as SlickGroup).__group && this._options.groupItemMetadataProvider?.getGroupRowMetadata) { + return this._options.groupItemMetadataProvider.getGroupRowMetadata(item as GroupingFormatterItem, row); } // overrides for totals rows - if ((item as SlickGroupTotals).__groupTotals) { - return this._options.groupItemMetadataProvider!.getTotalsRowMetadata(item as { group: GroupingFormatterItem }); + if ((item as SlickGroupTotals).__groupTotals && this._options.groupItemMetadataProvider?.getTotalsRowMetadata) { + return this._options.groupItemMetadataProvider.getTotalsRowMetadata(item as { group: GroupingFormatterItem }, row); } return null; diff --git a/packages/common/src/extensions/slickGroupItemMetadataProvider.ts b/packages/common/src/extensions/slickGroupItemMetadataProvider.ts index be153541c..b5926180e 100644 --- a/packages/common/src/extensions/slickGroupItemMetadataProvider.ts +++ b/packages/common/src/extensions/slickGroupItemMetadataProvider.ts @@ -85,7 +85,7 @@ export class SlickGroupItemMetadataProvider implements SlickPlugin { this._options = { ...this._options, ...inputOptions }; } - getGroupRowMetadata(item: GroupingFormatterItem): ItemMetadata { + getGroupRowMetadata(item: GroupingFormatterItem, _row: number): ItemMetadata { return { selectable: false, focusable: this._options.groupFocusable, @@ -101,7 +101,8 @@ export class SlickGroupItemMetadataProvider implements SlickPlugin { }; } - getTotalsRowMetadata(item: { group: GroupingFormatterItem }): { + // prettier-ignore + getTotalsRowMetadata(item: { group: GroupingFormatterItem }, _row: number): { selectable: boolean; focusable: boolean | undefined; cssClasses: string; diff --git a/packages/common/src/interfaces/groupItemMetadataProviderOption.interface.ts b/packages/common/src/interfaces/groupItemMetadataProviderOption.interface.ts index d64d665d8..355917127 100644 --- a/packages/common/src/interfaces/groupItemMetadataProviderOption.interface.ts +++ b/packages/common/src/interfaces/groupItemMetadataProviderOption.interface.ts @@ -1,6 +1,10 @@ import type { Formatter } from './formatter.interface.js'; import type { SlickCheckboxSelectColumn } from '../extensions/slickCheckboxSelectColumn.js'; +export interface ItemMetadataProvider { + getRowMetadata(item: any, row: number): any; +} + export interface GroupItemMetadataProviderOption { /** Whether or not we want to use group select checkbox. */ checkboxSelect?: boolean;