tp-react-elements 1.0.3 → 1.1.0

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.
Files changed (25) hide show
  1. package/dist/_virtual/index.esm13.js +2 -2
  2. package/dist/_virtual/index.esm14.js +2 -2
  3. package/dist/_virtual/index.esm4.js +2 -2
  4. package/dist/_virtual/index.esm5.js +2 -2
  5. package/dist/_virtual/index.esm6.js +2 -2
  6. package/dist/_virtual/index.esm7.js +2 -2
  7. package/dist/components/Form/FormRender.esm.js +6 -2
  8. package/dist/components/Form/FormRenderWrapper.esm.js +2 -2
  9. package/dist/components/FormComponents/Select/MultiSelectTable.d.ts +6 -0
  10. package/dist/components/FormComponents/Select/MultiSelectTable.esm.js +310 -0
  11. package/dist/components/FormComponents/Select/MultiSelectv1.esm.js +39 -37
  12. package/dist/components/FormComponents/index.d.ts +1 -0
  13. package/dist/components/FormComponents/index.esm.js +1 -0
  14. package/dist/components/SelectField/MultiSelectFieldComponent.esm.js +5 -5
  15. package/dist/node_modules/react-date-range/dist/components/Calendar/index.esm.js +3 -3
  16. package/dist/node_modules/react-date-range/dist/components/DateInput/index.esm.js +3 -3
  17. package/dist/node_modules/react-date-range/dist/components/DateRange/index.esm.js +3 -3
  18. package/dist/node_modules/react-date-range/dist/components/DateRangePicker/index.esm.js +3 -3
  19. package/dist/node_modules/react-date-range/dist/components/DayCell/index.esm.js +2 -2
  20. package/dist/node_modules/react-date-range/dist/components/DefinedRange/index.esm.js +3 -3
  21. package/dist/node_modules/react-date-range/dist/components/InputRangeField/index.esm.js +2 -2
  22. package/dist/node_modules/react-date-range/dist/components/Month/index.esm.js +3 -3
  23. package/dist/node_modules/react-list/react-list.esm.js +2 -2
  24. package/dist/utils/Interface/FormInterface.d.ts +11 -1
  25. package/package.json +6 -1
@@ -1,3 +1,3 @@
1
- var DateInput = {};
1
+ var Month = {};
2
2
 
3
- export { DateInput as __exports };
3
+ export { Month as __exports };
@@ -1,3 +1,3 @@
1
- var Month = {};
1
+ var DateInput = {};
2
2
 
3
- export { Month as __exports };
3
+ export { DateInput as __exports };
@@ -1,3 +1,3 @@
1
- var DateRange = {};
1
+ var DateRangePicker = {};
2
2
 
3
- export { DateRange as __exports };
3
+ export { DateRangePicker as __exports };
@@ -1,3 +1,3 @@
1
- var DefinedRange = {};
1
+ var Calendar = {};
2
2
 
3
- export { DefinedRange as __exports };
3
+ export { Calendar as __exports };
@@ -1,3 +1,3 @@
1
- var Calendar = {};
1
+ var DateRange = {};
2
2
 
3
- export { Calendar as __exports };
3
+ export { DateRange as __exports };
@@ -1,3 +1,3 @@
1
- var DateRangePicker = {};
1
+ var DefinedRange = {};
2
2
 
3
- export { DateRangePicker as __exports };
3
+ export { DefinedRange as __exports };
@@ -1,5 +1,5 @@
1
1
  import { jsx, Fragment } from 'react/jsx-runtime';
2
- import React__default, { lazy, Suspense } from 'react';
2
+ import require$$0__default, { lazy, Suspense } from 'react';
3
3
  import FormCheckBox from '../FormComponents/FormCheckBox/FormCheckBox.esm.js';
4
4
  import FormCheckBoxGroup from '../FormComponents/FormCheckBoxGroup/FormCheckBoxGroup.esm.js';
5
5
  import FormNumberField from '../FormComponents/FormNumberField/FormNumberField.esm.js';
@@ -22,6 +22,7 @@ import SingleSelectSearchApi from '../FormComponents/Select/SingleSelectSearchAp
22
22
  // import('../RichTextEditor').then((m) => ({ default: m.RichTextEditorWrapper }))
23
23
  // );
24
24
  const MultiSelectV1 = lazy(() => import('../FormComponents/Select/MultiSelectv1.esm.js'));
25
+ const MultiSelectTable = lazy(() => import('../FormComponents/Select/MultiSelectTable.esm.js'));
25
26
  const FormRenderFileUpload = lazy(() => import('../FileUpload/index.esm.js').then((m) => ({ default: m.FormRenderFileUpload })));
26
27
  const FormRenderMultiFileUpload = lazy(() => import('../FileUpload/index.esm.js').then((m) => ({ default: m.FormRenderMultiFileUpload })));
27
28
  const MultiFileWithPreview = lazy(() => import('../FileUpload/index.esm.js').then((m) => ({ default: m.MultiFileWithPreview })));
@@ -118,6 +119,9 @@ const RenderForm = (props) => {
118
119
  // Multi-select dropdown
119
120
  case 'multiselect':
120
121
  return (jsx(Suspense, { fallback: jsx(LoadingFallback, {}), children: jsx(MultiSelectV1, { props: props, variant: variant }) }));
122
+ // Multi-select with table dropdown
123
+ case 'multiselect-table':
124
+ return (jsx(Suspense, { fallback: jsx(LoadingFallback, {}), children: jsx(MultiSelectTable, { props: props, variant: variant }) }));
121
125
  // Single file upload
122
126
  case 'file':
123
127
  return (jsx(Suspense, { fallback: jsx(LoadingFallback, {}), children: jsx(FormRenderFileUpload, { props: props, variant: variant }) }));
@@ -151,6 +155,6 @@ const RenderForm = (props) => {
151
155
  *
152
156
  * @see FormRenderWrapper
153
157
  */
154
- var RenderForm$1 = React__default.memo(RenderForm);
158
+ var RenderForm$1 = require$$0__default.memo(RenderForm);
155
159
 
156
160
  export { RenderForm$1 as default };
@@ -1,5 +1,5 @@
1
1
  import { jsx, Fragment } from 'react/jsx-runtime';
2
- import React__default from 'react';
2
+ import require$$0__default from 'react';
3
3
  import { useFormState } from 'react-hook-form';
4
4
  import { FormComponent, Formitem } from './Form.styles.esm.js';
5
5
  import RenderForm from './FormRender.esm.js';
@@ -28,6 +28,6 @@ const FormRenderWrapper = ({ formArray, name = '', numberOfColumns = 3, form, va
28
28
  * Export the FormRenderWrapper component for use in form containers
29
29
  * This component is the main entry point for rendering form fields
30
30
  */
31
- var FormRenderWrapper_default = React__default.memo(FormRenderWrapper);
31
+ var FormRenderWrapper_default = require$$0__default.memo(FormRenderWrapper);
32
32
 
33
33
  export { FormRenderWrapper_default as default };
@@ -0,0 +1,6 @@
1
+ import { FormRenderProps, VariantProps } from '../../../utils';
2
+ declare const MultiSelectTable: ({ props, variant, }: {
3
+ props: FormRenderProps;
4
+ variant: VariantProps;
5
+ }) => import("react/jsx-runtime").JSX.Element;
6
+ export default MultiSelectTable;
@@ -0,0 +1,310 @@
1
+ import { jsx, jsxs } from 'react/jsx-runtime';
2
+ import { Box, FormControl, InputLabel, Select, Tooltip, OutlinedInput, Checkbox } from '@mui/material';
3
+ import { useState, useRef, useMemo, useCallback } from 'react';
4
+ import { useWatch } from 'react-hook-form';
5
+ import FormBottomField from '../FormBottomField/FormBottomField.esm.js';
6
+ import 'dayjs';
7
+ import { renderLabel } from '../../../utils/Constants/FormConstants.esm.js';
8
+ import { useMaterialReactTable, MaterialReactTable } from 'material-react-table';
9
+
10
+ const ITEM_HEIGHT = 50;
11
+ const ITEM_PADDING_TOP = 3;
12
+ const extractValuesToArray = (inputString) => {
13
+ if (!inputString)
14
+ return [];
15
+ return inputString.split(',').map((value) => value.trim()).filter(Boolean);
16
+ };
17
+ const MultiSelectTable = ({ props, variant, }) => {
18
+ const MenuProps = {
19
+ PaperProps: {
20
+ style: {
21
+ maxHeight: ITEM_HEIGHT * 8 + ITEM_PADDING_TOP,
22
+ //width: `calc(100%/${props.item.numberOfColumns})`,
23
+ },
24
+ },
25
+ autoFocus: false,
26
+ disableAutoFocusItem: true,
27
+ };
28
+ const [globalFilter, setGlobalFilter] = useState('');
29
+ const tableRef = useRef(null);
30
+ const fieldValue = useWatch({ control: props.control, name: props.item.name });
31
+ const isError = !!props.errors?.[props.item.name];
32
+ const isShowBorderError = isError;
33
+ // Get columns and rows from form item
34
+ const columns = props.item.columns || [];
35
+ const rows = props.item.rows || [];
36
+ const valueField = props.item.valueField || 'id';
37
+ const labelField = props.item.labelField || 'name';
38
+ const headerColor = props.item.headerColor || '#00695c';
39
+ const placeholder = props.item.placeholder || 'None selected';
40
+ // Get selected rows (handles both array of objects and legacy string format)
41
+ const selectedRows = useMemo(() => {
42
+ if (!fieldValue)
43
+ return [];
44
+ // If fieldValue is already an array of objects, use it directly
45
+ if (Array.isArray(fieldValue)) {
46
+ return fieldValue;
47
+ }
48
+ // Legacy: handle comma-separated string of IDs
49
+ const ids = extractValuesToArray(fieldValue);
50
+ return rows.filter((row) => ids.includes(String(row[valueField])));
51
+ }, [fieldValue, rows, valueField]);
52
+ // Get selected values as array of IDs for checkbox state
53
+ const selectedValues = useMemo(() => {
54
+ return selectedRows.map((row) => String(row[valueField]));
55
+ }, [selectedRows, valueField]);
56
+ // Display text for selected items
57
+ const selectedDisplayText = useMemo(() => {
58
+ const labels = selectedRows.map((row) => row[labelField]);
59
+ return labels.join(', ');
60
+ }, [selectedRows, labelField]);
61
+ // Handle row selection
62
+ const handleRowSelect = useCallback((rowId) => {
63
+ const currentIds = new Set(selectedValues);
64
+ const isSelected = currentIds.has(rowId);
65
+ let newSelectedRows;
66
+ if (isSelected) {
67
+ // Remove row
68
+ newSelectedRows = selectedRows.filter((row) => String(row[valueField]) !== rowId);
69
+ }
70
+ else {
71
+ // Add row
72
+ const rowToAdd = rows.find((row) => String(row[valueField]) === rowId);
73
+ if (rowToAdd) {
74
+ newSelectedRows = [...selectedRows, rowToAdd];
75
+ }
76
+ else {
77
+ newSelectedRows = selectedRows;
78
+ }
79
+ }
80
+ props.setValue(props.item.name, newSelectedRows);
81
+ props?.item?.onChangeFn && props?.item?.onChangeFn(newSelectedRows);
82
+ props?.clearErrors && props?.clearErrors(props.item.name);
83
+ }, [selectedValues, selectedRows, rows, props, valueField]);
84
+ // Handle select all - selects filtered/visible rows (like MUI MultiSelect)
85
+ const handleSelectAll = useCallback(() => {
86
+ const table = tableRef.current;
87
+ if (!table)
88
+ return;
89
+ // Get filtered/visible rows (respects search filter)
90
+ const filteredRows = table.getFilteredRowModel().rows;
91
+ const filteredIds = filteredRows.map((row) => String(row.original[valueField]));
92
+ const currentIds = new Set(selectedValues);
93
+ const allFilteredSelected = filteredIds.every((id) => currentIds.has(id));
94
+ let newSelectedRows;
95
+ if (allFilteredSelected) {
96
+ // Deselect filtered rows - remove them from selection
97
+ newSelectedRows = selectedRows.filter((row) => !filteredIds.includes(String(row[valueField])));
98
+ }
99
+ else {
100
+ // Select filtered rows - add them to selection
101
+ const rowsToAdd = filteredRows
102
+ .map((row) => row.original)
103
+ .filter((row) => !currentIds.has(String(row[valueField])));
104
+ newSelectedRows = [...selectedRows, ...rowsToAdd];
105
+ }
106
+ props.setValue(props.item.name, newSelectedRows);
107
+ props?.item?.onChangeFn && props?.item?.onChangeFn(newSelectedRows);
108
+ }, [selectedValues, selectedRows, props, valueField]);
109
+ // Calculate select all state based on filtered rows
110
+ const getIsAllSelected = useCallback((table) => {
111
+ const filteredRows = table.getFilteredRowModel().rows;
112
+ if (filteredRows.length === 0)
113
+ return false;
114
+ return filteredRows.every((row) => selectedValues.includes(String(row.original[valueField])));
115
+ }, [selectedValues, valueField]);
116
+ const getIsIndeterminate = useCallback((table) => {
117
+ const filteredRows = table.getFilteredRowModel().rows;
118
+ if (filteredRows.length === 0)
119
+ return false;
120
+ const selectedCount = filteredRows.filter((row) => selectedValues.includes(String(row.original[valueField]))).length;
121
+ return selectedCount > 0 && selectedCount < filteredRows.length;
122
+ }, [selectedValues, valueField]);
123
+ // Build MRT columns from form item columns
124
+ const mrtColumns = useMemo(() => {
125
+ const selectColumn = {
126
+ id: 'select',
127
+ header: '',
128
+ size: 50,
129
+ enableSorting: false,
130
+ enableColumnFilter: false,
131
+ Cell: ({ row }) => {
132
+ const rowId = String(row.original[valueField]);
133
+ const isSelected = selectedValues.includes(rowId);
134
+ return (jsx(Checkbox, { size: "small", checked: isSelected, onChange: () => handleRowSelect(rowId), sx: {
135
+ padding: '2px',
136
+ '& .MuiSvgIcon-root': {
137
+ fontSize: '16px',
138
+ },
139
+ } }));
140
+ },
141
+ Header: ({ table }) => {
142
+ // Store table reference for select all
143
+ tableRef.current = table;
144
+ const isAllSelected = getIsAllSelected(table);
145
+ const isIndeterminate = getIsIndeterminate(table);
146
+ return (jsx(Checkbox, { size: "small", checked: isAllSelected, indeterminate: isIndeterminate, onChange: handleSelectAll, sx: {
147
+ padding: '2px',
148
+ '& .MuiSvgIcon-root': {
149
+ fontSize: '16px',
150
+ },
151
+ } }));
152
+ },
153
+ };
154
+ const dataColumns = columns.map((col) => ({
155
+ accessorKey: col.field,
156
+ header: col.headerName,
157
+ size: col.width || 120,
158
+ minSize: col.width || 80,
159
+ maxSize: 200,
160
+ }));
161
+ return [selectColumn, ...dataColumns];
162
+ }, [columns, selectedValues, valueField, handleRowSelect, handleSelectAll, getIsAllSelected, getIsIndeterminate]);
163
+ // MRT table instance
164
+ const table = useMaterialReactTable({
165
+ columns: mrtColumns,
166
+ data: rows,
167
+ enableTopToolbar: true,
168
+ enableGlobalFilter: true,
169
+ enableBottomToolbar: true,
170
+ enablePagination: true,
171
+ enableColumnActions: false,
172
+ enableColumnFilters: false,
173
+ enableSorting: false,
174
+ enableRowSelection: false,
175
+ enableSelectAll: false,
176
+ enableMultiRowSelection: false,
177
+ enableStickyHeader: true,
178
+ enableDensityToggle: false,
179
+ enableFullScreenToggle: false,
180
+ enableHiding: false,
181
+ positionGlobalFilter: 'left',
182
+ muiSearchTextFieldProps: {
183
+ placeholder: 'Search...',
184
+ size: 'small',
185
+ sx: {
186
+ width: '100%',
187
+ '& .MuiInputBase-root': {
188
+ fontSize: '11px',
189
+ height: '28px',
190
+ width: '100%',
191
+ },
192
+ '& .MuiInputBase-input': {
193
+ padding: '4px 8px',
194
+ },
195
+ },
196
+ },
197
+ muiTopToolbarProps: {
198
+ sx: {
199
+ padding: '2px 6px',
200
+ minHeight: '32px',
201
+ },
202
+ },
203
+ paginationDisplayMode: 'pages',
204
+ muiPaginationProps: {
205
+ rowsPerPageOptions: [10, 25, 50],
206
+ showFirstButton: false,
207
+ showLastButton: false,
208
+ size: 'small',
209
+ sx: {
210
+ '& .MuiTablePagination-root': {
211
+ fontSize: '10px',
212
+ minHeight: '28px',
213
+ },
214
+ '& .MuiTablePagination-select': {
215
+ fontSize: '10px',
216
+ },
217
+ '& .MuiTablePagination-displayedRows': {
218
+ fontSize: '10px',
219
+ },
220
+ '& .MuiTablePagination-toolbar': {
221
+ minHeight: '28px',
222
+ padding: '0 4px',
223
+ },
224
+ },
225
+ },
226
+ muiTableContainerProps: {
227
+ sx: {
228
+ maxHeight: 400,
229
+ // width: `calc(100%/${props.item.numberOfColumns})`,
230
+ },
231
+ },
232
+ layoutMode: 'grid',
233
+ muiTableHeadCellProps: {
234
+ sx: {
235
+ backgroundColor: headerColor,
236
+ color: '#fff',
237
+ fontWeight: 'bold',
238
+ fontSize: '11px',
239
+ padding: '4px 6px',
240
+ borderBottom: '1px solid #e0e0e0',
241
+ '& .Mui-TableHeadCell-Content': {
242
+ color: '#fff',
243
+ fontSize: '11px',
244
+ },
245
+ '& .MuiSvgIcon-root': {
246
+ color: '#fff',
247
+ fontSize: '16px',
248
+ },
249
+ },
250
+ },
251
+ muiTableBodyCellProps: {
252
+ sx: {
253
+ fontSize: '10px',
254
+ padding: '4px 6px',
255
+ borderBottom: '1px solid #e0e0e0',
256
+ },
257
+ },
258
+ muiTableBodyRowProps: {
259
+ sx: {
260
+ borderBottom: '1px solid #e0e0e0',
261
+ height: '32px',
262
+ '&:hover': {
263
+ backgroundColor: '#e0f2f1',
264
+ },
265
+ },
266
+ },
267
+ initialState: {
268
+ density: 'compact',
269
+ pagination: {
270
+ pageSize: 7,
271
+ pageIndex: 0,
272
+ },
273
+ showGlobalFilter: true,
274
+ },
275
+ state: {
276
+ globalFilter,
277
+ },
278
+ onGlobalFilterChange: setGlobalFilter,
279
+ });
280
+ return (jsx(Box, { children: jsxs(FormControl, { fullWidth: true, sx: {
281
+ '& .MuiFormLabel-root': {
282
+ top: -10,
283
+ },
284
+ '& .MuiInputLabel-shrink': {
285
+ top: 0,
286
+ },
287
+ '& .MuiTablePagination-root': {
288
+ padding: '0px !important'
289
+ }
290
+ }, children: [renderLabel(variant, props), variant !== 'standard' ? (jsxs(InputLabel, { error: isShowBorderError, id: `${props.item.name}-mst-labelId`, children: [props.item.label, props.item.required ? ' *' : ''] })) : null, jsx(Select, { labelId: `${props.item.name}-mst-labelId`, id: `${props.item.name}-mst-select`, multiple: true, sx: {
291
+ '& .MuiTypography-root': {
292
+ fontSize: '5px !important',
293
+ },
294
+ }, error: isShowBorderError, disabled: props.item.disable, value: selectedValues, displayEmpty: true, inputProps: {
295
+ 'aria-labelledby': `${props.item.name}-label`,
296
+ 'aria-describedby': `${props.item.name}-helper ${props.item.name}-error`,
297
+ 'aria-required': props.item.required ? true : undefined,
298
+ }, onOpen: () => {
299
+ setGlobalFilter('');
300
+ }, onClose: () => {
301
+ setGlobalFilter('');
302
+ props?.item?.onCloseMenu && props?.item?.onCloseMenu();
303
+ }, input: jsx(OutlinedInput, { label: variant !== 'standard' ? props.item.label : '' }), renderValue: () => (jsx(Tooltip, { title: selectedDisplayText, children: jsx("span", { children: selectedRows.length > (props.item.multiSelectLabelLength || 2)
304
+ ? `${selectedRows.length} Selected`
305
+ : selectedDisplayText || placeholder }) })), MenuProps: MenuProps, autoFocus: false, children: jsx(Box, { sx: { maxHeight: 450,
306
+ // width: `calc(100%/${props.item.numberOfColumns})`,
307
+ overflow: 'hidden' }, children: rows.length > 0 ? (jsx(MaterialReactTable, { table: table })) : (jsx(Box, { sx: { padding: '16px', textAlign: 'center', color: '#999', fontSize: '11px' }, children: "No Options found" })) }) }), jsx(FormBottomField, { ...props })] }) }, props.item.name));
308
+ };
309
+
310
+ export { MultiSelectTable as default };
@@ -7,7 +7,7 @@ import ListItemText from '@mui/material/ListItemText';
7
7
  import MenuItem from '@mui/material/MenuItem';
8
8
  import OutlinedInput from '@mui/material/OutlinedInput';
9
9
  import Select from '@mui/material/Select';
10
- import React__default, { useState, useMemo } from 'react';
10
+ import require$$0__default, { useState, useMemo } from 'react';
11
11
  import { useWatch } from 'react-hook-form';
12
12
  import FormBottomField from '../FormBottomField/FormBottomField.esm.js';
13
13
  import 'dayjs';
@@ -34,21 +34,27 @@ const MenuProps = {
34
34
  // },
35
35
  // }));
36
36
  const extractValuesToArray = (inputString) => {
37
- const valuesArray = inputString?.split(',');
38
- const trimmedArray = valuesArray?.map((value) => value.trim());
39
- return trimmedArray;
37
+ if (!inputString)
38
+ return [];
39
+ return inputString.split(',').map((value) => value.trim()).filter(Boolean);
40
40
  };
41
41
  function MultiSelectV1({ props, variant, }) {
42
- const [personName, setPersonName] = React__default.useState(props.getValues(props.item.name) ? extractValuesToArray(props.getValues(props.item.name)) : []);
42
+ const [personName, setPersonName] = require$$0__default.useState(props.getValues(props.item.name) ? extractValuesToArray(props.getValues(props.item.name)) : []);
43
43
  const [searchText, setSearchText] = useState('');
44
44
  const options = props.item?.options || [];
45
45
  const [filterOptions, setFilterOptions] = useState(props.item.options || []);
46
- const [selectAll, setSelectAll] = useState(false);
47
- const textfieldRef = React__default.useRef(null);
46
+ const textfieldRef = require$$0__default.useRef(null);
48
47
  const fieldValue = useWatch({ control: props.control, name: props.item.name });
49
- const mappedIds = useMemo(() => filterOptions.map((item) => item.value), [filterOptions]);
50
- const filterIds = useMemo(() => filterOptions.map((item) => item.value), [filterOptions]);
51
- React__default.useEffect(() => {
48
+ // Calculate selectAll state based on actual selection
49
+ const selectAll = useMemo(() => {
50
+ if (!fieldValue || filterOptions.length === 0)
51
+ return false;
52
+ const selectedValues = fieldValue.split(',').filter(Boolean);
53
+ return filterOptions.every((option) => selectedValues.includes(String(option.value)));
54
+ }, [fieldValue, filterOptions]);
55
+ useMemo(() => filterOptions.map((item) => item.value), [filterOptions]);
56
+ useMemo(() => filterOptions.map((item) => item.value), [filterOptions]);
57
+ require$$0__default.useEffect(() => {
52
58
  if (searchText !== '') {
53
59
  setFilterOptions(options.filter((item) => item.label.toLowerCase().includes(searchText.toLowerCase())));
54
60
  }
@@ -56,19 +62,6 @@ function MultiSelectV1({ props, variant, }) {
56
62
  setFilterOptions(options);
57
63
  }
58
64
  }, [options, searchText]);
59
- function hasExactMatch(array, value) {
60
- return array.some((item) => item === value);
61
- }
62
- React__default.useEffect(() => {
63
- if (fieldValue?.split(',').length !== filterOptions.length) {
64
- setSelectAll(false);
65
- }
66
- else {
67
- if (fieldValue?.split(',').every((value) => hasExactMatch(filterIds, value))) {
68
- setSelectAll(true);
69
- }
70
- }
71
- }, [filterOptions, fieldValue]);
72
65
  const handleChange = (event) => {
73
66
  const { target: { value }, } = event;
74
67
  setPersonName(typeof value === 'string' ? value?.split(',') : value);
@@ -88,7 +81,7 @@ function MultiSelectV1({ props, variant, }) {
88
81
  '& .MuiInputLabel-shrink': {
89
82
  top: 0,
90
83
  },
91
- }, children: [renderLabel(variant, props), variant !== 'standard' ? (jsxs(InputLabel, { error: isShowBorderError, id: `${props.item.name}-ms-labelId`, children: [props.item.label, props.item.required ? ' *' : ''] })) : (''), jsxs(Select, { labelId: `${props.item.name}-ms-labelId`, id: `${props.item.name}-ms-select`, multiple: true, sx: {
84
+ }, children: [renderLabel(variant, props), variant !== 'standard' ? (jsxs(InputLabel, { error: isShowBorderError, id: `${props.item.name}-ms-labelId`, children: [props.item.label, props.item.required ? ' *' : ''] })) : (''), jsxs(Select, { labelId: `${props.item.name}-ms-labelId`, id: `${props.item.name}-ms-select`, multiple: true, displayEmpty: true, sx: {
92
85
  '& .MuiTypography-root': {
93
86
  fontSize: '5px !important',
94
87
  },
@@ -105,7 +98,7 @@ function MultiSelectV1({ props, variant, }) {
105
98
  }, onClose: () => {
106
99
  setSearchText('');
107
100
  props?.item?.onCloseMenu && props?.item?.onCloseMenu();
108
- }, input: jsx(OutlinedInput, { label: variant !== 'standard' ? props.item.label : '' }), renderValue: (_selected) => (jsx(Tooltip, { title: selectedValues, children: jsx("span", { children: selectedOptions.length > (props.item.multiSelectLabelLength || 3)
101
+ }, input: jsx(OutlinedInput, { label: variant !== 'standard' ? props.item.label : '' }), renderValue: (_selected) => (jsx(Tooltip, { title: selectedValues, children: (props.item.placeholder && selectedOptions.length === 0) ? jsx("span", { style: { color: '#0009' }, children: props.item.placeholder }) : jsx("span", { children: selectedOptions.length > (props.item.multiSelectLabelLength || 3)
109
102
  ? `${selectedOptions.length} Selected`
110
103
  : selectedValues }) })), MenuProps: MenuProps, autoFocus: false, children: [jsx(Box, { sx: {
111
104
  width: '100%',
@@ -125,26 +118,35 @@ function MultiSelectV1({ props, variant, }) {
125
118
  e.stopPropagation();
126
119
  }
127
120
  } }) }), jsxs(MenuItem, { disabled: filterOptions.length === 0, sx: { zIndex: 0, fontSize: '5px !important' }, children: [jsx(Checkbox, { size: "small", checked: selectAll, onChange: () => {
128
- setSelectAll(!selectAll);
129
- const selectChanged = !selectAll;
130
- if (!selectChanged) {
131
- props.setValue(props.item.name, '');
121
+ if (selectAll) {
122
+ // Deselect all filtered options
123
+ const currentValues = fieldValue?.split(',').filter(Boolean) || [];
124
+ const filteredValues = filterOptions.map((opt) => String(opt.value));
125
+ const newValues = currentValues.filter((v) => !filteredValues.includes(v));
126
+ props.setValue(props.item.name, newValues.join(','));
132
127
  }
133
128
  else {
134
- const allDataMapped = mappedIds.join(',');
135
- props.setValue(props.item.name, allDataMapped);
129
+ // Select all filtered options
130
+ const currentValues = fieldValue?.split(',').filter(Boolean) || [];
131
+ const filteredValues = filterOptions.map((opt) => String(opt.value));
132
+ const newValues = [...new Set([...currentValues, ...filteredValues])];
133
+ props.setValue(props.item.name, newValues.join(','));
136
134
  }
137
135
  } }), jsx(ListItemText, { primary: 'Select All', sx: {
138
136
  fontSize: '5px !important',
139
137
  '& span': {
140
138
  fontSize: '12px !important',
141
139
  },
142
- } })] }), filterOptions.length !== 0 ? (filterOptions.map((option) => (jsxs(MenuItem, { value: `${option.value}`, sx: { zIndex: 0, fontSize: '11px !important' }, children: [jsx(Checkbox, { checked: fieldValue?.split(',').some((value) => value === option.value), size: "small" }), jsx(ListItemText, { primary: option.label, sx: {
143
- fontSize: '5px !important',
144
- '& span': {
145
- fontSize: '12px !important',
146
- },
147
- } })] }, option.value)))) : (jsx(MenuItem, { disabled: true, value: 'NA', children: "No data Found" }, 'NA'))] }), jsx(FormBottomField, { ...props })] }) }, props.item.name));
140
+ } })] }), filterOptions.length !== 0 ? (filterOptions.map((option) => {
141
+ const selectedArray = fieldValue ? extractValuesToArray(fieldValue) : [];
142
+ const isChecked = selectedArray.includes(String(option.value));
143
+ return (jsxs(MenuItem, { value: `${option.value}`, selected: isChecked, sx: { zIndex: 0, fontSize: '11px !important' }, children: [jsx(Checkbox, { checked: isChecked, size: "small" }), jsx(ListItemText, { primary: option.label, sx: {
144
+ fontSize: '5px !important',
145
+ '& span': {
146
+ fontSize: '12px !important',
147
+ },
148
+ } })] }, option.value));
149
+ })) : (jsx(MenuItem, { disabled: true, value: 'NA', children: "No data Found" }, 'NA'))] }), jsx(FormBottomField, { ...props })] }) }, props.item.name));
148
150
  }
149
151
 
150
152
  export { MultiSelectV1 as default };
@@ -7,6 +7,7 @@ export { default as SingleSelect } from './Select/SingleSelect';
7
7
  export { default as SingleSelectNonAutoComplete } from './Select/SingleSelectNonAutoComplete';
8
8
  export { default as SingleSelectSearchApi } from './Select/SingleSelectSearchApi';
9
9
  export { default as MultiSelectV1 } from './Select/MultiSelectv1';
10
+ export { default as MultiSelectTable } from './Select/MultiSelectTable';
10
11
  export { FormCheckBoxGroup } from '../CheckBoxGroup';
11
12
  export { FormRadioGroup } from '../RadioGroup';
12
13
  export { DatepickerWrapperV2, MonthPicker, Monthpickerrender, YearPickerField, } from '../DatePicker';
@@ -8,6 +8,7 @@ export { default as SingleSelect } from './Select/SingleSelect.esm.js';
8
8
  export { default as SingleSelectNonAutoComplete } from './Select/SingleSelectNonAutoComplete.esm.js';
9
9
  export { default as SingleSelectSearchApi } from './Select/SingleSelectSearchApi.esm.js';
10
10
  export { default as MultiSelectV1 } from './Select/MultiSelectv1.esm.js';
11
+ export { default as MultiSelectTable } from './Select/MultiSelectTable.esm.js';
11
12
  export { default as FormCheckBoxGroup } from './FormCheckBoxGroup/FormCheckBoxGroup.esm.js';
12
13
  export { default as FormRadioGroup } from './FormRadioGroup/FormRadioGroup.esm.js';
13
14
  export { default as DatepickerWrapperV2 } from './DatePicker/DatepickerWrapperV2.esm.js';
@@ -5,7 +5,7 @@ import FormControl from '@mui/material/FormControl';
5
5
  import ListItemText from '@mui/material/ListItemText';
6
6
  import MenuItem from '@mui/material/MenuItem';
7
7
  import Select from '@mui/material/Select';
8
- import * as React from 'react';
8
+ import * as require$$0 from 'react';
9
9
  import { useState } from 'react';
10
10
 
11
11
  const ITEM_HEIGHT = 48;
@@ -25,15 +25,15 @@ const extractValuesToArray = (inputString) => {
25
25
  return trimmedArray;
26
26
  };
27
27
  function MultiSelectFieldComponent({ value, options, onChangeFn, disable = false, }) {
28
- const [personName, setPersonName] = React.useState(value ? extractValuesToArray(value) : []);
28
+ const [personName, setPersonName] = require$$0.useState(value ? extractValuesToArray(value) : []);
29
29
  const [searchText, setSearchText] = useState('');
30
30
  const [filterOptions, setFilterOptions] = useState(options);
31
31
  const [selectAll, setSelectAll] = useState(false);
32
- const textfieldRef = React.useRef(null);
32
+ const textfieldRef = require$$0.useRef(null);
33
33
  const fieldValue = value;
34
34
  const mappedIds = filterOptions.map((item) => item.value);
35
35
  const filterIds = filterOptions.map((item) => item.value);
36
- React.useEffect(() => {
36
+ require$$0.useEffect(() => {
37
37
  if (searchText !== '') {
38
38
  setFilterOptions(options.filter((item) => item.label.toLowerCase().includes(searchText.toLowerCase())));
39
39
  }
@@ -44,7 +44,7 @@ function MultiSelectFieldComponent({ value, options, onChangeFn, disable = false
44
44
  function hasExactMatch(array, value) {
45
45
  return array.some((item) => item === value);
46
46
  }
47
- React.useEffect(() => {
47
+ require$$0.useEffect(() => {
48
48
  if (fieldValue?.split(',').length !== filterOptions.length) {
49
49
  setSelectAll(false);
50
50
  }
@@ -1,5 +1,5 @@
1
- import { __exports as Calendar } from '../../../../../_virtual/index.esm6.js';
2
- import React__default from 'react';
1
+ import { __exports as Calendar } from '../../../../../_virtual/index.esm5.js';
2
+ import require$$0__default from 'react';
3
3
  import { __require as requirePropTypes } from '../../../../prop-types/index.esm.js';
4
4
  import { __require as requireDayCell } from '../DayCell/index.esm.js';
5
5
  import { __require as requireMonth } from '../Month/index.esm.js';
@@ -23,7 +23,7 @@ function requireCalendar () {
23
23
  value: true
24
24
  });
25
25
  Calendar.default = void 0;
26
- var _react = _interopRequireWildcard(React__default);
26
+ var _react = _interopRequireWildcard(require$$0__default);
27
27
  var _propTypes = _interopRequireDefault(/*@__PURE__*/ requirePropTypes());
28
28
  var _DayCell = requireDayCell();
29
29
  var _Month = _interopRequireDefault(requireMonth());
@@ -1,5 +1,5 @@
1
- import { __exports as DateInput } from '../../../../../_virtual/index.esm13.js';
2
- import React__default from 'react';
1
+ import { __exports as DateInput } from '../../../../../_virtual/index.esm14.js';
2
+ import require$$0__default from 'react';
3
3
  import { __require as requirePropTypes } from '../../../../prop-types/index.esm.js';
4
4
  import { __require as requireClassnames } from '../../../../classnames/index.esm.js';
5
5
  import { __require as requireDateFns } from '../../../../date-fns/index.esm.js';
@@ -14,7 +14,7 @@ function requireDateInput () {
14
14
  value: true
15
15
  });
16
16
  DateInput.default = void 0;
17
- var _react = _interopRequireWildcard(React__default);
17
+ var _react = _interopRequireWildcard(require$$0__default);
18
18
  var _propTypes = _interopRequireDefault(/*@__PURE__*/ requirePropTypes());
19
19
  var _classnames = _interopRequireDefault(requireClassnames());
20
20
  var _dateFns = /*@__PURE__*/ requireDateFns();
@@ -1,5 +1,5 @@
1
- import { __exports as DateRange } from '../../../../../_virtual/index.esm4.js';
2
- import React__default from 'react';
1
+ import { __exports as DateRange } from '../../../../../_virtual/index.esm6.js';
2
+ import require$$0__default from 'react';
3
3
  import { __require as requirePropTypes } from '../../../../prop-types/index.esm.js';
4
4
  import { __require as requireCalendar } from '../Calendar/index.esm.js';
5
5
  import { __require as requireDayCell } from '../DayCell/index.esm.js';
@@ -18,7 +18,7 @@ function requireDateRange () {
18
18
  value: true
19
19
  });
20
20
  DateRange.default = void 0;
21
- var _react = _interopRequireWildcard(React__default);
21
+ var _react = _interopRequireWildcard(require$$0__default);
22
22
  var _propTypes = _interopRequireDefault(/*@__PURE__*/ requirePropTypes());
23
23
  var _Calendar = _interopRequireDefault(requireCalendar());
24
24
  var _DayCell = requireDayCell();
@@ -1,5 +1,5 @@
1
- import { __exports as DateRangePicker } from '../../../../../_virtual/index.esm7.js';
2
- import React__default from 'react';
1
+ import { __exports as DateRangePicker } from '../../../../../_virtual/index.esm4.js';
2
+ import require$$0__default from 'react';
3
3
  import { __require as requirePropTypes } from '../../../../prop-types/index.esm.js';
4
4
  import { __require as requireDateRange } from '../DateRange/index.esm.js';
5
5
  import { __require as requireDefinedRange } from '../DefinedRange/index.esm.js';
@@ -17,7 +17,7 @@ function requireDateRangePicker () {
17
17
  value: true
18
18
  });
19
19
  DateRangePicker.default = void 0;
20
- var _react = _interopRequireWildcard(React__default);
20
+ var _react = _interopRequireWildcard(require$$0__default);
21
21
  var _propTypes = _interopRequireDefault(/*@__PURE__*/ requirePropTypes());
22
22
  var _DateRange = _interopRequireDefault(requireDateRange());
23
23
  var _DefinedRange = _interopRequireDefault(requireDefinedRange());
@@ -1,5 +1,5 @@
1
1
  import { __exports as DayCell } from '../../../../../_virtual/index.esm11.js';
2
- import React__default from 'react';
2
+ import require$$0__default from 'react';
3
3
  import { __require as requirePropTypes } from '../../../../prop-types/index.esm.js';
4
4
  import { __require as requireClassnames } from '../../../../classnames/index.esm.js';
5
5
  import { __require as requireDateFns } from '../../../../date-fns/index.esm.js';
@@ -14,7 +14,7 @@ function requireDayCell () {
14
14
  value: true
15
15
  });
16
16
  DayCell.rangeShape = DayCell.default = void 0;
17
- var _react = _interopRequireWildcard(React__default);
17
+ var _react = _interopRequireWildcard(require$$0__default);
18
18
  var _propTypes = _interopRequireDefault(/*@__PURE__*/ requirePropTypes());
19
19
  var _classnames = _interopRequireDefault(requireClassnames());
20
20
  var _dateFns = /*@__PURE__*/ requireDateFns();
@@ -1,5 +1,5 @@
1
- import { __exports as DefinedRange } from '../../../../../_virtual/index.esm5.js';
2
- import React__default from 'react';
1
+ import { __exports as DefinedRange } from '../../../../../_virtual/index.esm7.js';
2
+ import require$$0__default from 'react';
3
3
  import { __require as requirePropTypes } from '../../../../prop-types/index.esm.js';
4
4
  import { __require as requireStyles } from '../../styles.esm.js';
5
5
  import { __require as requireDefaultRanges } from '../../defaultRanges.esm.js';
@@ -17,7 +17,7 @@ function requireDefinedRange () {
17
17
  value: true
18
18
  });
19
19
  DefinedRange.default = void 0;
20
- var _react = _interopRequireWildcard(React__default);
20
+ var _react = _interopRequireWildcard(require$$0__default);
21
21
  var _propTypes = _interopRequireDefault(/*@__PURE__*/ requirePropTypes());
22
22
  var _styles = _interopRequireDefault(requireStyles());
23
23
  var _defaultRanges = requireDefaultRanges();
@@ -1,5 +1,5 @@
1
1
  import { __exports as InputRangeField } from '../../../../../_virtual/index.esm12.js';
2
- import React__default from 'react';
2
+ import require$$0__default from 'react';
3
3
  import { __require as requirePropTypes } from '../../../../prop-types/index.esm.js';
4
4
 
5
5
  var hasRequiredInputRangeField;
@@ -12,7 +12,7 @@ function requireInputRangeField () {
12
12
  value: true
13
13
  });
14
14
  InputRangeField.default = void 0;
15
- var _react = _interopRequireWildcard(React__default);
15
+ var _react = _interopRequireWildcard(require$$0__default);
16
16
  var _propTypes = _interopRequireDefault(/*@__PURE__*/ requirePropTypes());
17
17
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
18
18
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
@@ -1,5 +1,5 @@
1
- import { __exports as Month } from '../../../../../_virtual/index.esm14.js';
2
- import React__default from 'react';
1
+ import { __exports as Month } from '../../../../../_virtual/index.esm13.js';
2
+ import require$$0__default from 'react';
3
3
  import { __require as requirePropTypes } from '../../../../prop-types/index.esm.js';
4
4
  import { __require as requireDayCell } from '../DayCell/index.esm.js';
5
5
  import { __require as requireDateFns } from '../../../../date-fns/index.esm.js';
@@ -15,7 +15,7 @@ function requireMonth () {
15
15
  value: true
16
16
  });
17
17
  Month.default = void 0;
18
- var _react = _interopRequireWildcard(React__default);
18
+ var _react = _interopRequireWildcard(require$$0__default);
19
19
  var _propTypes = _interopRequireDefault(/*@__PURE__*/ requirePropTypes());
20
20
  var _DayCell = _interopRequireWildcard(requireDayCell());
21
21
  var _dateFns = /*@__PURE__*/ requireDateFns();
@@ -1,5 +1,5 @@
1
1
  import { __exports as reactList } from '../../_virtual/react-list.esm.js';
2
- import React__default from 'react';
2
+ import require$$0__default from 'react';
3
3
  import require$$1 from 'react/jsx-runtime';
4
4
 
5
5
  var hasRequiredReactList;
@@ -10,7 +10,7 @@ function requireReactList () {
10
10
  (function (exports$1) {
11
11
  (function (global, factory) {
12
12
  {
13
- factory(exports$1, React__default, require$$1);
13
+ factory(exports$1, require$$0__default, require$$1);
14
14
  }
15
15
  })(typeof globalThis !== "undefined" ? globalThis : typeof self !== "undefined" ? self : reactList, function (_exports, _react, _jsxRuntime) {
16
16
 
@@ -10,7 +10,7 @@ export interface TextFieldInputProps {
10
10
  export interface FormSectionPropsItem {
11
11
  name: string;
12
12
  label: string;
13
- inputType: 'text' | 'password' | 'number' | 'select' | 'autocomplete-select' | 'autocomplete-multi-select' | 'single-select-search' | 'datepicker' | 'multiselect' | 'select-v2' | 'basic-select' | 'decimal' | 'alpha-numerical' | 'yearpicker' | 'dateRangePicker' | 'monthpicker' | 'multiselect' | 'file' | 'multifile' | 'multifile-with-preview' | 'textarea' | 'phoneNumber' | 'pincode' | 'email' | 'toggleSwitch' | 'rich-text-editor' | 'multiEmail' | 'timepicker' | 'checkbox-group' | 'radio-group' | 'checkbox' | 'custom' | 'input-select' | 'date-range-picker' | '';
13
+ inputType: 'text' | 'password' | 'number' | 'select' | 'autocomplete-select' | 'autocomplete-multi-select' | 'single-select-search' | 'datepicker' | 'multiselect' | 'select-v2' | 'basic-select' | 'decimal' | 'alpha-numerical' | 'yearpicker' | 'dateRangePicker' | 'monthpicker' | 'multiselect' | 'file' | 'multifile' | 'multifile-with-preview' | 'textarea' | 'phoneNumber' | 'pincode' | 'email' | 'toggleSwitch' | 'rich-text-editor' | 'multiEmail' | 'timepicker' | 'checkbox-group' | 'radio-group' | 'checkbox' | 'custom' | 'input-select' | 'date-range-picker' | 'multiselect-table' | '';
14
14
  options?: OptionsProps[];
15
15
  required?: boolean;
16
16
  errorMessage?: string;
@@ -70,6 +70,16 @@ export interface FormSectionPropsItem {
70
70
  api?: string;
71
71
  jwtHeader?: any;
72
72
  searchValue?: any;
73
+ columns?: {
74
+ field: string;
75
+ headerName: string;
76
+ width?: number;
77
+ flex?: number;
78
+ }[];
79
+ rows?: any[];
80
+ valueField?: string;
81
+ labelField?: string;
82
+ headerColor?: string;
73
83
  }
74
84
  export type VariantProps = 'standard' | 'outlined' | '';
75
85
  export interface FormRenderProps {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tp-react-elements",
3
- "version": "1.0.3",
3
+ "version": "1.1.0",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "React form components library built with React Hook Form and Yup",
@@ -90,6 +90,7 @@
90
90
  "file-saver": ">=2.0.5 <3.0.0",
91
91
  "jodit": ">=4.6.2 <5.0.0",
92
92
  "jodit-react": ">=5.2.19 <6.0.0",
93
+ "material-react-table": ">=3.0.0 <4.0.0",
93
94
  "react": ">=18 <20",
94
95
  "react-dom": ">=18 <20",
95
96
  "react-hook-form": ">=7.62.0 <8.0.0",
@@ -106,6 +107,9 @@
106
107
  },
107
108
  "jodit-react": {
108
109
  "optional": true
110
+ },
111
+ "material-react-table": {
112
+ "optional": true
109
113
  }
110
114
  },
111
115
  "devDependencies": {
@@ -149,6 +153,7 @@
149
153
  "jodit": "^4.6.2",
150
154
  "jodit-react": "^5.2.19",
151
155
  "jsdom": "^25.0.0",
156
+ "material-react-table": "^3.2.1",
152
157
  "prettier": "^3.6.2",
153
158
  "react": "^19.1.1",
154
159
  "react-dom": "^19.1.1",