venice-ui 3.0.54 → 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.
@@ -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, pageSize, onPageChange, onPageSizeChange, availableValues = [10, 20, 50], label = config_2.wordbook.pagination.dropdownLabel, zIndex }) => {
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: flex-end;
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
@@ -44,10 +44,12 @@ const Filters_1 = require("../Filters");
44
44
  const Pagination_1 = require("../Pagination");
45
45
  const HeaderCell_1 = require("./HeaderCell");
46
46
  const Cell_1 = require("./Cell");
47
+ const SearchInput_1 = require("../SearchInput");
48
+ const PageSize_1 = require("../PageSize");
47
49
  const Table = ({ theme, themeVariant = 'default', headers, elements, hover = true, selectable = true, filtrable = false, pagination = false, sortable = true, sort = {
48
50
  name: '',
49
51
  order: 'none',
50
- }, pageSize = 20, moreActions = [], onRowClick, filterLabels, paginationCounters, tableHeight, tableWrapperHeight, paginationLabel, calendarLabels, calendarLocaleLabels, paginationZIndex, headerExtraContent, }) => {
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, }) => {
51
53
  const resolvedThemeData = (0, config_1.resolveThemeWithComponentsConfig)({
52
54
  theme,
53
55
  themeVariant,
@@ -77,41 +79,89 @@ const Table = ({ theme, themeVariant = 'default', headers, elements, hover = tru
77
79
  const [currentPageSize, setCurrentPageSize] = (0, react_1.useState)(pageSize || 10);
78
80
  const [noResultsMessage, setNoResultsMessage] = (0, react_1.useState)(null);
79
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]);
80
124
  (0, react_1.useEffect)(() => {
81
- setTableElementsState(fullElements);
82
125
  setCurrentPage(1);
83
- setNoResultsMessage(null);
84
- }, [fullElements]);
85
- const handleRowClick = (id) => {
126
+ }, [currentPageSize]);
127
+ const handleRowClick = (0, react_1.useCallback)((id) => {
86
128
  if (selectable) {
87
129
  setSelectedRow(id);
88
130
  }
89
131
  onRowClick?.(id);
90
- };
91
- const handleHeaderCellClick = (targetValue, order) => {
132
+ }, [selectable, onRowClick]);
133
+ const handleHeaderCellClick = (0, react_1.useCallback)((targetValue, order) => {
92
134
  if (!sortable) {
93
135
  return;
94
136
  }
95
137
  const newSort = (0, tableHelper_1.setSortParams)(targetValue, order, tableSort);
96
138
  setTableSort(newSort);
97
139
  setTableElementsState((prev) => (0, tableHelper_1.applySort)(newSort, prev));
98
- };
99
- const handleApplyFilters = (0, react_1.useCallback)((filteredElements) => {
100
- setTableElementsState(filteredElements);
101
- setCurrentPage(1);
102
- setNoResultsMessage(filteredElements && filteredElements.length === 0
103
- ? config_2.wordbook.table.filterEmptyState
104
- : null);
105
- }, []);
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]);
106
148
  const handleClearFilters = (0, react_1.useCallback)(() => {
107
- setFiltersClearSignal((s) => s + 1);
108
- setTableElementsState(fullElements.slice());
109
- setCurrentPage(1);
110
- setNoResultsMessage(null);
111
- }, [fullElements]);
112
- (0, react_1.useEffect)(() => {
113
- setCurrentPage(1);
114
- }, [currentPageSize]);
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]);
115
165
  const totalPages = Math.ceil(tableElementsState.length / currentPageSize);
116
166
  const paginatedElements = (0, react_1.useMemo)(() => {
117
167
  return tableElementsState.slice((currentPage - 1) * currentPageSize, currentPage * currentPageSize);
@@ -120,20 +170,25 @@ const Table = ({ theme, themeVariant = 'default', headers, elements, hover = tru
120
170
  return (react_1.default.createElement(styled_components_1.ThemeProvider, { theme: resolvedTheme },
121
171
  react_1.default.createElement(Table_styles_1.TableRoot, { theme: resolvedTheme, config: tableConfig, componentHeight: tableWrapperHeight },
122
172
  react_1.default.createElement(react_1.default.Fragment, null,
123
- (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 },
124
174
  react_1.default.createElement(react_1.default.Fragment, null,
125
- filtrable && (react_1.default.createElement(Table_styles_1.HeaderSection, null,
126
- 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 }))),
127
- headerExtraContent && (react_1.default.createElement(Table_styles_1.HeaderSection, null, headerExtraContent)),
128
- pagination && (react_1.default.createElement(Table_styles_1.HeaderSection, { right: true },
129
- react_1.default.createElement(Pagination_1.Pagination, { currentPage: currentPage, totalPages: totalPages, pageSize: currentPageSize, onPageChange: setCurrentPage, onPageSizeChange: setCurrentPageSize, label: paginationLabel?.label, availableValues: paginationCounters, zIndex: paginationZIndex })))))),
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))))),
179
+ (pagination || searchable) && (react_1.default.createElement(Table_styles_1.HeaderSection, { right: true },
180
+ searchable && (react_1.default.createElement(Table_styles_1.TableSearch, { theme: resolvedTheme, config: tableConfig },
181
+ react_1.default.createElement(SearchInput_1.SearchInput, { placeholder: searchInputPlaceholder, handleSearch: handleSearchChange }))),
182
+ pagination && (react_1.default.createElement(PageSize_1.PageSize, { label: paginationLabel?.label, zIndex: paginationZIndex, onPageSizeChange: setCurrentPageSize, availableValues: pageSizeAvailableValues, pageSize: currentPageSize }))))))),
130
183
  react_1.default.createElement(Table_styles_1.TableContentWrapper, { componentHeight: tableHeight },
131
- 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 },
132
185
  react_1.default.createElement(Table_styles_1.TableHead, null,
133
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' }))))),
134
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
135
188
  ? () => handleRowClick(item.id)
136
- : 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 }))))))))),
137
- noResultsMessage && (react_1.default.createElement("div", { style: { padding: '8px 12px', textAlign: 'center' } }, noResultsMessage))))));
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))))));
138
193
  };
139
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.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
- // justify-content: ${({ right }) => (right ? 'flex-end' : 'flex-start')};
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,19 +28,21 @@ 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;
35
35
  align-items: center;
36
36
  justify-content: ${({ right }) => (right ? 'flex-end' : 'flex-start')};
37
37
  flex-shrink: 0;
38
+ gap: 8px;
38
39
  `;
39
40
  exports.TableContent = styled_components_1.default.table `
40
41
  box-sizing: border-box;
41
42
  display: block;
42
43
  width: 100%;
43
- overflow-x: auto;
44
- overflow-y: auto;
44
+ overflow-x: ${({ isEmpty }) => (isEmpty ? 'hidden' : 'auto')};
45
+ overflow-y: ${({ isEmpty }) => (isEmpty ? 'hidden' : 'auto')};
45
46
  height: 100%;
46
47
  border-radius: ${({ theme, config }) => config.size.common.borderRadius}px;
47
48
  border-collapse: separate;
@@ -59,7 +60,7 @@ exports.TableHead = styled_components_1.default.thead `
59
60
  position: sticky;
60
61
  top: 0;
61
62
  z-index: 2;
62
- };
63
+ }
63
64
  flex-shrink: 0;
64
65
  `;
65
66
  exports.TableBody = styled_components_1.default.tbody `
@@ -182,3 +183,49 @@ exports.TableCellContent = styled_components_1.default.div `
182
183
  color: ${({ theme, config, disabled }) => disabled ? config.color.disabled.text : config.color.default.header.text};
183
184
  width: 100%;
184
185
  `;
186
+ exports.TableSearch = styled_components_1.default.div `
187
+ width: 100%;
188
+ appearance: textfield;
189
+ padding: 0px ${({ config }) => config.size.searchInput.paddingX}px;
190
+ height: ${({ config }) => config.size.searchInput.height}px;
191
+ border-radius: ${({ config }) => config.size.searchInput.radius}px;
192
+ font-size: ${({ config }) => config.size.searchInput.fontSize}px;
193
+ line-height: ${({ config }) => config.size.searchInput.lineHeight}px;
194
+ flex-direction: row;
195
+ -webkit-box-align: center;
196
+ align-items: center;
197
+ overflow: hidden;
198
+ width: 100%;
199
+ color: ${({ theme, config }) => config.color.default.searchInput.text};
200
+ border: 1px solid ${({ theme, config }) => config.color.default.searchInput.border};
201
+ background: ${({ theme, config }) => config.color.default.searchInput.background};
202
+ box-sizing: border-box;
203
+ :hover {
204
+ border-color: ${({ theme, config }) => config.color.hover.searchInput.border};
205
+ }
206
+ &:focus-within {
207
+ border-color: ${({ theme, config }) => config.color.active.searchInput.border};
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.xl3,
1279
- width: exports.measurements.space.xl3,
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.md,
1284
- lineHeight: exports.measurements.font.lineHeight.md,
1283
+ fontSize: exports.measurements.font.size.xs,
1284
+ lineHeight: exports.measurements.font.lineHeight.xs,
1285
1285
  },
1286
1286
  color: {
1287
1287
  default: {
@@ -1420,6 +1420,13 @@ const createComponentsConfig = (theme = 'default') => {
1420
1420
  },
1421
1421
  },
1422
1422
  },
1423
+ searchInput: {
1424
+ height: exports.measurements.space.xl4,
1425
+ paddingX: exports.measurements.space.sm,
1426
+ radius: exports.measurements.size.radius.sm,
1427
+ fontSize: exports.measurements.font.size.sm,
1428
+ lineHeight: exports.measurements.font.lineHeight.sm,
1429
+ }
1423
1430
  },
1424
1431
  color: {
1425
1432
  default: {
@@ -1432,10 +1439,19 @@ const createComponentsConfig = (theme = 'default') => {
1432
1439
  text: Theme.text.primary,
1433
1440
  sortIcon: Theme.text.primary,
1434
1441
  },
1442
+ searchInput: {
1443
+ background: Theme.surface.default,
1444
+ border: Theme.border.default,
1445
+ text: Theme.text.primary,
1446
+ placeholder: Theme.text.placeholder,
1447
+ }
1435
1448
  },
1436
1449
  hover: {
1437
1450
  background: Theme.surface.hover,
1438
1451
  activeBackground: Theme.action.primary.selectedHover,
1452
+ searchInput: {
1453
+ border: Theme.border.strong,
1454
+ }
1439
1455
  },
1440
1456
  active: {
1441
1457
  background: Theme.action.primary.selected,
@@ -1443,6 +1459,9 @@ const createComponentsConfig = (theme = 'default') => {
1443
1459
  textHeader: Theme.action.primary.default,
1444
1460
  sortIcon: Theme.action.primary.default,
1445
1461
  },
1462
+ searchInput: {
1463
+ border: Theme.border.focus,
1464
+ }
1446
1465
  },
1447
1466
  disabled: {
1448
1467
  text: Theme.text.disabled,
@@ -68,6 +68,7 @@ exports.wordbook = {
68
68
  },
69
69
  table: {
70
70
  filterEmptyState: 'No results found.',
71
+ emptyState: 'No data available.',
71
72
  }
72
73
  };
73
74
  //ToDo zaaktualizować stories dla Lable
@@ -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, pageSize, onPageChange, onPageSizeChange, availableValues = [10, 20, 50], label = wordbook.pagination.dropdownLabel, zIndex }) => {
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: flex-end;
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,17 +1,19 @@
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, } 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
+ import { SearchInput } from '../SearchInput';
12
+ import { PageSize } from '../PageSize';
11
13
  export const Table = ({ theme, themeVariant = 'default', headers, elements, hover = true, selectable = true, filtrable = false, pagination = false, sortable = true, sort = {
12
14
  name: '',
13
15
  order: 'none',
14
- }, pageSize = 20, moreActions = [], onRowClick, filterLabels, paginationCounters, tableHeight, tableWrapperHeight, paginationLabel, calendarLabels, calendarLocaleLabels, paginationZIndex, headerExtraContent, }) => {
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, }) => {
15
17
  const resolvedThemeData = resolveThemeWithComponentsConfig({
16
18
  theme,
17
19
  themeVariant,
@@ -41,41 +43,89 @@ export const Table = ({ theme, themeVariant = 'default', headers, elements, hove
41
43
  const [currentPageSize, setCurrentPageSize] = useState(pageSize || 10);
42
44
  const [noResultsMessage, setNoResultsMessage] = useState(null);
43
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]);
44
88
  useEffect(() => {
45
- setTableElementsState(fullElements);
46
89
  setCurrentPage(1);
47
- setNoResultsMessage(null);
48
- }, [fullElements]);
49
- const handleRowClick = (id) => {
90
+ }, [currentPageSize]);
91
+ const handleRowClick = useCallback((id) => {
50
92
  if (selectable) {
51
93
  setSelectedRow(id);
52
94
  }
53
95
  onRowClick?.(id);
54
- };
55
- const handleHeaderCellClick = (targetValue, order) => {
96
+ }, [selectable, onRowClick]);
97
+ const handleHeaderCellClick = useCallback((targetValue, order) => {
56
98
  if (!sortable) {
57
99
  return;
58
100
  }
59
101
  const newSort = setSortParams(targetValue, order, tableSort);
60
102
  setTableSort(newSort);
61
103
  setTableElementsState((prev) => applySort(newSort, prev));
62
- };
63
- const handleApplyFilters = useCallback((filteredElements) => {
64
- setTableElementsState(filteredElements);
65
- setCurrentPage(1);
66
- setNoResultsMessage(filteredElements && filteredElements.length === 0
67
- ? wordbook.table.filterEmptyState
68
- : null);
69
- }, []);
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]);
70
112
  const handleClearFilters = useCallback(() => {
71
- setFiltersClearSignal((s) => s + 1);
72
- setTableElementsState(fullElements.slice());
73
- setCurrentPage(1);
74
- setNoResultsMessage(null);
75
- }, [fullElements]);
76
- useEffect(() => {
77
- setCurrentPage(1);
78
- }, [currentPageSize]);
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]);
79
129
  const totalPages = Math.ceil(tableElementsState.length / currentPageSize);
80
130
  const paginatedElements = useMemo(() => {
81
131
  return tableElementsState.slice((currentPage - 1) * currentPageSize, currentPage * currentPageSize);
@@ -84,19 +134,24 @@ export const Table = ({ theme, themeVariant = 'default', headers, elements, hove
84
134
  return (React.createElement(ThemeProvider, { theme: resolvedTheme },
85
135
  React.createElement(TableRoot, { theme: resolvedTheme, config: tableConfig, componentHeight: tableWrapperHeight },
86
136
  React.createElement(React.Fragment, null,
87
- (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 },
88
138
  React.createElement(React.Fragment, null,
89
- filtrable && (React.createElement(HeaderSection, null,
90
- React.createElement(Filters, { labels: filterLabels, headers: headers, elements: fullElements, fullElements: fullElements, handleSubmitFilters: handleApplyFilters, externalClearSignal: filtersClearSignal, onClear: handleClearFilters, calendarLabels: calendarLabels, calendarLocaleLabels: calendarLocaleLabels }))),
91
- headerExtraContent && (React.createElement(HeaderSection, null, headerExtraContent)),
92
- pagination && (React.createElement(HeaderSection, { right: true },
93
- React.createElement(Pagination, { currentPage: currentPage, totalPages: totalPages, pageSize: currentPageSize, onPageChange: setCurrentPage, onPageSizeChange: setCurrentPageSize, label: paginationLabel?.label, availableValues: paginationCounters, zIndex: paginationZIndex })))))),
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))))),
143
+ (pagination || searchable) && (React.createElement(HeaderSection, { right: true },
144
+ searchable && (React.createElement(TableSearch, { theme: resolvedTheme, config: tableConfig },
145
+ React.createElement(SearchInput, { placeholder: searchInputPlaceholder, handleSearch: handleSearchChange }))),
146
+ pagination && (React.createElement(PageSize, { label: paginationLabel?.label, zIndex: paginationZIndex, onPageSizeChange: setCurrentPageSize, availableValues: pageSizeAvailableValues, pageSize: currentPageSize }))))))),
94
147
  React.createElement(TableContentWrapper, { componentHeight: tableHeight },
95
- 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 },
96
149
  React.createElement(TableHead, null,
97
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' }))))),
98
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
99
152
  ? () => handleRowClick(item.id)
100
- : 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 }))))))))),
101
- noResultsMessage && (React.createElement("div", { style: { padding: '8px 12px', textAlign: 'center' } }, noResultsMessage))))));
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))))));
102
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
- // justify-content: ${({ right }) => (right ? 'flex-end' : 'flex-start')};
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,19 +22,21 @@ 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;
29
29
  align-items: center;
30
30
  justify-content: ${({ right }) => (right ? 'flex-end' : 'flex-start')};
31
31
  flex-shrink: 0;
32
+ gap: 8px;
32
33
  `;
33
34
  export const TableContent = styled.table `
34
35
  box-sizing: border-box;
35
36
  display: block;
36
37
  width: 100%;
37
- overflow-x: auto;
38
- overflow-y: auto;
38
+ overflow-x: ${({ isEmpty }) => (isEmpty ? 'hidden' : 'auto')};
39
+ overflow-y: ${({ isEmpty }) => (isEmpty ? 'hidden' : 'auto')};
39
40
  height: 100%;
40
41
  border-radius: ${({ theme, config }) => config.size.common.borderRadius}px;
41
42
  border-collapse: separate;
@@ -53,7 +54,7 @@ export const TableHead = styled.thead `
53
54
  position: sticky;
54
55
  top: 0;
55
56
  z-index: 2;
56
- };
57
+ }
57
58
  flex-shrink: 0;
58
59
  `;
59
60
  export const TableBody = styled.tbody `
@@ -176,3 +177,49 @@ export const TableCellContent = styled.div `
176
177
  color: ${({ theme, config, disabled }) => disabled ? config.color.disabled.text : config.color.default.header.text};
177
178
  width: 100%;
178
179
  `;
180
+ export const TableSearch = styled.div `
181
+ width: 100%;
182
+ appearance: textfield;
183
+ padding: 0px ${({ config }) => config.size.searchInput.paddingX}px;
184
+ height: ${({ config }) => config.size.searchInput.height}px;
185
+ border-radius: ${({ config }) => config.size.searchInput.radius}px;
186
+ font-size: ${({ config }) => config.size.searchInput.fontSize}px;
187
+ line-height: ${({ config }) => config.size.searchInput.lineHeight}px;
188
+ flex-direction: row;
189
+ -webkit-box-align: center;
190
+ align-items: center;
191
+ overflow: hidden;
192
+ width: 100%;
193
+ color: ${({ theme, config }) => config.color.default.searchInput.text};
194
+ border: 1px solid ${({ theme, config }) => config.color.default.searchInput.border};
195
+ background: ${({ theme, config }) => config.color.default.searchInput.background};
196
+ box-sizing: border-box;
197
+ :hover {
198
+ border-color: ${({ theme, config }) => config.color.hover.searchInput.border};
199
+ }
200
+ &:focus-within {
201
+ border-color: ${({ theme, config }) => config.color.active.searchInput.border};
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.xl3,
1274
- width: measurements.space.xl3,
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.md,
1279
- lineHeight: measurements.font.lineHeight.md,
1278
+ fontSize: measurements.font.size.xs,
1279
+ lineHeight: measurements.font.lineHeight.xs,
1280
1280
  },
1281
1281
  color: {
1282
1282
  default: {
@@ -1415,6 +1415,13 @@ export const createComponentsConfig = (theme = 'default') => {
1415
1415
  },
1416
1416
  },
1417
1417
  },
1418
+ searchInput: {
1419
+ height: measurements.space.xl4,
1420
+ paddingX: measurements.space.sm,
1421
+ radius: measurements.size.radius.sm,
1422
+ fontSize: measurements.font.size.sm,
1423
+ lineHeight: measurements.font.lineHeight.sm,
1424
+ }
1418
1425
  },
1419
1426
  color: {
1420
1427
  default: {
@@ -1427,10 +1434,19 @@ export const createComponentsConfig = (theme = 'default') => {
1427
1434
  text: Theme.text.primary,
1428
1435
  sortIcon: Theme.text.primary,
1429
1436
  },
1437
+ searchInput: {
1438
+ background: Theme.surface.default,
1439
+ border: Theme.border.default,
1440
+ text: Theme.text.primary,
1441
+ placeholder: Theme.text.placeholder,
1442
+ }
1430
1443
  },
1431
1444
  hover: {
1432
1445
  background: Theme.surface.hover,
1433
1446
  activeBackground: Theme.action.primary.selectedHover,
1447
+ searchInput: {
1448
+ border: Theme.border.strong,
1449
+ }
1434
1450
  },
1435
1451
  active: {
1436
1452
  background: Theme.action.primary.selected,
@@ -1438,6 +1454,9 @@ export const createComponentsConfig = (theme = 'default') => {
1438
1454
  textHeader: Theme.action.primary.default,
1439
1455
  sortIcon: Theme.action.primary.default,
1440
1456
  },
1457
+ searchInput: {
1458
+ border: Theme.border.focus,
1459
+ }
1441
1460
  },
1442
1461
  disabled: {
1443
1462
  text: Theme.text.disabled,
@@ -65,6 +65,7 @@ export const wordbook = {
65
65
  },
66
66
  table: {
67
67
  filterEmptyState: 'No results found.',
68
+ emptyState: 'No data available.',
68
69
  }
69
70
  };
70
71
  //ToDo zaaktualizować stories dla Lable
@@ -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
- paginationCounters?: number[];
18
+ pageSizeAvailableValues?: number[];
19
19
  tableHeight?: string;
20
20
  tableWrapperHeight?: string;
21
21
  filterLabels?: IFilterLabels;
@@ -24,6 +24,10 @@ interface ITableProps {
24
24
  calendarLocaleLabels?: ICalendarLocaleLabels;
25
25
  paginationZIndex?: number;
26
26
  headerExtraContent?: React.ReactNode;
27
+ searchable?: boolean;
28
+ searchInputPlaceholder?: string;
29
+ noResultsText?: string;
30
+ emptyStateText?: string;
27
31
  }
28
32
  export interface ITableHeaderProps {
29
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>;
@@ -80,4 +81,15 @@ interface ITableCellContentProps {
80
81
  disabled: boolean;
81
82
  }
82
83
  export declare const TableCellContent: import("styled-components").StyledComponent<"div", import("styled-components").DefaultTheme, ITableCellContentProps, never>;
84
+ interface ITableSearchProps {
85
+ theme: AppTheme;
86
+ config: any;
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>;
83
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: 28;
1317
- width: 28;
1316
+ height: 24;
1317
+ width: 24;
1318
1318
  itemGap: 8;
1319
1319
  elementGap: 16;
1320
1320
  borderRadius: 8;
1321
- fontSize: 14;
1322
- lineHeight: 20;
1321
+ fontSize: 12;
1322
+ lineHeight: 16;
1323
1323
  };
1324
1324
  color: {
1325
1325
  default: {
@@ -1458,6 +1458,13 @@ export declare const createComponentsConfig: (theme?: ThemeName | AppTheme) => {
1458
1458
  };
1459
1459
  };
1460
1460
  };
1461
+ searchInput: {
1462
+ height: 32;
1463
+ paddingX: 8;
1464
+ radius: 8;
1465
+ fontSize: 13;
1466
+ lineHeight: 18;
1467
+ };
1461
1468
  };
1462
1469
  color: {
1463
1470
  default: {
@@ -1470,10 +1477,19 @@ export declare const createComponentsConfig: (theme?: ThemeName | AppTheme) => {
1470
1477
  text: "#111827";
1471
1478
  sortIcon: "#111827";
1472
1479
  };
1480
+ searchInput: {
1481
+ background: "#FFFFFF";
1482
+ border: "#E5E7EB";
1483
+ text: "#111827";
1484
+ placeholder: "#9CA3AF";
1485
+ };
1473
1486
  };
1474
1487
  hover: {
1475
1488
  background: "#F2F8FD";
1476
1489
  activeBackground: "#9FD0EC";
1490
+ searchInput: {
1491
+ border: "#D1D5DB";
1492
+ };
1477
1493
  };
1478
1494
  active: {
1479
1495
  background: "#C7E3F5";
@@ -1481,6 +1497,9 @@ export declare const createComponentsConfig: (theme?: ThemeName | AppTheme) => {
1481
1497
  textHeader: "#3B90CB";
1482
1498
  sortIcon: "#3B90CB";
1483
1499
  };
1500
+ searchInput: {
1501
+ border: "#3B90CB";
1502
+ };
1484
1503
  };
1485
1504
  disabled: {
1486
1505
  text: "#9CA3AF";
@@ -2658,13 +2677,13 @@ export declare const componentsConfig: {
2658
2677
  pagination: {
2659
2678
  size: {
2660
2679
  paginationHeight: 32;
2661
- height: 28;
2662
- width: 28;
2680
+ height: 24;
2681
+ width: 24;
2663
2682
  itemGap: 8;
2664
2683
  elementGap: 16;
2665
2684
  borderRadius: 8;
2666
- fontSize: 14;
2667
- lineHeight: 20;
2685
+ fontSize: 12;
2686
+ lineHeight: 16;
2668
2687
  };
2669
2688
  color: {
2670
2689
  default: {
@@ -2803,6 +2822,13 @@ export declare const componentsConfig: {
2803
2822
  };
2804
2823
  };
2805
2824
  };
2825
+ searchInput: {
2826
+ height: 32;
2827
+ paddingX: 8;
2828
+ radius: 8;
2829
+ fontSize: 13;
2830
+ lineHeight: 18;
2831
+ };
2806
2832
  };
2807
2833
  color: {
2808
2834
  default: {
@@ -2815,10 +2841,19 @@ export declare const componentsConfig: {
2815
2841
  text: "#111827";
2816
2842
  sortIcon: "#111827";
2817
2843
  };
2844
+ searchInput: {
2845
+ background: "#FFFFFF";
2846
+ border: "#E5E7EB";
2847
+ text: "#111827";
2848
+ placeholder: "#9CA3AF";
2849
+ };
2818
2850
  };
2819
2851
  hover: {
2820
2852
  background: "#F2F8FD";
2821
2853
  activeBackground: "#9FD0EC";
2854
+ searchInput: {
2855
+ border: "#D1D5DB";
2856
+ };
2822
2857
  };
2823
2858
  active: {
2824
2859
  background: "#C7E3F5";
@@ -2826,6 +2861,9 @@ export declare const componentsConfig: {
2826
2861
  textHeader: "#3B90CB";
2827
2862
  sortIcon: "#3B90CB";
2828
2863
  };
2864
+ searchInput: {
2865
+ border: "#3B90CB";
2866
+ };
2829
2867
  };
2830
2868
  disabled: {
2831
2869
  text: "#9CA3AF";
@@ -4148,13 +4186,13 @@ export declare const createConfig: (theme?: ThemeName | AppTheme) => {
4148
4186
  pagination: {
4149
4187
  size: {
4150
4188
  paginationHeight: 32;
4151
- height: 28;
4152
- width: 28;
4189
+ height: 24;
4190
+ width: 24;
4153
4191
  itemGap: 8;
4154
4192
  elementGap: 16;
4155
4193
  borderRadius: 8;
4156
- fontSize: 14;
4157
- lineHeight: 20;
4194
+ fontSize: 12;
4195
+ lineHeight: 16;
4158
4196
  };
4159
4197
  color: {
4160
4198
  default: {
@@ -4293,6 +4331,13 @@ export declare const createConfig: (theme?: ThemeName | AppTheme) => {
4293
4331
  };
4294
4332
  };
4295
4333
  };
4334
+ searchInput: {
4335
+ height: 32;
4336
+ paddingX: 8;
4337
+ radius: 8;
4338
+ fontSize: 13;
4339
+ lineHeight: 18;
4340
+ };
4296
4341
  };
4297
4342
  color: {
4298
4343
  default: {
@@ -4305,10 +4350,19 @@ export declare const createConfig: (theme?: ThemeName | AppTheme) => {
4305
4350
  text: "#111827";
4306
4351
  sortIcon: "#111827";
4307
4352
  };
4353
+ searchInput: {
4354
+ background: "#FFFFFF";
4355
+ border: "#E5E7EB";
4356
+ text: "#111827";
4357
+ placeholder: "#9CA3AF";
4358
+ };
4308
4359
  };
4309
4360
  hover: {
4310
4361
  background: "#F2F8FD";
4311
4362
  activeBackground: "#9FD0EC";
4363
+ searchInput: {
4364
+ border: "#D1D5DB";
4365
+ };
4312
4366
  };
4313
4367
  active: {
4314
4368
  background: "#C7E3F5";
@@ -4316,6 +4370,9 @@ export declare const createConfig: (theme?: ThemeName | AppTheme) => {
4316
4370
  textHeader: "#3B90CB";
4317
4371
  sortIcon: "#3B90CB";
4318
4372
  };
4373
+ searchInput: {
4374
+ border: "#3B90CB";
4375
+ };
4319
4376
  };
4320
4377
  disabled: {
4321
4378
  text: "#9CA3AF";
@@ -52,5 +52,6 @@ export declare const wordbook: {
52
52
  };
53
53
  table: {
54
54
  filterEmptyState: string;
55
+ emptyState: string;
55
56
  };
56
57
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "venice-ui",
3
- "version": "3.0.54",
3
+ "version": "3.0.56",
4
4
  "description": "Component library",
5
5
  "main": "index.js",
6
6
  "module": "./dist/esm/index.js",