@joelbarron/react-web-dev-kit 0.1.5 → 0.1.7

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 (105) hide show
  1. package/dist/auth/fuse/fuseIntegration.d.ts +2 -0
  2. package/dist/auth/fuse/fuseIntegration.d.ts.map +1 -1
  3. package/dist/auth/fuse/fuseIntegration.js +18 -0
  4. package/dist/auth/social/providerAuth.d.ts.map +1 -1
  5. package/dist/auth/social/providerAuth.js +12 -4
  6. package/dist/config/createConfig.d.ts.map +1 -1
  7. package/dist/config/createConfig.js +38 -1
  8. package/dist/config/defaults.js +1 -1
  9. package/dist/core/buttons/JBButton.d.ts +8 -0
  10. package/dist/core/buttons/JBButton.d.ts.map +1 -0
  11. package/dist/core/buttons/JBButton.js +55 -0
  12. package/dist/core/buttons/index.d.ts +2 -0
  13. package/dist/core/buttons/index.d.ts.map +1 -0
  14. package/dist/core/buttons/index.js +1 -0
  15. package/dist/core/dialogs/JBConfirmDialog.d.ts +15 -0
  16. package/dist/core/dialogs/JBConfirmDialog.d.ts.map +1 -0
  17. package/dist/core/dialogs/JBConfirmDialog.js +6 -0
  18. package/dist/core/dialogs/index.d.ts +2 -0
  19. package/dist/core/dialogs/index.d.ts.map +1 -0
  20. package/dist/core/dialogs/index.js +1 -0
  21. package/dist/core/index.d.ts +5 -0
  22. package/dist/core/index.d.ts.map +1 -0
  23. package/dist/core/index.js +4 -0
  24. package/dist/core/layout/JBContentContainer.d.ts +31 -0
  25. package/dist/core/layout/JBContentContainer.d.ts.map +1 -0
  26. package/dist/core/layout/JBContentContainer.js +50 -0
  27. package/dist/core/layout/JBFormHeader.d.ts +3 -0
  28. package/dist/core/layout/JBFormHeader.d.ts.map +1 -0
  29. package/dist/core/layout/JBFormHeader.js +131 -0
  30. package/dist/core/layout/index.d.ts +3 -0
  31. package/dist/core/layout/index.d.ts.map +1 -0
  32. package/dist/core/layout/index.js +2 -0
  33. package/dist/core/skeletons/JBFormContentSkeleton.d.ts +5 -0
  34. package/dist/core/skeletons/JBFormContentSkeleton.d.ts.map +1 -0
  35. package/dist/core/skeletons/JBFormContentSkeleton.js +12 -0
  36. package/dist/core/skeletons/JBFormHeaderSkeleton.d.ts +6 -0
  37. package/dist/core/skeletons/JBFormHeaderSkeleton.d.ts.map +1 -0
  38. package/dist/core/skeletons/JBFormHeaderSkeleton.js +19 -0
  39. package/dist/core/skeletons/index.d.ts +3 -0
  40. package/dist/core/skeletons/index.d.ts.map +1 -0
  41. package/dist/core/skeletons/index.js +2 -0
  42. package/dist/forms/JBAutocompleteField.d.ts +12 -0
  43. package/dist/forms/JBAutocompleteField.d.ts.map +1 -0
  44. package/dist/forms/JBAutocompleteField.js +20 -0
  45. package/dist/forms/index.d.ts +2 -0
  46. package/dist/forms/index.d.ts.map +1 -1
  47. package/dist/forms/index.js +2 -0
  48. package/dist/forms/zod.d.ts +4 -0
  49. package/dist/forms/zod.d.ts.map +1 -0
  50. package/dist/forms/zod.js +9 -0
  51. package/dist/grid/JBGrid.d.ts.map +1 -1
  52. package/dist/grid/JBGrid.js +262 -18
  53. package/dist/grid/JBGridHeader.d.ts.map +1 -1
  54. package/dist/grid/JBGridHeader.js +86 -15
  55. package/dist/grid/JBGridLoading.d.ts +9 -0
  56. package/dist/grid/JBGridLoading.d.ts.map +1 -0
  57. package/dist/grid/JBGridLoading.js +14 -0
  58. package/dist/grid/JBGridProviders.d.ts +3 -0
  59. package/dist/grid/JBGridProviders.d.ts.map +1 -1
  60. package/dist/grid/JBGridProviders.js +16 -0
  61. package/dist/grid/JBGridSkeleton.d.ts +7 -0
  62. package/dist/grid/JBGridSkeleton.d.ts.map +1 -0
  63. package/dist/grid/JBGridSkeleton.js +6 -0
  64. package/dist/grid/defaults.d.ts +4 -0
  65. package/dist/grid/defaults.d.ts.map +1 -0
  66. package/dist/grid/defaults.js +28 -0
  67. package/dist/grid/index.d.ts +3 -0
  68. package/dist/grid/index.d.ts.map +1 -1
  69. package/dist/grid/index.js +3 -0
  70. package/dist/grid/types.d.ts +120 -5
  71. package/dist/grid/types.d.ts.map +1 -1
  72. package/dist/hooks/index.d.ts +1 -0
  73. package/dist/hooks/index.d.ts.map +1 -1
  74. package/dist/hooks/index.js +1 -0
  75. package/dist/hooks/useJBEntityFormController.d.ts +54 -0
  76. package/dist/hooks/useJBEntityFormController.d.ts.map +1 -0
  77. package/dist/hooks/useJBEntityFormController.js +156 -0
  78. package/dist/index.d.ts +1 -0
  79. package/dist/index.d.ts.map +1 -1
  80. package/dist/index.js +1 -0
  81. package/dist/query/index.d.ts +1 -0
  82. package/dist/query/index.d.ts.map +1 -1
  83. package/dist/query/index.js +1 -0
  84. package/dist/query/types.d.ts +7 -0
  85. package/dist/query/types.d.ts.map +1 -0
  86. package/dist/query/types.js +1 -0
  87. package/dist/utils/errors.d.ts +10 -0
  88. package/dist/utils/errors.d.ts.map +1 -0
  89. package/dist/utils/errors.js +55 -0
  90. package/dist/utils/geo.d.ts +9 -0
  91. package/dist/utils/geo.d.ts.map +1 -0
  92. package/dist/utils/geo.js +186 -0
  93. package/dist/utils/index.d.ts +2 -0
  94. package/dist/utils/index.d.ts.map +1 -1
  95. package/dist/utils/index.js +2 -0
  96. package/package.json +7 -1
  97. package/dist/auth/ui/SignInPageTitle.d.ts +0 -6
  98. package/dist/auth/ui/SignInPageTitle.d.ts.map +0 -1
  99. package/dist/auth/ui/SignInPageTitle.js +0 -7
  100. package/dist/auth/ui/SignOutPageTitle.d.ts +0 -6
  101. package/dist/auth/ui/SignOutPageTitle.d.ts.map +0 -1
  102. package/dist/auth/ui/SignOutPageTitle.js +0 -7
  103. package/dist/auth/ui/SignUpPageTitle.d.ts +0 -6
  104. package/dist/auth/ui/SignUpPageTitle.d.ts.map +0 -1
  105. package/dist/auth/ui/SignUpPageTitle.js +0 -7
@@ -0,0 +1,2 @@
1
+ export * from './JBFormHeaderSkeleton';
2
+ export * from './JBFormContentSkeleton';
@@ -0,0 +1,12 @@
1
+ import { TextFieldProps } from '@mui/material';
2
+ import { FieldValues, Path } from 'react-hook-form';
3
+ import { JBFieldControlProps, SelectOption } from './types';
4
+ export type JBAutocompleteFieldProps<TFieldValues extends FieldValues, TName extends Path<TFieldValues>> = JBFieldControlProps<TFieldValues, TName> & Omit<TextFieldProps, 'name' | 'defaultValue' | 'value' | 'onChange' | 'error' | 'helperText'> & {
5
+ options: SelectOption[];
6
+ loading?: boolean;
7
+ disableClearable?: boolean;
8
+ noOptionsText?: string;
9
+ onSearchTextChange?: (value: string) => void;
10
+ };
11
+ export declare function JBAutocompleteField<TFieldValues extends FieldValues, TName extends Path<TFieldValues>>(props: JBAutocompleteFieldProps<TFieldValues, TName>): import("react/jsx-runtime").JSX.Element;
12
+ //# sourceMappingURL=JBAutocompleteField.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JBAutocompleteField.d.ts","sourceRoot":"","sources":["../../src/forms/JBAutocompleteField.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA6C,cAAc,EAAE,MAAM,eAAe,CAAC;AAC1F,OAAO,EAAc,WAAW,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAEhE,OAAO,EAAE,mBAAmB,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAG5D,MAAM,MAAM,wBAAwB,CAClC,YAAY,SAAS,WAAW,EAChC,KAAK,SAAS,IAAI,CAAC,YAAY,CAAC,IAC9B,mBAAmB,CAAC,YAAY,EAAE,KAAK,CAAC,GAC1C,IAAI,CACF,cAAc,EACd,MAAM,GAAG,cAAc,GAAG,OAAO,GAAG,UAAU,GAAG,OAAO,GAAG,YAAY,CACxE,GAAG;IACF,OAAO,EAAE,YAAY,EAAE,CAAC;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,kBAAkB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAC;CAC9C,CAAC;AAEJ,wBAAgB,mBAAmB,CACjC,YAAY,SAAS,WAAW,EAChC,KAAK,SAAS,IAAI,CAAC,YAAY,CAAC,EAChC,KAAK,EAAE,wBAAwB,CAAC,YAAY,EAAE,KAAK,CAAC,2CAwErD"}
@@ -0,0 +1,20 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Autocomplete, CircularProgress, TextField } from '@mui/material';
3
+ import { Controller } from 'react-hook-form';
4
+ import { getJBFieldErrorMessage } from './utils';
5
+ export function JBAutocompleteField(props) {
6
+ const { control, name, rules, options, loading = false, disableClearable = false, noOptionsText = 'Sin opciones', onSearchTextChange, size = 'medium', ...textFieldProps } = props;
7
+ return (_jsx(Controller, { control: control, name: name, rules: rules, render: ({ field, fieldState }) => {
8
+ const selectedOption = options.find((option) => String(option.value) === String(field.value ?? '')) ?? null;
9
+ return (_jsx(Autocomplete, { options: options, value: selectedOption, disabled: textFieldProps.disabled, loading: loading, disableClearable: disableClearable, noOptionsText: noOptionsText, getOptionDisabled: (option) => !!option.disabled, getOptionLabel: (option) => option.label ?? '', isOptionEqualToValue: (option, value) => String(option.value) === String(value.value), onChange: (_, option) => {
10
+ field.onChange(option ? option.value : '');
11
+ }, onInputChange: (_, value, reason) => {
12
+ if (reason === 'input') {
13
+ onSearchTextChange?.(value);
14
+ }
15
+ }, renderInput: (params) => (_jsx(TextField, { ...params, ...textFieldProps, name: field.name, size: size, error: !!fieldState.error, helperText: getJBFieldErrorMessage(fieldState.error), inputRef: field.ref, InputProps: {
16
+ ...params.InputProps,
17
+ endAdornment: (_jsxs(_Fragment, { children: [loading ? (_jsx(CircularProgress, { color: "inherit", size: 16 })) : null, params.InputProps.endAdornment] }))
18
+ } })) }));
19
+ } }));
20
+ }
@@ -1,8 +1,10 @@
1
1
  export * from './types';
2
2
  export * from './utils';
3
3
  export * from './rules';
4
+ export * from './zod';
4
5
  export * from './JBTextField';
5
6
  export * from './JBSelectField';
7
+ export * from './JBAutocompleteField';
6
8
  export * from './JBCheckboxField';
7
9
  export * from './JBSwitchField';
8
10
  export * from './JBRadioGroupField';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/forms/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/forms/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC;AACxB,cAAc,OAAO,CAAC;AACtB,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,uBAAuB,CAAC;AACtC,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC;AACpC,cAAc,qBAAqB,CAAC"}
@@ -1,8 +1,10 @@
1
1
  export * from './types';
2
2
  export * from './utils';
3
3
  export * from './rules';
4
+ export * from './zod';
4
5
  export * from './JBTextField';
5
6
  export * from './JBSelectField';
7
+ export * from './JBAutocompleteField';
6
8
  export * from './JBCheckboxField';
7
9
  export * from './JBSwitchField';
8
10
  export * from './JBRadioGroupField';
@@ -0,0 +1,4 @@
1
+ import { z } from 'zod';
2
+ export declare const normalizeTextInput: (value: string) => string;
3
+ export declare const buildRequiredTextSchema: (label: string, minimumLength?: number) => z.ZodString;
4
+ //# sourceMappingURL=zod.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zod.d.ts","sourceRoot":"","sources":["../../src/forms/zod.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,kBAAkB,GAAI,OAAO,MAAM,KAAG,MAA2C,CAAC;AAE/F,eAAO,MAAM,uBAAuB,GAAI,OAAO,MAAM,EAAE,sBAAiB,KAAG,CAAC,CAAC,SAQ5E,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { z } from 'zod';
2
+ export const normalizeTextInput = (value) => value.trim().replace(/\s+/g, ' ');
3
+ export const buildRequiredTextSchema = (label, minimumLength = 1) => {
4
+ const field = z.string().trim().min(1, `${label} es obligatorio`);
5
+ if (minimumLength <= 1) {
6
+ return field;
7
+ }
8
+ return field.min(minimumLength, `${label} debe tener al menos ${minimumLength} caracteres`);
9
+ };
@@ -1 +1 @@
1
- {"version":3,"file":"JBGrid.d.ts","sourceRoot":"","sources":["../../src/grid/JBGrid.tsx"],"names":[],"mappings":"AAgCA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAItC,wBAAgB,MAAM,CAAC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC,2CAqMtF"}
1
+ {"version":3,"file":"JBGrid.d.ts","sourceRoot":"","sources":["../../src/grid/JBGrid.tsx"],"names":[],"mappings":"AAyCA,OAAO,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEtC,wBAAgB,MAAM,CAAC,KAAK,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAE,WAAW,CAAC,KAAK,CAAC,2CAujBtF"}
@@ -1,26 +1,93 @@
1
- import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { CustomPaging, FilteringState, GroupingState, IntegratedFiltering, IntegratedGrouping, IntegratedSelection, IntegratedSorting, IntegratedSummary, PagingState, SearchState, SelectionState, SortingState, SummaryState } from '@devexpress/dx-react-grid';
3
- import { DragDropProvider, Grid, GroupingPanel, PagingPanel, Table, TableColumnResizing, TableFilterRow, TableGroupRow, TableHeaderRow, TableSelection, TableSummaryRow, Toolbar, } from '@devexpress/dx-react-grid-material-ui';
4
- import { useEffect, useMemo, useState } from 'react';
5
- import { JBBooleanTypeProvider, JBCurrencyTypeProvider, JBImageTypeProvider } from './JBGridProviders';
6
- const DEFAULT_PAGE_SIZES = [10, 30, 50, 100, 200, 500, 1000];
3
+ import { DragDropProvider, Grid, GroupingPanel, PagingPanel, Table, TableColumnResizing, TableFilterRow, TableGroupRow, TableHeaderRow, TableSelection, TableSummaryRow, Toolbar, VirtualTable, } from '@devexpress/dx-react-grid-material-ui';
4
+ import { Box, CircularProgress, TablePagination, Typography } from '@mui/material';
5
+ import { useEffect, useMemo, useRef, useState } from 'react';
6
+ import { resolveGridDefaults } from './defaults';
7
+ import { JBGridLoading } from './JBGridLoading';
8
+ import { JBBooleanTypeProvider, JBCurrencyTypeProvider, JBDateTypeProvider, JBImageTypeProvider } from './JBGridProviders';
7
9
  export function JBGrid(props) {
8
- const { gridConfig, service, rows: controlledRows, searchText, onSearchTextChange, onRowSelected, loadData, loadingComponent, getRowId } = props;
9
- const { defaults } = gridConfig;
10
- const pageSizes = defaults.pageSizes ?? DEFAULT_PAGE_SIZES;
10
+ let error = props.error;
11
+ error = error ? 'No se pudo cargar el listado.' : undefined;
12
+ const { gridConfig, service, rows: controlledRows, totalCount: controlledTotalCount, loading: controlledLoading, isFetching = false, fetchingLabel = 'Actualizando...', currentPage: controlledCurrentPage, onCurrentPageChange, pageSize: controlledPageSize, onPageSizeChange, searchText, onSearchTextChange, onRowSelected, loadData, loadingComponent, getRowId, paginationPosition = 'top', stickyPagination = true, height = '100%', stickyHeader = true, infiniteScroll = false, hasMore = false, isLoadingMore = false, loadMoreThreshold = 200, onLoadMore } = props;
13
+ const defaults = resolveGridDefaults(gridConfig.defaults);
14
+ const pageSizes = defaults.pageSizes;
15
+ const virtualScrolling = defaults.virtualScrolling;
16
+ const rootRef = useRef(null);
17
+ const [containerHeight, setContainerHeight] = useState(defaults.virtualTableHeight);
18
+ const resolvedVirtualTableHeight = defaults.virtualTableHeightMode === 'fill'
19
+ ? Math.max(240, Math.floor(containerHeight * defaults.virtualTableHeightRatio))
20
+ : defaults.virtualTableHeight;
21
+ const isControlledPaging = controlledCurrentPage !== undefined && controlledPageSize !== undefined;
11
22
  const [rows, setRows] = useState(controlledRows ?? []);
12
23
  const [totalCount, setTotalCount] = useState(0);
13
- const [pageSize, setPageSize] = useState(defaults.pageSize || 10);
14
- const [currentPage, setCurrentPage] = useState(0);
15
- const [loading, setLoading] = useState(false);
24
+ const [internalPageSize, setInternalPageSize] = useState(defaults.pageSize);
25
+ const [internalCurrentPage, setInternalCurrentPage] = useState(0);
26
+ const [internalLoading, setInternalLoading] = useState(false);
16
27
  const [lastQuery, setLastQuery] = useState('');
17
28
  const [selection, setSelection] = useState([]);
29
+ const [expandedGroups, setExpandedGroups] = useState(defaults.expandedGroups);
30
+ const currentPage = isControlledPaging ? controlledCurrentPage : internalCurrentPage;
31
+ const pageSize = isControlledPaging ? controlledPageSize : internalPageSize;
32
+ const loading = controlledLoading ?? internalLoading;
33
+ const groupingColumnNames = useMemo(() => (defaults.grouping ?? [])
34
+ .map((grouping) => grouping?.columnName)
35
+ .filter((name) => typeof name === 'string' && name.length > 0), [defaults.grouping]);
36
+ const expandedGroupsFromRows = useMemo(() => {
37
+ if (!defaults.expandGroupedRowsByDefault || groupingColumnNames.length === 0 || rows.length === 0) {
38
+ return [];
39
+ }
40
+ const columnsByName = new Map(gridConfig.columns.map((column) => [column.name, column]));
41
+ const allGroupKeys = new Set();
42
+ rows.forEach((row) => {
43
+ let currentPath = '';
44
+ groupingColumnNames.forEach((columnName) => {
45
+ const column = columnsByName.get(columnName);
46
+ const valueFromGetter = typeof column?.getCellValue === 'function' ? column.getCellValue(row) : row[columnName];
47
+ const value = valueFromGetter === undefined || valueFromGetter === null || valueFromGetter === ''
48
+ ? '-'
49
+ : String(valueFromGetter);
50
+ currentPath = currentPath ? `${currentPath}|${value}` : value;
51
+ allGroupKeys.add(currentPath);
52
+ });
53
+ });
54
+ return Array.from(allGroupKeys);
55
+ }, [defaults.expandGroupedRowsByDefault, gridConfig.columns, groupingColumnNames, rows]);
18
56
  useEffect(() => {
19
57
  if (controlledRows) {
20
58
  setRows(controlledRows);
21
- setTotalCount(controlledRows.length);
22
59
  }
23
60
  }, [controlledRows]);
61
+ useEffect(() => {
62
+ if (defaults.allowGrouping === false) {
63
+ setExpandedGroups([]);
64
+ return;
65
+ }
66
+ const nextExpandedGroups = defaults.expandGroupedRowsByDefault
67
+ ? expandedGroupsFromRows
68
+ : defaults.expandedGroups;
69
+ setExpandedGroups((previous) => {
70
+ if (previous.length === nextExpandedGroups.length &&
71
+ previous.every((value, index) => value === nextExpandedGroups[index])) {
72
+ return previous;
73
+ }
74
+ return nextExpandedGroups;
75
+ });
76
+ }, [
77
+ defaults.allowGrouping,
78
+ defaults.expandGroupedRowsByDefault,
79
+ defaults.expandedGroups,
80
+ expandedGroupsFromRows
81
+ ]);
82
+ useEffect(() => {
83
+ if (controlledTotalCount !== undefined) {
84
+ setTotalCount(controlledTotalCount);
85
+ return;
86
+ }
87
+ if (controlledRows) {
88
+ setTotalCount(controlledRows.length);
89
+ }
90
+ }, [controlledRows, controlledTotalCount]);
24
91
  const computeQueryString = useMemo(() => () => `pageSize=${pageSize}&skip=${pageSize * currentPage}&terms=${searchText || ''}`, [currentPage, pageSize, searchText]);
25
92
  useEffect(() => {
26
93
  if (controlledRows)
@@ -33,7 +100,7 @@ export function JBGrid(props) {
33
100
  setRows,
34
101
  setTotalCount,
35
102
  setLastQuery,
36
- setLoading,
103
+ setLoading: setInternalLoading,
37
104
  getQueryString: computeQueryString,
38
105
  currentPage,
39
106
  pageSize,
@@ -47,14 +114,14 @@ export function JBGrid(props) {
47
114
  if (queryString === lastQuery || loading)
48
115
  return;
49
116
  try {
50
- setLoading(true);
117
+ setInternalLoading(true);
51
118
  const response = await service.list(currentPage, pageSize, searchText);
52
119
  setRows(response?.data?.results ?? []);
53
120
  setTotalCount(response?.data?.count ?? 0);
54
121
  setLastQuery(queryString);
55
122
  }
56
123
  finally {
57
- setLoading(false);
124
+ setInternalLoading(false);
58
125
  }
59
126
  };
60
127
  void execute();
@@ -69,6 +136,20 @@ export function JBGrid(props) {
69
136
  searchText,
70
137
  service
71
138
  ]);
139
+ const handleCurrentPageChange = (nextPage) => {
140
+ if (isControlledPaging) {
141
+ onCurrentPageChange?.(nextPage);
142
+ return;
143
+ }
144
+ setInternalCurrentPage(nextPage);
145
+ };
146
+ const handlePageSizeChange = (nextPageSize) => {
147
+ if (isControlledPaging) {
148
+ onPageSizeChange?.(nextPageSize);
149
+ return;
150
+ }
151
+ setInternalPageSize(nextPageSize);
152
+ };
72
153
  const handleSelection = (nextSelection) => {
73
154
  const lastSelected = nextSelection.find((selected) => selection.indexOf(selected) === -1);
74
155
  if (lastSelected === undefined) {
@@ -76,8 +157,7 @@ export function JBGrid(props) {
76
157
  return;
77
158
  }
78
159
  setSelection([lastSelected]);
79
- const selectedIndex = typeof lastSelected === 'number' ? lastSelected : Number.parseInt(String(lastSelected), 10);
80
- const selectedRow = rows[selectedIndex];
160
+ const selectedRow = rows.find((row) => rowIdGetter(row) === lastSelected);
81
161
  if (selectedRow && onRowSelected) {
82
162
  onRowSelected(selectedRow);
83
163
  }
@@ -85,5 +165,169 @@ export function JBGrid(props) {
85
165
  const rowIdGetter = getRowId
86
166
  ? (row) => getRowId(row)
87
167
  : (row) => row.id;
88
- return (_jsx("div", { style: { width: '100%', height: '100%' }, children: loading ? (_jsx("div", { children: loadingComponent ?? _jsx("span", { children: "Loading..." }) })) : (_jsxs(Grid, { rows: rows, columns: gridConfig.columns, getRowId: rowIdGetter, children: [_jsx(SortingState, { defaultSorting: defaults.sorting }), _jsx(PagingState, { currentPage: currentPage, onCurrentPageChange: setCurrentPage, pageSize: pageSize, onPageSizeChange: setPageSize }), _jsx(GroupingState, { defaultGrouping: defaults.grouping, defaultExpandedGroups: defaults.expandedGroups }), _jsx(SummaryState, { totalItems: gridConfig.totalSummaryItems, groupItems: gridConfig.groupSummaryItems }), _jsx(FilteringState, { defaultFilters: defaults.filters }), _jsx(SearchState, { value: searchText, onValueChange: onSearchTextChange }), _jsx(SelectionState, { selection: selection, onSelectionChange: handleSelection }), defaults.allowGrouping !== false ? _jsx(IntegratedGrouping, {}) : null, _jsx(IntegratedFiltering, {}), _jsx(IntegratedSorting, {}), _jsx(IntegratedSelection, {}), _jsx(IntegratedSummary, {}), _jsx(DragDropProvider, {}), gridConfig.booleanColumns?.length ? (_jsx(JBBooleanTypeProvider, { for: gridConfig.booleanColumns })) : null, gridConfig.imageColumns?.length ? _jsx(JBImageTypeProvider, { for: gridConfig.imageColumns }) : null, gridConfig.currencyColumns?.length ? (_jsx(JBCurrencyTypeProvider, { for: gridConfig.currencyColumns })) : null, _jsx(Table, { columnExtensions: gridConfig.tableColumnExtensions }), defaults.allowColumnResizing !== false ? (_jsx(TableColumnResizing, { defaultColumnWidths: gridConfig.columnsWidths })) : null, defaults.allowSelection !== false ? (_jsx(TableSelection, { showSelectAll: defaults.allowSelectAll, showSelectionColumn: defaults.showSelectionColumn, selectByRowClick: true, highlightRow: true })) : null, _jsx(TableHeaderRow, { showSortingControls: defaults.allowSorting !== false }), defaults.allowFiltering ? (_jsx(TableFilterRow, { showFilterSelector: defaults.advancedFiltering })) : null, _jsx(PagingPanel, { pageSizes: pageSizes }), defaults.allowGrouping !== false ? (_jsx(TableGroupRow, { showColumnsWhenGrouped: false })) : null, _jsx(Toolbar, {}), defaults.allowGrouping !== false ? _jsx(GroupingPanel, { showSortingControls: true }) : null, _jsx(TableSummaryRow, {}), _jsx(CustomPaging, { totalCount: totalCount })] })) }));
168
+ const showTopPagination = paginationPosition === 'top' || paginationPosition === 'both';
169
+ const showBottomPagination = paginationPosition === 'bottom' || paginationPosition === 'both';
170
+ const showPaging = paginationPosition !== 'none';
171
+ const showFetchingIndicator = isFetching && !loading;
172
+ const handleRowsPerPageChange = (event) => {
173
+ const nextPageSize = Number.parseInt(event.target.value, 10);
174
+ handlePageSizeChange(nextPageSize);
175
+ handleCurrentPageChange(0);
176
+ };
177
+ useEffect(() => {
178
+ if (!virtualScrolling || defaults.virtualTableHeightMode !== 'fill' || !rootRef.current)
179
+ return;
180
+ const node = rootRef.current;
181
+ const observer = new ResizeObserver((entries) => {
182
+ const entry = entries[0];
183
+ if (!entry)
184
+ return;
185
+ setContainerHeight(entry.contentRect.height);
186
+ });
187
+ observer.observe(node);
188
+ return () => observer.disconnect();
189
+ }, [defaults.virtualTableHeightMode, virtualScrolling]);
190
+ useEffect(() => {
191
+ if (!virtualScrolling || !infiniteScroll || !onLoadMore || !rootRef.current)
192
+ return;
193
+ const tableContainer = rootRef.current.querySelector('.MuiTableContainer-root');
194
+ if (!tableContainer)
195
+ return;
196
+ const handleScroll = () => {
197
+ const target = tableContainer;
198
+ const distanceToBottom = target.scrollHeight - (target.scrollTop + target.clientHeight);
199
+ if (distanceToBottom <= loadMoreThreshold && hasMore && !isLoadingMore) {
200
+ onLoadMore();
201
+ }
202
+ };
203
+ tableContainer.addEventListener('scroll', handleScroll, { passive: true });
204
+ return () => tableContainer.removeEventListener('scroll', handleScroll);
205
+ }, [hasMore, infiniteScroll, isLoadingMore, loadMoreThreshold, onLoadMore, rows.length, virtualScrolling]);
206
+ useEffect(() => {
207
+ if (!rootRef.current)
208
+ return;
209
+ const contentWrapper = rootRef.current.closest('.FusePageCarded-contentWrapper');
210
+ const contentNode = rootRef.current.closest('.FusePageCarded-content');
211
+ if (!contentWrapper)
212
+ return;
213
+ const lockCount = Number.parseInt(contentWrapper.dataset.jbGridLockCount ?? '0', 10) || 0;
214
+ contentWrapper.dataset.jbGridLockCount = String(lockCount + 1);
215
+ if (lockCount === 0) {
216
+ const prevWrapperOverflow = contentWrapper.style.overflow;
217
+ const prevWrapperScrollbarWidth = contentWrapper.style.scrollbarWidth;
218
+ const prevContentOverflow = contentNode?.style.overflow ?? '';
219
+ const prevContentHeight = contentNode?.style.height ?? '';
220
+ const prevContentMinHeight = contentNode?.style.minHeight ?? '';
221
+ contentWrapper.dataset.jbGridPrevOverflow = prevWrapperOverflow;
222
+ contentWrapper.dataset.jbGridPrevScrollbarWidth = prevWrapperScrollbarWidth ?? '';
223
+ contentWrapper.dataset.jbGridPrevContentOverflow = prevContentOverflow;
224
+ contentWrapper.dataset.jbGridPrevContentHeight = prevContentHeight;
225
+ contentWrapper.dataset.jbGridPrevContentMinHeight = prevContentMinHeight;
226
+ contentWrapper.style.overflow = 'hidden';
227
+ contentWrapper.style.scrollbarWidth = 'none';
228
+ // Hide perfect-scrollbar rails when present in Fuse wrappers.
229
+ const rails = contentWrapper.querySelectorAll('.ps__rail-x, .ps__rail-y');
230
+ rails.forEach((rail) => {
231
+ rail.dataset.jbGridPrevDisplay = rail.style.display ?? '';
232
+ rail.style.display = 'none';
233
+ });
234
+ if (contentNode) {
235
+ contentNode.style.overflow = 'hidden';
236
+ contentNode.style.height = '100%';
237
+ contentNode.style.minHeight = '0';
238
+ }
239
+ }
240
+ return () => {
241
+ const currentCount = Number.parseInt(contentWrapper.dataset.jbGridLockCount ?? '1', 10) || 1;
242
+ const nextCount = Math.max(0, currentCount - 1);
243
+ contentWrapper.dataset.jbGridLockCount = String(nextCount);
244
+ if (nextCount > 0)
245
+ return;
246
+ contentWrapper.style.overflow = contentWrapper.dataset.jbGridPrevOverflow ?? '';
247
+ contentWrapper.style.scrollbarWidth =
248
+ contentWrapper.dataset.jbGridPrevScrollbarWidth ?? '';
249
+ const rails = contentWrapper.querySelectorAll('.ps__rail-x, .ps__rail-y');
250
+ rails.forEach((rail) => {
251
+ rail.style.display = rail.dataset.jbGridPrevDisplay ?? '';
252
+ delete rail.dataset.jbGridPrevDisplay;
253
+ });
254
+ if (contentNode) {
255
+ contentNode.style.overflow = contentWrapper.dataset.jbGridPrevContentOverflow ?? '';
256
+ contentNode.style.height = contentWrapper.dataset.jbGridPrevContentHeight ?? '';
257
+ contentNode.style.minHeight = contentWrapper.dataset.jbGridPrevContentMinHeight ?? '';
258
+ }
259
+ delete contentWrapper.dataset.jbGridPrevOverflow;
260
+ delete contentWrapper.dataset.jbGridPrevScrollbarWidth;
261
+ delete contentWrapper.dataset.jbGridPrevContentOverflow;
262
+ delete contentWrapper.dataset.jbGridPrevContentHeight;
263
+ delete contentWrapper.dataset.jbGridPrevContentMinHeight;
264
+ };
265
+ }, []);
266
+ return (_jsx(Box, { className: "jb-grid-root", ref: rootRef, sx: {
267
+ width: '100%',
268
+ height,
269
+ minHeight: 0,
270
+ overflow: virtualScrolling ? 'hidden !important' : 'auto',
271
+ ...(!virtualScrolling && stickyHeader
272
+ ? {
273
+ '& .MuiTableCell-head': {
274
+ position: 'sticky',
275
+ top: 0,
276
+ zIndex: 2,
277
+ backgroundColor: 'background.paper'
278
+ }
279
+ }
280
+ : undefined),
281
+ ...(virtualScrolling
282
+ ? {
283
+ '& .dx-rg-grid': {
284
+ height: '100%',
285
+ minHeight: 0
286
+ },
287
+ '& .MuiTableContainer-root': {
288
+ overflowY: 'auto !important',
289
+ overflowX: 'auto',
290
+ overscrollBehavior: 'contain',
291
+ maxHeight: `${resolvedVirtualTableHeight}px`
292
+ }
293
+ }
294
+ : undefined)
295
+ }, children: error ? (_jsx(Box, { sx: { p: 2 }, children: typeof error === 'string' ? _jsx(Typography, { color: "error.main", children: error }) : error })) : loading ? (_jsx("div", { children: loadingComponent ?? _jsx(JBGridLoading, { message: "" }) })) : rows.length === 0 ? (_jsx(Box, { sx: {
296
+ width: '100%',
297
+ minHeight: 280,
298
+ display: 'flex',
299
+ alignItems: 'center',
300
+ justifyContent: 'center',
301
+ textAlign: 'center',
302
+ p: 3
303
+ }, children: props.emptyComponent ?? (_jsx(Typography, { variant: "h5", sx: { fontWeight: 600 }, color: "text.secondary", children: "No hay resultados." })) })) : (_jsxs(_Fragment, { children: [showTopPagination ? (_jsxs(Box, { sx: {
304
+ display: 'flex',
305
+ alignItems: 'center',
306
+ justifyContent: 'space-between',
307
+ px: 1,
308
+ ...(stickyPagination
309
+ ? {
310
+ position: 'sticky',
311
+ top: 0,
312
+ zIndex: 3,
313
+ backgroundColor: 'background.paper',
314
+ borderBottom: '1px solid',
315
+ borderColor: 'divider'
316
+ }
317
+ : undefined)
318
+ }, children: [_jsx(Box, { sx: {
319
+ display: 'flex',
320
+ alignItems: 'center',
321
+ gap: 1,
322
+ minHeight: 40
323
+ }, children: showFetchingIndicator ? (_jsxs(_Fragment, { children: [_jsx(CircularProgress, { size: 16, color: "secondary" }), _jsx(Typography, { variant: "body2", color: "text.secondary", children: fetchingLabel })] })) : null }), _jsx(TablePagination, { component: "div", count: totalCount, page: currentPage, onPageChange: (_, nextPage) => handleCurrentPageChange(nextPage), rowsPerPage: pageSize, onRowsPerPageChange: handleRowsPerPageChange, rowsPerPageOptions: pageSizes })] })) : null, _jsxs(Grid, { rows: rows, columns: gridConfig.columns, getRowId: rowIdGetter, children: [_jsx(SortingState, { defaultSorting: defaults.sorting }), showPaging ? (_jsx(PagingState, { currentPage: currentPage, onCurrentPageChange: handleCurrentPageChange, pageSize: pageSize, onPageSizeChange: handlePageSizeChange })) : null, _jsx(GroupingState, { defaultGrouping: defaults.grouping, expandedGroups: expandedGroups, onExpandedGroupsChange: (nextExpandedGroups) => setExpandedGroups(nextExpandedGroups ?? []) }), _jsx(SummaryState, { totalItems: gridConfig.totalSummaryItems, groupItems: gridConfig.groupSummaryItems }), _jsx(FilteringState, { defaultFilters: defaults.filters }), _jsx(SearchState, { value: searchText, onValueChange: onSearchTextChange }), _jsx(SelectionState, { selection: selection, onSelectionChange: handleSelection }), defaults.allowGrouping !== false ? _jsx(IntegratedGrouping, {}) : null, _jsx(IntegratedFiltering, {}), _jsx(IntegratedSorting, {}), _jsx(IntegratedSelection, {}), _jsx(IntegratedSummary, {}), _jsx(DragDropProvider, {}), gridConfig.booleanColumns?.length ? (_jsx(JBBooleanTypeProvider, { for: gridConfig.booleanColumns })) : null, gridConfig.imageColumns?.length ? _jsx(JBImageTypeProvider, { for: gridConfig.imageColumns }) : null, gridConfig.currencyColumns?.length ? (_jsx(JBCurrencyTypeProvider, { for: gridConfig.currencyColumns })) : null, gridConfig.dateColumns?.length ? _jsx(JBDateTypeProvider, { for: gridConfig.dateColumns }) : null, virtualScrolling ? (_jsx(VirtualTable, { columnExtensions: gridConfig.tableColumnExtensions, estimatedRowHeight: defaults.estimatedRowHeight, height: resolvedVirtualTableHeight })) : (_jsx(Table, { columnExtensions: gridConfig.tableColumnExtensions })), defaults.allowColumnResizing !== false ? (_jsx(TableColumnResizing, { defaultColumnWidths: gridConfig.columnsWidths })) : null, defaults.allowSelection !== false ? (_jsx(TableSelection, { showSelectAll: defaults.allowSelectAll, showSelectionColumn: defaults.showSelectionColumn, selectByRowClick: true, highlightRow: true })) : null, _jsx(TableHeaderRow, { showSortingControls: defaults.allowSorting !== false }), defaults.allowFiltering ? (_jsx(TableFilterRow, { showFilterSelector: defaults.advancedFiltering })) : null, showBottomPagination ? (_jsx(Box, { sx: stickyPagination
324
+ ? {
325
+ position: 'sticky',
326
+ bottom: 0,
327
+ zIndex: 3,
328
+ backgroundColor: 'background.paper',
329
+ borderTop: '1px solid',
330
+ borderColor: 'divider'
331
+ }
332
+ : undefined, children: _jsx(PagingPanel, { pageSizes: pageSizes }) })) : null, defaults.allowGrouping !== false ? (_jsx(TableGroupRow, { showColumnsWhenGrouped: false })) : null, _jsx(Toolbar, {}), defaults.allowGrouping !== false ? _jsx(GroupingPanel, { showSortingControls: true }) : null, _jsx(TableSummaryRow, {}), showPaging ? _jsx(CustomPaging, { totalCount: totalCount }) : null] }), virtualScrolling && infiniteScroll && isLoadingMore ? (_jsx(Box, { sx: { py: 1, display: 'flex', justifyContent: 'center' }, children: _jsx(CircularProgress, { size: 20 }) })) : null] })) }));
89
333
  }
@@ -1 +1 @@
1
- {"version":3,"file":"JBGridHeader.d.ts","sourceRoot":"","sources":["../../src/grid/JBGridHeader.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAE5C,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,2CAiEpD"}
1
+ {"version":3,"file":"JBGridHeader.d.ts","sourceRoot":"","sources":["../../src/grid/JBGridHeader.tsx"],"names":[],"mappings":"AAIA,OAAO,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAE5C,wBAAgB,YAAY,CAAC,KAAK,EAAE,iBAAiB,2CAsKpD"}
@@ -1,22 +1,93 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
2
  import { Box, Button, InputBase, Paper, Typography } from '@mui/material';
3
+ import SearchRoundedIcon from '@mui/icons-material/SearchRounded';
4
+ import AddRoundedIcon from '@mui/icons-material/AddRounded';
3
5
  export function JBGridHeader(props) {
4
- const { title, icon, searchText, onSearchTextChange, searchPlaceholder = 'Search...', allowCreate = true, createButtonLabel = 'Create', onCreateClick, rightContent } = props;
6
+ const { moduleConfig, iconNameRenderer, animated = true, animationDurationMs = 240, animationStaggerMs = 60, animationPreset = 'vertical', breadcrumb, title, subtitle, icon, searchText, onSearchTextChange, searchPlaceholder, allowCreate = true, createButtonLabel, onCreateClick, rightContent } = props;
7
+ const resolvedTitle = title ?? moduleConfig?.texts?.moduleName ?? '';
8
+ const resolvedSubtitle = subtitle ?? moduleConfig?.texts?.formHeaderSubtitle ?? '';
9
+ const resolvedSearchPlaceholder = searchPlaceholder ?? moduleConfig?.texts?.searchPlaceholder ?? 'Search...';
10
+ const resolvedCreateLabel = createButtonLabel ?? moduleConfig?.texts?.newText ?? 'Create';
11
+ const resolvedIcon = icon ?? (moduleConfig?.texts?.iconName && iconNameRenderer
12
+ ? iconNameRenderer(moduleConfig.texts.iconName)
13
+ : null);
14
+ const animateSx = (delayMs) => animated
15
+ ? {
16
+ animation: `jbGridHeaderFadeIn ${animationDurationMs}ms ease-out ${delayMs}ms both`
17
+ }
18
+ : undefined;
19
+ const animateFromLeftSx = (delayMs) => animated && animationPreset === 'sides'
20
+ ? {
21
+ animation: `jbGridHeaderFadeInLeft ${animationDurationMs}ms ease-out ${delayMs}ms both`
22
+ }
23
+ : animateSx(delayMs);
24
+ const animateFromRightSx = (delayMs) => animated && animationPreset === 'sides'
25
+ ? {
26
+ animation: `jbGridHeaderFadeInRight ${animationDurationMs}ms ease-out ${delayMs}ms both`
27
+ }
28
+ : animateSx(delayMs);
5
29
  return (_jsxs(Box, { sx: {
30
+ width: '100%',
6
31
  display: 'flex',
7
- flexDirection: { xs: 'column', sm: 'row' },
8
- alignItems: { xs: 'stretch', sm: 'center' },
9
- justifyContent: 'space-between',
32
+ flexDirection: 'column',
10
33
  gap: 2,
11
- p: 2
12
- }, children: [_jsxs(Box, { sx: { display: 'flex', alignItems: 'center', gap: 1 }, children: [icon, _jsx(Typography, { variant: "h5", sx: { fontWeight: 700 }, children: title })] }), _jsxs(Box, { sx: {
13
- display: 'flex',
14
- alignItems: 'center',
15
- gap: 1,
16
- width: { xs: '100%', sm: 'auto' }
17
- }, children: [_jsx(Paper, { sx: {
18
- px: 1.5,
19
- py: 0.5,
20
- width: { xs: '100%', sm: 300 }
21
- }, children: _jsx(InputBase, { fullWidth: true, placeholder: searchPlaceholder, value: searchText, onChange: (event) => onSearchTextChange(event.target.value) }) }), rightContent, allowCreate && onCreateClick ? (_jsx(Button, { variant: "contained", onClick: onCreateClick, children: createButtonLabel })) : null] })] }));
34
+ p: { xs: 2, md: 3 },
35
+ '@keyframes jbGridHeaderFadeIn': {
36
+ from: { opacity: 0, transform: 'translateY(8px)' },
37
+ to: { opacity: 1, transform: 'translateY(0)' }
38
+ },
39
+ '@keyframes jbGridHeaderFadeInLeft': {
40
+ from: { opacity: 0, transform: 'translateX(-14px)' },
41
+ to: { opacity: 1, transform: 'translateX(0)' }
42
+ },
43
+ '@keyframes jbGridHeaderFadeInRight': {
44
+ from: { opacity: 0, transform: 'translateX(14px)' },
45
+ to: { opacity: 1, transform: 'translateX(0)' }
46
+ }
47
+ }, children: [breadcrumb ? _jsx(Box, { sx: animateSx(0), children: breadcrumb }) : null, _jsxs(Box, { sx: {
48
+ display: { xs: 'flex', md: 'grid' },
49
+ flexDirection: { xs: 'column', md: 'row' },
50
+ gridTemplateColumns: { md: 'minmax(0, 1fr) auto' },
51
+ alignItems: { xs: 'center', md: 'center' },
52
+ gap: 2,
53
+ width: '100%'
54
+ }, children: [_jsxs(Box, { sx: {
55
+ display: 'flex',
56
+ alignItems: 'center',
57
+ justifyContent: { xs: 'center', md: 'flex-start' },
58
+ gap: 1,
59
+ minWidth: 0,
60
+ width: '100%',
61
+ ...animateFromLeftSx(animationStaggerMs)
62
+ }, children: [resolvedIcon ? _jsx(Box, { sx: { display: 'inline-flex', alignItems: 'center' }, children: resolvedIcon }) : null, _jsxs(Box, { sx: { minWidth: 0, textAlign: { xs: 'center', md: 'left' } }, children: [_jsx(Typography, { variant: "h4", sx: { fontWeight: 700, lineHeight: 1.15 }, children: resolvedTitle }), resolvedSubtitle ? (_jsx(Typography, { variant: "body2", color: "text.secondary", children: resolvedSubtitle })) : null] })] }), _jsxs(Box, { sx: {
63
+ width: { xs: '100%', md: 'auto' },
64
+ display: 'flex',
65
+ alignItems: { xs: 'center', md: 'center' },
66
+ justifySelf: { md: 'end' },
67
+ justifyContent: { xs: 'center', md: 'flex-end' },
68
+ flexWrap: 'wrap',
69
+ gap: 1,
70
+ minWidth: 0,
71
+ ...animateFromRightSx(animationStaggerMs * 2)
72
+ }, children: [_jsxs(Paper, { sx: {
73
+ px: 1.5,
74
+ py: 0.5,
75
+ width: { xs: '100%', md: 320 },
76
+ display: 'flex',
77
+ alignItems: 'center',
78
+ gap: 1,
79
+ borderRadius: 1.5
80
+ }, children: [_jsx(SearchRoundedIcon, { sx: { color: 'text.secondary', fontSize: 20 } }), _jsx(InputBase, { fullWidth: true, placeholder: resolvedSearchPlaceholder, value: searchText, onChange: (event) => onSearchTextChange(event.target.value) })] }), rightContent, allowCreate && onCreateClick ? (_jsx(Button, { variant: "contained", startIcon: _jsx(AddRoundedIcon, { fontSize: "small" }), sx: (theme) => ({
81
+ borderRadius: 1.5,
82
+ minHeight: 42,
83
+ px: 2.25,
84
+ fontWeight: 700,
85
+ boxShadow: 'none',
86
+ backgroundImage: 'none',
87
+ '&:hover': {
88
+ boxShadow: 'none',
89
+ backgroundImage: 'none',
90
+ backgroundColor: theme.palette.primary.dark
91
+ }
92
+ }), onClick: onCreateClick, children: resolvedCreateLabel })) : null] })] })] }));
22
93
  }
@@ -0,0 +1,9 @@
1
+ type JBGridLoadingProps = {
2
+ minHeight?: number;
3
+ size?: number;
4
+ message?: string;
5
+ color?: 'primary' | 'secondary' | 'inherit';
6
+ };
7
+ export declare function JBGridLoading(props: JBGridLoadingProps): import("react/jsx-runtime").JSX.Element;
8
+ export {};
9
+ //# sourceMappingURL=JBGridLoading.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"JBGridLoading.d.ts","sourceRoot":"","sources":["../../src/grid/JBGridLoading.tsx"],"names":[],"mappings":"AAEA,KAAK,kBAAkB,GAAG;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,SAAS,GAAG,WAAW,GAAG,SAAS,CAAC;CAC7C,CAAC;AAEF,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,2CA2BtD"}
@@ -0,0 +1,14 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, CircularProgress, Typography } from '@mui/material';
3
+ export function JBGridLoading(props) {
4
+ const { minHeight = 320, size = 40, message, color = 'primary' } = props;
5
+ return (_jsxs(Box, { sx: {
6
+ width: '100%',
7
+ minHeight,
8
+ display: 'flex',
9
+ flexDirection: 'column',
10
+ alignItems: 'center',
11
+ justifyContent: 'center',
12
+ gap: 1.25
13
+ }, children: [_jsx(CircularProgress, { size: size, color: color }), message ? (_jsx(Typography, { variant: "body2", color: "text.secondary", children: message })) : null] }));
14
+ }
@@ -4,6 +4,9 @@ export declare const JBBooleanTypeProvider: (props: {
4
4
  export declare const JBCurrencyTypeProvider: (props: {
5
5
  for: string[];
6
6
  }) => import("react/jsx-runtime").JSX.Element;
7
+ export declare const JBDateTypeProvider: (props: {
8
+ for: string[];
9
+ }) => import("react/jsx-runtime").JSX.Element;
7
10
  export declare const JBImageTypeProvider: (props: {
8
11
  for: string[];
9
12
  }) => import("react/jsx-runtime").JSX.Element;
@@ -1 +1 @@
1
- {"version":3,"file":"JBGridProviders.d.ts","sourceRoot":"","sources":["../../src/grid/JBGridProviders.tsx"],"names":[],"mappings":"AA2DA,eAAO,MAAM,qBAAqB,GAAI,OAAO;IAAE,GAAG,EAAE,MAAM,EAAE,CAAA;CAAE,4CAK7D,CAAC;AAEF,eAAO,MAAM,sBAAsB,GAAI,OAAO;IAAE,GAAG,EAAE,MAAM,EAAE,CAAA;CAAE,4CAK9D,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAI,OAAO;IAAE,GAAG,EAAE,MAAM,EAAE,CAAA;CAAE,4CAK3D,CAAC"}
1
+ {"version":3,"file":"JBGridProviders.d.ts","sourceRoot":"","sources":["../../src/grid/JBGridProviders.tsx"],"names":[],"mappings":"AA0EA,eAAO,MAAM,qBAAqB,GAAI,OAAO;IAAE,GAAG,EAAE,MAAM,EAAE,CAAA;CAAE,4CAK7D,CAAC;AAEF,eAAO,MAAM,sBAAsB,GAAI,OAAO;IAAE,GAAG,EAAE,MAAM,EAAE,CAAA;CAAE,4CAK9D,CAAC;AAEF,eAAO,MAAM,kBAAkB,GAAI,OAAO;IAAE,GAAG,EAAE,MAAM,EAAE,CAAA;CAAE,4CAK1D,CAAC;AAEF,eAAO,MAAM,mBAAmB,GAAI,OAAO;IAAE,GAAG,EAAE,MAAM,EAAE,CAAA;CAAE,4CAK3D,CAAC"}