venice-ui 3.0.55 → 3.0.56
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/components/PageSize/PageSize.js +36 -0
- package/dist/cjs/components/PageSize/index.js +17 -0
- package/dist/cjs/components/Pagination/Pagination.js +2 -21
- package/dist/cjs/components/Pagination/Pagination.styles.js +3 -1
- package/dist/cjs/components/Table/Table.js +84 -55
- package/dist/cjs/components/Table/Table.styles.js +28 -5
- package/dist/cjs/config/config.js +4 -4
- package/dist/cjs/config/wordbook.js +1 -0
- package/dist/esm/components/PageSize/PageSize.js +29 -0
- package/dist/esm/components/PageSize/index.js +1 -0
- package/dist/esm/components/Pagination/Pagination.js +2 -21
- package/dist/esm/components/Pagination/Pagination.styles.js +3 -1
- package/dist/esm/components/Table/Table.js +86 -57
- package/dist/esm/components/Table/Table.styles.js +27 -4
- package/dist/esm/config/config.js +4 -4
- package/dist/esm/config/wordbook.js +1 -0
- package/dist/types/components/PageSize/PageSize.d.ts +13 -0
- package/dist/types/components/PageSize/index.d.ts +1 -0
- package/dist/types/components/Pagination/Pagination.d.ts +0 -5
- package/dist/types/components/Table/Table.d.ts +3 -1
- package/dist/types/components/Table/Table.styles.d.ts +7 -0
- package/dist/types/config/config.d.ts +12 -12
- package/dist/types/config/wordbook.d.ts +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.PageSize = void 0;
|
|
7
|
+
const react_1 = __importDefault(require("react"));
|
|
8
|
+
const Dropdown_1 = require("../Dropdown");
|
|
9
|
+
const styled_components_1 = require("styled-components");
|
|
10
|
+
const config_1 = require("../../config");
|
|
11
|
+
const PageSize = ({ theme, themeVariant = 'default', onPageSizeChange, label = config_1.wordbook.pagination.dropdownLabel, zIndex, availableValues = [10, 20, 50], pageSize, }) => {
|
|
12
|
+
const resolvedThemeData = (0, config_1.resolveThemeWithComponentsConfig)({
|
|
13
|
+
theme,
|
|
14
|
+
themeVariant,
|
|
15
|
+
});
|
|
16
|
+
const resolvedTheme = resolvedThemeData.resolvedTheme;
|
|
17
|
+
const pageSizeStr = !isNaN(pageSize) ? String(pageSize) : '10';
|
|
18
|
+
let dropdownOptions = availableValues.map((size) => ({
|
|
19
|
+
value: size.toString(),
|
|
20
|
+
label: size.toString(),
|
|
21
|
+
}));
|
|
22
|
+
if (!dropdownOptions.some((opt) => opt.value === pageSizeStr)) {
|
|
23
|
+
dropdownOptions = [
|
|
24
|
+
{ value: pageSizeStr, label: pageSizeStr },
|
|
25
|
+
...dropdownOptions,
|
|
26
|
+
];
|
|
27
|
+
}
|
|
28
|
+
return (react_1.default.createElement(styled_components_1.ThemeProvider, { theme: resolvedTheme },
|
|
29
|
+
react_1.default.createElement(Dropdown_1.Dropdown, { size: "sm", label: label, labelPosition: "left", handleChange: (name, value) => {
|
|
30
|
+
const num = Number(value);
|
|
31
|
+
if (!isNaN(num) && num > 0) {
|
|
32
|
+
onPageSizeChange(num);
|
|
33
|
+
}
|
|
34
|
+
}, name: "pageSize", value: String(pageSize), options: dropdownOptions, width: "auto", componentWidth: "80px", zIndex: zIndex })));
|
|
35
|
+
};
|
|
36
|
+
exports.PageSize = PageSize;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./PageSize"), exports);
|
|
@@ -8,10 +8,8 @@ const config_1 = require("../../config");
|
|
|
8
8
|
const Pagination_styles_1 = require("./Pagination.styles");
|
|
9
9
|
const Icon_1 = require("../Icon");
|
|
10
10
|
const react_1 = __importDefault(require("react"));
|
|
11
|
-
const Dropdown_1 = require("../Dropdown");
|
|
12
|
-
const config_2 = require("../../config");
|
|
13
11
|
const styled_components_1 = require("styled-components");
|
|
14
|
-
const Pagination = ({ theme, themeVariant = 'default', currentPage, totalPages,
|
|
12
|
+
const Pagination = ({ theme, themeVariant = 'default', currentPage, totalPages, onPageChange, }) => {
|
|
15
13
|
const resolvedThemeData = (0, config_1.resolveThemeWithComponentsConfig)({
|
|
16
14
|
theme,
|
|
17
15
|
themeVariant,
|
|
@@ -39,28 +37,11 @@ const Pagination = ({ theme, themeVariant = 'default', currentPage, totalPages,
|
|
|
39
37
|
return pages;
|
|
40
38
|
};
|
|
41
39
|
const pageNumbers = getPageNumbers(currentPage, totalPages);
|
|
42
|
-
const pageSizeStr = !isNaN(pageSize) ? String(pageSize) : '10';
|
|
43
|
-
let dropdownOptions = availableValues.map((size) => ({
|
|
44
|
-
value: size.toString(),
|
|
45
|
-
label: size.toString(),
|
|
46
|
-
}));
|
|
47
|
-
if (!dropdownOptions.some((opt) => opt.value === pageSizeStr)) {
|
|
48
|
-
dropdownOptions = [
|
|
49
|
-
{ value: pageSizeStr, label: pageSizeStr },
|
|
50
|
-
...dropdownOptions,
|
|
51
|
-
];
|
|
52
|
-
}
|
|
53
40
|
return (react_1.default.createElement(styled_components_1.ThemeProvider, { theme: resolvedTheme },
|
|
54
41
|
react_1.default.createElement(Pagination_styles_1.PaginationRoot, { theme: resolvedTheme, config: paginationConfig },
|
|
55
42
|
react_1.default.createElement(Pagination_styles_1.PaginationItemWrapper, { theme: resolvedTheme, config: paginationConfig },
|
|
56
43
|
react_1.default.createElement(Icon_1.Icon, { name: 'back', size: "md", onClick: () => onPageChange(Math.max(1, currentPage - 1)), isDisabled: currentPage === 1 }),
|
|
57
44
|
pageNumbers.map((num, idx) => num === '...' ? (react_1.default.createElement("span", { key: `ellipsis-${idx}` }, "...")) : (react_1.default.createElement(Pagination_styles_1.PaginationItem, { key: num, onClick: () => onPageChange(Number(num)), isActive: num === currentPage, theme: resolvedTheme, config: paginationConfig }, num))),
|
|
58
|
-
react_1.default.createElement(Icon_1.Icon, { name: 'forward', size: "md", onClick: () => onPageChange(Math.min(totalPages, currentPage + 1)), isDisabled: currentPage === totalPages }))
|
|
59
|
-
react_1.default.createElement(Dropdown_1.Dropdown, { size: "sm", label: label, labelPosition: "left", handleChange: (name, value) => {
|
|
60
|
-
const num = Number(value);
|
|
61
|
-
if (!isNaN(num) && num > 0) {
|
|
62
|
-
onPageSizeChange(num);
|
|
63
|
-
}
|
|
64
|
-
}, name: "pageSize", value: String(pageSize), options: dropdownOptions, width: 'auto', componentWidth: '80px', zIndex: zIndex }))));
|
|
45
|
+
react_1.default.createElement(Icon_1.Icon, { name: 'forward', size: "md", onClick: () => onPageChange(Math.min(totalPages, currentPage + 1)), isDisabled: currentPage === totalPages })))));
|
|
65
46
|
};
|
|
66
47
|
exports.Pagination = Pagination;
|
|
@@ -7,7 +7,7 @@ exports.PaginationDropdownWrapper = exports.PaginationItem = exports.PaginationI
|
|
|
7
7
|
const styled_components_1 = __importDefault(require("styled-components"));
|
|
8
8
|
exports.PaginationRoot = styled_components_1.default.div `
|
|
9
9
|
display: flex;
|
|
10
|
-
justify-content:
|
|
10
|
+
justify-content: center;
|
|
11
11
|
align-items: center;
|
|
12
12
|
width: auto;
|
|
13
13
|
box-sizing: border-box;
|
|
@@ -27,6 +27,8 @@ exports.PaginationItem = styled_components_1.default.button `Ś
|
|
|
27
27
|
justify-content: center;
|
|
28
28
|
height: ${({ theme, config }) => config.size.height}px;
|
|
29
29
|
width: ${({ theme, config }) => config.size.width}px;
|
|
30
|
+
font-size: ${({ theme, config }) => config.size.fontSize}px;
|
|
31
|
+
line-height: ${({ theme, config }) => config.size.lineHeight}px;
|
|
30
32
|
background-color: ${({ theme, config, disabled, isActive }) => disabled
|
|
31
33
|
? config.color.disabled.background
|
|
32
34
|
: isActive
|
|
@@ -45,17 +45,17 @@ const Pagination_1 = require("../Pagination");
|
|
|
45
45
|
const HeaderCell_1 = require("./HeaderCell");
|
|
46
46
|
const Cell_1 = require("./Cell");
|
|
47
47
|
const SearchInput_1 = require("../SearchInput");
|
|
48
|
+
const PageSize_1 = require("../PageSize");
|
|
48
49
|
const Table = ({ theme, themeVariant = 'default', headers, elements, hover = true, selectable = true, filtrable = false, pagination = false, sortable = true, sort = {
|
|
49
50
|
name: '',
|
|
50
51
|
order: 'none',
|
|
51
|
-
}, pageSize = 20, moreActions = [], onRowClick, filterLabels,
|
|
52
|
+
}, pageSize = 20, moreActions = [], onRowClick, filterLabels, pageSizeAvailableValues, tableHeight, tableWrapperHeight, paginationLabel, calendarLabels, calendarLocaleLabels, paginationZIndex, headerExtraContent, searchable = true, searchInputPlaceholder = config_2.wordbook.searchInput.placeholder, noResultsText = config_2.wordbook.table.filterEmptyState, emptyStateText = config_2.wordbook.table.emptyState, }) => {
|
|
52
53
|
const resolvedThemeData = (0, config_1.resolveThemeWithComponentsConfig)({
|
|
53
54
|
theme,
|
|
54
55
|
themeVariant,
|
|
55
56
|
});
|
|
56
57
|
const resolvedTheme = resolvedThemeData.resolvedTheme;
|
|
57
58
|
const { componentsConfig } = resolvedThemeData;
|
|
58
|
-
const [searchValue, setSearchValue] = (0, react_1.useState)('');
|
|
59
59
|
const tableConfig = componentsConfig.table;
|
|
60
60
|
const tableHeaders = (0, react_1.useMemo)(() => {
|
|
61
61
|
const nextHeaders = [...headers];
|
|
@@ -79,87 +79,116 @@ const Table = ({ theme, themeVariant = 'default', headers, elements, hover = tru
|
|
|
79
79
|
const [currentPageSize, setCurrentPageSize] = (0, react_1.useState)(pageSize || 10);
|
|
80
80
|
const [noResultsMessage, setNoResultsMessage] = (0, react_1.useState)(null);
|
|
81
81
|
const [filtersClearSignal, setFiltersClearSignal] = (0, react_1.useState)(0);
|
|
82
|
+
const searchRef = (0, react_1.useRef)('');
|
|
83
|
+
const filteredBaseRef = (0, react_1.useRef)(fullElements);
|
|
84
|
+
const setSearch = (0, react_1.useCallback)((value) => {
|
|
85
|
+
searchRef.current = value;
|
|
86
|
+
}, []);
|
|
87
|
+
const searchFiltering = (0, react_1.useCallback)((sourceElements, searchValue) => {
|
|
88
|
+
const normalizedSearchValue = searchValue.toLowerCase().trim();
|
|
89
|
+
if (!normalizedSearchValue) {
|
|
90
|
+
return sourceElements;
|
|
91
|
+
}
|
|
92
|
+
return sourceElements.filter((item) => {
|
|
93
|
+
return tableHeaders.some((header) => {
|
|
94
|
+
if (header.action) {
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
const fieldValue = item[header.valueSource];
|
|
98
|
+
if (typeof fieldValue === 'string') {
|
|
99
|
+
return fieldValue.toLowerCase().includes(normalizedSearchValue);
|
|
100
|
+
}
|
|
101
|
+
if (typeof fieldValue === 'number') {
|
|
102
|
+
return fieldValue.toString().includes(normalizedSearchValue);
|
|
103
|
+
}
|
|
104
|
+
return false;
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
}, [tableHeaders]);
|
|
108
|
+
const updateTableElements = (0, react_1.useCallback)((nextElements) => {
|
|
109
|
+
setTableElementsState(nextElements);
|
|
110
|
+
setCurrentPage(1);
|
|
111
|
+
setNoResultsMessage(nextElements.length === 0
|
|
112
|
+
? fullElements.length === 0
|
|
113
|
+
? emptyStateText
|
|
114
|
+
: noResultsText
|
|
115
|
+
: null);
|
|
116
|
+
}, []);
|
|
117
|
+
(0, react_1.useEffect)(() => {
|
|
118
|
+
filteredBaseRef.current = fullElements;
|
|
119
|
+
const nextElements = searchRef.current
|
|
120
|
+
? searchFiltering(fullElements, searchRef.current)
|
|
121
|
+
: fullElements;
|
|
122
|
+
updateTableElements(nextElements);
|
|
123
|
+
}, [fullElements, searchFiltering, updateTableElements]);
|
|
82
124
|
(0, react_1.useEffect)(() => {
|
|
83
|
-
setTableElementsState(fullElements);
|
|
84
125
|
setCurrentPage(1);
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
const handleRowClick = (id) => {
|
|
126
|
+
}, [currentPageSize]);
|
|
127
|
+
const handleRowClick = (0, react_1.useCallback)((id) => {
|
|
88
128
|
if (selectable) {
|
|
89
129
|
setSelectedRow(id);
|
|
90
130
|
}
|
|
91
131
|
onRowClick?.(id);
|
|
92
|
-
};
|
|
93
|
-
const handleHeaderCellClick = (targetValue, order) => {
|
|
132
|
+
}, [selectable, onRowClick]);
|
|
133
|
+
const handleHeaderCellClick = (0, react_1.useCallback)((targetValue, order) => {
|
|
94
134
|
if (!sortable) {
|
|
95
135
|
return;
|
|
96
136
|
}
|
|
97
137
|
const newSort = (0, tableHelper_1.setSortParams)(targetValue, order, tableSort);
|
|
98
138
|
setTableSort(newSort);
|
|
99
139
|
setTableElementsState((prev) => (0, tableHelper_1.applySort)(newSort, prev));
|
|
100
|
-
};
|
|
101
|
-
const handleApplyFilters = (0, react_1.useCallback)((
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
}, []);
|
|
140
|
+
}, [sortable, tableSort]);
|
|
141
|
+
const handleApplyFilters = (0, react_1.useCallback)((filtered) => {
|
|
142
|
+
filteredBaseRef.current = filtered;
|
|
143
|
+
const nextElements = searchRef.current
|
|
144
|
+
? searchFiltering(filtered, searchRef.current)
|
|
145
|
+
: filtered;
|
|
146
|
+
updateTableElements(nextElements);
|
|
147
|
+
}, [searchFiltering, updateTableElements]);
|
|
108
148
|
const handleClearFilters = (0, react_1.useCallback)(() => {
|
|
109
|
-
setFiltersClearSignal((
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
149
|
+
setFiltersClearSignal((prev) => prev + 1);
|
|
150
|
+
filteredBaseRef.current = fullElements;
|
|
151
|
+
const nextElements = searchRef.current
|
|
152
|
+
? searchFiltering(fullElements, searchRef.current)
|
|
153
|
+
: fullElements;
|
|
154
|
+
updateTableElements(nextElements);
|
|
155
|
+
}, [fullElements, searchFiltering, updateTableElements]);
|
|
156
|
+
const handleSearchChange = (0, react_1.useCallback)((value) => {
|
|
157
|
+
const searchValue = value.toLowerCase().trim();
|
|
158
|
+
setSearch(searchValue);
|
|
159
|
+
const baseElements = filteredBaseRef.current;
|
|
160
|
+
const nextElements = searchValue
|
|
161
|
+
? searchFiltering(baseElements, searchValue)
|
|
162
|
+
: baseElements;
|
|
163
|
+
updateTableElements(nextElements);
|
|
164
|
+
}, [searchFiltering, setSearch, updateTableElements]);
|
|
117
165
|
const totalPages = Math.ceil(tableElementsState.length / currentPageSize);
|
|
118
166
|
const paginatedElements = (0, react_1.useMemo)(() => {
|
|
119
167
|
return tableElementsState.slice((currentPage - 1) * currentPageSize, currentPage * currentPageSize);
|
|
120
168
|
}, [tableElementsState, currentPage, currentPageSize]);
|
|
121
|
-
const
|
|
122
|
-
setSearchValue(value);
|
|
123
|
-
};
|
|
124
|
-
const getVisableElements = () => {
|
|
125
|
-
const visable = pagination ? paginatedElements : tableElementsState;
|
|
126
|
-
if (searchValue) {
|
|
127
|
-
const searchValueLower = searchValue.toLowerCase();
|
|
128
|
-
return visable.filter((item) => {
|
|
129
|
-
return tableHeaders.some((header) => {
|
|
130
|
-
const value = item[header.valueSource];
|
|
131
|
-
if (value && typeof value === 'string') {
|
|
132
|
-
return value.toLowerCase().includes(searchValueLower);
|
|
133
|
-
}
|
|
134
|
-
else if (value && typeof value === 'number') {
|
|
135
|
-
return value.toString().toLowerCase().includes(searchValueLower);
|
|
136
|
-
}
|
|
137
|
-
return false;
|
|
138
|
-
});
|
|
139
|
-
});
|
|
140
|
-
}
|
|
141
|
-
return visable;
|
|
142
|
-
};
|
|
143
|
-
const visibleElements = getVisableElements();
|
|
169
|
+
const visibleElements = pagination ? paginatedElements : tableElementsState;
|
|
144
170
|
return (react_1.default.createElement(styled_components_1.ThemeProvider, { theme: resolvedTheme },
|
|
145
171
|
react_1.default.createElement(Table_styles_1.TableRoot, { theme: resolvedTheme, config: tableConfig, componentHeight: tableWrapperHeight },
|
|
146
172
|
react_1.default.createElement(react_1.default.Fragment, null,
|
|
147
|
-
(filtrable || pagination) && (react_1.default.createElement(Table_styles_1.TableHeader, { theme: resolvedTheme, config: tableConfig, right: pagination && !filtrable },
|
|
173
|
+
(filtrable || pagination || searchable || headerExtraContent) && (react_1.default.createElement(Table_styles_1.TableHeader, { theme: resolvedTheme, config: tableConfig, right: (pagination || searchable) && !filtrable },
|
|
148
174
|
react_1.default.createElement(react_1.default.Fragment, null,
|
|
149
|
-
(filtrable || headerExtraContent) && (react_1.default.createElement(
|
|
150
|
-
|
|
151
|
-
|
|
175
|
+
(filtrable || headerExtraContent) && (react_1.default.createElement(react_1.default.Fragment, null,
|
|
176
|
+
react_1.default.createElement(Table_styles_1.HeaderSection, null,
|
|
177
|
+
filtrable && (react_1.default.createElement(Filters_1.Filters, { labels: filterLabels, headers: headers, elements: fullElements, fullElements: fullElements, handleSubmitFilters: handleApplyFilters, externalClearSignal: filtersClearSignal, onClear: handleClearFilters, calendarLabels: calendarLabels, calendarLocaleLabels: calendarLocaleLabels })),
|
|
178
|
+
headerExtraContent && (react_1.default.createElement(Table_styles_1.HeaderSection, null, headerExtraContent))))),
|
|
152
179
|
(pagination || searchable) && (react_1.default.createElement(Table_styles_1.HeaderSection, { right: true },
|
|
153
180
|
searchable && (react_1.default.createElement(Table_styles_1.TableSearch, { theme: resolvedTheme, config: tableConfig },
|
|
154
181
|
react_1.default.createElement(SearchInput_1.SearchInput, { placeholder: searchInputPlaceholder, handleSearch: handleSearchChange }))),
|
|
155
|
-
pagination && (react_1.default.createElement(
|
|
182
|
+
pagination && (react_1.default.createElement(PageSize_1.PageSize, { label: paginationLabel?.label, zIndex: paginationZIndex, onPageSizeChange: setCurrentPageSize, availableValues: pageSizeAvailableValues, pageSize: currentPageSize }))))))),
|
|
156
183
|
react_1.default.createElement(Table_styles_1.TableContentWrapper, { componentHeight: tableHeight },
|
|
157
|
-
react_1.default.createElement(Table_styles_1.TableContent, { theme: resolvedTheme, config: tableConfig, cellPadding: "0", cellSpacing: "0" },
|
|
184
|
+
react_1.default.createElement(Table_styles_1.TableContent, { theme: resolvedTheme, config: tableConfig, cellPadding: "0", cellSpacing: "0", isEmpty: visibleElements.length === 0 },
|
|
158
185
|
react_1.default.createElement(Table_styles_1.TableHead, null,
|
|
159
186
|
react_1.default.createElement(Table_styles_1.TableHeaderRow, { theme: resolvedTheme, config: tableConfig }, tableHeaders.map((header) => (react_1.default.createElement(HeaderCell_1.HeaderCell, { key: `header_${header.name}`, header: header, sortable: sortable, handleSort: handleHeaderCellClick, sort: tableSort, size: header.size || 'md' }))))),
|
|
160
187
|
react_1.default.createElement(Table_styles_1.TableBody, null, visibleElements.map((item) => (react_1.default.createElement(Table_styles_1.TableRow, { theme: resolvedTheme, config: tableConfig, key: `table_row_${item.id}`, hover: hover, isDisabled: item.disabled, active: selectedRow === item.id, selectable: selectable, onClick: !item.disabled
|
|
161
188
|
? () => handleRowClick(item.id)
|
|
162
|
-
: undefined }, tableHeaders.map((header, index) => (react_1.default.createElement(Cell_1.Cell, { key: `cell_${header.name}_${item.id}`, header: header, moreActions: moreActions, item: item, theme: theme, selected: item.marked && index === 0, isDisabled: item.disabled }))))))))
|
|
163
|
-
|
|
189
|
+
: undefined }, tableHeaders.map((header, index) => (react_1.default.createElement(Cell_1.Cell, { key: `cell_${header.name}_${item.id}`, header: header, moreActions: moreActions, item: item, theme: theme, selected: item.marked && index === 0, isDisabled: item.disabled })))))))),
|
|
190
|
+
pagination && totalPages > 1 && visibleElements.length > 0 && (react_1.default.createElement(Table_styles_1.TableFooter, null,
|
|
191
|
+
react_1.default.createElement(Pagination_1.Pagination, { currentPage: currentPage, totalPages: totalPages, onPageChange: setCurrentPage })))),
|
|
192
|
+
noResultsMessage && (react_1.default.createElement(Table_styles_1.TableEmptyState, { theme: resolvedTheme, config: tableConfig }, noResultsMessage))))));
|
|
164
193
|
};
|
|
165
194
|
exports.Table = Table;
|
|
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.TableSearch = exports.TableCellContent = exports.TableCell = exports.TableRow = exports.OptionTableCellWrapper = exports.OptionTableCell = exports.IconTableHeaderCell = exports.OptionTableHeaderCell = exports.HeaderCellContent = exports.TableHeaderCell = exports.TableHeaderRow = exports.TableBody = exports.TableHead = exports.TableContent = exports.HeaderSection = exports.TableContentWrapper = exports.TableHeader = exports.TableRoot = void 0;
|
|
6
|
+
exports.TableFooter = exports.TableEmptyState = exports.TableSearch = exports.TableCellContent = exports.TableCell = exports.TableRow = exports.OptionTableCellWrapper = exports.OptionTableCell = exports.IconTableHeaderCell = exports.OptionTableHeaderCell = exports.HeaderCellContent = exports.TableHeaderCell = exports.TableHeaderRow = exports.TableBody = exports.TableHead = exports.TableContent = exports.HeaderSection = exports.TableContentWrapper = exports.TableHeader = exports.TableRoot = void 0;
|
|
7
7
|
const styled_components_1 = __importDefault(require("styled-components"));
|
|
8
8
|
exports.TableRoot = styled_components_1.default.div `
|
|
9
9
|
display: flex;
|
|
@@ -15,8 +15,7 @@ exports.TableHeader = styled_components_1.default.div `
|
|
|
15
15
|
display: flex;
|
|
16
16
|
align-items: center;
|
|
17
17
|
flex-shrink: 0;
|
|
18
|
-
|
|
19
|
-
justify-content: space-between;
|
|
18
|
+
justify-content: ${({ right }) => (right ? 'flex-end' : 'space-between')};
|
|
20
19
|
height: ${({ theme, config }) => config.size.header.height}px;
|
|
21
20
|
`;
|
|
22
21
|
exports.TableContentWrapper = styled_components_1.default.div `
|
|
@@ -29,6 +28,7 @@ exports.TableContentWrapper = styled_components_1.default.div `
|
|
|
29
28
|
overflow-x: auto;
|
|
30
29
|
height: ${({ componentHeight }) => componentHeight || '100%'};
|
|
31
30
|
flex-shrink: 0;
|
|
31
|
+
flex-direction: column;
|
|
32
32
|
`;
|
|
33
33
|
exports.HeaderSection = styled_components_1.default.div `
|
|
34
34
|
display: flex;
|
|
@@ -41,8 +41,8 @@ exports.TableContent = styled_components_1.default.table `
|
|
|
41
41
|
box-sizing: border-box;
|
|
42
42
|
display: block;
|
|
43
43
|
width: 100%;
|
|
44
|
-
overflow-x: auto;
|
|
45
|
-
overflow-y: auto;
|
|
44
|
+
overflow-x: ${({ isEmpty }) => (isEmpty ? 'hidden' : 'auto')};
|
|
45
|
+
overflow-y: ${({ isEmpty }) => (isEmpty ? 'hidden' : 'auto')};
|
|
46
46
|
height: 100%;
|
|
47
47
|
border-radius: ${({ theme, config }) => config.size.common.borderRadius}px;
|
|
48
48
|
border-collapse: separate;
|
|
@@ -202,7 +202,30 @@ exports.TableSearch = styled_components_1.default.div `
|
|
|
202
202
|
box-sizing: border-box;
|
|
203
203
|
:hover {
|
|
204
204
|
border-color: ${({ theme, config }) => config.color.hover.searchInput.border};
|
|
205
|
+
}
|
|
205
206
|
&:focus-within {
|
|
206
207
|
border-color: ${({ theme, config }) => config.color.active.searchInput.border};
|
|
207
208
|
}
|
|
208
209
|
`;
|
|
210
|
+
exports.TableEmptyState = styled_components_1.default.div `
|
|
211
|
+
display: flex;
|
|
212
|
+
align-items: center;
|
|
213
|
+
justify-content: center;
|
|
214
|
+
width: 100%;
|
|
215
|
+
font-size: ${({ theme, config }) => config.size.header.fontSize}px;
|
|
216
|
+
line-height: ${({ theme, config }) => config.size.header.lineHeight}px;
|
|
217
|
+
color: ${({ theme, config }) => config.color.default.header.text};
|
|
218
|
+
padding: 0 ${({ theme, config }) => config.size.cell.common.paddingX}px;
|
|
219
|
+
background-color: ${({ theme, config }) => config.color.default.common.background};
|
|
220
|
+
height: ${({ theme, config }) => config.size.header.height}px;
|
|
221
|
+
border-bottom: 1px solid
|
|
222
|
+
${({ theme, config }) => config.color.default.common.border};
|
|
223
|
+
box-sizing: border-box;
|
|
224
|
+
`;
|
|
225
|
+
exports.TableFooter = styled_components_1.default.div `
|
|
226
|
+
display: flex;
|
|
227
|
+
padding: 8px 0;
|
|
228
|
+
width:100%;
|
|
229
|
+
justify-content: center;
|
|
230
|
+
|
|
231
|
+
`;
|
|
@@ -1275,13 +1275,13 @@ const createComponentsConfig = (theme = 'default') => {
|
|
|
1275
1275
|
pagination: {
|
|
1276
1276
|
size: {
|
|
1277
1277
|
paginationHeight: exports.measurements.space.xl4,
|
|
1278
|
-
height: exports.measurements.space.
|
|
1279
|
-
width: exports.measurements.space.
|
|
1278
|
+
height: exports.measurements.space.xl2,
|
|
1279
|
+
width: exports.measurements.space.xl2,
|
|
1280
1280
|
itemGap: exports.measurements.space.sm,
|
|
1281
1281
|
elementGap: exports.measurements.space.lg,
|
|
1282
1282
|
borderRadius: exports.measurements.size.radius.sm,
|
|
1283
|
-
fontSize: exports.measurements.font.size.
|
|
1284
|
-
lineHeight: exports.measurements.font.lineHeight.
|
|
1283
|
+
fontSize: exports.measurements.font.size.xs,
|
|
1284
|
+
lineHeight: exports.measurements.font.lineHeight.xs,
|
|
1285
1285
|
},
|
|
1286
1286
|
color: {
|
|
1287
1287
|
default: {
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { Dropdown } from '../Dropdown';
|
|
3
|
+
import { ThemeProvider } from 'styled-components';
|
|
4
|
+
import { resolveThemeWithComponentsConfig, wordbook } from '../../config';
|
|
5
|
+
export const PageSize = ({ theme, themeVariant = 'default', onPageSizeChange, label = wordbook.pagination.dropdownLabel, zIndex, availableValues = [10, 20, 50], pageSize, }) => {
|
|
6
|
+
const resolvedThemeData = resolveThemeWithComponentsConfig({
|
|
7
|
+
theme,
|
|
8
|
+
themeVariant,
|
|
9
|
+
});
|
|
10
|
+
const resolvedTheme = resolvedThemeData.resolvedTheme;
|
|
11
|
+
const pageSizeStr = !isNaN(pageSize) ? String(pageSize) : '10';
|
|
12
|
+
let dropdownOptions = availableValues.map((size) => ({
|
|
13
|
+
value: size.toString(),
|
|
14
|
+
label: size.toString(),
|
|
15
|
+
}));
|
|
16
|
+
if (!dropdownOptions.some((opt) => opt.value === pageSizeStr)) {
|
|
17
|
+
dropdownOptions = [
|
|
18
|
+
{ value: pageSizeStr, label: pageSizeStr },
|
|
19
|
+
...dropdownOptions,
|
|
20
|
+
];
|
|
21
|
+
}
|
|
22
|
+
return (React.createElement(ThemeProvider, { theme: resolvedTheme },
|
|
23
|
+
React.createElement(Dropdown, { size: "sm", label: label, labelPosition: "left", handleChange: (name, value) => {
|
|
24
|
+
const num = Number(value);
|
|
25
|
+
if (!isNaN(num) && num > 0) {
|
|
26
|
+
onPageSizeChange(num);
|
|
27
|
+
}
|
|
28
|
+
}, name: "pageSize", value: String(pageSize), options: dropdownOptions, width: "auto", componentWidth: "80px", zIndex: zIndex })));
|
|
29
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './PageSize';
|
|
@@ -2,10 +2,8 @@ import { resolveThemeWithComponentsConfig } from '../../config';
|
|
|
2
2
|
import { PaginationItem, PaginationItemWrapper, PaginationRoot, } from './Pagination.styles';
|
|
3
3
|
import { Icon } from '../Icon';
|
|
4
4
|
import React from 'react';
|
|
5
|
-
import { Dropdown } from '../Dropdown';
|
|
6
|
-
import { wordbook } from '../../config';
|
|
7
5
|
import { ThemeProvider } from 'styled-components';
|
|
8
|
-
export const Pagination = ({ theme, themeVariant = 'default', currentPage, totalPages,
|
|
6
|
+
export const Pagination = ({ theme, themeVariant = 'default', currentPage, totalPages, onPageChange, }) => {
|
|
9
7
|
const resolvedThemeData = resolveThemeWithComponentsConfig({
|
|
10
8
|
theme,
|
|
11
9
|
themeVariant,
|
|
@@ -33,27 +31,10 @@ export const Pagination = ({ theme, themeVariant = 'default', currentPage, total
|
|
|
33
31
|
return pages;
|
|
34
32
|
};
|
|
35
33
|
const pageNumbers = getPageNumbers(currentPage, totalPages);
|
|
36
|
-
const pageSizeStr = !isNaN(pageSize) ? String(pageSize) : '10';
|
|
37
|
-
let dropdownOptions = availableValues.map((size) => ({
|
|
38
|
-
value: size.toString(),
|
|
39
|
-
label: size.toString(),
|
|
40
|
-
}));
|
|
41
|
-
if (!dropdownOptions.some((opt) => opt.value === pageSizeStr)) {
|
|
42
|
-
dropdownOptions = [
|
|
43
|
-
{ value: pageSizeStr, label: pageSizeStr },
|
|
44
|
-
...dropdownOptions,
|
|
45
|
-
];
|
|
46
|
-
}
|
|
47
34
|
return (React.createElement(ThemeProvider, { theme: resolvedTheme },
|
|
48
35
|
React.createElement(PaginationRoot, { theme: resolvedTheme, config: paginationConfig },
|
|
49
36
|
React.createElement(PaginationItemWrapper, { theme: resolvedTheme, config: paginationConfig },
|
|
50
37
|
React.createElement(Icon, { name: 'back', size: "md", onClick: () => onPageChange(Math.max(1, currentPage - 1)), isDisabled: currentPage === 1 }),
|
|
51
38
|
pageNumbers.map((num, idx) => num === '...' ? (React.createElement("span", { key: `ellipsis-${idx}` }, "...")) : (React.createElement(PaginationItem, { key: num, onClick: () => onPageChange(Number(num)), isActive: num === currentPage, theme: resolvedTheme, config: paginationConfig }, num))),
|
|
52
|
-
React.createElement(Icon, { name: 'forward', size: "md", onClick: () => onPageChange(Math.min(totalPages, currentPage + 1)), isDisabled: currentPage === totalPages }))
|
|
53
|
-
React.createElement(Dropdown, { size: "sm", label: label, labelPosition: "left", handleChange: (name, value) => {
|
|
54
|
-
const num = Number(value);
|
|
55
|
-
if (!isNaN(num) && num > 0) {
|
|
56
|
-
onPageSizeChange(num);
|
|
57
|
-
}
|
|
58
|
-
}, name: "pageSize", value: String(pageSize), options: dropdownOptions, width: 'auto', componentWidth: '80px', zIndex: zIndex }))));
|
|
39
|
+
React.createElement(Icon, { name: 'forward', size: "md", onClick: () => onPageChange(Math.min(totalPages, currentPage + 1)), isDisabled: currentPage === totalPages })))));
|
|
59
40
|
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import styled from 'styled-components';
|
|
2
2
|
export const PaginationRoot = styled.div `
|
|
3
3
|
display: flex;
|
|
4
|
-
justify-content:
|
|
4
|
+
justify-content: center;
|
|
5
5
|
align-items: center;
|
|
6
6
|
width: auto;
|
|
7
7
|
box-sizing: border-box;
|
|
@@ -21,6 +21,8 @@ export const PaginationItem = styled.button `Ś
|
|
|
21
21
|
justify-content: center;
|
|
22
22
|
height: ${({ theme, config }) => config.size.height}px;
|
|
23
23
|
width: ${({ theme, config }) => config.size.width}px;
|
|
24
|
+
font-size: ${({ theme, config }) => config.size.fontSize}px;
|
|
25
|
+
line-height: ${({ theme, config }) => config.size.lineHeight}px;
|
|
24
26
|
background-color: ${({ theme, config, disabled, isActive }) => disabled
|
|
25
27
|
? config.color.disabled.background
|
|
26
28
|
: isActive
|
|
@@ -1,25 +1,25 @@
|
|
|
1
1
|
import { resolveThemeWithComponentsConfig } from '../../config';
|
|
2
|
-
import React, { useCallback, useEffect, useMemo, useState } from 'react';
|
|
2
|
+
import React, { useCallback, useEffect, useMemo, useRef, useState, } from 'react';
|
|
3
3
|
import { applySort, setSortParams } from './tableHelper';
|
|
4
4
|
import { wordbook } from '../../config';
|
|
5
5
|
import { ThemeProvider } from 'styled-components';
|
|
6
|
-
import { HeaderSection, TableBody, TableContent, TableContentWrapper, TableHead, TableHeader, TableHeaderRow, TableRoot, TableRow, TableSearch, } from './Table.styles';
|
|
6
|
+
import { HeaderSection, TableBody, TableContent, TableContentWrapper, TableEmptyState, TableFooter, TableHead, TableHeader, TableHeaderRow, TableRoot, TableRow, TableSearch, } from './Table.styles';
|
|
7
7
|
import { Filters } from '../Filters';
|
|
8
8
|
import { Pagination } from '../Pagination';
|
|
9
9
|
import { HeaderCell } from './HeaderCell';
|
|
10
10
|
import { Cell } from './Cell';
|
|
11
11
|
import { SearchInput } from '../SearchInput';
|
|
12
|
+
import { PageSize } from '../PageSize';
|
|
12
13
|
export const Table = ({ theme, themeVariant = 'default', headers, elements, hover = true, selectable = true, filtrable = false, pagination = false, sortable = true, sort = {
|
|
13
14
|
name: '',
|
|
14
15
|
order: 'none',
|
|
15
|
-
}, pageSize = 20, moreActions = [], onRowClick, filterLabels,
|
|
16
|
+
}, pageSize = 20, moreActions = [], onRowClick, filterLabels, pageSizeAvailableValues, tableHeight, tableWrapperHeight, paginationLabel, calendarLabels, calendarLocaleLabels, paginationZIndex, headerExtraContent, searchable = true, searchInputPlaceholder = wordbook.searchInput.placeholder, noResultsText = wordbook.table.filterEmptyState, emptyStateText = wordbook.table.emptyState, }) => {
|
|
16
17
|
const resolvedThemeData = resolveThemeWithComponentsConfig({
|
|
17
18
|
theme,
|
|
18
19
|
themeVariant,
|
|
19
20
|
});
|
|
20
21
|
const resolvedTheme = resolvedThemeData.resolvedTheme;
|
|
21
22
|
const { componentsConfig } = resolvedThemeData;
|
|
22
|
-
const [searchValue, setSearchValue] = useState('');
|
|
23
23
|
const tableConfig = componentsConfig.table;
|
|
24
24
|
const tableHeaders = useMemo(() => {
|
|
25
25
|
const nextHeaders = [...headers];
|
|
@@ -43,86 +43,115 @@ export const Table = ({ theme, themeVariant = 'default', headers, elements, hove
|
|
|
43
43
|
const [currentPageSize, setCurrentPageSize] = useState(pageSize || 10);
|
|
44
44
|
const [noResultsMessage, setNoResultsMessage] = useState(null);
|
|
45
45
|
const [filtersClearSignal, setFiltersClearSignal] = useState(0);
|
|
46
|
+
const searchRef = useRef('');
|
|
47
|
+
const filteredBaseRef = useRef(fullElements);
|
|
48
|
+
const setSearch = useCallback((value) => {
|
|
49
|
+
searchRef.current = value;
|
|
50
|
+
}, []);
|
|
51
|
+
const searchFiltering = useCallback((sourceElements, searchValue) => {
|
|
52
|
+
const normalizedSearchValue = searchValue.toLowerCase().trim();
|
|
53
|
+
if (!normalizedSearchValue) {
|
|
54
|
+
return sourceElements;
|
|
55
|
+
}
|
|
56
|
+
return sourceElements.filter((item) => {
|
|
57
|
+
return tableHeaders.some((header) => {
|
|
58
|
+
if (header.action) {
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
const fieldValue = item[header.valueSource];
|
|
62
|
+
if (typeof fieldValue === 'string') {
|
|
63
|
+
return fieldValue.toLowerCase().includes(normalizedSearchValue);
|
|
64
|
+
}
|
|
65
|
+
if (typeof fieldValue === 'number') {
|
|
66
|
+
return fieldValue.toString().includes(normalizedSearchValue);
|
|
67
|
+
}
|
|
68
|
+
return false;
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
}, [tableHeaders]);
|
|
72
|
+
const updateTableElements = useCallback((nextElements) => {
|
|
73
|
+
setTableElementsState(nextElements);
|
|
74
|
+
setCurrentPage(1);
|
|
75
|
+
setNoResultsMessage(nextElements.length === 0
|
|
76
|
+
? fullElements.length === 0
|
|
77
|
+
? emptyStateText
|
|
78
|
+
: noResultsText
|
|
79
|
+
: null);
|
|
80
|
+
}, []);
|
|
81
|
+
useEffect(() => {
|
|
82
|
+
filteredBaseRef.current = fullElements;
|
|
83
|
+
const nextElements = searchRef.current
|
|
84
|
+
? searchFiltering(fullElements, searchRef.current)
|
|
85
|
+
: fullElements;
|
|
86
|
+
updateTableElements(nextElements);
|
|
87
|
+
}, [fullElements, searchFiltering, updateTableElements]);
|
|
46
88
|
useEffect(() => {
|
|
47
|
-
setTableElementsState(fullElements);
|
|
48
89
|
setCurrentPage(1);
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
const handleRowClick = (id) => {
|
|
90
|
+
}, [currentPageSize]);
|
|
91
|
+
const handleRowClick = useCallback((id) => {
|
|
52
92
|
if (selectable) {
|
|
53
93
|
setSelectedRow(id);
|
|
54
94
|
}
|
|
55
95
|
onRowClick?.(id);
|
|
56
|
-
};
|
|
57
|
-
const handleHeaderCellClick = (targetValue, order) => {
|
|
96
|
+
}, [selectable, onRowClick]);
|
|
97
|
+
const handleHeaderCellClick = useCallback((targetValue, order) => {
|
|
58
98
|
if (!sortable) {
|
|
59
99
|
return;
|
|
60
100
|
}
|
|
61
101
|
const newSort = setSortParams(targetValue, order, tableSort);
|
|
62
102
|
setTableSort(newSort);
|
|
63
103
|
setTableElementsState((prev) => applySort(newSort, prev));
|
|
64
|
-
};
|
|
65
|
-
const handleApplyFilters = useCallback((
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
}, []);
|
|
104
|
+
}, [sortable, tableSort]);
|
|
105
|
+
const handleApplyFilters = useCallback((filtered) => {
|
|
106
|
+
filteredBaseRef.current = filtered;
|
|
107
|
+
const nextElements = searchRef.current
|
|
108
|
+
? searchFiltering(filtered, searchRef.current)
|
|
109
|
+
: filtered;
|
|
110
|
+
updateTableElements(nextElements);
|
|
111
|
+
}, [searchFiltering, updateTableElements]);
|
|
72
112
|
const handleClearFilters = useCallback(() => {
|
|
73
|
-
setFiltersClearSignal((
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
113
|
+
setFiltersClearSignal((prev) => prev + 1);
|
|
114
|
+
filteredBaseRef.current = fullElements;
|
|
115
|
+
const nextElements = searchRef.current
|
|
116
|
+
? searchFiltering(fullElements, searchRef.current)
|
|
117
|
+
: fullElements;
|
|
118
|
+
updateTableElements(nextElements);
|
|
119
|
+
}, [fullElements, searchFiltering, updateTableElements]);
|
|
120
|
+
const handleSearchChange = useCallback((value) => {
|
|
121
|
+
const searchValue = value.toLowerCase().trim();
|
|
122
|
+
setSearch(searchValue);
|
|
123
|
+
const baseElements = filteredBaseRef.current;
|
|
124
|
+
const nextElements = searchValue
|
|
125
|
+
? searchFiltering(baseElements, searchValue)
|
|
126
|
+
: baseElements;
|
|
127
|
+
updateTableElements(nextElements);
|
|
128
|
+
}, [searchFiltering, setSearch, updateTableElements]);
|
|
81
129
|
const totalPages = Math.ceil(tableElementsState.length / currentPageSize);
|
|
82
130
|
const paginatedElements = useMemo(() => {
|
|
83
131
|
return tableElementsState.slice((currentPage - 1) * currentPageSize, currentPage * currentPageSize);
|
|
84
132
|
}, [tableElementsState, currentPage, currentPageSize]);
|
|
85
|
-
const
|
|
86
|
-
setSearchValue(value);
|
|
87
|
-
};
|
|
88
|
-
const getVisableElements = () => {
|
|
89
|
-
const visable = pagination ? paginatedElements : tableElementsState;
|
|
90
|
-
if (searchValue) {
|
|
91
|
-
const searchValueLower = searchValue.toLowerCase();
|
|
92
|
-
return visable.filter((item) => {
|
|
93
|
-
return tableHeaders.some((header) => {
|
|
94
|
-
const value = item[header.valueSource];
|
|
95
|
-
if (value && typeof value === 'string') {
|
|
96
|
-
return value.toLowerCase().includes(searchValueLower);
|
|
97
|
-
}
|
|
98
|
-
else if (value && typeof value === 'number') {
|
|
99
|
-
return value.toString().toLowerCase().includes(searchValueLower);
|
|
100
|
-
}
|
|
101
|
-
return false;
|
|
102
|
-
});
|
|
103
|
-
});
|
|
104
|
-
}
|
|
105
|
-
return visable;
|
|
106
|
-
};
|
|
107
|
-
const visibleElements = getVisableElements();
|
|
133
|
+
const visibleElements = pagination ? paginatedElements : tableElementsState;
|
|
108
134
|
return (React.createElement(ThemeProvider, { theme: resolvedTheme },
|
|
109
135
|
React.createElement(TableRoot, { theme: resolvedTheme, config: tableConfig, componentHeight: tableWrapperHeight },
|
|
110
136
|
React.createElement(React.Fragment, null,
|
|
111
|
-
(filtrable || pagination) && (React.createElement(TableHeader, { theme: resolvedTheme, config: tableConfig, right: pagination && !filtrable },
|
|
137
|
+
(filtrable || pagination || searchable || headerExtraContent) && (React.createElement(TableHeader, { theme: resolvedTheme, config: tableConfig, right: (pagination || searchable) && !filtrable },
|
|
112
138
|
React.createElement(React.Fragment, null,
|
|
113
|
-
(filtrable || headerExtraContent) && (React.createElement(
|
|
114
|
-
|
|
115
|
-
|
|
139
|
+
(filtrable || headerExtraContent) && (React.createElement(React.Fragment, null,
|
|
140
|
+
React.createElement(HeaderSection, null,
|
|
141
|
+
filtrable && (React.createElement(Filters, { labels: filterLabels, headers: headers, elements: fullElements, fullElements: fullElements, handleSubmitFilters: handleApplyFilters, externalClearSignal: filtersClearSignal, onClear: handleClearFilters, calendarLabels: calendarLabels, calendarLocaleLabels: calendarLocaleLabels })),
|
|
142
|
+
headerExtraContent && (React.createElement(HeaderSection, null, headerExtraContent))))),
|
|
116
143
|
(pagination || searchable) && (React.createElement(HeaderSection, { right: true },
|
|
117
144
|
searchable && (React.createElement(TableSearch, { theme: resolvedTheme, config: tableConfig },
|
|
118
145
|
React.createElement(SearchInput, { placeholder: searchInputPlaceholder, handleSearch: handleSearchChange }))),
|
|
119
|
-
pagination && (React.createElement(
|
|
146
|
+
pagination && (React.createElement(PageSize, { label: paginationLabel?.label, zIndex: paginationZIndex, onPageSizeChange: setCurrentPageSize, availableValues: pageSizeAvailableValues, pageSize: currentPageSize }))))))),
|
|
120
147
|
React.createElement(TableContentWrapper, { componentHeight: tableHeight },
|
|
121
|
-
React.createElement(TableContent, { theme: resolvedTheme, config: tableConfig, cellPadding: "0", cellSpacing: "0" },
|
|
148
|
+
React.createElement(TableContent, { theme: resolvedTheme, config: tableConfig, cellPadding: "0", cellSpacing: "0", isEmpty: visibleElements.length === 0 },
|
|
122
149
|
React.createElement(TableHead, null,
|
|
123
150
|
React.createElement(TableHeaderRow, { theme: resolvedTheme, config: tableConfig }, tableHeaders.map((header) => (React.createElement(HeaderCell, { key: `header_${header.name}`, header: header, sortable: sortable, handleSort: handleHeaderCellClick, sort: tableSort, size: header.size || 'md' }))))),
|
|
124
151
|
React.createElement(TableBody, null, visibleElements.map((item) => (React.createElement(TableRow, { theme: resolvedTheme, config: tableConfig, key: `table_row_${item.id}`, hover: hover, isDisabled: item.disabled, active: selectedRow === item.id, selectable: selectable, onClick: !item.disabled
|
|
125
152
|
? () => handleRowClick(item.id)
|
|
126
|
-
: undefined }, tableHeaders.map((header, index) => (React.createElement(Cell, { key: `cell_${header.name}_${item.id}`, header: header, moreActions: moreActions, item: item, theme: theme, selected: item.marked && index === 0, isDisabled: item.disabled }))))))))
|
|
127
|
-
|
|
153
|
+
: undefined }, tableHeaders.map((header, index) => (React.createElement(Cell, { key: `cell_${header.name}_${item.id}`, header: header, moreActions: moreActions, item: item, theme: theme, selected: item.marked && index === 0, isDisabled: item.disabled })))))))),
|
|
154
|
+
pagination && totalPages > 1 && visibleElements.length > 0 && (React.createElement(TableFooter, null,
|
|
155
|
+
React.createElement(Pagination, { currentPage: currentPage, totalPages: totalPages, onPageChange: setCurrentPage })))),
|
|
156
|
+
noResultsMessage && (React.createElement(TableEmptyState, { theme: resolvedTheme, config: tableConfig }, noResultsMessage))))));
|
|
128
157
|
};
|
|
@@ -9,8 +9,7 @@ export const TableHeader = styled.div `
|
|
|
9
9
|
display: flex;
|
|
10
10
|
align-items: center;
|
|
11
11
|
flex-shrink: 0;
|
|
12
|
-
|
|
13
|
-
justify-content: space-between;
|
|
12
|
+
justify-content: ${({ right }) => (right ? 'flex-end' : 'space-between')};
|
|
14
13
|
height: ${({ theme, config }) => config.size.header.height}px;
|
|
15
14
|
`;
|
|
16
15
|
export const TableContentWrapper = styled.div `
|
|
@@ -23,6 +22,7 @@ export const TableContentWrapper = styled.div `
|
|
|
23
22
|
overflow-x: auto;
|
|
24
23
|
height: ${({ componentHeight }) => componentHeight || '100%'};
|
|
25
24
|
flex-shrink: 0;
|
|
25
|
+
flex-direction: column;
|
|
26
26
|
`;
|
|
27
27
|
export const HeaderSection = styled.div `
|
|
28
28
|
display: flex;
|
|
@@ -35,8 +35,8 @@ export const TableContent = styled.table `
|
|
|
35
35
|
box-sizing: border-box;
|
|
36
36
|
display: block;
|
|
37
37
|
width: 100%;
|
|
38
|
-
overflow-x: auto;
|
|
39
|
-
overflow-y: auto;
|
|
38
|
+
overflow-x: ${({ isEmpty }) => (isEmpty ? 'hidden' : 'auto')};
|
|
39
|
+
overflow-y: ${({ isEmpty }) => (isEmpty ? 'hidden' : 'auto')};
|
|
40
40
|
height: 100%;
|
|
41
41
|
border-radius: ${({ theme, config }) => config.size.common.borderRadius}px;
|
|
42
42
|
border-collapse: separate;
|
|
@@ -196,7 +196,30 @@ export const TableSearch = styled.div `
|
|
|
196
196
|
box-sizing: border-box;
|
|
197
197
|
:hover {
|
|
198
198
|
border-color: ${({ theme, config }) => config.color.hover.searchInput.border};
|
|
199
|
+
}
|
|
199
200
|
&:focus-within {
|
|
200
201
|
border-color: ${({ theme, config }) => config.color.active.searchInput.border};
|
|
201
202
|
}
|
|
202
203
|
`;
|
|
204
|
+
export const TableEmptyState = styled.div `
|
|
205
|
+
display: flex;
|
|
206
|
+
align-items: center;
|
|
207
|
+
justify-content: center;
|
|
208
|
+
width: 100%;
|
|
209
|
+
font-size: ${({ theme, config }) => config.size.header.fontSize}px;
|
|
210
|
+
line-height: ${({ theme, config }) => config.size.header.lineHeight}px;
|
|
211
|
+
color: ${({ theme, config }) => config.color.default.header.text};
|
|
212
|
+
padding: 0 ${({ theme, config }) => config.size.cell.common.paddingX}px;
|
|
213
|
+
background-color: ${({ theme, config }) => config.color.default.common.background};
|
|
214
|
+
height: ${({ theme, config }) => config.size.header.height}px;
|
|
215
|
+
border-bottom: 1px solid
|
|
216
|
+
${({ theme, config }) => config.color.default.common.border};
|
|
217
|
+
box-sizing: border-box;
|
|
218
|
+
`;
|
|
219
|
+
export const TableFooter = styled.div `
|
|
220
|
+
display: flex;
|
|
221
|
+
padding: 8px 0;
|
|
222
|
+
width:100%;
|
|
223
|
+
justify-content: center;
|
|
224
|
+
|
|
225
|
+
`;
|
|
@@ -1270,13 +1270,13 @@ export const createComponentsConfig = (theme = 'default') => {
|
|
|
1270
1270
|
pagination: {
|
|
1271
1271
|
size: {
|
|
1272
1272
|
paginationHeight: measurements.space.xl4,
|
|
1273
|
-
height: measurements.space.
|
|
1274
|
-
width: measurements.space.
|
|
1273
|
+
height: measurements.space.xl2,
|
|
1274
|
+
width: measurements.space.xl2,
|
|
1275
1275
|
itemGap: measurements.space.sm,
|
|
1276
1276
|
elementGap: measurements.space.lg,
|
|
1277
1277
|
borderRadius: measurements.size.radius.sm,
|
|
1278
|
-
fontSize: measurements.font.size.
|
|
1279
|
-
lineHeight: measurements.font.lineHeight.
|
|
1278
|
+
fontSize: measurements.font.size.xs,
|
|
1279
|
+
lineHeight: measurements.font.lineHeight.xs,
|
|
1280
1280
|
},
|
|
1281
1281
|
color: {
|
|
1282
1282
|
default: {
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { FC } from 'react';
|
|
2
|
+
import { AppTheme, ThemeName } from '../../config';
|
|
3
|
+
interface IPageSizeProps {
|
|
4
|
+
theme?: AppTheme;
|
|
5
|
+
themeVariant?: ThemeName;
|
|
6
|
+
label?: string;
|
|
7
|
+
zIndex?: number;
|
|
8
|
+
onPageSizeChange: (size: number) => void;
|
|
9
|
+
availableValues?: number[];
|
|
10
|
+
pageSize: number;
|
|
11
|
+
}
|
|
12
|
+
export declare const PageSize: FC<IPageSizeProps>;
|
|
13
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from './PageSize';
|
|
@@ -5,12 +5,7 @@ interface IPaginationProps {
|
|
|
5
5
|
themeVariant?: ThemeName;
|
|
6
6
|
currentPage: number;
|
|
7
7
|
totalPages: number;
|
|
8
|
-
pageSize: number;
|
|
9
8
|
onPageChange: (page: number) => void;
|
|
10
|
-
onPageSizeChange: (size: number) => void;
|
|
11
|
-
availableValues?: number[];
|
|
12
|
-
label?: string;
|
|
13
|
-
zIndex?: number;
|
|
14
9
|
}
|
|
15
10
|
export declare const Pagination: FC<IPaginationProps>;
|
|
16
11
|
export {};
|
|
@@ -15,7 +15,7 @@ interface ITableProps {
|
|
|
15
15
|
pageSize?: number;
|
|
16
16
|
onRowClick?: (id: string) => void;
|
|
17
17
|
pagination?: boolean;
|
|
18
|
-
|
|
18
|
+
pageSizeAvailableValues?: number[];
|
|
19
19
|
tableHeight?: string;
|
|
20
20
|
tableWrapperHeight?: string;
|
|
21
21
|
filterLabels?: IFilterLabels;
|
|
@@ -26,6 +26,8 @@ interface ITableProps {
|
|
|
26
26
|
headerExtraContent?: React.ReactNode;
|
|
27
27
|
searchable?: boolean;
|
|
28
28
|
searchInputPlaceholder?: string;
|
|
29
|
+
noResultsText?: string;
|
|
30
|
+
emptyStateText?: string;
|
|
29
31
|
}
|
|
30
32
|
export interface ITableHeaderProps {
|
|
31
33
|
name: string;
|
|
@@ -23,6 +23,7 @@ export declare const HeaderSection: import("styled-components").StyledComponent<
|
|
|
23
23
|
interface ITableContentProps {
|
|
24
24
|
theme: AppTheme;
|
|
25
25
|
config: any;
|
|
26
|
+
isEmpty: boolean;
|
|
26
27
|
}
|
|
27
28
|
export declare const TableContent: import("styled-components").StyledComponent<"table", import("styled-components").DefaultTheme, ITableContentProps, never>;
|
|
28
29
|
export declare const TableHead: import("styled-components").StyledComponent<"thead", import("styled-components").DefaultTheme, {}, never>;
|
|
@@ -85,4 +86,10 @@ interface ITableSearchProps {
|
|
|
85
86
|
config: any;
|
|
86
87
|
}
|
|
87
88
|
export declare const TableSearch: import("styled-components").StyledComponent<"div", import("styled-components").DefaultTheme, ITableSearchProps, never>;
|
|
89
|
+
interface ITableEmptyStateProps {
|
|
90
|
+
theme: AppTheme;
|
|
91
|
+
config: any;
|
|
92
|
+
}
|
|
93
|
+
export declare const TableEmptyState: import("styled-components").StyledComponent<"div", import("styled-components").DefaultTheme, ITableEmptyStateProps, never>;
|
|
94
|
+
export declare const TableFooter: import("styled-components").StyledComponent<"div", import("styled-components").DefaultTheme, {}, never>;
|
|
88
95
|
export {};
|
|
@@ -1313,13 +1313,13 @@ export declare const createComponentsConfig: (theme?: ThemeName | AppTheme) => {
|
|
|
1313
1313
|
pagination: {
|
|
1314
1314
|
size: {
|
|
1315
1315
|
paginationHeight: 32;
|
|
1316
|
-
height:
|
|
1317
|
-
width:
|
|
1316
|
+
height: 24;
|
|
1317
|
+
width: 24;
|
|
1318
1318
|
itemGap: 8;
|
|
1319
1319
|
elementGap: 16;
|
|
1320
1320
|
borderRadius: 8;
|
|
1321
|
-
fontSize:
|
|
1322
|
-
lineHeight:
|
|
1321
|
+
fontSize: 12;
|
|
1322
|
+
lineHeight: 16;
|
|
1323
1323
|
};
|
|
1324
1324
|
color: {
|
|
1325
1325
|
default: {
|
|
@@ -2677,13 +2677,13 @@ export declare const componentsConfig: {
|
|
|
2677
2677
|
pagination: {
|
|
2678
2678
|
size: {
|
|
2679
2679
|
paginationHeight: 32;
|
|
2680
|
-
height:
|
|
2681
|
-
width:
|
|
2680
|
+
height: 24;
|
|
2681
|
+
width: 24;
|
|
2682
2682
|
itemGap: 8;
|
|
2683
2683
|
elementGap: 16;
|
|
2684
2684
|
borderRadius: 8;
|
|
2685
|
-
fontSize:
|
|
2686
|
-
lineHeight:
|
|
2685
|
+
fontSize: 12;
|
|
2686
|
+
lineHeight: 16;
|
|
2687
2687
|
};
|
|
2688
2688
|
color: {
|
|
2689
2689
|
default: {
|
|
@@ -4186,13 +4186,13 @@ export declare const createConfig: (theme?: ThemeName | AppTheme) => {
|
|
|
4186
4186
|
pagination: {
|
|
4187
4187
|
size: {
|
|
4188
4188
|
paginationHeight: 32;
|
|
4189
|
-
height:
|
|
4190
|
-
width:
|
|
4189
|
+
height: 24;
|
|
4190
|
+
width: 24;
|
|
4191
4191
|
itemGap: 8;
|
|
4192
4192
|
elementGap: 16;
|
|
4193
4193
|
borderRadius: 8;
|
|
4194
|
-
fontSize:
|
|
4195
|
-
lineHeight:
|
|
4194
|
+
fontSize: 12;
|
|
4195
|
+
lineHeight: 16;
|
|
4196
4196
|
};
|
|
4197
4197
|
color: {
|
|
4198
4198
|
default: {
|