tp-react-elements 1.3.8 → 1.3.10

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.
@@ -1,3 +1,3 @@
1
- var Calendar = {};
1
+ var DefinedRange = {};
2
2
 
3
- export { Calendar as __exports };
3
+ export { DefinedRange as __exports };
@@ -1,3 +1,3 @@
1
- var DefinedRange = {};
1
+ var DateRange = {};
2
2
 
3
- export { DefinedRange as __exports };
3
+ export { DateRange as __exports };
@@ -1,3 +1,3 @@
1
- var DateRange = {};
1
+ var Calendar = {};
2
2
 
3
- export { DateRange as __exports };
3
+ export { Calendar as __exports };
@@ -5,6 +5,9 @@ import FormCheckBoxGroup from '../FormComponents/FormCheckBoxGroup/FormCheckBoxG
5
5
  import FormNumberField from '../FormComponents/FormNumberField/FormNumberField.esm.js';
6
6
  import FormNumberFieldDecimal from '../FormComponents/FormNumberField/FormNumberFieldDecimal.esm.js';
7
7
  import FormRadioGroup from '../FormComponents/FormRadioGroup/FormRadioGroup.esm.js';
8
+ import FormTextAreaField from '../FormComponents/FormTextAreaField/FormTextAreaField.esm.js';
9
+ import FormTextField from '../FormComponents/FormTextField/FormTextField.esm.js';
10
+ import PasswordField from '../FormComponents/PasswordField/PasswordField.esm.js';
8
11
  import SingleSelect from '../FormComponents/Select/SingleSelect.esm.js';
9
12
  import MultiSelectAutocomplete from '../FormComponents/Select/MultiSelectAutocomplete.esm.js';
10
13
  import SingleSelectNonAutoComplete from '../FormComponents/Select/SingleSelectNonAutoComplete.esm.js';
@@ -15,9 +18,6 @@ import DateRangePickerComponent from '../DateRangePicker/DateRangePicker.esm.js'
15
18
  import RichTextEditorWrapper from '../FormComponents/RichTextEditor/RichTextEditorWrapper.esm.js';
16
19
  import SingleSelectSearchApi from '../FormComponents/Select/SingleSelectSearchApi.esm.js';
17
20
  import DatetimepickerWrapper from '../FormComponents/DatePicker/DatetimepickerWrapper.esm.js';
18
- import FormTextAreaField from '../FormComponents/FormTextAreaField/FormTextAreaField.esm.js';
19
- import PasswordField from '../FormComponents/PasswordField/PasswordField.esm.js';
20
- import FormTextField from '../FormComponents/FormTextField/FormTextField.esm.js';
21
21
 
22
22
  // Lazy-loaded heavy components
23
23
  // const RichTextEditorWrapper = lazy(() =>
@@ -1,5 +1,8 @@
1
1
  export { default as FormNumberField } from './FormNumberField/FormNumberField.esm.js';
2
2
  export { default as FormNumberFieldDecimal } from './FormNumberField/FormNumberFieldDecimal.esm.js';
3
+ export { default as FormTextAreaField } from './FormTextAreaField/FormTextAreaField.esm.js';
4
+ export { default as FormTextField } from './FormTextField/FormTextField.esm.js';
5
+ export { default as PasswordField } from './PasswordField/PasswordField.esm.js';
3
6
  export { default as FormCheckBox } from './FormCheckBox/FormCheckBox.esm.js';
4
7
  export { default as SingleSelect } from './Select/SingleSelect.esm.js';
5
8
  export { default as SingleSelectNonAutoComplete } from './Select/SingleSelectNonAutoComplete.esm.js';
@@ -12,6 +15,7 @@ export { default as FormRadioGroup } from './FormRadioGroup/FormRadioGroup.esm.j
12
15
  export { default as DatepickerWrapperV2 } from './DatePicker/DatepickerWrapperV2.esm.js';
13
16
  export { default as Monthpickerrender } from './DatePicker/Monthpickerrender.esm.js';
14
17
  export { default as YearPickerField } from './YearPickerField/YearPickerField.esm.js';
18
+ export { default as TimePicker } from './TimePicker/TimePicker.esm.js';
15
19
  export { default as FormRenderFileUpload } from './FileUpload/FormRenderFileUpload.esm.js';
16
20
  export { default as FormRenderMultiFileUpload } from './FileUpload/FormRenderMultiFileUpload.esm.js';
17
21
  import 'react/jsx-runtime';
@@ -30,10 +34,6 @@ import '@mui/icons-material/PictureAsPdf';
30
34
  import '@mui/icons-material/TableChart';
31
35
  import '@mui/icons-material/Description';
32
36
  export { default as FormErrorField } from './FormErrorField/FormErrorField.esm.js';
33
- export { default as FormTextAreaField } from './FormTextAreaField/FormTextAreaField.esm.js';
34
- export { default as FormTextField } from './FormTextField/FormTextField.esm.js';
35
37
  export { default as HelperText } from './HelperText/HelperText.esm.js';
36
- export { default as PasswordField } from './PasswordField/PasswordField.esm.js';
37
38
  export { default as RichTextEditor } from './RichTextEditor/RichTextEditor.esm.js';
38
39
  export { default as RichTextEditorWrapper } from './RichTextEditor/RichTextEditorWrapper.esm.js';
39
- export { default as TimePicker } from './TimePicker/TimePicker.esm.js';
@@ -273,7 +273,7 @@ const ManageFiltersButton = ({ serverFilterDefs, visibleIds, availableColumns, o
273
273
  display: 'flex',
274
274
  alignItems: 'center',
275
275
  gap: 0.75,
276
- }, children: jsxs(Typography, { sx: { fontSize: 11, color: 'primary.main', fontWeight: 600, lineHeight: 1.4 }, children: [visibleIds.length, "/", maxVisible, " filters active \u2014 remove one to add another"] }) })), jsxs(Box, { sx: { py: 1 }, children: [serverFilterDefs.length > 0 && (jsxs(Fragment, { children: [jsx(Typography, { variant: "caption", fontWeight: 700, color: "text.disabled", sx: { px: 2, pb: 0.5, display: 'block', textTransform: 'uppercase', letterSpacing: 0.5 }, children: "Server Filters" }), jsx(List, { dense: true, disablePadding: true, children: serverFilterDefs.map((def) => {
276
+ }, children: jsxs(Typography, { sx: { fontSize: 11, color: 'primary.main', fontWeight: 600, lineHeight: 1.4 }, children: [visibleIds.length, "/", maxVisible, " filters active \u2014 remove one to add another"] }) })), jsxs(Box, { sx: { py: 1, maxHeight: 360, overflowY: 'auto' }, children: [serverFilterDefs.length > 0 && (jsxs(Fragment, { children: [jsx(Typography, { variant: "caption", fontWeight: 700, color: "text.disabled", sx: { px: 2, pb: 0.5, display: 'block', textTransform: 'uppercase', letterSpacing: 0.5 }, children: "Server Filters" }), jsx(List, { dense: true, disablePadding: true, children: serverFilterDefs.map((def) => {
277
277
  const selected = visibleIds.includes(def.id);
278
278
  const blocked = atLimit && !selected; // at cap and not yet shown → disabled
279
279
  const pill = TYPE_PILL[def.type];
@@ -2,7 +2,7 @@ import { jsx, jsxs } from 'react/jsx-runtime';
2
2
  import { useState, useRef, useLayoutEffect, useMemo } from 'react';
3
3
  import { useMaterialReactTable, MaterialReactTable } from 'material-react-table';
4
4
  import { useQuery, keepPreviousData } from '@tanstack/react-query';
5
- import { Box, Tooltip, IconButton, Button, GlobalStyles, Typography, Select, MenuItem, CircularProgress } from '@mui/material';
5
+ import { Box, Tooltip, IconButton, GlobalStyles, Typography, Select, MenuItem, CircularProgress } from '@mui/material';
6
6
  import RefreshIcon from '@mui/icons-material/Refresh';
7
7
  import FileDownloadIcon from '@mui/icons-material/FileDownload';
8
8
  import FirstPageIcon from '@mui/icons-material/FirstPage';
@@ -77,12 +77,35 @@ function GenericPaginatedGrid({ columns, fetchPage, queryKey, serverFilterDefs,
77
77
  return;
78
78
  const update = () => {
79
79
  const top = el.getBoundingClientRect().top;
80
- setAutoHeight(`calc(100vh - ${Math.ceil(top) + 8}px)`);
80
+ // CSS max() guarantees a minimum visible height (300px) when the grid
81
+ // starts below the fold or when little viewport space remains — both
82
+ // cases produce a negative/tiny calc() that would otherwise collapse
83
+ // the grid to zero height.
84
+ setAutoHeight(`max(300px, calc(100vh - ${Math.ceil(top) + 8}px))`);
81
85
  };
82
86
  update();
87
+ // Re-measure on any document resize (window resize, sidebar toggle, etc.)
83
88
  const ro = new ResizeObserver(update);
84
89
  ro.observe(document.documentElement);
85
- return () => ro.disconnect();
90
+ // Re-measure when the scroll container scrolls — the grid's
91
+ // viewport-relative top offset shifts with scroll position, so the
92
+ // height must be recalculated to fill the remaining visible space.
93
+ const findScrollParent = (node) => {
94
+ let p = node.parentElement;
95
+ while (p && p !== document.documentElement) {
96
+ const { overflow, overflowY } = window.getComputedStyle(p);
97
+ if (/auto|scroll/.test(overflow) || /auto|scroll/.test(overflowY))
98
+ return p;
99
+ p = p.parentElement;
100
+ }
101
+ return window;
102
+ };
103
+ const scrollParent = findScrollParent(el);
104
+ scrollParent.addEventListener('scroll', update, { passive: true });
105
+ return () => {
106
+ ro.disconnect();
107
+ scrollParent.removeEventListener('scroll', update);
108
+ };
86
109
  }, [tableHeight]);
87
110
  // Resolved height: explicit prop › auto-calculated › safe fallback
88
111
  const resolvedHeight = tableHeight || autoHeight || '60vh';
@@ -184,8 +207,6 @@ function GenericPaginatedGrid({ columns, fetchPage, queryKey, serverFilterDefs,
184
207
  a.click();
185
208
  URL.revokeObjectURL(url);
186
209
  };
187
- const hasAnyValue = Object.values(filterValues).some(Boolean) ||
188
- columnFilters.some((f) => f.value);
189
210
  // ── Table instance ─────────────────────────────────────────────────────────
190
211
  const table = useMaterialReactTable({
191
212
  columns: processedColumns,
@@ -226,12 +247,12 @@ function GenericPaginatedGrid({ columns, fetchPage, queryKey, serverFilterDefs,
226
247
  enableStickyHeader: true,
227
248
  enableRowVirtualization: true,
228
249
  // The container fills whatever height is left after the top toolbar and
229
- // pagination footer. min-height: 0 is required so the flex child can
230
- // shrink below its natural content height and scroll its rows instead.
250
+ // pagination footer. minHeight ensures a visible body even when there are
251
+ // no records; flex: '1 1 0' lets it grow to fill the remaining space.
231
252
  muiTableContainerProps: {
232
253
  sx: {
233
254
  flex: '1 1 0',
234
- minHeight: 0,
255
+ minHeight: '150px',
235
256
  },
236
257
  },
237
258
  // Paper fills the wrapper Box height and acts as the flex column host for
@@ -301,15 +322,7 @@ function GenericPaginatedGrid({ columns, fetchPage, queryKey, serverFilterDefs,
301
322
  muiToolbarAlertBannerProps: isError
302
323
  ? { color: 'error', children: 'Failed to load data. Please try again.' }
303
324
  : undefined,
304
- renderTopToolbarCustomActions: () => (jsxs(Box, { sx: { display: 'flex', alignItems: 'center', flex: 1, minWidth: 0, pr: 1, gap: 0.5 }, children: [jsxs(Box, { sx: { display: 'flex', alignItems: 'center', flexShrink: 0, gap: 0.25 }, children: [jsx(Tooltip, { title: "Refresh current batch", children: jsx("span", { children: jsx(IconButton, { size: "small", onClick: () => refetch(), disabled: isFetching, children: jsx(RefreshIcon, { fontSize: "small" }) }) }) }), jsx(Tooltip, { title: "Export batch as CSV", children: jsx("span", { children: jsx(IconButton, { size: "small", onClick: handleExport, disabled: rows.length === 0 || isFetching, children: jsx(FileDownloadIcon, { fontSize: "small" }) }) }) })] }), jsx(Box, { sx: { flex: 1, minWidth: 0 }, children: jsx(DynamicFilterBar, { serverFilterDefs: serverFilterDefs, visibleFilterIds: visibleFilterIds, onToggleFilter: handleToggleFilter, filterValues: filterValues, onFilterValuesChange: handleFilterValuesChange, columnFilters: columnFilters, onColumnFilterChange: setColumnFilters, availableColumns: availableColumns, maxVisibleFilters: maxVisibleFilters }) }), hasAnyValue && (jsx(Button, { size: "small", onClick: handleClearAll, sx: {
305
- flexShrink: 0,
306
- textTransform: 'none',
307
- fontSize: 12,
308
- color: 'error.main',
309
- minWidth: 'auto',
310
- px: 1,
311
- '&:hover': { bgcolor: 'rgba(211,47,47,0.06)' },
312
- }, children: "Clear All" }))] })),
325
+ renderTopToolbarCustomActions: () => (jsxs(Box, { sx: { display: 'flex', alignItems: 'center', flex: 1, minWidth: 0, pr: 1, gap: 0.5 }, children: [jsxs(Box, { sx: { display: 'flex', alignItems: 'center', flexShrink: 0, gap: 0.25 }, children: [jsx(Tooltip, { title: "Clear filters & refresh", children: jsx("span", { children: jsx(IconButton, { size: "small", onClick: () => { handleClearAll(); refetch(); }, disabled: isFetching, children: jsx(RefreshIcon, { fontSize: "small" }) }) }) }), jsx(Tooltip, { title: "Export batch as CSV", children: jsx("span", { children: jsx(IconButton, { size: "small", onClick: handleExport, disabled: rows.length === 0 || isFetching, children: jsx(FileDownloadIcon, { fontSize: "small" }) }) }) })] }), jsx(Box, { sx: { flex: 1, minWidth: 0 }, children: jsx(DynamicFilterBar, { serverFilterDefs: serverFilterDefs, visibleFilterIds: visibleFilterIds, onToggleFilter: handleToggleFilter, filterValues: filterValues, onFilterValuesChange: handleFilterValuesChange, columnFilters: columnFilters, onColumnFilterChange: setColumnFilters, availableColumns: availableColumns, maxVisibleFilters: maxVisibleFilters }) })] })),
313
326
  renderBottomToolbar: ({ table: t }) => (jsx(PaginationFooter, { pageIndex: t.getState().pagination.pageIndex, pageSize: t.getState().pagination.pageSize, totalRecords: totalRecords, isFetching: isFetching, isLoading: isLoading, canPrev: t.getCanPreviousPage() && !isFetching, canNext: t.getCanNextPage() && !isFetching, onFirst: () => t.firstPage(), onPrev: () => t.previousPage(), onNext: () => t.nextPage(), onLast: () => t.lastPage(), onPageSizeChange: (s) => t.setPageSize(s), pageSizeOptions: pageSizeOptions })),
314
327
  });
315
328
  return (jsxs(Box, { ref: containerRef, className: "tp-gpg-root", sx: {
@@ -1,4 +1,4 @@
1
- import { __exports as Calendar } from '../../../../../_virtual/index.esm4.js';
1
+ import { __exports as Calendar } from '../../../../../_virtual/index.esm7.js';
2
2
  import React__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';
@@ -1,4 +1,4 @@
1
- import { __exports as DateRange } from '../../../../../_virtual/index.esm7.js';
1
+ import { __exports as DateRange } from '../../../../../_virtual/index.esm5.js';
2
2
  import React__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';
@@ -1,4 +1,4 @@
1
- import { __exports as DefinedRange } from '../../../../../_virtual/index.esm5.js';
1
+ import { __exports as DefinedRange } from '../../../../../_virtual/index.esm4.js';
2
2
  import React__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';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tp-react-elements",
3
- "version": "1.3.8",
3
+ "version": "1.3.10",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "React form components library built with React Hook Form and Yup",