Skip to content

Commit be90e4d

Browse files
committed
fixed ts bug
1 parent 8865c12 commit be90e4d

33 files changed

+262
-261
lines changed

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,10 @@ function MyListOfData() {
5151
{ field: "phone", datatype: "phone" },
5252
{ field: "is_active", datatype: "boolean"},
5353
{ field: "bio", datatype: "paragraph" },
54+
55+
// For custom fields that do not exist in "data", use @ts-ignore
56+
// @ts-ignore
57+
{ field: "customField" },
5458
],
5559
})
5660

build/index.d.ts

Lines changed: 92 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,13 @@ declare namespace Datatable {
1515

1616
type Filters = { [F in Datatype]?: React.ReactNode };
1717

18-
type Column<FieldNames extends string> = {
19-
field: FieldNames;
18+
type Column<Data extends Record<string, any>> = {
19+
field: keyof Data;
2020
columnName: string;
2121
sortable: boolean;
2222
filterable: boolean;
2323
omit: boolean;
24-
renderCell?: (value: any, column: Column<FieldNames>, row: Record<FieldNames, any>) => React.ReactNode;
24+
renderCell?: (value: any, column: Column<Data>, row: Data) => React.ReactNode;
2525
setOptions?: string[];
2626
multiFilter?: boolean;
2727
} & ({
@@ -35,16 +35,16 @@ declare namespace Datatable {
3535
filterOperations?: UseOperationFilter.BooleanFilterOperations[];
3636
})
3737

38-
type RowOptionMenuProps = { row: Record<FieldNames, any>; rowIndex: number; }
38+
type RowOptionMenuProps<Data extends Record<string, any> = Record<string, any>> = { row: Data; rowIndex: number; }
3939

4040
type AppsPanelProps = { OmitColumns: React.ReactNode; }
4141

42-
type ColumnConfig<FieldNames> = PartialKeys<Column<FieldNames>, "datatype" | "sortable" | "columnName" | "omit" | "filterable">[];
42+
type ColumnConfig<Data> = PartialKeys<Column<Data>, "datatype" | "sortable" | "columnName" | "omit" | "filterable">[];
4343

44-
interface Config<FieldNames> {
44+
interface Config<Data extends Record<string, any>> {
4545

46-
data: Data[];
47-
columns: Datatable.ColumnConfig<FieldNames>;
46+
data?: Data[];
47+
columns: Datatable.ColumnConfig<Data>;
4848

4949
/**
5050
* The total number of records in the database. (before pagination is applied)
@@ -54,12 +54,12 @@ declare namespace Datatable {
5454
/**
5555
* If serverSide is true, you need to handle the filters here and update data.
5656
*/
57-
onFilter?: (filter: Filter<FieldNames>) => void;
57+
onFilter?: (filter: Filter<Data>) => void;
5858

59-
initialSortOrder?: Filter<FieldNames>["sortOrder"];
60-
initialPage?: Filter<FieldNames>["page"];
61-
initialOperationFilter?: Filter<FieldNames>["operationFilter"];
62-
initialSetFilter?: Filter<FieldNames>["setFilter"];
59+
initialSortOrder?: Filter<Data>["sortOrder"];
60+
initialPage?: Filter<Data>["page"];
61+
initialOperationFilter?: Filter<Data>["operationFilter"];
62+
initialSetFilter?: Filter<Data>["setFilter"];
6363

6464
/**
6565
* Default is true
@@ -68,86 +68,86 @@ declare namespace Datatable {
6868
}
6969

7070

71-
interface RichDatatableProps<Data extends Record<string, any>, FieldNames> {
71+
interface RichDatatableProps<Data extends Record<string, any>> {
7272
data?: Data[];
7373
isFetching?: boolean;
74-
columns: Datatable.ColumnConfig<FieldNames>;
75-
setFilter: Datatable.UseSetFilter.HookReturn<FieldNames>;
74+
columns: Datatable.ColumnConfig<Data>;
75+
setFilter: Datatable.UseSetFilter.HookReturn<Data>;
7676
operationFilter: Datatable.UseOperationFilter.HookReturn<string>;
77-
sortable: Datatable.UseSortable.HookReturn<FieldNames>;
77+
sortable: Datatable.UseSortable.HookReturn<Data>;
7878
pagination: Datatable.UsePagination.HookReturn;
79-
selectable: Datatable.UseSelectable.HookReturn<FieldNames>;
80-
RowOptionMenu?: React.FC<RowOptionMenuProps>;
79+
selectable: Datatable.UseSelectable.HookReturn<Data>;
80+
RowOptionMenu?: React.FC<RowOptionMenuProps<Data>>;
8181
AppsPanel?: React.FC<AppsPanelProps>;
82-
isSelectable?: (row: Record<FieldNames, any>) => boolean;
82+
isSelectable?: (row: Data) => boolean;
8383
NoData?: React.ReactNode;
84-
onRowClick?: (row: Record<FieldNames, any>, e: React.MouseEvent<HTMLDivElement, MouseEvent>) => void;
84+
onRowClick?: (row: Data, e: React.MouseEvent<HTMLDivElement, MouseEvent>) => void;
8585
showOptionsOnRowClick?: boolean;
8686
}
8787

88-
interface Filter<FieldNames> {
89-
sortOrder?: UseSortable.SortOrder<FieldNames>;
90-
page?: UsePagination.Page;
91-
operationFilter?: UseOperationFilter.OperationFilter<TextFilterOperations | RangeFilterOperations | BooleanFilterOperations>;
92-
setFilter?: UseSetFilter.SetFilter<FieldNames>;
88+
interface Filter<Data extends Record<string, any>> {
89+
sortOrder: UseSortable.SortOrder<Data>;
90+
page: UsePagination.Page;
91+
operationFilter: UseOperationFilter.OperationFilter<Data, UseOperationFilter.TextFilterOperations | UseOperationFilter.RangeFilterOperations | UseOperationFilter.BooleanFilterOperations>;
92+
setFilter: UseSetFilter.SetFilter<Data>;
9393
}
9494

9595

96-
interface TableHeaderProps<FieldNames extends string> extends React.PropsWithChildren {
97-
column: Column<FieldNames>;
98-
onClick?: (column: Column<FieldNames>) => void;
96+
interface TableHeaderProps<Data> extends React.PropsWithChildren {
97+
column: Column<Data>;
98+
onClick?: (column: Column<Data>) => void;
9999
className?: string;
100100
}
101101

102102
type DatatableFilterProps<Operation> = { multiFilter?: boolean; setOptions?: string[]; datatype: string; field: string; filterOperations?: Operation[] };
103103

104-
interface DatatableProps<FieldNames extends string> {
105-
columns: Datatable.Column<FieldNames>[];
106-
data: Record<FieldNames, any>[];
104+
interface DatatableProps<Data extends Record<string, any>> {
105+
columns: Datatable.Column<Data>[];
106+
data: Data[];
107107
isFetching?: boolean;
108-
onColumnClick?: (column: Datatable.Column<FieldNames>) => void;
108+
onColumnClick?: (column: Datatable.Column<Data>) => void;
109109

110-
RowOptionMenu?: React.FC<RowOptionMenuProps>
110+
RowOptionMenu?: React.FC<RowOptionMenuProps<Data>>
111111
AppsPanel?: React.ReactNode;
112112

113-
renderFilter?: (column: Datatable.Column<FieldNames>, FilterMenu: React.FC<{ hasFilter: boolean; } & React.PropsWithChildren>) => React.ReactElement;
114-
renderSort?: (column: Datatable.Column<FieldNames>) => React.ReactElement;
113+
renderFilter?: (column: Datatable.Column<Data>, FilterMenu: React.FC<{ hasFilter: boolean; } & React.PropsWithChildren>) => React.ReactElement;
114+
renderSort?: (column: Datatable.Column<Data>) => React.ReactElement;
115115
Footer?: React.ReactNode;
116116

117117
hideSelect?: boolean;
118118
SelectHeader?: React.FC;
119-
SelectCell?: React.FC<{ index: number; row: Record<FieldNames, any> }>;
119+
SelectCell?: React.FC<{ index: number; row: Data }>;
120120
NoData?: React.ReactNode;
121-
onRowClick?: (row: Record<FieldNames, any>, e: React.MouseEvent<HTMLDivElement, MouseEvent>) => void;
121+
onRowClick?: (row: Data, e: React.MouseEvent<HTMLDivElement, MouseEvent>) => void;
122122
showOptionsOnRowClick?: boolean;
123123
}
124124

125125

126126

127127
namespace UseSortable {
128128

129-
interface Config<FieldNames extends string> {
130-
initialSortOrder?: SortOrder<FieldNames>;
131-
onChange: (sortOrder: SortOrder<FieldNames>) => void;
129+
interface Config<Data extends Record<string, any>> {
130+
initialSortOrder?: SortOrder<Data>;
131+
onChange: (sortOrder: SortOrder<Data>) => void;
132132
}
133133

134-
interface HookReturn<FieldNames extends string> {
135-
sortOrder: SortOrder<FieldNames>;
136-
Sort: (props: SortProps<FieldNames>) => JSX.Element | null;
137-
onSort: (column: Column<FieldNames>) => void
134+
interface HookReturn<Data extends Record<string, any>> {
135+
sortOrder: SortOrder<Data>;
136+
Sort: (props: SortProps<Data>) => JSX.Element | null;
137+
onSort: (column: DatatableColumn<Data>) => void
138138
}
139139

140-
interface SortProps<FieldNames extends string> {
141-
column: Column<FieldNames>;
140+
interface SortProps<Data> {
141+
column: Column<Data>;
142142
sortDirection?: SortDirection;
143143
orderIndex?: number;
144144
isMultiSort: boolean;
145145
}
146146

147147
type SortDirection = "asc" | "desc"
148148

149-
type SortOrder<FieldNames extends string> = {
150-
[K in FieldNames]?: {
149+
type SortOrder<Data extends Record<string, any>> = {
150+
[K in keyof Data]?: {
151151
sortDirection: SortDirection;
152152
orderIndex: number;
153153
}
@@ -203,14 +203,14 @@ declare namespace Datatable {
203203

204204
namespace UseSelectable {
205205

206-
interface Config<FieldNames> {
206+
interface Config {
207207
numberOfRows: number;
208208
onChange: (selectable: { isAllSelected: boolean; selectedRows: number[] }) => void;
209209
}
210210

211-
interface HookReturn<FieldNames> {
211+
interface HookReturn {
212212
Header: (props: HeaderProps) => JSX.Element | null;
213-
Row: (props: RowProps<FieldNames>) => JSX.Element | null;
213+
Row: (props: RowProps) => JSX.Element | null;
214214
selectAll: (select: boolean) => void;
215215
selectedRows: number[];
216216
onSelectRow: (checked: boolean, rowIndex: number) => void;
@@ -223,7 +223,7 @@ declare namespace Datatable {
223223
isAllSelected: boolean;
224224
}
225225

226-
interface RowProps<FieldNames> {
226+
interface RowProps {
227227
index: number;
228228
disabled: boolean;
229229
checked: boolean;
@@ -235,17 +235,17 @@ declare namespace Datatable {
235235

236236
namespace UseSetFilter {
237237

238-
interface Config<FieldNames> {
239-
onChange: (setFilter: SetFilter<FieldNames>) => void;
240-
initialSetFilter?: SetFilter<FieldNames>;
238+
interface Config<Data extends Record<string, any>> {
239+
onChange: (setFilter: SetFilter<Data>) => void;
240+
initialSetFilter?: SetFilter<Data>;
241241
}
242242

243-
type SetFilter<FieldNames> = { [F in FieldNames]?: string[] };
243+
type SetFilter<Data extends Record<string, any>> = { [K in keyof Data]?: string[] };
244244

245-
interface HookReturn<FieldNames> {
245+
interface HookReturn<Data extends Record<string, any>> {
246246
SetFilter: (props: SetFilterProps) => JSX.Element | null;
247-
setFilter: SetFilter<FieldNames>;
248-
onSetFilter: (filter: SetFilter<FieldNames>) => void;
247+
setFilter: SetFilter<Data>;
248+
onSetFilter: (filter: SetFilter<Data>) => void;
249249
}
250250

251251

@@ -272,14 +272,14 @@ declare namespace Datatable {
272272
or?: OperationValue<Operation>
273273
}
274274

275-
type OperationFilter<Operation> = {
276-
[field: string]: OperationValue<Operation>
275+
type OperationFilter<Data extends Record<string, any>, Operation> = {
276+
[key: keyof Data]: OperationValue<Operation>
277277
};
278278

279-
interface HookReturn<Operation> {
280-
OperationFilter: (props: OperationProps<Operation>) => JSX.Element | null;
281-
operationFilter: OperationFilter<Operation>;
282-
onSetOperationFilter: (filter: OperationFilter<Operation>) => void;
279+
interface HookReturn<Data extends Record<string, any>, Operation> {
280+
OperationFilter: (props: OperationProps<Data, Operation>) => JSX.Element | null;
281+
operationFilter: OperationFilter<Data, Operation>;
282+
onSetOperationFilter: (filter: OperationFilter<Data, Operation>) => void;
283283
}
284284

285285
type BooleanFilterOperations = "Is true" | "Is false" | "Is blank";
@@ -288,10 +288,10 @@ declare namespace Datatable {
288288

289289
type TextFilterOperations = "Equal" | "Not equal" | "Contains" | "Starts with" | "Ends with" | "Is blank";
290290

291-
interface OperationProps<Operation> {
291+
interface OperationProps<Data extends Record<string, any>, Operation> {
292292
inputType?: "text" | "date" | "datetime-local" | "number";
293-
field: string;
294-
onChange: (result: UseOperationFilter.OperationFilter<Operation>) => void;
293+
field: keyof Data;
294+
onChange: (result: UseOperationFilter.OperationFilter<Data, Operation>) => void;
295295
filterOperations?: Operation[];
296296
currentValue?: UseOperationFilter.OperationValue<Operation>
297297
allowedOperations: Operation[];
@@ -300,31 +300,37 @@ declare namespace Datatable {
300300
}
301301
}
302302

303-
declare function BaseDatatable<FieldNames extends string>(props: Datatable.DatatableProps<FieldNames>): react_jsx_runtime.JSX.Element;
303+
declare function BaseDatatable<Data extends Record<string, any>>(props: Datatable.DatatableProps<Data>): react_jsx_runtime.JSX.Element;
304304

305-
declare function useDatatable<FieldNames>(config: Datatable.Config<FieldNames>): {
306-
data: Record<string, any>[];
307-
columns: Datatable.ColumnConfig<FieldNames>;
308-
sortable: Datatable.UseSortable.HookReturn<string>;
305+
declare function useDatatable<Data extends Record<string, any>>(config: Datatable.Config<Data>): {
306+
data: Data[];
307+
columns: Datatable.ColumnConfig<Data>;
308+
sortable: Datatable.UseSortable.HookReturn<Data>;
309309
pagination: Datatable.UsePagination.HookReturn;
310-
selectable: Datatable.UseSelectable.HookReturn<string>;
311-
setFilter: Datatable.UseSetFilter.HookReturn<FieldNames>;
312-
operationFilter: Datatable.UseOperationFilter.HookReturn<string>;
313-
updateFilter: react.Dispatch<react.SetStateAction<Datatable.Filter<FieldNames>>>;
310+
selectable: Datatable.UseSelectable.HookReturn;
311+
setFilter: Datatable.UseSetFilter.HookReturn<Data>;
312+
operationFilter: Datatable.UseOperationFilter.HookReturn<Data, string>;
313+
updateFilter: react.Dispatch<react.SetStateAction<Datatable.Filter<Data>>>;
314314
Datatable: typeof RichDatatable;
315315
};
316-
declare function RichDatatable<Data extends Record<string, any>, FieldNames extends string>(props: Datatable.RichDatatableProps<Data, FieldNames>): react_jsx_runtime.JSX.Element;
316+
declare function RichDatatable<Data extends Record<string, any>>(props: Datatable.RichDatatableProps<Data>): react_jsx_runtime.JSX.Element;
317317

318-
interface Props<FieldNames extends string> {
319-
columns: Datatable.Column<FieldNames>[];
320-
setColumns: (callback: (columns: Datatable.Column<FieldNames>[]) => Datatable.Column<FieldNames>[]) => void;
318+
interface Props<Data extends Record<string, any>> {
319+
columns: Datatable.Column<Data>[];
320+
setColumns: (callback: (columns: Datatable.Column<Data>[]) => Datatable.Column<Data>[]) => void;
321321
}
322-
declare function OmitColumn<FieldNames extends string>(config: Props<FieldNames>): react_jsx_runtime.JSX.Element;
322+
declare function OmitColumn<Data extends Record<string, any>>(config: Props<Data>): react_jsx_runtime.JSX.Element;
323323

324324
declare function usePagination(config: Datatable.UsePagination.Config): Datatable.UsePagination.HookReturn;
325325

326-
declare function useSelectable<FieldNames extends string>(config: Datatable.UseSelectable.Config<FieldNames>): Datatable.UseSelectable.HookReturn<FieldNames>;
326+
declare function useSelectable(config: Datatable.UseSelectable.Config): Datatable.UseSelectable.HookReturn;
327+
328+
declare function useSortable<Data extends Record<string, any>>(config: Datatable.UseSortable.Config<Data>): Datatable.UseSortable.HookReturn<Data>;
327329

328-
declare function useSortable<FieldNames extends string>(config: Datatable.UseSortable.Config<FieldNames>): Datatable.UseSortable.HookReturn<FieldNames>;
330+
declare function useClientSide<Data extends Record<string, any>>(filter: Datatable.Filter<Data>, data?: Data[], count?: number, serverSide?: boolean): {
331+
data: Data[];
332+
count: number;
333+
numberOfRows: number;
334+
};
329335

330-
export { BaseDatatable, Datatable, OmitColumn, useDatatable, usePagination, useSelectable, useSortable };
336+
export { BaseDatatable, Datatable, OmitColumn, useClientSide, useDatatable, usePagination, useSelectable, useSortable };

build/index.esm.js

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

build/index.esm.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

build/index.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

build/index.js.map

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

build/styles/default.css

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,8 @@
4040
user-select: none;
4141
position: sticky;
4242
top: 0;
43-
padding: 0px;
43+
padding-inline: 0px;
44+
padding-block: 0px;
4445
}
4546
.myers-datatable .table-header:not(:first-child)::before {
4647
content: "";
@@ -60,7 +61,6 @@
6061
.myers-datatable .table-header-column-name {
6162
display: flex;
6263
margin-inline: 8px;
63-
margin-block: 16px;
6464
}
6565
.myers-datatable .table-row {
6666
border: 1px solid rgb(240, 240, 240);
@@ -262,7 +262,6 @@
262262
.myers-datatable .filter-options-button {
263263
display: flex;
264264
margin-inline: 8px;
265-
height: 40px;
266265
}
267266
.myers-datatable .operation-filter-container {
268267
min-width: 182px;

docs/asset-manifest.json

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
{
22
"files": {
3-
"main.css": "/datatable/static/css/main.8c51b9f8.css",
4-
"main.js": "/datatable/static/js/main.d3e45a54.js",
3+
"main.css": "/datatable/static/css/main.521c0ba4.css",
4+
"main.js": "/datatable/static/js/main.44aa4454.js",
55
"index.html": "/datatable/index.html",
6-
"main.8c51b9f8.css.map": "/datatable/static/css/main.8c51b9f8.css.map",
7-
"main.d3e45a54.js.map": "/datatable/static/js/main.d3e45a54.js.map"
6+
"main.521c0ba4.css.map": "/datatable/static/css/main.521c0ba4.css.map",
7+
"main.44aa4454.js.map": "/datatable/static/js/main.44aa4454.js.map"
88
},
99
"entrypoints": [
10-
"static/css/main.8c51b9f8.css",
11-
"static/js/main.d3e45a54.js"
10+
"static/css/main.521c0ba4.css",
11+
"static/js/main.44aa4454.js"
1212
]
1313
}

docs/index.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
<!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="/datatable/favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><meta name="description" content="Discover @jjmyers/datatable, a powerful and customizable React library for creating interactive data tables with ease."><link rel="apple-touch-icon" href="/datatable/logo192.png"/><link rel="manifest" href="/datatable/manifest.json"/><title>@jjmyers/datatable - A Powerful React Library for Data Tables</title><script defer="defer" src="/datatable/static/js/main.d3e45a54.js"></script><link href="/datatable/static/css/main.8c51b9f8.css" rel="stylesheet"></head><body><style>#root,body,html{margin:0;height:100%}</style><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html>
1+
<!doctype html><html lang="en"><head><meta charset="utf-8"/><link rel="icon" href="/datatable/favicon.ico"/><meta name="viewport" content="width=device-width,initial-scale=1"/><meta name="theme-color" content="#000000"/><meta name="description" content="Discover @jjmyers/datatable, a powerful and customizable React library for creating interactive data tables with ease."><link rel="apple-touch-icon" href="/datatable/logo192.png"/><link rel="manifest" href="/datatable/manifest.json"/><title>@jjmyers/datatable - A Powerful React Library for Data Tables</title><script defer="defer" src="/datatable/static/js/main.44aa4454.js"></script><link href="/datatable/static/css/main.521c0ba4.css" rel="stylesheet"></head><body><style>#root,body,html{margin:0;height:100%}</style><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html>

0 commit comments

Comments
 (0)