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 CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"App.d.ts","sourceRoot":"","sources":["../src/App.tsx"],"names":[],"mappings":"AACA,OAAO,WAAW,CAAC;AAInB,OAAO,KAAK,MAAM,OAAO,CAAC;AAU1B,iBAAS,GAAG,sBA4KX;AAED,eAAe,GAAG,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 = frames.find((b) => b.brand === brand);
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
- id: frame,
111
+ frame,
89
112
  name: frame.substring(18, 23),
90
- length: parseInt(frame.substring(23, 25)),
91
- width: parseInt(frame.substring(25, 27)),
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.length.toString(), {
109
- header: 'length',
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, index) => {
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":"AASA,OAAO,EAIL,IAAI,EAKL,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAe,OAAO,EAAS,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,GAAG,EAA6C,MAAM,OAAO,CAAC;AACvE,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEpC,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,CA8Ld"}
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
- 'use no memo'; // For React Compiler compatibility with TanStack Table
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":"AASA,OAAO,EAIL,IAAI,EAKL,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAe,OAAO,EAAS,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,GAAG,EAA6C,MAAM,OAAO,CAAC;AACvE,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEpC,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,CA8Ld"}
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
- 'use no memo'; // For React Compiler compatibility with TanStack Table
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 { TItemFilter, TColumn } from './itemTypes';
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,EAGL,MAAM,uBAAuB,CAAC;AAE/B,OAAO,EAAE,WAAW,EAAE,OAAO,EAAS,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,GAAG,EAAsB,MAAM,OAAO,CAAC;AAChD,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,UAAU,aAAa,CAAC,CAAC;IACvB,QAAQ,EAAE,CAAC,EAAE,CAAC;IACd,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,KAAK,CAAC,SAAS,CAAC;IAC/C,UAAU,CAAC,EAAE,WAAW,CAAC,CAAC,CAAC,CAAC;IAC5B,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;IAC7C,YAAY,CAAC,EAAE,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5B,KAAK,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC;CAC7B;AAED,iBAAS,QAAQ,CAAC,CAAC,SAAS;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,EAAE,EAC5C,QAAQ,EACR,UAAU,EACV,UAAU,EACV,SAAS,EACT,YAAiB,EACjB,KAA8D,GAC/D,EAAE,aAAa,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,OAAO,CAsJhC;AAED,eAAe,QAAQ,CAAC"}
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({ itemList, renderItem, itemFilter, clickFunc, extraColumns = [], style = { height: '500px', overflowY: 'auto', width: '400px' }, }) {
7
- const serializedExtraColumns = useMemo(() => JSON.stringify(extraColumns), [extraColumns]);
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]); // Use the serialized version as a dependency
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
- function handleItemClick(cell) {
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
- return (React.createElement(TableContainer, { "data-testid": "frame.select-TableContainer", style: style },
90
- React.createElement(Table, { stickyHeader: true, "aria-label": "sticky table" },
91
- 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)))))))),
92
- React.createElement(TableBody, null, table.getRowModel().rows.map((row) => (React.createElement(TableRow, { key: row.id }, row.getVisibleCells().map((cell) => {
93
- // console.log(`cell: ${JSON.stringify(cell, null)}`)
94
- return displayBody(cell);
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
- length: number;
9
- width: number;
10
- id: string;
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,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,EAAE,EAAE,MAAM,CAAC;CACZ,CAAC"}
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 { default as ItemList } from './components/ItemList';
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';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AAC5D,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"}
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
@@ -1,3 +1,3 @@
1
- export { default as ItemList } from './components/ItemList';
1
+ export { ItemList } from './components/ItemList';
2
2
  export { BrandList } from './components/BrandList';
3
3
  export { FrameList } from './components/FrameList';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "frame.select",
3
- "version": "1.1.4",
3
+ "version": "1.2.1",
4
4
  "description": "A React component for selecting items from a list with a search bar.",
5
5
  "license": "MIT",
6
6
  "type": "module",