@pagamio/frontend-commons-lib 0.8.311 → 0.8.313
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/components/ui/DetailsCard.js +1 -4
- package/lib/components/ui/DetailsPage.js +1 -1
- package/lib/components/ui/FilterComponent.js +2 -2
- package/lib/components/ui/FilterWrapper.js +1 -3
- package/lib/components/ui/StatusCell.js +1 -1
- package/lib/pagamio-table/data-table/Defaults.js +13 -0
- package/lib/pagamio-table/data-table/index.js +88 -10
- package/lib/styles.css +17 -11
- package/package.json +1 -1
|
@@ -8,9 +8,6 @@ const DetailsCard = ({ data, loading, buttonText, showButton = true, onClickButt
|
|
|
8
8
|
}
|
|
9
9
|
const rightPanelItem = data.find((item) => item.layout === 'rightPanel' || item.id === '__details_right_panel__');
|
|
10
10
|
const leftData = rightPanelItem ? data.filter((item) => item !== rightPanelItem) : data;
|
|
11
|
-
return (_jsx("div", { className: "flex flex-col", children: _jsxs(Card, { children: [loading ? (_jsx("div", { className: "
|
|
12
|
-
const capitalizedLabel = item.label.charAt(0).toUpperCase() + item.label.slice(1);
|
|
13
|
-
return (_jsxs("div", { className: "flex flex-col", children: [_jsx("div", { className: "mb-1 font-medium text-sm text-muted-foreground", children: capitalizedLabel }), _jsx("div", { className: "text-foreground text-sm break-words", children: item.value })] }, item.id ?? `${item.label}-${index}`));
|
|
14
|
-
}) }), rightPanelItem && (_jsxs("div", { className: "lg:w-[320px] lg:shrink-0 lg:border-l lg:border-border lg:pl-6", children: [_jsx("div", { className: "mb-2 font-medium text-sm text-muted-foreground", children: rightPanelItem.label.charAt(0).toUpperCase() + rightPanelItem.label.slice(1) }), _jsx("div", { className: "text-foreground text-sm break-words", children: rightPanelItem.value })] }))] })), !loading && (_jsxs("div", { className: "flex justify-end gap-2 items-center", children: [actionContent && _jsx("div", { className: "flex-1 flex flex-row text-sm justify-end", children: actionContent }), showButton && (_jsx("div", { className: `flex ${actionContent ? 'justify-end' : 'justify-center sm:justify-end'}`, children: _jsx(Button, { type: "button", variant: "primary", disabled: loading, onClick: onClickButton, className: "text-sm", children: buttonText }) }))] }))] }) }));
|
|
11
|
+
return (_jsx("div", { className: "flex flex-col mb-4", children: _jsxs(Card, { children: [loading ? (_jsx("div", { className: "flex items-center justify-center py-8", children: _jsx(LoaderComponent, {}) })) : (_jsxs("div", { className: "flex flex-col lg:flex-row gap-6", children: [_jsx("div", { className: "flex-1 min-w-0", children: _jsx("div", { className: "grid grid-cols-2 md:grid-cols-3 xl:grid-cols-4 gap-x-6 gap-y-4", children: leftData.map((item, index) => (_jsxs("div", { className: "flex flex-col min-w-0", children: [_jsx("div", { className: "mb-0.5 text-xs font-medium text-muted-foreground uppercase tracking-wide", children: item.label.charAt(0).toUpperCase() + item.label.slice(1) }), _jsx("div", { className: "text-foreground text-sm break-words", children: item.value })] }, item.id ?? `${item.label}-${index}`))) }) }), rightPanelItem && (_jsxs("div", { className: "lg:w-[320px] lg:shrink-0 lg:border-l lg:border-border lg:pl-6 flex flex-col gap-2", children: [_jsx("div", { className: "text-xs font-medium text-muted-foreground uppercase tracking-wide", children: rightPanelItem.label.charAt(0).toUpperCase() + rightPanelItem.label.slice(1) }), _jsx("div", { className: "text-foreground text-sm break-words", children: rightPanelItem.value })] }))] })), !loading && (actionContent || showButton) && (_jsxs("div", { className: "flex flex-wrap justify-end gap-2 items-center mt-2", children: [actionContent && _jsx("div", { className: "flex flex-wrap gap-2", children: actionContent }), showButton && (_jsx(Button, { type: "button", variant: "primary", disabled: loading, onClick: onClickButton, className: "text-sm", children: buttonText }))] }))] }) }));
|
|
15
12
|
};
|
|
16
13
|
export default DetailsCard;
|
|
@@ -45,6 +45,6 @@ const DetailsPage = ({ id, parentId, title, loading, detailsData, canEdit, onEdi
|
|
|
45
45
|
}, [id, parentId, entityName, parentEntityName, updateBreadcrumb]);
|
|
46
46
|
// Capitalize the component for JSX usage
|
|
47
47
|
const TabComponent = tabComponent;
|
|
48
|
-
return (_jsxs("div", { children: [_jsx(AppPageHeader, { title: title }), _jsx(DetailsCard, { loading: loading, data: formattedDetailsData, buttonText: editButtonText, showButton: canEdit, onClickButton: onEdit || (() => { }), actionContent: actionContent }), TabComponent && _jsx(TabComponent, { ...tabProps }), formEngineConfig && (_jsx(FormEngineDrawer, { title: formEngineConfig.title, isOpen: formEngineConfig.isOpen, onClose: formEngineConfig.onClose, onSubmit: formEngineConfig.onSubmit, fields: formEngineConfig.fields, initialValues: formEngineConfig.initialValues, submitButtonText: formEngineConfig.submitButtonText, marginTop: formEngineConfig.marginTop, onFieldChange: formEngineConfig.onFieldChange, onFieldUpdate: formEngineConfig.onFieldUpdate, persistenceKey: formEngineConfig.persistenceKey, children: formEngineConfig.children }, formEngineConfig.drawerKey))] }));
|
|
48
|
+
return (_jsxs("div", { children: [_jsx(AppPageHeader, { title: title }), _jsx(DetailsCard, { loading: loading, data: formattedDetailsData, buttonText: editButtonText, showButton: canEdit, onClickButton: onEdit || (() => { }), actionContent: actionContent }), TabComponent && (_jsx("div", { className: "mt-2", children: _jsx(TabComponent, { ...tabProps }) })), formEngineConfig && (_jsx(FormEngineDrawer, { title: formEngineConfig.title, isOpen: formEngineConfig.isOpen, onClose: formEngineConfig.onClose, onSubmit: formEngineConfig.onSubmit, fields: formEngineConfig.fields, initialValues: formEngineConfig.initialValues, submitButtonText: formEngineConfig.submitButtonText, marginTop: formEngineConfig.marginTop, onFieldChange: formEngineConfig.onFieldChange, onFieldUpdate: formEngineConfig.onFieldUpdate, persistenceKey: formEngineConfig.persistenceKey, children: formEngineConfig.children }, formEngineConfig.drawerKey))] }));
|
|
49
49
|
};
|
|
50
50
|
export default DetailsPage;
|
|
@@ -31,7 +31,7 @@ const FilterComponent = ({ filters, selectedFilters, showApplyFilterButton = tru
|
|
|
31
31
|
resetFilters();
|
|
32
32
|
}
|
|
33
33
|
};
|
|
34
|
-
return (_jsxs(FilterWrapper, { isNarrow: isNarrow, children: [_jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [showSearch && (_jsxs("div", { className: "relative w-full sm:w-[300px]", children: [_jsx(IconSearch, { size: 16, className: "pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 text-muted-foreground" }), _jsx("input", { type: "text", placeholder: searctInputPlaceHolder, value: searchQuery, onChange: onSearch, onKeyDown: handleSearchKeyDown, "aria-label": "Search", className: cn('h-9 w-full rounded-md border border-border bg-background pl-9 pr-3 text-sm text-foreground', 'placeholder:text-muted-foreground', 'focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring', 'disabled:cursor-not-allowed disabled:opacity-50') })] })), filters.map((filter) => {
|
|
34
|
+
return (_jsxs(FilterWrapper, { isNarrow: isNarrow, children: [_jsxs("div", { className: "flex shrink-0 flex-wrap items-center gap-2", children: [showSearch && (_jsxs("div", { className: "relative w-full sm:w-[300px]", children: [_jsx(IconSearch, { size: 16, className: "pointer-events-none absolute left-3 top-1/2 -translate-y-1/2 text-muted-foreground" }), _jsx("input", { type: "text", placeholder: searctInputPlaceHolder, value: searchQuery, onChange: onSearch, onKeyDown: handleSearchKeyDown, "aria-label": "Search", className: cn('h-9 w-full rounded-md border border-border bg-background pl-9 pr-3 text-sm text-foreground', 'placeholder:text-muted-foreground', 'focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring', 'disabled:cursor-not-allowed disabled:opacity-50') })] })), filters.map((filter) => {
|
|
35
35
|
const { name, type, options } = filter;
|
|
36
36
|
const value = selectedFilters[name];
|
|
37
37
|
const renderFilterInput = () => {
|
|
@@ -71,6 +71,6 @@ const FilterComponent = ({ filters, selectedFilters, showApplyFilterButton = tru
|
|
|
71
71
|
return (_jsxs(Select, { value: currentValue || undefined, onValueChange: (val) => handleFilterChange(name, val === '__clear__' ? '' : val), children: [_jsx(SelectTrigger, { className: "h-9 w-full border-border bg-background text-sm text-foreground", "aria-label": filter.placeholder ?? name, children: _jsx(SelectValue, { placeholder: filter.placeholder ?? `Select ${name}` }) }), _jsxs(SelectContent, { children: [currentValue && (_jsx(SelectItem, { value: "__clear__", className: "text-muted-foreground", children: filter.placeholder ?? 'All' })), (options ?? []).map((opt) => (_jsx(SelectItem, { value: opt.value, children: opt.label }, opt.value)))] })] }));
|
|
72
72
|
};
|
|
73
73
|
return (_jsx("div", { className: "w-full sm:w-[240px]", children: renderFilterInput() }, name));
|
|
74
|
-
}), showApplyFilterButton && shouldShowActionButtons && (_jsx(Button, { onClick: handleApplyFilters, variant: "primary", className: "w-full sm:w-auto", style: { height: 36 }, tabIndex: 0, "aria-label": "Apply Filters", children: "Apply Filters" })), showClearFilters && shouldShowActionButtons && (_jsx(Button, { onClick: resetFilters, variant: "outline-primary", className: "w-full sm:w-auto", style: { height: 36 }, tabIndex: 0, "aria-label": "Clear Filters", children: "Clear Filters" }))] }), children] }));
|
|
74
|
+
}), showApplyFilterButton && shouldShowActionButtons && (_jsx(Button, { onClick: handleApplyFilters, variant: "primary", className: "w-full sm:w-auto", style: { height: 36 }, tabIndex: 0, "aria-label": "Apply Filters", children: "Apply Filters" })), showClearFilters && shouldShowActionButtons && (_jsx(Button, { onClick: resetFilters, variant: "outline-primary", className: "w-full sm:w-auto", style: { height: 36 }, tabIndex: 0, "aria-label": "Clear Filters", children: "Clear Filters" }))] }), _jsx("div", { className: "ml-auto flex flex-wrap items-center justify-end gap-2", children: children })] }));
|
|
75
75
|
};
|
|
76
76
|
export default FilterComponent;
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
const FilterWrapper = ({ isNarrow, children }) => {
|
|
3
|
-
return (_jsx("div", { className: "bg-card shadow-xl rounded-lg p-4 mb-2", children: _jsx("div", { className: isNarrow
|
|
4
|
-
? 'flex flex-col w-full space-y-4'
|
|
5
|
-
: 'flex flex-row justify-between items-start w-full space-y-0 space-x-0 sm:space-x-4', children: children }) }));
|
|
3
|
+
return (_jsx("div", { className: "bg-card shadow-xl rounded-lg p-4 mb-2", children: _jsx("div", { className: isNarrow ? 'flex flex-col w-full gap-3' : 'flex items-start justify-between gap-4 w-full', children: children }) }));
|
|
6
4
|
};
|
|
7
5
|
export default FilterWrapper;
|
|
@@ -4,6 +4,6 @@ function StatusCell({ displayValue, className = '', icon }) {
|
|
|
4
4
|
if (icon) {
|
|
5
5
|
return (_jsxs("span", { className: `inline-flex items-center gap-1.5 pl-2.5 pr-3 ${baseClass} ${className}`.trim(), children: [icon, displayValue] }));
|
|
6
6
|
}
|
|
7
|
-
return _jsx("span", { className: `px-4 ${baseClass} ${className}`.trim(), children: displayValue });
|
|
7
|
+
return _jsx("span", { className: `inline-block px-4 ${baseClass} ${className}`.trim(), children: displayValue });
|
|
8
8
|
}
|
|
9
9
|
export default StatusCell;
|
|
@@ -19,11 +19,24 @@ export function getDefaultTableOptions() {
|
|
|
19
19
|
enableStickyHeader: true,
|
|
20
20
|
enableTopToolbar: false,
|
|
21
21
|
enableBottomToolbar: true,
|
|
22
|
+
// ── Layout: columns fill the row width, no horizontal scroll, no gaps ──
|
|
23
|
+
layoutMode: 'grid',
|
|
24
|
+
defaultColumn: {
|
|
25
|
+
minSize: 60,
|
|
26
|
+
size: 180,
|
|
27
|
+
grow: true,
|
|
28
|
+
},
|
|
22
29
|
// ── Brand styling ──
|
|
23
30
|
mantineTableContainerProps: {
|
|
24
31
|
style: {
|
|
25
32
|
border: 'transparent',
|
|
26
33
|
borderRadius: '4px',
|
|
34
|
+
overflowX: 'hidden',
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
mantineTableProps: {
|
|
38
|
+
style: {
|
|
39
|
+
width: '100%',
|
|
27
40
|
},
|
|
28
41
|
},
|
|
29
42
|
mantineLoadingOverlayProps: {
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
2
|
import { MantineReactTable, useMantineReactTable } from 'mantine-react-table';
|
|
3
3
|
import { HiPlusSm } from 'react-icons/hi';
|
|
4
|
-
import { useMemo, useState } from 'react';
|
|
4
|
+
import { useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';
|
|
5
5
|
import { FilterComponent, IconButton } from '../../components';
|
|
6
|
+
import { cn } from '../../helpers';
|
|
6
7
|
import { useMediaQueries } from '../../shared';
|
|
7
8
|
import { getDefaultTableOptions } from './Defaults';
|
|
8
9
|
import ExportDropdown from './ExportButton';
|
|
@@ -16,12 +17,54 @@ function isInteractiveTarget(target) {
|
|
|
16
17
|
!!target.closest('[data-mantine-stop-propagation]') ||
|
|
17
18
|
!!target.closest('.mantine-ActionIcon-root'));
|
|
18
19
|
}
|
|
19
|
-
/**
|
|
20
|
+
/**
|
|
21
|
+
* Auto-size buckets based on column id/accessor key.
|
|
22
|
+
* Consumer can always override by setting `size` explicitly on the column.
|
|
23
|
+
*
|
|
24
|
+
* Buckets:
|
|
25
|
+
* - tiny (60): qty, count, position, index
|
|
26
|
+
* - small (90): total, price, amount, balance, fee, rate, percent, date, time
|
|
27
|
+
* - medium (140): status, type, role, category, unit, sku, code, currency, country
|
|
28
|
+
* - actions (110): the actions column
|
|
29
|
+
* - large (220): name, description, address, email, message, label, title, product
|
|
30
|
+
* - default (160): everything else
|
|
31
|
+
*/
|
|
32
|
+
const TINY_PATTERNS = /^(qty|quantity|count|position|order|index|no|num|number)$/i;
|
|
33
|
+
const SMALL_PATTERNS = /(total|price|amount|balance|fee|rate|percent|created|updated|deleted|date|time|expires|due)/i;
|
|
34
|
+
const STATUS_PATTERNS = /(status|state)$/i;
|
|
35
|
+
const MEDIUM_PATTERNS = /^(type|role|category|unit|sku|code|currency|country|method|source|kind)$/i;
|
|
36
|
+
const LARGE_PATTERNS = /(name|description|address|email|message|label|title|product|item|note)/i;
|
|
37
|
+
function inferColumnSize(id) {
|
|
38
|
+
if (id === 'actions')
|
|
39
|
+
return 110;
|
|
40
|
+
if (TINY_PATTERNS.test(id))
|
|
41
|
+
return 60;
|
|
42
|
+
if (STATUS_PATTERNS.test(id))
|
|
43
|
+
return 200;
|
|
44
|
+
if (MEDIUM_PATTERNS.test(id))
|
|
45
|
+
return 140;
|
|
46
|
+
if (SMALL_PATTERNS.test(id))
|
|
47
|
+
return 90;
|
|
48
|
+
if (LARGE_PATTERNS.test(id))
|
|
49
|
+
return 220;
|
|
50
|
+
return 160;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Applies the `showHeader: false` column config and auto-sizes columns.
|
|
54
|
+
* Inferred size is treated as a minimum — any explicit `col.size` is honoured
|
|
55
|
+
* only if it is at least the inferred minimum. This guarantees columns like
|
|
56
|
+
* `status` always have enough room for their chips even if a consumer hardcoded
|
|
57
|
+
* a too-narrow size.
|
|
58
|
+
*/
|
|
20
59
|
function processColumns(columns) {
|
|
21
60
|
return columns.map((col) => {
|
|
22
|
-
|
|
61
|
+
const id = (col.id ?? col.accessorKey ?? '');
|
|
62
|
+
const inferred = inferColumnSize(id);
|
|
63
|
+
const finalSize = col.size === undefined ? inferred : Math.max(col.size, inferred);
|
|
64
|
+
const sized = { ...col, size: finalSize };
|
|
65
|
+
if (sized.showHeader === false) {
|
|
23
66
|
return {
|
|
24
|
-
...
|
|
67
|
+
...sized,
|
|
25
68
|
header: '',
|
|
26
69
|
enableSorting: false,
|
|
27
70
|
enableColumnFilter: false,
|
|
@@ -31,7 +74,7 @@ function processColumns(columns) {
|
|
|
31
74
|
},
|
|
32
75
|
};
|
|
33
76
|
}
|
|
34
|
-
return
|
|
77
|
+
return sized;
|
|
35
78
|
});
|
|
36
79
|
}
|
|
37
80
|
/** Maps BaseFilter[] to FilterComponent's FilterDefinition[]. */
|
|
@@ -57,11 +100,38 @@ function CustomToolbar({ filters, appliedFilters, onFilterChange, onApply, onCle
|
|
|
57
100
|
else {
|
|
58
101
|
handleFilter(name, value);
|
|
59
102
|
}
|
|
60
|
-
}, handleApplyFilters: onApply, resetFilters: onClearFilters ?? (() => { }), showSearch: searchEnabled, searchQuery: searchQuery, onSearch: onSearch, isNarrow: isNarrow, children: _jsxs("div", { className:
|
|
103
|
+
}, handleApplyFilters: onApply, resetFilters: onClearFilters ?? (() => { }), showSearch: searchEnabled, searchQuery: searchQuery, onSearch: onSearch, isNarrow: isNarrow, children: _jsxs("div", { className: "flex flex-wrap items-center justify-end gap-2", children: [exportConfig?.enabled && (_jsx(ExportDropdown, { containerClassName: isNarrow ? 'w-full' : undefined, columns: columns, data: data, buttonClassName: "h-10", extraOptions: exportConfig.extraOptions, pdfOptions: exportConfig.pdf, xlsxOptions: exportConfig.xlsx, csvOptions: exportConfig.csv, exportAll: !!exportConfig.fetchAllData, fetchData: exportConfig.fetchAllData, enableEmailExport: !!exportConfig.email, emailExportApiUrl: exportConfig.email?.apiUrl, onEmailExportSuccess: exportConfig.email?.onSuccess, onEmailExportError: exportConfig.email?.onError })), addButton &&
|
|
104
|
+
(typeof addButton === 'boolean' ? (_jsx(IconButton, { onClick: onAdd ?? (() => { }), icon: HiPlusSm, label: "add-new-entry", className: cn('items-center text-nowrap', isNarrow ? 'w-full' : undefined), children: addText ?? 'Add New Entry' })) : (addButton))] }) }));
|
|
61
105
|
}
|
|
62
106
|
// ─── PagamioTable Component ──────────────────────────────────────────
|
|
63
107
|
const PagamioTable = ({ columns, data, isLoading = false, rowCount, sorting, pagination, filtering, search, onRowClick, rowClassName, expandable = false, renderDetailPanel, toolbar, toolbarMode = 'custom', enableColumnResizing, enableColumnPinning, enableColumnOrdering, enableColumnFilters, enableHiding, enableRowSelection, enableRowActions, enableRowVirtualization, enableGrouping, enableEditing, enableDensityToggle, enableFullScreenToggle, enableClickToCopy, enableRowNumbers, enableMultiSort, enableStickyHeader, enableStickyFooter, editDisplayMode, onEditingRowSave, onEditingRowCancel, renderRowActions, renderRowActionMenuItems, positionActionsColumn, renderTopToolbarCustomActions, renderBottomToolbarCustomActions, layoutMode, defaultColumn, mantineTableOptions, }) => {
|
|
64
108
|
const [expanded, setExpanded] = useState({});
|
|
109
|
+
const tableRef = useRef(null);
|
|
110
|
+
const applyTableHeight = (el) => {
|
|
111
|
+
const mrtContainer = el.querySelector('.mrt-table-container');
|
|
112
|
+
if (!mrtContainer)
|
|
113
|
+
return;
|
|
114
|
+
const containerTop = mrtContainer.getBoundingClientRect().top;
|
|
115
|
+
const offset = Math.round(containerTop + 68); // 52 MRT pagination + 16 gap
|
|
116
|
+
mrtContainer.style.setProperty('max-height', `calc(100vh - ${offset}px)`, 'important');
|
|
117
|
+
};
|
|
118
|
+
// Runs after every render (no deps), always after MRT's own layout effect.
|
|
119
|
+
useLayoutEffect(() => {
|
|
120
|
+
if (tableRef.current)
|
|
121
|
+
applyTableHeight(tableRef.current);
|
|
122
|
+
});
|
|
123
|
+
useEffect(() => {
|
|
124
|
+
const el = tableRef.current;
|
|
125
|
+
if (!el)
|
|
126
|
+
return;
|
|
127
|
+
const resizeObserver = new ResizeObserver(() => applyTableHeight(el));
|
|
128
|
+
resizeObserver.observe(document.documentElement);
|
|
129
|
+
window.addEventListener('resize', () => applyTableHeight(el));
|
|
130
|
+
return () => {
|
|
131
|
+
resizeObserver.disconnect();
|
|
132
|
+
window.removeEventListener('resize', () => applyTableHeight(el));
|
|
133
|
+
};
|
|
134
|
+
}, []);
|
|
65
135
|
// Process columns (handle showHeader: false)
|
|
66
136
|
const processedColumns = useMemo(() => processColumns(columns), [columns]);
|
|
67
137
|
// Convert our SortConfig to MRT's SortingState
|
|
@@ -165,9 +235,17 @@ const PagamioTable = ({ columns, data, isLoading = false, rowCount, sorting, pag
|
|
|
165
235
|
// Custom MRT toolbar actions
|
|
166
236
|
...(renderTopToolbarCustomActions && { renderTopToolbarCustomActions }),
|
|
167
237
|
...(renderBottomToolbarCustomActions && { renderBottomToolbarCustomActions }),
|
|
168
|
-
// Layout
|
|
169
|
-
|
|
170
|
-
|
|
238
|
+
// Layout — columns fill row, no horizontal scroll
|
|
239
|
+
layoutMode: layoutMode ?? defaults.layoutMode,
|
|
240
|
+
defaultColumn: defaultColumn ?? defaults.defaultColumn,
|
|
241
|
+
mantineTableContainerProps: {
|
|
242
|
+
style: {
|
|
243
|
+
border: 'transparent',
|
|
244
|
+
borderRadius: '4px',
|
|
245
|
+
overflowX: 'hidden',
|
|
246
|
+
},
|
|
247
|
+
},
|
|
248
|
+
mantineTableProps: defaults.mantineTableProps,
|
|
171
249
|
// Row interaction styling
|
|
172
250
|
mantineTableBodyRowProps: ({ row }) => ({
|
|
173
251
|
onClick: onRowClick ? (event) => handleRowClick(row, event) : undefined,
|
|
@@ -179,6 +257,6 @@ const PagamioTable = ({ columns, data, isLoading = false, rowCount, sorting, pag
|
|
|
179
257
|
});
|
|
180
258
|
// ── Toolbar rendering ──────────────────────────────────────────────
|
|
181
259
|
const showCustomToolbar = toolbarMode === 'custom' && (!!toolbar || !!search || !!filtering);
|
|
182
|
-
return (_jsxs("div", { children: [showCustomToolbar && (_jsx(CustomToolbar, { filters: toolbar?.filters ?? [], appliedFilters: filtering?.appliedFilters ?? {}, onFilterChange: filtering?.onFilterChange ?? (() => { }), onApply: filtering?.onApply ?? (() => { }), onClearFilters: toolbar?.onClearFilters, showClearFilters: toolbar?.showClearFilters ?? false, showApplyFilterButton: toolbar?.showApplyFilterButton ?? true, searchEnabled: !!search, searchQuery: search?.query ?? '', onSearch: search?.onChange ?? (() => { }), searchPlaceholder: search?.placeholder, exportConfig: toolbar?.export, columns: columns, data: data, addButton: toolbar?.addButton, addText: toolbar?.addText, onAdd: toolbar?.onAdd })), _jsx("div", { className: "border border-border rounded-md overflow-hidden", children: _jsx(MantineReactTable, { table: table }) })] }));
|
|
260
|
+
return (_jsxs("div", { children: [showCustomToolbar && (_jsx(CustomToolbar, { filters: toolbar?.filters ?? [], appliedFilters: filtering?.appliedFilters ?? {}, onFilterChange: filtering?.onFilterChange ?? (() => { }), onApply: filtering?.onApply ?? (() => { }), onClearFilters: toolbar?.onClearFilters, showClearFilters: toolbar?.showClearFilters ?? false, showApplyFilterButton: toolbar?.showApplyFilterButton ?? true, searchEnabled: !!search, searchQuery: search?.query ?? '', onSearch: search?.onChange ?? (() => { }), searchPlaceholder: search?.placeholder, exportConfig: toolbar?.export, columns: columns, data: data, addButton: toolbar?.addButton, addText: toolbar?.addText, onAdd: toolbar?.onAdd })), _jsx("div", { ref: tableRef, className: "border border-border rounded-md overflow-hidden", children: _jsx(MantineReactTable, { table: table }) })] }));
|
|
183
261
|
};
|
|
184
262
|
export default PagamioTable;
|
package/lib/styles.css
CHANGED
|
@@ -893,9 +893,6 @@ video {
|
|
|
893
893
|
.col-span-9 {
|
|
894
894
|
grid-column: span 9 / span 9;
|
|
895
895
|
}
|
|
896
|
-
.col-span-full {
|
|
897
|
-
grid-column: 1 / -1;
|
|
898
|
-
}
|
|
899
896
|
.-m-1\.5 {
|
|
900
897
|
margin: -0.375rem;
|
|
901
898
|
}
|
|
@@ -977,6 +974,9 @@ video {
|
|
|
977
974
|
.mb-0 {
|
|
978
975
|
margin-bottom: 0px;
|
|
979
976
|
}
|
|
977
|
+
.mb-0\.5 {
|
|
978
|
+
margin-bottom: 0.125rem;
|
|
979
|
+
}
|
|
980
980
|
.mb-1 {
|
|
981
981
|
margin-bottom: 0.25rem;
|
|
982
982
|
}
|
|
@@ -1557,6 +1557,9 @@ video {
|
|
|
1557
1557
|
.flex-grow {
|
|
1558
1558
|
flex-grow: 1;
|
|
1559
1559
|
}
|
|
1560
|
+
.grow {
|
|
1561
|
+
flex-grow: 1;
|
|
1562
|
+
}
|
|
1560
1563
|
.border-collapse {
|
|
1561
1564
|
border-collapse: collapse;
|
|
1562
1565
|
}
|
|
@@ -1777,9 +1780,6 @@ video {
|
|
|
1777
1780
|
.items-baseline {
|
|
1778
1781
|
align-items: baseline;
|
|
1779
1782
|
}
|
|
1780
|
-
.items-stretch {
|
|
1781
|
-
align-items: stretch;
|
|
1782
|
-
}
|
|
1783
1783
|
.justify-start {
|
|
1784
1784
|
justify-content: flex-start;
|
|
1785
1785
|
}
|
|
@@ -1834,9 +1834,16 @@ video {
|
|
|
1834
1834
|
-moz-column-gap: 1rem;
|
|
1835
1835
|
column-gap: 1rem;
|
|
1836
1836
|
}
|
|
1837
|
+
.gap-x-6 {
|
|
1838
|
+
-moz-column-gap: 1.5rem;
|
|
1839
|
+
column-gap: 1.5rem;
|
|
1840
|
+
}
|
|
1837
1841
|
.gap-y-2 {
|
|
1838
1842
|
row-gap: 0.5rem;
|
|
1839
1843
|
}
|
|
1844
|
+
.gap-y-4 {
|
|
1845
|
+
row-gap: 1rem;
|
|
1846
|
+
}
|
|
1840
1847
|
.-space-x-4 > :not([hidden]) ~ :not([hidden]) {
|
|
1841
1848
|
--tw-space-x-reverse: 0;
|
|
1842
1849
|
margin-right: calc(-1rem * var(--tw-space-x-reverse));
|
|
@@ -1847,11 +1854,6 @@ video {
|
|
|
1847
1854
|
margin-right: calc(-1px * var(--tw-space-x-reverse));
|
|
1848
1855
|
margin-left: calc(-1px * calc(1 - var(--tw-space-x-reverse)));
|
|
1849
1856
|
}
|
|
1850
|
-
.space-x-0 > :not([hidden]) ~ :not([hidden]) {
|
|
1851
|
-
--tw-space-x-reverse: 0;
|
|
1852
|
-
margin-right: calc(0px * var(--tw-space-x-reverse));
|
|
1853
|
-
margin-left: calc(0px * calc(1 - var(--tw-space-x-reverse)));
|
|
1854
|
-
}
|
|
1855
1857
|
.space-x-1 > :not([hidden]) ~ :not([hidden]) {
|
|
1856
1858
|
--tw-space-x-reverse: 0;
|
|
1857
1859
|
margin-right: calc(0.25rem * var(--tw-space-x-reverse));
|
|
@@ -6939,6 +6941,10 @@ video {
|
|
|
6939
6941
|
display: none;
|
|
6940
6942
|
}
|
|
6941
6943
|
|
|
6944
|
+
.xl\:grid-cols-4 {
|
|
6945
|
+
grid-template-columns: repeat(4, minmax(0, 1fr));
|
|
6946
|
+
}
|
|
6947
|
+
|
|
6942
6948
|
.xl\:grid-cols-6 {
|
|
6943
6949
|
grid-template-columns: repeat(6, minmax(0, 1fr));
|
|
6944
6950
|
}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pagamio/frontend-commons-lib",
|
|
3
3
|
"description": "Pagamio library for Frontend reusable components like the form engine and table container",
|
|
4
|
-
"version": "0.8.
|
|
4
|
+
"version": "0.8.313",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"access": "public",
|
|
7
7
|
"provenance": false
|