frame.select 1.1.4 → 1.2.1
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.
- package/dist/App.d.ts.map +1 -1
- package/dist/App.js +36 -18
- package/dist/components/BrandList.d.ts.map +1 -1
- package/dist/components/BrandList.js +2 -119
- package/dist/components/FrameList.d.ts.map +1 -1
- package/dist/components/FrameList.js +2 -119
- package/dist/components/ItemList.d.ts +8 -8
- package/dist/components/ItemList.d.ts.map +1 -1
- package/dist/components/ItemList.js +113 -33
- package/dist/components/types.d.ts +4 -3
- package/dist/components/types.d.ts.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/package.json +1 -1
package/dist/App.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../src/App.tsx"],"names":[],"mappings":"AACA,OAAO,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../src/App.tsx"],"names":[],"mappings":"AACA,OAAO,WAAW,CAAC;AAGnB,OAAO,KAAK,MAAM,OAAO,CAAC;AAU1B,iBAAS,GAAG,sBAuMX;AAED,eAAe,GAAG,CAAC"}
|
package/dist/App.js
CHANGED
|
@@ -43,6 +43,11 @@ function App() {
|
|
|
43
43
|
description: 'Description of New Balance',
|
|
44
44
|
// item: ['New Balance'],
|
|
45
45
|
},
|
|
46
|
+
{
|
|
47
|
+
name: 'Brooks',
|
|
48
|
+
id: 6,
|
|
49
|
+
description: 'Description of Brooks',
|
|
50
|
+
},
|
|
46
51
|
];
|
|
47
52
|
const framesAdidas = [
|
|
48
53
|
'ADI0000000000000000014362150000',
|
|
@@ -50,6 +55,19 @@ function App() {
|
|
|
50
55
|
'ADI0000000000000000019362150000',
|
|
51
56
|
// 3456789 123456789 12345678901
|
|
52
57
|
'AFF000000000000000TMA4750190000',
|
|
58
|
+
'AFF000000000000000TMA4750190001',
|
|
59
|
+
'AFF000000000000000TMA4750190002',
|
|
60
|
+
'AFF000000000000000TMA4750190003',
|
|
61
|
+
'AFF000000000000000TMA4750190004',
|
|
62
|
+
'AFF000000000000000TMA4750190005',
|
|
63
|
+
'AFF000000000000000TMA4750190006',
|
|
64
|
+
'AFF000000000000000TMA4750190007',
|
|
65
|
+
'AFF000000000000000TMA4750190008',
|
|
66
|
+
'AFF000000000000000TMA4750190009',
|
|
67
|
+
'AFF000000000000000TMA4750190010',
|
|
68
|
+
'AFF000000000000000TMA4750190011',
|
|
69
|
+
'AFF000000000000000TMA4750190012',
|
|
70
|
+
'ADI000000000000000TODDC50190012',
|
|
53
71
|
];
|
|
54
72
|
const frameNike = [
|
|
55
73
|
'NIK0000000000000000030362150000',
|
|
@@ -71,6 +89,10 @@ function App() {
|
|
|
71
89
|
'NEW000000000000000NEWBL62150000',
|
|
72
90
|
'NEW000000000000000NWBLC62150000',
|
|
73
91
|
];
|
|
92
|
+
const frameBrooks = [
|
|
93
|
+
'BRO000000000000000BROOK62150000',
|
|
94
|
+
'BRO000000000000000ROOKS62150000',
|
|
95
|
+
];
|
|
74
96
|
const frames = [
|
|
75
97
|
{ brand: 'Adidas', frames: framesAdidas },
|
|
76
98
|
{ brand: 'Nike', frames: frameNike },
|
|
@@ -78,23 +100,26 @@ function App() {
|
|
|
78
100
|
{ brand: 'Reebok', frames: frameReebok },
|
|
79
101
|
{ brand: 'Under Armour', frames: frameUnderArmour },
|
|
80
102
|
{ brand: 'New Balance', frames: frameNewBalance },
|
|
103
|
+
{ brand: 'Brooks', frames: frameBrooks },
|
|
81
104
|
];
|
|
82
|
-
function convertFrames(brand) {
|
|
83
|
-
const foundFrames =
|
|
105
|
+
function convertFrames(brand, frameArray) {
|
|
106
|
+
const foundFrames = frameArray.find((b) => b.brand === brand);
|
|
84
107
|
if (!foundFrames) {
|
|
85
108
|
return [];
|
|
86
109
|
}
|
|
87
110
|
return foundFrames.frames.map((frame) => ({
|
|
88
|
-
|
|
111
|
+
frame,
|
|
89
112
|
name: frame.substring(18, 23),
|
|
90
|
-
|
|
91
|
-
width:
|
|
113
|
+
height: frame.substring(23, 25),
|
|
114
|
+
width: frame.substring(25, 27),
|
|
115
|
+
rest: frame.substring(27),
|
|
92
116
|
}));
|
|
93
117
|
}
|
|
94
118
|
const brandColumnHelper = createColumnHelper();
|
|
95
119
|
const brandColumns = [
|
|
96
120
|
brandColumnHelper.accessor((row) => row.description, {
|
|
97
121
|
header: 'description',
|
|
122
|
+
size: 100,
|
|
98
123
|
cell: (info) => React.createElement("div", null, info.getValue()),
|
|
99
124
|
}),
|
|
100
125
|
];
|
|
@@ -105,13 +130,15 @@ function App() {
|
|
|
105
130
|
];
|
|
106
131
|
const frameColumnHelper = createColumnHelper();
|
|
107
132
|
const frameColumns = [
|
|
108
|
-
frameColumnHelper.accessor((row) => row.
|
|
109
|
-
header: '
|
|
133
|
+
frameColumnHelper.accessor((row) => row.height.toString(), {
|
|
134
|
+
header: 'height',
|
|
135
|
+
size: 120,
|
|
110
136
|
cell: (info) => React.createElement("div", null, info.getValue()),
|
|
111
137
|
}),
|
|
112
138
|
frameColumnHelper.accessor((row) => row.width.toString(), {
|
|
113
139
|
// Convert to string
|
|
114
140
|
header: 'width',
|
|
141
|
+
size: 20,
|
|
115
142
|
cell: (info) => React.createElement("div", null, info.getValue()),
|
|
116
143
|
}),
|
|
117
144
|
];
|
|
@@ -123,10 +150,9 @@ function App() {
|
|
|
123
150
|
column: frameColumns[1],
|
|
124
151
|
},
|
|
125
152
|
];
|
|
126
|
-
const onClickBrand = (cell
|
|
153
|
+
const onClickBrand = (cell) => {
|
|
127
154
|
console.log(`cell: ${JSON.stringify(cell.row.original, null, 2)}`);
|
|
128
155
|
const brand = brands.find((b) => b.name === cell.row.original.name);
|
|
129
|
-
// window.alert(`Item clicked: ${index}\n${JSON.stringify(brand, null, 2)}`);
|
|
130
156
|
if (brand) {
|
|
131
157
|
setBrand(brand.name);
|
|
132
158
|
}
|
|
@@ -134,20 +160,12 @@ function App() {
|
|
|
134
160
|
const onClickFrame = (cell, index) => {
|
|
135
161
|
window.alert(`Frame clicked: ${JSON.stringify(cell.row.original)} at index ${index}`);
|
|
136
162
|
};
|
|
137
|
-
const [filter, setFilter] = useState('');
|
|
138
|
-
function filterMatches(item, fltr) {
|
|
139
|
-
const match = item.name
|
|
140
|
-
.toLowerCase()
|
|
141
|
-
.includes(fltr ? fltr.toLowerCase() : '');
|
|
142
|
-
return match;
|
|
143
|
-
}
|
|
144
|
-
const renderItem = (item) => React.createElement("h4", null, item);
|
|
145
163
|
return (React.createElement(React.Fragment, null,
|
|
146
164
|
React.createElement("h1", null, "Brand List"),
|
|
147
165
|
React.createElement(BrandList, { brandList: brands, onClick: onClickBrand,
|
|
148
166
|
// renderItem={renderItem}
|
|
149
167
|
extraColumns: extraBrandColumns }),
|
|
150
168
|
React.createElement("h2", null, "Frame List"),
|
|
151
|
-
React.createElement(FrameList, { frameList: convertFrames(brand), onClick: onClickFrame, extraColumns: extraFrameColumns, style: { border: '1px solid black', padding: '10px' } })));
|
|
169
|
+
React.createElement(FrameList, { frameList: convertFrames(brand, frames), onClick: onClickFrame, extraColumns: extraFrameColumns, style: { border: '1px solid black', padding: '10px' } })));
|
|
152
170
|
}
|
|
153
171
|
export default App;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BrandList.d.ts","sourceRoot":"","sources":["../../src/components/BrandList.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"BrandList.d.ts","sourceRoot":"","sources":["../../src/components/BrandList.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAC5B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAGpC,wBAAgB,SAAS,CAAC,KAAK,EAAE;IAC/B,SAAS,EAAE,SAAS,EAAE,CAAC;IACvB,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClE,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,KAAK,CAAC,SAAS,CAAC;IAC/C,YAAY,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;IACpC,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B,GAAG,GAAG,CAAC,OAAO,CAcd"}
|
|
@@ -1,122 +1,5 @@
|
|
|
1
|
-
import { TableContainer, Table, TableHead, TableRow, TableCell, TableBody, Button, } from '@mui/material';
|
|
2
|
-
import { useReactTable, getCoreRowModel, getFilteredRowModel, createColumnHelper, flexRender, } from '@tanstack/react-table';
|
|
3
|
-
import ItemFilter from './ItemFilter';
|
|
4
|
-
import { useMemo, useState, useCallback } from 'react';
|
|
5
1
|
import React from 'react';
|
|
2
|
+
import { ItemList } from './ItemList';
|
|
6
3
|
export function BrandList(props) {
|
|
7
|
-
|
|
8
|
-
const [filter, setFilter] = useState('');
|
|
9
|
-
const filterMatches = useCallback((item, fltr) => {
|
|
10
|
-
const match = item.name
|
|
11
|
-
.toLowerCase()
|
|
12
|
-
.includes(fltr ? fltr.toLowerCase() : '');
|
|
13
|
-
return match;
|
|
14
|
-
}, []);
|
|
15
|
-
const tBrandFilter = useMemo(() => ({
|
|
16
|
-
property: 'name',
|
|
17
|
-
filter,
|
|
18
|
-
setFilter,
|
|
19
|
-
filterMatches,
|
|
20
|
-
placeholder: 'Brands',
|
|
21
|
-
}), [filter, filterMatches]);
|
|
22
|
-
const serializedExtraColumns = useMemo(() => JSON.stringify(props.extraColumns), [props.extraColumns]);
|
|
23
|
-
const extraCols = useMemo(() => {
|
|
24
|
-
if (props.extraColumns) {
|
|
25
|
-
return props.extraColumns.filter((col) => col !== undefined);
|
|
26
|
-
}
|
|
27
|
-
else {
|
|
28
|
-
return [];
|
|
29
|
-
}
|
|
30
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
31
|
-
}, [serializedExtraColumns]); // Use the serialized version as a dependency
|
|
32
|
-
/***************************** filtered items *******************************/
|
|
33
|
-
const filteredItems = useMemo(() => {
|
|
34
|
-
if (!tBrandFilter) {
|
|
35
|
-
return props.brandList;
|
|
36
|
-
}
|
|
37
|
-
let filteredList = props.brandList;
|
|
38
|
-
if (tBrandFilter.filterMatches) {
|
|
39
|
-
filteredList = props.brandList.filter((item) => tBrandFilter.filterMatches(item, tBrandFilter.filter));
|
|
40
|
-
}
|
|
41
|
-
extraCols.forEach((col) => {
|
|
42
|
-
if (col?.filter) {
|
|
43
|
-
filteredList = filteredList.filter((item) => col.filter?.filterMatches(item, col.filter.filter));
|
|
44
|
-
}
|
|
45
|
-
});
|
|
46
|
-
// tBrandFilter.filterEvent?.(filteredList)
|
|
47
|
-
return filteredList;
|
|
48
|
-
}, [tBrandFilter, props.brandList, extraCols]);
|
|
49
|
-
/****************************************************************************/
|
|
50
|
-
const defaultHeader = 'Name';
|
|
51
|
-
const columnHelper = createColumnHelper();
|
|
52
|
-
const defaultColumns = [
|
|
53
|
-
columnHelper.accessor((row) => row.name, {
|
|
54
|
-
header: defaultHeader,
|
|
55
|
-
cell: (info) => (React.createElement("div", { style: { fontWeight: 'bold' } }, info.getValue())),
|
|
56
|
-
footer: (info) => info.column.id,
|
|
57
|
-
}),
|
|
58
|
-
];
|
|
59
|
-
const columns = [...defaultColumns];
|
|
60
|
-
extraCols.forEach((col) => {
|
|
61
|
-
if (col) {
|
|
62
|
-
columns.push(col.column);
|
|
63
|
-
}
|
|
64
|
-
});
|
|
65
|
-
const onClick = (cell, index) => () => {
|
|
66
|
-
if (props.onClick) {
|
|
67
|
-
props.onClick?.(cell, index);
|
|
68
|
-
}
|
|
69
|
-
else {
|
|
70
|
-
console.log(`Clicked item index: ${index}`);
|
|
71
|
-
}
|
|
72
|
-
};
|
|
73
|
-
function displayHeader(header) {
|
|
74
|
-
let filter = React.createElement("div", null);
|
|
75
|
-
if (header.id === defaultHeader) {
|
|
76
|
-
if (tBrandFilter) {
|
|
77
|
-
filter = (React.createElement("div", { style: { width: '100%' } },
|
|
78
|
-
React.createElement(ItemFilter, { itemFilter: tBrandFilter })));
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
else {
|
|
82
|
-
extraCols.forEach((col) => {
|
|
83
|
-
if (col && header.id === col.column.header) {
|
|
84
|
-
filter = col.filter ? (React.createElement("div", { style: { width: '100%' } },
|
|
85
|
-
React.createElement(ItemFilter, { itemFilter: col.filter }))) : (React.createElement("div", null));
|
|
86
|
-
}
|
|
87
|
-
});
|
|
88
|
-
}
|
|
89
|
-
return filter;
|
|
90
|
-
}
|
|
91
|
-
const table = useReactTable({
|
|
92
|
-
data: filteredItems,
|
|
93
|
-
columns,
|
|
94
|
-
getCoreRowModel: getCoreRowModel(),
|
|
95
|
-
getFilteredRowModel: getFilteredRowModel(),
|
|
96
|
-
});
|
|
97
|
-
const paginatedRows = table.getRowModel().rows;
|
|
98
|
-
const renderRows = React.useCallback((rows) => {
|
|
99
|
-
function displayBody(cell) {
|
|
100
|
-
let cellContent = React.createElement("div", null);
|
|
101
|
-
const cll = cell.getValue();
|
|
102
|
-
if (cell.column.columnDef.header === defaultHeader) {
|
|
103
|
-
cellContent = (React.createElement(TableCell, { style: { backgroundColor: 'white', padding: 2 }, key: cell.id },
|
|
104
|
-
React.createElement(Button, { onClick: onClick(cell, cell.row.index) }, props.renderItem
|
|
105
|
-
? props.renderItem(cll)
|
|
106
|
-
: flexRender(cell.column.columnDef.cell, cell.getContext()))));
|
|
107
|
-
}
|
|
108
|
-
else {
|
|
109
|
-
cellContent = (React.createElement(TableCell, { style: { backgroundColor: 'white', padding: 2 }, key: cell.id }, props.renderItem ? props.renderItem(cll) : React.createElement("div", null, cll)));
|
|
110
|
-
}
|
|
111
|
-
return cellContent;
|
|
112
|
-
}
|
|
113
|
-
return rows.map((row) => (React.createElement(TableRow, { key: row.id }, row.getVisibleCells().map((cell) => {
|
|
114
|
-
// console.log(`cell: ${JSON.stringify(cell, null)}`)
|
|
115
|
-
return displayBody(cell);
|
|
116
|
-
}))));
|
|
117
|
-
}, [onClick, props]);
|
|
118
|
-
return (React.createElement(TableContainer, { "data-testid": "frame.select-TableContainer", style: props.style },
|
|
119
|
-
React.createElement(Table, { stickyHeader: true, "aria-label": "sticky table" },
|
|
120
|
-
React.createElement(TableHead, null, table.getHeaderGroups().map((headerGroup) => (React.createElement(TableRow, { key: headerGroup.id, "data-testid": headerGroup.id }, headerGroup.headers.map((header) => (React.createElement(TableCell, { key: header.id }, displayHeader(header)))))))),
|
|
121
|
-
React.createElement(TableBody, { "data-testid": "table.list-of-brands" }, renderRows(paginatedRows)))));
|
|
4
|
+
return (React.createElement(ItemList, { itemList: props.brandList, onClick: props.onClick, renderItem: props.renderItem, extraColumns: props.extraColumns, style: props.style, backgroundColor: "yellow", scrollbarWidth: 50, height: 300, placeholder: "Brands" }));
|
|
122
5
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FrameList.d.ts","sourceRoot":"","sources":["../../src/components/FrameList.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"FrameList.d.ts","sourceRoot":"","sources":["../../src/components/FrameList.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,uBAAuB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAC5B,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAGpC,wBAAgB,SAAS,CAAC,KAAK,EAAE;IAC/B,SAAS,EAAE,SAAS,EAAE,CAAC;IACvB,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAClE,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,KAAK,CAAC,SAAS,CAAC;IAC/C,YAAY,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;IACpC,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B,GAAG,GAAG,CAAC,OAAO,CAcd"}
|
|
@@ -1,122 +1,5 @@
|
|
|
1
|
-
import { TableContainer, Table, TableHead, TableRow, TableCell, TableBody, Button, } from '@mui/material';
|
|
2
|
-
import { useReactTable, getCoreRowModel, getFilteredRowModel, createColumnHelper, flexRender, } from '@tanstack/react-table';
|
|
3
|
-
import ItemFilter from './ItemFilter';
|
|
4
|
-
import { useMemo, useState, useCallback } from 'react';
|
|
5
1
|
import React from 'react';
|
|
2
|
+
import { ItemList } from './ItemList';
|
|
6
3
|
export function FrameList(props) {
|
|
7
|
-
|
|
8
|
-
const [filter, setFilter] = useState('');
|
|
9
|
-
const filterMatches = useCallback((item, fltr) => {
|
|
10
|
-
const match = item.name
|
|
11
|
-
.toLowerCase()
|
|
12
|
-
.includes(fltr ? fltr.toLowerCase() : '');
|
|
13
|
-
return match;
|
|
14
|
-
}, []);
|
|
15
|
-
const tFrameFilter = useMemo(() => ({
|
|
16
|
-
property: 'name',
|
|
17
|
-
filter,
|
|
18
|
-
setFilter,
|
|
19
|
-
filterMatches,
|
|
20
|
-
placeholder: 'Frames',
|
|
21
|
-
}), [filter, filterMatches]);
|
|
22
|
-
const serializedExtraColumns = useMemo(() => JSON.stringify(props.extraColumns), [props.extraColumns]);
|
|
23
|
-
const extraCols = useMemo(() => {
|
|
24
|
-
if (props.extraColumns) {
|
|
25
|
-
return props.extraColumns.filter((col) => col !== undefined);
|
|
26
|
-
}
|
|
27
|
-
else {
|
|
28
|
-
return [];
|
|
29
|
-
}
|
|
30
|
-
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
31
|
-
}, [serializedExtraColumns]); // Use the serialized version as a dependency
|
|
32
|
-
/***************************** filtered items *******************************/
|
|
33
|
-
const filteredItems = useMemo(() => {
|
|
34
|
-
if (!tFrameFilter) {
|
|
35
|
-
return props.frameList;
|
|
36
|
-
}
|
|
37
|
-
let filteredList = props.frameList;
|
|
38
|
-
if (tFrameFilter.filterMatches) {
|
|
39
|
-
filteredList = props.frameList.filter((item) => tFrameFilter.filterMatches(item, tFrameFilter.filter));
|
|
40
|
-
}
|
|
41
|
-
extraCols.forEach((col) => {
|
|
42
|
-
if (col?.filter) {
|
|
43
|
-
filteredList = filteredList.filter((item) => col.filter?.filterMatches(item, col.filter.filter));
|
|
44
|
-
}
|
|
45
|
-
});
|
|
46
|
-
// tBrandFilter.filterEvent?.(filteredList)
|
|
47
|
-
return filteredList;
|
|
48
|
-
}, [tFrameFilter, props.frameList, extraCols]);
|
|
49
|
-
/****************************************************************************/
|
|
50
|
-
const defaultHeader = 'Name';
|
|
51
|
-
const columnHelper = createColumnHelper();
|
|
52
|
-
const defaultColumns = [
|
|
53
|
-
columnHelper.accessor((row) => row.name, {
|
|
54
|
-
header: defaultHeader,
|
|
55
|
-
cell: (info) => (React.createElement("div", { style: { fontWeight: 'bold' } }, info.getValue())),
|
|
56
|
-
footer: (info) => info.column.id,
|
|
57
|
-
}),
|
|
58
|
-
];
|
|
59
|
-
const columns = [...defaultColumns];
|
|
60
|
-
extraCols.forEach((col) => {
|
|
61
|
-
if (col) {
|
|
62
|
-
columns.push(col.column);
|
|
63
|
-
}
|
|
64
|
-
});
|
|
65
|
-
const onClick = (cell, index) => () => {
|
|
66
|
-
if (props.onClick) {
|
|
67
|
-
props.onClick?.(cell, index);
|
|
68
|
-
}
|
|
69
|
-
else {
|
|
70
|
-
console.log(`Clicked item index: ${index}`);
|
|
71
|
-
}
|
|
72
|
-
};
|
|
73
|
-
function displayHeader(header) {
|
|
74
|
-
let filter = React.createElement("div", null);
|
|
75
|
-
if (header.id === defaultHeader) {
|
|
76
|
-
if (tFrameFilter) {
|
|
77
|
-
filter = (React.createElement("div", { style: { width: '100%' } },
|
|
78
|
-
React.createElement(ItemFilter, { itemFilter: tFrameFilter })));
|
|
79
|
-
}
|
|
80
|
-
}
|
|
81
|
-
else {
|
|
82
|
-
extraCols.forEach((col) => {
|
|
83
|
-
if (col && header.id === col.column.header) {
|
|
84
|
-
filter = col.filter ? (React.createElement("div", { style: { width: '100%' } },
|
|
85
|
-
React.createElement(ItemFilter, { itemFilter: col.filter }))) : (React.createElement("div", null));
|
|
86
|
-
}
|
|
87
|
-
});
|
|
88
|
-
}
|
|
89
|
-
return filter;
|
|
90
|
-
}
|
|
91
|
-
const table = useReactTable({
|
|
92
|
-
data: filteredItems,
|
|
93
|
-
columns,
|
|
94
|
-
getCoreRowModel: getCoreRowModel(),
|
|
95
|
-
getFilteredRowModel: getFilteredRowModel(),
|
|
96
|
-
});
|
|
97
|
-
const paginatedRows = table.getRowModel().rows;
|
|
98
|
-
const renderRows = React.useCallback((rows) => {
|
|
99
|
-
function displayBody(cell) {
|
|
100
|
-
let cellContent = React.createElement("div", null);
|
|
101
|
-
const cll = cell.getValue();
|
|
102
|
-
if (cell.column.columnDef.header === defaultHeader) {
|
|
103
|
-
cellContent = (React.createElement(TableCell, { style: { backgroundColor: 'white', padding: 2 }, key: cell.id },
|
|
104
|
-
React.createElement(Button, { onClick: onClick(cell, cell.row.index) }, props.renderItem
|
|
105
|
-
? props.renderItem(cll)
|
|
106
|
-
: flexRender(cell.column.columnDef.cell, cell.getContext()))));
|
|
107
|
-
}
|
|
108
|
-
else {
|
|
109
|
-
cellContent = (React.createElement(TableCell, { style: { backgroundColor: 'white', padding: 2 }, key: cell.id }, props.renderItem ? props.renderItem(cll) : React.createElement("div", null, cll)));
|
|
110
|
-
}
|
|
111
|
-
return cellContent;
|
|
112
|
-
}
|
|
113
|
-
return rows.map((row) => (React.createElement(TableRow, { key: row.id }, row.getVisibleCells().map((cell) => {
|
|
114
|
-
// console.log(`cell: ${JSON.stringify(cell, null)}`)
|
|
115
|
-
return displayBody(cell);
|
|
116
|
-
}))));
|
|
117
|
-
}, [onClick, props]);
|
|
118
|
-
return (React.createElement(TableContainer, { "data-testid": "frame.select-TableContainer", style: props.style },
|
|
119
|
-
React.createElement(Table, { stickyHeader: true, "aria-label": "sticky table" },
|
|
120
|
-
React.createElement(TableHead, null, table.getHeaderGroups().map((headerGroup) => (React.createElement(TableRow, { key: headerGroup.id, "data-testid": headerGroup.id }, headerGroup.headers.map((header) => (React.createElement(TableCell, { key: header.id }, displayHeader(header)))))))),
|
|
121
|
-
React.createElement(TableBody, { "data-testid": "table.list-of-frames" }, renderRows(paginatedRows)))));
|
|
4
|
+
return (React.createElement(ItemList, { itemList: props.frameList, onClick: props.onClick, renderItem: props.renderItem, extraColumns: props.extraColumns, style: props.style }));
|
|
122
5
|
}
|
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
import { Cell } from '@tanstack/react-table';
|
|
2
|
-
import {
|
|
2
|
+
import { TColumn, TItem } from './itemTypes';
|
|
3
3
|
import { JSX } from 'react';
|
|
4
4
|
import React from 'react';
|
|
5
|
-
interface ItemListProps<T> {
|
|
5
|
+
export interface ItemListProps<T extends TItem> {
|
|
6
6
|
itemList: T[];
|
|
7
|
+
onClick?: (cell: Cell<T, unknown>, index: number) => void;
|
|
7
8
|
renderItem?: (item: string) => React.ReactNode;
|
|
8
|
-
itemFilter?: TItemFilter<T>;
|
|
9
|
-
clickFunc?: (item: Cell<T, unknown>) => void;
|
|
10
9
|
extraColumns?: TColumn<T>[];
|
|
11
10
|
style?: React.CSSProperties;
|
|
11
|
+
backgroundColor?: string;
|
|
12
|
+
scrollbarWidth?: number;
|
|
13
|
+
height?: number | string;
|
|
14
|
+
placeholder?: string;
|
|
12
15
|
}
|
|
13
|
-
declare function ItemList<T extends
|
|
14
|
-
name: string;
|
|
15
|
-
}>({ itemList, renderItem, itemFilter, clickFunc, extraColumns, style, }: ItemListProps<T>): JSX.Element;
|
|
16
|
-
export default ItemList;
|
|
16
|
+
export declare function ItemList<T extends TItem>(props: ItemListProps<T>): JSX.Element;
|
|
17
17
|
//# sourceMappingURL=ItemList.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ItemList.d.ts","sourceRoot":"","sources":["../../src/components/ItemList.tsx"],"names":[],"mappings":"AASA,OAAO,EAIL,IAAI,
|
|
1
|
+
{"version":3,"file":"ItemList.d.ts","sourceRoot":"","sources":["../../src/components/ItemList.tsx"],"names":[],"mappings":"AASA,OAAO,EAIL,IAAI,EAKL,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAe,OAAO,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,GAAG,EAA6C,MAAM,OAAO,CAAC;AACvE,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,MAAM,WAAW,aAAa,CAAC,CAAC,SAAS,KAAK;IAC5C,QAAQ,EAAE,CAAC,EAAE,CAAC;IACd,OAAO,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1D,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,KAAK,CAAC,SAAS,CAAC;IAC/C,YAAY,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5B,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;IAC5B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,QAAQ,CAAC,CAAC,SAAS,KAAK,EACtC,KAAK,EAAE,aAAa,CAAC,CAAC,CAAC,GACtB,GAAG,CAAC,OAAO,CA4Qb"}
|
|
@@ -1,19 +1,56 @@
|
|
|
1
1
|
import { TableContainer, Table, TableHead, TableRow, TableCell, TableBody, Button, } from '@mui/material';
|
|
2
|
-
import { useReactTable, getCoreRowModel, getFilteredRowModel, createColumnHelper, } from '@tanstack/react-table';
|
|
2
|
+
import { useReactTable, getCoreRowModel, getFilteredRowModel, createColumnHelper, flexRender, } from '@tanstack/react-table';
|
|
3
3
|
import ItemFilter from './ItemFilter';
|
|
4
|
-
import { useMemo } from 'react';
|
|
4
|
+
import { useMemo, useState, useCallback } from 'react';
|
|
5
5
|
import React from 'react';
|
|
6
|
-
function ItemList(
|
|
7
|
-
|
|
6
|
+
export function ItemList(props) {
|
|
7
|
+
'use no memo'; // For React Compiler compatibility with TanStack Table
|
|
8
|
+
const { itemList, backgroundColor = 'lightgrey', scrollbarWidth = 50, height = 300, placeholder = 'Items', } = props;
|
|
9
|
+
const scrollbarStyles = {
|
|
10
|
+
'&::-webkit-scrollbar': {
|
|
11
|
+
width: `${scrollbarWidth}px`,
|
|
12
|
+
backgroundColor: 'transparent',
|
|
13
|
+
},
|
|
14
|
+
'&::-webkit-scrollbar-track': {
|
|
15
|
+
backgroundColor: '#f1f1f1',
|
|
16
|
+
margin: '2px',
|
|
17
|
+
},
|
|
18
|
+
'&::-webkit-scrollbar-thumb': {
|
|
19
|
+
backgroundColor: '#888',
|
|
20
|
+
borderRadius: '10px',
|
|
21
|
+
border: '2px solid transparent',
|
|
22
|
+
backgroundClip: 'content-box',
|
|
23
|
+
},
|
|
24
|
+
'&::-webkit-scrollbar-thumb:hover': {
|
|
25
|
+
backgroundColor: '#555',
|
|
26
|
+
},
|
|
27
|
+
scrollbarGutter: 'stable',
|
|
28
|
+
};
|
|
29
|
+
const [filter, setFilter] = useState('');
|
|
30
|
+
const filterMatches = useCallback((item, fltr) => {
|
|
31
|
+
const match = item.name
|
|
32
|
+
.toLowerCase()
|
|
33
|
+
.includes(fltr ? fltr.toLowerCase() : '');
|
|
34
|
+
return match;
|
|
35
|
+
}, []);
|
|
36
|
+
const itemFilter = useMemo(() => ({
|
|
37
|
+
property: 'name',
|
|
38
|
+
filter,
|
|
39
|
+
setFilter,
|
|
40
|
+
filterMatches,
|
|
41
|
+
placeholder,
|
|
42
|
+
}), [filter, filterMatches, placeholder]);
|
|
43
|
+
const serializedExtraColumns = useMemo(() => JSON.stringify(props.extraColumns), [props.extraColumns]);
|
|
8
44
|
const extraCols = useMemo(() => {
|
|
9
|
-
if (extraColumns) {
|
|
10
|
-
return extraColumns.filter((col) => col !== undefined);
|
|
45
|
+
if (props.extraColumns) {
|
|
46
|
+
return props.extraColumns.filter((col) => col !== undefined);
|
|
11
47
|
}
|
|
12
48
|
else {
|
|
13
49
|
return [];
|
|
14
50
|
}
|
|
15
51
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
16
|
-
}, [serializedExtraColumns]);
|
|
52
|
+
}, [serializedExtraColumns]);
|
|
53
|
+
/***************************** filtered items *******************************/
|
|
17
54
|
const filteredItems = useMemo(() => {
|
|
18
55
|
if (!itemFilter) {
|
|
19
56
|
return itemList;
|
|
@@ -27,14 +64,9 @@ function ItemList({ itemList, renderItem, itemFilter, clickFunc, extraColumns =
|
|
|
27
64
|
filteredList = filteredList.filter((item) => col.filter?.filterMatches(item, col.filter.filter));
|
|
28
65
|
}
|
|
29
66
|
});
|
|
30
|
-
// itemFilter.filterEvent?.(filteredList)
|
|
31
67
|
return filteredList;
|
|
32
68
|
}, [itemFilter, itemList, extraCols]);
|
|
33
|
-
|
|
34
|
-
if (clickFunc) {
|
|
35
|
-
clickFunc(cell);
|
|
36
|
-
}
|
|
37
|
-
}
|
|
69
|
+
/****************************************************************************/
|
|
38
70
|
const defaultHeader = 'Name';
|
|
39
71
|
const columnHelper = createColumnHelper();
|
|
40
72
|
const defaultColumns = [
|
|
@@ -42,6 +74,9 @@ function ItemList({ itemList, renderItem, itemFilter, clickFunc, extraColumns =
|
|
|
42
74
|
header: defaultHeader,
|
|
43
75
|
cell: (info) => (React.createElement("div", { style: { fontWeight: 'bold' } }, info.getValue())),
|
|
44
76
|
footer: (info) => info.column.id,
|
|
77
|
+
size: 150,
|
|
78
|
+
minSize: 100,
|
|
79
|
+
maxSize: 300,
|
|
45
80
|
}),
|
|
46
81
|
];
|
|
47
82
|
const columns = [...defaultColumns];
|
|
@@ -50,6 +85,14 @@ function ItemList({ itemList, renderItem, itemFilter, clickFunc, extraColumns =
|
|
|
50
85
|
columns.push(col.column);
|
|
51
86
|
}
|
|
52
87
|
});
|
|
88
|
+
const onClick = useCallback((cell, index) => () => {
|
|
89
|
+
if (props.onClick) {
|
|
90
|
+
props.onClick(cell, index);
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
console.log(`Clicked item index: ${index}`);
|
|
94
|
+
}
|
|
95
|
+
}, [props]);
|
|
53
96
|
function displayHeader(header) {
|
|
54
97
|
let filter = React.createElement("div", null);
|
|
55
98
|
if (header.id === defaultHeader) {
|
|
@@ -68,30 +111,67 @@ function ItemList({ itemList, renderItem, itemFilter, clickFunc, extraColumns =
|
|
|
68
111
|
}
|
|
69
112
|
return filter;
|
|
70
113
|
}
|
|
71
|
-
function displayBody(cell) {
|
|
72
|
-
let cellContent = React.createElement("div", null);
|
|
73
|
-
const cll = cell.getValue();
|
|
74
|
-
if (cell.column.columnDef.header === defaultHeader) {
|
|
75
|
-
cellContent = (React.createElement(TableCell, { style: { backgroundColor: 'white', padding: 2 }, key: cell.id },
|
|
76
|
-
React.createElement(Button, { onClick: () => handleItemClick(cell) }, renderItem ? renderItem(cll) : React.createElement("div", null, cll))));
|
|
77
|
-
}
|
|
78
|
-
else {
|
|
79
|
-
cellContent = (React.createElement(TableCell, { style: { backgroundColor: 'white', padding: 2 }, key: cell.id }, renderItem ? renderItem(cll) : React.createElement("div", null, cll)));
|
|
80
|
-
}
|
|
81
|
-
return cellContent;
|
|
82
|
-
}
|
|
83
114
|
const table = useReactTable({
|
|
84
115
|
data: filteredItems,
|
|
85
116
|
columns,
|
|
86
117
|
getCoreRowModel: getCoreRowModel(),
|
|
87
118
|
getFilteredRowModel: getFilteredRowModel(),
|
|
119
|
+
columnResizeMode: 'onChange',
|
|
120
|
+
enableColumnResizing: true,
|
|
121
|
+
defaultColumn: {
|
|
122
|
+
size: 100,
|
|
123
|
+
minSize: 50,
|
|
124
|
+
maxSize: 500,
|
|
125
|
+
},
|
|
88
126
|
});
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
127
|
+
const paginatedRows = table.getRowModel().rows;
|
|
128
|
+
const renderRows = React.useCallback((rows, bgColor = backgroundColor) => {
|
|
129
|
+
function displayBody(cell) {
|
|
130
|
+
let cellContent = React.createElement("div", null);
|
|
131
|
+
const cll = cell.getValue();
|
|
132
|
+
if (cell.column.columnDef.header === defaultHeader) {
|
|
133
|
+
cellContent = (React.createElement(TableCell, { style: { backgroundColor: bgColor, padding: 2 }, key: cell.id },
|
|
134
|
+
React.createElement(Button, { onClick: onClick(cell, cell.row.index) }, props.renderItem
|
|
135
|
+
? props.renderItem(cll)
|
|
136
|
+
: flexRender(cell.column.columnDef.cell, cell.getContext()))));
|
|
137
|
+
}
|
|
138
|
+
else {
|
|
139
|
+
cellContent = (React.createElement(TableCell, { style: { backgroundColor: bgColor, padding: 2 }, key: cell.id }, props.renderItem ? props.renderItem(cll) : React.createElement("div", null, cll)));
|
|
140
|
+
}
|
|
141
|
+
return cellContent;
|
|
142
|
+
}
|
|
143
|
+
return rows.map((row) => (React.createElement(TableRow, { key: row.id }, row.getVisibleCells().map((cell) => {
|
|
144
|
+
return displayBody(cell);
|
|
145
|
+
}))));
|
|
146
|
+
}, [backgroundColor, onClick, props]);
|
|
147
|
+
return (React.createElement("div", { style: {
|
|
148
|
+
height,
|
|
149
|
+
overflow: 'hidden',
|
|
150
|
+
backgroundColor,
|
|
151
|
+
width: '100%',
|
|
152
|
+
minWidth: 200,
|
|
153
|
+
boxSizing: 'border-box',
|
|
154
|
+
} },
|
|
155
|
+
React.createElement(TableContainer, { "data-testid": "item-list-TableContainer", style: {
|
|
156
|
+
height,
|
|
157
|
+
minWidth: 200,
|
|
158
|
+
overflow: 'auto',
|
|
159
|
+
backgroundColor,
|
|
160
|
+
width: '100%',
|
|
161
|
+
boxSizing: 'border-box',
|
|
162
|
+
...props.style,
|
|
163
|
+
}, sx: scrollbarStyles },
|
|
164
|
+
React.createElement(Table, { stickyHeader: true, "aria-label": "sticky table", sx: {
|
|
165
|
+
backgroundColor,
|
|
166
|
+
width: '100%',
|
|
167
|
+
minWidth: 200,
|
|
168
|
+
tableLayout: 'fixed',
|
|
169
|
+
} },
|
|
170
|
+
React.createElement(TableHead, { sx: { backgroundColor } }, table.getHeaderGroups().map((headerGroup) => (React.createElement(TableRow, { key: headerGroup.id, "data-testid": headerGroup.id }, headerGroup.headers.map((header) => (React.createElement(TableCell, { key: header.id, sx: {
|
|
171
|
+
backgroundColor,
|
|
172
|
+
width: header.id === defaultHeader ? 150 : 'auto',
|
|
173
|
+
minWidth: header.id === defaultHeader ? 100 : 50,
|
|
174
|
+
maxWidth: header.id === defaultHeader ? 300 : 'none',
|
|
175
|
+
} }, displayHeader(header)))))))),
|
|
176
|
+
React.createElement(TableBody, { "data-testid": "table.list-of-items", sx: { backgroundColor } }, renderRows(paginatedRows, backgroundColor))))));
|
|
96
177
|
}
|
|
97
|
-
export default ItemList;
|
|
@@ -4,9 +4,10 @@ export type TBrandObj = {
|
|
|
4
4
|
description: string;
|
|
5
5
|
};
|
|
6
6
|
export type TFrameObj = {
|
|
7
|
+
frame: string;
|
|
7
8
|
name: string;
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
9
|
+
width: string;
|
|
10
|
+
height: string;
|
|
11
|
+
rest: string;
|
|
11
12
|
};
|
|
12
13
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/components/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AACF,MAAM,MAAM,SAAS,GAAG;IACtB,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/components/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,SAAS,GAAG;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;CACrB,CAAC;AACF,MAAM,MAAM,SAAS,GAAG;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd,CAAC"}
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export {
|
|
1
|
+
export { ItemList } from './components/ItemList';
|
|
2
2
|
export type { TColumn, TItem, TItemFilter } from './components/itemTypes';
|
|
3
3
|
export { BrandList } from './components/BrandList';
|
|
4
4
|
export { FrameList } from './components/FrameList';
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,YAAY,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1E,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,OAAO,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAC;AACnD,YAAY,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC"}
|
package/dist/index.js
CHANGED