pne-ui 4.3.0-rc.1 → 4.3.0-rc.2
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/cjs/component/search-ui/SearchUI.d.ts +52 -19
- package/cjs/component/search-ui/SearchUI.js +80 -8
- package/cjs/component/search-ui/SearchUI.js.map +1 -1
- package/cjs/component/table/AbstractTable.d.ts +5 -0
- package/cjs/component/table/AbstractTable.js +16 -2
- package/cjs/component/table/AbstractTable.js.map +1 -1
- package/cjs/component/table/PneTableViewSelector.d.ts +30 -0
- package/cjs/component/table/PneTableViewSelector.js +81 -0
- package/cjs/component/table/PneTableViewSelector.js.map +1 -0
- package/cjs/component/table/useDelayedLoading.d.ts +1 -1
- package/cjs/component/table/useDelayedLoading.js +48 -20
- package/cjs/component/table/useDelayedLoading.js.map +1 -1
- package/cjs/component/table/useTable.d.ts +4 -0
- package/cjs/component/table/useTable.js +116 -32
- package/cjs/component/table/useTable.js.map +1 -1
- package/cjs/exports/search.d.ts +1 -1
- package/cjs/exports/search.js.map +1 -1
- package/cjs/exports/table.d.ts +1 -0
- package/cjs/exports/table.js +3 -1
- package/cjs/exports/table.js.map +1 -1
- package/esm/component/search-ui/SearchUI.d.ts +52 -19
- package/esm/component/search-ui/SearchUI.js +81 -9
- package/esm/component/search-ui/SearchUI.js.map +1 -1
- package/esm/component/table/AbstractTable.d.ts +5 -0
- package/esm/component/table/AbstractTable.js +16 -2
- package/esm/component/table/AbstractTable.js.map +1 -1
- package/esm/component/table/PneTableViewSelector.d.ts +30 -0
- package/esm/component/table/PneTableViewSelector.js +77 -0
- package/esm/component/table/PneTableViewSelector.js.map +1 -0
- package/esm/component/table/useDelayedLoading.d.ts +1 -1
- package/esm/component/table/useDelayedLoading.js +49 -21
- package/esm/component/table/useDelayedLoading.js.map +1 -1
- package/esm/component/table/useTable.d.ts +4 -0
- package/esm/component/table/useTable.js +116 -32
- package/esm/component/table/useTable.js.map +1 -1
- package/esm/exports/search.d.ts +1 -1
- package/esm/exports/search.js.map +1 -1
- package/esm/exports/table.d.ts +1 -0
- package/esm/exports/table.js +1 -0
- package/esm/exports/table.js.map +1 -1
- package/package.json +1 -1
|
@@ -2,7 +2,7 @@ import React, { Dispatch, SetStateAction } from 'react';
|
|
|
2
2
|
import { SearchUIFiltersConfig } from './filters/SearchUIFilters';
|
|
3
3
|
import { CriterionTypeEnum, ExactCriterionSearchLabelEnum, SearchCriteria, SearchUIConditions } from './filters/types';
|
|
4
4
|
import { GetPagedOrderedSortedListRequest, Order } from '../../common';
|
|
5
|
-
import { TableCreateHeaderType } from '../..';
|
|
5
|
+
import { PneTableViewOption, PneTableViewSelectorProps, TableCreateHeaderType } from '../..';
|
|
6
6
|
import { UseTableParams } from '../table/useTable';
|
|
7
7
|
/**
|
|
8
8
|
* Параметры запроса поиска, отправляемые в обработчик данных таблицы.
|
|
@@ -14,7 +14,7 @@ export type SearchParams = Omit<SearchCriteria & GetPagedOrderedSortedListReques
|
|
|
14
14
|
* Свойства компонента {@link SearchUI}.
|
|
15
15
|
* @template D Тип строки данных, возвращаемых запросом поиска и отображаемых в таблице.
|
|
16
16
|
*/
|
|
17
|
-
|
|
17
|
+
type SearchUICommonProps<D extends object> = {
|
|
18
18
|
/**
|
|
19
19
|
* Stable non-secret Selenium scope shared by the filters and results table.
|
|
20
20
|
* Defaults to settingsContextName; set it explicitly when multiple instances may render together.
|
|
@@ -44,22 +44,6 @@ export type SearchUIProps<D extends object> = {
|
|
|
44
44
|
* Внешнее управление состоянием фильтров. При изменении значения происходит синхронизация стора.
|
|
45
45
|
*/
|
|
46
46
|
searchConditions?: Partial<SearchUIConditions>;
|
|
47
|
-
/**
|
|
48
|
-
* Функция загрузки данных по текущим параметрам поиска.
|
|
49
|
-
*/
|
|
50
|
-
searchData: (searchParams: SearchParams) => Promise<D[]>;
|
|
51
|
-
/**
|
|
52
|
-
* Фабрика заголовка таблицы.
|
|
53
|
-
*/
|
|
54
|
-
createTableHeader: TableCreateHeaderType;
|
|
55
|
-
/**
|
|
56
|
-
* Фабрика строки таблицы.
|
|
57
|
-
* @param rowData Данные текущей строки.
|
|
58
|
-
* @param index Индекс строки.
|
|
59
|
-
* @param data Все текущие данные таблицы.
|
|
60
|
-
* @param setData Сеттер для обновления данных таблицы.
|
|
61
|
-
*/
|
|
62
|
-
createTableRow: (rowData: D, index: number, data: D[], setData: Dispatch<SetStateAction<D[]>>) => React.ReactElement;
|
|
63
47
|
/**
|
|
64
48
|
* Кастомизация поведения таблицы (пагинация, отображение, дублирование пагинатора).
|
|
65
49
|
*/
|
|
@@ -73,12 +57,60 @@ export type SearchUIProps<D extends object> = {
|
|
|
73
57
|
*/
|
|
74
58
|
config?: SearchUIFiltersConfig;
|
|
75
59
|
};
|
|
60
|
+
export type SearchUIDataSource<D extends object> = (searchParams: SearchParams) => Promise<D[]>;
|
|
61
|
+
export type SearchUITableRowFactory<D extends object> = (rowData: D, index: number, data: D[], setData: Dispatch<SetStateAction<D[]>>) => React.ReactElement;
|
|
62
|
+
export type SearchUIViewSort = 'preserve' | {
|
|
63
|
+
sortColumnIndex: number;
|
|
64
|
+
sortAsc: boolean;
|
|
65
|
+
};
|
|
66
|
+
export type SearchUIView<D extends object, TViewId extends string = string> = PneTableViewOption<TViewId> & {
|
|
67
|
+
/** Data source used only while this view is selected. */
|
|
68
|
+
searchData: SearchUIDataSource<D>;
|
|
69
|
+
/** Header rendered only while this view is selected. */
|
|
70
|
+
createTableHeader: TableCreateHeaderType;
|
|
71
|
+
/** Row renderer used only while this view is selected. */
|
|
72
|
+
createTableRow: SearchUITableRowFactory<D>;
|
|
73
|
+
/** Optional consumer-owned actions rendered while this view is selected. */
|
|
74
|
+
actions?: React.ReactNode;
|
|
75
|
+
/** Defaults to the common safe sort; preserving another view's sort must be explicit. */
|
|
76
|
+
sortOnActivate?: SearchUIViewSort;
|
|
77
|
+
};
|
|
78
|
+
type SearchUIViewsAccessibleName = {
|
|
79
|
+
'aria-label': string;
|
|
80
|
+
'aria-labelledby'?: never;
|
|
81
|
+
} | {
|
|
82
|
+
'aria-label'?: never;
|
|
83
|
+
'aria-labelledby': string;
|
|
84
|
+
};
|
|
85
|
+
type SearchUIViewsBaseConfig<TViewId extends string> = Omit<PneTableViewSelectorProps<TViewId>, 'actions' | 'aria-label' | 'aria-labelledby' | 'views'>;
|
|
86
|
+
export type SearchUIViewsConfig<D extends object, TViewId extends string = string> = SearchUIViewsBaseConfig<TViewId> & SearchUIViewsAccessibleName & {
|
|
87
|
+
views: readonly SearchUIView<D, TViewId>[];
|
|
88
|
+
/** Optional compatibility/layout wrapper around the library-owned selector. */
|
|
89
|
+
renderViewSelector?: (selector: React.ReactElement) => React.ReactNode;
|
|
90
|
+
};
|
|
91
|
+
type SearchUILegacyTableProps<D extends object> = {
|
|
92
|
+
tableViews?: never;
|
|
93
|
+
/** Function that loads rows for the current search and table state. */
|
|
94
|
+
searchData: SearchUIDataSource<D>;
|
|
95
|
+
/** Table header factory. */
|
|
96
|
+
createTableHeader: TableCreateHeaderType;
|
|
97
|
+
/** Table row factory. */
|
|
98
|
+
createTableRow: SearchUITableRowFactory<D>;
|
|
99
|
+
};
|
|
100
|
+
type SearchUIViewTableProps<D extends object, TViewId extends string> = {
|
|
101
|
+
/** Controlled generic table-view configuration. */
|
|
102
|
+
tableViews: SearchUIViewsConfig<D, TViewId>;
|
|
103
|
+
searchData?: never;
|
|
104
|
+
createTableHeader?: never;
|
|
105
|
+
createTableRow?: never;
|
|
106
|
+
};
|
|
107
|
+
export type SearchUIProps<D extends object, TViewId extends string = string> = SearchUICommonProps<D> & (SearchUILegacyTableProps<D> | SearchUIViewTableProps<D, TViewId>);
|
|
76
108
|
/**
|
|
77
109
|
* Высокоуровневый компонент поискового UI, объединяющий фильтры и таблицу с результатами.
|
|
78
110
|
* @template D Тип строки данных, отображаемых в таблице.
|
|
79
111
|
* @param props Свойства компонента.
|
|
80
112
|
*/
|
|
81
|
-
export declare const SearchUI: <D extends object>(props: SearchUIProps<D>) => React.ReactElement;
|
|
113
|
+
export declare const SearchUI: <D extends object, TViewId extends string = string>(props: SearchUIProps<D, TViewId>) => React.ReactElement;
|
|
82
114
|
/**
|
|
83
115
|
* Преобразует внутреннее состояние фильтров и таблицы в параметры запроса для загрузки данных.
|
|
84
116
|
* @param searchCriteria Текущее состояние критериев поиска.
|
|
@@ -91,3 +123,4 @@ export declare const createSearchParams: (searchCriteria: SearchCriteria, option
|
|
|
91
123
|
order?: Order;
|
|
92
124
|
sortIndex: number;
|
|
93
125
|
}) => SearchParams;
|
|
126
|
+
export {};
|
|
@@ -19,25 +19,44 @@ const SearchUI = (props) => {
|
|
|
19
19
|
};
|
|
20
20
|
exports.SearchUI = SearchUI;
|
|
21
21
|
const SearchUIContent = (props) => {
|
|
22
|
-
const { autoTestId = props.settingsContextName, settingsContextName, possibleCriteria, predefinedCriteria, exactSearchLabels, initialSearchConditions, searchConditions,
|
|
22
|
+
const { autoTestId = props.settingsContextName, settingsContextName, possibleCriteria, predefinedCriteria, exactSearchLabels, initialSearchConditions, searchConditions, tableParams, dataUseState, config, } = props;
|
|
23
|
+
const resolvedTable = resolveSearchUITable(props);
|
|
23
24
|
const searchCriteria = (0, store_1.useSearchUIFiltersStore)(store => store.appliedSearchCriteria);
|
|
24
25
|
const filtersSettingsContextName = (0, store_1.useSearchUIFiltersStore)(store => store.settingsContextName);
|
|
25
26
|
const filtersContextReady = filtersSettingsContextName === settingsContextName;
|
|
26
27
|
// const [criteria, setCriteria] = useSearchCriteria()
|
|
27
|
-
const
|
|
28
|
+
const defaultDisplayOptions = {
|
|
28
29
|
...initialDisplayOptions,
|
|
29
30
|
...tableParams?.displayOptions,
|
|
30
|
-
}
|
|
31
|
-
const
|
|
31
|
+
};
|
|
32
|
+
const [displayOptions, setDisplayOptions] = (0, react_1.useState)(defaultDisplayOptions);
|
|
33
|
+
const resolvedDisplayOptions = resolvedTable.viewId === undefined
|
|
34
|
+
|| resolvedTable.sortOnActivate === 'preserve'
|
|
35
|
+
? displayOptions
|
|
36
|
+
: {
|
|
37
|
+
...defaultDisplayOptions,
|
|
38
|
+
pageSize: displayOptions.pageSize,
|
|
39
|
+
...resolvedTable.sortOnActivate,
|
|
40
|
+
};
|
|
41
|
+
const fetchDataExtraDeps = (0, react_1.useMemo)(() => [searchCriteria, filtersContextReady, resolvedTable.viewId], [searchCriteria, filtersContextReady, resolvedTable.viewId]);
|
|
32
42
|
const { loading, paginator, data, setData, sortIndex, setSortIndex, order, setOrder, onSortChange, } = (0, __1.useTable)({
|
|
33
43
|
rowsPerPageOptions: tableParams?.rowsPerPageOptions,
|
|
34
44
|
duplicatePagination: tableParams?.duplicatePagination,
|
|
35
45
|
paginatorActiveActionSx: tableParams?.paginatorActiveActionSx,
|
|
36
|
-
displayOptions:
|
|
46
|
+
displayOptions: resolvedDisplayOptions,
|
|
37
47
|
onDisplayOptionsChange: setDisplayOptions,
|
|
38
48
|
settingsContextName: settingsContextName,
|
|
39
49
|
dataUseState: dataUseState,
|
|
40
50
|
fetchDataExtraDeps: fetchDataExtraDeps,
|
|
51
|
+
resetDisplayOptions: resolvedTable.viewId === undefined
|
|
52
|
+
? undefined
|
|
53
|
+
: resolvedTable.sortOnActivate === 'preserve'
|
|
54
|
+
? 'preserve'
|
|
55
|
+
: {
|
|
56
|
+
sortColumnIndex: resolvedDisplayOptions.sortColumnIndex,
|
|
57
|
+
sortAsc: resolvedDisplayOptions.sortAsc,
|
|
58
|
+
},
|
|
59
|
+
resetKey: resolvedTable.viewId,
|
|
41
60
|
fetchData: ({ page, pageSize, order, sortIndex }) => {
|
|
42
61
|
if (!searchCriteria?.initialized || !filtersContextReady) {
|
|
43
62
|
return Promise.resolve([]);
|
|
@@ -48,20 +67,73 @@ const SearchUIContent = (props) => {
|
|
|
48
67
|
order,
|
|
49
68
|
sortIndex,
|
|
50
69
|
});
|
|
51
|
-
return searchData(searchParams);
|
|
70
|
+
return resolvedTable.searchData(searchParams);
|
|
52
71
|
},
|
|
53
72
|
});
|
|
73
|
+
const tableViewSelector = props.tableViews
|
|
74
|
+
? createTableViewSelector(props.tableViews, resolvedTable.viewId, resolvedTable.actions, autoTestId)
|
|
75
|
+
: undefined;
|
|
54
76
|
return react_1.default.createElement(react_1.default.Fragment, null,
|
|
55
77
|
react_1.default.createElement(SearchUIFilters_1.SearchUIFiltersContent, { autoTestId: autoTestId, settingsContextName: settingsContextName, possibleCriteria: possibleCriteria, predefinedCriteria: predefinedCriteria, exactSearchLabels: exactSearchLabels, initialSearchConditions: initialSearchConditions, searchConditions: searchConditions, onFiltersUpdate: ignoreAppliedSearchCriteria, config: config, searchLoading: loading }),
|
|
56
78
|
react_1.default.createElement(material_1.Divider, null),
|
|
57
79
|
react_1.default.createElement(material_1.Box, { sx: tableBoxSx },
|
|
58
|
-
react_1.default.createElement(__1.PneTable, { autoTestId: autoTestId, data: data, createTableHeader: createTableHeader, sortOptions: {
|
|
80
|
+
react_1.default.createElement(__1.PneTable, { autoTestId: autoTestId, data: data, createTableHeader: resolvedTable.createTableHeader, sortOptions: {
|
|
59
81
|
order,
|
|
60
82
|
setOrder,
|
|
61
83
|
sortIndex,
|
|
62
84
|
setSortIndex,
|
|
63
85
|
onSortChange,
|
|
64
|
-
}, createRow: (item, index, arr) => createTableRow(item, index, arr, setData), paginator: paginator, loading: loading })));
|
|
86
|
+
}, createRow: (item, index, arr) => resolvedTable.createTableRow(item, index, arr, setData), paginator: paginator, loading: loading, loadingKey: resolvedTable.viewId, toolbar: tableViewSelector })));
|
|
87
|
+
};
|
|
88
|
+
const resolveSearchUITable = (props) => {
|
|
89
|
+
if (!props.tableViews) {
|
|
90
|
+
return {
|
|
91
|
+
searchData: props.searchData,
|
|
92
|
+
createTableHeader: props.createTableHeader,
|
|
93
|
+
createTableRow: props.createTableRow,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
if (props.tableViews.views.length === 0) {
|
|
97
|
+
throw new Error('SearchUI: table views must not be empty');
|
|
98
|
+
}
|
|
99
|
+
const seenIds = new Set();
|
|
100
|
+
for (const view of props.tableViews.views) {
|
|
101
|
+
if (seenIds.has(view.id)) {
|
|
102
|
+
throw new Error(`SearchUI: duplicate table view ID "${view.id}"`);
|
|
103
|
+
}
|
|
104
|
+
seenIds.add(view.id);
|
|
105
|
+
}
|
|
106
|
+
let activeView = props.tableViews.views.find(view => view.id === props.tableViews.value);
|
|
107
|
+
if (!activeView) {
|
|
108
|
+
if (process.env.NODE_ENV !== 'production') {
|
|
109
|
+
throw new Error(`SearchUI: selected table view "${props.tableViews.value}" is not configured`);
|
|
110
|
+
}
|
|
111
|
+
activeView = props.tableViews.views[0];
|
|
112
|
+
}
|
|
113
|
+
return {
|
|
114
|
+
searchData: activeView.searchData,
|
|
115
|
+
createTableHeader: activeView.createTableHeader,
|
|
116
|
+
createTableRow: activeView.createTableRow,
|
|
117
|
+
actions: activeView.actions,
|
|
118
|
+
sortOnActivate: activeView.sortOnActivate,
|
|
119
|
+
viewId: activeView.id,
|
|
120
|
+
};
|
|
121
|
+
};
|
|
122
|
+
const createTableViewSelector = (config, value, actions, searchUIAutoTestId) => {
|
|
123
|
+
const { 'aria-label': ariaLabel, 'aria-labelledby': ariaLabelledBy, autoTestId = searchUIAutoTestId, renderViewSelector, value: _configuredValue, views, ...selectorProps } = config;
|
|
124
|
+
const options = views.map(view => ({
|
|
125
|
+
id: view.id,
|
|
126
|
+
label: view.label,
|
|
127
|
+
disabled: view.disabled,
|
|
128
|
+
}));
|
|
129
|
+
let selector;
|
|
130
|
+
if (ariaLabel !== undefined) {
|
|
131
|
+
selector = react_1.default.createElement(__1.PneTableViewSelector, { ...selectorProps, "aria-label": ariaLabel, actions: actions, autoTestId: autoTestId, value: value, views: options });
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
selector = react_1.default.createElement(__1.PneTableViewSelector, { ...selectorProps, "aria-labelledby": ariaLabelledBy, actions: actions, autoTestId: autoTestId, value: value, views: options });
|
|
135
|
+
}
|
|
136
|
+
return renderViewSelector ? react_1.default.createElement(react_1.default.Fragment, null, renderViewSelector(selector)) : selector;
|
|
65
137
|
};
|
|
66
138
|
const ignoreAppliedSearchCriteria = () => {
|
|
67
139
|
// SearchUI reads the applied criteria from its instance-scoped filter store.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SearchUI.js","sourceRoot":"","sources":["../../../src/component/search-ui/SearchUI.tsx"],"names":[],"mappings":";;;;AAAA,uDAA0E;AAC1E,+DAAyF;AAEzF,4CAAqD;AAErD,
|
|
1
|
+
{"version":3,"file":"SearchUI.js","sourceRoot":"","sources":["../../../src/component/search-ui/SearchUI.tsx"],"names":[],"mappings":"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"}
|
|
@@ -26,6 +26,8 @@ export type TableProps<D> = {
|
|
|
26
26
|
lastRow?: React.ReactElement;
|
|
27
27
|
paginator?: PaginatorProps;
|
|
28
28
|
loading?: boolean;
|
|
29
|
+
/** Identity that makes a structural loading transition visible immediately without remounting controls. */
|
|
30
|
+
loadingKey?: string | number;
|
|
29
31
|
stickyHeader?: boolean;
|
|
30
32
|
showNothingIsFoundRow?: boolean;
|
|
31
33
|
/** Accessible name forwarded to the semantic table independently from autoTestId. */
|
|
@@ -36,6 +38,9 @@ export type TableProps<D> = {
|
|
|
36
38
|
boxSx?: SxProps;
|
|
37
39
|
noRowsMessage?: string;
|
|
38
40
|
skeletonRowHeight?: number;
|
|
41
|
+
/** Optional controls rendered inside the table root before top pagination and table content. */
|
|
42
|
+
toolbar?: React.ReactNode;
|
|
43
|
+
toolbarSx?: SxProps;
|
|
39
44
|
};
|
|
40
45
|
export type TableSortOptions = {
|
|
41
46
|
order: Order;
|
|
@@ -18,10 +18,11 @@ const AutoTestAttribute_1 = require("../AutoTestAttribute");
|
|
|
18
18
|
const TABLE_AUTOTEST_ID = 'table';
|
|
19
19
|
const TABLE_EMPTY_STATE_AUTOTEST_ID = 'empty-state';
|
|
20
20
|
const TABLE_PAGINATION_AUTOTEST_ID = 'pagination';
|
|
21
|
+
const TABLE_TOOLBAR_AUTOTEST_ID = 'table-toolbar';
|
|
21
22
|
const AbstractTable = (props) => {
|
|
22
|
-
const { data, autoTestId, createTableHeader, sortOptions, createRow, lastRow = null, paginator, loading = false, stickyHeader = false, showNothingIsFoundRow = true, tableAriaLabel, tableAriaLabelledBy, tableSx = {}, boxSx = {}, noRowsMessage, skeletonRowHeight, } = props;
|
|
23
|
+
const { data, autoTestId, createTableHeader, sortOptions, createRow, lastRow = null, paginator, loading = false, loadingKey, stickyHeader = false, showNothingIsFoundRow = true, tableAriaLabel, tableAriaLabelledBy, tableSx = {}, boxSx = {}, noRowsMessage, skeletonRowHeight, toolbar, toolbarSx, } = props;
|
|
23
24
|
const { t } = (0, react_i18next_1.useTranslation)();
|
|
24
|
-
const showSkeleton = (0, useDelayedLoading_1.default)(loading);
|
|
25
|
+
const showSkeleton = (0, useDelayedLoading_1.default)(loading, loadingKey);
|
|
25
26
|
const containerRef = (0, react_1.useRef)(null);
|
|
26
27
|
const tableContainerRef = (0, react_1.useRef)(null);
|
|
27
28
|
const lastRowHeightRef = (0, react_1.useRef)(undefined);
|
|
@@ -86,6 +87,18 @@ const AbstractTable = (props) => {
|
|
|
86
87
|
const skeletonTableHeight = showSkeleton && actualSkeletonRowHeight && lastHeaderHeightRef.current > 0
|
|
87
88
|
? lastHeaderHeightRef.current + actualSkeletonRowHeight * skeletonRowCount
|
|
88
89
|
: undefined;
|
|
90
|
+
const hasToolbar = toolbar !== undefined
|
|
91
|
+
&& toolbar !== null
|
|
92
|
+
&& typeof toolbar !== 'boolean';
|
|
93
|
+
const resolvedToolbarSx = [
|
|
94
|
+
{
|
|
95
|
+
alignItems: 'center',
|
|
96
|
+
display: 'flex',
|
|
97
|
+
justifyContent: 'flex-end',
|
|
98
|
+
marginBottom: '8px',
|
|
99
|
+
},
|
|
100
|
+
...(Array.isArray(toolbarSx) ? toolbarSx : [toolbarSx]),
|
|
101
|
+
];
|
|
89
102
|
const SKELETON_COL_HIDDEN = 30;
|
|
90
103
|
const SKELETON_COL_NARROW = 120;
|
|
91
104
|
const skeletonCellContent = (row, col) => {
|
|
@@ -99,6 +112,7 @@ const AbstractTable = (props) => {
|
|
|
99
112
|
return react_1.default.createElement(Skeleton_1.default, { variant: "rounded", width: width, height: skeletonItemHeight });
|
|
100
113
|
};
|
|
101
114
|
return react_1.default.createElement(Box_1.default, { ...(0, AutoTestAttribute_1.createAutoTestAttributes)(TABLE_AUTOTEST_ID, autoTestId), sx: { ...boxSx }, ref: containerRef },
|
|
115
|
+
hasToolbar ? react_1.default.createElement(Box_1.default, { ...(0, AutoTestAttribute_1.createAutoTestAttributes)(TABLE_TOOLBAR_AUTOTEST_ID), sx: resolvedToolbarSx }, toolbar) : null,
|
|
102
116
|
paginator && paginator.duplicatePagination && getPneTablePagination('top'),
|
|
103
117
|
react_1.default.createElement(TableContainer_1.default, { ref: tableContainerRef },
|
|
104
118
|
react_1.default.createElement(Table_1.default, { "aria-busy": showSkeleton, "aria-label": tableAriaLabel, "aria-labelledby": tableAriaLabelledBy, stickyHeader: stickyHeader, sx: { ...tableSx, ...(skeletonTableHeight ? { height: skeletonTableHeight } : {}) } },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AbstractTable.js","sourceRoot":"","sources":["../../../src/component/table/AbstractTable.tsx"],"names":[],"mappings":";;;AAAA,uDAA4F;AAC5F,wEAAwC;AACxC,gFAAgD;AAChD,0FAA0D;AAC1D,gFAAgD;AAChD,oEAAoC;AACpC,8EAA8C;AAG9C,wEAAwC;AACxC,0EAA0C;AAC1C,sFAAsD;AACtD,oGAAoE;AAEpE,iDAA6C;AAC7C,oFAAoD;AACpD,4DAA8D;AAE9D,MAAM,iBAAiB,GAAG,OAAO,CAAC;AAClC,MAAM,6BAA6B,GAAG,aAAa,CAAC;AACpD,MAAM,4BAA4B,GAAG,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"AbstractTable.js","sourceRoot":"","sources":["../../../src/component/table/AbstractTable.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import React, { ReactNode } from 'react';
|
|
2
|
+
import { BoxProps } from '@mui/material';
|
|
3
|
+
export type PneTableViewOption<TViewId extends string = string> = {
|
|
4
|
+
id: TViewId;
|
|
5
|
+
label: ReactNode;
|
|
6
|
+
disabled?: boolean;
|
|
7
|
+
};
|
|
8
|
+
export type PneTableViewSelectorProps<TViewId extends string = string> = Omit<BoxProps, 'aria-label' | 'aria-labelledby' | 'children' | 'component' | 'onChange' | 'ref'> & ({
|
|
9
|
+
/** Accessible name applied to the semantic view group. */
|
|
10
|
+
'aria-label': string;
|
|
11
|
+
'aria-labelledby'?: never;
|
|
12
|
+
} | {
|
|
13
|
+
/** ID of the element that names the semantic view group. */
|
|
14
|
+
'aria-label'?: never;
|
|
15
|
+
'aria-labelledby': string;
|
|
16
|
+
}) & {
|
|
17
|
+
/** Stable, non-secret instance identifier used to scope Selenium locators. */
|
|
18
|
+
autoTestId?: string;
|
|
19
|
+
/** Disables view selection. Consumer-provided actions retain their own disabled state. */
|
|
20
|
+
disabled?: boolean;
|
|
21
|
+
/** Optional consumer-owned actions, such as table-view settings. */
|
|
22
|
+
actions?: ReactNode;
|
|
23
|
+
/** Selected stable view ID. */
|
|
24
|
+
value: TViewId;
|
|
25
|
+
/** Ordered application-defined views. */
|
|
26
|
+
views: readonly PneTableViewOption<TViewId>[];
|
|
27
|
+
/** Called only when the user selects a different non-null view ID. */
|
|
28
|
+
onChange: (value: TViewId) => void;
|
|
29
|
+
};
|
|
30
|
+
export declare const PneTableViewSelector: <TViewId extends string = string>(props: PneTableViewSelectorProps<TViewId> & React.RefAttributes<HTMLDivElement>) => React.ReactElement;
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.PneTableViewSelector = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const react_1 = tslib_1.__importStar(require("react"));
|
|
6
|
+
const material_1 = require("@mui/material");
|
|
7
|
+
const AutoTestAttribute_1 = require("../AutoTestAttribute");
|
|
8
|
+
const TABLE_VIEWS_AUTOTEST_ID = 'table-views';
|
|
9
|
+
const TABLE_VIEW_AUTOTEST_ID = 'table-view';
|
|
10
|
+
const TABLE_VIEW_ACTIONS_AUTOTEST_ID = 'table-view-actions';
|
|
11
|
+
const rootSx = theme => ({
|
|
12
|
+
alignItems: 'center',
|
|
13
|
+
border: 1,
|
|
14
|
+
borderColor: theme.palette.divider,
|
|
15
|
+
borderRadius: '4px',
|
|
16
|
+
boxSizing: 'border-box',
|
|
17
|
+
display: 'flex',
|
|
18
|
+
gap: '4px',
|
|
19
|
+
height: '40px',
|
|
20
|
+
padding: '4px',
|
|
21
|
+
});
|
|
22
|
+
const groupSx = {
|
|
23
|
+
display: 'flex',
|
|
24
|
+
[`& .${material_1.toggleButtonGroupClasses.grouped}`]: {
|
|
25
|
+
border: '0 !important',
|
|
26
|
+
margin: 0,
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
const viewButtonSx = theme => ({
|
|
30
|
+
border: 0,
|
|
31
|
+
borderRadius: '4px !important',
|
|
32
|
+
flex: '1 1 0',
|
|
33
|
+
fontWeight: 'bold',
|
|
34
|
+
height: '32px',
|
|
35
|
+
letterSpacing: '0.46px',
|
|
36
|
+
lineHeight: '22px',
|
|
37
|
+
minWidth: 0,
|
|
38
|
+
textTransform: 'none',
|
|
39
|
+
[`&.${material_1.toggleButtonClasses.selected}`]: {
|
|
40
|
+
backgroundColor: theme.palette.action.selected,
|
|
41
|
+
color: theme.palette.text.secondary,
|
|
42
|
+
'&:hover': {
|
|
43
|
+
backgroundColor: theme.palette.action.selected,
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
[`&.${material_1.toggleButtonClasses.disabled}`]: {
|
|
47
|
+
border: 'none',
|
|
48
|
+
},
|
|
49
|
+
'&:hover': {
|
|
50
|
+
backgroundColor: theme.palette.action.selected,
|
|
51
|
+
borderRadius: '4px',
|
|
52
|
+
},
|
|
53
|
+
'.MuiToggleButtonGroup-root:hover &.Mui-selected:not(:hover):not(.Mui-disabled)': {
|
|
54
|
+
backgroundColor: 'transparent',
|
|
55
|
+
},
|
|
56
|
+
'&.Mui-focusVisible': {
|
|
57
|
+
outline: `2px solid ${theme.palette.primary.main}`,
|
|
58
|
+
outlineOffset: '-2px',
|
|
59
|
+
},
|
|
60
|
+
});
|
|
61
|
+
const PneTableViewSelectorInner = (props, ref) => {
|
|
62
|
+
const { 'aria-label': ariaLabel, 'aria-labelledby': ariaLabelledBy, actions, autoTestId, disabled = false, onChange, sx, value, views, ...rootProps } = props;
|
|
63
|
+
const hasActions = actions !== undefined
|
|
64
|
+
&& actions !== null
|
|
65
|
+
&& typeof actions !== 'boolean';
|
|
66
|
+
const handleChange = (_event, nextValue) => {
|
|
67
|
+
if (nextValue !== null && nextValue !== value) {
|
|
68
|
+
onChange(nextValue);
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
return react_1.default.createElement(material_1.Box, { ...rootProps, ...(0, AutoTestAttribute_1.createAutoTestAttributes)(TABLE_VIEWS_AUTOTEST_ID, autoTestId), ref: ref, sx: [
|
|
72
|
+
rootSx,
|
|
73
|
+
...(Array.isArray(sx) ? sx : [sx]),
|
|
74
|
+
] },
|
|
75
|
+
react_1.default.createElement(material_1.ToggleButtonGroup, { "aria-label": ariaLabel, "aria-labelledby": ariaLabelledBy, disabled: disabled, exclusive: true, onChange: handleChange, sx: groupSx, value: value }, views.map(view => react_1.default.createElement(material_1.ToggleButton, { ...(0, AutoTestAttribute_1.createAutoTestAttributes)(TABLE_VIEW_AUTOTEST_ID, view.id), disabled: view.disabled, key: view.id, sx: viewButtonSx, value: view.id }, view.label))),
|
|
76
|
+
hasActions ? react_1.default.createElement(react_1.default.Fragment, null,
|
|
77
|
+
react_1.default.createElement(material_1.Divider, { orientation: 'vertical', sx: { height: '24px', mx: '-4px' } }),
|
|
78
|
+
react_1.default.createElement(material_1.Box, { ...(0, AutoTestAttribute_1.createAutoTestAttributes)(TABLE_VIEW_ACTIONS_AUTOTEST_ID), sx: { alignItems: 'center', display: 'flex', height: '32px' } }, actions)) : null);
|
|
79
|
+
};
|
|
80
|
+
exports.PneTableViewSelector = (0, react_1.forwardRef)(PneTableViewSelectorInner);
|
|
81
|
+
//# sourceMappingURL=PneTableViewSelector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PneTableViewSelector.js","sourceRoot":"","sources":["../../../src/component/table/PneTableViewSelector.tsx"],"names":[],"mappings":"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"}
|
|
@@ -5,5 +5,5 @@
|
|
|
5
5
|
* skeleton. Последующие loading-состояния остаются отложенными, чтобы избежать мерцания
|
|
6
6
|
* при быстрых refetch.
|
|
7
7
|
*/
|
|
8
|
-
declare const useDelayedLoading: (loading: boolean) => boolean;
|
|
8
|
+
declare const useDelayedLoading: (loading: boolean, resetKey?: string | number) => boolean;
|
|
9
9
|
export default useDelayedLoading;
|
|
@@ -3,6 +3,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
const react_1 = require("react");
|
|
4
4
|
const DELAY_BEFORE_SHOWING = 300;
|
|
5
5
|
const MIN_DISPLAY_DURATION = 500;
|
|
6
|
+
const createLoadingState = (loading, resetKey) => ({
|
|
7
|
+
resetKey,
|
|
8
|
+
showSkeleton: loading,
|
|
9
|
+
skeletonShownAt: loading ? Date.now() : null,
|
|
10
|
+
waitForStructuralLoading: resetKey !== undefined && !loading,
|
|
11
|
+
});
|
|
6
12
|
/**
|
|
7
13
|
* Хук стабилизации отображения состояния загрузки.
|
|
8
14
|
*
|
|
@@ -10,41 +16,63 @@ const MIN_DISPLAY_DURATION = 500;
|
|
|
10
16
|
* skeleton. Последующие loading-состояния остаются отложенными, чтобы избежать мерцания
|
|
11
17
|
* при быстрых refetch.
|
|
12
18
|
*/
|
|
13
|
-
const useDelayedLoading = (loading) => {
|
|
14
|
-
const [
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
19
|
+
const useDelayedLoading = (loading, resetKey) => {
|
|
20
|
+
const [state, setState] = (0, react_1.useState)(() => createLoadingState(loading, resetKey));
|
|
21
|
+
let renderState = state;
|
|
22
|
+
if (!Object.is(state.resetKey, resetKey)) {
|
|
23
|
+
renderState = createLoadingState(loading, resetKey);
|
|
24
|
+
setState(renderState);
|
|
25
|
+
}
|
|
26
|
+
else if (loading && state.waitForStructuralLoading) {
|
|
27
|
+
renderState = {
|
|
28
|
+
...state,
|
|
29
|
+
showSkeleton: true,
|
|
30
|
+
skeletonShownAt: Date.now(),
|
|
31
|
+
waitForStructuralLoading: false,
|
|
32
|
+
};
|
|
33
|
+
setState(renderState);
|
|
34
|
+
}
|
|
18
35
|
(0, react_1.useEffect)(() => {
|
|
19
36
|
if (loading) {
|
|
20
|
-
if (
|
|
21
|
-
initialLoadingHandledRef.current = true;
|
|
22
|
-
setShowSkeleton(true);
|
|
23
|
-
skeletonShownAt.current = skeletonShownAt.current ?? Date.now();
|
|
37
|
+
if (renderState.showSkeleton) {
|
|
24
38
|
return undefined;
|
|
25
39
|
}
|
|
26
40
|
const timer = setTimeout(() => {
|
|
27
|
-
|
|
28
|
-
|
|
41
|
+
setState(current => Object.is(current.resetKey, resetKey)
|
|
42
|
+
? {
|
|
43
|
+
...current,
|
|
44
|
+
showSkeleton: true,
|
|
45
|
+
skeletonShownAt: Date.now(),
|
|
46
|
+
}
|
|
47
|
+
: current);
|
|
29
48
|
}, DELAY_BEFORE_SHOWING);
|
|
30
49
|
return () => clearTimeout(timer);
|
|
31
50
|
}
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
const elapsed = Date.now() - skeletonShownAt.current;
|
|
51
|
+
if (renderState.skeletonShownAt) {
|
|
52
|
+
const elapsed = Date.now() - renderState.skeletonShownAt;
|
|
35
53
|
if (elapsed < MIN_DISPLAY_DURATION) {
|
|
36
54
|
const timer = setTimeout(() => {
|
|
37
|
-
|
|
38
|
-
|
|
55
|
+
setState(current => Object.is(current.resetKey, resetKey)
|
|
56
|
+
? {
|
|
57
|
+
...current,
|
|
58
|
+
showSkeleton: false,
|
|
59
|
+
skeletonShownAt: null,
|
|
60
|
+
}
|
|
61
|
+
: current);
|
|
39
62
|
}, MIN_DISPLAY_DURATION - elapsed);
|
|
40
63
|
return () => clearTimeout(timer);
|
|
41
64
|
}
|
|
42
65
|
}
|
|
43
|
-
|
|
44
|
-
|
|
66
|
+
if (renderState.showSkeleton) {
|
|
67
|
+
setState(current => ({
|
|
68
|
+
...current,
|
|
69
|
+
showSkeleton: false,
|
|
70
|
+
skeletonShownAt: null,
|
|
71
|
+
}));
|
|
72
|
+
}
|
|
45
73
|
return undefined;
|
|
46
|
-
}, [loading]);
|
|
47
|
-
return showSkeleton;
|
|
74
|
+
}, [loading, renderState.showSkeleton, renderState.skeletonShownAt, resetKey]);
|
|
75
|
+
return renderState.showSkeleton;
|
|
48
76
|
};
|
|
49
77
|
exports.default = useDelayedLoading;
|
|
50
78
|
//# sourceMappingURL=useDelayedLoading.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useDelayedLoading.js","sourceRoot":"","sources":["../../../src/component/table/useDelayedLoading.ts"],"names":[],"mappings":";;AAAA,
|
|
1
|
+
{"version":3,"file":"useDelayedLoading.js","sourceRoot":"","sources":["../../../src/component/table/useDelayedLoading.ts"],"names":[],"mappings":"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"}
|
|
@@ -20,6 +20,10 @@ export type UseTableParams<D> = {
|
|
|
20
20
|
dataUseState?: [D[], Dispatch<SetStateAction<D[]>>];
|
|
21
21
|
fetchData?: (args: FetchDataArgs) => Promise<D[]>;
|
|
22
22
|
fetchDataExtraDeps?: unknown[];
|
|
23
|
+
/** Stable identity whose change resets page/sort and invalidates rows from the previous identity. */
|
|
24
|
+
resetKey?: string | number;
|
|
25
|
+
/** Sort defaults applied when resetKey changes, or an explicit request to keep the current sort. */
|
|
26
|
+
resetDisplayOptions?: 'preserve' | Pick<TableDisplayOptions, 'sortColumnIndex' | 'sortAsc'>;
|
|
23
27
|
};
|
|
24
28
|
interface IUseTableResult<D> {
|
|
25
29
|
page: number;
|