Skip to content

Commit 5be6fa0

Browse files
authored
feat: add Custom Global Item Data Provider, closes #262 (#1097)
1 parent 5003565 commit 5be6fa0

File tree

3 files changed

+22
-8
lines changed

3 files changed

+22
-8
lines changed

src/models/groupItemMetadataProviderOption.interface.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
import type { Formatter } from './index.js';
22

3+
export interface ItemMetadataProvider {
4+
getRowMetadata(item: any, row: number): any;
5+
}
6+
37
export interface GroupItemMetadataProviderOption {
48
/** Whether or not we want to use group select checkbox. */
59
checkboxSelect?: boolean;

src/slick.dataview.ts

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import type {
77
Grouping,
88
GroupingFormatterItem,
99
ItemMetadata,
10+
ItemMetadataProvider,
1011
OnGroupCollapsedEventArgs,
1112
OnGroupExpandedEventArgs,
1213
OnRowCountChangedEventArgs,
@@ -37,6 +38,9 @@ const Utils = IIFE_ONLY ? Slick.Utils : Utils_;
3738
const SlickGroupItemMetadataProvider = IIFE_ONLY ? Slick.Data?.GroupItemMetadataProvider ?? {} : SlickGroupItemMetadataProvider_;
3839

3940
export interface DataViewOption {
41+
/** global override for all rows */
42+
globalItemMetadataProvider: ItemMetadataProvider | null;
43+
4044
/** Optionally provide a GroupItemMetadataProvider in order to use Grouping/DraggableGrouping features */
4145
groupItemMetadataProvider: SlickGroupItemMetadataProvider_ | null;
4246

@@ -63,6 +67,7 @@ export type GroupGetterFn = (val: any) => string | number;
6367
*/
6468
export class SlickDataView<TData extends SlickDataItem = any> implements CustomDataView {
6569
protected defaults: DataViewOption = {
70+
globalItemMetadataProvider: null,
6671
groupItemMetadataProvider: null,
6772
inlineFilters: false,
6873
useCSPSafeFilter: false,
@@ -775,20 +780,25 @@ export class SlickDataView<TData extends SlickDataItem = any> implements CustomD
775780
return item;
776781
}
777782

778-
getItemMetadata(i: number): ItemMetadata | null {
779-
const item = this.rows[i];
783+
getItemMetadata(row: number): ItemMetadata | null {
784+
const item = this.rows[row];
780785
if (item === undefined) {
781786
return null;
782787
}
783788

789+
// global override for all regular rows
790+
if (this._options.globalItemMetadataProvider?.getRowMetadata) {
791+
return this._options.globalItemMetadataProvider.getRowMetadata(item, row);
792+
}
793+
784794
// overrides for grouping rows
785-
if ((item as SlickGroup_).__group) {
786-
return this._options.groupItemMetadataProvider!.getGroupRowMetadata(item as GroupingFormatterItem);
795+
if ((item as SlickGroup_).__group && this._options.groupItemMetadataProvider?.getGroupRowMetadata) {
796+
return this._options.groupItemMetadataProvider.getGroupRowMetadata(item as GroupingFormatterItem, row);
787797
}
788798

789799
// overrides for totals rows
790-
if ((item as SlickGroupTotals_).__groupTotals) {
791-
return this._options.groupItemMetadataProvider!.getTotalsRowMetadata(item as { group: GroupingFormatterItem });
800+
if ((item as SlickGroupTotals_).__groupTotals && this._options.groupItemMetadataProvider?.getTotalsRowMetadata) {
801+
return this._options.groupItemMetadataProvider.getTotalsRowMetadata(item as { group: GroupingFormatterItem }, row);
792802
}
793803

794804
return null;

src/slick.groupitemmetadataprovider.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -164,7 +164,7 @@ export class SlickGroupItemMetadataProvider implements SlickPlugin {
164164
}
165165
}
166166

167-
getGroupRowMetadata(item: GroupingFormatterItem): ItemMetadata {
167+
getGroupRowMetadata(item: GroupingFormatterItem, _row: number): ItemMetadata {
168168
const groupLevel = item?.level;
169169
return {
170170
selectable: false,
@@ -181,7 +181,7 @@ export class SlickGroupItemMetadataProvider implements SlickPlugin {
181181
};
182182
}
183183

184-
getTotalsRowMetadata(item: { group: GroupingFormatterItem }): ItemMetadata | null {
184+
getTotalsRowMetadata(item: { group: GroupingFormatterItem }, _row: number): ItemMetadata | null {
185185
const groupLevel = item?.group?.level;
186186
return {
187187
selectable: false,

0 commit comments

Comments
 (0)